<?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>201303</bug_id>
          
          <creation_ts>2019-08-29 09:04:22 -0700</creation_ts>
          <short_desc>[GTK] IconDatabase is not thread-safe</short_desc>
          <delta_ts>2019-09-30 05:38:52 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKitGTK</component>
          <version>WebKit 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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Charlie Turner">cturner</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>annulen</cc>
    
    <cc>aperez</cc>
    
    <cc>berto</cc>
    
    <cc>bugs-noreply</cc>
    
    <cc>cgarcia</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>gustavo</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>rakuco</cc>
    
    <cc>ryuan.choi</cc>
    
    <cc>sergio</cc>
    
    <cc>yurys</cc>
    
    <cc>zan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1566259</commentid>
    <comment_count>0</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2019-08-29 09:04:22 -0700</bug_when>
    <thetext>IconDatabase::writeToDatabase copies it&apos;s m_iconsPendingSync values which seem to be created on the main thread into a Vector on its icon-sync thread. IconSnapshot contain a RefPtr&lt;SharedBuffer&gt;, and ref()&apos;ing the SharedBuffer on the main thread and also a background thread is unsafe, and triggers assertions in recent WebKits,

#0  0x00007f4286c380ad in WTFCrash () at /home/ubuntu/webkit/webkit-git/Source/WTF/wtf/Assertions.cpp:305
#1  0x00007f4294382447 in WTF::RefCountedBase::applyRefDerefThreadingCheck (this=0x55d0083284c0) at DerivedSources/ForwardingHeaders/wtf/RefCounted.h:115
#2  0x00007f42943822f2 in WTF::RefCountedBase::ref (this=0x55d0083284c0) at DerivedSources/ForwardingHeaders/wtf/RefCounted.h:43
#3  0x00007f42949ec421 in WTF::refIfNotNull&lt;WebCore::SharedBuffer&gt; (ptr=0x55d0083284c0) at DerivedSources/ForwardingHeaders/wtf/RefPtr.h:38
#4  0x00007f42949e8106 in WTF::RefPtr&lt;WebCore::SharedBuffer, WTF::DumbPtrTraits&lt;WebCore::SharedBuffer&gt; &gt;::RefPtr (this=0x7f421801f9d0, o=...)
    at DerivedSources/ForwardingHeaders/wtf/RefPtr.h:58
#5  0x00007f4294e0b388 in WebKit::IconDatabase::IconSnapshot::IconSnapshot (this=0x7f421801f9c0) at /home/ubuntu/webkit/webkit-git/Source/WebKit/UIProcess/API/glib/IconDatabase.h:61
#6  0x00007f4294e0e05c in WTF::Vector&lt;WebKit::IconDatabase::IconSnapshot, 0ul, WTF::CrashOnOverflow, 16ul&gt;::appendSlowCase&lt;WebKit::IconDatabase::IconSnapshot&amp;&gt; (this=0x7f422e5f79d0, 
    value=...) at DerivedSources/ForwardingHeaders/wtf/Vector.h:1346
#7  0x00007f4294e0b446 in WTF::Vector&lt;WebKit::IconDatabase::IconSnapshot, 0ul, WTF::CrashOnOverflow, 16ul&gt;::append&lt;WebKit::IconDatabase::IconSnapshot&amp;&gt; (this=0x7f422e5f79d0, 
    value=...) at DerivedSources/ForwardingHeaders/wtf/Vector.h:1304
#8  0x00007f4294e074bd in WTF::Vector&lt;WebKit::IconDatabase::IconSnapshot, 0ul, WTF::CrashOnOverflow, 16ul&gt;::appendRange&lt;WTF::HashTableValuesIterator&lt;WTF::HashTable&lt;WTF::String, WTF::KeyValuePair&lt;WTF::String, WebKit::IconDatabase::IconSnapshot&gt;, WTF::KeyValuePairKeyExtractor&lt;WTF::KeyValuePair&lt;WTF::String, WebKit::IconDatabase::IconSnapshot&gt; &gt;, WTF::StringHash, WTF::HashMap&lt;WTF::String, WebKit::IconDatabase::IconSnapshot, WTF::StringHash, WTF::HashTraits&lt;WTF::String&gt;, WTF::HashTraits&lt;WebKit::IconDatabase::IconSnapshot&gt; &gt;::KeyValuePairTraits, WTF::HashTraits&lt;WTF::String&gt; &gt;, WTF::String, WebKit::IconDatabase::IconSnapshot&gt; &gt; (this=0x7f422e5f79d0, start=..., end=...) at DerivedSources/ForwardingHeaders/wtf/Vector.h:1036
#9  0x00007f4294dfeeb5 in WebKit::IconDatabase::writeToDatabase (this=0x55d008157770) at /home/ubuntu/webkit/webkit-git/Source/WebKit/UIProcess/API/glib/IconDatabase.cpp:1472
#10 0x00007f4294dfddfa in WebKit::IconDatabase::syncThreadMainLoop (this=0x55d008157770) at /home/ubuntu/webkit/webkit-git/Source/WebKit/UIProcess/API/glib/IconDatabase.cpp:1256
#11 0x00007f4294dfc45e in WebKit::IconDatabase::iconDatabaseSyncThread (this=0x55d008157770) at /home/ubuntu/webkit/webkit-git/Source/WebKit/UIProcess/API/glib/IconDatabase.cpp:931
#12 0x00007f4294df857f in WebKit::IconDatabase::&lt;lambda()&gt;::operator()(void) const (__closure=0x55d0082b0b18)
    at /home/ubuntu/webkit/webkit-git/Source/WebKit/UIProcess/API/glib/IconDatabase.cpp:223
#13 0x00007f4294e04572 in WTF::Detail::CallableWrapper&lt;WebKit::IconDatabase::open(const WTF::String&amp;, const WTF::String&amp;)::&lt;lambda()&gt;, void&gt;::call(void) (this=0x55d0082b0b10)
    at DerivedSources/ForwardingHeaders/wtf/Function.h:52
#14 0x00007f429445a81d in WTF::Function&lt;void ()&gt;::operator()() const (this=0x7f422e5f7c30) at DerivedSources/ForwardingHeaders/wtf/Function.h:79
#15 0x00007f4286c6f3ff in WTF::Thread::entryPoint (newThreadContext=0x55d0082a4480) at /home/ubuntu/webkit/webkit-git/Source/WTF/wtf/Threading.cpp:148
#16 0x00007f4286cee2e5 in WTF::wtfThreadEntryPoint (context=0x55d0082a4480) at /home/ubuntu/webkit/webkit-git/Source/WTF/wtf/posix/ThreadingPOSIX.cpp:200
#17 0x00007f42836036db in start_thread (arg=0x7f422e5f8700) at pthread_create.c:463
#18 0x00007f428332c88f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1569904</commentid>
    <comment_count>1</comment_count>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2019-09-11 04:00:49 -0700</bug_when>
    <thetext>Another issue I am hitting, triggered by new assertions in https://bugs.webkit.org/show_bug.cgi?id=200734

IconDatabase::IconRecord::setImageData is creating a BitmapImage from its sync-thread. This class now has to be created / destroyed on the main thread since internall it uses an ImageSource which has this constraint.

#0  0x00007f568af0b7db in WTFCrash () at /home/cturner/webkit/webkit-git/Source/WTF/wtf/Assertions.cpp:305
#1  0x00007f5698740e6f in CRASH_WITH_INFO(...) () at DerivedSources/ForwardingHeaders/wtf/Assertions.h:658
#2  0x00007f569b926479 in WebCore::ImageSource::ImageSource (this=0x7f561c0204e0, image=0x7f561c01e960, alphaOption=WebCore::AlphaOption::Premultiplied, 
    gammaAndColorProfileOption=WebCore::GammaAndColorProfileOption::Applied) at /home/cturner/webkit/webkit-git/Source/WebCore/platform/graphics/ImageSource.cpp:51
#3  0x00007f569b893936 in WebCore::ImageSource::create (image=0x7f561c01e960, alphaOption=WebCore::AlphaOption::Premultiplied, 
    gammaAndColorProfileOption=WebCore::GammaAndColorProfileOption::Applied) at /home/cturner/webkit/webkit-git/Source/WebCore/platform/graphics/ImageSource.h:50
#4  0x00007f569b885d3e in WebCore::BitmapImage::BitmapImage (this=0x7f561c01e960, observer=0x0) at /home/cturner/webkit/webkit-git/Source/WebCore/platform/graphics/BitmapImage.cpp:46
#5  0x00007f56991cd830 in WebCore::BitmapImage::create (observer=0x0) at DerivedSources/ForwardingHeaders/WebCore/BitmapImage.h:62
#6  0x00007f56991c0b3f in WebKit::IconDatabase::IconRecord::setImageData (this=0x7f561c01d7c0, data=...)
    at /home/cturner/webkit/webkit-git/Source/WebKit/UIProcess/API/glib/IconDatabase.cpp:127
#7  0x00007f56991c720c in WebKit::IconDatabase::readFromDatabase (this=0x55e88bc03940) at /home/cturner/webkit/webkit-git/Source/WebKit/UIProcess/API/glib/IconDatabase.cpp:1385
#8  0x00007f56991c6965 in WebKit::IconDatabase::syncThreadMainLoop (this=0x55e88bc03940) at /home/cturner/webkit/webkit-git/Source/WebKit/UIProcess/API/glib/IconDatabase.cpp:1260
#9  0x00007f56991c4fa6 in WebKit::IconDatabase::iconDatabaseSyncThread (this=0x55e88bc03940) at /home/cturner/webkit/webkit-git/Source/WebKit/UIProcess/API/glib/IconDatabase.cpp:931
#10 0x00007f56991c10c7 in WebKit::IconDatabase::&lt;lambda()&gt;::operator()(void) const (__closure=0x55e88bc5ee78)
    at /home/cturner/webkit/webkit-git/Source/WebKit/UIProcess/API/glib/IconDatabase.cpp:223
#11 0x00007f56991cd0ba in WTF::Detail::CallableWrapper&lt;WebKit::IconDatabase::open(const WTF::String&amp;, const WTF::String&amp;)::&lt;lambda()&gt;, void&gt;::call(void) (this=0x55e88bc5ee70)
    at DerivedSources/ForwardingHeaders/wtf/Function.h:52
#12 0x00007f5698828399 in WTF::Function&lt;void ()&gt;::operator()() const (this=0x7f56318e3c30) at DerivedSources/ForwardingHeaders/wtf/Function.h:79
#13 0x00007f568af42a7d in WTF::Thread::entryPoint (newThreadContext=0x55e88bc5f120) at /home/cturner/webkit/webkit-git/Source/WTF/wtf/Threading.cpp:148
#14 0x00007f568afc1963 in WTF::wtfThreadEntryPoint (context=0x55e88bc5f120) at /home/cturner/webkit/webkit-git/Source/WTF/wtf/posix/ThreadingPOSIX.cpp:200
#15 0x00007f568789a6db in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#16 0x00007f56875c388f in clone () from /lib/x86_64-linux-gnu/libc.so.6</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1572688</commentid>
    <comment_count>2</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2019-09-20 01:09:27 -0700</bug_when>
    <thetext>*** Bug 202001 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1574376</commentid>
    <comment_count>3</comment_count>
      <attachid>379623</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2019-09-26 00:51:50 -0700</bug_when>
    <thetext>Created attachment 379623
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1574378</commentid>
    <comment_count>4</comment_count>
    <who name="EWS Watchlist">ews-watchlist</who>
    <bug_when>2019-09-26 00:52:37 -0700</bug_when>
    <thetext>Thanks for the patch. If this patch contains new public API please make sure it follows the guidelines for new WebKit2 GTK+ API. See http://trac.webkit.org/wiki/WebKitGTK/AddingNewWebKit2API</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1574379</commentid>
    <comment_count>5</comment_count>
      <attachid>379624</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2019-09-26 01:04:38 -0700</bug_when>
    <thetext>Created attachment 379624
Try to fix WPE build

Do not build the favicon database tests in WPE since it&apos;s GTK specific</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1574393</commentid>
    <comment_count>6</comment_count>
    <who name="Adrian Perez">aperez</who>
    <bug_when>2019-09-26 02:04:47 -0700</bug_when>
    <thetext>Nice work removing unneeded code, Carlos!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1574423</commentid>
    <comment_count>7</comment_count>
      <attachid>379624</attachid>
    <who name="Charlie Turner">cturner</who>
    <bug_when>2019-09-26 04:58:16 -0700</bug_when>
    <thetext>Comment on attachment 379624
Try to fix WPE build

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

&gt; Source/WebKit/UIProcess/API/glib/IconDatabase.cpp:-30
&gt; -#include &quot;Logging.h&quot;

You need to keep this include for the logging calls</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1575238</commentid>
    <comment_count>8</comment_count>
      <attachid>379624</attachid>
    <who name="Zan Dobersek">zan</who>
    <bug_when>2019-09-30 05:16:24 -0700</bug_when>
    <thetext>Comment on attachment 379624
Try to fix WPE build

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

&gt; Source/WebKit/UIProcess/API/glib/WebKitFaviconDatabase.cpp:181
&gt; +#if 0

This can then be removed?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1575240</commentid>
    <comment_count>9</comment_count>
      <attachid>379624</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2019-09-30 05:35:42 -0700</bug_when>
    <thetext>Comment on attachment 379624
Try to fix WPE build

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

&gt;&gt; Source/WebKit/UIProcess/API/glib/WebKitFaviconDatabase.cpp:181
&gt;&gt; +#if 0
&gt; 
&gt; This can then be removed?

Right! I forgot to remove this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1575241</commentid>
    <comment_count>10</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2019-09-30 05:38:52 -0700</bug_when>
    <thetext>Committed r250518: &lt;https://trac.webkit.org/changeset/250518&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>379623</attachid>
            <date>2019-09-26 00:51:50 -0700</date>
            <delta_ts>2019-09-26 01:04:38 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>wk2-favicon-database.diff</filename>
            <type>text/plain</type>
            <size>171367</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFu
Z2VMb2cKaW5kZXggY2M1NzI3ZWY5YWYuLjQ5NWU2NGVkMzNhIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L0NoYW5nZUxvZwpAQCAtMSwzICsx
LDYwIEBACisyMDE5LTA5LTI2ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlh
LmNvbT4KKworICAgICAgICBbR1RLXSBJY29uRGF0YWJhc2UgaXMgbm90IHRocmVhZC1zYWZlCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDEzMDMKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSZXdyaXRlIHRo
ZSBJY29uRGF0YWJhc2UgaW1wbGVtZW50YXRpb24uIE5vdyB0aGF0IHdlIGFyZSB0aGUgb25seSB1
c2VycyBvZiB0aGlzIGNvZGUsIHdlIGNhbiBzaW1wbHkgaXQgYSBsb3QgYW5kCisgICAgICAgIGRl
c2lnbiBpdCBzcGVjaWZpY2FsbHkgZm9yIG91ciBBUEksIHdoaWNoIGltcGxlbWVudGF0aW9uIGhh
cyBiZWVuIHNpbXBsaWZpZWQgYSBsb3QgdG9vLiBUaGVyZSdzIG5vIGNoYW5nZSBpbgorICAgICAg
ICB0aGUgZGF0YWJhc2Ugc2NoZW1hIG5vciBpbiBiZWhhdmlvciBmcm9tIHRoZSBBUEkgcG9pbnQg
b2Ygdmlldy4KKworICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuY3Bw
OgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6Okljb25EYXRhYmFzZSk6CisgICAgICAg
IChXZWJLaXQ6Okljb25EYXRhYmFzZTo6fkljb25EYXRhYmFzZSk6CisgICAgICAgIChXZWJLaXQ6
Okljb25EYXRhYmFzZTo6Y3JlYXRlVGFibGVzSWZOZWVkZWQpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OnBvcHVsYXRlUGFnZVVSTFRvSWNvblVSTE1hcCk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6Y2xlYXJTdGF0ZW1lbnRzKToKKyAgICAgICAgKFdlYktpdDo6SWNv
bkRhdGFiYXNlOjpwcnVuZVRpbWVyRmlyZWQpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJh
c2U6OnN0YXJ0UHJ1bmVUaW1lcik6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6Y2xl
YXJMb2FkZWRJY29uc1RpbWVyRmlyZWQpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6
OnN0YXJ0Q2xlYXJMb2FkZWRJY29uc1RpbWVyKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFi
YXNlOjppY29uSURGb3JJY29uVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpz
ZXRJY29uSURGb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjppY29u
RGF0YSk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6YWRkSWNvbik6CisgICAgICAg
IChXZWJLaXQ6Okljb25EYXRhYmFzZTo6dXBkYXRlSWNvblRpbWVzdGFtcCk6CisgICAgICAgIChX
ZWJLaXQ6Okljb25EYXRhYmFzZTo6ZGVsZXRlSWNvbik6CisgICAgICAgIChXZWJLaXQ6Okljb25E
YXRhYmFzZTo6Y2hlY2tJY29uVVJMQW5kU2V0UGFnZVVSTElmTmVlZGVkKToKKyAgICAgICAgKFdl
YktpdDo6SWNvbkRhdGFiYXNlOjpsb2FkSWNvbkZvclBhZ2VVUkwpOgorICAgICAgICAoV2ViS2l0
OjpJY29uRGF0YWJhc2U6Omljb25VUkxGb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNv
bkRhdGFiYXNlOjpzZXRJY29uRm9yUGFnZVVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRh
YmFzZTo6Y2xlYXIpOgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2Uu
aDoKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpjcmVhdGUpOgorICAgICAgICAqIFVJ
UHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwOgorICAgICAgICAod2Vi
a2l0RmF2aWNvbkRhdGFiYXNlQ3JlYXRlKToKKyAgICAgICAgKHdlYmtpdEZhdmljb25EYXRhYmFz
ZUlzT3Blbik6CisgICAgICAgICh3ZWJraXRGYXZpY29uRGF0YWJhc2VPcGVuKToKKyAgICAgICAg
KHdlYmtpdEZhdmljb25EYXRhYmFzZUNsb3NlKToKKyAgICAgICAgKHdlYmtpdEZhdmljb25EYXRh
YmFzZUdldExvYWREZWNpc2lvbkZvckljb24pOgorICAgICAgICAod2Via2l0RmF2aWNvbkRhdGFi
YXNlU2V0SWNvbkZvclBhZ2VVUkwpOgorICAgICAgICAod2Via2l0RmF2aWNvbkRhdGFiYXNlR2V0
RmF2aWNvbkludGVybmFsKToKKyAgICAgICAgKHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9m
YXZpY29uKToKKyAgICAgICAgKHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uX2Zp
bmlzaCk6CisgICAgICAgICh3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbl91cmkp
OgorICAgICAgICAod2Via2l0X2Zhdmljb25fZGF0YWJhc2VfY2xlYXIpOgorICAgICAgICAqIFVJ
UHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2YXRlLmg6CisgICAgICAg
ICogVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYkNvbnRleHQuY3BwOgorICAgICAgICAod2Vi
a2l0V2ViQ29udGV4dERpc3Bvc2UpOgorICAgICAgICAod2Via2l0X3dlYl9jb250ZXh0X3NldF9m
YXZpY29uX2RhdGFiYXNlX2RpcmVjdG9yeSk6CisgICAgICAgICh3ZWJraXRXZWJDb250ZXh0Q3Jl
YXRlUGFnZUZvcldlYlZpZXcpOgorICAgICAgICAod2Via2l0V2ViQ29udGV4dFdlYlZpZXdEZXN0
cm95ZWQpOgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRXZWJWaWV3LmNwcDoK
KyAgICAgICAgKHdlYmtpdFdlYlZpZXdSZXF1ZXN0RmF2aWNvbik6CisgICAgICAgICh3ZWJraXRX
ZWJWaWV3R2V0TG9hZERlY2lzaW9uRm9ySWNvbik6CisgICAgICAgICh3ZWJraXRXZWJWaWV3U2V0
SWNvbik6CisKIDIwMTktMDktMjMgIENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNvbT4KIAog
ICAgICAgICBEcm9wIHVubmVjZXNzYXJ5IFNlc3Npb25JRC5oIGhlYWRlciBpbmNsdWRlcwpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmNw
cCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL0ljb25EYXRhYmFzZS5jcHAKaW5k
ZXggMDY4NzBkMjFkZWUuLmYxNTk4YTZkNWE4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL0FQSS9nbGliL0ljb25EYXRhYmFzZS5jcHAKQEAgLTEsMTk2NyArMSw2MzMgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgSnVzdGluIEhheWdvb2QgKGpoYXlnb29kQHJlYWt0
aXguY29tKQorICogQ29weXJpZ2h0IChDKSAyMDE5IElnYWxpYSBTLkwuCiAgKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
KyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkljb25EYXRhYmFz
ZS5oIgogCi0jaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgPFdlYkNvcmUvQml0bWFwSW1h
Z2UuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ltYWdlLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TUUxp
dGVTdGF0ZW1lbnQuaD4KICNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZVRyYW5zYWN0aW9uLmg+CiAj
aW5jbHVkZSA8V2ViQ29yZS9TaGFyZWRCdWZmZXIuaD4KICNpbmNsdWRlIDx3dGYvRmlsZVN5c3Rl
bS5oPgotI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+Ci0jaW5jbHVkZSA8d3RmL05ldmVyRGVz
dHJveWVkLmg+Ci0jaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi9V
UkwuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdDb25jYXRlbmF0ZU51bWJlcnMuaD4KLQot
Ly8gRm9yIG1ldGhvZHMgdGhhdCBhcmUgbWVhbnQgdG8gc3VwcG9ydCBBUEkgZnJvbSB0aGUgbWFp
biB0aHJlYWQgLSBzaG91bGQgbm90IGJlIGNhbGxlZCBpbnRlcm5hbGx5Ci0jZGVmaW5lIEFTU0VS
VF9OT1RfU1lOQ19USFJFQUQoKSBBU1NFUlQoIW1fc3luY1RocmVhZFJ1bm5pbmcgfHwgIUlTX0lD
T05fU1lOQ19USFJFQUQoKSkKLQotLy8gRm9yIG1ldGhvZHMgdGhhdCBhcmUgbWVhbnQgdG8gc3Vw
cG9ydCB0aGUgc3luYyB0aHJlYWQgT05MWQotI2RlZmluZSBJU19JQ09OX1NZTkNfVEhSRUFEKCkg
KG1fc3luY1RocmVhZCA9PSAmVGhyZWFkOjpjdXJyZW50KCkpCi0jZGVmaW5lIEFTU0VSVF9JQ09O
X1NZTkNfVEhSRUFEKCkgQVNTRVJUKElTX0lDT05fU1lOQ19USFJFQUQoKSkKKyNpbmNsdWRlIDx3
dGYvUnVuTG9vcC5oPgorI2luY2x1ZGUgPHd0Zi9nbGliL1J1bkxvb3BTb3VyY2VQcmlvcml0eS5o
PgorI2luY2x1ZGUgPHd0Zi90aHJlYWRzL0JpbmFyeVNlbWFwaG9yZS5oPgogCiBuYW1lc3BhY2Ug
V2ViS2l0IHsKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCi1zdGF0aWMgaW50IGRhdGFiYXNl
Q2xlYW51cENvdW50ZXIgPSAwOwotCiAvLyBUaGlzIHZlcnNpb24gbnVtYmVyIGlzIGluIHRoZSBE
QiBhbmQgbWFya3MgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBvZiB0aGUgc2NoZW1hCi0vLyBDdXJy
ZW50bHksIGEgbWlzbWF0Y2hlZCBzY2hlbWEgY2F1c2VzIHRoZSBEQiB0byBiZSB3aXBlZCBhbmQg
cmVzZXQuIFRoaXMgaXNuJ3QKLS8vIHNvIGJhZCBkdXJpbmcgZGV2ZWxvcG1lbnQgYnV0IGluIHRo
ZSBmdXR1cmUsIHdlIHdvdWxkIG5lZWQgdG8gd3JpdGUgYSBjb252ZXJzaW9uCi0vLyBmdW5jdGlv
biB0byBhZHZhbmNlIG9sZGVyIHJlbGVhc2VkIHNjaGVtYXMgdG8gImN1cnJlbnQiCisvLyBDdXJy
ZW50bHksIGEgbWlzbWF0Y2hlZCBzY2hlbWEgY2F1c2VzIHRoZSBEQiB0byBiZSB3aXBlZCBhbmQg
cmVzZXQuCiBzdGF0aWMgY29uc3QgaW50IGN1cnJlbnREYXRhYmFzZVZlcnNpb24gPSA2OwogCi0v
LyBJY29ucyBleHBpcmUgb25jZSBldmVyeSA0IGRheXMKLXN0YXRpYyBjb25zdCBpbnQgaWNvbkV4
cGlyYXRpb25UaW1lID0gNjAqNjAqMjQqNDsKLQotc3RhdGljIGNvbnN0IFNlY29uZHMgdXBkYXRl
VGltZXJEZWxheSB7IDVfcyB9OwotCi1zdGF0aWMgYm9vbCBjaGVja0ludGVncml0eU9uT3BlbiA9
IGZhbHNlOwotCi0vLyBXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaWNvbnMgdGhhdCBoYXZlIGJl
ZW4gdW51c2VkIGZvciBtb3JlIHRoYW4KLS8vIDMwIGRheXMsIGRlbGV0ZSB0aGVtIGV2ZW4gaWYg
dGhleSBoYXZlIG5vdCBiZWVuIGV4cGxpY2l0bHkgcmVsZWFzZWQuCi1zdGF0aWMgY29uc3QgU2Vj
b25kcyBub3RVc2VkSWNvbkV4cGlyYXRpb25UaW1lIHsgNjAqNjAqMjQqMzAgfTsKLQotI2lmICFM
T0dfRElTQUJMRUQgfHwgIUVSUk9SX0RJU0FCTEVECi1zdGF0aWMgU3RyaW5nIHVybEZvckxvZ2dp
bmcoY29uc3QgU3RyaW5nJiB1cmwpCi17Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVybFRy
dW5jYXRpb25MZW5ndGggPSAxMjA7Ci0KLSAgICBpZiAodXJsLmxlbmd0aCgpIDwgdXJsVHJ1bmNh
dGlvbkxlbmd0aCkKLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICByZXR1cm4gdXJsLnN1YnN0cmlu
ZygwLCB1cmxUcnVuY2F0aW9uTGVuZ3RoKSArICIuLi4iOwotfQotI2VuZGlmCi0KLWNsYXNzIERl
ZmF1bHRJY29uRGF0YWJhc2VDbGllbnQgZmluYWwgOiBwdWJsaWMgSWNvbkRhdGFiYXNlQ2xpZW50
IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICB2b2lkIGRpZElt
cG9ydEljb25VUkxGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlIHsgfQotICAgIHZv
aWQgZGlkSW1wb3J0SWNvbkRhdGFGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlIHsg
fQotICAgIHZvaWQgZGlkQ2hhbmdlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikgb3ZlcnJp
ZGUgeyB9Ci0gICAgdm9pZCBkaWRGaW5pc2hVUkxJbXBvcnQoKSBvdmVycmlkZSB7IH0KLX07Ci0K
LXN0YXRpYyBJY29uRGF0YWJhc2VDbGllbnQqIGRlZmF1bHRDbGllbnQoKQotewotICAgIHN0YXRp
YyBJY29uRGF0YWJhc2VDbGllbnQqIGRlZmF1bHRDbGllbnQgPSBuZXcgRGVmYXVsdEljb25EYXRh
YmFzZUNsaWVudDsKLSAgICByZXR1cm4gZGVmYXVsdENsaWVudDsKLX0KLQotSWNvbkRhdGFiYXNl
OjpJY29uUmVjb3JkOjpJY29uUmVjb3JkKGNvbnN0IFN0cmluZyYgdXJsKQotICAgIDogbV9pY29u
VVJMKHVybCkKLXsKLX0KKy8vIEljb25zIGV4cGlyZSBvbmNlIGV2ZXJ5IDQgZGF5cy4KK3N0YXRp
YyBjb25zdCBTZWNvbmRzIGljb25FeHBpcmF0aW9uVGltZSB7IDYwICogNjAgKiAyNCAqIDQgfTsK
IAotSWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjp+SWNvblJlY29yZCgpCi17Ci0gICAgTE9HKElj
b25EYXRhYmFzZSwgIkRlc3Ryb3lpbmcgSWNvblJlY29yZCBmb3IgaWNvbiB1cmwgJXMiLCBtX2lj
b25VUkwuYXNjaWkoKS5kYXRhKCkpOwotfQorLy8gV2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGlj
b25zIHRoYXQgaGF2ZSBiZWVuIHVudXNlZCBmb3IgbW9yZSB0aGFuIDMwIGRheXMuCitzdGF0aWMg
Y29uc3QgU2Vjb25kcyBub3RVc2VkSWNvbkV4cGlyYXRpb25UaW1lIHsgNjAgKiA2MCAqIDI0ICog
MzAgfTsKIAotTmF0aXZlSW1hZ2VQdHIgSWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjppbWFnZShj
b25zdCBJbnRTaXplJikKLXsKLSAgICAvLyBGSVhNRSByZGFyOi8vNDY4MDM3NyAtIEZvciBzaXpl
IHJpZ2h0IG5vdywgd2UgYXJlIHJldHVybmluZyBvdXIgb25lIGFuZCBvbmx5IGltYWdlIGFuZCB0
aGUgQnJpZGdlCi0gICAgLy8gaXMgcmVzaXppbmcgaXQgaW4gcGxhY2UuIFdlIG5lZWQgdG8gYWN0
dWFsbHkgc3RvcmUgYWxsIHRoZSBvcmlnaW5hbCByZXByZXNlbnRhdGlvbnMgaGVyZSBhbmQgcmV0
dXJuIGEgbmF0aXZlCi0gICAgLy8gb25lLCBvciByZXNpemUgdGhlIGJlc3Qgb25lIHRvIHRoZSBy
ZXF1ZXN0ZWQgc2l6ZSBhbmQgY2FjaGUgdGhhdCByZXN1bHQuCi0gICAgcmV0dXJuIG1faW1hZ2U7
Ci19CisvLyBMb2FkZWQgaWNvbnMgYXJlIGNsZWFyZWQgYWZ0ZXIgMzAgc2Vjb25kcyBvZiBiZWlu
ZyByZXF1ZXN0ZWQuCitzdGF0aWMgY29uc3QgU2Vjb25kcyBsb2FkZWRJY29uRXhwaXJhdGlvblRp
bWUgeyAzMF9zIH07CiAKLXZvaWQgSWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjpzZXRJbWFnZURh
dGEoUmVmUHRyPFNoYXJlZEJ1ZmZlcj4mJiBkYXRhKQorSWNvbkRhdGFiYXNlOjpJY29uRGF0YWJh
c2UoY29uc3QgU3RyaW5nJiBwYXRoLCBBbGxvd0RhdGFiYXNlV3JpdGUgYWxsb3dEYXRhYmFzZVdy
aXRlKQorICAgIDogbV93b3JrUXVldWUoV29ya1F1ZXVlOjpjcmVhdGUoIm9yZy53ZWJraXQuSWNv
bkRhdGFiYXNlIikpCisgICAgLCBtX2FsbG93RGF0YWJhc2VXcml0ZShhbGxvd0RhdGFiYXNlV3Jp
dGUpCisgICAgLCBtX2NsZWFyTG9hZGVkSWNvbnNUaW1lcihSdW5Mb29wOjptYWluKCksIHRoaXMs
ICZJY29uRGF0YWJhc2U6OmNsZWFyTG9hZGVkSWNvbnNUaW1lckZpcmVkKQogewotICAgIG1fZGF0
YVNldCA9IHRydWU7Ci0gICAgbV9pbWFnZURhdGEgPSBXVEZNb3ZlKGRhdGEpOwotICAgIG1faW1h
Z2UgPSBudWxscHRyOwotCi0gICAgaWYgKCFtX2ltYWdlRGF0YSB8fCAhbV9pbWFnZURhdGEtPnNp
emUoKSkgewotICAgICAgICBtX2ltYWdlRGF0YSA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBhdXRvIGltYWdlID0gQml0bWFwSW1hZ2U6OmNyZWF0ZSgpOwotICAgIGlm
IChpbWFnZS0+c2V0RGF0YShSZWZQdHI8U2hhcmVkQnVmZmVyPiB7IG1faW1hZ2VEYXRhIH0sIHRy
dWUpIDwgRW5jb2RlZERhdGFTdGF0dXM6OlNpemVBdmFpbGFibGUpIHsKLSAgICAgICAgTE9HKElj
b25EYXRhYmFzZSwgIk1hbnVhbCBpbWFnZSBkYXRhIGZvciBpY29uVVJMICclcycgRkFJTEVEIC0g
aXQgd2FzIHByb2JhYmx5IGludmFsaWQgaW1hZ2UgZGF0YSIsIG1faWNvblVSTC5hc2NpaSgpLmRh
dGEoKSk7Ci0gICAgICAgIG1faW1hZ2VEYXRhID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIG1faW1hZ2UgPSBpbWFnZS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUo
KTsKLSAgICBpZiAoIW1faW1hZ2UpIHsKLSAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIk1hbnVh
bCBpbWFnZSBkYXRhIGZvciBpY29uVVJMICclcycgRkFJTEVEIC0gaXQgd2FzIHByb2JhYmx5IGlu
dmFsaWQgaW1hZ2UgZGF0YSIsIG1faWNvblVSTC5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIG1f
aW1hZ2VEYXRhID0gbnVsbHB0cjsKLSAgICB9Ci19CisgICAgbV9jbGVhckxvYWRlZEljb25zVGlt
ZXIuc2V0UHJpb3JpdHkoUnVuTG9vcFNvdXJjZVByaW9yaXR5OjpSZWxlYXNlVW51c2VkUmVzb3Vy
Y2VzVGltZXIpOwogCi1JY29uRGF0YWJhc2U6Okljb25SZWNvcmQ6OkltYWdlRGF0YVN0YXR1cyBJ
Y29uRGF0YWJhc2U6Okljb25SZWNvcmQ6OmltYWdlRGF0YVN0YXR1cygpCi17Ci0gICAgaWYgKCFt
X2RhdGFTZXQpCi0gICAgICAgIHJldHVybiBJbWFnZURhdGFTdGF0dXM6OlVua25vd247Ci0gICAg
aWYgKCFtX2ltYWdlKQotICAgICAgICByZXR1cm4gSW1hZ2VEYXRhU3RhdHVzOjpNaXNzaW5nOwot
ICAgIHJldHVybiBJbWFnZURhdGFTdGF0dXM6OlByZXNlbnQ7Ci19CisgICAgLy8gV2UgaW5pdGlh
bGl6ZSB0aGUgZGF0YWJhc2Ugc3luY2hyb25vdXNseSwgaXQncyBob3BlZnVsbHkgZmFzdCBlbm91
Z2ggYmVjYXVzZSBpdCBtYWtlcworICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBhIGxvdCBzaW1w
bGVyLgorICAgIEJpbmFyeVNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgbV93b3JrUXVldWUtPmRp
c3BhdGNoKFsmXSB7CisgICAgICAgIGlmIChhbGxvd0RhdGFiYXNlV3JpdGUgPT0gQWxsb3dEYXRh
YmFzZVdyaXRlOjpObyAmJiAhRmlsZVN5c3RlbTo6ZmlsZUV4aXN0cyhwYXRoKSkgeworICAgICAg
ICAgICAgc2VtYXBob3JlLnNpZ25hbCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CiAKLUljb25EYXRhYmFzZTo6SWNvblNuYXBzaG90IEljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6
c25hcHNob3QoYm9vbCBmb3JEZWxldGlvbikgY29uc3QKLXsKLSAgICBpZiAoZm9yRGVsZXRpb24p
Ci0gICAgICAgIHJldHVybiBJY29uU25hcHNob3QobV9pY29uVVJMLCAwLCBudWxscHRyKTsKKyAg
ICAgICAgYXV0byBkYXRhYmFzZURpcmVjdG9yeSA9IEZpbGVTeXN0ZW06OmRpcmVjdG9yeU5hbWUo
cGF0aCk7CisgICAgICAgIEZpbGVTeXN0ZW06Om1ha2VBbGxEaXJlY3RvcmllcyhkYXRhYmFzZURp
cmVjdG9yeSk7CisgICAgICAgIGlmICghbV9kYi5vcGVuKHBhdGgpKSB7CisgICAgICAgICAgICBM
T0dfRVJST1IoIlVuYWJsZSB0byBvcGVuIGZhdmljb24gZGF0YWJhc2UgYXQgcGF0aCAlcyAtICVz
IiwgcGF0aC51dGY4KCkuZGF0YSgpLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAg
IHNlbWFwaG9yZS5zaWduYWwoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0g
ICAgcmV0dXJuIEljb25TbmFwc2hvdChtX2ljb25VUkwsIG1fc3RhbXAsIG1faW1hZ2VEYXRhID8g
bV9pbWFnZURhdGEuZ2V0KCkgOiBudWxscHRyKTsKLX0KKyAgICAgICAgYXV0byBkYXRhYmFzZVZl
cnNpb25OdW1iZXIgPSBTUUxpdGVTdGF0ZW1lbnQobV9kYiwgIlNFTEVDVCB2YWx1ZSBGUk9NIElj
b25EYXRhYmFzZUluZm8gV0hFUkUga2V5ID0gJ1ZlcnNpb24nOyIpLmdldENvbHVtbkludCgwKTsK
KyAgICAgICAgaWYgKGRhdGFiYXNlVmVyc2lvbk51bWJlciA+IGN1cnJlbnREYXRhYmFzZVZlcnNp
b24pIHsKKyAgICAgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJEYXRhYmFzZSB2ZXJzaW9uIG51
bWJlciAlZCBpcyBncmVhdGVyIHRoYW4gb3VyIGN1cnJlbnQgdmVyc2lvbiBudW1iZXIgJWQgLSBj
bG9zaW5nIHRoZSBkYXRhYmFzZSB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIG5ld2VyIHZlcnNpb25z
IiwKKyAgICAgICAgICAgICAgICBkYXRhYmFzZVZlcnNpb25OdW1iZXIsIGN1cnJlbnREYXRhYmFz
ZVZlcnNpb24pOworICAgICAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICAgICAgc2VtYXBo
b3JlLnNpZ25hbCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLUljb25EYXRh
YmFzZTo6UGFnZVVSTFJlY29yZDo6UGFnZVVSTFJlY29yZChjb25zdCBTdHJpbmcmIHBhZ2VVUkwp
Ci0gICAgOiBtX3BhZ2VVUkwocGFnZVVSTCkKLXsKLX0KKyAgICAgICAgaWYgKGRhdGFiYXNlVmVy
c2lvbk51bWJlciA8IGN1cnJlbnREYXRhYmFzZVZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmICht
X2FsbG93RGF0YWJhc2VXcml0ZSA9PSBBbGxvd0RhdGFiYXNlV3JpdGU6Ok5vKSB7CisgICAgICAg
ICAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICAgICAgICAgIHNlbWFwaG9yZS5zaWduYWwo
KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKLUljb25EYXRhYmFz
ZTo6UGFnZVVSTFJlY29yZDo6flBhZ2VVUkxSZWNvcmQoKQotewotICAgIGlmIChtX2ljb25SZWNv
cmQpCi0gICAgICAgIG1faWNvblJlY29yZC0+cmV0YWluaW5nUGFnZVVSTHMoKS5yZW1vdmUobV9w
YWdlVVJMKTsKLX0KKyAgICAgICAgICAgIG1fZGIuY2xlYXJBbGxUYWJsZXMoKTsKKyAgICAgICAg
fQogCi12b2lkIEljb25EYXRhYmFzZTo6UGFnZVVSTFJlY29yZDo6c2V0SWNvblJlY29yZChSZWZQ
dHI8SWNvblJlY29yZD4mJiBpY29uKQotewotICAgIGlmIChtX2ljb25SZWNvcmQpCi0gICAgICAg
IG1faWNvblJlY29yZC0+cmV0YWluaW5nUGFnZVVSTHMoKS5yZW1vdmUobV9wYWdlVVJMKTsKKyAg
ICAgICAgLy8gUmVkdWNlIHNxbGl0ZSBSQU0gY2FjaGUgc2l6ZSBmcm9tIGRlZmF1bHQgMjAwMCBw
YWdlcyAofjEuNWtCIHBlciBwYWdlKS4gM01CIG9mIGNhY2hlIGZvciBpY29uIGRhdGFiYXNlIGlz
IG92ZXJraWxsLgorICAgICAgICBTUUxpdGVTdGF0ZW1lbnQobV9kYiwgIlBSQUdNQSBjYWNoZV9z
aXplID0gMjAwOyIpLmV4ZWN1dGVDb21tYW5kKCk7CiAKLSAgICBtX2ljb25SZWNvcmQgPSBXVEZN
b3ZlKGljb24pOworICAgICAgICBpZiAoYWxsb3dEYXRhYmFzZVdyaXRlID09IEFsbG93RGF0YWJh
c2VXcml0ZTo6WWVzKSB7CisgICAgICAgICAgICBtX3BydW5lVGltZXIgPSBtYWtlVW5pcXVlPFJ1
bkxvb3A6OlRpbWVyPEljb25EYXRhYmFzZT4+KFJ1bkxvb3A6OmN1cnJlbnQoKSwgdGhpcywgJklj
b25EYXRhYmFzZTo6cHJ1bmVUaW1lckZpcmVkKTsKKyAgICAgICAgICAgIG1fcHJ1bmVUaW1lci0+
c2V0UHJpb3JpdHkoUnVuTG9vcFNvdXJjZVByaW9yaXR5OjpSZWxlYXNlVW51c2VkUmVzb3VyY2Vz
VGltZXIpOworICAgICAgICB9CiAKLSAgICBpZiAobV9pY29uUmVjb3JkKQotICAgICAgICBtX2lj
b25SZWNvcmQtPnJldGFpbmluZ1BhZ2VVUkxzKCkuYWRkKG1fcGFnZVVSTCk7Ci19CisgICAgICAg
IGlmICghY3JlYXRlVGFibGVzSWZOZWVkZWQoKSkKKyAgICAgICAgICAgIHBvcHVsYXRlUGFnZVVS
TFRvSWNvblVSTE1hcCgpOwogCi1JY29uRGF0YWJhc2U6OlBhZ2VVUkxTbmFwc2hvdCBJY29uRGF0
YWJhc2U6OlBhZ2VVUkxSZWNvcmQ6OnNuYXBzaG90KGJvb2wgZm9yRGVsZXRpb24pIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIHsgbV9wYWdlVVJMLCAobV9pY29uUmVjb3JkICYmICFmb3JEZWxldGlvbikg
PyBtX2ljb25SZWNvcmQtPmljb25VUkwoKSA6IFN0cmluZygpIH07CisgICAgICAgIHNlbWFwaG9y
ZS5zaWduYWwoKTsKKyAgICB9KTsKKyAgICBzZW1hcGhvcmUud2FpdCgpOwogfQogCi0vLyAqKioq
KioqKioqKioqKioqKioqKioqKioKLS8vICoqKiBNYWluIFRocmVhZCBPbmx5ICoqKgotLy8gKioq
KioqKioqKioqKioqKioqKioqKioqCi0KLXZvaWQgSWNvbkRhdGFiYXNlOjpzZXRDbGllbnQoc3Rk
Ojp1bmlxdWVfcHRyPEljb25EYXRhYmFzZUNsaWVudD4mJiBjbGllbnQpCitJY29uRGF0YWJhc2U6
On5JY29uRGF0YWJhc2UoKQogewotICAgIC8vIERvbid0IGFsbG93IGEgY2xpZW50IGNoYW5nZSBh
ZnRlciB0aGUgdGhyZWFkIGhhcyBhbHJlYWR5IGJlZ2FuCi0gICAgLy8gKHNldHRpbmcgdGhlIGNs
aWVudCBzaG91bGQgb2NjdXIgYmVmb3JlIHRoZSBkYXRhYmFzZSBpcyBvcGVuZWQpCi0gICAgQVNT
RVJUKCFtX3N5bmNUaHJlYWRSdW5uaW5nKTsKLSAgICBpZiAoIWNsaWVudCB8fCBtX3N5bmNUaHJl
YWRSdW5uaW5nKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2NsaWVudCA9IFdURk1vdmUoY2xp
ZW50KTsKKyAgICBCaW5hcnlTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIG1fd29ya1F1ZXVlLT5k
aXNwYXRjaChbJl0geworICAgICAgICBpZiAobV9kYi5pc09wZW4oKSkgeworICAgICAgICAgICAg
bV9wcnVuZVRpbWVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNsZWFyU3RhdGVtZW50cygpOwor
ICAgICAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIHNlbWFwaG9yZS5z
aWduYWwoKTsKKyAgICB9KTsKKyAgICBzZW1hcGhvcmUud2FpdCgpOwogfQogCi1ib29sIEljb25E
YXRhYmFzZTo6b3Blbihjb25zdCBTdHJpbmcmIGRpcmVjdG9yeSwgY29uc3QgU3RyaW5nJiBmaWxl
bmFtZSkKK2Jvb2wgSWNvbkRhdGFiYXNlOjpjcmVhdGVUYWJsZXNJZk5lZWRlZCgpCiB7Ci0gICAg
QVNTRVJUX05PVF9TWU5DX1RIUkVBRCgpOwotCi0gICAgaWYgKCFtX2lzRW5hYmxlZCkKKyAgICBp
ZiAobV9kYi50YWJsZUV4aXN0cygiSWNvbkluZm8iKSAmJiBtX2RiLnRhYmxlRXhpc3RzKCJJY29u
RGF0YSIpICYmIG1fZGIudGFibGVFeGlzdHMoIlBhZ2VVUkwiKSAmJiBtX2RiLnRhYmxlRXhpc3Rz
KCJJY29uRGF0YWJhc2VJbmZvIikpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIGlmIChp
c09wZW4oKSkgewotICAgICAgICBMT0dfRVJST1IoIkF0dGVtcHQgdG8gcmVvcGVuIHRoZSBJY29u
RGF0YWJhc2Ugd2hpY2ggaXMgYWxyZWFkeSBvcGVuLiBNdXN0IGNsb3NlIGl0IGZpcnN0LiIpOwor
ICAgIGlmIChtX2FsbG93RGF0YWJhc2VXcml0ZSA9PSBBbGxvd0RhdGFiYXNlV3JpdGU6Ok5vKSB7
CisgICAgICAgIG1fZGIuY2xvc2UoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAot
ICAgIG1fbWFpblRocmVhZE5vdGlmaWVyLnNldEFjdGl2ZSh0cnVlKTsKLQotICAgIG1fZGF0YWJh
c2VEaXJlY3RvcnkgPSBkaXJlY3RvcnkuaXNvbGF0ZWRDb3B5KCk7Ci0KLSAgICAvLyBGb3JtdWxh
dGUgdGhlIGZ1bGwgcGF0aCBmb3IgdGhlIGRhdGFiYXNlIGZpbGUKLSAgICBtX2NvbXBsZXRlRGF0
YWJhc2VQYXRoID0gRmlsZVN5c3RlbTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KG1fZGF0YWJh
c2VEaXJlY3RvcnksIGZpbGVuYW1lKTsKLQotICAgIC8vIExvY2sgaGVyZSBhcyB3ZWxsIGFzIGZp
cnN0IHRoaW5nIGluIHRoZSB0aHJlYWQgc28gdGhlIHRocmVhZCBkb2Vzbid0IGFjdHVhbGx5IGNv
bW1lbmNlIHVudGlsIHRoZSBjcmVhdGVUaHJlYWQoKSBjYWxsCi0gICAgLy8gY29tcGxldGVzIGFu
ZCBtX3N5bmNUaHJlYWRSdW5uaW5nIGlzIHByb3Blcmx5IHNldAotICAgIG1fc3luY0xvY2subG9j
aygpOwotICAgIG1fc3luY1RocmVhZCA9IFRocmVhZDo6Y3JlYXRlKCJXZWJDb3JlOiBJY29uRGF0
YWJhc2UiLCBbdGhpc10gewotICAgICAgICBpY29uRGF0YWJhc2VTeW5jVGhyZWFkKCk7Ci0gICAg
fSk7Ci0gICAgbV9zeW5jVGhyZWFkUnVubmluZyA9IHRydWU7Ci0gICAgbV9zeW5jTG9jay51bmxv
Y2soKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBJY29uRGF0YWJhc2U6OmNsb3NlKCkK
LXsKLSAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICBtX21haW5UaHJlYWROb3Rp
Zmllci5zdG9wKCk7Ci0KLSAgICBpZiAobV9zeW5jVGhyZWFkUnVubmluZykgewotICAgICAgICAv
LyBTZXQgdGhlIGZsYWcgdG8gdGVsbCB0aGUgc3luYyB0aHJlYWQgdG8gd3JhcCBpdCB1cAotICAg
ICAgICBtX3RocmVhZFRlcm1pbmF0aW9uUmVxdWVzdGVkID0gdHJ1ZTsKKyAgICBtX2RiLmNsZWFy
QWxsVGFibGVzKCk7CiAKLSAgICAgICAgLy8gV2FrZSB1cCB0aGUgc3luYyB0aHJlYWQgaWYgaXQn
cyB3YWl0aW5nCi0gICAgICAgIHdha2VTeW5jVGhyZWFkKCk7Ci0KLSAgICAgICAgLy8gV2FpdCBm
b3IgdGhlIHN5bmMgdGhyZWFkIHRvIHRlcm1pbmF0ZQotICAgICAgICBtX3N5bmNUaHJlYWQtPndh
aXRGb3JDb21wbGV0aW9uKCk7CisgICAgaWYgKCFtX2RiLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUg
VEFCTEUgUGFnZVVSTCAodXJsIFRFWFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCBVTklRVUUg
T04gQ09ORkxJQ1QgUkVQTEFDRSxpY29uSUQgSU5URUdFUiBOT1QgTlVMTCBPTiBDT05GTElDVCBG
QUlMKTsiKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgUGFnZVVSTCB0
YWJsZSBpbiBkYXRhYmFzZSAoJWkpIC0gJXMiLCBtX2RiLmxhc3RFcnJvcigpLCBtX2RiLmxhc3RF
cnJvck1zZygpKTsKKyAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIElOREVYIFBhZ2VV
UkxJbmRleCBPTiBQYWdlVVJMICh1cmwpOyIpKSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQg
bm90IGNyZWF0ZSBQYWdlVVJMIGluZGV4IGluIGRhdGFiYXNlICglaSkgLSAlcyIsIG1fZGIubGFz
dEVycm9yKCksIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICBtX2RiLmNsb3NlKCk7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFtX2RiLmV4ZWN1dGVDb21tYW5k
KCJDUkVBVEUgVEFCTEUgSWNvbkluZm8gKGljb25JRCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9J
TkNSRU1FTlQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIHVybCBURVhUIE5PVCBOVUxMIE9O
IENPTkZMSUNUIEZBSUwgVU5JUVVFIE9OIENPTkZMSUNUIEZBSUwsIHN0YW1wIElOVEVHRVIpOyIp
KSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IGNyZWF0ZSBJY29uSW5mbyB0YWJsZSBp
biBkYXRhYmFzZSAoJWkpIC0gJXMiLCBtX2RiLmxhc3RFcnJvcigpLCBtX2RiLmxhc3RFcnJvck1z
ZygpKTsKKyAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIElOREVYIEljb25JbmZvSW5k
ZXggT04gSWNvbkluZm8gKHVybCwgaWNvbklEKTsiKSkgeworICAgICAgICBMT0dfRVJST1IoIkNv
dWxkIG5vdCBjcmVhdGUgUGFnZVVSTCBpbmRleCBpbiBkYXRhYmFzZSAoJWkpIC0gJXMiLCBtX2Ri
Lmxhc3RFcnJvcigpLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgbV9kYi5jbG9zZSgp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghbV9kYi5leGVjdXRlQ29t
bWFuZCgiQ1JFQVRFIFRBQkxFIEljb25EYXRhIChpY29uSUQgSU5URUdFUiBQUklNQVJZIEtFWSBB
VVRPSU5DUkVNRU5UIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLCBkYXRhIEJMT0IpOyIpKSB7
CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IGNyZWF0ZSBJY29uRGF0YSB0YWJsZSBpbiBk
YXRhYmFzZSAoJWkpIC0gJXMiLCBtX2RiLmxhc3RFcnJvcigpLCBtX2RiLmxhc3RFcnJvck1zZygp
KTsKKyAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
ICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIElOREVYIEljb25EYXRhSW5kZXgg
T04gSWNvbkRhdGEgKGljb25JRCk7IikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3Qg
Y3JlYXRlIFBhZ2VVUkwgaW5kZXggaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgbV9kYi5sYXN0RXJy
b3IoKSwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIG1fZGIuY2xvc2UoKTsKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQoIkNS
RUFURSBUQUJMRSBJY29uRGF0YWJhc2VJbmZvIChrZXkgVEVYVCBOT1QgTlVMTCBPTiBDT05GTElD
VCBGQUlMIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLHZhbHVlIFRFWFQgTk9UIE5VTEwgT04g
Q09ORkxJQ1QgRkFJTCk7IikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRl
IEljb25EYXRhYmFzZUluZm8gdGFibGUgaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgbV9kYi5sYXN0
RXJyb3IoKSwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIG1fZGIuY2xvc2UoKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQo
U3RyaW5nKCJJTlNFUlQgSU5UTyBJY29uRGF0YWJhc2VJbmZvIFZBTFVFUyAoJ1ZlcnNpb24nLCAi
KSArIFN0cmluZzo6bnVtYmVyKGN1cnJlbnREYXRhYmFzZVZlcnNpb24pICsgIik7IikpIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgaW5zZXJ0IGljb24gZGF0YWJhc2UgdmVyc2lvbiBp
bnRvIEljb25EYXRhYmFzZUluZm8gdGFibGUgKCVpKSAtICVzIiwgbV9kYi5sYXN0RXJyb3IoKSwg
bV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIG1fZGIuY2xvc2UoKTsKKyAgICAgICAgcmV0
dXJuIGZhbHNlOwogICAgIH0KIAotICAgIG1fc3luY1RocmVhZFJ1bm5pbmcgPSBmYWxzZTsKLSAg
ICBtX3RocmVhZFRlcm1pbmF0aW9uUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgbV9yZW1vdmVJY29u
c1JlcXVlc3RlZCA9IGZhbHNlOwotCi0gICAgbV9zeW5jREIuY2xvc2UoKTsKLQotICAgIG1fY2xp
ZW50ID0gbnVsbHB0cjsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBJY29uRGF0YWJhc2U6
OnJlbW92ZUFsbEljb25zKCkKK3ZvaWQgSWNvbkRhdGFiYXNlOjpwb3B1bGF0ZVBhZ2VVUkxUb0lj
b25VUkxNYXAoKQogewotICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKLQotICAgIGlmICgh
aXNPcGVuKCkpCisgICAgaWYgKCFtX2RiLmlzT3BlbigpKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBMT0coSWNvbkRhdGFiYXNlLCAiUmVxdWVzdGluZyBiYWNrZ3JvdW5kIHRocmVhZCB0byByZW1v
dmUgYWxsIGljb25zIik7Ci0KLSAgICAvLyBDbGVhciB0aGUgaW4tbWVtb3J5IHJlY29yZCBvZiBl
dmVyeSBJY29uUmVjb3JkLCBhbnl0aGluZyB3YWl0aW5nIHRvIGJlIHJlYWQgZnJvbSBkaXNrLCBh
bmQgYW55dGhpbmcgd2FpdGluZyB0byBiZSB3cml0dGVuIHRvIGRpc2sKLSAgICB7Ci0gICAgICAg
IExvY2tIb2xkZXIgbG9ja2VyKG1fdXJsQW5kSWNvbkxvY2spOwotCi0gICAgICAgIC8vIENsZWFy
IHRoZSBJY29uUmVjb3JkcyBmb3IgZXZlcnkgcGFnZSBVUkwgLSBSZWZDb3VudGluZyB3aWxsIGNh
dXNlIHRoZSBJY29uUmVjb3JkcyB0aGVtc2VsdmVzIHRvIGJlIGRlbGV0ZWQKLSAgICAgICAgLy8g
V2UgZG9uJ3QgZGVsZXRlIHRoZSBhY3R1YWwgUGFnZVJlY29yZHMgYmVjYXVzZSB3ZSBoYXZlIHRo
ZSAicmV0YWluIGljb24gZm9yIHVybCIgY291bnQgdG8ga2VlcCB0cmFjayBvZgotICAgICAgICBm
b3IgKGF1dG8mIHBhZ2VVUkwgOiBtX3BhZ2VVUkxUb1JlY29yZE1hcC52YWx1ZXMoKSkKLSAgICAg
ICAgICAgIHBhZ2VVUkwtPnNldEljb25SZWNvcmQobnVsbHB0cik7Ci0KLSAgICAgICAgLy8gQ2xl
YXIgdGhlIGljb25VUkwgLT4gSWNvblJlY29yZCBtYXAKLSAgICAgICAgbV9pY29uVVJMVG9SZWNv
cmRNYXAuY2xlYXIoKTsKLQotICAgICAgICAvLyBDbGVhciBhbGwgaW4tbWVtb3J5IHJlY29yZHMg
b2YgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBzeW5jZWQgb3V0IHRvIGRpc2sKLSAgICAgICAgewot
ICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nU3luY0xvY2spOwotICAgICAg
ICAgICAgbV9wYWdlVVJMc1BlbmRpbmdTeW5jLmNsZWFyKCk7Ci0gICAgICAgICAgICBtX2ljb25z
UGVuZGluZ1N5bmMuY2xlYXIoKTsKLSAgICAgICAgfQorICAgIFN0cmluZyBpbXBvcnRRdWVyeSA9
IG1ha2VTdHJpbmcoIlNFTEVDVCBQYWdlVVJMLnVybCwgSWNvbkluZm8udXJsLCBJY29uSW5mby5z
dGFtcCBGUk9NIFBhZ2VVUkwgSU5ORVIgSk9JTiBJY29uSW5mbyBPTiBQYWdlVVJMLmljb25JRD1J
Y29uSW5mby5pY29uSUQgV0hFUkUgSWNvbkluZm8uc3RhbXAgPiAiLCBmbG9vcigoV2FsbFRpbWU6
Om5vdygpIC0gbm90VXNlZEljb25FeHBpcmF0aW9uVGltZSkuc2Vjb25kc1NpbmNlRXBvY2goKS5z
ZWNvbmRzKCkpLCAnOycpOworICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCBpbXBvcnRR
dWVyeSk7CisgICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBpY29uIHVybCBpbXBvcnQgcXVlcnkiKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICAvLyBDbGVhciBhbGwgaW4tbWVtb3J5IHJl
Y29yZHMgb2YgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSByZWFkIGluIGZyb20gZGlzawotICAgICAg
ICB7Ci0gICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7
Ci0gICAgICAgICAgICBtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydC5jbGVhcigpOwotICAgICAgICAg
ICAgbV9wYWdlVVJMc0ludGVyZXN0ZWRJbkljb25zLmNsZWFyKCk7Ci0gICAgICAgICAgICBtX2lj
b25zUGVuZGluZ1JlYWRpbmcuY2xlYXIoKTsKLSAgICAgICAgfQorICAgIGF1dG8gcmVzdWx0ID0g
cXVlcnkuc3RlcCgpOworICAgIHdoaWxlIChyZXN1bHQgPT0gU1FMSVRFX1JPVykgeworICAgICAg
ICBtX3BhZ2VVUkxUb0ljb25VUkxNYXAuc2V0KHF1ZXJ5LmdldENvbHVtblRleHQoMCksIHF1ZXJ5
LmdldENvbHVtblRleHQoMSkpOworICAgICAgICByZXN1bHQgPSBxdWVyeS5zdGVwKCk7CiAgICAg
fQogCi0gICAgbV9yZW1vdmVJY29uc1JlcXVlc3RlZCA9IHRydWU7Ci0gICAgd2FrZVN5bmNUaHJl
YWQoKTsKKyAgICBzdGFydFBydW5lVGltZXIoKTsKIH0KIAotc3RhdGljIGJvb2wgZG9jdW1lbnRD
YW5IYXZlSWNvbihjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMKQordm9pZCBJY29uRGF0YWJhc2U6
OmNsZWFyU3RhdGVtZW50cygpCiB7Ci0gICAgcmV0dXJuICFkb2N1bWVudFVSTC5pc0VtcHR5KCkg
JiYgIXByb3RvY29sSXMoZG9jdW1lbnRVUkwsICJhYm91dCIpOworICAgIFJFTEVBU0VfQVNTRVJU
KG1fZGIuaXNPcGVuKCkpOworCisgICAgbV9pY29uSURGb3JJY29uVVJMU3RhdGVtZW50ID0gbnVs
bHB0cjsKKyAgICBtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQgPSBudWxscHRyOworICAg
IG1faWNvbkRhdGFTdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fYWRkSWNvblN0YXRlbWVudCA9
IG51bGxwdHI7CisgICAgbV9hZGRJY29uRGF0YVN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgbV91
cGRhdGVJY29uVGltZXN0YW1wU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICBtX2RlbGV0ZVBhZ2VV
UkxzRm9ySWNvblN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgbV9kZWxldGVJY29uRGF0YVN0YXRl
bWVudCA9IG51bGxwdHI7CisgICAgbV9kZWxldGVJY29uU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAg
ICBtX3BydW5lSWNvbnNTdGF0ZW1lbnQgPSBudWxscHRyOwogfQogCi1zdGQ6OnBhaXI8TmF0aXZl
SW1hZ2VQdHIsIEljb25EYXRhYmFzZTo6SXNLbm93bkljb24+IEljb25EYXRhYmFzZTo6c3luY2hy
b25vdXNJY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VVUkxPcmlnaW5hbCwgY29uc3Qg
SW50U2l6ZSYgc2l6ZSkKK3ZvaWQgSWNvbkRhdGFiYXNlOjpwcnVuZVRpbWVyRmlyZWQoKQogewot
ICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKLQotICAgIC8vIHBhZ2VVUkxPcmlnaW5hbCBj
YW5ub3QgYmUgc3RvcmVkIHdpdGhvdXQgYmVpbmcgZGVlcCBjb3BpZWQgZmlyc3QuCi0gICAgLy8g
V2Ugc2hvdWxkIGdvIG91ciBvZiBvdXIgd2F5IHRvIG9ubHkgY29weSBpdCBpZiB3ZSBoYXZlIHRv
IHN0b3JlIGl0CisgICAgUkVMRUFTRV9BU1NFUlQobV9kYi5pc09wZW4oKSk7CiAKLSAgICBpZiAo
IWlzT3BlbigpIHx8ICFkb2N1bWVudENhbkhhdmVJY29uKHBhZ2VVUkxPcmlnaW5hbCkpCi0gICAg
ICAgIHJldHVybiB7IG51bGxwdHIsIElzS25vd25JY29uOjpObyB9OwotCi0gICAgTG9ja0hvbGRl
ciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7Ci0KLSAgICBwZXJmb3JtUGVuZGluZ1JldGFpbkFu
ZFJlbGVhc2VPcGVyYXRpb25zKCk7Ci0KLSAgICBTdHJpbmcgcGFnZVVSTENvcHk7IC8vIENyZWF0
ZXMgYSBudWxsIHN0cmluZyBmb3IgZWFzeSB0ZXN0aW5nCi0KLSAgICBQYWdlVVJMUmVjb3JkKiBw
YWdlUmVjb3JkID0gbV9wYWdlVVJMVG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkxPcmlnaW5hbCk7Ci0g
ICAgaWYgKCFwYWdlUmVjb3JkKSB7Ci0gICAgICAgIHBhZ2VVUkxDb3B5ID0gcGFnZVVSTE9yaWdp
bmFsLmlzb2xhdGVkQ29weSgpOwotICAgICAgICBwYWdlUmVjb3JkID0gZ2V0T3JDcmVhdGVQYWdl
VVJMUmVjb3JkKHBhZ2VVUkxDb3B5KTsKKyAgICBpZiAoIW1fcHJ1bmVJY29uc1N0YXRlbWVudCkg
eworICAgICAgICBtX3BydW5lSWNvbnNTdGF0ZW1lbnQgPSBtYWtlVW5pcXVlPFNRTGl0ZVN0YXRl
bWVudD4obV9kYiwgIkRFTEVURSBGUk9NIEljb25JbmZvIFdIRVJFIHN0YW1wIDw9ICg/KTsiKTsK
KyAgICAgICAgaWYgKG1fcHJ1bmVJY29uc1N0YXRlbWVudC0+cHJlcGFyZSgpICE9IFNRTElURV9P
SykgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJQcmVwYXJpbmcgc3RhdGVtZW50IHBydW5lSWNv
bnMgZmFpbGVkIik7CisgICAgICAgICAgICBtX3BydW5lSWNvbnNTdGF0ZW1lbnQgPSBudWxscHRy
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gSWYgcGFn
ZVJlY29yZCBpcyBudWxscHRyLCBvbmUgb2YgdHdvIHRoaW5ncyBpcyB0cnVlIC0KLSAgICAvLyAx
IC0gVGhlIGluaXRpYWwgdXJsIGltcG9ydCBpcyBpbmNvbXBsZXRlIGFuZCB0aGlzIHBhZ2VVUkwg
d2FzIG1hcmtlZCB0byBiZSBub3RpZmllZCBvbmNlIGl0IGlzIGNvbXBsZXRlIGlmIGFuIGljb25V
UkwgZXhpc3RzCi0gICAgLy8gMiAtIFRoZSBpbml0aWFsIHVybCBpbXBvcnQgSVMgY29tcGxldGUg
YW5kIHRoaXMgcGFnZVVSTCBoYXMgbm8gaWNvbgotICAgIGlmICghcGFnZVJlY29yZCkgewotICAg
ICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7Ci0KLSAgICAgICAg
Ly8gSW1wb3J0IGlzIG9uZ29pbmcsIHRoZXJlIG1pZ2h0IGJlIGFuIGljb24uIEluIHRoaXMgY2Fz
ZSwgcmVnaXN0ZXIgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgaWNvbiBjb21lcyBpbgotICAgICAg
ICAvLyBJZiB3ZSBldmVyIHJlYWNoIHRoaXMgY29uZGl0aW9uLCB3ZSBrbm93IHdlJ3ZlIGFscmVh
ZHkgbWFkZSB0aGUgcGFnZVVSTCBjb3B5Ci0gICAgICAgIGlmICghbV9pY29uVVJMSW1wb3J0Q29t
cGxldGUpCi0gICAgICAgICAgICBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMuYWRkKHBhZ2VV
UkxDb3B5KTsKLQotICAgICAgICByZXR1cm4geyBudWxscHRyLCBJc0tub3duSWNvbjo6Tm8gfTsK
KyAgICBpZiAobV9wcnVuZUljb25zU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgZmxvb3IoKFdhbGxU
aW1lOjpub3coKSAtIG5vdFVzZWRJY29uRXhwaXJhdGlvblRpbWUpLnNlY29uZHNTaW5jZUVwb2No
KCkuc2Vjb25kcygpKSkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiRmF2aWNv
bkRhdGFic2U6OnBydW5lVGltZXJGaXJlZCBmYWlsZWQ6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2co
KSk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBJY29uUmVjb3JkKiBpY29uUmVjb3Jk
ID0gcGFnZVJlY29yZC0+aWNvblJlY29yZCgpOwotCi0gICAgLy8gSWYgdGhlIGluaXRpYWwgVVJM
IGltcG9ydCBpc24ndCBjb21wbGV0ZSwgaXQncyBwb3NzaWJsZSB0byBoYXZlIGEgUGFnZVVSTCBy
ZWNvcmQgd2l0aG91dCBhbiBhc3NvY2lhdGVkIGljb24KLSAgICAvLyBJbiB0aGlzIGNhc2UsIHRo
ZSBwYWdlVVJMIGlzIGFscmVhZHkgaW4gdGhlIHNldCB0byBhbGVydCB0aGUgY2xpZW50IHdoZW4g
dGhlIGljb25VUkwgbWFwcGluZyBpcyBjb21wbGV0ZSBzbwotICAgIC8vIHdlIGNhbiBqdXN0IGJh
aWwgbm93Ci0gICAgaWYgKCFtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSAmJiAhaWNvblJlY29yZCkK
LSAgICAgICAgcmV0dXJuIHsgbnVsbHB0ciwgSXNLbm93bkljb246Ok5vIH07Ci0KLSAgICAvLyBB
c3N1bWluZyB3ZSdyZSBkb25lIGluaXRpYWxpemluZyBhbmQgY2xlYW51cCBpcyBhbGxvd2VkLAot
ICAgIC8vIHRoZSBvbmx5IHdheSB3ZSBzaG91bGQgKm5vdCogaGF2ZSBhbiBpY29uIHJlY29yZCBp
cyBpZiB0aGlzIHBhZ2VVUkwgaXMgcmV0YWluZWQgYnV0IGhhcyBubyBpY29uIHlldC4KLSAgICBB
U1NFUlQoaWNvblJlY29yZCB8fCBkYXRhYmFzZUNsZWFudXBDb3VudGVyIHx8IG1fcmV0YWluZWRQ
YWdlVVJMcy5jb250YWlucyhwYWdlVVJMT3JpZ2luYWwpKTsKLQotICAgIGlmICghaWNvblJlY29y
ZCkKLSAgICAgICAgcmV0dXJuIHsgbnVsbHB0ciwgSXNLbm93bkljb246Ok5vIH07Ci0KLSAgICAv
LyBJZiBpdCdzIGEgbmV3IEljb25SZWNvcmQgb2JqZWN0IHRoYXQgZG9lc24ndCBoYXZlIGl0cyBp
bWFnZURhdGEgc2V0IHlldCwKLSAgICAvLyBtYXJrIGl0IHRvIGJlIHJlYWQgYnkgdGhlIGJhY2tn
cm91bmQgdGhyZWFkCi0gICAgaWYgKGljb25SZWNvcmQtPmltYWdlRGF0YVN0YXR1cygpID09IElj
b25SZWNvcmQ6OkltYWdlRGF0YVN0YXR1czo6VW5rbm93bikgewotICAgICAgICBpZiAocGFnZVVS
TENvcHkuaXNOdWxsKCkpCi0gICAgICAgICAgICBwYWdlVVJMQ29weSA9IHBhZ2VVUkxPcmlnaW5h
bC5pc29sYXRlZENvcHkoKTsKLQotICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdS
ZWFkaW5nTG9jayk7Ci0gICAgICAgIG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29ucy5hZGQocGFn
ZVVSTENvcHkpOwotICAgICAgICBtX2ljb25zUGVuZGluZ1JlYWRpbmcuYWRkKGljb25SZWNvcmQp
OwotICAgICAgICB3YWtlU3luY1RocmVhZCgpOwotICAgICAgICByZXR1cm4geyBudWxscHRyLCBJ
c0tub3duSWNvbjo6Tm8gfTsKKyAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2Ri
KTsKKyAgICB0cmFuc2FjdGlvbi5iZWdpbigpOworICAgIGlmIChtX3BydW5lSWNvbnNTdGF0ZW1l
bnQtPnN0ZXAoKSA9PSBTUUxJVEVfRE9ORSkgeworICAgICAgICBtX2RiLmV4ZWN1dGVDb21tYW5k
KCJERUxFVEUgRlJPTSBJY29uRGF0YSBXSEVSRSBpY29uSUQgTk9UIElOIChTRUxFQ1QgaWNvbklE
IEZST00gSWNvbkluZm8pOyIpOworICAgICAgICBtX2RiLmV4ZWN1dGVDb21tYW5kKCJERUxFVEUg
RlJPTSBQYWdlVVJMIFdIRVJFIGljb25JRCBOT1QgSU4gKFNFTEVDVCBpY29uSUQgRlJPTSBJY29u
SW5mbyk7Iik7CiAgICAgfQorICAgIG1fcHJ1bmVJY29uc1N0YXRlbWVudC0+cmVzZXQoKTsKIAot
ICAgIC8vIElmIHRoZSBzaXplIHBhcmFtZXRlciB3YXMgKDAsIDApIHRoYXQgbWVhbnMgdGhlIGNh
bGxlciBvZiB0aGlzIG1ldGhvZCBqdXN0IHdhbnRlZCB0aGUgcmVhZCBmcm9tIGRpc2sgdG8gYmUg
a2lja2VkIG9mZgotICAgIC8vIGFuZCBpc24ndCBhY3R1YWxseSBpbnRlcmVzdGVkIGluIHRoZSBp
bWFnZSByZXR1cm4gdmFsdWUKLSAgICBpZiAoc2l6ZSA9PSBJbnRTaXplKDAsIDApKQotICAgICAg
ICByZXR1cm4geyBudWxscHRyLCBJc0tub3duSWNvbjo6WWVzIH07Ci0KLSAgICByZXR1cm4geyBp
Y29uUmVjb3JkLT5pbWFnZShzaXplKSwgSXNLbm93bkljb246OlllcyB9OwotfQotCi1TdHJpbmcg
SWNvbkRhdGFiYXNlOjpzeW5jaHJvbm91c0ljb25VUkxGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYg
cGFnZVVSTE9yaWdpbmFsKQotewotICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKLQotICAg
IC8vIENhbm5vdCBkbyBhbnl0aGluZyB3aXRoIHBhZ2VVUkxPcmlnaW5hbCB0aGF0IHdvdWxkIGVu
ZCB1cCBzdG9yaW5nIGl0IHdpdGhvdXQgZGVlcCBjb3B5aW5nIGZpcnN0Ci0gICAgLy8gQWxzbywg
aW4gdGhlIGNhc2Ugd2UgaGF2ZSBhIHJlYWwgYW5zd2VyIGZvciB0aGUgY2FsbGVyLCB3ZSBtdXN0
IGRlZXAgY29weSB0aGF0IGFzIHdlbGwKLQotICAgIGlmICghaXNPcGVuKCkgfHwgIWRvY3VtZW50
Q2FuSGF2ZUljb24ocGFnZVVSTE9yaWdpbmFsKSkKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwot
Ci0gICAgTG9ja0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7Ci0KLSAgICBQYWdlVVJM
UmVjb3JkKiBwYWdlUmVjb3JkID0gbV9wYWdlVVJMVG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkxPcmln
aW5hbCk7Ci0gICAgaWYgKCFwYWdlUmVjb3JkKQotICAgICAgICBwYWdlUmVjb3JkID0gZ2V0T3JD
cmVhdGVQYWdlVVJMUmVjb3JkKHBhZ2VVUkxPcmlnaW5hbC5pc29sYXRlZENvcHkoKSk7Ci0KLSAg
ICAvLyBJZiBwYWdlUmVjb3JkIGlzIG51bGxwdHIsIG9uZSBvZiB0d28gdGhpbmdzIGlzIHRydWUg
LQotICAgIC8vIDEgLSBUaGUgaW5pdGlhbCB1cmwgaW1wb3J0IGlzIGluY29tcGxldGUgYW5kIHRo
aXMgcGFnZVVSTCBoYXMgYWxyZWFkeSBiZWVuIG1hcmtlZCB0byBiZSBub3RpZmllZCBvbmNlIGl0
IGlzIGNvbXBsZXRlIGlmIGFuIGljb25VUkwgZXhpc3RzCi0gICAgLy8gMiAtIFRoZSBpbml0aWFs
IHVybCBpbXBvcnQgSVMgY29tcGxldGUgYW5kIHRoaXMgcGFnZVVSTCBoYXMgbm8gaWNvbgotICAg
IGlmICghcGFnZVJlY29yZCkKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotCi0gICAgLy8gUG9z
c2libGUgdGhlIHBhZ2VSZWNvcmQgaXMgYXJvdW5kIGJlY2F1c2UgaXQncyBhIHJldGFpbmVkIHBh
Z2VVUkwgd2l0aCBubyBpY29uVVJMLCBzbyB3ZSBoYXZlIHRvIGNoZWNrCi0gICAgcmV0dXJuIHBh
Z2VSZWNvcmQtPmljb25SZWNvcmQoKSA/IHBhZ2VSZWNvcmQtPmljb25SZWNvcmQoKS0+aWNvblVS
TCgpLmlzb2xhdGVkQ29weSgpIDogU3RyaW5nKCk7CisgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7
CiB9CiAKLXZvaWQgSWNvbkRhdGFiYXNlOjpyZXRhaW5JY29uRm9yUGFnZVVSTChjb25zdCBTdHJp
bmcmIHBhZ2VVUkwpCit2b2lkIEljb25EYXRhYmFzZTo6c3RhcnRQcnVuZVRpbWVyKCkKIHsKLSAg
ICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICBpZiAoIWlzRW5hYmxlZCgpIHx8ICFk
b2N1bWVudENhbkhhdmVJY29uKHBhZ2VVUkwpKQorICAgIGlmICghbV9wcnVuZVRpbWVyIHx8ICFt
X2RiLmlzT3BlbigpKQogICAgICAgICByZXR1cm47CiAKLSAgICB7Ci0gICAgICAgIExvY2tIb2xk
ZXIgbG9ja2VyKG1fdXJsc1RvUmV0YWluT3JSZWxlYXNlTG9jayk7Ci0gICAgICAgIG1fdXJsc1Rv
UmV0YWluLmFkZChwYWdlVVJMLmlzb2xhdGVkQ29weSgpKTsKLSAgICAgICAgbV9yZXRhaW5PclJl
bGVhc2VJY29uUmVxdWVzdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzY2hlZHVsZU9yRGVmZXJT
eW5jVGltZXIoKTsKKyAgICBpZiAobV9wcnVuZVRpbWVyLT5pc0FjdGl2ZSgpKQorICAgICAgICBt
X3BydW5lVGltZXItPnN0b3AoKTsKKyAgICBtX3BydW5lVGltZXItPnN0YXJ0T25lU2hvdCgxMF9z
KTsKIH0KIAotdm9pZCBJY29uRGF0YWJhc2U6OnBlcmZvcm1SZXRhaW5JY29uRm9yUGFnZVVSTChj
b25zdCBTdHJpbmcmIHBhZ2VVUkxPcmlnaW5hbCwgaW50IHJldGFpbkNvdW50KQordm9pZCBJY29u
RGF0YWJhc2U6OmNsZWFyTG9hZGVkSWNvbnNUaW1lckZpcmVkKCkKIHsKLSAgICBQYWdlVVJMUmVj
b3JkKiByZWNvcmQgPSBtX3BhZ2VVUkxUb1JlY29yZE1hcC5nZXQocGFnZVVSTE9yaWdpbmFsKTsK
LQotICAgIFN0cmluZyBwYWdlVVJMOwotCi0gICAgaWYgKCFyZWNvcmQpIHsKLSAgICAgICAgcGFn
ZVVSTCA9IHBhZ2VVUkxPcmlnaW5hbC5pc29sYXRlZENvcHkoKTsKLQotICAgICAgICByZWNvcmQg
PSBuZXcgUGFnZVVSTFJlY29yZChwYWdlVVJMKTsKLSAgICAgICAgbV9wYWdlVVJMVG9SZWNvcmRN
YXAuc2V0KHBhZ2VVUkwsIHJlY29yZCk7CisgICAgYXV0byBub3cgPSBNb25vdG9uaWNUaW1lOjpu
b3coKTsKKyAgICBWZWN0b3I8U3RyaW5nPiBpY29uc1RvUmVtb3ZlOworICAgIGZvciAoYXV0byBp
dGVyIDogbV9sb2FkZWRJY29ucykgeworICAgICAgICBpZiAobm93IC0gaXRlci52YWx1ZS5zZWNv
bmQgPj0gbG9hZGVkSWNvbkV4cGlyYXRpb25UaW1lKQorICAgICAgICAgICAgaWNvbnNUb1JlbW92
ZS5hcHBlbmQoaXRlci5rZXkpOwogICAgIH0KIAotICAgIGlmICghcmVjb3JkLT5yZXRhaW4ocmV0
YWluQ291bnQpKSB7Ci0gICAgICAgIGlmIChwYWdlVVJMLmlzTnVsbCgpKQotICAgICAgICAgICAg
cGFnZVVSTCA9IHBhZ2VVUkxPcmlnaW5hbC5pc29sYXRlZENvcHkoKTsKLQotICAgICAgICAvLyBU
aGlzIHBhZ2UganVzdCBoYWQgaXRzIHJldGFpbiBjb3VudCBidW1wZWQgZnJvbSAwIHRvIDEgLSBS
ZWNvcmQgdGhhdCBmYWN0Ci0gICAgICAgIG1fcmV0YWluZWRQYWdlVVJMcy5hZGQocGFnZVVSTCk7
Ci0KLSAgICAgICAgLy8gSWYgd2UgcmVhZCB0aGUgaWNvblVSTHMgeWV0LCB3ZSB3YW50IHRvIGF2
b2lkIGFueSBwYWdlVVJMLT5pY29uVVJMIGxvb2t1cHMgYW5kIHRoZSBwYWdlVVJMc1BlbmRpbmdE
ZWxldGlvbiBpcyBtb290LAotICAgICAgICAvLyBzbyB3ZSBiYWlsIGhlcmUgYW5kIHNraXAgdGhv
c2Ugc3RlcHMKLSAgICAgICAgaWYgKCFtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSkKLSAgICAgICAg
ICAgIHJldHVybjsKKyAgICBmb3IgKGF1dG8mIGljb25VUkwgOiBpY29uc1RvUmVtb3ZlKQorICAg
ICAgICBtX2xvYWRlZEljb25zLnJlbW92ZShpY29uVVJMKTsKIAotICAgICAgICBMb2NrSG9sZGVy
IGxvY2tlcihtX3BlbmRpbmdTeW5jTG9jayk7Ci0gICAgICAgIC8vIElmIHRoaXMgcGFnZVVSTCB3
YWl0aW5nIHRvIGJlIHN5bmMnZWQsIHVwZGF0ZSB0aGUgc3luYyByZWNvcmQKLSAgICAgICAgLy8g
VGhpcyBzYXZlcyB1cyBpbiB0aGUgY2FzZSB3aGVyZSBhIHBhZ2Ugd2FzIHJlYWR5IHRvIGJlIGRl
bGV0ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnV0IHdhcyBqdXN0IHJldGFpbmVkIC0gc28gdGhlcmVz
IG5vIG5lZWQgdG8gZGVsZXRlIGl0IQotICAgICAgICBpZiAoIW1fcHJpdmF0ZUJyb3dzaW5nRW5h
YmxlZCAmJiBtX3BhZ2VVUkxzUGVuZGluZ1N5bmMuY29udGFpbnMocGFnZVVSTCkpIHsKLSAgICAg
ICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJCcmluZ2luZyAlcyBiYWNrIGZyb20gdGhlIGJyaW5r
IiwgcGFnZVVSTC5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgICAgICBtX3BhZ2VVUkxzUGVuZGlu
Z1N5bmMuc2V0KHBhZ2VVUkwsIHJlY29yZC0+c25hcHNob3QoKSk7Ci0gICAgICAgIH0KLSAgICB9
CisgICAgaWYgKCFtX2xvYWRlZEljb25zLmlzRW1wdHkoKSkKKyAgICAgICAgc3RhcnRDbGVhckxv
YWRlZEljb25zVGltZXIoKTsKIH0KIAotdm9pZCBJY29uRGF0YWJhc2U6OnJlbGVhc2VJY29uRm9y
UGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VVUkwpCit2b2lkIEljb25EYXRhYmFzZTo6c3RhcnRD
bGVhckxvYWRlZEljb25zVGltZXIoKQogewotICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsK
LQotICAgIC8vIENhbm5vdCBkbyBhbnl0aGluZyB3aXRoIHBhZ2VVUkxPcmlnaW5hbCB0aGF0IHdv
dWxkIGVuZCB1cCBzdG9yaW5nIGl0IHdpdGhvdXQgZGVlcCBjb3B5aW5nIGZpcnN0Ci0KLSAgICBp
ZiAoIWlzRW5hYmxlZCgpIHx8ICFkb2N1bWVudENhbkhhdmVJY29uKHBhZ2VVUkwpKQorICAgIGlm
IChtX2NsZWFyTG9hZGVkSWNvbnNUaW1lci5pc0FjdGl2ZSgpKQogICAgICAgICByZXR1cm47CiAK
LSAgICB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fdXJsc1RvUmV0YWluT3JSZWxlYXNl
TG9jayk7Ci0gICAgICAgIG1fdXJsc1RvUmVsZWFzZS5hZGQocGFnZVVSTC5pc29sYXRlZENvcHko
KSk7Ci0gICAgICAgIG1fcmV0YWluT3JSZWxlYXNlSWNvblJlcXVlc3RlZCA9IHRydWU7Ci0gICAg
fQotICAgIHNjaGVkdWxlT3JEZWZlclN5bmNUaW1lcigpOworICAgIG1fY2xlYXJMb2FkZWRJY29u
c1RpbWVyLnN0YXJ0T25lU2hvdChsb2FkZWRJY29uRXhwaXJhdGlvblRpbWUpOwogfQogCi12b2lk
IEljb25EYXRhYmFzZTo6cGVyZm9ybVJlbGVhc2VJY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcm
IHBhZ2VVUkxPcmlnaW5hbCwgaW50IHJlbGVhc2VDb3VudCkKK09wdGlvbmFsPGludDY0X3Q+IElj
b25EYXRhYmFzZTo6aWNvbklERm9ySWNvblVSTChjb25zdCBTdHJpbmcmIGljb25VUkwsIGJvb2wm
IGV4cGlyZWQpCiB7Ci0gICAgLy8gQ2hlY2sgaWYgdGhpcyBwYWdlVVJMIGlzIGFjdHVhbGx5IHJl
dGFpbmVkCi0gICAgaWYgKCFtX3JldGFpbmVkUGFnZVVSTHMuY29udGFpbnMocGFnZVVSTE9yaWdp
bmFsKSkgewotICAgICAgICBMT0dfRVJST1IoIkF0dGVtcHRpbmcgdG8gcmVsZWFzZSBpY29uIGZv
ciBVUkwgJXMgd2hpY2ggaXMgbm90IHJldGFpbmVkIiwgdXJsRm9yTG9nZ2luZyhwYWdlVVJMT3Jp
Z2luYWwpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgICBSRUxF
QVNFX0FTU0VSVChtX2RiLmlzT3BlbigpKTsKIAotICAgIC8vIEdldCBpdHMgcmV0YWluIGNvdW50
IC0gaWYgaXQncyByZXRhaW5lZCwgd2UnZCBiZXR0ZXIgaGF2ZSBhIFBhZ2VVUkxSZWNvcmQgZm9y
IGl0Ci0gICAgUGFnZVVSTFJlY29yZCogcGFnZVJlY29yZCA9IG1fcGFnZVVSTFRvUmVjb3JkTWFw
LmdldChwYWdlVVJMT3JpZ2luYWwpOwotICAgIEFTU0VSVChwYWdlUmVjb3JkKTsKLSAgICBMT0co
SWNvbkRhdGFiYXNlLCAiUmVsZWFzaW5nIHBhZ2VVUkwgJXMgdG8gYSByZXRhaW4gY291bnQgb2Yg
JWkiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkxPcmlnaW5hbCkuYXNjaWkoKS5kYXRhKCksIHBhZ2VS
ZWNvcmQtPnJldGFpbkNvdW50KCkgLSAxKTsKLSAgICBBU1NFUlQocGFnZVJlY29yZC0+cmV0YWlu
Q291bnQoKSA+IDApOwotCi0gICAgLy8gSWYgaXQgc3RpbGwgaGFzIGEgcG9zaXRpdmUgcmV0YWlu
IGNvdW50LCBzdG9yZSB0aGUgbmV3IGNvdW50IGFuZCBiYWlsCi0gICAgaWYgKHBhZ2VSZWNvcmQt
PnJlbGVhc2UocmVsZWFzZUNvdW50KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVGhpcyBw
YWdlUmVjb3JkIGhhcyBub3cgYmVlbiBmdWxseSByZWxlYXNlZC4gRG8gdGhlIGFwcHJvcHJpYXRl
IGNsZWFudXAKLSAgICBMT0coSWNvbkRhdGFiYXNlLCAiTm8gbW9yZSByZXRhaW5lcnMgZm9yIFBh
Z2VVUkwgJXMiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkxPcmlnaW5hbCkuYXNjaWkoKS5kYXRhKCkp
OwotICAgIG1fcGFnZVVSTFRvUmVjb3JkTWFwLnJlbW92ZShwYWdlVVJMT3JpZ2luYWwpOwotICAg
IG1fcmV0YWluZWRQYWdlVVJMcy5yZW1vdmUocGFnZVVSTE9yaWdpbmFsKTsKLQotICAgIC8vIEdy
YWIgdGhlIGljb25SZWNvcmQgZm9yIGxhdGVyIHVzZSAoYW5kIGRvIGEgc2FuaXR5IGNoZWNrIG9u
IGl0IGZvciBraWNrcykKLSAgICBJY29uUmVjb3JkKiBpY29uUmVjb3JkID0gcGFnZVJlY29yZC0+
aWNvblJlY29yZCgpOwotCi0gICAgQVNTRVJUKCFpY29uUmVjb3JkIHx8IChpY29uUmVjb3JkICYm
IG1faWNvblVSTFRvUmVjb3JkTWFwLmdldChpY29uUmVjb3JkLT5pY29uVVJMKCkpID09IGljb25S
ZWNvcmQpKTsKLQotICAgIHsKLSAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nUmVh
ZGluZ0xvY2spOwotCi0gICAgICAgIC8vIFNpbmNlIHRoaXMgcGFnZVVSTCBpcyBnb2luZyBhd2F5
LCB0aGVyZSdzIG5vIHJlYXNvbiBhbnlvbmUgd291bGQgZXZlciBiZSBpbnRlcmVzdGVkIGluIGl0
cyByZWFkIHJlc3VsdHMKLSAgICAgICAgaWYgKCFtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSkKLSAg
ICAgICAgICAgIG1fcGFnZVVSTHNQZW5kaW5nSW1wb3J0LnJlbW92ZShwYWdlVVJMT3JpZ2luYWwp
OwotICAgICAgICBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMucmVtb3ZlKHBhZ2VVUkxPcmln
aW5hbCk7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBpY29uIGlzIGRvd24gdG8gaXQncyBsYXN0IHJl
dGFpbmVyLCB3ZSBkb24ndCBjYXJlIGFib3V0IHJlYWRpbmcgaXQgaW4gZnJvbSBkaXNrIGFueW1v
cmUKLSAgICAgICAgaWYgKGljb25SZWNvcmQgJiYgaWNvblJlY29yZC0+aGFzT25lUmVmKCkpIHsK
LSAgICAgICAgICAgIG1faWNvblVSTFRvUmVjb3JkTWFwLnJlbW92ZShpY29uUmVjb3JkLT5pY29u
VVJMKCkpOwotICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFkaW5nLnJlbW92ZShpY29uUmVj
b3JkKTsKKyAgICBpZiAoIW1faWNvbklERm9ySWNvblVSTFN0YXRlbWVudCkgeworICAgICAgICBt
X2ljb25JREZvckljb25VUkxTdGF0ZW1lbnQgPSBtYWtlVW5pcXVlPFNRTGl0ZVN0YXRlbWVudD4o
bV9kYiwgIlNFTEVDVCBJY29uSW5mby5pY29uSUQsIEljb25JbmZvLnN0YW1wIEZST00gSWNvbklu
Zm8gV0hFUkUgSWNvbkluZm8udXJsID0gKD8pOyIpOworICAgICAgICBpZiAobV9pY29uSURGb3JJ
Y29uVVJMU3RhdGVtZW50LT5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICBM
T0dfRVJST1IoIlByZXBhcmluZyBzdGF0ZW1lbnQgaWNvbklERm9ySWNvblVSTCBmYWlsZWQiKTsK
KyAgICAgICAgICAgIG1faWNvbklERm9ySWNvblVSTFN0YXRlbWVudCA9IG51bGxwdHI7CisgICAg
ICAgICAgICByZXR1cm4gV1RGOjpudWxsb3B0OwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8g
TWFyayBzdHVmZiBmb3IgZGVsZXRpb24gZnJvbSB0aGUgZGF0YWJhc2Ugb25seSBpZiB3ZSdyZSBu
b3QgaW4gcHJpdmF0ZSBicm93c2luZwotICAgIGlmICghbV9wcml2YXRlQnJvd3NpbmdFbmFibGVk
KSB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1N5bmNMb2NrKTsKLSAgICAg
ICAgbV9wYWdlVVJMc1BlbmRpbmdTeW5jLnNldChwYWdlVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5
KCksIHBhZ2VSZWNvcmQtPnNuYXBzaG90KHRydWUpKTsKKyAgICBpZiAobV9pY29uSURGb3JJY29u
VVJMU3RhdGVtZW50LT5iaW5kVGV4dCgxLCBpY29uVVJMKSAhPSBTUUxJVEVfT0spIHsKKyAgICAg
ICAgTE9HX0VSUk9SKCJGYXZpY29uRGF0YWJzZTo6aWNvbklERm9ySWNvblVSTCBmYWlsZWQ6ICVz
IiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIHJldHVybiBXVEY6Om51bGxvcHQ7Cisg
ICAgfQogCi0gICAgICAgIC8vIElmIHRoaXMgcGFnZSBpcyB0aGUgbGFzdCBwYWdlIHRvIHJlZmVy
IHRvIGEgcGFydGljdWxhciBJY29uUmVjb3JkLCB0aGF0IEljb25SZWNvcmQgbmVlZHMgdG8KLSAg
ICAgICAgLy8gYmUgbWFya2VkIGZvciBkZWxldGlvbgotICAgICAgICBpZiAoaWNvblJlY29yZCAm
JiBpY29uUmVjb3JkLT5oYXNPbmVSZWYoKSkKLSAgICAgICAgICAgIG1faWNvbnNQZW5kaW5nU3lu
Yy5zZXQoaWNvblJlY29yZC0+aWNvblVSTCgpLCBpY29uUmVjb3JkLT5zbmFwc2hvdCh0cnVlKSk7
CisgICAgT3B0aW9uYWw8aW50NjRfdD4gcmVzdWx0OworICAgIGlmIChtX2ljb25JREZvckljb25V
UkxTdGF0ZW1lbnQtPnN0ZXAoKSA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIHJlc3VsdCA9IG1f
aWNvbklERm9ySWNvblVSTFN0YXRlbWVudC0+Z2V0Q29sdW1uSW50NjQoMCk7CisgICAgICAgIGV4
cGlyZWQgPSBtX2ljb25JREZvckljb25VUkxTdGF0ZW1lbnQtPmdldENvbHVtbkludDY0KDEpIDw9
IGZsb29yKChXYWxsVGltZTo6bm93KCkgLSBpY29uRXhwaXJhdGlvblRpbWUpLnNlY29uZHNTaW5j
ZUVwb2NoKCkuc2Vjb25kcygpKTsKICAgICB9CiAKLSAgICBkZWxldGUgcGFnZVJlY29yZDsKKyAg
ICBtX2ljb25JREZvckljb25VUkxTdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAgcmV0dXJuIHJlc3Vs
dDsKIH0KIAotdm9pZCBJY29uRGF0YWJhc2U6OnNldEljb25EYXRhRm9ySWNvblVSTChSZWZQdHI8
U2hhcmVkQnVmZmVyPiYmIGRhdGEsIGNvbnN0IFN0cmluZyYgaWNvblVSTE9yaWdpbmFsKQorYm9v
bCBJY29uRGF0YWJhc2U6OnNldEljb25JREZvclBhZ2VVUkwoaW50NjRfdCBpY29uSUQsIGNvbnN0
IFN0cmluZyYgcGFnZVVSTCkKIHsKLSAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7Ci0KLSAg
ICAvLyBDYW5ub3QgZG8gYW55dGhpbmcgd2l0aCBpY29uVVJMT3JpZ2luYWwgdGhhdCB3b3VsZCBl
bmQgdXAgc3RvcmluZyB0aGVtIHdpdGhvdXQgZGVlcCBjb3B5aW5nIGZpcnN0Ci0KLSAgICBpZiAo
IWlzT3BlbigpIHx8IGljb25VUkxPcmlnaW5hbC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsK
KyAgICBSRUxFQVNFX0FTU0VSVChtX2RiLmlzT3BlbigpKTsKKyAgICBSRUxFQVNFX0FTU0VSVCht
X2FsbG93RGF0YWJhc2VXcml0ZSA9PSBBbGxvd0RhdGFiYXNlV3JpdGU6Olllcyk7CiAKLSAgICBT
dHJpbmcgaWNvblVSTCA9IGljb25VUkxPcmlnaW5hbC5pc29sYXRlZENvcHkoKTsKLSAgICBWZWN0
b3I8U3RyaW5nPiBwYWdlVVJMczsKLSAgICB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1f
dXJsQW5kSWNvbkxvY2spOwotCi0gICAgICAgIC8vIElmIHRoaXMgaWNvbiB3YXMgcGVuZGluZyBh
IHJlYWQsIHJlbW92ZSBpdCBmcm9tIHRoYXQgc2V0IGJlY2F1c2UgdGhpcyBuZXcgZGF0YSBzaG91
bGQgb3ZlcnJpZGUgd2hhdCBpcyBvbiBkaXNrCi0gICAgICAgIFJlZlB0cjxJY29uUmVjb3JkPiBp
Y29uID0gbV9pY29uVVJMVG9SZWNvcmRNYXAuZ2V0KGljb25VUkwpOwotICAgICAgICBpZiAoaWNv
bikgewotICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2sp
OwotICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFkaW5nLnJlbW92ZShpY29uLmdldCgpKTsK
LSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpY29uID0gZ2V0T3JDcmVhdGVJY29uUmVjb3Jk
KGljb25VUkwpOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBhbmQgc2V0IHRoZSB0aW1l
IHN0YW1wCi0gICAgICAgIGljb24tPnNldEltYWdlRGF0YShXVEZNb3ZlKGRhdGEpKTsKLSAgICAg
ICAgaWNvbi0+c2V0VGltZXN0YW1wKChpbnQpV2FsbFRpbWU6Om5vdygpLnNlY29uZHNTaW5jZUVw
b2NoKCkuc2Vjb25kcygpKTsKLQotICAgICAgICAvLyBDb3B5IHRoZSBjdXJyZW50IHJldGFpbmlu
ZyBwYWdlVVJMcyAtIGlmIGFueSAtIHRvIG5vdGlmeSB0aGVtIG9mIHRoZSBjaGFuZ2UKLSAgICAg
ICAgcGFnZVVSTHMuYXBwZW5kUmFuZ2UoaWNvbi0+cmV0YWluaW5nUGFnZVVSTHMoKS5iZWdpbigp
LCBpY29uLT5yZXRhaW5pbmdQYWdlVVJMcygpLmVuZCgpKTsKLQotICAgICAgICAvLyBNYXJrIHRo
ZSBJY29uUmVjb3JkIGFzIHJlcXVpcmluZyBhbiB1cGRhdGUgdG8gdGhlIGRhdGFiYXNlIG9ubHkg
aWYgcHJpdmF0ZSBicm93c2luZyBpcyBkaXNhYmxlZAotICAgICAgICBpZiAoIW1fcHJpdmF0ZUJy
b3dzaW5nRW5hYmxlZCkgewotICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5n
U3luY0xvY2spOwotICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdTeW5jLnNldChpY29uVVJMLCBp
Y29uLT5zbmFwc2hvdCgpKTsKKyAgICBpZiAoIW1fc2V0SWNvbklERm9yUGFnZVVSTFN0YXRlbWVu
dCkgeworICAgICAgICBtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQgPSBtYWtlVW5pcXVl
PFNRTGl0ZVN0YXRlbWVudD4obV9kYiwgIklOU0VSVCBJTlRPIFBhZ2VVUkwgKHVybCwgaWNvbklE
KSBWQUxVRVMgKCg/KSwgPyk7Iik7CisgICAgICAgIGlmIChtX3NldEljb25JREZvclBhZ2VVUkxT
dGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJP
UigiUHJlcGFyaW5nIHN0YXRlbWVudCBzZXRJY29uSURGb3JQYWdlVVJMIGZhaWxlZCIpOworICAg
ICAgICAgICAgbV9zZXRJY29uSURGb3JQYWdlVVJMU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoaWNv
bi0+aGFzT25lUmVmKCkpIHsKLSAgICAgICAgICAgIEFTU0VSVChpY29uLT5yZXRhaW5pbmdQYWdl
VVJMcygpLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiSWNvbiBm
b3IgaWNvbiB1cmwgJXMgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkIC0gcmVtb3ZpbmcgbWFwcGlu
ZyBmb3IgaXQiLCB1cmxGb3JMb2dnaW5nKGljb24tPmljb25VUkwoKSkuYXNjaWkoKS5kYXRhKCkp
OwotICAgICAgICAgICAgbV9pY29uVVJMVG9SZWNvcmRNYXAucmVtb3ZlKGljb24tPmljb25VUkwo
KSk7Ci0gICAgICAgIH0KKyAgICBpZiAobV9zZXRJY29uSURGb3JQYWdlVVJMU3RhdGVtZW50LT5i
aW5kVGV4dCgxLCBwYWdlVVJMKSAhPSBTUUxJVEVfT0sKKyAgICAgICAgfHwgbV9zZXRJY29uSURG
b3JQYWdlVVJMU3RhdGVtZW50LT5iaW5kSW50NjQoMiwgaWNvbklEKSAhPSBTUUxJVEVfT0spIHsK
KyAgICAgICAgTE9HX0VSUk9SKCJGYXZpY29uRGF0YWJzZTo6c2V0SWNvbklERm9yUGFnZVVSTCBm
YWlsZWQ6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICB9CiAKLSAgICAvLyBTZW5kIG5vdGlmaWNhdGlvbiBvdXQgcmVnYXJkaW5nIGFsbCBQYWdl
VVJMcyB0aGF0IHJldGFpbiB0aGlzIGljb24KLSAgICAvLyBTdGFydCB0aGUgdGltZXIgdG8gY29t
bWl0IHRoaXMgY2hhbmdlIC0gb3IgZnVydGhlciBkZWxheSB0aGUgdGltZXIgaWYgaXQgd2FzIGFs
cmVhZHkgc3RhcnRlZAotICAgIHNjaGVkdWxlT3JEZWZlclN5bmNUaW1lcigpOworICAgIGlmICht
X3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQtPnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAKLSAgICBmb3IgKGF1dG8mIHBhZ2VVUkwgOiBw
YWdlVVJMcykgewotICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiRGlzcGF0Y2hpbmcgbm90aWZp
Y2F0aW9uIHRoYXQgcmV0YWluaW5nIHBhZ2VVUkwgJXMgaGFzIGEgbmV3IGljb24iLCB1cmxGb3JM
b2dnaW5nKHBhZ2VVUkwpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgaWYgKG1fY2xpZW50KQot
ICAgICAgICAgICAgbV9jbGllbnQtPmRpZENoYW5nZUljb25Gb3JQYWdlVVJMKHBhZ2VVUkwpOwot
ICAgIH0KKyAgICBtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAg
cmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgSWNvbkRhdGFiYXNlOjpzZXRJY29uVVJMRm9yUGFnZVVS
TChjb25zdCBTdHJpbmcmIGljb25VUkxPcmlnaW5hbCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMT3Jp
Z2luYWwpCitWZWN0b3I8Y2hhcj4gSWNvbkRhdGFiYXNlOjppY29uRGF0YShpbnQ2NF90IGljb25J
RCkKIHsKLSAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICAvLyBDYW5ub3QgZG8g
YW55dGhpbmcgd2l0aCBpY29uVVJMT3JpZ2luYWwgb3IgcGFnZVVSTE9yaWdpbmFsIHRoYXQgd291
bGQgZW5kIHVwIHN0b3JpbmcgdGhlbSB3aXRob3V0IGRlZXAgY29weWluZyBmaXJzdAotCi0gICAg
QVNTRVJUKCFpY29uVVJMT3JpZ2luYWwuaXNFbXB0eSgpKTsKLQotICAgIGlmICghaXNPcGVuKCkg
fHwgIWRvY3VtZW50Q2FuSGF2ZUljb24ocGFnZVVSTE9yaWdpbmFsKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgU3RyaW5nIGljb25VUkwsIHBhZ2VVUkw7Ci0gICAgewotICAgICAgICBMb2NrSG9s
ZGVyIGxvY2tlcihtX3VybEFuZEljb25Mb2NrKTsKLQotICAgICAgICBQYWdlVVJMUmVjb3JkKiBw
YWdlUmVjb3JkID0gbV9wYWdlVVJMVG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkxPcmlnaW5hbCk7Ci0K
LSAgICAgICAgLy8gSWYgdGhlIHVybHMgYWxyZWFkeSBtYXAgdG8gZWFjaCBvdGhlciwgYmFpbC4K
LSAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHN1cnByaXNpbmdseSBvZnRlbiwgYW5kIHNlZW1zIHRv
IGNyZWFtIGlCZW5jaCBwZXJmb3JtYW5jZQotICAgICAgICBpZiAocGFnZVJlY29yZCAmJiBwYWdl
UmVjb3JkLT5pY29uUmVjb3JkKCkgJiYgcGFnZVJlY29yZC0+aWNvblJlY29yZCgpLT5pY29uVVJM
KCkgPT0gaWNvblVSTE9yaWdpbmFsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHBh
Z2VVUkwgPSBwYWdlVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCk7Ci0gICAgICAgIGljb25VUkwg
PSBpY29uVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCk7Ci0KLSAgICAgICAgaWYgKCFwYWdlUmVj
b3JkKSB7Ci0gICAgICAgICAgICBwYWdlUmVjb3JkID0gbmV3IFBhZ2VVUkxSZWNvcmQocGFnZVVS
TCk7Ci0gICAgICAgICAgICBtX3BhZ2VVUkxUb1JlY29yZE1hcC5zZXQocGFnZVVSTCwgcGFnZVJl
Y29yZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBSZWZQdHI8SWNvblJlY29yZD4gaWNvblJlY29y
ZCA9IHBhZ2VSZWNvcmQtPmljb25SZWNvcmQoKTsKKyAgICBSRUxFQVNFX0FTU0VSVChtX2RiLmlz
T3BlbigpKTsKIAotICAgICAgICAvLyBPdGhlcndpc2UsIHNldCB0aGUgbmV3IGljb24gcmVjb3Jk
IGZvciB0aGlzIHBhZ2UKLSAgICAgICAgcGFnZVJlY29yZC0+c2V0SWNvblJlY29yZChnZXRPckNy
ZWF0ZUljb25SZWNvcmQoaWNvblVSTCkpOwotCi0gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGlj
b24gaGFzIG9ubHkgYSBzaW5nbGUgcmVmIGxlZnQsIGl0IGlzIGFib3V0IHRvIGdldCB3aXBlZCBv
dXQuCi0gICAgICAgIC8vIFJlbW92ZSBpdCBmcm9tIHRoZSBpbi1tZW1vcnkgcmVjb3JkcyBhbmQg
ZG9uJ3QgYm90aGVyIHJlYWRpbmcgaXQgaW4gZnJvbSBkaXNrIGFueW1vcmUKLSAgICAgICAgaWYg
KGljb25SZWNvcmQgJiYgaWNvblJlY29yZC0+aGFzT25lUmVmKCkpIHsKLSAgICAgICAgICAgIEFT
U0VSVCghaWNvblJlY29yZC0+cmV0YWluaW5nUGFnZVVSTHMoKS5zaXplKCkpOwotICAgICAgICAg
ICAgTE9HKEljb25EYXRhYmFzZSwgIkljb24gZm9yIGljb24gdXJsICVzIGlzIGFib3V0IHRvIGJl
IGRlc3Ryb3llZCAtIHJlbW92aW5nIG1hcHBpbmcgZm9yIGl0IiwgdXJsRm9yTG9nZ2luZyhpY29u
UmVjb3JkLT5pY29uVVJMKCkpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgICAgIG1faWNvblVS
TFRvUmVjb3JkTWFwLnJlbW92ZShpY29uUmVjb3JkLT5pY29uVVJMKCkpOwotICAgICAgICAgICAg
TG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOwotICAgICAgICAgICAgbV9p
Y29uc1BlbmRpbmdSZWFkaW5nLnJlbW92ZShpY29uUmVjb3JkLmdldCgpKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIEFuZCBtYXJrIHRoaXMgbWFwcGluZyB0byBiZSBhZGRlZCB0byB0aGUgZGF0
YWJhc2UKLSAgICAgICAgaWYgKCFtX3ByaXZhdGVCcm93c2luZ0VuYWJsZWQpIHsKLSAgICAgICAg
ICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1N5bmNMb2NrKTsKLSAgICAgICAgICAgIG1f
cGFnZVVSTHNQZW5kaW5nU3luYy5zZXQocGFnZVVSTCwgcGFnZVJlY29yZC0+c25hcHNob3QoKSk7
Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBpY29uIGlzIG9uIGl0cyBsYXN0IHJlZiwgbWFyayBp
dCBmb3IgZGVsZXRpb24KLSAgICAgICAgICAgIGlmIChpY29uUmVjb3JkICYmIGljb25SZWNvcmQt
Pmhhc09uZVJlZigpKQotICAgICAgICAgICAgICAgIG1faWNvbnNQZW5kaW5nU3luYy5zZXQoaWNv
blJlY29yZC0+aWNvblVSTCgpLCBpY29uUmVjb3JkLT5zbmFwc2hvdCh0cnVlKSk7CisgICAgaWYg
KCFtX2ljb25EYXRhU3RhdGVtZW50KSB7CisgICAgICAgIG1faWNvbkRhdGFTdGF0ZW1lbnQgPSBt
YWtlVW5pcXVlPFNRTGl0ZVN0YXRlbWVudD4obV9kYiwgIlNFTEVDVCBJY29uRGF0YS5kYXRhIEZS
T00gSWNvbkRhdGEgV0hFUkUgSWNvbkRhdGEuaWNvbklEID0gKD8pOyIpOworICAgICAgICBpZiAo
bV9pY29uRGF0YVN0YXRlbWVudC0+cHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAgICAgICAg
ICAgTE9HX0VSUk9SKCJQcmVwYXJpbmcgc3RhdGVtZW50IGljb25EYXRhIGZhaWxlZCIpOworICAg
ICAgICAgICAgbV9pY29uRGF0YVN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1
cm4geyB9OwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gU2luY2UgdGhpcyBtYXBwaW5nIGlz
IG5ldywgc2VuZCB0aGUgbm90aWZpY2F0aW9uIG91dCAtIGJ1dCBub3QgaWYgd2UncmUgb24gdGhl
IHN5bmMgdGhyZWFkIGJlY2F1c2UgdGhhdCBpbXBsaWVzIHRoaXMgbWFwcGluZwotICAgIC8vIGNv
bWVzIGZyb20gdGhlIGluaXRpYWwgaW1wb3J0IHdoaWNoIHdlIGRvbid0IHdhbnQgbm90aWZpY2F0
aW9ucyBmb3IKLSAgICBpZiAoIUlTX0lDT05fU1lOQ19USFJFQUQoKSkgewotICAgICAgICAvLyBT
dGFydCB0aGUgdGltZXIgdG8gY29tbWl0IHRoaXMgY2hhbmdlIC0gb3IgZnVydGhlciBkZWxheSB0
aGUgdGltZXIgaWYgaXQgd2FzIGFscmVhZHkgc3RhcnRlZAotICAgICAgICBzY2hlZHVsZU9yRGVm
ZXJTeW5jVGltZXIoKTsKLQotICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiRGlzcGF0Y2hpbmcg
bm90aWZpY2F0aW9uIHRoYXQgd2UgY2hhbmdlZCBhbiBpY29uIG1hcHBpbmcgZm9yIHVybCAlcyIs
IHVybEZvckxvZ2dpbmcocGFnZVVSTCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICBpZiAobV9j
bGllbnQpCi0gICAgICAgICAgICBtX2NsaWVudC0+ZGlkQ2hhbmdlSWNvbkZvclBhZ2VVUkwocGFn
ZVVSTCk7Ci0gICAgfQotfQotCi1JY29uRGF0YWJhc2U6Okljb25Mb2FkRGVjaXNpb24gSWNvbkRh
dGFiYXNlOjpzeW5jaHJvbm91c0xvYWREZWNpc2lvbkZvckljb25VUkwoY29uc3QgU3RyaW5nJiBp
Y29uVVJMKQotewotICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKLQotICAgIGlmICghaXNP
cGVuKCkgfHwgaWNvblVSTC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBJY29uTG9hZERlY2lz
aW9uOjpObzsKLQotICAgIC8vIElmIHdlIGhhdmUgYSBJY29uUmVjb3JkLCBpdCBzaG91bGQgYWxz
byBoYXZlIGl0cyB0aW1lU3RhbXAgbWFya2VkIGJlY2F1c2UgdGhlcmUgaXMgb25seSB0d28gdGlt
ZXMgd2hlbiB3ZSBjcmVhdGUgdGhlIEljb25SZWNvcmQ6Ci0gICAgLy8gMSAtIFdoZW4gd2UgcmVh
ZCB0aGUgaWNvbiB1cmxzIGZyb20gZGlzaywgZ2V0dGluZyB0aGUgdGltZVN0YW1wIGF0IHRoZSBz
YW1lIHRpbWUKLSAgICAvLyAyIC0gV2hlbiB3ZSBnZXQgYSBuZXcgaWNvbiBmcm9tIHRoZSBsb2Fk
ZXIsIGluIHdoaWNoIGNhc2UgdGhlIHRpbWVzdGFtcCBpcyBzZXQgYXQgdGhhdCB0aW1lCi0gICAg
ewotICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3VybEFuZEljb25Mb2NrKTsKLSAgICAgICAg
aWYgKEljb25SZWNvcmQqIGljb24gPSBtX2ljb25VUkxUb1JlY29yZE1hcC5nZXQoaWNvblVSTCkp
IHsKLSAgICAgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJGb3VuZCBleHBpcmF0aW9uIHRpbWUg
b24gYSBwcmVzZW50IGljb24gYmFzZWQgb24gZXhpc3RpbmcgSWNvblJlY29yZCIpOwotICAgICAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oV2FsbFRpbWU6Om5vdygpLnNlY29uZHNTaW5j
ZUVwb2NoKCkuc2Vjb25kcygpKSAtIHN0YXRpY19jYXN0PGludD4oaWNvbi0+Z2V0VGltZXN0YW1w
KCkpID4gaWNvbkV4cGlyYXRpb25UaW1lID8gSWNvbkxvYWREZWNpc2lvbjo6WWVzIDogSWNvbkxv
YWREZWNpc2lvbjo6Tm87Ci0gICAgICAgIH0KKyAgICBpZiAobV9pY29uRGF0YVN0YXRlbWVudC0+
YmluZEludDY0KDEsIGljb25JRCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigi
SWNvbkRhdGFiYXNlOjppY29uRGF0YSBmYWlsZWQ6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7
CisgICAgICAgIHJldHVybiB7IH07CiAgICAgfQogCi0gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBh
IHJlY29yZCBmb3IgaXQsIGJ1dCB3ZSAqaGF2ZSogaW1wb3J0ZWQgYWxsIGljb25VUkxzIGZyb20g
ZGlzaywgdGhlbiB3ZSBzaG91bGQgbG9hZCBpdCBub3cKLSAgICBMb2NrSG9sZGVyIHJlYWRpbmdM
b2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOwotICAgIGlmIChtX2ljb25VUkxJbXBvcnRDb21w
bGV0ZSkKLSAgICAgICAgcmV0dXJuIEljb25Mb2FkRGVjaXNpb246OlllczsKLQotICAgIC8vIE90
aGVyd2lzZSAtIHNpbmNlIHdlIHJlZnVzZSB0byBwZXJmb3JtIEkvTyBvbiB0aGUgbWFpbiB0aHJl
YWQgdG8gZmluZCBvdXQgZm9yIHN1cmUgLSB3ZSByZXR1cm4gdGhlIGFuc3dlciB0aGF0IHNheXMK
LSAgICAvLyAiWW91IG1pZ2h0IGJlIGFza2VkIHRvIGxvYWQgdGhpcyBsYXRlciwgc28gZmxhZyB0
aGF0IgotICAgIHJldHVybiBJY29uTG9hZERlY2lzaW9uOjpVbmtub3duOwotfQotCi1ib29sIElj
b25EYXRhYmFzZTo6c3luY2hyb25vdXNJY29uRGF0YUtub3duRm9ySWNvblVSTChjb25zdCBTdHJp
bmcmIGljb25VUkwpCi17Ci0gICAgQVNTRVJUX05PVF9TWU5DX1RIUkVBRCgpOwotCi0gICAgTG9j
a0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7Ci0gICAgaWYgKEljb25SZWNvcmQqIGlj
b24gPSBtX2ljb25VUkxUb1JlY29yZE1hcC5nZXQoaWNvblVSTCkpCi0gICAgICAgIHJldHVybiBp
Y29uLT5pbWFnZURhdGFTdGF0dXMoKSAhPSBJY29uUmVjb3JkOjpJbWFnZURhdGFTdGF0dXM6OlVu
a25vd247CisgICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKKyAgICBpZiAobV9pY29uRGF0YVN0YXRl
bWVudC0+c3RlcCgpID09IFNRTElURV9ST1cpCisgICAgICAgIG1faWNvbkRhdGFTdGF0ZW1lbnQt
PmdldENvbHVtbkJsb2JBc1ZlY3RvcigwLCByZXN1bHQpOwogCi0gICAgcmV0dXJuIGZhbHNlOwor
ICAgIG1faWNvbkRhdGFTdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0K
IAotdm9pZCBJY29uRGF0YWJhc2U6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQorT3B0aW9uYWw8
aW50NjRfdD4gSWNvbkRhdGFiYXNlOjphZGRJY29uKGNvbnN0IFN0cmluZyYgaWNvblVSTCwgY29u
c3QgVmVjdG9yPGNoYXI+JiBpY29uRGF0YSkKIHsKLSAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFE
KCk7CisgICAgUkVMRUFTRV9BU1NFUlQobV9kYi5pc09wZW4oKSk7CisgICAgUkVMRUFTRV9BU1NF
UlQobV9hbGxvd0RhdGFiYXNlV3JpdGUgPT0gQWxsb3dEYXRhYmFzZVdyaXRlOjpZZXMpOwogCi0g
ICAgaWYgKCFlbmFibGVkICYmIGlzT3BlbigpKQotICAgICAgICBjbG9zZSgpOwotICAgIG1faXNF
bmFibGVkID0gZW5hYmxlZDsKLX0KKyAgICBpZiAoIW1fYWRkSWNvblN0YXRlbWVudCkgeworICAg
ICAgICBtX2FkZEljb25TdGF0ZW1lbnQgPSBtYWtlVW5pcXVlPFNRTGl0ZVN0YXRlbWVudD4obV9k
YiwgIklOU0VSVCBJTlRPIEljb25JbmZvICh1cmwsIHN0YW1wKSBWQUxVRVMgKD8sIDApOyIpOwor
ICAgICAgICBpZiAobV9hZGRJY29uU3RhdGVtZW50LT5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7
CisgICAgICAgICAgICBMT0dfRVJST1IoIlByZXBhcmluZyBzdGF0ZW1lbnQgYWRkSWNvbiBmYWls
ZWQiKTsKKyAgICAgICAgICAgIG1fYWRkSWNvblN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgICAg
ICAgICByZXR1cm4gV1RGOjpudWxsb3B0OworICAgICAgICB9CisgICAgfQorICAgIGlmICghbV9h
ZGRJY29uRGF0YVN0YXRlbWVudCkgeworICAgICAgICBtX2FkZEljb25EYXRhU3RhdGVtZW50ID0g
bWFrZVVuaXF1ZTxTUUxpdGVTdGF0ZW1lbnQ+KG1fZGIsICJJTlNFUlQgSU5UTyBJY29uRGF0YSAo
aWNvbklELCBkYXRhKSBWQUxVRVMgKD8sID8pOyIpOworICAgICAgICBpZiAobV9hZGRJY29uRGF0
YVN0YXRlbWVudC0+cHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgTE9HX0VS
Uk9SKCJQcmVwYXJpbmcgc3RhdGVtZW50IGFkZEljb25EYXRhIGZhaWxlZCIpOworICAgICAgICAg
ICAgbV9hZGRJY29uRGF0YVN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm4g
V1RGOjpudWxsb3B0OworICAgICAgICB9CisgICAgfQogCi1ib29sIEljb25EYXRhYmFzZTo6aXNF
bmFibGVkKCkgY29uc3QKLXsKLSAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7CisgICAgaWYg
KG1fYWRkSWNvblN0YXRlbWVudC0+YmluZFRleHQoMSwgaWNvblVSTCkgIT0gU1FMSVRFX09LKSB7
CisgICAgICAgIExPR19FUlJPUigiSWNvbkRhdGFiYXNlOjphZGRJY29uIGZhaWxlZDogJXMiLCBt
X2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKKyAgICB9
CiAKLSAgICByZXR1cm4gbV9pc0VuYWJsZWQ7Ci19CisgICAgbV9hZGRJY29uU3RhdGVtZW50LT5z
dGVwKCk7CisgICAgbV9hZGRJY29uU3RhdGVtZW50LT5yZXNldCgpOwogCi12b2lkIEljb25EYXRh
YmFzZTo6c2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChib29sIGZsYWcpCi17Ci0gICAgbV9wcml2
YXRlQnJvd3NpbmdFbmFibGVkID0gZmxhZzsKLX0KKyAgICBhdXRvIGljb25JRCA9IG1fZGIubGFz
dEluc2VydFJvd0lEKCk7CisgICAgaWYgKG1fYWRkSWNvbkRhdGFTdGF0ZW1lbnQtPmJpbmRJbnQ2
NCgxLCBpY29uSUQpICE9IFNRTElURV9PSyB8fCBtX2FkZEljb25EYXRhU3RhdGVtZW50LT5iaW5k
QmxvYigyLCBpY29uRGF0YS5kYXRhKCksIGljb25EYXRhLnNpemUoKSkgIT0gU1FMSVRFX09LKSB7
CisgICAgICAgIExPR19FUlJPUigiSWNvbkRhdGFiYXNlOjphZGRJY29uIGZhaWxlZDogJXMiLCBt
X2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKKyAgICB9
CiAKLWJvb2wgSWNvbkRhdGFiYXNlOjppc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSBjb25zdAot
ewotICAgIHJldHVybiBtX3ByaXZhdGVCcm93c2luZ0VuYWJsZWQ7Ci19CisgICAgbV9hZGRJY29u
RGF0YVN0YXRlbWVudC0+c3RlcCgpOworICAgIG1fYWRkSWNvbkRhdGFTdGF0ZW1lbnQtPnJlc2V0
KCk7CiAKLXZvaWQgSWNvbkRhdGFiYXNlOjpkZWxheURhdGFiYXNlQ2xlYW51cCgpCi17Ci0gICAg
KytkYXRhYmFzZUNsZWFudXBDb3VudGVyOwotICAgIGlmIChkYXRhYmFzZUNsZWFudXBDb3VudGVy
ID09IDEpCi0gICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJEYXRhYmFzZSBjbGVhbnVwIGlzIG5v
dyBESVNBQkxFRCIpOworICAgIHJldHVybiBpY29uSUQ7CiB9CiAKLXZvaWQgSWNvbkRhdGFiYXNl
OjphbGxvd0RhdGFiYXNlQ2xlYW51cCgpCit2b2lkIEljb25EYXRhYmFzZTo6dXBkYXRlSWNvblRp
bWVzdGFtcChpbnQ2NF90IGljb25JRCwgaW50NjRfdCB0aW1lc3RhbXApCiB7Ci0gICAgaWYgKC0t
ZGF0YWJhc2VDbGVhbnVwQ291bnRlciA8IDApCi0gICAgICAgIGRhdGFiYXNlQ2xlYW51cENvdW50
ZXIgPSAwOwotICAgIGlmICghZGF0YWJhc2VDbGVhbnVwQ291bnRlcikKLSAgICAgICAgTE9HKElj
b25EYXRhYmFzZSwgIkRhdGFiYXNlIGNsZWFudXAgaXMgbm93IEVOQUJMRUQiKTsKLX0KKyAgICBS
RUxFQVNFX0FTU0VSVChtX2RiLmlzT3BlbigpKTsKKyAgICBSRUxFQVNFX0FTU0VSVChtX2FsbG93
RGF0YWJhc2VXcml0ZSA9PSBBbGxvd0RhdGFiYXNlV3JpdGU6Olllcyk7CiAKLXZvaWQgSWNvbkRh
dGFiYXNlOjpjaGVja0ludGVncml0eUJlZm9yZU9wZW5pbmcoKQotewotICAgIGNoZWNrSW50ZWdy
aXR5T25PcGVuID0gdHJ1ZTsKLX0KKyAgICBpZiAoIW1fdXBkYXRlSWNvblRpbWVzdGFtcFN0YXRl
bWVudCkgeworICAgICAgICBtX3VwZGF0ZUljb25UaW1lc3RhbXBTdGF0ZW1lbnQgPSBtYWtlVW5p
cXVlPFNRTGl0ZVN0YXRlbWVudD4obV9kYiwgIlVQREFURSBJY29uSW5mbyBTRVQgc3RhbXAgPSA/
IFdIRVJFIGljb25JRCA9ID87Iik7CisgICAgICAgIGlmIChtX3VwZGF0ZUljb25UaW1lc3RhbXBT
dGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJP
UigiUHJlcGFyaW5nIHN0YXRlbWVudCB1cGRhdGVJY29uVGltZXN0YW1wIGZhaWxlZCIpOworICAg
ICAgICAgICAgbV91cGRhdGVJY29uVGltZXN0YW1wU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KIAotSWNvbkRhdGFiYXNlOjpJY29uRGF0
YWJhc2UoKQotICAgIDogbV9zeW5jVGltZXIoUnVuTG9vcDo6bWFpbigpLCB0aGlzLCAmSWNvbkRh
dGFiYXNlOjpzeW5jVGltZXJGaXJlZCkKLSAgICAsIG1fY2xpZW50KGRlZmF1bHRDbGllbnQoKSkK
LXsKLSAgICBMT0coSWNvbkRhdGFiYXNlLCAiQ3JlYXRpbmcgSWNvbkRhdGFiYXNlICVwIiwgdGhp
cyk7Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLX0KKyAgICBpZiAobV91cGRhdGVJY29u
VGltZXN0YW1wU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgdGltZXN0YW1wKSAhPSBTUUxJVEVfT0sg
fHwgbV91cGRhdGVJY29uVGltZXN0YW1wU3RhdGVtZW50LT5iaW5kSW50NjQoMiwgaWNvbklEKSAh
PSBTUUxJVEVfT0spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJJY29uRGF0YWJhc2U6OnVwZGF0ZUlj
b25UaW1lc3RhbXAgZmFpbGVkOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICBy
ZXR1cm47CisgICAgfQogCi1JY29uRGF0YWJhc2U6On5JY29uRGF0YWJhc2UoKQotewotICAgIEFT
U0VSVCghaXNPcGVuKCkpOworICAgIG1fdXBkYXRlSWNvblRpbWVzdGFtcFN0YXRlbWVudC0+c3Rl
cCgpOworICAgIG1fdXBkYXRlSWNvblRpbWVzdGFtcFN0YXRlbWVudC0+cmVzZXQoKTsKIH0KIAot
dm9pZCBJY29uRGF0YWJhc2U6Ondha2VTeW5jVGhyZWFkKCkKK3ZvaWQgSWNvbkRhdGFiYXNlOjpk
ZWxldGVJY29uKGludDY0X3QgaWNvbklEKQogewotICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fc3lu
Y0xvY2spOwotCi0gICAgbV9zeW5jVGhyZWFkSGFzV29ya1RvRG8gPSB0cnVlOwotICAgIG1fc3lu
Y0NvbmRpdGlvbi5ub3RpZnlPbmUoKTsKLX0KKyAgICBSRUxFQVNFX0FTU0VSVChtX2RiLmlzT3Bl
bigpKTsKKyAgICBSRUxFQVNFX0FTU0VSVChtX2FsbG93RGF0YWJhc2VXcml0ZSA9PSBBbGxvd0Rh
dGFiYXNlV3JpdGU6Olllcyk7CiAKLXZvaWQgSWNvbkRhdGFiYXNlOjpzY2hlZHVsZU9yRGVmZXJT
eW5jVGltZXIoKQotewotICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKKyAgICBpZiAoIW1f
ZGVsZXRlUGFnZVVSTHNGb3JJY29uU3RhdGVtZW50KSB7CisgICAgICAgIG1fZGVsZXRlUGFnZVVS
THNGb3JJY29uU3RhdGVtZW50ID0gbWFrZVVuaXF1ZTxTUUxpdGVTdGF0ZW1lbnQ+KG1fZGIsICJE
RUxFVEUgRlJPTSBQYWdlVVJMIFdIRVJFIFBhZ2VVUkwuaWNvbklEID0gKD8pOyIpOworICAgICAg
ICBpZiAobV9kZWxldGVQYWdlVVJMc0Zvckljb25TdGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBTUUxJ
VEVfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiUHJlcGFyaW5nIHN0YXRlbWVudCBkZWxl
dGVQYWdlVVJMc0Zvckljb24gZmFpbGVkIik7CisgICAgICAgICAgICBtX2RlbGV0ZVBhZ2VVUkxz
Rm9ySWNvblN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICB9CisgICAgaWYgKCFtX2RlbGV0ZUljb25EYXRhU3RhdGVtZW50KSB7CisgICAgICAg
IG1fZGVsZXRlSWNvbkRhdGFTdGF0ZW1lbnQgPSBtYWtlVW5pcXVlPFNRTGl0ZVN0YXRlbWVudD4o
bV9kYiwgIkRFTEVURSBGUk9NIEljb25EYXRhIFdIRVJFIEljb25EYXRhLmljb25JRCA9ICg/KTsi
KTsKKyAgICAgICAgaWYgKG1fZGVsZXRlSWNvbkRhdGFTdGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBT
UUxJVEVfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiUHJlcGFyaW5nIHN0YXRlbWVudCBk
ZWxldGVJY29uIGZhaWxlZCIpOworICAgICAgICAgICAgbV9kZWxldGVJY29uRGF0YVN0YXRlbWVu
dCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAg
aWYgKCFtX2RlbGV0ZUljb25TdGF0ZW1lbnQpIHsKKyAgICAgICAgbV9kZWxldGVJY29uU3RhdGVt
ZW50ID0gbWFrZVVuaXF1ZTxTUUxpdGVTdGF0ZW1lbnQ+KG1fZGIsICJERUxFVEUgRlJPTSBJY29u
SW5mbyBXSEVSRSBJY29uSW5mby5pY29uSUQgPSAoPyk7Iik7CisgICAgICAgIGlmIChtX2RlbGV0
ZUljb25TdGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIExP
R19FUlJPUigiUHJlcGFyaW5nIHN0YXRlbWVudCBkZWxldGVJY29uIGZhaWxlZCIpOworICAgICAg
ICAgICAgbV9kZWxldGVJY29uU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgIH0KIAotICAgIGlmIChtX3NjaGVkdWxlT3JEZWZlclN5bmNUaW1l
clJlcXVlc3RlZCkKKyAgICBpZiAobV9kZWxldGVQYWdlVVJMc0Zvckljb25TdGF0ZW1lbnQtPmJp
bmRJbnQ2NCgxLCBpY29uSUQpICE9IFNRTElURV9PSworICAgICAgICB8fCBtX2RlbGV0ZUljb25E
YXRhU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKSAhPSBTUUxJVEVfT0sKKyAgICAgICAg
fHwgbV9kZWxldGVJY29uU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKSAhPSBTUUxJVEVf
T0spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJJY29uRGF0YWJhc2U6OmRlbGV0ZUljb24gZmFpbGVk
OiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOwogICAgICAgICByZXR1cm47CisgICAgfQogCi0g
ICAgbV9zY2hlZHVsZU9yRGVmZXJTeW5jVGltZXJSZXF1ZXN0ZWQgPSB0cnVlOwotICAgIGNhbGxP
bk1haW5UaHJlYWQoW3RoaXNdIHsKLSAgICAgICAgbV9zeW5jVGltZXIuc3RhcnRPbmVTaG90KHVw
ZGF0ZVRpbWVyRGVsYXkpOwotICAgICAgICBtX3NjaGVkdWxlT3JEZWZlclN5bmNUaW1lclJlcXVl
c3RlZCA9IGZhbHNlOworICAgIG1fZGVsZXRlUGFnZVVSTHNGb3JJY29uU3RhdGVtZW50LT5zdGVw
KCk7CisgICAgbV9kZWxldGVJY29uRGF0YVN0YXRlbWVudC0+c3RlcCgpOworICAgIG1fZGVsZXRl
SWNvblN0YXRlbWVudC0+c3RlcCgpOworCisgICAgbV9kZWxldGVQYWdlVVJMc0Zvckljb25TdGF0
ZW1lbnQtPnJlc2V0KCk7CisgICAgbV9kZWxldGVJY29uRGF0YVN0YXRlbWVudC0+cmVzZXQoKTsK
KyAgICBtX2RlbGV0ZUljb25TdGF0ZW1lbnQtPnJlc2V0KCk7Cit9CisKK3ZvaWQgSWNvbkRhdGFi
YXNlOjpjaGVja0ljb25VUkxBbmRTZXRQYWdlVVJMSWZOZWVkZWQoY29uc3QgU3RyaW5nJiBpY29u
VVJMLCBjb25zdCBTdHJpbmcmIHBhZ2VVUkwsIEFsbG93RGF0YWJhc2VXcml0ZSBhbGxvd0RhdGFi
YXNlV3JpdGUsIENvbXBsZXRpb25IYW5kbGVyPHZvaWQoYm9vbCwgYm9vbCk+JiYgY29tcGxldGlv
bkhhbmRsZXIpCit7CisgICAgbV93b3JrUXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRU
aGlzID0gbWFrZVJlZigqdGhpcyksIGljb25VUkwgPSBpY29uVVJMLmlzb2xhdGVkQ29weSgpLCBw
YWdlVVJMID0gcGFnZVVSTC5pc29sYXRlZENvcHkoKSwgYWxsb3dEYXRhYmFzZVdyaXRlLCBjb21w
bGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewor
ICAgICAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxz
ZTsKKyAgICAgICAgaWYgKG1fZGIuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIGJvb2wgY2FuV3Jp
dGVUb0RhdGFiYXNlID0gbV9hbGxvd0RhdGFiYXNlV3JpdGUgPT0gQWxsb3dEYXRhYmFzZVdyaXRl
OjpZZXMgJiYgYWxsb3dEYXRhYmFzZVdyaXRlID09IEFsbG93RGF0YWJhc2VXcml0ZTo6WWVzOwor
ICAgICAgICAgICAgYm9vbCBleHBpcmVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobV9wYWdl
VVJMVG9JY29uVVJMTWFwLmdldChwYWdlVVJMKSA9PSBpY29uVVJMKQorICAgICAgICAgICAgICAg
IHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICBlbHNlIGlmIChhdXRvIGljb25JRCA9IGljb25J
REZvckljb25VUkwoaWNvblVSTCwgZXhwaXJlZCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhw
aXJlZCAmJiBjYW5Xcml0ZVRvRGF0YWJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU1FMaXRl
VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24obV9kYik7CisgICAgICAgICAgICAgICAgICAgIHRyYW5z
YWN0aW9uLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUljb24oaWNvbklELnZh
bHVlKCkpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICAg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwor
ICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbldyaXRlVG9EYXRhYmFzZSB8fCBzZXRJY29uSURG
b3JQYWdlVVJMKGljb25JRC52YWx1ZSgpLCBwYWdlVVJMKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgbV9wYWdlVVJMVG9JY29uVVJMTWFwLnNldChwYWdlVVJMLCBpY29uVVJMKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghY2FuV3JpdGVUb0Rh
dGFiYXNlICYmIG1fbG9hZGVkSWNvbnMuY29udGFpbnMoaWNvblVSTCkpIHsKKyAgICAgICAgICAg
ICAgICAvLyBGb3VuZCBpbiBtZW1vcnkgY2FjaGUuCisgICAgICAgICAgICAgICAgcmVzdWx0ID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICBtX3BhZ2VVUkxUb0ljb25VUkxNYXAuc2V0KHBhZ2VVUkws
IGljb25VUkwpOworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICAgIHN0YXJ0UHJ1bmVUaW1lcigpOworICAgICAgICBSdW5Mb29w
OjptYWluKCkuZGlzcGF0Y2goW3Jlc3VsdCwgY2hhbmdlZCwgY29tcGxldGlvbkhhbmRsZXIgPSBX
VEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgICAgIGNvbXBs
ZXRpb25IYW5kbGVyKHJlc3VsdCwgY2hhbmdlZCk7CisgICAgICAgIH0pOwogICAgIH0pOwogfQog
Ci12b2lkIEljb25EYXRhYmFzZTo6c3luY1RpbWVyRmlyZWQoKQordm9pZCBJY29uRGF0YWJhc2U6
OmxvYWRJY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VVUkwsIEFsbG93RGF0YWJhc2VX
cml0ZSBhbGxvd0RhdGFiYXNlV3JpdGUsIENvbXBsZXRpb25IYW5kbGVyPHZvaWQoTmF0aXZlSW1h
Z2VQdHImJik+JiYgY29tcGxldGlvbkhhbmRsZXIpCiB7Ci0gICAgQVNTRVJUX05PVF9TWU5DX1RI
UkVBRCgpOwotICAgIHdha2VTeW5jVGhyZWFkKCk7Ci19CisgICAgbV93b3JrUXVldWUtPmRpc3Bh
dGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHBhZ2VVUkwgPSBwYWdl
VVJMLmlzb2xhdGVkQ29weSgpLCBhbGxvd0RhdGFiYXNlV3JpdGUsIHRpbWVzdGFtcCA9IFdhbGxU
aW1lOjpub3coKS5zZWNvbmRzU2luY2VFcG9jaCgpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1v
dmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICBPcHRpb25hbDxpbnQ2
NF90PiBpY29uSUQ7CisgICAgICAgIFZlY3RvcjxjaGFyPiBpY29uRGF0YTsKKyAgICAgICAgYXV0
byBpY29uVVJMID0gbV9wYWdlVVJMVG9JY29uVVJMTWFwLmdldChwYWdlVVJMKTsKKyAgICAgICAg
aWYgKG1fZGIuaXNPcGVuKCkgJiYgIWljb25VUkwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBi
b29sIGV4cGlyZWQ7CisgICAgICAgICAgICBpY29uSUQgPSBpY29uSURGb3JJY29uVVJMKGljb25V
UkwsIGV4cGlyZWQpOworICAgICAgICAgICAgaWYgKGljb25JRCAmJiAhbV9sb2FkZWRJY29ucy5j
b250YWlucyhpY29uVVJMKSkgeworICAgICAgICAgICAgICAgIGljb25EYXRhID0gdGhpcy0+aWNv
bkRhdGEoaWNvbklELnZhbHVlKCkpOworICAgICAgICAgICAgICAgIG1fbG9hZGVkSWNvbnMuc2V0
KGljb25VUkwsIHN0ZDo6bWFrZV9wYWlyPE5hdGl2ZUltYWdlUHRyLCBNb25vdG9uaWNUaW1lPihu
dWxscHRyLCB7IH0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgY2FuV3JpdGVU
b0RhdGFiYXNlID0gbV9hbGxvd0RhdGFiYXNlV3JpdGUgPT0gQWxsb3dEYXRhYmFzZVdyaXRlOjpZ
ZXMgJiYgYWxsb3dEYXRhYmFzZVdyaXRlID09IEFsbG93RGF0YWJhc2VXcml0ZTo6WWVzOworICAg
ICAgICAgICAgaWYgKGljb25JRCAmJiBjYW5Xcml0ZVRvRGF0YWJhc2UpCisgICAgICAgICAgICAg
ICAgdXBkYXRlSWNvblRpbWVzdGFtcChpY29uSUQudmFsdWUoKSwgdGltZXN0YW1wLnNlY29uZHNB
czxpbnQ2NF90PigpKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydFBydW5lVGltZXIoKTsKKyAg
ICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFr
ZVJlZigqdGhpcyksIGljb25VUkwgPSBXVEZNb3ZlKGljb25VUkwpLCBpY29uRGF0YSA9IFdURk1v
dmUoaWNvbkRhdGEpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRs
ZXIpXSgpIG11dGFibGUgeworICAgICAgICAgICAgaWYgKGljb25VUkwuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIobnVsbHB0cik7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0vLyAqKioqKioqKioqKioqKioqKioKLS8vICoq
KiBBbnkgVGhyZWFkICoqKgotLy8gKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICBhdXRv
IGl0ID0gbV9sb2FkZWRJY29ucy5maW5kKGljb25VUkwpOworICAgICAgICAgICAgaWYgKGl0ICE9
IG1fbG9hZGVkSWNvbnMuZW5kKCkgJiYgaXQtPnZhbHVlLmZpcnN0KSB7CisgICAgICAgICAgICAg
ICAgYXV0byBpY29uID0gaXQtPnZhbHVlLmZpcnN0OworICAgICAgICAgICAgICAgIGl0LT52YWx1
ZS5zZWNvbmQgPSBNb25vdG9uaWNUaW1lOjpub3coKTsKKyAgICAgICAgICAgICAgICBzdGFydENs
ZWFyTG9hZGVkSWNvbnNUaW1lcigpOworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVy
KFdURk1vdmUoaWNvbikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0K
IAotYm9vbCBJY29uRGF0YWJhc2U6OmlzT3BlbigpIGNvbnN0Ci17Ci0gICAgTG9ja0hvbGRlciBs
b2NrZXIobV9zeW5jTG9jayk7Ci0gICAgcmV0dXJuIG1fc3luY1RocmVhZFJ1bm5pbmcgfHwgbV9z
eW5jREIuaXNPcGVuKCk7Ci19CisgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IG1fbG9hZGVk
SWNvbnMuc2V0KGljb25VUkwsIHN0ZDo6bWFrZV9wYWlyPE5hdGl2ZUltYWdlUHRyLCBNb25vdG9u
aWNUaW1lPihudWxscHRyLCBNb25vdG9uaWNUaW1lOjpub3coKSkpOworICAgICAgICAgICAgaWYg
KCFpY29uRGF0YS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGltYWdlID0gQml0
bWFwSW1hZ2U6OmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+c2V0RGF0YShT
aGFyZWRCdWZmZXI6OmNyZWF0ZShXVEZNb3ZlKGljb25EYXRhKSksIHRydWUpIDwgRW5jb2RlZERh
dGFTdGF0dXM6OlNpemVBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGlv
bkhhbmRsZXIobnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkUmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS5maXJz
dCA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgICAgICAgICAgfQog
Ci1TdHJpbmcgSWNvbkRhdGFiYXNlOjpkYXRhYmFzZVBhdGgoKSBjb25zdAotewotICAgIExvY2tI
b2xkZXIgbG9ja2VyKG1fc3luY0xvY2spOwotICAgIHJldHVybiBtX2NvbXBsZXRlRGF0YWJhc2VQ
YXRoLmlzb2xhdGVkQ29weSgpOworICAgICAgICAgICAgYXV0byBpY29uID0gYWRkUmVzdWx0Lml0
ZXJhdG9yLT52YWx1ZS5maXJzdDsKKyAgICAgICAgICAgIHN0YXJ0Q2xlYXJMb2FkZWRJY29uc1Rp
bWVyKCk7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihXVEZNb3ZlKGljb24pKTsKKyAg
ICAgICAgfSk7CisgICAgfSk7CiB9CiAKLVN0cmluZyBJY29uRGF0YWJhc2U6OmRlZmF1bHREYXRh
YmFzZUZpbGVuYW1lKCkKK1N0cmluZyBJY29uRGF0YWJhc2U6Omljb25VUkxGb3JQYWdlVVJMKGNv
bnN0IFN0cmluZyYgcGFnZVVSTCkKIHsKLSAgICBzdGF0aWMgTmV2ZXJEZXN0cm95ZWQ8U3RyaW5n
PiBkZWZhdWx0RGF0YWJhc2VGaWxlbmFtZShNQUtFX1NUQVRJQ19TVFJJTkdfSU1QTCgiV2VicGFn
ZUljb25zLmRiIikpOwotICAgIHJldHVybiBkZWZhdWx0RGF0YWJhc2VGaWxlbmFtZS5nZXQoKS5p
c29sYXRlZENvcHkoKTsKKyAgICByZXR1cm4gbV9wYWdlVVJMVG9JY29uVVJMTWFwLmdldChwYWdl
VVJMKTsKIH0KIAotLy8gVW5saWtlIGdldE9yQ3JlYXRlUGFnZVVSTFJlY29yZCgpLCBnZXRPckNy
ZWF0ZUljb25SZWNvcmQoKSBkb2VzIG5vdCBtYXJrIHRoZSBpY29uIGFzICJpbnRlcmVzdGVkIGlu
IGltcG9ydCIKLVJlZjxJY29uRGF0YWJhc2U6Okljb25SZWNvcmQ+IEljb25EYXRhYmFzZTo6Z2V0
T3JDcmVhdGVJY29uUmVjb3JkKGNvbnN0IFN0cmluZyYgaWNvblVSTCkKK3ZvaWQgSWNvbkRhdGFi
YXNlOjpzZXRJY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIGljb25VUkwsIGNvbnN0IHVuc2ln
bmVkIGNoYXIqIGljb25EYXRhLCBzaXplX3QgaWNvbkRhdGFTaXplLCBjb25zdCBTdHJpbmcmIHBh
Z2VVUkwsIEFsbG93RGF0YWJhc2VXcml0ZSBhbGxvd0RhdGFiYXNlV3JpdGUsIENvbXBsZXRpb25I
YW5kbGVyPHZvaWQoYm9vbCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCiB7Ci0gICAgLy8gQ2xpZW50
cyBvZiBnZXRPckNyZWF0ZUljb25SZWNvcmQoKSBhcmUgcmVxdWlyZWQgdG8gYWNxdWlyZSB0aGUg
bV91cmxBbmRJY29uTG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZAotICAgIEFTU0VSVCgh
bV91cmxBbmRJY29uTG9jay50cnlMb2NrKCkpOworICAgIC8vIElmIGRhdGFiYXNlIHdyaXRlIGlz
IG5vdCBhbGxvd2VkIGxvYWQgdGhlIGljb24gdG8gY2FjaGUgaXQgaW4gbWVtb3J5IG9ubHkuCisg
ICAgaWYgKG1fYWxsb3dEYXRhYmFzZVdyaXRlID09IEFsbG93RGF0YWJhc2VXcml0ZTo6Tm8gfHwg
YWxsb3dEYXRhYmFzZVdyaXRlID09IEFsbG93RGF0YWJhc2VXcml0ZTo6Tm8pIHsKKyAgICAgICAg
Ym9vbCByZXN1bHQgPSB0cnVlOworICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IG1fbG9hZGVkSWNv
bnMuc2V0KGljb25VUkwsIHN0ZDo6bWFrZV9wYWlyPE5hdGl2ZUltYWdlUHRyLCBNb25vdG9uaWNU
aW1lPihudWxscHRyLCB7IH0pKTsKKyAgICAgICAgaWYgKGljb25EYXRhU2l6ZSkgeworICAgICAg
ICAgICAgYXV0byBpbWFnZSA9IEJpdG1hcEltYWdlOjpjcmVhdGUoKTsKKyAgICAgICAgICAgIGlm
IChpbWFnZS0+c2V0RGF0YShTaGFyZWRCdWZmZXI6OmNyZWF0ZShpY29uRGF0YSwgaWNvbkRhdGFT
aXplKSwgdHJ1ZSkgPCBFbmNvZGVkRGF0YVN0YXR1czo6U2l6ZUF2YWlsYWJsZSkKKyAgICAgICAg
ICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICBhZGRSZXN1bHQuaXRlcmF0b3ItPnZhbHVlLmZpcnN0ID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9y
Q3VycmVudEZyYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRDbGVhckxvYWRlZEljb25z
VGltZXIoKTsKKyAgICAgICAgbV93b3JrUXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRU
aGlzID0gbWFrZVJlZigqdGhpcyksIHJlc3VsdCwgaWNvblVSTCA9IGljb25VUkwuaXNvbGF0ZWRD
b3B5KCksIHBhZ2VVUkwgPSBwYWdlVVJMLmlzb2xhdGVkQ29weSgpLCBjb21wbGV0aW9uSGFuZGxl
ciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICAgICAg
bV9wYWdlVVJMVG9JY29uVVJMTWFwLnNldChwYWdlVVJMLCBpY29uVVJMKTsKKyAgICAgICAgICAg
IFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbcmVzdWx0LCBjb21wbGV0aW9uSGFuZGxlciA9IFdU
Rk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICAgICAgICAgIGNv
bXBsZXRpb25IYW5kbGVyKHJlc3VsdCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICBpZiAoYXV0byogaWNvbiA9IG1faWNvblVSTFRv
UmVjb3JkTWFwLmdldChpY29uVVJMKSkKLSAgICAgICAgcmV0dXJuICppY29uOworICAgIFZlY3Rv
cjxjaGFyPiBkYXRhOworICAgIGRhdGEucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShpY29uRGF0YVNp
emUpOworICAgIGRhdGEuYXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGljb25E
YXRhKSwgaWNvbkRhdGFTaXplKTsKKyAgICBtX3dvcmtRdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHBy
b3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgaWNvblVSTCA9IGljb25VUkwuaXNvbGF0ZWRD
b3B5KCksIGljb25EYXRhID0gV1RGTW92ZShkYXRhKSwgcGFnZVVSTCA9IHBhZ2VVUkwuaXNvbGF0
ZWRDb3B5KCksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcild
KCkgbXV0YWJsZSB7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIGlmICht
X2RiLmlzT3BlbigpKSB7CisgICAgICAgICAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlv
bihtX2RiKTsKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLmJlZ2luKCk7CisKKyAgICAgICAgICAg
IGJvb2wgZXhwaXJlZCA9IGZhbHNlOworICAgICAgICAgICAgYXV0byBpY29uSUQgPSBpY29uSURG
b3JJY29uVVJMKGljb25VUkwsIGV4cGlyZWQpOworICAgICAgICAgICAgaWYgKCFpY29uSUQpCisg
ICAgICAgICAgICAgICAgaWNvbklEID0gYWRkSWNvbihpY29uVVJMLCBpY29uRGF0YSk7CisKKyAg
ICAgICAgICAgIGlmIChpY29uSUQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwor
ICAgICAgICAgICAgICAgIGlmIChzZXRJY29uSURGb3JQYWdlVVJMKGljb25JRC52YWx1ZSgpLCBw
YWdlVVJMKSkKKyAgICAgICAgICAgICAgICAgICAgbV9wYWdlVVJMVG9JY29uVVJMTWFwLnNldChw
YWdlVVJMLCBpY29uVVJMKTsKKyAgICAgICAgICAgIH0KIAotICAgIGF1dG8gbmV3SWNvbiA9IElj
b25SZWNvcmQ6OmNyZWF0ZShpY29uVVJMKTsKLSAgICBtX2ljb25VUkxUb1JlY29yZE1hcC5zZXQo
aWNvblVSTCwgbmV3SWNvbi5wdHIoKSk7Ci0gICAgcmV0dXJuIG5ld0ljb247CisgICAgICAgICAg
ICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydFBydW5lVGlt
ZXIoKTsKKyAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFtyZXN1bHQsIGNvbXBsZXRp
b25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAg
ICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihyZXN1bHQpOworICAgICAgICB9KTsKKyAgICB9KTsK
IH0KIAotLy8gVGhpcyBtZXRob2QgcmV0cmlldmVzIHRoZSBleGlzdGluZyBQYWdlVVJMUmVjb3Jk
LCBvciBjcmVhdGVzIGEgbmV3IG9uZSBhbmQgbWFya3MgaXQgYXMgImludGVyZXN0ZWQgaW4gdGhl
IGltcG9ydCIgZm9yIGxhdGVyIG5vdGlmaWNhdGlvbgotSWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVj
b3JkKiBJY29uRGF0YWJhc2U6OmdldE9yQ3JlYXRlUGFnZVVSTFJlY29yZChjb25zdCBTdHJpbmcm
IHBhZ2VVUkwpCit2b2lkIEljb25EYXRhYmFzZTo6Y2xlYXIoQ29tcGxldGlvbkhhbmRsZXI8dm9p
ZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQogewotICAgIC8vIENsaWVudHMgb2YgZ2V0T3JDcmVh
dGVQYWdlVVJMUmVjb3JkKCkgYXJlIHJlcXVpcmVkIHRvIGFjcXVpcmUgdGhlIG1fdXJsQW5kSWNv
bkxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QKLSAgICBBU1NFUlQoIW1fdXJsQW5kSWNv
bkxvY2sudHJ5TG9jaygpKTsKKyAgICBtX2xvYWRlZEljb25zLmNsZWFyKCk7CisgICAgbV93b3Jr
UXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNv
bXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7
CisgICAgICAgIG1fcGFnZVVSTFRvSWNvblVSTE1hcC5jbGVhcigpOwogCi0gICAgaWYgKCFkb2N1
bWVudENhbkhhdmVJY29uKHBhZ2VVUkwpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAg
ICAgaWYgKG1fZGIuaXNPcGVuKCkgJiYgbV9hbGxvd0RhdGFiYXNlV3JpdGUgPT0gQWxsb3dEYXRh
YmFzZVdyaXRlOjpZZXMpIHsKKyAgICAgICAgICAgIG1fcGFnZVVSTFRvSWNvblVSTE1hcC5jbGVh
cigpOwogCi0gICAgUGFnZVVSTFJlY29yZCogcGFnZVJlY29yZCA9IG1fcGFnZVVSTFRvUmVjb3Jk
TWFwLmdldChwYWdlVVJMKTsKLQotICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1JlYWRp
bmdMb2NrKTsKLSAgICBpZiAoIW1faWNvblVSTEltcG9ydENvbXBsZXRlKSB7Ci0gICAgICAgIC8v
IElmIHRoZSBpbml0aWFsIGltcG9ydCBvZiBhbGwgVVJMcyBoYXNuJ3QgY29tcGxldGVkIGFuZCB3
ZSBoYXZlIG5vIHBhZ2UgcmVjb3JkLCB3ZSBhc3N1bWUgd2UgKm1pZ2h0KiBrbm93IGFib3V0IHRo
aXMgbGF0ZXIgYW5kIGNyZWF0ZSBhIHJlY29yZCBmb3IgaXQKLSAgICAgICAgaWYgKCFwYWdlUmVj
b3JkKSB7Ci0gICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiQ3JlYXRpbmcgbmV3IFBhZ2VV
UkxSZWNvcmQgZm9yIHBhZ2VVUkwgJXMiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkwpLmFzY2lpKCku
ZGF0YSgpKTsKLSAgICAgICAgICAgIHBhZ2VSZWNvcmQgPSBuZXcgUGFnZVVSTFJlY29yZChwYWdl
VVJMKTsKLSAgICAgICAgICAgIG1fcGFnZVVSTFRvUmVjb3JkTWFwLnNldChwYWdlVVJMLCBwYWdl
UmVjb3JkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBwYWdlUmVjb3JkIGZvciB0
aGlzIHBhZ2UgZG9lcyBub3QgaGF2ZSBhbiBpY29uUmVjb3JkIGF0dGFjaGVkIHRvIGl0LCB0aGVu
IGl0IGlzIGEgbmV3IHBhZ2VSZWNvcmQgc3RpbGwgYXdhaXRpbmcgdGhlIGluaXRpYWwgaW1wb3J0
Ci0gICAgICAgIC8vIE1hcmsgdGhlIFVSTCBhcyAiaW50ZXJlc3RlZCBpbiB0aGUgcmVzdWx0IG9m
IHRoZSBpbXBvcnQiIHRoZW4gYmFpbAotICAgICAgICBpZiAoIXBhZ2VSZWNvcmQtPmljb25SZWNv
cmQoKSkgewotICAgICAgICAgICAgbV9wYWdlVVJMc1BlbmRpbmdJbXBvcnQuYWRkKHBhZ2VVUkwp
OwotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAv
LyBXZSd2ZSBkb25lIHRoZSBpbml0aWFsIGltcG9ydCBvZiBhbGwgVVJMcyBrbm93biBpbiB0aGUg
ZGF0YWJhc2UuIElmIHRoaXMgcmVjb3JkIGRvZXNuJ3QgZXhpc3Qgbm93LCBpdCBuZXZlciB3aWxs
Ci0gICAgcmV0dXJuIHBhZ2VSZWNvcmQ7Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioq
KioqCi0vLyAqKiogU3luYyBUaHJlYWQgT25seSAqKioKLS8vICoqKioqKioqKioqKioqKioqKioq
KioqKgotCi1ib29sIEljb25EYXRhYmFzZTo6c2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkgY29u
c3QKLXsKLSAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOwotCi0gICAgcmV0dXJuIG1fdGhy
ZWFkVGVybWluYXRpb25SZXF1ZXN0ZWQgfHwgbV9yZW1vdmVJY29uc1JlcXVlc3RlZDsKLX0KLQot
dm9pZCBJY29uRGF0YWJhc2U6Omljb25EYXRhYmFzZVN5bmNUaHJlYWQoKQotewotICAgIC8vIFRo
ZSBjYWxsIHRvIGNyZWF0ZSB0aGlzIHRocmVhZCBtaWdodCBub3QgY29tcGxldGUgYmVmb3JlIHRo
ZSB0aHJlYWQgYWN0dWFsbHkgc3RhcnRzLCBzbyB3ZSBtaWdodCBmYWlsIHRoaXMgQVNTRVJUX0lD
T05fU1lOQ19USFJFQUQoKSBiZWNhdXNlIHRoZSBwb2ludGVyCi0gICAgLy8gdG8gb3VyIHRocmVh
ZCBzdHJ1Y3R1cmUgaGFzbid0IGJlZW4gZmlsbGVkIGluIHlldC4KLSAgICAvLyBUbyBmaXggdGhp
cywgdGhlIG1haW4gdGhyZWFkIGFjcXVpcmVzIHRoaXMgbG9jayBiZWZvcmUgY3JlYXRpbmcgdXMs
IHRoZW4gcmVsZWFzZXMgdGhlIGxvY2sgYWZ0ZXIgY3JlYXRpb24gaXMgY29tcGxldGUuIEEgcXVp
Y2sgbG9jay91bmxvY2sgY3ljbGUgaGVyZSB3aWxsCi0gICAgLy8gcHJldmVudCB1cyBmcm9tIHJ1
bm5pbmcgYmVmb3JlIHRoYXQgY2FsbCBjb21wbGV0ZXMKLSAgICBtX3N5bmNMb2NrLmxvY2soKTsK
LSAgICBtX3N5bmNMb2NrLnVubG9jaygpOwotCi0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQo
KTsKLQotICAgIExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBJY29uRGF0YWJhc2Ugc3luYyB0
aHJlYWQgc3RhcnRlZCIpOwotCi0jaWYgIUxPR19ESVNBQkxFRAotICAgIE1vbm90b25pY1RpbWUg
c3RhcnRUaW1lID0gTW9ub3RvbmljVGltZTo6bm93KCk7Ci0jZW5kaWYKLQotICAgIC8vIE5lZWQg
dG8gY3JlYXRlIHRoZSBkYXRhYmFzZSBwYXRoIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdAot
ICAgIEZpbGVTeXN0ZW06Om1ha2VBbGxEaXJlY3RvcmllcyhtX2RhdGFiYXNlRGlyZWN0b3J5KTsK
LQotICAgIC8vIEV4aXN0ZW5jZSBvZiBhIGpvdXJuYWwgZmlsZSBpcyBldmlkZW5jZSBvZiBhIHBy
ZXZpb3VzIGNyYXNoL2ZvcmNlIHF1aXQgYW5kIGF1dG9tYXRpY2FsbHkgcXVhbGlmaWVzCi0gICAg
Ly8gdXMgdG8gZG8gYW4gaW50ZWdyaXR5IGNoZWNrCi0gICAgU3RyaW5nIGpvdXJuYWxGaWxlbmFt
ZSA9IG1fY29tcGxldGVEYXRhYmFzZVBhdGggKyAiLWpvdXJuYWwiOwotICAgIGlmICghY2hlY2tJ
bnRlZ3JpdHlPbk9wZW4pCi0gICAgICAgIGNoZWNrSW50ZWdyaXR5T25PcGVuID0gRmlsZVN5c3Rl
bTo6ZmlsZUV4aXN0cyhqb3VybmFsRmlsZW5hbWUpOwotCi0gICAgewotICAgICAgICBMb2NrSG9s
ZGVyIGxvY2tlcihtX3N5bmNMb2NrKTsKLSAgICAgICAgaWYgKCFtX3N5bmNEQi5vcGVuKG1fY29t
cGxldGVEYXRhYmFzZVBhdGgpKSB7Ci0gICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBv
cGVuIGljb24gZGF0YWJhc2UgYXQgcGF0aCAlcyAtICVzIiwgbV9jb21wbGV0ZURhdGFiYXNlUGF0
aC5hc2NpaSgpLmRhdGEoKSwgbV9zeW5jREIubGFzdEVycm9yTXNnKCkpOwotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rp
dml0eSgpKSB7Ci0gICAgICAgIHN5bmNUaHJlYWRNYWluTG9vcCgpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0jaWYgIUxPR19ESVNBQkxFRAotICAgIE1vbm90b25pY1RpbWUgdGltZVN0YW1w
ID0gTW9ub3RvbmljVGltZTo6bm93KCk7Ci0gICAgU2Vjb25kcyBkZWx0YSA9IHRpbWVTdGFtcCAt
IHN0YXJ0VGltZTsKLSAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkgT3BlbiB0b29rICUu
NGYgc2Vjb25kcyIsIGRlbHRhLnZhbHVlKCkpOwotI2VuZGlmCi0KLSAgICBwZXJmb3JtT3Blbklu
aXRpYWxpemF0aW9uKCk7Ci0gICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKSB7Ci0g
ICAgICAgIHN5bmNUaHJlYWRNYWluTG9vcCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0j
aWYgIUxPR19ESVNBQkxFRAotICAgIE1vbm90b25pY1RpbWUgbmV3U3RhbXAgPSBNb25vdG9uaWNU
aW1lOjpub3coKTsKLSAgICBTZWNvbmRzIHRvdGFsRGVsdGEgPSBuZXdTdGFtcCAtIHN0YXJ0VGlt
ZTsKLSAgICBkZWx0YSA9IG5ld1N0YW1wIC0gdGltZVN0YW1wOwotICAgIExPRyhJY29uRGF0YWJh
c2UsICIoVEhSRUFEKSBwZXJmb3JtT3BlbkluaXRpYWxpemF0aW9uKCkgdG9vayAlLjRmIHNlY29u
ZHMsIG5vdyAlLjRmIHNlY29uZHMgZnJvbSB0aHJlYWQgc3RhcnQiLCBkZWx0YS52YWx1ZSgpLCB0
b3RhbERlbHRhLnZhbHVlKCkpOwotICAgIHRpbWVTdGFtcCA9IG5ld1N0YW1wOwotI2VuZGlmCi0K
LSAgICAvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHNpbXVsYXRlIGEgbG9uZyBs
YXN0aW5nIFVSTCBpbXBvcnQgKCpIVUdFKiBpY29uIGRhdGFiYXNlcywgb3IgbmV0d29yayBob21l
IGRpcmVjdG9yaWVzKQotICAgIC8vIHdoaWxlIChNb25vdG9uaWNUaW1lOjpub3coKSAtIHRpbWVT
dGFtcCA8IDEwX3MpOwotCi0gICAgLy8gUmVhZCBpbiBVUkwgbWFwcGluZ3MgZnJvbSB0aGUgZGF0
YWJhc2UKLSAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkgU3RhcnRpbmcgaWNvblVSTCBp
bXBvcnQiKTsKLSAgICBwZXJmb3JtVVJMSW1wb3J0KCk7Ci0KLSAgICBpZiAoc2hvdWxkU3RvcFRo
cmVhZEFjdGl2aXR5KCkpIHsKLSAgICAgICAgc3luY1RocmVhZE1haW5Mb29wKCk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSNpZiAhTE9HX0RJU0FCTEVECi0gICAgbmV3U3RhbXAgPSBNb25v
dG9uaWNUaW1lOjpub3coKTsKLSAgICB0b3RhbERlbHRhID0gbmV3U3RhbXAgLSBzdGFydFRpbWU7
Ci0gICAgZGVsdGEgPSBuZXdTdGFtcCAtIHRpbWVTdGFtcDsKLSAgICBMT0coSWNvbkRhdGFiYXNl
LCAiKFRIUkVBRCkgcGVyZm9ybVVSTEltcG9ydCgpIHRvb2sgJS40ZiBzZWNvbmRzLiBFbnRlcmlu
ZyBtYWluIGxvb3AgJS40ZiBzZWNvbmRzIGZyb20gdGhyZWFkIHN0YXJ0IiwgZGVsdGEudmFsdWUo
KSwgdG90YWxEZWx0YS52YWx1ZSgpKTsKLSNlbmRpZgotCi0gICAgTE9HKEljb25EYXRhYmFzZSwg
IihUSFJFQUQpIEJlZ2lubmluZyBzeW5jIik7Ci0gICAgc3luY1RocmVhZE1haW5Mb29wKCk7Ci19
Ci0KLXN0YXRpYyBpbnQgZGF0YWJhc2VWZXJzaW9uTnVtYmVyKFNRTGl0ZURhdGFiYXNlJiBkYikK
LXsKLSAgICByZXR1cm4gU1FMaXRlU3RhdGVtZW50KGRiLCAiU0VMRUNUIHZhbHVlIEZST00gSWNv
bkRhdGFiYXNlSW5mbyBXSEVSRSBrZXkgPSAnVmVyc2lvbic7IikuZ2V0Q29sdW1uSW50KDApOwot
fQotCi1zdGF0aWMgYm9vbCBpc1ZhbGlkRGF0YWJhc2UoU1FMaXRlRGF0YWJhc2UmIGRiKQotewot
ICAgIC8vIFRoZXNlIGZvdXIgdGFibGVzIHNob3VsZCBhbHdheXMgZXhpc3QgaW4gYSB2YWxpZCBk
YgotICAgIGlmICghZGIudGFibGVFeGlzdHMoIkljb25JbmZvIikgfHwgIWRiLnRhYmxlRXhpc3Rz
KCJJY29uRGF0YSIpIHx8ICFkYi50YWJsZUV4aXN0cygiUGFnZVVSTCIpIHx8ICFkYi50YWJsZUV4
aXN0cygiSWNvbkRhdGFiYXNlSW5mbyIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBp
ZiAoZGF0YWJhc2VWZXJzaW9uTnVtYmVyKGRiKSA8IGN1cnJlbnREYXRhYmFzZVZlcnNpb24pIHsK
LSAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkRCIHZlcnNpb24gaXMgbm90IGZvdW5kIG9yIGJl
bG93IGV4cGVjdGVkIHZhbGlkIHZlcnNpb24iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBjcmVhdGVEYXRhYmFzZVRh
YmxlcyhTUUxpdGVEYXRhYmFzZSYgZGIpCi17Ci0gICAgaWYgKCFkYi5leGVjdXRlQ29tbWFuZCgi
Q1JFQVRFIFRBQkxFIFBhZ2VVUkwgKHVybCBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwg
VU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsaWNvbklEIElOVEVHRVIgTk9UIE5VTEwgT04gQ09O
RkxJQ1QgRkFJTCk7IikpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIFBh
Z2VVUkwgdGFibGUgaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCksIGRiLmxh
c3RFcnJvck1zZygpKTsKLSAgICAgICAgZGIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgSU5ERVggUGFnZVVSTEluZGV4
IE9OIFBhZ2VVUkwgKHVybCk7IikpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3Jl
YXRlIFBhZ2VVUkwgaW5kZXggaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCks
IGRiLmxhc3RFcnJvck1zZygpKTsKLSAgICAgICAgZGIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLSAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgSWNvbklu
Zm8gKGljb25JRCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQgVU5JUVVFIE9OIENP
TkZMSUNUIFJFUExBQ0UsIHVybCBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwgVU5JUVVF
IE9OIENPTkZMSUNUIEZBSUwsIHN0YW1wIElOVEVHRVIpOyIpKSB7Ci0gICAgICAgIExPR19FUlJP
UigiQ291bGQgbm90IGNyZWF0ZSBJY29uSW5mbyB0YWJsZSBpbiBkYXRhYmFzZSAoJWkpIC0gJXMi
LCBkYi5sYXN0RXJyb3IoKSwgZGIubGFzdEVycm9yTXNnKCkpOwotICAgICAgICBkYi5jbG9zZSgp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghZGIuZXhlY3V0ZUNvbW1hbmQoIkNS
RUFURSBJTkRFWCBJY29uSW5mb0luZGV4IE9OIEljb25JbmZvICh1cmwsIGljb25JRCk7IikpIHsK
LSAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIFBhZ2VVUkwgaW5kZXggaW4gZGF0
YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCksIGRiLmxhc3RFcnJvck1zZygpKTsKLSAg
ICAgICAgZGIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIWRiLmV4
ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgSWNvbkRhdGEgKGljb25JRCBJTlRFR0VSIFBSSU1B
UlkgS0VZIEFVVE9JTkNSRU1FTlQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIGRhdGEgQkxP
Qik7IikpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIEljb25EYXRhIHRh
YmxlIGluIGRhdGFiYXNlICglaSkgLSAlcyIsIGRiLmxhc3RFcnJvcigpLCBkYi5sYXN0RXJyb3JN
c2coKSk7Ci0gICAgICAgIGRiLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
aWYgKCFkYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIElOREVYIEljb25EYXRhSW5kZXggT04gSWNv
bkRhdGEgKGljb25JRCk7IikpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRl
IFBhZ2VVUkwgaW5kZXggaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCksIGRi
Lmxhc3RFcnJvck1zZygpKTsKLSAgICAgICAgZGIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLSAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgSWNvbkRhdGFi
YXNlSW5mbyAoa2V5IFRFWFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCBVTklRVUUgT04gQ09O
RkxJQ1QgUkVQTEFDRSx2YWx1ZSBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwpOyIpKSB7
Ci0gICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IGNyZWF0ZSBJY29uRGF0YWJhc2VJbmZvIHRh
YmxlIGluIGRhdGFiYXNlICglaSkgLSAlcyIsIGRiLmxhc3RFcnJvcigpLCBkYi5sYXN0RXJyb3JN
c2coKSk7Ci0gICAgICAgIGRiLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
aWYgKCFkYi5leGVjdXRlQ29tbWFuZChTdHJpbmcoIklOU0VSVCBJTlRPIEljb25EYXRhYmFzZUlu
Zm8gVkFMVUVTICgnVmVyc2lvbicsICIpICsgU3RyaW5nOjpudW1iZXIoY3VycmVudERhdGFiYXNl
VmVyc2lvbikgKyAiKTsiKSkgewotICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBpbnNlcnQg
aWNvbiBkYXRhYmFzZSB2ZXJzaW9uIGludG8gSWNvbkRhdGFiYXNlSW5mbyB0YWJsZSAoJWkpIC0g
JXMiLCBkYi5sYXN0RXJyb3IoKSwgZGIubGFzdEVycm9yTXNnKCkpOwotICAgICAgICBkYi5jbG9z
ZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi12b2lkIEljb25EYXRhYmFzZTo6cGVy
Zm9ybU9wZW5Jbml0aWFsaXphdGlvbigpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQo
KTsKLQotICAgIGlmICghaXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChjaGVj
a0ludGVncml0eU9uT3BlbikgewotICAgICAgICBjaGVja0ludGVncml0eU9uT3BlbiA9IGZhbHNl
OwotICAgICAgICBpZiAoIWNoZWNrSW50ZWdyaXR5KCkpIHsKLSAgICAgICAgICAgIExPRyhJY29u
RGF0YWJhc2UsICJJbnRlZ3JpdHkgY2hlY2sgd2FzIGJhZCAtIGR1bXBpbmcgSWNvbkRhdGFiYXNl
Iik7Ci0KLSAgICAgICAgICAgIG1fc3luY0RCLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIHsKLSAg
ICAgICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3N5bmNMb2NrKTsKLSAgICAgICAgICAg
ICAgICAvLyBTaG91bGQndmUgYmVlbiBjb25zdW1lZCBieSBTUUxpdGUsIGRlbGV0ZSBqdXN0IHRv
IG1ha2Ugc3VyZSB3ZSBkb24ndCBzZWUgaXQgYWdhaW4gaW4gdGhlIGZ1dHVyZTsKLSAgICAgICAg
ICAgICAgICBGaWxlU3lzdGVtOjpkZWxldGVGaWxlKG1fY29tcGxldGVEYXRhYmFzZVBhdGggKyAi
LWpvdXJuYWwiKTsKLSAgICAgICAgICAgICAgICBGaWxlU3lzdGVtOjpkZWxldGVGaWxlKG1fY29t
cGxldGVEYXRhYmFzZVBhdGgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZW9w
ZW4gdGhlIHdyaXRlIGRhdGFiYXNlLCBjcmVhdGluZyBpdCBmcm9tIHNjcmF0Y2gKLSAgICAgICAg
ICAgIGlmICghbV9zeW5jREIub3BlbihtX2NvbXBsZXRlRGF0YWJhc2VQYXRoKSkgewotICAgICAg
ICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIG9wZW4gaWNvbiBkYXRhYmFzZSBhdCBwYXRo
ICVzIC0gJXMiLCBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoLmFzY2lpKCkuZGF0YSgpLCBtX3N5bmNE
Qi5sYXN0RXJyb3JNc2coKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IHZlcnNpb24gPSBkYXRhYmFzZVZlcnNpb25O
dW1iZXIobV9zeW5jREIpOwotCi0gICAgaWYgKHZlcnNpb24gPiBjdXJyZW50RGF0YWJhc2VWZXJz
aW9uKSB7Ci0gICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJEYXRhYmFzZSB2ZXJzaW9uIG51bWJl
ciAlaSBpcyBncmVhdGVyIHRoYW4gb3VyIGN1cnJlbnQgdmVyc2lvbiBudW1iZXIgJWkgLSBjbG9z
aW5nIHRoZSBkYXRhYmFzZSB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIG5ld2VyIHZlcnNpb25zIiwg
dmVyc2lvbiwgY3VycmVudERhdGFiYXNlVmVyc2lvbik7Ci0gICAgICAgIG1fc3luY0RCLmNsb3Nl
KCk7Ci0gICAgICAgIG1fdGhyZWFkVGVybWluYXRpb25SZXF1ZXN0ZWQgPSB0cnVlOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFpc1ZhbGlkRGF0YWJhc2UobV9zeW5jREIpKSB7
Ci0gICAgICAgIExPRyhJY29uRGF0YWJhc2UsICIlcyBpcyBtaXNzaW5nIG9yIGluIGFuIGludmFs
aWQgc3RhdGUgLSByZWNvbnN0cnVjdGluZyIsIG1fY29tcGxldGVEYXRhYmFzZVBhdGguYXNjaWko
KS5kYXRhKCkpOwotICAgICAgICBtX3N5bmNEQi5jbGVhckFsbFRhYmxlcygpOwotICAgICAgICBj
cmVhdGVEYXRhYmFzZVRhYmxlcyhtX3N5bmNEQik7Ci0gICAgfQotCi0gICAgLy8gUmVkdWNlIHNx
bGl0ZSBSQU0gY2FjaGUgc2l6ZSBmcm9tIGRlZmF1bHQgMjAwMCBwYWdlcyAofjEuNWtCIHBlciBw
YWdlKS4gM01CIG9mIGNhY2hlIGZvciBpY29uIGRhdGFiYXNlIGlzIG92ZXJraWxsCi0gICAgaWYg
KCFTUUxpdGVTdGF0ZW1lbnQobV9zeW5jREIsICJQUkFHTUEgY2FjaGVfc2l6ZSA9IDIwMDsiKS5l
eGVjdXRlQ29tbWFuZCgpKQotICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBkYXRhYmFzZSBjb3Vs
ZCBub3Qgc2V0IGNhY2hlX3NpemUiKTsKLX0KLQotYm9vbCBJY29uRGF0YWJhc2U6OmNoZWNrSW50
ZWdyaXR5KCkKLXsKLSAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOwotCi0gICAgU1FMaXRl
U3RhdGVtZW50IGludGVncml0eShtX3N5bmNEQiwgIlBSQUdNQSBpbnRlZ3JpdHlfY2hlY2s7Iik7
Ci0gICAgaWYgKGludGVncml0eS5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIExP
R19FUlJPUigiY2hlY2tJbnRlZ3JpdHkgZmFpbGVkIHRvIGV4ZWN1dGUiKTsKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludCByZXN1bHRDb2RlID0gaW50ZWdyaXR5LnN0ZXAo
KTsKLSAgICBpZiAocmVzdWx0Q29kZSA9PSBTUUxJVEVfT0spCi0gICAgICAgIHJldHVybiB0cnVl
OwotCi0gICAgaWYgKHJlc3VsdENvZGUgIT0gU1FMSVRFX1JPVykKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaW50IGNvbHVtbnMgPSBpbnRlZ3JpdHkuY29sdW1uQ291bnQoKTsKLSAgICBp
ZiAoY29sdW1ucyAhPSAxKSB7Ci0gICAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgJWkgY29sdW1u
cyBwZXJmb3JtaW5nIGludGVncml0eSBjaGVjaywgc2hvdWxkIGJlIDEiLCBjb2x1bW5zKTsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZyByZXN1bHRUZXh0ID0gaW50
ZWdyaXR5LmdldENvbHVtblRleHQoMCk7Ci0KLSAgICAvLyBBIHN1Y2Nlc3NmdWwsIG5vLWVycm9y
IGludGVncml0eSBjaGVjayB3aWxsIGJlICJvayIgLSBhbGwgb3RoZXIgc3RyaW5ncyBpbXBseSBm
YWlsdXJlCi0gICAgaWYgKHJlc3VsdFRleHQgPT0gIm9rIikKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0KLSAgICBMT0dfRVJST1IoIkljb24gZGF0YWJhc2UgaW50ZWdyaXR5IGNoZWNrIGZhaWxlZCAt
IFxuJXMiLCByZXN1bHRUZXh0LmFzY2lpKCkuZGF0YSgpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLXZvaWQgSWNvbkRhdGFiYXNlOjpwZXJmb3JtVVJMSW1wb3J0KCkKLXsKLSAgICBBU1NFUlRf
SUNPTl9TWU5DX1RIUkVBRCgpOwotCi0gICAgLy8gRG8gbm90IGltcG9ydCBpY29ucyBub3QgdXNl
ZCBpbiB0aGUgbGFzdCAzMCBkYXlzLiBUaGV5IHdpbGwgYmUgYXV0b21hdGljYWxseSBwcnVuZWQg
bGF0ZXIgaWYgbm9ib2R5IHJldGFpbnMgdGhlbS4KLSAgICAvLyBOb3RlIHRoYXQgSWNvbkluZm8u
c3RhbXAgaXMgb25seSBzZXQgd2hlbiB0aGUgaWNvbiBkYXRhIGlzIHJldHJpZXZlZCBmcm9tIHRo
ZSBzZXJ2ZXIgKGFuZCB0aHVzIGlzIG5vdCB1cGRhdGVkIHdoZXRoZXIKLSAgICAvLyB3ZSB1c2Ug
aXQgb3Igbm90KS4gVGhpcyBjb2RlIHdvcmtzIGFueXdheSBiZWNhdXNlIHRoZSBJY29uRGF0YWJh
c2UgZG93bmxvYWRzIGljb25zIGFnYWluIGlmIHRoZXkgYXJlIG9sZGVyIHRoYW4gNCBkYXlzLAot
ICAgIC8vIHNvIGlmIHRoZSB0aW1lc3RhbXAgZ29lcyBiYWNrIGluIHRpbWUgbW9yZSB0aGFuIHRo
b3NlIDMwIGRheXMgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgaWNvbiB3YXMgbm90IHVzZWQgYXQg
YWxsLgotICAgIFN0cmluZyBpbXBvcnRRdWVyeSA9IG1ha2VTdHJpbmcoIlNFTEVDVCBQYWdlVVJM
LnVybCwgSWNvbkluZm8udXJsLCBJY29uSW5mby5zdGFtcCBGUk9NIFBhZ2VVUkwgSU5ORVIgSk9J
TiBJY29uSW5mbyBPTiBQYWdlVVJMLmljb25JRD1JY29uSW5mby5pY29uSUQgV0hFUkUgSWNvbklu
Zm8uc3RhbXAgPiAiLCBmbG9vcigoV2FsbFRpbWU6Om5vdygpIC0gbm90VXNlZEljb25FeHBpcmF0
aW9uVGltZSkuc2Vjb25kc1NpbmNlRXBvY2goKS5zZWNvbmRzKCkpLCAnOycpOwotCi0gICAgU1FM
aXRlU3RhdGVtZW50IHF1ZXJ5KG1fc3luY0RCLCBpbXBvcnRRdWVyeSk7Ci0KLSAgICBpZiAocXVl
cnkucHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0
byBwcmVwYXJlIGljb24gdXJsIGltcG9ydCBxdWVyeSIpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaW50IHJlc3VsdCA9IHF1ZXJ5LnN0ZXAoKTsKLSAgICB3aGlsZSAocmVzdWx0ID09
IFNRTElURV9ST1cpIHsKLSAgICAgICAgU3RyaW5nIHBhZ2VVUkwgPSBxdWVyeS5nZXRDb2x1bW5U
ZXh0KDApOwotICAgICAgICBTdHJpbmcgaWNvblVSTCA9IHF1ZXJ5LmdldENvbHVtblRleHQoMSk7
Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29u
TG9jayk7Ci0KLSAgICAgICAgICAgIFBhZ2VVUkxSZWNvcmQqIHBhZ2VSZWNvcmQgPSBtX3BhZ2VV
UkxUb1JlY29yZE1hcC5nZXQocGFnZVVSTCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBwYWdl
UmVjb3JkIGRvZXNuJ3QgZXhpc3QgaW4gdGhpcyBtYXAsIHRoZW4gbm8gb25lIGhhcyByZXRhaW5l
ZCB0aGlzIHBhZ2VVUkwKLSAgICAgICAgICAgIC8vIElmIHRoZSBzX2RhdGFiYXNlQ2xlYW51cENv
dW50ZXIgY291bnQgaXMgbm9uLXplcm8sIHRoZW4gd2UncmUgbm90IHN1cHBvc2VkIHRvIGJlIHBy
dW5pbmcgdGhlIGRhdGFiYXNlIGluIGFueSBtYW5uZXIsCi0gICAgICAgICAgICAvLyBzbyBhY3R1
YWxseSBjcmVhdGUgYSBwYWdlVVJMUmVjb3JkIGZvciB0aGlzIHVybCBldmVuIHRob3VnaCBpdCdz
IG5vdCByZXRhaW5lZC4KLSAgICAgICAgICAgIC8vIElmIGRhdGFiYXNlIGNsZWFudXAgKmlzKiBh
bGxvd2VkLCB3ZSBkb24ndCB3YW50IHRvIGJvdGhlciBwdWxsaW5nIGluIGEgcGFnZSB1cmwgZnJv
bSBkaXNrIHRoYXQgbm9vbmUgaXMgYWN0dWFsbHkgaW50ZXJlc3RlZAotICAgICAgICAgICAgLy8g
aW4gLSB3ZSdsbCBwcnVuZSBpdCBsYXRlciBpbnN0ZWFkIQotICAgICAgICAgICAgaWYgKCFwYWdl
UmVjb3JkICYmIGRhdGFiYXNlQ2xlYW51cENvdW50ZXIgJiYgZG9jdW1lbnRDYW5IYXZlSWNvbihw
YWdlVVJMKSkgewotICAgICAgICAgICAgICAgIHBhZ2VSZWNvcmQgPSBuZXcgUGFnZVVSTFJlY29y
ZChwYWdlVVJMKTsKLSAgICAgICAgICAgICAgICBtX3BhZ2VVUkxUb1JlY29yZE1hcC5zZXQocGFn
ZVVSTCwgcGFnZVJlY29yZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYWdl
UmVjb3JkKSB7Ci0gICAgICAgICAgICAgICAgSWNvblJlY29yZCogY3VycmVudEljb24gPSBwYWdl
UmVjb3JkLT5pY29uUmVjb3JkKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRJY29u
IHx8IGN1cnJlbnRJY29uLT5pY29uVVJMKCkgIT0gaWNvblVSTCkgewotICAgICAgICAgICAgICAg
ICAgICBwYWdlUmVjb3JkLT5zZXRJY29uUmVjb3JkKGdldE9yQ3JlYXRlSWNvblJlY29yZChpY29u
VVJMKSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJY29uID0gcGFnZVJlY29yZC0+aWNv
blJlY29yZCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFJlZ2Fy
ZGxlc3MsIHRoZSB0aW1lIHN0YW1wIGZyb20gZGlzayBzdGlsbCB0YWtlcyBwcmVjZWRlbmNlLiBV
bnRpbCB3ZSByZWFkIHRoaXMgaWNvbiBmcm9tIGRpc2ssIHdlIGRpZG4ndCB0aGluayB3ZSdkIHNl
ZW4gaXQgYmVmb3JlCi0gICAgICAgICAgICAgICAgLy8gc28gd2UgbWFya2VkIHRoZSB0aW1lc3Rh
bXAgYXMgIm5vdyIsIGJ1dCBpdCdzIHJlYWxseSBtdWNoIG9sZGVyCi0gICAgICAgICAgICAgICAg
Y3VycmVudEljb24tPnNldFRpbWVzdGFtcChxdWVyeS5nZXRDb2x1bW5JbnQoMikpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRklYTUU6IEN1cnJlbnRseSB0aGUgV2Vi
S2l0IEFQSSBzdXBwb3J0cyAxIHR5cGUgb2Ygbm90aWZpY2F0aW9uIHRoYXQgaXMgc2VudCB3aGVu
ZXZlciB3ZSBnZXQgYW4gSWNvbiBVUkwgZm9yIGEgUGFnZSBVUkwuIFdlIG1pZ2h0IHdhbnQgdG8g
cmUtcHVycG9zZSBpdCB0byB3b3JrIGZvcgotICAgICAgICAvLyBnZXR0aW5nIHRoZSBhY3R1YWxs
eSBpY29uIGl0c2VsZiBhbHNvIChzbyBlYWNoIHBhZ2V1cmwgd291bGQgZ2V0IHRoaXMgbm90aWZp
Y2F0aW9uIHR3aWNlKSBvciB3ZSBtaWdodCB3YW50IHRvIGFkZCBhIHNlY29uZCB0eXBlIG9mIG5v
dGlmaWNhdGlvbiAtCi0gICAgICAgIC8vIG9uZSBmb3IgdGhlIFVSTCBhbmQgb25lIGZvciB0aGUg
SW1hZ2UgaXRzZWxmCi0gICAgICAgIC8vIE5vdGUgdGhhdCBXZWJJY29uRGF0YWJhc2UgaXMgbm90
IG5lY2Nlc3NhcmlseSBBUEkgc28gd2UgbWlnaHQgYmUgYWJsZSB0byBtYWtlIHRoaXMgY2hhbmdl
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1JlYWRp
bmdMb2NrKTsKLSAgICAgICAgICAgIGlmIChtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydC5jb250YWlu
cyhwYWdlVVJMKSkgewotICAgICAgICAgICAgICAgIGRpc3BhdGNoRGlkSW1wb3J0SWNvblVSTEZv
clBhZ2VVUkxPbk1haW5UaHJlYWQocGFnZVVSTCk7Ci0gICAgICAgICAgICAgICAgbV9wYWdlVVJM
c1BlbmRpbmdJbXBvcnQucmVtb3ZlKHBhZ2VVUkwpOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gU3RvcCB0aGUgaW1wb3J0IGF0IGFueSB0aW1lIG9mIHRoZSB0aHJlYWQg
aGFzIGJlZW4gYXNrZWQgdG8gc2h1dGRvd24KLSAgICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRB
Y3Rpdml0eSgpKSB7Ci0gICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiSWNvbkRhdGFiYXNl
IGFza2VkIHRvIHRlcm1pbmF0ZSBkdXJpbmcgcGVyZm9ybVVSTEltcG9ydCgpIik7Ci0gICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSBxdWVyeS5zdGVwKCk7
Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkKLSAgICAgICAgTE9HKElj
b25EYXRhYmFzZSwgIkVycm9yIHJlYWRpbmcgcGFnZS0+aWNvbiB1cmwgbWFwcGluZ3MgZnJvbSBk
YXRhYmFzZSIpOwotCi0gICAgLy8gQ2xlYXIgdGhlIG1fcGFnZVVSTHNQZW5kaW5nSW1wb3J0IHNl
dCAtIGVpdGhlciB0aGUgcGFnZSBVUkxzIGVuZGVkIHVwIHdpdGggYW4gaWNvblVSTCAodGhhdCB3
ZSdsbCBub3RpZnkgYWJvdXQpIG9yIG5vdCwKLSAgICAvLyBidXQgYWZ0ZXIgbV9pY29uVVJMSW1w
b3J0Q29tcGxldGUgaXMgc2V0IHRvIHRydWUsIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBzZXQg
YW55bW9yZQotICAgIFZlY3RvcjxTdHJpbmc+IHVybHM7Ci0gICAgewotICAgICAgICBMb2NrSG9s
ZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7Ci0KLSAgICAgICAgdXJscy5hcHBlbmRS
YW5nZShtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydC5iZWdpbigpLCBtX3BhZ2VVUkxzUGVuZGluZ0lt
cG9ydC5lbmQoKSk7Ci0gICAgICAgIG1fcGFnZVVSTHNQZW5kaW5nSW1wb3J0LmNsZWFyKCk7Ci0g
ICAgICAgIG1faWNvblVSTEltcG9ydENvbXBsZXRlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBWZWN0
b3I8U3RyaW5nPiB1cmxzVG9Ob3RpZnk7Ci0KLSAgICAvLyBMb29wIHRocm91Z2ggdGhlIHVybHMg
cGVuZGluZyBpbXBvcnQKLSAgICAvLyBSZW1vdmUgdW5yZXRhaW5lZCBvbmVzIGlmIGRhdGFiYXNl
IGNsZWFudXAgaXMgYWxsb3dlZAotICAgIC8vIEtlZXAgYSBzZXQgb2Ygb25lcyB0aGF0IGFyZSBy
ZXRhaW5lZCBhbmQgcGVuZGluZyBub3RpZmljYXRpb24KLSAgICB7Ci0gICAgICAgIExvY2tIb2xk
ZXIgbG9ja2VyKG1fdXJsQW5kSWNvbkxvY2spOwotCi0gICAgICAgIHBlcmZvcm1QZW5kaW5nUmV0
YWluQW5kUmVsZWFzZU9wZXJhdGlvbnMoKTsKLQotICAgICAgICBmb3IgKGF1dG8mIHVybCA6IHVy
bHMpIHsKLSAgICAgICAgICAgIGlmICghbV9yZXRhaW5lZFBhZ2VVUkxzLmNvbnRhaW5zKHVybCkp
IHsKLSAgICAgICAgICAgICAgICBQYWdlVVJMUmVjb3JkKiByZWNvcmQgPSBtX3BhZ2VVUkxUb1Jl
Y29yZE1hcC5nZXQodXJsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVjb3JkICYmICFkYXRhYmFz
ZUNsZWFudXBDb3VudGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcGFnZVVSTFRvUmVjb3Jk
TWFwLnJlbW92ZSh1cmwpOwotICAgICAgICAgICAgICAgICAgICBJY29uUmVjb3JkKiBpY29uUmVj
b3JkID0gcmVjb3JkLT5pY29uUmVjb3JkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYg
dGhpcyBwYWdlIGlzIHRoZSBvbmx5IHJlbWFpbmluZyByZXRhaW5lciBvZiBpdHMgaWNvbiwgbWFy
ayB0aGF0IGljb24gZm9yIGRlbGV0aW9uIGFuZCBkb24ndCBib3RoZXIKLSAgICAgICAgICAgICAg
ICAgICAgLy8gcmVhZGluZyBhbnl0aGluZyByZWxhdGVkIHRvIGl0Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChpY29uUmVjb3JkICYmIGljb25SZWNvcmQtPmhhc09uZVJlZigpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBtX2ljb25VUkxUb1JlY29yZE1hcC5yZW1vdmUoaWNvblJlY29yZC0+
aWNvblVSTCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMucmVt
b3ZlKHVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFk
aW5nLnJlbW92ZShpY29uUmVjb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NrSG9s
ZGVyIGxvY2tlcihtX3BlbmRpbmdTeW5jTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV9pY29uc1BlbmRpbmdTeW5jLnNldChpY29uUmVjb3JkLT5pY29uVVJMKCksIGljb25SZWNv
cmQtPnNuYXBzaG90KHRydWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZWNvcmQ7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgdXJsc1Rv
Tm90aWZ5LmFwcGVuZCh1cmwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTE9HKEljb25EYXRh
YmFzZSwgIk5vdGlmeWluZyAlbHUgaW50ZXJlc3RlZCBwYWdlIFVSTHMgdGhhdCB0aGVpciBpY29u
IFVSTCBpcyBrbm93biBkdWUgdG8gdGhlIGltcG9ydCIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxv
bmc+KHVybHNUb05vdGlmeS5zaXplKCkpKTsKLSAgICAvLyBOb3cgdGhhdCB3ZSBkb24ndCBob2xk
IGFueSBsb2NrcywgcGVyZm9ybSB0aGUgYWN0dWFsIG5vdGlmaWNhdGlvbnMKLSAgICBmb3IgKGF1
dG8mIHVybCA6IHVybHNUb05vdGlmeSkgewotICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiTm90
aWZ5aW5nIGljb24gaW5mbyBrbm93biBmb3IgcGFnZVVSTCAlcyIsIHVybC5hc2NpaSgpLmRhdGEo
KSk7Ci0gICAgICAgIGRpc3BhdGNoRGlkSW1wb3J0SWNvblVSTEZvclBhZ2VVUkxPbk1haW5UaHJl
YWQodXJsKTsKLSAgICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKQotICAgICAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgdGhl
IFVSTCBpbXBvcnQgaXMgY29tcGxldGUgaW4gY2FzZSBpdCdzIG1hbmFnaW5nIGl0cyBvd24gcGVu
ZGluZyBub3RpZmljYXRpb25zLgotICAgIGRpc3BhdGNoRGlkRmluaXNoVVJMSW1wb3J0T25NYWlu
VGhyZWFkKCk7Ci19Ci0KLXZvaWQgSWNvbkRhdGFiYXNlOjpzeW5jVGhyZWFkTWFpbkxvb3AoKQot
ewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICBtX3N5bmNMb2NrLmxvY2so
KTsKLQotICAgIC8vIFdlJ2xsIGVpdGhlciBkbyBhbnkgcGVuZGluZyB3b3JrIG9uIG91ciBmaXJz
dCBwYXNzIHRocm91Z2ggdGhlIGxvb3AsIG9yIHdlJ2xsIHRlcm1pbmF0ZQotICAgIC8vIHdpdGhv
dXQgZG9pbmcgYW55IHdvcmsuIEVpdGhlciB3YXkgd2UncmUgZGVhbGluZyB3aXRoIGFueSBjdXJy
ZW50bHktcGVuZGluZyB3b3JrLgotICAgIG1fc3luY1RocmVhZEhhc1dvcmtUb0RvID0gZmFsc2U7
Ci0KLSAgICAvLyBJdCdzIHBvc3NpYmxlIHRocmVhZCB0ZXJtaW5hdGlvbiBpcyByZXF1ZXN0ZWQg
YmVmb3JlIHRoZSBtYWluIGxvb3AgZXZlbiBzdGFydHMgLSBpbiB0aGF0IGNhc2UsIGp1c3Qgc2tp
cCBzdHJhaWdodCB0byBjbGVhbnVwCi0gICAgd2hpbGUgKCFtX3RocmVhZFRlcm1pbmF0aW9uUmVx
dWVzdGVkKSB7Ci0gICAgICAgIG1fc3luY0xvY2sudW5sb2NrKCk7Ci0KLSNpZiAhTE9HX0RJU0FC
TEVECi0gICAgICAgIE1vbm90b25pY1RpbWUgdGltZVN0YW1wID0gTW9ub3RvbmljVGltZTo6bm93
KCk7Ci0jZW5kaWYKLSAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIihUSFJFQUQpIE1haW4gd29y
ayBsb29wIHN0YXJ0aW5nIik7Ci0KLSAgICAgICAgLy8gSWYgd2Ugc2hvdWxkIHJlbW92ZSBhbGwg
aWNvbnMsIGRvIGl0IG5vdy4gVGhpcyBpcyBhbiB1bmludGVydXB0aWJsZSBwcm9jZWR1cmUgdGhh
dCB3ZSB3aWxsIGFsd2F5cyBkbyBiZWZvcmUgcXVpdHRpbmcgaWYgaXQgaXMgcmVxdWVzdGVkCi0g
ICAgICAgIGlmIChtX3JlbW92ZUljb25zUmVxdWVzdGVkKSB7Ci0gICAgICAgICAgICByZW1vdmVB
bGxJY29uc09uVGhyZWFkKCk7Ci0gICAgICAgICAgICBtX3JlbW92ZUljb25zUmVxdWVzdGVkID0g
ZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGVuLCBpZiB0aGUgdGhyZWFkIHNob3Vs
ZCBiZSBxdWl0dGluZywgcXVpdCBub3chCi0gICAgICAgIGlmIChtX3RocmVhZFRlcm1pbmF0aW9u
UmVxdWVzdGVkKSB7Ci0gICAgICAgICAgICBjbGVhbnVwU3luY1RocmVhZCgpOwotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTG9ja0hvbGRl
ciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7Ci0gICAgICAgICAgICBwZXJmb3JtUGVuZGluZ1Jl
dGFpbkFuZFJlbGVhc2VPcGVyYXRpb25zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGRp
ZEFueVdvcmsgPSB0cnVlOwotICAgICAgICB3aGlsZSAoZGlkQW55V29yaykgewotICAgICAgICAg
ICAgYm9vbCBkaWRXcml0ZSA9IHdyaXRlVG9EYXRhYmFzZSgpOwotICAgICAgICAgICAgaWYgKHNo
b3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAg
ICAgICAgICBkaWRBbnlXb3JrID0gcmVhZEZyb21EYXRhYmFzZSgpOwotICAgICAgICAgICAgaWYg
KHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0g
ICAgICAgICAgICAvLyBQcnVuZSB1bnJldGFpbmVkIGljb25zIGFmdGVyIHRoZSBmaXJzdCB0aW1l
IHdlIHN5bmMgYW55dGhpbmcgb3V0IHRvIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgLy8gVGhp
cyB3YXksIHBydW5pbmcgd29uJ3QgYmUgdGhlIG9ubHkgb3BlcmF0aW9uIHdlIHBlcmZvcm0gdG8g
dGhlIGRhdGFiYXNlIGJ5IGl0c2VsZgotICAgICAgICAgICAgLy8gV2UgYWxzbyBkb24ndCB3YW50
IHRvIGJvdGhlciBkb2luZyB0aGlzIGlmIHRoZSB0aHJlYWQgc2hvdWxkIGJlIHRlcm1pbmF0aW5n
ICh0aGUgdXNlciBpcyBxdWl0dGluZykKLSAgICAgICAgICAgIC8vIG9yIGlmIHByaXZhdGUgYnJv
d3NpbmcgaXMgZW5hYmxlZAotICAgICAgICAgICAgLy8gV2UgYWxzbyBkb24ndCB3YW50IHRvIHBy
dW5lIGlmIHRoZSBtX2RhdGFiYXNlQ2xlYW51cENvdW50ZXIgY291bnQgaXMgbm9uLXplcm8gLSB0
aGF0IG1lYW5zIHNvbWVvbmUKLSAgICAgICAgICAgIC8vIGhhcyBhc2tlZCB0byBkZWxheSBwcnVu
aW5nCi0gICAgICAgICAgICBzdGF0aWMgYm9vbCBwcnVuZWRVbnJldGFpbmVkSWNvbnMgPSBmYWxz
ZTsKLSAgICAgICAgICAgIGlmIChkaWRXcml0ZSAmJiAhbV9wcml2YXRlQnJvd3NpbmdFbmFibGVk
ICYmICFwcnVuZWRVbnJldGFpbmVkSWNvbnMgJiYgIWRhdGFiYXNlQ2xlYW51cENvdW50ZXIpIHsK
LSNpZiAhTE9HX0RJU0FCTEVECi0gICAgICAgICAgICAgICAgTW9ub3RvbmljVGltZSB0aW1lID0g
TW9ub3RvbmljVGltZTo6bm93KCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBMT0coSWNvbkRh
dGFiYXNlLCAiKFRIUkVBRCkgU3RhcnRpbmcgcHJ1bmVVbnJldGFpbmVkSWNvbnMoKSIpOwotCi0g
ICAgICAgICAgICAgICAgcHJ1bmVVbnJldGFpbmVkSWNvbnMoKTsKLQotI2lmICFMT0dfRElTQUJM
RUQKLSAgICAgICAgICAgICAgICBTZWNvbmRzIGRlbHRhID0gTW9ub3RvbmljVGltZTo6bm93KCkg
LSB0aW1lOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIihUSFJF
QUQpIHBydW5lVW5yZXRhaW5lZEljb25zKCkgdG9vayAlLjRmIHNlY29uZHMiLCBkZWx0YS52YWx1
ZSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIHBydW5lVW5yZXRhaW5lZEljb25zKCkgcmV0
dXJuZWQgZWFybHkgZHVlIHRvIHJlcXVlc3RlZCB0aHJlYWQgdGVybWluYXRpb24sIGl0cyBzdGls
bCBva2F5Ci0gICAgICAgICAgICAgICAgLy8gdG8gbWFyayBwcnVuZWRVbnJldGFpbmVkSWNvbnMg
dHJ1ZSBiZWNhdXNlIHdlJ3JlIGFib3V0IHRvIHRlcm1pbmF0ZSBhbnl3YXkKLSAgICAgICAgICAg
ICAgICBwcnVuZWRVbnJldGFpbmVkSWNvbnMgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBkaWRBbnlXb3JrID0gZGlkQW55V29yayB8fCBkaWRXcml0ZTsKLSAgICAgICAgICAg
IGlmIChzaG91bGRTdG9wVGhyZWFkQWN0aXZpdHkoKSkKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgfQotCi0jaWYgIUxPR19ESVNBQkxFRAotICAgICAgICBNb25vdG9uaWNUaW1lIG5l
d3N0YW1wID0gTW9ub3RvbmljVGltZTo6bm93KCk7Ci0gICAgICAgIFNlY29uZHMgZGVsdGEgPSBu
ZXdzdGFtcCAtIHRpbWVTdGFtcDsKLSAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIihUSFJFQUQp
IE1haW4gd29yayBsb29wIHJhbiBmb3IgJS40ZiBzZWNvbmRzLCAlcyByZXF1ZXN0ZWQgdG8gdGVy
bWluYXRlIiwgZGVsdGEudmFsdWUoKSwgc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkgPyAid2Fz
IiA6ICJ3YXMgbm90Iik7Ci0jZW5kaWYKLQotICAgICAgICBtX3N5bmNMb2NrLmxvY2soKTsKLQot
ICAgICAgICAvLyBUaGVyZSBpcyBzb21lIGNvbmRpdGlvbiB0aGF0IGlzIGFza2luZyB1cyB0byBz
dG9wIHdoYXQgd2UncmUgZG9pbmcgbm93IGFuZCBoYW5kbGUgYSBzcGVjaWFsIGNhc2UKLSAgICAg
ICAgLy8gVGhpcyBpcyBlaXRoZXIgcmVtb3ZpbmcgYWxsIGljb25zLCBvciBzaHV0dGluZyBkb3du
IHRoZSB0aHJlYWQgdG8gcXVpdCB0aGUgYXBwCi0gICAgICAgIC8vIFdlIGhhbmRsZSB0aG9zZSBh
dCB0aGUgdG9wIG9mIHRoaXMgbWFpbiBsb29wIHNvIGNvbnRpbnVlIHRvIGp1bXAgYmFjayB1cCB0
aGVyZQotICAgICAgICBpZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpCi0gICAgICAgICAg
ICBjb250aW51ZTsKLQotICAgICAgICB3aGlsZSAoIW1fc3luY1RocmVhZEhhc1dvcmtUb0RvKQot
ICAgICAgICAgICAgbV9zeW5jQ29uZGl0aW9uLndhaXQobV9zeW5jTG9jayk7Ci0KLSAgICAgICAg
bV9zeW5jVGhyZWFkSGFzV29ya1RvRG8gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBtX3N5bmNMb2Nr
LnVubG9jaygpOwotCi0gICAgLy8gVGhyZWFkIGlzIHRlcm1pbmF0aW5nIGF0IHRoaXMgcG9pbnQK
LSAgICBjbGVhbnVwU3luY1RocmVhZCgpOwotfQotCi12b2lkIEljb25EYXRhYmFzZTo6cGVyZm9y
bVBlbmRpbmdSZXRhaW5BbmRSZWxlYXNlT3BlcmF0aW9ucygpCi17Ci0gICAgLy8gTk9URTogVGhl
IGNhbGxlciBpcyBhc3N1bWVkIHRvIGhvbGQgbV91cmxBbmRJY29uTG9jay4KLSAgICBBU1NFUlQo
IW1fdXJsQW5kSWNvbkxvY2sudHJ5TG9jaygpKTsKLQotICAgIEhhc2hDb3VudGVkU2V0PFN0cmlu
Zz4gdG9SZXRhaW47Ci0gICAgSGFzaENvdW50ZWRTZXQ8U3RyaW5nPiB0b1JlbGVhc2U7Ci0KLSAg
ICB7Ci0gICAgICAgIExvY2tIb2xkZXIgcGVuZGluZ1dvcmtMb2NrZXIobV91cmxzVG9SZXRhaW5P
clJlbGVhc2VMb2NrKTsKLSAgICAgICAgaWYgKCFtX3JldGFpbk9yUmVsZWFzZUljb25SZXF1ZXN0
ZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhl
IFVSTHMgdG8gcmV0YWluIGFuZC9vciByZWxlYXNlIHNvIHdlIGNhbiByZWxlYXNlIG1fdXJsc1Rv
UmV0YWluT3JSZWxlYXNlTG9jayBBU0FQLgotICAgICAgICAvLyBIb2xkaW5nIG1fdXJsQW5kSWNv
bkxvY2sgcHJvdGVjdHMgdGhpcyBmdW5jdGlvbiBmcm9tIGJlaW5nIHJlLWVudGVyZWQuCi0KLSAg
ICAgICAgdG9SZXRhaW4uc3dhcChtX3VybHNUb1JldGFpbik7Ci0gICAgICAgIHRvUmVsZWFzZS5z
d2FwKG1fdXJsc1RvUmVsZWFzZSk7Ci0gICAgICAgIG1fcmV0YWluT3JSZWxlYXNlSWNvblJlcXVl
c3RlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoYXV0byYgZW50cnkgOiB0b1JldGFpbikg
ewotICAgICAgICBBU1NFUlQoIWVudHJ5LmtleS5pbXBsKCkgfHwgZW50cnkua2V5LmltcGwoKS0+
aGFzT25lUmVmKCkpOwotICAgICAgICBwZXJmb3JtUmV0YWluSWNvbkZvclBhZ2VVUkwoZW50cnku
a2V5LCBlbnRyeS52YWx1ZSk7Ci0gICAgfQotCi0gICAgZm9yIChhdXRvJiBlbnRyeSA6IHRvUmVs
ZWFzZSkgewotICAgICAgICBBU1NFUlQoIWVudHJ5LmtleS5pbXBsKCkgfHwgZW50cnkua2V5Lmlt
cGwoKS0+aGFzT25lUmVmKCkpOwotICAgICAgICBwZXJmb3JtUmVsZWFzZUljb25Gb3JQYWdlVVJM
KGVudHJ5LmtleSwgZW50cnkudmFsdWUpOwotICAgIH0KLX0KLQotYm9vbCBJY29uRGF0YWJhc2U6
OnJlYWRGcm9tRGF0YWJhc2UoKQotewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0K
LSNpZiAhTE9HX0RJU0FCTEVECi0gICAgTW9ub3RvbmljVGltZSB0aW1lU3RhbXAgPSBNb25vdG9u
aWNUaW1lOjpub3coKTsKLSNlbmRpZgotCi0gICAgYm9vbCBkaWRBbnlXb3JrID0gZmFsc2U7Ci0K
LSAgICAvLyBXZSdsbCBtYWtlIGEgY29weSBvZiB0aGUgc2V0cyBvZiB0aGluZ3MgdGhhdCBuZWVk
IHRvIGJlIHJlYWQuIFRoZW4gd2UnbGwgdmVyaWZ5IGF0IHRoZSB0aW1lIG9mIHVwZGF0aW5nIHRo
ZSByZWNvcmQgdGhhdCBpdCBzdGlsbCB3YW50cyB0byBiZSB1cGRhdGVkCi0gICAgLy8gVGhpcyB3
YXkgd2Ugd29uJ3QgaG9sZCB0aGUgbG9jayBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lCi0gICAg
VmVjdG9yPEljb25SZWNvcmQqPiBpY29uczsKLSAgICB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9j
a2VyKG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKLSAgICAgICAgaWNvbnMuYXBwZW5kUmFuZ2UobV9p
Y29uc1BlbmRpbmdSZWFkaW5nLmJlZ2luKCksIG1faWNvbnNQZW5kaW5nUmVhZGluZy5lbmQoKSk7
Ci0gICAgfQotCi0gICAgLy8gS2VlcCB0cmFjayBvZiBpY29ucyB3ZSBhY3R1YWxseSByZWFkIHRv
IG5vdGlmeSB0aGVtIG9mIHRoZSBuZXcgaWNvbgotICAgIEhhc2hTZXQ8U3RyaW5nPiB1cmxzVG9O
b3RpZnk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaWNvbnMuc2l6ZSgpOyArK2kp
IHsKLSAgICAgICAgZGlkQW55V29yayA9IHRydWU7Ci0gICAgICAgIGF1dG8gaW1hZ2VEYXRhID0g
Z2V0SW1hZ2VEYXRhRm9ySWNvblVSTEZyb21TUUxEYXRhYmFzZShpY29uc1tpXS0+aWNvblVSTCgp
KTsKLQotICAgICAgICAvLyBWZXJpZnkgdGhpcyBpY29uIHN0aWxsIHdhbnRzIHRvIGJlIHJlYWQg
ZnJvbSBkaXNrCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvY2tIb2xkZXIgdXJsTG9ja2VyKG1f
dXJsQW5kSWNvbkxvY2spOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExvY2tIb2xk
ZXIgcmVhZExvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7Ci0KLSAgICAgICAgICAgICAgICBp
ZiAobV9pY29uc1BlbmRpbmdSZWFkaW5nLmNvbnRhaW5zKGljb25zW2ldKSkgewotICAgICAgICAg
ICAgICAgICAgICAvLyBTZXQgdGhlIG5ldyBkYXRhCi0gICAgICAgICAgICAgICAgICAgIGljb25z
W2ldLT5zZXRJbWFnZURhdGEoV1RGTW92ZShpbWFnZURhdGEpKTsKLQotICAgICAgICAgICAgICAg
ICAgICAvLyBSZW1vdmUgdGhpcyBpY29uIGZyb20gdGhlIHNldCB0aGF0IG5lZWRzIHRvIGJlIHJl
YWQKLSAgICAgICAgICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFkaW5nLnJlbW92ZShpY29u
c1tpXSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHNldCBvZiBhbGwgUGFn
ZSBVUkxzIHRoYXQgcmV0YWluIHRoaXMgaWNvbiBhcyB3ZWxsIGFzIGFsbCBQYWdlVVJMcyB3YWl0
aW5nIGZvciBhbiBpY29uCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gZmluZCB0
aGUgaW50ZXJzZWN0aW9uIG9mIHRoZXNlIHR3byBzZXRzIHRvIG5vdGlmeSB0aGVtCi0gICAgICAg
ICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBzaXplcyBvZiB0aGVzZSB0d28gc2V0cyB0byBtaW5p
bWl6ZSB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qg
SGFzaFNldDxTdHJpbmc+KiBvdXRlckhhc2g7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEhh
c2hTZXQ8U3RyaW5nPiogaW5uZXJIYXNoOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpY29u
c1tpXS0+cmV0YWluaW5nUGFnZVVSTHMoKS5zaXplKCkgPiBtX3BhZ2VVUkxzSW50ZXJlc3RlZElu
SWNvbnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRlckhhc2ggPSAmbV9w
YWdlVVJMc0ludGVyZXN0ZWRJbkljb25zOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJI
YXNoID0gJihpY29uc1tpXS0+cmV0YWluaW5nUGFnZVVSTHMoKSk7Ci0gICAgICAgICAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhhc2ggPSAmbV9wYWdl
VVJMc0ludGVyZXN0ZWRJbkljb25zOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJIYXNo
ID0gJihpY29uc1tpXS0+cmV0YWluaW5nUGFnZVVSTHMoKSk7Ci0gICAgICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIG91dGVyIDogKm91dGVySGFzaCkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVySGFzaC0+Y29udGFpbnMob3V0ZXIp
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIiVzIGlz
IGludGVyZXN0ZWQgaW4gdGhlIGljb24gd2UganVzdCByZWFkLiBBZGRpbmcgaXQgdG8gdGhlIG5v
dGlmaWNhdGlvbiBsaXN0IGFuZCByZW1vdmluZyBpdCBmcm9tIHRoZSBpbnRlcmVzdGVkIHNldCIs
IHVybEZvckxvZ2dpbmcob3V0ZXIpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB1cmxzVG9Ob3RpZnkuYWRkKG91dGVyKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZXZlciBnZXQgdG8gdGhl
IHBvaW50IHdlcmUgd2UndmUgc2VlbiBldmVyeSB1cmwgaW50ZXJlc3RlZCBpbiB0aGlzIGljb24s
IGJyZWFrIGVhcmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsc1RvTm90aWZ5LnNp
emUoKSA9PSBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMuc2l6ZSgpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBub3RpZnkgYSBQYWdlVVJMIHR3aWNlLCBz
byBhbGwgdGhlIG9uZXMgd2UncmUgYWJvdXQgdG8gbm90aWZ5IGNhbiBiZSByZW1vdmVkIGZyb20g
dGhlIGludGVyZXN0ZWQgc2V0Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmxzVG9Ob3RpZnku
c2l6ZSgpID09IG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29ucy5zaXplKCkpCi0gICAgICAgICAg
ICAgICAgICAgICAgICBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMuY2xlYXIoKTsKLSAgICAg
ICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8m
IHVybCA6IHVybHNUb05vdGlmeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BhZ2VV
UkxzSW50ZXJlc3RlZEluSWNvbnMucmVtb3ZlKHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpCi0gICAgICAgICAgICByZXR1cm4gZGlkQW55
V29yazsKLQotICAgICAgICAvLyBOb3cgdGhhdCB3ZSBkb24ndCBob2xkIGFueSBsb2NrcywgcGVy
Zm9ybSB0aGUgYWN0dWFsIG5vdGlmaWNhdGlvbnMKLSAgICAgICAgZm9yIChIYXNoU2V0PFN0cmlu
Zz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdXJsc1RvTm90aWZ5LmJlZ2luKCksIGVuZCA9IHVybHNU
b05vdGlmeS5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBMT0coSWNvbkRh
dGFiYXNlLCAiTm90aWZ5aW5nIGljb24gcmVjZWl2ZWQgZm9yIHBhZ2VVUkwgJXMiLCB1cmxGb3JM
b2dnaW5nKCppdCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICAgICAgZGlzcGF0Y2hEaWRJbXBv
cnRJY29uRGF0YUZvclBhZ2VVUkxPbk1haW5UaHJlYWQoKml0KTsKLSAgICAgICAgICAgIGlmIChz
aG91bGRTdG9wVGhyZWFkQWN0aXZpdHkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZGlkQW55
V29yazsKLSAgICAgICAgfQotCi0gICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJEb25lIG5vdGlm
eWluZyAlaSBwYWdlVVJMcyB3aG8ganVzdCByZWNlaXZlZCB0aGVpciBpY29ucyIsIHVybHNUb05v
dGlmeS5zaXplKCkpOwotICAgICAgICB1cmxzVG9Ob3RpZnkuY2xlYXIoKTsKLQotICAgICAgICBp
ZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpCi0gICAgICAgICAgICByZXR1cm4gZGlkQW55
V29yazsKLSAgICB9Ci0KLSNpZiAhTE9HX0RJU0FCTEVECi0gICAgU2Vjb25kcyBkZWx0YSA9IE1v
bm90b25pY1RpbWU6Om5vdygpIC0gdGltZVN0YW1wOwotICAgIExPRyhJY29uRGF0YWJhc2UsICJS
ZWFkaW5nIGZyb20gZGF0YWJhc2UgdG9vayAlLjRmIHNlY29uZHMiLCBkZWx0YS52YWx1ZSgpKTsK
LSNlbmRpZgotCi0gICAgcmV0dXJuIGRpZEFueVdvcms7Ci19Ci0KLWJvb2wgSWNvbkRhdGFiYXNl
Ojp3cml0ZVRvRGF0YWJhc2UoKQotewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0K
LSNpZiAhTE9HX0RJU0FCTEVECi0gICAgTW9ub3RvbmljVGltZSB0aW1lU3RhbXAgPSBNb25vdG9u
aWNUaW1lOjpub3coKTsKLSNlbmRpZgotCi0gICAgYm9vbCBkaWRBbnlXb3JrID0gZmFsc2U7Ci0K
LSAgICAvLyBXZSBjYW4gY29weSB0aGUgY3VycmVudCB3b3JrIHF1ZXVlIHRoZW4gY2xlYXIgaXQg
b3V0IC0gSWYgYW55IG5ldyB3b3JrIGNvbWVzIGluIHdoaWxlIHdlJ3JlIHdyaXRpbmcgb3V0LAot
ICAgIC8vIHdlJ2xsIHBpY2sgaXQgdXAgb24gdGhlIG5leHQgcGFzcy4gVGhpcyBncmVhdGx5IHNp
bXBsaWZpZXMgdGhlIGxvY2tpbmcgc3RyYXRlZ3kgZm9yIHRoaXMgbWV0aG9kIGFuZCByZW1haW5z
IGNvaGVzaXZlIHdpdGggY2hhbmdlcwotICAgIC8vIGFza2VkIGZvciBieSB0aGUgZGF0YWJhc2Ug
b24gdGhlIG1haW4gdGhyZWFkCi0gICAgewotICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3Vy
bEFuZEljb25Mb2NrKTsKLSAgICAgICAgVmVjdG9yPEljb25TbmFwc2hvdD4gaWNvblNuYXBzaG90
czsKLSAgICAgICAgVmVjdG9yPFBhZ2VVUkxTbmFwc2hvdD4gcGFnZVNuYXBzaG90czsKLSAgICAg
ICAgewotICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nU3luY0xvY2spOwot
Ci0gICAgICAgICAgICBpY29uU25hcHNob3RzLmFwcGVuZFJhbmdlKG1faWNvbnNQZW5kaW5nU3lu
Yy5iZWdpbigpLnZhbHVlcygpLCBtX2ljb25zUGVuZGluZ1N5bmMuZW5kKCkudmFsdWVzKCkpOwot
ICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdTeW5jLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIHBh
Z2VTbmFwc2hvdHMuYXBwZW5kUmFuZ2UobV9wYWdlVVJMc1BlbmRpbmdTeW5jLmJlZ2luKCkudmFs
dWVzKCksIG1fcGFnZVVSTHNQZW5kaW5nU3luYy5lbmQoKS52YWx1ZXMoKSk7Ci0gICAgICAgICAg
ICBtX3BhZ2VVUkxzUGVuZGluZ1N5bmMuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
IChpY29uU25hcHNob3RzLnNpemUoKSB8fCBwYWdlU25hcHNob3RzLnNpemUoKSkKLSAgICAgICAg
ICAgIGRpZEFueVdvcmsgPSB0cnVlOwotCi0gICAgICAgIFNRTGl0ZVRyYW5zYWN0aW9uIHN5bmNU
cmFuc2FjdGlvbihtX3N5bmNEQik7Ci0gICAgICAgIHN5bmNUcmFuc2FjdGlvbi5iZWdpbigpOwot
Ci0gICAgICAgIGZvciAoYXV0byYgc25hcHNob3QgOiBpY29uU25hcHNob3RzKSB7Ci0gICAgICAg
ICAgICB3cml0ZUljb25TbmFwc2hvdFRvU1FMRGF0YWJhc2Uoc25hcHNob3QpOwotICAgICAgICAg
ICAgTE9HKEljb25EYXRhYmFzZSwgIldyb3RlIEljb25SZWNvcmQgZm9yIEljb25VUkwgJXMgd2l0
aCB0aW1lU3RhbXAgb2YgJWkgdG8gdGhlIERCIiwgdXJsRm9yTG9nZ2luZyhzbmFwc2hvdC5pY29u
VVJMKCkpLmFzY2lpKCkuZGF0YSgpLCBzbmFwc2hvdC50aW1lc3RhbXAoKSk7Ci0gICAgICAgIH0K
LQotICAgICAgICBmb3IgKGF1dG8mIHNuYXBzaG90IDogcGFnZVNuYXBzaG90cykgewotICAgICAg
ICAgICAgLy8gSWYgdGhlIGljb24gVVJMIGlzIGVtcHR5LCB0aGlzIHBhZ2UgaXMgbWVhbnQgdG8g
YmUgZGVsZXRlZAotICAgICAgICAgICAgLy8gQVNTRVJUcyBhcmUgc2FuaXR5IGNoZWNrcyB0byBt
YWtlIHN1cmUgdGhlIG1hcHBpbmdzIGV4aXN0IGlmIHRoZXkgc2hvdWxkIGFuZCBkb24ndCBpZiB0
aGV5IHNob3VsZG4ndAotICAgICAgICAgICAgaWYgKHNuYXBzaG90Lmljb25VUkwoKS5pc0VtcHR5
KCkpCi0gICAgICAgICAgICAgICAgcmVtb3ZlUGFnZVVSTEZyb21TUUxEYXRhYmFzZShzbmFwc2hv
dC5wYWdlVVJMKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNldEljb25V
UkxGb3JQYWdlVVJMSW5TUUxEYXRhYmFzZShzbmFwc2hvdC5pY29uVVJMKCksIHNuYXBzaG90LnBh
Z2VVUkwoKSk7Ci0gICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiQ29tbWl0dGVkIEljb25V
UkwgZm9yIFBhZ2VVUkwgJXMgdG8gZGF0YWJhc2UiLCB1cmxGb3JMb2dnaW5nKHNuYXBzaG90LnBh
Z2VVUkwoKSkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY1RyYW5z
YWN0aW9uLmNvbW1pdCgpOwotICAgIH0KLQotICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGVy
ZSBhcmUgbm8gZGFuZ2xpbmcgUGFnZVVSTHMgLSBJZiB0aGVyZSBhcmUsIHdlIHdhbnQgdG8gb3V0
cHV0IG9uZSBsb2cgbWVzc2FnZSBidXQgbm90IHNwYW0gdGhlIGNvbnNvbGUgcG90ZW50aWFsbHkg
ZXZlcnkgZmV3IHNlY29uZHMKLSAgICBpZiAoZGlkQW55V29yaykKLSAgICAgICAgY2hlY2tGb3JE
YW5nbGluZ1BhZ2VVUkxzKGZhbHNlKTsKLQotI2lmICFMT0dfRElTQUJMRUQKLSAgICBTZWNvbmRz
IGRlbHRhID0gTW9ub3RvbmljVGltZTo6bm93KCkgLSB0aW1lU3RhbXA7Ci0gICAgTE9HKEljb25E
YXRhYmFzZSwgIlVwZGF0aW5nIHRoZSBkYXRhYmFzZSB0b29rICUuNGYgc2Vjb25kcyIsIGRlbHRh
LnZhbHVlKCkpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gZGlkQW55V29yazsKLX0KLQotdm9pZCBJ
Y29uRGF0YWJhc2U6OnBydW5lVW5yZXRhaW5lZEljb25zKCkKLXsKLSAgICBBU1NFUlRfSUNPTl9T
WU5DX1RIUkVBRCgpOwotCi0gICAgaWYgKCFpc09wZW4oKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIHJ1bgotICAg
IEFTU0VSVCghbV9pbml0aWFsUHJ1bmluZ0NvbXBsZXRlKTsKLQotICAgIC8vIFRoaXMgbWV0aG9k
IHJlbGllcyBvbiBoYXZpbmcgcmVhZCBpbiBhbGwgcGFnZSBVUkxzIGZyb20gdGhlIGRhdGFiYXNl
IGVhcmxpZXIuCi0gICAgQVNTRVJUKG1faWNvblVSTEltcG9ydENvbXBsZXRlKTsKLQotICAgIC8v
IEdldCB0aGUga25vd24gUGFnZVVSTHMgZnJvbSB0aGUgZGIsIGFuZCByZWNvcmQgdGhlIElEIG9m
IGFueSB0aGF0IGFyZSBub3QgaW4gdGhlIHJldGFpbiBjb3VudCBzZXQuCi0gICAgVmVjdG9yPGlu
dDY0X3Q+IHBhZ2VJRHNUb0RlbGV0ZTsKLQotICAgIFNRTGl0ZVN0YXRlbWVudCBwYWdlU1FMKG1f
c3luY0RCLCAiU0VMRUNUIHJvd2lkLCB1cmwgRlJPTSBQYWdlVVJMOyIpOwotICAgIHBhZ2VTUUwu
cHJlcGFyZSgpOwotCi0gICAgaW50IHJlc3VsdDsKLSAgICB3aGlsZSAoKHJlc3VsdCA9IHBhZ2VT
UUwuc3RlcCgpKSA9PSBTUUxJVEVfUk9XKSB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1f
dXJsQW5kSWNvbkxvY2spOwotICAgICAgICBpZiAoIW1fcGFnZVVSTFRvUmVjb3JkTWFwLmNvbnRh
aW5zKHBhZ2VTUUwuZ2V0Q29sdW1uVGV4dCgxKSkpCi0gICAgICAgICAgICBwYWdlSURzVG9EZWxl
dGUuYXBwZW5kKHBhZ2VTUUwuZ2V0Q29sdW1uSW50NjQoMCkpOwotICAgIH0KLQotICAgIGlmIChy
ZXN1bHQgIT0gU1FMSVRFX0RPTkUpCi0gICAgICAgIExPR19FUlJPUigiRXJyb3IgcmVhZGluZyBQ
YWdlVVJMIHRhYmxlIGZyb20gb24tZGlzayBEQiIpOwotICAgIHBhZ2VTUUwuZmluYWxpemUoKTsK
LQotICAgIC8vIERlbGV0ZSBwYWdlIFVSTHMgdGhhdCB3ZXJlIGluIHRoZSB0YWJsZSwgYnV0IG5v
dCBpbiBvdXIgcmV0YWluIGNvdW50IHNldC4KLSAgICBzaXplX3QgbnVtVG9EZWxldGUgPSBwYWdl
SURzVG9EZWxldGUuc2l6ZSgpOwotICAgIGlmIChudW1Ub0RlbGV0ZSkgewotICAgICAgICBTUUxp
dGVUcmFuc2FjdGlvbiBwcnVuaW5nVHJhbnNhY3Rpb24obV9zeW5jREIpOwotICAgICAgICBwcnVu
aW5nVHJhbnNhY3Rpb24uYmVnaW4oKTsKLQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcGFnZURl
bGV0ZVNRTChtX3N5bmNEQiwgIkRFTEVURSBGUk9NIFBhZ2VVUkwgV0hFUkUgcm93aWQgPSAoPyk7
Iik7Ci0gICAgICAgIHBhZ2VEZWxldGVTUUwucHJlcGFyZSgpOwotICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IG51bVRvRGVsZXRlOyArK2kpIHsKLSAgICAgICAgICAgIExPRyhJY29uRGF0
YWJhc2UsICJQcnVuaW5nIHBhZ2Ugd2l0aCByb3dpZCAlbGxpIGZyb20gZGlzayIsIHN0YXRpY19j
YXN0PGxvbmcgbG9uZz4ocGFnZUlEc1RvRGVsZXRlW2ldKSk7Ci0gICAgICAgICAgICBwYWdlRGVs
ZXRlU1FMLmJpbmRJbnQ2NCgxLCBwYWdlSURzVG9EZWxldGVbaV0pOwotICAgICAgICAgICAgaW50
IHJlc3VsdCA9IHBhZ2VEZWxldGVTUUwuc3RlcCgpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAh
PSBTUUxJVEVfRE9ORSkKLSAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZWQgdG8gZGVs
ZXRlIHBhZ2Ugd2l0aCBpZCAlbGxpIGZyb20gZGlzayIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4o
cGFnZUlEc1RvRGVsZXRlW2ldKSk7Ci0gICAgICAgICAgICBwYWdlRGVsZXRlU1FMLnJlc2V0KCk7
Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgd2FzIGFza2VkIHRvIHRlcm1pbmF0ZSwg
d2Ugc2hvdWxkIGNvbW1pdCB3aGF0IHBydW5pbmcgd2UndmUgZG9uZSBzbyBmYXIsIGZpZ3VyaW5n
IHdlIGNhbgotICAgICAgICAgICAgLy8gZmluaXNoIHRoZSByZXN0IGxhdGVyIChob3BlZnVsbHkp
Ci0gICAgICAgICAgICBpZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpIHsKLSAgICAgICAg
ICAgICAgICBwcnVuaW5nVHJhbnNhY3Rpb24uY29tbWl0KCk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xlYXJTdGF0ZW1lbnRzKCk7CisgICAg
ICAgICAgICBtX2RiLmNsZWFyQWxsVGFibGVzKCk7CisgICAgICAgICAgICBtX2RiLnJ1blZhY3V1
bUNvbW1hbmQoKTsKKyAgICAgICAgICAgIGNyZWF0ZVRhYmxlc0lmTmVlZGVkKCk7CiAgICAgICAg
IH0KLSAgICAgICAgcHJ1bmluZ1RyYW5zYWN0aW9uLmNvbW1pdCgpOwotICAgICAgICBwYWdlRGVs
ZXRlU1FMLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgLy8gRGVsZXRpbmcgdW5yZWZlcmVuY2Vk
IGljb25zIGZyb20gdGhlIEljb24gdGFibGVzIGhhcyB0byBiZSBhdG9taWMgLQotICAgIC8vIElm
IHRoZSB1c2VyIHF1aXRzIHdoaWxlIHRoZXNlIGFyZSB0YWtpbmcgcGxhY2UsIHRoZXkgbWlnaHQg
aGF2ZSB0byB3YWl0LiBUaGFua2Z1bGx5IHRoaXMgd2lsbCByYXJlbHkgYmUgYW4gaXNzdWUKLSAg
ICAvLyBBIHVzZXIgb24gYSBuZXR3b3JrIGhvbWUgZGlyZWN0b3J5IHdpdGggYSB3aWxkbHkgaW5j
b25zaXN0ZW50IGRhdGFiYXNlIG1pZ2h0IHNlZSBxdWl0ZSBhIHBhdXNlLi4uCi0KLSAgICBTUUxp
dGVUcmFuc2FjdGlvbiBwcnVuaW5nVHJhbnNhY3Rpb24obV9zeW5jREIpOwotICAgIHBydW5pbmdU
cmFuc2FjdGlvbi5iZWdpbigpOwotCi0gICAgLy8gV2lwZSBJY29ucyB0aGF0IGFyZW4ndCByZXRh
aW5lZAotICAgIGlmICghbV9zeW5jREIuZXhlY3V0ZUNvbW1hbmQoIkRFTEVURSBGUk9NIEljb25E
YXRhIFdIRVJFIGljb25JRCBOT1QgSU4gKFNFTEVDVCBpY29uSUQgRlJPTSBQYWdlVVJMKTsiKSkK
LSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZXhlY3V0ZSBTUUwgdG8gcHJ1bmUgdW5yZXRh
aW5lZCBpY29ucyBmcm9tIHRoZSBvbi1kaXNrIEljb25EYXRhIHRhYmxlIik7Ci0gICAgaWYgKCFt
X3N5bmNEQi5leGVjdXRlQ29tbWFuZCgiREVMRVRFIEZST00gSWNvbkluZm8gV0hFUkUgaWNvbklE
IE5PVCBJTiAoU0VMRUNUIGljb25JRCBGUk9NIFBhZ2VVUkwpOyIpKQotICAgICAgICBMT0dfRVJS
T1IoIkZhaWxlZCB0byBleGVjdXRlIFNRTCB0byBwcnVuZSB1bnJldGFpbmVkIGljb25zIGZyb20g
dGhlIG9uLWRpc2sgSWNvbkluZm8gdGFibGUiKTsKLQotICAgIHBydW5pbmdUcmFuc2FjdGlvbi5j
b21taXQoKTsKLQotICAgIGNoZWNrRm9yRGFuZ2xpbmdQYWdlVVJMcyh0cnVlKTsKLQotICAgIG1f
aW5pdGlhbFBydW5pbmdDb21wbGV0ZSA9IHRydWU7Ci19Ci0KLXZvaWQgSWNvbkRhdGFiYXNlOjpj
aGVja0ZvckRhbmdsaW5nUGFnZVVSTHMoYm9vbCBwcnVuZUlmRm91bmQpCi17Ci0gICAgQVNTRVJU
X0lDT05fU1lOQ19USFJFQUQoKTsKLQotICAgIC8vIFRoaXMgY2hlY2sgY2FuIGJlIHJlbGF0aXZl
bHkgZXhwZW5zaXZlIHNvIHdlIGRvbid0IGRvIGl0IGluIGEgcmVsZWFzZSBidWlsZCB1bmxlc3Mg
dGhlIGNhbGxlciBoYXMgYXNrZWQgdXMgdG8gcHJ1bmUgYW55IGRhbmdsaW5nCi0gICAgLy8gZW50
cmllcy4gV2UgYWxzbyBkb24ndCB3YW50IHRvIGtlZXAgcGVyZm9ybWluZyB0aGlzIGNoZWNrIGFu
ZCByZXBvcnRpbmcgdGhpcyBlcnJvciBpZiBpdCBoYXMgYWxyZWFkeSBmb3VuZCBkYW5nbGVycyBi
ZWZvcmUgc28gd2UKLSAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UndmUgZm91bmQgYW55
LiBXZSBza2lwIHRoZSBjaGVjayBpbiB0aGUgcmVsZWFzZSBidWlsZCBwcmV0ZW5kaW5nIHRvIGhh
dmUgYWxyZWFkeSBmb3VuZCBkYW5nbGVycyBhbHJlYWR5LgotI2lmbmRlZiBOREVCVUcKLSAgICBz
dGF0aWMgYm9vbCBkYW5nbGVyc0ZvdW5kID0gdHJ1ZTsKLSNlbHNlCi0gICAgc3RhdGljIGJvb2wg
ZGFuZ2xlcnNGb3VuZCA9IGZhbHNlOwotI2VuZGlmCi0KLSAgICBpZiAoKHBydW5lSWZGb3VuZCB8
fCAhZGFuZ2xlcnNGb3VuZCkgJiYgU1FMaXRlU3RhdGVtZW50KG1fc3luY0RCLCAiU0VMRUNUIHVy
bCBGUk9NIFBhZ2VVUkwgV0hFUkUgUGFnZVVSTC5pY29uSUQgTk9UIElOIChTRUxFQ1QgaWNvbklE
IEZST00gSWNvbkluZm8pIExJTUlUIDE7IikucmV0dXJuc0F0TGVhc3RPbmVSZXN1bHQoKSkgewot
ICAgICAgICBkYW5nbGVyc0ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgTE9HKEljb25EYXRhYmFzZSwg
IkRhbmdsaW5nIFBhZ2VVUkwgZW50cmllcyBmb3VuZCIpOwotICAgICAgICBpZiAocHJ1bmVJZkZv
dW5kICYmICFtX3N5bmNEQi5leGVjdXRlQ29tbWFuZCgiREVMRVRFIEZST00gUGFnZVVSTCBXSEVS
RSBpY29uSUQgTk9UIElOIChTRUxFQ1QgaWNvbklEIEZST00gSWNvbkluZm8pOyIpKQotICAgICAg
ICAgICAgTE9HKEljb25EYXRhYmFzZSwgIlVuYWJsZSB0byBwcnVuZSBkYW5nbGluZyBQYWdlVVJM
cyIpOwotICAgIH0KLX0KLQotdm9pZCBJY29uRGF0YWJhc2U6OnJlbW92ZUFsbEljb25zT25UaHJl
YWQoKQotewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICBMT0coSWNvbkRh
dGFiYXNlLCAiUmVtb3ZpbmcgYWxsIGljb25zIG9uIHRoZSBzeW5jIHRocmVhZCIpOwotCi0gICAg
Ly8gRGVsZXRlIGFsbCB0aGUgcHJlcGFyZWQgc3RhdGVtZW50cyBzbyB0aGV5IGNhbiBzdGFydCBv
dmVyCi0gICAgZGVsZXRlQWxsUHJlcGFyZWRTdGF0ZW1lbnRzKCk7Ci0KLSAgICAvLyBUbyByZXNl
dCB0aGUgb24tZGlzayBkYXRhYmFzZSwgd2UnbGwgd2lwZSBhbGwgaXRzIHRhYmxlcyB0aGVuIHZh
Y3V1bSBpdAotICAgIC8vIFRoaXMgaXMgZWFzaWVyIGFuZCBzYWZlciB0aGFuIGNsb3NpbmcgaXQs
IGRlbGV0aW5nIHRoZSBmaWxlLCBhbmQgcmVjcmVhdGluZyBmcm9tIHNjcmF0Y2gKLSAgICBtX3N5
bmNEQi5jbGVhckFsbFRhYmxlcygpOwotICAgIG1fc3luY0RCLnJ1blZhY3V1bUNvbW1hbmQoKTsK
LSAgICBjcmVhdGVEYXRhYmFzZVRhYmxlcyhtX3N5bmNEQik7Ci19Ci0KLXZvaWQgSWNvbkRhdGFi
YXNlOjpkZWxldGVBbGxQcmVwYXJlZFN0YXRlbWVudHMoKQotewotICAgIEFTU0VSVF9JQ09OX1NZ
TkNfVEhSRUFEKCk7Ci0KLSAgICBtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQgPSBudWxs
cHRyOwotICAgIG1fcmVtb3ZlUGFnZVVSTFN0YXRlbWVudCA9IG51bGxwdHI7Ci0gICAgbV9nZXRJ
Y29uSURGb3JJY29uVVJMU3RhdGVtZW50ID0gbnVsbHB0cjsKLSAgICBtX2dldEltYWdlRGF0YUZv
ckljb25VUkxTdGF0ZW1lbnQgPSBudWxscHRyOwotICAgIG1fYWRkSWNvblRvSWNvbkluZm9TdGF0
ZW1lbnQgPSBudWxscHRyOwotICAgIG1fYWRkSWNvblRvSWNvbkRhdGFTdGF0ZW1lbnQgPSBudWxs
cHRyOwotICAgIG1fZ2V0SW1hZ2VEYXRhU3RhdGVtZW50ID0gbnVsbHB0cjsKLSAgICBtX2RlbGV0
ZVBhZ2VVUkxzRm9ySWNvblVSTFN0YXRlbWVudCA9IG51bGxwdHI7Ci0gICAgbV9kZWxldGVJY29u
RnJvbUljb25JbmZvU3RhdGVtZW50ID0gbnVsbHB0cjsKLSAgICBtX2RlbGV0ZUljb25Gcm9tSWNv
bkRhdGFTdGF0ZW1lbnQgPSBudWxscHRyOwotICAgIG1fdXBkYXRlSWNvbkluZm9TdGF0ZW1lbnQg
PSBudWxscHRyOwotICAgIG1fdXBkYXRlSWNvbkRhdGFTdGF0ZW1lbnQgID0gbnVsbHB0cjsKLSAg
ICBtX3NldEljb25JbmZvU3RhdGVtZW50ID0gbnVsbHB0cjsKLSAgICBtX3NldEljb25EYXRhU3Rh
dGVtZW50ID0gbnVsbHB0cjsKLX0KLQotdm9pZCogSWNvbkRhdGFiYXNlOjpjbGVhbnVwU3luY1Ro
cmVhZCgpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKLQotI2lmICFMT0dfRElT
QUJMRUQKLSAgICBNb25vdG9uaWNUaW1lIHRpbWVTdGFtcCA9IE1vbm90b25pY1RpbWU6Om5vdygp
OwotI2VuZGlmCi0KLSAgICAvLyBJZiB0aGUgcmVtb3ZlSWNvbnMgZmxhZyBpcyBzZXQsIHJlbW92
ZSBhbGwgaWNvbnMgZnJvbSB0aGUgZGIuCi0gICAgaWYgKG1fcmVtb3ZlSWNvbnNSZXF1ZXN0ZWQp
Ci0gICAgICAgIHJlbW92ZUFsbEljb25zT25UaHJlYWQoKTsKLQotICAgIC8vIFN5bmMgcmVtYWlu
aW5nIGljb25zIG91dAotICAgIExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBEb2luZyBmaW5h
bCB3cml0ZW91dCBhbmQgY2xvc3VyZSBvZiBzeW5jIHRocmVhZCIpOwotICAgIHdyaXRlVG9EYXRh
YmFzZSgpOwotCi0gICAgLy8gQ2xvc2UgdGhlIGRhdGFiYXNlCi0gICAgTG9ja0hvbGRlciBsb2Nr
ZXIobV9zeW5jTG9jayk7Ci0KLSAgICBtX2RhdGFiYXNlRGlyZWN0b3J5ID0gU3RyaW5nKCk7Ci0g
ICAgbV9jb21wbGV0ZURhdGFiYXNlUGF0aCA9IFN0cmluZygpOwotICAgIGRlbGV0ZUFsbFByZXBh
cmVkU3RhdGVtZW50cygpOwotICAgIG1fc3luY0RCLmNsb3NlKCk7Ci0KLSNpZiAhTE9HX0RJU0FC
TEVECi0gICAgU2Vjb25kcyBkZWx0YSA9IE1vbm90b25pY1RpbWU6Om5vdygpIC0gdGltZVN0YW1w
OwotICAgIExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBGaW5hbCBjbG9zdXJlIHRvb2sgJS40
ZiBzZWNvbmRzIiwgZGVsdGEudmFsdWUoKSk7Ci0jZW5kaWYKLQotICAgIG1fc3luY1RocmVhZFJ1
bm5pbmcgPSBmYWxzZTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotLy8gcmVhZHlTUUxpdGVT
dGF0ZW1lbnQoKSBoYW5kbGVzIHR3byB0aGluZ3MKLS8vIDEgLSBJZiB0aGUgU1FMRGF0YWJhc2Um
IGFyZ3VtZW50IGlzIGRpZmZlcmVudCwgdGhlIHN0YXRlbWVudCBtdXN0IGJlIGRlc3Ryb3llZCBh
bmQgcmVtYWRlLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgdXNlcgotLy8gICAgIHN3aXRjaGVzIHRv
IGFuZCBmcm9tIHByaXZhdGUgYnJvd3NpbmcKLS8vIDIgLSBMYXp5IGNvbnN0cnVjdGlvbiBvZiB0
aGUgU3RhdGVtZW50IGluIHRoZSBmaXJzdCBwbGFjZSwgaW4gY2FzZSB3ZSd2ZSBuZXZlciBtYWRl
IHRoaXMgcXVlcnkgYmVmb3JlCi1pbmxpbmUgdm9pZCByZWFkeVNRTGl0ZVN0YXRlbWVudChzdGQ6
OnVuaXF1ZV9wdHI8U1FMaXRlU3RhdGVtZW50PiYgc3RhdGVtZW50LCBTUUxpdGVEYXRhYmFzZSYg
ZGIsIGNvbnN0IFN0cmluZyYgc3RyKQotewotICAgIGlmIChzdGF0ZW1lbnQgJiYgKCZzdGF0ZW1l
bnQtPmRhdGFiYXNlKCkgIT0gJmRiIHx8IHN0YXRlbWVudC0+aXNFeHBpcmVkKCkpKSB7Ci0gICAg
ICAgIGlmIChzdGF0ZW1lbnQtPmlzRXhwaXJlZCgpKQotICAgICAgICAgICAgTE9HKEljb25EYXRh
YmFzZSwgIlNRTGl0ZVN0YXRlbWVudCBhc3NvY2lhdGVkIHdpdGggJXMgaXMgZXhwaXJlZCIsIHN0
ci5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHN0YXRlbWVudCA9IG51bGxwdHI7Ci0gICAgfQot
ICAgIGlmICghc3RhdGVtZW50KSB7Ci0gICAgICAgIHN0YXRlbWVudCA9IG1ha2VVbmlxdWU8U1FM
aXRlU3RhdGVtZW50PihkYiwgc3RyKTsKLSAgICAgICAgaWYgKHN0YXRlbWVudC0+cHJlcGFyZSgp
ICE9IFNRTElURV9PSykKLSAgICAgICAgICAgIExPR19FUlJPUigiUHJlcGFyaW5nIHN0YXRlbWVu
dCAlcyBmYWlsZWQiLCBzdHIuYXNjaWkoKS5kYXRhKCkpOwotICAgIH0KLX0KLQotdm9pZCBJY29u
RGF0YWJhc2U6OnNldEljb25VUkxGb3JQYWdlVVJMSW5TUUxEYXRhYmFzZShjb25zdCBTdHJpbmcm
IGljb25VUkwsIGNvbnN0IFN0cmluZyYgcGFnZVVSTCkKLXsKLSAgICBBU1NFUlRfSUNPTl9TWU5D
X1RIUkVBRCgpOwotCi0gICAgaW50NjRfdCBpY29uSUQgPSBnZXRJY29uSURGb3JJY29uVVJMRnJv
bVNRTERhdGFiYXNlKGljb25VUkwpOwotCi0gICAgaWYgKCFpY29uSUQpCi0gICAgICAgIGljb25J
RCA9IGFkZEljb25VUkxUb1NRTERhdGFiYXNlKGljb25VUkwpOwotCi0gICAgaWYgKCFpY29uSUQp
IHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZXN0YWJsaXNoIGFuIElEIGZvciBpY29u
VVJMICVzIiwgdXJsRm9yTG9nZ2luZyhpY29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2V0
SWNvbklERm9yUGFnZVVSTEluU1FMRGF0YWJhc2UoaWNvbklELCBwYWdlVVJMKTsKLX0KLQotdm9p
ZCBJY29uRGF0YWJhc2U6OnNldEljb25JREZvclBhZ2VVUkxJblNRTERhdGFiYXNlKGludDY0X3Qg
aWNvbklELCBjb25zdCBTdHJpbmcmIHBhZ2VVUkwpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19U
SFJFQUQoKTsKLQotICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fc2V0SWNvbklERm9yUGFnZVVS
TFN0YXRlbWVudCwgbV9zeW5jREIsICJJTlNFUlQgSU5UTyBQYWdlVVJMICh1cmwsIGljb25JRCkg
VkFMVUVTICgoPyksID8pOyIpOwotICAgIG1fc2V0SWNvbklERm9yUGFnZVVSTFN0YXRlbWVudC0+
YmluZFRleHQoMSwgcGFnZVVSTCk7Ci0gICAgbV9zZXRJY29uSURGb3JQYWdlVVJMU3RhdGVtZW50
LT5iaW5kSW50NjQoMiwgaWNvbklEKTsKLQotICAgIGludCByZXN1bHQgPSBtX3NldEljb25JREZv
clBhZ2VVUkxTdGF0ZW1lbnQtPnN0ZXAoKTsKLSAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05F
KSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBMT0dfRVJST1IoInNl
dEljb25JREZvclBhZ2VVUkxRdWVyeSBmYWlsZWQgZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmco
cGFnZVVSTCkuYXNjaWkoKS5kYXRhKCkpOwotICAgIH0KLQotICAgIG1fc2V0SWNvbklERm9yUGFn
ZVVSTFN0YXRlbWVudC0+cmVzZXQoKTsKLX0KLQotdm9pZCBJY29uRGF0YWJhc2U6OnJlbW92ZVBh
Z2VVUkxGcm9tU1FMRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBwYWdlVVJMKQotewotICAgIEFTU0VS
VF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX3JlbW92
ZVBhZ2VVUkxTdGF0ZW1lbnQsIG1fc3luY0RCLCAiREVMRVRFIEZST00gUGFnZVVSTCBXSEVSRSB1
cmwgPSAoPyk7Iik7Ci0gICAgbV9yZW1vdmVQYWdlVVJMU3RhdGVtZW50LT5iaW5kVGV4dCgxLCBw
YWdlVVJMKTsKLQotICAgIGlmIChtX3JlbW92ZVBhZ2VVUkxTdGF0ZW1lbnQtPnN0ZXAoKSAhPSBT
UUxJVEVfRE9ORSkKLSAgICAgICAgTE9HX0VSUk9SKCJyZW1vdmVQYWdlVVJMRnJvbVNRTERhdGFi
YXNlIGZhaWxlZCBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhwYWdlVVJMKS5hc2NpaSgpLmRh
dGEoKSk7Ci0KLSAgICBtX3JlbW92ZVBhZ2VVUkxTdGF0ZW1lbnQtPnJlc2V0KCk7Ci19Ci0KLQot
aW50NjRfdCBJY29uRGF0YWJhc2U6OmdldEljb25JREZvckljb25VUkxGcm9tU1FMRGF0YWJhc2Uo
Y29uc3QgU3RyaW5nJiBpY29uVVJMKQotewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7
Ci0KLSAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX2dldEljb25JREZvckljb25VUkxTdGF0ZW1l
bnQsIG1fc3luY0RCLCAiU0VMRUNUIEljb25JbmZvLmljb25JRCBGUk9NIEljb25JbmZvIFdIRVJF
IEljb25JbmZvLnVybCA9ICg/KTsiKTsKLSAgICBtX2dldEljb25JREZvckljb25VUkxTdGF0ZW1l
bnQtPmJpbmRUZXh0KDEsIGljb25VUkwpOwotCi0gICAgaW50NjRfdCByZXN1bHQgPSBtX2dldElj
b25JREZvckljb25VUkxTdGF0ZW1lbnQtPnN0ZXAoKTsKLSAgICBpZiAocmVzdWx0ID09IFNRTElU
RV9ST1cpCi0gICAgICAgIHJlc3VsdCA9IG1fZ2V0SWNvbklERm9ySWNvblVSTFN0YXRlbWVudC0+
Z2V0Q29sdW1uSW50NjQoMCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gU1FM
SVRFX0RPTkUpCi0gICAgICAgICAgICBMT0dfRVJST1IoImdldEljb25JREZvckljb25VUkxGcm9t
U1FMRGF0YWJhc2UgZmFpbGVkIGZvciB1cmwgJXMiLCB1cmxGb3JMb2dnaW5nKGljb25VUkwpLmFz
Y2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICB9Ci0KLSAgICBtX2dldElj
b25JREZvckljb25VUkxTdGF0ZW1lbnQtPnJlc2V0KCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0K
LQotaW50NjRfdCBJY29uRGF0YWJhc2U6OmFkZEljb25VUkxUb1NRTERhdGFiYXNlKGNvbnN0IFN0
cmluZyYgaWNvblVSTCkKLXsKLSAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOwotCi0gICAg
Ly8gVGhlcmUgd291bGQgYmUgYSB0cmFuc2FjdGlvbiBoZXJlIHRvIG1ha2Ugc3VyZSB0aGVzZSB0
d28gaW5zZXJ0cyBhcmUgYXRvbWljCi0gICAgLy8gSW4gcHJhY3RpY2UgdGhlIG9ubHkgY2FsbGVy
IG9mIHRoaXMgbWV0aG9kIGlzIGFsd2F5cyB3cmFwcGVkIGluIGEgdHJhbnNhY3Rpb24gaXRzZWxm
IHNvIHBsYWNpbmcgYW5vdGhlcgotICAgIC8vIGhlcmUgaXMgdW5uZWNlc3NhcnkKLQotICAgIHJl
YWR5U1FMaXRlU3RhdGVtZW50KG1fYWRkSWNvblRvSWNvbkluZm9TdGF0ZW1lbnQsIG1fc3luY0RC
LCAiSU5TRVJUIElOVE8gSWNvbkluZm8gKHVybCwgc3RhbXApIFZBTFVFUyAoPywgMCk7Iik7Ci0g
ICAgbV9hZGRJY29uVG9JY29uSW5mb1N0YXRlbWVudC0+YmluZFRleHQoMSwgaWNvblVSTCk7Ci0K
LSAgICBpbnQgcmVzdWx0ID0gbV9hZGRJY29uVG9JY29uSW5mb1N0YXRlbWVudC0+c3RlcCgpOwot
ICAgIG1fYWRkSWNvblRvSWNvbkluZm9TdGF0ZW1lbnQtPnJlc2V0KCk7Ci0gICAgaWYgKHJlc3Vs
dCAhPSBTUUxJVEVfRE9ORSkgewotICAgICAgICBMT0dfRVJST1IoImFkZEljb25VUkxUb1NRTERh
dGFiYXNlIGZhaWxlZCB0byBpbnNlcnQgJXMgaW50byBJY29uSW5mbyIsIHVybEZvckxvZ2dpbmco
aWNvblVSTCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAg
aW50NjRfdCBpY29uSUQgPSBtX3N5bmNEQi5sYXN0SW5zZXJ0Um93SUQoKTsKLQotICAgIHJlYWR5
U1FMaXRlU3RhdGVtZW50KG1fYWRkSWNvblRvSWNvbkRhdGFTdGF0ZW1lbnQsIG1fc3luY0RCLCAi
SU5TRVJUIElOVE8gSWNvbkRhdGEgKGljb25JRCwgZGF0YSkgVkFMVUVTICg/LCA/KTsiKTsKLSAg
ICBtX2FkZEljb25Ub0ljb25EYXRhU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKTsKLQot
ICAgIHJlc3VsdCA9IG1fYWRkSWNvblRvSWNvbkRhdGFTdGF0ZW1lbnQtPnN0ZXAoKTsKLSAgICBt
X2FkZEljb25Ub0ljb25EYXRhU3RhdGVtZW50LT5yZXNldCgpOwotICAgIGlmIChyZXN1bHQgIT0g
U1FMSVRFX0RPTkUpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJhZGRJY29uVVJMVG9TUUxEYXRhYmFz
ZSBmYWlsZWQgdG8gaW5zZXJ0ICVzIGludG8gSWNvbkRhdGEiLCB1cmxGb3JMb2dnaW5nKGljb25V
UkwpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0
dXJuIGljb25JRDsKLX0KLQotUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gSWNvbkRhdGFiYXNlOjpnZXRJ
bWFnZURhdGFGb3JJY29uVVJMRnJvbVNRTERhdGFiYXNlKGNvbnN0IFN0cmluZyYgaWNvblVSTCkK
LXsKLSAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOwotCi0gICAgUmVmUHRyPFNoYXJlZEJ1
ZmZlcj4gaW1hZ2VEYXRhOwotCi0gICAgcmVhZHlTUUxpdGVTdGF0ZW1lbnQobV9nZXRJbWFnZURh
dGFGb3JJY29uVVJMU3RhdGVtZW50LCBtX3N5bmNEQiwgIlNFTEVDVCBJY29uRGF0YS5kYXRhIEZS
T00gSWNvbkRhdGEgV0hFUkUgSWNvbkRhdGEuaWNvbklEIElOIChTRUxFQ1QgaWNvbklEIEZST00g
SWNvbkluZm8gV0hFUkUgSWNvbkluZm8udXJsID0gKD8pKTsiKTsKLSAgICBtX2dldEltYWdlRGF0
YUZvckljb25VUkxTdGF0ZW1lbnQtPmJpbmRUZXh0KDEsIGljb25VUkwpOwotCi0gICAgaW50IHJl
c3VsdCA9IG1fZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTFN0YXRlbWVudC0+c3RlcCgpOwotICAgIGlm
IChyZXN1bHQgPT0gU1FMSVRFX1JPVykgewotICAgICAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKLSAg
ICAgICAgbV9nZXRJbWFnZURhdGFGb3JJY29uVVJMU3RhdGVtZW50LT5nZXRDb2x1bW5CbG9iQXNW
ZWN0b3IoMCwgZGF0YSk7Ci0gICAgICAgIGltYWdlRGF0YSA9IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRl
KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gU1FM
SVRFX0RPTkUpCi0gICAgICAgIExPR19FUlJPUigiZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTEZyb21T
UUxEYXRhYmFzZSBmYWlsZWQgZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmcoaWNvblVSTCkuYXNj
aWkoKS5kYXRhKCkpOwotCi0gICAgbV9nZXRJbWFnZURhdGFGb3JJY29uVVJMU3RhdGVtZW50LT5y
ZXNldCgpOwotCi0gICAgcmV0dXJuIGltYWdlRGF0YTsKLX0KLQotdm9pZCBJY29uRGF0YWJhc2U6
OnJlbW92ZUljb25Gcm9tU1FMRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBpY29uVVJMKQotewotICAg
IEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICBpZiAoaWNvblVSTC5pc0VtcHR5KCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFRoZXJlIHdvdWxkIGJlIGEgdHJhbnNhY3Rpb24g
aGVyZSB0byBtYWtlIHN1cmUgdGhlc2UgcmVtb3ZhbHMgYXJlIGF0b21pYwotICAgIC8vIEluIHBy
YWN0aWNlIHRoZSBvbmx5IGNhbGxlciBvZiB0aGlzIG1ldGhvZCBpcyBhbHdheXMgd3JhcHBlZCBp
biBhIHRyYW5zYWN0aW9uIGl0c2VsZiBzbyBwbGFjaW5nIGFub3RoZXIgaGVyZSBpcyB1bm5lY2Vz
c2FyeQotCi0gICAgLy8gSXQncyBwb3NzaWJsZSB0aGlzIGljb24gaXMgbm90IGluIHRoZSBkYXRh
YmFzZSBiZWNhdXNlIG9mIGNlcnRhaW4gcmFwaWQgYnJvd3NpbmcgcGF0dGVybnMgKHN1Y2ggYXMg
YSBzdHJlc3MgdGVzdCkgd2hlcmUgdGhlCi0gICAgLy8gaWNvbiBpcyBtYXJrZWQgdG8gYmUgYWRk
ZWQgdGhlbiBtYXJrZWQgZm9yIHJlbW92YWwgYmVmb3JlIGl0IGlzIGV2ZXIgd3JpdHRlbiB0byBk
aXNrLiBObyBiaWcgZGVhbCwgZWFybHkgcmV0dXJuCi0gICAgaW50NjRfdCBpY29uSUQgPSBnZXRJ
Y29uSURGb3JJY29uVVJMRnJvbVNRTERhdGFiYXNlKGljb25VUkwpOwotICAgIGlmICghaWNvbklE
KQotICAgICAgICByZXR1cm47Ci0KLSAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX2RlbGV0ZVBh
Z2VVUkxzRm9ySWNvblVSTFN0YXRlbWVudCwgbV9zeW5jREIsICJERUxFVEUgRlJPTSBQYWdlVVJM
IFdIRVJFIFBhZ2VVUkwuaWNvbklEID0gKD8pOyIpOwotICAgIG1fZGVsZXRlUGFnZVVSTHNGb3JJ
Y29uVVJMU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKTsKLQotICAgIGlmIChtX2RlbGV0
ZVBhZ2VVUkxzRm9ySWNvblVSTFN0YXRlbWVudC0+c3RlcCgpICE9IFNRTElURV9ET05FKQotICAg
ICAgICBMT0dfRVJST1IoIm1fZGVsZXRlUGFnZVVSTHNGb3JJY29uVVJMU3RhdGVtZW50IGZhaWxl
ZCBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhpY29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7Ci0K
LSAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX2RlbGV0ZUljb25Gcm9tSWNvbkluZm9TdGF0ZW1l
bnQsIG1fc3luY0RCLCAiREVMRVRFIEZST00gSWNvbkluZm8gV0hFUkUgSWNvbkluZm8uaWNvbklE
ID0gKD8pOyIpOwotICAgIG1fZGVsZXRlSWNvbkZyb21JY29uSW5mb1N0YXRlbWVudC0+YmluZElu
dDY0KDEsIGljb25JRCk7Ci0KLSAgICBpZiAobV9kZWxldGVJY29uRnJvbUljb25JbmZvU3RhdGVt
ZW50LT5zdGVwKCkgIT0gU1FMSVRFX0RPTkUpCi0gICAgICAgIExPR19FUlJPUigibV9kZWxldGVJ
Y29uRnJvbUljb25JbmZvU3RhdGVtZW50IGZhaWxlZCBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2lu
ZyhpY29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7Ci0KLSAgICByZWFkeVNRTGl0ZVN0YXRlbWVudCht
X2RlbGV0ZUljb25Gcm9tSWNvbkRhdGFTdGF0ZW1lbnQsIG1fc3luY0RCLCAiREVMRVRFIEZST00g
SWNvbkRhdGEgV0hFUkUgSWNvbkRhdGEuaWNvbklEID0gKD8pOyIpOwotICAgIG1fZGVsZXRlSWNv
bkZyb21JY29uRGF0YVN0YXRlbWVudC0+YmluZEludDY0KDEsIGljb25JRCk7Ci0KLSAgICBpZiAo
bV9kZWxldGVJY29uRnJvbUljb25EYXRhU3RhdGVtZW50LT5zdGVwKCkgIT0gU1FMSVRFX0RPTkUp
Ci0gICAgICAgIExPR19FUlJPUigibV9kZWxldGVJY29uRnJvbUljb25EYXRhU3RhdGVtZW50IGZh
aWxlZCBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhpY29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7
Ci0KLSAgICBtX2RlbGV0ZVBhZ2VVUkxzRm9ySWNvblVSTFN0YXRlbWVudC0+cmVzZXQoKTsKLSAg
ICBtX2RlbGV0ZUljb25Gcm9tSWNvbkluZm9TdGF0ZW1lbnQtPnJlc2V0KCk7Ci0gICAgbV9kZWxl
dGVJY29uRnJvbUljb25EYXRhU3RhdGVtZW50LT5yZXNldCgpOwotfQotCi12b2lkIEljb25EYXRh
YmFzZTo6d3JpdGVJY29uU25hcHNob3RUb1NRTERhdGFiYXNlKGNvbnN0IEljb25TbmFwc2hvdCYg
c25hcHNob3QpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKLQotICAgIGlmIChz
bmFwc2hvdC5pY29uVVJMKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBB
IG51bGxlZCBvdXQgdGltZXN0YW1wIGFuZCBkYXRhIG1lYW5zIHRoaXMgaWNvbiBpcyBkZXN0aW5l
ZCB0byBiZSBkZWxldGVkIC0gZG8gdGhhdCBpbnN0ZWFkIG9mIHdyaXRpbmcgaXQgb3V0Ci0gICAg
aWYgKCFzbmFwc2hvdC50aW1lc3RhbXAoKSAmJiAhc25hcHNob3QuZGF0YSgpKSB7Ci0gICAgICAg
IExPRyhJY29uRGF0YWJhc2UsICJSZW1vdmluZyAlcyBmcm9tIG9uLWRpc2sgZGF0YWJhc2UiLCB1
cmxGb3JMb2dnaW5nKHNuYXBzaG90Lmljb25VUkwoKSkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAg
ICByZW1vdmVJY29uRnJvbVNRTERhdGFiYXNlKHNuYXBzaG90Lmljb25VUkwoKSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGVyZSB3b3VsZCBiZSBhIHRyYW5zYWN0aW9uIGhl
cmUgdG8gbWFrZSBzdXJlIHRoZXNlIHJlbW92YWxzIGFyZSBhdG9taWMKLSAgICAvLyBJbiBwcmFj
dGljZSB0aGUgb25seSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgaXMgYWx3YXlzIHdyYXBwZWQgaW4g
YSB0cmFuc2FjdGlvbiBpdHNlbGYgc28gcGxhY2luZyBhbm90aGVyIGhlcmUgaXMgdW5uZWNlc3Nh
cnkKLQotICAgIC8vIEdldCB0aGUgaWNvbklEIGZvciB0aGlzIHVybAotICAgIGludDY0X3QgaWNv
bklEID0gZ2V0SWNvbklERm9ySWNvblVSTEZyb21TUUxEYXRhYmFzZShzbmFwc2hvdC5pY29uVVJM
KCkpOwotCi0gICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBpY29uSUQgaW4gcGxhY2UsIHVw
ZGF0ZSB0aGUgZGF0YWJhc2UuCi0gICAgLy8gT3RoZXJ3aXNlLCBpbnNlcnQgbmV3IHJlY29yZHMK
LSAgICBpZiAoaWNvbklEKSB7Ci0gICAgICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fdXBkYXRl
SWNvbkluZm9TdGF0ZW1lbnQsIG1fc3luY0RCLCAiVVBEQVRFIEljb25JbmZvIFNFVCBzdGFtcCA9
ID8sIHVybCA9ID8gV0hFUkUgaWNvbklEID0gPzsiKTsKLSAgICAgICAgbV91cGRhdGVJY29uSW5m
b1N0YXRlbWVudC0+YmluZEludDY0KDEsIHNuYXBzaG90LnRpbWVzdGFtcCgpKTsKLSAgICAgICAg
bV91cGRhdGVJY29uSW5mb1N0YXRlbWVudC0+YmluZFRleHQoMiwgc25hcHNob3QuaWNvblVSTCgp
KTsKLSAgICAgICAgbV91cGRhdGVJY29uSW5mb1N0YXRlbWVudC0+YmluZEludDY0KDMsIGljb25J
RCk7Ci0KLSAgICAgICAgaWYgKG1fdXBkYXRlSWNvbkluZm9TdGF0ZW1lbnQtPnN0ZXAoKSAhPSBT
UUxJVEVfRE9ORSkKLSAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHVwZGF0ZSBpY29u
IGluZm8gZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmcoc25hcHNob3QuaWNvblVSTCgpKS5hc2Np
aSgpLmRhdGEoKSk7Ci0KLSAgICAgICAgbV91cGRhdGVJY29uSW5mb1N0YXRlbWVudC0+cmVzZXQo
KTsKLQotICAgICAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX3VwZGF0ZUljb25EYXRhU3RhdGVt
ZW50LCBtX3N5bmNEQiwgIlVQREFURSBJY29uRGF0YSBTRVQgZGF0YSA9ID8gV0hFUkUgaWNvbklE
ID0gPzsiKTsKLSAgICAgICAgbV91cGRhdGVJY29uRGF0YVN0YXRlbWVudC0+YmluZEludDY0KDIs
IGljb25JRCk7Ci0KLSAgICAgICAgLy8gSWYgd2UgKmhhdmUqIGltYWdlIGRhdGEsIGJpbmQgaXQg
dG8gdGhpcyBzdGF0ZW1lbnQgLSBPdGhlcndpc2UgYmluZCAibnVsbCIgZm9yIHRoZSBibG9iIGRh
dGEsCi0gICAgICAgIC8vIHNpZ25pZnlpbmcgdGhhdCB0aGlzIGljb24gZG9lc24ndCBoYXZlIGFu
eSBkYXRhCi0gICAgICAgIGlmIChzbmFwc2hvdC5kYXRhKCkgJiYgc25hcHNob3QuZGF0YSgpLT5z
aXplKCkpCi0gICAgICAgICAgICBtX3VwZGF0ZUljb25EYXRhU3RhdGVtZW50LT5iaW5kQmxvYigx
LCBzbmFwc2hvdC5kYXRhKCktPmRhdGEoKSwgc25hcHNob3QuZGF0YSgpLT5zaXplKCkpOwotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICBtX3VwZGF0ZUljb25EYXRhU3RhdGVtZW50LT5iaW5kTnVs
bCgxKTsKLQotICAgICAgICBpZiAobV91cGRhdGVJY29uRGF0YVN0YXRlbWVudC0+c3RlcCgpICE9
IFNRTElURV9ET05FKQotICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gdXBkYXRlIGlj
b24gZGF0YSBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhzbmFwc2hvdC5pY29uVVJMKCkpLmFz
Y2lpKCkuZGF0YSgpKTsKLQotICAgICAgICBtX3VwZGF0ZUljb25EYXRhU3RhdGVtZW50LT5yZXNl
dCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fc2V0SWNv
bkluZm9TdGF0ZW1lbnQsIG1fc3luY0RCLCAiSU5TRVJUIElOVE8gSWNvbkluZm8gKHVybCxzdGFt
cCkgVkFMVUVTICg/LCA/KTsiKTsKLSAgICAgICAgbV9zZXRJY29uSW5mb1N0YXRlbWVudC0+Ymlu
ZFRleHQoMSwgc25hcHNob3QuaWNvblVSTCgpKTsKLSAgICAgICAgbV9zZXRJY29uSW5mb1N0YXRl
bWVudC0+YmluZEludDY0KDIsIHNuYXBzaG90LnRpbWVzdGFtcCgpKTsKLQotICAgICAgICBpZiAo
bV9zZXRJY29uSW5mb1N0YXRlbWVudC0+c3RlcCgpICE9IFNRTElURV9ET05FKQotICAgICAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGljb24gaW5mbyBmb3IgdXJsICVzIiwgdXJsRm9y
TG9nZ2luZyhzbmFwc2hvdC5pY29uVVJMKCkpLmFzY2lpKCkuZGF0YSgpKTsKLQotICAgICAgICBt
X3NldEljb25JbmZvU3RhdGVtZW50LT5yZXNldCgpOwotCi0gICAgICAgIGludDY0X3QgaWNvbklE
ID0gbV9zeW5jREIubGFzdEluc2VydFJvd0lEKCk7Ci0KLSAgICAgICAgcmVhZHlTUUxpdGVTdGF0
ZW1lbnQobV9zZXRJY29uRGF0YVN0YXRlbWVudCwgbV9zeW5jREIsICJJTlNFUlQgSU5UTyBJY29u
RGF0YSAoaWNvbklELCBkYXRhKSBWQUxVRVMgKD8sID8pOyIpOwotICAgICAgICBtX3NldEljb25E
YXRhU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKTsKLQotICAgICAgICAvLyBJZiB3ZSAq
aGF2ZSogaW1hZ2UgZGF0YSwgYmluZCBpdCB0byB0aGlzIHN0YXRlbWVudCAtIE90aGVyd2lzZSBi
aW5kICJudWxsIiBmb3IgdGhlIGJsb2IgZGF0YSwKLSAgICAgICAgLy8gc2lnbmlmeWluZyB0aGF0
IHRoaXMgaWNvbiBkb2Vzbid0IGhhdmUgYW55IGRhdGEKLSAgICAgICAgaWYgKHNuYXBzaG90LmRh
dGEoKSAmJiBzbmFwc2hvdC5kYXRhKCktPnNpemUoKSkKLSAgICAgICAgICAgIG1fc2V0SWNvbkRh
dGFTdGF0ZW1lbnQtPmJpbmRCbG9iKDIsIHNuYXBzaG90LmRhdGEoKS0+ZGF0YSgpLCBzbmFwc2hv
dC5kYXRhKCktPnNpemUoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fc2V0SWNvbkRh
dGFTdGF0ZW1lbnQtPmJpbmROdWxsKDIpOwotCi0gICAgICAgIGlmIChtX3NldEljb25EYXRhU3Rh
dGVtZW50LT5zdGVwKCkgIT0gU1FMSVRFX0RPTkUpCi0gICAgICAgICAgICBMT0dfRVJST1IoIkZh
aWxlZCB0byBzZXQgaWNvbiBkYXRhIGZvciB1cmwgJXMiLCB1cmxGb3JMb2dnaW5nKHNuYXBzaG90
Lmljb25VUkwoKSkuYXNjaWkoKS5kYXRhKCkpOwotCi0gICAgICAgIG1fc2V0SWNvbkRhdGFTdGF0
ZW1lbnQtPnJlc2V0KCk7Ci0gICAgfQotfQotCi12b2lkIEljb25EYXRhYmFzZTo6ZGlzcGF0Y2hE
aWRJbXBvcnRJY29uVVJMRm9yUGFnZVVSTE9uTWFpblRocmVhZChjb25zdCBTdHJpbmcmIHBhZ2VV
UkwpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKLQotICAgIG1fbWFpblRocmVh
ZE5vdGlmaWVyLm5vdGlmeShbdGhpcywgcGFnZVVSTCA9IHBhZ2VVUkwuaXNvbGF0ZWRDb3B5KCld
IHsKLSAgICAgICAgaWYgKG1fY2xpZW50KQotICAgICAgICAgICAgbV9jbGllbnQtPmRpZEltcG9y
dEljb25VUkxGb3JQYWdlVVJMKHBhZ2VVUkwpOwotICAgIH0pOwotfQotCi12b2lkIEljb25EYXRh
YmFzZTo6ZGlzcGF0Y2hEaWRJbXBvcnRJY29uRGF0YUZvclBhZ2VVUkxPbk1haW5UaHJlYWQoY29u
c3QgU3RyaW5nJiBwYWdlVVJMKQotewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0K
LSAgICBtX21haW5UaHJlYWROb3RpZmllci5ub3RpZnkoW3RoaXMsIHBhZ2VVUkwgPSBwYWdlVVJM
Lmlzb2xhdGVkQ29weSgpXSB7Ci0gICAgICAgIGlmIChtX2NsaWVudCkKLSAgICAgICAgICAgIG1f
Y2xpZW50LT5kaWRJbXBvcnRJY29uRGF0YUZvclBhZ2VVUkwocGFnZVVSTCk7Ci0gICAgfSk7Ci19
Ci0KLXZvaWQgSWNvbkRhdGFiYXNlOjpkaXNwYXRjaERpZEZpbmlzaFVSTEltcG9ydE9uTWFpblRo
cmVhZCgpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKIAotICAgIG1fbWFpblRo
cmVhZE5vdGlmaWVyLm5vdGlmeShbdGhpc10gewotICAgICAgICBpZiAobV9jbGllbnQpCi0gICAg
ICAgICAgICBtX2NsaWVudC0+ZGlkRmluaXNoVVJMSW1wb3J0KCk7CisgICAgICAgIFJ1bkxvb3A6
Om1haW4oKS5kaXNwYXRjaChbY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25I
YW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKCk7Cisg
ICAgICAgIH0pOwogICAgIH0pOwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJv
Y2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQ
SS9nbGliL0ljb25EYXRhYmFzZS5oCmluZGV4IDhhOGNhYmJkNTNjLi4wZDYwNTllYjQwMCAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmgK
KysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmgKQEAg
LTEsMzkzICsxLDg5IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAy
MDA5LCAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAo
QykgMjAwNyBKdXN0aW4gSGF5Z29vZCAoamhheWdvb2RAcmVha3RpeC5jb20pCisgKiBDb3B5cmln
aHQgKEMpIDIwMTkgSWdhbGlhIFMuTC4KICAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KICAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCi0gKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQot
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KICAqLwogCiAjcHJh
Z21hIG9uY2UKIAogI2luY2x1ZGUgPFdlYkNvcmUvTmF0aXZlSW1hZ2UuaD4KICNpbmNsdWRlIDxX
ZWJDb3JlL1NRTGl0ZURhdGFiYXNlLmg+Ci0jaW5jbHVkZSA8d3RmL0NvbmRpdGlvbi5oPgotI2lu
Y2x1ZGUgPHd0Zi9IYXNoQ291bnRlZFNldC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU1FMaXRlU3Rh
dGVtZW50Lmg+CisjaW5jbHVkZSA8d3RmL0NvbXBsZXRpb25IYW5kbGVyLmg+CiAjaW5jbHVkZSA8
d3RmL0hhc2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgotI2luY2x1ZGUgPHd0Zi9S
dW5Mb29wLmg+Ci0jaW5jbHVkZSA8d3RmL2dsaWIvUnVuTG9vcFNvdXJjZVByaW9yaXR5Lmg+Ci0j
aW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0
cmluZy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1jbGFzcyBTaGFyZWRCdWZmZXI7Ci19Cisj
aW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1dvcmtR
dWV1ZS5oPgogCiBuYW1lc3BhY2UgV2ViS2l0IHsKIAotY2xhc3MgSWNvbkRhdGFiYXNlQ2xpZW50
IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK2NsYXNzIEljb25EYXRhYmFzZSA6IHB1
YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxJY29uRGF0YWJhc2U+IHsKIHB1YmxpYzoKLSAgICB2
aXJ0dWFsIH5JY29uRGF0YWJhc2VDbGllbnQoKSA9IGRlZmF1bHQ7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgZGlkSW1wb3J0SWNvblVSTEZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikgeyB9Ci0gICAgdmly
dHVhbCB2b2lkIGRpZEltcG9ydEljb25EYXRhRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmKSB7IH0K
LSAgICB2aXJ0dWFsIHZvaWQgZGlkQ2hhbmdlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikg
eyB9Ci0gICAgdmlydHVhbCB2b2lkIGRpZEZpbmlzaFVSTEltcG9ydCgpIHsgfQotfTsKLQotY2xh
c3MgSWNvbkRhdGFiYXNlIHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLQotcHJpdmF0
ZToKLSAgICBjbGFzcyBJY29uU25hcHNob3QgewotICAgICAgICBXVEZfTUFLRV9GQVNUX0FMTE9D
QVRFRDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEljb25TbmFwc2hvdCgpID0gZGVmYXVsdDsKLQot
ICAgICAgICBJY29uU25hcHNob3QoY29uc3QgU3RyaW5nJiBpY29uVVJMLCBpbnQgdGltZXN0YW1w
LCBXZWJDb3JlOjpTaGFyZWRCdWZmZXIqIGRhdGEpCi0gICAgICAgICAgICA6IG1faWNvblVSTChp
Y29uVVJMKQotICAgICAgICAgICAgLCBtX3RpbWVzdGFtcCh0aW1lc3RhbXApCi0gICAgICAgICAg
ICAsIG1fZGF0YShkYXRhKQotICAgICAgICB7IH0KLQotICAgICAgICBjb25zdCBTdHJpbmcmIGlj
b25VUkwoKSBjb25zdCB7IHJldHVybiBtX2ljb25VUkw7IH0KLSAgICAgICAgaW50IHRpbWVzdGFt
cCgpIGNvbnN0IHsgcmV0dXJuIG1fdGltZXN0YW1wOyB9Ci0gICAgICAgIFdlYkNvcmU6OlNoYXJl
ZEJ1ZmZlciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5nZXQoKTsgfQotCi0gICAgcHJp
dmF0ZToKLSAgICAgICAgU3RyaW5nIG1faWNvblVSTDsKLSAgICAgICAgaW50IG1fdGltZXN0YW1w
IHsgMCB9OwotICAgICAgICBSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBtX2RhdGE7Ci0g
ICAgfTsKLQotICAgIGNsYXNzIEljb25SZWNvcmQgOiBwdWJsaWMgUmVmQ291bnRlZDxJY29uUmVj
b3JkPiB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgUmVmPEljb25SZWNvcmQ+IGNyZWF0
ZShjb25zdCBTdHJpbmcmIHVybCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGFkb3B0
UmVmKCpuZXcgSWNvblJlY29yZCh1cmwpKTsKLSAgICAgICAgfQotICAgICAgICB+SWNvblJlY29y
ZCgpOwotCi0gICAgICAgIHRpbWVfdCBnZXRUaW1lc3RhbXAoKSB7IHJldHVybiBtX3N0YW1wOyB9
Ci0gICAgICAgIHZvaWQgc2V0VGltZXN0YW1wKHRpbWVfdCBzdGFtcCkgeyBtX3N0YW1wID0gc3Rh
bXA7IH0KLQotICAgICAgICB2b2lkIHNldEltYWdlRGF0YShSZWZQdHI8V2ViQ29yZTo6U2hhcmVk
QnVmZmVyPiYmKTsKLSAgICAgICAgV2ViQ29yZTo6TmF0aXZlSW1hZ2VQdHIgaW1hZ2UoY29uc3Qg
V2ViQ29yZTo6SW50U2l6ZSYpOwotCi0gICAgICAgIFN0cmluZyBpY29uVVJMKCkgeyByZXR1cm4g
bV9pY29uVVJMOyB9Ci0KLSAgICAgICAgZW51bSBjbGFzcyBJbWFnZURhdGFTdGF0dXMgeyBQcmVz
ZW50LCBNaXNzaW5nLCBVbmtub3duIH07Ci0gICAgICAgIEltYWdlRGF0YVN0YXR1cyBpbWFnZURh
dGFTdGF0dXMoKTsKLQotICAgICAgICBIYXNoU2V0PFN0cmluZz4mIHJldGFpbmluZ1BhZ2VVUkxz
KCkgeyByZXR1cm4gbV9yZXRhaW5pbmdQYWdlVVJMczsgfQotCi0gICAgICAgIEljb25TbmFwc2hv
dCBzbmFwc2hvdChib29sIGZvckRlbGV0aW9uID0gZmFsc2UpIGNvbnN0OwotCi0gICAgcHJpdmF0
ZToKLSAgICAgICAgSWNvblJlY29yZChjb25zdCBTdHJpbmcmIHVybCk7Ci0KLSAgICAgICAgU3Ry
aW5nIG1faWNvblVSTDsKLSAgICAgICAgdGltZV90IG1fc3RhbXAgeyAwIH07Ci0gICAgICAgIFJl
ZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IG1faW1hZ2VEYXRhOwotICAgICAgICBXZWJDb3Jl
OjpOYXRpdmVJbWFnZVB0ciBtX2ltYWdlOwotCi0gICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBtX3Jl
dGFpbmluZ1BhZ2VVUkxzOwotCi0gICAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGNhY2hlIHdo
ZXRoZXIgb3Igbm90IGEgU2l0ZUljb24gaGFzIGhhZCBpdHMgZGF0YSBzZXQgeWV0Ci0gICAgICAg
IC8vIFRoaXMgaGVscHMgdGhlIEljb25EYXRhYmFzZSBrbm93IGlmIGl0IGhhcyB0byBzZXQgdGhl
IGRhdGEgb24gYSBuZXcgb2JqZWN0IG9yIG5vdCwKLSAgICAgICAgLy8gYW5kIGFsc28gdG8gZGV0
ZXJtaW5lIGlmIHRoZSBpY29uIGlzIG1pc3NpbmcgZGF0YSBvciBpZiBpdCBqdXN0IGhhc24ndCBi
ZWVuIGJyb3VnaHQKLSAgICAgICAgLy8gaW4gZnJvbSB0aGUgREIgeWV0Ci0gICAgICAgIGJvb2wg
bV9kYXRhU2V0IHsgZmFsc2UgfTsKLSAgICB9OwotCi0gICAgY2xhc3MgUGFnZVVSTFNuYXBzaG90
IHsKLSAgICAgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci0gICAgcHVibGljOgotICAgICAg
ICBQYWdlVVJMU25hcHNob3QoKSA9IGRlZmF1bHQ7Ci0KLSAgICAgICAgUGFnZVVSTFNuYXBzaG90
KGNvbnN0IFN0cmluZyYgcGFnZVVSTCwgY29uc3QgU3RyaW5nJiBpY29uVVJMKQotICAgICAgICAg
ICAgOiBtX3BhZ2VVUkwocGFnZVVSTCkKLSAgICAgICAgICAgICwgbV9pY29uVVJMKGljb25VUkwp
Ci0gICAgICAgIHsgfQotCi0gICAgICAgIGNvbnN0IFN0cmluZyYgcGFnZVVSTCgpIGNvbnN0IHsg
cmV0dXJuIG1fcGFnZVVSTDsgfQotICAgICAgICBjb25zdCBTdHJpbmcmIGljb25VUkwoKSBjb25z
dCB7IHJldHVybiBtX2ljb25VUkw7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFN0cmluZyBt
X3BhZ2VVUkw7Ci0gICAgICAgIFN0cmluZyBtX2ljb25VUkw7Ci0gICAgfTsKLQotICAgIGNsYXNz
IFBhZ2VVUkxSZWNvcmQgewotICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQYWdlVVJMUmVj
b3JkKTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci0gICAgcHVibGljOgotICAgICAgICBQYWdl
VVJMUmVjb3JkKGNvbnN0IFN0cmluZyYgcGFnZVVSTCk7Ci0gICAgICAgIH5QYWdlVVJMUmVjb3Jk
KCk7Ci0KLSAgICAgICAgaW5saW5lIFN0cmluZyB1cmwoKSBjb25zdCB7IHJldHVybiBtX3BhZ2VV
Ukw7IH0KLQotICAgICAgICB2b2lkIHNldEljb25SZWNvcmQoUmVmUHRyPEljb25SZWNvcmQ+JiYp
OwotICAgICAgICBJY29uUmVjb3JkKiBpY29uUmVjb3JkKCkgeyByZXR1cm4gbV9pY29uUmVjb3Jk
LmdldCgpOyB9Ci0KLSAgICAgICAgUGFnZVVSTFNuYXBzaG90IHNuYXBzaG90KGJvb2wgZm9yRGVs
ZXRpb24gPSBmYWxzZSkgY29uc3Q7Ci0KLSAgICAgICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUg
cGFnZSB3YXNuJ3QgcmV0YWluZWQgYmVmb3JlaGFuZCwgdHJ1ZSBpZiB0aGUgcmV0YWluIGNvdW50
IHdhcyBhbHJlYWR5IDEgb3IgaGlnaGVyLgotICAgICAgICBib29sIHJldGFpbihpbnQgY291bnQp
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgd2FzUmV0YWluZWQgPSBtX3JldGFpbkNvdW50
ID4gMDsKLSAgICAgICAgICAgIG1fcmV0YWluQ291bnQgKz0gY291bnQ7Ci0gICAgICAgICAgICBy
ZXR1cm4gd2FzUmV0YWluZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXR1cm5zIHRydWUg
aWYgdGhlIHBhZ2UgaXMgc3RpbGwgcmV0YWluZWQgYWZ0ZXIgdGhlIGNhbGwuIEZhbHNlIGlmIHRo
ZSByZXRhaW4gY291bnQganVzdCBkcm9wcGVkIHRvIDAuCi0gICAgICAgIGJvb2wgcmVsZWFzZShp
bnQgY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChtX3JldGFpbkNvdW50ID49
IGNvdW50KTsKLSAgICAgICAgICAgIG1fcmV0YWluQ291bnQgLT0gY291bnQ7Ci0gICAgICAgICAg
ICByZXR1cm4gbV9yZXRhaW5Db3VudCA+IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcmV0
YWluQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3JldGFpbkNvdW50OyB9Ci0KLSAgICBwcml2YXRl
OgotICAgICAgICBTdHJpbmcgbV9wYWdlVVJMOwotICAgICAgICBSZWZQdHI8SWNvblJlY29yZD4g
bV9pY29uUmVjb3JkOwotICAgICAgICBpbnQgbV9yZXRhaW5Db3VudCB7IDAgfTsKLSAgICB9Owot
Ci0gICAgY2xhc3MgTWFpblRocmVhZE5vdGlmaWVyIHsKLSAgICAgICAgV1RGX01BS0VfRkFTVF9B
TExPQ0FURUQ7Ci0gICAgcHVibGljOgotICAgICAgICBNYWluVGhyZWFkTm90aWZpZXIoKQotICAg
ICAgICAgICAgOiBtX3RpbWVyKFJ1bkxvb3A6Om1haW4oKSwgdGhpcywgJk1haW5UaHJlYWROb3Rp
Zmllcjo6dGltZXJGaXJlZCkKLSAgICAgICAgewotICAgICAgICAgICAgbV90aW1lci5zZXRQcmlv
cml0eShSdW5Mb29wU291cmNlUHJpb3JpdHk6Ok1haW5UaHJlYWREaXNwYXRjaGVyVGltZXIpOwot
ICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRBY3RpdmUoYm9vbCBhY3RpdmUpCi0gICAgICAg
IHsKLSAgICAgICAgICAgIG1faXNBY3RpdmUuc3RvcmUoYWN0aXZlKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHZvaWQgbm90aWZ5KEZ1bmN0aW9uPHZvaWQoKT4mJiBub3RpZmljYXRpb24pCi0gICAg
ICAgIHsKLSAgICAgICAgICAgIGlmICghbV9pc0FjdGl2ZS5sb2FkKCkpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTG9ja0hvbGRlciBs
b2NrZXIobV9ub3RpZmljYXRpb25RdWV1ZUxvY2spOwotICAgICAgICAgICAgICAgIG1fbm90aWZp
Y2F0aW9uUXVldWUuYXBwZW5kKFdURk1vdmUobm90aWZpY2F0aW9uKSk7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIGlmICghbV90aW1lci5pc0FjdGl2ZSgpKQotICAgICAgICAgICAgICAg
IG1fdGltZXIuc3RhcnRPbmVTaG90KDBfcyk7Ci0gICAgICAgIH0KKyAgICBlbnVtIGNsYXNzIEFs
bG93RGF0YWJhc2VXcml0ZSB7IE5vLCBZZXMgfTsKIAotICAgICAgICB2b2lkIHN0b3AoKQotICAg
ICAgICB7Ci0gICAgICAgICAgICBzZXRBY3RpdmUoZmFsc2UpOwotICAgICAgICAgICAgbV90aW1l
ci5zdG9wKCk7Ci0gICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX25vdGlmaWNhdGlvblF1
ZXVlTG9jayk7Ci0gICAgICAgICAgICBtX25vdGlmaWNhdGlvblF1ZXVlLmNsZWFyKCk7Ci0gICAg
ICAgIH0KKyAgICBzdGF0aWMgUmVmPEljb25EYXRhYmFzZT4gY3JlYXRlKGNvbnN0IFN0cmluZyYg
cGF0aCwgQWxsb3dEYXRhYmFzZVdyaXRlIGFsbG93RGF0YWJhc2VXcml0ZSkKKyAgICB7CisgICAg
ICAgIHJldHVybiBhZG9wdFJlZigqbmV3IEljb25EYXRhYmFzZShwYXRoLCBhbGxvd0RhdGFiYXNl
V3JpdGUpKTsKKyAgICB9CiAKLSAgICBwcml2YXRlOgotICAgICAgICB2b2lkIHRpbWVyRmlyZWQo
KQotICAgICAgICB7Ci0gICAgICAgICAgICBEZXF1ZTxGdW5jdGlvbjx2b2lkKCk+PiBub3RpZmlj
YXRpb25RdWV1ZTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMb2NrSG9sZGVyIGxv
Y2tlcihtX25vdGlmaWNhdGlvblF1ZXVlTG9jayk7Ci0gICAgICAgICAgICAgICAgbm90aWZpY2F0
aW9uUXVldWUgPSBXVEZNb3ZlKG1fbm90aWZpY2F0aW9uUXVldWUpOwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICBpZiAoIW1faXNBY3RpdmUubG9hZCgpKQotICAgICAgICAgICAgICAgIHJl
dHVybjsKLQotICAgICAgICAgICAgd2hpbGUgKCFub3RpZmljYXRpb25RdWV1ZS5pc0VtcHR5KCkp
IHsKLSAgICAgICAgICAgICAgICBhdXRvIGZ1bmN0aW9uID0gbm90aWZpY2F0aW9uUXVldWUudGFr
ZUZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotCi0gICAgICAgIERlcXVlPEZ1bmN0aW9uPHZvaWQoKT4+IG1fbm90aWZpY2F0aW9u
UXVldWU7Ci0gICAgICAgIExvY2sgbV9ub3RpZmljYXRpb25RdWV1ZUxvY2s7Ci0gICAgICAgIEF0
b21pYzxib29sPiBtX2lzQWN0aXZlOwotICAgICAgICBSdW5Mb29wOjpUaW1lcjxNYWluVGhyZWFk
Tm90aWZpZXI+IG1fdGltZXI7Ci0gICAgfTsKLQotLy8gKioqIE1haW4gVGhyZWFkIE9ubHkgKioq
Ci1wdWJsaWM6Ci0gICAgSWNvbkRhdGFiYXNlKCk7CiAgICAgfkljb25EYXRhYmFzZSgpOwogCi0g
ICAgZW51bSBjbGFzcyBJY29uTG9hZERlY2lzaW9uIHsgWWVzLCBObywgVW5rbm93biB9OwotCi0g
ICAgdm9pZCBzZXRDbGllbnQoc3RkOjp1bmlxdWVfcHRyPEljb25EYXRhYmFzZUNsaWVudD4mJik7
Ci0KLSAgICBib29sIG9wZW4oY29uc3QgU3RyaW5nJiBkaXJlY3RvcnksIGNvbnN0IFN0cmluZyYg
ZmlsZW5hbWUpOwotICAgIHZvaWQgY2xvc2UoKTsKLQotICAgIHZvaWQgcmVtb3ZlQWxsSWNvbnMo
KTsKLQotICAgIHZvaWQgcmV0YWluSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJik7Ci0gICAg
dm9pZCByZWxlYXNlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJik7Ci0gICAgdm9pZCBzZXRJ
Y29uRGF0YUZvckljb25VUkwoUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4mJiwgY29uc3Qg
U3RyaW5nJiBpY29uVVJMKTsKLSAgICB2b2lkIHNldEljb25VUkxGb3JQYWdlVVJMKGNvbnN0IFN0
cmluZyYgaWNvblVSTCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMKTsKLQotICAgIGVudW0gY2xhc3Mg
SXNLbm93bkljb24geyBObywgWWVzIH07Ci0gICAgc3RkOjpwYWlyPFdlYkNvcmU6Ok5hdGl2ZUlt
YWdlUHRyLCBJc0tub3duSWNvbj4gc3luY2hyb25vdXNJY29uRm9yUGFnZVVSTChjb25zdCBTdHJp
bmcmLCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJik7Ci0gICAgU3RyaW5nIHN5bmNocm9ub3VzSWNv
blVSTEZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJik7Ci0gICAgYm9vbCBzeW5jaHJvbm91c0ljb25E
YXRhS25vd25Gb3JJY29uVVJMKGNvbnN0IFN0cmluZyYpOwotICAgIEljb25Mb2FkRGVjaXNpb24g
c3luY2hyb25vdXNMb2FkRGVjaXNpb25Gb3JJY29uVVJMKGNvbnN0IFN0cmluZyYpOworICAgIHZv
aWQgaW52YWxpZGF0ZSgpOwogCi0gICAgdm9pZCBzZXRFbmFibGVkKGJvb2wpOwotICAgIGJvb2wg
aXNFbmFibGVkKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQo
Ym9vbCBmbGFnKTsKLSAgICBib29sIGlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpIGNvbnN0Owot
Ci0gICAgc3RhdGljIHZvaWQgZGVsYXlEYXRhYmFzZUNsZWFudXAoKTsKLSAgICBzdGF0aWMgdm9p
ZCBhbGxvd0RhdGFiYXNlQ2xlYW51cCgpOwotICAgIHN0YXRpYyB2b2lkIGNoZWNrSW50ZWdyaXR5
QmVmb3JlT3BlbmluZygpOworICAgIHZvaWQgY2hlY2tJY29uVVJMQW5kU2V0UGFnZVVSTElmTmVl
ZGVkKGNvbnN0IFN0cmluZyYgaWNvblVSTCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMLCBBbGxvd0Rh
dGFiYXNlV3JpdGUsIENvbXBsZXRpb25IYW5kbGVyPHZvaWQoYm9vbCwgYm9vbCk+JiYpOworICAg
IHZvaWQgbG9hZEljb25Gb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYsIEFsbG93RGF0YWJhc2VXcml0
ZSwgQ29tcGxldGlvbkhhbmRsZXI8dm9pZChXZWJDb3JlOjpOYXRpdmVJbWFnZVB0ciYmKT4mJik7
CisgICAgU3RyaW5nIGljb25VUkxGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQg
c2V0SWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiBpY29uVVJMLCBjb25zdCB1bnNpZ25lZCBj
aGFyKiwgc2l6ZV90LCBjb25zdCBTdHJpbmcmIHBhZ2VVUkwsIEFsbG93RGF0YWJhc2VXcml0ZSwg
Q29tcGxldGlvbkhhbmRsZXI8dm9pZChib29sKT4mJik7CisgICAgdm9pZCBjbGVhcihDb21wbGV0
aW9uSGFuZGxlcjx2b2lkKCk+JiYpOwogCiBwcml2YXRlOgotICAgIHZvaWQgd2FrZVN5bmNUaHJl
YWQoKTsKLSAgICB2b2lkIHNjaGVkdWxlT3JEZWZlclN5bmNUaW1lcigpOwotICAgIHZvaWQgc3lu
Y1RpbWVyRmlyZWQoKTsKLQotICAgIFJ1bkxvb3A6OlRpbWVyPEljb25EYXRhYmFzZT4gbV9zeW5j
VGltZXI7Ci0gICAgUmVmUHRyPFRocmVhZD4gbV9zeW5jVGhyZWFkOwotICAgIGJvb2wgbV9zeW5j
VGhyZWFkUnVubmluZyB7IGZhbHNlIH07Ci0gICAgYm9vbCBtX3NjaGVkdWxlT3JEZWZlclN5bmNU
aW1lclJlcXVlc3RlZCB7IGZhbHNlIH07Ci0KLS8vICoqKiBBbnkgVGhyZWFkICoqKgotcHVibGlj
OgotICAgIGJvb2wgaXNPcGVuKCkgY29uc3Q7Ci0gICAgU3RyaW5nIGRhdGFiYXNlUGF0aCgpIGNv
bnN0OwotICAgIHN0YXRpYyBTdHJpbmcgZGVmYXVsdERhdGFiYXNlRmlsZW5hbWUoKTsKLQotcHJp
dmF0ZToKLSAgICBSZWY8SWNvblJlY29yZD4gZ2V0T3JDcmVhdGVJY29uUmVjb3JkKGNvbnN0IFN0
cmluZyYgaWNvblVSTCk7Ci0gICAgUGFnZVVSTFJlY29yZCogZ2V0T3JDcmVhdGVQYWdlVVJMUmVj
b3JkKGNvbnN0IFN0cmluZyYgcGFnZVVSTCk7Ci0KLSAgICBib29sIG1faXNFbmFibGVkIHsgZmFs
c2UgfTsKLSAgICBib29sIG1fcHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCB7IGZhbHNlIH07Ci0KLSAg
ICBtdXRhYmxlIExvY2sgbV9zeW5jTG9jazsKLSAgICBDb25kaXRpb24gbV9zeW5jQ29uZGl0aW9u
OwotICAgIFN0cmluZyBtX2RhdGFiYXNlRGlyZWN0b3J5OwotICAgIC8vIEhvbGRpbmcgbV9zeW5j
TG9jayBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoCi0g
ICAgU3RyaW5nIG1fY29tcGxldGVEYXRhYmFzZVBhdGg7Ci0KLSAgICBib29sIG1fdGhyZWFkVGVy
bWluYXRpb25SZXF1ZXN0ZWQgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9yZW1vdmVJY29uc1JlcXVl
c3RlZCB7IGZhbHNlIH07Ci0gICAgYm9vbCBtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSB7IGZhbHNl
IH07Ci0gICAgYm9vbCBtX3N5bmNUaHJlYWRIYXNXb3JrVG9EbyB7IGZhbHNlIH07Ci0KLSAgICBM
b2NrIG1fdXJsQW5kSWNvbkxvY2s7Ci0gICAgLy8gSG9sZGluZyBtX3VybEFuZEljb25Mb2NrIGlz
IHJlcXVpcmVkIHdoZW4gYWNjZXNzaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0
dXJlcyBvciB0aGUgb2JqZWN0cyB0aGV5IGNvbnRhaW4KLSAgICBIYXNoTWFwPFN0cmluZywgSWNv
blJlY29yZCo+IG1faWNvblVSTFRvUmVjb3JkTWFwOwotICAgIEhhc2hNYXA8U3RyaW5nLCBQYWdl
VVJMUmVjb3JkKj4gbV9wYWdlVVJMVG9SZWNvcmRNYXA7Ci0gICAgSGFzaFNldDxTdHJpbmc+IG1f
cmV0YWluZWRQYWdlVVJMczsKLQotICAgIExvY2sgbV9wZW5kaW5nU3luY0xvY2s7Ci0gICAgLy8g
SG9sZGluZyBtX3BlbmRpbmdTeW5jTG9jayBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBhbnkg
b2YgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZXMKLSAgICBIYXNoTWFwPFN0cmluZywgUGFn
ZVVSTFNuYXBzaG90PiBtX3BhZ2VVUkxzUGVuZGluZ1N5bmM7Ci0gICAgSGFzaE1hcDxTdHJpbmcs
IEljb25TbmFwc2hvdD4gbV9pY29uc1BlbmRpbmdTeW5jOwotCi0gICAgTG9jayBtX3BlbmRpbmdS
ZWFkaW5nTG9jazsKLSAgICAvLyBIb2xkaW5nIG1fcGVuZGluZ1N5bmNMb2NrIGlzIHJlcXVpcmVk
IHdoZW4gYWNjZXNzaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0dXJlcyAtIHdo
ZW4gZGVhbGluZyB3aXRoIEljb25SZWNvcmQqcywgaG9sZGluZyBtX3VybEFuZEljb25Mb2NrIGlz
IGFsc28gcmVxdWlyZWQKLSAgICBIYXNoU2V0PFN0cmluZz4gbV9wYWdlVVJMc1BlbmRpbmdJbXBv
cnQ7Ci0gICAgSGFzaFNldDxTdHJpbmc+IG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29uczsKLSAg
ICBIYXNoU2V0PEljb25SZWNvcmQqPiBtX2ljb25zUGVuZGluZ1JlYWRpbmc7Ci0KLSAgICBMb2Nr
IG1fdXJsc1RvUmV0YWluT3JSZWxlYXNlTG9jazsKLSAgICAvLyBIb2xkaW5nIG1fdXJsc1RvUmV0
YWluT3JSZWxlYXNlTG9jayBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBhbnkgb2YgdGhlIGZv
bGxvd2luZyBkYXRhIHN0cnVjdHVyZXMuCi0gICAgSGFzaENvdW50ZWRTZXQ8U3RyaW5nPiBtX3Vy
bHNUb1JldGFpbjsKLSAgICBIYXNoQ291bnRlZFNldDxTdHJpbmc+IG1fdXJsc1RvUmVsZWFzZTsK
LSAgICBib29sIG1fcmV0YWluT3JSZWxlYXNlSWNvblJlcXVlc3RlZCB7IGZhbHNlIH07Ci0KLS8v
ICoqKiBTeW5jIFRocmVhZCBPbmx5ICoqKgotcHVibGljOgotICAgIGJvb2wgc2hvdWxkU3RvcFRo
cmVhZEFjdGl2aXR5KCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBpY29uRGF0YWJhc2VT
eW5jVGhyZWFkKCk7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGJsb2NrIG9mIG1ldGhvZHMgYXJl
IGNhbGxlZCBleGNsdXNpdmVseSBieSB0aGUgc3luYyB0aHJlYWQgdG8gbWFuYWdlIGkvbyB0byBh
bmQgZnJvbSB0aGUgZGF0YWJhc2UKLSAgICAvLyBFYWNoIG1ldGhvZCBzaG91bGQgcGVyaW9kaWNh
bGx5IG1vbml0b3IgbV90aHJlYWRUZXJtaW5hdGlvblJlcXVlc3RlZCB3aGVuIGl0IG1ha2VzIHNl
bnNlIHRvIHJldHVybiBlYXJseSBvbiBzaHV0ZG93bgotICAgIHZvaWQgcGVyZm9ybU9wZW5Jbml0
aWFsaXphdGlvbigpOwotICAgIGJvb2wgY2hlY2tJbnRlZ3JpdHkoKTsKLSAgICB2b2lkIHBlcmZv
cm1VUkxJbXBvcnQoKTsKLSAgICB2b2lkIHN5bmNUaHJlYWRNYWluTG9vcCgpOwotICAgIGJvb2wg
cmVhZEZyb21EYXRhYmFzZSgpOwotICAgIGJvb2wgd3JpdGVUb0RhdGFiYXNlKCk7Ci0gICAgdm9p
ZCBwcnVuZVVucmV0YWluZWRJY29ucygpOwotICAgIHZvaWQgY2hlY2tGb3JEYW5nbGluZ1BhZ2VV
UkxzKGJvb2wgcHJ1bmVJZkZvdW5kKTsKLSAgICB2b2lkIHJlbW92ZUFsbEljb25zT25UaHJlYWQo
KTsKLSAgICB2b2lkIGRlbGV0ZUFsbFByZXBhcmVkU3RhdGVtZW50cygpOwotICAgIHZvaWQqIGNs
ZWFudXBTeW5jVGhyZWFkKCk7Ci0gICAgdm9pZCBwZXJmb3JtUmV0YWluSWNvbkZvclBhZ2VVUkwo
Y29uc3QgU3RyaW5nJiwgaW50IHJldGFpbkNvdW50KTsKLSAgICB2b2lkIHBlcmZvcm1SZWxlYXNl
SWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiwgaW50IHJlbGVhc2VDb3VudCk7Ci0KLSAgICBi
b29sIG1faW5pdGlhbFBydW5pbmdDb21wbGV0ZSB7IGZhbHNlIH07Ci0KLSAgICB2b2lkIHNldElj
b25VUkxGb3JQYWdlVVJMSW5TUUxEYXRhYmFzZShjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcm
KTsKLSAgICB2b2lkIHNldEljb25JREZvclBhZ2VVUkxJblNRTERhdGFiYXNlKGludDY0X3QsIGNv
bnN0IFN0cmluZyYpOwotICAgIHZvaWQgcmVtb3ZlUGFnZVVSTEZyb21TUUxEYXRhYmFzZShjb25z
dCBTdHJpbmcmIHBhZ2VVUkwpOwotICAgIGludDY0X3QgZ2V0SWNvbklERm9ySWNvblVSTEZyb21T
UUxEYXRhYmFzZShjb25zdCBTdHJpbmcmIGljb25VUkwpOwotICAgIGludDY0X3QgYWRkSWNvblVS
TFRvU1FMRGF0YWJhc2UoY29uc3QgU3RyaW5nJik7Ci0gICAgUmVmUHRyPFdlYkNvcmU6OlNoYXJl
ZEJ1ZmZlcj4gZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTEZyb21TUUxEYXRhYmFzZShjb25zdCBTdHJp
bmcmIGljb25VUkwpOwotICAgIHZvaWQgcmVtb3ZlSWNvbkZyb21TUUxEYXRhYmFzZShjb25zdCBT
dHJpbmcmIGljb25VUkwpOwotICAgIHZvaWQgd3JpdGVJY29uU25hcHNob3RUb1NRTERhdGFiYXNl
KGNvbnN0IEljb25TbmFwc2hvdCYpOwotCi0gICAgdm9pZCBwZXJmb3JtUGVuZGluZ1JldGFpbkFu
ZFJlbGVhc2VPcGVyYXRpb25zKCk7Ci0KLSAgICAvLyBNZXRob2RzIHRvIGRpc3BhdGNoIGNsaWVu
dCBjYWxsYmFja3Mgb24gdGhlIG1haW4gdGhyZWFkCi0gICAgdm9pZCBkaXNwYXRjaERpZEltcG9y
dEljb25VUkxGb3JQYWdlVVJMT25NYWluVGhyZWFkKGNvbnN0IFN0cmluZyYpOwotICAgIHZvaWQg
ZGlzcGF0Y2hEaWRJbXBvcnRJY29uRGF0YUZvclBhZ2VVUkxPbk1haW5UaHJlYWQoY29uc3QgU3Ry
aW5nJik7Ci0gICAgdm9pZCBkaXNwYXRjaERpZEZpbmlzaFVSTEltcG9ydE9uTWFpblRocmVhZCgp
OwotCi0gICAgLy8gVGhlIGNsaWVudCBpcyBzZXQgYnkgdGhlIG1haW4gdGhyZWFkIGJlZm9yZSB0
aGUgdGhyZWFkIHN0YXJ0cywgYW5kIGZyb20gdGhlbiBvbiBpcyBvbmx5IHVzZWQgYnkgdGhlIHN5
bmMgdGhyZWFkCi0gICAgc3RkOjp1bmlxdWVfcHRyPEljb25EYXRhYmFzZUNsaWVudD4gbV9jbGll
bnQ7Ci0KLSAgICBXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZSBtX3N5bmNEQjsKLQorICAgIEljb25E
YXRhYmFzZShjb25zdCBTdHJpbmcmLCBBbGxvd0RhdGFiYXNlV3JpdGUpOworCisgICAgYm9vbCBj
cmVhdGVUYWJsZXNJZk5lZWRlZCgpOworICAgIHZvaWQgcG9wdWxhdGVQYWdlVVJMVG9JY29uVVJM
TWFwKCk7CisgICAgdm9pZCBwcnVuZVRpbWVyRmlyZWQoKTsKKyAgICB2b2lkIHN0YXJ0UHJ1bmVU
aW1lcigpOworICAgIHZvaWQgY2xlYXJTdGF0ZW1lbnRzKCk7CisgICAgdm9pZCBjbGVhckxvYWRl
ZEljb25zVGltZXJGaXJlZCgpOworICAgIHZvaWQgc3RhcnRDbGVhckxvYWRlZEljb25zVGltZXIo
KTsKKyAgICBPcHRpb25hbDxpbnQ2NF90PiBpY29uSURGb3JJY29uVVJMKGNvbnN0IFN0cmluZyYs
IGJvb2wmIGV4cGlyZWQpOworICAgIGJvb2wgc2V0SWNvbklERm9yUGFnZVVSTChpbnQ2NF90LCBj
b25zdCBTdHJpbmcmKTsKKyAgICBWZWN0b3I8Y2hhcj4gaWNvbkRhdGEoaW50NjRfdCk7CisgICAg
T3B0aW9uYWw8aW50NjRfdD4gYWRkSWNvbihjb25zdCBTdHJpbmcmLCBjb25zdCBWZWN0b3I8Y2hh
cj4mKTsKKyAgICB2b2lkIHVwZGF0ZUljb25UaW1lc3RhbXAoaW50NjRfdCBpY29uSUQsIGludDY0
X3QgdGltZXN0YW1wKTsKKyAgICB2b2lkIGRlbGV0ZUljb24oaW50NjRfdCk7CisKKyAgICBSZWY8
V29ya1F1ZXVlPiBtX3dvcmtRdWV1ZTsKKyAgICBBbGxvd0RhdGFiYXNlV3JpdGUgbV9hbGxvd0Rh
dGFiYXNlV3JpdGUgeyBBbGxvd0RhdGFiYXNlV3JpdGU6OlllcyB9OworICAgIFdlYkNvcmU6OlNR
TGl0ZURhdGFiYXNlIG1fZGI7CisgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbV9wYWdlVVJM
VG9JY29uVVJMTWFwOworICAgIEhhc2hNYXA8U3RyaW5nLCBzdGQ6OnBhaXI8V2ViQ29yZTo6TmF0
aXZlSW1hZ2VQdHIsIE1vbm90b25pY1RpbWU+PiBtX2xvYWRlZEljb25zOworCisgICAgc3RkOjp1
bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9pY29uSURGb3JJY29uVVJMU3Rh
dGVtZW50OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1f
c2V0SWNvbklERm9yUGFnZVVSTFN0YXRlbWVudDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29y
ZTo6U1FMaXRlU3RhdGVtZW50PiBtX3JlbW92ZVBhZ2VVUkxTdGF0ZW1lbnQ7Ci0gICAgc3RkOjp1
bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9nZXRJY29uSURGb3JJY29uVVJM
U3RhdGVtZW50OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+
IG1fZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTFN0YXRlbWVudDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8
V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX2FkZEljb25Ub0ljb25JbmZvU3RhdGVtZW50Owot
ICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1fYWRkSWNvblRv
SWNvbkRhdGFTdGF0ZW1lbnQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0
YXRlbWVudD4gbV9nZXRJbWFnZURhdGFTdGF0ZW1lbnQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdl
YkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9kZWxldGVQYWdlVVJMc0Zvckljb25VUkxTdGF0ZW1l
bnQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9kZWxl
dGVJY29uRnJvbUljb25JbmZvU3RhdGVtZW50OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3Jl
OjpTUUxpdGVTdGF0ZW1lbnQ+IG1fZGVsZXRlSWNvbkZyb21JY29uRGF0YVN0YXRlbWVudDsKLSAg
ICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX3VwZGF0ZUljb25J
bmZvU3RhdGVtZW50OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1l
bnQ+IG1fdXBkYXRlSWNvbkRhdGFTdGF0ZW1lbnQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNv
cmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9zZXRJY29uSW5mb1N0YXRlbWVudDsKLSAgICBzdGQ6OnVu
aXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX3NldEljb25EYXRhU3RhdGVtZW50
OwotCi0gICAgTWFpblRocmVhZE5vdGlmaWVyIG1fbWFpblRocmVhZE5vdGlmaWVyOworICAgIHN0
ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1faWNvbkRhdGFTdGF0ZW1l
bnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9hZGRJ
Y29uU3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1l
bnQ+IG1fYWRkSWNvbkRhdGFTdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6
OlNRTGl0ZVN0YXRlbWVudD4gbV91cGRhdGVJY29uVGltZXN0YW1wU3RhdGVtZW50OworICAgIHN0
ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1fZGVsZXRlUGFnZVVSTHNG
b3JJY29uU3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0
ZW1lbnQ+IG1fZGVsZXRlSWNvbkRhdGFTdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdl
YkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9kZWxldGVJY29uU3RhdGVtZW50OworICAgIHN0ZDo6
dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1fcHJ1bmVJY29uc1N0YXRlbWVu
dDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxSdW5Mb29wOjpUaW1lcjxJY29uRGF0YWJhc2U+PiBt
X3BydW5lVGltZXI7CisgICAgUnVuTG9vcDo6VGltZXI8SWNvbkRhdGFiYXNlPiBtX2NsZWFyTG9h
ZGVkSWNvbnNUaW1lcjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlLmNw
cCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFz
ZS5jcHAKaW5kZXggMjhlNjYyMDY2N2IuLmY2ZmVmMzlmNTRjIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwCisrKyBi
L1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZS5j
cHAKQEAgLTIyLDcgKzIyLDYgQEAKIAogI2luY2x1ZGUgIkljb25EYXRhYmFzZS5oIgogI2luY2x1
ZGUgIldlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUuaCIKLSNpbmNsdWRlICJXZWJQcmVmZXJl
bmNlcy5oIgogI2luY2x1ZGUgPFdlYkNvcmUvSW1hZ2UuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0lu
dFNpemUuaD4KICNpbmNsdWRlIDxXZWJDb3JlL1JlZlB0ckNhaXJvLmg+CkBAIC0zMCwxMiArMjks
MTAgQEAKICNpbmNsdWRlIDxnbGliL2dpMThuLWxpYi5oPgogI2luY2x1ZGUgPHd0Zi9GaWxlU3lz
dGVtLmg+CiAjaW5jbHVkZSA8d3RmL1J1bkxvb3AuaD4KLSNpbmNsdWRlIDx3dGYvU2V0Rm9yU2Nv
cGUuaD4KICNpbmNsdWRlIDx3dGYvZ2xpYi9HUmVmUHRyLmg+CiAjaW5jbHVkZSA8d3RmL2dsaWIv
R1VuaXF1ZVB0ci5oPgogI2luY2x1ZGUgPHd0Zi9nbGliL1dURkdUeXBlLmg+CiAjaW5jbHVkZSA8
d3RmL3RleHQvQ1N0cmluZy5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KIAog
dXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwpAQCAtNjgs
MzUgKzY1LDE0IEBAIGVudW0gewogCiBzdGF0aWMgZ3VpbnQgc2lnbmFsc1tMQVNUX1NJR05BTF0g
PSB7IDAsIH07CiAKLXR5cGVkZWYgVmVjdG9yPEdSZWZQdHI8R1Rhc2s+ID4gUGVuZGluZ0ljb25S
ZXF1ZXN0VmVjdG9yOwotdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgUGVuZGluZ0ljb25SZXF1ZXN0
VmVjdG9yKj4gUGVuZGluZ0ljb25SZXF1ZXN0TWFwOwotCiBzdHJ1Y3QgX1dlYktpdEZhdmljb25E
YXRhYmFzZVByaXZhdGUgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxJY29uRGF0YWJhc2U+IGljb25E
YXRhYmFzZTsKLSAgICBWZWN0b3I8c3RkOjpwYWlyPFN0cmluZywgRnVuY3Rpb248dm9pZChib29s
KT4+PiBwZW5kaW5nTG9hZERlY2lzaW9uczsKLSAgICBQZW5kaW5nSWNvblJlcXVlc3RNYXAgcGVu
ZGluZ0ljb25SZXF1ZXN0czsKLSAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwYWdlVVJMVG9J
Y29uVVJMTWFwOwotICAgIGJvb2wgaXNVUkxJbXBvcnRDb21wbGV0ZWQ7Ci0gICAgYm9vbCBpc1Nl
dHRpbmdJY29uOworICAgIFJlZlB0cjxJY29uRGF0YWJhc2U+IGljb25EYXRhYmFzZTsKIH07CiAK
IFdFQktJVF9ERUZJTkVfVFlQRShXZWJLaXRGYXZpY29uRGF0YWJhc2UsIHdlYmtpdF9mYXZpY29u
X2RhdGFiYXNlLCBHX1RZUEVfT0JKRUNUKQogCi1zdGF0aWMgdm9pZCB3ZWJraXRGYXZpY29uRGF0
YWJhc2VEaXNwb3NlKEdPYmplY3QqIG9iamVjdCkKLXsKLSAgICBXZWJLaXRGYXZpY29uRGF0YWJh
c2UqIGRhdGFiYXNlID0gV0VCS0lUX0ZBVklDT05fREFUQUJBU0Uob2JqZWN0KTsKLQotICAgIGlm
ICh3ZWJraXRGYXZpY29uRGF0YWJhc2VJc09wZW4oZGF0YWJhc2UpKQotICAgICAgICBkYXRhYmFz
ZS0+cHJpdi0+aWNvbkRhdGFiYXNlLT5jbG9zZSgpOwotCi0gICAgR19PQkpFQ1RfQ0xBU1Mod2Vi
a2l0X2Zhdmljb25fZGF0YWJhc2VfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZShvYmplY3QpOwotfQot
CiBzdGF0aWMgdm9pZCB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9jbGFzc19pbml0KFdlYktpdEZh
dmljb25EYXRhYmFzZUNsYXNzKiBmYXZpY29uRGF0YWJhc2VDbGFzcykKIHsKLSAgICBHT2JqZWN0
Q2xhc3MqIGdPYmplY3RDbGFzcyA9IEdfT0JKRUNUX0NMQVNTKGZhdmljb25EYXRhYmFzZUNsYXNz
KTsKLSAgICBnT2JqZWN0Q2xhc3MtPmRpc3Bvc2UgPSB3ZWJraXRGYXZpY29uRGF0YWJhc2VEaXNw
b3NlOwotCiAgICAgLyoqCiAgICAgICogV2ViS2l0RmF2aWNvbkRhdGFiYXNlOjpmYXZpY29uLWNo
YW5nZWQ6CiAgICAgICogQGRhdGFiYXNlOiB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBzaWduYWwg
aXMgZW1pdHRlZApAQCAtMTIxLDIyNSArOTcsNjIgQEAgc3RhdGljIHZvaWQgd2Via2l0X2Zhdmlj
b25fZGF0YWJhc2VfY2xhc3NfaW5pdChXZWJLaXRGYXZpY29uRGF0YWJhc2VDbGFzcyogZmF2aWMK
ICAgICAgICAgR19UWVBFX1NUUklORyk7CiB9CiAKLSNpZiBQTEFURk9STShHVEspCi1zdHJ1Y3Qg
R2V0RmF2aWNvblN1cmZhY2VBc3luY0RhdGEgewotICAgIH5HZXRGYXZpY29uU3VyZmFjZUFzeW5j
RGF0YSgpCi0gICAgewotICAgICAgICBpZiAoc2hvdWxkUmVsZWFzZUljb25Gb3JQYWdlVVJMKQot
ICAgICAgICAgICAgZmF2aWNvbkRhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnJlbGVhc2VJ
Y29uRm9yUGFnZVVSTChwYWdlVVJMKTsKLSAgICB9Ci0KLSAgICBHUmVmUHRyPFdlYktpdEZhdmlj
b25EYXRhYmFzZT4gZmF2aWNvbkRhdGFiYXNlOwotICAgIFN0cmluZyBwYWdlVVJMOwotICAgIFJl
ZlB0cjxjYWlyb19zdXJmYWNlX3Q+IGljb247Ci0gICAgR1JlZlB0cjxHQ2FuY2VsbGFibGU+IGNh
bmNlbGxhYmxlOwotICAgIGJvb2wgc2hvdWxkUmVsZWFzZUljb25Gb3JQYWdlVVJMOwotfTsKLVdF
QktJVF9ERUZJTkVfQVNZTkNfREFUQV9TVFJVQ1QoR2V0RmF2aWNvblN1cmZhY2VBc3luY0RhdGEp
Ci0KLXN0YXRpYyBSZWZQdHI8Y2Fpcm9fc3VyZmFjZV90PiBnZXRJY29uU3VyZmFjZVN5bmNocm9u
b3VzbHkoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgU3RyaW5nJiBwYWdl
VVJMLCBHRXJyb3IqKiBlcnJvcikKLXsKLSAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwot
Ci0gICAgLy8gVGhlIGV4YWN0IHNpemUgd2UgcGFzcyBpcyBpcnJlbGV2YW50IHRvIHRoZSBpY29u
RGF0YWJhc2UgY29kZS4KLSAgICAvLyBXZSBtdXN0IHBhc3Mgc29tZXRoaW5nIGdyZWF0ZXIgdGhh
biAweDAgdG8gZ2V0IGFuIGljb24uCi0gICAgYXV0byBpY29uRGF0YSA9IGRhdGFiYXNlLT5wcml2
LT5pY29uRGF0YWJhc2UtPnN5bmNocm9ub3VzSWNvbkZvclBhZ2VVUkwocGFnZVVSTCwgV2ViQ29y
ZTo6SW50U2l6ZSgxLCAxKSk7Ci0gICAgaWYgKGljb25EYXRhLnNlY29uZCA9PSBJY29uRGF0YWJh
c2U6OklzS25vd25JY29uOjpObykgewotICAgICAgICBnX3NldF9lcnJvcihlcnJvciwgV0VCS0lU
X0ZBVklDT05fREFUQUJBU0VfRVJST1IsIFdFQktJVF9GQVZJQ09OX0RBVEFCQVNFX0VSUk9SX0ZB
VklDT05fVU5LTk9XTiwgXygiVW5rbm93biBmYXZpY29uIGZvciBwYWdlICVzIiksIHBhZ2VVUkwu
dXRmOCgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGlm
ICghaWNvbkRhdGEuZmlyc3QpIHsKLSAgICAgICAgZ19zZXRfZXJyb3IoZXJyb3IsIFdFQktJVF9G
QVZJQ09OX0RBVEFCQVNFX0VSUk9SLCBXRUJLSVRfRkFWSUNPTl9EQVRBQkFTRV9FUlJPUl9GQVZJ
Q09OX05PVF9GT1VORCwgXygiUGFnZSAlcyBkb2VzIG5vdCBoYXZlIGEgZmF2aWNvbiIpLCBwYWdl
VVJMLnV0ZjgoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAg
ICByZXR1cm4gaWNvbkRhdGEuZmlyc3Q7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGV0ZVBlbmRpbmdJ
Y29uUmVxdWVzdHMoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgUGVuZGluZ0ljb25S
ZXF1ZXN0VmVjdG9yKiByZXF1ZXN0cywgY29uc3QgU3RyaW5nJiBwYWdlVVJMKQotewotICAgIGRh
dGFiYXNlLT5wcml2LT5wZW5kaW5nSWNvblJlcXVlc3RzLnJlbW92ZShwYWdlVVJMKTsKLSAgICBk
ZWxldGUgcmVxdWVzdHM7Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NQZW5kaW5nSWNvbnNGb3JQ
YWdlVVJMKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0IFN0cmluZyYgcGFn
ZVVSTCkKLXsKLSAgICBQZW5kaW5nSWNvblJlcXVlc3RWZWN0b3IqIHBlbmRpbmdJY29uUmVxdWVz
dHMgPSBkYXRhYmFzZS0+cHJpdi0+cGVuZGluZ0ljb25SZXF1ZXN0cy5nZXQocGFnZVVSTCk7Ci0g
ICAgaWYgKCFwZW5kaW5nSWNvblJlcXVlc3RzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBHVW5p
cXVlT3V0UHRyPEdFcnJvcj4gZXJyb3I7Ci0gICAgUmVmUHRyPGNhaXJvX3N1cmZhY2VfdD4gaWNv
biA9IGdldEljb25TdXJmYWNlU3luY2hyb25vdXNseShkYXRhYmFzZSwgcGFnZVVSTCwgJmVycm9y
Lm91dFB0cigpKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGVuZGluZ0ljb25SZXF1
ZXN0cy0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgR1Rhc2sqIHRhc2sgPSBwZW5kaW5nSWNvblJl
cXVlc3RzLT5hdChpKS5nZXQoKTsKLSAgICAgICAgaWYgKGVycm9yKQotICAgICAgICAgICAgZ190
YXNrX3JldHVybl9lcnJvcih0YXNrLCBlcnJvci5yZWxlYXNlKCkpOwotICAgICAgICBlbHNlIHsK
LSAgICAgICAgICAgIEdldEZhdmljb25TdXJmYWNlQXN5bmNEYXRhKiBkYXRhID0gc3RhdGljX2Nh
c3Q8R2V0RmF2aWNvblN1cmZhY2VBc3luY0RhdGEqPihnX3Rhc2tfZ2V0X3Rhc2tfZGF0YSh0YXNr
KSk7Ci0gICAgICAgICAgICBkYXRhLT5pY29uID0gaWNvbjsKLSAgICAgICAgICAgIGRhdGEtPnNo
b3VsZFJlbGVhc2VJY29uRm9yUGFnZVVSTCA9IGZhbHNlOwotICAgICAgICAgICAgZ190YXNrX3Jl
dHVybl9ib29sZWFuKHRhc2ssIFRSVUUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGRlbGV0ZVBl
bmRpbmdJY29uUmVxdWVzdHMoZGF0YWJhc2UsIHBlbmRpbmdJY29uUmVxdWVzdHMsIHBhZ2VVUkwp
OwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldEljb25V
UkxGb3JQYWdlVVJMKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0IFN0cmlu
ZyYgaWNvblVSTCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMKQorV2ViS2l0RmF2aWNvbkRhdGFiYXNl
KiB3ZWJraXRGYXZpY29uRGF0YWJhc2VDcmVhdGUoKQogewotICAgIFdlYktpdEZhdmljb25EYXRh
YmFzZVByaXZhdGUqIHByaXYgPSBkYXRhYmFzZS0+cHJpdjsKLSAgICBpZiAoIXByaXYtPmlzVVJM
SW1wb3J0Q29tcGxldGVkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAocGFnZVVSTC5pc0Vt
cHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0IFN0cmluZyYgY3VycmVudEljb25V
UkwgPSBwcml2LT5wYWdlVVJMVG9JY29uVVJMTWFwLmdldChwYWdlVVJMKTsKLSAgICBpZiAoaWNv
blVSTCA9PSBjdXJyZW50SWNvblVSTCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcHJpdi0+cGFn
ZVVSTFRvSWNvblVSTE1hcC5zZXQocGFnZVVSTCwgaWNvblVSTCk7Ci0gICAgaWYgKHByaXYtPmlz
U2V0dGluZ0ljb24pCi0gICAgICAgIHJldHVybjsKLQotICAgIGdfc2lnbmFsX2VtaXQoZGF0YWJh
c2UsIHNpZ25hbHNbRkFWSUNPTl9DSEFOR0VEXSwgMCwgcGFnZVVSTC51dGY4KCkuZGF0YSgpLCBp
Y29uVVJMLnV0ZjgoKS5kYXRhKCkpOworICAgIHJldHVybiBXRUJLSVRfRkFWSUNPTl9EQVRBQkFT
RShnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfRkFWSUNPTl9EQVRBQkFTRSwgbnVsbHB0cikpOwog
fQogCi1jbGFzcyBXZWJLaXRJY29uRGF0YWJhc2VDbGllbnQgZmluYWwgOiBwdWJsaWMgSWNvbkRh
dGFiYXNlQ2xpZW50IHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBXZWJLaXRJY29uRGF0YWJhc2VD
bGllbnQoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSkKLSAgICAgICAgOiBtX2RhdGFi
YXNlKGRhdGFiYXNlKQotICAgIHsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBkaWRJbXBv
cnRJY29uVVJMRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VVUkwpIG92ZXJyaWRlCi0gICAg
ewotICAgICAgICBTdHJpbmcgaWNvblVSTCA9IG1fZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFz
ZS0+c3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChwYWdlVVJMKTsKLSAgICAgICAgd2Via2l0
RmF2aWNvbkRhdGFiYXNlU2V0SWNvblVSTEZvclBhZ2VVUkwobV9kYXRhYmFzZSwgaWNvblVSTCwg
cGFnZVVSTCk7Ci0gICAgfQotCi0gICAgdm9pZCBkaWRDaGFuZ2VJY29uRm9yUGFnZVVSTChjb25z
dCBTdHJpbmcmIHBhZ2VVUkwpIG92ZXJyaWRlCi0gICAgewotICAgICAgICBpZiAobV9kYXRhYmFz
ZS0+cHJpdi0+aXNTZXR0aW5nSWNvbikKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgU3Ry
aW5nIGljb25VUkwgPSBtX2RhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnN5bmNocm9ub3Vz
SWNvblVSTEZvclBhZ2VVUkwocGFnZVVSTCk7Ci0gICAgICAgIHdlYmtpdEZhdmljb25EYXRhYmFz
ZVNldEljb25VUkxGb3JQYWdlVVJMKG1fZGF0YWJhc2UsIGljb25VUkwsIHBhZ2VVUkwpOwotICAg
IH0KLQotICAgIHZvaWQgZGlkSW1wb3J0SWNvbkRhdGFGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYg
cGFnZVVSTCkgb3ZlcnJpZGUKLSAgICB7Ci0jaWYgUExBVEZPUk0oR1RLKQotICAgICAgICBwcm9j
ZXNzUGVuZGluZ0ljb25zRm9yUGFnZVVSTChtX2RhdGFiYXNlLCBwYWdlVVJMKTsKLSNlbmRpZgot
ICAgICAgICBTdHJpbmcgaWNvblVSTCA9IG1fZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFzZS0+
c3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChwYWdlVVJMKTsKLSAgICAgICAgd2Via2l0RmF2
aWNvbkRhdGFiYXNlU2V0SWNvblVSTEZvclBhZ2VVUkwobV9kYXRhYmFzZSwgaWNvblVSTCwgcGFn
ZVVSTCk7Ci0gICAgfQotCi0gICAgdm9pZCBkaWRGaW5pc2hVUkxJbXBvcnQoKSBvdmVycmlkZQot
ICAgIHsKLSAgICAgICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSogcHJpdiA9IG1fZGF0
YWJhc2UtPnByaXY7Ci0KLSAgICAgICAgd2hpbGUgKCFwcml2LT5wZW5kaW5nTG9hZERlY2lzaW9u
cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGF1dG8gaWNvblVSTEFuZENhbGxiYWNrID0gcHJp
di0+cGVuZGluZ0xvYWREZWNpc2lvbnMudGFrZUxhc3QoKTsKLSAgICAgICAgICAgIGF1dG8gZGVj
aXNpb24gPSBwcml2LT5pY29uRGF0YWJhc2UtPnN5bmNocm9ub3VzTG9hZERlY2lzaW9uRm9ySWNv
blVSTChpY29uVVJMQW5kQ2FsbGJhY2suZmlyc3QpOwotICAgICAgICAgICAgLy8gRGVjaXNpb25z
IHNob3VsZCBuZXZlciBiZSB1bmtub3duIGFmdGVyIHRoZSBpbml0YWwgaW1wb3J0IGlzIGNvbXBs
ZXRlLgotICAgICAgICAgICAgQVNTRVJUKGRlY2lzaW9uICE9IEljb25EYXRhYmFzZTo6SWNvbkxv
YWREZWNpc2lvbjo6VW5rbm93bik7Ci0gICAgICAgICAgICBpY29uVVJMQW5kQ2FsbGJhY2suc2Vj
b25kKGRlY2lzaW9uID09IEljb25EYXRhYmFzZTo6SWNvbkxvYWREZWNpc2lvbjo6WWVzKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHByaXYtPmlzVVJMSW1wb3J0Q29tcGxldGVkID0gdHJ1ZTsKLSAg
ICB9Ci0KLSAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2UqIG1fZGF0YWJhc2U7Ci19OwotCi1XZWJL
aXRGYXZpY29uRGF0YWJhc2UqIHdlYmtpdEZhdmljb25EYXRhYmFzZUNyZWF0ZSgpCitzdGF0aWMg
Ym9vbCB3ZWJraXRGYXZpY29uRGF0YWJhc2VJc09wZW4oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBk
YXRhYmFzZSkKIHsKLSAgICByZXR1cm4gV0VCS0lUX0ZBVklDT05fREFUQUJBU0UoZ19vYmplY3Rf
bmV3KFdFQktJVF9UWVBFX0ZBVklDT05fREFUQUJBU0UsIG51bGxwdHIpKTsKKyAgICByZXR1cm4g
ISFkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlOwogfQogCi12b2lkIHdlYmtpdEZhdmljb25E
YXRhYmFzZU9wZW4oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgU3RyaW5n
JiBwYXRoKQordm9pZCB3ZWJraXRGYXZpY29uRGF0YWJhc2VPcGVuKFdlYktpdEZhdmljb25EYXRh
YmFzZSogZGF0YWJhc2UsIGNvbnN0IFN0cmluZyYgcGF0aCwgYm9vbCBpc0VwaGVtZXJhbCkKIHsK
ICAgICBpZiAod2Via2l0RmF2aWNvbkRhdGFiYXNlSXNPcGVuKGRhdGFiYXNlKSkKICAgICAgICAg
cmV0dXJuOwogCi0gICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSogcHJpdiA9IGRhdGFi
YXNlLT5wcml2OwotICAgIHByaXYtPmljb25EYXRhYmFzZSA9IG1ha2VVbmlxdWU8SWNvbkRhdGFi
YXNlPigpOwotICAgIHByaXYtPmljb25EYXRhYmFzZS0+c2V0Q2xpZW50KG1ha2VVbmlxdWU8V2Vi
S2l0SWNvbkRhdGFiYXNlQ2xpZW50PihkYXRhYmFzZSkpOwotICAgIEljb25EYXRhYmFzZTo6ZGVs
YXlEYXRhYmFzZUNsZWFudXAoKTsKLSAgICBwcml2LT5pY29uRGF0YWJhc2UtPnNldEVuYWJsZWQo
dHJ1ZSk7Ci0KLSAgICBpZiAoIXByaXYtPmljb25EYXRhYmFzZS0+b3BlbihGaWxlU3lzdGVtOjpk
aXJlY3RvcnlOYW1lKHBhdGgpLCBGaWxlU3lzdGVtOjpwYXRoR2V0RmlsZU5hbWUocGF0aCkpKSB7
Ci0gICAgICAgIHByaXYtPmljb25EYXRhYmFzZSA9IG51bGxwdHI7Ci0gICAgICAgIEljb25EYXRh
YmFzZTo6YWxsb3dEYXRhYmFzZUNsZWFudXAoKTsKLSAgICB9Ci19Ci0KLWJvb2wgd2Via2l0RmF2
aWNvbkRhdGFiYXNlSXNPcGVuKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UpCi17Ci0g
ICAgcmV0dXJuIGRhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UgJiYgZGF0YWJhc2UtPnByaXYt
Pmljb25EYXRhYmFzZS0+aXNPcGVuKCk7CisgICAgZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFz
ZSA9IEljb25EYXRhYmFzZTo6Y3JlYXRlKHBhdGgsIGlzRXBoZW1lcmFsID8gSWNvbkRhdGFiYXNl
OjpBbGxvd0RhdGFiYXNlV3JpdGU6Ok5vIDogSWNvbkRhdGFiYXNlOjpBbGxvd0RhdGFiYXNlV3Jp
dGU6Olllcyk7CiB9CiAKLXZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0UHJpdmF0ZUJyb3dz
aW5nRW5hYmxlZChXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFiYXNlLCBib29sIGVuYWJsZWQp
Cit2b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZUNsb3NlKFdlYktpdEZhdmljb25EYXRhYmFzZSog
ZGF0YWJhc2UpCiB7Ci0gICAgaWYgKGRhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UpCi0gICAg
ICAgIGRhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnNldFByaXZhdGVCcm93c2luZ0VuYWJs
ZWQoZW5hYmxlZCk7CisgICAgZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFzZSA9IG51bGxwdHI7
CiB9CiAKICNpZiBQTEFURk9STShHVEspCi12b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZUdldExv
YWREZWNpc2lvbkZvckljb24oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3Qg
TGlua0ljb24mIGljb24sIGNvbnN0IFN0cmluZyYgcGFnZVVSTCwgRnVuY3Rpb248dm9pZChib29s
KT4mJiBjb21wbGV0aW9uSGFuZGxlcikKK3ZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlR2V0TG9h
ZERlY2lzaW9uRm9ySWNvbihXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFiYXNlLCBjb25zdCBM
aW5rSWNvbiYgaWNvbiwgY29uc3QgU3RyaW5nJiBwYWdlVVJMLCBib29sIGlzRXBoZW1lcmFsLCBG
dW5jdGlvbjx2b2lkKGJvb2wpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQogewogICAgIGlmICghd2Vi
a2l0RmF2aWNvbkRhdGFiYXNlSXNPcGVuKGRhdGFiYXNlKSkgewogICAgICAgICBjb21wbGV0aW9u
SGFuZGxlcihmYWxzZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBXZWJLaXRGYXZp
Y29uRGF0YWJhc2VQcml2YXRlKiBwcml2ID0gZGF0YWJhc2UtPnByaXY7Ci0gICAgYXV0byBkZWNp
c2lvbiA9IHByaXYtPmljb25EYXRhYmFzZS0+c3luY2hyb25vdXNMb2FkRGVjaXNpb25Gb3JJY29u
VVJMKGljb24udXJsLnN0cmluZygpKTsKLSAgICBzd2l0Y2ggKGRlY2lzaW9uKSB7Ci0gICAgY2Fz
ZSBJY29uRGF0YWJhc2U6Okljb25Mb2FkRGVjaXNpb246OlVua25vd246Ci0gICAgICAgIHByaXYt
PnBlbmRpbmdMb2FkRGVjaXNpb25zLmFwcGVuZChzdGQ6Om1ha2VfcGFpcihpY29uLnVybC5zdHJp
bmcoKSwgV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcikpKTsKLSAgICAgICAgcHJpdi0+aWNvbkRh
dGFiYXNlLT5zZXRJY29uVVJMRm9yUGFnZVVSTChpY29uLnVybC5zdHJpbmcoKSwgcGFnZVVSTCk7
Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSWNvbkRhdGFiYXNlOjpJY29uTG9hZERlY2lzaW9u
OjpObzoKLSAgICAgICAgcHJpdi0+aWNvbkRhdGFiYXNlLT5zZXRJY29uVVJMRm9yUGFnZVVSTChp
Y29uLnVybC5zdHJpbmcoKSwgcGFnZVVSTCk7Ci0gICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKGZh
bHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJY29uRGF0YWJhc2U6Okljb25Mb2FkRGVj
aXNpb246OlllczoKLSAgICAgICAgY29tcGxldGlvbkhhbmRsZXIodHJ1ZSk7Ci0gICAgICAgIGJy
ZWFrOwotICAgIH0KKyAgICBkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlLT5jaGVja0ljb25V
UkxBbmRTZXRQYWdlVVJMSWZOZWVkZWQoaWNvbi51cmwuc3RyaW5nKCksIHBhZ2VVUkwsCisgICAg
ICAgIGlzRXBoZW1lcmFsID8gSWNvbkRhdGFiYXNlOjpBbGxvd0RhdGFiYXNlV3JpdGU6Ok5vIDog
SWNvbkRhdGFiYXNlOjpBbGxvd0RhdGFiYXNlV3JpdGU6OlllcywKKyAgICAgICAgICAgIFtkYXRh
YmFzZSA9IEdSZWZQdHI8V2ViS2l0RmF2aWNvbkRhdGFiYXNlPihkYXRhYmFzZSksIHVybCA9IGlj
b24udXJsLnN0cmluZygpLmlzb2xhdGVkQ29weSgpLCBwYWdlVVJMID0gcGFnZVVSTC5pc29sYXRl
ZENvcHkoKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0o
Ym9vbCBmb3VuZCwgYm9vbCBjaGFuZ2VkKSB7CisgICAgICAgICAgICBpZiAoIXdlYmtpdEZhdmlj
b25EYXRhYmFzZUlzT3BlbihkYXRhYmFzZS5nZXQoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgICAgICBpZiAoZm91bmQgJiYgY2hhbmdlZCkKKyAgICAgICAgICAgICAgICBn
X3NpZ25hbF9lbWl0KGRhdGFiYXNlLmdldCgpLCBzaWduYWxzW0ZBVklDT05fQ0hBTkdFRF0sIDAs
IHBhZ2VVUkwudXRmOCgpLmRhdGEoKSwgdXJsLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAg
Y29tcGxldGlvbkhhbmRsZXIoIWZvdW5kKTsKKyAgICAgICAgfSk7CiB9CiAKLXZvaWQgd2Via2l0
RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBhZ2VVUkwoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBk
YXRhYmFzZSwgY29uc3QgTGlua0ljb24mIGljb24sIEFQSTo6RGF0YSYgaWNvbkRhdGEsIGNvbnN0
IFN0cmluZyYgcGFnZVVSTCkKK3ZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBh
Z2VVUkwoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgTGlua0ljb24mIGlj
b24sIEFQSTo6RGF0YSYgaWNvbkRhdGEsIGNvbnN0IFN0cmluZyYgcGFnZVVSTCwgYm9vbCBpc0Vw
aGVtZXJhbCkKIHsKICAgICBpZiAoIXdlYmtpdEZhdmljb25EYXRhYmFzZUlzT3BlbihkYXRhYmFz
ZSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGlmIChwYWdlVVJMLmlzRW1wdHkoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSogcHJpdiA9IGRh
dGFiYXNlLT5wcml2OwotICAgIFNldEZvclNjb3BlPGJvb2w+IGNoYW5nZShwcml2LT5pc1NldHRp
bmdJY29uLCB0cnVlKTsKLSAgICBwcml2LT5pY29uRGF0YWJhc2UtPnNldEljb25VUkxGb3JQYWdl
VVJMKGljb24udXJsLnN0cmluZygpLCBwYWdlVVJMKTsKLSAgICBwcml2LT5pY29uRGF0YWJhc2Ut
PnNldEljb25EYXRhRm9ySWNvblVSTChTaGFyZWRCdWZmZXI6OmNyZWF0ZShpY29uRGF0YS5ieXRl
cygpLCBpY29uRGF0YS5zaXplKCkpLCBpY29uLnVybC5zdHJpbmcoKSk7Ci0gICAgd2Via2l0RmF2
aWNvbkRhdGFiYXNlU2V0SWNvblVSTEZvclBhZ2VVUkwoZGF0YWJhc2UsIGljb24udXJsLnN0cmlu
ZygpLCBwYWdlVVJMKTsKLSAgICBnX3NpZ25hbF9lbWl0KGRhdGFiYXNlLCBzaWduYWxzW0ZBVklD
T05fQ0hBTkdFRF0sIDAsIHBhZ2VVUkwudXRmOCgpLmRhdGEoKSwgaWNvbi51cmwuc3RyaW5nKCku
dXRmOCgpLmRhdGEoKSk7Ci0gICAgcHJvY2Vzc1BlbmRpbmdJY29uc0ZvclBhZ2VVUkwoZGF0YWJh
c2UsIHBhZ2VVUkwpOwotfQotCi1zdGF0aWMgUGVuZGluZ0ljb25SZXF1ZXN0VmVjdG9yKiBnZXRP
ckNyZWF0ZVBlbmRpbmdJY29uUmVxdWVzdHMoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFz
ZSwgY29uc3QgU3RyaW5nJiBwYWdlVVJMKQotewotICAgIFBlbmRpbmdJY29uUmVxdWVzdFZlY3Rv
ciogaWNvbnMgPSBkYXRhYmFzZS0+cHJpdi0+cGVuZGluZ0ljb25SZXF1ZXN0cy5nZXQocGFnZVVS
TCk7Ci0gICAgaWYgKCFpY29ucykgewotICAgICAgICBpY29ucyA9IG5ldyBQZW5kaW5nSWNvblJl
cXVlc3RWZWN0b3I7Ci0gICAgICAgIGRhdGFiYXNlLT5wcml2LT5wZW5kaW5nSWNvblJlcXVlc3Rz
LnNldChwYWdlVVJMLCBpY29ucyk7Ci0gICAgfQorICAgIGRhdGFiYXNlLT5wcml2LT5pY29uRGF0
YWJhc2UtPnNldEljb25Gb3JQYWdlVVJMKGljb24udXJsLnN0cmluZygpLCBpY29uRGF0YS5ieXRl
cygpLCBpY29uRGF0YS5zaXplKCksIHBhZ2VVUkwsCisgICAgICAgIGlzRXBoZW1lcmFsID8gSWNv
bkRhdGFiYXNlOjpBbGxvd0RhdGFiYXNlV3JpdGU6Ok5vIDogSWNvbkRhdGFiYXNlOjpBbGxvd0Rh
dGFiYXNlV3JpdGU6OlllcywKKyAgICAgICAgW2RhdGFiYXNlID0gR1JlZlB0cjxXZWJLaXRGYXZp
Y29uRGF0YWJhc2U+KGRhdGFiYXNlKSwgdXJsID0gaWNvbi51cmwuc3RyaW5nKCkuaXNvbGF0ZWRD
b3B5KCksIHBhZ2VVUkwgPSBwYWdlVVJMLmlzb2xhdGVkQ29weSgpXShib29sIHN1Y2Nlc3MpIHsK
KyAgICAgICAgICAgIGlmICghd2Via2l0RmF2aWNvbkRhdGFiYXNlSXNPcGVuKGRhdGFiYXNlLmdl
dCgpKSB8fCAhc3VjY2VzcykKKyAgICAgICAgICAgICAgICByZXR1cm47CiAKLSAgICByZXR1cm4g
aWNvbnM7CisgICAgICAgICAgICBnX3NpZ25hbF9lbWl0KGRhdGFiYXNlLmdldCgpLCBzaWduYWxz
W0ZBVklDT05fQ0hBTkdFRF0sIDAsIHBhZ2VVUkwudXRmOCgpLmRhdGEoKSwgdXJsLnV0ZjgoKS5k
YXRhKCkpOworICAgICAgICB9KTsKIH0KICNlbmRpZgogCkBAIC0zNDksMzQgKzE2Miw4IEBAIEdR
dWFyayB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9lcnJvcl9xdWFyayh2b2lkKQogfQogCiAjaWYg
UExBVEZPUk0oR1RLKQotLyoqCi0gKiB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNv
bjoKLSAqIEBkYXRhYmFzZTogYSAjV2ViS2l0RmF2aWNvbkRhdGFiYXNlCi0gKiBAcGFnZV91cmk6
IFVSSSBvZiB0aGUgcGFnZSBmb3Igd2hpY2ggd2Ugd2FudCB0byByZXRyaWV2ZSB0aGUgZmF2aWNv
bgotICogQGNhbmNlbGxhYmxlOiAoYWxsb3ctbm9uZSk6IEEgI0dDYW5jZWxsYWJsZSBvciAlTlVM
TC4KLSAqIEBjYWxsYmFjazogKHNjb3BlIGFzeW5jKTogQSAjR0FzeW5jUmVhZHlDYWxsYmFjayB0
byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMKLSAqICAgICAgICAgICAgc2F0aXNmaWVkIG9yICVO
VUxMIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQuCi0gKiBAdXNlcl9kYXRhOiAo
Y2xvc3VyZSk6IFRoZSBkYXRhIHRvIHBhc3MgdG8gQGNhbGxiYWNrLgotICoKLSAqIEFzeW5jaHJv
bm91c2x5IG9idGFpbnMgYSAjY2Fpcm9fc3VyZmFjZV90IG9mIHRoZSBmYXZpY29uIGZvciB0aGUK
LSAqIGdpdmVuIHBhZ2UgVVJJLiBJdCByZXR1cm5zIHRoZSBjYWNoZWQgaWNvbiBpZiBpdCdzIGlu
IHRoZSBkYXRhYmFzZQotICogYXN5bmNocm9ub3VzbHkgd2FpdGluZyBmb3IgdGhlIGljb24gdG8g
YmUgcmVhZCBmcm9tIHRoZSBkYXRhYmFzZS4KLSAqCi0gKiBUaGlzIGlzIGFuIGFzeW5jaHJvbm91
cyBtZXRob2QuIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBmaW5pc2hlZCwgY2FsbGJhY2sgd2lsbAot
ICogYmUgaW52b2tlZC4gWW91IGNhbiB0aGVuIGNhbGwgd2Via2l0X2Zhdmljb25fZGF0YWJhc2Vf
Z2V0X2Zhdmljb25fZmluaXNoKCkKLSAqIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRp
b24uCi0gKgotICogWW91IG11c3QgY2FsbCB3ZWJraXRfd2ViX2NvbnRleHRfc2V0X2Zhdmljb25f
ZGF0YWJhc2VfZGlyZWN0b3J5KCkgZm9yCi0gKiB0aGUgI1dlYktpdFdlYkNvbnRleHQgYXNzb2Np
YXRlZCB3aXRoIHRoaXMgI1dlYktpdEZhdmljb25EYXRhYmFzZQotICogYmVmb3JlIGF0dGVtcHRp
bmcgdG8gdXNlIHRoaXMgZnVuY3Rpb247IG90aGVyd2lzZSwKLSAqIHdlYmtpdF9mYXZpY29uX2Rh
dGFiYXNlX2dldF9mYXZpY29uX2ZpbmlzaCgpIHdpbGwgcmV0dXJuCi0gKiAlV0VCS0lUX0ZBVklD
T05fREFUQUJBU0VfRVJST1JfTk9UX0lOSVRJQUxJWkVELgotICovCi12b2lkIHdlYmtpdF9mYXZp
Y29uX2RhdGFiYXNlX2dldF9mYXZpY29uKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2Us
IGNvbnN0IGdjaGFyKiBwYWdlVVJJLCBHQ2FuY2VsbGFibGUqIGNhbmNlbGxhYmxlLCBHQXN5bmNS
ZWFkeUNhbGxiYWNrIGNhbGxiYWNrLCBncG9pbnRlciB1c2VyRGF0YSkKK3ZvaWQgd2Via2l0RmF2
aWNvbkRhdGFiYXNlR2V0RmF2aWNvbkludGVybmFsKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0
YWJhc2UsIGNvbnN0IGdjaGFyKiBwYWdlVVJJLCBib29sIGlzRXBoZW1lcmFsLCBHQ2FuY2VsbGFi
bGUqIGNhbmNlbGxhYmxlLCBHQXN5bmNSZWFkeUNhbGxiYWNrIGNhbGxiYWNrLCBncG9pbnRlciB1
c2VyRGF0YSkKIHsKLSAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9JU19GQVZJQ09OX0RBVEFC
QVNFKGRhdGFiYXNlKSk7Ci0gICAgZ19yZXR1cm5faWZfZmFpbChwYWdlVVJJKTsKLQogICAgIGlm
ICghd2Via2l0RmF2aWNvbkRhdGFiYXNlSXNPcGVuKGRhdGFiYXNlKSkgewogICAgICAgICBnX3Rh
c2tfcmVwb3J0X25ld19lcnJvcihkYXRhYmFzZSwgY2FsbGJhY2ssIHVzZXJEYXRhLCAwLAogICAg
ICAgICAgICAgV0VCS0lUX0ZBVklDT05fREFUQUJBU0VfRVJST1IsIFdFQktJVF9GQVZJQ09OX0RB
VEFCQVNFX0VSUk9SX05PVF9JTklUSUFMSVpFRCwgXygiRmF2aWNvbnMgZGF0YWJhc2Ugbm90IGlu
aXRpYWxpemVkIHlldCIpKTsKQEAgLTM5MSw4ICsxNzgsOSBAQCB2b2lkIHdlYmtpdF9mYXZpY29u
X2RhdGFiYXNlX2dldF9mYXZpY29uKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNv
bnN0CiAKICAgICBHUmVmUHRyPEdUYXNrPiB0YXNrID0gYWRvcHRHUmVmKGdfdGFza19uZXcoZGF0
YWJhc2UsIGNhbmNlbGxhYmxlLCBjYWxsYmFjaywgdXNlckRhdGEpKTsKIAorI2lmIDAKICAgICBH
ZXRGYXZpY29uU3VyZmFjZUFzeW5jRGF0YSogZGF0YSA9IGNyZWF0ZUdldEZhdmljb25TdXJmYWNl
QXN5bmNEYXRhKCk7Ci0gICAgZGF0YS0+ZmF2aWNvbkRhdGFiYXNlID0gZGF0YWJhc2U7CisgICAg
ZGF0YS0+aWNvbkRhdGFiYXNlID0gZGF0YWJhc2U7CiAgICAgZGF0YS0+cGFnZVVSTCA9IFN0cmlu
Zzo6ZnJvbVVURjgocGFnZVVSSSk7CiAgICAgZ190YXNrX3NldF90YXNrX2RhdGEodGFzay5nZXQo
KSwgZGF0YSwgcmVpbnRlcnByZXRfY2FzdDxHRGVzdHJveU5vdGlmeT4oZGVzdHJveUdldEZhdmlj
b25TdXJmYWNlQXN5bmNEYXRhKSk7CiAKQEAgLTQzMCw2ICsyMTgsNTAgQEAgdm9pZCB3ZWJraXRf
ZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbihXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFi
YXNlLCBjb25zdAogCiAgICAgZ190YXNrX3JldHVybl9uZXdfZXJyb3IodGFzay5nZXQoKSwgV0VC
S0lUX0ZBVklDT05fREFUQUJBU0VfRVJST1IsIFdFQktJVF9GQVZJQ09OX0RBVEFCQVNFX0VSUk9S
X0ZBVklDT05fVU5LTk9XTiwKICAgICAgICAgXygiVW5rbm93biBmYXZpY29uIGZvciBwYWdlICVz
IiksIHBhZ2VVUkkpOworI2Vsc2UKKyAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2YXRlKiBw
cml2ID0gZGF0YWJhc2UtPnByaXY7CisKKyAgICBwcml2LT5pY29uRGF0YWJhc2UtPmxvYWRJY29u
Rm9yUGFnZVVSTChTdHJpbmc6OmZyb21VVEY4KHBhZ2VVUkkpLCBpc0VwaGVtZXJhbCA/IEljb25E
YXRhYmFzZTo6QWxsb3dEYXRhYmFzZVdyaXRlOjpObyA6IEljb25EYXRhYmFzZTo6QWxsb3dEYXRh
YmFzZVdyaXRlOjpZZXMsCisgICAgICAgIFt0YXNrID0gV1RGTW92ZSh0YXNrKSwgcGFnZVVSSSA9
IENTdHJpbmcocGFnZVVSSSldKFJlZlB0cjxjYWlyb19zdXJmYWNlX3Q+JiYgaWNvbikgeworICAg
ICAgICAgICAgaWYgKCFpY29uKSB7CisgICAgICAgICAgICAgICAgZ190YXNrX3JldHVybl9uZXdf
ZXJyb3IodGFzay5nZXQoKSwgV0VCS0lUX0ZBVklDT05fREFUQUJBU0VfRVJST1IsIFdFQktJVF9G
QVZJQ09OX0RBVEFCQVNFX0VSUk9SX0ZBVklDT05fVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAg
ICAgXygiVW5rbm93biBmYXZpY29uIGZvciBwYWdlICVzIiksIHBhZ2VVUkkuZGF0YSgpKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnX3Rhc2tf
cmV0dXJuX3BvaW50ZXIodGFzay5nZXQoKSwgaWNvbi5sZWFrUmVmKCksIHJlaW50ZXJwcmV0X2Nh
c3Q8R0Rlc3Ryb3lOb3RpZnk+KGNhaXJvX3N1cmZhY2VfZGVzdHJveSkpOworICAgICAgICB9KTsK
KyNlbmRpZgorfQorCisvKioKKyAqIHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29u
OgorICogQGRhdGFiYXNlOiBhICNXZWJLaXRGYXZpY29uRGF0YWJhc2UKKyAqIEBwYWdlX3VyaTog
VVJJIG9mIHRoZSBwYWdlIGZvciB3aGljaCB3ZSB3YW50IHRvIHJldHJpZXZlIHRoZSBmYXZpY29u
CisgKiBAY2FuY2VsbGFibGU6IChhbGxvdy1ub25lKTogQSAjR0NhbmNlbGxhYmxlIG9yICVOVUxM
LgorICogQGNhbGxiYWNrOiAoc2NvcGUgYXN5bmMpOiBBICNHQXN5bmNSZWFkeUNhbGxiYWNrIHRv
IGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcworICogICAgICAgICAgICBzYXRpc2ZpZWQgb3IgJU5V
TEwgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdC4KKyAqIEB1c2VyX2RhdGE6IChj
bG9zdXJlKTogVGhlIGRhdGEgdG8gcGFzcyB0byBAY2FsbGJhY2suCisgKgorICogQXN5bmNocm9u
b3VzbHkgb2J0YWlucyBhICNjYWlyb19zdXJmYWNlX3Qgb2YgdGhlIGZhdmljb24gZm9yIHRoZQor
ICogZ2l2ZW4gcGFnZSBVUkkuIEl0IHJldHVybnMgdGhlIGNhY2hlZCBpY29uIGlmIGl0J3MgaW4g
dGhlIGRhdGFiYXNlCisgKiBhc3luY2hyb25vdXNseSB3YWl0aW5nIGZvciB0aGUgaWNvbiB0byBi
ZSByZWFkIGZyb20gdGhlIGRhdGFiYXNlLgorICoKKyAqIFRoaXMgaXMgYW4gYXN5bmNocm9ub3Vz
IG1ldGhvZC4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGZpbmlzaGVkLCBjYWxsYmFjayB3aWxsCisg
KiBiZSBpbnZva2VkLiBZb3UgY2FuIHRoZW4gY2FsbCB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9n
ZXRfZmF2aWNvbl9maW5pc2goKQorICogdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlv
bi4KKyAqCisgKiBZb3UgbXVzdCBjYWxsIHdlYmtpdF93ZWJfY29udGV4dF9zZXRfZmF2aWNvbl9k
YXRhYmFzZV9kaXJlY3RvcnkoKSBmb3IKKyAqIHRoZSAjV2ViS2l0V2ViQ29udGV4dCBhc3NvY2lh
dGVkIHdpdGggdGhpcyAjV2ViS2l0RmF2aWNvbkRhdGFiYXNlCisgKiBiZWZvcmUgYXR0ZW1wdGlu
ZyB0byB1c2UgdGhpcyBmdW5jdGlvbjsgb3RoZXJ3aXNlLAorICogd2Via2l0X2Zhdmljb25fZGF0
YWJhc2VfZ2V0X2Zhdmljb25fZmluaXNoKCkgd2lsbCByZXR1cm4KKyAqICVXRUJLSVRfRkFWSUNP
Tl9EQVRBQkFTRV9FUlJPUl9OT1RfSU5JVElBTElaRUQuCisgKi8KK3ZvaWQgd2Via2l0X2Zhdmlj
b25fZGF0YWJhc2VfZ2V0X2Zhdmljb24oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwg
Y29uc3QgZ2NoYXIqIHBhZ2VVUkksIEdDYW5jZWxsYWJsZSogY2FuY2VsbGFibGUsIEdBc3luY1Jl
YWR5Q2FsbGJhY2sgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJEYXRhKQoreworICAgIGdfcmV0dXJu
X2lmX2ZhaWwoV0VCS0lUX0lTX0ZBVklDT05fREFUQUJBU0UoZGF0YWJhc2UpKTsKKyAgICBnX3Jl
dHVybl9pZl9mYWlsKHBhZ2VVUkkpOworCisgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlR2V0RmF2
aWNvbkludGVybmFsKGRhdGFiYXNlLCBwYWdlVVJJLCBmYWxzZSwgY2FuY2VsbGFibGUsIGNhbGxi
YWNrLCB1c2VyRGF0YSk7CiB9CiAKIC8qKgpAQCAtNDQ5LDExICsyODEsMTAgQEAgY2Fpcm9fc3Vy
ZmFjZV90KiB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbl9maW5pc2goV2ViS2l0
RmF2aWNvbkRhdGFiYXMKICAgICBnX3JldHVybl92YWxfaWZfZmFpbChnX3Rhc2tfaXNfdmFsaWQo
cmVzdWx0LCBkYXRhYmFzZSksIDApOwogCiAgICAgR1Rhc2sqIHRhc2sgPSBHX1RBU0socmVzdWx0
KTsKLSAgICBpZiAoIWdfdGFza19wcm9wYWdhdGVfYm9vbGVhbih0YXNrLCBlcnJvcikpCi0gICAg
ICAgIHJldHVybiAwOworICAgIGlmIChhdXRvKiBpY29uID0gZ190YXNrX3Byb3BhZ2F0ZV9wb2lu
dGVyKHRhc2ssIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNhaXJvX3N1cmZh
Y2VfdCo+KGljb24pOwogCi0gICAgR2V0RmF2aWNvblN1cmZhY2VBc3luY0RhdGEqIGRhdGEgPSBz
dGF0aWNfY2FzdDxHZXRGYXZpY29uU3VyZmFjZUFzeW5jRGF0YSo+KGdfdGFza19nZXRfdGFza19k
YXRhKHRhc2spKTsKLSAgICByZXR1cm4gY2Fpcm9fc3VyZmFjZV9yZWZlcmVuY2UoZGF0YS0+aWNv
bi5nZXQoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAjZW5kaWYKIApAQCAtNDc2LDcgKzMw
Nyw3IEBAIGdjaGFyKiB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbl91cmkoV2Vi
S2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwKICAgICBpZiAoIXdlYmtpdEZhdmljb25EYXRh
YmFzZUlzT3BlbihkYXRhYmFzZSkpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgU3Ry
aW5nIGljb25VUkxGb3JQYWdlVVJMID0gZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFzZS0+c3lu
Y2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChTdHJpbmc6OmZyb21VVEY4KHBhZ2VVUkwpKTsKKyAg
ICBTdHJpbmcgaWNvblVSTEZvclBhZ2VVUkwgPSBkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNl
LT5pY29uVVJMRm9yUGFnZVVSTChTdHJpbmc6OmZyb21VVEY4KHBhZ2VVUkwpKTsKICAgICBpZiAo
aWNvblVSTEZvclBhZ2VVUkwuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIApA
QCAtNDk2LDUgKzMyNyw1IEBAIHZvaWQgd2Via2l0X2Zhdmljb25fZGF0YWJhc2VfY2xlYXIoV2Vi
S2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSkKICAgICBpZiAoIXdlYmtpdEZhdmljb25EYXRh
YmFzZUlzT3BlbihkYXRhYmFzZSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGRhdGFiYXNlLT5w
cml2LT5pY29uRGF0YWJhc2UtPnJlbW92ZUFsbEljb25zKCk7CisgICAgZGF0YWJhc2UtPnByaXYt
Pmljb25EYXRhYmFzZS0+Y2xlYXIoW10geyB9KTsKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJL
aXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUuaCBiL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZVByaXZh
dGUuaAppbmRleCA5YWI0ZDViMjUxYi4uOTQxNDRhMWI4M2QgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUuaAor
KysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRGYXZpY29uRGF0YWJh
c2VQcml2YXRlLmgKQEAgLTI0LDEwICsyNCwxMCBAQAogI2luY2x1ZGUgPFdlYkNvcmUvTGlua0lj
b24uaD4KIAogV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiB3ZWJraXRGYXZpY29uRGF0YWJhc2VDcmVh
dGUoKTsKLXZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlT3BlbihXZWJLaXRGYXZpY29uRGF0YWJh
c2UqLCBjb25zdCBTdHJpbmcmIHBhdGgpOwotYm9vbCB3ZWJraXRGYXZpY29uRGF0YWJhc2VJc09w
ZW4oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKik7Ci12b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZVNl
dFByaXZhdGVCcm93c2luZ0VuYWJsZWQoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiwgYm9vbCk7Cit2
b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZU9wZW4oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiwgY29u
c3QgU3RyaW5nJiBwYXRoLCBib29sIGlzRXBoZW1lcmFsKTsKK3ZvaWQgd2Via2l0RmF2aWNvbkRh
dGFiYXNlQ2xvc2UoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKik7CiAjaWYgUExBVEZPUk0oR1RLKQot
dm9pZCB3ZWJraXRGYXZpY29uRGF0YWJhc2VHZXRMb2FkRGVjaXNpb25Gb3JJY29uKFdlYktpdEZh
dmljb25EYXRhYmFzZSosIGNvbnN0IFdlYkNvcmU6OkxpbmtJY29uJiwgY29uc3QgU3RyaW5nJiwg
RnVuY3Rpb248dm9pZChib29sKT4mJik7Ci12b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldElj
b25Gb3JQYWdlVVJMKFdlYktpdEZhdmljb25EYXRhYmFzZSosIGNvbnN0IFdlYkNvcmU6OkxpbmtJ
Y29uJiwgQVBJOjpEYXRhJiwgY29uc3QgU3RyaW5nJik7Cit2b2lkIHdlYmtpdEZhdmljb25EYXRh
YmFzZUdldExvYWREZWNpc2lvbkZvckljb24oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiwgY29uc3Qg
V2ViQ29yZTo6TGlua0ljb24mLCBjb25zdCBTdHJpbmcmLCBib29sIGlzRXBoZW1lcmFsLCBGdW5j
dGlvbjx2b2lkKGJvb2wpPiYmKTsKK3ZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZv
clBhZ2VVUkwoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiwgY29uc3QgV2ViQ29yZTo6TGlua0ljb24m
LCBBUEk6OkRhdGEmLCBjb25zdCBTdHJpbmcmLCBib29sIGlzRXBoZW1lcmFsKTsKK3ZvaWQgd2Vi
a2l0RmF2aWNvbkRhdGFiYXNlR2V0RmF2aWNvbkludGVybmFsKFdlYktpdEZhdmljb25EYXRhYmFz
ZSosIGNvbnN0IGdjaGFyKiBwYWdlVVJJLCBib29sIGlzRXBoZW1lcmFsLCBHQ2FuY2VsbGFibGUq
LCBHQXN5bmNSZWFkeUNhbGxiYWNrLCBncG9pbnRlcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYkNvbnRleHQuY3BwIGIvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViQ29udGV4dC5jcHAKaW5kZXgg
M2E4MTE0MDBhMDYuLjg4NjJjZDRlNzM2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJv
Y2Vzcy9BUEkvZ2xpYi9XZWJLaXRXZWJDb250ZXh0LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRXZWJDb250ZXh0LmNwcApAQCAtMTc5LDcgKzE3OSw2IEBA
IHN0cnVjdCBfV2ViS2l0V2ViQ29udGV4dFByaXZhdGUgewogICAgIFdlYktpdFByb2Nlc3NNb2Rl
bCBwcm9jZXNzTW9kZWw7CiAKICAgICBIYXNoTWFwPHVpbnQ2NF90LCBXZWJLaXRXZWJWaWV3Kj4g
d2ViVmlld3M7Ci0gICAgdW5zaWduZWQgZXBoZW1lcmFsUGFnZUNvdW50OwogCiAgICAgQ1N0cmlu
ZyB3ZWJFeHRlbnNpb25zRGlyZWN0b3J5OwogICAgIEdSZWZQdHI8R1ZhcmlhbnQ+IHdlYkV4dGVu
c2lvbnNJbml0aWFsaXphdGlvblVzZXJEYXRhOwpAQCAtMzcxLDYgKzM3MCwxMSBAQCBzdGF0aWMg
dm9pZCB3ZWJraXRXZWJDb250ZXh0RGlzcG9zZShHT2JqZWN0KiBvYmplY3QpCiAgICAgICAgIHBy
aXYtPndlYnNpdGVEYXRhTWFuYWdlciA9IG51bGxwdHI7CiAgICAgfQogCisgICAgaWYgKHByaXYt
PmZhdmljb25EYXRhYmFzZSkgeworICAgICAgICB3ZWJraXRGYXZpY29uRGF0YWJhc2VDbG9zZShw
cml2LT5mYXZpY29uRGF0YWJhc2UuZ2V0KCkpOworICAgICAgICBwcml2LT5mYXZpY29uRGF0YWJh
c2UgPSBudWxscHRyOworICAgIH0KKwogICAgIEdfT0JKRUNUX0NMQVNTKHdlYmtpdF93ZWJfY29u
dGV4dF9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKG9iamVjdCk7CiB9CiAKQEAgLTg3MSwzMSArODc1
LDYgQEAgc3RhdGljIHZvaWQgZW5zdXJlRmF2aWNvbkRhdGFiYXNlKFdlYktpdFdlYkNvbnRleHQq
IGNvbnRleHQpCiAgICAgcHJpdi0+ZmF2aWNvbkRhdGFiYXNlID0gYWRvcHRHUmVmKHdlYmtpdEZh
dmljb25EYXRhYmFzZUNyZWF0ZSgpKTsKIH0KIAotc3RhdGljIHZvaWQgd2Via2l0V2ViQ29udGV4
dEVuYWJsZUljb25EYXRhYmFzZVByaXZhdGVCcm93c2luZ0lmTmVlZGVkKFdlYktpdFdlYkNvbnRl
eHQqIGNvbnRleHQsIFdlYktpdFdlYlZpZXcqIHdlYlZpZXcpCi17Ci0gICAgaWYgKHdlYmtpdF93
ZWJfY29udGV4dF9pc19lcGhlbWVyYWwoY29udGV4dCkpCi0gICAgICAgIHJldHVybjsKLSAgICBp
ZiAoIXdlYmtpdF93ZWJfdmlld19pc19lcGhlbWVyYWwod2ViVmlldykpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGlmICghY29udGV4dC0+cHJpdi0+ZXBoZW1lcmFsUGFnZUNvdW50ICYmIGNvbnRl
eHQtPnByaXYtPmZhdmljb25EYXRhYmFzZSkKLSAgICAgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNl
U2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChjb250ZXh0LT5wcml2LT5mYXZpY29uRGF0YWJhc2Uu
Z2V0KCksIHRydWUpOwotICAgIGNvbnRleHQtPnByaXYtPmVwaGVtZXJhbFBhZ2VDb3VudCsrOwot
fQotCi1zdGF0aWMgdm9pZCB3ZWJraXRXZWJDb250ZXh0RGlzYWJsZUljb25EYXRhYmFzZVByaXZh
dGVCcm93c2luZ0lmTmVlZGVkKFdlYktpdFdlYkNvbnRleHQqIGNvbnRleHQsIFdlYktpdFdlYlZp
ZXcqIHdlYlZpZXcpCi17Ci0gICAgaWYgKHdlYmtpdF93ZWJfY29udGV4dF9pc19lcGhlbWVyYWwo
Y29udGV4dCkpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoIXdlYmtpdF93ZWJfdmlld19pc19l
cGhlbWVyYWwod2ViVmlldykpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFTU0VSVChjb250ZXh0
LT5wcml2LT5lcGhlbWVyYWxQYWdlQ291bnQpOwotICAgIGNvbnRleHQtPnByaXYtPmVwaGVtZXJh
bFBhZ2VDb3VudC0tOwotICAgIGlmICghY29udGV4dC0+cHJpdi0+ZXBoZW1lcmFsUGFnZUNvdW50
ICYmIGNvbnRleHQtPnByaXYtPmZhdmljb25EYXRhYmFzZSkKLSAgICAgICAgd2Via2l0RmF2aWNv
bkRhdGFiYXNlU2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChjb250ZXh0LT5wcml2LT5mYXZpY29u
RGF0YWJhc2UuZ2V0KCksIGZhbHNlKTsKLX0KLQogLyoqCiAgKiB3ZWJraXRfd2ViX2NvbnRleHRf
c2V0X2Zhdmljb25fZGF0YWJhc2VfZGlyZWN0b3J5OgogICogQGNvbnRleHQ6IGEgI1dlYktpdFdl
YkNvbnRleHQKQEAgLTkzNiwxMCArOTE1LDcgQEAgdm9pZCB3ZWJraXRfd2ViX2NvbnRleHRfc2V0
X2Zhdmljb25fZGF0YWJhc2VfZGlyZWN0b3J5KFdlYktpdFdlYkNvbnRleHQqIGNvbnRleHQKICAg
ICAgICAgIldlYnBhZ2VJY29ucy5kYiIsIG51bGxwdHIpKTsKIAogICAgIC8vIFNldHRpbmcgdGhl
IHBhdGggd2lsbCBjYXVzZSB0aGUgaWNvbiBkYXRhYmFzZSB0byBiZSBvcGVuZWQuCi0gICAgd2Vi
a2l0RmF2aWNvbkRhdGFiYXNlT3Blbihwcml2LT5mYXZpY29uRGF0YWJhc2UuZ2V0KCksIEZpbGVT
eXN0ZW06OnN0cmluZ0Zyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oZmF2aWNvbkRhdGFiYXNl
UGF0aC5nZXQoKSkpOwotCi0gICAgaWYgKHdlYmtpdF93ZWJfY29udGV4dF9pc19lcGhlbWVyYWwo
Y29udGV4dCkpCi0gICAgICAgIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldFByaXZhdGVCcm93c2lu
Z0VuYWJsZWQocHJpdi0+ZmF2aWNvbkRhdGFiYXNlLmdldCgpLCB0cnVlKTsKKyAgICB3ZWJraXRG
YXZpY29uRGF0YWJhc2VPcGVuKHByaXYtPmZhdmljb25EYXRhYmFzZS5nZXQoKSwgRmlsZVN5c3Rl
bTo6c3RyaW5nRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihmYXZpY29uRGF0YWJhc2VQYXRo
LmdldCgpKSwgd2Via2l0X3dlYl9jb250ZXh0X2lzX2VwaGVtZXJhbChjb250ZXh0KSk7CiB9CiAK
IC8qKgpAQCAtMTcyNywxMCArMTcwMyw2IEBAIGJvb2wgd2Via2l0V2ViQ29udGV4dElzTG9hZGlu
Z0N1c3RvbVByb3RvY29sKFdlYktpdFdlYkNvbnRleHQqIGNvbnRleHQsIHVpbnQ2NF90CiAKIHZv
aWQgd2Via2l0V2ViQ29udGV4dENyZWF0ZVBhZ2VGb3JXZWJWaWV3KFdlYktpdFdlYkNvbnRleHQq
IGNvbnRleHQsIFdlYktpdFdlYlZpZXcqIHdlYlZpZXcsIFdlYktpdFVzZXJDb250ZW50TWFuYWdl
ciogdXNlckNvbnRlbnRNYW5hZ2VyLCBXZWJLaXRXZWJWaWV3KiByZWxhdGVkVmlldykKIHsKLSAg
ICAvLyBGSVhNRTogaWNvbiBkYXRhYmFzZSBwcml2YXRlIG1vZGUgaXMgZ2xvYmFsLCBub3QgcGVy
IHBhZ2UsIHNvIHdoaWxlIHRoZXJlIGFyZQotICAgIC8vIHBhZ2VzIGluIHByaXZhdGUgbW9kZSB3
ZSBuZWVkIHRvIGVuYWJsZSB0aGUgcHJpdmF0ZSBtb2RlIGluIHRoZSBpY29uIGRhdGFiYXNlLgot
ICAgIHdlYmtpdFdlYkNvbnRleHRFbmFibGVJY29uRGF0YWJhc2VQcml2YXRlQnJvd3NpbmdJZk5l
ZWRlZChjb250ZXh0LCB3ZWJWaWV3KTsKLQogICAgIGF1dG8gcGFnZUNvbmZpZ3VyYXRpb24gPSBB
UEk6OlBhZ2VDb25maWd1cmF0aW9uOjpjcmVhdGUoKTsKICAgICBwYWdlQ29uZmlndXJhdGlvbi0+
c2V0UHJvY2Vzc1Bvb2woY29udGV4dC0+cHJpdi0+cHJvY2Vzc1Bvb2wuZ2V0KCkpOwogICAgIHBh
Z2VDb25maWd1cmF0aW9uLT5zZXRQcmVmZXJlbmNlcyh3ZWJraXRTZXR0aW5nc0dldFByZWZlcmVu
Y2VzKHdlYmtpdF93ZWJfdmlld19nZXRfc2V0dGluZ3Mod2ViVmlldykpKTsKQEAgLTE3NDksNyAr
MTcyMSw2IEBAIHZvaWQgd2Via2l0V2ViQ29udGV4dENyZWF0ZVBhZ2VGb3JXZWJWaWV3KFdlYktp
dFdlYkNvbnRleHQqIGNvbnRleHQsIFdlYktpdFdlYlZpCiAKIHZvaWQgd2Via2l0V2ViQ29udGV4
dFdlYlZpZXdEZXN0cm95ZWQoV2ViS2l0V2ViQ29udGV4dCogY29udGV4dCwgV2ViS2l0V2ViVmll
dyogd2ViVmlldykKIHsKLSAgICB3ZWJraXRXZWJDb250ZXh0RGlzYWJsZUljb25EYXRhYmFzZVBy
aXZhdGVCcm93c2luZ0lmTmVlZGVkKGNvbnRleHQsIHdlYlZpZXcpOwogICAgIGNvbnRleHQtPnBy
aXYtPndlYlZpZXdzLnJlbW92ZSh3ZWJraXRfd2ViX3ZpZXdfZ2V0X3BhZ2VfaWQod2ViVmlldykp
OwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJL
aXRXZWJWaWV3LmNwcCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdl
YlZpZXcuY3BwCmluZGV4IDFlNWViZTczYjc0Li45YTAxNDk0YjIyZiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViVmlldy5jcHAKKysrIGIvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViVmlldy5jcHAKQEAgLTU1OSw3
ICs1NTksNyBAQCBzdGF0aWMgdm9pZCB3ZWJraXRXZWJWaWV3UmVxdWVzdEZhdmljb24oV2ViS2l0
V2ViVmlldyogd2ViVmlldykKICAgICBXZWJLaXRXZWJWaWV3UHJpdmF0ZSogcHJpdiA9IHdlYlZp
ZXctPnByaXY7CiAgICAgcHJpdi0+ZmF2aWNvbkNhbmNlbGxhYmxlID0gYWRvcHRHUmVmKGdfY2Fu
Y2VsbGFibGVfbmV3KCkpOwogICAgIFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UgPSB3
ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2UocHJpdi0+Y29udGV4dC5nZXQo
KSk7Ci0gICAgd2Via2l0X2Zhdmljb25fZGF0YWJhc2VfZ2V0X2Zhdmljb24oZGF0YWJhc2UsIHBy
aXYtPmFjdGl2ZVVSSS5kYXRhKCksIHByaXYtPmZhdmljb25DYW5jZWxsYWJsZS5nZXQoKSwgZ290
RmF2aWNvbkNhbGxiYWNrLCB3ZWJWaWV3KTsKKyAgICB3ZWJraXRGYXZpY29uRGF0YWJhc2VHZXRG
YXZpY29uSW50ZXJuYWwoZGF0YWJhc2UsIHByaXYtPmFjdGl2ZVVSSS5kYXRhKCksIHByaXYtPmlz
RXBoZW1lcmFsLCBwcml2LT5mYXZpY29uQ2FuY2VsbGFibGUuZ2V0KCksIGdvdEZhdmljb25DYWxs
YmFjaywgd2ViVmlldyk7CiB9CiAKIHN0YXRpYyB2b2lkIHdlYmtpdFdlYlZpZXdVcGRhdGVGYXZp
Y29uVVJJKFdlYktpdFdlYlZpZXcqIHdlYlZpZXcsIGNvbnN0IGNoYXIqIGZhdmljb25VUkkpCkBA
IC0yMTY5LDE0ICsyMTY5LDE5IEBAIHZvaWQgd2Via2l0V2ViVmlld0xvYWRGYWlsZWRXaXRoVExT
RXJyb3JzKFdlYktpdFdlYlZpZXcqIHdlYlZpZXcsIGNvbnN0IGNoYXIqIGZhCiAjaWYgUExBVEZP
Uk0oR1RLKQogdm9pZCB3ZWJraXRXZWJWaWV3R2V0TG9hZERlY2lzaW9uRm9ySWNvbihXZWJLaXRX
ZWJWaWV3KiB3ZWJWaWV3LCBjb25zdCBMaW5rSWNvbiYgaWNvbiwgRnVuY3Rpb248dm9pZChib29s
KT4mJiBjb21wbGV0aW9uSGFuZGxlcikKIHsKKyAgICAvLyBXZSBvbmx5IHN1cHBvcnQgZmF2aWNv
bnMgZm9yIG5vdy4KKyAgICBpZiAoaWNvbi50eXBlICE9IExpbmtJY29uVHlwZTo6RmF2aWNvbikg
eworICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CiAgICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSA9IHdlYmtpdF93ZWJfY29u
dGV4dF9nZXRfZmF2aWNvbl9kYXRhYmFzZSh3ZWJWaWV3LT5wcml2LT5jb250ZXh0LmdldCgpKTsK
LSAgICB3ZWJraXRGYXZpY29uRGF0YWJhc2VHZXRMb2FkRGVjaXNpb25Gb3JJY29uKGRhdGFiYXNl
LCBpY29uLCBnZXRQYWdlKHdlYlZpZXcpLnBhZ2VMb2FkU3RhdGUoKS5hY3RpdmVVUkwoKSwgV1RG
TW92ZShjb21wbGV0aW9uSGFuZGxlcikpOworICAgIHdlYmtpdEZhdmljb25EYXRhYmFzZUdldExv
YWREZWNpc2lvbkZvckljb24oZGF0YWJhc2UsIGljb24sIGdldFBhZ2Uod2ViVmlldykucGFnZUxv
YWRTdGF0ZSgpLmFjdGl2ZVVSTCgpLCB3ZWJWaWV3LT5wcml2LT5pc0VwaGVtZXJhbCwgV1RGTW92
ZShjb21wbGV0aW9uSGFuZGxlcikpOwogfQogCiB2b2lkIHdlYmtpdFdlYlZpZXdTZXRJY29uKFdl
YktpdFdlYlZpZXcqIHdlYlZpZXcsIGNvbnN0IExpbmtJY29uJiBpY29uLCBBUEk6OkRhdGEmIGlj
b25EYXRhKQogewogICAgIFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UgPSB3ZWJraXRf
d2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2Uod2ViVmlldy0+cHJpdi0+Y29udGV4dC5n
ZXQoKSk7Ci0gICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBhZ2VVUkwoZGF0YWJh
c2UsIGljb24sIGljb25EYXRhLCBnZXRQYWdlKHdlYlZpZXcpLnBhZ2VMb2FkU3RhdGUoKS5hY3Rp
dmVVUkwoKSk7CisgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBhZ2VVUkwoZGF0
YWJhc2UsIGljb24sIGljb25EYXRhLCBnZXRQYWdlKHdlYlZpZXcpLnBhZ2VMb2FkU3RhdGUoKS5h
Y3RpdmVVUkwoKSwgd2ViVmlldy0+cHJpdi0+aXNFcGhlbWVyYWwpOwogfQogI2VuZGlmCiAKZGlm
ZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCAzZmYxYWQz
ODRiMi4uMmM4MTZiMDcwODUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0NoYW5nZUxvZworKysgYi9Ub29s
cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMiBAQAorMjAxOS0wOS0yNiAgQ2FybG9zIEdhcmNpYSBD
YW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS10gSWNvbkRhdGFiYXNl
IGlzIG5vdCB0aHJlYWQtc2FmZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MjAxMzAzCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgUmV3cml0ZSB0aGUgV2ViS2l0RmF2aWNvbkRhdGFiYXNlIHRlc3RzLCBzcGxp
dHRpbmcgdGVzdHMgY2FzZXMgYWdhaW4gYW5kIG1ha2luZyB0aGVtIGluZGVwZW5kZW50IHRvIGVh
Y2ggb3RoZXIuCisKKyAgICAgICAgKiBUZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdEdMaWIvVGVz
dFdlYktpdEZhdmljb25EYXRhYmFzZS5jcHA6CisgICAgICAgICh0ZXN0RmF2aWNvbkRhdGFiYXNl
SW5pdGlhbGl6YXRpb24pOgorICAgICAgICAodGVzdEZhdmljb25EYXRhYmFzZUdldEZhdmljb24p
OgorICAgICAgICAoZXBoZW1lcmFsVmlld0Zhdmljb25DaGFuZ2VkKToKKyAgICAgICAgKHRlc3RG
YXZpY29uRGF0YWJhc2VFcGhlbWVyYWwpOgorICAgICAgICAodGVzdEZhdmljb25EYXRhYmFzZUNs
ZWFyKToKKyAgICAgICAgKGJlZm9yZUFsbCk6CisgICAgICAgIChhZnRlckFsbCk6CisgICAgICAg
ICogVGVzdFdlYktpdEFQSS9nbGliL1Rlc3RFeHBlY3RhdGlvbnMuanNvbjogVGVzdFdlYktpdEZh
dmljb25EYXRhYmFzZSBzaG91bHMgYWx3YXlzIHBhc3Mgbm93LgorCiAyMDE5LTA5LTIzICBaYW4g
RG9iZXJzZWsgIDx6ZG9iZXJzZWtAaWdhbGlhLmNvbT4KIAogICAgICAgICBydW4td2ViLXBsYXRm
b3JtLXRlc3RzOiByZW1vdmUgc3VwcG9ydCBmb3IgaW4tcmVwb3NpdG9yeSBtYW5pZmVzdCwgZXhw
ZWN0YXRpb24gbWFuYWdlbWVudApkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0
cy9XZWJLaXRHTGliL1Rlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwIGIvVG9vbHMvVGVzdFdl
YktpdEFQSS9UZXN0cy9XZWJLaXRHTGliL1Rlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwCmlu
ZGV4IDYzY2FjMDVjOGQ5Li5mNjNjODBmZDBhNCAxMDA2NDQKLS0tIGEvVG9vbHMvVGVzdFdlYktp
dEFQSS9UZXN0cy9XZWJLaXRHTGliL1Rlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwCisrKyBi
L1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xpYi9UZXN0V2ViS2l0RmF2aWNvbkRh
dGFiYXNlLmNwcApAQCAtMTksNDAgKzE5LDQzIEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAor
I2lmIFBMQVRGT1JNKEdUSykKKwogI2luY2x1ZGUgIldlYktpdFRlc3RTZXJ2ZXIuaCIKICNpbmNs
dWRlICJXZWJWaWV3VGVzdC5oIgogI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CiAjaW5jbHVkZSA8
bGlic291cC9zb3VwLmg+CiAjaW5jbHVkZSA8d3RmL2dsaWIvR1VuaXF1ZVB0ci5oPgogCi0jaWYg
UExBVEZPUk0oR1RLKQogc3RhdGljIFdlYktpdFRlc3RTZXJ2ZXIqIGtTZXJ2ZXI7Ci0jZW5kaWYK
IAogY2xhc3MgRmF2aWNvbkRhdGFiYXNlVGVzdDogcHVibGljIFdlYlZpZXdUZXN0IHsKIHB1Ymxp
YzoKICAgICBNQUtFX0dMSUJfVEVTVF9GSVhUVVJFKEZhdmljb25EYXRhYmFzZVRlc3QpOwogCiAg
ICAgRmF2aWNvbkRhdGFiYXNlVGVzdCgpCisgICAgICAgIDogbV9kYXRhYmFzZSh3ZWJraXRfd2Vi
X2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2UobV93ZWJDb250ZXh0LmdldCgpKSkKICAgICB7
Ci0jaWYgUExBVEZPUk0oR1RLKQotICAgICAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFi
YXNlID0gd2Via2l0X3dlYl9jb250ZXh0X2dldF9mYXZpY29uX2RhdGFiYXNlKG1fd2ViQ29udGV4
dC5nZXQoKSk7Ci0gICAgICAgIGdfc2lnbmFsX2Nvbm5lY3QoZGF0YWJhc2UsICJmYXZpY29uLWNo
YW5nZWQiLCBHX0NBTExCQUNLKGZhdmljb25DaGFuZ2VkQ2FsbGJhY2spLCB0aGlzKTsKLSNlbmRp
ZgorICAgICAgICBnX2Fzc2VydF90cnVlKFdFQktJVF9JU19GQVZJQ09OX0RBVEFCQVNFKG1fZGF0
YWJhc2UpKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RGaW5pc2hlcyhH
X09CSkVDVChtX2RhdGFiYXNlKSk7CisgICAgICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9kYXRhYmFz
ZSwgImZhdmljb24tY2hhbmdlZCIsIEdfQ0FMTEJBQ0soZmF2aWNvbkNoYW5nZWRDYWxsYmFjayks
IHRoaXMpOwogICAgIH0KIAogICAgIH5GYXZpY29uRGF0YWJhc2VUZXN0KCkKICAgICB7Ci0jaWYg
UExBVEZPUk0oR1RLKQogICAgICAgICBpZiAobV9mYXZpY29uKQogICAgICAgICAgICAgY2Fpcm9f
c3VyZmFjZV9kZXN0cm95KG1fZmF2aWNvbik7CiAKLSAgICAgICAgV2ViS2l0RmF2aWNvbkRhdGFi
YXNlKiBkYXRhYmFzZSA9IHdlYmtpdF93ZWJfY29udGV4dF9nZXRfZmF2aWNvbl9kYXRhYmFzZSht
X3dlYkNvbnRleHQuZ2V0KCkpOwotICAgICAgICBnX3NpZ25hbF9oYW5kbGVyc19kaXNjb25uZWN0
X21hdGNoZWQoZGF0YWJhc2UsIEdfU0lHTkFMX01BVENIX0RBVEEsIDAsIDAsIDAsIDAsIHRoaXMp
OwotI2VuZGlmCisgICAgICAgIGdfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfbWF0Y2hlZCht
X2RhdGFiYXNlLCBHX1NJR05BTF9NQVRDSF9EQVRBLCAwLCAwLCAwLCAwLCB0aGlzKTsKKyAgICB9
CisKKyAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogZGlyZWN0b3J5KQorICAgIHsKKyAgICAgICAg
R1VuaXF1ZVB0cjxjaGFyPiBkYXRhYmFzZURpcmVjdG9yeShnX2J1aWxkX2ZpbGVuYW1lKGRhdGFE
aXJlY3RvcnkoKSwgZGlyZWN0b3J5LCBudWxscHRyKSk7CisgICAgICAgIHdlYmtpdF93ZWJfY29u
dGV4dF9zZXRfZmF2aWNvbl9kYXRhYmFzZV9kaXJlY3RvcnkobV93ZWJDb250ZXh0LmdldCgpLCBk
YXRhYmFzZURpcmVjdG9yeS5nZXQoKSk7CisgICAgICAgIGdfYXNzZXJ0X2NtcHN0cihkYXRhYmFz
ZURpcmVjdG9yeS5nZXQoKSwgPT0sIHdlYmtpdF93ZWJfY29udGV4dF9nZXRfZmF2aWNvbl9kYXRh
YmFzZV9kaXJlY3RvcnkobV93ZWJDb250ZXh0LmdldCgpKSk7CiAgICAgfQogCi0jaWYgUExBVEZP
Uk0oR1RLKQogICAgIHN0YXRpYyB2b2lkIGZhdmljb25DaGFuZ2VkQ2FsbGJhY2soV2ViS2l0RmF2
aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgY2hhciogcGFnZVVSSSwgY29uc3QgY2hhciog
ZmF2aWNvblVSSSwgRmF2aWNvbkRhdGFiYXNlVGVzdCogdGVzdCkKICAgICB7CiAgICAgICAgIGlm
ICghZ19zdHJjbXAwKHdlYmtpdF93ZWJfdmlld19nZXRfdXJpKHRlc3QtPm1fd2ViVmlldyksIHBh
Z2VVUkkpKSB7CkBAIC02MiwxOSArNjUsMjkgQEAgcHVibGljOgogICAgICAgICB9CiAgICAgfQog
Ci0gICAgc3RhdGljIHZvaWQgdmlld0Zhdmljb25DaGFuZ2VkQ2FsbGJhY2soV2ViS2l0V2ViVmll
dyogd2ViVmlldywgR1BhcmFtU3BlYyogcHNwZWMsIGdwb2ludGVyIGRhdGEpCisgICAgc3RhdGlj
IHZvaWQgdmlld0Zhdmljb25DaGFuZ2VkQ2FsbGJhY2soV2ViS2l0V2ViVmlldyogd2ViVmlldywg
R1BhcmFtU3BlYyogcHNwZWMsIEZhdmljb25EYXRhYmFzZVRlc3QqIHRlc3QpCiAgICAgewotICAg
ICAgICBGYXZpY29uRGF0YWJhc2VUZXN0KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8RmF2aWNvbkRhdGFi
YXNlVGVzdCo+KGRhdGEpOwogICAgICAgICBnX2Fzc2VydF90cnVlKHRlc3QtPm1fd2ViVmlldyA9
PSB3ZWJWaWV3KTsKICAgICAgICAgdGVzdC0+bV9mYXZpY29uTm90aWZpY2F0aW9uUmVjZWl2ZWQg
PSB0cnVlOwotICAgICAgICB0ZXN0LT5xdWl0TWFpbkxvb3AoKTsKKyAgICAgICAgaWYgKHRlc3Qt
Pm1fbG9hZEZpbmlzaGVkKQorICAgICAgICAgICAgdGVzdC0+cXVpdE1haW5Mb29wKCk7CisgICAg
fQorCisgICAgc3RhdGljIHZvaWQgdmlld0xvYWRDaGFuZ2VkQ2FsbGJhY2soV2ViS2l0V2ViVmll
dyogd2ViVmlldywgV2ViS2l0TG9hZEV2ZW50IGxvYWRFdmVudCwgRmF2aWNvbkRhdGFiYXNlVGVz
dCogdGVzdCkKKyAgICB7CisgICAgICAgIGdfYXNzZXJ0X3RydWUodGVzdC0+bV93ZWJWaWV3ID09
IHdlYlZpZXcpOworICAgICAgICBpZiAobG9hZEV2ZW50ICE9IFdFQktJVF9MT0FEX0ZJTklTSEVE
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRlc3QtPm1fbG9hZEZpbmlzaGVkID0g
dHJ1ZTsKKyAgICAgICAgaWYgKHRlc3QtPm1fZmF2aWNvbk5vdGlmaWNhdGlvblJlY2VpdmVkKQor
ICAgICAgICAgICAgdGVzdC0+cXVpdE1haW5Mb29wKCk7CiAgICAgfQogCiAgICAgc3RhdGljIHZv
aWQgZ2V0RmF2aWNvbkNhbGxiYWNrKEdPYmplY3QqIHNvdXJjZU9iamVjdCwgR0FzeW5jUmVzdWx0
KiByZXN1bHQsIHZvaWQqIGRhdGEpCiAgICAgewogICAgICAgICBGYXZpY29uRGF0YWJhc2VUZXN0
KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8RmF2aWNvbkRhdGFiYXNlVGVzdCo+KGRhdGEpOwotICAgICAg
ICBXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFiYXNlID0gd2Via2l0X3dlYl9jb250ZXh0X2dl
dF9mYXZpY29uX2RhdGFiYXNlKHRlc3QtPm1fd2ViQ29udGV4dC5nZXQoKSk7Ci0gICAgICAgIHRl
c3QtPm1fZmF2aWNvbiA9IHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uX2Zpbmlz
aChkYXRhYmFzZSwgcmVzdWx0LCAmdGVzdC0+bV9lcnJvci5vdXRQdHIoKSk7CisgICAgICAgIHRl
c3QtPm1fZmF2aWNvbiA9IHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uX2Zpbmlz
aCh0ZXN0LT5tX2RhdGFiYXNlLCByZXN1bHQsICZ0ZXN0LT5tX2Vycm9yLm91dFB0cigpKTsKICAg
ICAgICAgdGVzdC0+cXVpdE1haW5Mb29wKCk7CiAgICAgfQogCkBAIC04NiwxNiArOTksMjUgQEAg
cHVibGljOgogICAgICAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QobV93ZWJWaWV3LCBo
YW5kbGVySUQpOwogICAgIH0KIAorICAgIHZvaWQgd2FpdFVudGlsTG9hZEZpbmlzaGVkQW5kRmF2
aWNvbkNoYW5nZWQoKQorICAgIHsKKyAgICAgICAgbV9mYXZpY29uTm90aWZpY2F0aW9uUmVjZWl2
ZWQgPSBmYWxzZTsKKyAgICAgICAgbV9sb2FkRmluaXNoZWQgPSBmYWxzZTsKKyAgICAgICAgdW5z
aWduZWQgbG9uZyBmYXZpY29uQ2hhbmdlZElEID0gZ19zaWduYWxfY29ubmVjdChtX3dlYlZpZXcs
ICJub3RpZnk6OmZhdmljb24iLCBHX0NBTExCQUNLKHZpZXdGYXZpY29uQ2hhbmdlZENhbGxiYWNr
KSwgdGhpcyk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9hZENoYW5nZWRJRCA9IGdfc2lnbmFs
X2Nvbm5lY3QobV93ZWJWaWV3LCAibG9hZC1jaGFuZ2VkIiwgR19DQUxMQkFDSyh2aWV3TG9hZENo
YW5nZWRDYWxsYmFjayksIHRoaXMpOworICAgICAgICBnX21haW5fbG9vcF9ydW4obV9tYWluTG9v
cCk7CisgICAgICAgIGdfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdChtX3dlYlZpZXcsIGZhdmlj
b25DaGFuZ2VkSUQpOworICAgICAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QobV93ZWJW
aWV3LCBsb2FkQ2hhbmdlZElEKTsKKyAgICB9CisKICAgICB2b2lkIGdldEZhdmljb25Gb3JQYWdl
VVJJQW5kV2FpdFVudGlsUmVhZHkoY29uc3QgY2hhciogcGFnZVVSSSkKICAgICB7CiAgICAgICAg
IGlmIChtX2Zhdmljb24pIHsKICAgICAgICAgICAgIGNhaXJvX3N1cmZhY2VfZGVzdHJveShtX2Zh
dmljb24pOwotICAgICAgICAgICAgbV9mYXZpY29uID0gMDsKKyAgICAgICAgICAgIG1fZmF2aWNv
biA9IG51bGxwdHI7CiAgICAgICAgIH0KIAotICAgICAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2Uq
IGRhdGFiYXNlID0gd2Via2l0X3dlYl9jb250ZXh0X2dldF9mYXZpY29uX2RhdGFiYXNlKG1fd2Vi
Q29udGV4dC5nZXQoKSk7Ci0gICAgICAgIHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZp
Y29uKGRhdGFiYXNlLCBwYWdlVVJJLCAwLCBnZXRGYXZpY29uQ2FsbGJhY2ssIHRoaXMpOwotCisg
ICAgICAgIHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uKG1fZGF0YWJhc2UsIHBh
Z2VVUkksIDAsIGdldEZhdmljb25DYWxsYmFjaywgdGhpcyk7CiAgICAgICAgIGdfbWFpbl9sb29w
X3J1bihtX21haW5Mb29wKTsKICAgICB9CiAKQEAgLTEwOCwxNiArMTMwLDE1IEBAIHB1YmxpYzoK
ICAgICAgICAgbV93YWl0aW5nRm9yRmF2aWNvblVSSSA9IGZhbHNlOwogICAgIH0KIAorICAgIFdl
YktpdEZhdmljb25EYXRhYmFzZSogbV9kYXRhYmFzZSB7IG51bGxwdHIgfTsKICAgICBjYWlyb19z
dXJmYWNlX3QqIG1fZmF2aWNvbiB7IG51bGxwdHIgfTsKLQogICAgIENTdHJpbmcgbV9mYXZpY29u
VVJJOwogICAgIEdVbmlxdWVPdXRQdHI8R0Vycm9yPiBtX2Vycm9yOwogICAgIGJvb2wgbV9mYXZp
Y29uTm90aWZpY2F0aW9uUmVjZWl2ZWQgeyBmYWxzZSB9OworICAgIGJvb2wgbV9sb2FkRmluaXNo
ZWQgeyBmYWxzZSB9OwogICAgIGJvb2wgbV93YWl0aW5nRm9yRmF2aWNvblVSSSB7IGZhbHNlIH07
Ci0jZW5kaWYKIH07CiAKLSNpZiBQTEFURk9STShHVEspCiBzdGF0aWMgdm9pZAogc2VydmVyQ2Fs
bGJhY2soU291cFNlcnZlciogc2VydmVyLCBTb3VwTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgY2hh
ciogcGF0aCwgR0hhc2hUYWJsZSogcXVlcnksIFNvdXBDbGllbnRDb250ZXh0KiBjb250ZXh0LCB2
b2lkKiBkYXRhKQogewpAQCAtMTUwLDE2MyArMTcxLDEzOSBAQCBzZXJ2ZXJDYWxsYmFjayhTb3Vw
U2VydmVyKiBzZXJ2ZXIsIFNvdXBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBjaGFyKiBwYXRoLCBH
SGFzaAogICAgIHNvdXBfbWVzc2FnZV9ib2R5X2NvbXBsZXRlKG1lc3NhZ2UtPnJlc3BvbnNlX2Jv
ZHkpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0Tm90SW5pdGlhbGl6ZWQoRmF2aWNvbkRhdGFiYXNl
VGVzdCogdGVzdCkKK3N0YXRpYyB2b2lkIHRlc3RGYXZpY29uRGF0YWJhc2VJbml0aWFsaXphdGlv
bihGYXZpY29uRGF0YWJhc2VUZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQogewotICAgIC8vIFRy
eSB0byByZXRyaWV2ZSBhIHZhbGlkIGZhdmljb24gZnJvbSBhIG5vdCBpbml0aWFsaXplZCBkYXRh
YmFzZS4KICAgICB0ZXN0LT5nZXRGYXZpY29uRm9yUGFnZVVSSUFuZFdhaXRVbnRpbFJlYWR5KGtT
ZXJ2ZXItPmdldFVSSUZvclBhdGgoIi9mb28iKS5kYXRhKCkpOwogICAgIGdfYXNzZXJ0X251bGwo
dGVzdC0+bV9mYXZpY29uKTsKLSAgICBnX2Fzc2VydF9ub25udWxsKHRlc3QtPm1fZXJyb3IpOwot
ICAgIGdfYXNzZXJ0X2NtcGludCh0ZXN0LT5tX2Vycm9yLT5jb2RlLCA9PSwgV0VCS0lUX0ZBVklD
T05fREFUQUJBU0VfRVJST1JfTk9UX0lOSVRJQUxJWkVEKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMg
dm9pZCB0ZXN0U2V0RGlyZWN0b3J5KEZhdmljb25EYXRhYmFzZVRlc3QqIHRlc3QpCi17Ci0gICAg
d2Via2l0X3dlYl9jb250ZXh0X3NldF9mYXZpY29uX2RhdGFiYXNlX2RpcmVjdG9yeSh0ZXN0LT5t
X3dlYkNvbnRleHQuZ2V0KCksIFRlc3Q6OmRhdGFEaXJlY3RvcnkoKSk7Ci0gICAgZ19hc3NlcnRf
Y21wc3RyKFRlc3Q6OmRhdGFEaXJlY3RvcnkoKSwgPT0sIHdlYmtpdF93ZWJfY29udGV4dF9nZXRf
ZmF2aWNvbl9kYXRhYmFzZV9kaXJlY3RvcnkodGVzdC0+bV93ZWJDb250ZXh0LmdldCgpKSk7Ci19
Ci0KLSNpZiBQTEFURk9STShHVEspCi1zdGF0aWMgdm9pZCB0ZXN0Q2xlYXJEYXRhYmFzZShGYXZp
Y29uRGF0YWJhc2VUZXN0KiB0ZXN0KQotewotICAgIFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0
YWJhc2UgPSB3ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2UodGVzdC0+bV93
ZWJDb250ZXh0LmdldCgpKTsKLSAgICB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9jbGVhcihkYXRh
YmFzZSk7CisgICAgZ19hc3NlcnRfZXJyb3IodGVzdC0+bV9lcnJvci5nZXQoKSwgV0VCS0lUX0ZB
VklDT05fREFUQUJBU0VfRVJST1IsIFdFQktJVF9GQVZJQ09OX0RBVEFCQVNFX0VSUk9SX05PVF9J
TklUSUFMSVpFRCk7CiAKLSAgICBHVW5pcXVlUHRyPGNoYXI+IGljb25VUkkod2Via2l0X2Zhdmlj
b25fZGF0YWJhc2VfZ2V0X2Zhdmljb25fdXJpKGRhdGFiYXNlLCBrU2VydmVyLT5nZXRVUklGb3JQ
YXRoKCIvZm9vIikuZGF0YSgpKSk7Ci0gICAgZ19hc3NlcnRfbnVsbChpY29uVVJJKTsKKyAgICB0
ZXN0LT5vcGVuKCJ0ZXN0RmF2aWNvbkRhdGFiYXNlSW5pdGlhbGl6YXRpb24iKTsKKyAgICBHVW5p
cXVlUHRyPGNoYXI+IGRhdGFiYXNlRmlsZShnX2J1aWxkX2ZpbGVuYW1lKHdlYmtpdF93ZWJfY29u
dGV4dF9nZXRfZmF2aWNvbl9kYXRhYmFzZV9kaXJlY3RvcnkodGVzdC0+bV93ZWJDb250ZXh0Lmdl
dCgpKSwgIldlYnBhZ2VJY29ucy5kYiIsIG51bGxwdHIpKTsKKyAgICBnX2Fzc2VydF90cnVlKGdf
ZmlsZV90ZXN0KGRhdGFiYXNlRmlsZS5nZXQoKSwgR19GSUxFX1RFU1RfSVNfUkVHVUxBUikpOwog
fQogCi1zdGF0aWMgdm9pZCBlcGhlbWVyYWxWaWV3TG9hZENoYW5nZWQoV2ViS2l0V2ViVmlldyog
d2ViVmlldywgV2ViS2l0TG9hZEV2ZW50IGxvYWRFdmVudCwgV2ViVmlld1Rlc3QqIHRlc3QpCitz
dGF0aWMgdm9pZCB0ZXN0RmF2aWNvbkRhdGFiYXNlR2V0RmF2aWNvbihGYXZpY29uRGF0YWJhc2VU
ZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQogewotICAgIGlmIChsb2FkRXZlbnQgIT0gV0VCS0lU
X0xPQURfRklOSVNIRUQpCi0gICAgICAgIHJldHVybjsKLSAgICBnX3NpZ25hbF9oYW5kbGVyc19k
aXNjb25uZWN0X2J5X2Z1bmMod2ViVmlldywgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZXBoZW1l
cmFsVmlld0xvYWRDaGFuZ2VkKSwgdGVzdCk7Ci0gICAgdGVzdC0+cXVpdE1haW5Mb29wKCk7Ci19
Ci0KLXN0YXRpYyB2b2lkIHRlc3RQcml2YXRlQnJvd3NpbmcoRmF2aWNvbkRhdGFiYXNlVGVzdCog
dGVzdCkKLXsKLSAgICBhdXRvIHdlYlZpZXcgPSBUZXN0OjphZG9wdFZpZXcoZ19vYmplY3RfbmV3
KFdFQktJVF9UWVBFX1dFQl9WSUVXLAotICAgICAgICAid2ViLWNvbnRleHQiLCB0ZXN0LT5tX3dl
YkNvbnRleHQuZ2V0KCksCi0gICAgICAgICJpcy1lcGhlbWVyYWwiLCBUUlVFLAotICAgICAgICBu
dWxscHRyKSk7Ci0gICAgZ19zaWduYWxfY29ubmVjdCh3ZWJWaWV3LmdldCgpLCAibG9hZC1jaGFu
Z2VkIiwgR19DQUxMQkFDSyhlcGhlbWVyYWxWaWV3TG9hZENoYW5nZWQpLCB0ZXN0KTsKLSAgICB3
ZWJraXRfd2ViX3ZpZXdfbG9hZF91cmkod2ViVmlldy5nZXQoKSwga1NlcnZlci0+Z2V0VVJJRm9y
UGF0aCgiL2ZvbyIpLmRhdGEoKSk7Ci0gICAgZ19tYWluX2xvb3BfcnVuKHRlc3QtPm1fbWFpbkxv
b3ApOwotCi0gICAgLy8gQW4gZXBoZW1lcmFsIHdlYiB2aWV3IHNob3VsZCBub3Qgd3JpdGUgdG8g
dGhlIGRhdGFiYXNlLgotICAgIHRlc3QtPmdldEZhdmljb25Gb3JQYWdlVVJJQW5kV2FpdFVudGls
UmVhZHkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSk7Ci0gICAgZ19hc3Nl
cnRfbnVsbCh0ZXN0LT5tX2Zhdmljb24pOwotICAgIGdfYXNzZXJ0X25vbm51bGwodGVzdC0+bV9l
cnJvcik7Ci19CisgICAgdGVzdC0+b3BlbigidGVzdEZhdmljb25EYXRhYmFzZUdldEZhdmljb24i
KTsKIAotc3RhdGljIHZvaWQgdGVzdEdldEZhdmljb24oRmF2aWNvbkRhdGFiYXNlVGVzdCogdGVz
dCkKLXsKLSAgICAvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIHBhZ2UgZmlyc3QgdG8gZW5zdXJlIHRo
ZSBpY29uIGRhdGEgd2lsbCBiZQotICAgIC8vIGluIHRoZSBkYXRhYmFzZSBpbiBjYXNlIHRoZXJl
J3MgYW4gYXNzb2NpYXRlZCBmYXZpY29uLgogICAgIHRlc3QtPmxvYWRVUkkoa1NlcnZlci0+Z2V0
VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSk7Ci0gICAgdGVzdC0+d2FpdFVudGlsRmF2aWNvbkNo
YW5nZWQoKTsKKyAgICB0ZXN0LT53YWl0VW50aWxMb2FkRmluaXNoZWRBbmRGYXZpY29uQ2hhbmdl
ZCgpOwogICAgIENTdHJpbmcgZmF2aWNvblVSSSA9IGtTZXJ2ZXItPmdldFVSSUZvclBhdGgoIi9p
Y29uL2Zhdmljb24uaWNvIik7CiAKLSAgICAvLyBDaGVjayB0aGUgQVBJIHJldHJpZXZpbmcgYSB2
YWxpZCBmYXZpY29uLgogICAgIHRlc3QtPmdldEZhdmljb25Gb3JQYWdlVVJJQW5kV2FpdFVudGls
UmVhZHkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSk7CiAgICAgZ19hc3Nl
cnRfbm9ubnVsbCh0ZXN0LT5tX2Zhdmljb24pOwotICAgIGdfYXNzZXJ0X2NtcHN0cih0ZXN0LT5t
X2Zhdmljb25VUkkuZGF0YSgpLCA9PSwgZmF2aWNvblVSSS5kYXRhKCkpOwotICAgIGdfYXNzZXJ0
X25vX2Vycm9yKHRlc3QtPm1fZXJyb3IuZ2V0KCkpOwotCi0gICAgLy8gQ2hlY2sgdGhhdCB3aWR0
aCBhbmQgaGVpZ2h0IG1hdGNoIHRob3NlIGZyb20gYmxhbmsuaWNvICgxNngxNiBmYXZpY29uKS4K
ICAgICBnX2Fzc2VydF9jbXBpbnQoY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfd2lkdGgodGVzdC0+
bV9mYXZpY29uKSwgPT0sIDE2KTsKICAgICBnX2Fzc2VydF9jbXBpbnQoY2Fpcm9faW1hZ2Vfc3Vy
ZmFjZV9nZXRfaGVpZ2h0KHRlc3QtPm1fZmF2aWNvbiksID09LCAxNik7CisgICAgZ19hc3NlcnRf
Y21wc3RyKHRlc3QtPm1fZmF2aWNvblVSSS5kYXRhKCksID09LCBmYXZpY29uVVJJLmRhdGEoKSk7
CisgICAgZ19hc3NlcnRfbm9fZXJyb3IodGVzdC0+bV9lcnJvci5nZXQoKSk7CiAKLSAgICAvLyBD
aGVjayB0aGF0IGFub3RoZXIgcGFnZSB3aXRoIHRoZSBzYW1lIGZhdmljb24gcmV0dXJuIHRoZSBz
YW1lIGljb24uCisgICAgLy8gQ2hlY2sgdGhhdCBhbm90aGVyIHBhZ2Ugd2l0aCB0aGUgc2FtZSBm
YXZpY29uIHJldHVybnMgdGhlIHNhbWUgaWNvbi4KICAgICBjYWlyb19zdXJmYWNlX3QqIGZhdmlj
b24gPSBjYWlyb19zdXJmYWNlX3JlZmVyZW5jZSh0ZXN0LT5tX2Zhdmljb24pOwogICAgIHRlc3Qt
PmxvYWRVUkkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL2JhciIpLmRhdGEoKSk7Ci0gICAgLy8g
SXQncyBhIG5ldyBwYWdlIGluIHRoZSBkYXRhYmFzZSwgc28gZmF2aWNvbiB3aWxsIGNoYW5nZSB0
d2ljZSwgZmlyc3QgdG8gcmVzZXQgaXQKLSAgICAvLyBhbmQgdGhlbiB3aGVuIHRoZSBpY29uIGlz
IGxvYWRlZC4KLSAgICB0ZXN0LT53YWl0VW50aWxGYXZpY29uQ2hhbmdlZCgpOworICAgIHRlc3Qt
PndhaXRVbnRpbExvYWRGaW5pc2hlZEFuZEZhdmljb25DaGFuZ2VkKCk7CisgICAgLy8gZmF2aWNv
biBjaGFuZ2VzIHR3aWNlLCBmaXJzdCB0byByZXNldCBpdCBhbmQgdGhlbiB3aGVuIHRoZSBuZXcg
aWNvbiBpcyBsb2FkZWQuCiAgICAgdGVzdC0+d2FpdFVudGlsRmF2aWNvbkNoYW5nZWQoKTsKICAg
ICB0ZXN0LT5nZXRGYXZpY29uRm9yUGFnZVVSSUFuZFdhaXRVbnRpbFJlYWR5KGtTZXJ2ZXItPmdl
dFVSSUZvclBhdGgoIi9iYXIiKS5kYXRhKCkpOwogICAgIGdfYXNzZXJ0X25vbm51bGwodGVzdC0+
bV9mYXZpY29uKTsKLSAgICBnX2Fzc2VydF9jbXBzdHIodGVzdC0+bV9mYXZpY29uVVJJLmRhdGEo
KSwgPT0sIGZhdmljb25VUkkuZGF0YSgpKTsKICAgICBnX2Fzc2VydF90cnVlKHRlc3QtPm1fZmF2
aWNvbiA9PSBmYXZpY29uKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIodGVzdC0+bV9mYXZpY29uVVJJ
LmRhdGEoKSwgPT0sIGZhdmljb25VUkkuZGF0YSgpKTsKICAgICBnX2Fzc2VydF9ub19lcnJvcih0
ZXN0LT5tX2Vycm9yLmdldCgpKTsKICAgICBjYWlyb19zdXJmYWNlX2Rlc3Ryb3koZmF2aWNvbik7
CiAKLSAgICAvLyBDaGVjayB0aGUgQVBJIHJldHJpZXZpbmcgYW4gaW52YWxpZCBmYXZpY29uLiBG
YXZpY29uIGNoYW5nZXMgb25seSBvbmNlIHRvIHJlc2V0IGl0LCB0aGVuCi0gICAgLy8gdGhlIGRh
dGFiYXNlIGlzIHVwZGF0ZWQgd2l0aCB0aGUgZmF2aWNvbiBVUkksIGJ1dCBub3Qgd2l0aCBmYXZp
Y29uIGltYWdlIGRhdGEuCisgICAgZmF2aWNvblVSSSA9IGtTZXJ2ZXItPmdldFVSSUZvclBhdGgo
Ii9mYXZpY29uLmljbyIpOwogICAgIHRlc3QtPmxvYWRVUkkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0
aCgiL25vZmF2aWNvbiIpLmRhdGEoKSk7Ci0gICAgdGVzdC0+d2FpdFVudGlsRmF2aWNvbkNoYW5n
ZWQoKTsKKyAgICB0ZXN0LT53YWl0VW50aWxMb2FkRmluaXNoZWRBbmRGYXZpY29uQ2hhbmdlZCgp
OwogICAgIHRlc3QtPndhaXRVbnRpbEZhdmljb25VUklDaGFuZ2VkKCk7Ci0KICAgICB0ZXN0LT5n
ZXRGYXZpY29uRm9yUGFnZVVSSUFuZFdhaXRVbnRpbFJlYWR5KGtTZXJ2ZXItPmdldFVSSUZvclBh
dGgoIi9ub2Zhdmljb24iKS5kYXRhKCkpOwogICAgIGdfYXNzZXJ0X251bGwodGVzdC0+bV9mYXZp
Y29uKTsKLSAgICBnX2Fzc2VydF9ub25udWxsKHRlc3QtPm1fZXJyb3IpOworICAgIGdfYXNzZXJ0
X2NtcHN0cih0ZXN0LT5tX2Zhdmljb25VUkkuZGF0YSgpLCA9PSwgZmF2aWNvblVSSS5kYXRhKCkp
OworICAgIGdfYXNzZXJ0X2Vycm9yKHRlc3QtPm1fZXJyb3IuZ2V0KCksIFdFQktJVF9GQVZJQ09O
X0RBVEFCQVNFX0VSUk9SLCBXRUJLSVRfRkFWSUNPTl9EQVRBQkFTRV9FUlJPUl9GQVZJQ09OX1VO
S05PV04pOworCisgICAgLy8gTG9hZGluZyBhbiBpY29uIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUg
ZGF0YWJhc2Ugc2hvdWxkIGVtaXQKKyAgICAvLyBXZWJLaXRXZWJWaWV3Ojpub3RpZnk6OmZhdmlj
b24sIGJ1dCBub3QgV2ViS2l0RmF2aWNvbkRhdGFiYXNlOjppY29uLWNoYW5nZWQuCisgICAgZ19h
c3NlcnRfbnVsbCh3ZWJraXRfd2ViX3ZpZXdfZ2V0X2Zhdmljb24odGVzdC0+bV93ZWJWaWV3KSk7
CisgICAgdGVzdC0+bV9mYXZpY29uVVJJID0geyB9OworICAgIHRlc3QtPmxvYWRVUkkoa1NlcnZl
ci0+Z2V0VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSk7CisgICAgdGVzdC0+d2FpdFVudGlsRmF2
aWNvbkNoYW5nZWQoKTsKKyAgICBnX2Fzc2VydF90cnVlKHRlc3QtPm1fZmF2aWNvblVSSS5pc051
bGwoKSk7CisgICAgZ19hc3NlcnRfbm9ubnVsbCh3ZWJraXRfd2ViX3ZpZXdfZ2V0X2Zhdmljb24o
dGVzdC0+bV93ZWJWaWV3KSk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RHZXRGYXZpY29uVVJJKEZh
dmljb25EYXRhYmFzZVRlc3QqIHRlc3QpCitzdGF0aWMgdm9pZCBlcGhlbWVyYWxWaWV3RmF2aWNv
bkNoYW5nZWQoV2ViS2l0V2ViVmlldyogd2ViVmlldywgR1BhcmFtU3BlYyosIFdlYlZpZXdUZXN0
KiB0ZXN0KQogewotICAgIFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UgPSB3ZWJraXRf
d2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2UodGVzdC0+bV93ZWJDb250ZXh0LmdldCgp
KTsKLQotICAgIENTdHJpbmcgYmFzZVVSSSA9IGtTZXJ2ZXItPmdldFVSSUZvclBhdGgoIi9mb28i
KTsKLSAgICBHVW5pcXVlUHRyPGNoYXI+IGljb25VUkkod2Via2l0X2Zhdmljb25fZGF0YWJhc2Vf
Z2V0X2Zhdmljb25fdXJpKGRhdGFiYXNlLCBiYXNlVVJJLmRhdGEoKSkpOwotICAgIEFTU0VSVF9D
TVBfQ1NUUklORyhpY29uVVJJLmdldCgpLCA9PSwga1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL2lj
b24vZmF2aWNvbi5pY28iKSk7CisgICAgZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9ieV9m
dW5jKHdlYlZpZXcsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGVwaGVtZXJhbFZpZXdGYXZpY29u
Q2hhbmdlZCksIHRlc3QpOworICAgIHRlc3QtPnF1aXRNYWluTG9vcCgpOwogfQogCi1zdGF0aWMg
dm9pZCB0ZXN0V2ViVmlld0Zhdmljb24oRmF2aWNvbkRhdGFiYXNlVGVzdCogdGVzdCkKK3N0YXRp
YyB2b2lkIHRlc3RGYXZpY29uRGF0YWJhc2VFcGhlbWVyYWwoRmF2aWNvbkRhdGFiYXNlVGVzdCog
dGVzdCwgZ2NvbnN0cG9pbnRlcikKIHsKLSAgICB0ZXN0LT5tX2Zhdmljb25VUkkgPSBDU3RyaW5n
KCk7Ci0KLSAgICBjYWlyb19zdXJmYWNlX3QqIGljb25Gcm9tV2ViVmlldyA9IHdlYmtpdF93ZWJf
dmlld19nZXRfZmF2aWNvbih0ZXN0LT5tX3dlYlZpZXcpOwotICAgIGdfYXNzZXJ0X251bGwoaWNv
bkZyb21XZWJWaWV3KTsKKyAgICAvLyBJZiB0aGUgY29udGV4dCBpcyBlcGhlbWVyYWwsIHRoZSBk
YXRhYmFzZSBpcyBub3QgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgIEdSZWZQdHI8
V2ViS2l0V2ViQ29udGV4dD4gZXBoZW1lcmFsQ29udGV4dCA9IGFkb3B0R1JlZih3ZWJraXRfd2Vi
X2NvbnRleHRfbmV3X2VwaGVtZXJhbCgpKTsKKyAgICBHVW5pcXVlUHRyPGNoYXI+IGRhdGFiYXNl
RGlyZWN0b3J5KGdfYnVpbGRfZmlsZW5hbWUoVGVzdDo6ZGF0YURpcmVjdG9yeSgpLCAidGVzdEZh
dmljb25EYXRhYmFzZUVwaGVtZXJhbCIsIG51bGxwdHIpKTsKKyAgICB3ZWJraXRfd2ViX2NvbnRl
eHRfc2V0X2Zhdmljb25fZGF0YWJhc2VfZGlyZWN0b3J5KGVwaGVtZXJhbENvbnRleHQuZ2V0KCks
IGRhdGFiYXNlRGlyZWN0b3J5LmdldCgpKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIoZGF0YWJhc2VE
aXJlY3RvcnkuZ2V0KCksID09LCB3ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJh
c2VfZGlyZWN0b3J5KGVwaGVtZXJhbENvbnRleHQuZ2V0KCkpKTsKKyAgICBHVW5pcXVlUHRyPGNo
YXI+IGRhdGFiYXNlRmlsZShnX2J1aWxkX2ZpbGVuYW1lKGRhdGFiYXNlRGlyZWN0b3J5LmdldCgp
LCAiV2VicGFnZUljb25zLmRiIiwgbnVsbHB0cikpOworICAgIGdfYXNzZXJ0X2ZhbHNlKGdfZmls
ZV90ZXN0KGRhdGFiYXNlRmlsZS5nZXQoKSwgR19GSUxFX1RFU1RfRVhJU1RTKSk7CisgICAgZXBo
ZW1lcmFsQ29udGV4dCA9IG51bGxwdHI7CisKKyAgICB0ZXN0LT5vcGVuKCJ0ZXN0RmF2aWNvbkRh
dGFiYXNlRXBoZW1lcmFsIik7CisgICAgZ19hc3NlcnRfdHJ1ZShnX2ZpbGVfdGVzdChkYXRhYmFz
ZUZpbGUuZ2V0KCksIEdfRklMRV9URVNUX0VYSVNUUykpOwogCiAgICAgdGVzdC0+bG9hZFVSSShr
U2VydmVyLT5nZXRVUklGb3JQYXRoKCIvZm9vIikuZGF0YSgpKTsKLSAgICB0ZXN0LT53YWl0VW50
aWxGYXZpY29uQ2hhbmdlZCgpOwotICAgIGdfYXNzZXJ0X3RydWUodGVzdC0+bV9mYXZpY29uTm90
aWZpY2F0aW9uUmVjZWl2ZWQpOwotICAgIC8vIFRoZSBpY29uIGlzIGtub3duIGFuZCBoYXNuJ3Qg
Y2hhbmdlZCBpbiB0aGUgZGF0YWJhc2UsIHNvIG5vdGlmeTo6ZmF2aWNvbiBpcyBlbWl0dGVkCi0g
ICAgLy8gYnV0IFdlYktpdEZhdmljb25EYXRhYmFzZTo6aWNvbi1jaGFuZ2VkIGlzbid0LgotICAg
IGdfYXNzZXJ0X3RydWUodGVzdC0+bV9mYXZpY29uVVJJLmlzTnVsbCgpKTsKKyAgICB0ZXN0LT53
YWl0VW50aWxMb2FkRmluaXNoZWRBbmRGYXZpY29uQ2hhbmdlZCgpOworCisgICAgLy8gQW4gZXBo
ZW1lcmFsIHdlYiB2aWV3IGRvZXNuJ3Qgd3JpdGUgdG8gdGhlIGRhdGFiYXNlLgorICAgIGF1dG8g
d2ViVmlldyA9IFRlc3Q6OmFkb3B0VmlldyhnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfV0VCX1ZJ
RVcsCisgICAgICAgICJ3ZWItY29udGV4dCIsIHRlc3QtPm1fd2ViQ29udGV4dC5nZXQoKSwgImlz
LWVwaGVtZXJhbCIsIFRSVUUsIG51bGxwdHIpKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KHdlYlZp
ZXcuZ2V0KCksICJub3RpZnk6OmZhdmljb24iLCBHX0NBTExCQUNLKGVwaGVtZXJhbFZpZXdGYXZp
Y29uQ2hhbmdlZCksIHRlc3QpOworICAgIHdlYmtpdF93ZWJfdmlld19sb2FkX3VyaSh3ZWJWaWV3
LmdldCgpLCBrU2VydmVyLT5nZXRVUklGb3JQYXRoKCIvYmFyIikuZGF0YSgpKTsKKyAgICBnX21h
aW5fbG9vcF9ydW4odGVzdC0+bV9tYWluTG9vcCk7CisKKyAgICAvLyBXZSBnZXQgYSBmYXZpY29u
LCBidXQgaXQncyBvbmx5IGluIGRhdGFiYXNlIG1lbW9yeSBjYWNoZS4KKyAgICBnX2Fzc2VydF9u
b25udWxsKHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uX3VyaSh0ZXN0LT5tX2Rh
dGFiYXNlLCBrU2VydmVyLT5nZXRVUklGb3JQYXRoKCIvYmFyIikuZGF0YSgpKSk7CisKKyAgICAv
LyBJZiB0aGUgZGF0YWJhc2UgZXhpc3RzLCBpdCdzIHVzZWQgaW4gcmVhZCBvbmx5IG1vZGUgZm9y
IGVwZWhlcmFsIGNvbnRleHRzLgorICAgIGVwaGVtZXJhbENvbnRleHQgPSBhZG9wdEdSZWYod2Vi
a2l0X3dlYl9jb250ZXh0X25ld19lcGhlbWVyYWwoKSk7CisgICAgd2Via2l0X3dlYl9jb250ZXh0
X3NldF9mYXZpY29uX2RhdGFiYXNlX2RpcmVjdG9yeShlcGhlbWVyYWxDb250ZXh0LmdldCgpLCBk
YXRhYmFzZURpcmVjdG9yeS5nZXQoKSk7CisgICAgYXV0byogZXBoZW1lcmFsRGF0YWJhc2UgPSB3
ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2UoZXBoZW1lcmFsQ29udGV4dC5n
ZXQoKSk7CisgICAgZ19hc3NlcnRfbm9ubnVsbCh3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRf
ZmF2aWNvbl91cmkoZXBoZW1lcmFsRGF0YWJhc2UsIGtTZXJ2ZXItPmdldFVSSUZvclBhdGgoIi9m
b28iKS5kYXRhKCkpKTsKIAotICAgIGljb25Gcm9tV2ViVmlldyA9IHdlYmtpdF93ZWJfdmlld19n
ZXRfZmF2aWNvbih0ZXN0LT5tX3dlYlZpZXcpOwotICAgIGdfYXNzZXJ0X25vbm51bGwoaWNvbkZy
b21XZWJWaWV3KTsKLSAgICBnX2Fzc2VydF9jbXB1aW50KGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0
X3dpZHRoKGljb25Gcm9tV2ViVmlldyksID09LCAxNik7Ci0gICAgZ19hc3NlcnRfY21wdWludChj
YWlyb19pbWFnZV9zdXJmYWNlX2dldF9oZWlnaHQoaWNvbkZyb21XZWJWaWV3KSwgPT0sIDE2KTsK
KyAgICAvLyBQYWdlIFVSTCBsb2FkZWQgaW4gZXBoZW1lcmFsIHdlYiB2aWV3IGlzIG5vdCBpbiB0
aGUgZGF0YWJhc2UuCisgICAgZ19hc3NlcnRfbnVsbCh3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9n
ZXRfZmF2aWNvbl91cmkoZXBoZW1lcmFsRGF0YWJhc2UsIGtTZXJ2ZXItPmdldFVSSUZvclBhdGgo
Ii9iYXIiKS5kYXRhKCkpKTsKKyAgICBlcGhlbWVyYWxDb250ZXh0ID0gbnVsbHB0cjsKIH0KLSNl
bmRpZgogCi1zdGF0aWMgdm9pZCB0ZXN0RmF2aWNvbkRhdGFiYXNlKEZhdmljb25EYXRhYmFzZVRl
c3QqIHRlc3QsIGdjb25zdHBvaW50ZXIpCit2b2lkIHRlc3RGYXZpY29uRGF0YWJhc2VDbGVhcihG
YXZpY29uRGF0YWJhc2VUZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQogewotICAgIC8vIFRoZXNl
IHRlc3RzIGRlcGVuZCBvbiB0aGlzIG9yZGVyIHRvIHJ1biBwcm9wZXJseSBzbyB3ZSBkZWNsYXJl
IHRoZW0gaW4gYSBzaW5nbGUgb25lLgotICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTExNDM0LgotI2lmIFBMQVRGT1JNKEdUSykKLSAgICB0ZXN0Tm90
SW5pdGlhbGl6ZWQodGVzdCk7Ci0jZW5kaWYKKyAgICB0ZXN0LT5vcGVuKCJ0ZXN0RmF2aWNvbkRh
dGFiYXNlQ2xlYXIiKTsKKyAgICB0ZXN0LT5sb2FkVVJJKGtTZXJ2ZXItPmdldFVSSUZvclBhdGgo
Ii9mb28iKS5kYXRhKCkpOworICAgIHRlc3QtPndhaXRVbnRpbExvYWRGaW5pc2hlZEFuZEZhdmlj
b25DaGFuZ2VkKCk7CisgICAgdGVzdC0+Z2V0RmF2aWNvbkZvclBhZ2VVUklBbmRXYWl0VW50aWxS
ZWFkeShrU2VydmVyLT5nZXRVUklGb3JQYXRoKCIvZm9vIikuZGF0YSgpKTsKKyAgICBnX2Fzc2Vy
dF9ub25udWxsKHRlc3QtPm1fZmF2aWNvbik7CisgICAgZ19hc3NlcnRfbm9ubnVsbCh3ZWJraXRf
ZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbl91cmkodGVzdC0+bV9kYXRhYmFzZSwga1NlcnZl
ci0+Z2V0VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSkpOwogCi0gICAgdGVzdFNldERpcmVjdG9y
eSh0ZXN0KTsKKyAgICB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9jbGVhcih0ZXN0LT5tX2RhdGFi
YXNlKTsKIAotI2lmIFBMQVRGT1JNKEdUSykKLSAgICB0ZXN0UHJpdmF0ZUJyb3dzaW5nKHRlc3Qp
OwotICAgIHRlc3RHZXRGYXZpY29uKHRlc3QpOwotICAgIHRlc3RXZWJWaWV3RmF2aWNvbih0ZXN0
KTsKLSAgICB0ZXN0R2V0RmF2aWNvblVSSSh0ZXN0KTsKLSAgICB0ZXN0Q2xlYXJEYXRhYmFzZSh0
ZXN0KTsKLSNlbmRpZgorICAgIHRlc3QtPmdldEZhdmljb25Gb3JQYWdlVVJJQW5kV2FpdFVudGls
UmVhZHkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSk7CisgICAgZ19hc3Nl
cnRfbnVsbCh0ZXN0LT5tX2Zhdmljb24pOworICAgIGdfYXNzZXJ0X251bGwod2Via2l0X2Zhdmlj
b25fZGF0YWJhc2VfZ2V0X2Zhdmljb25fdXJpKHRlc3QtPm1fZGF0YWJhc2UsIGtTZXJ2ZXItPmdl
dFVSSUZvclBhdGgoIi9mb28iKS5kYXRhKCkpKTsKIH0KIAogdm9pZCBiZWZvcmVBbGwoKQogewot
I2lmIFBMQVRGT1JNKEdUSykKICAgICAvLyBTdGFydCBhIHNvdXAgc2VydmVyIGZvciB0ZXN0aW5n
LgogICAgIGtTZXJ2ZXIgPSBuZXcgV2ViS2l0VGVzdFNlcnZlcigpOwogICAgIGtTZXJ2ZXItPnJ1
bihzZXJ2ZXJDYWxsYmFjayk7Ci0jZW5kaWYKIAotICAgIC8vIEFkZCB0ZXN0cyB0byB0aGUgc3Vp
dGUuCi0gICAgRmF2aWNvbkRhdGFiYXNlVGVzdDo6YWRkKCJXZWJLaXRGYXZpY29uRGF0YWJhc2Ui
LCAiZmF2aWNvbi1kYXRhYmFzZS10ZXN0IiwgdGVzdEZhdmljb25EYXRhYmFzZSk7CisgICAgRmF2
aWNvbkRhdGFiYXNlVGVzdDo6YWRkKCJXZWJLaXRGYXZpY29uRGF0YWJhc2UiLCAiaW5pdGlhbGl6
YXRpb24iLCB0ZXN0RmF2aWNvbkRhdGFiYXNlSW5pdGlhbGl6YXRpb24pOworICAgIEZhdmljb25E
YXRhYmFzZVRlc3Q6OmFkZCgiV2ViS2l0RmF2aWNvbkRhdGFiYXNlIiwgImdldC1mYXZpY29uIiwg
dGVzdEZhdmljb25EYXRhYmFzZUdldEZhdmljb24pOworICAgIEZhdmljb25EYXRhYmFzZVRlc3Q6
OmFkZCgiV2ViS2l0RmF2aWNvbkRhdGFiYXNlIiwgImVwaGVtZXJhbCIsIHRlc3RGYXZpY29uRGF0
YWJhc2VFcGhlbWVyYWwpOworICAgIEZhdmljb25EYXRhYmFzZVRlc3Q6OmFkZCgiV2ViS2l0RmF2
aWNvbkRhdGFiYXNlIiwgImNsZWFyIiwgdGVzdEZhdmljb25EYXRhYmFzZUNsZWFyKTsKIH0KIAog
dm9pZCBhZnRlckFsbCgpCiB7Ci0jaWYgUExBVEZPUk0oR1RLKQogICAgIGRlbGV0ZSBrU2VydmVy
OwotI2VuZGlmCiB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9n
bGliL1Rlc3RFeHBlY3RhdGlvbnMuanNvbiBiL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvZ2xpYi9UZXN0
RXhwZWN0YXRpb25zLmpzb24KaW5kZXggMDc1NWVhNjExODguLjRjMjUwM2JhZmYxIDEwMDY0NAot
LS0gYS9Ub29scy9UZXN0V2ViS2l0QVBJL2dsaWIvVGVzdEV4cGVjdGF0aW9ucy5qc29uCisrKyBi
L1Rvb2xzL1Rlc3RXZWJLaXRBUEkvZ2xpYi9UZXN0RXhwZWN0YXRpb25zLmpzb24KQEAgLTE3Mywx
MiArMTczLDUgQEAKICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQiOiB7ImFsbEBEZWJ1ZyI6IHsi
c2xvdyI6IHRydWV9fQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSwKLSAgICAiVGVz
dFdlYktpdEZhdmljb25EYXRhYmFzZSI6IHsKLSAgICAgICAgInN1YnRlc3RzIjogewotICAgICAg
ICAgICAgIi93ZWJraXQvV2ViS2l0RmF2aWNvbkRhdGFiYXNlL2Zhdmljb24tZGF0YWJhc2UtdGVz
dCI6IHsKLSAgICAgICAgICAgICAgICAiZXhwZWN0ZWQiOiB7Imd0ayI6IHsic3RhdHVzIjogWyJQ
QVNTIiwgIkZBSUwiXSwgImJ1ZyI6ICJ3ZWJraXQub3JnL2IvMTg4MTEwIn19Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KICAgICB9CiB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>379624</attachid>
            <date>2019-09-26 01:04:38 -0700</date>
            <delta_ts>2019-09-30 05:16:24 -0700</delta_ts>
            <desc>Try to fix WPE build</desc>
            <filename>wk2-favicon-database.diff</filename>
            <type>text/plain</type>
            <size>173321</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFu
Z2VMb2cKaW5kZXggY2M1NzI3ZWY5YWYuLjQ5NWU2NGVkMzNhIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L0NoYW5nZUxvZwpAQCAtMSwzICsx
LDYwIEBACisyMDE5LTA5LTI2ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlh
LmNvbT4KKworICAgICAgICBbR1RLXSBJY29uRGF0YWJhc2UgaXMgbm90IHRocmVhZC1zYWZlCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDEzMDMKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSZXdyaXRlIHRo
ZSBJY29uRGF0YWJhc2UgaW1wbGVtZW50YXRpb24uIE5vdyB0aGF0IHdlIGFyZSB0aGUgb25seSB1
c2VycyBvZiB0aGlzIGNvZGUsIHdlIGNhbiBzaW1wbHkgaXQgYSBsb3QgYW5kCisgICAgICAgIGRl
c2lnbiBpdCBzcGVjaWZpY2FsbHkgZm9yIG91ciBBUEksIHdoaWNoIGltcGxlbWVudGF0aW9uIGhh
cyBiZWVuIHNpbXBsaWZpZWQgYSBsb3QgdG9vLiBUaGVyZSdzIG5vIGNoYW5nZSBpbgorICAgICAg
ICB0aGUgZGF0YWJhc2Ugc2NoZW1hIG5vciBpbiBiZWhhdmlvciBmcm9tIHRoZSBBUEkgcG9pbnQg
b2Ygdmlldy4KKworICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuY3Bw
OgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6Okljb25EYXRhYmFzZSk6CisgICAgICAg
IChXZWJLaXQ6Okljb25EYXRhYmFzZTo6fkljb25EYXRhYmFzZSk6CisgICAgICAgIChXZWJLaXQ6
Okljb25EYXRhYmFzZTo6Y3JlYXRlVGFibGVzSWZOZWVkZWQpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OnBvcHVsYXRlUGFnZVVSTFRvSWNvblVSTE1hcCk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6Y2xlYXJTdGF0ZW1lbnRzKToKKyAgICAgICAgKFdlYktpdDo6SWNv
bkRhdGFiYXNlOjpwcnVuZVRpbWVyRmlyZWQpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJh
c2U6OnN0YXJ0UHJ1bmVUaW1lcik6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6Y2xl
YXJMb2FkZWRJY29uc1RpbWVyRmlyZWQpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6
OnN0YXJ0Q2xlYXJMb2FkZWRJY29uc1RpbWVyKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFi
YXNlOjppY29uSURGb3JJY29uVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpz
ZXRJY29uSURGb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjppY29u
RGF0YSk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6YWRkSWNvbik6CisgICAgICAg
IChXZWJLaXQ6Okljb25EYXRhYmFzZTo6dXBkYXRlSWNvblRpbWVzdGFtcCk6CisgICAgICAgIChX
ZWJLaXQ6Okljb25EYXRhYmFzZTo6ZGVsZXRlSWNvbik6CisgICAgICAgIChXZWJLaXQ6Okljb25E
YXRhYmFzZTo6Y2hlY2tJY29uVVJMQW5kU2V0UGFnZVVSTElmTmVlZGVkKToKKyAgICAgICAgKFdl
YktpdDo6SWNvbkRhdGFiYXNlOjpsb2FkSWNvbkZvclBhZ2VVUkwpOgorICAgICAgICAoV2ViS2l0
OjpJY29uRGF0YWJhc2U6Omljb25VUkxGb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNv
bkRhdGFiYXNlOjpzZXRJY29uRm9yUGFnZVVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRh
YmFzZTo6Y2xlYXIpOgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2Uu
aDoKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpjcmVhdGUpOgorICAgICAgICAqIFVJ
UHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwOgorICAgICAgICAod2Vi
a2l0RmF2aWNvbkRhdGFiYXNlQ3JlYXRlKToKKyAgICAgICAgKHdlYmtpdEZhdmljb25EYXRhYmFz
ZUlzT3Blbik6CisgICAgICAgICh3ZWJraXRGYXZpY29uRGF0YWJhc2VPcGVuKToKKyAgICAgICAg
KHdlYmtpdEZhdmljb25EYXRhYmFzZUNsb3NlKToKKyAgICAgICAgKHdlYmtpdEZhdmljb25EYXRh
YmFzZUdldExvYWREZWNpc2lvbkZvckljb24pOgorICAgICAgICAod2Via2l0RmF2aWNvbkRhdGFi
YXNlU2V0SWNvbkZvclBhZ2VVUkwpOgorICAgICAgICAod2Via2l0RmF2aWNvbkRhdGFiYXNlR2V0
RmF2aWNvbkludGVybmFsKToKKyAgICAgICAgKHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9m
YXZpY29uKToKKyAgICAgICAgKHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uX2Zp
bmlzaCk6CisgICAgICAgICh3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbl91cmkp
OgorICAgICAgICAod2Via2l0X2Zhdmljb25fZGF0YWJhc2VfY2xlYXIpOgorICAgICAgICAqIFVJ
UHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2YXRlLmg6CisgICAgICAg
ICogVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYkNvbnRleHQuY3BwOgorICAgICAgICAod2Vi
a2l0V2ViQ29udGV4dERpc3Bvc2UpOgorICAgICAgICAod2Via2l0X3dlYl9jb250ZXh0X3NldF9m
YXZpY29uX2RhdGFiYXNlX2RpcmVjdG9yeSk6CisgICAgICAgICh3ZWJraXRXZWJDb250ZXh0Q3Jl
YXRlUGFnZUZvcldlYlZpZXcpOgorICAgICAgICAod2Via2l0V2ViQ29udGV4dFdlYlZpZXdEZXN0
cm95ZWQpOgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRXZWJWaWV3LmNwcDoK
KyAgICAgICAgKHdlYmtpdFdlYlZpZXdSZXF1ZXN0RmF2aWNvbik6CisgICAgICAgICh3ZWJraXRX
ZWJWaWV3R2V0TG9hZERlY2lzaW9uRm9ySWNvbik6CisgICAgICAgICh3ZWJraXRXZWJWaWV3U2V0
SWNvbik6CisKIDIwMTktMDktMjMgIENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNvbT4KIAog
ICAgICAgICBEcm9wIHVubmVjZXNzYXJ5IFNlc3Npb25JRC5oIGhlYWRlciBpbmNsdWRlcwpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmNw
cCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL0ljb25EYXRhYmFzZS5jcHAKaW5k
ZXggMDY4NzBkMjFkZWUuLmYxNTk4YTZkNWE4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL0FQSS9nbGliL0ljb25EYXRhYmFzZS5jcHAKQEAgLTEsMTk2NyArMSw2MzMgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgSnVzdGluIEhheWdvb2QgKGpoYXlnb29kQHJlYWt0
aXguY29tKQorICogQ29weXJpZ2h0IChDKSAyMDE5IElnYWxpYSBTLkwuCiAgKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
KyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkljb25EYXRhYmFz
ZS5oIgogCi0jaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgPFdlYkNvcmUvQml0bWFwSW1h
Z2UuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ltYWdlLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TUUxp
dGVTdGF0ZW1lbnQuaD4KICNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZVRyYW5zYWN0aW9uLmg+CiAj
aW5jbHVkZSA8V2ViQ29yZS9TaGFyZWRCdWZmZXIuaD4KICNpbmNsdWRlIDx3dGYvRmlsZVN5c3Rl
bS5oPgotI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+Ci0jaW5jbHVkZSA8d3RmL05ldmVyRGVz
dHJveWVkLmg+Ci0jaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi9V
UkwuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdDb25jYXRlbmF0ZU51bWJlcnMuaD4KLQot
Ly8gRm9yIG1ldGhvZHMgdGhhdCBhcmUgbWVhbnQgdG8gc3VwcG9ydCBBUEkgZnJvbSB0aGUgbWFp
biB0aHJlYWQgLSBzaG91bGQgbm90IGJlIGNhbGxlZCBpbnRlcm5hbGx5Ci0jZGVmaW5lIEFTU0VS
VF9OT1RfU1lOQ19USFJFQUQoKSBBU1NFUlQoIW1fc3luY1RocmVhZFJ1bm5pbmcgfHwgIUlTX0lD
T05fU1lOQ19USFJFQUQoKSkKLQotLy8gRm9yIG1ldGhvZHMgdGhhdCBhcmUgbWVhbnQgdG8gc3Vw
cG9ydCB0aGUgc3luYyB0aHJlYWQgT05MWQotI2RlZmluZSBJU19JQ09OX1NZTkNfVEhSRUFEKCkg
KG1fc3luY1RocmVhZCA9PSAmVGhyZWFkOjpjdXJyZW50KCkpCi0jZGVmaW5lIEFTU0VSVF9JQ09O
X1NZTkNfVEhSRUFEKCkgQVNTRVJUKElTX0lDT05fU1lOQ19USFJFQUQoKSkKKyNpbmNsdWRlIDx3
dGYvUnVuTG9vcC5oPgorI2luY2x1ZGUgPHd0Zi9nbGliL1J1bkxvb3BTb3VyY2VQcmlvcml0eS5o
PgorI2luY2x1ZGUgPHd0Zi90aHJlYWRzL0JpbmFyeVNlbWFwaG9yZS5oPgogCiBuYW1lc3BhY2Ug
V2ViS2l0IHsKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCi1zdGF0aWMgaW50IGRhdGFiYXNl
Q2xlYW51cENvdW50ZXIgPSAwOwotCiAvLyBUaGlzIHZlcnNpb24gbnVtYmVyIGlzIGluIHRoZSBE
QiBhbmQgbWFya3MgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBvZiB0aGUgc2NoZW1hCi0vLyBDdXJy
ZW50bHksIGEgbWlzbWF0Y2hlZCBzY2hlbWEgY2F1c2VzIHRoZSBEQiB0byBiZSB3aXBlZCBhbmQg
cmVzZXQuIFRoaXMgaXNuJ3QKLS8vIHNvIGJhZCBkdXJpbmcgZGV2ZWxvcG1lbnQgYnV0IGluIHRo
ZSBmdXR1cmUsIHdlIHdvdWxkIG5lZWQgdG8gd3JpdGUgYSBjb252ZXJzaW9uCi0vLyBmdW5jdGlv
biB0byBhZHZhbmNlIG9sZGVyIHJlbGVhc2VkIHNjaGVtYXMgdG8gImN1cnJlbnQiCisvLyBDdXJy
ZW50bHksIGEgbWlzbWF0Y2hlZCBzY2hlbWEgY2F1c2VzIHRoZSBEQiB0byBiZSB3aXBlZCBhbmQg
cmVzZXQuCiBzdGF0aWMgY29uc3QgaW50IGN1cnJlbnREYXRhYmFzZVZlcnNpb24gPSA2OwogCi0v
LyBJY29ucyBleHBpcmUgb25jZSBldmVyeSA0IGRheXMKLXN0YXRpYyBjb25zdCBpbnQgaWNvbkV4
cGlyYXRpb25UaW1lID0gNjAqNjAqMjQqNDsKLQotc3RhdGljIGNvbnN0IFNlY29uZHMgdXBkYXRl
VGltZXJEZWxheSB7IDVfcyB9OwotCi1zdGF0aWMgYm9vbCBjaGVja0ludGVncml0eU9uT3BlbiA9
IGZhbHNlOwotCi0vLyBXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaWNvbnMgdGhhdCBoYXZlIGJl
ZW4gdW51c2VkIGZvciBtb3JlIHRoYW4KLS8vIDMwIGRheXMsIGRlbGV0ZSB0aGVtIGV2ZW4gaWYg
dGhleSBoYXZlIG5vdCBiZWVuIGV4cGxpY2l0bHkgcmVsZWFzZWQuCi1zdGF0aWMgY29uc3QgU2Vj
b25kcyBub3RVc2VkSWNvbkV4cGlyYXRpb25UaW1lIHsgNjAqNjAqMjQqMzAgfTsKLQotI2lmICFM
T0dfRElTQUJMRUQgfHwgIUVSUk9SX0RJU0FCTEVECi1zdGF0aWMgU3RyaW5nIHVybEZvckxvZ2dp
bmcoY29uc3QgU3RyaW5nJiB1cmwpCi17Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVybFRy
dW5jYXRpb25MZW5ndGggPSAxMjA7Ci0KLSAgICBpZiAodXJsLmxlbmd0aCgpIDwgdXJsVHJ1bmNh
dGlvbkxlbmd0aCkKLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICByZXR1cm4gdXJsLnN1YnN0cmlu
ZygwLCB1cmxUcnVuY2F0aW9uTGVuZ3RoKSArICIuLi4iOwotfQotI2VuZGlmCi0KLWNsYXNzIERl
ZmF1bHRJY29uRGF0YWJhc2VDbGllbnQgZmluYWwgOiBwdWJsaWMgSWNvbkRhdGFiYXNlQ2xpZW50
IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICB2b2lkIGRpZElt
cG9ydEljb25VUkxGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlIHsgfQotICAgIHZv
aWQgZGlkSW1wb3J0SWNvbkRhdGFGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlIHsg
fQotICAgIHZvaWQgZGlkQ2hhbmdlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikgb3ZlcnJp
ZGUgeyB9Ci0gICAgdm9pZCBkaWRGaW5pc2hVUkxJbXBvcnQoKSBvdmVycmlkZSB7IH0KLX07Ci0K
LXN0YXRpYyBJY29uRGF0YWJhc2VDbGllbnQqIGRlZmF1bHRDbGllbnQoKQotewotICAgIHN0YXRp
YyBJY29uRGF0YWJhc2VDbGllbnQqIGRlZmF1bHRDbGllbnQgPSBuZXcgRGVmYXVsdEljb25EYXRh
YmFzZUNsaWVudDsKLSAgICByZXR1cm4gZGVmYXVsdENsaWVudDsKLX0KLQotSWNvbkRhdGFiYXNl
OjpJY29uUmVjb3JkOjpJY29uUmVjb3JkKGNvbnN0IFN0cmluZyYgdXJsKQotICAgIDogbV9pY29u
VVJMKHVybCkKLXsKLX0KKy8vIEljb25zIGV4cGlyZSBvbmNlIGV2ZXJ5IDQgZGF5cy4KK3N0YXRp
YyBjb25zdCBTZWNvbmRzIGljb25FeHBpcmF0aW9uVGltZSB7IDYwICogNjAgKiAyNCAqIDQgfTsK
IAotSWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjp+SWNvblJlY29yZCgpCi17Ci0gICAgTE9HKElj
b25EYXRhYmFzZSwgIkRlc3Ryb3lpbmcgSWNvblJlY29yZCBmb3IgaWNvbiB1cmwgJXMiLCBtX2lj
b25VUkwuYXNjaWkoKS5kYXRhKCkpOwotfQorLy8gV2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGlj
b25zIHRoYXQgaGF2ZSBiZWVuIHVudXNlZCBmb3IgbW9yZSB0aGFuIDMwIGRheXMuCitzdGF0aWMg
Y29uc3QgU2Vjb25kcyBub3RVc2VkSWNvbkV4cGlyYXRpb25UaW1lIHsgNjAgKiA2MCAqIDI0ICog
MzAgfTsKIAotTmF0aXZlSW1hZ2VQdHIgSWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjppbWFnZShj
b25zdCBJbnRTaXplJikKLXsKLSAgICAvLyBGSVhNRSByZGFyOi8vNDY4MDM3NyAtIEZvciBzaXpl
IHJpZ2h0IG5vdywgd2UgYXJlIHJldHVybmluZyBvdXIgb25lIGFuZCBvbmx5IGltYWdlIGFuZCB0
aGUgQnJpZGdlCi0gICAgLy8gaXMgcmVzaXppbmcgaXQgaW4gcGxhY2UuIFdlIG5lZWQgdG8gYWN0
dWFsbHkgc3RvcmUgYWxsIHRoZSBvcmlnaW5hbCByZXByZXNlbnRhdGlvbnMgaGVyZSBhbmQgcmV0
dXJuIGEgbmF0aXZlCi0gICAgLy8gb25lLCBvciByZXNpemUgdGhlIGJlc3Qgb25lIHRvIHRoZSBy
ZXF1ZXN0ZWQgc2l6ZSBhbmQgY2FjaGUgdGhhdCByZXN1bHQuCi0gICAgcmV0dXJuIG1faW1hZ2U7
Ci19CisvLyBMb2FkZWQgaWNvbnMgYXJlIGNsZWFyZWQgYWZ0ZXIgMzAgc2Vjb25kcyBvZiBiZWlu
ZyByZXF1ZXN0ZWQuCitzdGF0aWMgY29uc3QgU2Vjb25kcyBsb2FkZWRJY29uRXhwaXJhdGlvblRp
bWUgeyAzMF9zIH07CiAKLXZvaWQgSWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjpzZXRJbWFnZURh
dGEoUmVmUHRyPFNoYXJlZEJ1ZmZlcj4mJiBkYXRhKQorSWNvbkRhdGFiYXNlOjpJY29uRGF0YWJh
c2UoY29uc3QgU3RyaW5nJiBwYXRoLCBBbGxvd0RhdGFiYXNlV3JpdGUgYWxsb3dEYXRhYmFzZVdy
aXRlKQorICAgIDogbV93b3JrUXVldWUoV29ya1F1ZXVlOjpjcmVhdGUoIm9yZy53ZWJraXQuSWNv
bkRhdGFiYXNlIikpCisgICAgLCBtX2FsbG93RGF0YWJhc2VXcml0ZShhbGxvd0RhdGFiYXNlV3Jp
dGUpCisgICAgLCBtX2NsZWFyTG9hZGVkSWNvbnNUaW1lcihSdW5Mb29wOjptYWluKCksIHRoaXMs
ICZJY29uRGF0YWJhc2U6OmNsZWFyTG9hZGVkSWNvbnNUaW1lckZpcmVkKQogewotICAgIG1fZGF0
YVNldCA9IHRydWU7Ci0gICAgbV9pbWFnZURhdGEgPSBXVEZNb3ZlKGRhdGEpOwotICAgIG1faW1h
Z2UgPSBudWxscHRyOwotCi0gICAgaWYgKCFtX2ltYWdlRGF0YSB8fCAhbV9pbWFnZURhdGEtPnNp
emUoKSkgewotICAgICAgICBtX2ltYWdlRGF0YSA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBhdXRvIGltYWdlID0gQml0bWFwSW1hZ2U6OmNyZWF0ZSgpOwotICAgIGlm
IChpbWFnZS0+c2V0RGF0YShSZWZQdHI8U2hhcmVkQnVmZmVyPiB7IG1faW1hZ2VEYXRhIH0sIHRy
dWUpIDwgRW5jb2RlZERhdGFTdGF0dXM6OlNpemVBdmFpbGFibGUpIHsKLSAgICAgICAgTE9HKElj
b25EYXRhYmFzZSwgIk1hbnVhbCBpbWFnZSBkYXRhIGZvciBpY29uVVJMICclcycgRkFJTEVEIC0g
aXQgd2FzIHByb2JhYmx5IGludmFsaWQgaW1hZ2UgZGF0YSIsIG1faWNvblVSTC5hc2NpaSgpLmRh
dGEoKSk7Ci0gICAgICAgIG1faW1hZ2VEYXRhID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIG1faW1hZ2UgPSBpbWFnZS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUo
KTsKLSAgICBpZiAoIW1faW1hZ2UpIHsKLSAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIk1hbnVh
bCBpbWFnZSBkYXRhIGZvciBpY29uVVJMICclcycgRkFJTEVEIC0gaXQgd2FzIHByb2JhYmx5IGlu
dmFsaWQgaW1hZ2UgZGF0YSIsIG1faWNvblVSTC5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIG1f
aW1hZ2VEYXRhID0gbnVsbHB0cjsKLSAgICB9Ci19CisgICAgbV9jbGVhckxvYWRlZEljb25zVGlt
ZXIuc2V0UHJpb3JpdHkoUnVuTG9vcFNvdXJjZVByaW9yaXR5OjpSZWxlYXNlVW51c2VkUmVzb3Vy
Y2VzVGltZXIpOwogCi1JY29uRGF0YWJhc2U6Okljb25SZWNvcmQ6OkltYWdlRGF0YVN0YXR1cyBJ
Y29uRGF0YWJhc2U6Okljb25SZWNvcmQ6OmltYWdlRGF0YVN0YXR1cygpCi17Ci0gICAgaWYgKCFt
X2RhdGFTZXQpCi0gICAgICAgIHJldHVybiBJbWFnZURhdGFTdGF0dXM6OlVua25vd247Ci0gICAg
aWYgKCFtX2ltYWdlKQotICAgICAgICByZXR1cm4gSW1hZ2VEYXRhU3RhdHVzOjpNaXNzaW5nOwot
ICAgIHJldHVybiBJbWFnZURhdGFTdGF0dXM6OlByZXNlbnQ7Ci19CisgICAgLy8gV2UgaW5pdGlh
bGl6ZSB0aGUgZGF0YWJhc2Ugc3luY2hyb25vdXNseSwgaXQncyBob3BlZnVsbHkgZmFzdCBlbm91
Z2ggYmVjYXVzZSBpdCBtYWtlcworICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBhIGxvdCBzaW1w
bGVyLgorICAgIEJpbmFyeVNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgbV93b3JrUXVldWUtPmRp
c3BhdGNoKFsmXSB7CisgICAgICAgIGlmIChhbGxvd0RhdGFiYXNlV3JpdGUgPT0gQWxsb3dEYXRh
YmFzZVdyaXRlOjpObyAmJiAhRmlsZVN5c3RlbTo6ZmlsZUV4aXN0cyhwYXRoKSkgeworICAgICAg
ICAgICAgc2VtYXBob3JlLnNpZ25hbCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CiAKLUljb25EYXRhYmFzZTo6SWNvblNuYXBzaG90IEljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6
c25hcHNob3QoYm9vbCBmb3JEZWxldGlvbikgY29uc3QKLXsKLSAgICBpZiAoZm9yRGVsZXRpb24p
Ci0gICAgICAgIHJldHVybiBJY29uU25hcHNob3QobV9pY29uVVJMLCAwLCBudWxscHRyKTsKKyAg
ICAgICAgYXV0byBkYXRhYmFzZURpcmVjdG9yeSA9IEZpbGVTeXN0ZW06OmRpcmVjdG9yeU5hbWUo
cGF0aCk7CisgICAgICAgIEZpbGVTeXN0ZW06Om1ha2VBbGxEaXJlY3RvcmllcyhkYXRhYmFzZURp
cmVjdG9yeSk7CisgICAgICAgIGlmICghbV9kYi5vcGVuKHBhdGgpKSB7CisgICAgICAgICAgICBM
T0dfRVJST1IoIlVuYWJsZSB0byBvcGVuIGZhdmljb24gZGF0YWJhc2UgYXQgcGF0aCAlcyAtICVz
IiwgcGF0aC51dGY4KCkuZGF0YSgpLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAg
IHNlbWFwaG9yZS5zaWduYWwoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0g
ICAgcmV0dXJuIEljb25TbmFwc2hvdChtX2ljb25VUkwsIG1fc3RhbXAsIG1faW1hZ2VEYXRhID8g
bV9pbWFnZURhdGEuZ2V0KCkgOiBudWxscHRyKTsKLX0KKyAgICAgICAgYXV0byBkYXRhYmFzZVZl
cnNpb25OdW1iZXIgPSBTUUxpdGVTdGF0ZW1lbnQobV9kYiwgIlNFTEVDVCB2YWx1ZSBGUk9NIElj
b25EYXRhYmFzZUluZm8gV0hFUkUga2V5ID0gJ1ZlcnNpb24nOyIpLmdldENvbHVtbkludCgwKTsK
KyAgICAgICAgaWYgKGRhdGFiYXNlVmVyc2lvbk51bWJlciA+IGN1cnJlbnREYXRhYmFzZVZlcnNp
b24pIHsKKyAgICAgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJEYXRhYmFzZSB2ZXJzaW9uIG51
bWJlciAlZCBpcyBncmVhdGVyIHRoYW4gb3VyIGN1cnJlbnQgdmVyc2lvbiBudW1iZXIgJWQgLSBj
bG9zaW5nIHRoZSBkYXRhYmFzZSB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIG5ld2VyIHZlcnNpb25z
IiwKKyAgICAgICAgICAgICAgICBkYXRhYmFzZVZlcnNpb25OdW1iZXIsIGN1cnJlbnREYXRhYmFz
ZVZlcnNpb24pOworICAgICAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICAgICAgc2VtYXBo
b3JlLnNpZ25hbCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLUljb25EYXRh
YmFzZTo6UGFnZVVSTFJlY29yZDo6UGFnZVVSTFJlY29yZChjb25zdCBTdHJpbmcmIHBhZ2VVUkwp
Ci0gICAgOiBtX3BhZ2VVUkwocGFnZVVSTCkKLXsKLX0KKyAgICAgICAgaWYgKGRhdGFiYXNlVmVy
c2lvbk51bWJlciA8IGN1cnJlbnREYXRhYmFzZVZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmICht
X2FsbG93RGF0YWJhc2VXcml0ZSA9PSBBbGxvd0RhdGFiYXNlV3JpdGU6Ok5vKSB7CisgICAgICAg
ICAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICAgICAgICAgIHNlbWFwaG9yZS5zaWduYWwo
KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKLUljb25EYXRhYmFz
ZTo6UGFnZVVSTFJlY29yZDo6flBhZ2VVUkxSZWNvcmQoKQotewotICAgIGlmIChtX2ljb25SZWNv
cmQpCi0gICAgICAgIG1faWNvblJlY29yZC0+cmV0YWluaW5nUGFnZVVSTHMoKS5yZW1vdmUobV9w
YWdlVVJMKTsKLX0KKyAgICAgICAgICAgIG1fZGIuY2xlYXJBbGxUYWJsZXMoKTsKKyAgICAgICAg
fQogCi12b2lkIEljb25EYXRhYmFzZTo6UGFnZVVSTFJlY29yZDo6c2V0SWNvblJlY29yZChSZWZQ
dHI8SWNvblJlY29yZD4mJiBpY29uKQotewotICAgIGlmIChtX2ljb25SZWNvcmQpCi0gICAgICAg
IG1faWNvblJlY29yZC0+cmV0YWluaW5nUGFnZVVSTHMoKS5yZW1vdmUobV9wYWdlVVJMKTsKKyAg
ICAgICAgLy8gUmVkdWNlIHNxbGl0ZSBSQU0gY2FjaGUgc2l6ZSBmcm9tIGRlZmF1bHQgMjAwMCBw
YWdlcyAofjEuNWtCIHBlciBwYWdlKS4gM01CIG9mIGNhY2hlIGZvciBpY29uIGRhdGFiYXNlIGlz
IG92ZXJraWxsLgorICAgICAgICBTUUxpdGVTdGF0ZW1lbnQobV9kYiwgIlBSQUdNQSBjYWNoZV9z
aXplID0gMjAwOyIpLmV4ZWN1dGVDb21tYW5kKCk7CiAKLSAgICBtX2ljb25SZWNvcmQgPSBXVEZN
b3ZlKGljb24pOworICAgICAgICBpZiAoYWxsb3dEYXRhYmFzZVdyaXRlID09IEFsbG93RGF0YWJh
c2VXcml0ZTo6WWVzKSB7CisgICAgICAgICAgICBtX3BydW5lVGltZXIgPSBtYWtlVW5pcXVlPFJ1
bkxvb3A6OlRpbWVyPEljb25EYXRhYmFzZT4+KFJ1bkxvb3A6OmN1cnJlbnQoKSwgdGhpcywgJklj
b25EYXRhYmFzZTo6cHJ1bmVUaW1lckZpcmVkKTsKKyAgICAgICAgICAgIG1fcHJ1bmVUaW1lci0+
c2V0UHJpb3JpdHkoUnVuTG9vcFNvdXJjZVByaW9yaXR5OjpSZWxlYXNlVW51c2VkUmVzb3VyY2Vz
VGltZXIpOworICAgICAgICB9CiAKLSAgICBpZiAobV9pY29uUmVjb3JkKQotICAgICAgICBtX2lj
b25SZWNvcmQtPnJldGFpbmluZ1BhZ2VVUkxzKCkuYWRkKG1fcGFnZVVSTCk7Ci19CisgICAgICAg
IGlmICghY3JlYXRlVGFibGVzSWZOZWVkZWQoKSkKKyAgICAgICAgICAgIHBvcHVsYXRlUGFnZVVS
TFRvSWNvblVSTE1hcCgpOwogCi1JY29uRGF0YWJhc2U6OlBhZ2VVUkxTbmFwc2hvdCBJY29uRGF0
YWJhc2U6OlBhZ2VVUkxSZWNvcmQ6OnNuYXBzaG90KGJvb2wgZm9yRGVsZXRpb24pIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIHsgbV9wYWdlVVJMLCAobV9pY29uUmVjb3JkICYmICFmb3JEZWxldGlvbikg
PyBtX2ljb25SZWNvcmQtPmljb25VUkwoKSA6IFN0cmluZygpIH07CisgICAgICAgIHNlbWFwaG9y
ZS5zaWduYWwoKTsKKyAgICB9KTsKKyAgICBzZW1hcGhvcmUud2FpdCgpOwogfQogCi0vLyAqKioq
KioqKioqKioqKioqKioqKioqKioKLS8vICoqKiBNYWluIFRocmVhZCBPbmx5ICoqKgotLy8gKioq
KioqKioqKioqKioqKioqKioqKioqCi0KLXZvaWQgSWNvbkRhdGFiYXNlOjpzZXRDbGllbnQoc3Rk
Ojp1bmlxdWVfcHRyPEljb25EYXRhYmFzZUNsaWVudD4mJiBjbGllbnQpCitJY29uRGF0YWJhc2U6
On5JY29uRGF0YWJhc2UoKQogewotICAgIC8vIERvbid0IGFsbG93IGEgY2xpZW50IGNoYW5nZSBh
ZnRlciB0aGUgdGhyZWFkIGhhcyBhbHJlYWR5IGJlZ2FuCi0gICAgLy8gKHNldHRpbmcgdGhlIGNs
aWVudCBzaG91bGQgb2NjdXIgYmVmb3JlIHRoZSBkYXRhYmFzZSBpcyBvcGVuZWQpCi0gICAgQVNT
RVJUKCFtX3N5bmNUaHJlYWRSdW5uaW5nKTsKLSAgICBpZiAoIWNsaWVudCB8fCBtX3N5bmNUaHJl
YWRSdW5uaW5nKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2NsaWVudCA9IFdURk1vdmUoY2xp
ZW50KTsKKyAgICBCaW5hcnlTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIG1fd29ya1F1ZXVlLT5k
aXNwYXRjaChbJl0geworICAgICAgICBpZiAobV9kYi5pc09wZW4oKSkgeworICAgICAgICAgICAg
bV9wcnVuZVRpbWVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNsZWFyU3RhdGVtZW50cygpOwor
ICAgICAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIHNlbWFwaG9yZS5z
aWduYWwoKTsKKyAgICB9KTsKKyAgICBzZW1hcGhvcmUud2FpdCgpOwogfQogCi1ib29sIEljb25E
YXRhYmFzZTo6b3Blbihjb25zdCBTdHJpbmcmIGRpcmVjdG9yeSwgY29uc3QgU3RyaW5nJiBmaWxl
bmFtZSkKK2Jvb2wgSWNvbkRhdGFiYXNlOjpjcmVhdGVUYWJsZXNJZk5lZWRlZCgpCiB7Ci0gICAg
QVNTRVJUX05PVF9TWU5DX1RIUkVBRCgpOwotCi0gICAgaWYgKCFtX2lzRW5hYmxlZCkKKyAgICBp
ZiAobV9kYi50YWJsZUV4aXN0cygiSWNvbkluZm8iKSAmJiBtX2RiLnRhYmxlRXhpc3RzKCJJY29u
RGF0YSIpICYmIG1fZGIudGFibGVFeGlzdHMoIlBhZ2VVUkwiKSAmJiBtX2RiLnRhYmxlRXhpc3Rz
KCJJY29uRGF0YWJhc2VJbmZvIikpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIGlmIChp
c09wZW4oKSkgewotICAgICAgICBMT0dfRVJST1IoIkF0dGVtcHQgdG8gcmVvcGVuIHRoZSBJY29u
RGF0YWJhc2Ugd2hpY2ggaXMgYWxyZWFkeSBvcGVuLiBNdXN0IGNsb3NlIGl0IGZpcnN0LiIpOwor
ICAgIGlmIChtX2FsbG93RGF0YWJhc2VXcml0ZSA9PSBBbGxvd0RhdGFiYXNlV3JpdGU6Ok5vKSB7
CisgICAgICAgIG1fZGIuY2xvc2UoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAot
ICAgIG1fbWFpblRocmVhZE5vdGlmaWVyLnNldEFjdGl2ZSh0cnVlKTsKLQotICAgIG1fZGF0YWJh
c2VEaXJlY3RvcnkgPSBkaXJlY3RvcnkuaXNvbGF0ZWRDb3B5KCk7Ci0KLSAgICAvLyBGb3JtdWxh
dGUgdGhlIGZ1bGwgcGF0aCBmb3IgdGhlIGRhdGFiYXNlIGZpbGUKLSAgICBtX2NvbXBsZXRlRGF0
YWJhc2VQYXRoID0gRmlsZVN5c3RlbTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KG1fZGF0YWJh
c2VEaXJlY3RvcnksIGZpbGVuYW1lKTsKLQotICAgIC8vIExvY2sgaGVyZSBhcyB3ZWxsIGFzIGZp
cnN0IHRoaW5nIGluIHRoZSB0aHJlYWQgc28gdGhlIHRocmVhZCBkb2Vzbid0IGFjdHVhbGx5IGNv
bW1lbmNlIHVudGlsIHRoZSBjcmVhdGVUaHJlYWQoKSBjYWxsCi0gICAgLy8gY29tcGxldGVzIGFu
ZCBtX3N5bmNUaHJlYWRSdW5uaW5nIGlzIHByb3Blcmx5IHNldAotICAgIG1fc3luY0xvY2subG9j
aygpOwotICAgIG1fc3luY1RocmVhZCA9IFRocmVhZDo6Y3JlYXRlKCJXZWJDb3JlOiBJY29uRGF0
YWJhc2UiLCBbdGhpc10gewotICAgICAgICBpY29uRGF0YWJhc2VTeW5jVGhyZWFkKCk7Ci0gICAg
fSk7Ci0gICAgbV9zeW5jVGhyZWFkUnVubmluZyA9IHRydWU7Ci0gICAgbV9zeW5jTG9jay51bmxv
Y2soKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBJY29uRGF0YWJhc2U6OmNsb3NlKCkK
LXsKLSAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICBtX21haW5UaHJlYWROb3Rp
Zmllci5zdG9wKCk7Ci0KLSAgICBpZiAobV9zeW5jVGhyZWFkUnVubmluZykgewotICAgICAgICAv
LyBTZXQgdGhlIGZsYWcgdG8gdGVsbCB0aGUgc3luYyB0aHJlYWQgdG8gd3JhcCBpdCB1cAotICAg
ICAgICBtX3RocmVhZFRlcm1pbmF0aW9uUmVxdWVzdGVkID0gdHJ1ZTsKKyAgICBtX2RiLmNsZWFy
QWxsVGFibGVzKCk7CiAKLSAgICAgICAgLy8gV2FrZSB1cCB0aGUgc3luYyB0aHJlYWQgaWYgaXQn
cyB3YWl0aW5nCi0gICAgICAgIHdha2VTeW5jVGhyZWFkKCk7Ci0KLSAgICAgICAgLy8gV2FpdCBm
b3IgdGhlIHN5bmMgdGhyZWFkIHRvIHRlcm1pbmF0ZQotICAgICAgICBtX3N5bmNUaHJlYWQtPndh
aXRGb3JDb21wbGV0aW9uKCk7CisgICAgaWYgKCFtX2RiLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUg
VEFCTEUgUGFnZVVSTCAodXJsIFRFWFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCBVTklRVUUg
T04gQ09ORkxJQ1QgUkVQTEFDRSxpY29uSUQgSU5URUdFUiBOT1QgTlVMTCBPTiBDT05GTElDVCBG
QUlMKTsiKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgUGFnZVVSTCB0
YWJsZSBpbiBkYXRhYmFzZSAoJWkpIC0gJXMiLCBtX2RiLmxhc3RFcnJvcigpLCBtX2RiLmxhc3RF
cnJvck1zZygpKTsKKyAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIElOREVYIFBhZ2VV
UkxJbmRleCBPTiBQYWdlVVJMICh1cmwpOyIpKSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQg
bm90IGNyZWF0ZSBQYWdlVVJMIGluZGV4IGluIGRhdGFiYXNlICglaSkgLSAlcyIsIG1fZGIubGFz
dEVycm9yKCksIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICBtX2RiLmNsb3NlKCk7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFtX2RiLmV4ZWN1dGVDb21tYW5k
KCJDUkVBVEUgVEFCTEUgSWNvbkluZm8gKGljb25JRCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9J
TkNSRU1FTlQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIHVybCBURVhUIE5PVCBOVUxMIE9O
IENPTkZMSUNUIEZBSUwgVU5JUVVFIE9OIENPTkZMSUNUIEZBSUwsIHN0YW1wIElOVEVHRVIpOyIp
KSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IGNyZWF0ZSBJY29uSW5mbyB0YWJsZSBp
biBkYXRhYmFzZSAoJWkpIC0gJXMiLCBtX2RiLmxhc3RFcnJvcigpLCBtX2RiLmxhc3RFcnJvck1z
ZygpKTsKKyAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIElOREVYIEljb25JbmZvSW5k
ZXggT04gSWNvbkluZm8gKHVybCwgaWNvbklEKTsiKSkgeworICAgICAgICBMT0dfRVJST1IoIkNv
dWxkIG5vdCBjcmVhdGUgUGFnZVVSTCBpbmRleCBpbiBkYXRhYmFzZSAoJWkpIC0gJXMiLCBtX2Ri
Lmxhc3RFcnJvcigpLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgbV9kYi5jbG9zZSgp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghbV9kYi5leGVjdXRlQ29t
bWFuZCgiQ1JFQVRFIFRBQkxFIEljb25EYXRhIChpY29uSUQgSU5URUdFUiBQUklNQVJZIEtFWSBB
VVRPSU5DUkVNRU5UIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLCBkYXRhIEJMT0IpOyIpKSB7
CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IGNyZWF0ZSBJY29uRGF0YSB0YWJsZSBpbiBk
YXRhYmFzZSAoJWkpIC0gJXMiLCBtX2RiLmxhc3RFcnJvcigpLCBtX2RiLmxhc3RFcnJvck1zZygp
KTsKKyAgICAgICAgbV9kYi5jbG9zZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
ICAgIGlmICghbV9kYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIElOREVYIEljb25EYXRhSW5kZXgg
T04gSWNvbkRhdGEgKGljb25JRCk7IikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3Qg
Y3JlYXRlIFBhZ2VVUkwgaW5kZXggaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgbV9kYi5sYXN0RXJy
b3IoKSwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIG1fZGIuY2xvc2UoKTsKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQoIkNS
RUFURSBUQUJMRSBJY29uRGF0YWJhc2VJbmZvIChrZXkgVEVYVCBOT1QgTlVMTCBPTiBDT05GTElD
VCBGQUlMIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLHZhbHVlIFRFWFQgTk9UIE5VTEwgT04g
Q09ORkxJQ1QgRkFJTCk7IikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRl
IEljb25EYXRhYmFzZUluZm8gdGFibGUgaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgbV9kYi5sYXN0
RXJyb3IoKSwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIG1fZGIuY2xvc2UoKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQo
U3RyaW5nKCJJTlNFUlQgSU5UTyBJY29uRGF0YWJhc2VJbmZvIFZBTFVFUyAoJ1ZlcnNpb24nLCAi
KSArIFN0cmluZzo6bnVtYmVyKGN1cnJlbnREYXRhYmFzZVZlcnNpb24pICsgIik7IikpIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgaW5zZXJ0IGljb24gZGF0YWJhc2UgdmVyc2lvbiBp
bnRvIEljb25EYXRhYmFzZUluZm8gdGFibGUgKCVpKSAtICVzIiwgbV9kYi5sYXN0RXJyb3IoKSwg
bV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIG1fZGIuY2xvc2UoKTsKKyAgICAgICAgcmV0
dXJuIGZhbHNlOwogICAgIH0KIAotICAgIG1fc3luY1RocmVhZFJ1bm5pbmcgPSBmYWxzZTsKLSAg
ICBtX3RocmVhZFRlcm1pbmF0aW9uUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgbV9yZW1vdmVJY29u
c1JlcXVlc3RlZCA9IGZhbHNlOwotCi0gICAgbV9zeW5jREIuY2xvc2UoKTsKLQotICAgIG1fY2xp
ZW50ID0gbnVsbHB0cjsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBJY29uRGF0YWJhc2U6
OnJlbW92ZUFsbEljb25zKCkKK3ZvaWQgSWNvbkRhdGFiYXNlOjpwb3B1bGF0ZVBhZ2VVUkxUb0lj
b25VUkxNYXAoKQogewotICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKLQotICAgIGlmICgh
aXNPcGVuKCkpCisgICAgaWYgKCFtX2RiLmlzT3BlbigpKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBMT0coSWNvbkRhdGFiYXNlLCAiUmVxdWVzdGluZyBiYWNrZ3JvdW5kIHRocmVhZCB0byByZW1v
dmUgYWxsIGljb25zIik7Ci0KLSAgICAvLyBDbGVhciB0aGUgaW4tbWVtb3J5IHJlY29yZCBvZiBl
dmVyeSBJY29uUmVjb3JkLCBhbnl0aGluZyB3YWl0aW5nIHRvIGJlIHJlYWQgZnJvbSBkaXNrLCBh
bmQgYW55dGhpbmcgd2FpdGluZyB0byBiZSB3cml0dGVuIHRvIGRpc2sKLSAgICB7Ci0gICAgICAg
IExvY2tIb2xkZXIgbG9ja2VyKG1fdXJsQW5kSWNvbkxvY2spOwotCi0gICAgICAgIC8vIENsZWFy
IHRoZSBJY29uUmVjb3JkcyBmb3IgZXZlcnkgcGFnZSBVUkwgLSBSZWZDb3VudGluZyB3aWxsIGNh
dXNlIHRoZSBJY29uUmVjb3JkcyB0aGVtc2VsdmVzIHRvIGJlIGRlbGV0ZWQKLSAgICAgICAgLy8g
V2UgZG9uJ3QgZGVsZXRlIHRoZSBhY3R1YWwgUGFnZVJlY29yZHMgYmVjYXVzZSB3ZSBoYXZlIHRo
ZSAicmV0YWluIGljb24gZm9yIHVybCIgY291bnQgdG8ga2VlcCB0cmFjayBvZgotICAgICAgICBm
b3IgKGF1dG8mIHBhZ2VVUkwgOiBtX3BhZ2VVUkxUb1JlY29yZE1hcC52YWx1ZXMoKSkKLSAgICAg
ICAgICAgIHBhZ2VVUkwtPnNldEljb25SZWNvcmQobnVsbHB0cik7Ci0KLSAgICAgICAgLy8gQ2xl
YXIgdGhlIGljb25VUkwgLT4gSWNvblJlY29yZCBtYXAKLSAgICAgICAgbV9pY29uVVJMVG9SZWNv
cmRNYXAuY2xlYXIoKTsKLQotICAgICAgICAvLyBDbGVhciBhbGwgaW4tbWVtb3J5IHJlY29yZHMg
b2YgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBzeW5jZWQgb3V0IHRvIGRpc2sKLSAgICAgICAgewot
ICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nU3luY0xvY2spOwotICAgICAg
ICAgICAgbV9wYWdlVVJMc1BlbmRpbmdTeW5jLmNsZWFyKCk7Ci0gICAgICAgICAgICBtX2ljb25z
UGVuZGluZ1N5bmMuY2xlYXIoKTsKLSAgICAgICAgfQorICAgIFN0cmluZyBpbXBvcnRRdWVyeSA9
IG1ha2VTdHJpbmcoIlNFTEVDVCBQYWdlVVJMLnVybCwgSWNvbkluZm8udXJsLCBJY29uSW5mby5z
dGFtcCBGUk9NIFBhZ2VVUkwgSU5ORVIgSk9JTiBJY29uSW5mbyBPTiBQYWdlVVJMLmljb25JRD1J
Y29uSW5mby5pY29uSUQgV0hFUkUgSWNvbkluZm8uc3RhbXAgPiAiLCBmbG9vcigoV2FsbFRpbWU6
Om5vdygpIC0gbm90VXNlZEljb25FeHBpcmF0aW9uVGltZSkuc2Vjb25kc1NpbmNlRXBvY2goKS5z
ZWNvbmRzKCkpLCAnOycpOworICAgIFNRTGl0ZVN0YXRlbWVudCBxdWVyeShtX2RiLCBpbXBvcnRR
dWVyeSk7CisgICAgaWYgKHF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJVbmFibGUgdG8gcHJlcGFyZSBpY29uIHVybCBpbXBvcnQgcXVlcnkiKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICAvLyBDbGVhciBhbGwgaW4tbWVtb3J5IHJl
Y29yZHMgb2YgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSByZWFkIGluIGZyb20gZGlzawotICAgICAg
ICB7Ci0gICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7
Ci0gICAgICAgICAgICBtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydC5jbGVhcigpOwotICAgICAgICAg
ICAgbV9wYWdlVVJMc0ludGVyZXN0ZWRJbkljb25zLmNsZWFyKCk7Ci0gICAgICAgICAgICBtX2lj
b25zUGVuZGluZ1JlYWRpbmcuY2xlYXIoKTsKLSAgICAgICAgfQorICAgIGF1dG8gcmVzdWx0ID0g
cXVlcnkuc3RlcCgpOworICAgIHdoaWxlIChyZXN1bHQgPT0gU1FMSVRFX1JPVykgeworICAgICAg
ICBtX3BhZ2VVUkxUb0ljb25VUkxNYXAuc2V0KHF1ZXJ5LmdldENvbHVtblRleHQoMCksIHF1ZXJ5
LmdldENvbHVtblRleHQoMSkpOworICAgICAgICByZXN1bHQgPSBxdWVyeS5zdGVwKCk7CiAgICAg
fQogCi0gICAgbV9yZW1vdmVJY29uc1JlcXVlc3RlZCA9IHRydWU7Ci0gICAgd2FrZVN5bmNUaHJl
YWQoKTsKKyAgICBzdGFydFBydW5lVGltZXIoKTsKIH0KIAotc3RhdGljIGJvb2wgZG9jdW1lbnRD
YW5IYXZlSWNvbihjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMKQordm9pZCBJY29uRGF0YWJhc2U6
OmNsZWFyU3RhdGVtZW50cygpCiB7Ci0gICAgcmV0dXJuICFkb2N1bWVudFVSTC5pc0VtcHR5KCkg
JiYgIXByb3RvY29sSXMoZG9jdW1lbnRVUkwsICJhYm91dCIpOworICAgIFJFTEVBU0VfQVNTRVJU
KG1fZGIuaXNPcGVuKCkpOworCisgICAgbV9pY29uSURGb3JJY29uVVJMU3RhdGVtZW50ID0gbnVs
bHB0cjsKKyAgICBtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQgPSBudWxscHRyOworICAg
IG1faWNvbkRhdGFTdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fYWRkSWNvblN0YXRlbWVudCA9
IG51bGxwdHI7CisgICAgbV9hZGRJY29uRGF0YVN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgbV91
cGRhdGVJY29uVGltZXN0YW1wU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICBtX2RlbGV0ZVBhZ2VV
UkxzRm9ySWNvblN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgbV9kZWxldGVJY29uRGF0YVN0YXRl
bWVudCA9IG51bGxwdHI7CisgICAgbV9kZWxldGVJY29uU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAg
ICBtX3BydW5lSWNvbnNTdGF0ZW1lbnQgPSBudWxscHRyOwogfQogCi1zdGQ6OnBhaXI8TmF0aXZl
SW1hZ2VQdHIsIEljb25EYXRhYmFzZTo6SXNLbm93bkljb24+IEljb25EYXRhYmFzZTo6c3luY2hy
b25vdXNJY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VVUkxPcmlnaW5hbCwgY29uc3Qg
SW50U2l6ZSYgc2l6ZSkKK3ZvaWQgSWNvbkRhdGFiYXNlOjpwcnVuZVRpbWVyRmlyZWQoKQogewot
ICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKLQotICAgIC8vIHBhZ2VVUkxPcmlnaW5hbCBj
YW5ub3QgYmUgc3RvcmVkIHdpdGhvdXQgYmVpbmcgZGVlcCBjb3BpZWQgZmlyc3QuCi0gICAgLy8g
V2Ugc2hvdWxkIGdvIG91ciBvZiBvdXIgd2F5IHRvIG9ubHkgY29weSBpdCBpZiB3ZSBoYXZlIHRv
IHN0b3JlIGl0CisgICAgUkVMRUFTRV9BU1NFUlQobV9kYi5pc09wZW4oKSk7CiAKLSAgICBpZiAo
IWlzT3BlbigpIHx8ICFkb2N1bWVudENhbkhhdmVJY29uKHBhZ2VVUkxPcmlnaW5hbCkpCi0gICAg
ICAgIHJldHVybiB7IG51bGxwdHIsIElzS25vd25JY29uOjpObyB9OwotCi0gICAgTG9ja0hvbGRl
ciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7Ci0KLSAgICBwZXJmb3JtUGVuZGluZ1JldGFpbkFu
ZFJlbGVhc2VPcGVyYXRpb25zKCk7Ci0KLSAgICBTdHJpbmcgcGFnZVVSTENvcHk7IC8vIENyZWF0
ZXMgYSBudWxsIHN0cmluZyBmb3IgZWFzeSB0ZXN0aW5nCi0KLSAgICBQYWdlVVJMUmVjb3JkKiBw
YWdlUmVjb3JkID0gbV9wYWdlVVJMVG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkxPcmlnaW5hbCk7Ci0g
ICAgaWYgKCFwYWdlUmVjb3JkKSB7Ci0gICAgICAgIHBhZ2VVUkxDb3B5ID0gcGFnZVVSTE9yaWdp
bmFsLmlzb2xhdGVkQ29weSgpOwotICAgICAgICBwYWdlUmVjb3JkID0gZ2V0T3JDcmVhdGVQYWdl
VVJMUmVjb3JkKHBhZ2VVUkxDb3B5KTsKKyAgICBpZiAoIW1fcHJ1bmVJY29uc1N0YXRlbWVudCkg
eworICAgICAgICBtX3BydW5lSWNvbnNTdGF0ZW1lbnQgPSBtYWtlVW5pcXVlPFNRTGl0ZVN0YXRl
bWVudD4obV9kYiwgIkRFTEVURSBGUk9NIEljb25JbmZvIFdIRVJFIHN0YW1wIDw9ICg/KTsiKTsK
KyAgICAgICAgaWYgKG1fcHJ1bmVJY29uc1N0YXRlbWVudC0+cHJlcGFyZSgpICE9IFNRTElURV9P
SykgeworICAgICAgICAgICAgTE9HX0VSUk9SKCJQcmVwYXJpbmcgc3RhdGVtZW50IHBydW5lSWNv
bnMgZmFpbGVkIik7CisgICAgICAgICAgICBtX3BydW5lSWNvbnNTdGF0ZW1lbnQgPSBudWxscHRy
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gSWYgcGFn
ZVJlY29yZCBpcyBudWxscHRyLCBvbmUgb2YgdHdvIHRoaW5ncyBpcyB0cnVlIC0KLSAgICAvLyAx
IC0gVGhlIGluaXRpYWwgdXJsIGltcG9ydCBpcyBpbmNvbXBsZXRlIGFuZCB0aGlzIHBhZ2VVUkwg
d2FzIG1hcmtlZCB0byBiZSBub3RpZmllZCBvbmNlIGl0IGlzIGNvbXBsZXRlIGlmIGFuIGljb25V
UkwgZXhpc3RzCi0gICAgLy8gMiAtIFRoZSBpbml0aWFsIHVybCBpbXBvcnQgSVMgY29tcGxldGUg
YW5kIHRoaXMgcGFnZVVSTCBoYXMgbm8gaWNvbgotICAgIGlmICghcGFnZVJlY29yZCkgewotICAg
ICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7Ci0KLSAgICAgICAg
Ly8gSW1wb3J0IGlzIG9uZ29pbmcsIHRoZXJlIG1pZ2h0IGJlIGFuIGljb24uIEluIHRoaXMgY2Fz
ZSwgcmVnaXN0ZXIgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgaWNvbiBjb21lcyBpbgotICAgICAg
ICAvLyBJZiB3ZSBldmVyIHJlYWNoIHRoaXMgY29uZGl0aW9uLCB3ZSBrbm93IHdlJ3ZlIGFscmVh
ZHkgbWFkZSB0aGUgcGFnZVVSTCBjb3B5Ci0gICAgICAgIGlmICghbV9pY29uVVJMSW1wb3J0Q29t
cGxldGUpCi0gICAgICAgICAgICBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMuYWRkKHBhZ2VV
UkxDb3B5KTsKLQotICAgICAgICByZXR1cm4geyBudWxscHRyLCBJc0tub3duSWNvbjo6Tm8gfTsK
KyAgICBpZiAobV9wcnVuZUljb25zU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgZmxvb3IoKFdhbGxU
aW1lOjpub3coKSAtIG5vdFVzZWRJY29uRXhwaXJhdGlvblRpbWUpLnNlY29uZHNTaW5jZUVwb2No
KCkuc2Vjb25kcygpKSkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiRmF2aWNv
bkRhdGFic2U6OnBydW5lVGltZXJGaXJlZCBmYWlsZWQ6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2co
KSk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBJY29uUmVjb3JkKiBpY29uUmVjb3Jk
ID0gcGFnZVJlY29yZC0+aWNvblJlY29yZCgpOwotCi0gICAgLy8gSWYgdGhlIGluaXRpYWwgVVJM
IGltcG9ydCBpc24ndCBjb21wbGV0ZSwgaXQncyBwb3NzaWJsZSB0byBoYXZlIGEgUGFnZVVSTCBy
ZWNvcmQgd2l0aG91dCBhbiBhc3NvY2lhdGVkIGljb24KLSAgICAvLyBJbiB0aGlzIGNhc2UsIHRo
ZSBwYWdlVVJMIGlzIGFscmVhZHkgaW4gdGhlIHNldCB0byBhbGVydCB0aGUgY2xpZW50IHdoZW4g
dGhlIGljb25VUkwgbWFwcGluZyBpcyBjb21wbGV0ZSBzbwotICAgIC8vIHdlIGNhbiBqdXN0IGJh
aWwgbm93Ci0gICAgaWYgKCFtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSAmJiAhaWNvblJlY29yZCkK
LSAgICAgICAgcmV0dXJuIHsgbnVsbHB0ciwgSXNLbm93bkljb246Ok5vIH07Ci0KLSAgICAvLyBB
c3N1bWluZyB3ZSdyZSBkb25lIGluaXRpYWxpemluZyBhbmQgY2xlYW51cCBpcyBhbGxvd2VkLAot
ICAgIC8vIHRoZSBvbmx5IHdheSB3ZSBzaG91bGQgKm5vdCogaGF2ZSBhbiBpY29uIHJlY29yZCBp
cyBpZiB0aGlzIHBhZ2VVUkwgaXMgcmV0YWluZWQgYnV0IGhhcyBubyBpY29uIHlldC4KLSAgICBB
U1NFUlQoaWNvblJlY29yZCB8fCBkYXRhYmFzZUNsZWFudXBDb3VudGVyIHx8IG1fcmV0YWluZWRQ
YWdlVVJMcy5jb250YWlucyhwYWdlVVJMT3JpZ2luYWwpKTsKLQotICAgIGlmICghaWNvblJlY29y
ZCkKLSAgICAgICAgcmV0dXJuIHsgbnVsbHB0ciwgSXNLbm93bkljb246Ok5vIH07Ci0KLSAgICAv
LyBJZiBpdCdzIGEgbmV3IEljb25SZWNvcmQgb2JqZWN0IHRoYXQgZG9lc24ndCBoYXZlIGl0cyBp
bWFnZURhdGEgc2V0IHlldCwKLSAgICAvLyBtYXJrIGl0IHRvIGJlIHJlYWQgYnkgdGhlIGJhY2tn
cm91bmQgdGhyZWFkCi0gICAgaWYgKGljb25SZWNvcmQtPmltYWdlRGF0YVN0YXR1cygpID09IElj
b25SZWNvcmQ6OkltYWdlRGF0YVN0YXR1czo6VW5rbm93bikgewotICAgICAgICBpZiAocGFnZVVS
TENvcHkuaXNOdWxsKCkpCi0gICAgICAgICAgICBwYWdlVVJMQ29weSA9IHBhZ2VVUkxPcmlnaW5h
bC5pc29sYXRlZENvcHkoKTsKLQotICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdS
ZWFkaW5nTG9jayk7Ci0gICAgICAgIG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29ucy5hZGQocGFn
ZVVSTENvcHkpOwotICAgICAgICBtX2ljb25zUGVuZGluZ1JlYWRpbmcuYWRkKGljb25SZWNvcmQp
OwotICAgICAgICB3YWtlU3luY1RocmVhZCgpOwotICAgICAgICByZXR1cm4geyBudWxscHRyLCBJ
c0tub3duSWNvbjo6Tm8gfTsKKyAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbihtX2Ri
KTsKKyAgICB0cmFuc2FjdGlvbi5iZWdpbigpOworICAgIGlmIChtX3BydW5lSWNvbnNTdGF0ZW1l
bnQtPnN0ZXAoKSA9PSBTUUxJVEVfRE9ORSkgeworICAgICAgICBtX2RiLmV4ZWN1dGVDb21tYW5k
KCJERUxFVEUgRlJPTSBJY29uRGF0YSBXSEVSRSBpY29uSUQgTk9UIElOIChTRUxFQ1QgaWNvbklE
IEZST00gSWNvbkluZm8pOyIpOworICAgICAgICBtX2RiLmV4ZWN1dGVDb21tYW5kKCJERUxFVEUg
RlJPTSBQYWdlVVJMIFdIRVJFIGljb25JRCBOT1QgSU4gKFNFTEVDVCBpY29uSUQgRlJPTSBJY29u
SW5mbyk7Iik7CiAgICAgfQorICAgIG1fcHJ1bmVJY29uc1N0YXRlbWVudC0+cmVzZXQoKTsKIAot
ICAgIC8vIElmIHRoZSBzaXplIHBhcmFtZXRlciB3YXMgKDAsIDApIHRoYXQgbWVhbnMgdGhlIGNh
bGxlciBvZiB0aGlzIG1ldGhvZCBqdXN0IHdhbnRlZCB0aGUgcmVhZCBmcm9tIGRpc2sgdG8gYmUg
a2lja2VkIG9mZgotICAgIC8vIGFuZCBpc24ndCBhY3R1YWxseSBpbnRlcmVzdGVkIGluIHRoZSBp
bWFnZSByZXR1cm4gdmFsdWUKLSAgICBpZiAoc2l6ZSA9PSBJbnRTaXplKDAsIDApKQotICAgICAg
ICByZXR1cm4geyBudWxscHRyLCBJc0tub3duSWNvbjo6WWVzIH07Ci0KLSAgICByZXR1cm4geyBp
Y29uUmVjb3JkLT5pbWFnZShzaXplKSwgSXNLbm93bkljb246OlllcyB9OwotfQotCi1TdHJpbmcg
SWNvbkRhdGFiYXNlOjpzeW5jaHJvbm91c0ljb25VUkxGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYg
cGFnZVVSTE9yaWdpbmFsKQotewotICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKLQotICAg
IC8vIENhbm5vdCBkbyBhbnl0aGluZyB3aXRoIHBhZ2VVUkxPcmlnaW5hbCB0aGF0IHdvdWxkIGVu
ZCB1cCBzdG9yaW5nIGl0IHdpdGhvdXQgZGVlcCBjb3B5aW5nIGZpcnN0Ci0gICAgLy8gQWxzbywg
aW4gdGhlIGNhc2Ugd2UgaGF2ZSBhIHJlYWwgYW5zd2VyIGZvciB0aGUgY2FsbGVyLCB3ZSBtdXN0
IGRlZXAgY29weSB0aGF0IGFzIHdlbGwKLQotICAgIGlmICghaXNPcGVuKCkgfHwgIWRvY3VtZW50
Q2FuSGF2ZUljb24ocGFnZVVSTE9yaWdpbmFsKSkKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwot
Ci0gICAgTG9ja0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7Ci0KLSAgICBQYWdlVVJM
UmVjb3JkKiBwYWdlUmVjb3JkID0gbV9wYWdlVVJMVG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkxPcmln
aW5hbCk7Ci0gICAgaWYgKCFwYWdlUmVjb3JkKQotICAgICAgICBwYWdlUmVjb3JkID0gZ2V0T3JD
cmVhdGVQYWdlVVJMUmVjb3JkKHBhZ2VVUkxPcmlnaW5hbC5pc29sYXRlZENvcHkoKSk7Ci0KLSAg
ICAvLyBJZiBwYWdlUmVjb3JkIGlzIG51bGxwdHIsIG9uZSBvZiB0d28gdGhpbmdzIGlzIHRydWUg
LQotICAgIC8vIDEgLSBUaGUgaW5pdGlhbCB1cmwgaW1wb3J0IGlzIGluY29tcGxldGUgYW5kIHRo
aXMgcGFnZVVSTCBoYXMgYWxyZWFkeSBiZWVuIG1hcmtlZCB0byBiZSBub3RpZmllZCBvbmNlIGl0
IGlzIGNvbXBsZXRlIGlmIGFuIGljb25VUkwgZXhpc3RzCi0gICAgLy8gMiAtIFRoZSBpbml0aWFs
IHVybCBpbXBvcnQgSVMgY29tcGxldGUgYW5kIHRoaXMgcGFnZVVSTCBoYXMgbm8gaWNvbgotICAg
IGlmICghcGFnZVJlY29yZCkKLSAgICAgICAgcmV0dXJuIFN0cmluZygpOwotCi0gICAgLy8gUG9z
c2libGUgdGhlIHBhZ2VSZWNvcmQgaXMgYXJvdW5kIGJlY2F1c2UgaXQncyBhIHJldGFpbmVkIHBh
Z2VVUkwgd2l0aCBubyBpY29uVVJMLCBzbyB3ZSBoYXZlIHRvIGNoZWNrCi0gICAgcmV0dXJuIHBh
Z2VSZWNvcmQtPmljb25SZWNvcmQoKSA/IHBhZ2VSZWNvcmQtPmljb25SZWNvcmQoKS0+aWNvblVS
TCgpLmlzb2xhdGVkQ29weSgpIDogU3RyaW5nKCk7CisgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7
CiB9CiAKLXZvaWQgSWNvbkRhdGFiYXNlOjpyZXRhaW5JY29uRm9yUGFnZVVSTChjb25zdCBTdHJp
bmcmIHBhZ2VVUkwpCit2b2lkIEljb25EYXRhYmFzZTo6c3RhcnRQcnVuZVRpbWVyKCkKIHsKLSAg
ICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICBpZiAoIWlzRW5hYmxlZCgpIHx8ICFk
b2N1bWVudENhbkhhdmVJY29uKHBhZ2VVUkwpKQorICAgIGlmICghbV9wcnVuZVRpbWVyIHx8ICFt
X2RiLmlzT3BlbigpKQogICAgICAgICByZXR1cm47CiAKLSAgICB7Ci0gICAgICAgIExvY2tIb2xk
ZXIgbG9ja2VyKG1fdXJsc1RvUmV0YWluT3JSZWxlYXNlTG9jayk7Ci0gICAgICAgIG1fdXJsc1Rv
UmV0YWluLmFkZChwYWdlVVJMLmlzb2xhdGVkQ29weSgpKTsKLSAgICAgICAgbV9yZXRhaW5PclJl
bGVhc2VJY29uUmVxdWVzdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzY2hlZHVsZU9yRGVmZXJT
eW5jVGltZXIoKTsKKyAgICBpZiAobV9wcnVuZVRpbWVyLT5pc0FjdGl2ZSgpKQorICAgICAgICBt
X3BydW5lVGltZXItPnN0b3AoKTsKKyAgICBtX3BydW5lVGltZXItPnN0YXJ0T25lU2hvdCgxMF9z
KTsKIH0KIAotdm9pZCBJY29uRGF0YWJhc2U6OnBlcmZvcm1SZXRhaW5JY29uRm9yUGFnZVVSTChj
b25zdCBTdHJpbmcmIHBhZ2VVUkxPcmlnaW5hbCwgaW50IHJldGFpbkNvdW50KQordm9pZCBJY29u
RGF0YWJhc2U6OmNsZWFyTG9hZGVkSWNvbnNUaW1lckZpcmVkKCkKIHsKLSAgICBQYWdlVVJMUmVj
b3JkKiByZWNvcmQgPSBtX3BhZ2VVUkxUb1JlY29yZE1hcC5nZXQocGFnZVVSTE9yaWdpbmFsKTsK
LQotICAgIFN0cmluZyBwYWdlVVJMOwotCi0gICAgaWYgKCFyZWNvcmQpIHsKLSAgICAgICAgcGFn
ZVVSTCA9IHBhZ2VVUkxPcmlnaW5hbC5pc29sYXRlZENvcHkoKTsKLQotICAgICAgICByZWNvcmQg
PSBuZXcgUGFnZVVSTFJlY29yZChwYWdlVVJMKTsKLSAgICAgICAgbV9wYWdlVVJMVG9SZWNvcmRN
YXAuc2V0KHBhZ2VVUkwsIHJlY29yZCk7CisgICAgYXV0byBub3cgPSBNb25vdG9uaWNUaW1lOjpu
b3coKTsKKyAgICBWZWN0b3I8U3RyaW5nPiBpY29uc1RvUmVtb3ZlOworICAgIGZvciAoYXV0byBp
dGVyIDogbV9sb2FkZWRJY29ucykgeworICAgICAgICBpZiAobm93IC0gaXRlci52YWx1ZS5zZWNv
bmQgPj0gbG9hZGVkSWNvbkV4cGlyYXRpb25UaW1lKQorICAgICAgICAgICAgaWNvbnNUb1JlbW92
ZS5hcHBlbmQoaXRlci5rZXkpOwogICAgIH0KIAotICAgIGlmICghcmVjb3JkLT5yZXRhaW4ocmV0
YWluQ291bnQpKSB7Ci0gICAgICAgIGlmIChwYWdlVVJMLmlzTnVsbCgpKQotICAgICAgICAgICAg
cGFnZVVSTCA9IHBhZ2VVUkxPcmlnaW5hbC5pc29sYXRlZENvcHkoKTsKLQotICAgICAgICAvLyBU
aGlzIHBhZ2UganVzdCBoYWQgaXRzIHJldGFpbiBjb3VudCBidW1wZWQgZnJvbSAwIHRvIDEgLSBS
ZWNvcmQgdGhhdCBmYWN0Ci0gICAgICAgIG1fcmV0YWluZWRQYWdlVVJMcy5hZGQocGFnZVVSTCk7
Ci0KLSAgICAgICAgLy8gSWYgd2UgcmVhZCB0aGUgaWNvblVSTHMgeWV0LCB3ZSB3YW50IHRvIGF2
b2lkIGFueSBwYWdlVVJMLT5pY29uVVJMIGxvb2t1cHMgYW5kIHRoZSBwYWdlVVJMc1BlbmRpbmdE
ZWxldGlvbiBpcyBtb290LAotICAgICAgICAvLyBzbyB3ZSBiYWlsIGhlcmUgYW5kIHNraXAgdGhv
c2Ugc3RlcHMKLSAgICAgICAgaWYgKCFtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSkKLSAgICAgICAg
ICAgIHJldHVybjsKKyAgICBmb3IgKGF1dG8mIGljb25VUkwgOiBpY29uc1RvUmVtb3ZlKQorICAg
ICAgICBtX2xvYWRlZEljb25zLnJlbW92ZShpY29uVVJMKTsKIAotICAgICAgICBMb2NrSG9sZGVy
IGxvY2tlcihtX3BlbmRpbmdTeW5jTG9jayk7Ci0gICAgICAgIC8vIElmIHRoaXMgcGFnZVVSTCB3
YWl0aW5nIHRvIGJlIHN5bmMnZWQsIHVwZGF0ZSB0aGUgc3luYyByZWNvcmQKLSAgICAgICAgLy8g
VGhpcyBzYXZlcyB1cyBpbiB0aGUgY2FzZSB3aGVyZSBhIHBhZ2Ugd2FzIHJlYWR5IHRvIGJlIGRl
bGV0ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnV0IHdhcyBqdXN0IHJldGFpbmVkIC0gc28gdGhlcmVz
IG5vIG5lZWQgdG8gZGVsZXRlIGl0IQotICAgICAgICBpZiAoIW1fcHJpdmF0ZUJyb3dzaW5nRW5h
YmxlZCAmJiBtX3BhZ2VVUkxzUGVuZGluZ1N5bmMuY29udGFpbnMocGFnZVVSTCkpIHsKLSAgICAg
ICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJCcmluZ2luZyAlcyBiYWNrIGZyb20gdGhlIGJyaW5r
IiwgcGFnZVVSTC5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgICAgICBtX3BhZ2VVUkxzUGVuZGlu
Z1N5bmMuc2V0KHBhZ2VVUkwsIHJlY29yZC0+c25hcHNob3QoKSk7Ci0gICAgICAgIH0KLSAgICB9
CisgICAgaWYgKCFtX2xvYWRlZEljb25zLmlzRW1wdHkoKSkKKyAgICAgICAgc3RhcnRDbGVhckxv
YWRlZEljb25zVGltZXIoKTsKIH0KIAotdm9pZCBJY29uRGF0YWJhc2U6OnJlbGVhc2VJY29uRm9y
UGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VVUkwpCit2b2lkIEljb25EYXRhYmFzZTo6c3RhcnRD
bGVhckxvYWRlZEljb25zVGltZXIoKQogewotICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsK
LQotICAgIC8vIENhbm5vdCBkbyBhbnl0aGluZyB3aXRoIHBhZ2VVUkxPcmlnaW5hbCB0aGF0IHdv
dWxkIGVuZCB1cCBzdG9yaW5nIGl0IHdpdGhvdXQgZGVlcCBjb3B5aW5nIGZpcnN0Ci0KLSAgICBp
ZiAoIWlzRW5hYmxlZCgpIHx8ICFkb2N1bWVudENhbkhhdmVJY29uKHBhZ2VVUkwpKQorICAgIGlm
IChtX2NsZWFyTG9hZGVkSWNvbnNUaW1lci5pc0FjdGl2ZSgpKQogICAgICAgICByZXR1cm47CiAK
LSAgICB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fdXJsc1RvUmV0YWluT3JSZWxlYXNl
TG9jayk7Ci0gICAgICAgIG1fdXJsc1RvUmVsZWFzZS5hZGQocGFnZVVSTC5pc29sYXRlZENvcHko
KSk7Ci0gICAgICAgIG1fcmV0YWluT3JSZWxlYXNlSWNvblJlcXVlc3RlZCA9IHRydWU7Ci0gICAg
fQotICAgIHNjaGVkdWxlT3JEZWZlclN5bmNUaW1lcigpOworICAgIG1fY2xlYXJMb2FkZWRJY29u
c1RpbWVyLnN0YXJ0T25lU2hvdChsb2FkZWRJY29uRXhwaXJhdGlvblRpbWUpOwogfQogCi12b2lk
IEljb25EYXRhYmFzZTo6cGVyZm9ybVJlbGVhc2VJY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcm
IHBhZ2VVUkxPcmlnaW5hbCwgaW50IHJlbGVhc2VDb3VudCkKK09wdGlvbmFsPGludDY0X3Q+IElj
b25EYXRhYmFzZTo6aWNvbklERm9ySWNvblVSTChjb25zdCBTdHJpbmcmIGljb25VUkwsIGJvb2wm
IGV4cGlyZWQpCiB7Ci0gICAgLy8gQ2hlY2sgaWYgdGhpcyBwYWdlVVJMIGlzIGFjdHVhbGx5IHJl
dGFpbmVkCi0gICAgaWYgKCFtX3JldGFpbmVkUGFnZVVSTHMuY29udGFpbnMocGFnZVVSTE9yaWdp
bmFsKSkgewotICAgICAgICBMT0dfRVJST1IoIkF0dGVtcHRpbmcgdG8gcmVsZWFzZSBpY29uIGZv
ciBVUkwgJXMgd2hpY2ggaXMgbm90IHJldGFpbmVkIiwgdXJsRm9yTG9nZ2luZyhwYWdlVVJMT3Jp
Z2luYWwpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgICBSRUxF
QVNFX0FTU0VSVChtX2RiLmlzT3BlbigpKTsKIAotICAgIC8vIEdldCBpdHMgcmV0YWluIGNvdW50
IC0gaWYgaXQncyByZXRhaW5lZCwgd2UnZCBiZXR0ZXIgaGF2ZSBhIFBhZ2VVUkxSZWNvcmQgZm9y
IGl0Ci0gICAgUGFnZVVSTFJlY29yZCogcGFnZVJlY29yZCA9IG1fcGFnZVVSTFRvUmVjb3JkTWFw
LmdldChwYWdlVVJMT3JpZ2luYWwpOwotICAgIEFTU0VSVChwYWdlUmVjb3JkKTsKLSAgICBMT0co
SWNvbkRhdGFiYXNlLCAiUmVsZWFzaW5nIHBhZ2VVUkwgJXMgdG8gYSByZXRhaW4gY291bnQgb2Yg
JWkiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkxPcmlnaW5hbCkuYXNjaWkoKS5kYXRhKCksIHBhZ2VS
ZWNvcmQtPnJldGFpbkNvdW50KCkgLSAxKTsKLSAgICBBU1NFUlQocGFnZVJlY29yZC0+cmV0YWlu
Q291bnQoKSA+IDApOwotCi0gICAgLy8gSWYgaXQgc3RpbGwgaGFzIGEgcG9zaXRpdmUgcmV0YWlu
IGNvdW50LCBzdG9yZSB0aGUgbmV3IGNvdW50IGFuZCBiYWlsCi0gICAgaWYgKHBhZ2VSZWNvcmQt
PnJlbGVhc2UocmVsZWFzZUNvdW50KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVGhpcyBw
YWdlUmVjb3JkIGhhcyBub3cgYmVlbiBmdWxseSByZWxlYXNlZC4gRG8gdGhlIGFwcHJvcHJpYXRl
IGNsZWFudXAKLSAgICBMT0coSWNvbkRhdGFiYXNlLCAiTm8gbW9yZSByZXRhaW5lcnMgZm9yIFBh
Z2VVUkwgJXMiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkxPcmlnaW5hbCkuYXNjaWkoKS5kYXRhKCkp
OwotICAgIG1fcGFnZVVSTFRvUmVjb3JkTWFwLnJlbW92ZShwYWdlVVJMT3JpZ2luYWwpOwotICAg
IG1fcmV0YWluZWRQYWdlVVJMcy5yZW1vdmUocGFnZVVSTE9yaWdpbmFsKTsKLQotICAgIC8vIEdy
YWIgdGhlIGljb25SZWNvcmQgZm9yIGxhdGVyIHVzZSAoYW5kIGRvIGEgc2FuaXR5IGNoZWNrIG9u
IGl0IGZvciBraWNrcykKLSAgICBJY29uUmVjb3JkKiBpY29uUmVjb3JkID0gcGFnZVJlY29yZC0+
aWNvblJlY29yZCgpOwotCi0gICAgQVNTRVJUKCFpY29uUmVjb3JkIHx8IChpY29uUmVjb3JkICYm
IG1faWNvblVSTFRvUmVjb3JkTWFwLmdldChpY29uUmVjb3JkLT5pY29uVVJMKCkpID09IGljb25S
ZWNvcmQpKTsKLQotICAgIHsKLSAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nUmVh
ZGluZ0xvY2spOwotCi0gICAgICAgIC8vIFNpbmNlIHRoaXMgcGFnZVVSTCBpcyBnb2luZyBhd2F5
LCB0aGVyZSdzIG5vIHJlYXNvbiBhbnlvbmUgd291bGQgZXZlciBiZSBpbnRlcmVzdGVkIGluIGl0
cyByZWFkIHJlc3VsdHMKLSAgICAgICAgaWYgKCFtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSkKLSAg
ICAgICAgICAgIG1fcGFnZVVSTHNQZW5kaW5nSW1wb3J0LnJlbW92ZShwYWdlVVJMT3JpZ2luYWwp
OwotICAgICAgICBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMucmVtb3ZlKHBhZ2VVUkxPcmln
aW5hbCk7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBpY29uIGlzIGRvd24gdG8gaXQncyBsYXN0IHJl
dGFpbmVyLCB3ZSBkb24ndCBjYXJlIGFib3V0IHJlYWRpbmcgaXQgaW4gZnJvbSBkaXNrIGFueW1v
cmUKLSAgICAgICAgaWYgKGljb25SZWNvcmQgJiYgaWNvblJlY29yZC0+aGFzT25lUmVmKCkpIHsK
LSAgICAgICAgICAgIG1faWNvblVSTFRvUmVjb3JkTWFwLnJlbW92ZShpY29uUmVjb3JkLT5pY29u
VVJMKCkpOwotICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFkaW5nLnJlbW92ZShpY29uUmVj
b3JkKTsKKyAgICBpZiAoIW1faWNvbklERm9ySWNvblVSTFN0YXRlbWVudCkgeworICAgICAgICBt
X2ljb25JREZvckljb25VUkxTdGF0ZW1lbnQgPSBtYWtlVW5pcXVlPFNRTGl0ZVN0YXRlbWVudD4o
bV9kYiwgIlNFTEVDVCBJY29uSW5mby5pY29uSUQsIEljb25JbmZvLnN0YW1wIEZST00gSWNvbklu
Zm8gV0hFUkUgSWNvbkluZm8udXJsID0gKD8pOyIpOworICAgICAgICBpZiAobV9pY29uSURGb3JJ
Y29uVVJMU3RhdGVtZW50LT5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICBM
T0dfRVJST1IoIlByZXBhcmluZyBzdGF0ZW1lbnQgaWNvbklERm9ySWNvblVSTCBmYWlsZWQiKTsK
KyAgICAgICAgICAgIG1faWNvbklERm9ySWNvblVSTFN0YXRlbWVudCA9IG51bGxwdHI7CisgICAg
ICAgICAgICByZXR1cm4gV1RGOjpudWxsb3B0OwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8g
TWFyayBzdHVmZiBmb3IgZGVsZXRpb24gZnJvbSB0aGUgZGF0YWJhc2Ugb25seSBpZiB3ZSdyZSBu
b3QgaW4gcHJpdmF0ZSBicm93c2luZwotICAgIGlmICghbV9wcml2YXRlQnJvd3NpbmdFbmFibGVk
KSB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1N5bmNMb2NrKTsKLSAgICAg
ICAgbV9wYWdlVVJMc1BlbmRpbmdTeW5jLnNldChwYWdlVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5
KCksIHBhZ2VSZWNvcmQtPnNuYXBzaG90KHRydWUpKTsKKyAgICBpZiAobV9pY29uSURGb3JJY29u
VVJMU3RhdGVtZW50LT5iaW5kVGV4dCgxLCBpY29uVVJMKSAhPSBTUUxJVEVfT0spIHsKKyAgICAg
ICAgTE9HX0VSUk9SKCJGYXZpY29uRGF0YWJzZTo6aWNvbklERm9ySWNvblVSTCBmYWlsZWQ6ICVz
IiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIHJldHVybiBXVEY6Om51bGxvcHQ7Cisg
ICAgfQogCi0gICAgICAgIC8vIElmIHRoaXMgcGFnZSBpcyB0aGUgbGFzdCBwYWdlIHRvIHJlZmVy
IHRvIGEgcGFydGljdWxhciBJY29uUmVjb3JkLCB0aGF0IEljb25SZWNvcmQgbmVlZHMgdG8KLSAg
ICAgICAgLy8gYmUgbWFya2VkIGZvciBkZWxldGlvbgotICAgICAgICBpZiAoaWNvblJlY29yZCAm
JiBpY29uUmVjb3JkLT5oYXNPbmVSZWYoKSkKLSAgICAgICAgICAgIG1faWNvbnNQZW5kaW5nU3lu
Yy5zZXQoaWNvblJlY29yZC0+aWNvblVSTCgpLCBpY29uUmVjb3JkLT5zbmFwc2hvdCh0cnVlKSk7
CisgICAgT3B0aW9uYWw8aW50NjRfdD4gcmVzdWx0OworICAgIGlmIChtX2ljb25JREZvckljb25V
UkxTdGF0ZW1lbnQtPnN0ZXAoKSA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIHJlc3VsdCA9IG1f
aWNvbklERm9ySWNvblVSTFN0YXRlbWVudC0+Z2V0Q29sdW1uSW50NjQoMCk7CisgICAgICAgIGV4
cGlyZWQgPSBtX2ljb25JREZvckljb25VUkxTdGF0ZW1lbnQtPmdldENvbHVtbkludDY0KDEpIDw9
IGZsb29yKChXYWxsVGltZTo6bm93KCkgLSBpY29uRXhwaXJhdGlvblRpbWUpLnNlY29uZHNTaW5j
ZUVwb2NoKCkuc2Vjb25kcygpKTsKICAgICB9CiAKLSAgICBkZWxldGUgcGFnZVJlY29yZDsKKyAg
ICBtX2ljb25JREZvckljb25VUkxTdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAgcmV0dXJuIHJlc3Vs
dDsKIH0KIAotdm9pZCBJY29uRGF0YWJhc2U6OnNldEljb25EYXRhRm9ySWNvblVSTChSZWZQdHI8
U2hhcmVkQnVmZmVyPiYmIGRhdGEsIGNvbnN0IFN0cmluZyYgaWNvblVSTE9yaWdpbmFsKQorYm9v
bCBJY29uRGF0YWJhc2U6OnNldEljb25JREZvclBhZ2VVUkwoaW50NjRfdCBpY29uSUQsIGNvbnN0
IFN0cmluZyYgcGFnZVVSTCkKIHsKLSAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7Ci0KLSAg
ICAvLyBDYW5ub3QgZG8gYW55dGhpbmcgd2l0aCBpY29uVVJMT3JpZ2luYWwgdGhhdCB3b3VsZCBl
bmQgdXAgc3RvcmluZyB0aGVtIHdpdGhvdXQgZGVlcCBjb3B5aW5nIGZpcnN0Ci0KLSAgICBpZiAo
IWlzT3BlbigpIHx8IGljb25VUkxPcmlnaW5hbC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsK
KyAgICBSRUxFQVNFX0FTU0VSVChtX2RiLmlzT3BlbigpKTsKKyAgICBSRUxFQVNFX0FTU0VSVCht
X2FsbG93RGF0YWJhc2VXcml0ZSA9PSBBbGxvd0RhdGFiYXNlV3JpdGU6Olllcyk7CiAKLSAgICBT
dHJpbmcgaWNvblVSTCA9IGljb25VUkxPcmlnaW5hbC5pc29sYXRlZENvcHkoKTsKLSAgICBWZWN0
b3I8U3RyaW5nPiBwYWdlVVJMczsKLSAgICB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1f
dXJsQW5kSWNvbkxvY2spOwotCi0gICAgICAgIC8vIElmIHRoaXMgaWNvbiB3YXMgcGVuZGluZyBh
IHJlYWQsIHJlbW92ZSBpdCBmcm9tIHRoYXQgc2V0IGJlY2F1c2UgdGhpcyBuZXcgZGF0YSBzaG91
bGQgb3ZlcnJpZGUgd2hhdCBpcyBvbiBkaXNrCi0gICAgICAgIFJlZlB0cjxJY29uUmVjb3JkPiBp
Y29uID0gbV9pY29uVVJMVG9SZWNvcmRNYXAuZ2V0KGljb25VUkwpOwotICAgICAgICBpZiAoaWNv
bikgewotICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2sp
OwotICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFkaW5nLnJlbW92ZShpY29uLmdldCgpKTsK
LSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpY29uID0gZ2V0T3JDcmVhdGVJY29uUmVjb3Jk
KGljb25VUkwpOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBhbmQgc2V0IHRoZSB0aW1l
IHN0YW1wCi0gICAgICAgIGljb24tPnNldEltYWdlRGF0YShXVEZNb3ZlKGRhdGEpKTsKLSAgICAg
ICAgaWNvbi0+c2V0VGltZXN0YW1wKChpbnQpV2FsbFRpbWU6Om5vdygpLnNlY29uZHNTaW5jZUVw
b2NoKCkuc2Vjb25kcygpKTsKLQotICAgICAgICAvLyBDb3B5IHRoZSBjdXJyZW50IHJldGFpbmlu
ZyBwYWdlVVJMcyAtIGlmIGFueSAtIHRvIG5vdGlmeSB0aGVtIG9mIHRoZSBjaGFuZ2UKLSAgICAg
ICAgcGFnZVVSTHMuYXBwZW5kUmFuZ2UoaWNvbi0+cmV0YWluaW5nUGFnZVVSTHMoKS5iZWdpbigp
LCBpY29uLT5yZXRhaW5pbmdQYWdlVVJMcygpLmVuZCgpKTsKLQotICAgICAgICAvLyBNYXJrIHRo
ZSBJY29uUmVjb3JkIGFzIHJlcXVpcmluZyBhbiB1cGRhdGUgdG8gdGhlIGRhdGFiYXNlIG9ubHkg
aWYgcHJpdmF0ZSBicm93c2luZyBpcyBkaXNhYmxlZAotICAgICAgICBpZiAoIW1fcHJpdmF0ZUJy
b3dzaW5nRW5hYmxlZCkgewotICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5n
U3luY0xvY2spOwotICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdTeW5jLnNldChpY29uVVJMLCBp
Y29uLT5zbmFwc2hvdCgpKTsKKyAgICBpZiAoIW1fc2V0SWNvbklERm9yUGFnZVVSTFN0YXRlbWVu
dCkgeworICAgICAgICBtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQgPSBtYWtlVW5pcXVl
PFNRTGl0ZVN0YXRlbWVudD4obV9kYiwgIklOU0VSVCBJTlRPIFBhZ2VVUkwgKHVybCwgaWNvbklE
KSBWQUxVRVMgKCg/KSwgPyk7Iik7CisgICAgICAgIGlmIChtX3NldEljb25JREZvclBhZ2VVUkxT
dGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJP
UigiUHJlcGFyaW5nIHN0YXRlbWVudCBzZXRJY29uSURGb3JQYWdlVVJMIGZhaWxlZCIpOworICAg
ICAgICAgICAgbV9zZXRJY29uSURGb3JQYWdlVVJMU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoaWNv
bi0+aGFzT25lUmVmKCkpIHsKLSAgICAgICAgICAgIEFTU0VSVChpY29uLT5yZXRhaW5pbmdQYWdl
VVJMcygpLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiSWNvbiBm
b3IgaWNvbiB1cmwgJXMgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkIC0gcmVtb3ZpbmcgbWFwcGlu
ZyBmb3IgaXQiLCB1cmxGb3JMb2dnaW5nKGljb24tPmljb25VUkwoKSkuYXNjaWkoKS5kYXRhKCkp
OwotICAgICAgICAgICAgbV9pY29uVVJMVG9SZWNvcmRNYXAucmVtb3ZlKGljb24tPmljb25VUkwo
KSk7Ci0gICAgICAgIH0KKyAgICBpZiAobV9zZXRJY29uSURGb3JQYWdlVVJMU3RhdGVtZW50LT5i
aW5kVGV4dCgxLCBwYWdlVVJMKSAhPSBTUUxJVEVfT0sKKyAgICAgICAgfHwgbV9zZXRJY29uSURG
b3JQYWdlVVJMU3RhdGVtZW50LT5iaW5kSW50NjQoMiwgaWNvbklEKSAhPSBTUUxJVEVfT0spIHsK
KyAgICAgICAgTE9HX0VSUk9SKCJGYXZpY29uRGF0YWJzZTo6c2V0SWNvbklERm9yUGFnZVVSTCBm
YWlsZWQ6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICB9CiAKLSAgICAvLyBTZW5kIG5vdGlmaWNhdGlvbiBvdXQgcmVnYXJkaW5nIGFsbCBQYWdl
VVJMcyB0aGF0IHJldGFpbiB0aGlzIGljb24KLSAgICAvLyBTdGFydCB0aGUgdGltZXIgdG8gY29t
bWl0IHRoaXMgY2hhbmdlIC0gb3IgZnVydGhlciBkZWxheSB0aGUgdGltZXIgaWYgaXQgd2FzIGFs
cmVhZHkgc3RhcnRlZAotICAgIHNjaGVkdWxlT3JEZWZlclN5bmNUaW1lcigpOworICAgIGlmICht
X3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQtPnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAKLSAgICBmb3IgKGF1dG8mIHBhZ2VVUkwgOiBw
YWdlVVJMcykgewotICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiRGlzcGF0Y2hpbmcgbm90aWZp
Y2F0aW9uIHRoYXQgcmV0YWluaW5nIHBhZ2VVUkwgJXMgaGFzIGEgbmV3IGljb24iLCB1cmxGb3JM
b2dnaW5nKHBhZ2VVUkwpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgaWYgKG1fY2xpZW50KQot
ICAgICAgICAgICAgbV9jbGllbnQtPmRpZENoYW5nZUljb25Gb3JQYWdlVVJMKHBhZ2VVUkwpOwot
ICAgIH0KKyAgICBtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAg
cmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgSWNvbkRhdGFiYXNlOjpzZXRJY29uVVJMRm9yUGFnZVVS
TChjb25zdCBTdHJpbmcmIGljb25VUkxPcmlnaW5hbCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMT3Jp
Z2luYWwpCitWZWN0b3I8Y2hhcj4gSWNvbkRhdGFiYXNlOjppY29uRGF0YShpbnQ2NF90IGljb25J
RCkKIHsKLSAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICAvLyBDYW5ub3QgZG8g
YW55dGhpbmcgd2l0aCBpY29uVVJMT3JpZ2luYWwgb3IgcGFnZVVSTE9yaWdpbmFsIHRoYXQgd291
bGQgZW5kIHVwIHN0b3JpbmcgdGhlbSB3aXRob3V0IGRlZXAgY29weWluZyBmaXJzdAotCi0gICAg
QVNTRVJUKCFpY29uVVJMT3JpZ2luYWwuaXNFbXB0eSgpKTsKLQotICAgIGlmICghaXNPcGVuKCkg
fHwgIWRvY3VtZW50Q2FuSGF2ZUljb24ocGFnZVVSTE9yaWdpbmFsKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgU3RyaW5nIGljb25VUkwsIHBhZ2VVUkw7Ci0gICAgewotICAgICAgICBMb2NrSG9s
ZGVyIGxvY2tlcihtX3VybEFuZEljb25Mb2NrKTsKLQotICAgICAgICBQYWdlVVJMUmVjb3JkKiBw
YWdlUmVjb3JkID0gbV9wYWdlVVJMVG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkxPcmlnaW5hbCk7Ci0K
LSAgICAgICAgLy8gSWYgdGhlIHVybHMgYWxyZWFkeSBtYXAgdG8gZWFjaCBvdGhlciwgYmFpbC4K
LSAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHN1cnByaXNpbmdseSBvZnRlbiwgYW5kIHNlZW1zIHRv
IGNyZWFtIGlCZW5jaCBwZXJmb3JtYW5jZQotICAgICAgICBpZiAocGFnZVJlY29yZCAmJiBwYWdl
UmVjb3JkLT5pY29uUmVjb3JkKCkgJiYgcGFnZVJlY29yZC0+aWNvblJlY29yZCgpLT5pY29uVVJM
KCkgPT0gaWNvblVSTE9yaWdpbmFsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHBh
Z2VVUkwgPSBwYWdlVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCk7Ci0gICAgICAgIGljb25VUkwg
PSBpY29uVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCk7Ci0KLSAgICAgICAgaWYgKCFwYWdlUmVj
b3JkKSB7Ci0gICAgICAgICAgICBwYWdlUmVjb3JkID0gbmV3IFBhZ2VVUkxSZWNvcmQocGFnZVVS
TCk7Ci0gICAgICAgICAgICBtX3BhZ2VVUkxUb1JlY29yZE1hcC5zZXQocGFnZVVSTCwgcGFnZVJl
Y29yZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBSZWZQdHI8SWNvblJlY29yZD4gaWNvblJlY29y
ZCA9IHBhZ2VSZWNvcmQtPmljb25SZWNvcmQoKTsKKyAgICBSRUxFQVNFX0FTU0VSVChtX2RiLmlz
T3BlbigpKTsKIAotICAgICAgICAvLyBPdGhlcndpc2UsIHNldCB0aGUgbmV3IGljb24gcmVjb3Jk
IGZvciB0aGlzIHBhZ2UKLSAgICAgICAgcGFnZVJlY29yZC0+c2V0SWNvblJlY29yZChnZXRPckNy
ZWF0ZUljb25SZWNvcmQoaWNvblVSTCkpOwotCi0gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGlj
b24gaGFzIG9ubHkgYSBzaW5nbGUgcmVmIGxlZnQsIGl0IGlzIGFib3V0IHRvIGdldCB3aXBlZCBv
dXQuCi0gICAgICAgIC8vIFJlbW92ZSBpdCBmcm9tIHRoZSBpbi1tZW1vcnkgcmVjb3JkcyBhbmQg
ZG9uJ3QgYm90aGVyIHJlYWRpbmcgaXQgaW4gZnJvbSBkaXNrIGFueW1vcmUKLSAgICAgICAgaWYg
KGljb25SZWNvcmQgJiYgaWNvblJlY29yZC0+aGFzT25lUmVmKCkpIHsKLSAgICAgICAgICAgIEFT
U0VSVCghaWNvblJlY29yZC0+cmV0YWluaW5nUGFnZVVSTHMoKS5zaXplKCkpOwotICAgICAgICAg
ICAgTE9HKEljb25EYXRhYmFzZSwgIkljb24gZm9yIGljb24gdXJsICVzIGlzIGFib3V0IHRvIGJl
IGRlc3Ryb3llZCAtIHJlbW92aW5nIG1hcHBpbmcgZm9yIGl0IiwgdXJsRm9yTG9nZ2luZyhpY29u
UmVjb3JkLT5pY29uVVJMKCkpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgICAgIG1faWNvblVS
TFRvUmVjb3JkTWFwLnJlbW92ZShpY29uUmVjb3JkLT5pY29uVVJMKCkpOwotICAgICAgICAgICAg
TG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOwotICAgICAgICAgICAgbV9p
Y29uc1BlbmRpbmdSZWFkaW5nLnJlbW92ZShpY29uUmVjb3JkLmdldCgpKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIEFuZCBtYXJrIHRoaXMgbWFwcGluZyB0byBiZSBhZGRlZCB0byB0aGUgZGF0
YWJhc2UKLSAgICAgICAgaWYgKCFtX3ByaXZhdGVCcm93c2luZ0VuYWJsZWQpIHsKLSAgICAgICAg
ICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1N5bmNMb2NrKTsKLSAgICAgICAgICAgIG1f
cGFnZVVSTHNQZW5kaW5nU3luYy5zZXQocGFnZVVSTCwgcGFnZVJlY29yZC0+c25hcHNob3QoKSk7
Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBpY29uIGlzIG9uIGl0cyBsYXN0IHJlZiwgbWFyayBp
dCBmb3IgZGVsZXRpb24KLSAgICAgICAgICAgIGlmIChpY29uUmVjb3JkICYmIGljb25SZWNvcmQt
Pmhhc09uZVJlZigpKQotICAgICAgICAgICAgICAgIG1faWNvbnNQZW5kaW5nU3luYy5zZXQoaWNv
blJlY29yZC0+aWNvblVSTCgpLCBpY29uUmVjb3JkLT5zbmFwc2hvdCh0cnVlKSk7CisgICAgaWYg
KCFtX2ljb25EYXRhU3RhdGVtZW50KSB7CisgICAgICAgIG1faWNvbkRhdGFTdGF0ZW1lbnQgPSBt
YWtlVW5pcXVlPFNRTGl0ZVN0YXRlbWVudD4obV9kYiwgIlNFTEVDVCBJY29uRGF0YS5kYXRhIEZS
T00gSWNvbkRhdGEgV0hFUkUgSWNvbkRhdGEuaWNvbklEID0gKD8pOyIpOworICAgICAgICBpZiAo
bV9pY29uRGF0YVN0YXRlbWVudC0+cHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAgICAgICAg
ICAgTE9HX0VSUk9SKCJQcmVwYXJpbmcgc3RhdGVtZW50IGljb25EYXRhIGZhaWxlZCIpOworICAg
ICAgICAgICAgbV9pY29uRGF0YVN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1
cm4geyB9OwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gU2luY2UgdGhpcyBtYXBwaW5nIGlz
IG5ldywgc2VuZCB0aGUgbm90aWZpY2F0aW9uIG91dCAtIGJ1dCBub3QgaWYgd2UncmUgb24gdGhl
IHN5bmMgdGhyZWFkIGJlY2F1c2UgdGhhdCBpbXBsaWVzIHRoaXMgbWFwcGluZwotICAgIC8vIGNv
bWVzIGZyb20gdGhlIGluaXRpYWwgaW1wb3J0IHdoaWNoIHdlIGRvbid0IHdhbnQgbm90aWZpY2F0
aW9ucyBmb3IKLSAgICBpZiAoIUlTX0lDT05fU1lOQ19USFJFQUQoKSkgewotICAgICAgICAvLyBT
dGFydCB0aGUgdGltZXIgdG8gY29tbWl0IHRoaXMgY2hhbmdlIC0gb3IgZnVydGhlciBkZWxheSB0
aGUgdGltZXIgaWYgaXQgd2FzIGFscmVhZHkgc3RhcnRlZAotICAgICAgICBzY2hlZHVsZU9yRGVm
ZXJTeW5jVGltZXIoKTsKLQotICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiRGlzcGF0Y2hpbmcg
bm90aWZpY2F0aW9uIHRoYXQgd2UgY2hhbmdlZCBhbiBpY29uIG1hcHBpbmcgZm9yIHVybCAlcyIs
IHVybEZvckxvZ2dpbmcocGFnZVVSTCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICBpZiAobV9j
bGllbnQpCi0gICAgICAgICAgICBtX2NsaWVudC0+ZGlkQ2hhbmdlSWNvbkZvclBhZ2VVUkwocGFn
ZVVSTCk7Ci0gICAgfQotfQotCi1JY29uRGF0YWJhc2U6Okljb25Mb2FkRGVjaXNpb24gSWNvbkRh
dGFiYXNlOjpzeW5jaHJvbm91c0xvYWREZWNpc2lvbkZvckljb25VUkwoY29uc3QgU3RyaW5nJiBp
Y29uVVJMKQotewotICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKLQotICAgIGlmICghaXNP
cGVuKCkgfHwgaWNvblVSTC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBJY29uTG9hZERlY2lz
aW9uOjpObzsKLQotICAgIC8vIElmIHdlIGhhdmUgYSBJY29uUmVjb3JkLCBpdCBzaG91bGQgYWxz
byBoYXZlIGl0cyB0aW1lU3RhbXAgbWFya2VkIGJlY2F1c2UgdGhlcmUgaXMgb25seSB0d28gdGlt
ZXMgd2hlbiB3ZSBjcmVhdGUgdGhlIEljb25SZWNvcmQ6Ci0gICAgLy8gMSAtIFdoZW4gd2UgcmVh
ZCB0aGUgaWNvbiB1cmxzIGZyb20gZGlzaywgZ2V0dGluZyB0aGUgdGltZVN0YW1wIGF0IHRoZSBz
YW1lIHRpbWUKLSAgICAvLyAyIC0gV2hlbiB3ZSBnZXQgYSBuZXcgaWNvbiBmcm9tIHRoZSBsb2Fk
ZXIsIGluIHdoaWNoIGNhc2UgdGhlIHRpbWVzdGFtcCBpcyBzZXQgYXQgdGhhdCB0aW1lCi0gICAg
ewotICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3VybEFuZEljb25Mb2NrKTsKLSAgICAgICAg
aWYgKEljb25SZWNvcmQqIGljb24gPSBtX2ljb25VUkxUb1JlY29yZE1hcC5nZXQoaWNvblVSTCkp
IHsKLSAgICAgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJGb3VuZCBleHBpcmF0aW9uIHRpbWUg
b24gYSBwcmVzZW50IGljb24gYmFzZWQgb24gZXhpc3RpbmcgSWNvblJlY29yZCIpOwotICAgICAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oV2FsbFRpbWU6Om5vdygpLnNlY29uZHNTaW5j
ZUVwb2NoKCkuc2Vjb25kcygpKSAtIHN0YXRpY19jYXN0PGludD4oaWNvbi0+Z2V0VGltZXN0YW1w
KCkpID4gaWNvbkV4cGlyYXRpb25UaW1lID8gSWNvbkxvYWREZWNpc2lvbjo6WWVzIDogSWNvbkxv
YWREZWNpc2lvbjo6Tm87Ci0gICAgICAgIH0KKyAgICBpZiAobV9pY29uRGF0YVN0YXRlbWVudC0+
YmluZEludDY0KDEsIGljb25JRCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigi
SWNvbkRhdGFiYXNlOjppY29uRGF0YSBmYWlsZWQ6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7
CisgICAgICAgIHJldHVybiB7IH07CiAgICAgfQogCi0gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBh
IHJlY29yZCBmb3IgaXQsIGJ1dCB3ZSAqaGF2ZSogaW1wb3J0ZWQgYWxsIGljb25VUkxzIGZyb20g
ZGlzaywgdGhlbiB3ZSBzaG91bGQgbG9hZCBpdCBub3cKLSAgICBMb2NrSG9sZGVyIHJlYWRpbmdM
b2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOwotICAgIGlmIChtX2ljb25VUkxJbXBvcnRDb21w
bGV0ZSkKLSAgICAgICAgcmV0dXJuIEljb25Mb2FkRGVjaXNpb246OlllczsKLQotICAgIC8vIE90
aGVyd2lzZSAtIHNpbmNlIHdlIHJlZnVzZSB0byBwZXJmb3JtIEkvTyBvbiB0aGUgbWFpbiB0aHJl
YWQgdG8gZmluZCBvdXQgZm9yIHN1cmUgLSB3ZSByZXR1cm4gdGhlIGFuc3dlciB0aGF0IHNheXMK
LSAgICAvLyAiWW91IG1pZ2h0IGJlIGFza2VkIHRvIGxvYWQgdGhpcyBsYXRlciwgc28gZmxhZyB0
aGF0IgotICAgIHJldHVybiBJY29uTG9hZERlY2lzaW9uOjpVbmtub3duOwotfQotCi1ib29sIElj
b25EYXRhYmFzZTo6c3luY2hyb25vdXNJY29uRGF0YUtub3duRm9ySWNvblVSTChjb25zdCBTdHJp
bmcmIGljb25VUkwpCi17Ci0gICAgQVNTRVJUX05PVF9TWU5DX1RIUkVBRCgpOwotCi0gICAgTG9j
a0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7Ci0gICAgaWYgKEljb25SZWNvcmQqIGlj
b24gPSBtX2ljb25VUkxUb1JlY29yZE1hcC5nZXQoaWNvblVSTCkpCi0gICAgICAgIHJldHVybiBp
Y29uLT5pbWFnZURhdGFTdGF0dXMoKSAhPSBJY29uUmVjb3JkOjpJbWFnZURhdGFTdGF0dXM6OlVu
a25vd247CisgICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKKyAgICBpZiAobV9pY29uRGF0YVN0YXRl
bWVudC0+c3RlcCgpID09IFNRTElURV9ST1cpCisgICAgICAgIG1faWNvbkRhdGFTdGF0ZW1lbnQt
PmdldENvbHVtbkJsb2JBc1ZlY3RvcigwLCByZXN1bHQpOwogCi0gICAgcmV0dXJuIGZhbHNlOwor
ICAgIG1faWNvbkRhdGFTdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0K
IAotdm9pZCBJY29uRGF0YWJhc2U6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQorT3B0aW9uYWw8
aW50NjRfdD4gSWNvbkRhdGFiYXNlOjphZGRJY29uKGNvbnN0IFN0cmluZyYgaWNvblVSTCwgY29u
c3QgVmVjdG9yPGNoYXI+JiBpY29uRGF0YSkKIHsKLSAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFE
KCk7CisgICAgUkVMRUFTRV9BU1NFUlQobV9kYi5pc09wZW4oKSk7CisgICAgUkVMRUFTRV9BU1NF
UlQobV9hbGxvd0RhdGFiYXNlV3JpdGUgPT0gQWxsb3dEYXRhYmFzZVdyaXRlOjpZZXMpOwogCi0g
ICAgaWYgKCFlbmFibGVkICYmIGlzT3BlbigpKQotICAgICAgICBjbG9zZSgpOwotICAgIG1faXNF
bmFibGVkID0gZW5hYmxlZDsKLX0KKyAgICBpZiAoIW1fYWRkSWNvblN0YXRlbWVudCkgeworICAg
ICAgICBtX2FkZEljb25TdGF0ZW1lbnQgPSBtYWtlVW5pcXVlPFNRTGl0ZVN0YXRlbWVudD4obV9k
YiwgIklOU0VSVCBJTlRPIEljb25JbmZvICh1cmwsIHN0YW1wKSBWQUxVRVMgKD8sIDApOyIpOwor
ICAgICAgICBpZiAobV9hZGRJY29uU3RhdGVtZW50LT5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7
CisgICAgICAgICAgICBMT0dfRVJST1IoIlByZXBhcmluZyBzdGF0ZW1lbnQgYWRkSWNvbiBmYWls
ZWQiKTsKKyAgICAgICAgICAgIG1fYWRkSWNvblN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgICAg
ICAgICByZXR1cm4gV1RGOjpudWxsb3B0OworICAgICAgICB9CisgICAgfQorICAgIGlmICghbV9h
ZGRJY29uRGF0YVN0YXRlbWVudCkgeworICAgICAgICBtX2FkZEljb25EYXRhU3RhdGVtZW50ID0g
bWFrZVVuaXF1ZTxTUUxpdGVTdGF0ZW1lbnQ+KG1fZGIsICJJTlNFUlQgSU5UTyBJY29uRGF0YSAo
aWNvbklELCBkYXRhKSBWQUxVRVMgKD8sID8pOyIpOworICAgICAgICBpZiAobV9hZGRJY29uRGF0
YVN0YXRlbWVudC0+cHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgTE9HX0VS
Uk9SKCJQcmVwYXJpbmcgc3RhdGVtZW50IGFkZEljb25EYXRhIGZhaWxlZCIpOworICAgICAgICAg
ICAgbV9hZGRJY29uRGF0YVN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm4g
V1RGOjpudWxsb3B0OworICAgICAgICB9CisgICAgfQogCi1ib29sIEljb25EYXRhYmFzZTo6aXNF
bmFibGVkKCkgY29uc3QKLXsKLSAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7CisgICAgaWYg
KG1fYWRkSWNvblN0YXRlbWVudC0+YmluZFRleHQoMSwgaWNvblVSTCkgIT0gU1FMSVRFX09LKSB7
CisgICAgICAgIExPR19FUlJPUigiSWNvbkRhdGFiYXNlOjphZGRJY29uIGZhaWxlZDogJXMiLCBt
X2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKKyAgICB9
CiAKLSAgICByZXR1cm4gbV9pc0VuYWJsZWQ7Ci19CisgICAgbV9hZGRJY29uU3RhdGVtZW50LT5z
dGVwKCk7CisgICAgbV9hZGRJY29uU3RhdGVtZW50LT5yZXNldCgpOwogCi12b2lkIEljb25EYXRh
YmFzZTo6c2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChib29sIGZsYWcpCi17Ci0gICAgbV9wcml2
YXRlQnJvd3NpbmdFbmFibGVkID0gZmxhZzsKLX0KKyAgICBhdXRvIGljb25JRCA9IG1fZGIubGFz
dEluc2VydFJvd0lEKCk7CisgICAgaWYgKG1fYWRkSWNvbkRhdGFTdGF0ZW1lbnQtPmJpbmRJbnQ2
NCgxLCBpY29uSUQpICE9IFNRTElURV9PSyB8fCBtX2FkZEljb25EYXRhU3RhdGVtZW50LT5iaW5k
QmxvYigyLCBpY29uRGF0YS5kYXRhKCksIGljb25EYXRhLnNpemUoKSkgIT0gU1FMSVRFX09LKSB7
CisgICAgICAgIExPR19FUlJPUigiSWNvbkRhdGFiYXNlOjphZGRJY29uIGZhaWxlZDogJXMiLCBt
X2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKKyAgICB9
CiAKLWJvb2wgSWNvbkRhdGFiYXNlOjppc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSBjb25zdAot
ewotICAgIHJldHVybiBtX3ByaXZhdGVCcm93c2luZ0VuYWJsZWQ7Ci19CisgICAgbV9hZGRJY29u
RGF0YVN0YXRlbWVudC0+c3RlcCgpOworICAgIG1fYWRkSWNvbkRhdGFTdGF0ZW1lbnQtPnJlc2V0
KCk7CiAKLXZvaWQgSWNvbkRhdGFiYXNlOjpkZWxheURhdGFiYXNlQ2xlYW51cCgpCi17Ci0gICAg
KytkYXRhYmFzZUNsZWFudXBDb3VudGVyOwotICAgIGlmIChkYXRhYmFzZUNsZWFudXBDb3VudGVy
ID09IDEpCi0gICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJEYXRhYmFzZSBjbGVhbnVwIGlzIG5v
dyBESVNBQkxFRCIpOworICAgIHJldHVybiBpY29uSUQ7CiB9CiAKLXZvaWQgSWNvbkRhdGFiYXNl
OjphbGxvd0RhdGFiYXNlQ2xlYW51cCgpCit2b2lkIEljb25EYXRhYmFzZTo6dXBkYXRlSWNvblRp
bWVzdGFtcChpbnQ2NF90IGljb25JRCwgaW50NjRfdCB0aW1lc3RhbXApCiB7Ci0gICAgaWYgKC0t
ZGF0YWJhc2VDbGVhbnVwQ291bnRlciA8IDApCi0gICAgICAgIGRhdGFiYXNlQ2xlYW51cENvdW50
ZXIgPSAwOwotICAgIGlmICghZGF0YWJhc2VDbGVhbnVwQ291bnRlcikKLSAgICAgICAgTE9HKElj
b25EYXRhYmFzZSwgIkRhdGFiYXNlIGNsZWFudXAgaXMgbm93IEVOQUJMRUQiKTsKLX0KKyAgICBS
RUxFQVNFX0FTU0VSVChtX2RiLmlzT3BlbigpKTsKKyAgICBSRUxFQVNFX0FTU0VSVChtX2FsbG93
RGF0YWJhc2VXcml0ZSA9PSBBbGxvd0RhdGFiYXNlV3JpdGU6Olllcyk7CiAKLXZvaWQgSWNvbkRh
dGFiYXNlOjpjaGVja0ludGVncml0eUJlZm9yZU9wZW5pbmcoKQotewotICAgIGNoZWNrSW50ZWdy
aXR5T25PcGVuID0gdHJ1ZTsKLX0KKyAgICBpZiAoIW1fdXBkYXRlSWNvblRpbWVzdGFtcFN0YXRl
bWVudCkgeworICAgICAgICBtX3VwZGF0ZUljb25UaW1lc3RhbXBTdGF0ZW1lbnQgPSBtYWtlVW5p
cXVlPFNRTGl0ZVN0YXRlbWVudD4obV9kYiwgIlVQREFURSBJY29uSW5mbyBTRVQgc3RhbXAgPSA/
IFdIRVJFIGljb25JRCA9ID87Iik7CisgICAgICAgIGlmIChtX3VwZGF0ZUljb25UaW1lc3RhbXBT
dGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJP
UigiUHJlcGFyaW5nIHN0YXRlbWVudCB1cGRhdGVJY29uVGltZXN0YW1wIGZhaWxlZCIpOworICAg
ICAgICAgICAgbV91cGRhdGVJY29uVGltZXN0YW1wU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KIAotSWNvbkRhdGFiYXNlOjpJY29uRGF0
YWJhc2UoKQotICAgIDogbV9zeW5jVGltZXIoUnVuTG9vcDo6bWFpbigpLCB0aGlzLCAmSWNvbkRh
dGFiYXNlOjpzeW5jVGltZXJGaXJlZCkKLSAgICAsIG1fY2xpZW50KGRlZmF1bHRDbGllbnQoKSkK
LXsKLSAgICBMT0coSWNvbkRhdGFiYXNlLCAiQ3JlYXRpbmcgSWNvbkRhdGFiYXNlICVwIiwgdGhp
cyk7Ci0gICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLX0KKyAgICBpZiAobV91cGRhdGVJY29u
VGltZXN0YW1wU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgdGltZXN0YW1wKSAhPSBTUUxJVEVfT0sg
fHwgbV91cGRhdGVJY29uVGltZXN0YW1wU3RhdGVtZW50LT5iaW5kSW50NjQoMiwgaWNvbklEKSAh
PSBTUUxJVEVfT0spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJJY29uRGF0YWJhc2U6OnVwZGF0ZUlj
b25UaW1lc3RhbXAgZmFpbGVkOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICBy
ZXR1cm47CisgICAgfQogCi1JY29uRGF0YWJhc2U6On5JY29uRGF0YWJhc2UoKQotewotICAgIEFT
U0VSVCghaXNPcGVuKCkpOworICAgIG1fdXBkYXRlSWNvblRpbWVzdGFtcFN0YXRlbWVudC0+c3Rl
cCgpOworICAgIG1fdXBkYXRlSWNvblRpbWVzdGFtcFN0YXRlbWVudC0+cmVzZXQoKTsKIH0KIAot
dm9pZCBJY29uRGF0YWJhc2U6Ondha2VTeW5jVGhyZWFkKCkKK3ZvaWQgSWNvbkRhdGFiYXNlOjpk
ZWxldGVJY29uKGludDY0X3QgaWNvbklEKQogewotICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fc3lu
Y0xvY2spOwotCi0gICAgbV9zeW5jVGhyZWFkSGFzV29ya1RvRG8gPSB0cnVlOwotICAgIG1fc3lu
Y0NvbmRpdGlvbi5ub3RpZnlPbmUoKTsKLX0KKyAgICBSRUxFQVNFX0FTU0VSVChtX2RiLmlzT3Bl
bigpKTsKKyAgICBSRUxFQVNFX0FTU0VSVChtX2FsbG93RGF0YWJhc2VXcml0ZSA9PSBBbGxvd0Rh
dGFiYXNlV3JpdGU6Olllcyk7CiAKLXZvaWQgSWNvbkRhdGFiYXNlOjpzY2hlZHVsZU9yRGVmZXJT
eW5jVGltZXIoKQotewotICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKKyAgICBpZiAoIW1f
ZGVsZXRlUGFnZVVSTHNGb3JJY29uU3RhdGVtZW50KSB7CisgICAgICAgIG1fZGVsZXRlUGFnZVVS
THNGb3JJY29uU3RhdGVtZW50ID0gbWFrZVVuaXF1ZTxTUUxpdGVTdGF0ZW1lbnQ+KG1fZGIsICJE
RUxFVEUgRlJPTSBQYWdlVVJMIFdIRVJFIFBhZ2VVUkwuaWNvbklEID0gKD8pOyIpOworICAgICAg
ICBpZiAobV9kZWxldGVQYWdlVVJMc0Zvckljb25TdGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBTUUxJ
VEVfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiUHJlcGFyaW5nIHN0YXRlbWVudCBkZWxl
dGVQYWdlVVJMc0Zvckljb24gZmFpbGVkIik7CisgICAgICAgICAgICBtX2RlbGV0ZVBhZ2VVUkxz
Rm9ySWNvblN0YXRlbWVudCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICB9CisgICAgaWYgKCFtX2RlbGV0ZUljb25EYXRhU3RhdGVtZW50KSB7CisgICAgICAg
IG1fZGVsZXRlSWNvbkRhdGFTdGF0ZW1lbnQgPSBtYWtlVW5pcXVlPFNRTGl0ZVN0YXRlbWVudD4o
bV9kYiwgIkRFTEVURSBGUk9NIEljb25EYXRhIFdIRVJFIEljb25EYXRhLmljb25JRCA9ICg/KTsi
KTsKKyAgICAgICAgaWYgKG1fZGVsZXRlSWNvbkRhdGFTdGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBT
UUxJVEVfT0spIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiUHJlcGFyaW5nIHN0YXRlbWVudCBk
ZWxldGVJY29uIGZhaWxlZCIpOworICAgICAgICAgICAgbV9kZWxldGVJY29uRGF0YVN0YXRlbWVu
dCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAg
aWYgKCFtX2RlbGV0ZUljb25TdGF0ZW1lbnQpIHsKKyAgICAgICAgbV9kZWxldGVJY29uU3RhdGVt
ZW50ID0gbWFrZVVuaXF1ZTxTUUxpdGVTdGF0ZW1lbnQ+KG1fZGIsICJERUxFVEUgRlJPTSBJY29u
SW5mbyBXSEVSRSBJY29uSW5mby5pY29uSUQgPSAoPyk7Iik7CisgICAgICAgIGlmIChtX2RlbGV0
ZUljb25TdGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIExP
R19FUlJPUigiUHJlcGFyaW5nIHN0YXRlbWVudCBkZWxldGVJY29uIGZhaWxlZCIpOworICAgICAg
ICAgICAgbV9kZWxldGVJY29uU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgIH0KIAotICAgIGlmIChtX3NjaGVkdWxlT3JEZWZlclN5bmNUaW1l
clJlcXVlc3RlZCkKKyAgICBpZiAobV9kZWxldGVQYWdlVVJMc0Zvckljb25TdGF0ZW1lbnQtPmJp
bmRJbnQ2NCgxLCBpY29uSUQpICE9IFNRTElURV9PSworICAgICAgICB8fCBtX2RlbGV0ZUljb25E
YXRhU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKSAhPSBTUUxJVEVfT0sKKyAgICAgICAg
fHwgbV9kZWxldGVJY29uU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKSAhPSBTUUxJVEVf
T0spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJJY29uRGF0YWJhc2U6OmRlbGV0ZUljb24gZmFpbGVk
OiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOwogICAgICAgICByZXR1cm47CisgICAgfQogCi0g
ICAgbV9zY2hlZHVsZU9yRGVmZXJTeW5jVGltZXJSZXF1ZXN0ZWQgPSB0cnVlOwotICAgIGNhbGxP
bk1haW5UaHJlYWQoW3RoaXNdIHsKLSAgICAgICAgbV9zeW5jVGltZXIuc3RhcnRPbmVTaG90KHVw
ZGF0ZVRpbWVyRGVsYXkpOwotICAgICAgICBtX3NjaGVkdWxlT3JEZWZlclN5bmNUaW1lclJlcXVl
c3RlZCA9IGZhbHNlOworICAgIG1fZGVsZXRlUGFnZVVSTHNGb3JJY29uU3RhdGVtZW50LT5zdGVw
KCk7CisgICAgbV9kZWxldGVJY29uRGF0YVN0YXRlbWVudC0+c3RlcCgpOworICAgIG1fZGVsZXRl
SWNvblN0YXRlbWVudC0+c3RlcCgpOworCisgICAgbV9kZWxldGVQYWdlVVJMc0Zvckljb25TdGF0
ZW1lbnQtPnJlc2V0KCk7CisgICAgbV9kZWxldGVJY29uRGF0YVN0YXRlbWVudC0+cmVzZXQoKTsK
KyAgICBtX2RlbGV0ZUljb25TdGF0ZW1lbnQtPnJlc2V0KCk7Cit9CisKK3ZvaWQgSWNvbkRhdGFi
YXNlOjpjaGVja0ljb25VUkxBbmRTZXRQYWdlVVJMSWZOZWVkZWQoY29uc3QgU3RyaW5nJiBpY29u
VVJMLCBjb25zdCBTdHJpbmcmIHBhZ2VVUkwsIEFsbG93RGF0YWJhc2VXcml0ZSBhbGxvd0RhdGFi
YXNlV3JpdGUsIENvbXBsZXRpb25IYW5kbGVyPHZvaWQoYm9vbCwgYm9vbCk+JiYgY29tcGxldGlv
bkhhbmRsZXIpCit7CisgICAgbV93b3JrUXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRU
aGlzID0gbWFrZVJlZigqdGhpcyksIGljb25VUkwgPSBpY29uVVJMLmlzb2xhdGVkQ29weSgpLCBw
YWdlVVJMID0gcGFnZVVSTC5pc29sYXRlZENvcHkoKSwgYWxsb3dEYXRhYmFzZVdyaXRlLCBjb21w
bGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgewor
ICAgICAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxz
ZTsKKyAgICAgICAgaWYgKG1fZGIuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIGJvb2wgY2FuV3Jp
dGVUb0RhdGFiYXNlID0gbV9hbGxvd0RhdGFiYXNlV3JpdGUgPT0gQWxsb3dEYXRhYmFzZVdyaXRl
OjpZZXMgJiYgYWxsb3dEYXRhYmFzZVdyaXRlID09IEFsbG93RGF0YWJhc2VXcml0ZTo6WWVzOwor
ICAgICAgICAgICAgYm9vbCBleHBpcmVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobV9wYWdl
VVJMVG9JY29uVVJMTWFwLmdldChwYWdlVVJMKSA9PSBpY29uVVJMKQorICAgICAgICAgICAgICAg
IHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICBlbHNlIGlmIChhdXRvIGljb25JRCA9IGljb25J
REZvckljb25VUkwoaWNvblVSTCwgZXhwaXJlZCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhw
aXJlZCAmJiBjYW5Xcml0ZVRvRGF0YWJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU1FMaXRl
VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24obV9kYik7CisgICAgICAgICAgICAgICAgICAgIHRyYW5z
YWN0aW9uLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUljb24oaWNvbklELnZh
bHVlKCkpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICAg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwor
ICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbldyaXRlVG9EYXRhYmFzZSB8fCBzZXRJY29uSURG
b3JQYWdlVVJMKGljb25JRC52YWx1ZSgpLCBwYWdlVVJMKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgbV9wYWdlVVJMVG9JY29uVVJMTWFwLnNldChwYWdlVVJMLCBpY29uVVJMKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghY2FuV3JpdGVUb0Rh
dGFiYXNlICYmIG1fbG9hZGVkSWNvbnMuY29udGFpbnMoaWNvblVSTCkpIHsKKyAgICAgICAgICAg
ICAgICAvLyBGb3VuZCBpbiBtZW1vcnkgY2FjaGUuCisgICAgICAgICAgICAgICAgcmVzdWx0ID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICBtX3BhZ2VVUkxUb0ljb25VUkxNYXAuc2V0KHBhZ2VVUkws
IGljb25VUkwpOworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICAgIHN0YXJ0UHJ1bmVUaW1lcigpOworICAgICAgICBSdW5Mb29w
OjptYWluKCkuZGlzcGF0Y2goW3Jlc3VsdCwgY2hhbmdlZCwgY29tcGxldGlvbkhhbmRsZXIgPSBX
VEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgICAgIGNvbXBs
ZXRpb25IYW5kbGVyKHJlc3VsdCwgY2hhbmdlZCk7CisgICAgICAgIH0pOwogICAgIH0pOwogfQog
Ci12b2lkIEljb25EYXRhYmFzZTo6c3luY1RpbWVyRmlyZWQoKQordm9pZCBJY29uRGF0YWJhc2U6
OmxvYWRJY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VVUkwsIEFsbG93RGF0YWJhc2VX
cml0ZSBhbGxvd0RhdGFiYXNlV3JpdGUsIENvbXBsZXRpb25IYW5kbGVyPHZvaWQoTmF0aXZlSW1h
Z2VQdHImJik+JiYgY29tcGxldGlvbkhhbmRsZXIpCiB7Ci0gICAgQVNTRVJUX05PVF9TWU5DX1RI
UkVBRCgpOwotICAgIHdha2VTeW5jVGhyZWFkKCk7Ci19CisgICAgbV93b3JrUXVldWUtPmRpc3Bh
dGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHBhZ2VVUkwgPSBwYWdl
VVJMLmlzb2xhdGVkQ29weSgpLCBhbGxvd0RhdGFiYXNlV3JpdGUsIHRpbWVzdGFtcCA9IFdhbGxU
aW1lOjpub3coKS5zZWNvbmRzU2luY2VFcG9jaCgpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1v
dmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICBPcHRpb25hbDxpbnQ2
NF90PiBpY29uSUQ7CisgICAgICAgIFZlY3RvcjxjaGFyPiBpY29uRGF0YTsKKyAgICAgICAgYXV0
byBpY29uVVJMID0gbV9wYWdlVVJMVG9JY29uVVJMTWFwLmdldChwYWdlVVJMKTsKKyAgICAgICAg
aWYgKG1fZGIuaXNPcGVuKCkgJiYgIWljb25VUkwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBi
b29sIGV4cGlyZWQ7CisgICAgICAgICAgICBpY29uSUQgPSBpY29uSURGb3JJY29uVVJMKGljb25V
UkwsIGV4cGlyZWQpOworICAgICAgICAgICAgaWYgKGljb25JRCAmJiAhbV9sb2FkZWRJY29ucy5j
b250YWlucyhpY29uVVJMKSkgeworICAgICAgICAgICAgICAgIGljb25EYXRhID0gdGhpcy0+aWNv
bkRhdGEoaWNvbklELnZhbHVlKCkpOworICAgICAgICAgICAgICAgIG1fbG9hZGVkSWNvbnMuc2V0
KGljb25VUkwsIHN0ZDo6bWFrZV9wYWlyPE5hdGl2ZUltYWdlUHRyLCBNb25vdG9uaWNUaW1lPihu
dWxscHRyLCB7IH0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgY2FuV3JpdGVU
b0RhdGFiYXNlID0gbV9hbGxvd0RhdGFiYXNlV3JpdGUgPT0gQWxsb3dEYXRhYmFzZVdyaXRlOjpZ
ZXMgJiYgYWxsb3dEYXRhYmFzZVdyaXRlID09IEFsbG93RGF0YWJhc2VXcml0ZTo6WWVzOworICAg
ICAgICAgICAgaWYgKGljb25JRCAmJiBjYW5Xcml0ZVRvRGF0YWJhc2UpCisgICAgICAgICAgICAg
ICAgdXBkYXRlSWNvblRpbWVzdGFtcChpY29uSUQudmFsdWUoKSwgdGltZXN0YW1wLnNlY29uZHNB
czxpbnQ2NF90PigpKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydFBydW5lVGltZXIoKTsKKyAg
ICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFr
ZVJlZigqdGhpcyksIGljb25VUkwgPSBXVEZNb3ZlKGljb25VUkwpLCBpY29uRGF0YSA9IFdURk1v
dmUoaWNvbkRhdGEpLCBjb21wbGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRs
ZXIpXSgpIG11dGFibGUgeworICAgICAgICAgICAgaWYgKGljb25VUkwuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIobnVsbHB0cik7CisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0vLyAqKioqKioqKioqKioqKioqKioKLS8vICoq
KiBBbnkgVGhyZWFkICoqKgotLy8gKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICBhdXRv
IGl0ID0gbV9sb2FkZWRJY29ucy5maW5kKGljb25VUkwpOworICAgICAgICAgICAgaWYgKGl0ICE9
IG1fbG9hZGVkSWNvbnMuZW5kKCkgJiYgaXQtPnZhbHVlLmZpcnN0KSB7CisgICAgICAgICAgICAg
ICAgYXV0byBpY29uID0gaXQtPnZhbHVlLmZpcnN0OworICAgICAgICAgICAgICAgIGl0LT52YWx1
ZS5zZWNvbmQgPSBNb25vdG9uaWNUaW1lOjpub3coKTsKKyAgICAgICAgICAgICAgICBzdGFydENs
ZWFyTG9hZGVkSWNvbnNUaW1lcigpOworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVy
KFdURk1vdmUoaWNvbikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0K
IAotYm9vbCBJY29uRGF0YWJhc2U6OmlzT3BlbigpIGNvbnN0Ci17Ci0gICAgTG9ja0hvbGRlciBs
b2NrZXIobV9zeW5jTG9jayk7Ci0gICAgcmV0dXJuIG1fc3luY1RocmVhZFJ1bm5pbmcgfHwgbV9z
eW5jREIuaXNPcGVuKCk7Ci19CisgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IG1fbG9hZGVk
SWNvbnMuc2V0KGljb25VUkwsIHN0ZDo6bWFrZV9wYWlyPE5hdGl2ZUltYWdlUHRyLCBNb25vdG9u
aWNUaW1lPihudWxscHRyLCBNb25vdG9uaWNUaW1lOjpub3coKSkpOworICAgICAgICAgICAgaWYg
KCFpY29uRGF0YS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGltYWdlID0gQml0
bWFwSW1hZ2U6OmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+c2V0RGF0YShT
aGFyZWRCdWZmZXI6OmNyZWF0ZShXVEZNb3ZlKGljb25EYXRhKSksIHRydWUpIDwgRW5jb2RlZERh
dGFTdGF0dXM6OlNpemVBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGlv
bkhhbmRsZXIobnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkUmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS5maXJz
dCA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgICAgICAgICAgfQog
Ci1TdHJpbmcgSWNvbkRhdGFiYXNlOjpkYXRhYmFzZVBhdGgoKSBjb25zdAotewotICAgIExvY2tI
b2xkZXIgbG9ja2VyKG1fc3luY0xvY2spOwotICAgIHJldHVybiBtX2NvbXBsZXRlRGF0YWJhc2VQ
YXRoLmlzb2xhdGVkQ29weSgpOworICAgICAgICAgICAgYXV0byBpY29uID0gYWRkUmVzdWx0Lml0
ZXJhdG9yLT52YWx1ZS5maXJzdDsKKyAgICAgICAgICAgIHN0YXJ0Q2xlYXJMb2FkZWRJY29uc1Rp
bWVyKCk7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihXVEZNb3ZlKGljb24pKTsKKyAg
ICAgICAgfSk7CisgICAgfSk7CiB9CiAKLVN0cmluZyBJY29uRGF0YWJhc2U6OmRlZmF1bHREYXRh
YmFzZUZpbGVuYW1lKCkKK1N0cmluZyBJY29uRGF0YWJhc2U6Omljb25VUkxGb3JQYWdlVVJMKGNv
bnN0IFN0cmluZyYgcGFnZVVSTCkKIHsKLSAgICBzdGF0aWMgTmV2ZXJEZXN0cm95ZWQ8U3RyaW5n
PiBkZWZhdWx0RGF0YWJhc2VGaWxlbmFtZShNQUtFX1NUQVRJQ19TVFJJTkdfSU1QTCgiV2VicGFn
ZUljb25zLmRiIikpOwotICAgIHJldHVybiBkZWZhdWx0RGF0YWJhc2VGaWxlbmFtZS5nZXQoKS5p
c29sYXRlZENvcHkoKTsKKyAgICByZXR1cm4gbV9wYWdlVVJMVG9JY29uVVJMTWFwLmdldChwYWdl
VVJMKTsKIH0KIAotLy8gVW5saWtlIGdldE9yQ3JlYXRlUGFnZVVSTFJlY29yZCgpLCBnZXRPckNy
ZWF0ZUljb25SZWNvcmQoKSBkb2VzIG5vdCBtYXJrIHRoZSBpY29uIGFzICJpbnRlcmVzdGVkIGlu
IGltcG9ydCIKLVJlZjxJY29uRGF0YWJhc2U6Okljb25SZWNvcmQ+IEljb25EYXRhYmFzZTo6Z2V0
T3JDcmVhdGVJY29uUmVjb3JkKGNvbnN0IFN0cmluZyYgaWNvblVSTCkKK3ZvaWQgSWNvbkRhdGFi
YXNlOjpzZXRJY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIGljb25VUkwsIGNvbnN0IHVuc2ln
bmVkIGNoYXIqIGljb25EYXRhLCBzaXplX3QgaWNvbkRhdGFTaXplLCBjb25zdCBTdHJpbmcmIHBh
Z2VVUkwsIEFsbG93RGF0YWJhc2VXcml0ZSBhbGxvd0RhdGFiYXNlV3JpdGUsIENvbXBsZXRpb25I
YW5kbGVyPHZvaWQoYm9vbCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCiB7Ci0gICAgLy8gQ2xpZW50
cyBvZiBnZXRPckNyZWF0ZUljb25SZWNvcmQoKSBhcmUgcmVxdWlyZWQgdG8gYWNxdWlyZSB0aGUg
bV91cmxBbmRJY29uTG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZAotICAgIEFTU0VSVCgh
bV91cmxBbmRJY29uTG9jay50cnlMb2NrKCkpOworICAgIC8vIElmIGRhdGFiYXNlIHdyaXRlIGlz
IG5vdCBhbGxvd2VkIGxvYWQgdGhlIGljb24gdG8gY2FjaGUgaXQgaW4gbWVtb3J5IG9ubHkuCisg
ICAgaWYgKG1fYWxsb3dEYXRhYmFzZVdyaXRlID09IEFsbG93RGF0YWJhc2VXcml0ZTo6Tm8gfHwg
YWxsb3dEYXRhYmFzZVdyaXRlID09IEFsbG93RGF0YWJhc2VXcml0ZTo6Tm8pIHsKKyAgICAgICAg
Ym9vbCByZXN1bHQgPSB0cnVlOworICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IG1fbG9hZGVkSWNv
bnMuc2V0KGljb25VUkwsIHN0ZDo6bWFrZV9wYWlyPE5hdGl2ZUltYWdlUHRyLCBNb25vdG9uaWNU
aW1lPihudWxscHRyLCB7IH0pKTsKKyAgICAgICAgaWYgKGljb25EYXRhU2l6ZSkgeworICAgICAg
ICAgICAgYXV0byBpbWFnZSA9IEJpdG1hcEltYWdlOjpjcmVhdGUoKTsKKyAgICAgICAgICAgIGlm
IChpbWFnZS0+c2V0RGF0YShTaGFyZWRCdWZmZXI6OmNyZWF0ZShpY29uRGF0YSwgaWNvbkRhdGFT
aXplKSwgdHJ1ZSkgPCBFbmNvZGVkRGF0YVN0YXR1czo6U2l6ZUF2YWlsYWJsZSkKKyAgICAgICAg
ICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICBhZGRSZXN1bHQuaXRlcmF0b3ItPnZhbHVlLmZpcnN0ID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9y
Q3VycmVudEZyYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRDbGVhckxvYWRlZEljb25z
VGltZXIoKTsKKyAgICAgICAgbV93b3JrUXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRU
aGlzID0gbWFrZVJlZigqdGhpcyksIHJlc3VsdCwgaWNvblVSTCA9IGljb25VUkwuaXNvbGF0ZWRD
b3B5KCksIHBhZ2VVUkwgPSBwYWdlVVJMLmlzb2xhdGVkQ29weSgpLCBjb21wbGV0aW9uSGFuZGxl
ciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICAgICAg
bV9wYWdlVVJMVG9JY29uVVJMTWFwLnNldChwYWdlVVJMLCBpY29uVVJMKTsKKyAgICAgICAgICAg
IFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbcmVzdWx0LCBjb21wbGV0aW9uSGFuZGxlciA9IFdU
Rk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSgpIG11dGFibGUgeworICAgICAgICAgICAgICAgIGNv
bXBsZXRpb25IYW5kbGVyKHJlc3VsdCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICBpZiAoYXV0byogaWNvbiA9IG1faWNvblVSTFRv
UmVjb3JkTWFwLmdldChpY29uVVJMKSkKLSAgICAgICAgcmV0dXJuICppY29uOworICAgIFZlY3Rv
cjxjaGFyPiBkYXRhOworICAgIGRhdGEucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShpY29uRGF0YVNp
emUpOworICAgIGRhdGEuYXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGljb25E
YXRhKSwgaWNvbkRhdGFTaXplKTsKKyAgICBtX3dvcmtRdWV1ZS0+ZGlzcGF0Y2goW3RoaXMsIHBy
b3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgaWNvblVSTCA9IGljb25VUkwuaXNvbGF0ZWRD
b3B5KCksIGljb25EYXRhID0gV1RGTW92ZShkYXRhKSwgcGFnZVVSTCA9IHBhZ2VVUkwuaXNvbGF0
ZWRDb3B5KCksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcild
KCkgbXV0YWJsZSB7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIGlmICht
X2RiLmlzT3BlbigpKSB7CisgICAgICAgICAgICBTUUxpdGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlv
bihtX2RiKTsKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLmJlZ2luKCk7CisKKyAgICAgICAgICAg
IGJvb2wgZXhwaXJlZCA9IGZhbHNlOworICAgICAgICAgICAgYXV0byBpY29uSUQgPSBpY29uSURG
b3JJY29uVVJMKGljb25VUkwsIGV4cGlyZWQpOworICAgICAgICAgICAgaWYgKCFpY29uSUQpCisg
ICAgICAgICAgICAgICAgaWNvbklEID0gYWRkSWNvbihpY29uVVJMLCBpY29uRGF0YSk7CisKKyAg
ICAgICAgICAgIGlmIChpY29uSUQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwor
ICAgICAgICAgICAgICAgIGlmIChzZXRJY29uSURGb3JQYWdlVVJMKGljb25JRC52YWx1ZSgpLCBw
YWdlVVJMKSkKKyAgICAgICAgICAgICAgICAgICAgbV9wYWdlVVJMVG9JY29uVVJMTWFwLnNldChw
YWdlVVJMLCBpY29uVVJMKTsKKyAgICAgICAgICAgIH0KIAotICAgIGF1dG8gbmV3SWNvbiA9IElj
b25SZWNvcmQ6OmNyZWF0ZShpY29uVVJMKTsKLSAgICBtX2ljb25VUkxUb1JlY29yZE1hcC5zZXQo
aWNvblVSTCwgbmV3SWNvbi5wdHIoKSk7Ci0gICAgcmV0dXJuIG5ld0ljb247CisgICAgICAgICAg
ICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydFBydW5lVGlt
ZXIoKTsKKyAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFtyZXN1bHQsIGNvbXBsZXRp
b25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CisgICAg
ICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihyZXN1bHQpOworICAgICAgICB9KTsKKyAgICB9KTsK
IH0KIAotLy8gVGhpcyBtZXRob2QgcmV0cmlldmVzIHRoZSBleGlzdGluZyBQYWdlVVJMUmVjb3Jk
LCBvciBjcmVhdGVzIGEgbmV3IG9uZSBhbmQgbWFya3MgaXQgYXMgImludGVyZXN0ZWQgaW4gdGhl
IGltcG9ydCIgZm9yIGxhdGVyIG5vdGlmaWNhdGlvbgotSWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVj
b3JkKiBJY29uRGF0YWJhc2U6OmdldE9yQ3JlYXRlUGFnZVVSTFJlY29yZChjb25zdCBTdHJpbmcm
IHBhZ2VVUkwpCit2b2lkIEljb25EYXRhYmFzZTo6Y2xlYXIoQ29tcGxldGlvbkhhbmRsZXI8dm9p
ZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQogewotICAgIC8vIENsaWVudHMgb2YgZ2V0T3JDcmVh
dGVQYWdlVVJMUmVjb3JkKCkgYXJlIHJlcXVpcmVkIHRvIGFjcXVpcmUgdGhlIG1fdXJsQW5kSWNv
bkxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QKLSAgICBBU1NFUlQoIW1fdXJsQW5kSWNv
bkxvY2sudHJ5TG9jaygpKTsKKyAgICBtX2xvYWRlZEljb25zLmNsZWFyKCk7CisgICAgbV93b3Jr
UXVldWUtPmRpc3BhdGNoKFt0aGlzLCBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGNv
bXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7
CisgICAgICAgIG1fcGFnZVVSTFRvSWNvblVSTE1hcC5jbGVhcigpOwogCi0gICAgaWYgKCFkb2N1
bWVudENhbkhhdmVJY29uKHBhZ2VVUkwpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAg
ICAgaWYgKG1fZGIuaXNPcGVuKCkgJiYgbV9hbGxvd0RhdGFiYXNlV3JpdGUgPT0gQWxsb3dEYXRh
YmFzZVdyaXRlOjpZZXMpIHsKKyAgICAgICAgICAgIG1fcGFnZVVSTFRvSWNvblVSTE1hcC5jbGVh
cigpOwogCi0gICAgUGFnZVVSTFJlY29yZCogcGFnZVJlY29yZCA9IG1fcGFnZVVSTFRvUmVjb3Jk
TWFwLmdldChwYWdlVVJMKTsKLQotICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1JlYWRp
bmdMb2NrKTsKLSAgICBpZiAoIW1faWNvblVSTEltcG9ydENvbXBsZXRlKSB7Ci0gICAgICAgIC8v
IElmIHRoZSBpbml0aWFsIGltcG9ydCBvZiBhbGwgVVJMcyBoYXNuJ3QgY29tcGxldGVkIGFuZCB3
ZSBoYXZlIG5vIHBhZ2UgcmVjb3JkLCB3ZSBhc3N1bWUgd2UgKm1pZ2h0KiBrbm93IGFib3V0IHRo
aXMgbGF0ZXIgYW5kIGNyZWF0ZSBhIHJlY29yZCBmb3IgaXQKLSAgICAgICAgaWYgKCFwYWdlUmVj
b3JkKSB7Ci0gICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiQ3JlYXRpbmcgbmV3IFBhZ2VV
UkxSZWNvcmQgZm9yIHBhZ2VVUkwgJXMiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkwpLmFzY2lpKCku
ZGF0YSgpKTsKLSAgICAgICAgICAgIHBhZ2VSZWNvcmQgPSBuZXcgUGFnZVVSTFJlY29yZChwYWdl
VVJMKTsKLSAgICAgICAgICAgIG1fcGFnZVVSTFRvUmVjb3JkTWFwLnNldChwYWdlVVJMLCBwYWdl
UmVjb3JkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBwYWdlUmVjb3JkIGZvciB0
aGlzIHBhZ2UgZG9lcyBub3QgaGF2ZSBhbiBpY29uUmVjb3JkIGF0dGFjaGVkIHRvIGl0LCB0aGVu
IGl0IGlzIGEgbmV3IHBhZ2VSZWNvcmQgc3RpbGwgYXdhaXRpbmcgdGhlIGluaXRpYWwgaW1wb3J0
Ci0gICAgICAgIC8vIE1hcmsgdGhlIFVSTCBhcyAiaW50ZXJlc3RlZCBpbiB0aGUgcmVzdWx0IG9m
IHRoZSBpbXBvcnQiIHRoZW4gYmFpbAotICAgICAgICBpZiAoIXBhZ2VSZWNvcmQtPmljb25SZWNv
cmQoKSkgewotICAgICAgICAgICAgbV9wYWdlVVJMc1BlbmRpbmdJbXBvcnQuYWRkKHBhZ2VVUkwp
OwotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAv
LyBXZSd2ZSBkb25lIHRoZSBpbml0aWFsIGltcG9ydCBvZiBhbGwgVVJMcyBrbm93biBpbiB0aGUg
ZGF0YWJhc2UuIElmIHRoaXMgcmVjb3JkIGRvZXNuJ3QgZXhpc3Qgbm93LCBpdCBuZXZlciB3aWxs
Ci0gICAgcmV0dXJuIHBhZ2VSZWNvcmQ7Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioq
KioqCi0vLyAqKiogU3luYyBUaHJlYWQgT25seSAqKioKLS8vICoqKioqKioqKioqKioqKioqKioq
KioqKgotCi1ib29sIEljb25EYXRhYmFzZTo6c2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkgY29u
c3QKLXsKLSAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOwotCi0gICAgcmV0dXJuIG1fdGhy
ZWFkVGVybWluYXRpb25SZXF1ZXN0ZWQgfHwgbV9yZW1vdmVJY29uc1JlcXVlc3RlZDsKLX0KLQot
dm9pZCBJY29uRGF0YWJhc2U6Omljb25EYXRhYmFzZVN5bmNUaHJlYWQoKQotewotICAgIC8vIFRo
ZSBjYWxsIHRvIGNyZWF0ZSB0aGlzIHRocmVhZCBtaWdodCBub3QgY29tcGxldGUgYmVmb3JlIHRo
ZSB0aHJlYWQgYWN0dWFsbHkgc3RhcnRzLCBzbyB3ZSBtaWdodCBmYWlsIHRoaXMgQVNTRVJUX0lD
T05fU1lOQ19USFJFQUQoKSBiZWNhdXNlIHRoZSBwb2ludGVyCi0gICAgLy8gdG8gb3VyIHRocmVh
ZCBzdHJ1Y3R1cmUgaGFzbid0IGJlZW4gZmlsbGVkIGluIHlldC4KLSAgICAvLyBUbyBmaXggdGhp
cywgdGhlIG1haW4gdGhyZWFkIGFjcXVpcmVzIHRoaXMgbG9jayBiZWZvcmUgY3JlYXRpbmcgdXMs
IHRoZW4gcmVsZWFzZXMgdGhlIGxvY2sgYWZ0ZXIgY3JlYXRpb24gaXMgY29tcGxldGUuIEEgcXVp
Y2sgbG9jay91bmxvY2sgY3ljbGUgaGVyZSB3aWxsCi0gICAgLy8gcHJldmVudCB1cyBmcm9tIHJ1
bm5pbmcgYmVmb3JlIHRoYXQgY2FsbCBjb21wbGV0ZXMKLSAgICBtX3N5bmNMb2NrLmxvY2soKTsK
LSAgICBtX3N5bmNMb2NrLnVubG9jaygpOwotCi0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQo
KTsKLQotICAgIExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBJY29uRGF0YWJhc2Ugc3luYyB0
aHJlYWQgc3RhcnRlZCIpOwotCi0jaWYgIUxPR19ESVNBQkxFRAotICAgIE1vbm90b25pY1RpbWUg
c3RhcnRUaW1lID0gTW9ub3RvbmljVGltZTo6bm93KCk7Ci0jZW5kaWYKLQotICAgIC8vIE5lZWQg
dG8gY3JlYXRlIHRoZSBkYXRhYmFzZSBwYXRoIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdAot
ICAgIEZpbGVTeXN0ZW06Om1ha2VBbGxEaXJlY3RvcmllcyhtX2RhdGFiYXNlRGlyZWN0b3J5KTsK
LQotICAgIC8vIEV4aXN0ZW5jZSBvZiBhIGpvdXJuYWwgZmlsZSBpcyBldmlkZW5jZSBvZiBhIHBy
ZXZpb3VzIGNyYXNoL2ZvcmNlIHF1aXQgYW5kIGF1dG9tYXRpY2FsbHkgcXVhbGlmaWVzCi0gICAg
Ly8gdXMgdG8gZG8gYW4gaW50ZWdyaXR5IGNoZWNrCi0gICAgU3RyaW5nIGpvdXJuYWxGaWxlbmFt
ZSA9IG1fY29tcGxldGVEYXRhYmFzZVBhdGggKyAiLWpvdXJuYWwiOwotICAgIGlmICghY2hlY2tJ
bnRlZ3JpdHlPbk9wZW4pCi0gICAgICAgIGNoZWNrSW50ZWdyaXR5T25PcGVuID0gRmlsZVN5c3Rl
bTo6ZmlsZUV4aXN0cyhqb3VybmFsRmlsZW5hbWUpOwotCi0gICAgewotICAgICAgICBMb2NrSG9s
ZGVyIGxvY2tlcihtX3N5bmNMb2NrKTsKLSAgICAgICAgaWYgKCFtX3N5bmNEQi5vcGVuKG1fY29t
cGxldGVEYXRhYmFzZVBhdGgpKSB7Ci0gICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBv
cGVuIGljb24gZGF0YWJhc2UgYXQgcGF0aCAlcyAtICVzIiwgbV9jb21wbGV0ZURhdGFiYXNlUGF0
aC5hc2NpaSgpLmRhdGEoKSwgbV9zeW5jREIubGFzdEVycm9yTXNnKCkpOwotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rp
dml0eSgpKSB7Ci0gICAgICAgIHN5bmNUaHJlYWRNYWluTG9vcCgpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0jaWYgIUxPR19ESVNBQkxFRAotICAgIE1vbm90b25pY1RpbWUgdGltZVN0YW1w
ID0gTW9ub3RvbmljVGltZTo6bm93KCk7Ci0gICAgU2Vjb25kcyBkZWx0YSA9IHRpbWVTdGFtcCAt
IHN0YXJ0VGltZTsKLSAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkgT3BlbiB0b29rICUu
NGYgc2Vjb25kcyIsIGRlbHRhLnZhbHVlKCkpOwotI2VuZGlmCi0KLSAgICBwZXJmb3JtT3Blbklu
aXRpYWxpemF0aW9uKCk7Ci0gICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKSB7Ci0g
ICAgICAgIHN5bmNUaHJlYWRNYWluTG9vcCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0j
aWYgIUxPR19ESVNBQkxFRAotICAgIE1vbm90b25pY1RpbWUgbmV3U3RhbXAgPSBNb25vdG9uaWNU
aW1lOjpub3coKTsKLSAgICBTZWNvbmRzIHRvdGFsRGVsdGEgPSBuZXdTdGFtcCAtIHN0YXJ0VGlt
ZTsKLSAgICBkZWx0YSA9IG5ld1N0YW1wIC0gdGltZVN0YW1wOwotICAgIExPRyhJY29uRGF0YWJh
c2UsICIoVEhSRUFEKSBwZXJmb3JtT3BlbkluaXRpYWxpemF0aW9uKCkgdG9vayAlLjRmIHNlY29u
ZHMsIG5vdyAlLjRmIHNlY29uZHMgZnJvbSB0aHJlYWQgc3RhcnQiLCBkZWx0YS52YWx1ZSgpLCB0
b3RhbERlbHRhLnZhbHVlKCkpOwotICAgIHRpbWVTdGFtcCA9IG5ld1N0YW1wOwotI2VuZGlmCi0K
LSAgICAvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHNpbXVsYXRlIGEgbG9uZyBs
YXN0aW5nIFVSTCBpbXBvcnQgKCpIVUdFKiBpY29uIGRhdGFiYXNlcywgb3IgbmV0d29yayBob21l
IGRpcmVjdG9yaWVzKQotICAgIC8vIHdoaWxlIChNb25vdG9uaWNUaW1lOjpub3coKSAtIHRpbWVT
dGFtcCA8IDEwX3MpOwotCi0gICAgLy8gUmVhZCBpbiBVUkwgbWFwcGluZ3MgZnJvbSB0aGUgZGF0
YWJhc2UKLSAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkgU3RhcnRpbmcgaWNvblVSTCBp
bXBvcnQiKTsKLSAgICBwZXJmb3JtVVJMSW1wb3J0KCk7Ci0KLSAgICBpZiAoc2hvdWxkU3RvcFRo
cmVhZEFjdGl2aXR5KCkpIHsKLSAgICAgICAgc3luY1RocmVhZE1haW5Mb29wKCk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSNpZiAhTE9HX0RJU0FCTEVECi0gICAgbmV3U3RhbXAgPSBNb25v
dG9uaWNUaW1lOjpub3coKTsKLSAgICB0b3RhbERlbHRhID0gbmV3U3RhbXAgLSBzdGFydFRpbWU7
Ci0gICAgZGVsdGEgPSBuZXdTdGFtcCAtIHRpbWVTdGFtcDsKLSAgICBMT0coSWNvbkRhdGFiYXNl
LCAiKFRIUkVBRCkgcGVyZm9ybVVSTEltcG9ydCgpIHRvb2sgJS40ZiBzZWNvbmRzLiBFbnRlcmlu
ZyBtYWluIGxvb3AgJS40ZiBzZWNvbmRzIGZyb20gdGhyZWFkIHN0YXJ0IiwgZGVsdGEudmFsdWUo
KSwgdG90YWxEZWx0YS52YWx1ZSgpKTsKLSNlbmRpZgotCi0gICAgTE9HKEljb25EYXRhYmFzZSwg
IihUSFJFQUQpIEJlZ2lubmluZyBzeW5jIik7Ci0gICAgc3luY1RocmVhZE1haW5Mb29wKCk7Ci19
Ci0KLXN0YXRpYyBpbnQgZGF0YWJhc2VWZXJzaW9uTnVtYmVyKFNRTGl0ZURhdGFiYXNlJiBkYikK
LXsKLSAgICByZXR1cm4gU1FMaXRlU3RhdGVtZW50KGRiLCAiU0VMRUNUIHZhbHVlIEZST00gSWNv
bkRhdGFiYXNlSW5mbyBXSEVSRSBrZXkgPSAnVmVyc2lvbic7IikuZ2V0Q29sdW1uSW50KDApOwot
fQotCi1zdGF0aWMgYm9vbCBpc1ZhbGlkRGF0YWJhc2UoU1FMaXRlRGF0YWJhc2UmIGRiKQotewot
ICAgIC8vIFRoZXNlIGZvdXIgdGFibGVzIHNob3VsZCBhbHdheXMgZXhpc3QgaW4gYSB2YWxpZCBk
YgotICAgIGlmICghZGIudGFibGVFeGlzdHMoIkljb25JbmZvIikgfHwgIWRiLnRhYmxlRXhpc3Rz
KCJJY29uRGF0YSIpIHx8ICFkYi50YWJsZUV4aXN0cygiUGFnZVVSTCIpIHx8ICFkYi50YWJsZUV4
aXN0cygiSWNvbkRhdGFiYXNlSW5mbyIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBp
ZiAoZGF0YWJhc2VWZXJzaW9uTnVtYmVyKGRiKSA8IGN1cnJlbnREYXRhYmFzZVZlcnNpb24pIHsK
LSAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkRCIHZlcnNpb24gaXMgbm90IGZvdW5kIG9yIGJl
bG93IGV4cGVjdGVkIHZhbGlkIHZlcnNpb24iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBjcmVhdGVEYXRhYmFzZVRh
YmxlcyhTUUxpdGVEYXRhYmFzZSYgZGIpCi17Ci0gICAgaWYgKCFkYi5leGVjdXRlQ29tbWFuZCgi
Q1JFQVRFIFRBQkxFIFBhZ2VVUkwgKHVybCBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwg
VU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsaWNvbklEIElOVEVHRVIgTk9UIE5VTEwgT04gQ09O
RkxJQ1QgRkFJTCk7IikpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIFBh
Z2VVUkwgdGFibGUgaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCksIGRiLmxh
c3RFcnJvck1zZygpKTsKLSAgICAgICAgZGIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgSU5ERVggUGFnZVVSTEluZGV4
IE9OIFBhZ2VVUkwgKHVybCk7IikpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3Jl
YXRlIFBhZ2VVUkwgaW5kZXggaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCks
IGRiLmxhc3RFcnJvck1zZygpKTsKLSAgICAgICAgZGIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLSAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgSWNvbklu
Zm8gKGljb25JRCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQgVU5JUVVFIE9OIENP
TkZMSUNUIFJFUExBQ0UsIHVybCBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwgVU5JUVVF
IE9OIENPTkZMSUNUIEZBSUwsIHN0YW1wIElOVEVHRVIpOyIpKSB7Ci0gICAgICAgIExPR19FUlJP
UigiQ291bGQgbm90IGNyZWF0ZSBJY29uSW5mbyB0YWJsZSBpbiBkYXRhYmFzZSAoJWkpIC0gJXMi
LCBkYi5sYXN0RXJyb3IoKSwgZGIubGFzdEVycm9yTXNnKCkpOwotICAgICAgICBkYi5jbG9zZSgp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghZGIuZXhlY3V0ZUNvbW1hbmQoIkNS
RUFURSBJTkRFWCBJY29uSW5mb0luZGV4IE9OIEljb25JbmZvICh1cmwsIGljb25JRCk7IikpIHsK
LSAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIFBhZ2VVUkwgaW5kZXggaW4gZGF0
YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCksIGRiLmxhc3RFcnJvck1zZygpKTsKLSAg
ICAgICAgZGIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIWRiLmV4
ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgSWNvbkRhdGEgKGljb25JRCBJTlRFR0VSIFBSSU1B
UlkgS0VZIEFVVE9JTkNSRU1FTlQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIGRhdGEgQkxP
Qik7IikpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIEljb25EYXRhIHRh
YmxlIGluIGRhdGFiYXNlICglaSkgLSAlcyIsIGRiLmxhc3RFcnJvcigpLCBkYi5sYXN0RXJyb3JN
c2coKSk7Ci0gICAgICAgIGRiLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
aWYgKCFkYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIElOREVYIEljb25EYXRhSW5kZXggT04gSWNv
bkRhdGEgKGljb25JRCk7IikpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRl
IFBhZ2VVUkwgaW5kZXggaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCksIGRi
Lmxhc3RFcnJvck1zZygpKTsKLSAgICAgICAgZGIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLSAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgSWNvbkRhdGFi
YXNlSW5mbyAoa2V5IFRFWFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCBVTklRVUUgT04gQ09O
RkxJQ1QgUkVQTEFDRSx2YWx1ZSBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwpOyIpKSB7
Ci0gICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IGNyZWF0ZSBJY29uRGF0YWJhc2VJbmZvIHRh
YmxlIGluIGRhdGFiYXNlICglaSkgLSAlcyIsIGRiLmxhc3RFcnJvcigpLCBkYi5sYXN0RXJyb3JN
c2coKSk7Ci0gICAgICAgIGRiLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
aWYgKCFkYi5leGVjdXRlQ29tbWFuZChTdHJpbmcoIklOU0VSVCBJTlRPIEljb25EYXRhYmFzZUlu
Zm8gVkFMVUVTICgnVmVyc2lvbicsICIpICsgU3RyaW5nOjpudW1iZXIoY3VycmVudERhdGFiYXNl
VmVyc2lvbikgKyAiKTsiKSkgewotICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBpbnNlcnQg
aWNvbiBkYXRhYmFzZSB2ZXJzaW9uIGludG8gSWNvbkRhdGFiYXNlSW5mbyB0YWJsZSAoJWkpIC0g
JXMiLCBkYi5sYXN0RXJyb3IoKSwgZGIubGFzdEVycm9yTXNnKCkpOwotICAgICAgICBkYi5jbG9z
ZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi12b2lkIEljb25EYXRhYmFzZTo6cGVy
Zm9ybU9wZW5Jbml0aWFsaXphdGlvbigpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQo
KTsKLQotICAgIGlmICghaXNPcGVuKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChjaGVj
a0ludGVncml0eU9uT3BlbikgewotICAgICAgICBjaGVja0ludGVncml0eU9uT3BlbiA9IGZhbHNl
OwotICAgICAgICBpZiAoIWNoZWNrSW50ZWdyaXR5KCkpIHsKLSAgICAgICAgICAgIExPRyhJY29u
RGF0YWJhc2UsICJJbnRlZ3JpdHkgY2hlY2sgd2FzIGJhZCAtIGR1bXBpbmcgSWNvbkRhdGFiYXNl
Iik7Ci0KLSAgICAgICAgICAgIG1fc3luY0RCLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIHsKLSAg
ICAgICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3N5bmNMb2NrKTsKLSAgICAgICAgICAg
ICAgICAvLyBTaG91bGQndmUgYmVlbiBjb25zdW1lZCBieSBTUUxpdGUsIGRlbGV0ZSBqdXN0IHRv
IG1ha2Ugc3VyZSB3ZSBkb24ndCBzZWUgaXQgYWdhaW4gaW4gdGhlIGZ1dHVyZTsKLSAgICAgICAg
ICAgICAgICBGaWxlU3lzdGVtOjpkZWxldGVGaWxlKG1fY29tcGxldGVEYXRhYmFzZVBhdGggKyAi
LWpvdXJuYWwiKTsKLSAgICAgICAgICAgICAgICBGaWxlU3lzdGVtOjpkZWxldGVGaWxlKG1fY29t
cGxldGVEYXRhYmFzZVBhdGgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZW9w
ZW4gdGhlIHdyaXRlIGRhdGFiYXNlLCBjcmVhdGluZyBpdCBmcm9tIHNjcmF0Y2gKLSAgICAgICAg
ICAgIGlmICghbV9zeW5jREIub3BlbihtX2NvbXBsZXRlRGF0YWJhc2VQYXRoKSkgewotICAgICAg
ICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIG9wZW4gaWNvbiBkYXRhYmFzZSBhdCBwYXRo
ICVzIC0gJXMiLCBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoLmFzY2lpKCkuZGF0YSgpLCBtX3N5bmNE
Qi5sYXN0RXJyb3JNc2coKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IHZlcnNpb24gPSBkYXRhYmFzZVZlcnNpb25O
dW1iZXIobV9zeW5jREIpOwotCi0gICAgaWYgKHZlcnNpb24gPiBjdXJyZW50RGF0YWJhc2VWZXJz
aW9uKSB7Ci0gICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJEYXRhYmFzZSB2ZXJzaW9uIG51bWJl
ciAlaSBpcyBncmVhdGVyIHRoYW4gb3VyIGN1cnJlbnQgdmVyc2lvbiBudW1iZXIgJWkgLSBjbG9z
aW5nIHRoZSBkYXRhYmFzZSB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIG5ld2VyIHZlcnNpb25zIiwg
dmVyc2lvbiwgY3VycmVudERhdGFiYXNlVmVyc2lvbik7Ci0gICAgICAgIG1fc3luY0RCLmNsb3Nl
KCk7Ci0gICAgICAgIG1fdGhyZWFkVGVybWluYXRpb25SZXF1ZXN0ZWQgPSB0cnVlOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFpc1ZhbGlkRGF0YWJhc2UobV9zeW5jREIpKSB7
Ci0gICAgICAgIExPRyhJY29uRGF0YWJhc2UsICIlcyBpcyBtaXNzaW5nIG9yIGluIGFuIGludmFs
aWQgc3RhdGUgLSByZWNvbnN0cnVjdGluZyIsIG1fY29tcGxldGVEYXRhYmFzZVBhdGguYXNjaWko
KS5kYXRhKCkpOwotICAgICAgICBtX3N5bmNEQi5jbGVhckFsbFRhYmxlcygpOwotICAgICAgICBj
cmVhdGVEYXRhYmFzZVRhYmxlcyhtX3N5bmNEQik7Ci0gICAgfQotCi0gICAgLy8gUmVkdWNlIHNx
bGl0ZSBSQU0gY2FjaGUgc2l6ZSBmcm9tIGRlZmF1bHQgMjAwMCBwYWdlcyAofjEuNWtCIHBlciBw
YWdlKS4gM01CIG9mIGNhY2hlIGZvciBpY29uIGRhdGFiYXNlIGlzIG92ZXJraWxsCi0gICAgaWYg
KCFTUUxpdGVTdGF0ZW1lbnQobV9zeW5jREIsICJQUkFHTUEgY2FjaGVfc2l6ZSA9IDIwMDsiKS5l
eGVjdXRlQ29tbWFuZCgpKQotICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBkYXRhYmFzZSBjb3Vs
ZCBub3Qgc2V0IGNhY2hlX3NpemUiKTsKLX0KLQotYm9vbCBJY29uRGF0YWJhc2U6OmNoZWNrSW50
ZWdyaXR5KCkKLXsKLSAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOwotCi0gICAgU1FMaXRl
U3RhdGVtZW50IGludGVncml0eShtX3N5bmNEQiwgIlBSQUdNQSBpbnRlZ3JpdHlfY2hlY2s7Iik7
Ci0gICAgaWYgKGludGVncml0eS5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIExP
R19FUlJPUigiY2hlY2tJbnRlZ3JpdHkgZmFpbGVkIHRvIGV4ZWN1dGUiKTsKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludCByZXN1bHRDb2RlID0gaW50ZWdyaXR5LnN0ZXAo
KTsKLSAgICBpZiAocmVzdWx0Q29kZSA9PSBTUUxJVEVfT0spCi0gICAgICAgIHJldHVybiB0cnVl
OwotCi0gICAgaWYgKHJlc3VsdENvZGUgIT0gU1FMSVRFX1JPVykKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaW50IGNvbHVtbnMgPSBpbnRlZ3JpdHkuY29sdW1uQ291bnQoKTsKLSAgICBp
ZiAoY29sdW1ucyAhPSAxKSB7Ci0gICAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgJWkgY29sdW1u
cyBwZXJmb3JtaW5nIGludGVncml0eSBjaGVjaywgc2hvdWxkIGJlIDEiLCBjb2x1bW5zKTsKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZyByZXN1bHRUZXh0ID0gaW50
ZWdyaXR5LmdldENvbHVtblRleHQoMCk7Ci0KLSAgICAvLyBBIHN1Y2Nlc3NmdWwsIG5vLWVycm9y
IGludGVncml0eSBjaGVjayB3aWxsIGJlICJvayIgLSBhbGwgb3RoZXIgc3RyaW5ncyBpbXBseSBm
YWlsdXJlCi0gICAgaWYgKHJlc3VsdFRleHQgPT0gIm9rIikKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0KLSAgICBMT0dfRVJST1IoIkljb24gZGF0YWJhc2UgaW50ZWdyaXR5IGNoZWNrIGZhaWxlZCAt
IFxuJXMiLCByZXN1bHRUZXh0LmFzY2lpKCkuZGF0YSgpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLXZvaWQgSWNvbkRhdGFiYXNlOjpwZXJmb3JtVVJMSW1wb3J0KCkKLXsKLSAgICBBU1NFUlRf
SUNPTl9TWU5DX1RIUkVBRCgpOwotCi0gICAgLy8gRG8gbm90IGltcG9ydCBpY29ucyBub3QgdXNl
ZCBpbiB0aGUgbGFzdCAzMCBkYXlzLiBUaGV5IHdpbGwgYmUgYXV0b21hdGljYWxseSBwcnVuZWQg
bGF0ZXIgaWYgbm9ib2R5IHJldGFpbnMgdGhlbS4KLSAgICAvLyBOb3RlIHRoYXQgSWNvbkluZm8u
c3RhbXAgaXMgb25seSBzZXQgd2hlbiB0aGUgaWNvbiBkYXRhIGlzIHJldHJpZXZlZCBmcm9tIHRo
ZSBzZXJ2ZXIgKGFuZCB0aHVzIGlzIG5vdCB1cGRhdGVkIHdoZXRoZXIKLSAgICAvLyB3ZSB1c2Ug
aXQgb3Igbm90KS4gVGhpcyBjb2RlIHdvcmtzIGFueXdheSBiZWNhdXNlIHRoZSBJY29uRGF0YWJh
c2UgZG93bmxvYWRzIGljb25zIGFnYWluIGlmIHRoZXkgYXJlIG9sZGVyIHRoYW4gNCBkYXlzLAot
ICAgIC8vIHNvIGlmIHRoZSB0aW1lc3RhbXAgZ29lcyBiYWNrIGluIHRpbWUgbW9yZSB0aGFuIHRo
b3NlIDMwIGRheXMgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgaWNvbiB3YXMgbm90IHVzZWQgYXQg
YWxsLgotICAgIFN0cmluZyBpbXBvcnRRdWVyeSA9IG1ha2VTdHJpbmcoIlNFTEVDVCBQYWdlVVJM
LnVybCwgSWNvbkluZm8udXJsLCBJY29uSW5mby5zdGFtcCBGUk9NIFBhZ2VVUkwgSU5ORVIgSk9J
TiBJY29uSW5mbyBPTiBQYWdlVVJMLmljb25JRD1JY29uSW5mby5pY29uSUQgV0hFUkUgSWNvbklu
Zm8uc3RhbXAgPiAiLCBmbG9vcigoV2FsbFRpbWU6Om5vdygpIC0gbm90VXNlZEljb25FeHBpcmF0
aW9uVGltZSkuc2Vjb25kc1NpbmNlRXBvY2goKS5zZWNvbmRzKCkpLCAnOycpOwotCi0gICAgU1FM
aXRlU3RhdGVtZW50IHF1ZXJ5KG1fc3luY0RCLCBpbXBvcnRRdWVyeSk7Ci0KLSAgICBpZiAocXVl
cnkucHJlcGFyZSgpICE9IFNRTElURV9PSykgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0
byBwcmVwYXJlIGljb24gdXJsIGltcG9ydCBxdWVyeSIpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaW50IHJlc3VsdCA9IHF1ZXJ5LnN0ZXAoKTsKLSAgICB3aGlsZSAocmVzdWx0ID09
IFNRTElURV9ST1cpIHsKLSAgICAgICAgU3RyaW5nIHBhZ2VVUkwgPSBxdWVyeS5nZXRDb2x1bW5U
ZXh0KDApOwotICAgICAgICBTdHJpbmcgaWNvblVSTCA9IHF1ZXJ5LmdldENvbHVtblRleHQoMSk7
Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29u
TG9jayk7Ci0KLSAgICAgICAgICAgIFBhZ2VVUkxSZWNvcmQqIHBhZ2VSZWNvcmQgPSBtX3BhZ2VV
UkxUb1JlY29yZE1hcC5nZXQocGFnZVVSTCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBwYWdl
UmVjb3JkIGRvZXNuJ3QgZXhpc3QgaW4gdGhpcyBtYXAsIHRoZW4gbm8gb25lIGhhcyByZXRhaW5l
ZCB0aGlzIHBhZ2VVUkwKLSAgICAgICAgICAgIC8vIElmIHRoZSBzX2RhdGFiYXNlQ2xlYW51cENv
dW50ZXIgY291bnQgaXMgbm9uLXplcm8sIHRoZW4gd2UncmUgbm90IHN1cHBvc2VkIHRvIGJlIHBy
dW5pbmcgdGhlIGRhdGFiYXNlIGluIGFueSBtYW5uZXIsCi0gICAgICAgICAgICAvLyBzbyBhY3R1
YWxseSBjcmVhdGUgYSBwYWdlVVJMUmVjb3JkIGZvciB0aGlzIHVybCBldmVuIHRob3VnaCBpdCdz
IG5vdCByZXRhaW5lZC4KLSAgICAgICAgICAgIC8vIElmIGRhdGFiYXNlIGNsZWFudXAgKmlzKiBh
bGxvd2VkLCB3ZSBkb24ndCB3YW50IHRvIGJvdGhlciBwdWxsaW5nIGluIGEgcGFnZSB1cmwgZnJv
bSBkaXNrIHRoYXQgbm9vbmUgaXMgYWN0dWFsbHkgaW50ZXJlc3RlZAotICAgICAgICAgICAgLy8g
aW4gLSB3ZSdsbCBwcnVuZSBpdCBsYXRlciBpbnN0ZWFkIQotICAgICAgICAgICAgaWYgKCFwYWdl
UmVjb3JkICYmIGRhdGFiYXNlQ2xlYW51cENvdW50ZXIgJiYgZG9jdW1lbnRDYW5IYXZlSWNvbihw
YWdlVVJMKSkgewotICAgICAgICAgICAgICAgIHBhZ2VSZWNvcmQgPSBuZXcgUGFnZVVSTFJlY29y
ZChwYWdlVVJMKTsKLSAgICAgICAgICAgICAgICBtX3BhZ2VVUkxUb1JlY29yZE1hcC5zZXQocGFn
ZVVSTCwgcGFnZVJlY29yZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYWdl
UmVjb3JkKSB7Ci0gICAgICAgICAgICAgICAgSWNvblJlY29yZCogY3VycmVudEljb24gPSBwYWdl
UmVjb3JkLT5pY29uUmVjb3JkKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRJY29u
IHx8IGN1cnJlbnRJY29uLT5pY29uVVJMKCkgIT0gaWNvblVSTCkgewotICAgICAgICAgICAgICAg
ICAgICBwYWdlUmVjb3JkLT5zZXRJY29uUmVjb3JkKGdldE9yQ3JlYXRlSWNvblJlY29yZChpY29u
VVJMKSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJY29uID0gcGFnZVJlY29yZC0+aWNv
blJlY29yZCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFJlZ2Fy
ZGxlc3MsIHRoZSB0aW1lIHN0YW1wIGZyb20gZGlzayBzdGlsbCB0YWtlcyBwcmVjZWRlbmNlLiBV
bnRpbCB3ZSByZWFkIHRoaXMgaWNvbiBmcm9tIGRpc2ssIHdlIGRpZG4ndCB0aGluayB3ZSdkIHNl
ZW4gaXQgYmVmb3JlCi0gICAgICAgICAgICAgICAgLy8gc28gd2UgbWFya2VkIHRoZSB0aW1lc3Rh
bXAgYXMgIm5vdyIsIGJ1dCBpdCdzIHJlYWxseSBtdWNoIG9sZGVyCi0gICAgICAgICAgICAgICAg
Y3VycmVudEljb24tPnNldFRpbWVzdGFtcChxdWVyeS5nZXRDb2x1bW5JbnQoMikpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRklYTUU6IEN1cnJlbnRseSB0aGUgV2Vi
S2l0IEFQSSBzdXBwb3J0cyAxIHR5cGUgb2Ygbm90aWZpY2F0aW9uIHRoYXQgaXMgc2VudCB3aGVu
ZXZlciB3ZSBnZXQgYW4gSWNvbiBVUkwgZm9yIGEgUGFnZSBVUkwuIFdlIG1pZ2h0IHdhbnQgdG8g
cmUtcHVycG9zZSBpdCB0byB3b3JrIGZvcgotICAgICAgICAvLyBnZXR0aW5nIHRoZSBhY3R1YWxs
eSBpY29uIGl0c2VsZiBhbHNvIChzbyBlYWNoIHBhZ2V1cmwgd291bGQgZ2V0IHRoaXMgbm90aWZp
Y2F0aW9uIHR3aWNlKSBvciB3ZSBtaWdodCB3YW50IHRvIGFkZCBhIHNlY29uZCB0eXBlIG9mIG5v
dGlmaWNhdGlvbiAtCi0gICAgICAgIC8vIG9uZSBmb3IgdGhlIFVSTCBhbmQgb25lIGZvciB0aGUg
SW1hZ2UgaXRzZWxmCi0gICAgICAgIC8vIE5vdGUgdGhhdCBXZWJJY29uRGF0YWJhc2UgaXMgbm90
IG5lY2Nlc3NhcmlseSBBUEkgc28gd2UgbWlnaHQgYmUgYWJsZSB0byBtYWtlIHRoaXMgY2hhbmdl
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1JlYWRp
bmdMb2NrKTsKLSAgICAgICAgICAgIGlmIChtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydC5jb250YWlu
cyhwYWdlVVJMKSkgewotICAgICAgICAgICAgICAgIGRpc3BhdGNoRGlkSW1wb3J0SWNvblVSTEZv
clBhZ2VVUkxPbk1haW5UaHJlYWQocGFnZVVSTCk7Ci0gICAgICAgICAgICAgICAgbV9wYWdlVVJM
c1BlbmRpbmdJbXBvcnQucmVtb3ZlKHBhZ2VVUkwpOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gU3RvcCB0aGUgaW1wb3J0IGF0IGFueSB0aW1lIG9mIHRoZSB0aHJlYWQg
aGFzIGJlZW4gYXNrZWQgdG8gc2h1dGRvd24KLSAgICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRB
Y3Rpdml0eSgpKSB7Ci0gICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiSWNvbkRhdGFiYXNl
IGFza2VkIHRvIHRlcm1pbmF0ZSBkdXJpbmcgcGVyZm9ybVVSTEltcG9ydCgpIik7Ci0gICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSBxdWVyeS5zdGVwKCk7
Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkKLSAgICAgICAgTE9HKElj
b25EYXRhYmFzZSwgIkVycm9yIHJlYWRpbmcgcGFnZS0+aWNvbiB1cmwgbWFwcGluZ3MgZnJvbSBk
YXRhYmFzZSIpOwotCi0gICAgLy8gQ2xlYXIgdGhlIG1fcGFnZVVSTHNQZW5kaW5nSW1wb3J0IHNl
dCAtIGVpdGhlciB0aGUgcGFnZSBVUkxzIGVuZGVkIHVwIHdpdGggYW4gaWNvblVSTCAodGhhdCB3
ZSdsbCBub3RpZnkgYWJvdXQpIG9yIG5vdCwKLSAgICAvLyBidXQgYWZ0ZXIgbV9pY29uVVJMSW1w
b3J0Q29tcGxldGUgaXMgc2V0IHRvIHRydWUsIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBzZXQg
YW55bW9yZQotICAgIFZlY3RvcjxTdHJpbmc+IHVybHM7Ci0gICAgewotICAgICAgICBMb2NrSG9s
ZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7Ci0KLSAgICAgICAgdXJscy5hcHBlbmRS
YW5nZShtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydC5iZWdpbigpLCBtX3BhZ2VVUkxzUGVuZGluZ0lt
cG9ydC5lbmQoKSk7Ci0gICAgICAgIG1fcGFnZVVSTHNQZW5kaW5nSW1wb3J0LmNsZWFyKCk7Ci0g
ICAgICAgIG1faWNvblVSTEltcG9ydENvbXBsZXRlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBWZWN0
b3I8U3RyaW5nPiB1cmxzVG9Ob3RpZnk7Ci0KLSAgICAvLyBMb29wIHRocm91Z2ggdGhlIHVybHMg
cGVuZGluZyBpbXBvcnQKLSAgICAvLyBSZW1vdmUgdW5yZXRhaW5lZCBvbmVzIGlmIGRhdGFiYXNl
IGNsZWFudXAgaXMgYWxsb3dlZAotICAgIC8vIEtlZXAgYSBzZXQgb2Ygb25lcyB0aGF0IGFyZSBy
ZXRhaW5lZCBhbmQgcGVuZGluZyBub3RpZmljYXRpb24KLSAgICB7Ci0gICAgICAgIExvY2tIb2xk
ZXIgbG9ja2VyKG1fdXJsQW5kSWNvbkxvY2spOwotCi0gICAgICAgIHBlcmZvcm1QZW5kaW5nUmV0
YWluQW5kUmVsZWFzZU9wZXJhdGlvbnMoKTsKLQotICAgICAgICBmb3IgKGF1dG8mIHVybCA6IHVy
bHMpIHsKLSAgICAgICAgICAgIGlmICghbV9yZXRhaW5lZFBhZ2VVUkxzLmNvbnRhaW5zKHVybCkp
IHsKLSAgICAgICAgICAgICAgICBQYWdlVVJMUmVjb3JkKiByZWNvcmQgPSBtX3BhZ2VVUkxUb1Jl
Y29yZE1hcC5nZXQodXJsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVjb3JkICYmICFkYXRhYmFz
ZUNsZWFudXBDb3VudGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcGFnZVVSTFRvUmVjb3Jk
TWFwLnJlbW92ZSh1cmwpOwotICAgICAgICAgICAgICAgICAgICBJY29uUmVjb3JkKiBpY29uUmVj
b3JkID0gcmVjb3JkLT5pY29uUmVjb3JkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYg
dGhpcyBwYWdlIGlzIHRoZSBvbmx5IHJlbWFpbmluZyByZXRhaW5lciBvZiBpdHMgaWNvbiwgbWFy
ayB0aGF0IGljb24gZm9yIGRlbGV0aW9uIGFuZCBkb24ndCBib3RoZXIKLSAgICAgICAgICAgICAg
ICAgICAgLy8gcmVhZGluZyBhbnl0aGluZyByZWxhdGVkIHRvIGl0Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChpY29uUmVjb3JkICYmIGljb25SZWNvcmQtPmhhc09uZVJlZigpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBtX2ljb25VUkxUb1JlY29yZE1hcC5yZW1vdmUoaWNvblJlY29yZC0+
aWNvblVSTCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMucmVt
b3ZlKHVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFk
aW5nLnJlbW92ZShpY29uUmVjb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NrSG9s
ZGVyIGxvY2tlcihtX3BlbmRpbmdTeW5jTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV9pY29uc1BlbmRpbmdTeW5jLnNldChpY29uUmVjb3JkLT5pY29uVVJMKCksIGljb25SZWNv
cmQtPnNuYXBzaG90KHRydWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZWNvcmQ7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgdXJsc1Rv
Tm90aWZ5LmFwcGVuZCh1cmwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTE9HKEljb25EYXRh
YmFzZSwgIk5vdGlmeWluZyAlbHUgaW50ZXJlc3RlZCBwYWdlIFVSTHMgdGhhdCB0aGVpciBpY29u
IFVSTCBpcyBrbm93biBkdWUgdG8gdGhlIGltcG9ydCIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxv
bmc+KHVybHNUb05vdGlmeS5zaXplKCkpKTsKLSAgICAvLyBOb3cgdGhhdCB3ZSBkb24ndCBob2xk
IGFueSBsb2NrcywgcGVyZm9ybSB0aGUgYWN0dWFsIG5vdGlmaWNhdGlvbnMKLSAgICBmb3IgKGF1
dG8mIHVybCA6IHVybHNUb05vdGlmeSkgewotICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiTm90
aWZ5aW5nIGljb24gaW5mbyBrbm93biBmb3IgcGFnZVVSTCAlcyIsIHVybC5hc2NpaSgpLmRhdGEo
KSk7Ci0gICAgICAgIGRpc3BhdGNoRGlkSW1wb3J0SWNvblVSTEZvclBhZ2VVUkxPbk1haW5UaHJl
YWQodXJsKTsKLSAgICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKQotICAgICAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgdGhl
IFVSTCBpbXBvcnQgaXMgY29tcGxldGUgaW4gY2FzZSBpdCdzIG1hbmFnaW5nIGl0cyBvd24gcGVu
ZGluZyBub3RpZmljYXRpb25zLgotICAgIGRpc3BhdGNoRGlkRmluaXNoVVJMSW1wb3J0T25NYWlu
VGhyZWFkKCk7Ci19Ci0KLXZvaWQgSWNvbkRhdGFiYXNlOjpzeW5jVGhyZWFkTWFpbkxvb3AoKQot
ewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICBtX3N5bmNMb2NrLmxvY2so
KTsKLQotICAgIC8vIFdlJ2xsIGVpdGhlciBkbyBhbnkgcGVuZGluZyB3b3JrIG9uIG91ciBmaXJz
dCBwYXNzIHRocm91Z2ggdGhlIGxvb3AsIG9yIHdlJ2xsIHRlcm1pbmF0ZQotICAgIC8vIHdpdGhv
dXQgZG9pbmcgYW55IHdvcmsuIEVpdGhlciB3YXkgd2UncmUgZGVhbGluZyB3aXRoIGFueSBjdXJy
ZW50bHktcGVuZGluZyB3b3JrLgotICAgIG1fc3luY1RocmVhZEhhc1dvcmtUb0RvID0gZmFsc2U7
Ci0KLSAgICAvLyBJdCdzIHBvc3NpYmxlIHRocmVhZCB0ZXJtaW5hdGlvbiBpcyByZXF1ZXN0ZWQg
YmVmb3JlIHRoZSBtYWluIGxvb3AgZXZlbiBzdGFydHMgLSBpbiB0aGF0IGNhc2UsIGp1c3Qgc2tp
cCBzdHJhaWdodCB0byBjbGVhbnVwCi0gICAgd2hpbGUgKCFtX3RocmVhZFRlcm1pbmF0aW9uUmVx
dWVzdGVkKSB7Ci0gICAgICAgIG1fc3luY0xvY2sudW5sb2NrKCk7Ci0KLSNpZiAhTE9HX0RJU0FC
TEVECi0gICAgICAgIE1vbm90b25pY1RpbWUgdGltZVN0YW1wID0gTW9ub3RvbmljVGltZTo6bm93
KCk7Ci0jZW5kaWYKLSAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIihUSFJFQUQpIE1haW4gd29y
ayBsb29wIHN0YXJ0aW5nIik7Ci0KLSAgICAgICAgLy8gSWYgd2Ugc2hvdWxkIHJlbW92ZSBhbGwg
aWNvbnMsIGRvIGl0IG5vdy4gVGhpcyBpcyBhbiB1bmludGVydXB0aWJsZSBwcm9jZWR1cmUgdGhh
dCB3ZSB3aWxsIGFsd2F5cyBkbyBiZWZvcmUgcXVpdHRpbmcgaWYgaXQgaXMgcmVxdWVzdGVkCi0g
ICAgICAgIGlmIChtX3JlbW92ZUljb25zUmVxdWVzdGVkKSB7Ci0gICAgICAgICAgICByZW1vdmVB
bGxJY29uc09uVGhyZWFkKCk7Ci0gICAgICAgICAgICBtX3JlbW92ZUljb25zUmVxdWVzdGVkID0g
ZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGVuLCBpZiB0aGUgdGhyZWFkIHNob3Vs
ZCBiZSBxdWl0dGluZywgcXVpdCBub3chCi0gICAgICAgIGlmIChtX3RocmVhZFRlcm1pbmF0aW9u
UmVxdWVzdGVkKSB7Ci0gICAgICAgICAgICBjbGVhbnVwU3luY1RocmVhZCgpOwotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTG9ja0hvbGRl
ciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7Ci0gICAgICAgICAgICBwZXJmb3JtUGVuZGluZ1Jl
dGFpbkFuZFJlbGVhc2VPcGVyYXRpb25zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGRp
ZEFueVdvcmsgPSB0cnVlOwotICAgICAgICB3aGlsZSAoZGlkQW55V29yaykgewotICAgICAgICAg
ICAgYm9vbCBkaWRXcml0ZSA9IHdyaXRlVG9EYXRhYmFzZSgpOwotICAgICAgICAgICAgaWYgKHNo
b3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAg
ICAgICAgICBkaWRBbnlXb3JrID0gcmVhZEZyb21EYXRhYmFzZSgpOwotICAgICAgICAgICAgaWYg
KHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0g
ICAgICAgICAgICAvLyBQcnVuZSB1bnJldGFpbmVkIGljb25zIGFmdGVyIHRoZSBmaXJzdCB0aW1l
IHdlIHN5bmMgYW55dGhpbmcgb3V0IHRvIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgLy8gVGhp
cyB3YXksIHBydW5pbmcgd29uJ3QgYmUgdGhlIG9ubHkgb3BlcmF0aW9uIHdlIHBlcmZvcm0gdG8g
dGhlIGRhdGFiYXNlIGJ5IGl0c2VsZgotICAgICAgICAgICAgLy8gV2UgYWxzbyBkb24ndCB3YW50
IHRvIGJvdGhlciBkb2luZyB0aGlzIGlmIHRoZSB0aHJlYWQgc2hvdWxkIGJlIHRlcm1pbmF0aW5n
ICh0aGUgdXNlciBpcyBxdWl0dGluZykKLSAgICAgICAgICAgIC8vIG9yIGlmIHByaXZhdGUgYnJv
d3NpbmcgaXMgZW5hYmxlZAotICAgICAgICAgICAgLy8gV2UgYWxzbyBkb24ndCB3YW50IHRvIHBy
dW5lIGlmIHRoZSBtX2RhdGFiYXNlQ2xlYW51cENvdW50ZXIgY291bnQgaXMgbm9uLXplcm8gLSB0
aGF0IG1lYW5zIHNvbWVvbmUKLSAgICAgICAgICAgIC8vIGhhcyBhc2tlZCB0byBkZWxheSBwcnVu
aW5nCi0gICAgICAgICAgICBzdGF0aWMgYm9vbCBwcnVuZWRVbnJldGFpbmVkSWNvbnMgPSBmYWxz
ZTsKLSAgICAgICAgICAgIGlmIChkaWRXcml0ZSAmJiAhbV9wcml2YXRlQnJvd3NpbmdFbmFibGVk
ICYmICFwcnVuZWRVbnJldGFpbmVkSWNvbnMgJiYgIWRhdGFiYXNlQ2xlYW51cENvdW50ZXIpIHsK
LSNpZiAhTE9HX0RJU0FCTEVECi0gICAgICAgICAgICAgICAgTW9ub3RvbmljVGltZSB0aW1lID0g
TW9ub3RvbmljVGltZTo6bm93KCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBMT0coSWNvbkRh
dGFiYXNlLCAiKFRIUkVBRCkgU3RhcnRpbmcgcHJ1bmVVbnJldGFpbmVkSWNvbnMoKSIpOwotCi0g
ICAgICAgICAgICAgICAgcHJ1bmVVbnJldGFpbmVkSWNvbnMoKTsKLQotI2lmICFMT0dfRElTQUJM
RUQKLSAgICAgICAgICAgICAgICBTZWNvbmRzIGRlbHRhID0gTW9ub3RvbmljVGltZTo6bm93KCkg
LSB0aW1lOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIihUSFJF
QUQpIHBydW5lVW5yZXRhaW5lZEljb25zKCkgdG9vayAlLjRmIHNlY29uZHMiLCBkZWx0YS52YWx1
ZSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIHBydW5lVW5yZXRhaW5lZEljb25zKCkgcmV0
dXJuZWQgZWFybHkgZHVlIHRvIHJlcXVlc3RlZCB0aHJlYWQgdGVybWluYXRpb24sIGl0cyBzdGls
bCBva2F5Ci0gICAgICAgICAgICAgICAgLy8gdG8gbWFyayBwcnVuZWRVbnJldGFpbmVkSWNvbnMg
dHJ1ZSBiZWNhdXNlIHdlJ3JlIGFib3V0IHRvIHRlcm1pbmF0ZSBhbnl3YXkKLSAgICAgICAgICAg
ICAgICBwcnVuZWRVbnJldGFpbmVkSWNvbnMgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBkaWRBbnlXb3JrID0gZGlkQW55V29yayB8fCBkaWRXcml0ZTsKLSAgICAgICAgICAg
IGlmIChzaG91bGRTdG9wVGhyZWFkQWN0aXZpdHkoKSkKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgfQotCi0jaWYgIUxPR19ESVNBQkxFRAotICAgICAgICBNb25vdG9uaWNUaW1lIG5l
d3N0YW1wID0gTW9ub3RvbmljVGltZTo6bm93KCk7Ci0gICAgICAgIFNlY29uZHMgZGVsdGEgPSBu
ZXdzdGFtcCAtIHRpbWVTdGFtcDsKLSAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIihUSFJFQUQp
IE1haW4gd29yayBsb29wIHJhbiBmb3IgJS40ZiBzZWNvbmRzLCAlcyByZXF1ZXN0ZWQgdG8gdGVy
bWluYXRlIiwgZGVsdGEudmFsdWUoKSwgc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkgPyAid2Fz
IiA6ICJ3YXMgbm90Iik7Ci0jZW5kaWYKLQotICAgICAgICBtX3N5bmNMb2NrLmxvY2soKTsKLQot
ICAgICAgICAvLyBUaGVyZSBpcyBzb21lIGNvbmRpdGlvbiB0aGF0IGlzIGFza2luZyB1cyB0byBz
dG9wIHdoYXQgd2UncmUgZG9pbmcgbm93IGFuZCBoYW5kbGUgYSBzcGVjaWFsIGNhc2UKLSAgICAg
ICAgLy8gVGhpcyBpcyBlaXRoZXIgcmVtb3ZpbmcgYWxsIGljb25zLCBvciBzaHV0dGluZyBkb3du
IHRoZSB0aHJlYWQgdG8gcXVpdCB0aGUgYXBwCi0gICAgICAgIC8vIFdlIGhhbmRsZSB0aG9zZSBh
dCB0aGUgdG9wIG9mIHRoaXMgbWFpbiBsb29wIHNvIGNvbnRpbnVlIHRvIGp1bXAgYmFjayB1cCB0
aGVyZQotICAgICAgICBpZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpCi0gICAgICAgICAg
ICBjb250aW51ZTsKLQotICAgICAgICB3aGlsZSAoIW1fc3luY1RocmVhZEhhc1dvcmtUb0RvKQot
ICAgICAgICAgICAgbV9zeW5jQ29uZGl0aW9uLndhaXQobV9zeW5jTG9jayk7Ci0KLSAgICAgICAg
bV9zeW5jVGhyZWFkSGFzV29ya1RvRG8gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBtX3N5bmNMb2Nr
LnVubG9jaygpOwotCi0gICAgLy8gVGhyZWFkIGlzIHRlcm1pbmF0aW5nIGF0IHRoaXMgcG9pbnQK
LSAgICBjbGVhbnVwU3luY1RocmVhZCgpOwotfQotCi12b2lkIEljb25EYXRhYmFzZTo6cGVyZm9y
bVBlbmRpbmdSZXRhaW5BbmRSZWxlYXNlT3BlcmF0aW9ucygpCi17Ci0gICAgLy8gTk9URTogVGhl
IGNhbGxlciBpcyBhc3N1bWVkIHRvIGhvbGQgbV91cmxBbmRJY29uTG9jay4KLSAgICBBU1NFUlQo
IW1fdXJsQW5kSWNvbkxvY2sudHJ5TG9jaygpKTsKLQotICAgIEhhc2hDb3VudGVkU2V0PFN0cmlu
Zz4gdG9SZXRhaW47Ci0gICAgSGFzaENvdW50ZWRTZXQ8U3RyaW5nPiB0b1JlbGVhc2U7Ci0KLSAg
ICB7Ci0gICAgICAgIExvY2tIb2xkZXIgcGVuZGluZ1dvcmtMb2NrZXIobV91cmxzVG9SZXRhaW5P
clJlbGVhc2VMb2NrKTsKLSAgICAgICAgaWYgKCFtX3JldGFpbk9yUmVsZWFzZUljb25SZXF1ZXN0
ZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhl
IFVSTHMgdG8gcmV0YWluIGFuZC9vciByZWxlYXNlIHNvIHdlIGNhbiByZWxlYXNlIG1fdXJsc1Rv
UmV0YWluT3JSZWxlYXNlTG9jayBBU0FQLgotICAgICAgICAvLyBIb2xkaW5nIG1fdXJsQW5kSWNv
bkxvY2sgcHJvdGVjdHMgdGhpcyBmdW5jdGlvbiBmcm9tIGJlaW5nIHJlLWVudGVyZWQuCi0KLSAg
ICAgICAgdG9SZXRhaW4uc3dhcChtX3VybHNUb1JldGFpbik7Ci0gICAgICAgIHRvUmVsZWFzZS5z
d2FwKG1fdXJsc1RvUmVsZWFzZSk7Ci0gICAgICAgIG1fcmV0YWluT3JSZWxlYXNlSWNvblJlcXVl
c3RlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoYXV0byYgZW50cnkgOiB0b1JldGFpbikg
ewotICAgICAgICBBU1NFUlQoIWVudHJ5LmtleS5pbXBsKCkgfHwgZW50cnkua2V5LmltcGwoKS0+
aGFzT25lUmVmKCkpOwotICAgICAgICBwZXJmb3JtUmV0YWluSWNvbkZvclBhZ2VVUkwoZW50cnku
a2V5LCBlbnRyeS52YWx1ZSk7Ci0gICAgfQotCi0gICAgZm9yIChhdXRvJiBlbnRyeSA6IHRvUmVs
ZWFzZSkgewotICAgICAgICBBU1NFUlQoIWVudHJ5LmtleS5pbXBsKCkgfHwgZW50cnkua2V5Lmlt
cGwoKS0+aGFzT25lUmVmKCkpOwotICAgICAgICBwZXJmb3JtUmVsZWFzZUljb25Gb3JQYWdlVVJM
KGVudHJ5LmtleSwgZW50cnkudmFsdWUpOwotICAgIH0KLX0KLQotYm9vbCBJY29uRGF0YWJhc2U6
OnJlYWRGcm9tRGF0YWJhc2UoKQotewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0K
LSNpZiAhTE9HX0RJU0FCTEVECi0gICAgTW9ub3RvbmljVGltZSB0aW1lU3RhbXAgPSBNb25vdG9u
aWNUaW1lOjpub3coKTsKLSNlbmRpZgotCi0gICAgYm9vbCBkaWRBbnlXb3JrID0gZmFsc2U7Ci0K
LSAgICAvLyBXZSdsbCBtYWtlIGEgY29weSBvZiB0aGUgc2V0cyBvZiB0aGluZ3MgdGhhdCBuZWVk
IHRvIGJlIHJlYWQuIFRoZW4gd2UnbGwgdmVyaWZ5IGF0IHRoZSB0aW1lIG9mIHVwZGF0aW5nIHRo
ZSByZWNvcmQgdGhhdCBpdCBzdGlsbCB3YW50cyB0byBiZSB1cGRhdGVkCi0gICAgLy8gVGhpcyB3
YXkgd2Ugd29uJ3QgaG9sZCB0aGUgbG9jayBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lCi0gICAg
VmVjdG9yPEljb25SZWNvcmQqPiBpY29uczsKLSAgICB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9j
a2VyKG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKLSAgICAgICAgaWNvbnMuYXBwZW5kUmFuZ2UobV9p
Y29uc1BlbmRpbmdSZWFkaW5nLmJlZ2luKCksIG1faWNvbnNQZW5kaW5nUmVhZGluZy5lbmQoKSk7
Ci0gICAgfQotCi0gICAgLy8gS2VlcCB0cmFjayBvZiBpY29ucyB3ZSBhY3R1YWxseSByZWFkIHRv
IG5vdGlmeSB0aGVtIG9mIHRoZSBuZXcgaWNvbgotICAgIEhhc2hTZXQ8U3RyaW5nPiB1cmxzVG9O
b3RpZnk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaWNvbnMuc2l6ZSgpOyArK2kp
IHsKLSAgICAgICAgZGlkQW55V29yayA9IHRydWU7Ci0gICAgICAgIGF1dG8gaW1hZ2VEYXRhID0g
Z2V0SW1hZ2VEYXRhRm9ySWNvblVSTEZyb21TUUxEYXRhYmFzZShpY29uc1tpXS0+aWNvblVSTCgp
KTsKLQotICAgICAgICAvLyBWZXJpZnkgdGhpcyBpY29uIHN0aWxsIHdhbnRzIHRvIGJlIHJlYWQg
ZnJvbSBkaXNrCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvY2tIb2xkZXIgdXJsTG9ja2VyKG1f
dXJsQW5kSWNvbkxvY2spOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExvY2tIb2xk
ZXIgcmVhZExvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7Ci0KLSAgICAgICAgICAgICAgICBp
ZiAobV9pY29uc1BlbmRpbmdSZWFkaW5nLmNvbnRhaW5zKGljb25zW2ldKSkgewotICAgICAgICAg
ICAgICAgICAgICAvLyBTZXQgdGhlIG5ldyBkYXRhCi0gICAgICAgICAgICAgICAgICAgIGljb25z
W2ldLT5zZXRJbWFnZURhdGEoV1RGTW92ZShpbWFnZURhdGEpKTsKLQotICAgICAgICAgICAgICAg
ICAgICAvLyBSZW1vdmUgdGhpcyBpY29uIGZyb20gdGhlIHNldCB0aGF0IG5lZWRzIHRvIGJlIHJl
YWQKLSAgICAgICAgICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFkaW5nLnJlbW92ZShpY29u
c1tpXSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHNldCBvZiBhbGwgUGFn
ZSBVUkxzIHRoYXQgcmV0YWluIHRoaXMgaWNvbiBhcyB3ZWxsIGFzIGFsbCBQYWdlVVJMcyB3YWl0
aW5nIGZvciBhbiBpY29uCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gZmluZCB0
aGUgaW50ZXJzZWN0aW9uIG9mIHRoZXNlIHR3byBzZXRzIHRvIG5vdGlmeSB0aGVtCi0gICAgICAg
ICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBzaXplcyBvZiB0aGVzZSB0d28gc2V0cyB0byBtaW5p
bWl6ZSB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qg
SGFzaFNldDxTdHJpbmc+KiBvdXRlckhhc2g7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEhh
c2hTZXQ8U3RyaW5nPiogaW5uZXJIYXNoOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpY29u
c1tpXS0+cmV0YWluaW5nUGFnZVVSTHMoKS5zaXplKCkgPiBtX3BhZ2VVUkxzSW50ZXJlc3RlZElu
SWNvbnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRlckhhc2ggPSAmbV9w
YWdlVVJMc0ludGVyZXN0ZWRJbkljb25zOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJI
YXNoID0gJihpY29uc1tpXS0+cmV0YWluaW5nUGFnZVVSTHMoKSk7Ci0gICAgICAgICAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhhc2ggPSAmbV9wYWdl
VVJMc0ludGVyZXN0ZWRJbkljb25zOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJIYXNo
ID0gJihpY29uc1tpXS0+cmV0YWluaW5nUGFnZVVSTHMoKSk7Ci0gICAgICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIG91dGVyIDogKm91dGVySGFzaCkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVySGFzaC0+Y29udGFpbnMob3V0ZXIp
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIiVzIGlz
IGludGVyZXN0ZWQgaW4gdGhlIGljb24gd2UganVzdCByZWFkLiBBZGRpbmcgaXQgdG8gdGhlIG5v
dGlmaWNhdGlvbiBsaXN0IGFuZCByZW1vdmluZyBpdCBmcm9tIHRoZSBpbnRlcmVzdGVkIHNldCIs
IHVybEZvckxvZ2dpbmcob3V0ZXIpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB1cmxzVG9Ob3RpZnkuYWRkKG91dGVyKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZXZlciBnZXQgdG8gdGhl
IHBvaW50IHdlcmUgd2UndmUgc2VlbiBldmVyeSB1cmwgaW50ZXJlc3RlZCBpbiB0aGlzIGljb24s
IGJyZWFrIGVhcmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsc1RvTm90aWZ5LnNp
emUoKSA9PSBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMuc2l6ZSgpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBub3RpZnkgYSBQYWdlVVJMIHR3aWNlLCBz
byBhbGwgdGhlIG9uZXMgd2UncmUgYWJvdXQgdG8gbm90aWZ5IGNhbiBiZSByZW1vdmVkIGZyb20g
dGhlIGludGVyZXN0ZWQgc2V0Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmxzVG9Ob3RpZnku
c2l6ZSgpID09IG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29ucy5zaXplKCkpCi0gICAgICAgICAg
ICAgICAgICAgICAgICBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMuY2xlYXIoKTsKLSAgICAg
ICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8m
IHVybCA6IHVybHNUb05vdGlmeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BhZ2VV
UkxzSW50ZXJlc3RlZEluSWNvbnMucmVtb3ZlKHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpCi0gICAgICAgICAgICByZXR1cm4gZGlkQW55
V29yazsKLQotICAgICAgICAvLyBOb3cgdGhhdCB3ZSBkb24ndCBob2xkIGFueSBsb2NrcywgcGVy
Zm9ybSB0aGUgYWN0dWFsIG5vdGlmaWNhdGlvbnMKLSAgICAgICAgZm9yIChIYXNoU2V0PFN0cmlu
Zz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdXJsc1RvTm90aWZ5LmJlZ2luKCksIGVuZCA9IHVybHNU
b05vdGlmeS5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgICAgICBMT0coSWNvbkRh
dGFiYXNlLCAiTm90aWZ5aW5nIGljb24gcmVjZWl2ZWQgZm9yIHBhZ2VVUkwgJXMiLCB1cmxGb3JM
b2dnaW5nKCppdCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICAgICAgZGlzcGF0Y2hEaWRJbXBv
cnRJY29uRGF0YUZvclBhZ2VVUkxPbk1haW5UaHJlYWQoKml0KTsKLSAgICAgICAgICAgIGlmIChz
aG91bGRTdG9wVGhyZWFkQWN0aXZpdHkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZGlkQW55
V29yazsKLSAgICAgICAgfQotCi0gICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJEb25lIG5vdGlm
eWluZyAlaSBwYWdlVVJMcyB3aG8ganVzdCByZWNlaXZlZCB0aGVpciBpY29ucyIsIHVybHNUb05v
dGlmeS5zaXplKCkpOwotICAgICAgICB1cmxzVG9Ob3RpZnkuY2xlYXIoKTsKLQotICAgICAgICBp
ZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpCi0gICAgICAgICAgICByZXR1cm4gZGlkQW55
V29yazsKLSAgICB9Ci0KLSNpZiAhTE9HX0RJU0FCTEVECi0gICAgU2Vjb25kcyBkZWx0YSA9IE1v
bm90b25pY1RpbWU6Om5vdygpIC0gdGltZVN0YW1wOwotICAgIExPRyhJY29uRGF0YWJhc2UsICJS
ZWFkaW5nIGZyb20gZGF0YWJhc2UgdG9vayAlLjRmIHNlY29uZHMiLCBkZWx0YS52YWx1ZSgpKTsK
LSNlbmRpZgotCi0gICAgcmV0dXJuIGRpZEFueVdvcms7Ci19Ci0KLWJvb2wgSWNvbkRhdGFiYXNl
Ojp3cml0ZVRvRGF0YWJhc2UoKQotewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0K
LSNpZiAhTE9HX0RJU0FCTEVECi0gICAgTW9ub3RvbmljVGltZSB0aW1lU3RhbXAgPSBNb25vdG9u
aWNUaW1lOjpub3coKTsKLSNlbmRpZgotCi0gICAgYm9vbCBkaWRBbnlXb3JrID0gZmFsc2U7Ci0K
LSAgICAvLyBXZSBjYW4gY29weSB0aGUgY3VycmVudCB3b3JrIHF1ZXVlIHRoZW4gY2xlYXIgaXQg
b3V0IC0gSWYgYW55IG5ldyB3b3JrIGNvbWVzIGluIHdoaWxlIHdlJ3JlIHdyaXRpbmcgb3V0LAot
ICAgIC8vIHdlJ2xsIHBpY2sgaXQgdXAgb24gdGhlIG5leHQgcGFzcy4gVGhpcyBncmVhdGx5IHNp
bXBsaWZpZXMgdGhlIGxvY2tpbmcgc3RyYXRlZ3kgZm9yIHRoaXMgbWV0aG9kIGFuZCByZW1haW5z
IGNvaGVzaXZlIHdpdGggY2hhbmdlcwotICAgIC8vIGFza2VkIGZvciBieSB0aGUgZGF0YWJhc2Ug
b24gdGhlIG1haW4gdGhyZWFkCi0gICAgewotICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3Vy
bEFuZEljb25Mb2NrKTsKLSAgICAgICAgVmVjdG9yPEljb25TbmFwc2hvdD4gaWNvblNuYXBzaG90
czsKLSAgICAgICAgVmVjdG9yPFBhZ2VVUkxTbmFwc2hvdD4gcGFnZVNuYXBzaG90czsKLSAgICAg
ICAgewotICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nU3luY0xvY2spOwot
Ci0gICAgICAgICAgICBpY29uU25hcHNob3RzLmFwcGVuZFJhbmdlKG1faWNvbnNQZW5kaW5nU3lu
Yy5iZWdpbigpLnZhbHVlcygpLCBtX2ljb25zUGVuZGluZ1N5bmMuZW5kKCkudmFsdWVzKCkpOwot
ICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdTeW5jLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIHBh
Z2VTbmFwc2hvdHMuYXBwZW5kUmFuZ2UobV9wYWdlVVJMc1BlbmRpbmdTeW5jLmJlZ2luKCkudmFs
dWVzKCksIG1fcGFnZVVSTHNQZW5kaW5nU3luYy5lbmQoKS52YWx1ZXMoKSk7Ci0gICAgICAgICAg
ICBtX3BhZ2VVUkxzUGVuZGluZ1N5bmMuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
IChpY29uU25hcHNob3RzLnNpemUoKSB8fCBwYWdlU25hcHNob3RzLnNpemUoKSkKLSAgICAgICAg
ICAgIGRpZEFueVdvcmsgPSB0cnVlOwotCi0gICAgICAgIFNRTGl0ZVRyYW5zYWN0aW9uIHN5bmNU
cmFuc2FjdGlvbihtX3N5bmNEQik7Ci0gICAgICAgIHN5bmNUcmFuc2FjdGlvbi5iZWdpbigpOwot
Ci0gICAgICAgIGZvciAoYXV0byYgc25hcHNob3QgOiBpY29uU25hcHNob3RzKSB7Ci0gICAgICAg
ICAgICB3cml0ZUljb25TbmFwc2hvdFRvU1FMRGF0YWJhc2Uoc25hcHNob3QpOwotICAgICAgICAg
ICAgTE9HKEljb25EYXRhYmFzZSwgIldyb3RlIEljb25SZWNvcmQgZm9yIEljb25VUkwgJXMgd2l0
aCB0aW1lU3RhbXAgb2YgJWkgdG8gdGhlIERCIiwgdXJsRm9yTG9nZ2luZyhzbmFwc2hvdC5pY29u
VVJMKCkpLmFzY2lpKCkuZGF0YSgpLCBzbmFwc2hvdC50aW1lc3RhbXAoKSk7Ci0gICAgICAgIH0K
LQotICAgICAgICBmb3IgKGF1dG8mIHNuYXBzaG90IDogcGFnZVNuYXBzaG90cykgewotICAgICAg
ICAgICAgLy8gSWYgdGhlIGljb24gVVJMIGlzIGVtcHR5LCB0aGlzIHBhZ2UgaXMgbWVhbnQgdG8g
YmUgZGVsZXRlZAotICAgICAgICAgICAgLy8gQVNTRVJUcyBhcmUgc2FuaXR5IGNoZWNrcyB0byBt
YWtlIHN1cmUgdGhlIG1hcHBpbmdzIGV4aXN0IGlmIHRoZXkgc2hvdWxkIGFuZCBkb24ndCBpZiB0
aGV5IHNob3VsZG4ndAotICAgICAgICAgICAgaWYgKHNuYXBzaG90Lmljb25VUkwoKS5pc0VtcHR5
KCkpCi0gICAgICAgICAgICAgICAgcmVtb3ZlUGFnZVVSTEZyb21TUUxEYXRhYmFzZShzbmFwc2hv
dC5wYWdlVVJMKCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNldEljb25V
UkxGb3JQYWdlVVJMSW5TUUxEYXRhYmFzZShzbmFwc2hvdC5pY29uVVJMKCksIHNuYXBzaG90LnBh
Z2VVUkwoKSk7Ci0gICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiQ29tbWl0dGVkIEljb25V
UkwgZm9yIFBhZ2VVUkwgJXMgdG8gZGF0YWJhc2UiLCB1cmxGb3JMb2dnaW5nKHNuYXBzaG90LnBh
Z2VVUkwoKSkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY1RyYW5z
YWN0aW9uLmNvbW1pdCgpOwotICAgIH0KLQotICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGVy
ZSBhcmUgbm8gZGFuZ2xpbmcgUGFnZVVSTHMgLSBJZiB0aGVyZSBhcmUsIHdlIHdhbnQgdG8gb3V0
cHV0IG9uZSBsb2cgbWVzc2FnZSBidXQgbm90IHNwYW0gdGhlIGNvbnNvbGUgcG90ZW50aWFsbHkg
ZXZlcnkgZmV3IHNlY29uZHMKLSAgICBpZiAoZGlkQW55V29yaykKLSAgICAgICAgY2hlY2tGb3JE
YW5nbGluZ1BhZ2VVUkxzKGZhbHNlKTsKLQotI2lmICFMT0dfRElTQUJMRUQKLSAgICBTZWNvbmRz
IGRlbHRhID0gTW9ub3RvbmljVGltZTo6bm93KCkgLSB0aW1lU3RhbXA7Ci0gICAgTE9HKEljb25E
YXRhYmFzZSwgIlVwZGF0aW5nIHRoZSBkYXRhYmFzZSB0b29rICUuNGYgc2Vjb25kcyIsIGRlbHRh
LnZhbHVlKCkpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gZGlkQW55V29yazsKLX0KLQotdm9pZCBJ
Y29uRGF0YWJhc2U6OnBydW5lVW5yZXRhaW5lZEljb25zKCkKLXsKLSAgICBBU1NFUlRfSUNPTl9T
WU5DX1RIUkVBRCgpOwotCi0gICAgaWYgKCFpc09wZW4oKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIHJ1bgotICAg
IEFTU0VSVCghbV9pbml0aWFsUHJ1bmluZ0NvbXBsZXRlKTsKLQotICAgIC8vIFRoaXMgbWV0aG9k
IHJlbGllcyBvbiBoYXZpbmcgcmVhZCBpbiBhbGwgcGFnZSBVUkxzIGZyb20gdGhlIGRhdGFiYXNl
IGVhcmxpZXIuCi0gICAgQVNTRVJUKG1faWNvblVSTEltcG9ydENvbXBsZXRlKTsKLQotICAgIC8v
IEdldCB0aGUga25vd24gUGFnZVVSTHMgZnJvbSB0aGUgZGIsIGFuZCByZWNvcmQgdGhlIElEIG9m
IGFueSB0aGF0IGFyZSBub3QgaW4gdGhlIHJldGFpbiBjb3VudCBzZXQuCi0gICAgVmVjdG9yPGlu
dDY0X3Q+IHBhZ2VJRHNUb0RlbGV0ZTsKLQotICAgIFNRTGl0ZVN0YXRlbWVudCBwYWdlU1FMKG1f
c3luY0RCLCAiU0VMRUNUIHJvd2lkLCB1cmwgRlJPTSBQYWdlVVJMOyIpOwotICAgIHBhZ2VTUUwu
cHJlcGFyZSgpOwotCi0gICAgaW50IHJlc3VsdDsKLSAgICB3aGlsZSAoKHJlc3VsdCA9IHBhZ2VT
UUwuc3RlcCgpKSA9PSBTUUxJVEVfUk9XKSB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1f
dXJsQW5kSWNvbkxvY2spOwotICAgICAgICBpZiAoIW1fcGFnZVVSTFRvUmVjb3JkTWFwLmNvbnRh
aW5zKHBhZ2VTUUwuZ2V0Q29sdW1uVGV4dCgxKSkpCi0gICAgICAgICAgICBwYWdlSURzVG9EZWxl
dGUuYXBwZW5kKHBhZ2VTUUwuZ2V0Q29sdW1uSW50NjQoMCkpOwotICAgIH0KLQotICAgIGlmIChy
ZXN1bHQgIT0gU1FMSVRFX0RPTkUpCi0gICAgICAgIExPR19FUlJPUigiRXJyb3IgcmVhZGluZyBQ
YWdlVVJMIHRhYmxlIGZyb20gb24tZGlzayBEQiIpOwotICAgIHBhZ2VTUUwuZmluYWxpemUoKTsK
LQotICAgIC8vIERlbGV0ZSBwYWdlIFVSTHMgdGhhdCB3ZXJlIGluIHRoZSB0YWJsZSwgYnV0IG5v
dCBpbiBvdXIgcmV0YWluIGNvdW50IHNldC4KLSAgICBzaXplX3QgbnVtVG9EZWxldGUgPSBwYWdl
SURzVG9EZWxldGUuc2l6ZSgpOwotICAgIGlmIChudW1Ub0RlbGV0ZSkgewotICAgICAgICBTUUxp
dGVUcmFuc2FjdGlvbiBwcnVuaW5nVHJhbnNhY3Rpb24obV9zeW5jREIpOwotICAgICAgICBwcnVu
aW5nVHJhbnNhY3Rpb24uYmVnaW4oKTsKLQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcGFnZURl
bGV0ZVNRTChtX3N5bmNEQiwgIkRFTEVURSBGUk9NIFBhZ2VVUkwgV0hFUkUgcm93aWQgPSAoPyk7
Iik7Ci0gICAgICAgIHBhZ2VEZWxldGVTUUwucHJlcGFyZSgpOwotICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IG51bVRvRGVsZXRlOyArK2kpIHsKLSAgICAgICAgICAgIExPRyhJY29uRGF0
YWJhc2UsICJQcnVuaW5nIHBhZ2Ugd2l0aCByb3dpZCAlbGxpIGZyb20gZGlzayIsIHN0YXRpY19j
YXN0PGxvbmcgbG9uZz4ocGFnZUlEc1RvRGVsZXRlW2ldKSk7Ci0gICAgICAgICAgICBwYWdlRGVs
ZXRlU1FMLmJpbmRJbnQ2NCgxLCBwYWdlSURzVG9EZWxldGVbaV0pOwotICAgICAgICAgICAgaW50
IHJlc3VsdCA9IHBhZ2VEZWxldGVTUUwuc3RlcCgpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAh
PSBTUUxJVEVfRE9ORSkKLSAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJsZWQgdG8gZGVs
ZXRlIHBhZ2Ugd2l0aCBpZCAlbGxpIGZyb20gZGlzayIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4o
cGFnZUlEc1RvRGVsZXRlW2ldKSk7Ci0gICAgICAgICAgICBwYWdlRGVsZXRlU1FMLnJlc2V0KCk7
Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgd2FzIGFza2VkIHRvIHRlcm1pbmF0ZSwg
d2Ugc2hvdWxkIGNvbW1pdCB3aGF0IHBydW5pbmcgd2UndmUgZG9uZSBzbyBmYXIsIGZpZ3VyaW5n
IHdlIGNhbgotICAgICAgICAgICAgLy8gZmluaXNoIHRoZSByZXN0IGxhdGVyIChob3BlZnVsbHkp
Ci0gICAgICAgICAgICBpZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpIHsKLSAgICAgICAg
ICAgICAgICBwcnVuaW5nVHJhbnNhY3Rpb24uY29tbWl0KCk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xlYXJTdGF0ZW1lbnRzKCk7CisgICAg
ICAgICAgICBtX2RiLmNsZWFyQWxsVGFibGVzKCk7CisgICAgICAgICAgICBtX2RiLnJ1blZhY3V1
bUNvbW1hbmQoKTsKKyAgICAgICAgICAgIGNyZWF0ZVRhYmxlc0lmTmVlZGVkKCk7CiAgICAgICAg
IH0KLSAgICAgICAgcHJ1bmluZ1RyYW5zYWN0aW9uLmNvbW1pdCgpOwotICAgICAgICBwYWdlRGVs
ZXRlU1FMLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgLy8gRGVsZXRpbmcgdW5yZWZlcmVuY2Vk
IGljb25zIGZyb20gdGhlIEljb24gdGFibGVzIGhhcyB0byBiZSBhdG9taWMgLQotICAgIC8vIElm
IHRoZSB1c2VyIHF1aXRzIHdoaWxlIHRoZXNlIGFyZSB0YWtpbmcgcGxhY2UsIHRoZXkgbWlnaHQg
aGF2ZSB0byB3YWl0LiBUaGFua2Z1bGx5IHRoaXMgd2lsbCByYXJlbHkgYmUgYW4gaXNzdWUKLSAg
ICAvLyBBIHVzZXIgb24gYSBuZXR3b3JrIGhvbWUgZGlyZWN0b3J5IHdpdGggYSB3aWxkbHkgaW5j
b25zaXN0ZW50IGRhdGFiYXNlIG1pZ2h0IHNlZSBxdWl0ZSBhIHBhdXNlLi4uCi0KLSAgICBTUUxp
dGVUcmFuc2FjdGlvbiBwcnVuaW5nVHJhbnNhY3Rpb24obV9zeW5jREIpOwotICAgIHBydW5pbmdU
cmFuc2FjdGlvbi5iZWdpbigpOwotCi0gICAgLy8gV2lwZSBJY29ucyB0aGF0IGFyZW4ndCByZXRh
aW5lZAotICAgIGlmICghbV9zeW5jREIuZXhlY3V0ZUNvbW1hbmQoIkRFTEVURSBGUk9NIEljb25E
YXRhIFdIRVJFIGljb25JRCBOT1QgSU4gKFNFTEVDVCBpY29uSUQgRlJPTSBQYWdlVVJMKTsiKSkK
LSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZXhlY3V0ZSBTUUwgdG8gcHJ1bmUgdW5yZXRh
aW5lZCBpY29ucyBmcm9tIHRoZSBvbi1kaXNrIEljb25EYXRhIHRhYmxlIik7Ci0gICAgaWYgKCFt
X3N5bmNEQi5leGVjdXRlQ29tbWFuZCgiREVMRVRFIEZST00gSWNvbkluZm8gV0hFUkUgaWNvbklE
IE5PVCBJTiAoU0VMRUNUIGljb25JRCBGUk9NIFBhZ2VVUkwpOyIpKQotICAgICAgICBMT0dfRVJS
T1IoIkZhaWxlZCB0byBleGVjdXRlIFNRTCB0byBwcnVuZSB1bnJldGFpbmVkIGljb25zIGZyb20g
dGhlIG9uLWRpc2sgSWNvbkluZm8gdGFibGUiKTsKLQotICAgIHBydW5pbmdUcmFuc2FjdGlvbi5j
b21taXQoKTsKLQotICAgIGNoZWNrRm9yRGFuZ2xpbmdQYWdlVVJMcyh0cnVlKTsKLQotICAgIG1f
aW5pdGlhbFBydW5pbmdDb21wbGV0ZSA9IHRydWU7Ci19Ci0KLXZvaWQgSWNvbkRhdGFiYXNlOjpj
aGVja0ZvckRhbmdsaW5nUGFnZVVSTHMoYm9vbCBwcnVuZUlmRm91bmQpCi17Ci0gICAgQVNTRVJU
X0lDT05fU1lOQ19USFJFQUQoKTsKLQotICAgIC8vIFRoaXMgY2hlY2sgY2FuIGJlIHJlbGF0aXZl
bHkgZXhwZW5zaXZlIHNvIHdlIGRvbid0IGRvIGl0IGluIGEgcmVsZWFzZSBidWlsZCB1bmxlc3Mg
dGhlIGNhbGxlciBoYXMgYXNrZWQgdXMgdG8gcHJ1bmUgYW55IGRhbmdsaW5nCi0gICAgLy8gZW50
cmllcy4gV2UgYWxzbyBkb24ndCB3YW50IHRvIGtlZXAgcGVyZm9ybWluZyB0aGlzIGNoZWNrIGFu
ZCByZXBvcnRpbmcgdGhpcyBlcnJvciBpZiBpdCBoYXMgYWxyZWFkeSBmb3VuZCBkYW5nbGVycyBi
ZWZvcmUgc28gd2UKLSAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UndmUgZm91bmQgYW55
LiBXZSBza2lwIHRoZSBjaGVjayBpbiB0aGUgcmVsZWFzZSBidWlsZCBwcmV0ZW5kaW5nIHRvIGhh
dmUgYWxyZWFkeSBmb3VuZCBkYW5nbGVycyBhbHJlYWR5LgotI2lmbmRlZiBOREVCVUcKLSAgICBz
dGF0aWMgYm9vbCBkYW5nbGVyc0ZvdW5kID0gdHJ1ZTsKLSNlbHNlCi0gICAgc3RhdGljIGJvb2wg
ZGFuZ2xlcnNGb3VuZCA9IGZhbHNlOwotI2VuZGlmCi0KLSAgICBpZiAoKHBydW5lSWZGb3VuZCB8
fCAhZGFuZ2xlcnNGb3VuZCkgJiYgU1FMaXRlU3RhdGVtZW50KG1fc3luY0RCLCAiU0VMRUNUIHVy
bCBGUk9NIFBhZ2VVUkwgV0hFUkUgUGFnZVVSTC5pY29uSUQgTk9UIElOIChTRUxFQ1QgaWNvbklE
IEZST00gSWNvbkluZm8pIExJTUlUIDE7IikucmV0dXJuc0F0TGVhc3RPbmVSZXN1bHQoKSkgewot
ICAgICAgICBkYW5nbGVyc0ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgTE9HKEljb25EYXRhYmFzZSwg
IkRhbmdsaW5nIFBhZ2VVUkwgZW50cmllcyBmb3VuZCIpOwotICAgICAgICBpZiAocHJ1bmVJZkZv
dW5kICYmICFtX3N5bmNEQi5leGVjdXRlQ29tbWFuZCgiREVMRVRFIEZST00gUGFnZVVSTCBXSEVS
RSBpY29uSUQgTk9UIElOIChTRUxFQ1QgaWNvbklEIEZST00gSWNvbkluZm8pOyIpKQotICAgICAg
ICAgICAgTE9HKEljb25EYXRhYmFzZSwgIlVuYWJsZSB0byBwcnVuZSBkYW5nbGluZyBQYWdlVVJM
cyIpOwotICAgIH0KLX0KLQotdm9pZCBJY29uRGF0YWJhc2U6OnJlbW92ZUFsbEljb25zT25UaHJl
YWQoKQotewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICBMT0coSWNvbkRh
dGFiYXNlLCAiUmVtb3ZpbmcgYWxsIGljb25zIG9uIHRoZSBzeW5jIHRocmVhZCIpOwotCi0gICAg
Ly8gRGVsZXRlIGFsbCB0aGUgcHJlcGFyZWQgc3RhdGVtZW50cyBzbyB0aGV5IGNhbiBzdGFydCBv
dmVyCi0gICAgZGVsZXRlQWxsUHJlcGFyZWRTdGF0ZW1lbnRzKCk7Ci0KLSAgICAvLyBUbyByZXNl
dCB0aGUgb24tZGlzayBkYXRhYmFzZSwgd2UnbGwgd2lwZSBhbGwgaXRzIHRhYmxlcyB0aGVuIHZh
Y3V1bSBpdAotICAgIC8vIFRoaXMgaXMgZWFzaWVyIGFuZCBzYWZlciB0aGFuIGNsb3NpbmcgaXQs
IGRlbGV0aW5nIHRoZSBmaWxlLCBhbmQgcmVjcmVhdGluZyBmcm9tIHNjcmF0Y2gKLSAgICBtX3N5
bmNEQi5jbGVhckFsbFRhYmxlcygpOwotICAgIG1fc3luY0RCLnJ1blZhY3V1bUNvbW1hbmQoKTsK
LSAgICBjcmVhdGVEYXRhYmFzZVRhYmxlcyhtX3N5bmNEQik7Ci19Ci0KLXZvaWQgSWNvbkRhdGFi
YXNlOjpkZWxldGVBbGxQcmVwYXJlZFN0YXRlbWVudHMoKQotewotICAgIEFTU0VSVF9JQ09OX1NZ
TkNfVEhSRUFEKCk7Ci0KLSAgICBtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQgPSBudWxs
cHRyOwotICAgIG1fcmVtb3ZlUGFnZVVSTFN0YXRlbWVudCA9IG51bGxwdHI7Ci0gICAgbV9nZXRJ
Y29uSURGb3JJY29uVVJMU3RhdGVtZW50ID0gbnVsbHB0cjsKLSAgICBtX2dldEltYWdlRGF0YUZv
ckljb25VUkxTdGF0ZW1lbnQgPSBudWxscHRyOwotICAgIG1fYWRkSWNvblRvSWNvbkluZm9TdGF0
ZW1lbnQgPSBudWxscHRyOwotICAgIG1fYWRkSWNvblRvSWNvbkRhdGFTdGF0ZW1lbnQgPSBudWxs
cHRyOwotICAgIG1fZ2V0SW1hZ2VEYXRhU3RhdGVtZW50ID0gbnVsbHB0cjsKLSAgICBtX2RlbGV0
ZVBhZ2VVUkxzRm9ySWNvblVSTFN0YXRlbWVudCA9IG51bGxwdHI7Ci0gICAgbV9kZWxldGVJY29u
RnJvbUljb25JbmZvU3RhdGVtZW50ID0gbnVsbHB0cjsKLSAgICBtX2RlbGV0ZUljb25Gcm9tSWNv
bkRhdGFTdGF0ZW1lbnQgPSBudWxscHRyOwotICAgIG1fdXBkYXRlSWNvbkluZm9TdGF0ZW1lbnQg
PSBudWxscHRyOwotICAgIG1fdXBkYXRlSWNvbkRhdGFTdGF0ZW1lbnQgID0gbnVsbHB0cjsKLSAg
ICBtX3NldEljb25JbmZvU3RhdGVtZW50ID0gbnVsbHB0cjsKLSAgICBtX3NldEljb25EYXRhU3Rh
dGVtZW50ID0gbnVsbHB0cjsKLX0KLQotdm9pZCogSWNvbkRhdGFiYXNlOjpjbGVhbnVwU3luY1Ro
cmVhZCgpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKLQotI2lmICFMT0dfRElT
QUJMRUQKLSAgICBNb25vdG9uaWNUaW1lIHRpbWVTdGFtcCA9IE1vbm90b25pY1RpbWU6Om5vdygp
OwotI2VuZGlmCi0KLSAgICAvLyBJZiB0aGUgcmVtb3ZlSWNvbnMgZmxhZyBpcyBzZXQsIHJlbW92
ZSBhbGwgaWNvbnMgZnJvbSB0aGUgZGIuCi0gICAgaWYgKG1fcmVtb3ZlSWNvbnNSZXF1ZXN0ZWQp
Ci0gICAgICAgIHJlbW92ZUFsbEljb25zT25UaHJlYWQoKTsKLQotICAgIC8vIFN5bmMgcmVtYWlu
aW5nIGljb25zIG91dAotICAgIExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBEb2luZyBmaW5h
bCB3cml0ZW91dCBhbmQgY2xvc3VyZSBvZiBzeW5jIHRocmVhZCIpOwotICAgIHdyaXRlVG9EYXRh
YmFzZSgpOwotCi0gICAgLy8gQ2xvc2UgdGhlIGRhdGFiYXNlCi0gICAgTG9ja0hvbGRlciBsb2Nr
ZXIobV9zeW5jTG9jayk7Ci0KLSAgICBtX2RhdGFiYXNlRGlyZWN0b3J5ID0gU3RyaW5nKCk7Ci0g
ICAgbV9jb21wbGV0ZURhdGFiYXNlUGF0aCA9IFN0cmluZygpOwotICAgIGRlbGV0ZUFsbFByZXBh
cmVkU3RhdGVtZW50cygpOwotICAgIG1fc3luY0RCLmNsb3NlKCk7Ci0KLSNpZiAhTE9HX0RJU0FC
TEVECi0gICAgU2Vjb25kcyBkZWx0YSA9IE1vbm90b25pY1RpbWU6Om5vdygpIC0gdGltZVN0YW1w
OwotICAgIExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBGaW5hbCBjbG9zdXJlIHRvb2sgJS40
ZiBzZWNvbmRzIiwgZGVsdGEudmFsdWUoKSk7Ci0jZW5kaWYKLQotICAgIG1fc3luY1RocmVhZFJ1
bm5pbmcgPSBmYWxzZTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotLy8gcmVhZHlTUUxpdGVT
dGF0ZW1lbnQoKSBoYW5kbGVzIHR3byB0aGluZ3MKLS8vIDEgLSBJZiB0aGUgU1FMRGF0YWJhc2Um
IGFyZ3VtZW50IGlzIGRpZmZlcmVudCwgdGhlIHN0YXRlbWVudCBtdXN0IGJlIGRlc3Ryb3llZCBh
bmQgcmVtYWRlLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgdXNlcgotLy8gICAgIHN3aXRjaGVzIHRv
IGFuZCBmcm9tIHByaXZhdGUgYnJvd3NpbmcKLS8vIDIgLSBMYXp5IGNvbnN0cnVjdGlvbiBvZiB0
aGUgU3RhdGVtZW50IGluIHRoZSBmaXJzdCBwbGFjZSwgaW4gY2FzZSB3ZSd2ZSBuZXZlciBtYWRl
IHRoaXMgcXVlcnkgYmVmb3JlCi1pbmxpbmUgdm9pZCByZWFkeVNRTGl0ZVN0YXRlbWVudChzdGQ6
OnVuaXF1ZV9wdHI8U1FMaXRlU3RhdGVtZW50PiYgc3RhdGVtZW50LCBTUUxpdGVEYXRhYmFzZSYg
ZGIsIGNvbnN0IFN0cmluZyYgc3RyKQotewotICAgIGlmIChzdGF0ZW1lbnQgJiYgKCZzdGF0ZW1l
bnQtPmRhdGFiYXNlKCkgIT0gJmRiIHx8IHN0YXRlbWVudC0+aXNFeHBpcmVkKCkpKSB7Ci0gICAg
ICAgIGlmIChzdGF0ZW1lbnQtPmlzRXhwaXJlZCgpKQotICAgICAgICAgICAgTE9HKEljb25EYXRh
YmFzZSwgIlNRTGl0ZVN0YXRlbWVudCBhc3NvY2lhdGVkIHdpdGggJXMgaXMgZXhwaXJlZCIsIHN0
ci5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAgIHN0YXRlbWVudCA9IG51bGxwdHI7Ci0gICAgfQot
ICAgIGlmICghc3RhdGVtZW50KSB7Ci0gICAgICAgIHN0YXRlbWVudCA9IG1ha2VVbmlxdWU8U1FM
aXRlU3RhdGVtZW50PihkYiwgc3RyKTsKLSAgICAgICAgaWYgKHN0YXRlbWVudC0+cHJlcGFyZSgp
ICE9IFNRTElURV9PSykKLSAgICAgICAgICAgIExPR19FUlJPUigiUHJlcGFyaW5nIHN0YXRlbWVu
dCAlcyBmYWlsZWQiLCBzdHIuYXNjaWkoKS5kYXRhKCkpOwotICAgIH0KLX0KLQotdm9pZCBJY29u
RGF0YWJhc2U6OnNldEljb25VUkxGb3JQYWdlVVJMSW5TUUxEYXRhYmFzZShjb25zdCBTdHJpbmcm
IGljb25VUkwsIGNvbnN0IFN0cmluZyYgcGFnZVVSTCkKLXsKLSAgICBBU1NFUlRfSUNPTl9TWU5D
X1RIUkVBRCgpOwotCi0gICAgaW50NjRfdCBpY29uSUQgPSBnZXRJY29uSURGb3JJY29uVVJMRnJv
bVNRTERhdGFiYXNlKGljb25VUkwpOwotCi0gICAgaWYgKCFpY29uSUQpCi0gICAgICAgIGljb25J
RCA9IGFkZEljb25VUkxUb1NRTERhdGFiYXNlKGljb25VUkwpOwotCi0gICAgaWYgKCFpY29uSUQp
IHsKLSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZXN0YWJsaXNoIGFuIElEIGZvciBpY29u
VVJMICVzIiwgdXJsRm9yTG9nZ2luZyhpY29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7Ci0gICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2V0
SWNvbklERm9yUGFnZVVSTEluU1FMRGF0YWJhc2UoaWNvbklELCBwYWdlVVJMKTsKLX0KLQotdm9p
ZCBJY29uRGF0YWJhc2U6OnNldEljb25JREZvclBhZ2VVUkxJblNRTERhdGFiYXNlKGludDY0X3Qg
aWNvbklELCBjb25zdCBTdHJpbmcmIHBhZ2VVUkwpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19U
SFJFQUQoKTsKLQotICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fc2V0SWNvbklERm9yUGFnZVVS
TFN0YXRlbWVudCwgbV9zeW5jREIsICJJTlNFUlQgSU5UTyBQYWdlVVJMICh1cmwsIGljb25JRCkg
VkFMVUVTICgoPyksID8pOyIpOwotICAgIG1fc2V0SWNvbklERm9yUGFnZVVSTFN0YXRlbWVudC0+
YmluZFRleHQoMSwgcGFnZVVSTCk7Ci0gICAgbV9zZXRJY29uSURGb3JQYWdlVVJMU3RhdGVtZW50
LT5iaW5kSW50NjQoMiwgaWNvbklEKTsKLQotICAgIGludCByZXN1bHQgPSBtX3NldEljb25JREZv
clBhZ2VVUkxTdGF0ZW1lbnQtPnN0ZXAoKTsKLSAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05F
KSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBMT0dfRVJST1IoInNl
dEljb25JREZvclBhZ2VVUkxRdWVyeSBmYWlsZWQgZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmco
cGFnZVVSTCkuYXNjaWkoKS5kYXRhKCkpOwotICAgIH0KLQotICAgIG1fc2V0SWNvbklERm9yUGFn
ZVVSTFN0YXRlbWVudC0+cmVzZXQoKTsKLX0KLQotdm9pZCBJY29uRGF0YWJhc2U6OnJlbW92ZVBh
Z2VVUkxGcm9tU1FMRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBwYWdlVVJMKQotewotICAgIEFTU0VS
VF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX3JlbW92
ZVBhZ2VVUkxTdGF0ZW1lbnQsIG1fc3luY0RCLCAiREVMRVRFIEZST00gUGFnZVVSTCBXSEVSRSB1
cmwgPSAoPyk7Iik7Ci0gICAgbV9yZW1vdmVQYWdlVVJMU3RhdGVtZW50LT5iaW5kVGV4dCgxLCBw
YWdlVVJMKTsKLQotICAgIGlmIChtX3JlbW92ZVBhZ2VVUkxTdGF0ZW1lbnQtPnN0ZXAoKSAhPSBT
UUxJVEVfRE9ORSkKLSAgICAgICAgTE9HX0VSUk9SKCJyZW1vdmVQYWdlVVJMRnJvbVNRTERhdGFi
YXNlIGZhaWxlZCBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhwYWdlVVJMKS5hc2NpaSgpLmRh
dGEoKSk7Ci0KLSAgICBtX3JlbW92ZVBhZ2VVUkxTdGF0ZW1lbnQtPnJlc2V0KCk7Ci19Ci0KLQot
aW50NjRfdCBJY29uRGF0YWJhc2U6OmdldEljb25JREZvckljb25VUkxGcm9tU1FMRGF0YWJhc2Uo
Y29uc3QgU3RyaW5nJiBpY29uVVJMKQotewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7
Ci0KLSAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX2dldEljb25JREZvckljb25VUkxTdGF0ZW1l
bnQsIG1fc3luY0RCLCAiU0VMRUNUIEljb25JbmZvLmljb25JRCBGUk9NIEljb25JbmZvIFdIRVJF
IEljb25JbmZvLnVybCA9ICg/KTsiKTsKLSAgICBtX2dldEljb25JREZvckljb25VUkxTdGF0ZW1l
bnQtPmJpbmRUZXh0KDEsIGljb25VUkwpOwotCi0gICAgaW50NjRfdCByZXN1bHQgPSBtX2dldElj
b25JREZvckljb25VUkxTdGF0ZW1lbnQtPnN0ZXAoKTsKLSAgICBpZiAocmVzdWx0ID09IFNRTElU
RV9ST1cpCi0gICAgICAgIHJlc3VsdCA9IG1fZ2V0SWNvbklERm9ySWNvblVSTFN0YXRlbWVudC0+
Z2V0Q29sdW1uSW50NjQoMCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gU1FM
SVRFX0RPTkUpCi0gICAgICAgICAgICBMT0dfRVJST1IoImdldEljb25JREZvckljb25VUkxGcm9t
U1FMRGF0YWJhc2UgZmFpbGVkIGZvciB1cmwgJXMiLCB1cmxGb3JMb2dnaW5nKGljb25VUkwpLmFz
Y2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICB9Ci0KLSAgICBtX2dldElj
b25JREZvckljb25VUkxTdGF0ZW1lbnQtPnJlc2V0KCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0K
LQotaW50NjRfdCBJY29uRGF0YWJhc2U6OmFkZEljb25VUkxUb1NRTERhdGFiYXNlKGNvbnN0IFN0
cmluZyYgaWNvblVSTCkKLXsKLSAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOwotCi0gICAg
Ly8gVGhlcmUgd291bGQgYmUgYSB0cmFuc2FjdGlvbiBoZXJlIHRvIG1ha2Ugc3VyZSB0aGVzZSB0
d28gaW5zZXJ0cyBhcmUgYXRvbWljCi0gICAgLy8gSW4gcHJhY3RpY2UgdGhlIG9ubHkgY2FsbGVy
IG9mIHRoaXMgbWV0aG9kIGlzIGFsd2F5cyB3cmFwcGVkIGluIGEgdHJhbnNhY3Rpb24gaXRzZWxm
IHNvIHBsYWNpbmcgYW5vdGhlcgotICAgIC8vIGhlcmUgaXMgdW5uZWNlc3NhcnkKLQotICAgIHJl
YWR5U1FMaXRlU3RhdGVtZW50KG1fYWRkSWNvblRvSWNvbkluZm9TdGF0ZW1lbnQsIG1fc3luY0RC
LCAiSU5TRVJUIElOVE8gSWNvbkluZm8gKHVybCwgc3RhbXApIFZBTFVFUyAoPywgMCk7Iik7Ci0g
ICAgbV9hZGRJY29uVG9JY29uSW5mb1N0YXRlbWVudC0+YmluZFRleHQoMSwgaWNvblVSTCk7Ci0K
LSAgICBpbnQgcmVzdWx0ID0gbV9hZGRJY29uVG9JY29uSW5mb1N0YXRlbWVudC0+c3RlcCgpOwot
ICAgIG1fYWRkSWNvblRvSWNvbkluZm9TdGF0ZW1lbnQtPnJlc2V0KCk7Ci0gICAgaWYgKHJlc3Vs
dCAhPSBTUUxJVEVfRE9ORSkgewotICAgICAgICBMT0dfRVJST1IoImFkZEljb25VUkxUb1NRTERh
dGFiYXNlIGZhaWxlZCB0byBpbnNlcnQgJXMgaW50byBJY29uSW5mbyIsIHVybEZvckxvZ2dpbmco
aWNvblVSTCkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAg
aW50NjRfdCBpY29uSUQgPSBtX3N5bmNEQi5sYXN0SW5zZXJ0Um93SUQoKTsKLQotICAgIHJlYWR5
U1FMaXRlU3RhdGVtZW50KG1fYWRkSWNvblRvSWNvbkRhdGFTdGF0ZW1lbnQsIG1fc3luY0RCLCAi
SU5TRVJUIElOVE8gSWNvbkRhdGEgKGljb25JRCwgZGF0YSkgVkFMVUVTICg/LCA/KTsiKTsKLSAg
ICBtX2FkZEljb25Ub0ljb25EYXRhU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKTsKLQot
ICAgIHJlc3VsdCA9IG1fYWRkSWNvblRvSWNvbkRhdGFTdGF0ZW1lbnQtPnN0ZXAoKTsKLSAgICBt
X2FkZEljb25Ub0ljb25EYXRhU3RhdGVtZW50LT5yZXNldCgpOwotICAgIGlmIChyZXN1bHQgIT0g
U1FMSVRFX0RPTkUpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJhZGRJY29uVVJMVG9TUUxEYXRhYmFz
ZSBmYWlsZWQgdG8gaW5zZXJ0ICVzIGludG8gSWNvbkRhdGEiLCB1cmxGb3JMb2dnaW5nKGljb25V
UkwpLmFzY2lpKCkuZGF0YSgpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0
dXJuIGljb25JRDsKLX0KLQotUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gSWNvbkRhdGFiYXNlOjpnZXRJ
bWFnZURhdGFGb3JJY29uVVJMRnJvbVNRTERhdGFiYXNlKGNvbnN0IFN0cmluZyYgaWNvblVSTCkK
LXsKLSAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOwotCi0gICAgUmVmUHRyPFNoYXJlZEJ1
ZmZlcj4gaW1hZ2VEYXRhOwotCi0gICAgcmVhZHlTUUxpdGVTdGF0ZW1lbnQobV9nZXRJbWFnZURh
dGFGb3JJY29uVVJMU3RhdGVtZW50LCBtX3N5bmNEQiwgIlNFTEVDVCBJY29uRGF0YS5kYXRhIEZS
T00gSWNvbkRhdGEgV0hFUkUgSWNvbkRhdGEuaWNvbklEIElOIChTRUxFQ1QgaWNvbklEIEZST00g
SWNvbkluZm8gV0hFUkUgSWNvbkluZm8udXJsID0gKD8pKTsiKTsKLSAgICBtX2dldEltYWdlRGF0
YUZvckljb25VUkxTdGF0ZW1lbnQtPmJpbmRUZXh0KDEsIGljb25VUkwpOwotCi0gICAgaW50IHJl
c3VsdCA9IG1fZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTFN0YXRlbWVudC0+c3RlcCgpOwotICAgIGlm
IChyZXN1bHQgPT0gU1FMSVRFX1JPVykgewotICAgICAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKLSAg
ICAgICAgbV9nZXRJbWFnZURhdGFGb3JJY29uVVJMU3RhdGVtZW50LT5nZXRDb2x1bW5CbG9iQXNW
ZWN0b3IoMCwgZGF0YSk7Ci0gICAgICAgIGltYWdlRGF0YSA9IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRl
KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gU1FM
SVRFX0RPTkUpCi0gICAgICAgIExPR19FUlJPUigiZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTEZyb21T
UUxEYXRhYmFzZSBmYWlsZWQgZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmcoaWNvblVSTCkuYXNj
aWkoKS5kYXRhKCkpOwotCi0gICAgbV9nZXRJbWFnZURhdGFGb3JJY29uVVJMU3RhdGVtZW50LT5y
ZXNldCgpOwotCi0gICAgcmV0dXJuIGltYWdlRGF0YTsKLX0KLQotdm9pZCBJY29uRGF0YWJhc2U6
OnJlbW92ZUljb25Gcm9tU1FMRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBpY29uVVJMKQotewotICAg
IEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0KLSAgICBpZiAoaWNvblVSTC5pc0VtcHR5KCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFRoZXJlIHdvdWxkIGJlIGEgdHJhbnNhY3Rpb24g
aGVyZSB0byBtYWtlIHN1cmUgdGhlc2UgcmVtb3ZhbHMgYXJlIGF0b21pYwotICAgIC8vIEluIHBy
YWN0aWNlIHRoZSBvbmx5IGNhbGxlciBvZiB0aGlzIG1ldGhvZCBpcyBhbHdheXMgd3JhcHBlZCBp
biBhIHRyYW5zYWN0aW9uIGl0c2VsZiBzbyBwbGFjaW5nIGFub3RoZXIgaGVyZSBpcyB1bm5lY2Vz
c2FyeQotCi0gICAgLy8gSXQncyBwb3NzaWJsZSB0aGlzIGljb24gaXMgbm90IGluIHRoZSBkYXRh
YmFzZSBiZWNhdXNlIG9mIGNlcnRhaW4gcmFwaWQgYnJvd3NpbmcgcGF0dGVybnMgKHN1Y2ggYXMg
YSBzdHJlc3MgdGVzdCkgd2hlcmUgdGhlCi0gICAgLy8gaWNvbiBpcyBtYXJrZWQgdG8gYmUgYWRk
ZWQgdGhlbiBtYXJrZWQgZm9yIHJlbW92YWwgYmVmb3JlIGl0IGlzIGV2ZXIgd3JpdHRlbiB0byBk
aXNrLiBObyBiaWcgZGVhbCwgZWFybHkgcmV0dXJuCi0gICAgaW50NjRfdCBpY29uSUQgPSBnZXRJ
Y29uSURGb3JJY29uVVJMRnJvbVNRTERhdGFiYXNlKGljb25VUkwpOwotICAgIGlmICghaWNvbklE
KQotICAgICAgICByZXR1cm47Ci0KLSAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX2RlbGV0ZVBh
Z2VVUkxzRm9ySWNvblVSTFN0YXRlbWVudCwgbV9zeW5jREIsICJERUxFVEUgRlJPTSBQYWdlVVJM
IFdIRVJFIFBhZ2VVUkwuaWNvbklEID0gKD8pOyIpOwotICAgIG1fZGVsZXRlUGFnZVVSTHNGb3JJ
Y29uVVJMU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKTsKLQotICAgIGlmIChtX2RlbGV0
ZVBhZ2VVUkxzRm9ySWNvblVSTFN0YXRlbWVudC0+c3RlcCgpICE9IFNRTElURV9ET05FKQotICAg
ICAgICBMT0dfRVJST1IoIm1fZGVsZXRlUGFnZVVSTHNGb3JJY29uVVJMU3RhdGVtZW50IGZhaWxl
ZCBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhpY29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7Ci0K
LSAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX2RlbGV0ZUljb25Gcm9tSWNvbkluZm9TdGF0ZW1l
bnQsIG1fc3luY0RCLCAiREVMRVRFIEZST00gSWNvbkluZm8gV0hFUkUgSWNvbkluZm8uaWNvbklE
ID0gKD8pOyIpOwotICAgIG1fZGVsZXRlSWNvbkZyb21JY29uSW5mb1N0YXRlbWVudC0+YmluZElu
dDY0KDEsIGljb25JRCk7Ci0KLSAgICBpZiAobV9kZWxldGVJY29uRnJvbUljb25JbmZvU3RhdGVt
ZW50LT5zdGVwKCkgIT0gU1FMSVRFX0RPTkUpCi0gICAgICAgIExPR19FUlJPUigibV9kZWxldGVJ
Y29uRnJvbUljb25JbmZvU3RhdGVtZW50IGZhaWxlZCBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2lu
ZyhpY29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7Ci0KLSAgICByZWFkeVNRTGl0ZVN0YXRlbWVudCht
X2RlbGV0ZUljb25Gcm9tSWNvbkRhdGFTdGF0ZW1lbnQsIG1fc3luY0RCLCAiREVMRVRFIEZST00g
SWNvbkRhdGEgV0hFUkUgSWNvbkRhdGEuaWNvbklEID0gKD8pOyIpOwotICAgIG1fZGVsZXRlSWNv
bkZyb21JY29uRGF0YVN0YXRlbWVudC0+YmluZEludDY0KDEsIGljb25JRCk7Ci0KLSAgICBpZiAo
bV9kZWxldGVJY29uRnJvbUljb25EYXRhU3RhdGVtZW50LT5zdGVwKCkgIT0gU1FMSVRFX0RPTkUp
Ci0gICAgICAgIExPR19FUlJPUigibV9kZWxldGVJY29uRnJvbUljb25EYXRhU3RhdGVtZW50IGZh
aWxlZCBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhpY29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7
Ci0KLSAgICBtX2RlbGV0ZVBhZ2VVUkxzRm9ySWNvblVSTFN0YXRlbWVudC0+cmVzZXQoKTsKLSAg
ICBtX2RlbGV0ZUljb25Gcm9tSWNvbkluZm9TdGF0ZW1lbnQtPnJlc2V0KCk7Ci0gICAgbV9kZWxl
dGVJY29uRnJvbUljb25EYXRhU3RhdGVtZW50LT5yZXNldCgpOwotfQotCi12b2lkIEljb25EYXRh
YmFzZTo6d3JpdGVJY29uU25hcHNob3RUb1NRTERhdGFiYXNlKGNvbnN0IEljb25TbmFwc2hvdCYg
c25hcHNob3QpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKLQotICAgIGlmIChz
bmFwc2hvdC5pY29uVVJMKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBB
IG51bGxlZCBvdXQgdGltZXN0YW1wIGFuZCBkYXRhIG1lYW5zIHRoaXMgaWNvbiBpcyBkZXN0aW5l
ZCB0byBiZSBkZWxldGVkIC0gZG8gdGhhdCBpbnN0ZWFkIG9mIHdyaXRpbmcgaXQgb3V0Ci0gICAg
aWYgKCFzbmFwc2hvdC50aW1lc3RhbXAoKSAmJiAhc25hcHNob3QuZGF0YSgpKSB7Ci0gICAgICAg
IExPRyhJY29uRGF0YWJhc2UsICJSZW1vdmluZyAlcyBmcm9tIG9uLWRpc2sgZGF0YWJhc2UiLCB1
cmxGb3JMb2dnaW5nKHNuYXBzaG90Lmljb25VUkwoKSkuYXNjaWkoKS5kYXRhKCkpOwotICAgICAg
ICByZW1vdmVJY29uRnJvbVNRTERhdGFiYXNlKHNuYXBzaG90Lmljb25VUkwoKSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGVyZSB3b3VsZCBiZSBhIHRyYW5zYWN0aW9uIGhl
cmUgdG8gbWFrZSBzdXJlIHRoZXNlIHJlbW92YWxzIGFyZSBhdG9taWMKLSAgICAvLyBJbiBwcmFj
dGljZSB0aGUgb25seSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgaXMgYWx3YXlzIHdyYXBwZWQgaW4g
YSB0cmFuc2FjdGlvbiBpdHNlbGYgc28gcGxhY2luZyBhbm90aGVyIGhlcmUgaXMgdW5uZWNlc3Nh
cnkKLQotICAgIC8vIEdldCB0aGUgaWNvbklEIGZvciB0aGlzIHVybAotICAgIGludDY0X3QgaWNv
bklEID0gZ2V0SWNvbklERm9ySWNvblVSTEZyb21TUUxEYXRhYmFzZShzbmFwc2hvdC5pY29uVVJM
KCkpOwotCi0gICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBpY29uSUQgaW4gcGxhY2UsIHVw
ZGF0ZSB0aGUgZGF0YWJhc2UuCi0gICAgLy8gT3RoZXJ3aXNlLCBpbnNlcnQgbmV3IHJlY29yZHMK
LSAgICBpZiAoaWNvbklEKSB7Ci0gICAgICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fdXBkYXRl
SWNvbkluZm9TdGF0ZW1lbnQsIG1fc3luY0RCLCAiVVBEQVRFIEljb25JbmZvIFNFVCBzdGFtcCA9
ID8sIHVybCA9ID8gV0hFUkUgaWNvbklEID0gPzsiKTsKLSAgICAgICAgbV91cGRhdGVJY29uSW5m
b1N0YXRlbWVudC0+YmluZEludDY0KDEsIHNuYXBzaG90LnRpbWVzdGFtcCgpKTsKLSAgICAgICAg
bV91cGRhdGVJY29uSW5mb1N0YXRlbWVudC0+YmluZFRleHQoMiwgc25hcHNob3QuaWNvblVSTCgp
KTsKLSAgICAgICAgbV91cGRhdGVJY29uSW5mb1N0YXRlbWVudC0+YmluZEludDY0KDMsIGljb25J
RCk7Ci0KLSAgICAgICAgaWYgKG1fdXBkYXRlSWNvbkluZm9TdGF0ZW1lbnQtPnN0ZXAoKSAhPSBT
UUxJVEVfRE9ORSkKLSAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHVwZGF0ZSBpY29u
IGluZm8gZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmcoc25hcHNob3QuaWNvblVSTCgpKS5hc2Np
aSgpLmRhdGEoKSk7Ci0KLSAgICAgICAgbV91cGRhdGVJY29uSW5mb1N0YXRlbWVudC0+cmVzZXQo
KTsKLQotICAgICAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX3VwZGF0ZUljb25EYXRhU3RhdGVt
ZW50LCBtX3N5bmNEQiwgIlVQREFURSBJY29uRGF0YSBTRVQgZGF0YSA9ID8gV0hFUkUgaWNvbklE
ID0gPzsiKTsKLSAgICAgICAgbV91cGRhdGVJY29uRGF0YVN0YXRlbWVudC0+YmluZEludDY0KDIs
IGljb25JRCk7Ci0KLSAgICAgICAgLy8gSWYgd2UgKmhhdmUqIGltYWdlIGRhdGEsIGJpbmQgaXQg
dG8gdGhpcyBzdGF0ZW1lbnQgLSBPdGhlcndpc2UgYmluZCAibnVsbCIgZm9yIHRoZSBibG9iIGRh
dGEsCi0gICAgICAgIC8vIHNpZ25pZnlpbmcgdGhhdCB0aGlzIGljb24gZG9lc24ndCBoYXZlIGFu
eSBkYXRhCi0gICAgICAgIGlmIChzbmFwc2hvdC5kYXRhKCkgJiYgc25hcHNob3QuZGF0YSgpLT5z
aXplKCkpCi0gICAgICAgICAgICBtX3VwZGF0ZUljb25EYXRhU3RhdGVtZW50LT5iaW5kQmxvYigx
LCBzbmFwc2hvdC5kYXRhKCktPmRhdGEoKSwgc25hcHNob3QuZGF0YSgpLT5zaXplKCkpOwotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICBtX3VwZGF0ZUljb25EYXRhU3RhdGVtZW50LT5iaW5kTnVs
bCgxKTsKLQotICAgICAgICBpZiAobV91cGRhdGVJY29uRGF0YVN0YXRlbWVudC0+c3RlcCgpICE9
IFNRTElURV9ET05FKQotICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gdXBkYXRlIGlj
b24gZGF0YSBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhzbmFwc2hvdC5pY29uVVJMKCkpLmFz
Y2lpKCkuZGF0YSgpKTsKLQotICAgICAgICBtX3VwZGF0ZUljb25EYXRhU3RhdGVtZW50LT5yZXNl
dCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fc2V0SWNv
bkluZm9TdGF0ZW1lbnQsIG1fc3luY0RCLCAiSU5TRVJUIElOVE8gSWNvbkluZm8gKHVybCxzdGFt
cCkgVkFMVUVTICg/LCA/KTsiKTsKLSAgICAgICAgbV9zZXRJY29uSW5mb1N0YXRlbWVudC0+Ymlu
ZFRleHQoMSwgc25hcHNob3QuaWNvblVSTCgpKTsKLSAgICAgICAgbV9zZXRJY29uSW5mb1N0YXRl
bWVudC0+YmluZEludDY0KDIsIHNuYXBzaG90LnRpbWVzdGFtcCgpKTsKLQotICAgICAgICBpZiAo
bV9zZXRJY29uSW5mb1N0YXRlbWVudC0+c3RlcCgpICE9IFNRTElURV9ET05FKQotICAgICAgICAg
ICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGljb24gaW5mbyBmb3IgdXJsICVzIiwgdXJsRm9y
TG9nZ2luZyhzbmFwc2hvdC5pY29uVVJMKCkpLmFzY2lpKCkuZGF0YSgpKTsKLQotICAgICAgICBt
X3NldEljb25JbmZvU3RhdGVtZW50LT5yZXNldCgpOwotCi0gICAgICAgIGludDY0X3QgaWNvbklE
ID0gbV9zeW5jREIubGFzdEluc2VydFJvd0lEKCk7Ci0KLSAgICAgICAgcmVhZHlTUUxpdGVTdGF0
ZW1lbnQobV9zZXRJY29uRGF0YVN0YXRlbWVudCwgbV9zeW5jREIsICJJTlNFUlQgSU5UTyBJY29u
RGF0YSAoaWNvbklELCBkYXRhKSBWQUxVRVMgKD8sID8pOyIpOwotICAgICAgICBtX3NldEljb25E
YXRhU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKTsKLQotICAgICAgICAvLyBJZiB3ZSAq
aGF2ZSogaW1hZ2UgZGF0YSwgYmluZCBpdCB0byB0aGlzIHN0YXRlbWVudCAtIE90aGVyd2lzZSBi
aW5kICJudWxsIiBmb3IgdGhlIGJsb2IgZGF0YSwKLSAgICAgICAgLy8gc2lnbmlmeWluZyB0aGF0
IHRoaXMgaWNvbiBkb2Vzbid0IGhhdmUgYW55IGRhdGEKLSAgICAgICAgaWYgKHNuYXBzaG90LmRh
dGEoKSAmJiBzbmFwc2hvdC5kYXRhKCktPnNpemUoKSkKLSAgICAgICAgICAgIG1fc2V0SWNvbkRh
dGFTdGF0ZW1lbnQtPmJpbmRCbG9iKDIsIHNuYXBzaG90LmRhdGEoKS0+ZGF0YSgpLCBzbmFwc2hv
dC5kYXRhKCktPnNpemUoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fc2V0SWNvbkRh
dGFTdGF0ZW1lbnQtPmJpbmROdWxsKDIpOwotCi0gICAgICAgIGlmIChtX3NldEljb25EYXRhU3Rh
dGVtZW50LT5zdGVwKCkgIT0gU1FMSVRFX0RPTkUpCi0gICAgICAgICAgICBMT0dfRVJST1IoIkZh
aWxlZCB0byBzZXQgaWNvbiBkYXRhIGZvciB1cmwgJXMiLCB1cmxGb3JMb2dnaW5nKHNuYXBzaG90
Lmljb25VUkwoKSkuYXNjaWkoKS5kYXRhKCkpOwotCi0gICAgICAgIG1fc2V0SWNvbkRhdGFTdGF0
ZW1lbnQtPnJlc2V0KCk7Ci0gICAgfQotfQotCi12b2lkIEljb25EYXRhYmFzZTo6ZGlzcGF0Y2hE
aWRJbXBvcnRJY29uVVJMRm9yUGFnZVVSTE9uTWFpblRocmVhZChjb25zdCBTdHJpbmcmIHBhZ2VV
UkwpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKLQotICAgIG1fbWFpblRocmVh
ZE5vdGlmaWVyLm5vdGlmeShbdGhpcywgcGFnZVVSTCA9IHBhZ2VVUkwuaXNvbGF0ZWRDb3B5KCld
IHsKLSAgICAgICAgaWYgKG1fY2xpZW50KQotICAgICAgICAgICAgbV9jbGllbnQtPmRpZEltcG9y
dEljb25VUkxGb3JQYWdlVVJMKHBhZ2VVUkwpOwotICAgIH0pOwotfQotCi12b2lkIEljb25EYXRh
YmFzZTo6ZGlzcGF0Y2hEaWRJbXBvcnRJY29uRGF0YUZvclBhZ2VVUkxPbk1haW5UaHJlYWQoY29u
c3QgU3RyaW5nJiBwYWdlVVJMKQotewotICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7Ci0K
LSAgICBtX21haW5UaHJlYWROb3RpZmllci5ub3RpZnkoW3RoaXMsIHBhZ2VVUkwgPSBwYWdlVVJM
Lmlzb2xhdGVkQ29weSgpXSB7Ci0gICAgICAgIGlmIChtX2NsaWVudCkKLSAgICAgICAgICAgIG1f
Y2xpZW50LT5kaWRJbXBvcnRJY29uRGF0YUZvclBhZ2VVUkwocGFnZVVSTCk7Ci0gICAgfSk7Ci19
Ci0KLXZvaWQgSWNvbkRhdGFiYXNlOjpkaXNwYXRjaERpZEZpbmlzaFVSTEltcG9ydE9uTWFpblRo
cmVhZCgpCi17Ci0gICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKIAotICAgIG1fbWFpblRo
cmVhZE5vdGlmaWVyLm5vdGlmeShbdGhpc10gewotICAgICAgICBpZiAobV9jbGllbnQpCi0gICAg
ICAgICAgICBtX2NsaWVudC0+ZGlkRmluaXNoVVJMSW1wb3J0KCk7CisgICAgICAgIFJ1bkxvb3A6
Om1haW4oKS5kaXNwYXRjaChbY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25I
YW5kbGVyKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKCk7Cisg
ICAgICAgIH0pOwogICAgIH0pOwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJv
Y2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQ
SS9nbGliL0ljb25EYXRhYmFzZS5oCmluZGV4IDhhOGNhYmJkNTNjLi4wZDYwNTllYjQwMCAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmgK
KysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmgKQEAg
LTEsMzkzICsxLDg5IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAy
MDA5LCAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAo
QykgMjAwNyBKdXN0aW4gSGF5Z29vZCAoamhheWdvb2RAcmVha3RpeC5jb20pCisgKiBDb3B5cmln
aHQgKEMpIDIwMTkgSWdhbGlhIFMuTC4KICAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KICAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCi0gKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQot
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KICAqLwogCiAjcHJh
Z21hIG9uY2UKIAogI2luY2x1ZGUgPFdlYkNvcmUvTmF0aXZlSW1hZ2UuaD4KICNpbmNsdWRlIDxX
ZWJDb3JlL1NRTGl0ZURhdGFiYXNlLmg+Ci0jaW5jbHVkZSA8d3RmL0NvbmRpdGlvbi5oPgotI2lu
Y2x1ZGUgPHd0Zi9IYXNoQ291bnRlZFNldC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU1FMaXRlU3Rh
dGVtZW50Lmg+CisjaW5jbHVkZSA8d3RmL0NvbXBsZXRpb25IYW5kbGVyLmg+CiAjaW5jbHVkZSA8
d3RmL0hhc2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgotI2luY2x1ZGUgPHd0Zi9S
dW5Mb29wLmg+Ci0jaW5jbHVkZSA8d3RmL2dsaWIvUnVuTG9vcFNvdXJjZVByaW9yaXR5Lmg+Ci0j
aW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0
cmluZy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1jbGFzcyBTaGFyZWRCdWZmZXI7Ci19Cisj
aW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1dvcmtR
dWV1ZS5oPgogCiBuYW1lc3BhY2UgV2ViS2l0IHsKIAotY2xhc3MgSWNvbkRhdGFiYXNlQ2xpZW50
IHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK2NsYXNzIEljb25EYXRhYmFzZSA6IHB1
YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxJY29uRGF0YWJhc2U+IHsKIHB1YmxpYzoKLSAgICB2
aXJ0dWFsIH5JY29uRGF0YWJhc2VDbGllbnQoKSA9IGRlZmF1bHQ7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgZGlkSW1wb3J0SWNvblVSTEZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikgeyB9Ci0gICAgdmly
dHVhbCB2b2lkIGRpZEltcG9ydEljb25EYXRhRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmKSB7IH0K
LSAgICB2aXJ0dWFsIHZvaWQgZGlkQ2hhbmdlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikg
eyB9Ci0gICAgdmlydHVhbCB2b2lkIGRpZEZpbmlzaFVSTEltcG9ydCgpIHsgfQotfTsKLQotY2xh
c3MgSWNvbkRhdGFiYXNlIHsKLSAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLQotcHJpdmF0
ZToKLSAgICBjbGFzcyBJY29uU25hcHNob3QgewotICAgICAgICBXVEZfTUFLRV9GQVNUX0FMTE9D
QVRFRDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEljb25TbmFwc2hvdCgpID0gZGVmYXVsdDsKLQot
ICAgICAgICBJY29uU25hcHNob3QoY29uc3QgU3RyaW5nJiBpY29uVVJMLCBpbnQgdGltZXN0YW1w
LCBXZWJDb3JlOjpTaGFyZWRCdWZmZXIqIGRhdGEpCi0gICAgICAgICAgICA6IG1faWNvblVSTChp
Y29uVVJMKQotICAgICAgICAgICAgLCBtX3RpbWVzdGFtcCh0aW1lc3RhbXApCi0gICAgICAgICAg
ICAsIG1fZGF0YShkYXRhKQotICAgICAgICB7IH0KLQotICAgICAgICBjb25zdCBTdHJpbmcmIGlj
b25VUkwoKSBjb25zdCB7IHJldHVybiBtX2ljb25VUkw7IH0KLSAgICAgICAgaW50IHRpbWVzdGFt
cCgpIGNvbnN0IHsgcmV0dXJuIG1fdGltZXN0YW1wOyB9Ci0gICAgICAgIFdlYkNvcmU6OlNoYXJl
ZEJ1ZmZlciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5nZXQoKTsgfQotCi0gICAgcHJp
dmF0ZToKLSAgICAgICAgU3RyaW5nIG1faWNvblVSTDsKLSAgICAgICAgaW50IG1fdGltZXN0YW1w
IHsgMCB9OwotICAgICAgICBSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBtX2RhdGE7Ci0g
ICAgfTsKLQotICAgIGNsYXNzIEljb25SZWNvcmQgOiBwdWJsaWMgUmVmQ291bnRlZDxJY29uUmVj
b3JkPiB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgUmVmPEljb25SZWNvcmQ+IGNyZWF0
ZShjb25zdCBTdHJpbmcmIHVybCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGFkb3B0
UmVmKCpuZXcgSWNvblJlY29yZCh1cmwpKTsKLSAgICAgICAgfQotICAgICAgICB+SWNvblJlY29y
ZCgpOwotCi0gICAgICAgIHRpbWVfdCBnZXRUaW1lc3RhbXAoKSB7IHJldHVybiBtX3N0YW1wOyB9
Ci0gICAgICAgIHZvaWQgc2V0VGltZXN0YW1wKHRpbWVfdCBzdGFtcCkgeyBtX3N0YW1wID0gc3Rh
bXA7IH0KLQotICAgICAgICB2b2lkIHNldEltYWdlRGF0YShSZWZQdHI8V2ViQ29yZTo6U2hhcmVk
QnVmZmVyPiYmKTsKLSAgICAgICAgV2ViQ29yZTo6TmF0aXZlSW1hZ2VQdHIgaW1hZ2UoY29uc3Qg
V2ViQ29yZTo6SW50U2l6ZSYpOwotCi0gICAgICAgIFN0cmluZyBpY29uVVJMKCkgeyByZXR1cm4g
bV9pY29uVVJMOyB9Ci0KLSAgICAgICAgZW51bSBjbGFzcyBJbWFnZURhdGFTdGF0dXMgeyBQcmVz
ZW50LCBNaXNzaW5nLCBVbmtub3duIH07Ci0gICAgICAgIEltYWdlRGF0YVN0YXR1cyBpbWFnZURh
dGFTdGF0dXMoKTsKLQotICAgICAgICBIYXNoU2V0PFN0cmluZz4mIHJldGFpbmluZ1BhZ2VVUkxz
KCkgeyByZXR1cm4gbV9yZXRhaW5pbmdQYWdlVVJMczsgfQotCi0gICAgICAgIEljb25TbmFwc2hv
dCBzbmFwc2hvdChib29sIGZvckRlbGV0aW9uID0gZmFsc2UpIGNvbnN0OwotCi0gICAgcHJpdmF0
ZToKLSAgICAgICAgSWNvblJlY29yZChjb25zdCBTdHJpbmcmIHVybCk7Ci0KLSAgICAgICAgU3Ry
aW5nIG1faWNvblVSTDsKLSAgICAgICAgdGltZV90IG1fc3RhbXAgeyAwIH07Ci0gICAgICAgIFJl
ZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IG1faW1hZ2VEYXRhOwotICAgICAgICBXZWJDb3Jl
OjpOYXRpdmVJbWFnZVB0ciBtX2ltYWdlOwotCi0gICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBtX3Jl
dGFpbmluZ1BhZ2VVUkxzOwotCi0gICAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGNhY2hlIHdo
ZXRoZXIgb3Igbm90IGEgU2l0ZUljb24gaGFzIGhhZCBpdHMgZGF0YSBzZXQgeWV0Ci0gICAgICAg
IC8vIFRoaXMgaGVscHMgdGhlIEljb25EYXRhYmFzZSBrbm93IGlmIGl0IGhhcyB0byBzZXQgdGhl
IGRhdGEgb24gYSBuZXcgb2JqZWN0IG9yIG5vdCwKLSAgICAgICAgLy8gYW5kIGFsc28gdG8gZGV0
ZXJtaW5lIGlmIHRoZSBpY29uIGlzIG1pc3NpbmcgZGF0YSBvciBpZiBpdCBqdXN0IGhhc24ndCBi
ZWVuIGJyb3VnaHQKLSAgICAgICAgLy8gaW4gZnJvbSB0aGUgREIgeWV0Ci0gICAgICAgIGJvb2wg
bV9kYXRhU2V0IHsgZmFsc2UgfTsKLSAgICB9OwotCi0gICAgY2xhc3MgUGFnZVVSTFNuYXBzaG90
IHsKLSAgICAgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci0gICAgcHVibGljOgotICAgICAg
ICBQYWdlVVJMU25hcHNob3QoKSA9IGRlZmF1bHQ7Ci0KLSAgICAgICAgUGFnZVVSTFNuYXBzaG90
KGNvbnN0IFN0cmluZyYgcGFnZVVSTCwgY29uc3QgU3RyaW5nJiBpY29uVVJMKQotICAgICAgICAg
ICAgOiBtX3BhZ2VVUkwocGFnZVVSTCkKLSAgICAgICAgICAgICwgbV9pY29uVVJMKGljb25VUkwp
Ci0gICAgICAgIHsgfQotCi0gICAgICAgIGNvbnN0IFN0cmluZyYgcGFnZVVSTCgpIGNvbnN0IHsg
cmV0dXJuIG1fcGFnZVVSTDsgfQotICAgICAgICBjb25zdCBTdHJpbmcmIGljb25VUkwoKSBjb25z
dCB7IHJldHVybiBtX2ljb25VUkw7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFN0cmluZyBt
X3BhZ2VVUkw7Ci0gICAgICAgIFN0cmluZyBtX2ljb25VUkw7Ci0gICAgfTsKLQotICAgIGNsYXNz
IFBhZ2VVUkxSZWNvcmQgewotICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQYWdlVVJMUmVj
b3JkKTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci0gICAgcHVibGljOgotICAgICAgICBQYWdl
VVJMUmVjb3JkKGNvbnN0IFN0cmluZyYgcGFnZVVSTCk7Ci0gICAgICAgIH5QYWdlVVJMUmVjb3Jk
KCk7Ci0KLSAgICAgICAgaW5saW5lIFN0cmluZyB1cmwoKSBjb25zdCB7IHJldHVybiBtX3BhZ2VV
Ukw7IH0KLQotICAgICAgICB2b2lkIHNldEljb25SZWNvcmQoUmVmUHRyPEljb25SZWNvcmQ+JiYp
OwotICAgICAgICBJY29uUmVjb3JkKiBpY29uUmVjb3JkKCkgeyByZXR1cm4gbV9pY29uUmVjb3Jk
LmdldCgpOyB9Ci0KLSAgICAgICAgUGFnZVVSTFNuYXBzaG90IHNuYXBzaG90KGJvb2wgZm9yRGVs
ZXRpb24gPSBmYWxzZSkgY29uc3Q7Ci0KLSAgICAgICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUg
cGFnZSB3YXNuJ3QgcmV0YWluZWQgYmVmb3JlaGFuZCwgdHJ1ZSBpZiB0aGUgcmV0YWluIGNvdW50
IHdhcyBhbHJlYWR5IDEgb3IgaGlnaGVyLgotICAgICAgICBib29sIHJldGFpbihpbnQgY291bnQp
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgd2FzUmV0YWluZWQgPSBtX3JldGFpbkNvdW50
ID4gMDsKLSAgICAgICAgICAgIG1fcmV0YWluQ291bnQgKz0gY291bnQ7Ci0gICAgICAgICAgICBy
ZXR1cm4gd2FzUmV0YWluZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXR1cm5zIHRydWUg
aWYgdGhlIHBhZ2UgaXMgc3RpbGwgcmV0YWluZWQgYWZ0ZXIgdGhlIGNhbGwuIEZhbHNlIGlmIHRo
ZSByZXRhaW4gY291bnQganVzdCBkcm9wcGVkIHRvIDAuCi0gICAgICAgIGJvb2wgcmVsZWFzZShp
bnQgY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChtX3JldGFpbkNvdW50ID49
IGNvdW50KTsKLSAgICAgICAgICAgIG1fcmV0YWluQ291bnQgLT0gY291bnQ7Ci0gICAgICAgICAg
ICByZXR1cm4gbV9yZXRhaW5Db3VudCA+IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcmV0
YWluQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3JldGFpbkNvdW50OyB9Ci0KLSAgICBwcml2YXRl
OgotICAgICAgICBTdHJpbmcgbV9wYWdlVVJMOwotICAgICAgICBSZWZQdHI8SWNvblJlY29yZD4g
bV9pY29uUmVjb3JkOwotICAgICAgICBpbnQgbV9yZXRhaW5Db3VudCB7IDAgfTsKLSAgICB9Owot
Ci0gICAgY2xhc3MgTWFpblRocmVhZE5vdGlmaWVyIHsKLSAgICAgICAgV1RGX01BS0VfRkFTVF9B
TExPQ0FURUQ7Ci0gICAgcHVibGljOgotICAgICAgICBNYWluVGhyZWFkTm90aWZpZXIoKQotICAg
ICAgICAgICAgOiBtX3RpbWVyKFJ1bkxvb3A6Om1haW4oKSwgdGhpcywgJk1haW5UaHJlYWROb3Rp
Zmllcjo6dGltZXJGaXJlZCkKLSAgICAgICAgewotICAgICAgICAgICAgbV90aW1lci5zZXRQcmlv
cml0eShSdW5Mb29wU291cmNlUHJpb3JpdHk6Ok1haW5UaHJlYWREaXNwYXRjaGVyVGltZXIpOwot
ICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRBY3RpdmUoYm9vbCBhY3RpdmUpCi0gICAgICAg
IHsKLSAgICAgICAgICAgIG1faXNBY3RpdmUuc3RvcmUoYWN0aXZlKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIHZvaWQgbm90aWZ5KEZ1bmN0aW9uPHZvaWQoKT4mJiBub3RpZmljYXRpb24pCi0gICAg
ICAgIHsKLSAgICAgICAgICAgIGlmICghbV9pc0FjdGl2ZS5sb2FkKCkpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuOwotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTG9ja0hvbGRlciBs
b2NrZXIobV9ub3RpZmljYXRpb25RdWV1ZUxvY2spOwotICAgICAgICAgICAgICAgIG1fbm90aWZp
Y2F0aW9uUXVldWUuYXBwZW5kKFdURk1vdmUobm90aWZpY2F0aW9uKSk7Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIGlmICghbV90aW1lci5pc0FjdGl2ZSgpKQotICAgICAgICAgICAgICAg
IG1fdGltZXIuc3RhcnRPbmVTaG90KDBfcyk7Ci0gICAgICAgIH0KKyAgICBlbnVtIGNsYXNzIEFs
bG93RGF0YWJhc2VXcml0ZSB7IE5vLCBZZXMgfTsKIAotICAgICAgICB2b2lkIHN0b3AoKQotICAg
ICAgICB7Ci0gICAgICAgICAgICBzZXRBY3RpdmUoZmFsc2UpOwotICAgICAgICAgICAgbV90aW1l
ci5zdG9wKCk7Ci0gICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX25vdGlmaWNhdGlvblF1
ZXVlTG9jayk7Ci0gICAgICAgICAgICBtX25vdGlmaWNhdGlvblF1ZXVlLmNsZWFyKCk7Ci0gICAg
ICAgIH0KKyAgICBzdGF0aWMgUmVmPEljb25EYXRhYmFzZT4gY3JlYXRlKGNvbnN0IFN0cmluZyYg
cGF0aCwgQWxsb3dEYXRhYmFzZVdyaXRlIGFsbG93RGF0YWJhc2VXcml0ZSkKKyAgICB7CisgICAg
ICAgIHJldHVybiBhZG9wdFJlZigqbmV3IEljb25EYXRhYmFzZShwYXRoLCBhbGxvd0RhdGFiYXNl
V3JpdGUpKTsKKyAgICB9CiAKLSAgICBwcml2YXRlOgotICAgICAgICB2b2lkIHRpbWVyRmlyZWQo
KQotICAgICAgICB7Ci0gICAgICAgICAgICBEZXF1ZTxGdW5jdGlvbjx2b2lkKCk+PiBub3RpZmlj
YXRpb25RdWV1ZTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMb2NrSG9sZGVyIGxv
Y2tlcihtX25vdGlmaWNhdGlvblF1ZXVlTG9jayk7Ci0gICAgICAgICAgICAgICAgbm90aWZpY2F0
aW9uUXVldWUgPSBXVEZNb3ZlKG1fbm90aWZpY2F0aW9uUXVldWUpOwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICBpZiAoIW1faXNBY3RpdmUubG9hZCgpKQotICAgICAgICAgICAgICAgIHJl
dHVybjsKLQotICAgICAgICAgICAgd2hpbGUgKCFub3RpZmljYXRpb25RdWV1ZS5pc0VtcHR5KCkp
IHsKLSAgICAgICAgICAgICAgICBhdXRvIGZ1bmN0aW9uID0gbm90aWZpY2F0aW9uUXVldWUudGFr
ZUZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotCi0gICAgICAgIERlcXVlPEZ1bmN0aW9uPHZvaWQoKT4+IG1fbm90aWZpY2F0aW9u
UXVldWU7Ci0gICAgICAgIExvY2sgbV9ub3RpZmljYXRpb25RdWV1ZUxvY2s7Ci0gICAgICAgIEF0
b21pYzxib29sPiBtX2lzQWN0aXZlOwotICAgICAgICBSdW5Mb29wOjpUaW1lcjxNYWluVGhyZWFk
Tm90aWZpZXI+IG1fdGltZXI7Ci0gICAgfTsKLQotLy8gKioqIE1haW4gVGhyZWFkIE9ubHkgKioq
Ci1wdWJsaWM6Ci0gICAgSWNvbkRhdGFiYXNlKCk7CiAgICAgfkljb25EYXRhYmFzZSgpOwogCi0g
ICAgZW51bSBjbGFzcyBJY29uTG9hZERlY2lzaW9uIHsgWWVzLCBObywgVW5rbm93biB9OwotCi0g
ICAgdm9pZCBzZXRDbGllbnQoc3RkOjp1bmlxdWVfcHRyPEljb25EYXRhYmFzZUNsaWVudD4mJik7
Ci0KLSAgICBib29sIG9wZW4oY29uc3QgU3RyaW5nJiBkaXJlY3RvcnksIGNvbnN0IFN0cmluZyYg
ZmlsZW5hbWUpOwotICAgIHZvaWQgY2xvc2UoKTsKLQotICAgIHZvaWQgcmVtb3ZlQWxsSWNvbnMo
KTsKLQotICAgIHZvaWQgcmV0YWluSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJik7Ci0gICAg
dm9pZCByZWxlYXNlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJik7Ci0gICAgdm9pZCBzZXRJ
Y29uRGF0YUZvckljb25VUkwoUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4mJiwgY29uc3Qg
U3RyaW5nJiBpY29uVVJMKTsKLSAgICB2b2lkIHNldEljb25VUkxGb3JQYWdlVVJMKGNvbnN0IFN0
cmluZyYgaWNvblVSTCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMKTsKLQotICAgIGVudW0gY2xhc3Mg
SXNLbm93bkljb24geyBObywgWWVzIH07Ci0gICAgc3RkOjpwYWlyPFdlYkNvcmU6Ok5hdGl2ZUlt
YWdlUHRyLCBJc0tub3duSWNvbj4gc3luY2hyb25vdXNJY29uRm9yUGFnZVVSTChjb25zdCBTdHJp
bmcmLCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJik7Ci0gICAgU3RyaW5nIHN5bmNocm9ub3VzSWNv
blVSTEZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJik7Ci0gICAgYm9vbCBzeW5jaHJvbm91c0ljb25E
YXRhS25vd25Gb3JJY29uVVJMKGNvbnN0IFN0cmluZyYpOwotICAgIEljb25Mb2FkRGVjaXNpb24g
c3luY2hyb25vdXNMb2FkRGVjaXNpb25Gb3JJY29uVVJMKGNvbnN0IFN0cmluZyYpOworICAgIHZv
aWQgaW52YWxpZGF0ZSgpOwogCi0gICAgdm9pZCBzZXRFbmFibGVkKGJvb2wpOwotICAgIGJvb2wg
aXNFbmFibGVkKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQo
Ym9vbCBmbGFnKTsKLSAgICBib29sIGlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpIGNvbnN0Owot
Ci0gICAgc3RhdGljIHZvaWQgZGVsYXlEYXRhYmFzZUNsZWFudXAoKTsKLSAgICBzdGF0aWMgdm9p
ZCBhbGxvd0RhdGFiYXNlQ2xlYW51cCgpOwotICAgIHN0YXRpYyB2b2lkIGNoZWNrSW50ZWdyaXR5
QmVmb3JlT3BlbmluZygpOworICAgIHZvaWQgY2hlY2tJY29uVVJMQW5kU2V0UGFnZVVSTElmTmVl
ZGVkKGNvbnN0IFN0cmluZyYgaWNvblVSTCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMLCBBbGxvd0Rh
dGFiYXNlV3JpdGUsIENvbXBsZXRpb25IYW5kbGVyPHZvaWQoYm9vbCwgYm9vbCk+JiYpOworICAg
IHZvaWQgbG9hZEljb25Gb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYsIEFsbG93RGF0YWJhc2VXcml0
ZSwgQ29tcGxldGlvbkhhbmRsZXI8dm9pZChXZWJDb3JlOjpOYXRpdmVJbWFnZVB0ciYmKT4mJik7
CisgICAgU3RyaW5nIGljb25VUkxGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQg
c2V0SWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiBpY29uVVJMLCBjb25zdCB1bnNpZ25lZCBj
aGFyKiwgc2l6ZV90LCBjb25zdCBTdHJpbmcmIHBhZ2VVUkwsIEFsbG93RGF0YWJhc2VXcml0ZSwg
Q29tcGxldGlvbkhhbmRsZXI8dm9pZChib29sKT4mJik7CisgICAgdm9pZCBjbGVhcihDb21wbGV0
aW9uSGFuZGxlcjx2b2lkKCk+JiYpOwogCiBwcml2YXRlOgotICAgIHZvaWQgd2FrZVN5bmNUaHJl
YWQoKTsKLSAgICB2b2lkIHNjaGVkdWxlT3JEZWZlclN5bmNUaW1lcigpOwotICAgIHZvaWQgc3lu
Y1RpbWVyRmlyZWQoKTsKLQotICAgIFJ1bkxvb3A6OlRpbWVyPEljb25EYXRhYmFzZT4gbV9zeW5j
VGltZXI7Ci0gICAgUmVmUHRyPFRocmVhZD4gbV9zeW5jVGhyZWFkOwotICAgIGJvb2wgbV9zeW5j
VGhyZWFkUnVubmluZyB7IGZhbHNlIH07Ci0gICAgYm9vbCBtX3NjaGVkdWxlT3JEZWZlclN5bmNU
aW1lclJlcXVlc3RlZCB7IGZhbHNlIH07Ci0KLS8vICoqKiBBbnkgVGhyZWFkICoqKgotcHVibGlj
OgotICAgIGJvb2wgaXNPcGVuKCkgY29uc3Q7Ci0gICAgU3RyaW5nIGRhdGFiYXNlUGF0aCgpIGNv
bnN0OwotICAgIHN0YXRpYyBTdHJpbmcgZGVmYXVsdERhdGFiYXNlRmlsZW5hbWUoKTsKLQotcHJp
dmF0ZToKLSAgICBSZWY8SWNvblJlY29yZD4gZ2V0T3JDcmVhdGVJY29uUmVjb3JkKGNvbnN0IFN0
cmluZyYgaWNvblVSTCk7Ci0gICAgUGFnZVVSTFJlY29yZCogZ2V0T3JDcmVhdGVQYWdlVVJMUmVj
b3JkKGNvbnN0IFN0cmluZyYgcGFnZVVSTCk7Ci0KLSAgICBib29sIG1faXNFbmFibGVkIHsgZmFs
c2UgfTsKLSAgICBib29sIG1fcHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCB7IGZhbHNlIH07Ci0KLSAg
ICBtdXRhYmxlIExvY2sgbV9zeW5jTG9jazsKLSAgICBDb25kaXRpb24gbV9zeW5jQ29uZGl0aW9u
OwotICAgIFN0cmluZyBtX2RhdGFiYXNlRGlyZWN0b3J5OwotICAgIC8vIEhvbGRpbmcgbV9zeW5j
TG9jayBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoCi0g
ICAgU3RyaW5nIG1fY29tcGxldGVEYXRhYmFzZVBhdGg7Ci0KLSAgICBib29sIG1fdGhyZWFkVGVy
bWluYXRpb25SZXF1ZXN0ZWQgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9yZW1vdmVJY29uc1JlcXVl
c3RlZCB7IGZhbHNlIH07Ci0gICAgYm9vbCBtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSB7IGZhbHNl
IH07Ci0gICAgYm9vbCBtX3N5bmNUaHJlYWRIYXNXb3JrVG9EbyB7IGZhbHNlIH07Ci0KLSAgICBM
b2NrIG1fdXJsQW5kSWNvbkxvY2s7Ci0gICAgLy8gSG9sZGluZyBtX3VybEFuZEljb25Mb2NrIGlz
IHJlcXVpcmVkIHdoZW4gYWNjZXNzaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0
dXJlcyBvciB0aGUgb2JqZWN0cyB0aGV5IGNvbnRhaW4KLSAgICBIYXNoTWFwPFN0cmluZywgSWNv
blJlY29yZCo+IG1faWNvblVSTFRvUmVjb3JkTWFwOwotICAgIEhhc2hNYXA8U3RyaW5nLCBQYWdl
VVJMUmVjb3JkKj4gbV9wYWdlVVJMVG9SZWNvcmRNYXA7Ci0gICAgSGFzaFNldDxTdHJpbmc+IG1f
cmV0YWluZWRQYWdlVVJMczsKLQotICAgIExvY2sgbV9wZW5kaW5nU3luY0xvY2s7Ci0gICAgLy8g
SG9sZGluZyBtX3BlbmRpbmdTeW5jTG9jayBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBhbnkg
b2YgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZXMKLSAgICBIYXNoTWFwPFN0cmluZywgUGFn
ZVVSTFNuYXBzaG90PiBtX3BhZ2VVUkxzUGVuZGluZ1N5bmM7Ci0gICAgSGFzaE1hcDxTdHJpbmcs
IEljb25TbmFwc2hvdD4gbV9pY29uc1BlbmRpbmdTeW5jOwotCi0gICAgTG9jayBtX3BlbmRpbmdS
ZWFkaW5nTG9jazsKLSAgICAvLyBIb2xkaW5nIG1fcGVuZGluZ1N5bmNMb2NrIGlzIHJlcXVpcmVk
IHdoZW4gYWNjZXNzaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0dXJlcyAtIHdo
ZW4gZGVhbGluZyB3aXRoIEljb25SZWNvcmQqcywgaG9sZGluZyBtX3VybEFuZEljb25Mb2NrIGlz
IGFsc28gcmVxdWlyZWQKLSAgICBIYXNoU2V0PFN0cmluZz4gbV9wYWdlVVJMc1BlbmRpbmdJbXBv
cnQ7Ci0gICAgSGFzaFNldDxTdHJpbmc+IG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29uczsKLSAg
ICBIYXNoU2V0PEljb25SZWNvcmQqPiBtX2ljb25zUGVuZGluZ1JlYWRpbmc7Ci0KLSAgICBMb2Nr
IG1fdXJsc1RvUmV0YWluT3JSZWxlYXNlTG9jazsKLSAgICAvLyBIb2xkaW5nIG1fdXJsc1RvUmV0
YWluT3JSZWxlYXNlTG9jayBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBhbnkgb2YgdGhlIGZv
bGxvd2luZyBkYXRhIHN0cnVjdHVyZXMuCi0gICAgSGFzaENvdW50ZWRTZXQ8U3RyaW5nPiBtX3Vy
bHNUb1JldGFpbjsKLSAgICBIYXNoQ291bnRlZFNldDxTdHJpbmc+IG1fdXJsc1RvUmVsZWFzZTsK
LSAgICBib29sIG1fcmV0YWluT3JSZWxlYXNlSWNvblJlcXVlc3RlZCB7IGZhbHNlIH07Ci0KLS8v
ICoqKiBTeW5jIFRocmVhZCBPbmx5ICoqKgotcHVibGljOgotICAgIGJvb2wgc2hvdWxkU3RvcFRo
cmVhZEFjdGl2aXR5KCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBpY29uRGF0YWJhc2VT
eW5jVGhyZWFkKCk7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGJsb2NrIG9mIG1ldGhvZHMgYXJl
IGNhbGxlZCBleGNsdXNpdmVseSBieSB0aGUgc3luYyB0aHJlYWQgdG8gbWFuYWdlIGkvbyB0byBh
bmQgZnJvbSB0aGUgZGF0YWJhc2UKLSAgICAvLyBFYWNoIG1ldGhvZCBzaG91bGQgcGVyaW9kaWNh
bGx5IG1vbml0b3IgbV90aHJlYWRUZXJtaW5hdGlvblJlcXVlc3RlZCB3aGVuIGl0IG1ha2VzIHNl
bnNlIHRvIHJldHVybiBlYXJseSBvbiBzaHV0ZG93bgotICAgIHZvaWQgcGVyZm9ybU9wZW5Jbml0
aWFsaXphdGlvbigpOwotICAgIGJvb2wgY2hlY2tJbnRlZ3JpdHkoKTsKLSAgICB2b2lkIHBlcmZv
cm1VUkxJbXBvcnQoKTsKLSAgICB2b2lkIHN5bmNUaHJlYWRNYWluTG9vcCgpOwotICAgIGJvb2wg
cmVhZEZyb21EYXRhYmFzZSgpOwotICAgIGJvb2wgd3JpdGVUb0RhdGFiYXNlKCk7Ci0gICAgdm9p
ZCBwcnVuZVVucmV0YWluZWRJY29ucygpOwotICAgIHZvaWQgY2hlY2tGb3JEYW5nbGluZ1BhZ2VV
UkxzKGJvb2wgcHJ1bmVJZkZvdW5kKTsKLSAgICB2b2lkIHJlbW92ZUFsbEljb25zT25UaHJlYWQo
KTsKLSAgICB2b2lkIGRlbGV0ZUFsbFByZXBhcmVkU3RhdGVtZW50cygpOwotICAgIHZvaWQqIGNs
ZWFudXBTeW5jVGhyZWFkKCk7Ci0gICAgdm9pZCBwZXJmb3JtUmV0YWluSWNvbkZvclBhZ2VVUkwo
Y29uc3QgU3RyaW5nJiwgaW50IHJldGFpbkNvdW50KTsKLSAgICB2b2lkIHBlcmZvcm1SZWxlYXNl
SWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiwgaW50IHJlbGVhc2VDb3VudCk7Ci0KLSAgICBi
b29sIG1faW5pdGlhbFBydW5pbmdDb21wbGV0ZSB7IGZhbHNlIH07Ci0KLSAgICB2b2lkIHNldElj
b25VUkxGb3JQYWdlVVJMSW5TUUxEYXRhYmFzZShjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcm
KTsKLSAgICB2b2lkIHNldEljb25JREZvclBhZ2VVUkxJblNRTERhdGFiYXNlKGludDY0X3QsIGNv
bnN0IFN0cmluZyYpOwotICAgIHZvaWQgcmVtb3ZlUGFnZVVSTEZyb21TUUxEYXRhYmFzZShjb25z
dCBTdHJpbmcmIHBhZ2VVUkwpOwotICAgIGludDY0X3QgZ2V0SWNvbklERm9ySWNvblVSTEZyb21T
UUxEYXRhYmFzZShjb25zdCBTdHJpbmcmIGljb25VUkwpOwotICAgIGludDY0X3QgYWRkSWNvblVS
TFRvU1FMRGF0YWJhc2UoY29uc3QgU3RyaW5nJik7Ci0gICAgUmVmUHRyPFdlYkNvcmU6OlNoYXJl
ZEJ1ZmZlcj4gZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTEZyb21TUUxEYXRhYmFzZShjb25zdCBTdHJp
bmcmIGljb25VUkwpOwotICAgIHZvaWQgcmVtb3ZlSWNvbkZyb21TUUxEYXRhYmFzZShjb25zdCBT
dHJpbmcmIGljb25VUkwpOwotICAgIHZvaWQgd3JpdGVJY29uU25hcHNob3RUb1NRTERhdGFiYXNl
KGNvbnN0IEljb25TbmFwc2hvdCYpOwotCi0gICAgdm9pZCBwZXJmb3JtUGVuZGluZ1JldGFpbkFu
ZFJlbGVhc2VPcGVyYXRpb25zKCk7Ci0KLSAgICAvLyBNZXRob2RzIHRvIGRpc3BhdGNoIGNsaWVu
dCBjYWxsYmFja3Mgb24gdGhlIG1haW4gdGhyZWFkCi0gICAgdm9pZCBkaXNwYXRjaERpZEltcG9y
dEljb25VUkxGb3JQYWdlVVJMT25NYWluVGhyZWFkKGNvbnN0IFN0cmluZyYpOwotICAgIHZvaWQg
ZGlzcGF0Y2hEaWRJbXBvcnRJY29uRGF0YUZvclBhZ2VVUkxPbk1haW5UaHJlYWQoY29uc3QgU3Ry
aW5nJik7Ci0gICAgdm9pZCBkaXNwYXRjaERpZEZpbmlzaFVSTEltcG9ydE9uTWFpblRocmVhZCgp
OwotCi0gICAgLy8gVGhlIGNsaWVudCBpcyBzZXQgYnkgdGhlIG1haW4gdGhyZWFkIGJlZm9yZSB0
aGUgdGhyZWFkIHN0YXJ0cywgYW5kIGZyb20gdGhlbiBvbiBpcyBvbmx5IHVzZWQgYnkgdGhlIHN5
bmMgdGhyZWFkCi0gICAgc3RkOjp1bmlxdWVfcHRyPEljb25EYXRhYmFzZUNsaWVudD4gbV9jbGll
bnQ7Ci0KLSAgICBXZWJDb3JlOjpTUUxpdGVEYXRhYmFzZSBtX3N5bmNEQjsKLQorICAgIEljb25E
YXRhYmFzZShjb25zdCBTdHJpbmcmLCBBbGxvd0RhdGFiYXNlV3JpdGUpOworCisgICAgYm9vbCBj
cmVhdGVUYWJsZXNJZk5lZWRlZCgpOworICAgIHZvaWQgcG9wdWxhdGVQYWdlVVJMVG9JY29uVVJM
TWFwKCk7CisgICAgdm9pZCBwcnVuZVRpbWVyRmlyZWQoKTsKKyAgICB2b2lkIHN0YXJ0UHJ1bmVU
aW1lcigpOworICAgIHZvaWQgY2xlYXJTdGF0ZW1lbnRzKCk7CisgICAgdm9pZCBjbGVhckxvYWRl
ZEljb25zVGltZXJGaXJlZCgpOworICAgIHZvaWQgc3RhcnRDbGVhckxvYWRlZEljb25zVGltZXIo
KTsKKyAgICBPcHRpb25hbDxpbnQ2NF90PiBpY29uSURGb3JJY29uVVJMKGNvbnN0IFN0cmluZyYs
IGJvb2wmIGV4cGlyZWQpOworICAgIGJvb2wgc2V0SWNvbklERm9yUGFnZVVSTChpbnQ2NF90LCBj
b25zdCBTdHJpbmcmKTsKKyAgICBWZWN0b3I8Y2hhcj4gaWNvbkRhdGEoaW50NjRfdCk7CisgICAg
T3B0aW9uYWw8aW50NjRfdD4gYWRkSWNvbihjb25zdCBTdHJpbmcmLCBjb25zdCBWZWN0b3I8Y2hh
cj4mKTsKKyAgICB2b2lkIHVwZGF0ZUljb25UaW1lc3RhbXAoaW50NjRfdCBpY29uSUQsIGludDY0
X3QgdGltZXN0YW1wKTsKKyAgICB2b2lkIGRlbGV0ZUljb24oaW50NjRfdCk7CisKKyAgICBSZWY8
V29ya1F1ZXVlPiBtX3dvcmtRdWV1ZTsKKyAgICBBbGxvd0RhdGFiYXNlV3JpdGUgbV9hbGxvd0Rh
dGFiYXNlV3JpdGUgeyBBbGxvd0RhdGFiYXNlV3JpdGU6OlllcyB9OworICAgIFdlYkNvcmU6OlNR
TGl0ZURhdGFiYXNlIG1fZGI7CisgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbV9wYWdlVVJM
VG9JY29uVVJMTWFwOworICAgIEhhc2hNYXA8U3RyaW5nLCBzdGQ6OnBhaXI8V2ViQ29yZTo6TmF0
aXZlSW1hZ2VQdHIsIE1vbm90b25pY1RpbWU+PiBtX2xvYWRlZEljb25zOworCisgICAgc3RkOjp1
bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9pY29uSURGb3JJY29uVVJMU3Rh
dGVtZW50OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1f
c2V0SWNvbklERm9yUGFnZVVSTFN0YXRlbWVudDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29y
ZTo6U1FMaXRlU3RhdGVtZW50PiBtX3JlbW92ZVBhZ2VVUkxTdGF0ZW1lbnQ7Ci0gICAgc3RkOjp1
bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9nZXRJY29uSURGb3JJY29uVVJM
U3RhdGVtZW50OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+
IG1fZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTFN0YXRlbWVudDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8
V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX2FkZEljb25Ub0ljb25JbmZvU3RhdGVtZW50Owot
ICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1fYWRkSWNvblRv
SWNvbkRhdGFTdGF0ZW1lbnQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0
YXRlbWVudD4gbV9nZXRJbWFnZURhdGFTdGF0ZW1lbnQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdl
YkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9kZWxldGVQYWdlVVJMc0Zvckljb25VUkxTdGF0ZW1l
bnQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9kZWxl
dGVJY29uRnJvbUljb25JbmZvU3RhdGVtZW50OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3Jl
OjpTUUxpdGVTdGF0ZW1lbnQ+IG1fZGVsZXRlSWNvbkZyb21JY29uRGF0YVN0YXRlbWVudDsKLSAg
ICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX3VwZGF0ZUljb25J
bmZvU3RhdGVtZW50OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1l
bnQ+IG1fdXBkYXRlSWNvbkRhdGFTdGF0ZW1lbnQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNv
cmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9zZXRJY29uSW5mb1N0YXRlbWVudDsKLSAgICBzdGQ6OnVu
aXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX3NldEljb25EYXRhU3RhdGVtZW50
OwotCi0gICAgTWFpblRocmVhZE5vdGlmaWVyIG1fbWFpblRocmVhZE5vdGlmaWVyOworICAgIHN0
ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1faWNvbkRhdGFTdGF0ZW1l
bnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9hZGRJ
Y29uU3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1l
bnQ+IG1fYWRkSWNvbkRhdGFTdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6
OlNRTGl0ZVN0YXRlbWVudD4gbV91cGRhdGVJY29uVGltZXN0YW1wU3RhdGVtZW50OworICAgIHN0
ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1fZGVsZXRlUGFnZVVSTHNG
b3JJY29uU3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0
ZW1lbnQ+IG1fZGVsZXRlSWNvbkRhdGFTdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdl
YkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9kZWxldGVJY29uU3RhdGVtZW50OworICAgIHN0ZDo6
dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1fcHJ1bmVJY29uc1N0YXRlbWVu
dDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxSdW5Mb29wOjpUaW1lcjxJY29uRGF0YWJhc2U+PiBt
X3BydW5lVGltZXI7CisgICAgUnVuTG9vcDo6VGltZXI8SWNvbkRhdGFiYXNlPiBtX2NsZWFyTG9h
ZGVkSWNvbnNUaW1lcjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlLmNw
cCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFz
ZS5jcHAKaW5kZXggMjhlNjYyMDY2N2IuLmY2ZmVmMzlmNTRjIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwCisrKyBi
L1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZS5j
cHAKQEAgLTIyLDcgKzIyLDYgQEAKIAogI2luY2x1ZGUgIkljb25EYXRhYmFzZS5oIgogI2luY2x1
ZGUgIldlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUuaCIKLSNpbmNsdWRlICJXZWJQcmVmZXJl
bmNlcy5oIgogI2luY2x1ZGUgPFdlYkNvcmUvSW1hZ2UuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0lu
dFNpemUuaD4KICNpbmNsdWRlIDxXZWJDb3JlL1JlZlB0ckNhaXJvLmg+CkBAIC0zMCwxMiArMjks
MTAgQEAKICNpbmNsdWRlIDxnbGliL2dpMThuLWxpYi5oPgogI2luY2x1ZGUgPHd0Zi9GaWxlU3lz
dGVtLmg+CiAjaW5jbHVkZSA8d3RmL1J1bkxvb3AuaD4KLSNpbmNsdWRlIDx3dGYvU2V0Rm9yU2Nv
cGUuaD4KICNpbmNsdWRlIDx3dGYvZ2xpYi9HUmVmUHRyLmg+CiAjaW5jbHVkZSA8d3RmL2dsaWIv
R1VuaXF1ZVB0ci5oPgogI2luY2x1ZGUgPHd0Zi9nbGliL1dURkdUeXBlLmg+CiAjaW5jbHVkZSA8
d3RmL3RleHQvQ1N0cmluZy5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KIAog
dXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwpAQCAtNjgs
MzUgKzY1LDE0IEBAIGVudW0gewogCiBzdGF0aWMgZ3VpbnQgc2lnbmFsc1tMQVNUX1NJR05BTF0g
PSB7IDAsIH07CiAKLXR5cGVkZWYgVmVjdG9yPEdSZWZQdHI8R1Rhc2s+ID4gUGVuZGluZ0ljb25S
ZXF1ZXN0VmVjdG9yOwotdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgUGVuZGluZ0ljb25SZXF1ZXN0
VmVjdG9yKj4gUGVuZGluZ0ljb25SZXF1ZXN0TWFwOwotCiBzdHJ1Y3QgX1dlYktpdEZhdmljb25E
YXRhYmFzZVByaXZhdGUgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxJY29uRGF0YWJhc2U+IGljb25E
YXRhYmFzZTsKLSAgICBWZWN0b3I8c3RkOjpwYWlyPFN0cmluZywgRnVuY3Rpb248dm9pZChib29s
KT4+PiBwZW5kaW5nTG9hZERlY2lzaW9uczsKLSAgICBQZW5kaW5nSWNvblJlcXVlc3RNYXAgcGVu
ZGluZ0ljb25SZXF1ZXN0czsKLSAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwYWdlVVJMVG9J
Y29uVVJMTWFwOwotICAgIGJvb2wgaXNVUkxJbXBvcnRDb21wbGV0ZWQ7Ci0gICAgYm9vbCBpc1Nl
dHRpbmdJY29uOworICAgIFJlZlB0cjxJY29uRGF0YWJhc2U+IGljb25EYXRhYmFzZTsKIH07CiAK
IFdFQktJVF9ERUZJTkVfVFlQRShXZWJLaXRGYXZpY29uRGF0YWJhc2UsIHdlYmtpdF9mYXZpY29u
X2RhdGFiYXNlLCBHX1RZUEVfT0JKRUNUKQogCi1zdGF0aWMgdm9pZCB3ZWJraXRGYXZpY29uRGF0
YWJhc2VEaXNwb3NlKEdPYmplY3QqIG9iamVjdCkKLXsKLSAgICBXZWJLaXRGYXZpY29uRGF0YWJh
c2UqIGRhdGFiYXNlID0gV0VCS0lUX0ZBVklDT05fREFUQUJBU0Uob2JqZWN0KTsKLQotICAgIGlm
ICh3ZWJraXRGYXZpY29uRGF0YWJhc2VJc09wZW4oZGF0YWJhc2UpKQotICAgICAgICBkYXRhYmFz
ZS0+cHJpdi0+aWNvbkRhdGFiYXNlLT5jbG9zZSgpOwotCi0gICAgR19PQkpFQ1RfQ0xBU1Mod2Vi
a2l0X2Zhdmljb25fZGF0YWJhc2VfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZShvYmplY3QpOwotfQot
CiBzdGF0aWMgdm9pZCB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9jbGFzc19pbml0KFdlYktpdEZh
dmljb25EYXRhYmFzZUNsYXNzKiBmYXZpY29uRGF0YWJhc2VDbGFzcykKIHsKLSAgICBHT2JqZWN0
Q2xhc3MqIGdPYmplY3RDbGFzcyA9IEdfT0JKRUNUX0NMQVNTKGZhdmljb25EYXRhYmFzZUNsYXNz
KTsKLSAgICBnT2JqZWN0Q2xhc3MtPmRpc3Bvc2UgPSB3ZWJraXRGYXZpY29uRGF0YWJhc2VEaXNw
b3NlOwotCiAgICAgLyoqCiAgICAgICogV2ViS2l0RmF2aWNvbkRhdGFiYXNlOjpmYXZpY29uLWNo
YW5nZWQ6CiAgICAgICogQGRhdGFiYXNlOiB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBzaWduYWwg
aXMgZW1pdHRlZApAQCAtMTIxLDIyNSArOTcsNjIgQEAgc3RhdGljIHZvaWQgd2Via2l0X2Zhdmlj
b25fZGF0YWJhc2VfY2xhc3NfaW5pdChXZWJLaXRGYXZpY29uRGF0YWJhc2VDbGFzcyogZmF2aWMK
ICAgICAgICAgR19UWVBFX1NUUklORyk7CiB9CiAKLSNpZiBQTEFURk9STShHVEspCi1zdHJ1Y3Qg
R2V0RmF2aWNvblN1cmZhY2VBc3luY0RhdGEgewotICAgIH5HZXRGYXZpY29uU3VyZmFjZUFzeW5j
RGF0YSgpCi0gICAgewotICAgICAgICBpZiAoc2hvdWxkUmVsZWFzZUljb25Gb3JQYWdlVVJMKQot
ICAgICAgICAgICAgZmF2aWNvbkRhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnJlbGVhc2VJ
Y29uRm9yUGFnZVVSTChwYWdlVVJMKTsKLSAgICB9Ci0KLSAgICBHUmVmUHRyPFdlYktpdEZhdmlj
b25EYXRhYmFzZT4gZmF2aWNvbkRhdGFiYXNlOwotICAgIFN0cmluZyBwYWdlVVJMOwotICAgIFJl
ZlB0cjxjYWlyb19zdXJmYWNlX3Q+IGljb247Ci0gICAgR1JlZlB0cjxHQ2FuY2VsbGFibGU+IGNh
bmNlbGxhYmxlOwotICAgIGJvb2wgc2hvdWxkUmVsZWFzZUljb25Gb3JQYWdlVVJMOwotfTsKLVdF
QktJVF9ERUZJTkVfQVNZTkNfREFUQV9TVFJVQ1QoR2V0RmF2aWNvblN1cmZhY2VBc3luY0RhdGEp
Ci0KLXN0YXRpYyBSZWZQdHI8Y2Fpcm9fc3VyZmFjZV90PiBnZXRJY29uU3VyZmFjZVN5bmNocm9u
b3VzbHkoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgU3RyaW5nJiBwYWdl
VVJMLCBHRXJyb3IqKiBlcnJvcikKLXsKLSAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwot
Ci0gICAgLy8gVGhlIGV4YWN0IHNpemUgd2UgcGFzcyBpcyBpcnJlbGV2YW50IHRvIHRoZSBpY29u
RGF0YWJhc2UgY29kZS4KLSAgICAvLyBXZSBtdXN0IHBhc3Mgc29tZXRoaW5nIGdyZWF0ZXIgdGhh
biAweDAgdG8gZ2V0IGFuIGljb24uCi0gICAgYXV0byBpY29uRGF0YSA9IGRhdGFiYXNlLT5wcml2
LT5pY29uRGF0YWJhc2UtPnN5bmNocm9ub3VzSWNvbkZvclBhZ2VVUkwocGFnZVVSTCwgV2ViQ29y
ZTo6SW50U2l6ZSgxLCAxKSk7Ci0gICAgaWYgKGljb25EYXRhLnNlY29uZCA9PSBJY29uRGF0YWJh
c2U6OklzS25vd25JY29uOjpObykgewotICAgICAgICBnX3NldF9lcnJvcihlcnJvciwgV0VCS0lU
X0ZBVklDT05fREFUQUJBU0VfRVJST1IsIFdFQktJVF9GQVZJQ09OX0RBVEFCQVNFX0VSUk9SX0ZB
VklDT05fVU5LTk9XTiwgXygiVW5rbm93biBmYXZpY29uIGZvciBwYWdlICVzIiksIHBhZ2VVUkwu
dXRmOCgpLmRhdGEoKSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGlm
ICghaWNvbkRhdGEuZmlyc3QpIHsKLSAgICAgICAgZ19zZXRfZXJyb3IoZXJyb3IsIFdFQktJVF9G
QVZJQ09OX0RBVEFCQVNFX0VSUk9SLCBXRUJLSVRfRkFWSUNPTl9EQVRBQkFTRV9FUlJPUl9GQVZJ
Q09OX05PVF9GT1VORCwgXygiUGFnZSAlcyBkb2VzIG5vdCBoYXZlIGEgZmF2aWNvbiIpLCBwYWdl
VVJMLnV0ZjgoKS5kYXRhKCkpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAg
ICByZXR1cm4gaWNvbkRhdGEuZmlyc3Q7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGV0ZVBlbmRpbmdJ
Y29uUmVxdWVzdHMoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgUGVuZGluZ0ljb25S
ZXF1ZXN0VmVjdG9yKiByZXF1ZXN0cywgY29uc3QgU3RyaW5nJiBwYWdlVVJMKQotewotICAgIGRh
dGFiYXNlLT5wcml2LT5wZW5kaW5nSWNvblJlcXVlc3RzLnJlbW92ZShwYWdlVVJMKTsKLSAgICBk
ZWxldGUgcmVxdWVzdHM7Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NQZW5kaW5nSWNvbnNGb3JQ
YWdlVVJMKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0IFN0cmluZyYgcGFn
ZVVSTCkKLXsKLSAgICBQZW5kaW5nSWNvblJlcXVlc3RWZWN0b3IqIHBlbmRpbmdJY29uUmVxdWVz
dHMgPSBkYXRhYmFzZS0+cHJpdi0+cGVuZGluZ0ljb25SZXF1ZXN0cy5nZXQocGFnZVVSTCk7Ci0g
ICAgaWYgKCFwZW5kaW5nSWNvblJlcXVlc3RzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBHVW5p
cXVlT3V0UHRyPEdFcnJvcj4gZXJyb3I7Ci0gICAgUmVmUHRyPGNhaXJvX3N1cmZhY2VfdD4gaWNv
biA9IGdldEljb25TdXJmYWNlU3luY2hyb25vdXNseShkYXRhYmFzZSwgcGFnZVVSTCwgJmVycm9y
Lm91dFB0cigpKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGVuZGluZ0ljb25SZXF1
ZXN0cy0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgR1Rhc2sqIHRhc2sgPSBwZW5kaW5nSWNvblJl
cXVlc3RzLT5hdChpKS5nZXQoKTsKLSAgICAgICAgaWYgKGVycm9yKQotICAgICAgICAgICAgZ190
YXNrX3JldHVybl9lcnJvcih0YXNrLCBlcnJvci5yZWxlYXNlKCkpOwotICAgICAgICBlbHNlIHsK
LSAgICAgICAgICAgIEdldEZhdmljb25TdXJmYWNlQXN5bmNEYXRhKiBkYXRhID0gc3RhdGljX2Nh
c3Q8R2V0RmF2aWNvblN1cmZhY2VBc3luY0RhdGEqPihnX3Rhc2tfZ2V0X3Rhc2tfZGF0YSh0YXNr
KSk7Ci0gICAgICAgICAgICBkYXRhLT5pY29uID0gaWNvbjsKLSAgICAgICAgICAgIGRhdGEtPnNo
b3VsZFJlbGVhc2VJY29uRm9yUGFnZVVSTCA9IGZhbHNlOwotICAgICAgICAgICAgZ190YXNrX3Jl
dHVybl9ib29sZWFuKHRhc2ssIFRSVUUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGRlbGV0ZVBl
bmRpbmdJY29uUmVxdWVzdHMoZGF0YWJhc2UsIHBlbmRpbmdJY29uUmVxdWVzdHMsIHBhZ2VVUkwp
OwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldEljb25V
UkxGb3JQYWdlVVJMKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0IFN0cmlu
ZyYgaWNvblVSTCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMKQorV2ViS2l0RmF2aWNvbkRhdGFiYXNl
KiB3ZWJraXRGYXZpY29uRGF0YWJhc2VDcmVhdGUoKQogewotICAgIFdlYktpdEZhdmljb25EYXRh
YmFzZVByaXZhdGUqIHByaXYgPSBkYXRhYmFzZS0+cHJpdjsKLSAgICBpZiAoIXByaXYtPmlzVVJM
SW1wb3J0Q29tcGxldGVkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAocGFnZVVSTC5pc0Vt
cHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0IFN0cmluZyYgY3VycmVudEljb25V
UkwgPSBwcml2LT5wYWdlVVJMVG9JY29uVVJMTWFwLmdldChwYWdlVVJMKTsKLSAgICBpZiAoaWNv
blVSTCA9PSBjdXJyZW50SWNvblVSTCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcHJpdi0+cGFn
ZVVSTFRvSWNvblVSTE1hcC5zZXQocGFnZVVSTCwgaWNvblVSTCk7Ci0gICAgaWYgKHByaXYtPmlz
U2V0dGluZ0ljb24pCi0gICAgICAgIHJldHVybjsKLQotICAgIGdfc2lnbmFsX2VtaXQoZGF0YWJh
c2UsIHNpZ25hbHNbRkFWSUNPTl9DSEFOR0VEXSwgMCwgcGFnZVVSTC51dGY4KCkuZGF0YSgpLCBp
Y29uVVJMLnV0ZjgoKS5kYXRhKCkpOworICAgIHJldHVybiBXRUJLSVRfRkFWSUNPTl9EQVRBQkFT
RShnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfRkFWSUNPTl9EQVRBQkFTRSwgbnVsbHB0cikpOwog
fQogCi1jbGFzcyBXZWJLaXRJY29uRGF0YWJhc2VDbGllbnQgZmluYWwgOiBwdWJsaWMgSWNvbkRh
dGFiYXNlQ2xpZW50IHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBXZWJLaXRJY29uRGF0YWJhc2VD
bGllbnQoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSkKLSAgICAgICAgOiBtX2RhdGFi
YXNlKGRhdGFiYXNlKQotICAgIHsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBkaWRJbXBv
cnRJY29uVVJMRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VVUkwpIG92ZXJyaWRlCi0gICAg
ewotICAgICAgICBTdHJpbmcgaWNvblVSTCA9IG1fZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFz
ZS0+c3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChwYWdlVVJMKTsKLSAgICAgICAgd2Via2l0
RmF2aWNvbkRhdGFiYXNlU2V0SWNvblVSTEZvclBhZ2VVUkwobV9kYXRhYmFzZSwgaWNvblVSTCwg
cGFnZVVSTCk7Ci0gICAgfQotCi0gICAgdm9pZCBkaWRDaGFuZ2VJY29uRm9yUGFnZVVSTChjb25z
dCBTdHJpbmcmIHBhZ2VVUkwpIG92ZXJyaWRlCi0gICAgewotICAgICAgICBpZiAobV9kYXRhYmFz
ZS0+cHJpdi0+aXNTZXR0aW5nSWNvbikKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgU3Ry
aW5nIGljb25VUkwgPSBtX2RhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnN5bmNocm9ub3Vz
SWNvblVSTEZvclBhZ2VVUkwocGFnZVVSTCk7Ci0gICAgICAgIHdlYmtpdEZhdmljb25EYXRhYmFz
ZVNldEljb25VUkxGb3JQYWdlVVJMKG1fZGF0YWJhc2UsIGljb25VUkwsIHBhZ2VVUkwpOwotICAg
IH0KLQotICAgIHZvaWQgZGlkSW1wb3J0SWNvbkRhdGFGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYg
cGFnZVVSTCkgb3ZlcnJpZGUKLSAgICB7Ci0jaWYgUExBVEZPUk0oR1RLKQotICAgICAgICBwcm9j
ZXNzUGVuZGluZ0ljb25zRm9yUGFnZVVSTChtX2RhdGFiYXNlLCBwYWdlVVJMKTsKLSNlbmRpZgot
ICAgICAgICBTdHJpbmcgaWNvblVSTCA9IG1fZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFzZS0+
c3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChwYWdlVVJMKTsKLSAgICAgICAgd2Via2l0RmF2
aWNvbkRhdGFiYXNlU2V0SWNvblVSTEZvclBhZ2VVUkwobV9kYXRhYmFzZSwgaWNvblVSTCwgcGFn
ZVVSTCk7Ci0gICAgfQotCi0gICAgdm9pZCBkaWRGaW5pc2hVUkxJbXBvcnQoKSBvdmVycmlkZQot
ICAgIHsKLSAgICAgICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSogcHJpdiA9IG1fZGF0
YWJhc2UtPnByaXY7Ci0KLSAgICAgICAgd2hpbGUgKCFwcml2LT5wZW5kaW5nTG9hZERlY2lzaW9u
cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGF1dG8gaWNvblVSTEFuZENhbGxiYWNrID0gcHJp
di0+cGVuZGluZ0xvYWREZWNpc2lvbnMudGFrZUxhc3QoKTsKLSAgICAgICAgICAgIGF1dG8gZGVj
aXNpb24gPSBwcml2LT5pY29uRGF0YWJhc2UtPnN5bmNocm9ub3VzTG9hZERlY2lzaW9uRm9ySWNv
blVSTChpY29uVVJMQW5kQ2FsbGJhY2suZmlyc3QpOwotICAgICAgICAgICAgLy8gRGVjaXNpb25z
IHNob3VsZCBuZXZlciBiZSB1bmtub3duIGFmdGVyIHRoZSBpbml0YWwgaW1wb3J0IGlzIGNvbXBs
ZXRlLgotICAgICAgICAgICAgQVNTRVJUKGRlY2lzaW9uICE9IEljb25EYXRhYmFzZTo6SWNvbkxv
YWREZWNpc2lvbjo6VW5rbm93bik7Ci0gICAgICAgICAgICBpY29uVVJMQW5kQ2FsbGJhY2suc2Vj
b25kKGRlY2lzaW9uID09IEljb25EYXRhYmFzZTo6SWNvbkxvYWREZWNpc2lvbjo6WWVzKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIHByaXYtPmlzVVJMSW1wb3J0Q29tcGxldGVkID0gdHJ1ZTsKLSAg
ICB9Ci0KLSAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2UqIG1fZGF0YWJhc2U7Ci19OwotCi1XZWJL
aXRGYXZpY29uRGF0YWJhc2UqIHdlYmtpdEZhdmljb25EYXRhYmFzZUNyZWF0ZSgpCitzdGF0aWMg
Ym9vbCB3ZWJraXRGYXZpY29uRGF0YWJhc2VJc09wZW4oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBk
YXRhYmFzZSkKIHsKLSAgICByZXR1cm4gV0VCS0lUX0ZBVklDT05fREFUQUJBU0UoZ19vYmplY3Rf
bmV3KFdFQktJVF9UWVBFX0ZBVklDT05fREFUQUJBU0UsIG51bGxwdHIpKTsKKyAgICByZXR1cm4g
ISFkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlOwogfQogCi12b2lkIHdlYmtpdEZhdmljb25E
YXRhYmFzZU9wZW4oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgU3RyaW5n
JiBwYXRoKQordm9pZCB3ZWJraXRGYXZpY29uRGF0YWJhc2VPcGVuKFdlYktpdEZhdmljb25EYXRh
YmFzZSogZGF0YWJhc2UsIGNvbnN0IFN0cmluZyYgcGF0aCwgYm9vbCBpc0VwaGVtZXJhbCkKIHsK
ICAgICBpZiAod2Via2l0RmF2aWNvbkRhdGFiYXNlSXNPcGVuKGRhdGFiYXNlKSkKICAgICAgICAg
cmV0dXJuOwogCi0gICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSogcHJpdiA9IGRhdGFi
YXNlLT5wcml2OwotICAgIHByaXYtPmljb25EYXRhYmFzZSA9IG1ha2VVbmlxdWU8SWNvbkRhdGFi
YXNlPigpOwotICAgIHByaXYtPmljb25EYXRhYmFzZS0+c2V0Q2xpZW50KG1ha2VVbmlxdWU8V2Vi
S2l0SWNvbkRhdGFiYXNlQ2xpZW50PihkYXRhYmFzZSkpOwotICAgIEljb25EYXRhYmFzZTo6ZGVs
YXlEYXRhYmFzZUNsZWFudXAoKTsKLSAgICBwcml2LT5pY29uRGF0YWJhc2UtPnNldEVuYWJsZWQo
dHJ1ZSk7Ci0KLSAgICBpZiAoIXByaXYtPmljb25EYXRhYmFzZS0+b3BlbihGaWxlU3lzdGVtOjpk
aXJlY3RvcnlOYW1lKHBhdGgpLCBGaWxlU3lzdGVtOjpwYXRoR2V0RmlsZU5hbWUocGF0aCkpKSB7
Ci0gICAgICAgIHByaXYtPmljb25EYXRhYmFzZSA9IG51bGxwdHI7Ci0gICAgICAgIEljb25EYXRh
YmFzZTo6YWxsb3dEYXRhYmFzZUNsZWFudXAoKTsKLSAgICB9Ci19Ci0KLWJvb2wgd2Via2l0RmF2
aWNvbkRhdGFiYXNlSXNPcGVuKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UpCi17Ci0g
ICAgcmV0dXJuIGRhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UgJiYgZGF0YWJhc2UtPnByaXYt
Pmljb25EYXRhYmFzZS0+aXNPcGVuKCk7CisgICAgZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFz
ZSA9IEljb25EYXRhYmFzZTo6Y3JlYXRlKHBhdGgsIGlzRXBoZW1lcmFsID8gSWNvbkRhdGFiYXNl
OjpBbGxvd0RhdGFiYXNlV3JpdGU6Ok5vIDogSWNvbkRhdGFiYXNlOjpBbGxvd0RhdGFiYXNlV3Jp
dGU6Olllcyk7CiB9CiAKLXZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0UHJpdmF0ZUJyb3dz
aW5nRW5hYmxlZChXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFiYXNlLCBib29sIGVuYWJsZWQp
Cit2b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZUNsb3NlKFdlYktpdEZhdmljb25EYXRhYmFzZSog
ZGF0YWJhc2UpCiB7Ci0gICAgaWYgKGRhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UpCi0gICAg
ICAgIGRhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnNldFByaXZhdGVCcm93c2luZ0VuYWJs
ZWQoZW5hYmxlZCk7CisgICAgZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFzZSA9IG51bGxwdHI7
CiB9CiAKICNpZiBQTEFURk9STShHVEspCi12b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZUdldExv
YWREZWNpc2lvbkZvckljb24oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3Qg
TGlua0ljb24mIGljb24sIGNvbnN0IFN0cmluZyYgcGFnZVVSTCwgRnVuY3Rpb248dm9pZChib29s
KT4mJiBjb21wbGV0aW9uSGFuZGxlcikKK3ZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlR2V0TG9h
ZERlY2lzaW9uRm9ySWNvbihXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFiYXNlLCBjb25zdCBM
aW5rSWNvbiYgaWNvbiwgY29uc3QgU3RyaW5nJiBwYWdlVVJMLCBib29sIGlzRXBoZW1lcmFsLCBG
dW5jdGlvbjx2b2lkKGJvb2wpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQogewogICAgIGlmICghd2Vi
a2l0RmF2aWNvbkRhdGFiYXNlSXNPcGVuKGRhdGFiYXNlKSkgewogICAgICAgICBjb21wbGV0aW9u
SGFuZGxlcihmYWxzZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBXZWJLaXRGYXZp
Y29uRGF0YWJhc2VQcml2YXRlKiBwcml2ID0gZGF0YWJhc2UtPnByaXY7Ci0gICAgYXV0byBkZWNp
c2lvbiA9IHByaXYtPmljb25EYXRhYmFzZS0+c3luY2hyb25vdXNMb2FkRGVjaXNpb25Gb3JJY29u
VVJMKGljb24udXJsLnN0cmluZygpKTsKLSAgICBzd2l0Y2ggKGRlY2lzaW9uKSB7Ci0gICAgY2Fz
ZSBJY29uRGF0YWJhc2U6Okljb25Mb2FkRGVjaXNpb246OlVua25vd246Ci0gICAgICAgIHByaXYt
PnBlbmRpbmdMb2FkRGVjaXNpb25zLmFwcGVuZChzdGQ6Om1ha2VfcGFpcihpY29uLnVybC5zdHJp
bmcoKSwgV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcikpKTsKLSAgICAgICAgcHJpdi0+aWNvbkRh
dGFiYXNlLT5zZXRJY29uVVJMRm9yUGFnZVVSTChpY29uLnVybC5zdHJpbmcoKSwgcGFnZVVSTCk7
Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSWNvbkRhdGFiYXNlOjpJY29uTG9hZERlY2lzaW9u
OjpObzoKLSAgICAgICAgcHJpdi0+aWNvbkRhdGFiYXNlLT5zZXRJY29uVVJMRm9yUGFnZVVSTChp
Y29uLnVybC5zdHJpbmcoKSwgcGFnZVVSTCk7Ci0gICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKGZh
bHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJY29uRGF0YWJhc2U6Okljb25Mb2FkRGVj
aXNpb246OlllczoKLSAgICAgICAgY29tcGxldGlvbkhhbmRsZXIodHJ1ZSk7Ci0gICAgICAgIGJy
ZWFrOwotICAgIH0KKyAgICBkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlLT5jaGVja0ljb25V
UkxBbmRTZXRQYWdlVVJMSWZOZWVkZWQoaWNvbi51cmwuc3RyaW5nKCksIHBhZ2VVUkwsCisgICAg
ICAgIGlzRXBoZW1lcmFsID8gSWNvbkRhdGFiYXNlOjpBbGxvd0RhdGFiYXNlV3JpdGU6Ok5vIDog
SWNvbkRhdGFiYXNlOjpBbGxvd0RhdGFiYXNlV3JpdGU6OlllcywKKyAgICAgICAgICAgIFtkYXRh
YmFzZSA9IEdSZWZQdHI8V2ViS2l0RmF2aWNvbkRhdGFiYXNlPihkYXRhYmFzZSksIHVybCA9IGlj
b24udXJsLnN0cmluZygpLmlzb2xhdGVkQ29weSgpLCBwYWdlVVJMID0gcGFnZVVSTC5pc29sYXRl
ZENvcHkoKSwgY29tcGxldGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0o
Ym9vbCBmb3VuZCwgYm9vbCBjaGFuZ2VkKSB7CisgICAgICAgICAgICBpZiAoIXdlYmtpdEZhdmlj
b25EYXRhYmFzZUlzT3BlbihkYXRhYmFzZS5nZXQoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgICAgICBpZiAoZm91bmQgJiYgY2hhbmdlZCkKKyAgICAgICAgICAgICAgICBn
X3NpZ25hbF9lbWl0KGRhdGFiYXNlLmdldCgpLCBzaWduYWxzW0ZBVklDT05fQ0hBTkdFRF0sIDAs
IHBhZ2VVUkwudXRmOCgpLmRhdGEoKSwgdXJsLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAg
Y29tcGxldGlvbkhhbmRsZXIoIWZvdW5kKTsKKyAgICAgICAgfSk7CiB9CiAKLXZvaWQgd2Via2l0
RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBhZ2VVUkwoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBk
YXRhYmFzZSwgY29uc3QgTGlua0ljb24mIGljb24sIEFQSTo6RGF0YSYgaWNvbkRhdGEsIGNvbnN0
IFN0cmluZyYgcGFnZVVSTCkKK3ZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBh
Z2VVUkwoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgTGlua0ljb24mIGlj
b24sIEFQSTo6RGF0YSYgaWNvbkRhdGEsIGNvbnN0IFN0cmluZyYgcGFnZVVSTCwgYm9vbCBpc0Vw
aGVtZXJhbCkKIHsKICAgICBpZiAoIXdlYmtpdEZhdmljb25EYXRhYmFzZUlzT3BlbihkYXRhYmFz
ZSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGlmIChwYWdlVVJMLmlzRW1wdHkoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSogcHJpdiA9IGRh
dGFiYXNlLT5wcml2OwotICAgIFNldEZvclNjb3BlPGJvb2w+IGNoYW5nZShwcml2LT5pc1NldHRp
bmdJY29uLCB0cnVlKTsKLSAgICBwcml2LT5pY29uRGF0YWJhc2UtPnNldEljb25VUkxGb3JQYWdl
VVJMKGljb24udXJsLnN0cmluZygpLCBwYWdlVVJMKTsKLSAgICBwcml2LT5pY29uRGF0YWJhc2Ut
PnNldEljb25EYXRhRm9ySWNvblVSTChTaGFyZWRCdWZmZXI6OmNyZWF0ZShpY29uRGF0YS5ieXRl
cygpLCBpY29uRGF0YS5zaXplKCkpLCBpY29uLnVybC5zdHJpbmcoKSk7Ci0gICAgd2Via2l0RmF2
aWNvbkRhdGFiYXNlU2V0SWNvblVSTEZvclBhZ2VVUkwoZGF0YWJhc2UsIGljb24udXJsLnN0cmlu
ZygpLCBwYWdlVVJMKTsKLSAgICBnX3NpZ25hbF9lbWl0KGRhdGFiYXNlLCBzaWduYWxzW0ZBVklD
T05fQ0hBTkdFRF0sIDAsIHBhZ2VVUkwudXRmOCgpLmRhdGEoKSwgaWNvbi51cmwuc3RyaW5nKCku
dXRmOCgpLmRhdGEoKSk7Ci0gICAgcHJvY2Vzc1BlbmRpbmdJY29uc0ZvclBhZ2VVUkwoZGF0YWJh
c2UsIHBhZ2VVUkwpOwotfQotCi1zdGF0aWMgUGVuZGluZ0ljb25SZXF1ZXN0VmVjdG9yKiBnZXRP
ckNyZWF0ZVBlbmRpbmdJY29uUmVxdWVzdHMoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFz
ZSwgY29uc3QgU3RyaW5nJiBwYWdlVVJMKQotewotICAgIFBlbmRpbmdJY29uUmVxdWVzdFZlY3Rv
ciogaWNvbnMgPSBkYXRhYmFzZS0+cHJpdi0+cGVuZGluZ0ljb25SZXF1ZXN0cy5nZXQocGFnZVVS
TCk7Ci0gICAgaWYgKCFpY29ucykgewotICAgICAgICBpY29ucyA9IG5ldyBQZW5kaW5nSWNvblJl
cXVlc3RWZWN0b3I7Ci0gICAgICAgIGRhdGFiYXNlLT5wcml2LT5wZW5kaW5nSWNvblJlcXVlc3Rz
LnNldChwYWdlVVJMLCBpY29ucyk7Ci0gICAgfQorICAgIGRhdGFiYXNlLT5wcml2LT5pY29uRGF0
YWJhc2UtPnNldEljb25Gb3JQYWdlVVJMKGljb24udXJsLnN0cmluZygpLCBpY29uRGF0YS5ieXRl
cygpLCBpY29uRGF0YS5zaXplKCksIHBhZ2VVUkwsCisgICAgICAgIGlzRXBoZW1lcmFsID8gSWNv
bkRhdGFiYXNlOjpBbGxvd0RhdGFiYXNlV3JpdGU6Ok5vIDogSWNvbkRhdGFiYXNlOjpBbGxvd0Rh
dGFiYXNlV3JpdGU6OlllcywKKyAgICAgICAgW2RhdGFiYXNlID0gR1JlZlB0cjxXZWJLaXRGYXZp
Y29uRGF0YWJhc2U+KGRhdGFiYXNlKSwgdXJsID0gaWNvbi51cmwuc3RyaW5nKCkuaXNvbGF0ZWRD
b3B5KCksIHBhZ2VVUkwgPSBwYWdlVVJMLmlzb2xhdGVkQ29weSgpXShib29sIHN1Y2Nlc3MpIHsK
KyAgICAgICAgICAgIGlmICghd2Via2l0RmF2aWNvbkRhdGFiYXNlSXNPcGVuKGRhdGFiYXNlLmdl
dCgpKSB8fCAhc3VjY2VzcykKKyAgICAgICAgICAgICAgICByZXR1cm47CiAKLSAgICByZXR1cm4g
aWNvbnM7CisgICAgICAgICAgICBnX3NpZ25hbF9lbWl0KGRhdGFiYXNlLmdldCgpLCBzaWduYWxz
W0ZBVklDT05fQ0hBTkdFRF0sIDAsIHBhZ2VVUkwudXRmOCgpLmRhdGEoKSwgdXJsLnV0ZjgoKS5k
YXRhKCkpOworICAgICAgICB9KTsKIH0KICNlbmRpZgogCkBAIC0zNDksMzQgKzE2Miw4IEBAIEdR
dWFyayB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9lcnJvcl9xdWFyayh2b2lkKQogfQogCiAjaWYg
UExBVEZPUk0oR1RLKQotLyoqCi0gKiB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNv
bjoKLSAqIEBkYXRhYmFzZTogYSAjV2ViS2l0RmF2aWNvbkRhdGFiYXNlCi0gKiBAcGFnZV91cmk6
IFVSSSBvZiB0aGUgcGFnZSBmb3Igd2hpY2ggd2Ugd2FudCB0byByZXRyaWV2ZSB0aGUgZmF2aWNv
bgotICogQGNhbmNlbGxhYmxlOiAoYWxsb3ctbm9uZSk6IEEgI0dDYW5jZWxsYWJsZSBvciAlTlVM
TC4KLSAqIEBjYWxsYmFjazogKHNjb3BlIGFzeW5jKTogQSAjR0FzeW5jUmVhZHlDYWxsYmFjayB0
byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMKLSAqICAgICAgICAgICAgc2F0aXNmaWVkIG9yICVO
VUxMIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQuCi0gKiBAdXNlcl9kYXRhOiAo
Y2xvc3VyZSk6IFRoZSBkYXRhIHRvIHBhc3MgdG8gQGNhbGxiYWNrLgotICoKLSAqIEFzeW5jaHJv
bm91c2x5IG9idGFpbnMgYSAjY2Fpcm9fc3VyZmFjZV90IG9mIHRoZSBmYXZpY29uIGZvciB0aGUK
LSAqIGdpdmVuIHBhZ2UgVVJJLiBJdCByZXR1cm5zIHRoZSBjYWNoZWQgaWNvbiBpZiBpdCdzIGlu
IHRoZSBkYXRhYmFzZQotICogYXN5bmNocm9ub3VzbHkgd2FpdGluZyBmb3IgdGhlIGljb24gdG8g
YmUgcmVhZCBmcm9tIHRoZSBkYXRhYmFzZS4KLSAqCi0gKiBUaGlzIGlzIGFuIGFzeW5jaHJvbm91
cyBtZXRob2QuIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBmaW5pc2hlZCwgY2FsbGJhY2sgd2lsbAot
ICogYmUgaW52b2tlZC4gWW91IGNhbiB0aGVuIGNhbGwgd2Via2l0X2Zhdmljb25fZGF0YWJhc2Vf
Z2V0X2Zhdmljb25fZmluaXNoKCkKLSAqIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRp
b24uCi0gKgotICogWW91IG11c3QgY2FsbCB3ZWJraXRfd2ViX2NvbnRleHRfc2V0X2Zhdmljb25f
ZGF0YWJhc2VfZGlyZWN0b3J5KCkgZm9yCi0gKiB0aGUgI1dlYktpdFdlYkNvbnRleHQgYXNzb2Np
YXRlZCB3aXRoIHRoaXMgI1dlYktpdEZhdmljb25EYXRhYmFzZQotICogYmVmb3JlIGF0dGVtcHRp
bmcgdG8gdXNlIHRoaXMgZnVuY3Rpb247IG90aGVyd2lzZSwKLSAqIHdlYmtpdF9mYXZpY29uX2Rh
dGFiYXNlX2dldF9mYXZpY29uX2ZpbmlzaCgpIHdpbGwgcmV0dXJuCi0gKiAlV0VCS0lUX0ZBVklD
T05fREFUQUJBU0VfRVJST1JfTk9UX0lOSVRJQUxJWkVELgotICovCi12b2lkIHdlYmtpdF9mYXZp
Y29uX2RhdGFiYXNlX2dldF9mYXZpY29uKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2Us
IGNvbnN0IGdjaGFyKiBwYWdlVVJJLCBHQ2FuY2VsbGFibGUqIGNhbmNlbGxhYmxlLCBHQXN5bmNS
ZWFkeUNhbGxiYWNrIGNhbGxiYWNrLCBncG9pbnRlciB1c2VyRGF0YSkKK3ZvaWQgd2Via2l0RmF2
aWNvbkRhdGFiYXNlR2V0RmF2aWNvbkludGVybmFsKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0
YWJhc2UsIGNvbnN0IGdjaGFyKiBwYWdlVVJJLCBib29sIGlzRXBoZW1lcmFsLCBHQ2FuY2VsbGFi
bGUqIGNhbmNlbGxhYmxlLCBHQXN5bmNSZWFkeUNhbGxiYWNrIGNhbGxiYWNrLCBncG9pbnRlciB1
c2VyRGF0YSkKIHsKLSAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9JU19GQVZJQ09OX0RBVEFC
QVNFKGRhdGFiYXNlKSk7Ci0gICAgZ19yZXR1cm5faWZfZmFpbChwYWdlVVJJKTsKLQogICAgIGlm
ICghd2Via2l0RmF2aWNvbkRhdGFiYXNlSXNPcGVuKGRhdGFiYXNlKSkgewogICAgICAgICBnX3Rh
c2tfcmVwb3J0X25ld19lcnJvcihkYXRhYmFzZSwgY2FsbGJhY2ssIHVzZXJEYXRhLCAwLAogICAg
ICAgICAgICAgV0VCS0lUX0ZBVklDT05fREFUQUJBU0VfRVJST1IsIFdFQktJVF9GQVZJQ09OX0RB
VEFCQVNFX0VSUk9SX05PVF9JTklUSUFMSVpFRCwgXygiRmF2aWNvbnMgZGF0YWJhc2Ugbm90IGlu
aXRpYWxpemVkIHlldCIpKTsKQEAgLTM5MSw4ICsxNzgsOSBAQCB2b2lkIHdlYmtpdF9mYXZpY29u
X2RhdGFiYXNlX2dldF9mYXZpY29uKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNv
bnN0CiAKICAgICBHUmVmUHRyPEdUYXNrPiB0YXNrID0gYWRvcHRHUmVmKGdfdGFza19uZXcoZGF0
YWJhc2UsIGNhbmNlbGxhYmxlLCBjYWxsYmFjaywgdXNlckRhdGEpKTsKIAorI2lmIDAKICAgICBH
ZXRGYXZpY29uU3VyZmFjZUFzeW5jRGF0YSogZGF0YSA9IGNyZWF0ZUdldEZhdmljb25TdXJmYWNl
QXN5bmNEYXRhKCk7Ci0gICAgZGF0YS0+ZmF2aWNvbkRhdGFiYXNlID0gZGF0YWJhc2U7CisgICAg
ZGF0YS0+aWNvbkRhdGFiYXNlID0gZGF0YWJhc2U7CiAgICAgZGF0YS0+cGFnZVVSTCA9IFN0cmlu
Zzo6ZnJvbVVURjgocGFnZVVSSSk7CiAgICAgZ190YXNrX3NldF90YXNrX2RhdGEodGFzay5nZXQo
KSwgZGF0YSwgcmVpbnRlcnByZXRfY2FzdDxHRGVzdHJveU5vdGlmeT4oZGVzdHJveUdldEZhdmlj
b25TdXJmYWNlQXN5bmNEYXRhKSk7CiAKQEAgLTQzMCw2ICsyMTgsNTAgQEAgdm9pZCB3ZWJraXRf
ZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbihXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFi
YXNlLCBjb25zdAogCiAgICAgZ190YXNrX3JldHVybl9uZXdfZXJyb3IodGFzay5nZXQoKSwgV0VC
S0lUX0ZBVklDT05fREFUQUJBU0VfRVJST1IsIFdFQktJVF9GQVZJQ09OX0RBVEFCQVNFX0VSUk9S
X0ZBVklDT05fVU5LTk9XTiwKICAgICAgICAgXygiVW5rbm93biBmYXZpY29uIGZvciBwYWdlICVz
IiksIHBhZ2VVUkkpOworI2Vsc2UKKyAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2YXRlKiBw
cml2ID0gZGF0YWJhc2UtPnByaXY7CisKKyAgICBwcml2LT5pY29uRGF0YWJhc2UtPmxvYWRJY29u
Rm9yUGFnZVVSTChTdHJpbmc6OmZyb21VVEY4KHBhZ2VVUkkpLCBpc0VwaGVtZXJhbCA/IEljb25E
YXRhYmFzZTo6QWxsb3dEYXRhYmFzZVdyaXRlOjpObyA6IEljb25EYXRhYmFzZTo6QWxsb3dEYXRh
YmFzZVdyaXRlOjpZZXMsCisgICAgICAgIFt0YXNrID0gV1RGTW92ZSh0YXNrKSwgcGFnZVVSSSA9
IENTdHJpbmcocGFnZVVSSSldKFJlZlB0cjxjYWlyb19zdXJmYWNlX3Q+JiYgaWNvbikgeworICAg
ICAgICAgICAgaWYgKCFpY29uKSB7CisgICAgICAgICAgICAgICAgZ190YXNrX3JldHVybl9uZXdf
ZXJyb3IodGFzay5nZXQoKSwgV0VCS0lUX0ZBVklDT05fREFUQUJBU0VfRVJST1IsIFdFQktJVF9G
QVZJQ09OX0RBVEFCQVNFX0VSUk9SX0ZBVklDT05fVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAg
ICAgXygiVW5rbm93biBmYXZpY29uIGZvciBwYWdlICVzIiksIHBhZ2VVUkkuZGF0YSgpKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnX3Rhc2tf
cmV0dXJuX3BvaW50ZXIodGFzay5nZXQoKSwgaWNvbi5sZWFrUmVmKCksIHJlaW50ZXJwcmV0X2Nh
c3Q8R0Rlc3Ryb3lOb3RpZnk+KGNhaXJvX3N1cmZhY2VfZGVzdHJveSkpOworICAgICAgICB9KTsK
KyNlbmRpZgorfQorCisvKioKKyAqIHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29u
OgorICogQGRhdGFiYXNlOiBhICNXZWJLaXRGYXZpY29uRGF0YWJhc2UKKyAqIEBwYWdlX3VyaTog
VVJJIG9mIHRoZSBwYWdlIGZvciB3aGljaCB3ZSB3YW50IHRvIHJldHJpZXZlIHRoZSBmYXZpY29u
CisgKiBAY2FuY2VsbGFibGU6IChhbGxvdy1ub25lKTogQSAjR0NhbmNlbGxhYmxlIG9yICVOVUxM
LgorICogQGNhbGxiYWNrOiAoc2NvcGUgYXN5bmMpOiBBICNHQXN5bmNSZWFkeUNhbGxiYWNrIHRv
IGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcworICogICAgICAgICAgICBzYXRpc2ZpZWQgb3IgJU5V
TEwgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdC4KKyAqIEB1c2VyX2RhdGE6IChj
bG9zdXJlKTogVGhlIGRhdGEgdG8gcGFzcyB0byBAY2FsbGJhY2suCisgKgorICogQXN5bmNocm9u
b3VzbHkgb2J0YWlucyBhICNjYWlyb19zdXJmYWNlX3Qgb2YgdGhlIGZhdmljb24gZm9yIHRoZQor
ICogZ2l2ZW4gcGFnZSBVUkkuIEl0IHJldHVybnMgdGhlIGNhY2hlZCBpY29uIGlmIGl0J3MgaW4g
dGhlIGRhdGFiYXNlCisgKiBhc3luY2hyb25vdXNseSB3YWl0aW5nIGZvciB0aGUgaWNvbiB0byBi
ZSByZWFkIGZyb20gdGhlIGRhdGFiYXNlLgorICoKKyAqIFRoaXMgaXMgYW4gYXN5bmNocm9ub3Vz
IG1ldGhvZC4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGZpbmlzaGVkLCBjYWxsYmFjayB3aWxsCisg
KiBiZSBpbnZva2VkLiBZb3UgY2FuIHRoZW4gY2FsbCB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9n
ZXRfZmF2aWNvbl9maW5pc2goKQorICogdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlv
bi4KKyAqCisgKiBZb3UgbXVzdCBjYWxsIHdlYmtpdF93ZWJfY29udGV4dF9zZXRfZmF2aWNvbl9k
YXRhYmFzZV9kaXJlY3RvcnkoKSBmb3IKKyAqIHRoZSAjV2ViS2l0V2ViQ29udGV4dCBhc3NvY2lh
dGVkIHdpdGggdGhpcyAjV2ViS2l0RmF2aWNvbkRhdGFiYXNlCisgKiBiZWZvcmUgYXR0ZW1wdGlu
ZyB0byB1c2UgdGhpcyBmdW5jdGlvbjsgb3RoZXJ3aXNlLAorICogd2Via2l0X2Zhdmljb25fZGF0
YWJhc2VfZ2V0X2Zhdmljb25fZmluaXNoKCkgd2lsbCByZXR1cm4KKyAqICVXRUJLSVRfRkFWSUNP
Tl9EQVRBQkFTRV9FUlJPUl9OT1RfSU5JVElBTElaRUQuCisgKi8KK3ZvaWQgd2Via2l0X2Zhdmlj
b25fZGF0YWJhc2VfZ2V0X2Zhdmljb24oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwg
Y29uc3QgZ2NoYXIqIHBhZ2VVUkksIEdDYW5jZWxsYWJsZSogY2FuY2VsbGFibGUsIEdBc3luY1Jl
YWR5Q2FsbGJhY2sgY2FsbGJhY2ssIGdwb2ludGVyIHVzZXJEYXRhKQoreworICAgIGdfcmV0dXJu
X2lmX2ZhaWwoV0VCS0lUX0lTX0ZBVklDT05fREFUQUJBU0UoZGF0YWJhc2UpKTsKKyAgICBnX3Jl
dHVybl9pZl9mYWlsKHBhZ2VVUkkpOworCisgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlR2V0RmF2
aWNvbkludGVybmFsKGRhdGFiYXNlLCBwYWdlVVJJLCBmYWxzZSwgY2FuY2VsbGFibGUsIGNhbGxi
YWNrLCB1c2VyRGF0YSk7CiB9CiAKIC8qKgpAQCAtNDQ5LDExICsyODEsMTAgQEAgY2Fpcm9fc3Vy
ZmFjZV90KiB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbl9maW5pc2goV2ViS2l0
RmF2aWNvbkRhdGFiYXMKICAgICBnX3JldHVybl92YWxfaWZfZmFpbChnX3Rhc2tfaXNfdmFsaWQo
cmVzdWx0LCBkYXRhYmFzZSksIDApOwogCiAgICAgR1Rhc2sqIHRhc2sgPSBHX1RBU0socmVzdWx0
KTsKLSAgICBpZiAoIWdfdGFza19wcm9wYWdhdGVfYm9vbGVhbih0YXNrLCBlcnJvcikpCi0gICAg
ICAgIHJldHVybiAwOworICAgIGlmIChhdXRvKiBpY29uID0gZ190YXNrX3Byb3BhZ2F0ZV9wb2lu
dGVyKHRhc2ssIGVycm9yKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNhaXJvX3N1cmZh
Y2VfdCo+KGljb24pOwogCi0gICAgR2V0RmF2aWNvblN1cmZhY2VBc3luY0RhdGEqIGRhdGEgPSBz
dGF0aWNfY2FzdDxHZXRGYXZpY29uU3VyZmFjZUFzeW5jRGF0YSo+KGdfdGFza19nZXRfdGFza19k
YXRhKHRhc2spKTsKLSAgICByZXR1cm4gY2Fpcm9fc3VyZmFjZV9yZWZlcmVuY2UoZGF0YS0+aWNv
bi5nZXQoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAjZW5kaWYKIApAQCAtNDc2LDcgKzMw
Nyw3IEBAIGdjaGFyKiB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbl91cmkoV2Vi
S2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwKICAgICBpZiAoIXdlYmtpdEZhdmljb25EYXRh
YmFzZUlzT3BlbihkYXRhYmFzZSkpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgU3Ry
aW5nIGljb25VUkxGb3JQYWdlVVJMID0gZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFzZS0+c3lu
Y2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChTdHJpbmc6OmZyb21VVEY4KHBhZ2VVUkwpKTsKKyAg
ICBTdHJpbmcgaWNvblVSTEZvclBhZ2VVUkwgPSBkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNl
LT5pY29uVVJMRm9yUGFnZVVSTChTdHJpbmc6OmZyb21VVEY4KHBhZ2VVUkwpKTsKICAgICBpZiAo
aWNvblVSTEZvclBhZ2VVUkwuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIApA
QCAtNDk2LDUgKzMyNyw1IEBAIHZvaWQgd2Via2l0X2Zhdmljb25fZGF0YWJhc2VfY2xlYXIoV2Vi
S2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSkKICAgICBpZiAoIXdlYmtpdEZhdmljb25EYXRh
YmFzZUlzT3BlbihkYXRhYmFzZSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGRhdGFiYXNlLT5w
cml2LT5pY29uRGF0YWJhc2UtPnJlbW92ZUFsbEljb25zKCk7CisgICAgZGF0YWJhc2UtPnByaXYt
Pmljb25EYXRhYmFzZS0+Y2xlYXIoW10geyB9KTsKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJL
aXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUuaCBiL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZVByaXZh
dGUuaAppbmRleCA5YWI0ZDViMjUxYi4uOTQxNDRhMWI4M2QgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUuaAor
KysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRGYXZpY29uRGF0YWJh
c2VQcml2YXRlLmgKQEAgLTI0LDEwICsyNCwxMCBAQAogI2luY2x1ZGUgPFdlYkNvcmUvTGlua0lj
b24uaD4KIAogV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiB3ZWJraXRGYXZpY29uRGF0YWJhc2VDcmVh
dGUoKTsKLXZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlT3BlbihXZWJLaXRGYXZpY29uRGF0YWJh
c2UqLCBjb25zdCBTdHJpbmcmIHBhdGgpOwotYm9vbCB3ZWJraXRGYXZpY29uRGF0YWJhc2VJc09w
ZW4oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKik7Ci12b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZVNl
dFByaXZhdGVCcm93c2luZ0VuYWJsZWQoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiwgYm9vbCk7Cit2
b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZU9wZW4oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiwgY29u
c3QgU3RyaW5nJiBwYXRoLCBib29sIGlzRXBoZW1lcmFsKTsKK3ZvaWQgd2Via2l0RmF2aWNvbkRh
dGFiYXNlQ2xvc2UoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKik7CiAjaWYgUExBVEZPUk0oR1RLKQot
dm9pZCB3ZWJraXRGYXZpY29uRGF0YWJhc2VHZXRMb2FkRGVjaXNpb25Gb3JJY29uKFdlYktpdEZh
dmljb25EYXRhYmFzZSosIGNvbnN0IFdlYkNvcmU6OkxpbmtJY29uJiwgY29uc3QgU3RyaW5nJiwg
RnVuY3Rpb248dm9pZChib29sKT4mJik7Ci12b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldElj
b25Gb3JQYWdlVVJMKFdlYktpdEZhdmljb25EYXRhYmFzZSosIGNvbnN0IFdlYkNvcmU6OkxpbmtJ
Y29uJiwgQVBJOjpEYXRhJiwgY29uc3QgU3RyaW5nJik7Cit2b2lkIHdlYmtpdEZhdmljb25EYXRh
YmFzZUdldExvYWREZWNpc2lvbkZvckljb24oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiwgY29uc3Qg
V2ViQ29yZTo6TGlua0ljb24mLCBjb25zdCBTdHJpbmcmLCBib29sIGlzRXBoZW1lcmFsLCBGdW5j
dGlvbjx2b2lkKGJvb2wpPiYmKTsKK3ZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZv
clBhZ2VVUkwoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiwgY29uc3QgV2ViQ29yZTo6TGlua0ljb24m
LCBBUEk6OkRhdGEmLCBjb25zdCBTdHJpbmcmLCBib29sIGlzRXBoZW1lcmFsKTsKK3ZvaWQgd2Vi
a2l0RmF2aWNvbkRhdGFiYXNlR2V0RmF2aWNvbkludGVybmFsKFdlYktpdEZhdmljb25EYXRhYmFz
ZSosIGNvbnN0IGdjaGFyKiBwYWdlVVJJLCBib29sIGlzRXBoZW1lcmFsLCBHQ2FuY2VsbGFibGUq
LCBHQXN5bmNSZWFkeUNhbGxiYWNrLCBncG9pbnRlcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYkNvbnRleHQuY3BwIGIvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViQ29udGV4dC5jcHAKaW5kZXgg
M2E4MTE0MDBhMDYuLjg4NjJjZDRlNzM2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJv
Y2Vzcy9BUEkvZ2xpYi9XZWJLaXRXZWJDb250ZXh0LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L1VJ
UHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRXZWJDb250ZXh0LmNwcApAQCAtMTc5LDcgKzE3OSw2IEBA
IHN0cnVjdCBfV2ViS2l0V2ViQ29udGV4dFByaXZhdGUgewogICAgIFdlYktpdFByb2Nlc3NNb2Rl
bCBwcm9jZXNzTW9kZWw7CiAKICAgICBIYXNoTWFwPHVpbnQ2NF90LCBXZWJLaXRXZWJWaWV3Kj4g
d2ViVmlld3M7Ci0gICAgdW5zaWduZWQgZXBoZW1lcmFsUGFnZUNvdW50OwogCiAgICAgQ1N0cmlu
ZyB3ZWJFeHRlbnNpb25zRGlyZWN0b3J5OwogICAgIEdSZWZQdHI8R1ZhcmlhbnQ+IHdlYkV4dGVu
c2lvbnNJbml0aWFsaXphdGlvblVzZXJEYXRhOwpAQCAtMzcxLDYgKzM3MCwxMSBAQCBzdGF0aWMg
dm9pZCB3ZWJraXRXZWJDb250ZXh0RGlzcG9zZShHT2JqZWN0KiBvYmplY3QpCiAgICAgICAgIHBy
aXYtPndlYnNpdGVEYXRhTWFuYWdlciA9IG51bGxwdHI7CiAgICAgfQogCisgICAgaWYgKHByaXYt
PmZhdmljb25EYXRhYmFzZSkgeworICAgICAgICB3ZWJraXRGYXZpY29uRGF0YWJhc2VDbG9zZShw
cml2LT5mYXZpY29uRGF0YWJhc2UuZ2V0KCkpOworICAgICAgICBwcml2LT5mYXZpY29uRGF0YWJh
c2UgPSBudWxscHRyOworICAgIH0KKwogICAgIEdfT0JKRUNUX0NMQVNTKHdlYmtpdF93ZWJfY29u
dGV4dF9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKG9iamVjdCk7CiB9CiAKQEAgLTg3MSwzMSArODc1
LDYgQEAgc3RhdGljIHZvaWQgZW5zdXJlRmF2aWNvbkRhdGFiYXNlKFdlYktpdFdlYkNvbnRleHQq
IGNvbnRleHQpCiAgICAgcHJpdi0+ZmF2aWNvbkRhdGFiYXNlID0gYWRvcHRHUmVmKHdlYmtpdEZh
dmljb25EYXRhYmFzZUNyZWF0ZSgpKTsKIH0KIAotc3RhdGljIHZvaWQgd2Via2l0V2ViQ29udGV4
dEVuYWJsZUljb25EYXRhYmFzZVByaXZhdGVCcm93c2luZ0lmTmVlZGVkKFdlYktpdFdlYkNvbnRl
eHQqIGNvbnRleHQsIFdlYktpdFdlYlZpZXcqIHdlYlZpZXcpCi17Ci0gICAgaWYgKHdlYmtpdF93
ZWJfY29udGV4dF9pc19lcGhlbWVyYWwoY29udGV4dCkpCi0gICAgICAgIHJldHVybjsKLSAgICBp
ZiAoIXdlYmtpdF93ZWJfdmlld19pc19lcGhlbWVyYWwod2ViVmlldykpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGlmICghY29udGV4dC0+cHJpdi0+ZXBoZW1lcmFsUGFnZUNvdW50ICYmIGNvbnRl
eHQtPnByaXYtPmZhdmljb25EYXRhYmFzZSkKLSAgICAgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNl
U2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChjb250ZXh0LT5wcml2LT5mYXZpY29uRGF0YWJhc2Uu
Z2V0KCksIHRydWUpOwotICAgIGNvbnRleHQtPnByaXYtPmVwaGVtZXJhbFBhZ2VDb3VudCsrOwot
fQotCi1zdGF0aWMgdm9pZCB3ZWJraXRXZWJDb250ZXh0RGlzYWJsZUljb25EYXRhYmFzZVByaXZh
dGVCcm93c2luZ0lmTmVlZGVkKFdlYktpdFdlYkNvbnRleHQqIGNvbnRleHQsIFdlYktpdFdlYlZp
ZXcqIHdlYlZpZXcpCi17Ci0gICAgaWYgKHdlYmtpdF93ZWJfY29udGV4dF9pc19lcGhlbWVyYWwo
Y29udGV4dCkpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoIXdlYmtpdF93ZWJfdmlld19pc19l
cGhlbWVyYWwod2ViVmlldykpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFTU0VSVChjb250ZXh0
LT5wcml2LT5lcGhlbWVyYWxQYWdlQ291bnQpOwotICAgIGNvbnRleHQtPnByaXYtPmVwaGVtZXJh
bFBhZ2VDb3VudC0tOwotICAgIGlmICghY29udGV4dC0+cHJpdi0+ZXBoZW1lcmFsUGFnZUNvdW50
ICYmIGNvbnRleHQtPnByaXYtPmZhdmljb25EYXRhYmFzZSkKLSAgICAgICAgd2Via2l0RmF2aWNv
bkRhdGFiYXNlU2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChjb250ZXh0LT5wcml2LT5mYXZpY29u
RGF0YWJhc2UuZ2V0KCksIGZhbHNlKTsKLX0KLQogLyoqCiAgKiB3ZWJraXRfd2ViX2NvbnRleHRf
c2V0X2Zhdmljb25fZGF0YWJhc2VfZGlyZWN0b3J5OgogICogQGNvbnRleHQ6IGEgI1dlYktpdFdl
YkNvbnRleHQKQEAgLTkzNiwxMCArOTE1LDcgQEAgdm9pZCB3ZWJraXRfd2ViX2NvbnRleHRfc2V0
X2Zhdmljb25fZGF0YWJhc2VfZGlyZWN0b3J5KFdlYktpdFdlYkNvbnRleHQqIGNvbnRleHQKICAg
ICAgICAgIldlYnBhZ2VJY29ucy5kYiIsIG51bGxwdHIpKTsKIAogICAgIC8vIFNldHRpbmcgdGhl
IHBhdGggd2lsbCBjYXVzZSB0aGUgaWNvbiBkYXRhYmFzZSB0byBiZSBvcGVuZWQuCi0gICAgd2Vi
a2l0RmF2aWNvbkRhdGFiYXNlT3Blbihwcml2LT5mYXZpY29uRGF0YWJhc2UuZ2V0KCksIEZpbGVT
eXN0ZW06OnN0cmluZ0Zyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oZmF2aWNvbkRhdGFiYXNl
UGF0aC5nZXQoKSkpOwotCi0gICAgaWYgKHdlYmtpdF93ZWJfY29udGV4dF9pc19lcGhlbWVyYWwo
Y29udGV4dCkpCi0gICAgICAgIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldFByaXZhdGVCcm93c2lu
Z0VuYWJsZWQocHJpdi0+ZmF2aWNvbkRhdGFiYXNlLmdldCgpLCB0cnVlKTsKKyAgICB3ZWJraXRG
YXZpY29uRGF0YWJhc2VPcGVuKHByaXYtPmZhdmljb25EYXRhYmFzZS5nZXQoKSwgRmlsZVN5c3Rl
bTo6c3RyaW5nRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihmYXZpY29uRGF0YWJhc2VQYXRo
LmdldCgpKSwgd2Via2l0X3dlYl9jb250ZXh0X2lzX2VwaGVtZXJhbChjb250ZXh0KSk7CiB9CiAK
IC8qKgpAQCAtMTcyNywxMCArMTcwMyw2IEBAIGJvb2wgd2Via2l0V2ViQ29udGV4dElzTG9hZGlu
Z0N1c3RvbVByb3RvY29sKFdlYktpdFdlYkNvbnRleHQqIGNvbnRleHQsIHVpbnQ2NF90CiAKIHZv
aWQgd2Via2l0V2ViQ29udGV4dENyZWF0ZVBhZ2VGb3JXZWJWaWV3KFdlYktpdFdlYkNvbnRleHQq
IGNvbnRleHQsIFdlYktpdFdlYlZpZXcqIHdlYlZpZXcsIFdlYktpdFVzZXJDb250ZW50TWFuYWdl
ciogdXNlckNvbnRlbnRNYW5hZ2VyLCBXZWJLaXRXZWJWaWV3KiByZWxhdGVkVmlldykKIHsKLSAg
ICAvLyBGSVhNRTogaWNvbiBkYXRhYmFzZSBwcml2YXRlIG1vZGUgaXMgZ2xvYmFsLCBub3QgcGVy
IHBhZ2UsIHNvIHdoaWxlIHRoZXJlIGFyZQotICAgIC8vIHBhZ2VzIGluIHByaXZhdGUgbW9kZSB3
ZSBuZWVkIHRvIGVuYWJsZSB0aGUgcHJpdmF0ZSBtb2RlIGluIHRoZSBpY29uIGRhdGFiYXNlLgot
ICAgIHdlYmtpdFdlYkNvbnRleHRFbmFibGVJY29uRGF0YWJhc2VQcml2YXRlQnJvd3NpbmdJZk5l
ZWRlZChjb250ZXh0LCB3ZWJWaWV3KTsKLQogICAgIGF1dG8gcGFnZUNvbmZpZ3VyYXRpb24gPSBB
UEk6OlBhZ2VDb25maWd1cmF0aW9uOjpjcmVhdGUoKTsKICAgICBwYWdlQ29uZmlndXJhdGlvbi0+
c2V0UHJvY2Vzc1Bvb2woY29udGV4dC0+cHJpdi0+cHJvY2Vzc1Bvb2wuZ2V0KCkpOwogICAgIHBh
Z2VDb25maWd1cmF0aW9uLT5zZXRQcmVmZXJlbmNlcyh3ZWJraXRTZXR0aW5nc0dldFByZWZlcmVu
Y2VzKHdlYmtpdF93ZWJfdmlld19nZXRfc2V0dGluZ3Mod2ViVmlldykpKTsKQEAgLTE3NDksNyAr
MTcyMSw2IEBAIHZvaWQgd2Via2l0V2ViQ29udGV4dENyZWF0ZVBhZ2VGb3JXZWJWaWV3KFdlYktp
dFdlYkNvbnRleHQqIGNvbnRleHQsIFdlYktpdFdlYlZpCiAKIHZvaWQgd2Via2l0V2ViQ29udGV4
dFdlYlZpZXdEZXN0cm95ZWQoV2ViS2l0V2ViQ29udGV4dCogY29udGV4dCwgV2ViS2l0V2ViVmll
dyogd2ViVmlldykKIHsKLSAgICB3ZWJraXRXZWJDb250ZXh0RGlzYWJsZUljb25EYXRhYmFzZVBy
aXZhdGVCcm93c2luZ0lmTmVlZGVkKGNvbnRleHQsIHdlYlZpZXcpOwogICAgIGNvbnRleHQtPnBy
aXYtPndlYlZpZXdzLnJlbW92ZSh3ZWJraXRfd2ViX3ZpZXdfZ2V0X3BhZ2VfaWQod2ViVmlldykp
OwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJL
aXRXZWJWaWV3LmNwcCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdl
YlZpZXcuY3BwCmluZGV4IDFlNWViZTczYjc0Li45YTAxNDk0YjIyZiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViVmlldy5jcHAKKysrIGIvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViVmlldy5jcHAKQEAgLTU1OSw3
ICs1NTksNyBAQCBzdGF0aWMgdm9pZCB3ZWJraXRXZWJWaWV3UmVxdWVzdEZhdmljb24oV2ViS2l0
V2ViVmlldyogd2ViVmlldykKICAgICBXZWJLaXRXZWJWaWV3UHJpdmF0ZSogcHJpdiA9IHdlYlZp
ZXctPnByaXY7CiAgICAgcHJpdi0+ZmF2aWNvbkNhbmNlbGxhYmxlID0gYWRvcHRHUmVmKGdfY2Fu
Y2VsbGFibGVfbmV3KCkpOwogICAgIFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UgPSB3
ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2UocHJpdi0+Y29udGV4dC5nZXQo
KSk7Ci0gICAgd2Via2l0X2Zhdmljb25fZGF0YWJhc2VfZ2V0X2Zhdmljb24oZGF0YWJhc2UsIHBy
aXYtPmFjdGl2ZVVSSS5kYXRhKCksIHByaXYtPmZhdmljb25DYW5jZWxsYWJsZS5nZXQoKSwgZ290
RmF2aWNvbkNhbGxiYWNrLCB3ZWJWaWV3KTsKKyAgICB3ZWJraXRGYXZpY29uRGF0YWJhc2VHZXRG
YXZpY29uSW50ZXJuYWwoZGF0YWJhc2UsIHByaXYtPmFjdGl2ZVVSSS5kYXRhKCksIHByaXYtPmlz
RXBoZW1lcmFsLCBwcml2LT5mYXZpY29uQ2FuY2VsbGFibGUuZ2V0KCksIGdvdEZhdmljb25DYWxs
YmFjaywgd2ViVmlldyk7CiB9CiAKIHN0YXRpYyB2b2lkIHdlYmtpdFdlYlZpZXdVcGRhdGVGYXZp
Y29uVVJJKFdlYktpdFdlYlZpZXcqIHdlYlZpZXcsIGNvbnN0IGNoYXIqIGZhdmljb25VUkkpCkBA
IC0yMTY5LDE0ICsyMTY5LDE5IEBAIHZvaWQgd2Via2l0V2ViVmlld0xvYWRGYWlsZWRXaXRoVExT
RXJyb3JzKFdlYktpdFdlYlZpZXcqIHdlYlZpZXcsIGNvbnN0IGNoYXIqIGZhCiAjaWYgUExBVEZP
Uk0oR1RLKQogdm9pZCB3ZWJraXRXZWJWaWV3R2V0TG9hZERlY2lzaW9uRm9ySWNvbihXZWJLaXRX
ZWJWaWV3KiB3ZWJWaWV3LCBjb25zdCBMaW5rSWNvbiYgaWNvbiwgRnVuY3Rpb248dm9pZChib29s
KT4mJiBjb21wbGV0aW9uSGFuZGxlcikKIHsKKyAgICAvLyBXZSBvbmx5IHN1cHBvcnQgZmF2aWNv
bnMgZm9yIG5vdy4KKyAgICBpZiAoaWNvbi50eXBlICE9IExpbmtJY29uVHlwZTo6RmF2aWNvbikg
eworICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CiAgICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSA9IHdlYmtpdF93ZWJfY29u
dGV4dF9nZXRfZmF2aWNvbl9kYXRhYmFzZSh3ZWJWaWV3LT5wcml2LT5jb250ZXh0LmdldCgpKTsK
LSAgICB3ZWJraXRGYXZpY29uRGF0YWJhc2VHZXRMb2FkRGVjaXNpb25Gb3JJY29uKGRhdGFiYXNl
LCBpY29uLCBnZXRQYWdlKHdlYlZpZXcpLnBhZ2VMb2FkU3RhdGUoKS5hY3RpdmVVUkwoKSwgV1RG
TW92ZShjb21wbGV0aW9uSGFuZGxlcikpOworICAgIHdlYmtpdEZhdmljb25EYXRhYmFzZUdldExv
YWREZWNpc2lvbkZvckljb24oZGF0YWJhc2UsIGljb24sIGdldFBhZ2Uod2ViVmlldykucGFnZUxv
YWRTdGF0ZSgpLmFjdGl2ZVVSTCgpLCB3ZWJWaWV3LT5wcml2LT5pc0VwaGVtZXJhbCwgV1RGTW92
ZShjb21wbGV0aW9uSGFuZGxlcikpOwogfQogCiB2b2lkIHdlYmtpdFdlYlZpZXdTZXRJY29uKFdl
YktpdFdlYlZpZXcqIHdlYlZpZXcsIGNvbnN0IExpbmtJY29uJiBpY29uLCBBUEk6OkRhdGEmIGlj
b25EYXRhKQogewogICAgIFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UgPSB3ZWJraXRf
d2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2Uod2ViVmlldy0+cHJpdi0+Y29udGV4dC5n
ZXQoKSk7Ci0gICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBhZ2VVUkwoZGF0YWJh
c2UsIGljb24sIGljb25EYXRhLCBnZXRQYWdlKHdlYlZpZXcpLnBhZ2VMb2FkU3RhdGUoKS5hY3Rp
dmVVUkwoKSk7CisgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBhZ2VVUkwoZGF0
YWJhc2UsIGljb24sIGljb25EYXRhLCBnZXRQYWdlKHdlYlZpZXcpLnBhZ2VMb2FkU3RhdGUoKS5h
Y3RpdmVVUkwoKSwgd2ViVmlldy0+cHJpdi0+aXNFcGhlbWVyYWwpOwogfQogI2VuZGlmCiAKZGlm
ZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCAzZmYxYWQz
ODRiMi4uMmM4MTZiMDcwODUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0NoYW5nZUxvZworKysgYi9Ub29s
cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMiBAQAorMjAxOS0wOS0yNiAgQ2FybG9zIEdhcmNpYSBD
YW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS10gSWNvbkRhdGFiYXNl
IGlzIG5vdCB0aHJlYWQtc2FmZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MjAxMzAzCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgUmV3cml0ZSB0aGUgV2ViS2l0RmF2aWNvbkRhdGFiYXNlIHRlc3RzLCBzcGxp
dHRpbmcgdGVzdHMgY2FzZXMgYWdhaW4gYW5kIG1ha2luZyB0aGVtIGluZGVwZW5kZW50IHRvIGVh
Y2ggb3RoZXIuCisKKyAgICAgICAgKiBUZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdEdMaWIvVGVz
dFdlYktpdEZhdmljb25EYXRhYmFzZS5jcHA6CisgICAgICAgICh0ZXN0RmF2aWNvbkRhdGFiYXNl
SW5pdGlhbGl6YXRpb24pOgorICAgICAgICAodGVzdEZhdmljb25EYXRhYmFzZUdldEZhdmljb24p
OgorICAgICAgICAoZXBoZW1lcmFsVmlld0Zhdmljb25DaGFuZ2VkKToKKyAgICAgICAgKHRlc3RG
YXZpY29uRGF0YWJhc2VFcGhlbWVyYWwpOgorICAgICAgICAodGVzdEZhdmljb25EYXRhYmFzZUNs
ZWFyKToKKyAgICAgICAgKGJlZm9yZUFsbCk6CisgICAgICAgIChhZnRlckFsbCk6CisgICAgICAg
ICogVGVzdFdlYktpdEFQSS9nbGliL1Rlc3RFeHBlY3RhdGlvbnMuanNvbjogVGVzdFdlYktpdEZh
dmljb25EYXRhYmFzZSBzaG91bHMgYWx3YXlzIHBhc3Mgbm93LgorCiAyMDE5LTA5LTIzICBaYW4g
RG9iZXJzZWsgIDx6ZG9iZXJzZWtAaWdhbGlhLmNvbT4KIAogICAgICAgICBydW4td2ViLXBsYXRm
b3JtLXRlc3RzOiByZW1vdmUgc3VwcG9ydCBmb3IgaW4tcmVwb3NpdG9yeSBtYW5pZmVzdCwgZXhw
ZWN0YXRpb24gbWFuYWdlbWVudApkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0
cy9XZWJLaXRHTGliL1Rlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwIGIvVG9vbHMvVGVzdFdl
YktpdEFQSS9UZXN0cy9XZWJLaXRHTGliL1Rlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwCmlu
ZGV4IDYzY2FjMDVjOGQ5Li5mNjNjODBmZDBhNCAxMDA2NDQKLS0tIGEvVG9vbHMvVGVzdFdlYktp
dEFQSS9UZXN0cy9XZWJLaXRHTGliL1Rlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwCisrKyBi
L1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xpYi9UZXN0V2ViS2l0RmF2aWNvbkRh
dGFiYXNlLmNwcApAQCAtMTksNDAgKzE5LDQzIEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAor
I2lmIFBMQVRGT1JNKEdUSykKKwogI2luY2x1ZGUgIldlYktpdFRlc3RTZXJ2ZXIuaCIKICNpbmNs
dWRlICJXZWJWaWV3VGVzdC5oIgogI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CiAjaW5jbHVkZSA8
bGlic291cC9zb3VwLmg+CiAjaW5jbHVkZSA8d3RmL2dsaWIvR1VuaXF1ZVB0ci5oPgogCi0jaWYg
UExBVEZPUk0oR1RLKQogc3RhdGljIFdlYktpdFRlc3RTZXJ2ZXIqIGtTZXJ2ZXI7Ci0jZW5kaWYK
IAogY2xhc3MgRmF2aWNvbkRhdGFiYXNlVGVzdDogcHVibGljIFdlYlZpZXdUZXN0IHsKIHB1Ymxp
YzoKICAgICBNQUtFX0dMSUJfVEVTVF9GSVhUVVJFKEZhdmljb25EYXRhYmFzZVRlc3QpOwogCiAg
ICAgRmF2aWNvbkRhdGFiYXNlVGVzdCgpCisgICAgICAgIDogbV9kYXRhYmFzZSh3ZWJraXRfd2Vi
X2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2UobV93ZWJDb250ZXh0LmdldCgpKSkKICAgICB7
Ci0jaWYgUExBVEZPUk0oR1RLKQotICAgICAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFi
YXNlID0gd2Via2l0X3dlYl9jb250ZXh0X2dldF9mYXZpY29uX2RhdGFiYXNlKG1fd2ViQ29udGV4
dC5nZXQoKSk7Ci0gICAgICAgIGdfc2lnbmFsX2Nvbm5lY3QoZGF0YWJhc2UsICJmYXZpY29uLWNo
YW5nZWQiLCBHX0NBTExCQUNLKGZhdmljb25DaGFuZ2VkQ2FsbGJhY2spLCB0aGlzKTsKLSNlbmRp
ZgorICAgICAgICBnX2Fzc2VydF90cnVlKFdFQktJVF9JU19GQVZJQ09OX0RBVEFCQVNFKG1fZGF0
YWJhc2UpKTsKKyAgICAgICAgYXNzZXJ0T2JqZWN0SXNEZWxldGVkV2hlblRlc3RGaW5pc2hlcyhH
X09CSkVDVChtX2RhdGFiYXNlKSk7CisgICAgICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9kYXRhYmFz
ZSwgImZhdmljb24tY2hhbmdlZCIsIEdfQ0FMTEJBQ0soZmF2aWNvbkNoYW5nZWRDYWxsYmFjayks
IHRoaXMpOwogICAgIH0KIAogICAgIH5GYXZpY29uRGF0YWJhc2VUZXN0KCkKICAgICB7Ci0jaWYg
UExBVEZPUk0oR1RLKQogICAgICAgICBpZiAobV9mYXZpY29uKQogICAgICAgICAgICAgY2Fpcm9f
c3VyZmFjZV9kZXN0cm95KG1fZmF2aWNvbik7CiAKLSAgICAgICAgV2ViS2l0RmF2aWNvbkRhdGFi
YXNlKiBkYXRhYmFzZSA9IHdlYmtpdF93ZWJfY29udGV4dF9nZXRfZmF2aWNvbl9kYXRhYmFzZSht
X3dlYkNvbnRleHQuZ2V0KCkpOwotICAgICAgICBnX3NpZ25hbF9oYW5kbGVyc19kaXNjb25uZWN0
X21hdGNoZWQoZGF0YWJhc2UsIEdfU0lHTkFMX01BVENIX0RBVEEsIDAsIDAsIDAsIDAsIHRoaXMp
OwotI2VuZGlmCisgICAgICAgIGdfc2lnbmFsX2hhbmRsZXJzX2Rpc2Nvbm5lY3RfbWF0Y2hlZCht
X2RhdGFiYXNlLCBHX1NJR05BTF9NQVRDSF9EQVRBLCAwLCAwLCAwLCAwLCB0aGlzKTsKKyAgICB9
CisKKyAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogZGlyZWN0b3J5KQorICAgIHsKKyAgICAgICAg
R1VuaXF1ZVB0cjxjaGFyPiBkYXRhYmFzZURpcmVjdG9yeShnX2J1aWxkX2ZpbGVuYW1lKGRhdGFE
aXJlY3RvcnkoKSwgZGlyZWN0b3J5LCBudWxscHRyKSk7CisgICAgICAgIHdlYmtpdF93ZWJfY29u
dGV4dF9zZXRfZmF2aWNvbl9kYXRhYmFzZV9kaXJlY3RvcnkobV93ZWJDb250ZXh0LmdldCgpLCBk
YXRhYmFzZURpcmVjdG9yeS5nZXQoKSk7CisgICAgICAgIGdfYXNzZXJ0X2NtcHN0cihkYXRhYmFz
ZURpcmVjdG9yeS5nZXQoKSwgPT0sIHdlYmtpdF93ZWJfY29udGV4dF9nZXRfZmF2aWNvbl9kYXRh
YmFzZV9kaXJlY3RvcnkobV93ZWJDb250ZXh0LmdldCgpKSk7CiAgICAgfQogCi0jaWYgUExBVEZP
Uk0oR1RLKQogICAgIHN0YXRpYyB2b2lkIGZhdmljb25DaGFuZ2VkQ2FsbGJhY2soV2ViS2l0RmF2
aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgY2hhciogcGFnZVVSSSwgY29uc3QgY2hhciog
ZmF2aWNvblVSSSwgRmF2aWNvbkRhdGFiYXNlVGVzdCogdGVzdCkKICAgICB7CiAgICAgICAgIGlm
ICghZ19zdHJjbXAwKHdlYmtpdF93ZWJfdmlld19nZXRfdXJpKHRlc3QtPm1fd2ViVmlldyksIHBh
Z2VVUkkpKSB7CkBAIC02MiwxOSArNjUsMjkgQEAgcHVibGljOgogICAgICAgICB9CiAgICAgfQog
Ci0gICAgc3RhdGljIHZvaWQgdmlld0Zhdmljb25DaGFuZ2VkQ2FsbGJhY2soV2ViS2l0V2ViVmll
dyogd2ViVmlldywgR1BhcmFtU3BlYyogcHNwZWMsIGdwb2ludGVyIGRhdGEpCisgICAgc3RhdGlj
IHZvaWQgdmlld0Zhdmljb25DaGFuZ2VkQ2FsbGJhY2soV2ViS2l0V2ViVmlldyogd2ViVmlldywg
R1BhcmFtU3BlYyogcHNwZWMsIEZhdmljb25EYXRhYmFzZVRlc3QqIHRlc3QpCiAgICAgewotICAg
ICAgICBGYXZpY29uRGF0YWJhc2VUZXN0KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8RmF2aWNvbkRhdGFi
YXNlVGVzdCo+KGRhdGEpOwogICAgICAgICBnX2Fzc2VydF90cnVlKHRlc3QtPm1fd2ViVmlldyA9
PSB3ZWJWaWV3KTsKICAgICAgICAgdGVzdC0+bV9mYXZpY29uTm90aWZpY2F0aW9uUmVjZWl2ZWQg
PSB0cnVlOwotICAgICAgICB0ZXN0LT5xdWl0TWFpbkxvb3AoKTsKKyAgICAgICAgaWYgKHRlc3Qt
Pm1fbG9hZEZpbmlzaGVkKQorICAgICAgICAgICAgdGVzdC0+cXVpdE1haW5Mb29wKCk7CisgICAg
fQorCisgICAgc3RhdGljIHZvaWQgdmlld0xvYWRDaGFuZ2VkQ2FsbGJhY2soV2ViS2l0V2ViVmll
dyogd2ViVmlldywgV2ViS2l0TG9hZEV2ZW50IGxvYWRFdmVudCwgRmF2aWNvbkRhdGFiYXNlVGVz
dCogdGVzdCkKKyAgICB7CisgICAgICAgIGdfYXNzZXJ0X3RydWUodGVzdC0+bV93ZWJWaWV3ID09
IHdlYlZpZXcpOworICAgICAgICBpZiAobG9hZEV2ZW50ICE9IFdFQktJVF9MT0FEX0ZJTklTSEVE
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRlc3QtPm1fbG9hZEZpbmlzaGVkID0g
dHJ1ZTsKKyAgICAgICAgaWYgKHRlc3QtPm1fZmF2aWNvbk5vdGlmaWNhdGlvblJlY2VpdmVkKQor
ICAgICAgICAgICAgdGVzdC0+cXVpdE1haW5Mb29wKCk7CiAgICAgfQogCiAgICAgc3RhdGljIHZv
aWQgZ2V0RmF2aWNvbkNhbGxiYWNrKEdPYmplY3QqIHNvdXJjZU9iamVjdCwgR0FzeW5jUmVzdWx0
KiByZXN1bHQsIHZvaWQqIGRhdGEpCiAgICAgewogICAgICAgICBGYXZpY29uRGF0YWJhc2VUZXN0
KiB0ZXN0ID0gc3RhdGljX2Nhc3Q8RmF2aWNvbkRhdGFiYXNlVGVzdCo+KGRhdGEpOwotICAgICAg
ICBXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFiYXNlID0gd2Via2l0X3dlYl9jb250ZXh0X2dl
dF9mYXZpY29uX2RhdGFiYXNlKHRlc3QtPm1fd2ViQ29udGV4dC5nZXQoKSk7Ci0gICAgICAgIHRl
c3QtPm1fZmF2aWNvbiA9IHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uX2Zpbmlz
aChkYXRhYmFzZSwgcmVzdWx0LCAmdGVzdC0+bV9lcnJvci5vdXRQdHIoKSk7CisgICAgICAgIHRl
c3QtPm1fZmF2aWNvbiA9IHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uX2Zpbmlz
aCh0ZXN0LT5tX2RhdGFiYXNlLCByZXN1bHQsICZ0ZXN0LT5tX2Vycm9yLm91dFB0cigpKTsKICAg
ICAgICAgdGVzdC0+cXVpdE1haW5Mb29wKCk7CiAgICAgfQogCkBAIC04NiwxNiArOTksMjUgQEAg
cHVibGljOgogICAgICAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QobV93ZWJWaWV3LCBo
YW5kbGVySUQpOwogICAgIH0KIAorICAgIHZvaWQgd2FpdFVudGlsTG9hZEZpbmlzaGVkQW5kRmF2
aWNvbkNoYW5nZWQoKQorICAgIHsKKyAgICAgICAgbV9mYXZpY29uTm90aWZpY2F0aW9uUmVjZWl2
ZWQgPSBmYWxzZTsKKyAgICAgICAgbV9sb2FkRmluaXNoZWQgPSBmYWxzZTsKKyAgICAgICAgdW5z
aWduZWQgbG9uZyBmYXZpY29uQ2hhbmdlZElEID0gZ19zaWduYWxfY29ubmVjdChtX3dlYlZpZXcs
ICJub3RpZnk6OmZhdmljb24iLCBHX0NBTExCQUNLKHZpZXdGYXZpY29uQ2hhbmdlZENhbGxiYWNr
KSwgdGhpcyk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9hZENoYW5nZWRJRCA9IGdfc2lnbmFs
X2Nvbm5lY3QobV93ZWJWaWV3LCAibG9hZC1jaGFuZ2VkIiwgR19DQUxMQkFDSyh2aWV3TG9hZENo
YW5nZWRDYWxsYmFjayksIHRoaXMpOworICAgICAgICBnX21haW5fbG9vcF9ydW4obV9tYWluTG9v
cCk7CisgICAgICAgIGdfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdChtX3dlYlZpZXcsIGZhdmlj
b25DaGFuZ2VkSUQpOworICAgICAgICBnX3NpZ25hbF9oYW5kbGVyX2Rpc2Nvbm5lY3QobV93ZWJW
aWV3LCBsb2FkQ2hhbmdlZElEKTsKKyAgICB9CisKICAgICB2b2lkIGdldEZhdmljb25Gb3JQYWdl
VVJJQW5kV2FpdFVudGlsUmVhZHkoY29uc3QgY2hhciogcGFnZVVSSSkKICAgICB7CiAgICAgICAg
IGlmIChtX2Zhdmljb24pIHsKICAgICAgICAgICAgIGNhaXJvX3N1cmZhY2VfZGVzdHJveShtX2Zh
dmljb24pOwotICAgICAgICAgICAgbV9mYXZpY29uID0gMDsKKyAgICAgICAgICAgIG1fZmF2aWNv
biA9IG51bGxwdHI7CiAgICAgICAgIH0KIAotICAgICAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2Uq
IGRhdGFiYXNlID0gd2Via2l0X3dlYl9jb250ZXh0X2dldF9mYXZpY29uX2RhdGFiYXNlKG1fd2Vi
Q29udGV4dC5nZXQoKSk7Ci0gICAgICAgIHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZp
Y29uKGRhdGFiYXNlLCBwYWdlVVJJLCAwLCBnZXRGYXZpY29uQ2FsbGJhY2ssIHRoaXMpOwotCisg
ICAgICAgIHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uKG1fZGF0YWJhc2UsIHBh
Z2VVUkksIDAsIGdldEZhdmljb25DYWxsYmFjaywgdGhpcyk7CiAgICAgICAgIGdfbWFpbl9sb29w
X3J1bihtX21haW5Mb29wKTsKICAgICB9CiAKQEAgLTEwOCwxNiArMTMwLDE1IEBAIHB1YmxpYzoK
ICAgICAgICAgbV93YWl0aW5nRm9yRmF2aWNvblVSSSA9IGZhbHNlOwogICAgIH0KIAorICAgIFdl
YktpdEZhdmljb25EYXRhYmFzZSogbV9kYXRhYmFzZSB7IG51bGxwdHIgfTsKICAgICBjYWlyb19z
dXJmYWNlX3QqIG1fZmF2aWNvbiB7IG51bGxwdHIgfTsKLQogICAgIENTdHJpbmcgbV9mYXZpY29u
VVJJOwogICAgIEdVbmlxdWVPdXRQdHI8R0Vycm9yPiBtX2Vycm9yOwogICAgIGJvb2wgbV9mYXZp
Y29uTm90aWZpY2F0aW9uUmVjZWl2ZWQgeyBmYWxzZSB9OworICAgIGJvb2wgbV9sb2FkRmluaXNo
ZWQgeyBmYWxzZSB9OwogICAgIGJvb2wgbV93YWl0aW5nRm9yRmF2aWNvblVSSSB7IGZhbHNlIH07
Ci0jZW5kaWYKIH07CiAKLSNpZiBQTEFURk9STShHVEspCiBzdGF0aWMgdm9pZAogc2VydmVyQ2Fs
bGJhY2soU291cFNlcnZlciogc2VydmVyLCBTb3VwTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgY2hh
ciogcGF0aCwgR0hhc2hUYWJsZSogcXVlcnksIFNvdXBDbGllbnRDb250ZXh0KiBjb250ZXh0LCB2
b2lkKiBkYXRhKQogewpAQCAtMTUwLDE2MyArMTcxLDEzOSBAQCBzZXJ2ZXJDYWxsYmFjayhTb3Vw
U2VydmVyKiBzZXJ2ZXIsIFNvdXBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBjaGFyKiBwYXRoLCBH
SGFzaAogICAgIHNvdXBfbWVzc2FnZV9ib2R5X2NvbXBsZXRlKG1lc3NhZ2UtPnJlc3BvbnNlX2Jv
ZHkpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0Tm90SW5pdGlhbGl6ZWQoRmF2aWNvbkRhdGFiYXNl
VGVzdCogdGVzdCkKK3N0YXRpYyB2b2lkIHRlc3RGYXZpY29uRGF0YWJhc2VJbml0aWFsaXphdGlv
bihGYXZpY29uRGF0YWJhc2VUZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQogewotICAgIC8vIFRy
eSB0byByZXRyaWV2ZSBhIHZhbGlkIGZhdmljb24gZnJvbSBhIG5vdCBpbml0aWFsaXplZCBkYXRh
YmFzZS4KICAgICB0ZXN0LT5nZXRGYXZpY29uRm9yUGFnZVVSSUFuZFdhaXRVbnRpbFJlYWR5KGtT
ZXJ2ZXItPmdldFVSSUZvclBhdGgoIi9mb28iKS5kYXRhKCkpOwogICAgIGdfYXNzZXJ0X251bGwo
dGVzdC0+bV9mYXZpY29uKTsKLSAgICBnX2Fzc2VydF9ub25udWxsKHRlc3QtPm1fZXJyb3IpOwot
ICAgIGdfYXNzZXJ0X2NtcGludCh0ZXN0LT5tX2Vycm9yLT5jb2RlLCA9PSwgV0VCS0lUX0ZBVklD
T05fREFUQUJBU0VfRVJST1JfTk9UX0lOSVRJQUxJWkVEKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMg
dm9pZCB0ZXN0U2V0RGlyZWN0b3J5KEZhdmljb25EYXRhYmFzZVRlc3QqIHRlc3QpCi17Ci0gICAg
d2Via2l0X3dlYl9jb250ZXh0X3NldF9mYXZpY29uX2RhdGFiYXNlX2RpcmVjdG9yeSh0ZXN0LT5t
X3dlYkNvbnRleHQuZ2V0KCksIFRlc3Q6OmRhdGFEaXJlY3RvcnkoKSk7Ci0gICAgZ19hc3NlcnRf
Y21wc3RyKFRlc3Q6OmRhdGFEaXJlY3RvcnkoKSwgPT0sIHdlYmtpdF93ZWJfY29udGV4dF9nZXRf
ZmF2aWNvbl9kYXRhYmFzZV9kaXJlY3RvcnkodGVzdC0+bV93ZWJDb250ZXh0LmdldCgpKSk7Ci19
Ci0KLSNpZiBQTEFURk9STShHVEspCi1zdGF0aWMgdm9pZCB0ZXN0Q2xlYXJEYXRhYmFzZShGYXZp
Y29uRGF0YWJhc2VUZXN0KiB0ZXN0KQotewotICAgIFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0
YWJhc2UgPSB3ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2UodGVzdC0+bV93
ZWJDb250ZXh0LmdldCgpKTsKLSAgICB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9jbGVhcihkYXRh
YmFzZSk7CisgICAgZ19hc3NlcnRfZXJyb3IodGVzdC0+bV9lcnJvci5nZXQoKSwgV0VCS0lUX0ZB
VklDT05fREFUQUJBU0VfRVJST1IsIFdFQktJVF9GQVZJQ09OX0RBVEFCQVNFX0VSUk9SX05PVF9J
TklUSUFMSVpFRCk7CiAKLSAgICBHVW5pcXVlUHRyPGNoYXI+IGljb25VUkkod2Via2l0X2Zhdmlj
b25fZGF0YWJhc2VfZ2V0X2Zhdmljb25fdXJpKGRhdGFiYXNlLCBrU2VydmVyLT5nZXRVUklGb3JQ
YXRoKCIvZm9vIikuZGF0YSgpKSk7Ci0gICAgZ19hc3NlcnRfbnVsbChpY29uVVJJKTsKKyAgICB0
ZXN0LT5vcGVuKCJ0ZXN0RmF2aWNvbkRhdGFiYXNlSW5pdGlhbGl6YXRpb24iKTsKKyAgICBHVW5p
cXVlUHRyPGNoYXI+IGRhdGFiYXNlRmlsZShnX2J1aWxkX2ZpbGVuYW1lKHdlYmtpdF93ZWJfY29u
dGV4dF9nZXRfZmF2aWNvbl9kYXRhYmFzZV9kaXJlY3RvcnkodGVzdC0+bV93ZWJDb250ZXh0Lmdl
dCgpKSwgIldlYnBhZ2VJY29ucy5kYiIsIG51bGxwdHIpKTsKKyAgICBnX2Fzc2VydF90cnVlKGdf
ZmlsZV90ZXN0KGRhdGFiYXNlRmlsZS5nZXQoKSwgR19GSUxFX1RFU1RfSVNfUkVHVUxBUikpOwog
fQogCi1zdGF0aWMgdm9pZCBlcGhlbWVyYWxWaWV3TG9hZENoYW5nZWQoV2ViS2l0V2ViVmlldyog
d2ViVmlldywgV2ViS2l0TG9hZEV2ZW50IGxvYWRFdmVudCwgV2ViVmlld1Rlc3QqIHRlc3QpCitz
dGF0aWMgdm9pZCB0ZXN0RmF2aWNvbkRhdGFiYXNlR2V0RmF2aWNvbihGYXZpY29uRGF0YWJhc2VU
ZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQogewotICAgIGlmIChsb2FkRXZlbnQgIT0gV0VCS0lU
X0xPQURfRklOSVNIRUQpCi0gICAgICAgIHJldHVybjsKLSAgICBnX3NpZ25hbF9oYW5kbGVyc19k
aXNjb25uZWN0X2J5X2Z1bmMod2ViVmlldywgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZXBoZW1l
cmFsVmlld0xvYWRDaGFuZ2VkKSwgdGVzdCk7Ci0gICAgdGVzdC0+cXVpdE1haW5Mb29wKCk7Ci19
Ci0KLXN0YXRpYyB2b2lkIHRlc3RQcml2YXRlQnJvd3NpbmcoRmF2aWNvbkRhdGFiYXNlVGVzdCog
dGVzdCkKLXsKLSAgICBhdXRvIHdlYlZpZXcgPSBUZXN0OjphZG9wdFZpZXcoZ19vYmplY3RfbmV3
KFdFQktJVF9UWVBFX1dFQl9WSUVXLAotICAgICAgICAid2ViLWNvbnRleHQiLCB0ZXN0LT5tX3dl
YkNvbnRleHQuZ2V0KCksCi0gICAgICAgICJpcy1lcGhlbWVyYWwiLCBUUlVFLAotICAgICAgICBu
dWxscHRyKSk7Ci0gICAgZ19zaWduYWxfY29ubmVjdCh3ZWJWaWV3LmdldCgpLCAibG9hZC1jaGFu
Z2VkIiwgR19DQUxMQkFDSyhlcGhlbWVyYWxWaWV3TG9hZENoYW5nZWQpLCB0ZXN0KTsKLSAgICB3
ZWJraXRfd2ViX3ZpZXdfbG9hZF91cmkod2ViVmlldy5nZXQoKSwga1NlcnZlci0+Z2V0VVJJRm9y
UGF0aCgiL2ZvbyIpLmRhdGEoKSk7Ci0gICAgZ19tYWluX2xvb3BfcnVuKHRlc3QtPm1fbWFpbkxv
b3ApOwotCi0gICAgLy8gQW4gZXBoZW1lcmFsIHdlYiB2aWV3IHNob3VsZCBub3Qgd3JpdGUgdG8g
dGhlIGRhdGFiYXNlLgotICAgIHRlc3QtPmdldEZhdmljb25Gb3JQYWdlVVJJQW5kV2FpdFVudGls
UmVhZHkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSk7Ci0gICAgZ19hc3Nl
cnRfbnVsbCh0ZXN0LT5tX2Zhdmljb24pOwotICAgIGdfYXNzZXJ0X25vbm51bGwodGVzdC0+bV9l
cnJvcik7Ci19CisgICAgdGVzdC0+b3BlbigidGVzdEZhdmljb25EYXRhYmFzZUdldEZhdmljb24i
KTsKIAotc3RhdGljIHZvaWQgdGVzdEdldEZhdmljb24oRmF2aWNvbkRhdGFiYXNlVGVzdCogdGVz
dCkKLXsKLSAgICAvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIHBhZ2UgZmlyc3QgdG8gZW5zdXJlIHRo
ZSBpY29uIGRhdGEgd2lsbCBiZQotICAgIC8vIGluIHRoZSBkYXRhYmFzZSBpbiBjYXNlIHRoZXJl
J3MgYW4gYXNzb2NpYXRlZCBmYXZpY29uLgogICAgIHRlc3QtPmxvYWRVUkkoa1NlcnZlci0+Z2V0
VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSk7Ci0gICAgdGVzdC0+d2FpdFVudGlsRmF2aWNvbkNo
YW5nZWQoKTsKKyAgICB0ZXN0LT53YWl0VW50aWxMb2FkRmluaXNoZWRBbmRGYXZpY29uQ2hhbmdl
ZCgpOwogICAgIENTdHJpbmcgZmF2aWNvblVSSSA9IGtTZXJ2ZXItPmdldFVSSUZvclBhdGgoIi9p
Y29uL2Zhdmljb24uaWNvIik7CiAKLSAgICAvLyBDaGVjayB0aGUgQVBJIHJldHJpZXZpbmcgYSB2
YWxpZCBmYXZpY29uLgogICAgIHRlc3QtPmdldEZhdmljb25Gb3JQYWdlVVJJQW5kV2FpdFVudGls
UmVhZHkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSk7CiAgICAgZ19hc3Nl
cnRfbm9ubnVsbCh0ZXN0LT5tX2Zhdmljb24pOwotICAgIGdfYXNzZXJ0X2NtcHN0cih0ZXN0LT5t
X2Zhdmljb25VUkkuZGF0YSgpLCA9PSwgZmF2aWNvblVSSS5kYXRhKCkpOwotICAgIGdfYXNzZXJ0
X25vX2Vycm9yKHRlc3QtPm1fZXJyb3IuZ2V0KCkpOwotCi0gICAgLy8gQ2hlY2sgdGhhdCB3aWR0
aCBhbmQgaGVpZ2h0IG1hdGNoIHRob3NlIGZyb20gYmxhbmsuaWNvICgxNngxNiBmYXZpY29uKS4K
ICAgICBnX2Fzc2VydF9jbXBpbnQoY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfd2lkdGgodGVzdC0+
bV9mYXZpY29uKSwgPT0sIDE2KTsKICAgICBnX2Fzc2VydF9jbXBpbnQoY2Fpcm9faW1hZ2Vfc3Vy
ZmFjZV9nZXRfaGVpZ2h0KHRlc3QtPm1fZmF2aWNvbiksID09LCAxNik7CisgICAgZ19hc3NlcnRf
Y21wc3RyKHRlc3QtPm1fZmF2aWNvblVSSS5kYXRhKCksID09LCBmYXZpY29uVVJJLmRhdGEoKSk7
CisgICAgZ19hc3NlcnRfbm9fZXJyb3IodGVzdC0+bV9lcnJvci5nZXQoKSk7CiAKLSAgICAvLyBD
aGVjayB0aGF0IGFub3RoZXIgcGFnZSB3aXRoIHRoZSBzYW1lIGZhdmljb24gcmV0dXJuIHRoZSBz
YW1lIGljb24uCisgICAgLy8gQ2hlY2sgdGhhdCBhbm90aGVyIHBhZ2Ugd2l0aCB0aGUgc2FtZSBm
YXZpY29uIHJldHVybnMgdGhlIHNhbWUgaWNvbi4KICAgICBjYWlyb19zdXJmYWNlX3QqIGZhdmlj
b24gPSBjYWlyb19zdXJmYWNlX3JlZmVyZW5jZSh0ZXN0LT5tX2Zhdmljb24pOwogICAgIHRlc3Qt
PmxvYWRVUkkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL2JhciIpLmRhdGEoKSk7Ci0gICAgLy8g
SXQncyBhIG5ldyBwYWdlIGluIHRoZSBkYXRhYmFzZSwgc28gZmF2aWNvbiB3aWxsIGNoYW5nZSB0
d2ljZSwgZmlyc3QgdG8gcmVzZXQgaXQKLSAgICAvLyBhbmQgdGhlbiB3aGVuIHRoZSBpY29uIGlz
IGxvYWRlZC4KLSAgICB0ZXN0LT53YWl0VW50aWxGYXZpY29uQ2hhbmdlZCgpOworICAgIHRlc3Qt
PndhaXRVbnRpbExvYWRGaW5pc2hlZEFuZEZhdmljb25DaGFuZ2VkKCk7CisgICAgLy8gZmF2aWNv
biBjaGFuZ2VzIHR3aWNlLCBmaXJzdCB0byByZXNldCBpdCBhbmQgdGhlbiB3aGVuIHRoZSBuZXcg
aWNvbiBpcyBsb2FkZWQuCiAgICAgdGVzdC0+d2FpdFVudGlsRmF2aWNvbkNoYW5nZWQoKTsKICAg
ICB0ZXN0LT5nZXRGYXZpY29uRm9yUGFnZVVSSUFuZFdhaXRVbnRpbFJlYWR5KGtTZXJ2ZXItPmdl
dFVSSUZvclBhdGgoIi9iYXIiKS5kYXRhKCkpOwogICAgIGdfYXNzZXJ0X25vbm51bGwodGVzdC0+
bV9mYXZpY29uKTsKLSAgICBnX2Fzc2VydF9jbXBzdHIodGVzdC0+bV9mYXZpY29uVVJJLmRhdGEo
KSwgPT0sIGZhdmljb25VUkkuZGF0YSgpKTsKICAgICBnX2Fzc2VydF90cnVlKHRlc3QtPm1fZmF2
aWNvbiA9PSBmYXZpY29uKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIodGVzdC0+bV9mYXZpY29uVVJJ
LmRhdGEoKSwgPT0sIGZhdmljb25VUkkuZGF0YSgpKTsKICAgICBnX2Fzc2VydF9ub19lcnJvcih0
ZXN0LT5tX2Vycm9yLmdldCgpKTsKICAgICBjYWlyb19zdXJmYWNlX2Rlc3Ryb3koZmF2aWNvbik7
CiAKLSAgICAvLyBDaGVjayB0aGUgQVBJIHJldHJpZXZpbmcgYW4gaW52YWxpZCBmYXZpY29uLiBG
YXZpY29uIGNoYW5nZXMgb25seSBvbmNlIHRvIHJlc2V0IGl0LCB0aGVuCi0gICAgLy8gdGhlIGRh
dGFiYXNlIGlzIHVwZGF0ZWQgd2l0aCB0aGUgZmF2aWNvbiBVUkksIGJ1dCBub3Qgd2l0aCBmYXZp
Y29uIGltYWdlIGRhdGEuCisgICAgZmF2aWNvblVSSSA9IGtTZXJ2ZXItPmdldFVSSUZvclBhdGgo
Ii9mYXZpY29uLmljbyIpOwogICAgIHRlc3QtPmxvYWRVUkkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0
aCgiL25vZmF2aWNvbiIpLmRhdGEoKSk7Ci0gICAgdGVzdC0+d2FpdFVudGlsRmF2aWNvbkNoYW5n
ZWQoKTsKKyAgICB0ZXN0LT53YWl0VW50aWxMb2FkRmluaXNoZWRBbmRGYXZpY29uQ2hhbmdlZCgp
OwogICAgIHRlc3QtPndhaXRVbnRpbEZhdmljb25VUklDaGFuZ2VkKCk7Ci0KICAgICB0ZXN0LT5n
ZXRGYXZpY29uRm9yUGFnZVVSSUFuZFdhaXRVbnRpbFJlYWR5KGtTZXJ2ZXItPmdldFVSSUZvclBh
dGgoIi9ub2Zhdmljb24iKS5kYXRhKCkpOwogICAgIGdfYXNzZXJ0X251bGwodGVzdC0+bV9mYXZp
Y29uKTsKLSAgICBnX2Fzc2VydF9ub25udWxsKHRlc3QtPm1fZXJyb3IpOworICAgIGdfYXNzZXJ0
X2NtcHN0cih0ZXN0LT5tX2Zhdmljb25VUkkuZGF0YSgpLCA9PSwgZmF2aWNvblVSSS5kYXRhKCkp
OworICAgIGdfYXNzZXJ0X2Vycm9yKHRlc3QtPm1fZXJyb3IuZ2V0KCksIFdFQktJVF9GQVZJQ09O
X0RBVEFCQVNFX0VSUk9SLCBXRUJLSVRfRkFWSUNPTl9EQVRBQkFTRV9FUlJPUl9GQVZJQ09OX1VO
S05PV04pOworCisgICAgLy8gTG9hZGluZyBhbiBpY29uIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUg
ZGF0YWJhc2Ugc2hvdWxkIGVtaXQKKyAgICAvLyBXZWJLaXRXZWJWaWV3Ojpub3RpZnk6OmZhdmlj
b24sIGJ1dCBub3QgV2ViS2l0RmF2aWNvbkRhdGFiYXNlOjppY29uLWNoYW5nZWQuCisgICAgZ19h
c3NlcnRfbnVsbCh3ZWJraXRfd2ViX3ZpZXdfZ2V0X2Zhdmljb24odGVzdC0+bV93ZWJWaWV3KSk7
CisgICAgdGVzdC0+bV9mYXZpY29uVVJJID0geyB9OworICAgIHRlc3QtPmxvYWRVUkkoa1NlcnZl
ci0+Z2V0VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSk7CisgICAgdGVzdC0+d2FpdFVudGlsRmF2
aWNvbkNoYW5nZWQoKTsKKyAgICBnX2Fzc2VydF90cnVlKHRlc3QtPm1fZmF2aWNvblVSSS5pc051
bGwoKSk7CisgICAgZ19hc3NlcnRfbm9ubnVsbCh3ZWJraXRfd2ViX3ZpZXdfZ2V0X2Zhdmljb24o
dGVzdC0+bV93ZWJWaWV3KSk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RHZXRGYXZpY29uVVJJKEZh
dmljb25EYXRhYmFzZVRlc3QqIHRlc3QpCitzdGF0aWMgdm9pZCBlcGhlbWVyYWxWaWV3RmF2aWNv
bkNoYW5nZWQoV2ViS2l0V2ViVmlldyogd2ViVmlldywgR1BhcmFtU3BlYyosIFdlYlZpZXdUZXN0
KiB0ZXN0KQogewotICAgIFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UgPSB3ZWJraXRf
d2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2UodGVzdC0+bV93ZWJDb250ZXh0LmdldCgp
KTsKLQotICAgIENTdHJpbmcgYmFzZVVSSSA9IGtTZXJ2ZXItPmdldFVSSUZvclBhdGgoIi9mb28i
KTsKLSAgICBHVW5pcXVlUHRyPGNoYXI+IGljb25VUkkod2Via2l0X2Zhdmljb25fZGF0YWJhc2Vf
Z2V0X2Zhdmljb25fdXJpKGRhdGFiYXNlLCBiYXNlVVJJLmRhdGEoKSkpOwotICAgIEFTU0VSVF9D
TVBfQ1NUUklORyhpY29uVVJJLmdldCgpLCA9PSwga1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL2lj
b24vZmF2aWNvbi5pY28iKSk7CisgICAgZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9ieV9m
dW5jKHdlYlZpZXcsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGVwaGVtZXJhbFZpZXdGYXZpY29u
Q2hhbmdlZCksIHRlc3QpOworICAgIHRlc3QtPnF1aXRNYWluTG9vcCgpOwogfQogCi1zdGF0aWMg
dm9pZCB0ZXN0V2ViVmlld0Zhdmljb24oRmF2aWNvbkRhdGFiYXNlVGVzdCogdGVzdCkKK3N0YXRp
YyB2b2lkIHRlc3RGYXZpY29uRGF0YWJhc2VFcGhlbWVyYWwoRmF2aWNvbkRhdGFiYXNlVGVzdCog
dGVzdCwgZ2NvbnN0cG9pbnRlcikKIHsKLSAgICB0ZXN0LT5tX2Zhdmljb25VUkkgPSBDU3RyaW5n
KCk7Ci0KLSAgICBjYWlyb19zdXJmYWNlX3QqIGljb25Gcm9tV2ViVmlldyA9IHdlYmtpdF93ZWJf
dmlld19nZXRfZmF2aWNvbih0ZXN0LT5tX3dlYlZpZXcpOwotICAgIGdfYXNzZXJ0X251bGwoaWNv
bkZyb21XZWJWaWV3KTsKKyAgICAvLyBJZiB0aGUgY29udGV4dCBpcyBlcGhlbWVyYWwsIHRoZSBk
YXRhYmFzZSBpcyBub3QgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgIEdSZWZQdHI8
V2ViS2l0V2ViQ29udGV4dD4gZXBoZW1lcmFsQ29udGV4dCA9IGFkb3B0R1JlZih3ZWJraXRfd2Vi
X2NvbnRleHRfbmV3X2VwaGVtZXJhbCgpKTsKKyAgICBHVW5pcXVlUHRyPGNoYXI+IGRhdGFiYXNl
RGlyZWN0b3J5KGdfYnVpbGRfZmlsZW5hbWUoVGVzdDo6ZGF0YURpcmVjdG9yeSgpLCAidGVzdEZh
dmljb25EYXRhYmFzZUVwaGVtZXJhbCIsIG51bGxwdHIpKTsKKyAgICB3ZWJraXRfd2ViX2NvbnRl
eHRfc2V0X2Zhdmljb25fZGF0YWJhc2VfZGlyZWN0b3J5KGVwaGVtZXJhbENvbnRleHQuZ2V0KCks
IGRhdGFiYXNlRGlyZWN0b3J5LmdldCgpKTsKKyAgICBnX2Fzc2VydF9jbXBzdHIoZGF0YWJhc2VE
aXJlY3RvcnkuZ2V0KCksID09LCB3ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJh
c2VfZGlyZWN0b3J5KGVwaGVtZXJhbENvbnRleHQuZ2V0KCkpKTsKKyAgICBHVW5pcXVlUHRyPGNo
YXI+IGRhdGFiYXNlRmlsZShnX2J1aWxkX2ZpbGVuYW1lKGRhdGFiYXNlRGlyZWN0b3J5LmdldCgp
LCAiV2VicGFnZUljb25zLmRiIiwgbnVsbHB0cikpOworICAgIGdfYXNzZXJ0X2ZhbHNlKGdfZmls
ZV90ZXN0KGRhdGFiYXNlRmlsZS5nZXQoKSwgR19GSUxFX1RFU1RfRVhJU1RTKSk7CisgICAgZXBo
ZW1lcmFsQ29udGV4dCA9IG51bGxwdHI7CisKKyAgICB0ZXN0LT5vcGVuKCJ0ZXN0RmF2aWNvbkRh
dGFiYXNlRXBoZW1lcmFsIik7CisgICAgZ19hc3NlcnRfdHJ1ZShnX2ZpbGVfdGVzdChkYXRhYmFz
ZUZpbGUuZ2V0KCksIEdfRklMRV9URVNUX0VYSVNUUykpOwogCiAgICAgdGVzdC0+bG9hZFVSSShr
U2VydmVyLT5nZXRVUklGb3JQYXRoKCIvZm9vIikuZGF0YSgpKTsKLSAgICB0ZXN0LT53YWl0VW50
aWxGYXZpY29uQ2hhbmdlZCgpOwotICAgIGdfYXNzZXJ0X3RydWUodGVzdC0+bV9mYXZpY29uTm90
aWZpY2F0aW9uUmVjZWl2ZWQpOwotICAgIC8vIFRoZSBpY29uIGlzIGtub3duIGFuZCBoYXNuJ3Qg
Y2hhbmdlZCBpbiB0aGUgZGF0YWJhc2UsIHNvIG5vdGlmeTo6ZmF2aWNvbiBpcyBlbWl0dGVkCi0g
ICAgLy8gYnV0IFdlYktpdEZhdmljb25EYXRhYmFzZTo6aWNvbi1jaGFuZ2VkIGlzbid0LgotICAg
IGdfYXNzZXJ0X3RydWUodGVzdC0+bV9mYXZpY29uVVJJLmlzTnVsbCgpKTsKKyAgICB0ZXN0LT53
YWl0VW50aWxMb2FkRmluaXNoZWRBbmRGYXZpY29uQ2hhbmdlZCgpOworCisgICAgLy8gQW4gZXBo
ZW1lcmFsIHdlYiB2aWV3IGRvZXNuJ3Qgd3JpdGUgdG8gdGhlIGRhdGFiYXNlLgorICAgIGF1dG8g
d2ViVmlldyA9IFRlc3Q6OmFkb3B0VmlldyhnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfV0VCX1ZJ
RVcsCisgICAgICAgICJ3ZWItY29udGV4dCIsIHRlc3QtPm1fd2ViQ29udGV4dC5nZXQoKSwgImlz
LWVwaGVtZXJhbCIsIFRSVUUsIG51bGxwdHIpKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KHdlYlZp
ZXcuZ2V0KCksICJub3RpZnk6OmZhdmljb24iLCBHX0NBTExCQUNLKGVwaGVtZXJhbFZpZXdGYXZp
Y29uQ2hhbmdlZCksIHRlc3QpOworICAgIHdlYmtpdF93ZWJfdmlld19sb2FkX3VyaSh3ZWJWaWV3
LmdldCgpLCBrU2VydmVyLT5nZXRVUklGb3JQYXRoKCIvYmFyIikuZGF0YSgpKTsKKyAgICBnX21h
aW5fbG9vcF9ydW4odGVzdC0+bV9tYWluTG9vcCk7CisKKyAgICAvLyBXZSBnZXQgYSBmYXZpY29u
LCBidXQgaXQncyBvbmx5IGluIGRhdGFiYXNlIG1lbW9yeSBjYWNoZS4KKyAgICBnX2Fzc2VydF9u
b25udWxsKHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uX3VyaSh0ZXN0LT5tX2Rh
dGFiYXNlLCBrU2VydmVyLT5nZXRVUklGb3JQYXRoKCIvYmFyIikuZGF0YSgpKSk7CisKKyAgICAv
LyBJZiB0aGUgZGF0YWJhc2UgZXhpc3RzLCBpdCdzIHVzZWQgaW4gcmVhZCBvbmx5IG1vZGUgZm9y
IGVwZWhlcmFsIGNvbnRleHRzLgorICAgIGVwaGVtZXJhbENvbnRleHQgPSBhZG9wdEdSZWYod2Vi
a2l0X3dlYl9jb250ZXh0X25ld19lcGhlbWVyYWwoKSk7CisgICAgd2Via2l0X3dlYl9jb250ZXh0
X3NldF9mYXZpY29uX2RhdGFiYXNlX2RpcmVjdG9yeShlcGhlbWVyYWxDb250ZXh0LmdldCgpLCBk
YXRhYmFzZURpcmVjdG9yeS5nZXQoKSk7CisgICAgYXV0byogZXBoZW1lcmFsRGF0YWJhc2UgPSB3
ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2UoZXBoZW1lcmFsQ29udGV4dC5n
ZXQoKSk7CisgICAgZ19hc3NlcnRfbm9ubnVsbCh3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRf
ZmF2aWNvbl91cmkoZXBoZW1lcmFsRGF0YWJhc2UsIGtTZXJ2ZXItPmdldFVSSUZvclBhdGgoIi9m
b28iKS5kYXRhKCkpKTsKIAotICAgIGljb25Gcm9tV2ViVmlldyA9IHdlYmtpdF93ZWJfdmlld19n
ZXRfZmF2aWNvbih0ZXN0LT5tX3dlYlZpZXcpOwotICAgIGdfYXNzZXJ0X25vbm51bGwoaWNvbkZy
b21XZWJWaWV3KTsKLSAgICBnX2Fzc2VydF9jbXB1aW50KGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0
X3dpZHRoKGljb25Gcm9tV2ViVmlldyksID09LCAxNik7Ci0gICAgZ19hc3NlcnRfY21wdWludChj
YWlyb19pbWFnZV9zdXJmYWNlX2dldF9oZWlnaHQoaWNvbkZyb21XZWJWaWV3KSwgPT0sIDE2KTsK
KyAgICAvLyBQYWdlIFVSTCBsb2FkZWQgaW4gZXBoZW1lcmFsIHdlYiB2aWV3IGlzIG5vdCBpbiB0
aGUgZGF0YWJhc2UuCisgICAgZ19hc3NlcnRfbnVsbCh3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9n
ZXRfZmF2aWNvbl91cmkoZXBoZW1lcmFsRGF0YWJhc2UsIGtTZXJ2ZXItPmdldFVSSUZvclBhdGgo
Ii9iYXIiKS5kYXRhKCkpKTsKKyAgICBlcGhlbWVyYWxDb250ZXh0ID0gbnVsbHB0cjsKIH0KLSNl
bmRpZgogCi1zdGF0aWMgdm9pZCB0ZXN0RmF2aWNvbkRhdGFiYXNlKEZhdmljb25EYXRhYmFzZVRl
c3QqIHRlc3QsIGdjb25zdHBvaW50ZXIpCit2b2lkIHRlc3RGYXZpY29uRGF0YWJhc2VDbGVhcihG
YXZpY29uRGF0YWJhc2VUZXN0KiB0ZXN0LCBnY29uc3Rwb2ludGVyKQogewotICAgIC8vIFRoZXNl
IHRlc3RzIGRlcGVuZCBvbiB0aGlzIG9yZGVyIHRvIHJ1biBwcm9wZXJseSBzbyB3ZSBkZWNsYXJl
IHRoZW0gaW4gYSBzaW5nbGUgb25lLgotICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTExNDM0LgotI2lmIFBMQVRGT1JNKEdUSykKLSAgICB0ZXN0Tm90
SW5pdGlhbGl6ZWQodGVzdCk7Ci0jZW5kaWYKKyAgICB0ZXN0LT5vcGVuKCJ0ZXN0RmF2aWNvbkRh
dGFiYXNlQ2xlYXIiKTsKKyAgICB0ZXN0LT5sb2FkVVJJKGtTZXJ2ZXItPmdldFVSSUZvclBhdGgo
Ii9mb28iKS5kYXRhKCkpOworICAgIHRlc3QtPndhaXRVbnRpbExvYWRGaW5pc2hlZEFuZEZhdmlj
b25DaGFuZ2VkKCk7CisgICAgdGVzdC0+Z2V0RmF2aWNvbkZvclBhZ2VVUklBbmRXYWl0VW50aWxS
ZWFkeShrU2VydmVyLT5nZXRVUklGb3JQYXRoKCIvZm9vIikuZGF0YSgpKTsKKyAgICBnX2Fzc2Vy
dF9ub25udWxsKHRlc3QtPm1fZmF2aWNvbik7CisgICAgZ19hc3NlcnRfbm9ubnVsbCh3ZWJraXRf
ZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbl91cmkodGVzdC0+bV9kYXRhYmFzZSwga1NlcnZl
ci0+Z2V0VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSkpOwogCi0gICAgdGVzdFNldERpcmVjdG9y
eSh0ZXN0KTsKKyAgICB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9jbGVhcih0ZXN0LT5tX2RhdGFi
YXNlKTsKIAotI2lmIFBMQVRGT1JNKEdUSykKLSAgICB0ZXN0UHJpdmF0ZUJyb3dzaW5nKHRlc3Qp
OwotICAgIHRlc3RHZXRGYXZpY29uKHRlc3QpOwotICAgIHRlc3RXZWJWaWV3RmF2aWNvbih0ZXN0
KTsKLSAgICB0ZXN0R2V0RmF2aWNvblVSSSh0ZXN0KTsKLSAgICB0ZXN0Q2xlYXJEYXRhYmFzZSh0
ZXN0KTsKLSNlbmRpZgorICAgIHRlc3QtPmdldEZhdmljb25Gb3JQYWdlVVJJQW5kV2FpdFVudGls
UmVhZHkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL2ZvbyIpLmRhdGEoKSk7CisgICAgZ19hc3Nl
cnRfbnVsbCh0ZXN0LT5tX2Zhdmljb24pOworICAgIGdfYXNzZXJ0X251bGwod2Via2l0X2Zhdmlj
b25fZGF0YWJhc2VfZ2V0X2Zhdmljb25fdXJpKHRlc3QtPm1fZGF0YWJhc2UsIGtTZXJ2ZXItPmdl
dFVSSUZvclBhdGgoIi9mb28iKS5kYXRhKCkpKTsKIH0KIAogdm9pZCBiZWZvcmVBbGwoKQogewot
I2lmIFBMQVRGT1JNKEdUSykKICAgICAvLyBTdGFydCBhIHNvdXAgc2VydmVyIGZvciB0ZXN0aW5n
LgogICAgIGtTZXJ2ZXIgPSBuZXcgV2ViS2l0VGVzdFNlcnZlcigpOwogICAgIGtTZXJ2ZXItPnJ1
bihzZXJ2ZXJDYWxsYmFjayk7Ci0jZW5kaWYKIAotICAgIC8vIEFkZCB0ZXN0cyB0byB0aGUgc3Vp
dGUuCi0gICAgRmF2aWNvbkRhdGFiYXNlVGVzdDo6YWRkKCJXZWJLaXRGYXZpY29uRGF0YWJhc2Ui
LCAiZmF2aWNvbi1kYXRhYmFzZS10ZXN0IiwgdGVzdEZhdmljb25EYXRhYmFzZSk7CisgICAgRmF2
aWNvbkRhdGFiYXNlVGVzdDo6YWRkKCJXZWJLaXRGYXZpY29uRGF0YWJhc2UiLCAiaW5pdGlhbGl6
YXRpb24iLCB0ZXN0RmF2aWNvbkRhdGFiYXNlSW5pdGlhbGl6YXRpb24pOworICAgIEZhdmljb25E
YXRhYmFzZVRlc3Q6OmFkZCgiV2ViS2l0RmF2aWNvbkRhdGFiYXNlIiwgImdldC1mYXZpY29uIiwg
dGVzdEZhdmljb25EYXRhYmFzZUdldEZhdmljb24pOworICAgIEZhdmljb25EYXRhYmFzZVRlc3Q6
OmFkZCgiV2ViS2l0RmF2aWNvbkRhdGFiYXNlIiwgImVwaGVtZXJhbCIsIHRlc3RGYXZpY29uRGF0
YWJhc2VFcGhlbWVyYWwpOworICAgIEZhdmljb25EYXRhYmFzZVRlc3Q6OmFkZCgiV2ViS2l0RmF2
aWNvbkRhdGFiYXNlIiwgImNsZWFyIiwgdGVzdEZhdmljb25EYXRhYmFzZUNsZWFyKTsKIH0KIAog
dm9pZCBhZnRlckFsbCgpCiB7Ci0jaWYgUExBVEZPUk0oR1RLKQogICAgIGRlbGV0ZSBrU2VydmVy
OwotI2VuZGlmCiB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9n
bGliL0NNYWtlTGlzdHMudHh0IGIvVG9vbHMvVGVzdFdlYktpdEFQSS9nbGliL0NNYWtlTGlzdHMu
dHh0CmluZGV4IDRlYjRiZmU1NDAyLi4zZjQ5Zjg1YjVjYyAxMDA2NDQKLS0tIGEvVG9vbHMvVGVz
dFdlYktpdEFQSS9nbGliL0NNYWtlTGlzdHMudHh0CisrKyBiL1Rvb2xzL1Rlc3RXZWJLaXRBUEkv
Z2xpYi9DTWFrZUxpc3RzLnR4dApAQCAtMTIyLDcgKzEyMiw2IEBAIEFERF9XSzJfVEVTVChUZXN0
QXV0aGVudGljYXRpb24gJHtUT09MU19ESVJ9L1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xp
Yi9UZXN0CiBBRERfV0syX1RFU1QoVGVzdEF1dG9tYXRpb25TZXNzaW9uICR7VE9PTFNfRElSfS9U
ZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdEdMaWIvVGVzdEF1dG9tYXRpb25TZXNzaW9uLmNwcCkK
IEFERF9XSzJfVEVTVChUZXN0QmFja0ZvcndhcmRMaXN0ICR7VE9PTFNfRElSfS9UZXN0V2ViS2l0
QVBJL1Rlc3RzL1dlYktpdEdMaWIvVGVzdEJhY2tGb3J3YXJkTGlzdC5jcHApCiBBRERfV0syX1RF
U1QoVGVzdERvd25sb2FkcyAke1RPT0xTX0RJUn0vVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRH
TGliL1Rlc3REb3dubG9hZHMuY3BwKQotQUREX1dLMl9URVNUKFRlc3RXZWJLaXRGYXZpY29uRGF0
YWJhc2UgJHtUT09MU19ESVJ9L1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xpYi9UZXN0V2Vi
S2l0RmF2aWNvbkRhdGFiYXNlLmNwcCkKIEFERF9XSzJfVEVTVChUZXN0V2ViS2l0RmluZENvbnRy
b2xsZXIgJHtUT09MU19ESVJ9L1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xpYi9UZXN0V2Vi
S2l0RmluZENvbnRyb2xsZXIuY3BwKQogQUREX1dLMl9URVNUKFRlc3RFZGl0b3IgJHtUT09MU19E
SVJ9L1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xpYi9UZXN0RWRpdG9yLmNwcCkKIEFERF9X
SzJfVEVTVChUZXN0RnJhbWUgJHtUT09MU19ESVJ9L1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0
R0xpYi9UZXN0RnJhbWUuY3BwKQpkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9nbGli
L1BsYXRmb3JtR1RLLmNtYWtlIGIvVG9vbHMvVGVzdFdlYktpdEFQSS9nbGliL1BsYXRmb3JtR1RL
LmNtYWtlCmluZGV4IDViMjliODViODhlLi45YjIzZTc0YWJkZSAxMDA2NDQKLS0tIGEvVG9vbHMv
VGVzdFdlYktpdEFQSS9nbGliL1BsYXRmb3JtR1RLLmNtYWtlCisrKyBiL1Rvb2xzL1Rlc3RXZWJL
aXRBUEkvZ2xpYi9QbGF0Zm9ybUdUSy5jbWFrZQpAQCAtNDMsNiArNDMsNyBAQCBBRERfV0syX1RF
U1QoVGVzdEluc3BlY3RvciAke1RPT0xTX0RJUn0vVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRH
dGsvVGVzdEluc3BlYwogQUREX1dLMl9URVNUKFRlc3RJbnNwZWN0b3JTZXJ2ZXIgJHtUT09MU19E
SVJ9L1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R3RrL1Rlc3RJbnNwZWN0b3JTZXJ2ZXIuY3Bw
KQogQUREX1dLMl9URVNUKFRlc3RPcHRpb25NZW51ICR7VE9PTFNfRElSfS9UZXN0V2ViS2l0QVBJ
L1Rlc3RzL1dlYktpdEd0ay9UZXN0T3B0aW9uTWVudS5jcHApCiBBRERfV0syX1RFU1QoVGVzdFBy
aW50aW5nICR7VE9PTFNfRElSfS9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdEd0ay9UZXN0UHJp
bnRpbmcuY3BwKQorQUREX1dLMl9URVNUKFRlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UgJHtUT09M
U19ESVJ9L1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xpYi9UZXN0V2ViS2l0RmF2aWNvbkRh
dGFiYXNlLmNwcCkKIEFERF9XSzJfVEVTVChUZXN0V2ViS2l0VmVyc2lvbiAke1RPT0xTX0RJUn0v
VGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRHdGsvVGVzdFdlYktpdFZlcnNpb24uY3BwKQogQURE
X1dLMl9URVNUKFRlc3RXZWJWaWV3RWRpdG9yICR7VE9PTFNfRElSfS9UZXN0V2ViS2l0QVBJL1Rl
c3RzL1dlYktpdEd0ay9UZXN0V2ViVmlld0VkaXRvci5jcHApCiAKZGlmZiAtLWdpdCBhL1Rvb2xz
L1Rlc3RXZWJLaXRBUEkvZ2xpYi9UZXN0RXhwZWN0YXRpb25zLmpzb24gYi9Ub29scy9UZXN0V2Vi
S2l0QVBJL2dsaWIvVGVzdEV4cGVjdGF0aW9ucy5qc29uCmluZGV4IDA3NTVlYTYxMTg4Li40YzI1
MDNiYWZmMSAxMDA2NDQKLS0tIGEvVG9vbHMvVGVzdFdlYktpdEFQSS9nbGliL1Rlc3RFeHBlY3Rh
dGlvbnMuanNvbgorKysgYi9Ub29scy9UZXN0V2ViS2l0QVBJL2dsaWIvVGVzdEV4cGVjdGF0aW9u
cy5qc29uCkBAIC0xNzMsMTIgKzE3Myw1IEBACiAgICAgICAgICAgICAgICAgImV4cGVjdGVkIjog
eyJhbGxARGVidWciOiB7InNsb3ciOiB0cnVlfX0KICAgICAgICAgICAgIH0KICAgICAgICAgfQot
ICAgIH0sCi0gICAgIlRlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UiOiB7Ci0gICAgICAgICJzdWJ0
ZXN0cyI6IHsKLSAgICAgICAgICAgICIvd2Via2l0L1dlYktpdEZhdmljb25EYXRhYmFzZS9mYXZp
Y29uLWRhdGFiYXNlLXRlc3QiOiB7Ci0gICAgICAgICAgICAgICAgImV4cGVjdGVkIjogeyJndGsi
OiB7InN0YXR1cyI6IFsiUEFTUyIsICJGQUlMIl0sICJidWciOiAid2Via2l0Lm9yZy9iLzE4ODEx
MCJ9fQotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgfQogfQo=
</data>
<flag name="review"
          id="395354"
          type_id="1"
          status="+"
          setter="zan"
    />
          </attachment>
      

    </bug>

</bugzilla>