<?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>170488</bug_id>
          
          <creation_ts>2017-04-04 19:35:54 -0700</creation_ts>
          <short_desc>WebAssembly: Make to a compilation API that allows for multi-VM concurrent compilations of Wasm Modules</short_desc>
          <delta_ts>2017-04-07 11:28:25 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</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>
          
          <blocked>170567</blocked>
    
    <blocked>168264</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>buildbot</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>gskachkov</cc>
    
    <cc>jfbastien</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>ticaiolima</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1294326</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-04 19:35:54 -0700</bug_when>
    <thetext>...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1294775</commentid>
    <comment_count>1</comment_count>
      <attachid>306357</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-05 19:46:49 -0700</bug_when>
    <thetext>Created attachment 306357
WIP

I wonder if it works.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1294781</commentid>
    <comment_count>2</comment_count>
      <attachid>306360</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-05 20:21:04 -0700</bug_when>
    <thetext>Created attachment 306360
WIP

passes most tests. Looks like I got some concurrency issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1294783</commentid>
    <comment_count>3</comment_count>
      <attachid>306361</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-05 20:36:19 -0700</bug_when>
    <thetext>Created attachment 306361
WIP

It passes all wasm tests, and runs wasm bench on a debug build. I need to clean some stuff up and then convince myself it&apos;s correct.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1294784</commentid>
    <comment_count>4</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-04-05 20:37:30 -0700</bug_when>
    <thetext>Attachment 306361 did not pass style-queue:


ERROR: Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h:52:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h:53:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.cpp:39:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/wasm/js/JSWebAssemblyModule.h:35:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.h:67:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.h:71:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.h:72:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.h:74:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/wasm/js/JSWebAssemblyCodeBlock.h:76:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/wasm/WasmPlan.cpp:200:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/wasm/WasmPlan.cpp:201:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp:112:  Should have a space between // and comment  [whitespace/comments] [4]
ERROR: Source/JavaScriptCore/wasm/WasmBinding.h:42:  The parameter name &quot;signatureIndex&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 13 in 19 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1295090</commentid>
    <comment_count>5</comment_count>
      <attachid>306433</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-06 15:52:45 -0700</bug_when>
    <thetext>Created attachment 306433
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1295105</commentid>
    <comment_count>6</comment_count>
      <attachid>306433</attachid>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2017-04-06 16:38:41 -0700</bug_when>
    <thetext>Comment on attachment 306433
patch

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

r- on the CodeBlock being in it&apos;s own file and the callback to finalize a CodeBlock.

&gt; Source/JavaScriptCore/wasm/WasmModule.cpp:39
&gt; +    m_plan = adoptRef(*new Plan(vm, makeRef(moduleInformation), Plan::FullCompile, [this] (VM&amp;, Plan&amp;) {

What happens if someone cancels this vm. Who initializes the callees?

I think you need to make the plan aware of the CodeBlock it&apos;s compiling for. When the Plan finishes it should call some linking hook on the CodeBlock. That linking hook can remove the RefPtr to the Plan or something.

&gt; Source/JavaScriptCore/wasm/WasmModule.h:94
&gt; +class CodeBlock : public ThreadSafeRefCounted&lt;CodeBlock&gt; {
&gt; +public:
&gt; +    using AsyncCompilationCallback = std::function&lt;void(VM&amp;)&gt;;
&gt; +    static Ref&lt;CodeBlock&gt; create(VM&amp; vm, MemoryMode mode, ModuleInformation&amp; moduleInformation)
&gt; +    {
&gt; +        return adoptRef(*new CodeBlock(vm, mode, moduleInformation));
&gt; +    }
&gt; +
&gt; +    void waitUntilFinished();
&gt; +    void compileAsync(VM&amp;, AsyncCompilationCallback&amp;&amp;);
&gt; +
&gt; +    bool compilationFinished()
&gt; +    {
&gt; +        auto locker = holdLock(m_lock);
&gt; +        return !m_plan;
&gt; +    }
&gt; +    bool runnable() { return compilationFinished() &amp;&amp; !m_errorMessage; }
&gt; +
&gt; +    // Note, we do this copy to ensure it&apos;s thread safe to have this
&gt; +    // called from multiple threads simultaneously.
&gt; +    String errorMessage()
&gt; +    {
&gt; +        ASSERT(!runnable());
&gt; +        CString cString = m_errorMessage.ascii();
&gt; +        return String(cString.data());
&gt; +    }
&gt; +
&gt; +    unsigned functionImportCount() const { return m_wasmToWasmExitStubs.size(); }
&gt; +
&gt; +    Wasm::Callee&amp; jsEntrypointCalleeFromFunctionIndexSpace(unsigned functionIndexSpace)
&gt; +    {
&gt; +        RELEASE_ASSERT(functionIndexSpace &gt;= functionImportCount());
&gt; +        unsigned calleeIndex = functionIndexSpace - functionImportCount();
&gt; +        RELEASE_ASSERT(calleeIndex &lt; m_calleeCount);
&gt; +        return *m_callees[calleeIndex].get();
&gt; +    }
&gt; +    Wasm::Callee&amp; wasmEntrypointCalleeFromFunctionIndexSpace(unsigned functionIndexSpace)
&gt; +    {
&gt; +        RELEASE_ASSERT(functionIndexSpace &gt;= functionImportCount());
&gt; +        unsigned calleeIndex = functionIndexSpace - functionImportCount();
&gt; +        RELEASE_ASSERT(calleeIndex &lt; m_calleeCount);
&gt; +        return *m_callees[calleeIndex + m_calleeCount].get();
&gt; +    }
&gt; +    bool isSafeToRun(MemoryMode);
&gt; +
&gt; +private:
&gt; +    CodeBlock(VM&amp;, MemoryMode, ModuleInformation&amp;);
&gt; +    unsigned m_calleeCount;
&gt; +    MemoryMode m_mode;
&gt; +    Vector&lt;RefPtr&lt;Callee&gt;&gt; m_callees;
&gt; +    Vector&lt;MacroAssemblerCodeRef&gt; m_wasmToWasmExitStubs;
&gt; +    RefPtr&lt;Plan&gt; m_plan;
&gt; +    String m_errorMessage;
&gt; +    Lock m_lock;
&gt; +};

This should be in it&apos;s own file along with the code from the .cpp file above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1295107</commentid>
    <comment_count>7</comment_count>
      <attachid>306433</attachid>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2017-04-06 16:40:40 -0700</bug_when>
    <thetext>Comment on attachment 306433
patch

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

It might also be worthwhile making the std::functions into SharedTasks. The new code moves them around a lot which is expensive for std::function.

&gt; Source/JavaScriptCore/wasm/WasmModule.h:98
&gt; +    using ValidationResult = WTF::Expected&lt;RefPtr&lt;Module&gt;, String&gt;;

Why not make this a Ref?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1295239</commentid>
    <comment_count>8</comment_count>
      <attachid>306433</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-07 00:44:40 -0700</bug_when>
    <thetext>Comment on attachment 306433
patch

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

&gt;&gt; Source/JavaScriptCore/wasm/WasmModule.cpp:39
&gt;&gt; +    m_plan = adoptRef(*new Plan(vm, makeRef(moduleInformation), Plan::FullCompile, [this] (VM&amp;, Plan&amp;) {
&gt; 
&gt; What happens if someone cancels this vm. Who initializes the callees?
&gt; 
&gt; I think you need to make the plan aware of the CodeBlock it&apos;s compiling for. When the Plan finishes it should call some linking hook on the CodeBlock. That linking hook can remove the RefPtr to the Plan or something.

Yup, this is a bug. I&apos;ll fix it.
I think there are only two reasons for failure here:
1. Cancellation
2. OOM

Perhaps we should just always retry to compile on failure in the future if the module asks to get compiled again for a particular memory mode?

&gt;&gt; Source/JavaScriptCore/wasm/WasmModule.h:98
&gt;&gt; +    using ValidationResult = WTF::Expected&lt;RefPtr&lt;Module&gt;, String&gt;;
&gt; 
&gt; Why not make this a Ref?

I wanted to, but was getting weird compilation errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1295252</commentid>
    <comment_count>9</comment_count>
      <attachid>306480</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-07 02:34:37 -0700</bug_when>
    <thetext>Created attachment 306480
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1295347</commentid>
    <comment_count>10</comment_count>
      <attachid>306480</attachid>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2017-04-07 08:53:06 -0700</bug_when>
    <thetext>Comment on attachment 306480
patch

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

Looks good. A few comments, and GTK is sad on isSafeToRun linking.

&gt; Source/JavaScriptCore/runtime/PromiseDeferredTimer.cpp:47
&gt; +    m_taskLock.lock();

Trying to understand this lock. IIUC you need it for:

 - timers
 - pending promises
 - task / drain micro tasks
 - runloop

?

It just seems weird / brittle to manually lock + unlock like this. IIUC doing it manually allows you to lock what you need and join different things that can be locked together?

&gt; Source/JavaScriptCore/wasm/WasmCodeBlock.cpp:44
&gt; +        // The JS API insures this invariant by keeping alive the module as it has

&quot;ensures&quot;

&gt; Source/JavaScriptCore/wasm/WasmCodeBlock.h:59
&gt; +    // called from multiple threads simultaneously.

Is the ASCII version likely to die? I&apos;m not sure I understand the thread + lifetime issue here.

&gt; Source/JavaScriptCore/wasm/WasmModule.cpp:61
&gt; +    // It&apos;s worth retrying.

How often do we retry though? As a separate patch we&apos;ll want to reduce the number of concurrent compilations if we OOM, so I guess we can just leave a FIXME here?

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:362
&gt;          fail(locker, ASCIILiteral(&quot;WebAssembly Plan was canceled. If you see this error message please file a bug at bugs.webkit.org!&quot;));

We spell it &quot;cancelled&quot; elsewhere. Brit spelling.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1295397</commentid>
    <comment_count>11</comment_count>
      <attachid>306480</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-07 11:18:27 -0700</bug_when>
    <thetext>Comment on attachment 306480
patch

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

&gt;&gt; Source/JavaScriptCore/runtime/PromiseDeferredTimer.cpp:47
&gt;&gt; +    m_taskLock.lock();
&gt; 
&gt; Trying to understand this lock. IIUC you need it for:
&gt; 
&gt;  - timers
&gt;  - pending promises
&gt;  - task / drain micro tasks
&gt;  - runloop
&gt; 
&gt; ?
&gt; 
&gt; It just seems weird / brittle to manually lock + unlock like this. IIUC doing it manually allows you to lock what you need and join different things that can be locked together?

This lock is only used to protect access to m_tasks. The reason I release the lock is that scheduleWorkSoon() acquires the lock. If we didn&apos;t unlock here, and the task calls scheduleWorkSoon(), we&apos;ll deadlock.

&gt;&gt; Source/JavaScriptCore/wasm/WasmCodeBlock.cpp:44
&gt;&gt; +        // The JS API insures this invariant by keeping alive the module as it has
&gt; 
&gt; &quot;ensures&quot;

fixed.

&gt;&gt; Source/JavaScriptCore/wasm/WasmCodeBlock.h:59
&gt;&gt; +    // called from multiple threads simultaneously.
&gt; 
&gt; Is the ASCII version likely to die? I&apos;m not sure I understand the thread + lifetime issue here.

The issue is this:
2 threads simultaneously call this. WTF::String ref counts the StringImpl it owns. This is not done atomically. So we need to make a copy here for each thing that asks for the error message.

&gt;&gt; Source/JavaScriptCore/wasm/WasmModule.cpp:61
&gt;&gt; +    // It&apos;s worth retrying.
&gt; 
&gt; How often do we retry though? As a separate patch we&apos;ll want to reduce the number of concurrent compilations if we OOM, so I guess we can just leave a FIXME here?

I&apos;ll file a FIXME to implement some backoff policy or something similar.

&gt;&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:362
&gt;&gt;          fail(locker, ASCIILiteral(&quot;WebAssembly Plan was canceled. If you see this error message please file a bug at bugs.webkit.org!&quot;));
&gt; 
&gt; We spell it &quot;cancelled&quot; elsewhere. Brit spelling.

I&apos;ll fix it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1295401</commentid>
    <comment_count>12</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2017-04-07 11:23:46 -0700</bug_when>
    <thetext>&gt; &gt;&gt; Source/JavaScriptCore/wasm/WasmCodeBlock.h:59
&gt; &gt;&gt; +    // called from multiple threads simultaneously.
&gt; &gt; 
&gt; &gt; Is the ASCII version likely to die? I&apos;m not sure I understand the thread + lifetime issue here.
&gt; 
&gt; The issue is this:
&gt; 2 threads simultaneously call this. WTF::String ref counts the StringImpl it
&gt; owns. This is not done atomically. So we need to make a copy here for each
&gt; thing that asks for the error message.

Can&apos;t you return the const char* and avoid the issue entirely?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1295404</commentid>
    <comment_count>13</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-07 11:26:18 -0700</bug_when>
    <thetext>landed in:
https://trac.webkit.org/changeset/215103/webkit</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1295405</commentid>
    <comment_count>14</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-07 11:27:08 -0700</bug_when>
    <thetext>(In reply to JF Bastien from comment #12)
&gt; &gt; &gt;&gt; Source/JavaScriptCore/wasm/WasmCodeBlock.h:59
&gt; &gt; &gt;&gt; +    // called from multiple threads simultaneously.
&gt; &gt; &gt; 
&gt; &gt; &gt; Is the ASCII version likely to die? I&apos;m not sure I understand the thread + lifetime issue here.
&gt; &gt; 
&gt; &gt; The issue is this:
&gt; &gt; 2 threads simultaneously call this. WTF::String ref counts the StringImpl it
&gt; &gt; owns. This is not done atomically. So we need to make a copy here for each
&gt; &gt; thing that asks for the error message.
&gt; 
&gt; Can&apos;t you return the const char* and avoid the issue entirely?

Each caller would want to make a String out of it anyways (note there are only two callers, I believe). I think it&apos;s nice to just give the caller what they want in a safe way.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>306357</attachid>
            <date>2017-04-05 19:46:49 -0700</date>
            <delta_ts>2017-04-05 20:21:04 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>51066</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTQ5MCw2ICsxNDkwLDggQEAKIAkJNzJBQUY3Q0QxRDBE
MzFCMzAwNUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzJBQUY3Q0IxRDBEMzE4QjAw
NUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uY3BwICovOyB9OwogCQk3MkFB
RjdDRTFEMEQzMUIzMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5jdGlvbi5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzJBQUY3Q0MxRDBE
MzE4QjAwNUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uaCAqLzsgfTsKIAkJ
NzgyNzREOEU0QzRENEZDRDlBMURDNkU2IC8qIFRlbXBsYXRlUmVnaXN0cnlLZXkuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkRCNEI1RTA5OUNENEMx
QkIzQzFDRjA1IC8qIFRlbXBsYXRlUmVnaXN0cnlLZXkuY3BwICovOyB9OworCQk3OTAwODEzODFF
OTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTAwODEzNjFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1v
ZHVsZS5jcHAgKi87IH07CisJCTc5MDA4MTM5MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxl
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTAwODEz
NzFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5MDVCQjY4MUQxMjA1MEUwMDE5RkU1NyAvKiBJ
bmxpbmVBY2Nlc3MuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gNzkwNUJCNjYxRDEyMDUwRTAwMTlGRTU3IC8qIElubGluZUFjY2Vzcy5jcHAgKi87IH07
CiAJCTc5MDVCQjY5MUQxMjA1MEUwMDE5RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5MDVCQjY3MUQxMjA1MEUwMDE5
RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2
YXRlLCApOyB9OyB9OwogCQk3OTE2MERCRDFDOEUzRUM4MDA4QzA4NUEgLyogUHJveHlSZXZva2Uu
Y3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzkxNjBE
QkIxQzhFM0VDODAwOEMwODVBIC8qIFByb3h5UmV2b2tlLmNwcCAqLzsgfTsKQEAgLTQwNDMsNiAr
NDA0NSw4IEBACiAJCTcyQUFGN0NCMUQwRDMxOEIwMDVFNjBCRSAvKiBKU0N1c3RvbUdldHRlclNl
dHRlckZ1bmN0aW9uLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpT
Q3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQk3MkFBRjdDQzFEMEQzMThCMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5j
dGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBKU0N1c3RvbUdldHRlclNl
dHRlckZ1bmN0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc3QjI1Q0IyQzMw
OTRBOTJBMzhFMURCMyAvKiBKU01vZHVsZUxvYWRlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBKU01vZHVsZUxvYWRlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQk3OTAwODEzNjFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXYXNtTW9kdWxlLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJNzkwMDgxMzcxRTk1QThFQzAwNTJEN0NEIC8qIFdhc21Nb2R1bGUuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV2FzbU1vZHVsZS5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQk3OTA1QkI2NjFEMTIwNTBFMDAxOUZFNTcgLyogSW5saW5lQWNj
ZXNzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IElubGluZUFjY2Vz
cy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5MDVCQjY3MUQxMjA1MEUwMDE5
RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
SW5saW5lQWNjZXNzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5MTYwREJCMUM4
RTNFQzgwMDhDMDg1QSAvKiBQcm94eVJldm9rZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBQcm94eVJldm9rZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CkBAIC02MzI3LDYgKzYzMzEsOCBAQAogCQkJCUFEMkZDQzMyMURDNDA0NTMwMEIzRTczNiAvKiBX
YXNtRm9ybWF0LmNwcCAqLywKIAkJCQk3QkM1NDdEMjFCNjk1OTlCMDA5NTlCNTggLyogV2FzbUZv
cm1hdC5oICovLAogCQkJCTUzRjQwRThBMUQ1OTAxQkIwMDk5QTFCNiAvKiBXYXNtRnVuY3Rpb25Q
YXJzZXIuaCAqLywKKwkJCQk3OTAwODEzNjFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5j
cHAgKi8sCisJCQkJNzkwMDgxMzcxRTk1QThFQzAwNTJEN0NEIC8qIFdhc21Nb2R1bGUuaCAqLywK
IAkJCQk1MzU1NTcxNTFEOURGQTMyMDA2RDU4M0IgLyogV2FzbU1lbW9yeS5jcHAgKi8sCiAJCQkJ
NTM1NTU3MTMxRDlEOUVBNTAwNkQ1ODNCIC8qIFdhc21NZW1vcnkuaCAqLywKIAkJCQk3OUI3NTk3
MTFERkE0QzYwMDA1MjE3NEMgLyogV2FzbU1lbW9yeUluZm9ybWF0aW9uLmNwcCAqLywKQEAgLTg5
MjIsNiArODkyOCw3IEBACiAJCQkJQTU4QzAyNDIxOEU0QTQxQTAwMDMyQkM1IC8qIEpTQ29udGV4
dFByaXZhdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDMThDNDFFMEUxNkY1Q0QwMEIzNDQ2MCAv
KiBKU0NvbnRleHRSZWYuaCBpbiBIZWFkZXJzICovLAogCQkJCUE1RUE3MEVFMTlGNUI1QzQwMDk4
RjVFQyAvKiBKU0NvbnRleHRSZWZJbnNwZWN0b3JTdXBwb3J0LmggaW4gSGVhZGVycyAqLywKKwkJ
CQk3OTAwODEzOTFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJQTVEMkU2NjUxOTVFMTc0MDAwQTUxOEU3IC8qIEpTQ29udGV4dFJlZkludGVybmFsLmgg
aW4gSGVhZGVycyAqLywKIAkJCQkwRkY0QjRDNzFFODg5M0M1MDBEQkJFODYgLyogQWlyQ0ZHLmgg
aW4gSGVhZGVycyAqLywKIAkJCQkxNDhDRDFEODEwOENGOTAyMDA4MTYzQzYgLyogSlNDb250ZXh0
UmVmUHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8sCkBAIC0xMDM2Niw2ICsxMDM3Myw3IEBACiAJCQkJ
MEZCMTA1ODUxNjc1NDgwRjAwRjhBQjZFIC8qIEV4aXRLaW5kLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCTBGNTUxM0E4MUQ1QTY4Q0QwMEMzMkJEOCAvKiBGcmVlTGlzdC5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQkwRkVBMEExQzE3MDhCMDA3MDBCQjcyMkMgLyogRlRMQWJzdHJhY3RIZWFwLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCTc5MDA4MTM4MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxl
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRUEwQTFFMTcwOEIwMDcwMEJCNzIyQyAvKiBGVExB
YnN0cmFjdEhlYXBSZXBvc2l0b3J5LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGNDg1MzI3MTg3
REZERUMwMDgzQjY4NyAvKiBGVExBdmFpbGFibGVSZWNvdmVyeS5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQkwRkVBMEEwOTE3MDUxM0RCMDBCQjcyMkMgLyogRlRMQ2FwYWJpbGl0aWVzLmNwcCBpbiBT
b3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUJpbmRpbmcu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CaW5kaW5n
LmNwcAkocmV2aXNpb24gMjE0OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2Fz
bUJpbmRpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OSw3ICs0OSw3IEBAIHN0YXRpYyB2b2lk
IG1hdGVyaWFsaXplSW1wb3J0SlNDZWxsKEpJVCYKICAgICBqaXQubG9hZFB0cihKSVQ6OkFkZHJl
c3MocmVzdWx0LCBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6Om9mZnNldE9mSW1wb3J0RnVuY3Rpb24o
aW1wb3J0SW5kZXgpKSwgcmVzdWx0KTsKIH0KIAotc3RhdGljIE1hY3JvQXNzZW1ibGVyQ29kZVJl
ZiB3YXNtVG9KcyhWTSogdm0sIEJhZzxDYWxsTGlua0luZm8+JiBjYWxsTGlua0luZm9zLCBTaWdu
YXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCwgdW5zaWduZWQgaW1wb3J0SW5kZXgpCitNYWNyb0Fz
c2VtYmxlckNvZGVSZWYgd2FzbVRvSnMoVk0qIHZtLCBCYWc8Q2FsbExpbmtJbmZvPiYgY2FsbExp
bmtJbmZvcywgU2lnbmF0dXJlSW5kZXggc2lnbmF0dXJlSW5kZXgsIHVuc2lnbmVkIGltcG9ydElu
ZGV4KQogewogICAgIC8vIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcHJvcGVybHkgYWJz
dHJhY3QgYXdheSB0aGUgY2FsbGluZyBjb252ZW50aW9uLgogICAgIC8vIEl0J2QgYmUgc3VwZXIg
ZWFzeSB0byBkbyBzbzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2
OTQwMQpAQCAtNDIyLDcgKzQyMiw3IEBAIHN0YXRpYyBNYWNyb0Fzc2VtYmxlckNvZGVSZWYgd2Fz
bVRvSnMoVk0KICAgICByZXR1cm4gRklOQUxJWkVfQ09ERShwYXRjaEJ1ZmZlciwgKCJXZWJBc3Nl
bWJseS0+SmF2YVNjcmlwdCBpbXBvcnRbJWldICVzIiwgaW1wb3J0SW5kZXgsIHNpZ25hdHVyZS50
b1N0cmluZygpLmFzY2lpKCkuZGF0YSgpKSk7CiB9CiAKLXN0YXRpYyBNYWNyb0Fzc2VtYmxlckNv
ZGVSZWYgd2FzbVRvV2FzbSh1bnNpZ25lZCBpbXBvcnRJbmRleCkKK01hY3JvQXNzZW1ibGVyQ29k
ZVJlZiB3YXNtVG9XYXNtKHVuc2lnbmVkIGltcG9ydEluZGV4KQogewogICAgIGNvbnN0IFBpbm5l
ZFJlZ2lzdGVySW5mbyYgcGlubmVkUmVncyA9IFBpbm5lZFJlZ2lzdGVySW5mbzo6Z2V0KCk7CiAg
ICAgSklUIGppdDsKQEAgLTQ2MiwxNCArNDYyLDYgQEAgc3RhdGljIE1hY3JvQXNzZW1ibGVyQ29k
ZVJlZiB3YXNtVG9XYXNtKAogICAgIHJldHVybiBGSU5BTElaRV9DT0RFKHBhdGNoQnVmZmVyLCAo
IldlYkFzc2VtYmx5LT5XZWJBc3NlbWJseSBpbXBvcnRbJWldIiwgaW1wb3J0SW5kZXgpKTsKIH0K
IAotV2FzbUV4aXRTdHVicyBleGl0U3R1YkdlbmVyYXRvcihWTSogdm0sIEJhZzxDYWxsTGlua0lu
Zm8+JiBjYWxsTGlua0luZm9zLCBTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCwgdW5zaWdu
ZWQgaW1wb3J0SW5kZXgpCi17Ci0gICAgV2FzbUV4aXRTdHVicyBzdHViczsKLSAgICBzdHVicy53
YXNtVG9KcyA9IHdhc21Ub0pzKHZtLCBjYWxsTGlua0luZm9zLCBzaWduYXR1cmVJbmRleCwgaW1w
b3J0SW5kZXgpOwotICAgIHN0dWJzLndhc21Ub1dhc20gPSB3YXNtVG9XYXNtKGltcG9ydEluZGV4
KTsKLSAgICByZXR1cm4gc3R1YnM7Ci19Ci0KIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpXYXNtCiAK
ICNlbmRpZiAvLyBFTkFCTEUoV0VCQVNTRU1CTFkpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9XYXNtQmluZGluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS93YXNtL1dhc21CaW5kaW5nLmgJKHJldmlzaW9uIDIxNDk3MikKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93YXNtL1dhc21CaW5kaW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDcgKzM4LDgg
QEAgY2xhc3MgQ2FsbExpbmtJbmZvOwogCiBuYW1lc3BhY2UgV2FzbSB7CiAKLVdhc21FeGl0U3R1
YnMgZXhpdFN0dWJHZW5lcmF0b3IoVk0qLCBCYWc8Q2FsbExpbmtJbmZvPiYsIFNpZ25hdHVyZUlu
ZGV4LCB1bnNpZ25lZCk7CitNYWNyb0Fzc2VtYmxlckNvZGVSZWYgd2FzbVRvV2FzbSh1bnNpZ25l
ZCBpbXBvcnRJbmRleCk7CitNYWNyb0Fzc2VtYmxlckNvZGVSZWYgd2FzbVRvSnMoVk0qLCBCYWc8
Q2FsbExpbmtJbmZvPiYgY2FsbExpbmtJbmZvcywgU2lnbmF0dXJlSW5kZXggc2lnbmF0dXJlSW5k
ZXgsIHVuc2lnbmVkIGltcG9ydEluZGV4KTsKIAogfSB9IC8vIG5hbWVzcGFjZSBKU0M6Oldhc20K
IApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbU1vZHVsZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbU1vZHVsZS5jcHAJKG5vbmV4
aXN0ZW50KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbU1vZHVsZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiV2FzbU1v
ZHVsZS5oIgorCisjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQorCisjaW5jbHVkZSAiV2FzbVBsYW5J
bmxpbmVzLmgiCisjaW5jbHVkZSAiV2FzbVdvcmtsaXN0LmgiCisKK25hbWVzcGFjZSBKU0MgeyBu
YW1lc3BhY2UgV2FzbSB7CisKK0NvZGVCbG9jazo6Q29kZUJsb2NrKFZNJiB2bSwgTWVtb3J5TW9k
ZSBtb2RlLCBNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5mb3JtYXRpb24pCisgICAgOiBtX2Nh
bGxlZUNvdW50KG1vZHVsZUluZm9ybWF0aW9uLmludGVybmFsRnVuY3Rpb25Db3VudCgpKQorICAg
ICwgbV9tb2RlKG1vZGUpCit7CisgICAgLy8gRklYTUU6IHBlcmhhcHMgd2UgbmVlZCBhIHByb3Rl
Y3RlZCB0aGlzIGhlcmUuIFBlcmhhcHMgbm90PyBUaGluayBhYm91dCB0aGlzIGEgYml0LgorICAg
IFJlZlB0cjxDb2RlQmxvY2s+IHByb3RlY3RlZFRoaXMgPSB0aGlzOworICAgIG1fcGxhbiA9IGFk
b3B0UmVmKCpuZXcgUGxhbih2bSwgbWFrZVJlZihtb2R1bGVJbmZvcm1hdGlvbiksIFBsYW46OkZ1
bGxDb21waWxlLCBbdGhpcywgcHJvdGVjdGVkVGhpc10gKFZNJiwgUGxhbiopIHsKKyAgICAgICAg
YXV0byBsb2NrZXIgPSBob2xkTG9jayhtX2xvY2spOworICAgICAgICAvLyBGSVhNRTogaW5pdGlh
bGl6ZSBjYWxsZWVzIGFuZCBzdHVmZi4KKyAgICAgICAgaWYgKG1fcGxhbi0+ZmFpbGVkKCkpIHsK
KyAgICAgICAgICAgIG1fZXJyb3JNZXNzYWdlID0gbV9wbGFuLT5lcnJvck1lc3NhZ2UoKTsKKyAg
ICAgICAgICAgIG1fcGxhbiA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICBtX2NhbGxlZXMucmVzaXplKG1fY2FsbGVlQ291bnQgKiAyKTsKKyAgICAg
ICAgbV9wbGFuLT5pbml0aWFsaXplQ2FsbGVlcyhbJl0gKHVuc2lnbmVkIGNhbGxlZUluZGV4LCBS
ZWY8V2FzbTo6Q2FsbGVlPiYmIGpzRW50cnlwb2ludENhbGxlZSwgUmVmPFdhc206OkNhbGxlZT4m
JiB3YXNtRW50cnlwb2ludENhbGxlZSkgeworICAgICAgICAgICAgbV9jYWxsZWVzW2NhbGxlZUlu
ZGV4XSA9IFdURk1vdmUoanNFbnRyeXBvaW50Q2FsbGVlKTsKKyAgICAgICAgICAgIG1fY2FsbGVl
c1tjYWxsZWVJbmRleCArIG1fY2FsbGVlQ291bnRdID0gV1RGTW92ZSh3YXNtRW50cnlwb2ludENh
bGxlZSk7CisgICAgICAgIH0pOworCisgICAgICAgIG1fd2FzbVRvV2FzbUV4aXRTdHVicyA9IG1f
cGxhbi0+dGFza1dhc21Ub1dhc21FeGl0U3R1YnMoKTsKKworICAgICAgICBtX3BsYW4gPSBudWxs
cHRyOworICAgIH0pKTsKKworICAgIG1fcGxhbi0+c2V0TW9kZShtb2RlKTsKKyAgICBhdXRvJiB3
b3JrbGlzdCA9IFdhc206OmVuc3VyZVdvcmtsaXN0KCk7CisgICAgLy8gTm90ZSwgaW1tZWRpYXRl
bHkgYWZ0ZXIgd2UgZW5xdWV1ZSB0aGUgcGxhbiwgdGhlcmUgaXMgYSBjaGFuY2UgdGhlIGFib3Zl
IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkLgorICAgIHdvcmtsaXN0LmVucXVldWUobWFrZVJlZigq
bV9wbGFuLmdldCgpKSk7Cit9CisKK3ZvaWQgQ29kZUJsb2NrOjp3YWl0VW50aWxGaW5pc2hlZCgp
Cit7CisgICAgUmVmUHRyPFBsYW4+IHBsYW47CisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9
IGhvbGRMb2NrKG1fbG9jayk7CisgICAgICAgIHBsYW4gPSBtX3BsYW47CisgICAgfQorCisgICAg
aWYgKHBsYW4pIHsKKyAgICAgICAgcGxhbi0+d2FpdEZvckNvbXBsZXRpb24oKTsKKyAgICAgICAg
YXV0byYgd29ya2xpc3QgPSBXYXNtOjplbnN1cmVXb3JrbGlzdCgpOworICAgICAgICB3b3JrbGlz
dC5jb21wbGV0ZVBsYW5TeW5jaHJvbm91c2x5KCpwbGFuLmdldCgpKTsKKyAgICB9CisgICAgLy8g
ZWxzZSwgaWYgd2UgZG9uJ3QgaGF2ZSBhIHBsYW4sIG1lYW5pbmcgd2UncmUgYWxyZWFkeSBjb21w
aWxlZC4KK30KKwordm9pZCBDb2RlQmxvY2s6OmNvbXBpbGVBc3luYyhWTSYgdm0sIFBsYW46OkNv
bXBsZXRpb25UYXNrJiYgdGFzaykKK3sKKyAgICBSZWZQdHI8UGxhbj4gcGxhbjsKKyAgICB7Cisg
ICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9sb2NrKTsKKyAgICAgICAgcGxhbiA9IG1f
cGxhbjsKKyAgICB9CisKKyAgICBpZiAocGxhbikKKyAgICAgICAgcGxhbi0+YWRkQ29tcGxldGlv
blRhc2sodm0sIFdURk1vdmUodGFzaykpOworICAgIGVsc2UKKyAgICAgICAgdGFzayh2bSwgbnVs
bHB0cik7Cit9CisKK2Jvb2wgQ29kZUJsb2NrOjppc1NhZmVUb1J1bihNZW1vcnlNb2RlIG1lbW9y
eU1vZGUpCit7CisgICAgaWYgKCFydW5uYWJsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBzd2l0Y2ggKG1fbW9kZSkgeworICAgIGNhc2UgV2FzbTo6TWVtb3J5TW9kZTo6Qm91bmRz
Q2hlY2tpbmc6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgV2FzbTo6TWVtb3J5TW9k
ZTo6U2lnbmFsaW5nOgorICAgICAgICAvLyBDb2RlIGJlaW5nIGluIFNpZ25hbGluZyBtb2RlIG1l
YW5zIHRoYXQgaXQgcGVyZm9ybXMgbm8gYm91bmRzIGNoZWNrcy4KKyAgICAgICAgLy8gSXRzIG1l
bW9yeSwgZXZlbiBpZiBlbXB0eSwgYWJzb2x1dGVseSBtdXN0IGFsc28gYmUgaW4gU2lnbmFsaW5n
IG1vZGUKKyAgICAgICAgLy8gYmVjYXVzZSB0aGUgcGFnZSBwcm90ZWN0aW9uIGRldGVjdHMgb3V0
LW9mLWJvdW5kcyBhY2Nlc3Nlcy4KKyAgICAgICAgcmV0dXJuIG1lbW9yeU1vZGUgPT0gV2FzbTo6
TWVtb3J5TW9kZTo6U2lnbmFsaW5nOworICAgIGNhc2UgV2FzbTo6TWVtb3J5TW9kZTo6TnVtYmVy
T2ZNZW1vcnlNb2RlczoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitNb2R1bGU6Ok1vZHVsZShS
ZWY8TW9kdWxlSW5mb3JtYXRpb24+JiYgbW9kdWxlSW5mb3JtYXRpb24pCisgICAgOiBtX21vZHVs
ZUluZm9ybWF0aW9uKFdURk1vdmUobW9kdWxlSW5mb3JtYXRpb24pKQoreworfQorCisKK3ZvaWQg
TW9kdWxlOjpjb21waWxlU3luYyhWTSYgdm0sIE1lbW9yeU1vZGUgbW9kZSkKK3sKKyAgICBSZWZQ
dHI8Q29kZUJsb2NrPiBjb2RlQmxvY2s7CisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhv
bGRMb2NrKG1fbG9jayk7CisgICAgICAgIGNvZGVCbG9jayA9IG1fY29kZUJsb2Nrc1tzdGF0aWNf
Y2FzdDx1aW50OF90Pihtb2RlKV07CisgICAgICAgIGlmICghY29kZUJsb2NrKSB7CisgICAgICAg
ICAgICBjb2RlQmxvY2sgPSBDb2RlQmxvY2s6OmNyZWF0ZSh2bSwgbW9kZSwgY29uc3RfY2FzdDxN
b2R1bGVJbmZvcm1hdGlvbiY+KG1vZHVsZUluZm9ybWF0aW9uKCkpKTsKKyAgICAgICAgICAgIG1f
Y29kZUJsb2Nrc1tzdGF0aWNfY2FzdDx1aW50OF90Pihtb2RlKV0gPSBjb2RlQmxvY2s7CisgICAg
ICAgIH0KKyAgICB9CisgICAgY29kZUJsb2NrLT53YWl0VW50aWxGaW5pc2hlZCgpOworfQorCit2
b2lkIE1vZHVsZTo6Y29tcGlsZUFzeW5jKFZNJiB2bSwgTWVtb3J5TW9kZSBtb2RlLCBQbGFuOjpD
b21wbGV0aW9uVGFzayYmIHRhc2spCit7CisgICAgUmVmUHRyPENvZGVCbG9jaz4gY29kZUJsb2Nr
OworICAgIHsKKyAgICAgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhtX2xvY2spOworICAgICAg
ICBjb2RlQmxvY2sgPSBtX2NvZGVCbG9ja3Nbc3RhdGljX2Nhc3Q8dWludDhfdD4obW9kZSldOwor
ICAgICAgICBpZiAoIWNvZGVCbG9jaykgeworICAgICAgICAgICAgY29kZUJsb2NrID0gQ29kZUJs
b2NrOjpjcmVhdGUodm0sIG1vZGUsIGNvbnN0X2Nhc3Q8TW9kdWxlSW5mb3JtYXRpb24mPihtb2R1
bGVJbmZvcm1hdGlvbigpKSk7CisgICAgICAgICAgICBtX2NvZGVCbG9ja3Nbc3RhdGljX2Nhc3Q8
dWludDhfdD4obW9kZSldID0gY29kZUJsb2NrOworICAgICAgICB9CisgICAgfQorCisgICAgY29k
ZUJsb2NrLT5jb21waWxlQXN5bmModm0sIFdURk1vdmUodGFzaykpOworfQorCit9IH0gLy8gbmFt
ZXNwYWNlIEpTQzo6V2FzbQorCisjZW5kaWYgLy8gRU5BQkxFKFdFQkFTU0VNQkxZKQpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbU1vZHVsZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21Nb2R1bGUuaAkobm9uZXhpc3RlbnQpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKKworI2luY2x1ZGUg
Ildhc21DYWxsZWUuaCIKKyNpbmNsdWRlICJXYXNtTW9kdWxlSW5mb3JtYXRpb24uaCIKKyNpbmNs
dWRlICJXYXNtUGxhbi5oIgorI2luY2x1ZGUgPHd0Zi9Mb2NrLmg+CisjaW5jbHVkZSA8d3RmL1Ro
cmVhZFNhZmVSZWZDb3VudGVkLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3BhY2UgV2FzbSB7
CisgICAgCitjbGFzcyBDb2RlQmxvY2sgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8Q29k
ZUJsb2NrPiB7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxDb2RlQmxvY2s+IGNyZWF0ZShWTSYg
dm0sIE1lbW9yeU1vZGUgbW9kZSwgTW9kdWxlSW5mb3JtYXRpb24mIG1vZHVsZUluZm9ybWF0aW9u
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgQ29kZUJsb2NrKHZtLCBtb2Rl
LCBtb2R1bGVJbmZvcm1hdGlvbikpOworICAgIH0KKworICAgIHZvaWQgd2FpdFVudGlsRmluaXNo
ZWQoKTsKKyAgICB2b2lkIGNvbXBpbGVBc3luYyhWTSYsIFBsYW46OkNvbXBsZXRpb25UYXNrJiYp
OworCisgICAgdm9pZCogd2FzbVRvSnNDYWxsU3R1YkZvckltcG9ydCh1bnNpZ25lZCBpbXBvcnRJ
bmRleCkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGltcG9ydEluZGV4IDwgbV93YXNt
VG9XYXNtRXhpdFN0dWJzLnNpemUoKSk7CisgICAgICAgIHJldHVybiBtX3dhc21Ub1dhc21FeGl0
U3R1YnNbaW1wb3J0SW5kZXhdLmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOworICAgIH0KKwor
ICAgIC8vIEZJWE1FOiByZW5hbWUgdGhpcyB0byBjb21waWxhdGlvbkZpbmlzaGVkKCkKKyAgICBi
b29sIGluaXRpYWxpemVkKCkKKyAgICB7CisgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2so
bV9sb2NrKTsKKyAgICAgICAgcmV0dXJuICFtX3BsYW47CisgICAgfQorICAgIGJvb2wgcnVubmFi
bGUoKSB7IHJldHVybiBpbml0aWFsaXplZCgpICYmICFtX2Vycm9yTWVzc2FnZTsgfQorCisgICAg
Ly8gRklYTUU6IFRoaXMgaXNuJ3QgdGhyZWFkIHNhZmUuCisgICAgU3RyaW5nJiBlcnJvck1lc3Nh
Z2UoKSB7IEFTU0VSVCghcnVubmFibGUoKSk7IHJldHVybiBtX2Vycm9yTWVzc2FnZTsgfQorCisg
ICAgdW5zaWduZWQgZnVuY3Rpb25JbXBvcnRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fd2FzbVRv
V2FzbUV4aXRTdHVicy5zaXplKCk7IH0KKworICAgIFdhc206OkNhbGxlZSYganNFbnRyeXBvaW50
Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSh1bnNpZ25lZCBmdW5jdGlvbkluZGV4U3BhY2Up
CisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChmdW5jdGlvbkluZGV4U3BhY2UgPj0gZnVu
Y3Rpb25JbXBvcnRDb3VudCgpKTsKKyAgICAgICAgdW5zaWduZWQgY2FsbGVlSW5kZXggPSBmdW5j
dGlvbkluZGV4U3BhY2UgLSBmdW5jdGlvbkltcG9ydENvdW50KCk7CisgICAgICAgIFJFTEVBU0Vf
QVNTRVJUKGNhbGxlZUluZGV4IDwgbV9jYWxsZWVDb3VudCk7CisgICAgICAgIHJldHVybiAqbV9j
YWxsZWVzW2NhbGxlZUluZGV4XS5nZXQoKTsKKyAgICB9CisgICAgV2FzbTo6Q2FsbGVlJiB3YXNt
RW50cnlwb2ludENhbGxlZUZyb21GdW5jdGlvbkluZGV4U3BhY2UodW5zaWduZWQgZnVuY3Rpb25J
bmRleFNwYWNlKQorICAgIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoZnVuY3Rpb25JbmRleFNw
YWNlID49IGZ1bmN0aW9uSW1wb3J0Q291bnQoKSk7CisgICAgICAgIHVuc2lnbmVkIGNhbGxlZUlu
ZGV4ID0gZnVuY3Rpb25JbmRleFNwYWNlIC0gZnVuY3Rpb25JbXBvcnRDb3VudCgpOworICAgICAg
ICBSRUxFQVNFX0FTU0VSVChjYWxsZWVJbmRleCA8IG1fY2FsbGVlQ291bnQpOworICAgICAgICBy
ZXR1cm4gKm1fY2FsbGVlc1tjYWxsZWVJbmRleCArIG1fY2FsbGVlQ291bnRdLmdldCgpOworICAg
IH0KKyAgICBib29sIGlzU2FmZVRvUnVuKE1lbW9yeU1vZGUpOworCitwcml2YXRlOgorICAgIENv
ZGVCbG9jayhWTSYsIE1lbW9yeU1vZGUsIE1vZHVsZUluZm9ybWF0aW9uJik7CisgICAgdW5zaWdu
ZWQgbV9jYWxsZWVDb3VudDsKKyAgICBNZW1vcnlNb2RlIG1fbW9kZTsKKyAgICBWZWN0b3I8UmVm
UHRyPENhbGxlZT4+IG1fY2FsbGVlczsKKyAgICBWZWN0b3I8TWFjcm9Bc3NlbWJsZXJDb2RlUmVm
PiBtX3dhc21Ub1dhc21FeGl0U3R1YnM7CisgICAgUmVmUHRyPFBsYW4+IG1fcGxhbjsKKyAgICBT
dHJpbmcgbV9lcnJvck1lc3NhZ2U7CisgICAgTG9jayBtX2xvY2s7Cit9OworCitjbGFzcyBNb2R1
bGUgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8TW9kdWxlPiB7CitwdWJsaWM6CisgICAg
c3RhdGljIFJlZjxNb2R1bGU+IGNyZWF0ZShSZWY8TW9kdWxlSW5mb3JtYXRpb24+JiYgbW9kdWxl
SW5mb3JtYXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBNb2R1bGUo
V1RGTW92ZShtb2R1bGVJbmZvcm1hdGlvbikpKTsKKyAgICB9CisKKyAgICBXYXNtOjpTaWduYXR1
cmVJbmRleCBzaWduYXR1cmVJbmRleEZyb21GdW5jdGlvbkluZGV4U3BhY2UodW5zaWduZWQgZnVu
Y3Rpb25JbmRleFNwYWNlKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbW9kdWxlSW5m
b3JtYXRpb24tPnNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0aW9uSW5kZXhTcGFjZShmdW5jdGlvbklu
ZGV4U3BhY2UpOworICAgIH0KKworICAgIGNvbnN0IFdhc206Ok1vZHVsZUluZm9ybWF0aW9uJiBt
b2R1bGVJbmZvcm1hdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fbW9kdWxlSW5mb3JtYXRpb24uZ2V0
KCk7IH0KKworICAgIHZvaWQgY29tcGlsZVN5bmMoVk0mLCBNZW1vcnlNb2RlKTsKKyAgICB2b2lk
IGNvbXBpbGVBc3luYyhWTSYsIE1lbW9yeU1vZGUsIFBsYW46OkNvbXBsZXRpb25UYXNrJiYpOwor
CisgICAgUmVmPENvZGVCbG9jaz4gbm9uTnVsbENvZGVCbG9jayhXYXNtOjpNZW1vcnlNb2RlIG1v
ZGUpCisgICAgeworICAgICAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IG1fY29kZUJsb2Nrc1tz
dGF0aWNfY2FzdDx1aW50OF90Pihtb2RlKV0uZ2V0KCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJU
KCEhY29kZUJsb2NrKTsKKyAgICAgICAgcmV0dXJuIG1ha2VSZWYoKmNvZGVCbG9jayk7CisgICAg
fQorCitwcml2YXRlOgorICAgIE1vZHVsZShSZWY8TW9kdWxlSW5mb3JtYXRpb24+JiYpOworICAg
IFJlZjxNb2R1bGVJbmZvcm1hdGlvbj4gbV9tb2R1bGVJbmZvcm1hdGlvbjsKKyAgICBSZWZQdHI8
Q29kZUJsb2NrPiBtX2NvZGVCbG9ja3NbV2FzbTo6TnVtYmVyT2ZNZW1vcnlNb2Rlc107CisgICAg
TG9jayBtX2xvY2s7Cit9OworCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6V2FzbQorCisjZW5kaWYg
Ly8gRU5BQkxFKFdFQkFTU0VNQkxZKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20v
V2FzbVBsYW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dh
c21QbGFuLmNwcAkocmV2aXNpb24gMjE0OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dh
c20vV2FzbVBsYW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OCw3ICs1OCw3IEBAIFBsYW46OlBs
YW4oVk0mIHZtLCBSZWY8TW9kdWxlSW5mb3JtYXRpb24KICAgICAsIG1fc3RhdGUoU3RhdGU6OlZh
bGlkYXRlZCkKICAgICAsIG1fYXN5bmNXb3JrKHdvcmspCiB7Ci0gICAgbV9jb21wbGV0aW9uVGFz
a3MuYXBwZW5kKFdURk1vdmUodGFzaykpOworICAgIG1fY29tcGxldGlvblRhc2tzLmFwcGVuZChz
dGQ6Om1ha2VfcGFpcigmdm0sIFdURk1vdmUodGFzaykpKTsKIH0KIAogUGxhbjo6UGxhbihWTSYg
dm0sIFZlY3Rvcjx1aW50OF90PiYmIHNvdXJjZSwgQXN5bmNXb3JrIHdvcmssIENvbXBsZXRpb25U
YXNrJiYgdGFzaykKQEAgLTc1LDcgKzc1LDcgQEAgUGxhbjo6UGxhbihWTSYgdm0sIGNvbnN0IHVp
bnQ4X3QqIHNvdXJjZQogICAgICwgbV9zdGF0ZShTdGF0ZTo6SW5pdGlhbCkKICAgICAsIG1fYXN5
bmNXb3JrKHdvcmspCiB7Ci0gICAgbV9jb21wbGV0aW9uVGFza3MuYXBwZW5kKFdURk1vdmUodGFz
aykpOworICAgIG1fY29tcGxldGlvblRhc2tzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcigmdm0sIFdU
Rk1vdmUodGFzaykpKTsKIH0KIAogY29uc3QgY2hhciogUGxhbjo6c3RhdGVTdHJpbmcoU3RhdGUg
c3RhdGUpCkBAIC0xMDQsMTMgKzEwNCwxMyBAQCB2b2lkIFBsYW46OmZhaWwoY29uc3QgQWJzdHJh
Y3RMb2NrZXImIGxvCiAgICAgY29tcGxldGUobG9ja2VyKTsKIH0KIAotdm9pZCBQbGFuOjphZGRD
b21wbGV0aW9uVGFzayhDb21wbGV0aW9uVGFzayYmIHRhc2spCit2b2lkIFBsYW46OmFkZENvbXBs
ZXRpb25UYXNrKFZNJiB2bSwgQ29tcGxldGlvblRhc2smJiB0YXNrKQogewogICAgIExvY2tIb2xk
ZXIgbG9ja2VyKG1fbG9jayk7CiAgICAgaWYgKG1fc3RhdGUgIT0gU3RhdGU6OkNvbXBsZXRlZCkK
LSAgICAgICAgbV9jb21wbGV0aW9uVGFza3MuYXBwZW5kKFdURk1vdmUodGFzaykpOworICAgICAg
ICBtX2NvbXBsZXRpb25UYXNrcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIoJnZtLCBXVEZNb3ZlKHRh
c2spKSk7CiAgICAgZWxzZQotICAgICAgICB0YXNrKCp0aGlzKTsKKyAgICAgICAgdGFzayh2bSwg
dGhpcyk7CiB9CiAKIGJvb2wgUGxhbjo6cGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSgpCkBAIC0xODIs
NyArMTgyLDcgQEAgdm9pZCBQbGFuOjpwcmVwYXJlKCkKICAgICB9OwogCiAgICAgY29uc3QgYXV0
byYgZnVuY3Rpb25Mb2NhdGlvbnMgPSBtX21vZHVsZUluZm9ybWF0aW9uLT5mdW5jdGlvbkxvY2F0
aW9uSW5CaW5hcnk7Ci0gICAgaWYgKCF0cnlSZXNlcnZlQ2FwYWNpdHkobV93YXNtRXhpdFN0dWJz
LCBtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRGdW5jdGlvblNpZ25hdHVyZUluZGljZXMuc2l6
ZSgpLCAiIFdlYkFzc2VtYmx5IHRvIEphdmFTY3JpcHQgc3R1YnMiKQorICAgIGlmICghdHJ5UmVz
ZXJ2ZUNhcGFjaXR5KG1fd2FzbVRvV2FzbUV4aXRTdHVicywgbV9tb2R1bGVJbmZvcm1hdGlvbi0+
aW1wb3J0RnVuY3Rpb25TaWduYXR1cmVJbmRpY2VzLnNpemUoKSwgIiBXZWJBc3NlbWJseSB0byBK
YXZhU2NyaXB0IHN0dWJzIikKICAgICAgICAgfHwgIXRyeVJlc2VydmVDYXBhY2l0eShtX3VubGlu
a2VkV2FzbVRvV2FzbUNhbGxzLCBmdW5jdGlvbkxvY2F0aW9ucy5zaXplKCksICIgdW5saW5rZWQg
V2ViQXNzZW1ibHkgdG8gV2ViQXNzZW1ibHkgY2FsbHMiKQogICAgICAgICB8fCAhdHJ5UmVzZXJ2
ZUNhcGFjaXR5KG1fd2FzbUludGVybmFsRnVuY3Rpb25zLCBmdW5jdGlvbkxvY2F0aW9ucy5zaXpl
KCksICIgV2ViQXNzZW1ibHkgZnVuY3Rpb25zIikKICAgICAgICAgfHwgIXRyeVJlc2VydmVDYXBh
Y2l0eShtX2NvbXBpbGF0aW9uQ29udGV4dHMsIGZ1bmN0aW9uTG9jYXRpb25zLnNpemUoKSwgIiBj
b21waWxhdGlvbiBjb250ZXh0cyIpKQpAQCAtMTk2LDEwICsxOTYsMTAgQEAgdm9pZCBQbGFuOjpw
cmVwYXJlKCkKICAgICAgICAgSW1wb3J0KiBpbXBvcnQgPSAmbV9tb2R1bGVJbmZvcm1hdGlvbi0+
aW1wb3J0c1tpbXBvcnRJbmRleF07CiAgICAgICAgIGlmIChpbXBvcnQtPmtpbmQgIT0gRXh0ZXJu
YWxLaW5kOjpGdW5jdGlvbikKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB1bnNpZ25l
ZCBpbXBvcnRGdW5jdGlvbkluZGV4ID0gbV93YXNtRXhpdFN0dWJzLnNpemUoKTsKLSAgICAgICAg
ZGF0YUxvZ0xuSWYodmVyYm9zZSwgIlByb2Nlc3NpbmcgaW1wb3J0IGZ1bmN0aW9uIG51bWJlciAi
LCBpbXBvcnRGdW5jdGlvbkluZGV4LCAiOiAiLCBtYWtlU3RyaW5nKGltcG9ydC0+bW9kdWxlKSwg
IjogIiwgbWFrZVN0cmluZyhpbXBvcnQtPmZpZWxkKSk7Ci0gICAgICAgIFNpZ25hdHVyZUluZGV4
IHNpZ25hdHVyZUluZGV4ID0gbV9tb2R1bGVJbmZvcm1hdGlvbi0+aW1wb3J0RnVuY3Rpb25TaWdu
YXR1cmVJbmRpY2VzLmF0KGltcG9ydC0+a2luZEluZGV4KTsKLSAgICAgICAgbV93YXNtRXhpdFN0
dWJzLnVuY2hlY2tlZEFwcGVuZChleGl0U3R1YkdlbmVyYXRvcigmbV92bSwgbV9jYWxsTGlua0lu
Zm9zLCBzaWduYXR1cmVJbmRleCwgaW1wb3J0RnVuY3Rpb25JbmRleCkpOworICAgICAgICB1bnNp
Z25lZCBpbXBvcnRGdW5jdGlvbkluZGV4ID0gbV93YXNtVG9XYXNtRXhpdFN0dWJzLnNpemUoKTsK
KyAgICAgICAgLy9kYXRhTG9nTG5JZih2ZXJib3NlLCAiUHJvY2Vzc2luZyBpbXBvcnQgZnVuY3Rp
b24gbnVtYmVyICIsIGltcG9ydEZ1bmN0aW9uSW5kZXgsICI6ICIsIG1ha2VTdHJpbmcoaW1wb3J0
LT5tb2R1bGUpLCAiOiAiLCBtYWtlU3RyaW5nKGltcG9ydC0+ZmllbGQpKTsKKyAgICAgICAgLy9T
aWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCA9IG1fbW9kdWxlSW5mb3JtYXRpb24tPmltcG9y
dEZ1bmN0aW9uU2lnbmF0dXJlSW5kaWNlcy5hdChpbXBvcnQtPmtpbmRJbmRleCk7CisgICAgICAg
IG1fd2FzbVRvV2FzbUV4aXRTdHVicy51bmNoZWNrZWRBcHBlbmQod2FzbVRvV2FzbShpbXBvcnRG
dW5jdGlvbkluZGV4KSk7CiAgICAgfQogCiAgICAgbW92ZVRvU3RhdGUoU3RhdGU6OlByZXBhcmVk
KTsKQEAgLTI2MCw3ICsyNjAsNyBAQCB2b2lkIFBsYW46OmNvbXBpbGVGdW5jdGlvbnMoQ29tcGls
YXRpb25FCiAgICAgICAgIEFTU0VSVChmdW5jdGlvbkxlbmd0aCA8PSBtX3NvdXJjZUxlbmd0aCk7
CiAgICAgICAgIFNpZ25hdHVyZUluZGV4IHNpZ25hdHVyZUluZGV4ID0gbV9tb2R1bGVJbmZvcm1h
dGlvbi0+aW50ZXJuYWxGdW5jdGlvblNpZ25hdHVyZUluZGljZXNbZnVuY3Rpb25JbmRleF07CiAg
ICAgICAgIGNvbnN0IFNpZ25hdHVyZSYgc2lnbmF0dXJlID0gU2lnbmF0dXJlSW5mb3JtYXRpb246
OmdldChzaWduYXR1cmVJbmRleCk7Ci0gICAgICAgIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFj
ZSA9IG1fd2FzbUV4aXRTdHVicy5zaXplKCkgKyBmdW5jdGlvbkluZGV4OworICAgICAgICB1bnNp
Z25lZCBmdW5jdGlvbkluZGV4U3BhY2UgPSBtX3dhc21Ub1dhc21FeGl0U3R1YnMuc2l6ZSgpICsg
ZnVuY3Rpb25JbmRleDsKICAgICAgICAgQVNTRVJUX1VOVVNFRChmdW5jdGlvbkluZGV4U3BhY2Us
IG1fbW9kdWxlSW5mb3JtYXRpb24tPnNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0aW9uSW5kZXhTcGFj
ZShmdW5jdGlvbkluZGV4U3BhY2UpID09IHNpZ25hdHVyZUluZGV4KTsKICAgICAgICAgQVNTRVJU
KHZhbGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVy
ZSwgbV9tb2R1bGVJbmZvcm1hdGlvbi5nZXQoKSkpOwogCkBAIC0zMTYsOSArMzE2LDkgQEAgdm9p
ZCBQbGFuOjpjb21wbGV0ZShjb25zdCBBYnN0cmFjdExvY2tlcgogICAgICAgICAgICAgICAgIHZv
aWQqIGV4ZWN1dGFibGVBZGRyZXNzOwogICAgICAgICAgICAgICAgIGlmIChtX21vZHVsZUluZm9y
bWF0aW9uLT5pc0ltcG9ydGVkRnVuY3Rpb25Gcm9tRnVuY3Rpb25JbmRleFNwYWNlKGNhbGwuZnVu
Y3Rpb25JbmRleCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgaW1wb3J0cyBjb3Vs
ZCBoYXZlIGJlZW4gbGlua2VkIGluIEIzLCBpbnN0ZWFkIG9mIGdlbmVyYXRpbmcgYSBwYXRjaHBv
aW50LiBUaGlzIGNvbmRpdGlvbiBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBSRUxFQVNFX0FTU0VS
VC4gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2NjQ2MgotICAgICAg
ICAgICAgICAgICAgICBleGVjdXRhYmxlQWRkcmVzcyA9IG1fd2FzbUV4aXRTdHVicy5hdChjYWxs
LmZ1bmN0aW9uSW5kZXgpLndhc21Ub1dhc20uY29kZSgpLmV4ZWN1dGFibGVBZGRyZXNzKCk7Cisg
ICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVBZGRyZXNzID0gbV93YXNtVG9XYXNtRXhpdFN0
dWJzLmF0KGNhbGwuZnVuY3Rpb25JbmRleCkuY29kZSgpLmV4ZWN1dGFibGVBZGRyZXNzKCk7CiAg
ICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVBZGRy
ZXNzID0gbV93YXNtSW50ZXJuYWxGdW5jdGlvbnMuYXQoY2FsbC5mdW5jdGlvbkluZGV4IC0gbV93
YXNtRXhpdFN0dWJzLnNpemUoKSktPndhc21FbnRyeXBvaW50LmNvbXBpbGF0aW9uLT5jb2RlKCku
ZXhlY3V0YWJsZUFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZUFkZHJl
c3MgPSBtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucy5hdChjYWxsLmZ1bmN0aW9uSW5kZXggLSBtX3dh
c21Ub1dhc21FeGl0U3R1YnMuc2l6ZSgpKS0+d2FzbUVudHJ5cG9pbnQuY29tcGlsYXRpb24tPmNv
ZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOwogICAgICAgICAgICAgICAgIE1hY3JvQXNzZW1ibGVy
OjpyZXBhdGNoQ2FsbChjYWxsLmNhbGxMb2NhdGlvbiwgQ29kZUxvY2F0aW9uTGFiZWwoZXhlY3V0
YWJsZUFkZHJlc3MpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzI3LDcgKzMyNyw3
IEBAIHZvaWQgUGxhbjo6Y29tcGxldGUoY29uc3QgQWJzdHJhY3RMb2NrZXIKICAgICBpZiAobV9z
dGF0ZSAhPSBTdGF0ZTo6Q29tcGxldGVkKSB7CiAgICAgICAgIG1vdmVUb1N0YXRlKFN0YXRlOjpD
b21wbGV0ZWQpOwogICAgICAgICBmb3IgKGF1dG8mIHRhc2sgOiBtX2NvbXBsZXRpb25UYXNrcykK
LSAgICAgICAgICAgIHRhc2soKnRoaXMpOworICAgICAgICAgICAgdGFzay5zZWNvbmQoKnRhc2su
Zmlyc3QsIHRoaXMpOwogICAgICAgICBtX2NvbXBsZXRlZC5ub3RpZnlBbGwoKTsKICAgICB9CiB9
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmgJKHJldmlzaW9uIDIxNDk3
MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTQ1LDggKzQ1LDEwIEBAIG5hbWVzcGFjZSBXYXNtIHsKIAogY2xhc3MgUGxhbiA6IHB1
YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxQbGFuPiB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIHZv
aWQgZG9udEZpbmFsaXplKFBsYW4mKSB7IH0KLSAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9p
ZChQbGFuJik+IENvbXBsZXRpb25UYXNrOworICAgIHN0YXRpYyB2b2lkIGRvbnRGaW5hbGl6ZShW
TSYsIFBsYW4qKSB7IH0KKyAgICAvLyBUaGUgcGxhbiBtYXkgb3IgbWF5IG5vdCBiZSBudWxsLCBk
ZXBlbmRpbmcgb24gaG93IGEgQ29tcGxldGlvblRhc2sKKyAgICAvLyBpcyBjYWxsZWQuIE9idmlv
dXNseSBpZiB0aGUgcGxhbiBldmVyIGNhbGxzIHRoZSB0YXNrLCBpdCdsbCBiZSBub24tbnVsbC4K
KyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChWTSYsIFBsYW4qKT4gQ29tcGxldGlvblRh
c2s7CiAgICAgZW51bSBBc3luY1dvcmsgOiB1aW50OF90IHsgRnVsbENvbXBpbGUsIFZhbGlkYXRp
b24gfTsKICAgICAvLyBOb3RlOiBDb21wbGV0aW9uVGFzayBzaG91bGQgbm90IGhvbGQgYSByZWZl
cmVuY2UgdG8gdGhlIFBsYW4gb3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgYSByZWZlcmVuY2UgY3lj
bGUuCiAgICAgUGxhbihWTSYsIFJlZjxNb2R1bGVJbmZvcm1hdGlvbj4sIEFzeW5jV29yaywgQ29t
cGxldGlvblRhc2smJik7CkBAIC01Niw3ICs1OCw5IEBAIHB1YmxpYzoKICAgICBKU19FWFBPUlRf
UFJJVkFURSBQbGFuKFZNJiwgY29uc3QgdWludDhfdCosIHNpemVfdCwgQXN5bmNXb3JrLCBDb21w
bGV0aW9uVGFzayYmKTsKICAgICBKU19FWFBPUlRfUFJJVkFURSB+UGxhbigpOwogCi0gICAgdm9p
ZCBhZGRDb21wbGV0aW9uVGFzayhDb21wbGV0aW9uVGFzayYmKTsKKyAgICAvLyBJZiB5b3UgZ3Vh
cmFudGVlIHRoZSBvcmRlcmluZyBoZXJlLCB5b3UgY2FuIHJlbHkgb24gRklGTyBvZiB0aGUKKyAg
ICAvLyBjb21wbGV0aW9uIHRhc2tzIGJlaW5nIGNhbGxlZC4KKyAgICB2b2lkIGFkZENvbXBsZXRp
b25UYXNrKFZNJiwgQ29tcGxldGlvblRhc2smJik7CiAKICAgICBib29sIHBhcnNlQW5kVmFsaWRh
dGVNb2R1bGUoKTsKIApAQCAtOTEsMTAgKzk1LDEwIEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJu
IFdURk1vdmUobV9jYWxsTGlua0luZm9zKTsKICAgICB9CiAKLSAgICBWZWN0b3I8V2FzbUV4aXRT
dHVicz4mJiB0YWtlV2FzbUV4aXRTdHVicygpCisgICAgVmVjdG9yPE1hY3JvQXNzZW1ibGVyQ29k
ZVJlZj4mJiB0YXNrV2FzbVRvV2FzbUV4aXRTdHVicygpCiAgICAgewogICAgICAgICBSRUxFQVNF
X0FTU0VSVCghZmFpbGVkKCkgJiYgIWhhc1dvcmsoKSk7Ci0gICAgICAgIHJldHVybiBXVEZNb3Zl
KG1fd2FzbUV4aXRTdHVicyk7CisgICAgICAgIHJldHVybiBXVEZNb3ZlKG1fd2FzbVRvV2FzbUV4
aXRTdHVicyk7CiAgICAgfQogCiAgICAgdm9pZCBzZXRNb2RlKE1lbW9yeU1vZGUgbW9kZSkgeyBt
X21vZGUgPSBtb2RlOyB9CkBAIC0xMzEsMTIgKzEzNSwxMiBAQCBwcml2YXRlOgogCiAgICAgUmVm
PE1vZHVsZUluZm9ybWF0aW9uPiBtX21vZHVsZUluZm9ybWF0aW9uOwogICAgIEJhZzxDYWxsTGlu
a0luZm8+IG1fY2FsbExpbmtJbmZvczsKLSAgICBWZWN0b3I8V2FzbUV4aXRTdHVicz4gbV93YXNt
RXhpdFN0dWJzOworICAgIFZlY3RvcjxNYWNyb0Fzc2VtYmxlckNvZGVSZWY+IG1fd2FzbVRvV2Fz
bUV4aXRTdHViczsKICAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFdhc21JbnRlcm5hbEZ1bmN0
aW9uPj4gbV93YXNtSW50ZXJuYWxGdW5jdGlvbnM7CiAgICAgVmVjdG9yPENvbXBpbGF0aW9uQ29u
dGV4dD4gbV9jb21waWxhdGlvbkNvbnRleHRzOwogCiAgICAgVk0mIG1fdm07Ci0gICAgVmVjdG9y
PENvbXBsZXRpb25UYXNrLCAxPiBtX2NvbXBsZXRpb25UYXNrczsKKyAgICBWZWN0b3I8c3RkOjpw
YWlyPFZNKiwgQ29tcGxldGlvblRhc2s+LCAxPiBtX2NvbXBsZXRpb25UYXNrczsKIAogICAgIFZl
Y3RvcjxWZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4+IG1fdW5saW5rZWRXYXNtVG9XYXNt
Q2FsbHM7CiAgICAgY29uc3QgdWludDhfdCogbV9zb3VyY2U7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5Q29kZUJsb2NrLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5Q29kZUJsb2NrLmNw
cAkocmV2aXNpb24gMjE0OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNX
ZWJBc3NlbWJseUNvZGVCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDI0ICszMiwyNyBA
QAogI2luY2x1ZGUgIkpTV2ViQXNzZW1ibHlMaW5rRXJyb3IuaCIKICNpbmNsdWRlICJKU1dlYkFz
c2VtYmx5TWVtb3J5LmgiCiAjaW5jbHVkZSAiSlNXZWJBc3NlbWJseU1vZHVsZS5oIgorI2luY2x1
ZGUgIldhc21CaW5kaW5nLmgiCiAjaW5jbHVkZSAiV2FzbVBsYW5JbmxpbmVzLmgiCiAKIG5hbWVz
cGFjZSBKU0MgewogCiBjb25zdCBDbGFzc0luZm8gSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6c19p
bmZvID0geyAiV2ViQXNzZW1ibHlDb2RlQmxvY2siLCBudWxscHRyLCAwLCBDUkVBVEVfTUVUSE9E
X1RBQkxFKEpTV2ViQXNzZW1ibHlDb2RlQmxvY2spIH07CiAKLUpTV2ViQXNzZW1ibHlDb2RlQmxv
Y2s6OkpTV2ViQXNzZW1ibHlDb2RlQmxvY2soVk0mIHZtLCBKU1dlYkFzc2VtYmx5TW9kdWxlKiBv
d25lciwgIFdhc206Ok1lbW9yeU1vZGUgbW9kZSwgUmVmPFdhc206OlBsYW4+JiYgcGxhbiwgdW5z
aWduZWQgY2FsbGVlQ291bnQpCitKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpKU1dlYkFzc2VtYmx5
Q29kZUJsb2NrKFZNJiB2bSwgUmVmPFdhc206OkNvZGVCbG9jaz4mJiBjb2RlQmxvY2ssIGNvbnN0
IFdhc206Ok1vZHVsZUluZm9ybWF0aW9uJiBtb2R1bGVJbmZvcm1hdGlvbikKICAgICA6IEJhc2Uo
dm0sIHZtLndlYkFzc2VtYmx5Q29kZUJsb2NrU3RydWN0dXJlLmdldCgpKQotICAgICwgbV9wbGFu
KFdURk1vdmUocGxhbikpCi0gICAgLCBtX21vZGUobW9kZSkKLSAgICAsIG1fY2FsbGVlQ291bnQo
Y2FsbGVlQ291bnQpCi17Ci0gICAgbV9tb2R1bGUuc2V0KHZtLCB0aGlzLCBvd25lcik7Ci0gICAg
QVNTRVJUKCFtb2R1bGUoKS0+Y29kZUJsb2NrKG1vZGUpKTsKLSAgICBtb2R1bGUoKS0+c2V0Q29k
ZUJsb2NrKHZtLCBtb2RlLCB0aGlzKTsKLSAgICBtX2NhbGxlZXMucmVzaXplKG1fY2FsbGVlQ291
bnQgKiAyKTsKKyAgICAsIG1fY29kZUJsb2NrKFdURk1vdmUoY29kZUJsb2NrKSkKK3sKKyAgICAv
LyBGSVhNRTogYWxsb2NhdGUgY2FsbCBsaW5rIGluZm9zIGhlcmUuCisgICAgbV93YXNtVG9KU0V4
aXRTdHVicy5yZXNlcnZlQ2FwYWNpdHkobV9jb2RlQmxvY2stPmZ1bmN0aW9uSW1wb3J0Q291bnQo
KSk7CisgICAgZm9yICh1bnNpZ25lZCBpbXBvcnRJbmRleCA9IDA7IGltcG9ydEluZGV4IDwgbV9j
b2RlQmxvY2stPmZ1bmN0aW9uSW1wb3J0Q291bnQoKTsgKytpbXBvcnRJbmRleCkgeworICAgICAg
ICBXYXNtOjpTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCA9IG1vZHVsZUluZm9ybWF0aW9u
LmltcG9ydEZ1bmN0aW9uU2lnbmF0dXJlSW5kaWNlcy5hdChpbXBvcnRJbmRleCk7CisgICAgICAg
IG1fd2FzbVRvSlNFeGl0U3R1YnMudW5jaGVja2VkQXBwZW5kKFdhc206Ondhc21Ub0pzKCZ2bSwg
bV9jYWxsTGlua0luZm9zLCBzaWduYXR1cmVJbmRleCwgaW1wb3J0SW5kZXgpKTsKKyAgICAgICAg
aW1wb3J0V2FzbVRvSlNTdHViKGltcG9ydEluZGV4KSA9IG1fd2FzbVRvSlNFeGl0U3R1YnNbaW1w
b3J0SW5kZXhdLmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOworICAgIH0KIH0KIAorLyoKIHZv
aWQgSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6aW5pdGlhbGl6ZSgpCiB7CiAgICAgaWYgKGluaXRp
YWxpemVkKCkpCkBAIC04Miw2ICs4NSw3IEBAIHZvaWQgSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6
aW5pdGlhbGl6ZSgKIAogICAgIG1fcGxhbiA9IG51bGxwdHI7CiB9CisqLwogCiB2b2lkIEpTV2Vi
QXNzZW1ibHlDb2RlQmxvY2s6OmRlc3Ryb3koSlNDZWxsKiBjZWxsKQogewpAQCAtOTAsMjQgKzk0
LDcgQEAgdm9pZCBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpkZXN0cm95KEpTQwogCiBib29sIEpT
V2ViQXNzZW1ibHlDb2RlQmxvY2s6OmlzU2FmZVRvUnVuKEpTV2ViQXNzZW1ibHlNZW1vcnkqIG1l
bW9yeSkgY29uc3QKIHsKLSAgICBpZiAoIXJ1bm5hYmxlKCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIFdhc206Ok1lbW9yeU1vZGUgY29kZU1vZGUgPSBtb2RlKCk7Ci0gICAgV2FzbTo6
TWVtb3J5TW9kZSBtZW1vcnlNb2RlID0gbWVtb3J5LT5tZW1vcnkoKS5tb2RlKCk7Ci0gICAgc3dp
dGNoIChjb2RlTW9kZSkgewotICAgIGNhc2UgV2FzbTo6TWVtb3J5TW9kZTo6Qm91bmRzQ2hlY2tp
bmc6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgV2FzbTo6TWVtb3J5TW9kZTo6U2ln
bmFsaW5nOgotICAgICAgICAvLyBDb2RlIGJlaW5nIGluIFNpZ25hbGluZyBtb2RlIG1lYW5zIHRo
YXQgaXQgcGVyZm9ybXMgbm8gYm91bmRzIGNoZWNrcy4KLSAgICAgICAgLy8gSXRzIG1lbW9yeSwg
ZXZlbiBpZiBlbXB0eSwgYWJzb2x1dGVseSBtdXN0IGFsc28gYmUgaW4gU2lnbmFsaW5nIG1vZGUK
LSAgICAgICAgLy8gYmVjYXVzZSB0aGUgcGFnZSBwcm90ZWN0aW9uIGRldGVjdHMgb3V0LW9mLWJv
dW5kcyBhY2Nlc3Nlcy4KLSAgICAgICAgcmV0dXJuIG1lbW9yeU1vZGUgPT0gV2FzbTo6TWVtb3J5
TW9kZTo6U2lnbmFsaW5nOwotICAgIGNhc2UgV2FzbTo6TWVtb3J5TW9kZTo6TnVtYmVyT2ZNZW1v
cnlNb2RlczoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFJFTEVBU0VfQVNTRVJUX05PVF9S
RUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBtX2NvZGVCbG9jay0+aXNT
YWZlVG9SdW4obWVtb3J5LT5tZW1vcnkoKS5tb2RlKCkpOwogfQogCiB2b2lkIEpTV2ViQXNzZW1i
bHlDb2RlQmxvY2s6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZWxsLCBTbG90VmlzaXRvciYgdmlz
aXRvcikKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlD
b2RlQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9K
U1dlYkFzc2VtYmx5Q29kZUJsb2NrLmgJKHJldmlzaW9uIDIxNDk3MikKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlDb2RlQmxvY2suaAkod29ya2luZyBjb3B5
KQpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgIlVuY29uZGl0aW9uYWxGaW5hbGl6ZXIuaCIK
ICNpbmNsdWRlICJXYXNtQ2FsbGVlLmgiCiAjaW5jbHVkZSAiV2FzbUZvcm1hdC5oIgorI2luY2x1
ZGUgIldhc21Nb2R1bGUuaCIKICNpbmNsdWRlIDx3dGYvQmFnLmg+CiAjaW5jbHVkZSA8d3RmL1Zl
Y3Rvci5oPgogCkBAIC01MCw5ICs1MSw5IEBAIHB1YmxpYzoKICAgICB0eXBlZGVmIEpTQ2VsbCBC
YXNlOwogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEJhc2U6OlN0
cnVjdHVyZUZsYWdzIHwgU3RydWN0dXJlSXNJbW1vcnRhbDsKIAotICAgIHN0YXRpYyBKU1dlYkFz
c2VtYmx5Q29kZUJsb2NrKiBjcmVhdGUoVk0mIHZtLCBKU1dlYkFzc2VtYmx5TW9kdWxlKiBvd25l
ciwgV2FzbTo6TWVtb3J5TW9kZSBtb2RlLCBSZWY8V2FzbTo6UGxhbj4mJiBwbGFuLCB1bnNpZ25l
ZCBjYWxsZWVDb3VudCwgdW5zaWduZWQgZnVuY3Rpb25JbXBvcnRDb3VudCkKKyAgICBzdGF0aWMg
SlNXZWJBc3NlbWJseUNvZGVCbG9jayogY3JlYXRlKFZNJiB2bSwgUmVmPFdhc206OkNvZGVCbG9j
az4gY29kZUJsb2NrLCBjb25zdCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5mb3Jt
YXRpb24pCiAgICAgewotICAgICAgICBhdXRvKiByZXN1bHQgPSBuZXcgKE5vdE51bGwsIGFsbG9j
YXRlQ2VsbDxKU1dlYkFzc2VtYmx5Q29kZUJsb2NrPih2bS5oZWFwLCBhbGxvY2F0aW9uU2l6ZShm
dW5jdGlvbkltcG9ydENvdW50KSkpIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2sodm0sIG93bmVyLCBt
b2RlLCBXVEZNb3ZlKHBsYW4pLCBjYWxsZWVDb3VudCk7CisgICAgICAgIGF1dG8qIHJlc3VsdCA9
IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s+KHZtLmhl
YXAsIGFsbG9jYXRpb25TaXplKG1vZHVsZUluZm9ybWF0aW9uLmltcG9ydEZ1bmN0aW9uQ291bnQo
KSkpKSBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrKHZtLCBXVEZNb3ZlKGNvZGVCbG9jayksIG1vZHVs
ZUluZm9ybWF0aW9uKTsKICAgICAgICAgcmVzdWx0LT5maW5pc2hDcmVhdGlvbih2bSk7CiAgICAg
ICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNjIsNDAgKzYzLDMzIEBAIHB1YmxpYzoKICAg
ICAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvdHlw
ZSwgVHlwZUluZm8oQ2VsbFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKICAgICB9CiAK
LSAgICB1bnNpZ25lZCBmdW5jdGlvbkltcG9ydENvdW50KCkgY29uc3QgeyByZXR1cm4gbV93YXNt
RXhpdFN0dWJzLnNpemUoKTsgfQotICAgIFdhc206Ok1lbW9yeU1vZGUgbW9kZSgpIGNvbnN0IHsg
cmV0dXJuIG1fbW9kZTsgfQorICAgIHVuc2lnbmVkIGZ1bmN0aW9uSW1wb3J0Q291bnQoKSBjb25z
dCB7IHJldHVybiBtX2NvZGVCbG9jay0+ZnVuY3Rpb25JbXBvcnRDb3VudCgpOyB9CisgICAgLy9X
YXNtOjpNZW1vcnlNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KICAgICBKU1dl
YkFzc2VtYmx5TW9kdWxlKiBtb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX21vZHVsZS5nZXQoKTsg
fQogCiAgICAgLy8gRG9uJ3QgY2FsbCBpbnRpYWxpemUgZGlyZWN0bHksIHRoaXMgc2hvdWxkIGJl
IGNhbGxlZCBmb3IgeW91LCBhcyBuZWVkZWQsIGJ5IEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6Zmlu
YWxpemVDcmVhdGlvbi4KLSAgICB2b2lkIGluaXRpYWxpemUoKTsKLSAgICBib29sIGluaXRpYWxp
emVkKCkgY29uc3QgeyByZXR1cm4gIW1fcGxhbjsgfQorICAgIC8vdm9pZCBpbml0aWFsaXplKCk7
CisgICAgLy9ib29sIGluaXRpYWxpemVkKCkgY29uc3QgeyByZXR1cm4gIW1fcGxhbjsgfQogCi0g
ICAgV2FzbTo6UGxhbiYgcGxhbigpIGNvbnN0IHsgQVNTRVJUKCFpbml0aWFsaXplZCgpKTsgcmV0
dXJuICptX3BsYW47IH0KKyAgICAvL1dhc206OlBsYW4mIHBsYW4oKSBjb25zdCB7IEFTU0VSVCgh
aW5pdGlhbGl6ZWQoKSk7IHJldHVybiAqbV9wbGFuOyB9CiAKLSAgICBib29sIHJ1bm5hYmxlKCkg
Y29uc3QgeyByZXR1cm4gaW5pdGlhbGl6ZWQoKSAmJiAhbV9lcnJvck1lc3NhZ2U7IH0KLSAgICBT
dHJpbmcmIGVycm9yTWVzc2FnZSgpIHsgQVNTRVJUKCFydW5uYWJsZSgpKTsgcmV0dXJuIG1fZXJy
b3JNZXNzYWdlOyB9CisgICAgLy9ib29sIHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gaW5pdGlh
bGl6ZWQoKSAmJiAhbV9lcnJvck1lc3NhZ2U7IH0KICAgICBib29sIGlzU2FmZVRvUnVuKEpTV2Vi
QXNzZW1ibHlNZW1vcnkqKSBjb25zdDsKIAogICAgIC8vIFRoZXNlIHR3byBjYWxsZWUgZ2V0dGVy
cyBhcmUgb25seSB2YWxpZCBvbmNlIHRoZSBjYWxsZWVzIGhhdmUgYmVlbiBwb3B1bGF0ZWQuCisK
ICAgICBXYXNtOjpDYWxsZWUmIGpzRW50cnlwb2ludENhbGxlZUZyb21GdW5jdGlvbkluZGV4U3Bh
Y2UodW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlKQogICAgIHsKLSAgICAgICAgUkVMRUFTRV9B
U1NFUlQoZnVuY3Rpb25JbmRleFNwYWNlID49IGZ1bmN0aW9uSW1wb3J0Q291bnQoKSk7Ci0gICAg
ICAgIHVuc2lnbmVkIGNhbGxlZUluZGV4ID0gZnVuY3Rpb25JbmRleFNwYWNlIC0gZnVuY3Rpb25J
bXBvcnRDb3VudCgpOwotICAgICAgICBSRUxFQVNFX0FTU0VSVChjYWxsZWVJbmRleCA8IG1fY2Fs
bGVlQ291bnQpOwotICAgICAgICByZXR1cm4gKm1fY2FsbGVlc1tjYWxsZWVJbmRleF0uZ2V0KCk7
CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9jay0+anNFbnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0
aW9uSW5kZXhTcGFjZShmdW5jdGlvbkluZGV4U3BhY2UpOwogICAgIH0KICAgICBXYXNtOjpDYWxs
ZWUmIHdhc21FbnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSh1bnNpZ25lZCBm
dW5jdGlvbkluZGV4U3BhY2UpCiAgICAgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChmdW5jdGlv
bkluZGV4U3BhY2UgPj0gZnVuY3Rpb25JbXBvcnRDb3VudCgpKTsKLSAgICAgICAgdW5zaWduZWQg
Y2FsbGVlSW5kZXggPSBmdW5jdGlvbkluZGV4U3BhY2UgLSBmdW5jdGlvbkltcG9ydENvdW50KCk7
Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGNhbGxlZUluZGV4IDwgbV9jYWxsZWVDb3VudCk7Ci0g
ICAgICAgIHJldHVybiAqbV9jYWxsZWVzW2NhbGxlZUluZGV4ICsgbV9jYWxsZWVDb3VudF0uZ2V0
KCk7CisgICAgICAgIHJldHVybiBtX2NvZGVCbG9jay0+anNFbnRyeXBvaW50Q2FsbGVlRnJvbUZ1
bmN0aW9uSW5kZXhTcGFjZShmdW5jdGlvbkluZGV4U3BhY2UpOwogICAgIH0KIAogICAgIHZvaWQq
IHdhc21Ub0pzQ2FsbFN0dWJGb3JJbXBvcnQodW5zaWduZWQgaW1wb3J0SW5kZXgpCiAgICAgewot
ICAgICAgICBSRUxFQVNFX0FTU0VSVChpbXBvcnRJbmRleCA8IG1fd2FzbUV4aXRTdHVicy5zaXpl
KCkpOwotICAgICAgICByZXR1cm4gbV93YXNtRXhpdFN0dWJzW2ltcG9ydEluZGV4XS53YXNtVG9K
cy5jb2RlKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKKyAgICAgICAgcmV0dXJuIG1fY29kZUJsb2Nr
LT53YXNtVG9Kc0NhbGxTdHViRm9ySW1wb3J0KGltcG9ydEluZGV4KTsKICAgICB9CiAKICAgICBz
dGF0aWMgcHRyZGlmZl90IG9mZnNldE9mSW1wb3J0V2FzbVRvSlNTdHViKHVuc2lnbmVkIGltcG9y
dEluZGV4KQpAQCAtMTA0LDE4ICs5OCw3IEBAIHB1YmxpYzoKICAgICB9CiAKIHByaXZhdGU6Ci0g
ICAgdm9pZCBzZXRKU0VudHJ5cG9pbnRDYWxsZWUodW5zaWduZWQgY2FsbGVlSW5kZXgsIFJlZjxX
YXNtOjpDYWxsZWU+JiYgY2FsbGVlKQotICAgIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoY2Fs
bGVlSW5kZXggPCBtX2NhbGxlZUNvdW50KTsKLSAgICAgICAgbV9jYWxsZWVzW2NhbGxlZUluZGV4
XSA9IFdURk1vdmUoY2FsbGVlKTsKLSAgICB9Ci0gICAgdm9pZCBzZXRXYXNtRW50cnlwb2ludENh
bGxlZSh1bnNpZ25lZCBjYWxsZWVJbmRleCwgUmVmPFdhc206OkNhbGxlZT4mJiBjYWxsZWUpCi0g
ICAgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChjYWxsZWVJbmRleCA8IG1fY2FsbGVlQ291bnQp
OwotICAgICAgICBtX2NhbGxlZXNbY2FsbGVlSW5kZXggKyBtX2NhbGxlZUNvdW50XSA9IFdURk1v
dmUoY2FsbGVlKTsKLSAgICB9Ci0KLSAgICBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrKFZNJiwgSlNX
ZWJBc3NlbWJseU1vZHVsZSosIFdhc206Ok1lbW9yeU1vZGUsIFJlZjxXYXNtOjpQbGFuPiYmLCB1
bnNpZ25lZCBjYWxsZWVDb3VudCk7CisgICAgSlNXZWJBc3NlbWJseUNvZGVCbG9jayhWTSYsIFJl
ZjxXYXNtOjpDb2RlQmxvY2s+JiYsIGNvbnN0IFdhc206Ok1vZHVsZUluZm9ybWF0aW9uJik7CiAg
ICAgREVDTEFSRV9FWFBPUlRfSU5GTzsKICAgICBzdGF0aWMgY29uc3QgYm9vbCBuZWVkc0Rlc3Ry
dWN0aW9uID0gdHJ1ZTsKICAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwpAQCAtMTQx
LDE1ICsxMjQsMTAgQEAgcHJpdmF0ZToKICAgICB9OwogCiAgICAgV3JpdGVCYXJyaWVyPEpTV2Vi
QXNzZW1ibHlNb2R1bGU+IG1fbW9kdWxlOworICAgIFJlZjxXYXNtOjpDb2RlQmxvY2s+IG1fY29k
ZUJsb2NrOworICAgIFZlY3RvcjxNYWNyb0Fzc2VtYmxlckNvZGVSZWY+IG1fd2FzbVRvSlNFeGl0
U3R1YnM7CiAgICAgVW5jb25kaXRpb25hbEZpbmFsaXplciBtX3VuY29uZGl0aW9uYWxGaW5hbGl6
ZXI7CiAgICAgQmFnPENhbGxMaW5rSW5mbz4gbV9jYWxsTGlua0luZm9zOwotICAgIFZlY3RvcjxX
YXNtOjpXYXNtRXhpdFN0dWJzPiBtX3dhc21FeGl0U3R1YnM7Ci0gICAgVmVjdG9yPFJlZlB0cjxX
YXNtOjpDYWxsZWU+PiBtX2NhbGxlZXM7Ci0gICAgLy8gVGhlIHBsYW4gdGhhdCBpcyBjb21waWxp
bmcgdGhpcyBjb2RlIGJsb2NrLgotICAgIFJlZlB0cjxXYXNtOjpQbGFuPiBtX3BsYW47Ci0gICAg
U3RyaW5nIG1fZXJyb3JNZXNzYWdlOwotICAgIFdhc206Ok1lbW9yeU1vZGUgbV9tb2RlOwotICAg
IHVuc2lnbmVkIG1fY2FsbGVlQ291bnQ7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlJbnN0YW5jZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJs
eUluc3RhbmNlLmNwcAkocmV2aXNpb24gMjE0OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTQs
NiArOTQsNyBAQCB2b2lkIEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6dmlzaXRDaGlsZHJlCiAgICAg
ICAgIHZpc2l0b3IuYXBwZW5kKHRoaXNPYmplY3QtPmltcG9ydEZ1bmN0aW9ucygpW2ldKTsKIH0K
IAorLyoKIHZvaWQgSlNXZWJBc3NlbWJseUluc3RhbmNlOjphZGRVbml0aWFsaXplZENvZGVCbG9j
ayhWTSYgdm0sIFJlZjxXYXNtOjpQbGFuPiBwbGFuKQogewogICAgIGF1dG8qIGNvZGVCbG9jayA9
IEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6OmNyZWF0ZSgKQEAgLTEwMSwxNyArMTAyLDIxIEBAIHZv
aWQgSlNXZWJBc3NlbWJseUluc3RhbmNlOjphZGRVbml0aWFsaXoKICAgICBtX2NvZGVCbG9jay5z
ZXQodm0sIHRoaXMsIGNvZGVCbG9jayk7CiAgICAgQVNTRVJUKCFjb2RlQmxvY2stPmluaXRpYWxp
emVkKCkpOwogfQorKi8KIAotdm9pZCBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmZpbmFsaXplQ3Jl
YXRpb24oVk0mIHZtLCBFeGVjU3RhdGUqIGV4ZWMpCit2b2lkIEpTV2ViQXNzZW1ibHlJbnN0YW5j
ZTo6ZmluYWxpemVDcmVhdGlvbihWTSYgdm0sIEV4ZWNTdGF0ZSogZXhlYywgUmVmPFdhc206OkNv
ZGVCbG9jaz4mJiB3YXNtQ29kZUJsb2NrKQogewogICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RI
Uk9XX1NDT1BFKHZtKTsKLSAgICBjb2RlQmxvY2soKS0+aW5pdGlhbGl6ZSgpOwotCi0gICAgaWYg
KCFjb2RlQmxvY2soKS0+cnVubmFibGUoKSkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGVj
LCBzY29wZSwgSlNXZWJBc3NlbWJseUxpbmtFcnJvcjo6Y3JlYXRlKGV4ZWMsIHZtLCBnbG9iYWxP
YmplY3QoKS0+V2ViQXNzZW1ibHlMaW5rRXJyb3JTdHJ1Y3R1cmUoKSwgY29kZUJsb2NrKCktPmVy
cm9yTWVzc2FnZSgpKSk7CisgICAgaWYgKCF3YXNtQ29kZUJsb2NrLT5ydW5uYWJsZSgpKSB7Cisg
ICAgICAgIC8vIEZJWE1FOiBmaW5kIGEgdGhyZWFkIHNhZmUgd2F5IHRvIGdldCB0aGUgZXJyb3Ig
bWVzc2FnZSEKKyAgICAgICAgLy90aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwgSlNXZWJBc3Nl
bWJseUxpbmtFcnJvcjo6Y3JlYXRlKGV4ZWMsIHZtLCBnbG9iYWxPYmplY3QoKS0+V2ViQXNzZW1i
bHlMaW5rRXJyb3JTdHJ1Y3R1cmUoKSwgY29kZUJsb2NrKCktPmVycm9yTWVzc2FnZSgpKSk7Cisg
ICAgICAgIHRocm93RXhjZXB0aW9uKGV4ZWMsIHNjb3BlLCBKU1dlYkFzc2VtYmx5TGlua0Vycm9y
OjpjcmVhdGUoZXhlYywgdm0sIGdsb2JhbE9iamVjdCgpLT5XZWJBc3NlbWJseUxpbmtFcnJvclN0
cnVjdHVyZSgpLCBBU0NJSUxpdGVyYWwoIkZJWE1FOiBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBoZXJl
IikpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBSRUxFQVNFX0FTU0VSVChjb2RlQmxv
Y2soKS0+aXNTYWZlVG9SdW4obWVtb3J5KCkpKTsKKworICAgIFJFTEVBU0VfQVNTRVJUKHdhc21D
b2RlQmxvY2stPmlzU2FmZVRvUnVuKG1lbW9yeSgpLT5tZW1vcnkoKS5tb2RlKCkpKTsKKyAgICBt
X2NvZGVCbG9jay5zZXQodm0sIHRoaXMsCisgICAgICAgIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6
OmNyZWF0ZSh2bSwgd2FzbUNvZGVCbG9jay5jb3B5UmVmKCksIG1fbW9kdWxlLT5tb2R1bGUoKS5t
b2R1bGVJbmZvcm1hdGlvbigpKSk7CiAKICAgICBhdXRvKiBtb2R1bGVSZWNvcmQgPSBqc0Nhc3Q8
V2ViQXNzZW1ibHlNb2R1bGVSZWNvcmQqPihtX21vZHVsZU5hbWVzcGFjZU9iamVjdC0+bW9kdWxl
UmVjb3JkKCkpOwogICAgIG1vZHVsZVJlY29yZC0+bGluayhleGVjLCBtb2R1bGUoKSwgdGhpcyk7
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5SW5zdGFu
Y2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFz
c2VtYmx5SW5zdGFuY2UuaAkocmV2aXNpb24gMjE0OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTM5
LDExICszOSw2IEBAIGNsYXNzIEpTTW9kdWxlTmFtZXNwYWNlT2JqZWN0OwogY2xhc3MgSlNXZWJB
c3NlbWJseU1vZHVsZTsKIGNsYXNzIFdlYkFzc2VtYmx5VG9KU0NhbGxlZTsKIAotbmFtZXNwYWNl
IFdhc20gewotY2xhc3MgUGxhbjsKLX0KLQotCiBjbGFzcyBKU1dlYkFzc2VtYmx5SW5zdGFuY2Ug
OiBwdWJsaWMgSlNEZXN0cnVjdGlibGVPYmplY3QgewogcHVibGljOgogICAgIHR5cGVkZWYgSlNE
ZXN0cnVjdGlibGVPYmplY3QgQmFzZTsKQEAgLTU0LDkgKzQ5LDkgQEAgcHVibGljOgogICAgIERF
Q0xBUkVfRVhQT1JUX0lORk87CiAKICAgICBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrKiBjb2RlQmxv
Y2soKSBjb25zdCB7IHJldHVybiBtX2NvZGVCbG9jay5nZXQoKTsgfQotICAgIGJvb2wgaW5pdGlh
bGl6ZWQoKSBjb25zdCB7IHJldHVybiBjb2RlQmxvY2soKSAmJiBjb2RlQmxvY2soKS0+aW5pdGlh
bGl6ZWQoKTsgfQotICAgIHZvaWQgYWRkVW5pdGlhbGl6ZWRDb2RlQmxvY2soVk0mLCBSZWY8V2Fz
bTo6UGxhbj4pOwotICAgIHZvaWQgZmluYWxpemVDcmVhdGlvbihWTSYsIEV4ZWNTdGF0ZSopOwor
ICAgIC8vYm9vbCBpbml0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIGNvZGVCbG9jaygpICYmIGNv
ZGVCbG9jaygpLT5pbml0aWFsaXplZCgpOyB9CisgICAgLy92b2lkIGFkZFVuaXRpYWxpemVkQ29k
ZUJsb2NrKFZNJiwgUmVmPFdhc206OlBsYW4+KTsKKyAgICB2b2lkIGZpbmFsaXplQ3JlYXRpb24o
Vk0mLCBFeGVjU3RhdGUqLCBSZWY8V2FzbTo6Q29kZUJsb2NrPiYmKTsKIAogICAgIEpTV2ViQXNz
ZW1ibHlNb2R1bGUqIG1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fbW9kdWxlLmdldCgpOyB9CiAK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlNb2R1bGUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNz
ZW1ibHlNb2R1bGUuY3BwCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5TW9kdWxlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzYs
NiArMzYsNyBAQAogI2luY2x1ZGUgIldhc21Gb3JtYXQuaCIKICNpbmNsdWRlICJXYXNtTWVtb3J5
LmgiCiAjaW5jbHVkZSAiV2FzbVBsYW4uaCIKKyNpbmNsdWRlICJXYXNtTW9kdWxlLmgiCiAjaW5j
bHVkZSAiV2ViQXNzZW1ibHlUb0pTQ2FsbGVlLmgiCiAjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJh
cy5oPgogCkBAIC00Myw3ICs0NCw3IEBAIG5hbWVzcGFjZSBKU0MgewogCiBjb25zdCBDbGFzc0lu
Zm8gSlNXZWJBc3NlbWJseU1vZHVsZTo6c19pbmZvID0geyAiV2ViQXNzZW1ibHkuTW9kdWxlIiwg
JkJhc2U6OnNfaW5mbywgbnVsbHB0ciwgQ1JFQVRFX01FVEhPRF9UQUJMRShKU1dlYkFzc2VtYmx5
TW9kdWxlKSB9OwogCi1KU1dlYkFzc2VtYmx5TW9kdWxlKiBKU1dlYkFzc2VtYmx5TW9kdWxlOjpj
cmVhdGVTdHViKFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwg
UmVmUHRyPFdhc206OlBsYW4+JiYgcGxhbikKK0pTV2ViQXNzZW1ibHlNb2R1bGUqIEpTV2ViQXNz
ZW1ibHlNb2R1bGU6OmNyZWF0ZVN0dWIoVk0mIHZtLCBFeGVjU3RhdGUqIGV4ZWMsIFN0cnVjdHVy
ZSogc3RydWN0dXJlLCBSZWY8V2FzbTo6UGxhbj4mJiBwbGFuKQogewogICAgIEFTU0VSVCghcGxh
bi0+aGFzV29yaygpKTsKICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7
CkBAIC01Miw3ICs1Myw3IEBAIEpTV2ViQXNzZW1ibHlNb2R1bGUqIEpTV2ViQXNzZW1ibHlNb2R1
bGUKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogCi0gICAgYXV0byogbW9kdWxlID0g
bmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8SlNXZWJBc3NlbWJseU1vZHVsZT4odm0uaGVhcCkp
IEpTV2ViQXNzZW1ibHlNb2R1bGUodm0sIHN0cnVjdHVyZSwgKnBsYW4uZ2V0KCkpOworICAgIGF1
dG8qIG1vZHVsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPEpTV2ViQXNzZW1ibHlNb2R1
bGU+KHZtLmhlYXApKSBKU1dlYkFzc2VtYmx5TW9kdWxlKHZtLCBzdHJ1Y3R1cmUsIFdhc206Ok1v
ZHVsZTo6Y3JlYXRlKHBsYW4tPnRha2VNb2R1bGVJbmZvcm1hdGlvbigpKSk7CiAgICAgbW9kdWxl
LT5maW5pc2hDcmVhdGlvbih2bSk7CiAgICAgcmV0dXJuIG1vZHVsZTsKIH0KQEAgLTYyLDkgKzYz
LDkgQEAgU3RydWN0dXJlKiBKU1dlYkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdAogICAgIHJldHVy
biBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90b3R5cGUsIFR5cGVJbmZv
KE9iamVjdFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKIH0KIAotSlNXZWJBc3NlbWJs
eU1vZHVsZTo6SlNXZWJBc3NlbWJseU1vZHVsZShWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJl
LCBXYXNtOjpQbGFuJiBwbGFuKQorSlNXZWJBc3NlbWJseU1vZHVsZTo6SlNXZWJBc3NlbWJseU1v
ZHVsZShWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJlLCBSZWY8V2FzbTo6TW9kdWxlPiYmIG1v
ZHVsZSkKICAgICA6IEJhc2Uodm0sIHN0cnVjdHVyZSkKLSAgICAsIG1fbW9kdWxlSW5mb3JtYXRp
b24ocGxhbi50YWtlTW9kdWxlSW5mb3JtYXRpb24oKSkKKyAgICAsIG1fbW9kdWxlKFdURk1vdmUo
bW9kdWxlKSkKIHsKIH0KIApAQCAtNzUsNyArNzYsOCBAQCB2b2lkIEpTV2ViQXNzZW1ibHlNb2R1
bGU6OmZpbmlzaENyZWF0aW9uCiAKICAgICAvLyBPbiBzdWNjZXNzLCBhIG5ldyBXZWJBc3NlbWJs
eS5Nb2R1bGUgb2JqZWN0IGlzIHJldHVybmVkIHdpdGggW1tNb2R1bGVdXSBzZXQgdG8gdGhlIHZh
bGlkYXRlZCBBc3QubW9kdWxlLgogICAgIFN5bWJvbFRhYmxlKiBleHBvcnRTeW1ib2xUYWJsZSA9
IFN5bWJvbFRhYmxlOjpjcmVhdGUodm0pOwotICAgIGZvciAoYXV0byYgZXhwIDogbV9tb2R1bGVJ
bmZvcm1hdGlvbi0+ZXhwb3J0cykgeworICAgIGNvbnN0IFdhc206Ok1vZHVsZUluZm9ybWF0aW9u
JiBtb2R1bGVJbmZvcm1hdGlvbiA9IG1fbW9kdWxlLT5tb2R1bGVJbmZvcm1hdGlvbigpOworICAg
IGZvciAoYXV0byYgZXhwIDogbW9kdWxlSW5mb3JtYXRpb24uZXhwb3J0cykgewogICAgICAgICBh
dXRvIG9mZnNldCA9IGV4cG9ydFN5bWJvbFRhYmxlLT50YWtlTmV4dFNjb3BlT2Zmc2V0KE5vTG9j
a2luZ05lY2Vzc2FyeSk7CiAgICAgICAgIFN0cmluZyBmaWVsZCA9IFN0cmluZzo6ZnJvbVVURjgo
ZXhwLmZpZWxkKTsKICAgICAgICAgZXhwb3J0U3ltYm9sVGFibGUtPnNldChOb0xvY2tpbmdOZWNl
c3NhcnksIEF0b21pY1N0cmluZyhmaWVsZCkuaW1wbCgpLCBTeW1ib2xUYWJsZUVudHJ5KFZhck9m
ZnNldChvZmZzZXQpKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dl
YkFzc2VtYmx5TW9kdWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dh
c20vanMvSlNXZWJBc3NlbWJseU1vZHVsZS5oCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5TW9kdWxlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJKU1dlYkFzc2VtYmx5Q29kZUJsb2NrLmgi
CiAjaW5jbHVkZSAiVW5jb25kaXRpb25hbEZpbmFsaXplci5oIgogI2luY2x1ZGUgIldhc21Nb2R1
bGVJbmZvcm1hdGlvbi5oIgorI2luY2x1ZGUgIldhc21Nb2R1bGUuaCIKICNpbmNsdWRlIDx3dGYv
QmFnLmg+CiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCkBAIC00OSwxNiArNTAsMTYgQEAgY2xh
c3MgSlNXZWJBc3NlbWJseU1vZHVsZSA6IHB1YmxpYyBKU0RlcwogcHVibGljOgogICAgIHR5cGVk
ZWYgSlNEZXN0cnVjdGlibGVPYmplY3QgQmFzZTsKIAotICAgIHN0YXRpYyBKU1dlYkFzc2VtYmx5
TW9kdWxlKiBjcmVhdGVTdHViKFZNJiwgRXhlY1N0YXRlKiwgU3RydWN0dXJlKiwgUmVmUHRyPFdh
c206OlBsYW4+JiYpOwotICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYs
IEpTR2xvYmFsT2JqZWN0KiwgSlNWYWx1ZSk7Ci0KICAgICBERUNMQVJFX0lORk87CiAKLSAgICBj
b25zdCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5mb3JtYXRpb24oKSBjb25zdCB7
IHJldHVybiBtX21vZHVsZUluZm9ybWF0aW9uLmdldCgpOyB9CisgICAgc3RhdGljIEpTV2ViQXNz
ZW1ibHlNb2R1bGUqIGNyZWF0ZVN0dWIoVk0mLCBFeGVjU3RhdGUqLCBTdHJ1Y3R1cmUqLCBSZWY8
V2FzbTo6UGxhbj4mJik7CisgICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZN
JiwgSlNHbG9iYWxPYmplY3QqLCBKU1ZhbHVlKTsKKworICAgIGNvbnN0IFdhc206Ok1vZHVsZUlu
Zm9ybWF0aW9uJiBtb2R1bGVJbmZvcm1hdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fbW9kdWxlLT5t
b2R1bGVJbmZvcm1hdGlvbigpOyB9CiAgICAgU3ltYm9sVGFibGUqIGV4cG9ydFN5bWJvbFRhYmxl
KCkgY29uc3QgeyByZXR1cm4gbV9leHBvcnRTeW1ib2xUYWJsZS5nZXQoKTsgfQogICAgIFdhc206
OlNpZ25hdHVyZUluZGV4IHNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSh1bnNp
Z25lZCBmdW5jdGlvbkluZGV4U3BhY2UpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gbV9t
b2R1bGVJbmZvcm1hdGlvbi0+c2lnbmF0dXJlSW5kZXhGcm9tRnVuY3Rpb25JbmRleFNwYWNlKGZ1
bmN0aW9uSW5kZXhTcGFjZSk7CisgICAgICAgIHJldHVybiBtX21vZHVsZS0+c2lnbmF0dXJlSW5k
ZXhGcm9tRnVuY3Rpb25JbmRleFNwYWNlKGZ1bmN0aW9uSW5kZXhTcGFjZSk7CiAgICAgfQogICAg
IFdlYkFzc2VtYmx5VG9KU0NhbGxlZSogY2FsbGVlKCkgY29uc3QgeyByZXR1cm4gbV9jYWxsZWUu
Z2V0KCk7IH0KIApAQCAtNjYsMTcgKzY3LDE5IEBAIHB1YmxpYzoKIAogICAgIGNvbnN0IFZlY3Rv
cjx1aW50OF90PiYgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbW9kdWxlSW5mb3JtYXRpb24oKS5z
b3VyY2U7IH0KIAorICAgIFdhc206Ok1vZHVsZSYgbW9kdWxlKCkgeyByZXR1cm4gbV9tb2R1bGUu
Z2V0KCk7IH0KKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgSlNXZWJBc3NlbWJseUNvZGVC
bG9jazsKIAogICAgIHZvaWQgc2V0Q29kZUJsb2NrKFZNJiwgV2FzbTo6TWVtb3J5TW9kZSwgSlNX
ZWJBc3NlbWJseUNvZGVCbG9jayopOwogCi0gICAgSlNXZWJBc3NlbWJseU1vZHVsZShWTSYsIFN0
cnVjdHVyZSosIFdhc206OlBsYW4mKTsKKyAgICBKU1dlYkFzc2VtYmx5TW9kdWxlKFZNJiwgU3Ry
dWN0dXJlKiwgUmVmPFdhc206Ok1vZHVsZT4mJik7CiAgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihW
TSYpOwogICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CiAgICAgc3RhdGljIHZvaWQg
dmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOwogCi0gICAgUmVmPFdhc206Ok1v
ZHVsZUluZm9ybWF0aW9uPiBtX21vZHVsZUluZm9ybWF0aW9uOworICAgIFJlZjxXYXNtOjpNb2R1
bGU+IG1fbW9kdWxlOwogICAgIFdyaXRlQmFycmllcjxTeW1ib2xUYWJsZT4gbV9leHBvcnRTeW1i
b2xUYWJsZTsKICAgICBXcml0ZUJhcnJpZXI8SlNXZWJBc3NlbWJseUNvZGVCbG9jaz4gbV9jb2Rl
QmxvY2tzW1dhc206Ok51bWJlck9mTWVtb3J5TW9kZXNdOwogICAgIFdyaXRlQmFycmllcjxXZWJB
c3NlbWJseVRvSlNDYWxsZWU+IG1fY2FsbGVlOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L3dhc20vanMvV2ViQXNzZW1ibHlJbnN0YW5jZUNvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseUluc3RhbmNlQ29uc3Ry
dWN0b3IuY3BwCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2Fz
bS9qcy9XZWJBc3NlbWJseUluc3RhbmNlQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC01OCw3ICs1OCw3IEBAIHVzaW5nIFdhc206OlBsYW47CiAKIHN0YXRpYyBFbmNvZGVkSlNWYWx1
ZSBKU0NfSE9TVF9DQUxMIGNvbnN0cnVjdEpTV2ViQXNzZW1ibHlJbnN0YW5jZShFeGVjU3RhdGUq
IGV4ZWMpCiB7Ci0gICAgYXV0byYgdm0gPSBleGVjLT52bSgpOworICAgIFZNJiB2bSA9IGV4ZWMt
PnZtKCk7CiAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOwogCiAgICAg
Ly8gSWYgbW9kdWxlT2JqZWN0IGlzIG5vdCBhIFdlYkFzc2VtYmx5Lk1vZHVsZSBpbnN0YW5jZSwg
YSBUeXBlRXJyb3IgaXMgdGhyb3duLgpAQCAtNzgsNiArNzgsMTIgQEAgc3RhdGljIEVuY29kZWRK
U1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29ucwogICAgIEpTV2ViQXNzZW1ibHlJbnN0YW5jZSogaW5z
dGFuY2UgPSBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmNyZWF0ZSh2bSwgZXhlYywgbW9kdWxlLCBp
bXBvcnRPYmplY3QsIGluc3RhbmNlU3RydWN0dXJlKTsKICAgICBSRVRVUk5fSUZfRVhDRVBUSU9O
KHNjb3BlLCB7IH0pOwogCisgICAgbW9kdWxlLT5tb2R1bGUoKS5jb21waWxlU3luYyh2bSwgaW5z
dGFuY2UtPm1lbW9yeU1vZGUoKSk7CisgICAgaW5zdGFuY2UtPmZpbmFsaXplQ3JlYXRpb24odm0s
IGV4ZWMsIG1vZHVsZS0+bW9kdWxlKCkubm9uTnVsbENvZGVCbG9jayhpbnN0YW5jZS0+bWVtb3J5
TW9kZSgpKSk7CisgICAgUkVUVVJOX0lGX0VYQ0VQVElPTihzY29wZSwgeyB9KTsKKyAgICByZXR1
cm4gSlNWYWx1ZTo6ZW5jb2RlKGluc3RhbmNlKTsKKworICAgIC8qCiAgICAgLy8gVGhlcmUgYXJl
IHRocmVlIHBvc3NpYmxlIGNhc2VzOgogICAgIC8vIDEpIFRoZSBpbnN0YW5jZSBhbHJlYWR5IGhh
cyBhbiBpbml0aWFsaXplZCBDb2RlQmxvY2sgKHJ1bm5hYmxlKSwgc28gd2UganVzdCBuZWVkIHRv
IGZpbmFsaXplQ3JlYXRpb24uCiAgICAgLy8gMikgVGhlIGluc3RhbmNlIGhhcyBubyBDb2RlQmxv
Y2ssIHNvIHdlIG5lZWQgdG8gbWFrZSBvbmUgYW5kIGNvbXBpbGUgdGhlIGNvZGUgZm9yIGl0LgpA
QCAtOTYsMTAgKzEwMiwxMSBAQCBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBj
b25zCiAgICAgICAgICAgICB3b3JrbGlzdC5jb21wbGV0ZVBsYW5TeW5jaHJvbm91c2x5KHBsYW4u
Z2V0KCkpOwogICAgICAgICB9CiAgICAgfQotCiAgICAgaW5zdGFuY2UtPmZpbmFsaXplQ3JlYXRp
b24odm0sIGV4ZWMpOwogICAgIFJFVFVSTl9JRl9FWENFUFRJT04oc2NvcGUsIHsgfSk7CiAgICAg
cmV0dXJuIEpTVmFsdWU6OmVuY29kZShpbnN0YW5jZSk7CisgICAgKi8KKwogfQogCiBzdGF0aWMg
RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjYWxsSlNXZWJBc3NlbWJseUluc3RhbmNlKEV4
ZWNTdGF0ZSogZXhlYykKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFz
c2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuY3BwCShyZXZpc2lv
biAyMTQ5NzIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseU1v
ZHVsZUNvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzgsNyArNzgsNyBAQCBKU1Zh
bHVlIFdlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3I6OmNyCiAgICAgVmVjdG9yPHVpbnQ4X3Q+
IHNvdXJjZSA9IGNyZWF0ZVNvdXJjZUJ1ZmZlckZyb21WYWx1ZSh2bSwgZXhlYywgYnVmZmVyKTsK
ICAgICBSRVRVUk5fSUZfRVhDRVBUSU9OKHNjb3BlLCB7IH0pOwogCi0gICAgUmVmUHRyPFdhc206
OlBsYW4+IHBsYW4gPSBhZG9wdFJlZihuZXcgV2FzbTo6UGxhbih2bSwgV1RGTW92ZShzb3VyY2Up
LCBXYXNtOjpQbGFuOjpWYWxpZGF0aW9uLCBXYXNtOjpQbGFuOjpkb250RmluYWxpemUpKTsKKyAg
ICBSZWY8V2FzbTo6UGxhbj4gcGxhbiA9IGFkb3B0UmVmKCpuZXcgV2FzbTo6UGxhbih2bSwgV1RG
TW92ZShzb3VyY2UpLCBXYXNtOjpQbGFuOjpWYWxpZGF0aW9uLCBXYXNtOjpQbGFuOjpkb250Rmlu
YWxpemUpKTsKICAgICBpZiAoIXBsYW4tPnBhcnNlQW5kVmFsaWRhdGVNb2R1bGUoKSkKICAgICAg
ICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKGV4ZWMsIHNjb3BlLCBKU1dlYkFzc2VtYmx5Q29tcGls
ZUVycm9yOjpjcmVhdGUoZXhlYywgdm0sIGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKS0+V2Vi
QXNzZW1ibHlDb21waWxlRXJyb3JTdHJ1Y3R1cmUoKSwgcGxhbi0+ZXJyb3JNZXNzYWdlKCkpKTsK
ICAgICByZXR1cm4gSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1Yih2bSwgZXhlYywgc3Ry
dWN0dXJlLCBXVEZNb3ZlKHBsYW4pKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNt
L2pzL1dlYkFzc2VtYmx5UHJvdG90eXBlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseVByb3RvdHlwZS5jcHAJKHJldmlzaW9uIDIxNDk3
MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5UHJvdG90eXBl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjUsMTMgKzY1LDEyIEBAIGNvbnN0IENsYXNzSW5mbyBX
ZWJBc3NlbWJseVByb3RvdHlwZTo6c18KICBAZW5kCiAgKi8KIAotc3RhdGljIEVuY29kZWRKU1Zh
bHVlIHJlamVjdChFeGVjU3RhdGUqIGV4ZWMsIENhdGNoU2NvcGUmIGNhdGNoU2NvcGUsIEpTUHJv
bWlzZURlZmVycmVkKiBwcm9taXNlKQorc3RhdGljIHZvaWQgcmVqZWN0KEV4ZWNTdGF0ZSogZXhl
YywgQ2F0Y2hTY29wZSYgY2F0Y2hTY29wZSwgSlNQcm9taXNlRGVmZXJyZWQqIHByb21pc2UpCiB7
CiAgICAgRXhjZXB0aW9uKiBleGNlcHRpb24gPSBjYXRjaFNjb3BlLmV4Y2VwdGlvbigpOwogICAg
IEFTU0VSVChleGNlcHRpb24pOwogICAgIGNhdGNoU2NvcGUuY2xlYXJFeGNlcHRpb24oKTsKICAg
ICBwcm9taXNlLT5yZWplY3QoZXhlYywgZXhjZXB0aW9uLT52YWx1ZSgpKTsKLSAgICByZXR1cm4g
SlNWYWx1ZTo6ZW5jb2RlKHByb21pc2UtPnByb21pc2UoKSk7CiB9CiAKIHN0YXRpYyBFbmNvZGVk
SlNWYWx1ZSBKU0NfSE9TVF9DQUxMIHdlYkFzc2VtYmx5Q29tcGlsZUZ1bmMoRXhlY1N0YXRlKiBl
eGVjKQpAQCAtOTAsMTMgKzg5LDEzIEBAIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9D
QUxMIHdlYkEKICAgICBkZXBlbmRlbmNpZXMuYXBwZW5kKFN0cm9uZzxKU0NlbGw+KHZtLCBnbG9i
YWxPYmplY3QpKTsKICAgICB2bS5wcm9taXNlRGVmZXJyZWRUaW1lci0+YWRkUGVuZGluZ1Byb21p
c2UocHJvbWlzZSwgV1RGTW92ZShkZXBlbmRlbmNpZXMpKTsKIAotICAgIFJlZjxQbGFuPiBwbGFu
ID0gYWRvcHRSZWYoKm5ldyBQbGFuKHZtLCBXVEZNb3ZlKHNvdXJjZSksIFBsYW46OlZhbGlkYXRp
b24sIFtwcm9taXNlLCBnbG9iYWxPYmplY3RdIChQbGFuJiBwKSBtdXRhYmxlIHsKLSAgICAgICAg
UmVmUHRyPFBsYW4+IHBsYW4gPSBtYWtlUmVmKHApOwotICAgICAgICBwLnZtKCkucHJvbWlzZURl
ZmVycmVkVGltZXItPnNjaGVkdWxlV29ya1Nvb24ocHJvbWlzZSwgW3Byb21pc2UsIGdsb2JhbE9i
amVjdCwgcGxhbiA9IFdURk1vdmUocGxhbildICgpIG11dGFibGUgewotICAgICAgICAgICAgVk0m
IHZtID0gcGxhbi0+dm0oKTsKKyAgICBSZWY8UGxhbj4gcGxhbiA9IGFkb3B0UmVmKCpuZXcgUGxh
bih2bSwgV1RGTW92ZShzb3VyY2UpLCBQbGFuOjpWYWxpZGF0aW9uLCBbcHJvbWlzZSwgZ2xvYmFs
T2JqZWN0XSAoVk0mIHZtLCBQbGFuKiBwKSBtdXRhYmxlIHsKKyAgICAgICAgUkVMRUFTRV9BU1NF
UlQocCk7CisgICAgICAgIFJlZlB0cjxQbGFuPiBwbGFuID0gbWFrZVJlZigqcCk7CisgICAgICAg
IHZtLnByb21pc2VEZWZlcnJlZFRpbWVyLT5zY2hlZHVsZVdvcmtTb29uKHByb21pc2UsIFtwcm9t
aXNlLCBnbG9iYWxPYmplY3QsIHBsYW4gPSBXVEZNb3ZlKHBsYW4pLCAmdm1dICgpIG11dGFibGUg
ewogICAgICAgICAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfQ0FUQ0hfU0NPUEUodm0pOwogICAg
ICAgICAgICAgRXhlY1N0YXRlKiBleGVjID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVjKCk7Ci0g
ICAgICAgICAgICBKU1ZhbHVlIG1vZHVsZSA9IEpTV2ViQXNzZW1ibHlNb2R1bGU6OmNyZWF0ZVN0
dWIodm0sIGV4ZWMsIGdsb2JhbE9iamVjdC0+V2ViQXNzZW1ibHlNb2R1bGVTdHJ1Y3R1cmUoKSwg
V1RGTW92ZShwbGFuKSk7CisgICAgICAgICAgICBKU1ZhbHVlIG1vZHVsZSA9IEpTV2ViQXNzZW1i
bHlNb2R1bGU6OmNyZWF0ZVN0dWIodm0sIGV4ZWMsIGdsb2JhbE9iamVjdC0+V2ViQXNzZW1ibHlN
b2R1bGVTdHJ1Y3R1cmUoKSwgcGxhbi5yZWxlYXNlTm9uTnVsbCgpKTsKICAgICAgICAgICAgIGlm
IChzY29wZS5leGNlcHRpb24oKSkgewogICAgICAgICAgICAgICAgIHJlamVjdChleGVjLCBzY29w
ZSwgcHJvbWlzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTExLDE2ICsxMTAsMTYg
QEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQQogfQogCiBlbnVtIGNs
YXNzIFJlc29sdmUgeyBXaXRoSW5zdGFuY2UsIFdpdGhNb2R1bGVBbmRJbnN0YW5jZSB9Owotc3Rh
dGljIHZvaWQgcmVzb2x2ZShWTSYgdm0sIEV4ZWNTdGF0ZSogZXhlYywgSlNQcm9taXNlRGVmZXJy
ZWQqIHByb21pc2UsIEpTV2ViQXNzZW1ibHlJbnN0YW5jZSogaW5zdGFuY2UsIEpTV2ViQXNzZW1i
bHlNb2R1bGUqIG1vZHVsZSwgUmVzb2x2ZSBlbnRyaWVzKQorc3RhdGljIHZvaWQgcmVzb2x2ZShW
TSYgdm0sIEV4ZWNTdGF0ZSogZXhlYywgSlNQcm9taXNlRGVmZXJyZWQqIHByb21pc2UsIEpTV2Vi
QXNzZW1ibHlJbnN0YW5jZSogaW5zdGFuY2UsIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1vZHVsZSwg
UmVzb2x2ZSByZXNvbHZlS2luZCkKIHsKICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9DQVRDSF9T
Q09QRSh2bSk7Ci0gICAgaW5zdGFuY2UtPmZpbmFsaXplQ3JlYXRpb24odm0sIGV4ZWMpOworICAg
IGluc3RhbmNlLT5maW5hbGl6ZUNyZWF0aW9uKHZtLCBleGVjLCBtb2R1bGUtPm1vZHVsZSgpLm5v
bk51bGxDb2RlQmxvY2soaW5zdGFuY2UtPm1lbW9yeU1vZGUoKSkpOwogICAgIGlmIChzY29wZS5l
eGNlcHRpb24oKSkgewogICAgICAgICByZWplY3QoZXhlYywgc2NvcGUsIHByb21pc2UpOwogICAg
ICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGVudHJpZXMgPT0gUmVzb2x2ZTo6V2l0aElu
c3RhbmNlKQorICAgIGlmIChyZXNvbHZlS2luZCA9PSBSZXNvbHZlOjpXaXRoSW5zdGFuY2UpCiAg
ICAgICAgIHByb21pc2UtPnJlc29sdmUoZXhlYywgaW5zdGFuY2UpOwogICAgIGVsc2UgewogICAg
ICAgICBKU09iamVjdCogcmVzdWx0ID0gY29uc3RydWN0RW1wdHlPYmplY3QoZXhlYyk7CkBAIC0x
MzAsNyArMTI5LDcgQEAgc3RhdGljIHZvaWQgcmVzb2x2ZShWTSYgdm0sIEV4ZWNTdGF0ZSogZQog
ICAgIH0KIH0KIAotc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoVk0mIHZtLCBFeGVjU3RhdGUqIGV4
ZWMsIEpTUHJvbWlzZURlZmVycmVkKiBwcm9taXNlLCBKU1dlYkFzc2VtYmx5TW9kdWxlKiBtb2R1
bGUsIEpTT2JqZWN0KiBpbXBvcnRPYmplY3QsIFJlc29sdmUgZW50cmllcykKK3N0YXRpYyB2b2lk
IGluc3RhbnRpYXRlKFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjLCBKU1Byb21pc2VEZWZlcnJlZCog
cHJvbWlzZSwgSlNXZWJBc3NlbWJseU1vZHVsZSogbW9kdWxlLCBKU09iamVjdCogaW1wb3J0T2Jq
ZWN0LCBSZXNvbHZlIHJlc29sdmVLaW5kKQogewogICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX0NB
VENIX1NDT1BFKHZtKTsKICAgICAvLyBJbiBvcmRlciB0byBhdm9pZCBwb3RlbnRpYWxseSByZWNv
bXBpbGluZyBhIG1vZHVsZS4gV2UgZmlyc3QgZ2F0aGVyIGFsbCB0aGUgaW1wb3J0L21lbW9yeSBp
bmZvcm1hdGlvbiBwcmlvciB0byBjb21waWxpbmcgY29kZS4KQEAgLTE0MCw2ICsxMzksMTkgQEAg
c3RhdGljIHZvaWQgaW5zdGFudGlhdGUoVk0mIHZtLCBFeGVjU3RhdAogICAgICAgICByZXR1cm47
CiAgICAgfQogCisgICAgVmVjdG9yPFN0cm9uZzxKU0NlbGw+PiBkZXBlbmRlbmNpZXM7CisgICAg
Ly8gVGhlIGluc3RhbmNlIGtlZXBzIHRoZSBtb2R1bGUgYWxpdmUuCisgICAgZGVwZW5kZW5jaWVz
LmFwcGVuZChTdHJvbmc8SlNDZWxsPih2bSwgaW5zdGFuY2UpKTsKKyAgICB2bS5wcm9taXNlRGVm
ZXJyZWRUaW1lci0+YWRkUGVuZGluZ1Byb21pc2UocHJvbWlzZSwgV1RGTW92ZShkZXBlbmRlbmNp
ZXMpKTsKKyAgICAvLyBOb3RlOiBUaGlzIGNvbXBsZXRpb24gdGFzayBtYXkgb3IgbWF5IG5vdCBn
ZXQgY2FsbGVkIGltbWVkaWF0ZWx5LgorICAgIG1vZHVsZS0+bW9kdWxlKCkuY29tcGlsZUFzeW5j
KHZtLCBpbnN0YW5jZS0+bWVtb3J5TW9kZSgpLCBbcHJvbWlzZSwgaW5zdGFuY2UsIG1vZHVsZSwg
cmVzb2x2ZUtpbmRdIChWTSYgdm0sIFBsYW4qKSB7CisgICAgICAgIHZtLnByb21pc2VEZWZlcnJl
ZFRpbWVyLT5zY2hlZHVsZVdvcmtTb29uKHByb21pc2UsIFtwcm9taXNlLCBpbnN0YW5jZSwgbW9k
dWxlLCByZXNvbHZlS2luZCwgJnZtXSAoKSB7CisgICAgICAgICAgICBFeGVjU3RhdGUqIGV4ZWMg
PSBpbnN0YW5jZS0+Z2xvYmFsT2JqZWN0KCktPmdsb2JhbEV4ZWMoKTsKKyAgICAgICAgICAgIHJl
c29sdmUodm0sIGV4ZWMsIHByb21pc2UsIGluc3RhbmNlLCBtb2R1bGUsIHJlc29sdmVLaW5kKTsK
KyAgICAgICAgfSk7CisgICAgfSk7CisKKyAgICAvKgogICAgIC8vIFRoZXJlIGFyZSB0aHJlZSBw
b3NzaWJsZSBjYXNlczoKICAgICAvLyAxKSBUaGUgaW5zdGFuY2UgYWxyZWFkeSBoYXMgYW4gaW5p
dGlhbGl6ZWQgQ29kZUJsb2NrLCBzbyB3ZSBoYXZlIG5vIG1vcmUgd29yayB0byBkby4KICAgICAv
LyAyKSBUaGUgaW5zdGFuY2UgaGFzIG5vIENvZGVCbG9jaywgc28gd2UgbmVlZCB0byBtYWtlIG9u
ZSBhbmQgY29tcGlsZSB0aGUgY29kZSBmb3IgaXQuCkBAIC0xODEsNiArMTkzLDcgQEAgc3RhdGlj
IHZvaWQgaW5zdGFudGlhdGUoVk0mIHZtLCBFeGVjU3RhdAogICAgIGluc3RhbmNlLT5hZGRVbml0
aWFsaXplZENvZGVCbG9jayh2bSwgcGxhbi5jb3B5UmVmKCkpOwogICAgIHBsYW4tPnNldE1vZGUo
aW5zdGFuY2UtPm1lbW9yeU1vZGUoKSk7CiAgICAgV2FzbTo6ZW5zdXJlV29ya2xpc3QoKS5lbnF1
ZXVlKFdURk1vdmUocGxhbikpOworICAgICovCiB9CiAKIHN0YXRpYyB2b2lkIGNvbXBpbGVBbmRJ
bnN0YW50aWF0ZShWTSYgdm0sIEV4ZWNTdGF0ZSogZXhlYywgSlNQcm9taXNlRGVmZXJyZWQqIHBy
b21pc2UsIEpTVmFsdWUgYnVmZmVyLCBKU09iamVjdCogaW1wb3J0T2JqZWN0KQpAQCAtMTk1LDEz
ICsyMDgsMTMgQEAgc3RhdGljIHZvaWQgY29tcGlsZUFuZEluc3RhbnRpYXRlKFZNJiB2bQogICAg
IGRlcGVuZGVuY2llcy5hcHBlbmQoU3Ryb25nPEpTQ2VsbD4odm0sIGltcG9ydE9iamVjdCkpOwog
ICAgIHZtLnByb21pc2VEZWZlcnJlZFRpbWVyLT5hZGRQZW5kaW5nUHJvbWlzZShwcm9taXNlLCBX
VEZNb3ZlKGRlcGVuZGVuY2llcykpOwogCi0gICAgUmVmPFBsYW4+IHBsYW4gPSBhZG9wdFJlZigq
bmV3IFBsYW4odm0sIFdURk1vdmUoc291cmNlKSwgUGxhbjo6VmFsaWRhdGlvbiwgW3Byb21pc2Us
IGltcG9ydE9iamVjdCwgZ2xvYmFsT2JqZWN0XSAoUGxhbiYgcCkgbXV0YWJsZSB7Ci0gICAgICAg
IFJlZlB0cjxQbGFuPiBwbGFuID0gbWFrZVJlZihwKTsKLSAgICAgICAgcC52bSgpLnByb21pc2VE
ZWZlcnJlZFRpbWVyLT5zY2hlZHVsZVdvcmtTb29uKHByb21pc2UsIFtwcm9taXNlLCBpbXBvcnRP
YmplY3QsIGdsb2JhbE9iamVjdCwgcGxhbiA9IFdURk1vdmUocGxhbildICgpIG11dGFibGUgewot
ICAgICAgICAgICAgVk0mIHZtID0gcGxhbi0+dm0oKTsKKyAgICBSZWY8UGxhbj4gcGxhbiA9IGFk
b3B0UmVmKCpuZXcgUGxhbih2bSwgV1RGTW92ZShzb3VyY2UpLCBQbGFuOjpWYWxpZGF0aW9uLCBb
cHJvbWlzZSwgaW1wb3J0T2JqZWN0LCBnbG9iYWxPYmplY3RdIChWTSYgdm0sIFBsYW4qIHApIG11
dGFibGUgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChwKTsKKyAgICAgICAgUmVmUHRyPFBsYW4+
IHBsYW4gPSBtYWtlUmVmKCpwKTsKKyAgICAgICAgdm0ucHJvbWlzZURlZmVycmVkVGltZXItPnNj
aGVkdWxlV29ya1Nvb24ocHJvbWlzZSwgW3Byb21pc2UsIGltcG9ydE9iamVjdCwgZ2xvYmFsT2Jq
ZWN0LCBwbGFuID0gV1RGTW92ZShwbGFuKSwgJnZtXSAoKSBtdXRhYmxlIHsKICAgICAgICAgICAg
IGF1dG8gc2NvcGUgPSBERUNMQVJFX0NBVENIX1NDT1BFKHZtKTsKICAgICAgICAgICAgIEV4ZWNT
dGF0ZSogZXhlYyA9IGdsb2JhbE9iamVjdC0+Z2xvYmFsRXhlYygpOwotICAgICAgICAgICAgSlNX
ZWJBc3NlbWJseU1vZHVsZSogbW9kdWxlID0gSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1
Yih2bSwgZXhlYywgZ2xvYmFsT2JqZWN0LT5XZWJBc3NlbWJseU1vZHVsZVN0cnVjdHVyZSgpLCBw
bGFuLmNvcHlSZWYoKSk7CisgICAgICAgICAgICBKU1dlYkFzc2VtYmx5TW9kdWxlKiBtb2R1bGUg
PSBKU1dlYkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdHViKHZtLCBleGVjLCBnbG9iYWxPYmplY3Qt
PldlYkFzc2VtYmx5TW9kdWxlU3RydWN0dXJlKCksIHBsYW4ucmVsZWFzZU5vbk51bGwoKSk7CiAg
ICAgICAgICAgICBpZiAoc2NvcGUuZXhjZXB0aW9uKCkpIHsKICAgICAgICAgICAgICAgICByZWpl
Y3QoZXhlYywgc2NvcGUsIHByb21pc2UpOwogICAgICAgICAgICAgICAgIHJldHVybjsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>306360</attachid>
            <date>2017-04-05 20:21:04 -0700</date>
            <delta_ts>2017-04-05 20:36:19 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>52892</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTQ5MCw2ICsxNDkwLDggQEAKIAkJNzJBQUY3Q0QxRDBE
MzFCMzAwNUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzJBQUY3Q0IxRDBEMzE4QjAw
NUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uY3BwICovOyB9OwogCQk3MkFB
RjdDRTFEMEQzMUIzMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5jdGlvbi5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzJBQUY3Q0MxRDBE
MzE4QjAwNUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uaCAqLzsgfTsKIAkJ
NzgyNzREOEU0QzRENEZDRDlBMURDNkU2IC8qIFRlbXBsYXRlUmVnaXN0cnlLZXkuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkRCNEI1RTA5OUNENEMx
QkIzQzFDRjA1IC8qIFRlbXBsYXRlUmVnaXN0cnlLZXkuY3BwICovOyB9OworCQk3OTAwODEzODFF
OTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTAwODEzNjFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1v
ZHVsZS5jcHAgKi87IH07CisJCTc5MDA4MTM5MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxl
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTAwODEz
NzFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5MDVCQjY4MUQxMjA1MEUwMDE5RkU1NyAvKiBJ
bmxpbmVBY2Nlc3MuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gNzkwNUJCNjYxRDEyMDUwRTAwMTlGRTU3IC8qIElubGluZUFjY2Vzcy5jcHAgKi87IH07
CiAJCTc5MDVCQjY5MUQxMjA1MEUwMDE5RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5MDVCQjY3MUQxMjA1MEUwMDE5
RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2
YXRlLCApOyB9OyB9OwogCQk3OTE2MERCRDFDOEUzRUM4MDA4QzA4NUEgLyogUHJveHlSZXZva2Uu
Y3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzkxNjBE
QkIxQzhFM0VDODAwOEMwODVBIC8qIFByb3h5UmV2b2tlLmNwcCAqLzsgfTsKQEAgLTQwNDMsNiAr
NDA0NSw4IEBACiAJCTcyQUFGN0NCMUQwRDMxOEIwMDVFNjBCRSAvKiBKU0N1c3RvbUdldHRlclNl
dHRlckZ1bmN0aW9uLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpT
Q3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQk3MkFBRjdDQzFEMEQzMThCMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5j
dGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBKU0N1c3RvbUdldHRlclNl
dHRlckZ1bmN0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc3QjI1Q0IyQzMw
OTRBOTJBMzhFMURCMyAvKiBKU01vZHVsZUxvYWRlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBKU01vZHVsZUxvYWRlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQk3OTAwODEzNjFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXYXNtTW9kdWxlLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJNzkwMDgxMzcxRTk1QThFQzAwNTJEN0NEIC8qIFdhc21Nb2R1bGUuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV2FzbU1vZHVsZS5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQk3OTA1QkI2NjFEMTIwNTBFMDAxOUZFNTcgLyogSW5saW5lQWNj
ZXNzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IElubGluZUFjY2Vz
cy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5MDVCQjY3MUQxMjA1MEUwMDE5
RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
SW5saW5lQWNjZXNzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5MTYwREJCMUM4
RTNFQzgwMDhDMDg1QSAvKiBQcm94eVJldm9rZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBQcm94eVJldm9rZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CkBAIC02MzI3LDYgKzYzMzEsOCBAQAogCQkJCUFEMkZDQzMyMURDNDA0NTMwMEIzRTczNiAvKiBX
YXNtRm9ybWF0LmNwcCAqLywKIAkJCQk3QkM1NDdEMjFCNjk1OTlCMDA5NTlCNTggLyogV2FzbUZv
cm1hdC5oICovLAogCQkJCTUzRjQwRThBMUQ1OTAxQkIwMDk5QTFCNiAvKiBXYXNtRnVuY3Rpb25Q
YXJzZXIuaCAqLywKKwkJCQk3OTAwODEzNjFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5j
cHAgKi8sCisJCQkJNzkwMDgxMzcxRTk1QThFQzAwNTJEN0NEIC8qIFdhc21Nb2R1bGUuaCAqLywK
IAkJCQk1MzU1NTcxNTFEOURGQTMyMDA2RDU4M0IgLyogV2FzbU1lbW9yeS5jcHAgKi8sCiAJCQkJ
NTM1NTU3MTMxRDlEOUVBNTAwNkQ1ODNCIC8qIFdhc21NZW1vcnkuaCAqLywKIAkJCQk3OUI3NTk3
MTFERkE0QzYwMDA1MjE3NEMgLyogV2FzbU1lbW9yeUluZm9ybWF0aW9uLmNwcCAqLywKQEAgLTg5
MjIsNiArODkyOCw3IEBACiAJCQkJQTU4QzAyNDIxOEU0QTQxQTAwMDMyQkM1IC8qIEpTQ29udGV4
dFByaXZhdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDMThDNDFFMEUxNkY1Q0QwMEIzNDQ2MCAv
KiBKU0NvbnRleHRSZWYuaCBpbiBIZWFkZXJzICovLAogCQkJCUE1RUE3MEVFMTlGNUI1QzQwMDk4
RjVFQyAvKiBKU0NvbnRleHRSZWZJbnNwZWN0b3JTdXBwb3J0LmggaW4gSGVhZGVycyAqLywKKwkJ
CQk3OTAwODEzOTFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJQTVEMkU2NjUxOTVFMTc0MDAwQTUxOEU3IC8qIEpTQ29udGV4dFJlZkludGVybmFsLmgg
aW4gSGVhZGVycyAqLywKIAkJCQkwRkY0QjRDNzFFODg5M0M1MDBEQkJFODYgLyogQWlyQ0ZHLmgg
aW4gSGVhZGVycyAqLywKIAkJCQkxNDhDRDFEODEwOENGOTAyMDA4MTYzQzYgLyogSlNDb250ZXh0
UmVmUHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8sCkBAIC0xMDM2Niw2ICsxMDM3Myw3IEBACiAJCQkJ
MEZCMTA1ODUxNjc1NDgwRjAwRjhBQjZFIC8qIEV4aXRLaW5kLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCTBGNTUxM0E4MUQ1QTY4Q0QwMEMzMkJEOCAvKiBGcmVlTGlzdC5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQkwRkVBMEExQzE3MDhCMDA3MDBCQjcyMkMgLyogRlRMQWJzdHJhY3RIZWFwLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCTc5MDA4MTM4MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxl
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRUEwQTFFMTcwOEIwMDcwMEJCNzIyQyAvKiBGVExB
YnN0cmFjdEhlYXBSZXBvc2l0b3J5LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGNDg1MzI3MTg3
REZERUMwMDgzQjY4NyAvKiBGVExBdmFpbGFibGVSZWNvdmVyeS5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQkwRkVBMEEwOTE3MDUxM0RCMDBCQjcyMkMgLyogRlRMQ2FwYWJpbGl0aWVzLmNwcCBpbiBT
b3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJHZW5l
cmF0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21C
M0lSR2VuZXJhdG9yLmNwcAkocmV2aXNpb24gMjE0OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vV2FzbUIzSVJHZW5lcmF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MzYsNyAr
OTM2LDcgQEAgYXV0byBCM0lSR2VuZXJhdG9yOjphZGRDYWxsKHVpbnQzMl90IGZ1bgogICAgICAg
ICAgICAgICAgIHBhdGNocG9pbnQtPmFwcGVuZChqdW1wRGVzdGluYXRpb24sIFZhbHVlUmVwOjpT
b21lUmVnaXN0ZXIpOwogICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvYmJlciBhbGwg
cG90ZW50aWFsIHBpbm5lZCByZWdpc3RlcnMgc2luY2Ugd2UgbWlnaHQgYmUgbGVhdmluZyB0aGUg
aW5zdGFuY2UuCiAgICAgICAgICAgICAgICAgcGF0Y2hwb2ludC0+Y2xvYmJlckxhdGUoUGlubmVk
UmVnaXN0ZXJJbmZvOjpnZXQoKS50b1NhdmUoKSk7Ci0gICAgICAgICAgICAgICAgcGF0Y2hwb2lu
dC0+c2V0R2VuZXJhdG9yKFt1bmxpbmtlZFdhc21Ub1dhc21DYWxscywgZnVuY3Rpb25JbmRleCwg
cmV0dXJuVHlwZV0gKENDYWxsSGVscGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0
aW9uUGFyYW1zJiBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBwYXRjaHBvaW50LT5zZXRHZW5l
cmF0b3IoW2Z1bmN0aW9uSW5kZXgsIHJldHVyblR5cGVdIChDQ2FsbEhlbHBlcnMmIGppdCwgY29u
c3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYgcGFyYW1zKSB7CiAgICAgICAgICAgICAg
ICAgICAgIEFsbG93TWFjcm9TY3JhdGNoUmVnaXN0ZXJVc2FnZSBhbGxvd1NjcmF0Y2goaml0KTsK
ICAgICAgICAgICAgICAgICAgICAgaml0LmNhbGwocGFyYW1zW3JldHVyblR5cGUgPT0gVm9pZCA/
IDAgOiAxXS5ncHIoKSk7CiAgICAgICAgICAgICAgICAgfSk7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd2FzbS9XYXNtQmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3dhc20vV2FzbUJpbmRpbmcuY3BwCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQmluZGluZy5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTQ5LDcgKzQ5LDcgQEAgc3RhdGljIHZvaWQgbWF0ZXJpYWxpemVJbXBvcnRKU0NlbGwoSklUJgog
ICAgIGppdC5sb2FkUHRyKEpJVDo6QWRkcmVzcyhyZXN1bHQsIEpTV2ViQXNzZW1ibHlJbnN0YW5j
ZTo6b2Zmc2V0T2ZJbXBvcnRGdW5jdGlvbihpbXBvcnRJbmRleCkpLCByZXN1bHQpOwogfQogCi1z
dGF0aWMgTWFjcm9Bc3NlbWJsZXJDb2RlUmVmIHdhc21Ub0pzKFZNKiB2bSwgQmFnPENhbGxMaW5r
SW5mbz4mIGNhbGxMaW5rSW5mb3MsIFNpZ25hdHVyZUluZGV4IHNpZ25hdHVyZUluZGV4LCB1bnNp
Z25lZCBpbXBvcnRJbmRleCkKK01hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9KcyhWTSogdm0s
IEJhZzxDYWxsTGlua0luZm8+JiBjYWxsTGlua0luZm9zLCBTaWduYXR1cmVJbmRleCBzaWduYXR1
cmVJbmRleCwgdW5zaWduZWQgaW1wb3J0SW5kZXgpCiB7CiAgICAgLy8gRklYTUU6IFRoaXMgZnVu
Y3Rpb24gZG9lc24ndCBwcm9wZXJseSBhYnN0cmFjdCBhd2F5IHRoZSBjYWxsaW5nIGNvbnZlbnRp
b24uCiAgICAgLy8gSXQnZCBiZSBzdXBlciBlYXN5IHRvIGRvIHNvOiBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY5NDAxCkBAIC00MjIsNyArNDIyLDcgQEAgc3RhdGlj
IE1hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9KcyhWTQogICAgIHJldHVybiBGSU5BTElaRV9D
T0RFKHBhdGNoQnVmZmVyLCAoIldlYkFzc2VtYmx5LT5KYXZhU2NyaXB0IGltcG9ydFslaV0gJXMi
LCBpbXBvcnRJbmRleCwgc2lnbmF0dXJlLnRvU3RyaW5nKCkuYXNjaWkoKS5kYXRhKCkpKTsKIH0K
IAotc3RhdGljIE1hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9XYXNtKHVuc2lnbmVkIGltcG9y
dEluZGV4KQorTWFjcm9Bc3NlbWJsZXJDb2RlUmVmIHdhc21Ub1dhc20odW5zaWduZWQgaW1wb3J0
SW5kZXgpCiB7CiAgICAgY29uc3QgUGlubmVkUmVnaXN0ZXJJbmZvJiBwaW5uZWRSZWdzID0gUGlu
bmVkUmVnaXN0ZXJJbmZvOjpnZXQoKTsKICAgICBKSVQgaml0OwpAQCAtNDYyLDE0ICs0NjIsNiBA
QCBzdGF0aWMgTWFjcm9Bc3NlbWJsZXJDb2RlUmVmIHdhc21Ub1dhc20oCiAgICAgcmV0dXJuIEZJ
TkFMSVpFX0NPREUocGF0Y2hCdWZmZXIsICgiV2ViQXNzZW1ibHktPldlYkFzc2VtYmx5IGltcG9y
dFslaV0iLCBpbXBvcnRJbmRleCkpOwogfQogCi1XYXNtRXhpdFN0dWJzIGV4aXRTdHViR2VuZXJh
dG9yKFZNKiB2bSwgQmFnPENhbGxMaW5rSW5mbz4mIGNhbGxMaW5rSW5mb3MsIFNpZ25hdHVyZUlu
ZGV4IHNpZ25hdHVyZUluZGV4LCB1bnNpZ25lZCBpbXBvcnRJbmRleCkKLXsKLSAgICBXYXNtRXhp
dFN0dWJzIHN0dWJzOwotICAgIHN0dWJzLndhc21Ub0pzID0gd2FzbVRvSnModm0sIGNhbGxMaW5r
SW5mb3MsIHNpZ25hdHVyZUluZGV4LCBpbXBvcnRJbmRleCk7Ci0gICAgc3R1YnMud2FzbVRvV2Fz
bSA9IHdhc21Ub1dhc20oaW1wb3J0SW5kZXgpOwotICAgIHJldHVybiBzdHViczsKLX0KLQogfSB9
IC8vIG5hbWVzcGFjZSBKU0M6Oldhc20KIAogI2VuZGlmIC8vIEVOQUJMRShXRUJBU1NFTUJMWSkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CaW5kaW5nLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUJpbmRpbmcuaAkocmV2aXNpb24g
MjE0OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUJpbmRpbmcuaAkod29y
a2luZyBjb3B5KQpAQCAtMzgsNyArMzgsOCBAQCBjbGFzcyBDYWxsTGlua0luZm87CiAKIG5hbWVz
cGFjZSBXYXNtIHsKIAotV2FzbUV4aXRTdHVicyBleGl0U3R1YkdlbmVyYXRvcihWTSosIEJhZzxD
YWxsTGlua0luZm8+JiwgU2lnbmF0dXJlSW5kZXgsIHVuc2lnbmVkKTsKK01hY3JvQXNzZW1ibGVy
Q29kZVJlZiB3YXNtVG9XYXNtKHVuc2lnbmVkIGltcG9ydEluZGV4KTsKK01hY3JvQXNzZW1ibGVy
Q29kZVJlZiB3YXNtVG9KcyhWTSosIEJhZzxDYWxsTGlua0luZm8+JiBjYWxsTGlua0luZm9zLCBT
aWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCwgdW5zaWduZWQgaW1wb3J0SW5kZXgpOwogCiB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6V2FzbQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d2FzbS9XYXNtTW9kdWxlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d2FzbS9XYXNtTW9kdWxlLmNwcAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9XYXNtTW9kdWxlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE1NCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJXYXNtTW9kdWxlLmgiCisKKyNpZiBFTkFCTEUoV0VCQVNTRU1C
TFkpCisKKyNpbmNsdWRlICJXYXNtUGxhbklubGluZXMuaCIKKyNpbmNsdWRlICJXYXNtV29ya2xp
c3QuaCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKKworQ29kZUJsb2NrOjpD
b2RlQmxvY2soVk0mIHZtLCBNZW1vcnlNb2RlIG1vZGUsIE1vZHVsZUluZm9ybWF0aW9uJiBtb2R1
bGVJbmZvcm1hdGlvbikKKyAgICA6IG1fY2FsbGVlQ291bnQobW9kdWxlSW5mb3JtYXRpb24uaW50
ZXJuYWxGdW5jdGlvbkNvdW50KCkpCisgICAgLCBtX21vZGUobW9kZSkKK3sKKyAgICAvLyBGSVhN
RTogcGVyaGFwcyB3ZSBuZWVkIGEgcHJvdGVjdGVkIHRoaXMgaGVyZS4gUGVyaGFwcyBub3Q/IFRo
aW5rIGFib3V0IHRoaXMgYSBiaXQuCisgICAgUmVmUHRyPENvZGVCbG9jaz4gcHJvdGVjdGVkVGhp
cyA9IHRoaXM7CisgICAgbV9wbGFuID0gYWRvcHRSZWYoKm5ldyBQbGFuKHZtLCBtYWtlUmVmKG1v
ZHVsZUluZm9ybWF0aW9uKSwgUGxhbjo6RnVsbENvbXBpbGUsIFt0aGlzLCBwcm90ZWN0ZWRUaGlz
XSAoVk0mLCBQbGFuKikgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbG9jayk7
CisgICAgICAgIC8vIEZJWE1FOiBpbml0aWFsaXplIGNhbGxlZXMgYW5kIHN0dWZmLgorICAgICAg
ICBpZiAobV9wbGFuLT5mYWlsZWQoKSkgeworICAgICAgICAgICAgbV9lcnJvck1lc3NhZ2UgPSBt
X3BsYW4tPmVycm9yTWVzc2FnZSgpOworICAgICAgICAgICAgbV9wbGFuID0gbnVsbHB0cjsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1fY2FsbGVlcy5yZXNpemUo
bV9jYWxsZWVDb3VudCAqIDIpOworICAgICAgICBtX3BsYW4tPmluaXRpYWxpemVDYWxsZWVzKFsm
XSAodW5zaWduZWQgY2FsbGVlSW5kZXgsIFJlZjxXYXNtOjpDYWxsZWU+JiYganNFbnRyeXBvaW50
Q2FsbGVlLCBSZWY8V2FzbTo6Q2FsbGVlPiYmIHdhc21FbnRyeXBvaW50Q2FsbGVlKSB7CisgICAg
ICAgICAgICBtX2NhbGxlZXNbY2FsbGVlSW5kZXhdID0gV1RGTW92ZShqc0VudHJ5cG9pbnRDYWxs
ZWUpOworICAgICAgICAgICAgbV9jYWxsZWVzW2NhbGxlZUluZGV4ICsgbV9jYWxsZWVDb3VudF0g
PSBXVEZNb3ZlKHdhc21FbnRyeXBvaW50Q2FsbGVlKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAg
bV93YXNtVG9XYXNtRXhpdFN0dWJzID0gbV9wbGFuLT50YWtlV2FzbVRvV2FzbUV4aXRTdHVicygp
OworCisgICAgICAgIG1fcGxhbiA9IG51bGxwdHI7CisgICAgfSkpOworCisgICAgbV9wbGFuLT5z
ZXRNb2RlKG1vZGUpOworICAgIGF1dG8mIHdvcmtsaXN0ID0gV2FzbTo6ZW5zdXJlV29ya2xpc3Qo
KTsKKyAgICAvLyBOb3RlLCBpbW1lZGlhdGVseSBhZnRlciB3ZSBlbnF1ZXVlIHRoZSBwbGFuLCB0
aGVyZSBpcyBhIGNoYW5jZSB0aGUgYWJvdmUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuCisgICAg
d29ya2xpc3QuZW5xdWV1ZShtYWtlUmVmKCptX3BsYW4uZ2V0KCkpKTsKK30KKwordm9pZCBDb2Rl
QmxvY2s6OndhaXRVbnRpbEZpbmlzaGVkKCkKK3sKKyAgICBSZWZQdHI8UGxhbj4gcGxhbjsKKyAg
ICB7CisgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9sb2NrKTsKKyAgICAgICAgcGxh
biA9IG1fcGxhbjsKKyAgICB9CisKKyAgICBpZiAocGxhbikgeworICAgICAgICBhdXRvJiB3b3Jr
bGlzdCA9IFdhc206OmVuc3VyZVdvcmtsaXN0KCk7CisgICAgICAgIHdvcmtsaXN0LmNvbXBsZXRl
UGxhblN5bmNocm9ub3VzbHkoKnBsYW4uZ2V0KCkpOworICAgIH0KKyAgICAvLyBlbHNlLCBpZiB3
ZSBkb24ndCBoYXZlIGEgcGxhbiwgbWVhbmluZyB3ZSdyZSBhbHJlYWR5IGNvbXBpbGVkLgorfQor
Cit2b2lkIENvZGVCbG9jazo6Y29tcGlsZUFzeW5jKFZNJiB2bSwgUGxhbjo6Q29tcGxldGlvblRh
c2smJiB0YXNrKQoreworICAgIFJlZlB0cjxQbGFuPiBwbGFuOworICAgIHsKKyAgICAgICAgYXV0
byBsb2NrZXIgPSBob2xkTG9jayhtX2xvY2spOworICAgICAgICBwbGFuID0gbV9wbGFuOworICAg
IH0KKworICAgIGlmIChwbGFuKQorICAgICAgICBwbGFuLT5hZGRDb21wbGV0aW9uVGFzayh2bSwg
V1RGTW92ZSh0YXNrKSk7CisgICAgZWxzZQorICAgICAgICB0YXNrKHZtLCBudWxscHRyKTsKK30K
KworYm9vbCBDb2RlQmxvY2s6OmlzU2FmZVRvUnVuKE1lbW9yeU1vZGUgbWVtb3J5TW9kZSkKK3sK
KyAgICBpZiAoIXJ1bm5hYmxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRj
aCAobV9tb2RlKSB7CisgICAgY2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpCb3VuZHNDaGVja2luZzoK
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpTaWduYWxp
bmc6CisgICAgICAgIC8vIENvZGUgYmVpbmcgaW4gU2lnbmFsaW5nIG1vZGUgbWVhbnMgdGhhdCBp
dCBwZXJmb3JtcyBubyBib3VuZHMgY2hlY2tzLgorICAgICAgICAvLyBJdHMgbWVtb3J5LCBldmVu
IGlmIGVtcHR5LCBhYnNvbHV0ZWx5IG11c3QgYWxzbyBiZSBpbiBTaWduYWxpbmcgbW9kZQorICAg
ICAgICAvLyBiZWNhdXNlIHRoZSBwYWdlIHByb3RlY3Rpb24gZGV0ZWN0cyBvdXQtb2YtYm91bmRz
IGFjY2Vzc2VzLgorICAgICAgICByZXR1cm4gbWVtb3J5TW9kZSA9PSBXYXNtOjpNZW1vcnlNb2Rl
OjpTaWduYWxpbmc7CisgICAgY2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpOdW1iZXJPZk1lbW9yeU1v
ZGVzOgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK01vZHVsZTo6TW9kdWxlKFJlZjxNb2R1bGVJ
bmZvcm1hdGlvbj4mJiBtb2R1bGVJbmZvcm1hdGlvbikKKyAgICA6IG1fbW9kdWxlSW5mb3JtYXRp
b24oV1RGTW92ZShtb2R1bGVJbmZvcm1hdGlvbikpCit7Cit9CisKKwordm9pZCBNb2R1bGU6OmNv
bXBpbGVTeW5jKFZNJiB2bSwgTWVtb3J5TW9kZSBtb2RlKQoreworICAgIFJlZlB0cjxDb2RlQmxv
Y2s+IGNvZGVCbG9jazsKKyAgICB7CisgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9s
b2NrKTsKKyAgICAgICAgY29kZUJsb2NrID0gbV9jb2RlQmxvY2tzW3N0YXRpY19jYXN0PHVpbnQ4
X3Q+KG1vZGUpXTsKKyAgICAgICAgaWYgKCFjb2RlQmxvY2spIHsKKyAgICAgICAgICAgIGNvZGVC
bG9jayA9IENvZGVCbG9jazo6Y3JlYXRlKHZtLCBtb2RlLCBjb25zdF9jYXN0PE1vZHVsZUluZm9y
bWF0aW9uJj4obW9kdWxlSW5mb3JtYXRpb24oKSkpOworICAgICAgICAgICAgbV9jb2RlQmxvY2tz
W3N0YXRpY19jYXN0PHVpbnQ4X3Q+KG1vZGUpXSA9IGNvZGVCbG9jazsKKyAgICAgICAgfQorICAg
IH0KKyAgICBjb2RlQmxvY2stPndhaXRVbnRpbEZpbmlzaGVkKCk7Cit9CisKK3ZvaWQgTW9kdWxl
Ojpjb21waWxlQXN5bmMoVk0mIHZtLCBNZW1vcnlNb2RlIG1vZGUsIFBsYW46OkNvbXBsZXRpb25U
YXNrJiYgdGFzaykKK3sKKyAgICBSZWZQdHI8Q29kZUJsb2NrPiBjb2RlQmxvY2s7CisgICAgewor
ICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbG9jayk7CisgICAgICAgIGNvZGVCbG9j
ayA9IG1fY29kZUJsb2Nrc1tzdGF0aWNfY2FzdDx1aW50OF90Pihtb2RlKV07CisgICAgICAgIGlm
ICghY29kZUJsb2NrKSB7CisgICAgICAgICAgICBjb2RlQmxvY2sgPSBDb2RlQmxvY2s6OmNyZWF0
ZSh2bSwgbW9kZSwgY29uc3RfY2FzdDxNb2R1bGVJbmZvcm1hdGlvbiY+KG1vZHVsZUluZm9ybWF0
aW9uKCkpKTsKKyAgICAgICAgICAgIG1fY29kZUJsb2Nrc1tzdGF0aWNfY2FzdDx1aW50OF90Piht
b2RlKV0gPSBjb2RlQmxvY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlQmxvY2stPmNv
bXBpbGVBc3luYyh2bSwgV1RGTW92ZSh0YXNrKSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlND
OjpXYXNtCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCQVNTRU1CTFkpCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3dhc20vV2FzbU1vZHVsZS5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL1dhc21Nb2R1bGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEy
MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFn
bWEgb25jZQorCisjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQorCisjaW5jbHVkZSAiV2FzbUNhbGxl
ZS5oIgorI2luY2x1ZGUgIldhc21Nb2R1bGVJbmZvcm1hdGlvbi5oIgorI2luY2x1ZGUgIldhc21Q
bGFuLmgiCisjaW5jbHVkZSA8d3RmL0xvY2suaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJl
ZkNvdW50ZWQuaD4KKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKKyAgICAKK2Ns
YXNzIENvZGVCbG9jayA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxDb2RlQmxvY2s+IHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPENvZGVCbG9jaz4gY3JlYXRlKFZNJiB2bSwgTWVtb3J5
TW9kZSBtb2RlLCBNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5mb3JtYXRpb24pCisgICAgewor
ICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBDb2RlQmxvY2sodm0sIG1vZGUsIG1vZHVsZUlu
Zm9ybWF0aW9uKSk7CisgICAgfQorCisgICAgdm9pZCB3YWl0VW50aWxGaW5pc2hlZCgpOworICAg
IHZvaWQgY29tcGlsZUFzeW5jKFZNJiwgUGxhbjo6Q29tcGxldGlvblRhc2smJik7CisKKyAgICAv
LyBGSVhNRTogcmVuYW1lIHRoaXMgdG8gY29tcGlsYXRpb25GaW5pc2hlZCgpCisgICAgYm9vbCBp
bml0aWFsaXplZCgpCisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbG9j
ayk7CisgICAgICAgIHJldHVybiAhbV9wbGFuOworICAgIH0KKyAgICBib29sIHJ1bm5hYmxlKCkg
eyByZXR1cm4gaW5pdGlhbGl6ZWQoKSAmJiAhbV9lcnJvck1lc3NhZ2U7IH0KKworICAgIC8vIEZJ
WE1FOiBUaGlzIGlzbid0IHRocmVhZCBzYWZlLgorICAgIFN0cmluZyYgZXJyb3JNZXNzYWdlKCkg
eyBBU1NFUlQoIXJ1bm5hYmxlKCkpOyByZXR1cm4gbV9lcnJvck1lc3NhZ2U7IH0KKworICAgIHVu
c2lnbmVkIGZ1bmN0aW9uSW1wb3J0Q291bnQoKSBjb25zdCB7IHJldHVybiBtX3dhc21Ub1dhc21F
eGl0U3R1YnMuc2l6ZSgpOyB9CisKKyAgICBXYXNtOjpDYWxsZWUmIGpzRW50cnlwb2ludENhbGxl
ZUZyb21GdW5jdGlvbkluZGV4U3BhY2UodW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlKQorICAg
IHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoZnVuY3Rpb25JbmRleFNwYWNlID49IGZ1bmN0aW9u
SW1wb3J0Q291bnQoKSk7CisgICAgICAgIHVuc2lnbmVkIGNhbGxlZUluZGV4ID0gZnVuY3Rpb25J
bmRleFNwYWNlIC0gZnVuY3Rpb25JbXBvcnRDb3VudCgpOworICAgICAgICBSRUxFQVNFX0FTU0VS
VChjYWxsZWVJbmRleCA8IG1fY2FsbGVlQ291bnQpOworICAgICAgICByZXR1cm4gKm1fY2FsbGVl
c1tjYWxsZWVJbmRleF0uZ2V0KCk7CisgICAgfQorICAgIFdhc206OkNhbGxlZSYgd2FzbUVudHJ5
cG9pbnRDYWxsZWVGcm9tRnVuY3Rpb25JbmRleFNwYWNlKHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXhT
cGFjZSkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGZ1bmN0aW9uSW5kZXhTcGFjZSA+
PSBmdW5jdGlvbkltcG9ydENvdW50KCkpOworICAgICAgICB1bnNpZ25lZCBjYWxsZWVJbmRleCA9
IGZ1bmN0aW9uSW5kZXhTcGFjZSAtIGZ1bmN0aW9uSW1wb3J0Q291bnQoKTsKKyAgICAgICAgUkVM
RUFTRV9BU1NFUlQoY2FsbGVlSW5kZXggPCBtX2NhbGxlZUNvdW50KTsKKyAgICAgICAgcmV0dXJu
ICptX2NhbGxlZXNbY2FsbGVlSW5kZXggKyBtX2NhbGxlZUNvdW50XS5nZXQoKTsKKyAgICB9Cisg
ICAgYm9vbCBpc1NhZmVUb1J1bihNZW1vcnlNb2RlKTsKKworcHJpdmF0ZToKKyAgICBDb2RlQmxv
Y2soVk0mLCBNZW1vcnlNb2RlLCBNb2R1bGVJbmZvcm1hdGlvbiYpOworICAgIHVuc2lnbmVkIG1f
Y2FsbGVlQ291bnQ7CisgICAgTWVtb3J5TW9kZSBtX21vZGU7CisgICAgVmVjdG9yPFJlZlB0cjxD
YWxsZWU+PiBtX2NhbGxlZXM7CisgICAgVmVjdG9yPE1hY3JvQXNzZW1ibGVyQ29kZVJlZj4gbV93
YXNtVG9XYXNtRXhpdFN0dWJzOworICAgIFJlZlB0cjxQbGFuPiBtX3BsYW47CisgICAgU3RyaW5n
IG1fZXJyb3JNZXNzYWdlOworICAgIExvY2sgbV9sb2NrOworfTsKKworY2xhc3MgTW9kdWxlIDog
cHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPE1vZHVsZT4geworcHVibGljOgorICAgIHN0YXRp
YyBSZWY8TW9kdWxlPiBjcmVhdGUoUmVmPE1vZHVsZUluZm9ybWF0aW9uPiYmIG1vZHVsZUluZm9y
bWF0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgTW9kdWxlKFdURk1v
dmUobW9kdWxlSW5mb3JtYXRpb24pKSk7CisgICAgfQorCisgICAgV2FzbTo6U2lnbmF0dXJlSW5k
ZXggc2lnbmF0dXJlSW5kZXhGcm9tRnVuY3Rpb25JbmRleFNwYWNlKHVuc2lnbmVkIGZ1bmN0aW9u
SW5kZXhTcGFjZSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX21vZHVsZUluZm9ybWF0
aW9uLT5zaWduYXR1cmVJbmRleEZyb21GdW5jdGlvbkluZGV4U3BhY2UoZnVuY3Rpb25JbmRleFNw
YWNlKTsKKyAgICB9CisKKyAgICBjb25zdCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxl
SW5mb3JtYXRpb24oKSBjb25zdCB7IHJldHVybiBtX21vZHVsZUluZm9ybWF0aW9uLmdldCgpOyB9
CisKKyAgICB2b2lkIGNvbXBpbGVTeW5jKFZNJiwgTWVtb3J5TW9kZSk7CisgICAgdm9pZCBjb21w
aWxlQXN5bmMoVk0mLCBNZW1vcnlNb2RlLCBQbGFuOjpDb21wbGV0aW9uVGFzayYmKTsKKworICAg
IFJlZjxDb2RlQmxvY2s+IG5vbk51bGxDb2RlQmxvY2soV2FzbTo6TWVtb3J5TW9kZSBtb2RlKQor
ICAgIHsKKyAgICAgICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBtX2NvZGVCbG9ja3Nbc3RhdGlj
X2Nhc3Q8dWludDhfdD4obW9kZSldLmdldCgpOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghIWNv
ZGVCbG9jayk7CisgICAgICAgIHJldHVybiBtYWtlUmVmKCpjb2RlQmxvY2spOworICAgIH0KKwor
cHJpdmF0ZToKKyAgICBNb2R1bGUoUmVmPE1vZHVsZUluZm9ybWF0aW9uPiYmKTsKKyAgICBSZWY8
TW9kdWxlSW5mb3JtYXRpb24+IG1fbW9kdWxlSW5mb3JtYXRpb247CisgICAgUmVmUHRyPENvZGVC
bG9jaz4gbV9jb2RlQmxvY2tzW1dhc206Ok51bWJlck9mTWVtb3J5TW9kZXNdOworICAgIExvY2sg
bV9sb2NrOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6Oldhc20KKworI2VuZGlmIC8vIEVO
QUJMRShXRUJBU1NFTUJMWSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21Q
bGFuLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxh
bi5jcHAJKHJldmlzaW9uIDIxNDk3MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dh
c21QbGFuLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTgsNyArNTgsNyBAQCBQbGFuOjpQbGFuKFZN
JiB2bSwgUmVmPE1vZHVsZUluZm9ybWF0aW9uCiAgICAgLCBtX3N0YXRlKFN0YXRlOjpWYWxpZGF0
ZWQpCiAgICAgLCBtX2FzeW5jV29yayh3b3JrKQogewotICAgIG1fY29tcGxldGlvblRhc2tzLmFw
cGVuZChXVEZNb3ZlKHRhc2spKTsKKyAgICBtX2NvbXBsZXRpb25UYXNrcy5hcHBlbmQoc3RkOjpt
YWtlX3BhaXIoJnZtLCBXVEZNb3ZlKHRhc2spKSk7CiB9CiAKIFBsYW46OlBsYW4oVk0mIHZtLCBW
ZWN0b3I8dWludDhfdD4mJiBzb3VyY2UsIEFzeW5jV29yayB3b3JrLCBDb21wbGV0aW9uVGFzayYm
IHRhc2spCkBAIC03NSw3ICs3NSw3IEBAIFBsYW46OlBsYW4oVk0mIHZtLCBjb25zdCB1aW50OF90
KiBzb3VyY2UKICAgICAsIG1fc3RhdGUoU3RhdGU6OkluaXRpYWwpCiAgICAgLCBtX2FzeW5jV29y
ayh3b3JrKQogewotICAgIG1fY29tcGxldGlvblRhc2tzLmFwcGVuZChXVEZNb3ZlKHRhc2spKTsK
KyAgICBtX2NvbXBsZXRpb25UYXNrcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIoJnZtLCBXVEZNb3Zl
KHRhc2spKSk7CiB9CiAKIGNvbnN0IGNoYXIqIFBsYW46OnN0YXRlU3RyaW5nKFN0YXRlIHN0YXRl
KQpAQCAtMTA0LDEzICsxMDQsMTMgQEAgdm9pZCBQbGFuOjpmYWlsKGNvbnN0IEFic3RyYWN0TG9j
a2VyJiBsbwogICAgIGNvbXBsZXRlKGxvY2tlcik7CiB9CiAKLXZvaWQgUGxhbjo6YWRkQ29tcGxl
dGlvblRhc2soQ29tcGxldGlvblRhc2smJiB0YXNrKQordm9pZCBQbGFuOjphZGRDb21wbGV0aW9u
VGFzayhWTSYgdm0sIENvbXBsZXRpb25UYXNrJiYgdGFzaykKIHsKICAgICBMb2NrSG9sZGVyIGxv
Y2tlcihtX2xvY2spOwogICAgIGlmIChtX3N0YXRlICE9IFN0YXRlOjpDb21wbGV0ZWQpCi0gICAg
ICAgIG1fY29tcGxldGlvblRhc2tzLmFwcGVuZChXVEZNb3ZlKHRhc2spKTsKKyAgICAgICAgbV9j
b21wbGV0aW9uVGFza3MuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKCZ2bSwgV1RGTW92ZSh0YXNrKSkp
OwogICAgIGVsc2UKLSAgICAgICAgdGFzaygqdGhpcyk7CisgICAgICAgIHRhc2sodm0sIHRoaXMp
OwogfQogCiBib29sIFBsYW46OnBhcnNlQW5kVmFsaWRhdGVNb2R1bGUoKQpAQCAtMTgyLDcgKzE4
Miw3IEBAIHZvaWQgUGxhbjo6cHJlcGFyZSgpCiAgICAgfTsKIAogICAgIGNvbnN0IGF1dG8mIGZ1
bmN0aW9uTG9jYXRpb25zID0gbV9tb2R1bGVJbmZvcm1hdGlvbi0+ZnVuY3Rpb25Mb2NhdGlvbklu
QmluYXJ5OwotICAgIGlmICghdHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fd2FzbUV4aXRTdHVicywgbV9t
b2R1bGVJbmZvcm1hdGlvbi0+aW1wb3J0RnVuY3Rpb25TaWduYXR1cmVJbmRpY2VzLnNpemUoKSwg
IiBXZWJBc3NlbWJseSB0byBKYXZhU2NyaXB0IHN0dWJzIikKKyAgICBpZiAoIXRyeVJlc2VydmVD
YXBhY2l0eShtX3dhc21Ub1dhc21FeGl0U3R1YnMsIG1fbW9kdWxlSW5mb3JtYXRpb24tPmltcG9y
dEZ1bmN0aW9uU2lnbmF0dXJlSW5kaWNlcy5zaXplKCksICIgV2ViQXNzZW1ibHkgdG8gSmF2YVNj
cmlwdCBzdHVicyIpCiAgICAgICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHkobV91bmxpbmtlZFdh
c21Ub1dhc21DYWxscywgZnVuY3Rpb25Mb2NhdGlvbnMuc2l6ZSgpLCAiIHVubGlua2VkIFdlYkFz
c2VtYmx5IHRvIFdlYkFzc2VtYmx5IGNhbGxzIikKICAgICAgICAgfHwgIXRyeVJlc2VydmVDYXBh
Y2l0eShtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucywgZnVuY3Rpb25Mb2NhdGlvbnMuc2l6ZSgpLCAi
IFdlYkFzc2VtYmx5IGZ1bmN0aW9ucyIpCiAgICAgICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHko
bV9jb21waWxhdGlvbkNvbnRleHRzLCBmdW5jdGlvbkxvY2F0aW9ucy5zaXplKCksICIgY29tcGls
YXRpb24gY29udGV4dHMiKSkKQEAgLTE5NiwxMCArMTk2LDEwIEBAIHZvaWQgUGxhbjo6cHJlcGFy
ZSgpCiAgICAgICAgIEltcG9ydCogaW1wb3J0ID0gJm1fbW9kdWxlSW5mb3JtYXRpb24tPmltcG9y
dHNbaW1wb3J0SW5kZXhdOwogICAgICAgICBpZiAoaW1wb3J0LT5raW5kICE9IEV4dGVybmFsS2lu
ZDo6RnVuY3Rpb24pCiAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgdW5zaWduZWQgaW1w
b3J0RnVuY3Rpb25JbmRleCA9IG1fd2FzbUV4aXRTdHVicy5zaXplKCk7Ci0gICAgICAgIGRhdGFM
b2dMbklmKHZlcmJvc2UsICJQcm9jZXNzaW5nIGltcG9ydCBmdW5jdGlvbiBudW1iZXIgIiwgaW1w
b3J0RnVuY3Rpb25JbmRleCwgIjogIiwgbWFrZVN0cmluZyhpbXBvcnQtPm1vZHVsZSksICI6ICIs
IG1ha2VTdHJpbmcoaW1wb3J0LT5maWVsZCkpOwotICAgICAgICBTaWduYXR1cmVJbmRleCBzaWdu
YXR1cmVJbmRleCA9IG1fbW9kdWxlSW5mb3JtYXRpb24tPmltcG9ydEZ1bmN0aW9uU2lnbmF0dXJl
SW5kaWNlcy5hdChpbXBvcnQtPmtpbmRJbmRleCk7Ci0gICAgICAgIG1fd2FzbUV4aXRTdHVicy51
bmNoZWNrZWRBcHBlbmQoZXhpdFN0dWJHZW5lcmF0b3IoJm1fdm0sIG1fY2FsbExpbmtJbmZvcywg
c2lnbmF0dXJlSW5kZXgsIGltcG9ydEZ1bmN0aW9uSW5kZXgpKTsKKyAgICAgICAgdW5zaWduZWQg
aW1wb3J0RnVuY3Rpb25JbmRleCA9IG1fd2FzbVRvV2FzbUV4aXRTdHVicy5zaXplKCk7CisgICAg
ICAgIC8vZGF0YUxvZ0xuSWYodmVyYm9zZSwgIlByb2Nlc3NpbmcgaW1wb3J0IGZ1bmN0aW9uIG51
bWJlciAiLCBpbXBvcnRGdW5jdGlvbkluZGV4LCAiOiAiLCBtYWtlU3RyaW5nKGltcG9ydC0+bW9k
dWxlKSwgIjogIiwgbWFrZVN0cmluZyhpbXBvcnQtPmZpZWxkKSk7CisgICAgICAgIC8vU2lnbmF0
dXJlSW5kZXggc2lnbmF0dXJlSW5kZXggPSBtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRGdW5j
dGlvblNpZ25hdHVyZUluZGljZXMuYXQoaW1wb3J0LT5raW5kSW5kZXgpOworICAgICAgICBtX3dh
c21Ub1dhc21FeGl0U3R1YnMudW5jaGVja2VkQXBwZW5kKHdhc21Ub1dhc20oaW1wb3J0RnVuY3Rp
b25JbmRleCkpOwogICAgIH0KIAogICAgIG1vdmVUb1N0YXRlKFN0YXRlOjpQcmVwYXJlZCk7CkBA
IC0yNjAsNyArMjYwLDcgQEAgdm9pZCBQbGFuOjpjb21waWxlRnVuY3Rpb25zKENvbXBpbGF0aW9u
RQogICAgICAgICBBU1NFUlQoZnVuY3Rpb25MZW5ndGggPD0gbV9zb3VyY2VMZW5ndGgpOwogICAg
ICAgICBTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCA9IG1fbW9kdWxlSW5mb3JtYXRpb24t
PmludGVybmFsRnVuY3Rpb25TaWduYXR1cmVJbmRpY2VzW2Z1bmN0aW9uSW5kZXhdOwogICAgICAg
ICBjb25zdCBTaWduYXR1cmUmIHNpZ25hdHVyZSA9IFNpZ25hdHVyZUluZm9ybWF0aW9uOjpnZXQo
c2lnbmF0dXJlSW5kZXgpOwotICAgICAgICB1bnNpZ25lZCBmdW5jdGlvbkluZGV4U3BhY2UgPSBt
X3dhc21FeGl0U3R1YnMuc2l6ZSgpICsgZnVuY3Rpb25JbmRleDsKKyAgICAgICAgdW5zaWduZWQg
ZnVuY3Rpb25JbmRleFNwYWNlID0gbV93YXNtVG9XYXNtRXhpdFN0dWJzLnNpemUoKSArIGZ1bmN0
aW9uSW5kZXg7CiAgICAgICAgIEFTU0VSVF9VTlVTRUQoZnVuY3Rpb25JbmRleFNwYWNlLCBtX21v
ZHVsZUluZm9ybWF0aW9uLT5zaWduYXR1cmVJbmRleEZyb21GdW5jdGlvbkluZGV4U3BhY2UoZnVu
Y3Rpb25JbmRleFNwYWNlKSA9PSBzaWduYXR1cmVJbmRleCk7CiAgICAgICAgIEFTU0VSVCh2YWxp
ZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVuZ3RoLCBzaWduYXR1cmUsIG1f
bW9kdWxlSW5mb3JtYXRpb24uZ2V0KCkpKTsKIApAQCAtMzE2LDkgKzMxNiw5IEBAIHZvaWQgUGxh
bjo6Y29tcGxldGUoY29uc3QgQWJzdHJhY3RMb2NrZXIKICAgICAgICAgICAgICAgICB2b2lkKiBl
eGVjdXRhYmxlQWRkcmVzczsKICAgICAgICAgICAgICAgICBpZiAobV9tb2R1bGVJbmZvcm1hdGlv
bi0+aXNJbXBvcnRlZEZ1bmN0aW9uRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZShjYWxsLmZ1bmN0aW9u
SW5kZXgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGltcG9ydHMgY291bGQgaGF2
ZSBiZWVuIGxpbmtlZCBpbiBCMywgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgcGF0Y2hwb2ludC4g
VGhpcyBjb25kaXRpb24gc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgUkVMRUFTRV9BU1NFUlQuIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjY0NjIKLSAgICAgICAgICAg
ICAgICAgICAgZXhlY3V0YWJsZUFkZHJlc3MgPSBtX3dhc21FeGl0U3R1YnMuYXQoY2FsbC5mdW5j
dGlvbkluZGV4KS53YXNtVG9XYXNtLmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOworICAgICAg
ICAgICAgICAgICAgICBleGVjdXRhYmxlQWRkcmVzcyA9IG1fd2FzbVRvV2FzbUV4aXRTdHVicy5h
dChjYWxsLmZ1bmN0aW9uSW5kZXgpLmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOwogICAgICAg
ICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlQWRkcmVzcyA9
IG1fd2FzbUludGVybmFsRnVuY3Rpb25zLmF0KGNhbGwuZnVuY3Rpb25JbmRleCAtIG1fd2FzbUV4
aXRTdHVicy5zaXplKCkpLT53YXNtRW50cnlwb2ludC5jb21waWxhdGlvbi0+Y29kZSgpLmV4ZWN1
dGFibGVBZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVBZGRyZXNzID0g
bV93YXNtSW50ZXJuYWxGdW5jdGlvbnMuYXQoY2FsbC5mdW5jdGlvbkluZGV4IC0gbV93YXNtVG9X
YXNtRXhpdFN0dWJzLnNpemUoKSktPndhc21FbnRyeXBvaW50LmNvbXBpbGF0aW9uLT5jb2RlKCku
ZXhlY3V0YWJsZUFkZHJlc3MoKTsKICAgICAgICAgICAgICAgICBNYWNyb0Fzc2VtYmxlcjo6cmVw
YXRjaENhbGwoY2FsbC5jYWxsTG9jYXRpb24sIENvZGVMb2NhdGlvbkxhYmVsKGV4ZWN1dGFibGVB
ZGRyZXNzKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMyNyw3ICszMjcsNyBAQCB2
b2lkIFBsYW46OmNvbXBsZXRlKGNvbnN0IEFic3RyYWN0TG9ja2VyCiAgICAgaWYgKG1fc3RhdGUg
IT0gU3RhdGU6OkNvbXBsZXRlZCkgewogICAgICAgICBtb3ZlVG9TdGF0ZShTdGF0ZTo6Q29tcGxl
dGVkKTsKICAgICAgICAgZm9yIChhdXRvJiB0YXNrIDogbV9jb21wbGV0aW9uVGFza3MpCi0gICAg
ICAgICAgICB0YXNrKCp0aGlzKTsKKyAgICAgICAgICAgIHRhc2suc2Vjb25kKCp0YXNrLmZpcnN0
LCB0aGlzKTsKICAgICAgICAgbV9jb21wbGV0ZWQubm90aWZ5QWxsKCk7CiAgICAgfQogfQpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5oCShyZXZpc2lvbiAyMTQ5NzIpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5oCSh3b3JraW5nIGNvcHkpCkBA
IC00NSw4ICs0NSwxMCBAQCBuYW1lc3BhY2UgV2FzbSB7CiAKIGNsYXNzIFBsYW4gOiBwdWJsaWMg
VGhyZWFkU2FmZVJlZkNvdW50ZWQ8UGxhbj4gewogcHVibGljOgotICAgIHN0YXRpYyB2b2lkIGRv
bnRGaW5hbGl6ZShQbGFuJikgeyB9Ci0gICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoUGxh
biYpPiBDb21wbGV0aW9uVGFzazsKKyAgICBzdGF0aWMgdm9pZCBkb250RmluYWxpemUoVk0mLCBQ
bGFuKikgeyB9CisgICAgLy8gVGhlIHBsYW4gbWF5IG9yIG1heSBub3QgYmUgbnVsbCwgZGVwZW5k
aW5nIG9uIGhvdyBhIENvbXBsZXRpb25UYXNrCisgICAgLy8gaXMgY2FsbGVkLiBPYnZpb3VzbHkg
aWYgdGhlIHBsYW4gZXZlciBjYWxscyB0aGUgdGFzaywgaXQnbGwgYmUgbm9uLW51bGwuCisgICAg
dHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoVk0mLCBQbGFuKik+IENvbXBsZXRpb25UYXNrOwog
ICAgIGVudW0gQXN5bmNXb3JrIDogdWludDhfdCB7IEZ1bGxDb21waWxlLCBWYWxpZGF0aW9uIH07
CiAgICAgLy8gTm90ZTogQ29tcGxldGlvblRhc2sgc2hvdWxkIG5vdCBob2xkIGEgcmVmZXJlbmNl
IHRvIHRoZSBQbGFuIG90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGEgcmVmZXJlbmNlIGN5Y2xlLgog
ICAgIFBsYW4oVk0mLCBSZWY8TW9kdWxlSW5mb3JtYXRpb24+LCBBc3luY1dvcmssIENvbXBsZXRp
b25UYXNrJiYpOwpAQCAtNTYsNyArNTgsOSBAQCBwdWJsaWM6CiAgICAgSlNfRVhQT1JUX1BSSVZB
VEUgUGxhbihWTSYsIGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QsIEFzeW5jV29yaywgQ29tcGxldGlv
blRhc2smJik7CiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgflBsYW4oKTsKIAotICAgIHZvaWQgYWRk
Q29tcGxldGlvblRhc2soQ29tcGxldGlvblRhc2smJik7CisgICAgLy8gSWYgeW91IGd1YXJhbnRl
ZSB0aGUgb3JkZXJpbmcgaGVyZSwgeW91IGNhbiByZWx5IG9uIEZJRk8gb2YgdGhlCisgICAgLy8g
Y29tcGxldGlvbiB0YXNrcyBiZWluZyBjYWxsZWQuCisgICAgdm9pZCBhZGRDb21wbGV0aW9uVGFz
ayhWTSYsIENvbXBsZXRpb25UYXNrJiYpOwogCiAgICAgYm9vbCBwYXJzZUFuZFZhbGlkYXRlTW9k
dWxlKCk7CiAKQEAgLTkxLDEwICs5NSwxMCBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBXVEZN
b3ZlKG1fY2FsbExpbmtJbmZvcyk7CiAgICAgfQogCi0gICAgVmVjdG9yPFdhc21FeGl0U3R1YnM+
JiYgdGFrZVdhc21FeGl0U3R1YnMoKQorICAgIFZlY3RvcjxNYWNyb0Fzc2VtYmxlckNvZGVSZWY+
JiYgdGFrZVdhc21Ub1dhc21FeGl0U3R1YnMoKQogICAgIHsKICAgICAgICAgUkVMRUFTRV9BU1NF
UlQoIWZhaWxlZCgpICYmICFoYXNXb3JrKCkpOwotICAgICAgICByZXR1cm4gV1RGTW92ZShtX3dh
c21FeGl0U3R1YnMpOworICAgICAgICByZXR1cm4gV1RGTW92ZShtX3dhc21Ub1dhc21FeGl0U3R1
YnMpOwogICAgIH0KIAogICAgIHZvaWQgc2V0TW9kZShNZW1vcnlNb2RlIG1vZGUpIHsgbV9tb2Rl
ID0gbW9kZTsgfQpAQCAtMTMxLDEyICsxMzUsMTIgQEAgcHJpdmF0ZToKIAogICAgIFJlZjxNb2R1
bGVJbmZvcm1hdGlvbj4gbV9tb2R1bGVJbmZvcm1hdGlvbjsKICAgICBCYWc8Q2FsbExpbmtJbmZv
PiBtX2NhbGxMaW5rSW5mb3M7Ci0gICAgVmVjdG9yPFdhc21FeGl0U3R1YnM+IG1fd2FzbUV4aXRT
dHViczsKKyAgICBWZWN0b3I8TWFjcm9Bc3NlbWJsZXJDb2RlUmVmPiBtX3dhc21Ub1dhc21FeGl0
U3R1YnM7CiAgICAgVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxXYXNtSW50ZXJuYWxGdW5jdGlvbj4+
IG1fd2FzbUludGVybmFsRnVuY3Rpb25zOwogICAgIFZlY3RvcjxDb21waWxhdGlvbkNvbnRleHQ+
IG1fY29tcGlsYXRpb25Db250ZXh0czsKIAogICAgIFZNJiBtX3ZtOwotICAgIFZlY3RvcjxDb21w
bGV0aW9uVGFzaywgMT4gbV9jb21wbGV0aW9uVGFza3M7CisgICAgVmVjdG9yPHN0ZDo6cGFpcjxW
TSosIENvbXBsZXRpb25UYXNrPiwgMT4gbV9jb21wbGV0aW9uVGFza3M7CiAKICAgICBWZWN0b3I8
VmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+PiBtX3VubGlua2VkV2FzbVRvV2FzbUNhbGxz
OwogICAgIGNvbnN0IHVpbnQ4X3QqIG1fc291cmNlOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUNvZGVCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUNvZGVCbG9jay5jcHAJKHJl
dmlzaW9uIDIxNDk3MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNz
ZW1ibHlDb2RlQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiwyNCArMzIsMjcgQEAKICNp
bmNsdWRlICJKU1dlYkFzc2VtYmx5TGlua0Vycm9yLmgiCiAjaW5jbHVkZSAiSlNXZWJBc3NlbWJs
eU1lbW9yeS5oIgogI2luY2x1ZGUgIkpTV2ViQXNzZW1ibHlNb2R1bGUuaCIKKyNpbmNsdWRlICJX
YXNtQmluZGluZy5oIgogI2luY2x1ZGUgIldhc21QbGFuSW5saW5lcy5oIgogCiBuYW1lc3BhY2Ug
SlNDIHsKIAogY29uc3QgQ2xhc3NJbmZvIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6OnNfaW5mbyA9
IHsgIldlYkFzc2VtYmx5Q29kZUJsb2NrIiwgbnVsbHB0ciwgMCwgQ1JFQVRFX01FVEhPRF9UQUJM
RShKU1dlYkFzc2VtYmx5Q29kZUJsb2NrKSB9OwogCi1KU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpK
U1dlYkFzc2VtYmx5Q29kZUJsb2NrKFZNJiB2bSwgSlNXZWJBc3NlbWJseU1vZHVsZSogb3duZXIs
ICBXYXNtOjpNZW1vcnlNb2RlIG1vZGUsIFJlZjxXYXNtOjpQbGFuPiYmIHBsYW4sIHVuc2lnbmVk
IGNhbGxlZUNvdW50KQorSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6SlNXZWJBc3NlbWJseUNvZGVC
bG9jayhWTSYgdm0sIFJlZjxXYXNtOjpDb2RlQmxvY2s+JiYgY29kZUJsb2NrLCBjb25zdCBXYXNt
OjpNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5mb3JtYXRpb24pCiAgICAgOiBCYXNlKHZtLCB2
bS53ZWJBc3NlbWJseUNvZGVCbG9ja1N0cnVjdHVyZS5nZXQoKSkKLSAgICAsIG1fcGxhbihXVEZN
b3ZlKHBsYW4pKQotICAgICwgbV9tb2RlKG1vZGUpCi0gICAgLCBtX2NhbGxlZUNvdW50KGNhbGxl
ZUNvdW50KQotewotICAgIG1fbW9kdWxlLnNldCh2bSwgdGhpcywgb3duZXIpOwotICAgIEFTU0VS
VCghbW9kdWxlKCktPmNvZGVCbG9jayhtb2RlKSk7Ci0gICAgbW9kdWxlKCktPnNldENvZGVCbG9j
ayh2bSwgbW9kZSwgdGhpcyk7Ci0gICAgbV9jYWxsZWVzLnJlc2l6ZShtX2NhbGxlZUNvdW50ICog
Mik7CisgICAgLCBtX2NvZGVCbG9jayhXVEZNb3ZlKGNvZGVCbG9jaykpCit7CisgICAgLy8gRklY
TUU6IGFsbG9jYXRlIGNhbGwgbGluayBpbmZvcyBoZXJlLgorICAgIG1fd2FzbVRvSlNFeGl0U3R1
YnMucmVzZXJ2ZUNhcGFjaXR5KG1fY29kZUJsb2NrLT5mdW5jdGlvbkltcG9ydENvdW50KCkpOwor
ICAgIGZvciAodW5zaWduZWQgaW1wb3J0SW5kZXggPSAwOyBpbXBvcnRJbmRleCA8IG1fY29kZUJs
b2NrLT5mdW5jdGlvbkltcG9ydENvdW50KCk7ICsraW1wb3J0SW5kZXgpIHsKKyAgICAgICAgV2Fz
bTo6U2lnbmF0dXJlSW5kZXggc2lnbmF0dXJlSW5kZXggPSBtb2R1bGVJbmZvcm1hdGlvbi5pbXBv
cnRGdW5jdGlvblNpZ25hdHVyZUluZGljZXMuYXQoaW1wb3J0SW5kZXgpOworICAgICAgICBtX3dh
c21Ub0pTRXhpdFN0dWJzLnVuY2hlY2tlZEFwcGVuZChXYXNtOjp3YXNtVG9Kcygmdm0sIG1fY2Fs
bExpbmtJbmZvcywgc2lnbmF0dXJlSW5kZXgsIGltcG9ydEluZGV4KSk7CisgICAgICAgIGltcG9y
dFdhc21Ub0pTU3R1YihpbXBvcnRJbmRleCkgPSBtX3dhc21Ub0pTRXhpdFN0dWJzW2ltcG9ydElu
ZGV4XS5jb2RlKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKKyAgICB9CiB9CiAKKy8qCiB2b2lkIEpT
V2ViQXNzZW1ibHlDb2RlQmxvY2s6OmluaXRpYWxpemUoKQogewogICAgIGlmIChpbml0aWFsaXpl
ZCgpKQpAQCAtODIsNiArODUsNyBAQCB2b2lkIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6OmluaXRp
YWxpemUoCiAKICAgICBtX3BsYW4gPSBudWxscHRyOwogfQorKi8KIAogdm9pZCBKU1dlYkFzc2Vt
Ymx5Q29kZUJsb2NrOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKIHsKQEAgLTkwLDI0ICs5NCw3IEBA
IHZvaWQgSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6ZGVzdHJveShKU0MKIAogYm9vbCBKU1dlYkFz
c2VtYmx5Q29kZUJsb2NrOjppc1NhZmVUb1J1bihKU1dlYkFzc2VtYmx5TWVtb3J5KiBtZW1vcnkp
IGNvbnN0CiB7Ci0gICAgaWYgKCFydW5uYWJsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBXYXNtOjpNZW1vcnlNb2RlIGNvZGVNb2RlID0gbW9kZSgpOwotICAgIFdhc206Ok1lbW9y
eU1vZGUgbWVtb3J5TW9kZSA9IG1lbW9yeS0+bWVtb3J5KCkubW9kZSgpOwotICAgIHN3aXRjaCAo
Y29kZU1vZGUpIHsKLSAgICBjYXNlIFdhc206Ok1lbW9yeU1vZGU6OkJvdW5kc0NoZWNraW5nOgot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIFdhc206Ok1lbW9yeU1vZGU6OlNpZ25hbGlu
ZzoKLSAgICAgICAgLy8gQ29kZSBiZWluZyBpbiBTaWduYWxpbmcgbW9kZSBtZWFucyB0aGF0IGl0
IHBlcmZvcm1zIG5vIGJvdW5kcyBjaGVja3MuCi0gICAgICAgIC8vIEl0cyBtZW1vcnksIGV2ZW4g
aWYgZW1wdHksIGFic29sdXRlbHkgbXVzdCBhbHNvIGJlIGluIFNpZ25hbGluZyBtb2RlCi0gICAg
ICAgIC8vIGJlY2F1c2UgdGhlIHBhZ2UgcHJvdGVjdGlvbiBkZXRlY3RzIG91dC1vZi1ib3VuZHMg
YWNjZXNzZXMuCi0gICAgICAgIHJldHVybiBtZW1vcnlNb2RlID09IFdhc206Ok1lbW9yeU1vZGU6
OlNpZ25hbGluZzsKLSAgICBjYXNlIFdhc206Ok1lbW9yeU1vZGU6Ok51bWJlck9mTWVtb3J5TW9k
ZXM6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gbV9jb2RlQmxvY2stPmlzU2FmZVRv
UnVuKG1lbW9yeS0+bWVtb3J5KCkubW9kZSgpKTsKIH0KIAogdm9pZCBKU1dlYkFzc2VtYmx5Q29k
ZUJsb2NrOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3Ip
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5Q29kZUJs
b2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJB
c3NlbWJseUNvZGVCbG9jay5oCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5Q29kZUJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAg
LTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJVbmNvbmRpdGlvbmFsRmluYWxpemVyLmgiCiAjaW5j
bHVkZSAiV2FzbUNhbGxlZS5oIgogI2luY2x1ZGUgIldhc21Gb3JtYXQuaCIKKyNpbmNsdWRlICJX
YXNtTW9kdWxlLmgiCiAjaW5jbHVkZSA8d3RmL0JhZy5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3Iu
aD4KIApAQCAtNTAsOSArNTEsOSBAQCBwdWJsaWM6CiAgICAgdHlwZWRlZiBKU0NlbGwgQmFzZTsK
ICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1
cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7CiAKLSAgICBzdGF0aWMgSlNXZWJBc3NlbWJs
eUNvZGVCbG9jayogY3JlYXRlKFZNJiB2bSwgSlNXZWJBc3NlbWJseU1vZHVsZSogb3duZXIsIFdh
c206Ok1lbW9yeU1vZGUgbW9kZSwgUmVmPFdhc206OlBsYW4+JiYgcGxhbiwgdW5zaWduZWQgY2Fs
bGVlQ291bnQsIHVuc2lnbmVkIGZ1bmN0aW9uSW1wb3J0Q291bnQpCisgICAgc3RhdGljIEpTV2Vi
QXNzZW1ibHlDb2RlQmxvY2sqIGNyZWF0ZShWTSYgdm0sIFJlZjxXYXNtOjpDb2RlQmxvY2s+IGNv
ZGVCbG9jaywgY29uc3QgV2FzbTo6TW9kdWxlSW5mb3JtYXRpb24mIG1vZHVsZUluZm9ybWF0aW9u
KQogICAgIHsKLSAgICAgICAgYXV0byogcmVzdWx0ID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNl
bGw8SlNXZWJBc3NlbWJseUNvZGVCbG9jaz4odm0uaGVhcCwgYWxsb2NhdGlvblNpemUoZnVuY3Rp
b25JbXBvcnRDb3VudCkpKSBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrKHZtLCBvd25lciwgbW9kZSwg
V1RGTW92ZShwbGFuKSwgY2FsbGVlQ291bnQpOworICAgICAgICBhdXRvKiByZXN1bHQgPSBuZXcg
KE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxKU1dlYkFzc2VtYmx5Q29kZUJsb2NrPih2bS5oZWFwLCBh
bGxvY2F0aW9uU2l6ZShtb2R1bGVJbmZvcm1hdGlvbi5pbXBvcnRGdW5jdGlvbkNvdW50KCkpKSkg
SlNXZWJBc3NlbWJseUNvZGVCbG9jayh2bSwgV1RGTW92ZShjb2RlQmxvY2spLCBtb2R1bGVJbmZv
cm1hdGlvbik7CiAgICAgICAgIHJlc3VsdC0+ZmluaXNoQ3JlYXRpb24odm0pOwogICAgICAgICBy
ZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTYyLDQwICs2MywzMyBAQCBwdWJsaWM6CiAgICAgICAg
IHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90b3R5cGUsIFR5
cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CiAgICAgfQogCi0gICAg
dW5zaWduZWQgZnVuY3Rpb25JbXBvcnRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fd2FzbUV4aXRT
dHVicy5zaXplKCk7IH0KLSAgICBXYXNtOjpNZW1vcnlNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVy
biBtX21vZGU7IH0KKyAgICB1bnNpZ25lZCBmdW5jdGlvbkltcG9ydENvdW50KCkgY29uc3QgeyBy
ZXR1cm4gbV9jb2RlQmxvY2stPmZ1bmN0aW9uSW1wb3J0Q291bnQoKTsgfQorICAgIC8vV2FzbTo6
TWVtb3J5TW9kZSBtb2RlKCkgY29uc3QgeyByZXR1cm4gbV9tb2RlOyB9CiAgICAgSlNXZWJBc3Nl
bWJseU1vZHVsZSogbW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9tb2R1bGUuZ2V0KCk7IH0KIAog
ICAgIC8vIERvbid0IGNhbGwgaW50aWFsaXplIGRpcmVjdGx5LCB0aGlzIHNob3VsZCBiZSBjYWxs
ZWQgZm9yIHlvdSwgYXMgbmVlZGVkLCBieSBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmZpbmFsaXpl
Q3JlYXRpb24uCi0gICAgdm9pZCBpbml0aWFsaXplKCk7Ci0gICAgYm9vbCBpbml0aWFsaXplZCgp
IGNvbnN0IHsgcmV0dXJuICFtX3BsYW47IH0KKyAgICAvL3ZvaWQgaW5pdGlhbGl6ZSgpOworICAg
IC8vYm9vbCBpbml0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuICFtX3BsYW47IH0KIAotICAgIFdh
c206OlBsYW4mIHBsYW4oKSBjb25zdCB7IEFTU0VSVCghaW5pdGlhbGl6ZWQoKSk7IHJldHVybiAq
bV9wbGFuOyB9CisgICAgLy9XYXNtOjpQbGFuJiBwbGFuKCkgY29uc3QgeyBBU1NFUlQoIWluaXRp
YWxpemVkKCkpOyByZXR1cm4gKm1fcGxhbjsgfQogCi0gICAgYm9vbCBydW5uYWJsZSgpIGNvbnN0
IHsgcmV0dXJuIGluaXRpYWxpemVkKCkgJiYgIW1fZXJyb3JNZXNzYWdlOyB9Ci0gICAgU3RyaW5n
JiBlcnJvck1lc3NhZ2UoKSB7IEFTU0VSVCghcnVubmFibGUoKSk7IHJldHVybiBtX2Vycm9yTWVz
c2FnZTsgfQorICAgIC8vYm9vbCBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGluaXRpYWxpemVk
KCkgJiYgIW1fZXJyb3JNZXNzYWdlOyB9CiAgICAgYm9vbCBpc1NhZmVUb1J1bihKU1dlYkFzc2Vt
Ymx5TWVtb3J5KikgY29uc3Q7CiAKICAgICAvLyBUaGVzZSB0d28gY2FsbGVlIGdldHRlcnMgYXJl
IG9ubHkgdmFsaWQgb25jZSB0aGUgY2FsbGVlcyBoYXZlIGJlZW4gcG9wdWxhdGVkLgorCiAgICAg
V2FzbTo6Q2FsbGVlJiBqc0VudHJ5cG9pbnRDYWxsZWVGcm9tRnVuY3Rpb25JbmRleFNwYWNlKHVu
c2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFjZSkKICAgICB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJU
KGZ1bmN0aW9uSW5kZXhTcGFjZSA+PSBmdW5jdGlvbkltcG9ydENvdW50KCkpOwotICAgICAgICB1
bnNpZ25lZCBjYWxsZWVJbmRleCA9IGZ1bmN0aW9uSW5kZXhTcGFjZSAtIGZ1bmN0aW9uSW1wb3J0
Q291bnQoKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoY2FsbGVlSW5kZXggPCBtX2NhbGxlZUNv
dW50KTsKLSAgICAgICAgcmV0dXJuICptX2NhbGxlZXNbY2FsbGVlSW5kZXhdLmdldCgpOworICAg
ICAgICByZXR1cm4gbV9jb2RlQmxvY2stPmpzRW50cnlwb2ludENhbGxlZUZyb21GdW5jdGlvbklu
ZGV4U3BhY2UoZnVuY3Rpb25JbmRleFNwYWNlKTsKICAgICB9CiAgICAgV2FzbTo6Q2FsbGVlJiB3
YXNtRW50cnlwb2ludENhbGxlZUZyb21GdW5jdGlvbkluZGV4U3BhY2UodW5zaWduZWQgZnVuY3Rp
b25JbmRleFNwYWNlKQogICAgIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoZnVuY3Rpb25JbmRl
eFNwYWNlID49IGZ1bmN0aW9uSW1wb3J0Q291bnQoKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNhbGxl
ZUluZGV4ID0gZnVuY3Rpb25JbmRleFNwYWNlIC0gZnVuY3Rpb25JbXBvcnRDb3VudCgpOwotICAg
ICAgICBSRUxFQVNFX0FTU0VSVChjYWxsZWVJbmRleCA8IG1fY2FsbGVlQ291bnQpOwotICAgICAg
ICByZXR1cm4gKm1fY2FsbGVlc1tjYWxsZWVJbmRleCArIG1fY2FsbGVlQ291bnRdLmdldCgpOwor
ICAgICAgICByZXR1cm4gbV9jb2RlQmxvY2stPndhc21FbnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0
aW9uSW5kZXhTcGFjZShmdW5jdGlvbkluZGV4U3BhY2UpOwogICAgIH0KIAogICAgIHZvaWQqIHdh
c21Ub0pzQ2FsbFN0dWJGb3JJbXBvcnQodW5zaWduZWQgaW1wb3J0SW5kZXgpCiAgICAgewotICAg
ICAgICBSRUxFQVNFX0FTU0VSVChpbXBvcnRJbmRleCA8IG1fd2FzbUV4aXRTdHVicy5zaXplKCkp
OwotICAgICAgICByZXR1cm4gbV93YXNtRXhpdFN0dWJzW2ltcG9ydEluZGV4XS53YXNtVG9Kcy5j
b2RlKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKKyAgICAgICAgcmV0dXJuIGltcG9ydFdhc21Ub0pT
U3R1YihpbXBvcnRJbmRleCk7CiAgICAgfQogCiAgICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRP
ZkltcG9ydFdhc21Ub0pTU3R1Yih1bnNpZ25lZCBpbXBvcnRJbmRleCkKQEAgLTEwNCwxOCArOTgs
NyBAQCBwdWJsaWM6CiAgICAgfQogCiBwcml2YXRlOgotICAgIHZvaWQgc2V0SlNFbnRyeXBvaW50
Q2FsbGVlKHVuc2lnbmVkIGNhbGxlZUluZGV4LCBSZWY8V2FzbTo6Q2FsbGVlPiYmIGNhbGxlZSkK
LSAgICB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGNhbGxlZUluZGV4IDwgbV9jYWxsZWVDb3Vu
dCk7Ci0gICAgICAgIG1fY2FsbGVlc1tjYWxsZWVJbmRleF0gPSBXVEZNb3ZlKGNhbGxlZSk7Ci0g
ICAgfQotICAgIHZvaWQgc2V0V2FzbUVudHJ5cG9pbnRDYWxsZWUodW5zaWduZWQgY2FsbGVlSW5k
ZXgsIFJlZjxXYXNtOjpDYWxsZWU+JiYgY2FsbGVlKQotICAgIHsKLSAgICAgICAgUkVMRUFTRV9B
U1NFUlQoY2FsbGVlSW5kZXggPCBtX2NhbGxlZUNvdW50KTsKLSAgICAgICAgbV9jYWxsZWVzW2Nh
bGxlZUluZGV4ICsgbV9jYWxsZWVDb3VudF0gPSBXVEZNb3ZlKGNhbGxlZSk7Ci0gICAgfQotCi0g
ICAgSlNXZWJBc3NlbWJseUNvZGVCbG9jayhWTSYsIEpTV2ViQXNzZW1ibHlNb2R1bGUqLCBXYXNt
OjpNZW1vcnlNb2RlLCBSZWY8V2FzbTo6UGxhbj4mJiwgdW5zaWduZWQgY2FsbGVlQ291bnQpOwor
ICAgIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2soVk0mLCBSZWY8V2FzbTo6Q29kZUJsb2NrPiYmLCBj
b25zdCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbiYpOwogICAgIERFQ0xBUkVfRVhQT1JUX0lORk87
CiAgICAgc3RhdGljIGNvbnN0IGJvb2wgbmVlZHNEZXN0cnVjdGlvbiA9IHRydWU7CiAgICAgc3Rh
dGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKQEAgLTE0MSwxNSArMTI0LDEwIEBAIHByaXZhdGU6
CiAgICAgfTsKIAogICAgIFdyaXRlQmFycmllcjxKU1dlYkFzc2VtYmx5TW9kdWxlPiBtX21vZHVs
ZTsKKyAgICBSZWY8V2FzbTo6Q29kZUJsb2NrPiBtX2NvZGVCbG9jazsKKyAgICBWZWN0b3I8TWFj
cm9Bc3NlbWJsZXJDb2RlUmVmPiBtX3dhc21Ub0pTRXhpdFN0dWJzOwogICAgIFVuY29uZGl0aW9u
YWxGaW5hbGl6ZXIgbV91bmNvbmRpdGlvbmFsRmluYWxpemVyOwogICAgIEJhZzxDYWxsTGlua0lu
Zm8+IG1fY2FsbExpbmtJbmZvczsKLSAgICBWZWN0b3I8V2FzbTo6V2FzbUV4aXRTdHVicz4gbV93
YXNtRXhpdFN0dWJzOwotICAgIFZlY3RvcjxSZWZQdHI8V2FzbTo6Q2FsbGVlPj4gbV9jYWxsZWVz
OwotICAgIC8vIFRoZSBwbGFuIHRoYXQgaXMgY29tcGlsaW5nIHRoaXMgY29kZSBibG9jay4KLSAg
ICBSZWZQdHI8V2FzbTo6UGxhbj4gbV9wbGFuOwotICAgIFN0cmluZyBtX2Vycm9yTWVzc2FnZTsK
LSAgICBXYXNtOjpNZW1vcnlNb2RlIG1fbW9kZTsKLSAgICB1bnNpZ25lZCBtX2NhbGxlZUNvdW50
OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgSlNDCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d2FzbS9qcy9KU1dlYkFzc2VtYmx5SW5zdGFuY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlJbnN0YW5jZS5jcHAJKHJldmlzaW9u
IDIxNDk3MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlJ
bnN0YW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk0LDYgKzk0LDcgQEAgdm9pZCBKU1dlYkFz
c2VtYmx5SW5zdGFuY2U6OnZpc2l0Q2hpbGRyZQogICAgICAgICB2aXNpdG9yLmFwcGVuZCh0aGlz
T2JqZWN0LT5pbXBvcnRGdW5jdGlvbnMoKVtpXSk7CiB9CiAKKy8qCiB2b2lkIEpTV2ViQXNzZW1i
bHlJbnN0YW5jZTo6YWRkVW5pdGlhbGl6ZWRDb2RlQmxvY2soVk0mIHZtLCBSZWY8V2FzbTo6UGxh
bj4gcGxhbikKIHsKICAgICBhdXRvKiBjb2RlQmxvY2sgPSBKU1dlYkFzc2VtYmx5Q29kZUJsb2Nr
OjpjcmVhdGUoCkBAIC0xMDEsMTcgKzEwMiwyMSBAQCB2b2lkIEpTV2ViQXNzZW1ibHlJbnN0YW5j
ZTo6YWRkVW5pdGlhbGl6CiAgICAgbV9jb2RlQmxvY2suc2V0KHZtLCB0aGlzLCBjb2RlQmxvY2sp
OwogICAgIEFTU0VSVCghY29kZUJsb2NrLT5pbml0aWFsaXplZCgpKTsKIH0KKyovCiAKLXZvaWQg
SlNXZWJBc3NlbWJseUluc3RhbmNlOjpmaW5hbGl6ZUNyZWF0aW9uKFZNJiB2bSwgRXhlY1N0YXRl
KiBleGVjKQordm9pZCBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmZpbmFsaXplQ3JlYXRpb24oVk0m
IHZtLCBFeGVjU3RhdGUqIGV4ZWMsIFJlZjxXYXNtOjpDb2RlQmxvY2s+JiYgd2FzbUNvZGVCbG9j
aykKIHsKICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7Ci0gICAgY29k
ZUJsb2NrKCktPmluaXRpYWxpemUoKTsKLQotICAgIGlmICghY29kZUJsb2NrKCktPnJ1bm5hYmxl
KCkpIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIEpTV2ViQXNzZW1ibHlM
aW5rRXJyb3I6OmNyZWF0ZShleGVjLCB2bSwgZ2xvYmFsT2JqZWN0KCktPldlYkFzc2VtYmx5TGlu
a0Vycm9yU3RydWN0dXJlKCksIGNvZGVCbG9jaygpLT5lcnJvck1lc3NhZ2UoKSkpOworICAgIGlm
ICghd2FzbUNvZGVCbG9jay0+cnVubmFibGUoKSkgeworICAgICAgICAvLyBGSVhNRTogZmluZCBh
IHRocmVhZCBzYWZlIHdheSB0byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UhCisgICAgICAgIC8vdGhy
b3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIEpTV2ViQXNzZW1ibHlMaW5rRXJyb3I6OmNyZWF0ZShl
eGVjLCB2bSwgZ2xvYmFsT2JqZWN0KCktPldlYkFzc2VtYmx5TGlua0Vycm9yU3RydWN0dXJlKCks
IGNvZGVCbG9jaygpLT5lcnJvck1lc3NhZ2UoKSkpOworICAgICAgICB0aHJvd0V4Y2VwdGlvbihl
eGVjLCBzY29wZSwgSlNXZWJBc3NlbWJseUxpbmtFcnJvcjo6Y3JlYXRlKGV4ZWMsIHZtLCBnbG9i
YWxPYmplY3QoKS0+V2ViQXNzZW1ibHlMaW5rRXJyb3JTdHJ1Y3R1cmUoKSwgQVNDSUlMaXRlcmFs
KCJGSVhNRTogYmV0dGVyIGVycm9yIG1lc3NhZ2UgaGVyZSIpKSk7CiAgICAgICAgIHJldHVybjsK
ICAgICB9Ci0gICAgUkVMRUFTRV9BU1NFUlQoY29kZUJsb2NrKCktPmlzU2FmZVRvUnVuKG1lbW9y
eSgpKSk7CisKKyAgICBSRUxFQVNFX0FTU0VSVCh3YXNtQ29kZUJsb2NrLT5pc1NhZmVUb1J1biht
ZW1vcnkoKS0+bWVtb3J5KCkubW9kZSgpKSk7CisgICAgbV9jb2RlQmxvY2suc2V0KHZtLCB0aGlz
LAorICAgICAgICBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpjcmVhdGUodm0sIHdhc21Db2RlQmxv
Y2suY29weVJlZigpLCBtX21vZHVsZS0+bW9kdWxlKCkubW9kdWxlSW5mb3JtYXRpb24oKSkpOwog
CiAgICAgYXV0byogbW9kdWxlUmVjb3JkID0ganNDYXN0PFdlYkFzc2VtYmx5TW9kdWxlUmVjb3Jk
Kj4obV9tb2R1bGVOYW1lc3BhY2VPYmplY3QtPm1vZHVsZVJlY29yZCgpKTsKICAgICBtb2R1bGVS
ZWNvcmQtPmxpbmsoZXhlYywgbW9kdWxlKCksIHRoaXMpOwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmgJKHJldmlz
aW9uIDIxNDk3MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1i
bHlJbnN0YW5jZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSwxMSArMzksNiBAQCBjbGFzcyBKU01v
ZHVsZU5hbWVzcGFjZU9iamVjdDsKIGNsYXNzIEpTV2ViQXNzZW1ibHlNb2R1bGU7CiBjbGFzcyBX
ZWJBc3NlbWJseVRvSlNDYWxsZWU7CiAKLW5hbWVzcGFjZSBXYXNtIHsKLWNsYXNzIFBsYW47Ci19
Ci0KLQogY2xhc3MgSlNXZWJBc3NlbWJseUluc3RhbmNlIDogcHVibGljIEpTRGVzdHJ1Y3RpYmxl
T2JqZWN0IHsKIHB1YmxpYzoKICAgICB0eXBlZGVmIEpTRGVzdHJ1Y3RpYmxlT2JqZWN0IEJhc2U7
CkBAIC01NCw5ICs0OSw5IEBAIHB1YmxpYzoKICAgICBERUNMQVJFX0VYUE9SVF9JTkZPOwogCiAg
ICAgSlNXZWJBc3NlbWJseUNvZGVCbG9jayogY29kZUJsb2NrKCkgY29uc3QgeyByZXR1cm4gbV9j
b2RlQmxvY2suZ2V0KCk7IH0KLSAgICBib29sIGluaXRpYWxpemVkKCkgY29uc3QgeyByZXR1cm4g
Y29kZUJsb2NrKCkgJiYgY29kZUJsb2NrKCktPmluaXRpYWxpemVkKCk7IH0KLSAgICB2b2lkIGFk
ZFVuaXRpYWxpemVkQ29kZUJsb2NrKFZNJiwgUmVmPFdhc206OlBsYW4+KTsKLSAgICB2b2lkIGZp
bmFsaXplQ3JlYXRpb24oVk0mLCBFeGVjU3RhdGUqKTsKKyAgICAvL2Jvb2wgaW5pdGlhbGl6ZWQo
KSBjb25zdCB7IHJldHVybiBjb2RlQmxvY2soKSAmJiBjb2RlQmxvY2soKS0+aW5pdGlhbGl6ZWQo
KTsgfQorICAgIC8vdm9pZCBhZGRVbml0aWFsaXplZENvZGVCbG9jayhWTSYsIFJlZjxXYXNtOjpQ
bGFuPik7CisgICAgdm9pZCBmaW5hbGl6ZUNyZWF0aW9uKFZNJiwgRXhlY1N0YXRlKiwgUmVmPFdh
c206OkNvZGVCbG9jaz4mJik7CiAKICAgICBKU1dlYkFzc2VtYmx5TW9kdWxlKiBtb2R1bGUoKSBj
b25zdCB7IHJldHVybiBtX21vZHVsZS5nZXQoKTsgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5TW9kdWxlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5TW9kdWxlLmNwcAkocmV2aXNp
b24gMjE0OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJs
eU1vZHVsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlICJX
YXNtRm9ybWF0LmgiCiAjaW5jbHVkZSAiV2FzbU1lbW9yeS5oIgogI2luY2x1ZGUgIldhc21QbGFu
LmgiCisjaW5jbHVkZSAiV2FzbU1vZHVsZS5oIgogI2luY2x1ZGUgIldlYkFzc2VtYmx5VG9KU0Nh
bGxlZS5oIgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KIApAQCAtNDMsNyArNDQsNyBA
QCBuYW1lc3BhY2UgSlNDIHsKIAogY29uc3QgQ2xhc3NJbmZvIEpTV2ViQXNzZW1ibHlNb2R1bGU6
OnNfaW5mbyA9IHsgIldlYkFzc2VtYmx5Lk1vZHVsZSIsICZCYXNlOjpzX2luZm8sIG51bGxwdHIs
IENSRUFURV9NRVRIT0RfVEFCTEUoSlNXZWJBc3NlbWJseU1vZHVsZSkgfTsKIAotSlNXZWJBc3Nl
bWJseU1vZHVsZSogSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1YihWTSYgdm0sIEV4ZWNT
dGF0ZSogZXhlYywgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIFJlZlB0cjxXYXNtOjpQbGFuPiYmIHBs
YW4pCitKU1dlYkFzc2VtYmx5TW9kdWxlKiBKU1dlYkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdHVi
KFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgUmVmPFdhc206
OlBsYW4+JiYgcGxhbikKIHsKICAgICBBU1NFUlQoIXBsYW4tPmhhc1dvcmsoKSk7CiAgICAgYXV0
byBzY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOwpAQCAtNTIsNyArNTMsNyBAQCBKU1dl
YkFzc2VtYmx5TW9kdWxlKiBKU1dlYkFzc2VtYmx5TW9kdWxlCiAgICAgICAgIHJldHVybiBudWxs
cHRyOwogICAgIH0KIAotICAgIGF1dG8qIG1vZHVsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVD
ZWxsPEpTV2ViQXNzZW1ibHlNb2R1bGU+KHZtLmhlYXApKSBKU1dlYkFzc2VtYmx5TW9kdWxlKHZt
LCBzdHJ1Y3R1cmUsICpwbGFuLmdldCgpKTsKKyAgICBhdXRvKiBtb2R1bGUgPSBuZXcgKE5vdE51
bGwsIGFsbG9jYXRlQ2VsbDxKU1dlYkFzc2VtYmx5TW9kdWxlPih2bS5oZWFwKSkgSlNXZWJBc3Nl
bWJseU1vZHVsZSh2bSwgc3RydWN0dXJlLCBXYXNtOjpNb2R1bGU6OmNyZWF0ZShwbGFuLT50YWtl
TW9kdWxlSW5mb3JtYXRpb24oKSkpOwogICAgIG1vZHVsZS0+ZmluaXNoQ3JlYXRpb24odm0pOwog
ICAgIHJldHVybiBtb2R1bGU7CiB9CkBAIC02Miw5ICs2Myw5IEBAIFN0cnVjdHVyZSogSlNXZWJB
c3NlbWJseU1vZHVsZTo6Y3JlYXRlU3QKICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0s
IGdsb2JhbE9iamVjdCwgcHJvdG90eXBlLCBUeXBlSW5mbyhPYmplY3RUeXBlLCBTdHJ1Y3R1cmVG
bGFncyksIGluZm8oKSk7CiB9CiAKLUpTV2ViQXNzZW1ibHlNb2R1bGU6OkpTV2ViQXNzZW1ibHlN
b2R1bGUoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgV2FzbTo6UGxhbiYgcGxhbikKK0pT
V2ViQXNzZW1ibHlNb2R1bGU6OkpTV2ViQXNzZW1ibHlNb2R1bGUoVk0mIHZtLCBTdHJ1Y3R1cmUq
IHN0cnVjdHVyZSwgUmVmPFdhc206Ok1vZHVsZT4mJiBtb2R1bGUpCiAgICAgOiBCYXNlKHZtLCBz
dHJ1Y3R1cmUpCi0gICAgLCBtX21vZHVsZUluZm9ybWF0aW9uKHBsYW4udGFrZU1vZHVsZUluZm9y
bWF0aW9uKCkpCisgICAgLCBtX21vZHVsZShXVEZNb3ZlKG1vZHVsZSkpCiB7CiB9CiAKQEAgLTc1
LDcgKzc2LDggQEAgdm9pZCBKU1dlYkFzc2VtYmx5TW9kdWxlOjpmaW5pc2hDcmVhdGlvbgogCiAg
ICAgLy8gT24gc3VjY2VzcywgYSBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlIG9iamVjdCBpcyByZXR1
cm5lZCB3aXRoIFtbTW9kdWxlXV0gc2V0IHRvIHRoZSB2YWxpZGF0ZWQgQXN0Lm1vZHVsZS4KICAg
ICBTeW1ib2xUYWJsZSogZXhwb3J0U3ltYm9sVGFibGUgPSBTeW1ib2xUYWJsZTo6Y3JlYXRlKHZt
KTsKLSAgICBmb3IgKGF1dG8mIGV4cCA6IG1fbW9kdWxlSW5mb3JtYXRpb24tPmV4cG9ydHMpIHsK
KyAgICBjb25zdCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5mb3JtYXRpb24gPSBt
X21vZHVsZS0+bW9kdWxlSW5mb3JtYXRpb24oKTsKKyAgICBmb3IgKGF1dG8mIGV4cCA6IG1vZHVs
ZUluZm9ybWF0aW9uLmV4cG9ydHMpIHsKICAgICAgICAgYXV0byBvZmZzZXQgPSBleHBvcnRTeW1i
b2xUYWJsZS0+dGFrZU5leHRTY29wZU9mZnNldChOb0xvY2tpbmdOZWNlc3NhcnkpOwogICAgICAg
ICBTdHJpbmcgZmllbGQgPSBTdHJpbmc6OmZyb21VVEY4KGV4cC5maWVsZCk7CiAgICAgICAgIGV4
cG9ydFN5bWJvbFRhYmxlLT5zZXQoTm9Mb2NraW5nTmVjZXNzYXJ5LCBBdG9taWNTdHJpbmcoZmll
bGQpLmltcGwoKSwgU3ltYm9sVGFibGVFbnRyeShWYXJPZmZzZXQob2Zmc2V0KSkpOwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseU1vZHVsZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlNb2R1
bGUuaAkocmV2aXNpb24gMjE0OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMv
SlNXZWJBc3NlbWJseU1vZHVsZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAj
aW5jbHVkZSAiSlNXZWJBc3NlbWJseUNvZGVCbG9jay5oIgogI2luY2x1ZGUgIlVuY29uZGl0aW9u
YWxGaW5hbGl6ZXIuaCIKICNpbmNsdWRlICJXYXNtTW9kdWxlSW5mb3JtYXRpb24uaCIKKyNpbmNs
dWRlICJXYXNtTW9kdWxlLmgiCiAjaW5jbHVkZSA8d3RmL0JhZy5oPgogI2luY2x1ZGUgPHd0Zi9W
ZWN0b3IuaD4KIApAQCAtNDksMTYgKzUwLDE2IEBAIGNsYXNzIEpTV2ViQXNzZW1ibHlNb2R1bGUg
OiBwdWJsaWMgSlNEZXMKIHB1YmxpYzoKICAgICB0eXBlZGVmIEpTRGVzdHJ1Y3RpYmxlT2JqZWN0
IEJhc2U7CiAKLSAgICBzdGF0aWMgSlNXZWJBc3NlbWJseU1vZHVsZSogY3JlYXRlU3R1YihWTSYs
IEV4ZWNTdGF0ZSosIFN0cnVjdHVyZSosIFJlZlB0cjxXYXNtOjpQbGFuPiYmKTsKLSAgICBzdGF0
aWMgU3RydWN0dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mLCBKU0dsb2JhbE9iamVjdCosIEpTVmFs
dWUpOwotCiAgICAgREVDTEFSRV9JTkZPOwogCi0gICAgY29uc3QgV2FzbTo6TW9kdWxlSW5mb3Jt
YXRpb24mIG1vZHVsZUluZm9ybWF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9tb2R1bGVJbmZvcm1h
dGlvbi5nZXQoKTsgfQorICAgIHN0YXRpYyBKU1dlYkFzc2VtYmx5TW9kdWxlKiBjcmVhdGVTdHVi
KFZNJiwgRXhlY1N0YXRlKiwgU3RydWN0dXJlKiwgUmVmPFdhc206OlBsYW4+JiYpOworICAgIHN0
YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYsIEpTR2xvYmFsT2JqZWN0KiwgSlNW
YWx1ZSk7CisKKyAgICBjb25zdCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5mb3Jt
YXRpb24oKSBjb25zdCB7IHJldHVybiBtX21vZHVsZS0+bW9kdWxlSW5mb3JtYXRpb24oKTsgfQog
ICAgIFN5bWJvbFRhYmxlKiBleHBvcnRTeW1ib2xUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhw
b3J0U3ltYm9sVGFibGUuZ2V0KCk7IH0KICAgICBXYXNtOjpTaWduYXR1cmVJbmRleCBzaWduYXR1
cmVJbmRleEZyb21GdW5jdGlvbkluZGV4U3BhY2UodW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNl
KSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbW9kdWxlSW5mb3JtYXRpb24tPnNpZ25h
dHVyZUluZGV4RnJvbUZ1bmN0aW9uSW5kZXhTcGFjZShmdW5jdGlvbkluZGV4U3BhY2UpOworICAg
ICAgICByZXR1cm4gbV9tb2R1bGUtPnNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0aW9uSW5kZXhTcGFj
ZShmdW5jdGlvbkluZGV4U3BhY2UpOwogICAgIH0KICAgICBXZWJBc3NlbWJseVRvSlNDYWxsZWUq
IGNhbGxlZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FsbGVlLmdldCgpOyB9CiAKQEAgLTY2LDE3ICs2
NywxOSBAQCBwdWJsaWM6CiAKICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNvdXJjZSgpIGNv
bnN0IHsgcmV0dXJuIG1vZHVsZUluZm9ybWF0aW9uKCkuc291cmNlOyB9CiAKKyAgICBXYXNtOjpN
b2R1bGUmIG1vZHVsZSgpIHsgcmV0dXJuIG1fbW9kdWxlLmdldCgpOyB9CisKIHByaXZhdGU6CiAg
ICAgZnJpZW5kIGNsYXNzIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s7CiAKICAgICB2b2lkIHNldENv
ZGVCbG9jayhWTSYsIFdhc206Ok1lbW9yeU1vZGUsIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2sqKTsK
IAotICAgIEpTV2ViQXNzZW1ibHlNb2R1bGUoVk0mLCBTdHJ1Y3R1cmUqLCBXYXNtOjpQbGFuJik7
CisgICAgSlNXZWJBc3NlbWJseU1vZHVsZShWTSYsIFN0cnVjdHVyZSosIFJlZjxXYXNtOjpNb2R1
bGU+JiYpOwogICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mKTsKICAgICBzdGF0aWMgdm9pZCBk
ZXN0cm95KEpTQ2VsbCopOwogICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwg
U2xvdFZpc2l0b3ImKTsKIAotICAgIFJlZjxXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbj4gbV9tb2R1
bGVJbmZvcm1hdGlvbjsKKyAgICBSZWY8V2FzbTo6TW9kdWxlPiBtX21vZHVsZTsKICAgICBXcml0
ZUJhcnJpZXI8U3ltYm9sVGFibGU+IG1fZXhwb3J0U3ltYm9sVGFibGU7CiAgICAgV3JpdGVCYXJy
aWVyPEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s+IG1fY29kZUJsb2Nrc1tXYXNtOjpOdW1iZXJPZk1l
bW9yeU1vZGVzXTsKICAgICBXcml0ZUJhcnJpZXI8V2ViQXNzZW1ibHlUb0pTQ2FsbGVlPiBtX2Nh
bGxlZTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5RnVu
Y3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dl
YkFzc2VtYmx5RnVuY3Rpb24uY3BwCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseUZ1bmN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTU5LDYgKzE1OSw4IEBAIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNh
bGwKIAogV2ViQXNzZW1ibHlGdW5jdGlvbiogV2ViQXNzZW1ibHlGdW5jdGlvbjo6Y3JlYXRlKFZN
JiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgdW5zaWduZWQgbGVuZ3RoLCBjb25z
dCBTdHJpbmcmIG5hbWUsIEpTV2ViQXNzZW1ibHlJbnN0YW5jZSogaW5zdGFuY2UsIFdhc206OkNh
bGxlZSYganNFbnRyeXBvaW50LCBXYXNtOjpDYWxsZWUmIHdhc21FbnRyeXBvaW50LCBXYXNtOjpT
aWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCkKIHsKKyAgICBBU1NFUlQoJmpzRW50cnlwb2lu
dCAhPSAmd2FzbUVudHJ5cG9pbnQpOworCiAgICAgTmF0aXZlRXhlY3V0YWJsZSogZXhlY3V0YWJs
ZSA9IHZtLmdldEhvc3RGdW5jdGlvbihjYWxsV2ViQXNzZW1ibHlGdW5jdGlvbiwgTm9JbnRyaW5z
aWMsIGNhbGxIb3N0RnVuY3Rpb25Bc0NvbnN0cnVjdG9yLCBudWxscHRyLCBuYW1lKTsKICAgICBT
dHJ1Y3R1cmUqIHN0cnVjdHVyZSA9IGdsb2JhbE9iamVjdC0+d2ViQXNzZW1ibHlGdW5jdGlvblN0
cnVjdHVyZSgpOwogICAgIFdlYkFzc2VtYmx5RnVuY3Rpb24qIGZ1bmN0aW9uID0gbmV3IChOb3RO
dWxsLCBhbGxvY2F0ZUNlbGw8V2ViQXNzZW1ibHlGdW5jdGlvbj4odm0uaGVhcCkpIFdlYkFzc2Vt
Ymx5RnVuY3Rpb24odm0sIGdsb2JhbE9iamVjdCwgc3RydWN0dXJlLCBqc0VudHJ5cG9pbnQsIHdh
c21FbnRyeXBvaW50LCBzaWduYXR1cmVJbmRleCk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9qcy9XZWJBc3NlbWJseUluc3RhbmNlQ29uc3RydWN0b3IuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5SW5zdGFuY2VDb25z
dHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDIxNDk3MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93
YXNtL2pzL1dlYkFzc2VtYmx5SW5zdGFuY2VDb25zdHJ1Y3Rvci5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTU4LDcgKzU4LDcgQEAgdXNpbmcgV2FzbTo6UGxhbjsKIAogc3RhdGljIEVuY29kZWRKU1Zh
bHVlIEpTQ19IT1NUX0NBTEwgY29uc3RydWN0SlNXZWJBc3NlbWJseUluc3RhbmNlKEV4ZWNTdGF0
ZSogZXhlYykKIHsKLSAgICBhdXRvJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgVk0mIHZtID0gZXhl
Yy0+dm0oKTsKICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7CiAKICAg
ICAvLyBJZiBtb2R1bGVPYmplY3QgaXMgbm90IGEgV2ViQXNzZW1ibHkuTW9kdWxlIGluc3RhbmNl
LCBhIFR5cGVFcnJvciBpcyB0aHJvd24uCkBAIC03OCw2ICs3OCwxMiBAQCBzdGF0aWMgRW5jb2Rl
ZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjb25zCiAgICAgSlNXZWJBc3NlbWJseUluc3RhbmNlKiBp
bnN0YW5jZSA9IEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6Y3JlYXRlKHZtLCBleGVjLCBtb2R1bGUs
IGltcG9ydE9iamVjdCwgaW5zdGFuY2VTdHJ1Y3R1cmUpOwogICAgIFJFVFVSTl9JRl9FWENFUFRJ
T04oc2NvcGUsIHsgfSk7CiAKKyAgICBtb2R1bGUtPm1vZHVsZSgpLmNvbXBpbGVTeW5jKHZtLCBp
bnN0YW5jZS0+bWVtb3J5TW9kZSgpKTsKKyAgICBpbnN0YW5jZS0+ZmluYWxpemVDcmVhdGlvbih2
bSwgZXhlYywgbW9kdWxlLT5tb2R1bGUoKS5ub25OdWxsQ29kZUJsb2NrKGluc3RhbmNlLT5tZW1v
cnlNb2RlKCkpKTsKKyAgICBSRVRVUk5fSUZfRVhDRVBUSU9OKHNjb3BlLCB7IH0pOworICAgIHJl
dHVybiBKU1ZhbHVlOjplbmNvZGUoaW5zdGFuY2UpOworCisgICAgLyoKICAgICAvLyBUaGVyZSBh
cmUgdGhyZWUgcG9zc2libGUgY2FzZXM6CiAgICAgLy8gMSkgVGhlIGluc3RhbmNlIGFscmVhZHkg
aGFzIGFuIGluaXRpYWxpemVkIENvZGVCbG9jayAocnVubmFibGUpLCBzbyB3ZSBqdXN0IG5lZWQg
dG8gZmluYWxpemVDcmVhdGlvbi4KICAgICAvLyAyKSBUaGUgaW5zdGFuY2UgaGFzIG5vIENvZGVC
bG9jaywgc28gd2UgbmVlZCB0byBtYWtlIG9uZSBhbmQgY29tcGlsZSB0aGUgY29kZSBmb3IgaXQu
CkBAIC05NiwxMCArMTAyLDExIEBAIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxM
IGNvbnMKICAgICAgICAgICAgIHdvcmtsaXN0LmNvbXBsZXRlUGxhblN5bmNocm9ub3VzbHkocGxh
bi5nZXQoKSk7CiAgICAgICAgIH0KICAgICB9Ci0KICAgICBpbnN0YW5jZS0+ZmluYWxpemVDcmVh
dGlvbih2bSwgZXhlYyk7CiAgICAgUkVUVVJOX0lGX0VYQ0VQVElPTihzY29wZSwgeyB9KTsKICAg
ICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGluc3RhbmNlKTsKKyAgICAqLworCiB9CiAKIHN0YXRp
YyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNhbGxKU1dlYkFzc2VtYmx5SW5zdGFuY2Uo
RXhlY1N0YXRlKiBleGVjKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2Vi
QXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAJKHJldmlz
aW9uIDIxNDk3MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5
TW9kdWxlQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03OCw3ICs3OCw3IEBAIEpT
VmFsdWUgV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvcjo6Y3IKICAgICBWZWN0b3I8dWludDhf
dD4gc291cmNlID0gY3JlYXRlU291cmNlQnVmZmVyRnJvbVZhbHVlKHZtLCBleGVjLCBidWZmZXIp
OwogICAgIFJFVFVSTl9JRl9FWENFUFRJT04oc2NvcGUsIHsgfSk7CiAKLSAgICBSZWZQdHI8V2Fz
bTo6UGxhbj4gcGxhbiA9IGFkb3B0UmVmKG5ldyBXYXNtOjpQbGFuKHZtLCBXVEZNb3ZlKHNvdXJj
ZSksIFdhc206OlBsYW46OlZhbGlkYXRpb24sIFdhc206OlBsYW46OmRvbnRGaW5hbGl6ZSkpOwor
ICAgIFJlZjxXYXNtOjpQbGFuPiBwbGFuID0gYWRvcHRSZWYoKm5ldyBXYXNtOjpQbGFuKHZtLCBX
VEZNb3ZlKHNvdXJjZSksIFdhc206OlBsYW46OlZhbGlkYXRpb24sIFdhc206OlBsYW46OmRvbnRG
aW5hbGl6ZSkpOwogICAgIGlmICghcGxhbi0+cGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSgpKQogICAg
ICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIEpTV2ViQXNzZW1ibHlDb21w
aWxlRXJyb3I6OmNyZWF0ZShleGVjLCB2bSwgZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpLT5X
ZWJBc3NlbWJseUNvbXBpbGVFcnJvclN0cnVjdHVyZSgpLCBwbGFuLT5lcnJvck1lc3NhZ2UoKSkp
OwogICAgIHJldHVybiBKU1dlYkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdHViKHZtLCBleGVjLCBz
dHJ1Y3R1cmUsIFdURk1vdmUocGxhbikpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dh
c20vanMvV2ViQXNzZW1ibHlQcm90b3R5cGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5UHJvdG90eXBlLmNwcAkocmV2aXNpb24gMjE0
OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlQcm90b3R5
cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02NSwxMyArNjUsMTIgQEAgY29uc3QgQ2xhc3NJbmZv
IFdlYkFzc2VtYmx5UHJvdG90eXBlOjpzXwogIEBlbmQKICAqLwogCi1zdGF0aWMgRW5jb2RlZEpT
VmFsdWUgcmVqZWN0KEV4ZWNTdGF0ZSogZXhlYywgQ2F0Y2hTY29wZSYgY2F0Y2hTY29wZSwgSlNQ
cm9taXNlRGVmZXJyZWQqIHByb21pc2UpCitzdGF0aWMgdm9pZCByZWplY3QoRXhlY1N0YXRlKiBl
eGVjLCBDYXRjaFNjb3BlJiBjYXRjaFNjb3BlLCBKU1Byb21pc2VEZWZlcnJlZCogcHJvbWlzZSkK
IHsKICAgICBFeGNlcHRpb24qIGV4Y2VwdGlvbiA9IGNhdGNoU2NvcGUuZXhjZXB0aW9uKCk7CiAg
ICAgQVNTRVJUKGV4Y2VwdGlvbik7CiAgICAgY2F0Y2hTY29wZS5jbGVhckV4Y2VwdGlvbigpOwog
ICAgIHByb21pc2UtPnJlamVjdChleGVjLCBleGNlcHRpb24tPnZhbHVlKCkpOwotICAgIHJldHVy
biBKU1ZhbHVlOjplbmNvZGUocHJvbWlzZS0+cHJvbWlzZSgpKTsKIH0KIAogc3RhdGljIEVuY29k
ZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlDb21waWxlRnVuYyhFeGVjU3RhdGUq
IGV4ZWMpCkBAIC05MCwxMyArODksMTMgQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NU
X0NBTEwgd2ViQQogICAgIGRlcGVuZGVuY2llcy5hcHBlbmQoU3Ryb25nPEpTQ2VsbD4odm0sIGds
b2JhbE9iamVjdCkpOwogICAgIHZtLnByb21pc2VEZWZlcnJlZFRpbWVyLT5hZGRQZW5kaW5nUHJv
bWlzZShwcm9taXNlLCBXVEZNb3ZlKGRlcGVuZGVuY2llcykpOwogCi0gICAgUmVmPFBsYW4+IHBs
YW4gPSBhZG9wdFJlZigqbmV3IFBsYW4odm0sIFdURk1vdmUoc291cmNlKSwgUGxhbjo6VmFsaWRh
dGlvbiwgW3Byb21pc2UsIGdsb2JhbE9iamVjdF0gKFBsYW4mIHApIG11dGFibGUgewotICAgICAg
ICBSZWZQdHI8UGxhbj4gcGxhbiA9IG1ha2VSZWYocCk7Ci0gICAgICAgIHAudm0oKS5wcm9taXNl
RGVmZXJyZWRUaW1lci0+c2NoZWR1bGVXb3JrU29vbihwcm9taXNlLCBbcHJvbWlzZSwgZ2xvYmFs
T2JqZWN0LCBwbGFuID0gV1RGTW92ZShwbGFuKV0gKCkgbXV0YWJsZSB7Ci0gICAgICAgICAgICBW
TSYgdm0gPSBwbGFuLT52bSgpOworICAgIFJlZjxQbGFuPiBwbGFuID0gYWRvcHRSZWYoKm5ldyBQ
bGFuKHZtLCBXVEZNb3ZlKHNvdXJjZSksIFBsYW46OlZhbGlkYXRpb24sIFtwcm9taXNlLCBnbG9i
YWxPYmplY3RdIChWTSYgdm0sIFBsYW4qIHApIG11dGFibGUgeworICAgICAgICBSRUxFQVNFX0FT
U0VSVChwKTsKKyAgICAgICAgUmVmUHRyPFBsYW4+IHBsYW4gPSBtYWtlUmVmKCpwKTsKKyAgICAg
ICAgdm0ucHJvbWlzZURlZmVycmVkVGltZXItPnNjaGVkdWxlV29ya1Nvb24ocHJvbWlzZSwgW3By
b21pc2UsIGdsb2JhbE9iamVjdCwgcGxhbiA9IFdURk1vdmUocGxhbiksICZ2bV0gKCkgbXV0YWJs
ZSB7CiAgICAgICAgICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9DQVRDSF9TQ09QRSh2bSk7CiAg
ICAgICAgICAgICBFeGVjU3RhdGUqIGV4ZWMgPSBnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKTsK
LSAgICAgICAgICAgIEpTVmFsdWUgbW9kdWxlID0gSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRl
U3R1Yih2bSwgZXhlYywgZ2xvYmFsT2JqZWN0LT5XZWJBc3NlbWJseU1vZHVsZVN0cnVjdHVyZSgp
LCBXVEZNb3ZlKHBsYW4pKTsKKyAgICAgICAgICAgIEpTVmFsdWUgbW9kdWxlID0gSlNXZWJBc3Nl
bWJseU1vZHVsZTo6Y3JlYXRlU3R1Yih2bSwgZXhlYywgZ2xvYmFsT2JqZWN0LT5XZWJBc3NlbWJs
eU1vZHVsZVN0cnVjdHVyZSgpLCBwbGFuLnJlbGVhc2VOb25OdWxsKCkpOwogICAgICAgICAgICAg
aWYgKHNjb3BlLmV4Y2VwdGlvbigpKSB7CiAgICAgICAgICAgICAgICAgcmVqZWN0KGV4ZWMsIHNj
b3BlLCBwcm9taXNlKTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xMTEsMTYgKzExMCwx
NiBAQCBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCB3ZWJBCiB9CiAKIGVudW0g
Y2xhc3MgUmVzb2x2ZSB7IFdpdGhJbnN0YW5jZSwgV2l0aE1vZHVsZUFuZEluc3RhbmNlIH07Ci1z
dGF0aWMgdm9pZCByZXNvbHZlKFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjLCBKU1Byb21pc2VEZWZl
cnJlZCogcHJvbWlzZSwgSlNXZWJBc3NlbWJseUluc3RhbmNlKiBpbnN0YW5jZSwgSlNXZWJBc3Nl
bWJseU1vZHVsZSogbW9kdWxlLCBSZXNvbHZlIGVudHJpZXMpCitzdGF0aWMgdm9pZCByZXNvbHZl
KFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjLCBKU1Byb21pc2VEZWZlcnJlZCogcHJvbWlzZSwgSlNX
ZWJBc3NlbWJseUluc3RhbmNlKiBpbnN0YW5jZSwgSlNXZWJBc3NlbWJseU1vZHVsZSogbW9kdWxl
LCBSZXNvbHZlIHJlc29sdmVLaW5kKQogewogICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX0NBVENI
X1NDT1BFKHZtKTsKLSAgICBpbnN0YW5jZS0+ZmluYWxpemVDcmVhdGlvbih2bSwgZXhlYyk7Cisg
ICAgaW5zdGFuY2UtPmZpbmFsaXplQ3JlYXRpb24odm0sIGV4ZWMsIG1vZHVsZS0+bW9kdWxlKCku
bm9uTnVsbENvZGVCbG9jayhpbnN0YW5jZS0+bWVtb3J5TW9kZSgpKSk7CiAgICAgaWYgKHNjb3Bl
LmV4Y2VwdGlvbigpKSB7CiAgICAgICAgIHJlamVjdChleGVjLCBzY29wZSwgcHJvbWlzZSk7CiAg
ICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoZW50cmllcyA9PSBSZXNvbHZlOjpXaXRo
SW5zdGFuY2UpCisgICAgaWYgKHJlc29sdmVLaW5kID09IFJlc29sdmU6OldpdGhJbnN0YW5jZSkK
ICAgICAgICAgcHJvbWlzZS0+cmVzb2x2ZShleGVjLCBpbnN0YW5jZSk7CiAgICAgZWxzZSB7CiAg
ICAgICAgIEpTT2JqZWN0KiByZXN1bHQgPSBjb25zdHJ1Y3RFbXB0eU9iamVjdChleGVjKTsKQEAg
LTEzMCw3ICsxMjksNyBAQCBzdGF0aWMgdm9pZCByZXNvbHZlKFZNJiB2bSwgRXhlY1N0YXRlKiBl
CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBpbnN0YW50aWF0ZShWTSYgdm0sIEV4ZWNTdGF0ZSog
ZXhlYywgSlNQcm9taXNlRGVmZXJyZWQqIHByb21pc2UsIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1v
ZHVsZSwgSlNPYmplY3QqIGltcG9ydE9iamVjdCwgUmVzb2x2ZSBlbnRyaWVzKQorc3RhdGljIHZv
aWQgaW5zdGFudGlhdGUoVk0mIHZtLCBFeGVjU3RhdGUqIGV4ZWMsIEpTUHJvbWlzZURlZmVycmVk
KiBwcm9taXNlLCBKU1dlYkFzc2VtYmx5TW9kdWxlKiBtb2R1bGUsIEpTT2JqZWN0KiBpbXBvcnRP
YmplY3QsIFJlc29sdmUgcmVzb2x2ZUtpbmQpCiB7CiAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVf
Q0FUQ0hfU0NPUEUodm0pOwogICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIHBvdGVudGlhbGx5IHJl
Y29tcGlsaW5nIGEgbW9kdWxlLiBXZSBmaXJzdCBnYXRoZXIgYWxsIHRoZSBpbXBvcnQvbWVtb3J5
IGluZm9ybWF0aW9uIHByaW9yIHRvIGNvbXBpbGluZyBjb2RlLgpAQCAtMTQwLDYgKzEzOSwxOSBA
QCBzdGF0aWMgdm9pZCBpbnN0YW50aWF0ZShWTSYgdm0sIEV4ZWNTdGF0CiAgICAgICAgIHJldHVy
bjsKICAgICB9CiAKKyAgICBWZWN0b3I8U3Ryb25nPEpTQ2VsbD4+IGRlcGVuZGVuY2llczsKKyAg
ICAvLyBUaGUgaW5zdGFuY2Uga2VlcHMgdGhlIG1vZHVsZSBhbGl2ZS4KKyAgICBkZXBlbmRlbmNp
ZXMuYXBwZW5kKFN0cm9uZzxKU0NlbGw+KHZtLCBpbnN0YW5jZSkpOworICAgIHZtLnByb21pc2VE
ZWZlcnJlZFRpbWVyLT5hZGRQZW5kaW5nUHJvbWlzZShwcm9taXNlLCBXVEZNb3ZlKGRlcGVuZGVu
Y2llcykpOworICAgIC8vIE5vdGU6IFRoaXMgY29tcGxldGlvbiB0YXNrIG1heSBvciBtYXkgbm90
IGdldCBjYWxsZWQgaW1tZWRpYXRlbHkuCisgICAgbW9kdWxlLT5tb2R1bGUoKS5jb21waWxlQXN5
bmModm0sIGluc3RhbmNlLT5tZW1vcnlNb2RlKCksIFtwcm9taXNlLCBpbnN0YW5jZSwgbW9kdWxl
LCByZXNvbHZlS2luZF0gKFZNJiB2bSwgUGxhbiopIHsKKyAgICAgICAgdm0ucHJvbWlzZURlZmVy
cmVkVGltZXItPnNjaGVkdWxlV29ya1Nvb24ocHJvbWlzZSwgW3Byb21pc2UsIGluc3RhbmNlLCBt
b2R1bGUsIHJlc29sdmVLaW5kLCAmdm1dICgpIHsKKyAgICAgICAgICAgIEV4ZWNTdGF0ZSogZXhl
YyA9IGluc3RhbmNlLT5nbG9iYWxPYmplY3QoKS0+Z2xvYmFsRXhlYygpOworICAgICAgICAgICAg
cmVzb2x2ZSh2bSwgZXhlYywgcHJvbWlzZSwgaW5zdGFuY2UsIG1vZHVsZSwgcmVzb2x2ZUtpbmQp
OworICAgICAgICB9KTsKKyAgICB9KTsKKworICAgIC8qCiAgICAgLy8gVGhlcmUgYXJlIHRocmVl
IHBvc3NpYmxlIGNhc2VzOgogICAgIC8vIDEpIFRoZSBpbnN0YW5jZSBhbHJlYWR5IGhhcyBhbiBp
bml0aWFsaXplZCBDb2RlQmxvY2ssIHNvIHdlIGhhdmUgbm8gbW9yZSB3b3JrIHRvIGRvLgogICAg
IC8vIDIpIFRoZSBpbnN0YW5jZSBoYXMgbm8gQ29kZUJsb2NrLCBzbyB3ZSBuZWVkIHRvIG1ha2Ug
b25lIGFuZCBjb21waWxlIHRoZSBjb2RlIGZvciBpdC4KQEAgLTE4MSw2ICsxOTMsNyBAQCBzdGF0
aWMgdm9pZCBpbnN0YW50aWF0ZShWTSYgdm0sIEV4ZWNTdGF0CiAgICAgaW5zdGFuY2UtPmFkZFVu
aXRpYWxpemVkQ29kZUJsb2NrKHZtLCBwbGFuLmNvcHlSZWYoKSk7CiAgICAgcGxhbi0+c2V0TW9k
ZShpbnN0YW5jZS0+bWVtb3J5TW9kZSgpKTsKICAgICBXYXNtOjplbnN1cmVXb3JrbGlzdCgpLmVu
cXVldWUoV1RGTW92ZShwbGFuKSk7CisgICAgKi8KIH0KIAogc3RhdGljIHZvaWQgY29tcGlsZUFu
ZEluc3RhbnRpYXRlKFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjLCBKU1Byb21pc2VEZWZlcnJlZCog
cHJvbWlzZSwgSlNWYWx1ZSBidWZmZXIsIEpTT2JqZWN0KiBpbXBvcnRPYmplY3QpCkBAIC0xOTUs
MTMgKzIwOCwxMyBAQCBzdGF0aWMgdm9pZCBjb21waWxlQW5kSW5zdGFudGlhdGUoVk0mIHZtCiAg
ICAgZGVwZW5kZW5jaWVzLmFwcGVuZChTdHJvbmc8SlNDZWxsPih2bSwgaW1wb3J0T2JqZWN0KSk7
CiAgICAgdm0ucHJvbWlzZURlZmVycmVkVGltZXItPmFkZFBlbmRpbmdQcm9taXNlKHByb21pc2Us
IFdURk1vdmUoZGVwZW5kZW5jaWVzKSk7CiAKLSAgICBSZWY8UGxhbj4gcGxhbiA9IGFkb3B0UmVm
KCpuZXcgUGxhbih2bSwgV1RGTW92ZShzb3VyY2UpLCBQbGFuOjpWYWxpZGF0aW9uLCBbcHJvbWlz
ZSwgaW1wb3J0T2JqZWN0LCBnbG9iYWxPYmplY3RdIChQbGFuJiBwKSBtdXRhYmxlIHsKLSAgICAg
ICAgUmVmUHRyPFBsYW4+IHBsYW4gPSBtYWtlUmVmKHApOwotICAgICAgICBwLnZtKCkucHJvbWlz
ZURlZmVycmVkVGltZXItPnNjaGVkdWxlV29ya1Nvb24ocHJvbWlzZSwgW3Byb21pc2UsIGltcG9y
dE9iamVjdCwgZ2xvYmFsT2JqZWN0LCBwbGFuID0gV1RGTW92ZShwbGFuKV0gKCkgbXV0YWJsZSB7
Ci0gICAgICAgICAgICBWTSYgdm0gPSBwbGFuLT52bSgpOworICAgIFJlZjxQbGFuPiBwbGFuID0g
YWRvcHRSZWYoKm5ldyBQbGFuKHZtLCBXVEZNb3ZlKHNvdXJjZSksIFBsYW46OlZhbGlkYXRpb24s
IFtwcm9taXNlLCBpbXBvcnRPYmplY3QsIGdsb2JhbE9iamVjdF0gKFZNJiB2bSwgUGxhbiogcCkg
bXV0YWJsZSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHApOworICAgICAgICBSZWZQdHI8UGxh
bj4gcGxhbiA9IG1ha2VSZWYoKnApOworICAgICAgICB2bS5wcm9taXNlRGVmZXJyZWRUaW1lci0+
c2NoZWR1bGVXb3JrU29vbihwcm9taXNlLCBbcHJvbWlzZSwgaW1wb3J0T2JqZWN0LCBnbG9iYWxP
YmplY3QsIHBsYW4gPSBXVEZNb3ZlKHBsYW4pLCAmdm1dICgpIG11dGFibGUgewogICAgICAgICAg
ICAgYXV0byBzY29wZSA9IERFQ0xBUkVfQ0FUQ0hfU0NPUEUodm0pOwogICAgICAgICAgICAgRXhl
Y1N0YXRlKiBleGVjID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxFeGVjKCk7Ci0gICAgICAgICAgICBK
U1dlYkFzc2VtYmx5TW9kdWxlKiBtb2R1bGUgPSBKU1dlYkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVT
dHViKHZtLCBleGVjLCBnbG9iYWxPYmplY3QtPldlYkFzc2VtYmx5TW9kdWxlU3RydWN0dXJlKCks
IHBsYW4uY29weVJlZigpKTsKKyAgICAgICAgICAgIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1vZHVs
ZSA9IEpTV2ViQXNzZW1ibHlNb2R1bGU6OmNyZWF0ZVN0dWIodm0sIGV4ZWMsIGdsb2JhbE9iamVj
dC0+V2ViQXNzZW1ibHlNb2R1bGVTdHJ1Y3R1cmUoKSwgcGxhbi5yZWxlYXNlTm9uTnVsbCgpKTsK
ICAgICAgICAgICAgIGlmIChzY29wZS5leGNlcHRpb24oKSkgewogICAgICAgICAgICAgICAgIHJl
amVjdChleGVjLCBzY29wZSwgcHJvbWlzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>306361</attachid>
            <date>2017-04-05 20:36:19 -0700</date>
            <delta_ts>2017-04-06 15:52:45 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>54299</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2Ny
aXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTQ5MCw2ICsxNDkwLDggQEAKIAkJNzJBQUY3Q0QxRDBE
MzFCMzAwNUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzJBQUY3Q0IxRDBEMzE4QjAw
NUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uY3BwICovOyB9OwogCQk3MkFB
RjdDRTFEMEQzMUIzMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5jdGlvbi5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzJBQUY3Q0MxRDBE
MzE4QjAwNUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uaCAqLzsgfTsKIAkJ
NzgyNzREOEU0QzRENEZDRDlBMURDNkU2IC8qIFRlbXBsYXRlUmVnaXN0cnlLZXkuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkRCNEI1RTA5OUNENEMx
QkIzQzFDRjA1IC8qIFRlbXBsYXRlUmVnaXN0cnlLZXkuY3BwICovOyB9OworCQk3OTAwODEzODFF
OTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTAwODEzNjFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1v
ZHVsZS5jcHAgKi87IH07CisJCTc5MDA4MTM5MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxl
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTAwODEz
NzFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5MDVCQjY4MUQxMjA1MEUwMDE5RkU1NyAvKiBJ
bmxpbmVBY2Nlc3MuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gNzkwNUJCNjYxRDEyMDUwRTAwMTlGRTU3IC8qIElubGluZUFjY2Vzcy5jcHAgKi87IH07
CiAJCTc5MDVCQjY5MUQxMjA1MEUwMDE5RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5MDVCQjY3MUQxMjA1MEUwMDE5
RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2
YXRlLCApOyB9OyB9OwogCQk3OTE2MERCRDFDOEUzRUM4MDA4QzA4NUEgLyogUHJveHlSZXZva2Uu
Y3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzkxNjBE
QkIxQzhFM0VDODAwOEMwODVBIC8qIFByb3h5UmV2b2tlLmNwcCAqLzsgfTsKQEAgLTQwNDMsNiAr
NDA0NSw4IEBACiAJCTcyQUFGN0NCMUQwRDMxOEIwMDVFNjBCRSAvKiBKU0N1c3RvbUdldHRlclNl
dHRlckZ1bmN0aW9uLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpT
Q3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQk3MkFBRjdDQzFEMEQzMThCMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5j
dGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBKU0N1c3RvbUdldHRlclNl
dHRlckZ1bmN0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc3QjI1Q0IyQzMw
OTRBOTJBMzhFMURCMyAvKiBKU01vZHVsZUxvYWRlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBKU01vZHVsZUxvYWRlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQk3OTAwODEzNjFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXYXNtTW9kdWxlLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJNzkwMDgxMzcxRTk1QThFQzAwNTJEN0NEIC8qIFdhc21Nb2R1bGUuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV2FzbU1vZHVsZS5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQk3OTA1QkI2NjFEMTIwNTBFMDAxOUZFNTcgLyogSW5saW5lQWNj
ZXNzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IElubGluZUFjY2Vz
cy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5MDVCQjY3MUQxMjA1MEUwMDE5
RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
SW5saW5lQWNjZXNzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5MTYwREJCMUM4
RTNFQzgwMDhDMDg1QSAvKiBQcm94eVJldm9rZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBQcm94eVJldm9rZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CkBAIC02MzI3LDYgKzYzMzEsOCBAQAogCQkJCUFEMkZDQzMyMURDNDA0NTMwMEIzRTczNiAvKiBX
YXNtRm9ybWF0LmNwcCAqLywKIAkJCQk3QkM1NDdEMjFCNjk1OTlCMDA5NTlCNTggLyogV2FzbUZv
cm1hdC5oICovLAogCQkJCTUzRjQwRThBMUQ1OTAxQkIwMDk5QTFCNiAvKiBXYXNtRnVuY3Rpb25Q
YXJzZXIuaCAqLywKKwkJCQk3OTAwODEzNjFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5j
cHAgKi8sCisJCQkJNzkwMDgxMzcxRTk1QThFQzAwNTJEN0NEIC8qIFdhc21Nb2R1bGUuaCAqLywK
IAkJCQk1MzU1NTcxNTFEOURGQTMyMDA2RDU4M0IgLyogV2FzbU1lbW9yeS5jcHAgKi8sCiAJCQkJ
NTM1NTU3MTMxRDlEOUVBNTAwNkQ1ODNCIC8qIFdhc21NZW1vcnkuaCAqLywKIAkJCQk3OUI3NTk3
MTFERkE0QzYwMDA1MjE3NEMgLyogV2FzbU1lbW9yeUluZm9ybWF0aW9uLmNwcCAqLywKQEAgLTg5
MjIsNiArODkyOCw3IEBACiAJCQkJQTU4QzAyNDIxOEU0QTQxQTAwMDMyQkM1IC8qIEpTQ29udGV4
dFByaXZhdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDMThDNDFFMEUxNkY1Q0QwMEIzNDQ2MCAv
KiBKU0NvbnRleHRSZWYuaCBpbiBIZWFkZXJzICovLAogCQkJCUE1RUE3MEVFMTlGNUI1QzQwMDk4
RjVFQyAvKiBKU0NvbnRleHRSZWZJbnNwZWN0b3JTdXBwb3J0LmggaW4gSGVhZGVycyAqLywKKwkJ
CQk3OTAwODEzOTFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJQTVEMkU2NjUxOTVFMTc0MDAwQTUxOEU3IC8qIEpTQ29udGV4dFJlZkludGVybmFsLmgg
aW4gSGVhZGVycyAqLywKIAkJCQkwRkY0QjRDNzFFODg5M0M1MDBEQkJFODYgLyogQWlyQ0ZHLmgg
aW4gSGVhZGVycyAqLywKIAkJCQkxNDhDRDFEODEwOENGOTAyMDA4MTYzQzYgLyogSlNDb250ZXh0
UmVmUHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8sCkBAIC0xMDM2Niw2ICsxMDM3Myw3IEBACiAJCQkJ
MEZCMTA1ODUxNjc1NDgwRjAwRjhBQjZFIC8qIEV4aXRLaW5kLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCTBGNTUxM0E4MUQ1QTY4Q0QwMEMzMkJEOCAvKiBGcmVlTGlzdC5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQkwRkVBMEExQzE3MDhCMDA3MDBCQjcyMkMgLyogRlRMQWJzdHJhY3RIZWFwLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCTc5MDA4MTM4MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxl
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRUEwQTFFMTcwOEIwMDcwMEJCNzIyQyAvKiBGVExB
YnN0cmFjdEhlYXBSZXBvc2l0b3J5LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGNDg1MzI3MTg3
REZERUMwMDgzQjY4NyAvKiBGVExBdmFpbGFibGVSZWNvdmVyeS5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQkwRkVBMEEwOTE3MDUxM0RCMDBCQjcyMkMgLyogRlRMQ2FwYWJpbGl0aWVzLmNwcCBpbiBT
b3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJvbWlzZURl
ZmVycmVkVGltZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL1Byb21pc2VEZWZlcnJlZFRpbWVyLmNwcAkocmV2aXNpb24gMjE0OTcyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJvbWlzZURlZmVycmVkVGltZXIuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00NCwxMCArNDQsMTIgQEAgUHJvbWlzZURlZmVycmVkVGltZXI6OlByb21pc2VE
ZWZlcnJlZFRpbQogdm9pZCBQcm9taXNlRGVmZXJyZWRUaW1lcjo6ZG9Xb3JrKCkKIHsKICAgICBB
U1NFUlQobV92bS0+Y3VycmVudFRocmVhZElzSG9sZGluZ0FQSUxvY2soKSk7Ci0gICAgTG9ja0hv
bGRlciBsb2NrZXIobV90YXNrTG9jayk7CisgICAgbV90YXNrTG9jay5sb2NrKCk7CiAgICAgY2Fu
Y2VsVGltZXIoKTsKLSAgICBpZiAoIW1fcnVuVGFza3MpCisgICAgaWYgKCFtX3J1blRhc2tzKSB7
CisgICAgICAgIG1fdGFza0xvY2sudW5sb2NrKCk7CiAgICAgICAgIHJldHVybjsKKyAgICB9CiAK
ICAgICB3aGlsZSAoIW1fdGFza3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIEpTUHJvbWlzZURlZmVy
cmVkKiB0aWNrZXQ7CkBAIC01NywxNyArNTksMjMgQEAgdm9pZCBQcm9taXNlRGVmZXJyZWRUaW1l
cjo6ZG9Xb3JrKCkKIAogICAgICAgICAvLyBXZSBtYXkgaGF2ZSBhbHJlYWR5IGNhbmNlbGVkIHRo
ZXNlIHByb21pc2VzLgogICAgICAgICBpZiAobV9wZW5kaW5nUHJvbWlzZXMuY29udGFpbnModGlj
a2V0KSkgeworICAgICAgICAgICAgLy8gQWxsb3cgdGFza3Mgd2UgcnVuIG5vdyB0byBzY2hlZHVs
ZSB3b3JrLgorICAgICAgICAgICAgbV90YXNrTG9jay51bmxvY2soKTsgCiAgICAgICAgICAgICB0
YXNrKCk7CiAgICAgICAgICAgICBtX3ZtLT5kcmFpbk1pY3JvdGFza3MoKTsKKyAgICAgICAgICAg
IG1fdGFza0xvY2subG9jaygpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1fcGVuZGlu
Z1Byb21pc2VzLmlzRW1wdHkoKSAmJiBtX3Nob3VsZFN0b3BSdW5Mb29wV2hlbkFsbFByb21pc2Vz
RmluaXNoKQorICAgIGlmIChtX3BlbmRpbmdQcm9taXNlcy5pc0VtcHR5KCkgJiYgbV9zaG91bGRT
dG9wUnVuTG9vcFdoZW5BbGxQcm9taXNlc0ZpbmlzaCkgewogI2lmIFVTRShDRikKICAgICAgICAg
Q0ZSdW5Mb29wU3RvcChtX3J1bkxvb3AuZ2V0KCkpOwogI2Vsc2UKICAgICAgICAgUnVuTG9vcDo6
Y3VycmVudCgpLnN0b3AoKTsKICNlbmRpZgorICAgIH0KKworICAgIG1fdGFza0xvY2sudW5sb2Nr
KCk7CiB9CiAKIHZvaWQgUHJvbWlzZURlZmVycmVkVGltZXI6OnJ1blJ1bkxvb3AoKQpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJHZW5lcmF0b3IuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CM0lSR2VuZXJhdG9yLmNwcAko
cmV2aXNpb24gMjE0OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJH
ZW5lcmF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MzYsNyArOTM2LDcgQEAgYXV0byBCM0lS
R2VuZXJhdG9yOjphZGRDYWxsKHVpbnQzMl90IGZ1bgogICAgICAgICAgICAgICAgIHBhdGNocG9p
bnQtPmFwcGVuZChqdW1wRGVzdGluYXRpb24sIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXIpOwogICAg
ICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvYmJlciBhbGwgcG90ZW50aWFsIHBpbm5lZCBy
ZWdpc3RlcnMgc2luY2Ugd2UgbWlnaHQgYmUgbGVhdmluZyB0aGUgaW5zdGFuY2UuCiAgICAgICAg
ICAgICAgICAgcGF0Y2hwb2ludC0+Y2xvYmJlckxhdGUoUGlubmVkUmVnaXN0ZXJJbmZvOjpnZXQo
KS50b1NhdmUoKSk7Ci0gICAgICAgICAgICAgICAgcGF0Y2hwb2ludC0+c2V0R2VuZXJhdG9yKFt1
bmxpbmtlZFdhc21Ub1dhc21DYWxscywgZnVuY3Rpb25JbmRleCwgcmV0dXJuVHlwZV0gKENDYWxs
SGVscGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJiBwYXJhbXMp
IHsKKyAgICAgICAgICAgICAgICBwYXRjaHBvaW50LT5zZXRHZW5lcmF0b3IoW2Z1bmN0aW9uSW5k
ZXgsIHJldHVyblR5cGVdIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgQjM6OlN0YWNrbWFwR2Vu
ZXJhdGlvblBhcmFtcyYgcGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgIEFsbG93TWFjcm9T
Y3JhdGNoUmVnaXN0ZXJVc2FnZSBhbGxvd1NjcmF0Y2goaml0KTsKICAgICAgICAgICAgICAgICAg
ICAgaml0LmNhbGwocGFyYW1zW3JldHVyblR5cGUgPT0gVm9pZCA/IDAgOiAxXS5ncHIoKSk7CiAg
ICAgICAgICAgICAgICAgfSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNt
QmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2Fz
bUJpbmRpbmcuY3BwCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d2FzbS9XYXNtQmluZGluZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ5LDcgKzQ5LDcgQEAgc3Rh
dGljIHZvaWQgbWF0ZXJpYWxpemVJbXBvcnRKU0NlbGwoSklUJgogICAgIGppdC5sb2FkUHRyKEpJ
VDo6QWRkcmVzcyhyZXN1bHQsIEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6b2Zmc2V0T2ZJbXBvcnRG
dW5jdGlvbihpbXBvcnRJbmRleCkpLCByZXN1bHQpOwogfQogCi1zdGF0aWMgTWFjcm9Bc3NlbWJs
ZXJDb2RlUmVmIHdhc21Ub0pzKFZNKiB2bSwgQmFnPENhbGxMaW5rSW5mbz4mIGNhbGxMaW5rSW5m
b3MsIFNpZ25hdHVyZUluZGV4IHNpZ25hdHVyZUluZGV4LCB1bnNpZ25lZCBpbXBvcnRJbmRleCkK
K01hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9KcyhWTSogdm0sIEJhZzxDYWxsTGlua0luZm8+
JiBjYWxsTGlua0luZm9zLCBTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCwgdW5zaWduZWQg
aW1wb3J0SW5kZXgpCiB7CiAgICAgLy8gRklYTUU6IFRoaXMgZnVuY3Rpb24gZG9lc24ndCBwcm9w
ZXJseSBhYnN0cmFjdCBhd2F5IHRoZSBjYWxsaW5nIGNvbnZlbnRpb24uCiAgICAgLy8gSXQnZCBi
ZSBzdXBlciBlYXN5IHRvIGRvIHNvOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTY5NDAxCkBAIC00MjIsNyArNDIyLDcgQEAgc3RhdGljIE1hY3JvQXNzZW1ibGVyQ29k
ZVJlZiB3YXNtVG9KcyhWTQogICAgIHJldHVybiBGSU5BTElaRV9DT0RFKHBhdGNoQnVmZmVyLCAo
IldlYkFzc2VtYmx5LT5KYXZhU2NyaXB0IGltcG9ydFslaV0gJXMiLCBpbXBvcnRJbmRleCwgc2ln
bmF0dXJlLnRvU3RyaW5nKCkuYXNjaWkoKS5kYXRhKCkpKTsKIH0KIAotc3RhdGljIE1hY3JvQXNz
ZW1ibGVyQ29kZVJlZiB3YXNtVG9XYXNtKHVuc2lnbmVkIGltcG9ydEluZGV4KQorTWFjcm9Bc3Nl
bWJsZXJDb2RlUmVmIHdhc21Ub1dhc20odW5zaWduZWQgaW1wb3J0SW5kZXgpCiB7CiAgICAgY29u
c3QgUGlubmVkUmVnaXN0ZXJJbmZvJiBwaW5uZWRSZWdzID0gUGlubmVkUmVnaXN0ZXJJbmZvOjpn
ZXQoKTsKICAgICBKSVQgaml0OwpAQCAtNDYyLDE0ICs0NjIsNiBAQCBzdGF0aWMgTWFjcm9Bc3Nl
bWJsZXJDb2RlUmVmIHdhc21Ub1dhc20oCiAgICAgcmV0dXJuIEZJTkFMSVpFX0NPREUocGF0Y2hC
dWZmZXIsICgiV2ViQXNzZW1ibHktPldlYkFzc2VtYmx5IGltcG9ydFslaV0iLCBpbXBvcnRJbmRl
eCkpOwogfQogCi1XYXNtRXhpdFN0dWJzIGV4aXRTdHViR2VuZXJhdG9yKFZNKiB2bSwgQmFnPENh
bGxMaW5rSW5mbz4mIGNhbGxMaW5rSW5mb3MsIFNpZ25hdHVyZUluZGV4IHNpZ25hdHVyZUluZGV4
LCB1bnNpZ25lZCBpbXBvcnRJbmRleCkKLXsKLSAgICBXYXNtRXhpdFN0dWJzIHN0dWJzOwotICAg
IHN0dWJzLndhc21Ub0pzID0gd2FzbVRvSnModm0sIGNhbGxMaW5rSW5mb3MsIHNpZ25hdHVyZUlu
ZGV4LCBpbXBvcnRJbmRleCk7Ci0gICAgc3R1YnMud2FzbVRvV2FzbSA9IHdhc21Ub1dhc20oaW1w
b3J0SW5kZXgpOwotICAgIHJldHVybiBzdHViczsKLX0KLQogfSB9IC8vIG5hbWVzcGFjZSBKU0M6
Oldhc20KIAogI2VuZGlmIC8vIEVOQUJMRShXRUJBU1NFTUJMWSkKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL1dhc21CaW5kaW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3dhc20vV2FzbUJpbmRpbmcuaAkocmV2aXNpb24gMjE0OTcyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUJpbmRpbmcuaAkod29ya2luZyBjb3B5KQpAQCAtMzgs
NyArMzgsOCBAQCBjbGFzcyBDYWxsTGlua0luZm87CiAKIG5hbWVzcGFjZSBXYXNtIHsKIAotV2Fz
bUV4aXRTdHVicyBleGl0U3R1YkdlbmVyYXRvcihWTSosIEJhZzxDYWxsTGlua0luZm8+JiwgU2ln
bmF0dXJlSW5kZXgsIHVuc2lnbmVkKTsKK01hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9XYXNt
KHVuc2lnbmVkIGltcG9ydEluZGV4KTsKK01hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9KcyhW
TSosIEJhZzxDYWxsTGlua0luZm8+JiBjYWxsTGlua0luZm9zLCBTaWduYXR1cmVJbmRleCBzaWdu
YXR1cmVJbmRleCwgdW5zaWduZWQgaW1wb3J0SW5kZXgpOwogCiB9IH0gLy8gbmFtZXNwYWNlIEpT
Qzo6V2FzbQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxlLmNw
cAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJXYXNtTW9kdWxlLmgiCisKKyNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCisKKyNpbmNsdWRlICJX
YXNtUGxhbklubGluZXMuaCIKKyNpbmNsdWRlICJXYXNtV29ya2xpc3QuaCIKKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKKworQ29kZUJsb2NrOjpDb2RlQmxvY2soVk0mIHZtLCBN
ZW1vcnlNb2RlIG1vZGUsIE1vZHVsZUluZm9ybWF0aW9uJiBtb2R1bGVJbmZvcm1hdGlvbikKKyAg
ICA6IG1fY2FsbGVlQ291bnQobW9kdWxlSW5mb3JtYXRpb24uaW50ZXJuYWxGdW5jdGlvbkNvdW50
KCkpCisgICAgLCBtX21vZGUobW9kZSkKK3sKKyAgICAvLyBGSVhNRTogcGVyaGFwcyB3ZSBuZWVk
IGEgcHJvdGVjdGVkIHRoaXMgaGVyZS4gUGVyaGFwcyBub3Q/IFRoaW5rIGFib3V0IHRoaXMgYSBi
aXQuCisgICAgUmVmUHRyPENvZGVCbG9jaz4gcHJvdGVjdGVkVGhpcyA9IHRoaXM7CisgICAgbV9w
bGFuID0gYWRvcHRSZWYoKm5ldyBQbGFuKHZtLCBtYWtlUmVmKG1vZHVsZUluZm9ybWF0aW9uKSwg
UGxhbjo6RnVsbENvbXBpbGUsIFt0aGlzLCBwcm90ZWN0ZWRUaGlzXSAoVk0mLCBQbGFuKikgewor
ICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbG9jayk7CisgICAgICAgIC8vIEZJWE1F
OiBpbml0aWFsaXplIGNhbGxlZXMgYW5kIHN0dWZmLgorICAgICAgICBpZiAobV9wbGFuLT5mYWls
ZWQoKSkgeworICAgICAgICAgICAgbV9lcnJvck1lc3NhZ2UgPSBtX3BsYW4tPmVycm9yTWVzc2Fn
ZSgpOworICAgICAgICAgICAgbV9wbGFuID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorCisgICAgICAgIG1fY2FsbGVlcy5yZXNpemUobV9jYWxsZWVDb3VudCAqIDIp
OworICAgICAgICBtX3BsYW4tPmluaXRpYWxpemVDYWxsZWVzKFsmXSAodW5zaWduZWQgY2FsbGVl
SW5kZXgsIFJlZjxXYXNtOjpDYWxsZWU+JiYganNFbnRyeXBvaW50Q2FsbGVlLCBSZWY8V2FzbTo6
Q2FsbGVlPiYmIHdhc21FbnRyeXBvaW50Q2FsbGVlKSB7CisgICAgICAgICAgICBtX2NhbGxlZXNb
Y2FsbGVlSW5kZXhdID0gV1RGTW92ZShqc0VudHJ5cG9pbnRDYWxsZWUpOworICAgICAgICAgICAg
bV9jYWxsZWVzW2NhbGxlZUluZGV4ICsgbV9jYWxsZWVDb3VudF0gPSBXVEZNb3ZlKHdhc21FbnRy
eXBvaW50Q2FsbGVlKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgbV93YXNtVG9XYXNtRXhpdFN0
dWJzID0gbV9wbGFuLT50YWtlV2FzbVRvV2FzbUV4aXRTdHVicygpOworCisgICAgICAgIG1fcGxh
biA9IG51bGxwdHI7CisgICAgfSkpOworCisgICAgbV9wbGFuLT5zZXRNb2RlKG1vZGUpOworICAg
IGF1dG8mIHdvcmtsaXN0ID0gV2FzbTo6ZW5zdXJlV29ya2xpc3QoKTsKKyAgICAvLyBOb3RlLCBp
bW1lZGlhdGVseSBhZnRlciB3ZSBlbnF1ZXVlIHRoZSBwbGFuLCB0aGVyZSBpcyBhIGNoYW5jZSB0
aGUgYWJvdmUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuCisgICAgd29ya2xpc3QuZW5xdWV1ZSht
YWtlUmVmKCptX3BsYW4uZ2V0KCkpKTsKK30KKwordm9pZCBDb2RlQmxvY2s6OndhaXRVbnRpbEZp
bmlzaGVkKCkKK3sKKyAgICBSZWZQdHI8UGxhbj4gcGxhbjsKKyAgICB7CisgICAgICAgIGF1dG8g
bG9ja2VyID0gaG9sZExvY2sobV9sb2NrKTsKKyAgICAgICAgcGxhbiA9IG1fcGxhbjsKKyAgICB9
CisKKyAgICBpZiAocGxhbikgeworICAgICAgICBhdXRvJiB3b3JrbGlzdCA9IFdhc206OmVuc3Vy
ZVdvcmtsaXN0KCk7CisgICAgICAgIHdvcmtsaXN0LmNvbXBsZXRlUGxhblN5bmNocm9ub3VzbHko
KnBsYW4uZ2V0KCkpOworICAgIH0KKyAgICAvLyBlbHNlLCBpZiB3ZSBkb24ndCBoYXZlIGEgcGxh
biwgbWVhbmluZyB3ZSdyZSBhbHJlYWR5IGNvbXBpbGVkLgorfQorCit2b2lkIENvZGVCbG9jazo6
Y29tcGlsZUFzeW5jKFZNJiB2bSwgUGxhbjo6Q29tcGxldGlvblRhc2smJiB0YXNrKQoreworICAg
IFJlZlB0cjxQbGFuPiBwbGFuOworICAgIHsKKyAgICAgICAgYXV0byBsb2NrZXIgPSBob2xkTG9j
ayhtX2xvY2spOworICAgICAgICBwbGFuID0gbV9wbGFuOworICAgIH0KKworICAgIGlmIChwbGFu
KQorICAgICAgICBwbGFuLT5hZGRDb21wbGV0aW9uVGFzayh2bSwgV1RGTW92ZSh0YXNrKSk7Cisg
ICAgZWxzZQorICAgICAgICB0YXNrKHZtLCBudWxscHRyKTsKK30KKworYm9vbCBDb2RlQmxvY2s6
OmlzU2FmZVRvUnVuKE1lbW9yeU1vZGUgbWVtb3J5TW9kZSkKK3sKKyAgICBpZiAoIXJ1bm5hYmxl
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRjaCAobV9tb2RlKSB7CisgICAg
Y2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpCb3VuZHNDaGVja2luZzoKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgY2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpTaWduYWxpbmc6CisgICAgICAgIC8vIENv
ZGUgYmVpbmcgaW4gU2lnbmFsaW5nIG1vZGUgbWVhbnMgdGhhdCBpdCBwZXJmb3JtcyBubyBib3Vu
ZHMgY2hlY2tzLgorICAgICAgICAvLyBJdHMgbWVtb3J5LCBldmVuIGlmIGVtcHR5LCBhYnNvbHV0
ZWx5IG11c3QgYWxzbyBiZSBpbiBTaWduYWxpbmcgbW9kZQorICAgICAgICAvLyBiZWNhdXNlIHRo
ZSBwYWdlIHByb3RlY3Rpb24gZGV0ZWN0cyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLgorICAgICAg
ICByZXR1cm4gbWVtb3J5TW9kZSA9PSBXYXNtOjpNZW1vcnlNb2RlOjpTaWduYWxpbmc7CisgICAg
Y2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpOdW1iZXJPZk1lbW9yeU1vZGVzOgorICAgICAgICBicmVh
azsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK01vZHVsZTo6TW9kdWxlKFJlZjxNb2R1bGVJbmZvcm1hdGlvbj4mJiBtb2R1
bGVJbmZvcm1hdGlvbikKKyAgICA6IG1fbW9kdWxlSW5mb3JtYXRpb24oV1RGTW92ZShtb2R1bGVJ
bmZvcm1hdGlvbikpCit7Cit9CisKKwordm9pZCBNb2R1bGU6OmNvbXBpbGVTeW5jKFZNJiB2bSwg
TWVtb3J5TW9kZSBtb2RlKQoreworICAgIFJlZlB0cjxDb2RlQmxvY2s+IGNvZGVCbG9jazsKKyAg
ICB7CisgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9sb2NrKTsKKyAgICAgICAgY29k
ZUJsb2NrID0gbV9jb2RlQmxvY2tzW3N0YXRpY19jYXN0PHVpbnQ4X3Q+KG1vZGUpXTsKKyAgICAg
ICAgaWYgKCFjb2RlQmxvY2spIHsKKyAgICAgICAgICAgIGNvZGVCbG9jayA9IENvZGVCbG9jazo6
Y3JlYXRlKHZtLCBtb2RlLCBjb25zdF9jYXN0PE1vZHVsZUluZm9ybWF0aW9uJj4obW9kdWxlSW5m
b3JtYXRpb24oKSkpOworICAgICAgICAgICAgbV9jb2RlQmxvY2tzW3N0YXRpY19jYXN0PHVpbnQ4
X3Q+KG1vZGUpXSA9IGNvZGVCbG9jazsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb2RlQmxvY2st
PndhaXRVbnRpbEZpbmlzaGVkKCk7Cit9CisKK3ZvaWQgTW9kdWxlOjpjb21waWxlQXN5bmMoVk0m
IHZtLCBNZW1vcnlNb2RlIG1vZGUsIFBsYW46OkNvbXBsZXRpb25UYXNrJiYgdGFzaykKK3sKKyAg
ICBSZWZQdHI8Q29kZUJsb2NrPiBjb2RlQmxvY2s7CisgICAgeworICAgICAgICBhdXRvIGxvY2tl
ciA9IGhvbGRMb2NrKG1fbG9jayk7CisgICAgICAgIGNvZGVCbG9jayA9IG1fY29kZUJsb2Nrc1tz
dGF0aWNfY2FzdDx1aW50OF90Pihtb2RlKV07CisgICAgICAgIGlmICghY29kZUJsb2NrKSB7Cisg
ICAgICAgICAgICBjb2RlQmxvY2sgPSBDb2RlQmxvY2s6OmNyZWF0ZSh2bSwgbW9kZSwgY29uc3Rf
Y2FzdDxNb2R1bGVJbmZvcm1hdGlvbiY+KG1vZHVsZUluZm9ybWF0aW9uKCkpKTsKKyAgICAgICAg
ICAgIG1fY29kZUJsb2Nrc1tzdGF0aWNfY2FzdDx1aW50OF90Pihtb2RlKV0gPSBjb2RlQmxvY2s7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlQmxvY2stPmNvbXBpbGVBc3luYyh2bSwgV1RG
TW92ZSh0YXNrKSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpXYXNtCisKKyNlbmRpZiAv
LyBFTkFCTEUoV0VCQVNTRU1CTFkpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9X
YXNtTW9kdWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2Fz
bU1vZHVsZS5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dh
c21Nb2R1bGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5B
QkxFKFdFQkFTU0VNQkxZKQorCisjaW5jbHVkZSAiV2FzbUNhbGxlZS5oIgorI2luY2x1ZGUgIldh
c21Nb2R1bGVJbmZvcm1hdGlvbi5oIgorI2luY2x1ZGUgIldhc21QbGFuLmgiCisjaW5jbHVkZSA8
d3RmL0xvY2suaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KKworbmFt
ZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKKyAgICAKK2NsYXNzIENvZGVCbG9jayA6IHB1
YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxDb2RlQmxvY2s+IHsKK3B1YmxpYzoKKyAgICBzdGF0
aWMgUmVmPENvZGVCbG9jaz4gY3JlYXRlKFZNJiB2bSwgTWVtb3J5TW9kZSBtb2RlLCBNb2R1bGVJ
bmZvcm1hdGlvbiYgbW9kdWxlSW5mb3JtYXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gYWRv
cHRSZWYoKm5ldyBDb2RlQmxvY2sodm0sIG1vZGUsIG1vZHVsZUluZm9ybWF0aW9uKSk7CisgICAg
fQorCisgICAgdm9pZCB3YWl0VW50aWxGaW5pc2hlZCgpOworICAgIHZvaWQgY29tcGlsZUFzeW5j
KFZNJiwgUGxhbjo6Q29tcGxldGlvblRhc2smJik7CisKKyAgICAvLyBGSVhNRTogcmVuYW1lIHRo
aXMgdG8gY29tcGlsYXRpb25GaW5pc2hlZCgpCisgICAgYm9vbCBpbml0aWFsaXplZCgpCisgICAg
eworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbG9jayk7CisgICAgICAgIHJldHVy
biAhbV9wbGFuOworICAgIH0KKyAgICBib29sIHJ1bm5hYmxlKCkgeyByZXR1cm4gaW5pdGlhbGl6
ZWQoKSAmJiAhbV9lcnJvck1lc3NhZ2U7IH0KKworICAgIC8vIEZJWE1FOiBUaGlzIGlzbid0IHRo
cmVhZCBzYWZlLgorICAgIFN0cmluZyYgZXJyb3JNZXNzYWdlKCkgeyBBU1NFUlQoIXJ1bm5hYmxl
KCkpOyByZXR1cm4gbV9lcnJvck1lc3NhZ2U7IH0KKworICAgIHVuc2lnbmVkIGZ1bmN0aW9uSW1w
b3J0Q291bnQoKSBjb25zdCB7IHJldHVybiBtX3dhc21Ub1dhc21FeGl0U3R1YnMuc2l6ZSgpOyB9
CisKKyAgICBXYXNtOjpDYWxsZWUmIGpzRW50cnlwb2ludENhbGxlZUZyb21GdW5jdGlvbkluZGV4
U3BhY2UodW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlKQorICAgIHsKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlQoZnVuY3Rpb25JbmRleFNwYWNlID49IGZ1bmN0aW9uSW1wb3J0Q291bnQoKSk7Cisg
ICAgICAgIHVuc2lnbmVkIGNhbGxlZUluZGV4ID0gZnVuY3Rpb25JbmRleFNwYWNlIC0gZnVuY3Rp
b25JbXBvcnRDb3VudCgpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChjYWxsZWVJbmRleCA8IG1f
Y2FsbGVlQ291bnQpOworICAgICAgICByZXR1cm4gKm1fY2FsbGVlc1tjYWxsZWVJbmRleF0uZ2V0
KCk7CisgICAgfQorICAgIFdhc206OkNhbGxlZSYgd2FzbUVudHJ5cG9pbnRDYWxsZWVGcm9tRnVu
Y3Rpb25JbmRleFNwYWNlKHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFjZSkKKyAgICB7CisgICAg
ICAgIFJFTEVBU0VfQVNTRVJUKGZ1bmN0aW9uSW5kZXhTcGFjZSA+PSBmdW5jdGlvbkltcG9ydENv
dW50KCkpOworICAgICAgICB1bnNpZ25lZCBjYWxsZWVJbmRleCA9IGZ1bmN0aW9uSW5kZXhTcGFj
ZSAtIGZ1bmN0aW9uSW1wb3J0Q291bnQoKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoY2FsbGVl
SW5kZXggPCBtX2NhbGxlZUNvdW50KTsKKyAgICAgICAgcmV0dXJuICptX2NhbGxlZXNbY2FsbGVl
SW5kZXggKyBtX2NhbGxlZUNvdW50XS5nZXQoKTsKKyAgICB9CisgICAgYm9vbCBpc1NhZmVUb1J1
bihNZW1vcnlNb2RlKTsKKworcHJpdmF0ZToKKyAgICBDb2RlQmxvY2soVk0mLCBNZW1vcnlNb2Rl
LCBNb2R1bGVJbmZvcm1hdGlvbiYpOworICAgIHVuc2lnbmVkIG1fY2FsbGVlQ291bnQ7CisgICAg
TWVtb3J5TW9kZSBtX21vZGU7CisgICAgVmVjdG9yPFJlZlB0cjxDYWxsZWU+PiBtX2NhbGxlZXM7
CisgICAgVmVjdG9yPE1hY3JvQXNzZW1ibGVyQ29kZVJlZj4gbV93YXNtVG9XYXNtRXhpdFN0dWJz
OworICAgIFJlZlB0cjxQbGFuPiBtX3BsYW47CisgICAgU3RyaW5nIG1fZXJyb3JNZXNzYWdlOwor
ICAgIExvY2sgbV9sb2NrOworfTsKKworY2xhc3MgTW9kdWxlIDogcHVibGljIFRocmVhZFNhZmVS
ZWZDb3VudGVkPE1vZHVsZT4geworcHVibGljOgorICAgIHN0YXRpYyBSZWY8TW9kdWxlPiBjcmVh
dGUoUmVmPE1vZHVsZUluZm9ybWF0aW9uPiYmIG1vZHVsZUluZm9ybWF0aW9uKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgTW9kdWxlKFdURk1vdmUobW9kdWxlSW5mb3JtYXRp
b24pKSk7CisgICAgfQorCisgICAgV2FzbTo6U2lnbmF0dXJlSW5kZXggc2lnbmF0dXJlSW5kZXhG
cm9tRnVuY3Rpb25JbmRleFNwYWNlKHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFjZSkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBtX21vZHVsZUluZm9ybWF0aW9uLT5zaWduYXR1cmVJbmRl
eEZyb21GdW5jdGlvbkluZGV4U3BhY2UoZnVuY3Rpb25JbmRleFNwYWNlKTsKKyAgICB9CisKKyAg
ICBjb25zdCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5mb3JtYXRpb24oKSBjb25z
dCB7IHJldHVybiBtX21vZHVsZUluZm9ybWF0aW9uLmdldCgpOyB9CisKKyAgICB2b2lkIGNvbXBp
bGVTeW5jKFZNJiwgTWVtb3J5TW9kZSk7CisgICAgdm9pZCBjb21waWxlQXN5bmMoVk0mLCBNZW1v
cnlNb2RlLCBQbGFuOjpDb21wbGV0aW9uVGFzayYmKTsKKworICAgIFJlZjxDb2RlQmxvY2s+IG5v
bk51bGxDb2RlQmxvY2soV2FzbTo6TWVtb3J5TW9kZSBtb2RlKQorICAgIHsKKyAgICAgICAgQ29k
ZUJsb2NrKiBjb2RlQmxvY2sgPSBtX2NvZGVCbG9ja3Nbc3RhdGljX2Nhc3Q8dWludDhfdD4obW9k
ZSldLmdldCgpOworICAgICAgICBSRUxFQVNFX0FTU0VSVCghIWNvZGVCbG9jayk7CisgICAgICAg
IHJldHVybiBtYWtlUmVmKCpjb2RlQmxvY2spOworICAgIH0KKworcHJpdmF0ZToKKyAgICBNb2R1
bGUoUmVmPE1vZHVsZUluZm9ybWF0aW9uPiYmKTsKKyAgICBSZWY8TW9kdWxlSW5mb3JtYXRpb24+
IG1fbW9kdWxlSW5mb3JtYXRpb247CisgICAgUmVmUHRyPENvZGVCbG9jaz4gbV9jb2RlQmxvY2tz
W1dhc206Ok51bWJlck9mTWVtb3J5TW9kZXNdOworICAgIExvY2sgbV9sb2NrOworfTsKKworfSB9
IC8vIG5hbWVzcGFjZSBKU0M6Oldhc20KKworI2VuZGlmIC8vIEVOQUJMRShXRUJBU1NFTUJMWSkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAJKHJldmlzaW9uIDIx
NDk3MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNTgsNyArNTgsNyBAQCBQbGFuOjpQbGFuKFZNJiB2bSwgUmVmPE1vZHVsZUlu
Zm9ybWF0aW9uCiAgICAgLCBtX3N0YXRlKFN0YXRlOjpWYWxpZGF0ZWQpCiAgICAgLCBtX2FzeW5j
V29yayh3b3JrKQogewotICAgIG1fY29tcGxldGlvblRhc2tzLmFwcGVuZChXVEZNb3ZlKHRhc2sp
KTsKKyAgICBtX2NvbXBsZXRpb25UYXNrcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIoJnZtLCBXVEZN
b3ZlKHRhc2spKSk7CiB9CiAKIFBsYW46OlBsYW4oVk0mIHZtLCBWZWN0b3I8dWludDhfdD4mJiBz
b3VyY2UsIEFzeW5jV29yayB3b3JrLCBDb21wbGV0aW9uVGFzayYmIHRhc2spCkBAIC03NSw3ICs3
NSw3IEBAIFBsYW46OlBsYW4oVk0mIHZtLCBjb25zdCB1aW50OF90KiBzb3VyY2UKICAgICAsIG1f
c3RhdGUoU3RhdGU6OkluaXRpYWwpCiAgICAgLCBtX2FzeW5jV29yayh3b3JrKQogewotICAgIG1f
Y29tcGxldGlvblRhc2tzLmFwcGVuZChXVEZNb3ZlKHRhc2spKTsKKyAgICBtX2NvbXBsZXRpb25U
YXNrcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIoJnZtLCBXVEZNb3ZlKHRhc2spKSk7CiB9CiAKIGNv
bnN0IGNoYXIqIFBsYW46OnN0YXRlU3RyaW5nKFN0YXRlIHN0YXRlKQpAQCAtMTA0LDEzICsxMDQs
MTMgQEAgdm9pZCBQbGFuOjpmYWlsKGNvbnN0IEFic3RyYWN0TG9ja2VyJiBsbwogICAgIGNvbXBs
ZXRlKGxvY2tlcik7CiB9CiAKLXZvaWQgUGxhbjo6YWRkQ29tcGxldGlvblRhc2soQ29tcGxldGlv
blRhc2smJiB0YXNrKQordm9pZCBQbGFuOjphZGRDb21wbGV0aW9uVGFzayhWTSYgdm0sIENvbXBs
ZXRpb25UYXNrJiYgdGFzaykKIHsKICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX2xvY2spOwogICAg
IGlmIChtX3N0YXRlICE9IFN0YXRlOjpDb21wbGV0ZWQpCi0gICAgICAgIG1fY29tcGxldGlvblRh
c2tzLmFwcGVuZChXVEZNb3ZlKHRhc2spKTsKKyAgICAgICAgbV9jb21wbGV0aW9uVGFza3MuYXBw
ZW5kKHN0ZDo6bWFrZV9wYWlyKCZ2bSwgV1RGTW92ZSh0YXNrKSkpOwogICAgIGVsc2UKLSAgICAg
ICAgdGFzaygqdGhpcyk7CisgICAgICAgIHRhc2sodm0sIHRoaXMpOwogfQogCiBib29sIFBsYW46
OnBhcnNlQW5kVmFsaWRhdGVNb2R1bGUoKQpAQCAtMTgyLDcgKzE4Miw3IEBAIHZvaWQgUGxhbjo6
cHJlcGFyZSgpCiAgICAgfTsKIAogICAgIGNvbnN0IGF1dG8mIGZ1bmN0aW9uTG9jYXRpb25zID0g
bV9tb2R1bGVJbmZvcm1hdGlvbi0+ZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5OwotICAgIGlmICgh
dHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fd2FzbUV4aXRTdHVicywgbV9tb2R1bGVJbmZvcm1hdGlvbi0+
aW1wb3J0RnVuY3Rpb25TaWduYXR1cmVJbmRpY2VzLnNpemUoKSwgIiBXZWJBc3NlbWJseSB0byBK
YXZhU2NyaXB0IHN0dWJzIikKKyAgICBpZiAoIXRyeVJlc2VydmVDYXBhY2l0eShtX3dhc21Ub1dh
c21FeGl0U3R1YnMsIG1fbW9kdWxlSW5mb3JtYXRpb24tPmltcG9ydEZ1bmN0aW9uU2lnbmF0dXJl
SW5kaWNlcy5zaXplKCksICIgV2ViQXNzZW1ibHkgdG8gSmF2YVNjcmlwdCBzdHVicyIpCiAgICAg
ICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHkobV91bmxpbmtlZFdhc21Ub1dhc21DYWxscywgZnVu
Y3Rpb25Mb2NhdGlvbnMuc2l6ZSgpLCAiIHVubGlua2VkIFdlYkFzc2VtYmx5IHRvIFdlYkFzc2Vt
Ymx5IGNhbGxzIikKICAgICAgICAgfHwgIXRyeVJlc2VydmVDYXBhY2l0eShtX3dhc21JbnRlcm5h
bEZ1bmN0aW9ucywgZnVuY3Rpb25Mb2NhdGlvbnMuc2l6ZSgpLCAiIFdlYkFzc2VtYmx5IGZ1bmN0
aW9ucyIpCiAgICAgICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHkobV9jb21waWxhdGlvbkNvbnRl
eHRzLCBmdW5jdGlvbkxvY2F0aW9ucy5zaXplKCksICIgY29tcGlsYXRpb24gY29udGV4dHMiKSkK
QEAgLTE5NiwxMCArMTk2LDEwIEBAIHZvaWQgUGxhbjo6cHJlcGFyZSgpCiAgICAgICAgIEltcG9y
dCogaW1wb3J0ID0gJm1fbW9kdWxlSW5mb3JtYXRpb24tPmltcG9ydHNbaW1wb3J0SW5kZXhdOwog
ICAgICAgICBpZiAoaW1wb3J0LT5raW5kICE9IEV4dGVybmFsS2luZDo6RnVuY3Rpb24pCiAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgdW5zaWduZWQgaW1wb3J0RnVuY3Rpb25JbmRleCA9
IG1fd2FzbUV4aXRTdHVicy5zaXplKCk7Ci0gICAgICAgIGRhdGFMb2dMbklmKHZlcmJvc2UsICJQ
cm9jZXNzaW5nIGltcG9ydCBmdW5jdGlvbiBudW1iZXIgIiwgaW1wb3J0RnVuY3Rpb25JbmRleCwg
IjogIiwgbWFrZVN0cmluZyhpbXBvcnQtPm1vZHVsZSksICI6ICIsIG1ha2VTdHJpbmcoaW1wb3J0
LT5maWVsZCkpOwotICAgICAgICBTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCA9IG1fbW9k
dWxlSW5mb3JtYXRpb24tPmltcG9ydEZ1bmN0aW9uU2lnbmF0dXJlSW5kaWNlcy5hdChpbXBvcnQt
PmtpbmRJbmRleCk7Ci0gICAgICAgIG1fd2FzbUV4aXRTdHVicy51bmNoZWNrZWRBcHBlbmQoZXhp
dFN0dWJHZW5lcmF0b3IoJm1fdm0sIG1fY2FsbExpbmtJbmZvcywgc2lnbmF0dXJlSW5kZXgsIGlt
cG9ydEZ1bmN0aW9uSW5kZXgpKTsKKyAgICAgICAgdW5zaWduZWQgaW1wb3J0RnVuY3Rpb25JbmRl
eCA9IG1fd2FzbVRvV2FzbUV4aXRTdHVicy5zaXplKCk7CisgICAgICAgIC8vZGF0YUxvZ0xuSWYo
dmVyYm9zZSwgIlByb2Nlc3NpbmcgaW1wb3J0IGZ1bmN0aW9uIG51bWJlciAiLCBpbXBvcnRGdW5j
dGlvbkluZGV4LCAiOiAiLCBtYWtlU3RyaW5nKGltcG9ydC0+bW9kdWxlKSwgIjogIiwgbWFrZVN0
cmluZyhpbXBvcnQtPmZpZWxkKSk7CisgICAgICAgIC8vU2lnbmF0dXJlSW5kZXggc2lnbmF0dXJl
SW5kZXggPSBtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRGdW5jdGlvblNpZ25hdHVyZUluZGlj
ZXMuYXQoaW1wb3J0LT5raW5kSW5kZXgpOworICAgICAgICBtX3dhc21Ub1dhc21FeGl0U3R1YnMu
dW5jaGVja2VkQXBwZW5kKHdhc21Ub1dhc20oaW1wb3J0RnVuY3Rpb25JbmRleCkpOwogICAgIH0K
IAogICAgIG1vdmVUb1N0YXRlKFN0YXRlOjpQcmVwYXJlZCk7CkBAIC0yNjAsNyArMjYwLDcgQEAg
dm9pZCBQbGFuOjpjb21waWxlRnVuY3Rpb25zKENvbXBpbGF0aW9uRQogICAgICAgICBBU1NFUlQo
ZnVuY3Rpb25MZW5ndGggPD0gbV9zb3VyY2VMZW5ndGgpOwogICAgICAgICBTaWduYXR1cmVJbmRl
eCBzaWduYXR1cmVJbmRleCA9IG1fbW9kdWxlSW5mb3JtYXRpb24tPmludGVybmFsRnVuY3Rpb25T
aWduYXR1cmVJbmRpY2VzW2Z1bmN0aW9uSW5kZXhdOwogICAgICAgICBjb25zdCBTaWduYXR1cmUm
IHNpZ25hdHVyZSA9IFNpZ25hdHVyZUluZm9ybWF0aW9uOjpnZXQoc2lnbmF0dXJlSW5kZXgpOwot
ICAgICAgICB1bnNpZ25lZCBmdW5jdGlvbkluZGV4U3BhY2UgPSBtX3dhc21FeGl0U3R1YnMuc2l6
ZSgpICsgZnVuY3Rpb25JbmRleDsKKyAgICAgICAgdW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNl
ID0gbV93YXNtVG9XYXNtRXhpdFN0dWJzLnNpemUoKSArIGZ1bmN0aW9uSW5kZXg7CiAgICAgICAg
IEFTU0VSVF9VTlVTRUQoZnVuY3Rpb25JbmRleFNwYWNlLCBtX21vZHVsZUluZm9ybWF0aW9uLT5z
aWduYXR1cmVJbmRleEZyb21GdW5jdGlvbkluZGV4U3BhY2UoZnVuY3Rpb25JbmRleFNwYWNlKSA9
PSBzaWduYXR1cmVJbmRleCk7CiAgICAgICAgIEFTU0VSVCh2YWxpZGF0ZUZ1bmN0aW9uKGZ1bmN0
aW9uU3RhcnQsIGZ1bmN0aW9uTGVuZ3RoLCBzaWduYXR1cmUsIG1fbW9kdWxlSW5mb3JtYXRpb24u
Z2V0KCkpKTsKIApAQCAtMzE2LDkgKzMxNiw5IEBAIHZvaWQgUGxhbjo6Y29tcGxldGUoY29uc3Qg
QWJzdHJhY3RMb2NrZXIKICAgICAgICAgICAgICAgICB2b2lkKiBleGVjdXRhYmxlQWRkcmVzczsK
ICAgICAgICAgICAgICAgICBpZiAobV9tb2R1bGVJbmZvcm1hdGlvbi0+aXNJbXBvcnRlZEZ1bmN0
aW9uRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZShjYWxsLmZ1bmN0aW9uSW5kZXgpKSB7CiAgICAgICAg
ICAgICAgICAgICAgIC8vIEZJWE1FIGltcG9ydHMgY291bGQgaGF2ZSBiZWVuIGxpbmtlZCBpbiBC
MywgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgcGF0Y2hwb2ludC4gVGhpcyBjb25kaXRpb24gc2hv
dWxkIGJlIHJlcGxhY2VkIGJ5IGEgUkVMRUFTRV9BU1NFUlQuIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xNjY0NjIKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJs
ZUFkZHJlc3MgPSBtX3dhc21FeGl0U3R1YnMuYXQoY2FsbC5mdW5jdGlvbkluZGV4KS53YXNtVG9X
YXNtLmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOworICAgICAgICAgICAgICAgICAgICBleGVj
dXRhYmxlQWRkcmVzcyA9IG1fd2FzbVRvV2FzbUV4aXRTdHVicy5hdChjYWxsLmZ1bmN0aW9uSW5k
ZXgpLmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOwogICAgICAgICAgICAgICAgIH0gZWxzZQot
ICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlQWRkcmVzcyA9IG1fd2FzbUludGVybmFsRnVu
Y3Rpb25zLmF0KGNhbGwuZnVuY3Rpb25JbmRleCAtIG1fd2FzbUV4aXRTdHVicy5zaXplKCkpLT53
YXNtRW50cnlwb2ludC5jb21waWxhdGlvbi0+Y29kZSgpLmV4ZWN1dGFibGVBZGRyZXNzKCk7Cisg
ICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVBZGRyZXNzID0gbV93YXNtSW50ZXJuYWxGdW5j
dGlvbnMuYXQoY2FsbC5mdW5jdGlvbkluZGV4IC0gbV93YXNtVG9XYXNtRXhpdFN0dWJzLnNpemUo
KSktPndhc21FbnRyeXBvaW50LmNvbXBpbGF0aW9uLT5jb2RlKCkuZXhlY3V0YWJsZUFkZHJlc3Mo
KTsKICAgICAgICAgICAgICAgICBNYWNyb0Fzc2VtYmxlcjo6cmVwYXRjaENhbGwoY2FsbC5jYWxs
TG9jYXRpb24sIENvZGVMb2NhdGlvbkxhYmVsKGV4ZWN1dGFibGVBZGRyZXNzKSk7CiAgICAgICAg
ICAgICB9CiAgICAgICAgIH0KQEAgLTMyNyw3ICszMjcsNyBAQCB2b2lkIFBsYW46OmNvbXBsZXRl
KGNvbnN0IEFic3RyYWN0TG9ja2VyCiAgICAgaWYgKG1fc3RhdGUgIT0gU3RhdGU6OkNvbXBsZXRl
ZCkgewogICAgICAgICBtb3ZlVG9TdGF0ZShTdGF0ZTo6Q29tcGxldGVkKTsKICAgICAgICAgZm9y
IChhdXRvJiB0YXNrIDogbV9jb21wbGV0aW9uVGFza3MpCi0gICAgICAgICAgICB0YXNrKCp0aGlz
KTsKKyAgICAgICAgICAgIHRhc2suc2Vjb25kKCp0YXNrLmZpcnN0LCB0aGlzKTsKICAgICAgICAg
bV9jb21wbGV0ZWQubm90aWZ5QWxsKCk7CiAgICAgfQogfQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3dhc20vV2FzbVBsYW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9XYXNtUGxhbi5oCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9XYXNtUGxhbi5oCSh3b3JraW5nIGNvcHkpCkBAIC00NSw4ICs0NSwxMCBAQCBu
YW1lc3BhY2UgV2FzbSB7CiAKIGNsYXNzIFBsYW4gOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50
ZWQ8UGxhbj4gewogcHVibGljOgotICAgIHN0YXRpYyB2b2lkIGRvbnRGaW5hbGl6ZShQbGFuJikg
eyB9Ci0gICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoUGxhbiYpPiBDb21wbGV0aW9uVGFz
azsKKyAgICBzdGF0aWMgdm9pZCBkb250RmluYWxpemUoVk0mLCBQbGFuKikgeyB9CisgICAgLy8g
VGhlIHBsYW4gbWF5IG9yIG1heSBub3QgYmUgbnVsbCwgZGVwZW5kaW5nIG9uIGhvdyBhIENvbXBs
ZXRpb25UYXNrCisgICAgLy8gaXMgY2FsbGVkLiBPYnZpb3VzbHkgaWYgdGhlIHBsYW4gZXZlciBj
YWxscyB0aGUgdGFzaywgaXQnbGwgYmUgbm9uLW51bGwuCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0
aW9uPHZvaWQoVk0mLCBQbGFuKik+IENvbXBsZXRpb25UYXNrOwogICAgIGVudW0gQXN5bmNXb3Jr
IDogdWludDhfdCB7IEZ1bGxDb21waWxlLCBWYWxpZGF0aW9uIH07CiAgICAgLy8gTm90ZTogQ29t
cGxldGlvblRhc2sgc2hvdWxkIG5vdCBob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBQbGFuIG90aGVy
d2lzZSB0aGVyZSB3aWxsIGJlIGEgcmVmZXJlbmNlIGN5Y2xlLgogICAgIFBsYW4oVk0mLCBSZWY8
TW9kdWxlSW5mb3JtYXRpb24+LCBBc3luY1dvcmssIENvbXBsZXRpb25UYXNrJiYpOwpAQCAtNTYs
NyArNTgsOSBAQCBwdWJsaWM6CiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgUGxhbihWTSYsIGNvbnN0
IHVpbnQ4X3QqLCBzaXplX3QsIEFzeW5jV29yaywgQ29tcGxldGlvblRhc2smJik7CiAgICAgSlNf
RVhQT1JUX1BSSVZBVEUgflBsYW4oKTsKIAotICAgIHZvaWQgYWRkQ29tcGxldGlvblRhc2soQ29t
cGxldGlvblRhc2smJik7CisgICAgLy8gSWYgeW91IGd1YXJhbnRlZSB0aGUgb3JkZXJpbmcgaGVy
ZSwgeW91IGNhbiByZWx5IG9uIEZJRk8gb2YgdGhlCisgICAgLy8gY29tcGxldGlvbiB0YXNrcyBi
ZWluZyBjYWxsZWQuCisgICAgdm9pZCBhZGRDb21wbGV0aW9uVGFzayhWTSYsIENvbXBsZXRpb25U
YXNrJiYpOwogCiAgICAgYm9vbCBwYXJzZUFuZFZhbGlkYXRlTW9kdWxlKCk7CiAKQEAgLTkxLDEw
ICs5NSwxMCBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBXVEZNb3ZlKG1fY2FsbExpbmtJbmZv
cyk7CiAgICAgfQogCi0gICAgVmVjdG9yPFdhc21FeGl0U3R1YnM+JiYgdGFrZVdhc21FeGl0U3R1
YnMoKQorICAgIFZlY3RvcjxNYWNyb0Fzc2VtYmxlckNvZGVSZWY+JiYgdGFrZVdhc21Ub1dhc21F
eGl0U3R1YnMoKQogICAgIHsKICAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZhaWxlZCgpICYmICFo
YXNXb3JrKCkpOwotICAgICAgICByZXR1cm4gV1RGTW92ZShtX3dhc21FeGl0U3R1YnMpOworICAg
ICAgICByZXR1cm4gV1RGTW92ZShtX3dhc21Ub1dhc21FeGl0U3R1YnMpOwogICAgIH0KIAogICAg
IHZvaWQgc2V0TW9kZShNZW1vcnlNb2RlIG1vZGUpIHsgbV9tb2RlID0gbW9kZTsgfQpAQCAtMTMx
LDEyICsxMzUsMTIgQEAgcHJpdmF0ZToKIAogICAgIFJlZjxNb2R1bGVJbmZvcm1hdGlvbj4gbV9t
b2R1bGVJbmZvcm1hdGlvbjsKICAgICBCYWc8Q2FsbExpbmtJbmZvPiBtX2NhbGxMaW5rSW5mb3M7
Ci0gICAgVmVjdG9yPFdhc21FeGl0U3R1YnM+IG1fd2FzbUV4aXRTdHViczsKKyAgICBWZWN0b3I8
TWFjcm9Bc3NlbWJsZXJDb2RlUmVmPiBtX3dhc21Ub1dhc21FeGl0U3R1YnM7CiAgICAgVmVjdG9y
PHN0ZDo6dW5pcXVlX3B0cjxXYXNtSW50ZXJuYWxGdW5jdGlvbj4+IG1fd2FzbUludGVybmFsRnVu
Y3Rpb25zOwogICAgIFZlY3RvcjxDb21waWxhdGlvbkNvbnRleHQ+IG1fY29tcGlsYXRpb25Db250
ZXh0czsKIAogICAgIFZNJiBtX3ZtOwotICAgIFZlY3RvcjxDb21wbGV0aW9uVGFzaywgMT4gbV9j
b21wbGV0aW9uVGFza3M7CisgICAgVmVjdG9yPHN0ZDo6cGFpcjxWTSosIENvbXBsZXRpb25UYXNr
PiwgMT4gbV9jb21wbGV0aW9uVGFza3M7CiAKICAgICBWZWN0b3I8VmVjdG9yPFVubGlua2VkV2Fz
bVRvV2FzbUNhbGw+PiBtX3VubGlua2VkV2FzbVRvV2FzbUNhbGxzOwogICAgIGNvbnN0IHVpbnQ4
X3QqIG1fc291cmNlOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJB
c3NlbWJseUNvZGVCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3dhc20vanMvSlNXZWJBc3NlbWJseUNvZGVCbG9jay5jcHAJKHJldmlzaW9uIDIxNDk3MikKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlDb2RlQmxvY2suY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zMiwyNCArMzIsMjcgQEAKICNpbmNsdWRlICJKU1dlYkFzc2Vt
Ymx5TGlua0Vycm9yLmgiCiAjaW5jbHVkZSAiSlNXZWJBc3NlbWJseU1lbW9yeS5oIgogI2luY2x1
ZGUgIkpTV2ViQXNzZW1ibHlNb2R1bGUuaCIKKyNpbmNsdWRlICJXYXNtQmluZGluZy5oIgogI2lu
Y2x1ZGUgIldhc21QbGFuSW5saW5lcy5oIgogCiBuYW1lc3BhY2UgSlNDIHsKIAogY29uc3QgQ2xh
c3NJbmZvIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6OnNfaW5mbyA9IHsgIldlYkFzc2VtYmx5Q29k
ZUJsb2NrIiwgbnVsbHB0ciwgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShKU1dlYkFzc2VtYmx5Q29k
ZUJsb2NrKSB9OwogCi1KU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpKU1dlYkFzc2VtYmx5Q29kZUJs
b2NrKFZNJiB2bSwgSlNXZWJBc3NlbWJseU1vZHVsZSogb3duZXIsICBXYXNtOjpNZW1vcnlNb2Rl
IG1vZGUsIFJlZjxXYXNtOjpQbGFuPiYmIHBsYW4sIHVuc2lnbmVkIGNhbGxlZUNvdW50KQorSlNX
ZWJBc3NlbWJseUNvZGVCbG9jazo6SlNXZWJBc3NlbWJseUNvZGVCbG9jayhWTSYgdm0sIFJlZjxX
YXNtOjpDb2RlQmxvY2s+JiYgY29kZUJsb2NrLCBjb25zdCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlv
biYgbW9kdWxlSW5mb3JtYXRpb24pCiAgICAgOiBCYXNlKHZtLCB2bS53ZWJBc3NlbWJseUNvZGVC
bG9ja1N0cnVjdHVyZS5nZXQoKSkKLSAgICAsIG1fcGxhbihXVEZNb3ZlKHBsYW4pKQotICAgICwg
bV9tb2RlKG1vZGUpCi0gICAgLCBtX2NhbGxlZUNvdW50KGNhbGxlZUNvdW50KQotewotICAgIG1f
bW9kdWxlLnNldCh2bSwgdGhpcywgb3duZXIpOwotICAgIEFTU0VSVCghbW9kdWxlKCktPmNvZGVC
bG9jayhtb2RlKSk7Ci0gICAgbW9kdWxlKCktPnNldENvZGVCbG9jayh2bSwgbW9kZSwgdGhpcyk7
Ci0gICAgbV9jYWxsZWVzLnJlc2l6ZShtX2NhbGxlZUNvdW50ICogMik7CisgICAgLCBtX2NvZGVC
bG9jayhXVEZNb3ZlKGNvZGVCbG9jaykpCit7CisgICAgLy8gRklYTUU6IGFsbG9jYXRlIGNhbGwg
bGluayBpbmZvcyBoZXJlLgorICAgIG1fd2FzbVRvSlNFeGl0U3R1YnMucmVzZXJ2ZUNhcGFjaXR5
KG1fY29kZUJsb2NrLT5mdW5jdGlvbkltcG9ydENvdW50KCkpOworICAgIGZvciAodW5zaWduZWQg
aW1wb3J0SW5kZXggPSAwOyBpbXBvcnRJbmRleCA8IG1fY29kZUJsb2NrLT5mdW5jdGlvbkltcG9y
dENvdW50KCk7ICsraW1wb3J0SW5kZXgpIHsKKyAgICAgICAgV2FzbTo6U2lnbmF0dXJlSW5kZXgg
c2lnbmF0dXJlSW5kZXggPSBtb2R1bGVJbmZvcm1hdGlvbi5pbXBvcnRGdW5jdGlvblNpZ25hdHVy
ZUluZGljZXMuYXQoaW1wb3J0SW5kZXgpOworICAgICAgICBtX3dhc21Ub0pTRXhpdFN0dWJzLnVu
Y2hlY2tlZEFwcGVuZChXYXNtOjp3YXNtVG9Kcygmdm0sIG1fY2FsbExpbmtJbmZvcywgc2lnbmF0
dXJlSW5kZXgsIGltcG9ydEluZGV4KSk7CisgICAgICAgIGltcG9ydFdhc21Ub0pTU3R1YihpbXBv
cnRJbmRleCkgPSBtX3dhc21Ub0pTRXhpdFN0dWJzW2ltcG9ydEluZGV4XS5jb2RlKCkuZXhlY3V0
YWJsZUFkZHJlc3MoKTsKKyAgICB9CiB9CiAKKy8qCiB2b2lkIEpTV2ViQXNzZW1ibHlDb2RlQmxv
Y2s6OmluaXRpYWxpemUoKQogewogICAgIGlmIChpbml0aWFsaXplZCgpKQpAQCAtODIsNiArODUs
NyBAQCB2b2lkIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6OmluaXRpYWxpemUoCiAKICAgICBtX3Bs
YW4gPSBudWxscHRyOwogfQorKi8KIAogdm9pZCBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpkZXN0
cm95KEpTQ2VsbCogY2VsbCkKIHsKQEAgLTkwLDI0ICs5NCw3IEBAIHZvaWQgSlNXZWJBc3NlbWJs
eUNvZGVCbG9jazo6ZGVzdHJveShKU0MKIAogYm9vbCBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpp
c1NhZmVUb1J1bihKU1dlYkFzc2VtYmx5TWVtb3J5KiBtZW1vcnkpIGNvbnN0CiB7Ci0gICAgaWYg
KCFydW5uYWJsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBXYXNtOjpNZW1vcnlN
b2RlIGNvZGVNb2RlID0gbW9kZSgpOwotICAgIFdhc206Ok1lbW9yeU1vZGUgbWVtb3J5TW9kZSA9
IG1lbW9yeS0+bWVtb3J5KCkubW9kZSgpOwotICAgIHN3aXRjaCAoY29kZU1vZGUpIHsKLSAgICBj
YXNlIFdhc206Ok1lbW9yeU1vZGU6OkJvdW5kc0NoZWNraW5nOgotICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICBjYXNlIFdhc206Ok1lbW9yeU1vZGU6OlNpZ25hbGluZzoKLSAgICAgICAgLy8gQ29k
ZSBiZWluZyBpbiBTaWduYWxpbmcgbW9kZSBtZWFucyB0aGF0IGl0IHBlcmZvcm1zIG5vIGJvdW5k
cyBjaGVja3MuCi0gICAgICAgIC8vIEl0cyBtZW1vcnksIGV2ZW4gaWYgZW1wdHksIGFic29sdXRl
bHkgbXVzdCBhbHNvIGJlIGluIFNpZ25hbGluZyBtb2RlCi0gICAgICAgIC8vIGJlY2F1c2UgdGhl
IHBhZ2UgcHJvdGVjdGlvbiBkZXRlY3RzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMuCi0gICAgICAg
IHJldHVybiBtZW1vcnlNb2RlID09IFdhc206Ok1lbW9yeU1vZGU6OlNpZ25hbGluZzsKLSAgICBj
YXNlIFdhc206Ok1lbW9yeU1vZGU6Ok51bWJlck9mTWVtb3J5TW9kZXM6Ci0gICAgICAgIGJyZWFr
OwotICAgIH0KLSAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBm
YWxzZTsKKyAgICByZXR1cm4gbV9jb2RlQmxvY2stPmlzU2FmZVRvUnVuKG1lbW9yeS0+bWVtb3J5
KCkubW9kZSgpKTsKIH0KIAogdm9pZCBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjp2aXNpdENoaWxk
cmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5Q29kZUJsb2NrLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUNvZGVCbG9jay5o
CShyZXZpc2lvbiAyMTQ5NzIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dl
YkFzc2VtYmx5Q29kZUJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTMzLDYgKzMzLDcgQEAKICNp
bmNsdWRlICJVbmNvbmRpdGlvbmFsRmluYWxpemVyLmgiCiAjaW5jbHVkZSAiV2FzbUNhbGxlZS5o
IgogI2luY2x1ZGUgIldhc21Gb3JtYXQuaCIKKyNpbmNsdWRlICJXYXNtTW9kdWxlLmgiCiAjaW5j
bHVkZSA8d3RmL0JhZy5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KIApAQCAtNTAsOSArNTEs
OSBAQCBwdWJsaWM6CiAgICAgdHlwZWRlZiBKU0NlbGwgQmFzZTsKICAgICBzdGF0aWMgY29uc3Qg
dW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBCYXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVy
ZUlzSW1tb3J0YWw7CiAKLSAgICBzdGF0aWMgSlNXZWJBc3NlbWJseUNvZGVCbG9jayogY3JlYXRl
KFZNJiB2bSwgSlNXZWJBc3NlbWJseU1vZHVsZSogb3duZXIsIFdhc206Ok1lbW9yeU1vZGUgbW9k
ZSwgUmVmPFdhc206OlBsYW4+JiYgcGxhbiwgdW5zaWduZWQgY2FsbGVlQ291bnQsIHVuc2lnbmVk
IGZ1bmN0aW9uSW1wb3J0Q291bnQpCisgICAgc3RhdGljIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2sq
IGNyZWF0ZShWTSYgdm0sIFJlZjxXYXNtOjpDb2RlQmxvY2s+IGNvZGVCbG9jaywgY29uc3QgV2Fz
bTo6TW9kdWxlSW5mb3JtYXRpb24mIG1vZHVsZUluZm9ybWF0aW9uKQogICAgIHsKLSAgICAgICAg
YXV0byogcmVzdWx0ID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8SlNXZWJBc3NlbWJseUNv
ZGVCbG9jaz4odm0uaGVhcCwgYWxsb2NhdGlvblNpemUoZnVuY3Rpb25JbXBvcnRDb3VudCkpKSBK
U1dlYkFzc2VtYmx5Q29kZUJsb2NrKHZtLCBvd25lciwgbW9kZSwgV1RGTW92ZShwbGFuKSwgY2Fs
bGVlQ291bnQpOworICAgICAgICBhdXRvKiByZXN1bHQgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRl
Q2VsbDxKU1dlYkFzc2VtYmx5Q29kZUJsb2NrPih2bS5oZWFwLCBhbGxvY2F0aW9uU2l6ZShtb2R1
bGVJbmZvcm1hdGlvbi5pbXBvcnRGdW5jdGlvbkNvdW50KCkpKSkgSlNXZWJBc3NlbWJseUNvZGVC
bG9jayh2bSwgV1RGTW92ZShjb2RlQmxvY2spLCBtb2R1bGVJbmZvcm1hdGlvbik7CiAgICAgICAg
IHJlc3VsdC0+ZmluaXNoQ3JlYXRpb24odm0pOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAg
IH0KQEAgLTYyLDQwICs2MywzMyBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6
OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90b3R5cGUsIFR5cGVJbmZvKENlbGxUeXBlLCBT
dHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CiAgICAgfQogCi0gICAgdW5zaWduZWQgZnVuY3Rpb25J
bXBvcnRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fd2FzbUV4aXRTdHVicy5zaXplKCk7IH0KLSAg
ICBXYXNtOjpNZW1vcnlNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KKyAgICB1
bnNpZ25lZCBmdW5jdGlvbkltcG9ydENvdW50KCkgY29uc3QgeyByZXR1cm4gbV9jb2RlQmxvY2st
PmZ1bmN0aW9uSW1wb3J0Q291bnQoKTsgfQorICAgIC8vV2FzbTo6TWVtb3J5TW9kZSBtb2RlKCkg
Y29uc3QgeyByZXR1cm4gbV9tb2RlOyB9CiAgICAgSlNXZWJBc3NlbWJseU1vZHVsZSogbW9kdWxl
KCkgY29uc3QgeyByZXR1cm4gbV9tb2R1bGUuZ2V0KCk7IH0KIAogICAgIC8vIERvbid0IGNhbGwg
aW50aWFsaXplIGRpcmVjdGx5LCB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZm9yIHlvdSwgYXMgbmVl
ZGVkLCBieSBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmZpbmFsaXplQ3JlYXRpb24uCi0gICAgdm9p
ZCBpbml0aWFsaXplKCk7Ci0gICAgYm9vbCBpbml0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuICFt
X3BsYW47IH0KKyAgICAvL3ZvaWQgaW5pdGlhbGl6ZSgpOworICAgIC8vYm9vbCBpbml0aWFsaXpl
ZCgpIGNvbnN0IHsgcmV0dXJuICFtX3BsYW47IH0KIAotICAgIFdhc206OlBsYW4mIHBsYW4oKSBj
b25zdCB7IEFTU0VSVCghaW5pdGlhbGl6ZWQoKSk7IHJldHVybiAqbV9wbGFuOyB9CisgICAgLy9X
YXNtOjpQbGFuJiBwbGFuKCkgY29uc3QgeyBBU1NFUlQoIWluaXRpYWxpemVkKCkpOyByZXR1cm4g
Km1fcGxhbjsgfQogCi0gICAgYm9vbCBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGluaXRpYWxp
emVkKCkgJiYgIW1fZXJyb3JNZXNzYWdlOyB9Ci0gICAgU3RyaW5nJiBlcnJvck1lc3NhZ2UoKSB7
IEFTU0VSVCghcnVubmFibGUoKSk7IHJldHVybiBtX2Vycm9yTWVzc2FnZTsgfQorICAgIC8vYm9v
bCBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGluaXRpYWxpemVkKCkgJiYgIW1fZXJyb3JNZXNz
YWdlOyB9CiAgICAgYm9vbCBpc1NhZmVUb1J1bihKU1dlYkFzc2VtYmx5TWVtb3J5KikgY29uc3Q7
CiAKICAgICAvLyBUaGVzZSB0d28gY2FsbGVlIGdldHRlcnMgYXJlIG9ubHkgdmFsaWQgb25jZSB0
aGUgY2FsbGVlcyBoYXZlIGJlZW4gcG9wdWxhdGVkLgorCiAgICAgV2FzbTo6Q2FsbGVlJiBqc0Vu
dHJ5cG9pbnRDYWxsZWVGcm9tRnVuY3Rpb25JbmRleFNwYWNlKHVuc2lnbmVkIGZ1bmN0aW9uSW5k
ZXhTcGFjZSkKICAgICB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGZ1bmN0aW9uSW5kZXhTcGFj
ZSA+PSBmdW5jdGlvbkltcG9ydENvdW50KCkpOwotICAgICAgICB1bnNpZ25lZCBjYWxsZWVJbmRl
eCA9IGZ1bmN0aW9uSW5kZXhTcGFjZSAtIGZ1bmN0aW9uSW1wb3J0Q291bnQoKTsKLSAgICAgICAg
UkVMRUFTRV9BU1NFUlQoY2FsbGVlSW5kZXggPCBtX2NhbGxlZUNvdW50KTsKLSAgICAgICAgcmV0
dXJuICptX2NhbGxlZXNbY2FsbGVlSW5kZXhdLmdldCgpOworICAgICAgICByZXR1cm4gbV9jb2Rl
QmxvY2stPmpzRW50cnlwb2ludENhbGxlZUZyb21GdW5jdGlvbkluZGV4U3BhY2UoZnVuY3Rpb25J
bmRleFNwYWNlKTsKICAgICB9CiAgICAgV2FzbTo6Q2FsbGVlJiB3YXNtRW50cnlwb2ludENhbGxl
ZUZyb21GdW5jdGlvbkluZGV4U3BhY2UodW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlKQogICAg
IHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoZnVuY3Rpb25JbmRleFNwYWNlID49IGZ1bmN0aW9u
SW1wb3J0Q291bnQoKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNhbGxlZUluZGV4ID0gZnVuY3Rpb25J
bmRleFNwYWNlIC0gZnVuY3Rpb25JbXBvcnRDb3VudCgpOwotICAgICAgICBSRUxFQVNFX0FTU0VS
VChjYWxsZWVJbmRleCA8IG1fY2FsbGVlQ291bnQpOwotICAgICAgICByZXR1cm4gKm1fY2FsbGVl
c1tjYWxsZWVJbmRleCArIG1fY2FsbGVlQ291bnRdLmdldCgpOworICAgICAgICByZXR1cm4gbV9j
b2RlQmxvY2stPndhc21FbnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZShmdW5j
dGlvbkluZGV4U3BhY2UpOwogICAgIH0KIAogICAgIHZvaWQqIHdhc21Ub0pzQ2FsbFN0dWJGb3JJ
bXBvcnQodW5zaWduZWQgaW1wb3J0SW5kZXgpCiAgICAgewotICAgICAgICBSRUxFQVNFX0FTU0VS
VChpbXBvcnRJbmRleCA8IG1fd2FzbUV4aXRTdHVicy5zaXplKCkpOwotICAgICAgICByZXR1cm4g
bV93YXNtRXhpdFN0dWJzW2ltcG9ydEluZGV4XS53YXNtVG9Kcy5jb2RlKCkuZXhlY3V0YWJsZUFk
ZHJlc3MoKTsKKyAgICAgICAgcmV0dXJuIGltcG9ydFdhc21Ub0pTU3R1YihpbXBvcnRJbmRleCk7
CiAgICAgfQogCiAgICAgc3RhdGljIHB0cmRpZmZfdCBvZmZzZXRPZkltcG9ydFdhc21Ub0pTU3R1
Yih1bnNpZ25lZCBpbXBvcnRJbmRleCkKQEAgLTEwNCwxOCArOTgsNyBAQCBwdWJsaWM6CiAgICAg
fQogCiBwcml2YXRlOgotICAgIHZvaWQgc2V0SlNFbnRyeXBvaW50Q2FsbGVlKHVuc2lnbmVkIGNh
bGxlZUluZGV4LCBSZWY8V2FzbTo6Q2FsbGVlPiYmIGNhbGxlZSkKLSAgICB7Ci0gICAgICAgIFJF
TEVBU0VfQVNTRVJUKGNhbGxlZUluZGV4IDwgbV9jYWxsZWVDb3VudCk7Ci0gICAgICAgIG1fY2Fs
bGVlc1tjYWxsZWVJbmRleF0gPSBXVEZNb3ZlKGNhbGxlZSk7Ci0gICAgfQotICAgIHZvaWQgc2V0
V2FzbUVudHJ5cG9pbnRDYWxsZWUodW5zaWduZWQgY2FsbGVlSW5kZXgsIFJlZjxXYXNtOjpDYWxs
ZWU+JiYgY2FsbGVlKQotICAgIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoY2FsbGVlSW5kZXgg
PCBtX2NhbGxlZUNvdW50KTsKLSAgICAgICAgbV9jYWxsZWVzW2NhbGxlZUluZGV4ICsgbV9jYWxs
ZWVDb3VudF0gPSBXVEZNb3ZlKGNhbGxlZSk7Ci0gICAgfQotCi0gICAgSlNXZWJBc3NlbWJseUNv
ZGVCbG9jayhWTSYsIEpTV2ViQXNzZW1ibHlNb2R1bGUqLCBXYXNtOjpNZW1vcnlNb2RlLCBSZWY8
V2FzbTo6UGxhbj4mJiwgdW5zaWduZWQgY2FsbGVlQ291bnQpOworICAgIEpTV2ViQXNzZW1ibHlD
b2RlQmxvY2soVk0mLCBSZWY8V2FzbTo6Q29kZUJsb2NrPiYmLCBjb25zdCBXYXNtOjpNb2R1bGVJ
bmZvcm1hdGlvbiYpOwogICAgIERFQ0xBUkVfRVhQT1JUX0lORk87CiAgICAgc3RhdGljIGNvbnN0
IGJvb2wgbmVlZHNEZXN0cnVjdGlvbiA9IHRydWU7CiAgICAgc3RhdGljIHZvaWQgZGVzdHJveShK
U0NlbGwqKTsKQEAgLTE0MSwxNSArMTI0LDEwIEBAIHByaXZhdGU6CiAgICAgfTsKIAogICAgIFdy
aXRlQmFycmllcjxKU1dlYkFzc2VtYmx5TW9kdWxlPiBtX21vZHVsZTsKKyAgICBSZWY8V2FzbTo6
Q29kZUJsb2NrPiBtX2NvZGVCbG9jazsKKyAgICBWZWN0b3I8TWFjcm9Bc3NlbWJsZXJDb2RlUmVm
PiBtX3dhc21Ub0pTRXhpdFN0dWJzOwogICAgIFVuY29uZGl0aW9uYWxGaW5hbGl6ZXIgbV91bmNv
bmRpdGlvbmFsRmluYWxpemVyOwogICAgIEJhZzxDYWxsTGlua0luZm8+IG1fY2FsbExpbmtJbmZv
czsKLSAgICBWZWN0b3I8V2FzbTo6V2FzbUV4aXRTdHVicz4gbV93YXNtRXhpdFN0dWJzOwotICAg
IFZlY3RvcjxSZWZQdHI8V2FzbTo6Q2FsbGVlPj4gbV9jYWxsZWVzOwotICAgIC8vIFRoZSBwbGFu
IHRoYXQgaXMgY29tcGlsaW5nIHRoaXMgY29kZSBibG9jay4KLSAgICBSZWZQdHI8V2FzbTo6UGxh
bj4gbV9wbGFuOwotICAgIFN0cmluZyBtX2Vycm9yTWVzc2FnZTsKLSAgICBXYXNtOjpNZW1vcnlN
b2RlIG1fbW9kZTsKLSAgICB1bnNpZ25lZCBtX2NhbGxlZUNvdW50OwogfTsKIAogfSAvLyBuYW1l
c3BhY2UgSlNDCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2Vt
Ymx5SW5zdGFuY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNt
L2pzL0pTV2ViQXNzZW1ibHlJbnN0YW5jZS5jcHAJKHJldmlzaW9uIDIxNDk3MikKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlJbnN0YW5jZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTk0LDYgKzk0LDcgQEAgdm9pZCBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OnZp
c2l0Q2hpbGRyZQogICAgICAgICB2aXNpdG9yLmFwcGVuZCh0aGlzT2JqZWN0LT5pbXBvcnRGdW5j
dGlvbnMoKVtpXSk7CiB9CiAKKy8qCiB2b2lkIEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6YWRkVW5p
dGlhbGl6ZWRDb2RlQmxvY2soVk0mIHZtLCBSZWY8V2FzbTo6UGxhbj4gcGxhbikKIHsKICAgICBh
dXRvKiBjb2RlQmxvY2sgPSBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpjcmVhdGUoCkBAIC0xMDEs
MTcgKzEwMiwyMSBAQCB2b2lkIEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6YWRkVW5pdGlhbGl6CiAg
ICAgbV9jb2RlQmxvY2suc2V0KHZtLCB0aGlzLCBjb2RlQmxvY2spOwogICAgIEFTU0VSVCghY29k
ZUJsb2NrLT5pbml0aWFsaXplZCgpKTsKIH0KKyovCiAKLXZvaWQgSlNXZWJBc3NlbWJseUluc3Rh
bmNlOjpmaW5hbGl6ZUNyZWF0aW9uKFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjKQordm9pZCBKU1dl
YkFzc2VtYmx5SW5zdGFuY2U6OmZpbmFsaXplQ3JlYXRpb24oVk0mIHZtLCBFeGVjU3RhdGUqIGV4
ZWMsIFJlZjxXYXNtOjpDb2RlQmxvY2s+JiYgd2FzbUNvZGVCbG9jaykKIHsKICAgICBhdXRvIHNj
b3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7Ci0gICAgY29kZUJsb2NrKCktPmluaXRpYWxp
emUoKTsKLQotICAgIGlmICghY29kZUJsb2NrKCktPnJ1bm5hYmxlKCkpIHsKLSAgICAgICAgdGhy
b3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIEpTV2ViQXNzZW1ibHlMaW5rRXJyb3I6OmNyZWF0ZShl
eGVjLCB2bSwgZ2xvYmFsT2JqZWN0KCktPldlYkFzc2VtYmx5TGlua0Vycm9yU3RydWN0dXJlKCks
IGNvZGVCbG9jaygpLT5lcnJvck1lc3NhZ2UoKSkpOworICAgIGlmICghd2FzbUNvZGVCbG9jay0+
cnVubmFibGUoKSkgeworICAgICAgICAvLyBGSVhNRTogZmluZCBhIHRocmVhZCBzYWZlIHdheSB0
byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UhCisgICAgICAgIC8vdGhyb3dFeGNlcHRpb24oZXhlYywg
c2NvcGUsIEpTV2ViQXNzZW1ibHlMaW5rRXJyb3I6OmNyZWF0ZShleGVjLCB2bSwgZ2xvYmFsT2Jq
ZWN0KCktPldlYkFzc2VtYmx5TGlua0Vycm9yU3RydWN0dXJlKCksIGNvZGVCbG9jaygpLT5lcnJv
ck1lc3NhZ2UoKSkpOworICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwgSlNXZWJB
c3NlbWJseUxpbmtFcnJvcjo6Y3JlYXRlKGV4ZWMsIHZtLCBnbG9iYWxPYmplY3QoKS0+V2ViQXNz
ZW1ibHlMaW5rRXJyb3JTdHJ1Y3R1cmUoKSwgQVNDSUlMaXRlcmFsKCJGSVhNRTogYmV0dGVyIGVy
cm9yIG1lc3NhZ2UgaGVyZSIpKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgUkVMRUFT
RV9BU1NFUlQoY29kZUJsb2NrKCktPmlzU2FmZVRvUnVuKG1lbW9yeSgpKSk7CisKKyAgICBSRUxF
QVNFX0FTU0VSVCh3YXNtQ29kZUJsb2NrLT5pc1NhZmVUb1J1bihtZW1vcnkoKS0+bWVtb3J5KCku
bW9kZSgpKSk7CisgICAgbV9jb2RlQmxvY2suc2V0KHZtLCB0aGlzLAorICAgICAgICBKU1dlYkFz
c2VtYmx5Q29kZUJsb2NrOjpjcmVhdGUodm0sIHdhc21Db2RlQmxvY2suY29weVJlZigpLCBtX21v
ZHVsZS0+bW9kdWxlKCkubW9kdWxlSW5mb3JtYXRpb24oKSkpOwogCiAgICAgYXV0byogbW9kdWxl
UmVjb3JkID0ganNDYXN0PFdlYkFzc2VtYmx5TW9kdWxlUmVjb3JkKj4obV9tb2R1bGVOYW1lc3Bh
Y2VPYmplY3QtPm1vZHVsZVJlY29yZCgpKTsKICAgICBtb2R1bGVSZWNvcmQtPmxpbmsoZXhlYywg
bW9kdWxlKCksIHRoaXMpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNX
ZWJBc3NlbWJseUluc3RhbmNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmgJKHJldmlzaW9uIDIxNDk3MikKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlJbnN0YW5jZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zOSwxMSArMzksNiBAQCBjbGFzcyBKU01vZHVsZU5hbWVzcGFjZU9iamVj
dDsKIGNsYXNzIEpTV2ViQXNzZW1ibHlNb2R1bGU7CiBjbGFzcyBXZWJBc3NlbWJseVRvSlNDYWxs
ZWU7CiAKLW5hbWVzcGFjZSBXYXNtIHsKLWNsYXNzIFBsYW47Ci19Ci0KLQogY2xhc3MgSlNXZWJB
c3NlbWJseUluc3RhbmNlIDogcHVibGljIEpTRGVzdHJ1Y3RpYmxlT2JqZWN0IHsKIHB1YmxpYzoK
ICAgICB0eXBlZGVmIEpTRGVzdHJ1Y3RpYmxlT2JqZWN0IEJhc2U7CkBAIC01NCw5ICs0OSw5IEBA
IHB1YmxpYzoKICAgICBERUNMQVJFX0VYUE9SVF9JTkZPOwogCiAgICAgSlNXZWJBc3NlbWJseUNv
ZGVCbG9jayogY29kZUJsb2NrKCkgY29uc3QgeyByZXR1cm4gbV9jb2RlQmxvY2suZ2V0KCk7IH0K
LSAgICBib29sIGluaXRpYWxpemVkKCkgY29uc3QgeyByZXR1cm4gY29kZUJsb2NrKCkgJiYgY29k
ZUJsb2NrKCktPmluaXRpYWxpemVkKCk7IH0KLSAgICB2b2lkIGFkZFVuaXRpYWxpemVkQ29kZUJs
b2NrKFZNJiwgUmVmPFdhc206OlBsYW4+KTsKLSAgICB2b2lkIGZpbmFsaXplQ3JlYXRpb24oVk0m
LCBFeGVjU3RhdGUqKTsKKyAgICAvL2Jvb2wgaW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBj
b2RlQmxvY2soKSAmJiBjb2RlQmxvY2soKS0+aW5pdGlhbGl6ZWQoKTsgfQorICAgIC8vdm9pZCBh
ZGRVbml0aWFsaXplZENvZGVCbG9jayhWTSYsIFJlZjxXYXNtOjpQbGFuPik7CisgICAgdm9pZCBm
aW5hbGl6ZUNyZWF0aW9uKFZNJiwgRXhlY1N0YXRlKiwgUmVmPFdhc206OkNvZGVCbG9jaz4mJik7
CiAKICAgICBKU1dlYkFzc2VtYmx5TW9kdWxlKiBtb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX21v
ZHVsZS5nZXQoKTsgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dl
YkFzc2VtYmx5TW9kdWxlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d2FzbS9qcy9KU1dlYkFzc2VtYmx5TW9kdWxlLmNwcAkocmV2aXNpb24gMjE0OTcyKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseU1vZHVsZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlICJXYXNtRm9ybWF0LmgiCiAjaW5j
bHVkZSAiV2FzbU1lbW9yeS5oIgogI2luY2x1ZGUgIldhc21QbGFuLmgiCisjaW5jbHVkZSAiV2Fz
bU1vZHVsZS5oIgogI2luY2x1ZGUgIldlYkFzc2VtYmx5VG9KU0NhbGxlZS5oIgogI2luY2x1ZGUg
PHd0Zi9TdGRMaWJFeHRyYXMuaD4KIApAQCAtNDMsNyArNDQsNyBAQCBuYW1lc3BhY2UgSlNDIHsK
IAogY29uc3QgQ2xhc3NJbmZvIEpTV2ViQXNzZW1ibHlNb2R1bGU6OnNfaW5mbyA9IHsgIldlYkFz
c2VtYmx5Lk1vZHVsZSIsICZCYXNlOjpzX2luZm8sIG51bGxwdHIsIENSRUFURV9NRVRIT0RfVEFC
TEUoSlNXZWJBc3NlbWJseU1vZHVsZSkgfTsKIAotSlNXZWJBc3NlbWJseU1vZHVsZSogSlNXZWJB
c3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1YihWTSYgdm0sIEV4ZWNTdGF0ZSogZXhlYywgU3RydWN0
dXJlKiBzdHJ1Y3R1cmUsIFJlZlB0cjxXYXNtOjpQbGFuPiYmIHBsYW4pCitKU1dlYkFzc2VtYmx5
TW9kdWxlKiBKU1dlYkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdHViKFZNJiB2bSwgRXhlY1N0YXRl
KiBleGVjLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgUmVmPFdhc206OlBsYW4+JiYgcGxhbikKIHsK
ICAgICBBU1NFUlQoIXBsYW4tPmhhc1dvcmsoKSk7CiAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVf
VEhST1dfU0NPUEUodm0pOwpAQCAtNTIsNyArNTMsNyBAQCBKU1dlYkFzc2VtYmx5TW9kdWxlKiBK
U1dlYkFzc2VtYmx5TW9kdWxlCiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAotICAg
IGF1dG8qIG1vZHVsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPEpTV2ViQXNzZW1ibHlN
b2R1bGU+KHZtLmhlYXApKSBKU1dlYkFzc2VtYmx5TW9kdWxlKHZtLCBzdHJ1Y3R1cmUsICpwbGFu
LmdldCgpKTsKKyAgICBhdXRvKiBtb2R1bGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxK
U1dlYkFzc2VtYmx5TW9kdWxlPih2bS5oZWFwKSkgSlNXZWJBc3NlbWJseU1vZHVsZSh2bSwgc3Ry
dWN0dXJlLCBXYXNtOjpNb2R1bGU6OmNyZWF0ZShwbGFuLT50YWtlTW9kdWxlSW5mb3JtYXRpb24o
KSkpOwogICAgIG1vZHVsZS0+ZmluaXNoQ3JlYXRpb24odm0pOwogICAgIHJldHVybiBtb2R1bGU7
CiB9CkBAIC02Miw5ICs2Myw5IEBAIFN0cnVjdHVyZSogSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3Jl
YXRlU3QKICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJv
dG90eXBlLCBUeXBlSW5mbyhPYmplY3RUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CiB9
CiAKLUpTV2ViQXNzZW1ibHlNb2R1bGU6OkpTV2ViQXNzZW1ibHlNb2R1bGUoVk0mIHZtLCBTdHJ1
Y3R1cmUqIHN0cnVjdHVyZSwgV2FzbTo6UGxhbiYgcGxhbikKK0pTV2ViQXNzZW1ibHlNb2R1bGU6
OkpTV2ViQXNzZW1ibHlNb2R1bGUoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgUmVmPFdh
c206Ok1vZHVsZT4mJiBtb2R1bGUpCiAgICAgOiBCYXNlKHZtLCBzdHJ1Y3R1cmUpCi0gICAgLCBt
X21vZHVsZUluZm9ybWF0aW9uKHBsYW4udGFrZU1vZHVsZUluZm9ybWF0aW9uKCkpCisgICAgLCBt
X21vZHVsZShXVEZNb3ZlKG1vZHVsZSkpCiB7CiB9CiAKQEAgLTc1LDcgKzc2LDggQEAgdm9pZCBK
U1dlYkFzc2VtYmx5TW9kdWxlOjpmaW5pc2hDcmVhdGlvbgogCiAgICAgLy8gT24gc3VjY2Vzcywg
YSBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIFtbTW9kdWxl
XV0gc2V0IHRvIHRoZSB2YWxpZGF0ZWQgQXN0Lm1vZHVsZS4KICAgICBTeW1ib2xUYWJsZSogZXhw
b3J0U3ltYm9sVGFibGUgPSBTeW1ib2xUYWJsZTo6Y3JlYXRlKHZtKTsKLSAgICBmb3IgKGF1dG8m
IGV4cCA6IG1fbW9kdWxlSW5mb3JtYXRpb24tPmV4cG9ydHMpIHsKKyAgICBjb25zdCBXYXNtOjpN
b2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5mb3JtYXRpb24gPSBtX21vZHVsZS0+bW9kdWxlSW5m
b3JtYXRpb24oKTsKKyAgICBmb3IgKGF1dG8mIGV4cCA6IG1vZHVsZUluZm9ybWF0aW9uLmV4cG9y
dHMpIHsKICAgICAgICAgYXV0byBvZmZzZXQgPSBleHBvcnRTeW1ib2xUYWJsZS0+dGFrZU5leHRT
Y29wZU9mZnNldChOb0xvY2tpbmdOZWNlc3NhcnkpOwogICAgICAgICBTdHJpbmcgZmllbGQgPSBT
dHJpbmc6OmZyb21VVEY4KGV4cC5maWVsZCk7CiAgICAgICAgIGV4cG9ydFN5bWJvbFRhYmxlLT5z
ZXQoTm9Mb2NraW5nTmVjZXNzYXJ5LCBBdG9taWNTdHJpbmcoZmllbGQpLmltcGwoKSwgU3ltYm9s
VGFibGVFbnRyeShWYXJPZmZzZXQob2Zmc2V0KSkpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vanMvSlNXZWJBc3NlbWJseU1vZHVsZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlNb2R1bGUuaAkocmV2aXNpb24gMjE0
OTcyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseU1vZHVs
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiSlNXZWJBc3Nl
bWJseUNvZGVCbG9jay5oIgogI2luY2x1ZGUgIlVuY29uZGl0aW9uYWxGaW5hbGl6ZXIuaCIKICNp
bmNsdWRlICJXYXNtTW9kdWxlSW5mb3JtYXRpb24uaCIKKyNpbmNsdWRlICJXYXNtTW9kdWxlLmgi
CiAjaW5jbHVkZSA8d3RmL0JhZy5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KIApAQCAtNDks
MTYgKzUwLDE2IEBAIGNsYXNzIEpTV2ViQXNzZW1ibHlNb2R1bGUgOiBwdWJsaWMgSlNEZXMKIHB1
YmxpYzoKICAgICB0eXBlZGVmIEpTRGVzdHJ1Y3RpYmxlT2JqZWN0IEJhc2U7CiAKLSAgICBzdGF0
aWMgSlNXZWJBc3NlbWJseU1vZHVsZSogY3JlYXRlU3R1YihWTSYsIEV4ZWNTdGF0ZSosIFN0cnVj
dHVyZSosIFJlZlB0cjxXYXNtOjpQbGFuPiYmKTsKLSAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVh
dGVTdHJ1Y3R1cmUoVk0mLCBKU0dsb2JhbE9iamVjdCosIEpTVmFsdWUpOwotCiAgICAgREVDTEFS
RV9JTkZPOwogCi0gICAgY29uc3QgV2FzbTo6TW9kdWxlSW5mb3JtYXRpb24mIG1vZHVsZUluZm9y
bWF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9tb2R1bGVJbmZvcm1hdGlvbi5nZXQoKTsgfQorICAg
IHN0YXRpYyBKU1dlYkFzc2VtYmx5TW9kdWxlKiBjcmVhdGVTdHViKFZNJiwgRXhlY1N0YXRlKiwg
U3RydWN0dXJlKiwgUmVmPFdhc206OlBsYW4+JiYpOworICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNy
ZWF0ZVN0cnVjdHVyZShWTSYsIEpTR2xvYmFsT2JqZWN0KiwgSlNWYWx1ZSk7CisKKyAgICBjb25z
dCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5mb3JtYXRpb24oKSBjb25zdCB7IHJl
dHVybiBtX21vZHVsZS0+bW9kdWxlSW5mb3JtYXRpb24oKTsgfQogICAgIFN5bWJvbFRhYmxlKiBl
eHBvcnRTeW1ib2xUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwb3J0U3ltYm9sVGFibGUuZ2V0
KCk7IH0KICAgICBXYXNtOjpTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleEZyb21GdW5jdGlv
bkluZGV4U3BhY2UodW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlKSBjb25zdAogICAgIHsKLSAg
ICAgICAgcmV0dXJuIG1fbW9kdWxlSW5mb3JtYXRpb24tPnNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0
aW9uSW5kZXhTcGFjZShmdW5jdGlvbkluZGV4U3BhY2UpOworICAgICAgICByZXR1cm4gbV9tb2R1
bGUtPnNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0aW9uSW5kZXhTcGFjZShmdW5jdGlvbkluZGV4U3Bh
Y2UpOwogICAgIH0KICAgICBXZWJBc3NlbWJseVRvSlNDYWxsZWUqIGNhbGxlZSgpIGNvbnN0IHsg
cmV0dXJuIG1fY2FsbGVlLmdldCgpOyB9CiAKQEAgLTY2LDE3ICs2NywxOSBAQCBwdWJsaWM6CiAK
ICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1vZHVs
ZUluZm9ybWF0aW9uKCkuc291cmNlOyB9CiAKKyAgICBXYXNtOjpNb2R1bGUmIG1vZHVsZSgpIHsg
cmV0dXJuIG1fbW9kdWxlLmdldCgpOyB9CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIEpT
V2ViQXNzZW1ibHlDb2RlQmxvY2s7CiAKICAgICB2b2lkIHNldENvZGVCbG9jayhWTSYsIFdhc206
Ok1lbW9yeU1vZGUsIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2sqKTsKIAotICAgIEpTV2ViQXNzZW1i
bHlNb2R1bGUoVk0mLCBTdHJ1Y3R1cmUqLCBXYXNtOjpQbGFuJik7CisgICAgSlNXZWJBc3NlbWJs
eU1vZHVsZShWTSYsIFN0cnVjdHVyZSosIFJlZjxXYXNtOjpNb2R1bGU+JiYpOwogICAgIHZvaWQg
ZmluaXNoQ3JlYXRpb24oVk0mKTsKICAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQ2VsbCopOwog
ICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsKIAot
ICAgIFJlZjxXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbj4gbV9tb2R1bGVJbmZvcm1hdGlvbjsKKyAg
ICBSZWY8V2FzbTo6TW9kdWxlPiBtX21vZHVsZTsKICAgICBXcml0ZUJhcnJpZXI8U3ltYm9sVGFi
bGU+IG1fZXhwb3J0U3ltYm9sVGFibGU7CiAgICAgV3JpdGVCYXJyaWVyPEpTV2ViQXNzZW1ibHlD
b2RlQmxvY2s+IG1fY29kZUJsb2Nrc1tXYXNtOjpOdW1iZXJPZk1lbW9yeU1vZGVzXTsKICAgICBX
cml0ZUJhcnJpZXI8V2ViQXNzZW1ibHlUb0pTQ2FsbGVlPiBtX2NhbGxlZTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5RnVuY3Rpb24uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5RnVuY3Rpb24u
Y3BwCShyZXZpc2lvbiAyMTQ5NzIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9X
ZWJBc3NlbWJseUZ1bmN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTU5LDYgKzE1OSw4IEBA
IHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNhbGwKIAogV2ViQXNzZW1ibHlG
dW5jdGlvbiogV2ViQXNzZW1ibHlGdW5jdGlvbjo6Y3JlYXRlKFZNJiB2bSwgSlNHbG9iYWxPYmpl
Y3QqIGdsb2JhbE9iamVjdCwgdW5zaWduZWQgbGVuZ3RoLCBjb25zdCBTdHJpbmcmIG5hbWUsIEpT
V2ViQXNzZW1ibHlJbnN0YW5jZSogaW5zdGFuY2UsIFdhc206OkNhbGxlZSYganNFbnRyeXBvaW50
LCBXYXNtOjpDYWxsZWUmIHdhc21FbnRyeXBvaW50LCBXYXNtOjpTaWduYXR1cmVJbmRleCBzaWdu
YXR1cmVJbmRleCkKIHsKKyAgICBBU1NFUlQoJmpzRW50cnlwb2ludCAhPSAmd2FzbUVudHJ5cG9p
bnQpOworCiAgICAgTmF0aXZlRXhlY3V0YWJsZSogZXhlY3V0YWJsZSA9IHZtLmdldEhvc3RGdW5j
dGlvbihjYWxsV2ViQXNzZW1ibHlGdW5jdGlvbiwgTm9JbnRyaW5zaWMsIGNhbGxIb3N0RnVuY3Rp
b25Bc0NvbnN0cnVjdG9yLCBudWxscHRyLCBuYW1lKTsKICAgICBTdHJ1Y3R1cmUqIHN0cnVjdHVy
ZSA9IGdsb2JhbE9iamVjdC0+d2ViQXNzZW1ibHlGdW5jdGlvblN0cnVjdHVyZSgpOwogICAgIFdl
YkFzc2VtYmx5RnVuY3Rpb24qIGZ1bmN0aW9uID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8
V2ViQXNzZW1ibHlGdW5jdGlvbj4odm0uaGVhcCkpIFdlYkFzc2VtYmx5RnVuY3Rpb24odm0sIGds
b2JhbE9iamVjdCwgc3RydWN0dXJlLCBqc0VudHJ5cG9pbnQsIHdhc21FbnRyeXBvaW50LCBzaWdu
YXR1cmVJbmRleCk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3Nl
bWJseUluc3RhbmNlQ29uc3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5SW5zdGFuY2VDb25zdHJ1Y3Rvci5jcHAJKHJldmlz
aW9uIDIxNDk3MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5
SW5zdGFuY2VDb25zdHJ1Y3Rvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU4LDcgKzU4LDcgQEAg
dXNpbmcgV2FzbTo6UGxhbjsKIAogc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwg
Y29uc3RydWN0SlNXZWJBc3NlbWJseUluc3RhbmNlKEV4ZWNTdGF0ZSogZXhlYykKIHsKLSAgICBh
dXRvJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKICAgICBhdXRv
IHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7CiAKICAgICAvLyBJZiBtb2R1bGVPYmpl
Y3QgaXMgbm90IGEgV2ViQXNzZW1ibHkuTW9kdWxlIGluc3RhbmNlLCBhIFR5cGVFcnJvciBpcyB0
aHJvd24uCkBAIC03OCw2ICs3OCwxMiBAQCBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCBjb25zCiAgICAgSlNXZWJBc3NlbWJseUluc3RhbmNlKiBpbnN0YW5jZSA9IEpTV2ViQXNz
ZW1ibHlJbnN0YW5jZTo6Y3JlYXRlKHZtLCBleGVjLCBtb2R1bGUsIGltcG9ydE9iamVjdCwgaW5z
dGFuY2VTdHJ1Y3R1cmUpOwogICAgIFJFVFVSTl9JRl9FWENFUFRJT04oc2NvcGUsIHsgfSk7CiAK
KyAgICBtb2R1bGUtPm1vZHVsZSgpLmNvbXBpbGVTeW5jKHZtLCBpbnN0YW5jZS0+bWVtb3J5TW9k
ZSgpKTsKKyAgICBpbnN0YW5jZS0+ZmluYWxpemVDcmVhdGlvbih2bSwgZXhlYywgbW9kdWxlLT5t
b2R1bGUoKS5ub25OdWxsQ29kZUJsb2NrKGluc3RhbmNlLT5tZW1vcnlNb2RlKCkpKTsKKyAgICBS
RVRVUk5fSUZfRVhDRVBUSU9OKHNjb3BlLCB7IH0pOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNv
ZGUoaW5zdGFuY2UpOworCisgICAgLyoKICAgICAvLyBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUg
Y2FzZXM6CiAgICAgLy8gMSkgVGhlIGluc3RhbmNlIGFscmVhZHkgaGFzIGFuIGluaXRpYWxpemVk
IENvZGVCbG9jayAocnVubmFibGUpLCBzbyB3ZSBqdXN0IG5lZWQgdG8gZmluYWxpemVDcmVhdGlv
bi4KICAgICAvLyAyKSBUaGUgaW5zdGFuY2UgaGFzIG5vIENvZGVCbG9jaywgc28gd2UgbmVlZCB0
byBtYWtlIG9uZSBhbmQgY29tcGlsZSB0aGUgY29kZSBmb3IgaXQuCkBAIC05NiwxMCArMTAyLDEx
IEBAIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNvbnMKICAgICAgICAgICAg
IHdvcmtsaXN0LmNvbXBsZXRlUGxhblN5bmNocm9ub3VzbHkocGxhbi5nZXQoKSk7CiAgICAgICAg
IH0KICAgICB9Ci0KICAgICBpbnN0YW5jZS0+ZmluYWxpemVDcmVhdGlvbih2bSwgZXhlYyk7CiAg
ICAgUkVUVVJOX0lGX0VYQ0VQVElPTihzY29wZSwgeyB9KTsKICAgICByZXR1cm4gSlNWYWx1ZTo6
ZW5jb2RlKGluc3RhbmNlKTsKKyAgICAqLworCiB9CiAKIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBK
U0NfSE9TVF9DQUxMIGNhbGxKU1dlYkFzc2VtYmx5SW5zdGFuY2UoRXhlY1N0YXRlKiBleGVjKQpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25z
dHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMv
V2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDIxNDk3MikKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3Iu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC03OCw3ICs3OCw3IEBAIEpTVmFsdWUgV2ViQXNzZW1ibHlN
b2R1bGVDb25zdHJ1Y3Rvcjo6Y3IKICAgICBWZWN0b3I8dWludDhfdD4gc291cmNlID0gY3JlYXRl
U291cmNlQnVmZmVyRnJvbVZhbHVlKHZtLCBleGVjLCBidWZmZXIpOwogICAgIFJFVFVSTl9JRl9F
WENFUFRJT04oc2NvcGUsIHsgfSk7CiAKLSAgICBSZWZQdHI8V2FzbTo6UGxhbj4gcGxhbiA9IGFk
b3B0UmVmKG5ldyBXYXNtOjpQbGFuKHZtLCBXVEZNb3ZlKHNvdXJjZSksIFdhc206OlBsYW46OlZh
bGlkYXRpb24sIFdhc206OlBsYW46OmRvbnRGaW5hbGl6ZSkpOworICAgIFJlZjxXYXNtOjpQbGFu
PiBwbGFuID0gYWRvcHRSZWYoKm5ldyBXYXNtOjpQbGFuKHZtLCBXVEZNb3ZlKHNvdXJjZSksIFdh
c206OlBsYW46OlZhbGlkYXRpb24sIFdhc206OlBsYW46OmRvbnRGaW5hbGl6ZSkpOwogICAgIGlm
ICghcGxhbi0+cGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSgpKQogICAgICAgICByZXR1cm4gdGhyb3dF
eGNlcHRpb24oZXhlYywgc2NvcGUsIEpTV2ViQXNzZW1ibHlDb21waWxlRXJyb3I6OmNyZWF0ZShl
eGVjLCB2bSwgZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpLT5XZWJBc3NlbWJseUNvbXBpbGVF
cnJvclN0cnVjdHVyZSgpLCBwbGFuLT5lcnJvck1lc3NhZ2UoKSkpOwogICAgIHJldHVybiBKU1dl
YkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdHViKHZtLCBleGVjLCBzdHJ1Y3R1cmUsIFdURk1vdmUo
cGxhbikpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlQ
cm90b3R5cGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pz
L1dlYkFzc2VtYmx5UHJvdG90eXBlLmNwcAkocmV2aXNpb24gMjE0OTcyKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlQcm90b3R5cGUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC02NSwxMyArNjUsMTIgQEAgY29uc3QgQ2xhc3NJbmZvIFdlYkFzc2VtYmx5UHJvdG90
eXBlOjpzXwogIEBlbmQKICAqLwogCi1zdGF0aWMgRW5jb2RlZEpTVmFsdWUgcmVqZWN0KEV4ZWNT
dGF0ZSogZXhlYywgQ2F0Y2hTY29wZSYgY2F0Y2hTY29wZSwgSlNQcm9taXNlRGVmZXJyZWQqIHBy
b21pc2UpCitzdGF0aWMgdm9pZCByZWplY3QoRXhlY1N0YXRlKiBleGVjLCBDYXRjaFNjb3BlJiBj
YXRjaFNjb3BlLCBKU1Byb21pc2VEZWZlcnJlZCogcHJvbWlzZSkKIHsKICAgICBFeGNlcHRpb24q
IGV4Y2VwdGlvbiA9IGNhdGNoU2NvcGUuZXhjZXB0aW9uKCk7CiAgICAgQVNTRVJUKGV4Y2VwdGlv
bik7CiAgICAgY2F0Y2hTY29wZS5jbGVhckV4Y2VwdGlvbigpOwogICAgIHByb21pc2UtPnJlamVj
dChleGVjLCBleGNlcHRpb24tPnZhbHVlKCkpOwotICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUo
cHJvbWlzZS0+cHJvbWlzZSgpKTsKIH0KIAogc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NU
X0NBTEwgd2ViQXNzZW1ibHlDb21waWxlRnVuYyhFeGVjU3RhdGUqIGV4ZWMpCkBAIC05MCwxMyAr
ODksMTMgQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQQogICAgIGRl
cGVuZGVuY2llcy5hcHBlbmQoU3Ryb25nPEpTQ2VsbD4odm0sIGdsb2JhbE9iamVjdCkpOwogICAg
IHZtLnByb21pc2VEZWZlcnJlZFRpbWVyLT5hZGRQZW5kaW5nUHJvbWlzZShwcm9taXNlLCBXVEZN
b3ZlKGRlcGVuZGVuY2llcykpOwogCi0gICAgUmVmPFBsYW4+IHBsYW4gPSBhZG9wdFJlZigqbmV3
IFBsYW4odm0sIFdURk1vdmUoc291cmNlKSwgUGxhbjo6VmFsaWRhdGlvbiwgW3Byb21pc2UsIGds
b2JhbE9iamVjdF0gKFBsYW4mIHApIG11dGFibGUgewotICAgICAgICBSZWZQdHI8UGxhbj4gcGxh
biA9IG1ha2VSZWYocCk7Ci0gICAgICAgIHAudm0oKS5wcm9taXNlRGVmZXJyZWRUaW1lci0+c2No
ZWR1bGVXb3JrU29vbihwcm9taXNlLCBbcHJvbWlzZSwgZ2xvYmFsT2JqZWN0LCBwbGFuID0gV1RG
TW92ZShwbGFuKV0gKCkgbXV0YWJsZSB7Ci0gICAgICAgICAgICBWTSYgdm0gPSBwbGFuLT52bSgp
OworICAgIFJlZjxQbGFuPiBwbGFuID0gYWRvcHRSZWYoKm5ldyBQbGFuKHZtLCBXVEZNb3ZlKHNv
dXJjZSksIFBsYW46OlZhbGlkYXRpb24sIFtwcm9taXNlLCBnbG9iYWxPYmplY3RdIChWTSYgdm0s
IFBsYW4qIHApIG11dGFibGUgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChwKTsKKyAgICAgICAg
UmVmUHRyPFBsYW4+IHBsYW4gPSBtYWtlUmVmKCpwKTsKKyAgICAgICAgdm0ucHJvbWlzZURlZmVy
cmVkVGltZXItPnNjaGVkdWxlV29ya1Nvb24ocHJvbWlzZSwgW3Byb21pc2UsIGdsb2JhbE9iamVj
dCwgcGxhbiA9IFdURk1vdmUocGxhbiksICZ2bV0gKCkgbXV0YWJsZSB7CiAgICAgICAgICAgICBh
dXRvIHNjb3BlID0gREVDTEFSRV9DQVRDSF9TQ09QRSh2bSk7CiAgICAgICAgICAgICBFeGVjU3Rh
dGUqIGV4ZWMgPSBnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKTsKLSAgICAgICAgICAgIEpTVmFs
dWUgbW9kdWxlID0gSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1Yih2bSwgZXhlYywgZ2xv
YmFsT2JqZWN0LT5XZWJBc3NlbWJseU1vZHVsZVN0cnVjdHVyZSgpLCBXVEZNb3ZlKHBsYW4pKTsK
KyAgICAgICAgICAgIEpTVmFsdWUgbW9kdWxlID0gSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRl
U3R1Yih2bSwgZXhlYywgZ2xvYmFsT2JqZWN0LT5XZWJBc3NlbWJseU1vZHVsZVN0cnVjdHVyZSgp
LCBwbGFuLnJlbGVhc2VOb25OdWxsKCkpOwogICAgICAgICAgICAgaWYgKHNjb3BlLmV4Y2VwdGlv
bigpKSB7CiAgICAgICAgICAgICAgICAgcmVqZWN0KGV4ZWMsIHNjb3BlLCBwcm9taXNlKTsKICAg
ICAgICAgICAgICAgICByZXR1cm47CkBAIC0xMTEsMTYgKzExMCwxNiBAQCBzdGF0aWMgRW5jb2Rl
ZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCB3ZWJBCiB9CiAKIGVudW0gY2xhc3MgUmVzb2x2ZSB7IFdp
dGhJbnN0YW5jZSwgV2l0aE1vZHVsZUFuZEluc3RhbmNlIH07Ci1zdGF0aWMgdm9pZCByZXNvbHZl
KFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjLCBKU1Byb21pc2VEZWZlcnJlZCogcHJvbWlzZSwgSlNX
ZWJBc3NlbWJseUluc3RhbmNlKiBpbnN0YW5jZSwgSlNXZWJBc3NlbWJseU1vZHVsZSogbW9kdWxl
LCBSZXNvbHZlIGVudHJpZXMpCitzdGF0aWMgdm9pZCByZXNvbHZlKFZNJiB2bSwgRXhlY1N0YXRl
KiBleGVjLCBKU1Byb21pc2VEZWZlcnJlZCogcHJvbWlzZSwgSlNXZWJBc3NlbWJseUluc3RhbmNl
KiBpbnN0YW5jZSwgSlNXZWJBc3NlbWJseU1vZHVsZSogbW9kdWxlLCBSZXNvbHZlIHJlc29sdmVL
aW5kKQogewogICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX0NBVENIX1NDT1BFKHZtKTsKLSAgICBp
bnN0YW5jZS0+ZmluYWxpemVDcmVhdGlvbih2bSwgZXhlYyk7CisgICAgaW5zdGFuY2UtPmZpbmFs
aXplQ3JlYXRpb24odm0sIGV4ZWMsIG1vZHVsZS0+bW9kdWxlKCkubm9uTnVsbENvZGVCbG9jayhp
bnN0YW5jZS0+bWVtb3J5TW9kZSgpKSk7CiAgICAgaWYgKHNjb3BlLmV4Y2VwdGlvbigpKSB7CiAg
ICAgICAgIHJlamVjdChleGVjLCBzY29wZSwgcHJvbWlzZSk7CiAgICAgICAgIHJldHVybjsKICAg
ICB9CiAKLSAgICBpZiAoZW50cmllcyA9PSBSZXNvbHZlOjpXaXRoSW5zdGFuY2UpCisgICAgaWYg
KHJlc29sdmVLaW5kID09IFJlc29sdmU6OldpdGhJbnN0YW5jZSkKICAgICAgICAgcHJvbWlzZS0+
cmVzb2x2ZShleGVjLCBpbnN0YW5jZSk7CiAgICAgZWxzZSB7CiAgICAgICAgIEpTT2JqZWN0KiBy
ZXN1bHQgPSBjb25zdHJ1Y3RFbXB0eU9iamVjdChleGVjKTsKQEAgLTEzMCw3ICsxMjksNyBAQCBz
dGF0aWMgdm9pZCByZXNvbHZlKFZNJiB2bSwgRXhlY1N0YXRlKiBlCiAgICAgfQogfQogCi1zdGF0
aWMgdm9pZCBpbnN0YW50aWF0ZShWTSYgdm0sIEV4ZWNTdGF0ZSogZXhlYywgSlNQcm9taXNlRGVm
ZXJyZWQqIHByb21pc2UsIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1vZHVsZSwgSlNPYmplY3QqIGlt
cG9ydE9iamVjdCwgUmVzb2x2ZSBlbnRyaWVzKQorc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoVk0m
IHZtLCBFeGVjU3RhdGUqIGV4ZWMsIEpTUHJvbWlzZURlZmVycmVkKiBwcm9taXNlLCBKU1dlYkFz
c2VtYmx5TW9kdWxlKiBtb2R1bGUsIEpTT2JqZWN0KiBpbXBvcnRPYmplY3QsIFJlc29sdmUgcmVz
b2x2ZUtpbmQpCiB7CiAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfQ0FUQ0hfU0NPUEUodm0pOwog
ICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIHBvdGVudGlhbGx5IHJlY29tcGlsaW5nIGEgbW9kdWxl
LiBXZSBmaXJzdCBnYXRoZXIgYWxsIHRoZSBpbXBvcnQvbWVtb3J5IGluZm9ybWF0aW9uIHByaW9y
IHRvIGNvbXBpbGluZyBjb2RlLgpAQCAtMTQwLDYgKzEzOSwxOSBAQCBzdGF0aWMgdm9pZCBpbnN0
YW50aWF0ZShWTSYgdm0sIEV4ZWNTdGF0CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBW
ZWN0b3I8U3Ryb25nPEpTQ2VsbD4+IGRlcGVuZGVuY2llczsKKyAgICAvLyBUaGUgaW5zdGFuY2Ug
a2VlcHMgdGhlIG1vZHVsZSBhbGl2ZS4KKyAgICBkZXBlbmRlbmNpZXMuYXBwZW5kKFN0cm9uZzxK
U0NlbGw+KHZtLCBpbnN0YW5jZSkpOworICAgIHZtLnByb21pc2VEZWZlcnJlZFRpbWVyLT5hZGRQ
ZW5kaW5nUHJvbWlzZShwcm9taXNlLCBXVEZNb3ZlKGRlcGVuZGVuY2llcykpOworICAgIC8vIE5v
dGU6IFRoaXMgY29tcGxldGlvbiB0YXNrIG1heSBvciBtYXkgbm90IGdldCBjYWxsZWQgaW1tZWRp
YXRlbHkuCisgICAgbW9kdWxlLT5tb2R1bGUoKS5jb21waWxlQXN5bmModm0sIGluc3RhbmNlLT5t
ZW1vcnlNb2RlKCksIFtwcm9taXNlLCBpbnN0YW5jZSwgbW9kdWxlLCByZXNvbHZlS2luZF0gKFZN
JiB2bSwgUGxhbiopIHsKKyAgICAgICAgdm0ucHJvbWlzZURlZmVycmVkVGltZXItPnNjaGVkdWxl
V29ya1Nvb24ocHJvbWlzZSwgW3Byb21pc2UsIGluc3RhbmNlLCBtb2R1bGUsIHJlc29sdmVLaW5k
LCAmdm1dICgpIHsKKyAgICAgICAgICAgIEV4ZWNTdGF0ZSogZXhlYyA9IGluc3RhbmNlLT5nbG9i
YWxPYmplY3QoKS0+Z2xvYmFsRXhlYygpOworICAgICAgICAgICAgcmVzb2x2ZSh2bSwgZXhlYywg
cHJvbWlzZSwgaW5zdGFuY2UsIG1vZHVsZSwgcmVzb2x2ZUtpbmQpOworICAgICAgICB9KTsKKyAg
ICB9KTsKKworICAgIC8qCiAgICAgLy8gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNhc2VzOgog
ICAgIC8vIDEpIFRoZSBpbnN0YW5jZSBhbHJlYWR5IGhhcyBhbiBpbml0aWFsaXplZCBDb2RlQmxv
Y2ssIHNvIHdlIGhhdmUgbm8gbW9yZSB3b3JrIHRvIGRvLgogICAgIC8vIDIpIFRoZSBpbnN0YW5j
ZSBoYXMgbm8gQ29kZUJsb2NrLCBzbyB3ZSBuZWVkIHRvIG1ha2Ugb25lIGFuZCBjb21waWxlIHRo
ZSBjb2RlIGZvciBpdC4KQEAgLTE4MSw2ICsxOTMsNyBAQCBzdGF0aWMgdm9pZCBpbnN0YW50aWF0
ZShWTSYgdm0sIEV4ZWNTdGF0CiAgICAgaW5zdGFuY2UtPmFkZFVuaXRpYWxpemVkQ29kZUJsb2Nr
KHZtLCBwbGFuLmNvcHlSZWYoKSk7CiAgICAgcGxhbi0+c2V0TW9kZShpbnN0YW5jZS0+bWVtb3J5
TW9kZSgpKTsKICAgICBXYXNtOjplbnN1cmVXb3JrbGlzdCgpLmVucXVldWUoV1RGTW92ZShwbGFu
KSk7CisgICAgKi8KIH0KIAogc3RhdGljIHZvaWQgY29tcGlsZUFuZEluc3RhbnRpYXRlKFZNJiB2
bSwgRXhlY1N0YXRlKiBleGVjLCBKU1Byb21pc2VEZWZlcnJlZCogcHJvbWlzZSwgSlNWYWx1ZSBi
dWZmZXIsIEpTT2JqZWN0KiBpbXBvcnRPYmplY3QpCkBAIC0xOTUsMTMgKzIwOCwxMyBAQCBzdGF0
aWMgdm9pZCBjb21waWxlQW5kSW5zdGFudGlhdGUoVk0mIHZtCiAgICAgZGVwZW5kZW5jaWVzLmFw
cGVuZChTdHJvbmc8SlNDZWxsPih2bSwgaW1wb3J0T2JqZWN0KSk7CiAgICAgdm0ucHJvbWlzZURl
ZmVycmVkVGltZXItPmFkZFBlbmRpbmdQcm9taXNlKHByb21pc2UsIFdURk1vdmUoZGVwZW5kZW5j
aWVzKSk7CiAKLSAgICBSZWY8UGxhbj4gcGxhbiA9IGFkb3B0UmVmKCpuZXcgUGxhbih2bSwgV1RG
TW92ZShzb3VyY2UpLCBQbGFuOjpWYWxpZGF0aW9uLCBbcHJvbWlzZSwgaW1wb3J0T2JqZWN0LCBn
bG9iYWxPYmplY3RdIChQbGFuJiBwKSBtdXRhYmxlIHsKLSAgICAgICAgUmVmUHRyPFBsYW4+IHBs
YW4gPSBtYWtlUmVmKHApOwotICAgICAgICBwLnZtKCkucHJvbWlzZURlZmVycmVkVGltZXItPnNj
aGVkdWxlV29ya1Nvb24ocHJvbWlzZSwgW3Byb21pc2UsIGltcG9ydE9iamVjdCwgZ2xvYmFsT2Jq
ZWN0LCBwbGFuID0gV1RGTW92ZShwbGFuKV0gKCkgbXV0YWJsZSB7Ci0gICAgICAgICAgICBWTSYg
dm0gPSBwbGFuLT52bSgpOworICAgIFJlZjxQbGFuPiBwbGFuID0gYWRvcHRSZWYoKm5ldyBQbGFu
KHZtLCBXVEZNb3ZlKHNvdXJjZSksIFBsYW46OlZhbGlkYXRpb24sIFtwcm9taXNlLCBpbXBvcnRP
YmplY3QsIGdsb2JhbE9iamVjdF0gKFZNJiB2bSwgUGxhbiogcCkgbXV0YWJsZSB7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKHApOworICAgICAgICBSZWZQdHI8UGxhbj4gcGxhbiA9IG1ha2VSZWYo
KnApOworICAgICAgICB2bS5wcm9taXNlRGVmZXJyZWRUaW1lci0+c2NoZWR1bGVXb3JrU29vbihw
cm9taXNlLCBbcHJvbWlzZSwgaW1wb3J0T2JqZWN0LCBnbG9iYWxPYmplY3QsIHBsYW4gPSBXVEZN
b3ZlKHBsYW4pLCAmdm1dICgpIG11dGFibGUgewogICAgICAgICAgICAgYXV0byBzY29wZSA9IERF
Q0xBUkVfQ0FUQ0hfU0NPUEUodm0pOwogICAgICAgICAgICAgRXhlY1N0YXRlKiBleGVjID0gZ2xv
YmFsT2JqZWN0LT5nbG9iYWxFeGVjKCk7Ci0gICAgICAgICAgICBKU1dlYkFzc2VtYmx5TW9kdWxl
KiBtb2R1bGUgPSBKU1dlYkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdHViKHZtLCBleGVjLCBnbG9i
YWxPYmplY3QtPldlYkFzc2VtYmx5TW9kdWxlU3RydWN0dXJlKCksIHBsYW4uY29weVJlZigpKTsK
KyAgICAgICAgICAgIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1vZHVsZSA9IEpTV2ViQXNzZW1ibHlN
b2R1bGU6OmNyZWF0ZVN0dWIodm0sIGV4ZWMsIGdsb2JhbE9iamVjdC0+V2ViQXNzZW1ibHlNb2R1
bGVTdHJ1Y3R1cmUoKSwgcGxhbi5yZWxlYXNlTm9uTnVsbCgpKTsKICAgICAgICAgICAgIGlmIChz
Y29wZS5leGNlcHRpb24oKSkgewogICAgICAgICAgICAgICAgIHJlamVjdChleGVjLCBzY29wZSwg
cHJvbWlzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>306433</attachid>
            <date>2017-04-06 15:52:45 -0700</date>
            <delta_ts>2017-04-07 02:34:37 -0700</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>70015</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjE1MDYyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyNyBA
QAorMjAxNy0wNC0wNiAgU2FhbSBCYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KKworICAgICAg
ICBXZWJBc3NlbWJseTogTWFrZSB0byBhIGNvbXBpbGF0aW9uIEFQSSB0aGF0IGFsbG93cyBmb3Ig
bXVsdGktVk0gY29uY3VycmVudCBjb21waWxhdGlvbnMgb2YgV2FzbSBNb2R1bGVzCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzA0ODgKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGFkZHMg
YSBjbGFzcyBjYWxsZWQgV2FzbTo6TW9kdWxlLiBJdCBjb250YWlucyB0aGUgYml0cyBmcm9tCisg
ICAgICAgIEpTV2ViQXNzZW1ibHlNb2R1bGUgdGhhdCB3ZXJlIG5vdCBWTSBzcGVjaWZpYy4gSlNX
ZWJBc3NlbWJseU1vZHVsZQorICAgICAgICBub3cgaGFzIGEgUmVmPFdhc206Ok1vZHVsZT4uIFNp
bWlsYXJseSwgdGhlcmUgaXMgbm93IGEgV2FzbTo6Q29kZUJsb2NrLAorICAgICAgICB3aGljaCBv
d25zIHRoZSBub24tVk0tc3BlY2lmaWMgYml0cyB0aGF0IEpTV2ViQXNzZW1ibHlDb2RlQmxvY2sg
dXNlZAorICAgICAgICB0byBvd24uCisgICAgICAgIAorICAgICAgICBUaGlzIHBhdGNoIGFsc28g
c2ltcGxpZmllcyBob3cgd2UgdmVyaWZ5IGFuZCBjb21waWxlIGNvZGUuIFdhc206Ok1vZHVsZQor
ICAgICAgICBub3cgaGFzIGFuIEFQSSBmb3IgYm90aCBzeW5jL2FzeW5jIHZhbGlkYXRpb24gYW5k
IGNvbXBpbGF0aW9uLiBUaGlzCisgICAgICAgIEFQSSBhYnN0cmFjdHMgYXdheSBob3cgV2FzbTo6
UGxhbiB3b3Jrcy4KKyAgICAgICAgCisgICAgICAgIFRoaXMgaXMgaG9wZWZ1bGx5IHRoZSBsYXN0
IHBhdGNoIG5lZWRlZCBiZWZvcmUgd2UgY2FuIGltcGxlbWVudAorICAgICAgICB3aW5kb3cucG9z
dE1lc3NhZ2UgZm9yIGEgSlNXZWJBc3NlbWJseU1vZHVsZS4gSSB0aGluayBhbGwgdGhhdCdzCisg
ICAgICAgIG5lZWRlZCBub3cgdG8gaW1wbGVtZW50IHBvc3RNZXNzYWdlIGlzIHNpbXBseSBjcmVh
dGluZyBhIG5ldworICAgICAgICBKU1dlYkFzc2VtYmx5TW9kdWxlIHdpdGggdGhlIHVuZGVybHlp
bmcgV2FzbTo6TW9kdWxlLgorICAgICAgICAKKyAgICAgICAgVGhpcyBwYXRjaCBpcyBuZXV0cmFs
IG9uIFdhc21CZW5jaC4KKyAgICAgICAgCisgICAgICAgIEZpbmFsbHksIHRoaXMgcGF0Y2ggY2hh
bmdlcyB0aGUgcHJvbWlzZSBkZWZlcnJlZCB0aW1lciB0bworICAgICAgICBhbGxvdyBmb3IgbmV3
IHRhc2tzIHRvIGJlIGFkZGVkIHdoaWxlIHdlJ3JlIGV4ZWN1dGluZworICAgICAgICBhIHRhc2su
IEJlZm9yZSwgd2UnZCBkZWFkbG9jayBpZiB0aGlzIGhhcHBlbmVkLgorCisgICAgICAgICogQ01h
a2VMaXN0cy50eHQ6CisgICAgICAgICogSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvajoKKyAgICAgICAgKiBydW50aW1lL1Byb21pc2VEZWZlcnJlZFRpbWVyLmNwcDoKKyAg
ICAgICAgKEpTQzo6UHJvbWlzZURlZmVycmVkVGltZXI6OmRvV29yayk6CisgICAgICAgIChKU0M6
OlByb21pc2VEZWZlcnJlZFRpbWVyOjpzY2hlZHVsZVdvcmtTb29uKToKKyAgICAgICAgKiBydW50
aW1lL1Byb21pc2VEZWZlcnJlZFRpbWVyLmg6CisgICAgICAgICogd2FzbS9XYXNtQjNJUkdlbmVy
YXRvci5jcHA6CisgICAgICAgICogd2FzbS9XYXNtQmluZGluZy5jcHA6CisgICAgICAgIChKU0M6
Oldhc206Ondhc21Ub0pzKToKKyAgICAgICAgKEpTQzo6V2FzbTo6d2FzbVRvV2FzbSk6CisgICAg
ICAgIChKU0M6Oldhc206OmV4aXRTdHViR2VuZXJhdG9yKTogRGVsZXRlZC4KKyAgICAgICAgKiB3
YXNtL1dhc21CaW5kaW5nLmg6CisgICAgICAgICogd2FzbS9XYXNtTW9kdWxlLmNwcDogQWRkZWQu
CisgICAgICAgIChKU0M6Oldhc206OkNvZGVCbG9jazo6Q29kZUJsb2NrKToKKyAgICAgICAgKEpT
Qzo6V2FzbTo6Q29kZUJsb2NrOjp3YWl0VW50aWxGaW5pc2hlZCk6CisgICAgICAgIChKU0M6Oldh
c206OkNvZGVCbG9jazo6Y29tcGlsZUFzeW5jKToKKyAgICAgICAgKEpTQzo6V2FzbTo6Q29kZUJs
b2NrOjppc1NhZmVUb1J1bik6CisgICAgICAgIChKU0M6Oldhc206Ok1vZHVsZTo6TW9kdWxlKToK
KyAgICAgICAgKEpTQzo6V2FzbTo6bWFrZVZhbGlkYXRpb25SZXN1bHQpOgorICAgICAgICAoSlND
OjpXYXNtOjpNb2R1bGU6OnZhbGlkYXRlU3luY0ltcGwpOgorICAgICAgICAoSlNDOjpXYXNtOjpN
b2R1bGU6OmNvbXBpbGVTeW5jKToKKyAgICAgICAgKEpTQzo6V2FzbTo6TW9kdWxlOjptYWtlVmFs
aWRhdGlvbkNhbGxiYWNrKToKKyAgICAgICAgKEpTQzo6V2FzbTo6TW9kdWxlOjpjb21waWxlQXN5
bmMpOgorICAgICAgICAqIHdhc20vV2FzbU1vZHVsZS5oOiBBZGRlZC4KKyAgICAgICAgKEpTQzo6
V2FzbTo6Q29kZUJsb2NrOjpjcmVhdGUpOgorICAgICAgICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6
OmNvbXBpbGF0aW9uRmluaXNoZWQpOgorICAgICAgICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6OnJ1
bm5hYmxlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6Q29kZUJsb2NrOjplcnJvck1lc3NhZ2UpOgor
ICAgICAgICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6OmZ1bmN0aW9uSW1wb3J0Q291bnQpOgorICAg
ICAgICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6OmpzRW50cnlwb2ludENhbGxlZUZyb21GdW5jdGlv
bkluZGV4U3BhY2UpOgorICAgICAgICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6Ondhc21FbnRyeXBv
aW50Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSk6CisgICAgICAgIChKU0M6Oldhc206Ok1v
ZHVsZTo6Y3JlYXRlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6TW9kdWxlOjp2YWxpZGF0ZVN5bmMp
OgorICAgICAgICAoSlNDOjpXYXNtOjpNb2R1bGU6OnZhbGlkYXRlQXN5bmMpOgorICAgICAgICAo
SlNDOjpXYXNtOjpNb2R1bGU6OnNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSk6
CisgICAgICAgIChKU0M6Oldhc206Ok1vZHVsZTo6bW9kdWxlSW5mb3JtYXRpb24pOgorICAgICAg
ICAoSlNDOjpXYXNtOjpNb2R1bGU6Om5vbk51bGxDb2RlQmxvY2spOgorICAgICAgICAqIHdhc20v
V2FzbVBsYW4uY3BwOgorICAgICAgICAoSlNDOjpXYXNtOjpQbGFuOjpQbGFuKToKKyAgICAgICAg
KEpTQzo6V2FzbTo6UGxhbjo6YWRkQ29tcGxldGlvblRhc2spOgorICAgICAgICAoSlNDOjpXYXNt
OjpQbGFuOjpwcmVwYXJlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6Y29tcGlsZUZ1bmN0
aW9ucyk6CisgICAgICAgIChKU0M6Oldhc206OlBsYW46OmNvbXBsZXRlKToKKyAgICAgICAgKEpT
Qzo6V2FzbTo6UGxhbjo6dHJ5UmVtb3ZlVk1BbmRDYW5jZWxJZkxhc3QpOgorICAgICAgICAoSlND
OjpXYXNtOjpQbGFuOjpjYW5jZWwpOiBEZWxldGVkLgorICAgICAgICAqIHdhc20vV2FzbVBsYW4u
aDoKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6ZG9udEZpbmFsaXplKToKKyAgICAgICAgKEpT
Qzo6V2FzbTo6UGxhbjo6dGFrZVdhc21Ub1dhc21FeGl0U3R1YnMpOgorICAgICAgICAoSlNDOjpX
YXNtOjpQbGFuOjptb2RlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6dGFrZVdhc21FeGl0
U3R1YnMpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpXYXNtOjpQbGFuOjp2bSk6IERlbGV0ZWQu
CisgICAgICAgICogd2FzbS9XYXNtV29ya2xpc3QuY3BwOgorICAgICAgICAoSlNDOjpXYXNtOjpX
b3JrbGlzdDo6c3RvcEFsbFBsYW5zRm9yVk0pOgorICAgICAgICAqIHdhc20vanMvSlNXZWJBc3Nl
bWJseUNvZGVCbG9jay5jcHA6CisgICAgICAgIChKU0M6OkpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6
OkpTV2ViQXNzZW1ibHlDb2RlQmxvY2spOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5Q29k
ZUJsb2NrOjppc1NhZmVUb1J1bik6CisgICAgICAgIChKU0M6OkpTV2ViQXNzZW1ibHlDb2RlQmxv
Y2s6OmluaXRpYWxpemUpOiBEZWxldGVkLgorICAgICAgICAqIHdhc20vanMvSlNXZWJBc3NlbWJs
eUNvZGVCbG9jay5oOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpjcmVh
dGUpOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpmdW5jdGlvbkltcG9y
dENvdW50KToKKyAgICAgICAgKEpTQzo6SlNXZWJBc3NlbWJseUNvZGVCbG9jazo6anNFbnRyeXBv
aW50Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSk6CisgICAgICAgIChKU0M6OkpTV2ViQXNz
ZW1ibHlDb2RlQmxvY2s6Ondhc21FbnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFj
ZSk6CisgICAgICAgIChKU0M6OkpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6Ondhc21Ub0pzQ2FsbFN0
dWJGb3JJbXBvcnQpOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjptb2Rl
KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6SlNXZWJBc3NlbWJseUNvZGVCbG9jazo6aW5pdGlh
bGl6ZWQpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpw
bGFuKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6SlNXZWJBc3NlbWJseUNvZGVCbG9jazo6cnVu
bmFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpl
cnJvck1lc3NhZ2UpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5Q29kZUJs
b2NrOjpzZXRKU0VudHJ5cG9pbnRDYWxsZWUpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpKU1dl
YkFzc2VtYmx5Q29kZUJsb2NrOjpzZXRXYXNtRW50cnlwb2ludENhbGxlZSk6IERlbGV0ZWQuCisg
ICAgICAgICogd2FzbS9qcy9KU1dlYkFzc2VtYmx5SW5zdGFuY2UuY3BwOgorICAgICAgICAoSlND
OjpKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmZpbmFsaXplQ3JlYXRpb24pOgorICAgICAgICAoSlND
OjpKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmFkZFVuaXRpYWxpemVkQ29kZUJsb2NrKTogRGVsZXRl
ZC4KKyAgICAgICAgKiB3YXNtL2pzL0pTV2ViQXNzZW1ibHlJbnN0YW5jZS5oOgorICAgICAgICAo
SlNDOjpKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmluaXRpYWxpemVkKTogRGVsZXRlZC4KKyAgICAg
ICAgKiB3YXNtL2pzL0pTV2ViQXNzZW1ibHlNb2R1bGUuY3BwOgorICAgICAgICAoSlNDOjpKU1dl
YkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdHViKToKKyAgICAgICAgKEpTQzo6SlNXZWJBc3NlbWJs
eU1vZHVsZTo6SlNXZWJBc3NlbWJseU1vZHVsZSk6CisgICAgICAgIChKU0M6OkpTV2ViQXNzZW1i
bHlNb2R1bGU6OmZpbmlzaENyZWF0aW9uKToKKyAgICAgICAgKiB3YXNtL2pzL0pTV2ViQXNzZW1i
bHlNb2R1bGUuaDoKKyAgICAgICAgKEpTQzo6SlNXZWJBc3NlbWJseU1vZHVsZTo6bW9kdWxlSW5m
b3JtYXRpb24pOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5TW9kdWxlOjpzaWduYXR1cmVJ
bmRleEZyb21GdW5jdGlvbkluZGV4U3BhY2UpOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5
TW9kdWxlOjptb2R1bGUpOgorICAgICAgICAqIHdhc20vanMvV2ViQXNzZW1ibHlGdW5jdGlvbi5j
cHA6CisgICAgICAgIChKU0M6OldlYkFzc2VtYmx5RnVuY3Rpb246OmNyZWF0ZSk6CisgICAgICAg
ICogd2FzbS9qcy9XZWJBc3NlbWJseUluc3RhbmNlQ29uc3RydWN0b3IuY3BwOgorICAgICAgICAo
SlNDOjpjb25zdHJ1Y3RKU1dlYkFzc2VtYmx5SW5zdGFuY2UpOgorICAgICAgICAqIHdhc20vanMv
V2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHA6CisgICAgICAgIChKU0M6OldlYkFzc2Vt
Ymx5TW9kdWxlQ29uc3RydWN0b3I6OmNyZWF0ZU1vZHVsZSk6CisgICAgICAgICogd2FzbS9qcy9X
ZWJBc3NlbWJseVByb3RvdHlwZS5jcHA6CisgICAgICAgIChKU0M6OnJlamVjdCk6CisgICAgICAg
IChKU0M6OndlYkFzc2VtYmx5Q29tcGlsZUZ1bmMpOgorICAgICAgICAoSlNDOjpyZXNvbHZlKToK
KyAgICAgICAgKEpTQzo6aW5zdGFudGlhdGUpOgorICAgICAgICAoSlNDOjpjb21waWxlQW5kSW5z
dGFudGlhdGUpOgorCiAyMDE3LTA0LTA2ICBKb3NlcGggUGVjb3Jhcm8gIDxwZWNvcmFyb0BhcHBs
ZS5jb20+CiAKICAgICAgICAgV2ViIEluc3BlY3RvcjogU2hvdyBhbGwgaGVhZGVycyBpbiB0aGUg
UmVxdWVzdCBIZWFkZXJzIHNlY3Rpb24gb2YgdGhlIFJlc291cmNlIGRldGFpbHMgc2lkZWJhcgpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAkocmV2aXNpb24gMjE1MDU0KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0CSh3b3JraW5nIGNvcHkpCkBA
IC05NDMsNiArOTQzLDcgQEAgc2V0KEphdmFTY3JpcHRDb3JlX1NPVVJDRVMKICAgICB3YXNtL1dh
c21Gb3JtYXQuY3BwCiAgICAgd2FzbS9XYXNtTWVtb3J5LmNwcAogICAgIHdhc20vV2FzbU1lbW9y
eUluZm9ybWF0aW9uLmNwcAorICAgIHdhc20vV2FzbU1vZHVsZS5jcHAKICAgICB3YXNtL1dhc21N
b2R1bGVJbmZvcm1hdGlvbi5jcHAKICAgICB3YXNtL1dhc21Nb2R1bGVQYXJzZXIuY3BwCiAgICAg
d2FzbS9XYXNtUGFnZUNvdW50LmNwcApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFT
Y3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJ
KHJldmlzaW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0xNDkwLDYgKzE0
OTAsOCBAQAogCQk3MkFBRjdDRDFEMEQzMUIzMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0
ZXJGdW5jdGlvbi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSA3MkFBRjdDQjFEMEQzMThCMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5j
dGlvbi5jcHAgKi87IH07CiAJCTcyQUFGN0NFMUQwRDMxQjMwMDVFNjBCRSAvKiBKU0N1c3RvbUdl
dHRlclNldHRlckZ1bmN0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSA3MkFBRjdDQzFEMEQzMThCMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0
ZXJGdW5jdGlvbi5oICovOyB9OwogCQk3ODI3NEQ4RTRDNEQ0RkNEOUExREM2RTYgLyogVGVtcGxh
dGVSZWdpc3RyeUtleS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBCREI0QjVFMDk5Q0Q0QzFCQjNDMUNGMDUgLyogVGVtcGxhdGVSZWdpc3RyeUtleS5j
cHAgKi87IH07CisJCTc5MDA4MTM4MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxlLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5MDA4MTM2MUU5
NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxlLmNwcCAqLzsgfTsKKwkJNzkwMDgxMzkxRTk1QThF
QzAwNTJEN0NEIC8qIFdhc21Nb2R1bGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDc5MDA4MTM3MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxlLmgg
Ki87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJNzkwNUJC
NjgxRDEyMDUwRTAwMTlGRTU3IC8qIElubGluZUFjY2Vzcy5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTA1QkI2NjFEMTIwNTBFMDAxOUZFNTcgLyog
SW5saW5lQWNjZXNzLmNwcCAqLzsgfTsKIAkJNzkwNUJCNjkxRDEyMDUwRTAwMTlGRTU3IC8qIElu
bGluZUFjY2Vzcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gNzkwNUJCNjcxRDEyMDUwRTAwMTlGRTU3IC8qIElubGluZUFjY2Vzcy5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5MTYwREJEMUM4RTNFQzgw
MDhDMDg1QSAvKiBQcm94eVJldm9rZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA3OTE2MERCQjFDOEUzRUM4MDA4QzA4NUEgLyogUHJveHlSZXZva2Uu
Y3BwICovOyB9OwpAQCAtNDA0Myw2ICs0MDQ1LDggQEAKIAkJNzJBQUY3Q0IxRDBEMzE4QjAwNUU2
MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5jdGlvbi5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTcyQUFGN0NDMUQwRDMxOEIwMDVFNjBCRSAvKiBK
U0N1c3RvbUdldHRlclNldHRlckZ1bmN0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJNzdCMjVDQjJDMzA5NEE5MkEzOEUxREIzIC8qIEpTTW9kdWxlTG9hZGVyLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTTW9kdWxlTG9hZGVyLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTc5MDA4MTM2MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNt
TW9kdWxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFdhc21Nb2R1
bGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk3OTAwODEzNzFFOTVBOEVDMDA1
MkQ3Q0QgLyogV2FzbU1vZHVsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBX
YXNtTW9kdWxlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5MDVCQjY2MUQxMjA1
MEUwMDE5RkU1NyAvKiBJbmxpbmVBY2Nlc3MuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gSW5saW5lQWNjZXNzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJNzkwNUJCNjcxRDEyMDUwRTAwMTlGRTU3IC8qIElubGluZUFjY2Vzcy5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBJbmxpbmVBY2Nlc3MuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJNzkxNjBEQkIxQzhFM0VDODAwOEMwODVBIC8qIFByb3h5UmV2b2tlLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFByb3h5UmV2b2tlLmNwcDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTYzMjcsNiArNjMzMSw4IEBACiAJCQkJQUQyRkND
MzIxREM0MDQ1MzAwQjNFNzM2IC8qIFdhc21Gb3JtYXQuY3BwICovLAogCQkJCTdCQzU0N0QyMUI2
OTU5OUIwMDk1OUI1OCAvKiBXYXNtRm9ybWF0LmggKi8sCiAJCQkJNTNGNDBFOEExRDU5MDFCQjAw
OTlBMUI2IC8qIFdhc21GdW5jdGlvblBhcnNlci5oICovLAorCQkJCTc5MDA4MTM2MUU5NUE4RUMw
MDUyRDdDRCAvKiBXYXNtTW9kdWxlLmNwcCAqLywKKwkJCQk3OTAwODEzNzFFOTVBOEVDMDA1MkQ3
Q0QgLyogV2FzbU1vZHVsZS5oICovLAogCQkJCTUzNTU1NzE1MUQ5REZBMzIwMDZENTgzQiAvKiBX
YXNtTWVtb3J5LmNwcCAqLywKIAkJCQk1MzU1NTcxMzFEOUQ5RUE1MDA2RDU4M0IgLyogV2FzbU1l
bW9yeS5oICovLAogCQkJCTc5Qjc1OTcxMURGQTRDNjAwMDUyMTc0QyAvKiBXYXNtTWVtb3J5SW5m
b3JtYXRpb24uY3BwICovLApAQCAtODkyMiw2ICs4OTI4LDcgQEAKIAkJCQlBNThDMDI0MjE4RTRB
NDFBMDAwMzJCQzUgLyogSlNDb250ZXh0UHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkMx
OEM0MUUwRTE2RjVDRDAwQjM0NDYwIC8qIEpTQ29udGV4dFJlZi5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkJQTVFQTcwRUUxOUY1QjVDNDAwOThGNUVDIC8qIEpTQ29udGV4dFJlZkluc3BlY3RvclN1cHBv
cnQuaCBpbiBIZWFkZXJzICovLAorCQkJCTc5MDA4MTM5MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNt
TW9kdWxlLmggaW4gSGVhZGVycyAqLywKIAkJCQlBNUQyRTY2NTE5NUUxNzQwMDBBNTE4RTcgLyog
SlNDb250ZXh0UmVmSW50ZXJuYWwuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGRjRCNEM3MUU4ODkz
QzUwMERCQkU4NiAvKiBBaXJDRkcuaCBpbiBIZWFkZXJzICovLAogCQkJCTE0OENEMUQ4MTA4Q0Y5
MDIwMDgxNjNDNiAvKiBKU0NvbnRleHRSZWZQcml2YXRlLmggaW4gSGVhZGVycyAqLywKQEAgLTEw
MzY2LDYgKzEwMzczLDcgQEAKIAkJCQkwRkIxMDU4NTE2NzU0ODBGMDBGOEFCNkUgLyogRXhpdEtp
bmQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEY1NTEzQTgxRDVBNjhDRDAwQzMyQkQ4IC8qIEZy
ZWVMaXN0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRUEwQTFDMTcwOEIwMDcwMEJCNzIyQyAv
KiBGVExBYnN0cmFjdEhlYXAuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJNzkwMDgxMzgxRTk1QThF
QzAwNTJEN0NEIC8qIFdhc21Nb2R1bGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEZFQTBBMUUx
NzA4QjAwNzAwQkI3MjJDIC8qIEZUTEFic3RyYWN0SGVhcFJlcG9zaXRvcnkuY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJMEY0ODUzMjcxODdERkRFQzAwODNCNjg3IC8qIEZUTEF2YWlsYWJsZVJlY292
ZXJ5LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTBGRUEwQTA5MTcwNTEzREIwMEJCNzIyQyAvKiBG
VExDYXBhYmlsaXRpZXMuY3BwIGluIFNvdXJjZXMgKi8sCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9Qcm9taXNlRGVmZXJyZWRUaW1lci5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJvbWlzZURlZmVycmVkVGltZXIuY3BwCShyZXZp
c2lvbiAyMTUwNTQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Qcm9taXNlRGVm
ZXJyZWRUaW1lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDEwICs0NCwxMiBAQCBQcm9taXNl
RGVmZXJyZWRUaW1lcjo6UHJvbWlzZURlZmVycmVkVGltCiB2b2lkIFByb21pc2VEZWZlcnJlZFRp
bWVyOjpkb1dvcmsoKQogewogICAgIEFTU0VSVChtX3ZtLT5jdXJyZW50VGhyZWFkSXNIb2xkaW5n
QVBJTG9jaygpKTsKLSAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3Rhc2tMb2NrKTsKKyAgICBtX3Rh
c2tMb2NrLmxvY2soKTsKICAgICBjYW5jZWxUaW1lcigpOwotICAgIGlmICghbV9ydW5UYXNrcykK
KyAgICBpZiAoIW1fcnVuVGFza3MpIHsKKyAgICAgICAgbV90YXNrTG9jay51bmxvY2soKTsKICAg
ICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHdoaWxlICghbV90YXNrcy5pc0VtcHR5KCkpIHsK
ICAgICAgICAgSlNQcm9taXNlRGVmZXJyZWQqIHRpY2tldDsKQEAgLTU3LDE3ICs1OSwyNyBAQCB2
b2lkIFByb21pc2VEZWZlcnJlZFRpbWVyOjpkb1dvcmsoKQogCiAgICAgICAgIC8vIFdlIG1heSBo
YXZlIGFscmVhZHkgY2FuY2VsZWQgdGhlc2UgcHJvbWlzZXMuCiAgICAgICAgIGlmIChtX3BlbmRp
bmdQcm9taXNlcy5jb250YWlucyh0aWNrZXQpKSB7CisgICAgICAgICAgICAvLyBBbGxvdyB0YXNr
cyB3ZSBydW4gbm93IHRvIHNjaGVkdWxlIHdvcmsuCisgICAgICAgICAgICBtX2N1cnJlbnRseVJ1
bm5pbmdUYXNrID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fdGFza0xvY2sudW5sb2NrKCk7IAorCiAg
ICAgICAgICAgICB0YXNrKCk7CiAgICAgICAgICAgICBtX3ZtLT5kcmFpbk1pY3JvdGFza3MoKTsK
KworICAgICAgICAgICAgbV90YXNrTG9jay5sb2NrKCk7CisgICAgICAgICAgICBtX2N1cnJlbnRs
eVJ1bm5pbmdUYXNrID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobV9wZW5k
aW5nUHJvbWlzZXMuaXNFbXB0eSgpICYmIG1fc2hvdWxkU3RvcFJ1bkxvb3BXaGVuQWxsUHJvbWlz
ZXNGaW5pc2gpCisgICAgaWYgKG1fcGVuZGluZ1Byb21pc2VzLmlzRW1wdHkoKSAmJiBtX3Nob3Vs
ZFN0b3BSdW5Mb29wV2hlbkFsbFByb21pc2VzRmluaXNoKSB7CiAjaWYgVVNFKENGKQogICAgICAg
ICBDRlJ1bkxvb3BTdG9wKG1fcnVuTG9vcC5nZXQoKSk7CiAjZWxzZQogICAgICAgICBSdW5Mb29w
OjpjdXJyZW50KCkuc3RvcCgpOwogI2VuZGlmCisgICAgfQorCisgICAgbV90YXNrTG9jay51bmxv
Y2soKTsKIH0KIAogdm9pZCBQcm9taXNlRGVmZXJyZWRUaW1lcjo6cnVuUnVuTG9vcCgpCkBAIC0x
MjEsNyArMTMzLDcgQEAgdm9pZCBQcm9taXNlRGVmZXJyZWRUaW1lcjo6c2NoZWR1bGVXb3JrUwog
ewogICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fdGFza0xvY2spOwogICAgIG1fdGFza3MuYXBwZW5k
KHN0ZDo6bWFrZV90dXBsZSh0aWNrZXQsIFdURk1vdmUodGFzaykpKTsKLSAgICBpZiAoIWlzU2No
ZWR1bGVkKCkpCisgICAgaWYgKCFpc1NjaGVkdWxlZCgpICYmICFtX2N1cnJlbnRseVJ1bm5pbmdU
YXNrKQogICAgICAgICBzY2hlZHVsZVRpbWVyKDApOwogfQogCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvcnVudGltZS9Qcm9taXNlRGVmZXJyZWRUaW1lci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb21pc2VEZWZlcnJlZFRpbWVyLmgJKHJldmlz
aW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb21pc2VEZWZl
cnJlZFRpbWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTY0LDYgKzY0LDcgQEAgcHJpdmF0ZToKICAg
ICBMb2NrIG1fdGFza0xvY2s7CiAgICAgYm9vbCBtX3J1blRhc2tzIHsgdHJ1ZSB9OwogICAgIGJv
b2wgbV9zaG91bGRTdG9wUnVuTG9vcFdoZW5BbGxQcm9taXNlc0ZpbmlzaCB7IGZhbHNlIH07Cisg
ICAgYm9vbCBtX2N1cnJlbnRseVJ1bm5pbmdUYXNrIHsgZmFsc2UgfTsKICAgICBWZWN0b3I8c3Rk
Ojp0dXBsZTxKU1Byb21pc2VEZWZlcnJlZCosIFRhc2s+PiBtX3Rhc2tzOwogfTsKIApJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJHZW5lcmF0b3IuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CM0lSR2VuZXJhdG9yLmNwcAko
cmV2aXNpb24gMjE1MDU0KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJH
ZW5lcmF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MzYsNyArOTM2LDcgQEAgYXV0byBCM0lS
R2VuZXJhdG9yOjphZGRDYWxsKHVpbnQzMl90IGZ1bgogICAgICAgICAgICAgICAgIHBhdGNocG9p
bnQtPmFwcGVuZChqdW1wRGVzdGluYXRpb24sIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXIpOwogICAg
ICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2xvYmJlciBhbGwgcG90ZW50aWFsIHBpbm5lZCBy
ZWdpc3RlcnMgc2luY2Ugd2UgbWlnaHQgYmUgbGVhdmluZyB0aGUgaW5zdGFuY2UuCiAgICAgICAg
ICAgICAgICAgcGF0Y2hwb2ludC0+Y2xvYmJlckxhdGUoUGlubmVkUmVnaXN0ZXJJbmZvOjpnZXQo
KS50b1NhdmUoKSk7Ci0gICAgICAgICAgICAgICAgcGF0Y2hwb2ludC0+c2V0R2VuZXJhdG9yKFt1
bmxpbmtlZFdhc21Ub1dhc21DYWxscywgZnVuY3Rpb25JbmRleCwgcmV0dXJuVHlwZV0gKENDYWxs
SGVscGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJiBwYXJhbXMp
IHsKKyAgICAgICAgICAgICAgICBwYXRjaHBvaW50LT5zZXRHZW5lcmF0b3IoW2Z1bmN0aW9uSW5k
ZXgsIHJldHVyblR5cGVdIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgQjM6OlN0YWNrbWFwR2Vu
ZXJhdGlvblBhcmFtcyYgcGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgIEFsbG93TWFjcm9T
Y3JhdGNoUmVnaXN0ZXJVc2FnZSBhbGxvd1NjcmF0Y2goaml0KTsKICAgICAgICAgICAgICAgICAg
ICAgaml0LmNhbGwocGFyYW1zW3JldHVyblR5cGUgPT0gVm9pZCA/IDAgOiAxXS5ncHIoKSk7CiAg
ICAgICAgICAgICAgICAgfSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNt
QmluZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2Fz
bUJpbmRpbmcuY3BwCShyZXZpc2lvbiAyMTUwNTQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d2FzbS9XYXNtQmluZGluZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ5LDcgKzQ5LDcgQEAgc3Rh
dGljIHZvaWQgbWF0ZXJpYWxpemVJbXBvcnRKU0NlbGwoSklUJgogICAgIGppdC5sb2FkUHRyKEpJ
VDo6QWRkcmVzcyhyZXN1bHQsIEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6b2Zmc2V0T2ZJbXBvcnRG
dW5jdGlvbihpbXBvcnRJbmRleCkpLCByZXN1bHQpOwogfQogCi1zdGF0aWMgTWFjcm9Bc3NlbWJs
ZXJDb2RlUmVmIHdhc21Ub0pzKFZNKiB2bSwgQmFnPENhbGxMaW5rSW5mbz4mIGNhbGxMaW5rSW5m
b3MsIFNpZ25hdHVyZUluZGV4IHNpZ25hdHVyZUluZGV4LCB1bnNpZ25lZCBpbXBvcnRJbmRleCkK
K01hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9KcyhWTSogdm0sIEJhZzxDYWxsTGlua0luZm8+
JiBjYWxsTGlua0luZm9zLCBTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCwgdW5zaWduZWQg
aW1wb3J0SW5kZXgpCiB7CiAgICAgLy8gRklYTUU6IFRoaXMgZnVuY3Rpb24gZG9lc24ndCBwcm9w
ZXJseSBhYnN0cmFjdCBhd2F5IHRoZSBjYWxsaW5nIGNvbnZlbnRpb24uCiAgICAgLy8gSXQnZCBi
ZSBzdXBlciBlYXN5IHRvIGRvIHNvOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTY5NDAxCkBAIC00MjIsNyArNDIyLDcgQEAgc3RhdGljIE1hY3JvQXNzZW1ibGVyQ29k
ZVJlZiB3YXNtVG9KcyhWTQogICAgIHJldHVybiBGSU5BTElaRV9DT0RFKHBhdGNoQnVmZmVyLCAo
IldlYkFzc2VtYmx5LT5KYXZhU2NyaXB0IGltcG9ydFslaV0gJXMiLCBpbXBvcnRJbmRleCwgc2ln
bmF0dXJlLnRvU3RyaW5nKCkuYXNjaWkoKS5kYXRhKCkpKTsKIH0KIAotc3RhdGljIE1hY3JvQXNz
ZW1ibGVyQ29kZVJlZiB3YXNtVG9XYXNtKHVuc2lnbmVkIGltcG9ydEluZGV4KQorTWFjcm9Bc3Nl
bWJsZXJDb2RlUmVmIHdhc21Ub1dhc20odW5zaWduZWQgaW1wb3J0SW5kZXgpCiB7CiAgICAgY29u
c3QgUGlubmVkUmVnaXN0ZXJJbmZvJiBwaW5uZWRSZWdzID0gUGlubmVkUmVnaXN0ZXJJbmZvOjpn
ZXQoKTsKICAgICBKSVQgaml0OwpAQCAtNDYyLDE0ICs0NjIsNiBAQCBzdGF0aWMgTWFjcm9Bc3Nl
bWJsZXJDb2RlUmVmIHdhc21Ub1dhc20oCiAgICAgcmV0dXJuIEZJTkFMSVpFX0NPREUocGF0Y2hC
dWZmZXIsICgiV2ViQXNzZW1ibHktPldlYkFzc2VtYmx5IGltcG9ydFslaV0iLCBpbXBvcnRJbmRl
eCkpOwogfQogCi1XYXNtRXhpdFN0dWJzIGV4aXRTdHViR2VuZXJhdG9yKFZNKiB2bSwgQmFnPENh
bGxMaW5rSW5mbz4mIGNhbGxMaW5rSW5mb3MsIFNpZ25hdHVyZUluZGV4IHNpZ25hdHVyZUluZGV4
LCB1bnNpZ25lZCBpbXBvcnRJbmRleCkKLXsKLSAgICBXYXNtRXhpdFN0dWJzIHN0dWJzOwotICAg
IHN0dWJzLndhc21Ub0pzID0gd2FzbVRvSnModm0sIGNhbGxMaW5rSW5mb3MsIHNpZ25hdHVyZUlu
ZGV4LCBpbXBvcnRJbmRleCk7Ci0gICAgc3R1YnMud2FzbVRvV2FzbSA9IHdhc21Ub1dhc20oaW1w
b3J0SW5kZXgpOwotICAgIHJldHVybiBzdHViczsKLX0KLQogfSB9IC8vIG5hbWVzcGFjZSBKU0M6
Oldhc20KIAogI2VuZGlmIC8vIEVOQUJMRShXRUJBU1NFTUJMWSkKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL1dhc21CaW5kaW5nLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3dhc20vV2FzbUJpbmRpbmcuaAkocmV2aXNpb24gMjE1MDU0KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUJpbmRpbmcuaAkod29ya2luZyBjb3B5KQpAQCAtMzgs
NyArMzgsOCBAQCBjbGFzcyBDYWxsTGlua0luZm87CiAKIG5hbWVzcGFjZSBXYXNtIHsKIAotV2Fz
bUV4aXRTdHVicyBleGl0U3R1YkdlbmVyYXRvcihWTSosIEJhZzxDYWxsTGlua0luZm8+JiwgU2ln
bmF0dXJlSW5kZXgsIHVuc2lnbmVkKTsKK01hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9XYXNt
KHVuc2lnbmVkIGltcG9ydEluZGV4KTsKK01hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9KcyhW
TSosIEJhZzxDYWxsTGlua0luZm8+JiBjYWxsTGlua0luZm9zLCBTaWduYXR1cmVJbmRleCwgdW5z
aWduZWQgaW1wb3J0SW5kZXgpOwogCiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6V2FzbQogCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxlLmNwcAkobm9uZXhpc3RlbnQp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXYXNtTW9kdWxlLmgi
CisKKyNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCisKKyNpbmNsdWRlICJXYXNtUGxhbklubGluZXMu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKKworQ29kZUJsb2NrOjpDb2Rl
QmxvY2soVk0mIHZtLCBNZW1vcnlNb2RlIG1vZGUsIE1vZHVsZUluZm9ybWF0aW9uJiBtb2R1bGVJ
bmZvcm1hdGlvbikKKyAgICA6IG1fY2FsbGVlQ291bnQobW9kdWxlSW5mb3JtYXRpb24uaW50ZXJu
YWxGdW5jdGlvbkNvdW50KCkpCisgICAgLCBtX21vZGUobW9kZSkKK3sKKyAgICBtX3BsYW4gPSBh
ZG9wdFJlZigqbmV3IFBsYW4odm0sIG1ha2VSZWYobW9kdWxlSW5mb3JtYXRpb24pLCBQbGFuOjpG
dWxsQ29tcGlsZSwgW3RoaXNdIChWTSYsIFBsYW4mKSB7CisgICAgICAgIC8vIEl0J3Mgc2FmZSB0
byB1c2UgfHRoaXN8IGhlcmUgYmVjYXVzZSBvdXIgTW9kdWxlIG93bnMgdXMsIGFuZCBhIE1vZHVs
ZQorICAgICAgICAvLyBjYW4ndCBiZSBkZXN0cm95ZWQgdW50aWwgaXQgaGFzIGZpbmlzaGVkIGNv
bXBpbGluZyBpdHMgdmFyaW91cyBXYXNtIGJpdHMuCisgICAgICAgIC8vIFRoZSBKUyBBUEkgaW5z
dXJlcyB0aGlzIGludmFyaWFudCBieSBrZWVwaW5nIGFsaXZlIHRoZSBtb2R1bGUgYXMgaXQgaGFz
CisgICAgICAgIC8vIGEgcGVuZGluZyBwcm9taXNlLgorICAgICAgICBhdXRvIGxvY2tlciA9IGhv
bGRMb2NrKG1fbG9jayk7CisgICAgICAgIGlmIChtX3BsYW4tPmZhaWxlZCgpKSB7CisgICAgICAg
ICAgICBtX2Vycm9yTWVzc2FnZSA9IG1fcGxhbi0+ZXJyb3JNZXNzYWdlKCk7CisgICAgICAgICAg
ICBtX3BsYW4gPSBudWxscHRyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgbV9jYWxsZWVzLnJlc2l6ZShtX2NhbGxlZUNvdW50ICogMik7CisgICAgICAgIG1fcGxh
bi0+aW5pdGlhbGl6ZUNhbGxlZXMoWyZdICh1bnNpZ25lZCBjYWxsZWVJbmRleCwgUmVmPFdhc206
OkNhbGxlZT4mJiBqc0VudHJ5cG9pbnRDYWxsZWUsIFJlZjxXYXNtOjpDYWxsZWU+JiYgd2FzbUVu
dHJ5cG9pbnRDYWxsZWUpIHsKKyAgICAgICAgICAgIG1fY2FsbGVlc1tjYWxsZWVJbmRleF0gPSBX
VEZNb3ZlKGpzRW50cnlwb2ludENhbGxlZSk7CisgICAgICAgICAgICBtX2NhbGxlZXNbY2FsbGVl
SW5kZXggKyBtX2NhbGxlZUNvdW50XSA9IFdURk1vdmUod2FzbUVudHJ5cG9pbnRDYWxsZWUpOwor
ICAgICAgICB9KTsKKworICAgICAgICBtX3dhc21Ub1dhc21FeGl0U3R1YnMgPSBtX3BsYW4tPnRh
a2VXYXNtVG9XYXNtRXhpdFN0dWJzKCk7CisKKyAgICAgICAgbV9wbGFuID0gbnVsbHB0cjsKKyAg
ICB9KSk7CisKKyAgICBtX3BsYW4tPnNldE1vZGUobW9kZSk7CisgICAgYXV0byYgd29ya2xpc3Qg
PSBXYXNtOjplbnN1cmVXb3JrbGlzdCgpOworICAgIC8vIE5vdGUsIGltbWVkaWF0ZWx5IGFmdGVy
IHdlIGVucXVldWUgdGhlIHBsYW4sIHRoZXJlIGlzIGEgY2hhbmNlIHRoZSBhYm92ZSBjYWxsYmFj
ayB3aWxsIGJlIGNhbGxlZC4KKyAgICB3b3JrbGlzdC5lbnF1ZXVlKG1ha2VSZWYoKm1fcGxhbi5n
ZXQoKSkpOworfQorCit2b2lkIENvZGVCbG9jazo6d2FpdFVudGlsRmluaXNoZWQoKQoreworICAg
IFJlZlB0cjxQbGFuPiBwbGFuOworICAgIHsKKyAgICAgICAgYXV0byBsb2NrZXIgPSBob2xkTG9j
ayhtX2xvY2spOworICAgICAgICBwbGFuID0gbV9wbGFuOworICAgIH0KKworICAgIGlmIChwbGFu
KSB7CisgICAgICAgIGF1dG8mIHdvcmtsaXN0ID0gV2FzbTo6ZW5zdXJlV29ya2xpc3QoKTsKKyAg
ICAgICAgd29ya2xpc3QuY29tcGxldGVQbGFuU3luY2hyb25vdXNseSgqcGxhbi5nZXQoKSk7Cisg
ICAgfQorICAgIC8vIGVsc2UsIGlmIHdlIGRvbid0IGhhdmUgYSBwbGFuLCB3ZSdyZSBhbHJlYWR5
IGNvbXBpbGVkLgorfQorCit2b2lkIENvZGVCbG9jazo6Y29tcGlsZUFzeW5jKFZNJiB2bSwgQXN5
bmNDb21waWxhdGlvbkNhbGxiYWNrJiYgdGFzaykKK3sKKyAgICBSZWZQdHI8UGxhbj4gcGxhbjsK
KyAgICB7CisgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9sb2NrKTsKKyAgICAgICAg
cGxhbiA9IG1fcGxhbjsKKyAgICB9CisKKyAgICBpZiAocGxhbikgeworICAgICAgICBwbGFuLT5h
ZGRDb21wbGV0aW9uVGFzayh2bSwgW3Rhc2sgPSBXVEZNb3ZlKHRhc2spXSAoVk0mIHZtLCBQbGFu
JikgeworICAgICAgICAgICAgdGFzayh2bSk7CisgICAgICAgIH0pOworICAgIH0gZWxzZQorICAg
ICAgICB0YXNrKHZtKTsKK30KKworYm9vbCBDb2RlQmxvY2s6OmlzU2FmZVRvUnVuKE1lbW9yeU1v
ZGUgbWVtb3J5TW9kZSkKK3sKKyAgICBpZiAoIXJ1bm5hYmxlKCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIHN3aXRjaCAobV9tb2RlKSB7CisgICAgY2FzZSBXYXNtOjpNZW1vcnlNb2Rl
OjpCb3VuZHNDaGVja2luZzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBXYXNtOjpN
ZW1vcnlNb2RlOjpTaWduYWxpbmc6CisgICAgICAgIC8vIENvZGUgYmVpbmcgaW4gU2lnbmFsaW5n
IG1vZGUgbWVhbnMgdGhhdCBpdCBwZXJmb3JtcyBubyBib3VuZHMgY2hlY2tzLgorICAgICAgICAv
LyBJdHMgbWVtb3J5LCBldmVuIGlmIGVtcHR5LCBhYnNvbHV0ZWx5IG11c3QgYWxzbyBiZSBpbiBT
aWduYWxpbmcgbW9kZQorICAgICAgICAvLyBiZWNhdXNlIHRoZSBwYWdlIHByb3RlY3Rpb24gZGV0
ZWN0cyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLgorICAgICAgICByZXR1cm4gbWVtb3J5TW9kZSA9
PSBXYXNtOjpNZW1vcnlNb2RlOjpTaWduYWxpbmc7CisgICAgY2FzZSBXYXNtOjpNZW1vcnlNb2Rl
OjpOdW1iZXJPZk1lbW9yeU1vZGVzOgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgUkVMRUFT
RV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK01vZHVsZTo6
TW9kdWxlKFJlZjxNb2R1bGVJbmZvcm1hdGlvbj4mJiBtb2R1bGVJbmZvcm1hdGlvbikKKyAgICA6
IG1fbW9kdWxlSW5mb3JtYXRpb24oV1RGTW92ZShtb2R1bGVJbmZvcm1hdGlvbikpCit7Cit9CisK
K3N0YXRpYyBNb2R1bGU6OlZhbGlkYXRpb25SZXN1bHQgbWFrZVZhbGlkYXRpb25SZXN1bHQoUGxh
biYgcGxhbikKK3sKKyAgICBBU1NFUlQoIXBsYW4uaGFzV29yaygpKTsKKyAgICBpZiAocGxhbi5m
YWlsZWQoKSkKKyAgICAgICAgcmV0dXJuIFVuZXhwZWN0ZWRUeXBlPFN0cmluZz4ocGxhbi5lcnJv
ck1lc3NhZ2UoKSk7CisgICAgcmV0dXJuIE1vZHVsZTo6VmFsaWRhdGlvblJlc3VsdChNb2R1bGU6
OmNyZWF0ZShwbGFuLnRha2VNb2R1bGVJbmZvcm1hdGlvbigpKSk7Cit9CisKK01vZHVsZTo6VmFs
aWRhdGlvblJlc3VsdCBNb2R1bGU6OnZhbGlkYXRlU3luY0ltcGwoUmVmPFBsYW4+JiYgcGxhbikK
K3sKKyAgICBwbGFuLT5wYXJzZUFuZFZhbGlkYXRlTW9kdWxlKCk7CisgICAgcmV0dXJuIG1ha2VW
YWxpZGF0aW9uUmVzdWx0KHBsYW4uZ2V0KCkpOworfQorCit2b2lkIE1vZHVsZTo6Y29tcGlsZVN5
bmMoVk0mIHZtLCBNZW1vcnlNb2RlIG1vZGUpCit7CisgICAgUmVmUHRyPENvZGVCbG9jaz4gY29k
ZUJsb2NrOworICAgIHsKKyAgICAgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhtX2xvY2spOwor
ICAgICAgICBjb2RlQmxvY2sgPSBtX2NvZGVCbG9ja3Nbc3RhdGljX2Nhc3Q8dWludDhfdD4obW9k
ZSldOworICAgICAgICBpZiAoIWNvZGVCbG9jaykgeworICAgICAgICAgICAgY29kZUJsb2NrID0g
Q29kZUJsb2NrOjpjcmVhdGUodm0sIG1vZGUsIGNvbnN0X2Nhc3Q8TW9kdWxlSW5mb3JtYXRpb24m
Pihtb2R1bGVJbmZvcm1hdGlvbigpKSk7CisgICAgICAgICAgICBtX2NvZGVCbG9ja3Nbc3RhdGlj
X2Nhc3Q8dWludDhfdD4obW9kZSldID0gY29kZUJsb2NrOworICAgICAgICB9CisgICAgfQorICAg
IGNvZGVCbG9jay0+d2FpdFVudGlsRmluaXNoZWQoKTsKK30KKworUGxhbjo6Q29tcGxldGlvblRh
c2sgTW9kdWxlOjptYWtlVmFsaWRhdGlvbkNhbGxiYWNrKEFzeW5jVmFsaWRhdGlvbkNhbGxiYWNr
JiYgY2FsbGJhY2spCit7CisgICAgcmV0dXJuIFtjYWxsYmFjayA9IFdURk1vdmUoY2FsbGJhY2sp
XSAoVk0mIHZtLCBQbGFuJiBwbGFuKSB7CisgICAgICAgIEFTU0VSVCghcGxhbi5oYXNXb3JrKCkp
OworICAgICAgICBjYWxsYmFjayh2bSwgbWFrZVZhbGlkYXRpb25SZXN1bHQocGxhbikpOworICAg
IH07Cit9CisKK3ZvaWQgTW9kdWxlOjpjb21waWxlQXN5bmMoVk0mIHZtLCBNZW1vcnlNb2RlIG1v
ZGUsIENvZGVCbG9jazo6QXN5bmNDb21waWxhdGlvbkNhbGxiYWNrJiYgdGFzaykKK3sKKyAgICBS
ZWZQdHI8Q29kZUJsb2NrPiBjb2RlQmxvY2s7CisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9
IGhvbGRMb2NrKG1fbG9jayk7CisgICAgICAgIGNvZGVCbG9jayA9IG1fY29kZUJsb2Nrc1tzdGF0
aWNfY2FzdDx1aW50OF90Pihtb2RlKV07CisgICAgICAgIGlmICghY29kZUJsb2NrKSB7CisgICAg
ICAgICAgICBjb2RlQmxvY2sgPSBDb2RlQmxvY2s6OmNyZWF0ZSh2bSwgbW9kZSwgY29uc3RfY2Fz
dDxNb2R1bGVJbmZvcm1hdGlvbiY+KG1vZHVsZUluZm9ybWF0aW9uKCkpKTsKKyAgICAgICAgICAg
IG1fY29kZUJsb2Nrc1tzdGF0aWNfY2FzdDx1aW50OF90Pihtb2RlKV0gPSBjb2RlQmxvY2s7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlQmxvY2stPmNvbXBpbGVBc3luYyh2bSwgV1RGTW92
ZSh0YXNrKSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpXYXNtCisKKyNlbmRpZiAvLyBF
TkFCTEUoV0VCQVNTRU1CTFkpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNt
TW9kdWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbU1v
ZHVsZS5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21N
b2R1bGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWYgRU5BQkxF
KFdFQkFTU0VNQkxZKQorCisjaW5jbHVkZSAiV2FzbUNhbGxlZS5oIgorI2luY2x1ZGUgIldhc21N
b2R1bGVJbmZvcm1hdGlvbi5oIgorI2luY2x1ZGUgIldhc21QbGFuLmgiCisjaW5jbHVkZSAiV2Fz
bVdvcmtsaXN0LmgiCisjaW5jbHVkZSA8d3RmL0V4cGVjdGVkLmg+CisjaW5jbHVkZSA8d3RmL0xv
Y2suaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KKworbmFtZXNwYWNl
IEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKKyAgICAKK2NsYXNzIENvZGVCbG9jayA6IHB1YmxpYyBU
aHJlYWRTYWZlUmVmQ291bnRlZDxDb2RlQmxvY2s+IHsKK3B1YmxpYzoKKyAgICB1c2luZyBBc3lu
Y0NvbXBpbGF0aW9uQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoVk0mKT47CisgICAgc3Rh
dGljIFJlZjxDb2RlQmxvY2s+IGNyZWF0ZShWTSYgdm0sIE1lbW9yeU1vZGUgbW9kZSwgTW9kdWxl
SW5mb3JtYXRpb24mIG1vZHVsZUluZm9ybWF0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFk
b3B0UmVmKCpuZXcgQ29kZUJsb2NrKHZtLCBtb2RlLCBtb2R1bGVJbmZvcm1hdGlvbikpOworICAg
IH0KKworICAgIHZvaWQgd2FpdFVudGlsRmluaXNoZWQoKTsKKyAgICB2b2lkIGNvbXBpbGVBc3lu
YyhWTSYsIEFzeW5jQ29tcGlsYXRpb25DYWxsYmFjayYmKTsKKworICAgIGJvb2wgY29tcGlsYXRp
b25GaW5pc2hlZCgpCisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbG9j
ayk7CisgICAgICAgIHJldHVybiAhbV9wbGFuOworICAgIH0KKyAgICBib29sIHJ1bm5hYmxlKCkg
eyByZXR1cm4gY29tcGlsYXRpb25GaW5pc2hlZCgpICYmICFtX2Vycm9yTWVzc2FnZTsgfQorCisg
ICAgLy8gTm90ZSwgd2UgZG8gdGhpcyBjb3B5IHRvIGVuc3VyZSBpdCdzIHRocmVhZCBzYWZlIHRv
IGhhdmUgdGhpcworICAgIC8vIGNhbGxlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgc2ltdWx0YW5l
b3VzbHkuCisgICAgU3RyaW5nIGVycm9yTWVzc2FnZSgpCisgICAgeworICAgICAgICBBU1NFUlQo
IXJ1bm5hYmxlKCkpOworICAgICAgICBDU3RyaW5nIGNTdHJpbmcgPSBtX2Vycm9yTWVzc2FnZS5h
c2NpaSgpOworICAgICAgICByZXR1cm4gU3RyaW5nKGNTdHJpbmcuZGF0YSgpKTsKKyAgICB9CisK
KyAgICB1bnNpZ25lZCBmdW5jdGlvbkltcG9ydENvdW50KCkgY29uc3QgeyByZXR1cm4gbV93YXNt
VG9XYXNtRXhpdFN0dWJzLnNpemUoKTsgfQorCisgICAgV2FzbTo6Q2FsbGVlJiBqc0VudHJ5cG9p
bnRDYWxsZWVGcm9tRnVuY3Rpb25JbmRleFNwYWNlKHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFj
ZSkKKyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGZ1bmN0aW9uSW5kZXhTcGFjZSA+PSBm
dW5jdGlvbkltcG9ydENvdW50KCkpOworICAgICAgICB1bnNpZ25lZCBjYWxsZWVJbmRleCA9IGZ1
bmN0aW9uSW5kZXhTcGFjZSAtIGZ1bmN0aW9uSW1wb3J0Q291bnQoKTsKKyAgICAgICAgUkVMRUFT
RV9BU1NFUlQoY2FsbGVlSW5kZXggPCBtX2NhbGxlZUNvdW50KTsKKyAgICAgICAgcmV0dXJuICpt
X2NhbGxlZXNbY2FsbGVlSW5kZXhdLmdldCgpOworICAgIH0KKyAgICBXYXNtOjpDYWxsZWUmIHdh
c21FbnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSh1bnNpZ25lZCBmdW5jdGlv
bkluZGV4U3BhY2UpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChmdW5jdGlvbkluZGV4
U3BhY2UgPj0gZnVuY3Rpb25JbXBvcnRDb3VudCgpKTsKKyAgICAgICAgdW5zaWduZWQgY2FsbGVl
SW5kZXggPSBmdW5jdGlvbkluZGV4U3BhY2UgLSBmdW5jdGlvbkltcG9ydENvdW50KCk7CisgICAg
ICAgIFJFTEVBU0VfQVNTRVJUKGNhbGxlZUluZGV4IDwgbV9jYWxsZWVDb3VudCk7CisgICAgICAg
IHJldHVybiAqbV9jYWxsZWVzW2NhbGxlZUluZGV4ICsgbV9jYWxsZWVDb3VudF0uZ2V0KCk7Cisg
ICAgfQorICAgIGJvb2wgaXNTYWZlVG9SdW4oTWVtb3J5TW9kZSk7CisKK3ByaXZhdGU6CisgICAg
Q29kZUJsb2NrKFZNJiwgTWVtb3J5TW9kZSwgTW9kdWxlSW5mb3JtYXRpb24mKTsKKyAgICB1bnNp
Z25lZCBtX2NhbGxlZUNvdW50OworICAgIE1lbW9yeU1vZGUgbV9tb2RlOworICAgIFZlY3RvcjxS
ZWZQdHI8Q2FsbGVlPj4gbV9jYWxsZWVzOworICAgIFZlY3RvcjxNYWNyb0Fzc2VtYmxlckNvZGVS
ZWY+IG1fd2FzbVRvV2FzbUV4aXRTdHViczsKKyAgICBSZWZQdHI8UGxhbj4gbV9wbGFuOworICAg
IFN0cmluZyBtX2Vycm9yTWVzc2FnZTsKKyAgICBMb2NrIG1fbG9jazsKK307CisKK2NsYXNzIE1v
ZHVsZSA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxNb2R1bGU+IHsKK3B1YmxpYzoKKyAg
ICB1c2luZyBWYWxpZGF0aW9uUmVzdWx0ID0gV1RGOjpFeHBlY3RlZDxSZWZQdHI8TW9kdWxlPiwg
U3RyaW5nPjsKKyAgICB1c2luZyBBc3luY1ZhbGlkYXRpb25DYWxsYmFjayA9IHN0ZDo6ZnVuY3Rp
b248dm9pZChWTSYsIFZhbGlkYXRpb25SZXN1bHQmJik+OworCisgICAgc3RhdGljIFJlZjxNb2R1
bGU+IGNyZWF0ZShSZWY8TW9kdWxlSW5mb3JtYXRpb24+JiYgbW9kdWxlSW5mb3JtYXRpb24pCisg
ICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBNb2R1bGUoV1RGTW92ZShtb2R1bGVJ
bmZvcm1hdGlvbikpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVmFsaWRhdGlvblJlc3VsdCB2YWxp
ZGF0ZVN5bmMoVk0mIHZtLCBWZWN0b3I8dWludDhfdD4mJiBzb3VyY2UpCisgICAgeworICAgICAg
ICBSZWY8UGxhbj4gcGxhbiA9IGFkb3B0UmVmKCpuZXcgUGxhbih2bSwgV1RGTW92ZShzb3VyY2Up
LCBQbGFuOjpWYWxpZGF0aW9uLCBQbGFuOjpkb250RmluYWxpemUpKTsKKyAgICAgICAgcmV0dXJu
IHZhbGlkYXRlU3luY0ltcGwoV1RGTW92ZShwbGFuKSk7CisgICAgfQorCisgICAgc3RhdGljIHZv
aWQgdmFsaWRhdGVBc3luYyhWTSYgdm0sIFZlY3Rvcjx1aW50OF90PiYmIHNvdXJjZSwgQXN5bmNW
YWxpZGF0aW9uQ2FsbGJhY2smJiBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIFJlZjxQbGFuPiBw
bGFuID0gYWRvcHRSZWYoKm5ldyBQbGFuKHZtLCBXVEZNb3ZlKHNvdXJjZSksIFBsYW46OlZhbGlk
YXRpb24sIG1ha2VWYWxpZGF0aW9uQ2FsbGJhY2soV1RGTW92ZShjYWxsYmFjaykpKSk7CisgICAg
ICAgIFdhc206OmVuc3VyZVdvcmtsaXN0KCkuZW5xdWV1ZShXVEZNb3ZlKHBsYW4pKTsKKyAgICB9
CisKKyAgICBXYXNtOjpTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleEZyb21GdW5jdGlvbklu
ZGV4U3BhY2UodW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG1fbW9kdWxlSW5mb3JtYXRpb24tPnNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0aW9u
SW5kZXhTcGFjZShmdW5jdGlvbkluZGV4U3BhY2UpOworICAgIH0KKworICAgIGNvbnN0IFdhc206
Ok1vZHVsZUluZm9ybWF0aW9uJiBtb2R1bGVJbmZvcm1hdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1f
bW9kdWxlSW5mb3JtYXRpb24uZ2V0KCk7IH0KKworICAgIHZvaWQgY29tcGlsZVN5bmMoVk0mLCBN
ZW1vcnlNb2RlKTsKKyAgICB2b2lkIGNvbXBpbGVBc3luYyhWTSYsIE1lbW9yeU1vZGUsIENvZGVC
bG9jazo6QXN5bmNDb21waWxhdGlvbkNhbGxiYWNrJiYpOworCisgICAgUmVmPENvZGVCbG9jaz4g
bm9uTnVsbENvZGVCbG9jayhXYXNtOjpNZW1vcnlNb2RlIG1vZGUpCisgICAgeworICAgICAgICBD
b2RlQmxvY2sqIGNvZGVCbG9jayA9IG1fY29kZUJsb2Nrc1tzdGF0aWNfY2FzdDx1aW50OF90Piht
b2RlKV0uZ2V0KCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCEhY29kZUJsb2NrKTsKKyAgICAg
ICAgcmV0dXJuIG1ha2VSZWYoKmNvZGVCbG9jayk7CisgICAgfQorCitwcml2YXRlOgorCisgICAg
c3RhdGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGVTeW5jSW1wbChSZWY8UGxhbj4mJik7Cisg
ICAgc3RhdGljIFBsYW46OkNvbXBsZXRpb25UYXNrIG1ha2VWYWxpZGF0aW9uQ2FsbGJhY2soQXN5
bmNWYWxpZGF0aW9uQ2FsbGJhY2smJik7CisKKyAgICBNb2R1bGUoUmVmPE1vZHVsZUluZm9ybWF0
aW9uPiYmKTsKKyAgICBSZWY8TW9kdWxlSW5mb3JtYXRpb24+IG1fbW9kdWxlSW5mb3JtYXRpb247
CisgICAgUmVmUHRyPENvZGVCbG9jaz4gbV9jb2RlQmxvY2tzW1dhc206Ok51bWJlck9mTWVtb3J5
TW9kZXNdOworICAgIExvY2sgbV9sb2NrOworfTsKKworfSB9IC8vIG5hbWVzcGFjZSBKU0M6Oldh
c20KKworI2VuZGlmIC8vIEVOQUJMRShXRUJBU1NFTUJMWSkKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93YXNtL1dhc21QbGFuLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9XYXNtUGxhbi5jcHAJKHJldmlzaW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTIsMTMgKzUy
LDEyIEBAIHN0YXRpYyBjb25zdCBib29sIHZlcmJvc2UgPSBmYWxzZTsKIAogUGxhbjo6UGxhbihW
TSYgdm0sIFJlZjxNb2R1bGVJbmZvcm1hdGlvbj4gaW5mbywgQXN5bmNXb3JrIHdvcmssIENvbXBs
ZXRpb25UYXNrJiYgdGFzaykKICAgICA6IG1fbW9kdWxlSW5mb3JtYXRpb24oV1RGTW92ZShpbmZv
KSkKLSAgICAsIG1fdm0odm0pCiAgICAgLCBtX3NvdXJjZShtX21vZHVsZUluZm9ybWF0aW9uLT5z
b3VyY2UuZGF0YSgpKQogICAgICwgbV9zb3VyY2VMZW5ndGgobV9tb2R1bGVJbmZvcm1hdGlvbi0+
c291cmNlLnNpemUoKSkKICAgICAsIG1fc3RhdGUoU3RhdGU6OlZhbGlkYXRlZCkKICAgICAsIG1f
YXN5bmNXb3JrKHdvcmspCiB7Ci0gICAgbV9jb21wbGV0aW9uVGFza3MuYXBwZW5kKFdURk1vdmUo
dGFzaykpOworICAgIG1fY29tcGxldGlvblRhc2tzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcigmdm0s
IFdURk1vdmUodGFzaykpKTsKIH0KIAogUGxhbjo6UGxhbihWTSYgdm0sIFZlY3Rvcjx1aW50OF90
PiYmIHNvdXJjZSwgQXN5bmNXb3JrIHdvcmssIENvbXBsZXRpb25UYXNrJiYgdGFzaykKQEAgLTY5
LDEzICs2OCwxMiBAQCBQbGFuOjpQbGFuKFZNJiB2bSwgVmVjdG9yPHVpbnQ4X3Q+JiYgc291CiAK
IFBsYW46OlBsYW4oVk0mIHZtLCBjb25zdCB1aW50OF90KiBzb3VyY2UsIHNpemVfdCBzb3VyY2VM
ZW5ndGgsIEFzeW5jV29yayB3b3JrLCBDb21wbGV0aW9uVGFzayYmIHRhc2spCiAgICAgOiBtX21v
ZHVsZUluZm9ybWF0aW9uKG1ha2VSZWYoKm5ldyBNb2R1bGVJbmZvcm1hdGlvbihWZWN0b3I8dWlu
dDhfdD4oKSkpKQotICAgICwgbV92bSh2bSkKICAgICAsIG1fc291cmNlKHNvdXJjZSkKICAgICAs
IG1fc291cmNlTGVuZ3RoKHNvdXJjZUxlbmd0aCkKICAgICAsIG1fc3RhdGUoU3RhdGU6OkluaXRp
YWwpCiAgICAgLCBtX2FzeW5jV29yayh3b3JrKQogewotICAgIG1fY29tcGxldGlvblRhc2tzLmFw
cGVuZChXVEZNb3ZlKHRhc2spKTsKKyAgICBtX2NvbXBsZXRpb25UYXNrcy5hcHBlbmQoc3RkOjpt
YWtlX3BhaXIoJnZtLCBXVEZNb3ZlKHRhc2spKSk7CiB9CiAKIGNvbnN0IGNoYXIqIFBsYW46OnN0
YXRlU3RyaW5nKFN0YXRlIHN0YXRlKQpAQCAtMTA0LDEzICsxMDIsMTMgQEAgdm9pZCBQbGFuOjpm
YWlsKGNvbnN0IEFic3RyYWN0TG9ja2VyJiBsbwogICAgIGNvbXBsZXRlKGxvY2tlcik7CiB9CiAK
LXZvaWQgUGxhbjo6YWRkQ29tcGxldGlvblRhc2soQ29tcGxldGlvblRhc2smJiB0YXNrKQordm9p
ZCBQbGFuOjphZGRDb21wbGV0aW9uVGFzayhWTSYgdm0sIENvbXBsZXRpb25UYXNrJiYgdGFzaykK
IHsKICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX2xvY2spOwogICAgIGlmIChtX3N0YXRlICE9IFN0
YXRlOjpDb21wbGV0ZWQpCi0gICAgICAgIG1fY29tcGxldGlvblRhc2tzLmFwcGVuZChXVEZNb3Zl
KHRhc2spKTsKKyAgICAgICAgbV9jb21wbGV0aW9uVGFza3MuYXBwZW5kKHN0ZDo6bWFrZV9wYWly
KCZ2bSwgV1RGTW92ZSh0YXNrKSkpOwogICAgIGVsc2UKLSAgICAgICAgdGFzaygqdGhpcyk7Cisg
ICAgICAgIHRhc2sodm0sICp0aGlzKTsKIH0KIAogYm9vbCBQbGFuOjpwYXJzZUFuZFZhbGlkYXRl
TW9kdWxlKCkKQEAgLTE4Miw3ICsxODAsNyBAQCB2b2lkIFBsYW46OnByZXBhcmUoKQogICAgIH07
CiAKICAgICBjb25zdCBhdXRvJiBmdW5jdGlvbkxvY2F0aW9ucyA9IG1fbW9kdWxlSW5mb3JtYXRp
b24tPmZ1bmN0aW9uTG9jYXRpb25JbkJpbmFyeTsKLSAgICBpZiAoIXRyeVJlc2VydmVDYXBhY2l0
eShtX3dhc21FeGl0U3R1YnMsIG1fbW9kdWxlSW5mb3JtYXRpb24tPmltcG9ydEZ1bmN0aW9uU2ln
bmF0dXJlSW5kaWNlcy5zaXplKCksICIgV2ViQXNzZW1ibHkgdG8gSmF2YVNjcmlwdCBzdHVicyIp
CisgICAgaWYgKCF0cnlSZXNlcnZlQ2FwYWNpdHkobV93YXNtVG9XYXNtRXhpdFN0dWJzLCBtX21v
ZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRGdW5jdGlvblNpZ25hdHVyZUluZGljZXMuc2l6ZSgpLCAi
IFdlYkFzc2VtYmx5IHRvIEphdmFTY3JpcHQgc3R1YnMiKQogICAgICAgICB8fCAhdHJ5UmVzZXJ2
ZUNhcGFjaXR5KG1fdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIGZ1bmN0aW9uTG9jYXRpb25zLnNp
emUoKSwgIiB1bmxpbmtlZCBXZWJBc3NlbWJseSB0byBXZWJBc3NlbWJseSBjYWxscyIpCiAgICAg
ICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHkobV93YXNtSW50ZXJuYWxGdW5jdGlvbnMsIGZ1bmN0
aW9uTG9jYXRpb25zLnNpemUoKSwgIiBXZWJBc3NlbWJseSBmdW5jdGlvbnMiKQogICAgICAgICB8
fCAhdHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fY29tcGlsYXRpb25Db250ZXh0cywgZnVuY3Rpb25Mb2Nh
dGlvbnMuc2l6ZSgpLCAiIGNvbXBpbGF0aW9uIGNvbnRleHRzIikpCkBAIC0xOTYsMTAgKzE5NCw5
IEBAIHZvaWQgUGxhbjo6cHJlcGFyZSgpCiAgICAgICAgIEltcG9ydCogaW1wb3J0ID0gJm1fbW9k
dWxlSW5mb3JtYXRpb24tPmltcG9ydHNbaW1wb3J0SW5kZXhdOwogICAgICAgICBpZiAoaW1wb3J0
LT5raW5kICE9IEV4dGVybmFsS2luZDo6RnVuY3Rpb24pCiAgICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgdW5zaWduZWQgaW1wb3J0RnVuY3Rpb25JbmRleCA9IG1fd2FzbUV4aXRTdHVicy5z
aXplKCk7CisgICAgICAgIHVuc2lnbmVkIGltcG9ydEZ1bmN0aW9uSW5kZXggPSBtX3dhc21Ub1dh
c21FeGl0U3R1YnMuc2l6ZSgpOwogICAgICAgICBkYXRhTG9nTG5JZih2ZXJib3NlLCAiUHJvY2Vz
c2luZyBpbXBvcnQgZnVuY3Rpb24gbnVtYmVyICIsIGltcG9ydEZ1bmN0aW9uSW5kZXgsICI6ICIs
IG1ha2VTdHJpbmcoaW1wb3J0LT5tb2R1bGUpLCAiOiAiLCBtYWtlU3RyaW5nKGltcG9ydC0+Zmll
bGQpKTsKLSAgICAgICAgU2lnbmF0dXJlSW5kZXggc2lnbmF0dXJlSW5kZXggPSBtX21vZHVsZUlu
Zm9ybWF0aW9uLT5pbXBvcnRGdW5jdGlvblNpZ25hdHVyZUluZGljZXMuYXQoaW1wb3J0LT5raW5k
SW5kZXgpOwotICAgICAgICBtX3dhc21FeGl0U3R1YnMudW5jaGVja2VkQXBwZW5kKGV4aXRTdHVi
R2VuZXJhdG9yKCZtX3ZtLCBtX2NhbGxMaW5rSW5mb3MsIHNpZ25hdHVyZUluZGV4LCBpbXBvcnRG
dW5jdGlvbkluZGV4KSk7CisgICAgICAgIG1fd2FzbVRvV2FzbUV4aXRTdHVicy51bmNoZWNrZWRB
cHBlbmQod2FzbVRvV2FzbShpbXBvcnRGdW5jdGlvbkluZGV4KSk7CiAgICAgfQogCiAgICAgbW92
ZVRvU3RhdGUoU3RhdGU6OlByZXBhcmVkKTsKQEAgLTI2MCw3ICsyNTcsNyBAQCB2b2lkIFBsYW46
OmNvbXBpbGVGdW5jdGlvbnMoQ29tcGlsYXRpb25FCiAgICAgICAgIEFTU0VSVChmdW5jdGlvbkxl
bmd0aCA8PSBtX3NvdXJjZUxlbmd0aCk7CiAgICAgICAgIFNpZ25hdHVyZUluZGV4IHNpZ25hdHVy
ZUluZGV4ID0gbV9tb2R1bGVJbmZvcm1hdGlvbi0+aW50ZXJuYWxGdW5jdGlvblNpZ25hdHVyZUlu
ZGljZXNbZnVuY3Rpb25JbmRleF07CiAgICAgICAgIGNvbnN0IFNpZ25hdHVyZSYgc2lnbmF0dXJl
ID0gU2lnbmF0dXJlSW5mb3JtYXRpb246OmdldChzaWduYXR1cmVJbmRleCk7Ci0gICAgICAgIHVu
c2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFjZSA9IG1fd2FzbUV4aXRTdHVicy5zaXplKCkgKyBmdW5j
dGlvbkluZGV4OworICAgICAgICB1bnNpZ25lZCBmdW5jdGlvbkluZGV4U3BhY2UgPSBtX3dhc21U
b1dhc21FeGl0U3R1YnMuc2l6ZSgpICsgZnVuY3Rpb25JbmRleDsKICAgICAgICAgQVNTRVJUX1VO
VVNFRChmdW5jdGlvbkluZGV4U3BhY2UsIG1fbW9kdWxlSW5mb3JtYXRpb24tPnNpZ25hdHVyZUlu
ZGV4RnJvbUZ1bmN0aW9uSW5kZXhTcGFjZShmdW5jdGlvbkluZGV4U3BhY2UpID09IHNpZ25hdHVy
ZUluZGV4KTsKICAgICAgICAgQVNTRVJUKHZhbGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25TdGFydCwg
ZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwgbV9tb2R1bGVJbmZvcm1hdGlvbi5nZXQoKSkpOwog
CkBAIC0zMTYsOSArMzEzLDkgQEAgdm9pZCBQbGFuOjpjb21wbGV0ZShjb25zdCBBYnN0cmFjdExv
Y2tlcgogICAgICAgICAgICAgICAgIHZvaWQqIGV4ZWN1dGFibGVBZGRyZXNzOwogICAgICAgICAg
ICAgICAgIGlmIChtX21vZHVsZUluZm9ybWF0aW9uLT5pc0ltcG9ydGVkRnVuY3Rpb25Gcm9tRnVu
Y3Rpb25JbmRleFNwYWNlKGNhbGwuZnVuY3Rpb25JbmRleCkpIHsKICAgICAgICAgICAgICAgICAg
ICAgLy8gRklYTUUgaW1wb3J0cyBjb3VsZCBoYXZlIGJlZW4gbGlua2VkIGluIEIzLCBpbnN0ZWFk
IG9mIGdlbmVyYXRpbmcgYSBwYXRjaHBvaW50LiBUaGlzIGNvbmRpdGlvbiBzaG91bGQgYmUgcmVw
bGFjZWQgYnkgYSBSRUxFQVNFX0FTU0VSVC4gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTE2NjQ2MgotICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlQWRkcmVzcyA9
IG1fd2FzbUV4aXRTdHVicy5hdChjYWxsLmZ1bmN0aW9uSW5kZXgpLndhc21Ub1dhc20uY29kZSgp
LmV4ZWN1dGFibGVBZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVBZGRy
ZXNzID0gbV93YXNtVG9XYXNtRXhpdFN0dWJzLmF0KGNhbGwuZnVuY3Rpb25JbmRleCkuY29kZSgp
LmV4ZWN1dGFibGVBZGRyZXNzKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAg
ICAgICAgICAgIGV4ZWN1dGFibGVBZGRyZXNzID0gbV93YXNtSW50ZXJuYWxGdW5jdGlvbnMuYXQo
Y2FsbC5mdW5jdGlvbkluZGV4IC0gbV93YXNtRXhpdFN0dWJzLnNpemUoKSktPndhc21FbnRyeXBv
aW50LmNvbXBpbGF0aW9uLT5jb2RlKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKKyAgICAgICAgICAg
ICAgICAgICAgZXhlY3V0YWJsZUFkZHJlc3MgPSBtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucy5hdChj
YWxsLmZ1bmN0aW9uSW5kZXggLSBtX3dhc21Ub1dhc21FeGl0U3R1YnMuc2l6ZSgpKS0+d2FzbUVu
dHJ5cG9pbnQuY29tcGlsYXRpb24tPmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOwogICAgICAg
ICAgICAgICAgIE1hY3JvQXNzZW1ibGVyOjpyZXBhdGNoQ2FsbChjYWxsLmNhbGxMb2NhdGlvbiwg
Q29kZUxvY2F0aW9uTGFiZWwoZXhlY3V0YWJsZUFkZHJlc3MpKTsKICAgICAgICAgICAgIH0KICAg
ICAgICAgfQpAQCAtMzI3LDcgKzMyNCw3IEBAIHZvaWQgUGxhbjo6Y29tcGxldGUoY29uc3QgQWJz
dHJhY3RMb2NrZXIKICAgICBpZiAobV9zdGF0ZSAhPSBTdGF0ZTo6Q29tcGxldGVkKSB7CiAgICAg
ICAgIG1vdmVUb1N0YXRlKFN0YXRlOjpDb21wbGV0ZWQpOwogICAgICAgICBmb3IgKGF1dG8mIHRh
c2sgOiBtX2NvbXBsZXRpb25UYXNrcykKLSAgICAgICAgICAgIHRhc2soKnRoaXMpOworICAgICAg
ICAgICAgdGFzay5zZWNvbmQoKnRhc2suZmlyc3QsICp0aGlzKTsKICAgICAgICAgbV9jb21wbGV0
ZWQubm90aWZ5QWxsKCk7CiAgICAgfQogfQpAQCAtMzQxLDEzICszMzgsMzIgQEAgdm9pZCBQbGFu
Ojp3YWl0Rm9yQ29tcGxldGlvbigpCiAgICAgfQogfQogCi12b2lkIFBsYW46OmNhbmNlbCgpCiti
b29sIFBsYW46OnRyeVJlbW92ZVZNQW5kQ2FuY2VsSWZMYXN0KFZNJiB2bSkKIHsKICAgICBMb2Nr
SG9sZGVyIGxvY2tlcihtX2xvY2spOwotICAgIGlmIChtX3N0YXRlICE9IFN0YXRlOjpDb21wbGV0
ZWQpIHsKKworICAgIGJvb2wgcmVtb3ZlZEFueVRhc2tzID0gZmFsc2U7CisgICAgbV9jb21wbGV0
aW9uVGFza3MucmVtb3ZlQWxsTWF0Y2hpbmcoWyZdIChjb25zdCBzdGQ6OnBhaXI8Vk0qLCBDb21w
bGV0aW9uVGFzaz4mIHBhaXIpIHsKKyAgICAgICAgYm9vbCBzaG91bGRSZW1vdmUgPSBwYWlyLmZp
cnN0ID09ICZ2bTsKKyAgICAgICAgcmVtb3ZlZEFueVRhc2tzIHw9IHNob3VsZFJlbW92ZTsKKyAg
ICAgICAgcmV0dXJuIHNob3VsZFJlbW92ZTsKKyAgICB9KTsKKworICAgIGlmICghcmVtb3ZlZEFu
eVRhc2tzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9zdGF0ZSA9PSBTdGF0
ZTo6Q29tcGxldGVkKSB7CisgICAgICAgIC8vIFdlIHRyaXZpYWxseSBjYW5jZWwgYW55dGhpbmcg
dGhhdCdzIGNvbXBsZXRlZC4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYg
KG1fY29tcGxldGlvblRhc2tzLmlzRW1wdHkoKSkgewogICAgICAgICBtX2N1cnJlbnRJbmRleCA9
IG1fbW9kdWxlSW5mb3JtYXRpb24tPmZ1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5zaXplKCk7CiAg
ICAgICAgIGZhaWwobG9ja2VyLCBBU0NJSUxpdGVyYWwoIldlYkFzc2VtYmx5IFBsYW4gd2FzIGNh
bmNlbGVkLiBJZiB5b3Ugc2VlIHRoaXMgZXJyb3IgbWVzc2FnZSBwbGVhc2UgZmlsZSBhIGJ1ZyBh
dCBidWdzLndlYmtpdC5vcmchIikpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisKKyAg
ICByZXR1cm4gZmFsc2U7CiB9CiAKIFBsYW46On5QbGFuKCkgeyB9CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93YXNtL1dhc21QbGFuLmgJKHJldmlzaW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDggKzQ1LDEw
IEBAIG5hbWVzcGFjZSBXYXNtIHsKIAogY2xhc3MgUGxhbiA6IHB1YmxpYyBUaHJlYWRTYWZlUmVm
Q291bnRlZDxQbGFuPiB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgZG9udEZpbmFsaXplKFBs
YW4mKSB7IH0KLSAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChQbGFuJik+IENvbXBsZXRp
b25UYXNrOworICAgIHN0YXRpYyB2b2lkIGRvbnRGaW5hbGl6ZShWTSYsIFBsYW4mKSB7IH0KKyAg
ICAvLyBUaGUgcGxhbiBtYXkgb3IgbWF5IG5vdCBiZSBudWxsLCBkZXBlbmRpbmcgb24gaG93IGEg
Q29tcGxldGlvblRhc2sKKyAgICAvLyBpcyBjYWxsZWQuIE9idmlvdXNseSBpZiB0aGUgcGxhbiBl
dmVyIGNhbGxzIHRoZSB0YXNrLCBpdCdsbCBiZSBub24tbnVsbC4KKyAgICB0eXBlZGVmIHN0ZDo6
ZnVuY3Rpb248dm9pZChWTSYsIFBsYW4mKT4gQ29tcGxldGlvblRhc2s7CiAgICAgZW51bSBBc3lu
Y1dvcmsgOiB1aW50OF90IHsgRnVsbENvbXBpbGUsIFZhbGlkYXRpb24gfTsKICAgICAvLyBOb3Rl
OiBDb21wbGV0aW9uVGFzayBzaG91bGQgbm90IGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIFBsYW4g
b3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgYSByZWZlcmVuY2UgY3ljbGUuCiAgICAgUGxhbihWTSYs
IFJlZjxNb2R1bGVJbmZvcm1hdGlvbj4sIEFzeW5jV29yaywgQ29tcGxldGlvblRhc2smJik7CkBA
IC01Niw3ICs1OCw5IEBAIHB1YmxpYzoKICAgICBKU19FWFBPUlRfUFJJVkFURSBQbGFuKFZNJiwg
Y29uc3QgdWludDhfdCosIHNpemVfdCwgQXN5bmNXb3JrLCBDb21wbGV0aW9uVGFzayYmKTsKICAg
ICBKU19FWFBPUlRfUFJJVkFURSB+UGxhbigpOwogCi0gICAgdm9pZCBhZGRDb21wbGV0aW9uVGFz
ayhDb21wbGV0aW9uVGFzayYmKTsKKyAgICAvLyBJZiB5b3UgZ3VhcmFudGVlIHRoZSBvcmRlcmlu
ZyBoZXJlLCB5b3UgY2FuIHJlbHkgb24gRklGTyBvZiB0aGUKKyAgICAvLyBjb21wbGV0aW9uIHRh
c2tzIGJlaW5nIGNhbGxlZC4KKyAgICB2b2lkIGFkZENvbXBsZXRpb25UYXNrKFZNJiwgQ29tcGxl
dGlvblRhc2smJik7CiAKICAgICBib29sIHBhcnNlQW5kVmFsaWRhdGVNb2R1bGUoKTsKIApAQCAt
OTEsMTUgKzk1LDE0IEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIFdURk1vdmUobV9jYWxsTGlu
a0luZm9zKTsKICAgICB9CiAKLSAgICBWZWN0b3I8V2FzbUV4aXRTdHVicz4mJiB0YWtlV2FzbUV4
aXRTdHVicygpCisgICAgVmVjdG9yPE1hY3JvQXNzZW1ibGVyQ29kZVJlZj4mJiB0YWtlV2FzbVRv
V2FzbUV4aXRTdHVicygpCiAgICAgewogICAgICAgICBSRUxFQVNFX0FTU0VSVCghZmFpbGVkKCkg
JiYgIWhhc1dvcmsoKSk7Ci0gICAgICAgIHJldHVybiBXVEZNb3ZlKG1fd2FzbUV4aXRTdHVicyk7
CisgICAgICAgIHJldHVybiBXVEZNb3ZlKG1fd2FzbVRvV2FzbUV4aXRTdHVicyk7CiAgICAgfQog
CiAgICAgdm9pZCBzZXRNb2RlKE1lbW9yeU1vZGUgbW9kZSkgeyBtX21vZGUgPSBtb2RlOyB9CiAg
ICAgTWVtb3J5TW9kZSBtb2RlKCkgY29uc3QgeyByZXR1cm4gbV9tb2RlOyB9Ci0gICAgVk0mIHZt
KCkgY29uc3QgeyByZXR1cm4gbV92bTsgfQogCiAgICAgZW51bSBjbGFzcyBTdGF0ZSA6IHVpbnQ4
X3QgewogICAgICAgICBJbml0aWFsLApAQCAtMTE2LDcgKzExOSw4IEBAIHB1YmxpYzoKICAgICBi
b29sIGhhc0JlZW5QcmVwYXJlZCgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUgPj0gU3RhdGU6OlBy
ZXBhcmVkOyB9CiAKICAgICB2b2lkIHdhaXRGb3JDb21wbGV0aW9uKCk7Ci0gICAgdm9pZCBjYW5j
ZWwoKTsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgaXQgY2FuY2VsbGVkIHRoZSBwbGFuLgorICAg
IGJvb2wgdHJ5UmVtb3ZlVk1BbmRDYW5jZWxJZkxhc3QoVk0mKTsKIAogcHJpdmF0ZToKICAgICBj
bGFzcyBUaHJlYWRDb3VudEhvbGRlcjsKQEAgLTEzMSwxMiArMTM1LDExIEBAIHByaXZhdGU6CiAK
ICAgICBSZWY8TW9kdWxlSW5mb3JtYXRpb24+IG1fbW9kdWxlSW5mb3JtYXRpb247CiAgICAgQmFn
PENhbGxMaW5rSW5mbz4gbV9jYWxsTGlua0luZm9zOwotICAgIFZlY3RvcjxXYXNtRXhpdFN0dWJz
PiBtX3dhc21FeGl0U3R1YnM7CisgICAgVmVjdG9yPE1hY3JvQXNzZW1ibGVyQ29kZVJlZj4gbV93
YXNtVG9XYXNtRXhpdFN0dWJzOwogICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8V2FzbUludGVy
bmFsRnVuY3Rpb24+PiBtX3dhc21JbnRlcm5hbEZ1bmN0aW9uczsKICAgICBWZWN0b3I8Q29tcGls
YXRpb25Db250ZXh0PiBtX2NvbXBpbGF0aW9uQ29udGV4dHM7CiAKLSAgICBWTSYgbV92bTsKLSAg
ICBWZWN0b3I8Q29tcGxldGlvblRhc2ssIDE+IG1fY29tcGxldGlvblRhc2tzOworICAgIFZlY3Rv
cjxzdGQ6OnBhaXI8Vk0qLCBDb21wbGV0aW9uVGFzaz4sIDE+IG1fY29tcGxldGlvblRhc2tzOwog
CiAgICAgVmVjdG9yPFZlY3RvcjxVbmxpbmtlZFdhc21Ub1dhc21DYWxsPj4gbV91bmxpbmtlZFdh
c21Ub1dhc21DYWxsczsKICAgICBjb25zdCB1aW50OF90KiBtX3NvdXJjZTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21Xb3JrbGlzdC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVdvcmtsaXN0LmNwcAkocmV2aXNpb24gMjE1MDU0
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVdvcmtsaXN0LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjE3LDE4ICsyMTcsMTkgQEAgdm9pZCBXb3JrbGlzdDo6c3RvcEFsbFBsYW5z
Rm9yVk0oVk0mIHZtKQogewogICAgIExvY2tIb2xkZXIgbG9ja2VyKCptX2xvY2spOwogICAgIGl0
ZXJhdGUobG9ja2VyLCBbJl0gKFF1ZXVlRWxlbWVudCYgZWxlbWVudCkgewotICAgICAgICBpZiAo
JmVsZW1lbnQucGxhbi0+dm0oKSA9PSAmdm0pIHsKLSAgICAgICAgICAgIGVsZW1lbnQucGxhbi0+
Y2FuY2VsKCk7CisgICAgICAgIGJvb2wgZGlkQ2FuY2VsID0gZWxlbWVudC5wbGFuLT50cnlSZW1v
dmVWTUFuZENhbmNlbElmTGFzdCh2bSk7CisgICAgICAgIGlmIChkaWRDYW5jZWwpCiAgICAgICAg
ICAgICByZXR1cm4gSXRlcmF0ZVJlc3VsdDo6RHJvcEFuZENvbnRpbnVlOwotICAgICAgICB9CiAg
ICAgICAgIHJldHVybiBJdGVyYXRlUmVzdWx0OjpDb250aW51ZTsKICAgICB9KTsKIAogICAgIGZv
ciAoYXV0byYgdGhyZWFkIDogbV90aHJlYWRzKSB7Ci0gICAgICAgIGlmICh0aHJlYWQtPmVsZW1l
bnQucGxhbiAmJiAmdGhyZWFkLT5lbGVtZW50LnBsYW4tPnZtKCkgPT0gJnZtKSB7Ci0gICAgICAg
ICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBkZWFkbG9ja2luZyBzaW5j
ZSB0aGUgdGhyZWFkIGNhbid0IGJsb2NrIHdpdGhvdXQgY2xlYXJpbmcgdGhlIHBsYW4gYW5kIG11
c3QgaG9sZCB0aGUgbG9jayB0byBkbyBzby4KLSAgICAgICAgICAgIHRocmVhZC0+ZWxlbWVudC5w
bGFuLT5jYW5jZWwoKTsKLSAgICAgICAgICAgIHRocmVhZC0+c3luY2hyb25pemUud2FpdCgqbV9s
b2NrKTsKKyAgICAgICAgaWYgKHRocmVhZC0+ZWxlbWVudC5wbGFuKSB7CisgICAgICAgICAgICBi
b29sIGRpZENhbmNlbCA9IHRocmVhZC0+ZWxlbWVudC5wbGFuLT50cnlSZW1vdmVWTUFuZENhbmNl
bElmTGFzdCh2bSk7CisgICAgICAgICAgICBpZiAoZGlkQ2FuY2VsKSB7CisgICAgICAgICAgICAg
ICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZGVhZGxvY2tpbmcgc2luY2Ug
dGhlIHRocmVhZCBjYW4ndCBibG9jayB3aXRob3V0IGNsZWFyaW5nIHRoZSBwbGFuIGFuZCBtdXN0
IGhvbGQgdGhlIGxvY2sgdG8gZG8gc28uCisgICAgICAgICAgICAgICAgdGhyZWFkLT5zeW5jaHJv
bml6ZS53YWl0KCptX2xvY2spOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUNvZGVCbG9j
ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJB
c3NlbWJseUNvZGVCbG9jay5jcHAJKHJldmlzaW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlDb2RlQmxvY2suY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zMiw1NSArMzIsMjcgQEAKICNpbmNsdWRlICJKU1dlYkFzc2VtYmx5TGlua0Vycm9yLmgi
CiAjaW5jbHVkZSAiSlNXZWJBc3NlbWJseU1lbW9yeS5oIgogI2luY2x1ZGUgIkpTV2ViQXNzZW1i
bHlNb2R1bGUuaCIKKyNpbmNsdWRlICJXYXNtQmluZGluZy5oIgogI2luY2x1ZGUgIldhc21QbGFu
SW5saW5lcy5oIgogCisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CisKIG5hbWVzcGFjZSBK
U0MgewogCiBjb25zdCBDbGFzc0luZm8gSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6c19pbmZvID0g
eyAiV2ViQXNzZW1ibHlDb2RlQmxvY2siLCBudWxscHRyLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxF
KEpTV2ViQXNzZW1ibHlDb2RlQmxvY2spIH07CiAKLUpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6OkpT
V2ViQXNzZW1ibHlDb2RlQmxvY2soVk0mIHZtLCBKU1dlYkFzc2VtYmx5TW9kdWxlKiBvd25lciwg
IFdhc206Ok1lbW9yeU1vZGUgbW9kZSwgUmVmPFdhc206OlBsYW4+JiYgcGxhbiwgdW5zaWduZWQg
Y2FsbGVlQ291bnQpCitKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpKU1dlYkFzc2VtYmx5Q29kZUJs
b2NrKFZNJiB2bSwgUmVmPFdhc206OkNvZGVCbG9jaz4mJiBjb2RlQmxvY2ssIGNvbnN0IFdhc206
Ok1vZHVsZUluZm9ybWF0aW9uJiBtb2R1bGVJbmZvcm1hdGlvbikKICAgICA6IEJhc2Uodm0sIHZt
LndlYkFzc2VtYmx5Q29kZUJsb2NrU3RydWN0dXJlLmdldCgpKQotICAgICwgbV9wbGFuKFdURk1v
dmUocGxhbikpCi0gICAgLCBtX21vZGUobW9kZSkKLSAgICAsIG1fY2FsbGVlQ291bnQoY2FsbGVl
Q291bnQpCi17Ci0gICAgbV9tb2R1bGUuc2V0KHZtLCB0aGlzLCBvd25lcik7Ci0gICAgQVNTRVJU
KCFtb2R1bGUoKS0+Y29kZUJsb2NrKG1vZGUpKTsKLSAgICBtb2R1bGUoKS0+c2V0Q29kZUJsb2Nr
KHZtLCBtb2RlLCB0aGlzKTsKLSAgICBtX2NhbGxlZXMucmVzaXplKG1fY2FsbGVlQ291bnQgKiAy
KTsKLX0KLQotdm9pZCBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjppbml0aWFsaXplKCkKKyAgICAs
IG1fY29kZUJsb2NrKFdURk1vdmUoY29kZUJsb2NrKSkKIHsKLSAgICBpZiAoaW5pdGlhbGl6ZWQo
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgVk0mIHZtID0gcGxhbigpLnZtKCk7Ci0gICAgQVNT
RVJUX1VOVVNFRCh2bSwgdm0uY3VycmVudFRocmVhZElzSG9sZGluZ0FQSUxvY2soKSk7Ci0gICAg
UkVMRUFTRV9BU1NFUlQoIXBsYW4oKS5oYXNXb3JrKCkpOwotCi0gICAgaWYgKHBsYW4oKS5mYWls
ZWQoKSkgewotICAgICAgICBtX2Vycm9yTWVzc2FnZSA9IHBsYW4oKS5lcnJvck1lc3NhZ2UoKTsK
LSAgICAgICAgbV9wbGFuID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuOworICAgIC8vIEZJWE1F
OiBXZSBzaG91bGQgbm90IG5lZWQgdG8gZG8gdGhpcyBzeW5jaHJvbm91c2x5LgorICAgIC8vIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzA1NjcKKyAgICBtX3dhc21U
b0pTRXhpdFN0dWJzLnJlc2VydmVDYXBhY2l0eShtX2NvZGVCbG9jay0+ZnVuY3Rpb25JbXBvcnRD
b3VudCgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGltcG9ydEluZGV4ID0gMDsgaW1wb3J0SW5kZXgg
PCBtX2NvZGVCbG9jay0+ZnVuY3Rpb25JbXBvcnRDb3VudCgpOyArK2ltcG9ydEluZGV4KSB7Cisg
ICAgICAgIFdhc206OlNpZ25hdHVyZUluZGV4IHNpZ25hdHVyZUluZGV4ID0gbW9kdWxlSW5mb3Jt
YXRpb24uaW1wb3J0RnVuY3Rpb25TaWduYXR1cmVJbmRpY2VzLmF0KGltcG9ydEluZGV4KTsKKyAg
ICAgICAgbV93YXNtVG9KU0V4aXRTdHVicy51bmNoZWNrZWRBcHBlbmQoV2FzbTo6d2FzbVRvSnMo
JnZtLCBtX2NhbGxMaW5rSW5mb3MsIHNpZ25hdHVyZUluZGV4LCBpbXBvcnRJbmRleCkpOworICAg
ICAgICBpbXBvcnRXYXNtVG9KU1N0dWIoaW1wb3J0SW5kZXgpID0gbV93YXNtVG9KU0V4aXRTdHVi
c1tpbXBvcnRJbmRleF0uY29kZSgpLmV4ZWN1dGFibGVBZGRyZXNzKCk7CiAgICAgfQotCi0gICAg
UkVMRUFTRV9BU1NFUlQocGxhbigpLm1vZGUoKSA9PSBtb2RlKCkpOwotICAgIEFTU0VSVChwbGFu
KCkuaW50ZXJuYWxGdW5jdGlvbkNvdW50KCkgPT0gbV9jYWxsZWVDb3VudCk7Ci0KLSAgICBtX2Nh
bGxMaW5rSW5mb3MgPSBwbGFuKCkudGFrZUNhbGxMaW5rSW5mb3MoKTsKLSAgICBtX3dhc21FeGl0
U3R1YnMgPSBwbGFuKCkudGFrZVdhc21FeGl0U3R1YnMoKTsKLQotICAgIC8vIFRoZSBjb2RlIGEg
bW9kdWxlIGVtaXRzIHRvIGNhbGwgaW50byBKUyByZWxpZXMgb24gdXMgdG8gc2V0IHRoaXMgdXAu
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fd2FzbUV4aXRTdHVicy5zaXplKCk7IGkr
KykKLSAgICAgICAgaW1wb3J0V2FzbVRvSlNTdHViKGkpID0gbV93YXNtRXhpdFN0dWJzW2ldLndh
c21Ub0pzLmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOwotCi0gICAgcGxhbigpLmluaXRpYWxp
emVDYWxsZWVzKFsmXSAodW5zaWduZWQgY2FsbGVlSW5kZXgsIFJlZjxXYXNtOjpDYWxsZWU+JiYg
anNFbnRyeXBvaW50Q2FsbGVlLCBSZWY8V2FzbTo6Q2FsbGVlPiYmIHdhc21FbnRyeXBvaW50Q2Fs
bGVlKSB7Ci0gICAgICAgIHNldEpTRW50cnlwb2ludENhbGxlZShjYWxsZWVJbmRleCwgV1RGTW92
ZShqc0VudHJ5cG9pbnRDYWxsZWUpKTsKLSAgICAgICAgc2V0V2FzbUVudHJ5cG9pbnRDYWxsZWUo
Y2FsbGVlSW5kZXgsIFdURk1vdmUod2FzbUVudHJ5cG9pbnRDYWxsZWUpKTsKLSAgICB9KTsKLQot
ICAgIG1fcGxhbiA9IG51bGxwdHI7CiB9CiAKIHZvaWQgSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6
ZGVzdHJveShKU0NlbGwqIGNlbGwpCkBAIC05MCwyNCArNjIsNyBAQCB2b2lkIEpTV2ViQXNzZW1i
bHlDb2RlQmxvY2s6OmRlc3Ryb3koSlNDCiAKIGJvb2wgSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6
aXNTYWZlVG9SdW4oSlNXZWJBc3NlbWJseU1lbW9yeSogbWVtb3J5KSBjb25zdAogewotICAgIGlm
ICghcnVubmFibGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgV2FzbTo6TWVtb3J5
TW9kZSBjb2RlTW9kZSA9IG1vZGUoKTsKLSAgICBXYXNtOjpNZW1vcnlNb2RlIG1lbW9yeU1vZGUg
PSBtZW1vcnktPm1lbW9yeSgpLm1vZGUoKTsKLSAgICBzd2l0Y2ggKGNvZGVNb2RlKSB7Ci0gICAg
Y2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpCb3VuZHNDaGVja2luZzoKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgY2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpTaWduYWxpbmc6Ci0gICAgICAgIC8vIENv
ZGUgYmVpbmcgaW4gU2lnbmFsaW5nIG1vZGUgbWVhbnMgdGhhdCBpdCBwZXJmb3JtcyBubyBib3Vu
ZHMgY2hlY2tzLgotICAgICAgICAvLyBJdHMgbWVtb3J5LCBldmVuIGlmIGVtcHR5LCBhYnNvbHV0
ZWx5IG11c3QgYWxzbyBiZSBpbiBTaWduYWxpbmcgbW9kZQotICAgICAgICAvLyBiZWNhdXNlIHRo
ZSBwYWdlIHByb3RlY3Rpb24gZGV0ZWN0cyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLgotICAgICAg
ICByZXR1cm4gbWVtb3J5TW9kZSA9PSBXYXNtOjpNZW1vcnlNb2RlOjpTaWduYWxpbmc7Ci0gICAg
Y2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpOdW1iZXJPZk1lbW9yeU1vZGVzOgotICAgICAgICBicmVh
azsKLSAgICB9Ci0gICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4g
ZmFsc2U7CisgICAgcmV0dXJuIG1fY29kZUJsb2NrLT5pc1NhZmVUb1J1bihtZW1vcnktPm1lbW9y
eSgpLm1vZGUoKSk7CiB9CiAKIHZvaWQgSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6dmlzaXRDaGls
ZHJlbihKU0NlbGwqIGNlbGwsIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUNvZGVCbG9jay5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlDb2RlQmxvY2su
aAkocmV2aXNpb24gMjE1MDU0KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNX
ZWJBc3NlbWJseUNvZGVCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw2ICszMyw3IEBACiAj
aW5jbHVkZSAiVW5jb25kaXRpb25hbEZpbmFsaXplci5oIgogI2luY2x1ZGUgIldhc21DYWxsZWUu
aCIKICNpbmNsdWRlICJXYXNtRm9ybWF0LmgiCisjaW5jbHVkZSAiV2FzbU1vZHVsZS5oIgogI2lu
Y2x1ZGUgPHd0Zi9CYWcuaD4KICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAKQEAgLTUwLDkgKzUx
LDkgQEAgcHVibGljOgogICAgIHR5cGVkZWYgSlNDZWxsIEJhc2U7CiAgICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gQmFzZTo6U3RydWN0dXJlRmxhZ3MgfCBTdHJ1Y3R1
cmVJc0ltbW9ydGFsOwogCi0gICAgc3RhdGljIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2sqIGNyZWF0
ZShWTSYgdm0sIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG93bmVyLCBXYXNtOjpNZW1vcnlNb2RlIG1v
ZGUsIFJlZjxXYXNtOjpQbGFuPiYmIHBsYW4sIHVuc2lnbmVkIGNhbGxlZUNvdW50LCB1bnNpZ25l
ZCBmdW5jdGlvbkltcG9ydENvdW50KQorICAgIHN0YXRpYyBKU1dlYkFzc2VtYmx5Q29kZUJsb2Nr
KiBjcmVhdGUoVk0mIHZtLCBSZWY8V2FzbTo6Q29kZUJsb2NrPiBjb2RlQmxvY2ssIGNvbnN0IFdh
c206Ok1vZHVsZUluZm9ybWF0aW9uJiBtb2R1bGVJbmZvcm1hdGlvbikKICAgICB7Ci0gICAgICAg
IGF1dG8qIHJlc3VsdCA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPEpTV2ViQXNzZW1ibHlD
b2RlQmxvY2s+KHZtLmhlYXAsIGFsbG9jYXRpb25TaXplKGZ1bmN0aW9uSW1wb3J0Q291bnQpKSkg
SlNXZWJBc3NlbWJseUNvZGVCbG9jayh2bSwgb3duZXIsIG1vZGUsIFdURk1vdmUocGxhbiksIGNh
bGxlZUNvdW50KTsKKyAgICAgICAgYXV0byogcmVzdWx0ID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0
ZUNlbGw8SlNXZWJBc3NlbWJseUNvZGVCbG9jaz4odm0uaGVhcCwgYWxsb2NhdGlvblNpemUobW9k
dWxlSW5mb3JtYXRpb24uaW1wb3J0RnVuY3Rpb25Db3VudCgpKSkpIEpTV2ViQXNzZW1ibHlDb2Rl
QmxvY2sodm0sIFdURk1vdmUoY29kZUJsb2NrKSwgbW9kdWxlSW5mb3JtYXRpb24pOwogICAgICAg
ICByZXN1bHQtPmZpbmlzaENyZWF0aW9uKHZtKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAg
ICB9CkBAIC02Miw0MCArNjMsMjUgQEAgcHVibGljOgogICAgICAgICByZXR1cm4gU3RydWN0dXJl
OjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG90eXBlLCBUeXBlSW5mbyhDZWxsVHlwZSwg
U3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwogICAgIH0KIAotICAgIHVuc2lnbmVkIGZ1bmN0aW9u
SW1wb3J0Q291bnQoKSBjb25zdCB7IHJldHVybiBtX3dhc21FeGl0U3R1YnMuc2l6ZSgpOyB9Ci0g
ICAgV2FzbTo6TWVtb3J5TW9kZSBtb2RlKCkgY29uc3QgeyByZXR1cm4gbV9tb2RlOyB9CisgICAg
dW5zaWduZWQgZnVuY3Rpb25JbXBvcnRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fY29kZUJsb2Nr
LT5mdW5jdGlvbkltcG9ydENvdW50KCk7IH0KICAgICBKU1dlYkFzc2VtYmx5TW9kdWxlKiBtb2R1
bGUoKSBjb25zdCB7IHJldHVybiBtX21vZHVsZS5nZXQoKTsgfQogCi0gICAgLy8gRG9uJ3QgY2Fs
bCBpbnRpYWxpemUgZGlyZWN0bHksIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmb3IgeW91LCBhcyBu
ZWVkZWQsIGJ5IEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6ZmluYWxpemVDcmVhdGlvbi4KLSAgICB2
b2lkIGluaXRpYWxpemUoKTsKLSAgICBib29sIGluaXRpYWxpemVkKCkgY29uc3QgeyByZXR1cm4g
IW1fcGxhbjsgfQotCi0gICAgV2FzbTo6UGxhbiYgcGxhbigpIGNvbnN0IHsgQVNTRVJUKCFpbml0
aWFsaXplZCgpKTsgcmV0dXJuICptX3BsYW47IH0KLQotICAgIGJvb2wgcnVubmFibGUoKSBjb25z
dCB7IHJldHVybiBpbml0aWFsaXplZCgpICYmICFtX2Vycm9yTWVzc2FnZTsgfQotICAgIFN0cmlu
ZyYgZXJyb3JNZXNzYWdlKCkgeyBBU1NFUlQoIXJ1bm5hYmxlKCkpOyByZXR1cm4gbV9lcnJvck1l
c3NhZ2U7IH0KICAgICBib29sIGlzU2FmZVRvUnVuKEpTV2ViQXNzZW1ibHlNZW1vcnkqKSBjb25z
dDsKIAogICAgIC8vIFRoZXNlIHR3byBjYWxsZWUgZ2V0dGVycyBhcmUgb25seSB2YWxpZCBvbmNl
IHRoZSBjYWxsZWVzIGhhdmUgYmVlbiBwb3B1bGF0ZWQuCisKICAgICBXYXNtOjpDYWxsZWUmIGpz
RW50cnlwb2ludENhbGxlZUZyb21GdW5jdGlvbkluZGV4U3BhY2UodW5zaWduZWQgZnVuY3Rpb25J
bmRleFNwYWNlKQogICAgIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoZnVuY3Rpb25JbmRleFNw
YWNlID49IGZ1bmN0aW9uSW1wb3J0Q291bnQoKSk7Ci0gICAgICAgIHVuc2lnbmVkIGNhbGxlZUlu
ZGV4ID0gZnVuY3Rpb25JbmRleFNwYWNlIC0gZnVuY3Rpb25JbXBvcnRDb3VudCgpOwotICAgICAg
ICBSRUxFQVNFX0FTU0VSVChjYWxsZWVJbmRleCA8IG1fY2FsbGVlQ291bnQpOwotICAgICAgICBy
ZXR1cm4gKm1fY2FsbGVlc1tjYWxsZWVJbmRleF0uZ2V0KCk7CisgICAgICAgIHJldHVybiBtX2Nv
ZGVCbG9jay0+anNFbnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZShmdW5jdGlv
bkluZGV4U3BhY2UpOwogICAgIH0KICAgICBXYXNtOjpDYWxsZWUmIHdhc21FbnRyeXBvaW50Q2Fs
bGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSh1bnNpZ25lZCBmdW5jdGlvbkluZGV4U3BhY2UpCiAg
ICAgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChmdW5jdGlvbkluZGV4U3BhY2UgPj0gZnVuY3Rp
b25JbXBvcnRDb3VudCgpKTsKLSAgICAgICAgdW5zaWduZWQgY2FsbGVlSW5kZXggPSBmdW5jdGlv
bkluZGV4U3BhY2UgLSBmdW5jdGlvbkltcG9ydENvdW50KCk7Ci0gICAgICAgIFJFTEVBU0VfQVNT
RVJUKGNhbGxlZUluZGV4IDwgbV9jYWxsZWVDb3VudCk7Ci0gICAgICAgIHJldHVybiAqbV9jYWxs
ZWVzW2NhbGxlZUluZGV4ICsgbV9jYWxsZWVDb3VudF0uZ2V0KCk7CisgICAgICAgIHJldHVybiBt
X2NvZGVCbG9jay0+d2FzbUVudHJ5cG9pbnRDYWxsZWVGcm9tRnVuY3Rpb25JbmRleFNwYWNlKGZ1
bmN0aW9uSW5kZXhTcGFjZSk7CiAgICAgfQogCiAgICAgdm9pZCogd2FzbVRvSnNDYWxsU3R1YkZv
ckltcG9ydCh1bnNpZ25lZCBpbXBvcnRJbmRleCkKICAgICB7Ci0gICAgICAgIFJFTEVBU0VfQVNT
RVJUKGltcG9ydEluZGV4IDwgbV93YXNtRXhpdFN0dWJzLnNpemUoKSk7Ci0gICAgICAgIHJldHVy
biBtX3dhc21FeGl0U3R1YnNbaW1wb3J0SW5kZXhdLndhc21Ub0pzLmNvZGUoKS5leGVjdXRhYmxl
QWRkcmVzcygpOworICAgICAgICByZXR1cm4gaW1wb3J0V2FzbVRvSlNTdHViKGltcG9ydEluZGV4
KTsKICAgICB9CiAKICAgICBzdGF0aWMgcHRyZGlmZl90IG9mZnNldE9mSW1wb3J0V2FzbVRvSlNT
dHViKHVuc2lnbmVkIGltcG9ydEluZGV4KQpAQCAtMTA0LDE4ICs5MCw3IEBAIHB1YmxpYzoKICAg
ICB9CiAKIHByaXZhdGU6Ci0gICAgdm9pZCBzZXRKU0VudHJ5cG9pbnRDYWxsZWUodW5zaWduZWQg
Y2FsbGVlSW5kZXgsIFJlZjxXYXNtOjpDYWxsZWU+JiYgY2FsbGVlKQotICAgIHsKLSAgICAgICAg
UkVMRUFTRV9BU1NFUlQoY2FsbGVlSW5kZXggPCBtX2NhbGxlZUNvdW50KTsKLSAgICAgICAgbV9j
YWxsZWVzW2NhbGxlZUluZGV4XSA9IFdURk1vdmUoY2FsbGVlKTsKLSAgICB9Ci0gICAgdm9pZCBz
ZXRXYXNtRW50cnlwb2ludENhbGxlZSh1bnNpZ25lZCBjYWxsZWVJbmRleCwgUmVmPFdhc206OkNh
bGxlZT4mJiBjYWxsZWUpCi0gICAgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChjYWxsZWVJbmRl
eCA8IG1fY2FsbGVlQ291bnQpOwotICAgICAgICBtX2NhbGxlZXNbY2FsbGVlSW5kZXggKyBtX2Nh
bGxlZUNvdW50XSA9IFdURk1vdmUoY2FsbGVlKTsKLSAgICB9Ci0KLSAgICBKU1dlYkFzc2VtYmx5
Q29kZUJsb2NrKFZNJiwgSlNXZWJBc3NlbWJseU1vZHVsZSosIFdhc206Ok1lbW9yeU1vZGUsIFJl
ZjxXYXNtOjpQbGFuPiYmLCB1bnNpZ25lZCBjYWxsZWVDb3VudCk7CisgICAgSlNXZWJBc3NlbWJs
eUNvZGVCbG9jayhWTSYsIFJlZjxXYXNtOjpDb2RlQmxvY2s+JiYsIGNvbnN0IFdhc206Ok1vZHVs
ZUluZm9ybWF0aW9uJik7CiAgICAgREVDTEFSRV9FWFBPUlRfSU5GTzsKICAgICBzdGF0aWMgY29u
c3QgYm9vbCBuZWVkc0Rlc3RydWN0aW9uID0gdHJ1ZTsKICAgICBzdGF0aWMgdm9pZCBkZXN0cm95
KEpTQ2VsbCopOwpAQCAtMTQxLDE1ICsxMTYsMTAgQEAgcHJpdmF0ZToKICAgICB9OwogCiAgICAg
V3JpdGVCYXJyaWVyPEpTV2ViQXNzZW1ibHlNb2R1bGU+IG1fbW9kdWxlOworICAgIFJlZjxXYXNt
OjpDb2RlQmxvY2s+IG1fY29kZUJsb2NrOworICAgIFZlY3RvcjxNYWNyb0Fzc2VtYmxlckNvZGVS
ZWY+IG1fd2FzbVRvSlNFeGl0U3R1YnM7CiAgICAgVW5jb25kaXRpb25hbEZpbmFsaXplciBtX3Vu
Y29uZGl0aW9uYWxGaW5hbGl6ZXI7CiAgICAgQmFnPENhbGxMaW5rSW5mbz4gbV9jYWxsTGlua0lu
Zm9zOwotICAgIFZlY3RvcjxXYXNtOjpXYXNtRXhpdFN0dWJzPiBtX3dhc21FeGl0U3R1YnM7Ci0g
ICAgVmVjdG9yPFJlZlB0cjxXYXNtOjpDYWxsZWU+PiBtX2NhbGxlZXM7Ci0gICAgLy8gVGhlIHBs
YW4gdGhhdCBpcyBjb21waWxpbmcgdGhpcyBjb2RlIGJsb2NrLgotICAgIFJlZlB0cjxXYXNtOjpQ
bGFuPiBtX3BsYW47Ci0gICAgU3RyaW5nIG1fZXJyb3JNZXNzYWdlOwotICAgIFdhc206Ok1lbW9y
eU1vZGUgbV9tb2RlOwotICAgIHVuc2lnbmVkIG1fY2FsbGVlQ291bnQ7CiB9OwogCiB9IC8vIG5h
bWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNz
ZW1ibHlJbnN0YW5jZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dh
c20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmNwcAkocmV2aXNpb24gMjE1MDU0KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtOTQsMjQgKzk0LDE3IEBAIHZvaWQgSlNXZWJBc3NlbWJseUluc3RhbmNl
Ojp2aXNpdENoaWxkcmUKICAgICAgICAgdmlzaXRvci5hcHBlbmQodGhpc09iamVjdC0+aW1wb3J0
RnVuY3Rpb25zKClbaV0pOwogfQogCi12b2lkIEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6YWRkVW5p
dGlhbGl6ZWRDb2RlQmxvY2soVk0mIHZtLCBSZWY8V2FzbTo6UGxhbj4gcGxhbikKLXsKLSAgICBh
dXRvKiBjb2RlQmxvY2sgPSBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpjcmVhdGUoCi0gICAgICAg
IHZtLCBtb2R1bGUoKSwgbWVtb3J5TW9kZSgpLCBXVEZNb3ZlKHBsYW4pLCBtb2R1bGUoKS0+bW9k
dWxlSW5mb3JtYXRpb24oKS5pbnRlcm5hbEZ1bmN0aW9uQ291bnQoKSwgbW9kdWxlKCktPm1vZHVs
ZUluZm9ybWF0aW9uKCkuaW1wb3J0RnVuY3Rpb25Db3VudCgpKTsKLSAgICBtX2NvZGVCbG9jay5z
ZXQodm0sIHRoaXMsIGNvZGVCbG9jayk7Ci0gICAgQVNTRVJUKCFjb2RlQmxvY2stPmluaXRpYWxp
emVkKCkpOwotfQotCi12b2lkIEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6ZmluYWxpemVDcmVhdGlv
bihWTSYgdm0sIEV4ZWNTdGF0ZSogZXhlYykKK3ZvaWQgSlNXZWJBc3NlbWJseUluc3RhbmNlOjpm
aW5hbGl6ZUNyZWF0aW9uKFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjLCBSZWY8V2FzbTo6Q29kZUJs
b2NrPiYmIHdhc21Db2RlQmxvY2spCiB7CiAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1df
U0NPUEUodm0pOwotICAgIGNvZGVCbG9jaygpLT5pbml0aWFsaXplKCk7Ci0KLSAgICBpZiAoIWNv
ZGVCbG9jaygpLT5ydW5uYWJsZSgpKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uKGV4ZWMsIHNj
b3BlLCBKU1dlYkFzc2VtYmx5TGlua0Vycm9yOjpjcmVhdGUoZXhlYywgdm0sIGdsb2JhbE9iamVj
dCgpLT5XZWJBc3NlbWJseUxpbmtFcnJvclN0cnVjdHVyZSgpLCBjb2RlQmxvY2soKS0+ZXJyb3JN
ZXNzYWdlKCkpKTsKKyAgICBpZiAoIXdhc21Db2RlQmxvY2stPnJ1bm5hYmxlKCkpIHsKKyAgICAg
ICAgdGhyb3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIEpTV2ViQXNzZW1ibHlMaW5rRXJyb3I6OmNy
ZWF0ZShleGVjLCB2bSwgZ2xvYmFsT2JqZWN0KCktPldlYkFzc2VtYmx5TGlua0Vycm9yU3RydWN0
dXJlKCksIHdhc21Db2RlQmxvY2stPmVycm9yTWVzc2FnZSgpKSk7CiAgICAgICAgIHJldHVybjsK
ICAgICB9Ci0gICAgUkVMRUFTRV9BU1NFUlQoY29kZUJsb2NrKCktPmlzU2FmZVRvUnVuKG1lbW9y
eSgpKSk7CisKKyAgICBSRUxFQVNFX0FTU0VSVCh3YXNtQ29kZUJsb2NrLT5pc1NhZmVUb1J1biht
ZW1vcnkoKS0+bWVtb3J5KCkubW9kZSgpKSk7CisgICAgbV9jb2RlQmxvY2suc2V0KHZtLCB0aGlz
LAorICAgICAgICBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpjcmVhdGUodm0sIHdhc21Db2RlQmxv
Y2suY29weVJlZigpLCBtX21vZHVsZS0+bW9kdWxlKCkubW9kdWxlSW5mb3JtYXRpb24oKSkpOwog
CiAgICAgYXV0byogbW9kdWxlUmVjb3JkID0ganNDYXN0PFdlYkFzc2VtYmx5TW9kdWxlUmVjb3Jk
Kj4obV9tb2R1bGVOYW1lc3BhY2VPYmplY3QtPm1vZHVsZVJlY29yZCgpKTsKICAgICBtb2R1bGVS
ZWNvcmQtPmxpbmsoZXhlYywgbW9kdWxlKCksIHRoaXMpOwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmgJKHJldmlz
aW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1i
bHlJbnN0YW5jZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSwxMSArMzksNiBAQCBjbGFzcyBKU01v
ZHVsZU5hbWVzcGFjZU9iamVjdDsKIGNsYXNzIEpTV2ViQXNzZW1ibHlNb2R1bGU7CiBjbGFzcyBX
ZWJBc3NlbWJseVRvSlNDYWxsZWU7CiAKLW5hbWVzcGFjZSBXYXNtIHsKLWNsYXNzIFBsYW47Ci19
Ci0KLQogY2xhc3MgSlNXZWJBc3NlbWJseUluc3RhbmNlIDogcHVibGljIEpTRGVzdHJ1Y3RpYmxl
T2JqZWN0IHsKIHB1YmxpYzoKICAgICB0eXBlZGVmIEpTRGVzdHJ1Y3RpYmxlT2JqZWN0IEJhc2U7
CkBAIC01NCw5ICs0OSw3IEBAIHB1YmxpYzoKICAgICBERUNMQVJFX0VYUE9SVF9JTkZPOwogCiAg
ICAgSlNXZWJBc3NlbWJseUNvZGVCbG9jayogY29kZUJsb2NrKCkgY29uc3QgeyByZXR1cm4gbV9j
b2RlQmxvY2suZ2V0KCk7IH0KLSAgICBib29sIGluaXRpYWxpemVkKCkgY29uc3QgeyByZXR1cm4g
Y29kZUJsb2NrKCkgJiYgY29kZUJsb2NrKCktPmluaXRpYWxpemVkKCk7IH0KLSAgICB2b2lkIGFk
ZFVuaXRpYWxpemVkQ29kZUJsb2NrKFZNJiwgUmVmPFdhc206OlBsYW4+KTsKLSAgICB2b2lkIGZp
bmFsaXplQ3JlYXRpb24oVk0mLCBFeGVjU3RhdGUqKTsKKyAgICB2b2lkIGZpbmFsaXplQ3JlYXRp
b24oVk0mLCBFeGVjU3RhdGUqLCBSZWY8V2FzbTo6Q29kZUJsb2NrPiYmKTsKIAogICAgIEpTV2Vi
QXNzZW1ibHlNb2R1bGUqIG1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fbW9kdWxlLmdldCgpOyB9
CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlNb2R1
bGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2Vi
QXNzZW1ibHlNb2R1bGUuY3BwCShyZXZpc2lvbiAyMTUwNTQpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5TW9kdWxlLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NDMsMTYgKzQzLDE1IEBAIG5hbWVzcGFjZSBKU0MgewogCiBjb25zdCBDbGFzc0luZm8gSlNXZWJB
c3NlbWJseU1vZHVsZTo6c19pbmZvID0geyAiV2ViQXNzZW1ibHkuTW9kdWxlIiwgJkJhc2U6OnNf
aW5mbywgbnVsbHB0ciwgQ1JFQVRFX01FVEhPRF9UQUJMRShKU1dlYkFzc2VtYmx5TW9kdWxlKSB9
OwogCi1KU1dlYkFzc2VtYmx5TW9kdWxlKiBKU1dlYkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdHVi
KFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgUmVmUHRyPFdh
c206OlBsYW4+JiYgcGxhbikKK0pTV2ViQXNzZW1ibHlNb2R1bGUqIEpTV2ViQXNzZW1ibHlNb2R1
bGU6OmNyZWF0ZVN0dWIoVk0mIHZtLCBFeGVjU3RhdGUqIGV4ZWMsIFN0cnVjdHVyZSogc3RydWN0
dXJlLCBXYXNtOjpNb2R1bGU6OlZhbGlkYXRpb25SZXN1bHQmJiByZXN1bHQpCiB7Ci0gICAgQVNT
RVJUKCFwbGFuLT5oYXNXb3JrKCkpOwogICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9XX1ND
T1BFKHZtKTsKLSAgICBpZiAocGxhbi0+ZmFpbGVkKCkpIHsKLSAgICAgICAgdGhyb3dFeGNlcHRp
b24oZXhlYywgc2NvcGUsIEpTV2ViQXNzZW1ibHlDb21waWxlRXJyb3I6OmNyZWF0ZShleGVjLCB2
bSwgc3RydWN0dXJlLT5nbG9iYWxPYmplY3QoKS0+V2ViQXNzZW1ibHlDb21waWxlRXJyb3JTdHJ1
Y3R1cmUoKSwgcGxhbi0+ZXJyb3JNZXNzYWdlKCkpKTsKKyAgICBpZiAoIXJlc3VsdC5oYXNWYWx1
ZSgpKSB7CisgICAgICAgIHRocm93RXhjZXB0aW9uKGV4ZWMsIHNjb3BlLCBKU1dlYkFzc2VtYmx5
Q29tcGlsZUVycm9yOjpjcmVhdGUoZXhlYywgdm0sIHN0cnVjdHVyZS0+Z2xvYmFsT2JqZWN0KCkt
PldlYkFzc2VtYmx5Q29tcGlsZUVycm9yU3RydWN0dXJlKCksIHJlc3VsdC5lcnJvcigpKSk7CiAg
ICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAotICAgIGF1dG8qIG1vZHVsZSA9IG5ldyAo
Tm90TnVsbCwgYWxsb2NhdGVDZWxsPEpTV2ViQXNzZW1ibHlNb2R1bGU+KHZtLmhlYXApKSBKU1dl
YkFzc2VtYmx5TW9kdWxlKHZtLCBzdHJ1Y3R1cmUsICpwbGFuLmdldCgpKTsKKyAgICBhdXRvKiBt
b2R1bGUgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxKU1dlYkFzc2VtYmx5TW9kdWxlPih2
bS5oZWFwKSkgSlNXZWJBc3NlbWJseU1vZHVsZSh2bSwgc3RydWN0dXJlLCByZXN1bHQudmFsdWUo
KS5yZWxlYXNlTm9uTnVsbCgpKTsKICAgICBtb2R1bGUtPmZpbmlzaENyZWF0aW9uKHZtKTsKICAg
ICByZXR1cm4gbW9kdWxlOwogfQpAQCAtNjIsOSArNjEsOSBAQCBTdHJ1Y3R1cmUqIEpTV2ViQXNz
ZW1ibHlNb2R1bGU6OmNyZWF0ZVN0CiAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBn
bG9iYWxPYmplY3QsIHByb3RvdHlwZSwgVHlwZUluZm8oT2JqZWN0VHlwZSwgU3RydWN0dXJlRmxh
Z3MpLCBpbmZvKCkpOwogfQogCi1KU1dlYkFzc2VtYmx5TW9kdWxlOjpKU1dlYkFzc2VtYmx5TW9k
dWxlKFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIFdhc206OlBsYW4mIHBsYW4pCitKU1dl
YkFzc2VtYmx5TW9kdWxlOjpKU1dlYkFzc2VtYmx5TW9kdWxlKFZNJiB2bSwgU3RydWN0dXJlKiBz
dHJ1Y3R1cmUsIFJlZjxXYXNtOjpNb2R1bGU+JiYgbW9kdWxlKQogICAgIDogQmFzZSh2bSwgc3Ry
dWN0dXJlKQotICAgICwgbV9tb2R1bGVJbmZvcm1hdGlvbihwbGFuLnRha2VNb2R1bGVJbmZvcm1h
dGlvbigpKQorICAgICwgbV9tb2R1bGUoV1RGTW92ZShtb2R1bGUpKQogewogfQogCkBAIC03NSw3
ICs3NCw4IEBAIHZvaWQgSlNXZWJBc3NlbWJseU1vZHVsZTo6ZmluaXNoQ3JlYXRpb24KIAogICAg
IC8vIE9uIHN1Y2Nlc3MsIGEgbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZSBvYmplY3QgaXMgcmV0dXJu
ZWQgd2l0aCBbW01vZHVsZV1dIHNldCB0byB0aGUgdmFsaWRhdGVkIEFzdC5tb2R1bGUuCiAgICAg
U3ltYm9sVGFibGUqIGV4cG9ydFN5bWJvbFRhYmxlID0gU3ltYm9sVGFibGU6OmNyZWF0ZSh2bSk7
Ci0gICAgZm9yIChhdXRvJiBleHAgOiBtX21vZHVsZUluZm9ybWF0aW9uLT5leHBvcnRzKSB7Cisg
ICAgY29uc3QgV2FzbTo6TW9kdWxlSW5mb3JtYXRpb24mIG1vZHVsZUluZm9ybWF0aW9uID0gbV9t
b2R1bGUtPm1vZHVsZUluZm9ybWF0aW9uKCk7CisgICAgZm9yIChhdXRvJiBleHAgOiBtb2R1bGVJ
bmZvcm1hdGlvbi5leHBvcnRzKSB7CiAgICAgICAgIGF1dG8gb2Zmc2V0ID0gZXhwb3J0U3ltYm9s
VGFibGUtPnRha2VOZXh0U2NvcGVPZmZzZXQoTm9Mb2NraW5nTmVjZXNzYXJ5KTsKICAgICAgICAg
U3RyaW5nIGZpZWxkID0gU3RyaW5nOjpmcm9tVVRGOChleHAuZmllbGQpOwogICAgICAgICBleHBv
cnRTeW1ib2xUYWJsZS0+c2V0KE5vTG9ja2luZ05lY2Vzc2FyeSwgQXRvbWljU3RyaW5nKGZpZWxk
KS5pbXBsKCksIFN5bWJvbFRhYmxlRW50cnkoVmFyT2Zmc2V0KG9mZnNldCkpKTsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlNb2R1bGUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5TW9kdWxl
LmgJKHJldmlzaW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pT
V2ViQXNzZW1ibHlNb2R1bGUuaAkod29ya2luZyBjb3B5KQpAQCAtMzEsNiArMzEsNyBAQAogI2lu
Y2x1ZGUgIkpTT2JqZWN0LmgiCiAjaW5jbHVkZSAiSlNXZWJBc3NlbWJseUNvZGVCbG9jay5oIgog
I2luY2x1ZGUgIlVuY29uZGl0aW9uYWxGaW5hbGl6ZXIuaCIKKyNpbmNsdWRlICJXYXNtTW9kdWxl
LmgiCiAjaW5jbHVkZSAiV2FzbU1vZHVsZUluZm9ybWF0aW9uLmgiCiAjaW5jbHVkZSA8d3RmL0Jh
Zy5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KQEAgLTQ5LDE2ICs1MCwxNiBAQCBjbGFzcyBK
U1dlYkFzc2VtYmx5TW9kdWxlIDogcHVibGljIEpTRGVzCiBwdWJsaWM6CiAgICAgdHlwZWRlZiBK
U0Rlc3RydWN0aWJsZU9iamVjdCBCYXNlOwogCi0gICAgc3RhdGljIEpTV2ViQXNzZW1ibHlNb2R1
bGUqIGNyZWF0ZVN0dWIoVk0mLCBFeGVjU3RhdGUqLCBTdHJ1Y3R1cmUqLCBSZWZQdHI8V2FzbTo6
UGxhbj4mJik7Ci0gICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKFZNJiwgSlNH
bG9iYWxPYmplY3QqLCBKU1ZhbHVlKTsKLQogICAgIERFQ0xBUkVfSU5GTzsKIAotICAgIGNvbnN0
IFdhc206Ok1vZHVsZUluZm9ybWF0aW9uJiBtb2R1bGVJbmZvcm1hdGlvbigpIGNvbnN0IHsgcmV0
dXJuIG1fbW9kdWxlSW5mb3JtYXRpb24uZ2V0KCk7IH0KKyAgICBzdGF0aWMgSlNXZWJBc3NlbWJs
eU1vZHVsZSogY3JlYXRlU3R1YihWTSYsIEV4ZWNTdGF0ZSosIFN0cnVjdHVyZSosIFdhc206Ok1v
ZHVsZTo6VmFsaWRhdGlvblJlc3VsdCYmKTsKKyAgICBzdGF0aWMgU3RydWN0dXJlKiBjcmVhdGVT
dHJ1Y3R1cmUoVk0mLCBKU0dsb2JhbE9iamVjdCosIEpTVmFsdWUpOworCisgICAgY29uc3QgV2Fz
bTo6TW9kdWxlSW5mb3JtYXRpb24mIG1vZHVsZUluZm9ybWF0aW9uKCkgY29uc3QgeyByZXR1cm4g
bV9tb2R1bGUtPm1vZHVsZUluZm9ybWF0aW9uKCk7IH0KICAgICBTeW1ib2xUYWJsZSogZXhwb3J0
U3ltYm9sVGFibGUoKSBjb25zdCB7IHJldHVybiBtX2V4cG9ydFN5bWJvbFRhYmxlLmdldCgpOyB9
CiAgICAgV2FzbTo6U2lnbmF0dXJlSW5kZXggc2lnbmF0dXJlSW5kZXhGcm9tRnVuY3Rpb25JbmRl
eFNwYWNlKHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFjZSkgY29uc3QKICAgICB7Ci0gICAgICAg
IHJldHVybiBtX21vZHVsZUluZm9ybWF0aW9uLT5zaWduYXR1cmVJbmRleEZyb21GdW5jdGlvbklu
ZGV4U3BhY2UoZnVuY3Rpb25JbmRleFNwYWNlKTsKKyAgICAgICAgcmV0dXJuIG1fbW9kdWxlLT5z
aWduYXR1cmVJbmRleEZyb21GdW5jdGlvbkluZGV4U3BhY2UoZnVuY3Rpb25JbmRleFNwYWNlKTsK
ICAgICB9CiAgICAgV2ViQXNzZW1ibHlUb0pTQ2FsbGVlKiBjYWxsZWUoKSBjb25zdCB7IHJldHVy
biBtX2NhbGxlZS5nZXQoKTsgfQogCkBAIC02NiwxNyArNjcsMTkgQEAgcHVibGljOgogCiAgICAg
Y29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtb2R1bGVJbmZv
cm1hdGlvbigpLnNvdXJjZTsgfQogCisgICAgV2FzbTo6TW9kdWxlJiBtb2R1bGUoKSB7IHJldHVy
biBtX21vZHVsZS5nZXQoKTsgfQorCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBKU1dlYkFz
c2VtYmx5Q29kZUJsb2NrOwogCiAgICAgdm9pZCBzZXRDb2RlQmxvY2soVk0mLCBXYXNtOjpNZW1v
cnlNb2RlLCBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrKik7CiAKLSAgICBKU1dlYkFzc2VtYmx5TW9k
dWxlKFZNJiwgU3RydWN0dXJlKiwgV2FzbTo6UGxhbiYpOworICAgIEpTV2ViQXNzZW1ibHlNb2R1
bGUoVk0mLCBTdHJ1Y3R1cmUqLCBSZWY8V2FzbTo6TW9kdWxlPiYmKTsKICAgICB2b2lkIGZpbmlz
aENyZWF0aW9uKFZNJik7CiAgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0NlbGwqKTsKICAgICBz
dGF0aWMgdm9pZCB2aXNpdENoaWxkcmVuKEpTQ2VsbCosIFNsb3RWaXNpdG9yJik7CiAKLSAgICBS
ZWY8V2FzbTo6TW9kdWxlSW5mb3JtYXRpb24+IG1fbW9kdWxlSW5mb3JtYXRpb247CisgICAgUmVm
PFdhc206Ok1vZHVsZT4gbV9tb2R1bGU7CiAgICAgV3JpdGVCYXJyaWVyPFN5bWJvbFRhYmxlPiBt
X2V4cG9ydFN5bWJvbFRhYmxlOwogICAgIFdyaXRlQmFycmllcjxKU1dlYkFzc2VtYmx5Q29kZUJs
b2NrPiBtX2NvZGVCbG9ja3NbV2FzbTo6TnVtYmVyT2ZNZW1vcnlNb2Rlc107CiAgICAgV3JpdGVC
YXJyaWVyPFdlYkFzc2VtYmx5VG9KU0NhbGxlZT4gbV9jYWxsZWU7CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseUZ1bmN0aW9uLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseUZ1bmN0aW9uLmNwcAko
cmV2aXNpb24gMjE1MDU0KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNz
ZW1ibHlGdW5jdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE1OSw2ICsxNTksOCBAQCBzdGF0
aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjYWxsCiAKIFdlYkFzc2VtYmx5RnVuY3Rp
b24qIFdlYkFzc2VtYmx5RnVuY3Rpb246OmNyZWF0ZShWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBn
bG9iYWxPYmplY3QsIHVuc2lnbmVkIGxlbmd0aCwgY29uc3QgU3RyaW5nJiBuYW1lLCBKU1dlYkFz
c2VtYmx5SW5zdGFuY2UqIGluc3RhbmNlLCBXYXNtOjpDYWxsZWUmIGpzRW50cnlwb2ludCwgV2Fz
bTo6Q2FsbGVlJiB3YXNtRW50cnlwb2ludCwgV2FzbTo6U2lnbmF0dXJlSW5kZXggc2lnbmF0dXJl
SW5kZXgpCiB7CisgICAgQVNTRVJUKCZqc0VudHJ5cG9pbnQgIT0gJndhc21FbnRyeXBvaW50KTsK
KwogICAgIE5hdGl2ZUV4ZWN1dGFibGUqIGV4ZWN1dGFibGUgPSB2bS5nZXRIb3N0RnVuY3Rpb24o
Y2FsbFdlYkFzc2VtYmx5RnVuY3Rpb24sIE5vSW50cmluc2ljLCBjYWxsSG9zdEZ1bmN0aW9uQXND
b25zdHJ1Y3RvciwgbnVsbHB0ciwgbmFtZSk7CiAgICAgU3RydWN0dXJlKiBzdHJ1Y3R1cmUgPSBn
bG9iYWxPYmplY3QtPndlYkFzc2VtYmx5RnVuY3Rpb25TdHJ1Y3R1cmUoKTsKICAgICBXZWJBc3Nl
bWJseUZ1bmN0aW9uKiBmdW5jdGlvbiA9IG5ldyAoTm90TnVsbCwgYWxsb2NhdGVDZWxsPFdlYkFz
c2VtYmx5RnVuY3Rpb24+KHZtLmhlYXApKSBXZWJBc3NlbWJseUZ1bmN0aW9uKHZtLCBnbG9iYWxP
YmplY3QsIHN0cnVjdHVyZSwganNFbnRyeXBvaW50LCB3YXNtRW50cnlwb2ludCwgc2lnbmF0dXJl
SW5kZXgpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlJ
bnN0YW5jZUNvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9qcy9XZWJBc3NlbWJseUluc3RhbmNlQ29uc3RydWN0b3IuY3BwCShyZXZpc2lvbiAy
MTUwNTQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseUluc3Rh
bmNlQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OCw3ICs1OCw3IEBAIHVzaW5n
IFdhc206OlBsYW47CiAKIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNvbnN0
cnVjdEpTV2ViQXNzZW1ibHlJbnN0YW5jZShFeGVjU3RhdGUqIGV4ZWMpCiB7Ci0gICAgYXV0byYg
dm0gPSBleGVjLT52bSgpOworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CiAgICAgYXV0byBzY29w
ZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOwogCiAgICAgLy8gSWYgbW9kdWxlT2JqZWN0IGlz
IG5vdCBhIFdlYkFzc2VtYmx5Lk1vZHVsZSBpbnN0YW5jZSwgYSBUeXBlRXJyb3IgaXMgdGhyb3du
LgpAQCAtNzgsMjYgKzc4LDggQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwg
Y29ucwogICAgIEpTV2ViQXNzZW1ibHlJbnN0YW5jZSogaW5zdGFuY2UgPSBKU1dlYkFzc2VtYmx5
SW5zdGFuY2U6OmNyZWF0ZSh2bSwgZXhlYywgbW9kdWxlLCBpbXBvcnRPYmplY3QsIGluc3RhbmNl
U3RydWN0dXJlKTsKICAgICBSRVRVUk5fSUZfRVhDRVBUSU9OKHNjb3BlLCB7IH0pOwogCi0gICAg
Ly8gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNhc2VzOgotICAgIC8vIDEpIFRoZSBpbnN0YW5j
ZSBhbHJlYWR5IGhhcyBhbiBpbml0aWFsaXplZCBDb2RlQmxvY2sgKHJ1bm5hYmxlKSwgc28gd2Ug
anVzdCBuZWVkIHRvIGZpbmFsaXplQ3JlYXRpb24uCi0gICAgLy8gMikgVGhlIGluc3RhbmNlIGhh
cyBubyBDb2RlQmxvY2ssIHNvIHdlIG5lZWQgdG8gbWFrZSBvbmUgYW5kIGNvbXBpbGUgdGhlIGNv
ZGUgZm9yIGl0LgotICAgIC8vIDMpIFRoZSBpbnN0YW5jZSBhbHJlYWR5IGhhcyBhbiB1bmluaXRp
YWxpemVkIENvZGVCbG9jaywgc28gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgY29tcGlsYXRpb24g
dG8gZmluaXNoLgotCi0gICAgaWYgKCFpbnN0YW5jZS0+aW5pdGlhbGl6ZWQoKSkgewotICAgICAg
ICBpZiAoaW5zdGFuY2UtPmNvZGVCbG9jaygpKQotICAgICAgICAgICAgV2FzbTo6ZW5zdXJlV29y
a2xpc3QoKS5jb21wbGV0ZVBsYW5TeW5jaHJvbm91c2x5KGluc3RhbmNlLT5jb2RlQmxvY2soKS0+
cGxhbigpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBSZWY8V2FzbTo6UGxhbj4gcGxh
biA9IGFkb3B0UmVmKCpuZXcgUGxhbih2bSwgbWFrZVJlZihjb25zdF9jYXN0PFdhc206Ok1vZHVs
ZUluZm9ybWF0aW9uJj4obW9kdWxlLT5tb2R1bGVJbmZvcm1hdGlvbigpKSksIFBsYW46OkZ1bGxD
b21waWxlLCBQbGFuOjpkb250RmluYWxpemUpKTsKLSAgICAgICAgICAgIHBsYW4tPnNldE1vZGUo
aW5zdGFuY2UtPm1lbW9yeU1vZGUoKSk7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+YWRkVW5pdGlh
bGl6ZWRDb2RlQmxvY2sodm0sIHBsYW4uY29weVJlZigpKTsKLQotICAgICAgICAgICAgYXV0byYg
d29ya2xpc3QgPSBXYXNtOjplbnN1cmVXb3JrbGlzdCgpOwotICAgICAgICAgICAgd29ya2xpc3Qu
ZW5xdWV1ZShwbGFuLmNvcHlSZWYoKSk7Ci0gICAgICAgICAgICB3b3JrbGlzdC5jb21wbGV0ZVBs
YW5TeW5jaHJvbm91c2x5KHBsYW4uZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW5z
dGFuY2UtPmZpbmFsaXplQ3JlYXRpb24odm0sIGV4ZWMpOworICAgIG1vZHVsZS0+bW9kdWxlKCku
Y29tcGlsZVN5bmModm0sIGluc3RhbmNlLT5tZW1vcnlNb2RlKCkpOworICAgIGluc3RhbmNlLT5m
aW5hbGl6ZUNyZWF0aW9uKHZtLCBleGVjLCBtb2R1bGUtPm1vZHVsZSgpLm5vbk51bGxDb2RlQmxv
Y2soaW5zdGFuY2UtPm1lbW9yeU1vZGUoKSkpOwogICAgIFJFVFVSTl9JRl9FWENFUFRJT04oc2Nv
cGUsIHsgfSk7CiAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShpbnN0YW5jZSk7CiB9CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVj
dG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJB
c3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gMjE1MDU0KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTc4LDEwICs3OCw3IEBAIEpTVmFsdWUgV2ViQXNzZW1ibHlNb2R1
bGVDb25zdHJ1Y3Rvcjo6Y3IKICAgICBWZWN0b3I8dWludDhfdD4gc291cmNlID0gY3JlYXRlU291
cmNlQnVmZmVyRnJvbVZhbHVlKHZtLCBleGVjLCBidWZmZXIpOwogICAgIFJFVFVSTl9JRl9FWENF
UFRJT04oc2NvcGUsIHsgfSk7CiAKLSAgICBSZWZQdHI8V2FzbTo6UGxhbj4gcGxhbiA9IGFkb3B0
UmVmKG5ldyBXYXNtOjpQbGFuKHZtLCBXVEZNb3ZlKHNvdXJjZSksIFdhc206OlBsYW46OlZhbGlk
YXRpb24sIFdhc206OlBsYW46OmRvbnRGaW5hbGl6ZSkpOwotICAgIGlmICghcGxhbi0+cGFyc2VB
bmRWYWxpZGF0ZU1vZHVsZSgpKQotICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oZXhlYywg
c2NvcGUsIEpTV2ViQXNzZW1ibHlDb21waWxlRXJyb3I6OmNyZWF0ZShleGVjLCB2bSwgZXhlYy0+
bGV4aWNhbEdsb2JhbE9iamVjdCgpLT5XZWJBc3NlbWJseUNvbXBpbGVFcnJvclN0cnVjdHVyZSgp
LCBwbGFuLT5lcnJvck1lc3NhZ2UoKSkpOwotICAgIHJldHVybiBKU1dlYkFzc2VtYmx5TW9kdWxl
OjpjcmVhdGVTdHViKHZtLCBleGVjLCBzdHJ1Y3R1cmUsIFdURk1vdmUocGxhbikpOworICAgIHJl
dHVybiBKU1dlYkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdHViKHZtLCBleGVjLCBzdHJ1Y3R1cmUs
IFdhc206Ok1vZHVsZTo6dmFsaWRhdGVTeW5jKHZtLCBXVEZNb3ZlKHNvdXJjZSkpKTsKIH0KIAog
V2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3RvciogV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rv
cjo6Y3JlYXRlKFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIFdlYkFzc2VtYmx5TW9kdWxl
UHJvdG90eXBlKiB0aGlzUHJvdG90eXBlKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dh
c20vanMvV2ViQXNzZW1ibHlQcm90b3R5cGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5UHJvdG90eXBlLmNwcAkocmV2aXNpb24gMjE1
MDU0KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlQcm90b3R5
cGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02NSwxMyArNjUsMTIgQEAgY29uc3QgQ2xhc3NJbmZv
IFdlYkFzc2VtYmx5UHJvdG90eXBlOjpzXwogIEBlbmQKICAqLwogCi1zdGF0aWMgRW5jb2RlZEpT
VmFsdWUgcmVqZWN0KEV4ZWNTdGF0ZSogZXhlYywgQ2F0Y2hTY29wZSYgY2F0Y2hTY29wZSwgSlNQ
cm9taXNlRGVmZXJyZWQqIHByb21pc2UpCitzdGF0aWMgdm9pZCByZWplY3QoRXhlY1N0YXRlKiBl
eGVjLCBDYXRjaFNjb3BlJiBjYXRjaFNjb3BlLCBKU1Byb21pc2VEZWZlcnJlZCogcHJvbWlzZSkK
IHsKICAgICBFeGNlcHRpb24qIGV4Y2VwdGlvbiA9IGNhdGNoU2NvcGUuZXhjZXB0aW9uKCk7CiAg
ICAgQVNTRVJUKGV4Y2VwdGlvbik7CiAgICAgY2F0Y2hTY29wZS5jbGVhckV4Y2VwdGlvbigpOwog
ICAgIHByb21pc2UtPnJlamVjdChleGVjLCBleGNlcHRpb24tPnZhbHVlKCkpOwotICAgIHJldHVy
biBKU1ZhbHVlOjplbmNvZGUocHJvbWlzZS0+cHJvbWlzZSgpKTsKIH0KIAogc3RhdGljIEVuY29k
ZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlDb21waWxlRnVuYyhFeGVjU3RhdGUq
IGV4ZWMpCkBAIC05MCwxMyArODksMTEgQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NU
X0NBTEwgd2ViQQogICAgIGRlcGVuZGVuY2llcy5hcHBlbmQoU3Ryb25nPEpTQ2VsbD4odm0sIGds
b2JhbE9iamVjdCkpOwogICAgIHZtLnByb21pc2VEZWZlcnJlZFRpbWVyLT5hZGRQZW5kaW5nUHJv
bWlzZShwcm9taXNlLCBXVEZNb3ZlKGRlcGVuZGVuY2llcykpOwogCi0gICAgUmVmPFBsYW4+IHBs
YW4gPSBhZG9wdFJlZigqbmV3IFBsYW4odm0sIFdURk1vdmUoc291cmNlKSwgUGxhbjo6VmFsaWRh
dGlvbiwgW3Byb21pc2UsIGdsb2JhbE9iamVjdF0gKFBsYW4mIHApIG11dGFibGUgewotICAgICAg
ICBSZWZQdHI8UGxhbj4gcGxhbiA9IG1ha2VSZWYocCk7Ci0gICAgICAgIHAudm0oKS5wcm9taXNl
RGVmZXJyZWRUaW1lci0+c2NoZWR1bGVXb3JrU29vbihwcm9taXNlLCBbcHJvbWlzZSwgZ2xvYmFs
T2JqZWN0LCBwbGFuID0gV1RGTW92ZShwbGFuKV0gKCkgbXV0YWJsZSB7Ci0gICAgICAgICAgICBW
TSYgdm0gPSBwbGFuLT52bSgpOworICAgIFdhc206Ok1vZHVsZTo6dmFsaWRhdGVBc3luYyh2bSwg
V1RGTW92ZShzb3VyY2UpLCBbcHJvbWlzZSwgZ2xvYmFsT2JqZWN0XSAoVk0mIHZtLCBXYXNtOjpN
b2R1bGU6OlZhbGlkYXRpb25SZXN1bHQmJiByZXN1bHQpIG11dGFibGUgeworICAgICAgICB2bS5w
cm9taXNlRGVmZXJyZWRUaW1lci0+c2NoZWR1bGVXb3JrU29vbihwcm9taXNlLCBbcHJvbWlzZSwg
Z2xvYmFsT2JqZWN0LCByZXN1bHQgPSBXVEZNb3ZlKHJlc3VsdCksICZ2bV0gKCkgbXV0YWJsZSB7
CiAgICAgICAgICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9DQVRDSF9TQ09QRSh2bSk7CiAgICAg
ICAgICAgICBFeGVjU3RhdGUqIGV4ZWMgPSBnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKTsKLSAg
ICAgICAgICAgIEpTVmFsdWUgbW9kdWxlID0gSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1
Yih2bSwgZXhlYywgZ2xvYmFsT2JqZWN0LT5XZWJBc3NlbWJseU1vZHVsZVN0cnVjdHVyZSgpLCBX
VEZNb3ZlKHBsYW4pKTsKKyAgICAgICAgICAgIEpTVmFsdWUgbW9kdWxlID0gSlNXZWJBc3NlbWJs
eU1vZHVsZTo6Y3JlYXRlU3R1Yih2bSwgZXhlYywgZ2xvYmFsT2JqZWN0LT5XZWJBc3NlbWJseU1v
ZHVsZVN0cnVjdHVyZSgpLCBXVEZNb3ZlKHJlc3VsdCkpOwogICAgICAgICAgICAgaWYgKHNjb3Bl
LmV4Y2VwdGlvbigpKSB7CiAgICAgICAgICAgICAgICAgcmVqZWN0KGV4ZWMsIHNjb3BlLCBwcm9t
aXNlKTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xMDQsMjMgKzEwMSwyMiBAQCBzdGF0
aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCB3ZWJBCiAKICAgICAgICAgICAgIHByb21p
c2UtPnJlc29sdmUoZXhlYywgbW9kdWxlKTsKICAgICAgICAgfSk7Ci0gICAgfSkpOworICAgIH0p
OwogCi0gICAgV2FzbTo6ZW5zdXJlV29ya2xpc3QoKS5lbnF1ZXVlKFdURk1vdmUocGxhbikpOwog
ICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUocHJvbWlzZS0+cHJvbWlzZSgpKTsKIH0KIAogZW51
bSBjbGFzcyBSZXNvbHZlIHsgV2l0aEluc3RhbmNlLCBXaXRoTW9kdWxlQW5kSW5zdGFuY2UgfTsK
LXN0YXRpYyB2b2lkIHJlc29sdmUoVk0mIHZtLCBFeGVjU3RhdGUqIGV4ZWMsIEpTUHJvbWlzZURl
ZmVycmVkKiBwcm9taXNlLCBKU1dlYkFzc2VtYmx5SW5zdGFuY2UqIGluc3RhbmNlLCBKU1dlYkFz
c2VtYmx5TW9kdWxlKiBtb2R1bGUsIFJlc29sdmUgZW50cmllcykKK3N0YXRpYyB2b2lkIHJlc29s
dmUoVk0mIHZtLCBFeGVjU3RhdGUqIGV4ZWMsIEpTUHJvbWlzZURlZmVycmVkKiBwcm9taXNlLCBK
U1dlYkFzc2VtYmx5SW5zdGFuY2UqIGluc3RhbmNlLCBKU1dlYkFzc2VtYmx5TW9kdWxlKiBtb2R1
bGUsIFJlc29sdmUgcmVzb2x2ZUtpbmQpCiB7CiAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfQ0FU
Q0hfU0NPUEUodm0pOwotICAgIGluc3RhbmNlLT5maW5hbGl6ZUNyZWF0aW9uKHZtLCBleGVjKTsK
KyAgICBpbnN0YW5jZS0+ZmluYWxpemVDcmVhdGlvbih2bSwgZXhlYywgbW9kdWxlLT5tb2R1bGUo
KS5ub25OdWxsQ29kZUJsb2NrKGluc3RhbmNlLT5tZW1vcnlNb2RlKCkpKTsKICAgICBpZiAoc2Nv
cGUuZXhjZXB0aW9uKCkpIHsKICAgICAgICAgcmVqZWN0KGV4ZWMsIHNjb3BlLCBwcm9taXNlKTsK
ICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChlbnRyaWVzID09IFJlc29sdmU6Oldp
dGhJbnN0YW5jZSkKKyAgICBpZiAocmVzb2x2ZUtpbmQgPT0gUmVzb2x2ZTo6V2l0aEluc3RhbmNl
KQogICAgICAgICBwcm9taXNlLT5yZXNvbHZlKGV4ZWMsIGluc3RhbmNlKTsKICAgICBlbHNlIHsK
ICAgICAgICAgSlNPYmplY3QqIHJlc3VsdCA9IGNvbnN0cnVjdEVtcHR5T2JqZWN0KGV4ZWMpOwpA
QCAtMTMwLDcgKzEyNiw3IEBAIHN0YXRpYyB2b2lkIHJlc29sdmUoVk0mIHZtLCBFeGVjU3RhdGUq
IGUKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKFZNJiB2bSwgRXhlY1N0YXRl
KiBleGVjLCBKU1Byb21pc2VEZWZlcnJlZCogcHJvbWlzZSwgSlNXZWJBc3NlbWJseU1vZHVsZSog
bW9kdWxlLCBKU09iamVjdCogaW1wb3J0T2JqZWN0LCBSZXNvbHZlIGVudHJpZXMpCitzdGF0aWMg
dm9pZCBpbnN0YW50aWF0ZShWTSYgdm0sIEV4ZWNTdGF0ZSogZXhlYywgSlNQcm9taXNlRGVmZXJy
ZWQqIHByb21pc2UsIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1vZHVsZSwgSlNPYmplY3QqIGltcG9y
dE9iamVjdCwgUmVzb2x2ZSByZXNvbHZlS2luZCkKIHsKICAgICBhdXRvIHNjb3BlID0gREVDTEFS
RV9DQVRDSF9TQ09QRSh2bSk7CiAgICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgcG90ZW50aWFsbHkg
cmVjb21waWxpbmcgYSBtb2R1bGUuIFdlIGZpcnN0IGdhdGhlciBhbGwgdGhlIGltcG9ydC9tZW1v
cnkgaW5mb3JtYXRpb24gcHJpb3IgdG8gY29tcGlsaW5nIGNvZGUuCkBAIC0xNDAsNDcgKzEzNiwx
NyBAQCBzdGF0aWMgdm9pZCBpbnN0YW50aWF0ZShWTSYgdm0sIEV4ZWNTdGF0CiAgICAgICAgIHJl
dHVybjsKICAgICB9CiAKLSAgICAvLyBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY2FzZXM6Ci0g
ICAgLy8gMSkgVGhlIGluc3RhbmNlIGFscmVhZHkgaGFzIGFuIGluaXRpYWxpemVkIENvZGVCbG9j
aywgc28gd2UgaGF2ZSBubyBtb3JlIHdvcmsgdG8gZG8uCi0gICAgLy8gMikgVGhlIGluc3RhbmNl
IGhhcyBubyBDb2RlQmxvY2ssIHNvIHdlIG5lZWQgdG8gbWFrZSBvbmUgYW5kIGNvbXBpbGUgdGhl
IGNvZGUgZm9yIGl0LgotICAgIC8vIDMpIFRoZSBpbnN0YW5jZSBhbHJlYWR5IGhhcyBhbiB1bmlu
aXRpYWxpemVkIENvZGVCbG9jaywgc28gc29tZW9uZSBlbHNlIGlzIGNvbXBpbGluZyBjb2RlIGFu
ZCB3ZSBqdXN0IG5lZWQgdG8gd2FpdCBmb3IgdGhlbS4KLQotICAgIGlmIChpbnN0YW5jZS0+aW5p
dGlhbGl6ZWQoKSkgewotICAgICAgICByZXNvbHZlKHZtLCBleGVjLCBwcm9taXNlLCBpbnN0YW5j
ZSwgbW9kdWxlLCBlbnRyaWVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIFZlY3Rv
cjxTdHJvbmc8SlNDZWxsPj4gZGVwZW5kZW5jaWVzOwogICAgIC8vIFRoZSBpbnN0YW5jZSBrZWVw
cyB0aGUgbW9kdWxlIGFsaXZlLgogICAgIGRlcGVuZGVuY2llcy5hcHBlbmQoU3Ryb25nPEpTQ2Vs
bD4odm0sIGluc3RhbmNlKSk7CiAgICAgdm0ucHJvbWlzZURlZmVycmVkVGltZXItPmFkZFBlbmRp
bmdQcm9taXNlKHByb21pc2UsIFdURk1vdmUoZGVwZW5kZW5jaWVzKSk7Ci0KLSAgICBpZiAoaW5z
dGFuY2UtPmNvZGVCbG9jaygpKSB7Ci0gICAgICAgIGluc3RhbmNlLT5jb2RlQmxvY2soKS0+cGxh
bigpLmFkZENvbXBsZXRpb25UYXNrKFtwcm9taXNlLCBpbnN0YW5jZSwgbW9kdWxlLCBlbnRyaWVz
XSAoUGxhbiYgcCkgewotICAgICAgICAgICAgUmVmUHRyPFBsYW4+IHBsYW4gPSBtYWtlUmVmKHAp
OwotICAgICAgICAgICAgcC52bSgpLnByb21pc2VEZWZlcnJlZFRpbWVyLT5zY2hlZHVsZVdvcmtT
b29uKHByb21pc2UsIFtwcm9taXNlLCBpbnN0YW5jZSwgbW9kdWxlLCBlbnRyaWVzLCBwbGFuID0g
V1RGTW92ZShwbGFuKV0gKCkgewotICAgICAgICAgICAgICAgIEV4ZWNTdGF0ZSogZXhlYyA9IGlu
c3RhbmNlLT5nbG9iYWxPYmplY3QoKS0+Z2xvYmFsRXhlYygpOwotICAgICAgICAgICAgICAgIHJl
c29sdmUocGxhbi0+dm0oKSwgZXhlYywgcHJvbWlzZSwgaW5zdGFuY2UsIG1vZHVsZSwgZW50cmll
cyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0gICAgQVNTRVJUKCFpbnN0YW5jZS0+Y29kZUJsb2NrKCkpOwotCi0gICAgLy8gRklYTUU6IFRo
aXMgcmUtcGFyc2VzIHRoZSBtb2R1bGUgaGVhZGVyLCB3aGljaCBzaG91bGRuJ3QgYmUgbmVjZXNz
YXJ5LgotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzAy
MDUKLSAgICBSZWY8UGxhbj4gcGxhbiA9IGFkb3B0UmVmKCpuZXcgUGxhbih2bSwgbWFrZVJlZihj
b25zdF9jYXN0PFdhc206Ok1vZHVsZUluZm9ybWF0aW9uJj4obW9kdWxlLT5tb2R1bGVJbmZvcm1h
dGlvbigpKSksIFBsYW46OkZ1bGxDb21waWxlLCBbcHJvbWlzZSwgaW5zdGFuY2UsIG1vZHVsZSwg
ZW50cmllc10gKFBsYW4mIHApIHsKLSAgICAgICAgUmVmUHRyPFBsYW4+IHBsYW4gPSBtYWtlUmVm
KHApOwotICAgICAgICBwLnZtKCkucHJvbWlzZURlZmVycmVkVGltZXItPnNjaGVkdWxlV29ya1Nv
b24ocHJvbWlzZSwgW3Byb21pc2UsIGluc3RhbmNlLCBtb2R1bGUsIGVudHJpZXMsIHBsYW4gPSBX
VEZNb3ZlKHBsYW4pXSAoKSB7Ci0gICAgICAgICAgICBWTSYgdm0gPSBwbGFuLT52bSgpOworICAg
IC8vIE5vdGU6IFRoaXMgY29tcGxldGlvbiB0YXNrIG1heSBvciBtYXkgbm90IGdldCBjYWxsZWQg
aW1tZWRpYXRlbHkuCisgICAgbW9kdWxlLT5tb2R1bGUoKS5jb21waWxlQXN5bmModm0sIGluc3Rh
bmNlLT5tZW1vcnlNb2RlKCksIFtwcm9taXNlLCBpbnN0YW5jZSwgbW9kdWxlLCByZXNvbHZlS2lu
ZF0gKFZNJiB2bSkgeworICAgICAgICB2bS5wcm9taXNlRGVmZXJyZWRUaW1lci0+c2NoZWR1bGVX
b3JrU29vbihwcm9taXNlLCBbcHJvbWlzZSwgaW5zdGFuY2UsIG1vZHVsZSwgcmVzb2x2ZUtpbmQs
ICZ2bV0gKCkgewogICAgICAgICAgICAgRXhlY1N0YXRlKiBleGVjID0gaW5zdGFuY2UtPmdsb2Jh
bE9iamVjdCgpLT5nbG9iYWxFeGVjKCk7Ci0gICAgICAgICAgICByZXNvbHZlKHZtLCBleGVjLCBw
cm9taXNlLCBpbnN0YW5jZSwgbW9kdWxlLCBlbnRyaWVzKTsKKyAgICAgICAgICAgIHJlc29sdmUo
dm0sIGV4ZWMsIHByb21pc2UsIGluc3RhbmNlLCBtb2R1bGUsIHJlc29sdmVLaW5kKTsKICAgICAg
ICAgfSk7Ci0gICAgfSkpOwotCi0gICAgaW5zdGFuY2UtPmFkZFVuaXRpYWxpemVkQ29kZUJsb2Nr
KHZtLCBwbGFuLmNvcHlSZWYoKSk7Ci0gICAgcGxhbi0+c2V0TW9kZShpbnN0YW5jZS0+bWVtb3J5
TW9kZSgpKTsKLSAgICBXYXNtOjplbnN1cmVXb3JrbGlzdCgpLmVucXVldWUoV1RGTW92ZShwbGFu
KSk7CisgICAgfSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbXBpbGVBbmRJbnN0YW50aWF0ZShWTSYg
dm0sIEV4ZWNTdGF0ZSogZXhlYywgSlNQcm9taXNlRGVmZXJyZWQqIHByb21pc2UsIEpTVmFsdWUg
YnVmZmVyLCBKU09iamVjdCogaW1wb3J0T2JqZWN0KQpAQCAtMTk1LDEzICsxNjEsMTEgQEAgc3Rh
dGljIHZvaWQgY29tcGlsZUFuZEluc3RhbnRpYXRlKFZNJiB2bQogICAgIGRlcGVuZGVuY2llcy5h
cHBlbmQoU3Ryb25nPEpTQ2VsbD4odm0sIGltcG9ydE9iamVjdCkpOwogICAgIHZtLnByb21pc2VE
ZWZlcnJlZFRpbWVyLT5hZGRQZW5kaW5nUHJvbWlzZShwcm9taXNlLCBXVEZNb3ZlKGRlcGVuZGVu
Y2llcykpOwogCi0gICAgUmVmPFBsYW4+IHBsYW4gPSBhZG9wdFJlZigqbmV3IFBsYW4odm0sIFdU
Rk1vdmUoc291cmNlKSwgUGxhbjo6VmFsaWRhdGlvbiwgW3Byb21pc2UsIGltcG9ydE9iamVjdCwg
Z2xvYmFsT2JqZWN0XSAoUGxhbiYgcCkgbXV0YWJsZSB7Ci0gICAgICAgIFJlZlB0cjxQbGFuPiBw
bGFuID0gbWFrZVJlZihwKTsKLSAgICAgICAgcC52bSgpLnByb21pc2VEZWZlcnJlZFRpbWVyLT5z
Y2hlZHVsZVdvcmtTb29uKHByb21pc2UsIFtwcm9taXNlLCBpbXBvcnRPYmplY3QsIGdsb2JhbE9i
amVjdCwgcGxhbiA9IFdURk1vdmUocGxhbildICgpIG11dGFibGUgewotICAgICAgICAgICAgVk0m
IHZtID0gcGxhbi0+dm0oKTsKKyAgICBXYXNtOjpNb2R1bGU6OnZhbGlkYXRlQXN5bmModm0sIFdU
Rk1vdmUoc291cmNlKSwgW3Byb21pc2UsIGltcG9ydE9iamVjdCwgZ2xvYmFsT2JqZWN0XSAoVk0m
IHZtLCBXYXNtOjpNb2R1bGU6OlZhbGlkYXRpb25SZXN1bHQmJiByZXN1bHQpIG11dGFibGUgewor
ICAgICAgICB2bS5wcm9taXNlRGVmZXJyZWRUaW1lci0+c2NoZWR1bGVXb3JrU29vbihwcm9taXNl
LCBbcHJvbWlzZSwgaW1wb3J0T2JqZWN0LCBnbG9iYWxPYmplY3QsIHJlc3VsdCA9IFdURk1vdmUo
cmVzdWx0KSwgJnZtXSAoKSBtdXRhYmxlIHsKICAgICAgICAgICAgIGF1dG8gc2NvcGUgPSBERUNM
QVJFX0NBVENIX1NDT1BFKHZtKTsKICAgICAgICAgICAgIEV4ZWNTdGF0ZSogZXhlYyA9IGdsb2Jh
bE9iamVjdC0+Z2xvYmFsRXhlYygpOwotICAgICAgICAgICAgSlNXZWJBc3NlbWJseU1vZHVsZSog
bW9kdWxlID0gSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1Yih2bSwgZXhlYywgZ2xvYmFs
T2JqZWN0LT5XZWJBc3NlbWJseU1vZHVsZVN0cnVjdHVyZSgpLCBwbGFuLmNvcHlSZWYoKSk7Cisg
ICAgICAgICAgICBKU1dlYkFzc2VtYmx5TW9kdWxlKiBtb2R1bGUgPSBKU1dlYkFzc2VtYmx5TW9k
dWxlOjpjcmVhdGVTdHViKHZtLCBleGVjLCBnbG9iYWxPYmplY3QtPldlYkFzc2VtYmx5TW9kdWxl
U3RydWN0dXJlKCksIFdURk1vdmUocmVzdWx0KSk7CiAgICAgICAgICAgICBpZiAoc2NvcGUuZXhj
ZXB0aW9uKCkpIHsKICAgICAgICAgICAgICAgICByZWplY3QoZXhlYywgc2NvcGUsIHByb21pc2Up
OwogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTIwOSw5ICsxNzMsNyBAQCBzdGF0aWMgdm9p
ZCBjb21waWxlQW5kSW5zdGFudGlhdGUoVk0mIHZtCiAKICAgICAgICAgICAgIGluc3RhbnRpYXRl
KHZtLCBleGVjLCBwcm9taXNlLCBtb2R1bGUsIGltcG9ydE9iamVjdCwgUmVzb2x2ZTo6V2l0aE1v
ZHVsZUFuZEluc3RhbmNlKTsKICAgICAgICAgfSk7Ci0gICAgfSkpOwotCi0gICAgV2FzbTo6ZW5z
dXJlV29ya2xpc3QoKS5lbnF1ZXVlKFdURk1vdmUocGxhbikpOworICAgIH0pOwogfQogCiBzdGF0
aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCB3ZWJBc3NlbWJseUluc3RhbnRpYXRlRnVu
YyhFeGVjU3RhdGUqIGV4ZWMpCg==
</data>
<flag name="review"
          id="327782"
          type_id="1"
          status="-"
          setter="keith_miller"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>306480</attachid>
            <date>2017-04-07 02:34:37 -0700</date>
            <delta_ts>2017-04-07 08:53:06 -0700</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>82213</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjE1MDg3KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzMyBA
QAorMjAxNy0wNC0wNyAgU2FhbSBCYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KKworICAgICAg
ICBXZWJBc3NlbWJseTogTWFrZSB0byBhIGNvbXBpbGF0aW9uIEFQSSB0aGF0IGFsbG93cyBmb3Ig
bXVsdGktVk0gY29uY3VycmVudCBjb21waWxhdGlvbnMgb2YgV2FzbSBNb2R1bGVzCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzA0ODgKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGFkZHMg
YSBjbGFzcyBjYWxsZWQgV2FzbTo6TW9kdWxlLiBJdCBjb250YWlucyB0aGUgYml0cyBmcm9tCisg
ICAgICAgIEpTV2ViQXNzZW1ibHlNb2R1bGUgdGhhdCB3ZXJlIG5vdCBWTSBzcGVjaWZpYy4gSlNX
ZWJBc3NlbWJseU1vZHVsZQorICAgICAgICBub3cgaGFzIGEgUmVmPFdhc206Ok1vZHVsZT4uIFNp
bWlsYXJseSwgdGhlcmUgaXMgbm93IGEgV2FzbTo6Q29kZUJsb2NrLAorICAgICAgICB3aGljaCBv
d25zIHRoZSBub24tVk0tc3BlY2lmaWMgYml0cyB0aGF0IEpTV2ViQXNzZW1ibHlDb2RlQmxvY2sg
dXNlZAorICAgICAgICB0byBvd24uCisgICAgICAgIAorICAgICAgICBUaGlzIHBhdGNoIGFsc28g
c2ltcGxpZmllcyBob3cgd2UgdmVyaWZ5IGFuZCBjb21waWxlIGNvZGUuIFdhc206Ok1vZHVsZQor
ICAgICAgICBub3cgaGFzIGFuIEFQSSBmb3IgYm90aCBzeW5jL2FzeW5jIHZhbGlkYXRpb24gYW5k
IGNvbXBpbGF0aW9uLiBUaGlzCisgICAgICAgIEFQSSBhYnN0cmFjdHMgYXdheSBob3cgV2FzbTo6
UGxhbiB3b3Jrcy4KKyAgICAgICAgCisgICAgICAgIFRoaXMgaXMgaG9wZWZ1bGx5IHRoZSBsYXN0
IHBhdGNoIG5lZWRlZCBiZWZvcmUgd2UgY2FuIGltcGxlbWVudAorICAgICAgICB3aW5kb3cucG9z
dE1lc3NhZ2UgZm9yIGEgSlNXZWJBc3NlbWJseU1vZHVsZS4gSSB0aGluayBhbGwgdGhhdCdzCisg
ICAgICAgIG5lZWRlZCBub3cgdG8gaW1wbGVtZW50IHBvc3RNZXNzYWdlIGlzIHNpbXBseSBjcmVh
dGluZyBhIG5ldworICAgICAgICBKU1dlYkFzc2VtYmx5TW9kdWxlIHdpdGggdGhlIHVuZGVybHlp
bmcgV2FzbTo6TW9kdWxlLgorICAgICAgICAKKyAgICAgICAgVGhpcyBwYXRjaCBpcyBuZXV0cmFs
IG9uIFdhc21CZW5jaC4KKyAgICAgICAgCisgICAgICAgIEZpbmFsbHksIHRoaXMgcGF0Y2ggY2hh
bmdlcyB0aGUgcHJvbWlzZSBkZWZlcnJlZCB0aW1lciB0bworICAgICAgICBhbGxvdyBmb3IgbmV3
IHRhc2tzIHRvIGJlIGFkZGVkIHdoaWxlIHdlJ3JlIGV4ZWN1dGluZworICAgICAgICBhIHRhc2su
IEJlZm9yZSwgd2UnZCBkZWFkbG9jayBpZiB0aGlzIGhhcHBlbmVkLgorCisgICAgICAgICogQ01h
a2VMaXN0cy50eHQ6CisgICAgICAgICogSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvajoKKyAgICAgICAgKiBqc2MuY3BwOgorICAgICAgICAoZnVuY3Rpb25UZXN0V2FzbU1v
ZHVsZUZ1bmN0aW9ucyk6CisgICAgICAgICogcnVudGltZS9Qcm9taXNlRGVmZXJyZWRUaW1lci5j
cHA6CisgICAgICAgIChKU0M6OlByb21pc2VEZWZlcnJlZFRpbWVyOjpkb1dvcmspOgorICAgICAg
ICAoSlNDOjpQcm9taXNlRGVmZXJyZWRUaW1lcjo6c2NoZWR1bGVXb3JrU29vbik6CisgICAgICAg
ICogcnVudGltZS9Qcm9taXNlRGVmZXJyZWRUaW1lci5oOgorICAgICAgICAqIHdhc20vV2FzbUIz
SVJHZW5lcmF0b3IuY3BwOgorICAgICAgICAqIHdhc20vV2FzbUJpbmRpbmcuY3BwOgorICAgICAg
ICAoSlNDOjpXYXNtOjp3YXNtVG9Kcyk6CisgICAgICAgIChKU0M6Oldhc206Ondhc21Ub1dhc20p
OgorICAgICAgICAoSlNDOjpXYXNtOjpleGl0U3R1YkdlbmVyYXRvcik6IERlbGV0ZWQuCisgICAg
ICAgICogd2FzbS9XYXNtQmluZGluZy5oOgorICAgICAgICAqIHdhc20vV2FzbUNvZGVCbG9jay5j
cHA6IEFkZGVkLgorICAgICAgICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6OkNvZGVCbG9jayk6Cisg
ICAgICAgIChKU0M6Oldhc206OkNvZGVCbG9jazo6d2FpdFVudGlsRmluaXNoZWQpOgorICAgICAg
ICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6OmNvbXBpbGVBc3luYyk6CisgICAgICAgIChKU0M6Oldh
c206OkNvZGVCbG9jazo6aXNTYWZlVG9SdW4pOgorICAgICAgICAqIHdhc20vV2FzbUNvZGVCbG9j
ay5oOiBBZGRlZC4KKyAgICAgICAgKEpTQzo6V2FzbTo6Q29kZUJsb2NrOjpjcmVhdGUpOgorICAg
ICAgICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6OmNvbXBpbGF0aW9uRmluaXNoZWQpOgorICAgICAg
ICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6OnJ1bm5hYmxlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6
Q29kZUJsb2NrOjplcnJvck1lc3NhZ2UpOgorICAgICAgICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6
OmZ1bmN0aW9uSW1wb3J0Q291bnQpOgorICAgICAgICAoSlNDOjpXYXNtOjpDb2RlQmxvY2s6Ompz
RW50cnlwb2ludENhbGxlZUZyb21GdW5jdGlvbkluZGV4U3BhY2UpOgorICAgICAgICAoSlNDOjpX
YXNtOjpDb2RlQmxvY2s6Ondhc21FbnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFj
ZSk6CisgICAgICAgICogd2FzbS9XYXNtTW9kdWxlLmNwcDogQWRkZWQuCisgICAgICAgIChKU0M6
Oldhc206Ok1vZHVsZTo6TW9kdWxlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6bWFrZVZhbGlkYXRp
b25SZXN1bHQpOgorICAgICAgICAoSlNDOjpXYXNtOjpNb2R1bGU6OnZhbGlkYXRlU3luY0ltcGwp
OgorICAgICAgICAoSlNDOjpXYXNtOjpNb2R1bGU6OmdldE9yQ3JlYXRlQ29kZUJsb2NrKToKKyAg
ICAgICAgKEpTQzo6V2FzbTo6TW9kdWxlOjpjb21waWxlU3luYyk6CisgICAgICAgIChKU0M6Oldh
c206Ok1vZHVsZTo6bWFrZVZhbGlkYXRpb25DYWxsYmFjayk6CisgICAgICAgIChKU0M6Oldhc206
Ok1vZHVsZTo6Y29tcGlsZUFzeW5jKToKKyAgICAgICAgKiB3YXNtL1dhc21Nb2R1bGUuaDogQWRk
ZWQuCisgICAgICAgIChKU0M6Oldhc206Ok1vZHVsZTo6Y3JlYXRlKToKKyAgICAgICAgKEpTQzo6
V2FzbTo6TW9kdWxlOjp2YWxpZGF0ZVN5bmMpOgorICAgICAgICAoSlNDOjpXYXNtOjpNb2R1bGU6
OnZhbGlkYXRlQXN5bmMpOgorICAgICAgICAoSlNDOjpXYXNtOjpNb2R1bGU6OnNpZ25hdHVyZUlu
ZGV4RnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSk6CisgICAgICAgIChKU0M6Oldhc206Ok1vZHVsZTo6
bW9kdWxlSW5mb3JtYXRpb24pOgorICAgICAgICAoSlNDOjpXYXNtOjpNb2R1bGU6Om5vbk51bGxD
b2RlQmxvY2spOgorICAgICAgICAqIHdhc20vV2FzbVBsYW4uY3BwOgorICAgICAgICAoSlNDOjpX
YXNtOjpQbGFuOjpQbGFuKToKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6YWRkQ29tcGxldGlv
blRhc2spOgorICAgICAgICAoSlNDOjpXYXNtOjpQbGFuOjpwcmVwYXJlKToKKyAgICAgICAgKEpT
Qzo6V2FzbTo6UGxhbjo6Y29tcGlsZUZ1bmN0aW9ucyk6CisgICAgICAgIChKU0M6Oldhc206OlBs
YW46OmNvbXBsZXRlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6dHJ5UmVtb3ZlVk1BbmRD
YW5jZWxJZkxhc3QpOgorICAgICAgICAoSlNDOjpXYXNtOjpQbGFuOjpjYW5jZWwpOiBEZWxldGVk
LgorICAgICAgICAqIHdhc20vV2FzbVBsYW4uaDoKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6
ZG9udEZpbmFsaXplKToKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6dGFrZVdhc21Ub1dhc21F
eGl0U3R1YnMpOgorICAgICAgICAoSlNDOjpXYXNtOjpQbGFuOjptb2RlKToKKyAgICAgICAgKEpT
Qzo6V2FzbTo6UGxhbjo6dGFrZVdhc21FeGl0U3R1YnMpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpXYXNtOjpQbGFuOjp2bSk6IERlbGV0ZWQuCisgICAgICAgICogd2FzbS9XYXNtV29ya2xpc3Qu
Y3BwOgorICAgICAgICAoSlNDOjpXYXNtOjpXb3JrbGlzdDo6c3RvcEFsbFBsYW5zRm9yVk0pOgor
ICAgICAgICAqIHdhc20vanMvSlNXZWJBc3NlbWJseUNvZGVCbG9jay5jcHA6CisgICAgICAgIChK
U0M6OkpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6OkpTV2ViQXNzZW1ibHlDb2RlQmxvY2spOgorICAg
ICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjppc1NhZmVUb1J1bik6CisgICAgICAg
IChKU0M6OkpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6OmluaXRpYWxpemUpOiBEZWxldGVkLgorICAg
ICAgICAqIHdhc20vanMvSlNXZWJBc3NlbWJseUNvZGVCbG9jay5oOgorICAgICAgICAoSlNDOjpK
U1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpjcmVhdGUpOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2Vt
Ymx5Q29kZUJsb2NrOjpmdW5jdGlvbkltcG9ydENvdW50KToKKyAgICAgICAgKEpTQzo6SlNXZWJB
c3NlbWJseUNvZGVCbG9jazo6anNFbnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFj
ZSk6CisgICAgICAgIChKU0M6OkpTV2ViQXNzZW1ibHlDb2RlQmxvY2s6Ondhc21FbnRyeXBvaW50
Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSk6CisgICAgICAgIChKU0M6OkpTV2ViQXNzZW1i
bHlDb2RlQmxvY2s6Ondhc21Ub0pzQ2FsbFN0dWJGb3JJbXBvcnQpOgorICAgICAgICAoSlNDOjpK
U1dlYkFzc2VtYmx5Q29kZUJsb2NrOjptb2RlKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6SlNX
ZWJBc3NlbWJseUNvZGVCbG9jazo6aW5pdGlhbGl6ZWQpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpwbGFuKTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6
SlNXZWJBc3NlbWJseUNvZGVCbG9jazo6cnVubmFibGUpOiBEZWxldGVkLgorICAgICAgICAoSlND
OjpKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjplcnJvck1lc3NhZ2UpOiBEZWxldGVkLgorICAgICAg
ICAoSlNDOjpKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpzZXRKU0VudHJ5cG9pbnRDYWxsZWUpOiBE
ZWxldGVkLgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpzZXRXYXNtRW50
cnlwb2ludENhbGxlZSk6IERlbGV0ZWQuCisgICAgICAgICogd2FzbS9qcy9KU1dlYkFzc2VtYmx5
SW5zdGFuY2UuY3BwOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmZpbmFs
aXplQ3JlYXRpb24pOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmFkZFVu
aXRpYWxpemVkQ29kZUJsb2NrKTogRGVsZXRlZC4KKyAgICAgICAgKiB3YXNtL2pzL0pTV2ViQXNz
ZW1ibHlJbnN0YW5jZS5oOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5SW5zdGFuY2U6Omlu
aXRpYWxpemVkKTogRGVsZXRlZC4KKyAgICAgICAgKiB3YXNtL2pzL0pTV2ViQXNzZW1ibHlNb2R1
bGUuY3BwOgorICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5TW9kdWxlOjpjcmVhdGVTdHViKToK
KyAgICAgICAgKEpTQzo6SlNXZWJBc3NlbWJseU1vZHVsZTo6SlNXZWJBc3NlbWJseU1vZHVsZSk6
CisgICAgICAgIChKU0M6OkpTV2ViQXNzZW1ibHlNb2R1bGU6OmZpbmlzaENyZWF0aW9uKToKKyAg
ICAgICAgKiB3YXNtL2pzL0pTV2ViQXNzZW1ibHlNb2R1bGUuaDoKKyAgICAgICAgKEpTQzo6SlNX
ZWJBc3NlbWJseU1vZHVsZTo6bW9kdWxlSW5mb3JtYXRpb24pOgorICAgICAgICAoSlNDOjpKU1dl
YkFzc2VtYmx5TW9kdWxlOjpzaWduYXR1cmVJbmRleEZyb21GdW5jdGlvbkluZGV4U3BhY2UpOgor
ICAgICAgICAoSlNDOjpKU1dlYkFzc2VtYmx5TW9kdWxlOjptb2R1bGUpOgorICAgICAgICAqIHdh
c20vanMvV2ViQXNzZW1ibHlGdW5jdGlvbi5jcHA6CisgICAgICAgIChKU0M6OldlYkFzc2VtYmx5
RnVuY3Rpb246OmNyZWF0ZSk6CisgICAgICAgICogd2FzbS9qcy9XZWJBc3NlbWJseUluc3RhbmNl
Q29uc3RydWN0b3IuY3BwOgorICAgICAgICAoSlNDOjpjb25zdHJ1Y3RKU1dlYkFzc2VtYmx5SW5z
dGFuY2UpOgorICAgICAgICAqIHdhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5j
cHA6CisgICAgICAgIChKU0M6OldlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3I6OmNyZWF0ZU1v
ZHVsZSk6CisgICAgICAgICogd2FzbS9qcy9XZWJBc3NlbWJseVByb3RvdHlwZS5jcHA6CisgICAg
ICAgIChKU0M6OnJlamVjdCk6CisgICAgICAgIChKU0M6OndlYkFzc2VtYmx5Q29tcGlsZUZ1bmMp
OgorICAgICAgICAoSlNDOjpyZXNvbHZlKToKKyAgICAgICAgKEpTQzo6aW5zdGFudGlhdGUpOgor
ICAgICAgICAoSlNDOjpjb21waWxlQW5kSW5zdGFudGlhdGUpOgorICAgICAgICAoSlNDOjp3ZWJB
c3NlbWJseVZhbGlkYXRlRnVuYyk6CisKIDIwMTctMDQtMDYgIEZpbGlwIFBpemxvICA8ZnBpemxv
QGFwcGxlLmNvbT4KIAogICAgICAgICBSZW5hbWUgYWxsb2NhdGVTdGFjayB0byBhbGxvY2F0ZVN0
YWNrQnlHcmFwaENvbG9yaW5nLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlz
dHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4
dAkocmV2aXNpb24gMjE1MDU0KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMu
dHh0CSh3b3JraW5nIGNvcHkpCkBAIC05NDMsNiArOTQzLDcgQEAgc2V0KEphdmFTY3JpcHRDb3Jl
X1NPVVJDRVMKICAgICB3YXNtL1dhc21Gb3JtYXQuY3BwCiAgICAgd2FzbS9XYXNtTWVtb3J5LmNw
cAogICAgIHdhc20vV2FzbU1lbW9yeUluZm9ybWF0aW9uLmNwcAorICAgIHdhc20vV2FzbU1vZHVs
ZS5jcHAKICAgICB3YXNtL1dhc21Nb2R1bGVJbmZvcm1hdGlvbi5jcHAKICAgICB3YXNtL1dhc21N
b2R1bGVQYXJzZXIuY3BwCiAgICAgd2FzbS9XYXNtUGFnZUNvdW50LmNwcApJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2pzYy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2pzYy5jcHAJKHJldmlzaW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9q
c2MuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMTkxLDcgKzMxOTEsNyBAQCBzdGF0aWMgRW5jb2Rl
ZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jCiAgICAgaWYgKGV4ZWMtPmFyZ3VtZW50Q291bnQo
KSAhPSBmdW5jdGlvbkNvdW50ICsgMikKICAgICAgICAgQ1JBU0goKTsKIAotICAgIFJlZjxXYXNt
OjpQbGFuPiBwbGFuID0gYWRvcHRSZWYoKm5ldyBXYXNtOjpQbGFuKHZtLCBzdGF0aWNfY2FzdDx1
aW50OF90Kj4oc291cmNlLT52ZWN0b3IoKSksIHNvdXJjZS0+bGVuZ3RoKCksIFdhc206OlBsYW46
OkZ1bGxDb21waWxlLCBXYXNtOjpQbGFuOjpkb250RmluYWxpemUpKTsKKyAgICBSZWY8V2FzbTo6
UGxhbj4gcGxhbiA9IGFkb3B0UmVmKCpuZXcgV2FzbTo6UGxhbih2bSwgc3RhdGljX2Nhc3Q8dWlu
dDhfdCo+KHNvdXJjZS0+dmVjdG9yKCkpLCBzb3VyY2UtPmxlbmd0aCgpLCBXYXNtOjpQbGFuOjpG
dWxsQ29tcGlsZSwgV2FzbTo6UGxhbjo6ZG9udEZpbmFsaXplKCkpKTsKICAgICBXYXNtOjplbnN1
cmVXb3JrbGlzdCgpLmVucXVldWUocGxhbi5jb3B5UmVmKCkpOwogICAgIFdhc206OmVuc3VyZVdv
cmtsaXN0KCkuY29tcGxldGVQbGFuU3luY2hyb25vdXNseShwbGFuLmdldCgpKTsKICAgICBpZiAo
cGxhbi0+ZmFpbGVkKCkpIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZp
c2lvbiAyMTUwNTQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTMyMSw2ICsxMzIxLDgg
QEAKIAkJNTI2NzhGOEUxQTAzMTAwOTAwNkEzMDZEIC8qIEJhc2ljQmxvY2tMb2NhdGlvbi5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1MjY3OEY4QzFB
MDMxMDA5MDA2QTMwNkQgLyogQmFzaWNCbG9ja0xvY2F0aW9uLmNwcCAqLzsgfTsKIAkJNTI2NzhG
OEYxQTAzMTAwOTAwNkEzMDZEIC8qIEJhc2ljQmxvY2tMb2NhdGlvbi5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNTI2NzhGOEQxQTAzMTAwOTAwNkEzMDZE
IC8qIEJhc2ljQmxvY2tMb2NhdGlvbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFBy
aXZhdGUsICk7IH07IH07CiAJCTUyNjc4RjkxMUEwNDE3N0MwMDZBMzA2RCAvKiBDb250cm9sRmxv
d1Byb2ZpbGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA1MjY3OEY5MDFBMDQxNzdDMDA2QTMwNkQgLyogQ29udHJvbEZsb3dQcm9maWxlci5oICovOyBz
ZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCTUyNkFDNEI2MUU5
NzdDNUQwMDM1MDBFMSAvKiBXYXNtQ29kZUJsb2NrLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDUyNkFDNEI0MUU5NzdDNUQwMDM1MDBFMSAvKiBXYXNt
Q29kZUJsb2NrLmNwcCAqLzsgfTsKKwkJNTI2QUM0QjcxRTk3N0M1RDAwMzUwMEUxIC8qIFdhc21D
b2RlQmxvY2suaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDUyNkFDNEI1MUU5NzdDNUQwMDM1MDBFMSAvKiBXYXNtQ29kZUJsb2NrLmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJNTI3NzczREUxQUFGODNBQzAw
QkRFN0U4IC8qIFJ1bnRpbWVUeXBlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDUyNzc3M0REMUFBRjgzQUMwMEJERTdFOCAvKiBSdW50aW1lVHlwZS5j
cHAgKi87IH07CiAJCTUyQjMxMEZCMTk3NEFFNjEwMDgwODU3QyAvKiBGdW5jdGlvbkhhc0V4ZWN1
dGVkQ2FjaGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDUyQjMxMEZBMTk3NEFFNjEwMDgwODU3QyAvKiBGdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUuaCAq
Lzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk1MkIzMTBG
RDE5NzRBRTg3MDA4MDg1N0MgLyogRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlLmNwcCBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDUyQjMxMEZDMTk3NEFFODcw
MDgwODU3QyAvKiBGdW5jdGlvbkhhc0V4ZWN1dGVkQ2FjaGUuY3BwICovOyB9OwpAQCAtMTQ5MCw2
ICsxNDkyLDggQEAKIAkJNzJBQUY3Q0QxRDBEMzFCMzAwNUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVy
U2V0dGVyRnVuY3Rpb24uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gNzJBQUY3Q0IxRDBEMzE4QjAwNUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVy
RnVuY3Rpb24uY3BwICovOyB9OwogCQk3MkFBRjdDRTFEMEQzMUIzMDA1RTYwQkUgLyogSlNDdXN0
b21HZXR0ZXJTZXR0ZXJGdW5jdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNzJBQUY3Q0MxRDBEMzE4QjAwNUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVy
U2V0dGVyRnVuY3Rpb24uaCAqLzsgfTsKIAkJNzgyNzREOEU0QzRENEZDRDlBMURDNkU2IC8qIFRl
bXBsYXRlUmVnaXN0cnlLZXkuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQkRCNEI1RTA5OUNENEMxQkIzQzFDRjA1IC8qIFRlbXBsYXRlUmVnaXN0cnlL
ZXkuY3BwICovOyB9OworCQk3OTAwODEzODFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTAwODEz
NjFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5jcHAgKi87IH07CisJCTc5MDA4MTM5MUU5
NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA3OTAwODEzNzFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVs
ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTc5
MDVCQjY4MUQxMjA1MEUwMDE5RkU1NyAvKiBJbmxpbmVBY2Nlc3MuY3BwIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzkwNUJCNjYxRDEyMDUwRTAwMTlGRTU3
IC8qIElubGluZUFjY2Vzcy5jcHAgKi87IH07CiAJCTc5MDVCQjY5MUQxMjA1MEUwMDE5RkU1NyAv
KiBJbmxpbmVBY2Nlc3MuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDc5MDVCQjY3MUQxMjA1MEUwMDE5RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCAqLzsgc2V0
dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk3OTE2MERCRDFDOEUz
RUM4MDA4QzA4NUEgLyogUHJveHlSZXZva2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gNzkxNjBEQkIxQzhFM0VDODAwOEMwODVBIC8qIFByb3h5UmV2
b2tlLmNwcCAqLzsgfTsKQEAgLTM4MzEsNiArMzgzNSw4IEBACiAJCTUyNjc4RjhDMUEwMzEwMDkw
MDZBMzA2RCAvKiBCYXNpY0Jsb2NrTG9jYXRpb24uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gQmFzaWNCbG9ja0xvY2F0aW9uLmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJNTI2NzhGOEQxQTAzMTAwOTAwNkEzMDZEIC8qIEJhc2ljQmxvY2tMb2NhdGlv
bi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBCYXNpY0Jsb2NrTG9jYXRpb24u
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNTI2NzhGOTAxQTA0MTc3QzAwNkEzMDZE
IC8qIENvbnRyb2xGbG93UHJvZmlsZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gQ29udHJvbEZsb3dQcm9maWxlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk1
MjZBQzRCNDFFOTc3QzVEMDAzNTAwRTEgLyogV2FzbUNvZGVCbG9jay5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXYXNtQ29kZUJsb2NrLmNwcDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKKwkJNTI2QUM0QjUxRTk3N0M1RDAwMzUwMEUxIC8qIFdhc21Db2RlQmxv
Y2suaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV2FzbUNvZGVCbG9jay5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk1Mjc3NzNERDFBQUY4M0FDMDBCREU3RTggLyog
UnVudGltZVR5cGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUnVu
dGltZVR5cGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk1MkIzMTBGQTE5NzRB
RTYxMDA4MDg1N0MgLyogRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQk1MkIzMTBGQzE5NzRBRTg3MDA4MDg1N0MgLyogRnVuY3Rpb25IYXNFeGVjdXRlZENhY2hlLmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZ1bmN0aW9uSGFzRXhlY3V0ZWRDYWNoZS5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC00MDQzLDYgKzQwNDksOCBAQAogCQk3MkFBRjdDQjFE
MEQzMThCMDA1RTYwQkUgLyogSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5jdGlvbi5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0N1c3RvbUdldHRlclNldHRlckZ1bmN0
aW9uLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNzJBQUY3Q0MxRDBEMzE4QjAw
NUU2MEJFIC8qIEpTQ3VzdG9tR2V0dGVyU2V0dGVyRnVuY3Rpb24uaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gSlNDdXN0b21HZXR0ZXJTZXR0ZXJGdW5jdGlvbi5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQk3N0IyNUNCMkMzMDk0QTkyQTM4RTFEQjMgLyogSlNNb2R1
bGVMb2FkZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNNb2R1bGVMb2Fk
ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNzkwMDgxMzYxRTk1QThFQzAwNTJE
N0NEIC8qIFdhc21Nb2R1bGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gV2FzbU1vZHVsZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTc5MDA4MTM3
MUU5NUE4RUMwMDUyRDdDRCAvKiBXYXNtTW9kdWxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IFdhc21Nb2R1bGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNzkw
NUJCNjYxRDEyMDUwRTAwMTlGRTU3IC8qIElubGluZUFjY2Vzcy5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJbmxpbmVBY2Nlc3MuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQk3OTA1QkI2NzFEMTIwNTBFMDAxOUZFNTcgLyogSW5saW5lQWNjZXNzLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IElubGluZUFjY2Vzcy5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQk3OTE2MERCQjFDOEUzRUM4MDA4QzA4NUEgLyogUHJveHlS
ZXZva2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUHJveHlSZXZv
a2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNjMyMSwxMiArNjMyOSwxNiBA
QAogCQkJCTUyNUMwREQ4MUU5MzU4NDcwMDIxODRDRCAvKiBXYXNtQ2FsbGVlLmggKi8sCiAJCQkJ
NTNGRDA0RDExRDdBQjE4NzAwMzI4N0QzIC8qIFdhc21DYWxsaW5nQ29udmVudGlvbi5jcHAgKi8s
CiAJCQkJNTNGRDA0RDIxRDdBQjE4NzAwMzI4N0QzIC8qIFdhc21DYWxsaW5nQ29udmVudGlvbi5o
ICovLAorCQkJCTUyNkFDNEI0MUU5NzdDNUQwMDM1MDBFMSAvKiBXYXNtQ29kZUJsb2NrLmNwcCAq
LywKKwkJCQk1MjZBQzRCNTFFOTc3QzVEMDAzNTAwRTEgLyogV2FzbUNvZGVCbG9jay5oICovLAog
CQkJCUFENDEyQjMxMUU3QjJFOEEwMDhBRjE1NyAvKiBXYXNtQ29udGV4dC5jcHAgKi8sCiAJCQkJ
QUQ0MTJCMzIxRTdCMkU4QTAwOEFGMTU3IC8qIFdhc21Db250ZXh0LmggKi8sCiAJCQkJNzlEQUUy
NzkxRTAzQzgyMjAwQjUyNkFBIC8qIFdhc21FeGNlcHRpb25UeXBlLmggKi8sCiAJCQkJQUQyRkND
MzIxREM0MDQ1MzAwQjNFNzM2IC8qIFdhc21Gb3JtYXQuY3BwICovLAogCQkJCTdCQzU0N0QyMUI2
OTU5OUIwMDk1OUI1OCAvKiBXYXNtRm9ybWF0LmggKi8sCiAJCQkJNTNGNDBFOEExRDU5MDFCQjAw
OTlBMUI2IC8qIFdhc21GdW5jdGlvblBhcnNlci5oICovLAorCQkJCTc5MDA4MTM2MUU5NUE4RUMw
MDUyRDdDRCAvKiBXYXNtTW9kdWxlLmNwcCAqLywKKwkJCQk3OTAwODEzNzFFOTVBOEVDMDA1MkQ3
Q0QgLyogV2FzbU1vZHVsZS5oICovLAogCQkJCTUzNTU1NzE1MUQ5REZBMzIwMDZENTgzQiAvKiBX
YXNtTWVtb3J5LmNwcCAqLywKIAkJCQk1MzU1NTcxMzFEOUQ5RUE1MDA2RDU4M0IgLyogV2FzbU1l
bW9yeS5oICovLAogCQkJCTc5Qjc1OTcxMURGQTRDNjAwMDUyMTc0QyAvKiBXYXNtTWVtb3J5SW5m
b3JtYXRpb24uY3BwICovLApAQCAtODc3NCw2ICs4Nzg2LDcgQEAKIAkJCQlEQzNEMkIwQTFEMzQz
MTYyMDBCQTkxOEMgLyogSGVhcENlbGwuaCBpbiBIZWFkZXJzICovLAogCQkJCTBGMDcwQTQ5MUQ1
NDNBOTMwMDZFNzIzMiAvKiBIZWFwQ2VsbElubGluZXMuaCBpbiBIZWFkZXJzICovLAogCQkJCTBG
MzJCRDExMUJCMzRGMTkwMDkzQTU3RiAvKiBIZWFwSGVscGVyUG9vbC5oIGluIEhlYWRlcnMgKi8s
CisJCQkJNTI2QUM0QjcxRTk3N0M1RDAwMzUwMEUxIC8qIFdhc21Db2RlQmxvY2suaCBpbiBIZWFk
ZXJzICovLAogCQkJCUMyREE3NzgzMThFMjU5OTkwMDY2RkNCNiAvKiBIZWFwSW5saW5lcy5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJMkFEODkzMkIxN0UzODY4RjAwNjY4Mjc2IC8qIEhlYXBJdGVyYXRp
b25TY29wZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTUzMzlFQzkxQkI0QjQ2MDAwNTRGMDA1IC8q
IEhlYXBPYnNlcnZlci5oIGluIEhlYWRlcnMgKi8sCkBAIC04OTIyLDYgKzg5MzUsNyBAQAogCQkJ
CUE1OEMwMjQyMThFNEE0MUEwMDAzMkJDNSAvKiBKU0NvbnRleHRQcml2YXRlLmggaW4gSGVhZGVy
cyAqLywKIAkJCQlCQzE4QzQxRTBFMTZGNUNEMDBCMzQ0NjAgLyogSlNDb250ZXh0UmVmLmggaW4g
SGVhZGVycyAqLywKIAkJCQlBNUVBNzBFRTE5RjVCNUM0MDA5OEY1RUMgLyogSlNDb250ZXh0UmVm
SW5zcGVjdG9yU3VwcG9ydC5oIGluIEhlYWRlcnMgKi8sCisJCQkJNzkwMDgxMzkxRTk1QThFQzAw
NTJEN0NEIC8qIFdhc21Nb2R1bGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUE1RDJFNjY1MTk1RTE3
NDAwMEE1MThFNyAvKiBKU0NvbnRleHRSZWZJbnRlcm5hbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
MEZGNEI0QzcxRTg4OTNDNTAwREJCRTg2IC8qIEFpckNGRy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
MTQ4Q0QxRDgxMDhDRjkwMjAwODE2M0M2IC8qIEpTQ29udGV4dFJlZlByaXZhdGUuaCBpbiBIZWFk
ZXJzICovLApAQCAtMTAzNjYsNiArMTAzODAsNyBAQAogCQkJCTBGQjEwNTg1MTY3NTQ4MEYwMEY4
QUI2RSAvKiBFeGl0S2luZC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjU1MTNBODFENUE2OENE
MDBDMzJCRDggLyogRnJlZUxpc3QuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEZFQTBBMUMxNzA4
QjAwNzAwQkI3MjJDIC8qIEZUTEFic3RyYWN0SGVhcC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk3
OTAwODEzODFFOTVBOEVDMDA1MkQ3Q0QgLyogV2FzbU1vZHVsZS5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQkwRkVBMEExRTE3MDhCMDA3MDBCQjcyMkMgLyogRlRMQWJzdHJhY3RIZWFwUmVwb3NpdG9y
eS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwRjQ4NTMyNzE4N0RGREVDMDA4M0I2ODcgLyogRlRM
QXZhaWxhYmxlUmVjb3ZlcnkuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMEZFQTBBMDkxNzA1MTNE
QjAwQkI3MjJDIC8qIEZUTENhcGFiaWxpdGllcy5jcHAgaW4gU291cmNlcyAqLywKQEAgLTEwNTQ2
LDYgKzEwNTYxLDcgQEAKIAkJCQk3OTg5Mzc3ODFEQ0FCNTczMDBGOEQ0RkIgLyogSlNGaXhlZEFy
cmF5LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0MDU2NkQ2MTA3RUMyNzEwMDVEQkM4RCAvKiBK
U0Z1bmN0aW9uLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTcwQjc5MTlCMUMwMjRBNDYwMDI0ODFF
MiAvKiBKU0dlbmVyYXRvckZ1bmN0aW9uLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTUyNkFDNEI2
MUU5NzdDNUQwMDM1MDBFMSAvKiBXYXNtQ29kZUJsb2NrLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CTc5N0UwN0E5MUI4RkNGQjkwMDg0MDBCQSAvKiBKU0dsb2JhbExleGljYWxFbnZpcm9ubWVudC5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDdGMzlEMjEwN0VDMzc2MDA0MjdBNDggLyogSlNHbG9i
YWxPYmplY3QuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTVGRDAwODUxODlCMUI3RTAwNjMzMjMx
IC8qIEpTR2xvYmFsT2JqZWN0Q29uc29sZUFnZW50LmNwcCBpbiBTb3VyY2VzICovLApJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJvbWlzZURlZmVycmVkVGltZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1Byb21pc2VEZWZlcnJl
ZFRpbWVyLmNwcAkocmV2aXNpb24gMjE1MDU0KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvUHJvbWlzZURlZmVycmVkVGltZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCwxMCAr
NDQsMTIgQEAgUHJvbWlzZURlZmVycmVkVGltZXI6OlByb21pc2VEZWZlcnJlZFRpbQogdm9pZCBQ
cm9taXNlRGVmZXJyZWRUaW1lcjo6ZG9Xb3JrKCkKIHsKICAgICBBU1NFUlQobV92bS0+Y3VycmVu
dFRocmVhZElzSG9sZGluZ0FQSUxvY2soKSk7Ci0gICAgTG9ja0hvbGRlciBsb2NrZXIobV90YXNr
TG9jayk7CisgICAgbV90YXNrTG9jay5sb2NrKCk7CiAgICAgY2FuY2VsVGltZXIoKTsKLSAgICBp
ZiAoIW1fcnVuVGFza3MpCisgICAgaWYgKCFtX3J1blRhc2tzKSB7CisgICAgICAgIG1fdGFza0xv
Y2sudW5sb2NrKCk7CiAgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICB3aGlsZSAoIW1fdGFz
a3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIEpTUHJvbWlzZURlZmVycmVkKiB0aWNrZXQ7CkBAIC01
NywxNyArNTksMjcgQEAgdm9pZCBQcm9taXNlRGVmZXJyZWRUaW1lcjo6ZG9Xb3JrKCkKIAogICAg
ICAgICAvLyBXZSBtYXkgaGF2ZSBhbHJlYWR5IGNhbmNlbGVkIHRoZXNlIHByb21pc2VzLgogICAg
ICAgICBpZiAobV9wZW5kaW5nUHJvbWlzZXMuY29udGFpbnModGlja2V0KSkgeworICAgICAgICAg
ICAgLy8gQWxsb3cgdGFza3Mgd2UgcnVuIG5vdyB0byBzY2hlZHVsZSB3b3JrLgorICAgICAgICAg
ICAgbV9jdXJyZW50bHlSdW5uaW5nVGFzayA9IHRydWU7CisgICAgICAgICAgICBtX3Rhc2tMb2Nr
LnVubG9jaygpOyAKKwogICAgICAgICAgICAgdGFzaygpOwogICAgICAgICAgICAgbV92bS0+ZHJh
aW5NaWNyb3Rhc2tzKCk7CisKKyAgICAgICAgICAgIG1fdGFza0xvY2subG9jaygpOworICAgICAg
ICAgICAgbV9jdXJyZW50bHlSdW5uaW5nVGFzayA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQog
Ci0gICAgaWYgKG1fcGVuZGluZ1Byb21pc2VzLmlzRW1wdHkoKSAmJiBtX3Nob3VsZFN0b3BSdW5M
b29wV2hlbkFsbFByb21pc2VzRmluaXNoKQorICAgIGlmIChtX3BlbmRpbmdQcm9taXNlcy5pc0Vt
cHR5KCkgJiYgbV9zaG91bGRTdG9wUnVuTG9vcFdoZW5BbGxQcm9taXNlc0ZpbmlzaCkgewogI2lm
IFVTRShDRikKICAgICAgICAgQ0ZSdW5Mb29wU3RvcChtX3J1bkxvb3AuZ2V0KCkpOwogI2Vsc2UK
ICAgICAgICAgUnVuTG9vcDo6Y3VycmVudCgpLnN0b3AoKTsKICNlbmRpZgorICAgIH0KKworICAg
IG1fdGFza0xvY2sudW5sb2NrKCk7CiB9CiAKIHZvaWQgUHJvbWlzZURlZmVycmVkVGltZXI6OnJ1
blJ1bkxvb3AoKQpAQCAtMTIxLDcgKzEzMyw3IEBAIHZvaWQgUHJvbWlzZURlZmVycmVkVGltZXI6
OnNjaGVkdWxlV29ya1MKIHsKICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3Rhc2tMb2NrKTsKICAg
ICBtX3Rhc2tzLmFwcGVuZChzdGQ6Om1ha2VfdHVwbGUodGlja2V0LCBXVEZNb3ZlKHRhc2spKSk7
Ci0gICAgaWYgKCFpc1NjaGVkdWxlZCgpKQorICAgIGlmICghaXNTY2hlZHVsZWQoKSAmJiAhbV9j
dXJyZW50bHlSdW5uaW5nVGFzaykKICAgICAgICAgc2NoZWR1bGVUaW1lcigwKTsKIH0KIApJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvUHJvbWlzZURlZmVycmVkVGltZXIuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Qcm9taXNlRGVmZXJy
ZWRUaW1lci5oCShyZXZpc2lvbiAyMTUwNTQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9Qcm9taXNlRGVmZXJyZWRUaW1lci5oCSh3b3JraW5nIGNvcHkpCkBAIC02NCw2ICs2NCw3
IEBAIHByaXZhdGU6CiAgICAgTG9jayBtX3Rhc2tMb2NrOwogICAgIGJvb2wgbV9ydW5UYXNrcyB7
IHRydWUgfTsKICAgICBib29sIG1fc2hvdWxkU3RvcFJ1bkxvb3BXaGVuQWxsUHJvbWlzZXNGaW5p
c2ggeyBmYWxzZSB9OworICAgIGJvb2wgbV9jdXJyZW50bHlSdW5uaW5nVGFzayB7IGZhbHNlIH07
CiAgICAgVmVjdG9yPHN0ZDo6dHVwbGU8SlNQcm9taXNlRGVmZXJyZWQqLCBUYXNrPj4gbV90YXNr
czsKIH07CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CM0lSR2VuZXJh
dG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQjNJ
UkdlbmVyYXRvci5jcHAJKHJldmlzaW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS93YXNtL1dhc21CM0lSR2VuZXJhdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTM2LDcgKzkz
Niw3IEBAIGF1dG8gQjNJUkdlbmVyYXRvcjo6YWRkQ2FsbCh1aW50MzJfdCBmdW4KICAgICAgICAg
ICAgICAgICBwYXRjaHBvaW50LT5hcHBlbmQoanVtcERlc3RpbmF0aW9uLCBWYWx1ZVJlcDo6U29t
ZVJlZ2lzdGVyKTsKICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNsb2JiZXIgYWxsIHBv
dGVudGlhbCBwaW5uZWQgcmVnaXN0ZXJzIHNpbmNlIHdlIG1pZ2h0IGJlIGxlYXZpbmcgdGhlIGlu
c3RhbmNlLgogICAgICAgICAgICAgICAgIHBhdGNocG9pbnQtPmNsb2JiZXJMYXRlKFBpbm5lZFJl
Z2lzdGVySW5mbzo6Z2V0KCkudG9TYXZlKCkpOwotICAgICAgICAgICAgICAgIHBhdGNocG9pbnQt
PnNldEdlbmVyYXRvcihbdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIGZ1bmN0aW9uSW5kZXgsIHJl
dHVyblR5cGVdIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlv
blBhcmFtcyYgcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hwb2ludC0+c2V0R2VuZXJh
dG9yKFtmdW5jdGlvbkluZGV4LCByZXR1cm5UeXBlXSAoQ0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0
IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmIHBhcmFtcykgewogICAgICAgICAgICAgICAg
ICAgICBBbGxvd01hY3JvU2NyYXRjaFJlZ2lzdGVyVXNhZ2UgYWxsb3dTY3JhdGNoKGppdCk7CiAg
ICAgICAgICAgICAgICAgICAgIGppdC5jYWxsKHBhcmFtc1tyZXR1cm5UeXBlID09IFZvaWQgPyAw
IDogMV0uZ3ByKCkpOwogICAgICAgICAgICAgICAgIH0pOwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3dhc20vV2FzbUJpbmRpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93YXNtL1dhc21CaW5kaW5nLmNwcAkocmV2aXNpb24gMjE1MDU0KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUJpbmRpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
OSw3ICs0OSw3IEBAIHN0YXRpYyB2b2lkIG1hdGVyaWFsaXplSW1wb3J0SlNDZWxsKEpJVCYKICAg
ICBqaXQubG9hZFB0cihKSVQ6OkFkZHJlc3MocmVzdWx0LCBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6
Om9mZnNldE9mSW1wb3J0RnVuY3Rpb24oaW1wb3J0SW5kZXgpKSwgcmVzdWx0KTsKIH0KIAotc3Rh
dGljIE1hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9KcyhWTSogdm0sIEJhZzxDYWxsTGlua0lu
Zm8+JiBjYWxsTGlua0luZm9zLCBTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCwgdW5zaWdu
ZWQgaW1wb3J0SW5kZXgpCitNYWNyb0Fzc2VtYmxlckNvZGVSZWYgd2FzbVRvSnMoVk0qIHZtLCBC
YWc8Q2FsbExpbmtJbmZvPiYgY2FsbExpbmtJbmZvcywgU2lnbmF0dXJlSW5kZXggc2lnbmF0dXJl
SW5kZXgsIHVuc2lnbmVkIGltcG9ydEluZGV4KQogewogICAgIC8vIEZJWE1FOiBUaGlzIGZ1bmN0
aW9uIGRvZXNuJ3QgcHJvcGVybHkgYWJzdHJhY3QgYXdheSB0aGUgY2FsbGluZyBjb252ZW50aW9u
LgogICAgIC8vIEl0J2QgYmUgc3VwZXIgZWFzeSB0byBkbyBzbzogaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE2OTQwMQpAQCAtNDIyLDcgKzQyMiw3IEBAIHN0YXRpYyBN
YWNyb0Fzc2VtYmxlckNvZGVSZWYgd2FzbVRvSnMoVk0KICAgICByZXR1cm4gRklOQUxJWkVfQ09E
RShwYXRjaEJ1ZmZlciwgKCJXZWJBc3NlbWJseS0+SmF2YVNjcmlwdCBpbXBvcnRbJWldICVzIiwg
aW1wb3J0SW5kZXgsIHNpZ25hdHVyZS50b1N0cmluZygpLmFzY2lpKCkuZGF0YSgpKSk7CiB9CiAK
LXN0YXRpYyBNYWNyb0Fzc2VtYmxlckNvZGVSZWYgd2FzbVRvV2FzbSh1bnNpZ25lZCBpbXBvcnRJ
bmRleCkKK01hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9XYXNtKHVuc2lnbmVkIGltcG9ydElu
ZGV4KQogewogICAgIGNvbnN0IFBpbm5lZFJlZ2lzdGVySW5mbyYgcGlubmVkUmVncyA9IFBpbm5l
ZFJlZ2lzdGVySW5mbzo6Z2V0KCk7CiAgICAgSklUIGppdDsKQEAgLTQ2MiwxNCArNDYyLDYgQEAg
c3RhdGljIE1hY3JvQXNzZW1ibGVyQ29kZVJlZiB3YXNtVG9XYXNtKAogICAgIHJldHVybiBGSU5B
TElaRV9DT0RFKHBhdGNoQnVmZmVyLCAoIldlYkFzc2VtYmx5LT5XZWJBc3NlbWJseSBpbXBvcnRb
JWldIiwgaW1wb3J0SW5kZXgpKTsKIH0KIAotV2FzbUV4aXRTdHVicyBleGl0U3R1YkdlbmVyYXRv
cihWTSogdm0sIEJhZzxDYWxsTGlua0luZm8+JiBjYWxsTGlua0luZm9zLCBTaWduYXR1cmVJbmRl
eCBzaWduYXR1cmVJbmRleCwgdW5zaWduZWQgaW1wb3J0SW5kZXgpCi17Ci0gICAgV2FzbUV4aXRT
dHVicyBzdHViczsKLSAgICBzdHVicy53YXNtVG9KcyA9IHdhc21Ub0pzKHZtLCBjYWxsTGlua0lu
Zm9zLCBzaWduYXR1cmVJbmRleCwgaW1wb3J0SW5kZXgpOwotICAgIHN0dWJzLndhc21Ub1dhc20g
PSB3YXNtVG9XYXNtKGltcG9ydEluZGV4KTsKLSAgICByZXR1cm4gc3R1YnM7Ci19Ci0KIH0gfSAv
LyBuYW1lc3BhY2UgSlNDOjpXYXNtCiAKICNlbmRpZiAvLyBFTkFCTEUoV0VCQVNTRU1CTFkpCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQmluZGluZy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CaW5kaW5nLmgJKHJldmlzaW9uIDIx
NTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CaW5kaW5nLmgJKHdvcmtp
bmcgY29weSkKQEAgLTM4LDcgKzM4LDggQEAgY2xhc3MgQ2FsbExpbmtJbmZvOwogCiBuYW1lc3Bh
Y2UgV2FzbSB7CiAKLVdhc21FeGl0U3R1YnMgZXhpdFN0dWJHZW5lcmF0b3IoVk0qLCBCYWc8Q2Fs
bExpbmtJbmZvPiYsIFNpZ25hdHVyZUluZGV4LCB1bnNpZ25lZCk7CitNYWNyb0Fzc2VtYmxlckNv
ZGVSZWYgd2FzbVRvV2FzbSh1bnNpZ25lZCBpbXBvcnRJbmRleCk7CitNYWNyb0Fzc2VtYmxlckNv
ZGVSZWYgd2FzbVRvSnMoVk0qLCBCYWc8Q2FsbExpbmtJbmZvPiYgY2FsbExpbmtJbmZvcywgU2ln
bmF0dXJlSW5kZXgsIHVuc2lnbmVkIGltcG9ydEluZGV4KTsKIAogfSB9IC8vIG5hbWVzcGFjZSBK
U0M6Oldhc20KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUNvZGVCbG9j
ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUNvZGVC
bG9jay5jcHAJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2Fz
bUNvZGVCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjUgQEAKKworLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJXYXNtQ29kZUJsb2NrLmgiCisKKyNpZiBFTkFCTEUoV0VCQVNTRU1CTFkp
CisKKyNpbmNsdWRlICJXYXNtUGxhbklubGluZXMuaCIKKyNpbmNsdWRlICJXYXNtV29ya2xpc3Qu
aCIKKworbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKKworQ29kZUJsb2NrOjpDb2Rl
QmxvY2soVk0mIHZtLCBNZW1vcnlNb2RlIG1vZGUsIE1vZHVsZUluZm9ybWF0aW9uJiBtb2R1bGVJ
bmZvcm1hdGlvbikKKyAgICA6IG1fY2FsbGVlQ291bnQobW9kdWxlSW5mb3JtYXRpb24uaW50ZXJu
YWxGdW5jdGlvbkNvdW50KCkpCisgICAgLCBtX21vZGUobW9kZSkKK3sKKyAgICBtX3BsYW4gPSBh
ZG9wdFJlZigqbmV3IFBsYW4odm0sIG1ha2VSZWYobW9kdWxlSW5mb3JtYXRpb24pLCBQbGFuOjpG
dWxsQ29tcGlsZSwgY3JlYXRlU2hhcmVkVGFzazxQbGFuOjpDYWxsYmFja1R5cGU+KFt0aGlzXSAo
Vk0mLCBQbGFuJikgeworICAgICAgICAvLyBJdCdzIHNhZmUgdG8gdXNlIHx0aGlzfCBoZXJlIGJl
Y2F1c2Ugb3VyIE1vZHVsZSBvd25zIHVzLCBhbmQgYSBNb2R1bGUKKyAgICAgICAgLy8gY2FuJ3Qg
YmUgZGVzdHJveWVkIHVudGlsIGl0IGhhcyBmaW5pc2hlZCBjb21waWxpbmcgaXRzIHZhcmlvdXMg
V2FzbSBiaXRzLgorICAgICAgICAvLyBUaGUgSlMgQVBJIGluc3VyZXMgdGhpcyBpbnZhcmlhbnQg
Ynkga2VlcGluZyBhbGl2ZSB0aGUgbW9kdWxlIGFzIGl0IGhhcworICAgICAgICAvLyBhIHBlbmRp
bmcgcHJvbWlzZS4KKyAgICAgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhtX2xvY2spOworICAg
ICAgICBpZiAobV9wbGFuLT5mYWlsZWQoKSkgeworICAgICAgICAgICAgbV9lcnJvck1lc3NhZ2Ug
PSBtX3BsYW4tPmVycm9yTWVzc2FnZSgpOworICAgICAgICAgICAgbV9wbGFuID0gbnVsbHB0cjsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1fY2FsbGVlcy5yZXNp
emUobV9jYWxsZWVDb3VudCAqIDIpOworICAgICAgICBtX3BsYW4tPmluaXRpYWxpemVDYWxsZWVz
KFsmXSAodW5zaWduZWQgY2FsbGVlSW5kZXgsIFJlZjxXYXNtOjpDYWxsZWU+JiYganNFbnRyeXBv
aW50Q2FsbGVlLCBSZWY8V2FzbTo6Q2FsbGVlPiYmIHdhc21FbnRyeXBvaW50Q2FsbGVlKSB7Cisg
ICAgICAgICAgICBtX2NhbGxlZXNbY2FsbGVlSW5kZXhdID0gV1RGTW92ZShqc0VudHJ5cG9pbnRD
YWxsZWUpOworICAgICAgICAgICAgbV9jYWxsZWVzW2NhbGxlZUluZGV4ICsgbV9jYWxsZWVDb3Vu
dF0gPSBXVEZNb3ZlKHdhc21FbnRyeXBvaW50Q2FsbGVlKTsKKyAgICAgICAgfSk7CisKKyAgICAg
ICAgbV93YXNtVG9XYXNtRXhpdFN0dWJzID0gbV9wbGFuLT50YWtlV2FzbVRvV2FzbUV4aXRTdHVi
cygpOworCisgICAgICAgIG1fcGxhbiA9IG51bGxwdHI7CisgICAgfSkpKTsKKworICAgIG1fcGxh
bi0+c2V0TW9kZShtb2RlKTsKKyAgICBhdXRvJiB3b3JrbGlzdCA9IFdhc206OmVuc3VyZVdvcmts
aXN0KCk7CisgICAgLy8gTm90ZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgd2UgZW5xdWV1ZSB0aGUgcGxh
biwgdGhlcmUgaXMgYSBjaGFuY2UgdGhlIGFib3ZlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkLgor
ICAgIHdvcmtsaXN0LmVucXVldWUobWFrZVJlZigqbV9wbGFuLmdldCgpKSk7Cit9CisKK3ZvaWQg
Q29kZUJsb2NrOjp3YWl0VW50aWxGaW5pc2hlZCgpCit7CisgICAgUmVmUHRyPFBsYW4+IHBsYW47
CisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbG9jayk7CisgICAgICAg
IHBsYW4gPSBtX3BsYW47CisgICAgfQorCisgICAgaWYgKHBsYW4pIHsKKyAgICAgICAgYXV0byYg
d29ya2xpc3QgPSBXYXNtOjplbnN1cmVXb3JrbGlzdCgpOworICAgICAgICB3b3JrbGlzdC5jb21w
bGV0ZVBsYW5TeW5jaHJvbm91c2x5KCpwbGFuLmdldCgpKTsKKyAgICB9CisgICAgLy8gZWxzZSwg
aWYgd2UgZG9uJ3QgaGF2ZSBhIHBsYW4sIHdlJ3JlIGFscmVhZHkgY29tcGlsZWQuCit9CisKK3Zv
aWQgQ29kZUJsb2NrOjpjb21waWxlQXN5bmMoVk0mIHZtLCBBc3luY0NvbXBpbGF0aW9uQ2FsbGJh
Y2smJiB0YXNrKQoreworICAgIFJlZlB0cjxQbGFuPiBwbGFuOworICAgIHsKKyAgICAgICAgYXV0
byBsb2NrZXIgPSBob2xkTG9jayhtX2xvY2spOworICAgICAgICBwbGFuID0gbV9wbGFuOworICAg
IH0KKworICAgIGlmIChwbGFuKSB7CisgICAgICAgIC8vIE91ciBsaWZldGltZSBpcyBndWFyYW50
ZWVkIGJ5IHRoZSBKUyBjb2RlIGJ5IGhhdmluZyBpdAorICAgICAgICAvLyBrZWVwIGFsaXZlIHRo
ZSBKUyBvYmplY3RzIHRoYXQgZW5zdXJlIG91ciBsaWZldGltZS4KKyAgICAgICAgcGxhbi0+YWRk
Q29tcGxldGlvblRhc2sodm0sIGNyZWF0ZVNoYXJlZFRhc2s8UGxhbjo6Q2FsbGJhY2tUeXBlPihb
dGhpcywgdGFzayA9IFdURk1vdmUodGFzayldIChWTSYgdm0sIFBsYW4mKSB7CisgICAgICAgICAg
ICB0YXNrLT5ydW4odm0sIG1ha2VSZWYoKnRoaXMpKTsKKyAgICAgICAgfSkpOworICAgIH0gZWxz
ZQorICAgICAgICB0YXNrLT5ydW4odm0sIG1ha2VSZWYoKnRoaXMpKTsKK30KKworYm9vbCBDb2Rl
QmxvY2s6OmlzU2FmZVRvUnVuKE1lbW9yeU1vZGUgbWVtb3J5TW9kZSkKK3sKKyAgICBpZiAoIXJ1
bm5hYmxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN3aXRjaCAobV9tb2RlKSB7
CisgICAgY2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpCb3VuZHNDaGVja2luZzoKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgY2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpTaWduYWxpbmc6CisgICAgICAg
IC8vIENvZGUgYmVpbmcgaW4gU2lnbmFsaW5nIG1vZGUgbWVhbnMgdGhhdCBpdCBwZXJmb3JtcyBu
byBib3VuZHMgY2hlY2tzLgorICAgICAgICAvLyBJdHMgbWVtb3J5LCBldmVuIGlmIGVtcHR5LCBh
YnNvbHV0ZWx5IG11c3QgYWxzbyBiZSBpbiBTaWduYWxpbmcgbW9kZQorICAgICAgICAvLyBiZWNh
dXNlIHRoZSBwYWdlIHByb3RlY3Rpb24gZGV0ZWN0cyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLgor
ICAgICAgICByZXR1cm4gbWVtb3J5TW9kZSA9PSBXYXNtOjpNZW1vcnlNb2RlOjpTaWduYWxpbmc7
CisgICAgY2FzZSBXYXNtOjpNZW1vcnlNb2RlOjpOdW1iZXJPZk1lbW9yeU1vZGVzOgorICAgICAg
ICBicmVhazsKKyAgICB9CisgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpXYXNtCisKKyNlbmRpZiAv
LyBFTkFCTEUoV0VCQVNTRU1CTFkpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9X
YXNtQ29kZUJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20v
V2FzbUNvZGVCbG9jay5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93
YXNtL1dhc21Db2RlQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk4IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisK
KyNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCisKKyNpbmNsdWRlICJXYXNtQ2FsbGVlLmgiCisjaW5j
bHVkZSAiV2FzbU1vZHVsZUluZm9ybWF0aW9uLmgiCisjaW5jbHVkZSAiV2FzbVBsYW4uaCIKKyNp
bmNsdWRlIDx3dGYvTG9jay5oPgorI2luY2x1ZGUgPHd0Zi9TaGFyZWRUYXNrLmg+CisjaW5jbHVk
ZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+CisKK25hbWVzcGFjZSBKU0MgeyBuYW1lc3Bh
Y2UgV2FzbSB7CisgICAgCitjbGFzcyBDb2RlQmxvY2sgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNv
dW50ZWQ8Q29kZUJsb2NrPiB7CitwdWJsaWM6CisgICAgdHlwZWRlZiB2b2lkIENhbGxiYWNrVHlw
ZShWTSYsIFJlZjxDb2RlQmxvY2s+JiYpOworICAgIHVzaW5nIEFzeW5jQ29tcGlsYXRpb25DYWxs
YmFjayA9IFJlZlB0cjxXVEY6OlNoYXJlZFRhc2s8Q2FsbGJhY2tUeXBlPj47CisgICAgc3RhdGlj
IFJlZjxDb2RlQmxvY2s+IGNyZWF0ZShWTSYgdm0sIE1lbW9yeU1vZGUgbW9kZSwgTW9kdWxlSW5m
b3JtYXRpb24mIG1vZHVsZUluZm9ybWF0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0
UmVmKCpuZXcgQ29kZUJsb2NrKHZtLCBtb2RlLCBtb2R1bGVJbmZvcm1hdGlvbikpOworICAgIH0K
KworICAgIHZvaWQgd2FpdFVudGlsRmluaXNoZWQoKTsKKyAgICB2b2lkIGNvbXBpbGVBc3luYyhW
TSYsIEFzeW5jQ29tcGlsYXRpb25DYWxsYmFjayYmKTsKKworICAgIGJvb2wgY29tcGlsYXRpb25G
aW5pc2hlZCgpCisgICAgeworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fbG9jayk7
CisgICAgICAgIHJldHVybiAhbV9wbGFuOworICAgIH0KKyAgICBib29sIHJ1bm5hYmxlKCkgeyBy
ZXR1cm4gY29tcGlsYXRpb25GaW5pc2hlZCgpICYmICFtX2Vycm9yTWVzc2FnZTsgfQorCisgICAg
Ly8gTm90ZSwgd2UgZG8gdGhpcyBjb3B5IHRvIGVuc3VyZSBpdCdzIHRocmVhZCBzYWZlIHRvIGhh
dmUgdGhpcworICAgIC8vIGNhbGxlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMgc2ltdWx0YW5lb3Vz
bHkuCisgICAgU3RyaW5nIGVycm9yTWVzc2FnZSgpCisgICAgeworICAgICAgICBBU1NFUlQoIXJ1
bm5hYmxlKCkpOworICAgICAgICBDU3RyaW5nIGNTdHJpbmcgPSBtX2Vycm9yTWVzc2FnZS5hc2Np
aSgpOworICAgICAgICByZXR1cm4gU3RyaW5nKGNTdHJpbmcuZGF0YSgpKTsKKyAgICB9CisKKyAg
ICB1bnNpZ25lZCBmdW5jdGlvbkltcG9ydENvdW50KCkgY29uc3QgeyByZXR1cm4gbV93YXNtVG9X
YXNtRXhpdFN0dWJzLnNpemUoKTsgfQorCisgICAgV2FzbTo6Q2FsbGVlJiBqc0VudHJ5cG9pbnRD
YWxsZWVGcm9tRnVuY3Rpb25JbmRleFNwYWNlKHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFjZSkK
KyAgICB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGZ1bmN0aW9uSW5kZXhTcGFjZSA+PSBmdW5j
dGlvbkltcG9ydENvdW50KCkpOworICAgICAgICB1bnNpZ25lZCBjYWxsZWVJbmRleCA9IGZ1bmN0
aW9uSW5kZXhTcGFjZSAtIGZ1bmN0aW9uSW1wb3J0Q291bnQoKTsKKyAgICAgICAgUkVMRUFTRV9B
U1NFUlQoY2FsbGVlSW5kZXggPCBtX2NhbGxlZUNvdW50KTsKKyAgICAgICAgcmV0dXJuICptX2Nh
bGxlZXNbY2FsbGVlSW5kZXhdLmdldCgpOworICAgIH0KKyAgICBXYXNtOjpDYWxsZWUmIHdhc21F
bnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0aW9uSW5kZXhTcGFjZSh1bnNpZ25lZCBmdW5jdGlvbklu
ZGV4U3BhY2UpCisgICAgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChmdW5jdGlvbkluZGV4U3Bh
Y2UgPj0gZnVuY3Rpb25JbXBvcnRDb3VudCgpKTsKKyAgICAgICAgdW5zaWduZWQgY2FsbGVlSW5k
ZXggPSBmdW5jdGlvbkluZGV4U3BhY2UgLSBmdW5jdGlvbkltcG9ydENvdW50KCk7CisgICAgICAg
IFJFTEVBU0VfQVNTRVJUKGNhbGxlZUluZGV4IDwgbV9jYWxsZWVDb3VudCk7CisgICAgICAgIHJl
dHVybiAqbV9jYWxsZWVzW2NhbGxlZUluZGV4ICsgbV9jYWxsZWVDb3VudF0uZ2V0KCk7CisgICAg
fQorICAgIGJvb2wgaXNTYWZlVG9SdW4oTWVtb3J5TW9kZSk7CisKK3ByaXZhdGU6CisgICAgQ29k
ZUJsb2NrKFZNJiwgTWVtb3J5TW9kZSwgTW9kdWxlSW5mb3JtYXRpb24mKTsKKyAgICB1bnNpZ25l
ZCBtX2NhbGxlZUNvdW50OworICAgIE1lbW9yeU1vZGUgbV9tb2RlOworICAgIFZlY3RvcjxSZWZQ
dHI8Q2FsbGVlPj4gbV9jYWxsZWVzOworICAgIFZlY3RvcjxNYWNyb0Fzc2VtYmxlckNvZGVSZWY+
IG1fd2FzbVRvV2FzbUV4aXRTdHViczsKKyAgICBSZWZQdHI8UGxhbj4gbV9wbGFuOworICAgIFN0
cmluZyBtX2Vycm9yTWVzc2FnZTsKKyAgICBMb2NrIG1fbG9jazsKK307CisKK30gfSAvLyBuYW1l
c3BhY2UgSlNDOjpXYXNtCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCQVNTRU1CTFkpCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxlLmNwcAkobm9uZXhpc3RlbnQpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtTW9kdWxlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldhc21Nb2R1bGUuaCIKKwor
I2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKKworI2luY2x1ZGUgIldhc21QbGFuSW5saW5lcy5oIgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIFdhc20geworCitNb2R1bGU6Ok1vZHVsZShSZWY8
TW9kdWxlSW5mb3JtYXRpb24+JiYgbW9kdWxlSW5mb3JtYXRpb24pCisgICAgOiBtX21vZHVsZUlu
Zm9ybWF0aW9uKFdURk1vdmUobW9kdWxlSW5mb3JtYXRpb24pKQoreworfQorCitzdGF0aWMgTW9k
dWxlOjpWYWxpZGF0aW9uUmVzdWx0IG1ha2VWYWxpZGF0aW9uUmVzdWx0KFBsYW4mIHBsYW4pCit7
CisgICAgQVNTRVJUKCFwbGFuLmhhc1dvcmsoKSk7CisgICAgaWYgKHBsYW4uZmFpbGVkKCkpCisg
ICAgICAgIHJldHVybiBVbmV4cGVjdGVkVHlwZTxTdHJpbmc+KHBsYW4uZXJyb3JNZXNzYWdlKCkp
OworICAgIHJldHVybiBNb2R1bGU6OlZhbGlkYXRpb25SZXN1bHQoTW9kdWxlOjpjcmVhdGUocGxh
bi50YWtlTW9kdWxlSW5mb3JtYXRpb24oKSkpOworfQorCitNb2R1bGU6OlZhbGlkYXRpb25SZXN1
bHQgTW9kdWxlOjp2YWxpZGF0ZVN5bmNJbXBsKFJlZjxQbGFuPiYmIHBsYW4pCit7CisgICAgcGxh
bi0+cGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSgpOworICAgIHJldHVybiBtYWtlVmFsaWRhdGlvblJl
c3VsdChwbGFuLmdldCgpKTsKK30KKworUmVmPENvZGVCbG9jaz4gTW9kdWxlOjpnZXRPckNyZWF0
ZUNvZGVCbG9jayhWTSYgdm0sIE1lbW9yeU1vZGUgbW9kZSkKK3sKKyAgICBSZWZQdHI8Q29kZUJs
b2NrPiBjb2RlQmxvY2s7CisgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhtX2xvY2spOworICAg
IGNvZGVCbG9jayA9IG1fY29kZUJsb2Nrc1tzdGF0aWNfY2FzdDx1aW50OF90Pihtb2RlKV07Cisg
ICAgLy8gSWYgYSBwcmV2aW91cyBhdHRlbXB0IGF0IGEgY29tcGlsZSBlcnJvcmVkIG91dCwgbGV0
J3MgdHJ5IGFnYWluLgorICAgIC8vIENvbXBpbGF0aW9ucyBmcm9tIHZhbGlkIG1vZHVsZXMgY2Fu
IGZhaWwgYmVjYXVzZSBPT00gYW5kIGNhbmNlbGxhdGlvbi4KKyAgICAvLyBJdCdzIHdvcnRoIHJl
dHJ5aW5nLgorICAgIGlmICghY29kZUJsb2NrIHx8ICFjb2RlQmxvY2stPnJ1bm5hYmxlKCkpIHsK
KyAgICAgICAgY29kZUJsb2NrID0gQ29kZUJsb2NrOjpjcmVhdGUodm0sIG1vZGUsIGNvbnN0X2Nh
c3Q8TW9kdWxlSW5mb3JtYXRpb24mPihtb2R1bGVJbmZvcm1hdGlvbigpKSk7CisgICAgICAgIG1f
Y29kZUJsb2Nrc1tzdGF0aWNfY2FzdDx1aW50OF90Pihtb2RlKV0gPSBjb2RlQmxvY2s7CisgICAg
fQorICAgIHJldHVybiBjb2RlQmxvY2sucmVsZWFzZU5vbk51bGwoKTsKK30KKworUmVmPENvZGVC
bG9jaz4gTW9kdWxlOjpjb21waWxlU3luYyhWTSYgdm0sIE1lbW9yeU1vZGUgbW9kZSkKK3sKKyAg
ICBSZWY8Q29kZUJsb2NrPiBjb2RlQmxvY2sgPSBnZXRPckNyZWF0ZUNvZGVCbG9jayh2bSwgbW9k
ZSk7CisgICAgY29kZUJsb2NrLT53YWl0VW50aWxGaW5pc2hlZCgpOworICAgIHJldHVybiBjb2Rl
QmxvY2s7Cit9CisKK1BsYW46OkNvbXBsZXRpb25UYXNrIE1vZHVsZTo6bWFrZVZhbGlkYXRpb25D
YWxsYmFjayhBc3luY1ZhbGlkYXRpb25DYWxsYmFjayYmIGNhbGxiYWNrKQoreworICAgIHJldHVy
biBjcmVhdGVTaGFyZWRUYXNrPFBsYW46OkNhbGxiYWNrVHlwZT4oW2NhbGxiYWNrID0gV1RGTW92
ZShjYWxsYmFjayldIChWTSYgdm0sIFBsYW4mIHBsYW4pIHsKKyAgICAgICAgQVNTRVJUKCFwbGFu
Lmhhc1dvcmsoKSk7CisgICAgICAgIGNhbGxiYWNrLT5ydW4odm0sIG1ha2VWYWxpZGF0aW9uUmVz
dWx0KHBsYW4pKTsKKyAgICB9KTsKK30KKwordm9pZCBNb2R1bGU6OmNvbXBpbGVBc3luYyhWTSYg
dm0sIE1lbW9yeU1vZGUgbW9kZSwgQ29kZUJsb2NrOjpBc3luY0NvbXBpbGF0aW9uQ2FsbGJhY2sm
JiB0YXNrKQoreworICAgIFJlZjxDb2RlQmxvY2s+IGNvZGVCbG9jayA9IGdldE9yQ3JlYXRlQ29k
ZUJsb2NrKHZtLCBtb2RlKTsKKyAgICBjb2RlQmxvY2stPmNvbXBpbGVBc3luYyh2bSwgV1RGTW92
ZSh0YXNrKSk7Cit9CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpXYXNtCisKKyNlbmRpZiAvLyBF
TkFCTEUoV0VCQVNTRU1CTFkpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNt
TW9kdWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbU1v
ZHVsZS5oCShub25leGlzdGVudCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21N
b2R1bGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUo
V0VCQVNTRU1CTFkpCisKKyNpbmNsdWRlICJXYXNtQ2FsbGVlLmgiCisjaW5jbHVkZSAiV2FzbUNv
ZGVCbG9jay5oIgorI2luY2x1ZGUgIldhc21Nb2R1bGVJbmZvcm1hdGlvbi5oIgorI2luY2x1ZGUg
Ildhc21QbGFuLmgiCisjaW5jbHVkZSAiV2FzbVdvcmtsaXN0LmgiCisjaW5jbHVkZSA8d3RmL0V4
cGVjdGVkLmg+CisjaW5jbHVkZSA8d3RmL0xvY2suaD4KKyNpbmNsdWRlIDx3dGYvU2hhcmVkVGFz
ay5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgorCituYW1lc3BhY2Ug
SlNDIHsgbmFtZXNwYWNlIFdhc20geworICAgIAorY2xhc3MgTW9kdWxlIDogcHVibGljIFRocmVh
ZFNhZmVSZWZDb3VudGVkPE1vZHVsZT4geworcHVibGljOgorICAgIHVzaW5nIFZhbGlkYXRpb25S
ZXN1bHQgPSBXVEY6OkV4cGVjdGVkPFJlZlB0cjxNb2R1bGU+LCBTdHJpbmc+OworICAgIHR5cGVk
ZWYgdm9pZCBDYWxsYmFja1R5cGUoVk0mLCBWYWxpZGF0aW9uUmVzdWx0JiYpOworICAgIHVzaW5n
IEFzeW5jVmFsaWRhdGlvbkNhbGxiYWNrID0gUmVmUHRyPFNoYXJlZFRhc2s8Q2FsbGJhY2tUeXBl
Pj47CisKKyAgICBzdGF0aWMgUmVmPE1vZHVsZT4gY3JlYXRlKFJlZjxNb2R1bGVJbmZvcm1hdGlv
bj4mJiBtb2R1bGVJbmZvcm1hdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZigq
bmV3IE1vZHVsZShXVEZNb3ZlKG1vZHVsZUluZm9ybWF0aW9uKSkpOworICAgIH0KKworICAgIHN0
YXRpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlU3luYyhWTSYgdm0sIFZlY3Rvcjx1aW50OF90
PiYmIHNvdXJjZSkKKyAgICB7CisgICAgICAgIFJlZjxQbGFuPiBwbGFuID0gYWRvcHRSZWYoKm5l
dyBQbGFuKHZtLCBXVEZNb3ZlKHNvdXJjZSksIFBsYW46OlZhbGlkYXRpb24sIFBsYW46OmRvbnRG
aW5hbGl6ZSgpKSk7CisgICAgICAgIHJldHVybiB2YWxpZGF0ZVN5bmNJbXBsKFdURk1vdmUocGxh
bikpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlQXN5bmMoVk0mIHZtLCBWZWN0
b3I8dWludDhfdD4mJiBzb3VyY2UsIEFzeW5jVmFsaWRhdGlvbkNhbGxiYWNrJiYgY2FsbGJhY2sp
CisgICAgeworICAgICAgICBSZWY8UGxhbj4gcGxhbiA9IGFkb3B0UmVmKCpuZXcgUGxhbih2bSwg
V1RGTW92ZShzb3VyY2UpLCBQbGFuOjpWYWxpZGF0aW9uLCBtYWtlVmFsaWRhdGlvbkNhbGxiYWNr
KFdURk1vdmUoY2FsbGJhY2spKSkpOworICAgICAgICBXYXNtOjplbnN1cmVXb3JrbGlzdCgpLmVu
cXVldWUoV1RGTW92ZShwbGFuKSk7CisgICAgfQorCisgICAgV2FzbTo6U2lnbmF0dXJlSW5kZXgg
c2lnbmF0dXJlSW5kZXhGcm9tRnVuY3Rpb25JbmRleFNwYWNlKHVuc2lnbmVkIGZ1bmN0aW9uSW5k
ZXhTcGFjZSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX21vZHVsZUluZm9ybWF0aW9u
LT5zaWduYXR1cmVJbmRleEZyb21GdW5jdGlvbkluZGV4U3BhY2UoZnVuY3Rpb25JbmRleFNwYWNl
KTsKKyAgICB9CisKKyAgICBjb25zdCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxlSW5m
b3JtYXRpb24oKSBjb25zdCB7IHJldHVybiBtX21vZHVsZUluZm9ybWF0aW9uLmdldCgpOyB9CisK
KyAgICBSZWY8Q29kZUJsb2NrPiBjb21waWxlU3luYyhWTSYsIE1lbW9yeU1vZGUpOworICAgIHZv
aWQgY29tcGlsZUFzeW5jKFZNJiwgTWVtb3J5TW9kZSwgQ29kZUJsb2NrOjpBc3luY0NvbXBpbGF0
aW9uQ2FsbGJhY2smJik7CisKKyAgICBSZWY8Q29kZUJsb2NrPiBub25OdWxsQ29kZUJsb2NrKFdh
c206Ok1lbW9yeU1vZGUgbW9kZSkKKyAgICB7CisgICAgICAgIENvZGVCbG9jayogY29kZUJsb2Nr
ID0gbV9jb2RlQmxvY2tzW3N0YXRpY19jYXN0PHVpbnQ4X3Q+KG1vZGUpXS5nZXQoKTsKKyAgICAg
ICAgUkVMRUFTRV9BU1NFUlQoISFjb2RlQmxvY2spOworICAgICAgICByZXR1cm4gbWFrZVJlZigq
Y29kZUJsb2NrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUmVmPENvZGVCbG9jaz4gZ2V0T3JD
cmVhdGVDb2RlQmxvY2soVk0mLCBNZW1vcnlNb2RlKTsKKworICAgIHN0YXRpYyBWYWxpZGF0aW9u
UmVzdWx0IHZhbGlkYXRlU3luY0ltcGwoUmVmPFBsYW4+JiYpOworICAgIHN0YXRpYyBQbGFuOjpD
b21wbGV0aW9uVGFzayBtYWtlVmFsaWRhdGlvbkNhbGxiYWNrKEFzeW5jVmFsaWRhdGlvbkNhbGxi
YWNrJiYpOworCisgICAgTW9kdWxlKFJlZjxNb2R1bGVJbmZvcm1hdGlvbj4mJik7CisgICAgUmVm
PE1vZHVsZUluZm9ybWF0aW9uPiBtX21vZHVsZUluZm9ybWF0aW9uOworICAgIFJlZlB0cjxDb2Rl
QmxvY2s+IG1fY29kZUJsb2Nrc1tXYXNtOjpOdW1iZXJPZk1lbW9yeU1vZGVzXTsKKyAgICBMb2Nr
IG1fbG9jazsKK307CisKK30gfSAvLyBuYW1lc3BhY2UgSlNDOjpXYXNtCisKKyNlbmRpZiAvLyBF
TkFCTEUoV0VCQVNTRU1CTFkpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNt
UGxhbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBs
YW4uY3BwCShyZXZpc2lvbiAyMTUwNTQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9X
YXNtUGxhbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUyLDEzICs1MiwxMiBAQCBzdGF0aWMgY29u
c3QgYm9vbCB2ZXJib3NlID0gZmFsc2U7CiAKIFBsYW46OlBsYW4oVk0mIHZtLCBSZWY8TW9kdWxl
SW5mb3JtYXRpb24+IGluZm8sIEFzeW5jV29yayB3b3JrLCBDb21wbGV0aW9uVGFzayYmIHRhc2sp
CiAgICAgOiBtX21vZHVsZUluZm9ybWF0aW9uKFdURk1vdmUoaW5mbykpCi0gICAgLCBtX3ZtKHZt
KQogICAgICwgbV9zb3VyY2UobV9tb2R1bGVJbmZvcm1hdGlvbi0+c291cmNlLmRhdGEoKSkKICAg
ICAsIG1fc291cmNlTGVuZ3RoKG1fbW9kdWxlSW5mb3JtYXRpb24tPnNvdXJjZS5zaXplKCkpCiAg
ICAgLCBtX3N0YXRlKFN0YXRlOjpWYWxpZGF0ZWQpCiAgICAgLCBtX2FzeW5jV29yayh3b3JrKQog
ewotICAgIG1fY29tcGxldGlvblRhc2tzLmFwcGVuZChXVEZNb3ZlKHRhc2spKTsKKyAgICBtX2Nv
bXBsZXRpb25UYXNrcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIoJnZtLCBXVEZNb3ZlKHRhc2spKSk7
CiB9CiAKIFBsYW46OlBsYW4oVk0mIHZtLCBWZWN0b3I8dWludDhfdD4mJiBzb3VyY2UsIEFzeW5j
V29yayB3b3JrLCBDb21wbGV0aW9uVGFzayYmIHRhc2spCkBAIC02OSwxMyArNjgsMTIgQEAgUGxh
bjo6UGxhbihWTSYgdm0sIFZlY3Rvcjx1aW50OF90PiYmIHNvdQogCiBQbGFuOjpQbGFuKFZNJiB2
bSwgY29uc3QgdWludDhfdCogc291cmNlLCBzaXplX3Qgc291cmNlTGVuZ3RoLCBBc3luY1dvcmsg
d29yaywgQ29tcGxldGlvblRhc2smJiB0YXNrKQogICAgIDogbV9tb2R1bGVJbmZvcm1hdGlvbiht
YWtlUmVmKCpuZXcgTW9kdWxlSW5mb3JtYXRpb24oVmVjdG9yPHVpbnQ4X3Q+KCkpKSkKLSAgICAs
IG1fdm0odm0pCiAgICAgLCBtX3NvdXJjZShzb3VyY2UpCiAgICAgLCBtX3NvdXJjZUxlbmd0aChz
b3VyY2VMZW5ndGgpCiAgICAgLCBtX3N0YXRlKFN0YXRlOjpJbml0aWFsKQogICAgICwgbV9hc3lu
Y1dvcmsod29yaykKIHsKLSAgICBtX2NvbXBsZXRpb25UYXNrcy5hcHBlbmQoV1RGTW92ZSh0YXNr
KSk7CisgICAgbV9jb21wbGV0aW9uVGFza3MuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKCZ2bSwgV1RG
TW92ZSh0YXNrKSkpOwogfQogCiBjb25zdCBjaGFyKiBQbGFuOjpzdGF0ZVN0cmluZyhTdGF0ZSBz
dGF0ZSkKQEAgLTEwNCwxMyArMTAyLDEzIEBAIHZvaWQgUGxhbjo6ZmFpbChjb25zdCBBYnN0cmFj
dExvY2tlciYgbG8KICAgICBjb21wbGV0ZShsb2NrZXIpOwogfQogCi12b2lkIFBsYW46OmFkZENv
bXBsZXRpb25UYXNrKENvbXBsZXRpb25UYXNrJiYgdGFzaykKK3ZvaWQgUGxhbjo6YWRkQ29tcGxl
dGlvblRhc2soVk0mIHZtLCBDb21wbGV0aW9uVGFzayYmIHRhc2spCiB7CiAgICAgTG9ja0hvbGRl
ciBsb2NrZXIobV9sb2NrKTsKICAgICBpZiAobV9zdGF0ZSAhPSBTdGF0ZTo6Q29tcGxldGVkKQot
ICAgICAgICBtX2NvbXBsZXRpb25UYXNrcy5hcHBlbmQoV1RGTW92ZSh0YXNrKSk7CisgICAgICAg
IG1fY29tcGxldGlvblRhc2tzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcigmdm0sIFdURk1vdmUodGFz
aykpKTsKICAgICBlbHNlCi0gICAgICAgIHRhc2soKnRoaXMpOworICAgICAgICB0YXNrLT5ydW4o
dm0sICp0aGlzKTsKIH0KIAogYm9vbCBQbGFuOjpwYXJzZUFuZFZhbGlkYXRlTW9kdWxlKCkKQEAg
LTE4Miw3ICsxODAsNyBAQCB2b2lkIFBsYW46OnByZXBhcmUoKQogICAgIH07CiAKICAgICBjb25z
dCBhdXRvJiBmdW5jdGlvbkxvY2F0aW9ucyA9IG1fbW9kdWxlSW5mb3JtYXRpb24tPmZ1bmN0aW9u
TG9jYXRpb25JbkJpbmFyeTsKLSAgICBpZiAoIXRyeVJlc2VydmVDYXBhY2l0eShtX3dhc21FeGl0
U3R1YnMsIG1fbW9kdWxlSW5mb3JtYXRpb24tPmltcG9ydEZ1bmN0aW9uU2lnbmF0dXJlSW5kaWNl
cy5zaXplKCksICIgV2ViQXNzZW1ibHkgdG8gSmF2YVNjcmlwdCBzdHVicyIpCisgICAgaWYgKCF0
cnlSZXNlcnZlQ2FwYWNpdHkobV93YXNtVG9XYXNtRXhpdFN0dWJzLCBtX21vZHVsZUluZm9ybWF0
aW9uLT5pbXBvcnRGdW5jdGlvblNpZ25hdHVyZUluZGljZXMuc2l6ZSgpLCAiIFdlYkFzc2VtYmx5
IHRvIEphdmFTY3JpcHQgc3R1YnMiKQogICAgICAgICB8fCAhdHJ5UmVzZXJ2ZUNhcGFjaXR5KG1f
dW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIGZ1bmN0aW9uTG9jYXRpb25zLnNpemUoKSwgIiB1bmxp
bmtlZCBXZWJBc3NlbWJseSB0byBXZWJBc3NlbWJseSBjYWxscyIpCiAgICAgICAgIHx8ICF0cnlS
ZXNlcnZlQ2FwYWNpdHkobV93YXNtSW50ZXJuYWxGdW5jdGlvbnMsIGZ1bmN0aW9uTG9jYXRpb25z
LnNpemUoKSwgIiBXZWJBc3NlbWJseSBmdW5jdGlvbnMiKQogICAgICAgICB8fCAhdHJ5UmVzZXJ2
ZUNhcGFjaXR5KG1fY29tcGlsYXRpb25Db250ZXh0cywgZnVuY3Rpb25Mb2NhdGlvbnMuc2l6ZSgp
LCAiIGNvbXBpbGF0aW9uIGNvbnRleHRzIikpCkBAIC0xOTYsMTAgKzE5NCw5IEBAIHZvaWQgUGxh
bjo6cHJlcGFyZSgpCiAgICAgICAgIEltcG9ydCogaW1wb3J0ID0gJm1fbW9kdWxlSW5mb3JtYXRp
b24tPmltcG9ydHNbaW1wb3J0SW5kZXhdOwogICAgICAgICBpZiAoaW1wb3J0LT5raW5kICE9IEV4
dGVybmFsS2luZDo6RnVuY3Rpb24pCiAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgdW5z
aWduZWQgaW1wb3J0RnVuY3Rpb25JbmRleCA9IG1fd2FzbUV4aXRTdHVicy5zaXplKCk7CisgICAg
ICAgIHVuc2lnbmVkIGltcG9ydEZ1bmN0aW9uSW5kZXggPSBtX3dhc21Ub1dhc21FeGl0U3R1YnMu
c2l6ZSgpOwogICAgICAgICBkYXRhTG9nTG5JZih2ZXJib3NlLCAiUHJvY2Vzc2luZyBpbXBvcnQg
ZnVuY3Rpb24gbnVtYmVyICIsIGltcG9ydEZ1bmN0aW9uSW5kZXgsICI6ICIsIG1ha2VTdHJpbmco
aW1wb3J0LT5tb2R1bGUpLCAiOiAiLCBtYWtlU3RyaW5nKGltcG9ydC0+ZmllbGQpKTsKLSAgICAg
ICAgU2lnbmF0dXJlSW5kZXggc2lnbmF0dXJlSW5kZXggPSBtX21vZHVsZUluZm9ybWF0aW9uLT5p
bXBvcnRGdW5jdGlvblNpZ25hdHVyZUluZGljZXMuYXQoaW1wb3J0LT5raW5kSW5kZXgpOwotICAg
ICAgICBtX3dhc21FeGl0U3R1YnMudW5jaGVja2VkQXBwZW5kKGV4aXRTdHViR2VuZXJhdG9yKCZt
X3ZtLCBtX2NhbGxMaW5rSW5mb3MsIHNpZ25hdHVyZUluZGV4LCBpbXBvcnRGdW5jdGlvbkluZGV4
KSk7CisgICAgICAgIG1fd2FzbVRvV2FzbUV4aXRTdHVicy51bmNoZWNrZWRBcHBlbmQod2FzbVRv
V2FzbShpbXBvcnRGdW5jdGlvbkluZGV4KSk7CiAgICAgfQogCiAgICAgbW92ZVRvU3RhdGUoU3Rh
dGU6OlByZXBhcmVkKTsKQEAgLTI2MCw3ICsyNTcsNyBAQCB2b2lkIFBsYW46OmNvbXBpbGVGdW5j
dGlvbnMoQ29tcGlsYXRpb25FCiAgICAgICAgIEFTU0VSVChmdW5jdGlvbkxlbmd0aCA8PSBtX3Nv
dXJjZUxlbmd0aCk7CiAgICAgICAgIFNpZ25hdHVyZUluZGV4IHNpZ25hdHVyZUluZGV4ID0gbV9t
b2R1bGVJbmZvcm1hdGlvbi0+aW50ZXJuYWxGdW5jdGlvblNpZ25hdHVyZUluZGljZXNbZnVuY3Rp
b25JbmRleF07CiAgICAgICAgIGNvbnN0IFNpZ25hdHVyZSYgc2lnbmF0dXJlID0gU2lnbmF0dXJl
SW5mb3JtYXRpb246OmdldChzaWduYXR1cmVJbmRleCk7Ci0gICAgICAgIHVuc2lnbmVkIGZ1bmN0
aW9uSW5kZXhTcGFjZSA9IG1fd2FzbUV4aXRTdHVicy5zaXplKCkgKyBmdW5jdGlvbkluZGV4Owor
ICAgICAgICB1bnNpZ25lZCBmdW5jdGlvbkluZGV4U3BhY2UgPSBtX3dhc21Ub1dhc21FeGl0U3R1
YnMuc2l6ZSgpICsgZnVuY3Rpb25JbmRleDsKICAgICAgICAgQVNTRVJUX1VOVVNFRChmdW5jdGlv
bkluZGV4U3BhY2UsIG1fbW9kdWxlSW5mb3JtYXRpb24tPnNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0
aW9uSW5kZXhTcGFjZShmdW5jdGlvbkluZGV4U3BhY2UpID09IHNpZ25hdHVyZUluZGV4KTsKICAg
ICAgICAgQVNTRVJUKHZhbGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5n
dGgsIHNpZ25hdHVyZSwgbV9tb2R1bGVJbmZvcm1hdGlvbi5nZXQoKSkpOwogCkBAIC0zMTYsOSAr
MzEzLDkgQEAgdm9pZCBQbGFuOjpjb21wbGV0ZShjb25zdCBBYnN0cmFjdExvY2tlcgogICAgICAg
ICAgICAgICAgIHZvaWQqIGV4ZWN1dGFibGVBZGRyZXNzOwogICAgICAgICAgICAgICAgIGlmICht
X21vZHVsZUluZm9ybWF0aW9uLT5pc0ltcG9ydGVkRnVuY3Rpb25Gcm9tRnVuY3Rpb25JbmRleFNw
YWNlKGNhbGwuZnVuY3Rpb25JbmRleCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUg
aW1wb3J0cyBjb3VsZCBoYXZlIGJlZW4gbGlua2VkIGluIEIzLCBpbnN0ZWFkIG9mIGdlbmVyYXRp
bmcgYSBwYXRjaHBvaW50LiBUaGlzIGNvbmRpdGlvbiBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBS
RUxFQVNFX0FTU0VSVC4gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2
NjQ2MgotICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlQWRkcmVzcyA9IG1fd2FzbUV4aXRT
dHVicy5hdChjYWxsLmZ1bmN0aW9uSW5kZXgpLndhc21Ub1dhc20uY29kZSgpLmV4ZWN1dGFibGVB
ZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVBZGRyZXNzID0gbV93YXNt
VG9XYXNtRXhpdFN0dWJzLmF0KGNhbGwuZnVuY3Rpb25JbmRleCkuY29kZSgpLmV4ZWN1dGFibGVB
ZGRyZXNzKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGV4
ZWN1dGFibGVBZGRyZXNzID0gbV93YXNtSW50ZXJuYWxGdW5jdGlvbnMuYXQoY2FsbC5mdW5jdGlv
bkluZGV4IC0gbV93YXNtRXhpdFN0dWJzLnNpemUoKSktPndhc21FbnRyeXBvaW50LmNvbXBpbGF0
aW9uLT5jb2RlKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgZXhl
Y3V0YWJsZUFkZHJlc3MgPSBtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucy5hdChjYWxsLmZ1bmN0aW9u
SW5kZXggLSBtX3dhc21Ub1dhc21FeGl0U3R1YnMuc2l6ZSgpKS0+d2FzbUVudHJ5cG9pbnQuY29t
cGlsYXRpb24tPmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOwogICAgICAgICAgICAgICAgIE1h
Y3JvQXNzZW1ibGVyOjpyZXBhdGNoQ2FsbChjYWxsLmNhbGxMb2NhdGlvbiwgQ29kZUxvY2F0aW9u
TGFiZWwoZXhlY3V0YWJsZUFkZHJlc3MpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAt
MzI3LDcgKzMyNCw3IEBAIHZvaWQgUGxhbjo6Y29tcGxldGUoY29uc3QgQWJzdHJhY3RMb2NrZXIK
ICAgICBpZiAobV9zdGF0ZSAhPSBTdGF0ZTo6Q29tcGxldGVkKSB7CiAgICAgICAgIG1vdmVUb1N0
YXRlKFN0YXRlOjpDb21wbGV0ZWQpOwogICAgICAgICBmb3IgKGF1dG8mIHRhc2sgOiBtX2NvbXBs
ZXRpb25UYXNrcykKLSAgICAgICAgICAgIHRhc2soKnRoaXMpOworICAgICAgICAgICAgdGFzay5z
ZWNvbmQtPnJ1bigqdGFzay5maXJzdCwgKnRoaXMpOwogICAgICAgICBtX2NvbXBsZXRlZC5ub3Rp
ZnlBbGwoKTsKICAgICB9CiB9CkBAIC0zNDEsMTMgKzMzOCwzMiBAQCB2b2lkIFBsYW46OndhaXRG
b3JDb21wbGV0aW9uKCkKICAgICB9CiB9CiAKLXZvaWQgUGxhbjo6Y2FuY2VsKCkKK2Jvb2wgUGxh
bjo6dHJ5UmVtb3ZlVk1BbmRDYW5jZWxJZkxhc3QoVk0mIHZtKQogewogICAgIExvY2tIb2xkZXIg
bG9ja2VyKG1fbG9jayk7Ci0gICAgaWYgKG1fc3RhdGUgIT0gU3RhdGU6OkNvbXBsZXRlZCkgewor
CisgICAgYm9vbCByZW1vdmVkQW55VGFza3MgPSBmYWxzZTsKKyAgICBtX2NvbXBsZXRpb25UYXNr
cy5yZW1vdmVBbGxNYXRjaGluZyhbJl0gKGNvbnN0IHN0ZDo6cGFpcjxWTSosIENvbXBsZXRpb25U
YXNrPiYgcGFpcikgeworICAgICAgICBib29sIHNob3VsZFJlbW92ZSA9IHBhaXIuZmlyc3QgPT0g
JnZtOworICAgICAgICByZW1vdmVkQW55VGFza3MgfD0gc2hvdWxkUmVtb3ZlOworICAgICAgICBy
ZXR1cm4gc2hvdWxkUmVtb3ZlOworICAgIH0pOworCisgICAgaWYgKCFyZW1vdmVkQW55VGFza3Mp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX3N0YXRlID09IFN0YXRlOjpDb21w
bGV0ZWQpIHsKKyAgICAgICAgLy8gV2UgdHJpdmlhbGx5IGNhbmNlbCBhbnl0aGluZyB0aGF0J3Mg
Y29tcGxldGVkLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobV9jb21w
bGV0aW9uVGFza3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIG1fY3VycmVudEluZGV4ID0gbV9tb2R1
bGVJbmZvcm1hdGlvbi0+ZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKTsKICAgICAgICAg
ZmFpbChsb2NrZXIsIEFTQ0lJTGl0ZXJhbCgiV2ViQXNzZW1ibHkgUGxhbiB3YXMgY2FuY2VsZWQu
IElmIHlvdSBzZWUgdGhpcyBlcnJvciBtZXNzYWdlIHBsZWFzZSBmaWxlIGEgYnVnIGF0IGJ1Z3Mu
d2Via2l0Lm9yZyEiKSk7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKworICAgIHJldHVy
biBmYWxzZTsKIH0KIAogUGxhbjo6flBsYW4oKSB7IH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS93YXNtL1dhc21QbGFuLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3dhc20vV2FzbVBsYW4uaAkocmV2aXNpb24gMjE1MDU0KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vV2FzbVBsYW4uaAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAogI2lu
Y2x1ZGUgIldhc21CM0lSR2VuZXJhdG9yLmgiCiAjaW5jbHVkZSAiV2FzbU1vZHVsZUluZm9ybWF0
aW9uLmgiCiAjaW5jbHVkZSA8d3RmL0JhZy5oPgorI2luY2x1ZGUgPHd0Zi9TaGFyZWRUYXNrLmg+
CiAjaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+CiAjaW5jbHVkZSA8d3RmL1Zl
Y3Rvci5oPgogCkBAIC00NSw4ICs0Niw5IEBAIG5hbWVzcGFjZSBXYXNtIHsKIAogY2xhc3MgUGxh
biA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxQbGFuPiB7CiBwdWJsaWM6Ci0gICAgc3Rh
dGljIHZvaWQgZG9udEZpbmFsaXplKFBsYW4mKSB7IH0KLSAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rp
b248dm9pZChQbGFuJik+IENvbXBsZXRpb25UYXNrOworICAgIHR5cGVkZWYgdm9pZCBDYWxsYmFj
a1R5cGUoVk0mLCBQbGFuJik7CisgICAgdXNpbmcgQ29tcGxldGlvblRhc2sgPSBSZWZQdHI8U2hh
cmVkVGFzazxDYWxsYmFja1R5cGU+PjsKKyAgICBzdGF0aWMgQ29tcGxldGlvblRhc2sgZG9udEZp
bmFsaXplKCkgeyByZXR1cm4gY3JlYXRlU2hhcmVkVGFzazxDYWxsYmFja1R5cGU+KFtdKFZNJiwg
UGxhbiYpIHsgfSk7IH0KICAgICBlbnVtIEFzeW5jV29yayA6IHVpbnQ4X3QgeyBGdWxsQ29tcGls
ZSwgVmFsaWRhdGlvbiB9OwogICAgIC8vIE5vdGU6IENvbXBsZXRpb25UYXNrIHNob3VsZCBub3Qg
aG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgUGxhbiBvdGhlcndpc2UgdGhlcmUgd2lsbCBiZSBhIHJl
ZmVyZW5jZSBjeWNsZS4KICAgICBQbGFuKFZNJiwgUmVmPE1vZHVsZUluZm9ybWF0aW9uPiwgQXN5
bmNXb3JrLCBDb21wbGV0aW9uVGFzayYmKTsKQEAgLTU2LDcgKzU4LDkgQEAgcHVibGljOgogICAg
IEpTX0VYUE9SVF9QUklWQVRFIFBsYW4oVk0mLCBjb25zdCB1aW50OF90Kiwgc2l6ZV90LCBBc3lu
Y1dvcmssIENvbXBsZXRpb25UYXNrJiYpOwogICAgIEpTX0VYUE9SVF9QUklWQVRFIH5QbGFuKCk7
CiAKLSAgICB2b2lkIGFkZENvbXBsZXRpb25UYXNrKENvbXBsZXRpb25UYXNrJiYpOworICAgIC8v
IElmIHlvdSBndWFyYW50ZWUgdGhlIG9yZGVyaW5nIGhlcmUsIHlvdSBjYW4gcmVseSBvbiBGSUZP
IG9mIHRoZQorICAgIC8vIGNvbXBsZXRpb24gdGFza3MgYmVpbmcgY2FsbGVkLgorICAgIHZvaWQg
YWRkQ29tcGxldGlvblRhc2soVk0mLCBDb21wbGV0aW9uVGFzayYmKTsKIAogICAgIGJvb2wgcGFy
c2VBbmRWYWxpZGF0ZU1vZHVsZSgpOwogCkBAIC05MSwxNSArOTUsMTQgQEAgcHVibGljOgogICAg
ICAgICByZXR1cm4gV1RGTW92ZShtX2NhbGxMaW5rSW5mb3MpOwogICAgIH0KIAotICAgIFZlY3Rv
cjxXYXNtRXhpdFN0dWJzPiYmIHRha2VXYXNtRXhpdFN0dWJzKCkKKyAgICBWZWN0b3I8TWFjcm9B
c3NlbWJsZXJDb2RlUmVmPiYmIHRha2VXYXNtVG9XYXNtRXhpdFN0dWJzKCkKICAgICB7CiAgICAg
ICAgIFJFTEVBU0VfQVNTRVJUKCFmYWlsZWQoKSAmJiAhaGFzV29yaygpKTsKLSAgICAgICAgcmV0
dXJuIFdURk1vdmUobV93YXNtRXhpdFN0dWJzKTsKKyAgICAgICAgcmV0dXJuIFdURk1vdmUobV93
YXNtVG9XYXNtRXhpdFN0dWJzKTsKICAgICB9CiAKICAgICB2b2lkIHNldE1vZGUoTWVtb3J5TW9k
ZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KICAgICBNZW1vcnlNb2RlIG1vZGUoKSBjb25zdCB7
IHJldHVybiBtX21vZGU7IH0KLSAgICBWTSYgdm0oKSBjb25zdCB7IHJldHVybiBtX3ZtOyB9CiAK
ICAgICBlbnVtIGNsYXNzIFN0YXRlIDogdWludDhfdCB7CiAgICAgICAgIEluaXRpYWwsCkBAIC0x
MTYsNyArMTE5LDggQEAgcHVibGljOgogICAgIGJvb2wgaGFzQmVlblByZXBhcmVkKCkgY29uc3Qg
eyByZXR1cm4gbV9zdGF0ZSA+PSBTdGF0ZTo6UHJlcGFyZWQ7IH0KIAogICAgIHZvaWQgd2FpdEZv
ckNvbXBsZXRpb24oKTsKLSAgICB2b2lkIGNhbmNlbCgpOworICAgIC8vIFJldHVybnMgdHJ1ZSBp
ZiBpdCBjYW5jZWxsZWQgdGhlIHBsYW4uCisgICAgYm9vbCB0cnlSZW1vdmVWTUFuZENhbmNlbElm
TGFzdChWTSYpOwogCiBwcml2YXRlOgogICAgIGNsYXNzIFRocmVhZENvdW50SG9sZGVyOwpAQCAt
MTMxLDEyICsxMzUsMTEgQEAgcHJpdmF0ZToKIAogICAgIFJlZjxNb2R1bGVJbmZvcm1hdGlvbj4g
bV9tb2R1bGVJbmZvcm1hdGlvbjsKICAgICBCYWc8Q2FsbExpbmtJbmZvPiBtX2NhbGxMaW5rSW5m
b3M7Ci0gICAgVmVjdG9yPFdhc21FeGl0U3R1YnM+IG1fd2FzbUV4aXRTdHViczsKKyAgICBWZWN0
b3I8TWFjcm9Bc3NlbWJsZXJDb2RlUmVmPiBtX3dhc21Ub1dhc21FeGl0U3R1YnM7CiAgICAgVmVj
dG9yPHN0ZDo6dW5pcXVlX3B0cjxXYXNtSW50ZXJuYWxGdW5jdGlvbj4+IG1fd2FzbUludGVybmFs
RnVuY3Rpb25zOwogICAgIFZlY3RvcjxDb21waWxhdGlvbkNvbnRleHQ+IG1fY29tcGlsYXRpb25D
b250ZXh0czsKIAotICAgIFZNJiBtX3ZtOwotICAgIFZlY3RvcjxDb21wbGV0aW9uVGFzaywgMT4g
bV9jb21wbGV0aW9uVGFza3M7CisgICAgVmVjdG9yPHN0ZDo6cGFpcjxWTSosIENvbXBsZXRpb25U
YXNrPiwgMT4gbV9jb21wbGV0aW9uVGFza3M7CiAKICAgICBWZWN0b3I8VmVjdG9yPFVubGlua2Vk
V2FzbVRvV2FzbUNhbGw+PiBtX3VubGlua2VkV2FzbVRvV2FzbUNhbGxzOwogICAgIGNvbnN0IHVp
bnQ4X3QqIG1fc291cmNlOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVdv
cmtsaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNt
V29ya2xpc3QuY3BwCShyZXZpc2lvbiAyMTUwNTQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d2FzbS9XYXNtV29ya2xpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMTcsMTggKzIxNywxOSBA
QCB2b2lkIFdvcmtsaXN0OjpzdG9wQWxsUGxhbnNGb3JWTShWTSYgdm0pCiB7CiAgICAgTG9ja0hv
bGRlciBsb2NrZXIoKm1fbG9jayk7CiAgICAgaXRlcmF0ZShsb2NrZXIsIFsmXSAoUXVldWVFbGVt
ZW50JiBlbGVtZW50KSB7Ci0gICAgICAgIGlmICgmZWxlbWVudC5wbGFuLT52bSgpID09ICZ2bSkg
ewotICAgICAgICAgICAgZWxlbWVudC5wbGFuLT5jYW5jZWwoKTsKKyAgICAgICAgYm9vbCBkaWRD
YW5jZWwgPSBlbGVtZW50LnBsYW4tPnRyeVJlbW92ZVZNQW5kQ2FuY2VsSWZMYXN0KHZtKTsKKyAg
ICAgICAgaWYgKGRpZENhbmNlbCkKICAgICAgICAgICAgIHJldHVybiBJdGVyYXRlUmVzdWx0OjpE
cm9wQW5kQ29udGludWU7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIEl0ZXJhdGVSZXN1bHQ6
OkNvbnRpbnVlOwogICAgIH0pOwogCiAgICAgZm9yIChhdXRvJiB0aHJlYWQgOiBtX3RocmVhZHMp
IHsKLSAgICAgICAgaWYgKHRocmVhZC0+ZWxlbWVudC5wbGFuICYmICZ0aHJlYWQtPmVsZW1lbnQu
cGxhbi0+dm0oKSA9PSAmdm0pIHsKLSAgICAgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gd29y
cnkgYWJvdXQgdGhlIGRlYWRsb2NraW5nIHNpbmNlIHRoZSB0aHJlYWQgY2FuJ3QgYmxvY2sgd2l0
aG91dCBjbGVhcmluZyB0aGUgcGxhbiBhbmQgbXVzdCBob2xkIHRoZSBsb2NrIHRvIGRvIHNvLgot
ICAgICAgICAgICAgdGhyZWFkLT5lbGVtZW50LnBsYW4tPmNhbmNlbCgpOwotICAgICAgICAgICAg
dGhyZWFkLT5zeW5jaHJvbml6ZS53YWl0KCptX2xvY2spOworICAgICAgICBpZiAodGhyZWFkLT5l
bGVtZW50LnBsYW4pIHsKKyAgICAgICAgICAgIGJvb2wgZGlkQ2FuY2VsID0gdGhyZWFkLT5lbGVt
ZW50LnBsYW4tPnRyeVJlbW92ZVZNQW5kQ2FuY2VsSWZMYXN0KHZtKTsKKyAgICAgICAgICAgIGlm
IChkaWRDYW5jZWwpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5
IGFib3V0IHRoZSBkZWFkbG9ja2luZyBzaW5jZSB0aGUgdGhyZWFkIGNhbid0IGJsb2NrIHdpdGhv
dXQgY2xlYXJpbmcgdGhlIHBsYW4gYW5kIG11c3QgaG9sZCB0aGUgbG9jayB0byBkbyBzby4KKyAg
ICAgICAgICAgICAgICB0aHJlYWQtPnN5bmNocm9uaXplLndhaXQoKm1fbG9jayk7CisgICAgICAg
ICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d2FzbS9qcy9KU1dlYkFzc2VtYmx5Q29kZUJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5Q29kZUJsb2NrLmNwcAkocmV2aXNp
b24gMjE1MDU0KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJs
eUNvZGVCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDU1ICszMiwyNyBAQAogI2luY2x1
ZGUgIkpTV2ViQXNzZW1ibHlMaW5rRXJyb3IuaCIKICNpbmNsdWRlICJKU1dlYkFzc2VtYmx5TWVt
b3J5LmgiCiAjaW5jbHVkZSAiSlNXZWJBc3NlbWJseU1vZHVsZS5oIgorI2luY2x1ZGUgIldhc21C
aW5kaW5nLmgiCiAjaW5jbHVkZSAiV2FzbVBsYW5JbmxpbmVzLmgiCiAKKyNpbmNsdWRlIDx3dGYv
Q3VycmVudFRpbWUuaD4KKwogbmFtZXNwYWNlIEpTQyB7CiAKIGNvbnN0IENsYXNzSW5mbyBKU1dl
YkFzc2VtYmx5Q29kZUJsb2NrOjpzX2luZm8gPSB7ICJXZWJBc3NlbWJseUNvZGVCbG9jayIsIG51
bGxwdHIsIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoSlNXZWJBc3NlbWJseUNvZGVCbG9jaykgfTsK
IAotSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6SlNXZWJBc3NlbWJseUNvZGVCbG9jayhWTSYgdm0s
IEpTV2ViQXNzZW1ibHlNb2R1bGUqIG93bmVyLCAgV2FzbTo6TWVtb3J5TW9kZSBtb2RlLCBSZWY8
V2FzbTo6UGxhbj4mJiBwbGFuLCB1bnNpZ25lZCBjYWxsZWVDb3VudCkKK0pTV2ViQXNzZW1ibHlD
b2RlQmxvY2s6OkpTV2ViQXNzZW1ibHlDb2RlQmxvY2soVk0mIHZtLCBSZWY8V2FzbTo6Q29kZUJs
b2NrPiYmIGNvZGVCbG9jaywgY29uc3QgV2FzbTo6TW9kdWxlSW5mb3JtYXRpb24mIG1vZHVsZUlu
Zm9ybWF0aW9uKQogICAgIDogQmFzZSh2bSwgdm0ud2ViQXNzZW1ibHlDb2RlQmxvY2tTdHJ1Y3R1
cmUuZ2V0KCkpCi0gICAgLCBtX3BsYW4oV1RGTW92ZShwbGFuKSkKLSAgICAsIG1fbW9kZShtb2Rl
KQotICAgICwgbV9jYWxsZWVDb3VudChjYWxsZWVDb3VudCkKLXsKLSAgICBtX21vZHVsZS5zZXQo
dm0sIHRoaXMsIG93bmVyKTsKLSAgICBBU1NFUlQoIW1vZHVsZSgpLT5jb2RlQmxvY2sobW9kZSkp
OwotICAgIG1vZHVsZSgpLT5zZXRDb2RlQmxvY2sodm0sIG1vZGUsIHRoaXMpOwotICAgIG1fY2Fs
bGVlcy5yZXNpemUobV9jYWxsZWVDb3VudCAqIDIpOwotfQotCi12b2lkIEpTV2ViQXNzZW1ibHlD
b2RlQmxvY2s6OmluaXRpYWxpemUoKQorICAgICwgbV9jb2RlQmxvY2soV1RGTW92ZShjb2RlQmxv
Y2spKQogewotICAgIGlmIChpbml0aWFsaXplZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBW
TSYgdm0gPSBwbGFuKCkudm0oKTsKLSAgICBBU1NFUlRfVU5VU0VEKHZtLCB2bS5jdXJyZW50VGhy
ZWFkSXNIb2xkaW5nQVBJTG9jaygpKTsKLSAgICBSRUxFQVNFX0FTU0VSVCghcGxhbigpLmhhc1dv
cmsoKSk7Ci0KLSAgICBpZiAocGxhbigpLmZhaWxlZCgpKSB7Ci0gICAgICAgIG1fZXJyb3JNZXNz
YWdlID0gcGxhbigpLmVycm9yTWVzc2FnZSgpOwotICAgICAgICBtX3BsYW4gPSBudWxscHRyOwot
ICAgICAgICByZXR1cm47CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBub3QgbmVlZCB0byBkbyB0
aGlzIHN5bmNocm9ub3VzbHkuCisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTE3MDU2NworICAgIG1fd2FzbVRvSlNFeGl0U3R1YnMucmVzZXJ2ZUNhcGFjaXR5
KG1fY29kZUJsb2NrLT5mdW5jdGlvbkltcG9ydENvdW50KCkpOworICAgIGZvciAodW5zaWduZWQg
aW1wb3J0SW5kZXggPSAwOyBpbXBvcnRJbmRleCA8IG1fY29kZUJsb2NrLT5mdW5jdGlvbkltcG9y
dENvdW50KCk7ICsraW1wb3J0SW5kZXgpIHsKKyAgICAgICAgV2FzbTo6U2lnbmF0dXJlSW5kZXgg
c2lnbmF0dXJlSW5kZXggPSBtb2R1bGVJbmZvcm1hdGlvbi5pbXBvcnRGdW5jdGlvblNpZ25hdHVy
ZUluZGljZXMuYXQoaW1wb3J0SW5kZXgpOworICAgICAgICBtX3dhc21Ub0pTRXhpdFN0dWJzLnVu
Y2hlY2tlZEFwcGVuZChXYXNtOjp3YXNtVG9Kcygmdm0sIG1fY2FsbExpbmtJbmZvcywgc2lnbmF0
dXJlSW5kZXgsIGltcG9ydEluZGV4KSk7CisgICAgICAgIGltcG9ydFdhc21Ub0pTU3R1YihpbXBv
cnRJbmRleCkgPSBtX3dhc21Ub0pTRXhpdFN0dWJzW2ltcG9ydEluZGV4XS5jb2RlKCkuZXhlY3V0
YWJsZUFkZHJlc3MoKTsKICAgICB9Ci0KLSAgICBSRUxFQVNFX0FTU0VSVChwbGFuKCkubW9kZSgp
ID09IG1vZGUoKSk7Ci0gICAgQVNTRVJUKHBsYW4oKS5pbnRlcm5hbEZ1bmN0aW9uQ291bnQoKSA9
PSBtX2NhbGxlZUNvdW50KTsKLQotICAgIG1fY2FsbExpbmtJbmZvcyA9IHBsYW4oKS50YWtlQ2Fs
bExpbmtJbmZvcygpOwotICAgIG1fd2FzbUV4aXRTdHVicyA9IHBsYW4oKS50YWtlV2FzbUV4aXRT
dHVicygpOwotCi0gICAgLy8gVGhlIGNvZGUgYSBtb2R1bGUgZW1pdHMgdG8gY2FsbCBpbnRvIEpT
IHJlbGllcyBvbiB1cyB0byBzZXQgdGhpcyB1cC4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbV93YXNtRXhpdFN0dWJzLnNpemUoKTsgaSsrKQotICAgICAgICBpbXBvcnRXYXNtVG9KU1N0
dWIoaSkgPSBtX3dhc21FeGl0U3R1YnNbaV0ud2FzbVRvSnMuY29kZSgpLmV4ZWN1dGFibGVBZGRy
ZXNzKCk7Ci0KLSAgICBwbGFuKCkuaW5pdGlhbGl6ZUNhbGxlZXMoWyZdICh1bnNpZ25lZCBjYWxs
ZWVJbmRleCwgUmVmPFdhc206OkNhbGxlZT4mJiBqc0VudHJ5cG9pbnRDYWxsZWUsIFJlZjxXYXNt
OjpDYWxsZWU+JiYgd2FzbUVudHJ5cG9pbnRDYWxsZWUpIHsKLSAgICAgICAgc2V0SlNFbnRyeXBv
aW50Q2FsbGVlKGNhbGxlZUluZGV4LCBXVEZNb3ZlKGpzRW50cnlwb2ludENhbGxlZSkpOwotICAg
ICAgICBzZXRXYXNtRW50cnlwb2ludENhbGxlZShjYWxsZWVJbmRleCwgV1RGTW92ZSh3YXNtRW50
cnlwb2ludENhbGxlZSkpOwotICAgIH0pOwotCi0gICAgbV9wbGFuID0gbnVsbHB0cjsKIH0KIAog
dm9pZCBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjpkZXN0cm95KEpTQ2VsbCogY2VsbCkKQEAgLTkw
LDI0ICs2Miw3IEBAIHZvaWQgSlNXZWJBc3NlbWJseUNvZGVCbG9jazo6ZGVzdHJveShKU0MKIAog
Ym9vbCBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrOjppc1NhZmVUb1J1bihKU1dlYkFzc2VtYmx5TWVt
b3J5KiBtZW1vcnkpIGNvbnN0CiB7Ci0gICAgaWYgKCFydW5uYWJsZSgpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICBXYXNtOjpNZW1vcnlNb2RlIGNvZGVNb2RlID0gbW9kZSgpOwotICAg
IFdhc206Ok1lbW9yeU1vZGUgbWVtb3J5TW9kZSA9IG1lbW9yeS0+bWVtb3J5KCkubW9kZSgpOwot
ICAgIHN3aXRjaCAoY29kZU1vZGUpIHsKLSAgICBjYXNlIFdhc206Ok1lbW9yeU1vZGU6OkJvdW5k
c0NoZWNraW5nOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIFdhc206Ok1lbW9yeU1v
ZGU6OlNpZ25hbGluZzoKLSAgICAgICAgLy8gQ29kZSBiZWluZyBpbiBTaWduYWxpbmcgbW9kZSBt
ZWFucyB0aGF0IGl0IHBlcmZvcm1zIG5vIGJvdW5kcyBjaGVja3MuCi0gICAgICAgIC8vIEl0cyBt
ZW1vcnksIGV2ZW4gaWYgZW1wdHksIGFic29sdXRlbHkgbXVzdCBhbHNvIGJlIGluIFNpZ25hbGlu
ZyBtb2RlCi0gICAgICAgIC8vIGJlY2F1c2UgdGhlIHBhZ2UgcHJvdGVjdGlvbiBkZXRlY3RzIG91
dC1vZi1ib3VuZHMgYWNjZXNzZXMuCi0gICAgICAgIHJldHVybiBtZW1vcnlNb2RlID09IFdhc206
Ok1lbW9yeU1vZGU6OlNpZ25hbGluZzsKLSAgICBjYXNlIFdhc206Ok1lbW9yeU1vZGU6Ok51bWJl
ck9mTWVtb3J5TW9kZXM6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBSRUxFQVNFX0FTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gbV9jb2RlQmxv
Y2stPmlzU2FmZVRvUnVuKG1lbW9yeS0+bWVtb3J5KCkubW9kZSgpKTsKIH0KIAogdm9pZCBKU1dl
YkFzc2VtYmx5Q29kZUJsb2NrOjp2aXNpdENoaWxkcmVuKEpTQ2VsbCogY2VsbCwgU2xvdFZpc2l0
b3ImIHZpc2l0b3IpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFz
c2VtYmx5Q29kZUJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dh
c20vanMvSlNXZWJBc3NlbWJseUNvZGVCbG9jay5oCShyZXZpc2lvbiAyMTUwNTQpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5Q29kZUJsb2NrLmgJKHdvcmtp
bmcgY29weSkKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJVbmNvbmRpdGlvbmFsRmluYWxp
emVyLmgiCiAjaW5jbHVkZSAiV2FzbUNhbGxlZS5oIgogI2luY2x1ZGUgIldhc21Gb3JtYXQuaCIK
KyNpbmNsdWRlICJXYXNtTW9kdWxlLmgiCiAjaW5jbHVkZSA8d3RmL0JhZy5oPgogI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KIApAQCAtNTAsOSArNTEsOSBAQCBwdWJsaWM6CiAgICAgdHlwZWRlZiBK
U0NlbGwgQmFzZTsKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBC
YXNlOjpTdHJ1Y3R1cmVGbGFncyB8IFN0cnVjdHVyZUlzSW1tb3J0YWw7CiAKLSAgICBzdGF0aWMg
SlNXZWJBc3NlbWJseUNvZGVCbG9jayogY3JlYXRlKFZNJiB2bSwgSlNXZWJBc3NlbWJseU1vZHVs
ZSogb3duZXIsIFdhc206Ok1lbW9yeU1vZGUgbW9kZSwgUmVmPFdhc206OlBsYW4+JiYgcGxhbiwg
dW5zaWduZWQgY2FsbGVlQ291bnQsIHVuc2lnbmVkIGZ1bmN0aW9uSW1wb3J0Q291bnQpCisgICAg
c3RhdGljIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2sqIGNyZWF0ZShWTSYgdm0sIFJlZjxXYXNtOjpD
b2RlQmxvY2s+IGNvZGVCbG9jaywgY29uc3QgV2FzbTo6TW9kdWxlSW5mb3JtYXRpb24mIG1vZHVs
ZUluZm9ybWF0aW9uKQogICAgIHsKLSAgICAgICAgYXV0byogcmVzdWx0ID0gbmV3IChOb3ROdWxs
LCBhbGxvY2F0ZUNlbGw8SlNXZWJBc3NlbWJseUNvZGVCbG9jaz4odm0uaGVhcCwgYWxsb2NhdGlv
blNpemUoZnVuY3Rpb25JbXBvcnRDb3VudCkpKSBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrKHZtLCBv
d25lciwgbW9kZSwgV1RGTW92ZShwbGFuKSwgY2FsbGVlQ291bnQpOworICAgICAgICBhdXRvKiBy
ZXN1bHQgPSBuZXcgKE5vdE51bGwsIGFsbG9jYXRlQ2VsbDxKU1dlYkFzc2VtYmx5Q29kZUJsb2Nr
Pih2bS5oZWFwLCBhbGxvY2F0aW9uU2l6ZShtb2R1bGVJbmZvcm1hdGlvbi5pbXBvcnRGdW5jdGlv
bkNvdW50KCkpKSkgSlNXZWJBc3NlbWJseUNvZGVCbG9jayh2bSwgV1RGTW92ZShjb2RlQmxvY2sp
LCBtb2R1bGVJbmZvcm1hdGlvbik7CiAgICAgICAgIHJlc3VsdC0+ZmluaXNoQ3JlYXRpb24odm0p
OwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTYyLDQwICs2MywyNSBAQCBwdWJs
aWM6CiAgICAgICAgIHJldHVybiBTdHJ1Y3R1cmU6OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBw
cm90b3R5cGUsIFR5cGVJbmZvKENlbGxUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CiAg
ICAgfQogCi0gICAgdW5zaWduZWQgZnVuY3Rpb25JbXBvcnRDb3VudCgpIGNvbnN0IHsgcmV0dXJu
IG1fd2FzbUV4aXRTdHVicy5zaXplKCk7IH0KLSAgICBXYXNtOjpNZW1vcnlNb2RlIG1vZGUoKSBj
b25zdCB7IHJldHVybiBtX21vZGU7IH0KKyAgICB1bnNpZ25lZCBmdW5jdGlvbkltcG9ydENvdW50
KCkgY29uc3QgeyByZXR1cm4gbV9jb2RlQmxvY2stPmZ1bmN0aW9uSW1wb3J0Q291bnQoKTsgfQog
ICAgIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fbW9kdWxl
LmdldCgpOyB9CiAKLSAgICAvLyBEb24ndCBjYWxsIGludGlhbGl6ZSBkaXJlY3RseSwgdGhpcyBz
aG91bGQgYmUgY2FsbGVkIGZvciB5b3UsIGFzIG5lZWRlZCwgYnkgSlNXZWJBc3NlbWJseUluc3Rh
bmNlOjpmaW5hbGl6ZUNyZWF0aW9uLgotICAgIHZvaWQgaW5pdGlhbGl6ZSgpOwotICAgIGJvb2wg
aW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiAhbV9wbGFuOyB9Ci0KLSAgICBXYXNtOjpQbGFu
JiBwbGFuKCkgY29uc3QgeyBBU1NFUlQoIWluaXRpYWxpemVkKCkpOyByZXR1cm4gKm1fcGxhbjsg
fQotCi0gICAgYm9vbCBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGluaXRpYWxpemVkKCkgJiYg
IW1fZXJyb3JNZXNzYWdlOyB9Ci0gICAgU3RyaW5nJiBlcnJvck1lc3NhZ2UoKSB7IEFTU0VSVCgh
cnVubmFibGUoKSk7IHJldHVybiBtX2Vycm9yTWVzc2FnZTsgfQogICAgIGJvb2wgaXNTYWZlVG9S
dW4oSlNXZWJBc3NlbWJseU1lbW9yeSopIGNvbnN0OwogCiAgICAgLy8gVGhlc2UgdHdvIGNhbGxl
ZSBnZXR0ZXJzIGFyZSBvbmx5IHZhbGlkIG9uY2UgdGhlIGNhbGxlZXMgaGF2ZSBiZWVuIHBvcHVs
YXRlZC4KKwogICAgIFdhc206OkNhbGxlZSYganNFbnRyeXBvaW50Q2FsbGVlRnJvbUZ1bmN0aW9u
SW5kZXhTcGFjZSh1bnNpZ25lZCBmdW5jdGlvbkluZGV4U3BhY2UpCiAgICAgewotICAgICAgICBS
RUxFQVNFX0FTU0VSVChmdW5jdGlvbkluZGV4U3BhY2UgPj0gZnVuY3Rpb25JbXBvcnRDb3VudCgp
KTsKLSAgICAgICAgdW5zaWduZWQgY2FsbGVlSW5kZXggPSBmdW5jdGlvbkluZGV4U3BhY2UgLSBm
dW5jdGlvbkltcG9ydENvdW50KCk7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJUKGNhbGxlZUluZGV4
IDwgbV9jYWxsZWVDb3VudCk7Ci0gICAgICAgIHJldHVybiAqbV9jYWxsZWVzW2NhbGxlZUluZGV4
XS5nZXQoKTsKKyAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrLT5qc0VudHJ5cG9pbnRDYWxsZWVG
cm9tRnVuY3Rpb25JbmRleFNwYWNlKGZ1bmN0aW9uSW5kZXhTcGFjZSk7CiAgICAgfQogICAgIFdh
c206OkNhbGxlZSYgd2FzbUVudHJ5cG9pbnRDYWxsZWVGcm9tRnVuY3Rpb25JbmRleFNwYWNlKHVu
c2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFjZSkKICAgICB7Ci0gICAgICAgIFJFTEVBU0VfQVNTRVJU
KGZ1bmN0aW9uSW5kZXhTcGFjZSA+PSBmdW5jdGlvbkltcG9ydENvdW50KCkpOwotICAgICAgICB1
bnNpZ25lZCBjYWxsZWVJbmRleCA9IGZ1bmN0aW9uSW5kZXhTcGFjZSAtIGZ1bmN0aW9uSW1wb3J0
Q291bnQoKTsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoY2FsbGVlSW5kZXggPCBtX2NhbGxlZUNv
dW50KTsKLSAgICAgICAgcmV0dXJuICptX2NhbGxlZXNbY2FsbGVlSW5kZXggKyBtX2NhbGxlZUNv
dW50XS5nZXQoKTsKKyAgICAgICAgcmV0dXJuIG1fY29kZUJsb2NrLT53YXNtRW50cnlwb2ludENh
bGxlZUZyb21GdW5jdGlvbkluZGV4U3BhY2UoZnVuY3Rpb25JbmRleFNwYWNlKTsKICAgICB9CiAK
ICAgICB2b2lkKiB3YXNtVG9Kc0NhbGxTdHViRm9ySW1wb3J0KHVuc2lnbmVkIGltcG9ydEluZGV4
KQogICAgIHsKLSAgICAgICAgUkVMRUFTRV9BU1NFUlQoaW1wb3J0SW5kZXggPCBtX3dhc21FeGl0
U3R1YnMuc2l6ZSgpKTsKLSAgICAgICAgcmV0dXJuIG1fd2FzbUV4aXRTdHVic1tpbXBvcnRJbmRl
eF0ud2FzbVRvSnMuY29kZSgpLmV4ZWN1dGFibGVBZGRyZXNzKCk7CisgICAgICAgIHJldHVybiBp
bXBvcnRXYXNtVG9KU1N0dWIoaW1wb3J0SW5kZXgpOwogICAgIH0KIAogICAgIHN0YXRpYyBwdHJk
aWZmX3Qgb2Zmc2V0T2ZJbXBvcnRXYXNtVG9KU1N0dWIodW5zaWduZWQgaW1wb3J0SW5kZXgpCkBA
IC0xMDQsMTggKzkwLDcgQEAgcHVibGljOgogICAgIH0KIAogcHJpdmF0ZToKLSAgICB2b2lkIHNl
dEpTRW50cnlwb2ludENhbGxlZSh1bnNpZ25lZCBjYWxsZWVJbmRleCwgUmVmPFdhc206OkNhbGxl
ZT4mJiBjYWxsZWUpCi0gICAgewotICAgICAgICBSRUxFQVNFX0FTU0VSVChjYWxsZWVJbmRleCA8
IG1fY2FsbGVlQ291bnQpOwotICAgICAgICBtX2NhbGxlZXNbY2FsbGVlSW5kZXhdID0gV1RGTW92
ZShjYWxsZWUpOwotICAgIH0KLSAgICB2b2lkIHNldFdhc21FbnRyeXBvaW50Q2FsbGVlKHVuc2ln
bmVkIGNhbGxlZUluZGV4LCBSZWY8V2FzbTo6Q2FsbGVlPiYmIGNhbGxlZSkKLSAgICB7Ci0gICAg
ICAgIFJFTEVBU0VfQVNTRVJUKGNhbGxlZUluZGV4IDwgbV9jYWxsZWVDb3VudCk7Ci0gICAgICAg
IG1fY2FsbGVlc1tjYWxsZWVJbmRleCArIG1fY2FsbGVlQ291bnRdID0gV1RGTW92ZShjYWxsZWUp
OwotICAgIH0KLQotICAgIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2soVk0mLCBKU1dlYkFzc2VtYmx5
TW9kdWxlKiwgV2FzbTo6TWVtb3J5TW9kZSwgUmVmPFdhc206OlBsYW4+JiYsIHVuc2lnbmVkIGNh
bGxlZUNvdW50KTsKKyAgICBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrKFZNJiwgUmVmPFdhc206OkNv
ZGVCbG9jaz4mJiwgY29uc3QgV2FzbTo6TW9kdWxlSW5mb3JtYXRpb24mKTsKICAgICBERUNMQVJF
X0VYUE9SVF9JTkZPOwogICAgIHN0YXRpYyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSB0
cnVlOwogICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koSlNDZWxsKik7CkBAIC0xNDEsMTUgKzExNiwx
MCBAQCBwcml2YXRlOgogICAgIH07CiAKICAgICBXcml0ZUJhcnJpZXI8SlNXZWJBc3NlbWJseU1v
ZHVsZT4gbV9tb2R1bGU7CisgICAgUmVmPFdhc206OkNvZGVCbG9jaz4gbV9jb2RlQmxvY2s7Cisg
ICAgVmVjdG9yPE1hY3JvQXNzZW1ibGVyQ29kZVJlZj4gbV93YXNtVG9KU0V4aXRTdHViczsKICAg
ICBVbmNvbmRpdGlvbmFsRmluYWxpemVyIG1fdW5jb25kaXRpb25hbEZpbmFsaXplcjsKICAgICBC
YWc8Q2FsbExpbmtJbmZvPiBtX2NhbGxMaW5rSW5mb3M7Ci0gICAgVmVjdG9yPFdhc206Oldhc21F
eGl0U3R1YnM+IG1fd2FzbUV4aXRTdHViczsKLSAgICBWZWN0b3I8UmVmUHRyPFdhc206OkNhbGxl
ZT4+IG1fY2FsbGVlczsKLSAgICAvLyBUaGUgcGxhbiB0aGF0IGlzIGNvbXBpbGluZyB0aGlzIGNv
ZGUgYmxvY2suCi0gICAgUmVmUHRyPFdhc206OlBsYW4+IG1fcGxhbjsKLSAgICBTdHJpbmcgbV9l
cnJvck1lc3NhZ2U7Ci0gICAgV2FzbTo6TWVtb3J5TW9kZSBtX21vZGU7Ci0gICAgdW5zaWduZWQg
bV9jYWxsZWVDb3VudDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIEpTQwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5SW5zdGFuY2Uu
Y3BwCShyZXZpc2lvbiAyMTUwNTQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9K
U1dlYkFzc2VtYmx5SW5zdGFuY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NCwyNCArOTQsMTcg
QEAgdm9pZCBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OnZpc2l0Q2hpbGRyZQogICAgICAgICB2aXNp
dG9yLmFwcGVuZCh0aGlzT2JqZWN0LT5pbXBvcnRGdW5jdGlvbnMoKVtpXSk7CiB9CiAKLXZvaWQg
SlNXZWJBc3NlbWJseUluc3RhbmNlOjphZGRVbml0aWFsaXplZENvZGVCbG9jayhWTSYgdm0sIFJl
ZjxXYXNtOjpQbGFuPiBwbGFuKQotewotICAgIGF1dG8qIGNvZGVCbG9jayA9IEpTV2ViQXNzZW1i
bHlDb2RlQmxvY2s6OmNyZWF0ZSgKLSAgICAgICAgdm0sIG1vZHVsZSgpLCBtZW1vcnlNb2RlKCks
IFdURk1vdmUocGxhbiksIG1vZHVsZSgpLT5tb2R1bGVJbmZvcm1hdGlvbigpLmludGVybmFsRnVu
Y3Rpb25Db3VudCgpLCBtb2R1bGUoKS0+bW9kdWxlSW5mb3JtYXRpb24oKS5pbXBvcnRGdW5jdGlv
bkNvdW50KCkpOwotICAgIG1fY29kZUJsb2NrLnNldCh2bSwgdGhpcywgY29kZUJsb2NrKTsKLSAg
ICBBU1NFUlQoIWNvZGVCbG9jay0+aW5pdGlhbGl6ZWQoKSk7Ci19Ci0KLXZvaWQgSlNXZWJBc3Nl
bWJseUluc3RhbmNlOjpmaW5hbGl6ZUNyZWF0aW9uKFZNJiB2bSwgRXhlY1N0YXRlKiBleGVjKQor
dm9pZCBKU1dlYkFzc2VtYmx5SW5zdGFuY2U6OmZpbmFsaXplQ3JlYXRpb24oVk0mIHZtLCBFeGVj
U3RhdGUqIGV4ZWMsIFJlZjxXYXNtOjpDb2RlQmxvY2s+JiYgd2FzbUNvZGVCbG9jaykKIHsKICAg
ICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7Ci0gICAgY29kZUJsb2NrKCkt
PmluaXRpYWxpemUoKTsKLQotICAgIGlmICghY29kZUJsb2NrKCktPnJ1bm5hYmxlKCkpIHsKLSAg
ICAgICAgdGhyb3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIEpTV2ViQXNzZW1ibHlMaW5rRXJyb3I6
OmNyZWF0ZShleGVjLCB2bSwgZ2xvYmFsT2JqZWN0KCktPldlYkFzc2VtYmx5TGlua0Vycm9yU3Ry
dWN0dXJlKCksIGNvZGVCbG9jaygpLT5lcnJvck1lc3NhZ2UoKSkpOworICAgIGlmICghd2FzbUNv
ZGVCbG9jay0+cnVubmFibGUoKSkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29w
ZSwgSlNXZWJBc3NlbWJseUxpbmtFcnJvcjo6Y3JlYXRlKGV4ZWMsIHZtLCBnbG9iYWxPYmplY3Qo
KS0+V2ViQXNzZW1ibHlMaW5rRXJyb3JTdHJ1Y3R1cmUoKSwgd2FzbUNvZGVCbG9jay0+ZXJyb3JN
ZXNzYWdlKCkpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBSRUxFQVNFX0FTU0VSVChj
b2RlQmxvY2soKS0+aXNTYWZlVG9SdW4obWVtb3J5KCkpKTsKKworICAgIFJFTEVBU0VfQVNTRVJU
KHdhc21Db2RlQmxvY2stPmlzU2FmZVRvUnVuKG1lbW9yeSgpLT5tZW1vcnkoKS5tb2RlKCkpKTsK
KyAgICBtX2NvZGVCbG9jay5zZXQodm0sIHRoaXMsCisgICAgICAgIEpTV2ViQXNzZW1ibHlDb2Rl
QmxvY2s6OmNyZWF0ZSh2bSwgd2FzbUNvZGVCbG9jay5jb3B5UmVmKCksIG1fbW9kdWxlLT5tb2R1
bGUoKS5tb2R1bGVJbmZvcm1hdGlvbigpKSk7CiAKICAgICBhdXRvKiBtb2R1bGVSZWNvcmQgPSBq
c0Nhc3Q8V2ViQXNzZW1ibHlNb2R1bGVSZWNvcmQqPihtX21vZHVsZU5hbWVzcGFjZU9iamVjdC0+
bW9kdWxlUmVjb3JkKCkpOwogICAgIG1vZHVsZVJlY29yZC0+bGluayhleGVjLCBtb2R1bGUoKSwg
dGhpcyk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9KU1dlYkFzc2VtYmx5
SW5zdGFuY2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9K
U1dlYkFzc2VtYmx5SW5zdGFuY2UuaAkocmV2aXNpb24gMjE1MDU0KQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUluc3RhbmNlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTM5LDExICszOSw2IEBAIGNsYXNzIEpTTW9kdWxlTmFtZXNwYWNlT2JqZWN0OwogY2xhc3Mg
SlNXZWJBc3NlbWJseU1vZHVsZTsKIGNsYXNzIFdlYkFzc2VtYmx5VG9KU0NhbGxlZTsKIAotbmFt
ZXNwYWNlIFdhc20gewotY2xhc3MgUGxhbjsKLX0KLQotCiBjbGFzcyBKU1dlYkFzc2VtYmx5SW5z
dGFuY2UgOiBwdWJsaWMgSlNEZXN0cnVjdGlibGVPYmplY3QgewogcHVibGljOgogICAgIHR5cGVk
ZWYgSlNEZXN0cnVjdGlibGVPYmplY3QgQmFzZTsKQEAgLTU0LDkgKzQ5LDcgQEAgcHVibGljOgog
ICAgIERFQ0xBUkVfRVhQT1JUX0lORk87CiAKICAgICBKU1dlYkFzc2VtYmx5Q29kZUJsb2NrKiBj
b2RlQmxvY2soKSBjb25zdCB7IHJldHVybiBtX2NvZGVCbG9jay5nZXQoKTsgfQotICAgIGJvb2wg
aW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBjb2RlQmxvY2soKSAmJiBjb2RlQmxvY2soKS0+
aW5pdGlhbGl6ZWQoKTsgfQotICAgIHZvaWQgYWRkVW5pdGlhbGl6ZWRDb2RlQmxvY2soVk0mLCBS
ZWY8V2FzbTo6UGxhbj4pOwotICAgIHZvaWQgZmluYWxpemVDcmVhdGlvbihWTSYsIEV4ZWNTdGF0
ZSopOworICAgIHZvaWQgZmluYWxpemVDcmVhdGlvbihWTSYsIEV4ZWNTdGF0ZSosIFJlZjxXYXNt
OjpDb2RlQmxvY2s+JiYpOwogCiAgICAgSlNXZWJBc3NlbWJseU1vZHVsZSogbW9kdWxlKCkgY29u
c3QgeyByZXR1cm4gbV9tb2R1bGUuZ2V0KCk7IH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vanMvSlNXZWJBc3NlbWJseU1vZHVsZS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseU1vZHVsZS5jcHAJKHJldmlzaW9u
IDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlN
b2R1bGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MywxNiArNDMsMTUgQEAgbmFtZXNwYWNlIEpT
QyB7CiAKIGNvbnN0IENsYXNzSW5mbyBKU1dlYkFzc2VtYmx5TW9kdWxlOjpzX2luZm8gPSB7ICJX
ZWJBc3NlbWJseS5Nb2R1bGUiLCAmQmFzZTo6c19pbmZvLCBudWxscHRyLCBDUkVBVEVfTUVUSE9E
X1RBQkxFKEpTV2ViQXNzZW1ibHlNb2R1bGUpIH07CiAKLUpTV2ViQXNzZW1ibHlNb2R1bGUqIEpT
V2ViQXNzZW1ibHlNb2R1bGU6OmNyZWF0ZVN0dWIoVk0mIHZtLCBFeGVjU3RhdGUqIGV4ZWMsIFN0
cnVjdHVyZSogc3RydWN0dXJlLCBSZWZQdHI8V2FzbTo6UGxhbj4mJiBwbGFuKQorSlNXZWJBc3Nl
bWJseU1vZHVsZSogSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1YihWTSYgdm0sIEV4ZWNT
dGF0ZSogZXhlYywgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIFdhc206Ok1vZHVsZTo6VmFsaWRhdGlv
blJlc3VsdCYmIHJlc3VsdCkKIHsKLSAgICBBU1NFUlQoIXBsYW4tPmhhc1dvcmsoKSk7CiAgICAg
YXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOwotICAgIGlmIChwbGFuLT5mYWls
ZWQoKSkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwgSlNXZWJBc3NlbWJs
eUNvbXBpbGVFcnJvcjo6Y3JlYXRlKGV4ZWMsIHZtLCBzdHJ1Y3R1cmUtPmdsb2JhbE9iamVjdCgp
LT5XZWJBc3NlbWJseUNvbXBpbGVFcnJvclN0cnVjdHVyZSgpLCBwbGFuLT5lcnJvck1lc3NhZ2Uo
KSkpOworICAgIGlmICghcmVzdWx0Lmhhc1ZhbHVlKCkpIHsKKyAgICAgICAgdGhyb3dFeGNlcHRp
b24oZXhlYywgc2NvcGUsIEpTV2ViQXNzZW1ibHlDb21waWxlRXJyb3I6OmNyZWF0ZShleGVjLCB2
bSwgc3RydWN0dXJlLT5nbG9iYWxPYmplY3QoKS0+V2ViQXNzZW1ibHlDb21waWxlRXJyb3JTdHJ1
Y3R1cmUoKSwgcmVzdWx0LmVycm9yKCkpKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAg
fQogCi0gICAgYXV0byogbW9kdWxlID0gbmV3IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8SlNXZWJB
c3NlbWJseU1vZHVsZT4odm0uaGVhcCkpIEpTV2ViQXNzZW1ibHlNb2R1bGUodm0sIHN0cnVjdHVy
ZSwgKnBsYW4uZ2V0KCkpOworICAgIGF1dG8qIG1vZHVsZSA9IG5ldyAoTm90TnVsbCwgYWxsb2Nh
dGVDZWxsPEpTV2ViQXNzZW1ibHlNb2R1bGU+KHZtLmhlYXApKSBKU1dlYkFzc2VtYmx5TW9kdWxl
KHZtLCBzdHJ1Y3R1cmUsIHJlc3VsdC52YWx1ZSgpLnJlbGVhc2VOb25OdWxsKCkpOwogICAgIG1v
ZHVsZS0+ZmluaXNoQ3JlYXRpb24odm0pOwogICAgIHJldHVybiBtb2R1bGU7CiB9CkBAIC02Miw5
ICs2MSw5IEBAIFN0cnVjdHVyZSogSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3QKICAgICBy
ZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJvdG90eXBlLCBUeXBl
SW5mbyhPYmplY3RUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CiB9CiAKLUpTV2ViQXNz
ZW1ibHlNb2R1bGU6OkpTV2ViQXNzZW1ibHlNb2R1bGUoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVj
dHVyZSwgV2FzbTo6UGxhbiYgcGxhbikKK0pTV2ViQXNzZW1ibHlNb2R1bGU6OkpTV2ViQXNzZW1i
bHlNb2R1bGUoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgUmVmPFdhc206Ok1vZHVsZT4m
JiBtb2R1bGUpCiAgICAgOiBCYXNlKHZtLCBzdHJ1Y3R1cmUpCi0gICAgLCBtX21vZHVsZUluZm9y
bWF0aW9uKHBsYW4udGFrZU1vZHVsZUluZm9ybWF0aW9uKCkpCisgICAgLCBtX21vZHVsZShXVEZN
b3ZlKG1vZHVsZSkpCiB7CiB9CiAKQEAgLTc1LDcgKzc0LDggQEAgdm9pZCBKU1dlYkFzc2VtYmx5
TW9kdWxlOjpmaW5pc2hDcmVhdGlvbgogCiAgICAgLy8gT24gc3VjY2VzcywgYSBuZXcgV2ViQXNz
ZW1ibHkuTW9kdWxlIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIFtbTW9kdWxlXV0gc2V0IHRvIHRo
ZSB2YWxpZGF0ZWQgQXN0Lm1vZHVsZS4KICAgICBTeW1ib2xUYWJsZSogZXhwb3J0U3ltYm9sVGFi
bGUgPSBTeW1ib2xUYWJsZTo6Y3JlYXRlKHZtKTsKLSAgICBmb3IgKGF1dG8mIGV4cCA6IG1fbW9k
dWxlSW5mb3JtYXRpb24tPmV4cG9ydHMpIHsKKyAgICBjb25zdCBXYXNtOjpNb2R1bGVJbmZvcm1h
dGlvbiYgbW9kdWxlSW5mb3JtYXRpb24gPSBtX21vZHVsZS0+bW9kdWxlSW5mb3JtYXRpb24oKTsK
KyAgICBmb3IgKGF1dG8mIGV4cCA6IG1vZHVsZUluZm9ybWF0aW9uLmV4cG9ydHMpIHsKICAgICAg
ICAgYXV0byBvZmZzZXQgPSBleHBvcnRTeW1ib2xUYWJsZS0+dGFrZU5leHRTY29wZU9mZnNldChO
b0xvY2tpbmdOZWNlc3NhcnkpOwogICAgICAgICBTdHJpbmcgZmllbGQgPSBTdHJpbmc6OmZyb21V
VEY4KGV4cC5maWVsZCk7CiAgICAgICAgIGV4cG9ydFN5bWJvbFRhYmxlLT5zZXQoTm9Mb2NraW5n
TmVjZXNzYXJ5LCBBdG9taWNTdHJpbmcoZmllbGQpLmltcGwoKSwgU3ltYm9sVGFibGVFbnRyeShW
YXJPZmZzZXQob2Zmc2V0KSkpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMv
SlNXZWJBc3NlbWJseU1vZHVsZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS93YXNtL2pzL0pTV2ViQXNzZW1ibHlNb2R1bGUuaAkocmV2aXNpb24gMjE1MDU0KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseU1vZHVsZS5oCSh3b3JraW5n
IGNvcHkpCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiSlNPYmplY3QuaCIKICNpbmNsdWRl
ICJKU1dlYkFzc2VtYmx5Q29kZUJsb2NrLmgiCiAjaW5jbHVkZSAiVW5jb25kaXRpb25hbEZpbmFs
aXplci5oIgorI2luY2x1ZGUgIldhc21Nb2R1bGUuaCIKICNpbmNsdWRlICJXYXNtTW9kdWxlSW5m
b3JtYXRpb24uaCIKICNpbmNsdWRlIDx3dGYvQmFnLmg+CiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5o
PgpAQCAtNDksMTYgKzUwLDE2IEBAIGNsYXNzIEpTV2ViQXNzZW1ibHlNb2R1bGUgOiBwdWJsaWMg
SlNEZXMKIHB1YmxpYzoKICAgICB0eXBlZGVmIEpTRGVzdHJ1Y3RpYmxlT2JqZWN0IEJhc2U7CiAK
LSAgICBzdGF0aWMgSlNXZWJBc3NlbWJseU1vZHVsZSogY3JlYXRlU3R1YihWTSYsIEV4ZWNTdGF0
ZSosIFN0cnVjdHVyZSosIFJlZlB0cjxXYXNtOjpQbGFuPiYmKTsKLSAgICBzdGF0aWMgU3RydWN0
dXJlKiBjcmVhdGVTdHJ1Y3R1cmUoVk0mLCBKU0dsb2JhbE9iamVjdCosIEpTVmFsdWUpOwotCiAg
ICAgREVDTEFSRV9JTkZPOwogCi0gICAgY29uc3QgV2FzbTo6TW9kdWxlSW5mb3JtYXRpb24mIG1v
ZHVsZUluZm9ybWF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9tb2R1bGVJbmZvcm1hdGlvbi5nZXQo
KTsgfQorICAgIHN0YXRpYyBKU1dlYkFzc2VtYmx5TW9kdWxlKiBjcmVhdGVTdHViKFZNJiwgRXhl
Y1N0YXRlKiwgU3RydWN0dXJlKiwgV2FzbTo6TW9kdWxlOjpWYWxpZGF0aW9uUmVzdWx0JiYpOwor
ICAgIHN0YXRpYyBTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShWTSYsIEpTR2xvYmFsT2JqZWN0
KiwgSlNWYWx1ZSk7CisKKyAgICBjb25zdCBXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbiYgbW9kdWxl
SW5mb3JtYXRpb24oKSBjb25zdCB7IHJldHVybiBtX21vZHVsZS0+bW9kdWxlSW5mb3JtYXRpb24o
KTsgfQogICAgIFN5bWJvbFRhYmxlKiBleHBvcnRTeW1ib2xUYWJsZSgpIGNvbnN0IHsgcmV0dXJu
IG1fZXhwb3J0U3ltYm9sVGFibGUuZ2V0KCk7IH0KICAgICBXYXNtOjpTaWduYXR1cmVJbmRleCBz
aWduYXR1cmVJbmRleEZyb21GdW5jdGlvbkluZGV4U3BhY2UodW5zaWduZWQgZnVuY3Rpb25JbmRl
eFNwYWNlKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbW9kdWxlSW5mb3JtYXRpb24t
PnNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0aW9uSW5kZXhTcGFjZShmdW5jdGlvbkluZGV4U3BhY2Up
OworICAgICAgICByZXR1cm4gbV9tb2R1bGUtPnNpZ25hdHVyZUluZGV4RnJvbUZ1bmN0aW9uSW5k
ZXhTcGFjZShmdW5jdGlvbkluZGV4U3BhY2UpOwogICAgIH0KICAgICBXZWJBc3NlbWJseVRvSlND
YWxsZWUqIGNhbGxlZSgpIGNvbnN0IHsgcmV0dXJuIG1fY2FsbGVlLmdldCgpOyB9CiAKQEAgLTY2
LDE3ICs2NywxOSBAQCBwdWJsaWM6CiAKICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNvdXJj
ZSgpIGNvbnN0IHsgcmV0dXJuIG1vZHVsZUluZm9ybWF0aW9uKCkuc291cmNlOyB9CiAKKyAgICBX
YXNtOjpNb2R1bGUmIG1vZHVsZSgpIHsgcmV0dXJuIG1fbW9kdWxlLmdldCgpOyB9CisKIHByaXZh
dGU6CiAgICAgZnJpZW5kIGNsYXNzIEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s7CiAKICAgICB2b2lk
IHNldENvZGVCbG9jayhWTSYsIFdhc206Ok1lbW9yeU1vZGUsIEpTV2ViQXNzZW1ibHlDb2RlQmxv
Y2sqKTsKIAotICAgIEpTV2ViQXNzZW1ibHlNb2R1bGUoVk0mLCBTdHJ1Y3R1cmUqLCBXYXNtOjpQ
bGFuJik7CisgICAgSlNXZWJBc3NlbWJseU1vZHVsZShWTSYsIFN0cnVjdHVyZSosIFJlZjxXYXNt
OjpNb2R1bGU+JiYpOwogICAgIHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mKTsKICAgICBzdGF0aWMg
dm9pZCBkZXN0cm95KEpTQ2VsbCopOwogICAgIHN0YXRpYyB2b2lkIHZpc2l0Q2hpbGRyZW4oSlND
ZWxsKiwgU2xvdFZpc2l0b3ImKTsKIAotICAgIFJlZjxXYXNtOjpNb2R1bGVJbmZvcm1hdGlvbj4g
bV9tb2R1bGVJbmZvcm1hdGlvbjsKKyAgICBSZWY8V2FzbTo6TW9kdWxlPiBtX21vZHVsZTsKICAg
ICBXcml0ZUJhcnJpZXI8U3ltYm9sVGFibGU+IG1fZXhwb3J0U3ltYm9sVGFibGU7CiAgICAgV3Jp
dGVCYXJyaWVyPEpTV2ViQXNzZW1ibHlDb2RlQmxvY2s+IG1fY29kZUJsb2Nrc1tXYXNtOjpOdW1i
ZXJPZk1lbW9yeU1vZGVzXTsKICAgICBXcml0ZUJhcnJpZXI8V2ViQXNzZW1ibHlUb0pTQ2FsbGVl
PiBtX2NhbGxlZTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2Vt
Ymx5RnVuY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNt
L2pzL1dlYkFzc2VtYmx5RnVuY3Rpb24uY3BwCShyZXZpc2lvbiAyMTUwNTQpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseUZ1bmN0aW9uLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMTU5LDYgKzE1OSw4IEBAIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9D
QUxMIGNhbGwKIAogV2ViQXNzZW1ibHlGdW5jdGlvbiogV2ViQXNzZW1ibHlGdW5jdGlvbjo6Y3Jl
YXRlKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgdW5zaWduZWQgbGVuZ3Ro
LCBjb25zdCBTdHJpbmcmIG5hbWUsIEpTV2ViQXNzZW1ibHlJbnN0YW5jZSogaW5zdGFuY2UsIFdh
c206OkNhbGxlZSYganNFbnRyeXBvaW50LCBXYXNtOjpDYWxsZWUmIHdhc21FbnRyeXBvaW50LCBX
YXNtOjpTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCkKIHsKKyAgICBBU1NFUlQoJmpzRW50
cnlwb2ludCAhPSAmd2FzbUVudHJ5cG9pbnQpOworCiAgICAgTmF0aXZlRXhlY3V0YWJsZSogZXhl
Y3V0YWJsZSA9IHZtLmdldEhvc3RGdW5jdGlvbihjYWxsV2ViQXNzZW1ibHlGdW5jdGlvbiwgTm9J
bnRyaW5zaWMsIGNhbGxIb3N0RnVuY3Rpb25Bc0NvbnN0cnVjdG9yLCBudWxscHRyLCBuYW1lKTsK
ICAgICBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSA9IGdsb2JhbE9iamVjdC0+d2ViQXNzZW1ibHlGdW5j
dGlvblN0cnVjdHVyZSgpOwogICAgIFdlYkFzc2VtYmx5RnVuY3Rpb24qIGZ1bmN0aW9uID0gbmV3
IChOb3ROdWxsLCBhbGxvY2F0ZUNlbGw8V2ViQXNzZW1ibHlGdW5jdGlvbj4odm0uaGVhcCkpIFdl
YkFzc2VtYmx5RnVuY3Rpb24odm0sIGdsb2JhbE9iamVjdCwgc3RydWN0dXJlLCBqc0VudHJ5cG9p
bnQsIHdhc21FbnRyeXBvaW50LCBzaWduYXR1cmVJbmRleCk7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseUluc3RhbmNlQ29uc3RydWN0b3IuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5SW5zdGFu
Y2VDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5SW5zdGFuY2VDb25zdHJ1Y3Rvci5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTU4LDcgKzU4LDcgQEAgdXNpbmcgV2FzbTo6UGxhbjsKIAogc3RhdGljIEVuY29k
ZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29uc3RydWN0SlNXZWJBc3NlbWJseUluc3RhbmNlKEV4
ZWNTdGF0ZSogZXhlYykKIHsKLSAgICBhdXRvJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgVk0mIHZt
ID0gZXhlYy0+dm0oKTsKICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7
CiAKICAgICAvLyBJZiBtb2R1bGVPYmplY3QgaXMgbm90IGEgV2ViQXNzZW1ibHkuTW9kdWxlIGlu
c3RhbmNlLCBhIFR5cGVFcnJvciBpcyB0aHJvd24uCkBAIC03OCwyNiArNzgsNyBAQCBzdGF0aWMg
RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjb25zCiAgICAgSlNXZWJBc3NlbWJseUluc3Rh
bmNlKiBpbnN0YW5jZSA9IEpTV2ViQXNzZW1ibHlJbnN0YW5jZTo6Y3JlYXRlKHZtLCBleGVjLCBt
b2R1bGUsIGltcG9ydE9iamVjdCwgaW5zdGFuY2VTdHJ1Y3R1cmUpOwogICAgIFJFVFVSTl9JRl9F
WENFUFRJT04oc2NvcGUsIHsgfSk7CiAKLSAgICAvLyBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUg
Y2FzZXM6Ci0gICAgLy8gMSkgVGhlIGluc3RhbmNlIGFscmVhZHkgaGFzIGFuIGluaXRpYWxpemVk
IENvZGVCbG9jayAocnVubmFibGUpLCBzbyB3ZSBqdXN0IG5lZWQgdG8gZmluYWxpemVDcmVhdGlv
bi4KLSAgICAvLyAyKSBUaGUgaW5zdGFuY2UgaGFzIG5vIENvZGVCbG9jaywgc28gd2UgbmVlZCB0
byBtYWtlIG9uZSBhbmQgY29tcGlsZSB0aGUgY29kZSBmb3IgaXQuCi0gICAgLy8gMykgVGhlIGlu
c3RhbmNlIGFscmVhZHkgaGFzIGFuIHVuaW5pdGlhbGl6ZWQgQ29kZUJsb2NrLCBzbyB3ZSBuZWVk
IHRvIHdhaXQgZm9yIHRoZSBjb21waWxhdGlvbiB0byBmaW5pc2guCi0KLSAgICBpZiAoIWluc3Rh
bmNlLT5pbml0aWFsaXplZCgpKSB7Ci0gICAgICAgIGlmIChpbnN0YW5jZS0+Y29kZUJsb2NrKCkp
Ci0gICAgICAgICAgICBXYXNtOjplbnN1cmVXb3JrbGlzdCgpLmNvbXBsZXRlUGxhblN5bmNocm9u
b3VzbHkoaW5zdGFuY2UtPmNvZGVCbG9jaygpLT5wbGFuKCkpOwotICAgICAgICBlbHNlIHsKLSAg
ICAgICAgICAgIFJlZjxXYXNtOjpQbGFuPiBwbGFuID0gYWRvcHRSZWYoKm5ldyBQbGFuKHZtLCBt
YWtlUmVmKGNvbnN0X2Nhc3Q8V2FzbTo6TW9kdWxlSW5mb3JtYXRpb24mPihtb2R1bGUtPm1vZHVs
ZUluZm9ybWF0aW9uKCkpKSwgUGxhbjo6RnVsbENvbXBpbGUsIFBsYW46OmRvbnRGaW5hbGl6ZSkp
OwotICAgICAgICAgICAgcGxhbi0+c2V0TW9kZShpbnN0YW5jZS0+bWVtb3J5TW9kZSgpKTsKLSAg
ICAgICAgICAgIGluc3RhbmNlLT5hZGRVbml0aWFsaXplZENvZGVCbG9jayh2bSwgcGxhbi5jb3B5
UmVmKCkpOwotCi0gICAgICAgICAgICBhdXRvJiB3b3JrbGlzdCA9IFdhc206OmVuc3VyZVdvcmts
aXN0KCk7Ci0gICAgICAgICAgICB3b3JrbGlzdC5lbnF1ZXVlKHBsYW4uY29weVJlZigpKTsKLSAg
ICAgICAgICAgIHdvcmtsaXN0LmNvbXBsZXRlUGxhblN5bmNocm9ub3VzbHkocGxhbi5nZXQoKSk7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnN0YW5jZS0+ZmluYWxpemVDcmVhdGlvbih2bSwg
ZXhlYyk7CisgICAgaW5zdGFuY2UtPmZpbmFsaXplQ3JlYXRpb24odm0sIGV4ZWMsIG1vZHVsZS0+
bW9kdWxlKCkuY29tcGlsZVN5bmModm0sIGluc3RhbmNlLT5tZW1vcnlNb2RlKCkpKTsKICAgICBS
RVRVUk5fSUZfRVhDRVBUSU9OKHNjb3BlLCB7IH0pOwogICAgIHJldHVybiBKU1ZhbHVlOjplbmNv
ZGUoaW5zdGFuY2UpOwogfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2Vi
QXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAJKHJldmlz
aW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5
TW9kdWxlQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03OCwxMCArNzgsNyBAQCBK
U1ZhbHVlIFdlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3I6OmNyCiAgICAgVmVjdG9yPHVpbnQ4
X3Q+IHNvdXJjZSA9IGNyZWF0ZVNvdXJjZUJ1ZmZlckZyb21WYWx1ZSh2bSwgZXhlYywgYnVmZmVy
KTsKICAgICBSRVRVUk5fSUZfRVhDRVBUSU9OKHNjb3BlLCB7IH0pOwogCi0gICAgUmVmUHRyPFdh
c206OlBsYW4+IHBsYW4gPSBhZG9wdFJlZihuZXcgV2FzbTo6UGxhbih2bSwgV1RGTW92ZShzb3Vy
Y2UpLCBXYXNtOjpQbGFuOjpWYWxpZGF0aW9uLCBXYXNtOjpQbGFuOjpkb250RmluYWxpemUpKTsK
LSAgICBpZiAoIXBsYW4tPnBhcnNlQW5kVmFsaWRhdGVNb2R1bGUoKSkKLSAgICAgICAgcmV0dXJu
IHRocm93RXhjZXB0aW9uKGV4ZWMsIHNjb3BlLCBKU1dlYkFzc2VtYmx5Q29tcGlsZUVycm9yOjpj
cmVhdGUoZXhlYywgdm0sIGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKS0+V2ViQXNzZW1ibHlD
b21waWxlRXJyb3JTdHJ1Y3R1cmUoKSwgcGxhbi0+ZXJyb3JNZXNzYWdlKCkpKTsKLSAgICByZXR1
cm4gSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1Yih2bSwgZXhlYywgc3RydWN0dXJlLCBX
VEZNb3ZlKHBsYW4pKTsKKyAgICByZXR1cm4gSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1
Yih2bSwgZXhlYywgc3RydWN0dXJlLCBXYXNtOjpNb2R1bGU6OnZhbGlkYXRlU3luYyh2bSwgV1RG
TW92ZShzb3VyY2UpKSk7CiB9CiAKIFdlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IqIFdlYkFz
c2VtYmx5TW9kdWxlQ29uc3RydWN0b3I6OmNyZWF0ZShWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0
dXJlLCBXZWJBc3NlbWJseU1vZHVsZVByb3RvdHlwZSogdGhpc1Byb3RvdHlwZSkKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5UHJvdG90eXBlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseVByb3Rv
dHlwZS5jcHAJKHJldmlzaW9uIDIxNTA1NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNt
L2pzL1dlYkFzc2VtYmx5UHJvdG90eXBlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjUsMTMgKzY1
LDEyIEBAIGNvbnN0IENsYXNzSW5mbyBXZWJBc3NlbWJseVByb3RvdHlwZTo6c18KICBAZW5kCiAg
Ki8KIAotc3RhdGljIEVuY29kZWRKU1ZhbHVlIHJlamVjdChFeGVjU3RhdGUqIGV4ZWMsIENhdGNo
U2NvcGUmIGNhdGNoU2NvcGUsIEpTUHJvbWlzZURlZmVycmVkKiBwcm9taXNlKQorc3RhdGljIHZv
aWQgcmVqZWN0KEV4ZWNTdGF0ZSogZXhlYywgQ2F0Y2hTY29wZSYgY2F0Y2hTY29wZSwgSlNQcm9t
aXNlRGVmZXJyZWQqIHByb21pc2UpCiB7CiAgICAgRXhjZXB0aW9uKiBleGNlcHRpb24gPSBjYXRj
aFNjb3BlLmV4Y2VwdGlvbigpOwogICAgIEFTU0VSVChleGNlcHRpb24pOwogICAgIGNhdGNoU2Nv
cGUuY2xlYXJFeGNlcHRpb24oKTsKICAgICBwcm9taXNlLT5yZWplY3QoZXhlYywgZXhjZXB0aW9u
LT52YWx1ZSgpKTsKLSAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHByb21pc2UtPnByb21pc2Uo
KSk7CiB9CiAKIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIHdlYkFzc2VtYmx5
Q29tcGlsZUZ1bmMoRXhlY1N0YXRlKiBleGVjKQpAQCAtOTAsMTMgKzg5LDExIEBAIHN0YXRpYyBF
bmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIHdlYkEKICAgICBkZXBlbmRlbmNpZXMuYXBwZW5k
KFN0cm9uZzxKU0NlbGw+KHZtLCBnbG9iYWxPYmplY3QpKTsKICAgICB2bS5wcm9taXNlRGVmZXJy
ZWRUaW1lci0+YWRkUGVuZGluZ1Byb21pc2UocHJvbWlzZSwgV1RGTW92ZShkZXBlbmRlbmNpZXMp
KTsKIAotICAgIFJlZjxQbGFuPiBwbGFuID0gYWRvcHRSZWYoKm5ldyBQbGFuKHZtLCBXVEZNb3Zl
KHNvdXJjZSksIFBsYW46OlZhbGlkYXRpb24sIFtwcm9taXNlLCBnbG9iYWxPYmplY3RdIChQbGFu
JiBwKSBtdXRhYmxlIHsKLSAgICAgICAgUmVmUHRyPFBsYW4+IHBsYW4gPSBtYWtlUmVmKHApOwot
ICAgICAgICBwLnZtKCkucHJvbWlzZURlZmVycmVkVGltZXItPnNjaGVkdWxlV29ya1Nvb24ocHJv
bWlzZSwgW3Byb21pc2UsIGdsb2JhbE9iamVjdCwgcGxhbiA9IFdURk1vdmUocGxhbildICgpIG11
dGFibGUgewotICAgICAgICAgICAgVk0mIHZtID0gcGxhbi0+dm0oKTsKKyAgICBXYXNtOjpNb2R1
bGU6OnZhbGlkYXRlQXN5bmModm0sIFdURk1vdmUoc291cmNlKSwgY3JlYXRlU2hhcmVkVGFzazxX
YXNtOjpNb2R1bGU6OkNhbGxiYWNrVHlwZT4oW3Byb21pc2UsIGdsb2JhbE9iamVjdF0gKFZNJiB2
bSwgV2FzbTo6TW9kdWxlOjpWYWxpZGF0aW9uUmVzdWx0JiYgcmVzdWx0KSBtdXRhYmxlIHsKKyAg
ICAgICAgdm0ucHJvbWlzZURlZmVycmVkVGltZXItPnNjaGVkdWxlV29ya1Nvb24ocHJvbWlzZSwg
W3Byb21pc2UsIGdsb2JhbE9iamVjdCwgcmVzdWx0ID0gV1RGTW92ZShyZXN1bHQpLCAmdm1dICgp
IG11dGFibGUgewogICAgICAgICAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfQ0FUQ0hfU0NPUEUo
dm0pOwogICAgICAgICAgICAgRXhlY1N0YXRlKiBleGVjID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxF
eGVjKCk7Ci0gICAgICAgICAgICBKU1ZhbHVlIG1vZHVsZSA9IEpTV2ViQXNzZW1ibHlNb2R1bGU6
OmNyZWF0ZVN0dWIodm0sIGV4ZWMsIGdsb2JhbE9iamVjdC0+V2ViQXNzZW1ibHlNb2R1bGVTdHJ1
Y3R1cmUoKSwgV1RGTW92ZShwbGFuKSk7CisgICAgICAgICAgICBKU1ZhbHVlIG1vZHVsZSA9IEpT
V2ViQXNzZW1ibHlNb2R1bGU6OmNyZWF0ZVN0dWIodm0sIGV4ZWMsIGdsb2JhbE9iamVjdC0+V2Vi
QXNzZW1ibHlNb2R1bGVTdHJ1Y3R1cmUoKSwgV1RGTW92ZShyZXN1bHQpKTsKICAgICAgICAgICAg
IGlmIChzY29wZS5leGNlcHRpb24oKSkgewogICAgICAgICAgICAgICAgIHJlamVjdChleGVjLCBz
Y29wZSwgcHJvbWlzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTA2LDIxICsxMDMs
MjAgQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQQogICAgICAgICB9
KTsKICAgICB9KSk7CiAKLSAgICBXYXNtOjplbnN1cmVXb3JrbGlzdCgpLmVucXVldWUoV1RGTW92
ZShwbGFuKSk7CiAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShwcm9taXNlLT5wcm9taXNlKCkp
OwogfQogCiBlbnVtIGNsYXNzIFJlc29sdmUgeyBXaXRoSW5zdGFuY2UsIFdpdGhNb2R1bGVBbmRJ
bnN0YW5jZSB9Owotc3RhdGljIHZvaWQgcmVzb2x2ZShWTSYgdm0sIEV4ZWNTdGF0ZSogZXhlYywg
SlNQcm9taXNlRGVmZXJyZWQqIHByb21pc2UsIEpTV2ViQXNzZW1ibHlJbnN0YW5jZSogaW5zdGFu
Y2UsIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1vZHVsZSwgUmVzb2x2ZSBlbnRyaWVzKQorc3RhdGlj
IHZvaWQgcmVzb2x2ZShWTSYgdm0sIEV4ZWNTdGF0ZSogZXhlYywgSlNQcm9taXNlRGVmZXJyZWQq
IHByb21pc2UsIEpTV2ViQXNzZW1ibHlJbnN0YW5jZSogaW5zdGFuY2UsIEpTV2ViQXNzZW1ibHlN
b2R1bGUqIG1vZHVsZSwgUmVmPFdhc206OkNvZGVCbG9jaz4mJiBjb2RlQmxvY2ssIFJlc29sdmUg
cmVzb2x2ZUtpbmQpCiB7CiAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfQ0FUQ0hfU0NPUEUodm0p
OwotICAgIGluc3RhbmNlLT5maW5hbGl6ZUNyZWF0aW9uKHZtLCBleGVjKTsKKyAgICBpbnN0YW5j
ZS0+ZmluYWxpemVDcmVhdGlvbih2bSwgZXhlYywgV1RGTW92ZShjb2RlQmxvY2spKTsKICAgICBp
ZiAoc2NvcGUuZXhjZXB0aW9uKCkpIHsKICAgICAgICAgcmVqZWN0KGV4ZWMsIHNjb3BlLCBwcm9t
aXNlKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChlbnRyaWVzID09IFJlc29s
dmU6OldpdGhJbnN0YW5jZSkKKyAgICBpZiAocmVzb2x2ZUtpbmQgPT0gUmVzb2x2ZTo6V2l0aElu
c3RhbmNlKQogICAgICAgICBwcm9taXNlLT5yZXNvbHZlKGV4ZWMsIGluc3RhbmNlKTsKICAgICBl
bHNlIHsKICAgICAgICAgSlNPYmplY3QqIHJlc3VsdCA9IGNvbnN0cnVjdEVtcHR5T2JqZWN0KGV4
ZWMpOwpAQCAtMTMwLDcgKzEyNiw3IEBAIHN0YXRpYyB2b2lkIHJlc29sdmUoVk0mIHZtLCBFeGVj
U3RhdGUqIGUKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKFZNJiB2bSwgRXhl
Y1N0YXRlKiBleGVjLCBKU1Byb21pc2VEZWZlcnJlZCogcHJvbWlzZSwgSlNXZWJBc3NlbWJseU1v
ZHVsZSogbW9kdWxlLCBKU09iamVjdCogaW1wb3J0T2JqZWN0LCBSZXNvbHZlIGVudHJpZXMpCitz
dGF0aWMgdm9pZCBpbnN0YW50aWF0ZShWTSYgdm0sIEV4ZWNTdGF0ZSogZXhlYywgSlNQcm9taXNl
RGVmZXJyZWQqIHByb21pc2UsIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1vZHVsZSwgSlNPYmplY3Qq
IGltcG9ydE9iamVjdCwgUmVzb2x2ZSByZXNvbHZlS2luZCkKIHsKICAgICBhdXRvIHNjb3BlID0g
REVDTEFSRV9DQVRDSF9TQ09QRSh2bSk7CiAgICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgcG90ZW50
aWFsbHkgcmVjb21waWxpbmcgYSBtb2R1bGUuIFdlIGZpcnN0IGdhdGhlciBhbGwgdGhlIGltcG9y
dC9tZW1vcnkgaW5mb3JtYXRpb24gcHJpb3IgdG8gY29tcGlsaW5nIGNvZGUuCkBAIC0xNDAsNDcg
KzEzNiwxOCBAQCBzdGF0aWMgdm9pZCBpbnN0YW50aWF0ZShWTSYgdm0sIEV4ZWNTdGF0CiAgICAg
ICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY2Fz
ZXM6Ci0gICAgLy8gMSkgVGhlIGluc3RhbmNlIGFscmVhZHkgaGFzIGFuIGluaXRpYWxpemVkIENv
ZGVCbG9jaywgc28gd2UgaGF2ZSBubyBtb3JlIHdvcmsgdG8gZG8uCi0gICAgLy8gMikgVGhlIGlu
c3RhbmNlIGhhcyBubyBDb2RlQmxvY2ssIHNvIHdlIG5lZWQgdG8gbWFrZSBvbmUgYW5kIGNvbXBp
bGUgdGhlIGNvZGUgZm9yIGl0LgotICAgIC8vIDMpIFRoZSBpbnN0YW5jZSBhbHJlYWR5IGhhcyBh
biB1bmluaXRpYWxpemVkIENvZGVCbG9jaywgc28gc29tZW9uZSBlbHNlIGlzIGNvbXBpbGluZyBj
b2RlIGFuZCB3ZSBqdXN0IG5lZWQgdG8gd2FpdCBmb3IgdGhlbS4KLQotICAgIGlmIChpbnN0YW5j
ZS0+aW5pdGlhbGl6ZWQoKSkgewotICAgICAgICByZXNvbHZlKHZtLCBleGVjLCBwcm9taXNlLCBp
bnN0YW5jZSwgbW9kdWxlLCBlbnRyaWVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAg
IFZlY3RvcjxTdHJvbmc8SlNDZWxsPj4gZGVwZW5kZW5jaWVzOwogICAgIC8vIFRoZSBpbnN0YW5j
ZSBrZWVwcyB0aGUgbW9kdWxlIGFsaXZlLgogICAgIGRlcGVuZGVuY2llcy5hcHBlbmQoU3Ryb25n
PEpTQ2VsbD4odm0sIGluc3RhbmNlKSk7CiAgICAgdm0ucHJvbWlzZURlZmVycmVkVGltZXItPmFk
ZFBlbmRpbmdQcm9taXNlKHByb21pc2UsIFdURk1vdmUoZGVwZW5kZW5jaWVzKSk7Ci0KLSAgICBp
ZiAoaW5zdGFuY2UtPmNvZGVCbG9jaygpKSB7Ci0gICAgICAgIGluc3RhbmNlLT5jb2RlQmxvY2so
KS0+cGxhbigpLmFkZENvbXBsZXRpb25UYXNrKFtwcm9taXNlLCBpbnN0YW5jZSwgbW9kdWxlLCBl
bnRyaWVzXSAoUGxhbiYgcCkgewotICAgICAgICAgICAgUmVmUHRyPFBsYW4+IHBsYW4gPSBtYWtl
UmVmKHApOwotICAgICAgICAgICAgcC52bSgpLnByb21pc2VEZWZlcnJlZFRpbWVyLT5zY2hlZHVs
ZVdvcmtTb29uKHByb21pc2UsIFtwcm9taXNlLCBpbnN0YW5jZSwgbW9kdWxlLCBlbnRyaWVzLCBw
bGFuID0gV1RGTW92ZShwbGFuKV0gKCkgewotICAgICAgICAgICAgICAgIEV4ZWNTdGF0ZSogZXhl
YyA9IGluc3RhbmNlLT5nbG9iYWxPYmplY3QoKS0+Z2xvYmFsRXhlYygpOwotICAgICAgICAgICAg
ICAgIHJlc29sdmUocGxhbi0+dm0oKSwgZXhlYywgcHJvbWlzZSwgaW5zdGFuY2UsIG1vZHVsZSwg
ZW50cmllcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0gICAgQVNTRVJUKCFpbnN0YW5jZS0+Y29kZUJsb2NrKCkpOwotCi0gICAgLy8gRklY
TUU6IFRoaXMgcmUtcGFyc2VzIHRoZSBtb2R1bGUgaGVhZGVyLCB3aGljaCBzaG91bGRuJ3QgYmUg
bmVjZXNzYXJ5LgotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xNzAyMDUKLSAgICBSZWY8UGxhbj4gcGxhbiA9IGFkb3B0UmVmKCpuZXcgUGxhbih2bSwgbWFr
ZVJlZihjb25zdF9jYXN0PFdhc206Ok1vZHVsZUluZm9ybWF0aW9uJj4obW9kdWxlLT5tb2R1bGVJ
bmZvcm1hdGlvbigpKSksIFBsYW46OkZ1bGxDb21waWxlLCBbcHJvbWlzZSwgaW5zdGFuY2UsIG1v
ZHVsZSwgZW50cmllc10gKFBsYW4mIHApIHsKLSAgICAgICAgUmVmUHRyPFBsYW4+IHBsYW4gPSBt
YWtlUmVmKHApOwotICAgICAgICBwLnZtKCkucHJvbWlzZURlZmVycmVkVGltZXItPnNjaGVkdWxl
V29ya1Nvb24ocHJvbWlzZSwgW3Byb21pc2UsIGluc3RhbmNlLCBtb2R1bGUsIGVudHJpZXMsIHBs
YW4gPSBXVEZNb3ZlKHBsYW4pXSAoKSB7Ci0gICAgICAgICAgICBWTSYgdm0gPSBwbGFuLT52bSgp
OworICAgIC8vIE5vdGU6IFRoaXMgY29tcGxldGlvbiB0YXNrIG1heSBvciBtYXkgbm90IGdldCBj
YWxsZWQgaW1tZWRpYXRlbHkuCisgICAgbW9kdWxlLT5tb2R1bGUoKS5jb21waWxlQXN5bmModm0s
IGluc3RhbmNlLT5tZW1vcnlNb2RlKCksIGNyZWF0ZVNoYXJlZFRhc2s8V2FzbTo6Q29kZUJsb2Nr
OjpDYWxsYmFja1R5cGU+KFtwcm9taXNlLCBpbnN0YW5jZSwgbW9kdWxlLCByZXNvbHZlS2luZF0g
KFZNJiB2bSwgUmVmPFdhc206OkNvZGVCbG9jaz4mJiByZWZDb2RlQmxvY2spIG11dGFibGUgewor
ICAgICAgICBSZWZQdHI8V2FzbTo6Q29kZUJsb2NrPiBjb2RlQmxvY2sgPSBXVEZNb3ZlKHJlZkNv
ZGVCbG9jayk7CisgICAgICAgIHZtLnByb21pc2VEZWZlcnJlZFRpbWVyLT5zY2hlZHVsZVdvcmtT
b29uKHByb21pc2UsIFtwcm9taXNlLCBpbnN0YW5jZSwgbW9kdWxlLCByZXNvbHZlS2luZCwgJnZt
LCBjb2RlQmxvY2sgPSBXVEZNb3ZlKGNvZGVCbG9jayldICgpIG11dGFibGUgewogICAgICAgICAg
ICAgRXhlY1N0YXRlKiBleGVjID0gaW5zdGFuY2UtPmdsb2JhbE9iamVjdCgpLT5nbG9iYWxFeGVj
KCk7Ci0gICAgICAgICAgICByZXNvbHZlKHZtLCBleGVjLCBwcm9taXNlLCBpbnN0YW5jZSwgbW9k
dWxlLCBlbnRyaWVzKTsKKyAgICAgICAgICAgIHJlc29sdmUodm0sIGV4ZWMsIHByb21pc2UsIGlu
c3RhbmNlLCBtb2R1bGUsIGNvZGVCbG9jay5yZWxlYXNlTm9uTnVsbCgpLCByZXNvbHZlS2luZCk7
CiAgICAgICAgIH0pOwogICAgIH0pKTsKLQotICAgIGluc3RhbmNlLT5hZGRVbml0aWFsaXplZENv
ZGVCbG9jayh2bSwgcGxhbi5jb3B5UmVmKCkpOwotICAgIHBsYW4tPnNldE1vZGUoaW5zdGFuY2Ut
Pm1lbW9yeU1vZGUoKSk7Ci0gICAgV2FzbTo6ZW5zdXJlV29ya2xpc3QoKS5lbnF1ZXVlKFdURk1v
dmUocGxhbikpOwogfQogCiBzdGF0aWMgdm9pZCBjb21waWxlQW5kSW5zdGFudGlhdGUoVk0mIHZt
LCBFeGVjU3RhdGUqIGV4ZWMsIEpTUHJvbWlzZURlZmVycmVkKiBwcm9taXNlLCBKU1ZhbHVlIGJ1
ZmZlciwgSlNPYmplY3QqIGltcG9ydE9iamVjdCkKQEAgLTE5NSwxMyArMTYyLDExIEBAIHN0YXRp
YyB2b2lkIGNvbXBpbGVBbmRJbnN0YW50aWF0ZShWTSYgdm0KICAgICBkZXBlbmRlbmNpZXMuYXBw
ZW5kKFN0cm9uZzxKU0NlbGw+KHZtLCBpbXBvcnRPYmplY3QpKTsKICAgICB2bS5wcm9taXNlRGVm
ZXJyZWRUaW1lci0+YWRkUGVuZGluZ1Byb21pc2UocHJvbWlzZSwgV1RGTW92ZShkZXBlbmRlbmNp
ZXMpKTsKIAotICAgIFJlZjxQbGFuPiBwbGFuID0gYWRvcHRSZWYoKm5ldyBQbGFuKHZtLCBXVEZN
b3ZlKHNvdXJjZSksIFBsYW46OlZhbGlkYXRpb24sIFtwcm9taXNlLCBpbXBvcnRPYmplY3QsIGds
b2JhbE9iamVjdF0gKFBsYW4mIHApIG11dGFibGUgewotICAgICAgICBSZWZQdHI8UGxhbj4gcGxh
biA9IG1ha2VSZWYocCk7Ci0gICAgICAgIHAudm0oKS5wcm9taXNlRGVmZXJyZWRUaW1lci0+c2No
ZWR1bGVXb3JrU29vbihwcm9taXNlLCBbcHJvbWlzZSwgaW1wb3J0T2JqZWN0LCBnbG9iYWxPYmpl
Y3QsIHBsYW4gPSBXVEZNb3ZlKHBsYW4pXSAoKSBtdXRhYmxlIHsKLSAgICAgICAgICAgIFZNJiB2
bSA9IHBsYW4tPnZtKCk7CisgICAgV2FzbTo6TW9kdWxlOjp2YWxpZGF0ZUFzeW5jKHZtLCBXVEZN
b3ZlKHNvdXJjZSksIGNyZWF0ZVNoYXJlZFRhc2s8V2FzbTo6TW9kdWxlOjpDYWxsYmFja1R5cGU+
KFtwcm9taXNlLCBpbXBvcnRPYmplY3QsIGdsb2JhbE9iamVjdF0gKFZNJiB2bSwgV2FzbTo6TW9k
dWxlOjpWYWxpZGF0aW9uUmVzdWx0JiYgcmVzdWx0KSBtdXRhYmxlIHsKKyAgICAgICAgdm0ucHJv
bWlzZURlZmVycmVkVGltZXItPnNjaGVkdWxlV29ya1Nvb24ocHJvbWlzZSwgW3Byb21pc2UsIGlt
cG9ydE9iamVjdCwgZ2xvYmFsT2JqZWN0LCByZXN1bHQgPSBXVEZNb3ZlKHJlc3VsdCksICZ2bV0g
KCkgbXV0YWJsZSB7CiAgICAgICAgICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9DQVRDSF9TQ09Q
RSh2bSk7CiAgICAgICAgICAgICBFeGVjU3RhdGUqIGV4ZWMgPSBnbG9iYWxPYmplY3QtPmdsb2Jh
bEV4ZWMoKTsKLSAgICAgICAgICAgIEpTV2ViQXNzZW1ibHlNb2R1bGUqIG1vZHVsZSA9IEpTV2Vi
QXNzZW1ibHlNb2R1bGU6OmNyZWF0ZVN0dWIodm0sIGV4ZWMsIGdsb2JhbE9iamVjdC0+V2ViQXNz
ZW1ibHlNb2R1bGVTdHJ1Y3R1cmUoKSwgcGxhbi5jb3B5UmVmKCkpOworICAgICAgICAgICAgSlNX
ZWJBc3NlbWJseU1vZHVsZSogbW9kdWxlID0gSlNXZWJBc3NlbWJseU1vZHVsZTo6Y3JlYXRlU3R1
Yih2bSwgZXhlYywgZ2xvYmFsT2JqZWN0LT5XZWJBc3NlbWJseU1vZHVsZVN0cnVjdHVyZSgpLCBX
VEZNb3ZlKHJlc3VsdCkpOwogICAgICAgICAgICAgaWYgKHNjb3BlLmV4Y2VwdGlvbigpKSB7CiAg
ICAgICAgICAgICAgICAgcmVqZWN0KGV4ZWMsIHNjb3BlLCBwcm9taXNlKTsKICAgICAgICAgICAg
ICAgICByZXR1cm47CkBAIC0yMTAsOCArMTc1LDYgQEAgc3RhdGljIHZvaWQgY29tcGlsZUFuZElu
c3RhbnRpYXRlKFZNJiB2bQogICAgICAgICAgICAgaW5zdGFudGlhdGUodm0sIGV4ZWMsIHByb21p
c2UsIG1vZHVsZSwgaW1wb3J0T2JqZWN0LCBSZXNvbHZlOjpXaXRoTW9kdWxlQW5kSW5zdGFuY2Up
OwogICAgICAgICB9KTsKICAgICB9KSk7Ci0KLSAgICBXYXNtOjplbnN1cmVXb3JrbGlzdCgpLmVu
cXVldWUoV1RGTW92ZShwbGFuKSk7CiB9CiAKIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9T
VF9DQUxMIHdlYkFzc2VtYmx5SW5zdGFudGlhdGVGdW5jKEV4ZWNTdGF0ZSogZXhlYykKQEAgLTI0
OCw3ICsyMTEsNyBAQCBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCB3ZWJBCiAg
ICAgc2l6ZV90IGJ5dGVTaXplOwogICAgIHVpbnQ4X3QqIGJhc2UgPSBnZXRXYXNtQnVmZmVyRnJv
bVZhbHVlKGV4ZWMsIGV4ZWMtPmFyZ3VtZW50KDApLCBieXRlT2Zmc2V0LCBieXRlU2l6ZSk7CiAg
ICAgUkVUVVJOX0lGX0VYQ0VQVElPTihzY29wZSwgZW5jb2RlZEpTVmFsdWUoKSk7Ci0gICAgV2Fz
bTo6UGxhbiBwbGFuKHZtLCBiYXNlICsgYnl0ZU9mZnNldCwgYnl0ZVNpemUsIFBsYW46OlZhbGlk
YXRpb24sIFBsYW46OmRvbnRGaW5hbGl6ZSk7CisgICAgV2FzbTo6UGxhbiBwbGFuKHZtLCBiYXNl
ICsgYnl0ZU9mZnNldCwgYnl0ZVNpemUsIFBsYW46OlZhbGlkYXRpb24sIFBsYW46OmRvbnRGaW5h
bGl6ZSgpKTsKICAgICAvLyBGSVhNRTogV2UgbWlnaHQgd2FudCB0byB0aHJvdyBhbiBPT00gZXhj
ZXB0aW9uIGhlcmUgaWYgd2UgZGV0ZWN0IHRoYXQgc29tZXRoaW5nIHdpbGwgT09NLgogICAgIC8v
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjYwMTUKICAgICByZXR1
cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbihwbGFuLnBhcnNlQW5kVmFsaWRhdGVNb2R1bGUo
KSkpOwpJbmRleDogU291cmNlL1dURi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dU
Ri9DaGFuZ2VMb2cJKHJldmlzaW9uIDIxNTA1NCkKKysrIFNvdXJjZS9XVEYvQ2hhbmdlTG9nCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIgQEAKKzIwMTctMDQtMDcgIFNhYW0gQmFyYXRpICA8
c2JhcmF0aUBhcHBsZS5jb20+CisKKyAgICAgICAgV2ViQXNzZW1ibHk6IE1ha2UgdG8gYSBjb21w
aWxhdGlvbiBBUEkgdGhhdCBhbGxvd3MgZm9yIG11bHRpLVZNIGNvbmN1cnJlbnQgY29tcGlsYXRp
b25zIG9mIFdhc20gTW9kdWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTcwNDg4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgKiB3dGYvU2hhcmVkVGFzay5oOiBNYWtlIFNoYXJlZFRhc2tGdW5jdG9yIGZv
cndhcmQgaXRzIGFyZ3VtZW50cy4KKwogMjAxNy0wNC0wNSAgQW5kcmVhcyBLbGluZyAgPGFrbGlu
Z0BhcHBsZS5jb20+CiAKICAgICAgICAgTWFrZSBpbmFjdGl2ZSB3ZWIgcHJvY2Vzc2VzIGJlaGF2
ZSBhcyB0aG91Z2ggdW5kZXIgbWVtb3J5IHByZXNzdXJlLgpJbmRleDogU291cmNlL1dURi93dGYv
U2hhcmVkVGFzay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1NoYXJlZFRhc2suaAko
cmV2aXNpb24gMjE1MDU0KQorKysgU291cmNlL1dURi93dGYvU2hhcmVkVGFzay5oCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKQEAgLTg3LDcgKzg3LDcgQEAgcHVibGljOgogcHJpdmF0ZToKICAgICBSZXN1bHRUeXBlIHJ1
bihBcmd1bWVudFR5cGVzLi4uIGFyZ3VtZW50cykgb3ZlcnJpZGUKICAgICB7Ci0gICAgICAgIHJl
dHVybiBtX2Z1bmN0b3IoYXJndW1lbnRzLi4uKTsKKyAgICAgICAgcmV0dXJuIG1fZnVuY3Rvcihz
dGQ6OmZvcndhcmQ8QXJndW1lbnRUeXBlcz4oYXJndW1lbnRzKS4uLik7CiAgICAgfQogCiAgICAg
RnVuY3RvciBtX2Z1bmN0b3I7Cg==
</data>
<flag name="review"
          id="327825"
          type_id="1"
          status="+"
          setter="jfbastien"
    />
          </attachment>
      

    </bug>

</bugzilla>