<?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>50557</bug_id>
          
          <creation_ts>2010-12-06 03:46:11 -0800</creation_ts>
          <short_desc>nrwt multiprocessing - revamp message_broker to actually do messaging</short_desc>
          <delta_ts>2010-12-14 20:46:56 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>50375</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dirk Pranke">dpranke</reporter>
          <assigned_to name="Dirk Pranke">dpranke</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>hayato</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>317525</commentid>
    <comment_count>0</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-06 03:46:11 -0800</bug_when>
    <thetext>nrwt multiprocessing - revamp message_broker to actually do messaging</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317527</commentid>
    <comment_count>1</comment_count>
      <attachid>75665</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-06 03:49:58 -0800</bug_when>
    <thetext>Created attachment 75665
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317542</commentid>
    <comment_count>2</comment_count>
      <attachid>75670</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-06 04:14:24 -0800</bug_when>
    <thetext>Created attachment 75670
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317547</commentid>
    <comment_count>3</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-06 04:23:52 -0800</bug_when>
    <thetext>Okay, I&apos;ve split up the patch for bug 50375 into two different patches. This one is the first.

In it, we revamp the message_broker module to actually do messaging, and rename it as message_broker2 so it can coexist with the existing module. 

Apart from unit tests, no code uses the new file yet. 

To review it, you can diff message_broker2 against message_broker, or just review it on its own merits.

This patch is a change from the earlier implementations in that it uses aggregation (has-a) instead of multiple inheritance (is-a) to model objects that have their own concurrency and hold a Worker object. This makes the code much more modular and testable.

There is much more extensive documentation, commenting, and unit testing.

In addition, it introduces the concept of &quot;connection&quot; object to mediates or proxies the methods between the caller of the message broker and the broker itself. There are two different proxies, a ManagerConnection, and a WorkerConnectionInterface. The latter is an abstract class that is implemented by concrete classes that subclass threading.Thread (or just object, for the inline case). 

These objects hide the details of the message topic naming from the callers of the broker (TestRunner and dump_render_tree_thread.Worker), and provide a simpler interface that more closely resembles the actual caller&apos;s intent.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317571</commentid>
    <comment_count>4</comment_count>
      <attachid>75680</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-06 05:31:42 -0800</bug_when>
    <thetext>Created attachment 75680
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317917</commentid>
    <comment_count>5</comment_count>
      <attachid>75680</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-12-06 16:27:26 -0800</bug_when>
    <thetext>Comment on attachment 75680
Patch

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

Mostly some high level first pass comments.  I&apos;m having a hard time seeing the big picture, but I think it&apos;s:
  manager &lt;- manager connection &lt;- broker -&gt; worker connection -&gt; worker
I&apos;m not sure I&apos;m convinced that all these layers are needed.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:109
&gt; +class ClientInterface(object):

Is this the same as BrokerClientInterface?  I don&apos;t see anything that inherits from this class.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:184
&gt; +    try:
&gt; +        broker_class = broker_types[worker_model]
&gt; +        return broker_class(port, options, worker_class, worker_topic,
&gt; +                            worker_reply_topic)
&gt; +    except KeyError:

Nit: Can we move the return outside the try block?

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:219
&gt; +    def __init__(self, queue):
&gt; +        self.queue = queue

Does queue need to be a parameter?  It looks like you always pass in Queue.Queue().

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:354
&gt; +    def cancel_worker(self, worker_name):

It&apos;s a bit odd that start_worker takes a worker_number, but all the other worker methods take a worker_name.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:372
&gt; +    def add_timer(self, topic_name, callback, delay_secs):
&gt; +        &quot;&quot;&quot;Add a timer that will fire later during drain() or loop().

Is this for finding hung threads?  I don&apos;t think finding hung threads needs to be so general purpose.  Why not just name the methods add_hung_thread_timer or something?

Also, there&apos;s a lot of code for timers.  It might be easier to add them in a separate patch.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:391
&gt; +    def run_message_loop(self, topic_name, reader):
&gt; +        &quot;&quot;&quot;Loop processing messages and timers until done.
&gt; +

I think it would be more clear if the broker was less general purpose.  We only have 2 topics and being able to handle an arbitrary number of topics makes the code harder to follow.  For example, maybe it would be reasonable to have run_manager_loop and run_worker_loop?  Actually, I can&apos;t tell right now if the broker class is responsible for running the manager loop.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:392
&gt; +        &quot;done&quot; means that reader.is_done() returns True or a timer indicates

It would also make &quot;reader&quot; explicit.  Of course, run_manager_loop and run_worker_loop may both call into a common protected method that does this abstraction, but the code would be more readable.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:413
&gt; +    def drain(self, topic_name, reader):

Nit: Can we call this run_all_pending?  That&apos;s matches MessageLoop in base.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:475
&gt; +        fn = getattr(reader, &apos;handle_&apos; + message.name)

fn-&gt; function or callback or message_handler or something

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:480
&gt; +    class _InlineWorkerConnection(object):

I would move this out of the class since it&apos;s so big.  It makes it hard to see which methods are part of _InlineBroker and which methods are part of _InlineWorkerConnection.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:579
&gt; +    class _ThreadedWorkerConnection(threading.Thread):

I would move this out too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317954</commentid>
    <comment_count>6</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-06 17:08:34 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 75680 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=75680&amp;action=review
&gt; 
&gt; Mostly some high level first pass comments.  I&apos;m having a hard time seeing the big picture, but I think it&apos;s:
&gt;   manager &lt;- manager connection &lt;- broker -&gt; worker connection -&gt; worker
&gt; I&apos;m not sure I&apos;m convinced that all these layers are needed.
&gt; 

The non-MI version only had the three ... manager &lt;-&gt; broker &lt;-&gt; worker. As I mention in comment #3, using aggregation requires the worker connection, at which point I think having a symmetric manager connection keeps the code cleaner and more understandable.


&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:109
&gt; &gt; +class ClientInterface(object):
&gt; 
&gt; Is this the same as BrokerClientInterface?  I don&apos;t see anything that inherits from this class.
&gt;

Whoops, yes. That was an earlier name and I guessed I missed some search&amp;replaces. will fix.

TestWorker in message_broker2_unittest.py should be inheriting from / implementing it, but it isn&apos;t. That&apos;s a typo that I will fix. More practically, the Worker class in dump_render_tree_thread.py in bug 50375 implements it.

 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:184
&gt; &gt; +    try:
&gt; &gt; +        broker_class = broker_types[worker_model]
&gt; &gt; +        return broker_class(port, options, worker_class, worker_topic,
&gt; &gt; +                            worker_reply_topic)
&gt; &gt; +    except KeyError:
&gt; 
&gt; Nit: Can we move the return outside the try block?
&gt; 

Sure, but why? 

&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:219
&gt; &gt; +    def __init__(self, queue):
&gt; &gt; +        self.queue = queue
&gt; 
&gt; Does queue need to be a parameter?  It looks like you always pass in Queue.Queue().
&gt;

For now we always use Queue.Queue(), but in bug 50381, when we add in multiprocessing, we&apos;ll either use Queue.Queue()s or multiprocessing.Queue()s.
 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:354
&gt; &gt; +    def cancel_worker(self, worker_name):
&gt; 
&gt; It&apos;s a bit odd that start_worker takes a worker_number, but all the other worker methods take a worker_name.
&gt; 

The caller doesn&apos;t specify the name, so it can&apos;t be passed to start_worker(). Arguably the other methods could be changed to take worker_number as well, but I have concerns at some future date about worker_numbers getting re-used if workers are being restarted, and names being more durable/unique.  I&apos;m not sure there&apos;s an obvious win here one way or another.

&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:372
&gt; &gt; +    def add_timer(self, topic_name, callback, delay_secs):
&gt; &gt; +        &quot;&quot;&quot;Add a timer that will fire later during drain() or loop().
&gt; 
&gt; Is this for finding hung threads?  I don&apos;t think finding hung threads needs to be so general purpose.  Why not just name the methods add_hung_thread_timer or something?

I&apos;m not sure that renaming things to special-purpose methods and combining the layers actually makes things clearer. You can go back to to earlier versions of these patches and compare which is easier to read, but I think the new versions have clean, familiar mechanisms that go a long way to making this code much more understandable than it was previously.

&gt; 
&gt; Also, there&apos;s a lot of code for timers.  It might be easier to add them in a separate patch.
&gt; 

Perhaps. At this point I&apos;d prefer not to split things up further unless there&apos;s some reason to do so either for correctness or to make landing things easier (and we can&apos;t land this partially using mb2 without using timers).

&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:391
&gt; &gt; +    def run_message_loop(self, topic_name, reader):
&gt; &gt; +        &quot;&quot;&quot;Loop processing messages and timers until done.
&gt; &gt; +
&gt; 
&gt; I think it would be more clear if the broker was less general purpose.  We only have 2 topics and being able to handle an arbitrary number of topics makes the code harder to follow.  For example, maybe it would be reasonable to have run_manager_loop and run_worker_loop?  Actually, I can&apos;t tell right now if the broker class is responsible for running the manager loop.
&gt;

Respectfully, I disagree. I actually had separate loops earlier (you can look at older patches) and things were more intertwined, and it made the logic much hard to follow, let alone test comprehensively.

It doesn&apos;t help if you focus on the &quot;inline&quot; case as the normal usage. It isn&apos;t, you have to jump through hoops to get things to work. If you look at the threaded case everything becomes much more symmetric (and the multiprocess case is exactly the same as the threaded case).

More broadly, there is something of a tension between putting logic in different places and trying to keep the abstractions clean and understandable.

For example, one design tension is whether to make _WorkerMessageBroker and its descendants smart objects that manage control flow, or a relatively passive objects that just hold thread/process-safe data that other objects manipulate. I have chosen the former tactic here, because the latter tactic led to putting a lot of logic into dump_render_tree_thread.py, making that code *very* hard to understand and maintain. The new Worker code you see in bug 50375 is IMO far more understandable. So, if you accept that, then either you need to remove some of the control over the flow from TestRunner as well, to make things more symmetrical, or you live with asymmetry.

Part of the design thinking I had was that, if I was implementing this from scratch as a system based on communicating asynchronous message loops that used common libraries and classes (rather than ones I wrote myself), how would I do it? I think I&apos;d end up with something like this. Given that the net result is actually *less* code and *less convoluted* code than the earlier versions, I think this is probably a win.

I explain all of this in the hopes that it will help you understand the motivations for this design better. Maybe I&apos;m just off my rocker ...
 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:392
&gt; &gt; +        &quot;done&quot; means that reader.is_done() returns True or a timer indicates
&gt; 
&gt; It would also make &quot;reader&quot; explicit.  Of course, run_manager_loop and run_worker_loop may both call into a common protected method that does this abstraction, but the code would be more readable.
&gt;

Admittedly, &quot;reader&quot; isn&apos;t a great name here. &quot;caller&quot; or &quot;client&quot; might be better.
 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:413
&gt; &gt; +    def drain(self, topic_name, reader):
&gt; 
&gt; Nit: Can we call this run_all_pending?  That&apos;s matches MessageLoop in base.
&gt; 

Sure.

&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:475
&gt; &gt; +        fn = getattr(reader, &apos;handle_&apos; + message.name)
&gt; 
&gt; fn-&gt; function or callback or message_handler or something
&gt;

Okay.
 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:480
&gt; &gt; +    class _InlineWorkerConnection(object):
&gt; 
&gt; I would move this out of the class since it&apos;s so big.  It makes it hard to see which methods are part of _InlineBroker and which methods are part of _InlineWorkerConnection.
&gt;

Okay.
 
&gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:579
&gt; &gt; +    class _ThreadedWorkerConnection(threading.Thread):
&gt; 
&gt; I would move this out too.

Okay.

I&apos;ll post a revision with the patches and corrections that I&apos;ve agreed to so far, and we can continue to discuss. Thanks for your time!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317973</commentid>
    <comment_count>7</comment_count>
      <attachid>75763</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-06 17:40:42 -0800</bug_when>
    <thetext>Created attachment 75763
update w/ review feedback</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317975</commentid>
    <comment_count>8</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-06 17:45:51 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; &gt; 
&gt; &gt; Is this the same as BrokerClientInterface?  I don&apos;t see anything that inherits from this class.
&gt; &gt;
&gt; 
&gt; Whoops, yes. That was an earlier name and I guessed I missed some search&amp;replaces. will fix.
&gt;

Looks like I missed indicating the interface inheritance in a bunch of places; I&apos;m still not sure how common an idiom that is in Python vs. just relying on duck typing. That said, I definitely intended to document it everywhere, so I&apos;m adding it now.

&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:184
&gt; &gt; &gt; +    try:
&gt; &gt; &gt; +        broker_class = broker_types[worker_model]
&gt; &gt; &gt; +        return broker_class(port, options, worker_class, worker_topic,
&gt; &gt; &gt; +                            worker_reply_topic)
&gt; &gt; &gt; +    except KeyError:
&gt; &gt; 
&gt; &gt; Nit: Can we move the return outside the try block?
&gt; &gt; 
&gt; 
&gt; Sure, but why? 
&gt;

Never mind, I thought you wanted me to call broker_class() inside the try block but save the return value and then have an explicit return afterwards. I see now that you just wanted the try/except KeyError to just wrap the dict access.
 
&gt; The caller doesn&apos;t specify the name, so it can&apos;t be passed to start_worker(). Arguably the other methods could be changed to take worker_number as well, but I have concerns at some future date about worker_numbers getting re-used if workers are being restarted, and names being more durable/unique.  I&apos;m not sure there&apos;s an obvious win here one way or another.
&gt;

Oh, I should have noted that I use worker_name where possible because that is the thing that identifies the sender of the messages and is used in debug output. One could consider abandoning worker_name altogether and just using worker_number pervasively everywhere, but I don&apos;t think that works as well given the idea of a &quot;generic&quot; message broker, since it&apos;s unclear how you refer to the manager? worker zero? Special case code?
 
Leaving this alone for now. We can discuss further.

&gt; &gt; It would also make &quot;reader&quot; explicit.  Of course, run_manager_loop and run_worker_loop may both call into a common protected method that does this abstraction, but the code would be more readable.
&gt; &gt;
&gt; 
&gt; Admittedly, &quot;reader&quot; isn&apos;t a great name here. &quot;caller&quot; or &quot;client&quot; might be better.
&gt;

Leaving &quot;reader&quot; alone for now until we agree on a better name if it is needed.
 
&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:475
&gt; &gt; &gt; +        fn = getattr(reader, &apos;handle_&apos; + message.name)
&gt; &gt; 
&gt; &gt; fn-&gt; function or callback or message_handler or something

Renamed to &quot;message_handler&quot;

&gt; &gt; &gt; WebKitTools/Scripts/webkitpy/layout_tests/layout_package/message_broker2.py:480
&gt; &gt; &gt; +    class _InlineWorkerConnection(object):
&gt; &gt; 
&gt; &gt; I would move this out of the class since it&apos;s so big.  It makes it hard to see which methods are part of _InlineBroker and which methods are part of _InlineWorkerConnection.
&gt; &gt;
&gt; 
&gt; Okay.
&gt;

I&apos;ve moved all of the nested classes out to the top level, seems like an all-or-nothing sort of thing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317988</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-06 18:11:15 -0800</bug_when>
    <thetext>Attachment 75763 did not pass style-queue:

Failed to run &quot;[u&apos;git&apos;, u&apos;reset&apos;, u&apos;--hard&apos;, u&apos;HEAD&apos;]&quot; exit_code: 128
error: Could not write new index file.
fatal: Could not reset index file to revision &apos;HEAD&apos;.


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317996</commentid>
    <comment_count>10</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-06 18:18:19 -0800</bug_when>
    <thetext>style bot keeled over but that may be because the diff is based against code that got reverted. I think this can be ignored for purposes of review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318422</commentid>
    <comment_count>11</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-07 13:59:25 -0800</bug_when>
    <thetext>I should note that a lot of your thinking and questions mirror my own as I was initially writing this code (separate message loops, fewer abstractions, custom timer code instead of generic timer code). The code has become much more generic over time, and I think this makes it easier to understand and easier to test and maintain.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318463</commentid>
    <comment_count>12</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-07 15:47:28 -0800</bug_when>
    <thetext>Adam, wdyt about this code vs. the stuff in common/thread that I just remembered?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318469</commentid>
    <comment_count>13</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-12-07 15:55:31 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; Adam, wdyt about this code vs. the stuff in common/thread that I just remembered?

I suspect the stuff we currently have in common/thread isn&apos;t worth worrying about.  It&apos;s just the bare minimum we needed to get sheriffbot working.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318580</commentid>
    <comment_count>14</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-07 20:53:14 -0800</bug_when>
    <thetext>Tony, 

One other thought, for something that might kill all of these birds with one stone ... there&apos;s a FIXME: at the top of the file to split the worker logic out from the message_broker code. If we combine that with some of the other concerns you had about being able to understand the flow of control, then we could end up with something like the following ...

WorkerConnection manages the message loop and supports timers (so, implements add_timer(), run_message_loop(), and the supporting functions).

ManagerConnection (or something like it) would subclass WorkerConnection and adds start_worker(). There would be two versions of this, a normal one and one specialized to deal with the inline worker case. Actually, there&apos;d be three versions, since there are two variants of the &quot;normal&quot; one to deal with threads or processes.

WorkerMessageBroker would manage no control flow whatsoever. it would be essentially just a data object.

Thoughts?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>322483</commentid>
    <comment_count>15</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-12-14 20:46:56 -0800</bug_when>
    <thetext>Marking as wontfix - I&apos;ll split these patches up another way.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75665</attachid>
            <date>2010-12-06 03:49:58 -0800</date>
            <delta_ts>2010-12-06 04:14:21 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50557-20101206034957.patch</filename>
            <type>text/plain</type>
            <size>39966</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAyZGU1OWU3YWQwMTkwZWQ3YjM0YzhkZjVkNjRlMzBlYmY3MWYxNjQ5Li5kNjJkY2Mx
OTEzYmI1YjEwNTk2YmUwMDU1NGFiMGQ1ZGVmMDk1ZjhkIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMTAtMTItMDYgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgbnJ3dCBtdWx0aXByb2Nl
c3NpbmcgLSByZXZhbXAgbWVzc2FnZV9icm9rZXIgdG8gYWN0dWFsbHkgZG8gbWVzc2FnaW5nCisK
KyAgICAgICAgVGhpcyBjaGFuZ2UgYWRkcyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlX2Jy
b2tlciBwYWNrYWdlCisgICAgICAgIHRoYXQgYWN0dWFsbHkgZG9lcyBtZXNzYWdpbmcuIFRvIHNp
bXBsaWZ5IHJldmlld2luZyB0aGUgbmV4dAorICAgICAgICBjb3VwbGUgcGF0Y2hlcywgdGhpcyBp
cyBiZWluZyBhZGRlZCBhcyBhIHNlcGFyYXRlIGZpbGUgZm9yIG5vdy4KKyAgICAgICAgVWx0aW1h
dGVseSBtZXNzYWdlX2Jyb2tlci5weSB3aWxsIGJlIHJlbW92ZWQgYW5kIHRoaXMgZmlsZSB3aWxs
CisgICAgICAgIGJlIHJlbmFtZWQuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTUwNTU3CisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tZXNzYWdlX2Jyb2tlcjIucHk6IEFkZGVkLgorICAgICAg
ICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21lc3NhZ2Vf
YnJva2VyMl91bml0dGVzdC5weTogQWRkZWQuCisKIDIwMTAtMTItMDIgIERpcmsgUHJhbmtlICA8
ZHByYW5rZUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgVG9ueSBDaGFuZy4K
ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xh
eW91dF9wYWNrYWdlL21lc3NhZ2VfYnJva2VyMi5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21lc3NhZ2VfYnJva2VyMi5weQpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi45NmMzMWYxMWYxMDM2MDhkNDgxYzBmMDJiYzFlMzhiY2JlYmZlYzRjCi0tLSAvZGV2
L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5
b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9rZXIyLnB5CkBAIC0wLDAgKzEsNjQ4IEBACisjIENvcHly
aWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAg
KiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisj
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBU
TywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKworIiIiTW9kdWxlIGZvciBoYW5kbGluZyBtZXNzYWdlcyBhbmQgY29uY3VycmVu
Y3kgZm9yIHJ1bi13ZWJraXQtdGVzdHMuCisKK1Rlc3RpbmcgaXMgYWNjb21wbGlzaGVkIGJ5IGhh
dmluZyBhIG1hbmFnZXIgKFRlc3RSdW5uZXIpIGdhdGhlciBhbGwgb2YgdGhlCit0ZXN0cyB0byBi
ZSBydW4sIGFuZCBzZW5kaW5nIG1lc3NhZ2VzIHRvIGEgcG9vbCBvZiB3b3JrZXJzIChUZXN0U2hl
bGxUaHJlYWRzKQordG8gcnVuIGVhY2ggdGVzdC4gRWFjaCB3b3JrZXIgY29tbXVuaWNhdGVzIHdp
dGggb25lIGRyaXZlciAodXN1YWxseQorRHVtcFJlbmRlclRyZWUpIHRvIHJ1biBvbmUgdGVzdCBh
dCBhIHRpbWUgYW5kIHRoZW4gY29tcGFyZSB0aGUgb3V0cHV0IGFnYWluc3QKK3doYXQgd2UgZXhw
ZWN0ZWQgdG8gZ2V0LgorCitUaGlzIG1vZHVsZXMgaW1wbGVtZW50cyBhIG1lc3NhZ2UgYnJva2Vy
IHRoYXQgY29ubmVjdHMgdGhlIG1hbmFnZXIgdG8gdGhlCit3b3JrZXJzOiBpdCBwcm92aWRlcyBh
IG1lc3NhZ2luZyBhYnN0cmFjdGlvbiBhbmQgbWVzc2FnZSBsb29wcywgYW5kCitoYW5kbGVzIGxh
dW5jaGluZyB0aHJlYWRzIGFuZC9vciBwcm9jZXNzZXMgZGVwZW5kaW5nIG9uIHRoZSByZXF1ZXN0
ZWQKK2NvbmZpZ3VyYXRpb24uCisKK0JvdGggTWFuYWdlcnMgYW5kIFdvcmtlcnMgYXJlIHJlcXVp
cmVkIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kcyBpbiB0aGUKK0Jyb2tlckNsaWVudCBpbnRlcmZh
Y2UgLyBhYnN0cmFjdCBiYXNlIGNsYXNzIGluIG9yZGVyIHRvIHRoZSBtZXNzYWdlCiticm9rZXIg
dG8gcHJvcGVybHkgY29tbXVuaWNhdGUgd2l0aCB0aGVtLgorCitFdmVyeXRoaW5nIHN0YXJ0cyBi
eSBjYWxsaW5nIGdldCgpIHRvIG9idGFpbiBhbiBpbml0aWFsIHJlZmVyZW5jZSB0byBhIGJyb2tl
ci4KK1RoZSBicm9rZXIgaXMgbWVkaWF0ZWQgYnkgYSBDb25uZWN0aW9uIG9iamVjdCB0aGF0IHBy
b3ZpZGVzIHNvbWUgc3ludGFjdGljCitzdWdhciB0byByZXByZXNlbnQgdGhlIE1hbmFnZXIgYW5k
IFdvcmtlciBlbmRwb2ludHMuIFR5cGljYWxseSB0aGUKK21hbmFnZXIgdGhlbiBjYWxscyBzdGFy
dF93b3JrZXIoKSByZXBlYXRlZGx5IHRvIGxhdW5jaCB3b3JrZXJzICh3aGljaCBhcmUKK3VzdWFs
bHkgcnVuIGluIHNlcGFyYXRlIHRocmVhZHMgb3IgcHJvY2Vzc2VzIGFzIGNvbnRyb2xsZWQgYnkg
dGhlCistLXdvcmtlci1tb2RlbCBydW50aW1lIGZsYWcpLCBvcHRpb25hbGx5IHNldHMgdXAgc29t
ZSB0aW1lcnMsIGFuZCB0aGVuCitpbnZva2VzIHJ1bl9tZXNzYWdlX2xvb3AoKS4KKyIiIgorCisj
IEZJWE1FOiBUaGlzIHBhY2thZ2Ugc2hvdWxkIHByb2JhYmx5IGF0IGxlYXN0IGJlIHNwbGl0IGlu
dG8gdHdvIHNlcGFyYXRlCisjIGNsYXNzZXMgdG8gc2VwYXJhdGUgb3V0IHRoZSAid29ya2VyIHBv
b2wiIGNvbmNlcHQgYW5kIHRoZSBhY3R1YWwKKyMgbWVzc2FnZSBicm9rZXIgbG9naWMsIHdoaWNo
IGRvZXNuJ3QgcmVhbGx5IGNhcmUgaG93IHRoZSB3b3JrZXJzIGFyZQorIyBpbXBsZW1lbnRlZC4K
KworaW1wb3J0IGNQaWNrbGUKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9y
dCBvcworaW1wb3J0IFF1ZXVlCitpbXBvcnQgc3lzCitpbXBvcnQgdGhyZWFkCitpbXBvcnQgdGhy
ZWFkaW5nCitpbXBvcnQgdGltZQoraW1wb3J0IHRyYWNlYmFjaworCitfbG9nID0gbG9nZ2luZy5n
ZXRMb2dnZXIoX19uYW1lX18pCisKKyMKKyMgVG9waWMgbmFtZXMgZm9yIHRoZSBtZXNzYWdlIHF1
ZXVlcy4KKyMKK01BTkFHRVJfVE9QSUMgPSAnbWFuYWdlcicKK0FOWV9XT1JLRVJfVE9QSUMgPSAn
d29ya2VyJworCisKK2RlZiBydW50aW1lX29wdGlvbnMoKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0
IG9mIG9wdHBhcnNlLk9wdGlvbiBvYmplY3RzIGZvciBhbnkgcnVudGltZSB2YWx1ZXMgdXNlZAor
ICAgIGJ5IHRoaXMgbWV0aG9kLiIiIgorICAgIG9wdGlvbnMgPSBbCisgICAgICAgIG9wdHBhcnNl
Lm1ha2Vfb3B0aW9uKCItLXdvcmtlci1tb2RlbCIsIGFjdGlvbj0ic3RvcmUiLAorICAgICAgICAg
ICAgaGVscD0oImNvbnRyb2xzIHdvcmtlciBtb2RlbC4gVmFsaWQgdmFsdWVzIGFyZSAiCisgICAg
ICAgICAgICAiJ2lubGluZScgYW5kICd0aHJlYWRzJy4iKSksCisgICAgXQorICAgIHJldHVybiBv
cHRpb25zCisKKworZGVmIGdldChwb3J0LCBvcHRpb25zLCBtYW5hZ2VyLCB3b3JrZXJfY2xhc3Mp
OgorICAgICIiIlJldHVybiBhIGNvbm5lY3Rpb24gdG8gYSBtYW5hZ2VyL3dvcmtlciBtZXNzYWdl
IGJyb2tlcgorCisgICAgQXJnczoKKyAgICAgICAgcG9ydCAtIGhhbmRsZSB0byBsYXlvdXRfdGVz
dHMvcG9ydCBvYmplY3QgZm9yIHBvcnQtc3BlY2lmaWMgc3R1ZmYKKyAgICAgICAgb3B0aW9ucyAt
IG9wdHBhcnNlIGFyZ3VtZW50IGZvciBjb21tYW5kLWxpbmUgb3B0aW9ucworICAgICAgICBtYW5h
Z2VyIC0gb2JqZWN0IHRvIGRpc3BhdGNoIHJlcGxpZXMgdG8KKyAgICAgICAgd29ya2VyX2NsYXNz
IC0gdHlwZSBvZiB3b3JrZXJzIHRvIGNyZWF0ZS4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAor
ICAgICAgICAgICAgdGhlIG1ldGhvZHMgaW4gdGhlIEJyb2tlckNsaWVudEludGVyZmFjZS4KKyAg
ICBSZXR1cm5zOgorICAgICAgICBBIGhhbmRsZSB0byBhbiBvYmplY3QgdGhhdCB3aWxsIHRhbGsg
dG8gYSBtZXNzYWdlIGJyb2tlciBjb25maWd1cmVkCisgICAgICAgIGZvciB0aGUgbm9ybWFsIG1h
bmFnZXIvd29ya2VyIGNvbW11bmljYXRpb24uCisgICAgIiIiCisgICAgYnJva2VyID0gX2dldF9i
cm9rZXIocG9ydCwgb3B0aW9ucywgbWFuYWdlciwgd29ya2VyX2NsYXNzLAorICAgICAgICAgICAg
ICAgICAgICAgICAgIEFOWV9XT1JLRVJfVE9QSUMsIE1BTkFHRVJfVE9QSUMpCisgICAgcmV0dXJu
IF9NYW5hZ2VyQ29ubmVjdGlvbihicm9rZXIsIG1hbmFnZXIpCisKKworY2xhc3MgQ2xpZW50SW50
ZXJmYWNlKG9iamVjdCk6CisgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyAvIGludGVyZmFjZSB0
aGF0IGFsbCBtZXNzYWdlIGJyb2tlciBjbGllbnRzIG11c3QKKyAgICBpbXBsZW1lbnQuIEluIGFk
ZGl0aW9uIHRvIHRoZSBtZXRob2RzIGJlbG93LCBieSBjb252ZW50aW9uIGNsaWVudHMKKyAgICBp
bXBsZW1lbnQgcm91dGluZXMgb2YgdGhlIHNpZ25hdHVyZSB0eXBlCisKKyAgICAgICAgaGFuZGxl
X01FU1NBR0VfTkFNRShzZWxmLCBzcmMsIC4uLik6CisKKyAgICB3aGVyZSBNRVNTQUdFX05BTUUg
bWF0Y2hlcyB0aGUgc3RyaW5nIHBhc3NlZCB0byBwb3N0X21lc3NhZ2UoKSwgYW5kCisgICAgc3Jj
IGluZGljYXRlcyB0aGUgbmFtZSBvZiB0aGUgc2VuZGVyLiBJZiB0aGUgbWVzc2FnZSBjb250YWlu
cyB2YWx1ZXMgaW4KKyAgICB0aGUgbWVzc2FnZSBib2R5LCB0aG9zZSB3aWxsIGJlIHByb3ZpZGVk
IGFzIG9wdHBhcmFtcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBicm9rZXJfY29ubmVj
dGlvbiwgd29ya2VyX251bWJlcik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IK
KworICAgIGRlZiBjYW5jZWwoc2VsZik6CisgICAgICAgICIiIkNhbGxlZCAoaWYgcG9zc2libGUp
IHRvIG5vdGlmeSB0aGUgd29ya2VyIHRoYXQgaXQgaGFzIGJlZW4gYWJvcnRlZC4KKworICAgICAg
ICBPbmx5IHdvcmtlcnMgbmVlZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuIFdvcmtlcnMgY2Fubm90
IHJlbHkgb24gdGhpcworICAgICAgICBtZXRob2QgYWx3YXlzIGJlaW5nIGNhbGxlZC4gRm9yIGV4
YW1wbGUsIHdvcmtlcnMgcnVubmluZyBpbiB0aGVpcgorICAgICAgICBvd24gcHJvY2Vzc2VzIG1h
eSBiZSBraWxsZWQgZGlyZWN0bHkgaW5zdGVhZCBvZiBpbnZva2luZyB0aGlzIG1ldGhvZAorICAg
ICAgICBhbmQgd2FpdGluZyBmb3IgdGhlIHRoZSB3b3JrZXIgdG8gZXhpdC4iIiIKKyAgICAgICAg
cmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGlzX2RvbmUoc2VsZik6CisgICAg
ICAgICIiIkNhbGxlZCBmcm9tIGluc2lkZSBydW5fbWVzc2FnZV9sb29wKCkgdG8gaW5kaWNhdGUg
d2hldGhlciB0byBleGl0LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisK
KyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbmFtZSB0aGF0IGlkZW50
aWZpZXMgdGhlIHdvcmtlciBvciBtYW5hZ2VyLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1l
bnRlZEVycm9yCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAiIiJPbmx5IHdvcmtlcnMg
bmVlZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVu
dGVkRXJyb3IKKworCitjbGFzcyBfTWFuYWdlckNvbm5lY3Rpb24ob2JqZWN0KToKKyAgICAiIiJU
aGlzIGNsYXNzIGhhbmRsZXMgYSBjb25uZWN0aW9uIHRvIGEgbWVzc2FnZSBicm9rZXIgdGhhdCBp
cyBzZXQgdXAKKyAgICB0byBzZW5kIG1lc3NhZ2VzIHRvIGEgV29ya2VyIHF1ZXVlIGFzIGEgTWFu
YWdlci4gSXQgaXMgcHJvdmlkZWQgYXMgYQorICAgIGNvbnZlbmllbmNlIGFuZCB0byBlbmNhcHN1
bGF0ZSB0aGUgZ2VuZXJpYyBtZXNzYWdlIGJyb2tlci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhz
ZWxmLCBicm9rZXIsIG1hbmFnZXIpOgorICAgICAgICBzZWxmLl9icm9rZXIgPSBicm9rZXIKKyAg
ICAgICAgc2VsZi5fbWFuYWdlciA9IG1hbmFnZXIKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxm
LCBuYW1lKToKKyAgICAgICAgIyBUaGlzIG1ldGhvZCBjYXVzZXMgYW55IG1ldGhvZCB3ZSBkb24n
dCBkaXJlY3RseSBpbXBsZW1lbnQKKyAgICAgICAgIyB0byB0aGUgYnJva2VyLgorICAgICAgICBy
ZXR1cm4gZ2V0YXR0cihzZWxmLl9icm9rZXIsIG5hbWUpCisKKyAgICBkZWYgcG9zdF9tZXNzYWdl
KHNlbGYsIG1lc3NhZ2VfbmFtZSwgKm1lc3NhZ2VfYXJncyk6CisgICAgICAgIHNlbGYuX2Jyb2tl
ci5wb3N0X21lc3NhZ2Uoc2VsZi5fbWFuYWdlci5uYW1lKCksIEFOWV9XT1JLRVJfVE9QSUMsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9uYW1lLCBtZXNzYWdlX2Fy
Z3MpCisKKyAgICBkZWYgYWRkX3RpbWVyKHNlbGYsIGNhbGxiYWNrLCBkZWxheV9zZWNzKToKKyAg
ICAgICAgc2VsZi5fYnJva2VyLmFkZF90aW1lcihNQU5BR0VSX1RPUElDLCBjYWxsYmFjaywgZGVs
YXlfc2VjcykKKworICAgIGRlZiBydW5fbWVzc2FnZV9sb29wKHNlbGYpOgorICAgICAgICBzZWxm
Ll9icm9rZXIucnVuX21lc3NhZ2VfbG9vcChNQU5BR0VSX1RPUElDLCBzZWxmLl9tYW5hZ2VyKQor
CisgICAgZGVmIHN0YXJ0X3dvcmtlcihzZWxmLCB3b3JrZXJfbnVtYmVyKToKKyAgICAgICAgcmV0
dXJuIHNlbGYuX2Jyb2tlci5zdGFydF93b3JrZXIod29ya2VyX251bWJlcikKKworCitkZWYgX2dl
dF9icm9rZXIocG9ydCwgb3B0aW9ucywgbWFuYWdlciwgd29ya2VyX2NsYXNzLCB3b3JrZXJfdG9w
aWMsCisgICAgICAgICAgICAgICAgd29ya2VyX3JlcGx5X3RvcGljKToKKyAgICB3b3JrZXJfbW9k
ZWwgPSBvcHRpb25zLndvcmtlcl9tb2RlbAorICAgIGJyb2tlcl90eXBlcyA9IHsKKyAgICAgICAg
J2lubGluZSc6IF9JbmxpbmVCcm9rZXIsCisgICAgICAgICd0aHJlYWRzJzogX011bHRpVGhyZWFk
ZWRCcm9rZXIsCisgICAgfQorICAgIHRyeToKKyAgICAgICAgYnJva2VyX2NsYXNzID0gYnJva2Vy
X3R5cGVzW3dvcmtlcl9tb2RlbF0KKyAgICAgICAgcmV0dXJuIGJyb2tlcl9jbGFzcyhwb3J0LCBv
cHRpb25zLCB3b3JrZXJfY2xhc3MsIHdvcmtlcl90b3BpYywKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB3b3JrZXJfcmVwbHlfdG9waWMpCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAg
ICByYWlzZSBWYWx1ZUVycm9yKCd1bnN1cHBvcnRlZCB2YWx1ZSBmb3IgLS13b3JrZXItbW9kZWw6
ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyX21vZGVsKQorCisKK2NsYXNz
IF9NZXNzYWdlKG9iamVjdCk6CisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBsb2FkcyhzdHIp
OgorICAgICAgICBvYmogPSBjUGlja2xlLmxvYWRzKHN0cikKKyAgICAgICAgYXNzZXJ0KGlzaW5z
dGFuY2Uob2JqLCBfTWVzc2FnZSkpCisgICAgICAgIHJldHVybiBvYmoKKworICAgIGRlZiBfX2lu
aXRfXyhzZWxmLCBzcmMsIHRvcGljX25hbWUsIG1lc3NhZ2VfbmFtZSwgbWVzc2FnZV9ib2R5KToK
KyAgICAgICAgc2VsZi5zcmMgPSBzcmMKKyAgICAgICAgc2VsZi50b3BpY19uYW1lID0gdG9waWNf
bmFtZQorICAgICAgICBzZWxmLm5hbWUgPSBtZXNzYWdlX25hbWUKKyAgICAgICAgc2VsZi5ib2R5
ID0gbWVzc2FnZV9ib2R5CisKKyAgICBkZWYgZHVtcHMoc2VsZik6CisgICAgICAgIHJldHVybiBj
UGlja2xlLmR1bXBzKHNlbGYpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJl
dHVybiAoIl9NZXNzYWdlKGZyb209JyVzJywgdG9waWNfbmFtZT0nJXMnLCBtZXNzYWdlX25hbWU9
JyVzJykiICUKKyAgICAgICAgICAgICAgICAoc2VsZi5zcmMsIHNlbGYudG9waWNfbmFtZSwgc2Vs
Zi5uYW1lKSkKKworCitjbGFzcyBfVGltZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2Vs
ZiwgY2FsbGJhY2ssIGRlbGF5KToKKyAgICAgICAgc2VsZi5jYWxsYmFjayA9IGNhbGxiYWNrCisg
ICAgICAgIHNlbGYuZGVsYXkgPSBkZWxheQorICAgICAgICBzZWxmLmRlYWRsaW5lID0gdGltZS50
aW1lKCkgKyBkZWxheQorCisKK2NsYXNzIF9Ub3BpYyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRf
XyhzZWxmLCBxdWV1ZSk6CisgICAgICAgIHNlbGYucXVldWUgPSBxdWV1ZQorICAgICAgICBzZWxm
LnRpbWVyID0gTm9uZQorCisKK2NsYXNzIF9Xb3JrZXJNZXNzYWdlQnJva2VyKG9iamVjdCk6Cisg
ICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBtZXNzYWdlIGJyb2tlciB0dW5lZCBmb3Ig
dGhlIGxheW91dCB0ZXN0cy4KKworICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIG1vc3RseSBn
ZW5lcmljIG1lc3NhZ2UgYnJva2VyIHdpdGggYSBmZXcgdHdlYWtzCisgICAgdHVuZWQgZm9yIG1h
bmFnZXIvd29ya2VyLXN0eWxlIG1lc3NhZ2luZy4gVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlCisg
ICAgaW5zdGFudGlhdGVkIGRpcmVjdGx5OyBpbnN0ZWFkLCBpdCBzaG91bGQgYmUgc3ViY2xhc3Nl
ZCB0byBwcm92aWRlCisgICAgaW1wbGVtZW50YXRpb25zIG9mIGEgV29ya2VyQ29ubmVjdGlvbklu
dGVyZmFjZSBvYmplY3QgZm9yCisgICAgX1dPUktFUl9DT05ORUNUSU9OX0NMQVNTLiIiIgorCisg
ICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQsIG9wdGlvbnMsIHdvcmtlcl9jbGFzcywgd29ya2Vy
X3J1bl90b3BpYywKKyAgICAgICAgICAgICAgICAgd29ya2VyX3JlcGx5X3RvcGljKToKKyAgICAg
ICAgIiIiUmV0dXJuIGEgbWVzc2FnZSBicm9rZXIgZm9yIG1hbmFnZXIvd29ya2VyIGNvbW11bmlj
YXRpb24uCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIHBvcnQ6IGhhbmRsZSB0byBwb3J0
LXNwZWNpZmljIGxvZ2ljCisgICAgICAgICAgICBvcHRpb25zOiBhIHJ1bnRpbWUgb3B0aW9uIGNs
YXNzIGZyb20gb3B0cGFyc2UKKyAgICAgICAgICAgIHdvcmtlcl9jbGFzczogVGhlIHR5cGUgb2Yg
d29ya2VyIG9iamVjdHMgdG8gaW5zdGFudGlhdGUKKyAgICAgICAgICAgIHdvcmtlcl9ydW5fdG9w
aWM6IFRoZSB0b3BpYyBuYW1lIHdvcmtlcnMgc2hvdWxkIGxpc3RlbiBmb3IKKyAgICAgICAgICAg
IHdvcmtlcl9yZXBseV90b3BpYzogVGhlIHRvcGljIG5hbWUgd29ya2VycyBzaG91bGQgcG9zdCBy
ZXBsaWVzIHRvCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9wb3J0ID0gcG9ydAorICAgICAg
ICBzZWxmLl9vcHRpb25zID0gb3B0aW9ucworICAgICAgICBzZWxmLl93b3JrZXJfY2xhc3MgPSB3
b3JrZXJfY2xhc3MKKyAgICAgICAgc2VsZi5fd29ya2VyX3J1bl90b3BpYyA9IHdvcmtlcl9ydW5f
dG9waWMKKyAgICAgICAgc2VsZi5fd29ya2VyX3JlcGx5X3RvcGljID0gd29ya2VyX3JlcGx5X3Rv
cGljCisKKyAgICAgICAgc2VsZi5fdG9waWNzID0ge30KKyAgICAgICAgc2VsZi5fY2hpbGRyZW4g
PSB7fQorICAgICAgICBzZWxmLmFkZF90b3BpYyh3b3JrZXJfcnVuX3RvcGljKQorICAgICAgICBz
ZWxmLmFkZF90b3BpYyh3b3JrZXJfcmVwbHlfdG9waWMpCisKKyAgICBkZWYgYWRkX3RvcGljKHNl
bGYsIHRvcGljX25hbWUpOgorICAgICAgICBpZiB0b3BpY19uYW1lIG5vdCBpbiBzZWxmLl90b3Bp
Y3M6CisgICAgICAgICAgICBzZWxmLl90b3BpY3NbdG9waWNfbmFtZV0gPSBfVG9waWMoUXVldWUu
UXVldWUoKSkKKworICAgIGRlZiBfZmluZF90b3BpYyhzZWxmLCB0b3BpY19uYW1lKToKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX3RvcGljc1t0b3BpY19uYW1lXQorCisgICAgIyBBbGwgV29ya2VyTWVz
c2FnZUJyb2tlciBpbXBsZW1lbnRhdGlvbnMgbXVzdCBwcm92aWRlIGNvbm5lY3Rpb24gY2xhc3MK
KyAgICAjIHRoYXQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byBtYW5hZ2Ug
bXVsdGlwbGUgd29ya2VycworICAgICMgY29ycmVjdGx5LgorICAgIGNsYXNzIF9Xb3JrZXJDb25u
ZWN0aW9uSW50ZXJmYWNlKG9iamVjdCk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBicm9r
ZXIsIHdvcmtlcl9jbGFzcywgd29ya2VyX251bWJlcik6CisgICAgICAgICAgICAiIiJSZXR1cm4g
YSB3b3JrZXIgb2JqZWN0LgorCisgICAgICAgICAgICBBcmdzIG1pcnJvciBXb3JrZXJNZXNzYWdl
QnJva2VyLCBCcm9rZXJDbGllbnRJbnRlcmZhY2UsIGFuZAorICAgICAgICAgICAgc3RhcnRfd29y
a2VyKCk6IENhbGxlZCBvbiB0aGUgbWFuYWdlciBzaWRlIG9mIHRoZSBtZXNzYWdlIGJyb2tlci4i
IiIKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgICAgICBkZWYg
Y2FuY2VsKHNlbGYpOgorICAgICAgICAgICAgIiIiQmVzdC1lZmZvcnQgYXR0ZW1wdCB0byBub3Rp
ZnkgdGhlIHdvcmtlciBpdCBoYXMgYmVlbiBjYW5jZWxsZWQuCisKKyAgICAgICAgICAgIENhbGxl
ZCBvbiB0aGUgbWFuYWdlciBzaWRlIG9mIHRoZSBicm9rZXIsIHRoaXMgc2hvdWxkIGJlIGEKKyAg
ICAgICAgICAgIHBhc3MtdGhyb3VnaCB0byB0aGUgd29ya2VyIHdoZXJlIHBvc3NpYmxlLiIiIgor
ICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAgICMgRklYTUU6
IGNoYW5nZSB0aGlzIHRvIGlzX2FsaXZlIHdoZW4gd2UncmUgb24gMi42IG9yIG5ld2VyIGV2ZXJ5
d2hlcmUuCisgICAgICAgIGRlZiBpc0FsaXZlKHNlbGYpOgorICAgICAgICAgICAgIiIiIlJldHVy
biB3aGV0aGVyIHRoZSB3b3JrZXIgaXMgc3RpbGwgcnVubmluZy4KKworICAgICAgICAgICAgVXNl
ZCBvbmx5IG9uIHRoZSBtYW5hZ2VyIHNpZGUgb2YgdGhlIGJyb2tlci4iIiIKKyAgICAgICAgICAg
IHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgICAgICBkZWYgam9pbihzZWxmLCB0aW1l
b3V0KToKKyAgICAgICAgICAgICIiIkJsb2NrIHRpbWVvdXQgc2Vjb25kcyBvciB1bnRpbCB0aGUg
d29ya2VyIGhhcyBleGl0ZWQuCisKKyAgICAgICAgICAgIENhbGxlZCBvbmx5IG9uIHRoZSBtYW5h
Z2VyIHNpZGUgb2YgdGhlIGJyb2tlci4iIiIKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVu
dGVkRXJyb3IKKworICAgICAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgICAgICIiIlJldHVy
bnMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHdvcmtlciBpbiBxdWVzdGlvbi4KKworICAgICAg
ICAgICAgQ2FsbGVkIG9uIGJvdGggdGhlIG1hbmFnZXIgYW5kIHdvcmtlciBzaWRlcyBvZiB0aGUg
YnJva2VyLCB0aGlzCisgICAgICAgICAgICBzaG91bGQgYmUgYSBwYXNzLXRocm91Z2ggdG8gdGhl
IHdvcmtlciBjbGllbnQgd2hlcmUgcG9zc2libGUuIiIiCisgICAgICAgICAgICByYWlzZSBOb3RJ
bXBsZW1lbnRlZEVycm9yCisKKyAgICAgICAgZGVmIG9wdGlvbnMoc2VsZik6CisgICAgICAgICAg
ICAiIiJSZXR1cm4gdGhlIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCB0byBnZXQoKS4KKworICAgICAg
ICAgICAgQ2FsbGVkIG9ubHkgYnkgdGhlIHdvcmtlci4iIiIKKyAgICAgICAgICAgIHJhaXNlIE5v
dEltcGxlbWVudGVkRXJyb3IKKworICAgICAgICBkZWYgcG9ydChzZWxmKToKKyAgICAgICAgICAg
ICIiIlJldHVybiB0aGUgcG9ydCBvYmplY3QgcGFzc2VkIHRvIGdldCgpLgorCisgICAgICAgICAg
ICBDYWxsZWQgb25seSBieSB0aGUgd29ya2VyLiIiIgorICAgICAgICAgICAgcmFpc2UgTm90SW1w
bGVtZW50ZWRFcnJvcgorCisgICAgICAgIGRlZiBwb3N0X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9u
YW1lLCAqbWVzc2FnZV9hcmdzKToKKyAgICAgICAgICAgICIiIlBvc3QgYSBtZXNzYWdlIHRvIHRo
ZSB3b3JrZXJfcmVwbHlfcXVldWUuCisKKyAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxl
ZCBieSB0aGUgd29ya2VyLiIiIgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJv
cgorCisgICAgICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICAgICAiIiJJbnZva2UgdGhlIHdv
cmtlcidzIG1haW4gZW50cnkgcG9pbnQuCisKKyAgICAgICAgICAgIENhbGxlZCBvbiB0aGUgd29y
a2VyIHNpZGUgb2YgdGhlIGJyb2tlciwgdGhpcyBpcyB1c3VhbGx5IGEKKyAgICAgICAgICAgIHdy
YXBwZXIgYXJvdW5kIHRoZSB3b3JrZXIgY2xpZW50J3MgcnVuKCkgbWV0aG9kLiIiIgorICAgICAg
ICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAgIGRlZiBydW5fbWVzc2Fn
ZV9sb29wKHNlbGYpOgorICAgICAgICAgICAgIiIiUnVuIHRoZSB3b3JrZXIncyBtZXNzYWdlL3Rp
bWVyIGxvb3AuCisKKyAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgd29y
a2VyLiIiIgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAg
IGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgICAgICIiIlN0YXJ0IHRoZSB3b3JrZXIgcnVubmlu
ZywgaWYgcG9zc2libGUuIERvIG5vdCBibG9jayB0aGUgY2FsbGVyLiIiIgorICAgICAgICAgICAg
cmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAgIGRlZiB5aWVsZF90b19icm9rZXIo
c2VsZik6CisgICAgICAgICAgICAiIiIiQ2F1c2VzIHRoZSB3b3JrZXIgdG8geWllbGQgY29udHJv
bCBmbG93IGJhY2sgdG8gdGhlIGJyb2tlci4KKworICAgICAgICAgICAgVGhpcyBjYW4gYmUgdXNl
ZCB0byBpbXByb3ZlIHJlc3BvbnNpdmVuZXNzIGlmIHRoZSB3b3JrZXIgaXMKKyAgICAgICAgICAg
IHByb2Nlc3Npbmcgc2xvdyBtZXNzYWdlcyAoZm9yIGV4YW1wbGUsICd0ZXN0X2xpc3QnKSBhbmQg
dGhlcmUKKyAgICAgICAgICAgIGlzIG9ubHkgb25lIHRocmVhZCAoaS5lLiwgaW5saW5lIG1vZGUp
IGluIHRoZSBtZXNzYWdlIGJyb2tlci4iIiIKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVu
dGVkRXJyb3IKKworICAgICMgU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgdmFsdWUuCisg
ICAgX1dPUktFUl9DT05ORUNUSU9OX0NMQVNTID0gX1dvcmtlckNvbm5lY3Rpb25JbnRlcmZhY2UK
KworICAgIGRlZiBzdGFydF93b3JrZXIoc2VsZiwgd29ya2VyX251bWJlcik6CisgICAgICAgICIi
IlN0YXJ0IGEgd29ya2VyIHdpdGggdGhlIGdpdmVuIGluZGV4IG51bWJlciwgYW5kIHJldHVybiBp
dHMgbmFtZS4iIiIKKyAgICAgICAgd29ya2VyID0gc2VsZi5fV09SS0VSX0NPTk5FQ1RJT05fQ0xB
U1Moc2VsZiwgc2VsZi5fd29ya2VyX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB3b3JrZXJfbnVtYmVyKQorICAgICAgICBuYW1lID0gd29ya2Vy
Lm5hbWUoKQorICAgICAgICB3b3JrZXIuc3RhcnQoKQorICAgICAgICBzZWxmLl9jaGlsZHJlbltu
YW1lXSA9IHdvcmtlcgorICAgICAgICByZXR1cm4gbmFtZQorCisgICAgZGVmIGNhbmNlbF93b3Jr
ZXIoc2VsZiwgd29ya2VyX25hbWUpOgorICAgICAgICAiIiJBdHRlbXB0IHRvIGNhbmNlbCBhIHdv
cmtlciAoYmVzdC1lZmZvcnQpLiBUaGUgd29ya2VyIG1heSBzdGlsbCBiZQorICAgICAgICBydW5u
aW5nIGFmdGVyIHRoaXMgY2FsbCByZXR1cm5zLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY2hp
bGRyZW5bd29ya2VyX25hbWVdLmNhbmNlbCgpCisKKyAgICBkZWYgam9pbl93b3JrZXIoc2VsZiwg
d29ya2VyX25hbWUsIHRpbWVvdXQpOgorICAgICAgICAiIiJXYWl0IHVudGlsIHdvcmtlciBleGl0
cyBvciB0aW1lb3V0IG9jY3Vycy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkcmVuW3dv
cmtlcl9uYW1lXS5qb2luKHRpbWVvdXQpCisKKyAgICBkZWYgd29ya2VyX2lzX2FsaXZlKHNlbGYs
IHdvcmtlcl9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgdGhlIHdvcmtlciBpcyBz
dGlsbCBydW5uaW5nLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRyZW5bd29ya2VyX25h
bWVdLmlzQWxpdmUoKQorCisgICAgZGVmIGxvZ193ZWRnZWRfd29ya2VyKHNlbGYsIHdvcmtlcl9u
YW1lLCB0ZXN0X25hbWUpOgorICAgICAgICAiIiJMb2cgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdp
dmVuIHdvcmtlcidzIHN0YXRlLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9y
CisKKyAgICBkZWYgYWRkX3RpbWVyKHNlbGYsIHRvcGljX25hbWUsIGNhbGxiYWNrLCBkZWxheV9z
ZWNzKToKKyAgICAgICAgIiIiQWRkIGEgdGltZXIgdGhhdCB3aWxsIGZpcmUgbGF0ZXIgZHVyaW5n
IGRyYWluKCkgb3IgbG9vcCgpLgorCisgICAgICAgIFRpbWVyIGNhbGxiYWNrcyB0YWtlIG5vIGFy
Z3VtZW50cywgYW5kIHNob3VsZCByZXR1cm4gVHJ1ZSBpZmYKKyAgICAgICAgbG9vcCgpIHNob3Vs
ZCBleGl0LiBDdXJyZW50bHkgdGhlIGNvZGUgb25seSBzdXBwb3J0cyBvbmUKKyAgICAgICAgdGlt
ZXIgcGVyIHRvcGljLCBidXQsIGluIG9yZGVyIHRvIHN1cHBvcnQgcGVyaW9kaWMgZXZlbnRzLAor
ICAgICAgICBhIHRpbWVyIGNhbiBiZSBhZGRlZCBmcm9tIGluc2lkZSB0aGUgY2FsbCBiYWNrLiIi
IgorICAgICAgICB0b3BpYyA9IHNlbGYuX2ZpbmRfdG9waWModG9waWNfbmFtZSkKKyAgICAgICAg
YXNzZXJ0KHRvcGljLnRpbWVyIGlzIE5vbmUpCisgICAgICAgIHRvcGljLnRpbWVyID0gX1RpbWVy
KGNhbGxiYWNrLCBkZWxheV9zZWNzKQorCisgICAgZGVmIHBvc3RfbWVzc2FnZShzZWxmLCBzcmMs
IHRvcGljX25hbWUsIG1lc3NhZ2VfbmFtZSwgYm9keT1Ob25lKToKKyAgICAgICAgIiIiUG9zdCBh
IG1lc3NhZ2UgdG8gdGhlIGFwcHJvcHJpYXRlIHRvcGljIHF1ZXVlLiIiIgorICAgICAgICBib2R5
ID0gYm9keSBvciB0dXBsZSgpCisgICAgICAgIG1lc3NhZ2UgPSBfTWVzc2FnZShzcmMsIHRvcGlj
X25hbWUsIG1lc3NhZ2VfbmFtZSwgYm9keSkKKyAgICAgICAgdG9waWMgPSBzZWxmLl9maW5kX3Rv
cGljKHRvcGljX25hbWUpCisgICAgICAgIHRvcGljLnF1ZXVlLnB1dChfTWVzc2FnZS5kdW1wcyht
ZXNzYWdlKSkKKworICAgIGRlZiBydW5fbWVzc2FnZV9sb29wKHNlbGYsIHRvcGljX25hbWUsIHJl
YWRlcik6CisgICAgICAgICIiIkxvb3AgcHJvY2Vzc2luZyBtZXNzYWdlcyBhbmQgdGltZXJzIHVu
dGlsIGRvbmUuCisKKyAgICAgICAgImRvbmUiIG1lYW5zIHRoYXQgcmVhZGVyLmlzX2RvbmUoKSBy
ZXR1cm5zIFRydWUgb3IgYSB0aW1lciBpbmRpY2F0ZXMKKyAgICAgICAgdGhhdCB3ZSdyZSBkb25l
LiIiIgorICAgICAgICB0b3BpYyA9IHNlbGYuX2ZpbmRfdG9waWModG9waWNfbmFtZSkKKyAgICAg
ICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICMgSGVyZSB3ZSBkb24ndCBjYXJlIGlmIHdlIGRv
IHdvcmsgaW4gdGhlIHRpbWVyLgorICAgICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAg
ICAgICAgIF8sIGRvbmUgPSBzZWxmLl9jaGVja190aW1lcih0b3BpYywgbm93KQorICAgICAgICAg
ICAgaWYgZG9uZSBvciByZWFkZXIuaXNfZG9uZSgpOgorICAgICAgICAgICAgICAgIHJldHVybgor
CisgICAgICAgICAgICAjIFJlLWNoZWNrIHRoZSB0aW1lLCBpbiBjYXNlIHRoZSB0aW1lciBoYWQg
YSBzbG93IGNhbGxiYWNrLgorICAgICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAg
ICAgIGlmIG5vdCBzZWxmLl90aW1lcl9leHBpcmVkKHRvcGljLCBub3cpOgorICAgICAgICAgICAg
ICAgIGRlbGF5ID0gc2VsZi5fdGltZXJfZGVsYXkodG9waWMsIG5vdykKKyAgICAgICAgICAgICAg
ICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHMgPSB0b3BpYy5xdWV1ZS5nZXQoYmxvY2s9VHJ1
ZSwgdGltZW91dD1kZWxheSkKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gX01lc3NhZ2UubG9h
ZHMocykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGlzcGF0Y2hfbWVzc2FnZShtc2csIHJl
YWRlcikKKyAgICAgICAgICAgICAgICBleGNlcHQgUXVldWUuRW1wdHk6CisgICAgICAgICAgICAg
ICAgICAgIHBhc3MKKworICAgIGRlZiBkcmFpbihzZWxmLCB0b3BpY19uYW1lLCByZWFkZXIpOgor
ICAgICAgICAiIiJMb29wIHVudGlsIHdlIHJ1biBvdXQgb2Ygc3R1ZmYgdG8gZG8gdy9vIGJsb2Nr
aW5nLgorCisgICAgICAgIFRoaXMgbWVhbnMgdGhlcmUgYXJlIG5vIG1lc3NhZ2VzIHRvIHByb2Nl
c3MgYW5kIG5vIHRpbWVycyBhcmUgZmlyaW5nCisgICAgICAgIHRoYXQgYXJlIGFzc29jaWF0ZWQg
d2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKworICAgICAgICBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHdl
IGRpZCBhbnl0aGluZyBhdCBhbGwuIiIiCisgICAgICAgIHRvcGljID0gc2VsZi5fZmluZF90b3Bp
Yyh0b3BpY19uYW1lKQorICAgICAgICBkaWRfd29ya19vbl90aGlzX3J1biA9IFRydWUKKyAgICAg
ICAgZG9uZSA9IHJlYWRlci5pc19kb25lKCkKKyAgICAgICAgd2hpbGUgZGlkX3dvcmtfb25fdGhp
c19ydW4gYW5kIG5vdCBkb25lOgorICAgICAgICAgICAgZGlkX3dvcmtfb25fdGhpc19ydW4sIGRv
bmUgPSBzZWxmLl9jaGVja190aW1lcih0b3BpYywgdGltZS50aW1lKCkpCisgICAgICAgICAgICBk
b25lID0gZG9uZSBvciByZWFkZXIuaXNfZG9uZSgpCisgICAgICAgICAgICBpZiBkb25lOgorICAg
ICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBz
ID0gdG9waWMucXVldWUuZ2V0KGJsb2NrPUZhbHNlKQorICAgICAgICAgICAgICAgIG1zZyA9IF9N
ZXNzYWdlLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5fZGlzcGF0Y2hfbWVzc2FnZSht
c2csIHJlYWRlcikKKyAgICAgICAgICAgICAgICBkaWRfd29ya19vbl90aGlzX3J1biA9IFRydWUK
KyAgICAgICAgICAgICAgICBkb25lID0gcmVhZGVyLmlzX2RvbmUoKQorICAgICAgICAgICAgZXhj
ZXB0IFF1ZXVlLkVtcHR5OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXR1cm4g
ZG9uZQorCisgICAgZGVmIF9jaGVja190aW1lcihzZWxmLCB0b3BpYywgbm93KToKKyAgICAgICAg
IiIiQ2hlY2sgaWYgYW55IHRpbWVycyBuZWVkIHRvIGZpcmUsIGFuZCBmaXJlIHRoZW0uCisKKyAg
ICAgICAgUmV0dXJucyBhIHR1cGxlIG9mICh3aGV0aGVyIGEgdGltZXIgZmlyZWQsIHdoZXRoZXIg
YSB0aW1lcgorICAgICAgICAgICAgcmV0dXJuZWQgVHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHdlIHNo
b3VsZCBiYWlsIG91dCBvZiB0aGUgYQorICAgICAgICAgICAgbWVzc2FnZSBsb29wIGlmIG5lY2Vz
c2FyeSkuIiIiCisgICAgICAgIGlmIHNlbGYuX3RpbWVyX2V4cGlyZWQodG9waWMsIG5vdyk6Cisg
ICAgICAgICAgICB0ID0gdG9waWMudGltZXIKKyAgICAgICAgICAgIHRvcGljLnRpbWVyID0gTm9u
ZQorICAgICAgICAgICAgZG9uZSA9IHQuY2FsbGJhY2soKQorICAgICAgICAgICAgcmV0dXJuIFRy
dWUsIGRvbmUKKyAgICAgICAgcmV0dXJuIEZhbHNlLCBGYWxzZQorCisgICAgZGVmIF90aW1lcl9k
ZWxheShzZWxmLCB0b3BpYywgbm93KToKKyAgICAgICAgIiIiIlJldHVybiB0aGUgdGltZSAoaW4g
c2VjcykgZnJvbSAnbm93JyB1bnRpbCB0aGUgdGltZXIgZmlyZXMuCisKKyAgICAgICAgVGhlIHJl
dHVybiB2YWx1ZSBtYXkgYmUgbmVnYXRpdmUsIGluZGljYXRpbmcgdGhhdCB0aGUgdGltZXIgaGFz
CisgICAgICAgIGV4cGlyZWQsIG9yIE5vbmUsIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8g
dGltZXIgb24gdGhlIHRvcGljCisgICAgICAgIChkZWxheSBmb3JldmVyKS4iIiIKKyAgICAgICAg
dCA9IHRvcGljLnRpbWVyCisgICAgICAgIGlmIHQ6CisgICAgICAgICAgICByZXR1cm4gdC5kZWFk
bGluZSAtIG5vdworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF90aW1lcl9leHBpcmVk
KHNlbGYsIHRvcGljLCBub3cpOgorICAgICAgICAiIiJSZXR1cm4gd2hldGhlciB0aGUgdG9waWMg
aGFzIGEgdGltZXIgd2hvc2UgZGVhZGxpbmUgaGFzIHBhc3NlZC4iIiIKKyAgICAgICAgdCA9IHRv
cGljLnRpbWVyCisgICAgICAgIHJldHVybiAodCBpcyBub3QgTm9uZSkgYW5kIG5vdyA+PSB0LmRl
YWRsaW5lCisKKyAgICBkZWYgX2Rpc3BhdGNoX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSwgcmVhZGVy
KToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIocmVhZGVyLCAnaGFuZGxlXycgKyBtZXNzYWdlLm5h
bWUpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICIlczog
cmVjZWl2ZWQgbWVzc2FnZSAnJXMnIGl0IGNvdWxkbid0IGhhbmRsZSIgJQorICAgICAgICAgICAg
ICAgKHJlYWRlci5uYW1lKCksIG1lc3NhZ2UubmFtZSkpCisgICAgICAgIG9wdGFyZ3MgPSBtZXNz
YWdlLmJvZHkKKyAgICAgICAgZm4gPSBnZXRhdHRyKHJlYWRlciwgJ2hhbmRsZV8nICsgbWVzc2Fn
ZS5uYW1lKQorICAgICAgICBmbihtZXNzYWdlLnNyYywgKm9wdGFyZ3MpCisKKworY2xhc3MgX0lu
bGluZUJyb2tlcihfV29ya2VyTWVzc2FnZUJyb2tlcik6CisgICAgY2xhc3MgX0lubGluZVdvcmtl
ckNvbm5lY3Rpb24ob2JqZWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlciwg
d29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKToKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlciA9
IGJyb2tlcgorICAgICAgICAgICAgc2VsZi5fcG9ydCA9IGJyb2tlci5fcG9ydAorICAgICAgICAg
ICAgc2VsZi5fb3B0aW9ucyA9IGJyb2tlci5fb3B0aW9ucworICAgICAgICAgICAgc2VsZi5fd29y
a2VyID0gd29ya2VyX2NsYXNzKHNlbGYsIHdvcmtlcl9udW1iZXIpCisKKyAgICAgICAgZGVmIGNh
bmNlbChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl93b3JrZXIuY2FuY2VsKCkKKwor
ICAgICAgICBkZWYgaXNBbGl2ZShzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9icm9r
ZXIuX21hbmFnZXIKKworICAgICAgICBkZWYgam9pbihzZWxmLCB0aW1lb3V0KToKKyAgICAgICAg
ICAgIGFzc2VydCBub3Qgc2VsZi5pc0FsaXZlKCkKKworICAgICAgICBkZWYgbmFtZShzZWxmKToK
KyAgICAgICAgICAgIHJldHVybiBzZWxmLl93b3JrZXIubmFtZSgpCisKKyAgICAgICAgZGVmIG9w
dGlvbnMoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYnJva2VyLl9vcHRpb25zCisK
KyAgICAgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYnJva2Vy
Ll9wb3J0CisKKyAgICAgICAgZGVmIHBvc3RfbWVzc2FnZShzZWxmLCBtZXNzYWdlX25hbWUsICpt
ZXNzYWdlX2FyZ3MpOgorICAgICAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2FnZShzZWxm
Lm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYnJv
a2VyLl93b3JrZXJfcmVwbHlfdG9waWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1lc3NhZ2VfbmFtZSwgbWVzc2FnZV9hcmdzKQorCisgICAgICAgIGRlZiBydW4oc2Vs
Zik6CisgICAgICAgICAgICBzZWxmLl93b3JrZXIucnVuKCkKKworICAgICAgICBkZWYgcnVuX21l
c3NhZ2VfbG9vcChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9s
b29wKHNlbGYuX2Jyb2tlci5fd29ya2VyX3J1bl90b3BpYywKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dvcmtlcikKKworICAgICAgICBkZWYgc3RhcnQo
c2VsZik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIHlpZWxkX3RvX2Jyb2tlcihz
ZWxmKToKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlci5kcmFpbihzZWxmLl9icm9rZXIuX3dvcmtl
cl9yZXBseV90b3BpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9icm9r
ZXIuX21hbmFnZXIpCisKKyAgICBfV09SS0VSX0NPTk5FQ1RJT05fQ0xBU1MgPSBfSW5saW5lV29y
a2VyQ29ubmVjdGlvbgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQsIG9wdGlvbnMsIHdv
cmtlcl9jbGFzcywgd29ya2VyX3J1bl90b3BpYywKKyAgICAgICAgICAgICAgICAgd29ya2VyX3Jl
cGx5X3RvcGljKToKKyAgICAgICAgX1dvcmtlck1lc3NhZ2VCcm9rZXIuX19pbml0X18oc2VsZiwg
cG9ydCwgb3B0aW9ucywgd29ya2VyX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB3b3JrZXJfcnVuX3RvcGljLCB3b3JrZXJfcmVwbHlfdG9waWMpCisKKyAgICAg
ICAgIyBUaGUgbWFuYWdlciBpcyBvbmx5IHZhbGlkIHdoZW4gdGhlIGlubGluZWQgd29ya2VyIGlz
ICJydW5uaW5nIiwKKyAgICAgICAgIyBtZWFuaW5nIHRoYXQgd2UgYXJlIHNlcnZpY2luZyBpdHMg
bWVzc2FnZSBxdWV1ZS4gV2UgbmVlZCB0aGlzCisgICAgICAgICMgdmFyaWFibGUgc28geWllbGRf
dG9fYnJva2VyKCkgd2lsbCB3b3JrIHByb3Blcmx5LgorICAgICAgICBzZWxmLl9tYW5hZ2VyID0g
Tm9uZQorCisgICAgZGVmIGxvZ193ZWRnZWRfd29ya2VyKHNlbGYsIHdvcmtlcl9uYW1lLCB0ZXN0
X25hbWUpOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiX0lubGluZUJyb2tlci5sb2df
d2VkZ2VkX3dvcmtlcigpIGNhbGxlZCIpCisKKyAgICBkZWYgcnVuX21lc3NhZ2VfbG9vcChzZWxm
LCB0b3BpY19uYW1lLCByZWFkZXIpOgorICAgICAgICAjIFdlIG5lZWQgc3BlY2lhbCBsb2dpYyBp
biB0aGUgaW5saW5lIGNhc2UgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQKKyAgICAgICAgIyB0aGUg
bWFuYWdlciBhbmQgd29ya2VycyBhY3R1YWxseSBib3RoIGdldCB0byBydW4gcHJvcGVybHkuIFRo
ZXJlJ3MKKyAgICAgICAgIyBwcm9iYWJseSBhIGZldyB3YXlzIHdlIGNvdWxkIGFjY29tcGxpc2gg
dGhpcywgYnV0IGZvciBub3cgd2UKKyAgICAgICAgIyBoYXZlIHRoZSBtYW5hZ2VyIHJ1bigpIHRo
ZSB3b3JrZXIgaW5saW5lIHRvIGNvbXBsZXRpb24sIGFuZCB0aGVuCisgICAgICAgICMgZHJhaW4g
YW55IHBlbmRpbmcgZXZlbnRzIG9uIHRoZSBtYW5hZ2VyIHRvcGljLiBXZSBjb3VudCBvbiB0aGUK
KyAgICAgICAgIyB3b3JrZXIgY2FsbGluZyB5aWVsZF90b19icm9rZXIoKSBwZXJpb2RpY2FsbHkg
aW4gb3JkZXIgdG8gbWFrZQorICAgICAgICAjIHN1cmUgdGhlIG1hbmFnZXIgZG9lc24ndCBnZXQg
c3RhcnZlZC4KKyAgICAgICAgaWYgdG9waWNfbmFtZSA9PSBzZWxmLl93b3JrZXJfcmVwbHlfdG9w
aWM6CisgICAgICAgICAgICAjIE1hbmFnZXIuIERvIGFzIGp1c3QgZGVzY3JpYmVkLgorICAgICAg
ICAgICAgY2hpbGRyZW4gPSBzZWxmLl9jaGlsZHJlbi52YWx1ZXMoKQorICAgICAgICAgICAgaWYg
Y2hpbGRyZW46CisgICAgICAgICAgICAgICAgc2VsZi5fbWFuYWdlciA9IHJlYWRlcgorICAgICAg
ICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5bMF0ucnVuKCkKKyAg
ICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9tYW5hZ2Vy
ID0gTm9uZQorCisgICAgICAgICAgICB0b3BpYyA9IHNlbGYuX2ZpbmRfdG9waWModG9waWNfbmFt
ZSkKKyAgICAgICAgICAgIHdoaWxlIHRvcGljLnRpbWVyIG9yIG5vdCB0b3BpYy5xdWV1ZS5lbXB0
eSgpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZHJhaW4odG9waWNfbmFtZSwgcmVhZGVyKToK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgIG5vdyA9IHRpbWUu
dGltZSgpCisgICAgICAgICAgICAgICAgaWYgdG9waWMudGltZXIgYW5kIHRvcGljLnRpbWVyLmRl
YWRsaW5lID4gbm93OgorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHRvcGljLnRpbWVy
LmRlYWRsaW5lIC0gbm93KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUaGlzIGlzIGEg
d29ya2VyLiBJbiB0aGUgaW5saW5lIGNhc2UsIGEgd29ya2VyIG5ldmVyIGJsb2NrcywKKyAgICAg
ICAgICAgICMgc28gd2UgY2FuIHJ1biB0aGUgcmVndWxhciBsb29wIGNvZGUuCisgICAgICAgICAg
ICAjCisgICAgICAgICAgICAjIEZJWE1FOiBXZSBkb24ndCBhY3R1YWxseSBlbmZvcmNlIHRoaXMs
IHNvIGEgYnVnZ3kgd29ya2VyIGNvdWxkCisgICAgICAgICAgICAjIGRlYWRsb2NrIHRoZSBwcm9j
ZXNzLgorCisgICAgICAgICAgICAjIEVuc3VyZSB0aGlzIGlzIGJlaW5nIGNhbGxlZCBvbmx5IGZy
b20gaW5zaWRlIHRoZSBtYW5hZ2VyIGxvb3AuCisgICAgICAgICAgICBhc3NlcnQgc2VsZi5fbWFu
YWdlciBpcyBub3QgTm9uZQorCisgICAgICAgICAgICBfV29ya2VyTWVzc2FnZUJyb2tlci5ydW5f
bWVzc2FnZV9sb29wKHNlbGYsIHRvcGljX25hbWUsIHJlYWRlcikKKworCitjbGFzcyBfTXVsdGlU
aHJlYWRlZEJyb2tlcihfV29ya2VyTWVzc2FnZUJyb2tlcik6CisgICAgY2xhc3MgX1RocmVhZGVk
V29ya2VyQ29ubmVjdGlvbih0aHJlYWRpbmcuVGhyZWFkKToKKyAgICAgICAgZGVmIF9faW5pdF9f
KHNlbGYsIGJyb2tlciwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKToKKyAgICAgICAgICAg
IHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tl
ciA9IGJyb2tlcgorICAgICAgICAgICAgc2VsZi5fcG9ydCA9IGJyb2tlci5fcG9ydAorICAgICAg
ICAgICAgc2VsZi5fb3B0aW9ucyA9IGJyb2tlci5fb3B0aW9ucworICAgICAgICAgICAgc2VsZi5f
d29ya2VyID0gd29ya2VyX2NsYXNzKHNlbGYsIHdvcmtlcl9udW1iZXIpCisKKyAgICAgICAgZGVm
IGNhbmNlbChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX3dvcmtlci5jYW5jZWwoKQorCisgICAg
ICAgIGRlZiBpc0FsaXZlKHNlbGYpOgorICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5pc0Fs
aXZlKHNlbGYpCisKKyAgICAgICAgZGVmIGpvaW4oc2VsZiwgdGltZW91dCk6CisgICAgICAgICAg
ICB0aHJlYWRpbmcuVGhyZWFkLmpvaW4oc2VsZiwgdGltZW91dCkKKworICAgICAgICBkZWYgbmFt
ZShzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl93b3JrZXIubmFtZSgpCisKKyAgICAg
ICAgZGVmIG9wdGlvbnMoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYnJva2VyLl9v
cHRpb25zCisKKyAgICAgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2Vs
Zi5fYnJva2VyLl9wb3J0CisKKyAgICAgICAgZGVmIHBvc3RfbWVzc2FnZShzZWxmLCBtZXNzYWdl
X25hbWUsICptZXNzYWdlX2FyZ3MpOgorICAgICAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVz
c2FnZShzZWxmLm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c2VsZi5fYnJva2VyLl93b3JrZXJfcmVwbHlfdG9waWMsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1lc3NhZ2VfbmFtZSwgbWVzc2FnZV9hcmdzKQorCisgICAgICAgIGRl
ZiBydW4oc2VsZik6CisgICAgICAgICAgICAjIEZJWE1FOiB3ZSBjYW4gcmVtb3ZlIHRoaXMgb25j
ZSBldmVyeW9uZSBpcyBvbiAyLjYuCisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAn
aWRlbnQnKToKKyAgICAgICAgICAgICAgICBzZWxmLmlkZW50ID0gdGhyZWFkLmdldF9pZGVudCgp
CisgICAgICAgICAgICBzZWxmLl93b3JrZXIucnVuKCkKKworICAgICAgICBkZWYgcnVuX21lc3Nh
Z2VfbG9vcChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9sb29w
KHNlbGYuX2Jyb2tlci5fd29ya2VyX3J1bl90b3BpYywKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNlbGYuX3dvcmtlcikKKworICAgICAgICBkZWYgeWllbGRfdG9f
YnJva2VyKHNlbGYpOgorICAgICAgICAgICAgIyBUaGVyZSdzIG5vIG5lZWQgdG8geWllbGQgd2l0
aCB0aHJlYWRzLgorICAgICAgICAgICAgcGFzcworCisgICAgX1dPUktFUl9DT05ORUNUSU9OX0NM
QVNTID0gX1RocmVhZGVkV29ya2VyQ29ubmVjdGlvbgorCisgICAgZGVmIGxvZ193ZWRnZWRfd29y
a2VyKHNlbGYsIHdvcmtlcl9uYW1lLCB0ZXN0X25hbWUpOgorICAgICAgICB0aHJlYWQgPSBzZWxm
Ll9jaGlsZHJlblt3b3JrZXJfbmFtZV0KKyAgICAgICAgdGlkID0gdGhyZWFkLmlkZW50CisgICAg
ICAgIHN0YWNrID0gc2VsZi5fZmluZF90aHJlYWRfc3RhY2sodGlkKQorICAgICAgICBhc3NlcnQo
c3RhY2sgaXMgbm90IE5vbmUpCisgICAgICAgIF9sb2cuZXJyb3IoIiVzICh0aWQgJWQpIGlzIHdl
ZGdlZCBvbiB0ZXN0ICVzIiAlCisgICAgICAgICAgICAgICAgICAgKHdvcmtlcl9uYW1lLCB0aWQs
IHRlc3RfbmFtZSkpCisgICAgICAgIHNlbGYuX2xvZ19zdGFjayhzdGFjaykKKworICAgIGRlZiBf
ZmluZF90aHJlYWRfc3RhY2soc2VsZiwgdGlkKToKKyAgICAgICAgIiIiUmV0dXJucyBhIHN0YWNr
IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGR1bXAgYSBzdGFjayB0cmFjZSBmb3IKKyAgICAg
ICAgdGhlIGdpdmVuIHRocmVhZCBpZCAob3IgTm9uZSBpZiB0aGUgaWQgaXMgbm90IGZvdW5kKS4i
IiIKKyAgICAgICAgZm9yIHRocmVhZF9pZCwgc3RhY2sgaW4gc3lzLl9jdXJyZW50X2ZyYW1lcygp
Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiB0aHJlYWRfaWQgPT0gdGlkOgorICAgICAgICAgICAg
ICAgIHJldHVybiBzdGFjaworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9sb2dfc3Rh
Y2soc2VsZiwgc3RhY2spOgorICAgICAgICAiIiJMb2cgYSBzdGFjayB0cmFjZSB0byBsb2cuZXJy
b3IoKS4iIiIKKyAgICAgICAgZm9yIGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUgaW4gdHJh
Y2ViYWNrLmV4dHJhY3Rfc3RhY2soc3RhY2spOgorICAgICAgICAgICAgX2xvZy5lcnJvcignRmls
ZTogIiVzIiwgbGluZSAlZCwgaW4gJXMnICUgKGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUpKQorICAg
ICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICBfbG9nLmVycm9yKCcgICVzJyAlIGxp
bmUuc3RyaXAoKSkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21lc3NhZ2VfYnJva2VyMl91bml0dGVzdC5weSBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21l
c3NhZ2VfYnJva2VyMl91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xYzgyZDUyMzE3N2Y1N2RjYzlk
ZTMyMGJmNTE4ZDg2NzNhYmZhMmUxCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9rZXIy
X3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMzQ2IEBACisjIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1l
IG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisj
CisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0
IGxvZ2dpbmcKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IFF1ZXVlCitpbXBvcnQgc3lzCitpbXBv
cnQgdHlwZXMKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0g
aW1wb3J0IG91dHB1dGNhcHR1cmUKKworaW1wb3J0IG1lc3NhZ2VfYnJva2VyMiBhcyBtZXNzYWdl
X2Jyb2tlcgorCisKK2RlZiBtYWtlX3dvcmtlcl9jbGFzcyhzdGFydGluZ19xdWV1ZT1Ob25lLCBz
dG9wcGluZ19xdWV1ZT1Ob25lLCBtc2c9J2RvbmUnKToKKyAgICBjbGFzcyBUZXN0V29ya2VyKG9i
amVjdCk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBicm9rZXIsIHdvcmtlcl9udW1iZXIp
OgorICAgICAgICAgICAgc2VsZi5fYnJva2VyID0gYnJva2VyCisgICAgICAgICAgICBzZWxmLl9w
b3J0ID0gYnJva2VyLnBvcnQoKQorICAgICAgICAgICAgc2VsZi5fb3B0aW9ucyA9IGJyb2tlci5v
cHRpb25zKCkKKyAgICAgICAgICAgIHNlbGYuX3dvcmtlcl9udW1iZXIgPSB3b3JrZXJfbnVtYmVy
CisgICAgICAgICAgICBzZWxmLl9uYW1lID0gJ1Rlc3RXb3JrZXIvJWQnICUgd29ya2VyX251bWJl
cgorICAgICAgICAgICAgc2VsZi5fY2FuY2VsZWQgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5f
c3RvcHBlZCA9IEZhbHNlCisKKyAgICAgICAgZGVmIGNhbmNlbChzZWxmKToKKyAgICAgICAgICAg
IHNlbGYuX2NhbmNlbGVkID0gVHJ1ZQorCisgICAgICAgIGRlZiBoYW5kbGVfc3RvcChzZWxmLCBz
cmMpOgorICAgICAgICAgICAgc2VsZi5fc3RvcHBlZCA9IFRydWUKKworICAgICAgICBkZWYgaGFu
ZGxlX3Rlc3Qoc2VsZiwgc3JjLCBhbl9pbnQsIGFfc3RyKToKKyAgICAgICAgICAgIGFzc2VydCBh
bl9pbnQgPT0gMQorICAgICAgICAgICAgYXNzZXJ0IGFfc3RyID09ICJoZWxsbywgd29ybGQiCisg
ICAgICAgICAgICBzZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKCd0ZXN0JywgMiwgJ2hpLCBldmVy
eWJvZHknKQorCisgICAgICAgIGRlZiBpc19kb25lKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJu
IHNlbGYuX3N0b3BwZWQgb3Igc2VsZi5fY2FuY2VsZWQKKworICAgICAgICBkZWYgbmFtZShzZWxm
KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICAgICAgZGVmIHJ1bihzZWxm
KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBzdGFydGluZ19xdWV1ZToK
KyAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmdfcXVldWUucHV0KCcnKQorICAgICAgICAgICAg
ICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9sb29wKCkKKyAgICAgICAgICAgICAgICBzZWxm
Ll9icm9rZXIueWllbGRfdG9fYnJva2VyKCkKKyAgICAgICAgICAgICAgICBpZiBtc2c6CisgICAg
ICAgICAgICAgICAgICAgIHNlbGYuX2Jyb2tlci5wb3N0X21lc3NhZ2UobXNnKQorICAgICAgICAg
ICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICBzZWxmLl9icm9rZXIucG9z
dF9tZXNzYWdlKCdleGNlcHRpb24nLCAodHlwZShlKSwgc3RyKGUpLCBOb25lKSkKKworICAgIHJl
dHVybiBUZXN0V29ya2VyCisKKworZGVmIGdldF9vcHRpb25zKHdvcmtlcl9tb2RlbCk6CisgICAg
b3B0aW9uX2xpc3QgPSBtZXNzYWdlX2Jyb2tlci5ydW50aW1lX29wdGlvbnMoKQorICAgIHBhcnNl
ciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25fbGlzdCkKKyAgICBv
cHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJncz1bJy0td29ya2VyLW1vZGVsJywg
d29ya2VyX21vZGVsXSkKKyAgICByZXR1cm4gb3B0aW9ucworCisKK2RlZiBtYWtlX2Jyb2tlciht
YW5hZ2VyLCB3b3JrZXJfbW9kZWwsIHN0YXJ0aW5nX3F1ZXVlPU5vbmUsCisgICAgICAgICAgICAg
ICAgc3RvcHBpbmdfcXVldWU9Tm9uZSk6CisgICAgb3B0aW9ucyA9IGdldF9vcHRpb25zKHdvcmtl
cl9tb2RlbCkKKyAgICB3b3JrZXJfY2xhc3MgPSBtYWtlX3dvcmtlcl9jbGFzcyhzdGFydGluZ19x
dWV1ZSwgc3RvcHBpbmdfcXVldWUpCisgICAgcmV0dXJuIG1lc3NhZ2VfYnJva2VyLmdldChOb25l
LCBvcHRpb25zLCBtYW5hZ2VyLCB3b3JrZXJfY2xhc3MpCisKKworY2xhc3MgRnVuY3Rpb25UZXN0
cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZ2V0X19pbmxpbmUoc2VsZik6Cisg
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWtlX2Jyb2tlcihzZWxmLCAnaW5saW5lJykgaXMgbm90
IE5vbmUpCisKKyAgICBkZWYgdGVzdF9nZXRfX3RocmVhZHMoc2VsZik6CisgICAgICAgIHNlbGYu
YXNzZXJ0VHJ1ZShtYWtlX2Jyb2tlcihzZWxmLCAndGhyZWFkcycpIGlzIG5vdCBOb25lKQorCisg
ICAgZGVmIHRlc3RfZ2V0X191bmtub3duKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNl
cyhWYWx1ZUVycm9yLCBtYWtlX2Jyb2tlciwgc2VsZiwgJ3Vua25vd24nKQorCisKK2NsYXNzIF9X
b3JrZXJNZXNzYWdlQnJva2VyVGVzdHNNaXhpbihvYmplY3QpOgorICAgICIiIk1peGluIGNsYXNz
IHRoYXQgaW1wbGVtZW50cyBhIHNlcmllcyBvZiB0ZXN0cyB0byBlbmZvcmNlIHRoZQorICAgIGNv
bnRyYWN0IGFsbCBfV29ya2VyTWVzc2FnZUJyb2tlciBpbXBsZW1lbnRhdGlvbnMgbXVzdCBmb2xs
b3cuIiIiCisKKyAgICAjCisgICAgIyBNZXRob2RzIHRvIGltcGxlbWVudCB0aGUgTWFuYWdlciBz
aWRlIG9mIHRoZSBDbGllbnRJbnRlcmZhY2UKKyAgICAjCisgICAgZGVmIG5hbWUoc2VsZik6Cisg
ICAgICAgIHJldHVybiAnVGVzdGVyJworCisgICAgZGVmIGlzX2RvbmUoc2VsZik6CisgICAgICAg
IHJldHVybiBzZWxmLl9kb25lCisKKyAgICAjCisgICAgIyBIYW5kbGVycyBmb3IgdGhlIG1lc3Nh
Z2VzIHRoZSBUZXN0V29ya2VyIG1heSBzZW5kLgorICAgICMKKyAgICBkZWYgaGFuZGxlX2RvbmUo
c2VsZiwgc3JjKToKKyAgICAgICAgc2VsZi5fZG9uZSA9IFRydWUKKworICAgIGRlZiBoYW5kbGVf
dGVzdChzZWxmLCBzcmMsIGFuX2ludCwgYV9zdHIpOgorICAgICAgICBzZWxmLl9hbl9pbnQgPSBh
bl9pbnQKKyAgICAgICAgc2VsZi5fYV9zdHIgPSBhX3N0cgorCisgICAgZGVmIGhhbmRsZV9leGNl
cHRpb24oc2VsZiwgc3JjLCBleGNfaW5mbyk6CisgICAgICAgIHNlbGYuX2V4Y2VwdGlvbiA9IGV4
Y19pbmZvCisgICAgICAgIHNlbGYuX2RvbmUgPSBUcnVlCisKKyAgICAjCisgICAgIyBUZXN0aW5n
IGhlbHBlciBtZXRob2RzCisgICAgIworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2Vs
Zi5fYW5faW50ID0gTm9uZQorICAgICAgICBzZWxmLl9hX3N0ciA9IE5vbmUKKyAgICAgICAgc2Vs
Zi5fYnJva2VyID0gTm9uZQorICAgICAgICBzZWxmLl9kb25lID0gRmFsc2UKKyAgICAgICAgc2Vs
Zi5fZXhjZXB0aW9uID0gTm9uZQorICAgICAgICBzZWxmLl93b3JrZXJfbW9kZWwgPSBOb25lCisg
ICAgICAgIHNlbGYuX3RpbWVyX3ZhbCA9IDAKKyAgICAgICAgc2VsZi5fdGltZXJfbWF4X3ZhbCA9
IDEKKworICAgIGRlZiBtYWtlX2Jyb2tlcihzZWxmLCBzdGFydGluZ19xdWV1ZT1Ob25lLCBzdG9w
cGluZ19xdWV1ZT1Ob25lKToKKyAgICAgICAgc2VsZi5fYnJva2VyID0gbWFrZV9icm9rZXIoc2Vs
Ziwgc2VsZi5fd29ya2VyX21vZGVsLCBzdGFydGluZ19xdWV1ZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RvcHBpbmdfcXVldWUpCisKKyAgICBkZWYgY2FsbGJhY2soc2Vs
Zik6CisgICAgICAgIHNlbGYuX3RpbWVyX3ZhbCArPSAxCisgICAgICAgIHNlbGYuX2Jyb2tlci5h
ZGRfdGltZXIoc2VsZi5jYWxsYmFjaywgMC4wMDUpCisgICAgICAgIHJldHVybiBzZWxmLl90aW1l
cl92YWwgPj0gc2VsZi5fdGltZXJfbWF4X3ZhbAorCisgICAgIworICAgICMgQWN0dWFsIHVuaXQg
dGVzdHMKKyAgICAjCisgICAgZGVmIHRlc3RfYWRkX3RpbWVyX19iYXNpYyhzZWxmKToKKyAgICAg
ICAgc2VsZi5tYWtlX2Jyb2tlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fdGlt
ZXJfdmFsLCAwKQorICAgICAgICBzZWxmLl9icm9rZXIuYWRkX3RpbWVyKHNlbGYuY2FsbGJhY2ss
IDAuMDA1KQorICAgICAgICBzZWxmLl9icm9rZXIucnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fdGltZXJfdmFsLCAxKQorCisgICAgZGVmIHRlc3RfYWRk
X3RpbWVyX19leHBpcmVkKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl90aW1lcl92YWwsIDApCisgICAgICAgIHNlbGYuX2Jy
b2tlci5hZGRfdGltZXIoc2VsZi5jYWxsYmFjaywgMCkKKyAgICAgICAgc2VsZi5fYnJva2VyLnJ1
bl9tZXNzYWdlX2xvb3AoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3RpbWVyX3Zh
bCwgMSkKKworICAgIGRlZiB0ZXN0X2FkZF90aW1lcl9fdG9vX21hbnlfdGltZXJzKHNlbGYpOgor
ICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxm
Ll90aW1lcl92YWwsIDApCisgICAgICAgIHNlbGYuX2Jyb2tlci5hZGRfdGltZXIoc2VsZi5jYWxs
YmFjaywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIHNlbGYu
X2Jyb2tlci5hZGRfdGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FsbGJh
Y2ssIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fdGltZXJfdmFsLCAwKQorCisg
ICAgZGVmIHRlc3RfYWRkX3RpbWVyX19wZXJpb2RpYyhzZWxmKToKKyAgICAgICAgc2VsZi5tYWtl
X2Jyb2tlcigpCisgICAgICAgIHNlbGYuX3RpbWVyX21heF92YWwgPSAyCisgICAgICAgIHNlbGYu
X2Jyb2tlci5hZGRfdGltZXIoc2VsZi5jYWxsYmFjaywgMC4wMDUpCisgICAgICAgIHNlbGYuX2Jy
b2tlci5ydW5fbWVzc2FnZV9sb29wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl90
aW1lcl92YWwsIDIpCisKKyAgICBkZWYgdGVzdF9jYW5jZWwoc2VsZik6CisgICAgICAgIHNlbGYu
bWFrZV9icm9rZXIoKQorICAgICAgICB3b3JrZXJfbmFtZSA9IHNlbGYuX2Jyb2tlci5zdGFydF93
b3JrZXIoMCkKKyAgICAgICAgc2VsZi5fYnJva2VyLmNhbmNlbF93b3JrZXIod29ya2VyX25hbWUp
CisgICAgICAgIHNlbGYuX2Jyb2tlci5wb3N0X21lc3NhZ2UoJ3N0b3AnKQorICAgICAgICBzZWxm
Ll9icm9rZXIucnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgIHNlbGYuX2Jyb2tlci5qb2luX3dv
cmtlcih3b3JrZXJfbmFtZSwgMC41KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuX2Jy
b2tlci53b3JrZXJfaXNfYWxpdmUod29ya2VyX25hbWUpKQorICAgICAgICBzZWxmLmFzc2VydFRy
dWUoc2VsZi5pc19kb25lKCkpCisKKyAgICBkZWYgdGVzdF9kb25lKHNlbGYpOgorICAgICAgICBz
ZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgd29ya2VyX25hbWUgPSBzZWxmLl9icm9rZXIuc3Rh
cnRfd29ya2VyKDApCisgICAgICAgIHNlbGYuX2Jyb2tlci5wb3N0X21lc3NhZ2UoJ3Rlc3QnLCAx
LCAnaGVsbG8sIHdvcmxkJykKKyAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2FnZSgnc3Rv
cCcpCisgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9sb29wKCkKKyAgICAgICAgc2Vs
Zi5fYnJva2VyLmpvaW5fd29ya2VyKHdvcmtlcl9uYW1lLCAwLjUpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RmFsc2Uoc2VsZi5fYnJva2VyLndvcmtlcl9pc19hbGl2ZSh3b3JrZXJfbmFtZSkpCisgICAg
ICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2RvbmUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbChzZWxmLl9hbl9pbnQsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYV9z
dHIsICdoaSwgZXZlcnlib2R5JykKKworICAgIGRlZiB0ZXN0X3Vua25vd25fbWVzc2FnZShzZWxm
KToKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigpCisgICAgICAgIHdvcmtlcl9uYW1lID0gc2Vs
Zi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBzZWxmLl9icm9rZXIucG9zdF9tZXNz
YWdlKCd1bmtub3duJykKKyAgICAgICAgc2VsZi5fYnJva2VyLnJ1bl9tZXNzYWdlX2xvb3AoKQor
ICAgICAgICBzZWxmLl9icm9rZXIuam9pbl93b3JrZXIod29ya2VyX25hbWUsIDAuNSkKKworICAg
ICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc19kb25lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0
RmFsc2Uoc2VsZi5fYnJva2VyLndvcmtlcl9pc19hbGl2ZSh3b3JrZXJfbmFtZSkpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuX2V4Y2VwdGlvblswXSwgVmFsdWVFcnJvcikKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5fZXhjZXB0aW9uWzFdLAorICAgICAgICAgICAgIlRl
c3RXb3JrZXIvMDogcmVjZWl2ZWQgbWVzc2FnZSAndW5rbm93bicgaXQgY291bGRuJ3QgaGFuZGxl
IikKKworCitjbGFzcyBJbmxpbmVCcm9rZXJUZXN0cyhfV29ya2VyTWVzc2FnZUJyb2tlclRlc3Rz
TWl4aW4sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAg
IF9Xb3JrZXJNZXNzYWdlQnJva2VyVGVzdHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAgICBzZWxm
Ll93b3JrZXJfbW9kZWwgPSAnaW5saW5lJworCisgICAgZGVmIHRlc3RfbG9nX3dlZGdlZF93b3Jr
ZXIoc2VsZik6CisgICAgICAgIHNlbGYubWFrZV9icm9rZXIoKQorICAgICAgICBzZWxmLmFzc2Vy
dFJhaXNlcyhBc3NlcnRpb25FcnJvciwgc2VsZi5fYnJva2VyLmxvZ193ZWRnZWRfd29ya2VyLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBOb25lKQorCisKK2NsYXNzIFRocmVhZGVk
QnJva2VyVGVzdHMoX1dvcmtlck1lc3NhZ2VCcm9rZXJUZXN0c01peGluLCB1bml0dGVzdC5UZXN0
Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBfV29ya2VyTWVzc2FnZUJyb2tl
clRlc3RzTWl4aW4uc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5fd29ya2VyX21vZGVsID0gJ3Ro
cmVhZHMnCisKKyAgICBkZWYgdGVzdF9maW5kX3RocmVhZF9zdGFja19mb3VuZChzZWxmKToKKyAg
ICAgICAgc2VsZi5tYWtlX2Jyb2tlcigpCisgICAgICAgIGlkLCBzdGFjayA9IHN5cy5fY3VycmVu
dF9mcmFtZXMoKS5pdGVtcygpWzBdCisgICAgICAgIGZvdW5kX3N0YWNrID0gc2VsZi5fYnJva2Vy
Ll9maW5kX3RocmVhZF9zdGFjayhpZCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmb3Vu
ZF9zdGFjaywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfdGhyZWFkX3N0YWNrX25vdF9mb3Vu
ZChzZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigpCisgICAgICAgIGZvdW5kX3N0YWNr
ID0gc2VsZi5fYnJva2VyLl9maW5kX3RocmVhZF9zdGFjaygwKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFsKGZvdW5kX3N0YWNrLCBOb25lKQorCisgICAgZGVmIHRlc3RfbG9nX3dlZGdlZF93b3Jr
ZXIoc2VsZik6CisgICAgICAgIHN0YXJ0aW5nX3F1ZXVlID0gUXVldWUuUXVldWUoKQorICAgICAg
ICBzdG9wcGluZ19xdWV1ZSA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tl
cihzdGFydGluZ19xdWV1ZSwgc3RvcHBpbmdfcXVldWUpCisgICAgICAgIG9jID0gb3V0cHV0Y2Fw
dHVyZS5PdXRwdXRDYXB0dXJlKCkKKyAgICAgICAgb2MuY2FwdHVyZV9vdXRwdXQoKQorCisgICAg
ICAgIHdvcmtlcl9uYW1lID0gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBz
dGFydGluZ19xdWV1ZS5nZXQoKQorICAgICAgICBzZWxmLl9icm9rZXIubG9nX3dlZGdlZF93b3Jr
ZXIod29ya2VyX25hbWUsICd0ZXN0X25hbWUnKQorICAgICAgICBzdG9wcGluZ19xdWV1ZS5wdXQo
JycpCisgICAgICAgIG9jLnJlc3RvcmVfb3V0cHV0KCkKKworCitjbGFzcyBNZXNzYWdlVGVzdCh1
bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX25vX2JvZHkoc2VsZik6CisgICAgICAg
IG1zZyA9IG1lc3NhZ2VfYnJva2VyLl9NZXNzYWdlKCdzcmMnLCAndG9waWNfbmFtZScsICdtZXNz
YWdlX25hbWUnLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihtc2cpKQorICAg
ICAgICBzID0gbXNnLmR1bXBzKCkKKyAgICAgICAgbmV3X21zZyA9IG1lc3NhZ2VfYnJva2VyLl9N
ZXNzYWdlLmxvYWRzKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X21zZy5uYW1lLCAn
bWVzc2FnZV9uYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfbXNnLmJvZHksIE5v
bmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X21zZy50b3BpY19uYW1lLCAndG9waWNf
bmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X21zZy5zcmMsICdzcmMnKQorCisg
ICAgZGVmIHRlc3RfX2JvZHkoc2VsZik6CisgICAgICAgIG1zZyA9IG1lc3NhZ2VfYnJva2VyLl9N
ZXNzYWdlKCdzcmMnLCAndG9waWNfbmFtZScsICdtZXNzYWdlX25hbWUnLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2JvZHknLCAwKSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRUcnVlKHJlcHIobXNnKSkKKyAgICAgICAgcyA9IG1zZy5kdW1wcygpCisgICAgICAgIG5ld19t
c2cgPSBtZXNzYWdlX2Jyb2tlci5fTWVzc2FnZS5sb2FkcyhzKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFsKG5ld19tc2cubmFtZSwgJ21lc3NhZ2VfbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwobmV3X21zZy5ib2R5LCAoJ2JvZHknLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bChuZXdfbXNnLnRvcGljX25hbWUsICd0b3BpY19uYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbChuZXdfbXNnLnNyYywgJ3NyYycpCisKKworY2xhc3MgSW50ZXJmYWNlVGVzdCh1bml0dGVz
dC5UZXN0Q2FzZSk6CisgICAgIyBUaGVzZSB0ZXN0cyBtb3N0bHkgZXhpc3QgdG8gcGFjaWZ5IGNv
dmVyYWdlLgorCisgICAgIyBGSVhNRTogVGhlcmUgbXVzdCBiZSBhIGJldHRlciB3YXkgdG8gZG8g
dGhpcyBhbmQgYWxzbyB2ZXJpZnkKKyAgICAjIHRoYXQgY2xhc3NlcyBkbyBpbXBsZW1lbnQgZXZl
cnkgYWJzdHJhY3QgbWV0aG9kIGluIGFuIGludGVyZmFjZS4KKworICAgIGRlZiB0ZXN0X3dvcmtl
cmNvbm5lY3Rpb25pbnRlcmZhY2VfaXNfYWJzdHJhY3Qoc2VsZik6CisgICAgICAgICMgVGVzdCB0
aGF0IHdlIGNhbid0IGNyZWF0ZSBhbiBpbnN0YW5jZSBkaXJlY3RseS4KKyAgICAgICAgc2VsZi5h
c3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwKKyAgICAgICAgICAgIG1lc3NhZ2VfYnJv
a2VyLl9Xb3JrZXJNZXNzYWdlQnJva2VyLl9Xb3JrZXJDb25uZWN0aW9uSW50ZXJmYWNlLAorICAg
ICAgICAgICAgYnJva2VyPU5vbmUsIHdvcmtlcl9jbGFzcz1Ob25lLCB3b3JrZXJfbnVtYmVyPU5v
bmUpCisKKyAgICAgICAgY2xhc3MgV29ya2VyQ29ubmVjdGlvbihtZXNzYWdlX2Jyb2tlci5fV29y
a2VyTWVzc2FnZUJyb2tlci5fV29ya2VyQ29ubmVjdGlvbkludGVyZmFjZSk6CisgICAgICAgICAg
ICBkZWYgX19pbml0X18oc2VsZiwgKm9wdGFyZ3MpOgorICAgICAgICAgICAgICAgIHBhc3MKKwor
ICAgICAgICAjIFRlc3QgdGhhdCBhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kcyBhcmUgYWJzdHJh
Y3QgYW5kIGhhdmUgdGhlCisgICAgICAgICMgc2lnbmF0dXJlIHdlIGV4cGVjdC4KKyAgICAgICAg
b2JqID0gV29ya2VyQ29ubmVjdGlvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdElt
cGxlbWVudGVkRXJyb3IsIG9iai5jYW5jZWwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5v
dEltcGxlbWVudGVkRXJyb3IsIG9iai5pc0FsaXZlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNl
cyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmouam9pbiwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLm5hbWUpCisgICAgICAgIHNlbGYuYXNz
ZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5wb3J0KQorICAgICAgICBzZWxmLmFz
c2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmoub3B0aW9ucykKKyAgICAgICAgc2Vs
Zi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLnBvc3RfbWVzc2FnZSwgTm9u
ZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwg
b2JqLnJ1bikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwg
b2JqLnJ1bl9tZXNzYWdlX2xvb3ApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxl
bWVudGVkRXJyb3IsIG9iai5zdGFydCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1w
bGVtZW50ZWRFcnJvciwgb2JqLnlpZWxkX3RvX2Jyb2tlcikKKworICAgIGRlZiB0ZXN0X2Jyb2tl
cmNsaWVudGludGVyZmFjZV9pc19hYnN0cmFjdChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQg
d2UgY2FuJ3QgY3JlYXRlIGFuIGluc3RhbmNlIGRpcmVjdGx5LgorICAgICAgICBzZWxmLmFzc2Vy
dFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgbWVzc2FnZV9icm9rZXIu
Q2xpZW50SW50ZXJmYWNlLAorICAgICAgICAgICAgYnJva2VyX2Nvbm5lY3Rpb249Tm9uZSwgd29y
a2VyX251bWJlcj1Ob25lKQorCisgICAgICAgIGNsYXNzIFdvcmtlckNsaWVudChtZXNzYWdlX2Jy
b2tlci5DbGllbnRJbnRlcmZhY2UpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICpv
cHRhcmdzKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBUZXN0IHRoYXQgYWxs
IHRoZSBiYXNlIGNsYXNzIG1ldGhvZHMgYXJlIGFic3RyYWN0IGFuZCBoYXZlIHRoZQorICAgICAg
ICAjIHNpZ25hdHVyZSB3ZSBleHBlY3QuCisgICAgICAgIG9iaiA9IFdvcmtlckNsaWVudCgpCisg
ICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5jYW5jZWwp
CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5uYW1l
KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmouaXNf
ZG9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2Jq
LnJ1bikKKworICAgIGRlZiB0ZXN0X2xvZ193ZWRnZWRfd29ya2VyKHNlbGYpOgorICAgICAgICBi
cm9rZXIgPSBtZXNzYWdlX2Jyb2tlci5fV29ya2VyTWVzc2FnZUJyb2tlcihOb25lLCBOb25lLCBO
b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVy
cm9yLCBicm9rZXIubG9nX3dlZGdlZF93b3JrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAg
IE5vbmUsIE5vbmUpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVz
dC5tYWluKCkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75670</attachid>
            <date>2010-12-06 04:14:24 -0800</date>
            <delta_ts>2010-12-06 05:31:39 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50557-20101206041423.patch</filename>
            <type>text/plain</type>
            <size>39929</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAyZGU1OWU3YWQwMTkwZWQ3YjM0YzhkZjVkNjRlMzBlYmY3MWYxNjQ5Li41NTc0YTIz
ZWE1NWI5MDkzM2U2ZTg4OWQ0Zjc4OTA3MWQ4MWU0NDJiIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMTAtMTItMDYgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBjaGFuZ2UgYWRk
cyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlX2Jyb2tlciBwYWNrYWdlCisgICAgICAgIHRo
YXQgYWN0dWFsbHkgZG9lcyBtZXNzYWdpbmcuIFRvIHNpbXBsaWZ5IHJldmlld2luZyB0aGUgbmV4
dAorICAgICAgICBjb3VwbGUgcGF0Y2hlcywgdGhpcyBpcyBiZWluZyBhZGRlZCBhcyBhIHNlcGFy
YXRlIGZpbGUgZm9yIG5vdy4KKyAgICAgICAgVWx0aW1hdGVseSBtZXNzYWdlX2Jyb2tlci5weSB3
aWxsIGJlIHJlbW92ZWQgYW5kIHRoaXMgZmlsZSB3aWxsCisgICAgICAgIGJlIHJlbmFtZWQuCisK
KyAgICAgICAgVGhpcyBwYXRjaCBkZXBlbmRzIG9uIGJ1ZyA1MDM3NC4KKworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTA1NTcKKworICAgICAgICAqIFNj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21lc3NhZ2VfYnJva2Vy
Mi5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5
b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9rZXIyX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKwogMjAxMC0x
Mi0wMiAgRGlyayBQcmFua2UgIDxkcHJhbmtlQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBUb255IENoYW5nLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9rZXIyLnB5IGIvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWVz
c2FnZV9icm9rZXIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjk2YzMxZjExZjEwMzYwOGQ0ODFjMGYwMmJjMWUz
OGJjYmViZmVjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tZXNzYWdlX2Jyb2tlcjIucHkKQEAgLTAs
MCArMSw2NDggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMg
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBk
aXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisj
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisj
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJNb2R1bGUgZm9yIGhhbmRsaW5nIG1l
c3NhZ2VzIGFuZCBjb25jdXJyZW5jeSBmb3IgcnVuLXdlYmtpdC10ZXN0cy4KKworVGVzdGluZyBp
cyBhY2NvbXBsaXNoZWQgYnkgaGF2aW5nIGEgbWFuYWdlciAoVGVzdFJ1bm5lcikgZ2F0aGVyIGFs
bCBvZiB0aGUKK3Rlc3RzIHRvIGJlIHJ1biwgYW5kIHNlbmRpbmcgbWVzc2FnZXMgdG8gYSBwb29s
IG9mIHdvcmtlcnMgKFRlc3RTaGVsbFRocmVhZHMpCit0byBydW4gZWFjaCB0ZXN0LiBFYWNoIHdv
cmtlciBjb21tdW5pY2F0ZXMgd2l0aCBvbmUgZHJpdmVyICh1c3VhbGx5CitEdW1wUmVuZGVyVHJl
ZSkgdG8gcnVuIG9uZSB0ZXN0IGF0IGEgdGltZSBhbmQgdGhlbiBjb21wYXJlIHRoZSBvdXRwdXQg
YWdhaW5zdAord2hhdCB3ZSBleHBlY3RlZCB0byBnZXQuCisKK1RoaXMgbW9kdWxlcyBpbXBsZW1l
bnRzIGEgbWVzc2FnZSBicm9rZXIgdGhhdCBjb25uZWN0cyB0aGUgbWFuYWdlciB0byB0aGUKK3dv
cmtlcnM6IGl0IHByb3ZpZGVzIGEgbWVzc2FnaW5nIGFic3RyYWN0aW9uIGFuZCBtZXNzYWdlIGxv
b3BzLCBhbmQKK2hhbmRsZXMgbGF1bmNoaW5nIHRocmVhZHMgYW5kL29yIHByb2Nlc3NlcyBkZXBl
bmRpbmcgb24gdGhlIHJlcXVlc3RlZAorY29uZmlndXJhdGlvbi4KKworQm90aCBNYW5hZ2VycyBh
bmQgV29ya2VycyBhcmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoZSBtZXRob2RzIGluIHRoZQor
QnJva2VyQ2xpZW50IGludGVyZmFjZSAvIGFic3RyYWN0IGJhc2UgY2xhc3MgaW4gb3JkZXIgdG8g
dGhlIG1lc3NhZ2UKK2Jyb2tlciB0byBwcm9wZXJseSBjb21tdW5pY2F0ZSB3aXRoIHRoZW0uCisK
K0V2ZXJ5dGhpbmcgc3RhcnRzIGJ5IGNhbGxpbmcgZ2V0KCkgdG8gb2J0YWluIGFuIGluaXRpYWwg
cmVmZXJlbmNlIHRvIGEgYnJva2VyLgorVGhlIGJyb2tlciBpcyBtZWRpYXRlZCBieSBhIENvbm5l
Y3Rpb24gb2JqZWN0IHRoYXQgcHJvdmlkZXMgc29tZSBzeW50YWN0aWMKK3N1Z2FyIHRvIHJlcHJl
c2VudCB0aGUgTWFuYWdlciBhbmQgV29ya2VyIGVuZHBvaW50cy4gVHlwaWNhbGx5IHRoZQorbWFu
YWdlciB0aGVuIGNhbGxzIHN0YXJ0X3dvcmtlcigpIHJlcGVhdGVkbHkgdG8gbGF1bmNoIHdvcmtl
cnMgKHdoaWNoIGFyZQordXN1YWxseSBydW4gaW4gc2VwYXJhdGUgdGhyZWFkcyBvciBwcm9jZXNz
ZXMgYXMgY29udHJvbGxlZCBieSB0aGUKKy0td29ya2VyLW1vZGVsIHJ1bnRpbWUgZmxhZyksIG9w
dGlvbmFsbHkgc2V0cyB1cCBzb21lIHRpbWVycywgYW5kIHRoZW4KK2ludm9rZXMgcnVuX21lc3Nh
Z2VfbG9vcCgpLgorIiIiCisKKyMgRklYTUU6IFRoaXMgcGFja2FnZSBzaG91bGQgcHJvYmFibHkg
YXQgbGVhc3QgYmUgc3BsaXQgaW50byB0d28gc2VwYXJhdGUKKyMgY2xhc3NlcyB0byBzZXBhcmF0
ZSBvdXQgdGhlICJ3b3JrZXIgcG9vbCIgY29uY2VwdCBhbmQgdGhlIGFjdHVhbAorIyBtZXNzYWdl
IGJyb2tlciBsb2dpYywgd2hpY2ggZG9lc24ndCByZWFsbHkgY2FyZSBob3cgdGhlIHdvcmtlcnMg
YXJlCisjIGltcGxlbWVudGVkLgorCitpbXBvcnQgY1BpY2tsZQoraW1wb3J0IGxvZ2dpbmcKK2lt
cG9ydCBvcHRwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgUXVldWUKK2ltcG9ydCBzeXMKK2ltcG9y
dCB0aHJlYWQKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNr
CisKK19sb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworIworIyBUb3BpYyBuYW1l
cyBmb3IgdGhlIG1lc3NhZ2UgcXVldWVzLgorIworTUFOQUdFUl9UT1BJQyA9ICdtYW5hZ2VyJwor
QU5ZX1dPUktFUl9UT1BJQyA9ICd3b3JrZXInCisKKworZGVmIHJ1bnRpbWVfb3B0aW9ucygpOgor
ICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygb3B0cGFyc2UuT3B0aW9uIG9iamVjdHMgZm9yIGFueSBy
dW50aW1lIHZhbHVlcyB1c2VkCisgICAgYnkgdGhpcyBtZXRob2QuIiIiCisgICAgb3B0aW9ucyA9
IFsKKyAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0td29ya2VyLW1vZGVsIiwgYWN0aW9u
PSJzdG9yZSIsCisgICAgICAgICAgICBoZWxwPSgiY29udHJvbHMgd29ya2VyIG1vZGVsLiBWYWxp
ZCB2YWx1ZXMgYXJlICIKKyAgICAgICAgICAgICInaW5saW5lJyBhbmQgJ3RocmVhZHMnLiIpKSwK
KyAgICBdCisgICAgcmV0dXJuIG9wdGlvbnMKKworCitkZWYgZ2V0KHBvcnQsIG9wdGlvbnMsIG1h
bmFnZXIsIHdvcmtlcl9jbGFzcyk6CisgICAgIiIiUmV0dXJuIGEgY29ubmVjdGlvbiB0byBhIG1h
bmFnZXIvd29ya2VyIG1lc3NhZ2UgYnJva2VyCisKKyAgICBBcmdzOgorICAgICAgICBwb3J0IC0g
aGFuZGxlIHRvIGxheW91dF90ZXN0cy9wb3J0IG9iamVjdCBmb3IgcG9ydC1zcGVjaWZpYyBzdHVm
ZgorICAgICAgICBvcHRpb25zIC0gb3B0cGFyc2UgYXJndW1lbnQgZm9yIGNvbW1hbmQtbGluZSBv
cHRpb25zCisgICAgICAgIG1hbmFnZXIgLSBvYmplY3QgdG8gZGlzcGF0Y2ggcmVwbGllcyB0bwor
ICAgICAgICB3b3JrZXJfY2xhc3MgLSB0eXBlIG9mIHdvcmtlcnMgdG8gY3JlYXRlLiBUaGlzIGNs
YXNzIG11c3QgaW1wbGVtZW50CisgICAgICAgICAgICB0aGUgbWV0aG9kcyBpbiB0aGUgQnJva2Vy
Q2xpZW50SW50ZXJmYWNlLgorICAgIFJldHVybnM6CisgICAgICAgIEEgaGFuZGxlIHRvIGFuIG9i
amVjdCB0aGF0IHdpbGwgdGFsayB0byBhIG1lc3NhZ2UgYnJva2VyIGNvbmZpZ3VyZWQKKyAgICAg
ICAgZm9yIHRoZSBub3JtYWwgbWFuYWdlci93b3JrZXIgY29tbXVuaWNhdGlvbi4KKyAgICAiIiIK
KyAgICBicm9rZXIgPSBfZ2V0X2Jyb2tlcihwb3J0LCBvcHRpb25zLCBtYW5hZ2VyLCB3b3JrZXJf
Y2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZX1dPUktFUl9UT1BJQywgTUFOQUdF
Ul9UT1BJQykKKyAgICByZXR1cm4gX01hbmFnZXJDb25uZWN0aW9uKGJyb2tlciwgbWFuYWdlcikK
KworCitjbGFzcyBDbGllbnRJbnRlcmZhY2Uob2JqZWN0KToKKyAgICAiIiJBYnN0cmFjdCBiYXNl
IGNsYXNzIC8gaW50ZXJmYWNlIHRoYXQgYWxsIG1lc3NhZ2UgYnJva2VyIGNsaWVudHMgbXVzdAor
ICAgIGltcGxlbWVudC4gSW4gYWRkaXRpb24gdG8gdGhlIG1ldGhvZHMgYmVsb3csIGJ5IGNvbnZl
bnRpb24gY2xpZW50cworICAgIGltcGxlbWVudCByb3V0aW5lcyBvZiB0aGUgc2lnbmF0dXJlIHR5
cGUKKworICAgICAgICBoYW5kbGVfTUVTU0FHRV9OQU1FKHNlbGYsIHNyYywgLi4uKToKKworICAg
IHdoZXJlIE1FU1NBR0VfTkFNRSBtYXRjaGVzIHRoZSBzdHJpbmcgcGFzc2VkIHRvIHBvc3RfbWVz
c2FnZSgpLCBhbmQKKyAgICBzcmMgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZSBzZW5kZXIuIElm
IHRoZSBtZXNzYWdlIGNvbnRhaW5zIHZhbHVlcyBpbgorICAgIHRoZSBtZXNzYWdlIGJvZHksIHRo
b3NlIHdpbGwgYmUgcHJvdmlkZWQgYXMgb3B0cGFyYW1zLiIiIgorCisgICAgZGVmIF9faW5pdF9f
KHNlbGYsIGJyb2tlcl9jb25uZWN0aW9uLCB3b3JrZXJfbnVtYmVyKToKKyAgICAgICAgcmFpc2Ug
Tm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGNhbmNlbChzZWxmKToKKyAgICAgICAgIiIi
Q2FsbGVkIChpZiBwb3NzaWJsZSkgdG8gbm90aWZ5IHRoZSB3b3JrZXIgdGhhdCBpdCBoYXMgYmVl
biBhYm9ydGVkLgorCisgICAgICAgIE9ubHkgd29ya2VycyBuZWVkIGltcGxlbWVudCB0aGlzIG1l
dGhvZC4gV29ya2VycyBjYW5ub3QgcmVseSBvbiB0aGlzCisgICAgICAgIG1ldGhvZCBhbHdheXMg
YmVpbmcgY2FsbGVkLiBGb3IgZXhhbXBsZSwgd29ya2VycyBydW5uaW5nIGluIHRoZWlyCisgICAg
ICAgIG93biBwcm9jZXNzZXMgbWF5IGJlIGtpbGxlZCBkaXJlY3RseSBpbnN0ZWFkIG9mIGludm9r
aW5nIHRoaXMgbWV0aG9kCisgICAgICAgIGFuZCB3YWl0aW5nIGZvciB0aGUgdGhlIHdvcmtlciB0
byBleGl0LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYg
aXNfZG9uZShzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVkIGZyb20gaW5zaWRlIHJ1bl9tZXNzYWdl
X2xvb3AoKSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGV4aXQuIiIiCisgICAgICAgIHJhaXNlIE5v
dEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1
cm4gYSBuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgd29ya2VyIG9yIG1hbmFnZXIuIiIiCisgICAg
ICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBydW4oc2VsZik6CisgICAg
ICAgICIiIk9ubHkgd29ya2VycyBuZWVkIGltcGxlbWVudCB0aGlzIG1ldGhvZC4iIiIKKyAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKK2NsYXNzIF9NYW5hZ2VyQ29ubmVjdGlv
bihvYmplY3QpOgorICAgICIiIlRoaXMgY2xhc3MgaGFuZGxlcyBhIGNvbm5lY3Rpb24gdG8gYSBt
ZXNzYWdlIGJyb2tlciB0aGF0IGlzIHNldCB1cAorICAgIHRvIHNlbmQgbWVzc2FnZXMgdG8gYSBX
b3JrZXIgcXVldWUgYXMgYSBNYW5hZ2VyLiBJdCBpcyBwcm92aWRlZCBhcyBhCisgICAgY29udmVu
aWVuY2UgYW5kIHRvIGVuY2Fwc3VsYXRlIHRoZSBnZW5lcmljIG1lc3NhZ2UgYnJva2VyLiIiIgor
CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlciwgbWFuYWdlcik6CisgICAgICAgIHNlbGYu
X2Jyb2tlciA9IGJyb2tlcgorICAgICAgICBzZWxmLl9tYW5hZ2VyID0gbWFuYWdlcgorCisgICAg
ZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAjIFRoaXMgbWV0aG9kIGNhdXNl
cyBhbnkgbWV0aG9kIHdlIGRvbid0IGRpcmVjdGx5IGltcGxlbWVudAorICAgICAgICAjIHRvIHRo
ZSBicm9rZXIuCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX2Jyb2tlciwgbmFtZSkKKwor
ICAgIGRlZiBwb3N0X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9uYW1lLCAqbWVzc2FnZV9hcmdzKToK
KyAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2FnZShzZWxmLl9tYW5hZ2VyLm5hbWUoKSwg
QU5ZX1dPUktFUl9UT1BJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNz
YWdlX25hbWUsIG1lc3NhZ2VfYXJncykKKworICAgIGRlZiBhZGRfdGltZXIoc2VsZiwgY2FsbGJh
Y2ssIGRlbGF5X3NlY3MpOgorICAgICAgICBzZWxmLl9icm9rZXIuYWRkX3RpbWVyKE1BTkFHRVJf
VE9QSUMsIGNhbGxiYWNrLCBkZWxheV9zZWNzKQorCisgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Ao
c2VsZik6CisgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9sb29wKE1BTkFHRVJfVE9Q
SUMsIHNlbGYuX21hbmFnZXIpCisKKyAgICBkZWYgc3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9u
dW1iZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcih3b3JrZXJf
bnVtYmVyKQorCisKK2RlZiBfZ2V0X2Jyb2tlcihwb3J0LCBvcHRpb25zLCBtYW5hZ2VyLCB3b3Jr
ZXJfY2xhc3MsIHdvcmtlcl90b3BpYywKKyAgICAgICAgICAgICAgICB3b3JrZXJfcmVwbHlfdG9w
aWMpOgorICAgIHdvcmtlcl9tb2RlbCA9IG9wdGlvbnMud29ya2VyX21vZGVsCisgICAgYnJva2Vy
X3R5cGVzID0geworICAgICAgICAnaW5saW5lJzogX0lubGluZUJyb2tlciwKKyAgICAgICAgJ3Ro
cmVhZHMnOiBfTXVsdGlUaHJlYWRlZEJyb2tlciwKKyAgICB9CisgICAgdHJ5OgorICAgICAgICBi
cm9rZXJfY2xhc3MgPSBicm9rZXJfdHlwZXNbd29ya2VyX21vZGVsXQorICAgICAgICByZXR1cm4g
YnJva2VyX2NsYXNzKHBvcnQsIG9wdGlvbnMsIHdvcmtlcl9jbGFzcywgd29ya2VyX3RvcGljLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9yZXBseV90b3BpYykKKyAgICBleGNl
cHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Vuc3VwcG9ydGVkIHZhbHVl
IGZvciAtLXdvcmtlci1tb2RlbDogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jr
ZXJfbW9kZWwpCisKKworY2xhc3MgX01lc3NhZ2Uob2JqZWN0KToKKyAgICBAc3RhdGljbWV0aG9k
CisgICAgZGVmIGxvYWRzKHN0cik6CisgICAgICAgIG9iaiA9IGNQaWNrbGUubG9hZHMoc3RyKQor
ICAgICAgICBhc3NlcnQoaXNpbnN0YW5jZShvYmosIF9NZXNzYWdlKSkKKyAgICAgICAgcmV0dXJu
IG9iagorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNyYywgdG9waWNfbmFtZSwgbWVzc2FnZV9u
YW1lLCBtZXNzYWdlX2JvZHkpOgorICAgICAgICBzZWxmLnNyYyA9IHNyYworICAgICAgICBzZWxm
LnRvcGljX25hbWUgPSB0b3BpY19uYW1lCisgICAgICAgIHNlbGYubmFtZSA9IG1lc3NhZ2VfbmFt
ZQorICAgICAgICBzZWxmLmJvZHkgPSBtZXNzYWdlX2JvZHkKKworICAgIGRlZiBkdW1wcyhzZWxm
KToKKyAgICAgICAgcmV0dXJuIGNQaWNrbGUuZHVtcHMoc2VsZikKKworICAgIGRlZiBfX3JlcHJf
XyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgiX01lc3NhZ2UoZnJvbT0nJXMnLCB0b3BpY19uYW1l
PSclcycsIG1lc3NhZ2VfbmFtZT0nJXMnKSIgJQorICAgICAgICAgICAgICAgIChzZWxmLnNyYywg
c2VsZi50b3BpY19uYW1lLCBzZWxmLm5hbWUpKQorCisKK2NsYXNzIF9UaW1lcihvYmplY3QpOgor
ICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWxsYmFjaywgZGVsYXkpOgorICAgICAgICBzZWxmLmNh
bGxiYWNrID0gY2FsbGJhY2sKKyAgICAgICAgc2VsZi5kZWxheSA9IGRlbGF5CisgICAgICAgIHNl
bGYuZGVhZGxpbmUgPSB0aW1lLnRpbWUoKSArIGRlbGF5CisKKworY2xhc3MgX1RvcGljKG9iamVj
dCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHF1ZXVlKToKKyAgICAgICAgc2VsZi5xdWV1ZSA9
IHF1ZXVlCisgICAgICAgIHNlbGYudGltZXIgPSBOb25lCisKKworY2xhc3MgX1dvcmtlck1lc3Nh
Z2VCcm9rZXIob2JqZWN0KToKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIG1lc3Nh
Z2UgYnJva2VyIHR1bmVkIGZvciB0aGUgbGF5b3V0IHRlc3RzLgorCisgICAgVGhpcyBjbGFzcyBp
bXBsZW1lbnRzIGEgbW9zdGx5IGdlbmVyaWMgbWVzc2FnZSBicm9rZXIgd2l0aCBhIGZldyB0d2Vh
a3MKKyAgICB0dW5lZCBmb3IgbWFuYWdlci93b3JrZXItc3R5bGUgbWVzc2FnaW5nLiBUaGlzIGNs
YXNzIHNob3VsZCBub3QgYmUKKyAgICBpbnN0YW50aWF0ZWQgZGlyZWN0bHk7IGluc3RlYWQsIGl0
IHNob3VsZCBiZSBzdWJjbGFzc2VkIHRvIHByb3ZpZGUKKyAgICBpbXBsZW1lbnRhdGlvbnMgb2Yg
YSBXb3JrZXJDb25uZWN0aW9uSW50ZXJmYWNlIG9iamVjdCBmb3IKKyAgICBfV09SS0VSX0NPTk5F
Q1RJT05fQ0xBU1MuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydCwgb3B0aW9ucywg
d29ya2VyX2NsYXNzLCB3b3JrZXJfcnVuX3RvcGljLAorICAgICAgICAgICAgICAgICB3b3JrZXJf
cmVwbHlfdG9waWMpOgorICAgICAgICAiIiJSZXR1cm4gYSBtZXNzYWdlIGJyb2tlciBmb3IgbWFu
YWdlci93b3JrZXIgY29tbXVuaWNhdGlvbi4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAg
cG9ydDogaGFuZGxlIHRvIHBvcnQtc3BlY2lmaWMgbG9naWMKKyAgICAgICAgICAgIG9wdGlvbnM6
IGEgcnVudGltZSBvcHRpb24gY2xhc3MgZnJvbSBvcHRwYXJzZQorICAgICAgICAgICAgd29ya2Vy
X2NsYXNzOiBUaGUgdHlwZSBvZiB3b3JrZXIgb2JqZWN0cyB0byBpbnN0YW50aWF0ZQorICAgICAg
ICAgICAgd29ya2VyX3J1bl90b3BpYzogVGhlIHRvcGljIG5hbWUgd29ya2VycyBzaG91bGQgbGlz
dGVuIGZvcgorICAgICAgICAgICAgd29ya2VyX3JlcGx5X3RvcGljOiBUaGUgdG9waWMgbmFtZSB3
b3JrZXJzIHNob3VsZCBwb3N0IHJlcGxpZXMgdG8KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYu
X3BvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIHNl
bGYuX3dvcmtlcl9jbGFzcyA9IHdvcmtlcl9jbGFzcworICAgICAgICBzZWxmLl93b3JrZXJfcnVu
X3RvcGljID0gd29ya2VyX3J1bl90b3BpYworICAgICAgICBzZWxmLl93b3JrZXJfcmVwbHlfdG9w
aWMgPSB3b3JrZXJfcmVwbHlfdG9waWMKKworICAgICAgICBzZWxmLl90b3BpY3MgPSB7fQorICAg
ICAgICBzZWxmLl9jaGlsZHJlbiA9IHt9CisgICAgICAgIHNlbGYuYWRkX3RvcGljKHdvcmtlcl9y
dW5fdG9waWMpCisgICAgICAgIHNlbGYuYWRkX3RvcGljKHdvcmtlcl9yZXBseV90b3BpYykKKwor
ICAgIGRlZiBhZGRfdG9waWMoc2VsZiwgdG9waWNfbmFtZSk6CisgICAgICAgIGlmIHRvcGljX25h
bWUgbm90IGluIHNlbGYuX3RvcGljczoKKyAgICAgICAgICAgIHNlbGYuX3RvcGljc1t0b3BpY19u
YW1lXSA9IF9Ub3BpYyhRdWV1ZS5RdWV1ZSgpKQorCisgICAgZGVmIF9maW5kX3RvcGljKHNlbGYs
IHRvcGljX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fdG9waWNzW3RvcGljX25hbWVdCisK
KyAgICAjIEFsbCBXb3JrZXJNZXNzYWdlQnJva2VyIGltcGxlbWVudGF0aW9ucyBtdXN0IHByb3Zp
ZGUgY29ubmVjdGlvbiBjbGFzcworICAgICMgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNl
IGluIG9yZGVyIHRvIG1hbmFnZSBtdWx0aXBsZSB3b3JrZXJzCisgICAgIyBjb3JyZWN0bHkuCisg
ICAgY2xhc3MgX1dvcmtlckNvbm5lY3Rpb25JbnRlcmZhY2Uob2JqZWN0KToKKyAgICAgICAgZGVm
IF9faW5pdF9fKHNlbGYsIGJyb2tlciwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKToKKyAg
ICAgICAgICAgICIiIlJldHVybiBhIHdvcmtlciBvYmplY3QuCisKKyAgICAgICAgICAgIEFyZ3Mg
bWlycm9yIFdvcmtlck1lc3NhZ2VCcm9rZXIsIEJyb2tlckNsaWVudEludGVyZmFjZSwgYW5kCisg
ICAgICAgICAgICBzdGFydF93b3JrZXIoKTogQ2FsbGVkIG9uIHRoZSBtYW5hZ2VyIHNpZGUgb2Yg
dGhlIG1lc3NhZ2UgYnJva2VyLiIiIgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRF
cnJvcgorCisgICAgICAgIGRlZiBjYW5jZWwoc2VsZik6CisgICAgICAgICAgICAiIiJCZXN0LWVm
Zm9ydCBhdHRlbXB0IHRvIG5vdGlmeSB0aGUgd29ya2VyIGl0IGhhcyBiZWVuIGNhbmNlbGxlZC4K
KworICAgICAgICAgICAgQ2FsbGVkIG9uIHRoZSBtYW5hZ2VyIHNpZGUgb2YgdGhlIGJyb2tlciwg
dGhpcyBzaG91bGQgYmUgYQorICAgICAgICAgICAgcGFzcy10aHJvdWdoIHRvIHRoZSB3b3JrZXIg
d2hlcmUgcG9zc2libGUuIiIiCisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9y
CisKKyAgICAgICAgIyBGSVhNRTogY2hhbmdlIHRoaXMgdG8gaXNfYWxpdmUgd2hlbiB3ZSdyZSBv
biAyLjYgb3IgbmV3ZXIgZXZlcnl3aGVyZS4KKyAgICAgICAgZGVmIGlzQWxpdmUoc2VsZik6Cisg
ICAgICAgICAgICAiIiIiUmV0dXJuIHdoZXRoZXIgdGhlIHdvcmtlciBpcyBzdGlsbCBydW5uaW5n
LgorCisgICAgICAgICAgICBVc2VkIG9ubHkgb24gdGhlIG1hbmFnZXIgc2lkZSBvZiB0aGUgYnJv
a2VyLiIiIgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAg
IGRlZiBqb2luKHNlbGYsIHRpbWVvdXQpOgorICAgICAgICAgICAgIiIiQmxvY2sgdGltZW91dCBz
ZWNvbmRzIG9yIHVudGlsIHRoZSB3b3JrZXIgaGFzIGV4aXRlZC4KKworICAgICAgICAgICAgQ2Fs
bGVkIG9ubHkgb24gdGhlIG1hbmFnZXIgc2lkZSBvZiB0aGUgYnJva2VyLiIiIgorICAgICAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAgIGRlZiBuYW1lKHNlbGYpOgor
ICAgICAgICAgICAgIiIiUmV0dXJucyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgd29ya2VyIGlu
IHF1ZXN0aW9uLgorCisgICAgICAgICAgICBDYWxsZWQgb24gYm90aCB0aGUgbWFuYWdlciBhbmQg
d29ya2VyIHNpZGVzIG9mIHRoZSBicm9rZXIsIHRoaXMKKyAgICAgICAgICAgIHNob3VsZCBiZSBh
IHBhc3MtdGhyb3VnaCB0byB0aGUgd29ya2VyIGNsaWVudCB3aGVyZSBwb3NzaWJsZS4iIiIKKyAg
ICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgICAgICBkZWYgb3B0aW9u
cyhzZWxmKToKKyAgICAgICAgICAgICIiIlJldHVybiB0aGUgb3B0aW9ucyBvYmplY3QgcGFzc2Vk
IHRvIGdldCgpLgorCisgICAgICAgICAgICBDYWxsZWQgb25seSBieSB0aGUgd29ya2VyLiIiIgor
ICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAgIGRlZiBwb3J0
KHNlbGYpOgorICAgICAgICAgICAgIiIiUmV0dXJuIHRoZSBwb3J0IG9iamVjdCBwYXNzZWQgdG8g
Z2V0KCkuCisKKyAgICAgICAgICAgIENhbGxlZCBvbmx5IGJ5IHRoZSB3b3JrZXIuIiIiCisgICAg
ICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICAgICAgZGVmIHBvc3RfbWVz
c2FnZShzZWxmLCBtZXNzYWdlX25hbWUsICptZXNzYWdlX2FyZ3MpOgorICAgICAgICAgICAgIiIi
UG9zdCBhIG1lc3NhZ2UgdG8gdGhlIHdvcmtlcl9yZXBseV9xdWV1ZS4KKworICAgICAgICAgICAg
VGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB3b3JrZXIuIiIiCisgICAgICAgICAgICByYWlz
ZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAg
ICAgICIiIkludm9rZSB0aGUgd29ya2VyJ3MgbWFpbiBlbnRyeSBwb2ludC4KKworICAgICAgICAg
ICAgQ2FsbGVkIG9uIHRoZSB3b3JrZXIgc2lkZSBvZiB0aGUgYnJva2VyLCB0aGlzIGlzIHVzdWFs
bHkgYQorICAgICAgICAgICAgd3JhcHBlciBhcm91bmQgdGhlIHdvcmtlciBjbGllbnQncyBydW4o
KSBtZXRob2QuIiIiCisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAg
ICAgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Aoc2VsZik6CisgICAgICAgICAgICAiIiJSdW4gdGhl
IHdvcmtlcidzIG1lc3NhZ2UvdGltZXIgbG9vcC4KKworICAgICAgICAgICAgVGhpcyBtZXRob2Qg
aXMgY2FsbGVkIGJ5IHRoZSB3b3JrZXIuIiIiCisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1l
bnRlZEVycm9yCisKKyAgICAgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICAgICAgIiIiU3Rh
cnQgdGhlIHdvcmtlciBydW5uaW5nLCBpZiBwb3NzaWJsZS4gRG8gbm90IGJsb2NrIHRoZSBjYWxs
ZXIuIiIiCisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICAgICAg
ZGVmIHlpZWxkX3RvX2Jyb2tlcihzZWxmKToKKyAgICAgICAgICAgICIiIiJDYXVzZXMgdGhlIHdv
cmtlciB0byB5aWVsZCBjb250cm9sIGZsb3cgYmFjayB0byB0aGUgYnJva2VyLgorCisgICAgICAg
ICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgcmVzcG9uc2l2ZW5lc3MgaWYgdGhlIHdv
cmtlciBpcworICAgICAgICAgICAgcHJvY2Vzc2luZyBzbG93IG1lc3NhZ2VzIChmb3IgZXhhbXBs
ZSwgJ3Rlc3RfbGlzdCcpIGFuZCB0aGVyZQorICAgICAgICAgICAgaXMgb25seSBvbmUgdGhyZWFk
IChpLmUuLCBpbmxpbmUgbW9kZSkgaW4gdGhlIG1lc3NhZ2UgYnJva2VyLiIiIgorICAgICAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgIyBTdWJjbGFzc2VzIG11c3Qgb3Zl
cnJpZGUgdGhpcyB2YWx1ZS4KKyAgICBfV09SS0VSX0NPTk5FQ1RJT05fQ0xBU1MgPSBfV29ya2Vy
Q29ubmVjdGlvbkludGVyZmFjZQorCisgICAgZGVmIHN0YXJ0X3dvcmtlcihzZWxmLCB3b3JrZXJf
bnVtYmVyKToKKyAgICAgICAgIiIiU3RhcnQgYSB3b3JrZXIgd2l0aCB0aGUgZ2l2ZW4gaW5kZXgg
bnVtYmVyLCBhbmQgcmV0dXJuIGl0cyBuYW1lLiIiIgorICAgICAgICB3b3JrZXIgPSBzZWxmLl9X
T1JLRVJfQ09OTkVDVElPTl9DTEFTUyhzZWxmLCBzZWxmLl93b3JrZXJfY2xhc3MsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9udW1iZXIpCisg
ICAgICAgIG5hbWUgPSB3b3JrZXIubmFtZSgpCisgICAgICAgIHdvcmtlci5zdGFydCgpCisgICAg
ICAgIHNlbGYuX2NoaWxkcmVuW25hbWVdID0gd29ya2VyCisgICAgICAgIHJldHVybiBuYW1lCisK
KyAgICBkZWYgY2FuY2VsX3dvcmtlcihzZWxmLCB3b3JrZXJfbmFtZSk6CisgICAgICAgICIiIkF0
dGVtcHQgdG8gY2FuY2VsIGEgd29ya2VyIChiZXN0LWVmZm9ydCkuIFRoZSB3b3JrZXIgbWF5IHN0
aWxsIGJlCisgICAgICAgIHJ1bm5pbmcgYWZ0ZXIgdGhpcyBjYWxsIHJldHVybnMuIiIiCisgICAg
ICAgIHJldHVybiBzZWxmLl9jaGlsZHJlblt3b3JrZXJfbmFtZV0uY2FuY2VsKCkKKworICAgIGRl
ZiBqb2luX3dvcmtlcihzZWxmLCB3b3JrZXJfbmFtZSwgdGltZW91dCk6CisgICAgICAgICIiIldh
aXQgdW50aWwgd29ya2VyIGV4aXRzIG9yIHRpbWVvdXQgb2NjdXJzLiIiIgorICAgICAgICByZXR1
cm4gc2VsZi5fY2hpbGRyZW5bd29ya2VyX25hbWVdLmpvaW4odGltZW91dCkKKworICAgIGRlZiB3
b3JrZXJfaXNfYWxpdmUoc2VsZiwgd29ya2VyX25hbWUpOgorICAgICAgICAiIiJSZXR1cm4gd2hl
dGhlciB0aGUgd29ya2VyIGlzIHN0aWxsIHJ1bm5pbmcuIiIiCisgICAgICAgIHJldHVybiBzZWxm
Ll9jaGlsZHJlblt3b3JrZXJfbmFtZV0uaXNBbGl2ZSgpCisKKyAgICBkZWYgbG9nX3dlZGdlZF93
b3JrZXIoc2VsZiwgd29ya2VyX25hbWUsIHRlc3RfbmFtZSk6CisgICAgICAgICIiIkxvZyBpbmZv
cm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gd29ya2VyJ3Mgc3RhdGUuIiIiCisgICAgICAgIHJhaXNl
IE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBhZGRfdGltZXIoc2VsZiwgdG9waWNfbmFt
ZSwgY2FsbGJhY2ssIGRlbGF5X3NlY3MpOgorICAgICAgICAiIiJBZGQgYSB0aW1lciB0aGF0IHdp
bGwgZmlyZSBsYXRlciBkdXJpbmcgZHJhaW4oKSBvciBsb29wKCkuCisKKyAgICAgICAgVGltZXIg
Y2FsbGJhY2tzIHRha2Ugbm8gYXJndW1lbnRzLCBhbmQgc2hvdWxkIHJldHVybiBUcnVlIGlmZgor
ICAgICAgICBsb29wKCkgc2hvdWxkIGV4aXQuIEN1cnJlbnRseSB0aGUgY29kZSBvbmx5IHN1cHBv
cnRzIG9uZQorICAgICAgICB0aW1lciBwZXIgdG9waWMsIGJ1dCwgaW4gb3JkZXIgdG8gc3VwcG9y
dCBwZXJpb2RpYyBldmVudHMsCisgICAgICAgIGEgdGltZXIgY2FuIGJlIGFkZGVkIGZyb20gaW5z
aWRlIHRoZSBjYWxsIGJhY2suIiIiCisgICAgICAgIHRvcGljID0gc2VsZi5fZmluZF90b3BpYyh0
b3BpY19uYW1lKQorICAgICAgICBhc3NlcnQodG9waWMudGltZXIgaXMgTm9uZSkKKyAgICAgICAg
dG9waWMudGltZXIgPSBfVGltZXIoY2FsbGJhY2ssIGRlbGF5X3NlY3MpCisKKyAgICBkZWYgcG9z
dF9tZXNzYWdlKHNlbGYsIHNyYywgdG9waWNfbmFtZSwgbWVzc2FnZV9uYW1lLCBib2R5PU5vbmUp
OgorICAgICAgICAiIiJQb3N0IGEgbWVzc2FnZSB0byB0aGUgYXBwcm9wcmlhdGUgdG9waWMgcXVl
dWUuIiIiCisgICAgICAgIGJvZHkgPSBib2R5IG9yIHR1cGxlKCkKKyAgICAgICAgbWVzc2FnZSA9
IF9NZXNzYWdlKHNyYywgdG9waWNfbmFtZSwgbWVzc2FnZV9uYW1lLCBib2R5KQorICAgICAgICB0
b3BpYyA9IHNlbGYuX2ZpbmRfdG9waWModG9waWNfbmFtZSkKKyAgICAgICAgdG9waWMucXVldWUu
cHV0KF9NZXNzYWdlLmR1bXBzKG1lc3NhZ2UpKQorCisgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Ao
c2VsZiwgdG9waWNfbmFtZSwgcmVhZGVyKToKKyAgICAgICAgIiIiTG9vcCBwcm9jZXNzaW5nIG1l
c3NhZ2VzIGFuZCB0aW1lcnMgdW50aWwgZG9uZS4KKworICAgICAgICAiZG9uZSIgbWVhbnMgdGhh
dCByZWFkZXIuaXNfZG9uZSgpIHJldHVybnMgVHJ1ZSBvciBhIHRpbWVyIGluZGljYXRlcworICAg
ICAgICB0aGF0IHdlJ3JlIGRvbmUuIiIiCisgICAgICAgIHRvcGljID0gc2VsZi5fZmluZF90b3Bp
Yyh0b3BpY19uYW1lKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgIyBIZXJlIHdl
IGRvbid0IGNhcmUgaWYgd2UgZG8gd29yayBpbiB0aGUgdGltZXIuCisgICAgICAgICAgICBub3cg
PSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgXywgZG9uZSA9IHNlbGYuX2NoZWNrX3RpbWVyKHRv
cGljLCBub3cpCisgICAgICAgICAgICBpZiBkb25lIG9yIHJlYWRlci5pc19kb25lKCk6CisgICAg
ICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgUmUtY2hlY2sgdGhlIHRpbWUsIGlu
IGNhc2UgdGhlIHRpbWVyIGhhZCBhIHNsb3cgY2FsbGJhY2suCisgICAgICAgICAgICBub3cgPSB0
aW1lLnRpbWUoKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3RpbWVyX2V4cGlyZWQodG9waWMs
IG5vdyk6CisgICAgICAgICAgICAgICAgZGVsYXkgPSBzZWxmLl90aW1lcl9kZWxheSh0b3BpYywg
bm93KQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcyA9IHRvcGlj
LnF1ZXVlLmdldChibG9jaz1UcnVlLCB0aW1lb3V0PWRlbGF5KQorICAgICAgICAgICAgICAgICAg
ICBtc2cgPSBfTWVzc2FnZS5sb2FkcyhzKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kaXNw
YXRjaF9tZXNzYWdlKG1zZywgcmVhZGVyKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5F
bXB0eToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGRyYWluKHNlbGYsIHRv
cGljX25hbWUsIHJlYWRlcik6CisgICAgICAgICIiIkxvb3AgdW50aWwgd2UgcnVuIG91dCBvZiBz
dHVmZiB0byBkbyB3L28gYmxvY2tpbmcuCisKKyAgICAgICAgVGhpcyBtZWFucyB0aGVyZSBhcmUg
bm8gbWVzc2FnZXMgdG8gcHJvY2VzcyBhbmQgbm8gdGltZXJzIGFyZSBmaXJpbmcKKyAgICAgICAg
dGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCisgICAgICAgIFJldHVy
bnMgd2hldGhlciBvciBub3Qgd2UgZGlkIGFueXRoaW5nIGF0IGFsbC4iIiIKKyAgICAgICAgdG9w
aWMgPSBzZWxmLl9maW5kX3RvcGljKHRvcGljX25hbWUpCisgICAgICAgIGRpZF93b3JrX29uX3Ro
aXNfcnVuID0gVHJ1ZQorICAgICAgICBkb25lID0gcmVhZGVyLmlzX2RvbmUoKQorICAgICAgICB3
aGlsZSBkaWRfd29ya19vbl90aGlzX3J1biBhbmQgbm90IGRvbmU6CisgICAgICAgICAgICBkaWRf
d29ya19vbl90aGlzX3J1biwgZG9uZSA9IHNlbGYuX2NoZWNrX3RpbWVyKHRvcGljLCB0aW1lLnRp
bWUoKSkKKyAgICAgICAgICAgIGRvbmUgPSBkb25lIG9yIHJlYWRlci5pc19kb25lKCkKKyAgICAg
ICAgICAgIGlmIGRvbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgdHJ5
OgorICAgICAgICAgICAgICAgIHMgPSB0b3BpYy5xdWV1ZS5nZXQoYmxvY2s9RmFsc2UpCisgICAg
ICAgICAgICAgICAgbXNnID0gX01lc3NhZ2UubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxm
Ll9kaXNwYXRjaF9tZXNzYWdlKG1zZywgcmVhZGVyKQorICAgICAgICAgICAgICAgIGRpZF93b3Jr
X29uX3RoaXNfcnVuID0gVHJ1ZQorICAgICAgICAgICAgICAgIGRvbmUgPSByZWFkZXIuaXNfZG9u
ZSgpCisgICAgICAgICAgICBleGNlcHQgUXVldWUuRW1wdHk6CisgICAgICAgICAgICAgICAgcGFz
cworCisgICAgICAgIHJldHVybiBkb25lCisKKyAgICBkZWYgX2NoZWNrX3RpbWVyKHNlbGYsIHRv
cGljLCBub3cpOgorICAgICAgICAiIiJDaGVjayBpZiBhbnkgdGltZXJzIG5lZWQgdG8gZmlyZSwg
YW5kIGZpcmUgdGhlbS4KKworICAgICAgICBSZXR1cm5zIGEgdHVwbGUgb2YgKHdoZXRoZXIgYSB0
aW1lciBmaXJlZCwgd2hldGhlciBhIHRpbWVyCisgICAgICAgICAgICByZXR1cm5lZCBUcnVlIHRv
IGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIGJhaWwgb3V0IG9mIHRoZSBhCisgICAgICAgICAgICBt
ZXNzYWdlIGxvb3AgaWYgbmVjZXNzYXJ5KS4iIiIKKyAgICAgICAgaWYgc2VsZi5fdGltZXJfZXhw
aXJlZCh0b3BpYywgbm93KToKKyAgICAgICAgICAgIHQgPSB0b3BpYy50aW1lcgorICAgICAgICAg
ICAgdG9waWMudGltZXIgPSBOb25lCisgICAgICAgICAgICBkb25lID0gdC5jYWxsYmFjaygpCisg
ICAgICAgICAgICByZXR1cm4gVHJ1ZSwgZG9uZQorICAgICAgICByZXR1cm4gRmFsc2UsIEZhbHNl
CisKKyAgICBkZWYgX3RpbWVyX2RlbGF5KHNlbGYsIHRvcGljLCBub3cpOgorICAgICAgICAiIiIi
UmV0dXJuIHRoZSB0aW1lIChpbiBzZWNzKSBmcm9tICdub3cnIHVudGlsIHRoZSB0aW1lciBmaXJl
cy4KKworICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSBuZWdhdGl2ZSwgaW5kaWNhdGlu
ZyB0aGF0IHRoZSB0aW1lciBoYXMKKyAgICAgICAgZXhwaXJlZCwgb3IgTm9uZSwgdG8gaW5kaWNh
dGUgdGhhdCB0aGVyZSBpcyBubyB0aW1lciBvbiB0aGUgdG9waWMKKyAgICAgICAgKGRlbGF5IGZv
cmV2ZXIpLiIiIgorICAgICAgICB0ID0gdG9waWMudGltZXIKKyAgICAgICAgaWYgdDoKKyAgICAg
ICAgICAgIHJldHVybiB0LmRlYWRsaW5lIC0gbm93CisgICAgICAgIHJldHVybiBOb25lCisKKyAg
ICBkZWYgX3RpbWVyX2V4cGlyZWQoc2VsZiwgdG9waWMsIG5vdyk6CisgICAgICAgICIiIlJldHVy
biB3aGV0aGVyIHRoZSB0b3BpYyBoYXMgYSB0aW1lciB3aG9zZSBkZWFkbGluZSBoYXMgcGFzc2Vk
LiIiIgorICAgICAgICB0ID0gdG9waWMudGltZXIKKyAgICAgICAgcmV0dXJuICh0IGlzIG5vdCBO
b25lKSBhbmQgbm93ID49IHQuZGVhZGxpbmUKKworICAgIGRlZiBfZGlzcGF0Y2hfbWVzc2FnZShz
ZWxmLCBtZXNzYWdlLCByZWFkZXIpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihyZWFkZXIsICdo
YW5kbGVfJyArIG1lc3NhZ2UubmFtZSk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAor
ICAgICAgICAgICAgICAgIiVzOiByZWNlaXZlZCBtZXNzYWdlICclcycgaXQgY291bGRuJ3QgaGFu
ZGxlIiAlCisgICAgICAgICAgICAgICAocmVhZGVyLm5hbWUoKSwgbWVzc2FnZS5uYW1lKSkKKyAg
ICAgICAgb3B0YXJncyA9IG1lc3NhZ2UuYm9keQorICAgICAgICBmbiA9IGdldGF0dHIocmVhZGVy
LCAnaGFuZGxlXycgKyBtZXNzYWdlLm5hbWUpCisgICAgICAgIGZuKG1lc3NhZ2Uuc3JjLCAqb3B0
YXJncykKKworCitjbGFzcyBfSW5saW5lQnJva2VyKF9Xb3JrZXJNZXNzYWdlQnJva2VyKToKKyAg
ICBjbGFzcyBfSW5saW5lV29ya2VyQ29ubmVjdGlvbihvYmplY3QpOgorICAgICAgICBkZWYgX19p
bml0X18oc2VsZiwgYnJva2VyLCB3b3JrZXJfY2xhc3MsIHdvcmtlcl9udW1iZXIpOgorICAgICAg
ICAgICAgc2VsZi5fYnJva2VyID0gYnJva2VyCisgICAgICAgICAgICBzZWxmLl9wb3J0ID0gYnJv
a2VyLl9wb3J0CisgICAgICAgICAgICBzZWxmLl9vcHRpb25zID0gYnJva2VyLl9vcHRpb25zCisg
ICAgICAgICAgICBzZWxmLl93b3JrZXIgPSB3b3JrZXJfY2xhc3Moc2VsZiwgd29ya2VyX251bWJl
cikKKworICAgICAgICBkZWYgY2FuY2VsKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYu
X3dvcmtlci5jYW5jZWwoKQorCisgICAgICAgIGRlZiBpc0FsaXZlKHNlbGYpOgorICAgICAgICAg
ICAgcmV0dXJuIHNlbGYuX2Jyb2tlci5fbWFuYWdlcgorCisgICAgICAgIGRlZiBqb2luKHNlbGYs
IHRpbWVvdXQpOgorICAgICAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLmlzQWxpdmUoKQorCisgICAg
ICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3dvcmtlci5uYW1l
KCkKKworICAgICAgICBkZWYgb3B0aW9ucyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxm
Ll9icm9rZXIuX29wdGlvbnMKKworICAgICAgICBkZWYgcG9ydChzZWxmKToKKyAgICAgICAgICAg
IHJldHVybiBzZWxmLl9icm9rZXIuX3BvcnQKKworICAgICAgICBkZWYgcG9zdF9tZXNzYWdlKHNl
bGYsIG1lc3NhZ2VfbmFtZSwgKm1lc3NhZ2VfYXJncyk6CisgICAgICAgICAgICBzZWxmLl9icm9r
ZXIucG9zdF9tZXNzYWdlKHNlbGYubmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWxmLl9icm9rZXIuX3dvcmtlcl9yZXBseV90b3BpYywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9uYW1lLCBtZXNzYWdlX2FyZ3MpCisK
KyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX3dvcmtlci5ydW4oKQor
CisgICAgICAgIGRlZiBydW5fbWVzc2FnZV9sb29wKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5f
YnJva2VyLnJ1bl9tZXNzYWdlX2xvb3Aoc2VsZi5fYnJva2VyLl93b3JrZXJfcnVuX3RvcGljLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd29ya2VyKQor
CisgICAgICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBk
ZWYgeWllbGRfdG9fYnJva2VyKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fYnJva2VyLmRyYWlu
KHNlbGYuX2Jyb2tlci5fd29ya2VyX3JlcGx5X3RvcGljLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHNlbGYuX2Jyb2tlci5fbWFuYWdlcikKKworICAgIF9XT1JLRVJfQ09OTkVDVElP
Tl9DTEFTUyA9IF9JbmxpbmVXb3JrZXJDb25uZWN0aW9uCisKKyAgICBkZWYgX19pbml0X18oc2Vs
ZiwgcG9ydCwgb3B0aW9ucywgd29ya2VyX2NsYXNzLCB3b3JrZXJfcnVuX3RvcGljLAorICAgICAg
ICAgICAgICAgICB3b3JrZXJfcmVwbHlfdG9waWMpOgorICAgICAgICBfV29ya2VyTWVzc2FnZUJy
b2tlci5fX2luaXRfXyhzZWxmLCBwb3J0LCBvcHRpb25zLCB3b3JrZXJfY2xhc3MsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9ydW5fdG9waWMsIHdvcmtlcl9y
ZXBseV90b3BpYykKKworICAgICAgICAjIFRoZSBtYW5hZ2VyIGlzIG9ubHkgdmFsaWQgd2hlbiB0
aGUgaW5saW5lZCB3b3JrZXIgaXMgInJ1bm5pbmciLAorICAgICAgICAjIG1lYW5pbmcgdGhhdCB3
ZSBhcmUgc2VydmljaW5nIGl0cyBtZXNzYWdlIHF1ZXVlLiBXZSBuZWVkIHRoaXMKKyAgICAgICAg
IyB2YXJpYWJsZSBzbyB5aWVsZF90b19icm9rZXIoKSB3aWxsIHdvcmsgcHJvcGVybHkuCisgICAg
ICAgIHNlbGYuX21hbmFnZXIgPSBOb25lCisKKyAgICBkZWYgbG9nX3dlZGdlZF93b3JrZXIoc2Vs
Ziwgd29ya2VyX25hbWUsIHRlc3RfbmFtZSk6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9y
KCJfSW5saW5lQnJva2VyLmxvZ193ZWRnZWRfd29ya2VyKCkgY2FsbGVkIikKKworICAgIGRlZiBy
dW5fbWVzc2FnZV9sb29wKHNlbGYsIHRvcGljX25hbWUsIHJlYWRlcik6CisgICAgICAgICMgV2Ug
bmVlZCBzcGVjaWFsIGxvZ2ljIGluIHRoZSBpbmxpbmUgY2FzZSBpbiBvcmRlciB0byBlbnN1cmUg
dGhhdAorICAgICAgICAjIHRoZSBtYW5hZ2VyIGFuZCB3b3JrZXJzIGFjdHVhbGx5IGJvdGggZ2V0
IHRvIHJ1biBwcm9wZXJseS4gVGhlcmUncworICAgICAgICAjIHByb2JhYmx5IGEgZmV3IHdheXMg
d2UgY291bGQgYWNjb21wbGlzaCB0aGlzLCBidXQgZm9yIG5vdyB3ZQorICAgICAgICAjIGhhdmUg
dGhlIG1hbmFnZXIgcnVuKCkgdGhlIHdvcmtlciBpbmxpbmUgdG8gY29tcGxldGlvbiwgYW5kIHRo
ZW4KKyAgICAgICAgIyBkcmFpbiBhbnkgcGVuZGluZyBldmVudHMgb24gdGhlIG1hbmFnZXIgdG9w
aWMuIFdlIGNvdW50IG9uIHRoZQorICAgICAgICAjIHdvcmtlciBjYWxsaW5nIHlpZWxkX3RvX2Jy
b2tlcigpIHBlcmlvZGljYWxseSBpbiBvcmRlciB0byBtYWtlCisgICAgICAgICMgc3VyZSB0aGUg
bWFuYWdlciBkb2Vzbid0IGdldCBzdGFydmVkLgorICAgICAgICBpZiB0b3BpY19uYW1lID09IHNl
bGYuX3dvcmtlcl9yZXBseV90b3BpYzoKKyAgICAgICAgICAgICMgTWFuYWdlci4gRG8gYXMganVz
dCBkZXNjcmliZWQuCisgICAgICAgICAgICBjaGlsZHJlbiA9IHNlbGYuX2NoaWxkcmVuLnZhbHVl
cygpCisgICAgICAgICAgICBpZiBjaGlsZHJlbjoKKyAgICAgICAgICAgICAgICBzZWxmLl9tYW5h
Z2VyID0gcmVhZGVyCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBj
aGlsZHJlblswXS5ydW4oKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAg
ICAgICAgIHNlbGYuX21hbmFnZXIgPSBOb25lCisKKyAgICAgICAgICAgIHRvcGljID0gc2VsZi5f
ZmluZF90b3BpYyh0b3BpY19uYW1lKQorICAgICAgICAgICAgd2hpbGUgdG9waWMudGltZXIgb3Ig
bm90IHRvcGljLnF1ZXVlLmVtcHR5KCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5kcmFpbih0
b3BpY19uYW1lLCByZWFkZXIpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAg
ICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgICAgICBpZiB0b3BpYy50aW1l
ciBhbmQgdG9waWMudGltZXIuZGVhZGxpbmUgPiBub3c6CisgICAgICAgICAgICAgICAgICAgIHRp
bWUuc2xlZXAodG9waWMudGltZXIuZGVhZGxpbmUgLSBub3cpCisgICAgICAgIGVsc2U6CisgICAg
ICAgICAgICAjIFRoaXMgaXMgYSB3b3JrZXIuIEluIHRoZSBpbmxpbmUgY2FzZSwgYSB3b3JrZXIg
bmV2ZXIgYmxvY2tzLAorICAgICAgICAgICAgIyBzbyB3ZSBjYW4gcnVuIHRoZSByZWd1bGFyIGxv
b3AgY29kZS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgRklYTUU6IFdlIGRvbid0IGFj
dHVhbGx5IGVuZm9yY2UgdGhpcywgc28gYSBidWdneSB3b3JrZXIgY291bGQKKyAgICAgICAgICAg
ICMgZGVhZGxvY2sgdGhlIHByb2Nlc3MuCisKKyAgICAgICAgICAgICMgRW5zdXJlIHRoaXMgaXMg
YmVpbmcgY2FsbGVkIG9ubHkgZnJvbSBpbnNpZGUgdGhlIG1hbmFnZXIgbG9vcC4KKyAgICAgICAg
ICAgIGFzc2VydCBzZWxmLl9tYW5hZ2VyIGlzIG5vdCBOb25lCisKKyAgICAgICAgICAgIF9Xb3Jr
ZXJNZXNzYWdlQnJva2VyLnJ1bl9tZXNzYWdlX2xvb3Aoc2VsZiwgdG9waWNfbmFtZSwgcmVhZGVy
KQorCisKK2NsYXNzIF9NdWx0aVRocmVhZGVkQnJva2VyKF9Xb3JrZXJNZXNzYWdlQnJva2VyKToK
KyAgICBjbGFzcyBfVGhyZWFkZWRXb3JrZXJDb25uZWN0aW9uKHRocmVhZGluZy5UaHJlYWQpOgor
ICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYnJva2VyLCB3b3JrZXJfY2xhc3MsIHdvcmtlcl9u
dW1iZXIpOgorICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAg
ICAgICAgICAgc2VsZi5fYnJva2VyID0gYnJva2VyCisgICAgICAgICAgICBzZWxmLl9wb3J0ID0g
YnJva2VyLl9wb3J0CisgICAgICAgICAgICBzZWxmLl9vcHRpb25zID0gYnJva2VyLl9vcHRpb25z
CisgICAgICAgICAgICBzZWxmLl93b3JrZXIgPSB3b3JrZXJfY2xhc3Moc2VsZiwgd29ya2VyX251
bWJlcikKKworICAgICAgICBkZWYgY2FuY2VsKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fd29y
a2VyLmNhbmNlbCgpCisKKyAgICAgICAgZGVmIGlzQWxpdmUoc2VsZik6CisgICAgICAgICAgICB0
aHJlYWRpbmcuVGhyZWFkLmlzQWxpdmUoc2VsZikKKworICAgICAgICBkZWYgam9pbihzZWxmLCB0
aW1lb3V0KToKKyAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQuam9pbihzZWxmLCB0aW1lb3V0
KQorCisgICAgICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3dv
cmtlci5uYW1lKCkKKworICAgICAgICBkZWYgb3B0aW9ucyhzZWxmKToKKyAgICAgICAgICAgIHJl
dHVybiBzZWxmLl9icm9rZXIuX29wdGlvbnMKKworICAgICAgICBkZWYgcG9ydChzZWxmKToKKyAg
ICAgICAgICAgIHJldHVybiBzZWxmLl9icm9rZXIuX3BvcnQKKworICAgICAgICBkZWYgcG9zdF9t
ZXNzYWdlKHNlbGYsIG1lc3NhZ2VfbmFtZSwgKm1lc3NhZ2VfYXJncyk6CisgICAgICAgICAgICBz
ZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKHNlbGYubmFtZSgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzZWxmLl9icm9rZXIuX3dvcmtlcl9yZXBseV90b3BpYywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9uYW1lLCBtZXNzYWdl
X2FyZ3MpCisKKyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgICMgRklYTUU6IHdl
IGNhbiByZW1vdmUgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIG9uIDIuNi4KKyAgICAgICAgICAgIGlm
IG5vdCBoYXNhdHRyKHNlbGYsICdpZGVudCcpOgorICAgICAgICAgICAgICAgIHNlbGYuaWRlbnQg
PSB0aHJlYWQuZ2V0X2lkZW50KCkKKyAgICAgICAgICAgIHNlbGYuX3dvcmtlci5ydW4oKQorCisg
ICAgICAgIGRlZiBydW5fbWVzc2FnZV9sb29wKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fYnJv
a2VyLnJ1bl9tZXNzYWdlX2xvb3Aoc2VsZi5fYnJva2VyLl93b3JrZXJfcnVuX3RvcGljLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd29ya2VyKQorCisg
ICAgICAgIGRlZiB5aWVsZF90b19icm9rZXIoc2VsZik6CisgICAgICAgICAgICAjIFRoZXJlJ3Mg
bm8gbmVlZCB0byB5aWVsZCB3aXRoIHRocmVhZHMuCisgICAgICAgICAgICBwYXNzCisKKyAgICBf
V09SS0VSX0NPTk5FQ1RJT05fQ0xBU1MgPSBfVGhyZWFkZWRXb3JrZXJDb25uZWN0aW9uCisKKyAg
ICBkZWYgbG9nX3dlZGdlZF93b3JrZXIoc2VsZiwgd29ya2VyX25hbWUsIHRlc3RfbmFtZSk6Cisg
ICAgICAgIHRocmVhZCA9IHNlbGYuX2NoaWxkcmVuW3dvcmtlcl9uYW1lXQorICAgICAgICB0aWQg
PSB0aHJlYWQuaWRlbnQKKyAgICAgICAgc3RhY2sgPSBzZWxmLl9maW5kX3RocmVhZF9zdGFjayh0
aWQpCisgICAgICAgIGFzc2VydChzdGFjayBpcyBub3QgTm9uZSkKKyAgICAgICAgX2xvZy5lcnJv
cigiJXMgKHRpZCAlZCkgaXMgd2VkZ2VkIG9uIHRlc3QgJXMiICUKKyAgICAgICAgICAgICAgICAg
ICAod29ya2VyX25hbWUsIHRpZCwgdGVzdF9uYW1lKSkKKyAgICAgICAgc2VsZi5fbG9nX3N0YWNr
KHN0YWNrKQorCisgICAgZGVmIF9maW5kX3RocmVhZF9zdGFjayhzZWxmLCB0aWQpOgorICAgICAg
ICAiIiJSZXR1cm5zIGEgc3RhY2sgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZHVtcCBhIHN0
YWNrIHRyYWNlIGZvcgorICAgICAgICB0aGUgZ2l2ZW4gdGhyZWFkIGlkIChvciBOb25lIGlmIHRo
ZSBpZCBpcyBub3QgZm91bmQpLiIiIgorICAgICAgICBmb3IgdGhyZWFkX2lkLCBzdGFjayBpbiBz
eXMuX2N1cnJlbnRfZnJhbWVzKCkuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHRocmVhZF9pZCA9
PSB0aWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrCisgICAgICAgIHJldHVybiBOb25l
CisKKyAgICBkZWYgX2xvZ19zdGFjayhzZWxmLCBzdGFjayk6CisgICAgICAgICIiIkxvZyBhIHN0
YWNrIHRyYWNlIHRvIGxvZy5lcnJvcigpLiIiIgorICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVu
bywgbmFtZSwgbGluZSBpbiB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayhzdGFjayk6CisgICAgICAg
ICAgICBfbG9nLmVycm9yKCdGaWxlOiAiJXMiLCBsaW5lICVkLCBpbiAlcycgJSAoZmlsZW5hbWUs
IGxpbmVubywgbmFtZSkpCisgICAgICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgICAgIF9s
b2cuZXJyb3IoJyAgJXMnICUgbGluZS5zdHJpcCgpKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9r
ZXIyX3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvbGF5b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9rZXIyX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjFjODJkNTIzMTc3ZjU3ZGNjOWRlMzIwYmY1MThkODY3M2FiZmEyZTEKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFj
a2FnZS9tZXNzYWdlX2Jyb2tlcjJfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwzNDYgQEAKKyMgQ29w
eXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgUXVl
dWUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gd2Vi
a2l0cHkuY29tbW9uLnN5c3RlbSBpbXBvcnQgb3V0cHV0Y2FwdHVyZQorCitpbXBvcnQgbWVzc2Fn
ZV9icm9rZXIyIGFzIG1lc3NhZ2VfYnJva2VyCisKKworZGVmIG1ha2Vfd29ya2VyX2NsYXNzKHN0
YXJ0aW5nX3F1ZXVlPU5vbmUsIHN0b3BwaW5nX3F1ZXVlPU5vbmUsIG1zZz0nZG9uZScpOgorICAg
IGNsYXNzIFRlc3RXb3JrZXIob2JqZWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJy
b2tlciwgd29ya2VyX251bWJlcik6CisgICAgICAgICAgICBzZWxmLl9icm9rZXIgPSBicm9rZXIK
KyAgICAgICAgICAgIHNlbGYuX3BvcnQgPSBicm9rZXIucG9ydCgpCisgICAgICAgICAgICBzZWxm
Ll9vcHRpb25zID0gYnJva2VyLm9wdGlvbnMoKQorICAgICAgICAgICAgc2VsZi5fd29ya2VyX251
bWJlciA9IHdvcmtlcl9udW1iZXIKKyAgICAgICAgICAgIHNlbGYuX25hbWUgPSAnVGVzdFdvcmtl
ci8lZCcgJSB3b3JrZXJfbnVtYmVyCisgICAgICAgICAgICBzZWxmLl9jYW5jZWxlZCA9IEZhbHNl
CisgICAgICAgICAgICBzZWxmLl9zdG9wcGVkID0gRmFsc2UKKworICAgICAgICBkZWYgY2FuY2Vs
KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fY2FuY2VsZWQgPSBUcnVlCisKKyAgICAgICAgZGVm
IGhhbmRsZV9zdG9wKHNlbGYsIHNyYyk6CisgICAgICAgICAgICBzZWxmLl9zdG9wcGVkID0gVHJ1
ZQorCisgICAgICAgIGRlZiBoYW5kbGVfdGVzdChzZWxmLCBzcmMsIGFuX2ludCwgYV9zdHIpOgor
ICAgICAgICAgICAgYXNzZXJ0IGFuX2ludCA9PSAxCisgICAgICAgICAgICBhc3NlcnQgYV9zdHIg
PT0gImhlbGxvLCB3b3JsZCIKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlci5wb3N0X21lc3NhZ2Uo
J3Rlc3QnLCAyLCAnaGksIGV2ZXJ5Ym9keScpCisKKyAgICAgICAgZGVmIGlzX2RvbmUoc2VsZik6
CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3RvcHBlZCBvciBzZWxmLl9jYW5jZWxlZAorCisg
ICAgICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKwor
ICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAg
IGlmIHN0YXJ0aW5nX3F1ZXVlOgorICAgICAgICAgICAgICAgICAgICBzdGFydGluZ19xdWV1ZS5w
dXQoJycpCisgICAgICAgICAgICAgICAgc2VsZi5fYnJva2VyLnJ1bl9tZXNzYWdlX2xvb3AoKQor
ICAgICAgICAgICAgICAgIHNlbGYuX2Jyb2tlci55aWVsZF90b19icm9rZXIoKQorICAgICAgICAg
ICAgICAgIGlmIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVz
c2FnZShtc2cpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAg
ICAgIHNlbGYuX2Jyb2tlci5wb3N0X21lc3NhZ2UoJ2V4Y2VwdGlvbicsICh0eXBlKGUpLCBzdHIo
ZSksIE5vbmUpKQorCisgICAgcmV0dXJuIFRlc3RXb3JrZXIKKworCitkZWYgZ2V0X29wdGlvbnMo
d29ya2VyX21vZGVsKToKKyAgICBvcHRpb25fbGlzdCA9IG1lc3NhZ2VfYnJva2VyLnJ1bnRpbWVf
b3B0aW9ucygpCisgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0
PW9wdGlvbl9saXN0KQorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdz
PVsnLS13b3JrZXItbW9kZWwnLCB3b3JrZXJfbW9kZWxdKQorICAgIHJldHVybiBvcHRpb25zCisK
KworZGVmIG1ha2VfYnJva2VyKG1hbmFnZXIsIHdvcmtlcl9tb2RlbCwgc3RhcnRpbmdfcXVldWU9
Tm9uZSwKKyAgICAgICAgICAgICAgICBzdG9wcGluZ19xdWV1ZT1Ob25lKToKKyAgICBvcHRpb25z
ID0gZ2V0X29wdGlvbnMod29ya2VyX21vZGVsKQorICAgIHdvcmtlcl9jbGFzcyA9IG1ha2Vfd29y
a2VyX2NsYXNzKHN0YXJ0aW5nX3F1ZXVlLCBzdG9wcGluZ19xdWV1ZSkKKyAgICByZXR1cm4gbWVz
c2FnZV9icm9rZXIuZ2V0KE5vbmUsIG9wdGlvbnMsIG1hbmFnZXIsIHdvcmtlcl9jbGFzcykKKwor
CitjbGFzcyBGdW5jdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9n
ZXRfX2lubGluZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1ha2VfYnJva2VyKHNl
bGYsICdpbmxpbmUnKSBpcyBub3QgTm9uZSkKKworICAgIGRlZiB0ZXN0X2dldF9fdGhyZWFkcyhz
ZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1ha2VfYnJva2VyKHNlbGYsICd0aHJlYWRz
JykgaXMgbm90IE5vbmUpCisKKyAgICBkZWYgdGVzdF9nZXRfX3Vua25vd24oc2VsZik6CisgICAg
ICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1ha2VfYnJva2VyLCBzZWxmLCAndW5r
bm93bicpCisKKworY2xhc3MgX1dvcmtlck1lc3NhZ2VCcm9rZXJUZXN0c01peGluKG9iamVjdCk6
CisgICAgIiIiTWl4aW4gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgc2VyaWVzIG9mIHRlc3RzIHRv
IGVuZm9yY2UgdGhlCisgICAgY29udHJhY3QgYWxsIF9Xb3JrZXJNZXNzYWdlQnJva2VyIGltcGxl
bWVudGF0aW9ucyBtdXN0IGZvbGxvdy4iIiIKKworICAgICMKKyAgICAjIE1ldGhvZHMgdG8gaW1w
bGVtZW50IHRoZSBNYW5hZ2VyIHNpZGUgb2YgdGhlIENsaWVudEludGVyZmFjZQorICAgICMKKyAg
ICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICdUZXN0ZXInCisKKyAgICBkZWYgaXNf
ZG9uZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvbmUKKworICAgICMKKyAgICAjIEhh
bmRsZXJzIGZvciB0aGUgbWVzc2FnZXMgdGhlIFRlc3RXb3JrZXIgbWF5IHNlbmQuCisgICAgIwor
ICAgIGRlZiBoYW5kbGVfZG9uZShzZWxmLCBzcmMpOgorICAgICAgICBzZWxmLl9kb25lID0gVHJ1
ZQorCisgICAgZGVmIGhhbmRsZV90ZXN0KHNlbGYsIHNyYywgYW5faW50LCBhX3N0cik6CisgICAg
ICAgIHNlbGYuX2FuX2ludCA9IGFuX2ludAorICAgICAgICBzZWxmLl9hX3N0ciA9IGFfc3RyCisK
KyAgICBkZWYgaGFuZGxlX2V4Y2VwdGlvbihzZWxmLCBzcmMsIGV4Y19pbmZvKToKKyAgICAgICAg
c2VsZi5fZXhjZXB0aW9uID0gZXhjX2luZm8KKyAgICAgICAgc2VsZi5fZG9uZSA9IFRydWUKKwor
ICAgICMKKyAgICAjIFRlc3RpbmcgaGVscGVyIG1ldGhvZHMKKyAgICAjCisgICAgZGVmIHNldFVw
KHNlbGYpOgorICAgICAgICBzZWxmLl9hbl9pbnQgPSBOb25lCisgICAgICAgIHNlbGYuX2Ffc3Ry
ID0gTm9uZQorICAgICAgICBzZWxmLl9icm9rZXIgPSBOb25lCisgICAgICAgIHNlbGYuX2RvbmUg
PSBGYWxzZQorICAgICAgICBzZWxmLl9leGNlcHRpb24gPSBOb25lCisgICAgICAgIHNlbGYuX3dv
cmtlcl9tb2RlbCA9IE5vbmUKKyAgICAgICAgc2VsZi5fdGltZXJfdmFsID0gMAorICAgICAgICBz
ZWxmLl90aW1lcl9tYXhfdmFsID0gMQorCisgICAgZGVmIG1ha2VfYnJva2VyKHNlbGYsIHN0YXJ0
aW5nX3F1ZXVlPU5vbmUsIHN0b3BwaW5nX3F1ZXVlPU5vbmUpOgorICAgICAgICBzZWxmLl9icm9r
ZXIgPSBtYWtlX2Jyb2tlcihzZWxmLCBzZWxmLl93b3JrZXJfbW9kZWwsIHN0YXJ0aW5nX3F1ZXVl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wcGluZ19xdWV1ZSkKKwor
ICAgIGRlZiBjYWxsYmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5fdGltZXJfdmFsICs9IDEKKyAg
ICAgICAgc2VsZi5fYnJva2VyLmFkZF90aW1lcihzZWxmLmNhbGxiYWNrLCAwLjAwNSkKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX3RpbWVyX3ZhbCA+PSBzZWxmLl90aW1lcl9tYXhfdmFsCisKKyAgICAj
CisgICAgIyBBY3R1YWwgdW5pdCB0ZXN0cworICAgICMKKyAgICBkZWYgdGVzdF9hZGRfdGltZXJf
X2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChzZWxmLl90aW1lcl92YWwsIDApCisgICAgICAgIHNlbGYuX2Jyb2tlci5hZGRf
dGltZXIoc2VsZi5jYWxsYmFjaywgMC4wMDUpCisgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVz
c2FnZV9sb29wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl90aW1lcl92YWwsIDEp
CisKKyAgICBkZWYgdGVzdF9hZGRfdGltZXJfX2V4cGlyZWQoc2VsZik6CisgICAgICAgIHNlbGYu
bWFrZV9icm9rZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3RpbWVyX3ZhbCwg
MCkKKyAgICAgICAgc2VsZi5fYnJva2VyLmFkZF90aW1lcihzZWxmLmNhbGxiYWNrLCAwKQorICAg
ICAgICBzZWxmLl9icm9rZXIucnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwoc2VsZi5fdGltZXJfdmFsLCAxKQorCisgICAgZGVmIHRlc3RfYWRkX3RpbWVyX190b29f
bWFueV90aW1lcnMoc2VsZik6CisgICAgICAgIHNlbGYubWFrZV9icm9rZXIoKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFsKHNlbGYuX3RpbWVyX3ZhbCwgMCkKKyAgICAgICAgc2VsZi5fYnJva2Vy
LmFkZF90aW1lcihzZWxmLmNhbGxiYWNrLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhB
c3NlcnRpb25FcnJvciwgc2VsZi5fYnJva2VyLmFkZF90aW1lciwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgc2VsZi5jYWxsYmFjaywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxm
Ll90aW1lcl92YWwsIDApCisKKyAgICBkZWYgdGVzdF9hZGRfdGltZXJfX3BlcmlvZGljKHNlbGYp
OgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgc2VsZi5fdGltZXJfbWF4X3Zh
bCA9IDIKKyAgICAgICAgc2VsZi5fYnJva2VyLmFkZF90aW1lcihzZWxmLmNhbGxiYWNrLCAwLjAw
NSkKKyAgICAgICAgc2VsZi5fYnJva2VyLnJ1bl9tZXNzYWdlX2xvb3AoKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKHNlbGYuX3RpbWVyX3ZhbCwgMikKKworICAgIGRlZiB0ZXN0X2NhbmNlbChz
ZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigpCisgICAgICAgIHdvcmtlcl9uYW1lID0g
c2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBzZWxmLl9icm9rZXIuY2FuY2Vs
X3dvcmtlcih3b3JrZXJfbmFtZSkKKyAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2FnZSgn
c3RvcCcpCisgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9sb29wKCkKKyAgICAgICAg
c2VsZi5fYnJva2VyLmpvaW5fd29ya2VyKHdvcmtlcl9uYW1lLCAwLjUpCisgICAgICAgIHNlbGYu
YXNzZXJ0RmFsc2Uoc2VsZi5fYnJva2VyLndvcmtlcl9pc19hbGl2ZSh3b3JrZXJfbmFtZSkpCisg
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2RvbmUoKSkKKworICAgIGRlZiB0ZXN0X2Rv
bmUoc2VsZik6CisgICAgICAgIHNlbGYubWFrZV9icm9rZXIoKQorICAgICAgICB3b3JrZXJfbmFt
ZSA9IHNlbGYuX2Jyb2tlci5zdGFydF93b3JrZXIoMCkKKyAgICAgICAgc2VsZi5fYnJva2VyLnBv
c3RfbWVzc2FnZSgndGVzdCcsIDEsICdoZWxsbywgd29ybGQnKQorICAgICAgICBzZWxmLl9icm9r
ZXIucG9zdF9tZXNzYWdlKCdzdG9wJykKKyAgICAgICAgc2VsZi5fYnJva2VyLnJ1bl9tZXNzYWdl
X2xvb3AoKQorICAgICAgICBzZWxmLl9icm9rZXIuam9pbl93b3JrZXIod29ya2VyX25hbWUsIDAu
NSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9icm9rZXIud29ya2VyX2lzX2FsaXZl
KHdvcmtlcl9uYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaXNfZG9uZSgpKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2FuX2ludCwgMikKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChzZWxmLl9hX3N0ciwgJ2hpLCBldmVyeWJvZHknKQorCisgICAgZGVmIHRlc3Rf
dW5rbm93bl9tZXNzYWdlKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAg
ICAgd29ya2VyX25hbWUgPSBzZWxmLl9icm9rZXIuc3RhcnRfd29ya2VyKDApCisgICAgICAgIHNl
bGYuX2Jyb2tlci5wb3N0X21lc3NhZ2UoJ3Vua25vd24nKQorICAgICAgICBzZWxmLl9icm9rZXIu
cnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgIHNlbGYuX2Jyb2tlci5qb2luX3dvcmtlcih3b3Jr
ZXJfbmFtZSwgMC41KQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2RvbmUoKSkK
KyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9icm9rZXIud29ya2VyX2lzX2FsaXZlKHdv
cmtlcl9uYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5fZXhjZXB0aW9uWzBd
LCBWYWx1ZUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLl9leGNlcHRpb25b
MV0sCisgICAgICAgICAgICAiVGVzdFdvcmtlci8wOiByZWNlaXZlZCBtZXNzYWdlICd1bmtub3du
JyBpdCBjb3VsZG4ndCBoYW5kbGUiKQorCisKK2NsYXNzIElubGluZUJyb2tlclRlc3RzKF9Xb3Jr
ZXJNZXNzYWdlQnJva2VyVGVzdHNNaXhpbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBz
ZXRVcChzZWxmKToKKyAgICAgICAgX1dvcmtlck1lc3NhZ2VCcm9rZXJUZXN0c01peGluLnNldFVw
KHNlbGYpCisgICAgICAgIHNlbGYuX3dvcmtlcl9tb2RlbCA9ICdpbmxpbmUnCisKKyAgICBkZWYg
dGVzdF9sb2dfd2VkZ2VkX3dvcmtlcihzZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigp
CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBzZWxmLl9icm9rZXIu
bG9nX3dlZGdlZF93b3JrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUp
CisKKworY2xhc3MgVGhyZWFkZWRCcm9rZXJUZXN0cyhfV29ya2VyTWVzc2FnZUJyb2tlclRlc3Rz
TWl4aW4sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAg
IF9Xb3JrZXJNZXNzYWdlQnJva2VyVGVzdHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAgICBzZWxm
Ll93b3JrZXJfbW9kZWwgPSAndGhyZWFkcycKKworICAgIGRlZiB0ZXN0X2ZpbmRfdGhyZWFkX3N0
YWNrX2ZvdW5kKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgaWQs
IHN0YWNrID0gc3lzLl9jdXJyZW50X2ZyYW1lcygpLml0ZW1zKClbMF0KKyAgICAgICAgZm91bmRf
c3RhY2sgPSBzZWxmLl9icm9rZXIuX2ZpbmRfdGhyZWFkX3N0YWNrKGlkKQorICAgICAgICBzZWxm
LmFzc2VydE5vdEVxdWFsKGZvdW5kX3N0YWNrLCBOb25lKQorCisgICAgZGVmIHRlc3RfZmluZF90
aHJlYWRfc3RhY2tfbm90X2ZvdW5kKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkK
KyAgICAgICAgZm91bmRfc3RhY2sgPSBzZWxmLl9icm9rZXIuX2ZpbmRfdGhyZWFkX3N0YWNrKDAp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91bmRfc3RhY2ssIE5vbmUpCisKKyAgICBkZWYg
dGVzdF9sb2dfd2VkZ2VkX3dvcmtlcihzZWxmKToKKyAgICAgICAgc3RhcnRpbmdfcXVldWUgPSBR
dWV1ZS5RdWV1ZSgpCisgICAgICAgIHN0b3BwaW5nX3F1ZXVlID0gUXVldWUuUXVldWUoKQorICAg
ICAgICBzZWxmLm1ha2VfYnJva2VyKHN0YXJ0aW5nX3F1ZXVlLCBzdG9wcGluZ19xdWV1ZSkKKyAg
ICAgICAgb2MgPSBvdXRwdXRjYXB0dXJlLk91dHB1dENhcHR1cmUoKQorICAgICAgICBvYy5jYXB0
dXJlX291dHB1dCgpCisKKyAgICAgICAgd29ya2VyX25hbWUgPSBzZWxmLl9icm9rZXIuc3RhcnRf
d29ya2VyKDApCisgICAgICAgIHN0YXJ0aW5nX3F1ZXVlLmdldCgpCisgICAgICAgIHNlbGYuX2Jy
b2tlci5sb2dfd2VkZ2VkX3dvcmtlcih3b3JrZXJfbmFtZSwgJ3Rlc3RfbmFtZScpCisgICAgICAg
IHN0b3BwaW5nX3F1ZXVlLnB1dCgnJykKKyAgICAgICAgb2MucmVzdG9yZV9vdXRwdXQoKQorCisK
K2NsYXNzIE1lc3NhZ2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fbm9f
Ym9keShzZWxmKToKKyAgICAgICAgbXNnID0gbWVzc2FnZV9icm9rZXIuX01lc3NhZ2UoJ3NyYycs
ICd0b3BpY19uYW1lJywgJ21lc3NhZ2VfbmFtZScsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0
VHJ1ZShyZXByKG1zZykpCisgICAgICAgIHMgPSBtc2cuZHVtcHMoKQorICAgICAgICBuZXdfbXNn
ID0gbWVzc2FnZV9icm9rZXIuX01lc3NhZ2UubG9hZHMocykKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbChuZXdfbXNnLm5hbWUsICdtZXNzYWdlX25hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKG5ld19tc2cuYm9keSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfbXNn
LnRvcGljX25hbWUsICd0b3BpY19uYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdf
bXNnLnNyYywgJ3NyYycpCisKKyAgICBkZWYgdGVzdF9fYm9keShzZWxmKToKKyAgICAgICAgbXNn
ID0gbWVzc2FnZV9icm9rZXIuX01lc3NhZ2UoJ3NyYycsICd0b3BpY19uYW1lJywgJ21lc3NhZ2Vf
bmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYm9keScsIDAp
KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihtc2cpKQorICAgICAgICBzID0gbXNnLmR1
bXBzKCkKKyAgICAgICAgbmV3X21zZyA9IG1lc3NhZ2VfYnJva2VyLl9NZXNzYWdlLmxvYWRzKHMp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X21zZy5uYW1lLCAnbWVzc2FnZV9uYW1lJykK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfbXNnLmJvZHksICgnYm9keScsIDApKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19tc2cudG9waWNfbmFtZSwgJ3RvcGljX25hbWUnKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19tc2cuc3JjLCAnc3JjJykKKworCitjbGFzcyBJ
bnRlcmZhY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoZXNlIHRlc3RzIG1vc3Rs
eSBleGlzdCB0byBwYWNpZnkgY292ZXJhZ2UuCisKKyAgICAjIEZJWE1FOiBUaGVyZSBtdXN0IGJl
IGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIGFuZCBhbHNvIHZlcmlmeQorICAgICMgdGhhdCBjbGFz
c2VzIGRvIGltcGxlbWVudCBldmVyeSBhYnN0cmFjdCBtZXRob2QgaW4gYW4gaW50ZXJmYWNlLgor
CisgICAgZGVmIHRlc3Rfd29ya2VyY29ubmVjdGlvbmludGVyZmFjZV9pc19hYnN0cmFjdChzZWxm
KToKKyAgICAgICAgIyBUZXN0IHRoYXQgd2UgY2FuJ3QgY3JlYXRlIGFuIGluc3RhbmNlIGRpcmVj
dGx5LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLAorICAg
ICAgICAgICAgbWVzc2FnZV9icm9rZXIuX1dvcmtlck1lc3NhZ2VCcm9rZXIuX1dvcmtlckNvbm5l
Y3Rpb25JbnRlcmZhY2UsCisgICAgICAgICAgICBicm9rZXI9Tm9uZSwgd29ya2VyX2NsYXNzPU5v
bmUsIHdvcmtlcl9udW1iZXI9Tm9uZSkKKworICAgICAgICBjbGFzcyBXb3JrZXJDb25uZWN0aW9u
KG1lc3NhZ2VfYnJva2VyLl9Xb3JrZXJNZXNzYWdlQnJva2VyLl9Xb3JrZXJDb25uZWN0aW9uSW50
ZXJmYWNlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqb3B0YXJncyk6CisgICAg
ICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgVGVzdCB0aGF0IGFsbCB0aGUgYmFzZSBjbGFz
cyBtZXRob2RzIGFyZSBhYnN0cmFjdCBhbmQgaGF2ZSB0aGUKKyAgICAgICAgIyBzaWduYXR1cmUg
d2UgZXhwZWN0LgorICAgICAgICBvYmogPSBXb3JrZXJDb25uZWN0aW9uKCkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLmNhbmNlbCkKKyAgICAgICAg
c2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLmlzQWxpdmUpCisgICAg
ICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5qb2luLCBOb25l
KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmoubmFt
ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLnBv
cnQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5v
cHRpb25zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBv
YmoucG9zdF9tZXNzYWdlLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhO
b3RJbXBsZW1lbnRlZEVycm9yLCBvYmoucnVuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhO
b3RJbXBsZW1lbnRlZEVycm9yLCBvYmoucnVuX21lc3NhZ2VfbG9vcCkKKyAgICAgICAgc2VsZi5h
c3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLnN0YXJ0KQorICAgICAgICBzZWxm
LmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmoueWllbGRfdG9fYnJva2VyKQor
CisgICAgZGVmIHRlc3RfYnJva2VyY2xpZW50aW50ZXJmYWNlX2lzX2Fic3RyYWN0KHNlbGYpOgor
ICAgICAgICAjIFRlc3QgdGhhdCB3ZSBjYW4ndCBjcmVhdGUgYW4gaW5zdGFuY2UgZGlyZWN0bHku
CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAg
ICAgICBtZXNzYWdlX2Jyb2tlci5DbGllbnRJbnRlcmZhY2UsCisgICAgICAgICAgICBicm9rZXJf
Y29ubmVjdGlvbj1Ob25lLCB3b3JrZXJfbnVtYmVyPU5vbmUpCisKKyAgICAgICAgY2xhc3MgV29y
a2VyQ2xpZW50KG1lc3NhZ2VfYnJva2VyLkNsaWVudEludGVyZmFjZSk6CisgICAgICAgICAgICBk
ZWYgX19pbml0X18oc2VsZiwgKm9wdGFyZ3MpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAg
ICAgICAjIFRlc3QgdGhhdCBhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kcyBhcmUgYWJzdHJhY3Qg
YW5kIGhhdmUgdGhlCisgICAgICAgICMgc2lnbmF0dXJlIHdlIGV4cGVjdC4KKyAgICAgICAgb2Jq
ID0gV29ya2VyQ2xpZW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50
ZWRFcnJvciwgb2JqLmNhbmNlbCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVt
ZW50ZWRFcnJvciwgb2JqLm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxl
bWVudGVkRXJyb3IsIG9iai5pc19kb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJ
bXBsZW1lbnRlZEVycm9yLCBvYmoucnVuKQorCisgICAgZGVmIHRlc3RfbG9nX3dlZGdlZF93b3Jr
ZXIoc2VsZik6CisgICAgICAgIGJyb2tlciA9IG1lc3NhZ2VfYnJva2VyLl9Xb3JrZXJNZXNzYWdl
QnJva2VyKE5vbmUsIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFp
c2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGJyb2tlci5sb2dfd2VkZ2VkX3dvcmtlciwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgTm9uZSwgTm9uZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19t
YWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75680</attachid>
            <date>2010-12-06 05:31:42 -0800</date>
            <delta_ts>2010-12-06 17:40:38 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-50557-20101206053141.patch</filename>
            <type>text/plain</type>
            <size>39929</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAyZGU1OWU3YWQwMTkwZWQ3YjM0YzhkZjVkNjRlMzBlYmY3MWYxNjQ5Li41NTc0YTIz
ZWE1NWI5MDkzM2U2ZTg4OWQ0Zjc4OTA3MWQ4MWU0NDJiIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMTAtMTItMDYgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBjaGFuZ2UgYWRk
cyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlX2Jyb2tlciBwYWNrYWdlCisgICAgICAgIHRo
YXQgYWN0dWFsbHkgZG9lcyBtZXNzYWdpbmcuIFRvIHNpbXBsaWZ5IHJldmlld2luZyB0aGUgbmV4
dAorICAgICAgICBjb3VwbGUgcGF0Y2hlcywgdGhpcyBpcyBiZWluZyBhZGRlZCBhcyBhIHNlcGFy
YXRlIGZpbGUgZm9yIG5vdy4KKyAgICAgICAgVWx0aW1hdGVseSBtZXNzYWdlX2Jyb2tlci5weSB3
aWxsIGJlIHJlbW92ZWQgYW5kIHRoaXMgZmlsZSB3aWxsCisgICAgICAgIGJlIHJlbmFtZWQuCisK
KyAgICAgICAgVGhpcyBwYXRjaCBkZXBlbmRzIG9uIGJ1ZyA1MDM3NC4KKworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTA1NTcKKworICAgICAgICAqIFNj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21lc3NhZ2VfYnJva2Vy
Mi5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5
b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9rZXIyX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKwogMjAxMC0x
Mi0wMiAgRGlyayBQcmFua2UgIDxkcHJhbmtlQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBUb255IENoYW5nLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9rZXIyLnB5IGIvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWVz
c2FnZV9icm9rZXIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjk2YzMxZjExZjEwMzYwOGQ0ODFjMGYwMmJjMWUz
OGJjYmViZmVjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tZXNzYWdlX2Jyb2tlcjIucHkKQEAgLTAs
MCArMSw2NDggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMg
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBk
aXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisj
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisj
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJNb2R1bGUgZm9yIGhhbmRsaW5nIG1l
c3NhZ2VzIGFuZCBjb25jdXJyZW5jeSBmb3IgcnVuLXdlYmtpdC10ZXN0cy4KKworVGVzdGluZyBp
cyBhY2NvbXBsaXNoZWQgYnkgaGF2aW5nIGEgbWFuYWdlciAoVGVzdFJ1bm5lcikgZ2F0aGVyIGFs
bCBvZiB0aGUKK3Rlc3RzIHRvIGJlIHJ1biwgYW5kIHNlbmRpbmcgbWVzc2FnZXMgdG8gYSBwb29s
IG9mIHdvcmtlcnMgKFRlc3RTaGVsbFRocmVhZHMpCit0byBydW4gZWFjaCB0ZXN0LiBFYWNoIHdv
cmtlciBjb21tdW5pY2F0ZXMgd2l0aCBvbmUgZHJpdmVyICh1c3VhbGx5CitEdW1wUmVuZGVyVHJl
ZSkgdG8gcnVuIG9uZSB0ZXN0IGF0IGEgdGltZSBhbmQgdGhlbiBjb21wYXJlIHRoZSBvdXRwdXQg
YWdhaW5zdAord2hhdCB3ZSBleHBlY3RlZCB0byBnZXQuCisKK1RoaXMgbW9kdWxlcyBpbXBsZW1l
bnRzIGEgbWVzc2FnZSBicm9rZXIgdGhhdCBjb25uZWN0cyB0aGUgbWFuYWdlciB0byB0aGUKK3dv
cmtlcnM6IGl0IHByb3ZpZGVzIGEgbWVzc2FnaW5nIGFic3RyYWN0aW9uIGFuZCBtZXNzYWdlIGxv
b3BzLCBhbmQKK2hhbmRsZXMgbGF1bmNoaW5nIHRocmVhZHMgYW5kL29yIHByb2Nlc3NlcyBkZXBl
bmRpbmcgb24gdGhlIHJlcXVlc3RlZAorY29uZmlndXJhdGlvbi4KKworQm90aCBNYW5hZ2VycyBh
bmQgV29ya2VycyBhcmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoZSBtZXRob2RzIGluIHRoZQor
QnJva2VyQ2xpZW50IGludGVyZmFjZSAvIGFic3RyYWN0IGJhc2UgY2xhc3MgaW4gb3JkZXIgdG8g
dGhlIG1lc3NhZ2UKK2Jyb2tlciB0byBwcm9wZXJseSBjb21tdW5pY2F0ZSB3aXRoIHRoZW0uCisK
K0V2ZXJ5dGhpbmcgc3RhcnRzIGJ5IGNhbGxpbmcgZ2V0KCkgdG8gb2J0YWluIGFuIGluaXRpYWwg
cmVmZXJlbmNlIHRvIGEgYnJva2VyLgorVGhlIGJyb2tlciBpcyBtZWRpYXRlZCBieSBhIENvbm5l
Y3Rpb24gb2JqZWN0IHRoYXQgcHJvdmlkZXMgc29tZSBzeW50YWN0aWMKK3N1Z2FyIHRvIHJlcHJl
c2VudCB0aGUgTWFuYWdlciBhbmQgV29ya2VyIGVuZHBvaW50cy4gVHlwaWNhbGx5IHRoZQorbWFu
YWdlciB0aGVuIGNhbGxzIHN0YXJ0X3dvcmtlcigpIHJlcGVhdGVkbHkgdG8gbGF1bmNoIHdvcmtl
cnMgKHdoaWNoIGFyZQordXN1YWxseSBydW4gaW4gc2VwYXJhdGUgdGhyZWFkcyBvciBwcm9jZXNz
ZXMgYXMgY29udHJvbGxlZCBieSB0aGUKKy0td29ya2VyLW1vZGVsIHJ1bnRpbWUgZmxhZyksIG9w
dGlvbmFsbHkgc2V0cyB1cCBzb21lIHRpbWVycywgYW5kIHRoZW4KK2ludm9rZXMgcnVuX21lc3Nh
Z2VfbG9vcCgpLgorIiIiCisKKyMgRklYTUU6IFRoaXMgcGFja2FnZSBzaG91bGQgcHJvYmFibHkg
YXQgbGVhc3QgYmUgc3BsaXQgaW50byB0d28gc2VwYXJhdGUKKyMgY2xhc3NlcyB0byBzZXBhcmF0
ZSBvdXQgdGhlICJ3b3JrZXIgcG9vbCIgY29uY2VwdCBhbmQgdGhlIGFjdHVhbAorIyBtZXNzYWdl
IGJyb2tlciBsb2dpYywgd2hpY2ggZG9lc24ndCByZWFsbHkgY2FyZSBob3cgdGhlIHdvcmtlcnMg
YXJlCisjIGltcGxlbWVudGVkLgorCitpbXBvcnQgY1BpY2tsZQoraW1wb3J0IGxvZ2dpbmcKK2lt
cG9ydCBvcHRwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgUXVldWUKK2ltcG9ydCBzeXMKK2ltcG9y
dCB0aHJlYWQKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNr
CisKK19sb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworIworIyBUb3BpYyBuYW1l
cyBmb3IgdGhlIG1lc3NhZ2UgcXVldWVzLgorIworTUFOQUdFUl9UT1BJQyA9ICdtYW5hZ2VyJwor
QU5ZX1dPUktFUl9UT1BJQyA9ICd3b3JrZXInCisKKworZGVmIHJ1bnRpbWVfb3B0aW9ucygpOgor
ICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygb3B0cGFyc2UuT3B0aW9uIG9iamVjdHMgZm9yIGFueSBy
dW50aW1lIHZhbHVlcyB1c2VkCisgICAgYnkgdGhpcyBtZXRob2QuIiIiCisgICAgb3B0aW9ucyA9
IFsKKyAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0td29ya2VyLW1vZGVsIiwgYWN0aW9u
PSJzdG9yZSIsCisgICAgICAgICAgICBoZWxwPSgiY29udHJvbHMgd29ya2VyIG1vZGVsLiBWYWxp
ZCB2YWx1ZXMgYXJlICIKKyAgICAgICAgICAgICInaW5saW5lJyBhbmQgJ3RocmVhZHMnLiIpKSwK
KyAgICBdCisgICAgcmV0dXJuIG9wdGlvbnMKKworCitkZWYgZ2V0KHBvcnQsIG9wdGlvbnMsIG1h
bmFnZXIsIHdvcmtlcl9jbGFzcyk6CisgICAgIiIiUmV0dXJuIGEgY29ubmVjdGlvbiB0byBhIG1h
bmFnZXIvd29ya2VyIG1lc3NhZ2UgYnJva2VyCisKKyAgICBBcmdzOgorICAgICAgICBwb3J0IC0g
aGFuZGxlIHRvIGxheW91dF90ZXN0cy9wb3J0IG9iamVjdCBmb3IgcG9ydC1zcGVjaWZpYyBzdHVm
ZgorICAgICAgICBvcHRpb25zIC0gb3B0cGFyc2UgYXJndW1lbnQgZm9yIGNvbW1hbmQtbGluZSBv
cHRpb25zCisgICAgICAgIG1hbmFnZXIgLSBvYmplY3QgdG8gZGlzcGF0Y2ggcmVwbGllcyB0bwor
ICAgICAgICB3b3JrZXJfY2xhc3MgLSB0eXBlIG9mIHdvcmtlcnMgdG8gY3JlYXRlLiBUaGlzIGNs
YXNzIG11c3QgaW1wbGVtZW50CisgICAgICAgICAgICB0aGUgbWV0aG9kcyBpbiB0aGUgQnJva2Vy
Q2xpZW50SW50ZXJmYWNlLgorICAgIFJldHVybnM6CisgICAgICAgIEEgaGFuZGxlIHRvIGFuIG9i
amVjdCB0aGF0IHdpbGwgdGFsayB0byBhIG1lc3NhZ2UgYnJva2VyIGNvbmZpZ3VyZWQKKyAgICAg
ICAgZm9yIHRoZSBub3JtYWwgbWFuYWdlci93b3JrZXIgY29tbXVuaWNhdGlvbi4KKyAgICAiIiIK
KyAgICBicm9rZXIgPSBfZ2V0X2Jyb2tlcihwb3J0LCBvcHRpb25zLCBtYW5hZ2VyLCB3b3JrZXJf
Y2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZX1dPUktFUl9UT1BJQywgTUFOQUdF
Ul9UT1BJQykKKyAgICByZXR1cm4gX01hbmFnZXJDb25uZWN0aW9uKGJyb2tlciwgbWFuYWdlcikK
KworCitjbGFzcyBDbGllbnRJbnRlcmZhY2Uob2JqZWN0KToKKyAgICAiIiJBYnN0cmFjdCBiYXNl
IGNsYXNzIC8gaW50ZXJmYWNlIHRoYXQgYWxsIG1lc3NhZ2UgYnJva2VyIGNsaWVudHMgbXVzdAor
ICAgIGltcGxlbWVudC4gSW4gYWRkaXRpb24gdG8gdGhlIG1ldGhvZHMgYmVsb3csIGJ5IGNvbnZl
bnRpb24gY2xpZW50cworICAgIGltcGxlbWVudCByb3V0aW5lcyBvZiB0aGUgc2lnbmF0dXJlIHR5
cGUKKworICAgICAgICBoYW5kbGVfTUVTU0FHRV9OQU1FKHNlbGYsIHNyYywgLi4uKToKKworICAg
IHdoZXJlIE1FU1NBR0VfTkFNRSBtYXRjaGVzIHRoZSBzdHJpbmcgcGFzc2VkIHRvIHBvc3RfbWVz
c2FnZSgpLCBhbmQKKyAgICBzcmMgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZSBzZW5kZXIuIElm
IHRoZSBtZXNzYWdlIGNvbnRhaW5zIHZhbHVlcyBpbgorICAgIHRoZSBtZXNzYWdlIGJvZHksIHRo
b3NlIHdpbGwgYmUgcHJvdmlkZWQgYXMgb3B0cGFyYW1zLiIiIgorCisgICAgZGVmIF9faW5pdF9f
KHNlbGYsIGJyb2tlcl9jb25uZWN0aW9uLCB3b3JrZXJfbnVtYmVyKToKKyAgICAgICAgcmFpc2Ug
Tm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGNhbmNlbChzZWxmKToKKyAgICAgICAgIiIi
Q2FsbGVkIChpZiBwb3NzaWJsZSkgdG8gbm90aWZ5IHRoZSB3b3JrZXIgdGhhdCBpdCBoYXMgYmVl
biBhYm9ydGVkLgorCisgICAgICAgIE9ubHkgd29ya2VycyBuZWVkIGltcGxlbWVudCB0aGlzIG1l
dGhvZC4gV29ya2VycyBjYW5ub3QgcmVseSBvbiB0aGlzCisgICAgICAgIG1ldGhvZCBhbHdheXMg
YmVpbmcgY2FsbGVkLiBGb3IgZXhhbXBsZSwgd29ya2VycyBydW5uaW5nIGluIHRoZWlyCisgICAg
ICAgIG93biBwcm9jZXNzZXMgbWF5IGJlIGtpbGxlZCBkaXJlY3RseSBpbnN0ZWFkIG9mIGludm9r
aW5nIHRoaXMgbWV0aG9kCisgICAgICAgIGFuZCB3YWl0aW5nIGZvciB0aGUgdGhlIHdvcmtlciB0
byBleGl0LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYg
aXNfZG9uZShzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVkIGZyb20gaW5zaWRlIHJ1bl9tZXNzYWdl
X2xvb3AoKSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGV4aXQuIiIiCisgICAgICAgIHJhaXNlIE5v
dEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1
cm4gYSBuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgd29ya2VyIG9yIG1hbmFnZXIuIiIiCisgICAg
ICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBydW4oc2VsZik6CisgICAg
ICAgICIiIk9ubHkgd29ya2VycyBuZWVkIGltcGxlbWVudCB0aGlzIG1ldGhvZC4iIiIKKyAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKK2NsYXNzIF9NYW5hZ2VyQ29ubmVjdGlv
bihvYmplY3QpOgorICAgICIiIlRoaXMgY2xhc3MgaGFuZGxlcyBhIGNvbm5lY3Rpb24gdG8gYSBt
ZXNzYWdlIGJyb2tlciB0aGF0IGlzIHNldCB1cAorICAgIHRvIHNlbmQgbWVzc2FnZXMgdG8gYSBX
b3JrZXIgcXVldWUgYXMgYSBNYW5hZ2VyLiBJdCBpcyBwcm92aWRlZCBhcyBhCisgICAgY29udmVu
aWVuY2UgYW5kIHRvIGVuY2Fwc3VsYXRlIHRoZSBnZW5lcmljIG1lc3NhZ2UgYnJva2VyLiIiIgor
CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlciwgbWFuYWdlcik6CisgICAgICAgIHNlbGYu
X2Jyb2tlciA9IGJyb2tlcgorICAgICAgICBzZWxmLl9tYW5hZ2VyID0gbWFuYWdlcgorCisgICAg
ZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAjIFRoaXMgbWV0aG9kIGNhdXNl
cyBhbnkgbWV0aG9kIHdlIGRvbid0IGRpcmVjdGx5IGltcGxlbWVudAorICAgICAgICAjIHRvIHRo
ZSBicm9rZXIuCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX2Jyb2tlciwgbmFtZSkKKwor
ICAgIGRlZiBwb3N0X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9uYW1lLCAqbWVzc2FnZV9hcmdzKToK
KyAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2FnZShzZWxmLl9tYW5hZ2VyLm5hbWUoKSwg
QU5ZX1dPUktFUl9UT1BJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNz
YWdlX25hbWUsIG1lc3NhZ2VfYXJncykKKworICAgIGRlZiBhZGRfdGltZXIoc2VsZiwgY2FsbGJh
Y2ssIGRlbGF5X3NlY3MpOgorICAgICAgICBzZWxmLl9icm9rZXIuYWRkX3RpbWVyKE1BTkFHRVJf
VE9QSUMsIGNhbGxiYWNrLCBkZWxheV9zZWNzKQorCisgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Ao
c2VsZik6CisgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9sb29wKE1BTkFHRVJfVE9Q
SUMsIHNlbGYuX21hbmFnZXIpCisKKyAgICBkZWYgc3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9u
dW1iZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcih3b3JrZXJf
bnVtYmVyKQorCisKK2RlZiBfZ2V0X2Jyb2tlcihwb3J0LCBvcHRpb25zLCBtYW5hZ2VyLCB3b3Jr
ZXJfY2xhc3MsIHdvcmtlcl90b3BpYywKKyAgICAgICAgICAgICAgICB3b3JrZXJfcmVwbHlfdG9w
aWMpOgorICAgIHdvcmtlcl9tb2RlbCA9IG9wdGlvbnMud29ya2VyX21vZGVsCisgICAgYnJva2Vy
X3R5cGVzID0geworICAgICAgICAnaW5saW5lJzogX0lubGluZUJyb2tlciwKKyAgICAgICAgJ3Ro
cmVhZHMnOiBfTXVsdGlUaHJlYWRlZEJyb2tlciwKKyAgICB9CisgICAgdHJ5OgorICAgICAgICBi
cm9rZXJfY2xhc3MgPSBicm9rZXJfdHlwZXNbd29ya2VyX21vZGVsXQorICAgICAgICByZXR1cm4g
YnJva2VyX2NsYXNzKHBvcnQsIG9wdGlvbnMsIHdvcmtlcl9jbGFzcywgd29ya2VyX3RvcGljLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9yZXBseV90b3BpYykKKyAgICBleGNl
cHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Vuc3VwcG9ydGVkIHZhbHVl
IGZvciAtLXdvcmtlci1tb2RlbDogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jr
ZXJfbW9kZWwpCisKKworY2xhc3MgX01lc3NhZ2Uob2JqZWN0KToKKyAgICBAc3RhdGljbWV0aG9k
CisgICAgZGVmIGxvYWRzKHN0cik6CisgICAgICAgIG9iaiA9IGNQaWNrbGUubG9hZHMoc3RyKQor
ICAgICAgICBhc3NlcnQoaXNpbnN0YW5jZShvYmosIF9NZXNzYWdlKSkKKyAgICAgICAgcmV0dXJu
IG9iagorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNyYywgdG9waWNfbmFtZSwgbWVzc2FnZV9u
YW1lLCBtZXNzYWdlX2JvZHkpOgorICAgICAgICBzZWxmLnNyYyA9IHNyYworICAgICAgICBzZWxm
LnRvcGljX25hbWUgPSB0b3BpY19uYW1lCisgICAgICAgIHNlbGYubmFtZSA9IG1lc3NhZ2VfbmFt
ZQorICAgICAgICBzZWxmLmJvZHkgPSBtZXNzYWdlX2JvZHkKKworICAgIGRlZiBkdW1wcyhzZWxm
KToKKyAgICAgICAgcmV0dXJuIGNQaWNrbGUuZHVtcHMoc2VsZikKKworICAgIGRlZiBfX3JlcHJf
XyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgiX01lc3NhZ2UoZnJvbT0nJXMnLCB0b3BpY19uYW1l
PSclcycsIG1lc3NhZ2VfbmFtZT0nJXMnKSIgJQorICAgICAgICAgICAgICAgIChzZWxmLnNyYywg
c2VsZi50b3BpY19uYW1lLCBzZWxmLm5hbWUpKQorCisKK2NsYXNzIF9UaW1lcihvYmplY3QpOgor
ICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWxsYmFjaywgZGVsYXkpOgorICAgICAgICBzZWxmLmNh
bGxiYWNrID0gY2FsbGJhY2sKKyAgICAgICAgc2VsZi5kZWxheSA9IGRlbGF5CisgICAgICAgIHNl
bGYuZGVhZGxpbmUgPSB0aW1lLnRpbWUoKSArIGRlbGF5CisKKworY2xhc3MgX1RvcGljKG9iamVj
dCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHF1ZXVlKToKKyAgICAgICAgc2VsZi5xdWV1ZSA9
IHF1ZXVlCisgICAgICAgIHNlbGYudGltZXIgPSBOb25lCisKKworY2xhc3MgX1dvcmtlck1lc3Nh
Z2VCcm9rZXIob2JqZWN0KToKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIG1lc3Nh
Z2UgYnJva2VyIHR1bmVkIGZvciB0aGUgbGF5b3V0IHRlc3RzLgorCisgICAgVGhpcyBjbGFzcyBp
bXBsZW1lbnRzIGEgbW9zdGx5IGdlbmVyaWMgbWVzc2FnZSBicm9rZXIgd2l0aCBhIGZldyB0d2Vh
a3MKKyAgICB0dW5lZCBmb3IgbWFuYWdlci93b3JrZXItc3R5bGUgbWVzc2FnaW5nLiBUaGlzIGNs
YXNzIHNob3VsZCBub3QgYmUKKyAgICBpbnN0YW50aWF0ZWQgZGlyZWN0bHk7IGluc3RlYWQsIGl0
IHNob3VsZCBiZSBzdWJjbGFzc2VkIHRvIHByb3ZpZGUKKyAgICBpbXBsZW1lbnRhdGlvbnMgb2Yg
YSBXb3JrZXJDb25uZWN0aW9uSW50ZXJmYWNlIG9iamVjdCBmb3IKKyAgICBfV09SS0VSX0NPTk5F
Q1RJT05fQ0xBU1MuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydCwgb3B0aW9ucywg
d29ya2VyX2NsYXNzLCB3b3JrZXJfcnVuX3RvcGljLAorICAgICAgICAgICAgICAgICB3b3JrZXJf
cmVwbHlfdG9waWMpOgorICAgICAgICAiIiJSZXR1cm4gYSBtZXNzYWdlIGJyb2tlciBmb3IgbWFu
YWdlci93b3JrZXIgY29tbXVuaWNhdGlvbi4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAg
cG9ydDogaGFuZGxlIHRvIHBvcnQtc3BlY2lmaWMgbG9naWMKKyAgICAgICAgICAgIG9wdGlvbnM6
IGEgcnVudGltZSBvcHRpb24gY2xhc3MgZnJvbSBvcHRwYXJzZQorICAgICAgICAgICAgd29ya2Vy
X2NsYXNzOiBUaGUgdHlwZSBvZiB3b3JrZXIgb2JqZWN0cyB0byBpbnN0YW50aWF0ZQorICAgICAg
ICAgICAgd29ya2VyX3J1bl90b3BpYzogVGhlIHRvcGljIG5hbWUgd29ya2VycyBzaG91bGQgbGlz
dGVuIGZvcgorICAgICAgICAgICAgd29ya2VyX3JlcGx5X3RvcGljOiBUaGUgdG9waWMgbmFtZSB3
b3JrZXJzIHNob3VsZCBwb3N0IHJlcGxpZXMgdG8KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYu
X3BvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIHNl
bGYuX3dvcmtlcl9jbGFzcyA9IHdvcmtlcl9jbGFzcworICAgICAgICBzZWxmLl93b3JrZXJfcnVu
X3RvcGljID0gd29ya2VyX3J1bl90b3BpYworICAgICAgICBzZWxmLl93b3JrZXJfcmVwbHlfdG9w
aWMgPSB3b3JrZXJfcmVwbHlfdG9waWMKKworICAgICAgICBzZWxmLl90b3BpY3MgPSB7fQorICAg
ICAgICBzZWxmLl9jaGlsZHJlbiA9IHt9CisgICAgICAgIHNlbGYuYWRkX3RvcGljKHdvcmtlcl9y
dW5fdG9waWMpCisgICAgICAgIHNlbGYuYWRkX3RvcGljKHdvcmtlcl9yZXBseV90b3BpYykKKwor
ICAgIGRlZiBhZGRfdG9waWMoc2VsZiwgdG9waWNfbmFtZSk6CisgICAgICAgIGlmIHRvcGljX25h
bWUgbm90IGluIHNlbGYuX3RvcGljczoKKyAgICAgICAgICAgIHNlbGYuX3RvcGljc1t0b3BpY19u
YW1lXSA9IF9Ub3BpYyhRdWV1ZS5RdWV1ZSgpKQorCisgICAgZGVmIF9maW5kX3RvcGljKHNlbGYs
IHRvcGljX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fdG9waWNzW3RvcGljX25hbWVdCisK
KyAgICAjIEFsbCBXb3JrZXJNZXNzYWdlQnJva2VyIGltcGxlbWVudGF0aW9ucyBtdXN0IHByb3Zp
ZGUgY29ubmVjdGlvbiBjbGFzcworICAgICMgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNl
IGluIG9yZGVyIHRvIG1hbmFnZSBtdWx0aXBsZSB3b3JrZXJzCisgICAgIyBjb3JyZWN0bHkuCisg
ICAgY2xhc3MgX1dvcmtlckNvbm5lY3Rpb25JbnRlcmZhY2Uob2JqZWN0KToKKyAgICAgICAgZGVm
IF9faW5pdF9fKHNlbGYsIGJyb2tlciwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKToKKyAg
ICAgICAgICAgICIiIlJldHVybiBhIHdvcmtlciBvYmplY3QuCisKKyAgICAgICAgICAgIEFyZ3Mg
bWlycm9yIFdvcmtlck1lc3NhZ2VCcm9rZXIsIEJyb2tlckNsaWVudEludGVyZmFjZSwgYW5kCisg
ICAgICAgICAgICBzdGFydF93b3JrZXIoKTogQ2FsbGVkIG9uIHRoZSBtYW5hZ2VyIHNpZGUgb2Yg
dGhlIG1lc3NhZ2UgYnJva2VyLiIiIgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRF
cnJvcgorCisgICAgICAgIGRlZiBjYW5jZWwoc2VsZik6CisgICAgICAgICAgICAiIiJCZXN0LWVm
Zm9ydCBhdHRlbXB0IHRvIG5vdGlmeSB0aGUgd29ya2VyIGl0IGhhcyBiZWVuIGNhbmNlbGxlZC4K
KworICAgICAgICAgICAgQ2FsbGVkIG9uIHRoZSBtYW5hZ2VyIHNpZGUgb2YgdGhlIGJyb2tlciwg
dGhpcyBzaG91bGQgYmUgYQorICAgICAgICAgICAgcGFzcy10aHJvdWdoIHRvIHRoZSB3b3JrZXIg
d2hlcmUgcG9zc2libGUuIiIiCisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9y
CisKKyAgICAgICAgIyBGSVhNRTogY2hhbmdlIHRoaXMgdG8gaXNfYWxpdmUgd2hlbiB3ZSdyZSBv
biAyLjYgb3IgbmV3ZXIgZXZlcnl3aGVyZS4KKyAgICAgICAgZGVmIGlzQWxpdmUoc2VsZik6Cisg
ICAgICAgICAgICAiIiIiUmV0dXJuIHdoZXRoZXIgdGhlIHdvcmtlciBpcyBzdGlsbCBydW5uaW5n
LgorCisgICAgICAgICAgICBVc2VkIG9ubHkgb24gdGhlIG1hbmFnZXIgc2lkZSBvZiB0aGUgYnJv
a2VyLiIiIgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAg
IGRlZiBqb2luKHNlbGYsIHRpbWVvdXQpOgorICAgICAgICAgICAgIiIiQmxvY2sgdGltZW91dCBz
ZWNvbmRzIG9yIHVudGlsIHRoZSB3b3JrZXIgaGFzIGV4aXRlZC4KKworICAgICAgICAgICAgQ2Fs
bGVkIG9ubHkgb24gdGhlIG1hbmFnZXIgc2lkZSBvZiB0aGUgYnJva2VyLiIiIgorICAgICAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAgIGRlZiBuYW1lKHNlbGYpOgor
ICAgICAgICAgICAgIiIiUmV0dXJucyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgd29ya2VyIGlu
IHF1ZXN0aW9uLgorCisgICAgICAgICAgICBDYWxsZWQgb24gYm90aCB0aGUgbWFuYWdlciBhbmQg
d29ya2VyIHNpZGVzIG9mIHRoZSBicm9rZXIsIHRoaXMKKyAgICAgICAgICAgIHNob3VsZCBiZSBh
IHBhc3MtdGhyb3VnaCB0byB0aGUgd29ya2VyIGNsaWVudCB3aGVyZSBwb3NzaWJsZS4iIiIKKyAg
ICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgICAgICBkZWYgb3B0aW9u
cyhzZWxmKToKKyAgICAgICAgICAgICIiIlJldHVybiB0aGUgb3B0aW9ucyBvYmplY3QgcGFzc2Vk
IHRvIGdldCgpLgorCisgICAgICAgICAgICBDYWxsZWQgb25seSBieSB0aGUgd29ya2VyLiIiIgor
ICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAgIGRlZiBwb3J0
KHNlbGYpOgorICAgICAgICAgICAgIiIiUmV0dXJuIHRoZSBwb3J0IG9iamVjdCBwYXNzZWQgdG8g
Z2V0KCkuCisKKyAgICAgICAgICAgIENhbGxlZCBvbmx5IGJ5IHRoZSB3b3JrZXIuIiIiCisgICAg
ICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICAgICAgZGVmIHBvc3RfbWVz
c2FnZShzZWxmLCBtZXNzYWdlX25hbWUsICptZXNzYWdlX2FyZ3MpOgorICAgICAgICAgICAgIiIi
UG9zdCBhIG1lc3NhZ2UgdG8gdGhlIHdvcmtlcl9yZXBseV9xdWV1ZS4KKworICAgICAgICAgICAg
VGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB3b3JrZXIuIiIiCisgICAgICAgICAgICByYWlz
ZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAg
ICAgICIiIkludm9rZSB0aGUgd29ya2VyJ3MgbWFpbiBlbnRyeSBwb2ludC4KKworICAgICAgICAg
ICAgQ2FsbGVkIG9uIHRoZSB3b3JrZXIgc2lkZSBvZiB0aGUgYnJva2VyLCB0aGlzIGlzIHVzdWFs
bHkgYQorICAgICAgICAgICAgd3JhcHBlciBhcm91bmQgdGhlIHdvcmtlciBjbGllbnQncyBydW4o
KSBtZXRob2QuIiIiCisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAg
ICAgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Aoc2VsZik6CisgICAgICAgICAgICAiIiJSdW4gdGhl
IHdvcmtlcidzIG1lc3NhZ2UvdGltZXIgbG9vcC4KKworICAgICAgICAgICAgVGhpcyBtZXRob2Qg
aXMgY2FsbGVkIGJ5IHRoZSB3b3JrZXIuIiIiCisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1l
bnRlZEVycm9yCisKKyAgICAgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICAgICAgIiIiU3Rh
cnQgdGhlIHdvcmtlciBydW5uaW5nLCBpZiBwb3NzaWJsZS4gRG8gbm90IGJsb2NrIHRoZSBjYWxs
ZXIuIiIiCisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICAgICAg
ZGVmIHlpZWxkX3RvX2Jyb2tlcihzZWxmKToKKyAgICAgICAgICAgICIiIiJDYXVzZXMgdGhlIHdv
cmtlciB0byB5aWVsZCBjb250cm9sIGZsb3cgYmFjayB0byB0aGUgYnJva2VyLgorCisgICAgICAg
ICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgcmVzcG9uc2l2ZW5lc3MgaWYgdGhlIHdv
cmtlciBpcworICAgICAgICAgICAgcHJvY2Vzc2luZyBzbG93IG1lc3NhZ2VzIChmb3IgZXhhbXBs
ZSwgJ3Rlc3RfbGlzdCcpIGFuZCB0aGVyZQorICAgICAgICAgICAgaXMgb25seSBvbmUgdGhyZWFk
IChpLmUuLCBpbmxpbmUgbW9kZSkgaW4gdGhlIG1lc3NhZ2UgYnJva2VyLiIiIgorICAgICAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgIyBTdWJjbGFzc2VzIG11c3Qgb3Zl
cnJpZGUgdGhpcyB2YWx1ZS4KKyAgICBfV09SS0VSX0NPTk5FQ1RJT05fQ0xBU1MgPSBfV29ya2Vy
Q29ubmVjdGlvbkludGVyZmFjZQorCisgICAgZGVmIHN0YXJ0X3dvcmtlcihzZWxmLCB3b3JrZXJf
bnVtYmVyKToKKyAgICAgICAgIiIiU3RhcnQgYSB3b3JrZXIgd2l0aCB0aGUgZ2l2ZW4gaW5kZXgg
bnVtYmVyLCBhbmQgcmV0dXJuIGl0cyBuYW1lLiIiIgorICAgICAgICB3b3JrZXIgPSBzZWxmLl9X
T1JLRVJfQ09OTkVDVElPTl9DTEFTUyhzZWxmLCBzZWxmLl93b3JrZXJfY2xhc3MsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9udW1iZXIpCisg
ICAgICAgIG5hbWUgPSB3b3JrZXIubmFtZSgpCisgICAgICAgIHdvcmtlci5zdGFydCgpCisgICAg
ICAgIHNlbGYuX2NoaWxkcmVuW25hbWVdID0gd29ya2VyCisgICAgICAgIHJldHVybiBuYW1lCisK
KyAgICBkZWYgY2FuY2VsX3dvcmtlcihzZWxmLCB3b3JrZXJfbmFtZSk6CisgICAgICAgICIiIkF0
dGVtcHQgdG8gY2FuY2VsIGEgd29ya2VyIChiZXN0LWVmZm9ydCkuIFRoZSB3b3JrZXIgbWF5IHN0
aWxsIGJlCisgICAgICAgIHJ1bm5pbmcgYWZ0ZXIgdGhpcyBjYWxsIHJldHVybnMuIiIiCisgICAg
ICAgIHJldHVybiBzZWxmLl9jaGlsZHJlblt3b3JrZXJfbmFtZV0uY2FuY2VsKCkKKworICAgIGRl
ZiBqb2luX3dvcmtlcihzZWxmLCB3b3JrZXJfbmFtZSwgdGltZW91dCk6CisgICAgICAgICIiIldh
aXQgdW50aWwgd29ya2VyIGV4aXRzIG9yIHRpbWVvdXQgb2NjdXJzLiIiIgorICAgICAgICByZXR1
cm4gc2VsZi5fY2hpbGRyZW5bd29ya2VyX25hbWVdLmpvaW4odGltZW91dCkKKworICAgIGRlZiB3
b3JrZXJfaXNfYWxpdmUoc2VsZiwgd29ya2VyX25hbWUpOgorICAgICAgICAiIiJSZXR1cm4gd2hl
dGhlciB0aGUgd29ya2VyIGlzIHN0aWxsIHJ1bm5pbmcuIiIiCisgICAgICAgIHJldHVybiBzZWxm
Ll9jaGlsZHJlblt3b3JrZXJfbmFtZV0uaXNBbGl2ZSgpCisKKyAgICBkZWYgbG9nX3dlZGdlZF93
b3JrZXIoc2VsZiwgd29ya2VyX25hbWUsIHRlc3RfbmFtZSk6CisgICAgICAgICIiIkxvZyBpbmZv
cm1hdGlvbiBhYm91dCB0aGUgZ2l2ZW4gd29ya2VyJ3Mgc3RhdGUuIiIiCisgICAgICAgIHJhaXNl
IE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBhZGRfdGltZXIoc2VsZiwgdG9waWNfbmFt
ZSwgY2FsbGJhY2ssIGRlbGF5X3NlY3MpOgorICAgICAgICAiIiJBZGQgYSB0aW1lciB0aGF0IHdp
bGwgZmlyZSBsYXRlciBkdXJpbmcgZHJhaW4oKSBvciBsb29wKCkuCisKKyAgICAgICAgVGltZXIg
Y2FsbGJhY2tzIHRha2Ugbm8gYXJndW1lbnRzLCBhbmQgc2hvdWxkIHJldHVybiBUcnVlIGlmZgor
ICAgICAgICBsb29wKCkgc2hvdWxkIGV4aXQuIEN1cnJlbnRseSB0aGUgY29kZSBvbmx5IHN1cHBv
cnRzIG9uZQorICAgICAgICB0aW1lciBwZXIgdG9waWMsIGJ1dCwgaW4gb3JkZXIgdG8gc3VwcG9y
dCBwZXJpb2RpYyBldmVudHMsCisgICAgICAgIGEgdGltZXIgY2FuIGJlIGFkZGVkIGZyb20gaW5z
aWRlIHRoZSBjYWxsIGJhY2suIiIiCisgICAgICAgIHRvcGljID0gc2VsZi5fZmluZF90b3BpYyh0
b3BpY19uYW1lKQorICAgICAgICBhc3NlcnQodG9waWMudGltZXIgaXMgTm9uZSkKKyAgICAgICAg
dG9waWMudGltZXIgPSBfVGltZXIoY2FsbGJhY2ssIGRlbGF5X3NlY3MpCisKKyAgICBkZWYgcG9z
dF9tZXNzYWdlKHNlbGYsIHNyYywgdG9waWNfbmFtZSwgbWVzc2FnZV9uYW1lLCBib2R5PU5vbmUp
OgorICAgICAgICAiIiJQb3N0IGEgbWVzc2FnZSB0byB0aGUgYXBwcm9wcmlhdGUgdG9waWMgcXVl
dWUuIiIiCisgICAgICAgIGJvZHkgPSBib2R5IG9yIHR1cGxlKCkKKyAgICAgICAgbWVzc2FnZSA9
IF9NZXNzYWdlKHNyYywgdG9waWNfbmFtZSwgbWVzc2FnZV9uYW1lLCBib2R5KQorICAgICAgICB0
b3BpYyA9IHNlbGYuX2ZpbmRfdG9waWModG9waWNfbmFtZSkKKyAgICAgICAgdG9waWMucXVldWUu
cHV0KF9NZXNzYWdlLmR1bXBzKG1lc3NhZ2UpKQorCisgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Ao
c2VsZiwgdG9waWNfbmFtZSwgcmVhZGVyKToKKyAgICAgICAgIiIiTG9vcCBwcm9jZXNzaW5nIG1l
c3NhZ2VzIGFuZCB0aW1lcnMgdW50aWwgZG9uZS4KKworICAgICAgICAiZG9uZSIgbWVhbnMgdGhh
dCByZWFkZXIuaXNfZG9uZSgpIHJldHVybnMgVHJ1ZSBvciBhIHRpbWVyIGluZGljYXRlcworICAg
ICAgICB0aGF0IHdlJ3JlIGRvbmUuIiIiCisgICAgICAgIHRvcGljID0gc2VsZi5fZmluZF90b3Bp
Yyh0b3BpY19uYW1lKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgIyBIZXJlIHdl
IGRvbid0IGNhcmUgaWYgd2UgZG8gd29yayBpbiB0aGUgdGltZXIuCisgICAgICAgICAgICBub3cg
PSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgXywgZG9uZSA9IHNlbGYuX2NoZWNrX3RpbWVyKHRv
cGljLCBub3cpCisgICAgICAgICAgICBpZiBkb25lIG9yIHJlYWRlci5pc19kb25lKCk6CisgICAg
ICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgUmUtY2hlY2sgdGhlIHRpbWUsIGlu
IGNhc2UgdGhlIHRpbWVyIGhhZCBhIHNsb3cgY2FsbGJhY2suCisgICAgICAgICAgICBub3cgPSB0
aW1lLnRpbWUoKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3RpbWVyX2V4cGlyZWQodG9waWMs
IG5vdyk6CisgICAgICAgICAgICAgICAgZGVsYXkgPSBzZWxmLl90aW1lcl9kZWxheSh0b3BpYywg
bm93KQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcyA9IHRvcGlj
LnF1ZXVlLmdldChibG9jaz1UcnVlLCB0aW1lb3V0PWRlbGF5KQorICAgICAgICAgICAgICAgICAg
ICBtc2cgPSBfTWVzc2FnZS5sb2FkcyhzKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kaXNw
YXRjaF9tZXNzYWdlKG1zZywgcmVhZGVyKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5F
bXB0eToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGRyYWluKHNlbGYsIHRv
cGljX25hbWUsIHJlYWRlcik6CisgICAgICAgICIiIkxvb3AgdW50aWwgd2UgcnVuIG91dCBvZiBz
dHVmZiB0byBkbyB3L28gYmxvY2tpbmcuCisKKyAgICAgICAgVGhpcyBtZWFucyB0aGVyZSBhcmUg
bm8gbWVzc2FnZXMgdG8gcHJvY2VzcyBhbmQgbm8gdGltZXJzIGFyZSBmaXJpbmcKKyAgICAgICAg
dGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorCisgICAgICAgIFJldHVy
bnMgd2hldGhlciBvciBub3Qgd2UgZGlkIGFueXRoaW5nIGF0IGFsbC4iIiIKKyAgICAgICAgdG9w
aWMgPSBzZWxmLl9maW5kX3RvcGljKHRvcGljX25hbWUpCisgICAgICAgIGRpZF93b3JrX29uX3Ro
aXNfcnVuID0gVHJ1ZQorICAgICAgICBkb25lID0gcmVhZGVyLmlzX2RvbmUoKQorICAgICAgICB3
aGlsZSBkaWRfd29ya19vbl90aGlzX3J1biBhbmQgbm90IGRvbmU6CisgICAgICAgICAgICBkaWRf
d29ya19vbl90aGlzX3J1biwgZG9uZSA9IHNlbGYuX2NoZWNrX3RpbWVyKHRvcGljLCB0aW1lLnRp
bWUoKSkKKyAgICAgICAgICAgIGRvbmUgPSBkb25lIG9yIHJlYWRlci5pc19kb25lKCkKKyAgICAg
ICAgICAgIGlmIGRvbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgdHJ5
OgorICAgICAgICAgICAgICAgIHMgPSB0b3BpYy5xdWV1ZS5nZXQoYmxvY2s9RmFsc2UpCisgICAg
ICAgICAgICAgICAgbXNnID0gX01lc3NhZ2UubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxm
Ll9kaXNwYXRjaF9tZXNzYWdlKG1zZywgcmVhZGVyKQorICAgICAgICAgICAgICAgIGRpZF93b3Jr
X29uX3RoaXNfcnVuID0gVHJ1ZQorICAgICAgICAgICAgICAgIGRvbmUgPSByZWFkZXIuaXNfZG9u
ZSgpCisgICAgICAgICAgICBleGNlcHQgUXVldWUuRW1wdHk6CisgICAgICAgICAgICAgICAgcGFz
cworCisgICAgICAgIHJldHVybiBkb25lCisKKyAgICBkZWYgX2NoZWNrX3RpbWVyKHNlbGYsIHRv
cGljLCBub3cpOgorICAgICAgICAiIiJDaGVjayBpZiBhbnkgdGltZXJzIG5lZWQgdG8gZmlyZSwg
YW5kIGZpcmUgdGhlbS4KKworICAgICAgICBSZXR1cm5zIGEgdHVwbGUgb2YgKHdoZXRoZXIgYSB0
aW1lciBmaXJlZCwgd2hldGhlciBhIHRpbWVyCisgICAgICAgICAgICByZXR1cm5lZCBUcnVlIHRv
IGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIGJhaWwgb3V0IG9mIHRoZSBhCisgICAgICAgICAgICBt
ZXNzYWdlIGxvb3AgaWYgbmVjZXNzYXJ5KS4iIiIKKyAgICAgICAgaWYgc2VsZi5fdGltZXJfZXhw
aXJlZCh0b3BpYywgbm93KToKKyAgICAgICAgICAgIHQgPSB0b3BpYy50aW1lcgorICAgICAgICAg
ICAgdG9waWMudGltZXIgPSBOb25lCisgICAgICAgICAgICBkb25lID0gdC5jYWxsYmFjaygpCisg
ICAgICAgICAgICByZXR1cm4gVHJ1ZSwgZG9uZQorICAgICAgICByZXR1cm4gRmFsc2UsIEZhbHNl
CisKKyAgICBkZWYgX3RpbWVyX2RlbGF5KHNlbGYsIHRvcGljLCBub3cpOgorICAgICAgICAiIiIi
UmV0dXJuIHRoZSB0aW1lIChpbiBzZWNzKSBmcm9tICdub3cnIHVudGlsIHRoZSB0aW1lciBmaXJl
cy4KKworICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSBuZWdhdGl2ZSwgaW5kaWNhdGlu
ZyB0aGF0IHRoZSB0aW1lciBoYXMKKyAgICAgICAgZXhwaXJlZCwgb3IgTm9uZSwgdG8gaW5kaWNh
dGUgdGhhdCB0aGVyZSBpcyBubyB0aW1lciBvbiB0aGUgdG9waWMKKyAgICAgICAgKGRlbGF5IGZv
cmV2ZXIpLiIiIgorICAgICAgICB0ID0gdG9waWMudGltZXIKKyAgICAgICAgaWYgdDoKKyAgICAg
ICAgICAgIHJldHVybiB0LmRlYWRsaW5lIC0gbm93CisgICAgICAgIHJldHVybiBOb25lCisKKyAg
ICBkZWYgX3RpbWVyX2V4cGlyZWQoc2VsZiwgdG9waWMsIG5vdyk6CisgICAgICAgICIiIlJldHVy
biB3aGV0aGVyIHRoZSB0b3BpYyBoYXMgYSB0aW1lciB3aG9zZSBkZWFkbGluZSBoYXMgcGFzc2Vk
LiIiIgorICAgICAgICB0ID0gdG9waWMudGltZXIKKyAgICAgICAgcmV0dXJuICh0IGlzIG5vdCBO
b25lKSBhbmQgbm93ID49IHQuZGVhZGxpbmUKKworICAgIGRlZiBfZGlzcGF0Y2hfbWVzc2FnZShz
ZWxmLCBtZXNzYWdlLCByZWFkZXIpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihyZWFkZXIsICdo
YW5kbGVfJyArIG1lc3NhZ2UubmFtZSk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAor
ICAgICAgICAgICAgICAgIiVzOiByZWNlaXZlZCBtZXNzYWdlICclcycgaXQgY291bGRuJ3QgaGFu
ZGxlIiAlCisgICAgICAgICAgICAgICAocmVhZGVyLm5hbWUoKSwgbWVzc2FnZS5uYW1lKSkKKyAg
ICAgICAgb3B0YXJncyA9IG1lc3NhZ2UuYm9keQorICAgICAgICBmbiA9IGdldGF0dHIocmVhZGVy
LCAnaGFuZGxlXycgKyBtZXNzYWdlLm5hbWUpCisgICAgICAgIGZuKG1lc3NhZ2Uuc3JjLCAqb3B0
YXJncykKKworCitjbGFzcyBfSW5saW5lQnJva2VyKF9Xb3JrZXJNZXNzYWdlQnJva2VyKToKKyAg
ICBjbGFzcyBfSW5saW5lV29ya2VyQ29ubmVjdGlvbihvYmplY3QpOgorICAgICAgICBkZWYgX19p
bml0X18oc2VsZiwgYnJva2VyLCB3b3JrZXJfY2xhc3MsIHdvcmtlcl9udW1iZXIpOgorICAgICAg
ICAgICAgc2VsZi5fYnJva2VyID0gYnJva2VyCisgICAgICAgICAgICBzZWxmLl9wb3J0ID0gYnJv
a2VyLl9wb3J0CisgICAgICAgICAgICBzZWxmLl9vcHRpb25zID0gYnJva2VyLl9vcHRpb25zCisg
ICAgICAgICAgICBzZWxmLl93b3JrZXIgPSB3b3JrZXJfY2xhc3Moc2VsZiwgd29ya2VyX251bWJl
cikKKworICAgICAgICBkZWYgY2FuY2VsKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYu
X3dvcmtlci5jYW5jZWwoKQorCisgICAgICAgIGRlZiBpc0FsaXZlKHNlbGYpOgorICAgICAgICAg
ICAgcmV0dXJuIHNlbGYuX2Jyb2tlci5fbWFuYWdlcgorCisgICAgICAgIGRlZiBqb2luKHNlbGYs
IHRpbWVvdXQpOgorICAgICAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLmlzQWxpdmUoKQorCisgICAg
ICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3dvcmtlci5uYW1l
KCkKKworICAgICAgICBkZWYgb3B0aW9ucyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxm
Ll9icm9rZXIuX29wdGlvbnMKKworICAgICAgICBkZWYgcG9ydChzZWxmKToKKyAgICAgICAgICAg
IHJldHVybiBzZWxmLl9icm9rZXIuX3BvcnQKKworICAgICAgICBkZWYgcG9zdF9tZXNzYWdlKHNl
bGYsIG1lc3NhZ2VfbmFtZSwgKm1lc3NhZ2VfYXJncyk6CisgICAgICAgICAgICBzZWxmLl9icm9r
ZXIucG9zdF9tZXNzYWdlKHNlbGYubmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWxmLl9icm9rZXIuX3dvcmtlcl9yZXBseV90b3BpYywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9uYW1lLCBtZXNzYWdlX2FyZ3MpCisK
KyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX3dvcmtlci5ydW4oKQor
CisgICAgICAgIGRlZiBydW5fbWVzc2FnZV9sb29wKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5f
YnJva2VyLnJ1bl9tZXNzYWdlX2xvb3Aoc2VsZi5fYnJva2VyLl93b3JrZXJfcnVuX3RvcGljLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd29ya2VyKQor
CisgICAgICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBk
ZWYgeWllbGRfdG9fYnJva2VyKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fYnJva2VyLmRyYWlu
KHNlbGYuX2Jyb2tlci5fd29ya2VyX3JlcGx5X3RvcGljLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHNlbGYuX2Jyb2tlci5fbWFuYWdlcikKKworICAgIF9XT1JLRVJfQ09OTkVDVElP
Tl9DTEFTUyA9IF9JbmxpbmVXb3JrZXJDb25uZWN0aW9uCisKKyAgICBkZWYgX19pbml0X18oc2Vs
ZiwgcG9ydCwgb3B0aW9ucywgd29ya2VyX2NsYXNzLCB3b3JrZXJfcnVuX3RvcGljLAorICAgICAg
ICAgICAgICAgICB3b3JrZXJfcmVwbHlfdG9waWMpOgorICAgICAgICBfV29ya2VyTWVzc2FnZUJy
b2tlci5fX2luaXRfXyhzZWxmLCBwb3J0LCBvcHRpb25zLCB3b3JrZXJfY2xhc3MsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9ydW5fdG9waWMsIHdvcmtlcl9y
ZXBseV90b3BpYykKKworICAgICAgICAjIFRoZSBtYW5hZ2VyIGlzIG9ubHkgdmFsaWQgd2hlbiB0
aGUgaW5saW5lZCB3b3JrZXIgaXMgInJ1bm5pbmciLAorICAgICAgICAjIG1lYW5pbmcgdGhhdCB3
ZSBhcmUgc2VydmljaW5nIGl0cyBtZXNzYWdlIHF1ZXVlLiBXZSBuZWVkIHRoaXMKKyAgICAgICAg
IyB2YXJpYWJsZSBzbyB5aWVsZF90b19icm9rZXIoKSB3aWxsIHdvcmsgcHJvcGVybHkuCisgICAg
ICAgIHNlbGYuX21hbmFnZXIgPSBOb25lCisKKyAgICBkZWYgbG9nX3dlZGdlZF93b3JrZXIoc2Vs
Ziwgd29ya2VyX25hbWUsIHRlc3RfbmFtZSk6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9y
KCJfSW5saW5lQnJva2VyLmxvZ193ZWRnZWRfd29ya2VyKCkgY2FsbGVkIikKKworICAgIGRlZiBy
dW5fbWVzc2FnZV9sb29wKHNlbGYsIHRvcGljX25hbWUsIHJlYWRlcik6CisgICAgICAgICMgV2Ug
bmVlZCBzcGVjaWFsIGxvZ2ljIGluIHRoZSBpbmxpbmUgY2FzZSBpbiBvcmRlciB0byBlbnN1cmUg
dGhhdAorICAgICAgICAjIHRoZSBtYW5hZ2VyIGFuZCB3b3JrZXJzIGFjdHVhbGx5IGJvdGggZ2V0
IHRvIHJ1biBwcm9wZXJseS4gVGhlcmUncworICAgICAgICAjIHByb2JhYmx5IGEgZmV3IHdheXMg
d2UgY291bGQgYWNjb21wbGlzaCB0aGlzLCBidXQgZm9yIG5vdyB3ZQorICAgICAgICAjIGhhdmUg
dGhlIG1hbmFnZXIgcnVuKCkgdGhlIHdvcmtlciBpbmxpbmUgdG8gY29tcGxldGlvbiwgYW5kIHRo
ZW4KKyAgICAgICAgIyBkcmFpbiBhbnkgcGVuZGluZyBldmVudHMgb24gdGhlIG1hbmFnZXIgdG9w
aWMuIFdlIGNvdW50IG9uIHRoZQorICAgICAgICAjIHdvcmtlciBjYWxsaW5nIHlpZWxkX3RvX2Jy
b2tlcigpIHBlcmlvZGljYWxseSBpbiBvcmRlciB0byBtYWtlCisgICAgICAgICMgc3VyZSB0aGUg
bWFuYWdlciBkb2Vzbid0IGdldCBzdGFydmVkLgorICAgICAgICBpZiB0b3BpY19uYW1lID09IHNl
bGYuX3dvcmtlcl9yZXBseV90b3BpYzoKKyAgICAgICAgICAgICMgTWFuYWdlci4gRG8gYXMganVz
dCBkZXNjcmliZWQuCisgICAgICAgICAgICBjaGlsZHJlbiA9IHNlbGYuX2NoaWxkcmVuLnZhbHVl
cygpCisgICAgICAgICAgICBpZiBjaGlsZHJlbjoKKyAgICAgICAgICAgICAgICBzZWxmLl9tYW5h
Z2VyID0gcmVhZGVyCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBj
aGlsZHJlblswXS5ydW4oKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAg
ICAgICAgIHNlbGYuX21hbmFnZXIgPSBOb25lCisKKyAgICAgICAgICAgIHRvcGljID0gc2VsZi5f
ZmluZF90b3BpYyh0b3BpY19uYW1lKQorICAgICAgICAgICAgd2hpbGUgdG9waWMudGltZXIgb3Ig
bm90IHRvcGljLnF1ZXVlLmVtcHR5KCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5kcmFpbih0
b3BpY19uYW1lLCByZWFkZXIpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAg
ICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgICAgICBpZiB0b3BpYy50aW1l
ciBhbmQgdG9waWMudGltZXIuZGVhZGxpbmUgPiBub3c6CisgICAgICAgICAgICAgICAgICAgIHRp
bWUuc2xlZXAodG9waWMudGltZXIuZGVhZGxpbmUgLSBub3cpCisgICAgICAgIGVsc2U6CisgICAg
ICAgICAgICAjIFRoaXMgaXMgYSB3b3JrZXIuIEluIHRoZSBpbmxpbmUgY2FzZSwgYSB3b3JrZXIg
bmV2ZXIgYmxvY2tzLAorICAgICAgICAgICAgIyBzbyB3ZSBjYW4gcnVuIHRoZSByZWd1bGFyIGxv
b3AgY29kZS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgRklYTUU6IFdlIGRvbid0IGFj
dHVhbGx5IGVuZm9yY2UgdGhpcywgc28gYSBidWdneSB3b3JrZXIgY291bGQKKyAgICAgICAgICAg
ICMgZGVhZGxvY2sgdGhlIHByb2Nlc3MuCisKKyAgICAgICAgICAgICMgRW5zdXJlIHRoaXMgaXMg
YmVpbmcgY2FsbGVkIG9ubHkgZnJvbSBpbnNpZGUgdGhlIG1hbmFnZXIgbG9vcC4KKyAgICAgICAg
ICAgIGFzc2VydCBzZWxmLl9tYW5hZ2VyIGlzIG5vdCBOb25lCisKKyAgICAgICAgICAgIF9Xb3Jr
ZXJNZXNzYWdlQnJva2VyLnJ1bl9tZXNzYWdlX2xvb3Aoc2VsZiwgdG9waWNfbmFtZSwgcmVhZGVy
KQorCisKK2NsYXNzIF9NdWx0aVRocmVhZGVkQnJva2VyKF9Xb3JrZXJNZXNzYWdlQnJva2VyKToK
KyAgICBjbGFzcyBfVGhyZWFkZWRXb3JrZXJDb25uZWN0aW9uKHRocmVhZGluZy5UaHJlYWQpOgor
ICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYnJva2VyLCB3b3JrZXJfY2xhc3MsIHdvcmtlcl9u
dW1iZXIpOgorICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAg
ICAgICAgICAgc2VsZi5fYnJva2VyID0gYnJva2VyCisgICAgICAgICAgICBzZWxmLl9wb3J0ID0g
YnJva2VyLl9wb3J0CisgICAgICAgICAgICBzZWxmLl9vcHRpb25zID0gYnJva2VyLl9vcHRpb25z
CisgICAgICAgICAgICBzZWxmLl93b3JrZXIgPSB3b3JrZXJfY2xhc3Moc2VsZiwgd29ya2VyX251
bWJlcikKKworICAgICAgICBkZWYgY2FuY2VsKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fd29y
a2VyLmNhbmNlbCgpCisKKyAgICAgICAgZGVmIGlzQWxpdmUoc2VsZik6CisgICAgICAgICAgICB0
aHJlYWRpbmcuVGhyZWFkLmlzQWxpdmUoc2VsZikKKworICAgICAgICBkZWYgam9pbihzZWxmLCB0
aW1lb3V0KToKKyAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQuam9pbihzZWxmLCB0aW1lb3V0
KQorCisgICAgICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3dv
cmtlci5uYW1lKCkKKworICAgICAgICBkZWYgb3B0aW9ucyhzZWxmKToKKyAgICAgICAgICAgIHJl
dHVybiBzZWxmLl9icm9rZXIuX29wdGlvbnMKKworICAgICAgICBkZWYgcG9ydChzZWxmKToKKyAg
ICAgICAgICAgIHJldHVybiBzZWxmLl9icm9rZXIuX3BvcnQKKworICAgICAgICBkZWYgcG9zdF9t
ZXNzYWdlKHNlbGYsIG1lc3NhZ2VfbmFtZSwgKm1lc3NhZ2VfYXJncyk6CisgICAgICAgICAgICBz
ZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKHNlbGYubmFtZSgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzZWxmLl9icm9rZXIuX3dvcmtlcl9yZXBseV90b3BpYywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9uYW1lLCBtZXNzYWdl
X2FyZ3MpCisKKyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgICMgRklYTUU6IHdl
IGNhbiByZW1vdmUgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIG9uIDIuNi4KKyAgICAgICAgICAgIGlm
IG5vdCBoYXNhdHRyKHNlbGYsICdpZGVudCcpOgorICAgICAgICAgICAgICAgIHNlbGYuaWRlbnQg
PSB0aHJlYWQuZ2V0X2lkZW50KCkKKyAgICAgICAgICAgIHNlbGYuX3dvcmtlci5ydW4oKQorCisg
ICAgICAgIGRlZiBydW5fbWVzc2FnZV9sb29wKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fYnJv
a2VyLnJ1bl9tZXNzYWdlX2xvb3Aoc2VsZi5fYnJva2VyLl93b3JrZXJfcnVuX3RvcGljLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd29ya2VyKQorCisg
ICAgICAgIGRlZiB5aWVsZF90b19icm9rZXIoc2VsZik6CisgICAgICAgICAgICAjIFRoZXJlJ3Mg
bm8gbmVlZCB0byB5aWVsZCB3aXRoIHRocmVhZHMuCisgICAgICAgICAgICBwYXNzCisKKyAgICBf
V09SS0VSX0NPTk5FQ1RJT05fQ0xBU1MgPSBfVGhyZWFkZWRXb3JrZXJDb25uZWN0aW9uCisKKyAg
ICBkZWYgbG9nX3dlZGdlZF93b3JrZXIoc2VsZiwgd29ya2VyX25hbWUsIHRlc3RfbmFtZSk6Cisg
ICAgICAgIHRocmVhZCA9IHNlbGYuX2NoaWxkcmVuW3dvcmtlcl9uYW1lXQorICAgICAgICB0aWQg
PSB0aHJlYWQuaWRlbnQKKyAgICAgICAgc3RhY2sgPSBzZWxmLl9maW5kX3RocmVhZF9zdGFjayh0
aWQpCisgICAgICAgIGFzc2VydChzdGFjayBpcyBub3QgTm9uZSkKKyAgICAgICAgX2xvZy5lcnJv
cigiJXMgKHRpZCAlZCkgaXMgd2VkZ2VkIG9uIHRlc3QgJXMiICUKKyAgICAgICAgICAgICAgICAg
ICAod29ya2VyX25hbWUsIHRpZCwgdGVzdF9uYW1lKSkKKyAgICAgICAgc2VsZi5fbG9nX3N0YWNr
KHN0YWNrKQorCisgICAgZGVmIF9maW5kX3RocmVhZF9zdGFjayhzZWxmLCB0aWQpOgorICAgICAg
ICAiIiJSZXR1cm5zIGEgc3RhY2sgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZHVtcCBhIHN0
YWNrIHRyYWNlIGZvcgorICAgICAgICB0aGUgZ2l2ZW4gdGhyZWFkIGlkIChvciBOb25lIGlmIHRo
ZSBpZCBpcyBub3QgZm91bmQpLiIiIgorICAgICAgICBmb3IgdGhyZWFkX2lkLCBzdGFjayBpbiBz
eXMuX2N1cnJlbnRfZnJhbWVzKCkuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHRocmVhZF9pZCA9
PSB0aWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrCisgICAgICAgIHJldHVybiBOb25l
CisKKyAgICBkZWYgX2xvZ19zdGFjayhzZWxmLCBzdGFjayk6CisgICAgICAgICIiIkxvZyBhIHN0
YWNrIHRyYWNlIHRvIGxvZy5lcnJvcigpLiIiIgorICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVu
bywgbmFtZSwgbGluZSBpbiB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayhzdGFjayk6CisgICAgICAg
ICAgICBfbG9nLmVycm9yKCdGaWxlOiAiJXMiLCBsaW5lICVkLCBpbiAlcycgJSAoZmlsZW5hbWUs
IGxpbmVubywgbmFtZSkpCisgICAgICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgICAgIF9s
b2cuZXJyb3IoJyAgJXMnICUgbGluZS5zdHJpcCgpKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9r
ZXIyX3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvbGF5b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9rZXIyX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjFjODJkNTIzMTc3ZjU3ZGNjOWRlMzIwYmY1MThkODY3M2FiZmEyZTEKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFj
a2FnZS9tZXNzYWdlX2Jyb2tlcjJfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwzNDYgQEAKKyMgQ29w
eXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgUXVl
dWUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gd2Vi
a2l0cHkuY29tbW9uLnN5c3RlbSBpbXBvcnQgb3V0cHV0Y2FwdHVyZQorCitpbXBvcnQgbWVzc2Fn
ZV9icm9rZXIyIGFzIG1lc3NhZ2VfYnJva2VyCisKKworZGVmIG1ha2Vfd29ya2VyX2NsYXNzKHN0
YXJ0aW5nX3F1ZXVlPU5vbmUsIHN0b3BwaW5nX3F1ZXVlPU5vbmUsIG1zZz0nZG9uZScpOgorICAg
IGNsYXNzIFRlc3RXb3JrZXIob2JqZWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJy
b2tlciwgd29ya2VyX251bWJlcik6CisgICAgICAgICAgICBzZWxmLl9icm9rZXIgPSBicm9rZXIK
KyAgICAgICAgICAgIHNlbGYuX3BvcnQgPSBicm9rZXIucG9ydCgpCisgICAgICAgICAgICBzZWxm
Ll9vcHRpb25zID0gYnJva2VyLm9wdGlvbnMoKQorICAgICAgICAgICAgc2VsZi5fd29ya2VyX251
bWJlciA9IHdvcmtlcl9udW1iZXIKKyAgICAgICAgICAgIHNlbGYuX25hbWUgPSAnVGVzdFdvcmtl
ci8lZCcgJSB3b3JrZXJfbnVtYmVyCisgICAgICAgICAgICBzZWxmLl9jYW5jZWxlZCA9IEZhbHNl
CisgICAgICAgICAgICBzZWxmLl9zdG9wcGVkID0gRmFsc2UKKworICAgICAgICBkZWYgY2FuY2Vs
KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fY2FuY2VsZWQgPSBUcnVlCisKKyAgICAgICAgZGVm
IGhhbmRsZV9zdG9wKHNlbGYsIHNyYyk6CisgICAgICAgICAgICBzZWxmLl9zdG9wcGVkID0gVHJ1
ZQorCisgICAgICAgIGRlZiBoYW5kbGVfdGVzdChzZWxmLCBzcmMsIGFuX2ludCwgYV9zdHIpOgor
ICAgICAgICAgICAgYXNzZXJ0IGFuX2ludCA9PSAxCisgICAgICAgICAgICBhc3NlcnQgYV9zdHIg
PT0gImhlbGxvLCB3b3JsZCIKKyAgICAgICAgICAgIHNlbGYuX2Jyb2tlci5wb3N0X21lc3NhZ2Uo
J3Rlc3QnLCAyLCAnaGksIGV2ZXJ5Ym9keScpCisKKyAgICAgICAgZGVmIGlzX2RvbmUoc2VsZik6
CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3RvcHBlZCBvciBzZWxmLl9jYW5jZWxlZAorCisg
ICAgICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKwor
ICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAg
IGlmIHN0YXJ0aW5nX3F1ZXVlOgorICAgICAgICAgICAgICAgICAgICBzdGFydGluZ19xdWV1ZS5w
dXQoJycpCisgICAgICAgICAgICAgICAgc2VsZi5fYnJva2VyLnJ1bl9tZXNzYWdlX2xvb3AoKQor
ICAgICAgICAgICAgICAgIHNlbGYuX2Jyb2tlci55aWVsZF90b19icm9rZXIoKQorICAgICAgICAg
ICAgICAgIGlmIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVz
c2FnZShtc2cpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAg
ICAgIHNlbGYuX2Jyb2tlci5wb3N0X21lc3NhZ2UoJ2V4Y2VwdGlvbicsICh0eXBlKGUpLCBzdHIo
ZSksIE5vbmUpKQorCisgICAgcmV0dXJuIFRlc3RXb3JrZXIKKworCitkZWYgZ2V0X29wdGlvbnMo
d29ya2VyX21vZGVsKToKKyAgICBvcHRpb25fbGlzdCA9IG1lc3NhZ2VfYnJva2VyLnJ1bnRpbWVf
b3B0aW9ucygpCisgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0
PW9wdGlvbl9saXN0KQorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdz
PVsnLS13b3JrZXItbW9kZWwnLCB3b3JrZXJfbW9kZWxdKQorICAgIHJldHVybiBvcHRpb25zCisK
KworZGVmIG1ha2VfYnJva2VyKG1hbmFnZXIsIHdvcmtlcl9tb2RlbCwgc3RhcnRpbmdfcXVldWU9
Tm9uZSwKKyAgICAgICAgICAgICAgICBzdG9wcGluZ19xdWV1ZT1Ob25lKToKKyAgICBvcHRpb25z
ID0gZ2V0X29wdGlvbnMod29ya2VyX21vZGVsKQorICAgIHdvcmtlcl9jbGFzcyA9IG1ha2Vfd29y
a2VyX2NsYXNzKHN0YXJ0aW5nX3F1ZXVlLCBzdG9wcGluZ19xdWV1ZSkKKyAgICByZXR1cm4gbWVz
c2FnZV9icm9rZXIuZ2V0KE5vbmUsIG9wdGlvbnMsIG1hbmFnZXIsIHdvcmtlcl9jbGFzcykKKwor
CitjbGFzcyBGdW5jdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9n
ZXRfX2lubGluZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1ha2VfYnJva2VyKHNl
bGYsICdpbmxpbmUnKSBpcyBub3QgTm9uZSkKKworICAgIGRlZiB0ZXN0X2dldF9fdGhyZWFkcyhz
ZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1ha2VfYnJva2VyKHNlbGYsICd0aHJlYWRz
JykgaXMgbm90IE5vbmUpCisKKyAgICBkZWYgdGVzdF9nZXRfX3Vua25vd24oc2VsZik6CisgICAg
ICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1ha2VfYnJva2VyLCBzZWxmLCAndW5r
bm93bicpCisKKworY2xhc3MgX1dvcmtlck1lc3NhZ2VCcm9rZXJUZXN0c01peGluKG9iamVjdCk6
CisgICAgIiIiTWl4aW4gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgc2VyaWVzIG9mIHRlc3RzIHRv
IGVuZm9yY2UgdGhlCisgICAgY29udHJhY3QgYWxsIF9Xb3JrZXJNZXNzYWdlQnJva2VyIGltcGxl
bWVudGF0aW9ucyBtdXN0IGZvbGxvdy4iIiIKKworICAgICMKKyAgICAjIE1ldGhvZHMgdG8gaW1w
bGVtZW50IHRoZSBNYW5hZ2VyIHNpZGUgb2YgdGhlIENsaWVudEludGVyZmFjZQorICAgICMKKyAg
ICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICdUZXN0ZXInCisKKyAgICBkZWYgaXNf
ZG9uZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvbmUKKworICAgICMKKyAgICAjIEhh
bmRsZXJzIGZvciB0aGUgbWVzc2FnZXMgdGhlIFRlc3RXb3JrZXIgbWF5IHNlbmQuCisgICAgIwor
ICAgIGRlZiBoYW5kbGVfZG9uZShzZWxmLCBzcmMpOgorICAgICAgICBzZWxmLl9kb25lID0gVHJ1
ZQorCisgICAgZGVmIGhhbmRsZV90ZXN0KHNlbGYsIHNyYywgYW5faW50LCBhX3N0cik6CisgICAg
ICAgIHNlbGYuX2FuX2ludCA9IGFuX2ludAorICAgICAgICBzZWxmLl9hX3N0ciA9IGFfc3RyCisK
KyAgICBkZWYgaGFuZGxlX2V4Y2VwdGlvbihzZWxmLCBzcmMsIGV4Y19pbmZvKToKKyAgICAgICAg
c2VsZi5fZXhjZXB0aW9uID0gZXhjX2luZm8KKyAgICAgICAgc2VsZi5fZG9uZSA9IFRydWUKKwor
ICAgICMKKyAgICAjIFRlc3RpbmcgaGVscGVyIG1ldGhvZHMKKyAgICAjCisgICAgZGVmIHNldFVw
KHNlbGYpOgorICAgICAgICBzZWxmLl9hbl9pbnQgPSBOb25lCisgICAgICAgIHNlbGYuX2Ffc3Ry
ID0gTm9uZQorICAgICAgICBzZWxmLl9icm9rZXIgPSBOb25lCisgICAgICAgIHNlbGYuX2RvbmUg
PSBGYWxzZQorICAgICAgICBzZWxmLl9leGNlcHRpb24gPSBOb25lCisgICAgICAgIHNlbGYuX3dv
cmtlcl9tb2RlbCA9IE5vbmUKKyAgICAgICAgc2VsZi5fdGltZXJfdmFsID0gMAorICAgICAgICBz
ZWxmLl90aW1lcl9tYXhfdmFsID0gMQorCisgICAgZGVmIG1ha2VfYnJva2VyKHNlbGYsIHN0YXJ0
aW5nX3F1ZXVlPU5vbmUsIHN0b3BwaW5nX3F1ZXVlPU5vbmUpOgorICAgICAgICBzZWxmLl9icm9r
ZXIgPSBtYWtlX2Jyb2tlcihzZWxmLCBzZWxmLl93b3JrZXJfbW9kZWwsIHN0YXJ0aW5nX3F1ZXVl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wcGluZ19xdWV1ZSkKKwor
ICAgIGRlZiBjYWxsYmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5fdGltZXJfdmFsICs9IDEKKyAg
ICAgICAgc2VsZi5fYnJva2VyLmFkZF90aW1lcihzZWxmLmNhbGxiYWNrLCAwLjAwNSkKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX3RpbWVyX3ZhbCA+PSBzZWxmLl90aW1lcl9tYXhfdmFsCisKKyAgICAj
CisgICAgIyBBY3R1YWwgdW5pdCB0ZXN0cworICAgICMKKyAgICBkZWYgdGVzdF9hZGRfdGltZXJf
X2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChzZWxmLl90aW1lcl92YWwsIDApCisgICAgICAgIHNlbGYuX2Jyb2tlci5hZGRf
dGltZXIoc2VsZi5jYWxsYmFjaywgMC4wMDUpCisgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVz
c2FnZV9sb29wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl90aW1lcl92YWwsIDEp
CisKKyAgICBkZWYgdGVzdF9hZGRfdGltZXJfX2V4cGlyZWQoc2VsZik6CisgICAgICAgIHNlbGYu
bWFrZV9icm9rZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3RpbWVyX3ZhbCwg
MCkKKyAgICAgICAgc2VsZi5fYnJva2VyLmFkZF90aW1lcihzZWxmLmNhbGxiYWNrLCAwKQorICAg
ICAgICBzZWxmLl9icm9rZXIucnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwoc2VsZi5fdGltZXJfdmFsLCAxKQorCisgICAgZGVmIHRlc3RfYWRkX3RpbWVyX190b29f
bWFueV90aW1lcnMoc2VsZik6CisgICAgICAgIHNlbGYubWFrZV9icm9rZXIoKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFsKHNlbGYuX3RpbWVyX3ZhbCwgMCkKKyAgICAgICAgc2VsZi5fYnJva2Vy
LmFkZF90aW1lcihzZWxmLmNhbGxiYWNrLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhB
c3NlcnRpb25FcnJvciwgc2VsZi5fYnJva2VyLmFkZF90aW1lciwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgc2VsZi5jYWxsYmFjaywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxm
Ll90aW1lcl92YWwsIDApCisKKyAgICBkZWYgdGVzdF9hZGRfdGltZXJfX3BlcmlvZGljKHNlbGYp
OgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgc2VsZi5fdGltZXJfbWF4X3Zh
bCA9IDIKKyAgICAgICAgc2VsZi5fYnJva2VyLmFkZF90aW1lcihzZWxmLmNhbGxiYWNrLCAwLjAw
NSkKKyAgICAgICAgc2VsZi5fYnJva2VyLnJ1bl9tZXNzYWdlX2xvb3AoKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKHNlbGYuX3RpbWVyX3ZhbCwgMikKKworICAgIGRlZiB0ZXN0X2NhbmNlbChz
ZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigpCisgICAgICAgIHdvcmtlcl9uYW1lID0g
c2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBzZWxmLl9icm9rZXIuY2FuY2Vs
X3dvcmtlcih3b3JrZXJfbmFtZSkKKyAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2FnZSgn
c3RvcCcpCisgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9sb29wKCkKKyAgICAgICAg
c2VsZi5fYnJva2VyLmpvaW5fd29ya2VyKHdvcmtlcl9uYW1lLCAwLjUpCisgICAgICAgIHNlbGYu
YXNzZXJ0RmFsc2Uoc2VsZi5fYnJva2VyLndvcmtlcl9pc19hbGl2ZSh3b3JrZXJfbmFtZSkpCisg
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2RvbmUoKSkKKworICAgIGRlZiB0ZXN0X2Rv
bmUoc2VsZik6CisgICAgICAgIHNlbGYubWFrZV9icm9rZXIoKQorICAgICAgICB3b3JrZXJfbmFt
ZSA9IHNlbGYuX2Jyb2tlci5zdGFydF93b3JrZXIoMCkKKyAgICAgICAgc2VsZi5fYnJva2VyLnBv
c3RfbWVzc2FnZSgndGVzdCcsIDEsICdoZWxsbywgd29ybGQnKQorICAgICAgICBzZWxmLl9icm9r
ZXIucG9zdF9tZXNzYWdlKCdzdG9wJykKKyAgICAgICAgc2VsZi5fYnJva2VyLnJ1bl9tZXNzYWdl
X2xvb3AoKQorICAgICAgICBzZWxmLl9icm9rZXIuam9pbl93b3JrZXIod29ya2VyX25hbWUsIDAu
NSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9icm9rZXIud29ya2VyX2lzX2FsaXZl
KHdvcmtlcl9uYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaXNfZG9uZSgpKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2FuX2ludCwgMikKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChzZWxmLl9hX3N0ciwgJ2hpLCBldmVyeWJvZHknKQorCisgICAgZGVmIHRlc3Rf
dW5rbm93bl9tZXNzYWdlKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAg
ICAgd29ya2VyX25hbWUgPSBzZWxmLl9icm9rZXIuc3RhcnRfd29ya2VyKDApCisgICAgICAgIHNl
bGYuX2Jyb2tlci5wb3N0X21lc3NhZ2UoJ3Vua25vd24nKQorICAgICAgICBzZWxmLl9icm9rZXIu
cnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgIHNlbGYuX2Jyb2tlci5qb2luX3dvcmtlcih3b3Jr
ZXJfbmFtZSwgMC41KQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2RvbmUoKSkK
KyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9icm9rZXIud29ya2VyX2lzX2FsaXZlKHdv
cmtlcl9uYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5fZXhjZXB0aW9uWzBd
LCBWYWx1ZUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLl9leGNlcHRpb25b
MV0sCisgICAgICAgICAgICAiVGVzdFdvcmtlci8wOiByZWNlaXZlZCBtZXNzYWdlICd1bmtub3du
JyBpdCBjb3VsZG4ndCBoYW5kbGUiKQorCisKK2NsYXNzIElubGluZUJyb2tlclRlc3RzKF9Xb3Jr
ZXJNZXNzYWdlQnJva2VyVGVzdHNNaXhpbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBz
ZXRVcChzZWxmKToKKyAgICAgICAgX1dvcmtlck1lc3NhZ2VCcm9rZXJUZXN0c01peGluLnNldFVw
KHNlbGYpCisgICAgICAgIHNlbGYuX3dvcmtlcl9tb2RlbCA9ICdpbmxpbmUnCisKKyAgICBkZWYg
dGVzdF9sb2dfd2VkZ2VkX3dvcmtlcihzZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigp
CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBzZWxmLl9icm9rZXIu
bG9nX3dlZGdlZF93b3JrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUp
CisKKworY2xhc3MgVGhyZWFkZWRCcm9rZXJUZXN0cyhfV29ya2VyTWVzc2FnZUJyb2tlclRlc3Rz
TWl4aW4sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAg
IF9Xb3JrZXJNZXNzYWdlQnJva2VyVGVzdHNNaXhpbi5zZXRVcChzZWxmKQorICAgICAgICBzZWxm
Ll93b3JrZXJfbW9kZWwgPSAndGhyZWFkcycKKworICAgIGRlZiB0ZXN0X2ZpbmRfdGhyZWFkX3N0
YWNrX2ZvdW5kKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgaWQs
IHN0YWNrID0gc3lzLl9jdXJyZW50X2ZyYW1lcygpLml0ZW1zKClbMF0KKyAgICAgICAgZm91bmRf
c3RhY2sgPSBzZWxmLl9icm9rZXIuX2ZpbmRfdGhyZWFkX3N0YWNrKGlkKQorICAgICAgICBzZWxm
LmFzc2VydE5vdEVxdWFsKGZvdW5kX3N0YWNrLCBOb25lKQorCisgICAgZGVmIHRlc3RfZmluZF90
aHJlYWRfc3RhY2tfbm90X2ZvdW5kKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkK
KyAgICAgICAgZm91bmRfc3RhY2sgPSBzZWxmLl9icm9rZXIuX2ZpbmRfdGhyZWFkX3N0YWNrKDAp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91bmRfc3RhY2ssIE5vbmUpCisKKyAgICBkZWYg
dGVzdF9sb2dfd2VkZ2VkX3dvcmtlcihzZWxmKToKKyAgICAgICAgc3RhcnRpbmdfcXVldWUgPSBR
dWV1ZS5RdWV1ZSgpCisgICAgICAgIHN0b3BwaW5nX3F1ZXVlID0gUXVldWUuUXVldWUoKQorICAg
ICAgICBzZWxmLm1ha2VfYnJva2VyKHN0YXJ0aW5nX3F1ZXVlLCBzdG9wcGluZ19xdWV1ZSkKKyAg
ICAgICAgb2MgPSBvdXRwdXRjYXB0dXJlLk91dHB1dENhcHR1cmUoKQorICAgICAgICBvYy5jYXB0
dXJlX291dHB1dCgpCisKKyAgICAgICAgd29ya2VyX25hbWUgPSBzZWxmLl9icm9rZXIuc3RhcnRf
d29ya2VyKDApCisgICAgICAgIHN0YXJ0aW5nX3F1ZXVlLmdldCgpCisgICAgICAgIHNlbGYuX2Jy
b2tlci5sb2dfd2VkZ2VkX3dvcmtlcih3b3JrZXJfbmFtZSwgJ3Rlc3RfbmFtZScpCisgICAgICAg
IHN0b3BwaW5nX3F1ZXVlLnB1dCgnJykKKyAgICAgICAgb2MucmVzdG9yZV9vdXRwdXQoKQorCisK
K2NsYXNzIE1lc3NhZ2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fbm9f
Ym9keShzZWxmKToKKyAgICAgICAgbXNnID0gbWVzc2FnZV9icm9rZXIuX01lc3NhZ2UoJ3NyYycs
ICd0b3BpY19uYW1lJywgJ21lc3NhZ2VfbmFtZScsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0
VHJ1ZShyZXByKG1zZykpCisgICAgICAgIHMgPSBtc2cuZHVtcHMoKQorICAgICAgICBuZXdfbXNn
ID0gbWVzc2FnZV9icm9rZXIuX01lc3NhZ2UubG9hZHMocykKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbChuZXdfbXNnLm5hbWUsICdtZXNzYWdlX25hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKG5ld19tc2cuYm9keSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfbXNn
LnRvcGljX25hbWUsICd0b3BpY19uYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdf
bXNnLnNyYywgJ3NyYycpCisKKyAgICBkZWYgdGVzdF9fYm9keShzZWxmKToKKyAgICAgICAgbXNn
ID0gbWVzc2FnZV9icm9rZXIuX01lc3NhZ2UoJ3NyYycsICd0b3BpY19uYW1lJywgJ21lc3NhZ2Vf
bmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYm9keScsIDAp
KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihtc2cpKQorICAgICAgICBzID0gbXNnLmR1
bXBzKCkKKyAgICAgICAgbmV3X21zZyA9IG1lc3NhZ2VfYnJva2VyLl9NZXNzYWdlLmxvYWRzKHMp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X21zZy5uYW1lLCAnbWVzc2FnZV9uYW1lJykK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfbXNnLmJvZHksICgnYm9keScsIDApKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19tc2cudG9waWNfbmFtZSwgJ3RvcGljX25hbWUnKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19tc2cuc3JjLCAnc3JjJykKKworCitjbGFzcyBJ
bnRlcmZhY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoZXNlIHRlc3RzIG1vc3Rs
eSBleGlzdCB0byBwYWNpZnkgY292ZXJhZ2UuCisKKyAgICAjIEZJWE1FOiBUaGVyZSBtdXN0IGJl
IGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIGFuZCBhbHNvIHZlcmlmeQorICAgICMgdGhhdCBjbGFz
c2VzIGRvIGltcGxlbWVudCBldmVyeSBhYnN0cmFjdCBtZXRob2QgaW4gYW4gaW50ZXJmYWNlLgor
CisgICAgZGVmIHRlc3Rfd29ya2VyY29ubmVjdGlvbmludGVyZmFjZV9pc19hYnN0cmFjdChzZWxm
KToKKyAgICAgICAgIyBUZXN0IHRoYXQgd2UgY2FuJ3QgY3JlYXRlIGFuIGluc3RhbmNlIGRpcmVj
dGx5LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLAorICAg
ICAgICAgICAgbWVzc2FnZV9icm9rZXIuX1dvcmtlck1lc3NhZ2VCcm9rZXIuX1dvcmtlckNvbm5l
Y3Rpb25JbnRlcmZhY2UsCisgICAgICAgICAgICBicm9rZXI9Tm9uZSwgd29ya2VyX2NsYXNzPU5v
bmUsIHdvcmtlcl9udW1iZXI9Tm9uZSkKKworICAgICAgICBjbGFzcyBXb3JrZXJDb25uZWN0aW9u
KG1lc3NhZ2VfYnJva2VyLl9Xb3JrZXJNZXNzYWdlQnJva2VyLl9Xb3JrZXJDb25uZWN0aW9uSW50
ZXJmYWNlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqb3B0YXJncyk6CisgICAg
ICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgVGVzdCB0aGF0IGFsbCB0aGUgYmFzZSBjbGFz
cyBtZXRob2RzIGFyZSBhYnN0cmFjdCBhbmQgaGF2ZSB0aGUKKyAgICAgICAgIyBzaWduYXR1cmUg
d2UgZXhwZWN0LgorICAgICAgICBvYmogPSBXb3JrZXJDb25uZWN0aW9uKCkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLmNhbmNlbCkKKyAgICAgICAg
c2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLmlzQWxpdmUpCisgICAg
ICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5qb2luLCBOb25l
KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmoubmFt
ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLnBv
cnQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5v
cHRpb25zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBv
YmoucG9zdF9tZXNzYWdlLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhO
b3RJbXBsZW1lbnRlZEVycm9yLCBvYmoucnVuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhO
b3RJbXBsZW1lbnRlZEVycm9yLCBvYmoucnVuX21lc3NhZ2VfbG9vcCkKKyAgICAgICAgc2VsZi5h
c3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLnN0YXJ0KQorICAgICAgICBzZWxm
LmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmoueWllbGRfdG9fYnJva2VyKQor
CisgICAgZGVmIHRlc3RfYnJva2VyY2xpZW50aW50ZXJmYWNlX2lzX2Fic3RyYWN0KHNlbGYpOgor
ICAgICAgICAjIFRlc3QgdGhhdCB3ZSBjYW4ndCBjcmVhdGUgYW4gaW5zdGFuY2UgZGlyZWN0bHku
CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAg
ICAgICBtZXNzYWdlX2Jyb2tlci5DbGllbnRJbnRlcmZhY2UsCisgICAgICAgICAgICBicm9rZXJf
Y29ubmVjdGlvbj1Ob25lLCB3b3JrZXJfbnVtYmVyPU5vbmUpCisKKyAgICAgICAgY2xhc3MgV29y
a2VyQ2xpZW50KG1lc3NhZ2VfYnJva2VyLkNsaWVudEludGVyZmFjZSk6CisgICAgICAgICAgICBk
ZWYgX19pbml0X18oc2VsZiwgKm9wdGFyZ3MpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAg
ICAgICAjIFRlc3QgdGhhdCBhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kcyBhcmUgYWJzdHJhY3Qg
YW5kIGhhdmUgdGhlCisgICAgICAgICMgc2lnbmF0dXJlIHdlIGV4cGVjdC4KKyAgICAgICAgb2Jq
ID0gV29ya2VyQ2xpZW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50
ZWRFcnJvciwgb2JqLmNhbmNlbCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVt
ZW50ZWRFcnJvciwgb2JqLm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxl
bWVudGVkRXJyb3IsIG9iai5pc19kb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJ
bXBsZW1lbnRlZEVycm9yLCBvYmoucnVuKQorCisgICAgZGVmIHRlc3RfbG9nX3dlZGdlZF93b3Jr
ZXIoc2VsZik6CisgICAgICAgIGJyb2tlciA9IG1lc3NhZ2VfYnJva2VyLl9Xb3JrZXJNZXNzYWdl
QnJva2VyKE5vbmUsIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFp
c2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGJyb2tlci5sb2dfd2VkZ2VkX3dvcmtlciwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgTm9uZSwgTm9uZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19t
YWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75763</attachid>
            <date>2010-12-06 17:40:42 -0800</date>
            <delta_ts>2010-12-14 20:46:36 -0800</delta_ts>
            <desc>update w/ review feedback</desc>
            <filename>bug-50557-20101206174040.patch</filename>
            <type>text/plain</type>
            <size>39580</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAyZGU1OWU3YWQwMTkwZWQ3YjM0YzhkZjVkNjRlMzBlYmY3MWYxNjQ5Li41NTc0YTIz
ZWE1NWI5MDkzM2U2ZTg4OWQ0Zjc4OTA3MWQ4MWU0NDJiIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMTAtMTItMDYgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBjaGFuZ2UgYWRk
cyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlX2Jyb2tlciBwYWNrYWdlCisgICAgICAgIHRo
YXQgYWN0dWFsbHkgZG9lcyBtZXNzYWdpbmcuIFRvIHNpbXBsaWZ5IHJldmlld2luZyB0aGUgbmV4
dAorICAgICAgICBjb3VwbGUgcGF0Y2hlcywgdGhpcyBpcyBiZWluZyBhZGRlZCBhcyBhIHNlcGFy
YXRlIGZpbGUgZm9yIG5vdy4KKyAgICAgICAgVWx0aW1hdGVseSBtZXNzYWdlX2Jyb2tlci5weSB3
aWxsIGJlIHJlbW92ZWQgYW5kIHRoaXMgZmlsZSB3aWxsCisgICAgICAgIGJlIHJlbmFtZWQuCisK
KyAgICAgICAgVGhpcyBwYXRjaCBkZXBlbmRzIG9uIGJ1ZyA1MDM3NC4KKworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTA1NTcKKworICAgICAgICAqIFNj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21lc3NhZ2VfYnJva2Vy
Mi5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5
b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9rZXIyX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKwogMjAxMC0x
Mi0wMiAgRGlyayBQcmFua2UgIDxkcHJhbmtlQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBUb255IENoYW5nLgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9rZXIyLnB5IGIvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWVz
c2FnZV9icm9rZXIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjM4OTVhMmJkZDI1NWMxZTdhZjI3NDlmMDNjNTFi
ZDNmYzJmNzJiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9tZXNzYWdlX2Jyb2tlcjIucHkKQEAgLTAs
MCArMSw2NTQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMg
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBk
aXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisj
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisj
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJNb2R1bGUgZm9yIGhhbmRsaW5nIG1l
c3NhZ2VzIGFuZCBjb25jdXJyZW5jeSBmb3IgcnVuLXdlYmtpdC10ZXN0cy4KKworVGVzdGluZyBp
cyBhY2NvbXBsaXNoZWQgYnkgaGF2aW5nIGEgbWFuYWdlciAoVGVzdFJ1bm5lcikgZ2F0aGVyIGFs
bCBvZiB0aGUKK3Rlc3RzIHRvIGJlIHJ1biwgYW5kIHNlbmRpbmcgbWVzc2FnZXMgdG8gYSBwb29s
IG9mIHdvcmtlcnMgKFRlc3RTaGVsbFRocmVhZHMpCit0byBydW4gZWFjaCB0ZXN0LiBFYWNoIHdv
cmtlciBjb21tdW5pY2F0ZXMgd2l0aCBvbmUgZHJpdmVyICh1c3VhbGx5CitEdW1wUmVuZGVyVHJl
ZSkgdG8gcnVuIG9uZSB0ZXN0IGF0IGEgdGltZSBhbmQgdGhlbiBjb21wYXJlIHRoZSBvdXRwdXQg
YWdhaW5zdAord2hhdCB3ZSBleHBlY3RlZCB0byBnZXQuCisKK1RoaXMgbW9kdWxlcyBpbXBsZW1l
bnRzIGEgbWVzc2FnZSBicm9rZXIgdGhhdCBjb25uZWN0cyB0aGUgbWFuYWdlciB0byB0aGUKK3dv
cmtlcnM6IGl0IHByb3ZpZGVzIGEgbWVzc2FnaW5nIGFic3RyYWN0aW9uIGFuZCBtZXNzYWdlIGxv
b3BzLCBhbmQKK2hhbmRsZXMgbGF1bmNoaW5nIHRocmVhZHMgYW5kL29yIHByb2Nlc3NlcyBkZXBl
bmRpbmcgb24gdGhlIHJlcXVlc3RlZAorY29uZmlndXJhdGlvbi4KKworQm90aCBNYW5hZ2VycyBh
bmQgV29ya2VycyBhcmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoZSBtZXRob2RzIGluIHRoZQor
QnJva2VyQ2xpZW50IGludGVyZmFjZSAvIGFic3RyYWN0IGJhc2UgY2xhc3MgaW4gb3JkZXIgdG8g
dGhlIG1lc3NhZ2UKK2Jyb2tlciB0byBwcm9wZXJseSBjb21tdW5pY2F0ZSB3aXRoIHRoZW0uCisK
K0V2ZXJ5dGhpbmcgc3RhcnRzIGJ5IGNhbGxpbmcgZ2V0KCkgdG8gb2J0YWluIGFuIGluaXRpYWwg
cmVmZXJlbmNlIHRvIGEgYnJva2VyLgorVGhlIGJyb2tlciBpcyBtZWRpYXRlZCBieSBhIENvbm5l
Y3Rpb24gb2JqZWN0IHRoYXQgcHJvdmlkZXMgc29tZSBzeW50YWN0aWMKK3N1Z2FyIHRvIHJlcHJl
c2VudCB0aGUgTWFuYWdlciBhbmQgV29ya2VyIGVuZHBvaW50cy4gVHlwaWNhbGx5IHRoZQorbWFu
YWdlciB0aGVuIGNhbGxzIHN0YXJ0X3dvcmtlcigpIHJlcGVhdGVkbHkgdG8gbGF1bmNoIHdvcmtl
cnMgKHdoaWNoIGFyZQordXN1YWxseSBydW4gaW4gc2VwYXJhdGUgdGhyZWFkcyBvciBwcm9jZXNz
ZXMgYXMgY29udHJvbGxlZCBieSB0aGUKKy0td29ya2VyLW1vZGVsIHJ1bnRpbWUgZmxhZyksIG9w
dGlvbmFsbHkgc2V0cyB1cCBzb21lIHRpbWVycywgYW5kIHRoZW4KK2ludm9rZXMgcnVuX21lc3Nh
Z2VfbG9vcCgpLgorIiIiCisKKyMgRklYTUU6IFRoaXMgcGFja2FnZSBzaG91bGQgcHJvYmFibHkg
YXQgbGVhc3QgYmUgc3BsaXQgaW50byB0d28gc2VwYXJhdGUKKyMgY2xhc3NlcyB0byBzZXBhcmF0
ZSBvdXQgdGhlICJ3b3JrZXIgcG9vbCIgY29uY2VwdCBhbmQgdGhlIGFjdHVhbAorIyBtZXNzYWdl
IGJyb2tlciBsb2dpYywgd2hpY2ggZG9lc24ndCByZWFsbHkgY2FyZSBob3cgdGhlIHdvcmtlcnMg
YXJlCisjIGltcGxlbWVudGVkLgorCitpbXBvcnQgY1BpY2tsZQoraW1wb3J0IGxvZ2dpbmcKK2lt
cG9ydCBvcHRwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgUXVldWUKK2ltcG9ydCBzeXMKK2ltcG9y
dCB0aHJlYWQKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNr
CisKK19sb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworIworIyBUb3BpYyBuYW1l
cyBmb3IgdGhlIG1lc3NhZ2UgcXVldWVzLgorIworTUFOQUdFUl9UT1BJQyA9ICdtYW5hZ2VyJwor
QU5ZX1dPUktFUl9UT1BJQyA9ICd3b3JrZXInCisKKworZGVmIHJ1bnRpbWVfb3B0aW9ucygpOgor
ICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygb3B0cGFyc2UuT3B0aW9uIG9iamVjdHMgZm9yIGFueSBy
dW50aW1lIHZhbHVlcyB1c2VkCisgICAgYnkgdGhpcyBtZXRob2QuIiIiCisgICAgb3B0aW9ucyA9
IFsKKyAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0td29ya2VyLW1vZGVsIiwgYWN0aW9u
PSJzdG9yZSIsCisgICAgICAgICAgICBoZWxwPSgiY29udHJvbHMgd29ya2VyIG1vZGVsLiBWYWxp
ZCB2YWx1ZXMgYXJlICIKKyAgICAgICAgICAgICInaW5saW5lJyBhbmQgJ3RocmVhZHMnLiIpKSwK
KyAgICBdCisgICAgcmV0dXJuIG9wdGlvbnMKKworCitkZWYgZ2V0KHBvcnQsIG9wdGlvbnMsIG1h
bmFnZXIsIHdvcmtlcl9jbGFzcyk6CisgICAgIiIiUmV0dXJuIGEgY29ubmVjdGlvbiB0byBhIG1h
bmFnZXIvd29ya2VyIG1lc3NhZ2UgYnJva2VyCisKKyAgICBBcmdzOgorICAgICAgICBwb3J0IC0g
aGFuZGxlIHRvIGxheW91dF90ZXN0cy9wb3J0IG9iamVjdCBmb3IgcG9ydC1zcGVjaWZpYyBzdHVm
ZgorICAgICAgICBvcHRpb25zIC0gb3B0cGFyc2UgYXJndW1lbnQgZm9yIGNvbW1hbmQtbGluZSBv
cHRpb25zCisgICAgICAgIG1hbmFnZXIgLSBvYmplY3QgdG8gZGlzcGF0Y2ggcmVwbGllcyB0bwor
ICAgICAgICB3b3JrZXJfY2xhc3MgLSB0eXBlIG9mIHdvcmtlcnMgdG8gY3JlYXRlLiBUaGlzIGNs
YXNzIG11c3QgaW1wbGVtZW50CisgICAgICAgICAgICB0aGUgbWV0aG9kcyBpbiB0aGUgQ2xpZW50
SW50ZXJmYWNlLgorICAgIFJldHVybnM6CisgICAgICAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB0
aGF0IHdpbGwgdGFsayB0byBhIG1lc3NhZ2UgYnJva2VyIGNvbmZpZ3VyZWQKKyAgICAgICAgZm9y
IHRoZSBub3JtYWwgbWFuYWdlci93b3JrZXIgY29tbXVuaWNhdGlvbi4KKyAgICAiIiIKKyAgICBi
cm9rZXIgPSBfZ2V0X2Jyb2tlcihwb3J0LCBvcHRpb25zLCBtYW5hZ2VyLCB3b3JrZXJfY2xhc3Ms
CisgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZX1dPUktFUl9UT1BJQywgTUFOQUdFUl9UT1BJ
QykKKyAgICByZXR1cm4gX01hbmFnZXJDb25uZWN0aW9uKGJyb2tlciwgbWFuYWdlcikKKworCitj
bGFzcyBDbGllbnRJbnRlcmZhY2Uob2JqZWN0KToKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNz
IC8gaW50ZXJmYWNlIHRoYXQgYWxsIG1lc3NhZ2UgYnJva2VyIGNsaWVudHMgbXVzdAorICAgIGlt
cGxlbWVudC4gSW4gYWRkaXRpb24gdG8gdGhlIG1ldGhvZHMgYmVsb3csIGJ5IGNvbnZlbnRpb24g
Y2xpZW50cworICAgIGltcGxlbWVudCByb3V0aW5lcyBvZiB0aGUgc2lnbmF0dXJlIHR5cGUKKwor
ICAgICAgICBoYW5kbGVfTUVTU0FHRV9OQU1FKHNlbGYsIHNyYywgLi4uKToKKworICAgIHdoZXJl
IE1FU1NBR0VfTkFNRSBtYXRjaGVzIHRoZSBzdHJpbmcgcGFzc2VkIHRvIHBvc3RfbWVzc2FnZSgp
LCBhbmQKKyAgICBzcmMgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZSBzZW5kZXIuIElmIHRoZSBt
ZXNzYWdlIGNvbnRhaW5zIHZhbHVlcyBpbgorICAgIHRoZSBtZXNzYWdlIGJvZHksIHRob3NlIHdp
bGwgYmUgcHJvdmlkZWQgYXMgb3B0cGFyYW1zLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYs
IGJyb2tlcl9jb25uZWN0aW9uLCB3b3JrZXJfbnVtYmVyKToKKyAgICAgICAgcmFpc2UgTm90SW1w
bGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGNhbmNlbChzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVk
IChpZiBwb3NzaWJsZSkgdG8gbm90aWZ5IHRoZSB3b3JrZXIgdGhhdCBpdCBoYXMgYmVlbiBhYm9y
dGVkLgorCisgICAgICAgIE9ubHkgd29ya2VycyBuZWVkIGltcGxlbWVudCB0aGlzIG1ldGhvZC4g
V29ya2VycyBjYW5ub3QgcmVseSBvbiB0aGlzCisgICAgICAgIG1ldGhvZCBhbHdheXMgYmVpbmcg
Y2FsbGVkLiBGb3IgZXhhbXBsZSwgd29ya2VycyBydW5uaW5nIGluIHRoZWlyCisgICAgICAgIG93
biBwcm9jZXNzZXMgbWF5IGJlIGtpbGxlZCBkaXJlY3RseSBpbnN0ZWFkIG9mIGludm9raW5nIHRo
aXMgbWV0aG9kCisgICAgICAgIGFuZCB3YWl0aW5nIGZvciB0aGUgdGhlIHdvcmtlciB0byBleGl0
LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgaXNfZG9u
ZShzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVkIGZyb20gaW5zaWRlIHJ1bl9tZXNzYWdlX2xvb3Ao
KSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGV4aXQuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxl
bWVudGVkRXJyb3IKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBu
YW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgd29ya2VyIG9yIG1hbmFnZXIuIiIiCisgICAgICAgIHJh
aXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICIi
Ik9ubHkgd29ya2VycyBuZWVkIGltcGxlbWVudCB0aGlzIG1ldGhvZC4iIiIKKyAgICAgICAgcmFp
c2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKK2NsYXNzIF9NYW5hZ2VyQ29ubmVjdGlvbihvYmpl
Y3QpOgorICAgICIiIlRoaXMgY2xhc3MgaGFuZGxlcyBhIGNvbm5lY3Rpb24gdG8gYSBtZXNzYWdl
IGJyb2tlciB0aGF0IGlzIHNldCB1cAorICAgIHRvIHNlbmQgbWVzc2FnZXMgdG8gYSBXb3JrZXIg
cXVldWUgYXMgYSBNYW5hZ2VyLiBJdCBpcyBwcm92aWRlZCBhcyBhCisgICAgY29udmVuaWVuY2Ug
YW5kIHRvIGVuY2Fwc3VsYXRlIHRoZSBnZW5lcmljIG1lc3NhZ2UgYnJva2VyLiIiIgorCisgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlciwgbWFuYWdlcik6CisgICAgICAgIHNlbGYuX2Jyb2tl
ciA9IGJyb2tlcgorICAgICAgICBzZWxmLl9tYW5hZ2VyID0gbWFuYWdlcgorCisgICAgZGVmIF9f
Z2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAjIFRoaXMgbWV0aG9kIGNhdXNlcyBhbnkg
bWV0aG9kIHdlIGRvbid0IGRpcmVjdGx5IGltcGxlbWVudAorICAgICAgICAjIHRvIHRoZSBicm9r
ZXIuCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX2Jyb2tlciwgbmFtZSkKKworICAgIGRl
ZiBwb3N0X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9uYW1lLCAqbWVzc2FnZV9hcmdzKToKKyAgICAg
ICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2FnZShzZWxmLl9tYW5hZ2VyLm5hbWUoKSwgQU5ZX1dP
UktFUl9UT1BJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX25h
bWUsIG1lc3NhZ2VfYXJncykKKworICAgIGRlZiBhZGRfdGltZXIoc2VsZiwgY2FsbGJhY2ssIGRl
bGF5X3NlY3MpOgorICAgICAgICBzZWxmLl9icm9rZXIuYWRkX3RpbWVyKE1BTkFHRVJfVE9QSUMs
IGNhbGxiYWNrLCBkZWxheV9zZWNzKQorCisgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Aoc2VsZik6
CisgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9sb29wKE1BTkFHRVJfVE9QSUMsIHNl
bGYuX21hbmFnZXIpCisKKyAgICBkZWYgc3RhcnRfd29ya2VyKHNlbGYsIHdvcmtlcl9udW1iZXIp
OgorICAgICAgICByZXR1cm4gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcih3b3JrZXJfbnVtYmVy
KQorCisKK2RlZiBfZ2V0X2Jyb2tlcihwb3J0LCBvcHRpb25zLCBtYW5hZ2VyLCB3b3JrZXJfY2xh
c3MsIHdvcmtlcl90b3BpYywKKyAgICAgICAgICAgICAgICB3b3JrZXJfcmVwbHlfdG9waWMpOgor
ICAgIHdvcmtlcl9tb2RlbCA9IG9wdGlvbnMud29ya2VyX21vZGVsCisgICAgYnJva2VyX3R5cGVz
ID0geworICAgICAgICAnaW5saW5lJzogX0lubGluZUJyb2tlciwKKyAgICAgICAgJ3RocmVhZHMn
OiBfTXVsdGlUaHJlYWRlZEJyb2tlciwKKyAgICB9CisgICAgdHJ5OgorICAgICAgICBicm9rZXJf
Y2xhc3MgPSBicm9rZXJfdHlwZXNbd29ya2VyX21vZGVsXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoK
KyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndW5zdXBwb3J0ZWQgdmFsdWUgZm9yIC0td29ya2Vy
LW1vZGVsOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9tb2RlbCkKKyAg
ICByZXR1cm4gYnJva2VyX2NsYXNzKHBvcnQsIG9wdGlvbnMsIHdvcmtlcl9jbGFzcywgd29ya2Vy
X3RvcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyX3JlcGx5X3RvcGljKQorCisK
K2NsYXNzIF9NZXNzYWdlKG9iamVjdCk6CisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBsb2Fk
cyhzdHIpOgorICAgICAgICBvYmogPSBjUGlja2xlLmxvYWRzKHN0cikKKyAgICAgICAgYXNzZXJ0
KGlzaW5zdGFuY2Uob2JqLCBfTWVzc2FnZSkpCisgICAgICAgIHJldHVybiBvYmoKKworICAgIGRl
ZiBfX2luaXRfXyhzZWxmLCBzcmMsIHRvcGljX25hbWUsIG1lc3NhZ2VfbmFtZSwgbWVzc2FnZV9i
b2R5KToKKyAgICAgICAgc2VsZi5zcmMgPSBzcmMKKyAgICAgICAgc2VsZi50b3BpY19uYW1lID0g
dG9waWNfbmFtZQorICAgICAgICBzZWxmLm5hbWUgPSBtZXNzYWdlX25hbWUKKyAgICAgICAgc2Vs
Zi5ib2R5ID0gbWVzc2FnZV9ib2R5CisKKyAgICBkZWYgZHVtcHMoc2VsZik6CisgICAgICAgIHJl
dHVybiBjUGlja2xlLmR1bXBzKHNlbGYpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAg
ICAgIHJldHVybiAoIl9NZXNzYWdlKGZyb209JyVzJywgdG9waWNfbmFtZT0nJXMnLCBtZXNzYWdl
X25hbWU9JyVzJykiICUKKyAgICAgICAgICAgICAgICAoc2VsZi5zcmMsIHNlbGYudG9waWNfbmFt
ZSwgc2VsZi5uYW1lKSkKKworCitjbGFzcyBfVGltZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0
X18oc2VsZiwgY2FsbGJhY2ssIGRlbGF5KToKKyAgICAgICAgc2VsZi5jYWxsYmFjayA9IGNhbGxi
YWNrCisgICAgICAgIHNlbGYuZGVsYXkgPSBkZWxheQorICAgICAgICBzZWxmLmRlYWRsaW5lID0g
dGltZS50aW1lKCkgKyBkZWxheQorCisKK2NsYXNzIF9Ub3BpYyhvYmplY3QpOgorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBxdWV1ZSk6CisgICAgICAgIHNlbGYucXVldWUgPSBxdWV1ZQorICAgICAg
ICBzZWxmLnRpbWVyID0gTm9uZQorCisKKyMgQWxsIFdvcmtlck1lc3NhZ2VCcm9rZXIgaW1wbGVt
ZW50YXRpb25zIG11c3QgcHJvdmlkZSBhIGNvbm5lY3Rpb24gY2xhc3MKKyMgdGhhdCBpbXBsZW1l
bnRzIHRoaXMgaW50ZXJmYWNlIGluIG9yZGVyIHRvIG1hbmFnZSBtdWx0aXBsZSB3b3JrZXJzCisj
IGNvcnJlY3RseS4KK2NsYXNzIF9Xb3JrZXJDb25uZWN0aW9uSW50ZXJmYWNlKG9iamVjdCk6Cisg
ICAgZGVmIF9faW5pdF9fKHNlbGYsIGJyb2tlciwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVy
KToKKyAgICAgICAgIiIiUmV0dXJuIGEgd29ya2VyIG9iamVjdC4KKworICAgICAgICBDYWxsZWQg
b25seSBvbiB0aGUgbWFuYWdlciBzaWRlIG9mIHRoZSBtZXNzYWdlIGJyb2tlci4iIiIKKyAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGNhbmNlbChzZWxmKToKKyAg
ICAgICAgIiIiQmVzdC1lZmZvcnQgYXR0ZW1wdCB0byBub3RpZnkgdGhlIHdvcmtlciBpdCBoYXMg
YmVlbiBjYW5jZWxsZWQuCisKKyAgICAgICAgQ2FsbGVkIG9uIHRoZSBtYW5hZ2VyIHNpZGUgb2Yg
dGhlIGJyb2tlciwgdGhpcyBzaG91bGQgYmUgYQorICAgICAgICBwYXNzLXRocm91Z2ggdG8gdGhl
IHdvcmtlciB3aGVyZSBwb3NzaWJsZS4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRF
cnJvcgorCisgICAgIyBGSVhNRTogQ2hhbmdlIHRoaXMgdG8gaXNfYWxpdmUgd2hlbiB3ZSdyZSBv
biAyLjYgb3IgbmV3ZXIgZXZlcnl3aGVyZS4KKyAgICBkZWYgaXNBbGl2ZShzZWxmKToKKyAgICAg
ICAgIiIiIlJldHVybiB3aGV0aGVyIHRoZSB3b3JrZXIgaXMgc3RpbGwgcnVubmluZy4KKworICAg
ICAgICBDYWxsZWQgb25seSBvbiB0aGUgbWFuYWdlciBzaWRlIG9mIHRoZSBicm9rZXIuIiIiCisg
ICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBqb2luKHNlbGYsIHRp
bWVvdXQpOgorICAgICAgICAiIiJCbG9jayB0aW1lb3V0IHNlY29uZHMgb3IgdW50aWwgdGhlIHdv
cmtlciBoYXMgZXhpdGVkLgorCisgICAgICAgIENhbGxlZCBvbmx5IG9uIHRoZSBtYW5hZ2VyIHNp
ZGUgb2YgdGhlIGJyb2tlci4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgor
CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgYSBzdHJpbmcgaWRlbnRp
ZnlpbmcgdGhlIHdvcmtlciBpbiBxdWVzdGlvbi4KKworICAgICAgICBDYWxsZWQgb24gYm90aCB0
aGUgbWFuYWdlciBhbmQgd29ya2VyIHNpZGVzIG9mIHRoZSBicm9rZXIsIHRoaXMKKyAgICAgICAg
c2hvdWxkIGJlIGEgcGFzcy10aHJvdWdoIHRvIHRoZSB3b3JrZXIgY2xpZW50IHdoZXJlIHBvc3Np
YmxlLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgb3B0
aW9ucyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQg
dG8gZ2V0KCkuCisKKyAgICAgICAgQ2FsbGVkIG9ubHkgYnkgdGhlIHdvcmtlci4iIiIKKyAgICAg
ICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHBvcnQoc2VsZik6CisgICAg
ICAgICIiIlJldHVybiB0aGUgcG9ydCBvYmplY3QgcGFzc2VkIHRvIGdldCgpLgorCisgICAgICAg
IENhbGxlZCBvbmx5IGJ5IHRoZSB3b3JrZXIuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVu
dGVkRXJyb3IKKworICAgIGRlZiBwb3N0X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9uYW1lLCAqbWVz
c2FnZV9hcmdzKToKKyAgICAgICAgIiIiUG9zdCBhIG1lc3NhZ2UgdG8gdGhlIHdvcmtlcl9yZXBs
eV9xdWV1ZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHdvcmtlci4i
IiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHJ1bihzZWxm
KToKKyAgICAgICAgIiIiSW52b2tlIHRoZSB3b3JrZXIncyBtYWluIGVudHJ5IHBvaW50LgorCisg
ICAgICAgIENhbGxlZCBvbiB0aGUgd29ya2VyIHNpZGUgb2YgdGhlIGJyb2tlciwgdGhpcyBpcyB1
c3VhbGx5IGEKKyAgICAgICAgd3JhcHBlciBhcm91bmQgdGhlIHdvcmtlciBjbGllbnQncyBydW4o
KSBtZXRob2QuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRl
ZiBydW5fbWVzc2FnZV9sb29wKHNlbGYpOgorICAgICAgICAiIiJSdW4gdGhlIHdvcmtlcidzIG1l
c3NhZ2UvdGltZXIgbG9vcC4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhl
IHdvcmtlci4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVm
IHN0YXJ0KHNlbGYpOgorICAgICAgICAiIiJTdGFydCB0aGUgd29ya2VyIHJ1bm5pbmcsIGlmIHBv
c3NpYmxlLiBEbyBub3QgYmxvY2sgdGhlIGNhbGxlci4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1w
bGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHlpZWxkX3RvX2Jyb2tlcihzZWxmKToKKyAgICAgICAg
IiIiIkNhdXNlcyB0aGUgd29ya2VyIHRvIHlpZWxkIGNvbnRyb2wgZmxvdyBiYWNrIHRvIHRoZSBi
cm9rZXIuCisKKyAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbXByb3ZlIHJlc3BvbnNpdmVu
ZXNzIGlmIHRoZSB3b3JrZXIgaXMKKyAgICAgICAgcHJvY2Vzc2luZyBzbG93IG1lc3NhZ2VzIChm
b3IgZXhhbXBsZSwgJ3Rlc3RfbGlzdCcpIGFuZCB0aGVyZQorICAgICAgICBpcyBvbmx5IG9uZSB0
aHJlYWQgKGkuZS4sIGlubGluZSBtb2RlKSBpbiB0aGUgbWVzc2FnZSBicm9rZXIuIiIiCisgICAg
ICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBfV29ya2VyTWVzc2FnZUJy
b2tlcihvYmplY3QpOgorICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgbWVzc2FnZSBi
cm9rZXIgdHVuZWQgZm9yIHRoZSBsYXlvdXQgdGVzdHMuCisKKyAgICBUaGlzIGNsYXNzIGltcGxl
bWVudHMgYSBtb3N0bHkgZ2VuZXJpYyBtZXNzYWdlIGJyb2tlciB3aXRoIGEgZmV3IHR3ZWFrcwor
ICAgIHR1bmVkIGZvciBtYW5hZ2VyL3dvcmtlci1zdHlsZSBtZXNzYWdpbmcuIFRoaXMgY2xhc3Mg
c2hvdWxkIG5vdCBiZQorICAgIGluc3RhbnRpYXRlZCBkaXJlY3RseTsgaW5zdGVhZCwgaXQgc2hv
dWxkIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZQorICAgIGltcGxlbWVudGF0aW9ucyBvZiBhIF9X
b3JrZXJDb25uZWN0aW9uSW50ZXJmYWNlIG9iamVjdCBmb3IKKyAgICBfV09SS0VSX0NPTk5FQ1RJ
T05fQ0xBU1MuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydCwgb3B0aW9ucywgd29y
a2VyX2NsYXNzLCB3b3JrZXJfcnVuX3RvcGljLAorICAgICAgICAgICAgICAgICB3b3JrZXJfcmVw
bHlfdG9waWMpOgorICAgICAgICAiIiJSZXR1cm4gYSBtZXNzYWdlIGJyb2tlciBmb3IgbWFuYWdl
ci93b3JrZXIgY29tbXVuaWNhdGlvbi4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgcG9y
dDogaGFuZGxlIHRvIHBvcnQtc3BlY2lmaWMgbG9naWMKKyAgICAgICAgICAgIG9wdGlvbnM6IGEg
cnVudGltZSBvcHRpb24gY2xhc3MgZnJvbSBvcHRwYXJzZQorICAgICAgICAgICAgd29ya2VyX2Ns
YXNzOiBUaGUgdHlwZSBvZiB3b3JrZXIgb2JqZWN0cyB0byBpbnN0YW50aWF0ZQorICAgICAgICAg
ICAgd29ya2VyX3J1bl90b3BpYzogVGhlIHRvcGljIG5hbWUgd29ya2VycyBzaG91bGQgbGlzdGVu
IGZvcgorICAgICAgICAgICAgd29ya2VyX3JlcGx5X3RvcGljOiBUaGUgdG9waWMgbmFtZSB3b3Jr
ZXJzIHNob3VsZCBwb3N0IHJlcGxpZXMgdG8KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3Bv
cnQgPSBwb3J0CisgICAgICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIHNlbGYu
X3dvcmtlcl9jbGFzcyA9IHdvcmtlcl9jbGFzcworICAgICAgICBzZWxmLl93b3JrZXJfcnVuX3Rv
cGljID0gd29ya2VyX3J1bl90b3BpYworICAgICAgICBzZWxmLl93b3JrZXJfcmVwbHlfdG9waWMg
PSB3b3JrZXJfcmVwbHlfdG9waWMKKworICAgICAgICBzZWxmLl90b3BpY3MgPSB7fQorICAgICAg
ICBzZWxmLl9jaGlsZHJlbiA9IHt9CisgICAgICAgIHNlbGYuYWRkX3RvcGljKHdvcmtlcl9ydW5f
dG9waWMpCisgICAgICAgIHNlbGYuYWRkX3RvcGljKHdvcmtlcl9yZXBseV90b3BpYykKKworICAg
IGRlZiBhZGRfdG9waWMoc2VsZiwgdG9waWNfbmFtZSk6CisgICAgICAgIGlmIHRvcGljX25hbWUg
bm90IGluIHNlbGYuX3RvcGljczoKKyAgICAgICAgICAgIHNlbGYuX3RvcGljc1t0b3BpY19uYW1l
XSA9IF9Ub3BpYyhRdWV1ZS5RdWV1ZSgpKQorCisgICAgZGVmIF9maW5kX3RvcGljKHNlbGYsIHRv
cGljX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fdG9waWNzW3RvcGljX25hbWVdCisKKyAg
ICAjIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIHZhbHVlLgorICAgIF9XT1JLRVJfQ09O
TkVDVElPTl9DTEFTUyA9IF9Xb3JrZXJDb25uZWN0aW9uSW50ZXJmYWNlCisKKyAgICBkZWYgc3Rh
cnRfd29ya2VyKHNlbGYsIHdvcmtlcl9udW1iZXIpOgorICAgICAgICAiIiJTdGFydCBhIHdvcmtl
ciB3aXRoIHRoZSBnaXZlbiBpbmRleCBudW1iZXIsIGFuZCByZXR1cm4gaXRzIG5hbWUuIiIiCisg
ICAgICAgIHdvcmtlciA9IHNlbGYuX1dPUktFUl9DT05ORUNUSU9OX0NMQVNTKHNlbGYsIHNlbGYu
X3dvcmtlcl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd29ya2VyX251bWJlcikKKyAgICAgICAgbmFtZSA9IHdvcmtlci5uYW1lKCkKKyAgICAg
ICAgd29ya2VyLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5fY2hpbGRyZW5bbmFtZV0gPSB3b3JrZXIK
KyAgICAgICAgcmV0dXJuIG5hbWUKKworICAgIGRlZiBjYW5jZWxfd29ya2VyKHNlbGYsIHdvcmtl
cl9uYW1lKToKKyAgICAgICAgIiIiQXR0ZW1wdCB0byBjYW5jZWwgYSB3b3JrZXIgKGJlc3QtZWZm
b3J0KS4gVGhlIHdvcmtlciBtYXkgc3RpbGwgYmUKKyAgICAgICAgcnVubmluZyBhZnRlciB0aGlz
IGNhbGwgcmV0dXJucy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkcmVuW3dvcmtlcl9u
YW1lXS5jYW5jZWwoKQorCisgICAgZGVmIGpvaW5fd29ya2VyKHNlbGYsIHdvcmtlcl9uYW1lLCB0
aW1lb3V0KToKKyAgICAgICAgIiIiV2FpdCB1bnRpbCB3b3JrZXIgZXhpdHMgb3IgdGltZW91dCBv
Y2N1cnMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jaGlsZHJlblt3b3JrZXJfbmFtZV0uam9p
bih0aW1lb3V0KQorCisgICAgZGVmIHdvcmtlcl9pc19hbGl2ZShzZWxmLCB3b3JrZXJfbmFtZSk6
CisgICAgICAgICIiIlJldHVybiB3aGV0aGVyIHRoZSB3b3JrZXIgaXMgc3RpbGwgcnVubmluZy4i
IiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkcmVuW3dvcmtlcl9uYW1lXS5pc0FsaXZlKCkK
KworICAgIGRlZiBsb2dfd2VkZ2VkX3dvcmtlcihzZWxmLCB3b3JrZXJfbmFtZSwgdGVzdF9uYW1l
KToKKyAgICAgICAgIiIiTG9nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiB3b3JrZXIncyBz
dGF0ZS4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGFk
ZF90aW1lcihzZWxmLCB0b3BpY19uYW1lLCBjYWxsYmFjaywgZGVsYXlfc2Vjcyk6CisgICAgICAg
ICIiIkFkZCBhIHRpbWVyIHRoYXQgd2lsbCBmaXJlIGxhdGVyIGR1cmluZyBydW5fYWxsX3BlbmRp
bmcoKSBvcgorICAgICAgICBydW5fbWVzc2FnZV9sb29wKCkuCisKKyAgICAgICAgVGltZXIgY2Fs
bGJhY2tzIHRha2Ugbm8gYXJndW1lbnRzLCBhbmQgc2hvdWxkIHJldHVybiBUcnVlIGlmZgorICAg
ICAgICBsb29wKCkgc2hvdWxkIGV4aXQuIEN1cnJlbnRseSB0aGUgY29kZSBvbmx5IHN1cHBvcnRz
IG9uZQorICAgICAgICB0aW1lciBwZXIgdG9waWMsIGJ1dCwgaW4gb3JkZXIgdG8gc3VwcG9ydCBw
ZXJpb2RpYyBldmVudHMsCisgICAgICAgIGEgdGltZXIgY2FuIGJlIGFkZGVkIGZyb20gaW5zaWRl
IHRoZSBjYWxsIGJhY2suIiIiCisgICAgICAgIHRvcGljID0gc2VsZi5fZmluZF90b3BpYyh0b3Bp
Y19uYW1lKQorICAgICAgICBhc3NlcnQodG9waWMudGltZXIgaXMgTm9uZSkKKyAgICAgICAgdG9w
aWMudGltZXIgPSBfVGltZXIoY2FsbGJhY2ssIGRlbGF5X3NlY3MpCisKKyAgICBkZWYgcG9zdF9t
ZXNzYWdlKHNlbGYsIHNyYywgdG9waWNfbmFtZSwgbWVzc2FnZV9uYW1lLCBib2R5PU5vbmUpOgor
ICAgICAgICAiIiJQb3N0IGEgbWVzc2FnZSB0byB0aGUgYXBwcm9wcmlhdGUgdG9waWMgcXVldWUu
IiIiCisgICAgICAgIGJvZHkgPSBib2R5IG9yIHR1cGxlKCkKKyAgICAgICAgbWVzc2FnZSA9IF9N
ZXNzYWdlKHNyYywgdG9waWNfbmFtZSwgbWVzc2FnZV9uYW1lLCBib2R5KQorICAgICAgICB0b3Bp
YyA9IHNlbGYuX2ZpbmRfdG9waWModG9waWNfbmFtZSkKKyAgICAgICAgdG9waWMucXVldWUucHV0
KF9NZXNzYWdlLmR1bXBzKG1lc3NhZ2UpKQorCisgICAgZGVmIHJ1bl9tZXNzYWdlX2xvb3Aoc2Vs
ZiwgdG9waWNfbmFtZSwgcmVhZGVyKToKKyAgICAgICAgIiIiTG9vcCBwcm9jZXNzaW5nIG1lc3Nh
Z2VzIGFuZCB0aW1lcnMgdW50aWwgZG9uZS4KKworICAgICAgICAiZG9uZSIgbWVhbnMgdGhhdCBy
ZWFkZXIuaXNfZG9uZSgpIHJldHVybnMgVHJ1ZSBvciBhIHRpbWVyIGluZGljYXRlcworICAgICAg
ICB0aGF0IHdlJ3JlIGRvbmUuIiIiCisgICAgICAgIHRvcGljID0gc2VsZi5fZmluZF90b3BpYyh0
b3BpY19uYW1lKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgIyBIZXJlIHdlIGRv
bid0IGNhcmUgaWYgd2UgZG8gd29yayBpbiB0aGUgdGltZXIuCisgICAgICAgICAgICBub3cgPSB0
aW1lLnRpbWUoKQorICAgICAgICAgICAgXywgZG9uZSA9IHNlbGYuX2NoZWNrX3RpbWVyKHRvcGlj
LCBub3cpCisgICAgICAgICAgICBpZiBkb25lIG9yIHJlYWRlci5pc19kb25lKCk6CisgICAgICAg
ICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgUmUtY2hlY2sgdGhlIHRpbWUsIGluIGNh
c2UgdGhlIHRpbWVyIGhhZCBhIHNsb3cgY2FsbGJhY2suCisgICAgICAgICAgICBub3cgPSB0aW1l
LnRpbWUoKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3RpbWVyX2V4cGlyZWQodG9waWMsIG5v
dyk6CisgICAgICAgICAgICAgICAgZGVsYXkgPSBzZWxmLl90aW1lcl9kZWxheSh0b3BpYywgbm93
KQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcyA9IHRvcGljLnF1
ZXVlLmdldChibG9jaz1UcnVlLCB0aW1lb3V0PWRlbGF5KQorICAgICAgICAgICAgICAgICAgICBt
c2cgPSBfTWVzc2FnZS5sb2FkcyhzKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kaXNwYXRj
aF9tZXNzYWdlKG1zZywgcmVhZGVyKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5FbXB0
eToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHJ1bl9hbGxfcGVuZGluZyhz
ZWxmLCB0b3BpY19uYW1lLCByZWFkZXIpOgorICAgICAgICAiIiJMb29wIHVudGlsIHdlIHJ1biBv
dXQgb2Ygc3R1ZmYgdG8gZG8gdy9vIGJsb2NraW5nLgorCisgICAgICAgIFRoaXMgbWVhbnMgdGhl
cmUgYXJlIG5vIG1lc3NhZ2VzIHRvIHByb2Nlc3MgYW5kIG5vIHRpbWVycyBhcmUgZmlyaW5nCisg
ICAgICAgIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKworICAgICAg
ICBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHdlIGRpZCBhbnl0aGluZyBhdCBhbGwuIiIiCisgICAg
ICAgIHRvcGljID0gc2VsZi5fZmluZF90b3BpYyh0b3BpY19uYW1lKQorICAgICAgICBkaWRfd29y
a19vbl90aGlzX3J1biA9IFRydWUKKyAgICAgICAgZG9uZSA9IHJlYWRlci5pc19kb25lKCkKKyAg
ICAgICAgd2hpbGUgZGlkX3dvcmtfb25fdGhpc19ydW4gYW5kIG5vdCBkb25lOgorICAgICAgICAg
ICAgZGlkX3dvcmtfb25fdGhpc19ydW4sIGRvbmUgPSBzZWxmLl9jaGVja190aW1lcih0b3BpYywg
dGltZS50aW1lKCkpCisgICAgICAgICAgICBkb25lID0gZG9uZSBvciByZWFkZXIuaXNfZG9uZSgp
CisgICAgICAgICAgICBpZiBkb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAg
ICAgIHRyeToKKyAgICAgICAgICAgICAgICBzID0gdG9waWMucXVldWUuZ2V0KGJsb2NrPUZhbHNl
KQorICAgICAgICAgICAgICAgIG1zZyA9IF9NZXNzYWdlLmxvYWRzKHMpCisgICAgICAgICAgICAg
ICAgc2VsZi5fZGlzcGF0Y2hfbWVzc2FnZShtc2csIHJlYWRlcikKKyAgICAgICAgICAgICAgICBk
aWRfd29ya19vbl90aGlzX3J1biA9IFRydWUKKyAgICAgICAgICAgICAgICBkb25lID0gcmVhZGVy
LmlzX2RvbmUoKQorICAgICAgICAgICAgZXhjZXB0IFF1ZXVlLkVtcHR5OgorICAgICAgICAgICAg
ICAgIHBhc3MKKworICAgICAgICByZXR1cm4gZG9uZQorCisgICAgZGVmIF9jaGVja190aW1lcihz
ZWxmLCB0b3BpYywgbm93KToKKyAgICAgICAgIiIiQ2hlY2sgaWYgYW55IHRpbWVycyBuZWVkIHRv
IGZpcmUsIGFuZCBmaXJlIHRoZW0uCisKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIG9mICh3aGV0
aGVyIGEgdGltZXIgZmlyZWQsIHdoZXRoZXIgYSB0aW1lcgorICAgICAgICAgICAgcmV0dXJuZWQg
VHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCBiYWlsIG91dCBvZiB0aGUgYQorICAgICAg
ICAgICAgbWVzc2FnZSBsb29wIGlmIG5lY2Vzc2FyeSkuIiIiCisgICAgICAgIGlmIHNlbGYuX3Rp
bWVyX2V4cGlyZWQodG9waWMsIG5vdyk6CisgICAgICAgICAgICB0ID0gdG9waWMudGltZXIKKyAg
ICAgICAgICAgIHRvcGljLnRpbWVyID0gTm9uZQorICAgICAgICAgICAgZG9uZSA9IHQuY2FsbGJh
Y2soKQorICAgICAgICAgICAgcmV0dXJuIFRydWUsIGRvbmUKKyAgICAgICAgcmV0dXJuIEZhbHNl
LCBGYWxzZQorCisgICAgZGVmIF90aW1lcl9kZWxheShzZWxmLCB0b3BpYywgbm93KToKKyAgICAg
ICAgIiIiIlJldHVybiB0aGUgdGltZSAoaW4gc2VjcykgZnJvbSAnbm93JyB1bnRpbCB0aGUgdGlt
ZXIgZmlyZXMuCisKKyAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgbmVnYXRpdmUsIGlu
ZGljYXRpbmcgdGhhdCB0aGUgdGltZXIgaGFzCisgICAgICAgIGV4cGlyZWQsIG9yIE5vbmUsIHRv
IGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gdGltZXIgb24gdGhlIHRvcGljCisgICAgICAgIChk
ZWxheSBmb3JldmVyKS4iIiIKKyAgICAgICAgdCA9IHRvcGljLnRpbWVyCisgICAgICAgIGlmIHQ6
CisgICAgICAgICAgICByZXR1cm4gdC5kZWFkbGluZSAtIG5vdworICAgICAgICByZXR1cm4gTm9u
ZQorCisgICAgZGVmIF90aW1lcl9leHBpcmVkKHNlbGYsIHRvcGljLCBub3cpOgorICAgICAgICAi
IiJSZXR1cm4gd2hldGhlciB0aGUgdG9waWMgaGFzIGEgdGltZXIgd2hvc2UgZGVhZGxpbmUgaGFz
IHBhc3NlZC4iIiIKKyAgICAgICAgdCA9IHRvcGljLnRpbWVyCisgICAgICAgIHJldHVybiAodCBp
cyBub3QgTm9uZSkgYW5kIG5vdyA+PSB0LmRlYWRsaW5lCisKKyAgICBkZWYgX2Rpc3BhdGNoX21l
c3NhZ2Uoc2VsZiwgbWVzc2FnZSwgcmVhZGVyKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIocmVh
ZGVyLCAnaGFuZGxlXycgKyBtZXNzYWdlLm5hbWUpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVF
cnJvcigKKyAgICAgICAgICAgICAgICIlczogcmVjZWl2ZWQgbWVzc2FnZSAnJXMnIGl0IGNvdWxk
bid0IGhhbmRsZSIgJQorICAgICAgICAgICAgICAgKHJlYWRlci5uYW1lKCksIG1lc3NhZ2UubmFt
ZSkpCisgICAgICAgIG9wdGFyZ3MgPSBtZXNzYWdlLmJvZHkKKyAgICAgICAgbWVzc2FnZV9oYW5k
bGVyID0gZ2V0YXR0cihyZWFkZXIsICdoYW5kbGVfJyArIG1lc3NhZ2UubmFtZSkKKyAgICAgICAg
bWVzc2FnZV9oYW5kbGVyKG1lc3NhZ2Uuc3JjLCAqb3B0YXJncykKKworCitjbGFzcyBfSW5saW5l
V29ya2VyQ29ubmVjdGlvbihfV29ya2VyQ29ubmVjdGlvbkludGVyZmFjZSk6CisgICAgZGVmIF9f
aW5pdF9fKHNlbGYsIGJyb2tlciwgd29ya2VyX2NsYXNzLCB3b3JrZXJfbnVtYmVyKToKKyAgICAg
ICAgc2VsZi5fYnJva2VyID0gYnJva2VyCisgICAgICAgIHNlbGYuX3BvcnQgPSBicm9rZXIuX3Bv
cnQKKyAgICAgICAgc2VsZi5fb3B0aW9ucyA9IGJyb2tlci5fb3B0aW9ucworICAgICAgICBzZWxm
Ll93b3JrZXIgPSB3b3JrZXJfY2xhc3Moc2VsZiwgd29ya2VyX251bWJlcikKKworICAgIGRlZiBj
YW5jZWwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl93b3JrZXIuY2FuY2VsKCkKKworICAg
IGRlZiBpc0FsaXZlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnJva2VyLl9tYW5hZ2Vy
CisKKyAgICBkZWYgam9pbihzZWxmLCB0aW1lb3V0KToKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxm
LmlzQWxpdmUoKQorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl93
b3JrZXIubmFtZSgpCisKKyAgICBkZWYgb3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNl
bGYuX2Jyb2tlci5fb3B0aW9ucworCisgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgIHJldHVy
biBzZWxmLl9icm9rZXIuX3BvcnQKKworICAgIGRlZiBwb3N0X21lc3NhZ2Uoc2VsZiwgbWVzc2Fn
ZV9uYW1lLCAqbWVzc2FnZV9hcmdzKToKKyAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2Fn
ZShzZWxmLm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYu
X2Jyb2tlci5fd29ya2VyX3JlcGx5X3RvcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbWVzc2FnZV9uYW1lLCBtZXNzYWdlX2FyZ3MpCisKKyAgICBkZWYgcnVuKHNlbGYp
OgorICAgICAgICBzZWxmLl93b3JrZXIucnVuKCkKKworICAgIGRlZiBydW5fbWVzc2FnZV9sb29w
KHNlbGYpOgorICAgICAgICBzZWxmLl9icm9rZXIucnVuX21lc3NhZ2VfbG9vcChzZWxmLl9icm9r
ZXIuX3dvcmtlcl9ydW5fdG9waWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2VsZi5fd29ya2VyKQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBwYXNz
CisKKyAgICBkZWYgeWllbGRfdG9fYnJva2VyKHNlbGYpOgorICAgICAgICBzZWxmLl9icm9rZXIu
cnVuX2FsbF9wZW5kaW5nKHNlbGYuX2Jyb2tlci5fd29ya2VyX3JlcGx5X3RvcGljLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Jyb2tlci5fbWFuYWdlcikK
KworCitjbGFzcyBfSW5saW5lQnJva2VyKF9Xb3JrZXJNZXNzYWdlQnJva2VyKToKKyAgICBfV09S
S0VSX0NPTk5FQ1RJT05fQ0xBU1MgPSBfSW5saW5lV29ya2VyQ29ubmVjdGlvbgorCisgICAgZGVm
IF9faW5pdF9fKHNlbGYsIHBvcnQsIG9wdGlvbnMsIHdvcmtlcl9jbGFzcywgd29ya2VyX3J1bl90
b3BpYywKKyAgICAgICAgICAgICAgICAgd29ya2VyX3JlcGx5X3RvcGljKToKKyAgICAgICAgX1dv
cmtlck1lc3NhZ2VCcm9rZXIuX19pbml0X18oc2VsZiwgcG9ydCwgb3B0aW9ucywgd29ya2VyX2Ns
YXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJfcnVuX3Rv
cGljLCB3b3JrZXJfcmVwbHlfdG9waWMpCisKKyAgICAgICAgIyBUaGUgbWFuYWdlciBpcyBvbmx5
IHZhbGlkIHdoZW4gdGhlIGlubGluZWQgd29ya2VyIGlzICJydW5uaW5nIiwKKyAgICAgICAgIyBt
ZWFuaW5nIHRoYXQgd2UgYXJlIHNlcnZpY2luZyBpdHMgbWVzc2FnZSBxdWV1ZS4gV2UgbmVlZCB0
aGlzCisgICAgICAgICMgdmFyaWFibGUgc28geWllbGRfdG9fYnJva2VyKCkgd2lsbCB3b3JrIHBy
b3Blcmx5LgorICAgICAgICBzZWxmLl9tYW5hZ2VyID0gTm9uZQorCisgICAgZGVmIGxvZ193ZWRn
ZWRfd29ya2VyKHNlbGYsIHdvcmtlcl9uYW1lLCB0ZXN0X25hbWUpOgorICAgICAgICByYWlzZSBB
c3NlcnRpb25FcnJvcigiX0lubGluZUJyb2tlci5sb2dfd2VkZ2VkX3dvcmtlcigpIGNhbGxlZCIp
CisKKyAgICBkZWYgcnVuX21lc3NhZ2VfbG9vcChzZWxmLCB0b3BpY19uYW1lLCByZWFkZXIpOgor
ICAgICAgICAjIFdlIG5lZWQgc3BlY2lhbCBsb2dpYyBpbiB0aGUgaW5saW5lIGNhc2UgaW4gb3Jk
ZXIgdG8gZW5zdXJlIHRoYXQKKyAgICAgICAgIyB0aGUgbWFuYWdlciBhbmQgd29ya2VycyBhY3R1
YWxseSBib3RoIGdldCB0byBydW4gcHJvcGVybHkuIFRoZXJlJ3MKKyAgICAgICAgIyBwcm9iYWJs
eSBhIGZldyB3YXlzIHdlIGNvdWxkIGFjY29tcGxpc2ggdGhpcywgYnV0IGZvciBub3cgd2UKKyAg
ICAgICAgIyBoYXZlIHRoZSBtYW5hZ2VyIHJ1bigpIHRoZSB3b3JrZXIgaW5saW5lIHRvIGNvbXBs
ZXRpb24sIGFuZCB0aGVuCisgICAgICAgICMgcnVuIGFueSBwZW5kaW5nIGV2ZW50cyBvbiB0aGUg
bWFuYWdlciB0b3BpYy4gV2UgY291bnQgb24gdGhlCisgICAgICAgICMgd29ya2VyIGNhbGxpbmcg
eWllbGRfdG9fYnJva2VyKCkgcGVyaW9kaWNhbGx5IGluIG9yZGVyIHRvIG1ha2UKKyAgICAgICAg
IyBzdXJlIHRoZSBtYW5hZ2VyIGRvZXNuJ3QgZ2V0IHN0YXJ2ZWQuCisgICAgICAgIGlmIHRvcGlj
X25hbWUgPT0gc2VsZi5fd29ya2VyX3JlcGx5X3RvcGljOgorICAgICAgICAgICAgIyBNYW5hZ2Vy
LiBEbyBhcyBqdXN0IGRlc2NyaWJlZC4KKyAgICAgICAgICAgIGNoaWxkcmVuID0gc2VsZi5fY2hp
bGRyZW4udmFsdWVzKCkKKyAgICAgICAgICAgIGlmIGNoaWxkcmVuOgorICAgICAgICAgICAgICAg
IHNlbGYuX21hbmFnZXIgPSByZWFkZXIKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAg
ICAgICAgICAgIGNoaWxkcmVuWzBdLnJ1bigpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAg
ICAgICAgICAgICAgICAgICAgc2VsZi5fbWFuYWdlciA9IE5vbmUKKworICAgICAgICAgICAgdG9w
aWMgPSBzZWxmLl9maW5kX3RvcGljKHRvcGljX25hbWUpCisgICAgICAgICAgICB3aGlsZSB0b3Bp
Yy50aW1lciBvciBub3QgdG9waWMucXVldWUuZW1wdHkoKToKKyAgICAgICAgICAgICAgICBpZiBz
ZWxmLnJ1bl9hbGxfcGVuZGluZyh0b3BpY19uYW1lLCByZWFkZXIpOgorICAgICAgICAgICAgICAg
ICAgICBicmVhaworCisgICAgICAgICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAg
ICAgICAgICBpZiB0b3BpYy50aW1lciBhbmQgdG9waWMudGltZXIuZGVhZGxpbmUgPiBub3c6Cisg
ICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAodG9waWMudGltZXIuZGVhZGxpbmUgLSBub3cp
CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoaXMgaXMgYSB3b3JrZXIuIEluIHRoZSBp
bmxpbmUgY2FzZSwgYSB3b3JrZXIgbmV2ZXIgYmxvY2tzLAorICAgICAgICAgICAgIyBzbyB3ZSBj
YW4gcnVuIHRoZSByZWd1bGFyIGxvb3AgY29kZS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAg
ICMgRklYTUU6IFdlIGRvbid0IGFjdHVhbGx5IGVuZm9yY2UgdGhpcywgc28gYSBidWdneSB3b3Jr
ZXIgY291bGQKKyAgICAgICAgICAgICMgZGVhZGxvY2sgdGhlIHByb2Nlc3MuCisKKyAgICAgICAg
ICAgICMgRW5zdXJlIHRoaXMgaXMgYmVpbmcgY2FsbGVkIG9ubHkgZnJvbSBpbnNpZGUgdGhlIG1h
bmFnZXIgbG9vcC4KKyAgICAgICAgICAgIGFzc2VydCBzZWxmLl9tYW5hZ2VyIGlzIG5vdCBOb25l
CisKKyAgICAgICAgICAgIF9Xb3JrZXJNZXNzYWdlQnJva2VyLnJ1bl9tZXNzYWdlX2xvb3Aoc2Vs
ZiwgdG9waWNfbmFtZSwgcmVhZGVyKQorCisKK2NsYXNzIF9UaHJlYWRlZFdvcmtlckNvbm5lY3Rp
b24oX1dvcmtlckNvbm5lY3Rpb25JbnRlcmZhY2UsIHRocmVhZGluZy5UaHJlYWQpOgorICAgIGRl
ZiBfX2luaXRfXyhzZWxmLCBicm9rZXIsIHdvcmtlcl9jbGFzcywgd29ya2VyX251bWJlcik6Cisg
ICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fYnJv
a2VyID0gYnJva2VyCisgICAgICAgIHNlbGYuX3BvcnQgPSBicm9rZXIuX3BvcnQKKyAgICAgICAg
c2VsZi5fb3B0aW9ucyA9IGJyb2tlci5fb3B0aW9ucworICAgICAgICBzZWxmLl93b3JrZXIgPSB3
b3JrZXJfY2xhc3Moc2VsZiwgd29ya2VyX251bWJlcikKKworICAgIGRlZiBjYW5jZWwoc2VsZik6
CisgICAgICAgIHNlbGYuX3dvcmtlci5jYW5jZWwoKQorCisgICAgZGVmIGlzQWxpdmUoc2VsZik6
CisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuaXNBbGl2ZShzZWxmKQorCisgICAgZGVmIGpvaW4o
c2VsZiwgdGltZW91dCk6CisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuam9pbihzZWxmLCB0aW1l
b3V0KQorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl93b3JrZXIu
bmFtZSgpCisKKyAgICBkZWYgb3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Jy
b2tlci5fb3B0aW9ucworCisgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
Ll9icm9rZXIuX3BvcnQKKworICAgIGRlZiBwb3N0X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9uYW1l
LCAqbWVzc2FnZV9hcmdzKToKKyAgICAgICAgc2VsZi5fYnJva2VyLnBvc3RfbWVzc2FnZShzZWxm
Lm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Jyb2tl
ci5fd29ya2VyX3JlcGx5X3RvcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbWVzc2FnZV9uYW1lLCBtZXNzYWdlX2FyZ3MpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAg
ICAgICAjIEZJWE1FOiB3ZSBjYW4gcmVtb3ZlIHRoaXMgb25jZSBldmVyeW9uZSBpcyBvbiAyLjYu
CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdpZGVudCcpOgorICAgICAgICAgICAgc2Vs
Zi5pZGVudCA9IHRocmVhZC5nZXRfaWRlbnQoKQorICAgICAgICBzZWxmLl93b3JrZXIucnVuKCkK
KworICAgIGRlZiBydW5fbWVzc2FnZV9sb29wKHNlbGYpOgorICAgICAgICBzZWxmLl9icm9rZXIu
cnVuX21lc3NhZ2VfbG9vcChzZWxmLl9icm9rZXIuX3dvcmtlcl9ydW5fdG9waWMsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd29ya2VyKQorCisgICAgZGVm
IHN0YXJ0KHNlbGYpOgorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLnN0YXJ0KHNlbGYpCisKKyAg
ICBkZWYgeWllbGRfdG9fYnJva2VyKHNlbGYpOgorICAgICAgICAjIFRoZXJlJ3Mgbm8gbmVlZCB0
byB5aWVsZCB3aXRoIHRocmVhZHMuCisgICAgICAgIHBhc3MKKworCitjbGFzcyBfTXVsdGlUaHJl
YWRlZEJyb2tlcihfV29ya2VyTWVzc2FnZUJyb2tlcik6CisgICAgX1dPUktFUl9DT05ORUNUSU9O
X0NMQVNTID0gX1RocmVhZGVkV29ya2VyQ29ubmVjdGlvbgorCisgICAgZGVmIGxvZ193ZWRnZWRf
d29ya2VyKHNlbGYsIHdvcmtlcl9uYW1lLCB0ZXN0X25hbWUpOgorICAgICAgICB0aHJlYWQgPSBz
ZWxmLl9jaGlsZHJlblt3b3JrZXJfbmFtZV0KKyAgICAgICAgdGlkID0gdGhyZWFkLmlkZW50Cisg
ICAgICAgIHN0YWNrID0gc2VsZi5fZmluZF90aHJlYWRfc3RhY2sodGlkKQorICAgICAgICBhc3Nl
cnQoc3RhY2sgaXMgbm90IE5vbmUpCisgICAgICAgIF9sb2cuZXJyb3IoIiVzICh0aWQgJWQpIGlz
IHdlZGdlZCBvbiB0ZXN0ICVzIiAlCisgICAgICAgICAgICAgICAgICAgKHdvcmtlcl9uYW1lLCB0
aWQsIHRlc3RfbmFtZSkpCisgICAgICAgIHNlbGYuX2xvZ19zdGFjayhzdGFjaykKKworICAgIGRl
ZiBfZmluZF90aHJlYWRfc3RhY2soc2VsZiwgdGlkKToKKyAgICAgICAgIiIiUmV0dXJucyBhIHN0
YWNrIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGR1bXAgYSBzdGFjayB0cmFjZSBmb3IKKyAg
ICAgICAgdGhlIGdpdmVuIHRocmVhZCBpZCAob3IgTm9uZSBpZiB0aGUgaWQgaXMgbm90IGZvdW5k
KS4iIiIKKyAgICAgICAgZm9yIHRocmVhZF9pZCwgc3RhY2sgaW4gc3lzLl9jdXJyZW50X2ZyYW1l
cygpLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB0aHJlYWRfaWQgPT0gdGlkOgorICAgICAgICAg
ICAgICAgIHJldHVybiBzdGFjaworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9sb2df
c3RhY2soc2VsZiwgc3RhY2spOgorICAgICAgICAiIiJMb2cgYSBzdGFjayB0cmFjZSB0byBsb2cu
ZXJyb3IoKS4iIiIKKyAgICAgICAgZm9yIGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUgaW4g
dHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2soc3RhY2spOgorICAgICAgICAgICAgX2xvZy5lcnJvcign
RmlsZTogIiVzIiwgbGluZSAlZCwgaW4gJXMnICUgKGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUpKQor
ICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICBfbG9nLmVycm9yKCcgICVzJyAl
IGxpbmUuc3RyaXAoKSkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
bGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL21lc3NhZ2VfYnJva2VyMl91bml0dGVzdC5weSBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L21lc3NhZ2VfYnJva2VyMl91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zMWY0Nzg0OGIwZmY5MTdk
MGE3ODI0YjI1ZjcyNWI1MGYyYjg0MWUyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvbWVzc2FnZV9icm9r
ZXIyX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMzQ2IEBACisjIENvcHlyaWdodCAoQykgMjAxMCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBu
YW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisj
IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24u
CisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1w
b3J0IGxvZ2dpbmcKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IFF1ZXVlCitpbXBvcnQgc3lzCitp
bXBvcnQgdHlwZXMKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0
ZW0gaW1wb3J0IG91dHB1dGNhcHR1cmUKKworaW1wb3J0IG1lc3NhZ2VfYnJva2VyMiBhcyBtZXNz
YWdlX2Jyb2tlcgorCisKK2RlZiBtYWtlX3dvcmtlcl9jbGFzcyhzdGFydGluZ19xdWV1ZT1Ob25l
LCBzdG9wcGluZ19xdWV1ZT1Ob25lLCBtc2c9J2RvbmUnKToKKyAgICBjbGFzcyBUZXN0V29ya2Vy
KG1lc3NhZ2VfYnJva2VyLkNsaWVudEludGVyZmFjZSk6CisgICAgICAgIGRlZiBfX2luaXRfXyhz
ZWxmLCBicm9rZXIsIHdvcmtlcl9udW1iZXIpOgorICAgICAgICAgICAgc2VsZi5fYnJva2VyID0g
YnJva2VyCisgICAgICAgICAgICBzZWxmLl9wb3J0ID0gYnJva2VyLnBvcnQoKQorICAgICAgICAg
ICAgc2VsZi5fb3B0aW9ucyA9IGJyb2tlci5vcHRpb25zKCkKKyAgICAgICAgICAgIHNlbGYuX3dv
cmtlcl9udW1iZXIgPSB3b3JrZXJfbnVtYmVyCisgICAgICAgICAgICBzZWxmLl9uYW1lID0gJ1Rl
c3RXb3JrZXIvJWQnICUgd29ya2VyX251bWJlcgorICAgICAgICAgICAgc2VsZi5fY2FuY2VsZWQg
PSBGYWxzZQorICAgICAgICAgICAgc2VsZi5fc3RvcHBlZCA9IEZhbHNlCisKKyAgICAgICAgZGVm
IGNhbmNlbChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX2NhbmNlbGVkID0gVHJ1ZQorCisgICAg
ICAgIGRlZiBoYW5kbGVfc3RvcChzZWxmLCBzcmMpOgorICAgICAgICAgICAgc2VsZi5fc3RvcHBl
ZCA9IFRydWUKKworICAgICAgICBkZWYgaGFuZGxlX3Rlc3Qoc2VsZiwgc3JjLCBhbl9pbnQsIGFf
c3RyKToKKyAgICAgICAgICAgIGFzc2VydCBhbl9pbnQgPT0gMQorICAgICAgICAgICAgYXNzZXJ0
IGFfc3RyID09ICJoZWxsbywgd29ybGQiCisgICAgICAgICAgICBzZWxmLl9icm9rZXIucG9zdF9t
ZXNzYWdlKCd0ZXN0JywgMiwgJ2hpLCBldmVyeWJvZHknKQorCisgICAgICAgIGRlZiBpc19kb25l
KHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3N0b3BwZWQgb3Igc2VsZi5fY2FuY2Vs
ZWQKKworICAgICAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9u
YW1lCisKKyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAg
ICAgICAgICBpZiBzdGFydGluZ19xdWV1ZToKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmdf
cXVldWUucHV0KCcnKQorICAgICAgICAgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9s
b29wKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9icm9rZXIueWllbGRfdG9fYnJva2VyKCkKKyAg
ICAgICAgICAgICAgICBpZiBtc2c6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Jyb2tlci5w
b3N0X21lc3NhZ2UobXNnKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAg
ICAgICAgICAgICBzZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKCdleGNlcHRpb24nLCAodHlwZShl
KSwgc3RyKGUpLCBOb25lKSkKKworICAgIHJldHVybiBUZXN0V29ya2VyCisKKworZGVmIGdldF9v
cHRpb25zKHdvcmtlcl9tb2RlbCk6CisgICAgb3B0aW9uX2xpc3QgPSBtZXNzYWdlX2Jyb2tlci5y
dW50aW1lX29wdGlvbnMoKQorICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihvcHRp
b25fbGlzdD1vcHRpb25fbGlzdCkKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2Fy
Z3MoYXJncz1bJy0td29ya2VyLW1vZGVsJywgd29ya2VyX21vZGVsXSkKKyAgICByZXR1cm4gb3B0
aW9ucworCisKK2RlZiBtYWtlX2Jyb2tlcihtYW5hZ2VyLCB3b3JrZXJfbW9kZWwsIHN0YXJ0aW5n
X3F1ZXVlPU5vbmUsCisgICAgICAgICAgICAgICAgc3RvcHBpbmdfcXVldWU9Tm9uZSk6CisgICAg
b3B0aW9ucyA9IGdldF9vcHRpb25zKHdvcmtlcl9tb2RlbCkKKyAgICB3b3JrZXJfY2xhc3MgPSBt
YWtlX3dvcmtlcl9jbGFzcyhzdGFydGluZ19xdWV1ZSwgc3RvcHBpbmdfcXVldWUpCisgICAgcmV0
dXJuIG1lc3NhZ2VfYnJva2VyLmdldChOb25lLCBvcHRpb25zLCBtYW5hZ2VyLCB3b3JrZXJfY2xh
c3MpCisKKworY2xhc3MgRnVuY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVm
IHRlc3RfZ2V0X19pbmxpbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWtlX2Jy
b2tlcihzZWxmLCAnaW5saW5lJykgaXMgbm90IE5vbmUpCisKKyAgICBkZWYgdGVzdF9nZXRfX3Ro
cmVhZHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWtlX2Jyb2tlcihzZWxmLCAn
dGhyZWFkcycpIGlzIG5vdCBOb25lKQorCisgICAgZGVmIHRlc3RfZ2V0X191bmtub3duKHNlbGYp
OgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYWtlX2Jyb2tlciwgc2Vs
ZiwgJ3Vua25vd24nKQorCisKK2NsYXNzIF9Xb3JrZXJNZXNzYWdlQnJva2VyVGVzdHNNaXhpbihv
YmplY3QpOgorICAgICIiIk1peGluIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIHNlcmllcyBvZiB0
ZXN0cyB0byBlbmZvcmNlIHRoZQorICAgIGNvbnRyYWN0IGFsbCBfV29ya2VyTWVzc2FnZUJyb2tl
ciBpbXBsZW1lbnRhdGlvbnMgbXVzdCBmb2xsb3cuIiIiCisKKyAgICAjCisgICAgIyBNZXRob2Rz
IHRvIGltcGxlbWVudCB0aGUgTWFuYWdlciBzaWRlIG9mIHRoZSBDbGllbnRJbnRlcmZhY2UKKyAg
ICAjCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAnVGVzdGVyJworCisgICAg
ZGVmIGlzX2RvbmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kb25lCisKKyAgICAjCisg
ICAgIyBIYW5kbGVycyBmb3IgdGhlIG1lc3NhZ2VzIHRoZSBUZXN0V29ya2VyIG1heSBzZW5kLgor
ICAgICMKKyAgICBkZWYgaGFuZGxlX2RvbmUoc2VsZiwgc3JjKToKKyAgICAgICAgc2VsZi5fZG9u
ZSA9IFRydWUKKworICAgIGRlZiBoYW5kbGVfdGVzdChzZWxmLCBzcmMsIGFuX2ludCwgYV9zdHIp
OgorICAgICAgICBzZWxmLl9hbl9pbnQgPSBhbl9pbnQKKyAgICAgICAgc2VsZi5fYV9zdHIgPSBh
X3N0cgorCisgICAgZGVmIGhhbmRsZV9leGNlcHRpb24oc2VsZiwgc3JjLCBleGNfaW5mbyk6Cisg
ICAgICAgIHNlbGYuX2V4Y2VwdGlvbiA9IGV4Y19pbmZvCisgICAgICAgIHNlbGYuX2RvbmUgPSBU
cnVlCisKKyAgICAjCisgICAgIyBUZXN0aW5nIGhlbHBlciBtZXRob2RzCisgICAgIworICAgIGRl
ZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fYW5faW50ID0gTm9uZQorICAgICAgICBzZWxm
Ll9hX3N0ciA9IE5vbmUKKyAgICAgICAgc2VsZi5fYnJva2VyID0gTm9uZQorICAgICAgICBzZWxm
Ll9kb25lID0gRmFsc2UKKyAgICAgICAgc2VsZi5fZXhjZXB0aW9uID0gTm9uZQorICAgICAgICBz
ZWxmLl93b3JrZXJfbW9kZWwgPSBOb25lCisgICAgICAgIHNlbGYuX3RpbWVyX3ZhbCA9IDAKKyAg
ICAgICAgc2VsZi5fdGltZXJfbWF4X3ZhbCA9IDEKKworICAgIGRlZiBtYWtlX2Jyb2tlcihzZWxm
LCBzdGFydGluZ19xdWV1ZT1Ob25lLCBzdG9wcGluZ19xdWV1ZT1Ob25lKToKKyAgICAgICAgc2Vs
Zi5fYnJva2VyID0gbWFrZV9icm9rZXIoc2VsZiwgc2VsZi5fd29ya2VyX21vZGVsLCBzdGFydGlu
Z19xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBpbmdfcXVl
dWUpCisKKyAgICBkZWYgY2FsbGJhY2soc2VsZik6CisgICAgICAgIHNlbGYuX3RpbWVyX3ZhbCAr
PSAxCisgICAgICAgIHNlbGYuX2Jyb2tlci5hZGRfdGltZXIoc2VsZi5jYWxsYmFjaywgMC4wMDUp
CisgICAgICAgIHJldHVybiBzZWxmLl90aW1lcl92YWwgPj0gc2VsZi5fdGltZXJfbWF4X3ZhbAor
CisgICAgIworICAgICMgQWN0dWFsIHVuaXQgdGVzdHMKKyAgICAjCisgICAgZGVmIHRlc3RfYWRk
X3RpbWVyX19iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fdGltZXJfdmFsLCAwKQorICAgICAgICBzZWxmLl9icm9r
ZXIuYWRkX3RpbWVyKHNlbGYuY2FsbGJhY2ssIDAuMDA1KQorICAgICAgICBzZWxmLl9icm9rZXIu
cnVuX21lc3NhZ2VfbG9vcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fdGltZXJf
dmFsLCAxKQorCisgICAgZGVmIHRlc3RfYWRkX3RpbWVyX19leHBpcmVkKHNlbGYpOgorICAgICAg
ICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl90aW1l
cl92YWwsIDApCisgICAgICAgIHNlbGYuX2Jyb2tlci5hZGRfdGltZXIoc2VsZi5jYWxsYmFjaywg
MCkKKyAgICAgICAgc2VsZi5fYnJva2VyLnJ1bl9tZXNzYWdlX2xvb3AoKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKHNlbGYuX3RpbWVyX3ZhbCwgMSkKKworICAgIGRlZiB0ZXN0X2FkZF90aW1l
cl9fdG9vX21hbnlfdGltZXJzKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl90aW1lcl92YWwsIDApCisgICAgICAgIHNlbGYu
X2Jyb2tlci5hZGRfdGltZXIoc2VsZi5jYWxsYmFjaywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRS
YWlzZXMoQXNzZXJ0aW9uRXJyb3IsIHNlbGYuX2Jyb2tlci5hZGRfdGltZXIsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2ssIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwoc2VsZi5fdGltZXJfdmFsLCAwKQorCisgICAgZGVmIHRlc3RfYWRkX3RpbWVyX19wZXJpb2Rp
YyhzZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigpCisgICAgICAgIHNlbGYuX3RpbWVy
X21heF92YWwgPSAyCisgICAgICAgIHNlbGYuX2Jyb2tlci5hZGRfdGltZXIoc2VsZi5jYWxsYmFj
aywgMC4wMDUpCisgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5fbWVzc2FnZV9sb29wKCkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl90aW1lcl92YWwsIDIpCisKKyAgICBkZWYgdGVzdF9j
YW5jZWwoc2VsZik6CisgICAgICAgIHNlbGYubWFrZV9icm9rZXIoKQorICAgICAgICB3b3JrZXJf
bmFtZSA9IHNlbGYuX2Jyb2tlci5zdGFydF93b3JrZXIoMCkKKyAgICAgICAgc2VsZi5fYnJva2Vy
LmNhbmNlbF93b3JrZXIod29ya2VyX25hbWUpCisgICAgICAgIHNlbGYuX2Jyb2tlci5wb3N0X21l
c3NhZ2UoJ3N0b3AnKQorICAgICAgICBzZWxmLl9icm9rZXIucnVuX21lc3NhZ2VfbG9vcCgpCisg
ICAgICAgIHNlbGYuX2Jyb2tlci5qb2luX3dvcmtlcih3b3JrZXJfbmFtZSwgMC41KQorICAgICAg
ICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuX2Jyb2tlci53b3JrZXJfaXNfYWxpdmUod29ya2VyX25h
bWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc19kb25lKCkpCisKKyAgICBkZWYg
dGVzdF9kb25lKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VfYnJva2VyKCkKKyAgICAgICAgd29y
a2VyX25hbWUgPSBzZWxmLl9icm9rZXIuc3RhcnRfd29ya2VyKDApCisgICAgICAgIHNlbGYuX2Jy
b2tlci5wb3N0X21lc3NhZ2UoJ3Rlc3QnLCAxLCAnaGVsbG8sIHdvcmxkJykKKyAgICAgICAgc2Vs
Zi5fYnJva2VyLnBvc3RfbWVzc2FnZSgnc3RvcCcpCisgICAgICAgIHNlbGYuX2Jyb2tlci5ydW5f
bWVzc2FnZV9sb29wKCkKKyAgICAgICAgc2VsZi5fYnJva2VyLmpvaW5fd29ya2VyKHdvcmtlcl9u
YW1lLCAwLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5fYnJva2VyLndvcmtlcl9p
c19hbGl2ZSh3b3JrZXJfbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2Rv
bmUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9hbl9pbnQsIDIpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYV9zdHIsICdoaSwgZXZlcnlib2R5JykKKworICAgIGRl
ZiB0ZXN0X3Vua25vd25fbWVzc2FnZShzZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigp
CisgICAgICAgIHdvcmtlcl9uYW1lID0gc2VsZi5fYnJva2VyLnN0YXJ0X3dvcmtlcigwKQorICAg
ICAgICBzZWxmLl9icm9rZXIucG9zdF9tZXNzYWdlKCd1bmtub3duJykKKyAgICAgICAgc2VsZi5f
YnJva2VyLnJ1bl9tZXNzYWdlX2xvb3AoKQorICAgICAgICBzZWxmLl9icm9rZXIuam9pbl93b3Jr
ZXIod29ya2VyX25hbWUsIDAuNSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc19k
b25lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5fYnJva2VyLndvcmtlcl9pc19h
bGl2ZSh3b3JrZXJfbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuX2V4Y2Vw
dGlvblswXSwgVmFsdWVFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5fZXhj
ZXB0aW9uWzFdLAorICAgICAgICAgICAgIlRlc3RXb3JrZXIvMDogcmVjZWl2ZWQgbWVzc2FnZSAn
dW5rbm93bicgaXQgY291bGRuJ3QgaGFuZGxlIikKKworCitjbGFzcyBJbmxpbmVCcm9rZXJUZXN0
cyhfV29ya2VyTWVzc2FnZUJyb2tlclRlc3RzTWl4aW4sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAg
ICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIF9Xb3JrZXJNZXNzYWdlQnJva2VyVGVzdHNNaXhp
bi5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLl93b3JrZXJfbW9kZWwgPSAnaW5saW5lJworCisg
ICAgZGVmIHRlc3RfbG9nX3dlZGdlZF93b3JrZXIoc2VsZik6CisgICAgICAgIHNlbGYubWFrZV9i
cm9rZXIoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgc2VsZi5f
YnJva2VyLmxvZ193ZWRnZWRfd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOb25l
LCBOb25lKQorCisKK2NsYXNzIFRocmVhZGVkQnJva2VyVGVzdHMoX1dvcmtlck1lc3NhZ2VCcm9r
ZXJUZXN0c01peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgor
ICAgICAgICBfV29ya2VyTWVzc2FnZUJyb2tlclRlc3RzTWl4aW4uc2V0VXAoc2VsZikKKyAgICAg
ICAgc2VsZi5fd29ya2VyX21vZGVsID0gJ3RocmVhZHMnCisKKyAgICBkZWYgdGVzdF9maW5kX3Ro
cmVhZF9zdGFja19mb3VuZChzZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcigpCisgICAg
ICAgIGlkLCBzdGFjayA9IHN5cy5fY3VycmVudF9mcmFtZXMoKS5pdGVtcygpWzBdCisgICAgICAg
IGZvdW5kX3N0YWNrID0gc2VsZi5fYnJva2VyLl9maW5kX3RocmVhZF9zdGFjayhpZCkKKyAgICAg
ICAgc2VsZi5hc3NlcnROb3RFcXVhbChmb3VuZF9zdGFjaywgTm9uZSkKKworICAgIGRlZiB0ZXN0
X2ZpbmRfdGhyZWFkX3N0YWNrX25vdF9mb3VuZChzZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX2Jy
b2tlcigpCisgICAgICAgIGZvdW5kX3N0YWNrID0gc2VsZi5fYnJva2VyLl9maW5kX3RocmVhZF9z
dGFjaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdW5kX3N0YWNrLCBOb25lKQorCisg
ICAgZGVmIHRlc3RfbG9nX3dlZGdlZF93b3JrZXIoc2VsZik6CisgICAgICAgIHN0YXJ0aW5nX3F1
ZXVlID0gUXVldWUuUXVldWUoKQorICAgICAgICBzdG9wcGluZ19xdWV1ZSA9IFF1ZXVlLlF1ZXVl
KCkKKyAgICAgICAgc2VsZi5tYWtlX2Jyb2tlcihzdGFydGluZ19xdWV1ZSwgc3RvcHBpbmdfcXVl
dWUpCisgICAgICAgIG9jID0gb3V0cHV0Y2FwdHVyZS5PdXRwdXRDYXB0dXJlKCkKKyAgICAgICAg
b2MuY2FwdHVyZV9vdXRwdXQoKQorCisgICAgICAgIHdvcmtlcl9uYW1lID0gc2VsZi5fYnJva2Vy
LnN0YXJ0X3dvcmtlcigwKQorICAgICAgICBzdGFydGluZ19xdWV1ZS5nZXQoKQorICAgICAgICBz
ZWxmLl9icm9rZXIubG9nX3dlZGdlZF93b3JrZXIod29ya2VyX25hbWUsICd0ZXN0X25hbWUnKQor
ICAgICAgICBzdG9wcGluZ19xdWV1ZS5wdXQoJycpCisgICAgICAgIG9jLnJlc3RvcmVfb3V0cHV0
KCkKKworCitjbGFzcyBNZXNzYWdlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRl
c3RfX25vX2JvZHkoc2VsZik6CisgICAgICAgIG1zZyA9IG1lc3NhZ2VfYnJva2VyLl9NZXNzYWdl
KCdzcmMnLCAndG9waWNfbmFtZScsICdtZXNzYWdlX25hbWUnLCBOb25lKQorICAgICAgICBzZWxm
LmFzc2VydFRydWUocmVwcihtc2cpKQorICAgICAgICBzID0gbXNnLmR1bXBzKCkKKyAgICAgICAg
bmV3X21zZyA9IG1lc3NhZ2VfYnJva2VyLl9NZXNzYWdlLmxvYWRzKHMpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWwobmV3X21zZy5uYW1lLCAnbWVzc2FnZV9uYW1lJykKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChuZXdfbXNnLmJvZHksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwo
bmV3X21zZy50b3BpY19uYW1lLCAndG9waWNfbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwobmV3X21zZy5zcmMsICdzcmMnKQorCisgICAgZGVmIHRlc3RfX2JvZHkoc2VsZik6CisgICAg
ICAgIG1zZyA9IG1lc3NhZ2VfYnJva2VyLl9NZXNzYWdlKCdzcmMnLCAndG9waWNfbmFtZScsICdt
ZXNzYWdlX25hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2Jv
ZHknLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIobXNnKSkKKyAgICAgICAgcyA9
IG1zZy5kdW1wcygpCisgICAgICAgIG5ld19tc2cgPSBtZXNzYWdlX2Jyb2tlci5fTWVzc2FnZS5s
b2FkcyhzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19tc2cubmFtZSwgJ21lc3NhZ2Vf
bmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X21zZy5ib2R5LCAoJ2JvZHknLCAw
KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfbXNnLnRvcGljX25hbWUsICd0b3BpY19u
YW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfbXNnLnNyYywgJ3NyYycpCisKKwor
Y2xhc3MgSW50ZXJmYWNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUaGVzZSB0ZXN0
cyBtb3N0bHkgZXhpc3QgdG8gcGFjaWZ5IGNvdmVyYWdlLgorCisgICAgIyBGSVhNRTogVGhlcmUg
bXVzdCBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyBhbmQgYWxzbyB2ZXJpZnkKKyAgICAjIHRo
YXQgY2xhc3NlcyBkbyBpbXBsZW1lbnQgZXZlcnkgYWJzdHJhY3QgbWV0aG9kIGluIGFuIGludGVy
ZmFjZS4KKworICAgIGRlZiB0ZXN0X3dvcmtlcmNvbm5lY3Rpb25pbnRlcmZhY2VfaXNfYWJzdHJh
Y3Qoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHdlIGNhbid0IGNyZWF0ZSBhbiBpbnN0YW5j
ZSBkaXJlY3RseS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJv
ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9icm9rZXIuX1dvcmtlckNvbm5l
Y3Rpb25JbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb2tlcj1Ob25lLCB3
b3JrZXJfY2xhc3M9Tm9uZSwgd29ya2VyX251bWJlcj1Ob25lKQorCisgICAgICAgIGNsYXNzIFdv
cmtlckNvbm5lY3Rpb24obWVzc2FnZV9icm9rZXIuX1dvcmtlckNvbm5lY3Rpb25JbnRlcmZhY2Up
OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICpvcHRhcmdzKToKKyAgICAgICAgICAg
ICAgICBwYXNzCisKKyAgICAgICAgIyBUZXN0IHRoYXQgYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhv
ZHMgYXJlIGFic3RyYWN0IGFuZCBoYXZlIHRoZQorICAgICAgICAjIHNpZ25hdHVyZSB3ZSBleHBl
Y3QuCisgICAgICAgIG9iaiA9IFdvcmtlckNvbm5lY3Rpb24oKQorICAgICAgICBzZWxmLmFzc2Vy
dFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmouY2FuY2VsKQorICAgICAgICBzZWxmLmFz
c2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmouaXNBbGl2ZSkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLmpvaW4sIE5vbmUpCisgICAg
ICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5uYW1lKQorICAg
ICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmoucG9ydCkKKyAg
ICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgb2JqLm9wdGlvbnMp
CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai5wb3N0
X21lc3NhZ2UsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxl
bWVudGVkRXJyb3IsIG9iai5ydW4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxl
bWVudGVkRXJyb3IsIG9iai5ydW5fbWVzc2FnZV9sb29wKQorICAgICAgICBzZWxmLmFzc2VydFJh
aXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBvYmouc3RhcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0
UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG9iai55aWVsZF90b19icm9rZXIpCisKKyAgICBk
ZWYgdGVzdF9icm9rZXJjbGllbnRpbnRlcmZhY2VfaXNfYWJzdHJhY3Qoc2VsZik6CisgICAgICAg
ICMgVGVzdCB0aGF0IHdlIGNhbid0IGNyZWF0ZSBhbiBpbnN0YW5jZSBkaXJlY3RseS4KKyAgICAg
ICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwKKyAgICAgICAgICAgIG1l
c3NhZ2VfYnJva2VyLkNsaWVudEludGVyZmFjZSwKKyAgICAgICAgICAgIGJyb2tlcl9jb25uZWN0
aW9uPU5vbmUsIHdvcmtlcl9udW1iZXI9Tm9uZSkKKworICAgICAgICBjbGFzcyBXb3JrZXJDbGll
bnQobWVzc2FnZV9icm9rZXIuQ2xpZW50SW50ZXJmYWNlKToKKyAgICAgICAgICAgIGRlZiBfX2lu
aXRfXyhzZWxmLCAqb3B0YXJncyk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMg
VGVzdCB0aGF0IGFsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2RzIGFyZSBhYnN0cmFjdCBhbmQgaGF2
ZSB0aGUKKyAgICAgICAgIyBzaWduYXR1cmUgd2UgZXhwZWN0LgorICAgICAgICBvYmogPSBXb3Jr
ZXJDbGllbnQoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9y
LCBvYmouY2FuY2VsKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVy
cm9yLCBvYmoubmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRF
cnJvciwgb2JqLmlzX2RvbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVu
dGVkRXJyb3IsIG9iai5ydW4pCisKKyAgICBkZWYgdGVzdF9sb2dfd2VkZ2VkX3dvcmtlcihzZWxm
KToKKyAgICAgICAgYnJva2VyID0gbWVzc2FnZV9icm9rZXIuX1dvcmtlck1lc3NhZ2VCcm9rZXIo
Tm9uZSwgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90
SW1wbGVtZW50ZWRFcnJvciwgYnJva2VyLmxvZ193ZWRnZWRfd29ya2VyLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICBOb25lLCBOb25lKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6
CisgICAgdW5pdHRlc3QubWFpbigpCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>