<?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>225935</bug_id>
          
          <creation_ts>2021-05-18 13:28:31 -0700</creation_ts>
          <short_desc>Use WTF::Locker for locking BaseAudioContext&apos;s graph lock</short_desc>
          <delta_ts>2021-05-18 18:52:19 -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 Audio</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Dumez">cdumez</reporter>
          <assigned_to name="Chris Dumez">cdumez</assigned_to>
          <cc>benjamin</cc>
    
    <cc>cdumez</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>darin</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>ggaren</cc>
    
    <cc>glenn</cc>
    
    <cc>jer.noble</cc>
    
    <cc>peng.liu6</cc>
    
    <cc>philipj</cc>
    
    <cc>sam</cc>
    
    <cc>sergio</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1761279</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-18 13:28:31 -0700</bug_when>
    <thetext>Use WTF::Locker for locking BaseAudioContext&apos;s graph lock instead of our own AutoLocker.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761337</commentid>
    <comment_count>1</comment_count>
      <attachid>428986</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-18 15:12:32 -0700</bug_when>
    <thetext>Created attachment 428986
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761339</commentid>
    <comment_count>2</comment_count>
      <attachid>428986</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-18 15:30:33 -0700</bug_when>
    <thetext>Comment on attachment 428986
Patch

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

&gt; Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp:419
&gt; +    auto contextLocker = holdLock(context().graphLock());

I believe we are trying to move away from holdLock() and just use:

Locker locker { context().graphLock() };

because holdLock does not play nice with ThreadSafetyAnalysis.

We really should just do a global replace of holdLock() to get this over with.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761341</commentid>
    <comment_count>3</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-18 15:32:36 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #2)
&gt; Comment on attachment 428986 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=428986&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp:419
&gt; &gt; +    auto contextLocker = holdLock(context().graphLock());
&gt; 
&gt; I believe we are trying to move away from holdLock() and just use:
&gt; 
&gt; Locker locker { context().graphLock() };
&gt; 
&gt; because holdLock does not play nice with ThreadSafetyAnalysis.
&gt; 
&gt; We really should just do a global replace of holdLock() to get this over
&gt; with.

holdLock() looks nicer and there is no harm in using it here since we&apos;re not using a Lock type that supports static analysis. My understanding was that we just can use holdLock() with StaticLock but it was OK to use holdLock() for other types of locks?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761345</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-18 15:34:25 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #3)
&gt; (In reply to Sam Weinig from comment #2)
&gt; &gt; Comment on attachment 428986 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=428986&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp:419
&gt; &gt; &gt; +    auto contextLocker = holdLock(context().graphLock());
&gt; &gt; 
&gt; &gt; I believe we are trying to move away from holdLock() and just use:
&gt; &gt; 
&gt; &gt; Locker locker { context().graphLock() };
&gt; &gt; 
&gt; &gt; because holdLock does not play nice with ThreadSafetyAnalysis.
&gt; &gt; 
&gt; &gt; We really should just do a global replace of holdLock() to get this over
&gt; &gt; with.
&gt; 
&gt; holdLock() looks nicer and there is no harm in using it here since we&apos;re not
&gt; using a Lock type that supports static analysis. My understanding was that
&gt; we just can use holdLock() with StaticLock but it was OK to use holdLock()
&gt; for other types of locks?

Also note that it wouldn&apos;t be:
Locker locker { context().graphLock() };

It would be:
Locker&lt;RecursiveLock&gt; locker { context().graphLock() };

Which would look even worse. I much prefer using auto that having to name the lock type.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761350</commentid>
    <comment_count>5</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-18 15:53:07 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #3)
&gt; (In reply to Sam Weinig from comment #2)
&gt; &gt; Comment on attachment 428986 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=428986&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp:419
&gt; &gt; &gt; +    auto contextLocker = holdLock(context().graphLock());
&gt; &gt; 
&gt; &gt; I believe we are trying to move away from holdLock() and just use:
&gt; &gt; 
&gt; &gt; Locker locker { context().graphLock() };
&gt; &gt; 
&gt; &gt; because holdLock does not play nice with ThreadSafetyAnalysis.
&gt; &gt; 
&gt; &gt; We really should just do a global replace of holdLock() to get this over
&gt; &gt; with.
&gt; 
&gt; holdLock() looks nicer and there is no harm in using it here since we&apos;re not
&gt; using a Lock type that supports static analysis. My understanding was that
&gt; we just can use holdLock() with StaticLock but it was OK to use holdLock()
&gt; for other types of locks?

I think the only reason CheckedLock exists is that we holdLock. There is comment that states:

// FIXME: Maybe should be folded back to Lock once holdLock is not used globally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761351</commentid>
    <comment_count>6</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-18 15:54:27 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #5)
&gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; (In reply to Sam Weinig from comment #2)
&gt; &gt; &gt; Comment on attachment 428986 [details]
&gt; &gt; &gt; Patch
&gt; &gt; &gt; 
&gt; &gt; &gt; View in context:
&gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=428986&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp:419
&gt; &gt; &gt; &gt; +    auto contextLocker = holdLock(context().graphLock());
&gt; &gt; &gt; 
&gt; &gt; &gt; I believe we are trying to move away from holdLock() and just use:
&gt; &gt; &gt; 
&gt; &gt; &gt; Locker locker { context().graphLock() };
&gt; &gt; &gt; 
&gt; &gt; &gt; because holdLock does not play nice with ThreadSafetyAnalysis.
&gt; &gt; &gt; 
&gt; &gt; &gt; We really should just do a global replace of holdLock() to get this over
&gt; &gt; &gt; with.
&gt; &gt; 
&gt; &gt; holdLock() looks nicer and there is no harm in using it here since we&apos;re not
&gt; &gt; using a Lock type that supports static analysis. My understanding was that
&gt; &gt; we just can use holdLock() with StaticLock but it was OK to use holdLock()
&gt; &gt; for other types of locks?
&gt; 
&gt; I think the only reason CheckedLock exists is that we holdLock. There is
&gt; comment that states:
&gt; 
&gt; // FIXME: Maybe should be folded back to Lock once holdLock is not used
&gt; globally.

And what are you proposing for tryLock()? Keep using tryHoldLock()?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761352</commentid>
    <comment_count>7</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-18 15:55:37 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #4)
&gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; (In reply to Sam Weinig from comment #2)
&gt; &gt; &gt; Comment on attachment 428986 [details]
&gt; &gt; &gt; Patch
&gt; &gt; &gt; 
&gt; &gt; &gt; View in context:
&gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=428986&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp:419
&gt; &gt; &gt; &gt; +    auto contextLocker = holdLock(context().graphLock());
&gt; &gt; &gt; 
&gt; &gt; &gt; I believe we are trying to move away from holdLock() and just use:
&gt; &gt; &gt; 
&gt; &gt; &gt; Locker locker { context().graphLock() };
&gt; &gt; &gt; 
&gt; &gt; &gt; because holdLock does not play nice with ThreadSafetyAnalysis.
&gt; &gt; &gt; 
&gt; &gt; &gt; We really should just do a global replace of holdLock() to get this over
&gt; &gt; &gt; with.
&gt; &gt; 
&gt; &gt; holdLock() looks nicer and there is no harm in using it here since we&apos;re not
&gt; &gt; using a Lock type that supports static analysis. My understanding was that
&gt; &gt; we just can use holdLock() with StaticLock but it was OK to use holdLock()
&gt; &gt; for other types of locks?
&gt; 
&gt; Also note that it wouldn&apos;t be:
&gt; Locker locker { context().graphLock() };
&gt; 
&gt; It would be:
&gt; Locker&lt;RecursiveLock&gt; locker { context().graphLock() };
&gt; 
&gt; Which would look even worse. I much prefer using auto that having to name
&gt; the lock type.

Why do you have to specify RecursiveLock here? Is the argument deduction not working?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761353</commentid>
    <comment_count>8</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-18 15:58:24 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #6)
&gt; (In reply to Sam Weinig from comment #5)
&gt; &gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; &gt; (In reply to Sam Weinig from comment #2)
&gt; &gt; &gt; &gt; Comment on attachment 428986 [details]
&gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; View in context:
&gt; &gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=428986&amp;action=review
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp:419
&gt; &gt; &gt; &gt; &gt; +    auto contextLocker = holdLock(context().graphLock());
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; I believe we are trying to move away from holdLock() and just use:
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Locker locker { context().graphLock() };
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; because holdLock does not play nice with ThreadSafetyAnalysis.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; We really should just do a global replace of holdLock() to get this over
&gt; &gt; &gt; &gt; with.
&gt; &gt; &gt; 
&gt; &gt; &gt; holdLock() looks nicer and there is no harm in using it here since we&apos;re not
&gt; &gt; &gt; using a Lock type that supports static analysis. My understanding was that
&gt; &gt; &gt; we just can use holdLock() with StaticLock but it was OK to use holdLock()
&gt; &gt; &gt; for other types of locks?
&gt; &gt; 
&gt; &gt; I think the only reason CheckedLock exists is that we holdLock. There is
&gt; &gt; comment that states:
&gt; &gt; 
&gt; &gt; // FIXME: Maybe should be folded back to Lock once holdLock is not used
&gt; &gt; globally.
&gt; 
&gt; And what are you proposing for tryLock()? Keep using tryHoldLock()?

I guess I would recommend we add a TryLocker class or something, not sure. But since this doesn&apos;t seem as settled as I thought it was, perhaps we should continue with holdLock/tryHoldLock for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761363</commentid>
    <comment_count>9</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-18 16:31:07 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #7)
&gt; (In reply to Chris Dumez from comment #4)
&gt; &gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; &gt; (In reply to Sam Weinig from comment #2)
&gt; &gt; &gt; &gt; Comment on attachment 428986 [details]
&gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; View in context:
&gt; &gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=428986&amp;action=review
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp:419
&gt; &gt; &gt; &gt; &gt; +    auto contextLocker = holdLock(context().graphLock());
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; I believe we are trying to move away from holdLock() and just use:
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Locker locker { context().graphLock() };
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; because holdLock does not play nice with ThreadSafetyAnalysis.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; We really should just do a global replace of holdLock() to get this over
&gt; &gt; &gt; &gt; with.
&gt; &gt; &gt; 
&gt; &gt; &gt; holdLock() looks nicer and there is no harm in using it here since we&apos;re not
&gt; &gt; &gt; using a Lock type that supports static analysis. My understanding was that
&gt; &gt; &gt; we just can use holdLock() with StaticLock but it was OK to use holdLock()
&gt; &gt; &gt; for other types of locks?
&gt; &gt; 
&gt; &gt; Also note that it wouldn&apos;t be:
&gt; &gt; Locker locker { context().graphLock() };
&gt; &gt; 
&gt; &gt; It would be:
&gt; &gt; Locker&lt;RecursiveLock&gt; locker { context().graphLock() };
&gt; &gt; 
&gt; &gt; Which would look even worse. I much prefer using auto that having to name
&gt; &gt; the lock type.
&gt; 
&gt; Why do you have to specify RecursiveLock here? Is the argument deduction not
&gt; working?

My bad, I am surprised but `Locker locker { context().graphLock() };` appears to be compiling fine. I thought this only used with a CheckedLock for some reason.

For tryHoldLock(), it looks like one alternative would be:
auto locker = Locker&lt;RecursiveLock&gt;::tryLock(context().graphLock());

Should I adopt that?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761370</commentid>
    <comment_count>10</comment_count>
      <attachid>428997</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-05-18 16:38:37 -0700</bug_when>
    <thetext>Created attachment 428997
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761386</commentid>
    <comment_count>11</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-18 17:11:12 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #9)
&gt; (In reply to Sam Weinig from comment #7)
&gt; &gt; (In reply to Chris Dumez from comment #4)
&gt; &gt; &gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; &gt; &gt; (In reply to Sam Weinig from comment #2)
&gt; &gt; &gt; &gt; &gt; Comment on attachment 428986 [details]
&gt; &gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; View in context:
&gt; &gt; &gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=428986&amp;action=review
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp:419
&gt; &gt; &gt; &gt; &gt; &gt; +    auto contextLocker = holdLock(context().graphLock());
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; I believe we are trying to move away from holdLock() and just use:
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; Locker locker { context().graphLock() };
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; because holdLock does not play nice with ThreadSafetyAnalysis.
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; We really should just do a global replace of holdLock() to get this over
&gt; &gt; &gt; &gt; &gt; with.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; holdLock() looks nicer and there is no harm in using it here since we&apos;re not
&gt; &gt; &gt; &gt; using a Lock type that supports static analysis. My understanding was that
&gt; &gt; &gt; &gt; we just can use holdLock() with StaticLock but it was OK to use holdLock()
&gt; &gt; &gt; &gt; for other types of locks?
&gt; &gt; &gt; 
&gt; &gt; &gt; Also note that it wouldn&apos;t be:
&gt; &gt; &gt; Locker locker { context().graphLock() };
&gt; &gt; &gt; 
&gt; &gt; &gt; It would be:
&gt; &gt; &gt; Locker&lt;RecursiveLock&gt; locker { context().graphLock() };
&gt; &gt; &gt; 
&gt; &gt; &gt; Which would look even worse. I much prefer using auto that having to name
&gt; &gt; &gt; the lock type.
&gt; &gt; 
&gt; &gt; Why do you have to specify RecursiveLock here? Is the argument deduction not
&gt; &gt; working?
&gt; 
&gt; My bad, I am surprised but `Locker locker { context().graphLock() };`
&gt; appears to be compiling fine. I thought this only used with a CheckedLock
&gt; for some reason.
&gt; 
&gt; For tryHoldLock(), it looks like one alternative would be:
&gt; auto locker = Locker&lt;RecursiveLock&gt;::tryLock(context().graphLock());
&gt; 
&gt; Should I adopt that?

That looks good for now. I will add something to make this nicer soon and fix this up. Probably make it something like:

Locker locker { context().graphLock(), Locker::Try };</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761387</commentid>
    <comment_count>12</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2021-05-18 17:12:11 -0700</bug_when>
    <thetext>&gt; My bad, I am surprised but `Locker locker { context().graphLock() };`
&gt; appears to be compiling fine. I thought this only used with a CheckedLock
&gt; for some reason.

The wonders of CTAD! https://en.cppreference.com/w/cpp/language/class_template_argument_deduction</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761429</commentid>
    <comment_count>13</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-05-18 18:51:55 -0700</bug_when>
    <thetext>Committed r277709 (237890@main): &lt;https://commits.webkit.org/237890@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 428997.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1761430</commentid>
    <comment_count>14</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-05-18 18:52:19 -0700</bug_when>
    <thetext>&lt;rdar://problem/78184315&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>428986</attachid>
            <date>2021-05-18 15:12:32 -0700</date>
            <delta_ts>2021-05-18 16:38:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-225935-20210518151232.patch</filename>
            <type>text/plain</type>
            <size>31172</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc3NjUzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IGY4NGMxODgyYzJhODNiY2FlMzVlNWE1
NmExZTFhZTNiYmMyN2MyZGQuLmFjNTE4NjZmY2Q1MGMzNWVjZDQzN2I4OGEyZjk2YTA4NWU1MmY4
Y2QgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTggQEAKKzIwMjEtMDUtMTggIENocmlzIER1bWV6ICA8Y2R1bWV6
QGFwcGxlLmNvbT4KKworICAgICAgICBVc2UgV1RGOjpMb2NrZXIgZm9yIGxvY2tpbmcgQmFzZUF1
ZGlvQ29udGV4dCdzIGdyYXBoIGxvY2sKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTIyNTkzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgICogd3RmL0xvY2tlci5oOgorICAgICAgICBBbGxvdyB1c2luZyB0cnlI
b2xkTG9jaygpIGluc3RlYWQgb2YgV1RGOjp0cnlIb2xkTG9jaygpLgorCisgICAgICAgICogd3Rm
L1JlY3Vyc2l2ZUxvY2tBZGFwdGVyLmg6CisgICAgICAgIChXVEY6OlJlY3Vyc2l2ZUxvY2tBZGFw
dGVyOjppc093bmVyIGNvbnN0KToKKyAgICAgICAgQWRkIGlzT3duZXIoKSBmdW5jdGlvbiB0aGF0
IHJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgaG9sZGluZyB0aGUgbG9jay4K
KyAgICAgICAgVGhpcyBpcyBuZWVkZWQgZm9yIFdlYkF1ZGlvIHB1cnBvc2VzLgorCiAyMDIxLTA1
LTE3ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgogCiAgICAgICAgIEVuYWJsZSBK
UyB0byBlbWl0IHNpZ24gcG9zdHMgYW5kIHRyYWNlIHBvaW50cyB1bmRlciBPcHRpb25zOjpleHBv
c2VQcm9maWxlcnNPbkdsb2JhbE9iamVjdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvQ2hh
bmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IGI4YjY2ODI0MmIwYTBmZDZk
NzJiZTEwYzI0MzJiYTNhNGMxZjQxZmEuLjI0MTM0YTA1OGI0NWYyMWU3OGQ3NTkwMGUwMjZmNWRh
YTZhYzIwNjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1OSBAQAorMjAyMS0wNS0xOCAgQ2hyaXMg
RHVtZXogIDxjZHVtZXpAYXBwbGUuY29tPgorCisgICAgICAgIFVzZSBXVEY6OkxvY2tlciBmb3Ig
bG9ja2luZyBCYXNlQXVkaW9Db250ZXh0J3MgZ3JhcGggbG9jaworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI1OTM1CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVXNlIFdURjo6TG9ja2VyIGZvciBsb2NraW5n
IEJhc2VBdWRpb0NvbnRleHQncyBncmFwaCBsb2NrIGluc3RlYWQgb2Ygb3VyIG93biBBdXRvTG9j
a2VyLgorICAgICAgICBBbHNvIHVzZSBXVEY6OlJlY3Vyc2l2ZUxvY2sgaW5zdGVhZCBvZiBkdXBs
aWNhdGluZyB0aGUgcmVjdXJzaXZlIGxvY2tpbmcgbG9naWMgaW5zaWRlCisgICAgICAgIEJhc2VB
dWRpb0NvbnRleHQuIFRoaXMgbWVhbnMgd2Ugbm8gbG9uZ2VyIG5lZWQgbG9jaygpIC8gdHJ5TG9j
aygpIC8gdW5sb2NrKCkgZnVuY3Rpb25zCisgICAgICAgIG9uIEJhc2VBdWRpb0NvbnRleHQuIFdl
IG5vdyBleHBvc2UgdGhlIEJhc2VBdWRpb0NvbnRleHQncyBSZWN1cnNpdmVMb2NrIHZpYSBhIGdy
YXBoTG9jaygpCisgICAgICAgIGdldHRlciBhbmQgdGhlIGNhbGxlciBzaXRlcyBjYW4ganVzdCB1
c2UgdGhlIHVzdWFsIGhvbGRMb2NrKCkgLyB0cnlIb2xkTG9jaygpLgorCisgICAgICAgICogTW9k
dWxlcy93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9CdWZmZXJTb3VyY2VOb2RlOjpzZXRCdWZmZXIpOgorICAgICAgICAqIE1vZHVsZXMv
d2ViYXVkaW8vQXVkaW9Ob2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6Y29u
bmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OmRpc2Nvbm5lY3QpOgorICAgICAg
ICAoV2ViQ29yZTo6QXVkaW9Ob2RlOjpzZXRDaGFubmVsQ291bnQpOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9Ob2RlOjpzZXRDaGFubmVsQ291bnRNb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvTm9kZTo6c2V0Q2hhbm5lbEludGVycHJldGF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvTm9kZTo6ZW5hYmxlT3V0cHV0c0lmTmVjZXNzYXJ5KToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvTm9kZTo6ZGVjcmVtZW50Q29ubmVjdGlvbkNvdW50KToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvTm9kZTo6ZGVyZWYpOgorICAgICAgICAqIE1vZHVsZXMvd2ViYXVkaW8vQXVkaW9Xb3JrbGV0
Tm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1dvcmtsZXROb2RlOjpjcmVhdGUpOgor
ICAgICAgICAqIE1vZHVsZXMvd2ViYXVkaW8vQmFzZUF1ZGlvQ29udGV4dC5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpCYXNlQXVkaW9Db250ZXh0Ojp1bmluaXRpYWxpemUpOgorICAgICAgICAoV2Vi
Q29yZTo6QmFzZUF1ZGlvQ29udGV4dDo6cmVmU291cmNlTm9kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpCYXNlQXVkaW9Db250ZXh0OjphZGREZWZlcnJlZERlY3JlbWVudENvbm5lY3Rpb25Db3VudCk6
CisgICAgICAgIChXZWJDb3JlOjpCYXNlQXVkaW9Db250ZXh0OjpoYW5kbGVQcmVSZW5kZXJUYXNr
cyk6CisgICAgICAgIChXZWJDb3JlOjpCYXNlQXVkaW9Db250ZXh0OjpvdXRwdXRQb3NpdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpCYXNlQXVkaW9Db250ZXh0OjpoYW5kbGVQb3N0UmVuZGVyVGFz
a3MpOgorICAgICAgICAoV2ViQ29yZTo6QmFzZUF1ZGlvQ29udGV4dDo6ZGVsZXRlTWFya2VkTm9k
ZXMpOgorICAgICAgICAoV2ViQ29yZTo6QmFzZUF1ZGlvQ29udGV4dDo6cmVtb3ZlTWFya2VkU3Vt
bWluZ0p1bmN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkJhc2VBdWRpb0NvbnRleHQ6OmhhbmRs
ZURpcnR5QXVkaW9TdW1taW5nSnVuY3Rpb25zKToKKyAgICAgICAgKFdlYkNvcmU6OkJhc2VBdWRp
b0NvbnRleHQ6OmhhbmRsZURpcnR5QXVkaW9Ob2RlT3V0cHV0cyk6CisgICAgICAgICogTW9kdWxl
cy93ZWJhdWRpby9CYXNlQXVkaW9Db250ZXh0Lmg6CisgICAgICAgIChXZWJDb3JlOjpCYXNlQXVk
aW9Db250ZXh0OjpncmFwaExvY2spOgorICAgICAgICAoV2ViQ29yZTo6QmFzZUF1ZGlvQ29udGV4
dDo6aXNHcmFwaE93bmVyIGNvbnN0KToKKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL0NoYW5u
ZWxNZXJnZXJOb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNoYW5uZWxNZXJnZXJOb2RlOjpD
aGFubmVsTWVyZ2VyTm9kZSk6CisgICAgICAgICogTW9kdWxlcy93ZWJhdWRpby9Db252b2x2ZXJO
b2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnZvbHZlck5vZGU6OnNldEJ1ZmZlcik6Cisg
ICAgICAgICogTW9kdWxlcy93ZWJhdWRpby9NZWRpYUVsZW1lbnRBdWRpb1NvdXJjZU5vZGUuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFFbGVtZW50QXVkaW9Tb3VyY2VOb2RlOjpzZXRGb3Jt
YXQpOgorICAgICAgICAqIE1vZHVsZXMvd2ViYXVkaW8vTWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5v
ZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGU6OnNl
dEZvcm1hdCk6CisgICAgICAgICogTW9kdWxlcy93ZWJhdWRpby9PZmZsaW5lQXVkaW9Db250ZXh0
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Ok9mZmxpbmVBdWRpb0NvbnRleHQ6OnN1c3BlbmRSZW5k
ZXJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6T2ZmbGluZUF1ZGlvQ29udGV4dDo6c2hvdWxkU3Vz
cGVuZCk6CisgICAgICAgIChXZWJDb3JlOjpPZmZsaW5lQXVkaW9Db250ZXh0OjpkaWRTdXNwZW5k
UmVuZGVyaW5nKToKKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL09mZmxpbmVBdWRpb0NvbnRl
eHQuaDoKKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL1dhdmVTaGFwZXJOb2RlLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OldhdmVTaGFwZXJOb2RlOjpzZXRPdmVyc2FtcGxlKToKKwogMjAyMS0w
NS0xOCAgQ2hyaXMgRHVtZXogIDxjZHVtZXpAYXBwbGUuY29tPgogCiAgICAgICAgIFtIYXJkZW5p
bmddIENBUmluZ0J1ZmZlciBzaG91bGQgdmFsaWRhdGUgdGhlIHN0b3JhZ2Ugc2l6ZSBiZWZvcmUg
YWRvcHRpbmcgaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYvd3RmL0xvY2tlci5oIGIvU291cmNl
L1dURi93dGYvTG9ja2VyLmgKaW5kZXggMWYzMzExMDM3YTlkNDUxMjcwYjhkNzk3MmFlY2ZmZTlk
ZGIyZWNkYS4uNjc0YzRlZjgyZDE0YjhiNTI5YzJmNzA1MjlkM2JmZTg0MWIzNTE3MyAxMDA2NDQK
LS0tIGEvU291cmNlL1dURi93dGYvTG9ja2VyLmgKKysrIGIvU291cmNlL1dURi93dGYvTG9ja2Vy
LmgKQEAgLTE4OSw0ICsxODksNSBAQCB1c2luZyBXVEY6Ok5vTG9ja2luZ05lY2Vzc2FyeVRhZzsK
IHVzaW5nIFdURjo6Tm9Mb2NraW5nTmVjZXNzYXJ5OwogdXNpbmcgV1RGOjpob2xkTG9jazsKIHVz
aW5nIFdURjo6aG9sZExvY2tJZjsKK3VzaW5nIFdURjo6dHJ5SG9sZExvY2s7CiB1c2luZyBXVEY6
OkRyb3BMb2NrRm9yU2NvcGU7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL3d0Zi9SZWN1cnNpdmVM
b2NrQWRhcHRlci5oIGIvU291cmNlL1dURi93dGYvUmVjdXJzaXZlTG9ja0FkYXB0ZXIuaAppbmRl
eCBmNTYwNTcyYzE1ZjYwZTViMjhhNTgzOWQ1MDZjNDk4NmY4ODM1NWZmLi4xZWUxMmQ0MTk0NzI2
ZDIzMjQ5MmQ2NTQ0NDE2ZWY2NjE0OGJkNjZhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL3d0Zi9S
ZWN1cnNpdmVMb2NrQWRhcHRlci5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL1JlY3Vyc2l2ZUxvY2tB
ZGFwdGVyLmgKQEAgLTgwLDYgKzgwLDggQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJu
IG1fbG9jay5pc0xvY2tlZCgpOwogICAgIH0KKworICAgIGJvb2wgaXNPd25lcigpIGNvbnN0IHsg
cmV0dXJuIG1fb3duZXIgPT0gJlRocmVhZDo6Y3VycmVudCgpOyB9CiAgICAgCiBwcml2YXRlOgog
ICAgIFRocmVhZCogbV9vd25lciB7IG51bGxwdHIgfTsgLy8gVXNlIFRocmVhZCogaW5zdGVhZCBv
ZiBSZWZQdHI8VGhyZWFkPiBzaW5jZSBtX293bmVyIHRocmVhZCBpcyBhbHdheXMgYWxpdmUgd2hp
bGUgbV9vbndlciBpcyBzZXQuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dl
YmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAKaW5kZXggZTBiZDRjYTNiZjNkMzg1
ZTQ0N2Q0ZDc3OTkxYWRmNzEwZGYzZTEyNC4uNzllMjY3OWQwYjFjMWU1OGNhNzkwZTdhZjg4NzQ1
ZWQ2NDljNDRjYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9B
dWRpb0J1ZmZlclNvdXJjZU5vZGUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vi
YXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmNwcApAQCAtNDE2LDcgKzQxNiw3IEBAIEV4Y2Vw
dGlvbk9yPHZvaWQ+IEF1ZGlvQnVmZmVyU291cmNlTm9kZTo6c2V0QnVmZmVyKFJlZlB0cjxBdWRp
b0J1ZmZlcj4mJiBidWZmZXIpCiAgICAgICAgIHJldHVybiBFeGNlcHRpb24geyBJbnZhbGlkU3Rh
dGVFcnJvciwgIlRoZSBidWZmZXIgd2FzIGFscmVhZHkgc2V0Il9zIH07CiAKICAgICAvLyBUaGUg
Y29udGV4dCBtdXN0IGJlIGxvY2tlZCBzaW5jZSBjaGFuZ2luZyB0aGUgYnVmZmVyIGNhbiByZS1j
b25maWd1cmUgdGhlIG51bWJlciBvZiBjaGFubmVscyB0aGF0IGFyZSBvdXRwdXQuCi0gICAgQmFz
ZUF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBjb250ZXh0TG9ja2VyKGNvbnRleHQoKSk7CisgICAg
YXV0byBjb250ZXh0TG9ja2VyID0gaG9sZExvY2soY29udGV4dCgpLmdyYXBoTG9jaygpKTsKICAg
ICAKICAgICAvLyBUaGlzIHN5bmNocm9uaXplcyB3aXRoIHByb2Nlc3MoKS4KICAgICBhdXRvIGxv
Y2tlciA9IGhvbGRMb2NrKG1fcHJvY2Vzc0xvY2spOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb05vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxl
cy93ZWJhdWRpby9BdWRpb05vZGUuY3BwCmluZGV4IGIzNzNkNTAyNmYwMmM3ZTMyNTczZjQwYjBj
ZGY2NDQ4MjRkMmVkNWMuLjA3NTYwODA2M2Y1YTcxMjY1YzZiNTZlOWUwNzRkMjU1ZGI3MmFmYjcg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Ob2RlLmNw
cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvTm9kZS5jcHAKQEAg
LTE4MSw3ICsxODEsNyBAQCBBdWRpb05vZGVPdXRwdXQqIEF1ZGlvTm9kZTo6b3V0cHV0KHVuc2ln
bmVkIGkpCiBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OmNvbm5lY3QoQXVkaW9Ob2RlJiBk
ZXN0aW5hdGlvbiwgdW5zaWduZWQgb3V0cHV0SW5kZXgsIHVuc2lnbmVkIGlucHV0SW5kZXgpCiB7
CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLSAgICBCYXNlQXVkaW9Db250ZXh0OjpBdXRv
TG9ja2VyIGxvY2tlcihjb250ZXh0KCkpOworICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2soY29u
dGV4dCgpLmdyYXBoTG9jaygpKTsKIAogICAgIEFMV0FZU19MT0coTE9HSURFTlRJRklFUiwgZGVz
dGluYXRpb24ubm9kZVR5cGUoKSwgIiwgb3V0cHV0ID0gIiwgb3V0cHV0SW5kZXgsICIsIGlucHV0
ID0gIiwgaW5wdXRJbmRleCk7CiAgICAgCkBAIC0yMTMsNyArMjEzLDcgQEAgRXhjZXB0aW9uT3I8
dm9pZD4gQXVkaW9Ob2RlOjpjb25uZWN0KEF1ZGlvTm9kZSYgZGVzdGluYXRpb24sIHVuc2lnbmVk
IG91dHB1dEluZGUKIAogRXhjZXB0aW9uT3I8dm9pZD4gQXVkaW9Ob2RlOjpjb25uZWN0KEF1ZGlv
UGFyYW0mIHBhcmFtLCB1bnNpZ25lZCBvdXRwdXRJbmRleCkKIHsKLSAgICBCYXNlQXVkaW9Db250
ZXh0OjpBdXRvTG9ja2VyIGxvY2tlcihjb250ZXh0KCkpOworICAgIGF1dG8gbG9ja2VyID0gaG9s
ZExvY2soY29udGV4dCgpLmdyYXBoTG9jaygpKTsKIAogICAgIEFTU0VSVChpc01haW5UaHJlYWQo
KSk7CiAKQEAgLTIzNCw3ICsyMzQsNyBAQCBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OmNv
bm5lY3QoQXVkaW9QYXJhbSYgcGFyYW0sIHVuc2lnbmVkIG91dHB1dEluZGV4KQogdm9pZCBBdWRp
b05vZGU6OmRpc2Nvbm5lY3QoKQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAg
QmFzZUF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBsb2NrZXIoY29udGV4dCgpKTsKKyAgICBhdXRv
IGxvY2tlciA9IGhvbGRMb2NrKGNvbnRleHQoKS5ncmFwaExvY2soKSk7CiAKICAgICBmb3IgKHVu
c2lnbmVkIG91dHB1dEluZGV4ID0gMDsgb3V0cHV0SW5kZXggPCBudW1iZXJPZk91dHB1dHMoKTsg
KytvdXRwdXRJbmRleCkgewogICAgICAgICBhdXRvKiBvdXRwdXQgPSB0aGlzLT5vdXRwdXQob3V0
cHV0SW5kZXgpOwpAQCAtMjQ4LDcgKzI0OCw3IEBAIHZvaWQgQXVkaW9Ob2RlOjpkaXNjb25uZWN0
KCkKIEV4Y2VwdGlvbk9yPHZvaWQ+IEF1ZGlvTm9kZTo6ZGlzY29ubmVjdCh1bnNpZ25lZCBvdXRw
dXRJbmRleCkKIHsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIEJhc2VBdWRpb0Nv
bnRleHQ6OkF1dG9Mb2NrZXIgbG9ja2VyKGNvbnRleHQoKSk7CisgICAgYXV0byBsb2NrZXIgPSBo
b2xkTG9jayhjb250ZXh0KCkuZ3JhcGhMb2NrKCkpOwogCiAgICAgaWYgKG91dHB1dEluZGV4ID49
IG51bWJlck9mT3V0cHV0cygpKQogICAgICAgICByZXR1cm4gRXhjZXB0aW9uIHsgSW5kZXhTaXpl
RXJyb3IsICJvdXRwdXQgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyJfcyB9OwpAQCAtMjY1LDcgKzI2
NSw3IEBAIEV4Y2VwdGlvbk9yPHZvaWQ+IEF1ZGlvTm9kZTo6ZGlzY29ubmVjdCh1bnNpZ25lZCBv
dXRwdXRJbmRleCkKIEV4Y2VwdGlvbk9yPHZvaWQ+IEF1ZGlvTm9kZTo6ZGlzY29ubmVjdChBdWRp
b05vZGUmIGRlc3RpbmF0aW9uTm9kZSkKIHsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwot
ICAgIEJhc2VBdWRpb0NvbnRleHQ6OkF1dG9Mb2NrZXIgbG9ja2VyKGNvbnRleHQoKSk7CisgICAg
YXV0byBsb2NrZXIgPSBob2xkTG9jayhjb250ZXh0KCkuZ3JhcGhMb2NrKCkpOwogCiAgICAgYm9v
bCBkaWREaXNjb25uZWN0aW9uID0gZmFsc2U7CiAgICAgZm9yICh1bnNpZ25lZCBvdXRwdXRJbmRl
eCA9IDA7IG91dHB1dEluZGV4IDwgbnVtYmVyT2ZPdXRwdXRzKCk7ICsrb3V0cHV0SW5kZXgpIHsK
QEAgLTI4OSw3ICsyODksNyBAQCBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OmRpc2Nvbm5l
Y3QoQXVkaW9Ob2RlJiBkZXN0aW5hdGlvbk5vZGUpCiBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb05v
ZGU6OmRpc2Nvbm5lY3QoQXVkaW9Ob2RlJiBkZXN0aW5hdGlvbk5vZGUsIHVuc2lnbmVkIG91dHB1
dEluZGV4KQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgQmFzZUF1ZGlvQ29u
dGV4dDo6QXV0b0xvY2tlciBsb2NrZXIoY29udGV4dCgpKTsKKyAgICBhdXRvIGxvY2tlciA9IGhv
bGRMb2NrKGNvbnRleHQoKS5ncmFwaExvY2soKSk7CiAKICAgICBpZiAob3V0cHV0SW5kZXggPj0g
bnVtYmVyT2ZPdXRwdXRzKCkpCiAgICAgICAgIHJldHVybiBFeGNlcHRpb24geyBJbmRleFNpemVF
cnJvciwgIm91dHB1dCBpbmRleCBpcyBvdXQgb2YgYm91bmRzIl9zIH07CkBAIC0zMTQsNyArMzE0
LDcgQEAgRXhjZXB0aW9uT3I8dm9pZD4gQXVkaW9Ob2RlOjpkaXNjb25uZWN0KEF1ZGlvTm9kZSYg
ZGVzdGluYXRpb25Ob2RlLCB1bnNpZ25lZCBvdXQKIEV4Y2VwdGlvbk9yPHZvaWQ+IEF1ZGlvTm9k
ZTo6ZGlzY29ubmVjdChBdWRpb05vZGUmIGRlc3RpbmF0aW9uTm9kZSwgdW5zaWduZWQgb3V0cHV0
SW5kZXgsIHVuc2lnbmVkIGlucHV0SW5kZXgpCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgp
KTsKLSAgICBCYXNlQXVkaW9Db250ZXh0OjpBdXRvTG9ja2VyIGxvY2tlcihjb250ZXh0KCkpOwor
ICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2soY29udGV4dCgpLmdyYXBoTG9jaygpKTsKIAogICAg
IGlmIChvdXRwdXRJbmRleCA+PSBudW1iZXJPZk91dHB1dHMoKSkKICAgICAgICAgcmV0dXJuIEV4
Y2VwdGlvbiB7IEluZGV4U2l6ZUVycm9yLCAib3V0cHV0IGluZGV4IGlzIG91dCBvZiBib3VuZHMi
X3MgfTsKQEAgLTMzNiw3ICszMzYsNyBAQCBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OmRp
c2Nvbm5lY3QoQXVkaW9Ob2RlJiBkZXN0aW5hdGlvbk5vZGUsIHVuc2lnbmVkIG91dAogRXhjZXB0
aW9uT3I8dm9pZD4gQXVkaW9Ob2RlOjpkaXNjb25uZWN0KEF1ZGlvUGFyYW0mIGRlc3RpbmF0aW9u
UGFyYW0pCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLSAgICBCYXNlQXVkaW9Db250
ZXh0OjpBdXRvTG9ja2VyIGxvY2tlcihjb250ZXh0KCkpOworICAgIGF1dG8gbG9ja2VyID0gaG9s
ZExvY2soY29udGV4dCgpLmdyYXBoTG9jaygpKTsKIAogICAgIGJvb2wgZGlkRGlzY29ubmVjdGlv
biA9IGZhbHNlOwogICAgIGZvciAodW5zaWduZWQgb3V0cHV0SW5kZXggPSAwOyBvdXRwdXRJbmRl
eCA8IG51bWJlck9mT3V0cHV0cygpOyArK291dHB1dEluZGV4KSB7CkBAIC0zNTcsNyArMzU3LDcg
QEAgRXhjZXB0aW9uT3I8dm9pZD4gQXVkaW9Ob2RlOjpkaXNjb25uZWN0KEF1ZGlvUGFyYW0mIGRl
c3RpbmF0aW9uUGFyYW0pCiBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OmRpc2Nvbm5lY3Qo
QXVkaW9QYXJhbSYgZGVzdGluYXRpb25QYXJhbSwgdW5zaWduZWQgb3V0cHV0SW5kZXgpCiB7CiAg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLSAgICBCYXNlQXVkaW9Db250ZXh0OjpBdXRvTG9j
a2VyIGxvY2tlcihjb250ZXh0KCkpOworICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2soY29udGV4
dCgpLmdyYXBoTG9jaygpKTsKIAogICAgIGlmIChvdXRwdXRJbmRleCA+PSBudW1iZXJPZk91dHB1
dHMoKSkKICAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbiB7IEluZGV4U2l6ZUVycm9yLCAib3V0cHV0
IGluZGV4IGlzIG91dCBvZiBib3VuZHMiX3MgfTsKQEAgLTM4MCw3ICszODAsNyBAQCBmbG9hdCBB
dWRpb05vZGU6OnNhbXBsZVJhdGUoKSBjb25zdAogRXhjZXB0aW9uT3I8dm9pZD4gQXVkaW9Ob2Rl
OjpzZXRDaGFubmVsQ291bnQodW5zaWduZWQgY2hhbm5lbENvdW50KQogewogICAgIEFTU0VSVChp
c01haW5UaHJlYWQoKSk7Ci0gICAgQmFzZUF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBsb2NrZXIo
Y29udGV4dCgpKTsKKyAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKGNvbnRleHQoKS5ncmFwaExv
Y2soKSk7CiAKICAgICBBTFdBWVNfTE9HKExPR0lERU5USUZJRVIsIGNoYW5uZWxDb3VudCk7CiAK
QEAgLTQwMiw3ICs0MDIsNyBAQCBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OnNldENoYW5u
ZWxDb3VudCh1bnNpZ25lZCBjaGFubmVsQ291bnQpCiBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb05v
ZGU6OnNldENoYW5uZWxDb3VudE1vZGUoQ2hhbm5lbENvdW50TW9kZSBtb2RlKQogewogICAgIEFT
U0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgQmFzZUF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBs
b2NrZXIoY29udGV4dCgpKTsKKyAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKGNvbnRleHQoKS5n
cmFwaExvY2soKSk7CiAKICAgICBBTFdBWVNfTE9HKExPR0lERU5USUZJRVIsIG1vZGUpOwogICAg
IApAQCAtNDE4LDcgKzQxOCw3IEBAIEV4Y2VwdGlvbk9yPHZvaWQ+IEF1ZGlvTm9kZTo6c2V0Q2hh
bm5lbENvdW50TW9kZShDaGFubmVsQ291bnRNb2RlIG1vZGUpCiBFeGNlcHRpb25Pcjx2b2lkPiBB
dWRpb05vZGU6OnNldENoYW5uZWxJbnRlcnByZXRhdGlvbihDaGFubmVsSW50ZXJwcmV0YXRpb24g
aW50ZXJwcmV0YXRpb24pCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLSAgICBCYXNl
QXVkaW9Db250ZXh0OjpBdXRvTG9ja2VyIGxvY2tlcihjb250ZXh0KCkpOworICAgIGF1dG8gbG9j
a2VyID0gaG9sZExvY2soY29udGV4dCgpLmdyYXBoTG9jaygpKTsKIAogICAgIEFMV0FZU19MT0co
TE9HSURFTlRJRklFUiwgaW50ZXJwcmV0YXRpb24pOwogICAgIApAQCAtNTIzLDcgKzUyMyw3IEBA
IHZvaWQgQXVkaW9Ob2RlOjplbmFibGVPdXRwdXRzSWZOZWNlc3NhcnkoKQogewogICAgIGlmICht
X2lzRGlzYWJsZWQgJiYgbV9jb25uZWN0aW9uUmVmQ291bnQgPiAwKSB7CiAgICAgICAgIEFTU0VS
VChpc01haW5UaHJlYWQoKSk7Ci0gICAgICAgIEJhc2VBdWRpb0NvbnRleHQ6OkF1dG9Mb2NrZXIg
bG9ja2VyKGNvbnRleHQoKSk7CisgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2soY29udGV4
dCgpLmdyYXBoTG9jaygpKTsKIAogICAgICAgICBtX2lzRGlzYWJsZWQgPSBmYWxzZTsKICAgICAg
ICAgZm9yIChhdXRvJiBvdXRwdXQgOiBtX291dHB1dHMpCkBAIC01NzgsMjMgKzU3OCw5IEBAIHZv
aWQgQXVkaW9Ob2RlOjpkZWNyZW1lbnRDb25uZWN0aW9uQ291bnQoKQogewogICAgIC8vIFRoZSBh
Y3R1YWxseSB3b3JrIGZvciBkZXJlZiBoYXBwZW5zIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBhdWRp
byBjb250ZXh0J3MgZ3JhcGggbG9jay4KICAgICAvLyBJbiB0aGUgY2FzZSBvZiB0aGUgYXVkaW8g
dGhyZWFkLCB3ZSBtdXN0IHVzZSBhIHRyeUxvY2sgdG8gYXZvaWQgZ2xpdGNoZXMuCi0gICAgYm9v
bCBoYXNMb2NrID0gZmFsc2U7Ci0gICAgYm9vbCBtdXN0UmVsZWFzZUxvY2sgPSBmYWxzZTsKLQot
ICAgIGlmIChjb250ZXh0KCkuaXNBdWRpb1RocmVhZCgpKSB7Ci0gICAgICAgIC8vIFJlYWwtdGlt
ZSBhdWRpbyB0aHJlYWQgbXVzdCBub3QgY29udGVuZCBsb2NrICh0byBhdm9pZCBnbGl0Y2hlcyku
Ci0gICAgICAgIGhhc0xvY2sgPSBjb250ZXh0KCkudHJ5TG9jayhtdXN0UmVsZWFzZUxvY2spOwot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnRleHQoKS5sb2NrKG11c3RSZWxlYXNlTG9jayk7Ci0g
ICAgICAgIGhhc0xvY2sgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChoYXNMb2NrKSB7CisgICAg
aWYgKGF1dG8gbG9ja2VyID0gY29udGV4dCgpLmlzQXVkaW9UaHJlYWQoKSA/IHRyeUhvbGRMb2Nr
KGNvbnRleHQoKS5ncmFwaExvY2soKSkgOiBob2xkTG9jayhjb250ZXh0KCkuZ3JhcGhMb2NrKCkp
KSB7CiAgICAgICAgIC8vIFRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgZGVyZWYgd29yayBoYXBwZW5z
LgogICAgICAgICBkZWNyZW1lbnRDb25uZWN0aW9uQ291bnRXaXRoTG9jaygpOwotCi0gICAgICAg
IGlmIChtdXN0UmVsZWFzZUxvY2spCi0gICAgICAgICAgICBjb250ZXh0KCkudW5sb2NrKCk7CiAg
ICAgfSBlbHNlIHsKICAgICAgICAgLy8gV2Ugd2VyZSB1bmFibGUgdG8gZ2V0IHRoZSBsb2NrLCBz
byBwdXQgdGhpcyBpbiBhIGxpc3QgdG8gZmluaXNoIHVwIGxhdGVyLgogICAgICAgICBBU1NFUlQo
Y29udGV4dCgpLmlzQXVkaW9UaHJlYWQoKSk7CkBAIC02NjAsNyArNjQ2LDcgQEAgdm9pZCBBdWRp
b05vZGU6OmRlcmVmKCkKICAgICBBU1NFUlQoIWNvbnRleHQoKS5pc0F1ZGlvVGhyZWFkKCkpOwog
CiAgICAgewotICAgICAgICBCYXNlQXVkaW9Db250ZXh0OjpBdXRvTG9ja2VyIGxvY2tlcihjb250
ZXh0KCkpOworICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKGNvbnRleHQoKS5ncmFwaExv
Y2soKSk7CiAgICAgICAgIC8vIFRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgZGVyZWYgd29yayBoYXBw
ZW5zLgogICAgICAgICBkZXJlZldpdGhMb2NrKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb1dvcmtsZXROb2RlLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Xb3JrbGV0Tm9kZS5jcHAKaW5kZXggOWM0MWQx
MzY5MjNmNjdjZmI0MDZhNjIzM2I2NGQ1N2QxMWFjYjBjMC4uNWFlZmNkZWZiODdjMDRlMTA0OGNh
MjgyYmUyODkwYWFhN2UyZGQzYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93
ZWJhdWRpby9BdWRpb1dvcmtsZXROb2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmF1ZGlvL0F1ZGlvV29ya2xldE5vZGUuY3BwCkBAIC0xMTMsNyArMTEzLDcgQEAgRXhjZXB0
aW9uT3I8UmVmPEF1ZGlvV29ya2xldE5vZGU+PiBBdWRpb1dvcmtsZXROb2RlOjpjcmVhdGUoSlND
OjpKU0dsb2JhbE9iamVjdCYKIAogICAgIHsKICAgICAgICAgLy8gVGhlIG5vZGUgc2hvdWxkIGJl
IG1hbnVhbGx5IGFkZGVkIHRvIHRoZSBhdXRvbWF0aWMgcHVsbCBub2RlIGxpc3QsIGV2ZW4gd2l0
aG91dCBhIGNvbm5lY3QoKSBjYWxsLgotICAgICAgICBCYXNlQXVkaW9Db250ZXh0OjpBdXRvTG9j
a2VyIGNvbnRleHRMb2NrZXIoY29udGV4dCk7CisgICAgICAgIGF1dG8gY29udGV4dExvY2tlciA9
IGhvbGRMb2NrKGNvbnRleHQuZ3JhcGhMb2NrKCkpOwogICAgICAgICBub2RlLT51cGRhdGVQdWxs
U3RhdHVzKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dl
YmF1ZGlvL0Jhc2VBdWRpb0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJh
dWRpby9CYXNlQXVkaW9Db250ZXh0LmNwcAppbmRleCA0NmJlNmU1MjgwNzU3ZDI0MzEyZGI0Y2Ji
YmI1ZTMwZThmMmQwYzk1Li5kMDg1MGU1YzY3OGE5ZTRlZGYzNjNjZWM3MTY3NDU2NWIxMDJlYzg2
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0Jhc2VBdWRpb0Nv
bnRleHQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQmFzZUF1ZGlv
Q29udGV4dC5jcHAKQEAgLTE5OSw5ICsxOTksOSBAQCB2b2lkIEJhc2VBdWRpb0NvbnRleHQ6OnVu
aW5pdGlhbGl6ZSgpCiAgICAgbV9pc0F1ZGlvVGhyZWFkRmluaXNoZWQgPSB0cnVlOwogCiAgICAg
ewotICAgICAgICBBdXRvTG9ja2VyIGxvY2tlcigqdGhpcyk7CisgICAgICAgIGF1dG8gbG9ja2Vy
ID0gaG9sZExvY2soZ3JhcGhMb2NrKCkpOwogICAgICAgICAvLyBUaGlzIHNob3VsZCBoYXZlIGJl
ZW4gY2FsbGVkIGZyb20gaGFuZGxlUG9zdFJlbmRlclRhc2tzKCkgYXQgdGhlIGVuZCBvZiByZW5k
ZXJpbmcuCi0gICAgICAgIC8vIEhvd2V2ZXIsIGluIGNhc2Ugb2YgbG9jayBjb250ZW50aW9uLCB0
aGUgdHJ5TG9jaygpIGNhbGwgY291bGQgaGF2ZSBmYWlsZWQgaW4gaGFuZGxlUG9zdFJlbmRlclRh
c2tzKCksCisgICAgICAgIC8vIEhvd2V2ZXIsIGluIGNhc2Ugb2YgbG9jayBjb250ZW50aW9uLCB0
aGUgdHJ5SG9sZExvY2soZ3JhcGhMb2NrKCkpIGNhbGwgY291bGQgaGF2ZSBmYWlsZWQgaW4gaGFu
ZGxlUG9zdFJlbmRlclRhc2tzKCksCiAgICAgICAgIC8vIGxlYXZpbmcgbm9kZXMgaW4gbV9yZWZl
cmVuY2VkU291cmNlTm9kZXMuIE5vdyB0aGF0IHRoZSBhdWRpbyB0aHJlYWQgaXMgZ29uZSwgbWFr
ZSBzdXJlIHdlIGRlcmVmIHRob3NlIG5vZGVzCiAgICAgICAgIC8vIGJlZm9yZSB0aGUgQmFzZUF1
ZGlvQ29udGV4dCBnZXRzIGRlc3Ryb3llZC4KICAgICAgICAgZGVyZWZGaW5pc2hlZFNvdXJjZU5v
ZGVzKCk7CkBAIC01MjQsNyArNTI0LDcgQEAgdm9pZCBCYXNlQXVkaW9Db250ZXh0OjpkZXJlZkZp
bmlzaGVkU291cmNlTm9kZXMoKQogdm9pZCBCYXNlQXVkaW9Db250ZXh0OjpyZWZTb3VyY2VOb2Rl
KEF1ZGlvTm9kZSYgbm9kZSkKIHsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIEF1
dG9Mb2NrZXIgbG9ja2VyKCp0aGlzKTsKKyAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKGdyYXBo
TG9jaygpKTsKIAogICAgIEFTU0VSVCghbV9yZWZlcmVuY2VkU291cmNlTm9kZXMuY29udGFpbnMo
Jm5vZGUpKTsKICAgICAvLyBSZWZlcmVuY2Ugc291cmNlIG5vZGUgdG8ga2VlcCBpdCBhbGl2ZSBh
bmQgcGxheWluZyBldmVuIGlmIGl0cyBKUyB3cmFwcGVyIGdldHMgZ2FyYmFnZSBjb2xsZWN0ZWQu
CkBAIC01NDUsNzAgKzU0NSwxMiBAQCB2b2lkIEJhc2VBdWRpb0NvbnRleHQ6OmRlcmVmVW5maW5p
c2hlZFNvdXJjZU5vZGVzKCkKICAgICBtX3JlZmVyZW5jZWRTb3VyY2VOb2Rlcy5jbGVhcigpOwog
fQogCi12b2lkIEJhc2VBdWRpb0NvbnRleHQ6OmxvY2soYm9vbCYgbXVzdFJlbGVhc2VMb2NrKQot
ewotICAgIC8vIERvbid0IGFsbG93IHJlZ3VsYXIgbG9jayBpbiByZWFsLXRpbWUgYXVkaW8gdGhy
ZWFkLgotICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0KLSAgICBsb2NrSW50ZXJuYWwobXVz
dFJlbGVhc2VMb2NrKTsKLX0KLQotdm9pZCBCYXNlQXVkaW9Db250ZXh0Ojpsb2NrSW50ZXJuYWwo
Ym9vbCYgbXVzdFJlbGVhc2VMb2NrKQotewotICAgIFRocmVhZCYgdGhpc1RocmVhZCA9IFRocmVh
ZDo6Y3VycmVudCgpOwotCi0gICAgaWYgKCZ0aGlzVGhyZWFkID09IG1fZ3JhcGhPd25lclRocmVh
ZCkgewotICAgICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGxvY2suCi0gICAgICAgIG11c3RS
ZWxlYXNlTG9jayA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFjcXVpcmUgdGhl
IGxvY2suCi0gICAgICAgIG1fY29udGV4dEdyYXBoTG9jay5sb2NrKCk7Ci0gICAgICAgIG1fZ3Jh
cGhPd25lclRocmVhZCA9ICZ0aGlzVGhyZWFkOwotICAgICAgICBtdXN0UmVsZWFzZUxvY2sgPSB0
cnVlOwotICAgIH0KLX0KLQotYm9vbCBCYXNlQXVkaW9Db250ZXh0Ojp0cnlMb2NrKGJvb2wmIG11
c3RSZWxlYXNlTG9jaykKLXsKLSAgICAvLyBUcnkgdG8gY2F0Y2ggY2FzZXMgb2YgdXNpbmcgdHJ5
IGxvY2sgb24gbWFpbiB0aHJlYWQgLSBpdCBzaG91bGQgdXNlIHJlZ3VsYXIgbG9jay4KLSAgICBB
U1NFUlQoaXNBdWRpb1RocmVhZCgpIHx8IGlzQXVkaW9UaHJlYWRGaW5pc2hlZCgpKTsKLSAgICAK
LSAgICBpZiAoIWlzQXVkaW9UaHJlYWQoKSkgewotICAgICAgICAvLyBJbiByZWxlYXNlIGJ1aWxk
IHRyZWF0IHRyeUxvY2soKSBhcyBsb2NrKCkgKHNpbmNlIGFib3ZlIEFTU0VSVChpc0F1ZGlvVGhy
ZWFkKSBuZXZlciBmaXJlcykgLSB0aGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBkby4KLSAgICAgICAg
bG9jayhtdXN0UmVsZWFzZUxvY2spOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAg
Ci0gICAgYm9vbCBoYXNMb2NrOwotICAgIAotICAgIGlmIChpc0dyYXBoT3duZXIoKSkgewotICAg
ICAgICAvLyBUaHJlYWQgYWxyZWFkeSBoYXMgdGhlIGxvY2suCi0gICAgICAgIGhhc0xvY2sgPSB0
cnVlOwotICAgICAgICBtdXN0UmVsZWFzZUxvY2sgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAg
ICAgICAvLyBEb24ndCBhbHJlYWR5IGhhdmUgdGhlIGxvY2sgLSB0cnkgdG8gYWNxdWlyZSBpdC4K
LSAgICAgICAgaGFzTG9jayA9IG1fY29udGV4dEdyYXBoTG9jay50cnlMb2NrKCk7Ci0gICAgICAg
IAotICAgICAgICBpZiAoaGFzTG9jaykKLSAgICAgICAgICAgIG1fZ3JhcGhPd25lclRocmVhZCA9
ICZUaHJlYWQ6OmN1cnJlbnQoKTsKLQotICAgICAgICBtdXN0UmVsZWFzZUxvY2sgPSBoYXNMb2Nr
OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaGFzTG9jazsKLX0KLQotdm9pZCBCYXNlQXVkaW9D
b250ZXh0Ojp1bmxvY2soKQotewotICAgIEFTU0VSVChtX2dyYXBoT3duZXJUaHJlYWQgPT0gJlRo
cmVhZDo6Y3VycmVudCgpKTsKLQotICAgIG1fZ3JhcGhPd25lclRocmVhZCA9IG51bGxwdHI7Ci0g
ICAgbV9jb250ZXh0R3JhcGhMb2NrLnVubG9jaygpOwotfQotCiB2b2lkIEJhc2VBdWRpb0NvbnRl
eHQ6OmFkZERlZmVycmVkRGVjcmVtZW50Q29ubmVjdGlvbkNvdW50KEF1ZGlvTm9kZSogbm9kZSkK
IHsKICAgICBBU1NFUlQoaXNBdWRpb1RocmVhZCgpKTsKKyAgICAvLyBIZWFwIGFsbG9jYXRpb25z
IGFyZSBmb3JiaWRkZW4gb24gdGhlIGF1ZGlvIHRocmVhZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29u
cyBzbyB3ZSBuZWVkIHRvCisgICAgLy8gZXhwbGljaXRseSBhbGxvdyB0aGUgZm9sbG93aW5nIGFs
bG9jYXRpb24ocykuCisgICAgRGlzYWJsZU1hbGxvY1Jlc3RyaWN0aW9uc0ZvckN1cnJlbnRUaHJl
YWRTY29wZSBkaXNhYmxlTWFsbG9jUmVzdHJpY3Rpb25zOwogICAgIG1fZGVmZXJyZWRCcmVha0Nv
bm5lY3Rpb25MaXN0LmFwcGVuZChub2RlKTsKIH0KIApAQCAtNjE3LDI1ICs1NTksMjEgQEAgdm9p
ZCBCYXNlQXVkaW9Db250ZXh0OjpoYW5kbGVQcmVSZW5kZXJUYXNrcyhjb25zdCBBdWRpb0lPUG9z
aXRpb24mIG91dHB1dFBvc2l0aW8KICAgICBBU1NFUlQoaXNBdWRpb1RocmVhZCgpKTsKIAogICAg
IC8vIEF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgcmVuZGVyIHF1YW50dW0sIHRyeSB0byB1cGRh
dGUgdGhlIGludGVybmFsIHJlbmRlcmluZyBncmFwaCBzdGF0ZSAoZnJvbSBtYWluIHRocmVhZCBj
aGFuZ2VzKS4KLSAgICAvLyBJdCdzIE9LIGlmIHRoZSB0cnlMb2NrKCkgZmFpbHMsIHdlJ2xsIGp1
c3QgdGFrZSBzbGlnaHRseSBsb25nZXIgdG8gcGljayB1cCB0aGUgY2hhbmdlcy4KLSAgICBib29s
IG11c3RSZWxlYXNlTG9jazsKLSAgICBpZiAodHJ5TG9jayhtdXN0UmVsZWFzZUxvY2spKSB7Cisg
ICAgLy8gSXQncyBPSyBpZiB0aGUgdHJ5SG9sZExvY2soKSBmYWlscywgd2UnbGwganVzdCB0YWtl
IHNsaWdodGx5IGxvbmdlciB0byBwaWNrIHVwIHRoZSBjaGFuZ2VzLgorICAgIGlmIChhdXRvIGxv
Y2tlciA9IHRyeUhvbGRMb2NrKGdyYXBoTG9jaygpKSkgewogICAgICAgICAvLyBGaXh1cCB0aGUg
c3RhdGUgb2YgYW55IGRpcnR5IEF1ZGlvU3VtbWluZ0p1bmN0aW9ucyBhbmQgQXVkaW9Ob2RlT3V0
cHV0cy4KICAgICAgICAgaGFuZGxlRGlydHlBdWRpb1N1bW1pbmdKdW5jdGlvbnMoKTsKICAgICAg
ICAgaGFuZGxlRGlydHlBdWRpb05vZGVPdXRwdXRzKCk7CiAKICAgICAgICAgdXBkYXRlQXV0b21h
dGljUHVsbE5vZGVzKCk7CiAgICAgICAgIG1fb3V0cHV0UG9zaXRpb24gPSBvdXRwdXRQb3NpdGlv
bjsKLQotICAgICAgICBpZiAobXVzdFJlbGVhc2VMb2NrKQotICAgICAgICAgICAgdW5sb2NrKCk7
CiAgICAgfQogfQogCiBBdWRpb0lPUG9zaXRpb24gQmFzZUF1ZGlvQ29udGV4dDo6b3V0cHV0UG9z
aXRpb24oKQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgQXV0b0xvY2tlciBs
b2NrZXIoKnRoaXMpOworICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2soZ3JhcGhMb2NrKCkpOwog
ICAgIHJldHVybiBtX291dHB1dFBvc2l0aW9uOwogfQogCkBAIC02NDMsMTQgKzU4MSwxNCBAQCB2
b2lkIEJhc2VBdWRpb0NvbnRleHQ6OmhhbmRsZVBvc3RSZW5kZXJUYXNrcygpCiB7CiAgICAgQVNT
RVJUKGlzQXVkaW9UaHJlYWQoKSk7CiAKLSAgICAvLyBNdXN0IHVzZSBhIHRyeUxvY2soKSBoZXJl
IHRvby4gRG9uJ3Qgd29ycnksIHRoZSBsb2NrIHdpbGwgdmVyeSByYXJlbHkgYmUgY29udGVuZGVk
IGFuZCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJlcXVlbnRseS4KKyAgICAvLyBNdXN0IHVzZSBh
IHRyeUhvbGRMb2NrKCkgaGVyZSB0b28uIERvbid0IHdvcnJ5LCB0aGUgbG9jayB3aWxsIHZlcnkg
cmFyZWx5IGJlIGNvbnRlbmRlZCBhbmQgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyZXF1ZW50bHku
CiAgICAgLy8gVGhlIHdvcnN0IHRoYXQgY2FuIGhhcHBlbiBpcyB0aGF0IHRoZXJlIHdpbGwgYmUg
c29tZSBub2RlcyB3aGljaCB3aWxsIHRha2Ugc2xpZ2h0bHkgbG9uZ2VyIHRoYW4gdXN1YWwgdG8g
YmUgZGVsZXRlZCBvciByZW1vdmVkCiAgICAgLy8gZnJvbSB0aGUgcmVuZGVyIGdyYXBoIChpbiB3
aGljaCBjYXNlIHRoZXknbGwgcmVuZGVyIHNpbGVuY2UpLgotICAgIGJvb2wgbXVzdFJlbGVhc2VM
b2NrOwotICAgIGlmICghdHJ5TG9jayhtdXN0UmVsZWFzZUxvY2spKQorICAgIGF1dG8gbG9ja2Vy
ID0gdHJ5SG9sZExvY2soZ3JhcGhMb2NrKCkpOworICAgIGlmICghbG9ja2VyKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICAvLyBUYWtlIGNhcmUgb2YgZmluaXNoaW5nIGFueSBkZXJlZnMgd2hlcmUg
dGhlIHRyeUxvY2soKSBmYWlsZWQgcHJldmlvdXNseS4KKyAgICAvLyBUYWtlIGNhcmUgb2YgZmlu
aXNoaW5nIGFueSBkZXJlZnMgd2hlcmUgdGhlIHRyeUhvbGRMb2NrKCkgZmFpbGVkIHByZXZpb3Vz
bHkuCiAgICAgaGFuZGxlRGVmZXJyZWREZWNyZW1lbnRDb25uZWN0aW9uQ291bnRzKCk7CiAKICAg
ICAvLyBEeW5hbWljYWxseSBjbGVhbiB1cCBub2RlcyB3aGljaCBhcmUgbm8gbG9uZ2VyIG5lZWRl
ZC4KQEAgLTY2NSw5ICs2MDMsNiBAQCB2b2lkIEJhc2VBdWRpb0NvbnRleHQ6OmhhbmRsZVBvc3RS
ZW5kZXJUYXNrcygpCiAgICAgaGFuZGxlRGlydHlBdWRpb05vZGVPdXRwdXRzKCk7CiAKICAgICB1
cGRhdGVBdXRvbWF0aWNQdWxsTm9kZXMoKTsKLQotICAgIGlmIChtdXN0UmVsZWFzZUxvY2spCi0g
ICAgICAgIHVubG9jaygpOwogfQogCiB2b2lkIEJhc2VBdWRpb0NvbnRleHQ6OmhhbmRsZURlZmVy
cmVkRGVjcmVtZW50Q29ubmVjdGlvbkNvdW50cygpCkBAIC03MjcsMTAgKzY2MiwxMCBAQCB2b2lk
IEJhc2VBdWRpb0NvbnRleHQ6OmRlbGV0ZU1hcmtlZE5vZGVzKCkKIHsKICAgICBBU1NFUlQoaXNN
YWluVGhyZWFkKCkpOwogCi0gICAgLy8gUHJvdGVjdCB0aGlzIG9iamVjdCBmcm9tIGJlaW5nIGRl
bGV0ZWQgYmVmb3JlIHdlIHJlbGVhc2UgdGhlIG11dGV4IGxvY2tlZCBieSBBdXRvTG9ja2VyLgor
ICAgIC8vIFByb3RlY3QgdGhpcyBvYmplY3QgZnJvbSBiZWluZyBkZWxldGVkIGJlZm9yZSB3ZSBy
ZWxlYXNlIHRoZSBsb2NrLgogICAgIGF1dG8gcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMp
OwogCi0gICAgQXV0b0xvY2tlciBsb2NrZXIoKnRoaXMpOworICAgIGF1dG8gbG9ja2VyID0gaG9s
ZExvY2soZ3JhcGhMb2NrKCkpOwogCiAgICAgd2hpbGUgKG1fbm9kZXNUb0RlbGV0ZS5zaXplKCkp
IHsKICAgICAgICAgQXVkaW9Ob2RlKiBub2RlID0gbV9ub2Rlc1RvRGVsZXRlLnRha2VMYXN0KCk7
CkBAIC03NjUsNyArNzAwLDcgQEAgdm9pZCBCYXNlQXVkaW9Db250ZXh0OjptYXJrU3VtbWluZ0p1
bmN0aW9uRGlydHkoQXVkaW9TdW1taW5nSnVuY3Rpb24qIHN1bW1pbmdKdW4KIHZvaWQgQmFzZUF1
ZGlvQ29udGV4dDo6cmVtb3ZlTWFya2VkU3VtbWluZ0p1bmN0aW9uKEF1ZGlvU3VtbWluZ0p1bmN0
aW9uKiBzdW1taW5nSnVuY3Rpb24pCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLSAg
ICBBdXRvTG9ja2VyIGxvY2tlcigqdGhpcyk7CisgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhn
cmFwaExvY2soKSk7CiAgICAgbV9kaXJ0eVN1bW1pbmdKdW5jdGlvbnMucmVtb3ZlKHN1bW1pbmdK
dW5jdGlvbik7CiB9CiAKQEAgLTc4Miw3ICs3MTcsNyBAQCB2b2lkIEJhc2VBdWRpb0NvbnRleHQ6
Om1hcmtBdWRpb05vZGVPdXRwdXREaXJ0eShBdWRpb05vZGVPdXRwdXQqIG91dHB1dCkKIAogdm9p
ZCBCYXNlQXVkaW9Db250ZXh0OjpoYW5kbGVEaXJ0eUF1ZGlvU3VtbWluZ0p1bmN0aW9ucygpCiB7
Ci0gICAgQVNTRVJUKGlzR3JhcGhPd25lcigpKTsgICAgCisgICAgQVNTRVJUKGlzR3JhcGhPd25l
cigpKTsKIAogICAgIGZvciAoYXV0byYganVuY3Rpb24gOiBtX2RpcnR5U3VtbWluZ0p1bmN0aW9u
cykKICAgICAgICAganVuY3Rpb24tPnVwZGF0ZVJlbmRlcmluZ1N0YXRlKCk7CkBAIC03OTIsNyAr
NzI3LDcgQEAgdm9pZCBCYXNlQXVkaW9Db250ZXh0OjpoYW5kbGVEaXJ0eUF1ZGlvU3VtbWluZ0p1
bmN0aW9ucygpCiAKIHZvaWQgQmFzZUF1ZGlvQ29udGV4dDo6aGFuZGxlRGlydHlBdWRpb05vZGVP
dXRwdXRzKCkKIHsKLSAgICBBU1NFUlQoaXNHcmFwaE93bmVyKCkpOyAgICAKKyAgICBBU1NFUlQo
aXNHcmFwaE93bmVyKCkpOwogCiAgICAgZm9yIChhdXRvJiBvdXRwdXQgOiBtX2RpcnR5QXVkaW9O
b2RlT3V0cHV0cykKICAgICAgICAgb3V0cHV0LT51cGRhdGVSZW5kZXJpbmdTdGF0ZSgpOwpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9CYXNlQXVkaW9Db250ZXh0
LmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0Jhc2VBdWRpb0NvbnRleHQuaApp
bmRleCBkOWZlMmI1YTYxYmQwMWI3NWZlNTk2Yzk3MmRjNmRiNGZhNWMwOGY0Li5mYWI3N2E5M2Jj
YzMxMjFkZmEyODhjMTgyOGQyM2U1NTU4ZGY5ZmI5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL3dlYmF1ZGlvL0Jhc2VBdWRpb0NvbnRleHQuaAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL3dlYmF1ZGlvL0Jhc2VBdWRpb0NvbnRleHQuaApAQCAtMzgsNiArMzgsNyBAQAog
I2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAjaW5jbHVkZSA8d3RmL0xvZ2dlckhlbHBlci5oPgog
I2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CisjaW5jbHVkZSA8d3RmL1JlY3Vyc2l2ZUxvY2tB
ZGFwdGVyLmg+CiAjaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+CiAjaW5jbHVk
ZSA8d3RmL1RocmVhZGluZy5oPgogCkBAIC0xODYsMTcgKzE4NywxMCBAQCBwdWJsaWM6CiAgICAg
Ly8gUmV0dXJucyB0cnVlIG9ubHkgYWZ0ZXIgdGhlIGF1ZGlvIHRocmVhZCBoYXMgYmVlbiBzdGFy
dGVkIGFuZCB0aGVuIHNodXRkb3duLgogICAgIGJvb2wgaXNBdWRpb1RocmVhZEZpbmlzaGVkKCkg
Y29uc3QgeyByZXR1cm4gbV9pc0F1ZGlvVGhyZWFkRmluaXNoZWQ7IH0KIAotICAgIC8vIG11c3RS
ZWxlYXNlTG9jayBpcyBzZXQgdG8gdHJ1ZSBpZiB3ZSBhY3F1aXJlZCB0aGUgbG9jayBpbiB0aGlz
IG1ldGhvZCBjYWxsIGFuZCBjYWxsZXIgbXVzdCB1bmxvY2soKSwgZmFsc2UgaWYgaXQgd2FzIHBy
ZXZpb3VzbHkgYWNxdWlyZWQuCi0gICAgdm9pZCBsb2NrKGJvb2wmIG11c3RSZWxlYXNlTG9jayk7
Ci0KLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgd2Ugb3duIHRoZSBsb2NrLgotICAgIC8vIG11c3RS
ZWxlYXNlTG9jayBpcyBzZXQgdG8gdHJ1ZSBpZiB3ZSBhY3F1aXJlZCB0aGUgbG9jayBpbiB0aGlz
IG1ldGhvZCBjYWxsIGFuZCBjYWxsZXIgbXVzdCB1bmxvY2soKSwgZmFsc2UgaWYgaXQgd2FzIHBy
ZXZpb3VzbHkgYWNxdWlyZWQuCi0gICAgYm9vbCB0cnlMb2NrKGJvb2wmIG11c3RSZWxlYXNlTG9j
ayk7Ci0KLSAgICB2b2lkIHVubG9jaygpOworICAgIFJlY3Vyc2l2ZUxvY2smIGdyYXBoTG9jaygp
IHsgcmV0dXJuIG1fZ3JhcGhMb2NrOyB9CiAKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0
aHJlYWQgb3ducyB0aGUgY29udGV4dCdzIGxvY2suCi0gICAgYm9vbCBpc0dyYXBoT3duZXIoKSBj
b25zdCB7IHJldHVybiBtX2dyYXBoT3duZXJUaHJlYWQgPT0gJlRocmVhZDo6Y3VycmVudCgpOyB9
CisgICAgYm9vbCBpc0dyYXBoT3duZXIoKSBjb25zdCB7IHJldHVybiBtX2dyYXBoTG9jay5pc093
bmVyKCk7IH0KIAogICAgIC8vIFRoaXMgaXMgY29uc2lkZXJpbmcgMzIgaXMgbGFyZ2UgZW5vdWdo
IGZvciBtdWx0aXBsZSBjaGFubmVscyBhdWRpby4KICAgICAvLyBJdCBpcyBzb21ld2hhdCBhcmJp
dHJhcnkgYW5kIGNvdWxkIGJlIGluY3JlYXNlZCBpZiBuZWNlc3NhcnkuCkBAIC0yMzIsMjUgKzIy
Niw2IEBAIHB1YmxpYzoKICAgICBjb25zdCBTZWN1cml0eU9yaWdpbiogb3JpZ2luKCkgY29uc3Q7
CiAgICAgdm9pZCBhZGRDb25zb2xlTWVzc2FnZShNZXNzYWdlU291cmNlLCBNZXNzYWdlTGV2ZWws
IGNvbnN0IFN0cmluZyYgbWVzc2FnZSk7CiAKLSAgICBjbGFzcyBBdXRvTG9ja2VyIHsKLSAgICBw
dWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IEF1dG9Mb2NrZXIoQmFzZUF1ZGlvQ29udGV4dCYgY29u
dGV4dCkKLSAgICAgICAgICAgIDogbV9jb250ZXh0KGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAg
ICAgICAgIG1fY29udGV4dC5sb2NrKG1fbXVzdFJlbGVhc2VMb2NrKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIH5BdXRvTG9ja2VyKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1fbXVzdFJl
bGVhc2VMb2NrKQotICAgICAgICAgICAgICAgIG1fY29udGV4dC51bmxvY2soKTsKLSAgICAgICAg
fQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgQmFzZUF1ZGlvQ29udGV4dCYgbV9jb250ZXh0Owot
ICAgICAgICBib29sIG1fbXVzdFJlbGVhc2VMb2NrOwotICAgIH07Ci0KICAgICB2aXJ0dWFsIHZv
aWQgbGF6eUluaXRpYWxpemUoKTsKIAogICAgIHN0YXRpYyBib29sIGlzU3VwcG9ydGVkU2FtcGxl
UmF0ZShmbG9hdCBzYW1wbGVSYXRlKTsKQEAgLTI2Niw4ICsyNDEsNiBAQCBwcm90ZWN0ZWQ6CiAg
ICAgdm9pZCBjbGVhclBlbmRpbmdBY3Rpdml0eSgpOwogICAgIHZvaWQgc2V0UGVuZGluZ0FjdGl2
aXR5KCk7CiAKLSAgICB2b2lkIGxvY2tJbnRlcm5hbChib29sJiBtdXN0UmVsZWFzZUxvY2spOwot
CiAgICAgdmlydHVhbCB2b2lkIHVuaW5pdGlhbGl6ZSgpOwogCiAjaWYgIVJFTEVBU0VfTE9HX0RJ
U0FCTEVECkBAIC0zNTEsNyArMzI0LDggQEAgcHJpdmF0ZToKICAgICBSZWY8QXVkaW9MaXN0ZW5l
cj4gbV9saXN0ZW5lcjsKIAogICAgIHN0ZDo6YXRvbWljPFRocmVhZCo+IG1fYXVkaW9UaHJlYWQ7
Ci0gICAgc3RkOjphdG9taWM8VGhyZWFkKj4gbV9ncmFwaE93bmVyVGhyZWFkOyAvLyBpZiB0aGUg
bG9jayBpcyBoZWxkIHRoZW4gdGhpcyBpcyB0aGUgdGhyZWFkIHdoaWNoIG93bnMgaXQsIG90aGVy
d2lzZSA9PSBudWxscHRyLgorCisgICAgUmVjdXJzaXZlTG9jayBtX2dyYXBoTG9jazsKIAogICAg
IHN0ZDo6dW5pcXVlX3B0cjxBc3luY0F1ZGlvRGVjb2Rlcj4gbV9hdWRpb0RlY29kZXI7CiAKQEAg
LTM3Myw3ICszNDcsNiBAQCBwcml2YXRlOgogCiAgICAgdW5zaWduZWQgbV9jb25uZWN0aW9uQ291
bnQgeyAwIH07CiAgICAgU3RhdGUgbV9zdGF0ZSB7IFN0YXRlOjpTdXNwZW5kZWQgfTsKLSAgICBM
b2NrIG1fY29udGV4dEdyYXBoTG9jazsKICAgICBib29sIG1faXNEZWxldGlvblNjaGVkdWxlZCB7
IGZhbHNlIH07CiAgICAgYm9vbCBtX2lzU3RvcFNjaGVkdWxlZCB7IGZhbHNlIH07CiAgICAgYm9v
bCBtX2lzSW5pdGlhbGl6ZWQgeyBmYWxzZSB9OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
TW9kdWxlcy93ZWJhdWRpby9DaGFubmVsTWVyZ2VyTm9kZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL3dlYmF1ZGlvL0NoYW5uZWxNZXJnZXJOb2RlLmNwcAppbmRleCAwODBhYjVhYjUyYTc1
MGViZjlmMGYzODVlNTkyYmY5OGI4ZWJhNzcyLi5jY2VjYTg0NGU0MzU1YmI1NDRjMWEwOGIzZmUy
ODdkMjBjNGJkZDJmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlv
L0NoYW5uZWxNZXJnZXJOb2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1
ZGlvL0NoYW5uZWxNZXJnZXJOb2RlLmNwcApAQCAtNjYsNyArNjYsNyBAQCBDaGFubmVsTWVyZ2Vy
Tm9kZTo6Q2hhbm5lbE1lcmdlck5vZGUoQmFzZUF1ZGlvQ29udGV4dCYgY29udGV4dCwgdW5zaWdu
ZWQgbnVtYmVyTwogICAgIAogICAgIGluaXRpYWxpemUoKTsKIAotICAgIEJhc2VBdWRpb0NvbnRl
eHQ6OkF1dG9Mb2NrZXIgY29udGV4dExvY2tlcihjb250ZXh0KTsKKyAgICBhdXRvIGNvbnRleHRM
b2NrZXIgPSBob2xkTG9jayhjb250ZXh0LmdyYXBoTG9jaygpKTsKICAgICBkaXNhYmxlT3V0cHV0
cygpOwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0Nv
bnZvbHZlck5vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9Db252b2x2
ZXJOb2RlLmNwcAppbmRleCBkZWQ0ZmJlNzNiODdmODdkZDdhMmY4MjMwYTdjZDhlNWM5Mzk4N2Vl
Li43MDAxYzAyMGI5NmY4MDhmNWI1N2Q5ZWIzMGQ1MjgwNDg3ZDUxMmRhIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0NvbnZvbHZlck5vZGUuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQ29udm9sdmVyTm9kZS5jcHAKQEAgLTE0NCw3
ICsxNDQsNyBAQCBFeGNlcHRpb25Pcjx2b2lkPiBDb252b2x2ZXJOb2RlOjpzZXRCdWZmZXIoUmVm
UHRyPEF1ZGlvQnVmZmVyPiYmIGJ1ZmZlcikKIAogICAgIHsKICAgICAgICAgLy8gVGhlIGNvbnRl
eHQgbXVzdCBiZSBsb2NrZWQgc2luY2UgY2hhbmdpbmcgdGhlIGJ1ZmZlciBjYW4gcmUtY29uZmln
dXJlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhhdCBhcmUgb3V0cHV0LgotICAgICAgICBCYXNl
QXVkaW9Db250ZXh0OjpBdXRvTG9ja2VyIGNvbnRleHRMb2NrZXIoY29udGV4dCgpKTsKKyAgICAg
ICAgYXV0byBjb250ZXh0TG9ja2VyID0gaG9sZExvY2soY29udGV4dCgpLmdyYXBoTG9jaygpKTsK
IAogICAgICAgICAvLyBTeW5jaHJvbml6ZSB3aXRoIHByb2Nlc3MoKS4KICAgICAgICAgYXV0byBs
b2NrZXIgPSBob2xkTG9jayhtX3Byb2Nlc3NMb2NrKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL01vZHVsZXMvd2ViYXVkaW8vTWVkaWFFbGVtZW50QXVkaW9Tb3VyY2VOb2RlLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vTWVkaWFFbGVtZW50QXVkaW9Tb3VyY2VOb2Rl
LmNwcAppbmRleCBmZTQwZDY1MDVkYjUwYmVlZjFjMzhmMzI1ZmNhZjFkYmY3MWU0NzY2Li44YWVk
NzgyNjE5M2JhMDg3MjBmYTZkOWExMDY4YmEzYzZkYzNiNGFjIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL01lZGlhRWxlbWVudEF1ZGlvU291cmNlTm9kZS5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9NZWRpYUVsZW1lbnRBdWRpb1Nv
dXJjZU5vZGUuY3BwCkBAIC0xMTAsNyArMTEwLDcgQEAgdm9pZCBNZWRpYUVsZW1lbnRBdWRpb1Nv
dXJjZU5vZGU6OnNldEZvcm1hdChzaXplX3QgbnVtYmVyT2ZDaGFubmVscywgZmxvYXQgc291cmMK
IAogICAgICAgICB7CiAgICAgICAgICAgICAvLyBUaGUgY29udGV4dCBtdXN0IGJlIGxvY2tlZCB3
aGVuIGNoYW5naW5nIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLgotICAgICAgICAgICAg
QmFzZUF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBjb250ZXh0TG9ja2VyKGNvbnRleHQoKSk7Cisg
ICAgICAgICAgICBhdXRvIGNvbnRleHRMb2NrZXIgPSBob2xkTG9jayhjb250ZXh0KCkuZ3JhcGhM
b2NrKCkpOwogCiAgICAgICAgICAgICAvLyBEbyBhbnkgbmVjZXNzc2FyeSByZS1jb25maWd1cmF0
aW9uIHRvIHRoZSBvdXRwdXQncyBudW1iZXIgb2YgY2hhbm5lbHMuCiAgICAgICAgICAgICBvdXRw
dXQoMCktPnNldE51bWJlck9mQ2hhbm5lbHMobnVtYmVyT2ZDaGFubmVscyk7CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL01lZGlhU3RyZWFtQXVkaW9Tb3VyY2VO
b2RlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vTWVkaWFTdHJlYW1BdWRp
b1NvdXJjZU5vZGUuY3BwCmluZGV4IGI1M2UzY2Y4MjU1ZDJhN2E2ZDU3YmQ4YTU3ZTNhNTYyZGJj
Nzg3OTIuLmY2YTBlYTA3ZmQ4ZmFlM2VjNzJmNDRmOWQ0NDIzZTQ4ZjAwMmY1MzMgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vTWVkaWFTdHJlYW1BdWRpb1NvdXJj
ZU5vZGUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vTWVkaWFTdHJl
YW1BdWRpb1NvdXJjZU5vZGUuY3BwCkBAIC0xMTgsNyArMTE4LDcgQEAgdm9pZCBNZWRpYVN0cmVh
bUF1ZGlvU291cmNlTm9kZTo6c2V0Rm9ybWF0KHNpemVfdCBudW1iZXJPZkNoYW5uZWxzLCBmbG9h
dCBzb3VyY2UKIAogICAgIHsKICAgICAgICAgLy8gVGhlIGNvbnRleHQgbXVzdCBiZSBsb2NrZWQg
d2hlbiBjaGFuZ2luZyB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4KLSAgICAgICAgQXVk
aW9Db250ZXh0OjpBdXRvTG9ja2VyIGNvbnRleHRMb2NrZXIoY29udGV4dCgpKTsKKyAgICAgICAg
YXV0byBjb250ZXh0TG9ja2VyID0gaG9sZExvY2soY29udGV4dCgpLmdyYXBoTG9jaygpKTsKIAog
ICAgICAgICAvLyBEbyBhbnkgbmVjZXNzc2FyeSByZS1jb25maWd1cmF0aW9uIHRvIHRoZSBvdXRw
dXQncyBudW1iZXIgb2YgY2hhbm5lbHMuCiAgICAgICAgIG91dHB1dCgwKS0+c2V0TnVtYmVyT2ZD
aGFubmVscyhudW1iZXJPZkNoYW5uZWxzKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvd2ViYXVkaW8vT2ZmbGluZUF1ZGlvQ29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL3dlYmF1ZGlvL09mZmxpbmVBdWRpb0NvbnRleHQuY3BwCmluZGV4IGE4MzljODNiNWM2
YjczMDE1MjgwZjM1MGMxYzEyZGUyMmEwNmY4NDIuLmQ0MzdlZGZkZTU2NDAwYjNhYmNlODE3NjBk
N2EwYjRjM2U5OTkxMWYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVk
aW8vT2ZmbGluZUF1ZGlvQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93
ZWJhdWRpby9PZmZsaW5lQXVkaW9Db250ZXh0LmNwcApAQCAtMTQ0LDcgKzE0NCw3IEBAIHZvaWQg
T2ZmbGluZUF1ZGlvQ29udGV4dDo6c3VzcGVuZFJlbmRlcmluZyhkb3VibGUgc3VzcGVuZFRpbWUs
IFJlZjxEZWZlcnJlZFByb21pCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBBdXRvTG9j
a2VyIGxvY2tlcigqdGhpcyk7CisgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhncmFwaExvY2so
KSk7CiAgICAgYXV0byBhZGRSZXN1bHQgPSBtX3N1c3BlbmRSZXF1ZXN0cy5hZGQoZnJhbWUsIHBy
b21pc2UucHRyKCkpOwogICAgIGlmICghYWRkUmVzdWx0LmlzTmV3RW50cnkpIHsKICAgICAgICAg
cHJvbWlzZS0+cmVqZWN0KEV4Y2VwdGlvbiB7IEludmFsaWRTdGF0ZUVycm9yLCAiVGhlcmUgaXMg
YWxyZWFkeSBhIHBlbmRpbmcgc3VzcGVuZCByZXF1ZXN0IGF0IHRoaXMgZnJhbWUiX3MgfSk7CkBA
IC0xODMsOSArMTgzLDEwIEBAIHZvaWQgT2ZmbGluZUF1ZGlvQ29udGV4dDo6cmVzdW1lUmVuZGVy
aW5nKFJlZjxEZWZlcnJlZFByb21pc2U+JiYgcHJvbWlzZSkKIGJvb2wgT2ZmbGluZUF1ZGlvQ29u
dGV4dDo6c2hvdWxkU3VzcGVuZCgpCiB7CiAgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Ci0g
ICAgLy8gTm90ZSB0aGF0IE9mZmxpbmVBdXRvTG9ja2VyIHVzZXMgbG9jaygpIGluc3RlYWQgb2Yg
dHJ5TG9jaygpLiBXZSB1c3VhbGx5IGF2b2lkIGJsb2NraW5nIHRoZSBBdWRpb1RocmVhZAorICAg
IC8vIE5vdGUgd2UgdXNlIGhvbGRMb2NrKCkgaW5zdGVhZCBvZiB0cnlIb2xkTG9jaygpLiBXZSB1
c3VhbGx5IGF2b2lkIGJsb2NraW5nIHRoZSBBdWRpb1RocmVhZAogICAgIC8vIG9uIGxvY2soKSBi
dXQgd2UgZG9uJ3QgaGF2ZSBhIGNob2ljZSBoZXJlIHNpbmNlIHRoZSBzdXNwZW5zaW9uIG5lZWQg
dG8gYmUgZXhhY3QuCi0gICAgT2ZmbGluZUF1dG9Mb2NrZXIgbG9ja2VyKCp0aGlzKTsKKyAgICAv
LyBBbHNvLCB0aGlzIG5vdCBhIHJlYWwtdGltZSBBdWRpb0NvbnRleHQgc28gYmxvY2tpbmcgdGhl
IEF1ZGlvVGhyZWFkIGlzIG5vdCBhcyBoYXJtZnVsLgorICAgIGF1dG8gbG9ja2VyID0gaG9sZExv
Y2soZ3JhcGhMb2NrKCkpOwogICAgIHJldHVybiBtX3N1c3BlbmRSZXF1ZXN0cy5jb250YWlucyhj
dXJyZW50U2FtcGxlRnJhbWUoKSk7CiB9CiAKQEAgLTE5Nyw3ICsxOTgsNyBAQCB2b2lkIE9mZmxp
bmVBdWRpb0NvbnRleHQ6OmRpZFN1c3BlbmRSZW5kZXJpbmcoc2l6ZV90IGZyYW1lKQogCiAgICAg
UmVmUHRyPERlZmVycmVkUHJvbWlzZT4gcHJvbWlzZTsKICAgICB7Ci0gICAgICAgIEF1dG9Mb2Nr
ZXIgbG9ja2VyKCp0aGlzKTsKKyAgICAgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhncmFwaExv
Y2soKSk7CiAgICAgICAgIHByb21pc2UgPSBtX3N1c3BlbmRSZXF1ZXN0cy50YWtlKGZyYW1lKTsK
ICAgICB9CiAgICAgQVNTRVJUKHByb21pc2UpOwpAQCAtMjQ0LDEyICsyNDUsNiBAQCB2b2lkIE9m
ZmxpbmVBdWRpb0NvbnRleHQ6OnNldHRsZVJlbmRlcmluZ1Byb21pc2UoRXhjZXB0aW9uT3I8UmVm
PEF1ZGlvQnVmZmVyPj4mJgogICAgIHByb21pc2UtPnJlc29sdmU8SURMSW50ZXJmYWNlPEF1ZGlv
QnVmZmVyPj4ocmVzdWx0LnJlbGVhc2VSZXR1cm5WYWx1ZSgpKTsKIH0KIAotdm9pZCBPZmZsaW5l
QXVkaW9Db250ZXh0OjpvZmZsaW5lTG9jayhib29sJiBtdXN0UmVsZWFzZUxvY2spCi17Ci0gICAg
QVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Ci0gICAgbG9ja0ludGVybmFsKG11c3RSZWxlYXNlTG9j
ayk7Ci19Ci0KIHZvaWQgT2ZmbGluZUF1ZGlvQ29udGV4dDo6ZGlzcGF0Y2hFdmVudChFdmVudCYg
ZXZlbnQpCiB7CiAgICAgQmFzZUF1ZGlvQ29udGV4dDo6ZGlzcGF0Y2hFdmVudChldmVudCk7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL09mZmxpbmVBdWRpb0Nv
bnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vT2ZmbGluZUF1ZGlvQ29u
dGV4dC5oCmluZGV4IGQ0MTg2NTJhOTMwOGQ0NWY2ZDZmYmRlNTE1Yjc2ZTMzZDhhMmE0NGMuLjZl
MmE2YmQxZTNhYmRlODlmYjE2NTBiNGYyYzQ1YjI4ODBkY2E0MTggMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vT2ZmbGluZUF1ZGlvQ29udGV4dC5oCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vT2ZmbGluZUF1ZGlvQ29udGV4dC5oCkBAIC01
NywyOCArNTcsNiBAQCBwcml2YXRlOgogCiAgICAgQXVkaW9CdWZmZXIqIHJlbmRlclRhcmdldCgp
IGNvbnN0IHsgcmV0dXJuIGRlc3RpbmF0aW9uKCkucmVuZGVyVGFyZ2V0KCk7IH0KIAotICAgIC8v
IG11c3RSZWxlYXNlTG9jayBpcyBzZXQgdG8gdHJ1ZSBpZiB3ZSBhY3F1aXJlZCB0aGUgbG9jayBp
biB0aGlzIG1ldGhvZCBjYWxsIGFuZCBjYWxsZXIgbXVzdCB1bmxvY2soKSwgZmFsc2UgaWYgaXQg
d2FzIHByZXZpb3VzbHkgYWNxdWlyZWQuCi0gICAgdm9pZCBvZmZsaW5lTG9jayhib29sJiBtdXN0
UmVsZWFzZUxvY2spOwotCi0gICAgY2xhc3MgT2ZmbGluZUF1dG9Mb2NrZXIgewotICAgIHB1Ymxp
YzoKLSAgICAgICAgZXhwbGljaXQgT2ZmbGluZUF1dG9Mb2NrZXIoT2ZmbGluZUF1ZGlvQ29udGV4
dCYgY29udGV4dCkKLSAgICAgICAgICAgIDogbV9jb250ZXh0KGNvbnRleHQpCi0gICAgICAgIHsK
LSAgICAgICAgICAgIG1fY29udGV4dC5vZmZsaW5lTG9jayhtX211c3RSZWxlYXNlTG9jayk7Ci0g
ICAgICAgIH0KLQotICAgICAgICB+T2ZmbGluZUF1dG9Mb2NrZXIoKQotICAgICAgICB7Ci0gICAg
ICAgICAgICBpZiAobV9tdXN0UmVsZWFzZUxvY2spCi0gICAgICAgICAgICAgICAgbV9jb250ZXh0
LnVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBPZmZsaW5lQXVk
aW9Db250ZXh0JiBtX2NvbnRleHQ7Ci0gICAgICAgIGJvb2wgbV9tdXN0UmVsZWFzZUxvY2s7Ci0g
ICAgfTsKLQogICAgIC8vIEFjdGl2ZURPTU9iamVjdAogICAgIGNvbnN0IGNoYXIqIGFjdGl2ZURP
TU9iamVjdE5hbWUoKSBjb25zdCBmaW5hbDsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
TW9kdWxlcy93ZWJhdWRpby9XYXZlU2hhcGVyTm9kZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL3dlYmF1ZGlvL1dhdmVTaGFwZXJOb2RlLmNwcAppbmRleCA2ODFmNDBhMTRkMDNhN2FkOGM4
ZDNjYTIyOTAzM2FiY2VkNzE2OTQ0Li42OTJkYmI5ZWVkZDZiYmJjNTIxOWFhOTg0YzdiMjQxOGU1
ZDQyOTE0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL1dhdmVT
aGFwZXJOb2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL1dhdmVT
aGFwZXJOb2RlLmNwcApAQCAtMTE0LDcgKzExNCw3IEBAIHZvaWQgV2F2ZVNoYXBlck5vZGU6OnNl
dE92ZXJzYW1wbGUoT3ZlclNhbXBsZVR5cGUgdHlwZSkKICAgICBJTkZPX0xPRyhMT0dJREVOVElG
SUVSLCB0eXBlKTsKIAogICAgIC8vIFN5bmNocm9uaXplIHdpdGggYW55IGdyYXBoIGNoYW5nZXMg
b3IgY2hhbmdlcyB0byBjaGFubmVsIGNvbmZpZ3VyYXRpb24uCi0gICAgQXVkaW9Db250ZXh0OjpB
dXRvTG9ja2VyIGNvbnRleHRMb2NrZXIoY29udGV4dCgpKTsKKyAgICBhdXRvIGNvbnRleHRMb2Nr
ZXIgPSBob2xkTG9jayhjb250ZXh0KCkuZ3JhcGhMb2NrKCkpOwogICAgIHdhdmVTaGFwZXJQcm9j
ZXNzb3IoKS0+c2V0T3ZlcnNhbXBsZShwcm9jZXNzb3JUeXBlKHR5cGUpKTsKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>428997</attachid>
            <date>2021-05-18 16:38:37 -0700</date>
            <delta_ts>2021-05-18 18:51:57 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-225935-20210518163836.patch</filename>
            <type>text/plain</type>
            <size>29778</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc3NjgzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IGJmM2UzNTdkYTYwNTZjZmI2ODZjZTU0
MzkzMzJiMDQxN2RlMDE0NzMuLjAxNDZiYWM4ZDJiNWE1MTQ0M2I1MWNhZTlmMjMyODExNzcyYzI5
ODcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMjEtMDUtMTggIENocmlzIER1bWV6ICA8Y2R1bWV6
QGFwcGxlLmNvbT4KKworICAgICAgICBVc2UgV1RGOjpMb2NrZXIgZm9yIGxvY2tpbmcgQmFzZUF1
ZGlvQ29udGV4dCdzIGdyYXBoIGxvY2sKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTIyNTkzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgICogd3RmL1JlY3Vyc2l2ZUxvY2tBZGFwdGVyLmg6CisgICAgICAgIChX
VEY6OlJlY3Vyc2l2ZUxvY2tBZGFwdGVyOjppc093bmVyIGNvbnN0KToKKyAgICAgICAgQWRkIGlz
T3duZXIoKSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCB0aHJlYWQg
aXMgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgVGhpcyBpcyBuZWVkZWQgZm9yIFdlYkF1ZGlv
IHB1cnBvc2VzLgorCiAyMDIxLTA1LTE4ICBZb3NoaWFraSBKaXRzdWthd2EgIDx5b3NoaWFraS5q
aXRzdWthd2FAc29ueS5jb20+CiAKICAgICAgICAgW1BsYXlTdGF0aW9uXSBGaXggUGxheVN0YXRp
b24gcG9ydApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dl
YkNvcmUvQ2hhbmdlTG9nCmluZGV4IDQ4YjVkMGE2NDkyM2QyMjY1YjY3MjZlM2Y0YjkwMjc1N2Ni
MGZlZjcuLmQ1NWU0NzYxNWNiZjU4NmNkYWI4NjExODBlOWFkMGQ3MWY3ZWZmNWUgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VM
b2cKQEAgLTEsMyArMSw1OSBAQAorMjAyMS0wNS0xOCAgQ2hyaXMgRHVtZXogIDxjZHVtZXpAYXBw
bGUuY29tPgorCisgICAgICAgIFVzZSBXVEY6OkxvY2tlciBmb3IgbG9ja2luZyBCYXNlQXVkaW9D
b250ZXh0J3MgZ3JhcGggbG9jaworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MjI1OTM1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgVXNlIFdURjo6TG9ja2VyIGZvciBsb2NraW5nIEJhc2VBdWRpb0NvbnRleHQn
cyBncmFwaCBsb2NrIGluc3RlYWQgb2Ygb3VyIG93biBBdXRvTG9ja2VyLgorICAgICAgICBBbHNv
IHVzZSBXVEY6OlJlY3Vyc2l2ZUxvY2sgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyB0aGUgcmVjdXJz
aXZlIGxvY2tpbmcgbG9naWMgaW5zaWRlCisgICAgICAgIEJhc2VBdWRpb0NvbnRleHQuIFRoaXMg
bWVhbnMgd2Ugbm8gbG9uZ2VyIG5lZWQgbG9jaygpIC8gdHJ5TG9jaygpIC8gdW5sb2NrKCkgZnVu
Y3Rpb25zCisgICAgICAgIG9uIEJhc2VBdWRpb0NvbnRleHQuIFdlIG5vdyBleHBvc2UgdGhlIEJh
c2VBdWRpb0NvbnRleHQncyBSZWN1cnNpdmVMb2NrIHZpYSBhIGdyYXBoTG9jaygpCisgICAgICAg
IGdldHRlciBhbmQgdGhlIGNhbGxlciBzaXRlcyBjYW4ganVzdCB1c2UgYSBMb2NrZXIuCisKKyAg
ICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnNldEJ1ZmZlcik6CisgICAgICAg
ICogTW9kdWxlcy93ZWJhdWRpby9BdWRpb05vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9Ob2RlOjpjb25uZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6ZGlzY29ubmVj
dCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnNldENoYW5uZWxDb3VudCk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb05vZGU6OnNldENoYW5uZWxDb3VudE1vZGUpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9Ob2RlOjpzZXRDaGFubmVsSW50ZXJwcmV0YXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9Ob2RlOjplbmFibGVPdXRwdXRzSWZOZWNlc3NhcnkpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9Ob2RlOjpkZWNyZW1lbnRDb25uZWN0aW9uQ291bnQpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9Ob2RlOjpkZXJlZik6CisgICAgICAgICogTW9kdWxlcy93ZWJhdWRpby9B
dWRpb1dvcmtsZXROb2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvV29ya2xldE5vZGU6
OmNyZWF0ZSk6CisgICAgICAgICogTW9kdWxlcy93ZWJhdWRpby9CYXNlQXVkaW9Db250ZXh0LmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkJhc2VBdWRpb0NvbnRleHQ6OnVuaW5pdGlhbGl6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpCYXNlQXVkaW9Db250ZXh0OjpyZWZTb3VyY2VOb2RlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkJhc2VBdWRpb0NvbnRleHQ6OmFkZERlZmVycmVkRGVjcmVtZW50Q29ubmVj
dGlvbkNvdW50KToKKyAgICAgICAgKFdlYkNvcmU6OkJhc2VBdWRpb0NvbnRleHQ6OmhhbmRsZVBy
ZVJlbmRlclRhc2tzKToKKyAgICAgICAgKFdlYkNvcmU6OkJhc2VBdWRpb0NvbnRleHQ6Om91dHB1
dFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkJhc2VBdWRpb0NvbnRleHQ6OmhhbmRsZVBv
c3RSZW5kZXJUYXNrcyk6CisgICAgICAgIChXZWJDb3JlOjpCYXNlQXVkaW9Db250ZXh0OjpkZWxl
dGVNYXJrZWROb2Rlcyk6CisgICAgICAgIChXZWJDb3JlOjpCYXNlQXVkaW9Db250ZXh0OjpyZW1v
dmVNYXJrZWRTdW1taW5nSnVuY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6QmFzZUF1ZGlvQ29u
dGV4dDo6aGFuZGxlRGlydHlBdWRpb1N1bW1pbmdKdW5jdGlvbnMpOgorICAgICAgICAoV2ViQ29y
ZTo6QmFzZUF1ZGlvQ29udGV4dDo6aGFuZGxlRGlydHlBdWRpb05vZGVPdXRwdXRzKToKKyAgICAg
ICAgKiBNb2R1bGVzL3dlYmF1ZGlvL0Jhc2VBdWRpb0NvbnRleHQuaDoKKyAgICAgICAgKFdlYkNv
cmU6OkJhc2VBdWRpb0NvbnRleHQ6OmdyYXBoTG9jayk6CisgICAgICAgIChXZWJDb3JlOjpCYXNl
QXVkaW9Db250ZXh0Ojppc0dyYXBoT3duZXIgY29uc3QpOgorICAgICAgICAqIE1vZHVsZXMvd2Vi
YXVkaW8vQ2hhbm5lbE1lcmdlck5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q2hhbm5lbE1l
cmdlck5vZGU6OkNoYW5uZWxNZXJnZXJOb2RlKToKKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlv
L0NvbnZvbHZlck5vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udm9sdmVyTm9kZTo6c2V0
QnVmZmVyKToKKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL01lZGlhRWxlbWVudEF1ZGlvU291
cmNlTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYUVsZW1lbnRBdWRpb1NvdXJjZU5v
ZGU6OnNldEZvcm1hdCk6CisgICAgICAgICogTW9kdWxlcy93ZWJhdWRpby9NZWRpYVN0cmVhbUF1
ZGlvU291cmNlTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVN0cmVhbUF1ZGlvU291
cmNlTm9kZTo6c2V0Rm9ybWF0KToKKyAgICAgICAgKiBNb2R1bGVzL3dlYmF1ZGlvL09mZmxpbmVB
dWRpb0NvbnRleHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6T2ZmbGluZUF1ZGlvQ29udGV4dDo6
c3VzcGVuZFJlbmRlcmluZyk6CisgICAgICAgIChXZWJDb3JlOjpPZmZsaW5lQXVkaW9Db250ZXh0
OjpzaG91bGRTdXNwZW5kKToKKyAgICAgICAgKFdlYkNvcmU6Ok9mZmxpbmVBdWRpb0NvbnRleHQ6
OmRpZFN1c3BlbmRSZW5kZXJpbmcpOgorICAgICAgICAqIE1vZHVsZXMvd2ViYXVkaW8vT2ZmbGlu
ZUF1ZGlvQ29udGV4dC5oOgorICAgICAgICAqIE1vZHVsZXMvd2ViYXVkaW8vV2F2ZVNoYXBlck5v
ZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6V2F2ZVNoYXBlck5vZGU6OnNldE92ZXJzYW1wbGUp
OgorCiAyMDIxLTA1LTE4ICBKZXIgTm9ibGUgIDxqZXIubm9ibGVAYXBwbGUuY29tPgogCiAgICAg
ICAgIFtHUFVQXSBSZW1vdGVBdWRpb1Nlc3Npb24gY2FsbHMgaW50byBBVkF1ZGlvU2Vzc2lvbiB3
aGVuIEdQVVAgaXMgZW5hYmxlZCwgY2F1c2luZyBoYW5ncwpkaWZmIC0tZ2l0IGEvU291cmNlL1dU
Ri93dGYvUmVjdXJzaXZlTG9ja0FkYXB0ZXIuaCBiL1NvdXJjZS9XVEYvd3RmL1JlY3Vyc2l2ZUxv
Y2tBZGFwdGVyLmgKaW5kZXggZjU2MDU3MmMxNWY2MGU1YjI4YTU4MzlkNTA2YzQ5ODZmODgzNTVm
Zi4uMWVlMTJkNDE5NDcyNmQyMzI0OTJkNjU0NDQxNmVmNjYxNDhiZDY2YSAxMDA2NDQKLS0tIGEv
U291cmNlL1dURi93dGYvUmVjdXJzaXZlTG9ja0FkYXB0ZXIuaAorKysgYi9Tb3VyY2UvV1RGL3d0
Zi9SZWN1cnNpdmVMb2NrQWRhcHRlci5oCkBAIC04MCw2ICs4MCw4IEBAIHB1YmxpYzoKICAgICB7
CiAgICAgICAgIHJldHVybiBtX2xvY2suaXNMb2NrZWQoKTsKICAgICB9CisKKyAgICBib29sIGlz
T3duZXIoKSBjb25zdCB7IHJldHVybiBtX293bmVyID09ICZUaHJlYWQ6OmN1cnJlbnQoKTsgfQog
ICAgIAogcHJpdmF0ZToKICAgICBUaHJlYWQqIG1fb3duZXIgeyBudWxscHRyIH07IC8vIFVzZSBU
aHJlYWQqIGluc3RlYWQgb2YgUmVmUHRyPFRocmVhZD4gc2luY2UgbV9vd25lciB0aHJlYWQgaXMg
YWx3YXlzIGFsaXZlIHdoaWxlIG1fb253ZXIgaXMgc2V0LgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuY3BwIGIvU291cmNl
L1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb0J1ZmZlclNvdXJjZU5vZGUuY3BwCmluZGV4
IGUwYmQ0Y2EzYmYzZDM4NWU0NDdkNGQ3Nzk5MWFkZjcxMGRmM2UxMjQuLjhiNDNkZDIzZDMxODUz
ODUxYjg3NzdiZmJmOWI5OGUzMmJmYWIyMGUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvd2ViYXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmNwcAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5jcHAKQEAgLTQxNiw3
ICs0MTYsNyBAQCBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb0J1ZmZlclNvdXJjZU5vZGU6OnNldEJ1
ZmZlcihSZWZQdHI8QXVkaW9CdWZmZXI+JiYgYnVmZmVyKQogICAgICAgICByZXR1cm4gRXhjZXB0
aW9uIHsgSW52YWxpZFN0YXRlRXJyb3IsICJUaGUgYnVmZmVyIHdhcyBhbHJlYWR5IHNldCJfcyB9
OwogCiAgICAgLy8gVGhlIGNvbnRleHQgbXVzdCBiZSBsb2NrZWQgc2luY2UgY2hhbmdpbmcgdGhl
IGJ1ZmZlciBjYW4gcmUtY29uZmlndXJlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhhdCBhcmUg
b3V0cHV0LgotICAgIEJhc2VBdWRpb0NvbnRleHQ6OkF1dG9Mb2NrZXIgY29udGV4dExvY2tlcihj
b250ZXh0KCkpOworICAgIExvY2tlciBjb250ZXh0TG9ja2VyIHsgY29udGV4dCgpLmdyYXBoTG9j
aygpIH07CiAgICAgCiAgICAgLy8gVGhpcyBzeW5jaHJvbml6ZXMgd2l0aCBwcm9jZXNzKCkuCiAg
ICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhtX3Byb2Nlc3NMb2NrKTsKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Ob2RlLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Ob2RlLmNwcAppbmRleCBiMzczZDUwMjZmMDJjN2Uz
MjU3M2Y0MGIwY2RmNjQ0ODI0ZDJlZDVjLi5mZWJhMzMwZWQwMjBhN2E2OWE0NDNmMzIyZWRhZGQ3
ZTFhOTZkNmVjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1
ZGlvTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb05v
ZGUuY3BwCkBAIC0xODEsNyArMTgxLDcgQEAgQXVkaW9Ob2RlT3V0cHV0KiBBdWRpb05vZGU6Om91
dHB1dCh1bnNpZ25lZCBpKQogRXhjZXB0aW9uT3I8dm9pZD4gQXVkaW9Ob2RlOjpjb25uZWN0KEF1
ZGlvTm9kZSYgZGVzdGluYXRpb24sIHVuc2lnbmVkIG91dHB1dEluZGV4LCB1bnNpZ25lZCBpbnB1
dEluZGV4KQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgQmFzZUF1ZGlvQ29u
dGV4dDo6QXV0b0xvY2tlciBsb2NrZXIoY29udGV4dCgpKTsKKyAgICBMb2NrZXIgbG9ja2VyIHsg
Y29udGV4dCgpLmdyYXBoTG9jaygpIH07CiAKICAgICBBTFdBWVNfTE9HKExPR0lERU5USUZJRVIs
IGRlc3RpbmF0aW9uLm5vZGVUeXBlKCksICIsIG91dHB1dCA9ICIsIG91dHB1dEluZGV4LCAiLCBp
bnB1dCA9ICIsIGlucHV0SW5kZXgpOwogICAgIApAQCAtMjEzLDcgKzIxMyw3IEBAIEV4Y2VwdGlv
bk9yPHZvaWQ+IEF1ZGlvTm9kZTo6Y29ubmVjdChBdWRpb05vZGUmIGRlc3RpbmF0aW9uLCB1bnNp
Z25lZCBvdXRwdXRJbmRlCiAKIEV4Y2VwdGlvbk9yPHZvaWQ+IEF1ZGlvTm9kZTo6Y29ubmVjdChB
dWRpb1BhcmFtJiBwYXJhbSwgdW5zaWduZWQgb3V0cHV0SW5kZXgpCiB7Ci0gICAgQmFzZUF1ZGlv
Q29udGV4dDo6QXV0b0xvY2tlciBsb2NrZXIoY29udGV4dCgpKTsKKyAgICBMb2NrZXIgbG9ja2Vy
IHsgY29udGV4dCgpLmdyYXBoTG9jaygpIH07CiAKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OwogCkBAIC0yMzQsNyArMjM0LDcgQEAgRXhjZXB0aW9uT3I8dm9pZD4gQXVkaW9Ob2RlOjpjb25u
ZWN0KEF1ZGlvUGFyYW0mIHBhcmFtLCB1bnNpZ25lZCBvdXRwdXRJbmRleCkKIHZvaWQgQXVkaW9O
b2RlOjpkaXNjb25uZWN0KCkKIHsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIEJh
c2VBdWRpb0NvbnRleHQ6OkF1dG9Mb2NrZXIgbG9ja2VyKGNvbnRleHQoKSk7CisgICAgTG9ja2Vy
IGxvY2tlciB7IGNvbnRleHQoKS5ncmFwaExvY2soKSB9OwogCiAgICAgZm9yICh1bnNpZ25lZCBv
dXRwdXRJbmRleCA9IDA7IG91dHB1dEluZGV4IDwgbnVtYmVyT2ZPdXRwdXRzKCk7ICsrb3V0cHV0
SW5kZXgpIHsKICAgICAgICAgYXV0byogb3V0cHV0ID0gdGhpcy0+b3V0cHV0KG91dHB1dEluZGV4
KTsKQEAgLTI0OCw3ICsyNDgsNyBAQCB2b2lkIEF1ZGlvTm9kZTo6ZGlzY29ubmVjdCgpCiBFeGNl
cHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OmRpc2Nvbm5lY3QodW5zaWduZWQgb3V0cHV0SW5kZXgp
CiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLSAgICBCYXNlQXVkaW9Db250ZXh0OjpB
dXRvTG9ja2VyIGxvY2tlcihjb250ZXh0KCkpOworICAgIExvY2tlciBsb2NrZXIgeyBjb250ZXh0
KCkuZ3JhcGhMb2NrKCkgfTsKIAogICAgIGlmIChvdXRwdXRJbmRleCA+PSBudW1iZXJPZk91dHB1
dHMoKSkKICAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbiB7IEluZGV4U2l6ZUVycm9yLCAib3V0cHV0
IGluZGV4IGlzIG91dCBvZiBib3VuZHMiX3MgfTsKQEAgLTI2NSw3ICsyNjUsNyBAQCBFeGNlcHRp
b25Pcjx2b2lkPiBBdWRpb05vZGU6OmRpc2Nvbm5lY3QodW5zaWduZWQgb3V0cHV0SW5kZXgpCiBF
eGNlcHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OmRpc2Nvbm5lY3QoQXVkaW9Ob2RlJiBkZXN0aW5h
dGlvbk5vZGUpCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKLSAgICBCYXNlQXVkaW9D
b250ZXh0OjpBdXRvTG9ja2VyIGxvY2tlcihjb250ZXh0KCkpOworICAgIExvY2tlciBsb2NrZXIg
eyBjb250ZXh0KCkuZ3JhcGhMb2NrKCkgfTsKIAogICAgIGJvb2wgZGlkRGlzY29ubmVjdGlvbiA9
IGZhbHNlOwogICAgIGZvciAodW5zaWduZWQgb3V0cHV0SW5kZXggPSAwOyBvdXRwdXRJbmRleCA8
IG51bWJlck9mT3V0cHV0cygpOyArK291dHB1dEluZGV4KSB7CkBAIC0yODksNyArMjg5LDcgQEAg
RXhjZXB0aW9uT3I8dm9pZD4gQXVkaW9Ob2RlOjpkaXNjb25uZWN0KEF1ZGlvTm9kZSYgZGVzdGlu
YXRpb25Ob2RlKQogRXhjZXB0aW9uT3I8dm9pZD4gQXVkaW9Ob2RlOjpkaXNjb25uZWN0KEF1ZGlv
Tm9kZSYgZGVzdGluYXRpb25Ob2RlLCB1bnNpZ25lZCBvdXRwdXRJbmRleCkKIHsKICAgICBBU1NF
UlQoaXNNYWluVGhyZWFkKCkpOwotICAgIEJhc2VBdWRpb0NvbnRleHQ6OkF1dG9Mb2NrZXIgbG9j
a2VyKGNvbnRleHQoKSk7CisgICAgTG9ja2VyIGxvY2tlciB7IGNvbnRleHQoKS5ncmFwaExvY2so
KSB9OwogCiAgICAgaWYgKG91dHB1dEluZGV4ID49IG51bWJlck9mT3V0cHV0cygpKQogICAgICAg
ICByZXR1cm4gRXhjZXB0aW9uIHsgSW5kZXhTaXplRXJyb3IsICJvdXRwdXQgaW5kZXggaXMgb3V0
IG9mIGJvdW5kcyJfcyB9OwpAQCAtMzE0LDcgKzMxNCw3IEBAIEV4Y2VwdGlvbk9yPHZvaWQ+IEF1
ZGlvTm9kZTo6ZGlzY29ubmVjdChBdWRpb05vZGUmIGRlc3RpbmF0aW9uTm9kZSwgdW5zaWduZWQg
b3V0CiBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OmRpc2Nvbm5lY3QoQXVkaW9Ob2RlJiBk
ZXN0aW5hdGlvbk5vZGUsIHVuc2lnbmVkIG91dHB1dEluZGV4LCB1bnNpZ25lZCBpbnB1dEluZGV4
KQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgQmFzZUF1ZGlvQ29udGV4dDo6
QXV0b0xvY2tlciBsb2NrZXIoY29udGV4dCgpKTsKKyAgICBMb2NrZXIgbG9ja2VyIHsgY29udGV4
dCgpLmdyYXBoTG9jaygpIH07CiAKICAgICBpZiAob3V0cHV0SW5kZXggPj0gbnVtYmVyT2ZPdXRw
dXRzKCkpCiAgICAgICAgIHJldHVybiBFeGNlcHRpb24geyBJbmRleFNpemVFcnJvciwgIm91dHB1
dCBpbmRleCBpcyBvdXQgb2YgYm91bmRzIl9zIH07CkBAIC0zMzYsNyArMzM2LDcgQEAgRXhjZXB0
aW9uT3I8dm9pZD4gQXVkaW9Ob2RlOjpkaXNjb25uZWN0KEF1ZGlvTm9kZSYgZGVzdGluYXRpb25O
b2RlLCB1bnNpZ25lZCBvdXQKIEV4Y2VwdGlvbk9yPHZvaWQ+IEF1ZGlvTm9kZTo6ZGlzY29ubmVj
dChBdWRpb1BhcmFtJiBkZXN0aW5hdGlvblBhcmFtKQogewogICAgIEFTU0VSVChpc01haW5UaHJl
YWQoKSk7Ci0gICAgQmFzZUF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBsb2NrZXIoY29udGV4dCgp
KTsKKyAgICBMb2NrZXIgbG9ja2VyIHsgY29udGV4dCgpLmdyYXBoTG9jaygpIH07CiAKICAgICBi
b29sIGRpZERpc2Nvbm5lY3Rpb24gPSBmYWxzZTsKICAgICBmb3IgKHVuc2lnbmVkIG91dHB1dElu
ZGV4ID0gMDsgb3V0cHV0SW5kZXggPCBudW1iZXJPZk91dHB1dHMoKTsgKytvdXRwdXRJbmRleCkg
ewpAQCAtMzU3LDcgKzM1Nyw3IEBAIEV4Y2VwdGlvbk9yPHZvaWQ+IEF1ZGlvTm9kZTo6ZGlzY29u
bmVjdChBdWRpb1BhcmFtJiBkZXN0aW5hdGlvblBhcmFtKQogRXhjZXB0aW9uT3I8dm9pZD4gQXVk
aW9Ob2RlOjpkaXNjb25uZWN0KEF1ZGlvUGFyYW0mIGRlc3RpbmF0aW9uUGFyYW0sIHVuc2lnbmVk
IG91dHB1dEluZGV4KQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgQmFzZUF1
ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBsb2NrZXIoY29udGV4dCgpKTsKKyAgICBMb2NrZXIgbG9j
a2VyIHsgY29udGV4dCgpLmdyYXBoTG9jaygpIH07CiAKICAgICBpZiAob3V0cHV0SW5kZXggPj0g
bnVtYmVyT2ZPdXRwdXRzKCkpCiAgICAgICAgIHJldHVybiBFeGNlcHRpb24geyBJbmRleFNpemVF
cnJvciwgIm91dHB1dCBpbmRleCBpcyBvdXQgb2YgYm91bmRzIl9zIH07CkBAIC0zODAsNyArMzgw
LDcgQEAgZmxvYXQgQXVkaW9Ob2RlOjpzYW1wbGVSYXRlKCkgY29uc3QKIEV4Y2VwdGlvbk9yPHZv
aWQ+IEF1ZGlvTm9kZTo6c2V0Q2hhbm5lbENvdW50KHVuc2lnbmVkIGNoYW5uZWxDb3VudCkKIHsK
ICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIEJhc2VBdWRpb0NvbnRleHQ6OkF1dG9M
b2NrZXIgbG9ja2VyKGNvbnRleHQoKSk7CisgICAgTG9ja2VyIGxvY2tlciB7IGNvbnRleHQoKS5n
cmFwaExvY2soKSB9OwogCiAgICAgQUxXQVlTX0xPRyhMT0dJREVOVElGSUVSLCBjaGFubmVsQ291
bnQpOwogCkBAIC00MDIsNyArNDAyLDcgQEAgRXhjZXB0aW9uT3I8dm9pZD4gQXVkaW9Ob2RlOjpz
ZXRDaGFubmVsQ291bnQodW5zaWduZWQgY2hhbm5lbENvdW50KQogRXhjZXB0aW9uT3I8dm9pZD4g
QXVkaW9Ob2RlOjpzZXRDaGFubmVsQ291bnRNb2RlKENoYW5uZWxDb3VudE1vZGUgbW9kZSkKIHsK
ICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIEJhc2VBdWRpb0NvbnRleHQ6OkF1dG9M
b2NrZXIgbG9ja2VyKGNvbnRleHQoKSk7CisgICAgTG9ja2VyIGxvY2tlciB7IGNvbnRleHQoKS5n
cmFwaExvY2soKSB9OwogCiAgICAgQUxXQVlTX0xPRyhMT0dJREVOVElGSUVSLCBtb2RlKTsKICAg
ICAKQEAgLTQxOCw3ICs0MTgsNyBAQCBFeGNlcHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OnNldENo
YW5uZWxDb3VudE1vZGUoQ2hhbm5lbENvdW50TW9kZSBtb2RlKQogRXhjZXB0aW9uT3I8dm9pZD4g
QXVkaW9Ob2RlOjpzZXRDaGFubmVsSW50ZXJwcmV0YXRpb24oQ2hhbm5lbEludGVycHJldGF0aW9u
IGludGVycHJldGF0aW9uKQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgQmFz
ZUF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBsb2NrZXIoY29udGV4dCgpKTsKKyAgICBMb2NrZXIg
bG9ja2VyIHsgY29udGV4dCgpLmdyYXBoTG9jaygpIH07CiAKICAgICBBTFdBWVNfTE9HKExPR0lE
RU5USUZJRVIsIGludGVycHJldGF0aW9uKTsKICAgICAKQEAgLTUyMyw3ICs1MjMsNyBAQCB2b2lk
IEF1ZGlvTm9kZTo6ZW5hYmxlT3V0cHV0c0lmTmVjZXNzYXJ5KCkKIHsKICAgICBpZiAobV9pc0Rp
c2FibGVkICYmIG1fY29ubmVjdGlvblJlZkNvdW50ID4gMCkgewogICAgICAgICBBU1NFUlQoaXNN
YWluVGhyZWFkKCkpOwotICAgICAgICBCYXNlQXVkaW9Db250ZXh0OjpBdXRvTG9ja2VyIGxvY2tl
cihjb250ZXh0KCkpOworICAgICAgICBMb2NrZXIgbG9ja2VyIHsgY29udGV4dCgpLmdyYXBoTG9j
aygpIH07CiAKICAgICAgICAgbV9pc0Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgIGZvciAoYXV0
byYgb3V0cHV0IDogbV9vdXRwdXRzKQpAQCAtNTc4LDIzICs1NzgsOSBAQCB2b2lkIEF1ZGlvTm9k
ZTo6ZGVjcmVtZW50Q29ubmVjdGlvbkNvdW50KCkKIHsKICAgICAvLyBUaGUgYWN0dWFsbHkgd29y
ayBmb3IgZGVyZWYgaGFwcGVucyBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgYXVkaW8gY29udGV4dCdz
IGdyYXBoIGxvY2suCiAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgdGhlIGF1ZGlvIHRocmVhZCwgd2Ug
bXVzdCB1c2UgYSB0cnlMb2NrIHRvIGF2b2lkIGdsaXRjaGVzLgotICAgIGJvb2wgaGFzTG9jayA9
IGZhbHNlOwotICAgIGJvb2wgbXVzdFJlbGVhc2VMb2NrID0gZmFsc2U7Ci0KLSAgICBpZiAoY29u
dGV4dCgpLmlzQXVkaW9UaHJlYWQoKSkgewotICAgICAgICAvLyBSZWFsLXRpbWUgYXVkaW8gdGhy
ZWFkIG11c3Qgbm90IGNvbnRlbmQgbG9jayAodG8gYXZvaWQgZ2xpdGNoZXMpLgotICAgICAgICBo
YXNMb2NrID0gY29udGV4dCgpLnRyeUxvY2sobXVzdFJlbGVhc2VMb2NrKTsKLSAgICB9IGVsc2Ug
ewotICAgICAgICBjb250ZXh0KCkubG9jayhtdXN0UmVsZWFzZUxvY2spOwotICAgICAgICBoYXNM
b2NrID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzTG9jaykgeworICAgIGlmIChhdXRvIGxv
Y2tlciA9IGNvbnRleHQoKS5pc0F1ZGlvVGhyZWFkKCkgPyBMb2NrZXI8UmVjdXJzaXZlTG9jaz46
OnRyeUxvY2soY29udGV4dCgpLmdyYXBoTG9jaygpKSA6IExvY2tlciB7IGNvbnRleHQoKS5ncmFw
aExvY2soKSB9KSB7CiAgICAgICAgIC8vIFRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgZGVyZWYgd29y
ayBoYXBwZW5zLgogICAgICAgICBkZWNyZW1lbnRDb25uZWN0aW9uQ291bnRXaXRoTG9jaygpOwot
Ci0gICAgICAgIGlmIChtdXN0UmVsZWFzZUxvY2spCi0gICAgICAgICAgICBjb250ZXh0KCkudW5s
b2NrKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gV2Ugd2VyZSB1bmFibGUgdG8gZ2V0IHRo
ZSBsb2NrLCBzbyBwdXQgdGhpcyBpbiBhIGxpc3QgdG8gZmluaXNoIHVwIGxhdGVyLgogICAgICAg
ICBBU1NFUlQoY29udGV4dCgpLmlzQXVkaW9UaHJlYWQoKSk7CkBAIC02NjAsNyArNjQ2LDcgQEAg
dm9pZCBBdWRpb05vZGU6OmRlcmVmKCkKICAgICBBU1NFUlQoIWNvbnRleHQoKS5pc0F1ZGlvVGhy
ZWFkKCkpOwogCiAgICAgewotICAgICAgICBCYXNlQXVkaW9Db250ZXh0OjpBdXRvTG9ja2VyIGxv
Y2tlcihjb250ZXh0KCkpOworICAgICAgICBMb2NrZXIgbG9ja2VyIHsgY29udGV4dCgpLmdyYXBo
TG9jaygpIH07CiAgICAgICAgIC8vIFRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgZGVyZWYgd29yayBo
YXBwZW5zLgogICAgICAgICBkZXJlZldpdGhMb2NrKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb1dvcmtsZXROb2RlLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Xb3JrbGV0Tm9kZS5jcHAKaW5kZXggOWM0
MWQxMzY5MjNmNjdjZmI0MDZhNjIzM2I2NGQ1N2QxMWFjYjBjMC4uMzk2YjI4MjVkNjZkZjdjODNk
MDU2ZWM1N2YwYzliMjNiYmFmNTYzOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxl
cy93ZWJhdWRpby9BdWRpb1dvcmtsZXROb2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL3dlYmF1ZGlvL0F1ZGlvV29ya2xldE5vZGUuY3BwCkBAIC0xMTMsNyArMTEzLDcgQEAgRXhj
ZXB0aW9uT3I8UmVmPEF1ZGlvV29ya2xldE5vZGU+PiBBdWRpb1dvcmtsZXROb2RlOjpjcmVhdGUo
SlNDOjpKU0dsb2JhbE9iamVjdCYKIAogICAgIHsKICAgICAgICAgLy8gVGhlIG5vZGUgc2hvdWxk
IGJlIG1hbnVhbGx5IGFkZGVkIHRvIHRoZSBhdXRvbWF0aWMgcHVsbCBub2RlIGxpc3QsIGV2ZW4g
d2l0aG91dCBhIGNvbm5lY3QoKSBjYWxsLgotICAgICAgICBCYXNlQXVkaW9Db250ZXh0OjpBdXRv
TG9ja2VyIGNvbnRleHRMb2NrZXIoY29udGV4dCk7CisgICAgICAgIExvY2tlciBjb250ZXh0TG9j
a2VyIHsgY29udGV4dC5ncmFwaExvY2soKSB9OwogICAgICAgICBub2RlLT51cGRhdGVQdWxsU3Rh
dHVzKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1
ZGlvL0Jhc2VBdWRpb0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRp
by9CYXNlQXVkaW9Db250ZXh0LmNwcAppbmRleCA0NmJlNmU1MjgwNzU3ZDI0MzEyZGI0Y2JiYmI1
ZTMwZThmMmQwYzk1Li5lMjAyZDdkMjYyYWQwNjQ3YmRhNzZmYmE1MjdmMGE1YTE2MjFhNzgwIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0Jhc2VBdWRpb0NvbnRl
eHQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQmFzZUF1ZGlvQ29u
dGV4dC5jcHAKQEAgLTE5OSw3ICsxOTksNyBAQCB2b2lkIEJhc2VBdWRpb0NvbnRleHQ6OnVuaW5p
dGlhbGl6ZSgpCiAgICAgbV9pc0F1ZGlvVGhyZWFkRmluaXNoZWQgPSB0cnVlOwogCiAgICAgewot
ICAgICAgICBBdXRvTG9ja2VyIGxvY2tlcigqdGhpcyk7CisgICAgICAgIExvY2tlciBsb2NrZXIg
eyBncmFwaExvY2soKSB9OwogICAgICAgICAvLyBUaGlzIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVk
IGZyb20gaGFuZGxlUG9zdFJlbmRlclRhc2tzKCkgYXQgdGhlIGVuZCBvZiByZW5kZXJpbmcuCiAg
ICAgICAgIC8vIEhvd2V2ZXIsIGluIGNhc2Ugb2YgbG9jayBjb250ZW50aW9uLCB0aGUgdHJ5TG9j
aygpIGNhbGwgY291bGQgaGF2ZSBmYWlsZWQgaW4gaGFuZGxlUG9zdFJlbmRlclRhc2tzKCksCiAg
ICAgICAgIC8vIGxlYXZpbmcgbm9kZXMgaW4gbV9yZWZlcmVuY2VkU291cmNlTm9kZXMuIE5vdyB0
aGF0IHRoZSBhdWRpbyB0aHJlYWQgaXMgZ29uZSwgbWFrZSBzdXJlIHdlIGRlcmVmIHRob3NlIG5v
ZGVzCkBAIC01MjQsNyArNTI0LDcgQEAgdm9pZCBCYXNlQXVkaW9Db250ZXh0OjpkZXJlZkZpbmlz
aGVkU291cmNlTm9kZXMoKQogdm9pZCBCYXNlQXVkaW9Db250ZXh0OjpyZWZTb3VyY2VOb2RlKEF1
ZGlvTm9kZSYgbm9kZSkKIHsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIEF1dG9M
b2NrZXIgbG9ja2VyKCp0aGlzKTsKKyAgICBMb2NrZXIgbG9ja2VyIHsgZ3JhcGhMb2NrKCkgfTsK
IAogICAgIEFTU0VSVCghbV9yZWZlcmVuY2VkU291cmNlTm9kZXMuY29udGFpbnMoJm5vZGUpKTsK
ICAgICAvLyBSZWZlcmVuY2Ugc291cmNlIG5vZGUgdG8ga2VlcCBpdCBhbGl2ZSBhbmQgcGxheWlu
ZyBldmVuIGlmIGl0cyBKUyB3cmFwcGVyIGdldHMgZ2FyYmFnZSBjb2xsZWN0ZWQuCkBAIC01NDUs
NzAgKzU0NSwxMiBAQCB2b2lkIEJhc2VBdWRpb0NvbnRleHQ6OmRlcmVmVW5maW5pc2hlZFNvdXJj
ZU5vZGVzKCkKICAgICBtX3JlZmVyZW5jZWRTb3VyY2VOb2Rlcy5jbGVhcigpOwogfQogCi12b2lk
IEJhc2VBdWRpb0NvbnRleHQ6OmxvY2soYm9vbCYgbXVzdFJlbGVhc2VMb2NrKQotewotICAgIC8v
IERvbid0IGFsbG93IHJlZ3VsYXIgbG9jayBpbiByZWFsLXRpbWUgYXVkaW8gdGhyZWFkLgotICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0KLSAgICBsb2NrSW50ZXJuYWwobXVzdFJlbGVhc2VM
b2NrKTsKLX0KLQotdm9pZCBCYXNlQXVkaW9Db250ZXh0Ojpsb2NrSW50ZXJuYWwoYm9vbCYgbXVz
dFJlbGVhc2VMb2NrKQotewotICAgIFRocmVhZCYgdGhpc1RocmVhZCA9IFRocmVhZDo6Y3VycmVu
dCgpOwotCi0gICAgaWYgKCZ0aGlzVGhyZWFkID09IG1fZ3JhcGhPd25lclRocmVhZCkgewotICAg
ICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGxvY2suCi0gICAgICAgIG11c3RSZWxlYXNlTG9j
ayA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFjcXVpcmUgdGhlIGxvY2suCi0g
ICAgICAgIG1fY29udGV4dEdyYXBoTG9jay5sb2NrKCk7Ci0gICAgICAgIG1fZ3JhcGhPd25lclRo
cmVhZCA9ICZ0aGlzVGhyZWFkOwotICAgICAgICBtdXN0UmVsZWFzZUxvY2sgPSB0cnVlOwotICAg
IH0KLX0KLQotYm9vbCBCYXNlQXVkaW9Db250ZXh0Ojp0cnlMb2NrKGJvb2wmIG11c3RSZWxlYXNl
TG9jaykKLXsKLSAgICAvLyBUcnkgdG8gY2F0Y2ggY2FzZXMgb2YgdXNpbmcgdHJ5IGxvY2sgb24g
bWFpbiB0aHJlYWQgLSBpdCBzaG91bGQgdXNlIHJlZ3VsYXIgbG9jay4KLSAgICBBU1NFUlQoaXNB
dWRpb1RocmVhZCgpIHx8IGlzQXVkaW9UaHJlYWRGaW5pc2hlZCgpKTsKLSAgICAKLSAgICBpZiAo
IWlzQXVkaW9UaHJlYWQoKSkgewotICAgICAgICAvLyBJbiByZWxlYXNlIGJ1aWxkIHRyZWF0IHRy
eUxvY2soKSBhcyBsb2NrKCkgKHNpbmNlIGFib3ZlIEFTU0VSVChpc0F1ZGlvVGhyZWFkKSBuZXZl
ciBmaXJlcykgLSB0aGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBkby4KLSAgICAgICAgbG9jayhtdXN0
UmVsZWFzZUxvY2spOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgYm9v
bCBoYXNMb2NrOwotICAgIAotICAgIGlmIChpc0dyYXBoT3duZXIoKSkgewotICAgICAgICAvLyBU
aHJlYWQgYWxyZWFkeSBoYXMgdGhlIGxvY2suCi0gICAgICAgIGhhc0xvY2sgPSB0cnVlOwotICAg
ICAgICBtdXN0UmVsZWFzZUxvY2sgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBE
b24ndCBhbHJlYWR5IGhhdmUgdGhlIGxvY2sgLSB0cnkgdG8gYWNxdWlyZSBpdC4KLSAgICAgICAg
aGFzTG9jayA9IG1fY29udGV4dEdyYXBoTG9jay50cnlMb2NrKCk7Ci0gICAgICAgIAotICAgICAg
ICBpZiAoaGFzTG9jaykKLSAgICAgICAgICAgIG1fZ3JhcGhPd25lclRocmVhZCA9ICZUaHJlYWQ6
OmN1cnJlbnQoKTsKLQotICAgICAgICBtdXN0UmVsZWFzZUxvY2sgPSBoYXNMb2NrOwotICAgIH0K
LSAgICAKLSAgICByZXR1cm4gaGFzTG9jazsKLX0KLQotdm9pZCBCYXNlQXVkaW9Db250ZXh0Ojp1
bmxvY2soKQotewotICAgIEFTU0VSVChtX2dyYXBoT3duZXJUaHJlYWQgPT0gJlRocmVhZDo6Y3Vy
cmVudCgpKTsKLQotICAgIG1fZ3JhcGhPd25lclRocmVhZCA9IG51bGxwdHI7Ci0gICAgbV9jb250
ZXh0R3JhcGhMb2NrLnVubG9jaygpOwotfQotCiB2b2lkIEJhc2VBdWRpb0NvbnRleHQ6OmFkZERl
ZmVycmVkRGVjcmVtZW50Q29ubmVjdGlvbkNvdW50KEF1ZGlvTm9kZSogbm9kZSkKIHsKICAgICBB
U1NFUlQoaXNBdWRpb1RocmVhZCgpKTsKKyAgICAvLyBIZWFwIGFsbG9jYXRpb25zIGFyZSBmb3Ji
aWRkZW4gb24gdGhlIGF1ZGlvIHRocmVhZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyBzbyB3ZSBu
ZWVkIHRvCisgICAgLy8gZXhwbGljaXRseSBhbGxvdyB0aGUgZm9sbG93aW5nIGFsbG9jYXRpb24o
cykuCisgICAgRGlzYWJsZU1hbGxvY1Jlc3RyaWN0aW9uc0ZvckN1cnJlbnRUaHJlYWRTY29wZSBk
aXNhYmxlTWFsbG9jUmVzdHJpY3Rpb25zOwogICAgIG1fZGVmZXJyZWRCcmVha0Nvbm5lY3Rpb25M
aXN0LmFwcGVuZChub2RlKTsKIH0KIApAQCAtNjE4LDI0ICs1NjAsMjAgQEAgdm9pZCBCYXNlQXVk
aW9Db250ZXh0OjpoYW5kbGVQcmVSZW5kZXJUYXNrcyhjb25zdCBBdWRpb0lPUG9zaXRpb24mIG91
dHB1dFBvc2l0aW8KIAogICAgIC8vIEF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgcmVuZGVyIHF1
YW50dW0sIHRyeSB0byB1cGRhdGUgdGhlIGludGVybmFsIHJlbmRlcmluZyBncmFwaCBzdGF0ZSAo
ZnJvbSBtYWluIHRocmVhZCBjaGFuZ2VzKS4KICAgICAvLyBJdCdzIE9LIGlmIHRoZSB0cnlMb2Nr
KCkgZmFpbHMsIHdlJ2xsIGp1c3QgdGFrZSBzbGlnaHRseSBsb25nZXIgdG8gcGljayB1cCB0aGUg
Y2hhbmdlcy4KLSAgICBib29sIG11c3RSZWxlYXNlTG9jazsKLSAgICBpZiAodHJ5TG9jayhtdXN0
UmVsZWFzZUxvY2spKSB7CisgICAgaWYgKGF1dG8gbG9ja2VyID0gTG9ja2VyPFJlY3Vyc2l2ZUxv
Y2s+Ojp0cnlMb2NrKGdyYXBoTG9jaygpKSkgewogICAgICAgICAvLyBGaXh1cCB0aGUgc3RhdGUg
b2YgYW55IGRpcnR5IEF1ZGlvU3VtbWluZ0p1bmN0aW9ucyBhbmQgQXVkaW9Ob2RlT3V0cHV0cy4K
ICAgICAgICAgaGFuZGxlRGlydHlBdWRpb1N1bW1pbmdKdW5jdGlvbnMoKTsKICAgICAgICAgaGFu
ZGxlRGlydHlBdWRpb05vZGVPdXRwdXRzKCk7CiAKICAgICAgICAgdXBkYXRlQXV0b21hdGljUHVs
bE5vZGVzKCk7CiAgICAgICAgIG1fb3V0cHV0UG9zaXRpb24gPSBvdXRwdXRQb3NpdGlvbjsKLQot
ICAgICAgICBpZiAobXVzdFJlbGVhc2VMb2NrKQotICAgICAgICAgICAgdW5sb2NrKCk7CiAgICAg
fQogfQogCiBBdWRpb0lPUG9zaXRpb24gQmFzZUF1ZGlvQ29udGV4dDo6b3V0cHV0UG9zaXRpb24o
KQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Ci0gICAgQXV0b0xvY2tlciBsb2NrZXIo
KnRoaXMpOworICAgIExvY2tlciBsb2NrZXIgeyBncmFwaExvY2soKSB9OwogICAgIHJldHVybiBt
X291dHB1dFBvc2l0aW9uOwogfQogCkBAIC02NDYsOCArNTg0LDggQEAgdm9pZCBCYXNlQXVkaW9D
b250ZXh0OjpoYW5kbGVQb3N0UmVuZGVyVGFza3MoKQogICAgIC8vIE11c3QgdXNlIGEgdHJ5TG9j
aygpIGhlcmUgdG9vLiBEb24ndCB3b3JyeSwgdGhlIGxvY2sgd2lsbCB2ZXJ5IHJhcmVseSBiZSBj
b250ZW5kZWQgYW5kIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcmVxdWVudGx5LgogICAgIC8vIFRo
ZSB3b3JzdCB0aGF0IGNhbiBoYXBwZW4gaXMgdGhhdCB0aGVyZSB3aWxsIGJlIHNvbWUgbm9kZXMg
d2hpY2ggd2lsbCB0YWtlIHNsaWdodGx5IGxvbmdlciB0aGFuIHVzdWFsIHRvIGJlIGRlbGV0ZWQg
b3IgcmVtb3ZlZAogICAgIC8vIGZyb20gdGhlIHJlbmRlciBncmFwaCAoaW4gd2hpY2ggY2FzZSB0
aGV5J2xsIHJlbmRlciBzaWxlbmNlKS4KLSAgICBib29sIG11c3RSZWxlYXNlTG9jazsKLSAgICBp
ZiAoIXRyeUxvY2sobXVzdFJlbGVhc2VMb2NrKSkKKyAgICBhdXRvIGxvY2tlciA9IExvY2tlcjxS
ZWN1cnNpdmVMb2NrPjo6dHJ5TG9jayhncmFwaExvY2soKSk7CisgICAgaWYgKCFsb2NrZXIpCiAg
ICAgICAgIHJldHVybjsKIAogICAgIC8vIFRha2UgY2FyZSBvZiBmaW5pc2hpbmcgYW55IGRlcmVm
cyB3aGVyZSB0aGUgdHJ5TG9jaygpIGZhaWxlZCBwcmV2aW91c2x5LgpAQCAtNjY1LDkgKzYwMyw2
IEBAIHZvaWQgQmFzZUF1ZGlvQ29udGV4dDo6aGFuZGxlUG9zdFJlbmRlclRhc2tzKCkKICAgICBo
YW5kbGVEaXJ0eUF1ZGlvTm9kZU91dHB1dHMoKTsKIAogICAgIHVwZGF0ZUF1dG9tYXRpY1B1bGxO
b2RlcygpOwotCi0gICAgaWYgKG11c3RSZWxlYXNlTG9jaykKLSAgICAgICAgdW5sb2NrKCk7CiB9
CiAKIHZvaWQgQmFzZUF1ZGlvQ29udGV4dDo6aGFuZGxlRGVmZXJyZWREZWNyZW1lbnRDb25uZWN0
aW9uQ291bnRzKCkKQEAgLTcyNywxMCArNjYyLDEwIEBAIHZvaWQgQmFzZUF1ZGlvQ29udGV4dDo6
ZGVsZXRlTWFya2VkTm9kZXMoKQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CiAKLSAg
ICAvLyBQcm90ZWN0IHRoaXMgb2JqZWN0IGZyb20gYmVpbmcgZGVsZXRlZCBiZWZvcmUgd2UgcmVs
ZWFzZSB0aGUgbXV0ZXggbG9ja2VkIGJ5IEF1dG9Mb2NrZXIuCisgICAgLy8gUHJvdGVjdCB0aGlz
IG9iamVjdCBmcm9tIGJlaW5nIGRlbGV0ZWQgYmVmb3JlIHdlIHJlbGVhc2UgdGhlIGxvY2suCiAg
ICAgYXV0byBwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyk7CiAKLSAgICBBdXRvTG9ja2Vy
IGxvY2tlcigqdGhpcyk7CisgICAgTG9ja2VyIGxvY2tlciB7IGdyYXBoTG9jaygpIH07CiAKICAg
ICB3aGlsZSAobV9ub2Rlc1RvRGVsZXRlLnNpemUoKSkgewogICAgICAgICBBdWRpb05vZGUqIG5v
ZGUgPSBtX25vZGVzVG9EZWxldGUudGFrZUxhc3QoKTsKQEAgLTc2NSw3ICs3MDAsNyBAQCB2b2lk
IEJhc2VBdWRpb0NvbnRleHQ6Om1hcmtTdW1taW5nSnVuY3Rpb25EaXJ0eShBdWRpb1N1bW1pbmdK
dW5jdGlvbiogc3VtbWluZ0p1bgogdm9pZCBCYXNlQXVkaW9Db250ZXh0OjpyZW1vdmVNYXJrZWRT
dW1taW5nSnVuY3Rpb24oQXVkaW9TdW1taW5nSnVuY3Rpb24qIHN1bW1pbmdKdW5jdGlvbikKIHsK
ICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotICAgIEF1dG9Mb2NrZXIgbG9ja2VyKCp0aGlz
KTsKKyAgICBMb2NrZXIgbG9ja2VyIHsgZ3JhcGhMb2NrKCkgfTsKICAgICBtX2RpcnR5U3VtbWlu
Z0p1bmN0aW9ucy5yZW1vdmUoc3VtbWluZ0p1bmN0aW9uKTsKIH0KIApAQCAtNzgyLDcgKzcxNyw3
IEBAIHZvaWQgQmFzZUF1ZGlvQ29udGV4dDo6bWFya0F1ZGlvTm9kZU91dHB1dERpcnR5KEF1ZGlv
Tm9kZU91dHB1dCogb3V0cHV0KQogCiB2b2lkIEJhc2VBdWRpb0NvbnRleHQ6OmhhbmRsZURpcnR5
QXVkaW9TdW1taW5nSnVuY3Rpb25zKCkKIHsKLSAgICBBU1NFUlQoaXNHcmFwaE93bmVyKCkpOyAg
ICAKKyAgICBBU1NFUlQoaXNHcmFwaE93bmVyKCkpOwogCiAgICAgZm9yIChhdXRvJiBqdW5jdGlv
biA6IG1fZGlydHlTdW1taW5nSnVuY3Rpb25zKQogICAgICAgICBqdW5jdGlvbi0+dXBkYXRlUmVu
ZGVyaW5nU3RhdGUoKTsKQEAgLTc5Miw3ICs3MjcsNyBAQCB2b2lkIEJhc2VBdWRpb0NvbnRleHQ6
OmhhbmRsZURpcnR5QXVkaW9TdW1taW5nSnVuY3Rpb25zKCkKIAogdm9pZCBCYXNlQXVkaW9Db250
ZXh0OjpoYW5kbGVEaXJ0eUF1ZGlvTm9kZU91dHB1dHMoKQogewotICAgIEFTU0VSVChpc0dyYXBo
T3duZXIoKSk7ICAgIAorICAgIEFTU0VSVChpc0dyYXBoT3duZXIoKSk7CiAKICAgICBmb3IgKGF1
dG8mIG91dHB1dCA6IG1fZGlydHlBdWRpb05vZGVPdXRwdXRzKQogICAgICAgICBvdXRwdXQtPnVw
ZGF0ZVJlbmRlcmluZ1N0YXRlKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmF1ZGlvL0Jhc2VBdWRpb0NvbnRleHQuaCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vi
YXVkaW8vQmFzZUF1ZGlvQ29udGV4dC5oCmluZGV4IGQ5ZmUyYjVhNjFiZDAxYjc1ZmU1OTZjOTcy
ZGM2ZGI0ZmE1YzA4ZjQuLmZhYjc3YTkzYmNjMzEyMWRmYTI4OGMxODI4ZDIzZTU1NThkZjlmYjkg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQmFzZUF1ZGlvQ29u
dGV4dC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQmFzZUF1ZGlvQ29u
dGV4dC5oCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KICNpbmNs
dWRlIDx3dGYvTG9nZ2VySGVscGVyLmg+CiAjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KKyNp
bmNsdWRlIDx3dGYvUmVjdXJzaXZlTG9ja0FkYXB0ZXIuaD4KICNpbmNsdWRlIDx3dGYvVGhyZWFk
U2FmZVJlZkNvdW50ZWQuaD4KICNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CiAKQEAgLTE4Niwx
NyArMTg3LDEwIEBAIHB1YmxpYzoKICAgICAvLyBSZXR1cm5zIHRydWUgb25seSBhZnRlciB0aGUg
YXVkaW8gdGhyZWFkIGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIHRoZW4gc2h1dGRvd24uCiAgICAgYm9v
bCBpc0F1ZGlvVGhyZWFkRmluaXNoZWQoKSBjb25zdCB7IHJldHVybiBtX2lzQXVkaW9UaHJlYWRG
aW5pc2hlZDsgfQogCi0gICAgLy8gbXVzdFJlbGVhc2VMb2NrIGlzIHNldCB0byB0cnVlIGlmIHdl
IGFjcXVpcmVkIHRoZSBsb2NrIGluIHRoaXMgbWV0aG9kIGNhbGwgYW5kIGNhbGxlciBtdXN0IHVu
bG9jaygpLCBmYWxzZSBpZiBpdCB3YXMgcHJldmlvdXNseSBhY3F1aXJlZC4KLSAgICB2b2lkIGxv
Y2soYm9vbCYgbXVzdFJlbGVhc2VMb2NrKTsKLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBv
d24gdGhlIGxvY2suCi0gICAgLy8gbXVzdFJlbGVhc2VMb2NrIGlzIHNldCB0byB0cnVlIGlmIHdl
IGFjcXVpcmVkIHRoZSBsb2NrIGluIHRoaXMgbWV0aG9kIGNhbGwgYW5kIGNhbGxlciBtdXN0IHVu
bG9jaygpLCBmYWxzZSBpZiBpdCB3YXMgcHJldmlvdXNseSBhY3F1aXJlZC4KLSAgICBib29sIHRy
eUxvY2soYm9vbCYgbXVzdFJlbGVhc2VMb2NrKTsKLQotICAgIHZvaWQgdW5sb2NrKCk7CisgICAg
UmVjdXJzaXZlTG9jayYgZ3JhcGhMb2NrKCkgeyByZXR1cm4gbV9ncmFwaExvY2s7IH0KIAogICAg
IC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRocmVhZCBvd25zIHRoZSBjb250ZXh0J3MgbG9jay4K
LSAgICBib29sIGlzR3JhcGhPd25lcigpIGNvbnN0IHsgcmV0dXJuIG1fZ3JhcGhPd25lclRocmVh
ZCA9PSAmVGhyZWFkOjpjdXJyZW50KCk7IH0KKyAgICBib29sIGlzR3JhcGhPd25lcigpIGNvbnN0
IHsgcmV0dXJuIG1fZ3JhcGhMb2NrLmlzT3duZXIoKTsgfQogCiAgICAgLy8gVGhpcyBpcyBjb25z
aWRlcmluZyAzMiBpcyBsYXJnZSBlbm91Z2ggZm9yIG11bHRpcGxlIGNoYW5uZWxzIGF1ZGlvLgog
ICAgIC8vIEl0IGlzIHNvbWV3aGF0IGFyYml0cmFyeSBhbmQgY291bGQgYmUgaW5jcmVhc2VkIGlm
IG5lY2Vzc2FyeS4KQEAgLTIzMiwyNSArMjI2LDYgQEAgcHVibGljOgogICAgIGNvbnN0IFNlY3Vy
aXR5T3JpZ2luKiBvcmlnaW4oKSBjb25zdDsKICAgICB2b2lkIGFkZENvbnNvbGVNZXNzYWdlKE1l
c3NhZ2VTb3VyY2UsIE1lc3NhZ2VMZXZlbCwgY29uc3QgU3RyaW5nJiBtZXNzYWdlKTsKIAotICAg
IGNsYXNzIEF1dG9Mb2NrZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgQXV0b0xv
Y2tlcihCYXNlQXVkaW9Db250ZXh0JiBjb250ZXh0KQotICAgICAgICAgICAgOiBtX2NvbnRleHQo
Y29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgbV9jb250ZXh0LmxvY2sobV9tdXN0UmVs
ZWFzZUxvY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgfkF1dG9Mb2NrZXIoKQotICAgICAgICB7
Ci0gICAgICAgICAgICBpZiAobV9tdXN0UmVsZWFzZUxvY2spCi0gICAgICAgICAgICAgICAgbV9j
b250ZXh0LnVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBCYXNl
QXVkaW9Db250ZXh0JiBtX2NvbnRleHQ7Ci0gICAgICAgIGJvb2wgbV9tdXN0UmVsZWFzZUxvY2s7
Ci0gICAgfTsKLQogICAgIHZpcnR1YWwgdm9pZCBsYXp5SW5pdGlhbGl6ZSgpOwogCiAgICAgc3Rh
dGljIGJvb2wgaXNTdXBwb3J0ZWRTYW1wbGVSYXRlKGZsb2F0IHNhbXBsZVJhdGUpOwpAQCAtMjY2
LDggKzI0MSw2IEBAIHByb3RlY3RlZDoKICAgICB2b2lkIGNsZWFyUGVuZGluZ0FjdGl2aXR5KCk7
CiAgICAgdm9pZCBzZXRQZW5kaW5nQWN0aXZpdHkoKTsKIAotICAgIHZvaWQgbG9ja0ludGVybmFs
KGJvb2wmIG11c3RSZWxlYXNlTG9jayk7Ci0KICAgICB2aXJ0dWFsIHZvaWQgdW5pbml0aWFsaXpl
KCk7CiAKICNpZiAhUkVMRUFTRV9MT0dfRElTQUJMRUQKQEAgLTM1MSw3ICszMjQsOCBAQCBwcml2
YXRlOgogICAgIFJlZjxBdWRpb0xpc3RlbmVyPiBtX2xpc3RlbmVyOwogCiAgICAgc3RkOjphdG9t
aWM8VGhyZWFkKj4gbV9hdWRpb1RocmVhZDsKLSAgICBzdGQ6OmF0b21pYzxUaHJlYWQqPiBtX2dy
YXBoT3duZXJUaHJlYWQ7IC8vIGlmIHRoZSBsb2NrIGlzIGhlbGQgdGhlbiB0aGlzIGlzIHRoZSB0
aHJlYWQgd2hpY2ggb3ducyBpdCwgb3RoZXJ3aXNlID09IG51bGxwdHIuCisKKyAgICBSZWN1cnNp
dmVMb2NrIG1fZ3JhcGhMb2NrOwogCiAgICAgc3RkOjp1bmlxdWVfcHRyPEFzeW5jQXVkaW9EZWNv
ZGVyPiBtX2F1ZGlvRGVjb2RlcjsKIApAQCAtMzczLDcgKzM0Nyw2IEBAIHByaXZhdGU6CiAKICAg
ICB1bnNpZ25lZCBtX2Nvbm5lY3Rpb25Db3VudCB7IDAgfTsKICAgICBTdGF0ZSBtX3N0YXRlIHsg
U3RhdGU6OlN1c3BlbmRlZCB9OwotICAgIExvY2sgbV9jb250ZXh0R3JhcGhMb2NrOwogICAgIGJv
b2wgbV9pc0RlbGV0aW9uU2NoZWR1bGVkIHsgZmFsc2UgfTsKICAgICBib29sIG1faXNTdG9wU2No
ZWR1bGVkIHsgZmFsc2UgfTsKICAgICBib29sIG1faXNJbml0aWFsaXplZCB7IGZhbHNlIH07CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0NoYW5uZWxNZXJnZXJO
b2RlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQ2hhbm5lbE1lcmdlck5v
ZGUuY3BwCmluZGV4IDA4MGFiNWFiNTJhNzUwZWJmOWYwZjM4NWU1OTJiZjk4YjhlYmE3NzIuLmFm
MmZmZTRhMDk1ODFlOTVlODc0MzQwOTMyOGUxY2ViYjY2NWQ1ODIgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQ2hhbm5lbE1lcmdlck5vZGUuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQ2hhbm5lbE1lcmdlck5vZGUuY3BwCkBAIC02
Niw3ICs2Niw3IEBAIENoYW5uZWxNZXJnZXJOb2RlOjpDaGFubmVsTWVyZ2VyTm9kZShCYXNlQXVk
aW9Db250ZXh0JiBjb250ZXh0LCB1bnNpZ25lZCBudW1iZXJPCiAgICAgCiAgICAgaW5pdGlhbGl6
ZSgpOwogCi0gICAgQmFzZUF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBjb250ZXh0TG9ja2VyKGNv
bnRleHQpOworICAgIExvY2tlciBjb250ZXh0TG9ja2VyIHsgY29udGV4dC5ncmFwaExvY2soKSB9
OwogICAgIGRpc2FibGVPdXRwdXRzKCk7CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L01vZHVsZXMvd2ViYXVkaW8vQ29udm9sdmVyTm9kZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL3dlYmF1ZGlvL0NvbnZvbHZlck5vZGUuY3BwCmluZGV4IGRlZDRmYmU3M2I4N2Y4N2RkN2Ey
ZjgyMzBhN2NkOGU1YzkzOTg3ZWUuLjJiOGExOWQxMzhlM2EyMWQxZjRjMDA2YjE4YmY3Zjk1OGZm
YjkzYzEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQ29udm9s
dmVyTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9Db252b2x2
ZXJOb2RlLmNwcApAQCAtMTQ0LDcgKzE0NCw3IEBAIEV4Y2VwdGlvbk9yPHZvaWQ+IENvbnZvbHZl
ck5vZGU6OnNldEJ1ZmZlcihSZWZQdHI8QXVkaW9CdWZmZXI+JiYgYnVmZmVyKQogCiAgICAgewog
ICAgICAgICAvLyBUaGUgY29udGV4dCBtdXN0IGJlIGxvY2tlZCBzaW5jZSBjaGFuZ2luZyB0aGUg
YnVmZmVyIGNhbiByZS1jb25maWd1cmUgdGhlIG51bWJlciBvZiBjaGFubmVscyB0aGF0IGFyZSBv
dXRwdXQuCi0gICAgICAgIEJhc2VBdWRpb0NvbnRleHQ6OkF1dG9Mb2NrZXIgY29udGV4dExvY2tl
cihjb250ZXh0KCkpOworICAgICAgICBMb2NrZXIgY29udGV4dExvY2tlciB7IGNvbnRleHQoKS5n
cmFwaExvY2soKSB9OwogCiAgICAgICAgIC8vIFN5bmNocm9uaXplIHdpdGggcHJvY2VzcygpLgog
ICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRMb2NrKG1fcHJvY2Vzc0xvY2spOwpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9NZWRpYUVsZW1lbnRBdWRpb1NvdXJj
ZU5vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9NZWRpYUVsZW1lbnRB
dWRpb1NvdXJjZU5vZGUuY3BwCmluZGV4IGZlNDBkNjUwNWRiNTBiZWVmMWMzOGYzMjVmY2FmMWRi
ZjcxZTQ3NjYuLmI0YmU1NzU3MTVmNzBiMDkyZTMyZjI2ODk4ZjAxNGI2OWU4NjlhNzIgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vTWVkaWFFbGVtZW50QXVkaW9T
b3VyY2VOb2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL01lZGlh
RWxlbWVudEF1ZGlvU291cmNlTm9kZS5jcHAKQEAgLTExMCw3ICsxMTAsNyBAQCB2b2lkIE1lZGlh
RWxlbWVudEF1ZGlvU291cmNlTm9kZTo6c2V0Rm9ybWF0KHNpemVfdCBudW1iZXJPZkNoYW5uZWxz
LCBmbG9hdCBzb3VyYwogCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIFRoZSBjb250ZXh0IG11
c3QgYmUgbG9ja2VkIHdoZW4gY2hhbmdpbmcgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMu
Ci0gICAgICAgICAgICBCYXNlQXVkaW9Db250ZXh0OjpBdXRvTG9ja2VyIGNvbnRleHRMb2NrZXIo
Y29udGV4dCgpKTsKKyAgICAgICAgICAgIExvY2tlciBjb250ZXh0TG9ja2VyIHsgY29udGV4dCgp
LmdyYXBoTG9jaygpIH07CiAKICAgICAgICAgICAgIC8vIERvIGFueSBuZWNlc3NzYXJ5IHJlLWNv
bmZpZ3VyYXRpb24gdG8gdGhlIG91dHB1dCdzIG51bWJlciBvZiBjaGFubmVscy4KICAgICAgICAg
ICAgIG91dHB1dCgwKS0+c2V0TnVtYmVyT2ZDaGFubmVscyhudW1iZXJPZkNoYW5uZWxzKTsKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vTWVkaWFTdHJlYW1BdWRp
b1NvdXJjZU5vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9NZWRpYVN0
cmVhbUF1ZGlvU291cmNlTm9kZS5jcHAKaW5kZXggYjUzZTNjZjgyNTVkMmE3YTZkNTdiZDhhNTdl
M2E1NjJkYmM3ODc5Mi4uZjY4ZTlmNDc3OGMzNzkxNTFkZTQ3OTg4ZDU2MWM4ZDNlYWJkNjhjMSAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9NZWRpYVN0cmVhbUF1
ZGlvU291cmNlTm9kZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9N
ZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZS5jcHAKQEAgLTExOCw3ICsxMTgsNyBAQCB2b2lkIE1l
ZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlOjpzZXRGb3JtYXQoc2l6ZV90IG51bWJlck9mQ2hhbm5l
bHMsIGZsb2F0IHNvdXJjZQogCiAgICAgewogICAgICAgICAvLyBUaGUgY29udGV4dCBtdXN0IGJl
IGxvY2tlZCB3aGVuIGNoYW5naW5nIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLgotICAg
ICAgICBBdWRpb0NvbnRleHQ6OkF1dG9Mb2NrZXIgY29udGV4dExvY2tlcihjb250ZXh0KCkpOwor
ICAgICAgICBMb2NrZXIgY29udGV4dExvY2tlciB7IGNvbnRleHQoKS5ncmFwaExvY2soKSB9Owog
CiAgICAgICAgIC8vIERvIGFueSBuZWNlc3NzYXJ5IHJlLWNvbmZpZ3VyYXRpb24gdG8gdGhlIG91
dHB1dCdzIG51bWJlciBvZiBjaGFubmVscy4KICAgICAgICAgb3V0cHV0KDApLT5zZXROdW1iZXJP
ZkNoYW5uZWxzKG51bWJlck9mQ2hhbm5lbHMpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
TW9kdWxlcy93ZWJhdWRpby9PZmZsaW5lQXVkaW9Db250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L01vZHVsZXMvd2ViYXVkaW8vT2ZmbGluZUF1ZGlvQ29udGV4dC5jcHAKaW5kZXggYTgzOWM4M2I1
YzZiNzMwMTUyODBmMzUwYzFjMTJkZTIyYTA2Zjg0Mi4uYzE1ZTViOWQ4ZDgxMjAzNWZhNzY3ZjAz
M2Q1NDI4NGRmZTg3YWM0YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJh
dWRpby9PZmZsaW5lQXVkaW9Db250ZXh0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmF1ZGlvL09mZmxpbmVBdWRpb0NvbnRleHQuY3BwCkBAIC0xNDQsNyArMTQ0LDcgQEAgdm9p
ZCBPZmZsaW5lQXVkaW9Db250ZXh0OjpzdXNwZW5kUmVuZGVyaW5nKGRvdWJsZSBzdXNwZW5kVGlt
ZSwgUmVmPERlZmVycmVkUHJvbWkKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEF1dG9M
b2NrZXIgbG9ja2VyKCp0aGlzKTsKKyAgICBMb2NrZXIgbG9ja2VyIHsgZ3JhcGhMb2NrKCkgfTsK
ICAgICBhdXRvIGFkZFJlc3VsdCA9IG1fc3VzcGVuZFJlcXVlc3RzLmFkZChmcmFtZSwgcHJvbWlz
ZS5wdHIoKSk7CiAgICAgaWYgKCFhZGRSZXN1bHQuaXNOZXdFbnRyeSkgewogICAgICAgICBwcm9t
aXNlLT5yZWplY3QoRXhjZXB0aW9uIHsgSW52YWxpZFN0YXRlRXJyb3IsICJUaGVyZSBpcyBhbHJl
YWR5IGEgcGVuZGluZyBzdXNwZW5kIHJlcXVlc3QgYXQgdGhpcyBmcmFtZSJfcyB9KTsKQEAgLTE4
Myw5ICsxODMsMTAgQEAgdm9pZCBPZmZsaW5lQXVkaW9Db250ZXh0OjpyZXN1bWVSZW5kZXJpbmco
UmVmPERlZmVycmVkUHJvbWlzZT4mJiBwcm9taXNlKQogYm9vbCBPZmZsaW5lQXVkaW9Db250ZXh0
OjpzaG91bGRTdXNwZW5kKCkKIHsKICAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKLSAgICAv
LyBOb3RlIHRoYXQgT2ZmbGluZUF1dG9Mb2NrZXIgdXNlcyBsb2NrKCkgaW5zdGVhZCBvZiB0cnlM
b2NrKCkuIFdlIHVzdWFsbHkgYXZvaWQgYmxvY2tpbmcgdGhlIEF1ZGlvVGhyZWFkCisgICAgLy8g
Tm90ZSB0aGF0IHdlIGFyZSBub3QgdXNpbmcgYSB0cnlMb2NrKCkgaGVyZS4gV2UgdXN1YWxseSBh
dm9pZCBibG9ja2luZyB0aGUgQXVkaW9UaHJlYWQKICAgICAvLyBvbiBsb2NrKCkgYnV0IHdlIGRv
bid0IGhhdmUgYSBjaG9pY2UgaGVyZSBzaW5jZSB0aGUgc3VzcGVuc2lvbiBuZWVkIHRvIGJlIGV4
YWN0LgotICAgIE9mZmxpbmVBdXRvTG9ja2VyIGxvY2tlcigqdGhpcyk7CisgICAgLy8gQWxzbywg
dGhpcyBub3QgYSByZWFsLXRpbWUgQXVkaW9Db250ZXh0IHNvIGJsb2NraW5nIHRoZSBBdWRpb1Ro
cmVhZCBpcyBub3QgYXMgaGFybWZ1bC4KKyAgICBMb2NrZXIgbG9ja2VyIHsgZ3JhcGhMb2NrKCkg
fTsKICAgICByZXR1cm4gbV9zdXNwZW5kUmVxdWVzdHMuY29udGFpbnMoY3VycmVudFNhbXBsZUZy
YW1lKCkpOwogfQogCkBAIC0xOTcsNyArMTk4LDcgQEAgdm9pZCBPZmZsaW5lQXVkaW9Db250ZXh0
OjpkaWRTdXNwZW5kUmVuZGVyaW5nKHNpemVfdCBmcmFtZSkKIAogICAgIFJlZlB0cjxEZWZlcnJl
ZFByb21pc2U+IHByb21pc2U7CiAgICAgewotICAgICAgICBBdXRvTG9ja2VyIGxvY2tlcigqdGhp
cyk7CisgICAgICAgIExvY2tlciBsb2NrZXIgeyBncmFwaExvY2soKSB9OwogICAgICAgICBwcm9t
aXNlID0gbV9zdXNwZW5kUmVxdWVzdHMudGFrZShmcmFtZSk7CiAgICAgfQogICAgIEFTU0VSVChw
cm9taXNlKTsKQEAgLTI0NCwxMiArMjQ1LDYgQEAgdm9pZCBPZmZsaW5lQXVkaW9Db250ZXh0Ojpz
ZXR0bGVSZW5kZXJpbmdQcm9taXNlKEV4Y2VwdGlvbk9yPFJlZjxBdWRpb0J1ZmZlcj4+JiYKICAg
ICBwcm9taXNlLT5yZXNvbHZlPElETEludGVyZmFjZTxBdWRpb0J1ZmZlcj4+KHJlc3VsdC5yZWxl
YXNlUmV0dXJuVmFsdWUoKSk7CiB9CiAKLXZvaWQgT2ZmbGluZUF1ZGlvQ29udGV4dDo6b2ZmbGlu
ZUxvY2soYm9vbCYgbXVzdFJlbGVhc2VMb2NrKQotewotICAgIEFTU0VSVCghaXNNYWluVGhyZWFk
KCkpOwotICAgIGxvY2tJbnRlcm5hbChtdXN0UmVsZWFzZUxvY2spOwotfQotCiB2b2lkIE9mZmxp
bmVBdWRpb0NvbnRleHQ6OmRpc3BhdGNoRXZlbnQoRXZlbnQmIGV2ZW50KQogewogICAgIEJhc2VB
dWRpb0NvbnRleHQ6OmRpc3BhdGNoRXZlbnQoZXZlbnQpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvTW9kdWxlcy93ZWJhdWRpby9PZmZsaW5lQXVkaW9Db250ZXh0LmggYi9Tb3VyY2UvV2Vi
Q29yZS9Nb2R1bGVzL3dlYmF1ZGlvL09mZmxpbmVBdWRpb0NvbnRleHQuaAppbmRleCBkNDE4NjUy
YTkzMDhkNDVmNmQ2ZmJkZTUxNWI3NmUzM2Q4YTJhNDRjLi42ZTJhNmJkMWUzYWJkZTg5ZmIxNjUw
YjRmMmM0NWIyODgwZGNhNDE4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dl
YmF1ZGlvL09mZmxpbmVBdWRpb0NvbnRleHQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmF1ZGlvL09mZmxpbmVBdWRpb0NvbnRleHQuaApAQCAtNTcsMjggKzU3LDYgQEAgcHJpdmF0
ZToKIAogICAgIEF1ZGlvQnVmZmVyKiByZW5kZXJUYXJnZXQoKSBjb25zdCB7IHJldHVybiBkZXN0
aW5hdGlvbigpLnJlbmRlclRhcmdldCgpOyB9CiAKLSAgICAvLyBtdXN0UmVsZWFzZUxvY2sgaXMg
c2V0IHRvIHRydWUgaWYgd2UgYWNxdWlyZWQgdGhlIGxvY2sgaW4gdGhpcyBtZXRob2QgY2FsbCBh
bmQgY2FsbGVyIG11c3QgdW5sb2NrKCksIGZhbHNlIGlmIGl0IHdhcyBwcmV2aW91c2x5IGFjcXVp
cmVkLgotICAgIHZvaWQgb2ZmbGluZUxvY2soYm9vbCYgbXVzdFJlbGVhc2VMb2NrKTsKLQotICAg
IGNsYXNzIE9mZmxpbmVBdXRvTG9ja2VyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0
IE9mZmxpbmVBdXRvTG9ja2VyKE9mZmxpbmVBdWRpb0NvbnRleHQmIGNvbnRleHQpCi0gICAgICAg
ICAgICA6IG1fY29udGV4dChjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBtX2NvbnRl
eHQub2ZmbGluZUxvY2sobV9tdXN0UmVsZWFzZUxvY2spOwotICAgICAgICB9Ci0KLSAgICAgICAg
fk9mZmxpbmVBdXRvTG9ja2VyKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1fbXVzdFJl
bGVhc2VMb2NrKQotICAgICAgICAgICAgICAgIG1fY29udGV4dC51bmxvY2soKTsKLSAgICAgICAg
fQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgT2ZmbGluZUF1ZGlvQ29udGV4dCYgbV9jb250ZXh0
OwotICAgICAgICBib29sIG1fbXVzdFJlbGVhc2VMb2NrOwotICAgIH07Ci0KICAgICAvLyBBY3Rp
dmVET01PYmplY3QKICAgICBjb25zdCBjaGFyKiBhY3RpdmVET01PYmplY3ROYW1lKCkgY29uc3Qg
ZmluYWw7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vV2F2
ZVNoYXBlck5vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9XYXZlU2hh
cGVyTm9kZS5jcHAKaW5kZXggNjgxZjQwYTE0ZDAzYTdhZDhjOGQzY2EyMjkwMzNhYmNlZDcxNjk0
NC4uNmE1MGU1OTE5NGI2NzFhYmM0OGI5YzlhYjk5ZDZjNDBkNjFhMTE4YyAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9XYXZlU2hhcGVyTm9kZS5jcHAKKysrIGIv
U291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9XYXZlU2hhcGVyTm9kZS5jcHAKQEAgLTEx
NCw3ICsxMTQsNyBAQCB2b2lkIFdhdmVTaGFwZXJOb2RlOjpzZXRPdmVyc2FtcGxlKE92ZXJTYW1w
bGVUeXBlIHR5cGUpCiAgICAgSU5GT19MT0coTE9HSURFTlRJRklFUiwgdHlwZSk7CiAKICAgICAv
LyBTeW5jaHJvbml6ZSB3aXRoIGFueSBncmFwaCBjaGFuZ2VzIG9yIGNoYW5nZXMgdG8gY2hhbm5l
bCBjb25maWd1cmF0aW9uLgotICAgIEF1ZGlvQ29udGV4dDo6QXV0b0xvY2tlciBjb250ZXh0TG9j
a2VyKGNvbnRleHQoKSk7CisgICAgTG9ja2VyIGNvbnRleHRMb2NrZXIgeyBjb250ZXh0KCkuZ3Jh
cGhMb2NrKCkgfTsKICAgICB3YXZlU2hhcGVyUHJvY2Vzc29yKCktPnNldE92ZXJzYW1wbGUocHJv
Y2Vzc29yVHlwZSh0eXBlKSk7CiB9CiAK
</data>

          </attachment>
      

    </bug>

</bugzilla>