<?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>73079</bug_id>
          
          <creation_ts>2011-11-24 06:53:48 -0800</creation_ts>
          <short_desc>Web Inspector: chromium: I&apos;d like to add a script for running perf tests for WebInspector.</short_desc>
          <delta_ts>2011-11-30 23:16:57 -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>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>72260</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ilya Tikhonovsky">loislo</reporter>
          <assigned_to name="Ilya Tikhonovsky">loislo</assigned_to>
          <cc>abarth</cc>
    
    <cc>apavlov</cc>
    
    <cc>bweinstein</cc>
    
    <cc>dpranke</cc>
    
    <cc>eric</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>ojan</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>rik</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>508755</commentid>
    <comment_count>0</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-11-24 06:53:48 -0800</bug_when>
    <thetext>The idea is to have performance tests for WebInspector.
I was suggested to put these tests into PerformanceTests/inspector.
They produce output in a format that is suitable for chromium perf bot drawing scripts.

I&apos;d like to reuse code for scanning folders for test files.
Because of the fact that original test_files.py has common and layout specific parts
I decided to extract the generic part and put it into webkitpy/common
I think the two packages with name test_files look strange but I have no idea about a better name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>508756</commentid>
    <comment_count>1</comment_count>
      <attachid>116505</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-11-24 06:55:50 -0800</bug_when>
    <thetext>Created attachment 116505
[patch] initial version</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>508833</commentid>
    <comment_count>2</comment_count>
      <attachid>116505</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-11-24 10:35:23 -0800</bug_when>
    <thetext>Comment on attachment 116505
[patch] initial version

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

&gt; Tools/Scripts/run-devtools-perf-test.py:73
&gt; +def main(regular_output=sys.stderr, buildbot_output=sys.stdout):

This main is way too big.  Main should be a tiny function that calls into a class that has tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>508834</commentid>
    <comment_count>3</comment_count>
      <attachid>116505</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-11-24 10:36:38 -0800</bug_when>
    <thetext>Comment on attachment 116505
[patch] initial version

The wrapper script should be small and should call into a class in webkitpy to do the real work.  The class in webkitpy should probably be in a new top-level package for performance tests.  We&apos;ll also need unit tests for the new class.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509351</commentid>
    <comment_count>4</comment_count>
      <attachid>116654</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-11-26 04:23:19 -0800</bug_when>
    <thetext>Created attachment 116654
[patch] second iteration

comments addressed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509367</commentid>
    <comment_count>5</comment_count>
      <attachid>116654</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-11-26 09:08:40 -0800</bug_when>
    <thetext>Comment on attachment 116654
[patch] second iteration

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

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:56
&gt; +def parse_args(args=None):
&gt; +    print_options = printing.print_options()

Why not just put this on PerfTestsRunner?  Free functions are much harder to mock.

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests_unittest.py:43
&gt; +def create_driver():
&gt; +    class TestDriver:
&gt; +

Why not put these on the TestCase?

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests_unittest.py:100
&gt; +    def test_run_passing_test(self):
&gt; +        runner = create_runner()
&gt; +        driver = create_driver()
&gt; +        test_failed, driver_need_restart = runner._run_single_test(&apos;pass.html&apos;, driver)
&gt; +        self.assertFalse(test_failed)
&gt; +        self.assertFalse(driver_need_restart)
&gt; +
&gt; +    def test_run_silent_test(self):
&gt; +        runner = create_runner()
&gt; +        driver = create_driver()
&gt; +        test_failed, driver_need_restart = runner._run_single_test(&apos;silent.html&apos;, driver)
&gt; +        self.assertTrue(test_failed)
&gt; +        self.assertFalse(driver_need_restart)

Looks like copy/paste code.  Can we use a helper?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509709</commentid>
    <comment_count>6</comment_count>
      <attachid>116725</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-11-28 03:46:31 -0800</bug_when>
    <thetext>Created attachment 116725
[patch] third version

comments addressed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509712</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-11-28 03:52:50 -0800</bug_when>
    <thetext>Attachment 116725 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Tools/ChangeLog&apos;, u&apos;Tools/Scripts/run-insp...&quot; exit_code: 1

Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:82:  too many blank lines (2)  [pep8/E303] [5]
Total errors found: 1 in 8 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509713</commentid>
    <comment_count>8</comment_count>
      <attachid>116727</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-11-28 03:55:32 -0800</bug_when>
    <thetext>Created attachment 116727
[patch] third version. style fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509922</commentid>
    <comment_count>9</comment_count>
      <attachid>116727</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-11-28 10:18:03 -0800</bug_when>
    <thetext>Comment on attachment 116727
[patch] third version. style fix.

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

This generally looks good.  We should like Eric take a look though.  We&apos;re not super happy with some of the decisions NRWT makes in how it sets up its harness.  Hopefully Eric will comment on whether you&apos;ve avoided the problems we&apos;re trying to fix in that aspect of NRWT.

Thanks!

&gt; Tools/Scripts/webkitpy/performance_tests/__init__.py:13
&gt; +# Keep this file free of any code or import statements that could
&gt; +# cause either an error to occur or a log message to be logged.
&gt; +# This ensures that calling code can import initialization code from
&gt; +# webkitpy before any errors or log messages due to code in this file.
&gt; +# Initialization code can include things like version-checking code and
&gt; +# logging configuration code.
&gt; +#
&gt; +# We do not execute any version-checking code or logging configuration
&gt; +# code in this file so that callers can opt-in as they want.  This also
&gt; +# allows different callers to choose different initialization code,
&gt; +# as necessary.

I&apos;m not sure this big comment is necessary.  Most of our __init__.py files only have the one line comment at the top.

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:58
&gt; +        self._port = port or Host().port_factory.get(self._options.platform, self._options)

Eric should comment as to whether he&apos;s happy with this use of the Host() constructor.

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:101
&gt; +            print &gt;&gt; sys.stderr, &quot;Build not up to date for &quot; + self._port._path_to_driver()

Why not use _log ?

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:113
&gt; +        return unexpected_result_count

What is an unexpected result for a performance test?

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:135
&gt; +            test_failed, driver_need_restart = self._run_single_test(test, driver)
&gt; +            if test_failed:
&gt; +                unexpected_result_count = unexpected_result_count + 1
&gt; +            else:
&gt; +                expected_result_count = expected_result_count + 1

I see.  It&apos;s a pass/fail count.  Maybe that would be clearer than saying expected/unexpected?

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:165
&gt; +                elif not len(line) == 0:

The &quot;len&quot; isn&apos;t needed here, I don&apos;t think.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510052</commentid>
    <comment_count>10</comment_count>
      <attachid>116727</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-11-28 12:03:06 -0800</bug_when>
    <thetext>Comment on attachment 116727
[patch] third version. style fix.

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

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:42
&gt; +_perf_tests_base_dir = &apos;PerformanceTests&apos;

Seems this should be moved onto the class too.

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:44
&gt; +_result_regex = re.compile(&apos;^RESULT .*$&apos;)

This should be moved onto the class.

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:49
&gt; +def run(perf_tests_dir, regular_output=sys.stderr, buildbot_output=sys.stdout, port=None):
&gt; +    runner = PerfTestsRunner(perf_tests_dir, regular_output, buildbot_output, port)
&gt; +    return runner.run()

Free functions are almost never right.

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:52
&gt; +class PerfTestsRunner:

All modern python objects should inherit from object.  So this should read &quot;class PerfTestsRunner(object):&quot;

Also, normally files match the name of the class they contain.  Not always.  But it seems that run_perf_tests is needlessly different from perftestrunner.py

&gt;&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:58
&gt;&gt; +        self._port = port or Host().port_factory.get(self._options.platform, self._options)
&gt; 
&gt; Eric should comment as to whether he&apos;s happy with this use of the Host() constructor.

This is also an incomplete initialization of a Host object.  You&apos;ll end up w/o a proper SCM.

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:87
&gt; +        filesystem = self._port.filesystem

port.filesystem is going away.  it woudl be better to have a self.host.

&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:94
&gt; +    def run(self):
&gt; +

Leading space?

&gt;&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:101
&gt;&gt; +            print &gt;&gt; sys.stderr, &quot;Build not up to date for &quot; + self._port._path_to_driver()
&gt; 
&gt; Why not use _log ?

Or _printer?  Any time we&apos;re grabbing at sys.* directly we&apos;re making our code less-mockable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510093</commentid>
    <comment_count>11</comment_count>
      <attachid>116801</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-11-28 12:50:07 -0800</bug_when>
    <thetext>Created attachment 116801
[patch] forth version

(In reply to comment #9)
&gt; (From update of attachment 116727 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=116727&amp;action=review
&gt; &gt; 
&gt; &gt; Tools/Scripts/webkitpy/performance_tests/__init__.py:13
&gt; &gt; +# Keep this file free of any code or import statements that could
&gt; &gt; +# code in this file so that callers can opt-in as they want.  This also
&gt; &gt; +# allows different callers to choose different initialization code,
&gt; &gt; +# as necessary.
&gt; 
&gt; I&apos;m not sure this big comment is necessary.  Most of our __init__.py files only have the one line comment at the top.

done.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:58
&gt; &gt; +        self._port = port or Host().port_factory.get(self._options.platform, self._options)
&gt; 
&gt; Eric should comment as to whether he&apos;s happy with this use of the Host() constructor.
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:101
&gt; &gt; +            print &gt;&gt; sys.stderr, &quot;Build not up to date for &quot; + self._port._path_to_driver()
&gt; 
&gt; Why not use _log ?

done.

&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:113
&gt; &gt; +        return unexpected_result_count
&gt; 
&gt; What is an unexpected result for a performance test?
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:135
&gt; &gt; +            test_failed, driver_need_restart = self._run_single_test(test, driver)
&gt; &gt; +            if test_failed:
&gt; &gt; +                unexpected_result_count = unexpected_result_count + 1
&gt; &gt; +            else:
&gt; &gt; +                expected_result_count = expected_result_count + 1
&gt; 
&gt; I see.  It&apos;s a pass/fail count.  Maybe that would be clearer than saying expected/unexpected?

done.

&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:165
&gt; &gt; +                elif not len(line) == 0:
&gt; 
&gt; The &quot;len&quot; isn&apos;t needed here, I don&apos;t think.

I&apos;m checking that the test&apos;s output has nothing but RESULT.* lines and empty lines.



(In reply to comment #10)
&gt; (From update of attachment 116727 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=116727&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:42
&gt; &gt; +_perf_tests_base_dir = &apos;PerformanceTests&apos;
&gt; 
&gt; Seems this should be moved onto the class too.

done.

&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:44
&gt; &gt; +_result_regex = re.compile(&apos;^RESULT .*$&apos;)
&gt; 
&gt; This should be moved onto the class.
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:49
&gt; &gt; +def run(perf_tests_dir, regular_output=sys.stderr, buildbot_output=sys.stdout, port=None):
&gt; &gt; +    runner = PerfTestsRunner(perf_tests_dir, regular_output, buildbot_output, port)
&gt; &gt; +    return runner.run()
&gt; 
&gt; Free functions are almost never right.

done.

&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:52
&gt; &gt; +class PerfTestsRunner:
&gt; 
&gt; All modern python objects should inherit from object.  So this should read &quot;class PerfTestsRunner(object):&quot;

done.

&gt; Also, normally files match the name of the class they contain.  Not always.  But it seems that run_perf_tests is needlessly different from perftestrunner.py
&gt; 
&gt; &gt;&gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:58
&gt; &gt;&gt; +        self._port = port or Host().port_factory.get(self._options.platform, self._options)
&gt; &gt; 
&gt; &gt; Eric should comment as to whether he&apos;s happy with this use of the Host() constructor.
&gt; 
&gt; This is also an incomplete initialization of a Host object.  You&apos;ll end up w/o a proper SCM.

done.

&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:87
&gt; &gt; +        filesystem = self._port.filesystem
&gt; 
&gt; port.filesystem is going away.  it woudl be better to have a self.host.

done.

&gt; &gt; Tools/Scripts/webkitpy/performance_tests/run_perf_tests.py:94
&gt; &gt; +    def run(self):
&gt; &gt; +
&gt; 
&gt; Leading space?

done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510211</commentid>
    <comment_count>12</comment_count>
      <attachid>116801</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-11-28 14:52:51 -0800</bug_when>
    <thetext>Comment on attachment 116801
[patch] forth version

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

The patch looks close to me, just a few comments ...

&gt; Tools/Scripts/webkitpy/common/test_files.py:35
&gt; +under that directory.&quot;&quot;&quot;

If this file is going to be re-used by both layout tests and perf tests, you need to update this docstring. I would be tempted to rename it to something other than &quot;test_files.py&quot; (maybe find_files.py? That&apos;s not very good, either).

&gt; Tools/Scripts/webkitpy/common/test_files.py:52
&gt; +          everything under the base_dir.

Add skipped_directories, file_filter to the docstring.

&gt; Tools/Scripts/webkitpy/layout_tests/port/test_files.py:36
&gt;  

I would probably merge all of the remaining code in this file back into port/base.py, and delete this file. That will solve your &quot;two files with the same name&quot; problem and make the layering clearer, I think.

&gt; Tools/Scripts/webkitpy/performance_tests/perftestsrunner.py:54
&gt; +        self._host._initialize_scm()

Question for Eric ... should this be a public function? Is it supposed to be something that is optional, or should this be called as part of the constructor?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510217</commentid>
    <comment_count>13</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-11-28 14:54:27 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/test_files.py:36
&gt; &gt;  
&gt; 
&gt; I would probably merge all of the remaining code in this file back into port/base.py, and delete this file. That will solve your &quot;two files with the same name&quot; problem and make the layering clearer, I think.
&gt; 

I should have mentioned that it may be that test_files() shouldn&apos;t be a method on port at all, and we should lift this up into manager.py or something else, but I wouldn&apos;t do that as part of this change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510564</commentid>
    <comment_count>14</comment_count>
      <attachid>116910</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-11-29 00:32:48 -0800</bug_when>
    <thetext>Created attachment 116910
[patch] next iteration.

(In reply to comment #12)
&gt; (From update of attachment 116801 [details])
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/test_files.py:35
&gt; &gt; +under that directory.&quot;&quot;&quot;
&gt; 
&gt; If this file is going to be re-used by both layout tests and perf tests, you need to update this docstring. I would be tempted to rename it to something other than &quot;test_files.py&quot; (maybe find_files.py? That&apos;s not very good, either).

renamed to find_files.py

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/test_files.py:52
&gt; &gt; +          everything under the base_dir.
&gt; 
&gt; Add skipped_directories, file_filter to the docstring.

done

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/layout_tests/port/test_files.py:36
&gt; &gt;  
&gt; 
&gt; I would probably merge all of the remaining code in this file back into port/base.py, and delete this file. That will solve your &quot;two files with the same name&quot; problem and make the layering clearer, I think.
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/performance_tests/perftestsrunner.py:54
&gt; &gt; +        self._host._initialize_scm()
&gt; 
&gt; Question for Eric ... should this be a public function? Is it supposed to be something that is optional, or should this be called as part of the constructor?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511307</commentid>
    <comment_count>15</comment_count>
      <attachid>116910</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-11-29 19:07:51 -0800</bug_when>
    <thetext>Comment on attachment 116910
[patch] next iteration.

(In reply to comment #14)
&gt; &gt; I would probably merge all of the remaining code in this file back into port/base.py, and delete this file. That will solve your &quot;two files with the same name&quot; problem and make the layering clearer, I think.

I think you missed this comment, maybe? We should delete port/test_files.py and merge whatever code is needed into base/Port.py</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511320</commentid>
    <comment_count>16</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-11-29 20:07:25 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; (From update of attachment 116910 [details])
&gt; (In reply to comment #14)
&gt; &gt; &gt; I would probably merge all of the remaining code in this file back into port/base.py, and delete this file. That will solve your &quot;two files with the same name&quot; problem and make the layering clearer, I think.
&gt; 
&gt; I think you missed this comment, maybe? We should delete port/test_files.py and merge whatever code is needed into base/Port.py

I thought It&apos;d be simpler do not merge it into port but move it into manager in another patch as you suggested in the last comment. There is no problem with names because I renamed common/test_files to common/find_files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511657</commentid>
    <comment_count>17</comment_count>
      <attachid>117174</attachid>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-11-30 05:15:46 -0800</bug_when>
    <thetext>Created attachment 117174
[patch] next iteration.

(In reply to comment #15)
&gt; (From update of attachment 116910 [details])
&gt; (In reply to comment #14)
&gt; &gt; &gt; I would probably merge all of the remaining code in this file back into port/base.py, and delete this file. That will solve your &quot;two files with the same name&quot; problem and make the layering clearer, I think.
&gt; 
&gt; I think you missed this comment, maybe? We should delete port/test_files.py and merge whatever code is needed into base/Port.py

done.

webkitpy/layout_test/port/test_files.py content was moved into webkitpy/layout_test/port/base.py
the tests for test_files were moved to base_unittests.py</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512034</commentid>
    <comment_count>18</comment_count>
      <attachid>117174</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-11-30 12:49:38 -0800</bug_when>
    <thetext>Comment on attachment 117174
[patch] next iteration.

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

Sorry for the confusion earlier. It&apos;s not clear to me that getting rid of port.tests() and just doing this generically in manager.py is actually the right thing to do, but I definitely didn&apos;t want a port/test_files.py to keep existing, which is why I wanted you to inline it for now.

&gt; Tools/Scripts/run-inspector-perf-tests.py:42
&gt; +    sys.exit(PerfTestsRunner(_perf_tests_dir).run())

Nit: I&apos;d probably just hard-code &apos;inspector&apos; for now and remove the variable if it isn&apos;t needed elsewhere, but it&apos;s up to you.

&gt; Tools/Scripts/webkitpy/layout_tests/port/base.py:470
&gt; +        return find_files.find(self.filesystem, self.layout_tests_dir(), paths, skipped_directories, _is_test_file)

Please rename this to be _find_test_files() to make it clear that this is a protected function, not a public function (see the comment below in rebaseline.py as well; if this has to stay as a public function, that&apos;s fine).


&gt; Tools/Scripts/webkitpy/layout_tests/port/base.py:1020
&gt; +    return _has_supported_extension(filesystem, filename) and not is_reference_html_file(filename)

Can you make _supported_file_extensions be a local variable and move all of these functions next to tests() since they&apos;re related?

&gt; Tools/Scripts/webkitpy/tool/commands/rebaseline.py:121
&gt; +        for test_name in map(self._to_test_name, self._port.find_test_files(args)):

Does this work if it&apos;s just self._port.tests(args)? It seems like this shouldn&apos;t be calling find_test_files (or, previously, test_files.find()) directly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512515</commentid>
    <comment_count>19</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2011-11-30 23:16:57 -0800</bug_when>
    <thetext>Committed r101618: &lt;http://trac.webkit.org/changeset/101618&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116505</attachid>
            <date>2011-11-24 06:55:50 -0800</date>
            <delta_ts>2011-11-26 04:23:19 -0800</delta_ts>
            <desc>[patch] initial version</desc>
            <filename>patch.tools</filename>
            <type>text/plain</type>
            <size>19005</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA2YTc4
NGViLi4yMWM4ZjNlIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMzggQEAKKzIwMTEtMTEtMjQgIElseWEgVGlraG9ub3Zza3kgIDxs
b2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYiBJbnNwZWN0b3I6IGNocm9taXVtOiBJ
J2QgbGlrZSB0byBhZGQgYSBzY3JpcHQgZm9yIHJ1bm5pbmcgcGVyZiB0ZXN0cyBmb3IgV2ViSW5z
cGVjdG9yLgorCisgICAgICAgIFRoZSBpZGVhIGlzIHRvIGhhdmUgcGVyZm9ybWFuY2UgdGVzdHMg
Zm9yIFdlYkluc3BlY3Rvci4KKyAgICAgICAgSSB3YXMgc3VnZ2VzdGVkIHRvIHB1dCB0aGVzZSB0
ZXN0cyBpbnRvIFBlcmZvcm1hbmNlVGVzdHMvaW5zcGVjdG9yLgorICAgICAgICBUaGV5IHByb2R1
Y2Ugb3V0cHV0IGluIGEgZm9ybWF0IHRoYXQgaXMgc3VpdGFibGUgZm9yIGNocm9taXVtIHBlcmYg
Ym90IGRyYXdpbmcgc2NyaXB0cy4KKworICAgICAgICBJJ2QgbGlrZSB0byByZXVzZSBjb2RlIGZv
ciBzY2FubmluZyBmb2xkZXJzIGZvciB0ZXN0IGZpbGVzLgorICAgICAgICBCZWNhdXNlIG9mIHRo
ZSBmYWN0IHRoYXQgb3JpZ2luYWwgdGVzdF9maWxlcy5weSBoYXMgY29tbW9uIGFuZCBsYXlvdXQg
c3BlY2lmaWMgcGFydHMKKyAgICAgICAgSSBkZWNpZGVkIHRvIGV4dHJhY3QgdGhlIGdlbmVyaWMg
cGFydCBhbmQgcHV0IGl0IGludG8gd2Via2l0cHkvY29tbW9uCisgICAgICAgIEkgdGhpbmsgdGhl
IHR3byBwYWNrYWdlcyB3aXRoIG5hbWUgdGVzdF9maWxlcyBsb29rIHN0cmFuZ2UgYnV0IEkgaGF2
ZSBubyBpZGVhIGFib3V0IGEgYmV0dGVyIG5hbWUuCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgKiBTY3JpcHRzL3J1bi1kZXZ0b29scy1wZXJmLXRlc3Qu
cHk6IEFkZGVkLgorICAgICAgICAoY29sbGVjdF90ZXN0cy5faXNfdGVzdF9maWxlKToKKyAgICAg
ICAgKGNvbGxlY3RfdGVzdHMpOgorICAgICAgICAobWFpbik6CisgICAgICAgICogU2NyaXB0cy93
ZWJraXRweS9jb21tb24vdGVzdF9maWxlcy5weTogQ29waWVkIGZyb20gVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVzLnB5LgorICAgICAgICAoZmluZCk6
CisgICAgICAgIChfbm9ybWFsaXplKToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKE1vY2tXaW5GaWxlU3lz
dGVtLmpvaW4pOgorICAgICAgICAoTW9ja1dpbkZpbGVTeXN0ZW0pOgorICAgICAgICAoTW9ja1dp
bkZpbGVTeXN0ZW0ubm9ybXBhdGgpOgorICAgICAgICAoVGVzdFdpbk5vcm1hbGl6ZS5hc3NlcnRf
ZmlsZXN5c3RlbV9ub3JtYWxpemVzKToKKyAgICAgICAgKFRlc3RXaW5Ob3JtYWxpemUudGVzdF9t
b2NrZWRfd2luKToKKyAgICAgICAgKFRlc3RXaW5Ob3JtYWxpemUpOgorICAgICAgICAoVGVzdFdp
bk5vcm1hbGl6ZS50ZXN0X3dpbik6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcG9ydC90ZXN0X2ZpbGVzLnB5OgorICAgICAgICAoZmluZCk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5Ogor
ICAgICAgICAoVGVzdEZpbGVzVGVzdC50ZXN0X2lzX3Rlc3RfZmlsZSk6CisKIDIwMTEtMTEtMjMg
IFNoZXJpZmYgQm90ICA8d2Via2l0LnJldmlldy5ib3RAZ21haWwuY29tPgogCiAgICAgICAgIFVu
cmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHIxMDExMDcuCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRz
L3J1bi1kZXZ0b29scy1wZXJmLXRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3J1bi1kZXZ0b29scy1w
ZXJmLXRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmY5OTdkOAot
LS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvcnVuLWRldnRvb2xzLXBlcmYtdGVzdC5w
eQpAQCAtMCwwICsxLDE1MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAo
QykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0
aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdI
VCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisj
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
IyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKworIiIiUnVuIEluc3BlY3RvcidzIHBlcmYgdGVzdHMgaW4gcGVyZiBtb2RlLiIiIgorCitp
bXBvcnQgbG9nZ2luZworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKwor
ZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0IHRlc3RfZmlsZXMKK2Zyb20gd2Via2l0cHkuY29t
bW9uLmhvc3QgaW1wb3J0IEhvc3QKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLmNvbnRyb2xs
ZXJzIGltcG9ydCBzaW5nbGVfdGVzdF9ydW5uZXIKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3Rz
Lm1vZGVscy50ZXN0X2lucHV0IGltcG9ydCBUZXN0SW5wdXQKK2Zyb20gd2Via2l0cHkubGF5b3V0
X3Rlc3RzLnBvcnQuZHJpdmVyIGltcG9ydCBEcml2ZXJJbnB1dAorZnJvbSB3ZWJraXRweS5sYXlv
dXRfdGVzdHMudmlld3MgaW1wb3J0IHByaW50aW5nCisKK19wZXJmX3Rlc3RzX2RpciA9ICdQZXJm
b3JtYW5jZVRlc3RzL2luc3BlY3RvcicKK19sb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVf
XykKKworcGVyZl9vcHRpb25fbGlzdCA9IFsKKyAgICBvcHRwYXJzZS5tYWtlX29wdGlvbignLS1k
ZWJ1ZycsIGFjdGlvbj0nc3RvcmVfY29uc3QnLCBjb25zdD0nRGVidWcnLCBkZXN0PSJjb25maWd1
cmF0aW9uIiwKKyAgICAgICAgaGVscD0nU2V0IHRoZSBjb25maWd1cmF0aW9uIHRvIERlYnVnJyks
CisgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oJy0tcmVsZWFzZScsIGFjdGlvbj0nc3RvcmVfY29u
c3QnLCBjb25zdD0nUmVsZWFzZScsIGRlc3Q9ImNvbmZpZ3VyYXRpb24iLAorICAgICAgICBoZWxw
PSdTZXQgdGhlIGNvbmZpZ3VyYXRpb24gdG8gUmVsZWFzZScpLAorICAgIG9wdHBhcnNlLm1ha2Vf
b3B0aW9uKCItLXBsYXRmb3JtIiwKKyAgICAgICAgaGVscD0iU3BlY2lmeSBwb3J0L3BsYXRmb3Jt
IGJlaW5nIHRlc3RlZCAoaS5lLiBjaHJvbWl1bS1tYWMpIiksCisgICAgb3B0cGFyc2UubWFrZV9v
cHRpb24oIi0tYnVpbGQtZGlyZWN0b3J5IiwKKyAgICAgICAgaGVscD0iUGF0aCB0byB0aGUgZGly
ZWN0b3J5IHVuZGVyIHdoaWNoIGJ1aWxkIGZpbGVzIGFyZSBrZXB0IChzaG91bGQgbm90IGluY2x1
ZGUgY29uZmlndXJhdGlvbikiKSwKKyAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS10aW1lLW91
dC1tcyIsIGRlZmF1bHQ9MzAwMDAsCisgICAgICAgIGhlbHA9IlNldCB0aGUgdGltZW91dCBmb3Ig
ZWFjaCB0ZXN0IiksCitdCisKKworZGVmIGNvbGxlY3RfdGVzdHMocG9ydCwgcGF0aHMpOgorICAg
ICIiIlJldHVybiB0aGUgbGlzdCBvZiB0ZXN0cyBmb3VuZC4iIiIKKworICAgIGRlZiBfaXNfdGVz
dF9maWxlKGZpbGVzeXN0ZW0sIGRpcm5hbWUsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIGZp
bGVuYW1lLmVuZHN3aXRoKCcuaHRtbCcpCisKKyAgICByZXR1cm4gdGVzdF9maWxlcy5maW5kKHBv
cnQuZmlsZXN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQucGF0aF9mcm9t
X3dlYmtpdF9iYXNlKF9wZXJmX3Rlc3RzX2RpciksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwYXRocz1wYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZmlsdGVyPV9p
c190ZXN0X2ZpbGUpCisKKworZGVmIG1haW4ocmVndWxhcl9vdXRwdXQ9c3lzLnN0ZGVyciwgYnVp
bGRib3Rfb3V0cHV0PXN5cy5zdGRvdXQpOgorICAgIHByaW50X29wdGlvbnMgPSBwcmludGluZy5w
cmludF9vcHRpb25zKCkKKyAgICBvcHRpb25fbGlzdCA9IChwZXJmX29wdGlvbl9saXN0ICsgcHJp
bnRfb3B0aW9ucykKKworICAgIG9wdGlvbnMsIGFyZ3MgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIo
b3B0aW9uX2xpc3Q9b3B0aW9uX2xpc3QpLnBhcnNlX2FyZ3MoKQorICAgIHBvcnQgPSBIb3N0KCku
cG9ydF9mYWN0b3J5LmdldChvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zKQorCisgICAgcHJpbnRl
ciA9IHByaW50aW5nLlByaW50ZXIocG9ydCwgb3B0aW9ucywgcmVndWxhcl9vdXRwdXQsIGJ1aWxk
Ym90X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVfbG9n
Z2luZz1GYWxzZSkKKworICAgIGlmIG9wdGlvbnMuaGVscF9wcmludGluZzoKKyAgICAgICAgcHJp
bnRlci5oZWxwX3ByaW50aW5nKCkKKyAgICAgICAgcHJpbnRlci5jbGVhbnVwKCkKKyAgICAgICAg
cmV0dXJuIDAKKworICAgIGlmIG5vdCBwb3J0LmNoZWNrX2J1aWxkKG5lZWRzX2h0dHA9RmFsc2Up
OgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiQnVpbGQgbm90IHVwIHRvIGRhdGUgZm9y
ICIgKyBwb3J0Ll9wYXRoX3RvX2RyaXZlcigpCisgICAgICAgIHJldHVybiAtMQorCisgICAgZHJp
dmVyID0gcG9ydC5jcmVhdGVfZHJpdmVyKHdvcmtlcl9udW1iZXI9MSkKKworICAgICMgV2Ugd3Jh
cCBhbnkgcGFydHMgb2YgdGhlIHJ1biB0aGF0IGFyZSBzbG93IG9yIGxpa2VseSB0byByYWlzZSBl
eGNlcHRpb25zCisgICAgIyBpbiBhIHRyeS9maW5hbGx5IHRvIGVuc3VyZSB0aGF0IHdlIGNsZWFu
IHVwIHRoZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uCisgICAgdHJ5OgorICAgICAgICB0ZXN0cyA9
IGNvbGxlY3RfdGVzdHMocG9ydCwgYXJncykKKworICAgICAgICByZXN1bHRfY291bnQgPSBsZW4o
dGVzdHMpCisgICAgICAgIGV4cGVjdGVkX3Jlc3VsdF9jb3VudCA9IDAKKyAgICAgICAgdW5leHBl
Y3RlZF9yZXN1bHRfY291bnQgPSAwCisgICAgICAgIHJlc3VsdF9yZWdleCA9IHJlLmNvbXBpbGUo
J15SRVNVTFQgLiokJykKKyAgICAgICAgcHJpbnRlci5wcmludF9vbmVfbGluZV9zdW1tYXJ5KHJl
c3VsdF9jb3VudCwgMCwgMCkKKyAgICAgICAgZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICAgICAg
ICB0ZXN0X2ZhaWxlZCA9IEZhbHNlCisgICAgICAgICAgICBkcml2ZXJfbmVlZF9yZXN0YXJ0ID0g
RmFsc2UKKyAgICAgICAgICAgIG91dHB1dCA9IGRyaXZlci5ydW5fdGVzdChEcml2ZXJJbnB1dCh0
ZXN0LCBvcHRpb25zLnRpbWVfb3V0X21zLCBOb25lLCBGYWxzZSkpCisKKyAgICAgICAgICAgIGlm
IG91dHB1dC50ZXh0ID09IE5vbmU6CisgICAgICAgICAgICAgICAgdGVzdF9mYWlsZWQgPSBUcnVl
CisgICAgICAgICAgICBlbGlmIG91dHB1dC50aW1lb3V0OgorICAgICAgICAgICAgICAgIHByaW50
ZXIud3JpdGUoJ3RpbWVvdXQ6ICVzJyAlIHRlc3RbbGVuKHBvcnQuY29uZmlnLndlYmtpdF9iYXNl
X2RpcigpKSArIDE6XSkKKyAgICAgICAgICAgICAgICB0ZXN0X2ZhaWxlZCA9IFRydWUKKyAgICAg
ICAgICAgICAgICBkcml2ZXJfbmVlZF9yZXN0YXJ0ID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBv
dXRwdXQuY3Jhc2g6CisgICAgICAgICAgICAgICAgcHJpbnRlci53cml0ZSgnY3Jhc2g6ICVzJyAl
IHRlc3RbbGVuKHBvcnQuY29uZmlnLndlYmtpdF9iYXNlX2RpcigpKSArIDE6XSkKKyAgICAgICAg
ICAgICAgICBkcml2ZXJfbmVlZF9yZXN0YXJ0ID0gVHJ1ZQorICAgICAgICAgICAgICAgIHRlc3Rf
ZmFpbGVkID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgbGlu
ZSBpbiByZS5zcGxpdCgnXG4nLCBvdXRwdXQudGV4dCk6CisgICAgICAgICAgICAgICAgICAgIGlm
IHJlc3VsdF9yZWdleC5tYXRjaChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxk
Ym90X291dHB1dC53cml0ZSgiJXNcbiIgJSBsaW5lKQorICAgICAgICAgICAgICAgICAgICBlbGlm
IG5vdCBsZW4obGluZSkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZmFpbGVk
ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlci53cml0ZSgiJXMiICUgbGlu
ZSkKKworICAgICAgICAgICAgaWYgbGVuKG91dHB1dC5lcnJvcik6CisgICAgICAgICAgICAgICAg
cHJpbnRlci53cml0ZSgnZXJyb3I6XG4lcycgJSBvdXRwdXQuZXJyb3IpCisgICAgICAgICAgICAg
ICAgdGVzdF9mYWlsZWQgPSBUcnVlCisKKyAgICAgICAgICAgIGlmIHRlc3RfZmFpbGVkOgorICAg
ICAgICAgICAgICAgIHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50ID0gdW5leHBlY3RlZF9yZXN1bHRf
Y291bnQgKyAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jl
c3VsdF9jb3VudCA9IGV4cGVjdGVkX3Jlc3VsdF9jb3VudCArIDEKKworICAgICAgICAgICAgaWYg
ZHJpdmVyX25lZWRfcmVzdGFydDoKKyAgICAgICAgICAgICAgICBfbG9nLmRlYnVnKCIlcyBraWxs
aW5nIGRyaXZlciIgJSB0ZXN0KQorICAgICAgICAgICAgICAgIGRyaXZlci5zdG9wKCkKKyAgICAg
ICAgICAgICAgICBkcml2ZXIgPSBwb3J0LmNyZWF0ZV9kcml2ZXIod29ya2VyX251bWJlcj0xKQor
CisgICAgICAgICAgICBwcmludGVyLnByaW50X29uZV9saW5lX3N1bW1hcnkocmVzdWx0X2NvdW50
LCBleHBlY3RlZF9yZXN1bHRfY291bnQsIHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50KQorCisgICAg
ICAgIGRyaXZlci5zdG9wKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBwcmludGVyLmNsZWFudXAo
KQorCisgICAgcmV0dXJuIHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50CisKKworaWYgJ19fbWFpbl9f
JyA9PSBfX25hbWVfXzoKKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuSU5G
TywgZm9ybWF0PSIlKG1lc3NhZ2UpcyIpCisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0
IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vdGVzdF9maWxlcy5weSBiL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uZjFmNzQ5OQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXMucHkKQEAgLTAsMCArMSw5MiBAQAorIyEvdXNyL2Jp
bi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisj
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMg
ZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMg
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
IyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
IyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGhpcyBtb2R1bGUgaXMgdXNlZCB0
byBmaW5kIGFsbCBvZiB0aGUgbGF5b3V0IHRlc3QgZmlsZXMgdXNlZCBieQorcnVuLXdlYmtpdC10
ZXN0cy4gSXQgZXhwb3NlcyBvbmUgcHVibGljIGZ1bmN0aW9uIC0gZmluZCgpIC0KK3doaWNoIHRh
a2VzIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcGF0aHMuIElmIGEgbGlzdCBpcyBwYXNzZWQgaW4sIHRo
ZSByZXR1cm5lZAorbGlzdCBvZiB0ZXN0IGZpbGVzIGlzIGNvbnN0cmFpbmVkIHRvIHRob3NlIGZv
dW5kIHVuZGVyIHRoZSBwYXRocyBwYXNzZWQgaW4sCitpLmUuIGNhbGxpbmcgZmluZChbIkxheW91
dFRlc3RzL2Zhc3QiXSkgd2lsbCBvbmx5IHJldHVybiBmaWxlcwordW5kZXIgdGhhdCBkaXJlY3Rv
cnkuIiIiCisKK2ltcG9ydCB0aW1lCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbSBpbXBv
cnQgbG9ndXRpbHMKKworCitfbG9nID0gbG9ndXRpbHMuZ2V0X2xvZ2dlcihfX2ZpbGVfXykKKwor
CitkZWYgZmluZChmaWxlc3lzdGVtLCBiYXNlX2RpciwgcGF0aHM9Tm9uZSwgc2tpcHBlZF9kaXJl
Y3Rvcmllcz1Ob25lLCBmaWxlX2ZpbHRlcj1Ob25lKToKKyAgICAiIiJGaW5kcyB0aGUgc2V0IG9m
IHRlc3RzIHVuZGVyIGEgZ2l2ZW4gbGlzdCBvZiBzdWItcGF0aHMuCisKKyAgICBBcmdzOgorICAg
ICAgcGF0aHM6IGEgbGlzdCBvZiBwYXRoIGV4cHJlc3Npb25zIHJlbGF0aXZlIHRvIGJhc2VfZGly
CisgICAgICAgICAgdG8gc2VhcmNoLiBHbG9iIHBhdHRlcm5zIGFyZSBvaywgYXMgYXJlIHBhdGgg
ZXhwcmVzc2lvbnMgd2l0aAorICAgICAgICAgIGZvcndhcmQgc2xhc2hlcyBvbiBXaW5kb3dzLiBJ
ZiBwYXRocyBpcyBlbXB0eSwgd2UgbG9vayBhdAorICAgICAgICAgIGV2ZXJ5dGhpbmcgdW5kZXIg
dGhlIGJhc2VfZGlyLgorICAgICIiIgorCisgICAgZ2xvYmFsIF9za2lwcGVkX2RpcmVjdG9yaWVz
CisgICAgcGF0aHMgPSBwYXRocyBvciBbJyonXQorICAgIHNraXBwZWRfZGlyZWN0b3JpZXMgPSBz
a2lwcGVkX2RpcmVjdG9yaWVzIG9yIHNldChbJy5zdm4nLCAnX3N2biddKQorICAgIHJldHVybiBf
bm9ybWFsaXplZF9maW5kKGZpbGVzeXN0ZW0sIF9ub3JtYWxpemUoZmlsZXN5c3RlbSwgYmFzZV9k
aXIsIHBhdGhzKSwgc2tpcHBlZF9kaXJlY3RvcmllcywgZmlsZV9maWx0ZXIpCisKKworZGVmIF9u
b3JtYWxpemUoZmlsZXN5c3RlbSwgYmFzZV9kaXIsIHBhdGhzKToKKyAgICByZXR1cm4gW2ZpbGVz
eXN0ZW0ubm9ybXBhdGgoZmlsZXN5c3RlbS5qb2luKGJhc2VfZGlyLCBwYXRoKSkgZm9yIHBhdGgg
aW4gcGF0aHNdCisKKworZGVmIF9ub3JtYWxpemVkX2ZpbmQoZmlsZXN5c3RlbSwgcGF0aHMsIHNr
aXBwZWRfZGlyZWN0b3JpZXMsIGZpbGVfZmlsdGVyKToKKyAgICAiIiJGaW5kcyB0aGUgc2V0IG9m
IHRlc3RzIHVuZGVyIHRoZSBsaXN0IG9mIHBhdGhzLgorCisgICAgQXJnczoKKyAgICAgIHBhdGhz
OiBhIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aCBleHByZXNzaW9ucyB0byBzZWFyY2guCisgICAgICAg
ICAgR2xvYiBwYXR0ZXJucyBhcmUgb2suCisgICAgIiIiCisgICAgZ2F0aGVyX3N0YXJ0X3RpbWUg
PSB0aW1lLnRpbWUoKQorICAgIHBhdGhzX3RvX3dhbGsgPSBzZXQoKQorCisgICAgZm9yIHBhdGgg
aW4gcGF0aHM6CisgICAgICAgICMgSWYgdGhlcmUncyBhbiAqIGluIHRoZSBuYW1lLCBhc3N1bWUg
aXQncyBhIGdsb2IgcGF0dGVybi4KKyAgICAgICAgaWYgcGF0aC5maW5kKCcqJykgPiAtMToKKyAg
ICAgICAgICAgIGZpbGVuYW1lcyA9IGZpbGVzeXN0ZW0uZ2xvYihwYXRoKQorICAgICAgICAgICAg
cGF0aHNfdG9fd2Fsay51cGRhdGUoZmlsZW5hbWVzKQorICAgICAgICBlbHNlOgorICAgICAgICAg
ICAgcGF0aHNfdG9fd2Fsay5hZGQocGF0aCkKKworICAgICMgRklYTUU6IEknbSBub3Qgc3VyZSB0
aGVyZSdzIG11Y2ggcG9pbnQgaW4gdGhpcyBiZWluZyBhIHNldC4gQSBsaXN0IHdvdWxkIHByb2Jh
Ymx5IGJlIGZhc3Rlci4KKyAgICB0ZXN0X2ZpbGVzID0gc2V0KCkKKyAgICBmb3IgcGF0aCBpbiBw
YXRoc190b193YWxrOgorICAgICAgICBmaWxlcyA9IGZpbGVzeXN0ZW0uZmlsZXNfdW5kZXIocGF0
aCwgc2tpcHBlZF9kaXJlY3RvcmllcywgZmlsZV9maWx0ZXIpCisgICAgICAgIHRlc3RfZmlsZXMu
dXBkYXRlKHNldChmaWxlcykpCisKKyAgICBnYXRoZXJfdGltZSA9IHRpbWUudGltZSgpIC0gZ2F0
aGVyX3N0YXJ0X3RpbWUKKyAgICBfbG9nLmRlYnVnKCJUZXN0IGdhdGhlcmluZyB0b29rICVmIHNl
Y29uZHMiICUgZ2F0aGVyX3RpbWUpCisKKyAgICByZXR1cm4gdGVzdF9maWxlcwpkaWZmIC0tZ2l0
IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vdGVzdF9maWxlc191bml0dGVzdC5weSBi
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXNfdW5pdHRlc3QucHkKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0MzY1NgotLS0gL2Rldi9udWxsCisr
KyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXNfdW5pdHRlc3QucHkK
QEAgLTAsMCArMSw2NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0Ogor
IworIyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
IyBkaXN0cmlidXRpb24uCisjICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisj
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0
dGVzdAorCitpbXBvcnQgdGVzdF9maWxlcworCisKK2NsYXNzIE1vY2tXaW5GaWxlU3lzdGVtKG9i
amVjdCk6CisgICAgZGVmIGpvaW4oc2VsZiwgKnBhdGhzKToKKyAgICAgICAgcmV0dXJuICdcXCcu
am9pbihwYXRocykKKworICAgIGRlZiBub3JtcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICAgcmV0
dXJuIHBhdGgucmVwbGFjZSgnLycsICdcXCcpCisKKworY2xhc3MgVGVzdFdpbk5vcm1hbGl6ZSh1
bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMo
c2VsZiwgZmlsZXN5c3RlbSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRlc3RfZmlsZXMu
X25vcm1hbGl6ZShmaWxlc3lzdGVtLCAiYzpcXGZvbyIsCisgICAgICAgICAgICBbJ2Zhc3QvaHRt
bCcsICdmYXN0L2NhbnZhcy8qJywgJ2NvbXBvc2l0aW5nL2Zvby5odG1sJ10pLAorICAgICAgICAg
ICAgWydjOlxcZm9vXFxmYXN0XGh0bWwnLCAnYzpcXGZvb1xcZmFzdFxjYW52YXNcKicsICdjOlxc
Zm9vXGNvbXBvc2l0aW5nXFxmb28uaHRtbCddKQorCisgICAgZGVmIHRlc3RfbW9ja2VkX3dpbihz
ZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3RzIHRlc3RfZmlsZXMubm9ybWFsaXplLCB1c2luZyBw
b3J0YWJsZSBiZWhhdmlvciBlbXVsYXRpbmcKKyAgICAgICAgIyB3aGF0IHdlIHRoaW5rIFdpbmRv
d3MgaXMgc3VwcG9zZWQgdG8gZG8uIFRoaXMgdGVzdCB3aWxsIHJ1biBvbiBhbGwKKyAgICAgICAg
IyBwbGF0Zm9ybXMuCisgICAgICAgIHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhN
b2NrV2luRmlsZVN5c3RlbSgpKQorCisgICAgZGVmIHRlc3Rfd2luKHNlbGYpOgorICAgICAgICAj
IFRoaXMgdGVzdHMgdGhlIGFjdHVhbCB3aW5kb3dzIHBsYXRmb3JtLCB0byBlbnN1cmUgd2UgZ2V0
IHRoZSBzYW1lCisgICAgICAgICMgcmVzdWx0cyB0aGF0IHdlIGdldCBpbiB0ZXN0X21vY2tlZF93
aW4oKS4KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4nOgorICAgICAgICAgICAgcmV0
dXJuCisgICAgICAgIHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhGaWxlU3lzdGVt
KCkpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkK
ZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVz
dF9maWxlcy5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVz
dF9maWxlcy5weQppbmRleCBiOGI4NDEzLi5hZGE2OGIzIDEwMDY0NAotLS0gYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXMucHkKKysrIGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVzLnB5CkBAIC0zNiw2
ICszNiw3IEBAIHVuZGVyIHRoYXQgZGlyZWN0b3J5LiIiIgogCiBpbXBvcnQgdGltZQogCitmcm9t
IHdlYmtpdHB5LmNvbW1vbiBpbXBvcnQgdGVzdF9maWxlcwogZnJvbSB3ZWJraXRweS5jb21tb24u
c3lzdGVtIGltcG9ydCBsb2d1dGlscwogCiAKQEAgLTU4LDQzICs1OSw4IEBAIGRlZiBmaW5kKHBv
cnQsIHBhdGhzPU5vbmUpOgogICAgICAgICAgIGZvcndhcmQgc2xhc2hlcyBvbiBXaW5kb3dzLiBJ
ZiBwYXRocyBpcyBlbXB0eSwgd2UgbG9vayBhdAogICAgICAgICAgIGV2ZXJ5dGhpbmcgdW5kZXIg
dGhlIGxheW91dF90ZXN0c19kaXIoKS4KICAgICAiIiIKLSAgICBwYXRocyA9IHBhdGhzIG9yIFsn
KiddCi0gICAgZmlsZXN5c3RlbSA9IHBvcnQuX2ZpbGVzeXN0ZW0KLSAgICByZXR1cm4gbm9ybWFs
aXplZF9maW5kKGZpbGVzeXN0ZW0sIG5vcm1hbGl6ZShmaWxlc3lzdGVtLCBwb3J0LmxheW91dF90
ZXN0c19kaXIoKSwgcGF0aHMpKQogCi0KLWRlZiBub3JtYWxpemUoZmlsZXN5c3RlbSwgYmFzZV9k
aXIsIHBhdGhzKToKLSAgICByZXR1cm4gW2ZpbGVzeXN0ZW0ubm9ybXBhdGgoZmlsZXN5c3RlbS5q
b2luKGJhc2VfZGlyLCBwYXRoKSkgZm9yIHBhdGggaW4gcGF0aHNdCi0KLQotZGVmIG5vcm1hbGl6
ZWRfZmluZChmaWxlc3lzdGVtLCBwYXRocyk6Ci0gICAgIiIiRmluZHMgdGhlIHNldCBvZiB0ZXN0
cyB1bmRlciB0aGUgbGlzdCBvZiBwYXRocy4KLQotICAgIEFyZ3M6Ci0gICAgICBwYXRoczogYSBs
aXN0IG9mIGFic29sdXRlIHBhdGggZXhwcmVzc2lvbnMgdG8gc2VhcmNoLgotICAgICAgICAgIEds
b2IgcGF0dGVybnMgYXJlIG9rLgotICAgICIiIgotICAgIGdhdGhlcl9zdGFydF90aW1lID0gdGlt
ZS50aW1lKCkKLSAgICBwYXRoc190b193YWxrID0gc2V0KCkKLQotICAgIGZvciBwYXRoIGluIHBh
dGhzOgotICAgICAgICAjIElmIHRoZXJlJ3MgYW4gKiBpbiB0aGUgbmFtZSwgYXNzdW1lIGl0J3Mg
YSBnbG9iIHBhdHRlcm4uCi0gICAgICAgIGlmIHBhdGguZmluZCgnKicpID4gLTE6Ci0gICAgICAg
ICAgICBmaWxlbmFtZXMgPSBmaWxlc3lzdGVtLmdsb2IocGF0aCkKLSAgICAgICAgICAgIHBhdGhz
X3RvX3dhbGsudXBkYXRlKGZpbGVuYW1lcykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHBh
dGhzX3RvX3dhbGsuYWRkKHBhdGgpCi0KLSAgICAjIEZJWE1FOiBJJ20gbm90IHN1cmUgdGhlcmUn
cyBtdWNoIHBvaW50IGluIHRoaXMgYmVpbmcgYSBzZXQuIEEgbGlzdCB3b3VsZCBwcm9iYWJseSBi
ZSBmYXN0ZXIuCi0gICAgdGVzdF9maWxlcyA9IHNldCgpCi0gICAgZm9yIHBhdGggaW4gcGF0aHNf
dG9fd2FsazoKLSAgICAgICAgZmlsZXMgPSBmaWxlc3lzdGVtLmZpbGVzX3VuZGVyKHBhdGgsIF9z
a2lwcGVkX2RpcmVjdG9yaWVzLCBfaXNfdGVzdF9maWxlKQotICAgICAgICB0ZXN0X2ZpbGVzLnVw
ZGF0ZShzZXQoZmlsZXMpKQotCi0gICAgZ2F0aGVyX3RpbWUgPSB0aW1lLnRpbWUoKSAtIGdhdGhl
cl9zdGFydF90aW1lCi0gICAgX2xvZy5kZWJ1ZygiVGVzdCBnYXRoZXJpbmcgdG9vayAlZiBzZWNv
bmRzIiAlIGdhdGhlcl90aW1lKQotCi0gICAgcmV0dXJuIHRlc3RfZmlsZXMKKyAgICByZXR1cm4g
dGVzdF9maWxlcy5maW5kKHBvcnQuZmlsZXN5c3RlbSwgcG9ydC5sYXlvdXRfdGVzdHNfZGlyKCks
IHBhdGhzLCBfc2tpcHBlZF9kaXJlY3RvcmllcywgX2lzX3Rlc3RfZmlsZSkKIAogCiBkZWYgX2hh
c19zdXBwb3J0ZWRfZXh0ZW5zaW9uKGZpbGVzeXN0ZW0sIGZpbGVuYW1lKToKZGlmZiAtLWdpdCBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlc191bml0
dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9m
aWxlc191bml0dGVzdC5weQppbmRleCBhMjliYTQ5Li42ZTliOTcxIDEwMDY0NAotLS0gYS9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXNfdW5pdHRlc3Qu
cHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0X2Zp
bGVzX3VuaXR0ZXN0LnB5CkBAIC02OSwzMyArNjksNSBAQCBjbGFzcyBUZXN0RmlsZXNUZXN0KHVu
aXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0ZXN0X2ZpbGVzLl9p
c190ZXN0X2ZpbGUoZnMsICcnLCAnZm9vLWV4cGVjdGVkLW1pc21hdGNoLmh0bWwnKSkKIAogCi1j
bGFzcyBNb2NrV2luRmlsZVN5c3RlbShvYmplY3QpOgotICAgIGRlZiBqb2luKHNlbGYsICpwYXRo
cyk6Ci0gICAgICAgIHJldHVybiAnXFwnLmpvaW4ocGF0aHMpCi0KLSAgICBkZWYgbm9ybXBhdGgo
c2VsZiwgcGF0aCk6Ci0gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJy8nLCAnXFwnKQotCi0K
LWNsYXNzIFRlc3RXaW5Ob3JtYWxpemUodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBhc3Nl
cnRfZmlsZXN5c3RlbV9ub3JtYWxpemVzKHNlbGYsIGZpbGVzeXN0ZW0pOgotICAgICAgICBzZWxm
LmFzc2VydEVxdWFscyh0ZXN0X2ZpbGVzLm5vcm1hbGl6ZShmaWxlc3lzdGVtLCAiYzpcXGZvbyIs
Ci0gICAgICAgICAgICBbJ2Zhc3QvaHRtbCcsICdmYXN0L2NhbnZhcy8qJywgJ2NvbXBvc2l0aW5n
L2Zvby5odG1sJ10pLAotICAgICAgICAgICAgWydjOlxcZm9vXFxmYXN0XGh0bWwnLCAnYzpcXGZv
b1xcZmFzdFxjYW52YXNcKicsICdjOlxcZm9vXGNvbXBvc2l0aW5nXFxmb28uaHRtbCddKQotCi0g
ICAgZGVmIHRlc3RfbW9ja2VkX3dpbihzZWxmKToKLSAgICAgICAgIyBUaGlzIHRlc3RzIHRlc3Rf
ZmlsZXMubm9ybWFsaXplLCB1c2luZyBwb3J0YWJsZSBiZWhhdmlvciBlbXVsYXRpbmcKLSAgICAg
ICAgIyB3aGF0IHdlIHRoaW5rIFdpbmRvd3MgaXMgc3VwcG9zZWQgdG8gZG8uIFRoaXMgdGVzdCB3
aWxsIHJ1biBvbiBhbGwKLSAgICAgICAgIyBwbGF0Zm9ybXMuCi0gICAgICAgIHNlbGYuYXNzZXJ0
X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhNb2NrV2luRmlsZVN5c3RlbSgpKQotCi0gICAgZGVmIHRl
c3Rfd2luKHNlbGYpOgotICAgICAgICAjIFRoaXMgdGVzdHMgdGhlIGFjdHVhbCB3aW5kb3dzIHBs
YXRmb3JtLCB0byBlbnN1cmUgd2UgZ2V0IHRoZSBzYW1lCi0gICAgICAgICMgcmVzdWx0cyB0aGF0
IHdlIGdldCBpbiB0ZXN0X21vY2tlZF93aW4oKS4KLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9
ICd3aW4nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuYXNzZXJ0X2ZpbGVzeXN0
ZW1fbm9ybWFsaXplcyhGaWxlU3lzdGVtKCkpCi0KLQogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9f
JzoKICAgICB1bml0dGVzdC5tYWluKCkK
</data>
<flag name="review"
          id="115694"
          type_id="1"
          status="-"
          setter="abarth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116654</attachid>
            <date>2011-11-26 04:23:19 -0800</date>
            <delta_ts>2011-11-28 03:46:31 -0800</delta_ts>
            <desc>[patch] second iteration</desc>
            <filename>patch.tools</filename>
            <type>text/plain</type>
            <size>30635</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA4ZjE5
YWU4Li4yZDIwYmQyIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsNjIgQEAKKzIwMTEtMTEtMjYgIElseWEgVGlraG9ub3Zza3kgIDxs
b2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYiBJbnNwZWN0b3I6IGNocm9taXVtOiBJ
J2QgbGlrZSB0byBhZGQgYSBzY3JpcHQgZm9yIHJ1bm5pbmcgcGVyZiB0ZXN0cyBmb3IgV2ViSW5z
cGVjdG9yLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NzMwNzkKKworICAgICAgICBUaGUgaWRlYSBpcyB0byBoYXZlIHBlcmZvcm1hbmNlIHRlc3RzIGZv
ciBXZWJJbnNwZWN0b3IuCisgICAgICAgIEkgd2FzIHN1Z2dlc3RlZCB0byBwdXQgdGhlc2UgdGVz
dHMgaW50byBQZXJmb3JtYW5jZVRlc3RzL2luc3BlY3Rvci4KKyAgICAgICAgVGhleSBwcm9kdWNl
IG91dHB1dCBpbiBhIGZvcm1hdCB0aGF0IGlzIHN1aXRhYmxlIGZvciBjaHJvbWl1bSBwZXJmIGJv
dCBkcmF3aW5nIHNjcmlwdHMuCisKKyAgICAgICAgSSdkIGxpa2UgdG8gcmV1c2UgY29kZSBmb3Ig
c2Nhbm5pbmcgZm9sZGVycyBmb3IgdGVzdCBmaWxlcy4KKyAgICAgICAgQmVjYXVzZSBvZiB0aGUg
ZmFjdCB0aGF0IG9yaWdpbmFsIHRlc3RfZmlsZXMucHkgaGFzIGNvbW1vbiBhbmQgbGF5b3V0IHNw
ZWNpZmljIHBhcnRzCisgICAgICAgIEkgZGVjaWRlZCB0byBleHRyYWN0IHRoZSBnZW5lcmljIHBh
cnQgYW5kIHB1dCBpdCBpbnRvIHdlYmtpdHB5L2NvbW1vbgorICAgICAgICBJIHRoaW5rIHRoZSB0
d28gcGFja2FnZXMgd2l0aCBuYW1lIHRlc3RfZmlsZXMgbG9vayBzdHJhbmdlIGJ1dCBJIGhhdmUg
bm8gaWRlYSBhYm91dCBhIGJldHRlciBuYW1lLgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgICogU2NyaXB0cy9ydW4tZGV2dG9vbHMtcGVyZi10ZXN0cy5w
eTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vdGVzdF9maWxlcy5w
eTogQ29waWVkIGZyb20gVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90
ZXN0X2ZpbGVzLnB5LgorICAgICAgICAoZmluZCk6CisgICAgICAgIChfbm9ybWFsaXplKToKKyAg
ICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5OiBB
ZGRlZC4KKyAgICAgICAgKE1vY2tXaW5GaWxlU3lzdGVtLmpvaW4pOgorICAgICAgICAoTW9ja1dp
bkZpbGVTeXN0ZW0pOgorICAgICAgICAoTW9ja1dpbkZpbGVTeXN0ZW0ubm9ybXBhdGgpOgorICAg
ICAgICAoVGVzdFdpbk5vcm1hbGl6ZS5hc3NlcnRfZmlsZXN5c3RlbV9ub3JtYWxpemVzKToKKyAg
ICAgICAgKFRlc3RXaW5Ob3JtYWxpemUudGVzdF9tb2NrZWRfd2luKToKKyAgICAgICAgKFRlc3RX
aW5Ob3JtYWxpemUpOgorICAgICAgICAoVGVzdFdpbk5vcm1hbGl6ZS50ZXN0X3dpbik6CisgICAg
ICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVzLnB5Ogor
ICAgICAgICAoZmluZCk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cG9ydC90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5OgorICAgICAgICAoVGVzdEZpbGVzVGVzdC50ZXN0
X2lzX3Rlc3RfZmlsZSk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90
ZXN0cy9fX2luaXRfXy5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9wZXJm
b3JtYW5jZV90ZXN0cy9ydW5fcGVyZl90ZXN0cy5weTogQWRkZWQuCisgICAgICAgIChydW4pOgor
ICAgICAgICAocGFyc2VfYXJncyk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX19pbml0X18p
OgorICAgICAgICAoUGVyZlRlc3RzUnVubmVyLl9jb2xsZWN0X3Rlc3RzLl9pc190ZXN0X2ZpbGUp
OgorICAgICAgICAoUGVyZlRlc3RzUnVubmVyLl9jb2xsZWN0X3Rlc3RzKToKKyAgICAgICAgKFBl
cmZUZXN0c1J1bm5lci5ydW4pOgorICAgICAgICAoUGVyZlRlc3RzUnVubmVyLl9ydW5fdGVzdHNf
c2V0KToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3J1bl9w
ZXJmX3Rlc3RzX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKGNyZWF0ZV9kcml2ZXIuVGVz
dERyaXZlci5ydW5fdGVzdCk6CisgICAgICAgIChjcmVhdGVfZHJpdmVyLlRlc3REcml2ZXIpOgor
ICAgICAgICAoY3JlYXRlX2RyaXZlci5UZXN0RHJpdmVyLnN0b3ApOgorICAgICAgICAoY3JlYXRl
X2RyaXZlcik6CisgICAgICAgIChjcmVhdGVfcG9ydC5UZXN0UG9ydCk6CisgICAgICAgIChjcmVh
dGVfcG9ydC5UZXN0UG9ydC5jcmVhdGVfZHJpdmVyKToKKyAgICAgICAgKGNyZWF0ZV9wb3J0KToK
KyAgICAgICAgKGNyZWF0ZV9ydW5uZXIpOgorICAgICAgICAoTWFpblRlc3QudGVzdF9ydW5fcGFz
c2luZ190ZXN0KToKKyAgICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX3NpbGVudF90ZXN0KToKKyAg
ICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX2ZhaWxlZF90ZXN0KToKKyAgICAgICAgKE1haW5UZXN0
LnRlc3RfcnVuX3Rvbmd1ZXlfdGVzdCk6CisgICAgICAgIChNYWluVGVzdC50ZXN0X3J1bl90aW1l
b3V0X3Rlc3QpOgorICAgICAgICAoTWFpblRlc3QudGVzdF9ydW5fY3Jhc2hfdGVzdCk6CisgICAg
ICAgIChNYWluVGVzdCk6CisgICAgICAgIChNYWluVGVzdC50ZXN0X3J1bl90ZXN0X3NldCk6CisK
IDIwMTEtMTEtMjYgIE1hcnRpbiBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEuY29tPgogCiAg
ICAgICAgIFRyeSB0byBmaXggdGhlIGJ1aWxkIGFmdGVyIHIxMDExNzQuCmRpZmYgLS1naXQgYS9U
b29scy9TY3JpcHRzL3J1bi1kZXZ0b29scy1wZXJmLXRlc3RzLnB5IGIvVG9vbHMvU2NyaXB0cy9y
dW4tZGV2dG9vbHMtcGVyZi10ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAw
MDAwLi4wYzNkMzJmCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy9ydW4tZGV2dG9v
bHMtcGVyZi10ZXN0cy5weQpAQCAtMCwwICsxLDQyIEBACisjIS91c3IvYmluL2VudiBweXRob24K
KyMgQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisj
CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24u
CisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorCisiIiJSdW4gSW5zcGVjdG9yJ3MgcGVyZiB0ZXN0cyBpbiBwZXJm
IG1vZGUuIiIiCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc3lzCisKK2Zyb20gd2Via2l0cHku
cGVyZm9ybWFuY2VfdGVzdHMgaW1wb3J0IHJ1bl9wZXJmX3Rlc3RzCisKK19wZXJmX3Rlc3RzX2Rp
ciA9ICdpbnNwZWN0b3InCitfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKK2lm
ICdfX21haW5fXycgPT0gX19uYW1lX186CisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1s
b2dnaW5nLklORk8sIGZvcm1hdD0iJShtZXNzYWdlKXMiKQorICAgIHN5cy5leGl0KHJ1bl9wZXJm
X3Rlc3RzLnJ1bihfcGVyZl90ZXN0c19kaXIpKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vdGVzdF9maWxlcy5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL3Rlc3RfZmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFm
NzQ5OQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rl
c3RfZmlsZXMucHkKQEAgLTAsMCArMSw5MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENv
cHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAg
ICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRz
CisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMg
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKworIiIiVGhpcyBtb2R1bGUgaXMgdXNlZCB0byBmaW5kIGFsbCBvZiB0aGUg
bGF5b3V0IHRlc3QgZmlsZXMgdXNlZCBieQorcnVuLXdlYmtpdC10ZXN0cy4gSXQgZXhwb3NlcyBv
bmUgcHVibGljIGZ1bmN0aW9uIC0gZmluZCgpIC0KK3doaWNoIHRha2VzIGFuIG9wdGlvbmFsIGxp
c3Qgb2YgcGF0aHMuIElmIGEgbGlzdCBpcyBwYXNzZWQgaW4sIHRoZSByZXR1cm5lZAorbGlzdCBv
ZiB0ZXN0IGZpbGVzIGlzIGNvbnN0cmFpbmVkIHRvIHRob3NlIGZvdW5kIHVuZGVyIHRoZSBwYXRo
cyBwYXNzZWQgaW4sCitpLmUuIGNhbGxpbmcgZmluZChbIkxheW91dFRlc3RzL2Zhc3QiXSkgd2ls
bCBvbmx5IHJldHVybiBmaWxlcwordW5kZXIgdGhhdCBkaXJlY3RvcnkuIiIiCisKK2ltcG9ydCB0
aW1lCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbSBpbXBvcnQgbG9ndXRpbHMKKworCitf
bG9nID0gbG9ndXRpbHMuZ2V0X2xvZ2dlcihfX2ZpbGVfXykKKworCitkZWYgZmluZChmaWxlc3lz
dGVtLCBiYXNlX2RpciwgcGF0aHM9Tm9uZSwgc2tpcHBlZF9kaXJlY3Rvcmllcz1Ob25lLCBmaWxl
X2ZpbHRlcj1Ob25lKToKKyAgICAiIiJGaW5kcyB0aGUgc2V0IG9mIHRlc3RzIHVuZGVyIGEgZ2l2
ZW4gbGlzdCBvZiBzdWItcGF0aHMuCisKKyAgICBBcmdzOgorICAgICAgcGF0aHM6IGEgbGlzdCBv
ZiBwYXRoIGV4cHJlc3Npb25zIHJlbGF0aXZlIHRvIGJhc2VfZGlyCisgICAgICAgICAgdG8gc2Vh
cmNoLiBHbG9iIHBhdHRlcm5zIGFyZSBvaywgYXMgYXJlIHBhdGggZXhwcmVzc2lvbnMgd2l0aAor
ICAgICAgICAgIGZvcndhcmQgc2xhc2hlcyBvbiBXaW5kb3dzLiBJZiBwYXRocyBpcyBlbXB0eSwg
d2UgbG9vayBhdAorICAgICAgICAgIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIGJhc2VfZGlyLgorICAg
ICIiIgorCisgICAgZ2xvYmFsIF9za2lwcGVkX2RpcmVjdG9yaWVzCisgICAgcGF0aHMgPSBwYXRo
cyBvciBbJyonXQorICAgIHNraXBwZWRfZGlyZWN0b3JpZXMgPSBza2lwcGVkX2RpcmVjdG9yaWVz
IG9yIHNldChbJy5zdm4nLCAnX3N2biddKQorICAgIHJldHVybiBfbm9ybWFsaXplZF9maW5kKGZp
bGVzeXN0ZW0sIF9ub3JtYWxpemUoZmlsZXN5c3RlbSwgYmFzZV9kaXIsIHBhdGhzKSwgc2tpcHBl
ZF9kaXJlY3RvcmllcywgZmlsZV9maWx0ZXIpCisKKworZGVmIF9ub3JtYWxpemUoZmlsZXN5c3Rl
bSwgYmFzZV9kaXIsIHBhdGhzKToKKyAgICByZXR1cm4gW2ZpbGVzeXN0ZW0ubm9ybXBhdGgoZmls
ZXN5c3RlbS5qb2luKGJhc2VfZGlyLCBwYXRoKSkgZm9yIHBhdGggaW4gcGF0aHNdCisKKworZGVm
IF9ub3JtYWxpemVkX2ZpbmQoZmlsZXN5c3RlbSwgcGF0aHMsIHNraXBwZWRfZGlyZWN0b3JpZXMs
IGZpbGVfZmlsdGVyKToKKyAgICAiIiJGaW5kcyB0aGUgc2V0IG9mIHRlc3RzIHVuZGVyIHRoZSBs
aXN0IG9mIHBhdGhzLgorCisgICAgQXJnczoKKyAgICAgIHBhdGhzOiBhIGxpc3Qgb2YgYWJzb2x1
dGUgcGF0aCBleHByZXNzaW9ucyB0byBzZWFyY2guCisgICAgICAgICAgR2xvYiBwYXR0ZXJucyBh
cmUgb2suCisgICAgIiIiCisgICAgZ2F0aGVyX3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorICAg
IHBhdGhzX3RvX3dhbGsgPSBzZXQoKQorCisgICAgZm9yIHBhdGggaW4gcGF0aHM6CisgICAgICAg
ICMgSWYgdGhlcmUncyBhbiAqIGluIHRoZSBuYW1lLCBhc3N1bWUgaXQncyBhIGdsb2IgcGF0dGVy
bi4KKyAgICAgICAgaWYgcGF0aC5maW5kKCcqJykgPiAtMToKKyAgICAgICAgICAgIGZpbGVuYW1l
cyA9IGZpbGVzeXN0ZW0uZ2xvYihwYXRoKQorICAgICAgICAgICAgcGF0aHNfdG9fd2Fsay51cGRh
dGUoZmlsZW5hbWVzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aHNfdG9fd2Fsay5h
ZGQocGF0aCkKKworICAgICMgRklYTUU6IEknbSBub3Qgc3VyZSB0aGVyZSdzIG11Y2ggcG9pbnQg
aW4gdGhpcyBiZWluZyBhIHNldC4gQSBsaXN0IHdvdWxkIHByb2JhYmx5IGJlIGZhc3Rlci4KKyAg
ICB0ZXN0X2ZpbGVzID0gc2V0KCkKKyAgICBmb3IgcGF0aCBpbiBwYXRoc190b193YWxrOgorICAg
ICAgICBmaWxlcyA9IGZpbGVzeXN0ZW0uZmlsZXNfdW5kZXIocGF0aCwgc2tpcHBlZF9kaXJlY3Rv
cmllcywgZmlsZV9maWx0ZXIpCisgICAgICAgIHRlc3RfZmlsZXMudXBkYXRlKHNldChmaWxlcykp
CisKKyAgICBnYXRoZXJfdGltZSA9IHRpbWUudGltZSgpIC0gZ2F0aGVyX3N0YXJ0X3RpbWUKKyAg
ICBfbG9nLmRlYnVnKCJUZXN0IGdhdGhlcmluZyB0b29rICVmIHNlY29uZHMiICUgZ2F0aGVyX3Rp
bWUpCisKKyAgICByZXR1cm4gdGVzdF9maWxlcwpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vdGVzdF9maWxlc191bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL3Rlc3RfZmlsZXNfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uMTI0MzY1NgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXNfdW5pdHRlc3QucHkKQEAgLTAsMCArMSw2NCBAQAor
IyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMK
KyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAqIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisj
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisj
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisj
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgdGVz
dF9maWxlcworCisKK2NsYXNzIE1vY2tXaW5GaWxlU3lzdGVtKG9iamVjdCk6CisgICAgZGVmIGpv
aW4oc2VsZiwgKnBhdGhzKToKKyAgICAgICAgcmV0dXJuICdcXCcuam9pbihwYXRocykKKworICAg
IGRlZiBub3JtcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgn
LycsICdcXCcpCisKKworY2xhc3MgVGVzdFdpbk5vcm1hbGl6ZSh1bml0dGVzdC5UZXN0Q2FzZSk6
CisgICAgZGVmIGFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMoc2VsZiwgZmlsZXN5c3RlbSk6
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRlc3RfZmlsZXMuX25vcm1hbGl6ZShmaWxlc3lz
dGVtLCAiYzpcXGZvbyIsCisgICAgICAgICAgICBbJ2Zhc3QvaHRtbCcsICdmYXN0L2NhbnZhcy8q
JywgJ2NvbXBvc2l0aW5nL2Zvby5odG1sJ10pLAorICAgICAgICAgICAgWydjOlxcZm9vXFxmYXN0
XGh0bWwnLCAnYzpcXGZvb1xcZmFzdFxjYW52YXNcKicsICdjOlxcZm9vXGNvbXBvc2l0aW5nXFxm
b28uaHRtbCddKQorCisgICAgZGVmIHRlc3RfbW9ja2VkX3dpbihzZWxmKToKKyAgICAgICAgIyBU
aGlzIHRlc3RzIHRlc3RfZmlsZXMubm9ybWFsaXplLCB1c2luZyBwb3J0YWJsZSBiZWhhdmlvciBl
bXVsYXRpbmcKKyAgICAgICAgIyB3aGF0IHdlIHRoaW5rIFdpbmRvd3MgaXMgc3VwcG9zZWQgdG8g
ZG8uIFRoaXMgdGVzdCB3aWxsIHJ1biBvbiBhbGwKKyAgICAgICAgIyBwbGF0Zm9ybXMuCisgICAg
ICAgIHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhNb2NrV2luRmlsZVN5c3RlbSgp
KQorCisgICAgZGVmIHRlc3Rfd2luKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdHMgdGhlIGFj
dHVhbCB3aW5kb3dzIHBsYXRmb3JtLCB0byBlbnN1cmUgd2UgZ2V0IHRoZSBzYW1lCisgICAgICAg
ICMgcmVzdWx0cyB0aGF0IHdlIGdldCBpbiB0ZXN0X21vY2tlZF93aW4oKS4KKyAgICAgICAgaWYg
c3lzLnBsYXRmb3JtICE9ICd3aW4nOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYu
YXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhGaWxlU3lzdGVtKCkpCisKKworaWYgX19uYW1l
X18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlcy5weSBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlcy5weQppbmRleCBi
OGI4NDEzLi5hZGE2OGIzIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXMucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVzLnB5CkBAIC0zNiw2ICszNiw3IEBAIHVuZGVyIHRo
YXQgZGlyZWN0b3J5LiIiIgogCiBpbXBvcnQgdGltZQogCitmcm9tIHdlYmtpdHB5LmNvbW1vbiBp
bXBvcnQgdGVzdF9maWxlcwogZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtIGltcG9ydCBsb2d1
dGlscwogCiAKQEAgLTU4LDQzICs1OSw4IEBAIGRlZiBmaW5kKHBvcnQsIHBhdGhzPU5vbmUpOgog
ICAgICAgICAgIGZvcndhcmQgc2xhc2hlcyBvbiBXaW5kb3dzLiBJZiBwYXRocyBpcyBlbXB0eSwg
d2UgbG9vayBhdAogICAgICAgICAgIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIGxheW91dF90ZXN0c19k
aXIoKS4KICAgICAiIiIKLSAgICBwYXRocyA9IHBhdGhzIG9yIFsnKiddCi0gICAgZmlsZXN5c3Rl
bSA9IHBvcnQuX2ZpbGVzeXN0ZW0KLSAgICByZXR1cm4gbm9ybWFsaXplZF9maW5kKGZpbGVzeXN0
ZW0sIG5vcm1hbGl6ZShmaWxlc3lzdGVtLCBwb3J0LmxheW91dF90ZXN0c19kaXIoKSwgcGF0aHMp
KQogCi0KLWRlZiBub3JtYWxpemUoZmlsZXN5c3RlbSwgYmFzZV9kaXIsIHBhdGhzKToKLSAgICBy
ZXR1cm4gW2ZpbGVzeXN0ZW0ubm9ybXBhdGgoZmlsZXN5c3RlbS5qb2luKGJhc2VfZGlyLCBwYXRo
KSkgZm9yIHBhdGggaW4gcGF0aHNdCi0KLQotZGVmIG5vcm1hbGl6ZWRfZmluZChmaWxlc3lzdGVt
LCBwYXRocyk6Ci0gICAgIiIiRmluZHMgdGhlIHNldCBvZiB0ZXN0cyB1bmRlciB0aGUgbGlzdCBv
ZiBwYXRocy4KLQotICAgIEFyZ3M6Ci0gICAgICBwYXRoczogYSBsaXN0IG9mIGFic29sdXRlIHBh
dGggZXhwcmVzc2lvbnMgdG8gc2VhcmNoLgotICAgICAgICAgIEdsb2IgcGF0dGVybnMgYXJlIG9r
LgotICAgICIiIgotICAgIGdhdGhlcl9zdGFydF90aW1lID0gdGltZS50aW1lKCkKLSAgICBwYXRo
c190b193YWxrID0gc2V0KCkKLQotICAgIGZvciBwYXRoIGluIHBhdGhzOgotICAgICAgICAjIElm
IHRoZXJlJ3MgYW4gKiBpbiB0aGUgbmFtZSwgYXNzdW1lIGl0J3MgYSBnbG9iIHBhdHRlcm4uCi0g
ICAgICAgIGlmIHBhdGguZmluZCgnKicpID4gLTE6Ci0gICAgICAgICAgICBmaWxlbmFtZXMgPSBm
aWxlc3lzdGVtLmdsb2IocGF0aCkKLSAgICAgICAgICAgIHBhdGhzX3RvX3dhbGsudXBkYXRlKGZp
bGVuYW1lcykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHBhdGhzX3RvX3dhbGsuYWRkKHBh
dGgpCi0KLSAgICAjIEZJWE1FOiBJJ20gbm90IHN1cmUgdGhlcmUncyBtdWNoIHBvaW50IGluIHRo
aXMgYmVpbmcgYSBzZXQuIEEgbGlzdCB3b3VsZCBwcm9iYWJseSBiZSBmYXN0ZXIuCi0gICAgdGVz
dF9maWxlcyA9IHNldCgpCi0gICAgZm9yIHBhdGggaW4gcGF0aHNfdG9fd2FsazoKLSAgICAgICAg
ZmlsZXMgPSBmaWxlc3lzdGVtLmZpbGVzX3VuZGVyKHBhdGgsIF9za2lwcGVkX2RpcmVjdG9yaWVz
LCBfaXNfdGVzdF9maWxlKQotICAgICAgICB0ZXN0X2ZpbGVzLnVwZGF0ZShzZXQoZmlsZXMpKQot
Ci0gICAgZ2F0aGVyX3RpbWUgPSB0aW1lLnRpbWUoKSAtIGdhdGhlcl9zdGFydF90aW1lCi0gICAg
X2xvZy5kZWJ1ZygiVGVzdCBnYXRoZXJpbmcgdG9vayAlZiBzZWNvbmRzIiAlIGdhdGhlcl90aW1l
KQotCi0gICAgcmV0dXJuIHRlc3RfZmlsZXMKKyAgICByZXR1cm4gdGVzdF9maWxlcy5maW5kKHBv
cnQuZmlsZXN5c3RlbSwgcG9ydC5sYXlvdXRfdGVzdHNfZGlyKCksIHBhdGhzLCBfc2tpcHBlZF9k
aXJlY3RvcmllcywgX2lzX3Rlc3RfZmlsZSkKIAogCiBkZWYgX2hhc19zdXBwb3J0ZWRfZXh0ZW5z
aW9uKGZpbGVzeXN0ZW0sIGZpbGVuYW1lKToKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlc191bml0dGVzdC5weSBiL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlc191bml0dGVzdC5weQpp
bmRleCBhMjliYTQ5Li42ZTliOTcxIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXNfdW5pdHRlc3QucHkKKysrIGIvVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5CkBA
IC02OSwzMyArNjksNSBAQCBjbGFzcyBUZXN0RmlsZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToK
ICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0ZXN0X2ZpbGVzLl9pc190ZXN0X2ZpbGUoZnMsICcn
LCAnZm9vLWV4cGVjdGVkLW1pc21hdGNoLmh0bWwnKSkKIAogCi1jbGFzcyBNb2NrV2luRmlsZVN5
c3RlbShvYmplY3QpOgotICAgIGRlZiBqb2luKHNlbGYsICpwYXRocyk6Ci0gICAgICAgIHJldHVy
biAnXFwnLmpvaW4ocGF0aHMpCi0KLSAgICBkZWYgbm9ybXBhdGgoc2VsZiwgcGF0aCk6Ci0gICAg
ICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJy8nLCAnXFwnKQotCi0KLWNsYXNzIFRlc3RXaW5Ob3Jt
YWxpemUodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBhc3NlcnRfZmlsZXN5c3RlbV9ub3Jt
YWxpemVzKHNlbGYsIGZpbGVzeXN0ZW0pOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0ZXN0
X2ZpbGVzLm5vcm1hbGl6ZShmaWxlc3lzdGVtLCAiYzpcXGZvbyIsCi0gICAgICAgICAgICBbJ2Zh
c3QvaHRtbCcsICdmYXN0L2NhbnZhcy8qJywgJ2NvbXBvc2l0aW5nL2Zvby5odG1sJ10pLAotICAg
ICAgICAgICAgWydjOlxcZm9vXFxmYXN0XGh0bWwnLCAnYzpcXGZvb1xcZmFzdFxjYW52YXNcKics
ICdjOlxcZm9vXGNvbXBvc2l0aW5nXFxmb28uaHRtbCddKQotCi0gICAgZGVmIHRlc3RfbW9ja2Vk
X3dpbihzZWxmKToKLSAgICAgICAgIyBUaGlzIHRlc3RzIHRlc3RfZmlsZXMubm9ybWFsaXplLCB1
c2luZyBwb3J0YWJsZSBiZWhhdmlvciBlbXVsYXRpbmcKLSAgICAgICAgIyB3aGF0IHdlIHRoaW5r
IFdpbmRvd3MgaXMgc3VwcG9zZWQgdG8gZG8uIFRoaXMgdGVzdCB3aWxsIHJ1biBvbiBhbGwKLSAg
ICAgICAgIyBwbGF0Zm9ybXMuCi0gICAgICAgIHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFs
aXplcyhNb2NrV2luRmlsZVN5c3RlbSgpKQotCi0gICAgZGVmIHRlc3Rfd2luKHNlbGYpOgotICAg
ICAgICAjIFRoaXMgdGVzdHMgdGhlIGFjdHVhbCB3aW5kb3dzIHBsYXRmb3JtLCB0byBlbnN1cmUg
d2UgZ2V0IHRoZSBzYW1lCi0gICAgICAgICMgcmVzdWx0cyB0aGF0IHdlIGdldCBpbiB0ZXN0X21v
Y2tlZF93aW4oKS4KLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4nOgotICAgICAgICAg
ICAgcmV0dXJuCi0gICAgICAgIHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhGaWxl
U3lzdGVtKCkpCi0KLQogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5t
YWluKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVz
dHMvX19pbml0X18ucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3Rz
L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNzZiZjIK
LS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rl
c3RzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMTMgQEAKKyMgUmVxdWlyZWQgZm9yIFB5dGhvbiB0
byBzZWFyY2ggdGhpcyBkaXJlY3RvcnkgZm9yIG1vZHVsZSBmaWxlcworCisjIEtlZXAgdGhpcyBm
aWxlIGZyZWUgb2YgYW55IGNvZGUgb3IgaW1wb3J0IHN0YXRlbWVudHMgdGhhdCBjb3VsZAorIyBj
YXVzZSBlaXRoZXIgYW4gZXJyb3IgdG8gb2NjdXIgb3IgYSBsb2cgbWVzc2FnZSB0byBiZSBsb2dn
ZWQuCisjIFRoaXMgZW5zdXJlcyB0aGF0IGNhbGxpbmcgY29kZSBjYW4gaW1wb3J0IGluaXRpYWxp
emF0aW9uIGNvZGUgZnJvbQorIyB3ZWJraXRweSBiZWZvcmUgYW55IGVycm9ycyBvciBsb2cgbWVz
c2FnZXMgZHVlIHRvIGNvZGUgaW4gdGhpcyBmaWxlLgorIyBJbml0aWFsaXphdGlvbiBjb2RlIGNh
biBpbmNsdWRlIHRoaW5ncyBsaWtlIHZlcnNpb24tY2hlY2tpbmcgY29kZSBhbmQKKyMgbG9nZ2lu
ZyBjb25maWd1cmF0aW9uIGNvZGUuCisjCisjIFdlIGRvIG5vdCBleGVjdXRlIGFueSB2ZXJzaW9u
LWNoZWNraW5nIGNvZGUgb3IgbG9nZ2luZyBjb25maWd1cmF0aW9uCisjIGNvZGUgaW4gdGhpcyBm
aWxlIHNvIHRoYXQgY2FsbGVycyBjYW4gb3B0LWluIGFzIHRoZXkgd2FudC4gIFRoaXMgYWxzbwor
IyBhbGxvd3MgZGlmZmVyZW50IGNhbGxlcnMgdG8gY2hvb3NlIGRpZmZlcmVudCBpbml0aWFsaXph
dGlvbiBjb2RlLAorIyBhcyBuZWNlc3NhcnkuCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3J1bl9wZXJmX3Rlc3RzLnB5IGIvVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0cy9ydW5fcGVyZl90ZXN0cy5weQpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGU5ZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0cy9ydW5fcGVyZl90ZXN0cy5weQpA
QCAtMCwwICsxLDE4MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykg
MjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICog
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQor
IyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBm
cm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KworIiIiUnVuIEluc3BlY3RvcidzIHBlcmYgdGVzdHMgaW4gcGVyZiBtb2RlLiIiIgorCitpbXBv
cnQgbG9nZ2luZworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworZnJv
bSB3ZWJraXRweS5jb21tb24gaW1wb3J0IHRlc3RfZmlsZXMKK2Zyb20gd2Via2l0cHkuY29tbW9u
Lmhvc3QgaW1wb3J0IEhvc3QKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQuZHJpdmVy
IGltcG9ydCBEcml2ZXJJbnB1dAorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMudmlld3MgaW1w
b3J0IHByaW50aW5nCisKK19wZXJmX3Rlc3RzX2Jhc2VfZGlyID0gJ1BlcmZvcm1hbmNlVGVzdHMn
CitfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCitfcmVzdWx0X3JlZ2V4ID0gcmUu
Y29tcGlsZSgnXlJFU1VMVCAuKiQnKQorCisKK2RlZiBydW4ocGVyZl90ZXN0c19kaXIsIHJlZ3Vs
YXJfb3V0cHV0PXN5cy5zdGRlcnIsIGJ1aWxkYm90X291dHB1dD1zeXMuc3Rkb3V0LCBwb3J0PU5v
bmUpOgorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZV9hcmdzKCkKKyAgICBwb3J0ID0gcG9ydCBv
ciBIb3N0KCkucG9ydF9mYWN0b3J5LmdldChvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zKQorICAg
IHByaW50ZXIgPSBwcmludGluZy5QcmludGVyKHBvcnQsIG9wdGlvbnMsIHJlZ3VsYXJfb3V0cHV0
LCBidWlsZGJvdF9vdXRwdXQsIGNvbmZpZ3VyZV9sb2dnaW5nPUZhbHNlKQorICAgIHJ1bm5lciA9
IFBlcmZUZXN0c1J1bm5lcihwZXJmX3Rlc3RzX2Rpciwgb3B0aW9ucywgYXJncywgcHJpbnRlciwg
YnVpbGRib3Rfb3V0cHV0KQorICAgIHJldHVybiBydW5uZXIucnVuKHBvcnQpCisKKworZGVmIHBh
cnNlX2FyZ3MoYXJncz1Ob25lKToKKyAgICBwcmludF9vcHRpb25zID0gcHJpbnRpbmcucHJpbnRf
b3B0aW9ucygpCisKKyAgICBwZXJmX29wdGlvbl9saXN0ID0gWworICAgICAgICBvcHRwYXJzZS5t
YWtlX29wdGlvbignLS1kZWJ1ZycsIGFjdGlvbj0nc3RvcmVfY29uc3QnLCBjb25zdD0nRGVidWcn
LCBkZXN0PSJjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVs
cD0nU2V0IHRoZSBjb25maWd1cmF0aW9uIHRvIERlYnVnJyksCisgICAgICAgIG9wdHBhcnNlLm1h
a2Vfb3B0aW9uKCctLXJlbGVhc2UnLCBhY3Rpb249J3N0b3JlX2NvbnN0JywgY29uc3Q9J1JlbGVh
c2UnLCBkZXN0PSJjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aGVscD0nU2V0IHRoZSBjb25maWd1cmF0aW9uIHRvIFJlbGVhc2UnKSwKKyAgICAgICAgb3B0cGFy
c2UubWFrZV9vcHRpb24oIi0tcGxhdGZvcm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBoZWxwPSJTcGVjaWZ5IHBvcnQvcGxhdGZvcm0gYmVpbmcgdGVzdGVkIChpLmUuIGNocm9taXVt
LW1hYykiKSwKKyAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tYnVpbGQtZGlyZWN0b3J5
IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byB0aGUgZGlyZWN0
b3J5IHVuZGVyIHdoaWNoIGJ1aWxkIGZpbGVzIGFyZSBrZXB0IChzaG91bGQgbm90IGluY2x1ZGUg
Y29uZmlndXJhdGlvbikiKSwKKyAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tdGltZS1v
dXQtbXMiLCBkZWZhdWx0PTMwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxw
PSJTZXQgdGhlIHRpbWVvdXQgZm9yIGVhY2ggdGVzdCIpLAorICAgICAgICBdCisKKyAgICBvcHRp
b25fbGlzdCA9IChwZXJmX29wdGlvbl9saXN0ICsgcHJpbnRfb3B0aW9ucykKKyAgICByZXR1cm4g
b3B0cGFyc2UuT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbl9saXN0KS5wYXJzZV9hcmdz
KGFyZ3MpCisKKworY2xhc3MgUGVyZlRlc3RzUnVubmVyOgorCisgICAgZGVmIF9faW5pdF9fKHNl
bGYsIHBlcmZfdGVzdHNfZGlyLCBvcHRpb25zLCBhcmdzLCBwcmludGVyLCBidWlsZGJvdF9vdXRw
dXQpOgorICAgICAgICBzZWxmLl9wZXJmX3Rlc3RzX2RpciA9IHBlcmZfdGVzdHNfZGlyCisgICAg
ICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIHNlbGYuX2FyZ3MgPSBhcmdzCisg
ICAgICAgIHNlbGYuX2J1aWxkYm90X291dHB1dCA9IGJ1aWxkYm90X291dHB1dAorICAgICAgICBz
ZWxmLl9wcmludGVyID0gcHJpbnRlcgorICAgICAgICBzZWxmLl93ZWJraXRfYmFzZV9kaXJfbGVu
ID0gLTEKKworICAgIGRlZiBfY29sbGVjdF90ZXN0cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJu
IHRoZSBsaXN0IG9mIHRlc3RzIGZvdW5kLiIiIgorCisgICAgICAgIGRlZiBfaXNfdGVzdF9maWxl
KGZpbGVzeXN0ZW0sIGRpcm5hbWUsIGZpbGVuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBmaWxl
bmFtZS5lbmRzd2l0aCgnLmh0bWwnKQorCisgICAgICAgIGZpbGVzeXN0ZW0gPSBzZWxmLl9wb3J0
LmZpbGVzeXN0ZW0KKyAgICAgICAgcmV0dXJuIHRlc3RfZmlsZXMuZmluZChmaWxlc3lzdGVtLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQucGF0aF9mcm9tX3dlYmtp
dF9iYXNlKGZpbGVzeXN0ZW0uam9pbihfcGVyZl90ZXN0c19iYXNlX2Rpciwgc2VsZi5fcGVyZl90
ZXN0c19kaXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocz1zZWxmLl9h
cmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZmlsdGVyPV9pc190ZXN0
X2ZpbGUpCisKKyAgICBkZWYgcnVuKHNlbGYsIHBvcnQpOgorICAgICAgICBzZWxmLl9wb3J0ID0g
cG9ydAorICAgICAgICBzZWxmLl93ZWJraXRfYmFzZV9kaXJfbGVuID0gbGVuKHNlbGYuX3BvcnQu
Y29uZmlnLndlYmtpdF9iYXNlX2RpcigpKQorCisgICAgICAgIGlmIHNlbGYuX29wdGlvbnMuaGVs
cF9wcmludGluZzoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50ZXIuaGVscF9wcmludGluZygpCisg
ICAgICAgICAgICBzZWxmLl9wcmludGVyLmNsZWFudXAoKQorICAgICAgICAgICAgcmV0dXJuIDAK
KworICAgICAgICBpZiBub3Qgc2VsZi5fcG9ydC5jaGVja19idWlsZChuZWVkc19odHRwPUZhbHNl
KToKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJCdWlsZCBub3QgdXAgdG8gZGF0
ZSBmb3IgIiArIHNlbGYuX3BvcnQuX3BhdGhfdG9fZHJpdmVyKCkKKyAgICAgICAgICAgIHJldHVy
biAtMQorCisgICAgICAgICMgV2Ugd3JhcCBhbnkgcGFydHMgb2YgdGhlIHJ1biB0aGF0IGFyZSBz
bG93IG9yIGxpa2VseSB0byByYWlzZSBleGNlcHRpb25zCisgICAgICAgICMgaW4gYSB0cnkvZmlu
YWxseSB0byBlbnN1cmUgdGhhdCB3ZSBjbGVhbiB1cCB0aGUgbG9nZ2luZyBjb25maWd1cmF0aW9u
LgorICAgICAgICB1bmV4cGVjdGVkX3Jlc3VsdF9jb3VudCA9IC0xCisgICAgICAgIHRyeToKKyAg
ICAgICAgICAgIHRlc3RzID0gc2VsZi5fY29sbGVjdF90ZXN0cygpCisgICAgICAgICAgICB1bmV4
cGVjdGVkX3Jlc3VsdF9jb3VudCA9IHNlbGYuX3J1bl90ZXN0c19zZXQodGVzdHMsIHNlbGYuX3Bv
cnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9wcmludGVyLmNsZWFudXAo
KQorCisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkX3Jlc3VsdF9jb3VudAorCisgICAgZGVmIF9y
dW5fdGVzdHNfc2V0KHNlbGYsIHRlc3RzLCBwb3J0KToKKyAgICAgICAgcmVzdWx0X2NvdW50ID0g
bGVuKHRlc3RzKQorICAgICAgICBleHBlY3RlZF9yZXN1bHRfY291bnQgPSAwCisgICAgICAgIHVu
ZXhwZWN0ZWRfcmVzdWx0X2NvdW50ID0gMAorICAgICAgICBzZWxmLl9wcmludGVyLnByaW50X29u
ZV9saW5lX3N1bW1hcnkocmVzdWx0X2NvdW50LCAwLCAwKQorICAgICAgICBkcml2ZXJfbmVlZF9y
ZXN0YXJ0ID0gRmFsc2UKKyAgICAgICAgZHJpdmVyID0gTm9uZQorCisgICAgICAgIGZvciB0ZXN0
IGluIHRlc3RzOgorICAgICAgICAgICAgaWYgZHJpdmVyX25lZWRfcmVzdGFydDoKKyAgICAgICAg
ICAgICAgICBfbG9nLmRlYnVnKCIlcyBraWxsaW5nIGRyaXZlciIgJSB0ZXN0KQorICAgICAgICAg
ICAgICAgIGRyaXZlci5zdG9wKCkKKyAgICAgICAgICAgICAgICBkcml2ZXIgPSBOb25lCisgICAg
ICAgICAgICBpZiBub3QgZHJpdmVyOgorICAgICAgICAgICAgICAgIGRyaXZlciA9IHBvcnQuY3Jl
YXRlX2RyaXZlcih3b3JrZXJfbnVtYmVyPTEpCisKKyAgICAgICAgICAgIHRlc3RfZmFpbGVkLCBk
cml2ZXJfbmVlZF9yZXN0YXJ0ID0gc2VsZi5fcnVuX3NpbmdsZV90ZXN0KHRlc3QsIGRyaXZlcikK
KyAgICAgICAgICAgIGlmIHRlc3RfZmFpbGVkOgorICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRf
cmVzdWx0X2NvdW50ID0gdW5leHBlY3RlZF9yZXN1bHRfY291bnQgKyAxCisgICAgICAgICAgICBl
bHNlOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3VsdF9jb3VudCA9IGV4cGVjdGVkX3Jl
c3VsdF9jb3VudCArIDEKKworICAgICAgICAgICAgc2VsZi5fcHJpbnRlci5wcmludF9vbmVfbGlu
ZV9zdW1tYXJ5KHJlc3VsdF9jb3VudCwgZXhwZWN0ZWRfcmVzdWx0X2NvdW50LCB1bmV4cGVjdGVk
X3Jlc3VsdF9jb3VudCkKKworICAgICAgICBpZiBkcml2ZXI6CisgICAgICAgICAgICBkcml2ZXIu
c3RvcCgpCisKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50CisKKyAgICBk
ZWYgX3J1bl9zaW5nbGVfdGVzdChzZWxmLCB0ZXN0LCBkcml2ZXIpOgorICAgICAgICB0ZXN0X2Zh
aWxlZCA9IEZhbHNlCisgICAgICAgIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBGYWxzZQorICAgICAg
ICBvdXRwdXQgPSBkcml2ZXIucnVuX3Rlc3QoRHJpdmVySW5wdXQodGVzdCwgc2VsZi5fb3B0aW9u
cy50aW1lX291dF9tcywgTm9uZSwgRmFsc2UpKQorCisgICAgICAgIGlmIG91dHB1dC50ZXh0ID09
IE5vbmU6CisgICAgICAgICAgICB0ZXN0X2ZhaWxlZCA9IFRydWUKKyAgICAgICAgZWxpZiBvdXRw
dXQudGltZW91dDoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50ZXIud3JpdGUoJ3RpbWVvdXQ6ICVz
JyAlIHRlc3Rbc2VsZi5fd2Via2l0X2Jhc2VfZGlyX2xlbiArIDE6XSkKKyAgICAgICAgICAgIHRl
c3RfZmFpbGVkID0gVHJ1ZQorICAgICAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFydCA9IFRydWUK
KyAgICAgICAgZWxpZiBvdXRwdXQuY3Jhc2g6CisgICAgICAgICAgICBzZWxmLl9wcmludGVyLndy
aXRlKCdjcmFzaDogJXMnICUgdGVzdFtzZWxmLl93ZWJraXRfYmFzZV9kaXJfbGVuICsgMTpdKQor
ICAgICAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFydCA9IFRydWUKKyAgICAgICAgICAgIHRlc3Rf
ZmFpbGVkID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ290X2FfcmVzdWx0ID0g
RmFsc2UKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHJlLnNwbGl0KCdcbicsIG91dHB1dC50ZXh0
KToKKyAgICAgICAgICAgICAgICBpZiBfcmVzdWx0X3JlZ2V4Lm1hdGNoKGxpbmUpOgorICAgICAg
ICAgICAgICAgICAgICBzZWxmLl9idWlsZGJvdF9vdXRwdXQud3JpdGUoIiVzXG4iICUgbGluZSkK
KyAgICAgICAgICAgICAgICAgICAgZ290X2FfcmVzdWx0ID0gVHJ1ZQorICAgICAgICAgICAgICAg
IGVsaWYgbm90IGxlbihsaW5lKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICB0ZXN0X2ZhaWxl
ZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJpbnRlci53cml0ZSgiJXMiICUg
bGluZSkKKyAgICAgICAgICAgIHRlc3RfZmFpbGVkID0gdGVzdF9mYWlsZWQgb3Igbm90IGdvdF9h
X3Jlc3VsdAorCisgICAgICAgIGlmIGxlbihvdXRwdXQuZXJyb3IpOgorICAgICAgICAgICAgc2Vs
Zi5fcHJpbnRlci53cml0ZSgnZXJyb3I6XG4lcycgJSBvdXRwdXQuZXJyb3IpCisgICAgICAgICAg
ICB0ZXN0X2ZhaWxlZCA9IFRydWUKKworICAgICAgICByZXR1cm4gdGVzdF9mYWlsZWQsIGRyaXZl
cl9uZWVkX3Jlc3RhcnQKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvcGVyZm9y
bWFuY2VfdGVzdHMvcnVuX3BlcmZfdGVzdHNfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3J1bl9wZXJmX3Rlc3RzX3VuaXR0ZXN0LnB5Cm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDI1MGYKLS0tIC9kZXYvbnVsbAorKysg
Yi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3J1bl9wZXJmX3Rlc3Rz
X3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTQzIEBACisjIS91c3IvYmluL3B5dGhvbgorIyBDb3B5
cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
IyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3Rz
IGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdHMgZm9yIHJ1bl9wZXJmX3Rlc3RzLiIiIgorCitpbXBv
cnQgdW5pdHRlc3QKKworZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0IGFycmF5X3N0cmVhbQor
ZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydC5kcml2ZXIgaW1wb3J0IERyaXZlcklucHV0
LCBEcml2ZXJPdXRwdXQKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQudGVzdCBpbXBv
cnQgdW5pdF90ZXN0X2ZpbGVzeXN0ZW0KK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnZpZXdz
IGltcG9ydCBwcmludGluZworZnJvbSB3ZWJraXRweS5wZXJmb3JtYW5jZV90ZXN0cy5ydW5fcGVy
Zl90ZXN0cyBpbXBvcnQgcnVuLCBwYXJzZV9hcmdzLCBQZXJmVGVzdHNSdW5uZXIKKworCitkZWYg
Y3JlYXRlX2RyaXZlcigpOgorICAgIGNsYXNzIFRlc3REcml2ZXI6CisKKyAgICAgICAgZGVmIHJ1
bl90ZXN0KHNlbGYsIGRyaXZlcl9pbnB1dCk6CisgICAgICAgICAgICB0ZXh0ID0gJycKKyAgICAg
ICAgICAgIHRpbWVvdXQgPSBGYWxzZQorICAgICAgICAgICAgY3Jhc2ggPSBGYWxzZQorICAgICAg
ICAgICAgaWYgZHJpdmVyX2lucHV0LnRlc3RfbmFtZSA9PSAncGFzcy5odG1sJzoKKyAgICAgICAg
ICAgICAgICB0ZXh0ID0gJ1JFU1VMVCBncm91cF9uYW1lOiB0ZXN0X25hbWU9IDQyIG1zJworICAg
ICAgICAgICAgaWYgZHJpdmVyX2lucHV0LnRlc3RfbmFtZSA9PSAndGltZW91dC5odG1sJzoKKyAg
ICAgICAgICAgICAgICB0aW1lb3V0ID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBkcml2ZXJfaW5w
dXQudGVzdF9uYW1lID09ICdmYWlsZWQuaHRtbCc6CisgICAgICAgICAgICAgICAgdGV4dCA9IE5v
bmUKKyAgICAgICAgICAgIGVsaWYgZHJpdmVyX2lucHV0LnRlc3RfbmFtZSA9PSAndG9uZ3VleS5o
dG1sJzoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gJ3dlIGFyZSBub3QgZXhwZWN0aW5nIGFuIG91
dHB1dCBmcm9tIHBlcmYgdGVzdHMgYnV0IFJFU1VMVCBibGFibGFibGEnCisgICAgICAgICAgICBl
bGlmIGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0gJ2NyYXNoLmh0bWwnOgorICAgICAgICAgICAg
ICAgIGNyYXNoID0gVHJ1ZQorICAgICAgICAgICAgZHJpdmVyX291dHB1dCA9IERyaXZlck91dHB1
dCh0ZXh0LCAnJywgJycsICcnLCBjcmFzaD1jcmFzaCwgdGltZW91dD10aW1lb3V0KQorICAgICAg
ICAgICAgcmV0dXJuIGRyaXZlcl9vdXRwdXQKKworICAgICAgICBkZWYgc3RvcChzZWxmKToKKyAg
ICAgICAgICAgICIiImRvIG5vdGhpbmciIiIKKworICAgIHJldHVybiBUZXN0RHJpdmVyKCkKKwor
CitkZWYgY3JlYXRlX3BvcnQoKToKKyAgICBjbGFzcyBUZXN0UG9ydDoKKworICAgICAgICBkZWYg
Y3JlYXRlX2RyaXZlcihzZWxmLCB3b3JrZXJfbnVtYmVyPU5vbmUpOgorICAgICAgICAgICAgcmV0
dXJuIGNyZWF0ZV9kcml2ZXIoKQorCisgICAgcmV0dXJuIFRlc3RQb3J0KCkKKworCitkZWYgY3Jl
YXRlX3J1bm5lcihidWlsZGJvdF9vdXRwdXQ9Tm9uZSk6CisgICAgYnVpbGRib3Rfb3V0cHV0ID0g
YnVpbGRib3Rfb3V0cHV0IG9yIGFycmF5X3N0cmVhbS5BcnJheVN0cmVhbSgpCisgICAgcmVndWxh
cl9vdXRwdXQgPSBhcnJheV9zdHJlYW0uQXJyYXlTdHJlYW0oKQorICAgIGFyZ3MgPSBbJy0tdGlt
ZS1vdXQtbXMnLCAzMDAwMF0KKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VfYXJncyhhcmdzKQor
ICAgIHBvcnQgPSBjcmVhdGVfcG9ydCgpCisgICAgcHJpbnRlciA9IHByaW50aW5nLlByaW50ZXIo
cG9ydCwgb3B0aW9ucywgcmVndWxhcl9vdXRwdXQsIGJ1aWxkYm90X291dHB1dCwgY29uZmlndXJl
X2xvZ2dpbmc9RmFsc2UpCisgICAgcmV0dXJuIFBlcmZUZXN0c1J1bm5lcignJywgb3B0aW9ucywg
YXJncywgcHJpbnRlciwgYnVpbGRib3Rfb3V0cHV0KQorCisKK2NsYXNzIE1haW5UZXN0KHVuaXR0
ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3J1bl9wYXNzaW5nX3Rlc3Qoc2VsZik6Cisg
ICAgICAgIHJ1bm5lciA9IGNyZWF0ZV9ydW5uZXIoKQorICAgICAgICBkcml2ZXIgPSBjcmVhdGVf
ZHJpdmVyKCkKKyAgICAgICAgdGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBydW5u
ZXIuX3J1bl9zaW5nbGVfdGVzdCgncGFzcy5odG1sJywgZHJpdmVyKQorICAgICAgICBzZWxmLmFz
c2VydEZhbHNlKHRlc3RfZmFpbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRyaXZlcl9u
ZWVkX3Jlc3RhcnQpCisKKyAgICBkZWYgdGVzdF9ydW5fc2lsZW50X3Rlc3Qoc2VsZik6CisgICAg
ICAgIHJ1bm5lciA9IGNyZWF0ZV9ydW5uZXIoKQorICAgICAgICBkcml2ZXIgPSBjcmVhdGVfZHJp
dmVyKCkKKyAgICAgICAgdGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBydW5uZXIu
X3J1bl9zaW5nbGVfdGVzdCgnc2lsZW50Lmh0bWwnLCBkcml2ZXIpCisgICAgICAgIHNlbGYuYXNz
ZXJ0VHJ1ZSh0ZXN0X2ZhaWxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkcml2ZXJfbmVl
ZF9yZXN0YXJ0KQorCisgICAgZGVmIHRlc3RfcnVuX2ZhaWxlZF90ZXN0KHNlbGYpOgorICAgICAg
ICBydW5uZXIgPSBjcmVhdGVfcnVubmVyKCkKKyAgICAgICAgZHJpdmVyID0gY3JlYXRlX2RyaXZl
cigpCisgICAgICAgIHRlc3RfZmFpbGVkLCBkcml2ZXJfbmVlZF9yZXN0YXJ0ID0gcnVubmVyLl9y
dW5fc2luZ2xlX3Rlc3QoJ2ZhaWxlZC5odG1sJywgZHJpdmVyKQorICAgICAgICBzZWxmLmFzc2Vy
dFRydWUodGVzdF9mYWlsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZHJpdmVyX25lZWRf
cmVzdGFydCkKKworICAgIGRlZiB0ZXN0X3J1bl90b25ndWV5X3Rlc3Qoc2VsZik6CisgICAgICAg
IHJ1bm5lciA9IGNyZWF0ZV9ydW5uZXIoKQorICAgICAgICBkcml2ZXIgPSBjcmVhdGVfZHJpdmVy
KCkKKyAgICAgICAgdGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBydW5uZXIuX3J1
bl9zaW5nbGVfdGVzdCgndG9uZ3VleS5odG1sJywgZHJpdmVyKQorICAgICAgICBzZWxmLmFzc2Vy
dFRydWUodGVzdF9mYWlsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZHJpdmVyX25lZWRf
cmVzdGFydCkKKworICAgIGRlZiB0ZXN0X3J1bl90aW1lb3V0X3Rlc3Qoc2VsZik6CisgICAgICAg
IHJ1bm5lciA9IGNyZWF0ZV9ydW5uZXIoKQorICAgICAgICBkcml2ZXIgPSBjcmVhdGVfZHJpdmVy
KCkKKyAgICAgICAgdGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBydW5uZXIuX3J1
bl9zaW5nbGVfdGVzdCgndGltZW91dC5odG1sJywgZHJpdmVyKQorICAgICAgICBzZWxmLmFzc2Vy
dFRydWUodGVzdF9mYWlsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkcml2ZXJfbmVlZF9y
ZXN0YXJ0KQorCisgICAgZGVmIHRlc3RfcnVuX2NyYXNoX3Rlc3Qoc2VsZik6CisgICAgICAgIHJ1
bm5lciA9IGNyZWF0ZV9ydW5uZXIoKQorICAgICAgICBkcml2ZXIgPSBjcmVhdGVfZHJpdmVyKCkK
KyAgICAgICAgdGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBydW5uZXIuX3J1bl9z
aW5nbGVfdGVzdCgnY3Jhc2guaHRtbCcsIGRyaXZlcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVl
KHRlc3RfZmFpbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZHJpdmVyX25lZWRfcmVzdGFy
dCkKKworICAgIGRlZiB0ZXN0X3J1bl90ZXN0X3NldChzZWxmKToKKyAgICAgICAgYnVpbGRib3Rf
b3V0cHV0ID0gYXJyYXlfc3RyZWFtLkFycmF5U3RyZWFtKCkKKyAgICAgICAgcnVubmVyID0gY3Jl
YXRlX3J1bm5lcihidWlsZGJvdF9vdXRwdXQpCisgICAgICAgIGRyaXZlciA9IGNyZWF0ZV9kcml2
ZXIoKQorICAgICAgICBwb3J0ID0gY3JlYXRlX3BvcnQoKQorICAgICAgICB0ZXN0cyA9IFsncGFz
cy5odG1sJywgJ3NpbGVudC5odG1sJywgJ2ZhaWxlZC5odG1sJywgJ3Rvbmd1ZXkuaHRtbCcsICd0
aW1lb3V0Lmh0bWwnLCAnY3Jhc2guaHRtbCddCisgICAgICAgIHVuZXhwZWN0ZWRfcmVzdWx0X2Nv
dW50ID0gcnVubmVyLl9ydW5fdGVzdHNfc2V0KHRlc3RzLCBwb3J0KQorICAgICAgICBzZWxmLmFz
c2VydEVxdWFsKHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50LCBsZW4odGVzdHMpIC0gMSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVpbGRib3Rfb3V0cHV0LmdldCgpKSwgMSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbChidWlsZGJvdF9vdXRwdXQuZ2V0KClbMF0sICdSRVNVTFQgZ3Jv
dXBfbmFtZTogdGVzdF9uYW1lPSA0MiBtc1xuJykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWlu
X18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116725</attachid>
            <date>2011-11-28 03:46:31 -0800</date>
            <delta_ts>2011-11-28 03:55:32 -0800</delta_ts>
            <desc>[patch] third version</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>30452</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCAwMTdm
MzlkLi5jYTI3MzEzIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsNjQgQEAKKzIwMTEtMTEtMjggIElseWEgVGlraG9ub3Zza3kgIDxs
b2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYiBJbnNwZWN0b3I6IGNocm9taXVtOiBJ
J2QgbGlrZSB0byBhZGQgYSBzY3JpcHQgZm9yIHJ1bm5pbmcgcGVyZiB0ZXN0cyBmb3IgV2ViSW5z
cGVjdG9yLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NzMwNzkKKworICAgICAgICBUaGUgaWRlYSBpcyB0byBoYXZlIHBlcmZvcm1hbmNlIHRlc3RzIGZv
ciBXZWJJbnNwZWN0b3IuCisgICAgICAgIEkgd2FzIHN1Z2dlc3RlZCB0byBwdXQgdGhlc2UgdGVz
dHMgaW50byBQZXJmb3JtYW5jZVRlc3RzL2luc3BlY3Rvci4KKyAgICAgICAgVGhleSBwcm9kdWNl
IG91dHB1dCBpbiBhIGZvcm1hdCB0aGF0IGlzIHN1aXRhYmxlIGZvciBjaHJvbWl1bSBwZXJmIGJv
dCBkcmF3aW5nIHNjcmlwdHMuCisKKyAgICAgICAgSSdkIGxpa2UgdG8gcmV1c2UgY29kZSBmb3Ig
c2Nhbm5pbmcgZm9sZGVycyBmb3IgdGVzdCBmaWxlcy4KKyAgICAgICAgQmVjYXVzZSBvZiB0aGUg
ZmFjdCB0aGF0IG9yaWdpbmFsIHRlc3RfZmlsZXMucHkgaGFzIGNvbW1vbiBhbmQgbGF5b3V0IHNw
ZWNpZmljIHBhcnRzCisgICAgICAgIEkgZGVjaWRlZCB0byBleHRyYWN0IHRoZSBnZW5lcmljIHBh
cnQgYW5kIHB1dCBpdCBpbnRvIHdlYmtpdHB5L2NvbW1vbgorICAgICAgICBJIHRoaW5rIHRoZSB0
d28gcGFja2FnZXMgd2l0aCBuYW1lIHRlc3RfZmlsZXMgbG9vayBzdHJhbmdlIGJ1dCBJIGhhdmUg
bm8gaWRlYSBhYm91dCBhIGJldHRlciBuYW1lLgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgICogU2NyaXB0cy9ydW4taW5zcGVjdG9yLXBlcmYtdGVzdHMu
cHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXMu
cHk6IENvcGllZCBmcm9tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQv
dGVzdF9maWxlcy5weS4KKyAgICAgICAgKGZpbmQpOgorICAgICAgICAoX25vcm1hbGl6ZSk6Cisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vdGVzdF9maWxlc191bml0dGVzdC5weTog
QWRkZWQuCisgICAgICAgIChNb2NrV2luRmlsZVN5c3RlbS5qb2luKToKKyAgICAgICAgKE1vY2tX
aW5GaWxlU3lzdGVtKToKKyAgICAgICAgKE1vY2tXaW5GaWxlU3lzdGVtLm5vcm1wYXRoKToKKyAg
ICAgICAgKFRlc3RXaW5Ob3JtYWxpemUuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyk6Cisg
ICAgICAgIChUZXN0V2luTm9ybWFsaXplLnRlc3RfbW9ja2VkX3dpbik6CisgICAgICAgIChUZXN0
V2luTm9ybWFsaXplKToKKyAgICAgICAgKFRlc3RXaW5Ob3JtYWxpemUudGVzdF93aW4pOgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlcy5weToK
KyAgICAgICAgKGZpbmQpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvdGVzdF9maWxlc191bml0dGVzdC5weToKKyAgICAgICAgKFRlc3RGaWxlc1Rlc3QudGVz
dF9pc190ZXN0X2ZpbGUpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2Vf
dGVzdHMvX19pbml0X18ucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVy
Zm9ybWFuY2VfdGVzdHMvcnVuX3BlcmZfdGVzdHMucHk6IEFkZGVkLgorICAgICAgICAocnVuKToK
KyAgICAgICAgKFBlcmZUZXN0c1J1bm5lci5fX2luaXRfXyk6CisgICAgICAgIChQZXJmVGVzdHNS
dW5uZXIucGFyc2VfYXJncyk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX2NvbGxlY3RfdGVz
dHMuX2lzX3Rlc3RfZmlsZSk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX2NvbGxlY3RfdGVz
dHMpOgorICAgICAgICAoUGVyZlRlc3RzUnVubmVyLnJ1bik6CisgICAgICAgIChQZXJmVGVzdHNS
dW5uZXIuX3J1bl90ZXN0c19zZXQpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVyZm9y
bWFuY2VfdGVzdHMvcnVuX3BlcmZfdGVzdHNfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAo
TWFpblRlc3QuY3JlYXRlX2RyaXZlci5UZXN0RHJpdmVyLnJ1bl90ZXN0KToKKyAgICAgICAgKE1h
aW5UZXN0LmNyZWF0ZV9kcml2ZXIuVGVzdERyaXZlcik6CisgICAgICAgIChNYWluVGVzdC5jcmVh
dGVfZHJpdmVyLlRlc3REcml2ZXIuc3RvcCk6CisgICAgICAgIChNYWluVGVzdC5jcmVhdGVfZHJp
dmVyKToKKyAgICAgICAgKE1haW5UZXN0LmNyZWF0ZV9wb3J0LlRlc3RQb3J0Ll9faW5pdF9fKToK
KyAgICAgICAgKE1haW5UZXN0LmNyZWF0ZV9wb3J0LlRlc3RQb3J0KToKKyAgICAgICAgKE1haW5U
ZXN0LmNyZWF0ZV9wb3J0LlRlc3RQb3J0LmNyZWF0ZV9kcml2ZXIpOgorICAgICAgICAoTWFpblRl
c3QuY3JlYXRlX3BvcnQpOgorICAgICAgICAoTWFpblRlc3QuY3JlYXRlX3J1bm5lcik6CisgICAg
ICAgIChNYWluVGVzdC5ydW5fdGVzdCk6CisgICAgICAgIChNYWluVGVzdC50ZXN0X3J1bl9wYXNz
aW5nX3Rlc3QpOgorICAgICAgICAoTWFpblRlc3QudGVzdF9ydW5fc2lsZW50X3Rlc3QpOgorICAg
ICAgICAoTWFpblRlc3QudGVzdF9ydW5fZmFpbGVkX3Rlc3QpOgorICAgICAgICAoTWFpblRlc3Qu
dGVzdF9ydW5fdG9uZ3VleV90ZXN0KToKKyAgICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX3RpbWVv
dXRfdGVzdCk6CisgICAgICAgIChNYWluVGVzdC50ZXN0X3J1bl9jcmFzaF90ZXN0KToKKyAgICAg
ICAgKE1haW5UZXN0KToKKyAgICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX3Rlc3Rfc2V0KToKKwog
MjAxMS0xMS0yOCAgS2VudGFybyBIYXJhICA8aGFyYWtlbkBjaHJvbWl1bS5vcmc+CiAKICAgICAg
ICAgcnVuLWJpbmRpbmdzLXRlc3RzIHNob3dzIGRpZmYgZXJyb3IgZm9yIGEgbmV3bHkgYWRkZWQg
YmluZGluZyB0ZXN0CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3J1bi1pbnNwZWN0b3ItcGVy
Zi10ZXN0cy5weSBiL1Rvb2xzL1NjcmlwdHMvcnVuLWluc3BlY3Rvci1wZXJmLXRlc3RzLnB5Cm5l
dyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjM2QzMmYKLS0tIC9kZXYvbnVsbAor
KysgYi9Ub29scy9TY3JpcHRzL3J1bi1pbnNwZWN0b3ItcGVyZi10ZXN0cy5weQpAQCAtMCwwICsx
LDQyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDExIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMK
KyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJSdW4g
SW5zcGVjdG9yJ3MgcGVyZiB0ZXN0cyBpbiBwZXJmIG1vZGUuIiIiCisKK2ltcG9ydCBsb2dnaW5n
CitpbXBvcnQgc3lzCisKK2Zyb20gd2Via2l0cHkucGVyZm9ybWFuY2VfdGVzdHMgaW1wb3J0IHJ1
bl9wZXJmX3Rlc3RzCisKK19wZXJmX3Rlc3RzX2RpciA9ICdpbnNwZWN0b3InCitfbG9nID0gbG9n
Z2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKK2lmICdfX21haW5fXycgPT0gX19uYW1lX186Cisg
ICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1hdD0iJShtZXNz
YWdlKXMiKQorICAgIHN5cy5leGl0KHJ1bl9wZXJmX3Rlc3RzLnJ1bihfcGVyZl90ZXN0c19kaXIp
KQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vdGVzdF9maWxlcy5w
eSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXMucHkKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmNzQ5OQotLS0gL2Rldi9udWxsCisrKyBiL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXMucHkKQEAgLTAsMCArMSw5MiBA
QAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
IyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdv
b2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGhpcyBtb2R1
bGUgaXMgdXNlZCB0byBmaW5kIGFsbCBvZiB0aGUgbGF5b3V0IHRlc3QgZmlsZXMgdXNlZCBieQor
cnVuLXdlYmtpdC10ZXN0cy4gSXQgZXhwb3NlcyBvbmUgcHVibGljIGZ1bmN0aW9uIC0gZmluZCgp
IC0KK3doaWNoIHRha2VzIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcGF0aHMuIElmIGEgbGlzdCBpcyBw
YXNzZWQgaW4sIHRoZSByZXR1cm5lZAorbGlzdCBvZiB0ZXN0IGZpbGVzIGlzIGNvbnN0cmFpbmVk
IHRvIHRob3NlIGZvdW5kIHVuZGVyIHRoZSBwYXRocyBwYXNzZWQgaW4sCitpLmUuIGNhbGxpbmcg
ZmluZChbIkxheW91dFRlc3RzL2Zhc3QiXSkgd2lsbCBvbmx5IHJldHVybiBmaWxlcwordW5kZXIg
dGhhdCBkaXJlY3RvcnkuIiIiCisKK2ltcG9ydCB0aW1lCisKK2Zyb20gd2Via2l0cHkuY29tbW9u
LnN5c3RlbSBpbXBvcnQgbG9ndXRpbHMKKworCitfbG9nID0gbG9ndXRpbHMuZ2V0X2xvZ2dlcihf
X2ZpbGVfXykKKworCitkZWYgZmluZChmaWxlc3lzdGVtLCBiYXNlX2RpciwgcGF0aHM9Tm9uZSwg
c2tpcHBlZF9kaXJlY3Rvcmllcz1Ob25lLCBmaWxlX2ZpbHRlcj1Ob25lKToKKyAgICAiIiJGaW5k
cyB0aGUgc2V0IG9mIHRlc3RzIHVuZGVyIGEgZ2l2ZW4gbGlzdCBvZiBzdWItcGF0aHMuCisKKyAg
ICBBcmdzOgorICAgICAgcGF0aHM6IGEgbGlzdCBvZiBwYXRoIGV4cHJlc3Npb25zIHJlbGF0aXZl
IHRvIGJhc2VfZGlyCisgICAgICAgICAgdG8gc2VhcmNoLiBHbG9iIHBhdHRlcm5zIGFyZSBvaywg
YXMgYXJlIHBhdGggZXhwcmVzc2lvbnMgd2l0aAorICAgICAgICAgIGZvcndhcmQgc2xhc2hlcyBv
biBXaW5kb3dzLiBJZiBwYXRocyBpcyBlbXB0eSwgd2UgbG9vayBhdAorICAgICAgICAgIGV2ZXJ5
dGhpbmcgdW5kZXIgdGhlIGJhc2VfZGlyLgorICAgICIiIgorCisgICAgZ2xvYmFsIF9za2lwcGVk
X2RpcmVjdG9yaWVzCisgICAgcGF0aHMgPSBwYXRocyBvciBbJyonXQorICAgIHNraXBwZWRfZGly
ZWN0b3JpZXMgPSBza2lwcGVkX2RpcmVjdG9yaWVzIG9yIHNldChbJy5zdm4nLCAnX3N2biddKQor
ICAgIHJldHVybiBfbm9ybWFsaXplZF9maW5kKGZpbGVzeXN0ZW0sIF9ub3JtYWxpemUoZmlsZXN5
c3RlbSwgYmFzZV9kaXIsIHBhdGhzKSwgc2tpcHBlZF9kaXJlY3RvcmllcywgZmlsZV9maWx0ZXIp
CisKKworZGVmIF9ub3JtYWxpemUoZmlsZXN5c3RlbSwgYmFzZV9kaXIsIHBhdGhzKToKKyAgICBy
ZXR1cm4gW2ZpbGVzeXN0ZW0ubm9ybXBhdGgoZmlsZXN5c3RlbS5qb2luKGJhc2VfZGlyLCBwYXRo
KSkgZm9yIHBhdGggaW4gcGF0aHNdCisKKworZGVmIF9ub3JtYWxpemVkX2ZpbmQoZmlsZXN5c3Rl
bSwgcGF0aHMsIHNraXBwZWRfZGlyZWN0b3JpZXMsIGZpbGVfZmlsdGVyKToKKyAgICAiIiJGaW5k
cyB0aGUgc2V0IG9mIHRlc3RzIHVuZGVyIHRoZSBsaXN0IG9mIHBhdGhzLgorCisgICAgQXJnczoK
KyAgICAgIHBhdGhzOiBhIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aCBleHByZXNzaW9ucyB0byBzZWFy
Y2guCisgICAgICAgICAgR2xvYiBwYXR0ZXJucyBhcmUgb2suCisgICAgIiIiCisgICAgZ2F0aGVy
X3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorICAgIHBhdGhzX3RvX3dhbGsgPSBzZXQoKQorCisg
ICAgZm9yIHBhdGggaW4gcGF0aHM6CisgICAgICAgICMgSWYgdGhlcmUncyBhbiAqIGluIHRoZSBu
YW1lLCBhc3N1bWUgaXQncyBhIGdsb2IgcGF0dGVybi4KKyAgICAgICAgaWYgcGF0aC5maW5kKCcq
JykgPiAtMToKKyAgICAgICAgICAgIGZpbGVuYW1lcyA9IGZpbGVzeXN0ZW0uZ2xvYihwYXRoKQor
ICAgICAgICAgICAgcGF0aHNfdG9fd2Fsay51cGRhdGUoZmlsZW5hbWVzKQorICAgICAgICBlbHNl
OgorICAgICAgICAgICAgcGF0aHNfdG9fd2Fsay5hZGQocGF0aCkKKworICAgICMgRklYTUU6IEkn
bSBub3Qgc3VyZSB0aGVyZSdzIG11Y2ggcG9pbnQgaW4gdGhpcyBiZWluZyBhIHNldC4gQSBsaXN0
IHdvdWxkIHByb2JhYmx5IGJlIGZhc3Rlci4KKyAgICB0ZXN0X2ZpbGVzID0gc2V0KCkKKyAgICBm
b3IgcGF0aCBpbiBwYXRoc190b193YWxrOgorICAgICAgICBmaWxlcyA9IGZpbGVzeXN0ZW0uZmls
ZXNfdW5kZXIocGF0aCwgc2tpcHBlZF9kaXJlY3RvcmllcywgZmlsZV9maWx0ZXIpCisgICAgICAg
IHRlc3RfZmlsZXMudXBkYXRlKHNldChmaWxlcykpCisKKyAgICBnYXRoZXJfdGltZSA9IHRpbWUu
dGltZSgpIC0gZ2F0aGVyX3N0YXJ0X3RpbWUKKyAgICBfbG9nLmRlYnVnKCJUZXN0IGdhdGhlcmlu
ZyB0b29rICVmIHNlY29uZHMiICUgZ2F0aGVyX3RpbWUpCisKKyAgICByZXR1cm4gdGVzdF9maWxl
cwpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vdGVzdF9maWxlc191
bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXNfdW5p
dHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0MzY1NgotLS0g
L2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXNf
dW5pdHRlc3QucHkKQEAgLTAsMCArMSw2NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyMgbWV0OgorIworIyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisj
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBzeXMK
K2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgdGVzdF9maWxlcworCisKK2NsYXNzIE1vY2tXaW5G
aWxlU3lzdGVtKG9iamVjdCk6CisgICAgZGVmIGpvaW4oc2VsZiwgKnBhdGhzKToKKyAgICAgICAg
cmV0dXJuICdcXCcuam9pbihwYXRocykKKworICAgIGRlZiBub3JtcGF0aChzZWxmLCBwYXRoKToK
KyAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgnLycsICdcXCcpCisKKworY2xhc3MgVGVzdFdp
bk5vcm1hbGl6ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGFzc2VydF9maWxlc3lzdGVt
X25vcm1hbGl6ZXMoc2VsZiwgZmlsZXN5c3RlbSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxz
KHRlc3RfZmlsZXMuX25vcm1hbGl6ZShmaWxlc3lzdGVtLCAiYzpcXGZvbyIsCisgICAgICAgICAg
ICBbJ2Zhc3QvaHRtbCcsICdmYXN0L2NhbnZhcy8qJywgJ2NvbXBvc2l0aW5nL2Zvby5odG1sJ10p
LAorICAgICAgICAgICAgWydjOlxcZm9vXFxmYXN0XGh0bWwnLCAnYzpcXGZvb1xcZmFzdFxjYW52
YXNcKicsICdjOlxcZm9vXGNvbXBvc2l0aW5nXFxmb28uaHRtbCddKQorCisgICAgZGVmIHRlc3Rf
bW9ja2VkX3dpbihzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3RzIHRlc3RfZmlsZXMubm9ybWFs
aXplLCB1c2luZyBwb3J0YWJsZSBiZWhhdmlvciBlbXVsYXRpbmcKKyAgICAgICAgIyB3aGF0IHdl
IHRoaW5rIFdpbmRvd3MgaXMgc3VwcG9zZWQgdG8gZG8uIFRoaXMgdGVzdCB3aWxsIHJ1biBvbiBh
bGwKKyAgICAgICAgIyBwbGF0Zm9ybXMuCisgICAgICAgIHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1f
bm9ybWFsaXplcyhNb2NrV2luRmlsZVN5c3RlbSgpKQorCisgICAgZGVmIHRlc3Rfd2luKHNlbGYp
OgorICAgICAgICAjIFRoaXMgdGVzdHMgdGhlIGFjdHVhbCB3aW5kb3dzIHBsYXRmb3JtLCB0byBl
bnN1cmUgd2UgZ2V0IHRoZSBzYW1lCisgICAgICAgICMgcmVzdWx0cyB0aGF0IHdlIGdldCBpbiB0
ZXN0X21vY2tlZF93aW4oKS4KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4nOgorICAg
ICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXpl
cyhGaWxlU3lzdGVtKCkpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0
dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvdGVzdF9maWxlcy5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvdGVzdF9maWxlcy5weQppbmRleCBiOGI4NDEzLi5hZGE2OGIzIDEwMDY0NAotLS0g
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXMucHkK
KysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVz
LnB5CkBAIC0zNiw2ICszNiw3IEBAIHVuZGVyIHRoYXQgZGlyZWN0b3J5LiIiIgogCiBpbXBvcnQg
dGltZQogCitmcm9tIHdlYmtpdHB5LmNvbW1vbiBpbXBvcnQgdGVzdF9maWxlcwogZnJvbSB3ZWJr
aXRweS5jb21tb24uc3lzdGVtIGltcG9ydCBsb2d1dGlscwogCiAKQEAgLTU4LDQzICs1OSw4IEBA
IGRlZiBmaW5kKHBvcnQsIHBhdGhzPU5vbmUpOgogICAgICAgICAgIGZvcndhcmQgc2xhc2hlcyBv
biBXaW5kb3dzLiBJZiBwYXRocyBpcyBlbXB0eSwgd2UgbG9vayBhdAogICAgICAgICAgIGV2ZXJ5
dGhpbmcgdW5kZXIgdGhlIGxheW91dF90ZXN0c19kaXIoKS4KICAgICAiIiIKLSAgICBwYXRocyA9
IHBhdGhzIG9yIFsnKiddCi0gICAgZmlsZXN5c3RlbSA9IHBvcnQuX2ZpbGVzeXN0ZW0KLSAgICBy
ZXR1cm4gbm9ybWFsaXplZF9maW5kKGZpbGVzeXN0ZW0sIG5vcm1hbGl6ZShmaWxlc3lzdGVtLCBw
b3J0LmxheW91dF90ZXN0c19kaXIoKSwgcGF0aHMpKQogCi0KLWRlZiBub3JtYWxpemUoZmlsZXN5
c3RlbSwgYmFzZV9kaXIsIHBhdGhzKToKLSAgICByZXR1cm4gW2ZpbGVzeXN0ZW0ubm9ybXBhdGgo
ZmlsZXN5c3RlbS5qb2luKGJhc2VfZGlyLCBwYXRoKSkgZm9yIHBhdGggaW4gcGF0aHNdCi0KLQot
ZGVmIG5vcm1hbGl6ZWRfZmluZChmaWxlc3lzdGVtLCBwYXRocyk6Ci0gICAgIiIiRmluZHMgdGhl
IHNldCBvZiB0ZXN0cyB1bmRlciB0aGUgbGlzdCBvZiBwYXRocy4KLQotICAgIEFyZ3M6Ci0gICAg
ICBwYXRoczogYSBsaXN0IG9mIGFic29sdXRlIHBhdGggZXhwcmVzc2lvbnMgdG8gc2VhcmNoLgot
ICAgICAgICAgIEdsb2IgcGF0dGVybnMgYXJlIG9rLgotICAgICIiIgotICAgIGdhdGhlcl9zdGFy
dF90aW1lID0gdGltZS50aW1lKCkKLSAgICBwYXRoc190b193YWxrID0gc2V0KCkKLQotICAgIGZv
ciBwYXRoIGluIHBhdGhzOgotICAgICAgICAjIElmIHRoZXJlJ3MgYW4gKiBpbiB0aGUgbmFtZSwg
YXNzdW1lIGl0J3MgYSBnbG9iIHBhdHRlcm4uCi0gICAgICAgIGlmIHBhdGguZmluZCgnKicpID4g
LTE6Ci0gICAgICAgICAgICBmaWxlbmFtZXMgPSBmaWxlc3lzdGVtLmdsb2IocGF0aCkKLSAgICAg
ICAgICAgIHBhdGhzX3RvX3dhbGsudXBkYXRlKGZpbGVuYW1lcykKLSAgICAgICAgZWxzZToKLSAg
ICAgICAgICAgIHBhdGhzX3RvX3dhbGsuYWRkKHBhdGgpCi0KLSAgICAjIEZJWE1FOiBJJ20gbm90
IHN1cmUgdGhlcmUncyBtdWNoIHBvaW50IGluIHRoaXMgYmVpbmcgYSBzZXQuIEEgbGlzdCB3b3Vs
ZCBwcm9iYWJseSBiZSBmYXN0ZXIuCi0gICAgdGVzdF9maWxlcyA9IHNldCgpCi0gICAgZm9yIHBh
dGggaW4gcGF0aHNfdG9fd2FsazoKLSAgICAgICAgZmlsZXMgPSBmaWxlc3lzdGVtLmZpbGVzX3Vu
ZGVyKHBhdGgsIF9za2lwcGVkX2RpcmVjdG9yaWVzLCBfaXNfdGVzdF9maWxlKQotICAgICAgICB0
ZXN0X2ZpbGVzLnVwZGF0ZShzZXQoZmlsZXMpKQotCi0gICAgZ2F0aGVyX3RpbWUgPSB0aW1lLnRp
bWUoKSAtIGdhdGhlcl9zdGFydF90aW1lCi0gICAgX2xvZy5kZWJ1ZygiVGVzdCBnYXRoZXJpbmcg
dG9vayAlZiBzZWNvbmRzIiAlIGdhdGhlcl90aW1lKQotCi0gICAgcmV0dXJuIHRlc3RfZmlsZXMK
KyAgICByZXR1cm4gdGVzdF9maWxlcy5maW5kKHBvcnQuZmlsZXN5c3RlbSwgcG9ydC5sYXlvdXRf
dGVzdHNfZGlyKCksIHBhdGhzLCBfc2tpcHBlZF9kaXJlY3RvcmllcywgX2lzX3Rlc3RfZmlsZSkK
IAogCiBkZWYgX2hhc19zdXBwb3J0ZWRfZXh0ZW5zaW9uKGZpbGVzeXN0ZW0sIGZpbGVuYW1lKToK
ZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVz
dF9maWxlc191bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvdGVzdF9maWxlc191bml0dGVzdC5weQppbmRleCBhMjliYTQ5Li42ZTliOTcxIDEwMDY0
NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmls
ZXNfdW5pdHRlc3QucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cG9ydC90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5CkBAIC02OSwzMyArNjksNSBAQCBjbGFzcyBUZXN0
RmlsZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0
ZXN0X2ZpbGVzLl9pc190ZXN0X2ZpbGUoZnMsICcnLCAnZm9vLWV4cGVjdGVkLW1pc21hdGNoLmh0
bWwnKSkKIAogCi1jbGFzcyBNb2NrV2luRmlsZVN5c3RlbShvYmplY3QpOgotICAgIGRlZiBqb2lu
KHNlbGYsICpwYXRocyk6Ci0gICAgICAgIHJldHVybiAnXFwnLmpvaW4ocGF0aHMpCi0KLSAgICBk
ZWYgbm9ybXBhdGgoc2VsZiwgcGF0aCk6Ci0gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJy8n
LCAnXFwnKQotCi0KLWNsYXNzIFRlc3RXaW5Ob3JtYWxpemUodW5pdHRlc3QuVGVzdENhc2UpOgot
ICAgIGRlZiBhc3NlcnRfZmlsZXN5c3RlbV9ub3JtYWxpemVzKHNlbGYsIGZpbGVzeXN0ZW0pOgot
ICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0ZXN0X2ZpbGVzLm5vcm1hbGl6ZShmaWxlc3lzdGVt
LCAiYzpcXGZvbyIsCi0gICAgICAgICAgICBbJ2Zhc3QvaHRtbCcsICdmYXN0L2NhbnZhcy8qJywg
J2NvbXBvc2l0aW5nL2Zvby5odG1sJ10pLAotICAgICAgICAgICAgWydjOlxcZm9vXFxmYXN0XGh0
bWwnLCAnYzpcXGZvb1xcZmFzdFxjYW52YXNcKicsICdjOlxcZm9vXGNvbXBvc2l0aW5nXFxmb28u
aHRtbCddKQotCi0gICAgZGVmIHRlc3RfbW9ja2VkX3dpbihzZWxmKToKLSAgICAgICAgIyBUaGlz
IHRlc3RzIHRlc3RfZmlsZXMubm9ybWFsaXplLCB1c2luZyBwb3J0YWJsZSBiZWhhdmlvciBlbXVs
YXRpbmcKLSAgICAgICAgIyB3aGF0IHdlIHRoaW5rIFdpbmRvd3MgaXMgc3VwcG9zZWQgdG8gZG8u
IFRoaXMgdGVzdCB3aWxsIHJ1biBvbiBhbGwKLSAgICAgICAgIyBwbGF0Zm9ybXMuCi0gICAgICAg
IHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhNb2NrV2luRmlsZVN5c3RlbSgpKQot
Ci0gICAgZGVmIHRlc3Rfd2luKHNlbGYpOgotICAgICAgICAjIFRoaXMgdGVzdHMgdGhlIGFjdHVh
bCB3aW5kb3dzIHBsYXRmb3JtLCB0byBlbnN1cmUgd2UgZ2V0IHRoZSBzYW1lCi0gICAgICAgICMg
cmVzdWx0cyB0aGF0IHdlIGdldCBpbiB0ZXN0X21vY2tlZF93aW4oKS4KLSAgICAgICAgaWYgc3lz
LnBsYXRmb3JtICE9ICd3aW4nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuYXNz
ZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhGaWxlU3lzdGVtKCkpCi0KLQogaWYgX19uYW1lX18g
PT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvX19pbml0X18ucHkgYi9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNzZiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEs
MTMgQEAKKyMgUmVxdWlyZWQgZm9yIFB5dGhvbiB0byBzZWFyY2ggdGhpcyBkaXJlY3RvcnkgZm9y
IG1vZHVsZSBmaWxlcworCisjIEtlZXAgdGhpcyBmaWxlIGZyZWUgb2YgYW55IGNvZGUgb3IgaW1w
b3J0IHN0YXRlbWVudHMgdGhhdCBjb3VsZAorIyBjYXVzZSBlaXRoZXIgYW4gZXJyb3IgdG8gb2Nj
dXIgb3IgYSBsb2cgbWVzc2FnZSB0byBiZSBsb2dnZWQuCisjIFRoaXMgZW5zdXJlcyB0aGF0IGNh
bGxpbmcgY29kZSBjYW4gaW1wb3J0IGluaXRpYWxpemF0aW9uIGNvZGUgZnJvbQorIyB3ZWJraXRw
eSBiZWZvcmUgYW55IGVycm9ycyBvciBsb2cgbWVzc2FnZXMgZHVlIHRvIGNvZGUgaW4gdGhpcyBm
aWxlLgorIyBJbml0aWFsaXphdGlvbiBjb2RlIGNhbiBpbmNsdWRlIHRoaW5ncyBsaWtlIHZlcnNp
b24tY2hlY2tpbmcgY29kZSBhbmQKKyMgbG9nZ2luZyBjb25maWd1cmF0aW9uIGNvZGUuCisjCisj
IFdlIGRvIG5vdCBleGVjdXRlIGFueSB2ZXJzaW9uLWNoZWNraW5nIGNvZGUgb3IgbG9nZ2luZyBj
b25maWd1cmF0aW9uCisjIGNvZGUgaW4gdGhpcyBmaWxlIHNvIHRoYXQgY2FsbGVycyBjYW4gb3B0
LWluIGFzIHRoZXkgd2FudC4gIFRoaXMgYWxzbworIyBhbGxvd3MgZGlmZmVyZW50IGNhbGxlcnMg
dG8gY2hvb3NlIGRpZmZlcmVudCBpbml0aWFsaXphdGlvbiBjb2RlLAorIyBhcyBuZWNlc3Nhcnku
CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3J1
bl9wZXJmX3Rlc3RzLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0
cy9ydW5fcGVyZl90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5k
NGJjNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3Jt
YW5jZV90ZXN0cy9ydW5fcGVyZl90ZXN0cy5weQpAQCAtMCwwICsxLDE3NSBAQAorIyEvdXNyL2Jp
bi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisj
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMg
ZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMg
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
IyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
IyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiUnVuIEluc3BlY3RvcidzIHBlcmYg
dGVzdHMgaW4gcGVyZiBtb2RlLiIiIgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9wdHBhcnNl
CitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0IHRl
c3RfZmlsZXMKK2Zyb20gd2Via2l0cHkuY29tbW9uLmhvc3QgaW1wb3J0IEhvc3QKK2Zyb20gd2Vi
a2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQuZHJpdmVyIGltcG9ydCBEcml2ZXJJbnB1dAorZnJvbSB3
ZWJraXRweS5sYXlvdXRfdGVzdHMudmlld3MgaW1wb3J0IHByaW50aW5nCisKK19wZXJmX3Rlc3Rz
X2Jhc2VfZGlyID0gJ1BlcmZvcm1hbmNlVGVzdHMnCitfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIo
X19uYW1lX18pCitfcmVzdWx0X3JlZ2V4ID0gcmUuY29tcGlsZSgnXlJFU1VMVCAuKiQnKQorCisK
K2RlZiBydW4ocGVyZl90ZXN0c19kaXIsIHJlZ3VsYXJfb3V0cHV0PXN5cy5zdGRlcnIsIGJ1aWxk
Ym90X291dHB1dD1zeXMuc3Rkb3V0LCBwb3J0PU5vbmUpOgorICAgIHJ1bm5lciA9IFBlcmZUZXN0
c1J1bm5lcihwZXJmX3Rlc3RzX2RpciwgcmVndWxhcl9vdXRwdXQsIGJ1aWxkYm90X291dHB1dCwg
cG9ydCkKKyAgICByZXR1cm4gcnVubmVyLnJ1bigpCisKKworY2xhc3MgUGVyZlRlc3RzUnVubmVy
OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBlcmZfdGVzdHNfZGlyLCByZWd1bGFyX291dHB1
dCwgYnVpbGRib3Rfb3V0cHV0LCBwb3J0PU5vbmUsIGFyZ3M9Tm9uZSk6CisgICAgICAgIHNlbGYu
X3BlcmZfdGVzdHNfZGlyID0gcGVyZl90ZXN0c19kaXIKKyAgICAgICAgc2VsZi5fYnVpbGRib3Rf
b3V0cHV0ID0gYnVpbGRib3Rfb3V0cHV0CisgICAgICAgIHNlbGYuX29wdGlvbnMsIHNlbGYuX2Fy
Z3MgPSBzZWxmLnBhcnNlX2FyZ3MoYXJncykKKyAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQgb3Ig
SG9zdCgpLnBvcnRfZmFjdG9yeS5nZXQoc2VsZi5fb3B0aW9ucy5wbGF0Zm9ybSwgc2VsZi5fb3B0
aW9ucykKKyAgICAgICAgc2VsZi5fcHJpbnRlciA9IHByaW50aW5nLlByaW50ZXIoc2VsZi5fcG9y
dCwgc2VsZi5fb3B0aW9ucywgcmVndWxhcl9vdXRwdXQsIGJ1aWxkYm90X291dHB1dCwgY29uZmln
dXJlX2xvZ2dpbmc9RmFsc2UpCisgICAgICAgIHNlbGYuX3dlYmtpdF9iYXNlX2Rpcl9sZW4gPSBs
ZW4oc2VsZi5fcG9ydC5jb25maWcud2Via2l0X2Jhc2VfZGlyKCkpCisKKyAgICBkZWYgcGFyc2Vf
YXJncyhzZWxmLCBhcmdzPU5vbmUpOgorICAgICAgICBwcmludF9vcHRpb25zID0gcHJpbnRpbmcu
cHJpbnRfb3B0aW9ucygpCisKKyAgICAgICAgcGVyZl9vcHRpb25fbGlzdCA9IFsKKyAgICAgICAg
ICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV9jb25zdCcs
IGNvbnN0PSdEZWJ1ZycsIGRlc3Q9ImNvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaGVscD0nU2V0IHRoZSBjb25maWd1cmF0aW9uIHRvIERlYnVnJyksCisg
ICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbignLS1yZWxlYXNlJywgYWN0aW9uPSdzdG9y
ZV9jb25zdCcsIGNvbnN0PSdSZWxlYXNlJywgZGVzdD0iY29uZmlndXJhdGlvbiIsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTZXQgdGhlIGNvbmZpZ3VyYXRpb24gdG8g
UmVsZWFzZScpLAorICAgICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tcGxhdGZvcm0i
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iU3BlY2lmeSBwb3J0L3Bs
YXRmb3JtIGJlaW5nIHRlc3RlZCAoaS5lLiBjaHJvbWl1bS1tYWMpIiksCisgICAgICAgICAgICBv
cHRwYXJzZS5tYWtlX29wdGlvbigiLS1idWlsZC1kaXJlY3RvcnkiLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byB0aGUgZGlyZWN0b3J5IHVuZGVyIHdoaWNo
IGJ1aWxkIGZpbGVzIGFyZSBrZXB0IChzaG91bGQgbm90IGluY2x1ZGUgY29uZmlndXJhdGlvbiki
KSwKKyAgICAgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItLXRpbWUtb3V0LW1zIiwgZGVm
YXVsdD0zMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNldCB0
aGUgdGltZW91dCBmb3IgZWFjaCB0ZXN0IiksCisgICAgICAgICAgICBdCisKKyAgICAgICAgb3B0
aW9uX2xpc3QgPSAocGVyZl9vcHRpb25fbGlzdCArIHByaW50X29wdGlvbnMpCisgICAgICAgIHJl
dHVybiBvcHRwYXJzZS5PcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9uX2xpc3QpLnBhcnNl
X2FyZ3MoYXJncykKKworCisgICAgZGVmIF9jb2xsZWN0X3Rlc3RzKHNlbGYpOgorICAgICAgICAi
IiJSZXR1cm4gdGhlIGxpc3Qgb2YgdGVzdHMgZm91bmQuIiIiCisKKyAgICAgICAgZGVmIF9pc190
ZXN0X2ZpbGUoZmlsZXN5c3RlbSwgZGlybmFtZSwgZmlsZW5hbWUpOgorICAgICAgICAgICAgcmV0
dXJuIGZpbGVuYW1lLmVuZHN3aXRoKCcuaHRtbCcpCisKKyAgICAgICAgZmlsZXN5c3RlbSA9IHNl
bGYuX3BvcnQuZmlsZXN5c3RlbQorICAgICAgICByZXR1cm4gdGVzdF9maWxlcy5maW5kKGZpbGVz
eXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcG9ydC5wYXRoX2Zy
b21fd2Via2l0X2Jhc2UoZmlsZXN5c3RlbS5qb2luKF9wZXJmX3Rlc3RzX2Jhc2VfZGlyLCBzZWxm
Ll9wZXJmX3Rlc3RzX2RpcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhz
PXNlbGYuX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9maWx0ZXI9
X2lzX3Rlc3RfZmlsZSkKKworICAgIGRlZiBydW4oc2VsZik6CisKKyAgICAgICAgaWYgc2VsZi5f
b3B0aW9ucy5oZWxwX3ByaW50aW5nOgorICAgICAgICAgICAgc2VsZi5fcHJpbnRlci5oZWxwX3By
aW50aW5nKCkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50ZXIuY2xlYW51cCgpCisgICAgICAgICAg
ICByZXR1cm4gMAorCisgICAgICAgIGlmIG5vdCBzZWxmLl9wb3J0LmNoZWNrX2J1aWxkKG5lZWRz
X2h0dHA9RmFsc2UpOgorICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkJ1aWxkIG5v
dCB1cCB0byBkYXRlIGZvciAiICsgc2VsZi5fcG9ydC5fcGF0aF90b19kcml2ZXIoKQorICAgICAg
ICAgICAgcmV0dXJuIC0xCisKKyAgICAgICAgIyBXZSB3cmFwIGFueSBwYXJ0cyBvZiB0aGUgcnVu
IHRoYXQgYXJlIHNsb3cgb3IgbGlrZWx5IHRvIHJhaXNlIGV4Y2VwdGlvbnMKKyAgICAgICAgIyBp
biBhIHRyeS9maW5hbGx5IHRvIGVuc3VyZSB0aGF0IHdlIGNsZWFuIHVwIHRoZSBsb2dnaW5nIGNv
bmZpZ3VyYXRpb24uCisgICAgICAgIHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50ID0gLTEKKyAgICAg
ICAgdHJ5OgorICAgICAgICAgICAgdGVzdHMgPSBzZWxmLl9jb2xsZWN0X3Rlc3RzKCkKKyAgICAg
ICAgICAgIHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50ID0gc2VsZi5fcnVuX3Rlc3RzX3NldCh0ZXN0
cywgc2VsZi5fcG9ydCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX3ByaW50
ZXIuY2xlYW51cCgpCisKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50CisK
KyAgICBkZWYgX3J1bl90ZXN0c19zZXQoc2VsZiwgdGVzdHMsIHBvcnQpOgorICAgICAgICByZXN1
bHRfY291bnQgPSBsZW4odGVzdHMpCisgICAgICAgIGV4cGVjdGVkX3Jlc3VsdF9jb3VudCA9IDAK
KyAgICAgICAgdW5leHBlY3RlZF9yZXN1bHRfY291bnQgPSAwCisgICAgICAgIHNlbGYuX3ByaW50
ZXIucHJpbnRfb25lX2xpbmVfc3VtbWFyeShyZXN1bHRfY291bnQsIDAsIDApCisgICAgICAgIGRy
aXZlcl9uZWVkX3Jlc3RhcnQgPSBGYWxzZQorICAgICAgICBkcml2ZXIgPSBOb25lCisKKyAgICAg
ICAgZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICAgICAgICBpZiBkcml2ZXJfbmVlZF9yZXN0YXJ0
OgorICAgICAgICAgICAgICAgIF9sb2cuZGVidWcoIiVzIGtpbGxpbmcgZHJpdmVyIiAlIHRlc3Qp
CisgICAgICAgICAgICAgICAgZHJpdmVyLnN0b3AoKQorICAgICAgICAgICAgICAgIGRyaXZlciA9
IE5vbmUKKyAgICAgICAgICAgIGlmIG5vdCBkcml2ZXI6CisgICAgICAgICAgICAgICAgZHJpdmVy
ID0gcG9ydC5jcmVhdGVfZHJpdmVyKHdvcmtlcl9udW1iZXI9MSkKKworICAgICAgICAgICAgdGVz
dF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBzZWxmLl9ydW5fc2luZ2xlX3Rlc3QodGVz
dCwgZHJpdmVyKQorICAgICAgICAgICAgaWYgdGVzdF9mYWlsZWQ6CisgICAgICAgICAgICAgICAg
dW5leHBlY3RlZF9yZXN1bHRfY291bnQgPSB1bmV4cGVjdGVkX3Jlc3VsdF9jb3VudCArIDEKKyAg
ICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVzdWx0X2NvdW50ID0g
ZXhwZWN0ZWRfcmVzdWx0X2NvdW50ICsgMQorCisgICAgICAgICAgICBzZWxmLl9wcmludGVyLnBy
aW50X29uZV9saW5lX3N1bW1hcnkocmVzdWx0X2NvdW50LCBleHBlY3RlZF9yZXN1bHRfY291bnQs
IHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50KQorCisgICAgICAgIGlmIGRyaXZlcjoKKyAgICAgICAg
ICAgIGRyaXZlci5zdG9wKCkKKworICAgICAgICByZXR1cm4gdW5leHBlY3RlZF9yZXN1bHRfY291
bnQKKworICAgIGRlZiBfcnVuX3NpbmdsZV90ZXN0KHNlbGYsIHRlc3QsIGRyaXZlcik6CisgICAg
ICAgIHRlc3RfZmFpbGVkID0gRmFsc2UKKyAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFydCA9IEZh
bHNlCisgICAgICAgIG91dHB1dCA9IGRyaXZlci5ydW5fdGVzdChEcml2ZXJJbnB1dCh0ZXN0LCBz
ZWxmLl9vcHRpb25zLnRpbWVfb3V0X21zLCBOb25lLCBGYWxzZSkpCisKKyAgICAgICAgaWYgb3V0
cHV0LnRleHQgPT0gTm9uZToKKyAgICAgICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorICAgICAg
ICBlbGlmIG91dHB1dC50aW1lb3V0OgorICAgICAgICAgICAgc2VsZi5fcHJpbnRlci53cml0ZSgn
dGltZW91dDogJXMnICUgdGVzdFtzZWxmLl93ZWJraXRfYmFzZV9kaXJfbGVuICsgMTpdKQorICAg
ICAgICAgICAgdGVzdF9mYWlsZWQgPSBUcnVlCisgICAgICAgICAgICBkcml2ZXJfbmVlZF9yZXN0
YXJ0ID0gVHJ1ZQorICAgICAgICBlbGlmIG91dHB1dC5jcmFzaDoKKyAgICAgICAgICAgIHNlbGYu
X3ByaW50ZXIud3JpdGUoJ2NyYXNoOiAlcycgJSB0ZXN0W3NlbGYuX3dlYmtpdF9iYXNlX2Rpcl9s
ZW4gKyAxOl0pCisgICAgICAgICAgICBkcml2ZXJfbmVlZF9yZXN0YXJ0ID0gVHJ1ZQorICAgICAg
ICAgICAgdGVzdF9mYWlsZWQgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnb3Rf
YV9yZXN1bHQgPSBGYWxzZQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gcmUuc3BsaXQoJ1xuJywg
b3V0cHV0LnRleHQpOgorICAgICAgICAgICAgICAgIGlmIF9yZXN1bHRfcmVnZXgubWF0Y2gobGlu
ZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2J1aWxkYm90X291dHB1dC53cml0ZSgiJXNc
biIgJSBsaW5lKQorICAgICAgICAgICAgICAgICAgICBnb3RfYV9yZXN1bHQgPSBUcnVlCisgICAg
ICAgICAgICAgICAgZWxpZiBub3QgbGVuKGxpbmUpID09IDA6CisgICAgICAgICAgICAgICAgICAg
IHRlc3RfZmFpbGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wcmludGVyLndy
aXRlKCIlcyIgJSBsaW5lKQorICAgICAgICAgICAgdGVzdF9mYWlsZWQgPSB0ZXN0X2ZhaWxlZCBv
ciBub3QgZ290X2FfcmVzdWx0CisKKyAgICAgICAgaWYgbGVuKG91dHB1dC5lcnJvcik6CisgICAg
ICAgICAgICBzZWxmLl9wcmludGVyLndyaXRlKCdlcnJvcjpcbiVzJyAlIG91dHB1dC5lcnJvcikK
KyAgICAgICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorCisgICAgICAgIHJldHVybiB0ZXN0X2Zh
aWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9wZXJmb3JtYW5jZV90ZXN0cy9ydW5fcGVyZl90ZXN0c191bml0dGVzdC5weSBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcnVuX3BlcmZfdGVzdHNfdW5pdHRl
c3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDY3NzVkNgotLS0gL2Rl
di9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcnVu
X3BlcmZfdGVzdHNfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMzAgQEAKKyMhL3Vzci9iaW4vcHl0
aG9uCisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0
aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0cyBmb3IgcnVuX3BlcmZfdGVzdHMu
IiIiCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHdlYmtpdHB5LmNvbW1vbiBpbXBvcnQgYXJy
YXlfc3RyZWFtCitmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0LmRyaXZlciBpbXBvcnQg
RHJpdmVySW5wdXQsIERyaXZlck91dHB1dAorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9y
dC50ZXN0IGltcG9ydCB1bml0X3Rlc3RfZmlsZXN5c3RlbQorZnJvbSB3ZWJraXRweS5sYXlvdXRf
dGVzdHMudmlld3MgaW1wb3J0IHByaW50aW5nCitmcm9tIHdlYmtpdHB5LnBlcmZvcm1hbmNlX3Rl
c3RzLnJ1bl9wZXJmX3Rlc3RzIGltcG9ydCBQZXJmVGVzdHNSdW5uZXIKKworCitjbGFzcyBNYWlu
VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY3JlYXRlX2RyaXZlcihzZWxmKToK
KyAgICAgICAgY2xhc3MgVGVzdERyaXZlcjoKKworICAgICAgICAgICAgZGVmIHJ1bl90ZXN0KHNl
bGYsIGRyaXZlcl9pbnB1dCk6CisgICAgICAgICAgICAgICAgdGV4dCA9ICcnCisgICAgICAgICAg
ICAgICAgdGltZW91dCA9IEZhbHNlCisgICAgICAgICAgICAgICAgY3Jhc2ggPSBGYWxzZQorICAg
ICAgICAgICAgICAgIGlmIGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0gJ3Bhc3MuaHRtbCc6Cisg
ICAgICAgICAgICAgICAgICAgIHRleHQgPSAnUkVTVUxUIGdyb3VwX25hbWU6IHRlc3RfbmFtZT0g
NDIgbXMnCisgICAgICAgICAgICAgICAgZWxpZiBkcml2ZXJfaW5wdXQudGVzdF9uYW1lID09ICd0
aW1lb3V0Lmh0bWwnOgorICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gVHJ1ZQorICAgICAg
ICAgICAgICAgIGVsaWYgZHJpdmVyX2lucHV0LnRlc3RfbmFtZSA9PSAnZmFpbGVkLmh0bWwnOgor
ICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gTm9uZQorICAgICAgICAgICAgICAgIGVsaWYgZHJp
dmVyX2lucHV0LnRlc3RfbmFtZSA9PSAndG9uZ3VleS5odG1sJzoKKyAgICAgICAgICAgICAgICAg
ICAgdGV4dCA9ICd3ZSBhcmUgbm90IGV4cGVjdGluZyBhbiBvdXRwdXQgZnJvbSBwZXJmIHRlc3Rz
IGJ1dCBSRVNVTFQgYmxhYmxhYmxhJworICAgICAgICAgICAgICAgIGVsaWYgZHJpdmVyX2lucHV0
LnRlc3RfbmFtZSA9PSAnY3Jhc2guaHRtbCc6CisgICAgICAgICAgICAgICAgICAgIGNyYXNoID0g
VHJ1ZQorICAgICAgICAgICAgICAgIHJldHVybiBEcml2ZXJPdXRwdXQodGV4dCwgJycsICcnLCAn
JywgY3Jhc2g9Y3Jhc2gsIHRpbWVvdXQ9dGltZW91dCkKKworICAgICAgICAgICAgZGVmIHN0b3Ao
c2VsZik6CisgICAgICAgICAgICAgICAgIiIiZG8gbm90aGluZyIiIgorCisgICAgICAgIHJldHVy
biBUZXN0RHJpdmVyKCkKKworICAgIGRlZiBjcmVhdGVfcG9ydChzZWxmKToKKyAgICAgICAgY2xh
c3MgVGVzdFBvcnQ6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdF9jYXNlKToK
KyAgICAgICAgICAgICAgICBzZWxmLl90ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2UKKworICAgICAgICAg
ICAgZGVmIGNyZWF0ZV9kcml2ZXIoc2VsZiwgd29ya2VyX251bWJlcj1Ob25lKToKKyAgICAgICAg
ICAgICAgICByZXR1cm4gc2VsZi5fdGVzdF9jYXNlLmNyZWF0ZV9kcml2ZXIoKQorCisgICAgICAg
IHJldHVybiBUZXN0UG9ydChzZWxmKQorCisgICAgZGVmIGNyZWF0ZV9ydW5uZXIoc2VsZiwgYnVp
bGRib3Rfb3V0cHV0PU5vbmUpOgorICAgICAgICBidWlsZGJvdF9vdXRwdXQgPSBidWlsZGJvdF9v
dXRwdXQgb3IgYXJyYXlfc3RyZWFtLkFycmF5U3RyZWFtKCkKKyAgICAgICAgcmVndWxhcl9vdXRw
dXQgPSBhcnJheV9zdHJlYW0uQXJyYXlTdHJlYW0oKQorICAgICAgICByZXR1cm4gUGVyZlRlc3Rz
UnVubmVyKCcnLCByZWd1bGFyX291dHB1dCwgYnVpbGRib3Rfb3V0cHV0KQorCisgICAgZGVmIHJ1
bl90ZXN0KHNlbGYsIHRlc3RfbmFtZSk6CisgICAgICAgIHJ1bm5lciA9IHNlbGYuY3JlYXRlX3J1
bm5lcigpCisgICAgICAgIGRyaXZlciA9IHNlbGYuY3JlYXRlX2RyaXZlcigpCisgICAgICAgIHJl
dHVybiBydW5uZXIuX3J1bl9zaW5nbGVfdGVzdCh0ZXN0X25hbWUsIGRyaXZlcikKKworICAgIGRl
ZiB0ZXN0X3J1bl9wYXNzaW5nX3Rlc3Qoc2VsZik6CisgICAgICAgIHRlc3RfZmFpbGVkLCBkcml2
ZXJfbmVlZF9yZXN0YXJ0ID0gc2VsZi5ydW5fdGVzdCgncGFzcy5odG1sJykKKyAgICAgICAgc2Vs
Zi5hc3NlcnRGYWxzZSh0ZXN0X2ZhaWxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkcml2
ZXJfbmVlZF9yZXN0YXJ0KQorCisgICAgZGVmIHRlc3RfcnVuX3NpbGVudF90ZXN0KHNlbGYpOgor
ICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNlbGYucnVuX3Rlc3Qo
J3NpbGVudC5odG1sJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RfZmFpbGVkKQorICAg
ICAgICBzZWxmLmFzc2VydEZhbHNlKGRyaXZlcl9uZWVkX3Jlc3RhcnQpCisKKyAgICBkZWYgdGVz
dF9ydW5fZmFpbGVkX3Rlc3Qoc2VsZik6CisgICAgICAgIHRlc3RfZmFpbGVkLCBkcml2ZXJfbmVl
ZF9yZXN0YXJ0ID0gc2VsZi5ydW5fdGVzdCgnZmFpbGVkLmh0bWwnKQorICAgICAgICBzZWxmLmFz
c2VydFRydWUodGVzdF9mYWlsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZHJpdmVyX25l
ZWRfcmVzdGFydCkKKworICAgIGRlZiB0ZXN0X3J1bl90b25ndWV5X3Rlc3Qoc2VsZik6CisgICAg
ICAgIHRlc3RfZmFpbGVkLCBkcml2ZXJfbmVlZF9yZXN0YXJ0ID0gc2VsZi5ydW5fdGVzdCgndG9u
Z3VleS5odG1sJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RfZmFpbGVkKQorICAgICAg
ICBzZWxmLmFzc2VydEZhbHNlKGRyaXZlcl9uZWVkX3Jlc3RhcnQpCisKKyAgICBkZWYgdGVzdF9y
dW5fdGltZW91dF90ZXN0KHNlbGYpOgorICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRf
cmVzdGFydCA9IHNlbGYucnVuX3Rlc3QoJ3RpbWVvdXQuaHRtbCcpCisgICAgICAgIHNlbGYuYXNz
ZXJ0VHJ1ZSh0ZXN0X2ZhaWxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRyaXZlcl9uZWVk
X3Jlc3RhcnQpCisKKyAgICBkZWYgdGVzdF9ydW5fY3Jhc2hfdGVzdChzZWxmKToKKyAgICAgICAg
dGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBzZWxmLnJ1bl90ZXN0KCdjcmFzaC5o
dG1sJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RfZmFpbGVkKQorICAgICAgICBzZWxm
LmFzc2VydFRydWUoZHJpdmVyX25lZWRfcmVzdGFydCkKKworICAgIGRlZiB0ZXN0X3J1bl90ZXN0
X3NldChzZWxmKToKKyAgICAgICAgYnVpbGRib3Rfb3V0cHV0ID0gYXJyYXlfc3RyZWFtLkFycmF5
U3RyZWFtKCkKKyAgICAgICAgcnVubmVyID0gc2VsZi5jcmVhdGVfcnVubmVyKGJ1aWxkYm90X291
dHB1dCkKKyAgICAgICAgZHJpdmVyID0gc2VsZi5jcmVhdGVfZHJpdmVyKCkKKyAgICAgICAgcG9y
dCA9IHNlbGYuY3JlYXRlX3BvcnQoKQorICAgICAgICB0ZXN0cyA9IFsncGFzcy5odG1sJywgJ3Np
bGVudC5odG1sJywgJ2ZhaWxlZC5odG1sJywgJ3Rvbmd1ZXkuaHRtbCcsICd0aW1lb3V0Lmh0bWwn
LCAnY3Jhc2guaHRtbCddCisgICAgICAgIHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50ID0gcnVubmVy
Ll9ydW5fdGVzdHNfc2V0KHRlc3RzLCBwb3J0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVu
ZXhwZWN0ZWRfcmVzdWx0X2NvdW50LCBsZW4odGVzdHMpIC0gMSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbChsZW4oYnVpbGRib3Rfb3V0cHV0LmdldCgpKSwgMSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbChidWlsZGJvdF9vdXRwdXQuZ2V0KClbMF0sICdSRVNVTFQgZ3JvdXBfbmFtZTogdGVz
dF9uYW1lPSA0MiBtc1xuJykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVu
aXR0ZXN0Lm1haW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116727</attachid>
            <date>2011-11-28 03:55:32 -0800</date>
            <delta_ts>2011-11-28 12:50:07 -0800</delta_ts>
            <desc>[patch] third version. style fix.</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>30450</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCAwMTdm
MzlkLi5jYTI3MzEzIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsNjQgQEAKKzIwMTEtMTEtMjggIElseWEgVGlraG9ub3Zza3kgIDxs
b2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYiBJbnNwZWN0b3I6IGNocm9taXVtOiBJ
J2QgbGlrZSB0byBhZGQgYSBzY3JpcHQgZm9yIHJ1bm5pbmcgcGVyZiB0ZXN0cyBmb3IgV2ViSW5z
cGVjdG9yLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NzMwNzkKKworICAgICAgICBUaGUgaWRlYSBpcyB0byBoYXZlIHBlcmZvcm1hbmNlIHRlc3RzIGZv
ciBXZWJJbnNwZWN0b3IuCisgICAgICAgIEkgd2FzIHN1Z2dlc3RlZCB0byBwdXQgdGhlc2UgdGVz
dHMgaW50byBQZXJmb3JtYW5jZVRlc3RzL2luc3BlY3Rvci4KKyAgICAgICAgVGhleSBwcm9kdWNl
IG91dHB1dCBpbiBhIGZvcm1hdCB0aGF0IGlzIHN1aXRhYmxlIGZvciBjaHJvbWl1bSBwZXJmIGJv
dCBkcmF3aW5nIHNjcmlwdHMuCisKKyAgICAgICAgSSdkIGxpa2UgdG8gcmV1c2UgY29kZSBmb3Ig
c2Nhbm5pbmcgZm9sZGVycyBmb3IgdGVzdCBmaWxlcy4KKyAgICAgICAgQmVjYXVzZSBvZiB0aGUg
ZmFjdCB0aGF0IG9yaWdpbmFsIHRlc3RfZmlsZXMucHkgaGFzIGNvbW1vbiBhbmQgbGF5b3V0IHNw
ZWNpZmljIHBhcnRzCisgICAgICAgIEkgZGVjaWRlZCB0byBleHRyYWN0IHRoZSBnZW5lcmljIHBh
cnQgYW5kIHB1dCBpdCBpbnRvIHdlYmtpdHB5L2NvbW1vbgorICAgICAgICBJIHRoaW5rIHRoZSB0
d28gcGFja2FnZXMgd2l0aCBuYW1lIHRlc3RfZmlsZXMgbG9vayBzdHJhbmdlIGJ1dCBJIGhhdmUg
bm8gaWRlYSBhYm91dCBhIGJldHRlciBuYW1lLgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgICogU2NyaXB0cy9ydW4taW5zcGVjdG9yLXBlcmYtdGVzdHMu
cHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXMu
cHk6IENvcGllZCBmcm9tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQv
dGVzdF9maWxlcy5weS4KKyAgICAgICAgKGZpbmQpOgorICAgICAgICAoX25vcm1hbGl6ZSk6Cisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vdGVzdF9maWxlc191bml0dGVzdC5weTog
QWRkZWQuCisgICAgICAgIChNb2NrV2luRmlsZVN5c3RlbS5qb2luKToKKyAgICAgICAgKE1vY2tX
aW5GaWxlU3lzdGVtKToKKyAgICAgICAgKE1vY2tXaW5GaWxlU3lzdGVtLm5vcm1wYXRoKToKKyAg
ICAgICAgKFRlc3RXaW5Ob3JtYWxpemUuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyk6Cisg
ICAgICAgIChUZXN0V2luTm9ybWFsaXplLnRlc3RfbW9ja2VkX3dpbik6CisgICAgICAgIChUZXN0
V2luTm9ybWFsaXplKToKKyAgICAgICAgKFRlc3RXaW5Ob3JtYWxpemUudGVzdF93aW4pOgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlcy5weToK
KyAgICAgICAgKGZpbmQpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvdGVzdF9maWxlc191bml0dGVzdC5weToKKyAgICAgICAgKFRlc3RGaWxlc1Rlc3QudGVz
dF9pc190ZXN0X2ZpbGUpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2Vf
dGVzdHMvX19pbml0X18ucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVy
Zm9ybWFuY2VfdGVzdHMvcnVuX3BlcmZfdGVzdHMucHk6IEFkZGVkLgorICAgICAgICAocnVuKToK
KyAgICAgICAgKFBlcmZUZXN0c1J1bm5lci5fX2luaXRfXyk6CisgICAgICAgIChQZXJmVGVzdHNS
dW5uZXIucGFyc2VfYXJncyk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX2NvbGxlY3RfdGVz
dHMuX2lzX3Rlc3RfZmlsZSk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX2NvbGxlY3RfdGVz
dHMpOgorICAgICAgICAoUGVyZlRlc3RzUnVubmVyLnJ1bik6CisgICAgICAgIChQZXJmVGVzdHNS
dW5uZXIuX3J1bl90ZXN0c19zZXQpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVyZm9y
bWFuY2VfdGVzdHMvcnVuX3BlcmZfdGVzdHNfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAo
TWFpblRlc3QuY3JlYXRlX2RyaXZlci5UZXN0RHJpdmVyLnJ1bl90ZXN0KToKKyAgICAgICAgKE1h
aW5UZXN0LmNyZWF0ZV9kcml2ZXIuVGVzdERyaXZlcik6CisgICAgICAgIChNYWluVGVzdC5jcmVh
dGVfZHJpdmVyLlRlc3REcml2ZXIuc3RvcCk6CisgICAgICAgIChNYWluVGVzdC5jcmVhdGVfZHJp
dmVyKToKKyAgICAgICAgKE1haW5UZXN0LmNyZWF0ZV9wb3J0LlRlc3RQb3J0Ll9faW5pdF9fKToK
KyAgICAgICAgKE1haW5UZXN0LmNyZWF0ZV9wb3J0LlRlc3RQb3J0KToKKyAgICAgICAgKE1haW5U
ZXN0LmNyZWF0ZV9wb3J0LlRlc3RQb3J0LmNyZWF0ZV9kcml2ZXIpOgorICAgICAgICAoTWFpblRl
c3QuY3JlYXRlX3BvcnQpOgorICAgICAgICAoTWFpblRlc3QuY3JlYXRlX3J1bm5lcik6CisgICAg
ICAgIChNYWluVGVzdC5ydW5fdGVzdCk6CisgICAgICAgIChNYWluVGVzdC50ZXN0X3J1bl9wYXNz
aW5nX3Rlc3QpOgorICAgICAgICAoTWFpblRlc3QudGVzdF9ydW5fc2lsZW50X3Rlc3QpOgorICAg
ICAgICAoTWFpblRlc3QudGVzdF9ydW5fZmFpbGVkX3Rlc3QpOgorICAgICAgICAoTWFpblRlc3Qu
dGVzdF9ydW5fdG9uZ3VleV90ZXN0KToKKyAgICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX3RpbWVv
dXRfdGVzdCk6CisgICAgICAgIChNYWluVGVzdC50ZXN0X3J1bl9jcmFzaF90ZXN0KToKKyAgICAg
ICAgKE1haW5UZXN0KToKKyAgICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX3Rlc3Rfc2V0KToKKwog
MjAxMS0xMS0yOCAgS2VudGFybyBIYXJhICA8aGFyYWtlbkBjaHJvbWl1bS5vcmc+CiAKICAgICAg
ICAgcnVuLWJpbmRpbmdzLXRlc3RzIHNob3dzIGRpZmYgZXJyb3IgZm9yIGEgbmV3bHkgYWRkZWQg
YmluZGluZyB0ZXN0CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3J1bi1pbnNwZWN0b3ItcGVy
Zi10ZXN0cy5weSBiL1Rvb2xzL1NjcmlwdHMvcnVuLWluc3BlY3Rvci1wZXJmLXRlc3RzLnB5Cm5l
dyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjM2QzMmYKLS0tIC9kZXYvbnVsbAor
KysgYi9Ub29scy9TY3JpcHRzL3J1bi1pbnNwZWN0b3ItcGVyZi10ZXN0cy5weQpAQCAtMCwwICsx
LDQyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDExIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMK
KyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJSdW4g
SW5zcGVjdG9yJ3MgcGVyZiB0ZXN0cyBpbiBwZXJmIG1vZGUuIiIiCisKK2ltcG9ydCBsb2dnaW5n
CitpbXBvcnQgc3lzCisKK2Zyb20gd2Via2l0cHkucGVyZm9ybWFuY2VfdGVzdHMgaW1wb3J0IHJ1
bl9wZXJmX3Rlc3RzCisKK19wZXJmX3Rlc3RzX2RpciA9ICdpbnNwZWN0b3InCitfbG9nID0gbG9n
Z2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKK2lmICdfX21haW5fXycgPT0gX19uYW1lX186Cisg
ICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1hdD0iJShtZXNz
YWdlKXMiKQorICAgIHN5cy5leGl0KHJ1bl9wZXJmX3Rlc3RzLnJ1bihfcGVyZl90ZXN0c19kaXIp
KQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vdGVzdF9maWxlcy5w
eSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXMucHkKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmNzQ5OQotLS0gL2Rldi9udWxsCisrKyBiL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXMucHkKQEAgLTAsMCArMSw5MiBA
QAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
IyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdv
b2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGhpcyBtb2R1
bGUgaXMgdXNlZCB0byBmaW5kIGFsbCBvZiB0aGUgbGF5b3V0IHRlc3QgZmlsZXMgdXNlZCBieQor
cnVuLXdlYmtpdC10ZXN0cy4gSXQgZXhwb3NlcyBvbmUgcHVibGljIGZ1bmN0aW9uIC0gZmluZCgp
IC0KK3doaWNoIHRha2VzIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcGF0aHMuIElmIGEgbGlzdCBpcyBw
YXNzZWQgaW4sIHRoZSByZXR1cm5lZAorbGlzdCBvZiB0ZXN0IGZpbGVzIGlzIGNvbnN0cmFpbmVk
IHRvIHRob3NlIGZvdW5kIHVuZGVyIHRoZSBwYXRocyBwYXNzZWQgaW4sCitpLmUuIGNhbGxpbmcg
ZmluZChbIkxheW91dFRlc3RzL2Zhc3QiXSkgd2lsbCBvbmx5IHJldHVybiBmaWxlcwordW5kZXIg
dGhhdCBkaXJlY3RvcnkuIiIiCisKK2ltcG9ydCB0aW1lCisKK2Zyb20gd2Via2l0cHkuY29tbW9u
LnN5c3RlbSBpbXBvcnQgbG9ndXRpbHMKKworCitfbG9nID0gbG9ndXRpbHMuZ2V0X2xvZ2dlcihf
X2ZpbGVfXykKKworCitkZWYgZmluZChmaWxlc3lzdGVtLCBiYXNlX2RpciwgcGF0aHM9Tm9uZSwg
c2tpcHBlZF9kaXJlY3Rvcmllcz1Ob25lLCBmaWxlX2ZpbHRlcj1Ob25lKToKKyAgICAiIiJGaW5k
cyB0aGUgc2V0IG9mIHRlc3RzIHVuZGVyIGEgZ2l2ZW4gbGlzdCBvZiBzdWItcGF0aHMuCisKKyAg
ICBBcmdzOgorICAgICAgcGF0aHM6IGEgbGlzdCBvZiBwYXRoIGV4cHJlc3Npb25zIHJlbGF0aXZl
IHRvIGJhc2VfZGlyCisgICAgICAgICAgdG8gc2VhcmNoLiBHbG9iIHBhdHRlcm5zIGFyZSBvaywg
YXMgYXJlIHBhdGggZXhwcmVzc2lvbnMgd2l0aAorICAgICAgICAgIGZvcndhcmQgc2xhc2hlcyBv
biBXaW5kb3dzLiBJZiBwYXRocyBpcyBlbXB0eSwgd2UgbG9vayBhdAorICAgICAgICAgIGV2ZXJ5
dGhpbmcgdW5kZXIgdGhlIGJhc2VfZGlyLgorICAgICIiIgorCisgICAgZ2xvYmFsIF9za2lwcGVk
X2RpcmVjdG9yaWVzCisgICAgcGF0aHMgPSBwYXRocyBvciBbJyonXQorICAgIHNraXBwZWRfZGly
ZWN0b3JpZXMgPSBza2lwcGVkX2RpcmVjdG9yaWVzIG9yIHNldChbJy5zdm4nLCAnX3N2biddKQor
ICAgIHJldHVybiBfbm9ybWFsaXplZF9maW5kKGZpbGVzeXN0ZW0sIF9ub3JtYWxpemUoZmlsZXN5
c3RlbSwgYmFzZV9kaXIsIHBhdGhzKSwgc2tpcHBlZF9kaXJlY3RvcmllcywgZmlsZV9maWx0ZXIp
CisKKworZGVmIF9ub3JtYWxpemUoZmlsZXN5c3RlbSwgYmFzZV9kaXIsIHBhdGhzKToKKyAgICBy
ZXR1cm4gW2ZpbGVzeXN0ZW0ubm9ybXBhdGgoZmlsZXN5c3RlbS5qb2luKGJhc2VfZGlyLCBwYXRo
KSkgZm9yIHBhdGggaW4gcGF0aHNdCisKKworZGVmIF9ub3JtYWxpemVkX2ZpbmQoZmlsZXN5c3Rl
bSwgcGF0aHMsIHNraXBwZWRfZGlyZWN0b3JpZXMsIGZpbGVfZmlsdGVyKToKKyAgICAiIiJGaW5k
cyB0aGUgc2V0IG9mIHRlc3RzIHVuZGVyIHRoZSBsaXN0IG9mIHBhdGhzLgorCisgICAgQXJnczoK
KyAgICAgIHBhdGhzOiBhIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aCBleHByZXNzaW9ucyB0byBzZWFy
Y2guCisgICAgICAgICAgR2xvYiBwYXR0ZXJucyBhcmUgb2suCisgICAgIiIiCisgICAgZ2F0aGVy
X3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorICAgIHBhdGhzX3RvX3dhbGsgPSBzZXQoKQorCisg
ICAgZm9yIHBhdGggaW4gcGF0aHM6CisgICAgICAgICMgSWYgdGhlcmUncyBhbiAqIGluIHRoZSBu
YW1lLCBhc3N1bWUgaXQncyBhIGdsb2IgcGF0dGVybi4KKyAgICAgICAgaWYgcGF0aC5maW5kKCcq
JykgPiAtMToKKyAgICAgICAgICAgIGZpbGVuYW1lcyA9IGZpbGVzeXN0ZW0uZ2xvYihwYXRoKQor
ICAgICAgICAgICAgcGF0aHNfdG9fd2Fsay51cGRhdGUoZmlsZW5hbWVzKQorICAgICAgICBlbHNl
OgorICAgICAgICAgICAgcGF0aHNfdG9fd2Fsay5hZGQocGF0aCkKKworICAgICMgRklYTUU6IEkn
bSBub3Qgc3VyZSB0aGVyZSdzIG11Y2ggcG9pbnQgaW4gdGhpcyBiZWluZyBhIHNldC4gQSBsaXN0
IHdvdWxkIHByb2JhYmx5IGJlIGZhc3Rlci4KKyAgICB0ZXN0X2ZpbGVzID0gc2V0KCkKKyAgICBm
b3IgcGF0aCBpbiBwYXRoc190b193YWxrOgorICAgICAgICBmaWxlcyA9IGZpbGVzeXN0ZW0uZmls
ZXNfdW5kZXIocGF0aCwgc2tpcHBlZF9kaXJlY3RvcmllcywgZmlsZV9maWx0ZXIpCisgICAgICAg
IHRlc3RfZmlsZXMudXBkYXRlKHNldChmaWxlcykpCisKKyAgICBnYXRoZXJfdGltZSA9IHRpbWUu
dGltZSgpIC0gZ2F0aGVyX3N0YXJ0X3RpbWUKKyAgICBfbG9nLmRlYnVnKCJUZXN0IGdhdGhlcmlu
ZyB0b29rICVmIHNlY29uZHMiICUgZ2F0aGVyX3RpbWUpCisKKyAgICByZXR1cm4gdGVzdF9maWxl
cwpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vdGVzdF9maWxlc191
bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXNfdW5p
dHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0MzY1NgotLS0g
L2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXNf
dW5pdHRlc3QucHkKQEAgLTAsMCArMSw2NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyMgbWV0OgorIworIyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisj
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBzeXMK
K2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgdGVzdF9maWxlcworCisKK2NsYXNzIE1vY2tXaW5G
aWxlU3lzdGVtKG9iamVjdCk6CisgICAgZGVmIGpvaW4oc2VsZiwgKnBhdGhzKToKKyAgICAgICAg
cmV0dXJuICdcXCcuam9pbihwYXRocykKKworICAgIGRlZiBub3JtcGF0aChzZWxmLCBwYXRoKToK
KyAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgnLycsICdcXCcpCisKKworY2xhc3MgVGVzdFdp
bk5vcm1hbGl6ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGFzc2VydF9maWxlc3lzdGVt
X25vcm1hbGl6ZXMoc2VsZiwgZmlsZXN5c3RlbSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxz
KHRlc3RfZmlsZXMuX25vcm1hbGl6ZShmaWxlc3lzdGVtLCAiYzpcXGZvbyIsCisgICAgICAgICAg
ICBbJ2Zhc3QvaHRtbCcsICdmYXN0L2NhbnZhcy8qJywgJ2NvbXBvc2l0aW5nL2Zvby5odG1sJ10p
LAorICAgICAgICAgICAgWydjOlxcZm9vXFxmYXN0XGh0bWwnLCAnYzpcXGZvb1xcZmFzdFxjYW52
YXNcKicsICdjOlxcZm9vXGNvbXBvc2l0aW5nXFxmb28uaHRtbCddKQorCisgICAgZGVmIHRlc3Rf
bW9ja2VkX3dpbihzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3RzIHRlc3RfZmlsZXMubm9ybWFs
aXplLCB1c2luZyBwb3J0YWJsZSBiZWhhdmlvciBlbXVsYXRpbmcKKyAgICAgICAgIyB3aGF0IHdl
IHRoaW5rIFdpbmRvd3MgaXMgc3VwcG9zZWQgdG8gZG8uIFRoaXMgdGVzdCB3aWxsIHJ1biBvbiBh
bGwKKyAgICAgICAgIyBwbGF0Zm9ybXMuCisgICAgICAgIHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1f
bm9ybWFsaXplcyhNb2NrV2luRmlsZVN5c3RlbSgpKQorCisgICAgZGVmIHRlc3Rfd2luKHNlbGYp
OgorICAgICAgICAjIFRoaXMgdGVzdHMgdGhlIGFjdHVhbCB3aW5kb3dzIHBsYXRmb3JtLCB0byBl
bnN1cmUgd2UgZ2V0IHRoZSBzYW1lCisgICAgICAgICMgcmVzdWx0cyB0aGF0IHdlIGdldCBpbiB0
ZXN0X21vY2tlZF93aW4oKS4KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4nOgorICAg
ICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXpl
cyhGaWxlU3lzdGVtKCkpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0
dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvdGVzdF9maWxlcy5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvdGVzdF9maWxlcy5weQppbmRleCBiOGI4NDEzLi5hZGE2OGIzIDEwMDY0NAotLS0g
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXMucHkK
KysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVz
LnB5CkBAIC0zNiw2ICszNiw3IEBAIHVuZGVyIHRoYXQgZGlyZWN0b3J5LiIiIgogCiBpbXBvcnQg
dGltZQogCitmcm9tIHdlYmtpdHB5LmNvbW1vbiBpbXBvcnQgdGVzdF9maWxlcwogZnJvbSB3ZWJr
aXRweS5jb21tb24uc3lzdGVtIGltcG9ydCBsb2d1dGlscwogCiAKQEAgLTU4LDQzICs1OSw4IEBA
IGRlZiBmaW5kKHBvcnQsIHBhdGhzPU5vbmUpOgogICAgICAgICAgIGZvcndhcmQgc2xhc2hlcyBv
biBXaW5kb3dzLiBJZiBwYXRocyBpcyBlbXB0eSwgd2UgbG9vayBhdAogICAgICAgICAgIGV2ZXJ5
dGhpbmcgdW5kZXIgdGhlIGxheW91dF90ZXN0c19kaXIoKS4KICAgICAiIiIKLSAgICBwYXRocyA9
IHBhdGhzIG9yIFsnKiddCi0gICAgZmlsZXN5c3RlbSA9IHBvcnQuX2ZpbGVzeXN0ZW0KLSAgICBy
ZXR1cm4gbm9ybWFsaXplZF9maW5kKGZpbGVzeXN0ZW0sIG5vcm1hbGl6ZShmaWxlc3lzdGVtLCBw
b3J0LmxheW91dF90ZXN0c19kaXIoKSwgcGF0aHMpKQogCi0KLWRlZiBub3JtYWxpemUoZmlsZXN5
c3RlbSwgYmFzZV9kaXIsIHBhdGhzKToKLSAgICByZXR1cm4gW2ZpbGVzeXN0ZW0ubm9ybXBhdGgo
ZmlsZXN5c3RlbS5qb2luKGJhc2VfZGlyLCBwYXRoKSkgZm9yIHBhdGggaW4gcGF0aHNdCi0KLQot
ZGVmIG5vcm1hbGl6ZWRfZmluZChmaWxlc3lzdGVtLCBwYXRocyk6Ci0gICAgIiIiRmluZHMgdGhl
IHNldCBvZiB0ZXN0cyB1bmRlciB0aGUgbGlzdCBvZiBwYXRocy4KLQotICAgIEFyZ3M6Ci0gICAg
ICBwYXRoczogYSBsaXN0IG9mIGFic29sdXRlIHBhdGggZXhwcmVzc2lvbnMgdG8gc2VhcmNoLgot
ICAgICAgICAgIEdsb2IgcGF0dGVybnMgYXJlIG9rLgotICAgICIiIgotICAgIGdhdGhlcl9zdGFy
dF90aW1lID0gdGltZS50aW1lKCkKLSAgICBwYXRoc190b193YWxrID0gc2V0KCkKLQotICAgIGZv
ciBwYXRoIGluIHBhdGhzOgotICAgICAgICAjIElmIHRoZXJlJ3MgYW4gKiBpbiB0aGUgbmFtZSwg
YXNzdW1lIGl0J3MgYSBnbG9iIHBhdHRlcm4uCi0gICAgICAgIGlmIHBhdGguZmluZCgnKicpID4g
LTE6Ci0gICAgICAgICAgICBmaWxlbmFtZXMgPSBmaWxlc3lzdGVtLmdsb2IocGF0aCkKLSAgICAg
ICAgICAgIHBhdGhzX3RvX3dhbGsudXBkYXRlKGZpbGVuYW1lcykKLSAgICAgICAgZWxzZToKLSAg
ICAgICAgICAgIHBhdGhzX3RvX3dhbGsuYWRkKHBhdGgpCi0KLSAgICAjIEZJWE1FOiBJJ20gbm90
IHN1cmUgdGhlcmUncyBtdWNoIHBvaW50IGluIHRoaXMgYmVpbmcgYSBzZXQuIEEgbGlzdCB3b3Vs
ZCBwcm9iYWJseSBiZSBmYXN0ZXIuCi0gICAgdGVzdF9maWxlcyA9IHNldCgpCi0gICAgZm9yIHBh
dGggaW4gcGF0aHNfdG9fd2FsazoKLSAgICAgICAgZmlsZXMgPSBmaWxlc3lzdGVtLmZpbGVzX3Vu
ZGVyKHBhdGgsIF9za2lwcGVkX2RpcmVjdG9yaWVzLCBfaXNfdGVzdF9maWxlKQotICAgICAgICB0
ZXN0X2ZpbGVzLnVwZGF0ZShzZXQoZmlsZXMpKQotCi0gICAgZ2F0aGVyX3RpbWUgPSB0aW1lLnRp
bWUoKSAtIGdhdGhlcl9zdGFydF90aW1lCi0gICAgX2xvZy5kZWJ1ZygiVGVzdCBnYXRoZXJpbmcg
dG9vayAlZiBzZWNvbmRzIiAlIGdhdGhlcl90aW1lKQotCi0gICAgcmV0dXJuIHRlc3RfZmlsZXMK
KyAgICByZXR1cm4gdGVzdF9maWxlcy5maW5kKHBvcnQuZmlsZXN5c3RlbSwgcG9ydC5sYXlvdXRf
dGVzdHNfZGlyKCksIHBhdGhzLCBfc2tpcHBlZF9kaXJlY3RvcmllcywgX2lzX3Rlc3RfZmlsZSkK
IAogCiBkZWYgX2hhc19zdXBwb3J0ZWRfZXh0ZW5zaW9uKGZpbGVzeXN0ZW0sIGZpbGVuYW1lKToK
ZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVz
dF9maWxlc191bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvdGVzdF9maWxlc191bml0dGVzdC5weQppbmRleCBhMjliYTQ5Li42ZTliOTcxIDEwMDY0
NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmls
ZXNfdW5pdHRlc3QucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cG9ydC90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5CkBAIC02OSwzMyArNjksNSBAQCBjbGFzcyBUZXN0
RmlsZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0
ZXN0X2ZpbGVzLl9pc190ZXN0X2ZpbGUoZnMsICcnLCAnZm9vLWV4cGVjdGVkLW1pc21hdGNoLmh0
bWwnKSkKIAogCi1jbGFzcyBNb2NrV2luRmlsZVN5c3RlbShvYmplY3QpOgotICAgIGRlZiBqb2lu
KHNlbGYsICpwYXRocyk6Ci0gICAgICAgIHJldHVybiAnXFwnLmpvaW4ocGF0aHMpCi0KLSAgICBk
ZWYgbm9ybXBhdGgoc2VsZiwgcGF0aCk6Ci0gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJy8n
LCAnXFwnKQotCi0KLWNsYXNzIFRlc3RXaW5Ob3JtYWxpemUodW5pdHRlc3QuVGVzdENhc2UpOgot
ICAgIGRlZiBhc3NlcnRfZmlsZXN5c3RlbV9ub3JtYWxpemVzKHNlbGYsIGZpbGVzeXN0ZW0pOgot
ICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0ZXN0X2ZpbGVzLm5vcm1hbGl6ZShmaWxlc3lzdGVt
LCAiYzpcXGZvbyIsCi0gICAgICAgICAgICBbJ2Zhc3QvaHRtbCcsICdmYXN0L2NhbnZhcy8qJywg
J2NvbXBvc2l0aW5nL2Zvby5odG1sJ10pLAotICAgICAgICAgICAgWydjOlxcZm9vXFxmYXN0XGh0
bWwnLCAnYzpcXGZvb1xcZmFzdFxjYW52YXNcKicsICdjOlxcZm9vXGNvbXBvc2l0aW5nXFxmb28u
aHRtbCddKQotCi0gICAgZGVmIHRlc3RfbW9ja2VkX3dpbihzZWxmKToKLSAgICAgICAgIyBUaGlz
IHRlc3RzIHRlc3RfZmlsZXMubm9ybWFsaXplLCB1c2luZyBwb3J0YWJsZSBiZWhhdmlvciBlbXVs
YXRpbmcKLSAgICAgICAgIyB3aGF0IHdlIHRoaW5rIFdpbmRvd3MgaXMgc3VwcG9zZWQgdG8gZG8u
IFRoaXMgdGVzdCB3aWxsIHJ1biBvbiBhbGwKLSAgICAgICAgIyBwbGF0Zm9ybXMuCi0gICAgICAg
IHNlbGYuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhNb2NrV2luRmlsZVN5c3RlbSgpKQot
Ci0gICAgZGVmIHRlc3Rfd2luKHNlbGYpOgotICAgICAgICAjIFRoaXMgdGVzdHMgdGhlIGFjdHVh
bCB3aW5kb3dzIHBsYXRmb3JtLCB0byBlbnN1cmUgd2UgZ2V0IHRoZSBzYW1lCi0gICAgICAgICMg
cmVzdWx0cyB0aGF0IHdlIGdldCBpbiB0ZXN0X21vY2tlZF93aW4oKS4KLSAgICAgICAgaWYgc3lz
LnBsYXRmb3JtICE9ICd3aW4nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuYXNz
ZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhGaWxlU3lzdGVtKCkpCi0KLQogaWYgX19uYW1lX18g
PT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvX19pbml0X18ucHkgYi9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNzZiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEs
MTMgQEAKKyMgUmVxdWlyZWQgZm9yIFB5dGhvbiB0byBzZWFyY2ggdGhpcyBkaXJlY3RvcnkgZm9y
IG1vZHVsZSBmaWxlcworCisjIEtlZXAgdGhpcyBmaWxlIGZyZWUgb2YgYW55IGNvZGUgb3IgaW1w
b3J0IHN0YXRlbWVudHMgdGhhdCBjb3VsZAorIyBjYXVzZSBlaXRoZXIgYW4gZXJyb3IgdG8gb2Nj
dXIgb3IgYSBsb2cgbWVzc2FnZSB0byBiZSBsb2dnZWQuCisjIFRoaXMgZW5zdXJlcyB0aGF0IGNh
bGxpbmcgY29kZSBjYW4gaW1wb3J0IGluaXRpYWxpemF0aW9uIGNvZGUgZnJvbQorIyB3ZWJraXRw
eSBiZWZvcmUgYW55IGVycm9ycyBvciBsb2cgbWVzc2FnZXMgZHVlIHRvIGNvZGUgaW4gdGhpcyBm
aWxlLgorIyBJbml0aWFsaXphdGlvbiBjb2RlIGNhbiBpbmNsdWRlIHRoaW5ncyBsaWtlIHZlcnNp
b24tY2hlY2tpbmcgY29kZSBhbmQKKyMgbG9nZ2luZyBjb25maWd1cmF0aW9uIGNvZGUuCisjCisj
IFdlIGRvIG5vdCBleGVjdXRlIGFueSB2ZXJzaW9uLWNoZWNraW5nIGNvZGUgb3IgbG9nZ2luZyBj
b25maWd1cmF0aW9uCisjIGNvZGUgaW4gdGhpcyBmaWxlIHNvIHRoYXQgY2FsbGVycyBjYW4gb3B0
LWluIGFzIHRoZXkgd2FudC4gIFRoaXMgYWxzbworIyBhbGxvd3MgZGlmZmVyZW50IGNhbGxlcnMg
dG8gY2hvb3NlIGRpZmZlcmVudCBpbml0aWFsaXphdGlvbiBjb2RlLAorIyBhcyBuZWNlc3Nhcnku
CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3J1
bl9wZXJmX3Rlc3RzLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0
cy9ydW5fcGVyZl90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4z
YmU0MzJiCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3Jt
YW5jZV90ZXN0cy9ydW5fcGVyZl90ZXN0cy5weQpAQCAtMCwwICsxLDE3NCBAQAorIyEvdXNyL2Jp
bi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisj
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMg
ZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMg
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
IyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
IyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiUnVuIEluc3BlY3RvcidzIHBlcmYg
dGVzdHMgaW4gcGVyZiBtb2RlLiIiIgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9wdHBhcnNl
CitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0IHRl
c3RfZmlsZXMKK2Zyb20gd2Via2l0cHkuY29tbW9uLmhvc3QgaW1wb3J0IEhvc3QKK2Zyb20gd2Vi
a2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQuZHJpdmVyIGltcG9ydCBEcml2ZXJJbnB1dAorZnJvbSB3
ZWJraXRweS5sYXlvdXRfdGVzdHMudmlld3MgaW1wb3J0IHByaW50aW5nCisKK19wZXJmX3Rlc3Rz
X2Jhc2VfZGlyID0gJ1BlcmZvcm1hbmNlVGVzdHMnCitfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIo
X19uYW1lX18pCitfcmVzdWx0X3JlZ2V4ID0gcmUuY29tcGlsZSgnXlJFU1VMVCAuKiQnKQorCisK
K2RlZiBydW4ocGVyZl90ZXN0c19kaXIsIHJlZ3VsYXJfb3V0cHV0PXN5cy5zdGRlcnIsIGJ1aWxk
Ym90X291dHB1dD1zeXMuc3Rkb3V0LCBwb3J0PU5vbmUpOgorICAgIHJ1bm5lciA9IFBlcmZUZXN0
c1J1bm5lcihwZXJmX3Rlc3RzX2RpciwgcmVndWxhcl9vdXRwdXQsIGJ1aWxkYm90X291dHB1dCwg
cG9ydCkKKyAgICByZXR1cm4gcnVubmVyLnJ1bigpCisKKworY2xhc3MgUGVyZlRlc3RzUnVubmVy
OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBlcmZfdGVzdHNfZGlyLCByZWd1bGFyX291dHB1
dCwgYnVpbGRib3Rfb3V0cHV0LCBwb3J0PU5vbmUsIGFyZ3M9Tm9uZSk6CisgICAgICAgIHNlbGYu
X3BlcmZfdGVzdHNfZGlyID0gcGVyZl90ZXN0c19kaXIKKyAgICAgICAgc2VsZi5fYnVpbGRib3Rf
b3V0cHV0ID0gYnVpbGRib3Rfb3V0cHV0CisgICAgICAgIHNlbGYuX29wdGlvbnMsIHNlbGYuX2Fy
Z3MgPSBzZWxmLnBhcnNlX2FyZ3MoYXJncykKKyAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQgb3Ig
SG9zdCgpLnBvcnRfZmFjdG9yeS5nZXQoc2VsZi5fb3B0aW9ucy5wbGF0Zm9ybSwgc2VsZi5fb3B0
aW9ucykKKyAgICAgICAgc2VsZi5fcHJpbnRlciA9IHByaW50aW5nLlByaW50ZXIoc2VsZi5fcG9y
dCwgc2VsZi5fb3B0aW9ucywgcmVndWxhcl9vdXRwdXQsIGJ1aWxkYm90X291dHB1dCwgY29uZmln
dXJlX2xvZ2dpbmc9RmFsc2UpCisgICAgICAgIHNlbGYuX3dlYmtpdF9iYXNlX2Rpcl9sZW4gPSBs
ZW4oc2VsZi5fcG9ydC5jb25maWcud2Via2l0X2Jhc2VfZGlyKCkpCisKKyAgICBkZWYgcGFyc2Vf
YXJncyhzZWxmLCBhcmdzPU5vbmUpOgorICAgICAgICBwcmludF9vcHRpb25zID0gcHJpbnRpbmcu
cHJpbnRfb3B0aW9ucygpCisKKyAgICAgICAgcGVyZl9vcHRpb25fbGlzdCA9IFsKKyAgICAgICAg
ICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV9jb25zdCcs
IGNvbnN0PSdEZWJ1ZycsIGRlc3Q9ImNvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaGVscD0nU2V0IHRoZSBjb25maWd1cmF0aW9uIHRvIERlYnVnJyksCisg
ICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbignLS1yZWxlYXNlJywgYWN0aW9uPSdzdG9y
ZV9jb25zdCcsIGNvbnN0PSdSZWxlYXNlJywgZGVzdD0iY29uZmlndXJhdGlvbiIsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTZXQgdGhlIGNvbmZpZ3VyYXRpb24gdG8g
UmVsZWFzZScpLAorICAgICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tcGxhdGZvcm0i
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iU3BlY2lmeSBwb3J0L3Bs
YXRmb3JtIGJlaW5nIHRlc3RlZCAoaS5lLiBjaHJvbWl1bS1tYWMpIiksCisgICAgICAgICAgICBv
cHRwYXJzZS5tYWtlX29wdGlvbigiLS1idWlsZC1kaXJlY3RvcnkiLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byB0aGUgZGlyZWN0b3J5IHVuZGVyIHdoaWNo
IGJ1aWxkIGZpbGVzIGFyZSBrZXB0IChzaG91bGQgbm90IGluY2x1ZGUgY29uZmlndXJhdGlvbiki
KSwKKyAgICAgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItLXRpbWUtb3V0LW1zIiwgZGVm
YXVsdD0zMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNldCB0
aGUgdGltZW91dCBmb3IgZWFjaCB0ZXN0IiksCisgICAgICAgICAgICBdCisKKyAgICAgICAgb3B0
aW9uX2xpc3QgPSAocGVyZl9vcHRpb25fbGlzdCArIHByaW50X29wdGlvbnMpCisgICAgICAgIHJl
dHVybiBvcHRwYXJzZS5PcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9uX2xpc3QpLnBhcnNl
X2FyZ3MoYXJncykKKworICAgIGRlZiBfY29sbGVjdF90ZXN0cyhzZWxmKToKKyAgICAgICAgIiIi
UmV0dXJuIHRoZSBsaXN0IG9mIHRlc3RzIGZvdW5kLiIiIgorCisgICAgICAgIGRlZiBfaXNfdGVz
dF9maWxlKGZpbGVzeXN0ZW0sIGRpcm5hbWUsIGZpbGVuYW1lKToKKyAgICAgICAgICAgIHJldHVy
biBmaWxlbmFtZS5lbmRzd2l0aCgnLmh0bWwnKQorCisgICAgICAgIGZpbGVzeXN0ZW0gPSBzZWxm
Ll9wb3J0LmZpbGVzeXN0ZW0KKyAgICAgICAgcmV0dXJuIHRlc3RfZmlsZXMuZmluZChmaWxlc3lz
dGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQucGF0aF9mcm9t
X3dlYmtpdF9iYXNlKGZpbGVzeXN0ZW0uam9pbihfcGVyZl90ZXN0c19iYXNlX2Rpciwgc2VsZi5f
cGVyZl90ZXN0c19kaXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocz1z
ZWxmLl9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZmlsdGVyPV9p
c190ZXN0X2ZpbGUpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorCisgICAgICAgIGlmIHNlbGYuX29w
dGlvbnMuaGVscF9wcmludGluZzoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50ZXIuaGVscF9wcmlu
dGluZygpCisgICAgICAgICAgICBzZWxmLl9wcmludGVyLmNsZWFudXAoKQorICAgICAgICAgICAg
cmV0dXJuIDAKKworICAgICAgICBpZiBub3Qgc2VsZi5fcG9ydC5jaGVja19idWlsZChuZWVkc19o
dHRwPUZhbHNlKToKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJCdWlsZCBub3Qg
dXAgdG8gZGF0ZSBmb3IgIiArIHNlbGYuX3BvcnQuX3BhdGhfdG9fZHJpdmVyKCkKKyAgICAgICAg
ICAgIHJldHVybiAtMQorCisgICAgICAgICMgV2Ugd3JhcCBhbnkgcGFydHMgb2YgdGhlIHJ1biB0
aGF0IGFyZSBzbG93IG9yIGxpa2VseSB0byByYWlzZSBleGNlcHRpb25zCisgICAgICAgICMgaW4g
YSB0cnkvZmluYWxseSB0byBlbnN1cmUgdGhhdCB3ZSBjbGVhbiB1cCB0aGUgbG9nZ2luZyBjb25m
aWd1cmF0aW9uLgorICAgICAgICB1bmV4cGVjdGVkX3Jlc3VsdF9jb3VudCA9IC0xCisgICAgICAg
IHRyeToKKyAgICAgICAgICAgIHRlc3RzID0gc2VsZi5fY29sbGVjdF90ZXN0cygpCisgICAgICAg
ICAgICB1bmV4cGVjdGVkX3Jlc3VsdF9jb3VudCA9IHNlbGYuX3J1bl90ZXN0c19zZXQodGVzdHMs
IHNlbGYuX3BvcnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9wcmludGVy
LmNsZWFudXAoKQorCisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkX3Jlc3VsdF9jb3VudAorCisg
ICAgZGVmIF9ydW5fdGVzdHNfc2V0KHNlbGYsIHRlc3RzLCBwb3J0KToKKyAgICAgICAgcmVzdWx0
X2NvdW50ID0gbGVuKHRlc3RzKQorICAgICAgICBleHBlY3RlZF9yZXN1bHRfY291bnQgPSAwCisg
ICAgICAgIHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50ID0gMAorICAgICAgICBzZWxmLl9wcmludGVy
LnByaW50X29uZV9saW5lX3N1bW1hcnkocmVzdWx0X2NvdW50LCAwLCAwKQorICAgICAgICBkcml2
ZXJfbmVlZF9yZXN0YXJ0ID0gRmFsc2UKKyAgICAgICAgZHJpdmVyID0gTm9uZQorCisgICAgICAg
IGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgICAgICAgaWYgZHJpdmVyX25lZWRfcmVzdGFydDoK
KyAgICAgICAgICAgICAgICBfbG9nLmRlYnVnKCIlcyBraWxsaW5nIGRyaXZlciIgJSB0ZXN0KQor
ICAgICAgICAgICAgICAgIGRyaXZlci5zdG9wKCkKKyAgICAgICAgICAgICAgICBkcml2ZXIgPSBO
b25lCisgICAgICAgICAgICBpZiBub3QgZHJpdmVyOgorICAgICAgICAgICAgICAgIGRyaXZlciA9
IHBvcnQuY3JlYXRlX2RyaXZlcih3b3JrZXJfbnVtYmVyPTEpCisKKyAgICAgICAgICAgIHRlc3Rf
ZmFpbGVkLCBkcml2ZXJfbmVlZF9yZXN0YXJ0ID0gc2VsZi5fcnVuX3NpbmdsZV90ZXN0KHRlc3Qs
IGRyaXZlcikKKyAgICAgICAgICAgIGlmIHRlc3RfZmFpbGVkOgorICAgICAgICAgICAgICAgIHVu
ZXhwZWN0ZWRfcmVzdWx0X2NvdW50ID0gdW5leHBlY3RlZF9yZXN1bHRfY291bnQgKyAxCisgICAg
ICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3VsdF9jb3VudCA9IGV4
cGVjdGVkX3Jlc3VsdF9jb3VudCArIDEKKworICAgICAgICAgICAgc2VsZi5fcHJpbnRlci5wcmlu
dF9vbmVfbGluZV9zdW1tYXJ5KHJlc3VsdF9jb3VudCwgZXhwZWN0ZWRfcmVzdWx0X2NvdW50LCB1
bmV4cGVjdGVkX3Jlc3VsdF9jb3VudCkKKworICAgICAgICBpZiBkcml2ZXI6CisgICAgICAgICAg
ICBkcml2ZXIuc3RvcCgpCisKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWRfcmVzdWx0X2NvdW50
CisKKyAgICBkZWYgX3J1bl9zaW5nbGVfdGVzdChzZWxmLCB0ZXN0LCBkcml2ZXIpOgorICAgICAg
ICB0ZXN0X2ZhaWxlZCA9IEZhbHNlCisgICAgICAgIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBGYWxz
ZQorICAgICAgICBvdXRwdXQgPSBkcml2ZXIucnVuX3Rlc3QoRHJpdmVySW5wdXQodGVzdCwgc2Vs
Zi5fb3B0aW9ucy50aW1lX291dF9tcywgTm9uZSwgRmFsc2UpKQorCisgICAgICAgIGlmIG91dHB1
dC50ZXh0ID09IE5vbmU6CisgICAgICAgICAgICB0ZXN0X2ZhaWxlZCA9IFRydWUKKyAgICAgICAg
ZWxpZiBvdXRwdXQudGltZW91dDoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50ZXIud3JpdGUoJ3Rp
bWVvdXQ6ICVzJyAlIHRlc3Rbc2VsZi5fd2Via2l0X2Jhc2VfZGlyX2xlbiArIDE6XSkKKyAgICAg
ICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorICAgICAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFy
dCA9IFRydWUKKyAgICAgICAgZWxpZiBvdXRwdXQuY3Jhc2g6CisgICAgICAgICAgICBzZWxmLl9w
cmludGVyLndyaXRlKCdjcmFzaDogJXMnICUgdGVzdFtzZWxmLl93ZWJraXRfYmFzZV9kaXJfbGVu
ICsgMTpdKQorICAgICAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFydCA9IFRydWUKKyAgICAgICAg
ICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ290X2Ff
cmVzdWx0ID0gRmFsc2UKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHJlLnNwbGl0KCdcbicsIG91
dHB1dC50ZXh0KToKKyAgICAgICAgICAgICAgICBpZiBfcmVzdWx0X3JlZ2V4Lm1hdGNoKGxpbmUp
OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9idWlsZGJvdF9vdXRwdXQud3JpdGUoIiVzXG4i
ICUgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgZ290X2FfcmVzdWx0ID0gVHJ1ZQorICAgICAg
ICAgICAgICAgIGVsaWYgbm90IGxlbihsaW5lKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICB0
ZXN0X2ZhaWxlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJpbnRlci53cml0
ZSgiJXMiICUgbGluZSkKKyAgICAgICAgICAgIHRlc3RfZmFpbGVkID0gdGVzdF9mYWlsZWQgb3Ig
bm90IGdvdF9hX3Jlc3VsdAorCisgICAgICAgIGlmIGxlbihvdXRwdXQuZXJyb3IpOgorICAgICAg
ICAgICAgc2VsZi5fcHJpbnRlci53cml0ZSgnZXJyb3I6XG4lcycgJSBvdXRwdXQuZXJyb3IpCisg
ICAgICAgICAgICB0ZXN0X2ZhaWxlZCA9IFRydWUKKworICAgICAgICByZXR1cm4gdGVzdF9mYWls
ZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvcGVyZm9ybWFuY2VfdGVzdHMvcnVuX3BlcmZfdGVzdHNfdW5pdHRlc3QucHkgYi9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3J1bl9wZXJmX3Rlc3RzX3VuaXR0ZXN0
LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2Nzc1ZDYKLS0tIC9kZXYv
bnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3J1bl9w
ZXJmX3Rlc3RzX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTMwIEBACisjIS91c3IvYmluL3B5dGhv
bgorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlv
bi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVz
IG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisj
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAor
IyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlVuaXQgdGVzdHMgZm9yIHJ1bl9wZXJmX3Rlc3RzLiIi
IgorCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0IGFycmF5
X3N0cmVhbQorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydC5kcml2ZXIgaW1wb3J0IERy
aXZlcklucHV0LCBEcml2ZXJPdXRwdXQKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQu
dGVzdCBpbXBvcnQgdW5pdF90ZXN0X2ZpbGVzeXN0ZW0KK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rl
c3RzLnZpZXdzIGltcG9ydCBwcmludGluZworZnJvbSB3ZWJraXRweS5wZXJmb3JtYW5jZV90ZXN0
cy5ydW5fcGVyZl90ZXN0cyBpbXBvcnQgUGVyZlRlc3RzUnVubmVyCisKKworY2xhc3MgTWFpblRl
c3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNyZWF0ZV9kcml2ZXIoc2VsZik6Cisg
ICAgICAgIGNsYXNzIFRlc3REcml2ZXI6CisKKyAgICAgICAgICAgIGRlZiBydW5fdGVzdChzZWxm
LCBkcml2ZXJfaW5wdXQpOgorICAgICAgICAgICAgICAgIHRleHQgPSAnJworICAgICAgICAgICAg
ICAgIHRpbWVvdXQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGNyYXNoID0gRmFsc2UKKyAgICAg
ICAgICAgICAgICBpZiBkcml2ZXJfaW5wdXQudGVzdF9uYW1lID09ICdwYXNzLmh0bWwnOgorICAg
ICAgICAgICAgICAgICAgICB0ZXh0ID0gJ1JFU1VMVCBncm91cF9uYW1lOiB0ZXN0X25hbWU9IDQy
IG1zJworICAgICAgICAgICAgICAgIGVsaWYgZHJpdmVyX2lucHV0LnRlc3RfbmFtZSA9PSAndGlt
ZW91dC5odG1sJzoKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IFRydWUKKyAgICAgICAg
ICAgICAgICBlbGlmIGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0gJ2ZhaWxlZC5odG1sJzoKKyAg
ICAgICAgICAgICAgICAgICAgdGV4dCA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbGlmIGRyaXZl
cl9pbnB1dC50ZXN0X25hbWUgPT0gJ3Rvbmd1ZXkuaHRtbCc6CisgICAgICAgICAgICAgICAgICAg
IHRleHQgPSAnd2UgYXJlIG5vdCBleHBlY3RpbmcgYW4gb3V0cHV0IGZyb20gcGVyZiB0ZXN0cyBi
dXQgUkVTVUxUIGJsYWJsYWJsYScKKyAgICAgICAgICAgICAgICBlbGlmIGRyaXZlcl9pbnB1dC50
ZXN0X25hbWUgPT0gJ2NyYXNoLmh0bWwnOgorICAgICAgICAgICAgICAgICAgICBjcmFzaCA9IFRy
dWUKKyAgICAgICAgICAgICAgICByZXR1cm4gRHJpdmVyT3V0cHV0KHRleHQsICcnLCAnJywgJycs
IGNyYXNoPWNyYXNoLCB0aW1lb3V0PXRpbWVvdXQpCisKKyAgICAgICAgICAgIGRlZiBzdG9wKHNl
bGYpOgorICAgICAgICAgICAgICAgICIiImRvIG5vdGhpbmciIiIKKworICAgICAgICByZXR1cm4g
VGVzdERyaXZlcigpCisKKyAgICBkZWYgY3JlYXRlX3BvcnQoc2VsZik6CisgICAgICAgIGNsYXNz
IFRlc3RQb3J0OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RfY2FzZSk6Cisg
ICAgICAgICAgICAgICAgc2VsZi5fdGVzdF9jYXNlID0gdGVzdF9jYXNlCisKKyAgICAgICAgICAg
IGRlZiBjcmVhdGVfZHJpdmVyKHNlbGYsIHdvcmtlcl9udW1iZXI9Tm9uZSk6CisgICAgICAgICAg
ICAgICAgcmV0dXJuIHNlbGYuX3Rlc3RfY2FzZS5jcmVhdGVfZHJpdmVyKCkKKworICAgICAgICBy
ZXR1cm4gVGVzdFBvcnQoc2VsZikKKworICAgIGRlZiBjcmVhdGVfcnVubmVyKHNlbGYsIGJ1aWxk
Ym90X291dHB1dD1Ob25lKToKKyAgICAgICAgYnVpbGRib3Rfb3V0cHV0ID0gYnVpbGRib3Rfb3V0
cHV0IG9yIGFycmF5X3N0cmVhbS5BcnJheVN0cmVhbSgpCisgICAgICAgIHJlZ3VsYXJfb3V0cHV0
ID0gYXJyYXlfc3RyZWFtLkFycmF5U3RyZWFtKCkKKyAgICAgICAgcmV0dXJuIFBlcmZUZXN0c1J1
bm5lcignJywgcmVndWxhcl9vdXRwdXQsIGJ1aWxkYm90X291dHB1dCkKKworICAgIGRlZiBydW5f
dGVzdChzZWxmLCB0ZXN0X25hbWUpOgorICAgICAgICBydW5uZXIgPSBzZWxmLmNyZWF0ZV9ydW5u
ZXIoKQorICAgICAgICBkcml2ZXIgPSBzZWxmLmNyZWF0ZV9kcml2ZXIoKQorICAgICAgICByZXR1
cm4gcnVubmVyLl9ydW5fc2luZ2xlX3Rlc3QodGVzdF9uYW1lLCBkcml2ZXIpCisKKyAgICBkZWYg
dGVzdF9ydW5fcGFzc2luZ190ZXN0KHNlbGYpOgorICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVy
X25lZWRfcmVzdGFydCA9IHNlbGYucnVuX3Rlc3QoJ3Bhc3MuaHRtbCcpCisgICAgICAgIHNlbGYu
YXNzZXJ0RmFsc2UodGVzdF9mYWlsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZHJpdmVy
X25lZWRfcmVzdGFydCkKKworICAgIGRlZiB0ZXN0X3J1bl9zaWxlbnRfdGVzdChzZWxmKToKKyAg
ICAgICAgdGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBzZWxmLnJ1bl90ZXN0KCdz
aWxlbnQuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXN0X2ZhaWxlZCkKKyAgICAg
ICAgc2VsZi5hc3NlcnRGYWxzZShkcml2ZXJfbmVlZF9yZXN0YXJ0KQorCisgICAgZGVmIHRlc3Rf
cnVuX2ZhaWxlZF90ZXN0KHNlbGYpOgorICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRf
cmVzdGFydCA9IHNlbGYucnVuX3Rlc3QoJ2ZhaWxlZC5odG1sJykKKyAgICAgICAgc2VsZi5hc3Nl
cnRUcnVlKHRlc3RfZmFpbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRyaXZlcl9uZWVk
X3Jlc3RhcnQpCisKKyAgICBkZWYgdGVzdF9ydW5fdG9uZ3VleV90ZXN0KHNlbGYpOgorICAgICAg
ICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNlbGYucnVuX3Rlc3QoJ3Rvbmd1
ZXkuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXN0X2ZhaWxlZCkKKyAgICAgICAg
c2VsZi5hc3NlcnRGYWxzZShkcml2ZXJfbmVlZF9yZXN0YXJ0KQorCisgICAgZGVmIHRlc3RfcnVu
X3RpbWVvdXRfdGVzdChzZWxmKToKKyAgICAgICAgdGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jl
c3RhcnQgPSBzZWxmLnJ1bl90ZXN0KCd0aW1lb3V0Lmh0bWwnKQorICAgICAgICBzZWxmLmFzc2Vy
dFRydWUodGVzdF9mYWlsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkcml2ZXJfbmVlZF9y
ZXN0YXJ0KQorCisgICAgZGVmIHRlc3RfcnVuX2NyYXNoX3Rlc3Qoc2VsZik6CisgICAgICAgIHRl
c3RfZmFpbGVkLCBkcml2ZXJfbmVlZF9yZXN0YXJ0ID0gc2VsZi5ydW5fdGVzdCgnY3Jhc2guaHRt
bCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXN0X2ZhaWxlZCkKKyAgICAgICAgc2VsZi5h
c3NlcnRUcnVlKGRyaXZlcl9uZWVkX3Jlc3RhcnQpCisKKyAgICBkZWYgdGVzdF9ydW5fdGVzdF9z
ZXQoc2VsZik6CisgICAgICAgIGJ1aWxkYm90X291dHB1dCA9IGFycmF5X3N0cmVhbS5BcnJheVN0
cmVhbSgpCisgICAgICAgIHJ1bm5lciA9IHNlbGYuY3JlYXRlX3J1bm5lcihidWlsZGJvdF9vdXRw
dXQpCisgICAgICAgIGRyaXZlciA9IHNlbGYuY3JlYXRlX2RyaXZlcigpCisgICAgICAgIHBvcnQg
PSBzZWxmLmNyZWF0ZV9wb3J0KCkKKyAgICAgICAgdGVzdHMgPSBbJ3Bhc3MuaHRtbCcsICdzaWxl
bnQuaHRtbCcsICdmYWlsZWQuaHRtbCcsICd0b25ndWV5Lmh0bWwnLCAndGltZW91dC5odG1sJywg
J2NyYXNoLmh0bWwnXQorICAgICAgICB1bmV4cGVjdGVkX3Jlc3VsdF9jb3VudCA9IHJ1bm5lci5f
cnVuX3Rlc3RzX3NldCh0ZXN0cywgcG9ydCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmV4
cGVjdGVkX3Jlc3VsdF9jb3VudCwgbGVuKHRlc3RzKSAtIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwobGVuKGJ1aWxkYm90X291dHB1dC5nZXQoKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwoYnVpbGRib3Rfb3V0cHV0LmdldCgpWzBdLCAnUkVTVUxUIGdyb3VwX25hbWU6IHRlc3Rf
bmFtZT0gNDIgbXNcbicpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0
dGVzdC5tYWluKCkK
</data>
<flag name="review"
          id="115973"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116801</attachid>
            <date>2011-11-28 12:50:07 -0800</date>
            <delta_ts>2011-11-29 00:32:48 -0800</delta_ts>
            <desc>[patch] forth version</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>29613</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA0MDEx
N2ZlLi43MzA4OTIyIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsNjMgQEAKKzIwMTEtMTEtMjggIElseWEgVGlraG9ub3Zza3kgIDxs
b2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYiBJbnNwZWN0b3I6IGNocm9taXVtOiBJ
J2QgbGlrZSB0byBhZGQgYSBzY3JpcHQgZm9yIHJ1bm5pbmcgcGVyZiB0ZXN0cyBmb3IgV2ViSW5z
cGVjdG9yLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NzMwNzkKKworICAgICAgICBUaGUgaWRlYSBpcyB0byBoYXZlIHBlcmZvcm1hbmNlIHRlc3RzIGZv
ciBXZWJJbnNwZWN0b3IuCisgICAgICAgIEkgd2FzIHN1Z2dlc3RlZCB0byBwdXQgdGhlc2UgdGVz
dHMgaW50byBQZXJmb3JtYW5jZVRlc3RzL2luc3BlY3Rvci4KKyAgICAgICAgVGhleSBwcm9kdWNl
IG91dHB1dCBpbiBhIGZvcm1hdCB0aGF0IGlzIHN1aXRhYmxlIGZvciBjaHJvbWl1bSBwZXJmIGJv
dCBkcmF3aW5nIHNjcmlwdHMuCisKKyAgICAgICAgSSdkIGxpa2UgdG8gcmV1c2UgY29kZSBmb3Ig
c2Nhbm5pbmcgZm9sZGVycyBmb3IgdGVzdCBmaWxlcy4KKyAgICAgICAgQmVjYXVzZSBvZiB0aGUg
ZmFjdCB0aGF0IG9yaWdpbmFsIHRlc3RfZmlsZXMucHkgaGFzIGNvbW1vbiBhbmQgbGF5b3V0IHNw
ZWNpZmljIHBhcnRzCisgICAgICAgIEkgZGVjaWRlZCB0byBleHRyYWN0IHRoZSBnZW5lcmljIHBh
cnQgYW5kIHB1dCBpdCBpbnRvIHdlYmtpdHB5L2NvbW1vbgorICAgICAgICBJIHRoaW5rIHRoZSB0
d28gcGFja2FnZXMgd2l0aCBuYW1lIHRlc3RfZmlsZXMgbG9vayBzdHJhbmdlIGJ1dCBJIGhhdmUg
bm8gaWRlYSBhYm91dCBhIGJldHRlciBuYW1lLgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgICogU2NyaXB0cy9ydW4taW5zcGVjdG9yLXBlcmYtdGVzdHMu
cHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3Rlc3RfZmlsZXMu
cHk6IENvcGllZCBmcm9tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQv
dGVzdF9maWxlcy5weS4KKyAgICAgICAgKGZpbmQpOgorICAgICAgICAoX25vcm1hbGl6ZSk6Cisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vdGVzdF9maWxlc191bml0dGVzdC5weTog
QWRkZWQuCisgICAgICAgIChNb2NrV2luRmlsZVN5c3RlbS5qb2luKToKKyAgICAgICAgKE1vY2tX
aW5GaWxlU3lzdGVtKToKKyAgICAgICAgKE1vY2tXaW5GaWxlU3lzdGVtLm5vcm1wYXRoKToKKyAg
ICAgICAgKFRlc3RXaW5Ob3JtYWxpemUuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyk6Cisg
ICAgICAgIChUZXN0V2luTm9ybWFsaXplLnRlc3RfbW9ja2VkX3dpbik6CisgICAgICAgIChUZXN0
V2luTm9ybWFsaXplKToKKyAgICAgICAgKFRlc3RXaW5Ob3JtYWxpemUudGVzdF93aW4pOgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlcy5weToK
KyAgICAgICAgKGZpbmQpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvdGVzdF9maWxlc191bml0dGVzdC5weToKKyAgICAgICAgKFRlc3RGaWxlc1Rlc3QudGVz
dF9pc190ZXN0X2ZpbGUpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2Vf
dGVzdHMvX19pbml0X18ucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVy
Zm9ybWFuY2VfdGVzdHMvcGVyZnRlc3RzcnVubmVyLnB5OiBBZGRlZC4KKyAgICAgICAgKFBlcmZU
ZXN0c1J1bm5lci5fX2luaXRfXyk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIucGFyc2VfYXJn
cyk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX2NvbGxlY3RfdGVzdHMuX2lzX3Rlc3RfZmls
ZSk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX2NvbGxlY3RfdGVzdHMpOgorICAgICAgICAo
UGVyZlRlc3RzUnVubmVyLnJ1bik6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX3J1bl90ZXN0
c19zZXQpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcGVy
ZnRlc3RzcnVubmVyX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKE1haW5UZXN0LmNyZWF0
ZV9kcml2ZXIuVGVzdERyaXZlci5ydW5fdGVzdCk6CisgICAgICAgIChNYWluVGVzdC5jcmVhdGVf
ZHJpdmVyLlRlc3REcml2ZXIpOgorICAgICAgICAoTWFpblRlc3QuY3JlYXRlX2RyaXZlci5UZXN0
RHJpdmVyLnN0b3ApOgorICAgICAgICAoTWFpblRlc3QuY3JlYXRlX2RyaXZlcik6CisgICAgICAg
IChNYWluVGVzdC5jcmVhdGVfcG9ydC5UZXN0UG9ydC5fX2luaXRfXyk6CisgICAgICAgIChNYWlu
VGVzdC5jcmVhdGVfcG9ydC5UZXN0UG9ydCk6CisgICAgICAgIChNYWluVGVzdC5jcmVhdGVfcG9y
dC5UZXN0UG9ydC5jcmVhdGVfZHJpdmVyKToKKyAgICAgICAgKE1haW5UZXN0LmNyZWF0ZV9wb3J0
KToKKyAgICAgICAgKE1haW5UZXN0LmNyZWF0ZV9ydW5uZXIpOgorICAgICAgICAoTWFpblRlc3Qu
cnVuX3Rlc3QpOgorICAgICAgICAoTWFpblRlc3QudGVzdF9ydW5fcGFzc2luZ190ZXN0KToKKyAg
ICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX3NpbGVudF90ZXN0KToKKyAgICAgICAgKE1haW5UZXN0
LnRlc3RfcnVuX2ZhaWxlZF90ZXN0KToKKyAgICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX3Rvbmd1
ZXlfdGVzdCk6CisgICAgICAgIChNYWluVGVzdC50ZXN0X3J1bl90aW1lb3V0X3Rlc3QpOgorICAg
ICAgICAoTWFpblRlc3QudGVzdF9ydW5fY3Jhc2hfdGVzdCk6CisgICAgICAgIChNYWluVGVzdCk6
CisgICAgICAgIChNYWluVGVzdC50ZXN0X3J1bl90ZXN0X3NldCk6CisKIDIwMTEtMTEtMjggIEVy
aWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgogCiAgICAgICAgIEFkZCBFbnZpcm9ubWVudCBv
YmplY3QgdG8gSG9zdCBhbmQgZml4IHRoZSBHQ0Mgc21hcnRxdW90ZXMgdHJvdWJsZSBzZWVuIG9u
IHRoZSBjb21taXQtcXVldWUKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvcnVuLWluc3BlY3Rv
ci1wZXJmLXRlc3RzLnB5IGIvVG9vbHMvU2NyaXB0cy9ydW4taW5zcGVjdG9yLXBlcmYtdGVzdHMu
cHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDE1Nzg2NAotLS0gL2Rldi9u
dWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvcnVuLWluc3BlY3Rvci1wZXJmLXRlc3RzLnB5CkBAIC0w
LDAgKzEsNDIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTEg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUg
bmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQor
IyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIi
IlJ1biBJbnNwZWN0b3IncyBwZXJmIHRlc3RzIGluIHBlcmYgbW9kZS4iIiIKKworaW1wb3J0IGxv
Z2dpbmcKK2ltcG9ydCBzeXMKKworZnJvbSB3ZWJraXRweS5wZXJmb3JtYW5jZV90ZXN0cy5wZXJm
dGVzdHNydW5uZXIgaW1wb3J0IFBlcmZUZXN0c1J1bm5lcgorCitfcGVyZl90ZXN0c19kaXIgPSAn
aW5zcGVjdG9yJworX2xvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCitpZiAnX19t
YWluX18nID09IF9fbmFtZV9fOgorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2lu
Zy5JTkZPLCBmb3JtYXQ9IiUobWVzc2FnZSlzIikKKyAgICBzeXMuZXhpdChQZXJmVGVzdHNSdW5u
ZXIoX3BlcmZfdGVzdHNfZGlyKS5ydW4oKSkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL3Rlc3RfZmlsZXMucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi90ZXN0X2ZpbGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjc0
OTkKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi90ZXN0
X2ZpbGVzLnB5CkBAIC0wLDAgKzEsOTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5
cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
IyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3Rz
IGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisKKyIiIlRoaXMgbW9kdWxlIGlzIHVzZWQgdG8gZmluZCBhbGwgb2YgdGhlIGxh
eW91dCB0ZXN0IGZpbGVzIHVzZWQgYnkKK3J1bi13ZWJraXQtdGVzdHMuIEl0IGV4cG9zZXMgb25l
IHB1YmxpYyBmdW5jdGlvbiAtIGZpbmQoKSAtCit3aGljaCB0YWtlcyBhbiBvcHRpb25hbCBsaXN0
IG9mIHBhdGhzLiBJZiBhIGxpc3QgaXMgcGFzc2VkIGluLCB0aGUgcmV0dXJuZWQKK2xpc3Qgb2Yg
dGVzdCBmaWxlcyBpcyBjb25zdHJhaW5lZCB0byB0aG9zZSBmb3VuZCB1bmRlciB0aGUgcGF0aHMg
cGFzc2VkIGluLAoraS5lLiBjYWxsaW5nIGZpbmQoWyJMYXlvdXRUZXN0cy9mYXN0Il0pIHdpbGwg
b25seSByZXR1cm4gZmlsZXMKK3VuZGVyIHRoYXQgZGlyZWN0b3J5LiIiIgorCitpbXBvcnQgdGlt
ZQorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0gaW1wb3J0IGxvZ3V0aWxzCisKKworX2xv
ZyA9IGxvZ3V0aWxzLmdldF9sb2dnZXIoX19maWxlX18pCisKKworZGVmIGZpbmQoZmlsZXN5c3Rl
bSwgYmFzZV9kaXIsIHBhdGhzPU5vbmUsIHNraXBwZWRfZGlyZWN0b3JpZXM9Tm9uZSwgZmlsZV9m
aWx0ZXI9Tm9uZSk6CisgICAgIiIiRmluZHMgdGhlIHNldCBvZiB0ZXN0cyB1bmRlciBhIGdpdmVu
IGxpc3Qgb2Ygc3ViLXBhdGhzLgorCisgICAgQXJnczoKKyAgICAgIHBhdGhzOiBhIGxpc3Qgb2Yg
cGF0aCBleHByZXNzaW9ucyByZWxhdGl2ZSB0byBiYXNlX2RpcgorICAgICAgICAgIHRvIHNlYXJj
aC4gR2xvYiBwYXR0ZXJucyBhcmUgb2ssIGFzIGFyZSBwYXRoIGV4cHJlc3Npb25zIHdpdGgKKyAg
ICAgICAgICBmb3J3YXJkIHNsYXNoZXMgb24gV2luZG93cy4gSWYgcGF0aHMgaXMgZW1wdHksIHdl
IGxvb2sgYXQKKyAgICAgICAgICBldmVyeXRoaW5nIHVuZGVyIHRoZSBiYXNlX2Rpci4KKyAgICAi
IiIKKworICAgIGdsb2JhbCBfc2tpcHBlZF9kaXJlY3RvcmllcworICAgIHBhdGhzID0gcGF0aHMg
b3IgWycqJ10KKyAgICBza2lwcGVkX2RpcmVjdG9yaWVzID0gc2tpcHBlZF9kaXJlY3RvcmllcyBv
ciBzZXQoWycuc3ZuJywgJ19zdm4nXSkKKyAgICByZXR1cm4gX25vcm1hbGl6ZWRfZmluZChmaWxl
c3lzdGVtLCBfbm9ybWFsaXplKGZpbGVzeXN0ZW0sIGJhc2VfZGlyLCBwYXRocyksIHNraXBwZWRf
ZGlyZWN0b3JpZXMsIGZpbGVfZmlsdGVyKQorCisKK2RlZiBfbm9ybWFsaXplKGZpbGVzeXN0ZW0s
IGJhc2VfZGlyLCBwYXRocyk6CisgICAgcmV0dXJuIFtmaWxlc3lzdGVtLm5vcm1wYXRoKGZpbGVz
eXN0ZW0uam9pbihiYXNlX2RpciwgcGF0aCkpIGZvciBwYXRoIGluIHBhdGhzXQorCisKK2RlZiBf
bm9ybWFsaXplZF9maW5kKGZpbGVzeXN0ZW0sIHBhdGhzLCBza2lwcGVkX2RpcmVjdG9yaWVzLCBm
aWxlX2ZpbHRlcik6CisgICAgIiIiRmluZHMgdGhlIHNldCBvZiB0ZXN0cyB1bmRlciB0aGUgbGlz
dCBvZiBwYXRocy4KKworICAgIEFyZ3M6CisgICAgICBwYXRoczogYSBsaXN0IG9mIGFic29sdXRl
IHBhdGggZXhwcmVzc2lvbnMgdG8gc2VhcmNoLgorICAgICAgICAgIEdsb2IgcGF0dGVybnMgYXJl
IG9rLgorICAgICIiIgorICAgIGdhdGhlcl9zdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICBw
YXRoc190b193YWxrID0gc2V0KCkKKworICAgIGZvciBwYXRoIGluIHBhdGhzOgorICAgICAgICAj
IElmIHRoZXJlJ3MgYW4gKiBpbiB0aGUgbmFtZSwgYXNzdW1lIGl0J3MgYSBnbG9iIHBhdHRlcm4u
CisgICAgICAgIGlmIHBhdGguZmluZCgnKicpID4gLTE6CisgICAgICAgICAgICBmaWxlbmFtZXMg
PSBmaWxlc3lzdGVtLmdsb2IocGF0aCkKKyAgICAgICAgICAgIHBhdGhzX3RvX3dhbGsudXBkYXRl
KGZpbGVuYW1lcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGhzX3RvX3dhbGsuYWRk
KHBhdGgpCisKKyAgICAjIEZJWE1FOiBJJ20gbm90IHN1cmUgdGhlcmUncyBtdWNoIHBvaW50IGlu
IHRoaXMgYmVpbmcgYSBzZXQuIEEgbGlzdCB3b3VsZCBwcm9iYWJseSBiZSBmYXN0ZXIuCisgICAg
dGVzdF9maWxlcyA9IHNldCgpCisgICAgZm9yIHBhdGggaW4gcGF0aHNfdG9fd2FsazoKKyAgICAg
ICAgZmlsZXMgPSBmaWxlc3lzdGVtLmZpbGVzX3VuZGVyKHBhdGgsIHNraXBwZWRfZGlyZWN0b3Jp
ZXMsIGZpbGVfZmlsdGVyKQorICAgICAgICB0ZXN0X2ZpbGVzLnVwZGF0ZShzZXQoZmlsZXMpKQor
CisgICAgZ2F0aGVyX3RpbWUgPSB0aW1lLnRpbWUoKSAtIGdhdGhlcl9zdGFydF90aW1lCisgICAg
X2xvZy5kZWJ1ZygiVGVzdCBnYXRoZXJpbmcgdG9vayAlZiBzZWNvbmRzIiAlIGdhdGhlcl90aW1l
KQorCisgICAgcmV0dXJuIHRlc3RfZmlsZXMKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL3Rlc3RfZmlsZXNfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjEyNDM2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsNjQgQEAKKyMg
Q29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisj
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisjICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IHRlc3Rf
ZmlsZXMKKworCitjbGFzcyBNb2NrV2luRmlsZVN5c3RlbShvYmplY3QpOgorICAgIGRlZiBqb2lu
KHNlbGYsICpwYXRocyk6CisgICAgICAgIHJldHVybiAnXFwnLmpvaW4ocGF0aHMpCisKKyAgICBk
ZWYgbm9ybXBhdGgoc2VsZiwgcGF0aCk6CisgICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJy8n
LCAnXFwnKQorCisKK2NsYXNzIFRlc3RXaW5Ob3JtYWxpemUodW5pdHRlc3QuVGVzdENhc2UpOgor
ICAgIGRlZiBhc3NlcnRfZmlsZXN5c3RlbV9ub3JtYWxpemVzKHNlbGYsIGZpbGVzeXN0ZW0pOgor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0ZXN0X2ZpbGVzLl9ub3JtYWxpemUoZmlsZXN5c3Rl
bSwgImM6XFxmb28iLAorICAgICAgICAgICAgWydmYXN0L2h0bWwnLCAnZmFzdC9jYW52YXMvKics
ICdjb21wb3NpdGluZy9mb28uaHRtbCddKSwKKyAgICAgICAgICAgIFsnYzpcXGZvb1xcZmFzdFxo
dG1sJywgJ2M6XFxmb29cXGZhc3RcY2FudmFzXConLCAnYzpcXGZvb1xjb21wb3NpdGluZ1xcZm9v
Lmh0bWwnXSkKKworICAgIGRlZiB0ZXN0X21vY2tlZF93aW4oc2VsZik6CisgICAgICAgICMgVGhp
cyB0ZXN0cyB0ZXN0X2ZpbGVzLm5vcm1hbGl6ZSwgdXNpbmcgcG9ydGFibGUgYmVoYXZpb3IgZW11
bGF0aW5nCisgICAgICAgICMgd2hhdCB3ZSB0aGluayBXaW5kb3dzIGlzIHN1cHBvc2VkIHRvIGRv
LiBUaGlzIHRlc3Qgd2lsbCBydW4gb24gYWxsCisgICAgICAgICMgcGxhdGZvcm1zLgorICAgICAg
ICBzZWxmLmFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMoTW9ja1dpbkZpbGVTeXN0ZW0oKSkK
KworICAgIGRlZiB0ZXN0X3dpbihzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3RzIHRoZSBhY3R1
YWwgd2luZG93cyBwbGF0Zm9ybSwgdG8gZW5zdXJlIHdlIGdldCB0aGUgc2FtZQorICAgICAgICAj
IHJlc3VsdHMgdGhhdCB3ZSBnZXQgaW4gdGVzdF9tb2NrZWRfd2luKCkuCisgICAgICAgIGlmIHN5
cy5wbGF0Zm9ybSAhPSAnd2luJzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFz
c2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMoRmlsZVN5c3RlbSgpKQorCisKK2lmIF9fbmFtZV9f
ID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXMucHkgYi9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXMucHkKaW5kZXggYjhi
ODQxMy4uYWRhNjhiMyAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcG9ydC90ZXN0X2ZpbGVzLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlcy5weQpAQCAtMzYsNiArMzYsNyBAQCB1bmRlciB0aGF0
IGRpcmVjdG9yeS4iIiIKIAogaW1wb3J0IHRpbWUKIAorZnJvbSB3ZWJraXRweS5jb21tb24gaW1w
b3J0IHRlc3RfZmlsZXMKIGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbSBpbXBvcnQgbG9ndXRp
bHMKIAogCkBAIC01OCw0MyArNTksOCBAQCBkZWYgZmluZChwb3J0LCBwYXRocz1Ob25lKToKICAg
ICAgICAgICBmb3J3YXJkIHNsYXNoZXMgb24gV2luZG93cy4gSWYgcGF0aHMgaXMgZW1wdHksIHdl
IGxvb2sgYXQKICAgICAgICAgICBldmVyeXRoaW5nIHVuZGVyIHRoZSBsYXlvdXRfdGVzdHNfZGly
KCkuCiAgICAgIiIiCi0gICAgcGF0aHMgPSBwYXRocyBvciBbJyonXQotICAgIGZpbGVzeXN0ZW0g
PSBwb3J0Ll9maWxlc3lzdGVtCi0gICAgcmV0dXJuIG5vcm1hbGl6ZWRfZmluZChmaWxlc3lzdGVt
LCBub3JtYWxpemUoZmlsZXN5c3RlbSwgcG9ydC5sYXlvdXRfdGVzdHNfZGlyKCksIHBhdGhzKSkK
IAotCi1kZWYgbm9ybWFsaXplKGZpbGVzeXN0ZW0sIGJhc2VfZGlyLCBwYXRocyk6Ci0gICAgcmV0
dXJuIFtmaWxlc3lzdGVtLm5vcm1wYXRoKGZpbGVzeXN0ZW0uam9pbihiYXNlX2RpciwgcGF0aCkp
IGZvciBwYXRoIGluIHBhdGhzXQotCi0KLWRlZiBub3JtYWxpemVkX2ZpbmQoZmlsZXN5c3RlbSwg
cGF0aHMpOgotICAgICIiIkZpbmRzIHRoZSBzZXQgb2YgdGVzdHMgdW5kZXIgdGhlIGxpc3Qgb2Yg
cGF0aHMuCi0KLSAgICBBcmdzOgotICAgICAgcGF0aHM6IGEgbGlzdCBvZiBhYnNvbHV0ZSBwYXRo
IGV4cHJlc3Npb25zIHRvIHNlYXJjaC4KLSAgICAgICAgICBHbG9iIHBhdHRlcm5zIGFyZSBvay4K
LSAgICAiIiIKLSAgICBnYXRoZXJfc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCi0gICAgcGF0aHNf
dG9fd2FsayA9IHNldCgpCi0KLSAgICBmb3IgcGF0aCBpbiBwYXRoczoKLSAgICAgICAgIyBJZiB0
aGVyZSdzIGFuICogaW4gdGhlIG5hbWUsIGFzc3VtZSBpdCdzIGEgZ2xvYiBwYXR0ZXJuLgotICAg
ICAgICBpZiBwYXRoLmZpbmQoJyonKSA+IC0xOgotICAgICAgICAgICAgZmlsZW5hbWVzID0gZmls
ZXN5c3RlbS5nbG9iKHBhdGgpCi0gICAgICAgICAgICBwYXRoc190b193YWxrLnVwZGF0ZShmaWxl
bmFtZXMpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXRoc190b193YWxrLmFkZChwYXRo
KQotCi0gICAgIyBGSVhNRTogSSdtIG5vdCBzdXJlIHRoZXJlJ3MgbXVjaCBwb2ludCBpbiB0aGlz
IGJlaW5nIGEgc2V0LiBBIGxpc3Qgd291bGQgcHJvYmFibHkgYmUgZmFzdGVyLgotICAgIHRlc3Rf
ZmlsZXMgPSBzZXQoKQotICAgIGZvciBwYXRoIGluIHBhdGhzX3RvX3dhbGs6Ci0gICAgICAgIGZp
bGVzID0gZmlsZXN5c3RlbS5maWxlc191bmRlcihwYXRoLCBfc2tpcHBlZF9kaXJlY3Rvcmllcywg
X2lzX3Rlc3RfZmlsZSkKLSAgICAgICAgdGVzdF9maWxlcy51cGRhdGUoc2V0KGZpbGVzKSkKLQot
ICAgIGdhdGhlcl90aW1lID0gdGltZS50aW1lKCkgLSBnYXRoZXJfc3RhcnRfdGltZQotICAgIF9s
b2cuZGVidWcoIlRlc3QgZ2F0aGVyaW5nIHRvb2sgJWYgc2Vjb25kcyIgJSBnYXRoZXJfdGltZSkK
LQotICAgIHJldHVybiB0ZXN0X2ZpbGVzCisgICAgcmV0dXJuIHRlc3RfZmlsZXMuZmluZChwb3J0
LmZpbGVzeXN0ZW0sIHBvcnQubGF5b3V0X3Rlc3RzX2RpcigpLCBwYXRocywgX3NraXBwZWRfZGly
ZWN0b3JpZXMsIF9pc190ZXN0X2ZpbGUpCiAKIAogZGVmIF9oYXNfc3VwcG9ydGVkX2V4dGVuc2lv
bihmaWxlc3lzdGVtLCBmaWxlbmFtZSk6CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXNfdW5pdHRlc3QucHkgYi9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXNfdW5pdHRlc3QucHkKaW5k
ZXggYTI5YmE0OS4uNmU5Yjk3MSAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5CisrKyBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlc191bml0dGVzdC5weQpAQCAt
NjksMzMgKzY5LDUgQEAgY2xhc3MgVGVzdEZpbGVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAg
ICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGVzdF9maWxlcy5faXNfdGVzdF9maWxlKGZzLCAnJywg
J2Zvby1leHBlY3RlZC1taXNtYXRjaC5odG1sJykpCiAKIAotY2xhc3MgTW9ja1dpbkZpbGVTeXN0
ZW0ob2JqZWN0KToKLSAgICBkZWYgam9pbihzZWxmLCAqcGF0aHMpOgotICAgICAgICByZXR1cm4g
J1xcJy5qb2luKHBhdGhzKQotCi0gICAgZGVmIG5vcm1wYXRoKHNlbGYsIHBhdGgpOgotICAgICAg
ICByZXR1cm4gcGF0aC5yZXBsYWNlKCcvJywgJ1xcJykKLQotCi1jbGFzcyBUZXN0V2luTm9ybWFs
aXplKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFs
aXplcyhzZWxmLCBmaWxlc3lzdGVtKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGVzdF9m
aWxlcy5ub3JtYWxpemUoZmlsZXN5c3RlbSwgImM6XFxmb28iLAotICAgICAgICAgICAgWydmYXN0
L2h0bWwnLCAnZmFzdC9jYW52YXMvKicsICdjb21wb3NpdGluZy9mb28uaHRtbCddKSwKLSAgICAg
ICAgICAgIFsnYzpcXGZvb1xcZmFzdFxodG1sJywgJ2M6XFxmb29cXGZhc3RcY2FudmFzXConLCAn
YzpcXGZvb1xjb21wb3NpdGluZ1xcZm9vLmh0bWwnXSkKLQotICAgIGRlZiB0ZXN0X21vY2tlZF93
aW4oc2VsZik6Ci0gICAgICAgICMgVGhpcyB0ZXN0cyB0ZXN0X2ZpbGVzLm5vcm1hbGl6ZSwgdXNp
bmcgcG9ydGFibGUgYmVoYXZpb3IgZW11bGF0aW5nCi0gICAgICAgICMgd2hhdCB3ZSB0aGluayBX
aW5kb3dzIGlzIHN1cHBvc2VkIHRvIGRvLiBUaGlzIHRlc3Qgd2lsbCBydW4gb24gYWxsCi0gICAg
ICAgICMgcGxhdGZvcm1zLgotICAgICAgICBzZWxmLmFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6
ZXMoTW9ja1dpbkZpbGVTeXN0ZW0oKSkKLQotICAgIGRlZiB0ZXN0X3dpbihzZWxmKToKLSAgICAg
ICAgIyBUaGlzIHRlc3RzIHRoZSBhY3R1YWwgd2luZG93cyBwbGF0Zm9ybSwgdG8gZW5zdXJlIHdl
IGdldCB0aGUgc2FtZQotICAgICAgICAjIHJlc3VsdHMgdGhhdCB3ZSBnZXQgaW4gdGVzdF9tb2Nr
ZWRfd2luKCkuCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnd2luJzoKLSAgICAgICAgICAg
IHJldHVybgotICAgICAgICBzZWxmLmFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMoRmlsZVN5
c3RlbSgpKQotCi0KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFp
bigpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3Rz
L19faW5pdF9fLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0cy9f
X2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY1YmVlCi0t
LSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0
cy9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACisjIFJlcXVpcmVkIGZvciBQeXRob24gdG8gc2Vh
cmNoIHRoaXMgZGlyZWN0b3J5IGZvciBtb2R1bGUgZmlsZXMKZGlmZiAtLWdpdCBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcGVyZnRlc3RzcnVubmVyLnB5IGIvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0cy9wZXJmdGVzdHNydW5uZXIucHkK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllNzA1NAotLS0gL2Rldi9udWxs
CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcGVyZnRlc3Rz
cnVubmVyLnB5CkBAIC0wLDAgKzEsMTcwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29w
eXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
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
Q0ggREFNQUdFLgorCisiIiJSdW4gSW5zcGVjdG9yJ3MgcGVyZiB0ZXN0cyBpbiBwZXJmIG1vZGUu
IiIiCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCByZQoraW1wb3J0
IHN5cworCitmcm9tIHdlYmtpdHB5LmNvbW1vbiBpbXBvcnQgdGVzdF9maWxlcworZnJvbSB3ZWJr
aXRweS5jb21tb24uaG9zdCBpbXBvcnQgSG9zdAorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMu
cG9ydC5kcml2ZXIgaW1wb3J0IERyaXZlcklucHV0Citmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0
cy52aWV3cyBpbXBvcnQgcHJpbnRpbmcKKworX2xvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFt
ZV9fKQorCisKK2NsYXNzIFBlcmZUZXN0c1J1bm5lcihvYmplY3QpOgorICAgIF9wZXJmX3Rlc3Rz
X2Jhc2VfZGlyID0gJ1BlcmZvcm1hbmNlVGVzdHMnCisgICAgX3Jlc3VsdF9yZWdleCA9IHJlLmNv
bXBpbGUoJ15SRVNVTFQgLiokJykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwZXJmX3Rlc3Rz
X2RpciwgcmVndWxhcl9vdXRwdXQ9c3lzLnN0ZGVyciwgYnVpbGRib3Rfb3V0cHV0PXN5cy5zdGRv
dXQsIHBvcnQ9Tm9uZSwgYXJncz1Ob25lKToKKyAgICAgICAgc2VsZi5fcGVyZl90ZXN0c19kaXIg
PSBwZXJmX3Rlc3RzX2RpcgorICAgICAgICBzZWxmLl9idWlsZGJvdF9vdXRwdXQgPSBidWlsZGJv
dF9vdXRwdXQKKyAgICAgICAgc2VsZi5fb3B0aW9ucywgc2VsZi5fYXJncyA9IHNlbGYucGFyc2Vf
YXJncyhhcmdzKQorICAgICAgICBzZWxmLl9ob3N0ID0gSG9zdCgpCisgICAgICAgIHNlbGYuX2hv
c3QuX2luaXRpYWxpemVfc2NtKCkKKyAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQgb3Igc2VsZi5f
aG9zdC5wb3J0X2ZhY3RvcnkuZ2V0KHNlbGYuX29wdGlvbnMucGxhdGZvcm0sIHNlbGYuX29wdGlv
bnMpCisgICAgICAgIHNlbGYuX3ByaW50ZXIgPSBwcmludGluZy5QcmludGVyKHNlbGYuX3BvcnQs
IHNlbGYuX29wdGlvbnMsIHJlZ3VsYXJfb3V0cHV0LCBidWlsZGJvdF9vdXRwdXQsIGNvbmZpZ3Vy
ZV9sb2dnaW5nPUZhbHNlKQorICAgICAgICBzZWxmLl93ZWJraXRfYmFzZV9kaXJfbGVuID0gbGVu
KHNlbGYuX3BvcnQuY29uZmlnLndlYmtpdF9iYXNlX2RpcigpKQorCisgICAgZGVmIHBhcnNlX2Fy
Z3Moc2VsZiwgYXJncz1Ob25lKToKKyAgICAgICAgcHJpbnRfb3B0aW9ucyA9IHByaW50aW5nLnBy
aW50X29wdGlvbnMoKQorCisgICAgICAgIHBlcmZfb3B0aW9uX2xpc3QgPSBbCisgICAgICAgICAg
ICBvcHRwYXJzZS5tYWtlX29wdGlvbignLS1kZWJ1ZycsIGFjdGlvbj0nc3RvcmVfY29uc3QnLCBj
b25zdD0nRGVidWcnLCBkZXN0PSJjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGhlbHA9J1NldCB0aGUgY29uZmlndXJhdGlvbiB0byBEZWJ1ZycpLAorICAg
ICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oJy0tcmVsZWFzZScsIGFjdGlvbj0nc3RvcmVf
Y29uc3QnLCBjb25zdD0nUmVsZWFzZScsIGRlc3Q9ImNvbmZpZ3VyYXRpb24iLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU2V0IHRoZSBjb25maWd1cmF0aW9uIHRvIFJl
bGVhc2UnKSwKKyAgICAgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItLXBsYXRmb3JtIiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNwZWNpZnkgcG9ydC9wbGF0
Zm9ybSBiZWluZyB0ZXN0ZWQgKGkuZS4gY2hyb21pdW0tbWFjKSIpLAorICAgICAgICAgICAgb3B0
cGFyc2UubWFrZV9vcHRpb24oIi0tYnVpbGQtZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGhlbHA9IlBhdGggdG8gdGhlIGRpcmVjdG9yeSB1bmRlciB3aGljaCBi
dWlsZCBmaWxlcyBhcmUga2VwdCAoc2hvdWxkIG5vdCBpbmNsdWRlIGNvbmZpZ3VyYXRpb24pIiks
CisgICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS10aW1lLW91dC1tcyIsIGRlZmF1
bHQ9MzAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTZXQgdGhl
IHRpbWVvdXQgZm9yIGVhY2ggdGVzdCIpLAorICAgICAgICAgICAgXQorCisgICAgICAgIG9wdGlv
bl9saXN0ID0gKHBlcmZfb3B0aW9uX2xpc3QgKyBwcmludF9vcHRpb25zKQorICAgICAgICByZXR1
cm4gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbl9saXN0KS5wYXJzZV9h
cmdzKGFyZ3MpCisKKyAgICBkZWYgX2NvbGxlY3RfdGVzdHMoc2VsZik6CisgICAgICAgICIiIlJl
dHVybiB0aGUgbGlzdCBvZiB0ZXN0cyBmb3VuZC4iIiIKKworICAgICAgICBkZWYgX2lzX3Rlc3Rf
ZmlsZShmaWxlc3lzdGVtLCBkaXJuYW1lLCBmaWxlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4g
ZmlsZW5hbWUuZW5kc3dpdGgoJy5odG1sJykKKworICAgICAgICBmaWxlc3lzdGVtID0gc2VsZi5f
aG9zdC5maWxlc3lzdGVtCisgICAgICAgIHJldHVybiB0ZXN0X2ZpbGVzLmZpbmQoZmlsZXN5c3Rl
bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wb3J0LnBhdGhfZnJvbV93
ZWJraXRfYmFzZShmaWxlc3lzdGVtLmpvaW4oc2VsZi5fcGVyZl90ZXN0c19iYXNlX2Rpciwgc2Vs
Zi5fcGVyZl90ZXN0c19kaXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRo
cz1zZWxmLl9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZmlsdGVy
PV9pc190ZXN0X2ZpbGUpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9v
cHRpb25zLmhlbHBfcHJpbnRpbmc6CisgICAgICAgICAgICBzZWxmLl9wcmludGVyLmhlbHBfcHJp
bnRpbmcoKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRlci5jbGVhbnVwKCkKKyAgICAgICAgICAg
IHJldHVybiAwCisKKyAgICAgICAgaWYgbm90IHNlbGYuX3BvcnQuY2hlY2tfYnVpbGQobmVlZHNf
aHR0cD1GYWxzZSk6CisgICAgICAgICAgICBfbG9nLmVycm9yKCJCdWlsZCBub3QgdXAgdG8gZGF0
ZSBmb3IgJXMiICUgc2VsZi5fcG9ydC5fcGF0aF90b19kcml2ZXIoKSkKKyAgICAgICAgICAgIHJl
dHVybiAtMQorCisgICAgICAgICMgV2Ugd3JhcCBhbnkgcGFydHMgb2YgdGhlIHJ1biB0aGF0IGFy
ZSBzbG93IG9yIGxpa2VseSB0byByYWlzZSBleGNlcHRpb25zCisgICAgICAgICMgaW4gYSB0cnkv
ZmluYWxseSB0byBlbnN1cmUgdGhhdCB3ZSBjbGVhbiB1cCB0aGUgbG9nZ2luZyBjb25maWd1cmF0
aW9uLgorICAgICAgICB1bmV4cGVjdGVkID0gLTEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAg
dGVzdHMgPSBzZWxmLl9jb2xsZWN0X3Rlc3RzKCkKKyAgICAgICAgICAgIHVuZXhwZWN0ZWQgPSBz
ZWxmLl9ydW5fdGVzdHNfc2V0KHRlc3RzLCBzZWxmLl9wb3J0KQorICAgICAgICBmaW5hbGx5Ogor
ICAgICAgICAgICAgc2VsZi5fcHJpbnRlci5jbGVhbnVwKCkKKworICAgICAgICByZXR1cm4gdW5l
eHBlY3RlZAorCisgICAgZGVmIF9ydW5fdGVzdHNfc2V0KHNlbGYsIHRlc3RzLCBwb3J0KToKKyAg
ICAgICAgcmVzdWx0X2NvdW50ID0gbGVuKHRlc3RzKQorICAgICAgICBleHBlY3RlZCA9IDAKKyAg
ICAgICAgdW5leHBlY3RlZCA9IDAKKyAgICAgICAgc2VsZi5fcHJpbnRlci5wcmludF9vbmVfbGlu
ZV9zdW1tYXJ5KHJlc3VsdF9jb3VudCwgMCwgMCkKKyAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFy
dCA9IEZhbHNlCisgICAgICAgIGRyaXZlciA9IE5vbmUKKworICAgICAgICBmb3IgdGVzdCBpbiB0
ZXN0czoKKyAgICAgICAgICAgIGlmIGRyaXZlcl9uZWVkX3Jlc3RhcnQ6CisgICAgICAgICAgICAg
ICAgX2xvZy5kZWJ1ZygiJXMga2lsbGluZyBkcml2ZXIiICUgdGVzdCkKKyAgICAgICAgICAgICAg
ICBkcml2ZXIuc3RvcCgpCisgICAgICAgICAgICAgICAgZHJpdmVyID0gTm9uZQorICAgICAgICAg
ICAgaWYgbm90IGRyaXZlcjoKKyAgICAgICAgICAgICAgICBkcml2ZXIgPSBwb3J0LmNyZWF0ZV9k
cml2ZXIod29ya2VyX251bWJlcj0xKQorCisgICAgICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVy
X25lZWRfcmVzdGFydCA9IHNlbGYuX3J1bl9zaW5nbGVfdGVzdCh0ZXN0LCBkcml2ZXIpCisgICAg
ICAgICAgICBpZiB0ZXN0X2ZhaWxlZDoKKyAgICAgICAgICAgICAgICB1bmV4cGVjdGVkID0gdW5l
eHBlY3RlZCArIDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQg
PSBleHBlY3RlZCArIDEKKworICAgICAgICAgICAgc2VsZi5fcHJpbnRlci5wcmludF9vbmVfbGlu
ZV9zdW1tYXJ5KHJlc3VsdF9jb3VudCwgZXhwZWN0ZWQsIHVuZXhwZWN0ZWQpCisKKyAgICAgICAg
aWYgZHJpdmVyOgorICAgICAgICAgICAgZHJpdmVyLnN0b3AoKQorCisgICAgICAgIHJldHVybiB1
bmV4cGVjdGVkCisKKyAgICBkZWYgX3J1bl9zaW5nbGVfdGVzdChzZWxmLCB0ZXN0LCBkcml2ZXIp
OgorICAgICAgICB0ZXN0X2ZhaWxlZCA9IEZhbHNlCisgICAgICAgIGRyaXZlcl9uZWVkX3Jlc3Rh
cnQgPSBGYWxzZQorICAgICAgICBvdXRwdXQgPSBkcml2ZXIucnVuX3Rlc3QoRHJpdmVySW5wdXQo
dGVzdCwgc2VsZi5fb3B0aW9ucy50aW1lX291dF9tcywgTm9uZSwgRmFsc2UpKQorCisgICAgICAg
IGlmIG91dHB1dC50ZXh0ID09IE5vbmU6CisgICAgICAgICAgICB0ZXN0X2ZhaWxlZCA9IFRydWUK
KyAgICAgICAgZWxpZiBvdXRwdXQudGltZW91dDoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50ZXIu
d3JpdGUoJ3RpbWVvdXQ6ICVzJyAlIHRlc3Rbc2VsZi5fd2Via2l0X2Jhc2VfZGlyX2xlbiArIDE6
XSkKKyAgICAgICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorICAgICAgICAgICAgZHJpdmVyX25l
ZWRfcmVzdGFydCA9IFRydWUKKyAgICAgICAgZWxpZiBvdXRwdXQuY3Jhc2g6CisgICAgICAgICAg
ICBzZWxmLl9wcmludGVyLndyaXRlKCdjcmFzaDogJXMnICUgdGVzdFtzZWxmLl93ZWJraXRfYmFz
ZV9kaXJfbGVuICsgMTpdKQorICAgICAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFydCA9IFRydWUK
KyAgICAgICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAg
ICAgZ290X2FfcmVzdWx0ID0gRmFsc2UKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHJlLnNwbGl0
KCdcbicsIG91dHB1dC50ZXh0KToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9yZXN1bHRfcmVn
ZXgubWF0Y2gobGluZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2J1aWxkYm90X291dHB1
dC53cml0ZSgiJXNcbiIgJSBsaW5lKQorICAgICAgICAgICAgICAgICAgICBnb3RfYV9yZXN1bHQg
PSBUcnVlCisgICAgICAgICAgICAgICAgZWxpZiBub3QgbGVuKGxpbmUpID09IDA6CisgICAgICAg
ICAgICAgICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBzZWxm
Ll9wcmludGVyLndyaXRlKCIlcyIgJSBsaW5lKQorICAgICAgICAgICAgdGVzdF9mYWlsZWQgPSB0
ZXN0X2ZhaWxlZCBvciBub3QgZ290X2FfcmVzdWx0CisKKyAgICAgICAgaWYgbGVuKG91dHB1dC5l
cnJvcik6CisgICAgICAgICAgICBzZWxmLl9wcmludGVyLndyaXRlKCdlcnJvcjpcbiVzJyAlIG91
dHB1dC5lcnJvcikKKyAgICAgICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorCisgICAgICAgIHJl
dHVybiB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydApkaWZmIC0tZ2l0IGEvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0cy9wZXJmdGVzdHNydW5uZXJfdW5pdHRl
c3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3BlcmZ0ZXN0
c3J1bm5lcl91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4x
YzI2MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3Jt
YW5jZV90ZXN0cy9wZXJmdGVzdHNydW5uZXJfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMzAgQEAK
KyMhL3Vzci9iaW4vcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6
CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJ
bmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0cyBmb3Ig
cnVuX3BlcmZfdGVzdHMuIiIiCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHdlYmtpdHB5LmNv
bW1vbiBpbXBvcnQgYXJyYXlfc3RyZWFtCitmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0
LmRyaXZlciBpbXBvcnQgRHJpdmVySW5wdXQsIERyaXZlck91dHB1dAorZnJvbSB3ZWJraXRweS5s
YXlvdXRfdGVzdHMucG9ydC50ZXN0IGltcG9ydCB1bml0X3Rlc3RfZmlsZXN5c3RlbQorZnJvbSB3
ZWJraXRweS5sYXlvdXRfdGVzdHMudmlld3MgaW1wb3J0IHByaW50aW5nCitmcm9tIHdlYmtpdHB5
LnBlcmZvcm1hbmNlX3Rlc3RzLnBlcmZ0ZXN0c3J1bm5lciBpbXBvcnQgUGVyZlRlc3RzUnVubmVy
CisKKworY2xhc3MgTWFpblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNyZWF0
ZV9kcml2ZXIoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3REcml2ZXI6CisKKyAgICAgICAgICAg
IGRlZiBydW5fdGVzdChzZWxmLCBkcml2ZXJfaW5wdXQpOgorICAgICAgICAgICAgICAgIHRleHQg
PSAnJworICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGNy
YXNoID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBkcml2ZXJfaW5wdXQudGVzdF9uYW1lID09
ICdwYXNzLmh0bWwnOgorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ1JFU1VMVCBncm91cF9u
YW1lOiB0ZXN0X25hbWU9IDQyIG1zJworICAgICAgICAgICAgICAgIGVsaWYgZHJpdmVyX2lucHV0
LnRlc3RfbmFtZSA9PSAndGltZW91dC5odG1sJzoKKyAgICAgICAgICAgICAgICAgICAgdGltZW91
dCA9IFRydWUKKyAgICAgICAgICAgICAgICBlbGlmIGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0g
J2ZhaWxlZC5odG1sJzoKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IE5vbmUKKyAgICAgICAg
ICAgICAgICBlbGlmIGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0gJ3Rvbmd1ZXkuaHRtbCc6Cisg
ICAgICAgICAgICAgICAgICAgIHRleHQgPSAnd2UgYXJlIG5vdCBleHBlY3RpbmcgYW4gb3V0cHV0
IGZyb20gcGVyZiB0ZXN0cyBidXQgUkVTVUxUIGJsYWJsYWJsYScKKyAgICAgICAgICAgICAgICBl
bGlmIGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0gJ2NyYXNoLmh0bWwnOgorICAgICAgICAgICAg
ICAgICAgICBjcmFzaCA9IFRydWUKKyAgICAgICAgICAgICAgICByZXR1cm4gRHJpdmVyT3V0cHV0
KHRleHQsICcnLCAnJywgJycsIGNyYXNoPWNyYXNoLCB0aW1lb3V0PXRpbWVvdXQpCisKKyAgICAg
ICAgICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICAgICAgICAgICIiImRvIG5vdGhpbmciIiIK
KworICAgICAgICByZXR1cm4gVGVzdERyaXZlcigpCisKKyAgICBkZWYgY3JlYXRlX3BvcnQoc2Vs
Zik6CisgICAgICAgIGNsYXNzIFRlc3RQb3J0OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNl
bGYsIHRlc3RfY2FzZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fdGVzdF9jYXNlID0gdGVzdF9j
YXNlCisKKyAgICAgICAgICAgIGRlZiBjcmVhdGVfZHJpdmVyKHNlbGYsIHdvcmtlcl9udW1iZXI9
Tm9uZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Rlc3RfY2FzZS5jcmVhdGVfZHJp
dmVyKCkKKworICAgICAgICByZXR1cm4gVGVzdFBvcnQoc2VsZikKKworICAgIGRlZiBjcmVhdGVf
cnVubmVyKHNlbGYsIGJ1aWxkYm90X291dHB1dD1Ob25lKToKKyAgICAgICAgYnVpbGRib3Rfb3V0
cHV0ID0gYnVpbGRib3Rfb3V0cHV0IG9yIGFycmF5X3N0cmVhbS5BcnJheVN0cmVhbSgpCisgICAg
ICAgIHJlZ3VsYXJfb3V0cHV0ID0gYXJyYXlfc3RyZWFtLkFycmF5U3RyZWFtKCkKKyAgICAgICAg
cmV0dXJuIFBlcmZUZXN0c1J1bm5lcignJywgcmVndWxhcl9vdXRwdXQsIGJ1aWxkYm90X291dHB1
dCkKKworICAgIGRlZiBydW5fdGVzdChzZWxmLCB0ZXN0X25hbWUpOgorICAgICAgICBydW5uZXIg
PSBzZWxmLmNyZWF0ZV9ydW5uZXIoKQorICAgICAgICBkcml2ZXIgPSBzZWxmLmNyZWF0ZV9kcml2
ZXIoKQorICAgICAgICByZXR1cm4gcnVubmVyLl9ydW5fc2luZ2xlX3Rlc3QodGVzdF9uYW1lLCBk
cml2ZXIpCisKKyAgICBkZWYgdGVzdF9ydW5fcGFzc2luZ190ZXN0KHNlbGYpOgorICAgICAgICB0
ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNlbGYucnVuX3Rlc3QoJ3Bhc3MuaHRt
bCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGVzdF9mYWlsZWQpCisgICAgICAgIHNlbGYu
YXNzZXJ0RmFsc2UoZHJpdmVyX25lZWRfcmVzdGFydCkKKworICAgIGRlZiB0ZXN0X3J1bl9zaWxl
bnRfdGVzdChzZWxmKToKKyAgICAgICAgdGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQg
PSBzZWxmLnJ1bl90ZXN0KCdzaWxlbnQuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0
ZXN0X2ZhaWxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkcml2ZXJfbmVlZF9yZXN0YXJ0
KQorCisgICAgZGVmIHRlc3RfcnVuX2ZhaWxlZF90ZXN0KHNlbGYpOgorICAgICAgICB0ZXN0X2Zh
aWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNlbGYucnVuX3Rlc3QoJ2ZhaWxlZC5odG1sJykK
KyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RfZmFpbGVkKQorICAgICAgICBzZWxmLmFzc2Vy
dEZhbHNlKGRyaXZlcl9uZWVkX3Jlc3RhcnQpCisKKyAgICBkZWYgdGVzdF9ydW5fdG9uZ3VleV90
ZXN0KHNlbGYpOgorICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNl
bGYucnVuX3Rlc3QoJ3Rvbmd1ZXkuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXN0
X2ZhaWxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkcml2ZXJfbmVlZF9yZXN0YXJ0KQor
CisgICAgZGVmIHRlc3RfcnVuX3RpbWVvdXRfdGVzdChzZWxmKToKKyAgICAgICAgdGVzdF9mYWls
ZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBzZWxmLnJ1bl90ZXN0KCd0aW1lb3V0Lmh0bWwnKQor
ICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdF9mYWlsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0
VHJ1ZShkcml2ZXJfbmVlZF9yZXN0YXJ0KQorCisgICAgZGVmIHRlc3RfcnVuX2NyYXNoX3Rlc3Qo
c2VsZik6CisgICAgICAgIHRlc3RfZmFpbGVkLCBkcml2ZXJfbmVlZF9yZXN0YXJ0ID0gc2VsZi5y
dW5fdGVzdCgnY3Jhc2guaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXN0X2ZhaWxl
ZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRyaXZlcl9uZWVkX3Jlc3RhcnQpCisKKyAgICBk
ZWYgdGVzdF9ydW5fdGVzdF9zZXQoc2VsZik6CisgICAgICAgIGJ1aWxkYm90X291dHB1dCA9IGFy
cmF5X3N0cmVhbS5BcnJheVN0cmVhbSgpCisgICAgICAgIHJ1bm5lciA9IHNlbGYuY3JlYXRlX3J1
bm5lcihidWlsZGJvdF9vdXRwdXQpCisgICAgICAgIGRyaXZlciA9IHNlbGYuY3JlYXRlX2RyaXZl
cigpCisgICAgICAgIHBvcnQgPSBzZWxmLmNyZWF0ZV9wb3J0KCkKKyAgICAgICAgdGVzdHMgPSBb
J3Bhc3MuaHRtbCcsICdzaWxlbnQuaHRtbCcsICdmYWlsZWQuaHRtbCcsICd0b25ndWV5Lmh0bWwn
LCAndGltZW91dC5odG1sJywgJ2NyYXNoLmh0bWwnXQorICAgICAgICB1bmV4cGVjdGVkX3Jlc3Vs
dF9jb3VudCA9IHJ1bm5lci5fcnVuX3Rlc3RzX3NldCh0ZXN0cywgcG9ydCkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbCh1bmV4cGVjdGVkX3Jlc3VsdF9jb3VudCwgbGVuKHRlc3RzKSAtIDEpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJ1aWxkYm90X291dHB1dC5nZXQoKSksIDEpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVpbGRib3Rfb3V0cHV0LmdldCgpWzBdLCAnUkVTVUxU
IGdyb3VwX25hbWU6IHRlc3RfbmFtZT0gNDIgbXNcbicpCisKKworaWYgX19uYW1lX18gPT0gJ19f
bWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkK
</data>
<flag name="review"
          id="116066"
          type_id="1"
          status="-"
          setter="dpranke"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116910</attachid>
            <date>2011-11-29 00:32:48 -0800</date>
            <delta_ts>2011-11-30 05:15:46 -0800</delta_ts>
            <desc>[patch] next iteration.</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>30066</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCBhZjQz
M2Q4Li5iZmU2OTZhIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsNjMgQEAKKzIwMTEtMTEtMjkgIElseWEgVGlraG9ub3Zza3kgIDxs
b2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYiBJbnNwZWN0b3I6IGNocm9taXVtOiBJ
J2QgbGlrZSB0byBhZGQgYSBzY3JpcHQgZm9yIHJ1bm5pbmcgcGVyZiB0ZXN0cyBmb3IgV2ViSW5z
cGVjdG9yLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NzMwNzkKKworICAgICAgICBUaGUgaWRlYSBpcyB0byBoYXZlIHBlcmZvcm1hbmNlIHRlc3RzIGZv
ciBXZWJJbnNwZWN0b3IuCisgICAgICAgIEkgd2FzIHN1Z2dlc3RlZCB0byBwdXQgdGhlc2UgdGVz
dHMgaW50byBQZXJmb3JtYW5jZVRlc3RzL2luc3BlY3Rvci4KKyAgICAgICAgVGhleSBwcm9kdWNl
IG91dHB1dCBpbiBhIGZvcm1hdCB0aGF0IGlzIHN1aXRhYmxlIGZvciBjaHJvbWl1bSBwZXJmIGJv
dCBkcmF3aW5nIHNjcmlwdHMuCisKKyAgICAgICAgSSdkIGxpa2UgdG8gcmV1c2UgY29kZSBmb3Ig
c2Nhbm5pbmcgZm9sZGVycyBmb3IgdGVzdCBmaWxlcy4KKyAgICAgICAgQmVjYXVzZSBvZiB0aGUg
ZmFjdCB0aGF0IG9yaWdpbmFsIHRlc3RfZmlsZXMucHkgaGFzIGNvbW1vbiBhbmQgbGF5b3V0IHNw
ZWNpZmljIHBhcnRzCisgICAgICAgIEkgZGVjaWRlZCB0byBleHRyYWN0IHRoZSBnZW5lcmljIHBh
cnQgYW5kIHB1dCBpdCBpbnRvIHdlYmtpdHB5L2NvbW1vbgorICAgICAgICBJIHRoaW5rIHRoZSB0
d28gcGFja2FnZXMgd2l0aCBuYW1lIHRlc3RfZmlsZXMgbG9vayBzdHJhbmdlIGJ1dCBJIGhhdmUg
bm8gaWRlYSBhYm91dCBhIGJldHRlciBuYW1lLgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgICogU2NyaXB0cy9ydW4taW5zcGVjdG9yLXBlcmYtdGVzdHMu
cHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL2ZpbmRfZmlsZXMu
cHk6IENvcGllZCBmcm9tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQv
dGVzdF9maWxlcy5weS4KKyAgICAgICAgKGZpbmQpOgorICAgICAgICAoX25vcm1hbGl6ZSk6Cisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vZmluZF9maWxlc191bml0dGVzdC5weTog
QWRkZWQuCisgICAgICAgIChNb2NrV2luRmlsZVN5c3RlbS5qb2luKToKKyAgICAgICAgKE1vY2tX
aW5GaWxlU3lzdGVtKToKKyAgICAgICAgKE1vY2tXaW5GaWxlU3lzdGVtLm5vcm1wYXRoKToKKyAg
ICAgICAgKFRlc3RXaW5Ob3JtYWxpemUuYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyk6Cisg
ICAgICAgIChUZXN0V2luTm9ybWFsaXplLnRlc3RfbW9ja2VkX3dpbik6CisgICAgICAgIChUZXN0
V2luTm9ybWFsaXplKToKKyAgICAgICAgKFRlc3RXaW5Ob3JtYWxpemUudGVzdF93aW4pOgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlcy5weToK
KyAgICAgICAgKGZpbmQpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvdGVzdF9maWxlc191bml0dGVzdC5weToKKyAgICAgICAgKFRlc3RGaWxlc1Rlc3QudGVz
dF9pc190ZXN0X2ZpbGUpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2Vf
dGVzdHMvX19pbml0X18ucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVy
Zm9ybWFuY2VfdGVzdHMvcGVyZnRlc3RzcnVubmVyLnB5OiBBZGRlZC4KKyAgICAgICAgKFBlcmZU
ZXN0c1J1bm5lci5fX2luaXRfXyk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIucGFyc2VfYXJn
cyk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX2NvbGxlY3RfdGVzdHMuX2lzX3Rlc3RfZmls
ZSk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX2NvbGxlY3RfdGVzdHMpOgorICAgICAgICAo
UGVyZlRlc3RzUnVubmVyLnJ1bik6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX3J1bl90ZXN0
c19zZXQpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcGVy
ZnRlc3RzcnVubmVyX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKE1haW5UZXN0LmNyZWF0
ZV9kcml2ZXIuVGVzdERyaXZlci5ydW5fdGVzdCk6CisgICAgICAgIChNYWluVGVzdC5jcmVhdGVf
ZHJpdmVyLlRlc3REcml2ZXIpOgorICAgICAgICAoTWFpblRlc3QuY3JlYXRlX2RyaXZlci5UZXN0
RHJpdmVyLnN0b3ApOgorICAgICAgICAoTWFpblRlc3QuY3JlYXRlX2RyaXZlcik6CisgICAgICAg
IChNYWluVGVzdC5jcmVhdGVfcG9ydC5UZXN0UG9ydC5fX2luaXRfXyk6CisgICAgICAgIChNYWlu
VGVzdC5jcmVhdGVfcG9ydC5UZXN0UG9ydCk6CisgICAgICAgIChNYWluVGVzdC5jcmVhdGVfcG9y
dC5UZXN0UG9ydC5jcmVhdGVfZHJpdmVyKToKKyAgICAgICAgKE1haW5UZXN0LmNyZWF0ZV9wb3J0
KToKKyAgICAgICAgKE1haW5UZXN0LmNyZWF0ZV9ydW5uZXIpOgorICAgICAgICAoTWFpblRlc3Qu
cnVuX3Rlc3QpOgorICAgICAgICAoTWFpblRlc3QudGVzdF9ydW5fcGFzc2luZ190ZXN0KToKKyAg
ICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX3NpbGVudF90ZXN0KToKKyAgICAgICAgKE1haW5UZXN0
LnRlc3RfcnVuX2ZhaWxlZF90ZXN0KToKKyAgICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX3Rvbmd1
ZXlfdGVzdCk6CisgICAgICAgIChNYWluVGVzdC50ZXN0X3J1bl90aW1lb3V0X3Rlc3QpOgorICAg
ICAgICAoTWFpblRlc3QudGVzdF9ydW5fY3Jhc2hfdGVzdCk6CisgICAgICAgIChNYWluVGVzdCk6
CisgICAgICAgIChNYWluVGVzdC50ZXN0X3J1bl90ZXN0X3NldCk6CisKIDIwMTEtMTEtMjggIENz
YWJhIE9zenRyb2dvbsOhYyAgPG9zc3lAd2Via2l0Lm9yZz4KIAogICAgICAgICBbUXRdW1dLMl0g
VW5yZXZpZXdlZCBidWlsZGZpeCBhZnRlciByMTAxMzA3LgpkaWZmIC0tZ2l0IGEvVG9vbHMvU2Ny
aXB0cy9ydW4taW5zcGVjdG9yLXBlcmYtdGVzdHMucHkgYi9Ub29scy9TY3JpcHRzL3J1bi1pbnNw
ZWN0b3ItcGVyZi10ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5k
MTU3ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy9ydW4taW5zcGVjdG9yLXBl
cmYtdGVzdHMucHkKQEAgLTAsMCArMSw0MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENv
cHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAg
ICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRz
CisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMg
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKworIiIiUnVuIEluc3BlY3RvcidzIHBlcmYgdGVzdHMgaW4gcGVyZiBtb2Rl
LiIiIgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworCitmcm9tIHdlYmtpdHB5LnBlcmZv
cm1hbmNlX3Rlc3RzLnBlcmZ0ZXN0c3J1bm5lciBpbXBvcnQgUGVyZlRlc3RzUnVubmVyCisKK19w
ZXJmX3Rlc3RzX2RpciA9ICdpbnNwZWN0b3InCitfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19u
YW1lX18pCisKK2lmICdfX21haW5fXycgPT0gX19uYW1lX186CisgICAgbG9nZ2luZy5iYXNpY0Nv
bmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1hdD0iJShtZXNzYWdlKXMiKQorICAgIHN5cy5l
eGl0KFBlcmZUZXN0c1J1bm5lcihfcGVyZl90ZXN0c19kaXIpLnJ1bigpKQpkaWZmIC0tZ2l0IGEv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vZmluZF9maWxlcy5weSBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL2ZpbmRfZmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uNjY1YmNjYwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL2ZpbmRfZmlsZXMucHkKQEAgLTAsMCArMSwxMDIgQEAKKyMhL3Vzci9iaW4v
ZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRp
c3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3Ig
dGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlRoaXMgbW9kdWxlIGlzIHVzZWQgdG8g
ZmluZCBmaWxlcyB1c2VkIGJ5IHJ1bi13ZWJraXQtdGVzdHMgYW5kCitwZXJmdGVzdHJ1bm5lci4g
SXQgZXhwb3NlcyBvbmUgcHVibGljIGZ1bmN0aW9uIC0gZmluZCgpIC0gd2hpY2ggdGFrZXMKK2Fu
IG9wdGlvbmFsIGxpc3Qgb2YgcGF0aHMsIG9wdGlvbmFsIHNldCBvZiBza2lwcGVkIGRpcmVjdG9y
aWVzIGFuZCBvcHRpb25hbAorZmlsdGVyIGNhbGxiYWNrLgorCitJZiBhIGxpc3QgaXMgcGFzc2Vk
IGluLCB0aGUgcmV0dXJuZWQgbGlzdCBvZiBmaWxlcyBpcyBjb25zdHJhaW5lZCB0byB0aG9zZQor
Zm91bmQgdW5kZXIgdGhlIHBhdGhzIHBhc3NlZCBpbi4gaS5lLiBjYWxsaW5nIGZpbmQoWyJMYXlv
dXRUZXN0cy9mYXN0Il0pCit3aWxsIG9ubHkgcmV0dXJuIGZpbGVzIHVuZGVyIHRoYXQgZGlyZWN0
b3J5LgorCitJZiBhIHNldCBvZiBza2lwcGVkIGRpcmVjdG9yaWVzIGlzIHBhc3NlZCBpbiwgdGhl
IGZ1bmN0aW9uIHdpbGwgZmlsdGVyIG91dAordGhlIGZpbGVzIGx5aW5nIGluIHRoZXNlIGRpcmVj
dG9yaWVzIGkuZS4gZmluZChbIkxheW91dFRlc3RzIl0sIHNldChbImZhc3QiXSkpCit3aWxsIHJl
dHVybiBldmVyeXRoaW5nIGV4Y2VwdCBmaWxlcyBpbiBmYXN0IHN1YmZvbGRlci4KKworSWYgYSBj
YWxsYmFjayBpcyBwYXNzZWQgaW4sIGl0IHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgZWFjaCBmaWxl
IGFuZCB0aGUgZmlsZQord2lsbCBiZSBpbmNsdWRlZCBpbnRvIHRoZSByZXN1bHQgaWYgdGhlIGNh
bGxiYWNrIHJldHVybnMgVHJ1ZS4KK1RoZSBjYWxsYmFjayBoYXMgdG8gdGFrZSB0aHJlZSBhcmd1
bWVudHM6IGZpbGVzeXN0ZW0sIGRpcm5hbWUgYW5kIGZpbGVuYW1lLiIiIgorCitpbXBvcnQgdGlt
ZQorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0gaW1wb3J0IGxvZ3V0aWxzCisKKworX2xv
ZyA9IGxvZ3V0aWxzLmdldF9sb2dnZXIoX19maWxlX18pCisKKworZGVmIGZpbmQoZmlsZXN5c3Rl
bSwgYmFzZV9kaXIsIHBhdGhzPU5vbmUsIHNraXBwZWRfZGlyZWN0b3JpZXM9Tm9uZSwgZmlsZV9m
aWx0ZXI9Tm9uZSk6CisgICAgIiIiRmluZHMgdGhlIHNldCBvZiB0ZXN0cyB1bmRlciBhIGdpdmVu
IGxpc3Qgb2Ygc3ViLXBhdGhzLgorCisgICAgQXJnczoKKyAgICAgIHBhdGhzOiBhIGxpc3Qgb2Yg
cGF0aCBleHByZXNzaW9ucyByZWxhdGl2ZSB0byBiYXNlX2RpcgorICAgICAgICAgIHRvIHNlYXJj
aC4gR2xvYiBwYXR0ZXJucyBhcmUgb2ssIGFzIGFyZSBwYXRoIGV4cHJlc3Npb25zIHdpdGgKKyAg
ICAgICAgICBmb3J3YXJkIHNsYXNoZXMgb24gV2luZG93cy4gSWYgcGF0aHMgaXMgZW1wdHksIHdl
IGxvb2sgYXQKKyAgICAgICAgICBldmVyeXRoaW5nIHVuZGVyIHRoZSBiYXNlX2Rpci4KKyAgICAi
IiIKKworICAgIGdsb2JhbCBfc2tpcHBlZF9kaXJlY3RvcmllcworICAgIHBhdGhzID0gcGF0aHMg
b3IgWycqJ10KKyAgICBza2lwcGVkX2RpcmVjdG9yaWVzID0gc2tpcHBlZF9kaXJlY3RvcmllcyBv
ciBzZXQoWycuc3ZuJywgJ19zdm4nXSkKKyAgICByZXR1cm4gX25vcm1hbGl6ZWRfZmluZChmaWxl
c3lzdGVtLCBfbm9ybWFsaXplKGZpbGVzeXN0ZW0sIGJhc2VfZGlyLCBwYXRocyksIHNraXBwZWRf
ZGlyZWN0b3JpZXMsIGZpbGVfZmlsdGVyKQorCisKK2RlZiBfbm9ybWFsaXplKGZpbGVzeXN0ZW0s
IGJhc2VfZGlyLCBwYXRocyk6CisgICAgcmV0dXJuIFtmaWxlc3lzdGVtLm5vcm1wYXRoKGZpbGVz
eXN0ZW0uam9pbihiYXNlX2RpciwgcGF0aCkpIGZvciBwYXRoIGluIHBhdGhzXQorCisKK2RlZiBf
bm9ybWFsaXplZF9maW5kKGZpbGVzeXN0ZW0sIHBhdGhzLCBza2lwcGVkX2RpcmVjdG9yaWVzLCBm
aWxlX2ZpbHRlcik6CisgICAgIiIiRmluZHMgdGhlIHNldCBvZiB0ZXN0cyB1bmRlciB0aGUgbGlz
dCBvZiBwYXRocy4KKworICAgIEFyZ3M6CisgICAgICBwYXRoczogYSBsaXN0IG9mIGFic29sdXRl
IHBhdGggZXhwcmVzc2lvbnMgdG8gc2VhcmNoLgorICAgICAgICAgIEdsb2IgcGF0dGVybnMgYXJl
IG9rLgorICAgICIiIgorICAgIGdhdGhlcl9zdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICBw
YXRoc190b193YWxrID0gc2V0KCkKKworICAgIGZvciBwYXRoIGluIHBhdGhzOgorICAgICAgICAj
IElmIHRoZXJlJ3MgYW4gKiBpbiB0aGUgbmFtZSwgYXNzdW1lIGl0J3MgYSBnbG9iIHBhdHRlcm4u
CisgICAgICAgIGlmIHBhdGguZmluZCgnKicpID4gLTE6CisgICAgICAgICAgICBmaWxlbmFtZXMg
PSBmaWxlc3lzdGVtLmdsb2IocGF0aCkKKyAgICAgICAgICAgIHBhdGhzX3RvX3dhbGsudXBkYXRl
KGZpbGVuYW1lcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGhzX3RvX3dhbGsuYWRk
KHBhdGgpCisKKyAgICAjIEZJWE1FOiBJJ20gbm90IHN1cmUgdGhlcmUncyBtdWNoIHBvaW50IGlu
IHRoaXMgYmVpbmcgYSBzZXQuIEEgbGlzdCB3b3VsZCBwcm9iYWJseSBiZSBmYXN0ZXIuCisgICAg
YWxsX2ZpbGVzID0gc2V0KCkKKyAgICBmb3IgcGF0aCBpbiBwYXRoc190b193YWxrOgorICAgICAg
ICBmaWxlcyA9IGZpbGVzeXN0ZW0uZmlsZXNfdW5kZXIocGF0aCwgc2tpcHBlZF9kaXJlY3Rvcmll
cywgZmlsZV9maWx0ZXIpCisgICAgICAgIGFsbF9maWxlcy51cGRhdGUoc2V0KGZpbGVzKSkKKwor
ICAgIGdhdGhlcl90aW1lID0gdGltZS50aW1lKCkgLSBnYXRoZXJfc3RhcnRfdGltZQorICAgIF9s
b2cuZGVidWcoIlRlc3QgZ2F0aGVyaW5nIHRvb2sgJWYgc2Vjb25kcyIgJSBnYXRoZXJfdGltZSkK
KworICAgIHJldHVybiBhbGxfZmlsZXMKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL2ZpbmRfZmlsZXNfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9maW5kX2ZpbGVzX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLmI5MDY4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9maW5kX2ZpbGVzX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsNjQgQEAKKyMgQ29w
eXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisjICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAq
IE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMg
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IGZpbmRfZmls
ZXMKKworCitjbGFzcyBNb2NrV2luRmlsZVN5c3RlbShvYmplY3QpOgorICAgIGRlZiBqb2luKHNl
bGYsICpwYXRocyk6CisgICAgICAgIHJldHVybiAnXFwnLmpvaW4ocGF0aHMpCisKKyAgICBkZWYg
bm9ybXBhdGgoc2VsZiwgcGF0aCk6CisgICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJy8nLCAn
XFwnKQorCisKK2NsYXNzIFRlc3RXaW5Ob3JtYWxpemUodW5pdHRlc3QuVGVzdENhc2UpOgorICAg
IGRlZiBhc3NlcnRfZmlsZXN5c3RlbV9ub3JtYWxpemVzKHNlbGYsIGZpbGVzeXN0ZW0pOgorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscyhmaW5kX2ZpbGVzLl9ub3JtYWxpemUoZmlsZXN5c3RlbSwg
ImM6XFxmb28iLAorICAgICAgICAgICAgWydmYXN0L2h0bWwnLCAnZmFzdC9jYW52YXMvKicsICdj
b21wb3NpdGluZy9mb28uaHRtbCddKSwKKyAgICAgICAgICAgIFsnYzpcXGZvb1xcZmFzdFxodG1s
JywgJ2M6XFxmb29cXGZhc3RcY2FudmFzXConLCAnYzpcXGZvb1xjb21wb3NpdGluZ1xcZm9vLmh0
bWwnXSkKKworICAgIGRlZiB0ZXN0X21vY2tlZF93aW4oc2VsZik6CisgICAgICAgICMgVGhpcyB0
ZXN0cyB0ZXN0X2ZpbGVzLm5vcm1hbGl6ZSwgdXNpbmcgcG9ydGFibGUgYmVoYXZpb3IgZW11bGF0
aW5nCisgICAgICAgICMgd2hhdCB3ZSB0aGluayBXaW5kb3dzIGlzIHN1cHBvc2VkIHRvIGRvLiBU
aGlzIHRlc3Qgd2lsbCBydW4gb24gYWxsCisgICAgICAgICMgcGxhdGZvcm1zLgorICAgICAgICBz
ZWxmLmFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMoTW9ja1dpbkZpbGVTeXN0ZW0oKSkKKwor
ICAgIGRlZiB0ZXN0X3dpbihzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3RzIHRoZSBhY3R1YWwg
d2luZG93cyBwbGF0Zm9ybSwgdG8gZW5zdXJlIHdlIGdldCB0aGUgc2FtZQorICAgICAgICAjIHJl
c3VsdHMgdGhhdCB3ZSBnZXQgaW4gdGVzdF9tb2NrZWRfd2luKCkuCisgICAgICAgIGlmIHN5cy5w
bGF0Zm9ybSAhPSAnd2luJzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFzc2Vy
dF9maWxlc3lzdGVtX25vcm1hbGl6ZXMoRmlsZVN5c3RlbSgpKQorCisKK2lmIF9fbmFtZV9fID09
ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXMucHkgYi9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXMucHkKaW5kZXggYjhiODQx
My4uNDliODU3NCAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcG9ydC90ZXN0X2ZpbGVzLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3BvcnQvdGVzdF9maWxlcy5weQpAQCAtMzYsNiArMzYsNyBAQCB1bmRlciB0aGF0IGRp
cmVjdG9yeS4iIiIKIAogaW1wb3J0IHRpbWUKIAorZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0
IGZpbmRfZmlsZXMKIGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbSBpbXBvcnQgbG9ndXRpbHMK
IAogCkBAIC01OCw0MyArNTksOCBAQCBkZWYgZmluZChwb3J0LCBwYXRocz1Ob25lKToKICAgICAg
ICAgICBmb3J3YXJkIHNsYXNoZXMgb24gV2luZG93cy4gSWYgcGF0aHMgaXMgZW1wdHksIHdlIGxv
b2sgYXQKICAgICAgICAgICBldmVyeXRoaW5nIHVuZGVyIHRoZSBsYXlvdXRfdGVzdHNfZGlyKCku
CiAgICAgIiIiCi0gICAgcGF0aHMgPSBwYXRocyBvciBbJyonXQotICAgIGZpbGVzeXN0ZW0gPSBw
b3J0Ll9maWxlc3lzdGVtCi0gICAgcmV0dXJuIG5vcm1hbGl6ZWRfZmluZChmaWxlc3lzdGVtLCBu
b3JtYWxpemUoZmlsZXN5c3RlbSwgcG9ydC5sYXlvdXRfdGVzdHNfZGlyKCksIHBhdGhzKSkKIAot
Ci1kZWYgbm9ybWFsaXplKGZpbGVzeXN0ZW0sIGJhc2VfZGlyLCBwYXRocyk6Ci0gICAgcmV0dXJu
IFtmaWxlc3lzdGVtLm5vcm1wYXRoKGZpbGVzeXN0ZW0uam9pbihiYXNlX2RpciwgcGF0aCkpIGZv
ciBwYXRoIGluIHBhdGhzXQotCi0KLWRlZiBub3JtYWxpemVkX2ZpbmQoZmlsZXN5c3RlbSwgcGF0
aHMpOgotICAgICIiIkZpbmRzIHRoZSBzZXQgb2YgdGVzdHMgdW5kZXIgdGhlIGxpc3Qgb2YgcGF0
aHMuCi0KLSAgICBBcmdzOgotICAgICAgcGF0aHM6IGEgbGlzdCBvZiBhYnNvbHV0ZSBwYXRoIGV4
cHJlc3Npb25zIHRvIHNlYXJjaC4KLSAgICAgICAgICBHbG9iIHBhdHRlcm5zIGFyZSBvay4KLSAg
ICAiIiIKLSAgICBnYXRoZXJfc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCi0gICAgcGF0aHNfdG9f
d2FsayA9IHNldCgpCi0KLSAgICBmb3IgcGF0aCBpbiBwYXRoczoKLSAgICAgICAgIyBJZiB0aGVy
ZSdzIGFuICogaW4gdGhlIG5hbWUsIGFzc3VtZSBpdCdzIGEgZ2xvYiBwYXR0ZXJuLgotICAgICAg
ICBpZiBwYXRoLmZpbmQoJyonKSA+IC0xOgotICAgICAgICAgICAgZmlsZW5hbWVzID0gZmlsZXN5
c3RlbS5nbG9iKHBhdGgpCi0gICAgICAgICAgICBwYXRoc190b193YWxrLnVwZGF0ZShmaWxlbmFt
ZXMpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXRoc190b193YWxrLmFkZChwYXRoKQot
Ci0gICAgIyBGSVhNRTogSSdtIG5vdCBzdXJlIHRoZXJlJ3MgbXVjaCBwb2ludCBpbiB0aGlzIGJl
aW5nIGEgc2V0LiBBIGxpc3Qgd291bGQgcHJvYmFibHkgYmUgZmFzdGVyLgotICAgIHRlc3RfZmls
ZXMgPSBzZXQoKQotICAgIGZvciBwYXRoIGluIHBhdGhzX3RvX3dhbGs6Ci0gICAgICAgIGZpbGVz
ID0gZmlsZXN5c3RlbS5maWxlc191bmRlcihwYXRoLCBfc2tpcHBlZF9kaXJlY3RvcmllcywgX2lz
X3Rlc3RfZmlsZSkKLSAgICAgICAgdGVzdF9maWxlcy51cGRhdGUoc2V0KGZpbGVzKSkKLQotICAg
IGdhdGhlcl90aW1lID0gdGltZS50aW1lKCkgLSBnYXRoZXJfc3RhcnRfdGltZQotICAgIF9sb2cu
ZGVidWcoIlRlc3QgZ2F0aGVyaW5nIHRvb2sgJWYgc2Vjb25kcyIgJSBnYXRoZXJfdGltZSkKLQot
ICAgIHJldHVybiB0ZXN0X2ZpbGVzCisgICAgcmV0dXJuIGZpbmRfZmlsZXMuZmluZChwb3J0LmZp
bGVzeXN0ZW0sIHBvcnQubGF5b3V0X3Rlc3RzX2RpcigpLCBwYXRocywgX3NraXBwZWRfZGlyZWN0
b3JpZXMsIF9pc190ZXN0X2ZpbGUpCiAKIAogZGVmIF9oYXNfc3VwcG9ydGVkX2V4dGVuc2lvbihm
aWxlc3lzdGVtLCBmaWxlbmFtZSk6CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXNfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3RfZmlsZXNfdW5pdHRlc3QucHkKaW5kZXgg
YTI5YmE0OS4uNmU5Yjk3MSAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlc191bml0dGVzdC5weQpAQCAtNjks
MzMgKzY5LDUgQEAgY2xhc3MgVGVzdEZpbGVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAg
ICAgIHNlbGYuYXNzZXJ0RmFsc2UodGVzdF9maWxlcy5faXNfdGVzdF9maWxlKGZzLCAnJywgJ2Zv
by1leHBlY3RlZC1taXNtYXRjaC5odG1sJykpCiAKIAotY2xhc3MgTW9ja1dpbkZpbGVTeXN0ZW0o
b2JqZWN0KToKLSAgICBkZWYgam9pbihzZWxmLCAqcGF0aHMpOgotICAgICAgICByZXR1cm4gJ1xc
Jy5qb2luKHBhdGhzKQotCi0gICAgZGVmIG5vcm1wYXRoKHNlbGYsIHBhdGgpOgotICAgICAgICBy
ZXR1cm4gcGF0aC5yZXBsYWNlKCcvJywgJ1xcJykKLQotCi1jbGFzcyBUZXN0V2luTm9ybWFsaXpl
KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXpl
cyhzZWxmLCBmaWxlc3lzdGVtKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGVzdF9maWxl
cy5ub3JtYWxpemUoZmlsZXN5c3RlbSwgImM6XFxmb28iLAotICAgICAgICAgICAgWydmYXN0L2h0
bWwnLCAnZmFzdC9jYW52YXMvKicsICdjb21wb3NpdGluZy9mb28uaHRtbCddKSwKLSAgICAgICAg
ICAgIFsnYzpcXGZvb1xcZmFzdFxodG1sJywgJ2M6XFxmb29cXGZhc3RcY2FudmFzXConLCAnYzpc
XGZvb1xjb21wb3NpdGluZ1xcZm9vLmh0bWwnXSkKLQotICAgIGRlZiB0ZXN0X21vY2tlZF93aW4o
c2VsZik6Ci0gICAgICAgICMgVGhpcyB0ZXN0cyB0ZXN0X2ZpbGVzLm5vcm1hbGl6ZSwgdXNpbmcg
cG9ydGFibGUgYmVoYXZpb3IgZW11bGF0aW5nCi0gICAgICAgICMgd2hhdCB3ZSB0aGluayBXaW5k
b3dzIGlzIHN1cHBvc2VkIHRvIGRvLiBUaGlzIHRlc3Qgd2lsbCBydW4gb24gYWxsCi0gICAgICAg
ICMgcGxhdGZvcm1zLgotICAgICAgICBzZWxmLmFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMo
TW9ja1dpbkZpbGVTeXN0ZW0oKSkKLQotICAgIGRlZiB0ZXN0X3dpbihzZWxmKToKLSAgICAgICAg
IyBUaGlzIHRlc3RzIHRoZSBhY3R1YWwgd2luZG93cyBwbGF0Zm9ybSwgdG8gZW5zdXJlIHdlIGdl
dCB0aGUgc2FtZQotICAgICAgICAjIHJlc3VsdHMgdGhhdCB3ZSBnZXQgaW4gdGVzdF9tb2NrZWRf
d2luKCkuCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnd2luJzoKLSAgICAgICAgICAgIHJl
dHVybgotICAgICAgICBzZWxmLmFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMoRmlsZVN5c3Rl
bSgpKQotCi0KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigp
CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL19f
aW5pdF9fLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0cy9fX2lu
aXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY1YmVlCi0tLSAv
ZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0cy9f
X2luaXRfXy5weQpAQCAtMCwwICsxIEBACisjIFJlcXVpcmVkIGZvciBQeXRob24gdG8gc2VhcmNo
IHRoaXMgZGlyZWN0b3J5IGZvciBtb2R1bGUgZmlsZXMKZGlmZiAtLWdpdCBhL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcGVyZnRlc3RzcnVubmVyLnB5IGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0cy9wZXJmdGVzdHNydW5uZXIucHkKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1NDJlZAotLS0gL2Rldi9udWxsCisr
KyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcGVyZnRlc3RzcnVu
bmVyLnB5CkBAIC0wLDAgKzEsMTcwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJp
Z2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
IyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAq
IE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMg
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorCisiIiJSdW4gSW5zcGVjdG9yJ3MgcGVyZiB0ZXN0cyBpbiBwZXJmIG1vZGUuIiIi
CisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCByZQoraW1wb3J0IHN5
cworCitmcm9tIHdlYmtpdHB5LmNvbW1vbiBpbXBvcnQgZmluZF9maWxlcworZnJvbSB3ZWJraXRw
eS5jb21tb24uaG9zdCBpbXBvcnQgSG9zdAorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9y
dC5kcml2ZXIgaW1wb3J0IERyaXZlcklucHV0Citmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy52
aWV3cyBpbXBvcnQgcHJpbnRpbmcKKworX2xvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9f
KQorCisKK2NsYXNzIFBlcmZUZXN0c1J1bm5lcihvYmplY3QpOgorICAgIF9wZXJmX3Rlc3RzX2Jh
c2VfZGlyID0gJ1BlcmZvcm1hbmNlVGVzdHMnCisgICAgX3Jlc3VsdF9yZWdleCA9IHJlLmNvbXBp
bGUoJ15SRVNVTFQgLiokJykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwZXJmX3Rlc3RzX2Rp
ciwgcmVndWxhcl9vdXRwdXQ9c3lzLnN0ZGVyciwgYnVpbGRib3Rfb3V0cHV0PXN5cy5zdGRvdXQs
IHBvcnQ9Tm9uZSwgYXJncz1Ob25lKToKKyAgICAgICAgc2VsZi5fcGVyZl90ZXN0c19kaXIgPSBw
ZXJmX3Rlc3RzX2RpcgorICAgICAgICBzZWxmLl9idWlsZGJvdF9vdXRwdXQgPSBidWlsZGJvdF9v
dXRwdXQKKyAgICAgICAgc2VsZi5fb3B0aW9ucywgc2VsZi5fYXJncyA9IHNlbGYucGFyc2VfYXJn
cyhhcmdzKQorICAgICAgICBzZWxmLl9ob3N0ID0gSG9zdCgpCisgICAgICAgIHNlbGYuX2hvc3Qu
X2luaXRpYWxpemVfc2NtKCkKKyAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQgb3Igc2VsZi5faG9z
dC5wb3J0X2ZhY3RvcnkuZ2V0KHNlbGYuX29wdGlvbnMucGxhdGZvcm0sIHNlbGYuX29wdGlvbnMp
CisgICAgICAgIHNlbGYuX3ByaW50ZXIgPSBwcmludGluZy5QcmludGVyKHNlbGYuX3BvcnQsIHNl
bGYuX29wdGlvbnMsIHJlZ3VsYXJfb3V0cHV0LCBidWlsZGJvdF9vdXRwdXQsIGNvbmZpZ3VyZV9s
b2dnaW5nPUZhbHNlKQorICAgICAgICBzZWxmLl93ZWJraXRfYmFzZV9kaXJfbGVuID0gbGVuKHNl
bGYuX3BvcnQuY29uZmlnLndlYmtpdF9iYXNlX2RpcigpKQorCisgICAgZGVmIHBhcnNlX2FyZ3Mo
c2VsZiwgYXJncz1Ob25lKToKKyAgICAgICAgcHJpbnRfb3B0aW9ucyA9IHByaW50aW5nLnByaW50
X29wdGlvbnMoKQorCisgICAgICAgIHBlcmZfb3B0aW9uX2xpc3QgPSBbCisgICAgICAgICAgICBv
cHRwYXJzZS5tYWtlX29wdGlvbignLS1kZWJ1ZycsIGFjdGlvbj0nc3RvcmVfY29uc3QnLCBjb25z
dD0nRGVidWcnLCBkZXN0PSJjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGhlbHA9J1NldCB0aGUgY29uZmlndXJhdGlvbiB0byBEZWJ1ZycpLAorICAgICAg
ICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oJy0tcmVsZWFzZScsIGFjdGlvbj0nc3RvcmVfY29u
c3QnLCBjb25zdD0nUmVsZWFzZScsIGRlc3Q9ImNvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaGVscD0nU2V0IHRoZSBjb25maWd1cmF0aW9uIHRvIFJlbGVh
c2UnKSwKKyAgICAgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItLXBsYXRmb3JtIiwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNwZWNpZnkgcG9ydC9wbGF0Zm9y
bSBiZWluZyB0ZXN0ZWQgKGkuZS4gY2hyb21pdW0tbWFjKSIpLAorICAgICAgICAgICAgb3B0cGFy
c2UubWFrZV9vcHRpb24oIi0tYnVpbGQtZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGhlbHA9IlBhdGggdG8gdGhlIGRpcmVjdG9yeSB1bmRlciB3aGljaCBidWls
ZCBmaWxlcyBhcmUga2VwdCAoc2hvdWxkIG5vdCBpbmNsdWRlIGNvbmZpZ3VyYXRpb24pIiksCisg
ICAgICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS10aW1lLW91dC1tcyIsIGRlZmF1bHQ9
MzAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTZXQgdGhlIHRp
bWVvdXQgZm9yIGVhY2ggdGVzdCIpLAorICAgICAgICAgICAgXQorCisgICAgICAgIG9wdGlvbl9s
aXN0ID0gKHBlcmZfb3B0aW9uX2xpc3QgKyBwcmludF9vcHRpb25zKQorICAgICAgICByZXR1cm4g
b3B0cGFyc2UuT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbl9saXN0KS5wYXJzZV9hcmdz
KGFyZ3MpCisKKyAgICBkZWYgX2NvbGxlY3RfdGVzdHMoc2VsZik6CisgICAgICAgICIiIlJldHVy
biB0aGUgbGlzdCBvZiB0ZXN0cyBmb3VuZC4iIiIKKworICAgICAgICBkZWYgX2lzX3Rlc3RfZmls
ZShmaWxlc3lzdGVtLCBkaXJuYW1lLCBmaWxlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gZmls
ZW5hbWUuZW5kc3dpdGgoJy5odG1sJykKKworICAgICAgICBmaWxlc3lzdGVtID0gc2VsZi5faG9z
dC5maWxlc3lzdGVtCisgICAgICAgIHJldHVybiB0ZXN0X2ZpbGVzLmZpbmQoZmlsZXN5c3RlbSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wb3J0LnBhdGhfZnJvbV93ZWJr
aXRfYmFzZShmaWxlc3lzdGVtLmpvaW4oc2VsZi5fcGVyZl90ZXN0c19iYXNlX2Rpciwgc2VsZi5f
cGVyZl90ZXN0c19kaXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocz1z
ZWxmLl9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZmlsdGVyPV9p
c190ZXN0X2ZpbGUpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9vcHRp
b25zLmhlbHBfcHJpbnRpbmc6CisgICAgICAgICAgICBzZWxmLl9wcmludGVyLmhlbHBfcHJpbnRp
bmcoKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRlci5jbGVhbnVwKCkKKyAgICAgICAgICAgIHJl
dHVybiAwCisKKyAgICAgICAgaWYgbm90IHNlbGYuX3BvcnQuY2hlY2tfYnVpbGQobmVlZHNfaHR0
cD1GYWxzZSk6CisgICAgICAgICAgICBfbG9nLmVycm9yKCJCdWlsZCBub3QgdXAgdG8gZGF0ZSBm
b3IgJXMiICUgc2VsZi5fcG9ydC5fcGF0aF90b19kcml2ZXIoKSkKKyAgICAgICAgICAgIHJldHVy
biAtMQorCisgICAgICAgICMgV2Ugd3JhcCBhbnkgcGFydHMgb2YgdGhlIHJ1biB0aGF0IGFyZSBz
bG93IG9yIGxpa2VseSB0byByYWlzZSBleGNlcHRpb25zCisgICAgICAgICMgaW4gYSB0cnkvZmlu
YWxseSB0byBlbnN1cmUgdGhhdCB3ZSBjbGVhbiB1cCB0aGUgbG9nZ2luZyBjb25maWd1cmF0aW9u
LgorICAgICAgICB1bmV4cGVjdGVkID0gLTEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVz
dHMgPSBzZWxmLl9jb2xsZWN0X3Rlc3RzKCkKKyAgICAgICAgICAgIHVuZXhwZWN0ZWQgPSBzZWxm
Ll9ydW5fdGVzdHNfc2V0KHRlc3RzLCBzZWxmLl9wb3J0KQorICAgICAgICBmaW5hbGx5OgorICAg
ICAgICAgICAgc2VsZi5fcHJpbnRlci5jbGVhbnVwKCkKKworICAgICAgICByZXR1cm4gdW5leHBl
Y3RlZAorCisgICAgZGVmIF9ydW5fdGVzdHNfc2V0KHNlbGYsIHRlc3RzLCBwb3J0KToKKyAgICAg
ICAgcmVzdWx0X2NvdW50ID0gbGVuKHRlc3RzKQorICAgICAgICBleHBlY3RlZCA9IDAKKyAgICAg
ICAgdW5leHBlY3RlZCA9IDAKKyAgICAgICAgc2VsZi5fcHJpbnRlci5wcmludF9vbmVfbGluZV9z
dW1tYXJ5KHJlc3VsdF9jb3VudCwgMCwgMCkKKyAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFydCA9
IEZhbHNlCisgICAgICAgIGRyaXZlciA9IE5vbmUKKworICAgICAgICBmb3IgdGVzdCBpbiB0ZXN0
czoKKyAgICAgICAgICAgIGlmIGRyaXZlcl9uZWVkX3Jlc3RhcnQ6CisgICAgICAgICAgICAgICAg
X2xvZy5kZWJ1ZygiJXMga2lsbGluZyBkcml2ZXIiICUgdGVzdCkKKyAgICAgICAgICAgICAgICBk
cml2ZXIuc3RvcCgpCisgICAgICAgICAgICAgICAgZHJpdmVyID0gTm9uZQorICAgICAgICAgICAg
aWYgbm90IGRyaXZlcjoKKyAgICAgICAgICAgICAgICBkcml2ZXIgPSBwb3J0LmNyZWF0ZV9kcml2
ZXIod29ya2VyX251bWJlcj0xKQorCisgICAgICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25l
ZWRfcmVzdGFydCA9IHNlbGYuX3J1bl9zaW5nbGVfdGVzdCh0ZXN0LCBkcml2ZXIpCisgICAgICAg
ICAgICBpZiB0ZXN0X2ZhaWxlZDoKKyAgICAgICAgICAgICAgICB1bmV4cGVjdGVkID0gdW5leHBl
Y3RlZCArIDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBl
eHBlY3RlZCArIDEKKworICAgICAgICAgICAgc2VsZi5fcHJpbnRlci5wcmludF9vbmVfbGluZV9z
dW1tYXJ5KHJlc3VsdF9jb3VudCwgZXhwZWN0ZWQsIHVuZXhwZWN0ZWQpCisKKyAgICAgICAgaWYg
ZHJpdmVyOgorICAgICAgICAgICAgZHJpdmVyLnN0b3AoKQorCisgICAgICAgIHJldHVybiB1bmV4
cGVjdGVkCisKKyAgICBkZWYgX3J1bl9zaW5nbGVfdGVzdChzZWxmLCB0ZXN0LCBkcml2ZXIpOgor
ICAgICAgICB0ZXN0X2ZhaWxlZCA9IEZhbHNlCisgICAgICAgIGRyaXZlcl9uZWVkX3Jlc3RhcnQg
PSBGYWxzZQorICAgICAgICBvdXRwdXQgPSBkcml2ZXIucnVuX3Rlc3QoRHJpdmVySW5wdXQodGVz
dCwgc2VsZi5fb3B0aW9ucy50aW1lX291dF9tcywgTm9uZSwgRmFsc2UpKQorCisgICAgICAgIGlm
IG91dHB1dC50ZXh0ID09IE5vbmU6CisgICAgICAgICAgICB0ZXN0X2ZhaWxlZCA9IFRydWUKKyAg
ICAgICAgZWxpZiBvdXRwdXQudGltZW91dDoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50ZXIud3Jp
dGUoJ3RpbWVvdXQ6ICVzJyAlIHRlc3Rbc2VsZi5fd2Via2l0X2Jhc2VfZGlyX2xlbiArIDE6XSkK
KyAgICAgICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorICAgICAgICAgICAgZHJpdmVyX25lZWRf
cmVzdGFydCA9IFRydWUKKyAgICAgICAgZWxpZiBvdXRwdXQuY3Jhc2g6CisgICAgICAgICAgICBz
ZWxmLl9wcmludGVyLndyaXRlKCdjcmFzaDogJXMnICUgdGVzdFtzZWxmLl93ZWJraXRfYmFzZV9k
aXJfbGVuICsgMTpdKQorICAgICAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFydCA9IFRydWUKKyAg
ICAgICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAg
Z290X2FfcmVzdWx0ID0gRmFsc2UKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHJlLnNwbGl0KCdc
bicsIG91dHB1dC50ZXh0KToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9yZXN1bHRfcmVnZXgu
bWF0Y2gobGluZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2J1aWxkYm90X291dHB1dC53
cml0ZSgiJXNcbiIgJSBsaW5lKQorICAgICAgICAgICAgICAgICAgICBnb3RfYV9yZXN1bHQgPSBU
cnVlCisgICAgICAgICAgICAgICAgZWxpZiBub3QgbGVuKGxpbmUpID09IDA6CisgICAgICAgICAg
ICAgICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9w
cmludGVyLndyaXRlKCIlcyIgJSBsaW5lKQorICAgICAgICAgICAgdGVzdF9mYWlsZWQgPSB0ZXN0
X2ZhaWxlZCBvciBub3QgZ290X2FfcmVzdWx0CisKKyAgICAgICAgaWYgbGVuKG91dHB1dC5lcnJv
cik6CisgICAgICAgICAgICBzZWxmLl9wcmludGVyLndyaXRlKCdlcnJvcjpcbiVzJyAlIG91dHB1
dC5lcnJvcikKKyAgICAgICAgICAgIHRlc3RfZmFpbGVkID0gVHJ1ZQorCisgICAgICAgIHJldHVy
biB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydApkaWZmIC0tZ2l0IGEvVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0cy9wZXJmdGVzdHNydW5uZXJfdW5pdHRlc3Qu
cHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3BlcmZ0ZXN0c3J1
bm5lcl91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzI2
MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5j
ZV90ZXN0cy9wZXJmdGVzdHNydW5uZXJfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMzAgQEAKKyMh
L3Vzci9iaW4vcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6Cisj
CisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK
KyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0cyBmb3IgcnVu
X3BlcmZfdGVzdHMuIiIiCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHdlYmtpdHB5LmNvbW1v
biBpbXBvcnQgYXJyYXlfc3RyZWFtCitmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0LmRy
aXZlciBpbXBvcnQgRHJpdmVySW5wdXQsIERyaXZlck91dHB1dAorZnJvbSB3ZWJraXRweS5sYXlv
dXRfdGVzdHMucG9ydC50ZXN0IGltcG9ydCB1bml0X3Rlc3RfZmlsZXN5c3RlbQorZnJvbSB3ZWJr
aXRweS5sYXlvdXRfdGVzdHMudmlld3MgaW1wb3J0IHByaW50aW5nCitmcm9tIHdlYmtpdHB5LnBl
cmZvcm1hbmNlX3Rlc3RzLnBlcmZ0ZXN0c3J1bm5lciBpbXBvcnQgUGVyZlRlc3RzUnVubmVyCisK
KworY2xhc3MgTWFpblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNyZWF0ZV9k
cml2ZXIoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3REcml2ZXI6CisKKyAgICAgICAgICAgIGRl
ZiBydW5fdGVzdChzZWxmLCBkcml2ZXJfaW5wdXQpOgorICAgICAgICAgICAgICAgIHRleHQgPSAn
JworICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGNyYXNo
ID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBkcml2ZXJfaW5wdXQudGVzdF9uYW1lID09ICdw
YXNzLmh0bWwnOgorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ1JFU1VMVCBncm91cF9uYW1l
OiB0ZXN0X25hbWU9IDQyIG1zJworICAgICAgICAgICAgICAgIGVsaWYgZHJpdmVyX2lucHV0LnRl
c3RfbmFtZSA9PSAndGltZW91dC5odG1sJzoKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9
IFRydWUKKyAgICAgICAgICAgICAgICBlbGlmIGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0gJ2Zh
aWxlZC5odG1sJzoKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IE5vbmUKKyAgICAgICAgICAg
ICAgICBlbGlmIGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0gJ3Rvbmd1ZXkuaHRtbCc6CisgICAg
ICAgICAgICAgICAgICAgIHRleHQgPSAnd2UgYXJlIG5vdCBleHBlY3RpbmcgYW4gb3V0cHV0IGZy
b20gcGVyZiB0ZXN0cyBidXQgUkVTVUxUIGJsYWJsYWJsYScKKyAgICAgICAgICAgICAgICBlbGlm
IGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0gJ2NyYXNoLmh0bWwnOgorICAgICAgICAgICAgICAg
ICAgICBjcmFzaCA9IFRydWUKKyAgICAgICAgICAgICAgICByZXR1cm4gRHJpdmVyT3V0cHV0KHRl
eHQsICcnLCAnJywgJycsIGNyYXNoPWNyYXNoLCB0aW1lb3V0PXRpbWVvdXQpCisKKyAgICAgICAg
ICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICAgICAgICAgICIiImRvIG5vdGhpbmciIiIKKwor
ICAgICAgICByZXR1cm4gVGVzdERyaXZlcigpCisKKyAgICBkZWYgY3JlYXRlX3BvcnQoc2VsZik6
CisgICAgICAgIGNsYXNzIFRlc3RQb3J0OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYs
IHRlc3RfY2FzZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fdGVzdF9jYXNlID0gdGVzdF9jYXNl
CisKKyAgICAgICAgICAgIGRlZiBjcmVhdGVfZHJpdmVyKHNlbGYsIHdvcmtlcl9udW1iZXI9Tm9u
ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Rlc3RfY2FzZS5jcmVhdGVfZHJpdmVy
KCkKKworICAgICAgICByZXR1cm4gVGVzdFBvcnQoc2VsZikKKworICAgIGRlZiBjcmVhdGVfcnVu
bmVyKHNlbGYsIGJ1aWxkYm90X291dHB1dD1Ob25lKToKKyAgICAgICAgYnVpbGRib3Rfb3V0cHV0
ID0gYnVpbGRib3Rfb3V0cHV0IG9yIGFycmF5X3N0cmVhbS5BcnJheVN0cmVhbSgpCisgICAgICAg
IHJlZ3VsYXJfb3V0cHV0ID0gYXJyYXlfc3RyZWFtLkFycmF5U3RyZWFtKCkKKyAgICAgICAgcmV0
dXJuIFBlcmZUZXN0c1J1bm5lcignJywgcmVndWxhcl9vdXRwdXQsIGJ1aWxkYm90X291dHB1dCkK
KworICAgIGRlZiBydW5fdGVzdChzZWxmLCB0ZXN0X25hbWUpOgorICAgICAgICBydW5uZXIgPSBz
ZWxmLmNyZWF0ZV9ydW5uZXIoKQorICAgICAgICBkcml2ZXIgPSBzZWxmLmNyZWF0ZV9kcml2ZXIo
KQorICAgICAgICByZXR1cm4gcnVubmVyLl9ydW5fc2luZ2xlX3Rlc3QodGVzdF9uYW1lLCBkcml2
ZXIpCisKKyAgICBkZWYgdGVzdF9ydW5fcGFzc2luZ190ZXN0KHNlbGYpOgorICAgICAgICB0ZXN0
X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNlbGYucnVuX3Rlc3QoJ3Bhc3MuaHRtbCcp
CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGVzdF9mYWlsZWQpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RmFsc2UoZHJpdmVyX25lZWRfcmVzdGFydCkKKworICAgIGRlZiB0ZXN0X3J1bl9zaWxlbnRf
dGVzdChzZWxmKToKKyAgICAgICAgdGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBz
ZWxmLnJ1bl90ZXN0KCdzaWxlbnQuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXN0
X2ZhaWxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkcml2ZXJfbmVlZF9yZXN0YXJ0KQor
CisgICAgZGVmIHRlc3RfcnVuX2ZhaWxlZF90ZXN0KHNlbGYpOgorICAgICAgICB0ZXN0X2ZhaWxl
ZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNlbGYucnVuX3Rlc3QoJ2ZhaWxlZC5odG1sJykKKyAg
ICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RfZmFpbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZh
bHNlKGRyaXZlcl9uZWVkX3Jlc3RhcnQpCisKKyAgICBkZWYgdGVzdF9ydW5fdG9uZ3VleV90ZXN0
KHNlbGYpOgorICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNlbGYu
cnVuX3Rlc3QoJ3Rvbmd1ZXkuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXN0X2Zh
aWxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkcml2ZXJfbmVlZF9yZXN0YXJ0KQorCisg
ICAgZGVmIHRlc3RfcnVuX3RpbWVvdXRfdGVzdChzZWxmKToKKyAgICAgICAgdGVzdF9mYWlsZWQs
IGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBzZWxmLnJ1bl90ZXN0KCd0aW1lb3V0Lmh0bWwnKQorICAg
ICAgICBzZWxmLmFzc2VydFRydWUodGVzdF9mYWlsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1
ZShkcml2ZXJfbmVlZF9yZXN0YXJ0KQorCisgICAgZGVmIHRlc3RfcnVuX2NyYXNoX3Rlc3Qoc2Vs
Zik6CisgICAgICAgIHRlc3RfZmFpbGVkLCBkcml2ZXJfbmVlZF9yZXN0YXJ0ID0gc2VsZi5ydW5f
dGVzdCgnY3Jhc2guaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXN0X2ZhaWxlZCkK
KyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRyaXZlcl9uZWVkX3Jlc3RhcnQpCisKKyAgICBkZWYg
dGVzdF9ydW5fdGVzdF9zZXQoc2VsZik6CisgICAgICAgIGJ1aWxkYm90X291dHB1dCA9IGFycmF5
X3N0cmVhbS5BcnJheVN0cmVhbSgpCisgICAgICAgIHJ1bm5lciA9IHNlbGYuY3JlYXRlX3J1bm5l
cihidWlsZGJvdF9vdXRwdXQpCisgICAgICAgIGRyaXZlciA9IHNlbGYuY3JlYXRlX2RyaXZlcigp
CisgICAgICAgIHBvcnQgPSBzZWxmLmNyZWF0ZV9wb3J0KCkKKyAgICAgICAgdGVzdHMgPSBbJ3Bh
c3MuaHRtbCcsICdzaWxlbnQuaHRtbCcsICdmYWlsZWQuaHRtbCcsICd0b25ndWV5Lmh0bWwnLCAn
dGltZW91dC5odG1sJywgJ2NyYXNoLmh0bWwnXQorICAgICAgICB1bmV4cGVjdGVkX3Jlc3VsdF9j
b3VudCA9IHJ1bm5lci5fcnVuX3Rlc3RzX3NldCh0ZXN0cywgcG9ydCkKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbCh1bmV4cGVjdGVkX3Jlc3VsdF9jb3VudCwgbGVuKHRlc3RzKSAtIDEpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJ1aWxkYm90X291dHB1dC5nZXQoKSksIDEpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVpbGRib3Rfb3V0cHV0LmdldCgpWzBdLCAnUkVTVUxUIGdy
b3VwX25hbWU6IHRlc3RfbmFtZT0gNDIgbXNcbicpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFp
bl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkK
</data>
<flag name="review"
          id="116205"
          type_id="1"
          status="-"
          setter="dpranke"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117174</attachid>
            <date>2011-11-30 05:15:46 -0800</date>
            <delta_ts>2011-11-30 12:49:37 -0800</delta_ts>
            <desc>[patch] next iteration.</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>47184</size>
            <attacher name="Ilya Tikhonovsky">loislo</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCBmNDQ4
Yzk0Li41ZDg0ODlmIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsODAgQEAKKzIwMTEtMTEtMzAgIElseWEgVGlraG9ub3Zza3kgIDxs
b2lzbG9AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFdlYiBJbnNwZWN0b3I6IGNocm9taXVtOiBJ
J2QgbGlrZSB0byBhZGQgYSBzY3JpcHQgZm9yIHJ1bm5pbmcgcGVyZiB0ZXN0cyBmb3IgV2ViSW5z
cGVjdG9yLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NzMwNzkKKworICAgICAgICBUaGUgaWRlYSBpcyB0byBoYXZlIHBlcmZvcm1hbmNlIHRlc3RzIGZv
ciBXZWJJbnNwZWN0b3IuCisgICAgICAgIEkgd2FzIHN1Z2dlc3RlZCB0byBwdXQgdGhlc2UgdGVz
dHMgaW50byBQZXJmb3JtYW5jZVRlc3RzL2luc3BlY3Rvci4KKyAgICAgICAgVGhleSBwcm9kdWNl
IG91dHB1dCBpbiBhIGZvcm1hdCB0aGF0IGlzIHN1aXRhYmxlIGZvciBjaHJvbWl1bSBwZXJmIGJv
dCBkcmF3aW5nIHNjcmlwdHMuCisKKyAgICAgICAgSSdkIGxpa2UgdG8gcmV1c2UgY29kZSBmb3Ig
c2Nhbm5pbmcgZm9sZGVycyBmb3IgdGVzdCBmaWxlcy4KKyAgICAgICAgQmVjYXVzZSBvZiB0aGUg
ZmFjdCB0aGF0IG9yaWdpbmFsIHRlc3RfZmlsZXMucHkgaGFzIGNvbW1vbiBhbmQgbGF5b3V0IHNw
ZWNpZmljIHBhcnRzCisgICAgICAgIEkgZGVjaWRlZCB0byBleHRyYWN0IHRoZSBnZW5lcmljIHBh
cnQgYW5kIHB1dCBpdCBpbnRvIHdlYmtpdHB5L2NvbW1vbgorICAgICAgICBJIHRoaW5rIHRoZSB0
d28gcGFja2FnZXMgd2l0aCBuYW1lIHRlc3RfZmlsZXMgbG9vayBzdHJhbmdlIGJ1dCBJIGhhdmUg
bm8gaWRlYSBhYm91dCBhIGJldHRlciBuYW1lLgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgICogU2NyaXB0cy9ydW4taW5zcGVjdG9yLXBlcmYtdGVzdHMu
cHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL2ZpbmRfZmlsZXMu
cHk6IFJlbmFtZWQgZnJvbSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0
L3Rlc3RfZmlsZXMucHkuCisgICAgICAgIChmaW5kKToKKyAgICAgICAgKF9ub3JtYWxpemUpOgor
ICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL2ZpbmRfZmlsZXNfdW5pdHRlc3QucHk6
IEFkZGVkLgorICAgICAgICAoTW9ja1dpbkZpbGVTeXN0ZW0uam9pbik6CisgICAgICAgIChNb2Nr
V2luRmlsZVN5c3RlbSk6CisgICAgICAgIChNb2NrV2luRmlsZVN5c3RlbS5ub3JtcGF0aCk6Cisg
ICAgICAgIChUZXN0V2luTm9ybWFsaXplLmFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMpOgor
ICAgICAgICAoVGVzdFdpbk5vcm1hbGl6ZS50ZXN0X21vY2tlZF93aW4pOgorICAgICAgICAoVGVz
dFdpbk5vcm1hbGl6ZSk6CisgICAgICAgIChUZXN0V2luTm9ybWFsaXplLnRlc3Rfd2luKToKKyAg
ICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHk6CisgICAg
ICAgIChQb3J0LnRlc3RzKToKKyAgICAgICAgKFBvcnQuZmluZF90ZXN0X2ZpbGVzKToKKyAgICAg
ICAgKFBvcnQuX2RyaXZlcl9jbGFzcyk6CisgICAgICAgIChpc19yZWZlcmVuY2VfaHRtbF9maWxl
KToKKyAgICAgICAgKF9oYXNfc3VwcG9ydGVkX2V4dGVuc2lvbik6CisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlX3VuaXR0ZXN0LnB5OgorICAgICAgICAo
UG9ydFRlc3QudGVzdF9maW5kX25vX3BhdGhzX3NwZWNpZmllZCk6CisgICAgICAgIChQb3J0VGVz
dC50ZXN0X2ZpbmRfb25lX3Rlc3QpOgorICAgICAgICAoUG9ydFRlc3QudGVzdF9maW5kX2dsb2Ip
OgorICAgICAgICAoUG9ydFRlc3QudGVzdF9maW5kX3dpdGhfc2tpcHBlZF9kaXJlY3Rvcmllcyk6
CisgICAgICAgIChQb3J0VGVzdC50ZXN0X2ZpbmRfd2l0aF9za2lwcGVkX2RpcmVjdG9yaWVzXzIp
OgorICAgICAgICAoUG9ydFRlc3QpOgorICAgICAgICAoUG9ydFRlc3QudGVzdF9pc190ZXN0X2Zp
bGUpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21p
dW1fZ3B1LnB5OgorICAgICAgICAoX3Rlc3RzKToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L3Rlc3QucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC90ZXN0X2ZpbGVzX3VuaXR0ZXN0LnB5OiBSZW1vdmVkLgorICAgICAg
ICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHNfaW50ZWdy
YXRpb250ZXN0LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVz
dHMvX19pbml0X18ucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvcGVyZm9y
bWFuY2VfdGVzdHMvcGVyZnRlc3RzcnVubmVyLnB5OiBBZGRlZC4KKyAgICAgICAgKFBlcmZUZXN0
c1J1bm5lci5fX2luaXRfXyk6CisgICAgICAgIChQZXJmVGVzdHNSdW5uZXIuX3BhcnNlX2FyZ3Mp
OgorICAgICAgICAoUGVyZlRlc3RzUnVubmVyLl9jb2xsZWN0X3Rlc3RzLl9pc190ZXN0X2ZpbGUp
OgorICAgICAgICAoUGVyZlRlc3RzUnVubmVyLl9jb2xsZWN0X3Rlc3RzKToKKyAgICAgICAgKFBl
cmZUZXN0c1J1bm5lci5ydW4pOgorICAgICAgICAoUGVyZlRlc3RzUnVubmVyLl9ydW5fdGVzdHNf
c2V0KToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3BlcmZ0
ZXN0c3J1bm5lcl91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgIChNYWluVGVzdC5UZXN0UG9y
dCk6CisgICAgICAgIChNYWluVGVzdC5UZXN0UG9ydC5jcmVhdGVfZHJpdmVyKToKKyAgICAgICAg
KE1haW5UZXN0LlRlc3REcml2ZXIucnVuX3Rlc3QpOgorICAgICAgICAoTWFpblRlc3QuVGVzdERy
aXZlcik6CisgICAgICAgIChNYWluVGVzdC5UZXN0RHJpdmVyLnN0b3ApOgorICAgICAgICAoTWFp
blRlc3QuY3JlYXRlX3J1bm5lcik6CisgICAgICAgIChNYWluVGVzdC5ydW5fdGVzdCk6CisgICAg
ICAgIChNYWluVGVzdC50ZXN0X3J1bl9wYXNzaW5nX3Rlc3QpOgorICAgICAgICAoTWFpblRlc3Qu
dGVzdF9ydW5fc2lsZW50X3Rlc3QpOgorICAgICAgICAoTWFpblRlc3QudGVzdF9ydW5fZmFpbGVk
X3Rlc3QpOgorICAgICAgICAoTWFpblRlc3QudGVzdF9ydW5fdG9uZ3VleV90ZXN0KToKKyAgICAg
ICAgKE1haW5UZXN0LnRlc3RfcnVuX3RpbWVvdXRfdGVzdCk6CisgICAgICAgIChNYWluVGVzdC50
ZXN0X3J1bl9jcmFzaF90ZXN0KToKKyAgICAgICAgKE1haW5UZXN0LnRlc3RfcnVuX3Rlc3Rfc2V0
KToKKyAgICAgICAgKE1haW5UZXN0LnRlc3RfY29sbGVjdF90ZXN0cyk6CisgICAgICAgIChNYWlu
VGVzdCk6CisgICAgICAgIChNYWluVGVzdC50ZXN0X3BhcnNlX2FyZ3MpOgorICAgICAgICAqIFNj
cmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9yZWJhc2VsaW5lLnB5OgorICAgICAgICAoT3B0
aW1pemVCYXNlbGluZXMuZXhlY3V0ZSk6CisgICAgICAgIChBbmFseXplQmFzZWxpbmVzLmV4ZWN1
dGUpOgorCiAyMDExLTExLTMwICBTaGVyaWZmIEJvdCAgPHdlYmtpdC5yZXZpZXcuYm90QGdtYWls
LmNvbT4KIAogICAgICAgICBVbnJldmlld2VkLCByb2xsaW5nIG91dCByMTAxNDQwIGFuZCByMTAx
NDQyLgpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy9ydW4taW5zcGVjdG9yLXBlcmYtdGVzdHMu
cHkgYi9Ub29scy9TY3JpcHRzL3J1bi1pbnNwZWN0b3ItcGVyZi10ZXN0cy5weQpuZXcgZmlsZSBt
b2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTU3ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvVG9v
bHMvU2NyaXB0cy9ydW4taW5zcGVjdG9yLXBlcmYtdGVzdHMucHkKQEAgLTAsMCArMSw0MiBAQAor
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBt
ZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisj
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVS
IE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiUnVuIEluc3BlY3Rv
cidzIHBlcmYgdGVzdHMgaW4gcGVyZiBtb2RlLiIiIgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0
IHN5cworCitmcm9tIHdlYmtpdHB5LnBlcmZvcm1hbmNlX3Rlc3RzLnBlcmZ0ZXN0c3J1bm5lciBp
bXBvcnQgUGVyZlRlc3RzUnVubmVyCisKK19wZXJmX3Rlc3RzX2RpciA9ICdpbnNwZWN0b3InCitf
bG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKK2lmICdfX21haW5fXycgPT0gX19u
YW1lX186CisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1h
dD0iJShtZXNzYWdlKXMiKQorICAgIHN5cy5leGl0KFBlcmZUZXN0c1J1bm5lcihfcGVyZl90ZXN0
c19kaXIpLnJ1bigpKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
ZmluZF9maWxlcy5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2ZpbmRfZmlsZXMu
cHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1YmNjYwotLS0gL2Rldi9u
dWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2ZpbmRfZmlsZXMucHkKQEAg
LTAsMCArMSwxMDIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIw
MTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMg
Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0
aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisK
KyIiIlRoaXMgbW9kdWxlIGlzIHVzZWQgdG8gZmluZCBmaWxlcyB1c2VkIGJ5IHJ1bi13ZWJraXQt
dGVzdHMgYW5kCitwZXJmdGVzdHJ1bm5lci4gSXQgZXhwb3NlcyBvbmUgcHVibGljIGZ1bmN0aW9u
IC0gZmluZCgpIC0gd2hpY2ggdGFrZXMKK2FuIG9wdGlvbmFsIGxpc3Qgb2YgcGF0aHMsIG9wdGlv
bmFsIHNldCBvZiBza2lwcGVkIGRpcmVjdG9yaWVzIGFuZCBvcHRpb25hbAorZmlsdGVyIGNhbGxi
YWNrLgorCitJZiBhIGxpc3QgaXMgcGFzc2VkIGluLCB0aGUgcmV0dXJuZWQgbGlzdCBvZiBmaWxl
cyBpcyBjb25zdHJhaW5lZCB0byB0aG9zZQorZm91bmQgdW5kZXIgdGhlIHBhdGhzIHBhc3NlZCBp
bi4gaS5lLiBjYWxsaW5nIGZpbmQoWyJMYXlvdXRUZXN0cy9mYXN0Il0pCit3aWxsIG9ubHkgcmV0
dXJuIGZpbGVzIHVuZGVyIHRoYXQgZGlyZWN0b3J5LgorCitJZiBhIHNldCBvZiBza2lwcGVkIGRp
cmVjdG9yaWVzIGlzIHBhc3NlZCBpbiwgdGhlIGZ1bmN0aW9uIHdpbGwgZmlsdGVyIG91dAordGhl
IGZpbGVzIGx5aW5nIGluIHRoZXNlIGRpcmVjdG9yaWVzIGkuZS4gZmluZChbIkxheW91dFRlc3Rz
Il0sIHNldChbImZhc3QiXSkpCit3aWxsIHJldHVybiBldmVyeXRoaW5nIGV4Y2VwdCBmaWxlcyBp
biBmYXN0IHN1YmZvbGRlci4KKworSWYgYSBjYWxsYmFjayBpcyBwYXNzZWQgaW4sIGl0IHdpbGwg
YmUgY2FsbGVkIGZvciB0aGUgZWFjaCBmaWxlIGFuZCB0aGUgZmlsZQord2lsbCBiZSBpbmNsdWRl
ZCBpbnRvIHRoZSByZXN1bHQgaWYgdGhlIGNhbGxiYWNrIHJldHVybnMgVHJ1ZS4KK1RoZSBjYWxs
YmFjayBoYXMgdG8gdGFrZSB0aHJlZSBhcmd1bWVudHM6IGZpbGVzeXN0ZW0sIGRpcm5hbWUgYW5k
IGZpbGVuYW1lLiIiIgorCitpbXBvcnQgdGltZQorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0
ZW0gaW1wb3J0IGxvZ3V0aWxzCisKKworX2xvZyA9IGxvZ3V0aWxzLmdldF9sb2dnZXIoX19maWxl
X18pCisKKworZGVmIGZpbmQoZmlsZXN5c3RlbSwgYmFzZV9kaXIsIHBhdGhzPU5vbmUsIHNraXBw
ZWRfZGlyZWN0b3JpZXM9Tm9uZSwgZmlsZV9maWx0ZXI9Tm9uZSk6CisgICAgIiIiRmluZHMgdGhl
IHNldCBvZiB0ZXN0cyB1bmRlciBhIGdpdmVuIGxpc3Qgb2Ygc3ViLXBhdGhzLgorCisgICAgQXJn
czoKKyAgICAgIHBhdGhzOiBhIGxpc3Qgb2YgcGF0aCBleHByZXNzaW9ucyByZWxhdGl2ZSB0byBi
YXNlX2RpcgorICAgICAgICAgIHRvIHNlYXJjaC4gR2xvYiBwYXR0ZXJucyBhcmUgb2ssIGFzIGFy
ZSBwYXRoIGV4cHJlc3Npb25zIHdpdGgKKyAgICAgICAgICBmb3J3YXJkIHNsYXNoZXMgb24gV2lu
ZG93cy4gSWYgcGF0aHMgaXMgZW1wdHksIHdlIGxvb2sgYXQKKyAgICAgICAgICBldmVyeXRoaW5n
IHVuZGVyIHRoZSBiYXNlX2Rpci4KKyAgICAiIiIKKworICAgIGdsb2JhbCBfc2tpcHBlZF9kaXJl
Y3RvcmllcworICAgIHBhdGhzID0gcGF0aHMgb3IgWycqJ10KKyAgICBza2lwcGVkX2RpcmVjdG9y
aWVzID0gc2tpcHBlZF9kaXJlY3RvcmllcyBvciBzZXQoWycuc3ZuJywgJ19zdm4nXSkKKyAgICBy
ZXR1cm4gX25vcm1hbGl6ZWRfZmluZChmaWxlc3lzdGVtLCBfbm9ybWFsaXplKGZpbGVzeXN0ZW0s
IGJhc2VfZGlyLCBwYXRocyksIHNraXBwZWRfZGlyZWN0b3JpZXMsIGZpbGVfZmlsdGVyKQorCisK
K2RlZiBfbm9ybWFsaXplKGZpbGVzeXN0ZW0sIGJhc2VfZGlyLCBwYXRocyk6CisgICAgcmV0dXJu
IFtmaWxlc3lzdGVtLm5vcm1wYXRoKGZpbGVzeXN0ZW0uam9pbihiYXNlX2RpciwgcGF0aCkpIGZv
ciBwYXRoIGluIHBhdGhzXQorCisKK2RlZiBfbm9ybWFsaXplZF9maW5kKGZpbGVzeXN0ZW0sIHBh
dGhzLCBza2lwcGVkX2RpcmVjdG9yaWVzLCBmaWxlX2ZpbHRlcik6CisgICAgIiIiRmluZHMgdGhl
IHNldCBvZiB0ZXN0cyB1bmRlciB0aGUgbGlzdCBvZiBwYXRocy4KKworICAgIEFyZ3M6CisgICAg
ICBwYXRoczogYSBsaXN0IG9mIGFic29sdXRlIHBhdGggZXhwcmVzc2lvbnMgdG8gc2VhcmNoLgor
ICAgICAgICAgIEdsb2IgcGF0dGVybnMgYXJlIG9rLgorICAgICIiIgorICAgIGdhdGhlcl9zdGFy
dF90aW1lID0gdGltZS50aW1lKCkKKyAgICBwYXRoc190b193YWxrID0gc2V0KCkKKworICAgIGZv
ciBwYXRoIGluIHBhdGhzOgorICAgICAgICAjIElmIHRoZXJlJ3MgYW4gKiBpbiB0aGUgbmFtZSwg
YXNzdW1lIGl0J3MgYSBnbG9iIHBhdHRlcm4uCisgICAgICAgIGlmIHBhdGguZmluZCgnKicpID4g
LTE6CisgICAgICAgICAgICBmaWxlbmFtZXMgPSBmaWxlc3lzdGVtLmdsb2IocGF0aCkKKyAgICAg
ICAgICAgIHBhdGhzX3RvX3dhbGsudXBkYXRlKGZpbGVuYW1lcykKKyAgICAgICAgZWxzZToKKyAg
ICAgICAgICAgIHBhdGhzX3RvX3dhbGsuYWRkKHBhdGgpCisKKyAgICAjIEZJWE1FOiBJJ20gbm90
IHN1cmUgdGhlcmUncyBtdWNoIHBvaW50IGluIHRoaXMgYmVpbmcgYSBzZXQuIEEgbGlzdCB3b3Vs
ZCBwcm9iYWJseSBiZSBmYXN0ZXIuCisgICAgYWxsX2ZpbGVzID0gc2V0KCkKKyAgICBmb3IgcGF0
aCBpbiBwYXRoc190b193YWxrOgorICAgICAgICBmaWxlcyA9IGZpbGVzeXN0ZW0uZmlsZXNfdW5k
ZXIocGF0aCwgc2tpcHBlZF9kaXJlY3RvcmllcywgZmlsZV9maWx0ZXIpCisgICAgICAgIGFsbF9m
aWxlcy51cGRhdGUoc2V0KGZpbGVzKSkKKworICAgIGdhdGhlcl90aW1lID0gdGltZS50aW1lKCkg
LSBnYXRoZXJfc3RhcnRfdGltZQorICAgIF9sb2cuZGVidWcoIlRlc3QgZ2F0aGVyaW5nIHRvb2sg
JWYgc2Vjb25kcyIgJSBnYXRoZXJfdGltZSkKKworICAgIHJldHVybiBhbGxfZmlsZXMKZGlmZiAt
LWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2ZpbmRfZmlsZXNfdW5pdHRlc3Qu
cHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9maW5kX2ZpbGVzX3VuaXR0ZXN0LnB5
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDY4ZGYKLS0tIC9kZXYvbnVs
bAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9maW5kX2ZpbGVzX3VuaXR0ZXN0
LnB5CkBAIC0wLDAgKzEsNjQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1l
dDoKKyMKKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9S
UworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgc3lzCitpbXBvcnQg
dW5pdHRlc3QKKworaW1wb3J0IGZpbmRfZmlsZXMKKworCitjbGFzcyBNb2NrV2luRmlsZVN5c3Rl
bShvYmplY3QpOgorICAgIGRlZiBqb2luKHNlbGYsICpwYXRocyk6CisgICAgICAgIHJldHVybiAn
XFwnLmpvaW4ocGF0aHMpCisKKyAgICBkZWYgbm9ybXBhdGgoc2VsZiwgcGF0aCk6CisgICAgICAg
IHJldHVybiBwYXRoLnJlcGxhY2UoJy8nLCAnXFwnKQorCisKK2NsYXNzIFRlc3RXaW5Ob3JtYWxp
emUodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBhc3NlcnRfZmlsZXN5c3RlbV9ub3JtYWxp
emVzKHNlbGYsIGZpbGVzeXN0ZW0pOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmaW5kX2Zp
bGVzLl9ub3JtYWxpemUoZmlsZXN5c3RlbSwgImM6XFxmb28iLAorICAgICAgICAgICAgWydmYXN0
L2h0bWwnLCAnZmFzdC9jYW52YXMvKicsICdjb21wb3NpdGluZy9mb28uaHRtbCddKSwKKyAgICAg
ICAgICAgIFsnYzpcXGZvb1xcZmFzdFxodG1sJywgJ2M6XFxmb29cXGZhc3RcY2FudmFzXConLCAn
YzpcXGZvb1xjb21wb3NpdGluZ1xcZm9vLmh0bWwnXSkKKworICAgIGRlZiB0ZXN0X21vY2tlZF93
aW4oc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0cyB0ZXN0X2ZpbGVzLm5vcm1hbGl6ZSwgdXNp
bmcgcG9ydGFibGUgYmVoYXZpb3IgZW11bGF0aW5nCisgICAgICAgICMgd2hhdCB3ZSB0aGluayBX
aW5kb3dzIGlzIHN1cHBvc2VkIHRvIGRvLiBUaGlzIHRlc3Qgd2lsbCBydW4gb24gYWxsCisgICAg
ICAgICMgcGxhdGZvcm1zLgorICAgICAgICBzZWxmLmFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6
ZXMoTW9ja1dpbkZpbGVTeXN0ZW0oKSkKKworICAgIGRlZiB0ZXN0X3dpbihzZWxmKToKKyAgICAg
ICAgIyBUaGlzIHRlc3RzIHRoZSBhY3R1YWwgd2luZG93cyBwbGF0Zm9ybSwgdG8gZW5zdXJlIHdl
IGdldCB0aGUgc2FtZQorICAgICAgICAjIHJlc3VsdHMgdGhhdCB3ZSBnZXQgaW4gdGVzdF9tb2Nr
ZWRfd2luKCkuCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnd2luJzoKKyAgICAgICAgICAg
IHJldHVybgorICAgICAgICBzZWxmLmFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMoRmlsZVN5
c3RlbSgpKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFp
bigpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0
L2Jhc2UucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2Uu
cHkKaW5kZXggNGMxYmJlOC4uZjJiMGFhMSAxMDA3NTUKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQpAQCAtNDYsNiArNDYsNyBAQCB0cnk6CiBleGNl
cHQgSW1wb3J0RXJyb3I6CiAgICAgbXVsdGlwcm9jZXNzaW5nID0gTm9uZQogCitmcm9tIHdlYmtp
dHB5LmNvbW1vbiBpbXBvcnQgZmluZF9maWxlcwogZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVt
IGltcG9ydCBsb2d1dGlscwogZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtIGltcG9ydCBwYXRo
CiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZXhlY3V0aXZlIGltcG9ydCBTY3JpcHRFcnJv
cgpAQCAtNTQsNyArNTUsNiBAQCBmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5tb2RlbHMudGVz
dF9jb25maWd1cmF0aW9uIGltcG9ydCBUZXN0Q29uZmlndXJhdGlvbgogZnJvbSB3ZWJraXRweS5s
YXlvdXRfdGVzdHMucG9ydCBpbXBvcnQgY29uZmlnIGFzIHBvcnRfY29uZmlnCiBmcm9tIHdlYmtp
dHB5LmxheW91dF90ZXN0cy5wb3J0IGltcG9ydCBkcml2ZXIKIGZyb20gd2Via2l0cHkubGF5b3V0
X3Rlc3RzLnBvcnQgaW1wb3J0IGh0dHBfbG9jawotZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMu
cG9ydCBpbXBvcnQgdGVzdF9maWxlcwogZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMuc2VydmVy
cyBpbXBvcnQgYXBhY2hlX2h0dHBfc2VydmVyCiBmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5z
ZXJ2ZXJzIGltcG9ydCBodHRwX3NlcnZlcgogZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMuc2Vy
dmVycyBpbXBvcnQgd2Vic29ja2V0X3NlcnZlcgpAQCAtNDYxLDggKzQ2MSwxMyBAQCBjbGFzcyBQ
b3J0KG9iamVjdCk6CiAKICAgICBkZWYgdGVzdHMoc2VsZiwgcGF0aHMpOgogICAgICAgICAiIiJS
ZXR1cm4gdGhlIGxpc3Qgb2YgdGVzdHMgZm91bmQuIiIiCi0gICAgICAgICMgRklYTUU6IFNob3Vs
ZCB0ZXN0X2ZpbGVzLmZpbmQoKSByZXR1cm4gbm9ybWFsaXplZCwgcmVsYXRpdmUgdGVzdCBuYW1l
cz8KLSAgICAgICAgcmV0dXJuIHNldChbc2VsZi5yZWxhdGl2ZV90ZXN0X2ZpbGVuYW1lKGYpIGZv
ciBmIGluIHRlc3RfZmlsZXMuZmluZChzZWxmLCBwYXRocyldKQorICAgICAgICAjIEZJWE1FOiBT
aG91bGQgcG9ydC5maW5kX3Rlc3RfZmlsZXMoKSByZXR1cm4gbm9ybWFsaXplZCwgcmVsYXRpdmUg
dGVzdCBuYW1lcz8KKyAgICAgICAgcmV0dXJuIHNldChbc2VsZi5yZWxhdGl2ZV90ZXN0X2ZpbGVu
YW1lKGYpIGZvciBmIGluIHNlbGYuZmluZF90ZXN0X2ZpbGVzKHBhdGhzKV0pCisKKyAgICBkZWYg
ZmluZF90ZXN0X2ZpbGVzKHNlbGYsIHBhdGhzKToKKyAgICAgICAgIyBXaGVuIGNvbGxlY3Rpbmcg
dGVzdCBjYXNlcywgc2tpcCB0aGVzZSBkaXJlY3RvcmllcworICAgICAgICBza2lwcGVkX2RpcmVj
dG9yaWVzID0gc2V0KFsnLnN2bicsICdfc3ZuJywgJ3Jlc291cmNlcycsICdzY3JpcHQtdGVzdHMn
XSkKKyAgICAgICAgcmV0dXJuIGZpbmRfZmlsZXMuZmluZChzZWxmLmZpbGVzeXN0ZW0sIHNlbGYu
bGF5b3V0X3Rlc3RzX2RpcigpLCBwYXRocywgc2tpcHBlZF9kaXJlY3RvcmllcywgX2lzX3Rlc3Rf
ZmlsZSkKIAogICAgIGRlZiB0ZXN0X2RpcnMoc2VsZik6CiAgICAgICAgICIiIlJldHVybnMgdGhl
IGxpc3Qgb2YgdG9wLWxldmVsIHRlc3QgZGlyZWN0b3JpZXMuIiIiCkBAIC05OTQsMyArOTk5LDIy
IEBAIGNsYXNzIFBvcnQob2JqZWN0KToKICAgICBkZWYgX2RyaXZlcl9jbGFzcyhzZWxmKToKICAg
ICAgICAgIiIiUmV0dXJucyB0aGUgcG9ydCdzIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4iIiIKICAg
ICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignUG9ydC5fZHJpdmVyX2NsYXNzJykKKwor
CisjIFdoZW4gY29sbGVjdGluZyB0ZXN0IGNhc2VzLCB3ZSBpbmNsdWRlIGFueSBmaWxlIHdpdGgg
dGhlc2UgZXh0ZW5zaW9ucy4KK19zdXBwb3J0ZWRfZmlsZV9leHRlbnNpb25zID0gc2V0KFsnLmh0
bWwnLCAnLnNodG1sJywgJy54bWwnLCAnLnhodG1sJywgJy5wbCcsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAnLmh0bScsICcucGhwJywgJy5zdmcnLCAnLm1odCddKQorCisKK2Rl
ZiBpc19yZWZlcmVuY2VfaHRtbF9maWxlKGZpbGVuYW1lKToKKyAgICByZXR1cm4gZmlsZW5hbWUu
ZW5kc3dpdGgoJy1leHBlY3RlZC5odG1sJykgb3IgZmlsZW5hbWUuZW5kc3dpdGgoJy1leHBlY3Rl
ZC1taXNtYXRjaC5odG1sJykKKworCitkZWYgX2hhc19zdXBwb3J0ZWRfZXh0ZW5zaW9uKGZpbGVz
eXN0ZW0sIGZpbGVuYW1lKToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBmaWxlbmFtZSBpcyBvbmUg
b2YgdGhlIGZpbGUgZXh0ZW5zaW9ucyB3ZSB3YW50IHRvIHJ1biBhIHRlc3Qgb24uIiIiCisgICAg
ZXh0ZW5zaW9uID0gZmlsZXN5c3RlbS5zcGxpdGV4dChmaWxlbmFtZSlbMV0KKyAgICByZXR1cm4g
ZXh0ZW5zaW9uIGluIF9zdXBwb3J0ZWRfZmlsZV9leHRlbnNpb25zCisKKworZGVmIF9pc190ZXN0
X2ZpbGUoZmlsZXN5c3RlbSwgZGlybmFtZSwgZmlsZW5hbWUpOgorICAgIHJldHVybiBfaGFzX3N1
cHBvcnRlZF9leHRlbnNpb24oZmlsZXN5c3RlbSwgZmlsZW5hbWUpIGFuZCBub3QgaXNfcmVmZXJl
bmNlX2h0bWxfZmlsZShmaWxlbmFtZSkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZV91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZV91bml0dGVzdC5weQppbmRleCBkNzA1YWZjLi5l
OWUwNzIxIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9w
b3J0L2Jhc2VfdW5pdHRlc3QucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcG9ydC9iYXNlX3VuaXR0ZXN0LnB5CkBAIC00Miw2ICs0Miw4IEBAIGZyb20gd2Via2l0
cHkuY29tbW9uLnN5c3RlbS5leGVjdXRpdmVfbW9jayBpbXBvcnQgTW9ja0V4ZWN1dGl2ZQogZnJv
bSB3ZWJraXRweS5jb21tb24uaG9zdF9tb2NrIGltcG9ydCBNb2NrSG9zdAogCiBmcm9tIHdlYmtp
dHB5LmxheW91dF90ZXN0cy5wb3J0IGltcG9ydCBQb3J0LCBEcml2ZXIsIERyaXZlck91dHB1dAor
ZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydC5iYXNlIGltcG9ydCBfaXNfdGVzdF9maWxl
Citmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0LnRlc3QgaW1wb3J0IFRlc3RQb3J0CiAK
IGltcG9ydCBjb25maWcKIGltcG9ydCBjb25maWdfbW9jawpAQCAtMjc0LDYgKzI3Niw0MCBAQCBj
bGFzcyBQb3J0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgIHBvcnQuX2ZpbGVzeXN0
ZW0gPSBNb2NrRmlsZVN5c3RlbSh7Jy9tb2NrLXJlc3VsdHMvdGVzdF9leHBlY3RhdGlvbnMudHh0
JzogJyd9KQogICAgICAgICBzZWxmLmFzc2VydFRydWUocG9ydC51c2VzX3Rlc3RfZXhwZWN0YXRp
b25zX2ZpbGUoKSkKIAorICAgIGRlZiB0ZXN0X2ZpbmRfbm9fcGF0aHNfc3BlY2lmaWVkKHNlbGYp
OgorICAgICAgICBwb3J0ID0gVGVzdFBvcnQoKQorICAgICAgICBsYXlvdXRfdGVzdHNfZGlyID0g
cG9ydC5sYXlvdXRfdGVzdHNfZGlyKCkKKyAgICAgICAgdGVzdHMgPSBwb3J0LmZpbmRfdGVzdF9m
aWxlcyhbXSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChsZW4odGVzdHMpLCAwKQorCisg
ICAgZGVmIHRlc3RfZmluZF9vbmVfdGVzdChzZWxmKToKKyAgICAgICAgcG9ydCA9IFRlc3RQb3J0
KCkKKyAgICAgICAgdGVzdHMgPSBwb3J0LmZpbmRfdGVzdF9maWxlcyhbJ2ZhaWx1cmVzL2V4cGVj
dGVkL2ltYWdlLmh0bWwnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGVzdHMpLCAx
KQorCisgICAgZGVmIHRlc3RfZmluZF9nbG9iKHNlbGYpOgorICAgICAgICBwb3J0ID0gVGVzdFBv
cnQoKQorICAgICAgICB0ZXN0cyA9IHBvcnQuZmluZF90ZXN0X2ZpbGVzKFsnZmFpbHVyZXMvZXhw
ZWN0ZWQvaW0qJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRlc3RzKSwgMikKKwor
ICAgIGRlZiB0ZXN0X2ZpbmRfd2l0aF9za2lwcGVkX2RpcmVjdG9yaWVzKHNlbGYpOgorICAgICAg
ICBwb3J0ID0gVGVzdFBvcnQoKQorICAgICAgICB0ZXN0cyA9IHBvcnQuZmluZF90ZXN0X2ZpbGVz
KCd1c2Vyc2NyaXB0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndXNlcnNjcmlwdHMvcmVz
b3VyY2VzL2lmcmFtZS5odG1sJyBub3QgaW4gdGVzdHMpCisKKyAgICBkZWYgdGVzdF9maW5kX3dp
dGhfc2tpcHBlZF9kaXJlY3Rvcmllc18yKHNlbGYpOgorICAgICAgICBwb3J0ID0gVGVzdFBvcnQo
KQorICAgICAgICB0ZXN0cyA9IHBvcnQuZmluZF90ZXN0X2ZpbGVzKFsndXNlcnNjcmlwdHMvcmVz
b3VyY2VzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdHMsIHNldChbXSkpCisKKyAg
ICBkZWYgdGVzdF9pc190ZXN0X2ZpbGUoc2VsZik6CisgICAgICAgIGZpbGVzeXN0ZW0gPSBNb2Nr
RmlsZVN5c3RlbSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfaXNfdGVzdF9maWxlKGZpbGVz
eXN0ZW0sICcnLCAnZm9vLmh0bWwnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9pc190ZXN0
X2ZpbGUoZmlsZXN5c3RlbSwgJycsICdmb28uc2h0bWwnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRG
YWxzZShfaXNfdGVzdF9maWxlKGZpbGVzeXN0ZW0sICcnLCAnZm9vLnBuZycpKQorICAgICAgICBz
ZWxmLmFzc2VydEZhbHNlKF9pc190ZXN0X2ZpbGUoZmlsZXN5c3RlbSwgJycsICdmb28tZXhwZWN0
ZWQuaHRtbCcpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKF9pc190ZXN0X2ZpbGUoZmlsZXN5
c3RlbSwgJycsICdmb28tZXhwZWN0ZWQtbWlzbWF0Y2guaHRtbCcpKQorCiAKIGNsYXNzIFZpcnR1
YWxUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJUZXN0cyB0aGF0IHZhcmlvdXMgbWV0
aG9kcyBleHBlY3RlZCB0byBiZSB2aXJ0dWFsIGFyZS4iIiIKZGlmZiAtLWdpdCBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fZ3B1LnB5IGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bV9ncHUucHkKaW5kZXgg
ZTg2YjhiNy4uMjY2MTAzMyAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvcG9ydC9jaHJvbWl1bV9ncHUucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJvbWl1bV9ncHUucHkKQEAgLTMwLDggKzMwLDYgQEAgaW1w
b3J0IGNocm9taXVtX2xpbnV4CiBpbXBvcnQgY2hyb21pdW1fbWFjCiBpbXBvcnQgY2hyb21pdW1f
d2luCiAKLWZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQgaW1wb3J0IHRlc3RfZmlsZXMK
LQogCiBkZWYgZ2V0KGhvc3QsIHBsYXRmb3JtPU5vbmUsIHBvcnRfbmFtZT0nY2hyb21pdW0tZ3B1
JywgKiprd2FyZ3MpOgogICAgICIiIlNvbWUgdGVzdHMgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQg
cmVzdWx0cyB3aGVuIHJ1biB3aGlsZSB1c2luZwpAQCAtOTQsMTMgKzkyLDEzIEBAIGRlZiBfdGVz
dHMocG9ydCwgcGF0aHMpOgogCiAgICAgICAgIGlmIG5vdCBwYXRoczoKICAgICAgICAgICAgICMg
RklYTUU6IFRoaXMgaXMgYSBoYWNrIHVudGlsIHdlIGNhbiB0dXJuIG9mIHRoZSB3ZWJraXRfZ3B1
Ci0gICAgICAgICAgICAjIHRlc3RzIG9uIHRoZSBib3RzLiBJZiBwYXRocyBpcyBlbXB0eSwgdGVz
dF9maWxlcy5maW5kKCkKKyAgICAgICAgICAgICMgdGVzdHMgb24gdGhlIGJvdHMuIElmIHBhdGhz
IGlzIGVtcHR5LCBwb3J0LmZpbmRfdGVzdF9maWxlcygpCiAgICAgICAgICAgICAjIGZpbmRzICpl
dmVyeXRoaW5nKi4gSG93ZXZlciwgd2UgaGF2ZSB0byByZXR1cm4gc29tZXRoaW5nLAogICAgICAg
ICAgICAgIyBvciBOUldUIHRoaW5rcyB0aGVyZSdzIHNvbWV0aGluZyB3cm9uZy4gU28sIHdlIHJl
dHVybiBhIHNpbmdsZQogICAgICAgICAgICAgIyBzaG9ydCBkaXJlY3RvcnkuIFNlZSBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI0OTguCiAgICAgICAgICAgICBwYXRo
cyA9IFsnZmFzdC9odG1sJ10KIAotICAgIHJldHVybiBzZXQoW3BvcnQucmVsYXRpdmVfdGVzdF9m
aWxlbmFtZShmKSBmb3IgZiBpbiB0ZXN0X2ZpbGVzLmZpbmQocG9ydCwgcGF0aHMpXSkKKyAgICBy
ZXR1cm4gc2V0KFtwb3J0LnJlbGF0aXZlX3Rlc3RfZmlsZW5hbWUoZikgZm9yIGYgaW4gcG9ydC5m
aW5kX3Rlc3RfZmlsZXMocGF0aHMpXSkKIAogCiBjbGFzcyBDaHJvbWl1bUdwdUxpbnV4UG9ydChj
aHJvbWl1bV9saW51eC5DaHJvbWl1bUxpbnV4UG9ydCk6CmRpZmYgLS1naXQgYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rlc3QucHkKaW5kZXggYTRmYzkyNC4uMWVmNDQ5YSAx
MDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC90ZXN0
LnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdC5w
eQpAQCAtMjU3LDcgKzI1Nyw3IEBAIFdPTlRGSVggU0tJUCA6IGZhaWx1cmVzL2V4cGVjdGVkL2V4
Y2VwdGlvbi5odG1sID0gQ1JBU0gKIAogICAgICMgRklYTUU6IFRoaXMgdGVzdCB3YXMgb25seSBi
ZWluZyBpZ25vcmVkIGJlY2F1c2Ugb2YgbWlzc2luZyBhIGxlYWRpbmcgJy8nLgogICAgICMgRml4
aW5nIHRoZSB0eXBvIGNhdXNlcyBzZXZlcmFsIHRlc3RzIHRvIGFzc2VydCwgc28gZGlzYWJsaW5n
IHRoZSB0ZXN0IGVudGlyZWx5LgotICAgICMgQWRkIGluIGEgZmlsZSBzaG91bGQgYmUgaWdub3Jl
ZCBieSB0ZXN0X2ZpbGVzLmZpbmQoKS4KKyAgICAjIEFkZCBpbiBhIGZpbGUgc2hvdWxkIGJlIGln
bm9yZWQgYnkgcG9ydC5maW5kX3Rlc3RfZmlsZXMoKS4KICAgICAjZmlsZXNbTEFZT1VUX1RFU1Rf
RElSICsgJy91c2Vyc2NyaXB0cy9yZXNvdXJjZXMvaWZyYW1lLmh0bWwnXSA9ICdpZnJhbWUnCiAK
ICAgICBmcyA9IE1vY2tGaWxlU3lzdGVtKGZpbGVzLCBkaXJzPXNldChbJy9tb2NrLWNoZWNrb3V0
J10pKSAgIyBNYWtlIHN1cmUgYXQgbGVhc3QgdGhlIGNoZWNrb3V0X3Jvb3QgZXhpc3RzIGFzIGEg
ZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcG9ydC90ZXN0X2ZpbGVzLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcG9ydC90ZXN0X2ZpbGVzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGI4
NDEzLi4wMDAwMDAwCi0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3Bv
cnQvdGVzdF9maWxlcy5weQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0jIS91c3Iv
YmluL2VudiBweXRob24KLSMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMK
LSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQot
IyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwot
IyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
Ci0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
Ci0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJUaGlzIG1vZHVsZSBpcyB1c2Vk
IHRvIGZpbmQgYWxsIG9mIHRoZSBsYXlvdXQgdGVzdCBmaWxlcyB1c2VkIGJ5Ci1ydW4td2Via2l0
LXRlc3RzLiBJdCBleHBvc2VzIG9uZSBwdWJsaWMgZnVuY3Rpb24gLSBmaW5kKCkgLQotd2hpY2gg
dGFrZXMgYW4gb3B0aW9uYWwgbGlzdCBvZiBwYXRocy4gSWYgYSBsaXN0IGlzIHBhc3NlZCBpbiwg
dGhlIHJldHVybmVkCi1saXN0IG9mIHRlc3QgZmlsZXMgaXMgY29uc3RyYWluZWQgdG8gdGhvc2Ug
Zm91bmQgdW5kZXIgdGhlIHBhdGhzIHBhc3NlZCBpbiwKLWkuZS4gY2FsbGluZyBmaW5kKFsiTGF5
b3V0VGVzdHMvZmFzdCJdKSB3aWxsIG9ubHkgcmV0dXJuIGZpbGVzCi11bmRlciB0aGF0IGRpcmVj
dG9yeS4iIiIKLQotaW1wb3J0IHRpbWUKLQotZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtIGlt
cG9ydCBsb2d1dGlscwotCi0KLV9sb2cgPSBsb2d1dGlscy5nZXRfbG9nZ2VyKF9fZmlsZV9fKQot
Ci0KLSMgV2hlbiBjb2xsZWN0aW5nIHRlc3QgY2FzZXMsIHdlIGluY2x1ZGUgYW55IGZpbGUgd2l0
aCB0aGVzZSBleHRlbnNpb25zLgotX3N1cHBvcnRlZF9maWxlX2V4dGVuc2lvbnMgPSBzZXQoWycu
aHRtbCcsICcuc2h0bWwnLCAnLnhtbCcsICcueGh0bWwnLCAnLnBsJywKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAnLmh0bScsICcucGhwJywgJy5zdmcnLCAnLm1odCddKQotIyBX
aGVuIGNvbGxlY3RpbmcgdGVzdCBjYXNlcywgc2tpcCB0aGVzZSBkaXJlY3RvcmllcwotX3NraXBw
ZWRfZGlyZWN0b3JpZXMgPSBzZXQoWycuc3ZuJywgJ19zdm4nLCAncmVzb3VyY2VzJywgJ3Njcmlw
dC10ZXN0cyddKQotCi0KLWRlZiBmaW5kKHBvcnQsIHBhdGhzPU5vbmUpOgotICAgICIiIkZpbmRz
IHRoZSBzZXQgb2YgdGVzdHMgdW5kZXIgYSBnaXZlbiBsaXN0IG9mIHN1Yi1wYXRocy4KLQotICAg
IEFyZ3M6Ci0gICAgICBwYXRoczogYSBsaXN0IG9mIHBhdGggZXhwcmVzc2lvbnMgcmVsYXRpdmUg
dG8gcG9ydC5sYXlvdXRfdGVzdHNfZGlyKCkKLSAgICAgICAgICB0byBzZWFyY2guIEdsb2IgcGF0
dGVybnMgYXJlIG9rLCBhcyBhcmUgcGF0aCBleHByZXNzaW9ucyB3aXRoCi0gICAgICAgICAgZm9y
d2FyZCBzbGFzaGVzIG9uIFdpbmRvd3MuIElmIHBhdGhzIGlzIGVtcHR5LCB3ZSBsb29rIGF0Ci0g
ICAgICAgICAgZXZlcnl0aGluZyB1bmRlciB0aGUgbGF5b3V0X3Rlc3RzX2RpcigpLgotICAgICIi
IgotICAgIHBhdGhzID0gcGF0aHMgb3IgWycqJ10KLSAgICBmaWxlc3lzdGVtID0gcG9ydC5fZmls
ZXN5c3RlbQotICAgIHJldHVybiBub3JtYWxpemVkX2ZpbmQoZmlsZXN5c3RlbSwgbm9ybWFsaXpl
KGZpbGVzeXN0ZW0sIHBvcnQubGF5b3V0X3Rlc3RzX2RpcigpLCBwYXRocykpCi0KLQotZGVmIG5v
cm1hbGl6ZShmaWxlc3lzdGVtLCBiYXNlX2RpciwgcGF0aHMpOgotICAgIHJldHVybiBbZmlsZXN5
c3RlbS5ub3JtcGF0aChmaWxlc3lzdGVtLmpvaW4oYmFzZV9kaXIsIHBhdGgpKSBmb3IgcGF0aCBp
biBwYXRoc10KLQotCi1kZWYgbm9ybWFsaXplZF9maW5kKGZpbGVzeXN0ZW0sIHBhdGhzKToKLSAg
ICAiIiJGaW5kcyB0aGUgc2V0IG9mIHRlc3RzIHVuZGVyIHRoZSBsaXN0IG9mIHBhdGhzLgotCi0g
ICAgQXJnczoKLSAgICAgIHBhdGhzOiBhIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aCBleHByZXNzaW9u
cyB0byBzZWFyY2guCi0gICAgICAgICAgR2xvYiBwYXR0ZXJucyBhcmUgb2suCi0gICAgIiIiCi0g
ICAgZ2F0aGVyX3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQotICAgIHBhdGhzX3RvX3dhbGsgPSBz
ZXQoKQotCi0gICAgZm9yIHBhdGggaW4gcGF0aHM6Ci0gICAgICAgICMgSWYgdGhlcmUncyBhbiAq
IGluIHRoZSBuYW1lLCBhc3N1bWUgaXQncyBhIGdsb2IgcGF0dGVybi4KLSAgICAgICAgaWYgcGF0
aC5maW5kKCcqJykgPiAtMToKLSAgICAgICAgICAgIGZpbGVuYW1lcyA9IGZpbGVzeXN0ZW0uZ2xv
YihwYXRoKQotICAgICAgICAgICAgcGF0aHNfdG9fd2Fsay51cGRhdGUoZmlsZW5hbWVzKQotICAg
ICAgICBlbHNlOgotICAgICAgICAgICAgcGF0aHNfdG9fd2Fsay5hZGQocGF0aCkKLQotICAgICMg
RklYTUU6IEknbSBub3Qgc3VyZSB0aGVyZSdzIG11Y2ggcG9pbnQgaW4gdGhpcyBiZWluZyBhIHNl
dC4gQSBsaXN0IHdvdWxkIHByb2JhYmx5IGJlIGZhc3Rlci4KLSAgICB0ZXN0X2ZpbGVzID0gc2V0
KCkKLSAgICBmb3IgcGF0aCBpbiBwYXRoc190b193YWxrOgotICAgICAgICBmaWxlcyA9IGZpbGVz
eXN0ZW0uZmlsZXNfdW5kZXIocGF0aCwgX3NraXBwZWRfZGlyZWN0b3JpZXMsIF9pc190ZXN0X2Zp
bGUpCi0gICAgICAgIHRlc3RfZmlsZXMudXBkYXRlKHNldChmaWxlcykpCi0KLSAgICBnYXRoZXJf
dGltZSA9IHRpbWUudGltZSgpIC0gZ2F0aGVyX3N0YXJ0X3RpbWUKLSAgICBfbG9nLmRlYnVnKCJU
ZXN0IGdhdGhlcmluZyB0b29rICVmIHNlY29uZHMiICUgZ2F0aGVyX3RpbWUpCi0KLSAgICByZXR1
cm4gdGVzdF9maWxlcwotCi0KLWRlZiBfaGFzX3N1cHBvcnRlZF9leHRlbnNpb24oZmlsZXN5c3Rl
bSwgZmlsZW5hbWUpOgotICAgICIiIlJldHVybiB0cnVlIGlmIGZpbGVuYW1lIGlzIG9uZSBvZiB0
aGUgZmlsZSBleHRlbnNpb25zIHdlIHdhbnQgdG8gcnVuIGEgdGVzdCBvbi4iIiIKLSAgICBleHRl
bnNpb24gPSBmaWxlc3lzdGVtLnNwbGl0ZXh0KGZpbGVuYW1lKVsxXQotICAgIHJldHVybiBleHRl
bnNpb24gaW4gX3N1cHBvcnRlZF9maWxlX2V4dGVuc2lvbnMKLQotCi1kZWYgaXNfcmVmZXJlbmNl
X2h0bWxfZmlsZShmaWxlbmFtZSk6Ci0gICAgcmV0dXJuIGZpbGVuYW1lLmVuZHN3aXRoKCctZXhw
ZWN0ZWQuaHRtbCcpIG9yIGZpbGVuYW1lLmVuZHN3aXRoKCctZXhwZWN0ZWQtbWlzbWF0Y2guaHRt
bCcpCi0KLQotZGVmIF9pc190ZXN0X2ZpbGUoZmlsZXN5c3RlbSwgZGlybmFtZSwgZmlsZW5hbWUp
OgotICAgIHJldHVybiBfaGFzX3N1cHBvcnRlZF9leHRlbnNpb24oZmlsZXN5c3RlbSwgZmlsZW5h
bWUpIGFuZCBub3QgaXNfcmVmZXJlbmNlX2h0bWxfZmlsZShmaWxlbmFtZSkKZGlmZiAtLWdpdCBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9maWxlc191bml0
dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvdGVzdF9m
aWxlc191bml0dGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5YmE0OS4u
MDAwMDAwMAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L3Rl
c3RfZmlsZXNfdW5pdHRlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotIyBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMg
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwot
IyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3Rz
IGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0KLWltcG9ydCBzeXMKLWltcG9ydCB1bml0dGVzdAotCi1mcm9tIHdlYmtpdHB5
LmxheW91dF90ZXN0cy5wb3J0IGltcG9ydCB0ZXN0Ci1pbXBvcnQgdGVzdF9maWxlcwotCi1jbGFz
cyBUZXN0RmlsZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgdGVzdF9maW5kX25v
X3BhdGhzX3NwZWNpZmllZChzZWxmKToKLSAgICAgICAgcG9ydCA9IHRlc3QuVGVzdFBvcnQoKQot
ICAgICAgICBsYXlvdXRfdGVzdHNfZGlyID0gcG9ydC5sYXlvdXRfdGVzdHNfZGlyKCkKLSAgICAg
ICAgdGVzdHMgPSB0ZXN0X2ZpbGVzLmZpbmQocG9ydCwgW10pCi0gICAgICAgIHNlbGYuYXNzZXJ0
Tm90RXF1YWwobGVuKHRlc3RzKSwgMCkKLQotICAgIGRlZiB0ZXN0X2ZpbmRfb25lX3Rlc3Qoc2Vs
Zik6Ci0gICAgICAgIHBvcnQgPSB0ZXN0LlRlc3RQb3J0KCkKLSAgICAgICAgdGVzdHMgPSB0ZXN0
X2ZpbGVzLmZpbmQocG9ydCwgWydmYWlsdXJlcy9leHBlY3RlZC9pbWFnZS5odG1sJ10pCi0gICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRlc3RzKSwgMSkKLQotICAgIGRlZiB0ZXN0X2ZpbmRf
Z2xvYihzZWxmKToKLSAgICAgICAgcG9ydCA9IHRlc3QuVGVzdFBvcnQoKQotICAgICAgICB0ZXN0
cyA9IHRlc3RfZmlsZXMuZmluZChwb3J0LCBbJ2ZhaWx1cmVzL2V4cGVjdGVkL2ltKiddKQotICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0ZXN0cyksIDIpCi0KLSAgICBkZWYgdGVzdF9maW5k
X3dpdGhfc2tpcHBlZF9kaXJlY3RvcmllcyhzZWxmKToKLSAgICAgICAgcG9ydCA9IHRlc3QuVGVz
dFBvcnQoKQotICAgICAgICB0ZXN0cyA9IHBvcnQudGVzdHMoJ3VzZXJzY3JpcHRzJykKLSAgICAg
ICAgc2VsZi5hc3NlcnRUcnVlKCd1c2Vyc2NyaXB0cy9yZXNvdXJjZXMvaWZyYW1lLmh0bWwnIG5v
dCBpbiB0ZXN0cykKLQotICAgIGRlZiB0ZXN0X2ZpbmRfd2l0aF9za2lwcGVkX2RpcmVjdG9yaWVz
XzIoc2VsZik6Ci0gICAgICAgIHBvcnQgPSB0ZXN0LlRlc3RQb3J0KCkKLSAgICAgICAgdGVzdHMg
PSB0ZXN0X2ZpbGVzLmZpbmQocG9ydCwgWyd1c2Vyc2NyaXB0cy9yZXNvdXJjZXMnXSkKLSAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0cywgc2V0KFtdKSkKLQotICAgIGRlZiB0ZXN0X2lzX3Rl
c3RfZmlsZShzZWxmKToKLSAgICAgICAgcG9ydCA9IHRlc3QuVGVzdFBvcnQoKQotICAgICAgICBm
cyA9IHBvcnQuX2ZpbGVzeXN0ZW0KLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RfZmlsZXMu
X2lzX3Rlc3RfZmlsZShmcywgJycsICdmb28uaHRtbCcpKQotICAgICAgICBzZWxmLmFzc2VydFRy
dWUodGVzdF9maWxlcy5faXNfdGVzdF9maWxlKGZzLCAnJywgJ2Zvby5zaHRtbCcpKQotICAgICAg
ICBzZWxmLmFzc2VydEZhbHNlKHRlc3RfZmlsZXMuX2lzX3Rlc3RfZmlsZShmcywgJycsICdmb28u
cG5nJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGVzdF9maWxlcy5faXNfdGVzdF9maWxl
KGZzLCAnJywgJ2Zvby1leHBlY3RlZC5odG1sJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uo
dGVzdF9maWxlcy5faXNfdGVzdF9maWxlKGZzLCAnJywgJ2Zvby1leHBlY3RlZC1taXNtYXRjaC5o
dG1sJykpCi0KLQotY2xhc3MgTW9ja1dpbkZpbGVTeXN0ZW0ob2JqZWN0KToKLSAgICBkZWYgam9p
bihzZWxmLCAqcGF0aHMpOgotICAgICAgICByZXR1cm4gJ1xcJy5qb2luKHBhdGhzKQotCi0gICAg
ZGVmIG5vcm1wYXRoKHNlbGYsIHBhdGgpOgotICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKCcv
JywgJ1xcJykKLQotCi1jbGFzcyBUZXN0V2luTm9ybWFsaXplKHVuaXR0ZXN0LlRlc3RDYXNlKToK
LSAgICBkZWYgYXNzZXJ0X2ZpbGVzeXN0ZW1fbm9ybWFsaXplcyhzZWxmLCBmaWxlc3lzdGVtKToK
LSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGVzdF9maWxlcy5ub3JtYWxpemUoZmlsZXN5c3Rl
bSwgImM6XFxmb28iLAotICAgICAgICAgICAgWydmYXN0L2h0bWwnLCAnZmFzdC9jYW52YXMvKics
ICdjb21wb3NpdGluZy9mb28uaHRtbCddKSwKLSAgICAgICAgICAgIFsnYzpcXGZvb1xcZmFzdFxo
dG1sJywgJ2M6XFxmb29cXGZhc3RcY2FudmFzXConLCAnYzpcXGZvb1xjb21wb3NpdGluZ1xcZm9v
Lmh0bWwnXSkKLQotICAgIGRlZiB0ZXN0X21vY2tlZF93aW4oc2VsZik6Ci0gICAgICAgICMgVGhp
cyB0ZXN0cyB0ZXN0X2ZpbGVzLm5vcm1hbGl6ZSwgdXNpbmcgcG9ydGFibGUgYmVoYXZpb3IgZW11
bGF0aW5nCi0gICAgICAgICMgd2hhdCB3ZSB0aGluayBXaW5kb3dzIGlzIHN1cHBvc2VkIHRvIGRv
LiBUaGlzIHRlc3Qgd2lsbCBydW4gb24gYWxsCi0gICAgICAgICMgcGxhdGZvcm1zLgotICAgICAg
ICBzZWxmLmFzc2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMoTW9ja1dpbkZpbGVTeXN0ZW0oKSkK
LQotICAgIGRlZiB0ZXN0X3dpbihzZWxmKToKLSAgICAgICAgIyBUaGlzIHRlc3RzIHRoZSBhY3R1
YWwgd2luZG93cyBwbGF0Zm9ybSwgdG8gZW5zdXJlIHdlIGdldCB0aGUgc2FtZQotICAgICAgICAj
IHJlc3VsdHMgdGhhdCB3ZSBnZXQgaW4gdGVzdF9tb2NrZWRfd2luKCkuCi0gICAgICAgIGlmIHN5
cy5wbGF0Zm9ybSAhPSAnd2luJzoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmFz
c2VydF9maWxlc3lzdGVtX25vcm1hbGl6ZXMoRmlsZVN5c3RlbSgpKQotCi0KLWlmIF9fbmFtZV9f
ID09ICdfX21haW5fXyc6Ci0gICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzX2ludGVncmF0aW9u
dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRf
dGVzdHNfaW50ZWdyYXRpb250ZXN0LnB5CmluZGV4IDVkMzdjZmUuLmY2YWRjZmMgMTAwNzU1Ci0t
LSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHNf
aW50ZWdyYXRpb250ZXN0LnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3J1bl93ZWJraXRfdGVzdHNfaW50ZWdyYXRpb250ZXN0LnB5CkBAIC02Niw3ICs2Niw3IEBA
IGZyb20gd2Via2l0cHkuY29tbW9uLmhvc3RfbW9jayBpbXBvcnQgTW9ja0hvc3QKIGZyb20gd2Vi
a2l0cHkubGF5b3V0X3Rlc3RzIGltcG9ydCBwb3J0CiBmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0
cyBpbXBvcnQgcnVuX3dlYmtpdF90ZXN0cwogZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9y
dC50ZXN0IGltcG9ydCBUZXN0UG9ydCwgVGVzdERyaXZlciwgdW5pdF90ZXN0X2ZpbGVzeXN0ZW0K
LWZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQudGVzdF9maWxlcyBpbXBvcnQgaXNfcmVm
ZXJlbmNlX2h0bWxfZmlsZQorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydC5iYXNlIGlt
cG9ydCBpc19yZWZlcmVuY2VfaHRtbF9maWxlCiBmcm9tIHdlYmtpdHB5LnB5dGhvbjI0LnZlcnNp
b25pbmcgaW1wb3J0IGNvbXBhcmVfdmVyc2lvbgogZnJvbSB3ZWJraXRweS50ZXN0LnNraXAgaW1w
b3J0IHNraXBfaWYKIApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3Jt
YW5jZV90ZXN0cy9fX2luaXRfXy5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFu
Y2VfdGVzdHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
ZWY2NWJlZQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvcGVyZm9y
bWFuY2VfdGVzdHMvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorIyBSZXF1aXJlZCBmb3IgUHl0
aG9uIHRvIHNlYXJjaCB0aGlzIGRpcmVjdG9yeSBmb3IgbW9kdWxlIGZpbGVzCmRpZmYgLS1naXQg
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3BlcmZ0ZXN0c3J1bm5l
ci5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvcGVyZm9ybWFuY2VfdGVzdHMvcGVyZnRlc3Rz
cnVubmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTc4Y2UKLS0t
IC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3BlcmZvcm1hbmNlX3Rlc3Rz
L3BlcmZ0ZXN0c3J1bm5lci5weQpAQCAtMCwwICsxLDE2OCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0
aG9uCisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0
aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiUnVuIEluc3BlY3RvcidzIHBlcmYgdGVzdHMgaW4g
cGVyZiBtb2RlLiIiIgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQg
cmUKK2ltcG9ydCBzeXMKKworZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0IGZpbmRfZmlsZXMK
K2Zyb20gd2Via2l0cHkuY29tbW9uLmhvc3QgaW1wb3J0IEhvc3QKK2Zyb20gd2Via2l0cHkubGF5
b3V0X3Rlc3RzLnBvcnQuZHJpdmVyIGltcG9ydCBEcml2ZXJJbnB1dAorZnJvbSB3ZWJraXRweS5s
YXlvdXRfdGVzdHMudmlld3MgaW1wb3J0IHByaW50aW5nCisKK19sb2cgPSBsb2dnaW5nLmdldExv
Z2dlcihfX25hbWVfXykKKworCitjbGFzcyBQZXJmVGVzdHNSdW5uZXIob2JqZWN0KToKKyAgICBf
cGVyZl90ZXN0c19iYXNlX2RpciA9ICdQZXJmb3JtYW5jZVRlc3RzJworICAgIF9yZXN1bHRfcmVn
ZXggPSByZS5jb21waWxlKCdeUkVTVUxUIC4qJCcpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwg
cGVyZl90ZXN0c19kaXIsIHJlZ3VsYXJfb3V0cHV0PXN5cy5zdGRlcnIsIGJ1aWxkYm90X291dHB1
dD1zeXMuc3Rkb3V0LCBhcmdzPU5vbmUpOgorICAgICAgICBzZWxmLl9wZXJmX3Rlc3RzX2RpciA9
IHBlcmZfdGVzdHNfZGlyCisgICAgICAgIHNlbGYuX2J1aWxkYm90X291dHB1dCA9IGJ1aWxkYm90
X291dHB1dAorICAgICAgICBzZWxmLl9vcHRpb25zLCBzZWxmLl9hcmdzID0gc2VsZi5fcGFyc2Vf
YXJncyhhcmdzKQorICAgICAgICBzZWxmLl9ob3N0ID0gSG9zdCgpCisgICAgICAgIHNlbGYuX2hv
c3QuX2luaXRpYWxpemVfc2NtKCkKKyAgICAgICAgc2VsZi5fcG9ydCA9IHNlbGYuX2hvc3QucG9y
dF9mYWN0b3J5LmdldChzZWxmLl9vcHRpb25zLnBsYXRmb3JtLCBzZWxmLl9vcHRpb25zKQorICAg
ICAgICBzZWxmLl9wcmludGVyID0gcHJpbnRpbmcuUHJpbnRlcihzZWxmLl9wb3J0LCBzZWxmLl9v
cHRpb25zLCByZWd1bGFyX291dHB1dCwgYnVpbGRib3Rfb3V0cHV0LCBjb25maWd1cmVfbG9nZ2lu
Zz1GYWxzZSkKKyAgICAgICAgc2VsZi5fd2Via2l0X2Jhc2VfZGlyX2xlbiA9IGxlbihzZWxmLl9w
b3J0LmNvbmZpZy53ZWJraXRfYmFzZV9kaXIoKSkKKworICAgIGRlZiBfcGFyc2VfYXJncyhzZWxm
LCBhcmdzPU5vbmUpOgorICAgICAgICBwcmludF9vcHRpb25zID0gcHJpbnRpbmcucHJpbnRfb3B0
aW9ucygpCisKKyAgICAgICAgcGVyZl9vcHRpb25fbGlzdCA9IFsKKyAgICAgICAgICAgIG9wdHBh
cnNlLm1ha2Vfb3B0aW9uKCctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PSdE
ZWJ1ZycsIGRlc3Q9ImNvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaGVscD0nU2V0IHRoZSBjb25maWd1cmF0aW9uIHRvIERlYnVnJyksCisgICAgICAgICAg
ICBvcHRwYXJzZS5tYWtlX29wdGlvbignLS1yZWxlYXNlJywgYWN0aW9uPSdzdG9yZV9jb25zdCcs
IGNvbnN0PSdSZWxlYXNlJywgZGVzdD0iY29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBoZWxwPSdTZXQgdGhlIGNvbmZpZ3VyYXRpb24gdG8gUmVsZWFzZScp
LAorICAgICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi0tcGxhdGZvcm0iLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iU3BlY2lmeSBwb3J0L3BsYXRmb3JtIGJl
aW5nIHRlc3RlZCAoaS5lLiBjaHJvbWl1bS1tYWMpIiksCisgICAgICAgICAgICBvcHRwYXJzZS5t
YWtlX29wdGlvbigiLS1idWlsZC1kaXJlY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaGVscD0iUGF0aCB0byB0aGUgZGlyZWN0b3J5IHVuZGVyIHdoaWNoIGJ1aWxkIGZp
bGVzIGFyZSBrZXB0IChzaG91bGQgbm90IGluY2x1ZGUgY29uZmlndXJhdGlvbikiKSwKKyAgICAg
ICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItLXRpbWUtb3V0LW1zIiwgZGVmYXVsdD0zMDAw
MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNldCB0aGUgdGltZW91
dCBmb3IgZWFjaCB0ZXN0IiksCisgICAgICAgICAgICBdCisKKyAgICAgICAgb3B0aW9uX2xpc3Qg
PSAocGVyZl9vcHRpb25fbGlzdCArIHByaW50X29wdGlvbnMpCisgICAgICAgIHJldHVybiBvcHRw
YXJzZS5PcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9uX2xpc3QpLnBhcnNlX2FyZ3MoYXJn
cykKKworICAgIGRlZiBfY29sbGVjdF90ZXN0cyhzZWxmLCB3ZWJraXRfYmFzZSwgZmlsZXN5c3Rl
bT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsaXN0IG9mIHRlc3RzIGZvdW5kLiIiIgor
CisgICAgICAgIGRlZiBfaXNfdGVzdF9maWxlKGZpbGVzeXN0ZW0sIGRpcm5hbWUsIGZpbGVuYW1l
KToKKyAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5lbmRzd2l0aCgnLmh0bWwnKQorCisgICAg
ICAgIGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtIG9yIHNlbGYuX2hvc3QuZmlsZXN5c3RlbQorICAg
ICAgICBiYXNlX2RpciA9IGZpbGVzeXN0ZW0uam9pbih3ZWJraXRfYmFzZSwgc2VsZi5fcGVyZl90
ZXN0c19iYXNlX2Rpciwgc2VsZi5fcGVyZl90ZXN0c19kaXIpCisgICAgICAgIHJldHVybiBmaW5k
X2ZpbGVzLmZpbmQoZmlsZXN5c3RlbSwgYmFzZV9kaXIsIHBhdGhzPXNlbGYuX2FyZ3MsIGZpbGVf
ZmlsdGVyPV9pc190ZXN0X2ZpbGUpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBpZiBz
ZWxmLl9vcHRpb25zLmhlbHBfcHJpbnRpbmc6CisgICAgICAgICAgICBzZWxmLl9wcmludGVyLmhl
bHBfcHJpbnRpbmcoKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRlci5jbGVhbnVwKCkKKyAgICAg
ICAgICAgIHJldHVybiAwCisKKyAgICAgICAgaWYgbm90IHNlbGYuX3BvcnQuY2hlY2tfYnVpbGQo
bmVlZHNfaHR0cD1GYWxzZSk6CisgICAgICAgICAgICBfbG9nLmVycm9yKCJCdWlsZCBub3QgdXAg
dG8gZGF0ZSBmb3IgJXMiICUgc2VsZi5fcG9ydC5fcGF0aF90b19kcml2ZXIoKSkKKyAgICAgICAg
ICAgIHJldHVybiAtMQorCisgICAgICAgICMgV2Ugd3JhcCBhbnkgcGFydHMgb2YgdGhlIHJ1biB0
aGF0IGFyZSBzbG93IG9yIGxpa2VseSB0byByYWlzZSBleGNlcHRpb25zCisgICAgICAgICMgaW4g
YSB0cnkvZmluYWxseSB0byBlbnN1cmUgdGhhdCB3ZSBjbGVhbiB1cCB0aGUgbG9nZ2luZyBjb25m
aWd1cmF0aW9uLgorICAgICAgICB1bmV4cGVjdGVkID0gLTEKKyAgICAgICAgdHJ5OgorICAgICAg
ICAgICAgdGVzdHMgPSBzZWxmLl9jb2xsZWN0X3Rlc3RzKHNlbGYuX3BvcnQud2Via2l0X2Jhc2Uo
KSkKKyAgICAgICAgICAgIHVuZXhwZWN0ZWQgPSBzZWxmLl9ydW5fdGVzdHNfc2V0KHRlc3RzLCBz
ZWxmLl9wb3J0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fcHJpbnRlci5j
bGVhbnVwKCkKKworICAgICAgICByZXR1cm4gdW5leHBlY3RlZAorCisgICAgZGVmIF9ydW5fdGVz
dHNfc2V0KHNlbGYsIHRlc3RzLCBwb3J0KToKKyAgICAgICAgcmVzdWx0X2NvdW50ID0gbGVuKHRl
c3RzKQorICAgICAgICBleHBlY3RlZCA9IDAKKyAgICAgICAgdW5leHBlY3RlZCA9IDAKKyAgICAg
ICAgc2VsZi5fcHJpbnRlci5wcmludF9vbmVfbGluZV9zdW1tYXJ5KHJlc3VsdF9jb3VudCwgMCwg
MCkKKyAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFydCA9IEZhbHNlCisgICAgICAgIGRyaXZlciA9
IE5vbmUKKworICAgICAgICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICAgICAgICAgIGlmIGRyaXZl
cl9uZWVkX3Jlc3RhcnQ6CisgICAgICAgICAgICAgICAgX2xvZy5kZWJ1ZygiJXMga2lsbGluZyBk
cml2ZXIiICUgdGVzdCkKKyAgICAgICAgICAgICAgICBkcml2ZXIuc3RvcCgpCisgICAgICAgICAg
ICAgICAgZHJpdmVyID0gTm9uZQorICAgICAgICAgICAgaWYgbm90IGRyaXZlcjoKKyAgICAgICAg
ICAgICAgICBkcml2ZXIgPSBwb3J0LmNyZWF0ZV9kcml2ZXIod29ya2VyX251bWJlcj0xKQorCisg
ICAgICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNlbGYuX3J1bl9z
aW5nbGVfdGVzdCh0ZXN0LCBkcml2ZXIpCisgICAgICAgICAgICBpZiB0ZXN0X2ZhaWxlZDoKKyAg
ICAgICAgICAgICAgICB1bmV4cGVjdGVkID0gdW5leHBlY3RlZCArIDEKKyAgICAgICAgICAgIGVs
c2U6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZCArIDEKKworICAgICAgICAg
ICAgc2VsZi5fcHJpbnRlci5wcmludF9vbmVfbGluZV9zdW1tYXJ5KHJlc3VsdF9jb3VudCwgZXhw
ZWN0ZWQsIHVuZXhwZWN0ZWQpCisKKyAgICAgICAgaWYgZHJpdmVyOgorICAgICAgICAgICAgZHJp
dmVyLnN0b3AoKQorCisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkCisKKyAgICBkZWYgX3J1bl9z
aW5nbGVfdGVzdChzZWxmLCB0ZXN0LCBkcml2ZXIpOgorICAgICAgICB0ZXN0X2ZhaWxlZCA9IEZh
bHNlCisgICAgICAgIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBGYWxzZQorICAgICAgICBvdXRwdXQg
PSBkcml2ZXIucnVuX3Rlc3QoRHJpdmVySW5wdXQodGVzdCwgc2VsZi5fb3B0aW9ucy50aW1lX291
dF9tcywgTm9uZSwgRmFsc2UpKQorCisgICAgICAgIGlmIG91dHB1dC50ZXh0ID09IE5vbmU6Cisg
ICAgICAgICAgICB0ZXN0X2ZhaWxlZCA9IFRydWUKKyAgICAgICAgZWxpZiBvdXRwdXQudGltZW91
dDoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50ZXIud3JpdGUoJ3RpbWVvdXQ6ICVzJyAlIHRlc3Rb
c2VsZi5fd2Via2l0X2Jhc2VfZGlyX2xlbiArIDE6XSkKKyAgICAgICAgICAgIHRlc3RfZmFpbGVk
ID0gVHJ1ZQorICAgICAgICAgICAgZHJpdmVyX25lZWRfcmVzdGFydCA9IFRydWUKKyAgICAgICAg
ZWxpZiBvdXRwdXQuY3Jhc2g6CisgICAgICAgICAgICBzZWxmLl9wcmludGVyLndyaXRlKCdjcmFz
aDogJXMnICUgdGVzdFtzZWxmLl93ZWJraXRfYmFzZV9kaXJfbGVuICsgMTpdKQorICAgICAgICAg
ICAgZHJpdmVyX25lZWRfcmVzdGFydCA9IFRydWUKKyAgICAgICAgICAgIHRlc3RfZmFpbGVkID0g
VHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ290X2FfcmVzdWx0ID0gRmFsc2UKKyAg
ICAgICAgICAgIGZvciBsaW5lIGluIHJlLnNwbGl0KCdcbicsIG91dHB1dC50ZXh0KToKKyAgICAg
ICAgICAgICAgICBpZiBzZWxmLl9yZXN1bHRfcmVnZXgubWF0Y2gobGluZSk6CisgICAgICAgICAg
ICAgICAgICAgIHNlbGYuX2J1aWxkYm90X291dHB1dC53cml0ZSgiJXNcbiIgJSBsaW5lKQorICAg
ICAgICAgICAgICAgICAgICBnb3RfYV9yZXN1bHQgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxp
ZiBub3QgbGVuKGxpbmUpID09IDA6CisgICAgICAgICAgICAgICAgICAgIHRlc3RfZmFpbGVkID0g
VHJ1ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wcmludGVyLndyaXRlKCIlcyIgJSBsaW5l
KQorICAgICAgICAgICAgdGVzdF9mYWlsZWQgPSB0ZXN0X2ZhaWxlZCBvciBub3QgZ290X2FfcmVz
dWx0CisKKyAgICAgICAgaWYgbGVuKG91dHB1dC5lcnJvcik6CisgICAgICAgICAgICBzZWxmLl9w
cmludGVyLndyaXRlKCdlcnJvcjpcbiVzJyAlIG91dHB1dC5lcnJvcikKKyAgICAgICAgICAgIHRl
c3RfZmFpbGVkID0gVHJ1ZQorCisgICAgICAgIHJldHVybiB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25l
ZWRfcmVzdGFydApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5j
ZV90ZXN0cy9wZXJmdGVzdHNydW5uZXJfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L3BlcmZvcm1hbmNlX3Rlc3RzL3BlcmZ0ZXN0c3J1bm5lcl91bml0dGVzdC5weQpuZXcgZmls
ZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ODJmNWU3Ci0tLSAvZGV2L251bGwKKysrIGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9wZXJmb3JtYW5jZV90ZXN0cy9wZXJmdGVzdHNydW5uZXJf
dW5pdHRlc3QucHkKQEAgLTAsMCArMSwxNDMgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjIENvcHly
aWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRp
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
IERBTUFHRS4KKworIiIiVW5pdCB0ZXN0cyBmb3IgcnVuX3BlcmZfdGVzdHMuIiIiCisKK2ltcG9y
dCB1bml0dGVzdAorCitmcm9tIHdlYmtpdHB5LmNvbW1vbiBpbXBvcnQgYXJyYXlfc3RyZWFtCitm
cm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbV9tb2NrIGltcG9ydCBNb2NrRmls
ZVN5c3RlbQorZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydC5kcml2ZXIgaW1wb3J0IERy
aXZlcklucHV0LCBEcml2ZXJPdXRwdXQKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnZpZXdz
IGltcG9ydCBwcmludGluZworZnJvbSB3ZWJraXRweS5wZXJmb3JtYW5jZV90ZXN0cy5wZXJmdGVz
dHNydW5uZXIgaW1wb3J0IFBlcmZUZXN0c1J1bm5lcgorCisKK2NsYXNzIE1haW5UZXN0KHVuaXR0
ZXN0LlRlc3RDYXNlKToKKyAgICBjbGFzcyBUZXN0UG9ydDoKKyAgICAgICAgZGVmIGNyZWF0ZV9k
cml2ZXIoc2VsZiwgd29ya2VyX251bWJlcj1Ob25lKToKKyAgICAgICAgICAgIHJldHVybiBNYWlu
VGVzdC5UZXN0RHJpdmVyKCkKKworICAgIGNsYXNzIFRlc3REcml2ZXI6CisgICAgICAgIGRlZiBy
dW5fdGVzdChzZWxmLCBkcml2ZXJfaW5wdXQpOgorICAgICAgICAgICAgdGV4dCA9ICcnCisgICAg
ICAgICAgICB0aW1lb3V0ID0gRmFsc2UKKyAgICAgICAgICAgIGNyYXNoID0gRmFsc2UKKyAgICAg
ICAgICAgIGlmIGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0gJ3Bhc3MuaHRtbCc6CisgICAgICAg
ICAgICAgICAgdGV4dCA9ICdSRVNVTFQgZ3JvdXBfbmFtZTogdGVzdF9uYW1lPSA0MiBtcycKKyAg
ICAgICAgICAgIGVsaWYgZHJpdmVyX2lucHV0LnRlc3RfbmFtZSA9PSAndGltZW91dC5odG1sJzoK
KyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBkcml2ZXJf
aW5wdXQudGVzdF9uYW1lID09ICdmYWlsZWQuaHRtbCc6CisgICAgICAgICAgICAgICAgdGV4dCA9
IE5vbmUKKyAgICAgICAgICAgIGVsaWYgZHJpdmVyX2lucHV0LnRlc3RfbmFtZSA9PSAndG9uZ3Vl
eS5odG1sJzoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gJ3dlIGFyZSBub3QgZXhwZWN0aW5nIGFu
IG91dHB1dCBmcm9tIHBlcmYgdGVzdHMgYnV0IFJFU1VMVCBibGFibGFibGEnCisgICAgICAgICAg
ICBlbGlmIGRyaXZlcl9pbnB1dC50ZXN0X25hbWUgPT0gJ2NyYXNoLmh0bWwnOgorICAgICAgICAg
ICAgICAgIGNyYXNoID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIERyaXZlck91dHB1dCh0ZXh0
LCAnJywgJycsICcnLCBjcmFzaD1jcmFzaCwgdGltZW91dD10aW1lb3V0KQorCisgICAgICAgIGRl
ZiBzdG9wKHNlbGYpOgorICAgICAgICAgICAgIiIiZG8gbm90aGluZyIiIgorCisgICAgZGVmIGNy
ZWF0ZV9ydW5uZXIoc2VsZiwgYnVpbGRib3Rfb3V0cHV0PU5vbmUpOgorICAgICAgICBidWlsZGJv
dF9vdXRwdXQgPSBidWlsZGJvdF9vdXRwdXQgb3IgYXJyYXlfc3RyZWFtLkFycmF5U3RyZWFtKCkK
KyAgICAgICAgcmVndWxhcl9vdXRwdXQgPSBhcnJheV9zdHJlYW0uQXJyYXlTdHJlYW0oKQorICAg
ICAgICByZXR1cm4gUGVyZlRlc3RzUnVubmVyKCcnLCByZWd1bGFyX291dHB1dCwgYnVpbGRib3Rf
b3V0cHV0LCBhcmdzPVtdKQorCisgICAgZGVmIHJ1bl90ZXN0KHNlbGYsIHRlc3RfbmFtZSk6Cisg
ICAgICAgIHJ1bm5lciA9IHNlbGYuY3JlYXRlX3J1bm5lcigpCisgICAgICAgIGRyaXZlciA9IE1h
aW5UZXN0LlRlc3REcml2ZXIoKQorICAgICAgICByZXR1cm4gcnVubmVyLl9ydW5fc2luZ2xlX3Rl
c3QodGVzdF9uYW1lLCBkcml2ZXIpCisKKyAgICBkZWYgdGVzdF9ydW5fcGFzc2luZ190ZXN0KHNl
bGYpOgorICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNlbGYucnVu
X3Rlc3QoJ3Bhc3MuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGVzdF9mYWlsZWQp
CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZHJpdmVyX25lZWRfcmVzdGFydCkKKworICAgIGRl
ZiB0ZXN0X3J1bl9zaWxlbnRfdGVzdChzZWxmKToKKyAgICAgICAgdGVzdF9mYWlsZWQsIGRyaXZl
cl9uZWVkX3Jlc3RhcnQgPSBzZWxmLnJ1bl90ZXN0KCdzaWxlbnQuaHRtbCcpCisgICAgICAgIHNl
bGYuYXNzZXJ0VHJ1ZSh0ZXN0X2ZhaWxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkcml2
ZXJfbmVlZF9yZXN0YXJ0KQorCisgICAgZGVmIHRlc3RfcnVuX2ZhaWxlZF90ZXN0KHNlbGYpOgor
ICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25lZWRfcmVzdGFydCA9IHNlbGYucnVuX3Rlc3Qo
J2ZhaWxlZC5odG1sJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RfZmFpbGVkKQorICAg
ICAgICBzZWxmLmFzc2VydEZhbHNlKGRyaXZlcl9uZWVkX3Jlc3RhcnQpCisKKyAgICBkZWYgdGVz
dF9ydW5fdG9uZ3VleV90ZXN0KHNlbGYpOgorICAgICAgICB0ZXN0X2ZhaWxlZCwgZHJpdmVyX25l
ZWRfcmVzdGFydCA9IHNlbGYucnVuX3Rlc3QoJ3Rvbmd1ZXkuaHRtbCcpCisgICAgICAgIHNlbGYu
YXNzZXJ0VHJ1ZSh0ZXN0X2ZhaWxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkcml2ZXJf
bmVlZF9yZXN0YXJ0KQorCisgICAgZGVmIHRlc3RfcnVuX3RpbWVvdXRfdGVzdChzZWxmKToKKyAg
ICAgICAgdGVzdF9mYWlsZWQsIGRyaXZlcl9uZWVkX3Jlc3RhcnQgPSBzZWxmLnJ1bl90ZXN0KCd0
aW1lb3V0Lmh0bWwnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdF9mYWlsZWQpCisgICAg
ICAgIHNlbGYuYXNzZXJ0VHJ1ZShkcml2ZXJfbmVlZF9yZXN0YXJ0KQorCisgICAgZGVmIHRlc3Rf
cnVuX2NyYXNoX3Rlc3Qoc2VsZik6CisgICAgICAgIHRlc3RfZmFpbGVkLCBkcml2ZXJfbmVlZF9y
ZXN0YXJ0ID0gc2VsZi5ydW5fdGVzdCgnY3Jhc2guaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0
VHJ1ZSh0ZXN0X2ZhaWxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRyaXZlcl9uZWVkX3Jl
c3RhcnQpCisKKyAgICBkZWYgdGVzdF9ydW5fdGVzdF9zZXQoc2VsZik6CisgICAgICAgIGJ1aWxk
Ym90X291dHB1dCA9IGFycmF5X3N0cmVhbS5BcnJheVN0cmVhbSgpCisgICAgICAgIHJ1bm5lciA9
IHNlbGYuY3JlYXRlX3J1bm5lcihidWlsZGJvdF9vdXRwdXQpCisgICAgICAgIHBvcnQgPSBNYWlu
VGVzdC5UZXN0UG9ydCgpCisgICAgICAgIHRlc3RzID0gWydwYXNzLmh0bWwnLCAnc2lsZW50Lmh0
bWwnLCAnZmFpbGVkLmh0bWwnLCAndG9uZ3VleS5odG1sJywgJ3RpbWVvdXQuaHRtbCcsICdjcmFz
aC5odG1sJ10KKyAgICAgICAgdW5leHBlY3RlZF9yZXN1bHRfY291bnQgPSBydW5uZXIuX3J1bl90
ZXN0c19zZXQodGVzdHMsIHBvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5leHBlY3Rl
ZF9yZXN1bHRfY291bnQsIGxlbih0ZXN0cykgLSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
KGxlbihidWlsZGJvdF9vdXRwdXQuZ2V0KCkpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
KGJ1aWxkYm90X291dHB1dC5nZXQoKVswXSwgJ1JFU1VMVCBncm91cF9uYW1lOiB0ZXN0X25hbWU9
IDQyIG1zXG4nKQorCisgICAgZGVmIHRlc3RfY29sbGVjdF90ZXN0cyhzZWxmKToKKyAgICAgICAg
cnVubmVyID0gc2VsZi5jcmVhdGVfcnVubmVyKCkKKyAgICAgICAgd2Via2l0X2Jhc2UgPSAnL3Rl
c3QuY2hlY2tvdXQnCisgICAgICAgIGZpbGVzeXN0ZW0gPSBNb2NrRmlsZVN5c3RlbSgpCisgICAg
ICAgIGZpbGVuYW1lID0gZmlsZXN5c3RlbS5qb2luKHdlYmtpdF9iYXNlLCAnUGVyZm9ybWFuY2VU
ZXN0cycsICdhX2ZpbGUuaHRtbCcpCisgICAgICAgIGZpbGVzeXN0ZW0uZmlsZXNbZmlsZW5hbWVd
ID0gJ2EgY29udGVudCcKKyAgICAgICAgdGVzdHMgPSBydW5uZXIuX2NvbGxlY3RfdGVzdHMod2Vi
a2l0X2Jhc2UsIGZpbGVzeXN0ZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRlc3Rz
KSwgMSkKKworICAgIGRlZiB0ZXN0X3BhcnNlX2FyZ3Moc2VsZik6CisgICAgICAgIHJ1bm5lciA9
IHNlbGYuY3JlYXRlX3J1bm5lcigpCisgICAgICAgIG9wdGlvbnMsIGFyZ3MgPSBydW5uZXIuX3Bh
cnNlX2FyZ3MoWworICAgICAgICAgICAgICAgICctLXZlcmJvc2UnLAorICAgICAgICAgICAgICAg
ICctLWJ1aWxkLWRpcmVjdG9yeT1mb2xkZXI0MicsCisgICAgICAgICAgICAgICAgJy0tcGxhdGZv
cm09cGxhdGZvcm00MicsCisgICAgICAgICAgICAgICAgJy0tdGltZS1vdXQtbXM9NDInLAorICAg
ICAgICAgICAgICAgICctLWRlYnVnJywgJ2FuX2FyZyddKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKG9wdGlvbnMudmVyYm9zZSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRp
b25zLmhlbHBfcHJpbnRpbmcsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9u
cy5idWlsZF9kaXJlY3RvcnksICdmb2xkZXI0MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwo
b3B0aW9ucy5wbGF0Zm9ybSwgJ3BsYXRmb3JtNDInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
KG9wdGlvbnMudGltZV9vdXRfbXMsICc0MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0
aW9ucy5jb25maWd1cmF0aW9uLCAnRGVidWcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9w
dGlvbnMucHJpbnRfb3B0aW9ucywgTm9uZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18n
OgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS90b29sL2NvbW1hbmRzL3JlYmFzZWxpbmUucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvY29tbWFuZHMvcmViYXNlbGluZS5weQppbmRleCA5ZWEzOWEzLi41ZGIzMzMzIDEwMDY0NAot
LS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZS5weQor
KysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvcmViYXNlbGluZS5weQpA
QCAtNDEsNyArNDEsNiBAQCBmcm9tIHdlYmtpdHB5LmxheW91dF90ZXN0cy5jb250cm9sbGVycy50
ZXN0X3Jlc3VsdF93cml0ZXIgaW1wb3J0IFRlc3RSZXN1bHRXcml0ZQogZnJvbSB3ZWJraXRweS5s
YXlvdXRfdGVzdHMubW9kZWxzIGltcG9ydCB0ZXN0X2ZhaWx1cmVzCiBmcm9tIHdlYmtpdHB5Lmxh
eW91dF90ZXN0cy5tb2RlbHMudGVzdF9leHBlY3RhdGlvbnMgaW1wb3J0IFRlc3RFeHBlY3RhdGlv
bnMKIGZyb20gd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQgaW1wb3J0IGJ1aWxkZXJzCi1mcm9t
IHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0IGltcG9ydCB0ZXN0X2ZpbGVzCiBmcm9tIHdlYmtp
dHB5LnRvb2wuZ3JhbW1hciBpbXBvcnQgcGx1cmFsaXplCiBmcm9tIHdlYmtpdHB5LnRvb2wubXVs
dGljb21tYW5kdG9vbCBpbXBvcnQgQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQKIApAQCAtMTE5
LDcgKzExOCw3IEBAIGNsYXNzIE9wdGltaXplQmFzZWxpbmVzKEFic3RyYWN0RGVjbGFyYXRpdmVD
b21tYW5kKToKICAgICAgICAgc2VsZi5fYmFzZWxpbmVfb3B0aW1pemVyID0gQmFzZWxpbmVPcHRp
bWl6ZXIodG9vbCkKICAgICAgICAgc2VsZi5fcG9ydCA9IHRvb2wucG9ydF9mYWN0b3J5LmdldCgi
Y2hyb21pdW0td2luLXdpbjciKSAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgc2VsZWN0YWJsZS4K
IAotICAgICAgICBmb3IgdGVzdF9uYW1lIGluIG1hcChzZWxmLl90b190ZXN0X25hbWUsIHRlc3Rf
ZmlsZXMuZmluZChzZWxmLl9wb3J0LCBhcmdzKSk6CisgICAgICAgIGZvciB0ZXN0X25hbWUgaW4g
bWFwKHNlbGYuX3RvX3Rlc3RfbmFtZSwgc2VsZi5fcG9ydC5maW5kX3Rlc3RfZmlsZXMoYXJncykp
OgogICAgICAgICAgICAgcHJpbnQgIk9wdGltaXppbmcgJXMuIiAlIHRlc3RfbmFtZQogICAgICAg
ICAgICAgc2VsZi5fb3B0aW1pemVfYmFzZWxpbmUodGVzdF9uYW1lKQogCkBAIC0xNDksNyArMTQ4
LDcgQEAgY2xhc3MgQW5hbHl6ZUJhc2VsaW5lcyhBYnN0cmFjdERlY2xhcmF0aXZlQ29tbWFuZCk6
CiAgICAgICAgIHNlbGYuX2Jhc2VsaW5lX29wdGltaXplciA9IEJhc2VsaW5lT3B0aW1pemVyKHRv
b2wpCiAgICAgICAgIHNlbGYuX3BvcnQgPSB0b29sLnBvcnRfZmFjdG9yeS5nZXQoImNocm9taXVt
LXdpbi13aW43IikgICMgRklYTUU6IFRoaXMgc2hvdWxkIGJlIHNlbGVjdGFibGUuCiAKLSAgICAg
ICAgZm9yIHRlc3RfbmFtZSBpbiBtYXAoc2VsZi5fdG9fdGVzdF9uYW1lLCB0ZXN0X2ZpbGVzLmZp
bmQoc2VsZi5fcG9ydCwgYXJncykpOgorICAgICAgICBmb3IgdGVzdF9uYW1lIGluIG1hcChzZWxm
Ll90b190ZXN0X25hbWUsIHNlbGYuX3BvcnQuZmluZF90ZXN0X2ZpbGVzKGFyZ3MpKToKICAgICAg
ICAgICAgIHNlbGYuX2FuYWx5emVfYmFzZWxpbmUodGVzdF9uYW1lKQogCiAK
</data>
<flag name="review"
          id="116519"
          type_id="1"
          status="+"
          setter="dpranke"
    />
    <flag name="commit-queue"
          id="116635"
          type_id="3"
          status="-"
          setter="dpranke"
    />
          </attachment>
      

    </bug>

</bugzilla>