<?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>165936</bug_id>
          
          <creation_ts>2016-12-15 17:18:16 -0800</creation_ts>
          <short_desc>WebAssembly: Implement the WebAssembly.compile and WebAssembly.validate</short_desc>
          <delta_ts>2016-12-18 23:23:42 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</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>oliver</cc>
    
    <cc>ticaiolima</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1260402</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-15 17:18:16 -0800</bug_when>
    <thetext>...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260461</commentid>
    <comment_count>1</comment_count>
      <attachid>297280</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-15 18:31:17 -0800</bug_when>
    <thetext>Created attachment 297280
WIP

This has a different patch embedded in it ATM</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260860</commentid>
    <comment_count>2</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-16 19:28:10 -0800</bug_when>
    <thetext>This will allow us to run the unity headless benchmark.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260861</commentid>
    <comment_count>3</comment_count>
      <attachid>297384</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-16 19:32:45 -0800</bug_when>
    <thetext>Created attachment 297384
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260862</commentid>
    <comment_count>4</comment_count>
      <attachid>297384</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-16 19:33:32 -0800</bug_when>
    <thetext>Comment on attachment 297384
patch

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

&gt; JSTests/wasm/js-api/test_Module.js:22
&gt; +async function testPromiseAPI() {

I&apos;m going to add one more test for it passing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260863</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-12-16 19:34:25 -0800</bug_when>
    <thetext>Attachment 297384 did not pass style-queue:


ERROR: Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp:78:  One line control clauses should not use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp:82:  One line control clauses should not use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp:93:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 3 in 9 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>1260867</commentid>
    <comment_count>6</comment_count>
      <attachid>297386</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-16 19:40:28 -0800</bug_when>
    <thetext>Created attachment 297386
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260868</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-12-16 19:43:11 -0800</bug_when>
    <thetext>Attachment 297386 did not pass style-queue:


ERROR: Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp:78:  One line control clauses should not use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp:82:  One line control clauses should not use braces.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp:93:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 3 in 9 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>1260869</commentid>
    <comment_count>8</comment_count>
      <attachid>297387</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-16 19:49:19 -0800</bug_when>
    <thetext>Created attachment 297387
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260870</commentid>
    <comment_count>9</comment_count>
      <attachid>297388</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-16 19:50:30 -0800</bug_when>
    <thetext>Created attachment 297388
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260872</commentid>
    <comment_count>10</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-16 19:54:25 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; This will allow us to run the unity headless benchmark.

Actually we need to make a particular RELEASE_ASSERT_NOT_REACHED a jit.breakpoint() for now to make it run.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260873</commentid>
    <comment_count>11</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-16 19:54:36 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #2)
&gt; &gt; This will allow us to run the unity headless benchmark.
&gt; 
&gt; Actually we need to make a particular RELEASE_ASSERT_NOT_REACHED a
&gt; jit.breakpoint() for now to make it run.

Inside importStubGenerator.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260948</commentid>
    <comment_count>12</comment_count>
      <attachid>297388</attachid>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-17 11:05:07 -0800</bug_when>
    <thetext>Comment on attachment 297388
patch

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

&gt; JSTests/wasm/js-api/test_Module.js:36
&gt; +            await WebAssembly.compile(builder.WebAssembly().get());

I&apos;d put this test in its own file (WebAssembly-compile.js or something) since this file is for .Module specifically.

&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:51
&gt; +    JSPromiseDeferred* promise =  JSPromiseDeferred::create(exec, exec-&gt;lexicalGlobalObject());

Weird spacing.

&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:54
&gt; +    JSValue module = WebAssemblyModuleConstructor::createModule(exec, exec-&gt;lexicalGlobalObject()-&gt;WebAssemblyModuleStructure());

This is synchronous though, right? We&apos;ll need a bug to make it async?

&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:78
&gt; +    }

Test for this is missing.

Also, would it be worth sharing some of this with constructJSWebAssemblyModule?

&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:89
&gt; +    return JSValue::encode(jsBoolean(plan.isValidModule()));

Validation can throw on OOM. Right now we don&apos;t distinguish it (you just get an error message). Can you add a FIXME for https://bugs.webkit.org/show_bug.cgi?id=165997 ?

&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:111
&gt; +    JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(&quot;compile&quot;, webAssemblyCompileFunc, DontEnum, 1);

These should use the .lut.h file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261043</commentid>
    <comment_count>13</comment_count>
      <attachid>297388</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-18 12:50:42 -0800</bug_when>
    <thetext>Comment on attachment 297388
patch

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

&gt;&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:51
&gt;&gt; +    JSPromiseDeferred* promise =  JSPromiseDeferred::create(exec, exec-&gt;lexicalGlobalObject());
&gt; 
&gt; Weird spacing.

Thanks, will fix.

&gt;&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:54
&gt;&gt; +    JSValue module = WebAssemblyModuleConstructor::createModule(exec, exec-&gt;lexicalGlobalObject()-&gt;WebAssemblyModuleStructure());
&gt; 
&gt; This is synchronous though, right? We&apos;ll need a bug to make it async?

Yeah this is synchronous still. I&apos;ll file a bug to make it truly asynchronous.

&gt;&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:78
&gt;&gt; +    }
&gt; 
&gt; Test for this is missing.
&gt; 
&gt; Also, would it be worth sharing some of this with constructJSWebAssemblyModule?

I&apos;ll add a test and yes.

&gt;&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:89
&gt;&gt; +    return JSValue::encode(jsBoolean(plan.isValidModule()));
&gt; 
&gt; Validation can throw on OOM. Right now we don&apos;t distinguish it (you just get an error message). Can you add a FIXME for https://bugs.webkit.org/show_bug.cgi?id=165997 ?

What are the expected semantics there? If Validation throws an OOM, how do we distinguish that from a valid module or not? Seems like it should be invalid IMO since we know that you&apos;ll OOM

&gt;&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:111
&gt;&gt; +    JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(&quot;compile&quot;, webAssemblyCompileFunc, DontEnum, 1);
&gt; 
&gt; These should use the .lut.h file.

ok</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261049</commentid>
    <comment_count>14</comment_count>
      <attachid>297388</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-18 13:31:34 -0800</bug_when>
    <thetext>Comment on attachment 297388
patch

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

&gt;&gt;&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:111
&gt;&gt;&gt; +    JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(&quot;compile&quot;, webAssemblyCompileFunc, DontEnum, 1);
&gt;&gt; 
&gt;&gt; These should use the .lut.h file.
&gt; 
&gt; ok

There is no static property table here. I&apos;ll defer this work to later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261050</commentid>
    <comment_count>15</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-18 13:33:57 -0800</bug_when>
    <thetext>&gt; &gt;&gt; Source/JavaScriptCore/wasm/JSWebAssembly.cpp:89
&gt; &gt;&gt; +    return JSValue::encode(jsBoolean(plan.isValidModule()));
&gt; &gt; 
&gt; &gt; Validation can throw on OOM. Right now we don&apos;t distinguish it (you just get an error message). Can you add a FIXME for https://bugs.webkit.org/show_bug.cgi?id=165997 ?
&gt; 
&gt; What are the expected semantics there? If Validation throws an OOM, how do
&gt; we distinguish that from a valid module or not? Seems like it should be
&gt; invalid IMO since we know that you&apos;ll OOM

I think it should be an OOM exception as other OOMs. I added this to the list of things to clarify about OOM:
  https://github.com/WebAssembly/design/issues/903#issuecomment-267848357</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261054</commentid>
    <comment_count>16</comment_count>
      <attachid>297446</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-18 14:20:25 -0800</bug_when>
    <thetext>Created attachment 297446
patch

Addressed JF&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261065</commentid>
    <comment_count>17</comment_count>
      <attachid>297446</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-12-18 17:35:18 -0800</bug_when>
    <thetext>Comment on attachment 297446
patch

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

r=me with issues resolved.

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:81
&gt; +        ASSERT(functionLength &lt;= m_sourceLength);

I think you should make an even stronger assertion here that (functionStart + functionLength &lt;= m_source + m_sourceLength).

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:84
&gt; +        auto validateResult = validateFunction(functionStart, functionLength, signature, m_functionIndexSpace, *m_moduleInformation);

nit: &quot;validateResult&quot; sounds like an action whereas we would expect a noun.  How about &quot;validationResult&quot; instead?

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:101
&gt; +    if (!isValidModule()) // This also collects a bunch of information needed to do the actual compilation.

I&apos;m wondering if we can name the function in a way to communicate what this comment is trying to say.  Would it be sufficient to name the function &quot;parseAndValidateModule()&quot; instead?

&gt; Source/JavaScriptCore/wasm/js/JSWebAssemblyHelpers.h:54
&gt; +    // If the given bytes argument is not a BufferSource, a TypeError exception is thrown.

I know that this comment came from pre-existing code, but the reference to &quot;bytes&quot; here doesn&apos;t patch the arguments of this function.  How about changing it to &quot;value&quot;?

&gt; Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp:58
&gt; +    auto* structure = InternalFunction::createSubclassStructure(exec, exec-&gt;newTarget(), exec-&gt;lexicalGlobalObject()-&gt;WebAssemblyModuleStructure());

There was an exception check after the old placement of createSubclassStructure() (below).  Should that exception check be moved here as well?

&gt; Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp:86
&gt;      RETURN_IF_EXCEPTION(scope, { });

Is this exception check still needed if we no longer do the createSubclassStructure() here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261068</commentid>
    <comment_count>18</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-18 17:52:05 -0800</bug_when>
    <thetext>&gt; &gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:81
&gt; &gt; +        ASSERT(functionLength &lt;= m_sourceLength);
&gt; 
&gt; I think you should make an even stronger assertion here that (functionStart
&gt; + functionLength &lt;= m_source + m_sourceLength).

I&apos;d make sure it can&apos;t overflow though.


&gt; &gt; Source/JavaScriptCore/wasm/js/JSWebAssemblyHelpers.h:54
&gt; &gt; +    // If the given bytes argument is not a BufferSource, a TypeError exception is thrown.
&gt; 
&gt; I know that this comment came from pre-existing code, but the reference to
&gt; &quot;bytes&quot; here doesn&apos;t patch the arguments of this function.  How about
&gt; changing it to &quot;value&quot;?

It comes from here: https://github.com/WebAssembly/design/blob/master/JS.md#function-properties-of-the-webassembly-object
I&apos;d rather keep the wording as-is from the spec, so I&apos;d change JS.md first.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261069</commentid>
    <comment_count>19</comment_count>
      <attachid>297446</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2016-12-18 17:54:31 -0800</bug_when>
    <thetext>Comment on attachment 297446
patch

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

&gt;&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:81
&gt;&gt; +        ASSERT(functionLength &lt;= m_sourceLength);
&gt; 
&gt; I think you should make an even stronger assertion here that (functionStart + functionLength &lt;= m_source + m_sourceLength).

Is function length being provided by the binary or actual parsing? If the binary is providing it then functionStart + functionLength could overflow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261070</commentid>
    <comment_count>20</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-18 18:00:47 -0800</bug_when>
    <thetext>(In reply to comment #19)
&gt; Comment on attachment 297446 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=297446&amp;action=review
&gt; 
&gt; &gt;&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:81
&gt; &gt;&gt; +        ASSERT(functionLength &lt;= m_sourceLength);
&gt; &gt; 
&gt; &gt; I think you should make an even stronger assertion here that (functionStart + functionLength &lt;= m_source + m_sourceLength).
&gt; 
&gt; Is function length being provided by the binary or actual parsing? If the
&gt; binary is providing it then functionStart + functionLength could overflow.

Agreed on overflow. It&apos;s provided by the binary here:
https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#function-bodies

We setup start / end in the parser here:
https://github.com/WebKit/webkit/blob/54a8f928520be7461e1a809203c7828ad817e2f8/Source/JavaScriptCore/wasm/WasmModuleParser.cpp#L206

We then fill out start / end here:
https://github.com/WebKit/webkit/blob/54a8f928520be7461e1a809203c7828ad817e2f8/Source/JavaScriptCore/wasm/WasmModuleParser.cpp#L488

It would be great to get another set of eyes on the entire WasmModuleParser. I think it&apos;s pretty much done except for:
https://bugs.webkit.org/show_bug.cgi?id=165833</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261079</commentid>
    <comment_count>21</comment_count>
      <attachid>297446</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-18 22:29:25 -0800</bug_when>
    <thetext>Comment on attachment 297446
patch

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

&gt;&gt;&gt;&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:81
&gt;&gt;&gt;&gt; +        ASSERT(functionLength &lt;= m_sourceLength);
&gt;&gt;&gt; 
&gt;&gt;&gt; I think you should make an even stronger assertion here that (functionStart + functionLength &lt;= m_source + m_sourceLength).
&gt;&gt; 
&gt;&gt; Is function length being provided by the binary or actual parsing? If the binary is providing it then functionStart + functionLength could overflow.
&gt; 
&gt; Agreed on overflow. It&apos;s provided by the binary here:
&gt; https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#function-bodies
&gt; 
&gt; We setup start / end in the parser here:
&gt; https://github.com/WebKit/webkit/blob/54a8f928520be7461e1a809203c7828ad817e2f8/Source/JavaScriptCore/wasm/WasmModuleParser.cpp#L206
&gt; 
&gt; We then fill out start / end here:
&gt; https://github.com/WebKit/webkit/blob/54a8f928520be7461e1a809203c7828ad817e2f8/Source/JavaScriptCore/wasm/WasmModuleParser.cpp#L488
&gt; 
&gt; It would be great to get another set of eyes on the entire WasmModuleParser. I think it&apos;s pretty much done except for:
&gt; https://bugs.webkit.org/show_bug.cgi?id=165833

I&apos;ll used Checked&lt;ChrashOnOverflow&gt; for now and we can later come up with a nicer way to error out here.

&gt;&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:84
&gt;&gt; +        auto validateResult = validateFunction(functionStart, functionLength, signature, m_functionIndexSpace, *m_moduleInformation);
&gt; 
&gt; nit: &quot;validateResult&quot; sounds like an action whereas we would expect a noun.  How about &quot;validationResult&quot; instead?

I agree, I was just moving the old code around, but I like your name more than the previous &quot;validateResult&quot;

&gt;&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:101
&gt;&gt; +    if (!isValidModule()) // This also collects a bunch of information needed to do the actual compilation.
&gt; 
&gt; I&apos;m wondering if we can name the function in a way to communicate what this comment is trying to say.  Would it be sufficient to name the function &quot;parseAndValidateModule()&quot; instead?

SGTM

&gt;&gt; Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp:58
&gt;&gt; +    auto* structure = InternalFunction::createSubclassStructure(exec, exec-&gt;newTarget(), exec-&gt;lexicalGlobalObject()-&gt;WebAssemblyModuleStructure());
&gt; 
&gt; There was an exception check after the old placement of createSubclassStructure() (below).  Should that exception check be moved here as well?

Yeah this needs an exception check. Good catch.

&gt;&gt; Source/JavaScriptCore/wasm/js/WebAssemblyModuleConstructor.cpp:86
&gt;&gt;      RETURN_IF_EXCEPTION(scope, { });
&gt; 
&gt; Is this exception check still needed if we no longer do the createSubclassStructure() here?

Yup, this isn&apos;t needed anymore. Good catch. I moved the old code around in a sloppy way here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261080</commentid>
    <comment_count>22</comment_count>
      <attachid>297446</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-18 22:33:57 -0800</bug_when>
    <thetext>Comment on attachment 297446
patch

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

&gt;&gt;&gt;&gt;&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:81
&gt;&gt;&gt;&gt;&gt; +        ASSERT(functionLength &lt;= m_sourceLength);
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; I think you should make an even stronger assertion here that (functionStart + functionLength &lt;= m_source + m_sourceLength).
&gt;&gt;&gt; 
&gt;&gt;&gt; Is function length being provided by the binary or actual parsing? If the binary is providing it then functionStart + functionLength could overflow.
&gt;&gt; 
&gt;&gt; Agreed on overflow. It&apos;s provided by the binary here:
&gt;&gt; https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#function-bodies
&gt;&gt; 
&gt;&gt; We setup start / end in the parser here:
&gt;&gt; https://github.com/WebKit/webkit/blob/54a8f928520be7461e1a809203c7828ad817e2f8/Source/JavaScriptCore/wasm/WasmModuleParser.cpp#L206
&gt;&gt; 
&gt;&gt; We then fill out start / end here:
&gt;&gt; https://github.com/WebKit/webkit/blob/54a8f928520be7461e1a809203c7828ad817e2f8/Source/JavaScriptCore/wasm/WasmModuleParser.cpp#L488
&gt;&gt; 
&gt;&gt; It would be great to get another set of eyes on the entire WasmModuleParser. I think it&apos;s pretty much done except for:
&gt;&gt; https://bugs.webkit.org/show_bug.cgi?id=165833
&gt; 
&gt; I&apos;ll used Checked&lt;ChrashOnOverflow&gt; for now and we can later come up with a nicer way to error out here.

Actually, why would we need to do this? Wouldn&apos;t it be an early validation error to have any function with a bounds that exceeded the buffer? If we don&apos;t already have a check that does this, we should in the WasmModuleParser, not here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261081</commentid>
    <comment_count>23</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-18 22:35:57 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; Comment on attachment 297446 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=297446&amp;action=review
&gt; 
&gt; &gt;&gt;&gt;&gt;&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:81
&gt; &gt;&gt;&gt;&gt;&gt; +        ASSERT(functionLength &lt;= m_sourceLength);
&gt; &gt;&gt;&gt;&gt; 
&gt; &gt;&gt;&gt;&gt; I think you should make an even stronger assertion here that (functionStart + functionLength &lt;= m_source + m_sourceLength).
&gt; &gt;&gt;&gt; 
&gt; &gt;&gt;&gt; Is function length being provided by the binary or actual parsing? If the binary is providing it then functionStart + functionLength could overflow.
&gt; &gt;&gt; 
&gt; &gt;&gt; Agreed on overflow. It&apos;s provided by the binary here:
&gt; &gt;&gt; https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#function-bodies
&gt; &gt;&gt; 
&gt; &gt;&gt; We setup start / end in the parser here:
&gt; &gt;&gt; https://github.com/WebKit/webkit/blob/54a8f928520be7461e1a809203c7828ad817e2f8/Source/JavaScriptCore/wasm/WasmModuleParser.cpp#L206
&gt; &gt;&gt; 
&gt; &gt;&gt; We then fill out start / end here:
&gt; &gt;&gt; https://github.com/WebKit/webkit/blob/54a8f928520be7461e1a809203c7828ad817e2f8/Source/JavaScriptCore/wasm/WasmModuleParser.cpp#L488
&gt; &gt;&gt; 
&gt; &gt;&gt; It would be great to get another set of eyes on the entire WasmModuleParser. I think it&apos;s pretty much done except for:
&gt; &gt;&gt; https://bugs.webkit.org/show_bug.cgi?id=165833
&gt; &gt; 
&gt; &gt; I&apos;ll used Checked&lt;ChrashOnOverflow&gt; for now and we can later come up with a nicer way to error out here.
&gt; 
&gt; Actually, why would we need to do this? Wouldn&apos;t it be an early validation
&gt; error to have any function with a bounds that exceeded the buffer? If we
&gt; don&apos;t already have a check that does this, we should in the
&gt; WasmModuleParser, not here.

Indeed, if we get an overflow here we&apos;re in trouble already. That&apos;s why the assert should check assuming there could be overflow, otherwise it&apos;s totally useless: it means we&apos;re trying to make sure the parser didn&apos;t mess up, but we&apos;re messing up here too!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261085</commentid>
    <comment_count>24</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-18 23:23:42 -0800</bug_when>
    <thetext>landed in:
https://trac.webkit.org/changeset/209979</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297280</attachid>
            <date>2016-12-15 18:31:17 -0800</date>
            <delta_ts>2016-12-16 19:32:45 -0800</delta_ts>
            <desc>WIP</desc>
            <filename>a-backup.diff</filename>
            <type>text/plain</type>
            <size>47499</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMDk4OTMpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE1IEBACisyMDE2LTEyLTE1ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUu
Y29tPgorCisgICAgICAgIFdlYkFzc2VtYmx5OiBXYXNtQjNJUkdlbmVyYXRvciBzaG91bGQgdGhy
b3cgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mIGNyYXNoCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjU4MzQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICAqIHdhc20vZnVuY3Rpb24tdGVzdHMvZXhjZXB0aW9ucy5q
czogQWRkZWQuCisgICAgICAgIChpbXBvcnQuQnVpbGRlci5mcm9tLnN0cmluZ19hcHBlYXJlZF9o
ZXJlLmltcG9ydC5hcy5hc3NlcnQuZnJvbS5zdHJpbmdfYXBwZWFyZWRfaGVyZS5tYWtlSW5zdGFu
Y2UpOgorICAgICAgICAqIHdhc20vZnVuY3Rpb24tdGVzdHMvdGFibGUtYmFzaWMuanM6CisgICAg
ICAgIChpLmkuNDIudGhyb3cubmV3LkVycm9yKToKKwogMjAxNi0xMi0xNSAgS2VpdGggTWlsbGVy
ICA8a2VpdGhfbWlsbGVyQGFwcGxlLmNvbT4KIAogICAgICAgICBXYXNtIHNob3VsZCBub3QgY3Jl
YXRlIGVtcHR5IHVubGlua2VkIGNhbGxzaXRlcwpJbmRleDogSlNUZXN0cy93YXNtL2Z1bmN0aW9u
LXRlc3RzL2V4Y2VwdGlvbnMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSlNUZXN0cy93YXNtL2Z1bmN0aW9u
LXRlc3RzL2V4Y2VwdGlvbnMuanMJKG5vbmV4aXN0ZW50KQorKysgSlNUZXN0cy93YXNtL2Z1bmN0
aW9uLXRlc3RzL2V4Y2VwdGlvbnMuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NyBAQAor
aW1wb3J0IEJ1aWxkZXIgZnJvbSAnLi4vQnVpbGRlci5qcycKK2ltcG9ydCAqIGFzIGFzc2VydCBm
cm9tICcuLi9hc3NlcnQuanMnCisKK2Z1bmN0aW9uIG1ha2VJbnN0YW5jZSgpIHsKKyAgICBjb25z
dCB0YWJsZURlc2NyaXB0aW9uID0ge2luaXRpYWw6IDEsIGVsZW1lbnQ6ICJhbnlmdW5jIn07Cisg
ICAgY29uc3QgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCkKKyAgICAgICAgLlR5cGUoKQorICAgICAg
ICAgICAgLkZ1bmMoWyJpMzIiLCAiaTMyIl0sICJpMzIiKQorICAgICAgICAgICAgLkZ1bmMoWyJp
MzIiXSwgImkzMiIpCisgICAgICAgIC5FbmQoKQorICAgICAgICAuSW1wb3J0KCkKKyAgICAgICAg
ICAgIC5UYWJsZSgiaW1wIiwgInRhYmxlIiwgdGFibGVEZXNjcmlwdGlvbikKKyAgICAgICAgLkVu
ZCgpCisgICAgICAgIC5GdW5jdGlvbigpLkVuZCgpCisgICAgICAgIC5FeHBvcnQoKQorICAgICAg
ICAgICAgLkZ1bmN0aW9uKCJmb28iKQorICAgICAgICAgICAgLkZ1bmN0aW9uKCJiYXIiKQorICAg
ICAgICAuRW5kKCkKKyAgICAgICAgLkNvZGUoKQorICAgICAgICAgICAgLkZ1bmN0aW9uKCJmb28i
LCAwIC8qWydpMzInLCAnaTMyJ10gPT4gJ2kzMicqLykKKyAgICAgICAgICAgICAgICAuR2V0TG9j
YWwoMSkgLy8gcGFyYW1ldGVyIHRvIGNhbGwKKyAgICAgICAgICAgICAgICAuR2V0TG9jYWwoMCkg
Ly8gY2FsbCBpbmRleAorICAgICAgICAgICAgICAgIC5DYWxsSW5kaXJlY3QoMSwgMCkgLy8gY2Fs
bGluZyBmdW5jdGlvbiBvZiB0eXBlIFsnaTMyJ10gPT4gJ2kzMicKKyAgICAgICAgICAgICAgICAu
UmV0dXJuKCkKKyAgICAgICAgICAgIC5FbmQoKQorICAgICAgICAgICAgLkZ1bmN0aW9uKCJiYXIi
LCAxIC8qWydpMzInXSA9PiAnaTMyJyovKQorICAgICAgICAgICAgICAgIC5HZXRMb2NhbCgwKQor
ICAgICAgICAgICAgICAgIC5JMzJDb25zdCg0MikKKyAgICAgICAgICAgICAgICAuSTMyQWRkKCkK
KyAgICAgICAgICAgICAgICAuUmV0dXJuKCkKKyAgICAgICAgICAgIC5FbmQoKQorICAgICAgICAu
RW5kKCk7CisKKworICAgIGNvbnN0IGJpbiA9IGJ1aWxkZXIuV2ViQXNzZW1ibHkoKS5nZXQoKTsK
KyAgICBjb25zdCBtb2R1bGUgPSBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKGJpbik7CisgICAgY29u
c3QgdGFibGUgPSBuZXcgV2ViQXNzZW1ibHkuVGFibGUodGFibGVEZXNjcmlwdGlvbik7CisgICAg
cmV0dXJuIHtpbnN0YW5jZTogbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKG1vZHVsZSwge2ltcDog
e3RhYmxlfX0pLCB0YWJsZX07Cit9CisKK3sKKyAgICBjb25zdCB7aW5zdGFuY2UsIHRhYmxlfSA9
IG1ha2VJbnN0YW5jZSgpOworICAgIGNvbnN0IGZvbyA9IGluc3RhbmNlLmV4cG9ydHMuZm9vOwor
ICAgIGNvbnN0IGJhciA9IGluc3RhbmNlLmV4cG9ydHMuYmFyOworICAgIGFzc2VydC5lcSh0YWJs
ZS5nZXQoMCksIG51bGwpOworCisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsK
KyAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBmb28oMCwgaSksIFdlYkFzc2VtYmx5LlJ1bnRp
bWVFcnJvciwgImNhbGxfaW5kaXJlY3QgdG8gYSBudWxsIHRhYmxlIGVudHJ5Iik7CisgICAgfQor
CisgICAgdGFibGUuc2V0KDAsIGZvbyk7CisgICAgYXNzZXJ0LmVxKHRhYmxlLmdldCgwKSwgZm9v
KTsKKworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIGFzc2Vy
dC50aHJvd3MoKCkgPT4gZm9vKDEgKyBpLCBpKSwgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yLCAi
T3V0IG9mIGJvdW5kcyBjYWxsX2luZGlyZWN0Iik7CisgICAgfQorCisgICAgZm9yIChsZXQgaSA9
IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBmb28oMCwg
aSksIFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvciwgImNhbGxfaW5kaXJlY3QgdG8gYSBzaWduYXR1
cmUgdGhhdCBkb2VzIG5vdCBtYXRjaCIpOworICAgIH0KKworICAgIHRhYmxlLnNldCgwLCBiYXIp
OworICAgIGFzc2VydC5lcSh0YWJsZS5nZXQoMCksIGJhcik7CisgICAgZm9yIChsZXQgaSA9IDA7
IGkgPCAyNTsgaSsrKSB7CisgICAgICAgIGFzc2VydC5lcShmb28oMCwgaSksIGkgKyA0Mik7Cisg
ICAgfQorfQpJbmRleDogSlNUZXN0cy93YXNtL2Z1bmN0aW9uLXRlc3RzL3RhYmxlLWJhc2ljLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIEpTVGVzdHMvd2FzbS9mdW5jdGlvbi10ZXN0cy90YWJsZS1iYXNpYy5q
cwkocmV2aXNpb24gMjA5ODg2KQorKysgSlNUZXN0cy93YXNtL2Z1bmN0aW9uLXRlc3RzL3RhYmxl
LWJhc2ljLmpzCSh3b3JraW5nIGNvcHkpCkBAIC01MywxNSArNTMsMTIgQEAgZnVuY3Rpb24gbWFr
ZUluc3RhbmNlKCkgewogLy8gRklYTUU6IG1ha2UgdGhpcyB3b3JrIGNyb3NzIG1vZHVsZS4gVGhl
IHJlYXNvbiBpdCBkb2Vzbid0CiAvLyBub3cgaXMgdGhhdCB3ZSBkb24ndCB1bmlxdWUgU2lnbmF0
dXJlKi4KIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjU1MTEK
LS8qCiB7CiAgICAgY29uc3Qge2luc3RhbmNlLCB0YWJsZX0gPSBtYWtlSW5zdGFuY2UoKTsKICAg
ICBjb25zdCBmb28gPSBpbnN0YW5jZS5leHBvcnRzLmZvbzsKLSAgICAvL3RhYmxlLnNldCgwLCBt
YWtlSW5zdGFuY2UoKS5pbnN0YW5jZS5leHBvcnRzLmJhcik7IC8vIENyb3NzIGluc3RhbmNlIGZ1
bmN0aW9uLgorICAgIHRhYmxlLnNldCgwLCBtYWtlSW5zdGFuY2UoKS5pbnN0YW5jZS5leHBvcnRz
LmJhcik7IC8vIENyb3NzIGluc3RhbmNlIGZ1bmN0aW9uLgogCiAgICAgZm9yIChsZXQgaSA9IDA7
IGkgPCAxMDAwOyBpKyspIHsKLSAgICAgICAgaWYgKGZvbygwLCBpKSAhPT0gaSArIDQyKQotICAg
ICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCYWQgY2FsbCBpbmRpcmVjdCIpOworICAgICAgICBh
c3NlcnQudGhyb3dzKCgpID0+IGZvbygwLCBpKSwgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yLCAi
Y2FsbF9pbmRpcmVjdCB0byBhIHNpZ25hdHVyZSB0aGF0IGRvZXMgbm90IG1hdGNoIik7CiAgICAg
fQogfQotKi8KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjA5ODg2KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDQ3IEBACisyMDE2LTEyLTE1ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgor
CisgICAgICAgIFdlYkFzc2VtYmx5OiBXYXNtQjNJUkdlbmVyYXRvciBzaG91bGQgdGhyb3cgZXhj
ZXB0aW9ucyBpbnN0ZWFkIG9mIGNyYXNoCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xNjU4MzQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGdlbmVyYWxpemVzIGhvdyB3ZSB0aHJvdyBleGNl
cHRpb25zIGluIHRoZSBXYXNtOjpCM0lSR2VuZXJhdG9yLgorICAgICAgICBUaGVyZSBhcmUgc3Rp
bGwgcGxhY2VzIHdoZXJlIHdlIG5lZWQgdG8gdGhyb3cgZXhjZXB0aW9ucyBhbmQgd2UgZG9uJ3Qs
IGJ1dAorICAgICAgICB0aGlzIHBhdGNoIHJlbW92ZXMgbW9zdCBvZiB0aG9zZSBwbGFjZXMgaW5z
aWRlIHRoZSBJUiBnZW5lcmF0b3IuIFRoZXJlIGFyZQorICAgICAgICBzdGlsbCBhIGZldyBwbGFj
ZXMgd2UgbmVlZCB0byB0aHJvdyBleGNlcHRpb25zIGluc2lkZSB0aGUgSVIgZ2VuZXJhdG9yLCBs
aWtlCisgICAgICAgIGRpdi9tb2QgYnkgMC4gVGhvc2Ugd2lsbCBiZSBkb25lIGluIGEgc2VwYXJh
dGUgcGF0Y2guIEFsc28sIHRoZXJlIGFyZQorICAgICAgICBzdGlsbCBzb21lIHN0dWJzIHdlIG5l
ZWQgdG8gdGhyb3cgZXhjZXB0aW9ucyBmcm9tOyB0aG9zZSB3aWxsIGFsc28gYmUKKyAgICAgICAg
ZG9uZSBpbiBhIHNlcGFyYXRlIHBhdGNoLgorCisgICAgICAgIFRoaXMgcGF0Y2ggYWxzbyByZWZh
Y3RvcnMgQjM6OkNvbXBpbGF0aW9uLiBCZWZvcmUsIEIzOjpDb21waWxhdGlvbihWTSwgUHJvY2Vk
dXJlKQorICAgICAgICBjb25zdHJ1Y3RvciB3b3VsZCBjb21waWxlIGEgQjMgZnVuY3Rpb24uIFRo
aXMgcGF0Y2ggbWFrZXMgQjM6OkNvbXBpbGF0aW9uIGEgc2ltcGxlIAorICAgICAgICB0dXBsZSB0
aGF0IGtlZXBzIHRoZSBuZWNlc3NhcnkgYml0cyBvZiBCMyBmdW5jdGlvbiBhbGl2ZSBpbiBvcmRl
ciB0byBiZSBydW5uYWJsZS4KKyAgICAgICAgVGhlcmUgaXMgYSBuZXcgZnVuY3Rpb24gdGhhdCBh
Y3R1YWxseSBkb2VzIHRoZSBjb21waWxhdGlvbiBmb3IgeW91LiBJdCBpczoKKyAgICAgICAgQ29t
cGlsYXRpb24gQjM6OmNvbXBpbGUoVk0mLCBQcm9jZWR1cmUmKQorICAgICAgICBUaGUgcmVhc29u
IGZvciB0aGlzIGNoYW5nZSBpcyB0aGF0IEknbSBub3cgdXNpbmcgQjM6OkNvbXBpbGF0aW9uKENv
ZGVSZWYsIE9wYXF1ZUJ5cHJvZHVjdHMpCisgICAgICAgIGNvbnN0cnVjdG9yIGluIFdhc20gY29k
ZS4gSXQgaXMgd2VpcmQgdG8gaGF2ZSBhIGNsYXNzIGJvdGggaGF2ZSBhCisgICAgICAgIGNvbnN0
cnVjdG9yIHRoYXQgaW5zdGFudGlhdGVzIHRoZSB0dXBsZSwgYW5kIGFub3RoZXIgdGhhdCBwZXJm
b3JtcyB0aGUKKyAgICAgICAgY29tcGlsYXRpb24gYW5kIHRoZW4gaW5zdGFudGlhdGVzIHRoZSB0
dXBsZS4gSXQncyBtb3JlIHN0cmFpZ2h0CisgICAgICAgIGZvcndhcmQgaWYgQ29tcGlsYXRpb24n
cyBqb2Igd2Fzbid0IHRvIGFjdHVhbGx5IGRvIHRoZSBjb21waWxhdGlvbgorICAgICAgICBidXQg
anVzdCB0byBob2xkIHRoZSBuZWNlc3NhcnkgYml0cyB0byBrZWVwIGEgY29tcGlsZWQgQjMgYWxp
dmUuCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGIzL0IzQ29tcGlsYXRpb24u
Y3BwOgorICAgICAgICAoSlNDOjpCMzo6Q29tcGlsYXRpb246OkNvbXBpbGF0aW9uKToKKyAgICAg
ICAgKiBiMy9CM0NvbXBpbGF0aW9uLmg6CisgICAgICAgICogYjMvQjNDb21waWxlLmNwcDogQWRk
ZWQuCisgICAgICAgIChKU0M6OkIzOjpjb21waWxlKToKKyAgICAgICAgKiBiMy9CM0NvbXBpbGUu
aDogQWRkZWQuCisgICAgICAgICogYjMvdGVzdGIzLmNwcDoKKyAgICAgICAgKEpTQzo6QjM6OmNv
bXBpbGUpOgorICAgICAgICAqIHdhc20vV2FzbUIzSVJHZW5lcmF0b3IuY3BwOgorICAgICAgICAo
SlNDOjpXYXNtOjpCM0lSR2VuZXJhdG9yOjpCM0lSR2VuZXJhdG9yKToKKyAgICAgICAgKEpTQzo6
V2FzbTo6QjNJUkdlbmVyYXRvcjo6ZW1pdEV4Y2VwdGlvbkNoZWNrKToKKyAgICAgICAgKEpTQzo6
V2FzbTo6QjNJUkdlbmVyYXRvcjo6ZW1pdEV4Y2VwdGlvbkhhbmRsZXIpOgorICAgICAgICAoSlND
OjpXYXNtOjpjcmVhdGVKU1RvV2FzbVdyYXBwZXIpOgorICAgICAgICAoSlNDOjpXYXNtOjpwYXJz
ZUFuZENvbXBpbGUpOgorCiAyMDE2LTEyLTE1ICBKRiBCYXN0aWVuICA8amZiYXN0aWVuQGFwcGxl
LmNvbT4KIAogICAgICAgICBXZWJBc3NlbWJseTogaW1wcm92ZSBjb21waWxhdGlvbiBlcnJvciBt
ZXNzYWdlcwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0Cj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DTWFrZUxpc3RzLnR4dAkocmV2aXNpb24g
MjA5ODg2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0CSh3b3JraW5n
IGNvcHkpCkBAIC0xMTYsNiArMTE2LDcgQEAgc2V0KEphdmFTY3JpcHRDb3JlX1NPVVJDRVMKICAg
ICBiMy9CM0NoZWNrVmFsdWUuY3BwCiAgICAgYjMvQjNDb21tb24uY3BwCiAgICAgYjMvQjNDb21t
dXRhdGl2aXR5LmNwcAorICAgIGIzL0IzQ29tcGlsZS5jcHAKICAgICBiMy9CM0NvbXBpbGF0aW9u
LmNwcAogICAgIGIzL0IzQ29uc3QzMlZhbHVlLmNwcAogICAgIGIzL0IzQ29uc3Q2NFZhbHVlLmNw
cApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFT
Y3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDIwOTg4NikKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0xNDA3LDExICsxNDA3LDEzIEBACiAJCTc5MDVCQjY5
MUQxMjA1MEUwMDE5RkU1NyAvKiBJbmxpbmVBY2Nlc3MuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5MDVCQjY3MUQxMjA1MEUwMDE5RkU1NyAvKiBJbmxp
bmVBY2Nlc3MuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9
OwogCQk3OTE2MERCRDFDOEUzRUM4MDA4QzA4NUEgLyogUHJveHlSZXZva2UuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzkxNjBEQkIxQzhFM0VDODAw
OEMwODVBIC8qIFByb3h5UmV2b2tlLmNwcCAqLzsgfTsKIAkJNzkxNjBEQkUxQzhFM0VDODAwOEMw
ODVBIC8qIFByb3h5UmV2b2tlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSA3OTE2MERCQzFDOEUzRUM4MDA4QzA4NUEgLyogUHJveHlSZXZva2UuaCAqLzsg
c2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OworCQk3OTE5Qjc4MDFF
MDM1NTlDMDA1QkVFRDggLyogQjNDb21waWxlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA3OTE5Qjc3RjFFMDM1NTlDMDA1QkVFRDggLyogQjNDb21waWxl
LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJNzky
MzNDMkIxRDM0NzE1NzAwQzVBODM0IC8qIEpJVE1hdGhJQy5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzkyMzNDMjkxRDM0NzE1NzAwQzVBODM0IC8qIEpJ
VE1hdGhJQy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07
CiAJCTc5MkNCMzQ5MUM0RUVENUMwMEQxM0FGMyAvKiBQQ1RvQ29kZU9yaWdpbk1hcC5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3OTJDQjM0NzFDNEVF
RDVDMDBEMTNBRjMgLyogUENUb0NvZGVPcmlnaW5NYXAuY3BwICovOyB9OwogCQk3OTJDQjM0QTFD
NEVFRDVDMDBEMTNBRjMgLyogUENUb0NvZGVPcmlnaW5NYXAuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5MkNCMzQ4MUM0RUVENUMwMEQxM0FGMyAvKiBQ
Q1RvQ29kZU9yaWdpbk1hcC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUs
ICk7IH07IH07CiAJCTc5NUIxOTk3MUQ3OEJFMzUwMDI2MkZBMCAvKiBNYXBCYXNlLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NUIxOTk1MUQ3OEJF
MzUwMDI2MkZBMCAvKiBNYXBCYXNlLmNwcCAqLzsgfTsKIAkJNzk1QjE5OTgxRDc4QkUzNTAwMjYy
RkEwIC8qIE1hcEJhc2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDc5NUIxOTk2MUQ3OEJFMzUwMDI2MkZBMCAvKiBNYXBCYXNlLmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKKwkJNzk1RjA5OUQxRTAzNjAwNTAw
QkJFMzdGIC8qIEIzQ29tcGlsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA3OTVGMDk5QzFFMDM2MDA1MDBCQkUzN0YgLyogQjNDb21waWxlLmNwcCAq
LzsgfTsKIAkJNzk2NDY1NkExQjk1MkZGMDAwMzA1OUVFIC8qIEdldFB1dEluZm8uaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc5NjQ2NTY4MUI5NTJGRjAw
MDMwNTlFRSAvKiBHZXRQdXRJbmZvLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJp
dmF0ZSwgKTsgfTsgfTsKIAkJNzk2RkI0M0ExREZGOEMzRjAwMzlDOTVEIC8qIEpTV2ViQXNzZW1i
bHlIZWxwZXJzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA3OTZGQjQzOTFERkY4QzNGMDAzOUM5NUQgLyogSlNXZWJBc3NlbWJseUhlbHBlcnMuaCAqLzsg
c2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk3OTdFMDdBOTFC
OEZDRkI5MDA4NDAwQkEgLyogSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzk3RTA3QTcxQjhGQ0ZCOTAw
ODQwMEJBIC8qIEpTR2xvYmFsTGV4aWNhbEVudmlyb25tZW50LmNwcCAqLzsgfTsKQEAgLTM4Mzcs
MTEgKzM4MzksMTMgQEAKIAkJNzkwNUJCNjcxRDEyMDUwRTAwMTlGRTU3IC8qIElubGluZUFjY2Vz
cy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBJbmxpbmVBY2Nlc3MuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNzkxNjBEQkIxQzhFM0VDODAwOEMwODVBIC8qIFBy
b3h5UmV2b2tlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFByb3h5
UmV2b2tlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNzkxNjBEQkMxQzhFM0VD
ODAwOEMwODVBIC8qIFByb3h5UmV2b2tlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IFByb3h5UmV2b2tlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTc5MTlCNzdG
MUUwMzU1OUMwMDVCRUVEOCAvKiBCM0NvbXBpbGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBuYW1lID0gQjNDb21waWxlLmg7IHBhdGggPSBiMy9CM0NvbXBpbGUuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJNzkyMzNDMjkxRDM0NzE1NzAwQzVBODM0IC8qIEpJVE1hdGhJQy5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBKSVRNYXRoSUMuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNzkyQ0IzNDcxQzRFRUQ1QzAwRDEzQUYzIC8qIFBDVG9Db2Rl
T3JpZ2luTWFwLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBDVG9D
b2RlT3JpZ2luTWFwLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNzkyQ0IzNDgx
QzRFRUQ1QzAwRDEzQUYzIC8qIFBDVG9Db2RlT3JpZ2luTWFwLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IFBDVG9Db2RlT3JpZ2luTWFwLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTc5NUIxOTk1MUQ3OEJFMzUwMDI2MkZBMCAvKiBNYXBCYXNlLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IE1hcEJhc2UuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQk3OTVCMTk5NjFENzhCRTM1MDAyNjJGQTAgLyogTWFwQmFzZS5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBNYXBCYXNlLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCTc5NUYwOTlDMUUwMzYwMDUwMEJCRTM3RiAvKiBCM0NvbXBpbGUuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gQjNDb21waWxlLmNwcDsgcGF0
aCA9IGIzL0IzQ29tcGlsZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc5NjQ2
NTY4MUI5NTJGRjAwMDMwNTlFRSAvKiBHZXRQdXRJbmZvLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IEdldFB1dEluZm8uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
Nzk2RkI0MzkxREZGOEMzRjAwMzlDOTVEIC8qIEpTV2ViQXNzZW1ibHlIZWxwZXJzLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEpTV2ViQXNzZW1ibHlIZWxwZXJzLmg7IHBhdGgg
PSBqcy9KU1dlYkFzc2VtYmx5SGVscGVycy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQk3OTdFMDdBNzFCOEZDRkI5MDA4NDAwQkEgLyogSlNHbG9iYWxMZXhpY2FsRW52aXJvbm1lbnQu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNHbG9iYWxMZXhpY2Fs
RW52aXJvbm1lbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNTE4Miw2ICs1
MTg2LDggQEAKIAkJCQkwRkVDODRDMDFCREFDREFDMDA4MEZGNzQgLyogQjNDb21tb24uaCAqLywK
IAkJCQkwRkVDODRDMTFCREFDREFDMDA4MEZGNzQgLyogQjNDb21tdXRhdGl2aXR5LmNwcCAqLywK
IAkJCQkwRkVDODRDMjFCREFDREFDMDA4MEZGNzQgLyogQjNDb21tdXRhdGl2aXR5LmggKi8sCisJ
CQkJNzkxOUI3N0YxRTAzNTU5QzAwNUJFRUQ4IC8qIEIzQ29tcGlsZS5oICovLAorCQkJCTc5NUYw
OTlDMUUwMzYwMDUwMEJCRTM3RiAvKiBCM0NvbXBpbGUuY3BwICovLAogCQkJCTBGMzM4REZGMUJG
MDI3NkMwMDEzQzg4RiAvKiBCM0NvbXBpbGF0aW9uLmNwcCAqLywKIAkJCQkwRjMzOEUwMDFCRjAy
NzZDMDAxM0M4OEYgLyogQjNDb21waWxhdGlvbi5oICovLAogCQkJCTBGODZBRTFGMUM1MzExQzUw
MDZCRThFQyAvKiBCM0NvbXB1dGVEaXZpc2lvbk1hZ2ljLmggKi8sCkBAIC04Mjk4LDYgKzgzMDQs
NyBAQAogCQkJCTUyQjMxMEZCMTk3NEFFNjEwMDgwODU3QyAvKiBGdW5jdGlvbkhhc0V4ZWN1dGVk
Q2FjaGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUZFNEJGRjJDMUFENDc2RTcwMDA4OEY4NyAvKiBG
dW5jdGlvbk92ZXJyaWRlcy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkMxOEM0MDUwRTE2RjVDRDAw
QjM0NDYwIC8qIEZ1bmN0aW9uUHJvdG90eXBlLmggaW4gSGVhZGVycyAqLywKKwkJCQk3OTE5Qjc4
MDFFMDM1NTlDMDA1QkVFRDggLyogQjNDb21waWxlLmggaW4gSGVhZGVycyAqLywKIAkJCQk2MkQy
RDM5MDFBREYxMDNGMDAwMjA2QzEgLyogRnVuY3Rpb25SYXJlRGF0YS5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJMkFBQ0U2M0QxOENBNUEwMzAwRUQwMTkxIC8qIEdDQWN0aXZpdHlDYWxsYmFjay5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJRkUzNDIyMTIxRDZCODFDMzAwMzJCRTg4IC8qIFRocm93U2NvcGUu
aCBpbiBIZWFkZXJzICovLApAQCAtOTgyMyw2ICs5ODMwLDcgQEAKIAkJCQkwRjNBMUJGOTFBOUVD
QjdEMDAwREUwMUEgLyogREZHUHV0U3RhY2tTaW5raW5nUGhhc2UuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJQUQyRkNCRUExREI1OERBRDAwQjNFNzM2IC8qIEpTV2ViQXNzZW1ibHlUYWJsZS5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQkwRjJGQ0NGQjE4QTYwMDcwMDAxQTI3RjggLyogREZHU2FmZXBv
aW50LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTc5NUYwOTlEMUUwMzYwMDUwMEJCRTM3RiAvKiBC
M0NvbXBpbGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJODZFQzlERDIxMzI4REY4MjAwMkIyQUQ3
IC8qIERGR1NwZWN1bGF0aXZlSklULmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2ODgwRjFGMTQz
MjhCQjkwMEIwOEQ0MiAvKiBERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTg2ODgwRjREMTQzNTNCMjEwMEIwOEQ0MiAvKiBERkdTcGVjdWxhdGl2ZUpJVDY0LmNw
cCBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29tcGls
YXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbXBp
bGF0aW9uLmNwcAkocmV2aXNpb24gMjA5ODg2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Iz
L0IzQ29tcGlsYXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCwzNiArMjgsMjMgQEAKIAog
I2lmIEVOQUJMRShCM19KSVQpCiAKLSNpbmNsdWRlICJCM0dlbmVyYXRlLmgiCiAjaW5jbHVkZSAi
QjNPcGFxdWVCeXByb2R1Y3RzLmgiCi0jaW5jbHVkZSAiQjNQcm9jZWR1cmUuaCIKLSNpbmNsdWRl
ICJCM1RpbWluZ1Njb3BlLmgiCiAjaW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCi0jaW5jbHVkZSAi
SlNDSW5saW5lcy5oIgotI2luY2x1ZGUgIkxpbmtCdWZmZXIuaCIKIAogbmFtZXNwYWNlIEpTQyB7
IG5hbWVzcGFjZSBCMyB7CiAKLUNvbXBpbGF0aW9uOjpDb21waWxhdGlvbihWTSYgdm0sIFByb2Nl
ZHVyZSYgcHJvYywgdW5zaWduZWQgb3B0TGV2ZWwpCi17Ci0gICAgVGltaW5nU2NvcGUgdGltaW5n
U2NvcGUoIkNvbXBpbGF0aW9uIik7Ci0gICAgCi0gICAgcHJlcGFyZUZvckdlbmVyYXRpb24ocHJv
Yywgb3B0TGV2ZWwpOwotICAgIAotICAgIENDYWxsSGVscGVycyBqaXQoJnZtKTsKLSAgICBnZW5l
cmF0ZShwcm9jLCBqaXQpOwotICAgIExpbmtCdWZmZXIgbGlua0J1ZmZlcih2bSwgaml0LCBudWxs
cHRyKTsKLQotICAgIG1fY29kZVJlZiA9IEZJTkFMSVpFX0NPREUobGlua0J1ZmZlciwgKCJCMzo6
Q29tcGlsYXRpb24iKSk7Ci0gICAgbV9ieXByb2R1Y3RzID0gcHJvYy5yZWxlYXNlQnlwcm9kdWN0
cygpOwotfQotCiBDb21waWxhdGlvbjo6Q29tcGlsYXRpb24oTWFjcm9Bc3NlbWJsZXJDb2RlUmVm
IGNvZGVSZWYsIHN0ZDo6dW5pcXVlX3B0cjxPcGFxdWVCeXByb2R1Y3RzPiBieXByb2R1Y3RzKQog
ICAgIDogbV9jb2RlUmVmKGNvZGVSZWYpCiAgICAgLCBtX2J5cHJvZHVjdHMoV1RGTW92ZShieXBy
b2R1Y3RzKSkKIHsKIH0KIAorQ29tcGlsYXRpb246OkNvbXBpbGF0aW9uKENvbXBpbGF0aW9uJiYg
b3RoZXIpCisgICAgOiBtX2NvZGVSZWYoV1RGTW92ZShvdGhlci5tX2NvZGVSZWYpKQorICAgICwg
bV9ieXByb2R1Y3RzKFdURk1vdmUob3RoZXIubV9ieXByb2R1Y3RzKSkKK3sKK30KKwogQ29tcGls
YXRpb246On5Db21waWxhdGlvbigpCiB7CiB9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
YjMvQjNDb21waWxhdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9CM0NvbXBpbGF0aW9uLmgJKHJldmlzaW9uIDIwOTg4NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy9CM0NvbXBpbGF0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTQwLDI1ICs0MCwxNiBA
QCBuYW1lc3BhY2UgQjMgewogY2xhc3MgT3BhcXVlQnlwcm9kdWN0czsKIGNsYXNzIFByb2NlZHVy
ZTsKIAotLy8gVGhpcyBpcyBhIGZvb2wtcHJvb2YgQVBJIGZvciBjb21waWxpbmcgYSBQcm9jZWR1
cmUgdG8gY29kZSBhbmQgdGhlbiBydW5uaW5nIHRoYXQgY29kZS4gWW91IGNvbXBpbGUKLS8vIGEg
UHJvY2VkdXJlIHVzaW5nIHRoaXMgQVBJIGJ5IGRvaW5nOgotLy8KLS8vIHN0ZDo6dW5pcXVlX3B0
cjxDb21waWxhdGlvbj4gY29tcGlsYXRpb24gPSBzdGQ6Om1ha2VfdW5pcXVlPENvbXBpbGF0aW9u
Pih2bSwgcHJvYyk7Ci0vLwotLy8gVGhlbiB5b3Uga2VlcCB0aGUgQ29tcGlsYXRpb24gb2JqZWN0
IGFsaXZlIGZvciBhcyBsb25nIGFzIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcnVuIHRoZSBjb2Rl
LiBJZgotLy8gdGhpcyBBUEkgZmVlbHMgdG9vIGhpZ2gtbGV2ZWwsIHlvdSBjYW4gdXNlIEIzOjpn
ZW5lcmF0ZSgpIGRpcmVjdGx5LgorLy8gVGhpcyBjbGFzcyBpcyBhIHdheSB0byBrZWVwIHRoZSBy
ZXN1bHQgb2YgYSBCMyBjb21waWxhdGlvbiBhbGl2ZQorLy8gYW5kIHJ1bm5hYmxlLgogCiBjbGFz
cyBDb21waWxhdGlvbiB7CiAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ29tcGlsYXRpb24pOwog
ICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogCiBwdWJsaWM6Ci0gICAgSlNfRVhQT1JUX1BS
SVZBVEUgQ29tcGlsYXRpb24oVk0mLCBQcm9jZWR1cmUmLCB1bnNpZ25lZCBvcHRMZXZlbCA9IDEp
OwotCi0gICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgeW91IHRvIG1hbnVhbGx5IGNyZWF0
ZSBhIENvbXBpbGF0aW9uLiBJdCdzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGVzdAotICAgIC8v
IGNvZGUuIFByb2JhYmx5IGJlc3QgdG8ga2VlcCBpdCB0aGF0IHdheS4KICAgICBKU19FWFBPUlRf
UFJJVkFURSBDb21waWxhdGlvbihNYWNyb0Fzc2VtYmxlckNvZGVSZWYsIHN0ZDo6dW5pcXVlX3B0
cjxPcGFxdWVCeXByb2R1Y3RzPik7Ci0gICAgCisgICAgSlNfRVhQT1JUX1BSSVZBVEUgQ29tcGls
YXRpb24oQ29tcGlsYXRpb24mJik7CiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgfkNvbXBpbGF0aW9u
KCk7CiAKICAgICBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgY29kZSgpIGNvbnN0IHsgcmV0dXJuIG1f
Y29kZVJlZi5jb2RlKCk7IH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbXBp
bGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbXBpbGUu
Y3BwCShub25leGlzdGVudCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbXBpbGUu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTYgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkIzQ29tcGlsZS5oIgorCisjaWYgRU5BQkxFKEIzX0pJVCkKKworI2luY2x1ZGUgIkIzR2VuZXJh
dGUuaCIKKyNpbmNsdWRlICJCM09wYXF1ZUJ5cHJvZHVjdHMuaCIKKyNpbmNsdWRlICJCM1Byb2Nl
ZHVyZS5oIgorI2luY2x1ZGUgIkIzVGltaW5nU2NvcGUuaCIKKyNpbmNsdWRlICJDQ2FsbEhlbHBl
cnMuaCIKKyNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCisjaW5jbHVkZSAiTGlua0J1ZmZlci5oIgor
CituYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsKKworQ29tcGlsYXRpb24gY29tcGlsZShW
TSYgdm0sIFByb2NlZHVyZSYgcHJvYywgdW5zaWduZWQgb3B0TGV2ZWwpCit7CisgICAgVGltaW5n
U2NvcGUgdGltaW5nU2NvcGUoIkNvbXBpbGF0aW9uIik7CisgICAgCisgICAgcHJlcGFyZUZvckdl
bmVyYXRpb24ocHJvYywgb3B0TGV2ZWwpOworICAgIAorICAgIENDYWxsSGVscGVycyBqaXQoJnZt
KTsKKyAgICBnZW5lcmF0ZShwcm9jLCBqaXQpOworICAgIExpbmtCdWZmZXIgbGlua0J1ZmZlcih2
bSwgaml0LCBudWxscHRyKTsKKworICAgIHJldHVybiBDb21waWxhdGlvbihGSU5BTElaRV9DT0RF
KGxpbmtCdWZmZXIsICgiQjM6OkNvbXBpbGF0aW9uIikpLCBwcm9jLnJlbGVhc2VCeXByb2R1Y3Rz
KCkpOworfQorCit9IH0gLy8gbmFtZXNwYWNlIEpTQzo6QjMKKworI2VuZGlmIC8vIEVOQUJMRShC
M19KSVQpCisKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9CM0NvbXBpbGUuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvQjNDb21waWxlLmgJKG5vbmV4aXN0
ZW50KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL0IzQ29tcGlsZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBFTkFCTEUoQjNfSklUKQorCisjaW5jbHVk
ZSAiQjNDb21waWxhdGlvbi5oIgorCituYW1lc3BhY2UgSlNDIHsKKworY2xhc3MgVk07CisKK25h
bWVzcGFjZSBCMyB7CisKK2NsYXNzIFByb2NlZHVyZTsKKworLy8gVGhpcyBpcyBhIGZvb2wtcHJv
b2YgQVBJIGZvciBjb21waWxpbmcgYSBQcm9jZWR1cmUgdG8gY29kZSBhbmQgdGhlbiBydW5uaW5n
IHRoYXQgY29kZS4gWW91IGNvbXBpbGUKKy8vIGEgUHJvY2VkdXJlIHVzaW5nIHRoaXMgQVBJIGJ5
IGRvaW5nOgorLy8KKy8vIENvbXBpbGF0aW9uIGNvbXBpbGF0aW9uID0gQjM6OmNvbXBpbGUodm0s
IHByb2MpOworLy8KKy8vIFRoZW4geW91IGtlZXAgdGhlIENvbXBpbGF0aW9uIG9iamVjdCBhbGl2
ZSBmb3IgYXMgbG9uZyBhcyB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJ1biB0aGUgY29kZS4KKy8v
IElmIHRoaXMgQVBJIGZlZWxzIHRvbyBoaWdoLWxldmVsLCB5b3UgY2FuIHVzZSBCMzo6Z2VuZXJh
dGUoKSBkaXJlY3RseS4KKworSlNfRVhQT1JUX1BSSVZBVEUgQ29tcGlsYXRpb24gY29tcGlsZShW
TSYsIFByb2NlZHVyZSYsIHVuc2lnbmVkIG9wdExldmVsID0gMSk7CisKK30gfSAvLyBuYW1lc3Bh
Y2UgSlNDOjpCMworCisjZW5kaWYgLy8gRU5BQkxFKEIzX0pJVCkKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9iMy90ZXN0YjMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9iMy90ZXN0YjMuY3BwCShyZXZpc2lvbiAyMDk4ODYpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvYjMvdGVzdGIzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzMsNiArMzMsNyBAQAogI2lu
Y2x1ZGUgIkIzQmFzaWNCbG9ja0lubGluZXMuaCIKICNpbmNsdWRlICJCM0NDYWxsVmFsdWUuaCIK
ICNpbmNsdWRlICJCM0NvbXBpbGF0aW9uLmgiCisjaW5jbHVkZSAiQjNDb21waWxlLmgiCiAjaW5j
bHVkZSAiQjNDb21wdXRlRGl2aXNpb25NYWdpYy5oIgogI2luY2x1ZGUgIkIzQ29uc3QzMlZhbHVl
LmgiCiAjaW5jbHVkZSAiQjNDb25zdFB0clZhbHVlLmgiCkBAIC0xMTgsNyArMTE5LDcgQEAgVk0q
IHZtOwogCiBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsYXRpb24+IGNvbXBpbGUoUHJvY2VkdXJlJiBw
cm9jZWR1cmUsIHVuc2lnbmVkIG9wdExldmVsID0gMSkKIHsKLSAgICByZXR1cm4gc3RkOjptYWtl
X3VuaXF1ZTxDb21waWxhdGlvbj4oKnZtLCBwcm9jZWR1cmUsIG9wdExldmVsKTsKKyAgICByZXR1
cm4gc3RkOjptYWtlX3VuaXF1ZTxDb21waWxhdGlvbj4oQjM6OmNvbXBpbGUoKnZtLCBwcm9jZWR1
cmUsIG9wdExldmVsKSk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFy
Z3VtZW50cz4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL0pTV2ViQXNzZW1ibHku
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL0pTV2ViQXNzZW1i
bHkuY3BwCShyZXZpc2lvbiAyMDk4ODYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9K
U1dlYkFzc2VtYmx5LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsMTMgKzI4LDQ1IEBACiAKICNp
ZiBFTkFCTEUoV0VCQVNTRU1CTFkpCiAKKyNpbmNsdWRlICJFeGNlcHRpb24uaCIKICNpbmNsdWRl
ICJGdW5jdGlvblByb3RvdHlwZS5oIgogI2luY2x1ZGUgIkpTQ0lubGluZXMuaCIKKyNpbmNsdWRl
ICJKU1Byb21pc2VEZWZlcnJlZC5oIgorI2luY2x1ZGUgIldlYkFzc2VtYmx5TW9kdWxlQ29uc3Ry
dWN0b3IuaCIKIAogbmFtZXNwYWNlIEpTQyB7CiAKIFNUQVRJQ19BU1NFUlRfSVNfVFJJVklBTExZ
X0RFU1RSVUNUSUJMRShKU1dlYkFzc2VtYmx5KTsKIAorRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCB3ZWJBc3NlbWJseVZhbGlkYXRlRnVuYyhFeGVjU3RhdGUqKTsKK0VuY29kZWRKU1ZhbHVl
IEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlDb21waWxlRnVuYyhFeGVjU3RhdGUqKTsKKworRW5j
b2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCB3ZWJBc3NlbWJseUNvbXBpbGVGdW5jKEV4ZWNTdGF0
ZSogZXhlYykKK3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIGF1dG8gY2F0Y2hTY29w
ZSA9IERFQ0xBUkVfQ0FUQ0hfU0NPUEUodm0pOworCisgICAgSlNQcm9taXNlRGVmZXJyZWQqIHBy
b21pc2UgPSAgSlNQcm9taXNlRGVmZXJyZWQ6OmNyZWF0ZShleGVjLCBleGVjLT5sZXhpY2FsR2xv
YmFsT2JqZWN0KCkpOworICAgIFJFVFVSTl9JRl9FWENFUFRJT04oY2F0Y2hTY29wZSwgeyB9KTsK
KworICAgIEpTVmFsdWUgbW9kdWxlID0gV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvcjo6Y3Jl
YXRlTW9kdWxlKGV4ZWMpOworICAgIGlmIChFeGNlcHRpb24qIGV4Y2VwdGlvbiA9IGNhdGNoU2Nv
cGUuZXhjZXB0aW9uKCkpIHsKKyAgICAgICAgY2F0Y2hTY29wZS5jbGVhckV4Y2VwdGlvbigpOwor
ICAgICAgICBwcm9taXNlLT5yZWplY3QoZXhlYywgZXhjZXB0aW9uKTsKKyAgICAgICAgZGF0YUxv
Z0xuKCJzYWFtIHJlamVjdGluZyEhIik7CisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUo
cHJvbWlzZS0+cHJvbWlzZSgpKTsKKyAgICB9CisKKyAgICBkYXRhTG9nTG4oInNhYW0gcmVzb2x2
aW5nISEhISEhIik7CisgICAgcHJvbWlzZS0+cmVzb2x2ZShleGVjLCBtb2R1bGUpOworICAgIHJl
dHVybiBKU1ZhbHVlOjplbmNvZGUocHJvbWlzZS0+cHJvbWlzZSgpKTsKK30KKworRW5jb2RlZEpT
VmFsdWUgSlNDX0hPU1RfQ0FMTCB3ZWJBc3NlbWJseVZhbGlkYXRlRnVuYyhFeGVjU3RhdGUqKQor
eworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNCb29sZWFuKHRydWUpKTsKK30KKwogY29u
c3QgQ2xhc3NJbmZvIEpTV2ViQXNzZW1ibHk6OnNfaW5mbyA9IHsgIldlYkFzc2VtYmx5IiwgJkJh
c2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShKU1dlYkFzc2VtYmx5KSB9OwogCiBK
U1dlYkFzc2VtYmx5KiBKU1dlYkFzc2VtYmx5OjpjcmVhdGUoVk0mIHZtLCBKU0dsb2JhbE9iamVj
dCogZ2xvYmFsT2JqZWN0LCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSkKQEAgLTQ5LDEwICs4MSwxMiBA
QCBTdHJ1Y3R1cmUqIEpTV2ViQXNzZW1ibHk6OmNyZWF0ZVN0cnVjdHVyCiAgICAgcmV0dXJuIFN0
cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvdHlwZSwgVHlwZUluZm8oT2Jq
ZWN0VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwogfQogCi12b2lkIEpTV2ViQXNzZW1i
bHk6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgSlNHbG9iYWxPYmplY3QqKQordm9pZCBKU1dlYkFz
c2VtYmx5OjpmaW5pc2hDcmVhdGlvbihWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmpl
Y3QpCiB7CiAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOwogICAgIEFTU0VSVChpbmhlcml0
cyhpbmZvKCkpKTsKKyAgICBKU0NfTkFUSVZFX0ZVTkNUSU9OX1dJVEhPVVRfVFJBTlNJVElPTigi
dmFsaWRhdGUiLCB3ZWJBc3NlbWJseVZhbGlkYXRlRnVuYywgRG9udEVudW0sIDEpOworICAgIEpT
Q19OQVRJVkVfRlVOQ1RJT05fV0lUSE9VVF9UUkFOU0lUSU9OKCJjb21waWxlIiwgd2ViQXNzZW1i
bHlDb21waWxlRnVuYywgRG9udEVudW0sIDEpOwogfQogCiBKU1dlYkFzc2VtYmx5OjpKU1dlYkFz
c2VtYmx5KFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUpCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJHZW5lcmF0b3IuY3BwCShyZXZpc2lvbiAyMDk4
ODYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTMwLDggKzMwLDEwIEBACiAKICNpbmNsdWRlICJCM0Jhc2ljQmxv
Y2tJbmxpbmVzLmgiCiAjaW5jbHVkZSAiQjNDQ2FsbFZhbHVlLmgiCisjaW5jbHVkZSAiQjNDb21w
aWxlLmgiCiAjaW5jbHVkZSAiQjNDb25zdFB0clZhbHVlLmgiCiAjaW5jbHVkZSAiQjNGaXhTU0Eu
aCIKKyNpbmNsdWRlICJCM0dlbmVyYXRlLmgiCiAjaW5jbHVkZSAiQjNTdGFja21hcEdlbmVyYXRp
b25QYXJhbXMuaCIKICNpbmNsdWRlICJCM1N3aXRjaFZhbHVlLmgiCiAjaW5jbHVkZSAiQjNWYWxp
ZGF0ZS5oIgpAQCAtNjcsNiArNjksMTMgQEAgbmFtZXNwYWNlIHsKIGNvbnN0IGJvb2wgdmVyYm9z
ZSA9IGZhbHNlOwogfQogCisjZGVmaW5lIEZPUl9FQUNIX0VYQ0VQVElPTihtYWNybykgXAorICAg
IG1hY3JvKE91dE9mQm91bmRzTWVtb3J5QWNjZXNzLCAgIk91dCBvZiBib3VuZHMgbWVtb3J5IGFj
Y2VzcyIpIFwKKyAgICBtYWNybyhPdXRPZkJvdW5kc0NhbGxJbmRpcmVjdCwgIk91dCBvZiBib3Vu
ZHMgY2FsbF9pbmRpcmVjdCIpIFwKKyAgICBtYWNybyhOdWxsVGFibGVFbnRyeSwgICJjYWxsX2lu
ZGlyZWN0IHRvIGEgbnVsbCB0YWJsZSBlbnRyeSIpIFwKKyAgICBtYWNybyhCYWRTaWduYXR1cmUs
ICJjYWxsX2luZGlyZWN0IHRvIGEgc2lnbmF0dXJlIHRoYXQgZG9lcyBub3QgbWF0Y2giKSBcCisg
ICAgbWFjcm8oT3V0T2ZCb3VuZHNUcnVuYywgIk91dCBvZiBib3VuZHMgVHJ1bmMgb3BlcmF0aW9u
IikgXAorCiBjbGFzcyBCM0lSR2VuZXJhdG9yIHsKIHB1YmxpYzoKICAgICBzdHJ1Y3QgQ29udHJv
bERhdGEgewpAQCAtMTk3LDYgKzIwNiwxNSBAQCBwdWJsaWM6CiAKICAgICB2b2lkIGR1bXAoY29u
c3QgVmVjdG9yPENvbnRyb2xFbnRyeT4mIGNvbnRyb2xTdGFjaywgY29uc3QgRXhwcmVzc2lvbkxp
c3QmIGV4cHJlc3Npb25TdGFjayk7CiAKKyAgICBlbnVtIGNsYXNzIEV4Y2VwdGlvblR5cGUgOiB1
aW50MzJfdCB7CisjZGVmaW5lIE1BS0VfRU5VTShlbnVtTmFtZSwgZXJyb3IpIGVudW1OYW1lLAor
ICAgIEZPUl9FQUNIX0VYQ0VQVElPTihNQUtFX0VOVU0pCisjdW5kZWYgTUFLRV9FTlVNCisgICAg
fTsKKworICAgIHZvaWQgZW1pdEV4Y2VwdGlvbkNoZWNrKENDYWxsSGVscGVycyYsIEV4Y2VwdGlv
blR5cGUpOworICAgIHZvaWQgZW1pdEV4Y2VwdGlvbkhhbmRsZXIoQ0NhbGxIZWxwZXJzJik7CisK
IHByaXZhdGU6CiAgICAgRXhwcmVzc2lvblR5cGUgZW1pdENoZWNrQW5kUHJlcGFyZVBvaW50ZXIo
RXhwcmVzc2lvblR5cGUgcG9pbnRlciwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplT2ZP
cCk7CiAgICAgRXhwcmVzc2lvblR5cGUgZW1pdExvYWRPcChMb2FkT3BUeXBlLCBPcmlnaW4sIEV4
cHJlc3Npb25UeXBlIHBvaW50ZXIsIHVpbnQzMl90IG9mZnNldCk7CkBAIC0yMTgsNiArMjM2LDcg
QEAgcHJpdmF0ZToKICAgICBWYWx1ZSogbV96ZXJvVmFsdWVzW251bVR5cGVzXTsKICAgICBWYWx1
ZSogbV9pbnN0YW5jZVZhbHVlOwogCisgICAgQ0NhbGxIZWxwZXJzOjpMYWJlbCBtX2V4Y2VwdGlv
bkhhbmRsZXI7CiB9OwogCiBCM0lSR2VuZXJhdG9yOjpCM0lSR2VuZXJhdG9yKFZNJiB2bSwgY29u
c3QgTW9kdWxlSW5mb3JtYXRpb24mIGluZm8sIFByb2NlZHVyZSYgcHJvY2VkdXJlLCBXYXNtSW50
ZXJuYWxGdW5jdGlvbiogY29tcGlsYXRpb24sIFZlY3RvcjxVbmxpbmtlZFdhc21Ub1dhc21DYWxs
PiYgdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIGNvbnN0IEltbXV0YWJsZUZ1bmN0aW9uSW5kZXhT
cGFjZSYgZnVuY3Rpb25JbmRleFNwYWNlKQpAQCAtMjU0LDMzICsyNzMsNyBAQCBCM0lSR2VuZXJh
dG9yOjpCM0lSR2VuZXJhdG9yKFZNJiB2bSwgY29uCiAgICAgICAgIG1fcHJvYy5zZXRXYXNtQm91
bmRzQ2hlY2tHZW5lcmF0b3IoWz1dIChDQ2FsbEhlbHBlcnMmIGppdCwgR1BSUmVnIHBpbm5lZEdQ
UiwgdW5zaWduZWQpIHsKICAgICAgICAgICAgIEFsbG93TWFjcm9TY3JhdGNoUmVnaXN0ZXJVc2Fn
ZSBhbGxvd1NjcmF0Y2goaml0KTsKICAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQocGlubmVkR1BS
LCBtX21lbW9yeVNpemVHUFIgPT0gcGlubmVkR1BSKTsKLSAgICAgICAgICAgIGppdC5jb3B5Q2Fs
bGVlU2F2ZXNUb1ZNRW50cnlGcmFtZUNhbGxlZVNhdmVzQnVmZmVyKCk7Ci0KLSAgICAgICAgICAg
IGppdC5tb3ZlKEdQUkluZm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBHUFJJbmZvOjphcmd1bWVudEdQ
UjApOwotCi0gICAgICAgICAgICBDQ2FsbEhlbHBlcnM6OkNhbGwgY2FsbCA9IGppdC5jYWxsKCk7
Ci0gICAgICAgICAgICBqaXQuanVtcFRvRXhjZXB0aW9uSGFuZGxlcigpOwotCi0gICAgICAgICAg
ICBqaXQuYWRkTGlua1Rhc2soWz1dIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVyKSB7Ci0gICAgICAg
ICAgICAgICAgdm9pZCAoKnRocm93TWVtb3J5RXhjZXB0aW9uKShFeGVjU3RhdGUqKSA9IFtdIChF
eGVjU3RhdGUqIGV4ZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgVk0qIHZtID0gJmV4ZWMtPnZt
KCk7Ci0gICAgICAgICAgICAgICAgICAgIE5hdGl2ZUNhbGxGcmFtZVRyYWNlciB0cmFjZXIodm0s
IGV4ZWMpOwotCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGF1dG8gdGhyb3dTY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUoKnZtKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QgPSB2bS0+dG9wSlNXZWJB
c3NlbWJseUluc3RhbmNlLT5nbG9iYWxPYmplY3QoKTsKLQotICAgICAgICAgICAgICAgICAgICAg
ICAgSlNXZWJBc3NlbWJseVJ1bnRpbWVFcnJvciogZXJyb3IgPSBKU1dlYkFzc2VtYmx5UnVudGlt
ZUVycm9yOjpjcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlYywgZ2xvYmFs
T2JqZWN0LT5XZWJBc3NlbWJseVJ1bnRpbWVFcnJvclN0cnVjdHVyZSgpLCAiT3V0IG9mIGJvdW5k
cyBtZW1vcnkgYWNjZXNzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlv
bihleGVjLCB0aHJvd1Njb3BlLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgICAgICAgICBnZW5lcmljVW53aW5kKHZtLCBleGVjKTsKLSAgICAgICAgICAgICAg
ICAgICAgQVNTRVJUKCEhdm0tPmNhbGxGcmFtZUZvckNhdGNoKTsKLSAgICAgICAgICAgICAgICB9
OwotCi0gICAgICAgICAgICAgICAgbGlua0J1ZmZlci5saW5rKGNhbGwsIHRocm93TWVtb3J5RXhj
ZXB0aW9uKTsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdGhpcy0+ZW1pdEV4Y2VwdGlv
bkNoZWNrKGppdCwgRXhjZXB0aW9uVHlwZTo6T3V0T2ZCb3VuZHNNZW1vcnlBY2Nlc3MpOwogICAg
ICAgICB9KTsKIAogICAgICAgICBCMzo6UGF0Y2hwb2ludFZhbHVlKiBmb28gPSBtX2N1cnJlbnRC
bG9jay0+YXBwZW5kTmV3PEIzOjpQYXRjaHBvaW50VmFsdWU+KG1fcHJvYywgQjM6OlZvaWQsIE9y
aWdpbigpKTsKQEAgLTI5Niw2ICsyODksNjMgQEAgQjNJUkdlbmVyYXRvcjo6QjNJUkdlbmVyYXRv
cihWTSYgdm0sIGNvbgogICAgICAgICBtX2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3PENvbnN0UHRy
VmFsdWU+KG1fcHJvYywgT3JpZ2luKCksICZtX3ZtLnRvcEpTV2ViQXNzZW1ibHlJbnN0YW5jZSkp
OwogfQogCit2b2lkIEIzSVJHZW5lcmF0b3I6OmVtaXRFeGNlcHRpb25DaGVjayhDQ2FsbEhlbHBl
cnMmIGppdCwgRXhjZXB0aW9uVHlwZSB0eXBlKQoreworICAgIGppdC5tb3ZlKENDYWxsSGVscGVy
czo6VHJ1c3RlZEltbTMyKHN0YXRpY19jYXN0PHVpbnQzMl90Pih0eXBlKSksIEdQUkluZm86OmFy
Z3VtZW50R1BSMSk7CisgICAgYXV0byBqdW1wID0gaml0Lmp1bXAoKTsKKyAgICBqaXQuYWRkTGlu
a1Rhc2soWz1dIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVyKSB7CisgICAgICAgIEFTU0VSVCh0aGlz
LT5tX2V4Y2VwdGlvbkhhbmRsZXIuaXNTZXQoKSk7CisgICAgICAgIGxpbmtCdWZmZXIubGluayhq
dW1wLCBsaW5rQnVmZmVyLmxvY2F0aW9uT2YodGhpcy0+bV9leGNlcHRpb25IYW5kbGVyKSk7Cisg
ICAgfSk7Cit9CisKK3ZvaWQgQjNJUkdlbmVyYXRvcjo6ZW1pdEV4Y2VwdGlvbkhhbmRsZXIoQ0Nh
bGxIZWxwZXJzJiBqaXQpCit7CisgICAgbV9leGNlcHRpb25IYW5kbGVyID0gaml0LmxhYmVsKCk7
CisKKyAgICB7CisgICAgICAgIFJlZ2lzdGVyU2V0IHVzZWRSZWdpc3RlcnMgPSBSZWdpc3RlclNl
dDo6c3R1YlVuYXZhaWxhYmxlUmVnaXN0ZXJzKCk7CisgICAgICAgIC8vIFRoZSB0aGluZyB0aGF0
IGp1bXBzIGhlcmUgd2lsbCBtb3ZlIEV4Y2VwdGlvblR5cGUgaW50byB0aGUgYXJndW1lbnRHUFIx
IGFuZCBqdW1wIGhlcmUuCisgICAgICAgIHVzZWRSZWdpc3RlcnMuc2V0KEdQUkluZm86OmFyZ3Vt
ZW50R1BSMSk7CisgICAgICAgIGppdC5jb3B5Q2FsbGVlU2F2ZXNUb1ZNRW50cnlGcmFtZUNhbGxl
ZVNhdmVzQnVmZmVyKHVzZWRSZWdpc3RlcnMpOworICAgIH0KKworICAgIGppdC5tb3ZlKEdQUklu
Zm86OmNhbGxGcmFtZVJlZ2lzdGVyLCBHUFJJbmZvOjphcmd1bWVudEdQUjApOworICAgIENDYWxs
SGVscGVyczo6Q2FsbCBjYWxsID0gaml0LmNhbGwoKTsKKyAgICBqaXQuanVtcFRvRXhjZXB0aW9u
SGFuZGxlcigpOworCisgICAgaml0LmFkZExpbmtUYXNrKFs9XSAoTGlua0J1ZmZlciYgbGlua0J1
ZmZlcikgeworICAgICAgICB2b2lkICgqdGhyb3dNZW1vcnlFeGNlcHRpb24pKEV4ZWNTdGF0ZSos
IEV4Y2VwdGlvblR5cGUpID0gW10gKEV4ZWNTdGF0ZSogZXhlYywgRXhjZXB0aW9uVHlwZSB0eXBl
KSB7CisgICAgICAgICAgICBWTSogdm0gPSAmZXhlYy0+dm0oKTsKKyAgICAgICAgICAgIE5hdGl2
ZUNhbGxGcmFtZVRyYWNlciB0cmFjZXIodm0sIGV4ZWMpOworCisgICAgICAgICAgICBjb25zdCBj
aGFyKiBtZXNzYWdlOworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5lIFNXSVRD
SF9DQVNFKGVudW1OYW1lLCBlcnJvcikgXAorICAgICAgICAgICAgY2FzZSBFeGNlcHRpb25UeXBl
OjplbnVtTmFtZTogXAorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvcjsgXAorICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgRk9SX0VBQ0hfRVhDRVBUSU9OKFNXSVRDSF9D
QVNFKQorI3VuZGVmIFNXSVRDSF9DQVNFCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICBhdXRvIHRocm93U2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKCp2
bSk7CisgICAgICAgICAgICAgICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHZtLT50
b3BKU1dlYkFzc2VtYmx5SW5zdGFuY2UtPmdsb2JhbE9iamVjdCgpOworCisgICAgICAgICAgICAg
ICAgSlNXZWJBc3NlbWJseVJ1bnRpbWVFcnJvciogZXJyb3IgPSBKU1dlYkFzc2VtYmx5UnVudGlt
ZUVycm9yOjpjcmVhdGUoCisgICAgICAgICAgICAgICAgICAgIGV4ZWMsIGdsb2JhbE9iamVjdC0+
V2ViQXNzZW1ibHlSdW50aW1lRXJyb3JTdHJ1Y3R1cmUoKSwgbWVzc2FnZSk7CisgICAgICAgICAg
ICAgICAgdGhyb3dFeGNlcHRpb24oZXhlYywgdGhyb3dTY29wZSwgZXJyb3IpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBnZW5lcmljVW53aW5kKHZtLCBleGVjKTsKKyAgICAgICAgICAg
IEFTU0VSVCghIXZtLT5jYWxsRnJhbWVGb3JDYXRjaCk7CisgICAgICAgIH07CisKKyAgICAgICAg
bGlua0J1ZmZlci5saW5rKGNhbGwsIHRocm93TWVtb3J5RXhjZXB0aW9uKTsKKyAgICB9KTsKK30K
KwogVmFsdWUqIEIzSVJHZW5lcmF0b3I6Onplcm9Gb3JUeXBlKFR5cGUgdHlwZSkKIHsKICAgICBB
U1NFUlQodHlwZSAhPSBWb2lkKTsKQEAgLTc0MSw4ICs3OTEsOCBAQCBhdXRvIEIzSVJHZW5lcmF0
b3I6OmFkZENhbGxJbmRpcmVjdChjb25zCiAgICAgICAgIENoZWNrVmFsdWUqIGNoZWNrID0gbV9j
dXJyZW50QmxvY2stPmFwcGVuZE5ldzxDaGVja1ZhbHVlPihtX3Byb2MsIENoZWNrLCBPcmlnaW4o
KSwKICAgICAgICAgICAgIG1fY3VycmVudEJsb2NrLT5hcHBlbmROZXc8VmFsdWU+KG1fcHJvYywg
QWJvdmVFcXVhbCwgT3JpZ2luKCksIGNhbGxlZUluZGV4LCBjYWxsYWJsZUZ1bmN0aW9uQnVmZmVy
U2l6ZSkpOwogCi0gICAgICAgIGNoZWNrLT5zZXRHZW5lcmF0b3IoW10gKENDYWxsSGVscGVycyYg
aml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJikgewotICAgICAgICAgICAg
aml0LmJyZWFrcG9pbnQoKTsKKyAgICAgICAgY2hlY2stPnNldEdlbmVyYXRvcihbPV0gKENDYWxs
SGVscGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJikgeworICAg
ICAgICAgICAgdGhpcy0+ZW1pdEV4Y2VwdGlvbkNoZWNrKGppdCwgRXhjZXB0aW9uVHlwZTo6T3V0
T2ZCb3VuZHNDYWxsSW5kaXJlY3QpOwogICAgICAgICB9KTsKICAgICB9CiAKQEAgLTc2MCw4ICs4
MTAsOCBAQCBhdXRvIEIzSVJHZW5lcmF0b3I6OmFkZENhbGxJbmRpcmVjdChjb25zCiAgICAgICAg
ICAgICAgICAgY2FsbGVlU2lnbmF0dXJlLCAKICAgICAgICAgICAgICAgICBtX2N1cnJlbnRCbG9j
ay0+YXBwZW5kTmV3PENvbnN0UHRyVmFsdWU+KG1fcHJvYywgT3JpZ2luKCksIDApKSk7CiAKLSAg
ICAgICAgY2hlY2stPnNldEdlbmVyYXRvcihbXSAoQ0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IEIz
OjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmKSB7Ci0gICAgICAgICAgICBqaXQuYnJlYWtwb2lu
dCgpOworICAgICAgICBjaGVjay0+c2V0R2VuZXJhdG9yKFs9XSAoQ0NhbGxIZWxwZXJzJiBqaXQs
IGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmKSB7CisgICAgICAgICAgICB0aGlz
LT5lbWl0RXhjZXB0aW9uQ2hlY2soaml0LCBFeGNlcHRpb25UeXBlOjpOdWxsVGFibGVFbnRyeSk7
CiAgICAgICAgIH0pOwogICAgIH0KIApAQCAtNzcxLDggKzgyMSw4IEBAIGF1dG8gQjNJUkdlbmVy
YXRvcjo6YWRkQ2FsbEluZGlyZWN0KGNvbnMKICAgICAgICAgQ2hlY2tWYWx1ZSogY2hlY2sgPSBt
X2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3PENoZWNrVmFsdWU+KG1fcHJvYywgQ2hlY2ssIE9yaWdp
bigpLAogICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxWYWx1ZT4obV9wcm9j
LCBOb3RFcXVhbCwgT3JpZ2luKCksIGNhbGxlZVNpZ25hdHVyZSwgZXhwZWN0ZWRTaWduYXR1cmUp
KTsKIAotICAgICAgICBjaGVjay0+c2V0R2VuZXJhdG9yKFtdIChDQ2FsbEhlbHBlcnMmIGppdCwg
Y29uc3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYpIHsKLSAgICAgICAgICAgIGppdC5i
cmVha3BvaW50KCk7CisgICAgICAgIGNoZWNrLT5zZXRHZW5lcmF0b3IoWz1dIChDQ2FsbEhlbHBl
cnMmIGppdCwgY29uc3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYpIHsKKyAgICAgICAg
ICAgIHRoaXMtPmVtaXRFeGNlcHRpb25DaGVjayhqaXQsIEV4Y2VwdGlvblR5cGU6OkJhZFNpZ25h
dHVyZSk7CiAgICAgICAgIH0pOwogICAgIH0KIApAQCAtODMzLDcgKzg4Myw3IEBAIHZvaWQgQjNJ
UkdlbmVyYXRvcjo6ZHVtcChjb25zdCBWZWN0b3I8Q28KICAgICBkYXRhTG9nTG4oIlxuIik7CiB9
CiAKLXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsYXRpb24+IGNyZWF0ZUpTVG9XYXNtV3Jh
cHBlcihWTSYgdm0sIFdhc21JbnRlcm5hbEZ1bmN0aW9uJiBmdW5jdGlvbiwgY29uc3QgU2lnbmF0
dXJlKiBzaWduYXR1cmUsIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBtYWluRnVuY3Rpb24sIGNvbnN0
IE1lbW9yeUluZm9ybWF0aW9uJiBtZW1vcnkpCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEIzOjpD
b21waWxhdGlvbj4gY3JlYXRlSlNUb1dhc21XcmFwcGVyKFZNJiB2bSwgV2FzbUludGVybmFsRnVu
Y3Rpb24mIGZ1bmN0aW9uLCBjb25zdCBTaWduYXR1cmUqIHNpZ25hdHVyZSwgTWFjcm9Bc3NlbWJs
ZXJDb2RlUHRyIG1haW5GdW5jdGlvbiwgY29uc3QgTWVtb3J5SW5mb3JtYXRpb24mIG1lbW9yeSkK
IHsKICAgICBQcm9jZWR1cmUgcHJvYzsKICAgICBCYXNpY0Jsb2NrKiBibG9jayA9IHByb2MuYWRk
QmxvY2soKTsKQEAgLTg0MiwxOSArODkyLDIzIEBAIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q29t
cGlsYXRpb24+IGNyZWEKIAogICAgIGpzY0NhbGxpbmdDb252ZW50aW9uKCkuc2V0dXBGcmFtZUlu
UHJvbG9ndWUoJmZ1bmN0aW9uLmpzVG9XYXNtQ2FsbGVlTW92ZUxvY2F0aW9uLCBwcm9jLCBvcmln
aW4sIGJsb2NrKTsKIAotICAgIFZhbHVlKiBmcmFtZVBvaW50ZXIgPSBibG9jay0+YXBwZW5kTmV3
PEIzOjpWYWx1ZT4ocHJvYywgQjM6OkZyYW1lUG9pbnRlciwgb3JpZ2luKTsKLSAgICBWYWx1ZSog
b2ZmU2V0T2ZBcmd1bWVudENvdW50ID0gYmxvY2stPmFwcGVuZE5ldzxDb25zdDY0VmFsdWU+KHBy
b2MsIG9yaWdpbiwgQ2FsbEZyYW1lU2xvdDo6YXJndW1lbnRDb3VudCAqIHNpemVvZihSZWdpc3Rl
cikpOwotICAgIFZhbHVlKiBhcmd1bWVudENvdW50ID0gYmxvY2stPmFwcGVuZE5ldzxNZW1vcnlW
YWx1ZT4ocHJvYywgTG9hZCwgSW50MzIsIG9yaWdpbiwKLSAgICAgICAgYmxvY2stPmFwcGVuZE5l
dzxWYWx1ZT4ocHJvYywgQWRkLCBvcmlnaW4sIGZyYW1lUG9pbnRlciwgb2ZmU2V0T2ZBcmd1bWVu
dENvdW50KSk7CisgICAgaWYgKCFBU1NFUlRfRElTQUJMRUQpIHsKKyAgICAgICAgLy8gVGhpcyBz
aG91bGQgYmUgZ3VhcmFudGVlZCBieSBvdXIgSlMgd3JhcHBlciB0aGF0IGhhbmRsZXMgY2FsbHMg
dG8gdXMuCisgICAgICAgIC8vIEp1c3QgcHJldmVudCBhZ2FpbnN0IGNyYXp5IHdoZW4gQVNTRVJU
IGlzIGVuYWJsZWQuCisgICAgICAgIFZhbHVlKiBmcmFtZVBvaW50ZXIgPSBibG9jay0+YXBwZW5k
TmV3PEIzOjpWYWx1ZT4ocHJvYywgQjM6OkZyYW1lUG9pbnRlciwgb3JpZ2luKTsKKyAgICAgICAg
VmFsdWUqIG9mZlNldE9mQXJndW1lbnRDb3VudCA9IGJsb2NrLT5hcHBlbmROZXc8Q29uc3Q2NFZh
bHVlPihwcm9jLCBvcmlnaW4sIENhbGxGcmFtZVNsb3Q6OmFyZ3VtZW50Q291bnQgKiBzaXplb2Yo
UmVnaXN0ZXIpKTsKKyAgICAgICAgVmFsdWUqIGFyZ3VtZW50Q291bnQgPSBibG9jay0+YXBwZW5k
TmV3PE1lbW9yeVZhbHVlPihwcm9jLCBMb2FkLCBJbnQzMiwgb3JpZ2luLAorICAgICAgICAgICAg
YmxvY2stPmFwcGVuZE5ldzxWYWx1ZT4ocHJvYywgQWRkLCBvcmlnaW4sIGZyYW1lUG9pbnRlciwg
b2ZmU2V0T2ZBcmd1bWVudENvdW50KSk7CiAKLSAgICBWYWx1ZSogZXhwZWN0ZWRBcmd1bWVudENv
dW50ID0gYmxvY2stPmFwcGVuZE5ldzxDb25zdDMyVmFsdWU+KHByb2MsIG9yaWdpbiwgc2lnbmF0
dXJlLT5hcmd1bWVudHMuc2l6ZSgpKTsKKyAgICAgICAgVmFsdWUqIGV4cGVjdGVkQXJndW1lbnRD
b3VudCA9IGJsb2NrLT5hcHBlbmROZXc8Q29uc3QzMlZhbHVlPihwcm9jLCBvcmlnaW4sIHNpZ25h
dHVyZS0+YXJndW1lbnRzLnNpemUoKSk7CiAKLSAgICBDaGVja1ZhbHVlKiBhcmd1bWVudENvdW50
Q2hlY2sgPSBibG9jay0+YXBwZW5kTmV3PENoZWNrVmFsdWU+KHByb2MsIENoZWNrLCBvcmlnaW4s
Ci0gICAgICAgIGJsb2NrLT5hcHBlbmROZXc8VmFsdWU+KHByb2MsIEFib3ZlLCBvcmlnaW4sIGV4
cGVjdGVkQXJndW1lbnRDb3VudCwgYXJndW1lbnRDb3VudCkpOworICAgICAgICBDaGVja1ZhbHVl
KiBhcmd1bWVudENvdW50Q2hlY2sgPSBibG9jay0+YXBwZW5kTmV3PENoZWNrVmFsdWU+KHByb2Ms
IENoZWNrLCBvcmlnaW4sCisgICAgICAgICAgICBibG9jay0+YXBwZW5kTmV3PFZhbHVlPihwcm9j
LCBBYm92ZSwgb3JpZ2luLCBleHBlY3RlZEFyZ3VtZW50Q291bnQsIGFyZ3VtZW50Q291bnQpKTsK
IAotICAgIGFyZ3VtZW50Q291bnRDaGVjay0+c2V0R2VuZXJhdG9yKFtdIChDQ2FsbEhlbHBlcnMm
IGppdCwgY29uc3QgU3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJikgewotICAgICAgICBqaXQuYnJl
YWtwb2ludCgpOwotICAgIH0pOworICAgICAgICBhcmd1bWVudENvdW50Q2hlY2stPnNldEdlbmVy
YXRvcihbXSAoQ0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IFN0YWNrbWFwR2VuZXJhdGlvblBhcmFt
cyYpIHsKKyAgICAgICAgICAgIGppdC5icmVha3BvaW50KCk7CisgICAgICAgIH0pOworICAgIH0K
IAogICAgIC8vIE1vdmUgbWVtb3J5IHZhbHVlcyB0byB0aGUgYXBwcm9yaWF0ZSBwbGFjZXMsIGlm
IG5lZWRlZC4KICAgICBWYWx1ZSogYmFzZU1lbW9yeSA9IG51bGxwdHI7CkBAIC05MTQsNyArOTY4
LDcgQEAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDb21waWxhdGlvbj4gY3JlYQogICAgICAgICBS
RUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgIH0KIAotICAgIGF1dG8ganNFbnRyeXBv
aW50ID0gc3RkOjptYWtlX3VuaXF1ZTxDb21waWxhdGlvbj4odm0sIHByb2MpOworICAgIGF1dG8g
anNFbnRyeXBvaW50ID0gc3RkOjptYWtlX3VuaXF1ZTxDb21waWxhdGlvbj4oQjM6OmNvbXBpbGUo
dm0sIHByb2MpKTsKICAgICBmdW5jdGlvbi5qc1RvV2FzbUVudHJ5cG9pbnQuY2FsbGVlU2F2ZVJl
Z2lzdGVycyA9IHByb2MuY2FsbGVlU2F2ZVJlZ2lzdGVycygpOwogICAgIHJldHVybiBqc0VudHJ5
cG9pbnQ7CiB9CkBAIC05MzcsNyArOTkxLDE3IEBAIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxX
YXNtSW50ZXJuYWxGdW4KICAgICBpZiAodmVyYm9zZSkKICAgICAgICAgZGF0YUxvZygiUG9zdCBT
U0E6ICIsIHByb2NlZHVyZSk7CiAKLSAgICByZXN1bHQtPndhc21FbnRyeXBvaW50LmNvbXBpbGF0
aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxDb21waWxhdGlvbj4odm0sIHByb2NlZHVyZSwgb3B0TGV2
ZWwpOworICAgIHsKKyAgICAgICAgQjM6OnByZXBhcmVGb3JHZW5lcmF0aW9uKHByb2NlZHVyZSwg
b3B0TGV2ZWwpOworICAgICAgICAKKyAgICAgICAgQ0NhbGxIZWxwZXJzIGppdCgmdm0pOworICAg
ICAgICBCMzo6Z2VuZXJhdGUocHJvY2VkdXJlLCBqaXQpOworICAgICAgICBjb250ZXh0LmVtaXRF
eGNlcHRpb25IYW5kbGVyKGppdCk7CisKKyAgICAgICAgTGlua0J1ZmZlciBsaW5rQnVmZmVyKHZt
LCBqaXQsIG51bGxwdHIpOworICAgICAgICByZXN1bHQtPndhc21FbnRyeXBvaW50LmNvbXBpbGF0
aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxCMzo6Q29tcGlsYXRpb24+KEZJTkFMSVpFX0NPREUobGlu
a0J1ZmZlciwgKCJXYXNtIGNvbXBpbGF0aW9uIikpLCBwcm9jZWR1cmUucmVsZWFzZUJ5cHJvZHVj
dHMoKSk7CisgICAgfQorCiAgICAgcmVzdWx0LT53YXNtRW50cnlwb2ludC5jYWxsZWVTYXZlUmVn
aXN0ZXJzID0gcHJvY2VkdXJlLmNhbGxlZVNhdmVSZWdpc3RlcnMoKTsKICAgICByZXN1bHQtPmpz
VG9XYXNtRW50cnlwb2ludC5jb21waWxhdGlvbiA9IGNyZWF0ZUpTVG9XYXNtV3JhcHBlcih2bSwg
KnJlc3VsdCwgc2lnbmF0dXJlLCByZXN1bHQtPndhc21FbnRyeXBvaW50LmNvbXBpbGF0aW9uLT5j
b2RlKCksIGluZm8ubWVtb3J5KTsKICAgICByZXR1cm4gV1RGTW92ZShyZXN1bHQpOwpAQCAtMTA5
NSw4ICsxMTU5LDggQEAgYXV0byBCM0lSR2VuZXJhdG9yOjphZGRPcDxPcFR5cGU6OkkzMlRydQog
ICAgICAgICBtX2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3PFZhbHVlPihtX3Byb2MsIEdyZWF0ZXJF
cXVhbCwgT3JpZ2luKCksIGFyZywgbWluKSk7CiAgICAgb3V0T2ZCb3VuZHMgPSBtX2N1cnJlbnRC
bG9jay0+YXBwZW5kTmV3PFZhbHVlPihtX3Byb2MsIEVxdWFsLCBPcmlnaW4oKSwgb3V0T2ZCb3Vu
ZHMsIHplcm9Gb3JUeXBlKEkzMikpOwogICAgIENoZWNrVmFsdWUqIHRyYXAgPSBtX2N1cnJlbnRC
bG9jay0+YXBwZW5kTmV3PENoZWNrVmFsdWU+KG1fcHJvYywgQ2hlY2ssIE9yaWdpbigpLCBvdXRP
ZkJvdW5kcyk7Ci0gICAgdHJhcC0+c2V0R2VuZXJhdG9yKFtdIChDQ2FsbEhlbHBlcnMmIGppdCwg
Y29uc3QgU3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJikgewotICAgICAgICBqaXQuYnJlYWtwb2lu
dCgpOworICAgIHRyYXAtPnNldEdlbmVyYXRvcihbPV0gKENDYWxsSGVscGVycyYgaml0LCBjb25z
dCBTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmKSB7CisgICAgICAgIHRoaXMtPmVtaXRFeGNlcHRp
b25DaGVjayhqaXQsIEV4Y2VwdGlvblR5cGU6Ok91dE9mQm91bmRzVHJ1bmMpOwogICAgIH0pOwog
ICAgIFBhdGNocG9pbnRWYWx1ZSogcGF0Y2hwb2ludCA9IG1fY3VycmVudEJsb2NrLT5hcHBlbmRO
ZXc8UGF0Y2hwb2ludFZhbHVlPihtX3Byb2MsIEludDMyLCBPcmlnaW4oKSk7CiAgICAgcGF0Y2hw
b2ludC0+YXBwZW5kKGFyZywgVmFsdWVSZXA6OlNvbWVSZWdpc3Rlcik7CkBAIC0xMTE4LDggKzEx
ODIsOCBAQCBhdXRvIEIzSVJHZW5lcmF0b3I6OmFkZE9wPE9wVHlwZTo6STMyVHJ1CiAgICAgICAg
IG1fY3VycmVudEJsb2NrLT5hcHBlbmROZXc8VmFsdWU+KG1fcHJvYywgR3JlYXRlckVxdWFsLCBP
cmlnaW4oKSwgYXJnLCBtaW4pKTsKICAgICBvdXRPZkJvdW5kcyA9IG1fY3VycmVudEJsb2NrLT5h
cHBlbmROZXc8VmFsdWU+KG1fcHJvYywgRXF1YWwsIE9yaWdpbigpLCBvdXRPZkJvdW5kcywgemVy
b0ZvclR5cGUoSTMyKSk7CiAgICAgQ2hlY2tWYWx1ZSogdHJhcCA9IG1fY3VycmVudEJsb2NrLT5h
cHBlbmROZXc8Q2hlY2tWYWx1ZT4obV9wcm9jLCBDaGVjaywgT3JpZ2luKCksIG91dE9mQm91bmRz
KTsKLSAgICB0cmFwLT5zZXRHZW5lcmF0b3IoW10gKENDYWxsSGVscGVycyYgaml0LCBjb25zdCBT
dGFja21hcEdlbmVyYXRpb25QYXJhbXMmKSB7Ci0gICAgICAgIGppdC5icmVha3BvaW50KCk7Cisg
ICAgdHJhcC0+c2V0R2VuZXJhdG9yKFs9XSAoQ0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IFN0YWNr
bWFwR2VuZXJhdGlvblBhcmFtcyYpIHsKKyAgICAgICAgdGhpcy0+ZW1pdEV4Y2VwdGlvbkNoZWNr
KGppdCwgRXhjZXB0aW9uVHlwZTo6T3V0T2ZCb3VuZHNUcnVuYyk7CiAgICAgfSk7CiAgICAgUGF0
Y2hwb2ludFZhbHVlKiBwYXRjaHBvaW50ID0gbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxQYXRj
aHBvaW50VmFsdWU+KG1fcHJvYywgSW50MzIsIE9yaWdpbigpKTsKICAgICBwYXRjaHBvaW50LT5h
cHBlbmQoYXJnLCBWYWx1ZVJlcDo6U29tZVJlZ2lzdGVyKTsKQEAgLTExNDIsOCArMTIwNiw4IEBA
IGF1dG8gQjNJUkdlbmVyYXRvcjo6YWRkT3A8T3BUeXBlOjpJMzJUcnUKICAgICAgICAgbV9jdXJy
ZW50QmxvY2stPmFwcGVuZE5ldzxWYWx1ZT4obV9wcm9jLCBHcmVhdGVyVGhhbiwgT3JpZ2luKCks
IGFyZywgbWluKSk7CiAgICAgb3V0T2ZCb3VuZHMgPSBtX2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3
PFZhbHVlPihtX3Byb2MsIEVxdWFsLCBPcmlnaW4oKSwgb3V0T2ZCb3VuZHMsIHplcm9Gb3JUeXBl
KEkzMikpOwogICAgIENoZWNrVmFsdWUqIHRyYXAgPSBtX2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3
PENoZWNrVmFsdWU+KG1fcHJvYywgQ2hlY2ssIE9yaWdpbigpLCBvdXRPZkJvdW5kcyk7Ci0gICAg
dHJhcC0+c2V0R2VuZXJhdG9yKFtdIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgU3RhY2ttYXBH
ZW5lcmF0aW9uUGFyYW1zJikgewotICAgICAgICBqaXQuYnJlYWtwb2ludCgpOworICAgIHRyYXAt
PnNldEdlbmVyYXRvcihbPV0gKENDYWxsSGVscGVycyYgaml0LCBjb25zdCBTdGFja21hcEdlbmVy
YXRpb25QYXJhbXMmKSB7CisgICAgICAgIHRoaXMtPmVtaXRFeGNlcHRpb25DaGVjayhqaXQsIEV4
Y2VwdGlvblR5cGU6Ok91dE9mQm91bmRzVHJ1bmMpOwogICAgIH0pOwogICAgIFBhdGNocG9pbnRW
YWx1ZSogcGF0Y2hwb2ludCA9IG1fY3VycmVudEJsb2NrLT5hcHBlbmROZXc8UGF0Y2hwb2ludFZh
bHVlPihtX3Byb2MsIEludDMyLCBPcmlnaW4oKSk7CiAgICAgcGF0Y2hwb2ludC0+YXBwZW5kKGFy
ZywgVmFsdWVSZXA6OlNvbWVSZWdpc3Rlcik7CkBAIC0xMTY1LDggKzEyMjksOCBAQCBhdXRvIEIz
SVJHZW5lcmF0b3I6OmFkZE9wPE9wVHlwZTo6STMyVHJ1CiAgICAgICAgIG1fY3VycmVudEJsb2Nr
LT5hcHBlbmROZXc8VmFsdWU+KG1fcHJvYywgR3JlYXRlclRoYW4sIE9yaWdpbigpLCBhcmcsIG1p
bikpOwogICAgIG91dE9mQm91bmRzID0gbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxWYWx1ZT4o
bV9wcm9jLCBFcXVhbCwgT3JpZ2luKCksIG91dE9mQm91bmRzLCB6ZXJvRm9yVHlwZShJMzIpKTsK
ICAgICBDaGVja1ZhbHVlKiB0cmFwID0gbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxDaGVja1Zh
bHVlPihtX3Byb2MsIENoZWNrLCBPcmlnaW4oKSwgb3V0T2ZCb3VuZHMpOwotICAgIHRyYXAtPnNl
dEdlbmVyYXRvcihbXSAoQ0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IFN0YWNrbWFwR2VuZXJhdGlv
blBhcmFtcyYpIHsKLSAgICAgICAgaml0LmJyZWFrcG9pbnQoKTsKKyAgICB0cmFwLT5zZXRHZW5l
cmF0b3IoWz1dIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgU3RhY2ttYXBHZW5lcmF0aW9uUGFy
YW1zJikgeworICAgICAgICB0aGlzLT5lbWl0RXhjZXB0aW9uQ2hlY2soaml0LCBFeGNlcHRpb25U
eXBlOjpPdXRPZkJvdW5kc1RydW5jKTsKICAgICB9KTsKICAgICBQYXRjaHBvaW50VmFsdWUqIHBh
dGNocG9pbnQgPSBtX2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3PFBhdGNocG9pbnRWYWx1ZT4obV9w
cm9jLCBJbnQzMiwgT3JpZ2luKCkpOwogICAgIHBhdGNocG9pbnQtPmFwcGVuZChhcmcsIFZhbHVl
UmVwOjpTb21lUmVnaXN0ZXIpOwpAQCAtMTE4OCw4ICsxMjUyLDggQEAgYXV0byBCM0lSR2VuZXJh
dG9yOjphZGRPcDxPcFR5cGU6Okk2NFRydQogICAgICAgICBtX2N1cnJlbnRCbG9jay0+YXBwZW5k
TmV3PFZhbHVlPihtX3Byb2MsIEdyZWF0ZXJFcXVhbCwgT3JpZ2luKCksIGFyZywgbWluKSk7CiAg
ICAgb3V0T2ZCb3VuZHMgPSBtX2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3PFZhbHVlPihtX3Byb2Ms
IEVxdWFsLCBPcmlnaW4oKSwgb3V0T2ZCb3VuZHMsIHplcm9Gb3JUeXBlKEkzMikpOwogICAgIENo
ZWNrVmFsdWUqIHRyYXAgPSBtX2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3PENoZWNrVmFsdWU+KG1f
cHJvYywgQ2hlY2ssIE9yaWdpbigpLCBvdXRPZkJvdW5kcyk7Ci0gICAgdHJhcC0+c2V0R2VuZXJh
dG9yKFtdIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgU3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1z
JikgewotICAgICAgICBqaXQuYnJlYWtwb2ludCgpOworICAgIHRyYXAtPnNldEdlbmVyYXRvcihb
PV0gKENDYWxsSGVscGVycyYgaml0LCBjb25zdCBTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmKSB7
CisgICAgICAgIHRoaXMtPmVtaXRFeGNlcHRpb25DaGVjayhqaXQsIEV4Y2VwdGlvblR5cGU6Ok91
dE9mQm91bmRzVHJ1bmMpOwogICAgIH0pOwogICAgIFBhdGNocG9pbnRWYWx1ZSogcGF0Y2hwb2lu
dCA9IG1fY3VycmVudEJsb2NrLT5hcHBlbmROZXc8UGF0Y2hwb2ludFZhbHVlPihtX3Byb2MsIElu
dDY0LCBPcmlnaW4oKSk7CiAgICAgcGF0Y2hwb2ludC0+YXBwZW5kKGFyZywgVmFsdWVSZXA6OlNv
bWVSZWdpc3Rlcik7CkBAIC0xMjExLDggKzEyNzUsOCBAQCBhdXRvIEIzSVJHZW5lcmF0b3I6OmFk
ZE9wPE9wVHlwZTo6STY0VHJ1CiAgICAgICAgIG1fY3VycmVudEJsb2NrLT5hcHBlbmROZXc8VmFs
dWU+KG1fcHJvYywgR3JlYXRlclRoYW4sIE9yaWdpbigpLCBhcmcsIG1pbikpOwogICAgIG91dE9m
Qm91bmRzID0gbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxWYWx1ZT4obV9wcm9jLCBFcXVhbCwg
T3JpZ2luKCksIG91dE9mQm91bmRzLCB6ZXJvRm9yVHlwZShJMzIpKTsKICAgICBDaGVja1ZhbHVl
KiB0cmFwID0gbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxDaGVja1ZhbHVlPihtX3Byb2MsIENo
ZWNrLCBPcmlnaW4oKSwgb3V0T2ZCb3VuZHMpOwotICAgIHRyYXAtPnNldEdlbmVyYXRvcihbXSAo
Q0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IFN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYpIHsKLSAg
ICAgICAgaml0LmJyZWFrcG9pbnQoKTsKKyAgICB0cmFwLT5zZXRHZW5lcmF0b3IoWz1dIChDQ2Fs
bEhlbHBlcnMmIGppdCwgY29uc3QgU3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJikgeworICAgICAg
ICB0aGlzLT5lbWl0RXhjZXB0aW9uQ2hlY2soaml0LCBFeGNlcHRpb25UeXBlOjpPdXRPZkJvdW5k
c1RydW5jKTsKICAgICB9KTsKIAogICAgIFZhbHVlKiBjb25zdGFudDsKQEAgLTEyNTMsOCArMTMx
Nyw4IEBAIGF1dG8gQjNJUkdlbmVyYXRvcjo6YWRkT3A8T3BUeXBlOjpJNjRUcnUKICAgICAgICAg
bV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxWYWx1ZT4obV9wcm9jLCBHcmVhdGVyRXF1YWwsIE9y
aWdpbigpLCBhcmcsIG1pbikpOwogICAgIG91dE9mQm91bmRzID0gbV9jdXJyZW50QmxvY2stPmFw
cGVuZE5ldzxWYWx1ZT4obV9wcm9jLCBFcXVhbCwgT3JpZ2luKCksIG91dE9mQm91bmRzLCB6ZXJv
Rm9yVHlwZShJMzIpKTsKICAgICBDaGVja1ZhbHVlKiB0cmFwID0gbV9jdXJyZW50QmxvY2stPmFw
cGVuZE5ldzxDaGVja1ZhbHVlPihtX3Byb2MsIENoZWNrLCBPcmlnaW4oKSwgb3V0T2ZCb3VuZHMp
OwotICAgIHRyYXAtPnNldEdlbmVyYXRvcihbXSAoQ0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IFN0
YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYpIHsKLSAgICAgICAgaml0LmJyZWFrcG9pbnQoKTsKKyAg
ICB0cmFwLT5zZXRHZW5lcmF0b3IoWz1dIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgU3RhY2tt
YXBHZW5lcmF0aW9uUGFyYW1zJikgeworICAgICAgICB0aGlzLT5lbWl0RXhjZXB0aW9uQ2hlY2so
aml0LCBFeGNlcHRpb25UeXBlOjpPdXRPZkJvdW5kc1RydW5jKTsKICAgICB9KTsKICAgICBQYXRj
aHBvaW50VmFsdWUqIHBhdGNocG9pbnQgPSBtX2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3PFBhdGNo
cG9pbnRWYWx1ZT4obV9wcm9jLCBJbnQ2NCwgT3JpZ2luKCkpOwogICAgIHBhdGNocG9pbnQtPmFw
cGVuZChhcmcsIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXIpOwpAQCAtMTI3Niw4ICsxMzQwLDggQEAg
YXV0byBCM0lSR2VuZXJhdG9yOjphZGRPcDxPcFR5cGU6Okk2NFRydQogICAgICAgICBtX2N1cnJl
bnRCbG9jay0+YXBwZW5kTmV3PFZhbHVlPihtX3Byb2MsIEdyZWF0ZXJUaGFuLCBPcmlnaW4oKSwg
YXJnLCBtaW4pKTsKICAgICBvdXRPZkJvdW5kcyA9IG1fY3VycmVudEJsb2NrLT5hcHBlbmROZXc8
VmFsdWU+KG1fcHJvYywgRXF1YWwsIE9yaWdpbigpLCBvdXRPZkJvdW5kcywgemVyb0ZvclR5cGUo
STMyKSk7CiAgICAgQ2hlY2tWYWx1ZSogdHJhcCA9IG1fY3VycmVudEJsb2NrLT5hcHBlbmROZXc8
Q2hlY2tWYWx1ZT4obV9wcm9jLCBDaGVjaywgT3JpZ2luKCksIG91dE9mQm91bmRzKTsKLSAgICB0
cmFwLT5zZXRHZW5lcmF0b3IoW10gKENDYWxsSGVscGVycyYgaml0LCBjb25zdCBTdGFja21hcEdl
bmVyYXRpb25QYXJhbXMmKSB7Ci0gICAgICAgIGppdC5icmVha3BvaW50KCk7CisgICAgdHJhcC0+
c2V0R2VuZXJhdG9yKFs9XSAoQ0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IFN0YWNrbWFwR2VuZXJh
dGlvblBhcmFtcyYpIHsKKyAgICAgICAgdGhpcy0+ZW1pdEV4Y2VwdGlvbkNoZWNrKGppdCwgRXhj
ZXB0aW9uVHlwZTo6T3V0T2ZCb3VuZHNUcnVuYyk7CiAgICAgfSk7CiAKICAgICBWYWx1ZSogY29u
c3RhbnQ7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQmluZGluZy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUJpbmRpbmcuY3Bw
CShyZXZpc2lvbiAyMDk4ODYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQmlu
ZGluZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc5LDcgKzc5LDEyIEBAIFdhc21Ub0pTU3R1YiBp
bXBvcnRTdHViR2VuZXJhdG9yKFZNKiB2bSwKICAgICAgICAgY2FzZSBBbnlmdW5jOgogICAgICAg
ICBjYXNlIEk2NDoKICAgICAgICAgICAgIC8vIEZvciB0aGUgSmF2YVNjcmlwdCBlbWJlZGRpbmcs
IGltcG9ydHMgd2l0aCB0aGVzZSB0eXBlcyBpbiB0aGVpciBzaWduYXR1cmUgYXJndW1lbnRzIGFy
ZSBhIFdlYkFzc2VtYmx5Lk1vZHVsZSB2YWxpZGF0aW9uIGVycm9yLgotICAgICAgICAgICAgUkVM
RUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIC8vUkVMRUFTRV9BU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGppdC5ub3AoKTsKKyAgICAgICAgICAgIGppdC5u
b3AoKTsKKyAgICAgICAgICAgIGppdC5icmVha3BvaW50KCk7CisgICAgICAgICAgICBqaXQubm9w
KCk7CisgICAgICAgICAgICBqaXQubm9wKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAg
Y2FzZSBJMzI6IHsKICAgICAgICAgICAgIEdQUlJlZyBncHJSZWc7CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseU1vZHVs
ZUNvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gMjA5ODg2KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTUyLDcgKzUyLDE5IEBAIGNvbnN0IENsYXNzSW5mbyBXZWJBc3NlbWJseU1vZHVsZUNv
bnN0cnUKICBAZW5kCiAgKi8KIAotc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwg
Y29uc3RydWN0SlNXZWJBc3NlbWJseU1vZHVsZShFeGVjU3RhdGUqIHN0YXRlKQorc3RhdGljIEVu
Y29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29uc3RydWN0SlNXZWJBc3NlbWJseU1vZHVsZShF
eGVjU3RhdGUqIGV4ZWMpCit7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShXZWJBc3NlbWJs
eU1vZHVsZUNvbnN0cnVjdG9yOjpjcmVhdGVNb2R1bGUoZXhlYykpOworfQorCitzdGF0aWMgRW5j
b2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjYWxsSlNXZWJBc3NlbWJseU1vZHVsZShFeGVjU3Rh
dGUqIHN0YXRlKQoreworICAgIFZNJiB2bSA9IHN0YXRlLT52bSgpOworICAgIGF1dG8gc2NvcGUg
PSBERUNMQVJFX1RIUk9XX1NDT1BFKHZtKTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRo
cm93Q29uc3RydWN0b3JDYW5ub3RCZUNhbGxlZEFzRnVuY3Rpb25UeXBlRXJyb3Ioc3RhdGUsIHNj
b3BlLCAiV2ViQXNzZW1ibHkuTW9kdWxlIikpOworfQorCitKU1ZhbHVlIFdlYkFzc2VtYmx5TW9k
dWxlQ29uc3RydWN0b3I6OmNyZWF0ZU1vZHVsZShFeGVjU3RhdGUqIHN0YXRlKQogewogICAgIFZN
JiB2bSA9IHN0YXRlLT52bSgpOwogICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BF
KHZtKTsKQEAgLTYxLDExICs3MywxMyBAQCBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCBjb25zCiAgICAgLy8gSWYgdGhlIGdpdmVuIGJ5dGVzIGFyZ3VtZW50IGlzIG5vdCBhIEJ1
ZmZlclNvdXJjZSwgYSBUeXBlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICBKU0FycmF5
QnVmZmVyKiBhcnJheUJ1ZmZlciA9IHZhbC5nZXRPYmplY3QoKSA/IGpzRHluYW1pY0Nhc3Q8SlNB
cnJheUJ1ZmZlcio+KHZhbC5nZXRPYmplY3QoKSkgOiBudWxscHRyOwogICAgIEpTQXJyYXlCdWZm
ZXJWaWV3KiBhcnJheUJ1ZmZlclZpZXcgPSB2YWwuZ2V0T2JqZWN0KCkgPyBqc0R5bmFtaWNDYXN0
PEpTQXJyYXlCdWZmZXJWaWV3Kj4odmFsLmdldE9iamVjdCgpKSA6IG51bGxwdHI7Ci0gICAgaWYg
KCEoYXJyYXlCdWZmZXIgfHwgYXJyYXlCdWZmZXJWaWV3KSkKLSAgICAgICAgcmV0dXJuIEpTVmFs
dWU6OmVuY29kZSh0aHJvd0V4Y2VwdGlvbihzdGF0ZSwgc2NvcGUsIGNyZWF0ZVR5cGVFcnJvcihz
dGF0ZSwgQVNDSUlMaXRlcmFsKCJmaXJzdCBhcmd1bWVudCB0byBXZWJBc3NlbWJseS5Nb2R1bGUg
bXVzdCBiZSBhbiBBcnJheUJ1ZmZlclZpZXcgb3IgYW4gQXJyYXlCdWZmZXIiKSwgZGVmYXVsdFNv
dXJjZUFwcGVuZGVyLCBydW50aW1lVHlwZUZvclZhbHVlKHZhbCkpKSk7CisgICAgaWYgKCEoYXJy
YXlCdWZmZXIgfHwgYXJyYXlCdWZmZXJWaWV3KSkgeworICAgICAgICByZXR1cm4gdGhyb3dFeGNl
cHRpb24oc3RhdGUsIHNjb3BlLCBjcmVhdGVUeXBlRXJyb3Ioc3RhdGUsIEFTQ0lJTGl0ZXJhbCgi
Zmlyc3QgYXJndW1lbnQgdG8gV2ViQXNzZW1ibHkuTW9kdWxlIG11c3QgYmUgYW4gQXJyYXlCdWZm
ZXJWaWV3IG9yIGFuIEFycmF5QnVmZmVyIiksIGRlZmF1bHRTb3VyY2VBcHBlbmRlciwgcnVudGlt
ZVR5cGVGb3JWYWx1ZSh2YWwpKSk7CisgICAgfQogCi0gICAgaWYgKGFycmF5QnVmZmVyVmlldyA/
IGFycmF5QnVmZmVyVmlldy0+aXNOZXV0ZXJlZCgpIDogYXJyYXlCdWZmZXItPmltcGwoKS0+aXNO
ZXV0ZXJlZCgpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93RXhjZXB0aW9u
KHN0YXRlLCBzY29wZSwgY3JlYXRlVHlwZUVycm9yKHN0YXRlLCBBU0NJSUxpdGVyYWwoInVuZGVy
bHlpbmcgVHlwZWRBcnJheSBoYXMgYmVlbiBkZXRhdGNoZWQgZnJvbSB0aGUgQXJyYXlCdWZmZXIi
KSwgZGVmYXVsdFNvdXJjZUFwcGVuZGVyLCBydW50aW1lVHlwZUZvclZhbHVlKHZhbCkpKSk7Cisg
ICAgaWYgKGFycmF5QnVmZmVyVmlldyA/IGFycmF5QnVmZmVyVmlldy0+aXNOZXV0ZXJlZCgpIDog
YXJyYXlCdWZmZXItPmltcGwoKS0+aXNOZXV0ZXJlZCgpKSB7CisgICAgICAgIHJldHVybiB0aHJv
d0V4Y2VwdGlvbihzdGF0ZSwgc2NvcGUsIGNyZWF0ZVR5cGVFcnJvcihzdGF0ZSwgQVNDSUlMaXRl
cmFsKCJ1bmRlcmx5aW5nIFR5cGVkQXJyYXkgaGFzIGJlZW4gZGV0YXRjaGVkIGZyb20gdGhlIEFy
cmF5QnVmZmVyIiksIGRlZmF1bHRTb3VyY2VBcHBlbmRlciwgcnVudGltZVR5cGVGb3JWYWx1ZSh2
YWwpKSk7CisgICAgfQogCiAgICAgc2l6ZV90IGJ5dGVPZmZzZXQgPSBhcnJheUJ1ZmZlclZpZXcg
PyBhcnJheUJ1ZmZlclZpZXctPmJ5dGVPZmZzZXQoKSA6IDA7CiAgICAgc2l6ZV90IGJ5dGVTaXpl
ID0gYXJyYXlCdWZmZXJWaWV3ID8gYXJyYXlCdWZmZXJWaWV3LT5sZW5ndGgoKSA6IGFycmF5QnVm
ZmVyLT5pbXBsKCktPmJ5dGVMZW5ndGgoKTsKQEAgLTc0LDggKzg4LDkgQEAgc3RhdGljIEVuY29k
ZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29ucwogICAgIFdhc206OlBsYW4gcGxhbigmdm0sIGJh
c2UgKyBieXRlT2Zmc2V0LCBieXRlU2l6ZSk7CiAgICAgLy8gT24gZmFpbHVyZSwgYSBuZXcgV2Vi
QXNzZW1ibHkuQ29tcGlsZUVycm9yIGlzIHRocm93bi4KICAgICBwbGFuLnJ1bigpOwotICAgIGlm
IChwbGFuLmZhaWxlZCgpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93RXhj
ZXB0aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRlV2ViQXNzZW1ibHlDb21waWxlRXJyb3Ioc3RhdGUs
IHBsYW4uZXJyb3JNZXNzYWdlKCkpKSk7CisgICAgaWYgKHBsYW4uZmFpbGVkKCkpIHsKKyAgICAg
ICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRlV2ViQXNzZW1ibHlD
b21waWxlRXJyb3Ioc3RhdGUsIHBsYW4uZXJyb3JNZXNzYWdlKCkpKTsKKyAgICB9CiAKICAgICAv
LyBPbiBzdWNjZXNzLCBhIG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUgb2JqZWN0IGlzIHJldHVybmVk
IHdpdGggW1tNb2R1bGVdXSBzZXQgdG8gdGhlIHZhbGlkYXRlZCBBc3QubW9kdWxlLgogICAgIGF1
dG8qIHN0cnVjdHVyZSA9IEludGVybmFsRnVuY3Rpb246OmNyZWF0ZVN1YmNsYXNzU3RydWN0dXJl
KHN0YXRlLCBzdGF0ZS0+bmV3VGFyZ2V0KCksIGFzSW50ZXJuYWxGdW5jdGlvbihzdGF0ZS0+anND
YWxsZWUoKSktPmdsb2JhbE9iamVjdCgpLT5XZWJBc3NlbWJseU1vZHVsZVN0cnVjdHVyZSgpKTsK
QEAgLTk2LDE0ICsxMTEsOCBAQCBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBj
b25zCiAgICAgICAgICAgICByZXN1bHQtPnNldEpTRW50cnlwb2ludENhbGxlZSh2bSwgY2FsbGVl
SW5kZXgsIGpzRW50cnlwb2ludENhbGxlZSk7CiAgICAgICAgICAgICByZXN1bHQtPnNldFdhc21F
bnRyeXBvaW50Q2FsbGVlKHZtLCBjYWxsZWVJbmRleCwgd2FzbUVudHJ5cG9pbnRDYWxsZWUpOwog
ICAgICAgICB9KTsKLSAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHJlc3VsdCk7Ci19CiAKLXN0
YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNhbGxKU1dlYkFzc2VtYmx5TW9kdWxl
KEV4ZWNTdGF0ZSogc3RhdGUpCi17Ci0gICAgVk0mIHZtID0gc3RhdGUtPnZtKCk7Ci0gICAgYXV0
byBzY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOwotICAgIHJldHVybiBKU1ZhbHVlOjpl
bmNvZGUodGhyb3dDb25zdHJ1Y3RvckNhbm5vdEJlQ2FsbGVkQXNGdW5jdGlvblR5cGVFcnJvcihz
dGF0ZSwgc2NvcGUsICJXZWJBc3NlbWJseS5Nb2R1bGUiKSk7CisgICAgcmV0dXJuIHJlc3VsdDsK
IH0KIAogV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3RvciogV2ViQXNzZW1ibHlNb2R1bGVDb25z
dHJ1Y3Rvcjo6Y3JlYXRlKFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIFdlYkFzc2VtYmx5
TW9kdWxlUHJvdG90eXBlKiB0aGlzUHJvdG90eXBlKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0
b3IuaAkocmV2aXNpb24gMjA5ODg2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMv
V2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5oCSh3b3JraW5nIGNvcHkpCkBAIC00NCw2ICs0
NCw4IEBAIHB1YmxpYzoKIAogICAgIERFQ0xBUkVfSU5GTzsKIAorICAgIHN0YXRpYyBKU1ZhbHVl
IGNyZWF0ZU1vZHVsZShFeGVjU3RhdGUqKTsKKwogcHJvdGVjdGVkOgogICAgIHZvaWQgZmluaXNo
Q3JlYXRpb24oVk0mLCBXZWJBc3NlbWJseU1vZHVsZVByb3RvdHlwZSopOwogCkBAIC01NCw2ICs1
Niw3IEBAIHByaXZhdGU6CiAgICAgc3RhdGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBT
bG90VmlzaXRvciYpOwogfTsKIAorCiB9IC8vIG5hbWVzcGFjZSBKU0MKIAogI2VuZGlmIC8vIEVO
QUJMRShXRUJBU1NFTUJMWSkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297384</attachid>
            <date>2016-12-16 19:32:45 -0800</date>
            <delta_ts>2016-12-16 19:40:28 -0800</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>18070</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMDk5NTUpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE2IEBACisyMDE2LTEyLTE2ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUu
Y29tPgorCisgICAgICAgIFdlYkFzc2VtYmx5OiBJbXBsZW1lbnQgdGhlIFdlYkFzc2VtYmx5LmNv
bXBpbGUgYW5kIFdlYkFzc2VtYmx5LnZhbGlkYXRlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjU5MzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICAqIHdhc20vanMtYXBpL3Rlc3RfTW9kdWxlLmpzOgorICAg
ICAgICAoYXN5bmMudGVzdFByb21pc2VBUEkpOgorICAgICAgICAqIHdhc20vanMtYXBpL3Rlc3Rf
YmFzaWNfYXBpLmpzOgorICAgICAgICAqIHdhc20vanMtYXBpL3ZhbGlkYXRlLmpzOiBBZGRlZC4K
KyAgICAgICAgKGFzc2VydC50cnV0aHkuV2ViQXNzZW1ibHkudmFsaWRhdGUuYnVpbGRlci5XZWJB
c3NlbWJseSk6CisKIDIwMTYtMTItMTYgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgog
CiAgICAgICAgIERlLWR1cGxpY2F0ZSBmaW5hbGx5IGJsb2Nrcy4KSW5kZXg6IEpTVGVzdHMvd2Fz
bS9qcy1hcGkvdGVzdF9Nb2R1bGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSlNUZXN0cy93YXNtL2pzLWFw
aS90ZXN0X01vZHVsZS5qcwkocmV2aXNpb24gMjA5OTU1KQorKysgSlNUZXN0cy93YXNtL2pzLWFw
aS90ZXN0X01vZHVsZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMTcsMyArMTcsMzIgQEAgaW1wb3J0
IEJ1aWxkZXIgZnJvbSAnLi4vQnVpbGRlci5qcyc7CiAgICAgY29uc3QgYmluID0gYnVpbGRlci5X
ZWJBc3NlbWJseSgpLmdldCgpOwogICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBXZWJBc3NlbWJseS5N
b2R1bGUoYmluKTsKIH0pKCk7CisKK2xldCBkb25lID0gZmFsc2U7Cithc3luYyBmdW5jdGlvbiB0
ZXN0UHJvbWlzZUFQSSgpIHsKKyAgICAvLyBDYW4ndCBkZWNsYXJlIG1vcmUgdGhhbiBvbmUgbWVt
b3J5LgorICAgIGNvbnN0IGJ1aWxkZXIgPSAobmV3IEJ1aWxkZXIoKSkKKyAgICAgICAgLlR5cGUo
KS5FbmQoKQorICAgICAgICAuSW1wb3J0KCkuTWVtb3J5KCJpbXAiLCAibWVtb3J5Iiwge2luaXRp
YWw6IDIwfSkuRW5kKCkKKyAgICAgICAgLkZ1bmN0aW9uKCkuRW5kKCkKKyAgICAgICAgLk1lbW9y
eSgpLkluaXRpYWxNYXhQYWdlcygxLCAxKS5FbmQoKQorICAgICAgICAuRXhwb3J0KCkuRW5kKCkK
KyAgICAgICAgLkNvZGUoKQorICAgICAgICAuRW5kKCk7CisKKyAgICBsZXQgdGhyZXcgPSBmYWxz
ZTsKKyAgICB0cnkgeworICAgICAgICBhd2FpdCBXZWJBc3NlbWJseS5jb21waWxlKGJ1aWxkZXIu
V2ViQXNzZW1ibHkoKS5nZXQoKSk7CisgICAgfSBjYXRjaChlKSB7CisgICAgICAgIHRocmV3ID0g
dHJ1ZTsKKyAgICAgICAgYXNzZXJ0LnRydXRoeShlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuQ29t
cGlsZUVycm9yKTsKKyAgICAgICAgYXNzZXJ0LnRydXRoeShlLm1lc3NhZ2UgPT09ICJXZWJBc3Nl
bWJseS5Nb2R1bGUgZG9lc24ndCBwYXJzZSBhdCBieXRlIDM0IC8gNDM6IE1lbW9yeSBzZWN0aW9u
IGNhbm5vdCBleGlzdCBpZiBhbiBJbXBvcnQgaGFzIGEgbWVtb3J5IChldmFsdWF0aW5nICdXZWJB
c3NlbWJseS5jb21waWxlKGJ1aWxkZXIuV2ViQXNzZW1ibHkoKS5nZXQoKSknKSIpOworICAgIH0K
KyAgICBhc3NlcnQudHJ1dGh5KHRocmV3KTsKKworICAgIGRvbmUgPSB0cnVlOworfQorCit0ZXN0
UHJvbWlzZUFQSSgpOworZHJhaW5NaWNyb3Rhc2tzKCk7Cithc3NlcnQudHJ1dGh5KGRvbmUpOwpJ
bmRleDogSlNUZXN0cy93YXNtL2pzLWFwaS90ZXN0X2Jhc2ljX2FwaS5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBKU1Rlc3RzL3dhc20vanMtYXBpL3Rlc3RfYmFzaWNfYXBpLmpzCShyZXZpc2lvbiAyMDk5NTUp
CisrKyBKU1Rlc3RzL3dhc20vanMtYXBpL3Rlc3RfYmFzaWNfYXBpLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC05Nyw4ICs5NywzIEBAIGZvciAoY29uc3QgYyBpbiBjb25zdHJ1Y3RvclByb3BlcnRpZXMp
IHsKICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoYEltcGxlbWVudGF0aW9uIGVycm9yOiB1
bmV4cGVjdGVkIGNvbnN0cnVjdG9yIHByb3BlcnR5ICIke2N9ImApOwogICAgIH0KIH0KLQotLy8g
RklYTUUgSW1wbGVtZW50IGFuZCB0ZXN0IHRoZXNlIEFQSXMgZnVydGhlci4gRm9yIG5vdyB0aGV5
IGp1c3QgdGhyb3cuIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTk3
NzUKLWZvciAoY29uc3QgZiBpbiBmdW5jdGlvblByb3BlcnRpZXMpIHsKLSAgICBhc3NlcnQudGhy
b3dzKCgpID0+IFdlYkFzc2VtYmx5W2ZdKCksIEVycm9yLCBgV2ViQXNzZW1ibHkgZG9lc24ndCB5
ZXQgaW1wbGVtZW50IHRoZSAke2Z9IGZ1bmN0aW9uIHByb3BlcnR5YCk7Ci19CkluZGV4OiBKU1Rl
c3RzL3dhc20vanMtYXBpL3ZhbGlkYXRlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvd2FzbS9q
cy1hcGkvdmFsaWRhdGUuanMJKG5vbmV4aXN0ZW50KQorKysgSlNUZXN0cy93YXNtL2pzLWFwaS92
YWxpZGF0ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDI3IEBACitpbXBvcnQgKiBhcyBh
c3NlcnQgZnJvbSAnLi4vYXNzZXJ0LmpzJzsKK2ltcG9ydCBCdWlsZGVyIGZyb20gJy4uL0J1aWxk
ZXIuanMnOworCit7CisgICAgY29uc3QgYnVpbGRlciA9IChuZXcgQnVpbGRlcigpKQorICAgICAg
ICAuVHlwZSgpLkVuZCgpCisgICAgICAgIC5JbXBvcnQoKS5NZW1vcnkoImltcCIsICJtZW1vcnki
LCB7aW5pdGlhbDogMjB9KS5FbmQoKQorICAgICAgICAuRnVuY3Rpb24oKS5FbmQoKQorICAgICAg
ICAuTWVtb3J5KCkuSW5pdGlhbE1heFBhZ2VzKDEsIDEpLkVuZCgpCisgICAgICAgIC5FeHBvcnQo
KS5FbmQoKQorICAgICAgICAuQ29kZSgpCisgICAgICAgIC5FbmQoKTsKKworICAgIGFzc2VydC50
cnV0aHkoIVdlYkFzc2VtYmx5LnZhbGlkYXRlKGJ1aWxkZXIuV2ViQXNzZW1ibHkoKS5nZXQoKSkp
OworfQorCit7CisgICAgY29uc3QgYnVpbGRlciA9IChuZXcgQnVpbGRlcigpKQorICAgICAgICAu
VHlwZSgpLkVuZCgpCisgICAgICAgIC5JbXBvcnQoKS5NZW1vcnkoImltcCIsICJtZW1vcnkiLCB7
aW5pdGlhbDogMjB9KS5FbmQoKQorICAgICAgICAuRnVuY3Rpb24oKS5FbmQoKQorICAgICAgICAu
RXhwb3J0KCkuRW5kKCkKKyAgICAgICAgLkNvZGUoKQorICAgICAgICAuRW5kKCk7CisKKyAgICBh
c3NlcnQudHJ1dGh5KFdlYkFzc2VtYmx5LnZhbGlkYXRlKGJ1aWxkZXIuV2ViQXNzZW1ibHkoKS5n
ZXQoKSkpOworfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAyMDk5NTUp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDMgKzEsMjggQEAKKzIwMTYtMTItMTYgIFNhYW0gQmFyYXRpICA8c2JhcmF0aUBhcHBsZS5jb20+
CisKKyAgICAgICAgV2ViQXNzZW1ibHk6IEltcGxlbWVudCB0aGUgV2ViQXNzZW1ibHkuY29tcGls
ZSBhbmQgV2ViQXNzZW1ibHkudmFsaWRhdGUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTE2NTkzNgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFRoZSBBUElzIGFyZSBkb2N1bWVudGVkIGhlcmU6CisgICAgICAg
IC0gaHR0cHM6Ly9naXRodWIuY29tL1dlYkFzc2VtYmx5L2Rlc2lnbi9ibG9iL21hc3Rlci9KUy5t
ZCN3ZWJhc3NlbWJseWNvbXBpbGUKKyAgICAgICAgLSBodHRwczovL2dpdGh1Yi5jb20vV2ViQXNz
ZW1ibHkvZGVzaWduL2Jsb2IvbWFzdGVyL0pTLm1kI3dlYmFzc2VtYmx5dmFsaWRhdGUKKworICAg
ICAgICAqIHdhc20vSlNXZWJBc3NlbWJseS5jcHA6CisgICAgICAgIChKU0M6OndlYkFzc2VtYmx5
Q29tcGlsZUZ1bmMpOgorICAgICAgICAoSlNDOjp3ZWJBc3NlbWJseVZhbGlkYXRlRnVuYyk6Cisg
ICAgICAgIChKU0M6OkpTV2ViQXNzZW1ibHk6OmZpbmlzaENyZWF0aW9uKToKKyAgICAgICAgKiB3
YXNtL1dhc21QbGFuLmNwcDoKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6aXNWYWxpZE1vZHVs
ZSk6CisgICAgICAgIChKU0M6Oldhc206OlBsYW46OnJ1bik6CisgICAgICAgICogd2FzbS9XYXNt
UGxhbi5oOgorICAgICAgICAqIHdhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5j
cHA6CisgICAgICAgIChKU0M6OmNvbnN0cnVjdEpTV2ViQXNzZW1ibHlNb2R1bGUpOgorICAgICAg
ICAoSlNDOjpjYWxsSlNXZWJBc3NlbWJseU1vZHVsZSk6CisgICAgICAgIChKU0M6OldlYkFzc2Vt
Ymx5TW9kdWxlQ29uc3RydWN0b3I6OmNyZWF0ZU1vZHVsZSk6CisgICAgICAgICogd2FzbS9qcy9X
ZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmg6CisKIDIwMTYtMTItMTYgIFNhYW0gQmFyYXRp
ICA8c2JhcmF0aUBhcHBsZS5jb20+CiAKICAgICAgICAgV2ViQXNzZW1ibHk6IFdlIHN0aWxsIGhh
dmUgc29tZSBpbmNvcnJlY3QgcGFyc2luZyBwcm9kdWN0aW9ucyBpbnNpZGUgdW5yZWFjaGFibGUg
Y29kZQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vSlNXZWJBc3NlbWJseS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vSlNXZWJBc3NlbWJseS5j
cHAJKHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL0pTV2Vi
QXNzZW1ibHkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCwxMyArMjgsNjcgQEAKIAogI2lmIEVO
QUJMRShXRUJBU1NFTUJMWSkKIAorI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgogI2luY2x1ZGUgIkZ1
bmN0aW9uUHJvdG90eXBlLmgiCisjaW5jbHVkZSAiSlNBcnJheUJ1ZmZlci5oIgogI2luY2x1ZGUg
IkpTQ0lubGluZXMuaCIKKyNpbmNsdWRlICJKU1Byb21pc2VEZWZlcnJlZC5oIgorI2luY2x1ZGUg
Ildhc21QbGFuLmgiCisjaW5jbHVkZSAiV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5oIgog
CiBuYW1lc3BhY2UgSlNDIHsKIAogU1RBVElDX0FTU0VSVF9JU19UUklWSUFMTFlfREVTVFJVQ1RJ
QkxFKEpTV2ViQXNzZW1ibHkpOwogCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIHdlYkFz
c2VtYmx5VmFsaWRhdGVGdW5jKEV4ZWNTdGF0ZSopOworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCB3ZWJBc3NlbWJseUNvbXBpbGVGdW5jKEV4ZWNTdGF0ZSopOworCitFbmNvZGVkSlNWYWx1
ZSBKU0NfSE9TVF9DQUxMIHdlYkFzc2VtYmx5Q29tcGlsZUZ1bmMoRXhlY1N0YXRlKiBleGVjKQor
eworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgYXV0byBjYXRjaFNjb3BlID0gREVDTEFS
RV9DQVRDSF9TQ09QRSh2bSk7CisKKyAgICBKU1Byb21pc2VEZWZlcnJlZCogcHJvbWlzZSA9ICBK
U1Byb21pc2VEZWZlcnJlZDo6Y3JlYXRlKGV4ZWMsIGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3Qo
KSk7CisgICAgUkVUVVJOX0lGX0VYQ0VQVElPTihjYXRjaFNjb3BlLCB7IH0pOworCisgICAgSlNW
YWx1ZSBtb2R1bGUgPSBXZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yOjpjcmVhdGVNb2R1bGUo
ZXhlYyk7CisgICAgaWYgKEV4Y2VwdGlvbiogZXhjZXB0aW9uID0gY2F0Y2hTY29wZS5leGNlcHRp
b24oKSkgeworICAgICAgICBjYXRjaFNjb3BlLmNsZWFyRXhjZXB0aW9uKCk7CisgICAgICAgIHBy
b21pc2UtPnJlamVjdChleGVjLCBleGNlcHRpb24pOworICAgICAgICByZXR1cm4gSlNWYWx1ZTo6
ZW5jb2RlKHByb21pc2UtPnByb21pc2UoKSk7CisgICAgfQorCisgICAgcHJvbWlzZS0+cmVzb2x2
ZShleGVjLCBtb2R1bGUpOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUocHJvbWlzZS0+cHJv
bWlzZSgpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCB3ZWJBc3NlbWJseVZh
bGlkYXRlRnVuYyhFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsK
KyAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7CisKKyAgICBKU1ZhbHVl
IHZhbCA9IGV4ZWMtPmFyZ3VtZW50KDApOworCisgICAgLy8gSWYgdGhlIGdpdmVuIGJ5dGVzIGFy
Z3VtZW50IGlzIG5vdCBhIEJ1ZmZlclNvdXJjZSwgYSBUeXBlRXJyb3IgZXhjZXB0aW9uIGlzIHRo
cm93bi4KKyAgICBKU0FycmF5QnVmZmVyKiBhcnJheUJ1ZmZlciA9IHZhbC5nZXRPYmplY3QoKSA/
IGpzRHluYW1pY0Nhc3Q8SlNBcnJheUJ1ZmZlcio+KHZhbC5nZXRPYmplY3QoKSkgOiBudWxscHRy
OworICAgIEpTQXJyYXlCdWZmZXJWaWV3KiBhcnJheUJ1ZmZlclZpZXcgPSB2YWwuZ2V0T2JqZWN0
KCkgPyBqc0R5bmFtaWNDYXN0PEpTQXJyYXlCdWZmZXJWaWV3Kj4odmFsLmdldE9iamVjdCgpKSA6
IG51bGxwdHI7CisgICAgaWYgKCEoYXJyYXlCdWZmZXIgfHwgYXJyYXlCdWZmZXJWaWV3KSkgewor
ICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93RXhjZXB0aW9uKGV4ZWMsIHNjb3Bl
LCBjcmVhdGVUeXBlRXJyb3IoZXhlYywKKyAgICAgICAgICAgIEFTQ0lJTGl0ZXJhbCgiZmlyc3Qg
YXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheUJ1ZmZlclZpZXcgb3IgYW4gQXJyYXlCdWZmZXIiKSwg
ZGVmYXVsdFNvdXJjZUFwcGVuZGVyLCBydW50aW1lVHlwZUZvclZhbHVlKHZhbCkpKSk7CisgICAg
fQorCisgICAgaWYgKGFycmF5QnVmZmVyVmlldyA/IGFycmF5QnVmZmVyVmlldy0+aXNOZXV0ZXJl
ZCgpIDogYXJyYXlCdWZmZXItPmltcGwoKS0+aXNOZXV0ZXJlZCgpKSB7CisgICAgICAgIHJldHVy
biBKU1ZhbHVlOjplbmNvZGUodGhyb3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIGNyZWF0ZVR5cGVF
cnJvcihleGVjLAorICAgICAgICAgICAgQVNDSUlMaXRlcmFsKCJ1bmRlcmx5aW5nIFR5cGVkQXJy
YXkgaGFzIGJlZW4gZGV0YXRjaGVkIGZyb20gdGhlIEFycmF5QnVmZmVyIiksIGRlZmF1bHRTb3Vy
Y2VBcHBlbmRlciwgcnVudGltZVR5cGVGb3JWYWx1ZSh2YWwpKSkpOworICAgIH0KKworICAgIHNp
emVfdCBieXRlT2Zmc2V0ID0gYXJyYXlCdWZmZXJWaWV3ID8gYXJyYXlCdWZmZXJWaWV3LT5ieXRl
T2Zmc2V0KCkgOiAwOworICAgIHNpemVfdCBieXRlU2l6ZSA9IGFycmF5QnVmZmVyVmlldyA/IGFy
cmF5QnVmZmVyVmlldy0+bGVuZ3RoKCkgOiBhcnJheUJ1ZmZlci0+aW1wbCgpLT5ieXRlTGVuZ3Ro
KCk7CisgICAgY29uc3QgYXV0byogYmFzZSA9IGFycmF5QnVmZmVyVmlldyA/IHN0YXRpY19jYXN0
PHVpbnQ4X3QqPihhcnJheUJ1ZmZlclZpZXctPnZlY3RvcigpKSA6IHN0YXRpY19jYXN0PHVpbnQ4
X3QqPihhcnJheUJ1ZmZlci0+aW1wbCgpLT5kYXRhKCkpOworICAgIFdhc206OlBsYW4gcGxhbigm
dm0sIGJhc2UgKyBieXRlT2Zmc2V0LCBieXRlU2l6ZSk7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVu
Y29kZShqc0Jvb2xlYW4ocGxhbi5pc1ZhbGlkTW9kdWxlKCkpKTsKK30KKwogY29uc3QgQ2xhc3NJ
bmZvIEpTV2ViQXNzZW1ibHk6OnNfaW5mbyA9IHsgIldlYkFzc2VtYmx5IiwgJkJhc2U6OnNfaW5m
bywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShKU1dlYkFzc2VtYmx5KSB9OwogCiBKU1dlYkFzc2Vt
Ymx5KiBKU1dlYkFzc2VtYmx5OjpjcmVhdGUoVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFs
T2JqZWN0LCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSkKQEAgLTQ5LDEwICsxMDMsMTIgQEAgU3RydWN0
dXJlKiBKU1dlYkFzc2VtYmx5OjpjcmVhdGVTdHJ1Y3R1cgogICAgIHJldHVybiBTdHJ1Y3R1cmU6
OmNyZWF0ZSh2bSwgZ2xvYmFsT2JqZWN0LCBwcm90b3R5cGUsIFR5cGVJbmZvKE9iamVjdFR5cGUs
IFN0cnVjdHVyZUZsYWdzKSwgaW5mbygpKTsKIH0KIAotdm9pZCBKU1dlYkFzc2VtYmx5OjpmaW5p
c2hDcmVhdGlvbihWTSYgdm0sIEpTR2xvYmFsT2JqZWN0KikKK3ZvaWQgSlNXZWJBc3NlbWJseTo6
ZmluaXNoQ3JlYXRpb24oVk0mIHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQogewog
ICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKHZtKTsKICAgICBBU1NFUlQoaW5oZXJpdHMoaW5mbygp
KSk7CisgICAgSlNDX05BVElWRV9GVU5DVElPTl9XSVRIT1VUX1RSQU5TSVRJT04oInZhbGlkYXRl
Iiwgd2ViQXNzZW1ibHlWYWxpZGF0ZUZ1bmMsIERvbnRFbnVtLCAxKTsKKyAgICBKU0NfTkFUSVZF
X0ZVTkNUSU9OX1dJVEhPVVRfVFJBTlNJVElPTigiY29tcGlsZSIsIHdlYkFzc2VtYmx5Q29tcGls
ZUZ1bmMsIERvbnRFbnVtLCAxKTsKIH0KIAogSlNXZWJBc3NlbWJseTo6SlNXZWJBc3NlbWJseShW
TSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJlKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L3dhc20vV2FzbVBsYW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93
YXNtL1dhc21QbGFuLmNwcAkocmV2aXNpb24gMjA5OTU1KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vV2FzbVBsYW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OCwxNCArNTgsMTQgQEAg
UGxhbjo6UGxhbihWTSogdm0sIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZQogewogfQogCi12b2lkIFBs
YW46OnJ1bigpCitib29sIFBsYW46OmlzVmFsaWRNb2R1bGUoKQogewogICAgIHsKICAgICAgICAg
TW9kdWxlUGFyc2VyIG1vZHVsZVBhcnNlcihtX3ZtLCBtX3NvdXJjZSwgbV9zb3VyY2VMZW5ndGgp
OwogICAgICAgICBhdXRvIHBhcnNlUmVzdWx0ID0gbW9kdWxlUGFyc2VyLnBhcnNlKCk7CiAgICAg
ICAgIGlmICghcGFyc2VSZXN1bHQpIHsKICAgICAgICAgICAgIG1fZXJyb3JNZXNzYWdlID0gcGFy
c2VSZXN1bHQuZXJyb3IoKTsKLSAgICAgICAgICAgIHJldHVybjsgLy8gRklYTUUgcmV0dXJuIGFu
IEV4cGVjdGVkLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAg
IG1fbW9kdWxlSW5mb3JtYXRpb24gPSBXVEZNb3ZlKHBhcnNlUmVzdWx0LT5tb2R1bGUpOwogICAg
ICAgICBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeSA9IFdURk1vdmUocGFyc2VSZXN1bHQtPmZ1
bmN0aW9uTG9jYXRpb25JbkJpbmFyeSk7CkBAIC03Myw2ICs3MywzNCBAQCB2b2lkIFBsYW46OnJ1
bigpCiAgICAgICAgIG1fZnVuY3Rpb25JbmRleFNwYWNlLmJ1ZmZlciA9IHBhcnNlUmVzdWx0LT5m
dW5jdGlvbkluZGV4U3BhY2UucmVsZWFzZUJ1ZmZlcigpOwogICAgIH0KIAorICAgIGZvciAodW5z
aWduZWQgZnVuY3Rpb25JbmRleCA9IDA7IGZ1bmN0aW9uSW5kZXggPCBtX2Z1bmN0aW9uTG9jYXRp
b25JbkJpbmFyeS5zaXplKCk7ICsrZnVuY3Rpb25JbmRleCkgeworICAgICAgICBpZiAodmVyYm9z
ZSkKKyAgICAgICAgICAgIGRhdGFMb2dMbigiUHJvY2Vzc2luZyBmdW5jdGlvbiBzdGFydGluZyBh
dDogIiwgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uc3RhcnQsICIg
YW5kIGVuZGluZyBhdDogIiwgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRl
eF0uZW5kKTsKKyAgICAgICAgY29uc3QgdWludDhfdCogZnVuY3Rpb25TdGFydCA9IG1fc291cmNl
ICsgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uc3RhcnQ7CisgICAg
ICAgIHNpemVfdCBmdW5jdGlvbkxlbmd0aCA9IG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1
bmN0aW9uSW5kZXhdLmVuZCAtIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5k
ZXhdLnN0YXJ0OworICAgICAgICBBU1NFUlQoZnVuY3Rpb25MZW5ndGggPD0gbV9zb3VyY2VMZW5n
dGgpOworICAgICAgICBTaWduYXR1cmUqIHNpZ25hdHVyZSA9IG1fbW9kdWxlSW5mb3JtYXRpb24t
PmludGVybmFsRnVuY3Rpb25TaWduYXR1cmVzW2Z1bmN0aW9uSW5kZXhdOworCisgICAgICAgIGF1
dG8gdmFsaWRhdGVSZXN1bHQgPSB2YWxpZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uU3RhcnQsIGZ1bmN0
aW9uTGVuZ3RoLCBzaWduYXR1cmUsIG1fZnVuY3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1bGVJbmZv
cm1hdGlvbik7CisgICAgICAgIGlmICghdmFsaWRhdGVSZXN1bHQpIHsKKyAgICAgICAgICAgIGlm
ICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZ1
bmN0aW9uTGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coUmF3UG9pbnRl
cihyZWludGVycHJldF9jYXN0PHZvaWQqPihmdW5jdGlvblN0YXJ0W2ldKSksICIsICIpOworICAg
ICAgICAgICAgICAgIGRhdGFMb2dMbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9l
cnJvck1lc3NhZ2UgPSB2YWxpZGF0ZVJlc3VsdC5lcnJvcigpOyAvLyBGSVhNRSBtYWtlIHRoaXMg
YW4gRXhwZWN0ZWQuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQbGFuOjpydW4oKQoreworICAgIGlmICgh
aXNWYWxpZE1vZHVsZSgpKSAvLyBUaGlzIGFsc28gY29sbGVjdHMgYSBidW5jaCBvZiBpbmZvcm1h
dGlvbiBuZWVkZWQgdG8gZG8gdGhlIGFjdHVhbCBjb21waWxhdGlvbi4KKyAgICAgICAgcmV0dXJu
OworCiAgICAgYXV0byB0cnlSZXNlcnZlQ2FwYWNpdHkgPSBbdGhpc10gKGF1dG8mIHZlY3Rvciwg
c2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIHdoYXQpIHsKICAgICAgICAgaWYgKFVOTElLRUxZKCF2
ZWN0b3IudHJ5UmVzZXJ2ZUNhcGFjaXR5KHNpemUpKSkgewogICAgICAgICAgICAgU3RyaW5nQnVp
bGRlciBidWlsZGVyOwpAQCAtODQsNiArMTEyLDcgQEAgdm9pZCBQbGFuOjpydW4oKQogICAgICAg
ICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH07CisKICAgICBWZWN0b3I8VmVjdG9yPFVu
bGlua2VkV2FzbVRvV2FzbUNhbGw+PiB1bmxpbmtlZFdhc21Ub1dhc21DYWxsczsKICAgICBpZiAo
IXRyeVJlc2VydmVDYXBhY2l0eShtX3dhc21Ub0pTU3R1YnMsIG1fbW9kdWxlSW5mb3JtYXRpb24t
PmltcG9ydEZ1bmN0aW9ucy5zaXplKCksICIgV2ViQXNzZW1ibHkgdG8gSmF2YVNjcmlwdCBzdHVi
cyIpCiAgICAgICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHkodW5saW5rZWRXYXNtVG9XYXNtQ2Fs
bHMsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKSwgIiB1bmxpbmtlZCBXZWJBc3Nl
bWJseSB0byBXZWJBc3NlbWJseSBjYWxscyIpCkBAIC0xMTIsMTYgKzE0MSw3IEBAIHZvaWQgUGxh
bjo6cnVuKCkKICAgICAgICAgdW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlID0gbV93YXNtVG9K
U1N0dWJzLnNpemUoKSArIGZ1bmN0aW9uSW5kZXg7CiAgICAgICAgIEFTU0VSVChtX2Z1bmN0aW9u
SW5kZXhTcGFjZS5idWZmZXIuZ2V0KClbZnVuY3Rpb25JbmRleFNwYWNlXS5zaWduYXR1cmUgPT0g
c2lnbmF0dXJlKTsKIAotICAgICAgICBhdXRvIHZhbGlkYXRlUmVzdWx0ID0gdmFsaWRhdGVGdW5j
dGlvbihmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJlLCBtX2Z1bmN0aW9u
SW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pOwotICAgICAgICBpZiAoIXZhbGlkYXRl
UmVzdWx0KSB7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBmdW5jdGlvbkxlbmd0aDsgKytpKQotICAgICAgICAgICAg
ICAgICAgICBkYXRhTG9nKFJhd1BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZnVuY3Rp
b25TdGFydFtpXSkpLCAiLCAiKTsKLSAgICAgICAgICAgICAgICBkYXRhTG9nTG4oKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIG1fZXJyb3JNZXNzYWdlID0gdmFsaWRhdGVSZXN1bHQuZXJy
b3IoKTsgLy8gRklYTUUgbWFrZSB0aGlzIGFuIEV4cGVjdGVkLgotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICB9CisgICAgICAgIEFTU0VSVCh2YWxpZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uU3Rh
cnQsIGZ1bmN0aW9uTGVuZ3RoLCBzaWduYXR1cmUsIG1fZnVuY3Rpb25JbmRleFNwYWNlLCAqbV9t
b2R1bGVJbmZvcm1hdGlvbikpOwogCiAgICAgICAgIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLnVu
Y2hlY2tlZEFwcGVuZChWZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4oKSk7CiAgICAgICAg
IGF1dG8gcGFyc2VBbmRDb21waWxlUmVzdWx0ID0gcGFyc2VBbmRDb21waWxlKCptX3ZtLCBmdW5j
dGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJlLCB1bmxpbmtlZFdhc21Ub1dhc21D
YWxscy5hdChmdW5jdGlvbkluZGV4KSwgbV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUlu
Zm9ybWF0aW9uKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uaAkocmV2
aXNpb24gMjA5OTU1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uaAko
d29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgsOCBAQCBwdWJsaWM6CiAgICAgSlNfRVhQT1JUX1BS
SVZBVEUgUGxhbihWTSosIGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QpOwogICAgIEpTX0VYUE9SVF9Q
UklWQVRFIH5QbGFuKCk7CiAKKyAgICBib29sIGlzVmFsaWRNb2R1bGUoKTsKKwogICAgIEpTX0VY
UE9SVF9QUklWQVRFIHZvaWQgcnVuKCk7CiAKICAgICBKU19FWFBPUlRfUFJJVkFURSB2b2lkIGlu
aXRpYWxpemVDYWxsZWVzKEpTR2xvYmFsT2JqZWN0Kiwgc3RkOjpmdW5jdGlvbjx2b2lkKHVuc2ln
bmVkLCBKU1dlYkFzc2VtYmx5Q2FsbGVlKiwgSlNXZWJBc3NlbWJseUNhbGxlZSopPik7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVj
dG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJB
c3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gMjA5OTU1KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTUyLDcgKzUyLDE5IEBAIGNvbnN0IENsYXNzSW5mbyBXZWJBc3Nl
bWJseU1vZHVsZUNvbnN0cnUKICBAZW5kCiAgKi8KIAotc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpT
Q19IT1NUX0NBTEwgY29uc3RydWN0SlNXZWJBc3NlbWJseU1vZHVsZShFeGVjU3RhdGUqIHN0YXRl
KQorc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29uc3RydWN0SlNXZWJBc3Nl
bWJseU1vZHVsZShFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29k
ZShXZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yOjpjcmVhdGVNb2R1bGUoZXhlYykpOworfQor
CitzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjYWxsSlNXZWJBc3NlbWJseU1v
ZHVsZShFeGVjU3RhdGUqIHN0YXRlKQoreworICAgIFZNJiB2bSA9IHN0YXRlLT52bSgpOworICAg
IGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKHZtKTsKKyAgICByZXR1cm4gSlNWYWx1
ZTo6ZW5jb2RlKHRocm93Q29uc3RydWN0b3JDYW5ub3RCZUNhbGxlZEFzRnVuY3Rpb25UeXBlRXJy
b3Ioc3RhdGUsIHNjb3BlLCAiV2ViQXNzZW1ibHkuTW9kdWxlIikpOworfQorCitKU1ZhbHVlIFdl
YkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3I6OmNyZWF0ZU1vZHVsZShFeGVjU3RhdGUqIHN0YXRl
KQogewogICAgIFZNJiB2bSA9IHN0YXRlLT52bSgpOwogICAgIGF1dG8gc2NvcGUgPSBERUNMQVJF
X1RIUk9XX1NDT1BFKHZtKTsKQEAgLTYxLDExICs3MywxMyBAQCBzdGF0aWMgRW5jb2RlZEpTVmFs
dWUgSlNDX0hPU1RfQ0FMTCBjb25zCiAgICAgLy8gSWYgdGhlIGdpdmVuIGJ5dGVzIGFyZ3VtZW50
IGlzIG5vdCBhIEJ1ZmZlclNvdXJjZSwgYSBUeXBlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi4K
ICAgICBKU0FycmF5QnVmZmVyKiBhcnJheUJ1ZmZlciA9IHZhbC5nZXRPYmplY3QoKSA/IGpzRHlu
YW1pY0Nhc3Q8SlNBcnJheUJ1ZmZlcio+KHZhbC5nZXRPYmplY3QoKSkgOiBudWxscHRyOwogICAg
IEpTQXJyYXlCdWZmZXJWaWV3KiBhcnJheUJ1ZmZlclZpZXcgPSB2YWwuZ2V0T2JqZWN0KCkgPyBq
c0R5bmFtaWNDYXN0PEpTQXJyYXlCdWZmZXJWaWV3Kj4odmFsLmdldE9iamVjdCgpKSA6IG51bGxw
dHI7Ci0gICAgaWYgKCEoYXJyYXlCdWZmZXIgfHwgYXJyYXlCdWZmZXJWaWV3KSkKLSAgICAgICAg
cmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd0V4Y2VwdGlvbihzdGF0ZSwgc2NvcGUsIGNyZWF0
ZVR5cGVFcnJvcihzdGF0ZSwgQVNDSUlMaXRlcmFsKCJmaXJzdCBhcmd1bWVudCB0byBXZWJBc3Nl
bWJseS5Nb2R1bGUgbXVzdCBiZSBhbiBBcnJheUJ1ZmZlclZpZXcgb3IgYW4gQXJyYXlCdWZmZXIi
KSwgZGVmYXVsdFNvdXJjZUFwcGVuZGVyLCBydW50aW1lVHlwZUZvclZhbHVlKHZhbCkpKSk7Cisg
ICAgaWYgKCEoYXJyYXlCdWZmZXIgfHwgYXJyYXlCdWZmZXJWaWV3KSkgeworICAgICAgICByZXR1
cm4gdGhyb3dFeGNlcHRpb24oc3RhdGUsIHNjb3BlLCBjcmVhdGVUeXBlRXJyb3Ioc3RhdGUsIEFT
Q0lJTGl0ZXJhbCgiZmlyc3QgYXJndW1lbnQgdG8gV2ViQXNzZW1ibHkuTW9kdWxlIG11c3QgYmUg
YW4gQXJyYXlCdWZmZXJWaWV3IG9yIGFuIEFycmF5QnVmZmVyIiksIGRlZmF1bHRTb3VyY2VBcHBl
bmRlciwgcnVudGltZVR5cGVGb3JWYWx1ZSh2YWwpKSk7CisgICAgfQogCi0gICAgaWYgKGFycmF5
QnVmZmVyVmlldyA/IGFycmF5QnVmZmVyVmlldy0+aXNOZXV0ZXJlZCgpIDogYXJyYXlCdWZmZXIt
PmltcGwoKS0+aXNOZXV0ZXJlZCgpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRo
cm93RXhjZXB0aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRlVHlwZUVycm9yKHN0YXRlLCBBU0NJSUxp
dGVyYWwoInVuZGVybHlpbmcgVHlwZWRBcnJheSBoYXMgYmVlbiBkZXRhdGNoZWQgZnJvbSB0aGUg
QXJyYXlCdWZmZXIiKSwgZGVmYXVsdFNvdXJjZUFwcGVuZGVyLCBydW50aW1lVHlwZUZvclZhbHVl
KHZhbCkpKSk7CisgICAgaWYgKGFycmF5QnVmZmVyVmlldyA/IGFycmF5QnVmZmVyVmlldy0+aXNO
ZXV0ZXJlZCgpIDogYXJyYXlCdWZmZXItPmltcGwoKS0+aXNOZXV0ZXJlZCgpKSB7CisgICAgICAg
IHJldHVybiB0aHJvd0V4Y2VwdGlvbihzdGF0ZSwgc2NvcGUsIGNyZWF0ZVR5cGVFcnJvcihzdGF0
ZSwgQVNDSUlMaXRlcmFsKCJ1bmRlcmx5aW5nIFR5cGVkQXJyYXkgaGFzIGJlZW4gZGV0YXRjaGVk
IGZyb20gdGhlIEFycmF5QnVmZmVyIiksIGRlZmF1bHRTb3VyY2VBcHBlbmRlciwgcnVudGltZVR5
cGVGb3JWYWx1ZSh2YWwpKSk7CisgICAgfQogCiAgICAgc2l6ZV90IGJ5dGVPZmZzZXQgPSBhcnJh
eUJ1ZmZlclZpZXcgPyBhcnJheUJ1ZmZlclZpZXctPmJ5dGVPZmZzZXQoKSA6IDA7CiAgICAgc2l6
ZV90IGJ5dGVTaXplID0gYXJyYXlCdWZmZXJWaWV3ID8gYXJyYXlCdWZmZXJWaWV3LT5sZW5ndGgo
KSA6IGFycmF5QnVmZmVyLT5pbXBsKCktPmJ5dGVMZW5ndGgoKTsKQEAgLTc0LDggKzg4LDkgQEAg
c3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29ucwogICAgIFdhc206OlBsYW4g
cGxhbigmdm0sIGJhc2UgKyBieXRlT2Zmc2V0LCBieXRlU2l6ZSk7CiAgICAgLy8gT24gZmFpbHVy
ZSwgYSBuZXcgV2ViQXNzZW1ibHkuQ29tcGlsZUVycm9yIGlzIHRocm93bi4KICAgICBwbGFuLnJ1
bigpOwotICAgIGlmIChwbGFuLmZhaWxlZCgpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5j
b2RlKHRocm93RXhjZXB0aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRlV2ViQXNzZW1ibHlDb21waWxl
RXJyb3Ioc3RhdGUsIHBsYW4uZXJyb3JNZXNzYWdlKCkpKSk7CisgICAgaWYgKHBsYW4uZmFpbGVk
KCkpIHsKKyAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRl
V2ViQXNzZW1ibHlDb21waWxlRXJyb3Ioc3RhdGUsIHBsYW4uZXJyb3JNZXNzYWdlKCkpKTsKKyAg
ICB9CiAKICAgICAvLyBPbiBzdWNjZXNzLCBhIG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUgb2JqZWN0
IGlzIHJldHVybmVkIHdpdGggW1tNb2R1bGVdXSBzZXQgdG8gdGhlIHZhbGlkYXRlZCBBc3QubW9k
dWxlLgogICAgIGF1dG8qIHN0cnVjdHVyZSA9IEludGVybmFsRnVuY3Rpb246OmNyZWF0ZVN1YmNs
YXNzU3RydWN0dXJlKHN0YXRlLCBzdGF0ZS0+bmV3VGFyZ2V0KCksIGFzSW50ZXJuYWxGdW5jdGlv
bihzdGF0ZS0+anNDYWxsZWUoKSktPmdsb2JhbE9iamVjdCgpLT5XZWJBc3NlbWJseU1vZHVsZVN0
cnVjdHVyZSgpKTsKQEAgLTk2LDE0ICsxMTEsOCBAQCBzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlND
X0hPU1RfQ0FMTCBjb25zCiAgICAgICAgICAgICByZXN1bHQtPnNldEpTRW50cnlwb2ludENhbGxl
ZSh2bSwgY2FsbGVlSW5kZXgsIGpzRW50cnlwb2ludENhbGxlZSk7CiAgICAgICAgICAgICByZXN1
bHQtPnNldFdhc21FbnRyeXBvaW50Q2FsbGVlKHZtLCBjYWxsZWVJbmRleCwgd2FzbUVudHJ5cG9p
bnRDYWxsZWUpOwogICAgICAgICB9KTsKLSAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHJlc3Vs
dCk7Ci19CiAKLXN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNhbGxKU1dlYkFz
c2VtYmx5TW9kdWxlKEV4ZWNTdGF0ZSogc3RhdGUpCi17Ci0gICAgVk0mIHZtID0gc3RhdGUtPnZt
KCk7Ci0gICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOwotICAgIHJldHVy
biBKU1ZhbHVlOjplbmNvZGUodGhyb3dDb25zdHJ1Y3RvckNhbm5vdEJlQ2FsbGVkQXNGdW5jdGlv
blR5cGVFcnJvcihzdGF0ZSwgc2NvcGUsICJXZWJBc3NlbWJseS5Nb2R1bGUiKSk7CisgICAgcmV0
dXJuIHJlc3VsdDsKIH0KIAogV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3RvciogV2ViQXNzZW1i
bHlNb2R1bGVDb25zdHJ1Y3Rvcjo6Y3JlYXRlKFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUs
IFdlYkFzc2VtYmx5TW9kdWxlUHJvdG90eXBlKiB0aGlzUHJvdG90eXBlKQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5TW9k
dWxlQ29uc3RydWN0b3IuaAkocmV2aXNpb24gMjA5OTU1KQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5oCSh3b3JraW5nIGNvcHkp
CkBAIC00NCw2ICs0NCw4IEBAIHB1YmxpYzoKIAogICAgIERFQ0xBUkVfSU5GTzsKIAorICAgIHN0
YXRpYyBKU1ZhbHVlIGNyZWF0ZU1vZHVsZShFeGVjU3RhdGUqKTsKKwogcHJvdGVjdGVkOgogICAg
IHZvaWQgZmluaXNoQ3JlYXRpb24oVk0mLCBXZWJBc3NlbWJseU1vZHVsZVByb3RvdHlwZSopOwog
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297386</attachid>
            <date>2016-12-16 19:40:28 -0800</date>
            <delta_ts>2016-12-16 19:49:19 -0800</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>18822</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMDk5NTUpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE2IEBACisyMDE2LTEyLTE2ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUu
Y29tPgorCisgICAgICAgIFdlYkFzc2VtYmx5OiBJbXBsZW1lbnQgdGhlIFdlYkFzc2VtYmx5LmNv
bXBpbGUgYW5kIFdlYkFzc2VtYmx5LnZhbGlkYXRlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjU5MzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICAqIHdhc20vanMtYXBpL3Rlc3RfTW9kdWxlLmpzOgorICAg
ICAgICAoYXN5bmMudGVzdFByb21pc2VBUEkpOgorICAgICAgICAqIHdhc20vanMtYXBpL3Rlc3Rf
YmFzaWNfYXBpLmpzOgorICAgICAgICAqIHdhc20vanMtYXBpL3ZhbGlkYXRlLmpzOiBBZGRlZC4K
KyAgICAgICAgKGFzc2VydC50cnV0aHkuV2ViQXNzZW1ibHkudmFsaWRhdGUuYnVpbGRlci5XZWJB
c3NlbWJseSk6CisKIDIwMTYtMTItMTYgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgog
CiAgICAgICAgIERlLWR1cGxpY2F0ZSBmaW5hbGx5IGJsb2Nrcy4KSW5kZXg6IEpTVGVzdHMvd2Fz
bS9qcy1hcGkvdGVzdF9Nb2R1bGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSlNUZXN0cy93YXNtL2pzLWFw
aS90ZXN0X01vZHVsZS5qcwkocmV2aXNpb24gMjA5OTU1KQorKysgSlNUZXN0cy93YXNtL2pzLWFw
aS90ZXN0X01vZHVsZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMTcsMyArMTcsNDcgQEAgaW1wb3J0
IEJ1aWxkZXIgZnJvbSAnLi4vQnVpbGRlci5qcyc7CiAgICAgY29uc3QgYmluID0gYnVpbGRlci5X
ZWJBc3NlbWJseSgpLmdldCgpOwogICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBXZWJBc3NlbWJseS5N
b2R1bGUoYmluKTsKIH0pKCk7CisKK2xldCBkb25lID0gZmFsc2U7Cithc3luYyBmdW5jdGlvbiB0
ZXN0UHJvbWlzZUFQSSgpIHsKKyAgICB7CisgICAgICAgIC8vIENhbid0IGRlY2xhcmUgbW9yZSB0
aGFuIG9uZSBtZW1vcnkuCisgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSAobmV3IEJ1aWxkZXIoKSkK
KyAgICAgICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgICAgIC5JbXBvcnQoKS5NZW1vcnko
ImltcCIsICJtZW1vcnkiLCB7aW5pdGlhbDogMjB9KS5FbmQoKQorICAgICAgICAgICAgLkZ1bmN0
aW9uKCkuRW5kKCkKKyAgICAgICAgICAgIC5NZW1vcnkoKS5Jbml0aWFsTWF4UGFnZXMoMSwgMSku
RW5kKCkKKyAgICAgICAgICAgIC5FeHBvcnQoKS5FbmQoKQorICAgICAgICAgICAgLkNvZGUoKQor
ICAgICAgICAgICAgLkVuZCgpOworCisgICAgICAgIGxldCB0aHJldyA9IGZhbHNlOworICAgICAg
ICB0cnkgeworICAgICAgICAgICAgYXdhaXQgV2ViQXNzZW1ibHkuY29tcGlsZShidWlsZGVyLldl
YkFzc2VtYmx5KCkuZ2V0KCkpOworICAgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgICAgIHRo
cmV3ID0gdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydC50cnV0aHkoZSBpbnN0YW5jZW9mIFdlYkFz
c2VtYmx5LkNvbXBpbGVFcnJvcik7CisgICAgICAgICAgICBhc3NlcnQudHJ1dGh5KGUubWVzc2Fn
ZSA9PT0gIldlYkFzc2VtYmx5Lk1vZHVsZSBkb2Vzbid0IHBhcnNlIGF0IGJ5dGUgMzQgLyA0Mzog
TWVtb3J5IHNlY3Rpb24gY2Fubm90IGV4aXN0IGlmIGFuIEltcG9ydCBoYXMgYSBtZW1vcnkgKGV2
YWx1YXRpbmcgJ1dlYkFzc2VtYmx5LmNvbXBpbGUoYnVpbGRlci5XZWJBc3NlbWJseSgpLmdldCgp
KScpIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0LnRydXRoeSh0aHJldyk7CisgICAgfQor
CisgICAgeworICAgICAgICBjb25zdCBidWlsZGVyID0gKG5ldyBCdWlsZGVyKCkpCisgICAgICAg
ICAgICAuVHlwZSgpLkVuZCgpCisgICAgICAgICAgICAuSW1wb3J0KCkuTWVtb3J5KCJpbXAiLCAi
bWVtb3J5Iiwge2luaXRpYWw6IDIwfSkuRW5kKCkKKyAgICAgICAgICAgIC5GdW5jdGlvbigpLkVu
ZCgpCisgICAgICAgICAgICAuRXhwb3J0KCkuRW5kKCkKKyAgICAgICAgICAgIC5Db2RlKCkKKyAg
ICAgICAgICAgIC5FbmQoKTsKKworICAgICAgICBsZXQgbW9kdWxlID0gYXdhaXQgV2ViQXNzZW1i
bHkuY29tcGlsZShidWlsZGVyLldlYkFzc2VtYmx5KCkuZ2V0KCkpOworICAgICAgICBhc3NlcnQu
dHJ1dGh5KG1vZHVsZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lk1vZHVsZSk7CisgICAgfQorCisg
ICAgZG9uZSA9IHRydWU7Cit9CisKK3Rlc3RQcm9taXNlQVBJKCk7CitkcmFpbk1pY3JvdGFza3Mo
KTsKK2Fzc2VydC50cnV0aHkoZG9uZSk7CkluZGV4OiBKU1Rlc3RzL3dhc20vanMtYXBpL3Rlc3Rf
YmFzaWNfYXBpLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvd2FzbS9qcy1hcGkvdGVzdF9iYXNp
Y19hcGkuanMJKHJldmlzaW9uIDIwOTk1NSkKKysrIEpTVGVzdHMvd2FzbS9qcy1hcGkvdGVzdF9i
YXNpY19hcGkuanMJKHdvcmtpbmcgY29weSkKQEAgLTk3LDggKzk3LDMgQEAgZm9yIChjb25zdCBj
IGluIGNvbnN0cnVjdG9yUHJvcGVydGllcykgewogICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJv
cihgSW1wbGVtZW50YXRpb24gZXJyb3I6IHVuZXhwZWN0ZWQgY29uc3RydWN0b3IgcHJvcGVydHkg
IiR7Y30iYCk7CiAgICAgfQogfQotCi0vLyBGSVhNRSBJbXBsZW1lbnQgYW5kIHRlc3QgdGhlc2Ug
QVBJcyBmdXJ0aGVyLiBGb3Igbm93IHRoZXkganVzdCB0aHJvdy4gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE1OTc3NQotZm9yIChjb25zdCBmIGluIGZ1bmN0aW9uUHJv
cGVydGllcykgewotICAgIGFzc2VydC50aHJvd3MoKCkgPT4gV2ViQXNzZW1ibHlbZl0oKSwgRXJy
b3IsIGBXZWJBc3NlbWJseSBkb2Vzbid0IHlldCBpbXBsZW1lbnQgdGhlICR7Zn0gZnVuY3Rpb24g
cHJvcGVydHlgKTsKLX0KSW5kZXg6IEpTVGVzdHMvd2FzbS9qcy1hcGkvdmFsaWRhdGUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSlNUZXN0cy93YXNtL2pzLWFwaS92YWxpZGF0ZS5qcwkobm9uZXhpc3RlbnQp
CisrKyBKU1Rlc3RzL3dhc20vanMtYXBpL3ZhbGlkYXRlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMjcgQEAKK2ltcG9ydCAqIGFzIGFzc2VydCBmcm9tICcuLi9hc3NlcnQuanMnOworaW1w
b3J0IEJ1aWxkZXIgZnJvbSAnLi4vQnVpbGRlci5qcyc7CisKK3sKKyAgICBjb25zdCBidWlsZGVy
ID0gKG5ldyBCdWlsZGVyKCkpCisgICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgLkltcG9y
dCgpLk1lbW9yeSgiaW1wIiwgIm1lbW9yeSIsIHtpbml0aWFsOiAyMH0pLkVuZCgpCisgICAgICAg
IC5GdW5jdGlvbigpLkVuZCgpCisgICAgICAgIC5NZW1vcnkoKS5Jbml0aWFsTWF4UGFnZXMoMSwg
MSkuRW5kKCkKKyAgICAgICAgLkV4cG9ydCgpLkVuZCgpCisgICAgICAgIC5Db2RlKCkKKyAgICAg
ICAgLkVuZCgpOworCisgICAgYXNzZXJ0LnRydXRoeSghV2ViQXNzZW1ibHkudmFsaWRhdGUoYnVp
bGRlci5XZWJBc3NlbWJseSgpLmdldCgpKSk7Cit9CisKK3sKKyAgICBjb25zdCBidWlsZGVyID0g
KG5ldyBCdWlsZGVyKCkpCisgICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgLkltcG9ydCgp
Lk1lbW9yeSgiaW1wIiwgIm1lbW9yeSIsIHtpbml0aWFsOiAyMH0pLkVuZCgpCisgICAgICAgIC5G
dW5jdGlvbigpLkVuZCgpCisgICAgICAgIC5FeHBvcnQoKS5FbmQoKQorICAgICAgICAuQ29kZSgp
CisgICAgICAgIC5FbmQoKTsKKworICAgIGFzc2VydC50cnV0aHkoV2ViQXNzZW1ibHkudmFsaWRh
dGUoYnVpbGRlci5XZWJBc3NlbWJseSgpLmdldCgpKSk7Cit9CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9D
aGFuZ2VMb2cJKHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFu
Z2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyOCBAQAorMjAxNi0xMi0xNiAgU2FhbSBC
YXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KKworICAgICAgICBXZWJBc3NlbWJseTogSW1wbGVt
ZW50IHRoZSBXZWJBc3NlbWJseS5jb21waWxlIGFuZCBXZWJBc3NlbWJseS52YWxpZGF0ZQorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY1OTM2CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhlIEFQSXMgYXJl
IGRvY3VtZW50ZWQgaGVyZToKKyAgICAgICAgLSBodHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1i
bHkvZGVzaWduL2Jsb2IvbWFzdGVyL0pTLm1kI3dlYmFzc2VtYmx5Y29tcGlsZQorICAgICAgICAt
IGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9kZXNpZ24vYmxvYi9tYXN0ZXIvSlMubWQj
d2ViYXNzZW1ibHl2YWxpZGF0ZQorCisgICAgICAgICogd2FzbS9KU1dlYkFzc2VtYmx5LmNwcDoK
KyAgICAgICAgKEpTQzo6d2ViQXNzZW1ibHlDb21waWxlRnVuYyk6CisgICAgICAgIChKU0M6Ondl
YkFzc2VtYmx5VmFsaWRhdGVGdW5jKToKKyAgICAgICAgKEpTQzo6SlNXZWJBc3NlbWJseTo6Zmlu
aXNoQ3JlYXRpb24pOgorICAgICAgICAqIHdhc20vV2FzbVBsYW4uY3BwOgorICAgICAgICAoSlND
OjpXYXNtOjpQbGFuOjppc1ZhbGlkTW9kdWxlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6
cnVuKToKKyAgICAgICAgKiB3YXNtL1dhc21QbGFuLmg6CisgICAgICAgICogd2FzbS9qcy9XZWJB
c3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6Y29uc3RydWN0SlNX
ZWJBc3NlbWJseU1vZHVsZSk6CisgICAgICAgIChKU0M6OmNhbGxKU1dlYkFzc2VtYmx5TW9kdWxl
KToKKyAgICAgICAgKEpTQzo6V2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvcjo6Y3JlYXRlTW9k
dWxlKToKKyAgICAgICAgKiB3YXNtL2pzL1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuaDoK
KwogMjAxNi0xMi0xNiAgU2FhbSBCYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KIAogICAgICAg
ICBXZWJBc3NlbWJseTogV2Ugc3RpbGwgaGF2ZSBzb21lIGluY29ycmVjdCBwYXJzaW5nIHByb2R1
Y3Rpb25zIGluc2lkZSB1bnJlYWNoYWJsZSBjb2RlCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9KU1dlYkFzc2VtYmx5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9KU1dlYkFzc2VtYmx5LmNwcAkocmV2aXNpb24gMjA5OTU1KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vSlNXZWJBc3NlbWJseS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI4LDEzICsyOCw2NyBAQAogCiAjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQogCisjaW5jbHVkZSAi
RXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiRnVuY3Rpb25Qcm90b3R5cGUuaCIKKyNpbmNsdWRlICJK
U0FycmF5QnVmZmVyLmgiCiAjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgorI2luY2x1ZGUgIkpTUHJv
bWlzZURlZmVycmVkLmgiCisjaW5jbHVkZSAiV2FzbVBsYW4uaCIKKyNpbmNsdWRlICJXZWJBc3Nl
bWJseU1vZHVsZUNvbnN0cnVjdG9yLmgiCiAKIG5hbWVzcGFjZSBKU0MgewogCiBTVEFUSUNfQVNT
RVJUX0lTX1RSSVZJQUxMWV9ERVNUUlVDVElCTEUoSlNXZWJBc3NlbWJseSk7CiAKK0VuY29kZWRK
U1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlWYWxpZGF0ZUZ1bmMoRXhlY1N0YXRlKik7
CitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIHdlYkFzc2VtYmx5Q29tcGlsZUZ1bmMoRXhl
Y1N0YXRlKik7CisKK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlDb21w
aWxlRnVuYyhFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKKyAg
ICBhdXRvIGNhdGNoU2NvcGUgPSBERUNMQVJFX0NBVENIX1NDT1BFKHZtKTsKKworICAgIEpTUHJv
bWlzZURlZmVycmVkKiBwcm9taXNlID0gIEpTUHJvbWlzZURlZmVycmVkOjpjcmVhdGUoZXhlYywg
ZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpKTsKKyAgICBSRVRVUk5fSUZfRVhDRVBUSU9OKGNh
dGNoU2NvcGUsIHsgfSk7CisKKyAgICBKU1ZhbHVlIG1vZHVsZSA9IFdlYkFzc2VtYmx5TW9kdWxl
Q29uc3RydWN0b3I6OmNyZWF0ZU1vZHVsZShleGVjKTsKKyAgICBpZiAoRXhjZXB0aW9uKiBleGNl
cHRpb24gPSBjYXRjaFNjb3BlLmV4Y2VwdGlvbigpKSB7CisgICAgICAgIGNhdGNoU2NvcGUuY2xl
YXJFeGNlcHRpb24oKTsKKyAgICAgICAgcHJvbWlzZS0+cmVqZWN0KGV4ZWMsIGV4Y2VwdGlvbik7
CisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUocHJvbWlzZS0+cHJvbWlzZSgpKTsKKyAg
ICB9CisKKyAgICBwcm9taXNlLT5yZXNvbHZlKGV4ZWMsIG1vZHVsZSk7CisgICAgcmV0dXJuIEpT
VmFsdWU6OmVuY29kZShwcm9taXNlLT5wcm9taXNlKCkpOworfQorCitFbmNvZGVkSlNWYWx1ZSBK
U0NfSE9TVF9DQUxMIHdlYkFzc2VtYmx5VmFsaWRhdGVGdW5jKEV4ZWNTdGF0ZSogZXhlYykKK3sK
KyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9X
X1NDT1BFKHZtKTsKKworICAgIEpTVmFsdWUgdmFsID0gZXhlYy0+YXJndW1lbnQoMCk7CisKKyAg
ICAvLyBJZiB0aGUgZ2l2ZW4gYnl0ZXMgYXJndW1lbnQgaXMgbm90IGEgQnVmZmVyU291cmNlLCBh
IFR5cGVFcnJvciBleGNlcHRpb24gaXMgdGhyb3duLgorICAgIEpTQXJyYXlCdWZmZXIqIGFycmF5
QnVmZmVyID0gdmFsLmdldE9iamVjdCgpID8ganNEeW5hbWljQ2FzdDxKU0FycmF5QnVmZmVyKj4o
dmFsLmdldE9iamVjdCgpKSA6IG51bGxwdHI7CisgICAgSlNBcnJheUJ1ZmZlclZpZXcqIGFycmF5
QnVmZmVyVmlldyA9IHZhbC5nZXRPYmplY3QoKSA/IGpzRHluYW1pY0Nhc3Q8SlNBcnJheUJ1ZmZl
clZpZXcqPih2YWwuZ2V0T2JqZWN0KCkpIDogbnVsbHB0cjsKKyAgICBpZiAoIShhcnJheUJ1ZmZl
ciB8fCBhcnJheUJ1ZmZlclZpZXcpKSB7CisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUo
dGhyb3dFeGNlcHRpb24oZXhlYywgc2NvcGUsIGNyZWF0ZVR5cGVFcnJvcihleGVjLAorICAgICAg
ICAgICAgQVNDSUlMaXRlcmFsKCJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5QnVmZmVy
VmlldyBvciBhbiBBcnJheUJ1ZmZlciIpLCBkZWZhdWx0U291cmNlQXBwZW5kZXIsIHJ1bnRpbWVU
eXBlRm9yVmFsdWUodmFsKSkpKTsKKyAgICB9CisKKyAgICBpZiAoYXJyYXlCdWZmZXJWaWV3ID8g
YXJyYXlCdWZmZXJWaWV3LT5pc05ldXRlcmVkKCkgOiBhcnJheUJ1ZmZlci0+aW1wbCgpLT5pc05l
dXRlcmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd0V4Y2VwdGlv
bihleGVjLCBzY29wZSwgY3JlYXRlVHlwZUVycm9yKGV4ZWMsCisgICAgICAgICAgICBBU0NJSUxp
dGVyYWwoInVuZGVybHlpbmcgVHlwZWRBcnJheSBoYXMgYmVlbiBkZXRhdGNoZWQgZnJvbSB0aGUg
QXJyYXlCdWZmZXIiKSwgZGVmYXVsdFNvdXJjZUFwcGVuZGVyLCBydW50aW1lVHlwZUZvclZhbHVl
KHZhbCkpKSk7CisgICAgfQorCisgICAgc2l6ZV90IGJ5dGVPZmZzZXQgPSBhcnJheUJ1ZmZlclZp
ZXcgPyBhcnJheUJ1ZmZlclZpZXctPmJ5dGVPZmZzZXQoKSA6IDA7CisgICAgc2l6ZV90IGJ5dGVT
aXplID0gYXJyYXlCdWZmZXJWaWV3ID8gYXJyYXlCdWZmZXJWaWV3LT5sZW5ndGgoKSA6IGFycmF5
QnVmZmVyLT5pbXBsKCktPmJ5dGVMZW5ndGgoKTsKKyAgICBjb25zdCBhdXRvKiBiYXNlID0gYXJy
YXlCdWZmZXJWaWV3ID8gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGFycmF5QnVmZmVyVmlldy0+dmVj
dG9yKCkpIDogc3RhdGljX2Nhc3Q8dWludDhfdCo+KGFycmF5QnVmZmVyLT5pbXBsKCktPmRhdGEo
KSk7CisgICAgV2FzbTo6UGxhbiBwbGFuKCZ2bSwgYmFzZSArIGJ5dGVPZmZzZXQsIGJ5dGVTaXpl
KTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzQm9vbGVhbihwbGFuLmlzVmFsaWRNb2R1
bGUoKSkpOworfQorCiBjb25zdCBDbGFzc0luZm8gSlNXZWJBc3NlbWJseTo6c19pbmZvID0geyAi
V2ViQXNzZW1ibHkiLCAmQmFzZTo6c19pbmZvLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEpTV2Vi
QXNzZW1ibHkpIH07CiAKIEpTV2ViQXNzZW1ibHkqIEpTV2ViQXNzZW1ibHk6OmNyZWF0ZShWTSYg
dm0sIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIFN0cnVjdHVyZSogc3RydWN0dXJlKQpA
QCAtNDksMTAgKzEwMywxMiBAQCBTdHJ1Y3R1cmUqIEpTV2ViQXNzZW1ibHk6OmNyZWF0ZVN0cnVj
dHVyCiAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3Rv
dHlwZSwgVHlwZUluZm8oT2JqZWN0VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwogfQog
Ci12b2lkIEpTV2ViQXNzZW1ibHk6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgSlNHbG9iYWxPYmpl
Y3QqKQordm9pZCBKU1dlYkFzc2VtYmx5OjpmaW5pc2hDcmVhdGlvbihWTSYgdm0sIEpTR2xvYmFs
T2JqZWN0KiBnbG9iYWxPYmplY3QpCiB7CiAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOwog
ICAgIEFTU0VSVChpbmhlcml0cyhpbmZvKCkpKTsKKyAgICBKU0NfTkFUSVZFX0ZVTkNUSU9OX1dJ
VEhPVVRfVFJBTlNJVElPTigidmFsaWRhdGUiLCB3ZWJBc3NlbWJseVZhbGlkYXRlRnVuYywgRG9u
dEVudW0sIDEpOworICAgIEpTQ19OQVRJVkVfRlVOQ1RJT05fV0lUSE9VVF9UUkFOU0lUSU9OKCJj
b21waWxlIiwgd2ViQXNzZW1ibHlDb21waWxlRnVuYywgRG9udEVudW0sIDEpOwogfQogCiBKU1dl
YkFzc2VtYmx5OjpKU1dlYkFzc2VtYmx5KFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUpCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uY3BwCShyZXZpc2lvbiAyMDk5
NTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTU4LDE0ICs1OCwxNCBAQCBQbGFuOjpQbGFuKFZNKiB2bSwgY29uc3QgdWludDhf
dCogc291cmNlCiB7CiB9CiAKLXZvaWQgUGxhbjo6cnVuKCkKK2Jvb2wgUGxhbjo6aXNWYWxpZE1v
ZHVsZSgpCiB7CiAgICAgewogICAgICAgICBNb2R1bGVQYXJzZXIgbW9kdWxlUGFyc2VyKG1fdm0s
IG1fc291cmNlLCBtX3NvdXJjZUxlbmd0aCk7CiAgICAgICAgIGF1dG8gcGFyc2VSZXN1bHQgPSBt
b2R1bGVQYXJzZXIucGFyc2UoKTsKICAgICAgICAgaWYgKCFwYXJzZVJlc3VsdCkgewogICAgICAg
ICAgICAgbV9lcnJvck1lc3NhZ2UgPSBwYXJzZVJlc3VsdC5lcnJvcigpOwotICAgICAgICAgICAg
cmV0dXJuOyAvLyBGSVhNRSByZXR1cm4gYW4gRXhwZWN0ZWQuCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9tb2R1bGVJbmZvcm1hdGlvbiA9IFdURk1vdmUo
cGFyc2VSZXN1bHQtPm1vZHVsZSk7CiAgICAgICAgIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5
ID0gV1RGTW92ZShwYXJzZVJlc3VsdC0+ZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5KTsKQEAgLTcz
LDYgKzczLDM0IEBAIHZvaWQgUGxhbjo6cnVuKCkKICAgICAgICAgbV9mdW5jdGlvbkluZGV4U3Bh
Y2UuYnVmZmVyID0gcGFyc2VSZXN1bHQtPmZ1bmN0aW9uSW5kZXhTcGFjZS5yZWxlYXNlQnVmZmVy
KCk7CiAgICAgfQogCisgICAgZm9yICh1bnNpZ25lZCBmdW5jdGlvbkluZGV4ID0gMDsgZnVuY3Rp
b25JbmRleCA8IG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKTsgKytmdW5jdGlvbklu
ZGV4KSB7CisgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgZGF0YUxvZ0xuKCJQcm9j
ZXNzaW5nIGZ1bmN0aW9uIHN0YXJ0aW5nIGF0OiAiLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFy
eVtmdW5jdGlvbkluZGV4XS5zdGFydCwgIiBhbmQgZW5kaW5nIGF0OiAiLCBtX2Z1bmN0aW9uTG9j
YXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5lbmQpOworICAgICAgICBjb25zdCB1aW50OF90
KiBmdW5jdGlvblN0YXJ0ID0gbV9zb3VyY2UgKyBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtm
dW5jdGlvbkluZGV4XS5zdGFydDsKKyAgICAgICAgc2l6ZV90IGZ1bmN0aW9uTGVuZ3RoID0gbV9m
dW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uZW5kIC0gbV9mdW5jdGlvbkxv
Y2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uc3RhcnQ7CisgICAgICAgIEFTU0VSVChmdW5j
dGlvbkxlbmd0aCA8PSBtX3NvdXJjZUxlbmd0aCk7CisgICAgICAgIFNpZ25hdHVyZSogc2lnbmF0
dXJlID0gbV9tb2R1bGVJbmZvcm1hdGlvbi0+aW50ZXJuYWxGdW5jdGlvblNpZ25hdHVyZXNbZnVu
Y3Rpb25JbmRleF07CisKKyAgICAgICAgYXV0byB2YWxpZGF0ZVJlc3VsdCA9IHZhbGlkYXRlRnVu
Y3Rpb24oZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwgbV9mdW5jdGlv
bkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0aW9uKTsKKyAgICAgICAgaWYgKCF2YWxpZGF0
ZVJlc3VsdCkgeworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZnVuY3Rpb25MZW5ndGg7ICsraSkKKyAgICAgICAgICAg
ICAgICAgICAgZGF0YUxvZyhSYXdQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGZ1bmN0
aW9uU3RhcnRbaV0pKSwgIiwgIik7CisgICAgICAgICAgICAgICAgZGF0YUxvZ0xuKCk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBtX2Vycm9yTWVzc2FnZSA9IHZhbGlkYXRlUmVzdWx0LmVy
cm9yKCk7IC8vIEZJWE1FIG1ha2UgdGhpcyBhbiBFeHBlY3RlZC4KKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lk
IFBsYW46OnJ1bigpCit7CisgICAgaWYgKCFpc1ZhbGlkTW9kdWxlKCkpIC8vIFRoaXMgYWxzbyBj
b2xsZWN0cyBhIGJ1bmNoIG9mIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgYWN0dWFsIGNv
bXBpbGF0aW9uLgorICAgICAgICByZXR1cm47CisKICAgICBhdXRvIHRyeVJlc2VydmVDYXBhY2l0
eSA9IFt0aGlzXSAoYXV0byYgdmVjdG9yLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogd2hhdCkg
ewogICAgICAgICBpZiAoVU5MSUtFTFkoIXZlY3Rvci50cnlSZXNlcnZlQ2FwYWNpdHkoc2l6ZSkp
KSB7CiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CkBAIC04NCw2ICsxMTIsNyBA
QCB2b2lkIFBsYW46OnJ1bigpCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAg
fTsKKwogICAgIFZlY3RvcjxWZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4+IHVubGlua2Vk
V2FzbVRvV2FzbUNhbGxzOwogICAgIGlmICghdHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fd2FzbVRvSlNT
dHVicywgbV9tb2R1bGVJbmZvcm1hdGlvbi0+aW1wb3J0RnVuY3Rpb25zLnNpemUoKSwgIiBXZWJB
c3NlbWJseSB0byBKYXZhU2NyaXB0IHN0dWJzIikKICAgICAgICAgfHwgIXRyeVJlc2VydmVDYXBh
Y2l0eSh1bmxpbmtlZFdhc21Ub1dhc21DYWxscywgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnku
c2l6ZSgpLCAiIHVubGlua2VkIFdlYkFzc2VtYmx5IHRvIFdlYkFzc2VtYmx5IGNhbGxzIikKQEAg
LTExMiwxNiArMTQxLDcgQEAgdm9pZCBQbGFuOjpydW4oKQogICAgICAgICB1bnNpZ25lZCBmdW5j
dGlvbkluZGV4U3BhY2UgPSBtX3dhc21Ub0pTU3R1YnMuc2l6ZSgpICsgZnVuY3Rpb25JbmRleDsK
ICAgICAgICAgQVNTRVJUKG1fZnVuY3Rpb25JbmRleFNwYWNlLmJ1ZmZlci5nZXQoKVtmdW5jdGlv
bkluZGV4U3BhY2VdLnNpZ25hdHVyZSA9PSBzaWduYXR1cmUpOwogCi0gICAgICAgIGF1dG8gdmFs
aWRhdGVSZXN1bHQgPSB2YWxpZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVu
Z3RoLCBzaWduYXR1cmUsIG1fZnVuY3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlv
bik7Ci0gICAgICAgIGlmICghdmFsaWRhdGVSZXN1bHQpIHsKLSAgICAgICAgICAgIGlmICh2ZXJi
b3NlKSB7Ci0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZ1bmN0aW9u
TGVuZ3RoOyArK2kpCi0gICAgICAgICAgICAgICAgICAgIGRhdGFMb2coUmF3UG9pbnRlcihyZWlu
dGVycHJldF9jYXN0PHZvaWQqPihmdW5jdGlvblN0YXJ0W2ldKSksICIsICIpOwotICAgICAgICAg
ICAgICAgIGRhdGFMb2dMbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9lcnJvck1l
c3NhZ2UgPSB2YWxpZGF0ZVJlc3VsdC5lcnJvcigpOyAvLyBGSVhNRSBtYWtlIHRoaXMgYW4gRXhw
ZWN0ZWQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgQVNTRVJUKHZh
bGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwg
bV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0aW9uKSk7CiAKICAgICAgICAg
dW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMudW5jaGVja2VkQXBwZW5kKFZlY3RvcjxVbmxpbmtlZFdh
c21Ub1dhc21DYWxsPigpKTsKICAgICAgICAgYXV0byBwYXJzZUFuZENvbXBpbGVSZXN1bHQgPSBw
YXJzZUFuZENvbXBpbGUoKm1fdm0sIGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVuZ3RoLCBzaWdu
YXR1cmUsIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLmF0KGZ1bmN0aW9uSW5kZXgpLCBtX2Z1bmN0
aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9XYXNtUGxhbi5oCShyZXZpc2lvbiAyMDk5NTUpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd2FzbS9XYXNtUGxhbi5oCSh3b3JraW5nIGNvcHkpCkBAIC00OCw2ICs0OCw4IEBA
IHB1YmxpYzoKICAgICBKU19FWFBPUlRfUFJJVkFURSBQbGFuKFZNKiwgY29uc3QgdWludDhfdCos
IHNpemVfdCk7CiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgflBsYW4oKTsKIAorICAgIGJvb2wgaXNW
YWxpZE1vZHVsZSgpOworCiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgdm9pZCBydW4oKTsKIAogICAg
IEpTX0VYUE9SVF9QUklWQVRFIHZvaWQgaW5pdGlhbGl6ZUNhbGxlZXMoSlNHbG9iYWxPYmplY3Qq
LCBzdGQ6OmZ1bmN0aW9uPHZvaWQodW5zaWduZWQsIEpTV2ViQXNzZW1ibHlDYWxsZWUqLCBKU1dl
YkFzc2VtYmx5Q2FsbGVlKik+KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pz
L1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuY3BwCShy
ZXZpc2lvbiAyMDk5NTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3Nl
bWJseU1vZHVsZUNvbnN0cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTIsNyArNTIsMTkg
QEAgY29uc3QgQ2xhc3NJbmZvIFdlYkFzc2VtYmx5TW9kdWxlQ29uc3RydQogIEBlbmQKICAqLwog
Ci1zdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjb25zdHJ1Y3RKU1dlYkFzc2Vt
Ymx5TW9kdWxlKEV4ZWNTdGF0ZSogc3RhdGUpCitzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hP
U1RfQ0FMTCBjb25zdHJ1Y3RKU1dlYkFzc2VtYmx5TW9kdWxlKEV4ZWNTdGF0ZSogZXhlYykKK3sK
KyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKFdlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3I6
OmNyZWF0ZU1vZHVsZShleGVjKSk7Cit9CisKK3N0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9T
VF9DQUxMIGNhbGxKU1dlYkFzc2VtYmx5TW9kdWxlKEV4ZWNTdGF0ZSogc3RhdGUpCit7CisgICAg
Vk0mIHZtID0gc3RhdGUtPnZtKCk7CisgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1dfU0NP
UEUodm0pOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhyb3dDb25zdHJ1Y3RvckNhbm5v
dEJlQ2FsbGVkQXNGdW5jdGlvblR5cGVFcnJvcihzdGF0ZSwgc2NvcGUsICJXZWJBc3NlbWJseS5N
b2R1bGUiKSk7Cit9CisKK0pTVmFsdWUgV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvcjo6Y3Jl
YXRlTW9kdWxlKEV4ZWNTdGF0ZSogc3RhdGUpCiB7CiAgICAgVk0mIHZtID0gc3RhdGUtPnZtKCk7
CiAgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOwpAQCAtNjEsMTEgKzcz
LDEzIEBAIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNvbnMKICAgICAvLyBJ
ZiB0aGUgZ2l2ZW4gYnl0ZXMgYXJndW1lbnQgaXMgbm90IGEgQnVmZmVyU291cmNlLCBhIFR5cGVF
cnJvciBleGNlcHRpb24gaXMgdGhyb3duLgogICAgIEpTQXJyYXlCdWZmZXIqIGFycmF5QnVmZmVy
ID0gdmFsLmdldE9iamVjdCgpID8ganNEeW5hbWljQ2FzdDxKU0FycmF5QnVmZmVyKj4odmFsLmdl
dE9iamVjdCgpKSA6IG51bGxwdHI7CiAgICAgSlNBcnJheUJ1ZmZlclZpZXcqIGFycmF5QnVmZmVy
VmlldyA9IHZhbC5nZXRPYmplY3QoKSA/IGpzRHluYW1pY0Nhc3Q8SlNBcnJheUJ1ZmZlclZpZXcq
Pih2YWwuZ2V0T2JqZWN0KCkpIDogbnVsbHB0cjsKLSAgICBpZiAoIShhcnJheUJ1ZmZlciB8fCBh
cnJheUJ1ZmZlclZpZXcpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93RXhj
ZXB0aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRlVHlwZUVycm9yKHN0YXRlLCBBU0NJSUxpdGVyYWwo
ImZpcnN0IGFyZ3VtZW50IHRvIFdlYkFzc2VtYmx5Lk1vZHVsZSBtdXN0IGJlIGFuIEFycmF5QnVm
ZmVyVmlldyBvciBhbiBBcnJheUJ1ZmZlciIpLCBkZWZhdWx0U291cmNlQXBwZW5kZXIsIHJ1bnRp
bWVUeXBlRm9yVmFsdWUodmFsKSkpKTsKKyAgICBpZiAoIShhcnJheUJ1ZmZlciB8fCBhcnJheUJ1
ZmZlclZpZXcpKSB7CisgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihzdGF0ZSwgc2NvcGUs
IGNyZWF0ZVR5cGVFcnJvcihzdGF0ZSwgQVNDSUlMaXRlcmFsKCJmaXJzdCBhcmd1bWVudCB0byBX
ZWJBc3NlbWJseS5Nb2R1bGUgbXVzdCBiZSBhbiBBcnJheUJ1ZmZlclZpZXcgb3IgYW4gQXJyYXlC
dWZmZXIiKSwgZGVmYXVsdFNvdXJjZUFwcGVuZGVyLCBydW50aW1lVHlwZUZvclZhbHVlKHZhbCkp
KTsKKyAgICB9CiAKLSAgICBpZiAoYXJyYXlCdWZmZXJWaWV3ID8gYXJyYXlCdWZmZXJWaWV3LT5p
c05ldXRlcmVkKCkgOiBhcnJheUJ1ZmZlci0+aW1wbCgpLT5pc05ldXRlcmVkKCkpCi0gICAgICAg
IHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhyb3dFeGNlcHRpb24oc3RhdGUsIHNjb3BlLCBjcmVh
dGVUeXBlRXJyb3Ioc3RhdGUsIEFTQ0lJTGl0ZXJhbCgidW5kZXJseWluZyBUeXBlZEFycmF5IGhh
cyBiZWVuIGRldGF0Y2hlZCBmcm9tIHRoZSBBcnJheUJ1ZmZlciIpLCBkZWZhdWx0U291cmNlQXBw
ZW5kZXIsIHJ1bnRpbWVUeXBlRm9yVmFsdWUodmFsKSkpKTsKKyAgICBpZiAoYXJyYXlCdWZmZXJW
aWV3ID8gYXJyYXlCdWZmZXJWaWV3LT5pc05ldXRlcmVkKCkgOiBhcnJheUJ1ZmZlci0+aW1wbCgp
LT5pc05ldXRlcmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKHN0YXRlLCBz
Y29wZSwgY3JlYXRlVHlwZUVycm9yKHN0YXRlLCBBU0NJSUxpdGVyYWwoInVuZGVybHlpbmcgVHlw
ZWRBcnJheSBoYXMgYmVlbiBkZXRhdGNoZWQgZnJvbSB0aGUgQXJyYXlCdWZmZXIiKSwgZGVmYXVs
dFNvdXJjZUFwcGVuZGVyLCBydW50aW1lVHlwZUZvclZhbHVlKHZhbCkpKTsKKyAgICB9CiAKICAg
ICBzaXplX3QgYnl0ZU9mZnNldCA9IGFycmF5QnVmZmVyVmlldyA/IGFycmF5QnVmZmVyVmlldy0+
Ynl0ZU9mZnNldCgpIDogMDsKICAgICBzaXplX3QgYnl0ZVNpemUgPSBhcnJheUJ1ZmZlclZpZXcg
PyBhcnJheUJ1ZmZlclZpZXctPmxlbmd0aCgpIDogYXJyYXlCdWZmZXItPmltcGwoKS0+Ynl0ZUxl
bmd0aCgpOwpAQCAtNzQsMTEgKzg4LDEyIEBAIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9T
VF9DQUxMIGNvbnMKICAgICBXYXNtOjpQbGFuIHBsYW4oJnZtLCBiYXNlICsgYnl0ZU9mZnNldCwg
Ynl0ZVNpemUpOwogICAgIC8vIE9uIGZhaWx1cmUsIGEgbmV3IFdlYkFzc2VtYmx5LkNvbXBpbGVF
cnJvciBpcyB0aHJvd24uCiAgICAgcGxhbi5ydW4oKTsKLSAgICBpZiAocGxhbi5mYWlsZWQoKSkK
LSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd0V4Y2VwdGlvbihzdGF0ZSwgc2Nv
cGUsIGNyZWF0ZVdlYkFzc2VtYmx5Q29tcGlsZUVycm9yKHN0YXRlLCBwbGFuLmVycm9yTWVzc2Fn
ZSgpKSkpOworICAgIGlmIChwbGFuLmZhaWxlZCgpKSB7CisgICAgICAgIHJldHVybiB0aHJvd0V4
Y2VwdGlvbihzdGF0ZSwgc2NvcGUsIGNyZWF0ZVdlYkFzc2VtYmx5Q29tcGlsZUVycm9yKHN0YXRl
LCBwbGFuLmVycm9yTWVzc2FnZSgpKSk7CisgICAgfQogCiAgICAgLy8gT24gc3VjY2VzcywgYSBu
ZXcgV2ViQXNzZW1ibHkuTW9kdWxlIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIFtbTW9kdWxlXV0g
c2V0IHRvIHRoZSB2YWxpZGF0ZWQgQXN0Lm1vZHVsZS4KLSAgICBhdXRvKiBzdHJ1Y3R1cmUgPSBJ
bnRlcm5hbEZ1bmN0aW9uOjpjcmVhdGVTdWJjbGFzc1N0cnVjdHVyZShzdGF0ZSwgc3RhdGUtPm5l
d1RhcmdldCgpLCBhc0ludGVybmFsRnVuY3Rpb24oc3RhdGUtPmpzQ2FsbGVlKCkpLT5nbG9iYWxP
YmplY3QoKS0+V2ViQXNzZW1ibHlNb2R1bGVTdHJ1Y3R1cmUoKSk7CisgICAgYXV0byogc3RydWN0
dXJlID0gSW50ZXJuYWxGdW5jdGlvbjo6Y3JlYXRlU3ViY2xhc3NTdHJ1Y3R1cmUoc3RhdGUsIHN0
YXRlLT5uZXdUYXJnZXQoKSwgc3RhdGUtPmxleGljYWxHbG9iYWxPYmplY3QoKS0+V2ViQXNzZW1i
bHlNb2R1bGVTdHJ1Y3R1cmUoKSk7CiAgICAgUkVUVVJOX0lGX0VYQ0VQVElPTihzY29wZSwgeyB9
KTsKIAogICAgIC8vIFRoZSBleHBvcnQgc3ltYm9sIHRhYmxlIGlzIHRoZSBzYW1lIGZvciBhbGwg
SW5zdGFuY2VzIG9mIGEgTW9kdWxlLgpAQCAtOTYsMTQgKzExMSw4IEBAIHN0YXRpYyBFbmNvZGVk
SlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNvbnMKICAgICAgICAgICAgIHJlc3VsdC0+c2V0SlNFbnRy
eXBvaW50Q2FsbGVlKHZtLCBjYWxsZWVJbmRleCwganNFbnRyeXBvaW50Q2FsbGVlKTsKICAgICAg
ICAgICAgIHJlc3VsdC0+c2V0V2FzbUVudHJ5cG9pbnRDYWxsZWUodm0sIGNhbGxlZUluZGV4LCB3
YXNtRW50cnlwb2ludENhbGxlZSk7CiAgICAgICAgIH0pOwotICAgIHJldHVybiBKU1ZhbHVlOjpl
bmNvZGUocmVzdWx0KTsKLX0KIAotc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwg
Y2FsbEpTV2ViQXNzZW1ibHlNb2R1bGUoRXhlY1N0YXRlKiBzdGF0ZSkKLXsKLSAgICBWTSYgdm0g
PSBzdGF0ZS0+dm0oKTsKLSAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7
Ci0gICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd0NvbnN0cnVjdG9yQ2Fubm90QmVDYWxs
ZWRBc0Z1bmN0aW9uVHlwZUVycm9yKHN0YXRlLCBzY29wZSwgIldlYkFzc2VtYmx5Lk1vZHVsZSIp
KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBXZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9y
KiBXZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yOjpjcmVhdGUoVk0mIHZtLCBTdHJ1Y3R1cmUq
IHN0cnVjdHVyZSwgV2ViQXNzZW1ibHlNb2R1bGVQcm90b3R5cGUqIHRoaXNQcm90b3R5cGUpCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseU1vZHVsZUNvbnN0
cnVjdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2Vi
QXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5oCShyZXZpc2lvbiAyMDk5NTUpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmgJKHdv
cmtpbmcgY29weSkKQEAgLTQ0LDYgKzQ0LDggQEAgcHVibGljOgogCiAgICAgREVDTEFSRV9JTkZP
OwogCisgICAgc3RhdGljIEpTVmFsdWUgY3JlYXRlTW9kdWxlKEV4ZWNTdGF0ZSopOworCiBwcm90
ZWN0ZWQ6CiAgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYsIFdlYkFzc2VtYmx5TW9kdWxlUHJv
dG90eXBlKik7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297387</attachid>
            <date>2016-12-16 19:49:19 -0800</date>
            <delta_ts>2016-12-16 19:50:30 -0800</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>18923</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMDk5NTUpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE2IEBACisyMDE2LTEyLTE2ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUu
Y29tPgorCisgICAgICAgIFdlYkFzc2VtYmx5OiBJbXBsZW1lbnQgdGhlIFdlYkFzc2VtYmx5LmNv
bXBpbGUgYW5kIFdlYkFzc2VtYmx5LnZhbGlkYXRlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjU5MzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICAqIHdhc20vanMtYXBpL3Rlc3RfTW9kdWxlLmpzOgorICAg
ICAgICAoYXN5bmMudGVzdFByb21pc2VBUEkpOgorICAgICAgICAqIHdhc20vanMtYXBpL3Rlc3Rf
YmFzaWNfYXBpLmpzOgorICAgICAgICAqIHdhc20vanMtYXBpL3ZhbGlkYXRlLmpzOiBBZGRlZC4K
KyAgICAgICAgKGFzc2VydC50cnV0aHkuV2ViQXNzZW1ibHkudmFsaWRhdGUuYnVpbGRlci5XZWJB
c3NlbWJseSk6CisKIDIwMTYtMTItMTYgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgog
CiAgICAgICAgIERlLWR1cGxpY2F0ZSBmaW5hbGx5IGJsb2Nrcy4KSW5kZXg6IEpTVGVzdHMvd2Fz
bS9qcy1hcGkvdGVzdF9Nb2R1bGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSlNUZXN0cy93YXNtL2pzLWFw
aS90ZXN0X01vZHVsZS5qcwkocmV2aXNpb24gMjA5OTU1KQorKysgSlNUZXN0cy93YXNtL2pzLWFw
aS90ZXN0X01vZHVsZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMTcsMyArMTcsNDcgQEAgaW1wb3J0
IEJ1aWxkZXIgZnJvbSAnLi4vQnVpbGRlci5qcyc7CiAgICAgY29uc3QgYmluID0gYnVpbGRlci5X
ZWJBc3NlbWJseSgpLmdldCgpOwogICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBXZWJBc3NlbWJseS5N
b2R1bGUoYmluKTsKIH0pKCk7CisKK2xldCBkb25lID0gZmFsc2U7Cithc3luYyBmdW5jdGlvbiB0
ZXN0UHJvbWlzZUFQSSgpIHsKKyAgICB7CisgICAgICAgIC8vIENhbid0IGRlY2xhcmUgbW9yZSB0
aGFuIG9uZSBtZW1vcnkuCisgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSAobmV3IEJ1aWxkZXIoKSkK
KyAgICAgICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgICAgIC5JbXBvcnQoKS5NZW1vcnko
ImltcCIsICJtZW1vcnkiLCB7aW5pdGlhbDogMjB9KS5FbmQoKQorICAgICAgICAgICAgLkZ1bmN0
aW9uKCkuRW5kKCkKKyAgICAgICAgICAgIC5NZW1vcnkoKS5Jbml0aWFsTWF4UGFnZXMoMSwgMSku
RW5kKCkKKyAgICAgICAgICAgIC5FeHBvcnQoKS5FbmQoKQorICAgICAgICAgICAgLkNvZGUoKQor
ICAgICAgICAgICAgLkVuZCgpOworCisgICAgICAgIGxldCB0aHJldyA9IGZhbHNlOworICAgICAg
ICB0cnkgeworICAgICAgICAgICAgYXdhaXQgV2ViQXNzZW1ibHkuY29tcGlsZShidWlsZGVyLldl
YkFzc2VtYmx5KCkuZ2V0KCkpOworICAgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgICAgIHRo
cmV3ID0gdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydC50cnV0aHkoZSBpbnN0YW5jZW9mIFdlYkFz
c2VtYmx5LkNvbXBpbGVFcnJvcik7CisgICAgICAgICAgICBhc3NlcnQudHJ1dGh5KGUubWVzc2Fn
ZSA9PT0gIldlYkFzc2VtYmx5Lk1vZHVsZSBkb2Vzbid0IHBhcnNlIGF0IGJ5dGUgMzQgLyA0Mzog
TWVtb3J5IHNlY3Rpb24gY2Fubm90IGV4aXN0IGlmIGFuIEltcG9ydCBoYXMgYSBtZW1vcnkgKGV2
YWx1YXRpbmcgJ1dlYkFzc2VtYmx5LmNvbXBpbGUoYnVpbGRlci5XZWJBc3NlbWJseSgpLmdldCgp
KScpIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0LnRydXRoeSh0aHJldyk7CisgICAgfQor
CisgICAgeworICAgICAgICBjb25zdCBidWlsZGVyID0gKG5ldyBCdWlsZGVyKCkpCisgICAgICAg
ICAgICAuVHlwZSgpLkVuZCgpCisgICAgICAgICAgICAuSW1wb3J0KCkuTWVtb3J5KCJpbXAiLCAi
bWVtb3J5Iiwge2luaXRpYWw6IDIwfSkuRW5kKCkKKyAgICAgICAgICAgIC5GdW5jdGlvbigpLkVu
ZCgpCisgICAgICAgICAgICAuRXhwb3J0KCkuRW5kKCkKKyAgICAgICAgICAgIC5Db2RlKCkKKyAg
ICAgICAgICAgIC5FbmQoKTsKKworICAgICAgICBsZXQgbW9kdWxlID0gYXdhaXQgV2ViQXNzZW1i
bHkuY29tcGlsZShidWlsZGVyLldlYkFzc2VtYmx5KCkuZ2V0KCkpOworICAgICAgICBhc3NlcnQu
dHJ1dGh5KG1vZHVsZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lk1vZHVsZSk7CisgICAgfQorCisg
ICAgZG9uZSA9IHRydWU7Cit9CisKK3Rlc3RQcm9taXNlQVBJKCk7CitkcmFpbk1pY3JvdGFza3Mo
KTsKK2Fzc2VydC50cnV0aHkoZG9uZSk7CkluZGV4OiBKU1Rlc3RzL3dhc20vanMtYXBpL3Rlc3Rf
YmFzaWNfYXBpLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvd2FzbS9qcy1hcGkvdGVzdF9iYXNp
Y19hcGkuanMJKHJldmlzaW9uIDIwOTk1NSkKKysrIEpTVGVzdHMvd2FzbS9qcy1hcGkvdGVzdF9i
YXNpY19hcGkuanMJKHdvcmtpbmcgY29weSkKQEAgLTk3LDggKzk3LDMgQEAgZm9yIChjb25zdCBj
IGluIGNvbnN0cnVjdG9yUHJvcGVydGllcykgewogICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJv
cihgSW1wbGVtZW50YXRpb24gZXJyb3I6IHVuZXhwZWN0ZWQgY29uc3RydWN0b3IgcHJvcGVydHkg
IiR7Y30iYCk7CiAgICAgfQogfQotCi0vLyBGSVhNRSBJbXBsZW1lbnQgYW5kIHRlc3QgdGhlc2Ug
QVBJcyBmdXJ0aGVyLiBGb3Igbm93IHRoZXkganVzdCB0aHJvdy4gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE1OTc3NQotZm9yIChjb25zdCBmIGluIGZ1bmN0aW9uUHJv
cGVydGllcykgewotICAgIGFzc2VydC50aHJvd3MoKCkgPT4gV2ViQXNzZW1ibHlbZl0oKSwgRXJy
b3IsIGBXZWJBc3NlbWJseSBkb2Vzbid0IHlldCBpbXBsZW1lbnQgdGhlICR7Zn0gZnVuY3Rpb24g
cHJvcGVydHlgKTsKLX0KSW5kZXg6IEpTVGVzdHMvd2FzbS9qcy1hcGkvdmFsaWRhdGUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSlNUZXN0cy93YXNtL2pzLWFwaS92YWxpZGF0ZS5qcwkobm9uZXhpc3RlbnQp
CisrKyBKU1Rlc3RzL3dhc20vanMtYXBpL3ZhbGlkYXRlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMjcgQEAKK2ltcG9ydCAqIGFzIGFzc2VydCBmcm9tICcuLi9hc3NlcnQuanMnOworaW1w
b3J0IEJ1aWxkZXIgZnJvbSAnLi4vQnVpbGRlci5qcyc7CisKK3sKKyAgICBjb25zdCBidWlsZGVy
ID0gKG5ldyBCdWlsZGVyKCkpCisgICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgLkltcG9y
dCgpLk1lbW9yeSgiaW1wIiwgIm1lbW9yeSIsIHtpbml0aWFsOiAyMH0pLkVuZCgpCisgICAgICAg
IC5GdW5jdGlvbigpLkVuZCgpCisgICAgICAgIC5NZW1vcnkoKS5Jbml0aWFsTWF4UGFnZXMoMSwg
MSkuRW5kKCkKKyAgICAgICAgLkV4cG9ydCgpLkVuZCgpCisgICAgICAgIC5Db2RlKCkKKyAgICAg
ICAgLkVuZCgpOworCisgICAgYXNzZXJ0LnRydXRoeSghV2ViQXNzZW1ibHkudmFsaWRhdGUoYnVp
bGRlci5XZWJBc3NlbWJseSgpLmdldCgpKSk7Cit9CisKK3sKKyAgICBjb25zdCBidWlsZGVyID0g
KG5ldyBCdWlsZGVyKCkpCisgICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgLkltcG9ydCgp
Lk1lbW9yeSgiaW1wIiwgIm1lbW9yeSIsIHtpbml0aWFsOiAyMH0pLkVuZCgpCisgICAgICAgIC5G
dW5jdGlvbigpLkVuZCgpCisgICAgICAgIC5FeHBvcnQoKS5FbmQoKQorICAgICAgICAuQ29kZSgp
CisgICAgICAgIC5FbmQoKTsKKworICAgIGFzc2VydC50cnV0aHkoV2ViQXNzZW1ibHkudmFsaWRh
dGUoYnVpbGRlci5XZWJBc3NlbWJseSgpLmdldCgpKSk7Cit9CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9D
aGFuZ2VMb2cJKHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFu
Z2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyOCBAQAorMjAxNi0xMi0xNiAgU2FhbSBC
YXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KKworICAgICAgICBXZWJBc3NlbWJseTogSW1wbGVt
ZW50IHRoZSBXZWJBc3NlbWJseS5jb21waWxlIGFuZCBXZWJBc3NlbWJseS52YWxpZGF0ZQorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY1OTM2CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhlIEFQSXMgYXJl
IGRvY3VtZW50ZWQgaGVyZToKKyAgICAgICAgLSBodHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1i
bHkvZGVzaWduL2Jsb2IvbWFzdGVyL0pTLm1kI3dlYmFzc2VtYmx5Y29tcGlsZQorICAgICAgICAt
IGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9kZXNpZ24vYmxvYi9tYXN0ZXIvSlMubWQj
d2ViYXNzZW1ibHl2YWxpZGF0ZQorCisgICAgICAgICogd2FzbS9KU1dlYkFzc2VtYmx5LmNwcDoK
KyAgICAgICAgKEpTQzo6d2ViQXNzZW1ibHlDb21waWxlRnVuYyk6CisgICAgICAgIChKU0M6Ondl
YkFzc2VtYmx5VmFsaWRhdGVGdW5jKToKKyAgICAgICAgKEpTQzo6SlNXZWJBc3NlbWJseTo6Zmlu
aXNoQ3JlYXRpb24pOgorICAgICAgICAqIHdhc20vV2FzbVBsYW4uY3BwOgorICAgICAgICAoSlND
OjpXYXNtOjpQbGFuOjppc1ZhbGlkTW9kdWxlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6
cnVuKToKKyAgICAgICAgKiB3YXNtL1dhc21QbGFuLmg6CisgICAgICAgICogd2FzbS9qcy9XZWJB
c3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6Y29uc3RydWN0SlNX
ZWJBc3NlbWJseU1vZHVsZSk6CisgICAgICAgIChKU0M6OmNhbGxKU1dlYkFzc2VtYmx5TW9kdWxl
KToKKyAgICAgICAgKEpTQzo6V2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvcjo6Y3JlYXRlTW9k
dWxlKToKKyAgICAgICAgKiB3YXNtL2pzL1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuaDoK
KwogMjAxNi0xMi0xNiAgU2FhbSBCYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KIAogICAgICAg
ICBXZWJBc3NlbWJseTogV2Ugc3RpbGwgaGF2ZSBzb21lIGluY29ycmVjdCBwYXJzaW5nIHByb2R1
Y3Rpb25zIGluc2lkZSB1bnJlYWNoYWJsZSBjb2RlCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9KU1dlYkFzc2VtYmx5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9KU1dlYkFzc2VtYmx5LmNwcAkocmV2aXNpb24gMjA5OTU1KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vSlNXZWJBc3NlbWJseS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI4LDEzICsyOCw2NyBAQAogCiAjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQogCisjaW5jbHVkZSAi
RXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiRnVuY3Rpb25Qcm90b3R5cGUuaCIKKyNpbmNsdWRlICJK
U0FycmF5QnVmZmVyLmgiCiAjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgorI2luY2x1ZGUgIkpTUHJv
bWlzZURlZmVycmVkLmgiCisjaW5jbHVkZSAiV2FzbVBsYW4uaCIKKyNpbmNsdWRlICJXZWJBc3Nl
bWJseU1vZHVsZUNvbnN0cnVjdG9yLmgiCiAKIG5hbWVzcGFjZSBKU0MgewogCiBTVEFUSUNfQVNT
RVJUX0lTX1RSSVZJQUxMWV9ERVNUUlVDVElCTEUoSlNXZWJBc3NlbWJseSk7CiAKK0VuY29kZWRK
U1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlWYWxpZGF0ZUZ1bmMoRXhlY1N0YXRlKik7
CitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIHdlYkFzc2VtYmx5Q29tcGlsZUZ1bmMoRXhl
Y1N0YXRlKik7CisKK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlDb21w
aWxlRnVuYyhFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKKyAg
ICBhdXRvIGNhdGNoU2NvcGUgPSBERUNMQVJFX0NBVENIX1NDT1BFKHZtKTsKKworICAgIEpTUHJv
bWlzZURlZmVycmVkKiBwcm9taXNlID0gIEpTUHJvbWlzZURlZmVycmVkOjpjcmVhdGUoZXhlYywg
ZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpKTsKKyAgICBSRVRVUk5fSUZfRVhDRVBUSU9OKGNh
dGNoU2NvcGUsIHsgfSk7CisKKyAgICBKU1ZhbHVlIG1vZHVsZSA9IFdlYkFzc2VtYmx5TW9kdWxl
Q29uc3RydWN0b3I6OmNyZWF0ZU1vZHVsZShleGVjLCBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0
KCktPldlYkFzc2VtYmx5TW9kdWxlU3RydWN0dXJlKCkpOworICAgIGlmIChFeGNlcHRpb24qIGV4
Y2VwdGlvbiA9IGNhdGNoU2NvcGUuZXhjZXB0aW9uKCkpIHsKKyAgICAgICAgY2F0Y2hTY29wZS5j
bGVhckV4Y2VwdGlvbigpOworICAgICAgICBwcm9taXNlLT5yZWplY3QoZXhlYywgZXhjZXB0aW9u
KTsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShwcm9taXNlLT5wcm9taXNlKCkpOwor
ICAgIH0KKworICAgIHByb21pc2UtPnJlc29sdmUoZXhlYywgbW9kdWxlKTsKKyAgICByZXR1cm4g
SlNWYWx1ZTo6ZW5jb2RlKHByb21pc2UtPnByb21pc2UoKSk7Cit9CisKK0VuY29kZWRKU1ZhbHVl
IEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlWYWxpZGF0ZUZ1bmMoRXhlY1N0YXRlKiBleGVjKQor
eworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhS
T1dfU0NPUEUodm0pOworCisgICAgSlNWYWx1ZSB2YWwgPSBleGVjLT5hcmd1bWVudCgwKTsKKwor
ICAgIC8vIElmIHRoZSBnaXZlbiBieXRlcyBhcmd1bWVudCBpcyBub3QgYSBCdWZmZXJTb3VyY2Us
IGEgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgSlNBcnJheUJ1ZmZlciogYXJy
YXlCdWZmZXIgPSB2YWwuZ2V0T2JqZWN0KCkgPyBqc0R5bmFtaWNDYXN0PEpTQXJyYXlCdWZmZXIq
Pih2YWwuZ2V0T2JqZWN0KCkpIDogbnVsbHB0cjsKKyAgICBKU0FycmF5QnVmZmVyVmlldyogYXJy
YXlCdWZmZXJWaWV3ID0gdmFsLmdldE9iamVjdCgpID8ganNEeW5hbWljQ2FzdDxKU0FycmF5QnVm
ZmVyVmlldyo+KHZhbC5nZXRPYmplY3QoKSkgOiBudWxscHRyOworICAgIGlmICghKGFycmF5QnVm
ZmVyIHx8IGFycmF5QnVmZmVyVmlldykpIHsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29k
ZSh0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwgY3JlYXRlVHlwZUVycm9yKGV4ZWMsCisgICAg
ICAgICAgICBBU0NJSUxpdGVyYWwoImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXlCdWZm
ZXJWaWV3IG9yIGFuIEFycmF5QnVmZmVyIiksIGRlZmF1bHRTb3VyY2VBcHBlbmRlciwgcnVudGlt
ZVR5cGVGb3JWYWx1ZSh2YWwpKSkpOworICAgIH0KKworICAgIGlmIChhcnJheUJ1ZmZlclZpZXcg
PyBhcnJheUJ1ZmZlclZpZXctPmlzTmV1dGVyZWQoKSA6IGFycmF5QnVmZmVyLT5pbXBsKCktPmlz
TmV1dGVyZWQoKSkgeworICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93RXhjZXB0
aW9uKGV4ZWMsIHNjb3BlLCBjcmVhdGVUeXBlRXJyb3IoZXhlYywKKyAgICAgICAgICAgIEFTQ0lJ
TGl0ZXJhbCgidW5kZXJseWluZyBUeXBlZEFycmF5IGhhcyBiZWVuIGRldGF0Y2hlZCBmcm9tIHRo
ZSBBcnJheUJ1ZmZlciIpLCBkZWZhdWx0U291cmNlQXBwZW5kZXIsIHJ1bnRpbWVUeXBlRm9yVmFs
dWUodmFsKSkpKTsKKyAgICB9CisKKyAgICBzaXplX3QgYnl0ZU9mZnNldCA9IGFycmF5QnVmZmVy
VmlldyA/IGFycmF5QnVmZmVyVmlldy0+Ynl0ZU9mZnNldCgpIDogMDsKKyAgICBzaXplX3QgYnl0
ZVNpemUgPSBhcnJheUJ1ZmZlclZpZXcgPyBhcnJheUJ1ZmZlclZpZXctPmxlbmd0aCgpIDogYXJy
YXlCdWZmZXItPmltcGwoKS0+Ynl0ZUxlbmd0aCgpOworICAgIGNvbnN0IGF1dG8qIGJhc2UgPSBh
cnJheUJ1ZmZlclZpZXcgPyBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYXJyYXlCdWZmZXJWaWV3LT52
ZWN0b3IoKSkgOiBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYXJyYXlCdWZmZXItPmltcGwoKS0+ZGF0
YSgpKTsKKyAgICBXYXNtOjpQbGFuIHBsYW4oJnZtLCBiYXNlICsgYnl0ZU9mZnNldCwgYnl0ZVNp
emUpOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNCb29sZWFuKHBsYW4uaXNWYWxpZE1v
ZHVsZSgpKSk7Cit9CisKIGNvbnN0IENsYXNzSW5mbyBKU1dlYkFzc2VtYmx5OjpzX2luZm8gPSB7
ICJXZWJBc3NlbWJseSIsICZCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoSlNX
ZWJBc3NlbWJseSkgfTsKIAogSlNXZWJBc3NlbWJseSogSlNXZWJBc3NlbWJseTo6Y3JlYXRlKFZN
JiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUp
CkBAIC00OSwxMCArMTAzLDEyIEBAIFN0cnVjdHVyZSogSlNXZWJBc3NlbWJseTo6Y3JlYXRlU3Ry
dWN0dXIKICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJv
dG90eXBlLCBUeXBlSW5mbyhPYmplY3RUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CiB9
CiAKLXZvaWQgSlNXZWJBc3NlbWJseTo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtLCBKU0dsb2JhbE9i
amVjdCopCit2b2lkIEpTV2ViQXNzZW1ibHk6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgSlNHbG9i
YWxPYmplY3QqIGdsb2JhbE9iamVjdCkKIHsKICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7
CiAgICAgQVNTRVJUKGluaGVyaXRzKGluZm8oKSkpOworICAgIEpTQ19OQVRJVkVfRlVOQ1RJT05f
V0lUSE9VVF9UUkFOU0lUSU9OKCJ2YWxpZGF0ZSIsIHdlYkFzc2VtYmx5VmFsaWRhdGVGdW5jLCBE
b250RW51bSwgMSk7CisgICAgSlNDX05BVElWRV9GVU5DVElPTl9XSVRIT1VUX1RSQU5TSVRJT04o
ImNvbXBpbGUiLCB3ZWJBc3NlbWJseUNvbXBpbGVGdW5jLCBEb250RW51bSwgMSk7CiB9CiAKIEpT
V2ViQXNzZW1ibHk6OkpTV2ViQXNzZW1ibHkoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAJKHJldmlzaW9uIDIw
OTk1NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNTgsMTQgKzU4LDE0IEBAIFBsYW46OlBsYW4oVk0qIHZtLCBjb25zdCB1aW50
OF90KiBzb3VyY2UKIHsKIH0KIAotdm9pZCBQbGFuOjpydW4oKQorYm9vbCBQbGFuOjppc1ZhbGlk
TW9kdWxlKCkKIHsKICAgICB7CiAgICAgICAgIE1vZHVsZVBhcnNlciBtb2R1bGVQYXJzZXIobV92
bSwgbV9zb3VyY2UsIG1fc291cmNlTGVuZ3RoKTsKICAgICAgICAgYXV0byBwYXJzZVJlc3VsdCA9
IG1vZHVsZVBhcnNlci5wYXJzZSgpOwogICAgICAgICBpZiAoIXBhcnNlUmVzdWx0KSB7CiAgICAg
ICAgICAgICBtX2Vycm9yTWVzc2FnZSA9IHBhcnNlUmVzdWx0LmVycm9yKCk7Ci0gICAgICAgICAg
ICByZXR1cm47IC8vIEZJWE1FIHJldHVybiBhbiBFeHBlY3RlZC4KKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX21vZHVsZUluZm9ybWF0aW9uID0gV1RGTW92
ZShwYXJzZVJlc3VsdC0+bW9kdWxlKTsKICAgICAgICAgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5h
cnkgPSBXVEZNb3ZlKHBhcnNlUmVzdWx0LT5mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkpOwpAQCAt
NzMsNiArNzMsMzQgQEAgdm9pZCBQbGFuOjpydW4oKQogICAgICAgICBtX2Z1bmN0aW9uSW5kZXhT
cGFjZS5idWZmZXIgPSBwYXJzZVJlc3VsdC0+ZnVuY3Rpb25JbmRleFNwYWNlLnJlbGVhc2VCdWZm
ZXIoKTsKICAgICB9CiAKKyAgICBmb3IgKHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXggPSAwOyBmdW5j
dGlvbkluZGV4IDwgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpOyArK2Z1bmN0aW9u
SW5kZXgpIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBkYXRhTG9nTG4oIlBy
b2Nlc3NpbmcgZnVuY3Rpb24gc3RhcnRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmlu
YXJ5W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0LCAiIGFuZCBlbmRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25M
b2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLmVuZCk7CisgICAgICAgIGNvbnN0IHVpbnQ4
X3QqIGZ1bmN0aW9uU3RhcnQgPSBtX3NvdXJjZSArIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5
W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0OworICAgICAgICBzaXplX3QgZnVuY3Rpb25MZW5ndGggPSBt
X2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5lbmQgLSBtX2Z1bmN0aW9u
TG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydDsKKyAgICAgICAgQVNTRVJUKGZ1
bmN0aW9uTGVuZ3RoIDw9IG1fc291cmNlTGVuZ3RoKTsKKyAgICAgICAgU2lnbmF0dXJlKiBzaWdu
YXR1cmUgPSBtX21vZHVsZUluZm9ybWF0aW9uLT5pbnRlcm5hbEZ1bmN0aW9uU2lnbmF0dXJlc1tm
dW5jdGlvbkluZGV4XTsKKworICAgICAgICBhdXRvIHZhbGlkYXRlUmVzdWx0ID0gdmFsaWRhdGVG
dW5jdGlvbihmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJlLCBtX2Z1bmN0
aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pOworICAgICAgICBpZiAoIXZhbGlk
YXRlUmVzdWx0KSB7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmdW5jdGlvbkxlbmd0aDsgKytpKQorICAgICAgICAg
ICAgICAgICAgICBkYXRhTG9nKFJhd1BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZnVu
Y3Rpb25TdGFydFtpXSkpLCAiLCAiKTsKKyAgICAgICAgICAgICAgICBkYXRhTG9nTG4oKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fZXJyb3JNZXNzYWdlID0gdmFsaWRhdGVSZXN1bHQu
ZXJyb3IoKTsgLy8gRklYTUUgbWFrZSB0aGlzIGFuIEV4cGVjdGVkLgorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3Zv
aWQgUGxhbjo6cnVuKCkKK3sKKyAgICBpZiAoIWlzVmFsaWRNb2R1bGUoKSkgLy8gVGhpcyBhbHNv
IGNvbGxlY3RzIGEgYnVuY2ggb2YgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRvIHRoZSBhY3R1YWwg
Y29tcGlsYXRpb24uCisgICAgICAgIHJldHVybjsKKwogICAgIGF1dG8gdHJ5UmVzZXJ2ZUNhcGFj
aXR5ID0gW3RoaXNdIChhdXRvJiB2ZWN0b3IsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiB3aGF0
KSB7CiAgICAgICAgIGlmIChVTkxJS0VMWSghdmVjdG9yLnRyeVJlc2VydmVDYXBhY2l0eShzaXpl
KSkpIHsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKQEAgLTg0LDYgKzExMiw3
IEBAIHZvaWQgUGxhbjo6cnVuKCkKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAg
ICB9OworCiAgICAgVmVjdG9yPFZlY3RvcjxVbmxpbmtlZFdhc21Ub1dhc21DYWxsPj4gdW5saW5r
ZWRXYXNtVG9XYXNtQ2FsbHM7CiAgICAgaWYgKCF0cnlSZXNlcnZlQ2FwYWNpdHkobV93YXNtVG9K
U1N0dWJzLCBtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRGdW5jdGlvbnMuc2l6ZSgpLCAiIFdl
YkFzc2VtYmx5IHRvIEphdmFTY3JpcHQgc3R1YnMiKQogICAgICAgICB8fCAhdHJ5UmVzZXJ2ZUNh
cGFjaXR5KHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFy
eS5zaXplKCksICIgdW5saW5rZWQgV2ViQXNzZW1ibHkgdG8gV2ViQXNzZW1ibHkgY2FsbHMiKQpA
QCAtMTEyLDE2ICsxNDEsNyBAQCB2b2lkIFBsYW46OnJ1bigpCiAgICAgICAgIHVuc2lnbmVkIGZ1
bmN0aW9uSW5kZXhTcGFjZSA9IG1fd2FzbVRvSlNTdHVicy5zaXplKCkgKyBmdW5jdGlvbkluZGV4
OwogICAgICAgICBBU1NFUlQobV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2Z1bmN0
aW9uSW5kZXhTcGFjZV0uc2lnbmF0dXJlID09IHNpZ25hdHVyZSk7CiAKLSAgICAgICAgYXV0byB2
YWxpZGF0ZVJlc3VsdCA9IHZhbGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25M
ZW5ndGgsIHNpZ25hdHVyZSwgbV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0
aW9uKTsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZVJlc3VsdCkgewotICAgICAgICAgICAgaWYgKHZl
cmJvc2UpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZnVuY3Rp
b25MZW5ndGg7ICsraSkKLSAgICAgICAgICAgICAgICAgICAgZGF0YUxvZyhSYXdQb2ludGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGZ1bmN0aW9uU3RhcnRbaV0pKSwgIiwgIik7Ci0gICAgICAg
ICAgICAgICAgZGF0YUxvZ0xuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2Vycm9y
TWVzc2FnZSA9IHZhbGlkYXRlUmVzdWx0LmVycm9yKCk7IC8vIEZJWE1FIG1ha2UgdGhpcyBhbiBF
eHBlY3RlZC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgICBBU1NFUlQo
dmFsaWRhdGVGdW5jdGlvbihmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJl
LCBtX2Z1bmN0aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pKTsKIAogICAgICAg
ICB1bmxpbmtlZFdhc21Ub1dhc21DYWxscy51bmNoZWNrZWRBcHBlbmQoVmVjdG9yPFVubGlua2Vk
V2FzbVRvV2FzbUNhbGw+KCkpOwogICAgICAgICBhdXRvIHBhcnNlQW5kQ29tcGlsZVJlc3VsdCA9
IHBhcnNlQW5kQ29tcGlsZSgqbV92bSwgZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNp
Z25hdHVyZSwgdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMuYXQoZnVuY3Rpb25JbmRleCksIG1fZnVu
Y3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlvbik7CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93YXNtL1dhc21QbGFuLmgJKHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDYgKzQ4LDgg
QEAgcHVibGljOgogICAgIEpTX0VYUE9SVF9QUklWQVRFIFBsYW4oVk0qLCBjb25zdCB1aW50OF90
Kiwgc2l6ZV90KTsKICAgICBKU19FWFBPUlRfUFJJVkFURSB+UGxhbigpOwogCisgICAgYm9vbCBp
c1ZhbGlkTW9kdWxlKCk7CisKICAgICBKU19FWFBPUlRfUFJJVkFURSB2b2lkIHJ1bigpOwogCiAg
ICAgSlNfRVhQT1JUX1BSSVZBVEUgdm9pZCBpbml0aWFsaXplQ2FsbGVlcyhKU0dsb2JhbE9iamVj
dCosIHN0ZDo6ZnVuY3Rpb248dm9pZCh1bnNpZ25lZCwgSlNXZWJBc3NlbWJseUNhbGxlZSosIEpT
V2ViQXNzZW1ibHlDYWxsZWUqKT4pOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20v
anMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAJ
KHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFz
c2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Miw3ICs1Miwy
MCBAQCBjb25zdCBDbGFzc0luZm8gV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1CiAgQGVuZAogICov
CiAKLXN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNvbnN0cnVjdEpTV2ViQXNz
ZW1ibHlNb2R1bGUoRXhlY1N0YXRlKiBzdGF0ZSkKK3N0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0Nf
SE9TVF9DQUxMIGNvbnN0cnVjdEpTV2ViQXNzZW1ibHlNb2R1bGUoRXhlY1N0YXRlKiBleGVjKQor
eworICAgIGF1dG8qIHN0cnVjdHVyZSA9IEludGVybmFsRnVuY3Rpb246OmNyZWF0ZVN1YmNsYXNz
U3RydWN0dXJlKGV4ZWMsIGV4ZWMtPm5ld1RhcmdldCgpLCBleGVjLT5sZXhpY2FsR2xvYmFsT2Jq
ZWN0KCktPldlYkFzc2VtYmx5TW9kdWxlU3RydWN0dXJlKCkpOworICAgIHJldHVybiBKU1ZhbHVl
OjplbmNvZGUoV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvcjo6Y3JlYXRlTW9kdWxlKGV4ZWMs
IHN0cnVjdHVyZSkpOworfQorCitzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBj
YWxsSlNXZWJBc3NlbWJseU1vZHVsZShFeGVjU3RhdGUqIHN0YXRlKQoreworICAgIFZNJiB2bSA9
IHN0YXRlLT52bSgpOworICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKHZtKTsK
KyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93Q29uc3RydWN0b3JDYW5ub3RCZUNhbGxl
ZEFzRnVuY3Rpb25UeXBlRXJyb3Ioc3RhdGUsIHNjb3BlLCAiV2ViQXNzZW1ibHkuTW9kdWxlIikp
OworfQorCitKU1ZhbHVlIFdlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3I6OmNyZWF0ZU1vZHVs
ZShFeGVjU3RhdGUqIHN0YXRlLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSkKIHsKICAgICBWTSYgdm0g
PSBzdGF0ZS0+dm0oKTsKICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7
CkBAIC02MSwxMSArNzQsMTMgQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwg
Y29ucwogICAgIC8vIElmIHRoZSBnaXZlbiBieXRlcyBhcmd1bWVudCBpcyBub3QgYSBCdWZmZXJT
b3VyY2UsIGEgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgSlNBcnJheUJ1ZmZl
ciogYXJyYXlCdWZmZXIgPSB2YWwuZ2V0T2JqZWN0KCkgPyBqc0R5bmFtaWNDYXN0PEpTQXJyYXlC
dWZmZXIqPih2YWwuZ2V0T2JqZWN0KCkpIDogbnVsbHB0cjsKICAgICBKU0FycmF5QnVmZmVyVmll
dyogYXJyYXlCdWZmZXJWaWV3ID0gdmFsLmdldE9iamVjdCgpID8ganNEeW5hbWljQ2FzdDxKU0Fy
cmF5QnVmZmVyVmlldyo+KHZhbC5nZXRPYmplY3QoKSkgOiBudWxscHRyOwotICAgIGlmICghKGFy
cmF5QnVmZmVyIHx8IGFycmF5QnVmZmVyVmlldykpCi0gICAgICAgIHJldHVybiBKU1ZhbHVlOjpl
bmNvZGUodGhyb3dFeGNlcHRpb24oc3RhdGUsIHNjb3BlLCBjcmVhdGVUeXBlRXJyb3Ioc3RhdGUs
IEFTQ0lJTGl0ZXJhbCgiZmlyc3QgYXJndW1lbnQgdG8gV2ViQXNzZW1ibHkuTW9kdWxlIG11c3Qg
YmUgYW4gQXJyYXlCdWZmZXJWaWV3IG9yIGFuIEFycmF5QnVmZmVyIiksIGRlZmF1bHRTb3VyY2VB
cHBlbmRlciwgcnVudGltZVR5cGVGb3JWYWx1ZSh2YWwpKSkpOworICAgIGlmICghKGFycmF5QnVm
ZmVyIHx8IGFycmF5QnVmZmVyVmlldykpIHsKKyAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9u
KHN0YXRlLCBzY29wZSwgY3JlYXRlVHlwZUVycm9yKHN0YXRlLCBBU0NJSUxpdGVyYWwoImZpcnN0
IGFyZ3VtZW50IHRvIFdlYkFzc2VtYmx5Lk1vZHVsZSBtdXN0IGJlIGFuIEFycmF5QnVmZmVyVmll
dyBvciBhbiBBcnJheUJ1ZmZlciIpLCBkZWZhdWx0U291cmNlQXBwZW5kZXIsIHJ1bnRpbWVUeXBl
Rm9yVmFsdWUodmFsKSkpOworICAgIH0KIAotICAgIGlmIChhcnJheUJ1ZmZlclZpZXcgPyBhcnJh
eUJ1ZmZlclZpZXctPmlzTmV1dGVyZWQoKSA6IGFycmF5QnVmZmVyLT5pbXBsKCktPmlzTmV1dGVy
ZWQoKSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd0V4Y2VwdGlvbihzdGF0
ZSwgc2NvcGUsIGNyZWF0ZVR5cGVFcnJvcihzdGF0ZSwgQVNDSUlMaXRlcmFsKCJ1bmRlcmx5aW5n
IFR5cGVkQXJyYXkgaGFzIGJlZW4gZGV0YXRjaGVkIGZyb20gdGhlIEFycmF5QnVmZmVyIiksIGRl
ZmF1bHRTb3VyY2VBcHBlbmRlciwgcnVudGltZVR5cGVGb3JWYWx1ZSh2YWwpKSkpOworICAgIGlm
IChhcnJheUJ1ZmZlclZpZXcgPyBhcnJheUJ1ZmZlclZpZXctPmlzTmV1dGVyZWQoKSA6IGFycmF5
QnVmZmVyLT5pbXBsKCktPmlzTmV1dGVyZWQoKSkgeworICAgICAgICByZXR1cm4gdGhyb3dFeGNl
cHRpb24oc3RhdGUsIHNjb3BlLCBjcmVhdGVUeXBlRXJyb3Ioc3RhdGUsIEFTQ0lJTGl0ZXJhbCgi
dW5kZXJseWluZyBUeXBlZEFycmF5IGhhcyBiZWVuIGRldGF0Y2hlZCBmcm9tIHRoZSBBcnJheUJ1
ZmZlciIpLCBkZWZhdWx0U291cmNlQXBwZW5kZXIsIHJ1bnRpbWVUeXBlRm9yVmFsdWUodmFsKSkp
OworICAgIH0KIAogICAgIHNpemVfdCBieXRlT2Zmc2V0ID0gYXJyYXlCdWZmZXJWaWV3ID8gYXJy
YXlCdWZmZXJWaWV3LT5ieXRlT2Zmc2V0KCkgOiAwOwogICAgIHNpemVfdCBieXRlU2l6ZSA9IGFy
cmF5QnVmZmVyVmlldyA/IGFycmF5QnVmZmVyVmlldy0+bGVuZ3RoKCkgOiBhcnJheUJ1ZmZlci0+
aW1wbCgpLT5ieXRlTGVuZ3RoKCk7CkBAIC03NCwxMSArODksMTEgQEAgc3RhdGljIEVuY29kZWRK
U1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29ucwogICAgIFdhc206OlBsYW4gcGxhbigmdm0sIGJhc2Ug
KyBieXRlT2Zmc2V0LCBieXRlU2l6ZSk7CiAgICAgLy8gT24gZmFpbHVyZSwgYSBuZXcgV2ViQXNz
ZW1ibHkuQ29tcGlsZUVycm9yIGlzIHRocm93bi4KICAgICBwbGFuLnJ1bigpOwotICAgIGlmIChw
bGFuLmZhaWxlZCgpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93RXhjZXB0
aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRlV2ViQXNzZW1ibHlDb21waWxlRXJyb3Ioc3RhdGUsIHBs
YW4uZXJyb3JNZXNzYWdlKCkpKSk7CisgICAgaWYgKHBsYW4uZmFpbGVkKCkpIHsKKyAgICAgICAg
cmV0dXJuIHRocm93RXhjZXB0aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRlV2ViQXNzZW1ibHlDb21w
aWxlRXJyb3Ioc3RhdGUsIHBsYW4uZXJyb3JNZXNzYWdlKCkpKTsKKyAgICB9CiAKICAgICAvLyBP
biBzdWNjZXNzLCBhIG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUgb2JqZWN0IGlzIHJldHVybmVkIHdp
dGggW1tNb2R1bGVdXSBzZXQgdG8gdGhlIHZhbGlkYXRlZCBBc3QubW9kdWxlLgotICAgIGF1dG8q
IHN0cnVjdHVyZSA9IEludGVybmFsRnVuY3Rpb246OmNyZWF0ZVN1YmNsYXNzU3RydWN0dXJlKHN0
YXRlLCBzdGF0ZS0+bmV3VGFyZ2V0KCksIGFzSW50ZXJuYWxGdW5jdGlvbihzdGF0ZS0+anNDYWxs
ZWUoKSktPmdsb2JhbE9iamVjdCgpLT5XZWJBc3NlbWJseU1vZHVsZVN0cnVjdHVyZSgpKTsKICAg
ICBSRVRVUk5fSUZfRVhDRVBUSU9OKHNjb3BlLCB7IH0pOwogCiAgICAgLy8gVGhlIGV4cG9ydCBz
eW1ib2wgdGFibGUgaXMgdGhlIHNhbWUgZm9yIGFsbCBJbnN0YW5jZXMgb2YgYSBNb2R1bGUuCkBA
IC05NiwxNCArMTExLDggQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29u
cwogICAgICAgICAgICAgcmVzdWx0LT5zZXRKU0VudHJ5cG9pbnRDYWxsZWUodm0sIGNhbGxlZUlu
ZGV4LCBqc0VudHJ5cG9pbnRDYWxsZWUpOwogICAgICAgICAgICAgcmVzdWx0LT5zZXRXYXNtRW50
cnlwb2ludENhbGxlZSh2bSwgY2FsbGVlSW5kZXgsIHdhc21FbnRyeXBvaW50Q2FsbGVlKTsKICAg
ICAgICAgfSk7Ci0gICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShyZXN1bHQpOwotfQogCi1zdGF0
aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBjYWxsSlNXZWJBc3NlbWJseU1vZHVsZShF
eGVjU3RhdGUqIHN0YXRlKQotewotICAgIFZNJiB2bSA9IHN0YXRlLT52bSgpOwotICAgIGF1dG8g
c2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKHZtKTsKLSAgICByZXR1cm4gSlNWYWx1ZTo6ZW5j
b2RlKHRocm93Q29uc3RydWN0b3JDYW5ub3RCZUNhbGxlZEFzRnVuY3Rpb25UeXBlRXJyb3Ioc3Rh
dGUsIHNjb3BlLCAiV2ViQXNzZW1ibHkuTW9kdWxlIikpOworICAgIHJldHVybiByZXN1bHQ7CiB9
CiAKIFdlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IqIFdlYkFzc2VtYmx5TW9kdWxlQ29uc3Ry
dWN0b3I6OmNyZWF0ZShWTSYgdm0sIFN0cnVjdHVyZSogc3RydWN0dXJlLCBXZWJBc3NlbWJseU1v
ZHVsZVByb3RvdHlwZSogdGhpc1Byb3RvdHlwZSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS93YXNtL2pzL1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9y
LmgJKHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dl
YkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtNDQsNiArNDQs
OCBAQCBwdWJsaWM6CiAKICAgICBERUNMQVJFX0lORk87CiAKKyAgICBzdGF0aWMgSlNWYWx1ZSBj
cmVhdGVNb2R1bGUoRXhlY1N0YXRlKiwgU3RydWN0dXJlKik7CisKIHByb3RlY3RlZDoKICAgICB2
b2lkIGZpbmlzaENyZWF0aW9uKFZNJiwgV2ViQXNzZW1ibHlNb2R1bGVQcm90b3R5cGUqKTsKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297388</attachid>
            <date>2016-12-16 19:50:30 -0800</date>
            <delta_ts>2016-12-18 14:20:25 -0800</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>18585</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMDk5NTUpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE2IEBACisyMDE2LTEyLTE2ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUu
Y29tPgorCisgICAgICAgIFdlYkFzc2VtYmx5OiBJbXBsZW1lbnQgdGhlIFdlYkFzc2VtYmx5LmNv
bXBpbGUgYW5kIFdlYkFzc2VtYmx5LnZhbGlkYXRlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjU5MzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICAqIHdhc20vanMtYXBpL3Rlc3RfTW9kdWxlLmpzOgorICAg
ICAgICAoYXN5bmMudGVzdFByb21pc2VBUEkpOgorICAgICAgICAqIHdhc20vanMtYXBpL3Rlc3Rf
YmFzaWNfYXBpLmpzOgorICAgICAgICAqIHdhc20vanMtYXBpL3ZhbGlkYXRlLmpzOiBBZGRlZC4K
KyAgICAgICAgKGFzc2VydC50cnV0aHkuV2ViQXNzZW1ibHkudmFsaWRhdGUuYnVpbGRlci5XZWJB
c3NlbWJseSk6CisKIDIwMTYtMTItMTYgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgog
CiAgICAgICAgIERlLWR1cGxpY2F0ZSBmaW5hbGx5IGJsb2Nrcy4KSW5kZXg6IEpTVGVzdHMvd2Fz
bS9qcy1hcGkvdGVzdF9Nb2R1bGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSlNUZXN0cy93YXNtL2pzLWFw
aS90ZXN0X01vZHVsZS5qcwkocmV2aXNpb24gMjA5OTU1KQorKysgSlNUZXN0cy93YXNtL2pzLWFw
aS90ZXN0X01vZHVsZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMTcsMyArMTcsNDcgQEAgaW1wb3J0
IEJ1aWxkZXIgZnJvbSAnLi4vQnVpbGRlci5qcyc7CiAgICAgY29uc3QgYmluID0gYnVpbGRlci5X
ZWJBc3NlbWJseSgpLmdldCgpOwogICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBXZWJBc3NlbWJseS5N
b2R1bGUoYmluKTsKIH0pKCk7CisKK2xldCBkb25lID0gZmFsc2U7Cithc3luYyBmdW5jdGlvbiB0
ZXN0UHJvbWlzZUFQSSgpIHsKKyAgICB7CisgICAgICAgIC8vIENhbid0IGRlY2xhcmUgbW9yZSB0
aGFuIG9uZSBtZW1vcnkuCisgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSAobmV3IEJ1aWxkZXIoKSkK
KyAgICAgICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgICAgIC5JbXBvcnQoKS5NZW1vcnko
ImltcCIsICJtZW1vcnkiLCB7aW5pdGlhbDogMjB9KS5FbmQoKQorICAgICAgICAgICAgLkZ1bmN0
aW9uKCkuRW5kKCkKKyAgICAgICAgICAgIC5NZW1vcnkoKS5Jbml0aWFsTWF4UGFnZXMoMSwgMSku
RW5kKCkKKyAgICAgICAgICAgIC5FeHBvcnQoKS5FbmQoKQorICAgICAgICAgICAgLkNvZGUoKQor
ICAgICAgICAgICAgLkVuZCgpOworCisgICAgICAgIGxldCB0aHJldyA9IGZhbHNlOworICAgICAg
ICB0cnkgeworICAgICAgICAgICAgYXdhaXQgV2ViQXNzZW1ibHkuY29tcGlsZShidWlsZGVyLldl
YkFzc2VtYmx5KCkuZ2V0KCkpOworICAgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgICAgIHRo
cmV3ID0gdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydC50cnV0aHkoZSBpbnN0YW5jZW9mIFdlYkFz
c2VtYmx5LkNvbXBpbGVFcnJvcik7CisgICAgICAgICAgICBhc3NlcnQudHJ1dGh5KGUubWVzc2Fn
ZSA9PT0gIldlYkFzc2VtYmx5Lk1vZHVsZSBkb2Vzbid0IHBhcnNlIGF0IGJ5dGUgMzQgLyA0Mzog
TWVtb3J5IHNlY3Rpb24gY2Fubm90IGV4aXN0IGlmIGFuIEltcG9ydCBoYXMgYSBtZW1vcnkgKGV2
YWx1YXRpbmcgJ1dlYkFzc2VtYmx5LmNvbXBpbGUoYnVpbGRlci5XZWJBc3NlbWJseSgpLmdldCgp
KScpIik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0LnRydXRoeSh0aHJldyk7CisgICAgfQor
CisgICAgeworICAgICAgICBjb25zdCBidWlsZGVyID0gKG5ldyBCdWlsZGVyKCkpCisgICAgICAg
ICAgICAuVHlwZSgpLkVuZCgpCisgICAgICAgICAgICAuSW1wb3J0KCkuTWVtb3J5KCJpbXAiLCAi
bWVtb3J5Iiwge2luaXRpYWw6IDIwfSkuRW5kKCkKKyAgICAgICAgICAgIC5GdW5jdGlvbigpLkVu
ZCgpCisgICAgICAgICAgICAuRXhwb3J0KCkuRW5kKCkKKyAgICAgICAgICAgIC5Db2RlKCkKKyAg
ICAgICAgICAgIC5FbmQoKTsKKworICAgICAgICBsZXQgbW9kdWxlID0gYXdhaXQgV2ViQXNzZW1i
bHkuY29tcGlsZShidWlsZGVyLldlYkFzc2VtYmx5KCkuZ2V0KCkpOworICAgICAgICBhc3NlcnQu
dHJ1dGh5KG1vZHVsZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lk1vZHVsZSk7CisgICAgfQorCisg
ICAgZG9uZSA9IHRydWU7Cit9CisKK3Rlc3RQcm9taXNlQVBJKCk7CitkcmFpbk1pY3JvdGFza3Mo
KTsKK2Fzc2VydC50cnV0aHkoZG9uZSk7CkluZGV4OiBKU1Rlc3RzL3dhc20vanMtYXBpL3Rlc3Rf
YmFzaWNfYXBpLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvd2FzbS9qcy1hcGkvdGVzdF9iYXNp
Y19hcGkuanMJKHJldmlzaW9uIDIwOTk1NSkKKysrIEpTVGVzdHMvd2FzbS9qcy1hcGkvdGVzdF9i
YXNpY19hcGkuanMJKHdvcmtpbmcgY29weSkKQEAgLTk3LDggKzk3LDMgQEAgZm9yIChjb25zdCBj
IGluIGNvbnN0cnVjdG9yUHJvcGVydGllcykgewogICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJv
cihgSW1wbGVtZW50YXRpb24gZXJyb3I6IHVuZXhwZWN0ZWQgY29uc3RydWN0b3IgcHJvcGVydHkg
IiR7Y30iYCk7CiAgICAgfQogfQotCi0vLyBGSVhNRSBJbXBsZW1lbnQgYW5kIHRlc3QgdGhlc2Ug
QVBJcyBmdXJ0aGVyLiBGb3Igbm93IHRoZXkganVzdCB0aHJvdy4gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE1OTc3NQotZm9yIChjb25zdCBmIGluIGZ1bmN0aW9uUHJv
cGVydGllcykgewotICAgIGFzc2VydC50aHJvd3MoKCkgPT4gV2ViQXNzZW1ibHlbZl0oKSwgRXJy
b3IsIGBXZWJBc3NlbWJseSBkb2Vzbid0IHlldCBpbXBsZW1lbnQgdGhlICR7Zn0gZnVuY3Rpb24g
cHJvcGVydHlgKTsKLX0KSW5kZXg6IEpTVGVzdHMvd2FzbS9qcy1hcGkvdmFsaWRhdGUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSlNUZXN0cy93YXNtL2pzLWFwaS92YWxpZGF0ZS5qcwkobm9uZXhpc3RlbnQp
CisrKyBKU1Rlc3RzL3dhc20vanMtYXBpL3ZhbGlkYXRlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMjcgQEAKK2ltcG9ydCAqIGFzIGFzc2VydCBmcm9tICcuLi9hc3NlcnQuanMnOworaW1w
b3J0IEJ1aWxkZXIgZnJvbSAnLi4vQnVpbGRlci5qcyc7CisKK3sKKyAgICBjb25zdCBidWlsZGVy
ID0gKG5ldyBCdWlsZGVyKCkpCisgICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgLkltcG9y
dCgpLk1lbW9yeSgiaW1wIiwgIm1lbW9yeSIsIHtpbml0aWFsOiAyMH0pLkVuZCgpCisgICAgICAg
IC5GdW5jdGlvbigpLkVuZCgpCisgICAgICAgIC5NZW1vcnkoKS5Jbml0aWFsTWF4UGFnZXMoMSwg
MSkuRW5kKCkKKyAgICAgICAgLkV4cG9ydCgpLkVuZCgpCisgICAgICAgIC5Db2RlKCkKKyAgICAg
ICAgLkVuZCgpOworCisgICAgYXNzZXJ0LnRydXRoeSghV2ViQXNzZW1ibHkudmFsaWRhdGUoYnVp
bGRlci5XZWJBc3NlbWJseSgpLmdldCgpKSk7Cit9CisKK3sKKyAgICBjb25zdCBidWlsZGVyID0g
KG5ldyBCdWlsZGVyKCkpCisgICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgLkltcG9ydCgp
Lk1lbW9yeSgiaW1wIiwgIm1lbW9yeSIsIHtpbml0aWFsOiAyMH0pLkVuZCgpCisgICAgICAgIC5G
dW5jdGlvbigpLkVuZCgpCisgICAgICAgIC5FeHBvcnQoKS5FbmQoKQorICAgICAgICAuQ29kZSgp
CisgICAgICAgIC5FbmQoKTsKKworICAgIGFzc2VydC50cnV0aHkoV2ViQXNzZW1ibHkudmFsaWRh
dGUoYnVpbGRlci5XZWJBc3NlbWJseSgpLmdldCgpKSk7Cit9CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9D
aGFuZ2VMb2cJKHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFu
Z2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyOCBAQAorMjAxNi0xMi0xNiAgU2FhbSBC
YXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KKworICAgICAgICBXZWJBc3NlbWJseTogSW1wbGVt
ZW50IHRoZSBXZWJBc3NlbWJseS5jb21waWxlIGFuZCBXZWJBc3NlbWJseS52YWxpZGF0ZQorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY1OTM2CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhlIEFQSXMgYXJl
IGRvY3VtZW50ZWQgaGVyZToKKyAgICAgICAgLSBodHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1i
bHkvZGVzaWduL2Jsb2IvbWFzdGVyL0pTLm1kI3dlYmFzc2VtYmx5Y29tcGlsZQorICAgICAgICAt
IGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9kZXNpZ24vYmxvYi9tYXN0ZXIvSlMubWQj
d2ViYXNzZW1ibHl2YWxpZGF0ZQorCisgICAgICAgICogd2FzbS9KU1dlYkFzc2VtYmx5LmNwcDoK
KyAgICAgICAgKEpTQzo6d2ViQXNzZW1ibHlDb21waWxlRnVuYyk6CisgICAgICAgIChKU0M6Ondl
YkFzc2VtYmx5VmFsaWRhdGVGdW5jKToKKyAgICAgICAgKEpTQzo6SlNXZWJBc3NlbWJseTo6Zmlu
aXNoQ3JlYXRpb24pOgorICAgICAgICAqIHdhc20vV2FzbVBsYW4uY3BwOgorICAgICAgICAoSlND
OjpXYXNtOjpQbGFuOjppc1ZhbGlkTW9kdWxlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6
cnVuKToKKyAgICAgICAgKiB3YXNtL1dhc21QbGFuLmg6CisgICAgICAgICogd2FzbS9qcy9XZWJB
c3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6Y29uc3RydWN0SlNX
ZWJBc3NlbWJseU1vZHVsZSk6CisgICAgICAgIChKU0M6OmNhbGxKU1dlYkFzc2VtYmx5TW9kdWxl
KToKKyAgICAgICAgKEpTQzo6V2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvcjo6Y3JlYXRlTW9k
dWxlKToKKyAgICAgICAgKiB3YXNtL2pzL1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuaDoK
KwogMjAxNi0xMi0xNiAgU2FhbSBCYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KIAogICAgICAg
ICBXZWJBc3NlbWJseTogV2Ugc3RpbGwgaGF2ZSBzb21lIGluY29ycmVjdCBwYXJzaW5nIHByb2R1
Y3Rpb25zIGluc2lkZSB1bnJlYWNoYWJsZSBjb2RlCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9KU1dlYkFzc2VtYmx5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9KU1dlYkFzc2VtYmx5LmNwcAkocmV2aXNpb24gMjA5OTU1KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vSlNXZWJBc3NlbWJseS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI4LDEzICsyOCw2NyBAQAogCiAjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQogCisjaW5jbHVkZSAi
RXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiRnVuY3Rpb25Qcm90b3R5cGUuaCIKKyNpbmNsdWRlICJK
U0FycmF5QnVmZmVyLmgiCiAjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgorI2luY2x1ZGUgIkpTUHJv
bWlzZURlZmVycmVkLmgiCisjaW5jbHVkZSAiV2FzbVBsYW4uaCIKKyNpbmNsdWRlICJXZWJBc3Nl
bWJseU1vZHVsZUNvbnN0cnVjdG9yLmgiCiAKIG5hbWVzcGFjZSBKU0MgewogCiBTVEFUSUNfQVNT
RVJUX0lTX1RSSVZJQUxMWV9ERVNUUlVDVElCTEUoSlNXZWJBc3NlbWJseSk7CiAKK0VuY29kZWRK
U1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlWYWxpZGF0ZUZ1bmMoRXhlY1N0YXRlKik7
CitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIHdlYkFzc2VtYmx5Q29tcGlsZUZ1bmMoRXhl
Y1N0YXRlKik7CisKK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlDb21w
aWxlRnVuYyhFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKKyAg
ICBhdXRvIGNhdGNoU2NvcGUgPSBERUNMQVJFX0NBVENIX1NDT1BFKHZtKTsKKworICAgIEpTUHJv
bWlzZURlZmVycmVkKiBwcm9taXNlID0gIEpTUHJvbWlzZURlZmVycmVkOjpjcmVhdGUoZXhlYywg
ZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpKTsKKyAgICBSRVRVUk5fSUZfRVhDRVBUSU9OKGNh
dGNoU2NvcGUsIHsgfSk7CisKKyAgICBKU1ZhbHVlIG1vZHVsZSA9IFdlYkFzc2VtYmx5TW9kdWxl
Q29uc3RydWN0b3I6OmNyZWF0ZU1vZHVsZShleGVjLCBleGVjLT5sZXhpY2FsR2xvYmFsT2JqZWN0
KCktPldlYkFzc2VtYmx5TW9kdWxlU3RydWN0dXJlKCkpOworICAgIGlmIChFeGNlcHRpb24qIGV4
Y2VwdGlvbiA9IGNhdGNoU2NvcGUuZXhjZXB0aW9uKCkpIHsKKyAgICAgICAgY2F0Y2hTY29wZS5j
bGVhckV4Y2VwdGlvbigpOworICAgICAgICBwcm9taXNlLT5yZWplY3QoZXhlYywgZXhjZXB0aW9u
KTsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShwcm9taXNlLT5wcm9taXNlKCkpOwor
ICAgIH0KKworICAgIHByb21pc2UtPnJlc29sdmUoZXhlYywgbW9kdWxlKTsKKyAgICByZXR1cm4g
SlNWYWx1ZTo6ZW5jb2RlKHByb21pc2UtPnByb21pc2UoKSk7Cit9CisKK0VuY29kZWRKU1ZhbHVl
IEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1ibHlWYWxpZGF0ZUZ1bmMoRXhlY1N0YXRlKiBleGVjKQor
eworICAgIFZNJiB2bSA9IGV4ZWMtPnZtKCk7CisgICAgYXV0byBzY29wZSA9IERFQ0xBUkVfVEhS
T1dfU0NPUEUodm0pOworCisgICAgSlNWYWx1ZSB2YWwgPSBleGVjLT5hcmd1bWVudCgwKTsKKwor
ICAgIC8vIElmIHRoZSBnaXZlbiBieXRlcyBhcmd1bWVudCBpcyBub3QgYSBCdWZmZXJTb3VyY2Us
IGEgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgSlNBcnJheUJ1ZmZlciogYXJy
YXlCdWZmZXIgPSB2YWwuZ2V0T2JqZWN0KCkgPyBqc0R5bmFtaWNDYXN0PEpTQXJyYXlCdWZmZXIq
Pih2YWwuZ2V0T2JqZWN0KCkpIDogbnVsbHB0cjsKKyAgICBKU0FycmF5QnVmZmVyVmlldyogYXJy
YXlCdWZmZXJWaWV3ID0gdmFsLmdldE9iamVjdCgpID8ganNEeW5hbWljQ2FzdDxKU0FycmF5QnVm
ZmVyVmlldyo+KHZhbC5nZXRPYmplY3QoKSkgOiBudWxscHRyOworICAgIGlmICghKGFycmF5QnVm
ZmVyIHx8IGFycmF5QnVmZmVyVmlldykpIHsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29k
ZSh0aHJvd0V4Y2VwdGlvbihleGVjLCBzY29wZSwgY3JlYXRlVHlwZUVycm9yKGV4ZWMsCisgICAg
ICAgICAgICBBU0NJSUxpdGVyYWwoImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXlCdWZm
ZXJWaWV3IG9yIGFuIEFycmF5QnVmZmVyIiksIGRlZmF1bHRTb3VyY2VBcHBlbmRlciwgcnVudGlt
ZVR5cGVGb3JWYWx1ZSh2YWwpKSkpOworICAgIH0KKworICAgIGlmIChhcnJheUJ1ZmZlclZpZXcg
PyBhcnJheUJ1ZmZlclZpZXctPmlzTmV1dGVyZWQoKSA6IGFycmF5QnVmZmVyLT5pbXBsKCktPmlz
TmV1dGVyZWQoKSkgeworICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93RXhjZXB0
aW9uKGV4ZWMsIHNjb3BlLCBjcmVhdGVUeXBlRXJyb3IoZXhlYywKKyAgICAgICAgICAgIEFTQ0lJ
TGl0ZXJhbCgidW5kZXJseWluZyBUeXBlZEFycmF5IGhhcyBiZWVuIGRldGF0Y2hlZCBmcm9tIHRo
ZSBBcnJheUJ1ZmZlciIpLCBkZWZhdWx0U291cmNlQXBwZW5kZXIsIHJ1bnRpbWVUeXBlRm9yVmFs
dWUodmFsKSkpKTsKKyAgICB9CisKKyAgICBzaXplX3QgYnl0ZU9mZnNldCA9IGFycmF5QnVmZmVy
VmlldyA/IGFycmF5QnVmZmVyVmlldy0+Ynl0ZU9mZnNldCgpIDogMDsKKyAgICBzaXplX3QgYnl0
ZVNpemUgPSBhcnJheUJ1ZmZlclZpZXcgPyBhcnJheUJ1ZmZlclZpZXctPmxlbmd0aCgpIDogYXJy
YXlCdWZmZXItPmltcGwoKS0+Ynl0ZUxlbmd0aCgpOworICAgIGNvbnN0IGF1dG8qIGJhc2UgPSBh
cnJheUJ1ZmZlclZpZXcgPyBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYXJyYXlCdWZmZXJWaWV3LT52
ZWN0b3IoKSkgOiBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYXJyYXlCdWZmZXItPmltcGwoKS0+ZGF0
YSgpKTsKKyAgICBXYXNtOjpQbGFuIHBsYW4oJnZtLCBiYXNlICsgYnl0ZU9mZnNldCwgYnl0ZVNp
emUpOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNCb29sZWFuKHBsYW4uaXNWYWxpZE1v
ZHVsZSgpKSk7Cit9CisKIGNvbnN0IENsYXNzSW5mbyBKU1dlYkFzc2VtYmx5OjpzX2luZm8gPSB7
ICJXZWJBc3NlbWJseSIsICZCYXNlOjpzX2luZm8sIDAsIENSRUFURV9NRVRIT0RfVEFCTEUoSlNX
ZWJBc3NlbWJseSkgfTsKIAogSlNXZWJBc3NlbWJseSogSlNXZWJBc3NlbWJseTo6Y3JlYXRlKFZN
JiB2bSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUp
CkBAIC00OSwxMCArMTAzLDEyIEBAIFN0cnVjdHVyZSogSlNXZWJBc3NlbWJseTo6Y3JlYXRlU3Ry
dWN0dXIKICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUodm0sIGdsb2JhbE9iamVjdCwgcHJv
dG90eXBlLCBUeXBlSW5mbyhPYmplY3RUeXBlLCBTdHJ1Y3R1cmVGbGFncyksIGluZm8oKSk7CiB9
CiAKLXZvaWQgSlNXZWJBc3NlbWJseTo6ZmluaXNoQ3JlYXRpb24oVk0mIHZtLCBKU0dsb2JhbE9i
amVjdCopCit2b2lkIEpTV2ViQXNzZW1ibHk6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgSlNHbG9i
YWxPYmplY3QqIGdsb2JhbE9iamVjdCkKIHsKICAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbih2bSk7
CiAgICAgQVNTRVJUKGluaGVyaXRzKGluZm8oKSkpOworICAgIEpTQ19OQVRJVkVfRlVOQ1RJT05f
V0lUSE9VVF9UUkFOU0lUSU9OKCJ2YWxpZGF0ZSIsIHdlYkFzc2VtYmx5VmFsaWRhdGVGdW5jLCBE
b250RW51bSwgMSk7CisgICAgSlNDX05BVElWRV9GVU5DVElPTl9XSVRIT1VUX1RSQU5TSVRJT04o
ImNvbXBpbGUiLCB3ZWJBc3NlbWJseUNvbXBpbGVGdW5jLCBEb250RW51bSwgMSk7CiB9CiAKIEpT
V2ViQXNzZW1ibHk6OkpTV2ViQXNzZW1ibHkoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAJKHJldmlzaW9uIDIw
OTk1NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNTgsMTQgKzU4LDE0IEBAIFBsYW46OlBsYW4oVk0qIHZtLCBjb25zdCB1aW50
OF90KiBzb3VyY2UKIHsKIH0KIAotdm9pZCBQbGFuOjpydW4oKQorYm9vbCBQbGFuOjppc1ZhbGlk
TW9kdWxlKCkKIHsKICAgICB7CiAgICAgICAgIE1vZHVsZVBhcnNlciBtb2R1bGVQYXJzZXIobV92
bSwgbV9zb3VyY2UsIG1fc291cmNlTGVuZ3RoKTsKICAgICAgICAgYXV0byBwYXJzZVJlc3VsdCA9
IG1vZHVsZVBhcnNlci5wYXJzZSgpOwogICAgICAgICBpZiAoIXBhcnNlUmVzdWx0KSB7CiAgICAg
ICAgICAgICBtX2Vycm9yTWVzc2FnZSA9IHBhcnNlUmVzdWx0LmVycm9yKCk7Ci0gICAgICAgICAg
ICByZXR1cm47IC8vIEZJWE1FIHJldHVybiBhbiBFeHBlY3RlZC4KKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtX21vZHVsZUluZm9ybWF0aW9uID0gV1RGTW92
ZShwYXJzZVJlc3VsdC0+bW9kdWxlKTsKICAgICAgICAgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5h
cnkgPSBXVEZNb3ZlKHBhcnNlUmVzdWx0LT5mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkpOwpAQCAt
NzMsNiArNzMsMzQgQEAgdm9pZCBQbGFuOjpydW4oKQogICAgICAgICBtX2Z1bmN0aW9uSW5kZXhT
cGFjZS5idWZmZXIgPSBwYXJzZVJlc3VsdC0+ZnVuY3Rpb25JbmRleFNwYWNlLnJlbGVhc2VCdWZm
ZXIoKTsKICAgICB9CiAKKyAgICBmb3IgKHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXggPSAwOyBmdW5j
dGlvbkluZGV4IDwgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpOyArK2Z1bmN0aW9u
SW5kZXgpIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBkYXRhTG9nTG4oIlBy
b2Nlc3NpbmcgZnVuY3Rpb24gc3RhcnRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmlu
YXJ5W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0LCAiIGFuZCBlbmRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25M
b2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLmVuZCk7CisgICAgICAgIGNvbnN0IHVpbnQ4
X3QqIGZ1bmN0aW9uU3RhcnQgPSBtX3NvdXJjZSArIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5
W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0OworICAgICAgICBzaXplX3QgZnVuY3Rpb25MZW5ndGggPSBt
X2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5lbmQgLSBtX2Z1bmN0aW9u
TG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydDsKKyAgICAgICAgQVNTRVJUKGZ1
bmN0aW9uTGVuZ3RoIDw9IG1fc291cmNlTGVuZ3RoKTsKKyAgICAgICAgU2lnbmF0dXJlKiBzaWdu
YXR1cmUgPSBtX21vZHVsZUluZm9ybWF0aW9uLT5pbnRlcm5hbEZ1bmN0aW9uU2lnbmF0dXJlc1tm
dW5jdGlvbkluZGV4XTsKKworICAgICAgICBhdXRvIHZhbGlkYXRlUmVzdWx0ID0gdmFsaWRhdGVG
dW5jdGlvbihmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJlLCBtX2Z1bmN0
aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pOworICAgICAgICBpZiAoIXZhbGlk
YXRlUmVzdWx0KSB7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmdW5jdGlvbkxlbmd0aDsgKytpKQorICAgICAgICAg
ICAgICAgICAgICBkYXRhTG9nKFJhd1BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZnVu
Y3Rpb25TdGFydFtpXSkpLCAiLCAiKTsKKyAgICAgICAgICAgICAgICBkYXRhTG9nTG4oKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fZXJyb3JNZXNzYWdlID0gdmFsaWRhdGVSZXN1bHQu
ZXJyb3IoKTsgLy8gRklYTUUgbWFrZSB0aGlzIGFuIEV4cGVjdGVkLgorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3Zv
aWQgUGxhbjo6cnVuKCkKK3sKKyAgICBpZiAoIWlzVmFsaWRNb2R1bGUoKSkgLy8gVGhpcyBhbHNv
IGNvbGxlY3RzIGEgYnVuY2ggb2YgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRvIHRoZSBhY3R1YWwg
Y29tcGlsYXRpb24uCisgICAgICAgIHJldHVybjsKKwogICAgIGF1dG8gdHJ5UmVzZXJ2ZUNhcGFj
aXR5ID0gW3RoaXNdIChhdXRvJiB2ZWN0b3IsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiB3aGF0
KSB7CiAgICAgICAgIGlmIChVTkxJS0VMWSghdmVjdG9yLnRyeVJlc2VydmVDYXBhY2l0eShzaXpl
KSkpIHsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKQEAgLTg0LDYgKzExMiw3
IEBAIHZvaWQgUGxhbjo6cnVuKCkKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAg
ICB9OworCiAgICAgVmVjdG9yPFZlY3RvcjxVbmxpbmtlZFdhc21Ub1dhc21DYWxsPj4gdW5saW5r
ZWRXYXNtVG9XYXNtQ2FsbHM7CiAgICAgaWYgKCF0cnlSZXNlcnZlQ2FwYWNpdHkobV93YXNtVG9K
U1N0dWJzLCBtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRGdW5jdGlvbnMuc2l6ZSgpLCAiIFdl
YkFzc2VtYmx5IHRvIEphdmFTY3JpcHQgc3R1YnMiKQogICAgICAgICB8fCAhdHJ5UmVzZXJ2ZUNh
cGFjaXR5KHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFy
eS5zaXplKCksICIgdW5saW5rZWQgV2ViQXNzZW1ibHkgdG8gV2ViQXNzZW1ibHkgY2FsbHMiKQpA
QCAtMTEyLDE2ICsxNDEsNyBAQCB2b2lkIFBsYW46OnJ1bigpCiAgICAgICAgIHVuc2lnbmVkIGZ1
bmN0aW9uSW5kZXhTcGFjZSA9IG1fd2FzbVRvSlNTdHVicy5zaXplKCkgKyBmdW5jdGlvbkluZGV4
OwogICAgICAgICBBU1NFUlQobV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2Z1bmN0
aW9uSW5kZXhTcGFjZV0uc2lnbmF0dXJlID09IHNpZ25hdHVyZSk7CiAKLSAgICAgICAgYXV0byB2
YWxpZGF0ZVJlc3VsdCA9IHZhbGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25M
ZW5ndGgsIHNpZ25hdHVyZSwgbV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0
aW9uKTsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZVJlc3VsdCkgewotICAgICAgICAgICAgaWYgKHZl
cmJvc2UpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZnVuY3Rp
b25MZW5ndGg7ICsraSkKLSAgICAgICAgICAgICAgICAgICAgZGF0YUxvZyhSYXdQb2ludGVyKHJl
aW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGZ1bmN0aW9uU3RhcnRbaV0pKSwgIiwgIik7Ci0gICAgICAg
ICAgICAgICAgZGF0YUxvZ0xuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2Vycm9y
TWVzc2FnZSA9IHZhbGlkYXRlUmVzdWx0LmVycm9yKCk7IC8vIEZJWE1FIG1ha2UgdGhpcyBhbiBF
eHBlY3RlZC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgICBBU1NFUlQo
dmFsaWRhdGVGdW5jdGlvbihmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJl
LCBtX2Z1bmN0aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pKTsKIAogICAgICAg
ICB1bmxpbmtlZFdhc21Ub1dhc21DYWxscy51bmNoZWNrZWRBcHBlbmQoVmVjdG9yPFVubGlua2Vk
V2FzbVRvV2FzbUNhbGw+KCkpOwogICAgICAgICBhdXRvIHBhcnNlQW5kQ29tcGlsZVJlc3VsdCA9
IHBhcnNlQW5kQ29tcGlsZSgqbV92bSwgZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNp
Z25hdHVyZSwgdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMuYXQoZnVuY3Rpb25JbmRleCksIG1fZnVu
Y3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlvbik7CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93YXNtL1dhc21QbGFuLmgJKHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ4LDYgKzQ4LDgg
QEAgcHVibGljOgogICAgIEpTX0VYUE9SVF9QUklWQVRFIFBsYW4oVk0qLCBjb25zdCB1aW50OF90
Kiwgc2l6ZV90KTsKICAgICBKU19FWFBPUlRfUFJJVkFURSB+UGxhbigpOwogCisgICAgYm9vbCBp
c1ZhbGlkTW9kdWxlKCk7CisKICAgICBKU19FWFBPUlRfUFJJVkFURSB2b2lkIHJ1bigpOwogCiAg
ICAgSlNfRVhQT1JUX1BSSVZBVEUgdm9pZCBpbml0aWFsaXplQ2FsbGVlcyhKU0dsb2JhbE9iamVj
dCosIHN0ZDo6ZnVuY3Rpb248dm9pZCh1bnNpZ25lZCwgSlNXZWJBc3NlbWJseUNhbGxlZSosIEpT
V2ViQXNzZW1ibHlDYWxsZWUqKT4pOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20v
anMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAJ
KHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pzL1dlYkFz
c2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Miw3ICs1Miwy
MCBAQCBjb25zdCBDbGFzc0luZm8gV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1CiAgQGVuZAogICov
CiAKLXN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNvbnN0cnVjdEpTV2ViQXNz
ZW1ibHlNb2R1bGUoRXhlY1N0YXRlKiBzdGF0ZSkKK3N0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0Nf
SE9TVF9DQUxMIGNvbnN0cnVjdEpTV2ViQXNzZW1ibHlNb2R1bGUoRXhlY1N0YXRlKiBleGVjKQor
eworICAgIGF1dG8qIHN0cnVjdHVyZSA9IEludGVybmFsRnVuY3Rpb246OmNyZWF0ZVN1YmNsYXNz
U3RydWN0dXJlKGV4ZWMsIGV4ZWMtPm5ld1RhcmdldCgpLCBleGVjLT5sZXhpY2FsR2xvYmFsT2Jq
ZWN0KCktPldlYkFzc2VtYmx5TW9kdWxlU3RydWN0dXJlKCkpOworICAgIHJldHVybiBKU1ZhbHVl
OjplbmNvZGUoV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvcjo6Y3JlYXRlTW9kdWxlKGV4ZWMs
IHN0cnVjdHVyZSkpOworfQorCitzdGF0aWMgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBj
YWxsSlNXZWJBc3NlbWJseU1vZHVsZShFeGVjU3RhdGUqIHN0YXRlKQoreworICAgIFZNJiB2bSA9
IHN0YXRlLT52bSgpOworICAgIGF1dG8gc2NvcGUgPSBERUNMQVJFX1RIUk9XX1NDT1BFKHZtKTsK
KyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93Q29uc3RydWN0b3JDYW5ub3RCZUNhbGxl
ZEFzRnVuY3Rpb25UeXBlRXJyb3Ioc3RhdGUsIHNjb3BlLCAiV2ViQXNzZW1ibHkuTW9kdWxlIikp
OworfQorCitKU1ZhbHVlIFdlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3I6OmNyZWF0ZU1vZHVs
ZShFeGVjU3RhdGUqIHN0YXRlLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSkKIHsKICAgICBWTSYgdm0g
PSBzdGF0ZS0+dm0oKTsKICAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7
CkBAIC02MiwxMCArNzUsMTAgQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwg
Y29ucwogICAgIEpTQXJyYXlCdWZmZXIqIGFycmF5QnVmZmVyID0gdmFsLmdldE9iamVjdCgpID8g
anNEeW5hbWljQ2FzdDxKU0FycmF5QnVmZmVyKj4odmFsLmdldE9iamVjdCgpKSA6IG51bGxwdHI7
CiAgICAgSlNBcnJheUJ1ZmZlclZpZXcqIGFycmF5QnVmZmVyVmlldyA9IHZhbC5nZXRPYmplY3Qo
KSA/IGpzRHluYW1pY0Nhc3Q8SlNBcnJheUJ1ZmZlclZpZXcqPih2YWwuZ2V0T2JqZWN0KCkpIDog
bnVsbHB0cjsKICAgICBpZiAoIShhcnJheUJ1ZmZlciB8fCBhcnJheUJ1ZmZlclZpZXcpKQotICAg
ICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93RXhjZXB0aW9uKHN0YXRlLCBzY29wZSwg
Y3JlYXRlVHlwZUVycm9yKHN0YXRlLCBBU0NJSUxpdGVyYWwoImZpcnN0IGFyZ3VtZW50IHRvIFdl
YkFzc2VtYmx5Lk1vZHVsZSBtdXN0IGJlIGFuIEFycmF5QnVmZmVyVmlldyBvciBhbiBBcnJheUJ1
ZmZlciIpLCBkZWZhdWx0U291cmNlQXBwZW5kZXIsIHJ1bnRpbWVUeXBlRm9yVmFsdWUodmFsKSkp
KTsKKyAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRlVHlw
ZUVycm9yKHN0YXRlLCBBU0NJSUxpdGVyYWwoImZpcnN0IGFyZ3VtZW50IHRvIFdlYkFzc2VtYmx5
Lk1vZHVsZSBtdXN0IGJlIGFuIEFycmF5QnVmZmVyVmlldyBvciBhbiBBcnJheUJ1ZmZlciIpLCBk
ZWZhdWx0U291cmNlQXBwZW5kZXIsIHJ1bnRpbWVUeXBlRm9yVmFsdWUodmFsKSkpOwogCiAgICAg
aWYgKGFycmF5QnVmZmVyVmlldyA/IGFycmF5QnVmZmVyVmlldy0+aXNOZXV0ZXJlZCgpIDogYXJy
YXlCdWZmZXItPmltcGwoKS0+aXNOZXV0ZXJlZCgpKQotICAgICAgICByZXR1cm4gSlNWYWx1ZTo6
ZW5jb2RlKHRocm93RXhjZXB0aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRlVHlwZUVycm9yKHN0YXRl
LCBBU0NJSUxpdGVyYWwoInVuZGVybHlpbmcgVHlwZWRBcnJheSBoYXMgYmVlbiBkZXRhdGNoZWQg
ZnJvbSB0aGUgQXJyYXlCdWZmZXIiKSwgZGVmYXVsdFNvdXJjZUFwcGVuZGVyLCBydW50aW1lVHlw
ZUZvclZhbHVlKHZhbCkpKSk7CisgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihzdGF0ZSwg
c2NvcGUsIGNyZWF0ZVR5cGVFcnJvcihzdGF0ZSwgQVNDSUlMaXRlcmFsKCJ1bmRlcmx5aW5nIFR5
cGVkQXJyYXkgaGFzIGJlZW4gZGV0YXRjaGVkIGZyb20gdGhlIEFycmF5QnVmZmVyIiksIGRlZmF1
bHRTb3VyY2VBcHBlbmRlciwgcnVudGltZVR5cGVGb3JWYWx1ZSh2YWwpKSk7CiAKICAgICBzaXpl
X3QgYnl0ZU9mZnNldCA9IGFycmF5QnVmZmVyVmlldyA/IGFycmF5QnVmZmVyVmlldy0+Ynl0ZU9m
ZnNldCgpIDogMDsKICAgICBzaXplX3QgYnl0ZVNpemUgPSBhcnJheUJ1ZmZlclZpZXcgPyBhcnJh
eUJ1ZmZlclZpZXctPmxlbmd0aCgpIDogYXJyYXlCdWZmZXItPmltcGwoKS0+Ynl0ZUxlbmd0aCgp
OwpAQCAtNzUsMTAgKzg4LDkgQEAgc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwg
Y29ucwogICAgIC8vIE9uIGZhaWx1cmUsIGEgbmV3IFdlYkFzc2VtYmx5LkNvbXBpbGVFcnJvciBp
cyB0aHJvd24uCiAgICAgcGxhbi5ydW4oKTsKICAgICBpZiAocGxhbi5mYWlsZWQoKSkKLSAgICAg
ICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd0V4Y2VwdGlvbihzdGF0ZSwgc2NvcGUsIGNy
ZWF0ZVdlYkFzc2VtYmx5Q29tcGlsZUVycm9yKHN0YXRlLCBwbGFuLmVycm9yTWVzc2FnZSgpKSkp
OworICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oc3RhdGUsIHNjb3BlLCBjcmVhdGVXZWJB
c3NlbWJseUNvbXBpbGVFcnJvcihzdGF0ZSwgcGxhbi5lcnJvck1lc3NhZ2UoKSkpOwogCiAgICAg
Ly8gT24gc3VjY2VzcywgYSBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlIG9iamVjdCBpcyByZXR1cm5l
ZCB3aXRoIFtbTW9kdWxlXV0gc2V0IHRvIHRoZSB2YWxpZGF0ZWQgQXN0Lm1vZHVsZS4KLSAgICBh
dXRvKiBzdHJ1Y3R1cmUgPSBJbnRlcm5hbEZ1bmN0aW9uOjpjcmVhdGVTdWJjbGFzc1N0cnVjdHVy
ZShzdGF0ZSwgc3RhdGUtPm5ld1RhcmdldCgpLCBhc0ludGVybmFsRnVuY3Rpb24oc3RhdGUtPmpz
Q2FsbGVlKCkpLT5nbG9iYWxPYmplY3QoKS0+V2ViQXNzZW1ibHlNb2R1bGVTdHJ1Y3R1cmUoKSk7
CiAgICAgUkVUVVJOX0lGX0VYQ0VQVElPTihzY29wZSwgeyB9KTsKIAogICAgIC8vIFRoZSBleHBv
cnQgc3ltYm9sIHRhYmxlIGlzIHRoZSBzYW1lIGZvciBhbGwgSW5zdGFuY2VzIG9mIGEgTW9kdWxl
LgpAQCAtOTYsMTQgKzEwOCw4IEBAIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxM
IGNvbnMKICAgICAgICAgICAgIHJlc3VsdC0+c2V0SlNFbnRyeXBvaW50Q2FsbGVlKHZtLCBjYWxs
ZWVJbmRleCwganNFbnRyeXBvaW50Q2FsbGVlKTsKICAgICAgICAgICAgIHJlc3VsdC0+c2V0V2Fz
bUVudHJ5cG9pbnRDYWxsZWUodm0sIGNhbGxlZUluZGV4LCB3YXNtRW50cnlwb2ludENhbGxlZSk7
CiAgICAgICAgIH0pOwotICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUocmVzdWx0KTsKLX0KIAot
c3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY2FsbEpTV2ViQXNzZW1ibHlNb2R1
bGUoRXhlY1N0YXRlKiBzdGF0ZSkKLXsKLSAgICBWTSYgdm0gPSBzdGF0ZS0+dm0oKTsKLSAgICBh
dXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7Ci0gICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZSh0aHJvd0NvbnN0cnVjdG9yQ2Fubm90QmVDYWxsZWRBc0Z1bmN0aW9uVHlwZUVycm9y
KHN0YXRlLCBzY29wZSwgIldlYkFzc2VtYmx5Lk1vZHVsZSIpKTsKKyAgICByZXR1cm4gcmVzdWx0
OwogfQogCiBXZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yKiBXZWJBc3NlbWJseU1vZHVsZUNv
bnN0cnVjdG9yOjpjcmVhdGUoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgV2ViQXNzZW1i
bHlNb2R1bGVQcm90b3R5cGUqIHRoaXNQcm90b3R5cGUpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1
Y3Rvci5oCShyZXZpc2lvbiAyMDk5NTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9q
cy9XZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDYg
KzQ0LDggQEAgcHVibGljOgogCiAgICAgREVDTEFSRV9JTkZPOwogCisgICAgc3RhdGljIEpTVmFs
dWUgY3JlYXRlTW9kdWxlKEV4ZWNTdGF0ZSosIFN0cnVjdHVyZSopOworCiBwcm90ZWN0ZWQ6CiAg
ICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYsIFdlYkFzc2VtYmx5TW9kdWxlUHJvdG90eXBlKik7
CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297446</attachid>
            <date>2016-12-18 14:20:25 -0800</date>
            <delta_ts>2016-12-18 17:35:18 -0800</delta_ts>
            <desc>patch</desc>
            <filename>a-backup.diff</filename>
            <type>text/plain</type>
            <size>21957</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMDk5NzUpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE4IEBACisyMDE2LTEyLTE4ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUu
Y29tPgorCisgICAgICAgIFdlYkFzc2VtYmx5OiBJbXBsZW1lbnQgdGhlIFdlYkFzc2VtYmx5LmNv
bXBpbGUgYW5kIFdlYkFzc2VtYmx5LnZhbGlkYXRlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjU5MzYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICAqIHdhc20vanMtYXBpL01vZHVsZS1jb21waWxlLmpzOiBB
ZGRlZC4KKyAgICAgICAgKGFzeW5jLnRlc3RQcm9taXNlQVBJKToKKyAgICAgICAgKiB3YXNtL2pz
LWFwaS90ZXN0X01vZHVsZS5qczoKKyAgICAgICAgKiB3YXNtL2pzLWFwaS90ZXN0X2Jhc2ljX2Fw
aS5qczoKKyAgICAgICAgKGNvbnN0LmMuaW4uY29uc3RydWN0b3JQcm9wZXJ0aWVzLnN3aXRjaCk6
CisgICAgICAgICogd2FzbS9qcy1hcGkvdmFsaWRhdGUuanM6IEFkZGVkLgorICAgICAgICAoYXNz
ZXJ0LnRydXRoeS5XZWJBc3NlbWJseS52YWxpZGF0ZS5idWlsZGVyLldlYkFzc2VtYmx5KToKKwog
MjAxNi0xMi0xNiAgTWFyayBMYW0gIDxtYXJrLmxhbUBhcHBsZS5jb20+CiAKICAgICAgICAgRGUt
ZHVwbGljYXRlIGZpbmFsbHkgYmxvY2tzLgpJbmRleDogSlNUZXN0cy93YXNtL2pzLWFwaS9Nb2R1
bGUtY29tcGlsZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKU1Rlc3RzL3dhc20vanMtYXBpL01vZHVsZS1j
b21waWxlLmpzCShub25leGlzdGVudCkKKysrIEpTVGVzdHMvd2FzbS9qcy1hcGkvTW9kdWxlLWNv
bXBpbGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAoraW1wb3J0ICogYXMgYXNz
ZXJ0IGZyb20gJy4uL2Fzc2VydC5qcyc7CitpbXBvcnQgQnVpbGRlciBmcm9tICcuLi9CdWlsZGVy
LmpzJzsKKworbGV0IGRvbmUgPSBmYWxzZTsKK2FzeW5jIGZ1bmN0aW9uIHRlc3RQcm9taXNlQVBJ
KCkgeworICAgIHsKKyAgICAgICAgLy8gQ2FuJ3QgZGVjbGFyZSBtb3JlIHRoYW4gb25lIG1lbW9y
eS4KKyAgICAgICAgY29uc3QgYnVpbGRlciA9IChuZXcgQnVpbGRlcigpKQorICAgICAgICAgICAg
LlR5cGUoKS5FbmQoKQorICAgICAgICAgICAgLkltcG9ydCgpLk1lbW9yeSgiaW1wIiwgIm1lbW9y
eSIsIHtpbml0aWFsOiAyMH0pLkVuZCgpCisgICAgICAgICAgICAuRnVuY3Rpb24oKS5FbmQoKQor
ICAgICAgICAgICAgLk1lbW9yeSgpLkluaXRpYWxNYXhQYWdlcygxLCAxKS5FbmQoKQorICAgICAg
ICAgICAgLkV4cG9ydCgpLkVuZCgpCisgICAgICAgICAgICAuQ29kZSgpCisgICAgICAgICAgICAu
RW5kKCk7CisKKyAgICAgICAgbGV0IHRocmV3ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAg
ICAgICAgICBhd2FpdCBXZWJBc3NlbWJseS5jb21waWxlKGJ1aWxkZXIuV2ViQXNzZW1ibHkoKS5n
ZXQoKSk7CisgICAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICAgICAgdGhyZXcgPSB0cnVlOwor
ICAgICAgICAgICAgYXNzZXJ0LnRydXRoeShlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuQ29tcGls
ZUVycm9yKTsKKyAgICAgICAgICAgIGFzc2VydC50cnV0aHkoZS5tZXNzYWdlID09PSAiV2ViQXNz
ZW1ibHkuTW9kdWxlIGRvZXNuJ3QgcGFyc2UgYXQgYnl0ZSAzNCAvIDQzOiBNZW1vcnkgc2VjdGlv
biBjYW5ub3QgZXhpc3QgaWYgYW4gSW1wb3J0IGhhcyBhIG1lbW9yeSAoZXZhbHVhdGluZyAnV2Vi
QXNzZW1ibHkuY29tcGlsZShidWlsZGVyLldlYkFzc2VtYmx5KCkuZ2V0KCkpJykiKTsKKyAgICAg
ICAgfQorICAgICAgICBhc3NlcnQudHJ1dGh5KHRocmV3KTsKKyAgICB9CisKKyAgICB7CisgICAg
ICAgIGxldCB0aHJldyA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXdhaXQg
V2ViQXNzZW1ibHkuY29tcGlsZSgyMCk7CisgICAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICAg
ICAgdGhyZXcgPSB0cnVlOworICAgICAgICAgICAgYXNzZXJ0LnRydXRoeShlIGluc3RhbmNlb2Yg
VHlwZUVycm9yKTsKKyAgICAgICAgICAgIGFzc2VydC5lcShlLm1lc3NhZ2UsICJmaXJzdCBhcmd1
bWVudCBtdXN0IGJlIGFuIEFycmF5QnVmZmVyVmlldyBvciBhbiBBcnJheUJ1ZmZlciAoZXZhbHVh
dGluZyAnV2ViQXNzZW1ibHkuY29tcGlsZSgyMCknKSIpOworICAgICAgICB9CisgICAgICAgIGFz
c2VydC50cnV0aHkodGhyZXcpOworICAgIH0KKworICAgIHsKKyAgICAgICAgY29uc3QgYnVpbGRl
ciA9IChuZXcgQnVpbGRlcigpKQorICAgICAgICAgICAgLlR5cGUoKS5FbmQoKQorICAgICAgICAg
ICAgLkltcG9ydCgpLk1lbW9yeSgiaW1wIiwgIm1lbW9yeSIsIHtpbml0aWFsOiAyMH0pLkVuZCgp
CisgICAgICAgICAgICAuRnVuY3Rpb24oKS5FbmQoKQorICAgICAgICAgICAgLkV4cG9ydCgpLkVu
ZCgpCisgICAgICAgICAgICAuQ29kZSgpCisgICAgICAgICAgICAuRW5kKCk7CisKKyAgICAgICAg
bGV0IG1vZHVsZSA9IGF3YWl0IFdlYkFzc2VtYmx5LmNvbXBpbGUoYnVpbGRlci5XZWJBc3NlbWJs
eSgpLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0LnRydXRoeShtb2R1bGUgaW5zdGFuY2VvZiBXZWJB
c3NlbWJseS5Nb2R1bGUpOworICAgIH0KKworICAgIGRvbmUgPSB0cnVlOworfQorCit0ZXN0UHJv
bWlzZUFQSSgpOworZHJhaW5NaWNyb3Rhc2tzKCk7Cithc3NlcnQudHJ1dGh5KGRvbmUpOwpJbmRl
eDogSlNUZXN0cy93YXNtL2pzLWFwaS90ZXN0X01vZHVsZS5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKU1Rl
c3RzL3dhc20vanMtYXBpL3Rlc3RfTW9kdWxlLmpzCShyZXZpc2lvbiAyMDk5NzUpCisrKyBKU1Rl
c3RzL3dhc20vanMtYXBpL3Rlc3RfTW9kdWxlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0xNywzICsx
Nyw0IEBAIGltcG9ydCBCdWlsZGVyIGZyb20gJy4uL0J1aWxkZXIuanMnOwogICAgIGNvbnN0IGJp
biA9IGJ1aWxkZXIuV2ViQXNzZW1ibHkoKS5nZXQoKTsKICAgICBjb25zdCBtb2R1bGUgPSBuZXcg
V2ViQXNzZW1ibHkuTW9kdWxlKGJpbik7CiB9KSgpOworCkluZGV4OiBKU1Rlc3RzL3dhc20vanMt
YXBpL3Rlc3RfYmFzaWNfYXBpLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvd2FzbS9qcy1hcGkv
dGVzdF9iYXNpY19hcGkuanMJKHJldmlzaW9uIDIwOTk3NSkKKysrIEpTVGVzdHMvd2FzbS9qcy1h
cGkvdGVzdF9iYXNpY19hcGkuanMJKHdvcmtpbmcgY29weSkKQEAgLTUyLDcgKzUyLDcgQEAgZm9y
IChjb25zdCBjIGluIGNvbnN0cnVjdG9yUHJvcGVydGllcykgewogICAgIHN3aXRjaCAoYykgewog
ICAgIGNhc2UgIk1vZHVsZSI6CiAgICAgICAgIGZvciAoY29uc3QgaW52YWxpZCBvZiBpbnZhbGlk
Q29uc3RydWN0b3JJbnB1dHMpCi0gICAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IG5ldyBX
ZWJBc3NlbWJseVtjXShpbnZhbGlkKSwgVHlwZUVycm9yLCBgZmlyc3QgYXJndW1lbnQgdG8gV2Vi
QXNzZW1ibHkuTW9kdWxlIG11c3QgYmUgYW4gQXJyYXlCdWZmZXJWaWV3IG9yIGFuIEFycmF5QnVm
ZmVyIChldmFsdWF0aW5nICduZXcgV2ViQXNzZW1ibHlbY10oaW52YWxpZCknKWApOworICAgICAg
ICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBuZXcgV2ViQXNzZW1ibHlbY10oaW52YWxpZCksIFR5
cGVFcnJvciwgYGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXlCdWZmZXJWaWV3IG9yIGFu
IEFycmF5QnVmZmVyIChldmFsdWF0aW5nICduZXcgV2ViQXNzZW1ibHlbY10oaW52YWxpZCknKWAp
OwogICAgICAgICBmb3IgKGNvbnN0IGJ1ZmZlciBvZiBbbmV3IEFycmF5QnVmZmVyKCksIG5ldyBE
YXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoKSksIG5ldyBJbnQ4QXJyYXkoKSwgbmV3IFVpbnQ4QXJy
YXkoKSwgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KCksIG5ldyBJbnQxNkFycmF5KCksIG5ldyBVaW50
MTZBcnJheSgpLCBuZXcgSW50MzJBcnJheSgpLCBuZXcgVWludDMyQXJyYXkoKSwgbmV3IEZsb2F0
MzJBcnJheSgpLCBuZXcgRmxvYXQ2NEFycmF5KCldKQogICAgICAgICAgICAgLy8gRklYTUUgdGhl
IGZvbGxvd2luZyBzaG91bGQgYmUgV2ViQXNzZW1ibHkuQ29tcGlsZUVycm9yLiBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYzNzY4CiAgICAgICAgICAgICBhc3NlcnQu
dGhyb3dzKCgpID0+IG5ldyBXZWJBc3NlbWJseVtjXShidWZmZXIpLCBFcnJvciwgYFdlYkFzc2Vt
Ymx5Lk1vZHVsZSBkb2Vzbid0IHBhcnNlIGF0IGJ5dGUgMCAvIDA6IGV4cGVjdGVkIGEgbW9kdWxl
IG9mIGF0IGxlYXN0IDggYnl0ZXMgKGV2YWx1YXRpbmcgJ25ldyBXZWJBc3NlbWJseVtjXShidWZm
ZXIpJylgKTsKQEAgLTk3LDggKzk3LDMgQEAgZm9yIChjb25zdCBjIGluIGNvbnN0cnVjdG9yUHJv
cGVydGllcykgewogICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgSW1wbGVtZW50YXRpb24g
ZXJyb3I6IHVuZXhwZWN0ZWQgY29uc3RydWN0b3IgcHJvcGVydHkgIiR7Y30iYCk7CiAgICAgfQog
fQotCi0vLyBGSVhNRSBJbXBsZW1lbnQgYW5kIHRlc3QgdGhlc2UgQVBJcyBmdXJ0aGVyLiBGb3Ig
bm93IHRoZXkganVzdCB0aHJvdy4gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE1OTc3NQotZm9yIChjb25zdCBmIGluIGZ1bmN0aW9uUHJvcGVydGllcykgewotICAgIGFz
c2VydC50aHJvd3MoKCkgPT4gV2ViQXNzZW1ibHlbZl0oKSwgRXJyb3IsIGBXZWJBc3NlbWJseSBk
b2Vzbid0IHlldCBpbXBsZW1lbnQgdGhlICR7Zn0gZnVuY3Rpb24gcHJvcGVydHlgKTsKLX0KSW5k
ZXg6IEpTVGVzdHMvd2FzbS9qcy1hcGkvdmFsaWRhdGUuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSlNUZXN0
cy93YXNtL2pzLWFwaS92YWxpZGF0ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBKU1Rlc3RzL3dhc20v
anMtYXBpL3ZhbGlkYXRlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjcgQEAKK2ltcG9y
dCAqIGFzIGFzc2VydCBmcm9tICcuLi9hc3NlcnQuanMnOworaW1wb3J0IEJ1aWxkZXIgZnJvbSAn
Li4vQnVpbGRlci5qcyc7CisKK3sKKyAgICBjb25zdCBidWlsZGVyID0gKG5ldyBCdWlsZGVyKCkp
CisgICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgLkltcG9ydCgpLk1lbW9yeSgiaW1wIiwg
Im1lbW9yeSIsIHtpbml0aWFsOiAyMH0pLkVuZCgpCisgICAgICAgIC5GdW5jdGlvbigpLkVuZCgp
CisgICAgICAgIC5NZW1vcnkoKS5Jbml0aWFsTWF4UGFnZXMoMSwgMSkuRW5kKCkKKyAgICAgICAg
LkV4cG9ydCgpLkVuZCgpCisgICAgICAgIC5Db2RlKCkKKyAgICAgICAgLkVuZCgpOworCisgICAg
YXNzZXJ0LnRydXRoeSghV2ViQXNzZW1ibHkudmFsaWRhdGUoYnVpbGRlci5XZWJBc3NlbWJseSgp
LmdldCgpKSk7Cit9CisKK3sKKyAgICBjb25zdCBidWlsZGVyID0gKG5ldyBCdWlsZGVyKCkpCisg
ICAgICAgIC5UeXBlKCkuRW5kKCkKKyAgICAgICAgLkltcG9ydCgpLk1lbW9yeSgiaW1wIiwgIm1l
bW9yeSIsIHtpbml0aWFsOiAyMH0pLkVuZCgpCisgICAgICAgIC5GdW5jdGlvbigpLkVuZCgpCisg
ICAgICAgIC5FeHBvcnQoKS5FbmQoKQorICAgICAgICAuQ29kZSgpCisgICAgICAgIC5FbmQoKTsK
KworICAgIGFzc2VydC50cnV0aHkoV2ViQXNzZW1ibHkudmFsaWRhdGUoYnVpbGRlci5XZWJBc3Nl
bWJseSgpLmdldCgpKSk7Cit9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9n
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9u
IDIwOTk3NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29w
eSkKQEAgLTEsMyArMSwzMCBAQAorMjAxNi0xMi0xOCAgU2FhbSBCYXJhdGkgIDxzYmFyYXRpQGFw
cGxlLmNvbT4KKworICAgICAgICBXZWJBc3NlbWJseTogSW1wbGVtZW50IHRoZSBXZWJBc3NlbWJs
eS5jb21waWxlIGFuZCBXZWJBc3NlbWJseS52YWxpZGF0ZQorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY1OTM2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhlIEFQSXMgYXJlIGRvY3VtZW50ZWQgaGVyZToK
KyAgICAgICAgLSBodHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1ibHkvZGVzaWduL2Jsb2IvbWFz
dGVyL0pTLm1kI3dlYmFzc2VtYmx5Y29tcGlsZQorICAgICAgICAtIGh0dHBzOi8vZ2l0aHViLmNv
bS9XZWJBc3NlbWJseS9kZXNpZ24vYmxvYi9tYXN0ZXIvSlMubWQjd2ViYXNzZW1ibHl2YWxpZGF0
ZQorCisgICAgICAgICogd2FzbS9KU1dlYkFzc2VtYmx5LmNwcDoKKyAgICAgICAgKEpTQzo6d2Vi
QXNzZW1ibHlDb21waWxlRnVuYyk6CisgICAgICAgIChKU0M6OndlYkFzc2VtYmx5VmFsaWRhdGVG
dW5jKToKKyAgICAgICAgKEpTQzo6SlNXZWJBc3NlbWJseTo6ZmluaXNoQ3JlYXRpb24pOgorICAg
ICAgICAqIHdhc20vV2FzbVBsYW4uY3BwOgorICAgICAgICAoSlNDOjpXYXNtOjpQbGFuOjppc1Zh
bGlkTW9kdWxlKToKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6cnVuKToKKyAgICAgICAgKiB3
YXNtL1dhc21QbGFuLmg6CisgICAgICAgICogd2FzbS9qcy9KU1dlYkFzc2VtYmx5SGVscGVycy5o
OgorICAgICAgICAoSlNDOjpnZXRXYXNtQnVmZmVyRnJvbVZhbHVlKToKKyAgICAgICAgKiB3YXNt
L2pzL1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuY3BwOgorICAgICAgICAoSlNDOjpjb25z
dHJ1Y3RKU1dlYkFzc2VtYmx5TW9kdWxlKToKKyAgICAgICAgKEpTQzo6Y2FsbEpTV2ViQXNzZW1i
bHlNb2R1bGUpOgorICAgICAgICAoSlNDOjpXZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yOjpj
cmVhdGVNb2R1bGUpOgorICAgICAgICAqIHdhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1
Y3Rvci5oOgorCiAyMDE2LTEyLTE4ICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNvbT4KIAog
ICAgICAgICBSZW5hbWUgZmluYWxseUFjdGlvblJlZ2lzdGVyIHRvIGNvbXBsZXRpb25UeXBlUmVn
aXN0ZXIgYW5kIG9ubHkgc3RvcmUgaW50IEpTVmFsdWVzIGluIGl0LgpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL3dhc20vSlNXZWJBc3NlbWJseS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vSlNXZWJBc3NlbWJseS5jcHAJKHJldmlzaW9uIDIwOTk3NSkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL0pTV2ViQXNzZW1ibHkuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yOCwxMyArMjgsNTcgQEAKIAogI2lmIEVOQUJMRShXRUJBU1NFTUJMWSkKIAor
I2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgogI2luY2x1ZGUgIkZ1bmN0aW9uUHJvdG90eXBlLmgiCiAj
aW5jbHVkZSAiSlNDSW5saW5lcy5oIgorI2luY2x1ZGUgIkpTUHJvbWlzZURlZmVycmVkLmgiCisj
aW5jbHVkZSAiSlNXZWJBc3NlbWJseUhlbHBlcnMuaCIKKyNpbmNsdWRlICJXYXNtUGxhbi5oIgor
I2luY2x1ZGUgIldlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuaCIKIAogbmFtZXNwYWNlIEpT
QyB7CiAKIFNUQVRJQ19BU1NFUlRfSVNfVFJJVklBTExZX0RFU1RSVUNUSUJMRShKU1dlYkFzc2Vt
Ymx5KTsKIAorRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCB3ZWJBc3NlbWJseVZhbGlkYXRl
RnVuYyhFeGVjU3RhdGUqKTsKK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgd2ViQXNzZW1i
bHlDb21waWxlRnVuYyhFeGVjU3RhdGUqKTsKKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FM
TCB3ZWJBc3NlbWJseUNvbXBpbGVGdW5jKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBWTSYgdm0g
PSBleGVjLT52bSgpOworICAgIGF1dG8gY2F0Y2hTY29wZSA9IERFQ0xBUkVfQ0FUQ0hfU0NPUEUo
dm0pOworCisgICAgSlNQcm9taXNlRGVmZXJyZWQqIHByb21pc2UgPSBKU1Byb21pc2VEZWZlcnJl
ZDo6Y3JlYXRlKGV4ZWMsIGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKSk7CisgICAgUkVUVVJO
X0lGX0VYQ0VQVElPTihjYXRjaFNjb3BlLCB7IH0pOworCisgICAgLy8gRklYTUU6IE1ha2UgdGhp
cyB0cnVseSBhc3luY2hyb25vdXM6CisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTE2NjAxNgorICAgIEpTVmFsdWUgbW9kdWxlID0gV2ViQXNzZW1ibHlNb2R1
bGVDb25zdHJ1Y3Rvcjo6Y3JlYXRlTW9kdWxlKGV4ZWMsIGV4ZWMtPmxleGljYWxHbG9iYWxPYmpl
Y3QoKS0+V2ViQXNzZW1ibHlNb2R1bGVTdHJ1Y3R1cmUoKSk7CisgICAgaWYgKEV4Y2VwdGlvbiog
ZXhjZXB0aW9uID0gY2F0Y2hTY29wZS5leGNlcHRpb24oKSkgeworICAgICAgICBjYXRjaFNjb3Bl
LmNsZWFyRXhjZXB0aW9uKCk7CisgICAgICAgIHByb21pc2UtPnJlamVjdChleGVjLCBleGNlcHRp
b24pOworICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHByb21pc2UtPnByb21pc2UoKSk7
CisgICAgfQorCisgICAgcHJvbWlzZS0+cmVzb2x2ZShleGVjLCBtb2R1bGUpOworICAgIHJldHVy
biBKU1ZhbHVlOjplbmNvZGUocHJvbWlzZS0+cHJvbWlzZSgpKTsKK30KKworRW5jb2RlZEpTVmFs
dWUgSlNDX0hPU1RfQ0FMTCB3ZWJBc3NlbWJseVZhbGlkYXRlRnVuYyhFeGVjU3RhdGUqIGV4ZWMp
Cit7CisgICAgVk0mIHZtID0gZXhlYy0+dm0oKTsKKyAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9U
SFJPV19TQ09QRSh2bSk7CisKKyAgICBzaXplX3QgYnl0ZU9mZnNldDsKKyAgICBzaXplX3QgYnl0
ZVNpemU7CisgICAgdWludDhfdCogYmFzZSA9IGdldFdhc21CdWZmZXJGcm9tVmFsdWUoZXhlYywg
ZXhlYy0+YXJndW1lbnQoMCksIGJ5dGVPZmZzZXQsIGJ5dGVTaXplKTsKKyAgICBSRVRVUk5fSUZf
RVhDRVBUSU9OKHNjb3BlLCB7IH0pOworICAgIFdhc206OlBsYW4gcGxhbigmdm0sIGJhc2UgKyBi
eXRlT2Zmc2V0LCBieXRlU2l6ZSk7CisgICAgLy8gRklYTUU6IFdlIG1pZ2h0IHdhbnQgdG8gdGhy
b3cgYW4gT09NIGV4Y2VwdGlvbiBoZXJlIGlmIHdlIGRldGVjdCB0aGF0IHNvbWV0aGluZyB3aWxs
IE9PTS4KKyAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY2
MDE1CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc0Jvb2xlYW4ocGxhbi5pc1ZhbGlkTW9k
dWxlKCkpKTsKK30KKwogY29uc3QgQ2xhc3NJbmZvIEpTV2ViQXNzZW1ibHk6OnNfaW5mbyA9IHsg
IldlYkFzc2VtYmx5IiwgJkJhc2U6OnNfaW5mbywgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShKU1dl
YkFzc2VtYmx5KSB9OwogCiBKU1dlYkFzc2VtYmx5KiBKU1dlYkFzc2VtYmx5OjpjcmVhdGUoVk0m
IHZtLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSkK
QEAgLTQ5LDEwICs5MywxMiBAQCBTdHJ1Y3R1cmUqIEpTV2ViQXNzZW1ibHk6OmNyZWF0ZVN0cnVj
dHVyCiAgICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3Rv
dHlwZSwgVHlwZUluZm8oT2JqZWN0VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwogfQog
Ci12b2lkIEpTV2ViQXNzZW1ibHk6OmZpbmlzaENyZWF0aW9uKFZNJiB2bSwgSlNHbG9iYWxPYmpl
Y3QqKQordm9pZCBKU1dlYkFzc2VtYmx5OjpmaW5pc2hDcmVhdGlvbihWTSYgdm0sIEpTR2xvYmFs
T2JqZWN0KiBnbG9iYWxPYmplY3QpCiB7CiAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24odm0pOwog
ICAgIEFTU0VSVChpbmhlcml0cyhpbmZvKCkpKTsKKyAgICBKU0NfTkFUSVZFX0ZVTkNUSU9OX1dJ
VEhPVVRfVFJBTlNJVElPTigidmFsaWRhdGUiLCB3ZWJBc3NlbWJseVZhbGlkYXRlRnVuYywgRG9u
dEVudW0sIDEpOworICAgIEpTQ19OQVRJVkVfRlVOQ1RJT05fV0lUSE9VVF9UUkFOU0lUSU9OKCJj
b21waWxlIiwgd2ViQXNzZW1ibHlDb21waWxlRnVuYywgRG9udEVudW0sIDEpOwogfQogCiBKU1dl
YkFzc2VtYmx5OjpKU1dlYkFzc2VtYmx5KFZNJiB2bSwgU3RydWN0dXJlKiBzdHJ1Y3R1cmUpCklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uY3BwCShyZXZpc2lvbiAyMDk5
NzUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTU4LDE0ICs1OCwxNCBAQCBQbGFuOjpQbGFuKFZNKiB2bSwgY29uc3QgdWludDhf
dCogc291cmNlCiB7CiB9CiAKLXZvaWQgUGxhbjo6cnVuKCkKK2Jvb2wgUGxhbjo6aXNWYWxpZE1v
ZHVsZSgpCiB7CiAgICAgewogICAgICAgICBNb2R1bGVQYXJzZXIgbW9kdWxlUGFyc2VyKG1fdm0s
IG1fc291cmNlLCBtX3NvdXJjZUxlbmd0aCk7CiAgICAgICAgIGF1dG8gcGFyc2VSZXN1bHQgPSBt
b2R1bGVQYXJzZXIucGFyc2UoKTsKICAgICAgICAgaWYgKCFwYXJzZVJlc3VsdCkgewogICAgICAg
ICAgICAgbV9lcnJvck1lc3NhZ2UgPSBwYXJzZVJlc3VsdC5lcnJvcigpOwotICAgICAgICAgICAg
cmV0dXJuOyAvLyBGSVhNRSByZXR1cm4gYW4gRXhwZWN0ZWQuCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbV9tb2R1bGVJbmZvcm1hdGlvbiA9IFdURk1vdmUo
cGFyc2VSZXN1bHQtPm1vZHVsZSk7CiAgICAgICAgIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5
ID0gV1RGTW92ZShwYXJzZVJlc3VsdC0+ZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5KTsKQEAgLTcz
LDYgKzczLDM0IEBAIHZvaWQgUGxhbjo6cnVuKCkKICAgICAgICAgbV9mdW5jdGlvbkluZGV4U3Bh
Y2UuYnVmZmVyID0gcGFyc2VSZXN1bHQtPmZ1bmN0aW9uSW5kZXhTcGFjZS5yZWxlYXNlQnVmZmVy
KCk7CiAgICAgfQogCisgICAgZm9yICh1bnNpZ25lZCBmdW5jdGlvbkluZGV4ID0gMDsgZnVuY3Rp
b25JbmRleCA8IG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKTsgKytmdW5jdGlvbklu
ZGV4KSB7CisgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgZGF0YUxvZ0xuKCJQcm9j
ZXNzaW5nIGZ1bmN0aW9uIHN0YXJ0aW5nIGF0OiAiLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFy
eVtmdW5jdGlvbkluZGV4XS5zdGFydCwgIiBhbmQgZW5kaW5nIGF0OiAiLCBtX2Z1bmN0aW9uTG9j
YXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5lbmQpOworICAgICAgICBjb25zdCB1aW50OF90
KiBmdW5jdGlvblN0YXJ0ID0gbV9zb3VyY2UgKyBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtm
dW5jdGlvbkluZGV4XS5zdGFydDsKKyAgICAgICAgc2l6ZV90IGZ1bmN0aW9uTGVuZ3RoID0gbV9m
dW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uZW5kIC0gbV9mdW5jdGlvbkxv
Y2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uc3RhcnQ7CisgICAgICAgIEFTU0VSVChmdW5j
dGlvbkxlbmd0aCA8PSBtX3NvdXJjZUxlbmd0aCk7CisgICAgICAgIFNpZ25hdHVyZSogc2lnbmF0
dXJlID0gbV9tb2R1bGVJbmZvcm1hdGlvbi0+aW50ZXJuYWxGdW5jdGlvblNpZ25hdHVyZXNbZnVu
Y3Rpb25JbmRleF07CisKKyAgICAgICAgYXV0byB2YWxpZGF0ZVJlc3VsdCA9IHZhbGlkYXRlRnVu
Y3Rpb24oZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwgbV9mdW5jdGlv
bkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0aW9uKTsKKyAgICAgICAgaWYgKCF2YWxpZGF0
ZVJlc3VsdCkgeworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZnVuY3Rpb25MZW5ndGg7ICsraSkKKyAgICAgICAgICAg
ICAgICAgICAgZGF0YUxvZyhSYXdQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGZ1bmN0
aW9uU3RhcnRbaV0pKSwgIiwgIik7CisgICAgICAgICAgICAgICAgZGF0YUxvZ0xuKCk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBtX2Vycm9yTWVzc2FnZSA9IHZhbGlkYXRlUmVzdWx0LmVy
cm9yKCk7IC8vIEZJWE1FIG1ha2UgdGhpcyBhbiBFeHBlY3RlZC4KKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lk
IFBsYW46OnJ1bigpCit7CisgICAgaWYgKCFpc1ZhbGlkTW9kdWxlKCkpIC8vIFRoaXMgYWxzbyBj
b2xsZWN0cyBhIGJ1bmNoIG9mIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgYWN0dWFsIGNv
bXBpbGF0aW9uLgorICAgICAgICByZXR1cm47CisKICAgICBhdXRvIHRyeVJlc2VydmVDYXBhY2l0
eSA9IFt0aGlzXSAoYXV0byYgdmVjdG9yLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogd2hhdCkg
ewogICAgICAgICBpZiAoVU5MSUtFTFkoIXZlY3Rvci50cnlSZXNlcnZlQ2FwYWNpdHkoc2l6ZSkp
KSB7CiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CkBAIC04NCw2ICsxMTIsNyBA
QCB2b2lkIFBsYW46OnJ1bigpCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAg
fTsKKwogICAgIFZlY3RvcjxWZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4+IHVubGlua2Vk
V2FzbVRvV2FzbUNhbGxzOwogICAgIGlmICghdHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fd2FzbVRvSlNT
dHVicywgbV9tb2R1bGVJbmZvcm1hdGlvbi0+aW1wb3J0RnVuY3Rpb25zLnNpemUoKSwgIiBXZWJB
c3NlbWJseSB0byBKYXZhU2NyaXB0IHN0dWJzIikKICAgICAgICAgfHwgIXRyeVJlc2VydmVDYXBh
Y2l0eSh1bmxpbmtlZFdhc21Ub1dhc21DYWxscywgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnku
c2l6ZSgpLCAiIHVubGlua2VkIFdlYkFzc2VtYmx5IHRvIFdlYkFzc2VtYmx5IGNhbGxzIikKQEAg
LTExMiwxNiArMTQxLDcgQEAgdm9pZCBQbGFuOjpydW4oKQogICAgICAgICB1bnNpZ25lZCBmdW5j
dGlvbkluZGV4U3BhY2UgPSBtX3dhc21Ub0pTU3R1YnMuc2l6ZSgpICsgZnVuY3Rpb25JbmRleDsK
ICAgICAgICAgQVNTRVJUKG1fZnVuY3Rpb25JbmRleFNwYWNlLmJ1ZmZlci5nZXQoKVtmdW5jdGlv
bkluZGV4U3BhY2VdLnNpZ25hdHVyZSA9PSBzaWduYXR1cmUpOwogCi0gICAgICAgIGF1dG8gdmFs
aWRhdGVSZXN1bHQgPSB2YWxpZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVu
Z3RoLCBzaWduYXR1cmUsIG1fZnVuY3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlv
bik7Ci0gICAgICAgIGlmICghdmFsaWRhdGVSZXN1bHQpIHsKLSAgICAgICAgICAgIGlmICh2ZXJi
b3NlKSB7Ci0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZ1bmN0aW9u
TGVuZ3RoOyArK2kpCi0gICAgICAgICAgICAgICAgICAgIGRhdGFMb2coUmF3UG9pbnRlcihyZWlu
dGVycHJldF9jYXN0PHZvaWQqPihmdW5jdGlvblN0YXJ0W2ldKSksICIsICIpOwotICAgICAgICAg
ICAgICAgIGRhdGFMb2dMbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9lcnJvck1l
c3NhZ2UgPSB2YWxpZGF0ZVJlc3VsdC5lcnJvcigpOyAvLyBGSVhNRSBtYWtlIHRoaXMgYW4gRXhw
ZWN0ZWQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgQVNTRVJUKHZh
bGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwg
bV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0aW9uKSk7CiAKICAgICAgICAg
dW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMudW5jaGVja2VkQXBwZW5kKFZlY3RvcjxVbmxpbmtlZFdh
c21Ub1dhc21DYWxsPigpKTsKICAgICAgICAgYXV0byBwYXJzZUFuZENvbXBpbGVSZXN1bHQgPSBw
YXJzZUFuZENvbXBpbGUoKm1fdm0sIGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVuZ3RoLCBzaWdu
YXR1cmUsIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLmF0KGZ1bmN0aW9uSW5kZXgpLCBtX2Z1bmN0
aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9XYXNtUGxhbi5oCShyZXZpc2lvbiAyMDk5NzUpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd2FzbS9XYXNtUGxhbi5oCSh3b3JraW5nIGNvcHkpCkBAIC00OCw2ICs0OCw4IEBA
IHB1YmxpYzoKICAgICBKU19FWFBPUlRfUFJJVkFURSBQbGFuKFZNKiwgY29uc3QgdWludDhfdCos
IHNpemVfdCk7CiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgflBsYW4oKTsKIAorICAgIGJvb2wgaXNW
YWxpZE1vZHVsZSgpOworCiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgdm9pZCBydW4oKTsKIAogICAg
IEpTX0VYUE9SVF9QUklWQVRFIHZvaWQgaW5pdGlhbGl6ZUNhbGxlZXMoSlNHbG9iYWxPYmplY3Qq
LCBzdGQ6OmZ1bmN0aW9uPHZvaWQodW5zaWduZWQsIEpTV2ViQXNzZW1ibHlDYWxsZWUqLCBKU1dl
YkFzc2VtYmx5Q2FsbGVlKik+KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL2pz
L0pTV2ViQXNzZW1ibHlIZWxwZXJzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUhlbHBlcnMuaAkocmV2aXNpb24gMjA5OTc1KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvSlNXZWJBc3NlbWJseUhlbHBlcnMuaAkod29y
a2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogCiAjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQog
CisjaW5jbHVkZSAiSlNBcnJheUJ1ZmZlci5oIgogI2luY2x1ZGUgIkpTQ0pTVmFsdWUuaCIKIAog
bmFtZXNwYWNlIEpTQyB7CkBAIC00Niw2ICs0NywzMCBAQCBBTFdBWVNfSU5MSU5FIHVpbnQzMl90
IHRvTm9uV3JhcHBpbmdVaW50CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pihkb3Vi
bGVWYWx1ZSk7CiB9CiAKK0FMV0FZU19JTkxJTkUgdWludDhfdCogZ2V0V2FzbUJ1ZmZlckZyb21W
YWx1ZShFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgdmFsdWUsIHNpemVfdCYgYnl0ZU9mZnNldCwg
c2l6ZV90JiBieXRlU2l6ZSkKK3sKKyAgICBWTSYgdm0gPSBleGVjLT52bSgpOworICAgIGF1dG8g
dGhyb3dTY29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOworICAgIC8vIElmIHRoZSBnaXZl
biBieXRlcyBhcmd1bWVudCBpcyBub3QgYSBCdWZmZXJTb3VyY2UsIGEgVHlwZUVycm9yIGV4Y2Vw
dGlvbiBpcyB0aHJvd24uCisgICAgSlNBcnJheUJ1ZmZlciogYXJyYXlCdWZmZXIgPSB2YWx1ZS5n
ZXRPYmplY3QoKSA/IGpzRHluYW1pY0Nhc3Q8SlNBcnJheUJ1ZmZlcio+KHZhbHVlLmdldE9iamVj
dCgpKSA6IG51bGxwdHI7CisgICAgSlNBcnJheUJ1ZmZlclZpZXcqIGFycmF5QnVmZmVyVmlldyA9
IHZhbHVlLmdldE9iamVjdCgpID8ganNEeW5hbWljQ2FzdDxKU0FycmF5QnVmZmVyVmlldyo+KHZh
bHVlLmdldE9iamVjdCgpKSA6IG51bGxwdHI7CisgICAgaWYgKCEoYXJyYXlCdWZmZXIgfHwgYXJy
YXlCdWZmZXJWaWV3KSkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGVjLCB0aHJvd1Njb3Bl
LCBjcmVhdGVUeXBlRXJyb3IoZXhlYywKKyAgICAgICAgICAgIEFTQ0lJTGl0ZXJhbCgiZmlyc3Qg
YXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheUJ1ZmZlclZpZXcgb3IgYW4gQXJyYXlCdWZmZXIiKSwg
ZGVmYXVsdFNvdXJjZUFwcGVuZGVyLCBydW50aW1lVHlwZUZvclZhbHVlKHZhbHVlKSkpOworICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAoYXJyYXlCdWZmZXJWaWV3ID8g
YXJyYXlCdWZmZXJWaWV3LT5pc05ldXRlcmVkKCkgOiBhcnJheUJ1ZmZlci0+aW1wbCgpLT5pc05l
dXRlcmVkKCkpIHsKKyAgICAgICAgdGhyb3dFeGNlcHRpb24oZXhlYywgdGhyb3dTY29wZSwgY3Jl
YXRlVHlwZUVycm9yKGV4ZWMsCisgICAgICAgICAgICBBU0NJSUxpdGVyYWwoInVuZGVybHlpbmcg
VHlwZWRBcnJheSBoYXMgYmVlbiBkZXRhdGNoZWQgZnJvbSB0aGUgQXJyYXlCdWZmZXIiKSwgZGVm
YXVsdFNvdXJjZUFwcGVuZGVyLCBydW50aW1lVHlwZUZvclZhbHVlKHZhbHVlKSkpOworICAgICAg
ICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBieXRlT2Zmc2V0ID0gYXJyYXlCdWZmZXJW
aWV3ID8gYXJyYXlCdWZmZXJWaWV3LT5ieXRlT2Zmc2V0KCkgOiAwOworICAgIGJ5dGVTaXplID0g
YXJyYXlCdWZmZXJWaWV3ID8gYXJyYXlCdWZmZXJWaWV3LT5sZW5ndGgoKSA6IGFycmF5QnVmZmVy
LT5pbXBsKCktPmJ5dGVMZW5ndGgoKTsKKyAgICByZXR1cm4gYXJyYXlCdWZmZXJWaWV3ID8gc3Rh
dGljX2Nhc3Q8dWludDhfdCo+KGFycmF5QnVmZmVyVmlldy0+dmVjdG9yKCkpIDogc3RhdGljX2Nh
c3Q8dWludDhfdCo+KGFycmF5QnVmZmVyLT5pbXBsKCktPmRhdGEoKSk7Cit9CisKIH0gLy8gbmFt
ZXNwYWNlIEpTQwogCiAjZW5kaWYgLy8gRU5BQkxFKFdFQkFTU0VNQkxZKQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1bGVDb25zdHJ1Y3Rvci5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlN
b2R1bGVDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDIwOTk3NSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93YXNtL2pzL1dlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3IuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiSlNUeXBlZEFycmF5cy5oIgogI2lu
Y2x1ZGUgIkpTV2ViQXNzZW1ibHlDYWxsZWUuaCIKICNpbmNsdWRlICJKU1dlYkFzc2VtYmx5Q29t
cGlsZUVycm9yLmgiCisjaW5jbHVkZSAiSlNXZWJBc3NlbWJseUhlbHBlcnMuaCIKICNpbmNsdWRl
ICJKU1dlYkFzc2VtYmx5TW9kdWxlLmgiCiAjaW5jbHVkZSAiU3ltYm9sVGFibGUuaCIKICNpbmNs
dWRlICJXYXNtUGxhbi5oIgpAQCAtNTIsMzMgKzUzLDM2IEBAIGNvbnN0IENsYXNzSW5mbyBXZWJB
c3NlbWJseU1vZHVsZUNvbnN0cnUKICBAZW5kCiAgKi8KIAotc3RhdGljIEVuY29kZWRKU1ZhbHVl
IEpTQ19IT1NUX0NBTEwgY29uc3RydWN0SlNXZWJBc3NlbWJseU1vZHVsZShFeGVjU3RhdGUqIHN0
YXRlKQorc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29uc3RydWN0SlNXZWJB
c3NlbWJseU1vZHVsZShFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgYXV0byogc3RydWN0dXJlID0g
SW50ZXJuYWxGdW5jdGlvbjo6Y3JlYXRlU3ViY2xhc3NTdHJ1Y3R1cmUoZXhlYywgZXhlYy0+bmV3
VGFyZ2V0KCksIGV4ZWMtPmxleGljYWxHbG9iYWxPYmplY3QoKS0+V2ViQXNzZW1ibHlNb2R1bGVT
dHJ1Y3R1cmUoKSk7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShXZWJBc3NlbWJseU1vZHVs
ZUNvbnN0cnVjdG9yOjpjcmVhdGVNb2R1bGUoZXhlYywgc3RydWN0dXJlKSk7Cit9CisKK3N0YXRp
YyBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGNhbGxKU1dlYkFzc2VtYmx5TW9kdWxlKEV4
ZWNTdGF0ZSogc3RhdGUpCiB7CiAgICAgVk0mIHZtID0gc3RhdGUtPnZtKCk7CiAgICAgYXV0byBz
Y29wZSA9IERFQ0xBUkVfVEhST1dfU0NPUEUodm0pOwotICAgIEpTVmFsdWUgdmFsID0gc3RhdGUt
PmFyZ3VtZW50KDApOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUodGhyb3dDb25zdHJ1Y3Rv
ckNhbm5vdEJlQ2FsbGVkQXNGdW5jdGlvblR5cGVFcnJvcihzdGF0ZSwgc2NvcGUsICJXZWJBc3Nl
bWJseS5Nb2R1bGUiKSk7Cit9CiAKLSAgICAvLyBJZiB0aGUgZ2l2ZW4gYnl0ZXMgYXJndW1lbnQg
aXMgbm90IGEgQnVmZmVyU291cmNlLCBhIFR5cGVFcnJvciBleGNlcHRpb24gaXMgdGhyb3duLgot
ICAgIEpTQXJyYXlCdWZmZXIqIGFycmF5QnVmZmVyID0gdmFsLmdldE9iamVjdCgpID8ganNEeW5h
bWljQ2FzdDxKU0FycmF5QnVmZmVyKj4odmFsLmdldE9iamVjdCgpKSA6IG51bGxwdHI7Ci0gICAg
SlNBcnJheUJ1ZmZlclZpZXcqIGFycmF5QnVmZmVyVmlldyA9IHZhbC5nZXRPYmplY3QoKSA/IGpz
RHluYW1pY0Nhc3Q8SlNBcnJheUJ1ZmZlclZpZXcqPih2YWwuZ2V0T2JqZWN0KCkpIDogbnVsbHB0
cjsKLSAgICBpZiAoIShhcnJheUJ1ZmZlciB8fCBhcnJheUJ1ZmZlclZpZXcpKQotICAgICAgICBy
ZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93RXhjZXB0aW9uKHN0YXRlLCBzY29wZSwgY3JlYXRl
VHlwZUVycm9yKHN0YXRlLCBBU0NJSUxpdGVyYWwoImZpcnN0IGFyZ3VtZW50IHRvIFdlYkFzc2Vt
Ymx5Lk1vZHVsZSBtdXN0IGJlIGFuIEFycmF5QnVmZmVyVmlldyBvciBhbiBBcnJheUJ1ZmZlciIp
LCBkZWZhdWx0U291cmNlQXBwZW5kZXIsIHJ1bnRpbWVUeXBlRm9yVmFsdWUodmFsKSkpKTsKLQot
ICAgIGlmIChhcnJheUJ1ZmZlclZpZXcgPyBhcnJheUJ1ZmZlclZpZXctPmlzTmV1dGVyZWQoKSA6
IGFycmF5QnVmZmVyLT5pbXBsKCktPmlzTmV1dGVyZWQoKSkKLSAgICAgICAgcmV0dXJuIEpTVmFs
dWU6OmVuY29kZSh0aHJvd0V4Y2VwdGlvbihzdGF0ZSwgc2NvcGUsIGNyZWF0ZVR5cGVFcnJvcihz
dGF0ZSwgQVNDSUlMaXRlcmFsKCJ1bmRlcmx5aW5nIFR5cGVkQXJyYXkgaGFzIGJlZW4gZGV0YXRj
aGVkIGZyb20gdGhlIEFycmF5QnVmZmVyIiksIGRlZmF1bHRTb3VyY2VBcHBlbmRlciwgcnVudGlt
ZVR5cGVGb3JWYWx1ZSh2YWwpKSkpOwotCi0gICAgc2l6ZV90IGJ5dGVPZmZzZXQgPSBhcnJheUJ1
ZmZlclZpZXcgPyBhcnJheUJ1ZmZlclZpZXctPmJ5dGVPZmZzZXQoKSA6IDA7Ci0gICAgc2l6ZV90
IGJ5dGVTaXplID0gYXJyYXlCdWZmZXJWaWV3ID8gYXJyYXlCdWZmZXJWaWV3LT5sZW5ndGgoKSA6
IGFycmF5QnVmZmVyLT5pbXBsKCktPmJ5dGVMZW5ndGgoKTsKLSAgICBjb25zdCBhdXRvKiBiYXNl
ID0gYXJyYXlCdWZmZXJWaWV3ID8gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGFycmF5QnVmZmVyVmll
dy0+dmVjdG9yKCkpIDogc3RhdGljX2Nhc3Q8dWludDhfdCo+KGFycmF5QnVmZmVyLT5pbXBsKCkt
PmRhdGEoKSk7CitKU1ZhbHVlIFdlYkFzc2VtYmx5TW9kdWxlQ29uc3RydWN0b3I6OmNyZWF0ZU1v
ZHVsZShFeGVjU3RhdGUqIHN0YXRlLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSkKK3sKKyAgICBWTSYg
dm0gPSBzdGF0ZS0+dm0oKTsKKyAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2
bSk7CisKKyAgICBzaXplX3QgYnl0ZU9mZnNldDsKKyAgICBzaXplX3QgYnl0ZVNpemU7CisgICAg
dWludDhfdCogYmFzZSA9IGdldFdhc21CdWZmZXJGcm9tVmFsdWUoc3RhdGUsIHN0YXRlLT5hcmd1
bWVudCgwKSwgYnl0ZU9mZnNldCwgYnl0ZVNpemUpOworICAgIFJFVFVSTl9JRl9FWENFUFRJT04o
c2NvcGUsIHsgfSk7CiAKICAgICBXYXNtOjpQbGFuIHBsYW4oJnZtLCBiYXNlICsgYnl0ZU9mZnNl
dCwgYnl0ZVNpemUpOwogICAgIC8vIE9uIGZhaWx1cmUsIGEgbmV3IFdlYkFzc2VtYmx5LkNvbXBp
bGVFcnJvciBpcyB0aHJvd24uCiAgICAgcGxhbi5ydW4oKTsKICAgICBpZiAocGxhbi5mYWlsZWQo
KSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZSh0aHJvd0V4Y2VwdGlvbihzdGF0ZSwg
c2NvcGUsIGNyZWF0ZVdlYkFzc2VtYmx5Q29tcGlsZUVycm9yKHN0YXRlLCBwbGFuLmVycm9yTWVz
c2FnZSgpKSkpOworICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oc3RhdGUsIHNjb3BlLCBj
cmVhdGVXZWJBc3NlbWJseUNvbXBpbGVFcnJvcihzdGF0ZSwgcGxhbi5lcnJvck1lc3NhZ2UoKSkp
OwogCiAgICAgLy8gT24gc3VjY2VzcywgYSBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlIG9iamVjdCBp
cyByZXR1cm5lZCB3aXRoIFtbTW9kdWxlXV0gc2V0IHRvIHRoZSB2YWxpZGF0ZWQgQXN0Lm1vZHVs
ZS4KLSAgICBhdXRvKiBzdHJ1Y3R1cmUgPSBJbnRlcm5hbEZ1bmN0aW9uOjpjcmVhdGVTdWJjbGFz
c1N0cnVjdHVyZShzdGF0ZSwgc3RhdGUtPm5ld1RhcmdldCgpLCBhc0ludGVybmFsRnVuY3Rpb24o
c3RhdGUtPmpzQ2FsbGVlKCkpLT5nbG9iYWxPYmplY3QoKS0+V2ViQXNzZW1ibHlNb2R1bGVTdHJ1
Y3R1cmUoKSk7CiAgICAgUkVUVVJOX0lGX0VYQ0VQVElPTihzY29wZSwgeyB9KTsKIAogICAgIC8v
IFRoZSBleHBvcnQgc3ltYm9sIHRhYmxlIGlzIHRoZSBzYW1lIGZvciBhbGwgSW5zdGFuY2VzIG9m
IGEgTW9kdWxlLgpAQCAtOTYsMTQgKzEwMCw4IEBAIHN0YXRpYyBFbmNvZGVkSlNWYWx1ZSBKU0Nf
SE9TVF9DQUxMIGNvbnMKICAgICAgICAgICAgIHJlc3VsdC0+c2V0SlNFbnRyeXBvaW50Q2FsbGVl
KHZtLCBjYWxsZWVJbmRleCwganNFbnRyeXBvaW50Q2FsbGVlKTsKICAgICAgICAgICAgIHJlc3Vs
dC0+c2V0V2FzbUVudHJ5cG9pbnRDYWxsZWUodm0sIGNhbGxlZUluZGV4LCB3YXNtRW50cnlwb2lu
dENhbGxlZSk7CiAgICAgICAgIH0pOwotICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUocmVzdWx0
KTsKLX0KIAotc3RhdGljIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY2FsbEpTV2ViQXNz
ZW1ibHlNb2R1bGUoRXhlY1N0YXRlKiBzdGF0ZSkKLXsKLSAgICBWTSYgdm0gPSBzdGF0ZS0+dm0o
KTsKLSAgICBhdXRvIHNjb3BlID0gREVDTEFSRV9USFJPV19TQ09QRSh2bSk7Ci0gICAgcmV0dXJu
IEpTVmFsdWU6OmVuY29kZSh0aHJvd0NvbnN0cnVjdG9yQ2Fubm90QmVDYWxsZWRBc0Z1bmN0aW9u
VHlwZUVycm9yKHN0YXRlLCBzY29wZSwgIldlYkFzc2VtYmx5Lk1vZHVsZSIpKTsKKyAgICByZXR1
cm4gcmVzdWx0OwogfQogCiBXZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yKiBXZWJBc3NlbWJs
eU1vZHVsZUNvbnN0cnVjdG9yOjpjcmVhdGUoVk0mIHZtLCBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwg
V2ViQXNzZW1ibHlNb2R1bGVQcm90b3R5cGUqIHRoaXNQcm90b3R5cGUpCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvd2FzbS9qcy9XZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vanMvV2ViQXNzZW1ibHlNb2R1
bGVDb25zdHJ1Y3Rvci5oCShyZXZpc2lvbiAyMDk5NzUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9qcy9XZWJBc3NlbWJseU1vZHVsZUNvbnN0cnVjdG9yLmgJKHdvcmtpbmcgY29weSkK
QEAgLTQ0LDYgKzQ0LDggQEAgcHVibGljOgogCiAgICAgREVDTEFSRV9JTkZPOwogCisgICAgc3Rh
dGljIEpTVmFsdWUgY3JlYXRlTW9kdWxlKEV4ZWNTdGF0ZSosIFN0cnVjdHVyZSopOworCiBwcm90
ZWN0ZWQ6CiAgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihWTSYsIFdlYkFzc2VtYmx5TW9kdWxlUHJv
dG90eXBlKik7CiAK
</data>
<flag name="review"
          id="319746"
          type_id="1"
          status="+"
          setter="mark.lam"
    />
          </attachment>
      

    </bug>

</bugzilla>