<?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>147947</bug_id>
          
          <creation_ts>2015-08-12 12:46:43 -0700</creation_ts>
          <short_desc>WTF::Lock should not suffer from the thundering herd</short_desc>
          <delta_ts>2015-08-13 10:30:38 -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>Web Template Framework</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>barraclough</cc>
    
    <cc>basile_clement</cc>
    
    <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>ggaren</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mhahnenb</cc>
    
    <cc>mmirman</cc>
    
    <cc>msaboff</cc>
    
    <cc>nrotem</cc>
    
    <cc>oliver</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1117024</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 12:46:43 -0700</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117025</commentid>
    <comment_count>1</comment_count>
      <attachid>258838</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 12:48:31 -0700</bug_when>
    <thetext>Created attachment 258838
it might be right</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117056</commentid>
    <comment_count>2</comment_count>
      <attachid>258844</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 13:53:45 -0700</bug_when>
    <thetext>Created attachment 258844
I think it works</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117057</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-08-12 13:55:31 -0700</bug_when>
    <thetext>Attachment 258844 did not pass style-queue:


ERROR: Source/WTF/wtf/ParkingLot.cpp:579:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ParkingLot.cpp:585:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/Lock.cpp:98:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 3 in 9 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117077</commentid>
    <comment_count>4</comment_count>
      <attachid>258849</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 15:15:33 -0700</bug_when>
    <thetext>Created attachment 258849
it works</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117079</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-08-12 15:17:05 -0700</bug_when>
    <thetext>Attachment 258849 did not pass style-queue:


ERROR: Source/WTF/wtf/ParkingLot.cpp:579:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ParkingLot.cpp:585:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/Lock.cpp:98:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 3 in 9 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117087</commentid>
    <comment_count>6</comment_count>
      <attachid>258853</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 16:54:08 -0700</bug_when>
    <thetext>Created attachment 258853
the patch

Fix a debug-only issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117088</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-08-12 16:55:46 -0700</bug_when>
    <thetext>Attachment 258853 did not pass style-queue:


ERROR: Source/WTF/wtf/ParkingLot.cpp:579:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ParkingLot.cpp:585:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/Lock.cpp:98:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 3 in 9 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117106</commentid>
    <comment_count>8</comment_count>
      <attachid>258849</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-08-12 17:31:45 -0700</bug_when>
    <thetext>Comment on attachment 258849
it works

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

&gt; Source/WTF/wtf/ParkingLot.cpp:497
&gt; +        finishFunctor(result);

&quot;finishFunctor&quot; is not very descriptive.  Can we call it something like &quot;reportMayHaveMoreThreadsFunctor&quot; instead?

&gt; Source/WTF/wtf/ParkingLot.cpp:-506
&gt; -    ASSERT(!me-&gt;shouldPark);
&gt; -    

Can we ASSERT(!me-&gt;address)?

&gt; Source/WTF/wtf/ParkingLot.cpp:-528
&gt; -
&gt; -        me-&gt;address = nullptr;

Why remove this clearing of me-&gt;address?  Oh, I see that we clear it in the unpark functions.

&gt; Source/WTF/wtf/ParkingLot.cpp:598
&gt; +    threadData-&gt;parkingCondition.notify_one();

Let me reason thru how things are working.  The way we get to this unparkOne function is if the lock word / byte indicates that it is parked.  To unpark, we do the following in order:
1. in dequeue(), lock the bucket that waiting threads are parked on.  That keeps new threads from parking.
2. in Bucket::genericDequeue(), we take a candidate ThreadData from the bucket.
3. in dequeue(), we call the reportMayHaveMoreThreads functor, which invokes our callback here.
4. the callback in this case is from LockBase::unlockSlow(), where it clears the isHeldBit on the lock word / byte.  

    The lock is now available for contention.
    If the lock is still parked (has waiting threads), the acquiring thread will acquire the lock with isHeldBit | hasParkedBit.
    If the lock has no waiting threads, the acquiring thread will acquire the lock with isHeldBit.

5. in dequeue(), we unlock the bucket.  Any other thread may now park in the bucket.

    If an contending thread comes along, it will just park in the bucket now if the lock hasParkedBit.

6. In unparkOne() here, we notify the thread whose ThreadData we took from the bucket.  This wakes this thread up to contend for the lock.

The only guarantee that I think we need is for step 4 (setting the new lock bits) to take place before we unlock the bucket in step 5.  As long as we have that, we can guarantee that the hasParkedBit in the lock word / byte is consistent with whether we have waiting threads in the bucket or not.

Then, why does this notify_one() need to be outside of the protection of the parkingLock?  Ditto for the notifies in the other 2 unpark functions.  The waking thread can&apos;t do anything until its parkingLock is released.  If it doesn&apos;t make a difference (as I see it), then I&apos;d prefer to do the notify while holding the parkingLock as that&apos;s the normal practice with how condition variables are used.

&gt; Tools/TestWebKitAPI/Tests/WTF/Lock.cpp:84
&gt; +        for (unsigned i = 2; i--;) {
&gt; +            locks[threadGroupIndex].lock();
&gt; +            locks[threadGroupIndex].unlock();
&gt; +        }

From what I can tell, the algorithm for clearing the hasParkedBit is exact and not racy. Above, we waited for all the contending threads to complete.  That means they should have unlocked the locks.  Why do you need to do this lock and unlock pair at all?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117117</commentid>
    <comment_count>9</comment_count>
      <attachid>258853</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-08-12 17:46:36 -0700</bug_when>
    <thetext>Comment on attachment 258853
the patch

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

r=me

&gt; Source/WTF/wtf/ParkingLot.cpp:545
&gt; +        false,

This should be a named local variable or an enum, so you can tell at the call site that it means &quot;do not ensure bucket&quot;.

&gt; Source/WTF/wtf/ParkingLot.cpp:609
&gt; +        false,

This should be a named local variable or an enum, so you can tell at the call site that it means &quot;do not ensure bucket&quot;.

&gt; Source/WTF/wtf/ParkingLot.h:75
&gt; +        std::function&lt;void(bool didUnparkThread, bool mayHaveMoreThreads)&gt; callback);

In what sense is mayHaveMoreThreads a maybe as opposed to a yes/no?

I think you&apos;re pointing out that another thread may be trying to park right now. But, since I hold the parking lock and the bucket lock during this callback, the other thread can&apos;t park yet, and I know for certain which other threads are parked at this moment.

Do I understand this correctly? If so, I would rename to &quot;hasMoreParkedThreads&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117119</commentid>
    <comment_count>10</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 17:56:01 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; Comment on attachment 258849 [details]
&gt; it works
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=258849&amp;action=review
&gt; 
&gt; &gt; Source/WTF/wtf/ParkingLot.cpp:497
&gt; &gt; +        finishFunctor(result);
&gt; 
&gt; &quot;finishFunctor&quot; is not very descriptive.  Can we call it something like
&gt; &quot;reportMayHaveMoreThreadsFunctor&quot; instead?

But that&apos;s not an accurate name.  It&apos;s also called when the lock is held.  In particular, it&apos;s the last thing we do before releasing the lock.  Hence &quot;finish&quot; is probably a decent name - short, and about as precise as you can get.

&gt; 
&gt; &gt; Source/WTF/wtf/ParkingLot.cpp:-506
&gt; &gt; -    ASSERT(!me-&gt;shouldPark);
&gt; &gt; -    
&gt; 
&gt; Can we ASSERT(!me-&gt;address)?

Fixed in latest patch.

&gt; 
&gt; &gt; Source/WTF/wtf/ParkingLot.cpp:-528
&gt; &gt; -
&gt; &gt; -        me-&gt;address = nullptr;
&gt; 
&gt; Why remove this clearing of me-&gt;address?  Oh, I see that we clear it in the
&gt; unpark functions.

Yeah.

&gt; 
&gt; &gt; Source/WTF/wtf/ParkingLot.cpp:598
&gt; &gt; +    threadData-&gt;parkingCondition.notify_one();
&gt; 
&gt; Let me reason thru how things are working.  The way we get to this unparkOne
&gt; function is if the lock word / byte indicates that it is parked.  To unpark,
&gt; we do the following in order:
&gt; 1. in dequeue(), lock the bucket that waiting threads are parked on.  That
&gt; keeps new threads from parking.
&gt; 2. in Bucket::genericDequeue(), we take a candidate ThreadData from the
&gt; bucket.
&gt; 3. in dequeue(), we call the reportMayHaveMoreThreads functor, which invokes
&gt; our callback here.
&gt; 4. the callback in this case is from LockBase::unlockSlow(), where it clears
&gt; the isHeldBit on the lock word / byte.  
&gt; 
&gt;     The lock is now available for contention.
&gt;     If the lock is still parked (has waiting threads), the acquiring thread
&gt; will acquire the lock with isHeldBit | hasParkedBit.
&gt;     If the lock has no waiting threads, the acquiring thread will acquire
&gt; the lock with isHeldBit.
&gt; 
&gt; 5. in dequeue(), we unlock the bucket.  Any other thread may now park in the
&gt; bucket.
&gt; 
&gt;     If an contending thread comes along, it will just park in the bucket now
&gt; if the lock hasParkedBit.

No, it wouldn&apos;t park, because threads only park if isHeldBit is also set:

        ParkingLot::compareAndPark(&amp;m_byte, isHeldBit | hasParkedBit);

Right now, just after we unlocked the lock, the isHeldBit is *not* set.  The lock&apos;s value is either &quot;0&quot; or &quot;hasParkedBit&quot;.

So, it&apos;s true that at this point some thread (either the one we unparked or a different one) could already acquire the lock, and then any other thread acquiring the lock would park.  But, I just wanted to clarify that there has to be more than one contending thread for parking to happen.

&gt; 
&gt; 6. In unparkOne() here, we notify the thread whose ThreadData we took from
&gt; the bucket.  This wakes this thread up to contend for the lock.
&gt; 
&gt; The only guarantee that I think we need is for step 4 (setting the new lock
&gt; bits) to take place before we unlock the bucket in step 5.  As long as we
&gt; have that, we can guarantee that the hasParkedBit in the lock word / byte is
&gt; consistent with whether we have waiting threads in the bucket or not.

I&apos;m not sure what you&apos;re suggesting, but I&apos;m pretty sure you&apos;re wrong.  Are you saying that you believe that the algorithm is unnecessarily complex?  Are you saying that it could be made faster?  Are you saying that it&apos;s wrong?

Step 4 needs to set the hasParkedBit based on whether the queue contains any more elements after we dequeued the first one.  If we moved step 4 to before step 2, you&apos;d need to do a second queue traversal to get this information.  If we moved step 4 to before step 1, you&apos;d need to do a second hashing, second locking of the bucket, and a second queue traversal.  Clearly, step 4 is most efficient right where it is.

&gt; 
&gt; Then, why does this notify_one() need to be outside of the protection of the
&gt; parkingLock?  Ditto for the notifies in the other 2 unpark functions.  The
&gt; waking thread can&apos;t do anything until its parkingLock is released.  If it
&gt; doesn&apos;t make a difference (as I see it), then I&apos;d prefer to do the notify
&gt; while holding the parkingLock as that&apos;s the normal practice with how
&gt; condition variables are used.

To avoid waking up a thread while the lock is still held.  It&apos;s recommended practice for C++11 locking code.

&gt; 
&gt; &gt; Tools/TestWebKitAPI/Tests/WTF/Lock.cpp:84
&gt; &gt; +        for (unsigned i = 2; i--;) {
&gt; &gt; +            locks[threadGroupIndex].lock();
&gt; &gt; +            locks[threadGroupIndex].unlock();
&gt; &gt; +        }
&gt; 
&gt; From what I can tell, the algorithm for clearing the hasParkedBit is exact
&gt; and not racy. Above, we waited for all the contending threads to complete. 
&gt; That means they should have unlocked the locks.  Why do you need to do this
&gt; lock and unlock pair at all?

It&apos;s not exact.  A queue attached to a Bucket is actually a random merging of queues for all addresses that hash to that Bucket.  Enqueue works normally, but dequeue needs to search forward from the head until it finds the first node that has exactly the address we&apos;re interested in.  Therefore, for answering &quot;are there any more threads on this queue after I dequeue this one&quot;, we have two choices:

1) Do an exact forward search to find if any of the remaining elements in the Bucket match our address.

2) Just report whether the queue has any more elements.  This may be true even if none of those are for our address.

The algorithm goes with (2).  The effect of this is that in the case of collisions we will set hasParkedBit to true even though we didn&apos;t have to.  This is OK so long as the hasParkedBit gets cleared eventually.  It will get cleared on the next uncontended lock()/unlock() because the unlock() will call unparkOne(), but unparkOne() will detect that it had not dequeued any elements.  When that happens, it passes false for mayHaveMoreThreads because of this logic:

            callback(!!threadData, threadData &amp;&amp; mayHaveMoreThreads);

Because of this slight case of imprecision, we need exactly one lock()/unlock() cycle to reset the lock.  I decided the use two cycles in the test, because I didn&apos;t want the test to be too much of a white box.  If we did change any locking algorithm to require two cycles of locking to reset itself, then we wouldn&apos;t want this test to fail.  But, if you think it really matters to be precise, I&apos;d be happy to make it just one lock()/unlock() cycle.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117120</commentid>
    <comment_count>11</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 17:58:08 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; Comment on attachment 258853 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=258853&amp;action=review
&gt; 
&gt; r=me
&gt; 
&gt; &gt; Source/WTF/wtf/ParkingLot.cpp:545
&gt; &gt; +        false,
&gt; 
&gt; This should be a named local variable or an enum, so you can tell at the
&gt; call site that it means &quot;do not ensure bucket&quot;.

OK.

&gt; 
&gt; &gt; Source/WTF/wtf/ParkingLot.cpp:609
&gt; &gt; +        false,
&gt; 
&gt; This should be a named local variable or an enum, so you can tell at the
&gt; call site that it means &quot;do not ensure bucket&quot;.

OK.

&gt; 
&gt; &gt; Source/WTF/wtf/ParkingLot.h:75
&gt; &gt; +        std::function&lt;void(bool didUnparkThread, bool mayHaveMoreThreads)&gt; callback);
&gt; 
&gt; In what sense is mayHaveMoreThreads a maybe as opposed to a yes/no?
&gt; 
&gt; I think you&apos;re pointing out that another thread may be trying to park right
&gt; now. But, since I hold the parking lock and the bucket lock during this
&gt; callback, the other thread can&apos;t park yet, and I know for certain which
&gt; other threads are parked at this moment.
&gt; 
&gt; Do I understand this correctly? If so, I would rename to
&gt; &quot;hasMoreParkedThreads&quot;.

It&apos;s actually conservative.  From my reply to mlam:

A queue attached to a Bucket is actually a random merging of queues for all addresses that hash to that Bucket.  Enqueue works normally, but dequeue needs to search forward from the head until it finds the first node that has exactly the address we&apos;re interested in.  Therefore, for answering &quot;are there any more threads on this queue after I dequeue this one&quot;, we have two choices:

1) Do an exact forward search to find if any of the remaining elements in the Bucket match our address.

2) Just report whether the queue has any more elements.  This may be true even if none of those are for our address.

The algorithm goes with (2).  The effect of this is that in the case of collisions we will set hasParkedBit to true even though we didn&apos;t have to.  This is OK so long as the hasParkedBit gets cleared eventually.  It will get cleared on the next uncontended lock()/unlock() because the unlock() will call unparkOne(), but unparkOne() will detect that it had not dequeued any elements.  When that happens, it passes false for mayHaveMoreThreads because of this logic:

            callback(!!threadData, threadData &amp;&amp; mayHaveMoreThreads);

Because of this slight case of imprecision, I prefer to call it mayHaveMoreThreads, because it could be true even if no more threads are waiting.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117123</commentid>
    <comment_count>12</comment_count>
      <attachid>258864</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 18:11:29 -0700</bug_when>
    <thetext>Created attachment 258864
patch for landing

With feedback addressed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117124</commentid>
    <comment_count>13</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 18:11:50 -0700</bug_when>
    <thetext>Will wait to see if mlam is OK with the patch...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117125</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-08-12 18:13:19 -0700</bug_when>
    <thetext>Attachment 258864 did not pass style-queue:


ERROR: Source/WTF/wtf/ParkingLot.cpp:584:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/ParkingLot.cpp:590:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/Lock.cpp:97:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 3 in 9 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117163</commentid>
    <comment_count>15</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 20:48:23 -0700</bug_when>
    <thetext>Haven&apos;t heard from Mark.  Will land.  Happy to roll out if an objection comes up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117164</commentid>
    <comment_count>16</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 20:55:13 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/188374</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117171</commentid>
    <comment_count>17</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-08-12 22:03:51 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #8)
...
&gt; &gt; &gt; Source/WTF/wtf/ParkingLot.cpp:497
&gt; &gt; &gt; +        finishFunctor(result);
&gt; &gt; 
&gt; &gt; &quot;finishFunctor&quot; is not very descriptive.  Can we call it something like
&gt; &gt; &quot;reportMayHaveMoreThreadsFunctor&quot; instead?
&gt; 
&gt; But that&apos;s not an accurate name.  It&apos;s also called when the lock is held. 
&gt; In particular, it&apos;s the last thing we do before releasing the lock.  Hence
&gt; &quot;finish&quot; is probably a decent name - short, and about as precise as you can
&gt; get.

The reason I think that reportMayHaveMoreThreadsFunctor is a better name is because the sole purpose of this functor is to pass the bool mayHaveMoreThreads to the caller.  It is not clear from the design of dequeue() what that value represents until I saw its use in unparkOne() after it.  Perhaps another way to add more clarity here would be to rename the passed bool &quot;result&quot; to &quot;hasMoreParkedThreads&quot; or something like that.

Regardless, I don&apos;t have a strong objection here.

&gt; &gt; &gt; Source/WTF/wtf/ParkingLot.cpp:598
&gt; &gt; &gt; +    threadData-&gt;parkingCondition.notify_one();
&gt; &gt; 
...
&gt; Right now, just after we unlocked the lock, the isHeldBit is *not* set.  The
&gt; lock&apos;s value is either &quot;0&quot; or &quot;hasParkedBit&quot;.

True.  I neglected to consider that case.  I was primarily thinking about what happens if we have contention, and the parking action that can follow.

...
&gt; &gt; The only guarantee that I think we need is for step 4 (setting the new lock
&gt; &gt; bits) to take place before we unlock the bucket in step 5.  As long as we
&gt; &gt; have that, we can guarantee that the hasParkedBit in the lock word / byte is
&gt; &gt; consistent with whether we have waiting threads in the bucket or not.
&gt; 
&gt; I&apos;m not sure what you&apos;re suggesting, but I&apos;m pretty sure you&apos;re wrong.  Are
&gt; you saying that you believe that the algorithm is unnecessarily complex? 
&gt; Are you saying that it could be made faster?  Are you saying that it&apos;s wrong?
...

Not suggesting anything.  I was surprised to see the change that moved the notifying of the parkingCondition out or the guard of the parkingLock, and I was wondering what it could possibly have to do with the determination of the lock bits when we do the unparkOne().  Hence, I tried to methodically reason through the flow of things to see if I can figure why you moved the notify out.

Turns out ... 

&gt; To avoid waking up a thread while the lock is still held.  It&apos;s recommended
&gt; practice for C++11 locking code.

... turns out, it has nothing to do with the value of the lock bits.  It&apos;s just an optimization to avoid the waking thread doing more work to block on the parkingLock and then unblocking again shortly after.  I hadn&apos;t consider this aspect of it, but this is the answer I was looking for here.  Thanks for the explanation.
 
&gt; &gt; 
&gt; &gt; &gt; Tools/TestWebKitAPI/Tests/WTF/Lock.cpp:84
&gt; &gt; &gt; +        for (unsigned i = 2; i--;) {
&gt; &gt; &gt; +            locks[threadGroupIndex].lock();
&gt; &gt; &gt; +            locks[threadGroupIndex].unlock();
&gt; &gt; &gt; +        }
&gt; &gt; 
&gt; &gt; From what I can tell, the algorithm for clearing the hasParkedBit is exact
&gt; &gt; and not racy. Above, we waited for all the contending threads to complete. 
&gt; &gt; That means they should have unlocked the locks.  Why do you need to do this
&gt; &gt; lock and unlock pair at all?
&gt; 
&gt; It&apos;s not exact.  A queue attached to a Bucket is actually a random merging
&gt; of queues for all addresses that hash to that Bucket.  Enqueue works
&gt; normally, but dequeue needs to search forward from the head until it finds
&gt; the first node that has exactly the address we&apos;re interested in.  Therefore,
&gt; for answering &quot;are there any more threads on this queue after I dequeue this
&gt; one&quot;, we have two choices:
&gt; 
&gt; 1) Do an exact forward search to find if any of the remaining elements in
&gt; the Bucket match our address.
&gt; 
&gt; 2) Just report whether the queue has any more elements.  This may be true
&gt; even if none of those are for our address.
&gt; 
&gt; The algorithm goes with (2).  The effect of this is that in the case of
&gt; collisions we will set hasParkedBit to true even though we didn&apos;t have to. 
&gt; This is OK so long as the hasParkedBit gets cleared eventually.  It will get
&gt; cleared on the next uncontended lock()/unlock() because the unlock() will
&gt; call unparkOne(), but unparkOne() will detect that it had not dequeued any
&gt; elements.  When that happens, it passes false for mayHaveMoreThreads because
&gt; of this logic:
&gt; 
&gt;             callback(!!threadData, threadData &amp;&amp; mayHaveMoreThreads);
&gt; 
&gt; Because of this slight case of imprecision, we need exactly one
&gt; lock()/unlock() cycle to reset the lock.  I decided the use two cycles in
&gt; the test, because I didn&apos;t want the test to be too much of a white box.  If
&gt; we did change any locking algorithm to require two cycles of locking to
&gt; reset itself, then we wouldn&apos;t want this test to fail.  But, if you think it
&gt; really matters to be precise, I&apos;d be happy to make it just one
&gt; lock()/unlock() cycle.

Nice.  Thanks for explaining.  The part about the bucket being a merged queue (due to the hashing of addresses) escaped my mind.  It all makes sense now.  I would have preferred that this detail about the imprecision of hasParkedBit be documented in the comment for the new unparkOne(), along with the detail of how it is self optimizing on the next uncontended lock + unlock on that address ... basically what you wrote up here.  The fact that both Geoff and I missed it suggests that it is probably not obvious enough to the casual reader of the code.  Perhaps you tried to explain this in the ChangeLog already, but if so, I didn&apos;t pick it up from there.

Anyway, I&apos;m glad that it&apos;s at least documented here in the comments of this bugzilla for future reference.

(In reply to comment #15)
&gt; Haven&apos;t heard from Mark.  Will land.  Happy to roll out if an objection
&gt; comes up.

No objection from me.  I agree that the implementation is sound.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117172</commentid>
    <comment_count>18</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-08-12 22:08:45 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; (In reply to comment #10)
&gt; &gt; (In reply to comment #8)
&gt; ...
&gt; &gt; &gt; &gt; Source/WTF/wtf/ParkingLot.cpp:497
&gt; &gt; &gt; &gt; +        finishFunctor(result);
&gt; &gt; &gt; 
&gt; &gt; &gt; &quot;finishFunctor&quot; is not very descriptive.  Can we call it something like
&gt; &gt; &gt; &quot;reportMayHaveMoreThreadsFunctor&quot; instead?
&gt; &gt; 
&gt; &gt; But that&apos;s not an accurate name.  It&apos;s also called when the lock is held. 
&gt; &gt; In particular, it&apos;s the last thing we do before releasing the lock.  Hence
&gt; &gt; &quot;finish&quot; is probably a decent name - short, and about as precise as you can
&gt; &gt; get.
&gt; 
&gt; The reason I think that reportMayHaveMoreThreadsFunctor is a better name is
&gt; because the sole purpose of this functor is to pass the bool
&gt; mayHaveMoreThreads to the caller.  

unparkOne() and dequeue() already returned a bool that told you whether there are more threads left, so this functor&apos;s sole purpose is definitely not to pass mayHaveMoreThreads.

The purpose of the functor is that it runs while the queue is locked.  The fact that it also happens to tell you some stats about the queue is less interesting.

&gt; It is not clear from the design of
&gt; dequeue() what that value represents until I saw its use in unparkOne()
&gt; after it.  Perhaps another way to add more clarity here would be to rename
&gt; the passed bool &quot;result&quot; to &quot;hasMoreParkedThreads&quot; or something like that.
&gt; 
&gt; Regardless, I don&apos;t have a strong objection here.
&gt; 
&gt; &gt; &gt; &gt; Source/WTF/wtf/ParkingLot.cpp:598
&gt; &gt; &gt; &gt; +    threadData-&gt;parkingCondition.notify_one();
&gt; &gt; &gt; 
&gt; ...
&gt; &gt; Right now, just after we unlocked the lock, the isHeldBit is *not* set.  The
&gt; &gt; lock&apos;s value is either &quot;0&quot; or &quot;hasParkedBit&quot;.
&gt; 
&gt; True.  I neglected to consider that case.  I was primarily thinking about
&gt; what happens if we have contention, and the parking action that can follow.
&gt; 
&gt; ...
&gt; &gt; &gt; The only guarantee that I think we need is for step 4 (setting the new lock
&gt; &gt; &gt; bits) to take place before we unlock the bucket in step 5.  As long as we
&gt; &gt; &gt; have that, we can guarantee that the hasParkedBit in the lock word / byte is
&gt; &gt; &gt; consistent with whether we have waiting threads in the bucket or not.
&gt; &gt; 
&gt; &gt; I&apos;m not sure what you&apos;re suggesting, but I&apos;m pretty sure you&apos;re wrong.  Are
&gt; &gt; you saying that you believe that the algorithm is unnecessarily complex? 
&gt; &gt; Are you saying that it could be made faster?  Are you saying that it&apos;s wrong?
&gt; ...
&gt; 
&gt; Not suggesting anything.  I was surprised to see the change that moved the
&gt; notifying of the parkingCondition out or the guard of the parkingLock, and I
&gt; was wondering what it could possibly have to do with the determination of
&gt; the lock bits when we do the unparkOne().  Hence, I tried to methodically
&gt; reason through the flow of things to see if I can figure why you moved the
&gt; notify out.

That was just me realizing that I should apply this style here.  Ggaren had suggested calling notify after unlocking while reviewing a different patch.

&gt; 
&gt; Turns out ... 
&gt; 
&gt; &gt; To avoid waking up a thread while the lock is still held.  It&apos;s recommended
&gt; &gt; practice for C++11 locking code.
&gt; 
&gt; ... turns out, it has nothing to do with the value of the lock bits.  It&apos;s
&gt; just an optimization to avoid the waking thread doing more work to block on
&gt; the parkingLock and then unblocking again shortly after.  I hadn&apos;t consider
&gt; this aspect of it, but this is the answer I was looking for here.  Thanks
&gt; for the explanation.
&gt;  
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Tools/TestWebKitAPI/Tests/WTF/Lock.cpp:84
&gt; &gt; &gt; &gt; +        for (unsigned i = 2; i--;) {
&gt; &gt; &gt; &gt; +            locks[threadGroupIndex].lock();
&gt; &gt; &gt; &gt; +            locks[threadGroupIndex].unlock();
&gt; &gt; &gt; &gt; +        }
&gt; &gt; &gt; 
&gt; &gt; &gt; From what I can tell, the algorithm for clearing the hasParkedBit is exact
&gt; &gt; &gt; and not racy. Above, we waited for all the contending threads to complete. 
&gt; &gt; &gt; That means they should have unlocked the locks.  Why do you need to do this
&gt; &gt; &gt; lock and unlock pair at all?
&gt; &gt; 
&gt; &gt; It&apos;s not exact.  A queue attached to a Bucket is actually a random merging
&gt; &gt; of queues for all addresses that hash to that Bucket.  Enqueue works
&gt; &gt; normally, but dequeue needs to search forward from the head until it finds
&gt; &gt; the first node that has exactly the address we&apos;re interested in.  Therefore,
&gt; &gt; for answering &quot;are there any more threads on this queue after I dequeue this
&gt; &gt; one&quot;, we have two choices:
&gt; &gt; 
&gt; &gt; 1) Do an exact forward search to find if any of the remaining elements in
&gt; &gt; the Bucket match our address.
&gt; &gt; 
&gt; &gt; 2) Just report whether the queue has any more elements.  This may be true
&gt; &gt; even if none of those are for our address.
&gt; &gt; 
&gt; &gt; The algorithm goes with (2).  The effect of this is that in the case of
&gt; &gt; collisions we will set hasParkedBit to true even though we didn&apos;t have to. 
&gt; &gt; This is OK so long as the hasParkedBit gets cleared eventually.  It will get
&gt; &gt; cleared on the next uncontended lock()/unlock() because the unlock() will
&gt; &gt; call unparkOne(), but unparkOne() will detect that it had not dequeued any
&gt; &gt; elements.  When that happens, it passes false for mayHaveMoreThreads because
&gt; &gt; of this logic:
&gt; &gt; 
&gt; &gt;             callback(!!threadData, threadData &amp;&amp; mayHaveMoreThreads);
&gt; &gt; 
&gt; &gt; Because of this slight case of imprecision, we need exactly one
&gt; &gt; lock()/unlock() cycle to reset the lock.  I decided the use two cycles in
&gt; &gt; the test, because I didn&apos;t want the test to be too much of a white box.  If
&gt; &gt; we did change any locking algorithm to require two cycles of locking to
&gt; &gt; reset itself, then we wouldn&apos;t want this test to fail.  But, if you think it
&gt; &gt; really matters to be precise, I&apos;d be happy to make it just one
&gt; &gt; lock()/unlock() cycle.
&gt; 
&gt; Nice.  Thanks for explaining.  The part about the bucket being a merged
&gt; queue (due to the hashing of addresses) escaped my mind.  It all makes sense
&gt; now.  I would have preferred that this detail about the imprecision of
&gt; hasParkedBit be documented in the comment for the new unparkOne(), along
&gt; with the detail of how it is self optimizing on the next uncontended lock +
&gt; unlock on that address ... basically what you wrote up here.  The fact that
&gt; both Geoff and I missed it suggests that it is probably not obvious enough
&gt; to the casual reader of the code.  Perhaps you tried to explain this in the
&gt; ChangeLog already, but if so, I didn&apos;t pick it up from there.

I think I added that documentation to the ParkingLot.h header.

&gt; 
&gt; Anyway, I&apos;m glad that it&apos;s at least documented here in the comments of this
&gt; bugzilla for future reference.
&gt; 
&gt; (In reply to comment #15)
&gt; &gt; Haven&apos;t heard from Mark.  Will land.  Happy to roll out if an objection
&gt; &gt; comes up.
&gt; 
&gt; No objection from me.  I agree that the implementation is sound.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1117271</commentid>
    <comment_count>19</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-08-13 10:30:38 -0700</bug_when>
    <thetext>&gt; A queue attached to a Bucket is actually a random merging of queues for all
&gt; addresses that hash to that Bucket.

Got it. I agree with &quot;mayHave&quot;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>258838</attachid>
            <date>2015-08-12 12:48:31 -0700</date>
            <delta_ts>2015-08-12 13:53:45 -0700</delta_ts>
            <desc>it might be right</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>15219</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvYmVuY2htYXJrcy9Mb2NrU3BlZWRUZXN0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV1RGL2JlbmNobWFya3MvTG9ja1NwZWVkVGVzdC5jcHAJKHJldmlzaW9uIDE4
ODMyMykKKysrIFNvdXJjZS9XVEYvYmVuY2htYXJrcy9Mb2NrU3BlZWRUZXN0LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDQsNyArNDQsNyBAQCB1bnNpZ25lZCBudW1JdGVyYXRpb25zOwogICAgIAog
Tk9fUkVUVVJOIHZvaWQgdXNhZ2UoKQogewotICAgIHByaW50ZigiVXNhZ2U6IExvY2tTcGVlZFRl
c3Qgc3BpbmxvY2t8d29yZGxvY2t8bG9ja3xieXRlbG9ja3xtdXRleHxhbGwgPG51bSB0aHJlYWQg
Z3JvdXBzPiA8bnVtIHRocmVhZHMgcGVyIGdyb3VwPiA8d29yayBwZXIgY3JpdGljYWwgc2VjdGlv
bj4gPG51bSBub2lzZSB0aHJlYWRzPiA8bnVtIGl0ZXJhdGlvbnM+XG4iKTsKKyAgICBwcmludGYo
IlVzYWdlOiBMb2NrU3BlZWRUZXN0IHNwaW5sb2NrfHdvcmRsb2NrfGxvY2t8bXV0ZXh8YWxsIDxu
dW0gdGhyZWFkIGdyb3Vwcz4gPG51bSB0aHJlYWRzIHBlciBncm91cD4gPHdvcmsgcGVyIGNyaXRp
Y2FsIHNlY3Rpb24+IDxudW0gbm9pc2UgdGhyZWFkcz4gPG51bSBpdGVyYXRpb25zPlxuIik7CiAg
ICAgZXhpdCgxKTsKIH0KIApJbmRleDogU291cmNlL1dURi93dGYvTG9jay5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dURi93dGYvTG9jay5jcHAJKHJldmlzaW9uIDE4ODMyMykKKysrIFNvdXJj
ZS9XVEYvd3RmL0xvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03NiwzMCArNzYsMzkgQEAgdm9p
ZCBMb2NrQmFzZTo6bG9ja1Nsb3coKQogCiB2b2lkIExvY2tCYXNlOjp1bmxvY2tTbG93KCkKIHsK
LSAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHdoaWxlIGZpbmRpbmcgb3V0IGlmIHNvbWVvbmUgaXMg
cGFya2VkLiBOb3RlIHRoYXQgYXMgc29vbiBhcyB3ZSBkbyB0aGlzLAotICAgIC8vIHNvbWVvbmUg
bWlnaHQgYmFyZ2UgaW4uCi0gICAgdWludDhfdCBvbGRCeXRlVmFsdWU7CisgICAgLy8gV2UgY291
bGQgZ2V0IGhlcmUgYmVjYXVzZSB0aGUgd2VhayBDQVMgaW4gdW5sb2NrKCkgZmFpbGVkIHNwdXJp
b3VzbHksIG9yIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAvLyBzb21lb25lIHBhcmtlZC4gU28sIHdl
IG5lZWQgYSBDQVMgbG9vcDogZXZlbiBpZiByaWdodCBub3cgdGhlIGxvY2sgaXMganVzdCBoZWxk
LCBpdCBjb3VsZAorICAgIC8vIGJlIGhlbGQgYW5kIHBhcmtlZCBpZiBzb21lb25lIGF0dGVtcHRz
IHRvIGxvY2sganVzdCBhcyB3ZSBhcmUgdW5sb2NraW5nLgogICAgIGZvciAoOzspIHsKLSAgICAg
ICAgb2xkQnl0ZVZhbHVlID0gbV9ieXRlLmxvYWQoKTsKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0g
ICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogdW5sb2NraW5n
IHdpdGggIiwgb2xkQnl0ZVZhbHVlLCAiXG4iKSk7Ci0gICAgICAgIEFTU0VSVChvbGRCeXRlVmFs
dWUgJiBpc0hlbGRCaXQpOwotICAgICAgICBpZiAobV9ieXRlLmNvbXBhcmVFeGNoYW5nZVdlYWso
b2xkQnl0ZVZhbHVlLCAwKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KKyAgICAgICAgdWlu
dDhfdCBvbGRCeXRlVmFsdWUgPSBtX2J5dGUubG9hZCgpOworICAgICAgICBBU1NFUlQob2xkQnl0
ZVZhbHVlID09IGlzSGVsZEJpdCB8fCBvbGRCeXRlVmFsdWUgPT0gKGlzSGVsZEJpdCB8IGhhc1Bh
cmtlZEJpdCkpOworICAgICAgICAKKyAgICAgICAgaWYgKG9sZEJ5dGVWYWx1ZSA9PSBpc0hlbGRC
aXQpIHsKKyAgICAgICAgICAgIGlmIChtX2J5dGUuY29tcGFyZUV4Y2hhbmdlV2Vhayhpc0hlbGRC
aXQsIDApKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICB9CiAKLSAgICAvLyBOb3RlIHRoYXQgc29tZW9uZSBjb3VsZCB0cnkgdG8gcGFyayBy
aWdodCBub3cuIElmIHRoYXQgaGFwcGVucywgdGhleSB3aWxsIHJldHVybiBpbW1lZGlhdGVseQot
ICAgIC8vIGJlY2F1c2Ugb3VyIHBhcmtpbmcgcHJlZGljYXRlIGlzIHRoYXQgbV9ieXRlID09IGlz
SGVsZEJpdCB8IGhhc1BhcmtlZEJpdCwgYnV0IHdlJ3ZlIGFscmVhZHkgc2V0Ci0gICAgLy8gbV9i
eXRlID0gMC4KKyAgICAgICAgLy8gU29tZW9uZSBpcyBwYXJrZWQuIFVucGFyayBleGFjdGx5IG9u
ZSB0aHJlYWQsIHBvc3NpYmx5IGxlYXZpbmcgdGhlIHBhcmtlZCBiaXQgc2V0IGlmCisgICAgICAg
IC8vIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgdGhlcmUgYXJlIHN0aWxsIG90aGVyIHRocmVhZHMg
cGFya2VkLgorICAgICAgICBBU1NFUlQob2xkQnl0ZVZhbHVlID09IChpc0hlbGRCaXQgfCBoYXNQ
YXJrZWRCaXQpKTsKKyAgICAgICAgYm9vbCBkaWRVbmxvY2sgPSBmYWxzZTsKKyAgICAgICAgUGFy
a2luZ0xvdDo6dW5wYXJrT25lKAorICAgICAgICAgICAgJm1fYnl0ZSwKKyAgICAgICAgICAgIFsm
XSAoYm9vbCwgYm9vbCBtYXlIYXZlTW9yZVRocmVhZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBX
ZSBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IGNhbiBjbGVhciBlaXRoZXIgdGhlIGlzSGVsZEJpdCBv
ciB0aGUgaGFzUGFya2VkQml0LAorICAgICAgICAgICAgICAgIC8vIHNvIHdlIHNob3VsZCBzdGls
bCBzZWUgYm90aCBiaXRzIHNldCByaWdodCBub3cuCisgICAgICAgICAgICAgICAgQVNTRVJUKG1f
Ynl0ZS5sb2FkKCkgPT0gKGlzSGVsZEJpdCB8IGhhc1BhcmtlZEJpdCkpOwogCi0gICAgLy8gSWYg
dGhlcmUgaGFkIGJlZW4gdGhyZWFkcyBwYXJrZWQsIHVucGFyayBhbGwgb2YgdGhlbS4gVGhpcyBj
YXVzZXMgYSB0aHVuZGVyaW5nIGhlcmQsIGJ1dCB3aGlsZQotICAgIC8vIHRoYXQgaXMgdGhlb3Jl
dGljYWxseSBzY2FyeSwgaXQncyB0b3RhbGx5IGZpbmUgaW4gV2ViS2l0IGJlY2F1c2Ugd2UgdXN1
YWxseSBkb24ndCBoYXZlIGVub3VnaAotICAgIC8vIHRocmVhZHMgZm9yIHRoaXMgdG8gbWF0dGVy
LgotICAgIC8vIEZJWE1FOiBXZSBkb24ndCByZWFsbHkgbmVlZCB0aGlzIHRvIGV4aGliaXQgdGh1
bmRlcmluZyBoZXJkLiBXZSBjb3VsZCB1c2UgdW5wYXJrT25lKCksIGFuZCBpZgotICAgIC8vIHRo
YXQgcmV0dXJucyB0cnVlLCBqdXN0IHNldCB0aGUgcGFya2VkIGJpdCBhZ2Fpbi4gSWYgaW4gdGhl
IHByb2Nlc3Mgb2Ygc2V0dGluZyB0aGUgcGFya2VkIGJpdAotICAgIC8vIHdlIGZhaWwgdGhlIENB
UywgdGhlbiBqdXN0IHVucGFyayBhZ2Fpbi4KLSAgICBpZiAob2xkQnl0ZVZhbHVlICYgaGFzUGFy
a2VkQml0KQotICAgICAgICBQYXJraW5nTG90Ojp1bnBhcmtBbGwoJm1fYnl0ZSk7CisgICAgICAg
ICAgICAgICAgaWYgKG1heUhhdmVNb3JlVGhyZWFkcykKKyAgICAgICAgICAgICAgICAgICAgbV9i
eXRlLnN0b3JlKGhhc1BhcmtlZEJpdCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAg
ICAgICAgICAgICBtX2J5dGUuc3RvcmUoMCk7CisgICAgICAgICAgICAgICAgZGlkVW5sb2NrID0g
dHJ1ZTsKKyAgICAgICAgICAgIH0pOworICAgICAgICBBU1NFUlQoZGlkVW5sb2NrKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KIH0KIAogfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3VyY2Uv
V1RGL3d0Zi9QYXJraW5nTG90LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9QYXJr
aW5nTG90LmNwcAkocmV2aXNpb24gMTg4MzIzKQorKysgU291cmNlL1dURi93dGYvUGFya2luZ0xv
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUyLDExICs1MiwxMSBAQCBwdWJsaWM6CiAKICAgICBU
aHJlYWRJZGVudGlmaWVyIHRocmVhZElkZW50aWZpZXI7CiAgICAgCi0gICAgYm9vbCBzaG91bGRQ
YXJrIHsgZmFsc2UgfTsKICAgICBzdGQ6Om11dGV4IHBhcmtpbmdMb2NrOwogICAgIHN0ZDo6Y29u
ZGl0aW9uX3ZhcmlhYmxlIHBhcmtpbmdDb25kaXRpb247CiAKLSAgICBjb25zdCB2b2lkKiBhZGRy
ZXNzOworICAgIGNvbnN0IHZvaWQqIGFkZHJlc3MgeyBudWxscHRyIH07CisgICAgCiAgICAgVGhy
ZWFkRGF0YSogbmV4dEluUXVldWUgeyBudWxscHRyIH07CiB9OwogCkBAIC0yMTIsMjUgKzIxMiwz
NiBAQCB1bnNpZ25lZCBoYXNoQWRkcmVzcyhjb25zdCB2b2lkKiBhZGRyZXNzCiAgICAgcmV0dXJu
IFdURjo6UHRySGFzaDxjb25zdCB2b2lkKj46Omhhc2goYWRkcmVzcyk7CiB9CiAKLS8vIExvY2tz
IHRoZSBoYXNodGFibGUuIFRoaXMgcmVsb29wcyBpbiBjYXNlIG9mIHJlaGFzaGluZywgc28gdGhl
IGN1cnJlbnQgaGFzaHRhYmxlIG1heSBiZSBkaWZmZXJlbnQKLS8vIGFmdGVyIHRoaXMgcmV0dXJu
cyB0aGFuIHdoZW4geW91IGNhbGxlZCBpdC4gR3VhcmFudGVlcyB0aGF0IHRoZXJlIGlzIGEgaGFz
aHRhYmxlLiBUaGlzIGlzIHByZXR0eQotLy8gc2xvdyBhbmQgbm90IHNjYWxhYmxlLCBzbyBpdCdz
IG9ubHkgdXNlZCBkdXJpbmcgdGhyZWFkIGNyZWF0aW9uIGFuZCBmb3IgZGVidWdnaW5nL3Rlc3Rp
bmcuCi1WZWN0b3I8QnVja2V0Kj4gbG9ja0hhc2h0YWJsZSgpCitIYXNodGFibGUqIGVuc3VyZUhh
c2h0YWJsZSgpCiB7CiAgICAgZm9yICg7OykgewotICAgICAgICBIYXNodGFibGUqIGN1cnJlbnRI
YXNodGFibGU7CisgICAgICAgIEhhc2h0YWJsZSogY3VycmVudEhhc2h0YWJsZSA9IGhhc2h0YWJs
ZS5sb2FkKCk7CisKKyAgICAgICAgaWYgKGN1cnJlbnRIYXNodGFibGUpCisgICAgICAgICAgICBy
ZXR1cm4gY3VycmVudEhhc2h0YWJsZTsKIAotICAgICAgICBjdXJyZW50SGFzaHRhYmxlID0gaGFz
aHRhYmxlLmxvYWQoKTsKICAgICAgICAgaWYgKCFjdXJyZW50SGFzaHRhYmxlKSB7Ci0gICAgICAg
ICAgICAvLyBUcnkgdG8gYmUgdGhlIGZpcnN0IHRvIGNyZWF0ZSB0aGUgaGFzaHRhYmxlLgogICAg
ICAgICAgICAgY3VycmVudEhhc2h0YWJsZSA9IEhhc2h0YWJsZTo6Y3JlYXRlKG1heExvYWRGYWN0
b3IpOwotICAgICAgICAgICAgaWYgKCFoYXNodGFibGUuY29tcGFyZUV4Y2hhbmdlV2VhayhudWxs
cHRyLCBjdXJyZW50SGFzaHRhYmxlKSkgewotICAgICAgICAgICAgICAgIEhhc2h0YWJsZTo6ZGVz
dHJveShjdXJyZW50SGFzaHRhYmxlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIGlmIChoYXNodGFibGUuY29tcGFyZUV4Y2hhbmdlV2VhayhudWxscHRyLCBjdXJyZW50
SGFzaHRhYmxlKSkgeworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAg
ICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogY3JlYXRlZCBpbml0
aWFsIGhhc2h0YWJsZSAiLCBSYXdQb2ludGVyKGN1cnJlbnRIYXNodGFibGUpLCAiXG4iKSk7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRIYXNodGFibGU7CiAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5n
KGN1cnJlbnRUaHJlYWQoKSwgIjogY3JlYXRlZCBpbml0aWFsIGhhc2h0YWJsZSAiLCBSYXdQb2lu
dGVyKGN1cnJlbnRIYXNodGFibGUpLCAiXG4iKSk7CisKKyAgICAgICAgICAgIEhhc2h0YWJsZTo6
ZGVzdHJveShjdXJyZW50SGFzaHRhYmxlKTsKICAgICAgICAgfQorICAgIH0KK30KKworLy8gTG9j
a3MgdGhlIGhhc2h0YWJsZS4gVGhpcyByZWxvb3BzIGluIGNhc2Ugb2YgcmVoYXNoaW5nLCBzbyB0
aGUgY3VycmVudCBoYXNodGFibGUgbWF5IGJlIGRpZmZlcmVudAorLy8gYWZ0ZXIgdGhpcyByZXR1
cm5zIHRoYW4gd2hlbiB5b3UgY2FsbGVkIGl0LiBHdWFyYW50ZWVzIHRoYXQgdGhlcmUgaXMgYSBo
YXNodGFibGUuIFRoaXMgaXMgcHJldHR5CisvLyBzbG93IGFuZCBub3Qgc2NhbGFibGUsIHNvIGl0
J3Mgb25seSB1c2VkIGR1cmluZyB0aHJlYWQgY3JlYXRpb24gYW5kIGZvciBkZWJ1Z2dpbmcvdGVz
dGluZy4KK1ZlY3RvcjxCdWNrZXQqPiBsb2NrSGFzaHRhYmxlKCkKK3sKKyAgICBmb3IgKDs7KSB7
CisgICAgICAgIEhhc2h0YWJsZSogY3VycmVudEhhc2h0YWJsZSA9IGVuc3VyZUhhc2h0YWJsZSgp
OworCisgICAgICAgIEFTU0VSVChjdXJyZW50SGFzaHRhYmxlKTsKIAogICAgICAgICAvLyBOb3cg
ZmluZCBhbGwgb2YgdGhlIGJ1Y2tldHMuIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBoYXNodGFi
bGUgaXMgZnVsbCBvZiBidWNrZXRzIHNvIHRoYXQKICAgICAgICAgLy8gd2UgY2FuIGxvY2sgYWxs
IG9mIHRoZSBidWNrZXRzLCBub3QganVzdCB0aGUgb25lcyB0aGF0IGFyZSBtYXRlcmlhbGl6ZWQu
CkBAIC00MDUsNyArNDE2LDcgQEAgYm9vbCBlbnF1ZXVlKGNvbnN0IHZvaWQqIGFkZHJlc3MsIGNv
bnN0IAogICAgIHVuc2lnbmVkIGhhc2ggPSBoYXNoQWRkcmVzcyhhZGRyZXNzKTsKIAogICAgIGZv
ciAoOzspIHsKLSAgICAgICAgSGFzaHRhYmxlKiBteUhhc2h0YWJsZSA9IGhhc2h0YWJsZS5sb2Fk
KCk7CisgICAgICAgIEhhc2h0YWJsZSogbXlIYXNodGFibGUgPSBlbnN1cmVIYXNodGFibGUoKTsK
ICAgICAgICAgdW5zaWduZWQgaW5kZXggPSBoYXNoICUgbXlIYXNodGFibGUtPnNpemU7CiAgICAg
ICAgIEF0b21pYzxCdWNrZXQqPiYgYnVja2V0UG9pbnRlciA9IG15SGFzaHRhYmxlLT5kYXRhW2lu
ZGV4XTsKICAgICAgICAgQnVja2V0KiBidWNrZXQ7CkBAIC00NDQsNTAgKzQ1NSw0NiBAQCBib29s
IGVucXVldWUoY29uc3Qgdm9pZCogYWRkcmVzcywgY29uc3QgCiAgICAgfQogfQogCi10ZW1wbGF0
ZTx0eXBlbmFtZSBGdW5jdG9yPgotYm9vbCBkZXF1ZXVlKGNvbnN0IHZvaWQqIGFkZHJlc3MsIGNv
bnN0IEZ1bmN0b3ImIGZ1bmN0b3IpCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXF1ZXVlRnVuY3Rvciwg
dHlwZW5hbWUgRmluaXNoRnVuY3Rvcj4KK2Jvb2wgZGVxdWV1ZSgKKyAgICBjb25zdCB2b2lkKiBh
ZGRyZXNzLCBib29sIGVuc3VyZUJ1Y2tldCwgY29uc3QgRGVxdWV1ZUZ1bmN0b3ImIGRlcXVldWVG
dW5jdG9yLAorICAgIGNvbnN0IEZpbmlzaEZ1bmN0b3ImIGZpbmlzaEZ1bmN0b3IpCiB7Ci0gICAg
aWYgKHZlcmJvc2UpCi0gICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAi
OiBkZXF1ZXVlaW5nIGFkZHJlc3MgIiwgUmF3UG9pbnRlcihhZGRyZXNzKSwgIlxuIikpOwogICAg
IHVuc2lnbmVkIGhhc2ggPSBoYXNoQWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAodmVyYm9zZSkK
LSAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6IGhhc2ggPSAiLCBo
YXNoLCAiXG4iKSk7CiAKICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIEhhc2h0YWJsZSogbXlIYXNo
dGFibGUgPSBoYXNodGFibGUubG9hZCgpOwotICAgICAgICBpZiAoIW15SGFzaHRhYmxlKSB7Ci0g
ICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5n
KGN1cnJlbnRUaHJlYWQoKSwgIjogbm8gaGFzaHRhYmxlLlxuIikpOwotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIEhhc2h0YWJsZSogbXlIYXNodGFibGUgPSBl
bnN1cmVIYXNodGFibGUoKTsKICAgICAgICAgdW5zaWduZWQgaW5kZXggPSBoYXNoICUgbXlIYXNo
dGFibGUtPnNpemU7Ci0gICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgZGF0YUxvZyh0
b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6IGluZGV4ID0gIiwgaW5kZXgsICJcbiIpKTsKLSAg
ICAgICAgQnVja2V0KiBidWNrZXQgPSBteUhhc2h0YWJsZS0+ZGF0YVtpbmRleF0ubG9hZCgpOwor
ICAgICAgICBBdG9taWM8QnVja2V0Kj4mIGJ1Y2tldFBvaW50ZXIgPSBteUhhc2h0YWJsZS0+ZGF0
YVtpbmRleF07CisgICAgICAgIEJ1Y2tldCogYnVja2V0ID0gYnVja2V0UG9pbnRlci5sb2FkKCk7
CiAgICAgICAgIGlmICghYnVja2V0KSB7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAg
ICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogbm8gYnVja2V0
IGF0ICIsIFJhd1BvaW50ZXIoYnVja2V0KSwgIi5cbiIpKTsKLSAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgICAgIGlmICghZW5zdXJlQnVja2V0KQorICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGJ1
Y2tldCA9IGJ1Y2tldFBvaW50ZXIubG9hZCgpOworICAgICAgICAgICAgICAgIGlmICghYnVja2V0
KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCA9IG5ldyBCdWNrZXQoKTsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCFidWNrZXRQb2ludGVyLmNvbXBhcmVFeGNoYW5nZVdlYWsobnVsbHB0
ciwgYnVja2V0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGJ1Y2tldDsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQog
ICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nKHRv
U3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogbG9ja2luZyBidWNrZXQgYXQgIiwgUmF3UG9pbnRl
cihidWNrZXQpLCAiXG4iKSk7CiAgICAgICAgIGJ1Y2tldC0+bG9jay5sb2NrKCk7Ci0gICAgICAg
IGlmICh2ZXJib3NlKQotICAgICAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFk
KCksICI6IGxvY2tlZCBidWNrZXQgYXQgIiwgUmF3UG9pbnRlcihidWNrZXQpLCAiXG4iKSk7CiAK
ICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgaGFzaHRhYmxlIGNvdWxkIGhhdmUgcmVoYXNo
ZWQgdW5kZXIgdXMuCiAgICAgICAgIGlmIChoYXNodGFibGUubG9hZCgpICE9IG15SGFzaHRhYmxl
KSB7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICBkYXRhTG9nKHRv
U3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogaGFzaHRhYmxlIGNoYW5nZWQuXG4iKSk7CiAgICAg
ICAgICAgICBidWNrZXQtPmxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAg
ICAgICAgfQogCi0gICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgZGF0YUxvZyh0b1N0
cmluZyhjdXJyZW50VGhyZWFkKCksICI6IGZvdW5kIGJ1Y2tldC5cbiIpKTsKLSAgICAgICAgYnVj
a2V0LT5nZW5lcmljRGVxdWV1ZShmdW5jdG9yKTsKKyAgICAgICAgYnVja2V0LT5nZW5lcmljRGVx
dWV1ZShkZXF1ZXVlRnVuY3Rvcik7CiAgICAgICAgIGJvb2wgcmVzdWx0ID0gISFidWNrZXQtPnF1
ZXVlSGVhZDsKKyAgICAgICAgZmluaXNoRnVuY3RvcihyZXN1bHQpOwogICAgICAgICBidWNrZXQt
PmxvY2sudW5sb2NrKCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNTAyLDgg
KzUwOSw2IEBAIGJvb2wgUGFya2luZ0xvdDo6cGFya0NvbmRpdGlvbmFsbHkoY29uc3QKICAgICAK
ICAgICBUaHJlYWREYXRhKiBtZSA9IG15VGhyZWFkRGF0YSgpOwogCi0gICAgQVNTRVJUKCFtZS0+
c2hvdWxkUGFyayk7Ci0gICAgCiAgICAgYm9vbCByZXN1bHQgPSBlbnF1ZXVlKAogICAgICAgICBh
ZGRyZXNzLAogICAgICAgICBbJl0gKCkgLT4gVGhyZWFkRGF0YSogewpAQCAtNTExLDcgKzUxNiw2
IEBAIGJvb2wgUGFya2luZ0xvdDo6cGFya0NvbmRpdGlvbmFsbHkoY29uc3QKICAgICAgICAgICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKIAogICAgICAgICAgICAgbWUtPmFkZHJlc3MgPSBhZGRyZXNz
OwotICAgICAgICAgICAgbWUtPnNob3VsZFBhcmsgPSB0cnVlOwogICAgICAgICAgICAgcmV0dXJu
IG1lOwogICAgICAgICB9KTsKIApAQCAtNTIyLDEwICs1MjYsOCBAQCBib29sIFBhcmtpbmdMb3Q6
OnBhcmtDb25kaXRpb25hbGx5KGNvbnN0CiAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVu
dFRocmVhZCgpLCAiOiBwYXJraW5nIHNlbGY6ICIsIFJhd1BvaW50ZXIobWUpLCAiXG4iKSk7CiAg
ICAgewogICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2tlcihtZS0+cGFy
a2luZ0xvY2spOwotICAgICAgICB3aGlsZSAobWUtPnNob3VsZFBhcmspCisgICAgICAgIHdoaWxl
IChtZS0+YWRkcmVzcykKICAgICAgICAgICAgIG1lLT5wYXJraW5nQ29uZGl0aW9uLndhaXQobG9j
a2VyKTsKLQotICAgICAgICBtZS0+YWRkcmVzcyA9IG51bGxwdHI7CiAgICAgfQogICAgIGlmICh2
ZXJib3NlKQogICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogdW5w
YXJrZWQgc2VsZjogIiwgUmF3UG9pbnRlcihtZSksICJcbiIpKTsKQEAgLTU0MCwxMiArNTQyLDE0
IEBAIGJvb2wgUGFya2luZ0xvdDo6dW5wYXJrT25lKGNvbnN0IHZvaWQqIGEKICAgICBUaHJlYWRE
YXRhKiB0aHJlYWREYXRhID0gbnVsbHB0cjsKICAgICBib29sIHJlc3VsdCA9IGRlcXVldWUoCiAg
ICAgICAgIGFkZHJlc3MsCisgICAgICAgIGZhbHNlLAogICAgICAgICBbJl0gKFRocmVhZERhdGEq
IGVsZW1lbnQpIHsKICAgICAgICAgICAgIGlmIChlbGVtZW50LT5hZGRyZXNzICE9IGFkZHJlc3Mp
CiAgICAgICAgICAgICAgICAgcmV0dXJuIERlcXVldWVSZXN1bHQ6Oklnbm9yZTsKICAgICAgICAg
ICAgIHRocmVhZERhdGEgPSBlbGVtZW50OwogICAgICAgICAgICAgcmV0dXJuIERlcXVldWVSZXN1
bHQ6OlJlbW92ZUFuZFN0b3A7Ci0gICAgICAgIH0pOworICAgICAgICB9LAorICAgICAgICBbXSAo
Ym9vbCkgeyB9KTsKIAogICAgIGlmICghdGhyZWFkRGF0YSkKICAgICAgICAgcmV0dXJuIGZhbHNl
OwpAQCAtNTU0LDEzICs1NTgsNDYgQEAgYm9vbCBQYXJraW5nTG90Ojp1bnBhcmtPbmUoY29uc3Qg
dm9pZCogYQogICAgIAogICAgIHsKICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4
PiBsb2NrZXIodGhyZWFkRGF0YS0+cGFya2luZ0xvY2spOwotICAgICAgICB0aHJlYWREYXRhLT5z
aG91bGRQYXJrID0gZmFsc2U7Ci0gICAgICAgIHRocmVhZERhdGEtPnBhcmtpbmdDb25kaXRpb24u
bm90aWZ5X2FsbCgpOworICAgICAgICB0aHJlYWREYXRhLT5hZGRyZXNzID0gbnVsbHB0cjsKICAg
ICB9CisgICAgdGhyZWFkRGF0YS0+cGFya2luZ0NvbmRpdGlvbi5ub3RpZnlfb25lKCk7CiAKICAg
ICByZXR1cm4gcmVzdWx0OwogfQogCit2b2lkIFBhcmtpbmdMb3Q6OnVucGFya09uZSgKKyAgICBj
b25zdCB2b2lkKiBhZGRyZXNzLAorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGRpZFVucGFy
a1RocmVhZCwgYm9vbCBtYXlIYXZlTW9yZVRocmVhZHMpPiBjYWxsYmFjaykKK3sKKyAgICBpZiAo
dmVyYm9zZSkKKyAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6IHVu
cGFya2luZyBvbmUgdGhlIGhhcmQgd2F5LlxuIikpOworCisgICAgVGhyZWFkRGF0YSogdGhyZWFk
RGF0YSA9IG51bGxwdHI7CisgICAgZGVxdWV1ZSgKKyAgICAgICAgYWRkcmVzcywKKyAgICAgICAg
dHJ1ZSwKKyAgICAgICAgWyZdIChUaHJlYWREYXRhKiBlbGVtZW50KSB7CisgICAgICAgICAgICBp
ZiAoZWxlbWVudC0+YWRkcmVzcyAhPSBhZGRyZXNzKQorICAgICAgICAgICAgICAgIHJldHVybiBE
ZXF1ZXVlUmVzdWx0OjpJZ25vcmU7CisgICAgICAgICAgICB0aHJlYWREYXRhID0gZWxlbWVudDsK
KyAgICAgICAgICAgIHJldHVybiBEZXF1ZXVlUmVzdWx0OjpSZW1vdmVBbmRTdG9wOworICAgICAg
ICB9LAorICAgICAgICBbJl0gKGJvb2wgbWF5SGF2ZU1vcmVUaHJlYWRzKSB7CisgICAgICAgICAg
ICBjYWxsYmFjayghIXRocmVhZERhdGEsIHRocmVhZERhdGEgJiYgbWF5SGF2ZU1vcmVUaHJlYWRz
KTsKKyAgICAgICAgfSk7CisKKyAgICBpZiAoIXRocmVhZERhdGEpCisgICAgICAgIHJldHVybjsK
KworICAgIEFTU0VSVCh0aHJlYWREYXRhLT5zaG91bGRQYXJrKTsKKyAgICAKKyAgICB7CisgICAg
ICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9ja2VyKHRocmVhZERhdGEtPnBhcmtp
bmdMb2NrKTsKKyAgICAgICAgdGhyZWFkRGF0YS0+YWRkcmVzcyA9IG51bGxwdHI7CisgICAgfQor
ICAgIHRocmVhZERhdGEtPnBhcmtpbmdDb25kaXRpb24ubm90aWZ5X29uZSgpOworfQorCiB2b2lk
IFBhcmtpbmdMb3Q6OnVucGFya0FsbChjb25zdCB2b2lkKiBhZGRyZXNzKQogewogICAgIGlmICh2
ZXJib3NlKQpAQCAtNTY5LDYgKzYwNiw3IEBAIHZvaWQgUGFya2luZ0xvdDo6dW5wYXJrQWxsKGNv
bnN0IHZvaWQqIGEKICAgICBWZWN0b3I8VGhyZWFkRGF0YSosIDg+IHRocmVhZERhdGFzOwogICAg
IGRlcXVldWUoCiAgICAgICAgIGFkZHJlc3MsCisgICAgICAgIGZhbHNlLAogICAgICAgICBbJl0g
KFRocmVhZERhdGEqIGVsZW1lbnQpIHsKICAgICAgICAgICAgIGlmICh2ZXJib3NlKQogICAgICAg
ICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBPYnNlcnZpbmcg
ZWxlbWVudCB3aXRoIGFkZHJlc3MgPSAiLCBSYXdQb2ludGVyKGVsZW1lbnQtPmFkZHJlc3MpLCAi
XG4iKSk7CkBAIC01NzYsMTUgKzYxNCwxOCBAQCB2b2lkIFBhcmtpbmdMb3Q6OnVucGFya0FsbChj
b25zdCB2b2lkKiBhCiAgICAgICAgICAgICAgICAgcmV0dXJuIERlcXVldWVSZXN1bHQ6Oklnbm9y
ZTsKICAgICAgICAgICAgIHRocmVhZERhdGFzLmFwcGVuZChlbGVtZW50KTsKICAgICAgICAgICAg
IHJldHVybiBEZXF1ZXVlUmVzdWx0OjpSZW1vdmVBbmRDb250aW51ZTsKLSAgICAgICAgfSk7Cisg
ICAgICAgIH0sCisgICAgICAgIFtdIChib29sKSB7IH0pOwogCiAgICAgZm9yIChUaHJlYWREYXRh
KiB0aHJlYWREYXRhIDogdGhyZWFkRGF0YXMpIHsKICAgICAgICAgaWYgKHZlcmJvc2UpCiAgICAg
ICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogdW5wYXJraW5nICIs
IFJhd1BvaW50ZXIodGhyZWFkRGF0YSksICIgd2l0aCBhZGRyZXNzICIsIFJhd1BvaW50ZXIodGhy
ZWFkRGF0YS0+YWRkcmVzcyksICJcbiIpKTsKICAgICAgICAgQVNTRVJUKHRocmVhZERhdGEtPnNo
b3VsZFBhcmspOwotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2tlcih0
aHJlYWREYXRhLT5wYXJraW5nTG9jayk7Ci0gICAgICAgIHRocmVhZERhdGEtPnNob3VsZFBhcmsg
PSBmYWxzZTsKLSAgICAgICAgdGhyZWFkRGF0YS0+cGFya2luZ0NvbmRpdGlvbi5ub3RpZnlfYWxs
KCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4g
bG9ja2VyKHRocmVhZERhdGEtPnBhcmtpbmdMb2NrKTsKKyAgICAgICAgICAgIHRocmVhZERhdGEt
PmFkZHJlc3MgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHRocmVhZERhdGEtPnBhcmtp
bmdDb25kaXRpb24ubm90aWZ5X29uZSgpOwogICAgIH0KIAogICAgIGlmICh2ZXJib3NlKQpJbmRl
eDogU291cmNlL1dURi93dGYvUGFya2luZ0xvdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYv
d3RmL1BhcmtpbmdMb3QuaAkocmV2aXNpb24gMTg4MzIyKQorKysgU291cmNlL1dURi93dGYvUGFy
a2luZ0xvdC5oCSh3b3JraW5nIGNvcHkpCkBAIC01OSw2ICs1OSwyMSBAQCBwdWJsaWM6CiAgICAg
Ly8gYXJlIG5vIG1vcmUgdGhyZWFkcyBvbiB0aGUgcXVldWUuCiAgICAgV1RGX0VYUE9SVF9QUklW
QVRFIHN0YXRpYyBib29sIHVucGFya09uZShjb25zdCB2b2lkKiBhZGRyZXNzKTsKIAorICAgIC8v
IFVucGFya3Mgb25lIHRocmVhZCBmcm9tIHRoZSBxdWV1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdp
dmVuIGFkZHJlc3MsIGFuZCBjYWxscyB0aGUgZ2l2ZW4KKyAgICAvLyBmdW5jdG9yIHdoaWxlIHRo
ZSBhZGRyZXNzIGlzIGxvY2tlZC4gUmVwb3J0cyB0byB0aGUgY2FsbGJhY2sgd2hldGhlciBhbnkg
dGhyZWFkIGdvdCB1bnBhcmtlZAorICAgIC8vIGFuZCB3aGV0aGVyIHRoZXJlIG1heSBiZSBhbnkg
b3RoZXIgdGhyZWFkcyBzdGlsbCBvbiB0aGUgcXVldWUuIFRoaXMgaXMgYW4gZXhwZXJ0LW1vZGUg
dmVyc2lvbgorICAgIC8vIG9mIHVucGFya09uZSgpIHRoYXQgYWxsb3dzIGZvciByZWFsbHkgZ29v
ZCB0aHVuZGVyaW5nIGhlcmQgYXZvaWRhbmNlIGluIGFkYXB0aXZlIG11dGV4ZXMuCisgICAgLy8g
V2l0aG91dCB0aGlzLCBhIGxvY2sgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIHVucGFya09uZSgp
IGhhcyB0byBoYXZlIHNvbWUgdHJpY2sgZm9yIGtub3dpbmcKKyAgICAvLyBpZiB0aGVyZSBhcmUg
c3RpbGwgdGhyZWFkcyBwYXJrZWQgb24gdGhlIHF1ZXVlLCBzbyB0aGF0IGl0IGNhbiBzZXQgc29t
ZSBiaXQgaW4gaXRzIGxvY2sgd29yZAorICAgIC8vIHRvIGluZGljYXRlIHRoYXQgdGhlIG5leHQg
dW5sb2NrKCkgYWxzbyBuZWVkcyB0byB1bnBhcmtPbmUoKS4gQnV0IHRoZXJlIGlzIGEgcmFjZSBi
ZXR3ZWVuCisgICAgLy8gbWFuaXB1bGF0aW5nIHRoYXQgYml0IGFuZCBzb21lIG90aGVyIHRocmVh
ZCBhY3F1aXJpbmcgdGhlIGxvY2suIEl0J3MgcG9zc2libGUgdG8gd29yayBhcm91bmQKKyAgICAv
LyB0aGF0IHJhY2UgLSBzZWUgUnVzdHkgUnVzc2VsJ3Mgd2VsbC1rbm93biB1c2Vyc2VtIGxpYnJh
cnkgLSBidXQgaXQncyBub3QgcHJldHR5LiBUaGlzIGZvcm0KKyAgICAvLyBhbGxvd3MgdGhhdCBy
YWNlIHRvIGJlIGNvbXBsZXRlbHkgYXZvaWRlZCwgc2luY2UgdGhlcmUgaXMgbm8gd2F5IHRoYXQg
YSB0aHJlYWQgY2FuIGJlIHBhcmtlZAorICAgIC8vIHdoaWxlIHRoZSBjYWxsYmFjayBpcyBydW5u
aW5nLgorICAgIFdURl9FWFBPUlRfUFJJVkFURSBzdGF0aWMgdm9pZCB1bnBhcmtPbmUoCisgICAg
ICAgIGNvbnN0IHZvaWQqIGFkZHJlc3MsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChib29s
IGRpZFVucGFya1RocmVhZCwgYm9vbCBtYXlIYXZlTW9yZVRocmVhZHMpPiBjYWxsYmFjayk7CisK
ICAgICAvLyBVbnBhcmtzIGV2ZXJ5IHRocmVhZCBmcm9tIHRoZSBxdWV1ZSBhc3NvY2lhdGVkIHdp
dGggdGhlIGdpdmVuIGFkZHJlc3MsIHdoaWNoIGNhbm5vdCBiZSBudWxsLgogICAgIFdURl9FWFBP
UlRfUFJJVkFURSBzdGF0aWMgdm9pZCB1bnBhcmtBbGwoY29uc3Qgdm9pZCogYWRkcmVzcyk7CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>258844</attachid>
            <date>2015-08-12 13:53:45 -0700</date>
            <delta_ts>2015-08-12 15:15:33 -0700</delta_ts>
            <desc>I think it works</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>23899</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxODgzNTUpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDY3IEBACisyMDE1LTA4LTEyICBGaWxpcCBQaXpsbyAgPGZwaXps
b0BhcHBsZS5jb20+CisKKyAgICAgICAgV1RGOjpMb2NrIHNob3VsZCBub3Qgc3VmZmVyIGZyb20g
dGhlIHRodW5kZXJpbmcgaGVyZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTQ3OTQ3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgVGhpcyBjaGFuZ2VzIExvY2s6OnVubG9ja1Nsb3coKSB0byB1c2UgdW5wYXJr
T25lKCkgaW5zdGVhZCBvZiB1bnBhcmtBbGwoKS4gVGhlIHByb2JsZW0gd2l0aAorICAgICAgICBk
b2luZyB0aGlzIGlzIHRoYXQgaXQncyBub3Qgb2J2aW91cyBhZnRlciBjYWxsaW5nIHVucGFya09u
ZSgpIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgdGhyZWFkcworICAgICAgICB0aGF0IGFyZSBzdGls
bCBwYXJrZWQgb24gdGhlIGxvY2sncyBxdWV1ZS4gSWYgd2UgYXNzdW1lIHRoYXQgdGhlcmUgYXJl
IGFuZCBsZWF2ZSB0aGUKKyAgICAgICAgaGFzUGFya2VkQml0IHNldCwgdGhlbiBmdXR1cmUgY2Fs
bHMgdG8gdW5sb2NrKCkgd2lsbCB0YWtlIHRoZSBzbG93IHBhdGguIFdlIGRvbid0IHdhbnQgdGhh
dAorICAgICAgICBpZiB0aGVyZSBhcmVuJ3QgYWN0dWFsbHkgYW55IHRocmVhZHMgcGFya2VkLiBP
biB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgYXNzdW1lIHRoYXQgdGhlcmUKKyAgICAgICAgYXJlbid0
IGFueSB0aHJlYWRzIHBhcmtlZCBhbmQgY2xlYXIgdGhlIGhhc1BhcmtlZEJpdCwgdGhlbiBpZiB0
aGVyZSBhY3R1YWxseSB3ZXJlIHNvbWUKKyAgICAgICAgdGhyZWFkcyBwYXJrZWQsIHRoZW4gdGhl
eSBtYXkgbmV2ZXIgYmUgYXdva2VuIHNpbmNlIGZ1dHVyZSBjYWxscyB0byB1bmxvY2soKSB3b24n
dCB0YWtlIHNsb3cKKyAgICAgICAgcGF0aCBhbmQgc28gd29uJ3QgY2FsbCB1bnBhcmtPbmUoKS4g
SW4gb3RoZXIgd29yZHMsIHdlIG5lZWQgYSB3YXkgdG8gYmUgdmVyeSBwcmVjaXNlIGFib3V0Cisg
ICAgICAgIHdoZW4gd2UgY2xlYXIgdGhlIGhhc1BhcmtlZEJpdCBhbmQgd2UgbmVlZCB0byBkbyBp
dCBpbiBhIHJhY2UtZnJlZSB3YXk6IGl0IGNhbid0IGJlIHRoZSBjYXNlCisgICAgICAgIHRoYXQg
d2UgY2xlYXIgdGhlIGJpdCBqdXN0IGFzIHNvbWUgdGhyZWFkIGdldHMgcGFya2VkIG9uIHRoZSBx
dWV1ZS4KKworICAgICAgICBBIHNpbWlsYXIgcHJvYmxlbSBhcmlzZXMgaW4gZnV0ZXhlcywgYW5k
IG9uZSBvZiB0aGUgc29sdXRpb25zIGlzIHRvIGhhdmUgYSB0aHJlYWQgdGhhdAorICAgICAgICBh
Y3F1aXJlcyBhIGxvY2sgYWZ0ZXIgcGFya2luZyBzZXRzIHRoZSBoYXNQYXJrZWRCaXQuIFRoaXMg
aXMgd2hhdCBSdXN0eSBSdXNzZWwncyB1c2Vyc2VtCisgICAgICAgIGRvZXMuIEl0J3MgYSBzdWJ0
bGUgYWxnb3JpdGhtLiBBbHNvLCBpdCBtZWFucyB0aGF0IGlmIGEgdGhyZWFkIGJhcmdlcyBpbiBi
ZWZvcmUgdGhlIHVucGFya2VkCisgICAgICAgIHRocmVhZCBydW5zLCB0aGVuIHRoYXQgYmFyZ2lu
ZyB0aHJlYWQgd2lsbCBub3Qga25vdyB0aGF0IHRoZXJlIGFyZSB0aHJlYWRzIHBhcmtlZC4gVGhp
cworICAgICAgICBjb3VsZCBpbmNyZWFzZSB0aGUgc2V2ZXJpdHkgb2YgYmFyZ2luZy4KKworICAg
ICAgICBTaW5jZSBQYXJraW5nTG90IGlzIGEgdXNlci1sZXZlbCBBUEksIHdlIGRvbid0IGhhdmUg
dG8gd29ycnkgYWJvdXQgdGhlIGtlcm5lbC11c2VyIHNlY3VyaXR5CisgICAgICAgIGlzc3VlcyBh
bmQgc28gd2UgY2FuIGV4cG9zZSBjYWxsYmFja3Mgd2hpbGUgUGFya2luZ0xvdCBpcyBob2xkaW5n
IGl0cyBpbnRlcm5hbCBsb2Nrcy4gVGhpcworICAgICAgICBjaGFuZ2UgZG9lcyBleGFjdGx5IHRo
YXQgZm9yIHVucGFya09uZSgpLiBUaGUgbmV3IHZhcmlhbnQgb2YgdW5wYXJrT25lKCkgd2lsbCBj
YWxsIGEgdXNlcgorICAgICAgICBmdW5jdGlvbiB3aGlsZSB0aGUgcXVldWUgZnJvbSB3aGljaCB3
ZSBhcmUgdW5wYXJraW5nIGlzIGxvY2tlZC4gVGhlIGNhbGxiYWNrIGlzIHRvbGQgYmFzaWMKKyAg
ICAgICAgc3RhdHMgYWJvdXQgdGhlIHF1ZXVlOiBkaWQgd2UgdW5wYXJrIGEgdGhyZWFkIHRoaXMg
dGltZSwgYW5kIGNvdWxkIHRoZXJlIGJlIG1vcmUgdGhyZWFkcyB0bworICAgICAgICB1bnBhcmsg
aW4gdGhlIGZ1dHVyZS4gVGhlIGNhbGxiYWNrIHJ1bnMgd2hpbGUgaXQncyBpbXBvc3NpYmxlIGZv
ciB0aGUgcXVldWUgc3RhdGUgdG8gY2hhbmdlLAorICAgICAgICBzaW5jZSB0aGUgUGFya2luZ0xv
dCdzIGludGVybmFsIGxvY2tzIGZvciB0aGUgcXVldWUgaXMgaGVsZC4gVGhpcyBtZWFucyB0aGF0
CisgICAgICAgIExvY2s6OnVubG9ja1Nsb3coKSBjYW4gZWl0aGVyIGNsZWFyLCBvciBsZWF2ZSwg
dGhlIGhhc1BhcmtlZEJpdCB3aGlsZSByZWxlYXNpbmcgdGhlIGxvY2sKKyAgICAgICAgaW5zaWRl
IHRoZSBjYWxsYmFjayBmcm9tIHVucGFya09uZSgpLiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIHRo
dW5kZXJpbmcgaGVyZCBwcm9ibGVtIHdoaWxlCisgICAgICAgIGFsc28gcmVkdWNpbmcgdGhlIGdy
ZWVkIHRoYXQgYXJpc2VzIGZyb20gYmFyZ2luZyB0aHJlYWRzLgorCisgICAgICAgIFRoaXMgcmVx
dWlyZWQgc29tZSBjYXJlZnVsIHJld29ya2luZyBvZiB0aGUgUGFya2luZ0xvdCBhbGdvcml0aG0u
IFRoZSBmaXJzdCB0aGluZyBJIG5vdGljZWQKKyAgICAgICAgd2FzIHRoYXQgdGhlIFRocmVhZERh
dGE6OnNob3VsZFBhcmsgZmxhZyB3YXMgdXNlbGVzcywgc2luY2UgaXQncyBzZXQgZXhhY3RseSB3
aGVuCisgICAgICAgIFRocmVhZERhdGE6OmFkZHJlc3MgaXMgbm9uLW51bGwuIFRoZW4gSSBoYWQg
dG8gbWFrZSBzdXJlIHRoYXQgZGVxdWV1ZSgpIGNvdWxkIGxhemlseSBjcmVhdGUKKyAgICAgICAg
Ym90aCBoYXNodGFibGVzIGFuZCBidWNrZXRzLCBzaW5jZSB0aGUgImNhbGxiYWNrIGlzIGNhbGxl
ZCB3aGlsZSBxdWV1ZSBpcyBsb2NrZWQiIGludmFyaWFudAorICAgICAgICByZXF1aXJlcyB0aGF0
IHdlIGRpZG4ndCBleGl0IGVhcmx5IGR1ZSB0byB0aGUgaGFzaHRhYmxlIG9yIGJ1Y2tldCBub3Qg
YmVpbmcgcHJlc2VudC4gTm90ZQorICAgICAgICB0aGF0IGFsbCBvZiB0aGlzIGlzIGRvbmUgaW4g
c3VjaCBhIHdheSB0aGF0IHRoZSBvbGQgdW5wYXJrT25lKCkgYW5kIHVucGFya0FsbCgpIGRvbid0
IGhhdmUKKyAgICAgICAgdG8gY3JlYXRlIGFueSBidWNrZXRzLCB0aG91Z2ggdGhleSBub3cgbWF5
IGNyZWF0ZSB0aGUgaGFzaHRhYmxlLiBXZSBkb24ndCBjYXJlIGFzIG11Y2ggYWJvdXQKKyAgICAg
ICAgdGhlIGhhc2h0YWJsZSBiZWluZyBjcmVhdGVkIGJ5IHVucGFyayBzaW5jZSBpdCdzIGp1c3Qg
c3VjaCBhbiB1bmxpa2VseSBzY2VuYXJpbyBhbmQgaXQgd291bGQKKyAgICAgICAgb25seSBoYXBw
ZW4gb25jZS4KKworICAgICAgICBUaGlzIGNoYW5nZSByZWR1Y2VzIHRoZSBrZXJuZWwgQ1BVIHVz
YWdlIG9mIFdURjo6TG9jayBmb3IgdGhlIGxvbmcgY3JpdGljYWwgc2VjdGlvbiB0ZXN0IGJ5Cisg
ICAgICAgIGFib3V0IDh4IGFuZCBtYWtlcyBpdCBhbHdheXMgcGVyZm9ybSBhcyB3ZWxsIGFzIFdU
Rjo6V29yZExvY2sgYW5kIFdURjo6TXV0ZXggZm9yIHRoYXQKKyAgICAgICAgYmVuY2htYXJrLgor
CisgICAgICAgICogYmVuY2htYXJrcy9Mb2NrU3BlZWRUZXN0LmNwcDoKKyAgICAgICAgKiB3dGYv
TG9jay5jcHA6CisgICAgICAgIChXVEY6OkxvY2tCYXNlOjp1bmxvY2tTbG93KToKKyAgICAgICAg
KiB3dGYvTG9jay5oOgorICAgICAgICAoV1RGOjpMb2NrQmFzZTo6aXNMb2NrZWQpOgorICAgICAg
ICAoV1RGOjpMb2NrQmFzZTo6aXNGdWxseVJlc2V0KToKKyAgICAgICAgKiB3dGYvUGFya2luZ0xv
dC5jcHA6CisgICAgICAgIChXVEY6OlBhcmtpbmdMb3Q6OnBhcmtDb25kaXRpb25hbGx5KToKKyAg
ICAgICAgKFdURjo6UGFya2luZ0xvdDo6dW5wYXJrT25lKToKKyAgICAgICAgKFdURjo6UGFya2lu
Z0xvdDo6dW5wYXJrQWxsKToKKyAgICAgICAgKiB3dGYvUGFya2luZ0xvdC5oOgorICAgICAgICAq
IHd0Zi9Xb3JkTG9jay5oOgorICAgICAgICAoV1RGOjpXb3JkTG9jazo6aXNMb2NrZWQpOgorICAg
ICAgICAoV1RGOjpXb3JkTG9jazo6aXNGdWxseVJlc2V0KToKKwogMjAxNS0wOC0xMSAgRmlsaXAg
UGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAgIEFsd2F5cyB1c2UgYSBieXRlLXNp
emVkIGxvY2sgaW1wbGVtZW50YXRpb24KSW5kZXg6IFNvdXJjZS9XVEYvYmVuY2htYXJrcy9Mb2Nr
U3BlZWRUZXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL2JlbmNobWFya3MvTG9ja1Nw
ZWVkVGVzdC5jcHAJKHJldmlzaW9uIDE4ODMyMykKKysrIFNvdXJjZS9XVEYvYmVuY2htYXJrcy9M
b2NrU3BlZWRUZXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNyArNDQsNyBAQCB1bnNpZ25l
ZCBudW1JdGVyYXRpb25zOwogICAgIAogTk9fUkVUVVJOIHZvaWQgdXNhZ2UoKQogewotICAgIHBy
aW50ZigiVXNhZ2U6IExvY2tTcGVlZFRlc3Qgc3BpbmxvY2t8d29yZGxvY2t8bG9ja3xieXRlbG9j
a3xtdXRleHxhbGwgPG51bSB0aHJlYWQgZ3JvdXBzPiA8bnVtIHRocmVhZHMgcGVyIGdyb3VwPiA8
d29yayBwZXIgY3JpdGljYWwgc2VjdGlvbj4gPG51bSBub2lzZSB0aHJlYWRzPiA8bnVtIGl0ZXJh
dGlvbnM+XG4iKTsKKyAgICBwcmludGYoIlVzYWdlOiBMb2NrU3BlZWRUZXN0IHNwaW5sb2NrfHdv
cmRsb2NrfGxvY2t8bXV0ZXh8YWxsIDxudW0gdGhyZWFkIGdyb3Vwcz4gPG51bSB0aHJlYWRzIHBl
ciBncm91cD4gPHdvcmsgcGVyIGNyaXRpY2FsIHNlY3Rpb24+IDxudW0gbm9pc2UgdGhyZWFkcz4g
PG51bSBpdGVyYXRpb25zPlxuIik7CiAgICAgZXhpdCgxKTsKIH0KIApJbmRleDogU291cmNlL1dU
Ri93dGYvTG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvTG9jay5jcHAJKHJl
dmlzaW9uIDE4ODMyMykKKysrIFNvdXJjZS9XVEYvd3RmL0xvY2suY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC03NiwzMCArNzYsMzkgQEAgdm9pZCBMb2NrQmFzZTo6bG9ja1Nsb3coKQogCiB2b2lkIExv
Y2tCYXNlOjp1bmxvY2tTbG93KCkKIHsKLSAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHdoaWxlIGZp
bmRpbmcgb3V0IGlmIHNvbWVvbmUgaXMgcGFya2VkLiBOb3RlIHRoYXQgYXMgc29vbiBhcyB3ZSBk
byB0aGlzLAotICAgIC8vIHNvbWVvbmUgbWlnaHQgYmFyZ2UgaW4uCi0gICAgdWludDhfdCBvbGRC
eXRlVmFsdWU7CisgICAgLy8gV2UgY291bGQgZ2V0IGhlcmUgYmVjYXVzZSB0aGUgd2VhayBDQVMg
aW4gdW5sb2NrKCkgZmFpbGVkIHNwdXJpb3VzbHksIG9yIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAv
LyBzb21lb25lIHBhcmtlZC4gU28sIHdlIG5lZWQgYSBDQVMgbG9vcDogZXZlbiBpZiByaWdodCBu
b3cgdGhlIGxvY2sgaXMganVzdCBoZWxkLCBpdCBjb3VsZAorICAgIC8vIGJlIGhlbGQgYW5kIHBh
cmtlZCBpZiBzb21lb25lIGF0dGVtcHRzIHRvIGxvY2sganVzdCBhcyB3ZSBhcmUgdW5sb2NraW5n
LgogICAgIGZvciAoOzspIHsKLSAgICAgICAgb2xkQnl0ZVZhbHVlID0gbV9ieXRlLmxvYWQoKTsK
LSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJl
bnRUaHJlYWQoKSwgIjogdW5sb2NraW5nIHdpdGggIiwgb2xkQnl0ZVZhbHVlLCAiXG4iKSk7Ci0g
ICAgICAgIEFTU0VSVChvbGRCeXRlVmFsdWUgJiBpc0hlbGRCaXQpOwotICAgICAgICBpZiAobV9i
eXRlLmNvbXBhcmVFeGNoYW5nZVdlYWsob2xkQnl0ZVZhbHVlLCAwKSkKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgIH0KKyAgICAgICAgdWludDhfdCBvbGRCeXRlVmFsdWUgPSBtX2J5dGUubG9hZCgp
OworICAgICAgICBBU1NFUlQob2xkQnl0ZVZhbHVlID09IGlzSGVsZEJpdCB8fCBvbGRCeXRlVmFs
dWUgPT0gKGlzSGVsZEJpdCB8IGhhc1BhcmtlZEJpdCkpOworICAgICAgICAKKyAgICAgICAgaWYg
KG9sZEJ5dGVWYWx1ZSA9PSBpc0hlbGRCaXQpIHsKKyAgICAgICAgICAgIGlmIChtX2J5dGUuY29t
cGFyZUV4Y2hhbmdlV2Vhayhpc0hlbGRCaXQsIDApKQorICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLSAgICAvLyBOb3RlIHRoYXQgc29t
ZW9uZSBjb3VsZCB0cnkgdG8gcGFyayByaWdodCBub3cuIElmIHRoYXQgaGFwcGVucywgdGhleSB3
aWxsIHJldHVybiBpbW1lZGlhdGVseQotICAgIC8vIGJlY2F1c2Ugb3VyIHBhcmtpbmcgcHJlZGlj
YXRlIGlzIHRoYXQgbV9ieXRlID09IGlzSGVsZEJpdCB8IGhhc1BhcmtlZEJpdCwgYnV0IHdlJ3Zl
IGFscmVhZHkgc2V0Ci0gICAgLy8gbV9ieXRlID0gMC4KKyAgICAgICAgLy8gU29tZW9uZSBpcyBw
YXJrZWQuIFVucGFyayBleGFjdGx5IG9uZSB0aHJlYWQsIHBvc3NpYmx5IGxlYXZpbmcgdGhlIHBh
cmtlZCBiaXQgc2V0IGlmCisgICAgICAgIC8vIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgdGhlcmUg
YXJlIHN0aWxsIG90aGVyIHRocmVhZHMgcGFya2VkLgorICAgICAgICBBU1NFUlQob2xkQnl0ZVZh
bHVlID09IChpc0hlbGRCaXQgfCBoYXNQYXJrZWRCaXQpKTsKKyAgICAgICAgYm9vbCBkaWRVbmxv
Y2sgPSBmYWxzZTsKKyAgICAgICAgUGFya2luZ0xvdDo6dW5wYXJrT25lKAorICAgICAgICAgICAg
Jm1fYnl0ZSwKKyAgICAgICAgICAgIFsmXSAoYm9vbCwgYm9vbCBtYXlIYXZlTW9yZVRocmVhZHMp
IHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IGNhbiBjbGVh
ciBlaXRoZXIgdGhlIGlzSGVsZEJpdCBvciB0aGUgaGFzUGFya2VkQml0LAorICAgICAgICAgICAg
ICAgIC8vIHNvIHdlIHNob3VsZCBzdGlsbCBzZWUgYm90aCBiaXRzIHNldCByaWdodCBub3cuCisg
ICAgICAgICAgICAgICAgQVNTRVJUKG1fYnl0ZS5sb2FkKCkgPT0gKGlzSGVsZEJpdCB8IGhhc1Bh
cmtlZEJpdCkpOwogCi0gICAgLy8gSWYgdGhlcmUgaGFkIGJlZW4gdGhyZWFkcyBwYXJrZWQsIHVu
cGFyayBhbGwgb2YgdGhlbS4gVGhpcyBjYXVzZXMgYSB0aHVuZGVyaW5nIGhlcmQsIGJ1dCB3aGls
ZQotICAgIC8vIHRoYXQgaXMgdGhlb3JldGljYWxseSBzY2FyeSwgaXQncyB0b3RhbGx5IGZpbmUg
aW4gV2ViS2l0IGJlY2F1c2Ugd2UgdXN1YWxseSBkb24ndCBoYXZlIGVub3VnaAotICAgIC8vIHRo
cmVhZHMgZm9yIHRoaXMgdG8gbWF0dGVyLgotICAgIC8vIEZJWE1FOiBXZSBkb24ndCByZWFsbHkg
bmVlZCB0aGlzIHRvIGV4aGliaXQgdGh1bmRlcmluZyBoZXJkLiBXZSBjb3VsZCB1c2UgdW5wYXJr
T25lKCksIGFuZCBpZgotICAgIC8vIHRoYXQgcmV0dXJucyB0cnVlLCBqdXN0IHNldCB0aGUgcGFy
a2VkIGJpdCBhZ2Fpbi4gSWYgaW4gdGhlIHByb2Nlc3Mgb2Ygc2V0dGluZyB0aGUgcGFya2VkIGJp
dAotICAgIC8vIHdlIGZhaWwgdGhlIENBUywgdGhlbiBqdXN0IHVucGFyayBhZ2Fpbi4KLSAgICBp
ZiAob2xkQnl0ZVZhbHVlICYgaGFzUGFya2VkQml0KQotICAgICAgICBQYXJraW5nTG90Ojp1bnBh
cmtBbGwoJm1fYnl0ZSk7CisgICAgICAgICAgICAgICAgaWYgKG1heUhhdmVNb3JlVGhyZWFkcykK
KyAgICAgICAgICAgICAgICAgICAgbV9ieXRlLnN0b3JlKGhhc1BhcmtlZEJpdCk7CisgICAgICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtX2J5dGUuc3RvcmUoMCk7CisgICAg
ICAgICAgICAgICAgZGlkVW5sb2NrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0pOworICAgICAgICBB
U1NFUlQoZGlkVW5sb2NrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIH0KIAogfSAvLyBuYW1l
c3BhY2UgV1RGCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9Mb2NrLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dURi93dGYvTG9jay5oCShyZXZpc2lvbiAxODgzMjMpCisrKyBTb3VyY2UvV1RGL3d0Zi9M
b2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDEwIEBACiAjaW5jbHVkZSA8d3RmL0xv
Y2tlci5oPgogI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgogCituYW1lc3BhY2UgVGVzdFdl
YktpdEFQSSB7CitzdHJ1Y3QgTG9ja0luc3BlY3RvcjsKK307CisKIG5hbWVzcGFjZSBXVEYgewog
CiAvLyBUaGlzIGlzIGEgZnVsbHkgYWRhcHRpdmUgbXV0ZXggdGhhdCBvbmx5IHJlcXVpcmVzIDEg
Ynl0ZSBvZiBzdG9yYWdlLiBJdCBoYXMgZmFzdCBwYXRocyB0aGF0IGFyZQpAQCAtNzMsMTIgKzc3
LDIwIEBAIHN0cnVjdCBMb2NrQmFzZSB7CiAgICAgfQogCiBwcm90ZWN0ZWQ6CisgICAgZnJpZW5k
IHN0cnVjdCBUZXN0V2ViS2l0QVBJOjpMb2NrSW5zcGVjdG9yOworICAgIAogICAgIHN0YXRpYyBj
b25zdCB1aW50OF90IGlzSGVsZEJpdCA9IDE7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaGFz
UGFya2VkQml0ID0gMjsKIAogICAgIFdURl9FWFBPUlRfUFJJVkFURSB2b2lkIGxvY2tTbG93KCk7
CiAgICAgV1RGX0VYUE9SVF9QUklWQVRFIHZvaWQgdW5sb2NrU2xvdygpOwogCisgICAgLy8gTWV0
aG9kIHVzZWQgZm9yIHRlc3Rpbmcgb25seS4KKyAgICBib29sIGlzRnVsbHlSZXNldCgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gIW1fYnl0ZS5sb2FkKCk7CisgICAgfQorCiAgICAgQXRv
bWljPHVpbnQ4X3Q+IG1fYnl0ZTsKIH07CiAKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL1BhcmtpbmdM
b3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1BhcmtpbmdMb3QuY3BwCShyZXZp
c2lvbiAxODgzMjMpCisrKyBTb3VyY2UvV1RGL3d0Zi9QYXJraW5nTG90LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTIsMTEgKzUyLDExIEBAIHB1YmxpYzoKIAogICAgIFRocmVhZElkZW50aWZpZXIg
dGhyZWFkSWRlbnRpZmllcjsKICAgICAKLSAgICBib29sIHNob3VsZFBhcmsgeyBmYWxzZSB9Owog
ICAgIHN0ZDo6bXV0ZXggcGFya2luZ0xvY2s7CiAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUg
cGFya2luZ0NvbmRpdGlvbjsKIAotICAgIGNvbnN0IHZvaWQqIGFkZHJlc3M7CisgICAgY29uc3Qg
dm9pZCogYWRkcmVzcyB7IG51bGxwdHIgfTsKKyAgICAKICAgICBUaHJlYWREYXRhKiBuZXh0SW5R
dWV1ZSB7IG51bGxwdHIgfTsKIH07CiAKQEAgLTIxMiwyNSArMjEyLDM2IEBAIHVuc2lnbmVkIGhh
c2hBZGRyZXNzKGNvbnN0IHZvaWQqIGFkZHJlc3MKICAgICByZXR1cm4gV1RGOjpQdHJIYXNoPGNv
bnN0IHZvaWQqPjo6aGFzaChhZGRyZXNzKTsKIH0KIAotLy8gTG9ja3MgdGhlIGhhc2h0YWJsZS4g
VGhpcyByZWxvb3BzIGluIGNhc2Ugb2YgcmVoYXNoaW5nLCBzbyB0aGUgY3VycmVudCBoYXNodGFi
bGUgbWF5IGJlIGRpZmZlcmVudAotLy8gYWZ0ZXIgdGhpcyByZXR1cm5zIHRoYW4gd2hlbiB5b3Ug
Y2FsbGVkIGl0LiBHdWFyYW50ZWVzIHRoYXQgdGhlcmUgaXMgYSBoYXNodGFibGUuIFRoaXMgaXMg
cHJldHR5Ci0vLyBzbG93IGFuZCBub3Qgc2NhbGFibGUsIHNvIGl0J3Mgb25seSB1c2VkIGR1cmlu
ZyB0aHJlYWQgY3JlYXRpb24gYW5kIGZvciBkZWJ1Z2dpbmcvdGVzdGluZy4KLVZlY3RvcjxCdWNr
ZXQqPiBsb2NrSGFzaHRhYmxlKCkKK0hhc2h0YWJsZSogZW5zdXJlSGFzaHRhYmxlKCkKIHsKICAg
ICBmb3IgKDs7KSB7Ci0gICAgICAgIEhhc2h0YWJsZSogY3VycmVudEhhc2h0YWJsZTsKKyAgICAg
ICAgSGFzaHRhYmxlKiBjdXJyZW50SGFzaHRhYmxlID0gaGFzaHRhYmxlLmxvYWQoKTsKKworICAg
ICAgICBpZiAoY3VycmVudEhhc2h0YWJsZSkKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50SGFz
aHRhYmxlOwogCi0gICAgICAgIGN1cnJlbnRIYXNodGFibGUgPSBoYXNodGFibGUubG9hZCgpOwog
ICAgICAgICBpZiAoIWN1cnJlbnRIYXNodGFibGUpIHsKLSAgICAgICAgICAgIC8vIFRyeSB0byBi
ZSB0aGUgZmlyc3QgdG8gY3JlYXRlIHRoZSBoYXNodGFibGUuCiAgICAgICAgICAgICBjdXJyZW50
SGFzaHRhYmxlID0gSGFzaHRhYmxlOjpjcmVhdGUobWF4TG9hZEZhY3Rvcik7Ci0gICAgICAgICAg
ICBpZiAoIWhhc2h0YWJsZS5jb21wYXJlRXhjaGFuZ2VXZWFrKG51bGxwdHIsIGN1cnJlbnRIYXNo
dGFibGUpKSB7Ci0gICAgICAgICAgICAgICAgSGFzaHRhYmxlOjpkZXN0cm95KGN1cnJlbnRIYXNo
dGFibGUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGhhc2h0
YWJsZS5jb21wYXJlRXhjaGFuZ2VXZWFrKG51bGxwdHIsIGN1cnJlbnRIYXNodGFibGUpKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMb2co
dG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBjcmVhdGVkIGluaXRpYWwgaGFzaHRhYmxlICIs
IFJhd1BvaW50ZXIoY3VycmVudEhhc2h0YWJsZSksICJcbiIpKTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gY3VycmVudEhhc2h0YWJsZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2
ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgp
LCAiOiBjcmVhdGVkIGluaXRpYWwgaGFzaHRhYmxlICIsIFJhd1BvaW50ZXIoY3VycmVudEhhc2h0
YWJsZSksICJcbiIpKTsKKworICAgICAgICAgICAgSGFzaHRhYmxlOjpkZXN0cm95KGN1cnJlbnRI
YXNodGFibGUpOwogICAgICAgICB9CisgICAgfQorfQorCisvLyBMb2NrcyB0aGUgaGFzaHRhYmxl
LiBUaGlzIHJlbG9vcHMgaW4gY2FzZSBvZiByZWhhc2hpbmcsIHNvIHRoZSBjdXJyZW50IGhhc2h0
YWJsZSBtYXkgYmUgZGlmZmVyZW50CisvLyBhZnRlciB0aGlzIHJldHVybnMgdGhhbiB3aGVuIHlv
dSBjYWxsZWQgaXQuIEd1YXJhbnRlZXMgdGhhdCB0aGVyZSBpcyBhIGhhc2h0YWJsZS4gVGhpcyBp
cyBwcmV0dHkKKy8vIHNsb3cgYW5kIG5vdCBzY2FsYWJsZSwgc28gaXQncyBvbmx5IHVzZWQgZHVy
aW5nIHRocmVhZCBjcmVhdGlvbiBhbmQgZm9yIGRlYnVnZ2luZy90ZXN0aW5nLgorVmVjdG9yPEJ1
Y2tldCo+IGxvY2tIYXNodGFibGUoKQoreworICAgIGZvciAoOzspIHsKKyAgICAgICAgSGFzaHRh
YmxlKiBjdXJyZW50SGFzaHRhYmxlID0gZW5zdXJlSGFzaHRhYmxlKCk7CisKKyAgICAgICAgQVNT
RVJUKGN1cnJlbnRIYXNodGFibGUpOwogCiAgICAgICAgIC8vIE5vdyBmaW5kIGFsbCBvZiB0aGUg
YnVja2V0cy4gVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGhhc2h0YWJsZSBpcyBmdWxsIG9mIGJ1
Y2tldHMgc28gdGhhdAogICAgICAgICAvLyB3ZSBjYW4gbG9jayBhbGwgb2YgdGhlIGJ1Y2tldHMs
IG5vdCBqdXN0IHRoZSBvbmVzIHRoYXQgYXJlIG1hdGVyaWFsaXplZC4KQEAgLTQwNSw3ICs0MTYs
NyBAQCBib29sIGVucXVldWUoY29uc3Qgdm9pZCogYWRkcmVzcywgY29uc3QgCiAgICAgdW5zaWdu
ZWQgaGFzaCA9IGhhc2hBZGRyZXNzKGFkZHJlc3MpOwogCiAgICAgZm9yICg7OykgewotICAgICAg
ICBIYXNodGFibGUqIG15SGFzaHRhYmxlID0gaGFzaHRhYmxlLmxvYWQoKTsKKyAgICAgICAgSGFz
aHRhYmxlKiBteUhhc2h0YWJsZSA9IGVuc3VyZUhhc2h0YWJsZSgpOwogICAgICAgICB1bnNpZ25l
ZCBpbmRleCA9IGhhc2ggJSBteUhhc2h0YWJsZS0+c2l6ZTsKICAgICAgICAgQXRvbWljPEJ1Y2tl
dCo+JiBidWNrZXRQb2ludGVyID0gbXlIYXNodGFibGUtPmRhdGFbaW5kZXhdOwogICAgICAgICBC
dWNrZXQqIGJ1Y2tldDsKQEAgLTQ0NCw1MCArNDU1LDQ2IEBAIGJvb2wgZW5xdWV1ZShjb25zdCB2
b2lkKiBhZGRyZXNzLCBjb25zdCAKICAgICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0
b3I+Ci1ib29sIGRlcXVldWUoY29uc3Qgdm9pZCogYWRkcmVzcywgY29uc3QgRnVuY3RvciYgZnVu
Y3RvcikKK3RlbXBsYXRlPHR5cGVuYW1lIERlcXVldWVGdW5jdG9yLCB0eXBlbmFtZSBGaW5pc2hG
dW5jdG9yPgorYm9vbCBkZXF1ZXVlKAorICAgIGNvbnN0IHZvaWQqIGFkZHJlc3MsIGJvb2wgZW5z
dXJlQnVja2V0LCBjb25zdCBEZXF1ZXVlRnVuY3RvciYgZGVxdWV1ZUZ1bmN0b3IsCisgICAgY29u
c3QgRmluaXNoRnVuY3RvciYgZmluaXNoRnVuY3RvcikKIHsKLSAgICBpZiAodmVyYm9zZSkKLSAg
ICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6IGRlcXVldWVpbmcgYWRk
cmVzcyAiLCBSYXdQb2ludGVyKGFkZHJlc3MpLCAiXG4iKSk7CiAgICAgdW5zaWduZWQgaGFzaCA9
IGhhc2hBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICh2ZXJib3NlKQotICAgICAgICBkYXRhTG9n
KHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogaGFzaCA9ICIsIGhhc2gsICJcbiIpKTsKIAog
ICAgIGZvciAoOzspIHsKLSAgICAgICAgSGFzaHRhYmxlKiBteUhhc2h0YWJsZSA9IGhhc2h0YWJs
ZS5sb2FkKCk7Ci0gICAgICAgIGlmICghbXlIYXNodGFibGUpIHsKLSAgICAgICAgICAgIGlmICh2
ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgp
LCAiOiBubyBoYXNodGFibGUuXG4iKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIH0KKyAgICAgICAgSGFzaHRhYmxlKiBteUhhc2h0YWJsZSA9IGVuc3VyZUhhc2h0YWJsZSgp
OwogICAgICAgICB1bnNpZ25lZCBpbmRleCA9IGhhc2ggJSBteUhhc2h0YWJsZS0+c2l6ZTsKLSAg
ICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRU
aHJlYWQoKSwgIjogaW5kZXggPSAiLCBpbmRleCwgIlxuIikpOwotICAgICAgICBCdWNrZXQqIGJ1
Y2tldCA9IG15SGFzaHRhYmxlLT5kYXRhW2luZGV4XS5sb2FkKCk7CisgICAgICAgIEF0b21pYzxC
dWNrZXQqPiYgYnVja2V0UG9pbnRlciA9IG15SGFzaHRhYmxlLT5kYXRhW2luZGV4XTsKKyAgICAg
ICAgQnVja2V0KiBidWNrZXQgPSBidWNrZXRQb2ludGVyLmxvYWQoKTsKICAgICAgICAgaWYgKCFi
dWNrZXQpIHsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFM
b2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBubyBidWNrZXQgYXQgIiwgUmF3UG9pbnRl
cihidWNrZXQpLCAiLlxuIikpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgaWYgKCFlbnN1cmVCdWNrZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgYnVja2V0ID0gYnVja2V0UG9p
bnRlci5sb2FkKCk7CisgICAgICAgICAgICAgICAgaWYgKCFidWNrZXQpIHsKKyAgICAgICAgICAg
ICAgICAgICAgYnVja2V0ID0gbmV3IEJ1Y2tldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAo
IWJ1Y2tldFBvaW50ZXIuY29tcGFyZUV4Y2hhbmdlV2VhayhudWxscHRyLCBidWNrZXQpKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYnVja2V0OworICAgICAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAg
ICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRo
cmVhZCgpLCAiOiBsb2NraW5nIGJ1Y2tldCBhdCAiLCBSYXdQb2ludGVyKGJ1Y2tldCksICJcbiIp
KTsKICAgICAgICAgYnVja2V0LT5sb2NrLmxvY2soKTsKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0g
ICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogbG9ja2VkIGJ1
Y2tldCBhdCAiLCBSYXdQb2ludGVyKGJ1Y2tldCksICJcbiIpKTsKIAogICAgICAgICAvLyBBdCB0
aGlzIHBvaW50IHRoZSBoYXNodGFibGUgY291bGQgaGF2ZSByZWhhc2hlZCB1bmRlciB1cy4KICAg
ICAgICAgaWYgKGhhc2h0YWJsZS5sb2FkKCkgIT0gbXlIYXNodGFibGUpIHsKLSAgICAgICAgICAg
IGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRo
cmVhZCgpLCAiOiBoYXNodGFibGUgY2hhbmdlZC5cbiIpKTsKICAgICAgICAgICAgIGJ1Y2tldC0+
bG9jay51bmxvY2soKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAg
ICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJl
YWQoKSwgIjogZm91bmQgYnVja2V0LlxuIikpOwotICAgICAgICBidWNrZXQtPmdlbmVyaWNEZXF1
ZXVlKGZ1bmN0b3IpOworICAgICAgICBidWNrZXQtPmdlbmVyaWNEZXF1ZXVlKGRlcXVldWVGdW5j
dG9yKTsKICAgICAgICAgYm9vbCByZXN1bHQgPSAhIWJ1Y2tldC0+cXVldWVIZWFkOworICAgICAg
ICBmaW5pc2hGdW5jdG9yKHJlc3VsdCk7CiAgICAgICAgIGJ1Y2tldC0+bG9jay51bmxvY2soKTsK
ICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC01MDIsOCArNTA5LDYgQEAgYm9vbCBQ
YXJraW5nTG90OjpwYXJrQ29uZGl0aW9uYWxseShjb25zdAogICAgIAogICAgIFRocmVhZERhdGEq
IG1lID0gbXlUaHJlYWREYXRhKCk7CiAKLSAgICBBU1NFUlQoIW1lLT5zaG91bGRQYXJrKTsKLSAg
ICAKICAgICBib29sIHJlc3VsdCA9IGVucXVldWUoCiAgICAgICAgIGFkZHJlc3MsCiAgICAgICAg
IFsmXSAoKSAtPiBUaHJlYWREYXRhKiB7CkBAIC01MTEsNyArNTE2LDYgQEAgYm9vbCBQYXJraW5n
TG90OjpwYXJrQ29uZGl0aW9uYWxseShjb25zdAogICAgICAgICAgICAgICAgIHJldHVybiBudWxs
cHRyOwogCiAgICAgICAgICAgICBtZS0+YWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgICAgICAgICBt
ZS0+c2hvdWxkUGFyayA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gbWU7CiAgICAgICAgIH0p
OwogCkBAIC01MjIsMTAgKzUyNiw4IEBAIGJvb2wgUGFya2luZ0xvdDo6cGFya0NvbmRpdGlvbmFs
bHkoY29uc3QKICAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6IHBh
cmtpbmcgc2VsZjogIiwgUmF3UG9pbnRlcihtZSksICJcbiIpKTsKICAgICB7CiAgICAgICAgIHN0
ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9ja2VyKG1lLT5wYXJraW5nTG9jayk7Ci0gICAg
ICAgIHdoaWxlIChtZS0+c2hvdWxkUGFyaykKKyAgICAgICAgd2hpbGUgKG1lLT5hZGRyZXNzKQog
ICAgICAgICAgICAgbWUtPnBhcmtpbmdDb25kaXRpb24ud2FpdChsb2NrZXIpOwotCi0gICAgICAg
IG1lLT5hZGRyZXNzID0gbnVsbHB0cjsKICAgICB9CiAgICAgaWYgKHZlcmJvc2UpCiAgICAgICAg
IGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiB1bnBhcmtlZCBzZWxmOiAiLCBS
YXdQb2ludGVyKG1lKSwgIlxuIikpOwpAQCAtNTQwLDEyICs1NDIsMTQgQEAgYm9vbCBQYXJraW5n
TG90Ojp1bnBhcmtPbmUoY29uc3Qgdm9pZCogYQogICAgIFRocmVhZERhdGEqIHRocmVhZERhdGEg
PSBudWxscHRyOwogICAgIGJvb2wgcmVzdWx0ID0gZGVxdWV1ZSgKICAgICAgICAgYWRkcmVzcywK
KyAgICAgICAgZmFsc2UsCiAgICAgICAgIFsmXSAoVGhyZWFkRGF0YSogZWxlbWVudCkgewogICAg
ICAgICAgICAgaWYgKGVsZW1lbnQtPmFkZHJlc3MgIT0gYWRkcmVzcykKICAgICAgICAgICAgICAg
ICByZXR1cm4gRGVxdWV1ZVJlc3VsdDo6SWdub3JlOwogICAgICAgICAgICAgdGhyZWFkRGF0YSA9
IGVsZW1lbnQ7CiAgICAgICAgICAgICByZXR1cm4gRGVxdWV1ZVJlc3VsdDo6UmVtb3ZlQW5kU3Rv
cDsKLSAgICAgICAgfSk7CisgICAgICAgIH0sCisgICAgICAgIFtdIChib29sKSB7IH0pOwogCiAg
ICAgaWYgKCF0aHJlYWREYXRhKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC01NTQsMTMgKzU1
OCw0NiBAQCBib29sIFBhcmtpbmdMb3Q6OnVucGFya09uZShjb25zdCB2b2lkKiBhCiAgICAgCiAg
ICAgewogICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2tlcih0aHJlYWRE
YXRhLT5wYXJraW5nTG9jayk7Ci0gICAgICAgIHRocmVhZERhdGEtPnNob3VsZFBhcmsgPSBmYWxz
ZTsKLSAgICAgICAgdGhyZWFkRGF0YS0+cGFya2luZ0NvbmRpdGlvbi5ub3RpZnlfYWxsKCk7Cisg
ICAgICAgIHRocmVhZERhdGEtPmFkZHJlc3MgPSBudWxscHRyOwogICAgIH0KKyAgICB0aHJlYWRE
YXRhLT5wYXJraW5nQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKIAogICAgIHJldHVybiByZXN1bHQ7
CiB9CiAKK3ZvaWQgUGFya2luZ0xvdDo6dW5wYXJrT25lKAorICAgIGNvbnN0IHZvaWQqIGFkZHJl
c3MsCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgZGlkVW5wYXJrVGhyZWFkLCBib29sIG1h
eUhhdmVNb3JlVGhyZWFkcyk+IGNhbGxiYWNrKQoreworICAgIGlmICh2ZXJib3NlKQorICAgICAg
ICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogdW5wYXJraW5nIG9uZSB0aGUg
aGFyZCB3YXkuXG4iKSk7CisKKyAgICBUaHJlYWREYXRhKiB0aHJlYWREYXRhID0gbnVsbHB0cjsK
KyAgICBkZXF1ZXVlKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICB0cnVlLAorICAgICAgICBb
Jl0gKFRocmVhZERhdGEqIGVsZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LT5hZGRy
ZXNzICE9IGFkZHJlc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIERlcXVldWVSZXN1bHQ6Okln
bm9yZTsKKyAgICAgICAgICAgIHRocmVhZERhdGEgPSBlbGVtZW50OworICAgICAgICAgICAgcmV0
dXJuIERlcXVldWVSZXN1bHQ6OlJlbW92ZUFuZFN0b3A7CisgICAgICAgIH0sCisgICAgICAgIFsm
XSAoYm9vbCBtYXlIYXZlTW9yZVRocmVhZHMpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrKCEhdGhy
ZWFkRGF0YSwgdGhyZWFkRGF0YSAmJiBtYXlIYXZlTW9yZVRocmVhZHMpOworICAgICAgICB9KTsK
KworICAgIGlmICghdGhyZWFkRGF0YSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKHRo
cmVhZERhdGEtPnNob3VsZFBhcmspOworICAgIAorICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVf
bG9jazxzdGQ6Om11dGV4PiBsb2NrZXIodGhyZWFkRGF0YS0+cGFya2luZ0xvY2spOworICAgICAg
ICB0aHJlYWREYXRhLT5hZGRyZXNzID0gbnVsbHB0cjsKKyAgICB9CisgICAgdGhyZWFkRGF0YS0+
cGFya2luZ0NvbmRpdGlvbi5ub3RpZnlfb25lKCk7Cit9CisKIHZvaWQgUGFya2luZ0xvdDo6dW5w
YXJrQWxsKGNvbnN0IHZvaWQqIGFkZHJlc3MpCiB7CiAgICAgaWYgKHZlcmJvc2UpCkBAIC01Njks
NiArNjA2LDcgQEAgdm9pZCBQYXJraW5nTG90Ojp1bnBhcmtBbGwoY29uc3Qgdm9pZCogYQogICAg
IFZlY3RvcjxUaHJlYWREYXRhKiwgOD4gdGhyZWFkRGF0YXM7CiAgICAgZGVxdWV1ZSgKICAgICAg
ICAgYWRkcmVzcywKKyAgICAgICAgZmFsc2UsCiAgICAgICAgIFsmXSAoVGhyZWFkRGF0YSogZWxl
bWVudCkgewogICAgICAgICAgICAgaWYgKHZlcmJvc2UpCiAgICAgICAgICAgICAgICAgZGF0YUxv
Zyh0b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6IE9ic2VydmluZyBlbGVtZW50IHdpdGggYWRk
cmVzcyA9ICIsIFJhd1BvaW50ZXIoZWxlbWVudC0+YWRkcmVzcyksICJcbiIpKTsKQEAgLTU3Niwx
NSArNjE0LDE4IEBAIHZvaWQgUGFya2luZ0xvdDo6dW5wYXJrQWxsKGNvbnN0IHZvaWQqIGEKICAg
ICAgICAgICAgICAgICByZXR1cm4gRGVxdWV1ZVJlc3VsdDo6SWdub3JlOwogICAgICAgICAgICAg
dGhyZWFkRGF0YXMuYXBwZW5kKGVsZW1lbnQpOwogICAgICAgICAgICAgcmV0dXJuIERlcXVldWVS
ZXN1bHQ6OlJlbW92ZUFuZENvbnRpbnVlOwotICAgICAgICB9KTsKKyAgICAgICAgfSwKKyAgICAg
ICAgW10gKGJvb2wpIHsgfSk7CiAKICAgICBmb3IgKFRocmVhZERhdGEqIHRocmVhZERhdGEgOiB0
aHJlYWREYXRhcykgewogICAgICAgICBpZiAodmVyYm9zZSkKICAgICAgICAgICAgIGRhdGFMb2co
dG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiB1bnBhcmtpbmcgIiwgUmF3UG9pbnRlcih0aHJl
YWREYXRhKSwgIiB3aXRoIGFkZHJlc3MgIiwgUmF3UG9pbnRlcih0aHJlYWREYXRhLT5hZGRyZXNz
KSwgIlxuIikpOwogICAgICAgICBBU1NFUlQodGhyZWFkRGF0YS0+c2hvdWxkUGFyayk7Ci0gICAg
ICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9ja2VyKHRocmVhZERhdGEtPnBhcmtp
bmdMb2NrKTsKLSAgICAgICAgdGhyZWFkRGF0YS0+c2hvdWxkUGFyayA9IGZhbHNlOwotICAgICAg
ICB0aHJlYWREYXRhLT5wYXJraW5nQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgewor
ICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrZXIodGhyZWFkRGF0
YS0+cGFya2luZ0xvY2spOworICAgICAgICAgICAgdGhyZWFkRGF0YS0+YWRkcmVzcyA9IG51bGxw
dHI7CisgICAgICAgIH0KKyAgICAgICAgdGhyZWFkRGF0YS0+cGFya2luZ0NvbmRpdGlvbi5ub3Rp
Znlfb25lKCk7CiAgICAgfQogCiAgICAgaWYgKHZlcmJvc2UpCkluZGV4OiBTb3VyY2UvV1RGL3d0
Zi9QYXJraW5nTG90LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvUGFya2luZ0xvdC5o
CShyZXZpc2lvbiAxODgzMjIpCisrKyBTb3VyY2UvV1RGL3d0Zi9QYXJraW5nTG90LmgJKHdvcmtp
bmcgY29weSkKQEAgLTU5LDYgKzU5LDIxIEBAIHB1YmxpYzoKICAgICAvLyBhcmUgbm8gbW9yZSB0
aHJlYWRzIG9uIHRoZSBxdWV1ZS4KICAgICBXVEZfRVhQT1JUX1BSSVZBVEUgc3RhdGljIGJvb2wg
dW5wYXJrT25lKGNvbnN0IHZvaWQqIGFkZHJlc3MpOwogCisgICAgLy8gVW5wYXJrcyBvbmUgdGhy
ZWFkIGZyb20gdGhlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYWRkcmVzcywgYW5k
IGNhbGxzIHRoZSBnaXZlbgorICAgIC8vIGZ1bmN0b3Igd2hpbGUgdGhlIGFkZHJlc3MgaXMgbG9j
a2VkLiBSZXBvcnRzIHRvIHRoZSBjYWxsYmFjayB3aGV0aGVyIGFueSB0aHJlYWQgZ290IHVucGFy
a2VkCisgICAgLy8gYW5kIHdoZXRoZXIgdGhlcmUgbWF5IGJlIGFueSBvdGhlciB0aHJlYWRzIHN0
aWxsIG9uIHRoZSBxdWV1ZS4gVGhpcyBpcyBhbiBleHBlcnQtbW9kZSB2ZXJzaW9uCisgICAgLy8g
b2YgdW5wYXJrT25lKCkgdGhhdCBhbGxvd3MgZm9yIHJlYWxseSBnb29kIHRodW5kZXJpbmcgaGVy
ZCBhdm9pZGFuY2UgaW4gYWRhcHRpdmUgbXV0ZXhlcy4KKyAgICAvLyBXaXRob3V0IHRoaXMsIGEg
bG9jayBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdW5wYXJrT25lKCkgaGFzIHRvIGhhdmUgc29t
ZSB0cmljayBmb3Iga25vd2luZworICAgIC8vIGlmIHRoZXJlIGFyZSBzdGlsbCB0aHJlYWRzIHBh
cmtlZCBvbiB0aGUgcXVldWUsIHNvIHRoYXQgaXQgY2FuIHNldCBzb21lIGJpdCBpbiBpdHMgbG9j
ayB3b3JkCisgICAgLy8gdG8gaW5kaWNhdGUgdGhhdCB0aGUgbmV4dCB1bmxvY2soKSBhbHNvIG5l
ZWRzIHRvIHVucGFya09uZSgpLiBCdXQgdGhlcmUgaXMgYSByYWNlIGJldHdlZW4KKyAgICAvLyBt
YW5pcHVsYXRpbmcgdGhhdCBiaXQgYW5kIHNvbWUgb3RoZXIgdGhyZWFkIGFjcXVpcmluZyB0aGUg
bG9jay4gSXQncyBwb3NzaWJsZSB0byB3b3JrIGFyb3VuZAorICAgIC8vIHRoYXQgcmFjZSAtIHNl
ZSBSdXN0eSBSdXNzZWwncyB3ZWxsLWtub3duIHVzZXJzZW0gbGlicmFyeSAtIGJ1dCBpdCdzIG5v
dCBwcmV0dHkuIFRoaXMgZm9ybQorICAgIC8vIGFsbG93cyB0aGF0IHJhY2UgdG8gYmUgY29tcGxl
dGVseSBhdm9pZGVkLCBzaW5jZSB0aGVyZSBpcyBubyB3YXkgdGhhdCBhIHRocmVhZCBjYW4gYmUg
cGFya2VkCisgICAgLy8gd2hpbGUgdGhlIGNhbGxiYWNrIGlzIHJ1bm5pbmcuCisgICAgV1RGX0VY
UE9SVF9QUklWQVRFIHN0YXRpYyB2b2lkIHVucGFya09uZSgKKyAgICAgICAgY29uc3Qgdm9pZCog
YWRkcmVzcywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgZGlkVW5wYXJrVGhyZWFk
LCBib29sIG1heUhhdmVNb3JlVGhyZWFkcyk+IGNhbGxiYWNrKTsKKwogICAgIC8vIFVucGFya3Mg
ZXZlcnkgdGhyZWFkIGZyb20gdGhlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYWRk
cmVzcywgd2hpY2ggY2Fubm90IGJlIG51bGwuCiAgICAgV1RGX0VYUE9SVF9QUklWQVRFIHN0YXRp
YyB2b2lkIHVucGFya0FsbChjb25zdCB2b2lkKiBhZGRyZXNzKTsKIApJbmRleDogU291cmNlL1dU
Ri93dGYvV29yZExvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9Xb3JkTG9jay5o
CShyZXZpc2lvbiAxODgzMjMpCisrKyBTb3VyY2UvV1RGL3d0Zi9Xb3JkTG9jay5oCSh3b3JraW5n
IGNvcHkpCkBAIC0zMSw2ICszMSwxMCBAQAogI2luY2x1ZGUgPHd0Zi9Mb2NrZXIuaD4KICNpbmNs
dWRlIDx3dGYvTm9uY29weWFibGUuaD4KIAorbmFtZXNwYWNlIFRlc3RXZWJLaXRBUEkgeworc3Ry
dWN0IExvY2tJbnNwZWN0b3I7Cit9OworCiBuYW1lc3BhY2UgV1RGIHsKIAogLy8gQSBXb3JkTG9j
ayBpcyBhIGZ1bGx5IGFkYXB0aXZlIG11dGV4IHRoYXQgdXNlcyBzaXplb2Yodm9pZCopIHN0b3Jh
Z2UuIEl0IGhhcyBhIGZhc3QgcGF0aCB0aGF0IGlzCkBAIC03Nyw2ICs4MSw4IEBAIHB1YmxpYzoK
ICAgICB9CiAKIHByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBUZXN0V2ViS2l0QVBJOjpMb2Nr
SW5zcGVjdG9yOworICAgIAogICAgIHN0YXRpYyBjb25zdCB1aW50cHRyX3QgaXNMb2NrZWRCaXQg
PSAxOwogICAgIHN0YXRpYyBjb25zdCB1aW50cHRyX3QgaXNRdWV1ZUxvY2tlZEJpdCA9IDI7CiAg
ICAgc3RhdGljIGNvbnN0IHVpbnRwdHJfdCBxdWV1ZUhlYWRNYXNrID0gMzsKQEAgLTg0LDYgKzkw
LDEyIEBAIHByaXZhdGU6CiAgICAgV1RGX0VYUE9SVF9QUklWQVRFIHZvaWQgbG9ja1Nsb3coKTsK
ICAgICBXVEZfRVhQT1JUX1BSSVZBVEUgdm9pZCB1bmxvY2tTbG93KCk7CiAKKyAgICAvLyBNZXRo
b2QgdXNlZCBmb3IgdGVzdGluZyBvbmx5LgorICAgIGJvb2wgaXNGdWxseVJlc2V0KCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiAhbV93b3JkLmxvYWQoKTsKKyAgICB9CisKICAgICBBdG9t
aWM8dWludHB0cl90PiBtX3dvcmQ7CiB9OwogCkluZGV4OiBUb29scy9DaGFuZ2VMb2cKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxODgzNTUpCisrKyBUb29scy9DaGFu
Z2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNyBAQAorMjAxNS0wOC0xMiAgRmlsaXAg
UGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAgICAgIFdURjo6TG9jayBzaG91bGQgbm90
IHN1ZmZlciBmcm9tIHRoZSB0aHVuZGVyaW5nIGhlcmQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0Nzk0NworCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCB0ZXN0aW5nIHRoYXQgY2hlY2tzIHRoYXQgbG9j
a3MgcmV0dXJuIHRvIGEgcHJpc3RpbmUgc3RhdGUgYWZ0ZXIgY29udGVudGlvbiBpcyBvdmVyLgor
CisgICAgICAgICogVGVzdFdlYktpdEFQSS9UZXN0cy9XVEYvTG9jay5jcHA6CisgICAgICAgIChU
ZXN0V2ViS2l0QVBJOjpMb2NrSW5zcGVjdG9yOjppc0Z1bGx5UmVzZXQpOgorICAgICAgICAoVGVz
dFdlYktpdEFQSTo6cnVuTG9ja1Rlc3QpOgorICAgICAgICAoVGVzdFdlYktpdEFQSTo6VEVTVCk6
CisKIDIwMTUtMDgtMTIgIFNpbW9uIEZyYXNlciAgPHNpbW9uLmZyYXNlckBhcHBsZS5jb20+CiAK
ICAgICAgICAgQWRkIGEgdG9vbCB0aGF0IGR1bXBzIGNsYXNzIGFuZCBzdHJ1Y3QgbWVtYmVyIGxh
eW91dCwgc2hvd2luZyBwYWRkaW5nCkluZGV4OiBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dU
Ri9Mb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9M
b2NrLmNwcAkocmV2aXNpb24gMTg4MzIzKQorKysgVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9X
VEYvTG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDYgKzMzLDE0IEBAIHVzaW5nIG5hbWVz
cGFjZSBXVEY7CiAKIG5hbWVzcGFjZSBUZXN0V2ViS2l0QVBJIHsKIAorc3RydWN0IExvY2tJbnNw
ZWN0b3IgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExvY2tUeXBlPgorICAgIGJvb2wgaXNGdWxs
eVJlc2V0KExvY2tUeXBlJiBsb2NrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvY2suaXNGdWxs
eVJlc2V0KCk7CisgICAgfQorfTsKKwogdGVtcGxhdGU8dHlwZW5hbWUgTG9ja1R5cGU+CiB2b2lk
IHJ1bkxvY2tUZXN0KHVuc2lnbmVkIG51bVRocmVhZEdyb3VwcywgdW5zaWduZWQgbnVtVGhyZWFk
c1Blckdyb3VwLCB1bnNpZ25lZCB3b3JrUGVyQ3JpdGljYWxTZWN0aW9uLCB1bnNpZ25lZCBudW1J
dGVyYXRpb25zKQogewpAQCAtNjYsNiArNzQsMTcgQEAgdm9pZCBydW5Mb2NrVGVzdCh1bnNpZ25l
ZCBudW1UaHJlYWRHcm91cAogCiAgICAgZm9yICh1bnNpZ25lZCB0aHJlYWRHcm91cEluZGV4ID0g
bnVtVGhyZWFkR3JvdXBzOyB0aHJlYWRHcm91cEluZGV4LS07KQogICAgICAgICBFWFBFQ1RfRVEo
ZXhwZWN0ZWQsIHdvcmRzW3RocmVhZEdyb3VwSW5kZXhdKTsKKworICAgIC8vIE5vdyB0ZXN0IHRo
YXQgdGhlIGxvY2tzIGNvcnJlY3RseSByZXNldCB0aGVtc2VsdmVzLiBXZSBleHBlY3QgdGhhdCBp
ZiBhIHNpbmdsZSB0aHJlYWQgbG9ja3MKKyAgICAvLyBlYWNoIG9mIHRoZSBsb2NrcyB0d2ljZSBp
biBhIHJvdywgdGhlbiB0aGUgbG9jayBzaG91bGQgYmUgaW4gYSBwcmlzdGluZSBzdGF0ZS4KKyAg
ICBmb3IgKHVuc2lnbmVkIHRocmVhZEdyb3VwSW5kZXggPSBudW1UaHJlYWRHcm91cHM7IHRocmVh
ZEdyb3VwSW5kZXgtLTspIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMjsgaS0tOykgewor
ICAgICAgICAgICAgbG9ja3NbdGhyZWFkR3JvdXBJbmRleF0ubG9jaygpOworICAgICAgICAgICAg
bG9ja3NbdGhyZWFkR3JvdXBJbmRleF0udW5sb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBF
WFBFQ1QoTG9ja0luc3BlY3Rvcjo6aXNGdWxseVJlc2V0KGxvY2tzW3RocmVhZEdyb3VwSW5kZXhd
KSk7CisgICAgfQogfQogCiBURVNUKFdURl9Xb3JkTG9jaywgVW5jb250ZW5kZWRTaG9ydFNlY3Rp
b24pCkBAIC0xMjgsNiArMTQ3LDExIEBAIFRFU1QoV1RGX0xvY2ssIE1hbnlDb250ZW5kZWRMb25n
U2VjdGlvbnMKICAgICBydW5Mb2NrVGVzdDxMb2NrPigxMCwgMTAsIDEwMDAwLCAxMDAwKTsKIH0K
IAorVEVTVChXVEZfTG9jaywgTWFueUNvbnRlbmRlZExvbmdlclNlY3Rpb25zKQoreworICAgIHJ1
bkxvY2tUZXN0PExvY2s+KDEwLCAxMCwgMTAwMDAwLCAxMDApOworfQorCiBURVNUKFdURl9Mb2Nr
LCBTZWN0aW9uQWRkcmVzc0NvbGxpc2lvbikKIHsKICAgICBydW5Mb2NrVGVzdDxMb2NrPig0LCAy
LCAxMDAwMCwgMjAwMCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>258849</attachid>
            <date>2015-08-12 15:15:33 -0700</date>
            <delta_ts>2015-08-12 18:11:29 -0700</delta_ts>
            <desc>it works</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>23915</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxODgzNTUpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDY3IEBACisyMDE1LTA4LTEyICBGaWxpcCBQaXpsbyAgPGZwaXps
b0BhcHBsZS5jb20+CisKKyAgICAgICAgV1RGOjpMb2NrIHNob3VsZCBub3Qgc3VmZmVyIGZyb20g
dGhlIHRodW5kZXJpbmcgaGVyZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTQ3OTQ3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgVGhpcyBjaGFuZ2VzIExvY2s6OnVubG9ja1Nsb3coKSB0byB1c2UgdW5wYXJr
T25lKCkgaW5zdGVhZCBvZiB1bnBhcmtBbGwoKS4gVGhlIHByb2JsZW0gd2l0aAorICAgICAgICBk
b2luZyB0aGlzIGlzIHRoYXQgaXQncyBub3Qgb2J2aW91cyBhZnRlciBjYWxsaW5nIHVucGFya09u
ZSgpIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgdGhyZWFkcworICAgICAgICB0aGF0IGFyZSBzdGls
bCBwYXJrZWQgb24gdGhlIGxvY2sncyBxdWV1ZS4gSWYgd2UgYXNzdW1lIHRoYXQgdGhlcmUgYXJl
IGFuZCBsZWF2ZSB0aGUKKyAgICAgICAgaGFzUGFya2VkQml0IHNldCwgdGhlbiBmdXR1cmUgY2Fs
bHMgdG8gdW5sb2NrKCkgd2lsbCB0YWtlIHRoZSBzbG93IHBhdGguIFdlIGRvbid0IHdhbnQgdGhh
dAorICAgICAgICBpZiB0aGVyZSBhcmVuJ3QgYWN0dWFsbHkgYW55IHRocmVhZHMgcGFya2VkLiBP
biB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgYXNzdW1lIHRoYXQgdGhlcmUKKyAgICAgICAgYXJlbid0
IGFueSB0aHJlYWRzIHBhcmtlZCBhbmQgY2xlYXIgdGhlIGhhc1BhcmtlZEJpdCwgdGhlbiBpZiB0
aGVyZSBhY3R1YWxseSB3ZXJlIHNvbWUKKyAgICAgICAgdGhyZWFkcyBwYXJrZWQsIHRoZW4gdGhl
eSBtYXkgbmV2ZXIgYmUgYXdva2VuIHNpbmNlIGZ1dHVyZSBjYWxscyB0byB1bmxvY2soKSB3b24n
dCB0YWtlIHNsb3cKKyAgICAgICAgcGF0aCBhbmQgc28gd29uJ3QgY2FsbCB1bnBhcmtPbmUoKS4g
SW4gb3RoZXIgd29yZHMsIHdlIG5lZWQgYSB3YXkgdG8gYmUgdmVyeSBwcmVjaXNlIGFib3V0Cisg
ICAgICAgIHdoZW4gd2UgY2xlYXIgdGhlIGhhc1BhcmtlZEJpdCBhbmQgd2UgbmVlZCB0byBkbyBp
dCBpbiBhIHJhY2UtZnJlZSB3YXk6IGl0IGNhbid0IGJlIHRoZSBjYXNlCisgICAgICAgIHRoYXQg
d2UgY2xlYXIgdGhlIGJpdCBqdXN0IGFzIHNvbWUgdGhyZWFkIGdldHMgcGFya2VkIG9uIHRoZSBx
dWV1ZS4KKworICAgICAgICBBIHNpbWlsYXIgcHJvYmxlbSBhcmlzZXMgaW4gZnV0ZXhlcywgYW5k
IG9uZSBvZiB0aGUgc29sdXRpb25zIGlzIHRvIGhhdmUgYSB0aHJlYWQgdGhhdAorICAgICAgICBh
Y3F1aXJlcyBhIGxvY2sgYWZ0ZXIgcGFya2luZyBzZXRzIHRoZSBoYXNQYXJrZWRCaXQuIFRoaXMg
aXMgd2hhdCBSdXN0eSBSdXNzZWwncyB1c2Vyc2VtCisgICAgICAgIGRvZXMuIEl0J3MgYSBzdWJ0
bGUgYWxnb3JpdGhtLiBBbHNvLCBpdCBtZWFucyB0aGF0IGlmIGEgdGhyZWFkIGJhcmdlcyBpbiBi
ZWZvcmUgdGhlIHVucGFya2VkCisgICAgICAgIHRocmVhZCBydW5zLCB0aGVuIHRoYXQgYmFyZ2lu
ZyB0aHJlYWQgd2lsbCBub3Qga25vdyB0aGF0IHRoZXJlIGFyZSB0aHJlYWRzIHBhcmtlZC4gVGhp
cworICAgICAgICBjb3VsZCBpbmNyZWFzZSB0aGUgc2V2ZXJpdHkgb2YgYmFyZ2luZy4KKworICAg
ICAgICBTaW5jZSBQYXJraW5nTG90IGlzIGEgdXNlci1sZXZlbCBBUEksIHdlIGRvbid0IGhhdmUg
dG8gd29ycnkgYWJvdXQgdGhlIGtlcm5lbC11c2VyIHNlY3VyaXR5CisgICAgICAgIGlzc3VlcyBh
bmQgc28gd2UgY2FuIGV4cG9zZSBjYWxsYmFja3Mgd2hpbGUgUGFya2luZ0xvdCBpcyBob2xkaW5n
IGl0cyBpbnRlcm5hbCBsb2Nrcy4gVGhpcworICAgICAgICBjaGFuZ2UgZG9lcyBleGFjdGx5IHRo
YXQgZm9yIHVucGFya09uZSgpLiBUaGUgbmV3IHZhcmlhbnQgb2YgdW5wYXJrT25lKCkgd2lsbCBj
YWxsIGEgdXNlcgorICAgICAgICBmdW5jdGlvbiB3aGlsZSB0aGUgcXVldWUgZnJvbSB3aGljaCB3
ZSBhcmUgdW5wYXJraW5nIGlzIGxvY2tlZC4gVGhlIGNhbGxiYWNrIGlzIHRvbGQgYmFzaWMKKyAg
ICAgICAgc3RhdHMgYWJvdXQgdGhlIHF1ZXVlOiBkaWQgd2UgdW5wYXJrIGEgdGhyZWFkIHRoaXMg
dGltZSwgYW5kIGNvdWxkIHRoZXJlIGJlIG1vcmUgdGhyZWFkcyB0bworICAgICAgICB1bnBhcmsg
aW4gdGhlIGZ1dHVyZS4gVGhlIGNhbGxiYWNrIHJ1bnMgd2hpbGUgaXQncyBpbXBvc3NpYmxlIGZv
ciB0aGUgcXVldWUgc3RhdGUgdG8gY2hhbmdlLAorICAgICAgICBzaW5jZSB0aGUgUGFya2luZ0xv
dCdzIGludGVybmFsIGxvY2tzIGZvciB0aGUgcXVldWUgaXMgaGVsZC4gVGhpcyBtZWFucyB0aGF0
CisgICAgICAgIExvY2s6OnVubG9ja1Nsb3coKSBjYW4gZWl0aGVyIGNsZWFyLCBvciBsZWF2ZSwg
dGhlIGhhc1BhcmtlZEJpdCB3aGlsZSByZWxlYXNpbmcgdGhlIGxvY2sKKyAgICAgICAgaW5zaWRl
IHRoZSBjYWxsYmFjayBmcm9tIHVucGFya09uZSgpLiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIHRo
dW5kZXJpbmcgaGVyZCBwcm9ibGVtIHdoaWxlCisgICAgICAgIGFsc28gcmVkdWNpbmcgdGhlIGdy
ZWVkIHRoYXQgYXJpc2VzIGZyb20gYmFyZ2luZyB0aHJlYWRzLgorCisgICAgICAgIFRoaXMgcmVx
dWlyZWQgc29tZSBjYXJlZnVsIHJld29ya2luZyBvZiB0aGUgUGFya2luZ0xvdCBhbGdvcml0aG0u
IFRoZSBmaXJzdCB0aGluZyBJIG5vdGljZWQKKyAgICAgICAgd2FzIHRoYXQgdGhlIFRocmVhZERh
dGE6OnNob3VsZFBhcmsgZmxhZyB3YXMgdXNlbGVzcywgc2luY2UgaXQncyBzZXQgZXhhY3RseSB3
aGVuCisgICAgICAgIFRocmVhZERhdGE6OmFkZHJlc3MgaXMgbm9uLW51bGwuIFRoZW4gSSBoYWQg
dG8gbWFrZSBzdXJlIHRoYXQgZGVxdWV1ZSgpIGNvdWxkIGxhemlseSBjcmVhdGUKKyAgICAgICAg
Ym90aCBoYXNodGFibGVzIGFuZCBidWNrZXRzLCBzaW5jZSB0aGUgImNhbGxiYWNrIGlzIGNhbGxl
ZCB3aGlsZSBxdWV1ZSBpcyBsb2NrZWQiIGludmFyaWFudAorICAgICAgICByZXF1aXJlcyB0aGF0
IHdlIGRpZG4ndCBleGl0IGVhcmx5IGR1ZSB0byB0aGUgaGFzaHRhYmxlIG9yIGJ1Y2tldCBub3Qg
YmVpbmcgcHJlc2VudC4gTm90ZQorICAgICAgICB0aGF0IGFsbCBvZiB0aGlzIGlzIGRvbmUgaW4g
c3VjaCBhIHdheSB0aGF0IHRoZSBvbGQgdW5wYXJrT25lKCkgYW5kIHVucGFya0FsbCgpIGRvbid0
IGhhdmUKKyAgICAgICAgdG8gY3JlYXRlIGFueSBidWNrZXRzLCB0aG91Z2ggdGhleSBub3cgbWF5
IGNyZWF0ZSB0aGUgaGFzaHRhYmxlLiBXZSBkb24ndCBjYXJlIGFzIG11Y2ggYWJvdXQKKyAgICAg
ICAgdGhlIGhhc2h0YWJsZSBiZWluZyBjcmVhdGVkIGJ5IHVucGFyayBzaW5jZSBpdCdzIGp1c3Qg
c3VjaCBhbiB1bmxpa2VseSBzY2VuYXJpbyBhbmQgaXQgd291bGQKKyAgICAgICAgb25seSBoYXBw
ZW4gb25jZS4KKworICAgICAgICBUaGlzIGNoYW5nZSByZWR1Y2VzIHRoZSBrZXJuZWwgQ1BVIHVz
YWdlIG9mIFdURjo6TG9jayBmb3IgdGhlIGxvbmcgY3JpdGljYWwgc2VjdGlvbiB0ZXN0IGJ5Cisg
ICAgICAgIGFib3V0IDh4IGFuZCBtYWtlcyBpdCBhbHdheXMgcGVyZm9ybSBhcyB3ZWxsIGFzIFdU
Rjo6V29yZExvY2sgYW5kIFdURjo6TXV0ZXggZm9yIHRoYXQKKyAgICAgICAgYmVuY2htYXJrLgor
CisgICAgICAgICogYmVuY2htYXJrcy9Mb2NrU3BlZWRUZXN0LmNwcDoKKyAgICAgICAgKiB3dGYv
TG9jay5jcHA6CisgICAgICAgIChXVEY6OkxvY2tCYXNlOjp1bmxvY2tTbG93KToKKyAgICAgICAg
KiB3dGYvTG9jay5oOgorICAgICAgICAoV1RGOjpMb2NrQmFzZTo6aXNMb2NrZWQpOgorICAgICAg
ICAoV1RGOjpMb2NrQmFzZTo6aXNGdWxseVJlc2V0KToKKyAgICAgICAgKiB3dGYvUGFya2luZ0xv
dC5jcHA6CisgICAgICAgIChXVEY6OlBhcmtpbmdMb3Q6OnBhcmtDb25kaXRpb25hbGx5KToKKyAg
ICAgICAgKFdURjo6UGFya2luZ0xvdDo6dW5wYXJrT25lKToKKyAgICAgICAgKFdURjo6UGFya2lu
Z0xvdDo6dW5wYXJrQWxsKToKKyAgICAgICAgKiB3dGYvUGFya2luZ0xvdC5oOgorICAgICAgICAq
IHd0Zi9Xb3JkTG9jay5oOgorICAgICAgICAoV1RGOjpXb3JkTG9jazo6aXNMb2NrZWQpOgorICAg
ICAgICAoV1RGOjpXb3JkTG9jazo6aXNGdWxseVJlc2V0KToKKwogMjAxNS0wOC0xMSAgRmlsaXAg
UGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAgIEFsd2F5cyB1c2UgYSBieXRlLXNp
emVkIGxvY2sgaW1wbGVtZW50YXRpb24KSW5kZXg6IFNvdXJjZS9XVEYvYmVuY2htYXJrcy9Mb2Nr
U3BlZWRUZXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL2JlbmNobWFya3MvTG9ja1Nw
ZWVkVGVzdC5jcHAJKHJldmlzaW9uIDE4ODMyMykKKysrIFNvdXJjZS9XVEYvYmVuY2htYXJrcy9M
b2NrU3BlZWRUZXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNyArNDQsNyBAQCB1bnNpZ25l
ZCBudW1JdGVyYXRpb25zOwogICAgIAogTk9fUkVUVVJOIHZvaWQgdXNhZ2UoKQogewotICAgIHBy
aW50ZigiVXNhZ2U6IExvY2tTcGVlZFRlc3Qgc3BpbmxvY2t8d29yZGxvY2t8bG9ja3xieXRlbG9j
a3xtdXRleHxhbGwgPG51bSB0aHJlYWQgZ3JvdXBzPiA8bnVtIHRocmVhZHMgcGVyIGdyb3VwPiA8
d29yayBwZXIgY3JpdGljYWwgc2VjdGlvbj4gPG51bSBub2lzZSB0aHJlYWRzPiA8bnVtIGl0ZXJh
dGlvbnM+XG4iKTsKKyAgICBwcmludGYoIlVzYWdlOiBMb2NrU3BlZWRUZXN0IHNwaW5sb2NrfHdv
cmRsb2NrfGxvY2t8bXV0ZXh8YWxsIDxudW0gdGhyZWFkIGdyb3Vwcz4gPG51bSB0aHJlYWRzIHBl
ciBncm91cD4gPHdvcmsgcGVyIGNyaXRpY2FsIHNlY3Rpb24+IDxudW0gbm9pc2UgdGhyZWFkcz4g
PG51bSBpdGVyYXRpb25zPlxuIik7CiAgICAgZXhpdCgxKTsKIH0KIApJbmRleDogU291cmNlL1dU
Ri93dGYvTG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvTG9jay5jcHAJKHJl
dmlzaW9uIDE4ODMyMykKKysrIFNvdXJjZS9XVEYvd3RmL0xvY2suY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC03NiwzMCArNzYsMzkgQEAgdm9pZCBMb2NrQmFzZTo6bG9ja1Nsb3coKQogCiB2b2lkIExv
Y2tCYXNlOjp1bmxvY2tTbG93KCkKIHsKLSAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHdoaWxlIGZp
bmRpbmcgb3V0IGlmIHNvbWVvbmUgaXMgcGFya2VkLiBOb3RlIHRoYXQgYXMgc29vbiBhcyB3ZSBk
byB0aGlzLAotICAgIC8vIHNvbWVvbmUgbWlnaHQgYmFyZ2UgaW4uCi0gICAgdWludDhfdCBvbGRC
eXRlVmFsdWU7CisgICAgLy8gV2UgY291bGQgZ2V0IGhlcmUgYmVjYXVzZSB0aGUgd2VhayBDQVMg
aW4gdW5sb2NrKCkgZmFpbGVkIHNwdXJpb3VzbHksIG9yIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAv
LyBzb21lb25lIHBhcmtlZC4gU28sIHdlIG5lZWQgYSBDQVMgbG9vcDogZXZlbiBpZiByaWdodCBu
b3cgdGhlIGxvY2sgaXMganVzdCBoZWxkLCBpdCBjb3VsZAorICAgIC8vIGJlIGhlbGQgYW5kIHBh
cmtlZCBpZiBzb21lb25lIGF0dGVtcHRzIHRvIGxvY2sganVzdCBhcyB3ZSBhcmUgdW5sb2NraW5n
LgogICAgIGZvciAoOzspIHsKLSAgICAgICAgb2xkQnl0ZVZhbHVlID0gbV9ieXRlLmxvYWQoKTsK
LSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJl
bnRUaHJlYWQoKSwgIjogdW5sb2NraW5nIHdpdGggIiwgb2xkQnl0ZVZhbHVlLCAiXG4iKSk7Ci0g
ICAgICAgIEFTU0VSVChvbGRCeXRlVmFsdWUgJiBpc0hlbGRCaXQpOwotICAgICAgICBpZiAobV9i
eXRlLmNvbXBhcmVFeGNoYW5nZVdlYWsob2xkQnl0ZVZhbHVlLCAwKSkKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgIH0KKyAgICAgICAgdWludDhfdCBvbGRCeXRlVmFsdWUgPSBtX2J5dGUubG9hZCgp
OworICAgICAgICBBU1NFUlQob2xkQnl0ZVZhbHVlID09IGlzSGVsZEJpdCB8fCBvbGRCeXRlVmFs
dWUgPT0gKGlzSGVsZEJpdCB8IGhhc1BhcmtlZEJpdCkpOworICAgICAgICAKKyAgICAgICAgaWYg
KG9sZEJ5dGVWYWx1ZSA9PSBpc0hlbGRCaXQpIHsKKyAgICAgICAgICAgIGlmIChtX2J5dGUuY29t
cGFyZUV4Y2hhbmdlV2Vhayhpc0hlbGRCaXQsIDApKQorICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLSAgICAvLyBOb3RlIHRoYXQgc29t
ZW9uZSBjb3VsZCB0cnkgdG8gcGFyayByaWdodCBub3cuIElmIHRoYXQgaGFwcGVucywgdGhleSB3
aWxsIHJldHVybiBpbW1lZGlhdGVseQotICAgIC8vIGJlY2F1c2Ugb3VyIHBhcmtpbmcgcHJlZGlj
YXRlIGlzIHRoYXQgbV9ieXRlID09IGlzSGVsZEJpdCB8IGhhc1BhcmtlZEJpdCwgYnV0IHdlJ3Zl
IGFscmVhZHkgc2V0Ci0gICAgLy8gbV9ieXRlID0gMC4KKyAgICAgICAgLy8gU29tZW9uZSBpcyBw
YXJrZWQuIFVucGFyayBleGFjdGx5IG9uZSB0aHJlYWQsIHBvc3NpYmx5IGxlYXZpbmcgdGhlIHBh
cmtlZCBiaXQgc2V0IGlmCisgICAgICAgIC8vIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgdGhlcmUg
YXJlIHN0aWxsIG90aGVyIHRocmVhZHMgcGFya2VkLgorICAgICAgICBBU1NFUlQob2xkQnl0ZVZh
bHVlID09IChpc0hlbGRCaXQgfCBoYXNQYXJrZWRCaXQpKTsKKyAgICAgICAgYm9vbCBkaWRVbmxv
Y2sgPSBmYWxzZTsKKyAgICAgICAgUGFya2luZ0xvdDo6dW5wYXJrT25lKAorICAgICAgICAgICAg
Jm1fYnl0ZSwKKyAgICAgICAgICAgIFsmXSAoYm9vbCwgYm9vbCBtYXlIYXZlTW9yZVRocmVhZHMp
IHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IGNhbiBjbGVh
ciBlaXRoZXIgdGhlIGlzSGVsZEJpdCBvciB0aGUgaGFzUGFya2VkQml0LAorICAgICAgICAgICAg
ICAgIC8vIHNvIHdlIHNob3VsZCBzdGlsbCBzZWUgYm90aCBiaXRzIHNldCByaWdodCBub3cuCisg
ICAgICAgICAgICAgICAgQVNTRVJUKG1fYnl0ZS5sb2FkKCkgPT0gKGlzSGVsZEJpdCB8IGhhc1Bh
cmtlZEJpdCkpOwogCi0gICAgLy8gSWYgdGhlcmUgaGFkIGJlZW4gdGhyZWFkcyBwYXJrZWQsIHVu
cGFyayBhbGwgb2YgdGhlbS4gVGhpcyBjYXVzZXMgYSB0aHVuZGVyaW5nIGhlcmQsIGJ1dCB3aGls
ZQotICAgIC8vIHRoYXQgaXMgdGhlb3JldGljYWxseSBzY2FyeSwgaXQncyB0b3RhbGx5IGZpbmUg
aW4gV2ViS2l0IGJlY2F1c2Ugd2UgdXN1YWxseSBkb24ndCBoYXZlIGVub3VnaAotICAgIC8vIHRo
cmVhZHMgZm9yIHRoaXMgdG8gbWF0dGVyLgotICAgIC8vIEZJWE1FOiBXZSBkb24ndCByZWFsbHkg
bmVlZCB0aGlzIHRvIGV4aGliaXQgdGh1bmRlcmluZyBoZXJkLiBXZSBjb3VsZCB1c2UgdW5wYXJr
T25lKCksIGFuZCBpZgotICAgIC8vIHRoYXQgcmV0dXJucyB0cnVlLCBqdXN0IHNldCB0aGUgcGFy
a2VkIGJpdCBhZ2Fpbi4gSWYgaW4gdGhlIHByb2Nlc3Mgb2Ygc2V0dGluZyB0aGUgcGFya2VkIGJp
dAotICAgIC8vIHdlIGZhaWwgdGhlIENBUywgdGhlbiBqdXN0IHVucGFyayBhZ2Fpbi4KLSAgICBp
ZiAob2xkQnl0ZVZhbHVlICYgaGFzUGFya2VkQml0KQotICAgICAgICBQYXJraW5nTG90Ojp1bnBh
cmtBbGwoJm1fYnl0ZSk7CisgICAgICAgICAgICAgICAgaWYgKG1heUhhdmVNb3JlVGhyZWFkcykK
KyAgICAgICAgICAgICAgICAgICAgbV9ieXRlLnN0b3JlKGhhc1BhcmtlZEJpdCk7CisgICAgICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtX2J5dGUuc3RvcmUoMCk7CisgICAg
ICAgICAgICAgICAgZGlkVW5sb2NrID0gdHJ1ZTsKKyAgICAgICAgICAgIH0pOworICAgICAgICBB
U1NFUlQoZGlkVW5sb2NrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIH0KIAogfSAvLyBuYW1l
c3BhY2UgV1RGCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9Mb2NrLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dURi93dGYvTG9jay5oCShyZXZpc2lvbiAxODgzMjMpCisrKyBTb3VyY2UvV1RGL3d0Zi9M
b2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDEwIEBACiAjaW5jbHVkZSA8d3RmL0xv
Y2tlci5oPgogI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgogCituYW1lc3BhY2UgVGVzdFdl
YktpdEFQSSB7CitzdHJ1Y3QgTG9ja0luc3BlY3RvcjsKK307CisKIG5hbWVzcGFjZSBXVEYgewog
CiAvLyBUaGlzIGlzIGEgZnVsbHkgYWRhcHRpdmUgbXV0ZXggdGhhdCBvbmx5IHJlcXVpcmVzIDEg
Ynl0ZSBvZiBzdG9yYWdlLiBJdCBoYXMgZmFzdCBwYXRocyB0aGF0IGFyZQpAQCAtNzMsMTIgKzc3
LDIwIEBAIHN0cnVjdCBMb2NrQmFzZSB7CiAgICAgfQogCiBwcm90ZWN0ZWQ6CisgICAgZnJpZW5k
IHN0cnVjdCBUZXN0V2ViS2l0QVBJOjpMb2NrSW5zcGVjdG9yOworICAgIAogICAgIHN0YXRpYyBj
b25zdCB1aW50OF90IGlzSGVsZEJpdCA9IDE7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaGFz
UGFya2VkQml0ID0gMjsKIAogICAgIFdURl9FWFBPUlRfUFJJVkFURSB2b2lkIGxvY2tTbG93KCk7
CiAgICAgV1RGX0VYUE9SVF9QUklWQVRFIHZvaWQgdW5sb2NrU2xvdygpOwogCisgICAgLy8gTWV0
aG9kIHVzZWQgZm9yIHRlc3Rpbmcgb25seS4KKyAgICBib29sIGlzRnVsbHlSZXNldCgpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gIW1fYnl0ZS5sb2FkKCk7CisgICAgfQorCiAgICAgQXRv
bWljPHVpbnQ4X3Q+IG1fYnl0ZTsKIH07CiAKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL1BhcmtpbmdM
b3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1BhcmtpbmdMb3QuY3BwCShyZXZp
c2lvbiAxODgzMjMpCisrKyBTb3VyY2UvV1RGL3d0Zi9QYXJraW5nTG90LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTIsMTEgKzUyLDExIEBAIHB1YmxpYzoKIAogICAgIFRocmVhZElkZW50aWZpZXIg
dGhyZWFkSWRlbnRpZmllcjsKICAgICAKLSAgICBib29sIHNob3VsZFBhcmsgeyBmYWxzZSB9Owog
ICAgIHN0ZDo6bXV0ZXggcGFya2luZ0xvY2s7CiAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUg
cGFya2luZ0NvbmRpdGlvbjsKIAotICAgIGNvbnN0IHZvaWQqIGFkZHJlc3M7CisgICAgY29uc3Qg
dm9pZCogYWRkcmVzcyB7IG51bGxwdHIgfTsKKyAgICAKICAgICBUaHJlYWREYXRhKiBuZXh0SW5R
dWV1ZSB7IG51bGxwdHIgfTsKIH07CiAKQEAgLTIxMiwyNSArMjEyLDM2IEBAIHVuc2lnbmVkIGhh
c2hBZGRyZXNzKGNvbnN0IHZvaWQqIGFkZHJlc3MKICAgICByZXR1cm4gV1RGOjpQdHJIYXNoPGNv
bnN0IHZvaWQqPjo6aGFzaChhZGRyZXNzKTsKIH0KIAotLy8gTG9ja3MgdGhlIGhhc2h0YWJsZS4g
VGhpcyByZWxvb3BzIGluIGNhc2Ugb2YgcmVoYXNoaW5nLCBzbyB0aGUgY3VycmVudCBoYXNodGFi
bGUgbWF5IGJlIGRpZmZlcmVudAotLy8gYWZ0ZXIgdGhpcyByZXR1cm5zIHRoYW4gd2hlbiB5b3Ug
Y2FsbGVkIGl0LiBHdWFyYW50ZWVzIHRoYXQgdGhlcmUgaXMgYSBoYXNodGFibGUuIFRoaXMgaXMg
cHJldHR5Ci0vLyBzbG93IGFuZCBub3Qgc2NhbGFibGUsIHNvIGl0J3Mgb25seSB1c2VkIGR1cmlu
ZyB0aHJlYWQgY3JlYXRpb24gYW5kIGZvciBkZWJ1Z2dpbmcvdGVzdGluZy4KLVZlY3RvcjxCdWNr
ZXQqPiBsb2NrSGFzaHRhYmxlKCkKK0hhc2h0YWJsZSogZW5zdXJlSGFzaHRhYmxlKCkKIHsKICAg
ICBmb3IgKDs7KSB7Ci0gICAgICAgIEhhc2h0YWJsZSogY3VycmVudEhhc2h0YWJsZTsKKyAgICAg
ICAgSGFzaHRhYmxlKiBjdXJyZW50SGFzaHRhYmxlID0gaGFzaHRhYmxlLmxvYWQoKTsKKworICAg
ICAgICBpZiAoY3VycmVudEhhc2h0YWJsZSkKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50SGFz
aHRhYmxlOwogCi0gICAgICAgIGN1cnJlbnRIYXNodGFibGUgPSBoYXNodGFibGUubG9hZCgpOwog
ICAgICAgICBpZiAoIWN1cnJlbnRIYXNodGFibGUpIHsKLSAgICAgICAgICAgIC8vIFRyeSB0byBi
ZSB0aGUgZmlyc3QgdG8gY3JlYXRlIHRoZSBoYXNodGFibGUuCiAgICAgICAgICAgICBjdXJyZW50
SGFzaHRhYmxlID0gSGFzaHRhYmxlOjpjcmVhdGUobWF4TG9hZEZhY3Rvcik7Ci0gICAgICAgICAg
ICBpZiAoIWhhc2h0YWJsZS5jb21wYXJlRXhjaGFuZ2VXZWFrKG51bGxwdHIsIGN1cnJlbnRIYXNo
dGFibGUpKSB7Ci0gICAgICAgICAgICAgICAgSGFzaHRhYmxlOjpkZXN0cm95KGN1cnJlbnRIYXNo
dGFibGUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGhhc2h0
YWJsZS5jb21wYXJlRXhjaGFuZ2VXZWFrKG51bGxwdHIsIGN1cnJlbnRIYXNodGFibGUpKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMb2co
dG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBjcmVhdGVkIGluaXRpYWwgaGFzaHRhYmxlICIs
IFJhd1BvaW50ZXIoY3VycmVudEhhc2h0YWJsZSksICJcbiIpKTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gY3VycmVudEhhc2h0YWJsZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2
ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgp
LCAiOiBjcmVhdGVkIGluaXRpYWwgaGFzaHRhYmxlICIsIFJhd1BvaW50ZXIoY3VycmVudEhhc2h0
YWJsZSksICJcbiIpKTsKKworICAgICAgICAgICAgSGFzaHRhYmxlOjpkZXN0cm95KGN1cnJlbnRI
YXNodGFibGUpOwogICAgICAgICB9CisgICAgfQorfQorCisvLyBMb2NrcyB0aGUgaGFzaHRhYmxl
LiBUaGlzIHJlbG9vcHMgaW4gY2FzZSBvZiByZWhhc2hpbmcsIHNvIHRoZSBjdXJyZW50IGhhc2h0
YWJsZSBtYXkgYmUgZGlmZmVyZW50CisvLyBhZnRlciB0aGlzIHJldHVybnMgdGhhbiB3aGVuIHlv
dSBjYWxsZWQgaXQuIEd1YXJhbnRlZXMgdGhhdCB0aGVyZSBpcyBhIGhhc2h0YWJsZS4gVGhpcyBp
cyBwcmV0dHkKKy8vIHNsb3cgYW5kIG5vdCBzY2FsYWJsZSwgc28gaXQncyBvbmx5IHVzZWQgZHVy
aW5nIHRocmVhZCBjcmVhdGlvbiBhbmQgZm9yIGRlYnVnZ2luZy90ZXN0aW5nLgorVmVjdG9yPEJ1
Y2tldCo+IGxvY2tIYXNodGFibGUoKQoreworICAgIGZvciAoOzspIHsKKyAgICAgICAgSGFzaHRh
YmxlKiBjdXJyZW50SGFzaHRhYmxlID0gZW5zdXJlSGFzaHRhYmxlKCk7CisKKyAgICAgICAgQVNT
RVJUKGN1cnJlbnRIYXNodGFibGUpOwogCiAgICAgICAgIC8vIE5vdyBmaW5kIGFsbCBvZiB0aGUg
YnVja2V0cy4gVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGhhc2h0YWJsZSBpcyBmdWxsIG9mIGJ1
Y2tldHMgc28gdGhhdAogICAgICAgICAvLyB3ZSBjYW4gbG9jayBhbGwgb2YgdGhlIGJ1Y2tldHMs
IG5vdCBqdXN0IHRoZSBvbmVzIHRoYXQgYXJlIG1hdGVyaWFsaXplZC4KQEAgLTQwNSw3ICs0MTYs
NyBAQCBib29sIGVucXVldWUoY29uc3Qgdm9pZCogYWRkcmVzcywgY29uc3QgCiAgICAgdW5zaWdu
ZWQgaGFzaCA9IGhhc2hBZGRyZXNzKGFkZHJlc3MpOwogCiAgICAgZm9yICg7OykgewotICAgICAg
ICBIYXNodGFibGUqIG15SGFzaHRhYmxlID0gaGFzaHRhYmxlLmxvYWQoKTsKKyAgICAgICAgSGFz
aHRhYmxlKiBteUhhc2h0YWJsZSA9IGVuc3VyZUhhc2h0YWJsZSgpOwogICAgICAgICB1bnNpZ25l
ZCBpbmRleCA9IGhhc2ggJSBteUhhc2h0YWJsZS0+c2l6ZTsKICAgICAgICAgQXRvbWljPEJ1Y2tl
dCo+JiBidWNrZXRQb2ludGVyID0gbXlIYXNodGFibGUtPmRhdGFbaW5kZXhdOwogICAgICAgICBC
dWNrZXQqIGJ1Y2tldDsKQEAgLTQ0NCw1MCArNDU1LDQ2IEBAIGJvb2wgZW5xdWV1ZShjb25zdCB2
b2lkKiBhZGRyZXNzLCBjb25zdCAKICAgICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0
b3I+Ci1ib29sIGRlcXVldWUoY29uc3Qgdm9pZCogYWRkcmVzcywgY29uc3QgRnVuY3RvciYgZnVu
Y3RvcikKK3RlbXBsYXRlPHR5cGVuYW1lIERlcXVldWVGdW5jdG9yLCB0eXBlbmFtZSBGaW5pc2hG
dW5jdG9yPgorYm9vbCBkZXF1ZXVlKAorICAgIGNvbnN0IHZvaWQqIGFkZHJlc3MsIGJvb2wgZW5z
dXJlQnVja2V0LCBjb25zdCBEZXF1ZXVlRnVuY3RvciYgZGVxdWV1ZUZ1bmN0b3IsCisgICAgY29u
c3QgRmluaXNoRnVuY3RvciYgZmluaXNoRnVuY3RvcikKIHsKLSAgICBpZiAodmVyYm9zZSkKLSAg
ICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6IGRlcXVldWVpbmcgYWRk
cmVzcyAiLCBSYXdQb2ludGVyKGFkZHJlc3MpLCAiXG4iKSk7CiAgICAgdW5zaWduZWQgaGFzaCA9
IGhhc2hBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICh2ZXJib3NlKQotICAgICAgICBkYXRhTG9n
KHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogaGFzaCA9ICIsIGhhc2gsICJcbiIpKTsKIAog
ICAgIGZvciAoOzspIHsKLSAgICAgICAgSGFzaHRhYmxlKiBteUhhc2h0YWJsZSA9IGhhc2h0YWJs
ZS5sb2FkKCk7Ci0gICAgICAgIGlmICghbXlIYXNodGFibGUpIHsKLSAgICAgICAgICAgIGlmICh2
ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgp
LCAiOiBubyBoYXNodGFibGUuXG4iKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIH0KKyAgICAgICAgSGFzaHRhYmxlKiBteUhhc2h0YWJsZSA9IGVuc3VyZUhhc2h0YWJsZSgp
OwogICAgICAgICB1bnNpZ25lZCBpbmRleCA9IGhhc2ggJSBteUhhc2h0YWJsZS0+c2l6ZTsKLSAg
ICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRU
aHJlYWQoKSwgIjogaW5kZXggPSAiLCBpbmRleCwgIlxuIikpOwotICAgICAgICBCdWNrZXQqIGJ1
Y2tldCA9IG15SGFzaHRhYmxlLT5kYXRhW2luZGV4XS5sb2FkKCk7CisgICAgICAgIEF0b21pYzxC
dWNrZXQqPiYgYnVja2V0UG9pbnRlciA9IG15SGFzaHRhYmxlLT5kYXRhW2luZGV4XTsKKyAgICAg
ICAgQnVja2V0KiBidWNrZXQgPSBidWNrZXRQb2ludGVyLmxvYWQoKTsKICAgICAgICAgaWYgKCFi
dWNrZXQpIHsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFM
b2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBubyBidWNrZXQgYXQgIiwgUmF3UG9pbnRl
cihidWNrZXQpLCAiLlxuIikpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgaWYgKCFlbnN1cmVCdWNrZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgYnVja2V0ID0gYnVja2V0UG9p
bnRlci5sb2FkKCk7CisgICAgICAgICAgICAgICAgaWYgKCFidWNrZXQpIHsKKyAgICAgICAgICAg
ICAgICAgICAgYnVja2V0ID0gbmV3IEJ1Y2tldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAo
IWJ1Y2tldFBvaW50ZXIuY29tcGFyZUV4Y2hhbmdlV2VhayhudWxscHRyLCBidWNrZXQpKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYnVja2V0OworICAgICAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAg
ICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRo
cmVhZCgpLCAiOiBsb2NraW5nIGJ1Y2tldCBhdCAiLCBSYXdQb2ludGVyKGJ1Y2tldCksICJcbiIp
KTsKICAgICAgICAgYnVja2V0LT5sb2NrLmxvY2soKTsKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0g
ICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogbG9ja2VkIGJ1
Y2tldCBhdCAiLCBSYXdQb2ludGVyKGJ1Y2tldCksICJcbiIpKTsKIAogICAgICAgICAvLyBBdCB0
aGlzIHBvaW50IHRoZSBoYXNodGFibGUgY291bGQgaGF2ZSByZWhhc2hlZCB1bmRlciB1cy4KICAg
ICAgICAgaWYgKGhhc2h0YWJsZS5sb2FkKCkgIT0gbXlIYXNodGFibGUpIHsKLSAgICAgICAgICAg
IGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRo
cmVhZCgpLCAiOiBoYXNodGFibGUgY2hhbmdlZC5cbiIpKTsKICAgICAgICAgICAgIGJ1Y2tldC0+
bG9jay51bmxvY2soKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAg
ICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJl
YWQoKSwgIjogZm91bmQgYnVja2V0LlxuIikpOwotICAgICAgICBidWNrZXQtPmdlbmVyaWNEZXF1
ZXVlKGZ1bmN0b3IpOworICAgICAgICBidWNrZXQtPmdlbmVyaWNEZXF1ZXVlKGRlcXVldWVGdW5j
dG9yKTsKICAgICAgICAgYm9vbCByZXN1bHQgPSAhIWJ1Y2tldC0+cXVldWVIZWFkOworICAgICAg
ICBmaW5pc2hGdW5jdG9yKHJlc3VsdCk7CiAgICAgICAgIGJ1Y2tldC0+bG9jay51bmxvY2soKTsK
ICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC01MDIsOCArNTA5LDYgQEAgYm9vbCBQ
YXJraW5nTG90OjpwYXJrQ29uZGl0aW9uYWxseShjb25zdAogICAgIAogICAgIFRocmVhZERhdGEq
IG1lID0gbXlUaHJlYWREYXRhKCk7CiAKLSAgICBBU1NFUlQoIW1lLT5zaG91bGRQYXJrKTsKLSAg
ICAKICAgICBib29sIHJlc3VsdCA9IGVucXVldWUoCiAgICAgICAgIGFkZHJlc3MsCiAgICAgICAg
IFsmXSAoKSAtPiBUaHJlYWREYXRhKiB7CkBAIC01MTEsNyArNTE2LDYgQEAgYm9vbCBQYXJraW5n
TG90OjpwYXJrQ29uZGl0aW9uYWxseShjb25zdAogICAgICAgICAgICAgICAgIHJldHVybiBudWxs
cHRyOwogCiAgICAgICAgICAgICBtZS0+YWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgICAgICAgICBt
ZS0+c2hvdWxkUGFyayA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gbWU7CiAgICAgICAgIH0p
OwogCkBAIC01MjIsMTAgKzUyNiw4IEBAIGJvb2wgUGFya2luZ0xvdDo6cGFya0NvbmRpdGlvbmFs
bHkoY29uc3QKICAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6IHBh
cmtpbmcgc2VsZjogIiwgUmF3UG9pbnRlcihtZSksICJcbiIpKTsKICAgICB7CiAgICAgICAgIHN0
ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9ja2VyKG1lLT5wYXJraW5nTG9jayk7Ci0gICAg
ICAgIHdoaWxlIChtZS0+c2hvdWxkUGFyaykKKyAgICAgICAgd2hpbGUgKG1lLT5hZGRyZXNzKQog
ICAgICAgICAgICAgbWUtPnBhcmtpbmdDb25kaXRpb24ud2FpdChsb2NrZXIpOwotCi0gICAgICAg
IG1lLT5hZGRyZXNzID0gbnVsbHB0cjsKICAgICB9CiAgICAgaWYgKHZlcmJvc2UpCiAgICAgICAg
IGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiB1bnBhcmtlZCBzZWxmOiAiLCBS
YXdQb2ludGVyKG1lKSwgIlxuIikpOwpAQCAtNTQwLDEyICs1NDIsMTQgQEAgYm9vbCBQYXJraW5n
TG90Ojp1bnBhcmtPbmUoY29uc3Qgdm9pZCogYQogICAgIFRocmVhZERhdGEqIHRocmVhZERhdGEg
PSBudWxscHRyOwogICAgIGJvb2wgcmVzdWx0ID0gZGVxdWV1ZSgKICAgICAgICAgYWRkcmVzcywK
KyAgICAgICAgZmFsc2UsCiAgICAgICAgIFsmXSAoVGhyZWFkRGF0YSogZWxlbWVudCkgewogICAg
ICAgICAgICAgaWYgKGVsZW1lbnQtPmFkZHJlc3MgIT0gYWRkcmVzcykKICAgICAgICAgICAgICAg
ICByZXR1cm4gRGVxdWV1ZVJlc3VsdDo6SWdub3JlOwogICAgICAgICAgICAgdGhyZWFkRGF0YSA9
IGVsZW1lbnQ7CiAgICAgICAgICAgICByZXR1cm4gRGVxdWV1ZVJlc3VsdDo6UmVtb3ZlQW5kU3Rv
cDsKLSAgICAgICAgfSk7CisgICAgICAgIH0sCisgICAgICAgIFtdIChib29sKSB7IH0pOwogCiAg
ICAgaWYgKCF0aHJlYWREYXRhKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC01NTQsMTMgKzU1
OCw0NiBAQCBib29sIFBhcmtpbmdMb3Q6OnVucGFya09uZShjb25zdCB2b2lkKiBhCiAgICAgCiAg
ICAgewogICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2tlcih0aHJlYWRE
YXRhLT5wYXJraW5nTG9jayk7Ci0gICAgICAgIHRocmVhZERhdGEtPnNob3VsZFBhcmsgPSBmYWxz
ZTsKLSAgICAgICAgdGhyZWFkRGF0YS0+cGFya2luZ0NvbmRpdGlvbi5ub3RpZnlfYWxsKCk7Cisg
ICAgICAgIHRocmVhZERhdGEtPmFkZHJlc3MgPSBudWxscHRyOwogICAgIH0KKyAgICB0aHJlYWRE
YXRhLT5wYXJraW5nQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKIAogICAgIHJldHVybiByZXN1bHQ7
CiB9CiAKK3ZvaWQgUGFya2luZ0xvdDo6dW5wYXJrT25lKAorICAgIGNvbnN0IHZvaWQqIGFkZHJl
c3MsCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgZGlkVW5wYXJrVGhyZWFkLCBib29sIG1h
eUhhdmVNb3JlVGhyZWFkcyk+IGNhbGxiYWNrKQoreworICAgIGlmICh2ZXJib3NlKQorICAgICAg
ICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogdW5wYXJraW5nIG9uZSB0aGUg
aGFyZCB3YXkuXG4iKSk7CisKKyAgICBUaHJlYWREYXRhKiB0aHJlYWREYXRhID0gbnVsbHB0cjsK
KyAgICBkZXF1ZXVlKAorICAgICAgICBhZGRyZXNzLAorICAgICAgICB0cnVlLAorICAgICAgICBb
Jl0gKFRocmVhZERhdGEqIGVsZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LT5hZGRy
ZXNzICE9IGFkZHJlc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIERlcXVldWVSZXN1bHQ6Okln
bm9yZTsKKyAgICAgICAgICAgIHRocmVhZERhdGEgPSBlbGVtZW50OworICAgICAgICAgICAgcmV0
dXJuIERlcXVldWVSZXN1bHQ6OlJlbW92ZUFuZFN0b3A7CisgICAgICAgIH0sCisgICAgICAgIFsm
XSAoYm9vbCBtYXlIYXZlTW9yZVRocmVhZHMpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrKCEhdGhy
ZWFkRGF0YSwgdGhyZWFkRGF0YSAmJiBtYXlIYXZlTW9yZVRocmVhZHMpOworICAgICAgICB9KTsK
KworICAgIGlmICghdGhyZWFkRGF0YSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKHRo
cmVhZERhdGEtPnNob3VsZFBhcmspOworICAgIAorICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVf
bG9jazxzdGQ6Om11dGV4PiBsb2NrZXIodGhyZWFkRGF0YS0+cGFya2luZ0xvY2spOworICAgICAg
ICB0aHJlYWREYXRhLT5hZGRyZXNzID0gbnVsbHB0cjsKKyAgICB9CisgICAgdGhyZWFkRGF0YS0+
cGFya2luZ0NvbmRpdGlvbi5ub3RpZnlfb25lKCk7Cit9CisKIHZvaWQgUGFya2luZ0xvdDo6dW5w
YXJrQWxsKGNvbnN0IHZvaWQqIGFkZHJlc3MpCiB7CiAgICAgaWYgKHZlcmJvc2UpCkBAIC01Njks
NiArNjA2LDcgQEAgdm9pZCBQYXJraW5nTG90Ojp1bnBhcmtBbGwoY29uc3Qgdm9pZCogYQogICAg
IFZlY3RvcjxUaHJlYWREYXRhKiwgOD4gdGhyZWFkRGF0YXM7CiAgICAgZGVxdWV1ZSgKICAgICAg
ICAgYWRkcmVzcywKKyAgICAgICAgZmFsc2UsCiAgICAgICAgIFsmXSAoVGhyZWFkRGF0YSogZWxl
bWVudCkgewogICAgICAgICAgICAgaWYgKHZlcmJvc2UpCiAgICAgICAgICAgICAgICAgZGF0YUxv
Zyh0b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6IE9ic2VydmluZyBlbGVtZW50IHdpdGggYWRk
cmVzcyA9ICIsIFJhd1BvaW50ZXIoZWxlbWVudC0+YWRkcmVzcyksICJcbiIpKTsKQEAgLTU3Niwx
NSArNjE0LDE4IEBAIHZvaWQgUGFya2luZ0xvdDo6dW5wYXJrQWxsKGNvbnN0IHZvaWQqIGEKICAg
ICAgICAgICAgICAgICByZXR1cm4gRGVxdWV1ZVJlc3VsdDo6SWdub3JlOwogICAgICAgICAgICAg
dGhyZWFkRGF0YXMuYXBwZW5kKGVsZW1lbnQpOwogICAgICAgICAgICAgcmV0dXJuIERlcXVldWVS
ZXN1bHQ6OlJlbW92ZUFuZENvbnRpbnVlOwotICAgICAgICB9KTsKKyAgICAgICAgfSwKKyAgICAg
ICAgW10gKGJvb2wpIHsgfSk7CiAKICAgICBmb3IgKFRocmVhZERhdGEqIHRocmVhZERhdGEgOiB0
aHJlYWREYXRhcykgewogICAgICAgICBpZiAodmVyYm9zZSkKICAgICAgICAgICAgIGRhdGFMb2co
dG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiB1bnBhcmtpbmcgIiwgUmF3UG9pbnRlcih0aHJl
YWREYXRhKSwgIiB3aXRoIGFkZHJlc3MgIiwgUmF3UG9pbnRlcih0aHJlYWREYXRhLT5hZGRyZXNz
KSwgIlxuIikpOwogICAgICAgICBBU1NFUlQodGhyZWFkRGF0YS0+c2hvdWxkUGFyayk7Ci0gICAg
ICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9ja2VyKHRocmVhZERhdGEtPnBhcmtp
bmdMb2NrKTsKLSAgICAgICAgdGhyZWFkRGF0YS0+c2hvdWxkUGFyayA9IGZhbHNlOwotICAgICAg
ICB0aHJlYWREYXRhLT5wYXJraW5nQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgewor
ICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrZXIodGhyZWFkRGF0
YS0+cGFya2luZ0xvY2spOworICAgICAgICAgICAgdGhyZWFkRGF0YS0+YWRkcmVzcyA9IG51bGxw
dHI7CisgICAgICAgIH0KKyAgICAgICAgdGhyZWFkRGF0YS0+cGFya2luZ0NvbmRpdGlvbi5ub3Rp
Znlfb25lKCk7CiAgICAgfQogCiAgICAgaWYgKHZlcmJvc2UpCkluZGV4OiBTb3VyY2UvV1RGL3d0
Zi9QYXJraW5nTG90LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvUGFya2luZ0xvdC5o
CShyZXZpc2lvbiAxODgzMjIpCisrKyBTb3VyY2UvV1RGL3d0Zi9QYXJraW5nTG90LmgJKHdvcmtp
bmcgY29weSkKQEAgLTU5LDYgKzU5LDIxIEBAIHB1YmxpYzoKICAgICAvLyBhcmUgbm8gbW9yZSB0
aHJlYWRzIG9uIHRoZSBxdWV1ZS4KICAgICBXVEZfRVhQT1JUX1BSSVZBVEUgc3RhdGljIGJvb2wg
dW5wYXJrT25lKGNvbnN0IHZvaWQqIGFkZHJlc3MpOwogCisgICAgLy8gVW5wYXJrcyBvbmUgdGhy
ZWFkIGZyb20gdGhlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYWRkcmVzcywgYW5k
IGNhbGxzIHRoZSBnaXZlbgorICAgIC8vIGZ1bmN0b3Igd2hpbGUgdGhlIGFkZHJlc3MgaXMgbG9j
a2VkLiBSZXBvcnRzIHRvIHRoZSBjYWxsYmFjayB3aGV0aGVyIGFueSB0aHJlYWQgZ290IHVucGFy
a2VkCisgICAgLy8gYW5kIHdoZXRoZXIgdGhlcmUgbWF5IGJlIGFueSBvdGhlciB0aHJlYWRzIHN0
aWxsIG9uIHRoZSBxdWV1ZS4gVGhpcyBpcyBhbiBleHBlcnQtbW9kZSB2ZXJzaW9uCisgICAgLy8g
b2YgdW5wYXJrT25lKCkgdGhhdCBhbGxvd3MgZm9yIHJlYWxseSBnb29kIHRodW5kZXJpbmcgaGVy
ZCBhdm9pZGFuY2UgaW4gYWRhcHRpdmUgbXV0ZXhlcy4KKyAgICAvLyBXaXRob3V0IHRoaXMsIGEg
bG9jayBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdW5wYXJrT25lKCkgaGFzIHRvIGhhdmUgc29t
ZSB0cmljayBmb3Iga25vd2luZworICAgIC8vIGlmIHRoZXJlIGFyZSBzdGlsbCB0aHJlYWRzIHBh
cmtlZCBvbiB0aGUgcXVldWUsIHNvIHRoYXQgaXQgY2FuIHNldCBzb21lIGJpdCBpbiBpdHMgbG9j
ayB3b3JkCisgICAgLy8gdG8gaW5kaWNhdGUgdGhhdCB0aGUgbmV4dCB1bmxvY2soKSBhbHNvIG5l
ZWRzIHRvIHVucGFya09uZSgpLiBCdXQgdGhlcmUgaXMgYSByYWNlIGJldHdlZW4KKyAgICAvLyBt
YW5pcHVsYXRpbmcgdGhhdCBiaXQgYW5kIHNvbWUgb3RoZXIgdGhyZWFkIGFjcXVpcmluZyB0aGUg
bG9jay4gSXQncyBwb3NzaWJsZSB0byB3b3JrIGFyb3VuZAorICAgIC8vIHRoYXQgcmFjZSAtIHNl
ZSBSdXN0eSBSdXNzZWwncyB3ZWxsLWtub3duIHVzZXJzZW0gbGlicmFyeSAtIGJ1dCBpdCdzIG5v
dCBwcmV0dHkuIFRoaXMgZm9ybQorICAgIC8vIGFsbG93cyB0aGF0IHJhY2UgdG8gYmUgY29tcGxl
dGVseSBhdm9pZGVkLCBzaW5jZSB0aGVyZSBpcyBubyB3YXkgdGhhdCBhIHRocmVhZCBjYW4gYmUg
cGFya2VkCisgICAgLy8gd2hpbGUgdGhlIGNhbGxiYWNrIGlzIHJ1bm5pbmcuCisgICAgV1RGX0VY
UE9SVF9QUklWQVRFIHN0YXRpYyB2b2lkIHVucGFya09uZSgKKyAgICAgICAgY29uc3Qgdm9pZCog
YWRkcmVzcywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgZGlkVW5wYXJrVGhyZWFk
LCBib29sIG1heUhhdmVNb3JlVGhyZWFkcyk+IGNhbGxiYWNrKTsKKwogICAgIC8vIFVucGFya3Mg
ZXZlcnkgdGhyZWFkIGZyb20gdGhlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYWRk
cmVzcywgd2hpY2ggY2Fubm90IGJlIG51bGwuCiAgICAgV1RGX0VYUE9SVF9QUklWQVRFIHN0YXRp
YyB2b2lkIHVucGFya0FsbChjb25zdCB2b2lkKiBhZGRyZXNzKTsKIApJbmRleDogU291cmNlL1dU
Ri93dGYvV29yZExvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9Xb3JkTG9jay5o
CShyZXZpc2lvbiAxODgzMjMpCisrKyBTb3VyY2UvV1RGL3d0Zi9Xb3JkTG9jay5oCSh3b3JraW5n
IGNvcHkpCkBAIC0zMSw2ICszMSwxMCBAQAogI2luY2x1ZGUgPHd0Zi9Mb2NrZXIuaD4KICNpbmNs
dWRlIDx3dGYvTm9uY29weWFibGUuaD4KIAorbmFtZXNwYWNlIFRlc3RXZWJLaXRBUEkgeworc3Ry
dWN0IExvY2tJbnNwZWN0b3I7Cit9OworCiBuYW1lc3BhY2UgV1RGIHsKIAogLy8gQSBXb3JkTG9j
ayBpcyBhIGZ1bGx5IGFkYXB0aXZlIG11dGV4IHRoYXQgdXNlcyBzaXplb2Yodm9pZCopIHN0b3Jh
Z2UuIEl0IGhhcyBhIGZhc3QgcGF0aCB0aGF0IGlzCkBAIC03Nyw2ICs4MSw4IEBAIHB1YmxpYzoK
ICAgICB9CiAKIHByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBUZXN0V2ViS2l0QVBJOjpMb2Nr
SW5zcGVjdG9yOworICAgIAogICAgIHN0YXRpYyBjb25zdCB1aW50cHRyX3QgaXNMb2NrZWRCaXQg
PSAxOwogICAgIHN0YXRpYyBjb25zdCB1aW50cHRyX3QgaXNRdWV1ZUxvY2tlZEJpdCA9IDI7CiAg
ICAgc3RhdGljIGNvbnN0IHVpbnRwdHJfdCBxdWV1ZUhlYWRNYXNrID0gMzsKQEAgLTg0LDYgKzkw
LDEyIEBAIHByaXZhdGU6CiAgICAgV1RGX0VYUE9SVF9QUklWQVRFIHZvaWQgbG9ja1Nsb3coKTsK
ICAgICBXVEZfRVhQT1JUX1BSSVZBVEUgdm9pZCB1bmxvY2tTbG93KCk7CiAKKyAgICAvLyBNZXRo
b2QgdXNlZCBmb3IgdGVzdGluZyBvbmx5LgorICAgIGJvb2wgaXNGdWxseVJlc2V0KCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiAhbV93b3JkLmxvYWQoKTsKKyAgICB9CisKICAgICBBdG9t
aWM8dWludHB0cl90PiBtX3dvcmQ7CiB9OwogCkluZGV4OiBUb29scy9DaGFuZ2VMb2cKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxODgzNTUpCisrKyBUb29scy9DaGFu
Z2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNyBAQAorMjAxNS0wOC0xMiAgRmlsaXAg
UGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAgICAgIFdURjo6TG9jayBzaG91bGQgbm90
IHN1ZmZlciBmcm9tIHRoZSB0aHVuZGVyaW5nIGhlcmQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0Nzk0NworCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCB0ZXN0aW5nIHRoYXQgY2hlY2tzIHRoYXQgbG9j
a3MgcmV0dXJuIHRvIGEgcHJpc3RpbmUgc3RhdGUgYWZ0ZXIgY29udGVudGlvbiBpcyBvdmVyLgor
CisgICAgICAgICogVGVzdFdlYktpdEFQSS9UZXN0cy9XVEYvTG9jay5jcHA6CisgICAgICAgIChU
ZXN0V2ViS2l0QVBJOjpMb2NrSW5zcGVjdG9yOjppc0Z1bGx5UmVzZXQpOgorICAgICAgICAoVGVz
dFdlYktpdEFQSTo6cnVuTG9ja1Rlc3QpOgorICAgICAgICAoVGVzdFdlYktpdEFQSTo6VEVTVCk6
CisKIDIwMTUtMDgtMTIgIFNpbW9uIEZyYXNlciAgPHNpbW9uLmZyYXNlckBhcHBsZS5jb20+CiAK
ICAgICAgICAgQWRkIGEgdG9vbCB0aGF0IGR1bXBzIGNsYXNzIGFuZCBzdHJ1Y3QgbWVtYmVyIGxh
eW91dCwgc2hvd2luZyBwYWRkaW5nCkluZGV4OiBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dU
Ri9Mb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9M
b2NrLmNwcAkocmV2aXNpb24gMTg4MzIzKQorKysgVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9X
VEYvTG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDYgKzMzLDE0IEBAIHVzaW5nIG5hbWVz
cGFjZSBXVEY7CiAKIG5hbWVzcGFjZSBUZXN0V2ViS2l0QVBJIHsKIAorc3RydWN0IExvY2tJbnNw
ZWN0b3IgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExvY2tUeXBlPgorICAgIHN0YXRpYyBib29s
IGlzRnVsbHlSZXNldChMb2NrVHlwZSYgbG9jaykKKyAgICB7CisgICAgICAgIHJldHVybiBsb2Nr
LmlzRnVsbHlSZXNldCgpOworICAgIH0KK307CisKIHRlbXBsYXRlPHR5cGVuYW1lIExvY2tUeXBl
Pgogdm9pZCBydW5Mb2NrVGVzdCh1bnNpZ25lZCBudW1UaHJlYWRHcm91cHMsIHVuc2lnbmVkIG51
bVRocmVhZHNQZXJHcm91cCwgdW5zaWduZWQgd29ya1BlckNyaXRpY2FsU2VjdGlvbiwgdW5zaWdu
ZWQgbnVtSXRlcmF0aW9ucykKIHsKQEAgLTY2LDYgKzc0LDE3IEBAIHZvaWQgcnVuTG9ja1Rlc3Qo
dW5zaWduZWQgbnVtVGhyZWFkR3JvdXAKIAogICAgIGZvciAodW5zaWduZWQgdGhyZWFkR3JvdXBJ
bmRleCA9IG51bVRocmVhZEdyb3VwczsgdGhyZWFkR3JvdXBJbmRleC0tOykKICAgICAgICAgRVhQ
RUNUX0VRKGV4cGVjdGVkLCB3b3Jkc1t0aHJlYWRHcm91cEluZGV4XSk7CisKKyAgICAvLyBOb3cg
dGVzdCB0aGF0IHRoZSBsb2NrcyBjb3JyZWN0bHkgcmVzZXQgdGhlbXNlbHZlcy4gV2UgZXhwZWN0
IHRoYXQgaWYgYSBzaW5nbGUgdGhyZWFkIGxvY2tzCisgICAgLy8gZWFjaCBvZiB0aGUgbG9ja3Mg
dHdpY2UgaW4gYSByb3csIHRoZW4gdGhlIGxvY2sgc2hvdWxkIGJlIGluIGEgcHJpc3RpbmUgc3Rh
dGUuCisgICAgZm9yICh1bnNpZ25lZCB0aHJlYWRHcm91cEluZGV4ID0gbnVtVGhyZWFkR3JvdXBz
OyB0aHJlYWRHcm91cEluZGV4LS07KSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDI7IGkt
LTspIHsKKyAgICAgICAgICAgIGxvY2tzW3RocmVhZEdyb3VwSW5kZXhdLmxvY2soKTsKKyAgICAg
ICAgICAgIGxvY2tzW3RocmVhZEdyb3VwSW5kZXhdLnVubG9jaygpOworICAgICAgICB9CisKKyAg
ICAgICAgRVhQRUNUX0VRKHRydWUsIExvY2tJbnNwZWN0b3I6OmlzRnVsbHlSZXNldChsb2Nrc1t0
aHJlYWRHcm91cEluZGV4XSkpOworICAgIH0KIH0KIAogVEVTVChXVEZfV29yZExvY2ssIFVuY29u
dGVuZGVkU2hvcnRTZWN0aW9uKQpAQCAtMTI4LDYgKzE0NywxMSBAQCBURVNUKFdURl9Mb2NrLCBN
YW55Q29udGVuZGVkTG9uZ1NlY3Rpb25zCiAgICAgcnVuTG9ja1Rlc3Q8TG9jaz4oMTAsIDEwLCAx
MDAwMCwgMTAwMCk7CiB9CiAKK1RFU1QoV1RGX0xvY2ssIE1hbnlDb250ZW5kZWRMb25nZXJTZWN0
aW9ucykKK3sKKyAgICBydW5Mb2NrVGVzdDxMb2NrPigxMCwgMTAsIDEwMDAwMCwgMTAwKTsKK30K
KwogVEVTVChXVEZfTG9jaywgU2VjdGlvbkFkZHJlc3NDb2xsaXNpb24pCiB7CiAgICAgcnVuTG9j
a1Rlc3Q8TG9jaz4oNCwgMiwgMTAwMDAsIDIwMDApOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>258853</attachid>
            <date>2015-08-12 16:54:08 -0700</date>
            <delta_ts>2015-08-12 18:11:29 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>24374</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxODgzNTUpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDY3IEBACisyMDE1LTA4LTEyICBGaWxpcCBQaXpsbyAgPGZwaXps
b0BhcHBsZS5jb20+CisKKyAgICAgICAgV1RGOjpMb2NrIHNob3VsZCBub3Qgc3VmZmVyIGZyb20g
dGhlIHRodW5kZXJpbmcgaGVyZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTQ3OTQ3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgVGhpcyBjaGFuZ2VzIExvY2s6OnVubG9ja1Nsb3coKSB0byB1c2UgdW5wYXJr
T25lKCkgaW5zdGVhZCBvZiB1bnBhcmtBbGwoKS4gVGhlIHByb2JsZW0gd2l0aAorICAgICAgICBk
b2luZyB0aGlzIGlzIHRoYXQgaXQncyBub3Qgb2J2aW91cyBhZnRlciBjYWxsaW5nIHVucGFya09u
ZSgpIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgdGhyZWFkcworICAgICAgICB0aGF0IGFyZSBzdGls
bCBwYXJrZWQgb24gdGhlIGxvY2sncyBxdWV1ZS4gSWYgd2UgYXNzdW1lIHRoYXQgdGhlcmUgYXJl
IGFuZCBsZWF2ZSB0aGUKKyAgICAgICAgaGFzUGFya2VkQml0IHNldCwgdGhlbiBmdXR1cmUgY2Fs
bHMgdG8gdW5sb2NrKCkgd2lsbCB0YWtlIHRoZSBzbG93IHBhdGguIFdlIGRvbid0IHdhbnQgdGhh
dAorICAgICAgICBpZiB0aGVyZSBhcmVuJ3QgYWN0dWFsbHkgYW55IHRocmVhZHMgcGFya2VkLiBP
biB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgYXNzdW1lIHRoYXQgdGhlcmUKKyAgICAgICAgYXJlbid0
IGFueSB0aHJlYWRzIHBhcmtlZCBhbmQgY2xlYXIgdGhlIGhhc1BhcmtlZEJpdCwgdGhlbiBpZiB0
aGVyZSBhY3R1YWxseSB3ZXJlIHNvbWUKKyAgICAgICAgdGhyZWFkcyBwYXJrZWQsIHRoZW4gdGhl
eSBtYXkgbmV2ZXIgYmUgYXdva2VuIHNpbmNlIGZ1dHVyZSBjYWxscyB0byB1bmxvY2soKSB3b24n
dCB0YWtlIHNsb3cKKyAgICAgICAgcGF0aCBhbmQgc28gd29uJ3QgY2FsbCB1bnBhcmtPbmUoKS4g
SW4gb3RoZXIgd29yZHMsIHdlIG5lZWQgYSB3YXkgdG8gYmUgdmVyeSBwcmVjaXNlIGFib3V0Cisg
ICAgICAgIHdoZW4gd2UgY2xlYXIgdGhlIGhhc1BhcmtlZEJpdCBhbmQgd2UgbmVlZCB0byBkbyBp
dCBpbiBhIHJhY2UtZnJlZSB3YXk6IGl0IGNhbid0IGJlIHRoZSBjYXNlCisgICAgICAgIHRoYXQg
d2UgY2xlYXIgdGhlIGJpdCBqdXN0IGFzIHNvbWUgdGhyZWFkIGdldHMgcGFya2VkIG9uIHRoZSBx
dWV1ZS4KKworICAgICAgICBBIHNpbWlsYXIgcHJvYmxlbSBhcmlzZXMgaW4gZnV0ZXhlcywgYW5k
IG9uZSBvZiB0aGUgc29sdXRpb25zIGlzIHRvIGhhdmUgYSB0aHJlYWQgdGhhdAorICAgICAgICBh
Y3F1aXJlcyBhIGxvY2sgYWZ0ZXIgcGFya2luZyBzZXRzIHRoZSBoYXNQYXJrZWRCaXQuIFRoaXMg
aXMgd2hhdCBSdXN0eSBSdXNzZWwncyB1c2Vyc2VtCisgICAgICAgIGRvZXMuIEl0J3MgYSBzdWJ0
bGUgYWxnb3JpdGhtLiBBbHNvLCBpdCBtZWFucyB0aGF0IGlmIGEgdGhyZWFkIGJhcmdlcyBpbiBi
ZWZvcmUgdGhlIHVucGFya2VkCisgICAgICAgIHRocmVhZCBydW5zLCB0aGVuIHRoYXQgYmFyZ2lu
ZyB0aHJlYWQgd2lsbCBub3Qga25vdyB0aGF0IHRoZXJlIGFyZSB0aHJlYWRzIHBhcmtlZC4gVGhp
cworICAgICAgICBjb3VsZCBpbmNyZWFzZSB0aGUgc2V2ZXJpdHkgb2YgYmFyZ2luZy4KKworICAg
ICAgICBTaW5jZSBQYXJraW5nTG90IGlzIGEgdXNlci1sZXZlbCBBUEksIHdlIGRvbid0IGhhdmUg
dG8gd29ycnkgYWJvdXQgdGhlIGtlcm5lbC11c2VyIHNlY3VyaXR5CisgICAgICAgIGlzc3VlcyBh
bmQgc28gd2UgY2FuIGV4cG9zZSBjYWxsYmFja3Mgd2hpbGUgUGFya2luZ0xvdCBpcyBob2xkaW5n
IGl0cyBpbnRlcm5hbCBsb2Nrcy4gVGhpcworICAgICAgICBjaGFuZ2UgZG9lcyBleGFjdGx5IHRo
YXQgZm9yIHVucGFya09uZSgpLiBUaGUgbmV3IHZhcmlhbnQgb2YgdW5wYXJrT25lKCkgd2lsbCBj
YWxsIGEgdXNlcgorICAgICAgICBmdW5jdGlvbiB3aGlsZSB0aGUgcXVldWUgZnJvbSB3aGljaCB3
ZSBhcmUgdW5wYXJraW5nIGlzIGxvY2tlZC4gVGhlIGNhbGxiYWNrIGlzIHRvbGQgYmFzaWMKKyAg
ICAgICAgc3RhdHMgYWJvdXQgdGhlIHF1ZXVlOiBkaWQgd2UgdW5wYXJrIGEgdGhyZWFkIHRoaXMg
dGltZSwgYW5kIGNvdWxkIHRoZXJlIGJlIG1vcmUgdGhyZWFkcyB0bworICAgICAgICB1bnBhcmsg
aW4gdGhlIGZ1dHVyZS4gVGhlIGNhbGxiYWNrIHJ1bnMgd2hpbGUgaXQncyBpbXBvc3NpYmxlIGZv
ciB0aGUgcXVldWUgc3RhdGUgdG8gY2hhbmdlLAorICAgICAgICBzaW5jZSB0aGUgUGFya2luZ0xv
dCdzIGludGVybmFsIGxvY2tzIGZvciB0aGUgcXVldWUgaXMgaGVsZC4gVGhpcyBtZWFucyB0aGF0
CisgICAgICAgIExvY2s6OnVubG9ja1Nsb3coKSBjYW4gZWl0aGVyIGNsZWFyLCBvciBsZWF2ZSwg
dGhlIGhhc1BhcmtlZEJpdCB3aGlsZSByZWxlYXNpbmcgdGhlIGxvY2sKKyAgICAgICAgaW5zaWRl
IHRoZSBjYWxsYmFjayBmcm9tIHVucGFya09uZSgpLiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIHRo
dW5kZXJpbmcgaGVyZCBwcm9ibGVtIHdoaWxlCisgICAgICAgIGFsc28gcmVkdWNpbmcgdGhlIGdy
ZWVkIHRoYXQgYXJpc2VzIGZyb20gYmFyZ2luZyB0aHJlYWRzLgorCisgICAgICAgIFRoaXMgcmVx
dWlyZWQgc29tZSBjYXJlZnVsIHJld29ya2luZyBvZiB0aGUgUGFya2luZ0xvdCBhbGdvcml0aG0u
IFRoZSBmaXJzdCB0aGluZyBJIG5vdGljZWQKKyAgICAgICAgd2FzIHRoYXQgdGhlIFRocmVhZERh
dGE6OnNob3VsZFBhcmsgZmxhZyB3YXMgdXNlbGVzcywgc2luY2UgaXQncyBzZXQgZXhhY3RseSB3
aGVuCisgICAgICAgIFRocmVhZERhdGE6OmFkZHJlc3MgaXMgbm9uLW51bGwuIFRoZW4gSSBoYWQg
dG8gbWFrZSBzdXJlIHRoYXQgZGVxdWV1ZSgpIGNvdWxkIGxhemlseSBjcmVhdGUKKyAgICAgICAg
Ym90aCBoYXNodGFibGVzIGFuZCBidWNrZXRzLCBzaW5jZSB0aGUgImNhbGxiYWNrIGlzIGNhbGxl
ZCB3aGlsZSBxdWV1ZSBpcyBsb2NrZWQiIGludmFyaWFudAorICAgICAgICByZXF1aXJlcyB0aGF0
IHdlIGRpZG4ndCBleGl0IGVhcmx5IGR1ZSB0byB0aGUgaGFzaHRhYmxlIG9yIGJ1Y2tldCBub3Qg
YmVpbmcgcHJlc2VudC4gTm90ZQorICAgICAgICB0aGF0IGFsbCBvZiB0aGlzIGlzIGRvbmUgaW4g
c3VjaCBhIHdheSB0aGF0IHRoZSBvbGQgdW5wYXJrT25lKCkgYW5kIHVucGFya0FsbCgpIGRvbid0
IGhhdmUKKyAgICAgICAgdG8gY3JlYXRlIGFueSBidWNrZXRzLCB0aG91Z2ggdGhleSBub3cgbWF5
IGNyZWF0ZSB0aGUgaGFzaHRhYmxlLiBXZSBkb24ndCBjYXJlIGFzIG11Y2ggYWJvdXQKKyAgICAg
ICAgdGhlIGhhc2h0YWJsZSBiZWluZyBjcmVhdGVkIGJ5IHVucGFyayBzaW5jZSBpdCdzIGp1c3Qg
c3VjaCBhbiB1bmxpa2VseSBzY2VuYXJpbyBhbmQgaXQgd291bGQKKyAgICAgICAgb25seSBoYXBw
ZW4gb25jZS4KKworICAgICAgICBUaGlzIGNoYW5nZSByZWR1Y2VzIHRoZSBrZXJuZWwgQ1BVIHVz
YWdlIG9mIFdURjo6TG9jayBmb3IgdGhlIGxvbmcgY3JpdGljYWwgc2VjdGlvbiB0ZXN0IGJ5Cisg
ICAgICAgIGFib3V0IDh4IGFuZCBtYWtlcyBpdCBhbHdheXMgcGVyZm9ybSBhcyB3ZWxsIGFzIFdU
Rjo6V29yZExvY2sgYW5kIFdURjo6TXV0ZXggZm9yIHRoYXQKKyAgICAgICAgYmVuY2htYXJrLgor
CisgICAgICAgICogYmVuY2htYXJrcy9Mb2NrU3BlZWRUZXN0LmNwcDoKKyAgICAgICAgKiB3dGYv
TG9jay5jcHA6CisgICAgICAgIChXVEY6OkxvY2tCYXNlOjp1bmxvY2tTbG93KToKKyAgICAgICAg
KiB3dGYvTG9jay5oOgorICAgICAgICAoV1RGOjpMb2NrQmFzZTo6aXNMb2NrZWQpOgorICAgICAg
ICAoV1RGOjpMb2NrQmFzZTo6aXNGdWxseVJlc2V0KToKKyAgICAgICAgKiB3dGYvUGFya2luZ0xv
dC5jcHA6CisgICAgICAgIChXVEY6OlBhcmtpbmdMb3Q6OnBhcmtDb25kaXRpb25hbGx5KToKKyAg
ICAgICAgKFdURjo6UGFya2luZ0xvdDo6dW5wYXJrT25lKToKKyAgICAgICAgKFdURjo6UGFya2lu
Z0xvdDo6dW5wYXJrQWxsKToKKyAgICAgICAgKiB3dGYvUGFya2luZ0xvdC5oOgorICAgICAgICAq
IHd0Zi9Xb3JkTG9jay5oOgorICAgICAgICAoV1RGOjpXb3JkTG9jazo6aXNMb2NrZWQpOgorICAg
ICAgICAoV1RGOjpXb3JkTG9jazo6aXNGdWxseVJlc2V0KToKKwogMjAxNS0wOC0xMSAgRmlsaXAg
UGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAgIEFsd2F5cyB1c2UgYSBieXRlLXNp
emVkIGxvY2sgaW1wbGVtZW50YXRpb24KSW5kZXg6IFNvdXJjZS9XVEYvYmVuY2htYXJrcy9Mb2Nr
U3BlZWRUZXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL2JlbmNobWFya3MvTG9ja1Nw
ZWVkVGVzdC5jcHAJKHJldmlzaW9uIDE4ODMyMykKKysrIFNvdXJjZS9XVEYvYmVuY2htYXJrcy9M
b2NrU3BlZWRUZXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNyArNDQsNyBAQCB1bnNpZ25l
ZCBudW1JdGVyYXRpb25zOwogICAgIAogTk9fUkVUVVJOIHZvaWQgdXNhZ2UoKQogewotICAgIHBy
aW50ZigiVXNhZ2U6IExvY2tTcGVlZFRlc3Qgc3BpbmxvY2t8d29yZGxvY2t8bG9ja3xieXRlbG9j
a3xtdXRleHxhbGwgPG51bSB0aHJlYWQgZ3JvdXBzPiA8bnVtIHRocmVhZHMgcGVyIGdyb3VwPiA8
d29yayBwZXIgY3JpdGljYWwgc2VjdGlvbj4gPG51bSBub2lzZSB0aHJlYWRzPiA8bnVtIGl0ZXJh
dGlvbnM+XG4iKTsKKyAgICBwcmludGYoIlVzYWdlOiBMb2NrU3BlZWRUZXN0IHNwaW5sb2NrfHdv
cmRsb2NrfGxvY2t8bXV0ZXh8YWxsIDxudW0gdGhyZWFkIGdyb3Vwcz4gPG51bSB0aHJlYWRzIHBl
ciBncm91cD4gPHdvcmsgcGVyIGNyaXRpY2FsIHNlY3Rpb24+IDxudW0gbm9pc2UgdGhyZWFkcz4g
PG51bSBpdGVyYXRpb25zPlxuIik7CiAgICAgZXhpdCgxKTsKIH0KIApJbmRleDogU291cmNlL1dU
Ri93dGYvTG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvTG9jay5jcHAJKHJl
dmlzaW9uIDE4ODMyMykKKysrIFNvdXJjZS9XVEYvd3RmL0xvY2suY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC02OSwzNyArNjksNDYgQEAgdm9pZCBMb2NrQmFzZTo6bG9ja1Nsb3coKQogICAgICAgICAv
LyBXZSBub3cgZXhwZWN0IHRoZSB2YWx1ZSB0byBiZSBpc0hlbGR8aGFzUGFya2VkLiBTbyBsb25n
IGFzIHRoYXQncyB0aGUgY2FzZSwgd2UgY2FuIHBhcmsuCiAgICAgICAgIFBhcmtpbmdMb3Q6OmNv
bXBhcmVBbmRQYXJrKCZtX2J5dGUsIGlzSGVsZEJpdCB8IGhhc1BhcmtlZEJpdCk7CiAKLSAgICAg
ICAgLy8gV2UgaGF2ZSBhd2FrZW4sIG9yIHdlIG5ldmVyIHBhcmtlZCBiZWNhdXNlIHRoZSBieXRl
IHZhbHVlIGNoYW5nZWQuIEVpdGhlciB3YXksIHdlIGxvb3AKKyAgICAgICAgLy8gV2UgaGF2ZSBh
d29rZW4sIG9yIHdlIG5ldmVyIHBhcmtlZCBiZWNhdXNlIHRoZSBieXRlIHZhbHVlIGNoYW5nZWQu
IEVpdGhlciB3YXksIHdlIGxvb3AKICAgICAgICAgLy8gYXJvdW5kIGFuZCB0cnkgYWdhaW4uCiAg
ICAgfQogfQogCiB2b2lkIExvY2tCYXNlOjp1bmxvY2tTbG93KCkKIHsKLSAgICAvLyBSZWxlYXNl
IHRoZSBsb2NrIHdoaWxlIGZpbmRpbmcgb3V0IGlmIHNvbWVvbmUgaXMgcGFya2VkLiBOb3RlIHRo
YXQgYXMgc29vbiBhcyB3ZSBkbyB0aGlzLAotICAgIC8vIHNvbWVvbmUgbWlnaHQgYmFyZ2UgaW4u
Ci0gICAgdWludDhfdCBvbGRCeXRlVmFsdWU7CisgICAgLy8gV2UgY291bGQgZ2V0IGhlcmUgYmVj
YXVzZSB0aGUgd2VhayBDQVMgaW4gdW5sb2NrKCkgZmFpbGVkIHNwdXJpb3VzbHksIG9yIGJlY2F1
c2UgdGhlcmUgaXMKKyAgICAvLyBzb21lb25lIHBhcmtlZC4gU28sIHdlIG5lZWQgYSBDQVMgbG9v
cDogZXZlbiBpZiByaWdodCBub3cgdGhlIGxvY2sgaXMganVzdCBoZWxkLCBpdCBjb3VsZAorICAg
IC8vIGJlIGhlbGQgYW5kIHBhcmtlZCBpZiBzb21lb25lIGF0dGVtcHRzIHRvIGxvY2sganVzdCBh
cyB3ZSBhcmUgdW5sb2NraW5nLgogICAgIGZvciAoOzspIHsKLSAgICAgICAgb2xkQnl0ZVZhbHVl
ID0gbV9ieXRlLmxvYWQoKTsKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRh
TG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogdW5sb2NraW5nIHdpdGggIiwgb2xkQnl0
ZVZhbHVlLCAiXG4iKSk7Ci0gICAgICAgIEFTU0VSVChvbGRCeXRlVmFsdWUgJiBpc0hlbGRCaXQp
OwotICAgICAgICBpZiAobV9ieXRlLmNvbXBhcmVFeGNoYW5nZVdlYWsob2xkQnl0ZVZhbHVlLCAw
KSkKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICB1aW50OF90IG9sZEJ5dGVWYWx1ZSA9IG1f
Ynl0ZS5sb2FkKCk7CisgICAgICAgIEFTU0VSVChvbGRCeXRlVmFsdWUgPT0gaXNIZWxkQml0IHx8
IG9sZEJ5dGVWYWx1ZSA9PSAoaXNIZWxkQml0IHwgaGFzUGFya2VkQml0KSk7CisgICAgICAgIAor
ICAgICAgICBpZiAob2xkQnl0ZVZhbHVlID09IGlzSGVsZEJpdCkgeworICAgICAgICAgICAgaWYg
KG1fYnl0ZS5jb21wYXJlRXhjaGFuZ2VXZWFrKGlzSGVsZEJpdCwgMCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAv
LyBTb21lb25lIGlzIHBhcmtlZC4gVW5wYXJrIGV4YWN0bHkgb25lIHRocmVhZCwgcG9zc2libHkg
bGVhdmluZyB0aGUgcGFya2VkIGJpdCBzZXQgaWYKKyAgICAgICAgLy8gdGhlcmUgaXMgYSBjaGFu
Y2UgdGhhdCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdGhyZWFkcyBwYXJrZWQuCisgICAgICAgIEFT
U0VSVChvbGRCeXRlVmFsdWUgPT0gKGlzSGVsZEJpdCB8IGhhc1BhcmtlZEJpdCkpOworICAgICAg
ICBib29sIGRpZFVubG9jayA9IGZhbHNlOworICAgICAgICBQYXJraW5nTG90Ojp1bnBhcmtPbmUo
CisgICAgICAgICAgICAmbV9ieXRlLAorICAgICAgICAgICAgWyZdIChib29sLCBib29sIG1heUhh
dmVNb3JlVGhyZWFkcykgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSB0aGUgb25seSBvbmVz
IHRoYXQgY2FuIGNsZWFyIGVpdGhlciB0aGUgaXNIZWxkQml0IG9yIHRoZSBoYXNQYXJrZWRCaXQs
CisgICAgICAgICAgICAgICAgLy8gc28gd2Ugc2hvdWxkIHN0aWxsIHNlZSBib3RoIGJpdHMgc2V0
IHJpZ2h0IG5vdy4KKyAgICAgICAgICAgICAgICBBU1NFUlQobV9ieXRlLmxvYWQoKSA9PSAoaXNI
ZWxkQml0IHwgaGFzUGFya2VkQml0KSk7CisKKyAgICAgICAgICAgICAgICBpZiAobWF5SGF2ZU1v
cmVUaHJlYWRzKQorICAgICAgICAgICAgICAgICAgICBtX2J5dGUuc3RvcmUoaGFzUGFya2VkQml0
KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1fYnl0ZS5zdG9y
ZSgwKTsKKyAgICAgICAgICAgICAgICBkaWRVbmxvY2sgPSB0cnVlOworICAgICAgICAgICAgfSk7
CisgICAgICAgIEFTU0VSVChkaWRVbmxvY2spOworICAgICAgICByZXR1cm47CiAgICAgfQotCi0g
ICAgLy8gTm90ZSB0aGF0IHNvbWVvbmUgY291bGQgdHJ5IHRvIHBhcmsgcmlnaHQgbm93LiBJZiB0
aGF0IGhhcHBlbnMsIHRoZXkgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkKLSAgICAvLyBiZWNhdXNl
IG91ciBwYXJraW5nIHByZWRpY2F0ZSBpcyB0aGF0IG1fYnl0ZSA9PSBpc0hlbGRCaXQgfCBoYXNQ
YXJrZWRCaXQsIGJ1dCB3ZSd2ZSBhbHJlYWR5IHNldAotICAgIC8vIG1fYnl0ZSA9IDAuCi0KLSAg
ICAvLyBJZiB0aGVyZSBoYWQgYmVlbiB0aHJlYWRzIHBhcmtlZCwgdW5wYXJrIGFsbCBvZiB0aGVt
LiBUaGlzIGNhdXNlcyBhIHRodW5kZXJpbmcgaGVyZCwgYnV0IHdoaWxlCi0gICAgLy8gdGhhdCBp
cyB0aGVvcmV0aWNhbGx5IHNjYXJ5LCBpdCdzIHRvdGFsbHkgZmluZSBpbiBXZWJLaXQgYmVjYXVz
ZSB3ZSB1c3VhbGx5IGRvbid0IGhhdmUgZW5vdWdoCi0gICAgLy8gdGhyZWFkcyBmb3IgdGhpcyB0
byBtYXR0ZXIuCi0gICAgLy8gRklYTUU6IFdlIGRvbid0IHJlYWxseSBuZWVkIHRoaXMgdG8gZXho
aWJpdCB0aHVuZGVyaW5nIGhlcmQuIFdlIGNvdWxkIHVzZSB1bnBhcmtPbmUoKSwgYW5kIGlmCi0g
ICAgLy8gdGhhdCByZXR1cm5zIHRydWUsIGp1c3Qgc2V0IHRoZSBwYXJrZWQgYml0IGFnYWluLiBJ
ZiBpbiB0aGUgcHJvY2VzcyBvZiBzZXR0aW5nIHRoZSBwYXJrZWQgYml0Ci0gICAgLy8gd2UgZmFp
bCB0aGUgQ0FTLCB0aGVuIGp1c3QgdW5wYXJrIGFnYWluLgotICAgIGlmIChvbGRCeXRlVmFsdWUg
JiBoYXNQYXJrZWRCaXQpCi0gICAgICAgIFBhcmtpbmdMb3Q6OnVucGFya0FsbCgmbV9ieXRlKTsK
IH0KIAogfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9Mb2NrLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dURi93dGYvTG9jay5oCShyZXZpc2lvbiAxODgzMjMpCisrKyBT
b3VyY2UvV1RGL3d0Zi9Mb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDEwIEBACiAj
aW5jbHVkZSA8d3RmL0xvY2tlci5oPgogI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgogCitu
YW1lc3BhY2UgVGVzdFdlYktpdEFQSSB7CitzdHJ1Y3QgTG9ja0luc3BlY3RvcjsKK307CisKIG5h
bWVzcGFjZSBXVEYgewogCiAvLyBUaGlzIGlzIGEgZnVsbHkgYWRhcHRpdmUgbXV0ZXggdGhhdCBv
bmx5IHJlcXVpcmVzIDEgYnl0ZSBvZiBzdG9yYWdlLiBJdCBoYXMgZmFzdCBwYXRocyB0aGF0IGFy
ZQpAQCAtNzMsMTIgKzc3LDIwIEBAIHN0cnVjdCBMb2NrQmFzZSB7CiAgICAgfQogCiBwcm90ZWN0
ZWQ6CisgICAgZnJpZW5kIHN0cnVjdCBUZXN0V2ViS2l0QVBJOjpMb2NrSW5zcGVjdG9yOworICAg
IAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGlzSGVsZEJpdCA9IDE7CiAgICAgc3RhdGljIGNv
bnN0IHVpbnQ4X3QgaGFzUGFya2VkQml0ID0gMjsKIAogICAgIFdURl9FWFBPUlRfUFJJVkFURSB2
b2lkIGxvY2tTbG93KCk7CiAgICAgV1RGX0VYUE9SVF9QUklWQVRFIHZvaWQgdW5sb2NrU2xvdygp
OwogCisgICAgLy8gTWV0aG9kIHVzZWQgZm9yIHRlc3Rpbmcgb25seS4KKyAgICBib29sIGlzRnVs
bHlSZXNldCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIW1fYnl0ZS5sb2FkKCk7Cisg
ICAgfQorCiAgICAgQXRvbWljPHVpbnQ4X3Q+IG1fYnl0ZTsKIH07CiAKSW5kZXg6IFNvdXJjZS9X
VEYvd3RmL1BhcmtpbmdMb3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1Bhcmtp
bmdMb3QuY3BwCShyZXZpc2lvbiAxODgzMjMpCisrKyBTb3VyY2UvV1RGL3d0Zi9QYXJraW5nTG90
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTIsMTEgKzUyLDExIEBAIHB1YmxpYzoKIAogICAgIFRo
cmVhZElkZW50aWZpZXIgdGhyZWFkSWRlbnRpZmllcjsKICAgICAKLSAgICBib29sIHNob3VsZFBh
cmsgeyBmYWxzZSB9OwogICAgIHN0ZDo6bXV0ZXggcGFya2luZ0xvY2s7CiAgICAgc3RkOjpjb25k
aXRpb25fdmFyaWFibGUgcGFya2luZ0NvbmRpdGlvbjsKIAotICAgIGNvbnN0IHZvaWQqIGFkZHJl
c3M7CisgICAgY29uc3Qgdm9pZCogYWRkcmVzcyB7IG51bGxwdHIgfTsKKyAgICAKICAgICBUaHJl
YWREYXRhKiBuZXh0SW5RdWV1ZSB7IG51bGxwdHIgfTsKIH07CiAKQEAgLTIxMiwyNSArMjEyLDM2
IEBAIHVuc2lnbmVkIGhhc2hBZGRyZXNzKGNvbnN0IHZvaWQqIGFkZHJlc3MKICAgICByZXR1cm4g
V1RGOjpQdHJIYXNoPGNvbnN0IHZvaWQqPjo6aGFzaChhZGRyZXNzKTsKIH0KIAotLy8gTG9ja3Mg
dGhlIGhhc2h0YWJsZS4gVGhpcyByZWxvb3BzIGluIGNhc2Ugb2YgcmVoYXNoaW5nLCBzbyB0aGUg
Y3VycmVudCBoYXNodGFibGUgbWF5IGJlIGRpZmZlcmVudAotLy8gYWZ0ZXIgdGhpcyByZXR1cm5z
IHRoYW4gd2hlbiB5b3UgY2FsbGVkIGl0LiBHdWFyYW50ZWVzIHRoYXQgdGhlcmUgaXMgYSBoYXNo
dGFibGUuIFRoaXMgaXMgcHJldHR5Ci0vLyBzbG93IGFuZCBub3Qgc2NhbGFibGUsIHNvIGl0J3Mg
b25seSB1c2VkIGR1cmluZyB0aHJlYWQgY3JlYXRpb24gYW5kIGZvciBkZWJ1Z2dpbmcvdGVzdGlu
Zy4KLVZlY3RvcjxCdWNrZXQqPiBsb2NrSGFzaHRhYmxlKCkKK0hhc2h0YWJsZSogZW5zdXJlSGFz
aHRhYmxlKCkKIHsKICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIEhhc2h0YWJsZSogY3VycmVudEhh
c2h0YWJsZTsKKyAgICAgICAgSGFzaHRhYmxlKiBjdXJyZW50SGFzaHRhYmxlID0gaGFzaHRhYmxl
LmxvYWQoKTsKKworICAgICAgICBpZiAoY3VycmVudEhhc2h0YWJsZSkKKyAgICAgICAgICAgIHJl
dHVybiBjdXJyZW50SGFzaHRhYmxlOwogCi0gICAgICAgIGN1cnJlbnRIYXNodGFibGUgPSBoYXNo
dGFibGUubG9hZCgpOwogICAgICAgICBpZiAoIWN1cnJlbnRIYXNodGFibGUpIHsKLSAgICAgICAg
ICAgIC8vIFRyeSB0byBiZSB0aGUgZmlyc3QgdG8gY3JlYXRlIHRoZSBoYXNodGFibGUuCiAgICAg
ICAgICAgICBjdXJyZW50SGFzaHRhYmxlID0gSGFzaHRhYmxlOjpjcmVhdGUobWF4TG9hZEZhY3Rv
cik7Ci0gICAgICAgICAgICBpZiAoIWhhc2h0YWJsZS5jb21wYXJlRXhjaGFuZ2VXZWFrKG51bGxw
dHIsIGN1cnJlbnRIYXNodGFibGUpKSB7Ci0gICAgICAgICAgICAgICAgSGFzaHRhYmxlOjpkZXN0
cm95KGN1cnJlbnRIYXNodGFibGUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICAgICAgaWYgKGhhc2h0YWJsZS5jb21wYXJlRXhjaGFuZ2VXZWFrKG51bGxwdHIsIGN1cnJlbnRI
YXNodGFibGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAg
ICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBjcmVhdGVkIGluaXRp
YWwgaGFzaHRhYmxlICIsIFJhd1BvaW50ZXIoY3VycmVudEhhc2h0YWJsZSksICJcbiIpKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEhhc2h0YWJsZTsKICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmco
Y3VycmVudFRocmVhZCgpLCAiOiBjcmVhdGVkIGluaXRpYWwgaGFzaHRhYmxlICIsIFJhd1BvaW50
ZXIoY3VycmVudEhhc2h0YWJsZSksICJcbiIpKTsKKworICAgICAgICAgICAgSGFzaHRhYmxlOjpk
ZXN0cm95KGN1cnJlbnRIYXNodGFibGUpOwogICAgICAgICB9CisgICAgfQorfQorCisvLyBMb2Nr
cyB0aGUgaGFzaHRhYmxlLiBUaGlzIHJlbG9vcHMgaW4gY2FzZSBvZiByZWhhc2hpbmcsIHNvIHRo
ZSBjdXJyZW50IGhhc2h0YWJsZSBtYXkgYmUgZGlmZmVyZW50CisvLyBhZnRlciB0aGlzIHJldHVy
bnMgdGhhbiB3aGVuIHlvdSBjYWxsZWQgaXQuIEd1YXJhbnRlZXMgdGhhdCB0aGVyZSBpcyBhIGhh
c2h0YWJsZS4gVGhpcyBpcyBwcmV0dHkKKy8vIHNsb3cgYW5kIG5vdCBzY2FsYWJsZSwgc28gaXQn
cyBvbmx5IHVzZWQgZHVyaW5nIHRocmVhZCBjcmVhdGlvbiBhbmQgZm9yIGRlYnVnZ2luZy90ZXN0
aW5nLgorVmVjdG9yPEJ1Y2tldCo+IGxvY2tIYXNodGFibGUoKQoreworICAgIGZvciAoOzspIHsK
KyAgICAgICAgSGFzaHRhYmxlKiBjdXJyZW50SGFzaHRhYmxlID0gZW5zdXJlSGFzaHRhYmxlKCk7
CisKKyAgICAgICAgQVNTRVJUKGN1cnJlbnRIYXNodGFibGUpOwogCiAgICAgICAgIC8vIE5vdyBm
aW5kIGFsbCBvZiB0aGUgYnVja2V0cy4gVGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGhhc2h0YWJs
ZSBpcyBmdWxsIG9mIGJ1Y2tldHMgc28gdGhhdAogICAgICAgICAvLyB3ZSBjYW4gbG9jayBhbGwg
b2YgdGhlIGJ1Y2tldHMsIG5vdCBqdXN0IHRoZSBvbmVzIHRoYXQgYXJlIG1hdGVyaWFsaXplZC4K
QEAgLTQwNSw3ICs0MTYsNyBAQCBib29sIGVucXVldWUoY29uc3Qgdm9pZCogYWRkcmVzcywgY29u
c3QgCiAgICAgdW5zaWduZWQgaGFzaCA9IGhhc2hBZGRyZXNzKGFkZHJlc3MpOwogCiAgICAgZm9y
ICg7OykgewotICAgICAgICBIYXNodGFibGUqIG15SGFzaHRhYmxlID0gaGFzaHRhYmxlLmxvYWQo
KTsKKyAgICAgICAgSGFzaHRhYmxlKiBteUhhc2h0YWJsZSA9IGVuc3VyZUhhc2h0YWJsZSgpOwog
ICAgICAgICB1bnNpZ25lZCBpbmRleCA9IGhhc2ggJSBteUhhc2h0YWJsZS0+c2l6ZTsKICAgICAg
ICAgQXRvbWljPEJ1Y2tldCo+JiBidWNrZXRQb2ludGVyID0gbXlIYXNodGFibGUtPmRhdGFbaW5k
ZXhdOwogICAgICAgICBCdWNrZXQqIGJ1Y2tldDsKQEAgLTQ0NCw1MCArNDU1LDQ2IEBAIGJvb2wg
ZW5xdWV1ZShjb25zdCB2b2lkKiBhZGRyZXNzLCBjb25zdCAKICAgICB9CiB9CiAKLXRlbXBsYXRl
PHR5cGVuYW1lIEZ1bmN0b3I+Ci1ib29sIGRlcXVldWUoY29uc3Qgdm9pZCogYWRkcmVzcywgY29u
c3QgRnVuY3RvciYgZnVuY3RvcikKK3RlbXBsYXRlPHR5cGVuYW1lIERlcXVldWVGdW5jdG9yLCB0
eXBlbmFtZSBGaW5pc2hGdW5jdG9yPgorYm9vbCBkZXF1ZXVlKAorICAgIGNvbnN0IHZvaWQqIGFk
ZHJlc3MsIGJvb2wgZW5zdXJlQnVja2V0LCBjb25zdCBEZXF1ZXVlRnVuY3RvciYgZGVxdWV1ZUZ1
bmN0b3IsCisgICAgY29uc3QgRmluaXNoRnVuY3RvciYgZmluaXNoRnVuY3RvcikKIHsKLSAgICBp
ZiAodmVyYm9zZSkKLSAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6
IGRlcXVldWVpbmcgYWRkcmVzcyAiLCBSYXdQb2ludGVyKGFkZHJlc3MpLCAiXG4iKSk7CiAgICAg
dW5zaWduZWQgaGFzaCA9IGhhc2hBZGRyZXNzKGFkZHJlc3MpOwotICAgIGlmICh2ZXJib3NlKQot
ICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogaGFzaCA9ICIsIGhh
c2gsICJcbiIpKTsKIAogICAgIGZvciAoOzspIHsKLSAgICAgICAgSGFzaHRhYmxlKiBteUhhc2h0
YWJsZSA9IGhhc2h0YWJsZS5sb2FkKCk7Ci0gICAgICAgIGlmICghbXlIYXNodGFibGUpIHsKLSAg
ICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmco
Y3VycmVudFRocmVhZCgpLCAiOiBubyBoYXNodGFibGUuXG4iKSk7Ci0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgSGFzaHRhYmxlKiBteUhhc2h0YWJsZSA9IGVu
c3VyZUhhc2h0YWJsZSgpOwogICAgICAgICB1bnNpZ25lZCBpbmRleCA9IGhhc2ggJSBteUhhc2h0
YWJsZS0+c2l6ZTsKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nKHRv
U3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogaW5kZXggPSAiLCBpbmRleCwgIlxuIikpOwotICAg
ICAgICBCdWNrZXQqIGJ1Y2tldCA9IG15SGFzaHRhYmxlLT5kYXRhW2luZGV4XS5sb2FkKCk7Cisg
ICAgICAgIEF0b21pYzxCdWNrZXQqPiYgYnVja2V0UG9pbnRlciA9IG15SGFzaHRhYmxlLT5kYXRh
W2luZGV4XTsKKyAgICAgICAgQnVja2V0KiBidWNrZXQgPSBidWNrZXRQb2ludGVyLmxvYWQoKTsK
ICAgICAgICAgaWYgKCFidWNrZXQpIHsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAg
ICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBubyBidWNrZXQg
YXQgIiwgUmF3UG9pbnRlcihidWNrZXQpLCAiLlxuIikpOwotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgaWYgKCFlbnN1cmVCdWNrZXQpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgYnVj
a2V0ID0gYnVja2V0UG9pbnRlci5sb2FkKCk7CisgICAgICAgICAgICAgICAgaWYgKCFidWNrZXQp
IHsKKyAgICAgICAgICAgICAgICAgICAgYnVja2V0ID0gbmV3IEJ1Y2tldCgpOworICAgICAgICAg
ICAgICAgICAgICBpZiAoIWJ1Y2tldFBvaW50ZXIuY29tcGFyZUV4Y2hhbmdlV2VhayhudWxscHRy
LCBidWNrZXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYnVja2V0OworICAg
ICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAg
ICAgICAgIH0KIAotICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgIGRhdGFMb2codG9T
dHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBsb2NraW5nIGJ1Y2tldCBhdCAiLCBSYXdQb2ludGVy
KGJ1Y2tldCksICJcbiIpKTsKICAgICAgICAgYnVja2V0LT5sb2NrLmxvY2soKTsKLSAgICAgICAg
aWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQo
KSwgIjogbG9ja2VkIGJ1Y2tldCBhdCAiLCBSYXdQb2ludGVyKGJ1Y2tldCksICJcbiIpKTsKIAog
ICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBoYXNodGFibGUgY291bGQgaGF2ZSByZWhhc2hl
ZCB1bmRlciB1cy4KICAgICAgICAgaWYgKGhhc2h0YWJsZS5sb2FkKCkgIT0gbXlIYXNodGFibGUp
IHsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICAgIGRhdGFMb2codG9T
dHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBoYXNodGFibGUgY2hhbmdlZC5cbiIpKTsKICAgICAg
ICAgICAgIGJ1Y2tldC0+bG9jay51bmxvY2soKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAg
ICAgICB9CiAKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nKHRvU3Ry
aW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogZm91bmQgYnVja2V0LlxuIikpOwotICAgICAgICBidWNr
ZXQtPmdlbmVyaWNEZXF1ZXVlKGZ1bmN0b3IpOworICAgICAgICBidWNrZXQtPmdlbmVyaWNEZXF1
ZXVlKGRlcXVldWVGdW5jdG9yKTsKICAgICAgICAgYm9vbCByZXN1bHQgPSAhIWJ1Y2tldC0+cXVl
dWVIZWFkOworICAgICAgICBmaW5pc2hGdW5jdG9yKHJlc3VsdCk7CiAgICAgICAgIGJ1Y2tldC0+
bG9jay51bmxvY2soKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC01MDIsOCAr
NTA5LDYgQEAgYm9vbCBQYXJraW5nTG90OjpwYXJrQ29uZGl0aW9uYWxseShjb25zdAogICAgIAog
ICAgIFRocmVhZERhdGEqIG1lID0gbXlUaHJlYWREYXRhKCk7CiAKLSAgICBBU1NFUlQoIW1lLT5z
aG91bGRQYXJrKTsKLSAgICAKICAgICBib29sIHJlc3VsdCA9IGVucXVldWUoCiAgICAgICAgIGFk
ZHJlc3MsCiAgICAgICAgIFsmXSAoKSAtPiBUaHJlYWREYXRhKiB7CkBAIC01MTEsNyArNTE2LDYg
QEAgYm9vbCBQYXJraW5nTG90OjpwYXJrQ29uZGl0aW9uYWxseShjb25zdAogICAgICAgICAgICAg
ICAgIHJldHVybiBudWxscHRyOwogCiAgICAgICAgICAgICBtZS0+YWRkcmVzcyA9IGFkZHJlc3M7
Ci0gICAgICAgICAgICBtZS0+c2hvdWxkUGFyayA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4g
bWU7CiAgICAgICAgIH0pOwogCkBAIC01MjIsMTAgKzUyNiw4IEBAIGJvb2wgUGFya2luZ0xvdDo6
cGFya0NvbmRpdGlvbmFsbHkoY29uc3QKICAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50
VGhyZWFkKCksICI6IHBhcmtpbmcgc2VsZjogIiwgUmF3UG9pbnRlcihtZSksICJcbiIpKTsKICAg
ICB7CiAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9ja2VyKG1lLT5wYXJr
aW5nTG9jayk7Ci0gICAgICAgIHdoaWxlIChtZS0+c2hvdWxkUGFyaykKKyAgICAgICAgd2hpbGUg
KG1lLT5hZGRyZXNzKQogICAgICAgICAgICAgbWUtPnBhcmtpbmdDb25kaXRpb24ud2FpdChsb2Nr
ZXIpOwotCi0gICAgICAgIG1lLT5hZGRyZXNzID0gbnVsbHB0cjsKICAgICB9CiAgICAgaWYgKHZl
cmJvc2UpCiAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiB1bnBh
cmtlZCBzZWxmOiAiLCBSYXdQb2ludGVyKG1lKSwgIlxuIikpOwpAQCAtNTQwLDI3ICs1NDIsNjIg
QEAgYm9vbCBQYXJraW5nTG90Ojp1bnBhcmtPbmUoY29uc3Qgdm9pZCogYQogICAgIFRocmVhZERh
dGEqIHRocmVhZERhdGEgPSBudWxscHRyOwogICAgIGJvb2wgcmVzdWx0ID0gZGVxdWV1ZSgKICAg
ICAgICAgYWRkcmVzcywKKyAgICAgICAgZmFsc2UsCiAgICAgICAgIFsmXSAoVGhyZWFkRGF0YSog
ZWxlbWVudCkgewogICAgICAgICAgICAgaWYgKGVsZW1lbnQtPmFkZHJlc3MgIT0gYWRkcmVzcykK
ICAgICAgICAgICAgICAgICByZXR1cm4gRGVxdWV1ZVJlc3VsdDo6SWdub3JlOwogICAgICAgICAg
ICAgdGhyZWFkRGF0YSA9IGVsZW1lbnQ7CiAgICAgICAgICAgICByZXR1cm4gRGVxdWV1ZVJlc3Vs
dDo6UmVtb3ZlQW5kU3RvcDsKLSAgICAgICAgfSk7CisgICAgICAgIH0sCisgICAgICAgIFtdIChi
b29sKSB7IH0pOwogCiAgICAgaWYgKCF0aHJlYWREYXRhKQogICAgICAgICByZXR1cm4gZmFsc2U7
CiAKLSAgICBBU1NFUlQodGhyZWFkRGF0YS0+c2hvdWxkUGFyayk7CisgICAgQVNTRVJUKHRocmVh
ZERhdGEtPmFkZHJlc3MpOwogICAgIAogICAgIHsKICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxz
dGQ6Om11dGV4PiBsb2NrZXIodGhyZWFkRGF0YS0+cGFya2luZ0xvY2spOwotICAgICAgICB0aHJl
YWREYXRhLT5zaG91bGRQYXJrID0gZmFsc2U7Ci0gICAgICAgIHRocmVhZERhdGEtPnBhcmtpbmdD
b25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB0aHJlYWREYXRhLT5hZGRyZXNzID0gbnVs
bHB0cjsKICAgICB9CisgICAgdGhyZWFkRGF0YS0+cGFya2luZ0NvbmRpdGlvbi5ub3RpZnlfb25l
KCk7CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCit2b2lkIFBhcmtpbmdMb3Q6OnVucGFya09u
ZSgKKyAgICBjb25zdCB2b2lkKiBhZGRyZXNzLAorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChib29s
IGRpZFVucGFya1RocmVhZCwgYm9vbCBtYXlIYXZlTW9yZVRocmVhZHMpPiBjYWxsYmFjaykKK3sK
KyAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFk
KCksICI6IHVucGFya2luZyBvbmUgdGhlIGhhcmQgd2F5LlxuIikpOworCisgICAgVGhyZWFkRGF0
YSogdGhyZWFkRGF0YSA9IG51bGxwdHI7CisgICAgZGVxdWV1ZSgKKyAgICAgICAgYWRkcmVzcywK
KyAgICAgICAgdHJ1ZSwKKyAgICAgICAgWyZdIChUaHJlYWREYXRhKiBlbGVtZW50KSB7CisgICAg
ICAgICAgICBpZiAoZWxlbWVudC0+YWRkcmVzcyAhPSBhZGRyZXNzKQorICAgICAgICAgICAgICAg
IHJldHVybiBEZXF1ZXVlUmVzdWx0OjpJZ25vcmU7CisgICAgICAgICAgICB0aHJlYWREYXRhID0g
ZWxlbWVudDsKKyAgICAgICAgICAgIHJldHVybiBEZXF1ZXVlUmVzdWx0OjpSZW1vdmVBbmRTdG9w
OworICAgICAgICB9LAorICAgICAgICBbJl0gKGJvb2wgbWF5SGF2ZU1vcmVUaHJlYWRzKSB7Cisg
ICAgICAgICAgICBjYWxsYmFjayghIXRocmVhZERhdGEsIHRocmVhZERhdGEgJiYgbWF5SGF2ZU1v
cmVUaHJlYWRzKTsKKyAgICAgICAgfSk7CisKKyAgICBpZiAoIXRocmVhZERhdGEpCisgICAgICAg
IHJldHVybjsKKworICAgIEFTU0VSVCh0aHJlYWREYXRhLT5hZGRyZXNzKTsKKyAgICAKKyAgICB7
CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9ja2VyKHRocmVhZERhdGEt
PnBhcmtpbmdMb2NrKTsKKyAgICAgICAgdGhyZWFkRGF0YS0+YWRkcmVzcyA9IG51bGxwdHI7Cisg
ICAgfQorICAgIHRocmVhZERhdGEtPnBhcmtpbmdDb25kaXRpb24ubm90aWZ5X29uZSgpOworfQor
CiB2b2lkIFBhcmtpbmdMb3Q6OnVucGFya0FsbChjb25zdCB2b2lkKiBhZGRyZXNzKQogewogICAg
IGlmICh2ZXJib3NlKQpAQCAtNTY5LDYgKzYwNiw3IEBAIHZvaWQgUGFya2luZ0xvdDo6dW5wYXJr
QWxsKGNvbnN0IHZvaWQqIGEKICAgICBWZWN0b3I8VGhyZWFkRGF0YSosIDg+IHRocmVhZERhdGFz
OwogICAgIGRlcXVldWUoCiAgICAgICAgIGFkZHJlc3MsCisgICAgICAgIGZhbHNlLAogICAgICAg
ICBbJl0gKFRocmVhZERhdGEqIGVsZW1lbnQpIHsKICAgICAgICAgICAgIGlmICh2ZXJib3NlKQog
ICAgICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBPYnNl
cnZpbmcgZWxlbWVudCB3aXRoIGFkZHJlc3MgPSAiLCBSYXdQb2ludGVyKGVsZW1lbnQtPmFkZHJl
c3MpLCAiXG4iKSk7CkBAIC01NzYsMTUgKzYxNCwxOCBAQCB2b2lkIFBhcmtpbmdMb3Q6OnVucGFy
a0FsbChjb25zdCB2b2lkKiBhCiAgICAgICAgICAgICAgICAgcmV0dXJuIERlcXVldWVSZXN1bHQ6
Oklnbm9yZTsKICAgICAgICAgICAgIHRocmVhZERhdGFzLmFwcGVuZChlbGVtZW50KTsKICAgICAg
ICAgICAgIHJldHVybiBEZXF1ZXVlUmVzdWx0OjpSZW1vdmVBbmRDb250aW51ZTsKLSAgICAgICAg
fSk7CisgICAgICAgIH0sCisgICAgICAgIFtdIChib29sKSB7IH0pOwogCiAgICAgZm9yIChUaHJl
YWREYXRhKiB0aHJlYWREYXRhIDogdGhyZWFkRGF0YXMpIHsKICAgICAgICAgaWYgKHZlcmJvc2Up
CiAgICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogdW5wYXJr
aW5nICIsIFJhd1BvaW50ZXIodGhyZWFkRGF0YSksICIgd2l0aCBhZGRyZXNzICIsIFJhd1BvaW50
ZXIodGhyZWFkRGF0YS0+YWRkcmVzcyksICJcbiIpKTsKLSAgICAgICAgQVNTRVJUKHRocmVhZERh
dGEtPnNob3VsZFBhcmspOwotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxv
Y2tlcih0aHJlYWREYXRhLT5wYXJraW5nTG9jayk7Ci0gICAgICAgIHRocmVhZERhdGEtPnNob3Vs
ZFBhcmsgPSBmYWxzZTsKLSAgICAgICAgdGhyZWFkRGF0YS0+cGFya2luZ0NvbmRpdGlvbi5ub3Rp
ZnlfYWxsKCk7CisgICAgICAgIEFTU0VSVCh0aHJlYWREYXRhLT5hZGRyZXNzKTsKKyAgICAgICAg
eworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrZXIodGhyZWFk
RGF0YS0+cGFya2luZ0xvY2spOworICAgICAgICAgICAgdGhyZWFkRGF0YS0+YWRkcmVzcyA9IG51
bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgdGhyZWFkRGF0YS0+cGFya2luZ0NvbmRpdGlvbi5u
b3RpZnlfb25lKCk7CiAgICAgfQogCiAgICAgaWYgKHZlcmJvc2UpCkluZGV4OiBTb3VyY2UvV1RG
L3d0Zi9QYXJraW5nTG90LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvUGFya2luZ0xv
dC5oCShyZXZpc2lvbiAxODgzMjIpCisrKyBTb3VyY2UvV1RGL3d0Zi9QYXJraW5nTG90LmgJKHdv
cmtpbmcgY29weSkKQEAgLTU5LDYgKzU5LDIxIEBAIHB1YmxpYzoKICAgICAvLyBhcmUgbm8gbW9y
ZSB0aHJlYWRzIG9uIHRoZSBxdWV1ZS4KICAgICBXVEZfRVhQT1JUX1BSSVZBVEUgc3RhdGljIGJv
b2wgdW5wYXJrT25lKGNvbnN0IHZvaWQqIGFkZHJlc3MpOwogCisgICAgLy8gVW5wYXJrcyBvbmUg
dGhyZWFkIGZyb20gdGhlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYWRkcmVzcywg
YW5kIGNhbGxzIHRoZSBnaXZlbgorICAgIC8vIGZ1bmN0b3Igd2hpbGUgdGhlIGFkZHJlc3MgaXMg
bG9ja2VkLiBSZXBvcnRzIHRvIHRoZSBjYWxsYmFjayB3aGV0aGVyIGFueSB0aHJlYWQgZ290IHVu
cGFya2VkCisgICAgLy8gYW5kIHdoZXRoZXIgdGhlcmUgbWF5IGJlIGFueSBvdGhlciB0aHJlYWRz
IHN0aWxsIG9uIHRoZSBxdWV1ZS4gVGhpcyBpcyBhbiBleHBlcnQtbW9kZSB2ZXJzaW9uCisgICAg
Ly8gb2YgdW5wYXJrT25lKCkgdGhhdCBhbGxvd3MgZm9yIHJlYWxseSBnb29kIHRodW5kZXJpbmcg
aGVyZCBhdm9pZGFuY2UgaW4gYWRhcHRpdmUgbXV0ZXhlcy4KKyAgICAvLyBXaXRob3V0IHRoaXMs
IGEgbG9jayBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdW5wYXJrT25lKCkgaGFzIHRvIGhhdmUg
c29tZSB0cmljayBmb3Iga25vd2luZworICAgIC8vIGlmIHRoZXJlIGFyZSBzdGlsbCB0aHJlYWRz
IHBhcmtlZCBvbiB0aGUgcXVldWUsIHNvIHRoYXQgaXQgY2FuIHNldCBzb21lIGJpdCBpbiBpdHMg
bG9jayB3b3JkCisgICAgLy8gdG8gaW5kaWNhdGUgdGhhdCB0aGUgbmV4dCB1bmxvY2soKSBhbHNv
IG5lZWRzIHRvIHVucGFya09uZSgpLiBCdXQgdGhlcmUgaXMgYSByYWNlIGJldHdlZW4KKyAgICAv
LyBtYW5pcHVsYXRpbmcgdGhhdCBiaXQgYW5kIHNvbWUgb3RoZXIgdGhyZWFkIGFjcXVpcmluZyB0
aGUgbG9jay4gSXQncyBwb3NzaWJsZSB0byB3b3JrIGFyb3VuZAorICAgIC8vIHRoYXQgcmFjZSAt
IHNlZSBSdXN0eSBSdXNzZWwncyB3ZWxsLWtub3duIHVzZXJzZW0gbGlicmFyeSAtIGJ1dCBpdCdz
IG5vdCBwcmV0dHkuIFRoaXMgZm9ybQorICAgIC8vIGFsbG93cyB0aGF0IHJhY2UgdG8gYmUgY29t
cGxldGVseSBhdm9pZGVkLCBzaW5jZSB0aGVyZSBpcyBubyB3YXkgdGhhdCBhIHRocmVhZCBjYW4g
YmUgcGFya2VkCisgICAgLy8gd2hpbGUgdGhlIGNhbGxiYWNrIGlzIHJ1bm5pbmcuCisgICAgV1RG
X0VYUE9SVF9QUklWQVRFIHN0YXRpYyB2b2lkIHVucGFya09uZSgKKyAgICAgICAgY29uc3Qgdm9p
ZCogYWRkcmVzcywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgZGlkVW5wYXJrVGhy
ZWFkLCBib29sIG1heUhhdmVNb3JlVGhyZWFkcyk+IGNhbGxiYWNrKTsKKwogICAgIC8vIFVucGFy
a3MgZXZlcnkgdGhyZWFkIGZyb20gdGhlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4g
YWRkcmVzcywgd2hpY2ggY2Fubm90IGJlIG51bGwuCiAgICAgV1RGX0VYUE9SVF9QUklWQVRFIHN0
YXRpYyB2b2lkIHVucGFya0FsbChjb25zdCB2b2lkKiBhZGRyZXNzKTsKIApJbmRleDogU291cmNl
L1dURi93dGYvV29yZExvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9Xb3JkTG9j
ay5oCShyZXZpc2lvbiAxODgzMjMpCisrKyBTb3VyY2UvV1RGL3d0Zi9Xb3JkTG9jay5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMSw2ICszMSwxMCBAQAogI2luY2x1ZGUgPHd0Zi9Mb2NrZXIuaD4KICNp
bmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KIAorbmFtZXNwYWNlIFRlc3RXZWJLaXRBUEkgewor
c3RydWN0IExvY2tJbnNwZWN0b3I7Cit9OworCiBuYW1lc3BhY2UgV1RGIHsKIAogLy8gQSBXb3Jk
TG9jayBpcyBhIGZ1bGx5IGFkYXB0aXZlIG11dGV4IHRoYXQgdXNlcyBzaXplb2Yodm9pZCopIHN0
b3JhZ2UuIEl0IGhhcyBhIGZhc3QgcGF0aCB0aGF0IGlzCkBAIC03Nyw2ICs4MSw4IEBAIHB1Ymxp
YzoKICAgICB9CiAKIHByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBUZXN0V2ViS2l0QVBJOjpM
b2NrSW5zcGVjdG9yOworICAgIAogICAgIHN0YXRpYyBjb25zdCB1aW50cHRyX3QgaXNMb2NrZWRC
aXQgPSAxOwogICAgIHN0YXRpYyBjb25zdCB1aW50cHRyX3QgaXNRdWV1ZUxvY2tlZEJpdCA9IDI7
CiAgICAgc3RhdGljIGNvbnN0IHVpbnRwdHJfdCBxdWV1ZUhlYWRNYXNrID0gMzsKQEAgLTg0LDYg
KzkwLDEyIEBAIHByaXZhdGU6CiAgICAgV1RGX0VYUE9SVF9QUklWQVRFIHZvaWQgbG9ja1Nsb3co
KTsKICAgICBXVEZfRVhQT1JUX1BSSVZBVEUgdm9pZCB1bmxvY2tTbG93KCk7CiAKKyAgICAvLyBN
ZXRob2QgdXNlZCBmb3IgdGVzdGluZyBvbmx5LgorICAgIGJvb2wgaXNGdWxseVJlc2V0KCkgY29u
c3QKKyAgICB7CisgICAgICAgIHJldHVybiAhbV93b3JkLmxvYWQoKTsKKyAgICB9CisKICAgICBB
dG9taWM8dWludHB0cl90PiBtX3dvcmQ7CiB9OwogCkluZGV4OiBUb29scy9DaGFuZ2VMb2cKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxODgzNTUpCisrKyBUb29scy9D
aGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNyBAQAorMjAxNS0wOC0xMiAgRmls
aXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgorCisgICAgICAgIFdURjo6TG9jayBzaG91bGQg
bm90IHN1ZmZlciBmcm9tIHRoZSB0aHVuZGVyaW5nIGhlcmQKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0Nzk0NworCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCB0ZXN0aW5nIHRoYXQgY2hlY2tzIHRoYXQg
bG9ja3MgcmV0dXJuIHRvIGEgcHJpc3RpbmUgc3RhdGUgYWZ0ZXIgY29udGVudGlvbiBpcyBvdmVy
LgorCisgICAgICAgICogVGVzdFdlYktpdEFQSS9UZXN0cy9XVEYvTG9jay5jcHA6CisgICAgICAg
IChUZXN0V2ViS2l0QVBJOjpMb2NrSW5zcGVjdG9yOjppc0Z1bGx5UmVzZXQpOgorICAgICAgICAo
VGVzdFdlYktpdEFQSTo6cnVuTG9ja1Rlc3QpOgorICAgICAgICAoVGVzdFdlYktpdEFQSTo6VEVT
VCk6CisKIDIwMTUtMDgtMTIgIFNpbW9uIEZyYXNlciAgPHNpbW9uLmZyYXNlckBhcHBsZS5jb20+
CiAKICAgICAgICAgQWRkIGEgdG9vbCB0aGF0IGR1bXBzIGNsYXNzIGFuZCBzdHJ1Y3QgbWVtYmVy
IGxheW91dCwgc2hvd2luZyBwYWRkaW5nCkluZGV4OiBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3Rz
L1dURi9Mb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dU
Ri9Mb2NrLmNwcAkocmV2aXNpb24gMTg4MzIzKQorKysgVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0
cy9XVEYvTG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDYgKzMzLDE0IEBAIHVzaW5nIG5h
bWVzcGFjZSBXVEY7CiAKIG5hbWVzcGFjZSBUZXN0V2ViS2l0QVBJIHsKIAorc3RydWN0IExvY2tJ
bnNwZWN0b3IgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIExvY2tUeXBlPgorICAgIHN0YXRpYyBi
b29sIGlzRnVsbHlSZXNldChMb2NrVHlwZSYgbG9jaykKKyAgICB7CisgICAgICAgIHJldHVybiBs
b2NrLmlzRnVsbHlSZXNldCgpOworICAgIH0KK307CisKIHRlbXBsYXRlPHR5cGVuYW1lIExvY2tU
eXBlPgogdm9pZCBydW5Mb2NrVGVzdCh1bnNpZ25lZCBudW1UaHJlYWRHcm91cHMsIHVuc2lnbmVk
IG51bVRocmVhZHNQZXJHcm91cCwgdW5zaWduZWQgd29ya1BlckNyaXRpY2FsU2VjdGlvbiwgdW5z
aWduZWQgbnVtSXRlcmF0aW9ucykKIHsKQEAgLTY2LDYgKzc0LDE3IEBAIHZvaWQgcnVuTG9ja1Rl
c3QodW5zaWduZWQgbnVtVGhyZWFkR3JvdXAKIAogICAgIGZvciAodW5zaWduZWQgdGhyZWFkR3Jv
dXBJbmRleCA9IG51bVRocmVhZEdyb3VwczsgdGhyZWFkR3JvdXBJbmRleC0tOykKICAgICAgICAg
RVhQRUNUX0VRKGV4cGVjdGVkLCB3b3Jkc1t0aHJlYWRHcm91cEluZGV4XSk7CisKKyAgICAvLyBO
b3cgdGVzdCB0aGF0IHRoZSBsb2NrcyBjb3JyZWN0bHkgcmVzZXQgdGhlbXNlbHZlcy4gV2UgZXhw
ZWN0IHRoYXQgaWYgYSBzaW5nbGUgdGhyZWFkIGxvY2tzCisgICAgLy8gZWFjaCBvZiB0aGUgbG9j
a3MgdHdpY2UgaW4gYSByb3csIHRoZW4gdGhlIGxvY2sgc2hvdWxkIGJlIGluIGEgcHJpc3RpbmUg
c3RhdGUuCisgICAgZm9yICh1bnNpZ25lZCB0aHJlYWRHcm91cEluZGV4ID0gbnVtVGhyZWFkR3Jv
dXBzOyB0aHJlYWRHcm91cEluZGV4LS07KSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDI7
IGktLTspIHsKKyAgICAgICAgICAgIGxvY2tzW3RocmVhZEdyb3VwSW5kZXhdLmxvY2soKTsKKyAg
ICAgICAgICAgIGxvY2tzW3RocmVhZEdyb3VwSW5kZXhdLnVubG9jaygpOworICAgICAgICB9CisK
KyAgICAgICAgRVhQRUNUX0VRKHRydWUsIExvY2tJbnNwZWN0b3I6OmlzRnVsbHlSZXNldChsb2Nr
c1t0aHJlYWRHcm91cEluZGV4XSkpOworICAgIH0KIH0KIAogVEVTVChXVEZfV29yZExvY2ssIFVu
Y29udGVuZGVkU2hvcnRTZWN0aW9uKQpAQCAtMTI4LDYgKzE0NywxMSBAQCBURVNUKFdURl9Mb2Nr
LCBNYW55Q29udGVuZGVkTG9uZ1NlY3Rpb25zCiAgICAgcnVuTG9ja1Rlc3Q8TG9jaz4oMTAsIDEw
LCAxMDAwMCwgMTAwMCk7CiB9CiAKK1RFU1QoV1RGX0xvY2ssIE1hbnlDb250ZW5kZWRMb25nZXJT
ZWN0aW9ucykKK3sKKyAgICBydW5Mb2NrVGVzdDxMb2NrPigxMCwgMTAsIDEwMDAwMCwgMTAwKTsK
K30KKwogVEVTVChXVEZfTG9jaywgU2VjdGlvbkFkZHJlc3NDb2xsaXNpb24pCiB7CiAgICAgcnVu
TG9ja1Rlc3Q8TG9jaz4oNCwgMiwgMTAwMDAsIDIwMDApOwo=
</data>
<flag name="review"
          id="284038"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>258864</attachid>
            <date>2015-08-12 18:11:29 -0700</date>
            <delta_ts>2015-08-12 18:11:29 -0700</delta_ts>
            <desc>patch for landing</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>24436</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxODgzNTUpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDY3IEBACisyMDE1LTA4LTEyICBGaWxpcCBQaXpsbyAgPGZwaXps
b0BhcHBsZS5jb20+CisKKyAgICAgICAgV1RGOjpMb2NrIHNob3VsZCBub3Qgc3VmZmVyIGZyb20g
dGhlIHRodW5kZXJpbmcgaGVyZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTQ3OTQ3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgR2VvZmZyZXkgR2FyZW4u
CisKKyAgICAgICAgVGhpcyBjaGFuZ2VzIExvY2s6OnVubG9ja1Nsb3coKSB0byB1c2UgdW5wYXJr
T25lKCkgaW5zdGVhZCBvZiB1bnBhcmtBbGwoKS4gVGhlIHByb2JsZW0gd2l0aAorICAgICAgICBk
b2luZyB0aGlzIGlzIHRoYXQgaXQncyBub3Qgb2J2aW91cyBhZnRlciBjYWxsaW5nIHVucGFya09u
ZSgpIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgdGhyZWFkcworICAgICAgICB0aGF0IGFyZSBzdGls
bCBwYXJrZWQgb24gdGhlIGxvY2sncyBxdWV1ZS4gSWYgd2UgYXNzdW1lIHRoYXQgdGhlcmUgYXJl
IGFuZCBsZWF2ZSB0aGUKKyAgICAgICAgaGFzUGFya2VkQml0IHNldCwgdGhlbiBmdXR1cmUgY2Fs
bHMgdG8gdW5sb2NrKCkgd2lsbCB0YWtlIHRoZSBzbG93IHBhdGguIFdlIGRvbid0IHdhbnQgdGhh
dAorICAgICAgICBpZiB0aGVyZSBhcmVuJ3QgYWN0dWFsbHkgYW55IHRocmVhZHMgcGFya2VkLiBP
biB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgYXNzdW1lIHRoYXQgdGhlcmUKKyAgICAgICAgYXJlbid0
IGFueSB0aHJlYWRzIHBhcmtlZCBhbmQgY2xlYXIgdGhlIGhhc1BhcmtlZEJpdCwgdGhlbiBpZiB0
aGVyZSBhY3R1YWxseSB3ZXJlIHNvbWUKKyAgICAgICAgdGhyZWFkcyBwYXJrZWQsIHRoZW4gdGhl
eSBtYXkgbmV2ZXIgYmUgYXdva2VuIHNpbmNlIGZ1dHVyZSBjYWxscyB0byB1bmxvY2soKSB3b24n
dCB0YWtlIHNsb3cKKyAgICAgICAgcGF0aCBhbmQgc28gd29uJ3QgY2FsbCB1bnBhcmtPbmUoKS4g
SW4gb3RoZXIgd29yZHMsIHdlIG5lZWQgYSB3YXkgdG8gYmUgdmVyeSBwcmVjaXNlIGFib3V0Cisg
ICAgICAgIHdoZW4gd2UgY2xlYXIgdGhlIGhhc1BhcmtlZEJpdCBhbmQgd2UgbmVlZCB0byBkbyBp
dCBpbiBhIHJhY2UtZnJlZSB3YXk6IGl0IGNhbid0IGJlIHRoZSBjYXNlCisgICAgICAgIHRoYXQg
d2UgY2xlYXIgdGhlIGJpdCBqdXN0IGFzIHNvbWUgdGhyZWFkIGdldHMgcGFya2VkIG9uIHRoZSBx
dWV1ZS4KKworICAgICAgICBBIHNpbWlsYXIgcHJvYmxlbSBhcmlzZXMgaW4gZnV0ZXhlcywgYW5k
IG9uZSBvZiB0aGUgc29sdXRpb25zIGlzIHRvIGhhdmUgYSB0aHJlYWQgdGhhdAorICAgICAgICBh
Y3F1aXJlcyBhIGxvY2sgYWZ0ZXIgcGFya2luZyBzZXRzIHRoZSBoYXNQYXJrZWRCaXQuIFRoaXMg
aXMgd2hhdCBSdXN0eSBSdXNzZWwncyB1c2Vyc2VtCisgICAgICAgIGRvZXMuIEl0J3MgYSBzdWJ0
bGUgYWxnb3JpdGhtLiBBbHNvLCBpdCBtZWFucyB0aGF0IGlmIGEgdGhyZWFkIGJhcmdlcyBpbiBi
ZWZvcmUgdGhlIHVucGFya2VkCisgICAgICAgIHRocmVhZCBydW5zLCB0aGVuIHRoYXQgYmFyZ2lu
ZyB0aHJlYWQgd2lsbCBub3Qga25vdyB0aGF0IHRoZXJlIGFyZSB0aHJlYWRzIHBhcmtlZC4gVGhp
cworICAgICAgICBjb3VsZCBpbmNyZWFzZSB0aGUgc2V2ZXJpdHkgb2YgYmFyZ2luZy4KKworICAg
ICAgICBTaW5jZSBQYXJraW5nTG90IGlzIGEgdXNlci1sZXZlbCBBUEksIHdlIGRvbid0IGhhdmUg
dG8gd29ycnkgYWJvdXQgdGhlIGtlcm5lbC11c2VyIHNlY3VyaXR5CisgICAgICAgIGlzc3VlcyBh
bmQgc28gd2UgY2FuIGV4cG9zZSBjYWxsYmFja3Mgd2hpbGUgUGFya2luZ0xvdCBpcyBob2xkaW5n
IGl0cyBpbnRlcm5hbCBsb2Nrcy4gVGhpcworICAgICAgICBjaGFuZ2UgZG9lcyBleGFjdGx5IHRo
YXQgZm9yIHVucGFya09uZSgpLiBUaGUgbmV3IHZhcmlhbnQgb2YgdW5wYXJrT25lKCkgd2lsbCBj
YWxsIGEgdXNlcgorICAgICAgICBmdW5jdGlvbiB3aGlsZSB0aGUgcXVldWUgZnJvbSB3aGljaCB3
ZSBhcmUgdW5wYXJraW5nIGlzIGxvY2tlZC4gVGhlIGNhbGxiYWNrIGlzIHRvbGQgYmFzaWMKKyAg
ICAgICAgc3RhdHMgYWJvdXQgdGhlIHF1ZXVlOiBkaWQgd2UgdW5wYXJrIGEgdGhyZWFkIHRoaXMg
dGltZSwgYW5kIGNvdWxkIHRoZXJlIGJlIG1vcmUgdGhyZWFkcyB0bworICAgICAgICB1bnBhcmsg
aW4gdGhlIGZ1dHVyZS4gVGhlIGNhbGxiYWNrIHJ1bnMgd2hpbGUgaXQncyBpbXBvc3NpYmxlIGZv
ciB0aGUgcXVldWUgc3RhdGUgdG8gY2hhbmdlLAorICAgICAgICBzaW5jZSB0aGUgUGFya2luZ0xv
dCdzIGludGVybmFsIGxvY2tzIGZvciB0aGUgcXVldWUgaXMgaGVsZC4gVGhpcyBtZWFucyB0aGF0
CisgICAgICAgIExvY2s6OnVubG9ja1Nsb3coKSBjYW4gZWl0aGVyIGNsZWFyLCBvciBsZWF2ZSwg
dGhlIGhhc1BhcmtlZEJpdCB3aGlsZSByZWxlYXNpbmcgdGhlIGxvY2sKKyAgICAgICAgaW5zaWRl
IHRoZSBjYWxsYmFjayBmcm9tIHVucGFya09uZSgpLiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIHRo
dW5kZXJpbmcgaGVyZCBwcm9ibGVtIHdoaWxlCisgICAgICAgIGFsc28gcmVkdWNpbmcgdGhlIGdy
ZWVkIHRoYXQgYXJpc2VzIGZyb20gYmFyZ2luZyB0aHJlYWRzLgorCisgICAgICAgIFRoaXMgcmVx
dWlyZWQgc29tZSBjYXJlZnVsIHJld29ya2luZyBvZiB0aGUgUGFya2luZ0xvdCBhbGdvcml0aG0u
IFRoZSBmaXJzdCB0aGluZyBJIG5vdGljZWQKKyAgICAgICAgd2FzIHRoYXQgdGhlIFRocmVhZERh
dGE6OnNob3VsZFBhcmsgZmxhZyB3YXMgdXNlbGVzcywgc2luY2UgaXQncyBzZXQgZXhhY3RseSB3
aGVuCisgICAgICAgIFRocmVhZERhdGE6OmFkZHJlc3MgaXMgbm9uLW51bGwuIFRoZW4gSSBoYWQg
dG8gbWFrZSBzdXJlIHRoYXQgZGVxdWV1ZSgpIGNvdWxkIGxhemlseSBjcmVhdGUKKyAgICAgICAg
Ym90aCBoYXNodGFibGVzIGFuZCBidWNrZXRzLCBzaW5jZSB0aGUgImNhbGxiYWNrIGlzIGNhbGxl
ZCB3aGlsZSBxdWV1ZSBpcyBsb2NrZWQiIGludmFyaWFudAorICAgICAgICByZXF1aXJlcyB0aGF0
IHdlIGRpZG4ndCBleGl0IGVhcmx5IGR1ZSB0byB0aGUgaGFzaHRhYmxlIG9yIGJ1Y2tldCBub3Qg
YmVpbmcgcHJlc2VudC4gTm90ZQorICAgICAgICB0aGF0IGFsbCBvZiB0aGlzIGlzIGRvbmUgaW4g
c3VjaCBhIHdheSB0aGF0IHRoZSBvbGQgdW5wYXJrT25lKCkgYW5kIHVucGFya0FsbCgpIGRvbid0
IGhhdmUKKyAgICAgICAgdG8gY3JlYXRlIGFueSBidWNrZXRzLCB0aG91Z2ggdGhleSBub3cgbWF5
IGNyZWF0ZSB0aGUgaGFzaHRhYmxlLiBXZSBkb24ndCBjYXJlIGFzIG11Y2ggYWJvdXQKKyAgICAg
ICAgdGhlIGhhc2h0YWJsZSBiZWluZyBjcmVhdGVkIGJ5IHVucGFyayBzaW5jZSBpdCdzIGp1c3Qg
c3VjaCBhbiB1bmxpa2VseSBzY2VuYXJpbyBhbmQgaXQgd291bGQKKyAgICAgICAgb25seSBoYXBw
ZW4gb25jZS4KKworICAgICAgICBUaGlzIGNoYW5nZSByZWR1Y2VzIHRoZSBrZXJuZWwgQ1BVIHVz
YWdlIG9mIFdURjo6TG9jayBmb3IgdGhlIGxvbmcgY3JpdGljYWwgc2VjdGlvbiB0ZXN0IGJ5Cisg
ICAgICAgIGFib3V0IDh4IGFuZCBtYWtlcyBpdCBhbHdheXMgcGVyZm9ybSBhcyB3ZWxsIGFzIFdU
Rjo6V29yZExvY2sgYW5kIFdURjo6TXV0ZXggZm9yIHRoYXQKKyAgICAgICAgYmVuY2htYXJrLgor
CisgICAgICAgICogYmVuY2htYXJrcy9Mb2NrU3BlZWRUZXN0LmNwcDoKKyAgICAgICAgKiB3dGYv
TG9jay5jcHA6CisgICAgICAgIChXVEY6OkxvY2tCYXNlOjp1bmxvY2tTbG93KToKKyAgICAgICAg
KiB3dGYvTG9jay5oOgorICAgICAgICAoV1RGOjpMb2NrQmFzZTo6aXNMb2NrZWQpOgorICAgICAg
ICAoV1RGOjpMb2NrQmFzZTo6aXNGdWxseVJlc2V0KToKKyAgICAgICAgKiB3dGYvUGFya2luZ0xv
dC5jcHA6CisgICAgICAgIChXVEY6OlBhcmtpbmdMb3Q6OnBhcmtDb25kaXRpb25hbGx5KToKKyAg
ICAgICAgKFdURjo6UGFya2luZ0xvdDo6dW5wYXJrT25lKToKKyAgICAgICAgKFdURjo6UGFya2lu
Z0xvdDo6dW5wYXJrQWxsKToKKyAgICAgICAgKiB3dGYvUGFya2luZ0xvdC5oOgorICAgICAgICAq
IHd0Zi9Xb3JkTG9jay5oOgorICAgICAgICAoV1RGOjpXb3JkTG9jazo6aXNMb2NrZWQpOgorICAg
ICAgICAoV1RGOjpXb3JkTG9jazo6aXNGdWxseVJlc2V0KToKKwogMjAxNS0wOC0xMSAgRmlsaXAg
UGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAgIEFsd2F5cyB1c2UgYSBieXRlLXNp
emVkIGxvY2sgaW1wbGVtZW50YXRpb24KSW5kZXg6IFNvdXJjZS9XVEYvYmVuY2htYXJrcy9Mb2Nr
U3BlZWRUZXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL2JlbmNobWFya3MvTG9ja1Nw
ZWVkVGVzdC5jcHAJKHJldmlzaW9uIDE4ODMyMykKKysrIFNvdXJjZS9XVEYvYmVuY2htYXJrcy9M
b2NrU3BlZWRUZXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNyArNDQsNyBAQCB1bnNpZ25l
ZCBudW1JdGVyYXRpb25zOwogICAgIAogTk9fUkVUVVJOIHZvaWQgdXNhZ2UoKQogewotICAgIHBy
aW50ZigiVXNhZ2U6IExvY2tTcGVlZFRlc3Qgc3BpbmxvY2t8d29yZGxvY2t8bG9ja3xieXRlbG9j
a3xtdXRleHxhbGwgPG51bSB0aHJlYWQgZ3JvdXBzPiA8bnVtIHRocmVhZHMgcGVyIGdyb3VwPiA8
d29yayBwZXIgY3JpdGljYWwgc2VjdGlvbj4gPG51bSBub2lzZSB0aHJlYWRzPiA8bnVtIGl0ZXJh
dGlvbnM+XG4iKTsKKyAgICBwcmludGYoIlVzYWdlOiBMb2NrU3BlZWRUZXN0IHNwaW5sb2NrfHdv
cmRsb2NrfGxvY2t8bXV0ZXh8YWxsIDxudW0gdGhyZWFkIGdyb3Vwcz4gPG51bSB0aHJlYWRzIHBl
ciBncm91cD4gPHdvcmsgcGVyIGNyaXRpY2FsIHNlY3Rpb24+IDxudW0gbm9pc2UgdGhyZWFkcz4g
PG51bSBpdGVyYXRpb25zPlxuIik7CiAgICAgZXhpdCgxKTsKIH0KIApJbmRleDogU291cmNlL1dU
Ri93dGYvTG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvTG9jay5jcHAJKHJl
dmlzaW9uIDE4ODMyMykKKysrIFNvdXJjZS9XVEYvd3RmL0xvY2suY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC02OSwzNyArNjksNDMgQEAgdm9pZCBMb2NrQmFzZTo6bG9ja1Nsb3coKQogICAgICAgICAv
LyBXZSBub3cgZXhwZWN0IHRoZSB2YWx1ZSB0byBiZSBpc0hlbGR8aGFzUGFya2VkLiBTbyBsb25n
IGFzIHRoYXQncyB0aGUgY2FzZSwgd2UgY2FuIHBhcmsuCiAgICAgICAgIFBhcmtpbmdMb3Q6OmNv
bXBhcmVBbmRQYXJrKCZtX2J5dGUsIGlzSGVsZEJpdCB8IGhhc1BhcmtlZEJpdCk7CiAKLSAgICAg
ICAgLy8gV2UgaGF2ZSBhd2FrZW4sIG9yIHdlIG5ldmVyIHBhcmtlZCBiZWNhdXNlIHRoZSBieXRl
IHZhbHVlIGNoYW5nZWQuIEVpdGhlciB3YXksIHdlIGxvb3AKKyAgICAgICAgLy8gV2UgaGF2ZSBh
d29rZW4sIG9yIHdlIG5ldmVyIHBhcmtlZCBiZWNhdXNlIHRoZSBieXRlIHZhbHVlIGNoYW5nZWQu
IEVpdGhlciB3YXksIHdlIGxvb3AKICAgICAgICAgLy8gYXJvdW5kIGFuZCB0cnkgYWdhaW4uCiAg
ICAgfQogfQogCiB2b2lkIExvY2tCYXNlOjp1bmxvY2tTbG93KCkKIHsKLSAgICAvLyBSZWxlYXNl
IHRoZSBsb2NrIHdoaWxlIGZpbmRpbmcgb3V0IGlmIHNvbWVvbmUgaXMgcGFya2VkLiBOb3RlIHRo
YXQgYXMgc29vbiBhcyB3ZSBkbyB0aGlzLAotICAgIC8vIHNvbWVvbmUgbWlnaHQgYmFyZ2UgaW4u
Ci0gICAgdWludDhfdCBvbGRCeXRlVmFsdWU7CisgICAgLy8gV2UgY291bGQgZ2V0IGhlcmUgYmVj
YXVzZSB0aGUgd2VhayBDQVMgaW4gdW5sb2NrKCkgZmFpbGVkIHNwdXJpb3VzbHksIG9yIGJlY2F1
c2UgdGhlcmUgaXMKKyAgICAvLyBzb21lb25lIHBhcmtlZC4gU28sIHdlIG5lZWQgYSBDQVMgbG9v
cDogZXZlbiBpZiByaWdodCBub3cgdGhlIGxvY2sgaXMganVzdCBoZWxkLCBpdCBjb3VsZAorICAg
IC8vIGJlIGhlbGQgYW5kIHBhcmtlZCBpZiBzb21lb25lIGF0dGVtcHRzIHRvIGxvY2sganVzdCBh
cyB3ZSBhcmUgdW5sb2NraW5nLgogICAgIGZvciAoOzspIHsKLSAgICAgICAgb2xkQnl0ZVZhbHVl
ID0gbV9ieXRlLmxvYWQoKTsKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRh
TG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogdW5sb2NraW5nIHdpdGggIiwgb2xkQnl0
ZVZhbHVlLCAiXG4iKSk7Ci0gICAgICAgIEFTU0VSVChvbGRCeXRlVmFsdWUgJiBpc0hlbGRCaXQp
OwotICAgICAgICBpZiAobV9ieXRlLmNvbXBhcmVFeGNoYW5nZVdlYWsob2xkQnl0ZVZhbHVlLCAw
KSkKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICB1aW50OF90IG9sZEJ5dGVWYWx1ZSA9IG1f
Ynl0ZS5sb2FkKCk7CisgICAgICAgIEFTU0VSVChvbGRCeXRlVmFsdWUgPT0gaXNIZWxkQml0IHx8
IG9sZEJ5dGVWYWx1ZSA9PSAoaXNIZWxkQml0IHwgaGFzUGFya2VkQml0KSk7CisgICAgICAgIAor
ICAgICAgICBpZiAob2xkQnl0ZVZhbHVlID09IGlzSGVsZEJpdCkgeworICAgICAgICAgICAgaWYg
KG1fYnl0ZS5jb21wYXJlRXhjaGFuZ2VXZWFrKGlzSGVsZEJpdCwgMCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAv
LyBTb21lb25lIGlzIHBhcmtlZC4gVW5wYXJrIGV4YWN0bHkgb25lIHRocmVhZCwgcG9zc2libHkg
bGVhdmluZyB0aGUgcGFya2VkIGJpdCBzZXQgaWYKKyAgICAgICAgLy8gdGhlcmUgaXMgYSBjaGFu
Y2UgdGhhdCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdGhyZWFkcyBwYXJrZWQuCisgICAgICAgIEFT
U0VSVChvbGRCeXRlVmFsdWUgPT0gKGlzSGVsZEJpdCB8IGhhc1BhcmtlZEJpdCkpOworICAgICAg
ICBQYXJraW5nTG90Ojp1bnBhcmtPbmUoCisgICAgICAgICAgICAmbV9ieXRlLAorICAgICAgICAg
ICAgW3RoaXNdIChib29sLCBib29sIG1heUhhdmVNb3JlVGhyZWFkcykgeworICAgICAgICAgICAg
ICAgIC8vIFdlIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgY2FuIGNsZWFyIGVpdGhlciB0aGUgaXNI
ZWxkQml0IG9yIHRoZSBoYXNQYXJrZWRCaXQsCisgICAgICAgICAgICAgICAgLy8gc28gd2Ugc2hv
dWxkIHN0aWxsIHNlZSBib3RoIGJpdHMgc2V0IHJpZ2h0IG5vdy4KKyAgICAgICAgICAgICAgICBB
U1NFUlQobV9ieXRlLmxvYWQoKSA9PSAoaXNIZWxkQml0IHwgaGFzUGFya2VkQml0KSk7CisKKyAg
ICAgICAgICAgICAgICBpZiAobWF5SGF2ZU1vcmVUaHJlYWRzKQorICAgICAgICAgICAgICAgICAg
ICBtX2J5dGUuc3RvcmUoaGFzUGFya2VkQml0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgIG1fYnl0ZS5zdG9yZSgwKTsKKyAgICAgICAgICAgIH0pOworICAgICAg
ICByZXR1cm47CiAgICAgfQotCi0gICAgLy8gTm90ZSB0aGF0IHNvbWVvbmUgY291bGQgdHJ5IHRv
IHBhcmsgcmlnaHQgbm93LiBJZiB0aGF0IGhhcHBlbnMsIHRoZXkgd2lsbCByZXR1cm4gaW1tZWRp
YXRlbHkKLSAgICAvLyBiZWNhdXNlIG91ciBwYXJraW5nIHByZWRpY2F0ZSBpcyB0aGF0IG1fYnl0
ZSA9PSBpc0hlbGRCaXQgfCBoYXNQYXJrZWRCaXQsIGJ1dCB3ZSd2ZSBhbHJlYWR5IHNldAotICAg
IC8vIG1fYnl0ZSA9IDAuCi0KLSAgICAvLyBJZiB0aGVyZSBoYWQgYmVlbiB0aHJlYWRzIHBhcmtl
ZCwgdW5wYXJrIGFsbCBvZiB0aGVtLiBUaGlzIGNhdXNlcyBhIHRodW5kZXJpbmcgaGVyZCwgYnV0
IHdoaWxlCi0gICAgLy8gdGhhdCBpcyB0aGVvcmV0aWNhbGx5IHNjYXJ5LCBpdCdzIHRvdGFsbHkg
ZmluZSBpbiBXZWJLaXQgYmVjYXVzZSB3ZSB1c3VhbGx5IGRvbid0IGhhdmUgZW5vdWdoCi0gICAg
Ly8gdGhyZWFkcyBmb3IgdGhpcyB0byBtYXR0ZXIuCi0gICAgLy8gRklYTUU6IFdlIGRvbid0IHJl
YWxseSBuZWVkIHRoaXMgdG8gZXhoaWJpdCB0aHVuZGVyaW5nIGhlcmQuIFdlIGNvdWxkIHVzZSB1
bnBhcmtPbmUoKSwgYW5kIGlmCi0gICAgLy8gdGhhdCByZXR1cm5zIHRydWUsIGp1c3Qgc2V0IHRo
ZSBwYXJrZWQgYml0IGFnYWluLiBJZiBpbiB0aGUgcHJvY2VzcyBvZiBzZXR0aW5nIHRoZSBwYXJr
ZWQgYml0Ci0gICAgLy8gd2UgZmFpbCB0aGUgQ0FTLCB0aGVuIGp1c3QgdW5wYXJrIGFnYWluLgot
ICAgIGlmIChvbGRCeXRlVmFsdWUgJiBoYXNQYXJrZWRCaXQpCi0gICAgICAgIFBhcmtpbmdMb3Q6
OnVucGFya0FsbCgmbV9ieXRlKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV1RGCkluZGV4OiBTb3Vy
Y2UvV1RGL3d0Zi9Mb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvTG9jay5oCShy
ZXZpc2lvbiAxODgzMjMpCisrKyBTb3VyY2UvV1RGL3d0Zi9Mb2NrLmgJKHdvcmtpbmcgY29weSkK
QEAgLTMxLDYgKzMxLDEwIEBACiAjaW5jbHVkZSA8d3RmL0xvY2tlci5oPgogI2luY2x1ZGUgPHd0
Zi9Ob25jb3B5YWJsZS5oPgogCituYW1lc3BhY2UgVGVzdFdlYktpdEFQSSB7CitzdHJ1Y3QgTG9j
a0luc3BlY3RvcjsKK307CisKIG5hbWVzcGFjZSBXVEYgewogCiAvLyBUaGlzIGlzIGEgZnVsbHkg
YWRhcHRpdmUgbXV0ZXggdGhhdCBvbmx5IHJlcXVpcmVzIDEgYnl0ZSBvZiBzdG9yYWdlLiBJdCBo
YXMgZmFzdCBwYXRocyB0aGF0IGFyZQpAQCAtNzMsMTIgKzc3LDIwIEBAIHN0cnVjdCBMb2NrQmFz
ZSB7CiAgICAgfQogCiBwcm90ZWN0ZWQ6CisgICAgZnJpZW5kIHN0cnVjdCBUZXN0V2ViS2l0QVBJ
OjpMb2NrSW5zcGVjdG9yOworICAgIAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGlzSGVsZEJp
dCA9IDE7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaGFzUGFya2VkQml0ID0gMjsKIAogICAg
IFdURl9FWFBPUlRfUFJJVkFURSB2b2lkIGxvY2tTbG93KCk7CiAgICAgV1RGX0VYUE9SVF9QUklW
QVRFIHZvaWQgdW5sb2NrU2xvdygpOwogCisgICAgLy8gTWV0aG9kIHVzZWQgZm9yIHRlc3Rpbmcg
b25seS4KKyAgICBib29sIGlzRnVsbHlSZXNldCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gIW1fYnl0ZS5sb2FkKCk7CisgICAgfQorCiAgICAgQXRvbWljPHVpbnQ4X3Q+IG1fYnl0ZTsK
IH07CiAKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL1BhcmtpbmdMb3QuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XVEYvd3RmL1BhcmtpbmdMb3QuY3BwCShyZXZpc2lvbiAxODgzMjMpCisrKyBTb3Vy
Y2UvV1RGL3d0Zi9QYXJraW5nTG90LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTIsMTEgKzUyLDEx
IEBAIHB1YmxpYzoKIAogICAgIFRocmVhZElkZW50aWZpZXIgdGhyZWFkSWRlbnRpZmllcjsKICAg
ICAKLSAgICBib29sIHNob3VsZFBhcmsgeyBmYWxzZSB9OwogICAgIHN0ZDo6bXV0ZXggcGFya2lu
Z0xvY2s7CiAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgcGFya2luZ0NvbmRpdGlvbjsKIAot
ICAgIGNvbnN0IHZvaWQqIGFkZHJlc3M7CisgICAgY29uc3Qgdm9pZCogYWRkcmVzcyB7IG51bGxw
dHIgfTsKKyAgICAKICAgICBUaHJlYWREYXRhKiBuZXh0SW5RdWV1ZSB7IG51bGxwdHIgfTsKIH07
CiAKQEAgLTIxMiwyNSArMjEyLDM2IEBAIHVuc2lnbmVkIGhhc2hBZGRyZXNzKGNvbnN0IHZvaWQq
IGFkZHJlc3MKICAgICByZXR1cm4gV1RGOjpQdHJIYXNoPGNvbnN0IHZvaWQqPjo6aGFzaChhZGRy
ZXNzKTsKIH0KIAotLy8gTG9ja3MgdGhlIGhhc2h0YWJsZS4gVGhpcyByZWxvb3BzIGluIGNhc2Ug
b2YgcmVoYXNoaW5nLCBzbyB0aGUgY3VycmVudCBoYXNodGFibGUgbWF5IGJlIGRpZmZlcmVudAot
Ly8gYWZ0ZXIgdGhpcyByZXR1cm5zIHRoYW4gd2hlbiB5b3UgY2FsbGVkIGl0LiBHdWFyYW50ZWVz
IHRoYXQgdGhlcmUgaXMgYSBoYXNodGFibGUuIFRoaXMgaXMgcHJldHR5Ci0vLyBzbG93IGFuZCBu
b3Qgc2NhbGFibGUsIHNvIGl0J3Mgb25seSB1c2VkIGR1cmluZyB0aHJlYWQgY3JlYXRpb24gYW5k
IGZvciBkZWJ1Z2dpbmcvdGVzdGluZy4KLVZlY3RvcjxCdWNrZXQqPiBsb2NrSGFzaHRhYmxlKCkK
K0hhc2h0YWJsZSogZW5zdXJlSGFzaHRhYmxlKCkKIHsKICAgICBmb3IgKDs7KSB7Ci0gICAgICAg
IEhhc2h0YWJsZSogY3VycmVudEhhc2h0YWJsZTsKKyAgICAgICAgSGFzaHRhYmxlKiBjdXJyZW50
SGFzaHRhYmxlID0gaGFzaHRhYmxlLmxvYWQoKTsKKworICAgICAgICBpZiAoY3VycmVudEhhc2h0
YWJsZSkKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50SGFzaHRhYmxlOwogCi0gICAgICAgIGN1
cnJlbnRIYXNodGFibGUgPSBoYXNodGFibGUubG9hZCgpOwogICAgICAgICBpZiAoIWN1cnJlbnRI
YXNodGFibGUpIHsKLSAgICAgICAgICAgIC8vIFRyeSB0byBiZSB0aGUgZmlyc3QgdG8gY3JlYXRl
IHRoZSBoYXNodGFibGUuCiAgICAgICAgICAgICBjdXJyZW50SGFzaHRhYmxlID0gSGFzaHRhYmxl
OjpjcmVhdGUobWF4TG9hZEZhY3Rvcik7Ci0gICAgICAgICAgICBpZiAoIWhhc2h0YWJsZS5jb21w
YXJlRXhjaGFuZ2VXZWFrKG51bGxwdHIsIGN1cnJlbnRIYXNodGFibGUpKSB7Ci0gICAgICAgICAg
ICAgICAgSGFzaHRhYmxlOjpkZXN0cm95KGN1cnJlbnRIYXNodGFibGUpOwotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGhhc2h0YWJsZS5jb21wYXJlRXhjaGFuZ2VX
ZWFrKG51bGxwdHIsIGN1cnJlbnRIYXNodGFibGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZl
cmJvc2UpCisgICAgICAgICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVh
ZCgpLCAiOiBjcmVhdGVkIGluaXRpYWwgaGFzaHRhYmxlICIsIFJhd1BvaW50ZXIoY3VycmVudEhh
c2h0YWJsZSksICJcbiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEhhc2h0YWJs
ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAg
ICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBjcmVhdGVkIGluaXRpYWwg
aGFzaHRhYmxlICIsIFJhd1BvaW50ZXIoY3VycmVudEhhc2h0YWJsZSksICJcbiIpKTsKKworICAg
ICAgICAgICAgSGFzaHRhYmxlOjpkZXN0cm95KGN1cnJlbnRIYXNodGFibGUpOwogICAgICAgICB9
CisgICAgfQorfQorCisvLyBMb2NrcyB0aGUgaGFzaHRhYmxlLiBUaGlzIHJlbG9vcHMgaW4gY2Fz
ZSBvZiByZWhhc2hpbmcsIHNvIHRoZSBjdXJyZW50IGhhc2h0YWJsZSBtYXkgYmUgZGlmZmVyZW50
CisvLyBhZnRlciB0aGlzIHJldHVybnMgdGhhbiB3aGVuIHlvdSBjYWxsZWQgaXQuIEd1YXJhbnRl
ZXMgdGhhdCB0aGVyZSBpcyBhIGhhc2h0YWJsZS4gVGhpcyBpcyBwcmV0dHkKKy8vIHNsb3cgYW5k
IG5vdCBzY2FsYWJsZSwgc28gaXQncyBvbmx5IHVzZWQgZHVyaW5nIHRocmVhZCBjcmVhdGlvbiBh
bmQgZm9yIGRlYnVnZ2luZy90ZXN0aW5nLgorVmVjdG9yPEJ1Y2tldCo+IGxvY2tIYXNodGFibGUo
KQoreworICAgIGZvciAoOzspIHsKKyAgICAgICAgSGFzaHRhYmxlKiBjdXJyZW50SGFzaHRhYmxl
ID0gZW5zdXJlSGFzaHRhYmxlKCk7CisKKyAgICAgICAgQVNTRVJUKGN1cnJlbnRIYXNodGFibGUp
OwogCiAgICAgICAgIC8vIE5vdyBmaW5kIGFsbCBvZiB0aGUgYnVja2V0cy4gVGhpcyBtYWtlcyBz
dXJlIHRoYXQgdGhlIGhhc2h0YWJsZSBpcyBmdWxsIG9mIGJ1Y2tldHMgc28gdGhhdAogICAgICAg
ICAvLyB3ZSBjYW4gbG9jayBhbGwgb2YgdGhlIGJ1Y2tldHMsIG5vdCBqdXN0IHRoZSBvbmVzIHRo
YXQgYXJlIG1hdGVyaWFsaXplZC4KQEAgLTQwNSw3ICs0MTYsNyBAQCBib29sIGVucXVldWUoY29u
c3Qgdm9pZCogYWRkcmVzcywgY29uc3QgCiAgICAgdW5zaWduZWQgaGFzaCA9IGhhc2hBZGRyZXNz
KGFkZHJlc3MpOwogCiAgICAgZm9yICg7OykgewotICAgICAgICBIYXNodGFibGUqIG15SGFzaHRh
YmxlID0gaGFzaHRhYmxlLmxvYWQoKTsKKyAgICAgICAgSGFzaHRhYmxlKiBteUhhc2h0YWJsZSA9
IGVuc3VyZUhhc2h0YWJsZSgpOwogICAgICAgICB1bnNpZ25lZCBpbmRleCA9IGhhc2ggJSBteUhh
c2h0YWJsZS0+c2l6ZTsKICAgICAgICAgQXRvbWljPEJ1Y2tldCo+JiBidWNrZXRQb2ludGVyID0g
bXlIYXNodGFibGUtPmRhdGFbaW5kZXhdOwogICAgICAgICBCdWNrZXQqIGJ1Y2tldDsKQEAgLTQ0
NCw1MCArNDU1LDUxIEBAIGJvb2wgZW5xdWV1ZShjb25zdCB2b2lkKiBhZGRyZXNzLCBjb25zdCAK
ICAgICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+Ci1ib29sIGRlcXVldWUoY29u
c3Qgdm9pZCogYWRkcmVzcywgY29uc3QgRnVuY3RvciYgZnVuY3RvcikKK2VudW0gY2xhc3MgQnVj
a2V0TW9kZSB7CisgICAgRW5zdXJlTm9uRW1wdHksCisgICAgSWdub3JlRW1wdHkKK307CisKK3Rl
bXBsYXRlPHR5cGVuYW1lIERlcXVldWVGdW5jdG9yLCB0eXBlbmFtZSBGaW5pc2hGdW5jdG9yPgor
Ym9vbCBkZXF1ZXVlKAorICAgIGNvbnN0IHZvaWQqIGFkZHJlc3MsIEJ1Y2tldE1vZGUgYnVja2V0
TW9kZSwgY29uc3QgRGVxdWV1ZUZ1bmN0b3ImIGRlcXVldWVGdW5jdG9yLAorICAgIGNvbnN0IEZp
bmlzaEZ1bmN0b3ImIGZpbmlzaEZ1bmN0b3IpCiB7Ci0gICAgaWYgKHZlcmJvc2UpCi0gICAgICAg
IGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiBkZXF1ZXVlaW5nIGFkZHJlc3Mg
IiwgUmF3UG9pbnRlcihhZGRyZXNzKSwgIlxuIikpOwogICAgIHVuc2lnbmVkIGhhc2ggPSBoYXNo
QWRkcmVzcyhhZGRyZXNzKTsKLSAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgZGF0YUxvZyh0b1N0
cmluZyhjdXJyZW50VGhyZWFkKCksICI6IGhhc2ggPSAiLCBoYXNoLCAiXG4iKSk7CiAKICAgICBm
b3IgKDs7KSB7Ci0gICAgICAgIEhhc2h0YWJsZSogbXlIYXNodGFibGUgPSBoYXNodGFibGUubG9h
ZCgpOwotICAgICAgICBpZiAoIW15SGFzaHRhYmxlKSB7Ci0gICAgICAgICAgICBpZiAodmVyYm9z
ZSkKLSAgICAgICAgICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjog
bm8gaGFzaHRhYmxlLlxuIikpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9
CisgICAgICAgIEhhc2h0YWJsZSogbXlIYXNodGFibGUgPSBlbnN1cmVIYXNodGFibGUoKTsKICAg
ICAgICAgdW5zaWduZWQgaW5kZXggPSBoYXNoICUgbXlIYXNodGFibGUtPnNpemU7Ci0gICAgICAg
IGlmICh2ZXJib3NlKQotICAgICAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFk
KCksICI6IGluZGV4ID0gIiwgaW5kZXgsICJcbiIpKTsKLSAgICAgICAgQnVja2V0KiBidWNrZXQg
PSBteUhhc2h0YWJsZS0+ZGF0YVtpbmRleF0ubG9hZCgpOworICAgICAgICBBdG9taWM8QnVja2V0
Kj4mIGJ1Y2tldFBvaW50ZXIgPSBteUhhc2h0YWJsZS0+ZGF0YVtpbmRleF07CisgICAgICAgIEJ1
Y2tldCogYnVja2V0ID0gYnVja2V0UG9pbnRlci5sb2FkKCk7CiAgICAgICAgIGlmICghYnVja2V0
KSB7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICBkYXRhTG9nKHRv
U3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogbm8gYnVja2V0IGF0ICIsIFJhd1BvaW50ZXIoYnVj
a2V0KSwgIi5cbiIpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlm
IChidWNrZXRNb2RlID09IEJ1Y2tldE1vZGU6Oklnbm9yZUVtcHR5KQorICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAg
IGJ1Y2tldCA9IGJ1Y2tldFBvaW50ZXIubG9hZCgpOworICAgICAgICAgICAgICAgIGlmICghYnVj
a2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCA9IG5ldyBCdWNrZXQoKTsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKCFidWNrZXRQb2ludGVyLmNvbXBhcmVFeGNoYW5nZVdlYWsobnVs
bHB0ciwgYnVja2V0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGJ1Y2tldDsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
fQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9n
KHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogbG9ja2luZyBidWNrZXQgYXQgIiwgUmF3UG9p
bnRlcihidWNrZXQpLCAiXG4iKSk7CiAgICAgICAgIGJ1Y2tldC0+bG9jay5sb2NrKCk7Ci0gICAg
ICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhy
ZWFkKCksICI6IGxvY2tlZCBidWNrZXQgYXQgIiwgUmF3UG9pbnRlcihidWNrZXQpLCAiXG4iKSk7
CiAKICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgaGFzaHRhYmxlIGNvdWxkIGhhdmUgcmVo
YXNoZWQgdW5kZXIgdXMuCiAgICAgICAgIGlmIChoYXNodGFibGUubG9hZCgpICE9IG15SGFzaHRh
YmxlKSB7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICBkYXRhTG9n
KHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjogaGFzaHRhYmxlIGNoYW5nZWQuXG4iKSk7CiAg
ICAgICAgICAgICBidWNrZXQtPmxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBjb250aW51ZTsK
ICAgICAgICAgfQogCi0gICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgZGF0YUxvZyh0
b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6IGZvdW5kIGJ1Y2tldC5cbiIpKTsKLSAgICAgICAg
YnVja2V0LT5nZW5lcmljRGVxdWV1ZShmdW5jdG9yKTsKKyAgICAgICAgYnVja2V0LT5nZW5lcmlj
RGVxdWV1ZShkZXF1ZXVlRnVuY3Rvcik7CiAgICAgICAgIGJvb2wgcmVzdWx0ID0gISFidWNrZXQt
PnF1ZXVlSGVhZDsKKyAgICAgICAgZmluaXNoRnVuY3RvcihyZXN1bHQpOwogICAgICAgICBidWNr
ZXQtPmxvY2sudW5sb2NrKCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNTAy
LDggKzUxNCw2IEBAIGJvb2wgUGFya2luZ0xvdDo6cGFya0NvbmRpdGlvbmFsbHkoY29uc3QKICAg
ICAKICAgICBUaHJlYWREYXRhKiBtZSA9IG15VGhyZWFkRGF0YSgpOwogCi0gICAgQVNTRVJUKCFt
ZS0+c2hvdWxkUGFyayk7Ci0gICAgCiAgICAgYm9vbCByZXN1bHQgPSBlbnF1ZXVlKAogICAgICAg
ICBhZGRyZXNzLAogICAgICAgICBbJl0gKCkgLT4gVGhyZWFkRGF0YSogewpAQCAtNTExLDcgKzUy
MSw2IEBAIGJvb2wgUGFya2luZ0xvdDo6cGFya0NvbmRpdGlvbmFsbHkoY29uc3QKICAgICAgICAg
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAogICAgICAgICAgICAgbWUtPmFkZHJlc3MgPSBhZGRy
ZXNzOwotICAgICAgICAgICAgbWUtPnNob3VsZFBhcmsgPSB0cnVlOwogICAgICAgICAgICAgcmV0
dXJuIG1lOwogICAgICAgICB9KTsKIApAQCAtNTIyLDEwICs1MzEsOCBAQCBib29sIFBhcmtpbmdM
b3Q6OnBhcmtDb25kaXRpb25hbGx5KGNvbnN0CiAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3Vy
cmVudFRocmVhZCgpLCAiOiBwYXJraW5nIHNlbGY6ICIsIFJhd1BvaW50ZXIobWUpLCAiXG4iKSk7
CiAgICAgewogICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2tlcihtZS0+
cGFya2luZ0xvY2spOwotICAgICAgICB3aGlsZSAobWUtPnNob3VsZFBhcmspCisgICAgICAgIHdo
aWxlIChtZS0+YWRkcmVzcykKICAgICAgICAgICAgIG1lLT5wYXJraW5nQ29uZGl0aW9uLndhaXQo
bG9ja2VyKTsKLQotICAgICAgICBtZS0+YWRkcmVzcyA9IG51bGxwdHI7CiAgICAgfQogICAgIGlm
ICh2ZXJib3NlKQogICAgICAgICBkYXRhTG9nKHRvU3RyaW5nKGN1cnJlbnRUaHJlYWQoKSwgIjog
dW5wYXJrZWQgc2VsZjogIiwgUmF3UG9pbnRlcihtZSksICJcbiIpKTsKQEAgLTU0MCwyNyArNTQ3
LDYyIEBAIGJvb2wgUGFya2luZ0xvdDo6dW5wYXJrT25lKGNvbnN0IHZvaWQqIGEKICAgICBUaHJl
YWREYXRhKiB0aHJlYWREYXRhID0gbnVsbHB0cjsKICAgICBib29sIHJlc3VsdCA9IGRlcXVldWUo
CiAgICAgICAgIGFkZHJlc3MsCisgICAgICAgIEJ1Y2tldE1vZGU6Oklnbm9yZUVtcHR5LAogICAg
ICAgICBbJl0gKFRocmVhZERhdGEqIGVsZW1lbnQpIHsKICAgICAgICAgICAgIGlmIChlbGVtZW50
LT5hZGRyZXNzICE9IGFkZHJlc3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIERlcXVldWVSZXN1
bHQ6Oklnbm9yZTsKICAgICAgICAgICAgIHRocmVhZERhdGEgPSBlbGVtZW50OwogICAgICAgICAg
ICAgcmV0dXJuIERlcXVldWVSZXN1bHQ6OlJlbW92ZUFuZFN0b3A7Ci0gICAgICAgIH0pOworICAg
ICAgICB9LAorICAgICAgICBbXSAoYm9vbCkgeyB9KTsKIAogICAgIGlmICghdGhyZWFkRGF0YSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgQVNTRVJUKHRocmVhZERhdGEtPnNob3VsZFBh
cmspOworICAgIEFTU0VSVCh0aHJlYWREYXRhLT5hZGRyZXNzKTsKICAgICAKICAgICB7CiAgICAg
ICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9ja2VyKHRocmVhZERhdGEtPnBhcmtp
bmdMb2NrKTsKLSAgICAgICAgdGhyZWFkRGF0YS0+c2hvdWxkUGFyayA9IGZhbHNlOwotICAgICAg
ICB0aHJlYWREYXRhLT5wYXJraW5nQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgdGhy
ZWFkRGF0YS0+YWRkcmVzcyA9IG51bGxwdHI7CiAgICAgfQorICAgIHRocmVhZERhdGEtPnBhcmtp
bmdDb25kaXRpb24ubm90aWZ5X29uZSgpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAordm9p
ZCBQYXJraW5nTG90Ojp1bnBhcmtPbmUoCisgICAgY29uc3Qgdm9pZCogYWRkcmVzcywKKyAgICBz
dGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBkaWRVbnBhcmtUaHJlYWQsIGJvb2wgbWF5SGF2ZU1vcmVU
aHJlYWRzKT4gY2FsbGJhY2spCit7CisgICAgaWYgKHZlcmJvc2UpCisgICAgICAgIGRhdGFMb2co
dG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiB1bnBhcmtpbmcgb25lIHRoZSBoYXJkIHdheS5c
biIpKTsKKworICAgIFRocmVhZERhdGEqIHRocmVhZERhdGEgPSBudWxscHRyOworICAgIGRlcXVl
dWUoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIEJ1Y2tldE1vZGU6OkVuc3VyZU5vbkVtcHR5
LAorICAgICAgICBbJl0gKFRocmVhZERhdGEqIGVsZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChl
bGVtZW50LT5hZGRyZXNzICE9IGFkZHJlc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIERlcXVl
dWVSZXN1bHQ6Oklnbm9yZTsKKyAgICAgICAgICAgIHRocmVhZERhdGEgPSBlbGVtZW50OworICAg
ICAgICAgICAgcmV0dXJuIERlcXVldWVSZXN1bHQ6OlJlbW92ZUFuZFN0b3A7CisgICAgICAgIH0s
CisgICAgICAgIFsmXSAoYm9vbCBtYXlIYXZlTW9yZVRocmVhZHMpIHsKKyAgICAgICAgICAgIGNh
bGxiYWNrKCEhdGhyZWFkRGF0YSwgdGhyZWFkRGF0YSAmJiBtYXlIYXZlTW9yZVRocmVhZHMpOwor
ICAgICAgICB9KTsKKworICAgIGlmICghdGhyZWFkRGF0YSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgQVNTRVJUKHRocmVhZERhdGEtPmFkZHJlc3MpOworICAgIAorICAgIHsKKyAgICAgICAgc3Rk
Ojp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrZXIodGhyZWFkRGF0YS0+cGFya2luZ0xvY2sp
OworICAgICAgICB0aHJlYWREYXRhLT5hZGRyZXNzID0gbnVsbHB0cjsKKyAgICB9CisgICAgdGhy
ZWFkRGF0YS0+cGFya2luZ0NvbmRpdGlvbi5ub3RpZnlfb25lKCk7Cit9CisKIHZvaWQgUGFya2lu
Z0xvdDo6dW5wYXJrQWxsKGNvbnN0IHZvaWQqIGFkZHJlc3MpCiB7CiAgICAgaWYgKHZlcmJvc2Up
CkBAIC01NjksNiArNjExLDcgQEAgdm9pZCBQYXJraW5nTG90Ojp1bnBhcmtBbGwoY29uc3Qgdm9p
ZCogYQogICAgIFZlY3RvcjxUaHJlYWREYXRhKiwgOD4gdGhyZWFkRGF0YXM7CiAgICAgZGVxdWV1
ZSgKICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgQnVja2V0TW9kZTo6SWdub3JlRW1wdHksCiAg
ICAgICAgIFsmXSAoVGhyZWFkRGF0YSogZWxlbWVudCkgewogICAgICAgICAgICAgaWYgKHZlcmJv
c2UpCiAgICAgICAgICAgICAgICAgZGF0YUxvZyh0b1N0cmluZyhjdXJyZW50VGhyZWFkKCksICI6
IE9ic2VydmluZyBlbGVtZW50IHdpdGggYWRkcmVzcyA9ICIsIFJhd1BvaW50ZXIoZWxlbWVudC0+
YWRkcmVzcyksICJcbiIpKTsKQEAgLTU3NiwxNSArNjE5LDE4IEBAIHZvaWQgUGFya2luZ0xvdDo6
dW5wYXJrQWxsKGNvbnN0IHZvaWQqIGEKICAgICAgICAgICAgICAgICByZXR1cm4gRGVxdWV1ZVJl
c3VsdDo6SWdub3JlOwogICAgICAgICAgICAgdGhyZWFkRGF0YXMuYXBwZW5kKGVsZW1lbnQpOwog
ICAgICAgICAgICAgcmV0dXJuIERlcXVldWVSZXN1bHQ6OlJlbW92ZUFuZENvbnRpbnVlOwotICAg
ICAgICB9KTsKKyAgICAgICAgfSwKKyAgICAgICAgW10gKGJvb2wpIHsgfSk7CiAKICAgICBmb3Ig
KFRocmVhZERhdGEqIHRocmVhZERhdGEgOiB0aHJlYWREYXRhcykgewogICAgICAgICBpZiAodmVy
Ym9zZSkKICAgICAgICAgICAgIGRhdGFMb2codG9TdHJpbmcoY3VycmVudFRocmVhZCgpLCAiOiB1
bnBhcmtpbmcgIiwgUmF3UG9pbnRlcih0aHJlYWREYXRhKSwgIiB3aXRoIGFkZHJlc3MgIiwgUmF3
UG9pbnRlcih0aHJlYWREYXRhLT5hZGRyZXNzKSwgIlxuIikpOwotICAgICAgICBBU1NFUlQodGhy
ZWFkRGF0YS0+c2hvdWxkUGFyayk7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRl
eD4gbG9ja2VyKHRocmVhZERhdGEtPnBhcmtpbmdMb2NrKTsKLSAgICAgICAgdGhyZWFkRGF0YS0+
c2hvdWxkUGFyayA9IGZhbHNlOwotICAgICAgICB0aHJlYWREYXRhLT5wYXJraW5nQ29uZGl0aW9u
Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgQVNTRVJUKHRocmVhZERhdGEtPmFkZHJlc3MpOworICAg
ICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2tlcih0
aHJlYWREYXRhLT5wYXJraW5nTG9jayk7CisgICAgICAgICAgICB0aHJlYWREYXRhLT5hZGRyZXNz
ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB0aHJlYWREYXRhLT5wYXJraW5nQ29uZGl0
aW9uLm5vdGlmeV9vbmUoKTsKICAgICB9CiAKICAgICBpZiAodmVyYm9zZSkKSW5kZXg6IFNvdXJj
ZS9XVEYvd3RmL1BhcmtpbmdMb3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9QYXJr
aW5nTG90LmgJKHJldmlzaW9uIDE4ODMyMikKKysrIFNvdXJjZS9XVEYvd3RmL1BhcmtpbmdMb3Qu
aAkod29ya2luZyBjb3B5KQpAQCAtNTksNiArNTksMjEgQEAgcHVibGljOgogICAgIC8vIGFyZSBu
byBtb3JlIHRocmVhZHMgb24gdGhlIHF1ZXVlLgogICAgIFdURl9FWFBPUlRfUFJJVkFURSBzdGF0
aWMgYm9vbCB1bnBhcmtPbmUoY29uc3Qgdm9pZCogYWRkcmVzcyk7CiAKKyAgICAvLyBVbnBhcmtz
IG9uZSB0aHJlYWQgZnJvbSB0aGUgcXVldWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBhZGRy
ZXNzLCBhbmQgY2FsbHMgdGhlIGdpdmVuCisgICAgLy8gZnVuY3RvciB3aGlsZSB0aGUgYWRkcmVz
cyBpcyBsb2NrZWQuIFJlcG9ydHMgdG8gdGhlIGNhbGxiYWNrIHdoZXRoZXIgYW55IHRocmVhZCBn
b3QgdW5wYXJrZWQKKyAgICAvLyBhbmQgd2hldGhlciB0aGVyZSBtYXkgYmUgYW55IG90aGVyIHRo
cmVhZHMgc3RpbGwgb24gdGhlIHF1ZXVlLiBUaGlzIGlzIGFuIGV4cGVydC1tb2RlIHZlcnNpb24K
KyAgICAvLyBvZiB1bnBhcmtPbmUoKSB0aGF0IGFsbG93cyBmb3IgcmVhbGx5IGdvb2QgdGh1bmRl
cmluZyBoZXJkIGF2b2lkYW5jZSBpbiBhZGFwdGl2ZSBtdXRleGVzLgorICAgIC8vIFdpdGhvdXQg
dGhpcywgYSBsb2NrIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB1bnBhcmtPbmUoKSBoYXMgdG8g
aGF2ZSBzb21lIHRyaWNrIGZvciBrbm93aW5nCisgICAgLy8gaWYgdGhlcmUgYXJlIHN0aWxsIHRo
cmVhZHMgcGFya2VkIG9uIHRoZSBxdWV1ZSwgc28gdGhhdCBpdCBjYW4gc2V0IHNvbWUgYml0IGlu
IGl0cyBsb2NrIHdvcmQKKyAgICAvLyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBuZXh0IHVubG9jaygp
IGFsc28gbmVlZHMgdG8gdW5wYXJrT25lKCkuIEJ1dCB0aGVyZSBpcyBhIHJhY2UgYmV0d2Vlbgor
ICAgIC8vIG1hbmlwdWxhdGluZyB0aGF0IGJpdCBhbmQgc29tZSBvdGhlciB0aHJlYWQgYWNxdWly
aW5nIHRoZSBsb2NrLiBJdCdzIHBvc3NpYmxlIHRvIHdvcmsgYXJvdW5kCisgICAgLy8gdGhhdCBy
YWNlIC0gc2VlIFJ1c3R5IFJ1c3NlbCdzIHdlbGwta25vd24gdXNlcnNlbSBsaWJyYXJ5IC0gYnV0
IGl0J3Mgbm90IHByZXR0eS4gVGhpcyBmb3JtCisgICAgLy8gYWxsb3dzIHRoYXQgcmFjZSB0byBi
ZSBjb21wbGV0ZWx5IGF2b2lkZWQsIHNpbmNlIHRoZXJlIGlzIG5vIHdheSB0aGF0IGEgdGhyZWFk
IGNhbiBiZSBwYXJrZWQKKyAgICAvLyB3aGlsZSB0aGUgY2FsbGJhY2sgaXMgcnVubmluZy4KKyAg
ICBXVEZfRVhQT1JUX1BSSVZBVEUgc3RhdGljIHZvaWQgdW5wYXJrT25lKAorICAgICAgICBjb25z
dCB2b2lkKiBhZGRyZXNzLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBkaWRVbnBh
cmtUaHJlYWQsIGJvb2wgbWF5SGF2ZU1vcmVUaHJlYWRzKT4gY2FsbGJhY2spOworCiAgICAgLy8g
VW5wYXJrcyBldmVyeSB0aHJlYWQgZnJvbSB0aGUgcXVldWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBn
aXZlbiBhZGRyZXNzLCB3aGljaCBjYW5ub3QgYmUgbnVsbC4KICAgICBXVEZfRVhQT1JUX1BSSVZB
VEUgc3RhdGljIHZvaWQgdW5wYXJrQWxsKGNvbnN0IHZvaWQqIGFkZHJlc3MpOwogCkluZGV4OiBT
b3VyY2UvV1RGL3d0Zi9Xb3JkTG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1dv
cmRMb2NrLmgJKHJldmlzaW9uIDE4ODMyMykKKysrIFNvdXJjZS9XVEYvd3RmL1dvcmRMb2NrLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDEwIEBACiAjaW5jbHVkZSA8d3RmL0xvY2tlci5o
PgogI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgogCituYW1lc3BhY2UgVGVzdFdlYktpdEFQ
SSB7CitzdHJ1Y3QgTG9ja0luc3BlY3RvcjsKK307CisKIG5hbWVzcGFjZSBXVEYgewogCiAvLyBB
IFdvcmRMb2NrIGlzIGEgZnVsbHkgYWRhcHRpdmUgbXV0ZXggdGhhdCB1c2VzIHNpemVvZih2b2lk
Kikgc3RvcmFnZS4gSXQgaGFzIGEgZmFzdCBwYXRoIHRoYXQgaXMKQEAgLTc3LDYgKzgxLDggQEAg
cHVibGljOgogICAgIH0KIAogcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IFRlc3RXZWJLaXRB
UEk6OkxvY2tJbnNwZWN0b3I7CisgICAgCiAgICAgc3RhdGljIGNvbnN0IHVpbnRwdHJfdCBpc0xv
Y2tlZEJpdCA9IDE7CiAgICAgc3RhdGljIGNvbnN0IHVpbnRwdHJfdCBpc1F1ZXVlTG9ja2VkQml0
ID0gMjsKICAgICBzdGF0aWMgY29uc3QgdWludHB0cl90IHF1ZXVlSGVhZE1hc2sgPSAzOwpAQCAt
ODQsNiArOTAsMTIgQEAgcHJpdmF0ZToKICAgICBXVEZfRVhQT1JUX1BSSVZBVEUgdm9pZCBsb2Nr
U2xvdygpOwogICAgIFdURl9FWFBPUlRfUFJJVkFURSB2b2lkIHVubG9ja1Nsb3coKTsKIAorICAg
IC8vIE1ldGhvZCB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuCisgICAgYm9vbCBpc0Z1bGx5UmVzZXQo
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICFtX3dvcmQubG9hZCgpOworICAgIH0KKwog
ICAgIEF0b21pYzx1aW50cHRyX3Q+IG1fd29yZDsKIH07CiAKSW5kZXg6IFRvb2xzL0NoYW5nZUxv
Zwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4ODM1NSkKKysrIFRv
b2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE3IEBACisyMDE1LTA4LTEy
ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAgV1RGOjpMb2NrIHNo
b3VsZCBub3Qgc3VmZmVyIGZyb20gdGhlIHRodW5kZXJpbmcgaGVyZAorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3OTQ3CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgR2VvZmZyZXkgR2FyZW4uCisKKyAgICAgICAgQWRkIHRlc3RpbmcgdGhhdCBjaGVja3Mg
dGhhdCBsb2NrcyByZXR1cm4gdG8gYSBwcmlzdGluZSBzdGF0ZSBhZnRlciBjb250ZW50aW9uIGlz
IG92ZXIuCisKKyAgICAgICAgKiBUZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9Mb2NrLmNwcDoKKyAg
ICAgICAgKFRlc3RXZWJLaXRBUEk6OkxvY2tJbnNwZWN0b3I6OmlzRnVsbHlSZXNldCk6CisgICAg
ICAgIChUZXN0V2ViS2l0QVBJOjpydW5Mb2NrVGVzdCk6CisgICAgICAgIChUZXN0V2ViS2l0QVBJ
OjpURVNUKToKKwogMjAxNS0wOC0xMiAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJhc2VyQGFwcGxl
LmNvbT4KIAogICAgICAgICBBZGQgYSB0b29sIHRoYXQgZHVtcHMgY2xhc3MgYW5kIHN0cnVjdCBt
ZW1iZXIgbGF5b3V0LCBzaG93aW5nIHBhZGRpbmcKSW5kZXg6IFRvb2xzL1Rlc3RXZWJLaXRBUEkv
VGVzdHMvV1RGL0xvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVz
dHMvV1RGL0xvY2suY3BwCShyZXZpc2lvbiAxODgzMjMpCisrKyBUb29scy9UZXN0V2ViS2l0QVBJ
L1Rlc3RzL1dURi9Mb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzMsNiArMzMsMTQgQEAgdXNp
bmcgbmFtZXNwYWNlIFdURjsKIAogbmFtZXNwYWNlIFRlc3RXZWJLaXRBUEkgewogCitzdHJ1Y3Qg
TG9ja0luc3BlY3RvciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTG9ja1R5cGU+CisgICAgc3Rh
dGljIGJvb2wgaXNGdWxseVJlc2V0KExvY2tUeXBlJiBsb2NrKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGxvY2suaXNGdWxseVJlc2V0KCk7CisgICAgfQorfTsKKwogdGVtcGxhdGU8dHlwZW5hbWUg
TG9ja1R5cGU+CiB2b2lkIHJ1bkxvY2tUZXN0KHVuc2lnbmVkIG51bVRocmVhZEdyb3VwcywgdW5z
aWduZWQgbnVtVGhyZWFkc1Blckdyb3VwLCB1bnNpZ25lZCB3b3JrUGVyQ3JpdGljYWxTZWN0aW9u
LCB1bnNpZ25lZCBudW1JdGVyYXRpb25zKQogewpAQCAtNjYsNiArNzQsMTcgQEAgdm9pZCBydW5M
b2NrVGVzdCh1bnNpZ25lZCBudW1UaHJlYWRHcm91cAogCiAgICAgZm9yICh1bnNpZ25lZCB0aHJl
YWRHcm91cEluZGV4ID0gbnVtVGhyZWFkR3JvdXBzOyB0aHJlYWRHcm91cEluZGV4LS07KQogICAg
ICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHdvcmRzW3RocmVhZEdyb3VwSW5kZXhdKTsKKworICAg
IC8vIE5vdyB0ZXN0IHRoYXQgdGhlIGxvY2tzIGNvcnJlY3RseSByZXNldCB0aGVtc2VsdmVzLiBX
ZSBleHBlY3QgdGhhdCBpZiBhIHNpbmdsZSB0aHJlYWQgbG9ja3MKKyAgICAvLyBlYWNoIG9mIHRo
ZSBsb2NrcyB0d2ljZSBpbiBhIHJvdywgdGhlbiB0aGUgbG9jayBzaG91bGQgYmUgaW4gYSBwcmlz
dGluZSBzdGF0ZS4KKyAgICBmb3IgKHVuc2lnbmVkIHRocmVhZEdyb3VwSW5kZXggPSBudW1UaHJl
YWRHcm91cHM7IHRocmVhZEdyb3VwSW5kZXgtLTspIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMjsgaS0tOykgeworICAgICAgICAgICAgbG9ja3NbdGhyZWFkR3JvdXBJbmRleF0ubG9jaygp
OworICAgICAgICAgICAgbG9ja3NbdGhyZWFkR3JvdXBJbmRleF0udW5sb2NrKCk7CisgICAgICAg
IH0KKworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgTG9ja0luc3BlY3Rvcjo6aXNGdWxseVJlc2V0
KGxvY2tzW3RocmVhZEdyb3VwSW5kZXhdKSk7CisgICAgfQogfQogCiBURVNUKFdURl9Xb3JkTG9j
aywgVW5jb250ZW5kZWRTaG9ydFNlY3Rpb24pCkBAIC0xMjgsNiArMTQ3LDExIEBAIFRFU1QoV1RG
X0xvY2ssIE1hbnlDb250ZW5kZWRMb25nU2VjdGlvbnMKICAgICBydW5Mb2NrVGVzdDxMb2NrPigx
MCwgMTAsIDEwMDAwLCAxMDAwKTsKIH0KIAorVEVTVChXVEZfTG9jaywgTWFueUNvbnRlbmRlZExv
bmdlclNlY3Rpb25zKQoreworICAgIHJ1bkxvY2tUZXN0PExvY2s+KDEwLCAxMCwgMTAwMDAwLCAx
MDApOworfQorCiBURVNUKFdURl9Mb2NrLCBTZWN0aW9uQWRkcmVzc0NvbGxpc2lvbikKIHsKICAg
ICBydW5Mb2NrVGVzdDxMb2NrPig0LCAyLCAxMDAwMCwgMjAwMCk7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>