<?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>37726</bug_id>
          
          <creation_ts>2010-04-16 13:35:12 -0700</creation_ts>
          <short_desc>new-run-webkit-tests: implement a --log trace message to be able to display detailed output of an individual test run</short_desc>
          <delta_ts>2010-04-21 10:04:23 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dirk Pranke">dpranke</reporter>
          <assigned_to name="Dirk Pranke">dpranke</assigned_to>
          <cc>abarth</cc>
    
    <cc>cjerdonek</cc>
    
    <cc>eric</cc>
    
    <cc>levin</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>213397</commentid>
    <comment_count>0</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-16 13:35:12 -0700</bug_when>
    <thetext>It can be very difficult to figure out exactly what run-webkit-tests is expecting and doing when debugging tests, and it would be nice if there was an easier way of debugging things. Most of the information needed is printed during --log verbose, but it&apos;s easy to get it lost in the noise.

This patch will be the first of several designed to make using run-webkit-tests to run and debug individual tests easier by cleaning up the logging. There will also be patches coming in to split the code out into different modules and add better unit tests to make it more maintainable (reducing the amount of code in both run_webkit_tests.py and dump_render_tree_thread.py). I am splitting these into multiple bugs to make reviewing the code easier.

This patch adds a --log trace option. Sample output:

layout_tests $ new-run-webkit-tests --log trace fast/html/article-element.html fast/html/keygen.html
trace: fast/html/article-element.html
  txt: fast/html/article-element-expected.txt
  png: &lt;none&gt;
  exp: PASS
  got: PASS
 took: 0.310

trace: fast/html/keygen.html
  txt: platform/mac/fast/html/keygen-expected.txt
  png: fast/html/keygen.html
  exp: PASS
  got: PASS
 took: 0.015

All 2 tests ran as expected.
layout_tests $</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213399</commentid>
    <comment_count>1</comment_count>
      <attachid>53558</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-16 13:41:27 -0700</bug_when>
    <thetext>Created attachment 53558
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213412</commentid>
    <comment_count>2</comment_count>
      <attachid>53561</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-16 13:55:36 -0700</bug_when>
    <thetext>Created attachment 53561
re-sync to tip of tree to merge some things</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213414</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-16 13:59:41 -0700</bug_when>
    <thetext>Attachment 53561 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKitTools/Scripts/webkitpy/layout_tests/layout_package/dump_render_tree_thread.py:364:  trailing whitespace  [pep8/W291] [5]
WebKitTools/Scripts/webkitpy/layout_tests/layout_package/dump_render_tree_thread.py:429:  trailing whitespace  [pep8/W291] [5]
Total errors found: 2 in 4 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>213444</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-16 15:02:19 -0700</bug_when>
    <thetext>Nifty.  I could see this information being always printed into results.html as being useful (in some slightly more condense form).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213445</commentid>
    <comment_count>5</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-04-16 15:09:12 -0700</bug_when>
    <thetext>Drive by comment: This output seems really useful for tracking down unexpected failures. Would be nice if this output were the default for any unexpected failures (but not for passes or expected failures).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213484</commentid>
    <comment_count>6</comment_count>
      <attachid>53578</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-16 16:33:18 -0700</bug_when>
    <thetext>Created attachment 53578
fix style nits</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213489</commentid>
    <comment_count>7</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-16 16:40:57 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Drive by comment: This output seems really useful for tracking down unexpected
&gt; failures. Would be nice if this output were the default for any unexpected
&gt; failures (but not for passes or expected failures).

Ojan, yeah, you&apos;re probably right. Let me land this first series of changes and then I can look into changing that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213491</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-04-16 16:45:13 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Created an attachment (id=53578) [details]

I have several comments on this patch if it can wait until tonight.  Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213498</commentid>
    <comment_count>9</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-16 16:57:56 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #6)
&gt; &gt; Created an attachment (id=53578) [details] [details]
&gt; 
&gt; I have several comments on this patch if it can wait until tonight.  Thanks.

Sure, I can wait. I&apos;ll probably go ahead and post the other patches so you can get a sense of where I&apos;m going with this. Hopefully that won&apos;t result in too much re-merging down the road.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213591</commentid>
    <comment_count>10</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-04-17 01:34:57 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Created an attachment (id=53578) [details]

Here are several comments to consider that are mostly stylistic.  If possible, I&apos;d like to provide feedback on the substance of the patch after you give consideration to these comments.

--- a/WebKitTools/ChangeLog

+        https://bugs.webkit.org/show_bug.cgi?id=37726
+
+        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
+          - use the newly exposed TestResult class and implement
+            --log trace
+        * Scripts/webkitpy/layout_tests/layout_package/dump_render_thread.py:
+          - rename TestStats to TestResult and make it more public, resulting
+            in cleaner code

It looks like the ChangeLog is missing an entry for--
  WebKitTools/Scripts/webkitpy/layout_tests/layout_package/test_expectations.py

--- a/WebKitTools/Scripts/webkitpy/layout_tests/layout_package/dump_render_tree_thread.py

@@ -54,8 +54,8 @@ _log = logging.getLogger(&quot;webkitpy.layout_tests.layout_package.&quot;
 def process_output(port, test_info, test_types, test_args, configuration,
                    output_dir, crash, timeout, test_run_time, actual_checksum,
                    output, error):
-    &quot;&quot;&quot;Receives the output from a DumpRenderTree process, subjects it to a number
-    of tests, and returns a list of failure types the test produced.
+    &quot;&quot;&quot;Receives the output from a DumpRenderTree process, subjects it to a
+    number of tests, and returns a list of failure types the test produced.

Per PEP8, the first line of a docstring should fit on one line and be 
followed by a blank line.  Also per PEP8, the first line should be phrased
as a command, for example &quot;Process DumpRenderTree output, and return....&quot;

(By the way, that parameter list is a bit long.  It should probably be
refactored to have a much shorter parameter list.)

@@ -66,7 +66,7 @@ def process_output(port, test_info, test_types, test_args, configuration,
       configuration: Debug or Release
       output_dir: directory to put crash stack traces into
 
-    Returns: a list of failure objects and times for the test being processed
+    Returns: a TestResult object
     &quot;&quot;&quot;

Per PEP8, a blank line should separate the final line of a multi-line
docstring and the triple quotes.

@@ -111,16 +111,17 @@ def process_output(port, test_info, test_types, test_args, configuration,
             time.time() - start_diff_time)
 
     total_time_for_all_diffs = time.time() - start_diff_time
-    return TestStats(test_info.filename, failures, test_run_time,
+    return TestResult(test_info.filename, failures, test_run_time,
         total_time_for_all_diffs, time_for_diffs)
 
The second line should line up with the character following the left
parenthesis.  Also, when calling a function with many parameters, it&apos;s good
to use named parameters.  This is a good safety check (especially when used
in conjunction with unit tests) since it adds an additional
level of checking.
 
-class TestStats:
+class TestResult:

Classes at the bottom of your class hierarchy should really inherit from
&quot;object&quot;.  See, for example--

http://google-styleguide.googlecode.com/svn/trunk/pyguide.html#Classes

 
     def __init__(self, filename, failures, test_run_time,
                  total_time_for_all_diffs, time_for_diffs):
         self.filename = filename
         self.failures = failures
+        self.type = test_failures.determine_result_type(failures)
         self.test_run_time = test_run_time
         self.total_time_for_all_diffs = total_time_for_all_diffs
         self.time_for_diffs = time_for_diffs
         
In constructors, it is good to alphabetize the lines that set data attributes by data attribute name.

@@ -157,14 +158,14 @@ class SingleTestThread(threading.Thread):
             driver.run_test(test_info.uri.strip(), test_info.timeout,
                             test_info.image_hash)
         end = time.time()
-        self._test_stats = process_output(self._port,
+        self._test_result = process_output(self._port,
             test_info, self._test_types, self._test_args,
             self._configuration, self._output_dir, crash, timeout, end - start,
             actual_checksum, output, error)
         driver.stop()

Again, align with the left parenthesis if possible and use named parameters
for long parameter lists.
 
-    def get_test_stats(self):
-        return self._test_stats
+    def get_test_result(self):
+        return self._test_result
 
 
 class TestShellThread(threading.Thread):
@@ -201,7 +202,7 @@ class TestShellThread(threading.Thread):
         self._canceled = False
         self._exception_info = None
         self._directory_timing_stats = {}
-        self._test_stats = []
+        self._test_results = []
         self._num_tests = 0
         self._start_time = 0
         self._stop_time = 0

Alphabetize by data attribute name.

@@ -218,10 +219,10 @@ class TestShellThread(threading.Thread):
         (number of tests in that directory, time to run the tests)&quot;&quot;&quot;
         return self._directory_timing_stats
 
-    def get_individual_test_stats(self):
-        &quot;&quot;&quot;Returns a list of (test_filename, time_to_run_test,
-        total_time_for_all_diffs, time_for_diffs) tuples.&quot;&quot;&quot;
-        return self._test_stats
+    def get_test_results(self):
+        &quot;&quot;&quot;Returns the list of all tests run on this thread. Used to calculate
+        per-thread statistics.&quot;&quot;&quot;
+        return self._test_results
 
Again, phrase the first line of a doc string as a command (e.g. &quot;Return the
list...&quot; rather than &quot;Returns....&quot;) and restrict the first line to one line
followed by a blank line.
 
     def cancel(self):
         &quot;&quot;&quot;Set a flag telling this thread to quit.&quot;&quot;&quot;
@@ -317,27 +318,29 @@ class TestShellThread(threading.Thread):
             batch_count += 1
             self._num_tests += 1
             if self._options.run_singly:
-                failures = self._run_test_singly(test_info)
+                result = self._run_test_singly(test_info)
             else:
-                failures = self._run_test(test_info)
+                result = self._run_test(test_info)
 
You may wish to use the ternary operator here. 
 
             filename = test_info.filename
             tests_run_file.write(filename + &quot;\n&quot;)
-            if failures:
+            if result.failures:
                 # Check and kill DumpRenderTree if we need too.

too -&gt; to

-                if len([1 for f in failures if f.should_kill_dump_render_tree()]):
+                if len([1 for f in result.failures
+                           if f.should_kill_dump_render_tree()]):

It seems this construct can be simplified.  For example, can you use the
filter() construct instead?  The 1&apos;s don&apos;t really do anything.  Also
fix the alignment.

                 # Print the error message(s).
-                error_str = &apos;\n&apos;.join([&apos;  &apos; + f.message() for f in failures])
+                error_str = &apos;\n&apos;.join([&apos;  &apos; + f.message() for
+                                           f in result.failures])

Alignment.

                 _log.debug(&quot;%s %s failed:\n%s&quot; % (self.getName(),
                            self._port.relative_test_filename(filename),
                            error_str))
             else:
                 _log.debug(&quot;%s %s passed&quot; % (self.getName(),
                            self._port.relative_test_filename(filename)))
-            self._result_queue.put((filename, failures))
+            self._result_queue.put(result)
 
             if batch_size &gt; 0 and batch_count &gt; batch_size:
                 # Bounce the shell and reset count.
@@ -358,7 +361,7 @@ class TestShellThread(threading.Thread):
           test_info: Object containing the test filename, uri and timeout
 
         Return:
-          A list of TestFailure objects describing the error.
+          A TestResult
         &quot;&quot;&quot;

Blank line before &quot;&quot;&quot;.  Also, you&apos;re using a style here that&apos;s different
from what you&apos;re using above &quot;Returns: blah&quot; versus &quot;Return:\n  blah&quot;.

@@ -370,9 +373,9 @@ class TestShellThread(threading.Thread):
 
         worker.start()
 
-        # When we&apos;re running one test per DumpRenderTree process, we can enforce
-        # a hard timeout. the DumpRenderTree watchdog uses 2.5x the timeout
-        # We want to be larger than that.
+        # When we&apos;re running one test per DumpRenderTree process, we can
+        # enforce a hard timeout. the DumpRenderTree watchdog uses 2.5x

Per PEP8, two spaces after each period.  Also capitalize the first word
of a sentence.

+        # the timeout We want to be larger than that.

Does this sentence make sense?

         worker.join(int(test_info.timeout) * 3.0 / 1000.0)
         if worker.isAlive():
             # If join() returned with the thread still running, the
@@ -380,22 +383,21 @@ class TestShellThread(threading.Thread):
             # more we can do with it.  We have to kill all the
             # DumpRenderTrees to free it up. If we&apos;re running more than
             # one DumpRenderTree thread, we&apos;ll end up killing the other
-            # DumpRenderTrees too, introducing spurious crashes. We accept that
-            # tradeoff in order to avoid losing the rest of this thread&apos;s
-            # results.
+            # DumpRenderTrees too, introducing spurious crashes. We accept

This first sentence doesn&apos;t make sense and is not a complete sentence.

+            # that tradeoff in order to avoid losing the rest of this
+            # thread&apos;s results.
             _log.error(&apos;Test thread hung: killing all DumpRenderTrees&apos;)
             worker._driver.stop()
 
         try:
-            stats = worker.get_test_stats()
-            self._test_stats.append(stats)
-            failures = stats.failures
+            result = worker.get_test_result()
         except AttributeError, e:
             failures = []
             _log.error(&apos;Cannot get results of test: %s&apos; %
                        test_info.filename)
+            result = TestResult(test_info.filename, [], 0, 0, 0)

I would use a variable more descriptive than &quot;e&quot; -- for example &quot;err&quot;.
Also, is that variable even being used here?  If not, just use &quot;except
AttributeError:&quot;.  Finally, I would use named parameters so the reader
knows what the zeros signify.


-        return failures
+        return result
 
     def _run_test(self, test_info):
         &quot;&quot;&quot;Run a single test file using a shared DumpRenderTree process.
@@ -419,19 +421,18 @@ class TestShellThread(threading.Thread):
            self._driver.run_test(test_info.uri, test_info.timeout, image_hash)
         end = time.time()
 
-        stats = process_output(self._port, test_info, self._test_types,
+        result = process_output(self._port, test_info, self._test_types,
                                self._test_args, self._options.configuration,
                                self._options.results_directory, crash,
                                timeout, end - start, actual_checksum,
                                output, error)

Align correctly and use named parameters.

-
-        self._test_stats.append(stats)
-        return stats.failures
+        self._test_results.append(result)
+        return result
 
     def _ensure_dump_render_tree_is_running(self):
-        &quot;&quot;&quot;Start the shared DumpRenderTree, if it&apos;s not running.  Not for use when
-        running tests singly, since those each start a separate DumpRenderTree in
-        their own thread.
+        &quot;&quot;&quot;Start the shared DumpRenderTree, if it&apos;s not running.  Not for use
+        when running tests singly, since those each start a separate
+        DumpRenderTree in their own thread.
         &quot;&quot;&quot;

Blank line after first line.  The second sentence is not a complete sentence.

         if (not self._driver or self._driver.poll() is not None):
             self._driver = self._port.start_driver(

--- a/WebKitTools/Scripts/webkitpy/layout_tests/layout_package/test_expectations.py

@@ -48,6 +48,7 @@ _log = logging.getLogger(&quot;webkitpy.layout_tests.layout_package.&quot;
 # Test expectation file update action constants
 (NO_CHANGE, REMOVE_TEST, REMOVE_PLATFORM, ADD_PLATFORMS_EXCEPT_THIS) = range(4)
 
+
 def result_was_expected(result, expected_results, test_needs_rebaselining,
                         test_is_skipped):
     &quot;&quot;&quot;Returns whether we got a result we were expecting.

Use &quot;command&quot; form -- e.g. &quot;Return whether....&quot; 

@@ -61,11 +62,12 @@ def result_was_expected(result, expected_results, test_needs_rebaselining,
     if result in (IMAGE, TEXT, IMAGE_PLUS_TEXT) and FAIL in expected_results:
         return True
     if result == MISSING and test_needs_rebaselining:
-       return True
+        return True
     if result == SKIP and test_is_skipped:
-       return True
+        return True
     return False
 
+
 def remove_pixel_failures(expected_results):
     &quot;&quot;&quot;Returns a copy of the expected results for a test, except that we
     drop any pixel failures and return the remaining expectations. For example,
@@ -141,12 +143,16 @@ class TestExpectations:
         retval = []
 
         for expectation in expectations:
-            for item in TestExpectationsFile.EXPECTATIONS.items():
-                if item[1] == expectation:
-                    retval.append(item[0])
-                    break
+            retval.append(self.expectation_to_string(expectation))
+
+        return &quot; &quot;.join(retval)
 
-        return &quot; &quot;.join(retval).upper()
+    def expectation_to_string(self, expectation):
+        &quot;&quot;&quot;Returns the uppercased string equivalent of a given expectation.&quot;&quot;&quot;

Use the command form of sentence (I&apos;m going to stop mentioning that one).

+        for item in TestExpectationsFile.EXPECTATIONS.items():
+            if item[1] == expectation:
+                return item[0].upper()
+        return &quot;&quot;
 
     def get_timeline_for_test(self, test):
         return self._expected_failures.get_timeline_for_test(test)
@@ -834,7 +840,8 @@ class TestExpectationsFile:
             if test in set_of_tests:
                 set_of_tests.remove(test)
 
-    def _already_seen_test(self, test, test_list_path, lineno, allow_overrides):
+    def _already_seen_test(self, test, test_list_path, lineno,
+                           allow_overrides):
         &quot;&quot;&quot;Returns true if we&apos;ve already seen a more precise path for this test
         than the test_list_path.
         &quot;&quot;&quot;

First line on one line followed by a blank line (I&apos;m going to stop mentioning
this one as well).
         
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py b/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
index 059fd09..2aca3a7 100755
--- a/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
@@ -81,8 +81,15 @@ _log = logging.getLogger(&quot;webkitpy.layout_tests.run_webkit_tests&quot;)
 # directory-by-directory feedback).
 LOG_DETAILED_PROGRESS = &apos;detailed-progress&apos;
 
+LOG_SUMMARY = &apos;summary&apos;
+
+# &quot;Trace&quot; the test - log the expected result, the actual result, and the
+# baselines used
+LOG_TRACE = &apos;trace&apos;
+
 # Log any unexpected results while running (instead of just at the end).
 LOG_UNEXPECTED = &apos;unexpected&apos;
+LOG_UNEXPECTED_RESULTS = &apos;unexpected-results&apos;

I would recommend using the simple &quot;enum idiom&quot; in Python.  It goes something
like--

class LoggingMode(object):

    UNEXPECTED = &apos;unexpected&apos;
    UNEXPECTED_RESULTS = &apos;unexpected-results&quot;
    etc.

Then you can do--

LoggingMode.UNEXPECTED, etc.

It also eliminates the need to have a prefix as part of the constant name.
 
 # Builder base URL where we have the archived test results.
 BUILDER_BASE_URL = &quot;http://build.chromium.org/buildbot/layout_test_results/&quot;
@@ -135,25 +142,23 @@ class ResultSummary(object):
             self.tests_by_timeline[timeline] = (
                 expectations.get_tests_with_timeline(timeline))
 
-    def add(self, test, failures, result, expected):
-        &quot;&quot;&quot;Add a result into the appropriate bin.
+    def add(self, result, expected):
+        &quot;&quot;&quot;Add a TestResult into the appropriate bin.
 
         Args:
-          test: test file name
-          failures: list of failure objects from test execution
-          result: result of test (PASS, IMAGE, etc.).
+          result: TestResult from dump_render_tree_thread

Be consistent with whether you use a period to end incomplete sentences
in comments.

           expected: whether the result was what we expected it to be.
         &quot;&quot;&quot;
 
@@ -374,8 +379,10 @@ class TestRunner:
             # subtracted out of self._test_files, above), but we stub out the
             # results here so the statistics can remain accurate.
             for test in skip_chunk:
-                result_summary.add(test, [], test_expectations.SKIP,
-                                   expected=True)
+                result = dump_render_tree_thread.TestResult(test, [],
+                                                            0, 0, 0)

Use named parameters, as suggested above.

     def update_summary(self, result_summary):
-        &quot;&quot;&quot;Update the summary while running tests.&quot;&quot;&quot;
+        &quot;&quot;&quot;Update the summary and print results with any completed tests.&quot;&quot;&quot;
         while True:
             try:
-                (test, fail_list) = self._result_queue.get_nowait()
-                result = test_failures.determine_result_type(fail_list)
-                expected = self._expectations.matches_an_expected_result(test,
-                    result, self._options.pixel_tests)
-                result_summary.add(test, fail_list, result, expected)
-                if (LOG_DETAILED_PROGRESS in self._options.log and
-                    (self._options.experimental_fully_parallel or
-                     self._is_single_threaded())):
-                    self._display_detailed_progress(result_summary)
-                else:
-                    if not expected and LOG_UNEXPECTED in self._options.log:
-                        self._print_unexpected_test_result(test, result)
-                    self._display_one_line_progress(result_summary)
+                result = self._result_queue.get_nowait()
+                expected = self._expectations.matches_an_expected_result(
+                    result.filename, result.type, self._options.pixel_tests)
+                result_summary.add(result, expected)
+                self._print_test_results(result, expected, result_summary)
             except Queue.Empty:
                 return

Does the try block need to enclose that many lines?  I would enclose the
smallest number of lines possible.
 
-    def _display_one_line_progress(self, result_summary):
+    def _print_test_results(self, result, expected, result_summary):
+        &quot;Print the result of the test as determined by the --log switches.&quot;
+        if LOG_TRACE in self._options.log:
+            self._print_test_trace(result)
+        elif (LOG_DETAILED_PROGRESS in self._options.log and
+              (self._options.experimental_fully_parallel or
+               self._is_single_threaded())):
+            self._print_detailed_progress(result_summary)
+        else:
+            if (not expected and LOG_UNEXPECTED in self._options.log):
+                self._print_unexpected_test_result(result)
+            self._print_one_line_progress(result_summary)
+
+    def _print_test_trace(self, result):
+        &quot;&quot;&quot;Print detailed results of a test (triggered by --log trace).
+        For each test, print:
+           - location of the expected baselines
+           - expected results
+           - actual result
+           - timing info
+        &quot;&quot;&quot;
+        filename = result.filename
+        test_name = self._port.relative_test_filename(filename)
+        _log.info(&apos;trace: %s&apos; % test_name)
+        _log.info(&apos;  txt: %s&apos; %
+                  self._port.relative_test_filename(
+                       self._port.expected_filename(filename, &apos;.txt&apos;)))

I would break this up so you&apos;re not nesting so many function calls in
one statement.

@@ -1560,7 +1600,7 @@ def parse_args(args=None):
             help=&quot;log various types of data. The param should be a &quot; +
                  &quot;comma-separated list of values from: &quot; +
                  &quot;actual,config,&quot; + LOG_DETAILED_PROGRESS +
-                 &quot;,expected,timing,&quot; + LOG_UNEXPECTED + &quot; &quot; +
+                 &quot;,expected,timing,trace&quot; + LOG_UNEXPECTED + &quot; &quot; +

It might be clearer to use a format string here instead.  Also consider
using &quot;,&quot;.join().  Also, it would be better to use a full word instead of
a (non-standard) abbreviated form like &quot;param&quot;.


                  &quot;(defaults to &quot; + &quot;--log detailed-progress,unexpected)&quot;),

Do you need to be concatenating here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213608</commentid>
    <comment_count>11</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-04-17 09:40:35 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; @@ -1560,7 +1600,7 @@ def parse_args(args=None):
&gt;              help=&quot;log various types of data. The param should be a &quot; +
&gt;                   &quot;comma-separated list of values from: &quot; +
&gt;                   &quot;actual,config,&quot; + LOG_DETAILED_PROGRESS +
&gt; -                 &quot;,expected,timing,&quot; + LOG_UNEXPECTED + &quot; &quot; +
&gt; +                 &quot;,expected,timing,trace&quot; + LOG_UNEXPECTED + &quot; &quot; +

A couple more things.  Per PEP8, the preferred way of wrapping long lines is by using Python&apos;s implied line continuation (e.g. by enclosing the string in parentheses).

Also, for the future, you may want to take a look at the optparse documentation for supporting multiple-valued options (i.e. the &quot;extend&quot; action, which &quot;will take multiple values in a single comma-delimited string&quot;):

http://docs.python.org/library/optparse.html#adding-new-actions

This may also let you use the &quot;choices&quot; parameter when making an option, which automatically generates a nice error message if the user includes an unrecognized value:

http://docs.python.org/library/optparse.html#optparse.Option.choices</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213816</commentid>
    <comment_count>12</comment_count>
      <attachid>53638</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-18 15:32:39 -0700</bug_when>
    <thetext>Created attachment 53638
update w/ feedback from cjerdonek</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213817</commentid>
    <comment_count>13</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-18 15:33:16 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #6)
&gt; &gt; Created an attachment (id=53578) [details] [details]
&gt; 
&gt; Here are several comments to consider that are mostly stylistic.  If possible,
&gt; I&apos;d like to provide feedback on the substance of the patch after you give
&gt; consideration to these comments.
&gt; 

Thanks for the detailed feedback! I appreciate you spending the time.

I find it&apos;s actually more useful to give substantial feedback first, that way you don&apos;t spend time reformatting code that ends up changing.

Otherwise generally I agree with your comments. I&apos;m less concerned with fanatical adherence to the commenting style of PEP-8, but I&apos;ll comply where I notice it.

That said, it seemed like a number of your comments apply to changes not introduced by this file (e.g., the number of parameters to process_output). That feedback is entirely valid, but I&apos;m not going to change it as part of this patch to avoid feature creep.

&gt; --- a/WebKitTools/ChangeLog
&gt; 
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=37726
&gt; +
&gt; +        * Scripts/webkitpy/layout_tests/run_webkit_tests.py:
&gt; +          - use the newly exposed TestResult class and implement
&gt; +            --log trace
&gt; +        * Scripts/webkitpy/layout_tests/layout_package/dump_render_thread.py:
&gt; +          - rename TestStats to TestResult and make it more public, resulting
&gt; +            in cleaner code
&gt; 
&gt; It looks like the ChangeLog is missing an entry for--
&gt;   WebKitTools/Scripts/webkitpy/layout_tests/layout_package/test_expectations.py
&gt; 

True.

&gt; ---
&gt; a/WebKitTools/Scripts/webkitpy/layout_tests/layout_package/dump_render_tree_thread.py
&gt; 
&gt; @@ -54,8 +54,8 @@ _log =
&gt; logging.getLogger(&quot;webkitpy.layout_tests.layout_package.&quot;
&gt;  def process_output(port, test_info, test_types, test_args, configuration,
&gt;                     output_dir, crash, timeout, test_run_time, actual_checksum,
&gt;                     output, error):
&gt; -    &quot;&quot;&quot;Receives the output from a DumpRenderTree process, subjects it to a
&gt; number
&gt; -    of tests, and returns a list of failure types the test produced.
&gt; +    &quot;&quot;&quot;Receives the output from a DumpRenderTree process, subjects it to a
&gt; +    number of tests, and returns a list of failure types the test produced.
&gt; 
&gt; Per PEP8, the first line of a docstring should fit on one line and be 
&gt; followed by a blank line.  Also per PEP8, the first line should be phrased
&gt; as a command, for example &quot;Process DumpRenderTree output, and return....&quot;
&gt; 
&gt; (By the way, that parameter list is a bit long.  It should probably be
&gt; refactored to have a much shorter parameter list.)
&gt;

Agreed. I only reformatted the comment to fit within the 80-col limit. I will save more substantial changes for a different CL.
 
&gt; @@ -66,7 +66,7 @@ def process_output(port, test_info, test_types, test_args,
&gt; configuration,
&gt;        configuration: Debug or Release
&gt;        output_dir: directory to put crash stack traces into
&gt; 
&gt; -    Returns: a list of failure objects and times for the test being processed
&gt; +    Returns: a TestResult object
&gt;      &quot;&quot;&quot;
&gt; 
&gt; Per PEP8, a blank line should separate the final line of a multi-line
&gt; docstring and the triple quotes.

Really? That seems like a waste of space. Okay, learn something new ...

&gt; 
&gt; @@ -111,16 +111,17 @@ def process_output(port, test_info, test_types,
&gt; test_args, configuration,
&gt;              time.time() - start_diff_time)
&gt; 
&gt;      total_time_for_all_diffs = time.time() - start_diff_time
&gt; -    return TestStats(test_info.filename, failures, test_run_time,
&gt; +    return TestResult(test_info.filename, failures, test_run_time,
&gt;          total_time_for_all_diffs, time_for_diffs)
&gt; 
&gt; The second line should line up with the character following the left
&gt; parenthesis.  Also, when calling a function with many parameters, it&apos;s good
&gt; to use named parameters.  This is a good safety check (especially when used
&gt; in conjunction with unit tests) since it adds an additional
&gt; level of checking.
&gt; 

We frequently follow a slightly different convention where wrapped lines are indented four spaces instead of lining up with the parenthesis (see the Google Python Style Guide), if it helps readability. In this case, it&apos;s a bit of a toss-up, so I&apos;ll change the indentation. I think it is only necessary to use the parameter names if the variable names aren&apos;t clear. Granted, there is still a chance that you get variables in the wrong order, but I&apos;ll take that chance over writing things like total_time_for_all_diffs=total_time_for_all_diffs.

&gt; -class TestStats:
&gt; +class TestResult:
&gt; 
&gt; Classes at the bottom of your class hierarchy should really inherit from
&gt; &quot;object&quot;.  See, for example--
&gt; 

done.

&gt; http://google-styleguide.googlecode.com/svn/trunk/pyguide.html#Classes
&gt; 
&gt; 
&gt;      def __init__(self, filename, failures, test_run_time,
&gt;                   total_time_for_all_diffs, time_for_diffs):
&gt;          self.filename = filename
&gt;          self.failures = failures
&gt; +        self.type = test_failures.determine_result_type(failures)
&gt;          self.test_run_time = test_run_time
&gt;          self.total_time_for_all_diffs = total_time_for_all_diffs
&gt;          self.time_for_diffs = time_for_diffs
&gt; 
&gt; In constructors, it is good to alphabetize the lines that set data attributes
&gt; by data attribute name.

I find that grouping by functionality can trump this, but this isn&apos;t one of those cases. Done.

&gt; 
&gt; @@ -157,14 +158,14 @@ class SingleTestThread(threading.Thread):
&gt;              driver.run_test(test_info.uri.strip(), test_info.timeout,
&gt;                              test_info.image_hash)
&gt;          end = time.time()
&gt; -        self._test_stats = process_output(self._port,
&gt; +        self._test_result = process_output(self._port,
&gt;              test_info, self._test_types, self._test_args,
&gt;              self._configuration, self._output_dir, crash, timeout, end -
&gt; start,
&gt;              actual_checksum, output, error)
&gt;          driver.stop()
&gt; 
&gt; Again, align with the left parenthesis if possible and use named parameters
&gt; for long parameter lists.

This is a case where I&apos;m not going to align with the left parenthesis - the function gets too vertically long.

&gt; 
&gt; -    def get_test_stats(self):
&gt; -        return self._test_stats
&gt; +    def get_test_result(self):
&gt; +        return self._test_result
&gt; 
&gt; 
&gt;  class TestShellThread(threading.Thread):
&gt; @@ -201,7 +202,7 @@ class TestShellThread(threading.Thread):
&gt;          self._canceled = False
&gt;          self._exception_info = None
&gt;          self._directory_timing_stats = {}
&gt; -        self._test_stats = []
&gt; +        self._test_results = []
&gt;          self._num_tests = 0
&gt;          self._start_time = 0
&gt;          self._stop_time = 0
&gt; 
&gt; Alphabetize by data attribute name.
&gt; 

this is probably a good thing to do but I&quot;m not going to change it now to minimize patch creep.

&gt; @@ -218,10 +219,10 @@ class TestShellThread(threading.Thread):
&gt;          (number of tests in that directory, time to run the tests)&quot;&quot;&quot;
&gt;          return self._directory_timing_stats
&gt; 
&gt; -    def get_individual_test_stats(self):
&gt; -        &quot;&quot;&quot;Returns a list of (test_filename, time_to_run_test,
&gt; -        total_time_for_all_diffs, time_for_diffs) tuples.&quot;&quot;&quot;
&gt; -        return self._test_stats
&gt; +    def get_test_results(self):
&gt; +        &quot;&quot;&quot;Returns the list of all tests run on this thread. Used to calculate
&gt; +        per-thread statistics.&quot;&quot;&quot;
&gt; +        return self._test_results
&gt; 
&gt; Again, phrase the first line of a doc string as a command (e.g. &quot;Return the
&gt; list...&quot; rather than &quot;Returns....&quot;) and restrict the first line to one line
&gt; followed by a blank line.
&gt; 
&gt;      def cancel(self):
&gt;          &quot;&quot;&quot;Set a flag telling this thread to quit.&quot;&quot;&quot;
&gt; @@ -317,27 +318,29 @@ class TestShellThread(threading.Thread):
&gt;              batch_count += 1
&gt;              self._num_tests += 1
&gt;              if self._options.run_singly:
&gt; -                failures = self._run_test_singly(test_info)
&gt; +                result = self._run_test_singly(test_info)
&gt;              else:
&gt; -                failures = self._run_test(test_info)
&gt; +                result = self._run_test(test_info)
&gt; 
&gt; You may wish to use the ternary operator here. 
&gt; 

I don&apos;t like the ternary operator. It can&apos;t be used to set a breakpoint on one half of the branch, and it doesn&apos;t show up in code coverage listing (usually). 

&gt;              filename = test_info.filename
&gt;              tests_run_file.write(filename + &quot;\n&quot;)
&gt; -            if failures:
&gt; +            if result.failures:
&gt;                  # Check and kill DumpRenderTree if we need too.
&gt; 
&gt; too -&gt; to
&gt; 
&gt; -                if len([1 for f in failures if
&gt; f.should_kill_dump_render_tree()]):
&gt; +                if len([1 for f in result.failures
&gt; +                           if f.should_kill_dump_render_tree()]):
&gt; 
&gt; It seems this construct can be simplified.  For example, can you use the
&gt; filter() construct instead?  The 1&apos;s don&apos;t really do anything.  Also
&gt; fix the alignment.
&gt; 

Probably, but I didn&apos;t write this code and I&apos;m going to leave it alone for this patch (outside of fixing the line length and indentation. As to fixing the alignment, what do you think it should be? Aligned to the parenthesis? The left bracket?

&gt;                  # Print the error message(s).
&gt; -                error_str = &apos;\n&apos;.join([&apos;  &apos; + f.message() for f in failures])
&gt; +                error_str = &apos;\n&apos;.join([&apos;  &apos; + f.message() for
&gt; +                                           f in result.failures])
&gt; 
&gt; Alignment.

Ditto.

&gt; 
&gt;                  _log.debug(&quot;%s %s failed:\n%s&quot; % (self.getName(),
&gt;                             self._port.relative_test_filename(filename),
&gt;                             error_str))
&gt;              else:
&gt;                  _log.debug(&quot;%s %s passed&quot; % (self.getName(),
&gt;                             self._port.relative_test_filename(filename)))
&gt; -            self._result_queue.put((filename, failures))
&gt; +            self._result_queue.put(result)
&gt; 
&gt;              if batch_size &gt; 0 and batch_count &gt; batch_size:
&gt;                  # Bounce the shell and reset count.
&gt; @@ -358,7 +361,7 @@ class TestShellThread(threading.Thread):
&gt;            test_info: Object containing the test filename, uri and timeout
&gt; 
&gt;          Return:
&gt; -          A list of TestFailure objects describing the error.
&gt; +          A TestResult
&gt;          &quot;&quot;&quot;
&gt; 
&gt; Blank line before &quot;&quot;&quot;.  Also, you&apos;re using a style here that&apos;s different
&gt; from what you&apos;re using above &quot;Returns: blah&quot; versus &quot;Return:\n  blah&quot;.
&gt; 

done.

&gt; @@ -370,9 +373,9 @@ class TestShellThread(threading.Thread):
&gt; 
&gt;          worker.start()
&gt; 
&gt; -        # When we&apos;re running one test per DumpRenderTree process, we can
&gt; enforce
&gt; -        # a hard timeout. the DumpRenderTree watchdog uses 2.5x the timeout
&gt; -        # We want to be larger than that.
&gt; +        # When we&apos;re running one test per DumpRenderTree process, we can
&gt; +        # enforce a hard timeout. the DumpRenderTree watchdog uses 2.5x
&gt; 
&gt; Per PEP8, two spaces after each period.  Also capitalize the first word
&gt; of a sentence.

Gah. This (two spaces) is a dumb rule in PEP 8, but whatever.

&gt; 
&gt; +        # the timeout We want to be larger than that.
&gt; 
&gt; Does this sentence make sense?
&gt; 

I didn&apos;t write it, just reformatted it, but I&apos;ve cleaned it up now.

&gt;          worker.join(int(test_info.timeout) * 3.0 / 1000.0)
&gt;          if worker.isAlive():
&gt;              # If join() returned with the thread still running, the
&gt; @@ -380,22 +383,21 @@ class TestShellThread(threading.Thread):
&gt;              # more we can do with it.  We have to kill all the
&gt;              # DumpRenderTrees to free it up. If we&apos;re running more than
&gt;              # one DumpRenderTree thread, we&apos;ll end up killing the other
&gt; -            # DumpRenderTrees too, introducing spurious crashes. We accept
&gt; that
&gt; -            # tradeoff in order to avoid losing the rest of this thread&apos;s
&gt; -            # results.
&gt; +            # DumpRenderTrees too, introducing spurious crashes. We accept
&gt; 
&gt; This first sentence doesn&apos;t make sense and is not a complete sentence.
&gt; 

I&apos;m not sure why you think that. The whole paragraphic is grammatical to me.

&gt; +            # that tradeoff in order to avoid losing the rest of this
&gt; +            # thread&apos;s results.
&gt;              _log.error(&apos;Test thread hung: killing all DumpRenderTrees&apos;)
&gt;              worker._driver.stop()
&gt; 
&gt;          try:
&gt; -            stats = worker.get_test_stats()
&gt; -            self._test_stats.append(stats)
&gt; -            failures = stats.failures
&gt; +            result = worker.get_test_result()
&gt;          except AttributeError, e:
&gt;              failures = []
&gt;              _log.error(&apos;Cannot get results of test: %s&apos; %
&gt;                         test_info.filename)
&gt; +            result = TestResult(test_info.filename, [], 0, 0, 0)
&gt; 
&gt; I would use a variable more descriptive than &quot;e&quot; -- for example &quot;err&quot;.
&gt; Also, is that variable even being used here?  If not, just use &quot;except
&gt; AttributeError:&quot;.  Finally, I would use named parameters so the reader
&gt; knows what the zeros signify.

I&apos;m not gonna change the catch; (a) I like short names, and (b) I didn&apos;t write or change this. I will use named parameters.

&gt; 
&gt; 
&gt; -        return failures
&gt; +        return result
&gt; 
&gt;      def _run_test(self, test_info):
&gt;          &quot;&quot;&quot;Run a single test file using a shared DumpRenderTree process.
&gt; @@ -419,19 +421,18 @@ class TestShellThread(threading.Thread):
&gt;             self._driver.run_test(test_info.uri, test_info.timeout, image_hash)
&gt;          end = time.time()
&gt; 
&gt; -        stats = process_output(self._port, test_info, self._test_types,
&gt; +        result = process_output(self._port, test_info, self._test_types,
&gt;                                 self._test_args, self._options.configuration,
&gt;                                 self._options.results_directory, crash,
&gt;                                 timeout, end - start, actual_checksum,
&gt;                                 output, error)
&gt; 
&gt; Align correctly and use named parameters.
&gt; 

Alignment fixed, but I&apos;m not going to add named parameters.  

&gt; -
&gt; -        self._test_stats.append(stats)
&gt; -        return stats.failures
&gt; +        self._test_results.append(result)
&gt; +        return result
&gt; 
&gt;      def _ensure_dump_render_tree_is_running(self):
&gt; -        &quot;&quot;&quot;Start the shared DumpRenderTree, if it&apos;s not running.  Not for use
&gt; when
&gt; -        running tests singly, since those each start a separate DumpRenderTree
&gt; in
&gt; -        their own thread.
&gt; +        &quot;&quot;&quot;Start the shared DumpRenderTree, if it&apos;s not running.  Not for use
&gt; +        when running tests singly, since those each start a separate
&gt; +        DumpRenderTree in their own thread.
&gt;          &quot;&quot;&quot;
&gt; 
&gt; Blank line after first line.  The second sentence is not a complete sentence.
&gt; 

Fixed.

&gt;          if (not self._driver or self._driver.poll() is not None):
&gt;              self._driver = self._port.start_driver(
&gt; 
&gt; ---
&gt; a/WebKitTools/Scripts/webkitpy/layout_tests/layout_package/test_expectations.py
&gt; 
&gt; @@ -48,6 +48,7 @@ _log =
&gt; logging.getLogger(&quot;webkitpy.layout_tests.layout_package.&quot;
&gt;  # Test expectation file update action constants
&gt;  (NO_CHANGE, REMOVE_TEST, REMOVE_PLATFORM, ADD_PLATFORMS_EXCEPT_THIS) =
&gt; range(4)
&gt; 
&gt; +
&gt;  def result_was_expected(result, expected_results, test_needs_rebaselining,
&gt;                          test_is_skipped):
&gt;      &quot;&quot;&quot;Returns whether we got a result we were expecting.
&gt; 
&gt; Use &quot;command&quot; form -- e.g. &quot;Return whether....&quot; 
&gt; 

I&apos;m going to leave this alone since I didn&apos;t change this code (patch creep).

&gt; @@ -61,11 +62,12 @@ def result_was_expected(result, expected_results,
&gt; test_needs_rebaselining,
&gt;      if result in (IMAGE, TEXT, IMAGE_PLUS_TEXT) and FAIL in expected_results:
&gt;          return True
&gt;      if result == MISSING and test_needs_rebaselining:
&gt; -       return True
&gt; +        return True
&gt;      if result == SKIP and test_is_skipped:
&gt; -       return True
&gt; +        return True
&gt;      return False
&gt; 
&gt; +
&gt;  def remove_pixel_failures(expected_results):
&gt;      &quot;&quot;&quot;Returns a copy of the expected results for a test, except that we
&gt;      drop any pixel failures and return the remaining expectations. For
&gt; example,
&gt; @@ -141,12 +143,16 @@ class TestExpectations:
&gt;          retval = []
&gt; 
&gt;          for expectation in expectations:
&gt; -            for item in TestExpectationsFile.EXPECTATIONS.items():
&gt; -                if item[1] == expectation:
&gt; -                    retval.append(item[0])
&gt; -                    break
&gt; +            retval.append(self.expectation_to_string(expectation))
&gt; +
&gt; +        return &quot; &quot;.join(retval)
&gt; 
&gt; -        return &quot; &quot;.join(retval).upper()
&gt; +    def expectation_to_string(self, expectation):
&gt; +        &quot;&quot;&quot;Returns the uppercased string equivalent of a given expectation.&quot;&quot;&quot;
&gt; 
&gt; Use the command form of sentence (I&apos;m going to stop mentioning that one).
&gt; 

Done.

&gt; +        for item in TestExpectationsFile.EXPECTATIONS.items():
&gt; +            if item[1] == expectation:
&gt; +                return item[0].upper()
&gt; +        return &quot;&quot;
&gt; 
&gt;      def get_timeline_for_test(self, test):
&gt;          return self._expected_failures.get_timeline_for_test(test)
&gt; @@ -834,7 +840,8 @@ class TestExpectationsFile:
&gt;              if test in set_of_tests:
&gt;                  set_of_tests.remove(test)
&gt; 
&gt; -    def _already_seen_test(self, test, test_list_path, lineno,
&gt; allow_overrides):
&gt; +    def _already_seen_test(self, test, test_list_path, lineno,
&gt; +                           allow_overrides):
&gt;          &quot;&quot;&quot;Returns true if we&apos;ve already seen a more precise path for this
&gt; test
&gt;          than the test_list_path.
&gt;          &quot;&quot;&quot;
&gt; 
&gt; First line on one line followed by a blank line (I&apos;m going to stop mentioning
&gt; this one as well).
&gt; 

Again, not going to change this in this patch.

&gt; diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
&gt; b/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
&gt; index 059fd09..2aca3a7 100755
&gt; --- a/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
&gt; @@ -81,8 +81,15 @@ _log =
&gt; logging.getLogger(&quot;webkitpy.layout_tests.run_webkit_tests&quot;)
&gt;  # directory-by-directory feedback).
&gt;  LOG_DETAILED_PROGRESS = &apos;detailed-progress&apos;
&gt; 
&gt; +LOG_SUMMARY = &apos;summary&apos;
&gt; +
&gt; +# &quot;Trace&quot; the test - log the expected result, the actual result, and the
&gt; +# baselines used
&gt; +LOG_TRACE = &apos;trace&apos;
&gt; +
&gt;  # Log any unexpected results while running (instead of just at the end).
&gt;  LOG_UNEXPECTED = &apos;unexpected&apos;
&gt; +LOG_UNEXPECTED_RESULTS = &apos;unexpected-results&apos;
&gt; 
&gt; I would recommend using the simple &quot;enum idiom&quot; in Python.  It goes something
&gt; like--
&gt; 
&gt; class LoggingMode(object):
&gt; 
&gt;     UNEXPECTED = &apos;unexpected&apos;
&gt;     UNEXPECTED_RESULTS = &apos;unexpected-results&quot;
&gt;     etc.
&gt; 
&gt; Then you can do--
&gt; 
&gt; LoggingMode.UNEXPECTED, etc.
&gt; 
&gt; It also eliminates the need to have a prefix as part of the constant name.
&gt;

Good suggestion. I&apos;ll do this when I move the code into a separate package.
 
&gt;  # Builder base URL where we have the archived test results.
&gt;  BUILDER_BASE_URL = &quot;http://build.chromium.org/buildbot/layout_test_results/&quot;
&gt; @@ -135,25 +142,23 @@ class ResultSummary(object):
&gt;              self.tests_by_timeline[timeline] = (
&gt;                  expectations.get_tests_with_timeline(timeline))
&gt; 
&gt; -    def add(self, test, failures, result, expected):
&gt; -        &quot;&quot;&quot;Add a result into the appropriate bin.
&gt; +    def add(self, result, expected):
&gt; +        &quot;&quot;&quot;Add a TestResult into the appropriate bin.
&gt; 
&gt;          Args:
&gt; -          test: test file name
&gt; -          failures: list of failure objects from test execution
&gt; -          result: result of test (PASS, IMAGE, etc.).
&gt; +          result: TestResult from dump_render_tree_thread
&gt; 
&gt; Be consistent with whether you use a period to end incomplete sentences
&gt; in comments.
&gt;

fixed.
 
&gt;            expected: whether the result was what we expected it to be.
&gt;          &quot;&quot;&quot;
&gt; 
&gt; @@ -374,8 +379,10 @@ class TestRunner:
&gt;              # subtracted out of self._test_files, above), but we stub out the
&gt;              # results here so the statistics can remain accurate.
&gt;              for test in skip_chunk:
&gt; -                result_summary.add(test, [], test_expectations.SKIP,
&gt; -                                   expected=True)
&gt; +                result = dump_render_tree_thread.TestResult(test, [],
&gt; +                                                            0, 0, 0)
&gt; 
&gt; Use named parameters, as suggested above.
&gt; 

done.

&gt;      def update_summary(self, result_summary):
&gt; -        &quot;&quot;&quot;Update the summary while running tests.&quot;&quot;&quot;
&gt; +        &quot;&quot;&quot;Update the summary and print results with any completed tests.&quot;&quot;&quot;
&gt;          while True:
&gt;              try:
&gt; -                (test, fail_list) = self._result_queue.get_nowait()
&gt; -                result = test_failures.determine_result_type(fail_list)
&gt; -                expected = self._expectations.matches_an_expected_result(test,
&gt; -                    result, self._options.pixel_tests)
&gt; -                result_summary.add(test, fail_list, result, expected)
&gt; -                if (LOG_DETAILED_PROGRESS in self._options.log and
&gt; -                    (self._options.experimental_fully_parallel or
&gt; -                     self._is_single_threaded())):
&gt; -                    self._display_detailed_progress(result_summary)
&gt; -                else:
&gt; -                    if not expected and LOG_UNEXPECTED in self._options.log:
&gt; -                        self._print_unexpected_test_result(test, result)
&gt; -                    self._display_one_line_progress(result_summary)
&gt; +                result = self._result_queue.get_nowait()
&gt; +                expected = self._expectations.matches_an_expected_result(
&gt; +                    result.filename, result.type, self._options.pixel_tests)
&gt; +                result_summary.add(result, expected)
&gt; +                self._print_test_results(result, expected, result_summary)
&gt;              except Queue.Empty:
&gt;                  return
&gt; 
&gt; Does the try block need to enclose that many lines?  I would enclose the
&gt; smallest number of lines possible.
&gt; 

done.

&gt; -    def _display_one_line_progress(self, result_summary):
&gt; +    def _print_test_results(self, result, expected, result_summary):
&gt; +        &quot;Print the result of the test as determined by the --log switches.&quot;
&gt; +        if LOG_TRACE in self._options.log:
&gt; +            self._print_test_trace(result)
&gt; +        elif (LOG_DETAILED_PROGRESS in self._options.log and
&gt; +              (self._options.experimental_fully_parallel or
&gt; +               self._is_single_threaded())):
&gt; +            self._print_detailed_progress(result_summary)
&gt; +        else:
&gt; +            if (not expected and LOG_UNEXPECTED in self._options.log):
&gt; +                self._print_unexpected_test_result(result)
&gt; +            self._print_one_line_progress(result_summary)
&gt; +
&gt; +    def _print_test_trace(self, result):
&gt; +        &quot;&quot;&quot;Print detailed results of a test (triggered by --log trace).
&gt; +        For each test, print:
&gt; +           - location of the expected baselines
&gt; +           - expected results
&gt; +           - actual result
&gt; +           - timing info
&gt; +        &quot;&quot;&quot;
&gt; +        filename = result.filename
&gt; +        test_name = self._port.relative_test_filename(filename)
&gt; +        _log.info(&apos;trace: %s&apos; % test_name)
&gt; +        _log.info(&apos;  txt: %s&apos; %
&gt; +                  self._port.relative_test_filename(
&gt; +                       self._port.expected_filename(filename, &apos;.txt&apos;)))
&gt; 
&gt; I would break this up so you&apos;re not nesting so many function calls in
&gt; one statement.
&gt; 

I&apos;m not sure how much better this can be. Example?

&gt; @@ -1560,7 +1600,7 @@ def parse_args(args=None):
&gt;              help=&quot;log various types of data. The param should be a &quot; +
&gt;                   &quot;comma-separated list of values from: &quot; +
&gt;                   &quot;actual,config,&quot; + LOG_DETAILED_PROGRESS +
&gt; -                 &quot;,expected,timing,&quot; + LOG_UNEXPECTED + &quot; &quot; +
&gt; +                 &quot;,expected,timing,trace&quot; + LOG_UNEXPECTED + &quot; &quot; +
&gt; 
&gt; It might be clearer to use a format string here instead.  Also consider
&gt; using &quot;,&quot;.join().  Also, it would be better to use a full word instead of
&gt; a (non-standard) abbreviated form like &quot;param&quot;.
&gt; 

Cleaned up somewhat differently. Take a look.

&gt; 
&gt;                   &quot;(defaults to &quot; + &quot;--log detailed-progress,unexpected)&quot;),
&gt; 
&gt; Do you need to be concatenating here?

No.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213928</commentid>
    <comment_count>14</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-04-19 00:10:09 -0700</bug_when>
    <thetext>(In reply to comment #13)

Thanks for taking my feedback into account.  The patch is much easier to read now!

(By the way, I apologize for including such large code excerpts in comment 10.  I&apos;ll try to avoid doing that in the future.)

&gt; I find it&apos;s actually more useful to give substantial feedback first, that way
&gt; you don&apos;t spend time reformatting code that ends up changing.

Yes, though at the same time good style at the outset makes it a bit easier to review and quickly see what&apos;s going on.  Also, even if the specific suggestions don&apos;t wind up getting used in the current patch, the style feedback and discussion is often valuable for subsequent patches.

If anything major had occurred to me, though, I would be sure to let you know.

&gt; That said, it seemed like a number of your comments apply to changes not
&gt; introduced by this file (e.g., the number of parameters to process_output).
&gt; That feedback is entirely valid, but I&apos;m not going to change it as part of this
&gt; patch to avoid feature creep.

That&apos;s fine.  I was under the impression that you may have written some of the existing code, so I thought it wouldn&apos;t hurt to mention it.  At the least you&apos;re actively working on the code, so it made sense to tell you. :)  One thing you can always do in cases like these is add FIXME&apos;s to the nearby code.  That way the suggestion will get preserved for the future, with little cost to you.

&gt; I think it is only necessary to use
&gt; the parameter names if the variable names aren&apos;t clear. Granted, there is still
&gt; a chance that you get variables in the wrong order, but I&apos;ll take that chance
&gt; over writing things like total_time_for_all_diffs=total_time_for_all_diffs.

I&apos;ve found that it helps most with longer lists of parameters (e.g. more than 4-5).  It also has the nice effect of discouraging longer lists of parameters. :)

&gt; &gt; In constructors, it is good to alphabetize the lines that set data attributes
&gt; &gt; by data attribute name.
&gt; 
&gt; I find that grouping by functionality can trump this, but this isn&apos;t one of
&gt; those cases. Done.

Thanks.  I should have qualified my suggestion, too.  Personally, I prefer the attributes set from parameter values to be grouped separately from the ones with default (e.g. hard-coded) values.  In any case, I think we both agree that alphabetizing within groups makes sense (no matter how we group).

&gt; &gt;  class TestShellThread(threading.Thread):
&gt; &gt; @@ -201,7 +202,7 @@ class TestShellThread(threading.Thread):
&gt; &gt;          self._canceled = False
&gt; &gt;          self._exception_info = None
&gt; &gt;          self._directory_timing_stats = {}
&gt; &gt; -        self._test_stats = []
&gt; &gt; +        self._test_results = []
&gt; &gt;          self._num_tests = 0
&gt; &gt;          self._start_time = 0
&gt; &gt;          self._stop_time = 0
&gt; &gt; 
&gt; &gt; Alphabetize by data attribute name.
&gt; &gt; 
&gt; 
&gt; this is probably a good thing to do but I&quot;m not going to change it now to
&gt; minimize patch creep.

One thing you can always do is insert just the new one into the appropriate order (i.e. as best can be done with the existing ordering).

&gt; &gt; -                if len([1 for f in failures if
&gt; &gt; f.should_kill_dump_render_tree()]):
&gt; &gt; +                if len([1 for f in result.failures
&gt; &gt; +                           if f.should_kill_dump_render_tree()]):
&gt; As to fixing the
&gt; alignment, what do you think it should be? Aligned to the parenthesis? The left
&gt; bracket?

In webkitpy, we&apos;ve been going with aligning to the innermost applicable symbol.  So in this case, the &quot;i&quot; in &quot;if&quot; would be lined up underneath the 1 after the left bracket.  I didn&apos;t know Google had a different alignment style.  I had thought PEP8 spoke to this, but I could be wrong.

&gt; Gah. This (two spaces) is a dumb rule in PEP 8, but whatever.

I didn&apos;t make them up. :)

&gt; &gt; This first sentence doesn&apos;t make sense and is not a complete sentence.
&gt; 
&gt; I&apos;m not sure why you think that. The whole paragraphic is grammatical to me.

That was my bad, sorry!

&gt; &gt; +        _log.info(&apos;  txt: %s&apos; %
&gt; &gt; +                  self._port.relative_test_filename(
&gt; &gt; +                       self._port.expected_filename(filename, &apos;.txt&apos;)))
&gt; &gt; 
&gt; &gt; I would break this up so you&apos;re not nesting so many function calls in
&gt; &gt; one statement.
&gt; 
&gt; I&apos;m not sure how much better this can be. Example?

I might have included too large of an excerpt.  I simply meant breaking the statement up by, say, calculating the filename on a separate line.  That way you won&apos;t have as many levels of nesting -- e.g.

&gt; +        rel_test_filename = ...
&gt; +        _log.info(&apos;  txt: %s&apos; % rel_test_filename)

&gt; &gt; It might be clearer to use a format string here instead.  Also consider
&gt; &gt; using &quot;,&quot;.join().  Also, it would be better to use a full word instead of
&gt; &gt; a (non-standard) abbreviated form like &quot;param&quot;.
&gt; &gt; 
&gt; 
&gt; Cleaned up somewhat differently. Take a look.

Thanks.  I&apos;ll take a look!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213934</commentid>
    <comment_count>15</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-04-19 00:40:50 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; Created an attachment (id=53638) [details]

Hmm, interesting.  This seems to be a diff off the previous patch.  Was that
intentional?  It makes it easier for me to see how you modified things in
response to my comments, but probably harder for others to respond to your
changes as a whole.  (That also explains why the patch doesn&apos;t apply.)

This looks pretty good style-wise now.  A few straggling nits below.

&gt; +        This is used to calculate per-thread statistics.
&gt; +        &quot;&quot;&quot;

Needs intervening blank line.

&gt; +        a separate DumpRenderTree in their own thread.
&gt;          &quot;&quot;&quot;

Needs intervening blank line.

&gt; +LOG_VALUES = &quot;,&quot;.join((&quot;actual&quot;, &quot;config&quot;, LOG_DETAILED_PROGRESS, &quot;expected&quot;,
&gt; +                      LOG_SUMMARY, &quot;timing&quot;, LOG_TRACE, LOG_UNEXPECTED,
&gt; +                      LOG_UNEXPECTED_RESULTS))

The L&apos;s should be lined up underneath the quote after the parenthesis.

You might want to squash and reattach so a reviewer can take a look.  Or did
you split this report into sub-reports??  E.g.

https://bugs.webkit.org/show_bug.cgi?id=37785</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214294</commentid>
    <comment_count>16</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-19 15:49:49 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; (In reply to comment #12)
&gt; &gt; Created an attachment (id=53638) [details] [details]
&gt; 
&gt; Hmm, interesting.  This seems to be a diff off the previous patch.  Was that
&gt; intentional?  It makes it easier for me to see how you modified things in
&gt; response to my comments, but probably harder for others to respond to your
&gt; changes as a whole.  (That also explains why the patch doesn&apos;t apply.)
&gt; 

No, this wasn&apos;t intentional. I probably used the wrong diff command.

&gt; This looks pretty good style-wise now.  A few straggling nits below.
&gt; 
&gt; &gt; +        This is used to calculate per-thread statistics.
&gt; &gt; +        &quot;&quot;&quot;
&gt; 
&gt; Needs intervening blank line.
&gt;

Fixed.
 
&gt; &gt; +        a separate DumpRenderTree in their own thread.
&gt; &gt;          &quot;&quot;&quot;
&gt; 
&gt; Needs intervening blank line.
&gt;

Fixed.
 
&gt; &gt; +LOG_VALUES = &quot;,&quot;.join((&quot;actual&quot;, &quot;config&quot;, LOG_DETAILED_PROGRESS, &quot;expected&quot;,
&gt; &gt; +                      LOG_SUMMARY, &quot;timing&quot;, LOG_TRACE, LOG_UNEXPECTED,
&gt; &gt; +                      LOG_UNEXPECTED_RESULTS))
&gt; 
&gt; The L&apos;s should be lined up underneath the quote after the parenthesis.
&gt; 

Fixed.

Revised (full) patch attached.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214295</commentid>
    <comment_count>17</comment_count>
      <attachid>53731</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-19 15:50:27 -0700</bug_when>
    <thetext>Created attachment 53731
revise w/ more feedback from cjerdonek, fix delta to be against baseline</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215002</commentid>
    <comment_count>18</comment_count>
      <attachid>53731</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-20 15:19:49 -0700</bug_when>
    <thetext>Comment on attachment 53731
revise w/ more feedback from cjerdonek, fix delta to be against baseline

Looks reasonable.  Thanks for the clean up too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215023</commentid>
    <comment_count>19</comment_count>
      <attachid>53897</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-20 15:43:28 -0700</bug_when>
    <thetext>Created attachment 53897
updated patch that will actually apply</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215024</commentid>
    <comment_count>20</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-20 15:44:06 -0700</bug_when>
    <thetext>Committed r57934: &lt;http://trac.webkit.org/changeset/57934&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215208</commentid>
    <comment_count>21</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-21 02:39:43 -0700</bug_when>
    <thetext>I believe this broke a python unit test.

======================================================================
ERROR: test_fast (webkitpy.layout_tests.run_webkit_tests_unittest.MainTest)
----------------------------------------------------------------------
Traceback (most recent call last):
 File &quot;/Users/eseidel/Projects/WebKit/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests_unittest.py&quot;,
line 51, in test_fast
   &apos;fast/html&apos;]))
 File &quot;/Users/eseidel/Projects/WebKit/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests_unittest.py&quot;,
line 41, in passing_run
   res = run_webkit_tests.main(options, args, False)
 File &quot;/Users/eseidel/Projects/WebKit/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py&quot;,
line 1621, in main
   num_unexpected_results = test_runner.run(result_summary, print_results)
 File &quot;/Users/eseidel/Projects/WebKit/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py&quot;,
line 697, in run
   result_summary)
 File &quot;/Users/eseidel/Projects/WebKit/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py&quot;,
line 1053, in _print_timing_statistics
   self._print_aggregate_test_statistics(write, individual_test_timings)
 File &quot;/Users/eseidel/Projects/WebKit/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py&quot;,
line 1066, in _print_aggregate_test_statistics
   test_types = individual_test_timings[0].time_for_diffs.keys()
IndexError: list index out of range

----------------------------------------------------------------------

Preparing a patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215209</commentid>
    <comment_count>22</comment_count>
      <attachid>53935</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-21 02:45:53 -0700</bug_when>
    <thetext>Created attachment 53935
Attempt to fix test-webkitpy</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215210</commentid>
    <comment_count>23</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-21 02:48:48 -0700</bug_when>
    <thetext>Committed r57960: &lt;http://trac.webkit.org/changeset/57960&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215377</commentid>
    <comment_count>24</comment_count>
      <attachid>53935</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-04-21 10:04:23 -0700</bug_when>
    <thetext>Comment on attachment 53935
Attempt to fix test-webkitpy

Change looks safe.

I&apos;m not sure why I didn&apos;t see the failed test. I&apos;ll have to look into it a bit more.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53558</attachid>
            <date>2010-04-16 13:41:27 -0700</date>
            <delta_ts>2010-04-16 13:55:36 -0700</delta_ts>
            <desc>patch</desc>
            <filename>wk37726_logging_1.diff</filename>
            <type>text/plain</type>
            <size>19200</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAzY2U0YjllLi5iNWRkM2I2IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAKKzIwMTAtMDQt
MTUgIERpcmsgUHJhbmtlIDxkcHJhbmtlQGNocm9taXVtLm9yZz4KKworICAgICAgICBGaXJzdCBv
ZiBzZXZlcmFsIHBhdGNoZXMgdG8gY2xlYW4gdXAgdGhlIGxvZ2dpbmcgb2YKKyAgICAgICAgbmV3
LXJ1bi13ZWJraXQtdGVzdHMgYW5kIGFkZCBuZXcgZnVuY3Rpb25hbGl0eS4gVGhpcyBwYXRjaCBh
ZGRzIGEKKyAgICAgICAgLS1sb2cgJ3RyYWNlJyBvcHRpb24gdGhhdCBwcmludHMgb3V0IGRldGFp
bGVkIGluZm8gYWJvdXQgYSBnaXZlbiB0ZXN0CisgICAgICAgIGFzIGl0IGV4ZWN1dGVzICh3aGVy
ZSB0aGUgYmFzZWxpbmVzIGFyZSwgd2hhdCB0aGUgZXhwZWN0YXRpb24gaXMsCisgICAgICAgIHdo
YXQgd2UgZ290LCBob3cgbG9uZyBpdCB0b29rKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzc3MjYKKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHMucHk6CisgICAgICAgICAgLSB1c2UgdGhl
IG5ld2x5IGV4cG9zZWQgVGVzdFJlc3VsdCBjbGFzcyBhbmQgaW1wbGVtZW50CisgICAgICAgICAg
ICAtLWxvZyB0cmFjZQorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xh
eW91dF9wYWNrYWdlL2R1bXBfcmVuZGVyX3RocmVhZC5weToKKyAgICAgICAgICAtIHJlbmFtZSBU
ZXN0U3RhdHMgdG8gVGVzdFJlc3VsdCBhbmQgbWFrZSBpdCBtb3JlIHB1YmxpYywgcmVzdWx0aW5n
CisgICAgICAgICAgICBpbiBjbGVhbmVyIGNvZGUKKwogMjAxMC0wNC0xMyAgQWRhbSBCYXJ0aCAg
PGFiYXJ0aEB3ZWJraXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIGJ1dCBhcHByb3ZlZCBi
eSBEdW1pdHJ1IERhbmlsaXVjLiAgKFRoaXMgcGF0Y2ggaXMgaW50ZW5kZWQKZGlmZiAtLWdpdCBh
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L2R1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdHJlZV90aHJlYWQucHkK
aW5kZXggOTNiNGM3OS4uMDIwZWY4MiAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdHJlZV90aHJl
YWQucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5
b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdHJlZV90aHJlYWQucHkKQEAgLTY2LDcgKzY2LDcgQEAg
ZGVmIHByb2Nlc3Nfb3V0cHV0KHBvcnQsIHRlc3RfaW5mbywgdGVzdF90eXBlcywgdGVzdF9hcmdz
LCBjb25maWd1cmF0aW9uLAogICAgICAgY29uZmlndXJhdGlvbjogRGVidWcgb3IgUmVsZWFzZQog
ICAgICAgb3V0cHV0X2RpcjogZGlyZWN0b3J5IHRvIHB1dCBjcmFzaCBzdGFjayB0cmFjZXMgaW50
bwogCi0gICAgUmV0dXJuczogYSBsaXN0IG9mIGZhaWx1cmUgb2JqZWN0cyBhbmQgdGltZXMgZm9y
IHRoZSB0ZXN0IGJlaW5nIHByb2Nlc3NlZAorICAgIFJldHVybnM6IGEgVGVzdFJlc3VsdCBvYmpl
Y3QKICAgICAiIiIKICAgICBmYWlsdXJlcyA9IFtdCiAKQEAgLTExMSwxNiArMTExLDE3IEBAIGRl
ZiBwcm9jZXNzX291dHB1dChwb3J0LCB0ZXN0X2luZm8sIHRlc3RfdHlwZXMsIHRlc3RfYXJncywg
Y29uZmlndXJhdGlvbiwKICAgICAgICAgICAgIHRpbWUudGltZSgpIC0gc3RhcnRfZGlmZl90aW1l
KQogCiAgICAgdG90YWxfdGltZV9mb3JfYWxsX2RpZmZzID0gdGltZS50aW1lKCkgLSBzdGFydF9k
aWZmX3RpbWUKLSAgICByZXR1cm4gVGVzdFN0YXRzKHRlc3RfaW5mby5maWxlbmFtZSwgZmFpbHVy
ZXMsIHRlc3RfcnVuX3RpbWUsCisgICAgcmV0dXJuIFRlc3RSZXN1bHQodGVzdF9pbmZvLmZpbGVu
YW1lLCBmYWlsdXJlcywgdGVzdF9ydW5fdGltZSwKICAgICAgICAgdG90YWxfdGltZV9mb3JfYWxs
X2RpZmZzLCB0aW1lX2Zvcl9kaWZmcykKIAogCi1jbGFzcyBUZXN0U3RhdHM6CitjbGFzcyBUZXN0
UmVzdWx0OgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBmYWlsdXJlcywgdGVz
dF9ydW5fdGltZSwKICAgICAgICAgICAgICAgICAgdG90YWxfdGltZV9mb3JfYWxsX2RpZmZzLCB0
aW1lX2Zvcl9kaWZmcyk6CiAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAg
ICBzZWxmLmZhaWx1cmVzID0gZmFpbHVyZXMKKyAgICAgICAgc2VsZi50eXBlID0gdGVzdF9mYWls
dXJlcy5kZXRlcm1pbmVfcmVzdWx0X3R5cGUoZmFpbHVyZXMpCiAgICAgICAgIHNlbGYudGVzdF9y
dW5fdGltZSA9IHRlc3RfcnVuX3RpbWUKICAgICAgICAgc2VsZi50b3RhbF90aW1lX2Zvcl9hbGxf
ZGlmZnMgPSB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnMKICAgICAgICAgc2VsZi50aW1lX2Zvcl9k
aWZmcyA9IHRpbWVfZm9yX2RpZmZzCkBAIC0xNTcsMTQgKzE1OCwxNCBAQCBjbGFzcyBTaW5nbGVU
ZXN0VGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgogICAgICAgICAgICAgZHJpdmVyLnJ1bl90ZXN0
KHRlc3RfaW5mby51cmkuc3RyaXAoKSwgdGVzdF9pbmZvLnRpbWVvdXQsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdGVzdF9pbmZvLmltYWdlX2hhc2gpCiAgICAgICAgIGVuZCA9IHRpbWUu
dGltZSgpCi0gICAgICAgIHNlbGYuX3Rlc3Rfc3RhdHMgPSBwcm9jZXNzX291dHB1dChzZWxmLl9w
b3J0LAorICAgICAgICBzZWxmLl90ZXN0X3Jlc3VsdCA9IHByb2Nlc3Nfb3V0cHV0KHNlbGYuX3Bv
cnQsCiAgICAgICAgICAgICB0ZXN0X2luZm8sIHNlbGYuX3Rlc3RfdHlwZXMsIHNlbGYuX3Rlc3Rf
YXJncywKICAgICAgICAgICAgIHNlbGYuX2NvbmZpZ3VyYXRpb24sIHNlbGYuX291dHB1dF9kaXIs
IGNyYXNoLCB0aW1lb3V0LCBlbmQgLSBzdGFydCwKICAgICAgICAgICAgIGFjdHVhbF9jaGVja3N1
bSwgb3V0cHV0LCBlcnJvcikKICAgICAgICAgZHJpdmVyLnN0b3AoKQogCi0gICAgZGVmIGdldF90
ZXN0X3N0YXRzKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fdGVzdF9zdGF0cworICAgIGRl
ZiBnZXRfdGVzdF9yZXN1bHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90ZXN0X3Jlc3Vs
dAogCiAKIGNsYXNzIFRlc3RTaGVsbFRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKQEAgLTIwMSw3
ICsyMDIsNyBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAg
ICAgIHNlbGYuX2NhbmNlbGVkID0gRmFsc2UKICAgICAgICAgc2VsZi5fZXhjZXB0aW9uX2luZm8g
PSBOb25lCiAgICAgICAgIHNlbGYuX2RpcmVjdG9yeV90aW1pbmdfc3RhdHMgPSB7fQotICAgICAg
ICBzZWxmLl90ZXN0X3N0YXRzID0gW10KKyAgICAgICAgc2VsZi5fdGVzdF9yZXN1bHRzID0gW10K
ICAgICAgICAgc2VsZi5fbnVtX3Rlc3RzID0gMAogICAgICAgICBzZWxmLl9zdGFydF90aW1lID0g
MAogICAgICAgICBzZWxmLl9zdG9wX3RpbWUgPSAwCkBAIC0yMTgsMTAgKzIxOSwxMCBAQCBjbGFz
cyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAgIChudW1iZXIgb2Yg
dGVzdHMgaW4gdGhhdCBkaXJlY3RvcnksIHRpbWUgdG8gcnVuIHRoZSB0ZXN0cykiIiIKICAgICAg
ICAgcmV0dXJuIHNlbGYuX2RpcmVjdG9yeV90aW1pbmdfc3RhdHMKIAotICAgIGRlZiBnZXRfaW5k
aXZpZHVhbF90ZXN0X3N0YXRzKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiAo
dGVzdF9maWxlbmFtZSwgdGltZV90b19ydW5fdGVzdCwKLSAgICAgICAgdG90YWxfdGltZV9mb3Jf
YWxsX2RpZmZzLCB0aW1lX2Zvcl9kaWZmcykgdHVwbGVzLiIiIgotICAgICAgICByZXR1cm4gc2Vs
Zi5fdGVzdF9zdGF0cworICAgIGRlZiBnZXRfdGVzdF9yZXN1bHRzKHNlbGYpOgorICAgICAgICAi
IiJSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCB0ZXN0cyBydW4gb24gdGhpcyB0aHJlYWQuIFVzZWQg
dG8gY2FsY3VsYXRlCisgICAgICAgIHBlci10aHJlYWQgc3RhdGlzdGljcy4iIiIKKyAgICAgICAg
cmV0dXJuIHNlbGYuX3Rlc3RfcmVzdWx0cwogCiAgICAgZGVmIGNhbmNlbChzZWxmKToKICAgICAg
ICAgIiIiU2V0IGEgZmxhZyB0ZWxsaW5nIHRoaXMgdGhyZWFkIHRvIHF1aXQuIiIiCkBAIC0zMTcs
MjcgKzMxOCwyOSBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAg
ICAgICAgICAgICBiYXRjaF9jb3VudCArPSAxCiAgICAgICAgICAgICBzZWxmLl9udW1fdGVzdHMg
Kz0gMQogICAgICAgICAgICAgaWYgc2VsZi5fb3B0aW9ucy5ydW5fc2luZ2x5OgotICAgICAgICAg
ICAgICAgIGZhaWx1cmVzID0gc2VsZi5fcnVuX3Rlc3Rfc2luZ2x5KHRlc3RfaW5mbykKKyAgICAg
ICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9ydW5fdGVzdF9zaW5nbHkodGVzdF9pbmZvKQogICAg
ICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBmYWlsdXJlcyA9IHNlbGYuX3J1bl90ZXN0
KHRlc3RfaW5mbykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9ydW5fdGVzdCh0ZXN0
X2luZm8pCiAKICAgICAgICAgICAgIGZpbGVuYW1lID0gdGVzdF9pbmZvLmZpbGVuYW1lCiAgICAg
ICAgICAgICB0ZXN0c19ydW5fZmlsZS53cml0ZShmaWxlbmFtZSArICJcbiIpCi0gICAgICAgICAg
ICBpZiBmYWlsdXJlczoKKyAgICAgICAgICAgIGlmIHJlc3VsdC5mYWlsdXJlczoKICAgICAgICAg
ICAgICAgICAjIENoZWNrIGFuZCBraWxsIER1bXBSZW5kZXJUcmVlIGlmIHdlIG5lZWQgdG9vLgot
ICAgICAgICAgICAgICAgIGlmIGxlbihbMSBmb3IgZiBpbiBmYWlsdXJlcyBpZiBmLnNob3VsZF9r
aWxsX2R1bXBfcmVuZGVyX3RyZWUoKV0pOgorICAgICAgICAgICAgICAgIGlmIGxlbihbMSBmb3Ig
ZiBpbiByZXN1bHQuZmFpbHVyZXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmLnNo
b3VsZF9raWxsX2R1bXBfcmVuZGVyX3RyZWUoKV0pOgogICAgICAgICAgICAgICAgICAgICBzZWxm
Ll9raWxsX2R1bXBfcmVuZGVyX3RyZWUoKQogICAgICAgICAgICAgICAgICAgICAjIFJlc2V0IHRo
ZSBiYXRjaCBjb3VudCBzaW5jZSB0aGUgc2hlbGwganVzdCBib3VuY2VkLgogICAgICAgICAgICAg
ICAgICAgICBiYXRjaF9jb3VudCA9IDAKICAgICAgICAgICAgICAgICAjIFByaW50IHRoZSBlcnJv
ciBtZXNzYWdlKHMpLgotICAgICAgICAgICAgICAgIGVycm9yX3N0ciA9ICdcbicuam9pbihbJyAg
JyArIGYubWVzc2FnZSgpIGZvciBmIGluIGZhaWx1cmVzXSkKKyAgICAgICAgICAgICAgICBlcnJv
cl9zdHIgPSAnXG4nLmpvaW4oWycgICcgKyBmLm1lc3NhZ2UoKSBmb3IgCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiBpbiByZXN1bHQuZmFpbHVyZXNdKQogICAg
ICAgICAgICAgICAgIF9sb2cuZGVidWcoIiVzICVzIGZhaWxlZDpcbiVzIiAlIChzZWxmLmdldE5h
bWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQucmVsYXRpdmVfdGVz
dF9maWxlbmFtZShmaWxlbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9z
dHIpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBfbG9nLmRlYnVnKCIlcyAl
cyBwYXNzZWQiICUgKHNlbGYuZ2V0TmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
c2VsZi5fcG9ydC5yZWxhdGl2ZV90ZXN0X2ZpbGVuYW1lKGZpbGVuYW1lKSkpCi0gICAgICAgICAg
ICBzZWxmLl9yZXN1bHRfcXVldWUucHV0KChmaWxlbmFtZSwgZmFpbHVyZXMpKQorICAgICAgICAg
ICAgc2VsZi5fcmVzdWx0X3F1ZXVlLnB1dChyZXN1bHQpCiAKICAgICAgICAgICAgIGlmIGJhdGNo
X3NpemUgPiAwIGFuZCBiYXRjaF9jb3VudCA+IGJhdGNoX3NpemU6CiAgICAgICAgICAgICAgICAg
IyBCb3VuY2UgdGhlIHNoZWxsIGFuZCByZXNldCBjb3VudC4KQEAgLTM1OCw3ICszNjEsNyBAQCBj
bGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAgICAgdGVzdF9p
bmZvOiBPYmplY3QgY29udGFpbmluZyB0aGUgdGVzdCBmaWxlbmFtZSwgdXJpIGFuZCB0aW1lb3V0
CiAKICAgICAgICAgUmV0dXJuOgotICAgICAgICAgIEEgbGlzdCBvZiBUZXN0RmFpbHVyZSBvYmpl
Y3RzIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorICAgICAgICAgIEEgVGVzdFJlc3VsdCAKICAgICAg
ICAgIiIiCiAgICAgICAgIHdvcmtlciA9IFNpbmdsZVRlc3RUaHJlYWQoc2VsZi5fcG9ydCwgc2Vs
Zi5faW1hZ2VfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9z
aGVsbF9hcmdzLApAQCAtMzg3LDE1ICszOTAsMTQgQEAgY2xhc3MgVGVzdFNoZWxsVGhyZWFkKHRo
cmVhZGluZy5UaHJlYWQpOgogICAgICAgICAgICAgd29ya2VyLl9kcml2ZXIuc3RvcCgpCiAKICAg
ICAgICAgdHJ5OgotICAgICAgICAgICAgc3RhdHMgPSB3b3JrZXIuZ2V0X3Rlc3Rfc3RhdHMoKQot
ICAgICAgICAgICAgc2VsZi5fdGVzdF9zdGF0cy5hcHBlbmQoc3RhdHMpCi0gICAgICAgICAgICBm
YWlsdXJlcyA9IHN0YXRzLmZhaWx1cmVzCisgICAgICAgICAgICByZXN1bHQgPSB3b3JrZXIuZ2V0
X3Rlc3RfcmVzdWx0KCkKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBlOgogICAgICAg
ICAgICAgZmFpbHVyZXMgPSBbXQogICAgICAgICAgICAgX2xvZy5lcnJvcignQ2Fubm90IGdldCBy
ZXN1bHRzIG9mIHRlc3Q6ICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfaW5mby5m
aWxlbmFtZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IFRlc3RSZXN1bHQodGVzdF9pbmZvLmZpbGVu
YW1lLCBbXSwgMCwgMCwgMCkKIAotICAgICAgICByZXR1cm4gZmFpbHVyZXMKKyAgICAgICAgcmV0
dXJuIHJlc3VsdAogCiAgICAgZGVmIF9ydW5fdGVzdChzZWxmLCB0ZXN0X2luZm8pOgogICAgICAg
ICAiIiJSdW4gYSBzaW5nbGUgdGVzdCBmaWxlIHVzaW5nIGEgc2hhcmVkIER1bXBSZW5kZXJUcmVl
IHByb2Nlc3MuCkBAIC00MTksMTQgKzQyMSwxMyBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhy
ZWFkaW5nLlRocmVhZCk6CiAgICAgICAgICAgIHNlbGYuX2RyaXZlci5ydW5fdGVzdCh0ZXN0X2lu
Zm8udXJpLCB0ZXN0X2luZm8udGltZW91dCwgaW1hZ2VfaGFzaCkKICAgICAgICAgZW5kID0gdGlt
ZS50aW1lKCkKIAotICAgICAgICBzdGF0cyA9IHByb2Nlc3Nfb3V0cHV0KHNlbGYuX3BvcnQsIHRl
c3RfaW5mbywgc2VsZi5fdGVzdF90eXBlcywKKyAgICAgICAgcmVzdWx0ID0gcHJvY2Vzc19vdXRw
dXQoc2VsZi5fcG9ydCwgdGVzdF9pbmZvLCBzZWxmLl90ZXN0X3R5cGVzLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RfYXJncywgc2VsZi5fb3B0aW9ucy5jb25maWd1
cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMucmVz
dWx0c19kaXJlY3RvcnksIGNyYXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRp
bWVvdXQsIGVuZCAtIHN0YXJ0LCBhY3R1YWxfY2hlY2tzdW0sCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgb3V0cHV0LCBlcnJvcikKLQotICAgICAgICBzZWxmLl90ZXN0X3N0YXRzLmFw
cGVuZChzdGF0cykKLSAgICAgICAgcmV0dXJuIHN0YXRzLmZhaWx1cmVzCisgICAgICAgIHNlbGYu
X3Rlc3RfcmVzdWx0cy5hcHBlbmQocmVzdWx0KSAKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCiAg
ICAgZGVmIF9lbnN1cmVfZHVtcF9yZW5kZXJfdHJlZV9pc19ydW5uaW5nKHNlbGYpOgogICAgICAg
ICAiIiJTdGFydCB0aGUgc2hhcmVkIER1bXBSZW5kZXJUcmVlLCBpZiBpdCdzIG5vdCBydW5uaW5n
LiAgTm90IGZvciB1c2Ugd2hlbgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVzdF9leHBlY3RhdGlvbnMucHkgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90
ZXN0X2V4cGVjdGF0aW9ucy5weQppbmRleCAzOTdlYzZlLi5lMzY3ZmFlIDEwMDY0NAotLS0gYS9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90
ZXN0X2V4cGVjdGF0aW9ucy5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xh
eW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90ZXN0X2V4cGVjdGF0aW9ucy5weQpAQCAtMTQxLDEy
ICsxNDEsMTYgQEAgY2xhc3MgVGVzdEV4cGVjdGF0aW9uczoKICAgICAgICAgcmV0dmFsID0gW10K
IAogICAgICAgICBmb3IgZXhwZWN0YXRpb24gaW4gZXhwZWN0YXRpb25zOgotICAgICAgICAgICAg
Zm9yIGl0ZW0gaW4gVGVzdEV4cGVjdGF0aW9uc0ZpbGUuRVhQRUNUQVRJT05TLml0ZW1zKCk6Ci0g
ICAgICAgICAgICAgICAgaWYgaXRlbVsxXSA9PSBleHBlY3RhdGlvbjoKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dmFsLmFwcGVuZChpdGVtWzBdKQotICAgICAgICAgICAgICAgICAgICBicmVhawor
ICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChzZWxmLmV4cGVjdGF0aW9uX3RvX3N0cmluZyhleHBl
Y3RhdGlvbikpCiAKLSAgICAgICAgcmV0dXJuICIgIi5qb2luKHJldHZhbCkudXBwZXIoKQorICAg
ICAgICByZXR1cm4gIiAiLmpvaW4ocmV0dmFsKQorCisgICAgZGVmIGV4cGVjdGF0aW9uX3RvX3N0
cmluZyhzZWxmLCBleHBlY3RhdGlvbik6CisgICAgICAgICIiIlJldHVybnMgdGhlIHVwcGVyY2Fz
ZWQgc3RyaW5nIGVxdWl2YWxlbnQgb2YgYSBnaXZlbiBleHBlY3RhdGlvbi4iIiIKKyAgICAgICAg
Zm9yIGl0ZW0gaW4gVGVzdEV4cGVjdGF0aW9uc0ZpbGUuRVhQRUNUQVRJT05TLml0ZW1zKCk6Cisg
ICAgICAgICAgICBpZiBpdGVtWzFdID09IGV4cGVjdGF0aW9uOgorICAgICAgICAgICAgICAgIHJl
dHVybiBpdGVtWzBdLnVwcGVyKCkKKyAgICAgICAgcmV0dXJuICIiCiAKICAgICBkZWYgZ2V0X3Rp
bWVsaW5lX2Zvcl90ZXN0KHNlbGYsIHRlc3QpOgogICAgICAgICByZXR1cm4gc2VsZi5fZXhwZWN0
ZWRfZmFpbHVyZXMuZ2V0X3RpbWVsaW5lX2Zvcl90ZXN0KHRlc3QpCmRpZmYgLS1naXQgYS9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzLnB5
IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90
ZXN0cy5weQppbmRleCA5NjkyZmYyLi4zNjE2NGJmIDEwMDc1NQotLS0gYS9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzLnB5CisrKyBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHMu
cHkKQEAgLTgxLDggKzgxLDE1IEBAIF9sb2cgPSBsb2dnaW5nLmdldExvZ2dlcigid2Via2l0cHku
bGF5b3V0X3Rlc3RzLnJ1bl93ZWJraXRfdGVzdHMiKQogIyBkaXJlY3RvcnktYnktZGlyZWN0b3J5
IGZlZWRiYWNrKS4KIExPR19ERVRBSUxFRF9QUk9HUkVTUyA9ICdkZXRhaWxlZC1wcm9ncmVzcycK
IAorTE9HX1NVTU1BUlkgPSAnc3VtbWFyeScKKworIyAiVHJhY2UiIHRoZSB0ZXN0IC0gbG9nIHRo
ZSBleHBlY3RlZCByZXN1bHQsIHRoZSBhY3R1YWwgcmVzdWx0LCBhbmQgdGhlCisjIGJhc2VsaW5l
cyB1c2VkCitMT0dfVFJBQ0UgPSAndHJhY2UnCisKICMgTG9nIGFueSB1bmV4cGVjdGVkIHJlc3Vs
dHMgd2hpbGUgcnVubmluZyAoaW5zdGVhZCBvZiBqdXN0IGF0IHRoZSBlbmQpLgogTE9HX1VORVhQ
RUNURUQgPSAndW5leHBlY3RlZCcKK0xPR19VTkVYUEVDVEVEX1JFU1VMVFMgPSAndW5leHBlY3Rl
ZC1yZXN1bHRzJwogCiAjIEJ1aWxkZXIgYmFzZSBVUkwgd2hlcmUgd2UgaGF2ZSB0aGUgYXJjaGl2
ZWQgdGVzdCByZXN1bHRzLgogQlVJTERFUl9CQVNFX1VSTCA9ICJodHRwOi8vYnVpbGQuY2hyb21p
dW0ub3JnL2J1aWxkYm90L2xheW91dF90ZXN0X3Jlc3VsdHMvIgpAQCAtMTM1LDI1ICsxNDIsMjMg
QEAgY2xhc3MgUmVzdWx0U3VtbWFyeShvYmplY3QpOgogICAgICAgICAgICAgc2VsZi50ZXN0c19i
eV90aW1lbGluZVt0aW1lbGluZV0gPSAoCiAgICAgICAgICAgICAgICAgZXhwZWN0YXRpb25zLmdl
dF90ZXN0c193aXRoX3RpbWVsaW5lKHRpbWVsaW5lKSkKIAotICAgIGRlZiBhZGQoc2VsZiwgdGVz
dCwgZmFpbHVyZXMsIHJlc3VsdCwgZXhwZWN0ZWQpOgotICAgICAgICAiIiJBZGQgYSByZXN1bHQg
aW50byB0aGUgYXBwcm9wcmlhdGUgYmluLgorICAgIGRlZiBhZGQoc2VsZiwgcmVzdWx0LCBleHBl
Y3RlZCk6CisgICAgICAgICIiIkFkZCBhIFRlc3RSZXN1bHQgaW50byB0aGUgYXBwcm9wcmlhdGUg
YmluLgogCiAgICAgICAgIEFyZ3M6Ci0gICAgICAgICAgdGVzdDogdGVzdCBmaWxlIG5hbWUKLSAg
ICAgICAgICBmYWlsdXJlczogbGlzdCBvZiBmYWlsdXJlIG9iamVjdHMgZnJvbSB0ZXN0IGV4ZWN1
dGlvbgotICAgICAgICAgIHJlc3VsdDogcmVzdWx0IG9mIHRlc3QgKFBBU1MsIElNQUdFLCBldGMu
KS4KKyAgICAgICAgICByZXN1bHQ6IFRlc3RSZXN1bHQgZnJvbSBkdW1wX3JlbmRlcl90cmVlX3Ro
cmVhZAogICAgICAgICAgIGV4cGVjdGVkOiB3aGV0aGVyIHRoZSByZXN1bHQgd2FzIHdoYXQgd2Ug
ZXhwZWN0ZWQgaXQgdG8gYmUuCiAgICAgICAgICIiIgogCi0gICAgICAgIHNlbGYudGVzdHNfYnlf
ZXhwZWN0YXRpb25bcmVzdWx0XS5hZGQodGVzdCkKLSAgICAgICAgc2VsZi5yZXN1bHRzW3Rlc3Rd
ID0gcmVzdWx0CisgICAgICAgIHNlbGYudGVzdHNfYnlfZXhwZWN0YXRpb25bcmVzdWx0LnR5cGVd
LmFkZChyZXN1bHQuZmlsZW5hbWUpCisgICAgICAgIHNlbGYucmVzdWx0c1tyZXN1bHQuZmlsZW5h
bWVdID0gcmVzdWx0LnR5cGUKICAgICAgICAgc2VsZi5yZW1haW5pbmcgLT0gMQotICAgICAgICBp
ZiBsZW4oZmFpbHVyZXMpOgotICAgICAgICAgICAgc2VsZi5mYWlsdXJlc1t0ZXN0XSA9IGZhaWx1
cmVzCisgICAgICAgIGlmIGxlbihyZXN1bHQuZmFpbHVyZXMpOgorICAgICAgICAgICAgc2VsZi5m
YWlsdXJlc1tyZXN1bHQuZmlsZW5hbWVdID0gcmVzdWx0LmZhaWx1cmVzCiAgICAgICAgIGlmIGV4
cGVjdGVkOgogICAgICAgICAgICAgc2VsZi5leHBlY3RlZCArPSAxCiAgICAgICAgIGVsc2U6Ci0g
ICAgICAgICAgICBzZWxmLnVuZXhwZWN0ZWRfcmVzdWx0c1t0ZXN0XSA9IHJlc3VsdAorICAgICAg
ICAgICAgc2VsZi51bmV4cGVjdGVkX3Jlc3VsdHNbcmVzdWx0LmZpbGVuYW1lXSA9IHJlc3VsdC50
eXBlCiAgICAgICAgICAgICBzZWxmLnVuZXhwZWN0ZWQgKz0gMQogCiAKQEAgLTM3NSw4ICszODAs
MTAgQEAgY2xhc3MgVGVzdFJ1bm5lcjoKICAgICAgICAgICAgICMgc3VidHJhY3RlZCBvdXQgb2Yg
c2VsZi5fdGVzdF9maWxlcywgYWJvdmUpLCBidXQgd2Ugc3R1YiBvdXQgdGhlCiAgICAgICAgICAg
ICAjIHJlc3VsdHMgaGVyZSBzbyB0aGUgc3RhdGlzdGljcyBjYW4gcmVtYWluIGFjY3VyYXRlLgog
ICAgICAgICAgICAgZm9yIHRlc3QgaW4gc2tpcF9jaHVuazoKLSAgICAgICAgICAgICAgICByZXN1
bHRfc3VtbWFyeS5hZGQodGVzdCwgW10sIHRlc3RfZXhwZWN0YXRpb25zLlNLSVAsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPVRydWUpCisgICAgICAgICAgICAg
ICAgcmVzdWx0ID0gZHVtcF9yZW5kZXJfdHJlZV90aHJlYWQuVGVzdFJlc3VsdCh0ZXN0LCBbXSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDAsIDAsIDApCisgICAgICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSB0ZXN0X2V4cGVjdGF0
aW9ucy5TS0lQCisgICAgICAgICAgICAgICAgcmVzdWx0X3N1bW1hcnkuYWRkKHJlc3VsdCwgZXhw
ZWN0ZWQ9VHJ1ZSkKICAgICAgICAgd3JpdGUoIiIpCiAKICAgICAgICAgcmV0dXJuIHJlc3VsdF9z
dW1tYXJ5CkBAIC01ODIsNyArNTg5LDcgQEAgY2xhc3MgVGVzdFJ1bm5lcjoKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0b3RhbF90aW1lJzogdGhyZWFkLmdldF90b3Rh
bF90aW1lKCl9KQogICAgICAgICAgICAgICAgIHRlc3RfdGltaW5ncy51cGRhdGUodGhyZWFkLmdl
dF9kaXJlY3RvcnlfdGltaW5nX3N0YXRzKCkpCiAgICAgICAgICAgICAgICAgaW5kaXZpZHVhbF90
ZXN0X3RpbWluZ3MuZXh0ZW5kKAotICAgICAgICAgICAgICAgICAgICB0aHJlYWQuZ2V0X2luZGl2
aWR1YWxfdGVzdF9zdGF0cygpKQorICAgICAgICAgICAgICAgICAgICB0aHJlYWQuZ2V0X3Rlc3Rf
cmVzdWx0cygpKQogICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgICAg
ICBmb3IgdGhyZWFkIGluIHRocmVhZHM6CiAgICAgICAgICAgICAgICAgdGhyZWFkLmNhbmNlbCgp
CkBAIC02OTUsMzMgKzcwMiw2NSBAQCBjbGFzcyBUZXN0UnVubmVyOgogICAgICAgICByZXR1cm4g
dW5leHBlY3RlZF9yZXN1bHRzWydudW1fcmVncmVzc2lvbnMnXQogCiAgICAgZGVmIHVwZGF0ZV9z
dW1tYXJ5KHNlbGYsIHJlc3VsdF9zdW1tYXJ5KToKLSAgICAgICAgIiIiVXBkYXRlIHRoZSBzdW1t
YXJ5IHdoaWxlIHJ1bm5pbmcgdGVzdHMuIiIiCisgICAgICAgICIiIlVwZGF0ZSB0aGUgc3VtbWFy
eSBhbmQgcHJpbnQgcmVzdWx0cyB3aXRoIGFueSBjb21wbGV0ZWQgdGVzdHMuIiIiCiAgICAgICAg
IHdoaWxlIFRydWU6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgKHRlc3QsIGZh
aWxfbGlzdCkgPSBzZWxmLl9yZXN1bHRfcXVldWUuZ2V0X25vd2FpdCgpCi0gICAgICAgICAgICAg
ICAgcmVzdWx0ID0gdGVzdF9mYWlsdXJlcy5kZXRlcm1pbmVfcmVzdWx0X3R5cGUoZmFpbF9saXN0
KQotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gc2VsZi5fZXhwZWN0YXRpb25zLm1hdGNoZXNf
YW5fZXhwZWN0ZWRfcmVzdWx0KHRlc3QsCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgc2Vs
Zi5fb3B0aW9ucy5waXhlbF90ZXN0cykKLSAgICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeS5h
ZGQodGVzdCwgZmFpbF9saXN0LCByZXN1bHQsIGV4cGVjdGVkKQotICAgICAgICAgICAgICAgIGlm
IChMT0dfREVUQUlMRURfUFJPR1JFU1MgaW4gc2VsZi5fb3B0aW9ucy5sb2cgYW5kCi0gICAgICAg
ICAgICAgICAgICAgIChzZWxmLl9vcHRpb25zLmV4cGVyaW1lbnRhbF9mdWxseV9wYXJhbGxlbCBv
cgotICAgICAgICAgICAgICAgICAgICAgc2VsZi5faXNfc2luZ2xlX3RocmVhZGVkKCkpKToKLSAg
ICAgICAgICAgICAgICAgICAgc2VsZi5fZGlzcGxheV9kZXRhaWxlZF9wcm9ncmVzcyhyZXN1bHRf
c3VtbWFyeSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBpZiBu
b3QgZXhwZWN0ZWQgYW5kIExPR19VTkVYUEVDVEVEIGluIHNlbGYuX29wdGlvbnMubG9nOgotICAg
ICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJpbnRfdW5leHBlY3RlZF90ZXN0X3Jlc3VsdCh0
ZXN0LCByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2Rpc3BsYXlfb25lX2xpbmVf
cHJvZ3Jlc3MocmVzdWx0X3N1bW1hcnkpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5f
cmVzdWx0X3F1ZXVlLmdldF9ub3dhaXQoKQorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gc2Vs
Zi5fZXhwZWN0YXRpb25zLm1hdGNoZXNfYW5fZXhwZWN0ZWRfcmVzdWx0KAorICAgICAgICAgICAg
ICAgICAgICByZXN1bHQuZmlsZW5hbWUsIHJlc3VsdC50eXBlLCBzZWxmLl9vcHRpb25zLnBpeGVs
X3Rlc3RzKQorICAgICAgICAgICAgICAgIHJlc3VsdF9zdW1tYXJ5LmFkZChyZXN1bHQsIGV4cGVj
dGVkKQorICAgICAgICAgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfcmVzdWx0cyhyZXN1bHQsIGV4
cGVjdGVkLCByZXN1bHRfc3VtbWFyeSkKICAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5FbXB0eToK
ICAgICAgICAgICAgICAgICByZXR1cm4KIAotICAgIGRlZiBfZGlzcGxheV9vbmVfbGluZV9wcm9n
cmVzcyhzZWxmLCByZXN1bHRfc3VtbWFyeSk6CisgICAgZGVmIF9wcmludF90ZXN0X3Jlc3VsdHMo
c2VsZiwgcmVzdWx0LCBleHBlY3RlZCwgcmVzdWx0X3N1bW1hcnkpOgorICAgICAgICAiUHJpbnQg
dGhlIHJlc3VsdCBvZiB0aGUgdGVzdCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSAtLWxvZyBzd2l0Y2hl
cy4iCisgICAgICAgIGlmIExPR19UUkFDRSBpbiBzZWxmLl9vcHRpb25zLmxvZzoKKyAgICAgICAg
ICAgIHNlbGYuX3ByaW50X3Rlc3RfdHJhY2UocmVzdWx0KQorICAgICAgICBlbGlmIChMT0dfREVU
QUlMRURfUFJPR1JFU1MgaW4gc2VsZi5fb3B0aW9ucy5sb2cgYW5kCisgICAgICAgICAgICAgIChz
ZWxmLl9vcHRpb25zLmV4cGVyaW1lbnRhbF9mdWxseV9wYXJhbGxlbCBvcgorICAgICAgICAgICAg
ICAgc2VsZi5faXNfc2luZ2xlX3RocmVhZGVkKCkpKToKKyAgICAgICAgICAgIHNlbGYuX3ByaW50
X2RldGFpbGVkX3Byb2dyZXNzKHJlc3VsdF9zdW1tYXJ5KQorICAgICAgICBlbHNlOgorICAgICAg
ICAgICAgaWYgKG5vdCBleHBlY3RlZCBhbmQgTE9HX1VORVhQRUNURUQgaW4gc2VsZi5fb3B0aW9u
cy5sb2cpOgorICAgICAgICAgICAgICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfdGVzdF9yZXN1
bHQocmVzdWx0KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfb25lX2xpbmVfcHJvZ3Jlc3MocmVz
dWx0X3N1bW1hcnkpCisKKyAgICBkZWYgX3ByaW50X3Rlc3RfdHJhY2Uoc2VsZiwgcmVzdWx0KToK
KyAgICAgICAgIiIiUHJpbnQgZGV0YWlsZWQgcmVzdWx0cyBvZiBhIHRlc3QgKHRyaWdnZXJlZCBi
eSAtLWxvZyB0cmFjZSkuCisgICAgICAgIEZvciBlYWNoIHRlc3QsIHByaW50OgorICAgICAgICAg
ICAtIGxvY2F0aW9uIG9mIHRoZSBleHBlY3RlZCBiYXNlbGluZXMKKyAgICAgICAgICAgLSBleHBl
Y3RlZCByZXN1bHRzCisgICAgICAgICAgIC0gYWN0dWFsIHJlc3VsdAorICAgICAgICAgICAtIHRp
bWluZyBpbmZvCisgICAgICAgICIiIgorICAgICAgICBmaWxlbmFtZSA9IHJlc3VsdC5maWxlbmFt
ZQorICAgICAgICB0ZXN0X25hbWUgPSBzZWxmLl9wb3J0LnJlbGF0aXZlX3Rlc3RfZmlsZW5hbWUo
ZmlsZW5hbWUpCisgICAgICAgIF9sb2cuaW5mbygndHJhY2U6ICVzJyAlIHRlc3RfbmFtZSkKKyAg
ICAgICAgX2xvZy5pbmZvKCcgIHR4dDogJXMnICUKKyAgICAgICAgICAgICAgICAgIHNlbGYuX3Bv
cnQucmVsYXRpdmVfdGVzdF9maWxlbmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5f
cG9ydC5leHBlY3RlZF9maWxlbmFtZShmaWxlbmFtZSwgJy50eHQnKSkpCisgICAgICAgIHBuZ19m
aWxlID0gc2VsZi5fcG9ydC5leHBlY3RlZF9maWxlbmFtZShmaWxlbmFtZSwgJy5wbmcnKQorICAg
ICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwbmdfZmlsZSk6CisgICAgICAgICAgICBfbG9nLmluZm8o
JyAgcG5nOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQucmVsYXRpdmVf
dGVzdF9maWxlbmFtZShmaWxlbmFtZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfbG9n
LmluZm8oJyAgcG5nOiA8bm9uZT4nKQorICAgICAgICBfbG9nLmluZm8oJyAgZXhwOiAlcycgJQor
ICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwZWN0YXRpb25zLmdldF9leHBlY3RhdGlvbnNfc3Ry
aW5nKGZpbGVuYW1lKSkKKyAgICAgICAgX2xvZy5pbmZvKCcgIGdvdDogJXMnICUKKyAgICAgICAg
ICAgICAgICAgIHNlbGYuX2V4cGVjdGF0aW9ucy5leHBlY3RhdGlvbl90b19zdHJpbmcocmVzdWx0
LnR5cGUpKQorICAgICAgICBfbG9nLmluZm8oJyB0b29rOiAlLS4zZicgJSByZXN1bHQudGVzdF9y
dW5fdGltZSkKKyAgICAgICAgX2xvZy5pbmZvKCcnKQorCisgICAgZGVmIF9wcmludF9vbmVfbGlu
ZV9wcm9ncmVzcyhzZWxmLCByZXN1bHRfc3VtbWFyeSk6CiAgICAgICAgICIiIkRpc3BsYXlzIHRo
ZSBwcm9ncmVzcyB0aHJvdWdoIHRoZSB0ZXN0IHJ1bi4iIiIKICAgICAgICAgcGVyY2VudF9jb21w
bGV0ZSA9IDEwMCAqIChyZXN1bHRfc3VtbWFyeS5leHBlY3RlZCArIHJlc3VsdF9zdW1tYXJ5LnVu
ZXhwZWN0ZWQpIC8gcmVzdWx0X3N1bW1hcnkudG90YWwKICAgICAgICAgc2VsZi5fbWV0ZXIudXBk
YXRlKCJUZXN0aW5nICglZCUlKTogJWQgcmFuIGFzIGV4cGVjdGVkLCAlZCBkaWRuJ3QsICVkIGxl
ZnQiICUKICAgICAgICAgICAgIChwZXJjZW50X2NvbXBsZXRlLCByZXN1bHRfc3VtbWFyeS5leHBl
Y3RlZCwKICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeS51bmV4cGVjdGVkLCByZXN1bHRfc3Vt
bWFyeS5yZW1haW5pbmcpKQogCi0gICAgZGVmIF9kaXNwbGF5X2RldGFpbGVkX3Byb2dyZXNzKHNl
bGYsIHJlc3VsdF9zdW1tYXJ5KToKKyAgICBkZWYgX3ByaW50X2RldGFpbGVkX3Byb2dyZXNzKHNl
bGYsIHJlc3VsdF9zdW1tYXJ5KToKICAgICAgICAgIiIiRGlzcGxheSBkZXRhaWxlZCBwcm9ncmVz
cyBvdXRwdXQgd2hlcmUgd2UgcHJpbnQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICAgICAgIGFuZCBv
bmUgZG90IGZvciBlYWNoIGNvbXBsZXRlZCB0ZXN0LiBUaGlzIGlzIHRyaWdnZXJlZCBieQogICAg
ICAgICAiLS1sb2cgZGV0YWlsZWQtcHJvZ3Jlc3MiLiIiIgpAQCAtNzY1LDYgKzgwNCwxMyBAQCBj
bGFzcyBUZXN0UnVubmVyOgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5fbWV0ZXIu
d3JpdGUoIiVzXG4iICUgKHNlbGYuX2N1cnJlbnRfcHJvZ3Jlc3Nfc3RyKSkKIAorICAgIGRlZiBf
cHJpbnRfdW5leHBlY3RlZF90ZXN0X3Jlc3VsdChzZWxmLCByZXN1bHQpOgorICAgICAgICAiIiJQ
cmludHMgb25lIHVuZXhwZWN0ZWQgdGVzdCByZXN1bHQgbGluZS4iIiIKKyAgICAgICAgZGVzYyA9
IFRlc3RFeHBlY3RhdGlvbnNGaWxlLkVYUEVDVEFUSU9OX0RFU0NSSVBUSU9OU1tyZXN1bHQudHlw
ZV1bMF0KKyAgICAgICAgc2VsZi5fbWV0ZXIud3JpdGUoIiAgJXMgLT4gdW5leHBlY3RlZCAlc1xu
IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9wb3J0LnJlbGF0aXZlX3Rlc3Rf
ZmlsZW5hbWUocmVzdWx0LmZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRl
c2MpKQorCiAgICAgZGVmIF9nZXRfZmFpbHVyZXMoc2VsZiwgcmVzdWx0X3N1bW1hcnksIGluY2x1
ZGVfY3Jhc2hlcyk6CiAgICAgICAgICIiIkZpbHRlcnMgYSBkaWN0IG9mIHJlc3VsdHMgYW5kIHJl
dHVybnMgb25seSB0aGUgZmFpbHVyZXMuCiAKQEAgLTEyNzcsMTIgKzEzMjMsNiBAQCBjbGFzcyBU
ZXN0UnVubmVyOgogICAgICAgICBpZiBsZW4odW5leHBlY3RlZF9yZXN1bHRzWyd0ZXN0cyddKSBh
bmQgc2VsZi5fb3B0aW9ucy52ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgIi0iICogNzgKIAot
ICAgIGRlZiBfcHJpbnRfdW5leHBlY3RlZF90ZXN0X3Jlc3VsdChzZWxmLCB0ZXN0LCByZXN1bHQp
OgotICAgICAgICAiIiJQcmludHMgb25lIHVuZXhwZWN0ZWQgdGVzdCByZXN1bHQgbGluZS4iIiIK
LSAgICAgICAgZGVzYyA9IFRlc3RFeHBlY3RhdGlvbnNGaWxlLkVYUEVDVEFUSU9OX0RFU0NSSVBU
SU9OU1tyZXN1bHRdWzBdCi0gICAgICAgIHNlbGYuX21ldGVyLndyaXRlKCIgICVzIC0+IHVuZXhw
ZWN0ZWQgJXNcbiIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fcG9ydC5yZWxh
dGl2ZV90ZXN0X2ZpbGVuYW1lKHRlc3QpLCBkZXNjKSkKLQogICAgIGRlZiBfd3JpdGVfcmVzdWx0
c19odG1sX2ZpbGUoc2VsZiwgcmVzdWx0X3N1bW1hcnkpOgogICAgICAgICAiIiJXcml0ZSByZXN1
bHRzLmh0bWwgd2hpY2ggaXMgYSBzdW1tYXJ5IG9mIHRlc3RzIHRoYXQgZmFpbGVkLgogCkBAIC0x
NTQwLDEwICsxNTgwLDEwIEBAIGRlZiBwYXJzZV9hcmdzKGFyZ3M9Tm9uZSk6CiAgICAgXQogCiAg
ICAgbG9nZ2luZ19vcHRpb25zID0gWwotICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLS1s
b2ciLCBhY3Rpb249InN0b3JlIiwgZGVmYXVsdD0iZGV0YWlsZWQtcHJvZ3Jlc3MsdW5leHBlY3Rl
ZCIsCisgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItLWxvZyIsIGFjdGlvbj0ic3RvcmUi
LCBkZWZhdWx0PSJkZXRhaWxlZC1wcm9ncmVzcyx1bmV4cGVjdGVkLHN1bW1hcnksdW5leHBlY3Rl
ZC1yZXN1bHRzIiwKICAgICAgICAgICAgICAgICAgICAgaGVscD0ibG9nIHZhcmlvdXMgdHlwZXMg
b2YgZGF0YS4gVGhlIHBhcmFtIHNob3VsZCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZh
bHVlcyBmcm9tOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImFjdHVhbCxjb25maWcsIiAr
IExPR19ERVRBSUxFRF9QUk9HUkVTUyArICIsZXhwZWN0ZWQsdGltaW5nLCIgKyBMT0dfVU5FWFBF
Q1RFRCArICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHRzIHRvICIgKyAi
LS1sb2cgZGV0YWlsZWQtcHJvZ3Jlc3MsdW5leHBlY3RlZCkiKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAiYWN0dWFsLGNvbmZpZywiICsgTE9HX0RFVEFJTEVEX1BST0dSRVNTICsgIixleHBl
Y3RlZCx0aW1pbmcsdHJhY2UsIiArIExPR19VTkVYUEVDVEVEICsgIiAiCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICIoZGVmYXVsdHMgdG8gIiArICItLWxvZyBkZXRhaWxlZC1wcm9ncmVzcyxz
dW1tYXJ5LHVuZXhwZWN0ZWQsdW5leHBlY3RlZC1yZXN1bHRzKSIpLAogICAgICAgICBvcHRwYXJz
ZS5tYWtlX29wdGlvbigiLXYiLCAiLS12ZXJib3NlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVm
YXVsdD1GYWxzZSwgaGVscD0iaW5jbHVkZSBkZWJ1Zy1sZXZlbCBsb2dnaW5nIiksCiAgICAgICAg
IG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItLXNvdXJjZXMiLCBhY3Rpb249InN0b3JlX3RydWUiLCBo
ZWxwPSJzaG93IGV4cGVjdGVkIHJlc3VsdCBmaWxlIHBhdGggZm9yIGVhY2ggdGVzdCAoaW1wbGll
cyAtLXZlcmJvc2UpIiksCiAgICAgICAgICMgb2xkLXJ1bi13ZWJraXQtdGVzdHMgaGFzIGEgLS1z
bG93ZXN0IG9wdGlvbiB3aGljaCBqdXN0IHByaW50cyB0aGUgc2xvd2VzdCAxMC4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53561</attachid>
            <date>2010-04-16 13:55:36 -0700</date>
            <delta_ts>2010-04-16 16:33:18 -0700</delta_ts>
            <desc>re-sync to tip of tree to merge some things</desc>
            <filename>wk37726_logging_1.diff</filename>
            <type>text/plain</type>
            <size>18521</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA5OThhNmQzLi4wMjA4NzQ1IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAKKzIwMTAtMDQt
MTUgIERpcmsgUHJhbmtlIDxkcHJhbmtlQGNocm9taXVtLm9yZz4KKworICAgICAgICBGaXJzdCBv
ZiBzZXZlcmFsIHBhdGNoZXMgdG8gY2xlYW4gdXAgdGhlIGxvZ2dpbmcgb2YKKyAgICAgICAgbmV3
LXJ1bi13ZWJraXQtdGVzdHMgYW5kIGFkZCBuZXcgZnVuY3Rpb25hbGl0eS4gVGhpcyBwYXRjaCBh
ZGRzIGEKKyAgICAgICAgLS1sb2cgJ3RyYWNlJyBvcHRpb24gdGhhdCBwcmludHMgb3V0IGRldGFp
bGVkIGluZm8gYWJvdXQgYSBnaXZlbiB0ZXN0CisgICAgICAgIGFzIGl0IGV4ZWN1dGVzICh3aGVy
ZSB0aGUgYmFzZWxpbmVzIGFyZSwgd2hhdCB0aGUgZXhwZWN0YXRpb24gaXMsCisgICAgICAgIHdo
YXQgd2UgZ290LCBob3cgbG9uZyBpdCB0b29rKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzc3MjYKKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHMucHk6CisgICAgICAgICAgLSB1c2UgdGhl
IG5ld2x5IGV4cG9zZWQgVGVzdFJlc3VsdCBjbGFzcyBhbmQgaW1wbGVtZW50CisgICAgICAgICAg
ICAtLWxvZyB0cmFjZQorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xh
eW91dF9wYWNrYWdlL2R1bXBfcmVuZGVyX3RocmVhZC5weToKKyAgICAgICAgICAtIHJlbmFtZSBU
ZXN0U3RhdHMgdG8gVGVzdFJlc3VsdCBhbmQgbWFrZSBpdCBtb3JlIHB1YmxpYywgcmVzdWx0aW5n
CisgICAgICAgICAgICBpbiBjbGVhbmVyIGNvZGUKKwogMjAxMC0wNC0xNSAgU2FtIFdlaW5pZyAg
PHNhbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFuZGVycyBDYXJsc3Nvbi4K
ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xh
eW91dF9wYWNrYWdlL2R1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLnB5IGIvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdHJl
ZV90aHJlYWQucHkKaW5kZXggOTNiNGM3OS4uZGY1NTVkOSAxMDA2NDQKLS0tIGEvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5k
ZXJfdHJlZV90aHJlYWQucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdHJlZV90aHJlYWQucHkKQEAgLTY2
LDcgKzY2LDcgQEAgZGVmIHByb2Nlc3Nfb3V0cHV0KHBvcnQsIHRlc3RfaW5mbywgdGVzdF90eXBl
cywgdGVzdF9hcmdzLCBjb25maWd1cmF0aW9uLAogICAgICAgY29uZmlndXJhdGlvbjogRGVidWcg
b3IgUmVsZWFzZQogICAgICAgb3V0cHV0X2RpcjogZGlyZWN0b3J5IHRvIHB1dCBjcmFzaCBzdGFj
ayB0cmFjZXMgaW50bwogCi0gICAgUmV0dXJuczogYSBsaXN0IG9mIGZhaWx1cmUgb2JqZWN0cyBh
bmQgdGltZXMgZm9yIHRoZSB0ZXN0IGJlaW5nIHByb2Nlc3NlZAorICAgIFJldHVybnM6IGEgVGVz
dFJlc3VsdCBvYmplY3QKICAgICAiIiIKICAgICBmYWlsdXJlcyA9IFtdCiAKQEAgLTExMSwxNiAr
MTExLDE3IEBAIGRlZiBwcm9jZXNzX291dHB1dChwb3J0LCB0ZXN0X2luZm8sIHRlc3RfdHlwZXMs
IHRlc3RfYXJncywgY29uZmlndXJhdGlvbiwKICAgICAgICAgICAgIHRpbWUudGltZSgpIC0gc3Rh
cnRfZGlmZl90aW1lKQogCiAgICAgdG90YWxfdGltZV9mb3JfYWxsX2RpZmZzID0gdGltZS50aW1l
KCkgLSBzdGFydF9kaWZmX3RpbWUKLSAgICByZXR1cm4gVGVzdFN0YXRzKHRlc3RfaW5mby5maWxl
bmFtZSwgZmFpbHVyZXMsIHRlc3RfcnVuX3RpbWUsCisgICAgcmV0dXJuIFRlc3RSZXN1bHQodGVz
dF9pbmZvLmZpbGVuYW1lLCBmYWlsdXJlcywgdGVzdF9ydW5fdGltZSwKICAgICAgICAgdG90YWxf
dGltZV9mb3JfYWxsX2RpZmZzLCB0aW1lX2Zvcl9kaWZmcykKIAogCi1jbGFzcyBUZXN0U3RhdHM6
CitjbGFzcyBUZXN0UmVzdWx0OgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBm
YWlsdXJlcywgdGVzdF9ydW5fdGltZSwKICAgICAgICAgICAgICAgICAgdG90YWxfdGltZV9mb3Jf
YWxsX2RpZmZzLCB0aW1lX2Zvcl9kaWZmcyk6CiAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxl
bmFtZQogICAgICAgICBzZWxmLmZhaWx1cmVzID0gZmFpbHVyZXMKKyAgICAgICAgc2VsZi50eXBl
ID0gdGVzdF9mYWlsdXJlcy5kZXRlcm1pbmVfcmVzdWx0X3R5cGUoZmFpbHVyZXMpCiAgICAgICAg
IHNlbGYudGVzdF9ydW5fdGltZSA9IHRlc3RfcnVuX3RpbWUKICAgICAgICAgc2VsZi50b3RhbF90
aW1lX2Zvcl9hbGxfZGlmZnMgPSB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnMKICAgICAgICAgc2Vs
Zi50aW1lX2Zvcl9kaWZmcyA9IHRpbWVfZm9yX2RpZmZzCkBAIC0xNTcsMTQgKzE1OCwxNCBAQCBj
bGFzcyBTaW5nbGVUZXN0VGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgogICAgICAgICAgICAgZHJp
dmVyLnJ1bl90ZXN0KHRlc3RfaW5mby51cmkuc3RyaXAoKSwgdGVzdF9pbmZvLnRpbWVvdXQsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9pbmZvLmltYWdlX2hhc2gpCiAgICAgICAg
IGVuZCA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuX3Rlc3Rfc3RhdHMgPSBwcm9jZXNzX291
dHB1dChzZWxmLl9wb3J0LAorICAgICAgICBzZWxmLl90ZXN0X3Jlc3VsdCA9IHByb2Nlc3Nfb3V0
cHV0KHNlbGYuX3BvcnQsCiAgICAgICAgICAgICB0ZXN0X2luZm8sIHNlbGYuX3Rlc3RfdHlwZXMs
IHNlbGYuX3Rlc3RfYXJncywKICAgICAgICAgICAgIHNlbGYuX2NvbmZpZ3VyYXRpb24sIHNlbGYu
X291dHB1dF9kaXIsIGNyYXNoLCB0aW1lb3V0LCBlbmQgLSBzdGFydCwKICAgICAgICAgICAgIGFj
dHVhbF9jaGVja3N1bSwgb3V0cHV0LCBlcnJvcikKICAgICAgICAgZHJpdmVyLnN0b3AoKQogCi0g
ICAgZGVmIGdldF90ZXN0X3N0YXRzKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fdGVzdF9z
dGF0cworICAgIGRlZiBnZXRfdGVzdF9yZXN1bHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
Ll90ZXN0X3Jlc3VsdAogCiAKIGNsYXNzIFRlc3RTaGVsbFRocmVhZCh0aHJlYWRpbmcuVGhyZWFk
KToKQEAgLTIwMSw3ICsyMDIsNyBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRo
cmVhZCk6CiAgICAgICAgIHNlbGYuX2NhbmNlbGVkID0gRmFsc2UKICAgICAgICAgc2VsZi5fZXhj
ZXB0aW9uX2luZm8gPSBOb25lCiAgICAgICAgIHNlbGYuX2RpcmVjdG9yeV90aW1pbmdfc3RhdHMg
PSB7fQotICAgICAgICBzZWxmLl90ZXN0X3N0YXRzID0gW10KKyAgICAgICAgc2VsZi5fdGVzdF9y
ZXN1bHRzID0gW10KICAgICAgICAgc2VsZi5fbnVtX3Rlc3RzID0gMAogICAgICAgICBzZWxmLl9z
dGFydF90aW1lID0gMAogICAgICAgICBzZWxmLl9zdG9wX3RpbWUgPSAwCkBAIC0yMTgsMTAgKzIx
OSwxMCBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAg
IChudW1iZXIgb2YgdGVzdHMgaW4gdGhhdCBkaXJlY3RvcnksIHRpbWUgdG8gcnVuIHRoZSB0ZXN0
cykiIiIKICAgICAgICAgcmV0dXJuIHNlbGYuX2RpcmVjdG9yeV90aW1pbmdfc3RhdHMKIAotICAg
IGRlZiBnZXRfaW5kaXZpZHVhbF90ZXN0X3N0YXRzKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm5z
IGEgbGlzdCBvZiAodGVzdF9maWxlbmFtZSwgdGltZV90b19ydW5fdGVzdCwKLSAgICAgICAgdG90
YWxfdGltZV9mb3JfYWxsX2RpZmZzLCB0aW1lX2Zvcl9kaWZmcykgdHVwbGVzLiIiIgotICAgICAg
ICByZXR1cm4gc2VsZi5fdGVzdF9zdGF0cworICAgIGRlZiBnZXRfdGVzdF9yZXN1bHRzKHNlbGYp
OgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCB0ZXN0cyBydW4gb24gdGhpcyB0
aHJlYWQuIFVzZWQgdG8gY2FsY3VsYXRlCisgICAgICAgIHBlci10aHJlYWQgc3RhdGlzdGljcy4i
IiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Rlc3RfcmVzdWx0cwogCiAgICAgZGVmIGNhbmNlbChz
ZWxmKToKICAgICAgICAgIiIiU2V0IGEgZmxhZyB0ZWxsaW5nIHRoaXMgdGhyZWFkIHRvIHF1aXQu
IiIiCkBAIC0zMTcsMjcgKzMxOCwyOSBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5n
LlRocmVhZCk6CiAgICAgICAgICAgICBiYXRjaF9jb3VudCArPSAxCiAgICAgICAgICAgICBzZWxm
Ll9udW1fdGVzdHMgKz0gMQogICAgICAgICAgICAgaWYgc2VsZi5fb3B0aW9ucy5ydW5fc2luZ2x5
OgotICAgICAgICAgICAgICAgIGZhaWx1cmVzID0gc2VsZi5fcnVuX3Rlc3Rfc2luZ2x5KHRlc3Rf
aW5mbykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9ydW5fdGVzdF9zaW5nbHkodGVz
dF9pbmZvKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBmYWlsdXJlcyA9IHNl
bGYuX3J1bl90ZXN0KHRlc3RfaW5mbykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9y
dW5fdGVzdCh0ZXN0X2luZm8pCiAKICAgICAgICAgICAgIGZpbGVuYW1lID0gdGVzdF9pbmZvLmZp
bGVuYW1lCiAgICAgICAgICAgICB0ZXN0c19ydW5fZmlsZS53cml0ZShmaWxlbmFtZSArICJcbiIp
Ci0gICAgICAgICAgICBpZiBmYWlsdXJlczoKKyAgICAgICAgICAgIGlmIHJlc3VsdC5mYWlsdXJl
czoKICAgICAgICAgICAgICAgICAjIENoZWNrIGFuZCBraWxsIER1bXBSZW5kZXJUcmVlIGlmIHdl
IG5lZWQgdG9vLgotICAgICAgICAgICAgICAgIGlmIGxlbihbMSBmb3IgZiBpbiBmYWlsdXJlcyBp
ZiBmLnNob3VsZF9raWxsX2R1bXBfcmVuZGVyX3RyZWUoKV0pOgorICAgICAgICAgICAgICAgIGlm
IGxlbihbMSBmb3IgZiBpbiByZXN1bHQuZmFpbHVyZXMKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIGYuc2hvdWxkX2tpbGxfZHVtcF9yZW5kZXJfdHJlZSgpXSk6CiAgICAgICAgICAgICAg
ICAgICAgIHNlbGYuX2tpbGxfZHVtcF9yZW5kZXJfdHJlZSgpCiAgICAgICAgICAgICAgICAgICAg
ICMgUmVzZXQgdGhlIGJhdGNoIGNvdW50IHNpbmNlIHRoZSBzaGVsbCBqdXN0IGJvdW5jZWQuCiAg
ICAgICAgICAgICAgICAgICAgIGJhdGNoX2NvdW50ID0gMAogICAgICAgICAgICAgICAgICMgUHJp
bnQgdGhlIGVycm9yIG1lc3NhZ2UocykuCi0gICAgICAgICAgICAgICAgZXJyb3Jfc3RyID0gJ1xu
Jy5qb2luKFsnICAnICsgZi5tZXNzYWdlKCkgZm9yIGYgaW4gZmFpbHVyZXNdKQorICAgICAgICAg
ICAgICAgIGVycm9yX3N0ciA9ICdcbicuam9pbihbJyAgJyArIGYubWVzc2FnZSgpIGZvcgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgaW4gcmVzdWx0LmZhaWx1
cmVzXSkKICAgICAgICAgICAgICAgICBfbG9nLmRlYnVnKCIlcyAlcyBmYWlsZWQ6XG4lcyIgJSAo
c2VsZi5nZXROYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wb3J0LnJl
bGF0aXZlX3Rlc3RfZmlsZW5hbWUoZmlsZW5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZXJyb3Jfc3RyKSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgX2xvZy5k
ZWJ1ZygiJXMgJXMgcGFzc2VkIiAlIChzZWxmLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHNlbGYuX3BvcnQucmVsYXRpdmVfdGVzdF9maWxlbmFtZShmaWxlbmFtZSkpKQot
ICAgICAgICAgICAgc2VsZi5fcmVzdWx0X3F1ZXVlLnB1dCgoZmlsZW5hbWUsIGZhaWx1cmVzKSkK
KyAgICAgICAgICAgIHNlbGYuX3Jlc3VsdF9xdWV1ZS5wdXQocmVzdWx0KQogCiAgICAgICAgICAg
ICBpZiBiYXRjaF9zaXplID4gMCBhbmQgYmF0Y2hfY291bnQgPiBiYXRjaF9zaXplOgogICAgICAg
ICAgICAgICAgICMgQm91bmNlIHRoZSBzaGVsbCBhbmQgcmVzZXQgY291bnQuCkBAIC0zNTgsNyAr
MzYxLDcgQEAgY2xhc3MgVGVzdFNoZWxsVGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgogICAgICAg
ICAgIHRlc3RfaW5mbzogT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRlc3QgZmlsZW5hbWUsIHVyaSBh
bmQgdGltZW91dAogCiAgICAgICAgIFJldHVybjoKLSAgICAgICAgICBBIGxpc3Qgb2YgVGVzdEZh
aWx1cmUgb2JqZWN0cyBkZXNjcmliaW5nIHRoZSBlcnJvci4KKyAgICAgICAgICBBIFRlc3RSZXN1
bHQgCiAgICAgICAgICIiIgogICAgICAgICB3b3JrZXIgPSBTaW5nbGVUZXN0VGhyZWFkKHNlbGYu
X3BvcnQsIHNlbGYuX2ltYWdlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc2VsZi5fc2hlbGxfYXJncywKQEAgLTM4NywxNSArMzkwLDE0IEBAIGNsYXNzIFRlc3RTaGVs
bFRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKICAgICAgICAgICAgIHdvcmtlci5fZHJpdmVyLnN0
b3AoKQogCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHN0YXRzID0gd29ya2VyLmdldF90ZXN0
X3N0YXRzKCkKLSAgICAgICAgICAgIHNlbGYuX3Rlc3Rfc3RhdHMuYXBwZW5kKHN0YXRzKQotICAg
ICAgICAgICAgZmFpbHVyZXMgPSBzdGF0cy5mYWlsdXJlcworICAgICAgICAgICAgcmVzdWx0ID0g
d29ya2VyLmdldF90ZXN0X3Jlc3VsdCgpCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwg
ZToKICAgICAgICAgICAgIGZhaWx1cmVzID0gW10KICAgICAgICAgICAgIF9sb2cuZXJyb3IoJ0Nh
bm5vdCBnZXQgcmVzdWx0cyBvZiB0ZXN0OiAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICB0
ZXN0X2luZm8uZmlsZW5hbWUpCisgICAgICAgICAgICByZXN1bHQgPSBUZXN0UmVzdWx0KHRlc3Rf
aW5mby5maWxlbmFtZSwgW10sIDAsIDAsIDApCiAKLSAgICAgICAgcmV0dXJuIGZhaWx1cmVzCisg
ICAgICAgIHJldHVybiByZXN1bHQKIAogICAgIGRlZiBfcnVuX3Rlc3Qoc2VsZiwgdGVzdF9pbmZv
KToKICAgICAgICAgIiIiUnVuIGEgc2luZ2xlIHRlc3QgZmlsZSB1c2luZyBhIHNoYXJlZCBEdW1w
UmVuZGVyVHJlZSBwcm9jZXNzLgpAQCAtNDE5LDE0ICs0MjEsMTMgQEAgY2xhc3MgVGVzdFNoZWxs
VGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgogICAgICAgICAgICBzZWxmLl9kcml2ZXIucnVuX3Rl
c3QodGVzdF9pbmZvLnVyaSwgdGVzdF9pbmZvLnRpbWVvdXQsIGltYWdlX2hhc2gpCiAgICAgICAg
IGVuZCA9IHRpbWUudGltZSgpCiAKLSAgICAgICAgc3RhdHMgPSBwcm9jZXNzX291dHB1dChzZWxm
Ll9wb3J0LCB0ZXN0X2luZm8sIHNlbGYuX3Rlc3RfdHlwZXMsCisgICAgICAgIHJlc3VsdCA9IHBy
b2Nlc3Nfb3V0cHV0KHNlbGYuX3BvcnQsIHRlc3RfaW5mbywgc2VsZi5fdGVzdF90eXBlcywKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZXN0X2FyZ3MsIHNlbGYuX29wdGlv
bnMuY29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9v
cHRpb25zLnJlc3VsdHNfZGlyZWN0b3J5LCBjcmFzaCwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB0aW1lb3V0LCBlbmQgLSBzdGFydCwgYWN0dWFsX2NoZWNrc3VtLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgZXJyb3IpCi0KLSAgICAgICAgc2VsZi5fdGVz
dF9zdGF0cy5hcHBlbmQoc3RhdHMpCi0gICAgICAgIHJldHVybiBzdGF0cy5mYWlsdXJlcworICAg
ICAgICBzZWxmLl90ZXN0X3Jlc3VsdHMuYXBwZW5kKHJlc3VsdCkgCisgICAgICAgIHJldHVybiBy
ZXN1bHQKIAogICAgIGRlZiBfZW5zdXJlX2R1bXBfcmVuZGVyX3RyZWVfaXNfcnVubmluZyhzZWxm
KToKICAgICAgICAgIiIiU3RhcnQgdGhlIHNoYXJlZCBEdW1wUmVuZGVyVHJlZSwgaWYgaXQncyBu
b3QgcnVubmluZy4gIE5vdCBmb3IgdXNlIHdoZW4KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfZXhwZWN0YXRp
b25zLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0
X3BhY2thZ2UvdGVzdF9leHBlY3RhdGlvbnMucHkKaW5kZXggMzk3ZWM2ZS4uZTM2N2ZhZSAxMDA2
NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0
X3BhY2thZ2UvdGVzdF9leHBlY3RhdGlvbnMucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvdGVzdF9leHBlY3RhdGlvbnMucHkK
QEAgLTE0MSwxMiArMTQxLDE2IEBAIGNsYXNzIFRlc3RFeHBlY3RhdGlvbnM6CiAgICAgICAgIHJl
dHZhbCA9IFtdCiAKICAgICAgICAgZm9yIGV4cGVjdGF0aW9uIGluIGV4cGVjdGF0aW9uczoKLSAg
ICAgICAgICAgIGZvciBpdGVtIGluIFRlc3RFeHBlY3RhdGlvbnNGaWxlLkVYUEVDVEFUSU9OUy5p
dGVtcygpOgotICAgICAgICAgICAgICAgIGlmIGl0ZW1bMV0gPT0gZXhwZWN0YXRpb246Ci0gICAg
ICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoaXRlbVswXSkKLSAgICAgICAgICAgICAgICAg
ICAgYnJlYWsKKyAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoc2VsZi5leHBlY3RhdGlvbl90b19z
dHJpbmcoZXhwZWN0YXRpb24pKQogCi0gICAgICAgIHJldHVybiAiICIuam9pbihyZXR2YWwpLnVw
cGVyKCkKKyAgICAgICAgcmV0dXJuICIgIi5qb2luKHJldHZhbCkKKworICAgIGRlZiBleHBlY3Rh
dGlvbl90b19zdHJpbmcoc2VsZiwgZXhwZWN0YXRpb24pOgorICAgICAgICAiIiJSZXR1cm5zIHRo
ZSB1cHBlcmNhc2VkIHN0cmluZyBlcXVpdmFsZW50IG9mIGEgZ2l2ZW4gZXhwZWN0YXRpb24uIiIi
CisgICAgICAgIGZvciBpdGVtIGluIFRlc3RFeHBlY3RhdGlvbnNGaWxlLkVYUEVDVEFUSU9OUy5p
dGVtcygpOgorICAgICAgICAgICAgaWYgaXRlbVsxXSA9PSBleHBlY3RhdGlvbjoKKyAgICAgICAg
ICAgICAgICByZXR1cm4gaXRlbVswXS51cHBlcigpCisgICAgICAgIHJldHVybiAiIgogCiAgICAg
ZGVmIGdldF90aW1lbGluZV9mb3JfdGVzdChzZWxmLCB0ZXN0KToKICAgICAgICAgcmV0dXJuIHNl
bGYuX2V4cGVjdGVkX2ZhaWx1cmVzLmdldF90aW1lbGluZV9mb3JfdGVzdCh0ZXN0KQpkaWZmIC0t
Z2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtp
dF90ZXN0cy5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1
bl93ZWJraXRfdGVzdHMucHkKaW5kZXggMDU5ZmQwOS4uMmFjYTNhNyAxMDA3NTUKLS0tIGEvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0cy5w
eQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Vi
a2l0X3Rlc3RzLnB5CkBAIC04MSw4ICs4MSwxNSBAQCBfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIo
IndlYmtpdHB5LmxheW91dF90ZXN0cy5ydW5fd2Via2l0X3Rlc3RzIikKICMgZGlyZWN0b3J5LWJ5
LWRpcmVjdG9yeSBmZWVkYmFjaykuCiBMT0dfREVUQUlMRURfUFJPR1JFU1MgPSAnZGV0YWlsZWQt
cHJvZ3Jlc3MnCiAKK0xPR19TVU1NQVJZID0gJ3N1bW1hcnknCisKKyMgIlRyYWNlIiB0aGUgdGVz
dCAtIGxvZyB0aGUgZXhwZWN0ZWQgcmVzdWx0LCB0aGUgYWN0dWFsIHJlc3VsdCwgYW5kIHRoZQor
IyBiYXNlbGluZXMgdXNlZAorTE9HX1RSQUNFID0gJ3RyYWNlJworCiAjIExvZyBhbnkgdW5leHBl
Y3RlZCByZXN1bHRzIHdoaWxlIHJ1bm5pbmcgKGluc3RlYWQgb2YganVzdCBhdCB0aGUgZW5kKS4K
IExPR19VTkVYUEVDVEVEID0gJ3VuZXhwZWN0ZWQnCitMT0dfVU5FWFBFQ1RFRF9SRVNVTFRTID0g
J3VuZXhwZWN0ZWQtcmVzdWx0cycKIAogIyBCdWlsZGVyIGJhc2UgVVJMIHdoZXJlIHdlIGhhdmUg
dGhlIGFyY2hpdmVkIHRlc3QgcmVzdWx0cy4KIEJVSUxERVJfQkFTRV9VUkwgPSAiaHR0cDovL2J1
aWxkLmNocm9taXVtLm9yZy9idWlsZGJvdC9sYXlvdXRfdGVzdF9yZXN1bHRzLyIKQEAgLTEzNSwy
NSArMTQyLDIzIEBAIGNsYXNzIFJlc3VsdFN1bW1hcnkob2JqZWN0KToKICAgICAgICAgICAgIHNl
bGYudGVzdHNfYnlfdGltZWxpbmVbdGltZWxpbmVdID0gKAogICAgICAgICAgICAgICAgIGV4cGVj
dGF0aW9ucy5nZXRfdGVzdHNfd2l0aF90aW1lbGluZSh0aW1lbGluZSkpCiAKLSAgICBkZWYgYWRk
KHNlbGYsIHRlc3QsIGZhaWx1cmVzLCByZXN1bHQsIGV4cGVjdGVkKToKLSAgICAgICAgIiIiQWRk
IGEgcmVzdWx0IGludG8gdGhlIGFwcHJvcHJpYXRlIGJpbi4KKyAgICBkZWYgYWRkKHNlbGYsIHJl
c3VsdCwgZXhwZWN0ZWQpOgorICAgICAgICAiIiJBZGQgYSBUZXN0UmVzdWx0IGludG8gdGhlIGFw
cHJvcHJpYXRlIGJpbi4KIAogICAgICAgICBBcmdzOgotICAgICAgICAgIHRlc3Q6IHRlc3QgZmls
ZSBuYW1lCi0gICAgICAgICAgZmFpbHVyZXM6IGxpc3Qgb2YgZmFpbHVyZSBvYmplY3RzIGZyb20g
dGVzdCBleGVjdXRpb24KLSAgICAgICAgICByZXN1bHQ6IHJlc3VsdCBvZiB0ZXN0IChQQVNTLCBJ
TUFHRSwgZXRjLikuCisgICAgICAgICAgcmVzdWx0OiBUZXN0UmVzdWx0IGZyb20gZHVtcF9yZW5k
ZXJfdHJlZV90aHJlYWQKICAgICAgICAgICBleHBlY3RlZDogd2hldGhlciB0aGUgcmVzdWx0IHdh
cyB3aGF0IHdlIGV4cGVjdGVkIGl0IHRvIGJlLgogICAgICAgICAiIiIKIAotICAgICAgICBzZWxm
LnRlc3RzX2J5X2V4cGVjdGF0aW9uW3Jlc3VsdF0uYWRkKHRlc3QpCi0gICAgICAgIHNlbGYucmVz
dWx0c1t0ZXN0XSA9IHJlc3VsdAorICAgICAgICBzZWxmLnRlc3RzX2J5X2V4cGVjdGF0aW9uW3Jl
c3VsdC50eXBlXS5hZGQocmVzdWx0LmZpbGVuYW1lKQorICAgICAgICBzZWxmLnJlc3VsdHNbcmVz
dWx0LmZpbGVuYW1lXSA9IHJlc3VsdC50eXBlCiAgICAgICAgIHNlbGYucmVtYWluaW5nIC09IDEK
LSAgICAgICAgaWYgbGVuKGZhaWx1cmVzKToKLSAgICAgICAgICAgIHNlbGYuZmFpbHVyZXNbdGVz
dF0gPSBmYWlsdXJlcworICAgICAgICBpZiBsZW4ocmVzdWx0LmZhaWx1cmVzKToKKyAgICAgICAg
ICAgIHNlbGYuZmFpbHVyZXNbcmVzdWx0LmZpbGVuYW1lXSA9IHJlc3VsdC5mYWlsdXJlcwogICAg
ICAgICBpZiBleHBlY3RlZDoKICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQgKz0gMQogICAgICAg
ICBlbHNlOgotICAgICAgICAgICAgc2VsZi51bmV4cGVjdGVkX3Jlc3VsdHNbdGVzdF0gPSByZXN1
bHQKKyAgICAgICAgICAgIHNlbGYudW5leHBlY3RlZF9yZXN1bHRzW3Jlc3VsdC5maWxlbmFtZV0g
PSByZXN1bHQudHlwZQogICAgICAgICAgICAgc2VsZi51bmV4cGVjdGVkICs9IDEKIAogCkBAIC0z
NzQsOCArMzc5LDEwIEBAIGNsYXNzIFRlc3RSdW5uZXI6CiAgICAgICAgICAgICAjIHN1YnRyYWN0
ZWQgb3V0IG9mIHNlbGYuX3Rlc3RfZmlsZXMsIGFib3ZlKSwgYnV0IHdlIHN0dWIgb3V0IHRoZQog
ICAgICAgICAgICAgIyByZXN1bHRzIGhlcmUgc28gdGhlIHN0YXRpc3RpY3MgY2FuIHJlbWFpbiBh
Y2N1cmF0ZS4KICAgICAgICAgICAgIGZvciB0ZXN0IGluIHNraXBfY2h1bms6Ci0gICAgICAgICAg
ICAgICAgcmVzdWx0X3N1bW1hcnkuYWRkKHRlc3QsIFtdLCB0ZXN0X2V4cGVjdGF0aW9ucy5TS0lQ
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1UcnVlKQorICAg
ICAgICAgICAgICAgIHJlc3VsdCA9IGR1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLlRlc3RSZXN1bHQo
dGVzdCwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAwLCAwLCAwKQorICAgICAgICAgICAgICAgIHJlc3VsdC50eXBlID0gdGVz
dF9leHBlY3RhdGlvbnMuU0tJUAorICAgICAgICAgICAgICAgIHJlc3VsdF9zdW1tYXJ5LmFkZChy
ZXN1bHQsIGV4cGVjdGVkPVRydWUpCiAgICAgICAgIHdyaXRlKCIiKQogCiAgICAgICAgIHJldHVy
biByZXN1bHRfc3VtbWFyeQpAQCAtNTgyLDcgKzU4OSw3IEBAIGNsYXNzIFRlc3RSdW5uZXI6CiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG90YWxfdGltZSc6IHRocmVh
ZC5nZXRfdG90YWxfdGltZSgpfSkKICAgICAgICAgICAgICAgICB0ZXN0X3RpbWluZ3MudXBkYXRl
KHRocmVhZC5nZXRfZGlyZWN0b3J5X3RpbWluZ19zdGF0cygpKQogICAgICAgICAgICAgICAgIGlu
ZGl2aWR1YWxfdGVzdF90aW1pbmdzLmV4dGVuZCgKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFk
LmdldF9pbmRpdmlkdWFsX3Rlc3Rfc3RhdHMoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFk
LmdldF90ZXN0X3Jlc3VsdHMoKSkKICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0Ogog
ICAgICAgICAgICAgZm9yIHRocmVhZCBpbiB0aHJlYWRzOgogICAgICAgICAgICAgICAgIHRocmVh
ZC5jYW5jZWwoKQpAQCAtNjk2LDI2ICs3MDMsNTggQEAgY2xhc3MgVGVzdFJ1bm5lcjoKICAgICAg
ICAgcmV0dXJuIHVuZXhwZWN0ZWRfcmVzdWx0c1snbnVtX3JlZ3Jlc3Npb25zJ10KIAogICAgIGRl
ZiB1cGRhdGVfc3VtbWFyeShzZWxmLCByZXN1bHRfc3VtbWFyeSk6Ci0gICAgICAgICIiIlVwZGF0
ZSB0aGUgc3VtbWFyeSB3aGlsZSBydW5uaW5nIHRlc3RzLiIiIgorICAgICAgICAiIiJVcGRhdGUg
dGhlIHN1bW1hcnkgYW5kIHByaW50IHJlc3VsdHMgd2l0aCBhbnkgY29tcGxldGVkIHRlc3RzLiIi
IgogICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAg
ICh0ZXN0LCBmYWlsX2xpc3QpID0gc2VsZi5fcmVzdWx0X3F1ZXVlLmdldF9ub3dhaXQoKQotICAg
ICAgICAgICAgICAgIHJlc3VsdCA9IHRlc3RfZmFpbHVyZXMuZGV0ZXJtaW5lX3Jlc3VsdF90eXBl
KGZhaWxfbGlzdCkKLSAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHNlbGYuX2V4cGVjdGF0aW9u
cy5tYXRjaGVzX2FuX2V4cGVjdGVkX3Jlc3VsdCh0ZXN0LAotICAgICAgICAgICAgICAgICAgICBy
ZXN1bHQsIHNlbGYuX29wdGlvbnMucGl4ZWxfdGVzdHMpCi0gICAgICAgICAgICAgICAgcmVzdWx0
X3N1bW1hcnkuYWRkKHRlc3QsIGZhaWxfbGlzdCwgcmVzdWx0LCBleHBlY3RlZCkKLSAgICAgICAg
ICAgICAgICBpZiAoTE9HX0RFVEFJTEVEX1BST0dSRVNTIGluIHNlbGYuX29wdGlvbnMubG9nIGFu
ZAotICAgICAgICAgICAgICAgICAgICAoc2VsZi5fb3B0aW9ucy5leHBlcmltZW50YWxfZnVsbHlf
cGFyYWxsZWwgb3IKLSAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lzX3NpbmdsZV90aHJlYWRl
ZCgpKSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2Rpc3BsYXlfZGV0YWlsZWRfcHJvZ3Jl
c3MocmVzdWx0X3N1bW1hcnkpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAg
ICAgICAgaWYgbm90IGV4cGVjdGVkIGFuZCBMT0dfVU5FWFBFQ1RFRCBpbiBzZWxmLl9vcHRpb25z
LmxvZzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfdGVz
dF9yZXN1bHQodGVzdCwgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICBzZWxmLl9kaXNwbGF5
X29uZV9saW5lX3Byb2dyZXNzKHJlc3VsdF9zdW1tYXJ5KQorICAgICAgICAgICAgICAgIHJlc3Vs
dCA9IHNlbGYuX3Jlc3VsdF9xdWV1ZS5nZXRfbm93YWl0KCkKKyAgICAgICAgICAgICAgICBleHBl
Y3RlZCA9IHNlbGYuX2V4cGVjdGF0aW9ucy5tYXRjaGVzX2FuX2V4cGVjdGVkX3Jlc3VsdCgKKyAg
ICAgICAgICAgICAgICAgICAgcmVzdWx0LmZpbGVuYW1lLCByZXN1bHQudHlwZSwgc2VsZi5fb3B0
aW9ucy5waXhlbF90ZXN0cykKKyAgICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeS5hZGQocmVz
dWx0LCBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X3Jlc3VsdHMo
cmVzdWx0LCBleHBlY3RlZCwgcmVzdWx0X3N1bW1hcnkpCiAgICAgICAgICAgICBleGNlcHQgUXVl
dWUuRW1wdHk6CiAgICAgICAgICAgICAgICAgcmV0dXJuCiAKLSAgICBkZWYgX2Rpc3BsYXlfb25l
X2xpbmVfcHJvZ3Jlc3Moc2VsZiwgcmVzdWx0X3N1bW1hcnkpOgorICAgIGRlZiBfcHJpbnRfdGVz
dF9yZXN1bHRzKHNlbGYsIHJlc3VsdCwgZXhwZWN0ZWQsIHJlc3VsdF9zdW1tYXJ5KToKKyAgICAg
ICAgIlByaW50IHRoZSByZXN1bHQgb2YgdGhlIHRlc3QgYXMgZGV0ZXJtaW5lZCBieSB0aGUgLS1s
b2cgc3dpdGNoZXMuIgorICAgICAgICBpZiBMT0dfVFJBQ0UgaW4gc2VsZi5fb3B0aW9ucy5sb2c6
CisgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X3RyYWNlKHJlc3VsdCkKKyAgICAgICAgZWxp
ZiAoTE9HX0RFVEFJTEVEX1BST0dSRVNTIGluIHNlbGYuX29wdGlvbnMubG9nIGFuZAorICAgICAg
ICAgICAgICAoc2VsZi5fb3B0aW9ucy5leHBlcmltZW50YWxfZnVsbHlfcGFyYWxsZWwgb3IKKyAg
ICAgICAgICAgICAgIHNlbGYuX2lzX3NpbmdsZV90aHJlYWRlZCgpKSk6CisgICAgICAgICAgICBz
ZWxmLl9wcmludF9kZXRhaWxlZF9wcm9ncmVzcyhyZXN1bHRfc3VtbWFyeSkKKyAgICAgICAgZWxz
ZToKKyAgICAgICAgICAgIGlmIChub3QgZXhwZWN0ZWQgYW5kIExPR19VTkVYUEVDVEVEIGluIHNl
bGYuX29wdGlvbnMubG9nKToKKyAgICAgICAgICAgICAgICBzZWxmLl9wcmludF91bmV4cGVjdGVk
X3Rlc3RfcmVzdWx0KHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X29uZV9saW5lX3By
b2dyZXNzKHJlc3VsdF9zdW1tYXJ5KQorCisgICAgZGVmIF9wcmludF90ZXN0X3RyYWNlKHNlbGYs
IHJlc3VsdCk6CisgICAgICAgICIiIlByaW50IGRldGFpbGVkIHJlc3VsdHMgb2YgYSB0ZXN0ICh0
cmlnZ2VyZWQgYnkgLS1sb2cgdHJhY2UpLgorICAgICAgICBGb3IgZWFjaCB0ZXN0LCBwcmludDoK
KyAgICAgICAgICAgLSBsb2NhdGlvbiBvZiB0aGUgZXhwZWN0ZWQgYmFzZWxpbmVzCisgICAgICAg
ICAgIC0gZXhwZWN0ZWQgcmVzdWx0cworICAgICAgICAgICAtIGFjdHVhbCByZXN1bHQKKyAgICAg
ICAgICAgLSB0aW1pbmcgaW5mbworICAgICAgICAiIiIKKyAgICAgICAgZmlsZW5hbWUgPSByZXN1
bHQuZmlsZW5hbWUKKyAgICAgICAgdGVzdF9uYW1lID0gc2VsZi5fcG9ydC5yZWxhdGl2ZV90ZXN0
X2ZpbGVuYW1lKGZpbGVuYW1lKQorICAgICAgICBfbG9nLmluZm8oJ3RyYWNlOiAlcycgJSB0ZXN0
X25hbWUpCisgICAgICAgIF9sb2cuaW5mbygnICB0eHQ6ICVzJyAlCisgICAgICAgICAgICAgICAg
ICBzZWxmLl9wb3J0LnJlbGF0aXZlX3Rlc3RfZmlsZW5hbWUoCisgICAgICAgICAgICAgICAgICAg
ICAgIHNlbGYuX3BvcnQuZXhwZWN0ZWRfZmlsZW5hbWUoZmlsZW5hbWUsICcudHh0JykpKQorICAg
ICAgICBwbmdfZmlsZSA9IHNlbGYuX3BvcnQuZXhwZWN0ZWRfZmlsZW5hbWUoZmlsZW5hbWUsICcu
cG5nJykKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocG5nX2ZpbGUpOgorICAgICAgICAgICAg
X2xvZy5pbmZvKCcgIHBuZzogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wb3J0
LnJlbGF0aXZlX3Rlc3RfZmlsZW5hbWUoZmlsZW5hbWUpKQorICAgICAgICBlbHNlOgorICAgICAg
ICAgICAgX2xvZy5pbmZvKCcgIHBuZzogPG5vbmU+JykKKyAgICAgICAgX2xvZy5pbmZvKCcgIGV4
cDogJXMnICUKKyAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cGVjdGF0aW9ucy5nZXRfZXhwZWN0
YXRpb25zX3N0cmluZyhmaWxlbmFtZSkpCisgICAgICAgIF9sb2cuaW5mbygnICBnb3Q6ICVzJyAl
CisgICAgICAgICAgICAgICAgICBzZWxmLl9leHBlY3RhdGlvbnMuZXhwZWN0YXRpb25fdG9fc3Ry
aW5nKHJlc3VsdC50eXBlKSkKKyAgICAgICAgX2xvZy5pbmZvKCcgdG9vazogJS0uM2YnICUgcmVz
dWx0LnRlc3RfcnVuX3RpbWUpCisgICAgICAgIF9sb2cuaW5mbygnJykKKworICAgIGRlZiBfcHJp
bnRfb25lX2xpbmVfcHJvZ3Jlc3Moc2VsZiwgcmVzdWx0X3N1bW1hcnkpOgogICAgICAgICAiIiJE
aXNwbGF5cyB0aGUgcHJvZ3Jlc3MgdGhyb3VnaCB0aGUgdGVzdCBydW4uIiIiCiAgICAgICAgIHBl
cmNlbnRfY29tcGxldGUgPSAxMDAgKiAocmVzdWx0X3N1bW1hcnkuZXhwZWN0ZWQgKwogICAgICAg
ICAgICAgcmVzdWx0X3N1bW1hcnkudW5leHBlY3RlZCkgLyByZXN1bHRfc3VtbWFyeS50b3RhbApA
QCAtNzIzLDcgKzc2Miw3IEBAIGNsYXNzIFRlc3RSdW5uZXI6CiAgICAgICAgICAgICAiICVkIGxl
ZnQiICUgKHBlcmNlbnRfY29tcGxldGUsIHJlc3VsdF9zdW1tYXJ5LmV4cGVjdGVkLAogICAgICAg
ICAgICAgIHJlc3VsdF9zdW1tYXJ5LnVuZXhwZWN0ZWQsIHJlc3VsdF9zdW1tYXJ5LnJlbWFpbmlu
ZykpCiAKLSAgICBkZWYgX2Rpc3BsYXlfZGV0YWlsZWRfcHJvZ3Jlc3Moc2VsZiwgcmVzdWx0X3N1
bW1hcnkpOgorICAgIGRlZiBfcHJpbnRfZGV0YWlsZWRfcHJvZ3Jlc3Moc2VsZiwgcmVzdWx0X3N1
bW1hcnkpOgogICAgICAgICAiIiJEaXNwbGF5IGRldGFpbGVkIHByb2dyZXNzIG91dHB1dCB3aGVy
ZSB3ZSBwcmludCB0aGUgZGlyZWN0b3J5IG5hbWUKICAgICAgICAgYW5kIG9uZSBkb3QgZm9yIGVh
Y2ggY29tcGxldGVkIHRlc3QuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5CiAgICAgICAgICItLWxvZyBk
ZXRhaWxlZC1wcm9ncmVzcyIuIiIiCkBAIC03NjcsNiArODA2LDEzIEBAIGNsYXNzIFRlc3RSdW5u
ZXI6CiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLl9tZXRlci53cml0ZSgiJXNcbiIg
JSAoc2VsZi5fY3VycmVudF9wcm9ncmVzc19zdHIpKQogCisgICAgZGVmIF9wcmludF91bmV4cGVj
dGVkX3Rlc3RfcmVzdWx0KHNlbGYsIHJlc3VsdCk6CisgICAgICAgICIiIlByaW50cyBvbmUgdW5l
eHBlY3RlZCB0ZXN0IHJlc3VsdCBsaW5lLiIiIgorICAgICAgICBkZXNjID0gVGVzdEV4cGVjdGF0
aW9uc0ZpbGUuRVhQRUNUQVRJT05fREVTQ1JJUFRJT05TW3Jlc3VsdC50eXBlXVswXQorICAgICAg
ICBzZWxmLl9tZXRlci53cml0ZSgiICAlcyAtPiB1bmV4cGVjdGVkICVzXG4iICUKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHNlbGYuX3BvcnQucmVsYXRpdmVfdGVzdF9maWxlbmFtZShyZXN1
bHQuZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYykpCisKICAgICBk
ZWYgX2dldF9mYWlsdXJlcyhzZWxmLCByZXN1bHRfc3VtbWFyeSwgaW5jbHVkZV9jcmFzaGVzKToK
ICAgICAgICAgIiIiRmlsdGVycyBhIGRpY3Qgb2YgcmVzdWx0cyBhbmQgcmV0dXJucyBvbmx5IHRo
ZSBmYWlsdXJlcy4KIApAQCAtMTI4MCwxMiArMTMyNiw2IEBAIGNsYXNzIFRlc3RSdW5uZXI6CiAg
ICAgICAgIGlmIGxlbih1bmV4cGVjdGVkX3Jlc3VsdHNbJ3Rlc3RzJ10pIGFuZCBzZWxmLl9vcHRp
b25zLnZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAiLSIgKiA3OAogCi0gICAgZGVmIF9wcmlu
dF91bmV4cGVjdGVkX3Rlc3RfcmVzdWx0KHNlbGYsIHRlc3QsIHJlc3VsdCk6Ci0gICAgICAgICIi
IlByaW50cyBvbmUgdW5leHBlY3RlZCB0ZXN0IHJlc3VsdCBsaW5lLiIiIgotICAgICAgICBkZXNj
ID0gVGVzdEV4cGVjdGF0aW9uc0ZpbGUuRVhQRUNUQVRJT05fREVTQ1JJUFRJT05TW3Jlc3VsdF1b
MF0KLSAgICAgICAgc2VsZi5fbWV0ZXIud3JpdGUoIiAgJXMgLT4gdW5leHBlY3RlZCAlc1xuIiAl
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9wb3J0LnJlbGF0aXZlX3Rlc3RfZmls
ZW5hbWUodGVzdCksIGRlc2MpKQotCiAgICAgZGVmIF93cml0ZV9yZXN1bHRzX2h0bWxfZmlsZShz
ZWxmLCByZXN1bHRfc3VtbWFyeSk6CiAgICAgICAgICIiIldyaXRlIHJlc3VsdHMuaHRtbCB3aGlj
aCBpcyBhIHN1bW1hcnkgb2YgdGVzdHMgdGhhdCBmYWlsZWQuCiAKQEAgLTE1NjAsNyArMTYwMCw3
IEBAIGRlZiBwYXJzZV9hcmdzKGFyZ3M9Tm9uZSk6CiAgICAgICAgICAgICBoZWxwPSJsb2cgdmFy
aW91cyB0eXBlcyBvZiBkYXRhLiBUaGUgcGFyYW0gc2hvdWxkIGJlIGEgIiArCiAgICAgICAgICAg
ICAgICAgICJjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2YWx1ZXMgZnJvbTogIiArCiAgICAgICAg
ICAgICAgICAgICJhY3R1YWwsY29uZmlnLCIgKyBMT0dfREVUQUlMRURfUFJPR1JFU1MgKwotICAg
ICAgICAgICAgICAgICAiLGV4cGVjdGVkLHRpbWluZywiICsgTE9HX1VORVhQRUNURUQgKyAiICIg
KworICAgICAgICAgICAgICAgICAiLGV4cGVjdGVkLHRpbWluZyx0cmFjZSIgKyBMT0dfVU5FWFBF
Q1RFRCArICIgIiArCiAgICAgICAgICAgICAgICAgICIoZGVmYXVsdHMgdG8gIiArICItLWxvZyBk
ZXRhaWxlZC1wcm9ncmVzcyx1bmV4cGVjdGVkKSIpLAogICAgICAgICBvcHRwYXJzZS5tYWtlX29w
dGlvbigiLXYiLCAiLS12ZXJib3NlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICAgICAg
IGRlZmF1bHQ9RmFsc2UsIGhlbHA9ImluY2x1ZGUgZGVidWctbGV2ZWwgbG9nZ2luZyIpLAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53578</attachid>
            <date>2010-04-16 16:33:18 -0700</date>
            <delta_ts>2010-04-18 15:32:34 -0700</delta_ts>
            <desc>fix style nits</desc>
            <filename>wk37726_logging_1.diff</filename>
            <type>text/plain</type>
            <size>22322</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA5OThhNmQzLi4wMjA4NzQ1IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAKKzIwMTAtMDQt
MTUgIERpcmsgUHJhbmtlIDxkcHJhbmtlQGNocm9taXVtLm9yZz4KKworICAgICAgICBGaXJzdCBv
ZiBzZXZlcmFsIHBhdGNoZXMgdG8gY2xlYW4gdXAgdGhlIGxvZ2dpbmcgb2YKKyAgICAgICAgbmV3
LXJ1bi13ZWJraXQtdGVzdHMgYW5kIGFkZCBuZXcgZnVuY3Rpb25hbGl0eS4gVGhpcyBwYXRjaCBh
ZGRzIGEKKyAgICAgICAgLS1sb2cgJ3RyYWNlJyBvcHRpb24gdGhhdCBwcmludHMgb3V0IGRldGFp
bGVkIGluZm8gYWJvdXQgYSBnaXZlbiB0ZXN0CisgICAgICAgIGFzIGl0IGV4ZWN1dGVzICh3aGVy
ZSB0aGUgYmFzZWxpbmVzIGFyZSwgd2hhdCB0aGUgZXhwZWN0YXRpb24gaXMsCisgICAgICAgIHdo
YXQgd2UgZ290LCBob3cgbG9uZyBpdCB0b29rKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzc3MjYKKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHMucHk6CisgICAgICAgICAgLSB1c2UgdGhl
IG5ld2x5IGV4cG9zZWQgVGVzdFJlc3VsdCBjbGFzcyBhbmQgaW1wbGVtZW50CisgICAgICAgICAg
ICAtLWxvZyB0cmFjZQorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xh
eW91dF9wYWNrYWdlL2R1bXBfcmVuZGVyX3RocmVhZC5weToKKyAgICAgICAgICAtIHJlbmFtZSBU
ZXN0U3RhdHMgdG8gVGVzdFJlc3VsdCBhbmQgbWFrZSBpdCBtb3JlIHB1YmxpYywgcmVzdWx0aW5n
CisgICAgICAgICAgICBpbiBjbGVhbmVyIGNvZGUKKwogMjAxMC0wNC0xNSAgU2FtIFdlaW5pZyAg
PHNhbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFuZGVycyBDYXJsc3Nvbi4K
ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xh
eW91dF9wYWNrYWdlL2R1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLnB5IGIvV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdHJl
ZV90aHJlYWQucHkKaW5kZXggOTNiNGM3OS4uYWVkNDkwYyAxMDA2NDQKLS0tIGEvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5k
ZXJfdHJlZV90aHJlYWQucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdHJlZV90aHJlYWQucHkKQEAgLTU0
LDggKzU0LDggQEAgX2xvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJ3ZWJraXRweS5sYXlvdXRfdGVz
dHMubGF5b3V0X3BhY2thZ2UuIgogZGVmIHByb2Nlc3Nfb3V0cHV0KHBvcnQsIHRlc3RfaW5mbywg
dGVzdF90eXBlcywgdGVzdF9hcmdzLCBjb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgICAg
IG91dHB1dF9kaXIsIGNyYXNoLCB0aW1lb3V0LCB0ZXN0X3J1bl90aW1lLCBhY3R1YWxfY2hlY2tz
dW0sCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBlcnJvcik6Ci0gICAgIiIiUmVjZWl2ZXMg
dGhlIG91dHB1dCBmcm9tIGEgRHVtcFJlbmRlclRyZWUgcHJvY2Vzcywgc3ViamVjdHMgaXQgdG8g
YSBudW1iZXIKLSAgICBvZiB0ZXN0cywgYW5kIHJldHVybnMgYSBsaXN0IG9mIGZhaWx1cmUgdHlw
ZXMgdGhlIHRlc3QgcHJvZHVjZWQuCisgICAgIiIiUmVjZWl2ZXMgdGhlIG91dHB1dCBmcm9tIGEg
RHVtcFJlbmRlclRyZWUgcHJvY2Vzcywgc3ViamVjdHMgaXQgdG8gYQorICAgIG51bWJlciBvZiB0
ZXN0cywgYW5kIHJldHVybnMgYSBsaXN0IG9mIGZhaWx1cmUgdHlwZXMgdGhlIHRlc3QgcHJvZHVj
ZWQuCiAKICAgICBBcmdzOgogICAgICAgcG9ydDogcG9ydC1zcGVjaWZpYyBob29rcwpAQCAtNjYs
NyArNjYsNyBAQCBkZWYgcHJvY2Vzc19vdXRwdXQocG9ydCwgdGVzdF9pbmZvLCB0ZXN0X3R5cGVz
LCB0ZXN0X2FyZ3MsIGNvbmZpZ3VyYXRpb24sCiAgICAgICBjb25maWd1cmF0aW9uOiBEZWJ1ZyBv
ciBSZWxlYXNlCiAgICAgICBvdXRwdXRfZGlyOiBkaXJlY3RvcnkgdG8gcHV0IGNyYXNoIHN0YWNr
IHRyYWNlcyBpbnRvCiAKLSAgICBSZXR1cm5zOiBhIGxpc3Qgb2YgZmFpbHVyZSBvYmplY3RzIGFu
ZCB0aW1lcyBmb3IgdGhlIHRlc3QgYmVpbmcgcHJvY2Vzc2VkCisgICAgUmV0dXJuczogYSBUZXN0
UmVzdWx0IG9iamVjdAogICAgICIiIgogICAgIGZhaWx1cmVzID0gW10KIApAQCAtMTExLDE2ICsx
MTEsMTcgQEAgZGVmIHByb2Nlc3Nfb3V0cHV0KHBvcnQsIHRlc3RfaW5mbywgdGVzdF90eXBlcywg
dGVzdF9hcmdzLCBjb25maWd1cmF0aW9uLAogICAgICAgICAgICAgdGltZS50aW1lKCkgLSBzdGFy
dF9kaWZmX3RpbWUpCiAKICAgICB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnMgPSB0aW1lLnRpbWUo
KSAtIHN0YXJ0X2RpZmZfdGltZQotICAgIHJldHVybiBUZXN0U3RhdHModGVzdF9pbmZvLmZpbGVu
YW1lLCBmYWlsdXJlcywgdGVzdF9ydW5fdGltZSwKKyAgICByZXR1cm4gVGVzdFJlc3VsdCh0ZXN0
X2luZm8uZmlsZW5hbWUsIGZhaWx1cmVzLCB0ZXN0X3J1bl90aW1lLAogICAgICAgICB0b3RhbF90
aW1lX2Zvcl9hbGxfZGlmZnMsIHRpbWVfZm9yX2RpZmZzKQogCiAKLWNsYXNzIFRlc3RTdGF0czoK
K2NsYXNzIFRlc3RSZXN1bHQ6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGZh
aWx1cmVzLCB0ZXN0X3J1bl90aW1lLAogICAgICAgICAgICAgICAgICB0b3RhbF90aW1lX2Zvcl9h
bGxfZGlmZnMsIHRpbWVfZm9yX2RpZmZzKToKICAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVu
YW1lCiAgICAgICAgIHNlbGYuZmFpbHVyZXMgPSBmYWlsdXJlcworICAgICAgICBzZWxmLnR5cGUg
PSB0ZXN0X2ZhaWx1cmVzLmRldGVybWluZV9yZXN1bHRfdHlwZShmYWlsdXJlcykKICAgICAgICAg
c2VsZi50ZXN0X3J1bl90aW1lID0gdGVzdF9ydW5fdGltZQogICAgICAgICBzZWxmLnRvdGFsX3Rp
bWVfZm9yX2FsbF9kaWZmcyA9IHRvdGFsX3RpbWVfZm9yX2FsbF9kaWZmcwogICAgICAgICBzZWxm
LnRpbWVfZm9yX2RpZmZzID0gdGltZV9mb3JfZGlmZnMKQEAgLTE1NywxNCArMTU4LDE0IEBAIGNs
YXNzIFNpbmdsZVRlc3RUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAgICAgICBkcml2
ZXIucnVuX3Rlc3QodGVzdF9pbmZvLnVyaS5zdHJpcCgpLCB0ZXN0X2luZm8udGltZW91dCwKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZm8uaW1hZ2VfaGFzaCkKICAgICAgICAg
ZW5kID0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5fdGVzdF9zdGF0cyA9IHByb2Nlc3Nfb3V0
cHV0KHNlbGYuX3BvcnQsCisgICAgICAgIHNlbGYuX3Rlc3RfcmVzdWx0ID0gcHJvY2Vzc19vdXRw
dXQoc2VsZi5fcG9ydCwKICAgICAgICAgICAgIHRlc3RfaW5mbywgc2VsZi5fdGVzdF90eXBlcywg
c2VsZi5fdGVzdF9hcmdzLAogICAgICAgICAgICAgc2VsZi5fY29uZmlndXJhdGlvbiwgc2VsZi5f
b3V0cHV0X2RpciwgY3Jhc2gsIHRpbWVvdXQsIGVuZCAtIHN0YXJ0LAogICAgICAgICAgICAgYWN0
dWFsX2NoZWNrc3VtLCBvdXRwdXQsIGVycm9yKQogICAgICAgICBkcml2ZXIuc3RvcCgpCiAKLSAg
ICBkZWYgZ2V0X3Rlc3Rfc3RhdHMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl90ZXN0X3N0
YXRzCisgICAgZGVmIGdldF90ZXN0X3Jlc3VsdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYu
X3Rlc3RfcmVzdWx0CiAKIAogY2xhc3MgVGVzdFNoZWxsVGhyZWFkKHRocmVhZGluZy5UaHJlYWQp
OgpAQCAtMjAxLDcgKzIwMiw3IEBAIGNsYXNzIFRlc3RTaGVsbFRocmVhZCh0aHJlYWRpbmcuVGhy
ZWFkKToKICAgICAgICAgc2VsZi5fY2FuY2VsZWQgPSBGYWxzZQogICAgICAgICBzZWxmLl9leGNl
cHRpb25faW5mbyA9IE5vbmUKICAgICAgICAgc2VsZi5fZGlyZWN0b3J5X3RpbWluZ19zdGF0cyA9
IHt9Ci0gICAgICAgIHNlbGYuX3Rlc3Rfc3RhdHMgPSBbXQorICAgICAgICBzZWxmLl90ZXN0X3Jl
c3VsdHMgPSBbXQogICAgICAgICBzZWxmLl9udW1fdGVzdHMgPSAwCiAgICAgICAgIHNlbGYuX3N0
YXJ0X3RpbWUgPSAwCiAgICAgICAgIHNlbGYuX3N0b3BfdGltZSA9IDAKQEAgLTIxOCwxMCArMjE5
LDEwIEBAIGNsYXNzIFRlc3RTaGVsbFRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKICAgICAgICAg
KG51bWJlciBvZiB0ZXN0cyBpbiB0aGF0IGRpcmVjdG9yeSwgdGltZSB0byBydW4gdGhlIHRlc3Rz
KSIiIgogICAgICAgICByZXR1cm4gc2VsZi5fZGlyZWN0b3J5X3RpbWluZ19zdGF0cwogCi0gICAg
ZGVmIGdldF9pbmRpdmlkdWFsX3Rlc3Rfc3RhdHMoc2VsZik6Ci0gICAgICAgICIiIlJldHVybnMg
YSBsaXN0IG9mICh0ZXN0X2ZpbGVuYW1lLCB0aW1lX3RvX3J1bl90ZXN0LAotICAgICAgICB0b3Rh
bF90aW1lX2Zvcl9hbGxfZGlmZnMsIHRpbWVfZm9yX2RpZmZzKSB0dXBsZXMuIiIiCi0gICAgICAg
IHJldHVybiBzZWxmLl90ZXN0X3N0YXRzCisgICAgZGVmIGdldF90ZXN0X3Jlc3VsdHMoc2VsZik6
CisgICAgICAgICIiIlJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHRlc3RzIHJ1biBvbiB0aGlzIHRo
cmVhZC4gVXNlZCB0byBjYWxjdWxhdGUKKyAgICAgICAgcGVyLXRocmVhZCBzdGF0aXN0aWNzLiIi
IgorICAgICAgICByZXR1cm4gc2VsZi5fdGVzdF9yZXN1bHRzCiAKICAgICBkZWYgY2FuY2VsKHNl
bGYpOgogICAgICAgICAiIiJTZXQgYSBmbGFnIHRlbGxpbmcgdGhpcyB0aHJlYWQgdG8gcXVpdC4i
IiIKQEAgLTMxNywyNyArMzE4LDI5IEBAIGNsYXNzIFRlc3RTaGVsbFRocmVhZCh0aHJlYWRpbmcu
VGhyZWFkKToKICAgICAgICAgICAgIGJhdGNoX2NvdW50ICs9IDEKICAgICAgICAgICAgIHNlbGYu
X251bV90ZXN0cyArPSAxCiAgICAgICAgICAgICBpZiBzZWxmLl9vcHRpb25zLnJ1bl9zaW5nbHk6
Ci0gICAgICAgICAgICAgICAgZmFpbHVyZXMgPSBzZWxmLl9ydW5fdGVzdF9zaW5nbHkodGVzdF9p
bmZvKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX3J1bl90ZXN0X3NpbmdseSh0ZXN0
X2luZm8pCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGZhaWx1cmVzID0gc2Vs
Zi5fcnVuX3Rlc3QodGVzdF9pbmZvKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX3J1
bl90ZXN0KHRlc3RfaW5mbykKIAogICAgICAgICAgICAgZmlsZW5hbWUgPSB0ZXN0X2luZm8uZmls
ZW5hbWUKICAgICAgICAgICAgIHRlc3RzX3J1bl9maWxlLndyaXRlKGZpbGVuYW1lICsgIlxuIikK
LSAgICAgICAgICAgIGlmIGZhaWx1cmVzOgorICAgICAgICAgICAgaWYgcmVzdWx0LmZhaWx1cmVz
OgogICAgICAgICAgICAgICAgICMgQ2hlY2sgYW5kIGtpbGwgRHVtcFJlbmRlclRyZWUgaWYgd2Ug
bmVlZCB0b28uCi0gICAgICAgICAgICAgICAgaWYgbGVuKFsxIGZvciBmIGluIGZhaWx1cmVzIGlm
IGYuc2hvdWxkX2tpbGxfZHVtcF9yZW5kZXJfdHJlZSgpXSk6CisgICAgICAgICAgICAgICAgaWYg
bGVuKFsxIGZvciBmIGluIHJlc3VsdC5mYWlsdXJlcworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgZi5zaG91bGRfa2lsbF9kdW1wX3JlbmRlcl90cmVlKCldKToKICAgICAgICAgICAgICAg
ICAgICAgc2VsZi5fa2lsbF9kdW1wX3JlbmRlcl90cmVlKCkKICAgICAgICAgICAgICAgICAgICAg
IyBSZXNldCB0aGUgYmF0Y2ggY291bnQgc2luY2UgdGhlIHNoZWxsIGp1c3QgYm91bmNlZC4KICAg
ICAgICAgICAgICAgICAgICAgYmF0Y2hfY291bnQgPSAwCiAgICAgICAgICAgICAgICAgIyBQcmlu
dCB0aGUgZXJyb3IgbWVzc2FnZShzKS4KLSAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPSAnXG4n
LmpvaW4oWycgICcgKyBmLm1lc3NhZ2UoKSBmb3IgZiBpbiBmYWlsdXJlc10pCisgICAgICAgICAg
ICAgICAgZXJyb3Jfc3RyID0gJ1xuJy5qb2luKFsnICAnICsgZi5tZXNzYWdlKCkgZm9yCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiBpbiByZXN1bHQuZmFpbHVy
ZXNdKQogICAgICAgICAgICAgICAgIF9sb2cuZGVidWcoIiVzICVzIGZhaWxlZDpcbiVzIiAlIChz
ZWxmLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQucmVs
YXRpdmVfdGVzdF9maWxlbmFtZShmaWxlbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBlcnJvcl9zdHIpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBfbG9nLmRl
YnVnKCIlcyAlcyBwYXNzZWQiICUgKHNlbGYuZ2V0TmFtZSgpLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc2VsZi5fcG9ydC5yZWxhdGl2ZV90ZXN0X2ZpbGVuYW1lKGZpbGVuYW1lKSkpCi0g
ICAgICAgICAgICBzZWxmLl9yZXN1bHRfcXVldWUucHV0KChmaWxlbmFtZSwgZmFpbHVyZXMpKQor
ICAgICAgICAgICAgc2VsZi5fcmVzdWx0X3F1ZXVlLnB1dChyZXN1bHQpCiAKICAgICAgICAgICAg
IGlmIGJhdGNoX3NpemUgPiAwIGFuZCBiYXRjaF9jb3VudCA+IGJhdGNoX3NpemU6CiAgICAgICAg
ICAgICAgICAgIyBCb3VuY2UgdGhlIHNoZWxsIGFuZCByZXNldCBjb3VudC4KQEAgLTM1OCw3ICsz
NjEsNyBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAg
ICAgdGVzdF9pbmZvOiBPYmplY3QgY29udGFpbmluZyB0aGUgdGVzdCBmaWxlbmFtZSwgdXJpIGFu
ZCB0aW1lb3V0CiAKICAgICAgICAgUmV0dXJuOgotICAgICAgICAgIEEgbGlzdCBvZiBUZXN0RmFp
bHVyZSBvYmplY3RzIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorICAgICAgICAgIEEgVGVzdFJlc3Vs
dAogICAgICAgICAiIiIKICAgICAgICAgd29ya2VyID0gU2luZ2xlVGVzdFRocmVhZChzZWxmLl9w
b3J0LCBzZWxmLl9pbWFnZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHNlbGYuX3NoZWxsX2FyZ3MsCkBAIC0zNzAsOSArMzczLDkgQEAgY2xhc3MgVGVzdFNoZWxsVGhy
ZWFkKHRocmVhZGluZy5UaHJlYWQpOgogCiAgICAgICAgIHdvcmtlci5zdGFydCgpCiAKLSAgICAg
ICAgIyBXaGVuIHdlJ3JlIHJ1bm5pbmcgb25lIHRlc3QgcGVyIER1bXBSZW5kZXJUcmVlIHByb2Nl
c3MsIHdlIGNhbiBlbmZvcmNlCi0gICAgICAgICMgYSBoYXJkIHRpbWVvdXQuIHRoZSBEdW1wUmVu
ZGVyVHJlZSB3YXRjaGRvZyB1c2VzIDIuNXggdGhlIHRpbWVvdXQKLSAgICAgICAgIyBXZSB3YW50
IHRvIGJlIGxhcmdlciB0aGFuIHRoYXQuCisgICAgICAgICMgV2hlbiB3ZSdyZSBydW5uaW5nIG9u
ZSB0ZXN0IHBlciBEdW1wUmVuZGVyVHJlZSBwcm9jZXNzLCB3ZSBjYW4KKyAgICAgICAgIyBlbmZv
cmNlIGEgaGFyZCB0aW1lb3V0LiB0aGUgRHVtcFJlbmRlclRyZWUgd2F0Y2hkb2cgdXNlcyAyLjV4
CisgICAgICAgICMgdGhlIHRpbWVvdXQgV2Ugd2FudCB0byBiZSBsYXJnZXIgdGhhbiB0aGF0Lgog
ICAgICAgICB3b3JrZXIuam9pbihpbnQodGVzdF9pbmZvLnRpbWVvdXQpICogMy4wIC8gMTAwMC4w
KQogICAgICAgICBpZiB3b3JrZXIuaXNBbGl2ZSgpOgogICAgICAgICAgICAgIyBJZiBqb2luKCkg
cmV0dXJuZWQgd2l0aCB0aGUgdGhyZWFkIHN0aWxsIHJ1bm5pbmcsIHRoZQpAQCAtMzgwLDIyICsz
ODMsMjEgQEAgY2xhc3MgVGVzdFNoZWxsVGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgogICAgICAg
ICAgICAgIyBtb3JlIHdlIGNhbiBkbyB3aXRoIGl0LiAgV2UgaGF2ZSB0byBraWxsIGFsbCB0aGUK
ICAgICAgICAgICAgICMgRHVtcFJlbmRlclRyZWVzIHRvIGZyZWUgaXQgdXAuIElmIHdlJ3JlIHJ1
bm5pbmcgbW9yZSB0aGFuCiAgICAgICAgICAgICAjIG9uZSBEdW1wUmVuZGVyVHJlZSB0aHJlYWQs
IHdlJ2xsIGVuZCB1cCBraWxsaW5nIHRoZSBvdGhlcgotICAgICAgICAgICAgIyBEdW1wUmVuZGVy
VHJlZXMgdG9vLCBpbnRyb2R1Y2luZyBzcHVyaW91cyBjcmFzaGVzLiBXZSBhY2NlcHQgdGhhdAot
ICAgICAgICAgICAgIyB0cmFkZW9mZiBpbiBvcmRlciB0byBhdm9pZCBsb3NpbmcgdGhlIHJlc3Qg
b2YgdGhpcyB0aHJlYWQncwotICAgICAgICAgICAgIyByZXN1bHRzLgorICAgICAgICAgICAgIyBE
dW1wUmVuZGVyVHJlZXMgdG9vLCBpbnRyb2R1Y2luZyBzcHVyaW91cyBjcmFzaGVzLiBXZSBhY2Nl
cHQKKyAgICAgICAgICAgICMgdGhhdCB0cmFkZW9mZiBpbiBvcmRlciB0byBhdm9pZCBsb3Npbmcg
dGhlIHJlc3Qgb2YgdGhpcworICAgICAgICAgICAgIyB0aHJlYWQncyByZXN1bHRzLgogICAgICAg
ICAgICAgX2xvZy5lcnJvcignVGVzdCB0aHJlYWQgaHVuZzoga2lsbGluZyBhbGwgRHVtcFJlbmRl
clRyZWVzJykKICAgICAgICAgICAgIHdvcmtlci5fZHJpdmVyLnN0b3AoKQogCiAgICAgICAgIHRy
eToKLSAgICAgICAgICAgIHN0YXRzID0gd29ya2VyLmdldF90ZXN0X3N0YXRzKCkKLSAgICAgICAg
ICAgIHNlbGYuX3Rlc3Rfc3RhdHMuYXBwZW5kKHN0YXRzKQotICAgICAgICAgICAgZmFpbHVyZXMg
PSBzdGF0cy5mYWlsdXJlcworICAgICAgICAgICAgcmVzdWx0ID0gd29ya2VyLmdldF90ZXN0X3Jl
c3VsdCgpCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZToKICAgICAgICAgICAgIGZh
aWx1cmVzID0gW10KICAgICAgICAgICAgIF9sb2cuZXJyb3IoJ0Nhbm5vdCBnZXQgcmVzdWx0cyBv
ZiB0ZXN0OiAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZm8uZmlsZW5hbWUp
CisgICAgICAgICAgICByZXN1bHQgPSBUZXN0UmVzdWx0KHRlc3RfaW5mby5maWxlbmFtZSwgW10s
IDAsIDAsIDApCiAKLSAgICAgICAgcmV0dXJuIGZhaWx1cmVzCisgICAgICAgIHJldHVybiByZXN1
bHQKIAogICAgIGRlZiBfcnVuX3Rlc3Qoc2VsZiwgdGVzdF9pbmZvKToKICAgICAgICAgIiIiUnVu
IGEgc2luZ2xlIHRlc3QgZmlsZSB1c2luZyBhIHNoYXJlZCBEdW1wUmVuZGVyVHJlZSBwcm9jZXNz
LgpAQCAtNDE5LDE5ICs0MjEsMTggQEAgY2xhc3MgVGVzdFNoZWxsVGhyZWFkKHRocmVhZGluZy5U
aHJlYWQpOgogICAgICAgICAgICBzZWxmLl9kcml2ZXIucnVuX3Rlc3QodGVzdF9pbmZvLnVyaSwg
dGVzdF9pbmZvLnRpbWVvdXQsIGltYWdlX2hhc2gpCiAgICAgICAgIGVuZCA9IHRpbWUudGltZSgp
CiAKLSAgICAgICAgc3RhdHMgPSBwcm9jZXNzX291dHB1dChzZWxmLl9wb3J0LCB0ZXN0X2luZm8s
IHNlbGYuX3Rlc3RfdHlwZXMsCisgICAgICAgIHJlc3VsdCA9IHByb2Nlc3Nfb3V0cHV0KHNlbGYu
X3BvcnQsIHRlc3RfaW5mbywgc2VsZi5fdGVzdF90eXBlcywKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWxmLl90ZXN0X2FyZ3MsIHNlbGYuX29wdGlvbnMuY29uZmlndXJhdGlvbiwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zLnJlc3VsdHNfZGly
ZWN0b3J5LCBjcmFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LCBl
bmQgLSBzdGFydCwgYWN0dWFsX2NoZWNrc3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG91dHB1dCwgZXJyb3IpCi0KLSAgICAgICAgc2VsZi5fdGVzdF9zdGF0cy5hcHBlbmQoc3Rh
dHMpCi0gICAgICAgIHJldHVybiBzdGF0cy5mYWlsdXJlcworICAgICAgICBzZWxmLl90ZXN0X3Jl
c3VsdHMuYXBwZW5kKHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCiAgICAgZGVmIF9l
bnN1cmVfZHVtcF9yZW5kZXJfdHJlZV9pc19ydW5uaW5nKHNlbGYpOgotICAgICAgICAiIiJTdGFy
dCB0aGUgc2hhcmVkIER1bXBSZW5kZXJUcmVlLCBpZiBpdCdzIG5vdCBydW5uaW5nLiAgTm90IGZv
ciB1c2Ugd2hlbgotICAgICAgICBydW5uaW5nIHRlc3RzIHNpbmdseSwgc2luY2UgdGhvc2UgZWFj
aCBzdGFydCBhIHNlcGFyYXRlIER1bXBSZW5kZXJUcmVlIGluCi0gICAgICAgIHRoZWlyIG93biB0
aHJlYWQuCisgICAgICAgICIiIlN0YXJ0IHRoZSBzaGFyZWQgRHVtcFJlbmRlclRyZWUsIGlmIGl0
J3Mgbm90IHJ1bm5pbmcuICBOb3QgZm9yIHVzZQorICAgICAgICB3aGVuIHJ1bm5pbmcgdGVzdHMg
c2luZ2x5LCBzaW5jZSB0aG9zZSBlYWNoIHN0YXJ0IGEgc2VwYXJhdGUKKyAgICAgICAgRHVtcFJl
bmRlclRyZWUgaW4gdGhlaXIgb3duIHRocmVhZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIChu
b3Qgc2VsZi5fZHJpdmVyIG9yIHNlbGYuX2RyaXZlci5wb2xsKCkgaXMgbm90IE5vbmUpOgogICAg
ICAgICAgICAgc2VsZi5fZHJpdmVyID0gc2VsZi5fcG9ydC5zdGFydF9kcml2ZXIoCmRpZmYgLS1n
aXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFj
a2FnZS90ZXN0X2V4cGVjdGF0aW9ucy5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
bGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfZXhwZWN0YXRpb25zLnB5CmluZGV4IDM5
N2VjNmUuLmEyZWM4ZGQgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
bGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfZXhwZWN0YXRpb25zLnB5CisrKyBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rl
c3RfZXhwZWN0YXRpb25zLnB5CkBAIC00OCw2ICs0OCw3IEBAIF9sb2cgPSBsb2dnaW5nLmdldExv
Z2dlcigid2Via2l0cHkubGF5b3V0X3Rlc3RzLmxheW91dF9wYWNrYWdlLiIKICMgVGVzdCBleHBl
Y3RhdGlvbiBmaWxlIHVwZGF0ZSBhY3Rpb24gY29uc3RhbnRzCiAoTk9fQ0hBTkdFLCBSRU1PVkVf
VEVTVCwgUkVNT1ZFX1BMQVRGT1JNLCBBRERfUExBVEZPUk1TX0VYQ0VQVF9USElTKSA9IHJhbmdl
KDQpCiAKKwogZGVmIHJlc3VsdF93YXNfZXhwZWN0ZWQocmVzdWx0LCBleHBlY3RlZF9yZXN1bHRz
LCB0ZXN0X25lZWRzX3JlYmFzZWxpbmluZywKICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rf
aXNfc2tpcHBlZCk6CiAgICAgIiIiUmV0dXJucyB3aGV0aGVyIHdlIGdvdCBhIHJlc3VsdCB3ZSB3
ZXJlIGV4cGVjdGluZy4KQEAgLTYxLDExICs2MiwxMiBAQCBkZWYgcmVzdWx0X3dhc19leHBlY3Rl
ZChyZXN1bHQsIGV4cGVjdGVkX3Jlc3VsdHMsIHRlc3RfbmVlZHNfcmViYXNlbGluaW5nLAogICAg
IGlmIHJlc3VsdCBpbiAoSU1BR0UsIFRFWFQsIElNQUdFX1BMVVNfVEVYVCkgYW5kIEZBSUwgaW4g
ZXhwZWN0ZWRfcmVzdWx0czoKICAgICAgICAgcmV0dXJuIFRydWUKICAgICBpZiByZXN1bHQgPT0g
TUlTU0lORyBhbmQgdGVzdF9uZWVkc19yZWJhc2VsaW5pbmc6Ci0gICAgICAgcmV0dXJuIFRydWUK
KyAgICAgICAgcmV0dXJuIFRydWUKICAgICBpZiByZXN1bHQgPT0gU0tJUCBhbmQgdGVzdF9pc19z
a2lwcGVkOgotICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBUcnVlCiAgICAgcmV0
dXJuIEZhbHNlCiAKKwogZGVmIHJlbW92ZV9waXhlbF9mYWlsdXJlcyhleHBlY3RlZF9yZXN1bHRz
KToKICAgICAiIiJSZXR1cm5zIGEgY29weSBvZiB0aGUgZXhwZWN0ZWQgcmVzdWx0cyBmb3IgYSB0
ZXN0LCBleGNlcHQgdGhhdCB3ZQogICAgIGRyb3AgYW55IHBpeGVsIGZhaWx1cmVzIGFuZCByZXR1
cm4gdGhlIHJlbWFpbmluZyBleHBlY3RhdGlvbnMuIEZvciBleGFtcGxlLApAQCAtMTQxLDEyICsx
NDMsMTYgQEAgY2xhc3MgVGVzdEV4cGVjdGF0aW9uczoKICAgICAgICAgcmV0dmFsID0gW10KIAog
ICAgICAgICBmb3IgZXhwZWN0YXRpb24gaW4gZXhwZWN0YXRpb25zOgotICAgICAgICAgICAgZm9y
IGl0ZW0gaW4gVGVzdEV4cGVjdGF0aW9uc0ZpbGUuRVhQRUNUQVRJT05TLml0ZW1zKCk6Ci0gICAg
ICAgICAgICAgICAgaWYgaXRlbVsxXSA9PSBleHBlY3RhdGlvbjoKLSAgICAgICAgICAgICAgICAg
ICAgcmV0dmFsLmFwcGVuZChpdGVtWzBdKQotICAgICAgICAgICAgICAgICAgICBicmVhaworICAg
ICAgICAgICAgcmV0dmFsLmFwcGVuZChzZWxmLmV4cGVjdGF0aW9uX3RvX3N0cmluZyhleHBlY3Rh
dGlvbikpCisKKyAgICAgICAgcmV0dXJuICIgIi5qb2luKHJldHZhbCkKIAotICAgICAgICByZXR1
cm4gIiAiLmpvaW4ocmV0dmFsKS51cHBlcigpCisgICAgZGVmIGV4cGVjdGF0aW9uX3RvX3N0cmlu
ZyhzZWxmLCBleHBlY3RhdGlvbik6CisgICAgICAgICIiIlJldHVybnMgdGhlIHVwcGVyY2FzZWQg
c3RyaW5nIGVxdWl2YWxlbnQgb2YgYSBnaXZlbiBleHBlY3RhdGlvbi4iIiIKKyAgICAgICAgZm9y
IGl0ZW0gaW4gVGVzdEV4cGVjdGF0aW9uc0ZpbGUuRVhQRUNUQVRJT05TLml0ZW1zKCk6CisgICAg
ICAgICAgICBpZiBpdGVtWzFdID09IGV4cGVjdGF0aW9uOgorICAgICAgICAgICAgICAgIHJldHVy
biBpdGVtWzBdLnVwcGVyKCkKKyAgICAgICAgcmV0dXJuICIiCiAKICAgICBkZWYgZ2V0X3RpbWVs
aW5lX2Zvcl90ZXN0KHNlbGYsIHRlc3QpOgogICAgICAgICByZXR1cm4gc2VsZi5fZXhwZWN0ZWRf
ZmFpbHVyZXMuZ2V0X3RpbWVsaW5lX2Zvcl90ZXN0KHRlc3QpCkBAIC04MzQsNyArODQwLDggQEAg
Y2xhc3MgVGVzdEV4cGVjdGF0aW9uc0ZpbGU6CiAgICAgICAgICAgICBpZiB0ZXN0IGluIHNldF9v
Zl90ZXN0czoKICAgICAgICAgICAgICAgICBzZXRfb2ZfdGVzdHMucmVtb3ZlKHRlc3QpCiAKLSAg
ICBkZWYgX2FscmVhZHlfc2Vlbl90ZXN0KHNlbGYsIHRlc3QsIHRlc3RfbGlzdF9wYXRoLCBsaW5l
bm8sIGFsbG93X292ZXJyaWRlcyk6CisgICAgZGVmIF9hbHJlYWR5X3NlZW5fdGVzdChzZWxmLCB0
ZXN0LCB0ZXN0X2xpc3RfcGF0aCwgbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
YWxsb3dfb3ZlcnJpZGVzKToKICAgICAgICAgIiIiUmV0dXJucyB0cnVlIGlmIHdlJ3ZlIGFscmVh
ZHkgc2VlbiBhIG1vcmUgcHJlY2lzZSBwYXRoIGZvciB0aGlzIHRlc3QKICAgICAgICAgdGhhbiB0
aGUgdGVzdF9saXN0X3BhdGguCiAgICAgICAgICIiIgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0cy5weSBiL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHMucHkK
aW5kZXggMDU5ZmQwOS4uMmFjYTNhNyAxMDA3NTUKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0cy5weQorKysgYi9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzLnB5CkBAIC04
MSw4ICs4MSwxNSBAQCBfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoIndlYmtpdHB5LmxheW91dF90
ZXN0cy5ydW5fd2Via2l0X3Rlc3RzIikKICMgZGlyZWN0b3J5LWJ5LWRpcmVjdG9yeSBmZWVkYmFj
aykuCiBMT0dfREVUQUlMRURfUFJPR1JFU1MgPSAnZGV0YWlsZWQtcHJvZ3Jlc3MnCiAKK0xPR19T
VU1NQVJZID0gJ3N1bW1hcnknCisKKyMgIlRyYWNlIiB0aGUgdGVzdCAtIGxvZyB0aGUgZXhwZWN0
ZWQgcmVzdWx0LCB0aGUgYWN0dWFsIHJlc3VsdCwgYW5kIHRoZQorIyBiYXNlbGluZXMgdXNlZAor
TE9HX1RSQUNFID0gJ3RyYWNlJworCiAjIExvZyBhbnkgdW5leHBlY3RlZCByZXN1bHRzIHdoaWxl
IHJ1bm5pbmcgKGluc3RlYWQgb2YganVzdCBhdCB0aGUgZW5kKS4KIExPR19VTkVYUEVDVEVEID0g
J3VuZXhwZWN0ZWQnCitMT0dfVU5FWFBFQ1RFRF9SRVNVTFRTID0gJ3VuZXhwZWN0ZWQtcmVzdWx0
cycKIAogIyBCdWlsZGVyIGJhc2UgVVJMIHdoZXJlIHdlIGhhdmUgdGhlIGFyY2hpdmVkIHRlc3Qg
cmVzdWx0cy4KIEJVSUxERVJfQkFTRV9VUkwgPSAiaHR0cDovL2J1aWxkLmNocm9taXVtLm9yZy9i
dWlsZGJvdC9sYXlvdXRfdGVzdF9yZXN1bHRzLyIKQEAgLTEzNSwyNSArMTQyLDIzIEBAIGNsYXNz
IFJlc3VsdFN1bW1hcnkob2JqZWN0KToKICAgICAgICAgICAgIHNlbGYudGVzdHNfYnlfdGltZWxp
bmVbdGltZWxpbmVdID0gKAogICAgICAgICAgICAgICAgIGV4cGVjdGF0aW9ucy5nZXRfdGVzdHNf
d2l0aF90aW1lbGluZSh0aW1lbGluZSkpCiAKLSAgICBkZWYgYWRkKHNlbGYsIHRlc3QsIGZhaWx1
cmVzLCByZXN1bHQsIGV4cGVjdGVkKToKLSAgICAgICAgIiIiQWRkIGEgcmVzdWx0IGludG8gdGhl
IGFwcHJvcHJpYXRlIGJpbi4KKyAgICBkZWYgYWRkKHNlbGYsIHJlc3VsdCwgZXhwZWN0ZWQpOgor
ICAgICAgICAiIiJBZGQgYSBUZXN0UmVzdWx0IGludG8gdGhlIGFwcHJvcHJpYXRlIGJpbi4KIAog
ICAgICAgICBBcmdzOgotICAgICAgICAgIHRlc3Q6IHRlc3QgZmlsZSBuYW1lCi0gICAgICAgICAg
ZmFpbHVyZXM6IGxpc3Qgb2YgZmFpbHVyZSBvYmplY3RzIGZyb20gdGVzdCBleGVjdXRpb24KLSAg
ICAgICAgICByZXN1bHQ6IHJlc3VsdCBvZiB0ZXN0IChQQVNTLCBJTUFHRSwgZXRjLikuCisgICAg
ICAgICAgcmVzdWx0OiBUZXN0UmVzdWx0IGZyb20gZHVtcF9yZW5kZXJfdHJlZV90aHJlYWQKICAg
ICAgICAgICBleHBlY3RlZDogd2hldGhlciB0aGUgcmVzdWx0IHdhcyB3aGF0IHdlIGV4cGVjdGVk
IGl0IHRvIGJlLgogICAgICAgICAiIiIKIAotICAgICAgICBzZWxmLnRlc3RzX2J5X2V4cGVjdGF0
aW9uW3Jlc3VsdF0uYWRkKHRlc3QpCi0gICAgICAgIHNlbGYucmVzdWx0c1t0ZXN0XSA9IHJlc3Vs
dAorICAgICAgICBzZWxmLnRlc3RzX2J5X2V4cGVjdGF0aW9uW3Jlc3VsdC50eXBlXS5hZGQocmVz
dWx0LmZpbGVuYW1lKQorICAgICAgICBzZWxmLnJlc3VsdHNbcmVzdWx0LmZpbGVuYW1lXSA9IHJl
c3VsdC50eXBlCiAgICAgICAgIHNlbGYucmVtYWluaW5nIC09IDEKLSAgICAgICAgaWYgbGVuKGZh
aWx1cmVzKToKLSAgICAgICAgICAgIHNlbGYuZmFpbHVyZXNbdGVzdF0gPSBmYWlsdXJlcworICAg
ICAgICBpZiBsZW4ocmVzdWx0LmZhaWx1cmVzKToKKyAgICAgICAgICAgIHNlbGYuZmFpbHVyZXNb
cmVzdWx0LmZpbGVuYW1lXSA9IHJlc3VsdC5mYWlsdXJlcwogICAgICAgICBpZiBleHBlY3RlZDoK
ICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQgKz0gMQogICAgICAgICBlbHNlOgotICAgICAgICAg
ICAgc2VsZi51bmV4cGVjdGVkX3Jlc3VsdHNbdGVzdF0gPSByZXN1bHQKKyAgICAgICAgICAgIHNl
bGYudW5leHBlY3RlZF9yZXN1bHRzW3Jlc3VsdC5maWxlbmFtZV0gPSByZXN1bHQudHlwZQogICAg
ICAgICAgICAgc2VsZi51bmV4cGVjdGVkICs9IDEKIAogCkBAIC0zNzQsOCArMzc5LDEwIEBAIGNs
YXNzIFRlc3RSdW5uZXI6CiAgICAgICAgICAgICAjIHN1YnRyYWN0ZWQgb3V0IG9mIHNlbGYuX3Rl
c3RfZmlsZXMsIGFib3ZlKSwgYnV0IHdlIHN0dWIgb3V0IHRoZQogICAgICAgICAgICAgIyByZXN1
bHRzIGhlcmUgc28gdGhlIHN0YXRpc3RpY3MgY2FuIHJlbWFpbiBhY2N1cmF0ZS4KICAgICAgICAg
ICAgIGZvciB0ZXN0IGluIHNraXBfY2h1bms6Ci0gICAgICAgICAgICAgICAgcmVzdWx0X3N1bW1h
cnkuYWRkKHRlc3QsIFtdLCB0ZXN0X2V4cGVjdGF0aW9ucy5TS0lQLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1UcnVlKQorICAgICAgICAgICAgICAgIHJlc3Vs
dCA9IGR1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLlRlc3RSZXN1bHQodGVzdCwgW10sCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAw
LCAwKQorICAgICAgICAgICAgICAgIHJlc3VsdC50eXBlID0gdGVzdF9leHBlY3RhdGlvbnMuU0tJ
UAorICAgICAgICAgICAgICAgIHJlc3VsdF9zdW1tYXJ5LmFkZChyZXN1bHQsIGV4cGVjdGVkPVRy
dWUpCiAgICAgICAgIHdyaXRlKCIiKQogCiAgICAgICAgIHJldHVybiByZXN1bHRfc3VtbWFyeQpA
QCAtNTgyLDcgKzU4OSw3IEBAIGNsYXNzIFRlc3RSdW5uZXI6CiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAndG90YWxfdGltZSc6IHRocmVhZC5nZXRfdG90YWxfdGltZSgp
fSkKICAgICAgICAgICAgICAgICB0ZXN0X3RpbWluZ3MudXBkYXRlKHRocmVhZC5nZXRfZGlyZWN0
b3J5X3RpbWluZ19zdGF0cygpKQogICAgICAgICAgICAgICAgIGluZGl2aWR1YWxfdGVzdF90aW1p
bmdzLmV4dGVuZCgKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldF9pbmRpdmlkdWFsX3Rl
c3Rfc3RhdHMoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldF90ZXN0X3Jlc3VsdHMo
KSkKICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgICAgICAgZm9yIHRo
cmVhZCBpbiB0aHJlYWRzOgogICAgICAgICAgICAgICAgIHRocmVhZC5jYW5jZWwoKQpAQCAtNjk2
LDI2ICs3MDMsNTggQEAgY2xhc3MgVGVzdFJ1bm5lcjoKICAgICAgICAgcmV0dXJuIHVuZXhwZWN0
ZWRfcmVzdWx0c1snbnVtX3JlZ3Jlc3Npb25zJ10KIAogICAgIGRlZiB1cGRhdGVfc3VtbWFyeShz
ZWxmLCByZXN1bHRfc3VtbWFyeSk6Ci0gICAgICAgICIiIlVwZGF0ZSB0aGUgc3VtbWFyeSB3aGls
ZSBydW5uaW5nIHRlc3RzLiIiIgorICAgICAgICAiIiJVcGRhdGUgdGhlIHN1bW1hcnkgYW5kIHBy
aW50IHJlc3VsdHMgd2l0aCBhbnkgY29tcGxldGVkIHRlc3RzLiIiIgogICAgICAgICB3aGlsZSBU
cnVlOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICh0ZXN0LCBmYWlsX2xpc3Qp
ID0gc2VsZi5fcmVzdWx0X3F1ZXVlLmdldF9ub3dhaXQoKQotICAgICAgICAgICAgICAgIHJlc3Vs
dCA9IHRlc3RfZmFpbHVyZXMuZGV0ZXJtaW5lX3Jlc3VsdF90eXBlKGZhaWxfbGlzdCkKLSAgICAg
ICAgICAgICAgICBleHBlY3RlZCA9IHNlbGYuX2V4cGVjdGF0aW9ucy5tYXRjaGVzX2FuX2V4cGVj
dGVkX3Jlc3VsdCh0ZXN0LAotICAgICAgICAgICAgICAgICAgICByZXN1bHQsIHNlbGYuX29wdGlv
bnMucGl4ZWxfdGVzdHMpCi0gICAgICAgICAgICAgICAgcmVzdWx0X3N1bW1hcnkuYWRkKHRlc3Qs
IGZhaWxfbGlzdCwgcmVzdWx0LCBleHBlY3RlZCkKLSAgICAgICAgICAgICAgICBpZiAoTE9HX0RF
VEFJTEVEX1BST0dSRVNTIGluIHNlbGYuX29wdGlvbnMubG9nIGFuZAotICAgICAgICAgICAgICAg
ICAgICAoc2VsZi5fb3B0aW9ucy5leHBlcmltZW50YWxfZnVsbHlfcGFyYWxsZWwgb3IKLSAgICAg
ICAgICAgICAgICAgICAgIHNlbGYuX2lzX3NpbmdsZV90aHJlYWRlZCgpKSk6Ci0gICAgICAgICAg
ICAgICAgICAgIHNlbGYuX2Rpc3BsYXlfZGV0YWlsZWRfcHJvZ3Jlc3MocmVzdWx0X3N1bW1hcnkp
Ci0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgaWYgbm90IGV4cGVj
dGVkIGFuZCBMT0dfVU5FWFBFQ1RFRCBpbiBzZWxmLl9vcHRpb25zLmxvZzoKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfdGVzdF9yZXN1bHQodGVzdCwgcmVz
dWx0KQotICAgICAgICAgICAgICAgICAgICBzZWxmLl9kaXNwbGF5X29uZV9saW5lX3Byb2dyZXNz
KHJlc3VsdF9zdW1tYXJ5KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc3VsdF9x
dWV1ZS5nZXRfbm93YWl0KCkKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHNlbGYuX2V4cGVj
dGF0aW9ucy5tYXRjaGVzX2FuX2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAg
cmVzdWx0LmZpbGVuYW1lLCByZXN1bHQudHlwZSwgc2VsZi5fb3B0aW9ucy5waXhlbF90ZXN0cykK
KyAgICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeS5hZGQocmVzdWx0LCBleHBlY3RlZCkKKyAg
ICAgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X3Jlc3VsdHMocmVzdWx0LCBleHBlY3RlZCwg
cmVzdWx0X3N1bW1hcnkpCiAgICAgICAgICAgICBleGNlcHQgUXVldWUuRW1wdHk6CiAgICAgICAg
ICAgICAgICAgcmV0dXJuCiAKLSAgICBkZWYgX2Rpc3BsYXlfb25lX2xpbmVfcHJvZ3Jlc3Moc2Vs
ZiwgcmVzdWx0X3N1bW1hcnkpOgorICAgIGRlZiBfcHJpbnRfdGVzdF9yZXN1bHRzKHNlbGYsIHJl
c3VsdCwgZXhwZWN0ZWQsIHJlc3VsdF9zdW1tYXJ5KToKKyAgICAgICAgIlByaW50IHRoZSByZXN1
bHQgb2YgdGhlIHRlc3QgYXMgZGV0ZXJtaW5lZCBieSB0aGUgLS1sb2cgc3dpdGNoZXMuIgorICAg
ICAgICBpZiBMT0dfVFJBQ0UgaW4gc2VsZi5fb3B0aW9ucy5sb2c6CisgICAgICAgICAgICBzZWxm
Ll9wcmludF90ZXN0X3RyYWNlKHJlc3VsdCkKKyAgICAgICAgZWxpZiAoTE9HX0RFVEFJTEVEX1BS
T0dSRVNTIGluIHNlbGYuX29wdGlvbnMubG9nIGFuZAorICAgICAgICAgICAgICAoc2VsZi5fb3B0
aW9ucy5leHBlcmltZW50YWxfZnVsbHlfcGFyYWxsZWwgb3IKKyAgICAgICAgICAgICAgIHNlbGYu
X2lzX3NpbmdsZV90aHJlYWRlZCgpKSk6CisgICAgICAgICAgICBzZWxmLl9wcmludF9kZXRhaWxl
ZF9wcm9ncmVzcyhyZXN1bHRfc3VtbWFyeSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlm
IChub3QgZXhwZWN0ZWQgYW5kIExPR19VTkVYUEVDVEVEIGluIHNlbGYuX29wdGlvbnMubG9nKToK
KyAgICAgICAgICAgICAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX3Rlc3RfcmVzdWx0KHJlc3Vs
dCkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X29uZV9saW5lX3Byb2dyZXNzKHJlc3VsdF9zdW1t
YXJ5KQorCisgICAgZGVmIF9wcmludF90ZXN0X3RyYWNlKHNlbGYsIHJlc3VsdCk6CisgICAgICAg
ICIiIlByaW50IGRldGFpbGVkIHJlc3VsdHMgb2YgYSB0ZXN0ICh0cmlnZ2VyZWQgYnkgLS1sb2cg
dHJhY2UpLgorICAgICAgICBGb3IgZWFjaCB0ZXN0LCBwcmludDoKKyAgICAgICAgICAgLSBsb2Nh
dGlvbiBvZiB0aGUgZXhwZWN0ZWQgYmFzZWxpbmVzCisgICAgICAgICAgIC0gZXhwZWN0ZWQgcmVz
dWx0cworICAgICAgICAgICAtIGFjdHVhbCByZXN1bHQKKyAgICAgICAgICAgLSB0aW1pbmcgaW5m
bworICAgICAgICAiIiIKKyAgICAgICAgZmlsZW5hbWUgPSByZXN1bHQuZmlsZW5hbWUKKyAgICAg
ICAgdGVzdF9uYW1lID0gc2VsZi5fcG9ydC5yZWxhdGl2ZV90ZXN0X2ZpbGVuYW1lKGZpbGVuYW1l
KQorICAgICAgICBfbG9nLmluZm8oJ3RyYWNlOiAlcycgJSB0ZXN0X25hbWUpCisgICAgICAgIF9s
b2cuaW5mbygnICB0eHQ6ICVzJyAlCisgICAgICAgICAgICAgICAgICBzZWxmLl9wb3J0LnJlbGF0
aXZlX3Rlc3RfZmlsZW5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQuZXhw
ZWN0ZWRfZmlsZW5hbWUoZmlsZW5hbWUsICcudHh0JykpKQorICAgICAgICBwbmdfZmlsZSA9IHNl
bGYuX3BvcnQuZXhwZWN0ZWRfZmlsZW5hbWUoZmlsZW5hbWUsICcucG5nJykKKyAgICAgICAgaWYg
b3MucGF0aC5leGlzdHMocG5nX2ZpbGUpOgorICAgICAgICAgICAgX2xvZy5pbmZvKCcgIHBuZzog
JXMnICUKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wb3J0LnJlbGF0aXZlX3Rlc3RfZmls
ZW5hbWUoZmlsZW5hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgX2xvZy5pbmZvKCcg
IHBuZzogPG5vbmU+JykKKyAgICAgICAgX2xvZy5pbmZvKCcgIGV4cDogJXMnICUKKyAgICAgICAg
ICAgICAgICAgIHNlbGYuX2V4cGVjdGF0aW9ucy5nZXRfZXhwZWN0YXRpb25zX3N0cmluZyhmaWxl
bmFtZSkpCisgICAgICAgIF9sb2cuaW5mbygnICBnb3Q6ICVzJyAlCisgICAgICAgICAgICAgICAg
ICBzZWxmLl9leHBlY3RhdGlvbnMuZXhwZWN0YXRpb25fdG9fc3RyaW5nKHJlc3VsdC50eXBlKSkK
KyAgICAgICAgX2xvZy5pbmZvKCcgdG9vazogJS0uM2YnICUgcmVzdWx0LnRlc3RfcnVuX3RpbWUp
CisgICAgICAgIF9sb2cuaW5mbygnJykKKworICAgIGRlZiBfcHJpbnRfb25lX2xpbmVfcHJvZ3Jl
c3Moc2VsZiwgcmVzdWx0X3N1bW1hcnkpOgogICAgICAgICAiIiJEaXNwbGF5cyB0aGUgcHJvZ3Jl
c3MgdGhyb3VnaCB0aGUgdGVzdCBydW4uIiIiCiAgICAgICAgIHBlcmNlbnRfY29tcGxldGUgPSAx
MDAgKiAocmVzdWx0X3N1bW1hcnkuZXhwZWN0ZWQgKwogICAgICAgICAgICAgcmVzdWx0X3N1bW1h
cnkudW5leHBlY3RlZCkgLyByZXN1bHRfc3VtbWFyeS50b3RhbApAQCAtNzIzLDcgKzc2Miw3IEBA
IGNsYXNzIFRlc3RSdW5uZXI6CiAgICAgICAgICAgICAiICVkIGxlZnQiICUgKHBlcmNlbnRfY29t
cGxldGUsIHJlc3VsdF9zdW1tYXJ5LmV4cGVjdGVkLAogICAgICAgICAgICAgIHJlc3VsdF9zdW1t
YXJ5LnVuZXhwZWN0ZWQsIHJlc3VsdF9zdW1tYXJ5LnJlbWFpbmluZykpCiAKLSAgICBkZWYgX2Rp
c3BsYXlfZGV0YWlsZWRfcHJvZ3Jlc3Moc2VsZiwgcmVzdWx0X3N1bW1hcnkpOgorICAgIGRlZiBf
cHJpbnRfZGV0YWlsZWRfcHJvZ3Jlc3Moc2VsZiwgcmVzdWx0X3N1bW1hcnkpOgogICAgICAgICAi
IiJEaXNwbGF5IGRldGFpbGVkIHByb2dyZXNzIG91dHB1dCB3aGVyZSB3ZSBwcmludCB0aGUgZGly
ZWN0b3J5IG5hbWUKICAgICAgICAgYW5kIG9uZSBkb3QgZm9yIGVhY2ggY29tcGxldGVkIHRlc3Qu
IFRoaXMgaXMgdHJpZ2dlcmVkIGJ5CiAgICAgICAgICItLWxvZyBkZXRhaWxlZC1wcm9ncmVzcyIu
IiIiCkBAIC03NjcsNiArODA2LDEzIEBAIGNsYXNzIFRlc3RSdW5uZXI6CiAgICAgICAgIGVsc2U6
CiAgICAgICAgICAgICBzZWxmLl9tZXRlci53cml0ZSgiJXNcbiIgJSAoc2VsZi5fY3VycmVudF9w
cm9ncmVzc19zdHIpKQogCisgICAgZGVmIF9wcmludF91bmV4cGVjdGVkX3Rlc3RfcmVzdWx0KHNl
bGYsIHJlc3VsdCk6CisgICAgICAgICIiIlByaW50cyBvbmUgdW5leHBlY3RlZCB0ZXN0IHJlc3Vs
dCBsaW5lLiIiIgorICAgICAgICBkZXNjID0gVGVzdEV4cGVjdGF0aW9uc0ZpbGUuRVhQRUNUQVRJ
T05fREVTQ1JJUFRJT05TW3Jlc3VsdC50eXBlXVswXQorICAgICAgICBzZWxmLl9tZXRlci53cml0
ZSgiICAlcyAtPiB1bmV4cGVjdGVkICVzXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
KHNlbGYuX3BvcnQucmVsYXRpdmVfdGVzdF9maWxlbmFtZShyZXN1bHQuZmlsZW5hbWUpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZGVzYykpCisKICAgICBkZWYgX2dldF9mYWlsdXJlcyhz
ZWxmLCByZXN1bHRfc3VtbWFyeSwgaW5jbHVkZV9jcmFzaGVzKToKICAgICAgICAgIiIiRmlsdGVy
cyBhIGRpY3Qgb2YgcmVzdWx0cyBhbmQgcmV0dXJucyBvbmx5IHRoZSBmYWlsdXJlcy4KIApAQCAt
MTI4MCwxMiArMTMyNiw2IEBAIGNsYXNzIFRlc3RSdW5uZXI6CiAgICAgICAgIGlmIGxlbih1bmV4
cGVjdGVkX3Jlc3VsdHNbJ3Rlc3RzJ10pIGFuZCBzZWxmLl9vcHRpb25zLnZlcmJvc2U6CiAgICAg
ICAgICAgICBwcmludCAiLSIgKiA3OAogCi0gICAgZGVmIF9wcmludF91bmV4cGVjdGVkX3Rlc3Rf
cmVzdWx0KHNlbGYsIHRlc3QsIHJlc3VsdCk6Ci0gICAgICAgICIiIlByaW50cyBvbmUgdW5leHBl
Y3RlZCB0ZXN0IHJlc3VsdCBsaW5lLiIiIgotICAgICAgICBkZXNjID0gVGVzdEV4cGVjdGF0aW9u
c0ZpbGUuRVhQRUNUQVRJT05fREVTQ1JJUFRJT05TW3Jlc3VsdF1bMF0KLSAgICAgICAgc2VsZi5f
bWV0ZXIud3JpdGUoIiAgJXMgLT4gdW5leHBlY3RlZCAlc1xuIiAlCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgIChzZWxmLl9wb3J0LnJlbGF0aXZlX3Rlc3RfZmlsZW5hbWUodGVzdCksIGRlc2Mp
KQotCiAgICAgZGVmIF93cml0ZV9yZXN1bHRzX2h0bWxfZmlsZShzZWxmLCByZXN1bHRfc3VtbWFy
eSk6CiAgICAgICAgICIiIldyaXRlIHJlc3VsdHMuaHRtbCB3aGljaCBpcyBhIHN1bW1hcnkgb2Yg
dGVzdHMgdGhhdCBmYWlsZWQuCiAKQEAgLTE1NjAsNyArMTYwMCw3IEBAIGRlZiBwYXJzZV9hcmdz
KGFyZ3M9Tm9uZSk6CiAgICAgICAgICAgICBoZWxwPSJsb2cgdmFyaW91cyB0eXBlcyBvZiBkYXRh
LiBUaGUgcGFyYW0gc2hvdWxkIGJlIGEgIiArCiAgICAgICAgICAgICAgICAgICJjb21tYS1zZXBh
cmF0ZWQgbGlzdCBvZiB2YWx1ZXMgZnJvbTogIiArCiAgICAgICAgICAgICAgICAgICJhY3R1YWws
Y29uZmlnLCIgKyBMT0dfREVUQUlMRURfUFJPR1JFU1MgKwotICAgICAgICAgICAgICAgICAiLGV4
cGVjdGVkLHRpbWluZywiICsgTE9HX1VORVhQRUNURUQgKyAiICIgKworICAgICAgICAgICAgICAg
ICAiLGV4cGVjdGVkLHRpbWluZyx0cmFjZSIgKyBMT0dfVU5FWFBFQ1RFRCArICIgIiArCiAgICAg
ICAgICAgICAgICAgICIoZGVmYXVsdHMgdG8gIiArICItLWxvZyBkZXRhaWxlZC1wcm9ncmVzcyx1
bmV4cGVjdGVkKSIpLAogICAgICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLXYiLCAiLS12ZXJi
b3NlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsIGhl
bHA9ImluY2x1ZGUgZGVidWctbGV2ZWwgbG9nZ2luZyIpLAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53638</attachid>
            <date>2010-04-18 15:32:39 -0700</date>
            <delta_ts>2010-04-19 15:50:27 -0700</delta_ts>
            <desc>update w/ feedback from cjerdonek</desc>
            <filename>bug-37726-20100418153238.patch</filename>
            <type>text/plain</type>
            <size>11147</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAwMjA4NzQ1Li5jNDZlOGY1IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xNCw2ICsxNCw4IEBACiAgICAgICAg
ICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5k
ZXJfdGhyZWFkLnB5OgogICAgICAgICAgIC0gcmVuYW1lIFRlc3RTdGF0cyB0byBUZXN0UmVzdWx0
IGFuZCBtYWtlIGl0IG1vcmUgcHVibGljLCByZXN1bHRpbmcKICAgICAgICAgICAgIGluIGNsZWFu
ZXIgY29kZQorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9w
YWNrYWdlL3Rlc3RfZXhwZWN0YXRpb25zLnB5OgorICAgICAgICAgIC0gYWRkIGV4cGVjdGF0aW9u
X3RvX3N0cmluZygpIGFzIGEgc2VwYXJhdGUgY2FsbGFibGUgZnVuY3Rpb24KIAogMjAxMC0wNC0x
NSAgU2FtIFdlaW5pZyAgPHNhbUB3ZWJraXQub3JnPgogCmRpZmYgLS1naXQgYS9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9kdW1wX3JlbmRl
cl90cmVlX3RocmVhZC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL2xheW91dF9wYWNrYWdlL2R1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLnB5CmluZGV4IGFlZDQ5
MGMuLjE1NDk3OWIgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL2R1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLnB5CisrKyBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L2R1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLnB5CkBAIC0xMTIsMTkgKzExMiwxOSBAQCBkZWYgcHJv
Y2Vzc19vdXRwdXQocG9ydCwgdGVzdF9pbmZvLCB0ZXN0X3R5cGVzLCB0ZXN0X2FyZ3MsIGNvbmZp
Z3VyYXRpb24sCiAKICAgICB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnMgPSB0aW1lLnRpbWUoKSAt
IHN0YXJ0X2RpZmZfdGltZQogICAgIHJldHVybiBUZXN0UmVzdWx0KHRlc3RfaW5mby5maWxlbmFt
ZSwgZmFpbHVyZXMsIHRlc3RfcnVuX3RpbWUsCi0gICAgICAgIHRvdGFsX3RpbWVfZm9yX2FsbF9k
aWZmcywgdGltZV9mb3JfZGlmZnMpCisgICAgICAgICAgICAgICAgICAgICAgdG90YWxfdGltZV9m
b3JfYWxsX2RpZmZzLCB0aW1lX2Zvcl9kaWZmcykKIAogCi1jbGFzcyBUZXN0UmVzdWx0OgorY2xh
c3MgVGVzdFJlc3VsdChvYmplY3QpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1l
LCBmYWlsdXJlcywgdGVzdF9ydW5fdGltZSwKICAgICAgICAgICAgICAgICAgdG90YWxfdGltZV9m
b3JfYWxsX2RpZmZzLCB0aW1lX2Zvcl9kaWZmcyk6Ci0gICAgICAgIHNlbGYuZmlsZW5hbWUgPSBm
aWxlbmFtZQogICAgICAgICBzZWxmLmZhaWx1cmVzID0gZmFpbHVyZXMKLSAgICAgICAgc2VsZi50
eXBlID0gdGVzdF9mYWlsdXJlcy5kZXRlcm1pbmVfcmVzdWx0X3R5cGUoZmFpbHVyZXMpCisgICAg
ICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgICBzZWxmLnRlc3RfcnVuX3RpbWUg
PSB0ZXN0X3J1bl90aW1lCi0gICAgICAgIHNlbGYudG90YWxfdGltZV9mb3JfYWxsX2RpZmZzID0g
dG90YWxfdGltZV9mb3JfYWxsX2RpZmZzCiAgICAgICAgIHNlbGYudGltZV9mb3JfZGlmZnMgPSB0
aW1lX2Zvcl9kaWZmcworICAgICAgICBzZWxmLnRvdGFsX3RpbWVfZm9yX2FsbF9kaWZmcyA9IHRv
dGFsX3RpbWVfZm9yX2FsbF9kaWZmcworICAgICAgICBzZWxmLnR5cGUgPSB0ZXN0X2ZhaWx1cmVz
LmRldGVybWluZV9yZXN1bHRfdHlwZShmYWlsdXJlcykKIAogCiBjbGFzcyBTaW5nbGVUZXN0VGhy
ZWFkKHRocmVhZGluZy5UaHJlYWQpOgpAQCAtMjIwLDggKzIyMCwxMCBAQCBjbGFzcyBUZXN0U2hl
bGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAgIHJldHVybiBzZWxmLl9kaXJlY3Rv
cnlfdGltaW5nX3N0YXRzCiAKICAgICBkZWYgZ2V0X3Rlc3RfcmVzdWx0cyhzZWxmKToKLSAgICAg
ICAgIiIiUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgdGVzdHMgcnVuIG9uIHRoaXMgdGhyZWFkLiBV
c2VkIHRvIGNhbGN1bGF0ZQotICAgICAgICBwZXItdGhyZWFkIHN0YXRpc3RpY3MuIiIiCisgICAg
ICAgICIiIlJldHVybiB0aGUgbGlzdCBvZiBhbGwgdGVzdHMgcnVuIG9uIHRoaXMgdGhyZWFkLgor
CisgICAgICAgIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgcGVyLXRocmVhZCBzdGF0aXN0aWNz
LgorICAgICAgICAiIiIKICAgICAgICAgcmV0dXJuIHNlbGYuX3Rlc3RfcmVzdWx0cwogCiAgICAg
ZGVmIGNhbmNlbChzZWxmKToKQEAgLTMyNSwxNSArMzI3LDE1IEBAIGNsYXNzIFRlc3RTaGVsbFRo
cmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKICAgICAgICAgICAgIGZpbGVuYW1lID0gdGVzdF9pbmZv
LmZpbGVuYW1lCiAgICAgICAgICAgICB0ZXN0c19ydW5fZmlsZS53cml0ZShmaWxlbmFtZSArICJc
biIpCiAgICAgICAgICAgICBpZiByZXN1bHQuZmFpbHVyZXM6Ci0gICAgICAgICAgICAgICAgIyBD
aGVjayBhbmQga2lsbCBEdW1wUmVuZGVyVHJlZSBpZiB3ZSBuZWVkIHRvby4KKyAgICAgICAgICAg
ICAgICAjIENoZWNrIGFuZCBraWxsIER1bXBSZW5kZXJUcmVlIGlmIHdlIG5lZWQgdG8uCiAgICAg
ICAgICAgICAgICAgaWYgbGVuKFsxIGZvciBmIGluIHJlc3VsdC5mYWlsdXJlcwotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgZi5zaG91bGRfa2lsbF9kdW1wX3JlbmRlcl90cmVlKCldKToK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYuc2hvdWxkX2tpbGxfZHVtcF9yZW5kZXJfdHJl
ZSgpXSk6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2tpbGxfZHVtcF9yZW5kZXJfdHJlZSgp
CiAgICAgICAgICAgICAgICAgICAgICMgUmVzZXQgdGhlIGJhdGNoIGNvdW50IHNpbmNlIHRoZSBz
aGVsbCBqdXN0IGJvdW5jZWQuCiAgICAgICAgICAgICAgICAgICAgIGJhdGNoX2NvdW50ID0gMAog
ICAgICAgICAgICAgICAgICMgUHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UocykuCiAgICAgICAgICAg
ICAgICAgZXJyb3Jfc3RyID0gJ1xuJy5qb2luKFsnICAnICsgZi5tZXNzYWdlKCkgZm9yCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiBpbiByZXN1bHQuZmFpbHVy
ZXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiBpbiByZXN1bHQu
ZmFpbHVyZXNdKQogICAgICAgICAgICAgICAgIF9sb2cuZGVidWcoIiVzICVzIGZhaWxlZDpcbiVz
IiAlIChzZWxmLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Bv
cnQucmVsYXRpdmVfdGVzdF9maWxlbmFtZShmaWxlbmFtZSksCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBlcnJvcl9zdHIpKQpAQCAtMzYwLDggKzM2Miw5IEBAIGNsYXNzIFRlc3RTaGVsbFRo
cmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKICAgICAgICAgQXJnczoKICAgICAgICAgICB0ZXN0X2lu
Zm86IE9iamVjdCBjb250YWluaW5nIHRoZSB0ZXN0IGZpbGVuYW1lLCB1cmkgYW5kIHRpbWVvdXQK
IAotICAgICAgICBSZXR1cm46CisgICAgICAgIFJldHVybnM6CiAgICAgICAgICAgQSBUZXN0UmVz
dWx0CisKICAgICAgICAgIiIiCiAgICAgICAgIHdvcmtlciA9IFNpbmdsZVRlc3RUaHJlYWQoc2Vs
Zi5fcG9ydCwgc2VsZi5faW1hZ2VfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzZWxmLl9zaGVsbF9hcmdzLApAQCAtMzc0LDggKzM3Nyw4IEBAIGNsYXNzIFRlc3RTaGVs
bFRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKICAgICAgICAgd29ya2VyLnN0YXJ0KCkKIAogICAg
ICAgICAjIFdoZW4gd2UncmUgcnVubmluZyBvbmUgdGVzdCBwZXIgRHVtcFJlbmRlclRyZWUgcHJv
Y2Vzcywgd2UgY2FuCi0gICAgICAgICMgZW5mb3JjZSBhIGhhcmQgdGltZW91dC4gdGhlIER1bXBS
ZW5kZXJUcmVlIHdhdGNoZG9nIHVzZXMgMi41eAotICAgICAgICAjIHRoZSB0aW1lb3V0IFdlIHdh
bnQgdG8gYmUgbGFyZ2VyIHRoYW4gdGhhdC4KKyAgICAgICAgIyBlbmZvcmNlIGEgaGFyZCB0aW1l
b3V0LiAgVGhlIER1bXBSZW5kZXJUcmVlIHdhdGNoZG9nIHVzZXMgMi41eAorICAgICAgICAjIHRo
ZSB0aW1lb3V0OyB3ZSB3YW50IHRvIGJlIGxhcmdlciB0aGFuIHRoYXQuCiAgICAgICAgIHdvcmtl
ci5qb2luKGludCh0ZXN0X2luZm8udGltZW91dCkgKiAzLjAgLyAxMDAwLjApCiAgICAgICAgIGlm
IHdvcmtlci5pc0FsaXZlKCk6CiAgICAgICAgICAgICAjIElmIGpvaW4oKSByZXR1cm5lZCB3aXRo
IHRoZSB0aHJlYWQgc3RpbGwgcnVubmluZywgdGhlCkBAIC0zOTUsNyArMzk4LDkgQEAgY2xhc3Mg
VGVzdFNoZWxsVGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgogICAgICAgICAgICAgZmFpbHVyZXMg
PSBbXQogICAgICAgICAgICAgX2xvZy5lcnJvcignQ2Fubm90IGdldCByZXN1bHRzIG9mIHRlc3Q6
ICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfaW5mby5maWxlbmFtZSkKLSAgICAg
ICAgICAgIHJlc3VsdCA9IFRlc3RSZXN1bHQodGVzdF9pbmZvLmZpbGVuYW1lLCBbXSwgMCwgMCwg
MCkKKyAgICAgICAgICAgIHJlc3VsdCA9IFRlc3RSZXN1bHQodGVzdF9pbmZvLmZpbGVuYW1lLCBm
YWlsdXJlcz1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9ydW5fdGlt
ZT0wLCB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnM9MCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGltZV9mb3JfZGlmZnM9MCkKIAogICAgICAgICByZXR1cm4gcmVzdWx0CiAKQEAg
LTQwNSw4ICs0MTAsOSBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6
CiAgICAgICAgIEFyZ3M6CiAgICAgICAgICAgdGVzdF9pbmZvOiBPYmplY3QgY29udGFpbmluZyB0
aGUgdGVzdCBmaWxlbmFtZSwgdXJpIGFuZCB0aW1lb3V0CiAKLSAgICAgICAgUmV0dXJuOgorICAg
ICAgICBSZXR1cm5zOgogICAgICAgICAgIEEgbGlzdCBvZiBUZXN0RmFpbHVyZSBvYmplY3RzIGRl
c2NyaWJpbmcgdGhlIGVycm9yLgorCiAgICAgICAgICIiIgogICAgICAgICBzZWxmLl9lbnN1cmVf
ZHVtcF9yZW5kZXJfdHJlZV9pc19ydW5uaW5nKCkKICAgICAgICAgIyBUaGUgcGl4ZWxfaGFzaCBp
cyB1c2VkIHRvIGF2b2lkIGRvaW5nIGFuIGltYWdlIGR1bXAgaWYgdGhlCkBAIC00MjIsMTcgKzQy
OCwxOCBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAg
IGVuZCA9IHRpbWUudGltZSgpCiAKICAgICAgICAgcmVzdWx0ID0gcHJvY2Vzc19vdXRwdXQoc2Vs
Zi5fcG9ydCwgdGVzdF9pbmZvLCBzZWxmLl90ZXN0X3R5cGVzLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHNlbGYuX3Rlc3RfYXJncywgc2VsZi5fb3B0aW9ucy5jb25maWd1cmF0aW9u
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMucmVzdWx0c19k
aXJlY3RvcnksIGNyYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQs
IGVuZCAtIHN0YXJ0LCBhY3R1YWxfY2hlY2tzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgb3V0cHV0LCBlcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vs
Zi5fdGVzdF9hcmdzLCBzZWxmLl9vcHRpb25zLmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMucmVzdWx0c19kaXJlY3RvcnksIGNyYXNo
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LCBlbmQgLSBzdGFydCwg
YWN0dWFsX2NoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQs
IGVycm9yKQogICAgICAgICBzZWxmLl90ZXN0X3Jlc3VsdHMuYXBwZW5kKHJlc3VsdCkKICAgICAg
ICAgcmV0dXJuIHJlc3VsdAogCiAgICAgZGVmIF9lbnN1cmVfZHVtcF9yZW5kZXJfdHJlZV9pc19y
dW5uaW5nKHNlbGYpOgotICAgICAgICAiIiJTdGFydCB0aGUgc2hhcmVkIER1bXBSZW5kZXJUcmVl
LCBpZiBpdCdzIG5vdCBydW5uaW5nLiAgTm90IGZvciB1c2UKLSAgICAgICAgd2hlbiBydW5uaW5n
IHRlc3RzIHNpbmdseSwgc2luY2UgdGhvc2UgZWFjaCBzdGFydCBhIHNlcGFyYXRlCi0gICAgICAg
IER1bXBSZW5kZXJUcmVlIGluIHRoZWlyIG93biB0aHJlYWQuCisgICAgICAgICIiIlN0YXJ0IHRo
ZSBzaGFyZWQgRHVtcFJlbmRlclRyZWUsIGlmIGl0J3Mgbm90IHJ1bm5pbmcuCisKKyAgICAgICAg
VGhpcyBpcyBub3QgZm9yIHVzZSB3aGVuIHJ1bm5pbmcgdGVzdHMgc2luZ2x5LCBzaW5jZSB0aG9z
ZSBlYWNoIHN0YXJ0CisgICAgICAgIGEgc2VwYXJhdGUgRHVtcFJlbmRlclRyZWUgaW4gdGhlaXIg
b3duIHRocmVhZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIChub3Qgc2VsZi5fZHJpdmVyIG9y
IHNlbGYuX2RyaXZlci5wb2xsKCkgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgc2VsZi5fZHJp
dmVyID0gc2VsZi5fcG9ydC5zdGFydF9kcml2ZXIoCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90ZXN0X2V4cGVjdGF0
aW9ucy5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91
dF9wYWNrYWdlL3Rlc3RfZXhwZWN0YXRpb25zLnB5CmluZGV4IGEyZWM4ZGQuLjM4MjIzZGQgMTAw
NjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91
dF9wYWNrYWdlL3Rlc3RfZXhwZWN0YXRpb25zLnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfZXhwZWN0YXRpb25zLnB5
CkBAIC0xNDgsNyArMTQ4LDcgQEAgY2xhc3MgVGVzdEV4cGVjdGF0aW9uczoKICAgICAgICAgcmV0
dXJuICIgIi5qb2luKHJldHZhbCkKIAogICAgIGRlZiBleHBlY3RhdGlvbl90b19zdHJpbmcoc2Vs
ZiwgZXhwZWN0YXRpb24pOgotICAgICAgICAiIiJSZXR1cm5zIHRoZSB1cHBlcmNhc2VkIHN0cmlu
ZyBlcXVpdmFsZW50IG9mIGEgZ2l2ZW4gZXhwZWN0YXRpb24uIiIiCisgICAgICAgICIiIlJldHVy
biB0aGUgdXBwZXJjYXNlZCBzdHJpbmcgZXF1aXZhbGVudCBvZiBhIGdpdmVuIGV4cGVjdGF0aW9u
LiIiIgogICAgICAgICBmb3IgaXRlbSBpbiBUZXN0RXhwZWN0YXRpb25zRmlsZS5FWFBFQ1RBVElP
TlMuaXRlbXMoKToKICAgICAgICAgICAgIGlmIGl0ZW1bMV0gPT0gZXhwZWN0YXRpb246CiAgICAg
ICAgICAgICAgICAgcmV0dXJuIGl0ZW1bMF0udXBwZXIoKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0cy5weSBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHMu
cHkKaW5kZXggMmFjYTNhNy4uNzVjYmIzZiAxMDA3NTUKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0cy5weQorKysgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzLnB5CkBA
IC05MSw2ICs5MSwxMSBAQCBMT0dfVFJBQ0UgPSAndHJhY2UnCiBMT0dfVU5FWFBFQ1RFRCA9ICd1
bmV4cGVjdGVkJwogTE9HX1VORVhQRUNURURfUkVTVUxUUyA9ICd1bmV4cGVjdGVkLXJlc3VsdHMn
CiAKK0xPR19WQUxVRVMgPSAiLCIuam9pbigoImFjdHVhbCIsICJjb25maWciLCBMT0dfREVUQUlM
RURfUFJPR1JFU1MsICJleHBlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgTE9HX1NVTU1B
UlksICJ0aW1pbmciLCBMT0dfVFJBQ0UsIExPR19VTkVYUEVDVEVELAorICAgICAgICAgICAgICAg
ICAgICAgIExPR19VTkVYUEVDVEVEX1JFU1VMVFMpKQorTE9HX0RFRkFVTFRfVkFMVUUgPSAiZGV0
YWlsZWQtcHJvZ3Jlc3MsdW5leHBlY3RlZCIKKwogIyBCdWlsZGVyIGJhc2UgVVJMIHdoZXJlIHdl
IGhhdmUgdGhlIGFyY2hpdmVkIHRlc3QgcmVzdWx0cy4KIEJVSUxERVJfQkFTRV9VUkwgPSAiaHR0
cDovL2J1aWxkLmNocm9taXVtLm9yZy9idWlsZGJvdC9sYXlvdXRfdGVzdF9yZXN1bHRzLyIKIApA
QCAtMTQ2LDcgKzE1MSw3IEBAIGNsYXNzIFJlc3VsdFN1bW1hcnkob2JqZWN0KToKICAgICAgICAg
IiIiQWRkIGEgVGVzdFJlc3VsdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBiaW4uCiAKICAgICAgICAg
QXJnczoKLSAgICAgICAgICByZXN1bHQ6IFRlc3RSZXN1bHQgZnJvbSBkdW1wX3JlbmRlcl90cmVl
X3RocmVhZAorICAgICAgICAgIHJlc3VsdDogVGVzdFJlc3VsdCBmcm9tIGR1bXBfcmVuZGVyX3Ry
ZWVfdGhyZWFkLgogICAgICAgICAgIGV4cGVjdGVkOiB3aGV0aGVyIHRoZSByZXN1bHQgd2FzIHdo
YXQgd2UgZXhwZWN0ZWQgaXQgdG8gYmUuCiAgICAgICAgICIiIgogCkBAIC0zNzksOCArMzg0LDkg
QEAgY2xhc3MgVGVzdFJ1bm5lcjoKICAgICAgICAgICAgICMgc3VidHJhY3RlZCBvdXQgb2Ygc2Vs
Zi5fdGVzdF9maWxlcywgYWJvdmUpLCBidXQgd2Ugc3R1YiBvdXQgdGhlCiAgICAgICAgICAgICAj
IHJlc3VsdHMgaGVyZSBzbyB0aGUgc3RhdGlzdGljcyBjYW4gcmVtYWluIGFjY3VyYXRlLgogICAg
ICAgICAgICAgZm9yIHRlc3QgaW4gc2tpcF9jaHVuazoKLSAgICAgICAgICAgICAgICByZXN1bHQg
PSBkdW1wX3JlbmRlcl90cmVlX3RocmVhZC5UZXN0UmVzdWx0KHRlc3QsIFtdLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwg
MCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBkdW1wX3JlbmRlcl90cmVlX3RocmVhZC5UZXN0
UmVzdWx0KHRlc3QsCisgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzPVtdLCB0ZXN0X3J1bl90
aW1lPTAsIHRvdGFsX3RpbWVfZm9yX2FsbF9kaWZmcz0wLAorICAgICAgICAgICAgICAgICAgICB0
aW1lX2Zvcl9kaWZmcz0wKQogICAgICAgICAgICAgICAgIHJlc3VsdC50eXBlID0gdGVzdF9leHBl
Y3RhdGlvbnMuU0tJUAogICAgICAgICAgICAgICAgIHJlc3VsdF9zdW1tYXJ5LmFkZChyZXN1bHQs
IGV4cGVjdGVkPVRydWUpCiAgICAgICAgIHdyaXRlKCIiKQpAQCAtNzA3LDEyICs3MTMsMTIgQEAg
Y2xhc3MgVGVzdFJ1bm5lcjoKICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIHRyeToK
ICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9yZXN1bHRfcXVldWUuZ2V0X25vd2FpdCgp
Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLl9leHBlY3RhdGlvbnMubWF0Y2hlc19h
bl9leHBlY3RlZF9yZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5maWxlbmFtZSwg
cmVzdWx0LnR5cGUsIHNlbGYuX29wdGlvbnMucGl4ZWxfdGVzdHMpCi0gICAgICAgICAgICAgICAg
cmVzdWx0X3N1bW1hcnkuYWRkKHJlc3VsdCwgZXhwZWN0ZWQpCi0gICAgICAgICAgICAgICAgc2Vs
Zi5fcHJpbnRfdGVzdF9yZXN1bHRzKHJlc3VsdCwgZXhwZWN0ZWQsIHJlc3VsdF9zdW1tYXJ5KQog
ICAgICAgICAgICAgZXhjZXB0IFF1ZXVlLkVtcHR5OgogICAgICAgICAgICAgICAgIHJldHVybgor
ICAgICAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLl9leHBlY3RhdGlvbnMubWF0Y2hlc19hbl9leHBl
Y3RlZF9yZXN1bHQoCisgICAgICAgICAgICAgICAgcmVzdWx0LmZpbGVuYW1lLCByZXN1bHQudHlw
ZSwgc2VsZi5fb3B0aW9ucy5waXhlbF90ZXN0cykKKyAgICAgICAgICAgIHJlc3VsdF9zdW1tYXJ5
LmFkZChyZXN1bHQsIGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9yZXN1
bHRzKHJlc3VsdCwgZXhwZWN0ZWQsIHJlc3VsdF9zdW1tYXJ5KQogCiAgICAgZGVmIF9wcmludF90
ZXN0X3Jlc3VsdHMoc2VsZiwgcmVzdWx0LCBleHBlY3RlZCwgcmVzdWx0X3N1bW1hcnkpOgogICAg
ICAgICAiUHJpbnQgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSAt
LWxvZyBzd2l0Y2hlcy4iCkBAIC0xNTk2LDEyICsxNjAyLDEwIEBAIGRlZiBwYXJzZV9hcmdzKGFy
Z3M9Tm9uZSk6CiAKICAgICBsb2dnaW5nX29wdGlvbnMgPSBbCiAgICAgICAgIG9wdHBhcnNlLm1h
a2Vfb3B0aW9uKCItLWxvZyIsIGFjdGlvbj0ic3RvcmUiLAotICAgICAgICAgICAgZGVmYXVsdD0i
ZGV0YWlsZWQtcHJvZ3Jlc3MsdW5leHBlY3RlZCIsCi0gICAgICAgICAgICBoZWxwPSJsb2cgdmFy
aW91cyB0eXBlcyBvZiBkYXRhLiBUaGUgcGFyYW0gc2hvdWxkIGJlIGEgIiArCi0gICAgICAgICAg
ICAgICAgICJjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2YWx1ZXMgZnJvbTogIiArCi0gICAgICAg
ICAgICAgICAgICJhY3R1YWwsY29uZmlnLCIgKyBMT0dfREVUQUlMRURfUFJPR1JFU1MgKwotICAg
ICAgICAgICAgICAgICAiLGV4cGVjdGVkLHRpbWluZyx0cmFjZSIgKyBMT0dfVU5FWFBFQ1RFRCAr
ICIgIiArCi0gICAgICAgICAgICAgICAgICIoZGVmYXVsdHMgdG8gIiArICItLWxvZyBkZXRhaWxl
ZC1wcm9ncmVzcyx1bmV4cGVjdGVkKSIpLAorICAgICAgICAgICAgZGVmYXVsdD1MT0dfREVGQVVM
VF9WQUxVRSwKKyAgICAgICAgICAgIGhlbHA9KCJsb2cgdmFyaW91cyB0eXBlcyBvZiBkYXRhLiBU
aGUgYXJndW1lbnQgdmFsdWUgc2hvdWxkIGJlIGEgIgorICAgICAgICAgICAgICAgICAgImNvbW1h
LXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcyBmcm9tOiAlcyAoZGVmYXVsdHMgdG8gIgorICAgICAg
ICAgICAgICAgICAgIi0tbG9nICVzKSIgJSAoTE9HX1ZBTFVFUywgTE9HX0RFRkFVTFRfVkFMVUUp
KSksCiAgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItdiIsICItLXZlcmJvc2UiLCBhY3Rp
b249InN0b3JlX3RydWUiLAogICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwgaGVscD0iaW5jbHVk
ZSBkZWJ1Zy1sZXZlbCBsb2dnaW5nIiksCiAgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCIt
LXNvdXJjZXMiLCBhY3Rpb249InN0b3JlX3RydWUiLAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53731</attachid>
            <date>2010-04-19 15:50:27 -0700</date>
            <delta_ts>2010-04-20 15:43:21 -0700</delta_ts>
            <desc>revise w/ more feedback from cjerdonek, fix delta to be against baseline</desc>
            <filename>wk37726_logging_1_trace.diff</filename>
            <type>text/plain</type>
            <size>24205</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA5OThhNmQzLi42Yjk2Mjk4IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTAtMDQt
MTkgIERpcmsgUHJhbmtlIDxkcHJhbmtlQGNocm9taXVtLm9yZz4KKworICAgICAgICBUaGlzIHBh
dGNoIHRvIG5ldy1ydW4td2Via2l0LXRlc3RzIGFkZHMgYSAtLWxvZyAndHJhY2UnIG9wdGlvbgor
ICAgICAgICB0aGF0IHByaW50cyBvdXQgZGV0YWlsZWQgaW5mbyBhYm91dCBhIGdpdmVuIHRlc3Qg
YXMgaXQgZXhlY3V0ZXMKKyAgICAgICAgKHdoZXJlIHRoZSBiYXNlbGluZXMgYXJlLCB3aGF0IHRo
ZSBleHBlY3RhdGlvbiBpcywgd2hhdCB3ZSBnb3QsCisgICAgICAgIGhvdyBsb25nIGl0IHRvb2sp
LgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzcy
NgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90
ZXN0cy5weToKKyAgICAgICAgICAtIHVzZSB0aGUgbmV3bHkgZXhwb3NlZCBUZXN0UmVzdWx0IGNs
YXNzIGFuZCBpbXBsZW1lbnQKKyAgICAgICAgICAgIC0tbG9nIHRyYWNlCisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdGhy
ZWFkLnB5OgorICAgICAgICAgIC0gcmVuYW1lIFRlc3RTdGF0cyB0byBUZXN0UmVzdWx0IGFuZCBt
YWtlIGl0IG1vcmUgcHVibGljLCByZXN1bHRpbmcKKyAgICAgICAgICAgIGluIGNsZWFuZXIgY29k
ZQorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L3Rlc3RfZXhwZWN0YXRpb25zLnB5OgorICAgICAgICAgIC0gYWRkIGV4cGVjdGF0aW9uX3RvX3N0
cmluZygpIGFzIGEgc2VwYXJhdGUgY2FsbGFibGUgZnVuY3Rpb24KKwogMjAxMC0wNC0xNSAgU2Ft
IFdlaW5pZyAgPHNhbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFuZGVycyBD
YXJsc3Nvbi4KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL2xheW91dF9wYWNrYWdlL2R1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLnB5IGIvV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9y
ZW5kZXJfdHJlZV90aHJlYWQucHkKaW5kZXggOTNiNGM3OS4uOTE0OGYyOSAxMDA2NDQKLS0tIGEv
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2Uv
ZHVtcF9yZW5kZXJfdHJlZV90aHJlYWQucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdHJlZV90aHJlYWQu
cHkKQEAgLTU0LDggKzU0LDggQEAgX2xvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJ3ZWJraXRweS5s
YXlvdXRfdGVzdHMubGF5b3V0X3BhY2thZ2UuIgogZGVmIHByb2Nlc3Nfb3V0cHV0KHBvcnQsIHRl
c3RfaW5mbywgdGVzdF90eXBlcywgdGVzdF9hcmdzLCBjb25maWd1cmF0aW9uLAogICAgICAgICAg
ICAgICAgICAgIG91dHB1dF9kaXIsIGNyYXNoLCB0aW1lb3V0LCB0ZXN0X3J1bl90aW1lLCBhY3R1
YWxfY2hlY2tzdW0sCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBlcnJvcik6Ci0gICAgIiIi
UmVjZWl2ZXMgdGhlIG91dHB1dCBmcm9tIGEgRHVtcFJlbmRlclRyZWUgcHJvY2Vzcywgc3ViamVj
dHMgaXQgdG8gYSBudW1iZXIKLSAgICBvZiB0ZXN0cywgYW5kIHJldHVybnMgYSBsaXN0IG9mIGZh
aWx1cmUgdHlwZXMgdGhlIHRlc3QgcHJvZHVjZWQuCisgICAgIiIiUmVjZWl2ZXMgdGhlIG91dHB1
dCBmcm9tIGEgRHVtcFJlbmRlclRyZWUgcHJvY2Vzcywgc3ViamVjdHMgaXQgdG8gYQorICAgIG51
bWJlciBvZiB0ZXN0cywgYW5kIHJldHVybnMgYSBsaXN0IG9mIGZhaWx1cmUgdHlwZXMgdGhlIHRl
c3QgcHJvZHVjZWQuCiAKICAgICBBcmdzOgogICAgICAgcG9ydDogcG9ydC1zcGVjaWZpYyBob29r
cwpAQCAtNjYsNyArNjYsNyBAQCBkZWYgcHJvY2Vzc19vdXRwdXQocG9ydCwgdGVzdF9pbmZvLCB0
ZXN0X3R5cGVzLCB0ZXN0X2FyZ3MsIGNvbmZpZ3VyYXRpb24sCiAgICAgICBjb25maWd1cmF0aW9u
OiBEZWJ1ZyBvciBSZWxlYXNlCiAgICAgICBvdXRwdXRfZGlyOiBkaXJlY3RvcnkgdG8gcHV0IGNy
YXNoIHN0YWNrIHRyYWNlcyBpbnRvCiAKLSAgICBSZXR1cm5zOiBhIGxpc3Qgb2YgZmFpbHVyZSBv
YmplY3RzIGFuZCB0aW1lcyBmb3IgdGhlIHRlc3QgYmVpbmcgcHJvY2Vzc2VkCisgICAgUmV0dXJu
czogYSBUZXN0UmVzdWx0IG9iamVjdAogICAgICIiIgogICAgIGZhaWx1cmVzID0gW10KIApAQCAt
MTExLDE5ICsxMTEsMjAgQEAgZGVmIHByb2Nlc3Nfb3V0cHV0KHBvcnQsIHRlc3RfaW5mbywgdGVz
dF90eXBlcywgdGVzdF9hcmdzLCBjb25maWd1cmF0aW9uLAogICAgICAgICAgICAgdGltZS50aW1l
KCkgLSBzdGFydF9kaWZmX3RpbWUpCiAKICAgICB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnMgPSB0
aW1lLnRpbWUoKSAtIHN0YXJ0X2RpZmZfdGltZQotICAgIHJldHVybiBUZXN0U3RhdHModGVzdF9p
bmZvLmZpbGVuYW1lLCBmYWlsdXJlcywgdGVzdF9ydW5fdGltZSwKLSAgICAgICAgdG90YWxfdGlt
ZV9mb3JfYWxsX2RpZmZzLCB0aW1lX2Zvcl9kaWZmcykKKyAgICByZXR1cm4gVGVzdFJlc3VsdCh0
ZXN0X2luZm8uZmlsZW5hbWUsIGZhaWx1cmVzLCB0ZXN0X3J1bl90aW1lLAorICAgICAgICAgICAg
ICAgICAgICAgIHRvdGFsX3RpbWVfZm9yX2FsbF9kaWZmcywgdGltZV9mb3JfZGlmZnMpCiAKIAot
Y2xhc3MgVGVzdFN0YXRzOgorY2xhc3MgVGVzdFJlc3VsdChvYmplY3QpOgogCiAgICAgZGVmIF9f
aW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBmYWlsdXJlcywgdGVzdF9ydW5fdGltZSwKICAgICAgICAg
ICAgICAgICAgdG90YWxfdGltZV9mb3JfYWxsX2RpZmZzLCB0aW1lX2Zvcl9kaWZmcyk6Ci0gICAg
ICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgICBzZWxmLmZhaWx1cmVzID0gZmFp
bHVyZXMKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgIHNlbGYudGVz
dF9ydW5fdGltZSA9IHRlc3RfcnVuX3RpbWUKLSAgICAgICAgc2VsZi50b3RhbF90aW1lX2Zvcl9h
bGxfZGlmZnMgPSB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnMKICAgICAgICAgc2VsZi50aW1lX2Zv
cl9kaWZmcyA9IHRpbWVfZm9yX2RpZmZzCisgICAgICAgIHNlbGYudG90YWxfdGltZV9mb3JfYWxs
X2RpZmZzID0gdG90YWxfdGltZV9mb3JfYWxsX2RpZmZzCisgICAgICAgIHNlbGYudHlwZSA9IHRl
c3RfZmFpbHVyZXMuZGV0ZXJtaW5lX3Jlc3VsdF90eXBlKGZhaWx1cmVzKQogCiAKIGNsYXNzIFNp
bmdsZVRlc3RUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CkBAIC0xNTcsMTQgKzE1OCwxNCBAQCBj
bGFzcyBTaW5nbGVUZXN0VGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgogICAgICAgICAgICAgZHJp
dmVyLnJ1bl90ZXN0KHRlc3RfaW5mby51cmkuc3RyaXAoKSwgdGVzdF9pbmZvLnRpbWVvdXQsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9pbmZvLmltYWdlX2hhc2gpCiAgICAgICAg
IGVuZCA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuX3Rlc3Rfc3RhdHMgPSBwcm9jZXNzX291
dHB1dChzZWxmLl9wb3J0LAorICAgICAgICBzZWxmLl90ZXN0X3Jlc3VsdCA9IHByb2Nlc3Nfb3V0
cHV0KHNlbGYuX3BvcnQsCiAgICAgICAgICAgICB0ZXN0X2luZm8sIHNlbGYuX3Rlc3RfdHlwZXMs
IHNlbGYuX3Rlc3RfYXJncywKICAgICAgICAgICAgIHNlbGYuX2NvbmZpZ3VyYXRpb24sIHNlbGYu
X291dHB1dF9kaXIsIGNyYXNoLCB0aW1lb3V0LCBlbmQgLSBzdGFydCwKICAgICAgICAgICAgIGFj
dHVhbF9jaGVja3N1bSwgb3V0cHV0LCBlcnJvcikKICAgICAgICAgZHJpdmVyLnN0b3AoKQogCi0g
ICAgZGVmIGdldF90ZXN0X3N0YXRzKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fdGVzdF9z
dGF0cworICAgIGRlZiBnZXRfdGVzdF9yZXN1bHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
Ll90ZXN0X3Jlc3VsdAogCiAKIGNsYXNzIFRlc3RTaGVsbFRocmVhZCh0aHJlYWRpbmcuVGhyZWFk
KToKQEAgLTIwMSw3ICsyMDIsNyBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRo
cmVhZCk6CiAgICAgICAgIHNlbGYuX2NhbmNlbGVkID0gRmFsc2UKICAgICAgICAgc2VsZi5fZXhj
ZXB0aW9uX2luZm8gPSBOb25lCiAgICAgICAgIHNlbGYuX2RpcmVjdG9yeV90aW1pbmdfc3RhdHMg
PSB7fQotICAgICAgICBzZWxmLl90ZXN0X3N0YXRzID0gW10KKyAgICAgICAgc2VsZi5fdGVzdF9y
ZXN1bHRzID0gW10KICAgICAgICAgc2VsZi5fbnVtX3Rlc3RzID0gMAogICAgICAgICBzZWxmLl9z
dGFydF90aW1lID0gMAogICAgICAgICBzZWxmLl9zdG9wX3RpbWUgPSAwCkBAIC0yMTgsMTAgKzIx
OSwxMyBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAg
IChudW1iZXIgb2YgdGVzdHMgaW4gdGhhdCBkaXJlY3RvcnksIHRpbWUgdG8gcnVuIHRoZSB0ZXN0
cykiIiIKICAgICAgICAgcmV0dXJuIHNlbGYuX2RpcmVjdG9yeV90aW1pbmdfc3RhdHMKIAotICAg
IGRlZiBnZXRfaW5kaXZpZHVhbF90ZXN0X3N0YXRzKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm5z
IGEgbGlzdCBvZiAodGVzdF9maWxlbmFtZSwgdGltZV90b19ydW5fdGVzdCwKLSAgICAgICAgdG90
YWxfdGltZV9mb3JfYWxsX2RpZmZzLCB0aW1lX2Zvcl9kaWZmcykgdHVwbGVzLiIiIgotICAgICAg
ICByZXR1cm4gc2VsZi5fdGVzdF9zdGF0cworICAgIGRlZiBnZXRfdGVzdF9yZXN1bHRzKHNlbGYp
OgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHRlc3RzIHJ1biBvbiB0aGlzIHRo
cmVhZC4KKworICAgICAgICBUaGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHBlci10aHJlYWQgc3Rh
dGlzdGljcy4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Rlc3RfcmVzdWx0
cwogCiAgICAgZGVmIGNhbmNlbChzZWxmKToKICAgICAgICAgIiIiU2V0IGEgZmxhZyB0ZWxsaW5n
IHRoaXMgdGhyZWFkIHRvIHF1aXQuIiIiCkBAIC0zMTcsMjcgKzMyMSwyOSBAQCBjbGFzcyBUZXN0
U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAgICAgICBiYXRjaF9jb3VudCAr
PSAxCiAgICAgICAgICAgICBzZWxmLl9udW1fdGVzdHMgKz0gMQogICAgICAgICAgICAgaWYgc2Vs
Zi5fb3B0aW9ucy5ydW5fc2luZ2x5OgotICAgICAgICAgICAgICAgIGZhaWx1cmVzID0gc2VsZi5f
cnVuX3Rlc3Rfc2luZ2x5KHRlc3RfaW5mbykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxm
Ll9ydW5fdGVzdF9zaW5nbHkodGVzdF9pbmZvKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAg
ICAgICAgICBmYWlsdXJlcyA9IHNlbGYuX3J1bl90ZXN0KHRlc3RfaW5mbykKKyAgICAgICAgICAg
ICAgICByZXN1bHQgPSBzZWxmLl9ydW5fdGVzdCh0ZXN0X2luZm8pCiAKICAgICAgICAgICAgIGZp
bGVuYW1lID0gdGVzdF9pbmZvLmZpbGVuYW1lCiAgICAgICAgICAgICB0ZXN0c19ydW5fZmlsZS53
cml0ZShmaWxlbmFtZSArICJcbiIpCi0gICAgICAgICAgICBpZiBmYWlsdXJlczoKLSAgICAgICAg
ICAgICAgICAjIENoZWNrIGFuZCBraWxsIER1bXBSZW5kZXJUcmVlIGlmIHdlIG5lZWQgdG9vLgot
ICAgICAgICAgICAgICAgIGlmIGxlbihbMSBmb3IgZiBpbiBmYWlsdXJlcyBpZiBmLnNob3VsZF9r
aWxsX2R1bXBfcmVuZGVyX3RyZWUoKV0pOgorICAgICAgICAgICAgaWYgcmVzdWx0LmZhaWx1cmVz
OgorICAgICAgICAgICAgICAgICMgQ2hlY2sgYW5kIGtpbGwgRHVtcFJlbmRlclRyZWUgaWYgd2Ug
bmVlZCB0by4KKyAgICAgICAgICAgICAgICBpZiBsZW4oWzEgZm9yIGYgaW4gcmVzdWx0LmZhaWx1
cmVzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBmLnNob3VsZF9raWxsX2R1bXBfcmVuZGVy
X3RyZWUoKV0pOgogICAgICAgICAgICAgICAgICAgICBzZWxmLl9raWxsX2R1bXBfcmVuZGVyX3Ry
ZWUoKQogICAgICAgICAgICAgICAgICAgICAjIFJlc2V0IHRoZSBiYXRjaCBjb3VudCBzaW5jZSB0
aGUgc2hlbGwganVzdCBib3VuY2VkLgogICAgICAgICAgICAgICAgICAgICBiYXRjaF9jb3VudCA9
IDAKICAgICAgICAgICAgICAgICAjIFByaW50IHRoZSBlcnJvciBtZXNzYWdlKHMpLgotICAgICAg
ICAgICAgICAgIGVycm9yX3N0ciA9ICdcbicuam9pbihbJyAgJyArIGYubWVzc2FnZSgpIGZvciBm
IGluIGZhaWx1cmVzXSkKKyAgICAgICAgICAgICAgICBlcnJvcl9zdHIgPSAnXG4nLmpvaW4oWycg
ICcgKyBmLm1lc3NhZ2UoKSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGYgaW4gcmVzdWx0LmZhaWx1cmVzXSkKICAgICAgICAgICAgICAgICBfbG9nLmRlYnVnKCIl
cyAlcyBmYWlsZWQ6XG4lcyIgJSAoc2VsZi5nZXROYW1lKCksCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzZWxmLl9wb3J0LnJlbGF0aXZlX3Rlc3RfZmlsZW5hbWUoZmlsZW5hbWUpLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc3RyKSkKICAgICAgICAgICAgIGVsc2U6CiAg
ICAgICAgICAgICAgICAgX2xvZy5kZWJ1ZygiJXMgJXMgcGFzc2VkIiAlIChzZWxmLmdldE5hbWUo
KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQucmVsYXRpdmVfdGVzdF9m
aWxlbmFtZShmaWxlbmFtZSkpKQotICAgICAgICAgICAgc2VsZi5fcmVzdWx0X3F1ZXVlLnB1dCgo
ZmlsZW5hbWUsIGZhaWx1cmVzKSkKKyAgICAgICAgICAgIHNlbGYuX3Jlc3VsdF9xdWV1ZS5wdXQo
cmVzdWx0KQogCiAgICAgICAgICAgICBpZiBiYXRjaF9zaXplID4gMCBhbmQgYmF0Y2hfY291bnQg
PiBiYXRjaF9zaXplOgogICAgICAgICAgICAgICAgICMgQm91bmNlIHRoZSBzaGVsbCBhbmQgcmVz
ZXQgY291bnQuCkBAIC0zNTcsOCArMzYzLDkgQEAgY2xhc3MgVGVzdFNoZWxsVGhyZWFkKHRocmVh
ZGluZy5UaHJlYWQpOgogICAgICAgICBBcmdzOgogICAgICAgICAgIHRlc3RfaW5mbzogT2JqZWN0
IGNvbnRhaW5pbmcgdGhlIHRlc3QgZmlsZW5hbWUsIHVyaSBhbmQgdGltZW91dAogCi0gICAgICAg
IFJldHVybjoKLSAgICAgICAgICBBIGxpc3Qgb2YgVGVzdEZhaWx1cmUgb2JqZWN0cyBkZXNjcmli
aW5nIHRoZSBlcnJvci4KKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBBIFRlc3RSZXN1bHQK
KwogICAgICAgICAiIiIKICAgICAgICAgd29ya2VyID0gU2luZ2xlVGVzdFRocmVhZChzZWxmLl9w
b3J0LCBzZWxmLl9pbWFnZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHNlbGYuX3NoZWxsX2FyZ3MsCkBAIC0zNzAsOSArMzc3LDkgQEAgY2xhc3MgVGVzdFNoZWxsVGhy
ZWFkKHRocmVhZGluZy5UaHJlYWQpOgogCiAgICAgICAgIHdvcmtlci5zdGFydCgpCiAKLSAgICAg
ICAgIyBXaGVuIHdlJ3JlIHJ1bm5pbmcgb25lIHRlc3QgcGVyIER1bXBSZW5kZXJUcmVlIHByb2Nl
c3MsIHdlIGNhbiBlbmZvcmNlCi0gICAgICAgICMgYSBoYXJkIHRpbWVvdXQuIHRoZSBEdW1wUmVu
ZGVyVHJlZSB3YXRjaGRvZyB1c2VzIDIuNXggdGhlIHRpbWVvdXQKLSAgICAgICAgIyBXZSB3YW50
IHRvIGJlIGxhcmdlciB0aGFuIHRoYXQuCisgICAgICAgICMgV2hlbiB3ZSdyZSBydW5uaW5nIG9u
ZSB0ZXN0IHBlciBEdW1wUmVuZGVyVHJlZSBwcm9jZXNzLCB3ZSBjYW4KKyAgICAgICAgIyBlbmZv
cmNlIGEgaGFyZCB0aW1lb3V0LiAgVGhlIER1bXBSZW5kZXJUcmVlIHdhdGNoZG9nIHVzZXMgMi41
eAorICAgICAgICAjIHRoZSB0aW1lb3V0OyB3ZSB3YW50IHRvIGJlIGxhcmdlciB0aGFuIHRoYXQu
CiAgICAgICAgIHdvcmtlci5qb2luKGludCh0ZXN0X2luZm8udGltZW91dCkgKiAzLjAgLyAxMDAw
LjApCiAgICAgICAgIGlmIHdvcmtlci5pc0FsaXZlKCk6CiAgICAgICAgICAgICAjIElmIGpvaW4o
KSByZXR1cm5lZCB3aXRoIHRoZSB0aHJlYWQgc3RpbGwgcnVubmluZywgdGhlCkBAIC0zODAsMjIg
KzM4NywyMyBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAg
ICAgICAgICAjIG1vcmUgd2UgY2FuIGRvIHdpdGggaXQuICBXZSBoYXZlIHRvIGtpbGwgYWxsIHRo
ZQogICAgICAgICAgICAgIyBEdW1wUmVuZGVyVHJlZXMgdG8gZnJlZSBpdCB1cC4gSWYgd2UncmUg
cnVubmluZyBtb3JlIHRoYW4KICAgICAgICAgICAgICMgb25lIER1bXBSZW5kZXJUcmVlIHRocmVh
ZCwgd2UnbGwgZW5kIHVwIGtpbGxpbmcgdGhlIG90aGVyCi0gICAgICAgICAgICAjIER1bXBSZW5k
ZXJUcmVlcyB0b28sIGludHJvZHVjaW5nIHNwdXJpb3VzIGNyYXNoZXMuIFdlIGFjY2VwdCB0aGF0
Ci0gICAgICAgICAgICAjIHRyYWRlb2ZmIGluIG9yZGVyIHRvIGF2b2lkIGxvc2luZyB0aGUgcmVz
dCBvZiB0aGlzIHRocmVhZCdzCi0gICAgICAgICAgICAjIHJlc3VsdHMuCisgICAgICAgICAgICAj
IER1bXBSZW5kZXJUcmVlcyB0b28sIGludHJvZHVjaW5nIHNwdXJpb3VzIGNyYXNoZXMuIFdlIGFj
Y2VwdAorICAgICAgICAgICAgIyB0aGF0IHRyYWRlb2ZmIGluIG9yZGVyIHRvIGF2b2lkIGxvc2lu
ZyB0aGUgcmVzdCBvZiB0aGlzCisgICAgICAgICAgICAjIHRocmVhZCdzIHJlc3VsdHMuCiAgICAg
ICAgICAgICBfbG9nLmVycm9yKCdUZXN0IHRocmVhZCBodW5nOiBraWxsaW5nIGFsbCBEdW1wUmVu
ZGVyVHJlZXMnKQogICAgICAgICAgICAgd29ya2VyLl9kcml2ZXIuc3RvcCgpCiAKICAgICAgICAg
dHJ5OgotICAgICAgICAgICAgc3RhdHMgPSB3b3JrZXIuZ2V0X3Rlc3Rfc3RhdHMoKQotICAgICAg
ICAgICAgc2VsZi5fdGVzdF9zdGF0cy5hcHBlbmQoc3RhdHMpCi0gICAgICAgICAgICBmYWlsdXJl
cyA9IHN0YXRzLmZhaWx1cmVzCisgICAgICAgICAgICByZXN1bHQgPSB3b3JrZXIuZ2V0X3Rlc3Rf
cmVzdWx0KCkKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBlOgogICAgICAgICAgICAg
ZmFpbHVyZXMgPSBbXQogICAgICAgICAgICAgX2xvZy5lcnJvcignQ2Fubm90IGdldCByZXN1bHRz
IG9mIHRlc3Q6ICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfaW5mby5maWxlbmFt
ZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IFRlc3RSZXN1bHQodGVzdF9pbmZvLmZpbGVuYW1lLCBm
YWlsdXJlcz1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9ydW5fdGlt
ZT0wLCB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnM9MCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGltZV9mb3JfZGlmZnM9MCkKIAotICAgICAgICByZXR1cm4gZmFpbHVyZXMKKyAg
ICAgICAgcmV0dXJuIHJlc3VsdAogCiAgICAgZGVmIF9ydW5fdGVzdChzZWxmLCB0ZXN0X2luZm8p
OgogICAgICAgICAiIiJSdW4gYSBzaW5nbGUgdGVzdCBmaWxlIHVzaW5nIGEgc2hhcmVkIER1bXBS
ZW5kZXJUcmVlIHByb2Nlc3MuCkBAIC00MDMsOCArNDExLDkgQEAgY2xhc3MgVGVzdFNoZWxsVGhy
ZWFkKHRocmVhZGluZy5UaHJlYWQpOgogICAgICAgICBBcmdzOgogICAgICAgICAgIHRlc3RfaW5m
bzogT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRlc3QgZmlsZW5hbWUsIHVyaSBhbmQgdGltZW91dAog
Ci0gICAgICAgIFJldHVybjoKKyAgICAgICAgUmV0dXJuczoKICAgICAgICAgICBBIGxpc3Qgb2Yg
VGVzdEZhaWx1cmUgb2JqZWN0cyBkZXNjcmliaW5nIHRoZSBlcnJvci4KKwogICAgICAgICAiIiIK
ICAgICAgICAgc2VsZi5fZW5zdXJlX2R1bXBfcmVuZGVyX3RyZWVfaXNfcnVubmluZygpCiAgICAg
ICAgICMgVGhlIHBpeGVsX2hhc2ggaXMgdXNlZCB0byBhdm9pZCBkb2luZyBhbiBpbWFnZSBkdW1w
IGlmIHRoZQpAQCAtNDE5LDE5ICs0MjgsMjAgQEAgY2xhc3MgVGVzdFNoZWxsVGhyZWFkKHRocmVh
ZGluZy5UaHJlYWQpOgogICAgICAgICAgICBzZWxmLl9kcml2ZXIucnVuX3Rlc3QodGVzdF9pbmZv
LnVyaSwgdGVzdF9pbmZvLnRpbWVvdXQsIGltYWdlX2hhc2gpCiAgICAgICAgIGVuZCA9IHRpbWUu
dGltZSgpCiAKLSAgICAgICAgc3RhdHMgPSBwcm9jZXNzX291dHB1dChzZWxmLl9wb3J0LCB0ZXN0
X2luZm8sIHNlbGYuX3Rlc3RfdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c2VsZi5fdGVzdF9hcmdzLCBzZWxmLl9vcHRpb25zLmNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucy5yZXN1bHRzX2RpcmVjdG9yeSwgY3Jh
c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCwgZW5kIC0gc3RhcnQs
IGFjdHVhbF9jaGVja3N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQs
IGVycm9yKQotCi0gICAgICAgIHNlbGYuX3Rlc3Rfc3RhdHMuYXBwZW5kKHN0YXRzKQotICAgICAg
ICByZXR1cm4gc3RhdHMuZmFpbHVyZXMKKyAgICAgICAgcmVzdWx0ID0gcHJvY2Vzc19vdXRwdXQo
c2VsZi5fcG9ydCwgdGVzdF9pbmZvLCBzZWxmLl90ZXN0X3R5cGVzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzZWxmLl90ZXN0X2FyZ3MsIHNlbGYuX29wdGlvbnMuY29uZmlndXJh
dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucy5yZXN1
bHRzX2RpcmVjdG9yeSwgY3Jhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRp
bWVvdXQsIGVuZCAtIHN0YXJ0LCBhY3R1YWxfY2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG91dHB1dCwgZXJyb3IpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVzdWx0cy5h
cHBlbmQocmVzdWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0CiAKICAgICBkZWYgX2Vuc3VyZV9k
dW1wX3JlbmRlcl90cmVlX2lzX3J1bm5pbmcoc2VsZik6Ci0gICAgICAgICIiIlN0YXJ0IHRoZSBz
aGFyZWQgRHVtcFJlbmRlclRyZWUsIGlmIGl0J3Mgbm90IHJ1bm5pbmcuICBOb3QgZm9yIHVzZSB3
aGVuCi0gICAgICAgIHJ1bm5pbmcgdGVzdHMgc2luZ2x5LCBzaW5jZSB0aG9zZSBlYWNoIHN0YXJ0
IGEgc2VwYXJhdGUgRHVtcFJlbmRlclRyZWUgaW4KLSAgICAgICAgdGhlaXIgb3duIHRocmVhZC4K
KyAgICAgICAgIiIiU3RhcnQgdGhlIHNoYXJlZCBEdW1wUmVuZGVyVHJlZSwgaWYgaXQncyBub3Qg
cnVubmluZy4KKworICAgICAgICBUaGlzIGlzIG5vdCBmb3IgdXNlIHdoZW4gcnVubmluZyB0ZXN0
cyBzaW5nbHksIHNpbmNlIHRob3NlIGVhY2ggc3RhcnQKKyAgICAgICAgYSBzZXBhcmF0ZSBEdW1w
UmVuZGVyVHJlZSBpbiB0aGVpciBvd24gdGhyZWFkLgorCiAgICAgICAgICIiIgogICAgICAgICBp
ZiAobm90IHNlbGYuX2RyaXZlciBvciBzZWxmLl9kcml2ZXIucG9sbCgpIGlzIG5vdCBOb25lKToK
ICAgICAgICAgICAgIHNlbGYuX2RyaXZlciA9IHNlbGYuX3BvcnQuc3RhcnRfZHJpdmVyKApkaWZm
IC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0
X3BhY2thZ2UvdGVzdF9leHBlY3RhdGlvbnMucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90ZXN0X2V4cGVjdGF0aW9ucy5weQppbmRl
eCAzOTdlYzZlLi4zODIyM2RkIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS90ZXN0X2V4cGVjdGF0aW9ucy5weQorKysg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2Fn
ZS90ZXN0X2V4cGVjdGF0aW9ucy5weQpAQCAtNDgsNiArNDgsNyBAQCBfbG9nID0gbG9nZ2luZy5n
ZXRMb2dnZXIoIndlYmtpdHB5LmxheW91dF90ZXN0cy5sYXlvdXRfcGFja2FnZS4iCiAjIFRlc3Qg
ZXhwZWN0YXRpb24gZmlsZSB1cGRhdGUgYWN0aW9uIGNvbnN0YW50cwogKE5PX0NIQU5HRSwgUkVN
T1ZFX1RFU1QsIFJFTU9WRV9QTEFURk9STSwgQUREX1BMQVRGT1JNU19FWENFUFRfVEhJUykgPSBy
YW5nZSg0KQogCisKIGRlZiByZXN1bHRfd2FzX2V4cGVjdGVkKHJlc3VsdCwgZXhwZWN0ZWRfcmVz
dWx0cywgdGVzdF9uZWVkc19yZWJhc2VsaW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICB0
ZXN0X2lzX3NraXBwZWQpOgogICAgICIiIlJldHVybnMgd2hldGhlciB3ZSBnb3QgYSByZXN1bHQg
d2Ugd2VyZSBleHBlY3RpbmcuCkBAIC02MSwxMSArNjIsMTIgQEAgZGVmIHJlc3VsdF93YXNfZXhw
ZWN0ZWQocmVzdWx0LCBleHBlY3RlZF9yZXN1bHRzLCB0ZXN0X25lZWRzX3JlYmFzZWxpbmluZywK
ICAgICBpZiByZXN1bHQgaW4gKElNQUdFLCBURVhULCBJTUFHRV9QTFVTX1RFWFQpIGFuZCBGQUlM
IGluIGV4cGVjdGVkX3Jlc3VsdHM6CiAgICAgICAgIHJldHVybiBUcnVlCiAgICAgaWYgcmVzdWx0
ID09IE1JU1NJTkcgYW5kIHRlc3RfbmVlZHNfcmViYXNlbGluaW5nOgotICAgICAgIHJldHVybiBU
cnVlCisgICAgICAgIHJldHVybiBUcnVlCiAgICAgaWYgcmVzdWx0ID09IFNLSVAgYW5kIHRlc3Rf
aXNfc2tpcHBlZDoKLSAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gVHJ1ZQogICAg
IHJldHVybiBGYWxzZQogCisKIGRlZiByZW1vdmVfcGl4ZWxfZmFpbHVyZXMoZXhwZWN0ZWRfcmVz
dWx0cyk6CiAgICAgIiIiUmV0dXJucyBhIGNvcHkgb2YgdGhlIGV4cGVjdGVkIHJlc3VsdHMgZm9y
IGEgdGVzdCwgZXhjZXB0IHRoYXQgd2UKICAgICBkcm9wIGFueSBwaXhlbCBmYWlsdXJlcyBhbmQg
cmV0dXJuIHRoZSByZW1haW5pbmcgZXhwZWN0YXRpb25zLiBGb3IgZXhhbXBsZSwKQEAgLTE0MSwx
MiArMTQzLDE2IEBAIGNsYXNzIFRlc3RFeHBlY3RhdGlvbnM6CiAgICAgICAgIHJldHZhbCA9IFtd
CiAKICAgICAgICAgZm9yIGV4cGVjdGF0aW9uIGluIGV4cGVjdGF0aW9uczoKLSAgICAgICAgICAg
IGZvciBpdGVtIGluIFRlc3RFeHBlY3RhdGlvbnNGaWxlLkVYUEVDVEFUSU9OUy5pdGVtcygpOgot
ICAgICAgICAgICAgICAgIGlmIGl0ZW1bMV0gPT0gZXhwZWN0YXRpb246Ci0gICAgICAgICAgICAg
ICAgICAgIHJldHZhbC5hcHBlbmQoaXRlbVswXSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsK
KyAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoc2VsZi5leHBlY3RhdGlvbl90b19zdHJpbmcoZXhw
ZWN0YXRpb24pKQorCisgICAgICAgIHJldHVybiAiICIuam9pbihyZXR2YWwpCiAKLSAgICAgICAg
cmV0dXJuICIgIi5qb2luKHJldHZhbCkudXBwZXIoKQorICAgIGRlZiBleHBlY3RhdGlvbl90b19z
dHJpbmcoc2VsZiwgZXhwZWN0YXRpb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHVwcGVyY2Fz
ZWQgc3RyaW5nIGVxdWl2YWxlbnQgb2YgYSBnaXZlbiBleHBlY3RhdGlvbi4iIiIKKyAgICAgICAg
Zm9yIGl0ZW0gaW4gVGVzdEV4cGVjdGF0aW9uc0ZpbGUuRVhQRUNUQVRJT05TLml0ZW1zKCk6Cisg
ICAgICAgICAgICBpZiBpdGVtWzFdID09IGV4cGVjdGF0aW9uOgorICAgICAgICAgICAgICAgIHJl
dHVybiBpdGVtWzBdLnVwcGVyKCkKKyAgICAgICAgcmV0dXJuICIiCiAKICAgICBkZWYgZ2V0X3Rp
bWVsaW5lX2Zvcl90ZXN0KHNlbGYsIHRlc3QpOgogICAgICAgICByZXR1cm4gc2VsZi5fZXhwZWN0
ZWRfZmFpbHVyZXMuZ2V0X3RpbWVsaW5lX2Zvcl90ZXN0KHRlc3QpCkBAIC04MzQsNyArODQwLDgg
QEAgY2xhc3MgVGVzdEV4cGVjdGF0aW9uc0ZpbGU6CiAgICAgICAgICAgICBpZiB0ZXN0IGluIHNl
dF9vZl90ZXN0czoKICAgICAgICAgICAgICAgICBzZXRfb2ZfdGVzdHMucmVtb3ZlKHRlc3QpCiAK
LSAgICBkZWYgX2FscmVhZHlfc2Vlbl90ZXN0KHNlbGYsIHRlc3QsIHRlc3RfbGlzdF9wYXRoLCBs
aW5lbm8sIGFsbG93X292ZXJyaWRlcyk6CisgICAgZGVmIF9hbHJlYWR5X3NlZW5fdGVzdChzZWxm
LCB0ZXN0LCB0ZXN0X2xpc3RfcGF0aCwgbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYWxsb3dfb3ZlcnJpZGVzKToKICAgICAgICAgIiIiUmV0dXJucyB0cnVlIGlmIHdlJ3ZlIGFs
cmVhZHkgc2VlbiBhIG1vcmUgcHJlY2lzZSBwYXRoIGZvciB0aGlzIHRlc3QKICAgICAgICAgdGhh
biB0aGUgdGVzdF9saXN0X3BhdGguCiAgICAgICAgICIiIgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0cy5weSBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHMu
cHkKaW5kZXggMDU5ZmQwOS4uZGVkNTQ1OCAxMDA3NTUKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90ZXN0cy5weQorKysgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzLnB5CkBA
IC04MSw4ICs4MSwyMCBAQCBfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoIndlYmtpdHB5LmxheW91
dF90ZXN0cy5ydW5fd2Via2l0X3Rlc3RzIikKICMgZGlyZWN0b3J5LWJ5LWRpcmVjdG9yeSBmZWVk
YmFjaykuCiBMT0dfREVUQUlMRURfUFJPR1JFU1MgPSAnZGV0YWlsZWQtcHJvZ3Jlc3MnCiAKK0xP
R19TVU1NQVJZID0gJ3N1bW1hcnknCisKKyMgIlRyYWNlIiB0aGUgdGVzdCAtIGxvZyB0aGUgZXhw
ZWN0ZWQgcmVzdWx0LCB0aGUgYWN0dWFsIHJlc3VsdCwgYW5kIHRoZQorIyBiYXNlbGluZXMgdXNl
ZAorTE9HX1RSQUNFID0gJ3RyYWNlJworCiAjIExvZyBhbnkgdW5leHBlY3RlZCByZXN1bHRzIHdo
aWxlIHJ1bm5pbmcgKGluc3RlYWQgb2YganVzdCBhdCB0aGUgZW5kKS4KIExPR19VTkVYUEVDVEVE
ID0gJ3VuZXhwZWN0ZWQnCitMT0dfVU5FWFBFQ1RFRF9SRVNVTFRTID0gJ3VuZXhwZWN0ZWQtcmVz
dWx0cycKKworTE9HX1ZBTFVFUyA9ICIsIi5qb2luKCgiYWN0dWFsIiwgImNvbmZpZyIsIExPR19E
RVRBSUxFRF9QUk9HUkVTUywgImV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTE9H
X1NVTU1BUlksICJ0aW1pbmciLCBMT0dfVFJBQ0UsIExPR19VTkVYUEVDVEVELAorICAgICAgICAg
ICAgICAgICAgICAgICBMT0dfVU5FWFBFQ1RFRF9SRVNVTFRTKSkKK0xPR19ERUZBVUxUX1ZBTFVF
ID0gImRldGFpbGVkLXByb2dyZXNzLHVuZXhwZWN0ZWQiCiAKICMgQnVpbGRlciBiYXNlIFVSTCB3
aGVyZSB3ZSBoYXZlIHRoZSBhcmNoaXZlZCB0ZXN0IHJlc3VsdHMuCiBCVUlMREVSX0JBU0VfVVJM
ID0gImh0dHA6Ly9idWlsZC5jaHJvbWl1bS5vcmcvYnVpbGRib3QvbGF5b3V0X3Rlc3RfcmVzdWx0
cy8iCkBAIC0xMzUsMjUgKzE0NywyMyBAQCBjbGFzcyBSZXN1bHRTdW1tYXJ5KG9iamVjdCk6CiAg
ICAgICAgICAgICBzZWxmLnRlc3RzX2J5X3RpbWVsaW5lW3RpbWVsaW5lXSA9ICgKICAgICAgICAg
ICAgICAgICBleHBlY3RhdGlvbnMuZ2V0X3Rlc3RzX3dpdGhfdGltZWxpbmUodGltZWxpbmUpKQog
Ci0gICAgZGVmIGFkZChzZWxmLCB0ZXN0LCBmYWlsdXJlcywgcmVzdWx0LCBleHBlY3RlZCk6Ci0g
ICAgICAgICIiIkFkZCBhIHJlc3VsdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBiaW4uCisgICAgZGVm
IGFkZChzZWxmLCByZXN1bHQsIGV4cGVjdGVkKToKKyAgICAgICAgIiIiQWRkIGEgVGVzdFJlc3Vs
dCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBiaW4uCiAKICAgICAgICAgQXJnczoKLSAgICAgICAgICB0
ZXN0OiB0ZXN0IGZpbGUgbmFtZQotICAgICAgICAgIGZhaWx1cmVzOiBsaXN0IG9mIGZhaWx1cmUg
b2JqZWN0cyBmcm9tIHRlc3QgZXhlY3V0aW9uCi0gICAgICAgICAgcmVzdWx0OiByZXN1bHQgb2Yg
dGVzdCAoUEFTUywgSU1BR0UsIGV0Yy4pLgorICAgICAgICAgIHJlc3VsdDogVGVzdFJlc3VsdCBm
cm9tIGR1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLgogICAgICAgICAgIGV4cGVjdGVkOiB3aGV0aGVy
IHRoZSByZXN1bHQgd2FzIHdoYXQgd2UgZXhwZWN0ZWQgaXQgdG8gYmUuCiAgICAgICAgICIiIgog
Ci0gICAgICAgIHNlbGYudGVzdHNfYnlfZXhwZWN0YXRpb25bcmVzdWx0XS5hZGQodGVzdCkKLSAg
ICAgICAgc2VsZi5yZXN1bHRzW3Rlc3RdID0gcmVzdWx0CisgICAgICAgIHNlbGYudGVzdHNfYnlf
ZXhwZWN0YXRpb25bcmVzdWx0LnR5cGVdLmFkZChyZXN1bHQuZmlsZW5hbWUpCisgICAgICAgIHNl
bGYucmVzdWx0c1tyZXN1bHQuZmlsZW5hbWVdID0gcmVzdWx0LnR5cGUKICAgICAgICAgc2VsZi5y
ZW1haW5pbmcgLT0gMQotICAgICAgICBpZiBsZW4oZmFpbHVyZXMpOgotICAgICAgICAgICAgc2Vs
Zi5mYWlsdXJlc1t0ZXN0XSA9IGZhaWx1cmVzCisgICAgICAgIGlmIGxlbihyZXN1bHQuZmFpbHVy
ZXMpOgorICAgICAgICAgICAgc2VsZi5mYWlsdXJlc1tyZXN1bHQuZmlsZW5hbWVdID0gcmVzdWx0
LmZhaWx1cmVzCiAgICAgICAgIGlmIGV4cGVjdGVkOgogICAgICAgICAgICAgc2VsZi5leHBlY3Rl
ZCArPSAxCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnVuZXhwZWN0ZWRfcmVzdWx0
c1t0ZXN0XSA9IHJlc3VsdAorICAgICAgICAgICAgc2VsZi51bmV4cGVjdGVkX3Jlc3VsdHNbcmVz
dWx0LmZpbGVuYW1lXSA9IHJlc3VsdC50eXBlCiAgICAgICAgICAgICBzZWxmLnVuZXhwZWN0ZWQg
Kz0gMQogCiAKQEAgLTM3NCw4ICszODQsMTEgQEAgY2xhc3MgVGVzdFJ1bm5lcjoKICAgICAgICAg
ICAgICMgc3VidHJhY3RlZCBvdXQgb2Ygc2VsZi5fdGVzdF9maWxlcywgYWJvdmUpLCBidXQgd2Ug
c3R1YiBvdXQgdGhlCiAgICAgICAgICAgICAjIHJlc3VsdHMgaGVyZSBzbyB0aGUgc3RhdGlzdGlj
cyBjYW4gcmVtYWluIGFjY3VyYXRlLgogICAgICAgICAgICAgZm9yIHRlc3QgaW4gc2tpcF9jaHVu
azoKLSAgICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeS5hZGQodGVzdCwgW10sIHRlc3RfZXhw
ZWN0YXRpb25zLlNLSVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVj
dGVkPVRydWUpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZHVtcF9yZW5kZXJfdHJlZV90aHJl
YWQuVGVzdFJlc3VsdCh0ZXN0LAorICAgICAgICAgICAgICAgICAgICBmYWlsdXJlcz1bXSwgdGVz
dF9ydW5fdGltZT0wLCB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnM9MCwKKyAgICAgICAgICAgICAg
ICAgICAgdGltZV9mb3JfZGlmZnM9MCkKKyAgICAgICAgICAgICAgICByZXN1bHQudHlwZSA9IHRl
c3RfZXhwZWN0YXRpb25zLlNLSVAKKyAgICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeS5hZGQo
cmVzdWx0LCBleHBlY3RlZD1UcnVlKQogICAgICAgICB3cml0ZSgiIikKIAogICAgICAgICByZXR1
cm4gcmVzdWx0X3N1bW1hcnkKQEAgLTU4Miw3ICs1OTUsNyBAQCBjbGFzcyBUZXN0UnVubmVyOgog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvdGFsX3RpbWUnOiB0aHJl
YWQuZ2V0X3RvdGFsX3RpbWUoKX0pCiAgICAgICAgICAgICAgICAgdGVzdF90aW1pbmdzLnVwZGF0
ZSh0aHJlYWQuZ2V0X2RpcmVjdG9yeV90aW1pbmdfc3RhdHMoKSkKICAgICAgICAgICAgICAgICBp
bmRpdmlkdWFsX3Rlc3RfdGltaW5ncy5leHRlbmQoCi0gICAgICAgICAgICAgICAgICAgIHRocmVh
ZC5nZXRfaW5kaXZpZHVhbF90ZXN0X3N0YXRzKCkpCisgICAgICAgICAgICAgICAgICAgIHRocmVh
ZC5nZXRfdGVzdF9yZXN1bHRzKCkpCiAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoK
ICAgICAgICAgICAgIGZvciB0aHJlYWQgaW4gdGhyZWFkczoKICAgICAgICAgICAgICAgICB0aHJl
YWQuY2FuY2VsKCkKQEAgLTY5NiwyNiArNzA5LDU4IEBAIGNsYXNzIFRlc3RSdW5uZXI6CiAgICAg
ICAgIHJldHVybiB1bmV4cGVjdGVkX3Jlc3VsdHNbJ251bV9yZWdyZXNzaW9ucyddCiAKICAgICBk
ZWYgdXBkYXRlX3N1bW1hcnkoc2VsZiwgcmVzdWx0X3N1bW1hcnkpOgotICAgICAgICAiIiJVcGRh
dGUgdGhlIHN1bW1hcnkgd2hpbGUgcnVubmluZyB0ZXN0cy4iIiIKKyAgICAgICAgIiIiVXBkYXRl
IHRoZSBzdW1tYXJ5IGFuZCBwcmludCByZXN1bHRzIHdpdGggYW55IGNvbXBsZXRlZCB0ZXN0cy4i
IiIKICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAg
ICAodGVzdCwgZmFpbF9saXN0KSA9IHNlbGYuX3Jlc3VsdF9xdWV1ZS5nZXRfbm93YWl0KCkKLSAg
ICAgICAgICAgICAgICByZXN1bHQgPSB0ZXN0X2ZhaWx1cmVzLmRldGVybWluZV9yZXN1bHRfdHlw
ZShmYWlsX2xpc3QpCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLl9leHBlY3RhdGlv
bnMubWF0Y2hlc19hbl9leHBlY3RlZF9yZXN1bHQodGVzdCwKLSAgICAgICAgICAgICAgICAgICAg
cmVzdWx0LCBzZWxmLl9vcHRpb25zLnBpeGVsX3Rlc3RzKQotICAgICAgICAgICAgICAgIHJlc3Vs
dF9zdW1tYXJ5LmFkZCh0ZXN0LCBmYWlsX2xpc3QsIHJlc3VsdCwgZXhwZWN0ZWQpCi0gICAgICAg
ICAgICAgICAgaWYgKExPR19ERVRBSUxFRF9QUk9HUkVTUyBpbiBzZWxmLl9vcHRpb25zLmxvZyBh
bmQKLSAgICAgICAgICAgICAgICAgICAgKHNlbGYuX29wdGlvbnMuZXhwZXJpbWVudGFsX2Z1bGx5
X3BhcmFsbGVsIG9yCi0gICAgICAgICAgICAgICAgICAgICBzZWxmLl9pc19zaW5nbGVfdGhyZWFk
ZWQoKSkpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLl9kaXNwbGF5X2RldGFpbGVkX3Byb2dy
ZXNzKHJlc3VsdF9zdW1tYXJ5KQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAg
ICAgICAgIGlmIG5vdCBleHBlY3RlZCBhbmQgTE9HX1VORVhQRUNURUQgaW4gc2VsZi5fb3B0aW9u
cy5sb2c6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX3Rl
c3RfcmVzdWx0KHRlc3QsIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGlzcGxh
eV9vbmVfbGluZV9wcm9ncmVzcyhyZXN1bHRfc3VtbWFyeSkKKyAgICAgICAgICAgICAgICByZXN1
bHQgPSBzZWxmLl9yZXN1bHRfcXVldWUuZ2V0X25vd2FpdCgpCiAgICAgICAgICAgICBleGNlcHQg
UXVldWUuRW1wdHk6CiAgICAgICAgICAgICAgICAgcmV0dXJuCi0KLSAgICBkZWYgX2Rpc3BsYXlf
b25lX2xpbmVfcHJvZ3Jlc3Moc2VsZiwgcmVzdWx0X3N1bW1hcnkpOgorICAgICAgICAgICAgZXhw
ZWN0ZWQgPSBzZWxmLl9leHBlY3RhdGlvbnMubWF0Y2hlc19hbl9leHBlY3RlZF9yZXN1bHQoCisg
ICAgICAgICAgICAgICAgcmVzdWx0LmZpbGVuYW1lLCByZXN1bHQudHlwZSwgc2VsZi5fb3B0aW9u
cy5waXhlbF90ZXN0cykKKyAgICAgICAgICAgIHJlc3VsdF9zdW1tYXJ5LmFkZChyZXN1bHQsIGV4
cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9yZXN1bHRzKHJlc3VsdCwgZXhw
ZWN0ZWQsIHJlc3VsdF9zdW1tYXJ5KQorCisgICAgZGVmIF9wcmludF90ZXN0X3Jlc3VsdHMoc2Vs
ZiwgcmVzdWx0LCBleHBlY3RlZCwgcmVzdWx0X3N1bW1hcnkpOgorICAgICAgICAiUHJpbnQgdGhl
IHJlc3VsdCBvZiB0aGUgdGVzdCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSAtLWxvZyBzd2l0Y2hlcy4i
CisgICAgICAgIGlmIExPR19UUkFDRSBpbiBzZWxmLl9vcHRpb25zLmxvZzoKKyAgICAgICAgICAg
IHNlbGYuX3ByaW50X3Rlc3RfdHJhY2UocmVzdWx0KQorICAgICAgICBlbGlmIChMT0dfREVUQUlM
RURfUFJPR1JFU1MgaW4gc2VsZi5fb3B0aW9ucy5sb2cgYW5kCisgICAgICAgICAgICAgIChzZWxm
Ll9vcHRpb25zLmV4cGVyaW1lbnRhbF9mdWxseV9wYXJhbGxlbCBvcgorICAgICAgICAgICAgICAg
c2VsZi5faXNfc2luZ2xlX3RocmVhZGVkKCkpKToKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2Rl
dGFpbGVkX3Byb2dyZXNzKHJlc3VsdF9zdW1tYXJ5KQorICAgICAgICBlbHNlOgorICAgICAgICAg
ICAgaWYgKG5vdCBleHBlY3RlZCBhbmQgTE9HX1VORVhQRUNURUQgaW4gc2VsZi5fb3B0aW9ucy5s
b2cpOgorICAgICAgICAgICAgICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfdGVzdF9yZXN1bHQo
cmVzdWx0KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfb25lX2xpbmVfcHJvZ3Jlc3MocmVzdWx0
X3N1bW1hcnkpCisKKyAgICBkZWYgX3ByaW50X3Rlc3RfdHJhY2Uoc2VsZiwgcmVzdWx0KToKKyAg
ICAgICAgIiIiUHJpbnQgZGV0YWlsZWQgcmVzdWx0cyBvZiBhIHRlc3QgKHRyaWdnZXJlZCBieSAt
LWxvZyB0cmFjZSkuCisgICAgICAgIEZvciBlYWNoIHRlc3QsIHByaW50OgorICAgICAgICAgICAt
IGxvY2F0aW9uIG9mIHRoZSBleHBlY3RlZCBiYXNlbGluZXMKKyAgICAgICAgICAgLSBleHBlY3Rl
ZCByZXN1bHRzCisgICAgICAgICAgIC0gYWN0dWFsIHJlc3VsdAorICAgICAgICAgICAtIHRpbWlu
ZyBpbmZvCisgICAgICAgICIiIgorICAgICAgICBmaWxlbmFtZSA9IHJlc3VsdC5maWxlbmFtZQor
ICAgICAgICB0ZXN0X25hbWUgPSBzZWxmLl9wb3J0LnJlbGF0aXZlX3Rlc3RfZmlsZW5hbWUoZmls
ZW5hbWUpCisgICAgICAgIF9sb2cuaW5mbygndHJhY2U6ICVzJyAlIHRlc3RfbmFtZSkKKyAgICAg
ICAgX2xvZy5pbmZvKCcgIHR4dDogJXMnICUKKyAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQu
cmVsYXRpdmVfdGVzdF9maWxlbmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcG9y
dC5leHBlY3RlZF9maWxlbmFtZShmaWxlbmFtZSwgJy50eHQnKSkpCisgICAgICAgIHBuZ19maWxl
ID0gc2VsZi5fcG9ydC5leHBlY3RlZF9maWxlbmFtZShmaWxlbmFtZSwgJy5wbmcnKQorICAgICAg
ICBpZiBvcy5wYXRoLmV4aXN0cyhwbmdfZmlsZSk6CisgICAgICAgICAgICBfbG9nLmluZm8oJyAg
cG5nOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQucmVsYXRpdmVfdGVz
dF9maWxlbmFtZShmaWxlbmFtZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfbG9nLmlu
Zm8oJyAgcG5nOiA8bm9uZT4nKQorICAgICAgICBfbG9nLmluZm8oJyAgZXhwOiAlcycgJQorICAg
ICAgICAgICAgICAgICAgc2VsZi5fZXhwZWN0YXRpb25zLmdldF9leHBlY3RhdGlvbnNfc3RyaW5n
KGZpbGVuYW1lKSkKKyAgICAgICAgX2xvZy5pbmZvKCcgIGdvdDogJXMnICUKKyAgICAgICAgICAg
ICAgICAgIHNlbGYuX2V4cGVjdGF0aW9ucy5leHBlY3RhdGlvbl90b19zdHJpbmcocmVzdWx0LnR5
cGUpKQorICAgICAgICBfbG9nLmluZm8oJyB0b29rOiAlLS4zZicgJSByZXN1bHQudGVzdF9ydW5f
dGltZSkKKyAgICAgICAgX2xvZy5pbmZvKCcnKQorCisgICAgZGVmIF9wcmludF9vbmVfbGluZV9w
cm9ncmVzcyhzZWxmLCByZXN1bHRfc3VtbWFyeSk6CiAgICAgICAgICIiIkRpc3BsYXlzIHRoZSBw
cm9ncmVzcyB0aHJvdWdoIHRoZSB0ZXN0IHJ1bi4iIiIKICAgICAgICAgcGVyY2VudF9jb21wbGV0
ZSA9IDEwMCAqIChyZXN1bHRfc3VtbWFyeS5leHBlY3RlZCArCiAgICAgICAgICAgICByZXN1bHRf
c3VtbWFyeS51bmV4cGVjdGVkKSAvIHJlc3VsdF9zdW1tYXJ5LnRvdGFsCkBAIC03MjMsNyArNzY4
LDcgQEAgY2xhc3MgVGVzdFJ1bm5lcjoKICAgICAgICAgICAgICIgJWQgbGVmdCIgJSAocGVyY2Vu
dF9jb21wbGV0ZSwgcmVzdWx0X3N1bW1hcnkuZXhwZWN0ZWQsCiAgICAgICAgICAgICAgcmVzdWx0
X3N1bW1hcnkudW5leHBlY3RlZCwgcmVzdWx0X3N1bW1hcnkucmVtYWluaW5nKSkKIAotICAgIGRl
ZiBfZGlzcGxheV9kZXRhaWxlZF9wcm9ncmVzcyhzZWxmLCByZXN1bHRfc3VtbWFyeSk6CisgICAg
ZGVmIF9wcmludF9kZXRhaWxlZF9wcm9ncmVzcyhzZWxmLCByZXN1bHRfc3VtbWFyeSk6CiAgICAg
ICAgICIiIkRpc3BsYXkgZGV0YWlsZWQgcHJvZ3Jlc3Mgb3V0cHV0IHdoZXJlIHdlIHByaW50IHRo
ZSBkaXJlY3RvcnkgbmFtZQogICAgICAgICBhbmQgb25lIGRvdCBmb3IgZWFjaCBjb21wbGV0ZWQg
dGVzdC4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkKICAgICAgICAgIi0tbG9nIGRldGFpbGVkLXByb2dy
ZXNzIi4iIiIKQEAgLTc2Nyw2ICs4MTIsMTMgQEAgY2xhc3MgVGVzdFJ1bm5lcjoKICAgICAgICAg
ZWxzZToKICAgICAgICAgICAgIHNlbGYuX21ldGVyLndyaXRlKCIlc1xuIiAlIChzZWxmLl9jdXJy
ZW50X3Byb2dyZXNzX3N0cikpCiAKKyAgICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRfdGVzdF9yZXN1
bHQoc2VsZiwgcmVzdWx0KToKKyAgICAgICAgIiIiUHJpbnRzIG9uZSB1bmV4cGVjdGVkIHRlc3Qg
cmVzdWx0IGxpbmUuIiIiCisgICAgICAgIGRlc2MgPSBUZXN0RXhwZWN0YXRpb25zRmlsZS5FWFBF
Q1RBVElPTl9ERVNDUklQVElPTlNbcmVzdWx0LnR5cGVdWzBdCisgICAgICAgIHNlbGYuX21ldGVy
LndyaXRlKCIgICVzIC0+IHVuZXhwZWN0ZWQgJXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAoc2VsZi5fcG9ydC5yZWxhdGl2ZV90ZXN0X2ZpbGVuYW1lKHJlc3VsdC5maWxlbmFtZSks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjKSkKKwogICAgIGRlZiBfZ2V0X2ZhaWx1
cmVzKHNlbGYsIHJlc3VsdF9zdW1tYXJ5LCBpbmNsdWRlX2NyYXNoZXMpOgogICAgICAgICAiIiJG
aWx0ZXJzIGEgZGljdCBvZiByZXN1bHRzIGFuZCByZXR1cm5zIG9ubHkgdGhlIGZhaWx1cmVzLgog
CkBAIC0xMjgwLDEyICsxMzMyLDYgQEAgY2xhc3MgVGVzdFJ1bm5lcjoKICAgICAgICAgaWYgbGVu
KHVuZXhwZWN0ZWRfcmVzdWx0c1sndGVzdHMnXSkgYW5kIHNlbGYuX29wdGlvbnMudmVyYm9zZToK
ICAgICAgICAgICAgIHByaW50ICItIiAqIDc4CiAKLSAgICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRf
dGVzdF9yZXN1bHQoc2VsZiwgdGVzdCwgcmVzdWx0KToKLSAgICAgICAgIiIiUHJpbnRzIG9uZSB1
bmV4cGVjdGVkIHRlc3QgcmVzdWx0IGxpbmUuIiIiCi0gICAgICAgIGRlc2MgPSBUZXN0RXhwZWN0
YXRpb25zRmlsZS5FWFBFQ1RBVElPTl9ERVNDUklQVElPTlNbcmVzdWx0XVswXQotICAgICAgICBz
ZWxmLl9tZXRlci53cml0ZSgiICAlcyAtPiB1bmV4cGVjdGVkICVzXG4iICUKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgKHNlbGYuX3BvcnQucmVsYXRpdmVfdGVzdF9maWxlbmFtZSh0ZXN0KSwg
ZGVzYykpCi0KICAgICBkZWYgX3dyaXRlX3Jlc3VsdHNfaHRtbF9maWxlKHNlbGYsIHJlc3VsdF9z
dW1tYXJ5KToKICAgICAgICAgIiIiV3JpdGUgcmVzdWx0cy5odG1sIHdoaWNoIGlzIGEgc3VtbWFy
eSBvZiB0ZXN0cyB0aGF0IGZhaWxlZC4KIApAQCAtMTU1NiwxMiArMTYwMiwxMCBAQCBkZWYgcGFy
c2VfYXJncyhhcmdzPU5vbmUpOgogCiAgICAgbG9nZ2luZ19vcHRpb25zID0gWwogICAgICAgICBv
cHRwYXJzZS5tYWtlX29wdGlvbigiLS1sb2ciLCBhY3Rpb249InN0b3JlIiwKLSAgICAgICAgICAg
IGRlZmF1bHQ9ImRldGFpbGVkLXByb2dyZXNzLHVuZXhwZWN0ZWQiLAotICAgICAgICAgICAgaGVs
cD0ibG9nIHZhcmlvdXMgdHlwZXMgb2YgZGF0YS4gVGhlIHBhcmFtIHNob3VsZCBiZSBhICIgKwot
ICAgICAgICAgICAgICAgICAiY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmFsdWVzIGZyb206ICIg
KwotICAgICAgICAgICAgICAgICAiYWN0dWFsLGNvbmZpZywiICsgTE9HX0RFVEFJTEVEX1BST0dS
RVNTICsKLSAgICAgICAgICAgICAgICAgIixleHBlY3RlZCx0aW1pbmcsIiArIExPR19VTkVYUEVD
VEVEICsgIiAiICsKLSAgICAgICAgICAgICAgICAgIihkZWZhdWx0cyB0byAiICsgIi0tbG9nIGRl
dGFpbGVkLXByb2dyZXNzLHVuZXhwZWN0ZWQpIiksCisgICAgICAgICAgICBkZWZhdWx0PUxPR19E
RUZBVUxUX1ZBTFVFLAorICAgICAgICAgICAgaGVscD0oImxvZyB2YXJpb3VzIHR5cGVzIG9mIGRh
dGEuIFRoZSBhcmd1bWVudCB2YWx1ZSBzaG91bGQgYmUgYSAiCisgICAgICAgICAgICAgICAgICAi
Y29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdmFsdWVzIGZyb206ICVzIChkZWZhdWx0cyB0byAiCisg
ICAgICAgICAgICAgICAgICAiLS1sb2cgJXMpIiAlIChMT0dfVkFMVUVTLCBMT0dfREVGQVVMVF9W
QUxVRSkpKSwKICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi12IiwgIi0tdmVyYm9zZSIs
IGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLCBoZWxwPSJp
bmNsdWRlIGRlYnVnLWxldmVsIGxvZ2dpbmciKSwKICAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRp
b24oIi0tc291cmNlcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53897</attachid>
            <date>2010-04-20 15:43:28 -0700</date>
            <delta_ts>2010-04-21 02:45:44 -0700</delta_ts>
            <desc>updated patch that will actually apply</desc>
            <filename>bug-37726-20100420154327.patch</filename>
            <type>text/plain</type>
            <size>22975</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBhYTA0NmZkLi5jZGJhNDQ2IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTAtMDQt
MjAgIERpcmsgUHJhbmtlIDxkcHJhbmtlQGNocm9taXVtLm9yZz4KKworICAgICAgICBUaGlzIHBh
dGNoIHRvIG5ldy1ydW4td2Via2l0LXRlc3RzIGFkZHMgYSAtLWxvZyAndHJhY2UnIG9wdGlvbgor
ICAgICAgICB0aGF0IHByaW50cyBvdXQgZGV0YWlsZWQgaW5mbyBhYm91dCBhIGdpdmVuIHRlc3Qg
YXMgaXQgZXhlY3V0ZXMKKyAgICAgICAgKHdoZXJlIHRoZSBiYXNlbGluZXMgYXJlLCB3aGF0IHRo
ZSBleHBlY3RhdGlvbiBpcywgd2hhdCB3ZSBnb3QsCisgICAgICAgIGhvdyBsb25nIGl0IHRvb2sp
LgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzcy
NgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90
ZXN0cy5weToKKyAgICAgICAgICAtIHVzZSB0aGUgbmV3bHkgZXhwb3NlZCBUZXN0UmVzdWx0IGNs
YXNzIGFuZCBpbXBsZW1lbnQKKyAgICAgICAgICAgIC0tbG9nIHRyYWNlCisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdGhy
ZWFkLnB5OgorICAgICAgICAgIC0gcmVuYW1lIFRlc3RTdGF0cyB0byBUZXN0UmVzdWx0IGFuZCBt
YWtlIGl0IG1vcmUgcHVibGljLCByZXN1bHRpbmcKKyAgICAgICAgICAgIGluIGNsZWFuZXIgY29k
ZQorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdl
L3Rlc3RfZXhwZWN0YXRpb25zLnB5OgorICAgICAgICAgIC0gYWRkIGV4cGVjdGF0aW9uX3RvX3N0
cmluZygpIGFzIGEgc2VwYXJhdGUgY2FsbGFibGUgZnVuY3Rpb24KKwogMjAxMC0wNC0yMCAgRXJp
YyBTZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdlZCwgcm9sbGlu
ZyBvdXQgcjU3OTA3LgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvbGF5b3V0X3BhY2thZ2UvZHVtcF9yZW5kZXJfdHJlZV90aHJlYWQucHkgYi9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9k
dW1wX3JlbmRlcl90cmVlX3RocmVhZC5weQppbmRleCA5M2I0Yzc5Li45MTQ4ZjI5IDEwMDY0NAot
LS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFj
a2FnZS9kdW1wX3JlbmRlcl90cmVlX3RocmVhZC5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9sYXlvdXRfcGFja2FnZS9kdW1wX3JlbmRlcl90cmVlX3Ro
cmVhZC5weQpAQCAtNTQsOCArNTQsOCBAQCBfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoIndlYmtp
dHB5LmxheW91dF90ZXN0cy5sYXlvdXRfcGFja2FnZS4iCiBkZWYgcHJvY2Vzc19vdXRwdXQocG9y
dCwgdGVzdF9pbmZvLCB0ZXN0X3R5cGVzLCB0ZXN0X2FyZ3MsIGNvbmZpZ3VyYXRpb24sCiAgICAg
ICAgICAgICAgICAgICAgb3V0cHV0X2RpciwgY3Jhc2gsIHRpbWVvdXQsIHRlc3RfcnVuX3RpbWUs
IGFjdHVhbF9jaGVja3N1bSwKICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGVycm9yKToKLSAg
ICAiIiJSZWNlaXZlcyB0aGUgb3V0cHV0IGZyb20gYSBEdW1wUmVuZGVyVHJlZSBwcm9jZXNzLCBz
dWJqZWN0cyBpdCB0byBhIG51bWJlcgotICAgIG9mIHRlc3RzLCBhbmQgcmV0dXJucyBhIGxpc3Qg
b2YgZmFpbHVyZSB0eXBlcyB0aGUgdGVzdCBwcm9kdWNlZC4KKyAgICAiIiJSZWNlaXZlcyB0aGUg
b3V0cHV0IGZyb20gYSBEdW1wUmVuZGVyVHJlZSBwcm9jZXNzLCBzdWJqZWN0cyBpdCB0byBhCisg
ICAgbnVtYmVyIG9mIHRlc3RzLCBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgZmFpbHVyZSB0eXBlcyB0
aGUgdGVzdCBwcm9kdWNlZC4KIAogICAgIEFyZ3M6CiAgICAgICBwb3J0OiBwb3J0LXNwZWNpZmlj
IGhvb2tzCkBAIC02Niw3ICs2Niw3IEBAIGRlZiBwcm9jZXNzX291dHB1dChwb3J0LCB0ZXN0X2lu
Zm8sIHRlc3RfdHlwZXMsIHRlc3RfYXJncywgY29uZmlndXJhdGlvbiwKICAgICAgIGNvbmZpZ3Vy
YXRpb246IERlYnVnIG9yIFJlbGVhc2UKICAgICAgIG91dHB1dF9kaXI6IGRpcmVjdG9yeSB0byBw
dXQgY3Jhc2ggc3RhY2sgdHJhY2VzIGludG8KIAotICAgIFJldHVybnM6IGEgbGlzdCBvZiBmYWls
dXJlIG9iamVjdHMgYW5kIHRpbWVzIGZvciB0aGUgdGVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICBS
ZXR1cm5zOiBhIFRlc3RSZXN1bHQgb2JqZWN0CiAgICAgIiIiCiAgICAgZmFpbHVyZXMgPSBbXQog
CkBAIC0xMTEsMTkgKzExMSwyMCBAQCBkZWYgcHJvY2Vzc19vdXRwdXQocG9ydCwgdGVzdF9pbmZv
LCB0ZXN0X3R5cGVzLCB0ZXN0X2FyZ3MsIGNvbmZpZ3VyYXRpb24sCiAgICAgICAgICAgICB0aW1l
LnRpbWUoKSAtIHN0YXJ0X2RpZmZfdGltZSkKIAogICAgIHRvdGFsX3RpbWVfZm9yX2FsbF9kaWZm
cyA9IHRpbWUudGltZSgpIC0gc3RhcnRfZGlmZl90aW1lCi0gICAgcmV0dXJuIFRlc3RTdGF0cyh0
ZXN0X2luZm8uZmlsZW5hbWUsIGZhaWx1cmVzLCB0ZXN0X3J1bl90aW1lLAotICAgICAgICB0b3Rh
bF90aW1lX2Zvcl9hbGxfZGlmZnMsIHRpbWVfZm9yX2RpZmZzKQorICAgIHJldHVybiBUZXN0UmVz
dWx0KHRlc3RfaW5mby5maWxlbmFtZSwgZmFpbHVyZXMsIHRlc3RfcnVuX3RpbWUsCisgICAgICAg
ICAgICAgICAgICAgICAgdG90YWxfdGltZV9mb3JfYWxsX2RpZmZzLCB0aW1lX2Zvcl9kaWZmcykK
IAogCi1jbGFzcyBUZXN0U3RhdHM6CitjbGFzcyBUZXN0UmVzdWx0KG9iamVjdCk6CiAKICAgICBk
ZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGZhaWx1cmVzLCB0ZXN0X3J1bl90aW1lLAogICAg
ICAgICAgICAgICAgICB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnMsIHRpbWVfZm9yX2RpZmZzKToK
LSAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgIHNlbGYuZmFpbHVyZXMg
PSBmYWlsdXJlcworICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICAgc2Vs
Zi50ZXN0X3J1bl90aW1lID0gdGVzdF9ydW5fdGltZQotICAgICAgICBzZWxmLnRvdGFsX3RpbWVf
Zm9yX2FsbF9kaWZmcyA9IHRvdGFsX3RpbWVfZm9yX2FsbF9kaWZmcwogICAgICAgICBzZWxmLnRp
bWVfZm9yX2RpZmZzID0gdGltZV9mb3JfZGlmZnMKKyAgICAgICAgc2VsZi50b3RhbF90aW1lX2Zv
cl9hbGxfZGlmZnMgPSB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnMKKyAgICAgICAgc2VsZi50eXBl
ID0gdGVzdF9mYWlsdXJlcy5kZXRlcm1pbmVfcmVzdWx0X3R5cGUoZmFpbHVyZXMpCiAKIAogY2xh
c3MgU2luZ2xlVGVzdFRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKQEAgLTE1NywxNCArMTU4LDE0
IEBAIGNsYXNzIFNpbmdsZVRlc3RUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAgICAg
ICBkcml2ZXIucnVuX3Rlc3QodGVzdF9pbmZvLnVyaS5zdHJpcCgpLCB0ZXN0X2luZm8udGltZW91
dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZm8uaW1hZ2VfaGFzaCkKICAg
ICAgICAgZW5kID0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5fdGVzdF9zdGF0cyA9IHByb2Nl
c3Nfb3V0cHV0KHNlbGYuX3BvcnQsCisgICAgICAgIHNlbGYuX3Rlc3RfcmVzdWx0ID0gcHJvY2Vz
c19vdXRwdXQoc2VsZi5fcG9ydCwKICAgICAgICAgICAgIHRlc3RfaW5mbywgc2VsZi5fdGVzdF90
eXBlcywgc2VsZi5fdGVzdF9hcmdzLAogICAgICAgICAgICAgc2VsZi5fY29uZmlndXJhdGlvbiwg
c2VsZi5fb3V0cHV0X2RpciwgY3Jhc2gsIHRpbWVvdXQsIGVuZCAtIHN0YXJ0LAogICAgICAgICAg
ICAgYWN0dWFsX2NoZWNrc3VtLCBvdXRwdXQsIGVycm9yKQogICAgICAgICBkcml2ZXIuc3RvcCgp
CiAKLSAgICBkZWYgZ2V0X3Rlc3Rfc3RhdHMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl90
ZXN0X3N0YXRzCisgICAgZGVmIGdldF90ZXN0X3Jlc3VsdChzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX3Rlc3RfcmVzdWx0CiAKIAogY2xhc3MgVGVzdFNoZWxsVGhyZWFkKHRocmVhZGluZy5U
aHJlYWQpOgpAQCAtMjAxLDcgKzIwMiw3IEBAIGNsYXNzIFRlc3RTaGVsbFRocmVhZCh0aHJlYWRp
bmcuVGhyZWFkKToKICAgICAgICAgc2VsZi5fY2FuY2VsZWQgPSBGYWxzZQogICAgICAgICBzZWxm
Ll9leGNlcHRpb25faW5mbyA9IE5vbmUKICAgICAgICAgc2VsZi5fZGlyZWN0b3J5X3RpbWluZ19z
dGF0cyA9IHt9Ci0gICAgICAgIHNlbGYuX3Rlc3Rfc3RhdHMgPSBbXQorICAgICAgICBzZWxmLl90
ZXN0X3Jlc3VsdHMgPSBbXQogICAgICAgICBzZWxmLl9udW1fdGVzdHMgPSAwCiAgICAgICAgIHNl
bGYuX3N0YXJ0X3RpbWUgPSAwCiAgICAgICAgIHNlbGYuX3N0b3BfdGltZSA9IDAKQEAgLTIxOCwx
MCArMjE5LDEzIEBAIGNsYXNzIFRlc3RTaGVsbFRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKICAg
ICAgICAgKG51bWJlciBvZiB0ZXN0cyBpbiB0aGF0IGRpcmVjdG9yeSwgdGltZSB0byBydW4gdGhl
IHRlc3RzKSIiIgogICAgICAgICByZXR1cm4gc2VsZi5fZGlyZWN0b3J5X3RpbWluZ19zdGF0cwog
Ci0gICAgZGVmIGdldF9pbmRpdmlkdWFsX3Rlc3Rfc3RhdHMoc2VsZik6Ci0gICAgICAgICIiIlJl
dHVybnMgYSBsaXN0IG9mICh0ZXN0X2ZpbGVuYW1lLCB0aW1lX3RvX3J1bl90ZXN0LAotICAgICAg
ICB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnMsIHRpbWVfZm9yX2RpZmZzKSB0dXBsZXMuIiIiCi0g
ICAgICAgIHJldHVybiBzZWxmLl90ZXN0X3N0YXRzCisgICAgZGVmIGdldF90ZXN0X3Jlc3VsdHMo
c2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbGlzdCBvZiBhbGwgdGVzdHMgcnVuIG9uIHRo
aXMgdGhyZWFkLgorCisgICAgICAgIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgcGVyLXRocmVh
ZCBzdGF0aXN0aWNzLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fdGVzdF9y
ZXN1bHRzCiAKICAgICBkZWYgY2FuY2VsKHNlbGYpOgogICAgICAgICAiIiJTZXQgYSBmbGFnIHRl
bGxpbmcgdGhpcyB0aHJlYWQgdG8gcXVpdC4iIiIKQEAgLTMxNywyNyArMzIxLDI5IEBAIGNsYXNz
IFRlc3RTaGVsbFRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKICAgICAgICAgICAgIGJhdGNoX2Nv
dW50ICs9IDEKICAgICAgICAgICAgIHNlbGYuX251bV90ZXN0cyArPSAxCiAgICAgICAgICAgICBp
ZiBzZWxmLl9vcHRpb25zLnJ1bl9zaW5nbHk6Ci0gICAgICAgICAgICAgICAgZmFpbHVyZXMgPSBz
ZWxmLl9ydW5fdGVzdF9zaW5nbHkodGVzdF9pbmZvKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9
IHNlbGYuX3J1bl90ZXN0X3NpbmdseSh0ZXN0X2luZm8pCiAgICAgICAgICAgICBlbHNlOgotICAg
ICAgICAgICAgICAgIGZhaWx1cmVzID0gc2VsZi5fcnVuX3Rlc3QodGVzdF9pbmZvKQorICAgICAg
ICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX3J1bl90ZXN0KHRlc3RfaW5mbykKIAogICAgICAgICAg
ICAgZmlsZW5hbWUgPSB0ZXN0X2luZm8uZmlsZW5hbWUKICAgICAgICAgICAgIHRlc3RzX3J1bl9m
aWxlLndyaXRlKGZpbGVuYW1lICsgIlxuIikKLSAgICAgICAgICAgIGlmIGZhaWx1cmVzOgotICAg
ICAgICAgICAgICAgICMgQ2hlY2sgYW5kIGtpbGwgRHVtcFJlbmRlclRyZWUgaWYgd2UgbmVlZCB0
b28uCi0gICAgICAgICAgICAgICAgaWYgbGVuKFsxIGZvciBmIGluIGZhaWx1cmVzIGlmIGYuc2hv
dWxkX2tpbGxfZHVtcF9yZW5kZXJfdHJlZSgpXSk6CisgICAgICAgICAgICBpZiByZXN1bHQuZmFp
bHVyZXM6CisgICAgICAgICAgICAgICAgIyBDaGVjayBhbmQga2lsbCBEdW1wUmVuZGVyVHJlZSBp
ZiB3ZSBuZWVkIHRvLgorICAgICAgICAgICAgICAgIGlmIGxlbihbMSBmb3IgZiBpbiByZXN1bHQu
ZmFpbHVyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYuc2hvdWxkX2tpbGxfZHVtcF9y
ZW5kZXJfdHJlZSgpXSk6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2tpbGxfZHVtcF9yZW5k
ZXJfdHJlZSgpCiAgICAgICAgICAgICAgICAgICAgICMgUmVzZXQgdGhlIGJhdGNoIGNvdW50IHNp
bmNlIHRoZSBzaGVsbCBqdXN0IGJvdW5jZWQuCiAgICAgICAgICAgICAgICAgICAgIGJhdGNoX2Nv
dW50ID0gMAogICAgICAgICAgICAgICAgICMgUHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UocykuCi0g
ICAgICAgICAgICAgICAgZXJyb3Jfc3RyID0gJ1xuJy5qb2luKFsnICAnICsgZi5tZXNzYWdlKCkg
Zm9yIGYgaW4gZmFpbHVyZXNdKQorICAgICAgICAgICAgICAgIGVycm9yX3N0ciA9ICdcbicuam9p
bihbJyAgJyArIGYubWVzc2FnZSgpIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZiBpbiByZXN1bHQuZmFpbHVyZXNdKQogICAgICAgICAgICAgICAgIF9sb2cuZGVi
dWcoIiVzICVzIGZhaWxlZDpcbiVzIiAlIChzZWxmLmdldE5hbWUoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHNlbGYuX3BvcnQucmVsYXRpdmVfdGVzdF9maWxlbmFtZShmaWxlbmFtZSks
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdHIpKQogICAgICAgICAgICAgZWxz
ZToKICAgICAgICAgICAgICAgICBfbG9nLmRlYnVnKCIlcyAlcyBwYXNzZWQiICUgKHNlbGYuZ2V0
TmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcG9ydC5yZWxhdGl2ZV90
ZXN0X2ZpbGVuYW1lKGZpbGVuYW1lKSkpCi0gICAgICAgICAgICBzZWxmLl9yZXN1bHRfcXVldWUu
cHV0KChmaWxlbmFtZSwgZmFpbHVyZXMpKQorICAgICAgICAgICAgc2VsZi5fcmVzdWx0X3F1ZXVl
LnB1dChyZXN1bHQpCiAKICAgICAgICAgICAgIGlmIGJhdGNoX3NpemUgPiAwIGFuZCBiYXRjaF9j
b3VudCA+IGJhdGNoX3NpemU6CiAgICAgICAgICAgICAgICAgIyBCb3VuY2UgdGhlIHNoZWxsIGFu
ZCByZXNldCBjb3VudC4KQEAgLTM1Nyw4ICszNjMsOSBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQo
dGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAgIEFyZ3M6CiAgICAgICAgICAgdGVzdF9pbmZvOiBP
YmplY3QgY29udGFpbmluZyB0aGUgdGVzdCBmaWxlbmFtZSwgdXJpIGFuZCB0aW1lb3V0CiAKLSAg
ICAgICAgUmV0dXJuOgotICAgICAgICAgIEEgbGlzdCBvZiBUZXN0RmFpbHVyZSBvYmplY3RzIGRl
c2NyaWJpbmcgdGhlIGVycm9yLgorICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIEEgVGVzdFJl
c3VsdAorCiAgICAgICAgICIiIgogICAgICAgICB3b3JrZXIgPSBTaW5nbGVUZXN0VGhyZWFkKHNl
bGYuX3BvcnQsIHNlbGYuX2ltYWdlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2VsZi5fc2hlbGxfYXJncywKQEAgLTM3MCw5ICszNzcsOSBAQCBjbGFzcyBUZXN0U2hl
bGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAKICAgICAgICAgd29ya2VyLnN0YXJ0KCkKIAot
ICAgICAgICAjIFdoZW4gd2UncmUgcnVubmluZyBvbmUgdGVzdCBwZXIgRHVtcFJlbmRlclRyZWUg
cHJvY2Vzcywgd2UgY2FuIGVuZm9yY2UKLSAgICAgICAgIyBhIGhhcmQgdGltZW91dC4gdGhlIER1
bXBSZW5kZXJUcmVlIHdhdGNoZG9nIHVzZXMgMi41eCB0aGUgdGltZW91dAotICAgICAgICAjIFdl
IHdhbnQgdG8gYmUgbGFyZ2VyIHRoYW4gdGhhdC4KKyAgICAgICAgIyBXaGVuIHdlJ3JlIHJ1bm5p
bmcgb25lIHRlc3QgcGVyIER1bXBSZW5kZXJUcmVlIHByb2Nlc3MsIHdlIGNhbgorICAgICAgICAj
IGVuZm9yY2UgYSBoYXJkIHRpbWVvdXQuICBUaGUgRHVtcFJlbmRlclRyZWUgd2F0Y2hkb2cgdXNl
cyAyLjV4CisgICAgICAgICMgdGhlIHRpbWVvdXQ7IHdlIHdhbnQgdG8gYmUgbGFyZ2VyIHRoYW4g
dGhhdC4KICAgICAgICAgd29ya2VyLmpvaW4oaW50KHRlc3RfaW5mby50aW1lb3V0KSAqIDMuMCAv
IDEwMDAuMCkKICAgICAgICAgaWYgd29ya2VyLmlzQWxpdmUoKToKICAgICAgICAgICAgICMgSWYg
am9pbigpIHJldHVybmVkIHdpdGggdGhlIHRocmVhZCBzdGlsbCBydW5uaW5nLCB0aGUKQEAgLTM4
MCwyMiArMzg3LDIzIEBAIGNsYXNzIFRlc3RTaGVsbFRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToK
ICAgICAgICAgICAgICMgbW9yZSB3ZSBjYW4gZG8gd2l0aCBpdC4gIFdlIGhhdmUgdG8ga2lsbCBh
bGwgdGhlCiAgICAgICAgICAgICAjIER1bXBSZW5kZXJUcmVlcyB0byBmcmVlIGl0IHVwLiBJZiB3
ZSdyZSBydW5uaW5nIG1vcmUgdGhhbgogICAgICAgICAgICAgIyBvbmUgRHVtcFJlbmRlclRyZWUg
dGhyZWFkLCB3ZSdsbCBlbmQgdXAga2lsbGluZyB0aGUgb3RoZXIKLSAgICAgICAgICAgICMgRHVt
cFJlbmRlclRyZWVzIHRvbywgaW50cm9kdWNpbmcgc3B1cmlvdXMgY3Jhc2hlcy4gV2UgYWNjZXB0
IHRoYXQKLSAgICAgICAgICAgICMgdHJhZGVvZmYgaW4gb3JkZXIgdG8gYXZvaWQgbG9zaW5nIHRo
ZSByZXN0IG9mIHRoaXMgdGhyZWFkJ3MKLSAgICAgICAgICAgICMgcmVzdWx0cy4KKyAgICAgICAg
ICAgICMgRHVtcFJlbmRlclRyZWVzIHRvbywgaW50cm9kdWNpbmcgc3B1cmlvdXMgY3Jhc2hlcy4g
V2UgYWNjZXB0CisgICAgICAgICAgICAjIHRoYXQgdHJhZGVvZmYgaW4gb3JkZXIgdG8gYXZvaWQg
bG9zaW5nIHRoZSByZXN0IG9mIHRoaXMKKyAgICAgICAgICAgICMgdGhyZWFkJ3MgcmVzdWx0cy4K
ICAgICAgICAgICAgIF9sb2cuZXJyb3IoJ1Rlc3QgdGhyZWFkIGh1bmc6IGtpbGxpbmcgYWxsIER1
bXBSZW5kZXJUcmVlcycpCiAgICAgICAgICAgICB3b3JrZXIuX2RyaXZlci5zdG9wKCkKIAogICAg
ICAgICB0cnk6Ci0gICAgICAgICAgICBzdGF0cyA9IHdvcmtlci5nZXRfdGVzdF9zdGF0cygpCi0g
ICAgICAgICAgICBzZWxmLl90ZXN0X3N0YXRzLmFwcGVuZChzdGF0cykKLSAgICAgICAgICAgIGZh
aWx1cmVzID0gc3RhdHMuZmFpbHVyZXMKKyAgICAgICAgICAgIHJlc3VsdCA9IHdvcmtlci5nZXRf
dGVzdF9yZXN1bHQoKQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGU6CiAgICAgICAg
ICAgICBmYWlsdXJlcyA9IFtdCiAgICAgICAgICAgICBfbG9nLmVycm9yKCdDYW5ub3QgZ2V0IHJl
c3VsdHMgb2YgdGVzdDogJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9pbmZvLmZp
bGVuYW1lKQorICAgICAgICAgICAgcmVzdWx0ID0gVGVzdFJlc3VsdCh0ZXN0X2luZm8uZmlsZW5h
bWUsIGZhaWx1cmVzPVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3J1
bl90aW1lPTAsIHRvdGFsX3RpbWVfZm9yX2FsbF9kaWZmcz0wLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0aW1lX2Zvcl9kaWZmcz0wKQogCi0gICAgICAgIHJldHVybiBmYWlsdXJl
cworICAgICAgICByZXR1cm4gcmVzdWx0CiAKICAgICBkZWYgX3J1bl90ZXN0KHNlbGYsIHRlc3Rf
aW5mbyk6CiAgICAgICAgICIiIlJ1biBhIHNpbmdsZSB0ZXN0IGZpbGUgdXNpbmcgYSBzaGFyZWQg
RHVtcFJlbmRlclRyZWUgcHJvY2Vzcy4KQEAgLTQwMyw4ICs0MTEsOSBAQCBjbGFzcyBUZXN0U2hl
bGxUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAgIEFyZ3M6CiAgICAgICAgICAgdGVz
dF9pbmZvOiBPYmplY3QgY29udGFpbmluZyB0aGUgdGVzdCBmaWxlbmFtZSwgdXJpIGFuZCB0aW1l
b3V0CiAKLSAgICAgICAgUmV0dXJuOgorICAgICAgICBSZXR1cm5zOgogICAgICAgICAgIEEgbGlz
dCBvZiBUZXN0RmFpbHVyZSBvYmplY3RzIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorCiAgICAgICAg
ICIiIgogICAgICAgICBzZWxmLl9lbnN1cmVfZHVtcF9yZW5kZXJfdHJlZV9pc19ydW5uaW5nKCkK
ICAgICAgICAgIyBUaGUgcGl4ZWxfaGFzaCBpcyB1c2VkIHRvIGF2b2lkIGRvaW5nIGFuIGltYWdl
IGR1bXAgaWYgdGhlCkBAIC00MTksMTkgKzQyOCwyMCBAQCBjbGFzcyBUZXN0U2hlbGxUaHJlYWQo
dGhyZWFkaW5nLlRocmVhZCk6CiAgICAgICAgICAgIHNlbGYuX2RyaXZlci5ydW5fdGVzdCh0ZXN0
X2luZm8udXJpLCB0ZXN0X2luZm8udGltZW91dCwgaW1hZ2VfaGFzaCkKICAgICAgICAgZW5kID0g
dGltZS50aW1lKCkKIAotICAgICAgICBzdGF0cyA9IHByb2Nlc3Nfb3V0cHV0KHNlbGYuX3BvcnQs
IHRlc3RfaW5mbywgc2VsZi5fdGVzdF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzZWxmLl90ZXN0X2FyZ3MsIHNlbGYuX29wdGlvbnMuY29uZmlndXJhdGlvbiwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zLnJlc3VsdHNfZGlyZWN0b3J5
LCBjcmFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LCBlbmQgLSBz
dGFydCwgYWN0dWFsX2NoZWNrc3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91
dHB1dCwgZXJyb3IpCi0KLSAgICAgICAgc2VsZi5fdGVzdF9zdGF0cy5hcHBlbmQoc3RhdHMpCi0g
ICAgICAgIHJldHVybiBzdGF0cy5mYWlsdXJlcworICAgICAgICByZXN1bHQgPSBwcm9jZXNzX291
dHB1dChzZWxmLl9wb3J0LCB0ZXN0X2luZm8sIHNlbGYuX3Rlc3RfdHlwZXMsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RfYXJncywgc2VsZi5fb3B0aW9ucy5jb25m
aWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25z
LnJlc3VsdHNfZGlyZWN0b3J5LCBjcmFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGltZW91dCwgZW5kIC0gc3RhcnQsIGFjdHVhbF9jaGVja3N1bSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgb3V0cHV0LCBlcnJvcikKKyAgICAgICAgc2VsZi5fdGVzdF9yZXN1
bHRzLmFwcGVuZChyZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQKIAogICAgIGRlZiBfZW5z
dXJlX2R1bXBfcmVuZGVyX3RyZWVfaXNfcnVubmluZyhzZWxmKToKLSAgICAgICAgIiIiU3RhcnQg
dGhlIHNoYXJlZCBEdW1wUmVuZGVyVHJlZSwgaWYgaXQncyBub3QgcnVubmluZy4gIE5vdCBmb3Ig
dXNlIHdoZW4KLSAgICAgICAgcnVubmluZyB0ZXN0cyBzaW5nbHksIHNpbmNlIHRob3NlIGVhY2gg
c3RhcnQgYSBzZXBhcmF0ZSBEdW1wUmVuZGVyVHJlZSBpbgotICAgICAgICB0aGVpciBvd24gdGhy
ZWFkLgorICAgICAgICAiIiJTdGFydCB0aGUgc2hhcmVkIER1bXBSZW5kZXJUcmVlLCBpZiBpdCdz
IG5vdCBydW5uaW5nLgorCisgICAgICAgIFRoaXMgaXMgbm90IGZvciB1c2Ugd2hlbiBydW5uaW5n
IHRlc3RzIHNpbmdseSwgc2luY2UgdGhvc2UgZWFjaCBzdGFydAorICAgICAgICBhIHNlcGFyYXRl
IER1bXBSZW5kZXJUcmVlIGluIHRoZWlyIG93biB0aHJlYWQuCisKICAgICAgICAgIiIiCiAgICAg
ICAgIGlmIChub3Qgc2VsZi5fZHJpdmVyIG9yIHNlbGYuX2RyaXZlci5wb2xsKCkgaXMgbm90IE5v
bmUpOgogICAgICAgICAgICAgc2VsZi5fZHJpdmVyID0gc2VsZi5fcG9ydC5zdGFydF9kcml2ZXIo
CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9s
YXlvdXRfcGFja2FnZS90ZXN0X2V4cGVjdGF0aW9ucy5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfZXhwZWN0YXRpb25zLnB5
CmluZGV4IDM5N2VjNmUuLjM4MjIzZGQgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9wYWNrYWdlL3Rlc3RfZXhwZWN0YXRpb25zLnB5
CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2xheW91dF9w
YWNrYWdlL3Rlc3RfZXhwZWN0YXRpb25zLnB5CkBAIC00OCw2ICs0OCw3IEBAIF9sb2cgPSBsb2dn
aW5nLmdldExvZ2dlcigid2Via2l0cHkubGF5b3V0X3Rlc3RzLmxheW91dF9wYWNrYWdlLiIKICMg
VGVzdCBleHBlY3RhdGlvbiBmaWxlIHVwZGF0ZSBhY3Rpb24gY29uc3RhbnRzCiAoTk9fQ0hBTkdF
LCBSRU1PVkVfVEVTVCwgUkVNT1ZFX1BMQVRGT1JNLCBBRERfUExBVEZPUk1TX0VYQ0VQVF9USElT
KSA9IHJhbmdlKDQpCiAKKwogZGVmIHJlc3VsdF93YXNfZXhwZWN0ZWQocmVzdWx0LCBleHBlY3Rl
ZF9yZXN1bHRzLCB0ZXN0X25lZWRzX3JlYmFzZWxpbmluZywKICAgICAgICAgICAgICAgICAgICAg
ICAgIHRlc3RfaXNfc2tpcHBlZCk6CiAgICAgIiIiUmV0dXJucyB3aGV0aGVyIHdlIGdvdCBhIHJl
c3VsdCB3ZSB3ZXJlIGV4cGVjdGluZy4KQEAgLTYxLDExICs2MiwxMiBAQCBkZWYgcmVzdWx0X3dh
c19leHBlY3RlZChyZXN1bHQsIGV4cGVjdGVkX3Jlc3VsdHMsIHRlc3RfbmVlZHNfcmViYXNlbGlu
aW5nLAogICAgIGlmIHJlc3VsdCBpbiAoSU1BR0UsIFRFWFQsIElNQUdFX1BMVVNfVEVYVCkgYW5k
IEZBSUwgaW4gZXhwZWN0ZWRfcmVzdWx0czoKICAgICAgICAgcmV0dXJuIFRydWUKICAgICBpZiBy
ZXN1bHQgPT0gTUlTU0lORyBhbmQgdGVzdF9uZWVkc19yZWJhc2VsaW5pbmc6Ci0gICAgICAgcmV0
dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIFRydWUKICAgICBpZiByZXN1bHQgPT0gU0tJUCBhbmQg
dGVzdF9pc19za2lwcGVkOgotICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBUcnVl
CiAgICAgcmV0dXJuIEZhbHNlCiAKKwogZGVmIHJlbW92ZV9waXhlbF9mYWlsdXJlcyhleHBlY3Rl
ZF9yZXN1bHRzKToKICAgICAiIiJSZXR1cm5zIGEgY29weSBvZiB0aGUgZXhwZWN0ZWQgcmVzdWx0
cyBmb3IgYSB0ZXN0LCBleGNlcHQgdGhhdCB3ZQogICAgIGRyb3AgYW55IHBpeGVsIGZhaWx1cmVz
IGFuZCByZXR1cm4gdGhlIHJlbWFpbmluZyBleHBlY3RhdGlvbnMuIEZvciBleGFtcGxlLApAQCAt
MTQxLDEyICsxNDMsMTYgQEAgY2xhc3MgVGVzdEV4cGVjdGF0aW9uczoKICAgICAgICAgcmV0dmFs
ID0gW10KIAogICAgICAgICBmb3IgZXhwZWN0YXRpb24gaW4gZXhwZWN0YXRpb25zOgotICAgICAg
ICAgICAgZm9yIGl0ZW0gaW4gVGVzdEV4cGVjdGF0aW9uc0ZpbGUuRVhQRUNUQVRJT05TLml0ZW1z
KCk6Ci0gICAgICAgICAgICAgICAgaWYgaXRlbVsxXSA9PSBleHBlY3RhdGlvbjoKLSAgICAgICAg
ICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChpdGVtWzBdKQotICAgICAgICAgICAgICAgICAgICBi
cmVhaworICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChzZWxmLmV4cGVjdGF0aW9uX3RvX3N0cmlu
ZyhleHBlY3RhdGlvbikpCisKKyAgICAgICAgcmV0dXJuICIgIi5qb2luKHJldHZhbCkKIAotICAg
ICAgICByZXR1cm4gIiAiLmpvaW4ocmV0dmFsKS51cHBlcigpCisgICAgZGVmIGV4cGVjdGF0aW9u
X3RvX3N0cmluZyhzZWxmLCBleHBlY3RhdGlvbik6CisgICAgICAgICIiIlJldHVybiB0aGUgdXBw
ZXJjYXNlZCBzdHJpbmcgZXF1aXZhbGVudCBvZiBhIGdpdmVuIGV4cGVjdGF0aW9uLiIiIgorICAg
ICAgICBmb3IgaXRlbSBpbiBUZXN0RXhwZWN0YXRpb25zRmlsZS5FWFBFQ1RBVElPTlMuaXRlbXMo
KToKKyAgICAgICAgICAgIGlmIGl0ZW1bMV0gPT0gZXhwZWN0YXRpb246CisgICAgICAgICAgICAg
ICAgcmV0dXJuIGl0ZW1bMF0udXBwZXIoKQorICAgICAgICByZXR1cm4gIiIKIAogICAgIGRlZiBn
ZXRfdGltZWxpbmVfZm9yX3Rlc3Qoc2VsZiwgdGVzdCk6CiAgICAgICAgIHJldHVybiBzZWxmLl9l
eHBlY3RlZF9mYWlsdXJlcy5nZXRfdGltZWxpbmVfZm9yX3Rlc3QodGVzdCkKQEAgLTgzNCw3ICs4
NDAsOCBAQCBjbGFzcyBUZXN0RXhwZWN0YXRpb25zRmlsZToKICAgICAgICAgICAgIGlmIHRlc3Qg
aW4gc2V0X29mX3Rlc3RzOgogICAgICAgICAgICAgICAgIHNldF9vZl90ZXN0cy5yZW1vdmUodGVz
dCkKIAotICAgIGRlZiBfYWxyZWFkeV9zZWVuX3Rlc3Qoc2VsZiwgdGVzdCwgdGVzdF9saXN0X3Bh
dGgsIGxpbmVubywgYWxsb3dfb3ZlcnJpZGVzKToKKyAgICBkZWYgX2FscmVhZHlfc2Vlbl90ZXN0
KHNlbGYsIHRlc3QsIHRlc3RfbGlzdF9wYXRoLCBsaW5lbm8sCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICBhbGxvd19vdmVycmlkZXMpOgogICAgICAgICAiIiJSZXR1cm5zIHRydWUgaWYgd2Un
dmUgYWxyZWFkeSBzZWVuIGEgbW9yZSBwcmVjaXNlIHBhdGggZm9yIHRoaXMgdGVzdAogICAgICAg
ICB0aGFuIHRoZSB0ZXN0X2xpc3RfcGF0aC4KICAgICAgICAgIiIiCmRpZmYgLS1naXQgYS9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzLnB5
IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcnVuX3dlYmtpdF90
ZXN0cy5weQppbmRleCA3NjU4MjliLi4xYmU4N2FlIDEwMDc1NQotLS0gYS9XZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3RzLnB5CisrKyBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93ZWJraXRfdGVzdHMu
cHkKQEAgLTkwLDEwICs5MCwxMiBAQCBMT0dfREVUQUlMRURfUFJPR1JFU1MgPSAnZGV0YWlsZWQt
cHJvZ3Jlc3MnCiAjIExvZyB0aGUgb25lLWxpbmUgc3VtbWFyeSBhdCB0aGUgZW5kIG9mIHRoZSBy
dW4KIExPR19TVU1NQVJZID0gJ3N1bW1hcnknCiAKKyMgIlRyYWNlIiB0aGUgdGVzdCAtIGxvZyB0
aGUgZXhwZWN0ZWQgcmVzdWx0LCB0aGUgYWN0dWFsIHJlc3VsdCwgYW5kIHRoZQorIyBiYXNlbGlu
ZXMgdXNlZAorTE9HX1RSQUNFID0gJ3RyYWNlJworCiAjIExvZyBhbnkgdW5leHBlY3RlZCByZXN1
bHRzIHdoaWxlIHJ1bm5pbmcgKGluc3RlYWQgb2YganVzdCBhdCB0aGUgZW5kKS4KIExPR19VTkVY
UEVDVEVEID0gJ3VuZXhwZWN0ZWQnCi0KLSMgTG9nIGFueSB1bmV4cGVjdGVkIHJlc3VsdHMgYXQg
dGhlIGVuZAogTE9HX1VORVhQRUNURURfUkVTVUxUUyA9ICd1bmV4cGVjdGVkLXJlc3VsdHMnCiAK
IExPR19WQUxVRVMgPSAiLCIuam9pbigoImFjdHVhbCIsICJjb25maWciLCBMT0dfREVUQUlMRURf
UFJPR1JFU1MsICJleHBlY3RlZCIsCkBAIC0xNTMsMjUgKzE1NSwyMyBAQCBjbGFzcyBSZXN1bHRT
dW1tYXJ5KG9iamVjdCk6CiAgICAgICAgICAgICBzZWxmLnRlc3RzX2J5X3RpbWVsaW5lW3RpbWVs
aW5lXSA9ICgKICAgICAgICAgICAgICAgICBleHBlY3RhdGlvbnMuZ2V0X3Rlc3RzX3dpdGhfdGlt
ZWxpbmUodGltZWxpbmUpKQogCi0gICAgZGVmIGFkZChzZWxmLCB0ZXN0LCBmYWlsdXJlcywgcmVz
dWx0LCBleHBlY3RlZCk6Ci0gICAgICAgICIiIkFkZCBhIHJlc3VsdCBpbnRvIHRoZSBhcHByb3By
aWF0ZSBiaW4uCisgICAgZGVmIGFkZChzZWxmLCByZXN1bHQsIGV4cGVjdGVkKToKKyAgICAgICAg
IiIiQWRkIGEgVGVzdFJlc3VsdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBiaW4uCiAKICAgICAgICAg
QXJnczoKLSAgICAgICAgICB0ZXN0OiB0ZXN0IGZpbGUgbmFtZQotICAgICAgICAgIGZhaWx1cmVz
OiBsaXN0IG9mIGZhaWx1cmUgb2JqZWN0cyBmcm9tIHRlc3QgZXhlY3V0aW9uCi0gICAgICAgICAg
cmVzdWx0OiByZXN1bHQgb2YgdGVzdCAoUEFTUywgSU1BR0UsIGV0Yy4pLgorICAgICAgICAgIHJl
c3VsdDogVGVzdFJlc3VsdCBmcm9tIGR1bXBfcmVuZGVyX3RyZWVfdGhyZWFkLgogICAgICAgICAg
IGV4cGVjdGVkOiB3aGV0aGVyIHRoZSByZXN1bHQgd2FzIHdoYXQgd2UgZXhwZWN0ZWQgaXQgdG8g
YmUuCiAgICAgICAgICIiIgogCi0gICAgICAgIHNlbGYudGVzdHNfYnlfZXhwZWN0YXRpb25bcmVz
dWx0XS5hZGQodGVzdCkKLSAgICAgICAgc2VsZi5yZXN1bHRzW3Rlc3RdID0gcmVzdWx0CisgICAg
ICAgIHNlbGYudGVzdHNfYnlfZXhwZWN0YXRpb25bcmVzdWx0LnR5cGVdLmFkZChyZXN1bHQuZmls
ZW5hbWUpCisgICAgICAgIHNlbGYucmVzdWx0c1tyZXN1bHQuZmlsZW5hbWVdID0gcmVzdWx0LnR5
cGUKICAgICAgICAgc2VsZi5yZW1haW5pbmcgLT0gMQotICAgICAgICBpZiBsZW4oZmFpbHVyZXMp
OgotICAgICAgICAgICAgc2VsZi5mYWlsdXJlc1t0ZXN0XSA9IGZhaWx1cmVzCisgICAgICAgIGlm
IGxlbihyZXN1bHQuZmFpbHVyZXMpOgorICAgICAgICAgICAgc2VsZi5mYWlsdXJlc1tyZXN1bHQu
ZmlsZW5hbWVdID0gcmVzdWx0LmZhaWx1cmVzCiAgICAgICAgIGlmIGV4cGVjdGVkOgogICAgICAg
ICAgICAgc2VsZi5leHBlY3RlZCArPSAxCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxm
LnVuZXhwZWN0ZWRfcmVzdWx0c1t0ZXN0XSA9IHJlc3VsdAorICAgICAgICAgICAgc2VsZi51bmV4
cGVjdGVkX3Jlc3VsdHNbcmVzdWx0LmZpbGVuYW1lXSA9IHJlc3VsdC50eXBlCiAgICAgICAgICAg
ICBzZWxmLnVuZXhwZWN0ZWQgKz0gMQogCiAKQEAgLTM5NCw4ICszOTQsMTEgQEAgY2xhc3MgVGVz
dFJ1bm5lcjoKICAgICAgICAgICAgICMgc3VidHJhY3RlZCBvdXQgb2Ygc2VsZi5fdGVzdF9maWxl
cywgYWJvdmUpLCBidXQgd2Ugc3R1YiBvdXQgdGhlCiAgICAgICAgICAgICAjIHJlc3VsdHMgaGVy
ZSBzbyB0aGUgc3RhdGlzdGljcyBjYW4gcmVtYWluIGFjY3VyYXRlLgogICAgICAgICAgICAgZm9y
IHRlc3QgaW4gc2tpcF9jaHVuazoKLSAgICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeS5hZGQo
dGVzdCwgW10sIHRlc3RfZXhwZWN0YXRpb25zLlNLSVAsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGV4cGVjdGVkPVRydWUpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZHVt
cF9yZW5kZXJfdHJlZV90aHJlYWQuVGVzdFJlc3VsdCh0ZXN0LAorICAgICAgICAgICAgICAgICAg
ICBmYWlsdXJlcz1bXSwgdGVzdF9ydW5fdGltZT0wLCB0b3RhbF90aW1lX2Zvcl9hbGxfZGlmZnM9
MCwKKyAgICAgICAgICAgICAgICAgICAgdGltZV9mb3JfZGlmZnM9MCkKKyAgICAgICAgICAgICAg
ICByZXN1bHQudHlwZSA9IHRlc3RfZXhwZWN0YXRpb25zLlNLSVAKKyAgICAgICAgICAgICAgICBy
ZXN1bHRfc3VtbWFyeS5hZGQocmVzdWx0LCBleHBlY3RlZD1UcnVlKQogICAgICAgICB3cml0ZSgi
IikKIAogICAgICAgICByZXR1cm4gcmVzdWx0X3N1bW1hcnkKQEAgLTYwMiw3ICs2MDUsNyBAQCBj
bGFzcyBUZXN0UnVubmVyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
J3RvdGFsX3RpbWUnOiB0aHJlYWQuZ2V0X3RvdGFsX3RpbWUoKX0pCiAgICAgICAgICAgICAgICAg
dGVzdF90aW1pbmdzLnVwZGF0ZSh0aHJlYWQuZ2V0X2RpcmVjdG9yeV90aW1pbmdfc3RhdHMoKSkK
ICAgICAgICAgICAgICAgICBpbmRpdmlkdWFsX3Rlc3RfdGltaW5ncy5leHRlbmQoCi0gICAgICAg
ICAgICAgICAgICAgIHRocmVhZC5nZXRfaW5kaXZpZHVhbF90ZXN0X3N0YXRzKCkpCisgICAgICAg
ICAgICAgICAgICAgIHRocmVhZC5nZXRfdGVzdF9yZXN1bHRzKCkpCiAgICAgICAgIGV4Y2VwdCBL
ZXlib2FyZEludGVycnVwdDoKICAgICAgICAgICAgIGZvciB0aHJlYWQgaW4gdGhyZWFkczoKICAg
ICAgICAgICAgICAgICB0aHJlYWQuY2FuY2VsKCkKQEAgLTcxOSwyNyArNzIyLDU4IEBAIGNsYXNz
IFRlc3RSdW5uZXI6CiAgICAgICAgIHJldHVybiB1bmV4cGVjdGVkX3Jlc3VsdHNbJ251bV9yZWdy
ZXNzaW9ucyddCiAKICAgICBkZWYgdXBkYXRlX3N1bW1hcnkoc2VsZiwgcmVzdWx0X3N1bW1hcnkp
OgotICAgICAgICAiIiJVcGRhdGUgdGhlIHN1bW1hcnkgd2hpbGUgcnVubmluZyB0ZXN0cy4iIiIK
KyAgICAgICAgIiIiVXBkYXRlIHRoZSBzdW1tYXJ5IGFuZCBwcmludCByZXN1bHRzIHdpdGggYW55
IGNvbXBsZXRlZCB0ZXN0cy4iIiIKICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIHRy
eToKLSAgICAgICAgICAgICAgICAodGVzdCwgZmFpbF9saXN0KSA9IHNlbGYuX3Jlc3VsdF9xdWV1
ZS5nZXRfbm93YWl0KCkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0ZXN0X2ZhaWx1cmVzLmRl
dGVybWluZV9yZXN1bHRfdHlwZShmYWlsX2xpc3QpCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWQg
PSBzZWxmLl9leHBlY3RhdGlvbnMubWF0Y2hlc19hbl9leHBlY3RlZF9yZXN1bHQodGVzdCwKLSAg
ICAgICAgICAgICAgICAgICAgcmVzdWx0LCBzZWxmLl9vcHRpb25zLnBpeGVsX3Rlc3RzKQotICAg
ICAgICAgICAgICAgIHJlc3VsdF9zdW1tYXJ5LmFkZCh0ZXN0LCBmYWlsX2xpc3QsIHJlc3VsdCwg
ZXhwZWN0ZWQpCi0gICAgICAgICAgICAgICAgaWYgKExPR19ERVRBSUxFRF9QUk9HUkVTUyBpbiBz
ZWxmLl9vcHRpb25zLmxvZyBhbmQKLSAgICAgICAgICAgICAgICAgICAgKHNlbGYuX29wdGlvbnMu
ZXhwZXJpbWVudGFsX2Z1bGx5X3BhcmFsbGVsIG9yCi0gICAgICAgICAgICAgICAgICAgICBzZWxm
Ll9pc19zaW5nbGVfdGhyZWFkZWQoKSkpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLl9kaXNw
bGF5X2RldGFpbGVkX3Byb2dyZXNzKHJlc3VsdF9zdW1tYXJ5KQotICAgICAgICAgICAgICAgIGVs
c2U6Ci0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBleHBlY3RlZCBhbmQgTE9HX1VORVhQRUNU
RUQgaW4gc2VsZi5fb3B0aW9ucy5sb2c6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9w
cmludF91bmV4cGVjdGVkX3Rlc3RfcmVzdWx0KHRlc3QsIHJlc3VsdCkKLSAgICAgICAgICAgICAg
ICAgICAgaWYgTE9HX1BST0dSRVNTIGluIHNlbGYuX29wdGlvbnMubG9nOgotICAgICAgICAgICAg
ICAgICAgICAgICAgc2VsZi5fZGlzcGxheV9vbmVfbGluZV9wcm9ncmVzcyhyZXN1bHRfc3VtbWFy
eSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9yZXN1bHRfcXVldWUuZ2V0X25vd2Fp
dCgpCiAgICAgICAgICAgICBleGNlcHQgUXVldWUuRW1wdHk6CiAgICAgICAgICAgICAgICAgcmV0
dXJuCi0KLSAgICBkZWYgX2Rpc3BsYXlfb25lX2xpbmVfcHJvZ3Jlc3Moc2VsZiwgcmVzdWx0X3N1
bW1hcnkpOgorICAgICAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLl9leHBlY3RhdGlvbnMubWF0Y2hl
c19hbl9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgICAgICAgICAgcmVzdWx0LmZpbGVuYW1lLCBy
ZXN1bHQudHlwZSwgc2VsZi5fb3B0aW9ucy5waXhlbF90ZXN0cykKKyAgICAgICAgICAgIHJlc3Vs
dF9zdW1tYXJ5LmFkZChyZXN1bHQsIGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRf
dGVzdF9yZXN1bHRzKHJlc3VsdCwgZXhwZWN0ZWQsIHJlc3VsdF9zdW1tYXJ5KQorCisgICAgZGVm
IF9wcmludF90ZXN0X3Jlc3VsdHMoc2VsZiwgcmVzdWx0LCBleHBlY3RlZCwgcmVzdWx0X3N1bW1h
cnkpOgorICAgICAgICAiUHJpbnQgdGhlIHJlc3VsdCBvZiB0aGUgdGVzdCBhcyBkZXRlcm1pbmVk
IGJ5IHRoZSAtLWxvZyBzd2l0Y2hlcy4iCisgICAgICAgIGlmIExPR19UUkFDRSBpbiBzZWxmLl9v
cHRpb25zLmxvZzoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfdHJhY2UocmVzdWx0KQor
ICAgICAgICBlbGlmIChMT0dfREVUQUlMRURfUFJPR1JFU1MgaW4gc2VsZi5fb3B0aW9ucy5sb2cg
YW5kCisgICAgICAgICAgICAgIChzZWxmLl9vcHRpb25zLmV4cGVyaW1lbnRhbF9mdWxseV9wYXJh
bGxlbCBvcgorICAgICAgICAgICAgICAgc2VsZi5faXNfc2luZ2xlX3RocmVhZGVkKCkpKToKKyAg
ICAgICAgICAgIHNlbGYuX3ByaW50X2RldGFpbGVkX3Byb2dyZXNzKHJlc3VsdF9zdW1tYXJ5KQor
ICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgKG5vdCBleHBlY3RlZCBhbmQgTE9HX1VORVhQ
RUNURUQgaW4gc2VsZi5fb3B0aW9ucy5sb2cpOgorICAgICAgICAgICAgICAgIHNlbGYuX3ByaW50
X3VuZXhwZWN0ZWRfdGVzdF9yZXN1bHQocmVzdWx0KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRf
b25lX2xpbmVfcHJvZ3Jlc3MocmVzdWx0X3N1bW1hcnkpCisKKyAgICBkZWYgX3ByaW50X3Rlc3Rf
dHJhY2Uoc2VsZiwgcmVzdWx0KToKKyAgICAgICAgIiIiUHJpbnQgZGV0YWlsZWQgcmVzdWx0cyBv
ZiBhIHRlc3QgKHRyaWdnZXJlZCBieSAtLWxvZyB0cmFjZSkuCisgICAgICAgIEZvciBlYWNoIHRl
c3QsIHByaW50OgorICAgICAgICAgICAtIGxvY2F0aW9uIG9mIHRoZSBleHBlY3RlZCBiYXNlbGlu
ZXMKKyAgICAgICAgICAgLSBleHBlY3RlZCByZXN1bHRzCisgICAgICAgICAgIC0gYWN0dWFsIHJl
c3VsdAorICAgICAgICAgICAtIHRpbWluZyBpbmZvCisgICAgICAgICIiIgorICAgICAgICBmaWxl
bmFtZSA9IHJlc3VsdC5maWxlbmFtZQorICAgICAgICB0ZXN0X25hbWUgPSBzZWxmLl9wb3J0LnJl
bGF0aXZlX3Rlc3RfZmlsZW5hbWUoZmlsZW5hbWUpCisgICAgICAgIF9sb2cuaW5mbygndHJhY2U6
ICVzJyAlIHRlc3RfbmFtZSkKKyAgICAgICAgX2xvZy5pbmZvKCcgIHR4dDogJXMnICUKKyAgICAg
ICAgICAgICAgICAgIHNlbGYuX3BvcnQucmVsYXRpdmVfdGVzdF9maWxlbmFtZSgKKyAgICAgICAg
ICAgICAgICAgICAgICAgc2VsZi5fcG9ydC5leHBlY3RlZF9maWxlbmFtZShmaWxlbmFtZSwgJy50
eHQnKSkpCisgICAgICAgIHBuZ19maWxlID0gc2VsZi5fcG9ydC5leHBlY3RlZF9maWxlbmFtZShm
aWxlbmFtZSwgJy5wbmcnKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwbmdfZmlsZSk6Cisg
ICAgICAgICAgICBfbG9nLmluZm8oJyAgcG5nOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAg
IHNlbGYuX3BvcnQucmVsYXRpdmVfdGVzdF9maWxlbmFtZShmaWxlbmFtZSkpCisgICAgICAgIGVs
c2U6CisgICAgICAgICAgICBfbG9nLmluZm8oJyAgcG5nOiA8bm9uZT4nKQorICAgICAgICBfbG9n
LmluZm8oJyAgZXhwOiAlcycgJQorICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwZWN0YXRpb25z
LmdldF9leHBlY3RhdGlvbnNfc3RyaW5nKGZpbGVuYW1lKSkKKyAgICAgICAgX2xvZy5pbmZvKCcg
IGdvdDogJXMnICUKKyAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cGVjdGF0aW9ucy5leHBlY3Rh
dGlvbl90b19zdHJpbmcocmVzdWx0LnR5cGUpKQorICAgICAgICBfbG9nLmluZm8oJyB0b29rOiAl
LS4zZicgJSByZXN1bHQudGVzdF9ydW5fdGltZSkKKyAgICAgICAgX2xvZy5pbmZvKCcnKQorCisg
ICAgZGVmIF9wcmludF9vbmVfbGluZV9wcm9ncmVzcyhzZWxmLCByZXN1bHRfc3VtbWFyeSk6CiAg
ICAgICAgICIiIkRpc3BsYXlzIHRoZSBwcm9ncmVzcyB0aHJvdWdoIHRoZSB0ZXN0IHJ1bi4iIiIK
ICAgICAgICAgcGVyY2VudF9jb21wbGV0ZSA9IDEwMCAqIChyZXN1bHRfc3VtbWFyeS5leHBlY3Rl
ZCArCiAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeS51bmV4cGVjdGVkKSAvIHJlc3VsdF9zdW1t
YXJ5LnRvdGFsCkBAIC03NTAsNyArNzg0LDcgQEAgY2xhc3MgVGVzdFJ1bm5lcjoKICAgICAgICAg
ICAgICIgJWQgbGVmdCIgJSAoYWN0aW9uLCBwZXJjZW50X2NvbXBsZXRlLCByZXN1bHRfc3VtbWFy
eS5leHBlY3RlZCwKICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeS51bmV4cGVjdGVkLCByZXN1
bHRfc3VtbWFyeS5yZW1haW5pbmcpKQogCi0gICAgZGVmIF9kaXNwbGF5X2RldGFpbGVkX3Byb2dy
ZXNzKHNlbGYsIHJlc3VsdF9zdW1tYXJ5KToKKyAgICBkZWYgX3ByaW50X2RldGFpbGVkX3Byb2dy
ZXNzKHNlbGYsIHJlc3VsdF9zdW1tYXJ5KToKICAgICAgICAgIiIiRGlzcGxheSBkZXRhaWxlZCBw
cm9ncmVzcyBvdXRwdXQgd2hlcmUgd2UgcHJpbnQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICAgICAg
IGFuZCBvbmUgZG90IGZvciBlYWNoIGNvbXBsZXRlZCB0ZXN0LiBUaGlzIGlzIHRyaWdnZXJlZCBi
eQogICAgICAgICAiLS1sb2cgZGV0YWlsZWQtcHJvZ3Jlc3MiLiIiIgpAQCAtNzk0LDYgKzgyOCwx
MyBAQCBjbGFzcyBUZXN0UnVubmVyOgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5f
bWV0ZXIucHJvZ3Jlc3MoIiVzXG4iICUgKHNlbGYuX2N1cnJlbnRfcHJvZ3Jlc3Nfc3RyKSkKIAor
ICAgIGRlZiBfcHJpbnRfdW5leHBlY3RlZF90ZXN0X3Jlc3VsdChzZWxmLCByZXN1bHQpOgorICAg
ICAgICAiIiJQcmludHMgb25lIHVuZXhwZWN0ZWQgdGVzdCByZXN1bHQgbGluZS4iIiIKKyAgICAg
ICAgZGVzYyA9IFRlc3RFeHBlY3RhdGlvbnNGaWxlLkVYUEVDVEFUSU9OX0RFU0NSSVBUSU9OU1ty
ZXN1bHQudHlwZV1bMF0KKyAgICAgICAgc2VsZi5fbWV0ZXIud3JpdGUoIiAgJXMgLT4gdW5leHBl
Y3RlZCAlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9wb3J0LnJlbGF0
aXZlX3Rlc3RfZmlsZW5hbWUocmVzdWx0LmZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRlc2MpKQorCiAgICAgZGVmIF9nZXRfZmFpbHVyZXMoc2VsZiwgcmVzdWx0X3N1bW1h
cnksIGluY2x1ZGVfY3Jhc2hlcyk6CiAgICAgICAgICIiIkZpbHRlcnMgYSBkaWN0IG9mIHJlc3Vs
dHMgYW5kIHJldHVybnMgb25seSB0aGUgZmFpbHVyZXMuCiAKQEAgLTEzMDcsMTIgKzEzNDgsNiBA
QCBjbGFzcyBUZXN0UnVubmVyOgogICAgICAgICBpZiBsZW4odW5leHBlY3RlZF9yZXN1bHRzWyd0
ZXN0cyddKSBhbmQgc2VsZi5fb3B0aW9ucy52ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgIi0i
ICogNzgKIAotICAgIGRlZiBfcHJpbnRfdW5leHBlY3RlZF90ZXN0X3Jlc3VsdChzZWxmLCB0ZXN0
LCByZXN1bHQpOgotICAgICAgICAiIiJQcmludHMgb25lIHVuZXhwZWN0ZWQgdGVzdCByZXN1bHQg
bGluZS4iIiIKLSAgICAgICAgZGVzYyA9IFRlc3RFeHBlY3RhdGlvbnNGaWxlLkVYUEVDVEFUSU9O
X0RFU0NSSVBUSU9OU1tyZXN1bHRdWzBdCi0gICAgICAgIHNlbGYuX21ldGVyLndyaXRlKCIgICVz
IC0+IHVuZXhwZWN0ZWQgJXNcbiIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5f
cG9ydC5yZWxhdGl2ZV90ZXN0X2ZpbGVuYW1lKHRlc3QpLCBkZXNjKSkKLQogICAgIGRlZiBfd3Jp
dGVfcmVzdWx0c19odG1sX2ZpbGUoc2VsZiwgcmVzdWx0X3N1bW1hcnkpOgogICAgICAgICAiIiJX
cml0ZSByZXN1bHRzLmh0bWwgd2hpY2ggaXMgYSBzdW1tYXJ5IG9mIHRlc3RzIHRoYXQgZmFpbGVk
LgogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53935</attachid>
            <date>2010-04-21 02:45:53 -0700</date>
            <delta_ts>2010-04-21 10:04:23 -0700</delta_ts>
            <desc>Attempt to fix test-webkitpy</desc>
            <filename>bug-37726-20100421024551.patch</filename>
            <type>text/plain</type>
            <size>1945</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA4MWM5ZDE0Li4yNGYzZGQxIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0yLDYgKzIsMTkgQEAKIAogICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KIAorICAgICAgICBuZXctcnVuLXdlYmtpdC10
ZXN0czogaW1wbGVtZW50IGEgLS1sb2cgdHJhY2UgbWVzc2FnZSB0byBiZSBhYmxlIHRvIGRpc3Bs
YXkgZGV0YWlsZWQgb3V0cHV0IG9mIGFuIGluZGl2aWR1YWwgdGVzdCBydW4KKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM3NzI2CisKKyAgICAgICAgVGhp
cyBjaGFuZ2Ugc2VlbXMgdG8gaGF2ZSBicm9rZW4gYSB0ZXN0LgorICAgICAgICBBdHRlbXB0aW5n
IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBkb24ndCBoYXZlIGFueQorICAgICAgICB0aW1p
bmcgaW5mb3JtYXRpb24uICBEaXJrIG1heSBoYXZlIHRvIGNvcnJlY3QgdGhpcyBjaGFuZ2UuCisK
KyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3Rz
LnB5OgorCisyMDEwLTA0LTIxICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwogICAgICAgICBSRUdSRVNTSU9OKDU3
NTMxKTogdGhlIGNvbW1pdC1xdWV1ZSBzdGlsbCBoYXRlcyBUb3IgQXJuZSBWZXN0YsO4CiAgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzc2NQogCmRpZmYg
LS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Vi
a2l0X3Rlc3RzLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cnVuX3dlYmtpdF90ZXN0cy5weQppbmRleCAwZDdlZWE0Li42ZTFkYTc2IDEwMDc1NQotLS0gYS9X
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9ydW5fd2Via2l0X3Rlc3Rz
LnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3J1bl93
ZWJraXRfdGVzdHMucHkKQEAgLTEwNTksNyArMTA1OSw5IEBAIGNsYXNzIFRlc3RSdW5uZXI6CiAg
ICAgICAgICAgaW5kaXZpZHVhbF90ZXN0X3RpbWluZ3M6IExpc3Qgb2YgZHVtcF9yZW5kZXJfdHJl
ZV90aHJlYWQuVGVzdFN0YXRzCiAgICAgICAgICAgICAgIGZvciBhbGwgdGVzdHMuCiAgICAgICAg
ICIiIgotICAgICAgICB0ZXN0X3R5cGVzID0gaW5kaXZpZHVhbF90ZXN0X3RpbWluZ3NbMF0udGlt
ZV9mb3JfZGlmZnMua2V5cygpCisgICAgICAgIHRlc3RfdHlwZXMgPSBbXSAgIyBVbml0IHRlc3Rz
IGRvbid0IGFjdHVhbGx5IHByb2R1Y2UgYW55IHRpbWluZ3MuCisgICAgICAgIGlmIGluZGl2aWR1
YWxfdGVzdF90aW1pbmdzOgorICAgICAgICAgICAgdGVzdF90eXBlcyA9IGluZGl2aWR1YWxfdGVz
dF90aW1pbmdzWzBdLnRpbWVfZm9yX2RpZmZzLmtleXMoKQogICAgICAgICB0aW1lc19mb3JfZHVt
cF9yZW5kZXJfdHJlZSA9IFtdCiAgICAgICAgIHRpbWVzX2Zvcl9kaWZmX3Byb2Nlc3NpbmcgPSBb
XQogICAgICAgICB0aW1lc19wZXJfdGVzdF90eXBlID0ge30KQEAgLTExOTEsNiArMTE5Myw4IEBA
IGNsYXNzIFRlc3RSdW5uZXI6CiAgICAgICAgIHRpbWluZ3Muc29ydCgpCiAKICAgICAgICAgbnVt
X3Rlc3RzID0gbGVuKHRpbWluZ3MpCisgICAgICAgIGlmIG5vdCBudW1fdGVzdHM6CisgICAgICAg
ICAgICByZXR1cm4KICAgICAgICAgcGVyY2VudGlsZTkwID0gdGltaW5nc1tpbnQoLjkgKiBudW1f
dGVzdHMpXQogICAgICAgICBwZXJjZW50aWxlOTkgPSB0aW1pbmdzW2ludCguOTkgKiBudW1fdGVz
dHMpXQogCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>