<?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>139847</bug_id>
          
          <creation_ts>2014-12-19 16:51:41 -0800</creation_ts>
          <short_desc>BytecodeGenerator &quot;.call&quot; and &quot;.apply&quot; is exponential in nesting depth</short_desc>
          <delta_ts>2022-04-28 10:02:52 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac (Intel)</rep_platform>
          <op_sys>OS X 10.10</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="Mike Fikes">mike</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>benapfiel</cc>
    
    <cc>buildbot</cc>
    
    <cc>chris</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dieter</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>jfbastien</cc>
    
    <cc>kapouer</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mcatanzaro</cc>
    
    <cc>Meanjeanaco</cc>
    
    <cc>mrowe</cc>
    
    <cc>msaboff</cc>
    
    <cc>nekohayo</cc>
    
    <cc>oliver</cc>
    
    <cc>ryanhaddad</cc>
    
    <cc>saam</cc>
    
    <cc>sherbondye</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1057230</commentid>
    <comment_count>0</comment_count>
    <who name="Mike Fikes">mike</who>
    <bug_when>2014-12-19 16:51:41 -0800</bug_when>
    <thetext>If I define a function

inc=function( x ) { return x + 1; }

and make a deeply composed invocation of it

inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc
  (inc(inc(inc(inc(inc(inc(inc(inc(inc(1)))))))))))))))))))))

this will result in the value 22. If I revise the deeply composed expression to instead make use of call, passing in null for this, as

inc.call(null, inc.call(null, inc.call(null, inc.call(null,
  inc.call(null, inc.call(null, inc.call(null, inc.call(null,
    inc.call(null, inc.call(null, inc.call(null, inc.call(null,
      inc.call(null, inc.call(null, inc.call(null, inc.call(null,
        inc.call(null, inc.call(null, inc.call(null, inc.call(null,
          inc.call(null, 1)))))))))))))))))))))

this will also produce the value 22, but on JavaScriptCore this appears to consume O(2^n) memory, where n is the number of nested calls. This can easily exhaust memory; in the case above, evaluating this expression can consume several GB. (This is not the case if I try this JavaScript in Firefox or Chrome.)

What have I done so far includes producing a stack trace for when it fails on iOS, and in that trace, I see a deep call stack (80 to 100 frames) in the JavaScriptCore engine with frames like the following 4 repeated down the stack:

frame #77: 0x00f324dc JavaScriptCore`JSC::CallFunctionCallDotNode::emitBytecode(JSC::BytecodeGenerator&amp;, JSC::RegisterID*) + 1852
frame #78: 0x00f30661 JavaScriptCore`JSC::ArgumentListNode::emitBytecode(JSC::BytecodeGenerator&amp;, JSC::RegisterID*) + 65
frame #79: 0x00bef410 JavaScriptCore`JSC::BytecodeGenerator::emitCall(JSC::OpcodeID, JSC::RegisterID*, JSC::RegisterID*, JSC::ExpectedFunction, JSC::CallArguments&amp;, JSC::JSTextPosition const&amp;, JSC::JSTextPosition const&amp;, JSC::JSTextPosition const&amp;) + 368
frame #80: 0x00bef28d JavaScriptCore`JSC::BytecodeGenerator::emitCall(JSC::RegisterID*, JSC::RegisterID*, JSC::ExpectedFunction, JSC::CallArguments&amp;, JSC::JSTextPosition const&amp;, JSC::JSTextPosition const&amp;, JSC::JSTextPosition const&amp;) + 77

I&apos;ve also done some experimentation where refactoring a few of the inner calls to temporaries will &quot;truncate&quot; the memory doubling behavior and allow things to succeed

var temp1 = inc.call(null, inc.call(null, inc.call(null, inc.call(null,
              inc.call(null, inc.call(null, inc.call(null, 1)))))));

var temp2 = inc.call(null, inc.call(null, inc.call(null, inc.call(null,
              inc.call(null, inc.call(null, inc.call(null, temp1)))))));

inc.call(null, inc.call(null, inc.call(null, inc.call(null,
  inc.call(null, inc.call(null, inc.call(null, temp2)))))));
  
This makes me thinks that perhaps this is simply a bug with the way JavaScriptCore evaluates deeply nested call invocations.

Steps to Reproduce:
1. Get set up to execute JavaScript in JavaScriptCore. (Go to jsfiddle.net with Safari, for example).
2. Evaluate the &quot;inc&quot; function definition in the Description
3. Evaluate the deeply composed &quot;inc.call&quot; expression in the Description
4. You could wrap the result of the &quot;inc.call&quot; in an alert call. The entire JavaScript is:

inc=function( x ) { return x + 1; }

alert(inc.call(null, inc.call(null, inc.call(null, inc.call(null,
  inc.call(null, inc.call(null, inc.call(null, inc.call(null,
    inc.call(null, inc.call(null, inc.call(null, inc.call(null,
      inc.call(null, inc.call(null, inc.call(null, inc.call(null,
        inc.call(null, inc.call(null, inc.call(null, inc.call(null,
          inc.call(null, 1))))))))))))))))))))))

Expected Results:
This should result in the number 22 being evaluated quickly.

Actual Results:
The number 22 is produced, but only after several seconds transpire. Additionally, if you watch in Activity Monitor, you will see several GB being consumed.

Version:
iOS 7 &amp; 8, Yosemite. On Yosemite: 8.0.2 (10600.2.5)

Notes:


Configuration:
This occurs on Safari on iOS 7, and 8, and on Safari on Yosemite. Haven&apos;t tested on Mavericks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1057322</commentid>
    <comment_count>1</comment_count>
    <who name="Jérémy Lal">kapouer</who>
    <bug_when>2014-12-21 13:43:28 -0800</bug_when>
    <thetext>Confirmed reproduced on Linux debian jessie using webkit2gtk 2.6.2 on epiphany browser. WebKitWebProcess goes 100% CPU and consumes many gigabytes as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1057324</commentid>
    <comment_count>2</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2014-12-21 14:07:18 -0800</bug_when>
    <thetext>&lt;rdar://problem/19321122&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1057346</commentid>
    <comment_count>3</comment_count>
    <who name="Chris Aljoudi">chris</who>
    <bug_when>2014-12-21 18:09:04 -0800</bug_when>
    <thetext>I&apos;ve been able to reproduce using run-jsc from the command line (OS X 10.10.2).

The &quot;delay&quot; happens BEFORE any of the functions ever gets to be called. To see this, you can modify the inc function:

inc = function(x) {
    debug(x);
    return x + 1;
};

The observed behavior is: long delay with NO OUTPUT (suggesting the function calls aren&apos;t actually &apos;happening&apos;), then all output is emitted quickly as expected.

Tried using -p with jsc to get a profile, but jsc kept running and it started eating huge amounts of memory (&gt; 16GBs just for the test case running with -p).

I&apos;ll investigate the issue some more.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1057372</commentid>
    <comment_count>4</comment_count>
    <who name="Mike Fikes">mike</who>
    <bug_when>2014-12-22 04:50:07 -0800</bug_when>
    <thetext>I was able to reproduce this on an older PowerPC Mac running OS X 10.4.11 and Safari 4.1.3 (circa 2010).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1276131</commentid>
    <comment_count>5</comment_count>
    <who name="Dieter Komendera">dieter</who>
    <bug_when>2017-02-13 00:51:11 -0800</bug_when>
    <thetext>This still reproduces with Safari Technology Preview Release 23 (Safari 10.2, WebKit 12604.1.5)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1276858</commentid>
    <comment_count>6</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-14 12:03:56 -0800</bug_when>
    <thetext>My guess is we&apos;re recursively emitting bytecode in a way that has exponential blowup.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1276859</commentid>
    <comment_count>7</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-02-14 12:06:52 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; My guess is we&apos;re recursively emitting bytecode in a way that has
&gt; exponential blowup.

Yeah that&apos;s totally what&apos;s happening.  That&apos;s hilarious.

We should just have a back-off on that optimization.  Like, maintain a count of how deep in the &quot;doubling&quot; due to .call, .apply, or other jneq_ptr-based opts.  If more than K deep then don&apos;t do the optimization.

Probably the most optimal way to do it would be upside down: don&apos;t do the optimization if there are more than K people below you in the tree who want to do it, so that the optimization kicks in for the leaves of that gross call tree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1276860</commentid>
    <comment_count>8</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-14 12:08:45 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; My guess is we&apos;re recursively emitting bytecode in a way that has
&gt; exponential blowup.

Yup. This is indeed what&apos;s happening.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1276861</commentid>
    <comment_count>9</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-14 12:09:06 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #6)
&gt; &gt; My guess is we&apos;re recursively emitting bytecode in a way that has
&gt; &gt; exponential blowup.
&gt; 
&gt; Yup. This is indeed what&apos;s happening.

We generated 134217673 bytecodes for this function!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1276862</commentid>
    <comment_count>10</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-02-14 12:09:41 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #8)
&gt; &gt; (In reply to comment #6)
&gt; &gt; &gt; My guess is we&apos;re recursively emitting bytecode in a way that has
&gt; &gt; &gt; exponential blowup.
&gt; &gt; 
&gt; &gt; Yup. This is indeed what&apos;s happening.
&gt; 
&gt; We generated 134217673 bytecodes for this function!

That&apos;s epic!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1276863</commentid>
    <comment_count>11</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-02-14 12:10:50 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; My guess is we&apos;re recursively emitting bytecode in a way that has
&gt; &gt; exponential blowup.
&gt; 
&gt; Yeah that&apos;s totally what&apos;s happening.  That&apos;s hilarious.
&gt; 
&gt; We should just have a back-off on that optimization.  Like, maintain a count
&gt; of how deep in the &quot;doubling&quot; due to .call, .apply, or other jneq_ptr-based
&gt; opts.  If more than K deep then don&apos;t do the optimization.
&gt; 
&gt; Probably the most optimal way to do it would be upside down: don&apos;t do the
&gt; optimization if there are more than K people below you in the tree who want
&gt; to do it, so that the optimization kicks in for the leaves of that gross
&gt; call tree.

Yeah this sounds reasonable to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1277157</commentid>
    <comment_count>12</comment_count>
    <who name="Dieter Komendera">dieter</who>
    <bug_when>2017-02-15 05:49:33 -0800</bug_when>
    <thetext>For some context, this issue was found here: http://dev.clojure.org/jira/browse/CLJS-910</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298042</commentid>
    <comment_count>13</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-17 15:04:54 -0700</bug_when>
    <thetext>patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298101</commentid>
    <comment_count>14</comment_count>
      <attachid>307321</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-17 17:03:33 -0700</bug_when>
    <thetext>Created attachment 307321
WIP

needs a changelog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298129</commentid>
    <comment_count>15</comment_count>
      <attachid>307331</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-17 18:27:19 -0700</bug_when>
    <thetext>Created attachment 307331
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298136</commentid>
    <comment_count>16</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-17 19:11:00 -0700</bug_when>
    <thetext>Hmmm, something looks wrong. I ran tests locally where we always force the &quot;slow&quot; path, and some tests are failing. I think this means that our bytecode is already slightly broken, since we emit the slow path alongside a bytecode branch. I&apos;m gonna try to figure out why tests are failing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298137</commentid>
    <comment_count>17</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-17 19:12:03 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #16)
&gt; Hmmm, something looks wrong. I ran tests locally where we always force the
&gt; &quot;slow&quot; path, and some tests are failing. I think this means that our
&gt; bytecode is already slightly broken, since we emit the slow path alongside a
&gt; bytecode branch. I&apos;m gonna try to figure out why tests are failing.

Actually, it&apos;s fine. The slow path just emits a different error message.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298150</commentid>
    <comment_count>18</comment_count>
      <attachid>307331</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2017-04-17 20:10:32 -0700</bug_when>
    <thetext>Comment on attachment 307331
patch

lgtm</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298166</commentid>
    <comment_count>19</comment_count>
      <attachid>307331</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-04-17 22:01:20 -0700</bug_when>
    <thetext>Comment on attachment 307331
patch

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

LGTM too with some suggestions and comments.

&gt; Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:1206
&gt; +    if (m_callOrApplyChildDepth &gt; 4 &amp;&amp; emitCallCheck) {

The ChangeLog said 6, but you&apos;re using a limit of 4 here.
Also, should this be &gt;= instead of &gt; because distance of the innermost child from itself is 0, and you wanted to allow up to k levels of calls out from the innermost child, right?  Or did I misunderstand your intent?

Please also use a symbolic constant here instead of a literal?  Maybe define the constant at the top of this file?
Alternatively, if this you think this may make a difference for performance tuning, use a new JSC option instead.

&gt; Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:1286
&gt; +    if (m_callOrApplyChildDepth &gt; 4 &amp;&amp; emitCallCheck) {

Ditto.

&gt; Source/JavaScriptCore/parser/Parser.h:890
&gt; +    struct CallOrApplyDepth {

I suggest calling this CallOrApplyDepthScope since it is used like a scope.  It&apos;ll also make the above &quot;callOrApplyDepth ? callOrApplyDepth-&gt;maxChildDepth() : 0&quot; line read better as &quot;callOrApplyDepthScope ? callOrApplyDepthScope-&gt;maxChildDepth() : 0&quot;.  I was confused at first when I read &quot;callOrApplyDepth-&gt;maxChildDepth()&quot;.

&gt; Source/JavaScriptCore/parser/Parser.h:895
&gt; +            , m_childDepth(m_depth)

I suggest renaming this to m_depthOfInnermostChild.  The name m_childDepth is a bit ambiguous and can be confused with the depth of my immediate child when this value is actually for tracking the depth of the innermost child.

&gt; Source/JavaScriptCore/parser/Parser.h:900
&gt; +        size_t maxChildDepth() const

I suggest naming this distanceFromInnermostChild().  The name maxChildDepth() is a bit confusing to me because &quot;m_childDepth&quot; (or my preferred &quot;m_depthOfInnermostChild&quot;) is an absolute value set from the depth value that each CallOrApplyDepthScope is at, while the value returned by this function is actually a relative value of distance from the innermost child.  I suggested &quot;distanceFrom...&quot; which it implies a relative value with the innermost child as the reference.

Similarly, I suggest renaming the argument / parameter values to match m_depthOfInnermostChild or distanceFromInnermostChild as appropriate.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298194</commentid>
    <comment_count>20</comment_count>
      <attachid>307331</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-04-17 23:43:57 -0700</bug_when>
    <thetext>Comment on attachment 307331
patch

Clearing flags on attachment: 307331

Committed r215453: &lt;http://trac.webkit.org/changeset/215453&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298195</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-04-17 23:43:59 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298324</commentid>
    <comment_count>22</comment_count>
    <who name="Ryan Haddad">ryanhaddad</who>
    <bug_when>2017-04-18 09:49:43 -0700</bug_when>
    <thetext>The test for this change is failing on debug bots: 

https://build.webkit.org/builders/Apple%20Sierra%20Debug%20JSC%20%28Tests%29/builds/191

stress/call-apply-exponential-bytecode-size.js.default: Exception: RangeError: Maximum call stack size exceeded.
stress/call-apply-exponential-bytecode-size.js.default: eval@[native code]
stress/call-apply-exponential-bytecode-size.js.default: randomApplyOrCall@call-apply-exponential-bytecode-size.js:40:16
stress/call-apply-exponential-bytecode-size.js.default: global code@call-apply-exponential-bytecode-size.js:44:25
stress/call-apply-exponential-bytecode-size.js.default: ERROR: Unexpected exit code: 3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298364</commentid>
    <comment_count>23</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-18 11:39:55 -0700</bug_when>
    <thetext>(In reply to Ryan Haddad from comment #22)
&gt; The test for this change is failing on debug bots: 
&gt; 
&gt; https://build.webkit.org/builders/Apple%20Sierra%20Debug%20JSC%20%28Tests%29/
&gt; builds/191
&gt; 
&gt; stress/call-apply-exponential-bytecode-size.js.default: Exception:
&gt; RangeError: Maximum call stack size exceeded.
&gt; stress/call-apply-exponential-bytecode-size.js.default: eval@[native code]
&gt; stress/call-apply-exponential-bytecode-size.js.default:
&gt; randomApplyOrCall@call-apply-exponential-bytecode-size.js:40:16
&gt; stress/call-apply-exponential-bytecode-size.js.default: global
&gt; code@call-apply-exponential-bytecode-size.js:44:25
&gt; stress/call-apply-exponential-bytecode-size.js.default: ERROR: Unexpected
&gt; exit code: 3

Will fix shortly as I address Mark&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1298377</commentid>
    <comment_count>24</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-18 12:02:55 -0700</bug_when>
    <thetext>Addressed Mark&apos;s comments and hopefully the debug stack overflow in:
https://trac.webkit.org/changeset/215474/webkit</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>307321</attachid>
            <date>2017-04-17 17:03:33 -0700</date>
            <delta_ts>2017-04-17 18:27:19 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>21265</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvc3RyZXNzL2NhbGwtYXBwbHktZXhwb25lbnRpYWwtYnl0ZWNvZGUtc2l6
ZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKU1Rlc3RzL3N0cmVzcy9jYWxsLWFwcGx5LWV4cG9uZW50aWFs
LWJ5dGVjb2RlLXNpemUuanMJKG5vbmV4aXN0ZW50KQorKysgSlNUZXN0cy9zdHJlc3MvY2FsbC1h
cHBseS1leHBvbmVudGlhbC1ieXRlY29kZS1zaXplLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMTA0IEBACisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIGFzc2VydChiKSB7CisgICAgaWYg
KCFiKQorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKK30KKworY29uc3QgaW5jID0gKHgsIHkp
ID0+IHsgcmV0dXJuIHggKyAxOyB9Citjb25zdCBpbmMyID0gKHgsIHkpID0+IHsgcmV0dXJuIHkg
PyB5ICsgMSA6IHggKyAxOyB9CitmdW5jdGlvbiBiYXIoKSB7CisgICAgcmV0dXJuIGluYy5jYWxs
KG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsCisgICAg
ICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChu
dWxsLAorICAgICAgICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxs
LCBpbmMuY2FsbChudWxsLAorICAgICAgICAgIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGws
IGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsCisgICAgICAgICAgICBpbmMuY2FsbChudWxs
LCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgICAg
ICAgICBpbmMuY2FsbChudWxsLCAxKSkpKSkpKSkpKSkpKSkpKSkpKSkpOworfQorYXNzZXJ0KGJh
cigpID09PSAyMik7CisKK2Z1bmN0aW9uIHJhbmRvbUFwcGx5T3JDYWxsKGJpYXMsIHNpemUsIGRv
bnRTcHJlYWRCaWFzID0gMCkgeworICAgIGxldCBjdXIgPSBgMWA7CisgICAgZm9yIChsZXQgaSA9
IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPj0gYmlhcykg
eworICAgICAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPj0gZG9udFNwcmVhZEJpYXMpCisgICAg
ICAgICAgICAgICAgY3VyID0gYGluYy5jYWxsKG51bGwsICR7Y3VyfSlgOworICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgIGN1ciA9IGBpbmMuY2FsbCguLi5bbnVsbCwgJHtjdXJ9XSlg
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPj0gZG9u
dFNwcmVhZEJpYXMpCisgICAgICAgICAgICAgICAgY3VyID0gYGluYy5hcHBseShudWxsLCBbJHtj
dXJ9XSlgOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN1ciA9IGBpbmMuYXBw
bHkoLi4uW251bGwsIFske2N1cn1dXSlgOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJp
YXMgPiAwLjg1KSB7CisgICAgICAgIGN1ciA9IGBsZXQgcmFuZG9tID0gJHtNYXRoLnJhbmRvbSgp
fTsgJHtjdXJ9YDsKKyAgICB9CisKKyAgICByZXR1cm4gZXZhbChjdXIpOworfQorCithc3NlcnQo
cmFuZG9tQXBwbHlPckNhbGwoMCwgMjUwKSA9PT0gMjUxKTsKK2Fzc2VydChyYW5kb21BcHBseU9y
Q2FsbCgxLCAyNTApID09PSAyNTEpOworYXNzZXJ0KHJhbmRvbUFwcGx5T3JDYWxsKDAsIDI1MCwg
MCkgPT09IDI1MSk7Cithc3NlcnQocmFuZG9tQXBwbHlPckNhbGwoMSwgMjUwLCAxKSA9PT0gMjUx
KTsKK2ZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisgICAgYXNzZXJ0KHJhbmRvbUFw
cGx5T3JDYWxsKE1hdGgucmFuZG9tKCksIDI1MCkgPT09IDI1MSk7CisgICAgYXNzZXJ0KHJhbmRv
bUFwcGx5T3JDYWxsKE1hdGgucmFuZG9tKCksIDI1MiwgTWF0aC5yYW5kb20oKSkgPT09IDI1Myk7
Cit9CisKK2Z1bmN0aW9uIGJheigpIHsKKyAgICByZXR1cm4gaW5jLmNhbGwobnVsbCwgaW5jLmNh
bGwobnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwKKyAgICAgIGluYy5jYWxsKG51
bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsCisgICAgICAg
IGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51
bGwsCisgICAgICAgICAgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVs
bCwgaW5jLmNhbGwobnVsbCwKKyAgICAgICAgICAgIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51
bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsCisgICAgICAgICAgICAgIGluYy5jYWxs
KG51bGwsIDEpKSkpKSkpKSkpKSkpKSkpKSkpKSwgCisgICAgICAgaW5jLmNhbGwobnVsbCwgaW5j
LmNhbGwobnVsbCwgMSkpKTsKK30KK2Fzc2VydChiYXooKSA9PT0gMjIpOworCitmdW5jdGlvbiBq
YXooKSB7CisgICAgcmV0dXJuIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxs
KG51bGwsIGluYy5jYWxsKG51bGwsCisgICAgICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxs
LCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgICBpbmMuY2FsbChudWxsLCBp
bmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgICAgIGlu
Yy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGws
CisgICAgICAgICAgICBpbmMuY2FsbChudWxsLCBpbmMuYXBwbHkobnVsbCwgW2luYy5jYWxsKG51
bGwsIGluYy5jYWxsKG51bGwsCisgICAgICAgICAgICAgIGluYy5jYWxsKG51bGwsIDEpKSldKSkp
KSkpKSkpKSkpKSkpKSksCisgICAgICAgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwgaW5j
LmFwcGx5KG51bGwsIFsxXSkpKSk7Cit9Cithc3NlcnQoamF6KCkgPT09IDIyKTsKKworZnVuY3Rp
b24gaGF6KCkgeworICAgIHJldHVybiBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMu
Y2FsbChudWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwo
bnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwKKyAgICAgICAgaW5jLmNhbGwobnVs
bCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwKKyAgICAgICAg
ICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChu
dWxsLAorICAgICAgICAgICAgaW5jLmNhbGwobnVsbCwgaW5jLmFwcGx5KG51bGwsIFtpbmMuY2Fs
bChudWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgICAgICAgICBpbmMuY2FsbChudWxsLCAxKSkp
XSkpKSkpKSkpKSkpKSkpKSkpLAorICAgICAgICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxs
LCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgICAgIGluYy5jYWxsKG51bGws
IGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsCisgICAgICAgICAg
ICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChu
dWxsLAorICAgICAgICAgICAgICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2Fs
bChudWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgICAgICAgICAgIGluYy5jYWxsKG51bGwsIGlu
Yy5hcHBseShudWxsLCBbaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwKKyAgICAgICAgICAg
ICAgICAgIGluYy5jYWxsKG51bGwsIDEpKSldKSkpKSkpKSkpKSkpKSkpKSkpKTsKK30KK2Fzc2Vy
dChoYXooKSA9PT0gMjIpOworCitmdW5jdGlvbiBmb28oKSB7CisgICAgcmV0dXJuIGluYzIuY2Fs
bChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLAor
ICAgICAgaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5j
Mi5jYWxsKG51bGwsCisgICAgICAgIGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5j
Mi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLAorICAgICAgICAgIGluYzIuY2FsbChudWxsLCBp
bmMyLmNhbGwobnVsbCwgaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLAorICAgICAgICAg
ICAgaW5jMi5jYWxsKG51bGwsIGluYzIuYXBwbHkobnVsbCwgW2luYzIuY2FsbChudWxsLCBpbmMy
LmNhbGwobnVsbCwKKyAgICAgICAgICAgICAgaW5jMi5jYWxsKG51bGwsIDEpKSldKSkpKSkpKSkp
KSkpKSkpKSksCisgICAgICAgIGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5jMi5j
YWxsKG51bGwsIGluYzIuY2FsbChudWxsLAorICAgICAgICAgIGluYzIuY2FsbChudWxsLCBpbmMy
LmNhbGwobnVsbCwgaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLAorICAgICAgICAgICAg
aW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5jMi5jYWxs
KG51bGwsCisgICAgICAgICAgICAgIGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5j
Mi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLAorICAgICAgICAgICAgICAgIGluYzIuY2FsbChu
dWxsLCBpbmMyLmFwcGx5KG51bGwsIFtpbmMyLmNhbGwobnVsbCwgaW5jMi5jYWxsKG51bGwsCisg
ICAgICAgICAgICAgICAgICBpbmMyLmNhbGwobnVsbCwgaW5jMi5jYWxsKG51bGwsIGluYy5jYWxs
KG51bGwsIDEpKSkpKV0pKSkpKSkpKSkpKSkpKSkpKSkpOworfQorYXNzZXJ0KGZvbygpID09PSAy
NSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdl
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9O
b2Rlc0NvZGVnZW4uY3BwCShyZXZpc2lvbiAyMTU0MzMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExODks
MjEgKzExODksMzUgQEAgUmVnaXN0ZXJJRCogRnVuY3Rpb25DYWxsRG90Tm9kZTo6ZW1pdEJ5dAog
CiBSZWdpc3RlcklEKiBDYWxsRnVuY3Rpb25DYWxsRG90Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVj
b2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKLSAgICBSZWY8TGFi
ZWw+IHJlYWxDYWxsID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7Ci0gICAgUmVmPExhYmVsPiBlbmQg
PSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdl
bmVyYXRvci5lbWl0Tm9kZShtX2Jhc2UpOwogICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbklu
Zm8oc3ViZXhwcmVzc2lvbkRpdm90KCksIHN1YmV4cHJlc3Npb25TdGFydCgpLCBzdWJleHByZXNz
aW9uRW5kKCkpOwogICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jdGlvbjsKLSAgICBib29sIGVt
aXRDYWxsQ2hlY2sgPSAhZ2VuZXJhdG9yLmlzQnVpbHRpbkZ1bmN0aW9uKCk7Ci0gICAgaWYgKGVt
aXRDYWxsQ2hlY2spIHsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmV0dXJuVmFsdWUgPSBnZW5l
cmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpOworCisgICAgYXV0byBtYWtlRnVuY3Rpb24gPSBb
Jl0gewogICAgICAgICBpZiAobV9iYXNlLT5pc1N1cGVyTm9kZSgpKSB7CiAgICAgICAgICAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gdGhpc1ZhbHVlID0gZ2VuZXJhdG9yLmVuc3VyZVRoaXMoKTsKICAg
ICAgICAgICAgIGZ1bmN0aW9uID0gZ2VuZXJhdG9yLmVtaXRHZXRCeUlkKGdlbmVyYXRvci50ZW1w
RGVzdGluYXRpb24oZHN0KSwgYmFzZS5nZXQoKSwgdGhpc1ZhbHVlLmdldCgpLCBnZW5lcmF0b3Iu
cHJvcGVydHlOYW1lcygpLmJ1aWx0aW5OYW1lcygpLmNhbGxQdWJsaWNOYW1lKCkpOwogICAgICAg
ICB9IGVsc2UKICAgICAgICAgICAgIGZ1bmN0aW9uID0gZ2VuZXJhdG9yLmVtaXRHZXRCeUlkKGdl
bmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgYmFzZS5nZXQoKSwgZ2VuZXJhdG9yLnByb3Bl
cnR5TmFtZXMoKS5idWlsdGluTmFtZXMoKS5jYWxsUHVibGljTmFtZSgpKTsKKyAgICB9OworCisg
ICAgaWYgKG1fY2FsbE9yQXBwbHlDaGlsZERlcHRoID4gNCkgeworICAgICAgICBtYWtlRnVuY3Rp
b24oKTsKKyAgICAgICAgQ2FsbEFyZ3VtZW50cyBjYWxsQXJndW1lbnRzKGdlbmVyYXRvciwgbV9h
cmdzKTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRNb3ZlKGNhbGxBcmd1bWVudHMudGhpc1JlZ2lz
dGVyKCksIGJhc2UuZ2V0KCkpOworICAgICAgICBnZW5lcmF0b3IuZW1pdENhbGxJblRhaWxQb3Np
dGlvbihyZXR1cm5WYWx1ZS5nZXQoKSwgZnVuY3Rpb24uZ2V0KCksIE5vRXhwZWN0ZWRGdW5jdGlv
biwgY2FsbEFyZ3VtZW50cywgZGl2b3QoKSwgZGl2b3RTdGFydCgpLCBkaXZvdEVuZCgpLCBEZWJ1
Z2dhYmxlQ2FsbDo6WWVzKTsKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlLmdldCgpOworICAg
IH0KKworICAgIFJlZjxMYWJlbD4gcmVhbENhbGwgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAg
ICBSZWY8TGFiZWw+IGVuZCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworCisgICAgYm9vbCBlbWl0
Q2FsbENoZWNrID0gIWdlbmVyYXRvci5pc0J1aWx0aW5GdW5jdGlvbigpOworICAgIGlmIChlbWl0
Q2FsbENoZWNrKSB7CisgICAgICAgIG1ha2VGdW5jdGlvbigpOwogICAgICAgICBnZW5lcmF0b3Iu
ZW1pdEp1bXBJZk5vdEZ1bmN0aW9uQ2FsbChmdW5jdGlvbi5nZXQoKSwgcmVhbENhbGwuZ2V0KCkp
OwogICAgIH0KLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmV0dXJuVmFsdWUgPSBnZW5lcmF0b3Iu
ZmluYWxEZXN0aW5hdGlvbihkc3QpOwogICAgIHsKICAgICAgICAgaWYgKG1fYXJncy0+bV9saXN0
Tm9kZSAmJiBtX2FyZ3MtPm1fbGlzdE5vZGUtPm1fZXhwciAmJiBtX2FyZ3MtPm1fbGlzdE5vZGUt
Pm1fZXhwci0+aXNTcHJlYWRFeHByZXNzaW9uKCkpIHsKICAgICAgICAgICAgIFNwcmVhZEV4cHJl
c3Npb25Ob2RlKiBzcHJlYWQgPSBzdGF0aWNfY2FzdDxTcHJlYWRFeHByZXNzaW9uTm9kZSo+KG1f
YXJncy0+bV9saXN0Tm9kZS0+bV9leHByKTsKQEAgLTEyNTYsMTkgKzEyNzAsMzEgQEAgUmVnaXN0
ZXJJRCogQXBwbHlGdW5jdGlvbkNhbGxEb3ROb2RlOjplbQogICAgIC8vIGZ1bmN0aW9uLmFwcGx5
KHRoaXNBcmcsIFthcmcwLCBhcmcxLCAuLi5dKSAtPiBjYW4gYmUgdHJpdmlhbGx5IGNvZXJjZWQg
aW50byBmdW5jdGlvbi5jYWxsKHRoaXNBcmcsIGFyZzAsIGFyZzEsIC4uLikgYW5kIHNhdmVzIG9i
amVjdCBhbGxvY2F0aW9uCiAgICAgYm9vbCBtYXlCZUNhbGwgPSBhcmVUcml2aWFsQXBwbHlBcmd1
bWVudHMobV9hcmdzKTsKIAotICAgIFJlZjxMYWJlbD4gcmVhbENhbGwgPSBnZW5lcmF0b3IubmV3
TGFiZWwoKTsKLSAgICBSZWY8TGFiZWw+IGVuZCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwotICAg
IFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fYmFzZSk7Ci0g
ICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhzdWJleHByZXNzaW9uRGl2b3QoKSwgc3Vi
ZXhwcmVzc2lvblN0YXJ0KCksIHN1YmV4cHJlc3Npb25FbmQoKSk7CiAgICAgUmVmUHRyPFJlZ2lz
dGVySUQ+IGZ1bmN0aW9uOwotICAgIFJlZlB0cjxSZWdpc3RlcklEPiByZXR1cm5WYWx1ZSA9IGdl
bmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgZnVuY3Rpb24uZ2V0KCkpOwotICAgIGJvb2wg
ZW1pdENhbGxDaGVjayA9ICFnZW5lcmF0b3IuaXNCdWlsdGluRnVuY3Rpb24oKTsKLSAgICBpZiAo
ZW1pdENhbGxDaGVjaykgeworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9y
LmVtaXROb2RlKG1fYmFzZSk7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHJldHVyblZhbHVlID0g
Z2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KTsKKyAgICBhdXRvIG1ha2VGdW5jdGlvbiA9
IFsmXSB7CiAgICAgICAgIGlmIChtX2Jhc2UtPmlzU3VwZXJOb2RlKCkpIHsKICAgICAgICAgICAg
IFJlZlB0cjxSZWdpc3RlcklEPiB0aGlzVmFsdWUgPSBnZW5lcmF0b3IuZW5zdXJlVGhpcygpOwog
ICAgICAgICAgICAgZnVuY3Rpb24gPSBnZW5lcmF0b3IuZW1pdEdldEJ5SWQoZ2VuZXJhdG9yLnRl
bXBEZXN0aW5hdGlvbihkc3QpLCBiYXNlLmdldCgpLCB0aGlzVmFsdWUuZ2V0KCksIGdlbmVyYXRv
ci5wcm9wZXJ0eU5hbWVzKCkuYnVpbHRpbk5hbWVzKCkuYXBwbHlQdWJsaWNOYW1lKCkpOwogICAg
ICAgICB9IGVsc2UKICAgICAgICAgICAgIGZ1bmN0aW9uID0gZ2VuZXJhdG9yLmVtaXRHZXRCeUlk
KGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgYmFzZS5nZXQoKSwgZ2VuZXJhdG9yLnBy
b3BlcnR5TmFtZXMoKS5idWlsdGluTmFtZXMoKS5hcHBseVB1YmxpY05hbWUoKSk7CisgICAgfTsK
KworICAgIGlmIChtX2NhbGxPckFwcGx5Q2hpbGREZXB0aCA+IDQpIHsKKyAgICAgICAgbWFrZUZ1
bmN0aW9uKCk7CisgICAgICAgIENhbGxBcmd1bWVudHMgY2FsbEFyZ3VtZW50cyhnZW5lcmF0b3Is
IG1fYXJncyk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0TW92ZShjYWxsQXJndW1lbnRzLnRoaXNS
ZWdpc3RlcigpLCBiYXNlLmdldCgpKTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRDYWxsSW5UYWls
UG9zaXRpb24ocmV0dXJuVmFsdWUuZ2V0KCksIGZ1bmN0aW9uLmdldCgpLCBOb0V4cGVjdGVkRnVu
Y3Rpb24sIGNhbGxBcmd1bWVudHMsIGRpdm90KCksIGRpdm90U3RhcnQoKSwgZGl2b3RFbmQoKSwg
RGVidWdnYWJsZUNhbGw6Olllcyk7CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZS5nZXQoKTsK
KyAgICB9CisKKyAgICBSZWY8TGFiZWw+IHJlYWxDYWxsID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7
CisgICAgUmVmPExhYmVsPiBlbmQgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICBnZW5lcmF0
b3IuZW1pdEV4cHJlc3Npb25JbmZvKHN1YmV4cHJlc3Npb25EaXZvdCgpLCBzdWJleHByZXNzaW9u
U3RhcnQoKSwgc3ViZXhwcmVzc2lvbkVuZCgpKTsKKyAgICBib29sIGVtaXRDYWxsQ2hlY2sgPSAh
Z2VuZXJhdG9yLmlzQnVpbHRpbkZ1bmN0aW9uKCk7CisgICAgaWYgKGVtaXRDYWxsQ2hlY2spIHsK
KyAgICAgICAgbWFrZUZ1bmN0aW9uKCk7CiAgICAgICAgIGdlbmVyYXRvci5lbWl0SnVtcElmTm90
RnVuY3Rpb25BcHBseShmdW5jdGlvbi5nZXQoKSwgcmVhbENhbGwuZ2V0KCkpOwogICAgIH0KICAg
ICBpZiAobWF5QmVDYWxsKSB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL0FT
VEJ1aWxkZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL0FT
VEJ1aWxkZXIuaAkocmV2aXNpb24gMjE1NDMzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Bh
cnNlci9BU1RCdWlsZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEyOSw3ICsxMjksNyBAQCBwdWJs
aWM6CiAgICAgc3RhdGljIGNvbnN0IGludCAgRG9udEJ1aWxkU3RyaW5ncyA9IDA7CiAKICAgICBF
eHByZXNzaW9uTm9kZSogbWFrZUJpbmFyeU5vZGUoY29uc3QgSlNUb2tlbkxvY2F0aW9uJiwgaW50
IHRva2VuLCBzdGQ6OnBhaXI8RXhwcmVzc2lvbk5vZGUqLCBCaW5hcnlPcEluZm8+LCBzdGQ6OnBh
aXI8RXhwcmVzc2lvbk5vZGUqLCBCaW5hcnlPcEluZm8+KTsKLSAgICBFeHByZXNzaW9uTm9kZSog
bWFrZUZ1bmN0aW9uQ2FsbE5vZGUoY29uc3QgSlNUb2tlbkxvY2F0aW9uJiwgRXhwcmVzc2lvbk5v
ZGUqIGZ1bmMsIEFyZ3VtZW50c05vZGUqIGFyZ3MsIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZv
dFN0YXJ0LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3QsIGNvbnN0IEpTVGV4dFBvc2l0aW9u
JiBkaXZvdEVuZCk7CisgICAgRXhwcmVzc2lvbk5vZGUqIG1ha2VGdW5jdGlvbkNhbGxOb2RlKGNv
bnN0IEpTVG9rZW5Mb2NhdGlvbiYsIEV4cHJlc3Npb25Ob2RlKiBmdW5jLCBBcmd1bWVudHNOb2Rl
KiBhcmdzLCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RTdGFydCwgY29uc3QgSlNUZXh0UG9z
aXRpb24mIGRpdm90LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RFbmQsIHNpemVfdCBjYWxs
T3JBcHBseUNoaWxkRGVwdGgpOwogCiAgICAgSlNDOjpTb3VyY2VFbGVtZW50cyogY3JlYXRlU291
cmNlRWxlbWVudHMoKSB7IHJldHVybiBuZXcgKG1fcGFyc2VyQXJlbmEpIEpTQzo6U291cmNlRWxl
bWVudHMoKTsgfQogCkBAIC0xMzAxLDcgKzEzMDEsNyBAQCBFeHByZXNzaW9uTm9kZSogQVNUQnVp
bGRlcjo6bWFrZUJpdFhPck5vCiAgICAgcmV0dXJuIG5ldyAobV9wYXJzZXJBcmVuYSkgQml0WE9y
Tm9kZShsb2NhdGlvbiwgZXhwcjEsIGV4cHIyLCByaWdodEhhc0Fzc2lnbm1lbnRzKTsKIH0KIAot
RXhwcmVzc2lvbk5vZGUqIEFTVEJ1aWxkZXI6Om1ha2VGdW5jdGlvbkNhbGxOb2RlKGNvbnN0IEpT
VG9rZW5Mb2NhdGlvbiYgbG9jYXRpb24sIEV4cHJlc3Npb25Ob2RlKiBmdW5jLCBBcmd1bWVudHNO
b2RlKiBhcmdzLCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RTdGFydCwgY29uc3QgSlNUZXh0
UG9zaXRpb24mIGRpdm90LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RFbmQpCitFeHByZXNz
aW9uTm9kZSogQVNUQnVpbGRlcjo6bWFrZUZ1bmN0aW9uQ2FsbE5vZGUoY29uc3QgSlNUb2tlbkxv
Y2F0aW9uJiBsb2NhdGlvbiwgRXhwcmVzc2lvbk5vZGUqIGZ1bmMsIEFyZ3VtZW50c05vZGUqIGFy
Z3MsIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdFN0YXJ0LCBjb25zdCBKU1RleHRQb3NpdGlv
biYgZGl2b3QsIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdEVuZCwgc2l6ZV90IGNhbGxPckFw
cGx5Q2hpbGREZXB0aCkKIHsKICAgICBBU1NFUlQoZGl2b3Qub2Zmc2V0ID49IGRpdm90LmxpbmVT
dGFydE9mZnNldCk7CiAgICAgaWYgKGZ1bmMtPmlzU3VwZXJOb2RlKCkpCkBAIC0xMzMzLDkgKzEz
MzMsOSBAQCBFeHByZXNzaW9uTm9kZSogQVNUQnVpbGRlcjo6bWFrZUZ1bmN0aW9uCiAgICAgRG90
QWNjZXNzb3JOb2RlKiBkb3QgPSBzdGF0aWNfY2FzdDxEb3RBY2Nlc3Nvck5vZGUqPihmdW5jKTsK
ICAgICBGdW5jdGlvbkNhbGxEb3ROb2RlKiBub2RlOwogICAgIGlmIChkb3QtPmlkZW50aWZpZXIo
KSA9PSBtX3ZtLT5wcm9wZXJ0eU5hbWVzLT5idWlsdGluTmFtZXMoKS5jYWxsUHVibGljTmFtZSgp
IHx8IGRvdC0+aWRlbnRpZmllcigpID09IG1fdm0tPnByb3BlcnR5TmFtZXMtPmJ1aWx0aW5OYW1l
cygpLmNhbGxQcml2YXRlTmFtZSgpKQotICAgICAgICBub2RlID0gbmV3IChtX3BhcnNlckFyZW5h
KSBDYWxsRnVuY3Rpb25DYWxsRG90Tm9kZShsb2NhdGlvbiwgZG90LT5iYXNlKCksIGRvdC0+aWRl
bnRpZmllcigpLCBhcmdzLCBkaXZvdCwgZGl2b3RTdGFydCwgZGl2b3RFbmQpOworICAgICAgICBu
b2RlID0gbmV3IChtX3BhcnNlckFyZW5hKSBDYWxsRnVuY3Rpb25DYWxsRG90Tm9kZShsb2NhdGlv
biwgZG90LT5iYXNlKCksIGRvdC0+aWRlbnRpZmllcigpLCBhcmdzLCBkaXZvdCwgZGl2b3RTdGFy
dCwgZGl2b3RFbmQsIGNhbGxPckFwcGx5Q2hpbGREZXB0aCk7CiAgICAgZWxzZSBpZiAoZG90LT5p
ZGVudGlmaWVyKCkgPT0gbV92bS0+cHJvcGVydHlOYW1lcy0+YnVpbHRpbk5hbWVzKCkuYXBwbHlQ
dWJsaWNOYW1lKCkgfHwgZG90LT5pZGVudGlmaWVyKCkgPT0gbV92bS0+cHJvcGVydHlOYW1lcy0+
YnVpbHRpbk5hbWVzKCkuYXBwbHlQcml2YXRlTmFtZSgpKQotICAgICAgICBub2RlID0gbmV3ICht
X3BhcnNlckFyZW5hKSBBcHBseUZ1bmN0aW9uQ2FsbERvdE5vZGUobG9jYXRpb24sIGRvdC0+YmFz
ZSgpLCBkb3QtPmlkZW50aWZpZXIoKSwgYXJncywgZGl2b3QsIGRpdm90U3RhcnQsIGRpdm90RW5k
KTsKKyAgICAgICAgbm9kZSA9IG5ldyAobV9wYXJzZXJBcmVuYSkgQXBwbHlGdW5jdGlvbkNhbGxE
b3ROb2RlKGxvY2F0aW9uLCBkb3QtPmJhc2UoKSwgZG90LT5pZGVudGlmaWVyKCksIGFyZ3MsIGRp
dm90LCBkaXZvdFN0YXJ0LCBkaXZvdEVuZCwgY2FsbE9yQXBwbHlDaGlsZERlcHRoKTsKICAgICBl
bHNlCiAgICAgICAgIG5vZGUgPSBuZXcgKG1fcGFyc2VyQXJlbmEpIEZ1bmN0aW9uQ2FsbERvdE5v
ZGUobG9jYXRpb24sIGRvdC0+YmFzZSgpLCBkb3QtPmlkZW50aWZpZXIoKSwgYXJncywgZGl2b3Qs
IGRpdm90U3RhcnQsIGRpdm90RW5kKTsKICAgICBub2RlLT5zZXRTdWJleHByZXNzaW9uSW5mbyhk
b3QtPmRpdm90KCksIGRvdC0+ZGl2b3RFbmQoKS5vZmZzZXQpOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL3BhcnNlci9Ob2RlQ29uc3RydWN0b3JzLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3BhcnNlci9Ob2RlQ29uc3RydWN0b3JzLmgJKHJldmlzaW9uIDIxNTQz
MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvTm9kZUNvbnN0cnVjdG9ycy5oCSh3
b3JraW5nIGNvcHkpCkBAIC00MDMsMTMgKzQwMywxNSBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICB7
CiAgICAgfQogCi0gICAgaW5saW5lIENhbGxGdW5jdGlvbkNhbGxEb3ROb2RlOjpDYWxsRnVuY3Rp
b25DYWxsRG90Tm9kZShjb25zdCBKU1Rva2VuTG9jYXRpb24mIGxvY2F0aW9uLCBFeHByZXNzaW9u
Tm9kZSogYmFzZSwgY29uc3QgSWRlbnRpZmllciYgaWRlbnQsIEFyZ3VtZW50c05vZGUqIGFyZ3Ms
IGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdCwgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90
U3RhcnQsIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdEVuZCkKKyAgICBpbmxpbmUgQ2FsbEZ1
bmN0aW9uQ2FsbERvdE5vZGU6OkNhbGxGdW5jdGlvbkNhbGxEb3ROb2RlKGNvbnN0IEpTVG9rZW5M
b2NhdGlvbiYgbG9jYXRpb24sIEV4cHJlc3Npb25Ob2RlKiBiYXNlLCBjb25zdCBJZGVudGlmaWVy
JiBpZGVudCwgQXJndW1lbnRzTm9kZSogYXJncywgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90
LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RTdGFydCwgY29uc3QgSlNUZXh0UG9zaXRpb24m
IGRpdm90RW5kLCBzaXplX3QgY2FsbE9yQXBwbHlDaGlsZERlcHRoKQogICAgICAgICA6IEZ1bmN0
aW9uQ2FsbERvdE5vZGUobG9jYXRpb24sIGJhc2UsIGlkZW50LCBhcmdzLCBkaXZvdCwgZGl2b3RT
dGFydCwgZGl2b3RFbmQpCisgICAgICAgICwgbV9jYWxsT3JBcHBseUNoaWxkRGVwdGgoY2FsbE9y
QXBwbHlDaGlsZERlcHRoKQogICAgIHsKICAgICB9CiAKLSAgICBpbmxpbmUgQXBwbHlGdW5jdGlv
bkNhbGxEb3ROb2RlOjpBcHBseUZ1bmN0aW9uQ2FsbERvdE5vZGUoY29uc3QgSlNUb2tlbkxvY2F0
aW9uJiBsb2NhdGlvbiwgRXhwcmVzc2lvbk5vZGUqIGJhc2UsIGNvbnN0IElkZW50aWZpZXImIGlk
ZW50LCBBcmd1bWVudHNOb2RlKiBhcmdzLCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3QsIGNv
bnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdFN0YXJ0LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2
b3RFbmQpCisgICAgaW5saW5lIEFwcGx5RnVuY3Rpb25DYWxsRG90Tm9kZTo6QXBwbHlGdW5jdGlv
bkNhbGxEb3ROb2RlKGNvbnN0IEpTVG9rZW5Mb2NhdGlvbiYgbG9jYXRpb24sIEV4cHJlc3Npb25O
b2RlKiBiYXNlLCBjb25zdCBJZGVudGlmaWVyJiBpZGVudCwgQXJndW1lbnRzTm9kZSogYXJncywg
Y29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RT
dGFydCwgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90RW5kLCBzaXplX3QgY2FsbE9yQXBwbHlD
aGlsZERlcHRoKQogICAgICAgICA6IEZ1bmN0aW9uQ2FsbERvdE5vZGUobG9jYXRpb24sIGJhc2Us
IGlkZW50LCBhcmdzLCBkaXZvdCwgZGl2b3RTdGFydCwgZGl2b3RFbmQpCisgICAgICAgICwgbV9j
YWxsT3JBcHBseUNoaWxkRGVwdGgoY2FsbE9yQXBwbHlDaGlsZERlcHRoKQogICAgIHsKICAgICB9
CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvTm9kZXMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL05vZGVzLmgJKHJldmlzaW9uIDIxNTQz
MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvTm9kZXMuaAkod29ya2luZyBjb3B5
KQpAQCAtODg0LDE4ICs4ODQsMjAgQEAgbmFtZXNwYWNlIEpTQyB7CiAKICAgICBjbGFzcyBDYWxs
RnVuY3Rpb25DYWxsRG90Tm9kZSA6IHB1YmxpYyBGdW5jdGlvbkNhbGxEb3ROb2RlIHsKICAgICBw
dWJsaWM6Ci0gICAgICAgIENhbGxGdW5jdGlvbkNhbGxEb3ROb2RlKGNvbnN0IEpTVG9rZW5Mb2Nh
dGlvbiYsIEV4cHJlc3Npb25Ob2RlKiBiYXNlLCBjb25zdCBJZGVudGlmaWVyJiwgQXJndW1lbnRz
Tm9kZSosIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdCwgY29uc3QgSlNUZXh0UG9zaXRpb24m
IGRpdm90U3RhcnQsIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdEVuZCk7CisgICAgICAgIENh
bGxGdW5jdGlvbkNhbGxEb3ROb2RlKGNvbnN0IEpTVG9rZW5Mb2NhdGlvbiYsIEV4cHJlc3Npb25O
b2RlKiBiYXNlLCBjb25zdCBJZGVudGlmaWVyJiwgQXJndW1lbnRzTm9kZSosIGNvbnN0IEpTVGV4
dFBvc2l0aW9uJiBkaXZvdCwgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90U3RhcnQsIGNvbnN0
IEpTVGV4dFBvc2l0aW9uJiBkaXZvdEVuZCwgc2l6ZV90IGNhbGxPckFwcGx5Q2hpbGREZXB0aCk7
CiAKICAgICBwcml2YXRlOgogICAgICAgICBSZWdpc3RlcklEKiBlbWl0Qnl0ZWNvZGUoQnl0ZWNv
ZGVHZW5lcmF0b3ImLCBSZWdpc3RlcklEKiA9IDApIG92ZXJyaWRlOworICAgICAgICBzaXplX3Qg
bV9jYWxsT3JBcHBseUNoaWxkRGVwdGg7CiAgICAgfTsKICAgICAKICAgICBjbGFzcyBBcHBseUZ1
bmN0aW9uQ2FsbERvdE5vZGUgOiBwdWJsaWMgRnVuY3Rpb25DYWxsRG90Tm9kZSB7CiAgICAgcHVi
bGljOgotICAgICAgICBBcHBseUZ1bmN0aW9uQ2FsbERvdE5vZGUoY29uc3QgSlNUb2tlbkxvY2F0
aW9uJiwgRXhwcmVzc2lvbk5vZGUqIGJhc2UsIGNvbnN0IElkZW50aWZpZXImLCBBcmd1bWVudHNO
b2RlKiwgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90LCBjb25zdCBKU1RleHRQb3NpdGlvbiYg
ZGl2b3RTdGFydCwgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90RW5kKTsKKyAgICAgICAgQXBw
bHlGdW5jdGlvbkNhbGxEb3ROb2RlKGNvbnN0IEpTVG9rZW5Mb2NhdGlvbiYsIEV4cHJlc3Npb25O
b2RlKiBiYXNlLCBjb25zdCBJZGVudGlmaWVyJiwgQXJndW1lbnRzTm9kZSosIGNvbnN0IEpTVGV4
dFBvc2l0aW9uJiBkaXZvdCwgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90U3RhcnQsIGNvbnN0
IEpTVGV4dFBvc2l0aW9uJiBkaXZvdEVuZCwgc2l6ZV90IGNhbGxPckFwcGx5Q2hpbGREZXB0aCk7
CiAKICAgICBwcml2YXRlOgogICAgICAgICBSZWdpc3RlcklEKiBlbWl0Qnl0ZWNvZGUoQnl0ZWNv
ZGVHZW5lcmF0b3ImLCBSZWdpc3RlcklEKiA9IDApIG92ZXJyaWRlOworICAgICAgICBzaXplX3Qg
bV9jYWxsT3JBcHBseUNoaWxkRGVwdGg7CiAgICAgfTsKIAogICAgIGNsYXNzIERlbGV0ZVJlc29s
dmVOb2RlIDogcHVibGljIEV4cHJlc3Npb25Ob2RlLCBwdWJsaWMgVGhyb3dhYmxlRXhwcmVzc2lv
bkRhdGEgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3BhcnNlci9QYXJzZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvUGFyc2VyLmNwcAkocmV2
aXNpb24gMjE1NDMzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3BhcnNlci9QYXJzZXIuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC00Mzg0LDYgKzQzODQsMjIgQEAgdGVtcGxhdGUgPGNsYXNzIFRy
ZWVCdWlsZGVyPiBUcmVlRXhwcmVzcwogICAgIHJldHVybiBwYXJzZUFzc2lnbm1lbnRFeHByZXNz
aW9uKGNvbnRleHQpOwogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJlZUJ1aWxkZXIsIHR5cGVu
YW1lIFBhcnNlclR5cGUsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpp
c19zYW1lPFRyZWVCdWlsZGVyLCBBU1RCdWlsZGVyPjo6dmFsdWU+Ojp0eXBlPgorc3RhdGljIGlu
bGluZSB2b2lkIHJlY29yZENhbGxPckFwcGx5RGVwdGgoUGFyc2VyVHlwZSogcGFyc2VyLCBWTSYg
dm0sIHN0ZDo6b3B0aW9uYWw8dHlwZW5hbWUgUGFyc2VyVHlwZTo6Q2FsbE9yQXBwbHlEZXB0aD4m
IGNhbGxPckFwcGx5RGVwdGgsIEV4cHJlc3Npb25Ob2RlKiBleHByZXNzaW9uKQoreworICAgIGlm
IChleHByZXNzaW9uLT5pc0RvdEFjY2Vzc29yTm9kZSgpKSB7CisgICAgICAgIERvdEFjY2Vzc29y
Tm9kZSogZG90ID0gc3RhdGljX2Nhc3Q8RG90QWNjZXNzb3JOb2RlKj4oZXhwcmVzc2lvbik7Cisg
ICAgICAgIGJvb2wgaXNDYWxsT3JBcHBseSA9IGRvdC0+aWRlbnRpZmllcigpID09IHZtLnByb3Bl
cnR5TmFtZXMtPmJ1aWx0aW5OYW1lcygpLmNhbGxQdWJsaWNOYW1lKCkgfHwgZG90LT5pZGVudGlm
aWVyKCkgPT0gdm0ucHJvcGVydHlOYW1lcy0+YnVpbHRpbk5hbWVzKCkuYXBwbHlQdWJsaWNOYW1l
KCk7CisgICAgICAgIGlmIChpc0NhbGxPckFwcGx5KQorICAgICAgICAgICAgY2FsbE9yQXBwbHlE
ZXB0aC5lbXBsYWNlKHBhcnNlcik7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJl
ZUJ1aWxkZXIsIHR5cGVuYW1lIFBhcnNlclR5cGUsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjpl
bmFibGVfaWY8c3RkOjppc19zYW1lPFRyZWVCdWlsZGVyLCBTeW50YXhDaGVja2VyPjo6dmFsdWU+
Ojp0eXBlPgorc3RhdGljIGlubGluZSB2b2lkIHJlY29yZENhbGxPckFwcGx5RGVwdGgoUGFyc2Vy
VHlwZSosIFZNJiwgc3RkOjpvcHRpb25hbDx0eXBlbmFtZSBQYXJzZXJUeXBlOjpDYWxsT3JBcHBs
eURlcHRoPiYsIFN5bnRheENoZWNrZXI6OkV4cHJlc3Npb24pCit7Cit9CisKIHRlbXBsYXRlIDx0
eXBlbmFtZSBMZXhlclR5cGU+CiB0ZW1wbGF0ZSA8Y2xhc3MgVHJlZUJ1aWxkZXI+IFRyZWVFeHBy
ZXNzaW9uIFBhcnNlcjxMZXhlclR5cGU+OjpwYXJzZU1lbWJlckV4cHJlc3Npb24oVHJlZUJ1aWxk
ZXImIGNvbnRleHQpCiB7CkBAIC00NDk4LDYgKzQ1MTQsOSBAQCB0ZW1wbGF0ZSA8Y2xhc3MgVHJl
ZUJ1aWxkZXI+IFRyZWVFeHByZXNzCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAg
ICAgIHNpemVfdCB1c2VkVmFyaWFibGVzU2l6ZSA9IGN1cnJlbnRTY29wZSgpLT5jdXJyZW50VXNl
ZFZhcmlhYmxlc1NpemUoKTsKICAgICAgICAgICAgICAgICBKU1RleHRQb3NpdGlvbiBleHByZXNz
aW9uRW5kID0gbGFzdFRva2VuRW5kUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBzdGQ6Om9w
dGlvbmFsPENhbGxPckFwcGx5RGVwdGg+IGNhbGxPckFwcGx5RGVwdGg7CisgICAgICAgICAgICAg
ICAgcmVjb3JkQ2FsbE9yQXBwbHlEZXB0aDxUcmVlQnVpbGRlcj4odGhpcywgKm1fdm0sIGNhbGxP
ckFwcGx5RGVwdGgsIGJhc2UpOworCiAgICAgICAgICAgICAgICAgVHJlZUFyZ3VtZW50cyBhcmd1
bWVudHMgPSBwYXJzZUFyZ3VtZW50cyhjb250ZXh0KTsKIAogICAgICAgICAgICAgICAgIGlmIChi
YXNlSXNBc3luY0tleXdvcmQgJiYgKCFhcmd1bWVudHMgfHwgbWF0Y2goQVJST1dGVU5DVElPTikp
KSB7CkBAIC00NTI1LDcgKzQ1NDQsOCBAQCB0ZW1wbGF0ZSA8Y2xhc3MgVHJlZUJ1aWxkZXI+IFRy
ZWVFeHByZXNzCiAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2NvcGUoKS0+aXNBcnJv
d0Z1bmN0aW9uKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblNjb3BlLT5zZXRJ
bm5lckFycm93RnVuY3Rpb25Vc2VzU3VwZXJDYWxsKCk7CiAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIGJhc2UgPSBjb250ZXh0Lm1ha2VGdW5jdGlvbkNhbGxOb2RlKHN0YXJ0TG9j
YXRpb24sIGJhc2UsIGFyZ3VtZW50cywgZXhwcmVzc2lvblN0YXJ0LCBleHByZXNzaW9uRW5kLCBs
YXN0VG9rZW5FbmRQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBiYXNlID0gY29udGV4dC5t
YWtlRnVuY3Rpb25DYWxsTm9kZShzdGFydExvY2F0aW9uLCBiYXNlLCBhcmd1bWVudHMsIGV4cHJl
c3Npb25TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkVuZCwgbGFzdFRva2Vu
RW5kUG9zaXRpb24oKSwgY2FsbE9yQXBwbHlEZXB0aCA/IGNhbGxPckFwcGx5RGVwdGgtPm1heENo
aWxkRGVwdGgoKSA6IDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9wYXJzZXJTdGF0
ZS5ub25MSFNDb3VudCA9IG5vbkxIU0NvdW50OwogICAgICAgICAgICAgYnJlYWs7CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL1BhcnNlci5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvUGFyc2VyLmgJKHJldmlzaW9uIDIxNTQzMykKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvUGFyc2VyLmgJKHdvcmtpbmcgY29weSkKQEAgLTg4
Nyw2ICs4ODcsMzcgQEAgcHVibGljOgogICAgIEpTVGV4dFBvc2l0aW9uIHBvc2l0aW9uQmVmb3Jl
TGFzdE5ld2xpbmUoKSBjb25zdCB7IHJldHVybiBtX2xleGVyLT5wb3NpdGlvbkJlZm9yZUxhc3RO
ZXdsaW5lKCk7IH0KICAgICBKU1Rva2VuTG9jYXRpb24gbG9jYXRpb25CZWZvcmVMYXN0VG9rZW4o
KSBjb25zdCB7IHJldHVybiBtX2xleGVyLT5sYXN0VG9rZW5Mb2NhdGlvbigpOyB9CiAKKyAgICBz
dHJ1Y3QgQ2FsbE9yQXBwbHlEZXB0aCB7CisgICAgICAgIENhbGxPckFwcGx5RGVwdGgoUGFyc2Vy
KiBwYXJzZXIpCisgICAgICAgICAgICA6IG1fcGFyc2VyKHBhcnNlcikKKyAgICAgICAgICAgICwg
bV9wYXJlbnQocGFyc2VyLT5tX2NhbGxPckFwcGx5RGVwdGgpCisgICAgICAgICAgICAsIG1fZGVw
dGgobV9wYXJlbnQgPyBtX3BhcmVudC0+bV9kZXB0aCArIDEgOiAwKQorICAgICAgICAgICAgLCBt
X2NoaWxkRGVwdGgobV9kZXB0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcGFyc2VyLT5tX2Nh
bGxPckFwcGx5RGVwdGggPSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG1heENo
aWxkRGVwdGgoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQobV9jaGlsZERl
cHRoID49IG1fZGVwdGgpOworICAgICAgICAgICAgcmV0dXJuIG1fY2hpbGREZXB0aCAtIG1fZGVw
dGg7CisgICAgICAgIH0KKworICAgICAgICB+Q2FsbE9yQXBwbHlEZXB0aCgpCisgICAgICAgIHsK
KyAgICAgICAgICAgIGlmIChtX3BhcmVudCkKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+bV9j
aGlsZERlcHRoID0gc3RkOjptYXgobV9jaGlsZERlcHRoLCBtX3BhcmVudC0+bV9jaGlsZERlcHRo
KTsKKyAgICAgICAgICAgIG1fcGFyc2VyLT5tX2NhbGxPckFwcGx5RGVwdGggPSBtX3BhcmVudDsK
KyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICBQYXJzZXIqIG1fcGFyc2VyOwor
ICAgICAgICBDYWxsT3JBcHBseURlcHRoKiBtX3BhcmVudDsKKyAgICAgICAgc2l6ZV90IG1fZGVw
dGg7CisgICAgICAgIHNpemVfdCBtX2NoaWxkRGVwdGg7CisgICAgfTsKKwogcHJpdmF0ZToKICAg
ICBzdHJ1Y3QgQWxsb3dJbk92ZXJyaWRlIHsKICAgICAgICAgQWxsb3dJbk92ZXJyaWRlKFBhcnNl
ciogcGFyc2VyKQpAQCAtMTc4MCw2ICsxODExLDcgQEAgcHJpdmF0ZToKICAgICBib29sIG1faW1t
ZWRpYXRlUGFyZW50QWxsb3dzRnVuY3Rpb25EZWNsYXJhdGlvbkluU3RhdGVtZW50OwogICAgIFJl
ZlB0cjxNb2R1bGVTY29wZURhdGE+IG1fbW9kdWxlU2NvcGVEYXRhOwogICAgIERlYnVnZ2VyUGFy
c2VEYXRhKiBtX2RlYnVnZ2VyUGFyc2VEYXRhOworICAgIENhbGxPckFwcGx5RGVwdGgqIG1fY2Fs
bE9yQXBwbHlEZXB0aCB7IG51bGxwdHIgfTsKIAogICAgIHN0cnVjdCBEZXB0aE1hbmFnZXIgewog
ICAgICAgICBEZXB0aE1hbmFnZXIoaW50KiBkZXB0aCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9wYXJzZXIvU3ludGF4Q2hlY2tlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9wYXJzZXIvU3ludGF4Q2hlY2tlci5oCShyZXZpc2lvbiAyMTU0MzMpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL1N5bnRheENoZWNrZXIuaAkod29ya2luZyBjb3B5KQpA
QCAtMTQzLDcgKzE0Myw3IEBAIHB1YmxpYzoKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRG9u
dEJ1aWxkU3RyaW5ncyA9IExleGVyRmxhZ3NEb250QnVpbGRTdHJpbmdzOwogCiAgICAgaW50IGNy
ZWF0ZVNvdXJjZUVsZW1lbnRzKCkgeyByZXR1cm4gU291cmNlRWxlbWVudHNSZXN1bHQ7IH0KLSAg
ICBFeHByZXNzaW9uVHlwZSBtYWtlRnVuY3Rpb25DYWxsTm9kZShjb25zdCBKU1Rva2VuTG9jYXRp
b24mLCBpbnQsIGludCwgaW50LCBpbnQsIGludCkgeyByZXR1cm4gQ2FsbEV4cHI7IH0KKyAgICBF
eHByZXNzaW9uVHlwZSBtYWtlRnVuY3Rpb25DYWxsTm9kZShjb25zdCBKU1Rva2VuTG9jYXRpb24m
LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgc2l6ZV90KSB7IHJldHVybiBDYWxsRXhwcjsgfQog
ICAgIEV4cHJlc3Npb25UeXBlIGNyZWF0ZUNvbW1hRXhwcihjb25zdCBKU1Rva2VuTG9jYXRpb24m
LCBFeHByZXNzaW9uVHlwZSBleHByKSB7IHJldHVybiBleHByOyB9CiAgICAgRXhwcmVzc2lvblR5
cGUgYXBwZW5kVG9Db21tYUV4cHIoY29uc3QgSlNUb2tlbkxvY2F0aW9uJiwgRXhwcmVzc2lvblR5
cGUmIGhlYWQsIEV4cHJlc3Npb25UeXBlLCBFeHByZXNzaW9uVHlwZSBuZXh0KSB7IGhlYWQgPSBu
ZXh0OyByZXR1cm4gbmV4dDsgfQogICAgIEV4cHJlc3Npb25UeXBlIG1ha2VBc3NpZ25Ob2RlKGNv
bnN0IEpTVG9rZW5Mb2NhdGlvbiYsIEV4cHJlc3Npb25UeXBlLCBPcGVyYXRvciwgRXhwcmVzc2lv
blR5cGUsIGJvb2wsIGJvb2wsIGludCwgaW50LCBpbnQpIHsgcmV0dXJuIEFzc2lnbm1lbnRFeHBy
OyB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>307331</attachid>
            <date>2017-04-17 18:27:19 -0700</date>
            <delta_ts>2017-04-17 23:43:57 -0700</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>24806</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IEpTVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEpTVGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMTU0NDMpCisrKyBKU1Rlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDIyIEBACisyMDE3LTA0LTE3ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUu
Y29tPgorCisgICAgICAgIEJ5dGVjb2RlR2VuZXJhdG9yICIuY2FsbCIgYW5kICIuYXBwbHkiIGlz
IGV4cG9uZW50aWFsIGluIG5lc3RpbmcgZGVwdGgKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTEzOTg0NworICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTkz
MjExMjI+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
KiBzdHJlc3MvY2FsbC1hcHBseS1leHBvbmVudGlhbC1ieXRlY29kZS1zaXplLmpzOiBBZGRlZC4K
KyAgICAgICAgKGFzc2VydCk6CisgICAgICAgIChjb25zdC5pbmMpOgorICAgICAgICAoY29uc3Qu
aW5jMik6CisgICAgICAgIChiYXIpOgorICAgICAgICAocmFuZG9tQXBwbHlPckNhbGwpOgorICAg
ICAgICAoYmF6KToKKyAgICAgICAgKGpheik6CisgICAgICAgIChoYXopOgorICAgICAgICAoZm9v
KToKKwogMjAxNy0wNC0xNiAgSm9zZXBoIFBlY29yYXJvICA8cGVjb3Jhcm9AYXBwbGUuY29tPgog
CiAgICAgICAgIHRlc3QyNjI6IHRlc3QyNjIvdGVzdC9idWlsdC1pbnMvT2JqZWN0L3Byb3RvdHlw
ZS90b0xvY2FsZVN0cmluZy9wcmltaXRpdmVfdGhpc192YWx1ZS5qcwpJbmRleDogSlNUZXN0cy9z
dHJlc3MvY2FsbC1hcHBseS1leHBvbmVudGlhbC1ieXRlY29kZS1zaXplLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIEpTVGVzdHMvc3RyZXNzL2NhbGwtYXBwbHktZXhwb25lbnRpYWwtYnl0ZWNvZGUtc2l6ZS5q
cwkobm9uZXhpc3RlbnQpCisrKyBKU1Rlc3RzL3N0cmVzcy9jYWxsLWFwcGx5LWV4cG9uZW50aWFs
LWJ5dGVjb2RlLXNpemUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMDQgQEAKKyJ1c2Ug
c3RyaWN0IjsKKworZnVuY3Rpb24gYXNzZXJ0KGIpIHsKKyAgICBpZiAoIWIpCisgICAgICAgIHRo
cm93IG5ldyBFcnJvcigpOworfQorCitjb25zdCBpbmMgPSAoeCwgeSkgPT4geyByZXR1cm4geCAr
IDE7IH0KK2NvbnN0IGluYzIgPSAoeCwgeSkgPT4geyByZXR1cm4geSA/IHkgKyAxIDogeCArIDE7
IH0KK2Z1bmN0aW9uIGJhcigpIHsKKyAgICByZXR1cm4gaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwo
bnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwKKyAgICAgIGluYy5jYWxsKG51bGws
IGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsCisgICAgICAgIGlu
Yy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGws
CisgICAgICAgICAgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwg
aW5jLmNhbGwobnVsbCwKKyAgICAgICAgICAgIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGws
IGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsCisgICAgICAgICAgICAgIGluYy5jYWxsKG51
bGwsIDEpKSkpKSkpKSkpKSkpKSkpKSkpKSk7Cit9Cithc3NlcnQoYmFyKCkgPT09IDIyKTsKKwor
ZnVuY3Rpb24gcmFuZG9tQXBwbHlPckNhbGwoYmlhcywgc2l6ZSwgZG9udFNwcmVhZEJpYXMgPSAw
KSB7CisgICAgbGV0IGN1ciA9IGAxYDsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7ICsr
aSkgeworICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA+PSBiaWFzKSB7CisgICAgICAgICAgICBp
ZiAoTWF0aC5yYW5kb20oKSA+PSBkb250U3ByZWFkQmlhcykKKyAgICAgICAgICAgICAgICBjdXIg
PSBgaW5jLmNhbGwobnVsbCwgJHtjdXJ9KWA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgY3VyID0gYGluYy5jYWxsKC4uLltudWxsLCAke2N1cn1dKWA7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA+PSBkb250U3ByZWFkQmlhcykKKyAg
ICAgICAgICAgICAgICBjdXIgPSBgaW5jLmFwcGx5KG51bGwsIFske2N1cn1dKWA7CisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3VyID0gYGluYy5hcHBseSguLi5bbnVsbCwgWyR7
Y3VyfV1dKWA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmlhcyA+IDAuODUpIHsKKyAg
ICAgICAgY3VyID0gYGxldCByYW5kb20gPSAke01hdGgucmFuZG9tKCl9OyAke2N1cn1gOworICAg
IH0KKworICAgIHJldHVybiBldmFsKGN1cik7Cit9CisKK2Fzc2VydChyYW5kb21BcHBseU9yQ2Fs
bCgwLCAyNTApID09PSAyNTEpOworYXNzZXJ0KHJhbmRvbUFwcGx5T3JDYWxsKDEsIDI1MCkgPT09
IDI1MSk7Cithc3NlcnQocmFuZG9tQXBwbHlPckNhbGwoMCwgMjUwLCAwKSA9PT0gMjUxKTsKK2Fz
c2VydChyYW5kb21BcHBseU9yQ2FsbCgxLCAyNTAsIDEpID09PSAyNTEpOworZm9yIChsZXQgaSA9
IDA7IGkgPCAxMDAwOyArK2kpIHsKKyAgICBhc3NlcnQocmFuZG9tQXBwbHlPckNhbGwoTWF0aC5y
YW5kb20oKSwgMjUwKSA9PT0gMjUxKTsKKyAgICBhc3NlcnQocmFuZG9tQXBwbHlPckNhbGwoTWF0
aC5yYW5kb20oKSwgMjUyLCBNYXRoLnJhbmRvbSgpKSA9PT0gMjUzKTsKK30KKworZnVuY3Rpb24g
YmF6KCkgeworICAgIHJldHVybiBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2Fs
bChudWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVs
bCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwKKyAgICAgICAgaW5jLmNhbGwobnVsbCwg
aW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwKKyAgICAgICAgICBp
bmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxs
LAorICAgICAgICAgICAgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVs
bCwgaW5jLmNhbGwobnVsbCwKKyAgICAgICAgICAgICAgaW5jLmNhbGwobnVsbCwgMSkpKSkpKSkp
KSkpKSkpKSkpKSkpLCAKKyAgICAgICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCAxKSkp
OworfQorYXNzZXJ0KGJheigpID09PSAyMik7CisKK2Z1bmN0aW9uIGpheigpIHsKKyAgICByZXR1
cm4gaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwo
bnVsbCwKKyAgICAgIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGws
IGluYy5jYWxsKG51bGwsCisgICAgICAgIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGlu
Yy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsCisgICAgICAgICAgaW5jLmNhbGwobnVsbCwgaW5j
LmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwKKyAgICAgICAgICAgIGlu
Yy5jYWxsKG51bGwsIGluYy5hcHBseShudWxsLCBbaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVs
bCwKKyAgICAgICAgICAgICAgaW5jLmNhbGwobnVsbCwgMSkpKV0pKSkpKSkpKSkpKSkpKSkpKSwK
KyAgICAgICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuYXBwbHkobnVsbCwgWzFd
KSkpKTsKK30KK2Fzc2VydChqYXooKSA9PT0gMjIpOworCitmdW5jdGlvbiBoYXooKSB7CisgICAg
cmV0dXJuIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5j
YWxsKG51bGwsCisgICAgICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChu
dWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgICBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxs
LCBpbmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgICAgIGluYy5jYWxsKG51bGws
IGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsCisgICAgICAgICAg
ICBpbmMuY2FsbChudWxsLCBpbmMuYXBwbHkobnVsbCwgW2luYy5jYWxsKG51bGwsIGluYy5jYWxs
KG51bGwsCisgICAgICAgICAgICAgIGluYy5jYWxsKG51bGwsIDEpKSldKSkpKSkpKSkpKSkpKSkp
KSksCisgICAgICAgIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGws
IGluYy5jYWxsKG51bGwsCisgICAgICAgICAgaW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwg
aW5jLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwKKyAgICAgICAgICAgIGluYy5jYWxsKG51bGws
IGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsCisgICAgICAgICAg
ICAgIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxsKG51bGwsIGluYy5jYWxs
KG51bGwsCisgICAgICAgICAgICAgICAgaW5jLmNhbGwobnVsbCwgaW5jLmFwcGx5KG51bGwsIFtp
bmMuY2FsbChudWxsLCBpbmMuY2FsbChudWxsLAorICAgICAgICAgICAgICAgICAgaW5jLmNhbGwo
bnVsbCwgMSkpKV0pKSkpKSkpKSkpKSkpKSkpKSkpOworfQorYXNzZXJ0KGhheigpID09PSAyMik7
CisKK2Z1bmN0aW9uIGZvbygpIHsKKyAgICByZXR1cm4gaW5jMi5jYWxsKG51bGwsIGluYzIuY2Fs
bChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5jMi5jYWxsKG51bGwsCisgICAgICBpbmMyLmNhbGwo
bnVsbCwgaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwKKyAg
ICAgICAgaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5j
Mi5jYWxsKG51bGwsCisgICAgICAgICAgaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLCBp
bmMyLmNhbGwobnVsbCwgaW5jMi5jYWxsKG51bGwsCisgICAgICAgICAgICBpbmMyLmNhbGwobnVs
bCwgaW5jMi5hcHBseShudWxsLCBbaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLAorICAg
ICAgICAgICAgICBpbmMyLmNhbGwobnVsbCwgMSkpKV0pKSkpKSkpKSkpKSkpKSkpKSwKKyAgICAg
ICAgaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5jMi5j
YWxsKG51bGwsCisgICAgICAgICAgaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLCBpbmMy
LmNhbGwobnVsbCwgaW5jMi5jYWxsKG51bGwsCisgICAgICAgICAgICBpbmMyLmNhbGwobnVsbCwg
aW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwKKyAgICAgICAg
ICAgICAgaW5jMi5jYWxsKG51bGwsIGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5j
Mi5jYWxsKG51bGwsCisgICAgICAgICAgICAgICAgaW5jMi5jYWxsKG51bGwsIGluYzIuYXBwbHko
bnVsbCwgW2luYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwKKyAgICAgICAgICAgICAgICAg
IGluYzIuY2FsbChudWxsLCBpbmMyLmNhbGwobnVsbCwgaW5jLmNhbGwobnVsbCwgMSkpKSkpXSkp
KSkpKSkpKSkpKSkpKSkpKSk7Cit9Cithc3NlcnQoZm9vKCkgPT09IDI1KTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjE1NDMzKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ3IEBACisyMDE3LTA0LTE3
ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAgIEJ5dGVjb2RlR2Vu
ZXJhdG9yICIuY2FsbCIgYW5kICIuYXBwbHkiIGlzIGV4cG9uZW50aWFsIGluIG5lc3RpbmcgZGVw
dGgKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzOTg0
NworICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTkzMjExMjI+CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhlIEJ5dGVjb2RlR2VuZXJhdG9yJ3MgLmFw
cGx5KC4uLikgYW5kIC5jYWxsKC4uLikgY29kZSB3b3VsZAorICAgICAgICBlbWl0IGJ5dGVjb2Rl
IGZvciB0aGUgZXZhbHVhdGlvbiBvZiBpdHMgYXJndW1lbnRzIHR3aWNlLiBUaGlzCisgICAgICAg
IGlzIGV4cG9uZW50aWFsLCBzcGVjaWZpY2FsbHksIDJebiwgd2hlcmUgbiBpcyB0aGUgbmVzdGlu
ZyBkZXB0aCBvZgorICAgICAgICAuY2FsbCguLi4pIG9yIC5hcHBseSguLi4pIGluc2lkZSBvdGhl
ciAuY2FsbCguLi4pIG9yIC5hcHBseSguLi4pLgorICAgICAgICAKKyAgICAgICAgVGhlIHJlYXNv
biB3ZSBlbWl0IGNvZGUgZm9yIHRoZSBhcmd1bWVudHMgdHdpY2UgaXMgdGhhdCB3ZSB0cnkKKyAg
ICAgICAgdG8gZW1pdCBlZmZpY2llbnQgY29kZSBmb3Igd2hlbiAuY2FsbCBvciAuYXBwbHkgaXMg
RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwKKyAgICAgICAgb3IgRnVuY3Rpb24ucHJvdG90eXBlLmFw
cGx5LiBCZWNhdXNlIG9mIHRoaXMsIHdlIGNvbXBhcmUgLmNhbGwvLmFwcGx5IHRvCisgICAgICAg
IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLy5hcHBseSwgYW5kIGlmIHRoZXkncmUgdGhlIHNhbWUs
IHdlIGVtaXQgYSBzcGVjaWFsaXplZAorICAgICAgICBmdW5jdGlvbiBjYWxsIGluIGJ5dGVjb2Rl
LiBPdGhlcndpc2UsIHdlIGVtaXQgdGhlIGdlbmVyYWxpemVkIHZlcnNpb24uCisgICAgICAgIAor
ICAgICAgICBUaGlzIHBhdGNoIG1ha2VzIGl0IHNvIHRoYXQgZWFjaCAuY2FsbCguLi4pIGFuZCAu
YXBwbHkoLi4uKSByZWNvcmRzCisgICAgICAgIGl0cyBtYXggaW5uZXIgbmVzdGluZyBkZXB0aC4g
VGhlbiwgd2Ugb25seSBwZXJmb3JtIHRoZSBvcHRpbWl6YXRpb24KKyAgICAgICAgZm9yIHRoZSBi
b3R0b20gayAod2hlcmUgayA9IDYpIGxheWVycyBvZiB0aGUgbmVzdGluZyB0cmVlLiBUaGUgcmVh
c29uIHdlCisgICAgICAgIGFwcGx5IHRoZSBvcHRpbWl6YXRpb24gdG8gdGhlIGJvdHRvbSBrIGxh
eWVycyBpbnN0ZWFkIG9mIHRvcCBrIGxheWVycworICAgICAgICBpcyB0aGF0IHdlJ2xsIHByb2R1
Y2UgbGVzcyBjb2RlIHRoaXMgd2F5LgorCisgICAgICAgICogYnl0ZWNvbXBpbGVyL05vZGVzQ29k
ZWdlbi5jcHA6CisgICAgICAgIChKU0M6OkNhbGxGdW5jdGlvbkNhbGxEb3ROb2RlOjplbWl0Qnl0
ZWNvZGUpOgorICAgICAgICAoSlNDOjpBcHBseUZ1bmN0aW9uQ2FsbERvdE5vZGU6OmVtaXRCeXRl
Y29kZSk6CisgICAgICAgICogcGFyc2VyL0FTVEJ1aWxkZXIuaDoKKyAgICAgICAgKEpTQzo6QVNU
QnVpbGRlcjo6bWFrZUZ1bmN0aW9uQ2FsbE5vZGUpOgorICAgICAgICAqIHBhcnNlci9Ob2RlQ29u
c3RydWN0b3JzLmg6CisgICAgICAgIChKU0M6OkNhbGxGdW5jdGlvbkNhbGxEb3ROb2RlOjpDYWxs
RnVuY3Rpb25DYWxsRG90Tm9kZSk6CisgICAgICAgIChKU0M6OkFwcGx5RnVuY3Rpb25DYWxsRG90
Tm9kZTo6QXBwbHlGdW5jdGlvbkNhbGxEb3ROb2RlKToKKyAgICAgICAgKiBwYXJzZXIvTm9kZXMu
aDoKKyAgICAgICAgKiBwYXJzZXIvUGFyc2VyLmNwcDoKKyAgICAgICAgKEpTQzo6cmVjb3JkQ2Fs
bE9yQXBwbHlEZXB0aCk6CisgICAgICAgIChKU0M6OlBhcnNlcjxMZXhlclR5cGU+OjpwYXJzZU1l
bWJlckV4cHJlc3Npb24pOgorICAgICAgICAqIHBhcnNlci9QYXJzZXIuaDoKKyAgICAgICAgKEpT
Qzo6UGFyc2VyOjpDYWxsT3JBcHBseURlcHRoOjpDYWxsT3JBcHBseURlcHRoKToKKyAgICAgICAg
KEpTQzo6UGFyc2VyOjpDYWxsT3JBcHBseURlcHRoOjptYXhDaGlsZERlcHRoKToKKyAgICAgICAg
KEpTQzo6UGFyc2VyOjpDYWxsT3JBcHBseURlcHRoOjp+Q2FsbE9yQXBwbHlEZXB0aCk6CisgICAg
ICAgICogcGFyc2VyL1N5bnRheENoZWNrZXIuaDoKKyAgICAgICAgKEpTQzo6U3ludGF4Q2hlY2tl
cjo6bWFrZUZ1bmN0aW9uQ2FsbE5vZGUpOgorCiAyMDE3LTA0LTE3ICBZb3Vlbm4gRmFibGV0ICA8
eW91ZW5uQGFwcGxlLmNvbT4KIAogICAgICAgICBEaXNhYmxlIG91dGRhdGVkIFdyaXRhYmxlU3Ry
ZWFtIEFQSQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0Nv
ZGVnZW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGls
ZXIvTm9kZXNDb2RlZ2VuLmNwcAkocmV2aXNpb24gMjE1NDMzKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
MTg5LDIxICsxMTg5LDM2IEBAIFJlZ2lzdGVySUQqIEZ1bmN0aW9uQ2FsbERvdE5vZGU6OmVtaXRC
eXQKIAogUmVnaXN0ZXJJRCogQ2FsbEZ1bmN0aW9uQ2FsbERvdE5vZGU6OmVtaXRCeXRlY29kZShC
eXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCiB7Ci0gICAgUmVm
PExhYmVsPiByZWFsQ2FsbCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwotICAgIFJlZjxMYWJlbD4g
ZW5kID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CiAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2Ug
PSBnZW5lcmF0b3IuZW1pdE5vZGUobV9iYXNlKTsKICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Np
b25JbmZvKHN1YmV4cHJlc3Npb25EaXZvdCgpLCBzdWJleHByZXNzaW9uU3RhcnQoKSwgc3ViZXhw
cmVzc2lvbkVuZCgpKTsKICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuY3Rpb247Ci0gICAgYm9v
bCBlbWl0Q2FsbENoZWNrID0gIWdlbmVyYXRvci5pc0J1aWx0aW5GdW5jdGlvbigpOwotICAgIGlm
IChlbWl0Q2FsbENoZWNrKSB7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHJldHVyblZhbHVlID0g
Z2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KTsKKworICAgIGF1dG8gbWFrZUZ1bmN0aW9u
ID0gWyZdIHsKICAgICAgICAgaWYgKG1fYmFzZS0+aXNTdXBlck5vZGUoKSkgewogICAgICAgICAg
ICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHRoaXNWYWx1ZSA9IGdlbmVyYXRvci5lbnN1cmVUaGlzKCk7
CiAgICAgICAgICAgICBmdW5jdGlvbiA9IGdlbmVyYXRvci5lbWl0R2V0QnlJZChnZW5lcmF0b3Iu
dGVtcERlc3RpbmF0aW9uKGRzdCksIGJhc2UuZ2V0KCksIHRoaXNWYWx1ZS5nZXQoKSwgZ2VuZXJh
dG9yLnByb3BlcnR5TmFtZXMoKS5idWlsdGluTmFtZXMoKS5jYWxsUHVibGljTmFtZSgpKTsKICAg
ICAgICAgfSBlbHNlCiAgICAgICAgICAgICBmdW5jdGlvbiA9IGdlbmVyYXRvci5lbWl0R2V0QnlJ
ZChnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIGJhc2UuZ2V0KCksIGdlbmVyYXRvci5w
cm9wZXJ0eU5hbWVzKCkuYnVpbHRpbk5hbWVzKCkuY2FsbFB1YmxpY05hbWUoKSk7CisgICAgfTsK
KworICAgIGJvb2wgZW1pdENhbGxDaGVjayA9ICFnZW5lcmF0b3IuaXNCdWlsdGluRnVuY3Rpb24o
KTsKKyAgICBpZiAobV9jYWxsT3JBcHBseUNoaWxkRGVwdGggPiA0ICYmIGVtaXRDYWxsQ2hlY2sp
IHsKKyAgICAgICAgbWFrZUZ1bmN0aW9uKCk7CisgICAgICAgIENhbGxBcmd1bWVudHMgY2FsbEFy
Z3VtZW50cyhnZW5lcmF0b3IsIG1fYXJncyk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0TW92ZShj
YWxsQXJndW1lbnRzLnRoaXNSZWdpc3RlcigpLCBiYXNlLmdldCgpKTsKKyAgICAgICAgZ2VuZXJh
dG9yLmVtaXRDYWxsSW5UYWlsUG9zaXRpb24ocmV0dXJuVmFsdWUuZ2V0KCksIGZ1bmN0aW9uLmdl
dCgpLCBOb0V4cGVjdGVkRnVuY3Rpb24sIGNhbGxBcmd1bWVudHMsIGRpdm90KCksIGRpdm90U3Rh
cnQoKSwgZGl2b3RFbmQoKSwgRGVidWdnYWJsZUNhbGw6Olllcyk7CisgICAgICAgIGdlbmVyYXRv
ci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcmV0dXJuVmFsdWUuZ2V0KCkpOworICAg
ICAgICByZXR1cm4gcmV0dXJuVmFsdWUuZ2V0KCk7CisgICAgfQorCisgICAgUmVmPExhYmVsPiBy
ZWFsQ2FsbCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAgIFJlZjxMYWJlbD4gZW5kID0gZ2Vu
ZXJhdG9yLm5ld0xhYmVsKCk7CisKKyAgICBpZiAoZW1pdENhbGxDaGVjaykgeworICAgICAgICBt
YWtlRnVuY3Rpb24oKTsKICAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wSWZOb3RGdW5jdGlvbkNh
bGwoZnVuY3Rpb24uZ2V0KCksIHJlYWxDYWxsLmdldCgpKTsKICAgICB9Ci0gICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IHJldHVyblZhbHVlID0gZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KTsK
ICAgICB7CiAgICAgICAgIGlmIChtX2FyZ3MtPm1fbGlzdE5vZGUgJiYgbV9hcmdzLT5tX2xpc3RO
b2RlLT5tX2V4cHIgJiYgbV9hcmdzLT5tX2xpc3ROb2RlLT5tX2V4cHItPmlzU3ByZWFkRXhwcmVz
c2lvbigpKSB7CiAgICAgICAgICAgICBTcHJlYWRFeHByZXNzaW9uTm9kZSogc3ByZWFkID0gc3Rh
dGljX2Nhc3Q8U3ByZWFkRXhwcmVzc2lvbk5vZGUqPihtX2FyZ3MtPm1fbGlzdE5vZGUtPm1fZXhw
cik7CkBAIC0xMjU2LDE5ICsxMjcxLDMyIEBAIFJlZ2lzdGVySUQqIEFwcGx5RnVuY3Rpb25DYWxs
RG90Tm9kZTo6ZW0KICAgICAvLyBmdW5jdGlvbi5hcHBseSh0aGlzQXJnLCBbYXJnMCwgYXJnMSwg
Li4uXSkgLT4gY2FuIGJlIHRyaXZpYWxseSBjb2VyY2VkIGludG8gZnVuY3Rpb24uY2FsbCh0aGlz
QXJnLCBhcmcwLCBhcmcxLCAuLi4pIGFuZCBzYXZlcyBvYmplY3QgYWxsb2NhdGlvbgogICAgIGJv
b2wgbWF5QmVDYWxsID0gYXJlVHJpdmlhbEFwcGx5QXJndW1lbnRzKG1fYXJncyk7CiAKLSAgICBS
ZWY8TGFiZWw+IHJlYWxDYWxsID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7Ci0gICAgUmVmPExhYmVs
PiBlbmQgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFz
ZSA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2Jhc2UpOwotICAgIGdlbmVyYXRvci5lbWl0RXhwcmVz
c2lvbkluZm8oc3ViZXhwcmVzc2lvbkRpdm90KCksIHN1YmV4cHJlc3Npb25TdGFydCgpLCBzdWJl
eHByZXNzaW9uRW5kKCkpOwogICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jdGlvbjsKLSAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gcmV0dXJuVmFsdWUgPSBnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlv
bihkc3QsIGZ1bmN0aW9uLmdldCgpKTsKLSAgICBib29sIGVtaXRDYWxsQ2hlY2sgPSAhZ2VuZXJh
dG9yLmlzQnVpbHRpbkZ1bmN0aW9uKCk7Ci0gICAgaWYgKGVtaXRDYWxsQ2hlY2spIHsKKyAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2Jhc2UpOworICAg
IFJlZlB0cjxSZWdpc3RlcklEPiByZXR1cm5WYWx1ZSA9IGdlbmVyYXRvci5maW5hbERlc3RpbmF0
aW9uKGRzdCk7CisgICAgYXV0byBtYWtlRnVuY3Rpb24gPSBbJl0gewogICAgICAgICBpZiAobV9i
YXNlLT5pc1N1cGVyTm9kZSgpKSB7CiAgICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdGhp
c1ZhbHVlID0gZ2VuZXJhdG9yLmVuc3VyZVRoaXMoKTsKICAgICAgICAgICAgIGZ1bmN0aW9uID0g
Z2VuZXJhdG9yLmVtaXRHZXRCeUlkKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgYmFz
ZS5nZXQoKSwgdGhpc1ZhbHVlLmdldCgpLCBnZW5lcmF0b3IucHJvcGVydHlOYW1lcygpLmJ1aWx0
aW5OYW1lcygpLmFwcGx5UHVibGljTmFtZSgpKTsKICAgICAgICAgfSBlbHNlCiAgICAgICAgICAg
ICBmdW5jdGlvbiA9IGdlbmVyYXRvci5lbWl0R2V0QnlJZChnZW5lcmF0b3IudGVtcERlc3RpbmF0
aW9uKGRzdCksIGJhc2UuZ2V0KCksIGdlbmVyYXRvci5wcm9wZXJ0eU5hbWVzKCkuYnVpbHRpbk5h
bWVzKCkuYXBwbHlQdWJsaWNOYW1lKCkpOworICAgIH07CisKKyAgICBib29sIGVtaXRDYWxsQ2hl
Y2sgPSAhZ2VuZXJhdG9yLmlzQnVpbHRpbkZ1bmN0aW9uKCk7CisgICAgaWYgKG1fY2FsbE9yQXBw
bHlDaGlsZERlcHRoID4gNCAmJiBlbWl0Q2FsbENoZWNrKSB7CisgICAgICAgIG1ha2VGdW5jdGlv
bigpOworICAgICAgICBDYWxsQXJndW1lbnRzIGNhbGxBcmd1bWVudHMoZ2VuZXJhdG9yLCBtX2Fy
Z3MpOworICAgICAgICBnZW5lcmF0b3IuZW1pdE1vdmUoY2FsbEFyZ3VtZW50cy50aGlzUmVnaXN0
ZXIoKSwgYmFzZS5nZXQoKSk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0Q2FsbEluVGFpbFBvc2l0
aW9uKHJldHVyblZhbHVlLmdldCgpLCBmdW5jdGlvbi5nZXQoKSwgTm9FeHBlY3RlZEZ1bmN0aW9u
LCBjYWxsQXJndW1lbnRzLCBkaXZvdCgpLCBkaXZvdFN0YXJ0KCksIGRpdm90RW5kKCksIERlYnVn
Z2FibGVDYWxsOjpZZXMpOworICAgICAgICBnZW5lcmF0b3IubW92ZVRvRGVzdGluYXRpb25JZk5l
ZWRlZChkc3QsIHJldHVyblZhbHVlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVl
LmdldCgpOworICAgIH0KKworICAgIFJlZjxMYWJlbD4gcmVhbENhbGwgPSBnZW5lcmF0b3IubmV3
TGFiZWwoKTsKKyAgICBSZWY8TGFiZWw+IGVuZCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAg
IGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oc3ViZXhwcmVzc2lvbkRpdm90KCksIHN1YmV4
cHJlc3Npb25TdGFydCgpLCBzdWJleHByZXNzaW9uRW5kKCkpOworICAgIGlmIChlbWl0Q2FsbENo
ZWNrKSB7CisgICAgICAgIG1ha2VGdW5jdGlvbigpOwogICAgICAgICBnZW5lcmF0b3IuZW1pdEp1
bXBJZk5vdEZ1bmN0aW9uQXBwbHkoZnVuY3Rpb24uZ2V0KCksIHJlYWxDYWxsLmdldCgpKTsKICAg
ICB9CiAgICAgaWYgKG1heUJlQ2FsbCkgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3Bh
cnNlci9BU1RCdWlsZGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Bh
cnNlci9BU1RCdWlsZGVyLmgJKHJldmlzaW9uIDIxNTQzMykKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9wYXJzZXIvQVNUQnVpbGRlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjksNyArMTI5LDcg
QEAgcHVibGljOgogICAgIHN0YXRpYyBjb25zdCBpbnQgIERvbnRCdWlsZFN0cmluZ3MgPSAwOwog
CiAgICAgRXhwcmVzc2lvbk5vZGUqIG1ha2VCaW5hcnlOb2RlKGNvbnN0IEpTVG9rZW5Mb2NhdGlv
biYsIGludCB0b2tlbiwgc3RkOjpwYWlyPEV4cHJlc3Npb25Ob2RlKiwgQmluYXJ5T3BJbmZvPiwg
c3RkOjpwYWlyPEV4cHJlc3Npb25Ob2RlKiwgQmluYXJ5T3BJbmZvPik7Ci0gICAgRXhwcmVzc2lv
bk5vZGUqIG1ha2VGdW5jdGlvbkNhbGxOb2RlKGNvbnN0IEpTVG9rZW5Mb2NhdGlvbiYsIEV4cHJl
c3Npb25Ob2RlKiBmdW5jLCBBcmd1bWVudHNOb2RlKiBhcmdzLCBjb25zdCBKU1RleHRQb3NpdGlv
biYgZGl2b3RTdGFydCwgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90LCBjb25zdCBKU1RleHRQ
b3NpdGlvbiYgZGl2b3RFbmQpOworICAgIEV4cHJlc3Npb25Ob2RlKiBtYWtlRnVuY3Rpb25DYWxs
Tm9kZShjb25zdCBKU1Rva2VuTG9jYXRpb24mLCBFeHByZXNzaW9uTm9kZSogZnVuYywgQXJndW1l
bnRzTm9kZSogYXJncywgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90U3RhcnQsIGNvbnN0IEpT
VGV4dFBvc2l0aW9uJiBkaXZvdCwgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90RW5kLCBzaXpl
X3QgY2FsbE9yQXBwbHlDaGlsZERlcHRoKTsKIAogICAgIEpTQzo6U291cmNlRWxlbWVudHMqIGNy
ZWF0ZVNvdXJjZUVsZW1lbnRzKCkgeyByZXR1cm4gbmV3IChtX3BhcnNlckFyZW5hKSBKU0M6OlNv
dXJjZUVsZW1lbnRzKCk7IH0KIApAQCAtMTMwMSw3ICsxMzAxLDcgQEAgRXhwcmVzc2lvbk5vZGUq
IEFTVEJ1aWxkZXI6Om1ha2VCaXRYT3JObwogICAgIHJldHVybiBuZXcgKG1fcGFyc2VyQXJlbmEp
IEJpdFhPck5vZGUobG9jYXRpb24sIGV4cHIxLCBleHByMiwgcmlnaHRIYXNBc3NpZ25tZW50cyk7
CiB9CiAKLUV4cHJlc3Npb25Ob2RlKiBBU1RCdWlsZGVyOjptYWtlRnVuY3Rpb25DYWxsTm9kZShj
b25zdCBKU1Rva2VuTG9jYXRpb24mIGxvY2F0aW9uLCBFeHByZXNzaW9uTm9kZSogZnVuYywgQXJn
dW1lbnRzTm9kZSogYXJncywgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90U3RhcnQsIGNvbnN0
IEpTVGV4dFBvc2l0aW9uJiBkaXZvdCwgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90RW5kKQor
RXhwcmVzc2lvbk5vZGUqIEFTVEJ1aWxkZXI6Om1ha2VGdW5jdGlvbkNhbGxOb2RlKGNvbnN0IEpT
VG9rZW5Mb2NhdGlvbiYgbG9jYXRpb24sIEV4cHJlc3Npb25Ob2RlKiBmdW5jLCBBcmd1bWVudHNO
b2RlKiBhcmdzLCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RTdGFydCwgY29uc3QgSlNUZXh0
UG9zaXRpb24mIGRpdm90LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RFbmQsIHNpemVfdCBj
YWxsT3JBcHBseUNoaWxkRGVwdGgpCiB7CiAgICAgQVNTRVJUKGRpdm90Lm9mZnNldCA+PSBkaXZv
dC5saW5lU3RhcnRPZmZzZXQpOwogICAgIGlmIChmdW5jLT5pc1N1cGVyTm9kZSgpKQpAQCAtMTMz
Myw5ICsxMzMzLDkgQEAgRXhwcmVzc2lvbk5vZGUqIEFTVEJ1aWxkZXI6Om1ha2VGdW5jdGlvbgog
ICAgIERvdEFjY2Vzc29yTm9kZSogZG90ID0gc3RhdGljX2Nhc3Q8RG90QWNjZXNzb3JOb2RlKj4o
ZnVuYyk7CiAgICAgRnVuY3Rpb25DYWxsRG90Tm9kZSogbm9kZTsKICAgICBpZiAoZG90LT5pZGVu
dGlmaWVyKCkgPT0gbV92bS0+cHJvcGVydHlOYW1lcy0+YnVpbHRpbk5hbWVzKCkuY2FsbFB1Ymxp
Y05hbWUoKSB8fCBkb3QtPmlkZW50aWZpZXIoKSA9PSBtX3ZtLT5wcm9wZXJ0eU5hbWVzLT5idWls
dGluTmFtZXMoKS5jYWxsUHJpdmF0ZU5hbWUoKSkKLSAgICAgICAgbm9kZSA9IG5ldyAobV9wYXJz
ZXJBcmVuYSkgQ2FsbEZ1bmN0aW9uQ2FsbERvdE5vZGUobG9jYXRpb24sIGRvdC0+YmFzZSgpLCBk
b3QtPmlkZW50aWZpZXIoKSwgYXJncywgZGl2b3QsIGRpdm90U3RhcnQsIGRpdm90RW5kKTsKKyAg
ICAgICAgbm9kZSA9IG5ldyAobV9wYXJzZXJBcmVuYSkgQ2FsbEZ1bmN0aW9uQ2FsbERvdE5vZGUo
bG9jYXRpb24sIGRvdC0+YmFzZSgpLCBkb3QtPmlkZW50aWZpZXIoKSwgYXJncywgZGl2b3QsIGRp
dm90U3RhcnQsIGRpdm90RW5kLCBjYWxsT3JBcHBseUNoaWxkRGVwdGgpOwogICAgIGVsc2UgaWYg
KGRvdC0+aWRlbnRpZmllcigpID09IG1fdm0tPnByb3BlcnR5TmFtZXMtPmJ1aWx0aW5OYW1lcygp
LmFwcGx5UHVibGljTmFtZSgpIHx8IGRvdC0+aWRlbnRpZmllcigpID09IG1fdm0tPnByb3BlcnR5
TmFtZXMtPmJ1aWx0aW5OYW1lcygpLmFwcGx5UHJpdmF0ZU5hbWUoKSkKLSAgICAgICAgbm9kZSA9
IG5ldyAobV9wYXJzZXJBcmVuYSkgQXBwbHlGdW5jdGlvbkNhbGxEb3ROb2RlKGxvY2F0aW9uLCBk
b3QtPmJhc2UoKSwgZG90LT5pZGVudGlmaWVyKCksIGFyZ3MsIGRpdm90LCBkaXZvdFN0YXJ0LCBk
aXZvdEVuZCk7CisgICAgICAgIG5vZGUgPSBuZXcgKG1fcGFyc2VyQXJlbmEpIEFwcGx5RnVuY3Rp
b25DYWxsRG90Tm9kZShsb2NhdGlvbiwgZG90LT5iYXNlKCksIGRvdC0+aWRlbnRpZmllcigpLCBh
cmdzLCBkaXZvdCwgZGl2b3RTdGFydCwgZGl2b3RFbmQsIGNhbGxPckFwcGx5Q2hpbGREZXB0aCk7
CiAgICAgZWxzZQogICAgICAgICBub2RlID0gbmV3IChtX3BhcnNlckFyZW5hKSBGdW5jdGlvbkNh
bGxEb3ROb2RlKGxvY2F0aW9uLCBkb3QtPmJhc2UoKSwgZG90LT5pZGVudGlmaWVyKCksIGFyZ3Ms
IGRpdm90LCBkaXZvdFN0YXJ0LCBkaXZvdEVuZCk7CiAgICAgbm9kZS0+c2V0U3ViZXhwcmVzc2lv
bkluZm8oZG90LT5kaXZvdCgpLCBkb3QtPmRpdm90RW5kKCkub2Zmc2V0KTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvTm9kZUNvbnN0cnVjdG9ycy5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvTm9kZUNvbnN0cnVjdG9ycy5oCShyZXZpc2lv
biAyMTU0MzMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL05vZGVDb25zdHJ1Y3Rv
cnMuaAkod29ya2luZyBjb3B5KQpAQCAtNDAzLDEzICs0MDMsMTUgQEAgbmFtZXNwYWNlIEpTQyB7
CiAgICAgewogICAgIH0KIAotICAgIGlubGluZSBDYWxsRnVuY3Rpb25DYWxsRG90Tm9kZTo6Q2Fs
bEZ1bmN0aW9uQ2FsbERvdE5vZGUoY29uc3QgSlNUb2tlbkxvY2F0aW9uJiBsb2NhdGlvbiwgRXhw
cmVzc2lvbk5vZGUqIGJhc2UsIGNvbnN0IElkZW50aWZpZXImIGlkZW50LCBBcmd1bWVudHNOb2Rl
KiBhcmdzLCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3QsIGNvbnN0IEpTVGV4dFBvc2l0aW9u
JiBkaXZvdFN0YXJ0LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RFbmQpCisgICAgaW5saW5l
IENhbGxGdW5jdGlvbkNhbGxEb3ROb2RlOjpDYWxsRnVuY3Rpb25DYWxsRG90Tm9kZShjb25zdCBK
U1Rva2VuTG9jYXRpb24mIGxvY2F0aW9uLCBFeHByZXNzaW9uTm9kZSogYmFzZSwgY29uc3QgSWRl
bnRpZmllciYgaWRlbnQsIEFyZ3VtZW50c05vZGUqIGFyZ3MsIGNvbnN0IEpTVGV4dFBvc2l0aW9u
JiBkaXZvdCwgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRpdm90U3RhcnQsIGNvbnN0IEpTVGV4dFBv
c2l0aW9uJiBkaXZvdEVuZCwgc2l6ZV90IGNhbGxPckFwcGx5Q2hpbGREZXB0aCkKICAgICAgICAg
OiBGdW5jdGlvbkNhbGxEb3ROb2RlKGxvY2F0aW9uLCBiYXNlLCBpZGVudCwgYXJncywgZGl2b3Qs
IGRpdm90U3RhcnQsIGRpdm90RW5kKQorICAgICAgICAsIG1fY2FsbE9yQXBwbHlDaGlsZERlcHRo
KGNhbGxPckFwcGx5Q2hpbGREZXB0aCkKICAgICB7CiAgICAgfQogCi0gICAgaW5saW5lIEFwcGx5
RnVuY3Rpb25DYWxsRG90Tm9kZTo6QXBwbHlGdW5jdGlvbkNhbGxEb3ROb2RlKGNvbnN0IEpTVG9r
ZW5Mb2NhdGlvbiYgbG9jYXRpb24sIEV4cHJlc3Npb25Ob2RlKiBiYXNlLCBjb25zdCBJZGVudGlm
aWVyJiBpZGVudCwgQXJndW1lbnRzTm9kZSogYXJncywgY29uc3QgSlNUZXh0UG9zaXRpb24mIGRp
dm90LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RTdGFydCwgY29uc3QgSlNUZXh0UG9zaXRp
b24mIGRpdm90RW5kKQorICAgIGlubGluZSBBcHBseUZ1bmN0aW9uQ2FsbERvdE5vZGU6OkFwcGx5
RnVuY3Rpb25DYWxsRG90Tm9kZShjb25zdCBKU1Rva2VuTG9jYXRpb24mIGxvY2F0aW9uLCBFeHBy
ZXNzaW9uTm9kZSogYmFzZSwgY29uc3QgSWRlbnRpZmllciYgaWRlbnQsIEFyZ3VtZW50c05vZGUq
IGFyZ3MsIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdCwgY29uc3QgSlNUZXh0UG9zaXRpb24m
IGRpdm90U3RhcnQsIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdEVuZCwgc2l6ZV90IGNhbGxP
ckFwcGx5Q2hpbGREZXB0aCkKICAgICAgICAgOiBGdW5jdGlvbkNhbGxEb3ROb2RlKGxvY2F0aW9u
LCBiYXNlLCBpZGVudCwgYXJncywgZGl2b3QsIGRpdm90U3RhcnQsIGRpdm90RW5kKQorICAgICAg
ICAsIG1fY2FsbE9yQXBwbHlDaGlsZERlcHRoKGNhbGxPckFwcGx5Q2hpbGREZXB0aCkKICAgICB7
CiAgICAgfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL05vZGVzLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3BhcnNlci9Ob2Rlcy5oCShyZXZpc2lv
biAyMTU0MzMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL05vZGVzLmgJKHdvcmtp
bmcgY29weSkKQEAgLTg4NCwxOCArODg0LDIwIEBAIG5hbWVzcGFjZSBKU0MgewogCiAgICAgY2xh
c3MgQ2FsbEZ1bmN0aW9uQ2FsbERvdE5vZGUgOiBwdWJsaWMgRnVuY3Rpb25DYWxsRG90Tm9kZSB7
CiAgICAgcHVibGljOgotICAgICAgICBDYWxsRnVuY3Rpb25DYWxsRG90Tm9kZShjb25zdCBKU1Rv
a2VuTG9jYXRpb24mLCBFeHByZXNzaW9uTm9kZSogYmFzZSwgY29uc3QgSWRlbnRpZmllciYsIEFy
Z3VtZW50c05vZGUqLCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3QsIGNvbnN0IEpTVGV4dFBv
c2l0aW9uJiBkaXZvdFN0YXJ0LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RFbmQpOworICAg
ICAgICBDYWxsRnVuY3Rpb25DYWxsRG90Tm9kZShjb25zdCBKU1Rva2VuTG9jYXRpb24mLCBFeHBy
ZXNzaW9uTm9kZSogYmFzZSwgY29uc3QgSWRlbnRpZmllciYsIEFyZ3VtZW50c05vZGUqLCBjb25z
dCBKU1RleHRQb3NpdGlvbiYgZGl2b3QsIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdFN0YXJ0
LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RFbmQsIHNpemVfdCBjYWxsT3JBcHBseUNoaWxk
RGVwdGgpOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgUmVnaXN0ZXJJRCogZW1pdEJ5dGVjb2Rl
KEJ5dGVjb2RlR2VuZXJhdG9yJiwgUmVnaXN0ZXJJRCogPSAwKSBvdmVycmlkZTsKKyAgICAgICAg
c2l6ZV90IG1fY2FsbE9yQXBwbHlDaGlsZERlcHRoOwogICAgIH07CiAgICAgCiAgICAgY2xhc3Mg
QXBwbHlGdW5jdGlvbkNhbGxEb3ROb2RlIDogcHVibGljIEZ1bmN0aW9uQ2FsbERvdE5vZGUgewog
ICAgIHB1YmxpYzoKLSAgICAgICAgQXBwbHlGdW5jdGlvbkNhbGxEb3ROb2RlKGNvbnN0IEpTVG9r
ZW5Mb2NhdGlvbiYsIEV4cHJlc3Npb25Ob2RlKiBiYXNlLCBjb25zdCBJZGVudGlmaWVyJiwgQXJn
dW1lbnRzTm9kZSosIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdCwgY29uc3QgSlNUZXh0UG9z
aXRpb24mIGRpdm90U3RhcnQsIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdEVuZCk7CisgICAg
ICAgIEFwcGx5RnVuY3Rpb25DYWxsRG90Tm9kZShjb25zdCBKU1Rva2VuTG9jYXRpb24mLCBFeHBy
ZXNzaW9uTm9kZSogYmFzZSwgY29uc3QgSWRlbnRpZmllciYsIEFyZ3VtZW50c05vZGUqLCBjb25z
dCBKU1RleHRQb3NpdGlvbiYgZGl2b3QsIGNvbnN0IEpTVGV4dFBvc2l0aW9uJiBkaXZvdFN0YXJ0
LCBjb25zdCBKU1RleHRQb3NpdGlvbiYgZGl2b3RFbmQsIHNpemVfdCBjYWxsT3JBcHBseUNoaWxk
RGVwdGgpOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgUmVnaXN0ZXJJRCogZW1pdEJ5dGVjb2Rl
KEJ5dGVjb2RlR2VuZXJhdG9yJiwgUmVnaXN0ZXJJRCogPSAwKSBvdmVycmlkZTsKKyAgICAgICAg
c2l6ZV90IG1fY2FsbE9yQXBwbHlDaGlsZERlcHRoOwogICAgIH07CiAKICAgICBjbGFzcyBEZWxl
dGVSZXNvbHZlTm9kZSA6IHB1YmxpYyBFeHByZXNzaW9uTm9kZSwgcHVibGljIFRocm93YWJsZUV4
cHJlc3Npb25EYXRhIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvUGFyc2Vy
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL1BhcnNlci5j
cHAJKHJldmlzaW9uIDIxNTQzMykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvUGFy
c2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDM4NCw2ICs0Mzg0LDIyIEBAIHRlbXBsYXRlIDxj
bGFzcyBUcmVlQnVpbGRlcj4gVHJlZUV4cHJlc3MKICAgICByZXR1cm4gcGFyc2VBc3NpZ25tZW50
RXhwcmVzc2lvbihjb250ZXh0KTsKIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFRyZWVCdWlsZGVy
LCB0eXBlbmFtZSBQYXJzZXJUeXBlLCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lm
PHN0ZDo6aXNfc2FtZTxUcmVlQnVpbGRlciwgQVNUQnVpbGRlcj46OnZhbHVlPjo6dHlwZT4KK3N0
YXRpYyBpbmxpbmUgdm9pZCByZWNvcmRDYWxsT3JBcHBseURlcHRoKFBhcnNlclR5cGUqIHBhcnNl
ciwgVk0mIHZtLCBzdGQ6Om9wdGlvbmFsPHR5cGVuYW1lIFBhcnNlclR5cGU6OkNhbGxPckFwcGx5
RGVwdGg+JiBjYWxsT3JBcHBseURlcHRoLCBFeHByZXNzaW9uTm9kZSogZXhwcmVzc2lvbikKK3sK
KyAgICBpZiAoZXhwcmVzc2lvbi0+aXNEb3RBY2Nlc3Nvck5vZGUoKSkgeworICAgICAgICBEb3RB
Y2Nlc3Nvck5vZGUqIGRvdCA9IHN0YXRpY19jYXN0PERvdEFjY2Vzc29yTm9kZSo+KGV4cHJlc3Np
b24pOworICAgICAgICBib29sIGlzQ2FsbE9yQXBwbHkgPSBkb3QtPmlkZW50aWZpZXIoKSA9PSB2
bS5wcm9wZXJ0eU5hbWVzLT5idWlsdGluTmFtZXMoKS5jYWxsUHVibGljTmFtZSgpIHx8IGRvdC0+
aWRlbnRpZmllcigpID09IHZtLnByb3BlcnR5TmFtZXMtPmJ1aWx0aW5OYW1lcygpLmFwcGx5UHVi
bGljTmFtZSgpOworICAgICAgICBpZiAoaXNDYWxsT3JBcHBseSkKKyAgICAgICAgICAgIGNhbGxP
ckFwcGx5RGVwdGguZW1wbGFjZShwYXJzZXIpOworICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVu
YW1lIFRyZWVCdWlsZGVyLCB0eXBlbmFtZSBQYXJzZXJUeXBlLCB0eXBlbmFtZSA9IHR5cGVuYW1l
IHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZTxUcmVlQnVpbGRlciwgU3ludGF4Q2hlY2tlcj46
OnZhbHVlPjo6dHlwZT4KK3N0YXRpYyBpbmxpbmUgdm9pZCByZWNvcmRDYWxsT3JBcHBseURlcHRo
KFBhcnNlclR5cGUqLCBWTSYsIHN0ZDo6b3B0aW9uYWw8dHlwZW5hbWUgUGFyc2VyVHlwZTo6Q2Fs
bE9yQXBwbHlEZXB0aD4mLCBTeW50YXhDaGVja2VyOjpFeHByZXNzaW9uKQoreworfQorCiB0ZW1w
bGF0ZSA8dHlwZW5hbWUgTGV4ZXJUeXBlPgogdGVtcGxhdGUgPGNsYXNzIFRyZWVCdWlsZGVyPiBU
cmVlRXhwcmVzc2lvbiBQYXJzZXI8TGV4ZXJUeXBlPjo6cGFyc2VNZW1iZXJFeHByZXNzaW9uKFRy
ZWVCdWlsZGVyJiBjb250ZXh0KQogewpAQCAtNDQ5OCw2ICs0NTE0LDkgQEAgdGVtcGxhdGUgPGNs
YXNzIFRyZWVCdWlsZGVyPiBUcmVlRXhwcmVzcwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgICAgICAgICBzaXplX3QgdXNlZFZhcmlhYmxlc1NpemUgPSBjdXJyZW50U2NvcGUoKS0+Y3Vy
cmVudFVzZWRWYXJpYWJsZXNTaXplKCk7CiAgICAgICAgICAgICAgICAgSlNUZXh0UG9zaXRpb24g
ZXhwcmVzc2lvbkVuZCA9IGxhc3RUb2tlbkVuZFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAg
c3RkOjpvcHRpb25hbDxDYWxsT3JBcHBseURlcHRoPiBjYWxsT3JBcHBseURlcHRoOworICAgICAg
ICAgICAgICAgIHJlY29yZENhbGxPckFwcGx5RGVwdGg8VHJlZUJ1aWxkZXI+KHRoaXMsICptX3Zt
LCBjYWxsT3JBcHBseURlcHRoLCBiYXNlKTsKKwogICAgICAgICAgICAgICAgIFRyZWVBcmd1bWVu
dHMgYXJndW1lbnRzID0gcGFyc2VBcmd1bWVudHMoY29udGV4dCk7CiAKICAgICAgICAgICAgICAg
ICBpZiAoYmFzZUlzQXN5bmNLZXl3b3JkICYmICghYXJndW1lbnRzIHx8IG1hdGNoKEFSUk9XRlVO
Q1RJT04pKSkgewpAQCAtNDUyNSw3ICs0NTQ0LDggQEAgdGVtcGxhdGUgPGNsYXNzIFRyZWVCdWls
ZGVyPiBUcmVlRXhwcmVzcwogICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNjb3BlKCkt
PmlzQXJyb3dGdW5jdGlvbigpKQogICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25TY29w
ZS0+c2V0SW5uZXJBcnJvd0Z1bmN0aW9uVXNlc1N1cGVyQ2FsbCgpOwogICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICBiYXNlID0gY29udGV4dC5tYWtlRnVuY3Rpb25DYWxsTm9kZShz
dGFydExvY2F0aW9uLCBiYXNlLCBhcmd1bWVudHMsIGV4cHJlc3Npb25TdGFydCwgZXhwcmVzc2lv
bkVuZCwgbGFzdFRva2VuRW5kUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgYmFzZSA9IGNv
bnRleHQubWFrZUZ1bmN0aW9uQ2FsbE5vZGUoc3RhcnRMb2NhdGlvbiwgYmFzZSwgYXJndW1lbnRz
LCBleHByZXNzaW9uU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25FbmQsIGxh
c3RUb2tlbkVuZFBvc2l0aW9uKCksIGNhbGxPckFwcGx5RGVwdGggPyBjYWxsT3JBcHBseURlcHRo
LT5tYXhDaGlsZERlcHRoKCkgOiAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fcGFy
c2VyU3RhdGUubm9uTEhTQ291bnQgPSBub25MSFNDb3VudDsKICAgICAgICAgICAgIGJyZWFrOwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3BhcnNlci9QYXJzZXIuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL1BhcnNlci5oCShyZXZpc2lvbiAyMTU0MzMp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL1BhcnNlci5oCSh3b3JraW5nIGNvcHkp
CkBAIC04ODcsNiArODg3LDM3IEBAIHB1YmxpYzoKICAgICBKU1RleHRQb3NpdGlvbiBwb3NpdGlv
bkJlZm9yZUxhc3ROZXdsaW5lKCkgY29uc3QgeyByZXR1cm4gbV9sZXhlci0+cG9zaXRpb25CZWZv
cmVMYXN0TmV3bGluZSgpOyB9CiAgICAgSlNUb2tlbkxvY2F0aW9uIGxvY2F0aW9uQmVmb3JlTGFz
dFRva2VuKCkgY29uc3QgeyByZXR1cm4gbV9sZXhlci0+bGFzdFRva2VuTG9jYXRpb24oKTsgfQog
CisgICAgc3RydWN0IENhbGxPckFwcGx5RGVwdGggeworICAgICAgICBDYWxsT3JBcHBseURlcHRo
KFBhcnNlciogcGFyc2VyKQorICAgICAgICAgICAgOiBtX3BhcnNlcihwYXJzZXIpCisgICAgICAg
ICAgICAsIG1fcGFyZW50KHBhcnNlci0+bV9jYWxsT3JBcHBseURlcHRoKQorICAgICAgICAgICAg
LCBtX2RlcHRoKG1fcGFyZW50ID8gbV9wYXJlbnQtPm1fZGVwdGggKyAxIDogMCkKKyAgICAgICAg
ICAgICwgbV9jaGlsZERlcHRoKG1fZGVwdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnNl
ci0+bV9jYWxsT3JBcHBseURlcHRoID0gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVf
dCBtYXhDaGlsZERlcHRoKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKG1f
Y2hpbGREZXB0aCA+PSBtX2RlcHRoKTsKKyAgICAgICAgICAgIHJldHVybiBtX2NoaWxkRGVwdGgg
LSBtX2RlcHRoOworICAgICAgICB9CisKKyAgICAgICAgfkNhbGxPckFwcGx5RGVwdGgoKQorICAg
ICAgICB7CisgICAgICAgICAgICBpZiAobV9wYXJlbnQpCisgICAgICAgICAgICAgICAgbV9wYXJl
bnQtPm1fY2hpbGREZXB0aCA9IHN0ZDo6bWF4KG1fY2hpbGREZXB0aCwgbV9wYXJlbnQtPm1fY2hp
bGREZXB0aCk7CisgICAgICAgICAgICBtX3BhcnNlci0+bV9jYWxsT3JBcHBseURlcHRoID0gbV9w
YXJlbnQ7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgUGFyc2VyKiBtX3Bh
cnNlcjsKKyAgICAgICAgQ2FsbE9yQXBwbHlEZXB0aCogbV9wYXJlbnQ7CisgICAgICAgIHNpemVf
dCBtX2RlcHRoOworICAgICAgICBzaXplX3QgbV9jaGlsZERlcHRoOworICAgIH07CisKIHByaXZh
dGU6CiAgICAgc3RydWN0IEFsbG93SW5PdmVycmlkZSB7CiAgICAgICAgIEFsbG93SW5PdmVycmlk
ZShQYXJzZXIqIHBhcnNlcikKQEAgLTE3ODAsNiArMTgxMSw3IEBAIHByaXZhdGU6CiAgICAgYm9v
bCBtX2ltbWVkaWF0ZVBhcmVudEFsbG93c0Z1bmN0aW9uRGVjbGFyYXRpb25JblN0YXRlbWVudDsK
ICAgICBSZWZQdHI8TW9kdWxlU2NvcGVEYXRhPiBtX21vZHVsZVNjb3BlRGF0YTsKICAgICBEZWJ1
Z2dlclBhcnNlRGF0YSogbV9kZWJ1Z2dlclBhcnNlRGF0YTsKKyAgICBDYWxsT3JBcHBseURlcHRo
KiBtX2NhbGxPckFwcGx5RGVwdGggeyBudWxscHRyIH07CiAKICAgICBzdHJ1Y3QgRGVwdGhNYW5h
Z2VyIHsKICAgICAgICAgRGVwdGhNYW5hZ2VyKGludCogZGVwdGgpCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcGFyc2VyL1N5bnRheENoZWNrZXIuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcGFyc2VyL1N5bnRheENoZWNrZXIuaAkocmV2aXNpb24gMjE1NDMzKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL3BhcnNlci9TeW50YXhDaGVja2VyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTE0Myw3ICsxNDMsNyBAQCBwdWJsaWM6CiAgICAgc3RhdGljIGNvbnN0IHVuc2ln
bmVkIERvbnRCdWlsZFN0cmluZ3MgPSBMZXhlckZsYWdzRG9udEJ1aWxkU3RyaW5nczsKIAogICAg
IGludCBjcmVhdGVTb3VyY2VFbGVtZW50cygpIHsgcmV0dXJuIFNvdXJjZUVsZW1lbnRzUmVzdWx0
OyB9Ci0gICAgRXhwcmVzc2lvblR5cGUgbWFrZUZ1bmN0aW9uQ2FsbE5vZGUoY29uc3QgSlNUb2tl
bkxvY2F0aW9uJiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpIHsgcmV0dXJuIENhbGxFeHByOyB9
CisgICAgRXhwcmVzc2lvblR5cGUgbWFrZUZ1bmN0aW9uQ2FsbE5vZGUoY29uc3QgSlNUb2tlbkxv
Y2F0aW9uJiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIHNpemVfdCkgeyByZXR1cm4gQ2FsbEV4
cHI7IH0KICAgICBFeHByZXNzaW9uVHlwZSBjcmVhdGVDb21tYUV4cHIoY29uc3QgSlNUb2tlbkxv
Y2F0aW9uJiwgRXhwcmVzc2lvblR5cGUgZXhwcikgeyByZXR1cm4gZXhwcjsgfQogICAgIEV4cHJl
c3Npb25UeXBlIGFwcGVuZFRvQ29tbWFFeHByKGNvbnN0IEpTVG9rZW5Mb2NhdGlvbiYsIEV4cHJl
c3Npb25UeXBlJiBoZWFkLCBFeHByZXNzaW9uVHlwZSwgRXhwcmVzc2lvblR5cGUgbmV4dCkgeyBo
ZWFkID0gbmV4dDsgcmV0dXJuIG5leHQ7IH0KICAgICBFeHByZXNzaW9uVHlwZSBtYWtlQXNzaWdu
Tm9kZShjb25zdCBKU1Rva2VuTG9jYXRpb24mLCBFeHByZXNzaW9uVHlwZSwgT3BlcmF0b3IsIEV4
cHJlc3Npb25UeXBlLCBib29sLCBib29sLCBpbnQsIGludCwgaW50KSB7IHJldHVybiBBc3NpZ25t
ZW50RXhwcjsgfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>