<?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>200287</bug_id>
          
          <creation_ts>2019-07-30 16:25:40 -0700</creation_ts>
          <short_desc>[WHLSL] Make resolveFunction in Checker faster</short_desc>
          <delta_ts>2019-08-06 21:18:17 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebGPU</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>InRadar</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>commit-queue</cc>
    
    <cc>dino</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>fpizlo</cc>
    
    <cc>jonlee</cc>
    
    <cc>justin_fan</cc>
    
    <cc>mmaxfield</cc>
    
    <cc>rmorisset</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1557121</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-07-30 16:25:40 -0700</bug_when>
    <thetext>We spend 40ms(!!!) in it in compute_boids</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557201</commentid>
    <comment_count>1</comment_count>
      <attachid>375211</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-07-30 23:50:14 -0700</bug_when>
    <thetext>Created attachment 375211
WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1557324</commentid>
    <comment_count>2</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-07-31 12:24:27 -0700</bug_when>
    <thetext>about ~25ms faster. But still not super fast</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558568</commentid>
    <comment_count>3</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-08-05 14:51:46 -0700</bug_when>
    <thetext>Gonna check this out</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558874</commentid>
    <comment_count>4</comment_count>
      <attachid>375642</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-08-06 12:27:36 -0700</bug_when>
    <thetext>Created attachment 375642
WIP

rebased

Might not really be faster though</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558949</commentid>
    <comment_count>5</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-08-06 15:32:37 -0700</bug_when>
    <thetext>It is actually 6ms faster! Will prepare the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1559017</commentid>
    <comment_count>6</comment_count>
      <attachid>375671</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-08-06 17:26:37 -0700</bug_when>
    <thetext>Created attachment 375671
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1559019</commentid>
    <comment_count>7</comment_count>
    <who name="EWS Watchlist">ews-watchlist</who>
    <bug_when>2019-08-06 17:28:10 -0700</bug_when>
    <thetext>Attachment 375671 did not pass style-queue:


ERROR: Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:526:  Extra space before last semicolon. If this should be an empty statement, use { } instead.  [whitespace/semicolon] [5]
ERROR: Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:599:  The parameter name &quot;location&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 2 in 2 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>1559023</commentid>
    <comment_count>8</comment_count>
      <attachid>375671</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-08-06 17:39:30 -0700</bug_when>
    <thetext>Comment on attachment 375671
patch

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

&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:526
&gt; +                castReturnType = &amp;downcast&lt;AST::NamedType&gt;(function.type().unifyNode()) ;

will fix style</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1559025</commentid>
    <comment_count>9</comment_count>
      <attachid>375671</attachid>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2019-08-06 17:50:30 -0700</bug_when>
    <thetext>Comment on attachment 375671
patch

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

r=me with comments

&gt; Source/WebCore/ChangeLog:15
&gt; +        in the hash table such that they still allow constants to resolved to

to resolved =&gt; to be resolved

&gt; Source/WebCore/ChangeLog:24
&gt; +        The first two rules are because uint and int constants can be matched against

I think only int constants should be coerced to float/uint.
If you care enough about the type of a value to make it a uint literal (with the u at the end), doing any kind of silent coercion sounds iffy to me.
This only change this changelog, not the code (as int literals can become any of float/int/uint, the three types must be in the same equivalence class anyway).

&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:142
&gt; +        for (auto&amp; type : m_types)

That hash function does not look great to me: it treats foo(int, float*) the same as foo(float*, int). And if two arguments have the same type, then their hashes cancel each others, so foo(int, int) has the same hash as foo(bool, bool).
Can you rotate the hash of each argument type by its position in the list of arguments or something like that?

&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:146
&gt; +            hash ^= WTF::PtrHash&lt;AST::Type*&gt;::hash(&amp;m_castReturnType-&gt;unifyNode());

Why is this so different from the hashing of the argument types above?

&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:532
&gt; +                types.uncheckedAppend(normalizedTypeForFunctionKey(*param-&gt;type()));

It probably isn&apos;t worth changing, but I wonder whether things might be simpler if normalizedTypeForFunctionKey was called inside FunctionKey.hash()/FunctionKey.operator==.
It would not only avoid this call, but most of resolveFunction below.

&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:636
&gt; +    HashMap&lt;FunctionKey, Vector&lt;std::reference_wrapper&lt;AST::FunctionDeclaration&gt;, 1&gt;, FunctionKey::Hash, FunctionKey::Traits&gt; m_functions;

I&apos;m curious, when do we need to put the hash and traits explicitly and when are they automatically inferred? I&apos;ve seen that most HashMaps in our codebase don&apos;t have them explicit, but I am not sure when they can be omitted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1559035</commentid>
    <comment_count>10</comment_count>
      <attachid>375671</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-08-06 19:22:40 -0700</bug_when>
    <thetext>Comment on attachment 375671
patch

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

&gt;&gt; Source/WebCore/ChangeLog:24
&gt;&gt; +        The first two rules are because uint and int constants can be matched against
&gt; 
&gt; I think only int constants should be coerced to float/uint.
&gt; If you care enough about the type of a value to make it a uint literal (with the u at the end), doing any kind of silent coercion sounds iffy to me.
&gt; This only change this changelog, not the code (as int literals can become any of float/int/uint, the three types must be in the same equivalence class anyway).

Good point. Will reword it. (We might currently allow coercing unsigned literals to int literals, but I believe our plan is to prevent that.)

&gt;&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:142
&gt;&gt; +        for (auto&amp; type : m_types)
&gt; 
&gt; That hash function does not look great to me: it treats foo(int, float*) the same as foo(float*, int). And if two arguments have the same type, then their hashes cancel each others, so foo(int, int) has the same hash as foo(bool, bool).
&gt; Can you rotate the hash of each argument type by its position in the list of arguments or something like that?

Good point. I&apos;ll just add the index to each argument&apos;s hash.

&gt;&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:146
&gt;&gt; +            hash ^= WTF::PtrHash&lt;AST::Type*&gt;::hash(&amp;m_castReturnType-&gt;unifyNode());
&gt; 
&gt; Why is this so different from the hashing of the argument types above?

Because m_castReturnType is a NamedType. A NamedType&apos;s identity is based on its unifyNode&apos;s pointer value

&gt;&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:532
&gt;&gt; +                types.uncheckedAppend(normalizedTypeForFunctionKey(*param-&gt;type()));
&gt; 
&gt; It probably isn&apos;t worth changing, but I wonder whether things might be simpler if normalizedTypeForFunctionKey was called inside FunctionKey.hash()/FunctionKey.operator==.
&gt; It would not only avoid this call, but most of resolveFunction below.

The main motivation for doing this here is avoiding calling it repeatedly during the hash lookup loop (for == and for hash()). I agree it&apos;s less elegant, but it should be more performant this way.

&gt;&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:636
&gt;&gt; +    HashMap&lt;FunctionKey, Vector&lt;std::reference_wrapper&lt;AST::FunctionDeclaration&gt;, 1&gt;, FunctionKey::Hash, FunctionKey::Traits&gt; m_functions;
&gt; 
&gt; I&apos;m curious, when do we need to put the hash and traits explicitly and when are they automatically inferred? I&apos;ve seen that most HashMaps in our codebase don&apos;t have them explicit, but I am not sure when they can be omitted.

They&apos;re never really &quot;automatically&quot; inferred. If you don&apos;t specify them, we use the &quot;default&quot; hash and traits in WTF&apos;s namespace. And for most things, we&apos;ve defined defaults.

To define a default, you can do something like this:
namespace WTF {

template&lt;typename T&gt; struct DefaultHash;
template&lt;&gt; struct DefaultHash&lt;JSC::B3::Air::Tmp&gt; {
    typedef JSC::B3::Air::TmpHash Hash;
};

template&lt;typename T&gt; struct HashTraits;
template&lt;&gt; struct HashTraits&lt;JSC::B3::Air::Tmp&gt; : SimpleClassHashTraits&lt;JSC::B3::Air::Tmp&gt; { };

} // namespace WTF</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1559037</commentid>
    <comment_count>11</comment_count>
      <attachid>375675</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-08-06 19:26:45 -0700</bug_when>
    <thetext>Created attachment 375675
patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1559058</commentid>
    <comment_count>12</comment_count>
      <attachid>375675</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-08-06 21:17:35 -0700</bug_when>
    <thetext>Comment on attachment 375675
patch for landing

Clearing flags on attachment: 375675

Committed r248339: &lt;https://trac.webkit.org/changeset/248339&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1559059</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-08-06 21:17:37 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1559060</commentid>
    <comment_count>14</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2019-08-06 21:18:17 -0700</bug_when>
    <thetext>&lt;rdar://problem/54017979&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>375211</attachid>
            <date>2019-07-30 23:50:14 -0700</date>
            <delta_ts>2019-08-06 12:27:36 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>20287</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNMQ2hlY2tlci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvV0hM
U0xDaGVja2VyLmNwcAkocmV2aXNpb24gMjQ4MDMwKQorKysgU291cmNlL1dlYkNvcmUvTW9kdWxl
cy93ZWJncHUvV0hMU0wvV0hMU0xDaGVja2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjQsNiAr
NjQsMTAgQEAKICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvV1RG
U3RyaW5nLmg+CiAKKyNpbmNsdWRlIDx3dGYvTW9ub3RvbmljVGltZS5oPgorI2luY2x1ZGUgPHd0
Zi9EYXRhTG9nLmg+CisjaW5jbHVkZSAiV0hMU0xBU1REdW1wZXIuaCIKKwogbmFtZXNwYWNlIFdl
YkNvcmUgewogCiBuYW1lc3BhY2UgV0hMU0wgewpAQCAtMTE4LDYgKzEyMiw4NyBAQCBwdWJsaWM6
CiAgICAgfQogfTsKIAorY2xhc3MgRnVuY3Rpb25LZXkgeworcHVibGljOgorICAgIEZ1bmN0aW9u
S2V5KCkgPSBkZWZhdWx0OworICAgIEZ1bmN0aW9uS2V5KFdURjo6SGFzaFRhYmxlRGVsZXRlZFZh
bHVlVHlwZSkKKyAgICB7CisgICAgICAgIG1fY2FzdFJldHVyblR5cGUgPSBiaXR3aXNlX2Nhc3Q8
QVNUOjpOYW1lZFR5cGUqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KDEpKTsKKyAgICB9CisKKyAg
ICBGdW5jdGlvbktleShTdHJpbmcgbmFtZSwgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8
QVNUOjpVbm5hbWVkVHlwZT4+IHR5cGVzLCBBU1Q6Ok5hbWVkVHlwZSogY2FzdFJldHVyblR5cGUg
PSBudWxscHRyKQorICAgICAgICA6IG1fbmFtZShXVEZNb3ZlKG5hbWUpKQorICAgICAgICAsIG1f
dHlwZXMoV1RGTW92ZSh0eXBlcykpCisgICAgICAgICwgbV9jYXN0UmV0dXJuVHlwZShjYXN0UmV0
dXJuVHlwZSkKKyAgICB7IH0KKworICAgIGJvb2wgaXNFbXB0eVZhbHVlKCkgY29uc3QgeyByZXR1
cm4gbV9uYW1lLmlzTnVsbCgpOyB9CisgICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fY2FzdFJldHVyblR5cGUgPT0gYml0d2lzZV9jYXN0PEFTVDo6TmFt
ZWRUeXBlKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PigxKSk7IH0KKworICAgIHVuc2lnbmVkIGhh
c2goKSBjb25zdAorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaGFzaCA9IEludEhhc2g8c2l6ZV90
Pjo6aGFzaChtX3R5cGVzLnNpemUoKSk7CisgICAgICAgIGhhc2ggXj0gbV9uYW1lLmhhc2goKTsK
KyAgICAgICAgZm9yIChhdXRvJiB0eXBlIDogbV90eXBlcykKKyAgICAgICAgICAgIGhhc2ggXj0g
dHlwZS5nZXQoKS5oYXNoKCk7CisKKyAgICAgICAgaWYgKG1fY2FzdFJldHVyblR5cGUpCisgICAg
ICAgICAgICBoYXNoIF49IFdURjo6UHRySGFzaDxBU1Q6OlR5cGUqPjo6aGFzaCgmbV9jYXN0UmV0
dXJuVHlwZS0+dW5pZnlOb2RlKCkpOworCisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKwor
ICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGdW5jdGlvbktleSYgb3RoZXIpIGNvbnN0CisgICAg
eworICAgICAgICBpZiAobV90eXBlcy5zaXplKCkgIT0gb3RoZXIubV90eXBlcy5zaXplKCkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1fbmFtZSAhPSBvdGhlci5t
X25hbWUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBtX3R5cGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW1hdGNo
ZXMobV90eXBlc1tpXS5nZXQoKSwgb3RoZXIubV90eXBlc1tpXS5nZXQoKSkpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEhbV9jYXN0UmV0
dXJuVHlwZSAhPSAhIW90aGVyLm1fY2FzdFJldHVyblR5cGUpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgaWYgKCFtX2Nhc3RSZXR1cm5UeXBlKQorICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICAgICAgaWYgKCZtX2Nhc3RSZXR1cm5UeXBlLT51bmlmeU5vZGUoKSA9
PSAmb3RoZXIubV9jYXN0UmV0dXJuVHlwZS0+dW5pZnlOb2RlKCkpCisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RydWN0IEhh
c2ggeworICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBGdW5jdGlvbktleSYga2V5
KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4ga2V5Lmhhc2goKTsKKyAgICAgICAgfQor
CisgICAgICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IEZ1bmN0aW9uS2V5JiBhLCBjb25zdCBG
dW5jdGlvbktleSYgYikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGEgPT0gYjsKKyAg
ICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBhcmVUb0VtcHR5
T3JEZWxldGVkID0gZmFsc2U7CisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIGVtcHR5VmFsdWVJ
c1plcm8gPSB0cnVlOworICAgIH07CisKKyAgICBzdHJ1Y3QgVHJhaXRzIDogcHVibGljIFdURjo6
U2ltcGxlQ2xhc3NIYXNoVHJhaXRzPEZ1bmN0aW9uS2V5PiB7CisgICAgICAgIHN0YXRpYyBjb25z
dCBib29sIGhhc0lzRW1wdHlWYWx1ZUZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgc3RhdGljIGJv
b2wgaXNFbXB0eVZhbHVlKGNvbnN0IEZ1bmN0aW9uS2V5JiBrZXkpIHsgcmV0dXJuIGtleS5pc0Vt
cHR5VmFsdWUoKTsgfQorICAgIH07CisKK3ByaXZhdGU6CisgICAgU3RyaW5nIG1fbmFtZTsKKyAg
ICBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxBU1Q6OlVubmFtZWRUeXBlPj4gbV90eXBl
czsKKyAgICBBU1Q6Ok5hbWVkVHlwZSogbV9jYXN0UmV0dXJuVHlwZTsKK307CisKIHN0YXRpYyBB
U1Q6Ok5hdGl2ZUZ1bmN0aW9uRGVjbGFyYXRpb24gcmVzb2x2ZVdpdGhPcGVyYXRvckFuZGVySW5k
ZXhlcihDb2RlTG9jYXRpb24gbG9jYXRpb24sIEFTVDo6QXJyYXlSZWZlcmVuY2VUeXBlJiBmaXJz
dEFyZ3VtZW50LCBjb25zdCBJbnRyaW5zaWNzJiBpbnRyaW5zaWNzKQogewogICAgIGNvbnN0IGJv
b2wgaXNPcGVyYXRvciA9IHRydWU7CkBAIC0yMTcsMjEgKzMwMiw2IEBAIHN0YXRpYyBPcHRpb25h
bDxBU1Q6Ok5hdGl2ZUZ1bmN0aW9uRGVjbGEKICAgICByZXR1cm4gV1RGOjpudWxsb3B0OwogfQog
Ci1zdGF0aWMgQVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uKiByZXNvbHZlRnVuY3Rpb24oUHJvZ3Jh
bSYgcHJvZ3JhbSwgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8QVNUOjpGdW5jdGlvbkRl
Y2xhcmF0aW9uPiwgMT4qIHBvc3NpYmxlT3ZlcmxvYWRzLCBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vf
d3JhcHBlcjxSZXNvbHZpbmdUeXBlPj4mIHR5cGVzLCBjb25zdCBTdHJpbmcmIG5hbWUsIENvZGVM
b2NhdGlvbiBsb2NhdGlvbiwgY29uc3QgSW50cmluc2ljcyYgaW50cmluc2ljcywgQVNUOjpOYW1l
ZFR5cGUqIGNhc3RSZXR1cm5UeXBlID0gbnVsbHB0cikKLXsKLSAgICBpZiAocG9zc2libGVPdmVy
bG9hZHMpIHsKLSAgICAgICAgaWYgKEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiogZnVuY3Rpb24g
PSByZXNvbHZlRnVuY3Rpb25PdmVybG9hZCgqcG9zc2libGVPdmVybG9hZHMsIHR5cGVzLCBjYXN0
UmV0dXJuVHlwZSkpCi0gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb247Ci0gICAgfQotCi0gICAg
aWYgKGF1dG8gbmV3RnVuY3Rpb24gPSByZXNvbHZlQnlJbnN0YW50aWF0aW9uKG5hbWUsIGxvY2F0
aW9uLCB0eXBlcywgaW50cmluc2ljcykpIHsKLSAgICAgICAgcHJvZ3JhbS5hcHBlbmQoV1RGTW92
ZSgqbmV3RnVuY3Rpb24pKTsKLSAgICAgICAgcmV0dXJuICZwcm9ncmFtLm5hdGl2ZUZ1bmN0aW9u
RGVjbGFyYXRpb25zKCkubGFzdCgpOwotICAgIH0KLQotICAgIHJldHVybiBudWxscHRyOwotfQot
CiBzdGF0aWMgYm9vbCBjaGVja1NlbWFudGljcyhWZWN0b3I8RW50cnlQb2ludEl0ZW0+JiBpbnB1
dEl0ZW1zLCBWZWN0b3I8RW50cnlQb2ludEl0ZW0+JiBvdXRwdXRJdGVtcywgY29uc3QgT3B0aW9u
YWw8QVNUOjpFbnRyeVBvaW50VHlwZT4mIGVudHJ5UG9pbnRUeXBlLCBjb25zdCBJbnRyaW5zaWNz
JiBpbnRyaW5zaWNzKQogewogICAgIHsKQEAgLTQ1NCw2ICs1MjQsMjIgQEAgcHVibGljOgogICAg
ICAgICA6IG1faW50cmluc2ljcyhpbnRyaW5zaWNzKQogICAgICAgICAsIG1fcHJvZ3JhbShwcm9n
cmFtKQogICAgIHsKKyAgICAgICAgYXV0byBhZGRGdW5jdGlvbiA9IFsmXSAoQVNUOjpGdW5jdGlv
bkRlY2xhcmF0aW9uJiBmdW5jdGlvbikgeworICAgICAgICAgICAgVmVjdG9yPHN0ZDo6cmVmZXJl
bmNlX3dyYXBwZXI8QVNUOjpVbm5hbWVkVHlwZT4+IHR5cGVzOworICAgICAgICAgICAgZm9yIChh
dXRvJiBwYXJhbSA6IGZ1bmN0aW9uLnBhcmFtZXRlcnMoKSkKKyAgICAgICAgICAgICAgICB0eXBl
cy5hcHBlbmQobm9ybWFsaXplZEZ1bmN0aW9uS2V5VHlwZSgqcGFyYW0tPnR5cGUoKSkpOworICAg
ICAgICAgICAgQVNUOjpOYW1lZFR5cGUqIGNhc3RSZXR1cm5UeXBlID0gbnVsbHB0cjsKKyAgICAg
ICAgICAgIGlmIChmdW5jdGlvbi5pc0Nhc3QoKSAmJiBpczxBU1Q6Ok5hbWVkVHlwZT4oZnVuY3Rp
b24udHlwZSgpLnVuaWZ5Tm9kZSgpKSkKKyAgICAgICAgICAgICAgICBjYXN0UmV0dXJuVHlwZSA9
ICZkb3duY2FzdDxBU1Q6Ok5hbWVkVHlwZT4oZnVuY3Rpb24udHlwZSgpLnVuaWZ5Tm9kZSgpKSA7
CisgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IG1fZnVuY3Rpb25zLmFkZChGdW5jdGlvbktl
eSB7IGZ1bmN0aW9uLm5hbWUoKSwgV1RGTW92ZSh0eXBlcyksIGNhc3RSZXR1cm5UeXBlIH0sIFZl
Y3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbj4sIDE+
KCkpOworICAgICAgICAgICAgYWRkUmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS5hcHBlbmQoZnVuY3Rp
b24pOworICAgICAgICB9OworICAgICAgICBhdXRvIHN0YXJ0ID0gTW9ub3RvbmljVGltZTo6bm93
KCk7CisgICAgICAgIGZvciAoYXV0byYgZnVuY3Rpb24gOiBtX3Byb2dyYW0uZnVuY3Rpb25EZWZp
bml0aW9ucygpKQorICAgICAgICAgICAgYWRkRnVuY3Rpb24oZnVuY3Rpb24uZ2V0KCkpOworICAg
ICAgICBmb3IgKGF1dG8mIGZ1bmN0aW9uIDogbV9wcm9ncmFtLm5hdGl2ZUZ1bmN0aW9uRGVjbGFy
YXRpb25zKCkpCisgICAgICAgICAgICBhZGRGdW5jdGlvbihmdW5jdGlvbi5nZXQoKSk7CisgICAg
ICAgIGRhdGFMb2dMbigiQWRkIGZ1bmN0aW9uIHRpbWU6ICIsIChNb25vdG9uaWNUaW1lOjpub3co
KSAtIHN0YXJ0KS5taWxsaXNlY29uZHMoKSk7CiAgICAgfQogCiAgICAgdmlydHVhbCB+Q2hlY2tl
cigpID0gZGVmYXVsdDsKQEAgLTUxMSw2ICs1OTcsMzQgQEAgcHJpdmF0ZToKIAogICAgIHZvaWQg
ZmluaXNoVmlzaXRpbmcoQVNUOjpQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24mLCBSZXNvbHZpbmdU
eXBlKiBhZGRpdGlvbmFsQXJndW1lbnRUeXBlID0gbnVsbHB0cik7CiAKKyAgICBBU1Q6OkZ1bmN0
aW9uRGVjbGFyYXRpb24qIHJlc29sdmVGdW5jdGlvbihQcm9ncmFtJiwgVmVjdG9yPHN0ZDo6cmVm
ZXJlbmNlX3dyYXBwZXI8QVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uPiwgMT4qIHBvc3NpYmxlT3Zl
cmxvYWRzLCBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZXNvbHZpbmdUeXBlPj4mIHR5
cGVzLCBjb25zdCBTdHJpbmcmIG5hbWUsIENvZGVMb2NhdGlvbiBsb2NhdGlvbiwgY29uc3QgSW50
cmluc2ljcyYgaW50cmluc2ljcywgQVNUOjpOYW1lZFR5cGUqIGNhc3RSZXR1cm5UeXBlID0gbnVs
bHB0cik7CisKKyAgICBBU1Q6OlVubmFtZWRUeXBlJiB3cmFwcGVkRmxvYXRUeXBlKCkKKyAgICB7
CisgICAgICAgIGlmICghbV93cmFwcGVkRmxvYXRUeXBlKQorICAgICAgICAgICAgbV93cmFwcGVk
RmxvYXRUeXBlID0gQVNUOjpUeXBlUmVmZXJlbmNlOjp3cmFwKHsgfSwgbV9pbnRyaW5zaWNzLmZs
b2F0VHlwZSgpKTsKKyAgICAgICAgcmV0dXJuICptX3dyYXBwZWRGbG9hdFR5cGU7CisgICAgfQor
CisgICAgQVNUOjpVbm5hbWVkVHlwZSYgbm9ybWFsaXplZEZ1bmN0aW9uS2V5VHlwZShBU1Q6OlVu
bmFtZWRUeXBlJiB0eXBlKQorICAgIHsKKyAgICAgICAgYXV0byogdW5pZnlOb2RlID0gJnR5cGUu
dW5pZnlOb2RlKCk7CisgICAgICAgIGlmICh1bmlmeU5vZGUgPT0gJm1faW50cmluc2ljcy51aW50
VHlwZSgpCisgICAgICAgICAgICB8fCB1bmlmeU5vZGUgPT0gJm1faW50cmluc2ljcy5pbnRUeXBl
KCkKKyAgICAgICAgICAgIHx8IHVuaWZ5Tm9kZSA9PSAmbV9pbnRyaW5zaWNzLmZsb2F0VHlwZSgp
CisgICAgICAgICAgICB8fCB1bmlmeU5vZGUgPT0gJm1faW50cmluc2ljcy5oYWxmVHlwZSgpCisg
ICAgICAgICAgICB8fCB1bmlmeU5vZGUgPT0gJm1faW50cmluc2ljcy5jaGFyVHlwZSgpCisgICAg
ICAgICAgICB8fCB1bmlmeU5vZGUgPT0gJm1faW50cmluc2ljcy51Y2hhclR5cGUoKQorICAgICAg
ICAgICAgfHwgdW5pZnlOb2RlID09ICZtX2ludHJpbnNpY3Muc2hvcnRUeXBlKCkKKyAgICAgICAg
ICAgIHx8IHVuaWZ5Tm9kZSA9PSAmbV9pbnRyaW5zaWNzLnVzaG9ydFR5cGUoKSkgeworICAgICAg
ICAgICAgLy8gTGl0ZXJhbHMsIHVnaCEKKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkRmxvYXRU
eXBlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBS
ZWZQdHI8QVNUOjpUeXBlUmVmZXJlbmNlPiBtX3dyYXBwZWRGbG9hdFR5cGU7CiAgICAgSGFzaE1h
cDxBU1Q6OkV4cHJlc3Npb24qLCBzdGQ6OnVuaXF1ZV9wdHI8UmVzb2x2aW5nVHlwZT4+IG1fdHlw
ZU1hcDsKICAgICBIYXNoU2V0PFN0cmluZz4gbV92ZXJ0ZXhFbnRyeVBvaW50czsKICAgICBIYXNo
U2V0PFN0cmluZz4gbV9mcmFnbWVudEVudHJ5UG9pbnRzOwpAQCAtNTE4LDYgKzYzMiw3IEBAIHBy
aXZhdGU6CiAgICAgY29uc3QgSW50cmluc2ljcyYgbV9pbnRyaW5zaWNzOwogICAgIFByb2dyYW0m
IG1fcHJvZ3JhbTsKICAgICBBU1Q6OkZ1bmN0aW9uRGVmaW5pdGlvbiogbV9jdXJyZW50RnVuY3Rp
b24geyBudWxscHRyIH07CisgICAgSGFzaE1hcDxGdW5jdGlvbktleSwgVmVjdG9yPHN0ZDo6cmVm
ZXJlbmNlX3dyYXBwZXI8QVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uPiwgMT4sIEZ1bmN0aW9uS2V5
OjpIYXNoLCBGdW5jdGlvbktleTo6VHJhaXRzPiBtX2Z1bmN0aW9uczsKIH07CiAKIHZvaWQgQ2hl
Y2tlcjo6dmlzaXQoUHJvZ3JhbSYgcHJvZ3JhbSkKQEAgLTYzOCw2ICs3NTMsNjEgQEAgc3RhdGlj
IFJlZlB0cjxBU1Q6OlVubmFtZWRUeXBlPiBjb21taXQoUgogICAgIH0pKTsKIH0KIAorc3RhdGlj
IGRvdWJsZSB0aW1lID0gMC4wOworc3RhdGljIHNpemVfdCB0b3RhbE51bU92ZXJsb2FkcyA9IDA7
CisKK0FTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiogQ2hlY2tlcjo6cmVzb2x2ZUZ1bmN0aW9uKFBy
b2dyYW0mIHByb2dyYW0sIFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6RnVuY3Rp
b25EZWNsYXJhdGlvbj4sIDE+KiwgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8UmVzb2x2
aW5nVHlwZT4+JiB0eXBlcywgY29uc3QgU3RyaW5nJiBuYW1lLCBDb2RlTG9jYXRpb24gbG9jYXRp
b24sIGNvbnN0IEludHJpbnNpY3MmIGludHJpbnNpY3MsIEFTVDo6TmFtZWRUeXBlKiBjYXN0UmV0
dXJuVHlwZSkKK3sKKyAgICBhdXRvIHN0YXJ0ID0gTW9ub3RvbmljVGltZTo6bm93KCk7CisgICAg
YXV0byBkb25lVGltZSA9IFsmXSB7CisgICAgICAgIGF1dG8gZW5kID0gTW9ub3RvbmljVGltZTo6
bm93KCk7CisgICAgICAgIHRpbWUgKz0gKGVuZCAtIHN0YXJ0KS5taWxsaXNlY29uZHMoKTsKKyAg
ICB9OworCisgICAgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8QVNUOjpVbm5hbWVkVHlw
ZT4+IHVubmFtZWRUeXBlczsKKyAgICBmb3IgKGF1dG8gcmVzb2x2aW5nVHlwZSA6IHR5cGVzKSB7
CisgICAgICAgIEFTVDo6VW5uYW1lZFR5cGUqIHR5cGUgPSByZXNvbHZpbmdUeXBlLmdldCgpLnZp
c2l0KFdURjo6bWFrZVZpc2l0b3IoWyZdKFJlZjxBU1Q6OlVubmFtZWRUeXBlPiYgdW5uYW1lZFR5
cGUpIC0+IEFTVDo6VW5uYW1lZFR5cGUqIHsKKyAgICAgICAgICAgIHJldHVybiB1bm5hbWVkVHlw
ZS5wdHIoKTsKKyAgICAgICAgfSwgWyZdKFJlZlB0cjxSZXNvbHZhYmxlVHlwZVJlZmVyZW5jZT4m
IHJlc29sdmFibGVUeXBlUmVmZXJlbmNlKSAtPiBBU1Q6OlVubmFtZWRUeXBlKiB7CisgICAgICAg
ICAgICBpZiAocmVzb2x2YWJsZVR5cGVSZWZlcmVuY2UtPnJlc29sdmFibGVUeXBlKCkubWF5YmVS
ZXNvbHZlZFR5cGUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gJnJlc29sdmFibGVUeXBlUmVm
ZXJlbmNlLT5yZXNvbHZhYmxlVHlwZSgpLnJlc29sdmVkVHlwZSgpOworCisgICAgICAgICAgICBp
ZiAocmVzb2x2YWJsZVR5cGVSZWZlcmVuY2UtPnJlc29sdmFibGVUeXBlKCkuaXNGbG9hdExpdGVy
YWxUeXBlKCkKKyAgICAgICAgICAgICAgICB8fCByZXNvbHZhYmxlVHlwZVJlZmVyZW5jZS0+cmVz
b2x2YWJsZVR5cGUoKS5pc0ludGVnZXJMaXRlcmFsVHlwZSgpCisgICAgICAgICAgICAgICAgfHwg
cmVzb2x2YWJsZVR5cGVSZWZlcmVuY2UtPnJlc29sdmFibGVUeXBlKCkuaXNVbnNpZ25lZEludGVn
ZXJMaXRlcmFsVHlwZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiAmd3JhcHBlZEZsb2F0VHlw
ZSgpOworCisgICAgICAgICAgICByZXR1cm4gY29tbWl0KHJlc29sdmFibGVUeXBlUmVmZXJlbmNl
LT5yZXNvbHZhYmxlVHlwZSgpKS5nZXQoKTsKKyAgICAgICAgfSkpOworICAgICAgICBpZiAoIXR5
cGUpIHsKKyAgICAgICAgICAgIHNldEVycm9yKEVycm9yKCJDb3VsZCBub3QgcmVzb2x2ZSB0aGUg
dHlwZSBvZiBhIGNvbnN0YW50LiIpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAg
ICAgICB9CisgICAgICAgIHVubmFtZWRUeXBlcy5hcHBlbmQobm9ybWFsaXplZEZ1bmN0aW9uS2V5
VHlwZSgqdHlwZSkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgYXV0byBpdGVyID0gbV9mdW5j
dGlvbnMuZmluZChGdW5jdGlvbktleSB7IG5hbWUsIFdURk1vdmUodW5uYW1lZFR5cGVzKSwgY2Fz
dFJldHVyblR5cGUgfSk7CisgICAgICAgIGlmIChpdGVyICE9IG1fZnVuY3Rpb25zLmVuZCgpKSB7
CisgICAgICAgICAgICAvL2RhdGFMb2dMbigiaGF2ZSBvcHRpb25zISIpOworICAgICAgICAgICAg
dG90YWxOdW1PdmVybG9hZHMgKz0gaXRlci0+dmFsdWUuc2l6ZSgpOworICAgICAgICAgICAgaWYg
KEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiogZnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb25PdmVy
bG9hZChpdGVyLT52YWx1ZSwgdHlwZXMsIGNhc3RSZXR1cm5UeXBlKSkgeworICAgICAgICAgICAg
ICAgIGRvbmVUaW1lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF1dG8gbmV3RnVuY3Rpb24gPSBy
ZXNvbHZlQnlJbnN0YW50aWF0aW9uKG5hbWUsIGxvY2F0aW9uLCB0eXBlcywgaW50cmluc2ljcykp
IHsKKyAgICAgICAgcHJvZ3JhbS5hcHBlbmQoV1RGTW92ZSgqbmV3RnVuY3Rpb24pKTsKKyAgICAg
ICAgZG9uZVRpbWUoKTsKKyAgICAgICAgcmV0dXJuICZwcm9ncmFtLm5hdGl2ZUZ1bmN0aW9uRGVj
bGFyYXRpb25zKCkubGFzdCgpOworICAgIH0KKworICAgIGRvbmVUaW1lKCk7CisgICAgcmV0dXJu
IG51bGxwdHI7Cit9CisKIHZvaWQgQ2hlY2tlcjo6dmlzaXQoQVNUOjpFbnVtZXJhdGlvbkRlZmlu
aXRpb24mIGVudW1lcmF0aW9uRGVmaW5pdGlvbikKIHsKICAgICBib29sIGlzU2lnbmVkOwpAQCAt
OTYxLDggKzExMzEsMTAgQEAgdm9pZCBDaGVja2VyOjpmaW5pc2hWaXNpdGluZyhBU1Q6OlByb3Bl
cgogICAgICAgICBpZiAoYWRkaXRpb25hbEFyZ3VtZW50VHlwZSkKICAgICAgICAgICAgIGdldHRl
ckFyZ3VtZW50VHlwZXMuYXBwZW5kKCphZGRpdGlvbmFsQXJndW1lbnRUeXBlKTsKICAgICAgICAg
YXV0byBnZXR0ZXJOYW1lID0gcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLmdldHRlckZ1bmN0aW9u
TmFtZSgpOwotICAgICAgICBhdXRvKiBnZXR0ZXJGdW5jdGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNv
bnRleHQoKS5nZXRGdW5jdGlvbnMoZ2V0dGVyTmFtZSk7Ci0gICAgICAgIGdldHRlckZ1bmN0aW9u
ID0gcmVzb2x2ZUZ1bmN0aW9uKG1fcHJvZ3JhbSwgZ2V0dGVyRnVuY3Rpb25zLCBnZXR0ZXJBcmd1
bWVudFR5cGVzLCBnZXR0ZXJOYW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0
aW9uKCksIG1faW50cmluc2ljcyk7CisgICAgICAgIC8vYXV0byogZ2V0dGVyRnVuY3Rpb25zID0g
bV9wcm9ncmFtLm5hbWVDb250ZXh0KCkuZ2V0RnVuY3Rpb25zKGdldHRlck5hbWUpOworICAgICAg
ICBnZXR0ZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbihtX3Byb2dyYW0sIG51bGxwdHIvKmdl
dHRlckZ1bmN0aW9ucyovLCBnZXR0ZXJBcmd1bWVudFR5cGVzLCBnZXR0ZXJOYW1lLCBwcm9wZXJ0
eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCksIG1faW50cmluc2ljcyk7CisgICAgICAg
IGlmIChoYXNFcnJvcigpKQorICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBpZiAoZ2V0dGVy
RnVuY3Rpb24pCiAgICAgICAgICAgICBnZXR0ZXJSZXR1cm5UeXBlID0gJmdldHRlckZ1bmN0aW9u
LT50eXBlKCk7CiAgICAgfQpAQCAtOTc3LDggKzExNDksMTAgQEAgdm9pZCBDaGVja2VyOjpmaW5p
c2hWaXNpdGluZyhBU1Q6OlByb3BlcgogICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxBcmd1bWVu
dFR5cGUpCiAgICAgICAgICAgICAgICAgYW5kZXJBcmd1bWVudFR5cGVzLmFwcGVuZCgqYWRkaXRp
b25hbEFyZ3VtZW50VHlwZSk7CiAgICAgICAgICAgICBhdXRvIGFuZGVyTmFtZSA9IHByb3BlcnR5
QWNjZXNzRXhwcmVzc2lvbi5hbmRlckZ1bmN0aW9uTmFtZSgpOwotICAgICAgICAgICAgYXV0byog
YW5kZXJGdW5jdGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRleHQoKS5nZXRGdW5jdGlvbnMoYW5k
ZXJOYW1lKTsKLSAgICAgICAgICAgIGFuZGVyRnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb24obV9w
cm9ncmFtLCBhbmRlckZ1bmN0aW9ucywgYW5kZXJBcmd1bWVudFR5cGVzLCBhbmRlck5hbWUsIHBy
b3BlcnR5QWNjZXNzRXhwcmVzc2lvbi5jb2RlTG9jYXRpb24oKSwgbV9pbnRyaW5zaWNzKTsKKyAg
ICAgICAgICAgIC8vYXV0byogYW5kZXJGdW5jdGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRleHQo
KS5nZXRGdW5jdGlvbnMoYW5kZXJOYW1lKTsKKyAgICAgICAgICAgIGFuZGVyRnVuY3Rpb24gPSBy
ZXNvbHZlRnVuY3Rpb24obV9wcm9ncmFtLCBudWxscHRyLyphbmRlckZ1bmN0aW9ucyovLCBhbmRl
ckFyZ3VtZW50VHlwZXMsIGFuZGVyTmFtZSwgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLmNvZGVM
b2NhdGlvbigpLCBtX2ludHJpbnNpY3MpOworICAgICAgICAgICAgaWYgKGhhc0Vycm9yKCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgaWYgKGFuZGVyRnVuY3Rpb24pCiAg
ICAgICAgICAgICAgICAgYW5kZXJSZXR1cm5UeXBlID0gJmRvd25jYXN0PEFTVDo6UG9pbnRlclR5
cGU+KGFuZGVyRnVuY3Rpb24tPnR5cGUoKSkuZWxlbWVudFR5cGUoKTsgLy8gRklYTUU6IGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTgxNjQgRW5mb3JjZSB0aGUgcmV0
dXJuIG9mIGFuZGVycyB3aWxsIGFsd2F5cyBiZSBhIHBvaW50ZXIKICAgICAgICAgfQpAQCAtOTky
LDggKzExNjYsMTAgQEAgdm9pZCBDaGVja2VyOjpmaW5pc2hWaXNpdGluZyhBU1Q6OlByb3Blcgog
ICAgICAgICBpZiAoYWRkaXRpb25hbEFyZ3VtZW50VHlwZSkKICAgICAgICAgICAgIHRocmVhZEFu
ZGVyQXJndW1lbnRUeXBlcy5hcHBlbmQoKmFkZGl0aW9uYWxBcmd1bWVudFR5cGUpOwogICAgICAg
ICBhdXRvIGFuZGVyTmFtZSA9IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbi5hbmRlckZ1bmN0aW9u
TmFtZSgpOwotICAgICAgICBhdXRvKiBhbmRlckZ1bmN0aW9ucyA9IG1fcHJvZ3JhbS5uYW1lQ29u
dGV4dCgpLmdldEZ1bmN0aW9ucyhhbmRlck5hbWUpOwotICAgICAgICB0aHJlYWRBbmRlckZ1bmN0
aW9uID0gcmVzb2x2ZUZ1bmN0aW9uKG1fcHJvZ3JhbSwgYW5kZXJGdW5jdGlvbnMsIHRocmVhZEFu
ZGVyQXJndW1lbnRUeXBlcywgYW5kZXJOYW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29k
ZUxvY2F0aW9uKCksIG1faW50cmluc2ljcyk7CisgICAgICAgIC8vYXV0byogYW5kZXJGdW5jdGlv
bnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRleHQoKS5nZXRGdW5jdGlvbnMoYW5kZXJOYW1lKTsKKyAg
ICAgICAgdGhyZWFkQW5kZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbihtX3Byb2dyYW0sIG51
bGxwdHIvKmFuZGVyRnVuY3Rpb25zKi8sIHRocmVhZEFuZGVyQXJndW1lbnRUeXBlcywgYW5kZXJO
YW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCksIG1faW50cmluc2lj
cyk7CisgICAgICAgIGlmIChoYXNFcnJvcigpKQorICAgICAgICAgICAgcmV0dXJuOwogICAgICAg
ICBpZiAodGhyZWFkQW5kZXJGdW5jdGlvbikKICAgICAgICAgICAgIHRocmVhZEFuZGVyUmV0dXJu
VHlwZSA9ICZkb3duY2FzdDxBU1Q6OlBvaW50ZXJUeXBlPih0aHJlYWRBbmRlckZ1bmN0aW9uLT50
eXBlKCkpLmVsZW1lbnRUeXBlKCk7IC8vIEZJWE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTk4MTY0IEVuZm9yY2UgdGhlIHJldHVybiBvZiBhbmRlcnMgd2lsbCBh
bHdheXMgYmUgYSBwb2ludGVyCiAgICAgfQpAQCAtMTAzOSw4ICsxMjE1LDEwIEBAIHZvaWQgQ2hl
Y2tlcjo6ZmluaXNoVmlzaXRpbmcoQVNUOjpQcm9wZXIKICAgICAgICAgICAgIHNldHRlckFyZ3Vt
ZW50VHlwZXMuYXBwZW5kKCphZGRpdGlvbmFsQXJndW1lbnRUeXBlKTsKICAgICAgICAgc2V0dGVy
QXJndW1lbnRUeXBlcy5hcHBlbmQoZmllbGRSZXNvbHZpbmdUeXBlKTsKICAgICAgICAgYXV0byBz
ZXR0ZXJOYW1lID0gcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLnNldHRlckZ1bmN0aW9uTmFtZSgp
OwotICAgICAgICBhdXRvKiBzZXR0ZXJGdW5jdGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRleHQo
KS5nZXRGdW5jdGlvbnMoc2V0dGVyTmFtZSk7Ci0gICAgICAgIHNldHRlckZ1bmN0aW9uID0gcmVz
b2x2ZUZ1bmN0aW9uKG1fcHJvZ3JhbSwgc2V0dGVyRnVuY3Rpb25zLCBzZXR0ZXJBcmd1bWVudFR5
cGVzLCBzZXR0ZXJOYW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCks
IG1faW50cmluc2ljcyk7CisgICAgICAgIC8vYXV0byogc2V0dGVyRnVuY3Rpb25zID0gbV9wcm9n
cmFtLm5hbWVDb250ZXh0KCkuZ2V0RnVuY3Rpb25zKHNldHRlck5hbWUpOworICAgICAgICBzZXR0
ZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbihtX3Byb2dyYW0sIG51bGxwdHIvKnNldHRlckZ1
bmN0aW9ucyovLCBzZXR0ZXJBcmd1bWVudFR5cGVzLCBzZXR0ZXJOYW1lLCBwcm9wZXJ0eUFjY2Vz
c0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCksIG1faW50cmluc2ljcyk7CisgICAgICAgIGlmICho
YXNFcnJvcigpKQorICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBpZiAoc2V0dGVyRnVuY3Rp
b24pCiAgICAgICAgICAgICBzZXR0ZXJSZXR1cm5UeXBlID0gJnNldHRlckZ1bmN0aW9uLT50eXBl
KCk7CiAgICAgfQpAQCAtMTQwOSw2ICsxNTg3LDcgQEAgdm9pZCBDaGVja2VyOjp2aXNpdChBU1Q6
OlRlcm5hcnlFeHByZXNzaQogCiB2b2lkIENoZWNrZXI6OnZpc2l0KEFTVDo6Q2FsbEV4cHJlc3Np
b24mIGNhbGxFeHByZXNzaW9uKQogeworICAgIC8vZGF0YUxvZ0xuKCJsb29raW5nIGF0OiAiLCBF
eHByZXNzaW9uRHVtcGVyKGNhbGxFeHByZXNzaW9uKSk7CiAgICAgVmVjdG9yPHN0ZDo6cmVmZXJl
bmNlX3dyYXBwZXI8UmVzb2x2aW5nVHlwZT4+IHR5cGVzOwogICAgIHR5cGVzLnJlc2VydmVJbml0
aWFsQ2FwYWNpdHkoY2FsbEV4cHJlc3Npb24uYXJndW1lbnRzKCkuc2l6ZSgpKTsKICAgICBmb3Ig
KGF1dG8mIGFyZ3VtZW50IDogY2FsbEV4cHJlc3Npb24uYXJndW1lbnRzKCkpIHsKQEAgLTE0MjAs
MjMgKzE1OTksMzcgQEAgdm9pZCBDaGVja2VyOjp2aXNpdChBU1Q6OkNhbGxFeHByZXNzaW9uJgog
ICAgIC8vIERvbid0IHJlY3Vyc2Ugb24gdGhlIGNhc3RSZXR1cm5UeXBlLCBiZWNhdXNlIGl0J3Mg
Z3VhcmFudGVlZCB0byBiZSBhIE5hbWVkVHlwZSwgd2hpY2ggd2lsbCBnZXQgdmlzaXRlZCBsYXRl
ci4KICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHJlY3Vyc2UgdG8gdGhlIHNhbWUgbm9kZSB0d2lj
ZS4KIAotICAgIE5hbWVDb250ZXh0JiBuYW1lQ29udGV4dCA9IG1fcHJvZ3JhbS5uYW1lQ29udGV4
dCgpOwotICAgIGF1dG8qIGZ1bmN0aW9ucyA9IG5hbWVDb250ZXh0LmdldEZ1bmN0aW9ucyhjYWxs
RXhwcmVzc2lvbi5uYW1lKCkpOwotICAgIGlmICghZnVuY3Rpb25zKSB7Ci0gICAgICAgIGlmIChh
dXRvKiB0eXBlcyA9IG5hbWVDb250ZXh0LmdldFR5cGVzKGNhbGxFeHByZXNzaW9uLm5hbWUoKSkp
IHsKLSAgICAgICAgICAgIGlmICh0eXBlcy0+c2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoKGZ1bmN0aW9ucyA9IG5hbWVDb250ZXh0LmdldEZ1bmN0aW9ucygib3BlcmF0b3IgY2Fz
dCJfc3RyKSkpCi0gICAgICAgICAgICAgICAgICAgIGNhbGxFeHByZXNzaW9uLnNldENhc3REYXRh
KCgqdHlwZXMpWzBdLmdldCgpKTsKKworICAgIC8vaWYgKCFmdW5jdGlvbnMpIHsKKyAgICAvLyAg
ICBzZXRFcnJvcihFcnJvcigiQ291bGQgbm90IGZpbmQgYW55IGZ1bmN0aW9ucyB3aXRoIGFwcHJv
cHJpYXRlIG5hbWUuIiwgY2FsbEV4cHJlc3Npb24uY29kZUxvY2F0aW9uKCkpKTsKKyAgICAvLyAg
ICByZXR1cm47CisgICAgLy99CisKKyAgICBhdXRvKiBmdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlv
bihtX3Byb2dyYW0sIG51bGxwdHIsIHR5cGVzLCBjYWxsRXhwcmVzc2lvbi5uYW1lKCksIGNhbGxF
eHByZXNzaW9uLmNvZGVMb2NhdGlvbigpLCBtX2ludHJpbnNpY3MpOworICAgIGlmIChoYXNFcnJv
cigpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWZ1bmN0aW9uKSB7CisgICAgICAgIE5h
bWVDb250ZXh0JiBuYW1lQ29udGV4dCA9IG1fcHJvZ3JhbS5uYW1lQ29udGV4dCgpOworICAgICAg
ICBpZiAoYXV0byogY2FzdFR5cGVzID0gbmFtZUNvbnRleHQuZ2V0VHlwZXMoY2FsbEV4cHJlc3Np
b24ubmFtZSgpKSkgeworICAgICAgICAgICAgaWYgKGNhc3RUeXBlcy0+c2l6ZSgpID09IDEpIHsK
KyAgICAgICAgICAgICAgICBBU1Q6Ok5hbWVkVHlwZSYgY2FzdFR5cGUgPSAoKmNhc3RUeXBlcylb
MF0uZ2V0KCk7CisgICAgICAgICAgICAgICAgZnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb24obV9w
cm9ncmFtLCBudWxscHRyLCB0eXBlcywgIm9wZXJhdG9yIGNhc3QiX3N0ciwgY2FsbEV4cHJlc3Np
b24uY29kZUxvY2F0aW9uKCksIG1faW50cmluc2ljcywgJmNhc3RUeXBlKTsKKyAgICAgICAgICAg
ICAgICBpZiAoaGFzRXJyb3IoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICAgICAgICAgIGlmIChmdW5jdGlvbikKKyAgICAgICAgICAgICAgICAgICAgY2FsbEV4cHJlc3Np
b24uc2V0Q2FzdERhdGEoY2FzdFR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAg
fQotICAgIGlmICghZnVuY3Rpb25zKSB7Ci0gICAgICAgIHNldEVycm9yKEVycm9yKCJDb3VsZCBu
b3QgZmluZCBhbnkgZnVuY3Rpb25zIHdpdGggYXBwcm9wcmlhdGUgbmFtZS4iLCBjYWxsRXhwcmVz
c2lvbi5jb2RlTG9jYXRpb24oKSkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQogCi0gICAgYXV0
byogZnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb24obV9wcm9ncmFtLCBmdW5jdGlvbnMsIHR5cGVz
LCBjYWxsRXhwcmVzc2lvbi5uYW1lKCksIGNhbGxFeHByZXNzaW9uLmNvZGVMb2NhdGlvbigpLCBt
X2ludHJpbnNpY3MsIGNhbGxFeHByZXNzaW9uLmNhc3RSZXR1cm5UeXBlKCkpOwogICAgIGlmICgh
ZnVuY3Rpb24pIHsKKyAgICAgICAgZGF0YUxvZ0xuKCk7CisgICAgICAgIGRhdGFMb2dMbigiRmFp
bGVkISIpOworICAgICAgICBkYXRhTG9nTG4oRnVuY3Rpb25EZWZpbml0aW9uRHVtcGVyKCptX2N1
cnJlbnRGdW5jdGlvbikpOworICAgICAgICBkYXRhTG9nTG4oKTsKKyAgICAgICAgZGF0YUxvZ0xu
KEV4cHJlc3Npb25EdW1wZXIoY2FsbEV4cHJlc3Npb24pKTsKKwogICAgICAgICAvLyBGSVhNRTog
QWRkIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3Igd2h5IHdlIGNhbid0IHJlc29sdmUgdG8gb25l
IG9mIHRoZSBvdmVycmlkZXMuCiAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0yMDAxMzMKICAgICAgICAgc2V0RXJyb3IoRXJyb3IoIkNhbm5vdCByZXNv
bHZlIGZ1bmN0aW9uIGNhbGwgdG8gYSBjb25jcmV0ZSBjYWxsZWUuIE1ha2Ugc3VyZSB5b3UgYXJl
IHVzaW5nIGNvbXBhdGlibGUgdHlwZXMuIiwgY2FsbEV4cHJlc3Npb24uY29kZUxvY2F0aW9uKCkp
KTsKQEAgLTE0NjEsNyArMTY1NCwxMCBAQCBFeHBlY3RlZDx2b2lkLCBFcnJvcj4gY2hlY2soUHJv
Z3JhbSYgcHJvCiAgICAgY2hlY2tlci5jaGVja0Vycm9yQW5kVmlzaXQocHJvZ3JhbSk7CiAgICAg
aWYgKGNoZWNrZXIuaGFzRXJyb3IoKSkKICAgICAgICAgcmV0dXJuIGNoZWNrZXIucmVzdWx0KCk7
Ci0gICAgcmV0dXJuIGNoZWNrZXIuYXNzaWduVHlwZXMoKTsKKyAgICBhdXRvIHJlc3VsdCA9IGNo
ZWNrZXIuYXNzaWduVHlwZXMoKTsKKyAgICBkYXRhTG9nTG4oInJlc29sdmUgZnVuY3Rpb246ICIs
IHRpbWUsICIgbXMiKTsKKyAgICBkYXRhTG9nTG4oIlRvdGFsIG92ZXJsb2FkczogIiwgdG90YWxO
dW1PdmVybG9hZHMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdI
TFNMCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTEludHJp
bnNpY3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExT
TC9XSExTTEludHJpbnNpY3MuaAkocmV2aXNpb24gMjQ4MDMwKQorKysgU291cmNlL1dlYkNvcmUv
TW9kdWxlcy93ZWJncHUvV0hMU0wvV0hMU0xJbnRyaW5zaWNzLmgJKHdvcmtpbmcgY29weSkKQEAg
LTE3OCw2ICsxNzgsMTIgQEAgcHVibGljOgogICAgICAgICByZXR1cm4gKm1fZmxvYXRUeXBlOwog
ICAgIH0KIAorICAgIEFTVDo6TmF0aXZlVHlwZURlY2xhcmF0aW9uJiBoYWxmVHlwZSgpIGNvbnN0
CisgICAgeworICAgICAgICBBU1NFUlQobV9oYWxmVHlwZSk7CisgICAgICAgIHJldHVybiAqbV9o
YWxmVHlwZTsKKyAgICB9CisKICAgICBBU1Q6Ok5hdGl2ZVR5cGVEZWNsYXJhdGlvbiYgZmxvYXQy
VHlwZSgpIGNvbnN0CiAgICAgewogICAgICAgICBBU1NFUlQobV92ZWN0b3JGbG9hdFswXSk7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTFByZXBhcmUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNM
UHJlcGFyZS5jcHAJKHJldmlzaW9uIDI0ODAzMCkKKysrIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMv
d2ViZ3B1L1dITFNML1dITFNMUHJlcGFyZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYyLDkgKzYy
LDkgQEAgbmFtZXNwYWNlIFdITFNMIHsKIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBkdW1wQVNUQmVm
b3JlRWFjaFBhc3MgPSBmYWxzZTsKIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBkdW1wQVNUQWZ0ZXJQ
YXJzaW5nID0gZmFsc2U7CiBzdGF0aWMgY29uc3RleHByIGJvb2wgZHVtcEFTVEF0RW5kID0gZmFs
c2U7Ci1zdGF0aWMgY29uc3RleHByIGJvb2wgYWx3YXlzRHVtcFBhc3NGYWlsdXJlcyA9IGZhbHNl
Oworc3RhdGljIGNvbnN0ZXhwciBib29sIGFsd2F5c0R1bXBQYXNzRmFpbHVyZXMgPSB0cnVlOwog
c3RhdGljIGNvbnN0ZXhwciBib29sIGR1bXBQYXNzRmFpbHVyZSA9IGR1bXBBU1RCZWZvcmVFYWNo
UGFzcyB8fCBkdW1wQVNUQWZ0ZXJQYXJzaW5nIHx8IGR1bXBBU1RBdEVuZCB8fCBhbHdheXNEdW1w
UGFzc0ZhaWx1cmVzOwotc3RhdGljIGNvbnN0ZXhwciBib29sIGR1bXBQaGFzZVRpbWVzID0gZmFs
c2U7CitzdGF0aWMgY29uc3RleHByIGJvb2wgZHVtcFBoYXNlVGltZXMgPSB0cnVlOwogCiBzdGF0
aWMgY29uc3RleHByIGJvb2wgcGFyc2VGdWxsU3RhbmRhcmRMaWJyYXJ5ID0gZmFsc2U7CiAKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML0FTVC9XSExTTENvbnN0YW50
RXhwcmVzc2lvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1
L1dITFNML0FTVC9XSExTTENvbnN0YW50RXhwcmVzc2lvbi5oCShyZXZpc2lvbiAyNDgwMzApCisr
KyBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9BU1QvV0hMU0xDb25zdGFudEV4
cHJlc3Npb24uaAkod29ya2luZyBjb3B5KQpAQCAtOTAsNiArOTAsMTIgQEAgcHVibGljOgogICAg
ICAgICByZXR1cm4gV1RGOjpnZXQ8SW50ZWdlckxpdGVyYWw+KG1fdmFyaWFudCk7CiAgICAgfQog
CisgICAgVW5zaWduZWRJbnRlZ2VyTGl0ZXJhbCYgdW5zaWduZWRJbnRlZ2VyTGl0ZXJhbCgpCisg
ICAgeworICAgICAgICBBU1NFUlQoV1RGOjpob2xkc19hbHRlcm5hdGl2ZTxVbnNpZ25lZEludGVn
ZXJMaXRlcmFsPihtX3ZhcmlhbnQpKTsKKyAgICAgICAgcmV0dXJuIFdURjo6Z2V0PFVuc2lnbmVk
SW50ZWdlckxpdGVyYWw+KG1fdmFyaWFudCk7CisgICAgfQorCiAgICAgdGVtcGxhdGUgPHR5cGVu
YW1lIFZpc2l0b3I+IGF1dG8gdmlzaXQoY29uc3QgVmlzaXRvciYgdmlzaXRvcikgLT4gZGVjbHR5
cGUoV1RGOjp2aXNpdCh2aXNpdG9yLCBzdGQ6OmRlY2x2YWw8VmFyaWFudDxJbnRlZ2VyTGl0ZXJh
bCwgVW5zaWduZWRJbnRlZ2VyTGl0ZXJhbCwgRmxvYXRMaXRlcmFsLCBOdWxsTGl0ZXJhbCwgQm9v
bGVhbkxpdGVyYWwsIEVudW1lcmF0aW9uTWVtYmVyTGl0ZXJhbD4mPigpKSkKICAgICB7CiAgICAg
ICAgIHJldHVybiBXVEY6OnZpc2l0KHZpc2l0b3IsIG1fdmFyaWFudCk7CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvY29jb2EvR1BVQ29tcHV0ZVBpcGVsaW5lTWV0
YWwubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1
L2NvY29hL0dQVUNvbXB1dGVQaXBlbGluZU1ldGFsLm1tCShyZXZpc2lvbiAyNDgwMzApCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvY29jb2EvR1BVQ29tcHV0ZVBpcGVs
aW5lTWV0YWwubW0JKHdvcmtpbmcgY29weSkKQEAgLTg3LDEwICs4NywxMCBAQCBzdGF0aWMgT3B0
aW9uYWw8V0hMU0w6OkNvbXB1dGVEaW1lbnNpb25zCiAgICAgICAgIEJFR0lOX0JMT0NLX09CSkNf
RVhDRVBUSU9OUzsKICAgICAgICAgY29tcHV0ZUxpYnJhcnkgPSBhZG9wdE5TKFtkZXZpY2UucGxh
dGZvcm1EZXZpY2UoKSBuZXdMaWJyYXJ5V2l0aFNvdXJjZTp3aGxzbENvbXBpbGVSZXN1bHQtPm1l
dGFsU291cmNlIG9wdGlvbnM6bmlsIGVycm9yOiZlcnJvcl0pOwogICAgICAgICBFTkRfQkxPQ0tf
T0JKQ19FWENFUFRJT05TOwotI2lmbmRlZiBOREVCVUcKKy8vI2lmbmRlZiBOREVCVUcKICAgICAg
ICAgaWYgKCFjb21wdXRlTGlicmFyeSkKICAgICAgICAgICAgIE5TTG9nKEAiJUAiLCBlcnJvcik7
Ci0jZW5kaWYKKy8vI2VuZGlmCiAgICAgICAgIEFTU0VSVChjb21wdXRlTGlicmFyeSk7CiAgICAg
ICAgIC8vIEZJWE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTk1
NzcxIE9uY2Ugd2UgemVyby1maWxsIHZhcmlhYmxlcywgdGhlcmUgc2hvdWxkIGJlIG5vIHdhcm5p
bmdzLCBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBBU1NFUlQoIWVycm9yKSBoZXJlLgogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>375642</attachid>
            <date>2019-08-06 12:27:36 -0700</date>
            <delta_ts>2019-08-06 17:26:37 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>17047</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNMQ2hlY2tlci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvV0hM
U0xDaGVja2VyLmNwcAkocmV2aXNpb24gMjQ4MDMwKQorKysgU291cmNlL1dlYkNvcmUvTW9kdWxl
cy93ZWJncHUvV0hMU0wvV0hMU0xDaGVja2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjQsNiAr
NjQsMTAgQEAKICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvV1RG
U3RyaW5nLmg+CiAKKyNpbmNsdWRlIDx3dGYvTW9ub3RvbmljVGltZS5oPgorI2luY2x1ZGUgPHd0
Zi9EYXRhTG9nLmg+CisjaW5jbHVkZSAiV0hMU0xBU1REdW1wZXIuaCIKKwogbmFtZXNwYWNlIFdl
YkNvcmUgewogCiBuYW1lc3BhY2UgV0hMU0wgewpAQCAtMTE4LDYgKzEyMiw4NyBAQCBwdWJsaWM6
CiAgICAgfQogfTsKIAorY2xhc3MgRnVuY3Rpb25LZXkgeworcHVibGljOgorICAgIEZ1bmN0aW9u
S2V5KCkgPSBkZWZhdWx0OworICAgIEZ1bmN0aW9uS2V5KFdURjo6SGFzaFRhYmxlRGVsZXRlZFZh
bHVlVHlwZSkKKyAgICB7CisgICAgICAgIG1fY2FzdFJldHVyblR5cGUgPSBiaXR3aXNlX2Nhc3Q8
QVNUOjpOYW1lZFR5cGUqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KDEpKTsKKyAgICB9CisKKyAg
ICBGdW5jdGlvbktleShTdHJpbmcgbmFtZSwgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8
QVNUOjpVbm5hbWVkVHlwZT4+IHR5cGVzLCBBU1Q6Ok5hbWVkVHlwZSogY2FzdFJldHVyblR5cGUg
PSBudWxscHRyKQorICAgICAgICA6IG1fbmFtZShXVEZNb3ZlKG5hbWUpKQorICAgICAgICAsIG1f
dHlwZXMoV1RGTW92ZSh0eXBlcykpCisgICAgICAgICwgbV9jYXN0UmV0dXJuVHlwZShjYXN0UmV0
dXJuVHlwZSkKKyAgICB7IH0KKworICAgIGJvb2wgaXNFbXB0eVZhbHVlKCkgY29uc3QgeyByZXR1
cm4gbV9uYW1lLmlzTnVsbCgpOyB9CisgICAgYm9vbCBpc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSgp
IGNvbnN0IHsgcmV0dXJuIG1fY2FzdFJldHVyblR5cGUgPT0gYml0d2lzZV9jYXN0PEFTVDo6TmFt
ZWRUeXBlKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PigxKSk7IH0KKworICAgIHVuc2lnbmVkIGhh
c2goKSBjb25zdAorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaGFzaCA9IEludEhhc2g8c2l6ZV90
Pjo6aGFzaChtX3R5cGVzLnNpemUoKSk7CisgICAgICAgIGhhc2ggXj0gbV9uYW1lLmhhc2goKTsK
KyAgICAgICAgZm9yIChhdXRvJiB0eXBlIDogbV90eXBlcykKKyAgICAgICAgICAgIGhhc2ggXj0g
dHlwZS5nZXQoKS5oYXNoKCk7CisKKyAgICAgICAgaWYgKG1fY2FzdFJldHVyblR5cGUpCisgICAg
ICAgICAgICBoYXNoIF49IFdURjo6UHRySGFzaDxBU1Q6OlR5cGUqPjo6aGFzaCgmbV9jYXN0UmV0
dXJuVHlwZS0+dW5pZnlOb2RlKCkpOworCisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKwor
ICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGdW5jdGlvbktleSYgb3RoZXIpIGNvbnN0CisgICAg
eworICAgICAgICBpZiAobV90eXBlcy5zaXplKCkgIT0gb3RoZXIubV90eXBlcy5zaXplKCkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1fbmFtZSAhPSBvdGhlci5t
X25hbWUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBtX3R5cGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW1hdGNo
ZXMobV90eXBlc1tpXS5nZXQoKSwgb3RoZXIubV90eXBlc1tpXS5nZXQoKSkpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEhbV9jYXN0UmV0
dXJuVHlwZSAhPSAhIW90aGVyLm1fY2FzdFJldHVyblR5cGUpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgaWYgKCFtX2Nhc3RSZXR1cm5UeXBlKQorICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICAgICAgaWYgKCZtX2Nhc3RSZXR1cm5UeXBlLT51bmlmeU5vZGUoKSA9
PSAmb3RoZXIubV9jYXN0UmV0dXJuVHlwZS0+dW5pZnlOb2RlKCkpCisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RydWN0IEhh
c2ggeworICAgICAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBGdW5jdGlvbktleSYga2V5
KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4ga2V5Lmhhc2goKTsKKyAgICAgICAgfQor
CisgICAgICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IEZ1bmN0aW9uS2V5JiBhLCBjb25zdCBG
dW5jdGlvbktleSYgYikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGEgPT0gYjsKKyAg
ICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBhcmVUb0VtcHR5
T3JEZWxldGVkID0gZmFsc2U7CisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIGVtcHR5VmFsdWVJ
c1plcm8gPSB0cnVlOworICAgIH07CisKKyAgICBzdHJ1Y3QgVHJhaXRzIDogcHVibGljIFdURjo6
U2ltcGxlQ2xhc3NIYXNoVHJhaXRzPEZ1bmN0aW9uS2V5PiB7CisgICAgICAgIHN0YXRpYyBjb25z
dCBib29sIGhhc0lzRW1wdHlWYWx1ZUZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgc3RhdGljIGJv
b2wgaXNFbXB0eVZhbHVlKGNvbnN0IEZ1bmN0aW9uS2V5JiBrZXkpIHsgcmV0dXJuIGtleS5pc0Vt
cHR5VmFsdWUoKTsgfQorICAgIH07CisKK3ByaXZhdGU6CisgICAgU3RyaW5nIG1fbmFtZTsKKyAg
ICBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxBU1Q6OlVubmFtZWRUeXBlPj4gbV90eXBl
czsKKyAgICBBU1Q6Ok5hbWVkVHlwZSogbV9jYXN0UmV0dXJuVHlwZTsKK307CisKIHN0YXRpYyBB
U1Q6Ok5hdGl2ZUZ1bmN0aW9uRGVjbGFyYXRpb24gcmVzb2x2ZVdpdGhPcGVyYXRvckFuZGVySW5k
ZXhlcihDb2RlTG9jYXRpb24gbG9jYXRpb24sIEFTVDo6QXJyYXlSZWZlcmVuY2VUeXBlJiBmaXJz
dEFyZ3VtZW50LCBjb25zdCBJbnRyaW5zaWNzJiBpbnRyaW5zaWNzKQogewogICAgIGNvbnN0IGJv
b2wgaXNPcGVyYXRvciA9IHRydWU7CkBAIC0yMTcsMjEgKzMwMiw2IEBAIHN0YXRpYyBPcHRpb25h
bDxBU1Q6Ok5hdGl2ZUZ1bmN0aW9uRGVjbGEKICAgICByZXR1cm4gV1RGOjpudWxsb3B0OwogfQog
Ci1zdGF0aWMgQVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uKiByZXNvbHZlRnVuY3Rpb24oUHJvZ3Jh
bSYgcHJvZ3JhbSwgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8QVNUOjpGdW5jdGlvbkRl
Y2xhcmF0aW9uPiwgMT4qIHBvc3NpYmxlT3ZlcmxvYWRzLCBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vf
d3JhcHBlcjxSZXNvbHZpbmdUeXBlPj4mIHR5cGVzLCBjb25zdCBTdHJpbmcmIG5hbWUsIENvZGVM
b2NhdGlvbiBsb2NhdGlvbiwgY29uc3QgSW50cmluc2ljcyYgaW50cmluc2ljcywgQVNUOjpOYW1l
ZFR5cGUqIGNhc3RSZXR1cm5UeXBlID0gbnVsbHB0cikKLXsKLSAgICBpZiAocG9zc2libGVPdmVy
bG9hZHMpIHsKLSAgICAgICAgaWYgKEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiogZnVuY3Rpb24g
PSByZXNvbHZlRnVuY3Rpb25PdmVybG9hZCgqcG9zc2libGVPdmVybG9hZHMsIHR5cGVzLCBjYXN0
UmV0dXJuVHlwZSkpCi0gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb247Ci0gICAgfQotCi0gICAg
aWYgKGF1dG8gbmV3RnVuY3Rpb24gPSByZXNvbHZlQnlJbnN0YW50aWF0aW9uKG5hbWUsIGxvY2F0
aW9uLCB0eXBlcywgaW50cmluc2ljcykpIHsKLSAgICAgICAgcHJvZ3JhbS5hcHBlbmQoV1RGTW92
ZSgqbmV3RnVuY3Rpb24pKTsKLSAgICAgICAgcmV0dXJuICZwcm9ncmFtLm5hdGl2ZUZ1bmN0aW9u
RGVjbGFyYXRpb25zKCkubGFzdCgpOwotICAgIH0KLQotICAgIHJldHVybiBudWxscHRyOwotfQot
CiBzdGF0aWMgYm9vbCBjaGVja1NlbWFudGljcyhWZWN0b3I8RW50cnlQb2ludEl0ZW0+JiBpbnB1
dEl0ZW1zLCBWZWN0b3I8RW50cnlQb2ludEl0ZW0+JiBvdXRwdXRJdGVtcywgY29uc3QgT3B0aW9u
YWw8QVNUOjpFbnRyeVBvaW50VHlwZT4mIGVudHJ5UG9pbnRUeXBlLCBjb25zdCBJbnRyaW5zaWNz
JiBpbnRyaW5zaWNzKQogewogICAgIHsKQEAgLTQ1NCw2ICs1MjQsMjIgQEAgcHVibGljOgogICAg
ICAgICA6IG1faW50cmluc2ljcyhpbnRyaW5zaWNzKQogICAgICAgICAsIG1fcHJvZ3JhbShwcm9n
cmFtKQogICAgIHsKKyAgICAgICAgYXV0byBhZGRGdW5jdGlvbiA9IFsmXSAoQVNUOjpGdW5jdGlv
bkRlY2xhcmF0aW9uJiBmdW5jdGlvbikgeworICAgICAgICAgICAgVmVjdG9yPHN0ZDo6cmVmZXJl
bmNlX3dyYXBwZXI8QVNUOjpVbm5hbWVkVHlwZT4+IHR5cGVzOworICAgICAgICAgICAgZm9yIChh
dXRvJiBwYXJhbSA6IGZ1bmN0aW9uLnBhcmFtZXRlcnMoKSkKKyAgICAgICAgICAgICAgICB0eXBl
cy5hcHBlbmQobm9ybWFsaXplZEZ1bmN0aW9uS2V5VHlwZSgqcGFyYW0tPnR5cGUoKSkpOworICAg
ICAgICAgICAgQVNUOjpOYW1lZFR5cGUqIGNhc3RSZXR1cm5UeXBlID0gbnVsbHB0cjsKKyAgICAg
ICAgICAgIGlmIChmdW5jdGlvbi5pc0Nhc3QoKSAmJiBpczxBU1Q6Ok5hbWVkVHlwZT4oZnVuY3Rp
b24udHlwZSgpLnVuaWZ5Tm9kZSgpKSkKKyAgICAgICAgICAgICAgICBjYXN0UmV0dXJuVHlwZSA9
ICZkb3duY2FzdDxBU1Q6Ok5hbWVkVHlwZT4oZnVuY3Rpb24udHlwZSgpLnVuaWZ5Tm9kZSgpKSA7
CisgICAgICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IG1fZnVuY3Rpb25zLmFkZChGdW5jdGlvbktl
eSB7IGZ1bmN0aW9uLm5hbWUoKSwgV1RGTW92ZSh0eXBlcyksIGNhc3RSZXR1cm5UeXBlIH0sIFZl
Y3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbj4sIDE+
KCkpOworICAgICAgICAgICAgYWRkUmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS5hcHBlbmQoZnVuY3Rp
b24pOworICAgICAgICB9OworICAgICAgICBhdXRvIHN0YXJ0ID0gTW9ub3RvbmljVGltZTo6bm93
KCk7CisgICAgICAgIGZvciAoYXV0byYgZnVuY3Rpb24gOiBtX3Byb2dyYW0uZnVuY3Rpb25EZWZp
bml0aW9ucygpKQorICAgICAgICAgICAgYWRkRnVuY3Rpb24oZnVuY3Rpb24uZ2V0KCkpOworICAg
ICAgICBmb3IgKGF1dG8mIGZ1bmN0aW9uIDogbV9wcm9ncmFtLm5hdGl2ZUZ1bmN0aW9uRGVjbGFy
YXRpb25zKCkpCisgICAgICAgICAgICBhZGRGdW5jdGlvbihmdW5jdGlvbi5nZXQoKSk7CisgICAg
ICAgIGRhdGFMb2dMbigiQWRkIGZ1bmN0aW9uIHRpbWU6ICIsIChNb25vdG9uaWNUaW1lOjpub3co
KSAtIHN0YXJ0KS5taWxsaXNlY29uZHMoKSk7CiAgICAgfQogCiAgICAgdmlydHVhbCB+Q2hlY2tl
cigpID0gZGVmYXVsdDsKQEAgLTUxMSw2ICs1OTcsMzQgQEAgcHJpdmF0ZToKIAogICAgIHZvaWQg
ZmluaXNoVmlzaXRpbmcoQVNUOjpQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24mLCBSZXNvbHZpbmdU
eXBlKiBhZGRpdGlvbmFsQXJndW1lbnRUeXBlID0gbnVsbHB0cik7CiAKKyAgICBBU1Q6OkZ1bmN0
aW9uRGVjbGFyYXRpb24qIHJlc29sdmVGdW5jdGlvbihQcm9ncmFtJiwgVmVjdG9yPHN0ZDo6cmVm
ZXJlbmNlX3dyYXBwZXI8QVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uPiwgMT4qIHBvc3NpYmxlT3Zl
cmxvYWRzLCBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZXNvbHZpbmdUeXBlPj4mIHR5
cGVzLCBjb25zdCBTdHJpbmcmIG5hbWUsIENvZGVMb2NhdGlvbiBsb2NhdGlvbiwgY29uc3QgSW50
cmluc2ljcyYgaW50cmluc2ljcywgQVNUOjpOYW1lZFR5cGUqIGNhc3RSZXR1cm5UeXBlID0gbnVs
bHB0cik7CisKKyAgICBBU1Q6OlVubmFtZWRUeXBlJiB3cmFwcGVkRmxvYXRUeXBlKCkKKyAgICB7
CisgICAgICAgIGlmICghbV93cmFwcGVkRmxvYXRUeXBlKQorICAgICAgICAgICAgbV93cmFwcGVk
RmxvYXRUeXBlID0gQVNUOjpUeXBlUmVmZXJlbmNlOjp3cmFwKHsgfSwgbV9pbnRyaW5zaWNzLmZs
b2F0VHlwZSgpKTsKKyAgICAgICAgcmV0dXJuICptX3dyYXBwZWRGbG9hdFR5cGU7CisgICAgfQor
CisgICAgQVNUOjpVbm5hbWVkVHlwZSYgbm9ybWFsaXplZEZ1bmN0aW9uS2V5VHlwZShBU1Q6OlVu
bmFtZWRUeXBlJiB0eXBlKQorICAgIHsKKyAgICAgICAgYXV0byogdW5pZnlOb2RlID0gJnR5cGUu
dW5pZnlOb2RlKCk7CisgICAgICAgIGlmICh1bmlmeU5vZGUgPT0gJm1faW50cmluc2ljcy51aW50
VHlwZSgpCisgICAgICAgICAgICB8fCB1bmlmeU5vZGUgPT0gJm1faW50cmluc2ljcy5pbnRUeXBl
KCkKKyAgICAgICAgICAgIHx8IHVuaWZ5Tm9kZSA9PSAmbV9pbnRyaW5zaWNzLmZsb2F0VHlwZSgp
CisgICAgICAgICAgICB8fCB1bmlmeU5vZGUgPT0gJm1faW50cmluc2ljcy5oYWxmVHlwZSgpCisg
ICAgICAgICAgICB8fCB1bmlmeU5vZGUgPT0gJm1faW50cmluc2ljcy5jaGFyVHlwZSgpCisgICAg
ICAgICAgICB8fCB1bmlmeU5vZGUgPT0gJm1faW50cmluc2ljcy51Y2hhclR5cGUoKQorICAgICAg
ICAgICAgfHwgdW5pZnlOb2RlID09ICZtX2ludHJpbnNpY3Muc2hvcnRUeXBlKCkKKyAgICAgICAg
ICAgIHx8IHVuaWZ5Tm9kZSA9PSAmbV9pbnRyaW5zaWNzLnVzaG9ydFR5cGUoKSkgeworICAgICAg
ICAgICAgLy8gTGl0ZXJhbHMsIHVnaCEKKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkRmxvYXRU
eXBlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBS
ZWZQdHI8QVNUOjpUeXBlUmVmZXJlbmNlPiBtX3dyYXBwZWRGbG9hdFR5cGU7CiAgICAgSGFzaE1h
cDxBU1Q6OkV4cHJlc3Npb24qLCBzdGQ6OnVuaXF1ZV9wdHI8UmVzb2x2aW5nVHlwZT4+IG1fdHlw
ZU1hcDsKICAgICBIYXNoU2V0PFN0cmluZz4gbV92ZXJ0ZXhFbnRyeVBvaW50czsKICAgICBIYXNo
U2V0PFN0cmluZz4gbV9mcmFnbWVudEVudHJ5UG9pbnRzOwpAQCAtNTE4LDYgKzYzMiw3IEBAIHBy
aXZhdGU6CiAgICAgY29uc3QgSW50cmluc2ljcyYgbV9pbnRyaW5zaWNzOwogICAgIFByb2dyYW0m
IG1fcHJvZ3JhbTsKICAgICBBU1Q6OkZ1bmN0aW9uRGVmaW5pdGlvbiogbV9jdXJyZW50RnVuY3Rp
b24geyBudWxscHRyIH07CisgICAgSGFzaE1hcDxGdW5jdGlvbktleSwgVmVjdG9yPHN0ZDo6cmVm
ZXJlbmNlX3dyYXBwZXI8QVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uPiwgMT4sIEZ1bmN0aW9uS2V5
OjpIYXNoLCBGdW5jdGlvbktleTo6VHJhaXRzPiBtX2Z1bmN0aW9uczsKIH07CiAKIHZvaWQgQ2hl
Y2tlcjo6dmlzaXQoUHJvZ3JhbSYgcHJvZ3JhbSkKQEAgLTYzOCw2ICs3NTMsNjEgQEAgc3RhdGlj
IFJlZlB0cjxBU1Q6OlVubmFtZWRUeXBlPiBjb21taXQoUgogICAgIH0pKTsKIH0KIAorc3RhdGlj
IGRvdWJsZSB0aW1lID0gMC4wOworc3RhdGljIHNpemVfdCB0b3RhbE51bU92ZXJsb2FkcyA9IDA7
CisKK0FTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiogQ2hlY2tlcjo6cmVzb2x2ZUZ1bmN0aW9uKFBy
b2dyYW0mIHByb2dyYW0sIFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6RnVuY3Rp
b25EZWNsYXJhdGlvbj4sIDE+KiwgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8UmVzb2x2
aW5nVHlwZT4+JiB0eXBlcywgY29uc3QgU3RyaW5nJiBuYW1lLCBDb2RlTG9jYXRpb24gbG9jYXRp
b24sIGNvbnN0IEludHJpbnNpY3MmIGludHJpbnNpY3MsIEFTVDo6TmFtZWRUeXBlKiBjYXN0UmV0
dXJuVHlwZSkKK3sKKyAgICBhdXRvIHN0YXJ0ID0gTW9ub3RvbmljVGltZTo6bm93KCk7CisgICAg
YXV0byBkb25lVGltZSA9IFsmXSB7CisgICAgICAgIGF1dG8gZW5kID0gTW9ub3RvbmljVGltZTo6
bm93KCk7CisgICAgICAgIHRpbWUgKz0gKGVuZCAtIHN0YXJ0KS5taWxsaXNlY29uZHMoKTsKKyAg
ICB9OworCisgICAgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8QVNUOjpVbm5hbWVkVHlw
ZT4+IHVubmFtZWRUeXBlczsKKyAgICBmb3IgKGF1dG8gcmVzb2x2aW5nVHlwZSA6IHR5cGVzKSB7
CisgICAgICAgIEFTVDo6VW5uYW1lZFR5cGUqIHR5cGUgPSByZXNvbHZpbmdUeXBlLmdldCgpLnZp
c2l0KFdURjo6bWFrZVZpc2l0b3IoWyZdKFJlZjxBU1Q6OlVubmFtZWRUeXBlPiYgdW5uYW1lZFR5
cGUpIC0+IEFTVDo6VW5uYW1lZFR5cGUqIHsKKyAgICAgICAgICAgIHJldHVybiB1bm5hbWVkVHlw
ZS5wdHIoKTsKKyAgICAgICAgfSwgWyZdKFJlZlB0cjxSZXNvbHZhYmxlVHlwZVJlZmVyZW5jZT4m
IHJlc29sdmFibGVUeXBlUmVmZXJlbmNlKSAtPiBBU1Q6OlVubmFtZWRUeXBlKiB7CisgICAgICAg
ICAgICBpZiAocmVzb2x2YWJsZVR5cGVSZWZlcmVuY2UtPnJlc29sdmFibGVUeXBlKCkubWF5YmVS
ZXNvbHZlZFR5cGUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gJnJlc29sdmFibGVUeXBlUmVm
ZXJlbmNlLT5yZXNvbHZhYmxlVHlwZSgpLnJlc29sdmVkVHlwZSgpOworCisgICAgICAgICAgICBp
ZiAocmVzb2x2YWJsZVR5cGVSZWZlcmVuY2UtPnJlc29sdmFibGVUeXBlKCkuaXNGbG9hdExpdGVy
YWxUeXBlKCkKKyAgICAgICAgICAgICAgICB8fCByZXNvbHZhYmxlVHlwZVJlZmVyZW5jZS0+cmVz
b2x2YWJsZVR5cGUoKS5pc0ludGVnZXJMaXRlcmFsVHlwZSgpCisgICAgICAgICAgICAgICAgfHwg
cmVzb2x2YWJsZVR5cGVSZWZlcmVuY2UtPnJlc29sdmFibGVUeXBlKCkuaXNVbnNpZ25lZEludGVn
ZXJMaXRlcmFsVHlwZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiAmd3JhcHBlZEZsb2F0VHlw
ZSgpOworCisgICAgICAgICAgICByZXR1cm4gY29tbWl0KHJlc29sdmFibGVUeXBlUmVmZXJlbmNl
LT5yZXNvbHZhYmxlVHlwZSgpKS5nZXQoKTsKKyAgICAgICAgfSkpOworICAgICAgICBpZiAoIXR5
cGUpIHsKKyAgICAgICAgICAgIHNldEVycm9yKEVycm9yKCJDb3VsZCBub3QgcmVzb2x2ZSB0aGUg
dHlwZSBvZiBhIGNvbnN0YW50LiIpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAg
ICAgICB9CisgICAgICAgIHVubmFtZWRUeXBlcy5hcHBlbmQobm9ybWFsaXplZEZ1bmN0aW9uS2V5
VHlwZSgqdHlwZSkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgYXV0byBpdGVyID0gbV9mdW5j
dGlvbnMuZmluZChGdW5jdGlvbktleSB7IG5hbWUsIFdURk1vdmUodW5uYW1lZFR5cGVzKSwgY2Fz
dFJldHVyblR5cGUgfSk7CisgICAgICAgIGlmIChpdGVyICE9IG1fZnVuY3Rpb25zLmVuZCgpKSB7
CisgICAgICAgICAgICAvL2RhdGFMb2dMbigiaGF2ZSBvcHRpb25zISIpOworICAgICAgICAgICAg
dG90YWxOdW1PdmVybG9hZHMgKz0gaXRlci0+dmFsdWUuc2l6ZSgpOworICAgICAgICAgICAgaWYg
KEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiogZnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb25PdmVy
bG9hZChpdGVyLT52YWx1ZSwgdHlwZXMsIGNhc3RSZXR1cm5UeXBlKSkgeworICAgICAgICAgICAg
ICAgIGRvbmVUaW1lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF1dG8gbmV3RnVuY3Rpb24gPSBy
ZXNvbHZlQnlJbnN0YW50aWF0aW9uKG5hbWUsIGxvY2F0aW9uLCB0eXBlcywgaW50cmluc2ljcykp
IHsKKyAgICAgICAgcHJvZ3JhbS5hcHBlbmQoV1RGTW92ZSgqbmV3RnVuY3Rpb24pKTsKKyAgICAg
ICAgZG9uZVRpbWUoKTsKKyAgICAgICAgcmV0dXJuICZwcm9ncmFtLm5hdGl2ZUZ1bmN0aW9uRGVj
bGFyYXRpb25zKCkubGFzdCgpOworICAgIH0KKworICAgIGRvbmVUaW1lKCk7CisgICAgcmV0dXJu
IG51bGxwdHI7Cit9CisKIHZvaWQgQ2hlY2tlcjo6dmlzaXQoQVNUOjpFbnVtZXJhdGlvbkRlZmlu
aXRpb24mIGVudW1lcmF0aW9uRGVmaW5pdGlvbikKIHsKICAgICBib29sIGlzU2lnbmVkOwpAQCAt
OTYxLDggKzExMzEsMTAgQEAgdm9pZCBDaGVja2VyOjpmaW5pc2hWaXNpdGluZyhBU1Q6OlByb3Bl
cgogICAgICAgICBpZiAoYWRkaXRpb25hbEFyZ3VtZW50VHlwZSkKICAgICAgICAgICAgIGdldHRl
ckFyZ3VtZW50VHlwZXMuYXBwZW5kKCphZGRpdGlvbmFsQXJndW1lbnRUeXBlKTsKICAgICAgICAg
YXV0byBnZXR0ZXJOYW1lID0gcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLmdldHRlckZ1bmN0aW9u
TmFtZSgpOwotICAgICAgICBhdXRvKiBnZXR0ZXJGdW5jdGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNv
bnRleHQoKS5nZXRGdW5jdGlvbnMoZ2V0dGVyTmFtZSk7Ci0gICAgICAgIGdldHRlckZ1bmN0aW9u
ID0gcmVzb2x2ZUZ1bmN0aW9uKG1fcHJvZ3JhbSwgZ2V0dGVyRnVuY3Rpb25zLCBnZXR0ZXJBcmd1
bWVudFR5cGVzLCBnZXR0ZXJOYW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0
aW9uKCksIG1faW50cmluc2ljcyk7CisgICAgICAgIC8vYXV0byogZ2V0dGVyRnVuY3Rpb25zID0g
bV9wcm9ncmFtLm5hbWVDb250ZXh0KCkuZ2V0RnVuY3Rpb25zKGdldHRlck5hbWUpOworICAgICAg
ICBnZXR0ZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbihtX3Byb2dyYW0sIG51bGxwdHIvKmdl
dHRlckZ1bmN0aW9ucyovLCBnZXR0ZXJBcmd1bWVudFR5cGVzLCBnZXR0ZXJOYW1lLCBwcm9wZXJ0
eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCksIG1faW50cmluc2ljcyk7CisgICAgICAg
IGlmIChoYXNFcnJvcigpKQorICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBpZiAoZ2V0dGVy
RnVuY3Rpb24pCiAgICAgICAgICAgICBnZXR0ZXJSZXR1cm5UeXBlID0gJmdldHRlckZ1bmN0aW9u
LT50eXBlKCk7CiAgICAgfQpAQCAtOTc3LDggKzExNDksMTAgQEAgdm9pZCBDaGVja2VyOjpmaW5p
c2hWaXNpdGluZyhBU1Q6OlByb3BlcgogICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxBcmd1bWVu
dFR5cGUpCiAgICAgICAgICAgICAgICAgYW5kZXJBcmd1bWVudFR5cGVzLmFwcGVuZCgqYWRkaXRp
b25hbEFyZ3VtZW50VHlwZSk7CiAgICAgICAgICAgICBhdXRvIGFuZGVyTmFtZSA9IHByb3BlcnR5
QWNjZXNzRXhwcmVzc2lvbi5hbmRlckZ1bmN0aW9uTmFtZSgpOwotICAgICAgICAgICAgYXV0byog
YW5kZXJGdW5jdGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRleHQoKS5nZXRGdW5jdGlvbnMoYW5k
ZXJOYW1lKTsKLSAgICAgICAgICAgIGFuZGVyRnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb24obV9w
cm9ncmFtLCBhbmRlckZ1bmN0aW9ucywgYW5kZXJBcmd1bWVudFR5cGVzLCBhbmRlck5hbWUsIHBy
b3BlcnR5QWNjZXNzRXhwcmVzc2lvbi5jb2RlTG9jYXRpb24oKSwgbV9pbnRyaW5zaWNzKTsKKyAg
ICAgICAgICAgIC8vYXV0byogYW5kZXJGdW5jdGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRleHQo
KS5nZXRGdW5jdGlvbnMoYW5kZXJOYW1lKTsKKyAgICAgICAgICAgIGFuZGVyRnVuY3Rpb24gPSBy
ZXNvbHZlRnVuY3Rpb24obV9wcm9ncmFtLCBudWxscHRyLyphbmRlckZ1bmN0aW9ucyovLCBhbmRl
ckFyZ3VtZW50VHlwZXMsIGFuZGVyTmFtZSwgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLmNvZGVM
b2NhdGlvbigpLCBtX2ludHJpbnNpY3MpOworICAgICAgICAgICAgaWYgKGhhc0Vycm9yKCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgaWYgKGFuZGVyRnVuY3Rpb24pCiAg
ICAgICAgICAgICAgICAgYW5kZXJSZXR1cm5UeXBlID0gJmRvd25jYXN0PEFTVDo6UG9pbnRlclR5
cGU+KGFuZGVyRnVuY3Rpb24tPnR5cGUoKSkuZWxlbWVudFR5cGUoKTsgLy8gRklYTUU6IGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTgxNjQgRW5mb3JjZSB0aGUgcmV0
dXJuIG9mIGFuZGVycyB3aWxsIGFsd2F5cyBiZSBhIHBvaW50ZXIKICAgICAgICAgfQpAQCAtOTky
LDggKzExNjYsMTAgQEAgdm9pZCBDaGVja2VyOjpmaW5pc2hWaXNpdGluZyhBU1Q6OlByb3Blcgog
ICAgICAgICBpZiAoYWRkaXRpb25hbEFyZ3VtZW50VHlwZSkKICAgICAgICAgICAgIHRocmVhZEFu
ZGVyQXJndW1lbnRUeXBlcy5hcHBlbmQoKmFkZGl0aW9uYWxBcmd1bWVudFR5cGUpOwogICAgICAg
ICBhdXRvIGFuZGVyTmFtZSA9IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbi5hbmRlckZ1bmN0aW9u
TmFtZSgpOwotICAgICAgICBhdXRvKiBhbmRlckZ1bmN0aW9ucyA9IG1fcHJvZ3JhbS5uYW1lQ29u
dGV4dCgpLmdldEZ1bmN0aW9ucyhhbmRlck5hbWUpOwotICAgICAgICB0aHJlYWRBbmRlckZ1bmN0
aW9uID0gcmVzb2x2ZUZ1bmN0aW9uKG1fcHJvZ3JhbSwgYW5kZXJGdW5jdGlvbnMsIHRocmVhZEFu
ZGVyQXJndW1lbnRUeXBlcywgYW5kZXJOYW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29k
ZUxvY2F0aW9uKCksIG1faW50cmluc2ljcyk7CisgICAgICAgIC8vYXV0byogYW5kZXJGdW5jdGlv
bnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRleHQoKS5nZXRGdW5jdGlvbnMoYW5kZXJOYW1lKTsKKyAg
ICAgICAgdGhyZWFkQW5kZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbihtX3Byb2dyYW0sIG51
bGxwdHIvKmFuZGVyRnVuY3Rpb25zKi8sIHRocmVhZEFuZGVyQXJndW1lbnRUeXBlcywgYW5kZXJO
YW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCksIG1faW50cmluc2lj
cyk7CisgICAgICAgIGlmIChoYXNFcnJvcigpKQorICAgICAgICAgICAgcmV0dXJuOwogICAgICAg
ICBpZiAodGhyZWFkQW5kZXJGdW5jdGlvbikKICAgICAgICAgICAgIHRocmVhZEFuZGVyUmV0dXJu
VHlwZSA9ICZkb3duY2FzdDxBU1Q6OlBvaW50ZXJUeXBlPih0aHJlYWRBbmRlckZ1bmN0aW9uLT50
eXBlKCkpLmVsZW1lbnRUeXBlKCk7IC8vIEZJWE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTk4MTY0IEVuZm9yY2UgdGhlIHJldHVybiBvZiBhbmRlcnMgd2lsbCBh
bHdheXMgYmUgYSBwb2ludGVyCiAgICAgfQpAQCAtMTAzOSw4ICsxMjE1LDEwIEBAIHZvaWQgQ2hl
Y2tlcjo6ZmluaXNoVmlzaXRpbmcoQVNUOjpQcm9wZXIKICAgICAgICAgICAgIHNldHRlckFyZ3Vt
ZW50VHlwZXMuYXBwZW5kKCphZGRpdGlvbmFsQXJndW1lbnRUeXBlKTsKICAgICAgICAgc2V0dGVy
QXJndW1lbnRUeXBlcy5hcHBlbmQoZmllbGRSZXNvbHZpbmdUeXBlKTsKICAgICAgICAgYXV0byBz
ZXR0ZXJOYW1lID0gcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLnNldHRlckZ1bmN0aW9uTmFtZSgp
OwotICAgICAgICBhdXRvKiBzZXR0ZXJGdW5jdGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRleHQo
KS5nZXRGdW5jdGlvbnMoc2V0dGVyTmFtZSk7Ci0gICAgICAgIHNldHRlckZ1bmN0aW9uID0gcmVz
b2x2ZUZ1bmN0aW9uKG1fcHJvZ3JhbSwgc2V0dGVyRnVuY3Rpb25zLCBzZXR0ZXJBcmd1bWVudFR5
cGVzLCBzZXR0ZXJOYW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCks
IG1faW50cmluc2ljcyk7CisgICAgICAgIC8vYXV0byogc2V0dGVyRnVuY3Rpb25zID0gbV9wcm9n
cmFtLm5hbWVDb250ZXh0KCkuZ2V0RnVuY3Rpb25zKHNldHRlck5hbWUpOworICAgICAgICBzZXR0
ZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbihtX3Byb2dyYW0sIG51bGxwdHIvKnNldHRlckZ1
bmN0aW9ucyovLCBzZXR0ZXJBcmd1bWVudFR5cGVzLCBzZXR0ZXJOYW1lLCBwcm9wZXJ0eUFjY2Vz
c0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCksIG1faW50cmluc2ljcyk7CisgICAgICAgIGlmICho
YXNFcnJvcigpKQorICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBpZiAoc2V0dGVyRnVuY3Rp
b24pCiAgICAgICAgICAgICBzZXR0ZXJSZXR1cm5UeXBlID0gJnNldHRlckZ1bmN0aW9uLT50eXBl
KCk7CiAgICAgfQpAQCAtMTQwOSw2ICsxNTg3LDcgQEAgdm9pZCBDaGVja2VyOjp2aXNpdChBU1Q6
OlRlcm5hcnlFeHByZXNzaQogCiB2b2lkIENoZWNrZXI6OnZpc2l0KEFTVDo6Q2FsbEV4cHJlc3Np
b24mIGNhbGxFeHByZXNzaW9uKQogeworICAgIC8vZGF0YUxvZ0xuKCJsb29raW5nIGF0OiAiLCBF
eHByZXNzaW9uRHVtcGVyKGNhbGxFeHByZXNzaW9uKSk7CiAgICAgVmVjdG9yPHN0ZDo6cmVmZXJl
bmNlX3dyYXBwZXI8UmVzb2x2aW5nVHlwZT4+IHR5cGVzOwogICAgIHR5cGVzLnJlc2VydmVJbml0
aWFsQ2FwYWNpdHkoY2FsbEV4cHJlc3Npb24uYXJndW1lbnRzKCkuc2l6ZSgpKTsKICAgICBmb3Ig
KGF1dG8mIGFyZ3VtZW50IDogY2FsbEV4cHJlc3Npb24uYXJndW1lbnRzKCkpIHsKQEAgLTE0MjAs
MjMgKzE1OTksMzcgQEAgdm9pZCBDaGVja2VyOjp2aXNpdChBU1Q6OkNhbGxFeHByZXNzaW9uJgog
ICAgIC8vIERvbid0IHJlY3Vyc2Ugb24gdGhlIGNhc3RSZXR1cm5UeXBlLCBiZWNhdXNlIGl0J3Mg
Z3VhcmFudGVlZCB0byBiZSBhIE5hbWVkVHlwZSwgd2hpY2ggd2lsbCBnZXQgdmlzaXRlZCBsYXRl
ci4KICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHJlY3Vyc2UgdG8gdGhlIHNhbWUgbm9kZSB0d2lj
ZS4KIAotICAgIE5hbWVDb250ZXh0JiBuYW1lQ29udGV4dCA9IG1fcHJvZ3JhbS5uYW1lQ29udGV4
dCgpOwotICAgIGF1dG8qIGZ1bmN0aW9ucyA9IG5hbWVDb250ZXh0LmdldEZ1bmN0aW9ucyhjYWxs
RXhwcmVzc2lvbi5uYW1lKCkpOwotICAgIGlmICghZnVuY3Rpb25zKSB7Ci0gICAgICAgIGlmIChh
dXRvKiB0eXBlcyA9IG5hbWVDb250ZXh0LmdldFR5cGVzKGNhbGxFeHByZXNzaW9uLm5hbWUoKSkp
IHsKLSAgICAgICAgICAgIGlmICh0eXBlcy0+c2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoKGZ1bmN0aW9ucyA9IG5hbWVDb250ZXh0LmdldEZ1bmN0aW9ucygib3BlcmF0b3IgY2Fz
dCJfc3RyKSkpCi0gICAgICAgICAgICAgICAgICAgIGNhbGxFeHByZXNzaW9uLnNldENhc3REYXRh
KCgqdHlwZXMpWzBdLmdldCgpKTsKKworICAgIC8vaWYgKCFmdW5jdGlvbnMpIHsKKyAgICAvLyAg
ICBzZXRFcnJvcihFcnJvcigiQ291bGQgbm90IGZpbmQgYW55IGZ1bmN0aW9ucyB3aXRoIGFwcHJv
cHJpYXRlIG5hbWUuIiwgY2FsbEV4cHJlc3Npb24uY29kZUxvY2F0aW9uKCkpKTsKKyAgICAvLyAg
ICByZXR1cm47CisgICAgLy99CisKKyAgICBhdXRvKiBmdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlv
bihtX3Byb2dyYW0sIG51bGxwdHIsIHR5cGVzLCBjYWxsRXhwcmVzc2lvbi5uYW1lKCksIGNhbGxF
eHByZXNzaW9uLmNvZGVMb2NhdGlvbigpLCBtX2ludHJpbnNpY3MpOworICAgIGlmIChoYXNFcnJv
cigpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWZ1bmN0aW9uKSB7CisgICAgICAgIE5h
bWVDb250ZXh0JiBuYW1lQ29udGV4dCA9IG1fcHJvZ3JhbS5uYW1lQ29udGV4dCgpOworICAgICAg
ICBpZiAoYXV0byogY2FzdFR5cGVzID0gbmFtZUNvbnRleHQuZ2V0VHlwZXMoY2FsbEV4cHJlc3Np
b24ubmFtZSgpKSkgeworICAgICAgICAgICAgaWYgKGNhc3RUeXBlcy0+c2l6ZSgpID09IDEpIHsK
KyAgICAgICAgICAgICAgICBBU1Q6Ok5hbWVkVHlwZSYgY2FzdFR5cGUgPSAoKmNhc3RUeXBlcylb
MF0uZ2V0KCk7CisgICAgICAgICAgICAgICAgZnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb24obV9w
cm9ncmFtLCBudWxscHRyLCB0eXBlcywgIm9wZXJhdG9yIGNhc3QiX3N0ciwgY2FsbEV4cHJlc3Np
b24uY29kZUxvY2F0aW9uKCksIG1faW50cmluc2ljcywgJmNhc3RUeXBlKTsKKyAgICAgICAgICAg
ICAgICBpZiAoaGFzRXJyb3IoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICAgICAgICAgIGlmIChmdW5jdGlvbikKKyAgICAgICAgICAgICAgICAgICAgY2FsbEV4cHJlc3Np
b24uc2V0Q2FzdERhdGEoY2FzdFR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAg
fQotICAgIGlmICghZnVuY3Rpb25zKSB7Ci0gICAgICAgIHNldEVycm9yKEVycm9yKCJDb3VsZCBu
b3QgZmluZCBhbnkgZnVuY3Rpb25zIHdpdGggYXBwcm9wcmlhdGUgbmFtZS4iLCBjYWxsRXhwcmVz
c2lvbi5jb2RlTG9jYXRpb24oKSkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQogCi0gICAgYXV0
byogZnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb24obV9wcm9ncmFtLCBmdW5jdGlvbnMsIHR5cGVz
LCBjYWxsRXhwcmVzc2lvbi5uYW1lKCksIGNhbGxFeHByZXNzaW9uLmNvZGVMb2NhdGlvbigpLCBt
X2ludHJpbnNpY3MsIGNhbGxFeHByZXNzaW9uLmNhc3RSZXR1cm5UeXBlKCkpOwogICAgIGlmICgh
ZnVuY3Rpb24pIHsKKyAgICAgICAgZGF0YUxvZ0xuKCk7CisgICAgICAgIGRhdGFMb2dMbigiRmFp
bGVkISIpOworICAgICAgICBkYXRhTG9nTG4oRnVuY3Rpb25EZWZpbml0aW9uRHVtcGVyKCptX2N1
cnJlbnRGdW5jdGlvbikpOworICAgICAgICBkYXRhTG9nTG4oKTsKKyAgICAgICAgZGF0YUxvZ0xu
KEV4cHJlc3Npb25EdW1wZXIoY2FsbEV4cHJlc3Npb24pKTsKKwogICAgICAgICAvLyBGSVhNRTog
QWRkIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3Igd2h5IHdlIGNhbid0IHJlc29sdmUgdG8gb25l
IG9mIHRoZSBvdmVycmlkZXMuCiAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0yMDAxMzMKICAgICAgICAgc2V0RXJyb3IoRXJyb3IoIkNhbm5vdCByZXNv
bHZlIGZ1bmN0aW9uIGNhbGwgdG8gYSBjb25jcmV0ZSBjYWxsZWUuIE1ha2Ugc3VyZSB5b3UgYXJl
IHVzaW5nIGNvbXBhdGlibGUgdHlwZXMuIiwgY2FsbEV4cHJlc3Npb24uY29kZUxvY2F0aW9uKCkp
KTsKQEAgLTE0NjEsNyArMTY1NCwxMCBAQCBFeHBlY3RlZDx2b2lkLCBFcnJvcj4gY2hlY2soUHJv
Z3JhbSYgcHJvCiAgICAgY2hlY2tlci5jaGVja0Vycm9yQW5kVmlzaXQocHJvZ3JhbSk7CiAgICAg
aWYgKGNoZWNrZXIuaGFzRXJyb3IoKSkKICAgICAgICAgcmV0dXJuIGNoZWNrZXIucmVzdWx0KCk7
Ci0gICAgcmV0dXJuIGNoZWNrZXIuYXNzaWduVHlwZXMoKTsKKyAgICBhdXRvIHJlc3VsdCA9IGNo
ZWNrZXIuYXNzaWduVHlwZXMoKTsKKyAgICBkYXRhTG9nTG4oInJlc29sdmUgZnVuY3Rpb246ICIs
IHRpbWUsICIgbXMiKTsKKyAgICBkYXRhTG9nTG4oIlRvdGFsIG92ZXJsb2FkczogIiwgdG90YWxO
dW1PdmVybG9hZHMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdI
TFNMCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>375671</attachid>
            <date>2019-08-06 17:26:37 -0700</date>
            <delta_ts>2019-08-06 19:26:45 -0700</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>17330</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0ODMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDUyIEBACisyMDE5LTA4LTA2ICBTYWFtIEJh
cmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAgIFtXSExTTF0gTWFrZSByZXNvbHZl
RnVuY3Rpb24gaW4gQ2hlY2tlciBmYXN0ZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTIwMDI4NworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgY29tcHV0ZV9ib2lkcyBmYXN0ZXIg
YnkgbWFraW5nIGZ1bmN0aW9uIG92ZXJsb2FkCisgICAgICAgIHJlc29sdXRpb24gZmFzdGVyIGlu
c2lkZSB0aGUgQ2hlY2tlci4gSXQncyBhIH42bXMgc3BlZWR1cCBpbiB0aGUKKyAgICAgICAgY2hl
Y2tlci4gVGhlIG1haW4gaWRlYSBpcyB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG92ZXJsb2FkcyB3
ZSBuZWVkCisgICAgICAgIHRvIGxvb2sgZm9yIGJ5IHVzaW5nIGEgaGFzaCB0YWJsZSB0aGF0IGRl
c2NyaWJlcyBhIGZ1bmN0aW9uJ3MgdHlwZQorICAgICAgICBpbnN0ZWFkIG9mIGp1c3QgdXNpbmcg
YSBoYXNoIHRhYmxlIGtleWVkIGJ5IGEgZnVuY3Rpb24ncyBuYW1lLgorICAgICAgICAKKyAgICAg
ICAgVGhlIGludGVyZXN0aW5nIGltcGxlbWVudGF0aW9uIGRldGFpbCBoZXJlIGlzIHdlIG11c3Qg
Y29uc3RydWN0IGVudHJpZXMKKyAgICAgICAgaW4gdGhlIGhhc2ggdGFibGUgc3VjaCB0aGF0IHRo
ZXkgc3RpbGwgYWxsb3cgY29uc3RhbnRzIHRvIHJlc29sdmVkIHRvCisgICAgICAgIHZhcmlvdXMg
dHlwZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUga2V5IGluIHRoZSBoYXNoIHRhYmxlIG11c3Qgbm9y
bWFsaXplCisgICAgICAgIHRoZSB2ZWN0b3Igb2YgdHlwZXMgaXQgdXNlcyB0byBleHByZXNzIGEg
ZnVuY3Rpb24ncyBpZGVudGl0eS4gVGhlIG5vcm1hbGl6YXRpb24KKyAgICAgICAgcnVsZXMgYXJl
OgorICAgICAgICAtIGludCA9PiBmbG9hdAorICAgICAgICAtIHVpbnQgPT4gZmxvYXQKKyAgICAg
ICAgLSBUKiA9PiBmbG9hdCoKKyAgICAgICAgLSBUW10gPT4gZmxvYXQqCisgICAgICAgIAorICAg
ICAgICBUaGUgZmlyc3QgdHdvIHJ1bGVzIGFyZSBiZWNhdXNlIHVpbnQgYW5kIGludCBjb25zdGFu
dHMgY2FuIGJlIG1hdGNoZWQgYWdhaW5zdAorICAgICAgICBmbG9hdHMuIFRoZSBsYXR0ZXIgdHdv
IHJ1bGVzIGFyZSBiZWNhdXNlIHRoZSBudWxsIGxpdGVyYWwgY2FuIGJlIG1hdGNoZWQKKyAgICAg
ICAgYWdhaW5zdCBhbnkgcG9pbnRlciBvciBhbnkgYXJyYXkgcmVmZXJlbmNlICh3ZSBwaWNrIGZs
b2F0KiBhcmJpdHJhcmlseSkuIEV2ZW4KKyAgICAgICAgdGhvdWdoIGl0IHNlZW1zIGxpa2UgdGhl
c2Ugbm9ybWFsaXphdGlvbiBydWxlcyB3b3VsZCBkcmFzdGljYWxseSBicm9hZGVuIHRoZQorICAg
ICAgICBlZmZpY2FjeSBvZiB0aGUgaGFzaCB0YWJsZSwgd2Ugc3RpbGwgc2VlIGEgMTAweCByZWR1
Y3Rpb24gaW4gdGhlIG51bWJlciBvZgorICAgICAgICBvdmVybG9hZHMgd2UgbXVzdCByZXNvbHZl
IGluc2lkZSBjb21wdXRlX2JvaWRzLiBXZSBnbyBmcm9tIGhhdmluZyB0byByZXNvbHZlCisgICAg
ICAgIDQwMCwwMDAgb3ZlcmxvYWRzIHRvIGp1c3QgcmVzb2x2aW5nIDQsMDAwLgorCisgICAgICAg
ICogTW9kdWxlcy93ZWJncHUvV0hMU0wvV0hMU0xDaGVja2VyLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OldITFNMOjpGdW5jdGlvbktleTo6RnVuY3Rpb25LZXkpOgorICAgICAgICAoV2ViQ29yZTo6
V0hMU0w6OkZ1bmN0aW9uS2V5Ojppc0VtcHR5VmFsdWUgY29uc3QpOgorICAgICAgICAoV2ViQ29y
ZTo6V0hMU0w6OkZ1bmN0aW9uS2V5Ojppc0hhc2hUYWJsZURlbGV0ZWRWYWx1ZSBjb25zdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpXSExTTDo6RnVuY3Rpb25LZXk6Omhhc2ggY29uc3QpOgorICAgICAg
ICAoV2ViQ29yZTo6V0hMU0w6OkZ1bmN0aW9uS2V5OjpvcGVyYXRvcj09IGNvbnN0KToKKyAgICAg
ICAgKFdlYkNvcmU6OldITFNMOjpGdW5jdGlvbktleTo6SGFzaDo6aGFzaCk6CisgICAgICAgIChX
ZWJDb3JlOjpXSExTTDo6RnVuY3Rpb25LZXk6Okhhc2g6OmVxdWFsKToKKyAgICAgICAgKFdlYkNv
cmU6OldITFNMOjpGdW5jdGlvbktleTo6VHJhaXRzOjppc0VtcHR5VmFsdWUpOgorICAgICAgICAo
V2ViQ29yZTo6V0hMU0w6OkNoZWNrZXI6OkNoZWNrZXIpOgorICAgICAgICAoV2ViQ29yZTo6V0hM
U0w6OkNoZWNrZXI6OndyYXBwZWRGbG9hdFR5cGUpOgorICAgICAgICAoV2ViQ29yZTo6V0hMU0w6
OkNoZWNrZXI6OmdlbmVyaWNQb2ludGVyVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpXSExTTDo6
Q2hlY2tlcjo6bm9ybWFsaXplZFR5cGVGb3JGdW5jdGlvbktleSk6CisgICAgICAgIChXZWJDb3Jl
OjpXSExTTDo6Q2hlY2tlcjo6cmVzb2x2ZUZ1bmN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OldI
TFNMOjpDaGVja2VyOjpmaW5pc2hWaXNpdGluZyk6CisgICAgICAgIChXZWJDb3JlOjpXSExTTDo6
Q2hlY2tlcjo6dmlzaXQpOgorICAgICAgICAoV2ViQ29yZTo6V0hMU0w6OnJlc29sdmVGdW5jdGlv
bik6IERlbGV0ZWQuCisKIDIwMTktMDgtMDYgIENvbW1pdCBRdWV1ZSAgPGNvbW1pdC1xdWV1ZUB3
ZWJraXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHIyNDgyODkuCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTENoZWNrZXIuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNM
Q2hlY2tlci5jcHAJKHJldmlzaW9uIDI0ODMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMv
d2ViZ3B1L1dITFNML1dITFNMQ2hlY2tlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExOCw2ICsx
MTgsODcgQEAgcHVibGljOgogICAgIH0KIH07CiAKK2NsYXNzIEZ1bmN0aW9uS2V5IHsKK3B1Ymxp
YzoKKyAgICBGdW5jdGlvbktleSgpID0gZGVmYXVsdDsKKyAgICBGdW5jdGlvbktleShXVEY6Okhh
c2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCisgICAgeworICAgICAgICBtX2Nhc3RSZXR1cm5UeXBl
ID0gYml0d2lzZV9jYXN0PEFTVDo6TmFtZWRUeXBlKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90Pigx
KSk7CisgICAgfQorCisgICAgRnVuY3Rpb25LZXkoU3RyaW5nIG5hbWUsIFZlY3RvcjxzdGQ6OnJl
ZmVyZW5jZV93cmFwcGVyPEFTVDo6VW5uYW1lZFR5cGU+PiB0eXBlcywgQVNUOjpOYW1lZFR5cGUq
IGNhc3RSZXR1cm5UeXBlID0gbnVsbHB0cikKKyAgICAgICAgOiBtX25hbWUoV1RGTW92ZShuYW1l
KSkKKyAgICAgICAgLCBtX3R5cGVzKFdURk1vdmUodHlwZXMpKQorICAgICAgICAsIG1fY2FzdFJl
dHVyblR5cGUoY2FzdFJldHVyblR5cGUpCisgICAgeyB9CisKKyAgICBib29sIGlzRW1wdHlWYWx1
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZS5pc051bGwoKTsgfQorICAgIGJvb2wgaXNIYXNoVGFi
bGVEZWxldGVkVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2Nhc3RSZXR1cm5UeXBlID09IGJpdHdp
c2VfY2FzdDxBU1Q6Ok5hbWVkVHlwZSo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oMSkpOyB9CisK
KyAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3QKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGhhc2gg
PSBJbnRIYXNoPHNpemVfdD46Omhhc2gobV90eXBlcy5zaXplKCkpOworICAgICAgICBoYXNoIF49
IG1fbmFtZS5oYXNoKCk7CisgICAgICAgIGZvciAoYXV0byYgdHlwZSA6IG1fdHlwZXMpCisgICAg
ICAgICAgICBoYXNoIF49IHR5cGUuZ2V0KCkuaGFzaCgpOworCisgICAgICAgIGlmIChtX2Nhc3RS
ZXR1cm5UeXBlKQorICAgICAgICAgICAgaGFzaCBePSBXVEY6OlB0ckhhc2g8QVNUOjpUeXBlKj46
Omhhc2goJm1fY2FzdFJldHVyblR5cGUtPnVuaWZ5Tm9kZSgpKTsKKworICAgICAgICByZXR1cm4g
aGFzaDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRnVuY3Rpb25LZXkmIG90
aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1fdHlwZXMuc2l6ZSgpICE9IG90aGVyLm1f
dHlwZXMuc2l6ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICht
X25hbWUgIT0gb3RoZXIubV9uYW1lKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV90eXBlcy5zaXplKCk7ICsraSkgeworICAgICAg
ICAgICAgaWYgKCFtYXRjaGVzKG1fdHlwZXNbaV0uZ2V0KCksIG90aGVyLm1fdHlwZXNbaV0uZ2V0
KCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAg
IGlmICghIW1fY2FzdFJldHVyblR5cGUgIT0gISFvdGhlci5tX2Nhc3RSZXR1cm5UeXBlKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICghbV9jYXN0UmV0dXJuVHlwZSkK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmICgmbV9jYXN0UmV0dXJuVHlw
ZS0+dW5pZnlOb2RlKCkgPT0gJm90aGVyLm1fY2FzdFJldHVyblR5cGUtPnVuaWZ5Tm9kZSgpKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KworICAgIHN0cnVjdCBIYXNoIHsKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3Qg
RnVuY3Rpb25LZXkmIGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGtleS5oYXNo
KCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBGdW5jdGlv
bktleSYgYSwgY29uc3QgRnVuY3Rpb25LZXkmIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBhID09IGI7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBzYWZl
VG9Db21wYXJlVG9FbXB0eU9yRGVsZXRlZCA9IGZhbHNlOworICAgICAgICBzdGF0aWMgY29uc3Qg
Ym9vbCBlbXB0eVZhbHVlSXNaZXJvID0gZmFsc2U7CisgICAgfTsKKworICAgIHN0cnVjdCBUcmFp
dHMgOiBwdWJsaWMgV1RGOjpTaW1wbGVDbGFzc0hhc2hUcmFpdHM8RnVuY3Rpb25LZXk+IHsKKyAg
ICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzSXNFbXB0eVZhbHVlRnVuY3Rpb24gPSB0cnVlOwor
ICAgICAgICBzdGF0aWMgYm9vbCBpc0VtcHR5VmFsdWUoY29uc3QgRnVuY3Rpb25LZXkmIGtleSkg
eyByZXR1cm4ga2V5LmlzRW1wdHlWYWx1ZSgpOyB9CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBT
dHJpbmcgbV9uYW1lOworICAgIFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6VW5u
YW1lZFR5cGU+PiBtX3R5cGVzOworICAgIEFTVDo6TmFtZWRUeXBlKiBtX2Nhc3RSZXR1cm5UeXBl
OworfTsKKwogc3RhdGljIEFTVDo6TmF0aXZlRnVuY3Rpb25EZWNsYXJhdGlvbiByZXNvbHZlV2l0
aE9wZXJhdG9yQW5kZXJJbmRleGVyKENvZGVMb2NhdGlvbiBsb2NhdGlvbiwgQVNUOjpBcnJheVJl
ZmVyZW5jZVR5cGUmIGZpcnN0QXJndW1lbnQsIGNvbnN0IEludHJpbnNpY3MmIGludHJpbnNpY3Mp
CiB7CiAgICAgY29uc3QgYm9vbCBpc09wZXJhdG9yID0gdHJ1ZTsKQEAgLTIxNywyMSArMjk4LDYg
QEAgc3RhdGljIE9wdGlvbmFsPEFTVDo6TmF0aXZlRnVuY3Rpb25EZWNsYQogICAgIHJldHVybiBX
VEY6Om51bGxvcHQ7CiB9CiAKLXN0YXRpYyBBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24qIHJlc29s
dmVGdW5jdGlvbihQcm9ncmFtJiBwcm9ncmFtLCBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBl
cjxBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24+LCAxPiogcG9zc2libGVPdmVybG9hZHMsIFZlY3Rv
cjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPFJlc29sdmluZ1R5cGU+PiYgdHlwZXMsIGNvbnN0IFN0
cmluZyYgbmFtZSwgQ29kZUxvY2F0aW9uIGxvY2F0aW9uLCBjb25zdCBJbnRyaW5zaWNzJiBpbnRy
aW5zaWNzLCBBU1Q6Ok5hbWVkVHlwZSogY2FzdFJldHVyblR5cGUgPSBudWxscHRyKQotewotICAg
IGlmIChwb3NzaWJsZU92ZXJsb2FkcykgewotICAgICAgICBpZiAoQVNUOjpGdW5jdGlvbkRlY2xh
cmF0aW9uKiBmdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKCpwb3NzaWJsZU92ZXJs
b2FkcywgdHlwZXMsIGNhc3RSZXR1cm5UeXBlKSkKLSAgICAgICAgICAgIHJldHVybiBmdW5jdGlv
bjsKLSAgICB9Ci0KLSAgICBpZiAoYXV0byBuZXdGdW5jdGlvbiA9IHJlc29sdmVCeUluc3RhbnRp
YXRpb24obmFtZSwgbG9jYXRpb24sIHR5cGVzLCBpbnRyaW5zaWNzKSkgewotICAgICAgICBwcm9n
cmFtLmFwcGVuZChXVEZNb3ZlKCpuZXdGdW5jdGlvbikpOwotICAgICAgICByZXR1cm4gJnByb2dy
YW0ubmF0aXZlRnVuY3Rpb25EZWNsYXJhdGlvbnMoKS5sYXN0KCk7Ci0gICAgfQotCi0gICAgcmV0
dXJuIG51bGxwdHI7Ci19Ci0KIHN0YXRpYyBib29sIGNoZWNrU2VtYW50aWNzKFZlY3RvcjxFbnRy
eVBvaW50SXRlbT4mIGlucHV0SXRlbXMsIFZlY3RvcjxFbnRyeVBvaW50SXRlbT4mIG91dHB1dEl0
ZW1zLCBjb25zdCBPcHRpb25hbDxBU1Q6OkVudHJ5UG9pbnRUeXBlPiYgZW50cnlQb2ludFR5cGUs
IGNvbnN0IEludHJpbnNpY3MmIGludHJpbnNpY3MpCiB7CiAgICAgewpAQCAtNDU0LDYgKzUyMCwy
NSBAQCBwdWJsaWM6CiAgICAgICAgIDogbV9pbnRyaW5zaWNzKGludHJpbnNpY3MpCiAgICAgICAg
ICwgbV9wcm9ncmFtKHByb2dyYW0pCiAgICAgeworICAgICAgICBhdXRvIGFkZEZ1bmN0aW9uID0g
WyZdIChBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24mIGZ1bmN0aW9uKSB7CisgICAgICAgICAgICBB
U1Q6Ok5hbWVkVHlwZSogY2FzdFJldHVyblR5cGUgPSBudWxscHRyOworICAgICAgICAgICAgaWYg
KGZ1bmN0aW9uLmlzQ2FzdCgpICYmIGlzPEFTVDo6TmFtZWRUeXBlPihmdW5jdGlvbi50eXBlKCku
dW5pZnlOb2RlKCkpKQorICAgICAgICAgICAgICAgIGNhc3RSZXR1cm5UeXBlID0gJmRvd25jYXN0
PEFTVDo6TmFtZWRUeXBlPihmdW5jdGlvbi50eXBlKCkudW5pZnlOb2RlKCkpIDsKKworICAgICAg
ICAgICAgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8QVNUOjpVbm5hbWVkVHlwZT4+IHR5
cGVzOworICAgICAgICAgICAgdHlwZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShmdW5jdGlvbi5w
YXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKworICAgICAgICAgICAgZm9yIChhdXRvJiBwYXJhbSA6IGZ1
bmN0aW9uLnBhcmFtZXRlcnMoKSkKKyAgICAgICAgICAgICAgICB0eXBlcy51bmNoZWNrZWRBcHBl
bmQobm9ybWFsaXplZFR5cGVGb3JGdW5jdGlvbktleSgqcGFyYW0tPnR5cGUoKSkpOworCisgICAg
ICAgICAgICBhdXRvIGFkZFJlc3VsdCA9IG1fZnVuY3Rpb25zLmFkZChGdW5jdGlvbktleSB7IGZ1
bmN0aW9uLm5hbWUoKSwgV1RGTW92ZSh0eXBlcyksIGNhc3RSZXR1cm5UeXBlIH0sIFZlY3Rvcjxz
dGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbj4sIDE+KCkpOwor
ICAgICAgICAgICAgYWRkUmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS5hcHBlbmQoZnVuY3Rpb24pOwor
ICAgICAgICB9OworCisgICAgICAgIGZvciAoYXV0byYgZnVuY3Rpb24gOiBtX3Byb2dyYW0uZnVu
Y3Rpb25EZWZpbml0aW9ucygpKQorICAgICAgICAgICAgYWRkRnVuY3Rpb24oZnVuY3Rpb24uZ2V0
KCkpOworICAgICAgICBmb3IgKGF1dG8mIGZ1bmN0aW9uIDogbV9wcm9ncmFtLm5hdGl2ZUZ1bmN0
aW9uRGVjbGFyYXRpb25zKCkpCisgICAgICAgICAgICBhZGRGdW5jdGlvbihmdW5jdGlvbi5nZXQo
KSk7CiAgICAgfQogCiAgICAgdmlydHVhbCB+Q2hlY2tlcigpID0gZGVmYXVsdDsKQEAgLTUxMSw2
ICs1OTYsMzYgQEAgcHJpdmF0ZToKIAogICAgIHZvaWQgZmluaXNoVmlzaXRpbmcoQVNUOjpQcm9w
ZXJ0eUFjY2Vzc0V4cHJlc3Npb24mLCBSZXNvbHZpbmdUeXBlKiBhZGRpdGlvbmFsQXJndW1lbnRU
eXBlID0gbnVsbHB0cik7CiAKKyAgICBBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24qIHJlc29sdmVG
dW5jdGlvbihWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZXNvbHZpbmdUeXBlPj4mIHR5
cGVzLCBjb25zdCBTdHJpbmcmIG5hbWUsIENvZGVMb2NhdGlvbiBsb2NhdGlvbiwgQVNUOjpOYW1l
ZFR5cGUqIGNhc3RSZXR1cm5UeXBlID0gbnVsbHB0cik7CisKKyAgICBBU1Q6OlVubmFtZWRUeXBl
JiB3cmFwcGVkRmxvYXRUeXBlKCkKKyAgICB7CisgICAgICAgIGlmICghbV93cmFwcGVkRmxvYXRU
eXBlKQorICAgICAgICAgICAgbV93cmFwcGVkRmxvYXRUeXBlID0gQVNUOjpUeXBlUmVmZXJlbmNl
Ojp3cmFwKHsgfSwgbV9pbnRyaW5zaWNzLmZsb2F0VHlwZSgpKTsKKyAgICAgICAgcmV0dXJuICpt
X3dyYXBwZWRGbG9hdFR5cGU7CisgICAgfQorCisgICAgQVNUOjpVbm5hbWVkVHlwZSYgZ2VuZXJp
Y1BvaW50ZXJUeXBlKCkKKyAgICB7CisgICAgICAgIGlmICghbV9nZW5lcmljUG9pbnRlclR5cGUp
CisgICAgICAgICAgICBtX2dlbmVyaWNQb2ludGVyVHlwZSA9IEFTVDo6UG9pbnRlclR5cGU6OmNy
ZWF0ZSh7IH0sIEFTVDo6QWRkcmVzc1NwYWNlOjpUaHJlYWQsIEFTVDo6VHlwZVJlZmVyZW5jZTo6
d3JhcCh7IH0sIG1faW50cmluc2ljcy5mbG9hdFR5cGUoKSkpOworICAgICAgICByZXR1cm4gKm1f
Z2VuZXJpY1BvaW50ZXJUeXBlOworICAgIH0KKworICAgIEFTVDo6VW5uYW1lZFR5cGUmIG5vcm1h
bGl6ZWRUeXBlRm9yRnVuY3Rpb25LZXkoQVNUOjpVbm5hbWVkVHlwZSYgdHlwZSkKKyAgICB7Cisg
ICAgICAgIGF1dG8qIHVuaWZ5Tm9kZSA9ICZ0eXBlLnVuaWZ5Tm9kZSgpOworICAgICAgICBpZiAo
dW5pZnlOb2RlID09ICZtX2ludHJpbnNpY3MudWludFR5cGUoKSB8fCB1bmlmeU5vZGUgPT0gJm1f
aW50cmluc2ljcy5pbnRUeXBlKCkpCisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZEZsb2F0VHlw
ZSgpOworCisgICAgICAgIGlmIChpczxBU1Q6OlJlZmVyZW5jZVR5cGU+KHR5cGUpKQorICAgICAg
ICAgICAgcmV0dXJuIGdlbmVyaWNQb2ludGVyVHlwZSgpOworCisgICAgICAgIHJldHVybiB0eXBl
OworICAgIH0KKworICAgIFJlZlB0cjxBU1Q6OlR5cGVSZWZlcmVuY2U+IG1fd3JhcHBlZEZsb2F0
VHlwZTsKKyAgICBSZWZQdHI8QVNUOjpVbm5hbWVkVHlwZT4gbV9nZW5lcmljUG9pbnRlclR5cGU7
CiAgICAgSGFzaE1hcDxBU1Q6OkV4cHJlc3Npb24qLCBzdGQ6OnVuaXF1ZV9wdHI8UmVzb2x2aW5n
VHlwZT4+IG1fdHlwZU1hcDsKICAgICBIYXNoU2V0PFN0cmluZz4gbV92ZXJ0ZXhFbnRyeVBvaW50
czsKICAgICBIYXNoU2V0PFN0cmluZz4gbV9mcmFnbWVudEVudHJ5UG9pbnRzOwpAQCAtNTE4LDYg
KzYzMyw3IEBAIHByaXZhdGU6CiAgICAgY29uc3QgSW50cmluc2ljcyYgbV9pbnRyaW5zaWNzOwog
ICAgIFByb2dyYW0mIG1fcHJvZ3JhbTsKICAgICBBU1Q6OkZ1bmN0aW9uRGVmaW5pdGlvbiogbV9j
dXJyZW50RnVuY3Rpb24geyBudWxscHRyIH07CisgICAgSGFzaE1hcDxGdW5jdGlvbktleSwgVmVj
dG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8QVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uPiwgMT4s
IEZ1bmN0aW9uS2V5OjpIYXNoLCBGdW5jdGlvbktleTo6VHJhaXRzPiBtX2Z1bmN0aW9uczsKIH07
CiAKIHZvaWQgQ2hlY2tlcjo6dmlzaXQoUHJvZ3JhbSYgcHJvZ3JhbSkKQEAgLTYzOCw2ICs3NTQs
NTMgQEAgc3RhdGljIFJlZlB0cjxBU1Q6OlVubmFtZWRUeXBlPiBjb21taXQoUgogICAgIH0pKTsK
IH0KIAorQVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uKiBDaGVja2VyOjpyZXNvbHZlRnVuY3Rpb24o
VmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8UmVzb2x2aW5nVHlwZT4+JiB0eXBlcywgY29u
c3QgU3RyaW5nJiBuYW1lLCBDb2RlTG9jYXRpb24gbG9jYXRpb24sIEFTVDo6TmFtZWRUeXBlKiBj
YXN0UmV0dXJuVHlwZSkKK3sKKyAgICBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxBU1Q6
OlVubmFtZWRUeXBlPj4gdW5uYW1lZFR5cGVzOworICAgIHVubmFtZWRUeXBlcy5yZXNlcnZlSW5p
dGlhbENhcGFjaXR5KHR5cGVzLnNpemUoKSk7CisKKyAgICBmb3IgKGF1dG8gcmVzb2x2aW5nVHlw
ZSA6IHR5cGVzKSB7CisgICAgICAgIEFTVDo6VW5uYW1lZFR5cGUqIHR5cGUgPSByZXNvbHZpbmdU
eXBlLmdldCgpLnZpc2l0KFdURjo6bWFrZVZpc2l0b3IoWyZdKFJlZjxBU1Q6OlVubmFtZWRUeXBl
PiYgdW5uYW1lZFR5cGUpIC0+IEFTVDo6VW5uYW1lZFR5cGUqIHsKKyAgICAgICAgICAgIHJldHVy
biB1bm5hbWVkVHlwZS5wdHIoKTsKKyAgICAgICAgfSwgWyZdKFJlZlB0cjxSZXNvbHZhYmxlVHlw
ZVJlZmVyZW5jZT4mIHJlc29sdmFibGVUeXBlUmVmZXJlbmNlKSAtPiBBU1Q6OlVubmFtZWRUeXBl
KiB7CisgICAgICAgICAgICBpZiAocmVzb2x2YWJsZVR5cGVSZWZlcmVuY2UtPnJlc29sdmFibGVU
eXBlKCkubWF5YmVSZXNvbHZlZFR5cGUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gJnJlc29s
dmFibGVUeXBlUmVmZXJlbmNlLT5yZXNvbHZhYmxlVHlwZSgpLnJlc29sdmVkVHlwZSgpOworCisg
ICAgICAgICAgICBpZiAocmVzb2x2YWJsZVR5cGVSZWZlcmVuY2UtPnJlc29sdmFibGVUeXBlKCku
aXNGbG9hdExpdGVyYWxUeXBlKCkKKyAgICAgICAgICAgICAgICB8fCByZXNvbHZhYmxlVHlwZVJl
ZmVyZW5jZS0+cmVzb2x2YWJsZVR5cGUoKS5pc0ludGVnZXJMaXRlcmFsVHlwZSgpCisgICAgICAg
ICAgICAgICAgfHwgcmVzb2x2YWJsZVR5cGVSZWZlcmVuY2UtPnJlc29sdmFibGVUeXBlKCkuaXNV
bnNpZ25lZEludGVnZXJMaXRlcmFsVHlwZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiAmd3Jh
cHBlZEZsb2F0VHlwZSgpOworCisgICAgICAgICAgICBpZiAocmVzb2x2YWJsZVR5cGVSZWZlcmVu
Y2UtPnJlc29sdmFibGVUeXBlKCkuaXNOdWxsTGl0ZXJhbFR5cGUoKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gJmdlbmVyaWNQb2ludGVyVHlwZSgpOworCisgICAgICAgICAgICByZXR1cm4gY29t
bWl0KHJlc29sdmFibGVUeXBlUmVmZXJlbmNlLT5yZXNvbHZhYmxlVHlwZSgpKS5nZXQoKTsKKyAg
ICAgICAgfSkpOworCisgICAgICAgIGlmICghdHlwZSkgeworICAgICAgICAgICAgc2V0RXJyb3Io
RXJyb3IoIkNvdWxkIG5vdCByZXNvbHZlIHRoZSB0eXBlIG9mIGEgY29uc3RhbnQuIikpOworICAg
ICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICB1bm5hbWVkVHlw
ZXMudW5jaGVja2VkQXBwZW5kKG5vcm1hbGl6ZWRUeXBlRm9yRnVuY3Rpb25LZXkoKnR5cGUpKTsK
KyAgICB9CisKKyAgICB7CisgICAgICAgIGF1dG8gaXRlciA9IG1fZnVuY3Rpb25zLmZpbmQoRnVu
Y3Rpb25LZXkgeyBuYW1lLCBXVEZNb3ZlKHVubmFtZWRUeXBlcyksIGNhc3RSZXR1cm5UeXBlIH0p
OworICAgICAgICBpZiAoaXRlciAhPSBtX2Z1bmN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAg
aWYgKEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiogZnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb25P
dmVybG9hZChpdGVyLT52YWx1ZSwgdHlwZXMsIGNhc3RSZXR1cm5UeXBlKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gZnVuY3Rpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXV0byBu
ZXdGdW5jdGlvbiA9IHJlc29sdmVCeUluc3RhbnRpYXRpb24obmFtZSwgbG9jYXRpb24sIHR5cGVz
LCBtX2ludHJpbnNpY3MpKSB7CisgICAgICAgIG1fcHJvZ3JhbS5hcHBlbmQoV1RGTW92ZSgqbmV3
RnVuY3Rpb24pKTsKKyAgICAgICAgcmV0dXJuICZtX3Byb2dyYW0ubmF0aXZlRnVuY3Rpb25EZWNs
YXJhdGlvbnMoKS5sYXN0KCk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKIHZv
aWQgQ2hlY2tlcjo6dmlzaXQoQVNUOjpFbnVtZXJhdGlvbkRlZmluaXRpb24mIGVudW1lcmF0aW9u
RGVmaW5pdGlvbikKIHsKICAgICBib29sIGlzU2lnbmVkOwpAQCAtOTYxLDggKzExMjQsOSBAQCB2
b2lkIENoZWNrZXI6OmZpbmlzaFZpc2l0aW5nKEFTVDo6UHJvcGVyCiAgICAgICAgIGlmIChhZGRp
dGlvbmFsQXJndW1lbnRUeXBlKQogICAgICAgICAgICAgZ2V0dGVyQXJndW1lbnRUeXBlcy5hcHBl
bmQoKmFkZGl0aW9uYWxBcmd1bWVudFR5cGUpOwogICAgICAgICBhdXRvIGdldHRlck5hbWUgPSBw
cm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uZ2V0dGVyRnVuY3Rpb25OYW1lKCk7Ci0gICAgICAgIGF1
dG8qIGdldHRlckZ1bmN0aW9ucyA9IG1fcHJvZ3JhbS5uYW1lQ29udGV4dCgpLmdldEZ1bmN0aW9u
cyhnZXR0ZXJOYW1lKTsKLSAgICAgICAgZ2V0dGVyRnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb24o
bV9wcm9ncmFtLCBnZXR0ZXJGdW5jdGlvbnMsIGdldHRlckFyZ3VtZW50VHlwZXMsIGdldHRlck5h
bWUsIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbi5jb2RlTG9jYXRpb24oKSwgbV9pbnRyaW5zaWNz
KTsKKyAgICAgICAgZ2V0dGVyRnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb24oZ2V0dGVyQXJndW1l
bnRUeXBlcywgZ2V0dGVyTmFtZSwgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLmNvZGVMb2NhdGlv
bigpKTsKKyAgICAgICAgaWYgKGhhc0Vycm9yKCkpCisgICAgICAgICAgICByZXR1cm47CiAgICAg
ICAgIGlmIChnZXR0ZXJGdW5jdGlvbikKICAgICAgICAgICAgIGdldHRlclJldHVyblR5cGUgPSAm
Z2V0dGVyRnVuY3Rpb24tPnR5cGUoKTsKICAgICB9CkBAIC05NzcsOCArMTE0MSw5IEBAIHZvaWQg
Q2hlY2tlcjo6ZmluaXNoVmlzaXRpbmcoQVNUOjpQcm9wZXIKICAgICAgICAgICAgIGlmIChhZGRp
dGlvbmFsQXJndW1lbnRUeXBlKQogICAgICAgICAgICAgICAgIGFuZGVyQXJndW1lbnRUeXBlcy5h
cHBlbmQoKmFkZGl0aW9uYWxBcmd1bWVudFR5cGUpOwogICAgICAgICAgICAgYXV0byBhbmRlck5h
bWUgPSBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uYW5kZXJGdW5jdGlvbk5hbWUoKTsKLSAgICAg
ICAgICAgIGF1dG8qIGFuZGVyRnVuY3Rpb25zID0gbV9wcm9ncmFtLm5hbWVDb250ZXh0KCkuZ2V0
RnVuY3Rpb25zKGFuZGVyTmFtZSk7Ci0gICAgICAgICAgICBhbmRlckZ1bmN0aW9uID0gcmVzb2x2
ZUZ1bmN0aW9uKG1fcHJvZ3JhbSwgYW5kZXJGdW5jdGlvbnMsIGFuZGVyQXJndW1lbnRUeXBlcywg
YW5kZXJOYW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCksIG1faW50
cmluc2ljcyk7CisgICAgICAgICAgICBhbmRlckZ1bmN0aW9uID0gcmVzb2x2ZUZ1bmN0aW9uKGFu
ZGVyQXJndW1lbnRUeXBlcywgYW5kZXJOYW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29k
ZUxvY2F0aW9uKCkpOworICAgICAgICAgICAgaWYgKGhhc0Vycm9yKCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuOwogICAgICAgICAgICAgaWYgKGFuZGVyRnVuY3Rpb24pCiAgICAgICAgICAgICAg
ICAgYW5kZXJSZXR1cm5UeXBlID0gJmRvd25jYXN0PEFTVDo6UG9pbnRlclR5cGU+KGFuZGVyRnVu
Y3Rpb24tPnR5cGUoKSkuZWxlbWVudFR5cGUoKTsgLy8gRklYTUU6IGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTgxNjQgRW5mb3JjZSB0aGUgcmV0dXJuIG9mIGFuZGVy
cyB3aWxsIGFsd2F5cyBiZSBhIHBvaW50ZXIKICAgICAgICAgfQpAQCAtOTkyLDggKzExNTcsOSBA
QCB2b2lkIENoZWNrZXI6OmZpbmlzaFZpc2l0aW5nKEFTVDo6UHJvcGVyCiAgICAgICAgIGlmIChh
ZGRpdGlvbmFsQXJndW1lbnRUeXBlKQogICAgICAgICAgICAgdGhyZWFkQW5kZXJBcmd1bWVudFR5
cGVzLmFwcGVuZCgqYWRkaXRpb25hbEFyZ3VtZW50VHlwZSk7CiAgICAgICAgIGF1dG8gYW5kZXJO
YW1lID0gcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLmFuZGVyRnVuY3Rpb25OYW1lKCk7Ci0gICAg
ICAgIGF1dG8qIGFuZGVyRnVuY3Rpb25zID0gbV9wcm9ncmFtLm5hbWVDb250ZXh0KCkuZ2V0RnVu
Y3Rpb25zKGFuZGVyTmFtZSk7Ci0gICAgICAgIHRocmVhZEFuZGVyRnVuY3Rpb24gPSByZXNvbHZl
RnVuY3Rpb24obV9wcm9ncmFtLCBhbmRlckZ1bmN0aW9ucywgdGhyZWFkQW5kZXJBcmd1bWVudFR5
cGVzLCBhbmRlck5hbWUsIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbi5jb2RlTG9jYXRpb24oKSwg
bV9pbnRyaW5zaWNzKTsKKyAgICAgICAgdGhyZWFkQW5kZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5j
dGlvbih0aHJlYWRBbmRlckFyZ3VtZW50VHlwZXMsIGFuZGVyTmFtZSwgcHJvcGVydHlBY2Nlc3NF
eHByZXNzaW9uLmNvZGVMb2NhdGlvbigpKTsKKyAgICAgICAgaWYgKGhhc0Vycm9yKCkpCisgICAg
ICAgICAgICByZXR1cm47CiAgICAgICAgIGlmICh0aHJlYWRBbmRlckZ1bmN0aW9uKQogICAgICAg
ICAgICAgdGhyZWFkQW5kZXJSZXR1cm5UeXBlID0gJmRvd25jYXN0PEFTVDo6UG9pbnRlclR5cGU+
KHRocmVhZEFuZGVyRnVuY3Rpb24tPnR5cGUoKSkuZWxlbWVudFR5cGUoKTsgLy8gRklYTUU6IGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTgxNjQgRW5mb3JjZSB0aGUg
cmV0dXJuIG9mIGFuZGVycyB3aWxsIGFsd2F5cyBiZSBhIHBvaW50ZXIKICAgICB9CkBAIC0xMDM5
LDggKzEyMDUsOSBAQCB2b2lkIENoZWNrZXI6OmZpbmlzaFZpc2l0aW5nKEFTVDo6UHJvcGVyCiAg
ICAgICAgICAgICBzZXR0ZXJBcmd1bWVudFR5cGVzLmFwcGVuZCgqYWRkaXRpb25hbEFyZ3VtZW50
VHlwZSk7CiAgICAgICAgIHNldHRlckFyZ3VtZW50VHlwZXMuYXBwZW5kKGZpZWxkUmVzb2x2aW5n
VHlwZSk7CiAgICAgICAgIGF1dG8gc2V0dGVyTmFtZSA9IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lv
bi5zZXR0ZXJGdW5jdGlvbk5hbWUoKTsKLSAgICAgICAgYXV0byogc2V0dGVyRnVuY3Rpb25zID0g
bV9wcm9ncmFtLm5hbWVDb250ZXh0KCkuZ2V0RnVuY3Rpb25zKHNldHRlck5hbWUpOwotICAgICAg
ICBzZXR0ZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbihtX3Byb2dyYW0sIHNldHRlckZ1bmN0
aW9ucywgc2V0dGVyQXJndW1lbnRUeXBlcywgc2V0dGVyTmFtZSwgcHJvcGVydHlBY2Nlc3NFeHBy
ZXNzaW9uLmNvZGVMb2NhdGlvbigpLCBtX2ludHJpbnNpY3MpOworICAgICAgICBzZXR0ZXJGdW5j
dGlvbiA9IHJlc29sdmVGdW5jdGlvbihzZXR0ZXJBcmd1bWVudFR5cGVzLCBzZXR0ZXJOYW1lLCBw
cm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCkpOworICAgICAgICBpZiAoaGFz
RXJyb3IoKSkKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgaWYgKHNldHRlckZ1bmN0aW9u
KQogICAgICAgICAgICAgc2V0dGVyUmV0dXJuVHlwZSA9ICZzZXR0ZXJGdW5jdGlvbi0+dHlwZSgp
OwogICAgIH0KQEAgLTE0MjAsMjIgKzE1ODcsMjQgQEAgdm9pZCBDaGVja2VyOjp2aXNpdChBU1Q6
OkNhbGxFeHByZXNzaW9uJgogICAgIC8vIERvbid0IHJlY3Vyc2Ugb24gdGhlIGNhc3RSZXR1cm5U
eXBlLCBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBiZSBhIE5hbWVkVHlwZSwgd2hpY2ggd2ls
bCBnZXQgdmlzaXRlZCBsYXRlci4KICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHJlY3Vyc2UgdG8g
dGhlIHNhbWUgbm9kZSB0d2ljZS4KIAotICAgIE5hbWVDb250ZXh0JiBuYW1lQ29udGV4dCA9IG1f
cHJvZ3JhbS5uYW1lQ29udGV4dCgpOwotICAgIGF1dG8qIGZ1bmN0aW9ucyA9IG5hbWVDb250ZXh0
LmdldEZ1bmN0aW9ucyhjYWxsRXhwcmVzc2lvbi5uYW1lKCkpOwotICAgIGlmICghZnVuY3Rpb25z
KSB7Ci0gICAgICAgIGlmIChhdXRvKiB0eXBlcyA9IG5hbWVDb250ZXh0LmdldFR5cGVzKGNhbGxF
eHByZXNzaW9uLm5hbWUoKSkpIHsKLSAgICAgICAgICAgIGlmICh0eXBlcy0+c2l6ZSgpID09IDEp
IHsKLSAgICAgICAgICAgICAgICBpZiAoKGZ1bmN0aW9ucyA9IG5hbWVDb250ZXh0LmdldEZ1bmN0
aW9ucygib3BlcmF0b3IgY2FzdCJfc3RyKSkpCi0gICAgICAgICAgICAgICAgICAgIGNhbGxFeHBy
ZXNzaW9uLnNldENhc3REYXRhKCgqdHlwZXMpWzBdLmdldCgpKTsKKyAgICBhdXRvKiBmdW5jdGlv
biA9IHJlc29sdmVGdW5jdGlvbih0eXBlcywgY2FsbEV4cHJlc3Npb24ubmFtZSgpLCBjYWxsRXhw
cmVzc2lvbi5jb2RlTG9jYXRpb24oKSk7CisgICAgaWYgKGhhc0Vycm9yKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmICghZnVuY3Rpb24pIHsKKyAgICAgICAgTmFtZUNvbnRleHQmIG5hbWVD
b250ZXh0ID0gbV9wcm9ncmFtLm5hbWVDb250ZXh0KCk7CisgICAgICAgIGlmIChhdXRvKiBjYXN0
VHlwZXMgPSBuYW1lQ29udGV4dC5nZXRUeXBlcyhjYWxsRXhwcmVzc2lvbi5uYW1lKCkpKSB7Cisg
ICAgICAgICAgICBpZiAoY2FzdFR5cGVzLT5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAg
IEFTVDo6TmFtZWRUeXBlJiBjYXN0VHlwZSA9ICgqY2FzdFR5cGVzKVswXS5nZXQoKTsKKyAgICAg
ICAgICAgICAgICBmdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbih0eXBlcywgIm9wZXJhdG9yIGNh
c3QiX3N0ciwgY2FsbEV4cHJlc3Npb24uY29kZUxvY2F0aW9uKCksICZjYXN0VHlwZSk7CisgICAg
ICAgICAgICAgICAgaWYgKGhhc0Vycm9yKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb24pCisgICAgICAgICAgICAgICAgICAgIGNhbGxF
eHByZXNzaW9uLnNldENhc3REYXRhKGNhc3RUeXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAg
fQogICAgIH0KLSAgICBpZiAoIWZ1bmN0aW9ucykgewotICAgICAgICBzZXRFcnJvcihFcnJvcigi
Q291bGQgbm90IGZpbmQgYW55IGZ1bmN0aW9ucyB3aXRoIGFwcHJvcHJpYXRlIG5hbWUuIiwgY2Fs
bEV4cHJlc3Npb24uY29kZUxvY2F0aW9uKCkpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KIAot
ICAgIGF1dG8qIGZ1bmN0aW9uID0gcmVzb2x2ZUZ1bmN0aW9uKG1fcHJvZ3JhbSwgZnVuY3Rpb25z
LCB0eXBlcywgY2FsbEV4cHJlc3Npb24ubmFtZSgpLCBjYWxsRXhwcmVzc2lvbi5jb2RlTG9jYXRp
b24oKSwgbV9pbnRyaW5zaWNzLCBjYWxsRXhwcmVzc2lvbi5jYXN0UmV0dXJuVHlwZSgpKTsKICAg
ICBpZiAoIWZ1bmN0aW9uKSB7CiAgICAgICAgIC8vIEZJWE1FOiBBZGQgYmV0dGVyIGVycm9yIG1l
c3NhZ2VzIGZvciB3aHkgd2UgY2FuJ3QgcmVzb2x2ZSB0byBvbmUgb2YgdGhlIG92ZXJyaWRlcy4K
ICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMDEz
Mwo=
</data>
<flag name="review"
          id="391466"
          type_id="1"
          status="+"
          setter="rmorisset"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>375675</attachid>
            <date>2019-08-06 19:26:45 -0700</date>
            <delta_ts>2019-08-06 21:17:35 -0700</delta_ts>
            <desc>patch for landing</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>17368</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0ODMyOSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDUzIEBACisyMDE5LTA4LTA2ICBTYWFtIEJh
cmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAgIFtXSExTTF0gTWFrZSByZXNvbHZl
RnVuY3Rpb24gaW4gQ2hlY2tlciBmYXN0ZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTIwMDI4NworCisgICAgICAgIFJldmlld2VkIGJ5IFJvYmluIE1v
cmlzc2V0LgorCisgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgY29tcHV0ZV9ib2lkcyBmYXN0ZXIg
YnkgbWFraW5nIGZ1bmN0aW9uIG92ZXJsb2FkCisgICAgICAgIHJlc29sdXRpb24gZmFzdGVyIGlu
c2lkZSB0aGUgQ2hlY2tlci4gSXQncyBhIH42bXMgc3BlZWR1cCBpbiB0aGUKKyAgICAgICAgY2hl
Y2tlci4gVGhlIG1haW4gaWRlYSBpcyB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIG92ZXJsb2FkcyB3
ZSBuZWVkCisgICAgICAgIHRvIGxvb2sgZm9yIGJ5IHVzaW5nIGEgaGFzaCB0YWJsZSB0aGF0IGRl
c2NyaWJlcyBhIGZ1bmN0aW9uJ3MgdHlwZQorICAgICAgICBpbnN0ZWFkIG9mIGp1c3QgdXNpbmcg
YSBoYXNoIHRhYmxlIGtleWVkIGJ5IGEgZnVuY3Rpb24ncyBuYW1lLgorICAgICAgICAKKyAgICAg
ICAgVGhlIGludGVyZXN0aW5nIGltcGxlbWVudGF0aW9uIGRldGFpbCBoZXJlIGlzIHdlIG11c3Qg
Y29uc3RydWN0IGVudHJpZXMKKyAgICAgICAgaW4gdGhlIGhhc2ggdGFibGUgc3VjaCB0aGF0IHRo
ZXkgc3RpbGwgYWxsb3cgY29uc3RhbnRzIHRvIGJlIHJlc29sdmVkIHRvCisgICAgICAgIHZhcmlv
dXMgdHlwZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUga2V5IGluIHRoZSBoYXNoIHRhYmxlIG11c3Qg
bm9ybWFsaXplCisgICAgICAgIHRoZSB2ZWN0b3Igb2YgdHlwZXMgaXQgdXNlcyB0byBleHByZXNz
IGEgZnVuY3Rpb24ncyBpZGVudGl0eS4gVGhlIG5vcm1hbGl6YXRpb24KKyAgICAgICAgcnVsZXMg
YXJlOgorICAgICAgICAtIGludCA9PiBmbG9hdAorICAgICAgICAtIHVpbnQgPT4gZmxvYXQKKyAg
ICAgICAgLSBUKiA9PiBmbG9hdCoKKyAgICAgICAgLSBUW10gPT4gZmxvYXQqCisgICAgICAgIAor
ICAgICAgICBUaGUgZmlyc3QgdHdvIHJ1bGVzIGFyZSBiZWNhdXNlIGludCBjb25zdGFudHMgY2Fu
IGJlIG1hdGNoZWQgYWdhaW5zdAorICAgICAgICB0aGUgZmxvYXQgYW5kIHVpbnQgdHlwZXMuIFRo
ZSBsYXR0ZXIgdHdvIHJ1bGVzIGFyZSBiZWNhdXNlIHRoZSBudWxsCisgICAgICAgIGxpdGVyYWwg
Y2FuIGJlIG1hdGNoZWQgYWdhaW5zdCBhbnkgcG9pbnRlciBvciBhbnkgYXJyYXkgcmVmZXJlbmNl
CisgICAgICAgICh3ZSBwaWNrIGZsb2F0KiBhcmJpdHJhcmlseSkuIEV2ZW4gdGhvdWdoIGl0IHNl
ZW1zIGxpa2UgdGhlc2UKKyAgICAgICAgbm9ybWFsaXphdGlvbiBydWxlcyB3b3VsZCBkcmFzdGlj
YWxseSBicm9hZGVuIHRoZSBlZmZpY2FjeSBvZiB0aGUgaGFzaAorICAgICAgICB0YWJsZSwgd2Ug
c3RpbGwgc2VlIGEgMTAweCByZWR1Y3Rpb24gaW4gdGhlIG51bWJlciBvZiBvdmVybG9hZHMgd2Ug
bXVzdAorICAgICAgICByZXNvbHZlIGluc2lkZSBjb21wdXRlX2JvaWRzLiBXZSBnbyBmcm9tIGhh
dmluZyB0byByZXNvbHZlIDQwMCwwMDAKKyAgICAgICAgb3ZlcmxvYWRzIHRvIGp1c3QgcmVzb2x2
aW5nIDQsMDAwLgorCisgICAgICAgICogTW9kdWxlcy93ZWJncHUvV0hMU0wvV0hMU0xDaGVja2Vy
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldITFNMOjpGdW5jdGlvbktleTo6RnVuY3Rpb25LZXkp
OgorICAgICAgICAoV2ViQ29yZTo6V0hMU0w6OkZ1bmN0aW9uS2V5Ojppc0VtcHR5VmFsdWUgY29u
c3QpOgorICAgICAgICAoV2ViQ29yZTo6V0hMU0w6OkZ1bmN0aW9uS2V5Ojppc0hhc2hUYWJsZURl
bGV0ZWRWYWx1ZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpXSExTTDo6RnVuY3Rpb25LZXk6
Omhhc2ggY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6V0hMU0w6OkZ1bmN0aW9uS2V5OjpvcGVy
YXRvcj09IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OldITFNMOjpGdW5jdGlvbktleTo6SGFz
aDo6aGFzaCk6CisgICAgICAgIChXZWJDb3JlOjpXSExTTDo6RnVuY3Rpb25LZXk6Okhhc2g6OmVx
dWFsKToKKyAgICAgICAgKFdlYkNvcmU6OldITFNMOjpGdW5jdGlvbktleTo6VHJhaXRzOjppc0Vt
cHR5VmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6V0hMU0w6OkNoZWNrZXI6OkNoZWNrZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6V0hMU0w6OkNoZWNrZXI6OndyYXBwZWRGbG9hdFR5cGUpOgorICAg
ICAgICAoV2ViQ29yZTo6V0hMU0w6OkNoZWNrZXI6OmdlbmVyaWNQb2ludGVyVHlwZSk6CisgICAg
ICAgIChXZWJDb3JlOjpXSExTTDo6Q2hlY2tlcjo6bm9ybWFsaXplZFR5cGVGb3JGdW5jdGlvbktl
eSk6CisgICAgICAgIChXZWJDb3JlOjpXSExTTDo6Q2hlY2tlcjo6cmVzb2x2ZUZ1bmN0aW9uKToK
KyAgICAgICAgKFdlYkNvcmU6OldITFNMOjpDaGVja2VyOjpmaW5pc2hWaXNpdGluZyk6CisgICAg
ICAgIChXZWJDb3JlOjpXSExTTDo6Q2hlY2tlcjo6dmlzaXQpOgorICAgICAgICAoV2ViQ29yZTo6
V0hMU0w6OnJlc29sdmVGdW5jdGlvbik6IERlbGV0ZWQuCisKIDIwMTktMDgtMDYgIENvbW1pdCBR
dWV1ZSAgPGNvbW1pdC1xdWV1ZUB3ZWJraXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJv
bGxpbmcgb3V0IHIyNDgyODkuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9X
SExTTC9XSExTTENoZWNrZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVs
ZXMvd2ViZ3B1L1dITFNML1dITFNMQ2hlY2tlci5jcHAJKHJldmlzaW9uIDI0ODMyOSkKKysrIFNv
dXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNMQ2hlY2tlci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTExOCw2ICsxMTgsODcgQEAgcHVibGljOgogICAgIH0KIH07CiAKK2NsYXNz
IEZ1bmN0aW9uS2V5IHsKK3B1YmxpYzoKKyAgICBGdW5jdGlvbktleSgpID0gZGVmYXVsdDsKKyAg
ICBGdW5jdGlvbktleShXVEY6Okhhc2hUYWJsZURlbGV0ZWRWYWx1ZVR5cGUpCisgICAgeworICAg
ICAgICBtX2Nhc3RSZXR1cm5UeXBlID0gYml0d2lzZV9jYXN0PEFTVDo6TmFtZWRUeXBlKj4oc3Rh
dGljX2Nhc3Q8dWludHB0cl90PigxKSk7CisgICAgfQorCisgICAgRnVuY3Rpb25LZXkoU3RyaW5n
IG5hbWUsIFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6VW5uYW1lZFR5cGU+PiB0
eXBlcywgQVNUOjpOYW1lZFR5cGUqIGNhc3RSZXR1cm5UeXBlID0gbnVsbHB0cikKKyAgICAgICAg
OiBtX25hbWUoV1RGTW92ZShuYW1lKSkKKyAgICAgICAgLCBtX3R5cGVzKFdURk1vdmUodHlwZXMp
KQorICAgICAgICAsIG1fY2FzdFJldHVyblR5cGUoY2FzdFJldHVyblR5cGUpCisgICAgeyB9CisK
KyAgICBib29sIGlzRW1wdHlWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZS5pc051bGwoKTsg
fQorICAgIGJvb2wgaXNIYXNoVGFibGVEZWxldGVkVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2Nh
c3RSZXR1cm5UeXBlID09IGJpdHdpc2VfY2FzdDxBU1Q6Ok5hbWVkVHlwZSo+KHN0YXRpY19jYXN0
PHVpbnRwdHJfdD4oMSkpOyB9CisKKyAgICB1bnNpZ25lZCBoYXNoKCkgY29uc3QKKyAgICB7Cisg
ICAgICAgIHVuc2lnbmVkIGhhc2ggPSBJbnRIYXNoPHNpemVfdD46Omhhc2gobV90eXBlcy5zaXpl
KCkpOworICAgICAgICBoYXNoIF49IG1fbmFtZS5oYXNoKCk7CisgICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbV90eXBlcy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGhhc2ggXj0gbV90
eXBlc1tpXS5nZXQoKS5oYXNoKCkgKyBpOworCisgICAgICAgIGlmIChtX2Nhc3RSZXR1cm5UeXBl
KQorICAgICAgICAgICAgaGFzaCBePSBXVEY6OlB0ckhhc2g8QVNUOjpUeXBlKj46Omhhc2goJm1f
Y2FzdFJldHVyblR5cGUtPnVuaWZ5Tm9kZSgpKTsKKworICAgICAgICByZXR1cm4gaGFzaDsKKyAg
ICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRnVuY3Rpb25LZXkmIG90aGVyKSBjb25z
dAorICAgIHsKKyAgICAgICAgaWYgKG1fdHlwZXMuc2l6ZSgpICE9IG90aGVyLm1fdHlwZXMuc2l6
ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChtX25hbWUgIT0g
b3RoZXIubV9uYW1lKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgbV90eXBlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYg
KCFtYXRjaGVzKG1fdHlwZXNbaV0uZ2V0KCksIG90aGVyLm1fdHlwZXNbaV0uZ2V0KCkpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghIW1f
Y2FzdFJldHVyblR5cGUgIT0gISFvdGhlci5tX2Nhc3RSZXR1cm5UeXBlKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICghbV9jYXN0UmV0dXJuVHlwZSkKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmICgmbV9jYXN0UmV0dXJuVHlwZS0+dW5pZnlO
b2RlKCkgPT0gJm90aGVyLm1fY2FzdFJldHVyblR5cGUtPnVuaWZ5Tm9kZSgpKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0
cnVjdCBIYXNoIHsKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgRnVuY3Rpb25L
ZXkmIGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGtleS5oYXNoKCk7CisgICAg
ICAgIH0KKworICAgICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBGdW5jdGlvbktleSYgYSwg
Y29uc3QgRnVuY3Rpb25LZXkmIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhID09
IGI7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBzYWZlVG9Db21wYXJl
VG9FbXB0eU9yRGVsZXRlZCA9IGZhbHNlOworICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBlbXB0
eVZhbHVlSXNaZXJvID0gZmFsc2U7CisgICAgfTsKKworICAgIHN0cnVjdCBUcmFpdHMgOiBwdWJs
aWMgV1RGOjpTaW1wbGVDbGFzc0hhc2hUcmFpdHM8RnVuY3Rpb25LZXk+IHsKKyAgICAgICAgc3Rh
dGljIGNvbnN0IGJvb2wgaGFzSXNFbXB0eVZhbHVlRnVuY3Rpb24gPSB0cnVlOworICAgICAgICBz
dGF0aWMgYm9vbCBpc0VtcHR5VmFsdWUoY29uc3QgRnVuY3Rpb25LZXkmIGtleSkgeyByZXR1cm4g
a2V5LmlzRW1wdHlWYWx1ZSgpOyB9CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBTdHJpbmcgbV9u
YW1lOworICAgIFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6VW5uYW1lZFR5cGU+
PiBtX3R5cGVzOworICAgIEFTVDo6TmFtZWRUeXBlKiBtX2Nhc3RSZXR1cm5UeXBlOworfTsKKwog
c3RhdGljIEFTVDo6TmF0aXZlRnVuY3Rpb25EZWNsYXJhdGlvbiByZXNvbHZlV2l0aE9wZXJhdG9y
QW5kZXJJbmRleGVyKENvZGVMb2NhdGlvbiBsb2NhdGlvbiwgQVNUOjpBcnJheVJlZmVyZW5jZVR5
cGUmIGZpcnN0QXJndW1lbnQsIGNvbnN0IEludHJpbnNpY3MmIGludHJpbnNpY3MpCiB7CiAgICAg
Y29uc3QgYm9vbCBpc09wZXJhdG9yID0gdHJ1ZTsKQEAgLTIxNywyMSArMjk4LDYgQEAgc3RhdGlj
IE9wdGlvbmFsPEFTVDo6TmF0aXZlRnVuY3Rpb25EZWNsYQogICAgIHJldHVybiBXVEY6Om51bGxv
cHQ7CiB9CiAKLXN0YXRpYyBBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24qIHJlc29sdmVGdW5jdGlv
bihQcm9ncmFtJiBwcm9ncmFtLCBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxBU1Q6OkZ1
bmN0aW9uRGVjbGFyYXRpb24+LCAxPiogcG9zc2libGVPdmVybG9hZHMsIFZlY3RvcjxzdGQ6OnJl
ZmVyZW5jZV93cmFwcGVyPFJlc29sdmluZ1R5cGU+PiYgdHlwZXMsIGNvbnN0IFN0cmluZyYgbmFt
ZSwgQ29kZUxvY2F0aW9uIGxvY2F0aW9uLCBjb25zdCBJbnRyaW5zaWNzJiBpbnRyaW5zaWNzLCBB
U1Q6Ok5hbWVkVHlwZSogY2FzdFJldHVyblR5cGUgPSBudWxscHRyKQotewotICAgIGlmIChwb3Nz
aWJsZU92ZXJsb2FkcykgewotICAgICAgICBpZiAoQVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uKiBm
dW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKCpwb3NzaWJsZU92ZXJsb2FkcywgdHlw
ZXMsIGNhc3RSZXR1cm5UeXBlKSkKLSAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbjsKLSAgICB9
Ci0KLSAgICBpZiAoYXV0byBuZXdGdW5jdGlvbiA9IHJlc29sdmVCeUluc3RhbnRpYXRpb24obmFt
ZSwgbG9jYXRpb24sIHR5cGVzLCBpbnRyaW5zaWNzKSkgewotICAgICAgICBwcm9ncmFtLmFwcGVu
ZChXVEZNb3ZlKCpuZXdGdW5jdGlvbikpOwotICAgICAgICByZXR1cm4gJnByb2dyYW0ubmF0aXZl
RnVuY3Rpb25EZWNsYXJhdGlvbnMoKS5sYXN0KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGxw
dHI7Ci19Ci0KIHN0YXRpYyBib29sIGNoZWNrU2VtYW50aWNzKFZlY3RvcjxFbnRyeVBvaW50SXRl
bT4mIGlucHV0SXRlbXMsIFZlY3RvcjxFbnRyeVBvaW50SXRlbT4mIG91dHB1dEl0ZW1zLCBjb25z
dCBPcHRpb25hbDxBU1Q6OkVudHJ5UG9pbnRUeXBlPiYgZW50cnlQb2ludFR5cGUsIGNvbnN0IElu
dHJpbnNpY3MmIGludHJpbnNpY3MpCiB7CiAgICAgewpAQCAtNDU0LDYgKzUyMCwyNSBAQCBwdWJs
aWM6CiAgICAgICAgIDogbV9pbnRyaW5zaWNzKGludHJpbnNpY3MpCiAgICAgICAgICwgbV9wcm9n
cmFtKHByb2dyYW0pCiAgICAgeworICAgICAgICBhdXRvIGFkZEZ1bmN0aW9uID0gWyZdIChBU1Q6
OkZ1bmN0aW9uRGVjbGFyYXRpb24mIGZ1bmN0aW9uKSB7CisgICAgICAgICAgICBBU1Q6Ok5hbWVk
VHlwZSogY2FzdFJldHVyblR5cGUgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKGZ1bmN0aW9u
LmlzQ2FzdCgpICYmIGlzPEFTVDo6TmFtZWRUeXBlPihmdW5jdGlvbi50eXBlKCkudW5pZnlOb2Rl
KCkpKQorICAgICAgICAgICAgICAgIGNhc3RSZXR1cm5UeXBlID0gJmRvd25jYXN0PEFTVDo6TmFt
ZWRUeXBlPihmdW5jdGlvbi50eXBlKCkudW5pZnlOb2RlKCkpOworCisgICAgICAgICAgICBWZWN0
b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxBU1Q6OlVubmFtZWRUeXBlPj4gdHlwZXM7CisgICAg
ICAgICAgICB0eXBlcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGZ1bmN0aW9uLnBhcmFtZXRlcnMo
KS5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKGF1dG8mIHBhcmFtIDogZnVuY3Rpb24ucGFy
YW1ldGVycygpKQorICAgICAgICAgICAgICAgIHR5cGVzLnVuY2hlY2tlZEFwcGVuZChub3JtYWxp
emVkVHlwZUZvckZ1bmN0aW9uS2V5KCpwYXJhbS0+dHlwZSgpKSk7CisKKyAgICAgICAgICAgIGF1
dG8gYWRkUmVzdWx0ID0gbV9mdW5jdGlvbnMuYWRkKEZ1bmN0aW9uS2V5IHsgZnVuY3Rpb24ubmFt
ZSgpLCBXVEZNb3ZlKHR5cGVzKSwgY2FzdFJldHVyblR5cGUgfSwgVmVjdG9yPHN0ZDo6cmVmZXJl
bmNlX3dyYXBwZXI8QVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uPiwgMT4oKSk7CisgICAgICAgICAg
ICBhZGRSZXN1bHQuaXRlcmF0b3ItPnZhbHVlLmFwcGVuZChmdW5jdGlvbik7CisgICAgICAgIH07
CisKKyAgICAgICAgZm9yIChhdXRvJiBmdW5jdGlvbiA6IG1fcHJvZ3JhbS5mdW5jdGlvbkRlZmlu
aXRpb25zKCkpCisgICAgICAgICAgICBhZGRGdW5jdGlvbihmdW5jdGlvbi5nZXQoKSk7CisgICAg
ICAgIGZvciAoYXV0byYgZnVuY3Rpb24gOiBtX3Byb2dyYW0ubmF0aXZlRnVuY3Rpb25EZWNsYXJh
dGlvbnMoKSkKKyAgICAgICAgICAgIGFkZEZ1bmN0aW9uKGZ1bmN0aW9uLmdldCgpKTsKICAgICB9
CiAKICAgICB2aXJ0dWFsIH5DaGVja2VyKCkgPSBkZWZhdWx0OwpAQCAtNTExLDYgKzU5NiwzNiBA
QCBwcml2YXRlOgogCiAgICAgdm9pZCBmaW5pc2hWaXNpdGluZyhBU1Q6OlByb3BlcnR5QWNjZXNz
RXhwcmVzc2lvbiYsIFJlc29sdmluZ1R5cGUqIGFkZGl0aW9uYWxBcmd1bWVudFR5cGUgPSBudWxs
cHRyKTsKIAorICAgIEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiogcmVzb2x2ZUZ1bmN0aW9uKFZl
Y3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPFJlc29sdmluZ1R5cGU+PiYgdHlwZXMsIGNvbnN0
IFN0cmluZyYgbmFtZSwgQ29kZUxvY2F0aW9uLCBBU1Q6Ok5hbWVkVHlwZSogY2FzdFJldHVyblR5
cGUgPSBudWxscHRyKTsKKworICAgIEFTVDo6VW5uYW1lZFR5cGUmIHdyYXBwZWRGbG9hdFR5cGUo
KQorICAgIHsKKyAgICAgICAgaWYgKCFtX3dyYXBwZWRGbG9hdFR5cGUpCisgICAgICAgICAgICBt
X3dyYXBwZWRGbG9hdFR5cGUgPSBBU1Q6OlR5cGVSZWZlcmVuY2U6OndyYXAoeyB9LCBtX2ludHJp
bnNpY3MuZmxvYXRUeXBlKCkpOworICAgICAgICByZXR1cm4gKm1fd3JhcHBlZEZsb2F0VHlwZTsK
KyAgICB9CisKKyAgICBBU1Q6OlVubmFtZWRUeXBlJiBnZW5lcmljUG9pbnRlclR5cGUoKQorICAg
IHsKKyAgICAgICAgaWYgKCFtX2dlbmVyaWNQb2ludGVyVHlwZSkKKyAgICAgICAgICAgIG1fZ2Vu
ZXJpY1BvaW50ZXJUeXBlID0gQVNUOjpQb2ludGVyVHlwZTo6Y3JlYXRlKHsgfSwgQVNUOjpBZGRy
ZXNzU3BhY2U6OlRocmVhZCwgQVNUOjpUeXBlUmVmZXJlbmNlOjp3cmFwKHsgfSwgbV9pbnRyaW5z
aWNzLmZsb2F0VHlwZSgpKSk7CisgICAgICAgIHJldHVybiAqbV9nZW5lcmljUG9pbnRlclR5cGU7
CisgICAgfQorCisgICAgQVNUOjpVbm5hbWVkVHlwZSYgbm9ybWFsaXplZFR5cGVGb3JGdW5jdGlv
bktleShBU1Q6OlVubmFtZWRUeXBlJiB0eXBlKQorICAgIHsKKyAgICAgICAgYXV0byogdW5pZnlO
b2RlID0gJnR5cGUudW5pZnlOb2RlKCk7CisgICAgICAgIGlmICh1bmlmeU5vZGUgPT0gJm1faW50
cmluc2ljcy51aW50VHlwZSgpIHx8IHVuaWZ5Tm9kZSA9PSAmbV9pbnRyaW5zaWNzLmludFR5cGUo
KSkKKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkRmxvYXRUeXBlKCk7CisKKyAgICAgICAgaWYg
KGlzPEFTVDo6UmVmZXJlbmNlVHlwZT4odHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZ2VuZXJp
Y1BvaW50ZXJUeXBlKCk7CisKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgUmVm
UHRyPEFTVDo6VHlwZVJlZmVyZW5jZT4gbV93cmFwcGVkRmxvYXRUeXBlOworICAgIFJlZlB0cjxB
U1Q6OlVubmFtZWRUeXBlPiBtX2dlbmVyaWNQb2ludGVyVHlwZTsKICAgICBIYXNoTWFwPEFTVDo6
RXhwcmVzc2lvbiosIHN0ZDo6dW5pcXVlX3B0cjxSZXNvbHZpbmdUeXBlPj4gbV90eXBlTWFwOwog
ICAgIEhhc2hTZXQ8U3RyaW5nPiBtX3ZlcnRleEVudHJ5UG9pbnRzOwogICAgIEhhc2hTZXQ8U3Ry
aW5nPiBtX2ZyYWdtZW50RW50cnlQb2ludHM7CkBAIC01MTgsNiArNjMzLDcgQEAgcHJpdmF0ZToK
ICAgICBjb25zdCBJbnRyaW5zaWNzJiBtX2ludHJpbnNpY3M7CiAgICAgUHJvZ3JhbSYgbV9wcm9n
cmFtOwogICAgIEFTVDo6RnVuY3Rpb25EZWZpbml0aW9uKiBtX2N1cnJlbnRGdW5jdGlvbiB7IG51
bGxwdHIgfTsKKyAgICBIYXNoTWFwPEZ1bmN0aW9uS2V5LCBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vf
d3JhcHBlcjxBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24+LCAxPiwgRnVuY3Rpb25LZXk6Okhhc2gs
IEZ1bmN0aW9uS2V5OjpUcmFpdHM+IG1fZnVuY3Rpb25zOwogfTsKIAogdm9pZCBDaGVja2VyOjp2
aXNpdChQcm9ncmFtJiBwcm9ncmFtKQpAQCAtNjM4LDYgKzc1NCw1MyBAQCBzdGF0aWMgUmVmUHRy
PEFTVDo6VW5uYW1lZFR5cGU+IGNvbW1pdChSCiAgICAgfSkpOwogfQogCitBU1Q6OkZ1bmN0aW9u
RGVjbGFyYXRpb24qIENoZWNrZXI6OnJlc29sdmVGdW5jdGlvbihWZWN0b3I8c3RkOjpyZWZlcmVu
Y2Vfd3JhcHBlcjxSZXNvbHZpbmdUeXBlPj4mIHR5cGVzLCBjb25zdCBTdHJpbmcmIG5hbWUsIENv
ZGVMb2NhdGlvbiBsb2NhdGlvbiwgQVNUOjpOYW1lZFR5cGUqIGNhc3RSZXR1cm5UeXBlKQorewor
ICAgIFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6VW5uYW1lZFR5cGU+PiB1bm5h
bWVkVHlwZXM7CisgICAgdW5uYW1lZFR5cGVzLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkodHlwZXMu
c2l6ZSgpKTsKKworICAgIGZvciAoYXV0byByZXNvbHZpbmdUeXBlIDogdHlwZXMpIHsKKyAgICAg
ICAgQVNUOjpVbm5hbWVkVHlwZSogdHlwZSA9IHJlc29sdmluZ1R5cGUuZ2V0KCkudmlzaXQoV1RG
OjptYWtlVmlzaXRvcihbJl0oUmVmPEFTVDo6VW5uYW1lZFR5cGU+JiB1bm5hbWVkVHlwZSkgLT4g
QVNUOjpVbm5hbWVkVHlwZSogeworICAgICAgICAgICAgcmV0dXJuIHVubmFtZWRUeXBlLnB0cigp
OworICAgICAgICB9LCBbJl0oUmVmUHRyPFJlc29sdmFibGVUeXBlUmVmZXJlbmNlPiYgcmVzb2x2
YWJsZVR5cGVSZWZlcmVuY2UpIC0+IEFTVDo6VW5uYW1lZFR5cGUqIHsKKyAgICAgICAgICAgIGlm
IChyZXNvbHZhYmxlVHlwZVJlZmVyZW5jZS0+cmVzb2x2YWJsZVR5cGUoKS5tYXliZVJlc29sdmVk
VHlwZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiAmcmVzb2x2YWJsZVR5cGVSZWZlcmVuY2Ut
PnJlc29sdmFibGVUeXBlKCkucmVzb2x2ZWRUeXBlKCk7CisKKyAgICAgICAgICAgIGlmIChyZXNv
bHZhYmxlVHlwZVJlZmVyZW5jZS0+cmVzb2x2YWJsZVR5cGUoKS5pc0Zsb2F0TGl0ZXJhbFR5cGUo
KQorICAgICAgICAgICAgICAgIHx8IHJlc29sdmFibGVUeXBlUmVmZXJlbmNlLT5yZXNvbHZhYmxl
VHlwZSgpLmlzSW50ZWdlckxpdGVyYWxUeXBlKCkKKyAgICAgICAgICAgICAgICB8fCByZXNvbHZh
YmxlVHlwZVJlZmVyZW5jZS0+cmVzb2x2YWJsZVR5cGUoKS5pc1Vuc2lnbmVkSW50ZWdlckxpdGVy
YWxUeXBlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICZ3cmFwcGVkRmxvYXRUeXBlKCk7CisK
KyAgICAgICAgICAgIGlmIChyZXNvbHZhYmxlVHlwZVJlZmVyZW5jZS0+cmVzb2x2YWJsZVR5cGUo
KS5pc051bGxMaXRlcmFsVHlwZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiAmZ2VuZXJpY1Bv
aW50ZXJUeXBlKCk7CisKKyAgICAgICAgICAgIHJldHVybiBjb21taXQocmVzb2x2YWJsZVR5cGVS
ZWZlcmVuY2UtPnJlc29sdmFibGVUeXBlKCkpLmdldCgpOworICAgICAgICB9KSk7CisKKyAgICAg
ICAgaWYgKCF0eXBlKSB7CisgICAgICAgICAgICBzZXRFcnJvcihFcnJvcigiQ291bGQgbm90IHJl
c29sdmUgdGhlIHR5cGUgb2YgYSBjb25zdGFudC4iKSk7CisgICAgICAgICAgICByZXR1cm4gbnVs
bHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHVubmFtZWRUeXBlcy51bmNoZWNrZWRBcHBlbmQo
bm9ybWFsaXplZFR5cGVGb3JGdW5jdGlvbktleSgqdHlwZSkpOworICAgIH0KKworICAgIHsKKyAg
ICAgICAgYXV0byBpdGVyID0gbV9mdW5jdGlvbnMuZmluZChGdW5jdGlvbktleSB7IG5hbWUsIFdU
Rk1vdmUodW5uYW1lZFR5cGVzKSwgY2FzdFJldHVyblR5cGUgfSk7CisgICAgICAgIGlmIChpdGVy
ICE9IG1fZnVuY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoQVNUOjpGdW5jdGlvbkRl
Y2xhcmF0aW9uKiBmdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKGl0ZXItPnZhbHVl
LCB0eXBlcywgY2FzdFJldHVyblR5cGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlv
bjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdXRvIG5ld0Z1bmN0aW9uID0gcmVzb2x2
ZUJ5SW5zdGFudGlhdGlvbihuYW1lLCBsb2NhdGlvbiwgdHlwZXMsIG1faW50cmluc2ljcykpIHsK
KyAgICAgICAgbV9wcm9ncmFtLmFwcGVuZChXVEZNb3ZlKCpuZXdGdW5jdGlvbikpOworICAgICAg
ICByZXR1cm4gJm1fcHJvZ3JhbS5uYXRpdmVGdW5jdGlvbkRlY2xhcmF0aW9ucygpLmxhc3QoKTsK
KyAgICB9CisKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwogdm9pZCBDaGVja2VyOjp2aXNpdChB
U1Q6OkVudW1lcmF0aW9uRGVmaW5pdGlvbiYgZW51bWVyYXRpb25EZWZpbml0aW9uKQogewogICAg
IGJvb2wgaXNTaWduZWQ7CkBAIC05NjEsOCArMTEyNCw5IEBAIHZvaWQgQ2hlY2tlcjo6ZmluaXNo
VmlzaXRpbmcoQVNUOjpQcm9wZXIKICAgICAgICAgaWYgKGFkZGl0aW9uYWxBcmd1bWVudFR5cGUp
CiAgICAgICAgICAgICBnZXR0ZXJBcmd1bWVudFR5cGVzLmFwcGVuZCgqYWRkaXRpb25hbEFyZ3Vt
ZW50VHlwZSk7CiAgICAgICAgIGF1dG8gZ2V0dGVyTmFtZSA9IHByb3BlcnR5QWNjZXNzRXhwcmVz
c2lvbi5nZXR0ZXJGdW5jdGlvbk5hbWUoKTsKLSAgICAgICAgYXV0byogZ2V0dGVyRnVuY3Rpb25z
ID0gbV9wcm9ncmFtLm5hbWVDb250ZXh0KCkuZ2V0RnVuY3Rpb25zKGdldHRlck5hbWUpOwotICAg
ICAgICBnZXR0ZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbihtX3Byb2dyYW0sIGdldHRlckZ1
bmN0aW9ucywgZ2V0dGVyQXJndW1lbnRUeXBlcywgZ2V0dGVyTmFtZSwgcHJvcGVydHlBY2Nlc3NF
eHByZXNzaW9uLmNvZGVMb2NhdGlvbigpLCBtX2ludHJpbnNpY3MpOworICAgICAgICBnZXR0ZXJG
dW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbihnZXR0ZXJBcmd1bWVudFR5cGVzLCBnZXR0ZXJOYW1l
LCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0aW9uKCkpOworICAgICAgICBpZiAo
aGFzRXJyb3IoKSkKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgaWYgKGdldHRlckZ1bmN0
aW9uKQogICAgICAgICAgICAgZ2V0dGVyUmV0dXJuVHlwZSA9ICZnZXR0ZXJGdW5jdGlvbi0+dHlw
ZSgpOwogICAgIH0KQEAgLTk3Nyw4ICsxMTQxLDkgQEAgdm9pZCBDaGVja2VyOjpmaW5pc2hWaXNp
dGluZyhBU1Q6OlByb3BlcgogICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxBcmd1bWVudFR5cGUp
CiAgICAgICAgICAgICAgICAgYW5kZXJBcmd1bWVudFR5cGVzLmFwcGVuZCgqYWRkaXRpb25hbEFy
Z3VtZW50VHlwZSk7CiAgICAgICAgICAgICBhdXRvIGFuZGVyTmFtZSA9IHByb3BlcnR5QWNjZXNz
RXhwcmVzc2lvbi5hbmRlckZ1bmN0aW9uTmFtZSgpOwotICAgICAgICAgICAgYXV0byogYW5kZXJG
dW5jdGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRleHQoKS5nZXRGdW5jdGlvbnMoYW5kZXJOYW1l
KTsKLSAgICAgICAgICAgIGFuZGVyRnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb24obV9wcm9ncmFt
LCBhbmRlckZ1bmN0aW9ucywgYW5kZXJBcmd1bWVudFR5cGVzLCBhbmRlck5hbWUsIHByb3BlcnR5
QWNjZXNzRXhwcmVzc2lvbi5jb2RlTG9jYXRpb24oKSwgbV9pbnRyaW5zaWNzKTsKKyAgICAgICAg
ICAgIGFuZGVyRnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb24oYW5kZXJBcmd1bWVudFR5cGVzLCBh
bmRlck5hbWUsIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbi5jb2RlTG9jYXRpb24oKSk7CisgICAg
ICAgICAgICBpZiAoaGFzRXJyb3IoKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAg
ICAgICBpZiAoYW5kZXJGdW5jdGlvbikKICAgICAgICAgICAgICAgICBhbmRlclJldHVyblR5cGUg
PSAmZG93bmNhc3Q8QVNUOjpQb2ludGVyVHlwZT4oYW5kZXJGdW5jdGlvbi0+dHlwZSgpKS5lbGVt
ZW50VHlwZSgpOyAvLyBGSVhNRTogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE5ODE2NCBFbmZvcmNlIHRoZSByZXR1cm4gb2YgYW5kZXJzIHdpbGwgYWx3YXlzIGJlIGEg
cG9pbnRlcgogICAgICAgICB9CkBAIC05OTIsOCArMTE1Nyw5IEBAIHZvaWQgQ2hlY2tlcjo6Zmlu
aXNoVmlzaXRpbmcoQVNUOjpQcm9wZXIKICAgICAgICAgaWYgKGFkZGl0aW9uYWxBcmd1bWVudFR5
cGUpCiAgICAgICAgICAgICB0aHJlYWRBbmRlckFyZ3VtZW50VHlwZXMuYXBwZW5kKCphZGRpdGlv
bmFsQXJndW1lbnRUeXBlKTsKICAgICAgICAgYXV0byBhbmRlck5hbWUgPSBwcm9wZXJ0eUFjY2Vz
c0V4cHJlc3Npb24uYW5kZXJGdW5jdGlvbk5hbWUoKTsKLSAgICAgICAgYXV0byogYW5kZXJGdW5j
dGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRleHQoKS5nZXRGdW5jdGlvbnMoYW5kZXJOYW1lKTsK
LSAgICAgICAgdGhyZWFkQW5kZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbihtX3Byb2dyYW0s
IGFuZGVyRnVuY3Rpb25zLCB0aHJlYWRBbmRlckFyZ3VtZW50VHlwZXMsIGFuZGVyTmFtZSwgcHJv
cGVydHlBY2Nlc3NFeHByZXNzaW9uLmNvZGVMb2NhdGlvbigpLCBtX2ludHJpbnNpY3MpOworICAg
ICAgICB0aHJlYWRBbmRlckZ1bmN0aW9uID0gcmVzb2x2ZUZ1bmN0aW9uKHRocmVhZEFuZGVyQXJn
dW1lbnRUeXBlcywgYW5kZXJOYW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0
aW9uKCkpOworICAgICAgICBpZiAoaGFzRXJyb3IoKSkKKyAgICAgICAgICAgIHJldHVybjsKICAg
ICAgICAgaWYgKHRocmVhZEFuZGVyRnVuY3Rpb24pCiAgICAgICAgICAgICB0aHJlYWRBbmRlclJl
dHVyblR5cGUgPSAmZG93bmNhc3Q8QVNUOjpQb2ludGVyVHlwZT4odGhyZWFkQW5kZXJGdW5jdGlv
bi0+dHlwZSgpKS5lbGVtZW50VHlwZSgpOyAvLyBGSVhNRTogaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTE5ODE2NCBFbmZvcmNlIHRoZSByZXR1cm4gb2YgYW5kZXJzIHdp
bGwgYWx3YXlzIGJlIGEgcG9pbnRlcgogICAgIH0KQEAgLTEwMzksOCArMTIwNSw5IEBAIHZvaWQg
Q2hlY2tlcjo6ZmluaXNoVmlzaXRpbmcoQVNUOjpQcm9wZXIKICAgICAgICAgICAgIHNldHRlckFy
Z3VtZW50VHlwZXMuYXBwZW5kKCphZGRpdGlvbmFsQXJndW1lbnRUeXBlKTsKICAgICAgICAgc2V0
dGVyQXJndW1lbnRUeXBlcy5hcHBlbmQoZmllbGRSZXNvbHZpbmdUeXBlKTsKICAgICAgICAgYXV0
byBzZXR0ZXJOYW1lID0gcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLnNldHRlckZ1bmN0aW9uTmFt
ZSgpOwotICAgICAgICBhdXRvKiBzZXR0ZXJGdW5jdGlvbnMgPSBtX3Byb2dyYW0ubmFtZUNvbnRl
eHQoKS5nZXRGdW5jdGlvbnMoc2V0dGVyTmFtZSk7Ci0gICAgICAgIHNldHRlckZ1bmN0aW9uID0g
cmVzb2x2ZUZ1bmN0aW9uKG1fcHJvZ3JhbSwgc2V0dGVyRnVuY3Rpb25zLCBzZXR0ZXJBcmd1bWVu
dFR5cGVzLCBzZXR0ZXJOYW1lLCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uY29kZUxvY2F0aW9u
KCksIG1faW50cmluc2ljcyk7CisgICAgICAgIHNldHRlckZ1bmN0aW9uID0gcmVzb2x2ZUZ1bmN0
aW9uKHNldHRlckFyZ3VtZW50VHlwZXMsIHNldHRlck5hbWUsIHByb3BlcnR5QWNjZXNzRXhwcmVz
c2lvbi5jb2RlTG9jYXRpb24oKSk7CisgICAgICAgIGlmIChoYXNFcnJvcigpKQorICAgICAgICAg
ICAgcmV0dXJuOwogICAgICAgICBpZiAoc2V0dGVyRnVuY3Rpb24pCiAgICAgICAgICAgICBzZXR0
ZXJSZXR1cm5UeXBlID0gJnNldHRlckZ1bmN0aW9uLT50eXBlKCk7CiAgICAgfQpAQCAtMTQyMCwy
MiArMTU4NywyNCBAQCB2b2lkIENoZWNrZXI6OnZpc2l0KEFTVDo6Q2FsbEV4cHJlc3Npb24mCiAg
ICAgLy8gRG9uJ3QgcmVjdXJzZSBvbiB0aGUgY2FzdFJldHVyblR5cGUsIGJlY2F1c2UgaXQncyBn
dWFyYW50ZWVkIHRvIGJlIGEgTmFtZWRUeXBlLCB3aGljaCB3aWxsIGdldCB2aXNpdGVkIGxhdGVy
LgogICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gcmVjdXJzZSB0byB0aGUgc2FtZSBub2RlIHR3aWNl
LgogCi0gICAgTmFtZUNvbnRleHQmIG5hbWVDb250ZXh0ID0gbV9wcm9ncmFtLm5hbWVDb250ZXh0
KCk7Ci0gICAgYXV0byogZnVuY3Rpb25zID0gbmFtZUNvbnRleHQuZ2V0RnVuY3Rpb25zKGNhbGxF
eHByZXNzaW9uLm5hbWUoKSk7Ci0gICAgaWYgKCFmdW5jdGlvbnMpIHsKLSAgICAgICAgaWYgKGF1
dG8qIHR5cGVzID0gbmFtZUNvbnRleHQuZ2V0VHlwZXMoY2FsbEV4cHJlc3Npb24ubmFtZSgpKSkg
ewotICAgICAgICAgICAgaWYgKHR5cGVzLT5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgICAg
IGlmICgoZnVuY3Rpb25zID0gbmFtZUNvbnRleHQuZ2V0RnVuY3Rpb25zKCJvcGVyYXRvciBjYXN0
Il9zdHIpKSkKLSAgICAgICAgICAgICAgICAgICAgY2FsbEV4cHJlc3Npb24uc2V0Q2FzdERhdGEo
KCp0eXBlcylbMF0uZ2V0KCkpOworICAgIGF1dG8qIGZ1bmN0aW9uID0gcmVzb2x2ZUZ1bmN0aW9u
KHR5cGVzLCBjYWxsRXhwcmVzc2lvbi5uYW1lKCksIGNhbGxFeHByZXNzaW9uLmNvZGVMb2NhdGlv
bigpKTsKKyAgICBpZiAoaGFzRXJyb3IoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFm
dW5jdGlvbikgeworICAgICAgICBOYW1lQ29udGV4dCYgbmFtZUNvbnRleHQgPSBtX3Byb2dyYW0u
bmFtZUNvbnRleHQoKTsKKyAgICAgICAgaWYgKGF1dG8qIGNhc3RUeXBlcyA9IG5hbWVDb250ZXh0
LmdldFR5cGVzKGNhbGxFeHByZXNzaW9uLm5hbWUoKSkpIHsKKyAgICAgICAgICAgIGlmIChjYXN0
VHlwZXMtPnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQVNUOjpOYW1lZFR5cGUmIGNh
c3RUeXBlID0gKCpjYXN0VHlwZXMpWzBdLmdldCgpOworICAgICAgICAgICAgICAgIGZ1bmN0aW9u
ID0gcmVzb2x2ZUZ1bmN0aW9uKHR5cGVzLCAib3BlcmF0b3IgY2FzdCJfc3RyLCBjYWxsRXhwcmVz
c2lvbi5jb2RlTG9jYXRpb24oKSwgJmNhc3RUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFz
RXJyb3IoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGlm
IChmdW5jdGlvbikKKyAgICAgICAgICAgICAgICAgICAgY2FsbEV4cHJlc3Npb24uc2V0Q2FzdERh
dGEoY2FzdFR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmICgh
ZnVuY3Rpb25zKSB7Ci0gICAgICAgIHNldEVycm9yKEVycm9yKCJDb3VsZCBub3QgZmluZCBhbnkg
ZnVuY3Rpb25zIHdpdGggYXBwcm9wcmlhdGUgbmFtZS4iLCBjYWxsRXhwcmVzc2lvbi5jb2RlTG9j
YXRpb24oKSkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQogCi0gICAgYXV0byogZnVuY3Rpb24g
PSByZXNvbHZlRnVuY3Rpb24obV9wcm9ncmFtLCBmdW5jdGlvbnMsIHR5cGVzLCBjYWxsRXhwcmVz
c2lvbi5uYW1lKCksIGNhbGxFeHByZXNzaW9uLmNvZGVMb2NhdGlvbigpLCBtX2ludHJpbnNpY3Ms
IGNhbGxFeHByZXNzaW9uLmNhc3RSZXR1cm5UeXBlKCkpOwogICAgIGlmICghZnVuY3Rpb24pIHsK
ICAgICAgICAgLy8gRklYTUU6IEFkZCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIHdoeSB3ZSBj
YW4ndCByZXNvbHZlIHRvIG9uZSBvZiB0aGUgb3ZlcnJpZGVzLgogICAgICAgICAvLyBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwMTMzCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>