<?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>63883</bug_id>
          
          <creation_ts>2011-07-03 19:04:24 -0700</creation_ts>
          <short_desc>Make SCM unit tests faster</short_desc>
          <delta_ts>2011-07-06 12:10:42 -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>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Daniel Bates">dbates</reporter>
          <assigned_to name="Daniel Bates">dbates</assigned_to>
          <cc>abarth</cc>
    
    <cc>cjerdonek</cc>
    
    <cc>eric</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>431770</commentid>
    <comment_count>0</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-07-03 19:04:24 -0700</bug_when>
    <thetext>The SCM unit tests are very slow. We should speed them up.

I used Python&apos;s cProfile module to profile test-webkitpy on my Mac Mini and looking at only scm/scm_unittests funtions, sorted by cumulative time, we have:

   524364 function calls (519838 primitive calls) in 851.587 CPU seconds

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       94    0.038    0.000  711.856    7.573 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:149(setup)
       59    0.010    0.000  516.529    8.755 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:934(setUp)
       94    0.030    0.000  469.979    5.000 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:113(_setup_test_commits)
      471    0.017    0.000  464.249    0.986 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:109(_svn_commit)
       35    0.003    0.000  272.737    7.792 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:586(setUp)
       60    0.008    0.000   75.167    1.253 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:66(run_silent)
       59    0.008    0.000   74.148    1.257 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:923(_setup_git_checkout)
      265    0.016    0.000   17.215    0.065 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/detection.py:72(detect_scm_system)
       94    0.012    0.000   11.979    0.127 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:177(tear_down)
       59    0.006    0.000    8.359    0.142 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:943(tearDown)

Notice, GitSVNTest.setUp() (scm_unittest.py:934) and SCMTest.setUp() (scm_unittest.py:586) call SVNTestRepository.setup() (scm_unittest.py:149). And SVNTestRepository.setup() has a cumulative time of 711.856 seconds.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>431771</commentid>
    <comment_count>1</comment_count>
      <attachid>99589</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-07-03 19:16:32 -0700</bug_when>
    <thetext>Created attachment 99589
Patch

Profiling with this patch:

   581795 function calls (573917 primitive calls) in 205.441 CPU seconds

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       59    0.010    0.000  113.431    1.923 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:967(setUp)
       60    0.005    0.000   76.073    1.268 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:80(run_silent)
       59    0.008    0.000   75.076    1.272 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:956(_setup_git_checkout)
       94    0.011    0.000   62.900    0.669 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:172(setup)
       35    0.003    0.000   28.019    0.801 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:619(setUp)
      265    0.016    0.000   17.359    0.066 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/detection.py:72(detect_scm_system)
       94    0.006    0.000   11.032    0.117 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:211(tear_down)
        1    0.000    0.000    8.149    8.149 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:185(_setup_mock_repo)
       59    0.006    0.000    7.821    0.133 /Users/dbates/Desktop/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:976(tearDown)

I moved the actual creation of the mock SVN repo from SVNTestRepository.setup() into SVNTestRepository._setup_mock_repo(). The first call to SVNTestRepository.setup() calls SVNTestRepository._setup_mock_repo() once then subsequent calls creates a filesystem copy of the mock SVN repo M and performs an SVN checkout of M.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>431772</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-07-03 19:19:15 -0700</bug_when>
    <thetext>Attachment 99589 did not pass style-queue:

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

Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:65:  expected 2 blank lines, found 1  [pep8/E302] [5]
Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:70:  expected 2 blank lines, found 1  [pep8/E302] [5]
Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:188:  at least two spaces before inline comment  [pep8/E261] [5]
Total errors found: 3 in 2 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>431773</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-07-03 19:21:48 -0700</bug_when>
    <thetext>I &lt;3 dan-the-man bates.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432027</commentid>
    <comment_count>4</comment_count>
      <attachid>99653</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-07-04 13:15:54 -0700</bug_when>
    <thetext>Created attachment 99653
Patch

Fixes style issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432094</commentid>
    <comment_count>5</comment_count>
      <attachid>99653</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-07-04 20:26:20 -0700</bug_when>
    <thetext>Comment on attachment 99653
Patch

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

I like this patch.  I&apos;m not sure I 100% follow.  Perhaps once you respond to my comments I will.

&gt; Tools/ChangeLog:8
&gt; +        Speeds up the SCM unit tests by a factor of 4. Currently, we create a
&gt; +        mock SVN repo for each test_ method in SVNTest and GitTest and creating
&gt; +        this repo is expensive.

Is this still the slowest step after your speedup?  Is there more work to do here?

&gt; Tools/ChangeLog:17
&gt; +
&gt; +        Note, Python 2.7&apos;s unittest module implements support for per class and
&gt; +        per module setup and tear down methods which could be used to implement
&gt; +        similar functionality. At the time of writing, test-webkitpy is designed
&gt; +        to support Python 2.5. So, we can&apos;t take advantage of these Python 2.7
&gt; +        features :(

Could we instead use a global instance of some class with a destructor?  I&apos;m not sure if destructors are run at shutdown.  It feels like our current hack to implement this is poorly encapsulated.

&gt; Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:172
&gt; +    # GitTest. We create a mock SVN repo once and then perform an SVN checkout from a filesystem copy of
&gt; +    # it since it&apos;s expensive to create the mock repo.

Why do we even do a checkout?  Why not just cp the original shared checkout?  Wouldn&apos;t that be even faster?

&gt; Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:183
&gt; +        shutil.copytree(cached_svn_repo_path, test_object.svn_repo_path)

Maybe you are just copying?  I&apos;m not sure I understand what&apos;s going on here.

&gt; Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:193
&gt; -        run_command([&apos;svnadmin&apos;, &apos;create&apos;, &apos;--pre-1.5-compatible&apos;, test_object.svn_repo_path])
&gt; +        run_command([&apos;svnadmin&apos;, &apos;create&apos;, &apos;--pre-1.5-compatible&apos;, svn_repo_path])

I wonder why we&apos;re still passing the 1.5-compat flag here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432095</commentid>
    <comment_count>6</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-07-04 20:27:22 -0700</bug_when>
    <thetext>It looks like svn setup is still hot. And git import from the svn is also still hot.  Should we look at caching the git one as well?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432106</commentid>
    <comment_count>7</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-07-04 22:52:14 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 99653 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=99653&amp;action=review
&gt; 
&gt; I like this patch.  I&apos;m not sure I 100% follow.  Perhaps once you respond to my comments I will.
&gt; 
&gt; &gt; Tools/ChangeLog:8
&gt; &gt; +        Speeds up the SCM unit tests by a factor of 4. Currently, we create a
&gt; &gt; +        mock SVN repo for each test_ method in SVNTest and GitTest and creating
&gt; &gt; +        this repo is expensive.
&gt; 
&gt; Is this still the slowest step after your speedup?

No, the slowest step after this speedup patch is GitTest.setUp() (with a cumulative time of 113.431 seconds).  SVNTest.setup() is still slow with a cumulative time of 62.9 seconds, but it use to have a cumulative time of 711.856 seconds.

&gt; Is there more work to do here?

More work can be done to further speed things up. For example, test cases that don&apos;t modify the state of the repo, say SVNTest.test_added_files(), could use a copy of an SVN checkout.

&gt; 
&gt; &gt; Tools/ChangeLog:17
&gt; &gt; +
&gt; &gt; +        Note, Python 2.7&apos;s unittest module implements support for per class and
&gt; &gt; +        per module setup and tear down methods which could be used to implement
&gt; &gt; +        similar functionality. At the time of writing, test-webkitpy is designed
&gt; &gt; +        to support Python 2.5. So, we can&apos;t take advantage of these Python 2.7
&gt; &gt; +        features :(
&gt; 
&gt; Could we instead use a global instance of some class with a destructor?  I&apos;m not sure if destructors are run at shutdown.  It feels like our current hack to implement this is poorly encapsulated.
&gt;

I&apos;ll look into this.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:172
&gt; &gt; +    # GitTest. We create a mock SVN repo once and then perform an SVN checkout from a filesystem copy of
&gt; &gt; +    # it since it&apos;s expensive to create the mock repo.
&gt; 
&gt; Why do we even do a checkout? 

We perform a new checkout so as to associate it with the URL to the newly copied SVN repo. And we create a copy of the SVN repo to ensure that that SVN operations in one test don&apos;t affect the state of the repo seen in another test. We probably could repurpose a single SVN checkout by changing the repository URL. We could address this repurposing of the SVN checkout in a subsequent bug.

&gt; Why not just cp the original shared checkout?  

Notice that a commit to an SVN checkout isn&apos;t local in the sense of a &quot;git commit&quot;. That is, when you run &quot;svn commit&quot; it sends the changes in your working copy to the SVN repository. Copying an SVN checkout directory would only copy any non-committed changes. We want to present a consistent SVN repository state for each test.

Some of the test methods ultimately &quot;svn commit&quot; to their checkout which records a new revision in the associated SVN repo and hence affects the results of other tests that depend on the revision history of the SVN repo.

For example, SVNTest.test_revisions_changing_file() ultimately asserts that the file test_file was changed in revisions [5, 4, 3, 2] (see remark (*)). Notice the test SVNTest.test_commit_text_parsing() commits a change this file. Suppose SVNTest.test_commit_text_parsing() is run before SVNTest.test_revisions_changing_file(). Then SVNTest.test_revisions_changing_file() will fail because the revision list for file test_file is [6, 5, 4, 3, 2] != [5, 4, 3, 2].

(*) This revision list was built up by in SVNTestRepository._setup_test_commits(). Notice, the first revision in the repo is the creation of the directory trunk.

&gt; Wouldn&apos;t that be even faster?

Yes, it would be faster if we just copied the SVN checkout. We need to take care of when we do this so that one test doesn&apos;t affect another test. See the aforementioned discussion above.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:183
&gt; &gt; +        shutil.copytree(cached_svn_repo_path, test_object.svn_repo_path)
&gt; 
&gt; Maybe you are just copying?  I&apos;m not sure I understand what&apos;s going on here.

Yes, this line copies the SVN repository directory, located at cached_svn_repo_path, to a temporary directory at test_object.svn_repo_path. As aforementioned, we make a copy of the repo directory instead of the checkout directory because it&apos;s the repo that holds all of the state. By creating a copy of the repo before each test we can ensure that each test starts off with a repo with 5 test commits (see SVNTestRepository._setup_test_commits())

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:193
&gt; &gt; -        run_command([&apos;svnadmin&apos;, &apos;create&apos;, &apos;--pre-1.5-compatible&apos;, test_object.svn_repo_path])
&gt; &gt; +        run_command([&apos;svnadmin&apos;, &apos;create&apos;, &apos;--pre-1.5-compatible&apos;, svn_repo_path])
&gt; 
&gt; I wonder why we&apos;re still passing the 1.5-compat flag here?

I take it that we pass this compatibility flag to support Subversion 1.4 under Mac OS 10.4 Tiger as documented on &lt;http://www.webkit.org/building/checkout.html&gt;. Since support for Tiger has been phased out we can remove this --pre-1.5-compatible flag and update the WebKit.org checkout page. I suggest making such changes in a separate bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432107</commentid>
    <comment_count>8</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-07-04 22:53:01 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; It looks like svn setup is still hot. And git import from the svn is also still hot.  Should we look at caching the git one as well?

Yes, we should look into this further.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432108</commentid>
    <comment_count>9</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-07-04 23:07:02 -0700</bug_when>
    <thetext>I see.  I forgot that we actually pushed to the svn &quot;server&quot;.

We could copy both the server and checkout to save the checkout.  But you&apos;re right, you might have to do an svn switch to change the url to point to the newly copied checkout.  I&apos;m not sure how much faster a cp + svn switch would be vs. just a normal svn checkout.

This patch is a huge win and I&apos;m happy to have you land it as-is.  I&apos;m also happy to review any further revisions you&apos;d like to post.  Completely up to you.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432109</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-07-04 23:09:44 -0700</bug_when>
    <thetext>I also just realized we could consider using function decorators to do the setup instead of using setup/teardown.

See memoized.py for an example of a function decorator declared in webkitpy.

That would allow us to do things like:

@svncheckout

@readonlysvncheckout

@gitcheckout

etc, and instead of having class-wide setup we could have per-function setup.

I suspect this is completely orthogonal to the change under consideration, but it just occurred to me and so I thought I&apos;d record it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432893</commentid>
    <comment_count>11</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-07-06 11:32:29 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Could we instead use a global instance of some class with a destructor?

I&apos;m unclear how to accomplish this given Python&apos;s sequencing of destructors. We eventually need some functionality to actually delete the directory and this functionality may not be available when we&apos;re called: &quot;...when __del__() is invoked in response to a module being deleted (e.g., when execution of the program is done), other globals referenced by the __del__() method may already have been deleted or in the process of being torn down (e.g. the import machinery shutting down).&quot; (&lt;http://docs.python.org/reference/datamodel.html#customization&gt;) 

&gt; I&apos;m not sure if destructors are run at shutdown.

From reading &lt;http://docs.python.org/reference/datamodel.html#customization&gt;, it states that &quot;It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.&quot;

&gt; It feels like our current hack to implement this is poorly encapsulated.

Yes, I&apos;m not happy with the atexit() and global variable usage. I am open to other suggestions on how to encapsulate this cleanup functionality.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432895</commentid>
    <comment_count>12</comment_count>
      <attachid>99653</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-07-06 11:35:56 -0700</bug_when>
    <thetext>Comment on attachment 99653
Patch

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

&gt; Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:75
&gt; +# We cache the mock SVN repo so that we don&apos;t create it again for each call to an SVNTest or GitTest test_ method.
&gt; +# We store it in a global variable so that we can delete this cached repo on exit(3).
&gt; +cached_svn_repo_path = None
&gt; +
&gt; +
&gt; +def remove_dir(path):
&gt; +    # Change directory to / to ensure that we aren&apos;t in the directory we want to delete.
&gt; +    os.chdir(&apos;/&apos;)
&gt; +    shutil.rmtree(path)
&gt; +
&gt; +
&gt; +@atexit.register
&gt; +def delete_cached_mock_repo_at_exit():
&gt; +    if cached_svn_repo_path:
&gt; +        remove_dir(cached_svn_repo_path)

Just add a FIXME That this all goes away when we move to 2.7.  LGTM.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432897</commentid>
    <comment_count>13</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-07-06 11:37:51 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; &gt; Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py:75
&gt; &gt; +# We cache the mock SVN repo so that we don&apos;t create it again for each call to an SVNTest or GitTest test_ method.
&gt; &gt; +# We store it in a global variable so that we can delete this cached repo on exit(3).
&gt; &gt; +cached_svn_repo_path = None
&gt;&gt; [...]
&gt; &gt; +@atexit.register
&gt; &gt; +def delete_cached_mock_repo_at_exit():
&gt; &gt; +    if cached_svn_repo_path:
&gt; &gt; +        remove_dir(cached_svn_repo_path)
&gt; 
&gt; Just add a FIXME That this all goes away when we move to 2.7.  LGTM.

Will do. Thanks for the review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432928</commentid>
    <comment_count>14</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-07-06 12:10:42 -0700</bug_when>
    <thetext>Committed r90480: &lt;http://trac.webkit.org/changeset/90480&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99589</attachid>
            <date>2011-07-03 19:16:32 -0700</date>
            <delta_ts>2011-07-04 13:15:54 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug63883.patch</filename>
            <type>text/plain</type>
            <size>6888</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDkwMzQ4KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMjUgQEAKKzIwMTEtMDctMDMgIERhbmllbCBCYXRlcyAgPGRiYXRlc0B3ZWJraXQub3JnPgor
CisgICAgICAgIE1ha2UgU0NNIHVuaXQgdGVzdHMgZmFzdGVyCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzg4MworCisgICAgICAgIFNwZWVkcyB1cCB0
aGUgU0NNIHVuaXQgdGVzdHMgYnkgYSBmYWN0b3Igb2YgNC4gQ3VycmVudGx5LCB3ZSBjcmVhdGUg
YQorICAgICAgICBtb2NrIFNWTiByZXBvIGZvciBlYWNoIHRlc3RfIG1ldGhvZCBpbiBTVk5UZXN0
IGFuZCBHaXRUZXN0IGFuZCBjcmVhdGluZworICAgICAgICB0aGlzIHJlcG8gaXMgZXhwZW5zaXZl
LgorCisgICAgICAgIEluc3RlYWQsIGl0IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRvIGNyZWF0
ZSB0aGUgbW9jayBTVk4gcmVwbyBvbmNlCisgICAgICAgIGFuZCB0aGVuIHBlcmZvcm0gYSBmaWxl
c3lzdGVtIGNvcHkgb2YgaXQgZm9yIGVhY2ggdGVzdF8gbWV0aG9kLgorCisgICAgICAgIE5vdGUs
IFB5dGhvbiAyLjcncyB1bml0dGVzdCBtb2R1bGUgaW1wbGVtZW50cyBzdXBwb3J0IGZvciBwZXIg
Y2xhc3MgYW5kCisgICAgICAgIHBlciBtb2R1bGUgc2V0dXAgYW5kIHRlYXIgZG93biBtZXRob2Rz
IHdoaWNoIGNvdWxkIGJlIHVzZWQgdG8gaW1wbGVtZW50CisgICAgICAgIHNpbWlsYXIgZnVuY3Rp
b25hbGl0eS4gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZywgdGVzdC13ZWJraXRweSBpcyBkZXNpZ25l
ZAorICAgICAgICB0byBzdXBwb3J0IFB5dGhvbiAyLjUuIFNvLCB3ZSBjYW4ndCB0YWtlIGFkdmFu
dGFnZSBvZiB0aGVzZSBQeXRob24gMi43CisgICAgICAgIGZlYXR1cmVzIDooCisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9jaGVja291dC9zY20vc2NtX3VuaXR0ZXN0LnB5OgorCiAyMDExLTA3LTAzICBEYW5p
ZWwgQmF0ZXMgIDxkYmF0ZXNAd2Via2l0Lm9yZz4KIAogICAgICAgICBJbXBvcnQgQ2hlY2tvdXQg
aW4gc2NtX3VuaXR0ZXN0cy5weSBhbmQgbG9nZ2luZyBpbiBzdm4ucHkgdG8gZml4CkluZGV4OiBU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY20vc2NtX3VuaXR0ZXN0LnB5
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L3Nj
bS9zY21fdW5pdHRlc3QucHkJKHJldmlzaW9uIDkwMzQ4KQorKysgVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vY2hlY2tvdXQvc2NtL3NjbV91bml0dGVzdC5weQkod29ya2luZyBjb3B5KQpA
QCAtMzAsNiArMzAsNyBAQAogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50
CiAKK2ltcG9ydCBhdGV4aXQKIGltcG9ydCBiYXNlNjQKIGltcG9ydCBjb2RlY3MKIGltcG9ydCBn
ZXRwYXNzCkBAIC01Nyw2ICs1OCwxOSBAQCBmcm9tIC5naXQgaW1wb3J0IEdpdCwgQW1iaWd1b3Vz
Q29tbWl0RXJyCiBmcm9tIC5zY20gaW1wb3J0IFNDTSwgQ2hlY2tvdXROZWVkc1VwZGF0ZSwgY29t
bWl0X2Vycm9yX2hhbmRsZXIsIEF1dGhlbnRpY2F0aW9uRXJyb3IKIGZyb20gLnN2biBpbXBvcnQg
U1ZOCiAKKyMgV2UgY2FjaGUgdGhlIG1vY2sgU1ZOIHJlcG8gc28gdGhhdCB3ZSBkb24ndCBjcmVh
dGUgaXQgYWdhaW4gZm9yIGVhY2ggY2FsbCB0byBhbiBTVk5UZXN0IG9yIEdpdFRlc3QgdGVzdF8g
bWV0aG9kLgorIyBXZSBzdG9yZSBpdCBpbiBhIGdsb2JhbCB2YXJpYWJsZSBzbyB0aGF0IHdlIGNh
biBkZWxldGUgdGhpcyBjYWNoZWQgcmVwbyBvbiBleGl0KDMpLgorY2FjaGVkX3N2bl9yZXBvX3Bh
dGggPSBOb25lCisKK2RlZiByZW1vdmVfZGlyKHBhdGgpOgorICAgICMgQ2hhbmdlIGRpcmVjdG9y
eSB0byAvIHRvIGVuc3VyZSB0aGF0IHdlIGFyZW4ndCBpbiB0aGUgZGlyZWN0b3J5IHdlIHdhbnQg
dG8gZGVsZXRlLgorICAgIG9zLmNoZGlyKCcvJykKKyAgICBzaHV0aWwucm10cmVlKHBhdGgpCisK
K0BhdGV4aXQucmVnaXN0ZXIKK2RlZiBkZWxldGVfY2FjaGVkX21vY2tfcmVwb19hdF9leGl0KCk6
CisgICAgaWYgY2FjaGVkX3N2bl9yZXBvX3BhdGg6CisgICAgICAgIHJlbW92ZV9kaXIoY2FjaGVk
X3N2bl9yZXBvX3BhdGgpCiAKICMgRXZlbnR1YWxseSB3ZSB3aWxsIHdhbnQgdG8gd3JpdGUgdGVz
dHMgd2hpY2ggd29yayBmb3IgYm90aCBzY21zLiAobGlrZSB1cGRhdGVfd2Via2l0LCBjaGFuZ2Vk
X2ZpbGVzLCBldGMuKQogIyBQZXJoYXBzIHRocm91Z2ggc29tZSBTQ01UZXN0IGJhc2UtY2xhc3Mg
d2hpY2ggYm90aCBTVk5UZXN0IGFuZCBHaXRUZXN0IGluaGVyaXQgZnJvbS4KQEAgLTExMSw5ICsx
MjUsMTMgQEAgY2xhc3MgU1ZOVGVzdFJlcG9zaXRvcnk6CiAgICAgICAgIHJ1bl9jb21tYW5kKFsi
c3ZuIiwgImNvbW1pdCIsICItLXF1aWV0IiwgIi0tbWVzc2FnZSIsIG1lc3NhZ2VdKQogCiAgICAg
QGNsYXNzbWV0aG9kCi0gICAgZGVmIF9zZXR1cF90ZXN0X2NvbW1pdHMoY2xzLCB0ZXN0X29iamVj
dCk6CisgICAgZGVmIF9zZXR1cF90ZXN0X2NvbW1pdHMoY2xzLCBzdm5fcmVwb191cmwpOgorCisg
ICAgICAgIHN2bl9jaGVja291dF9wYXRoID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9InN2bl90
ZXN0X2NoZWNrb3V0IikKKyAgICAgICAgcnVuX2NvbW1hbmQoWydzdm4nLCAnY2hlY2tvdXQnLCAn
LS1xdWlldCcsIHN2bl9yZXBvX3VybCwgc3ZuX2NoZWNrb3V0X3BhdGhdKQorCiAgICAgICAgICMg
QWRkIHNvbWUgdGVzdCBjb21taXRzCi0gICAgICAgIG9zLmNoZGlyKHRlc3Rfb2JqZWN0LnN2bl9j
aGVja291dF9wYXRoKQorICAgICAgICBvcy5jaGRpcihzdm5fY2hlY2tvdXRfcGF0aCkKIAogICAg
ICAgICB3cml0ZV9pbnRvX2ZpbGVfYXRfcGF0aCgidGVzdF9maWxlIiwgInRlc3QxIikKICAgICAg
ICAgY2xzLl9zdm5fYWRkKCJ0ZXN0X2ZpbGUiKQpAQCAtMTQ1LDM5ICsxNjMsNTMgQEAgY2xhc3Mg
U1ZOVGVzdFJlcG9zaXRvcnk6CiAKICAgICAgICAgIyBzdm4gZG9lcyBub3Qgc2VlbSB0byB1cGRh
dGUgYWZ0ZXIgY29tbWl0IGFzIEkgd291bGQgZXhwZWN0LgogICAgICAgICBydW5fY29tbWFuZChb
J3N2bicsICd1cGRhdGUnXSkKKyAgICAgICAgcmVtb3ZlX2Rpcihzdm5fY2hlY2tvdXRfcGF0aCkK
IAorICAgICMgVGhpcyBpcyBhIGhvdCBmdW5jdGlvbiBzaW5jZSBpdCdzIGludm9rZWQgYnkgdW5p
dHRlc3QgYmVmb3JlIGNhbGxpbmcgZWFjaCB0ZXN0XyBtZXRob2QgaW4gU1ZOVGVzdCBhbmQKKyAg
ICAjIEdpdFRlc3QuIFdlIGNyZWF0ZSBhIG1vY2sgU1ZOIHJlcG8gb25jZSBhbmQgdGhlbiBwZXJm
b3JtIGFuIFNWTiBjaGVja291dCBmcm9tIGEgZmlsZXN5c3RlbSBjb3B5IG9mCisgICAgIyBpdCBz
aW5jZSBpdCdzIGV4cGVuc2l2ZSB0byBjcmVhdGUgdGhlIG1vY2sgcmVwby4KICAgICBAY2xhc3Nt
ZXRob2QKICAgICBkZWYgc2V0dXAoY2xzLCB0ZXN0X29iamVjdCk6CisgICAgICAgIGdsb2JhbCBj
YWNoZWRfc3ZuX3JlcG9fcGF0aAorICAgICAgICBpZiBub3QgY2FjaGVkX3N2bl9yZXBvX3BhdGg6
CisgICAgICAgICAgICBjYWNoZWRfc3ZuX3JlcG9fcGF0aCA9IGNscy5fc2V0dXBfbW9ja19yZXBv
KCkKKworICAgICAgICB0ZXN0X29iamVjdC50ZW1wX2RpcmVjdG9yeSA9IHRlbXBmaWxlLm1rZHRl
bXAoc3VmZml4PSJzdm5fdGVzdCIpCisgICAgICAgIHRlc3Rfb2JqZWN0LnN2bl9yZXBvX3BhdGgg
PSBvcy5wYXRoLmpvaW4odGVzdF9vYmplY3QudGVtcF9kaXJlY3RvcnksICJyZXBvIikKKyAgICAg
ICAgdGVzdF9vYmplY3Quc3ZuX3JlcG9fdXJsID0gImZpbGU6Ly8lcyIgJSB0ZXN0X29iamVjdC5z
dm5fcmVwb19wYXRoCisgICAgICAgIHRlc3Rfb2JqZWN0LnN2bl9jaGVja291dF9wYXRoID0gb3Mu
cGF0aC5qb2luKHRlc3Rfb2JqZWN0LnRlbXBfZGlyZWN0b3J5LCAiY2hlY2tvdXQiKQorICAgICAg
ICBzaHV0aWwuY29weXRyZWUoY2FjaGVkX3N2bl9yZXBvX3BhdGgsIHRlc3Rfb2JqZWN0LnN2bl9y
ZXBvX3BhdGgpCisgICAgICAgIHJ1bl9jb21tYW5kKFsnc3ZuJywgJ2NoZWNrb3V0JywgJy0tcXVp
ZXQnLCB0ZXN0X29iamVjdC5zdm5fcmVwb191cmwgKyAiL3RydW5rIiwgdGVzdF9vYmplY3Quc3Zu
X2NoZWNrb3V0X3BhdGhdKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9zZXR1cF9tb2Nr
X3JlcG8oY2xzKToKICAgICAgICAgIyBDcmVhdGUgYW4gdGVzdCBTVk4gcmVwb3NpdG9yeQotICAg
ICAgICB0ZXN0X29iamVjdC5zdm5fcmVwb19wYXRoID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9
InN2bl90ZXN0X3JlcG8iKQotICAgICAgICB0ZXN0X29iamVjdC5zdm5fcmVwb191cmwgPSAiZmls
ZTovLyVzIiAlIHRlc3Rfb2JqZWN0LnN2bl9yZXBvX3BhdGggIyBOb3Qgc3VyZSB0aGlzIHdpbGwg
d29yayBvbiB3aW5kb3dzCisgICAgICAgIHN2bl9yZXBvX3BhdGggPSB0ZW1wZmlsZS5ta2R0ZW1w
KHN1ZmZpeD0ic3ZuX3Rlc3RfcmVwbyIpCisgICAgICAgIHN2bl9yZXBvX3VybCA9ICJmaWxlOi8v
JXMiICUgc3ZuX3JlcG9fcGF0aCAjIE5vdCBzdXJlIHRoaXMgd2lsbCB3b3JrIG9uIHdpbmRvd3MK
ICAgICAgICAgIyBnaXQgc3ZuIGNvbXBsYWlucyBpZiB3ZSBkb24ndCBwYXNzIC0tcHJlLTEuNS1j
b21wYXRpYmxlLCBub3Qgc3VyZSB3aHk6CiAgICAgICAgICMgRXhwZWN0ZWQgRlMgZm9ybWF0ICcy
JzsgZm91bmQgZm9ybWF0ICczJyBhdCAvdXNyL2xvY2FsL2xpYmV4ZWMvZ2l0LWNvcmUvL2dpdC1z
dm4gbGluZSAxNDc3Ci0gICAgICAgIHJ1bl9jb21tYW5kKFsnc3ZuYWRtaW4nLCAnY3JlYXRlJywg
Jy0tcHJlLTEuNS1jb21wYXRpYmxlJywgdGVzdF9vYmplY3Quc3ZuX3JlcG9fcGF0aF0pCisgICAg
ICAgIHJ1bl9jb21tYW5kKFsnc3ZuYWRtaW4nLCAnY3JlYXRlJywgJy0tcHJlLTEuNS1jb21wYXRp
YmxlJywgc3ZuX3JlcG9fcGF0aF0pCiAKICAgICAgICAgIyBDcmVhdGUgYSB0ZXN0IHN2biBjaGVj
a291dAotICAgICAgICB0ZXN0X29iamVjdC5zdm5fY2hlY2tvdXRfcGF0aCA9IHRlbXBmaWxlLm1r
ZHRlbXAoc3VmZml4PSJzdm5fdGVzdF9jaGVja291dCIpCi0gICAgICAgIHJ1bl9jb21tYW5kKFsn
c3ZuJywgJ2NoZWNrb3V0JywgJy0tcXVpZXQnLCB0ZXN0X29iamVjdC5zdm5fcmVwb191cmwsIHRl
c3Rfb2JqZWN0LnN2bl9jaGVja291dF9wYXRoXSkKKyAgICAgICAgc3ZuX2NoZWNrb3V0X3BhdGgg
PSB0ZW1wZmlsZS5ta2R0ZW1wKHN1ZmZpeD0ic3ZuX3Rlc3RfY2hlY2tvdXQiKQorICAgICAgICBy
dW5fY29tbWFuZChbJ3N2bicsICdjaGVja291dCcsICctLXF1aWV0Jywgc3ZuX3JlcG9fdXJsLCBz
dm5fY2hlY2tvdXRfcGF0aF0pCiAKICAgICAgICAgIyBDcmVhdGUgYW5kIGNoZWNrb3V0IGEgdHJ1
bmsgZGlyIHRvIG1hdGNoIHRoZSBzdGFuZGFyZCBzdm4gY29uZmlndXJhdGlvbiB0byBtYXRjaCBn
aXQtc3ZuJ3MgZXhwZWN0YXRpb25zCi0gICAgICAgIG9zLmNoZGlyKHRlc3Rfb2JqZWN0LnN2bl9j
aGVja291dF9wYXRoKQorICAgICAgICBvcy5jaGRpcihzdm5fY2hlY2tvdXRfcGF0aCkKICAgICAg
ICAgb3MubWtkaXIoJ3RydW5rJykKICAgICAgICAgY2xzLl9zdm5fYWRkKCd0cnVuaycpCiAgICAg
ICAgICMgV2UgY2FuIGFkZCB0YWdzIGFuZCBicmFuY2hlcyBhcyB3ZWxsIGlmIHdlIGV2ZXIgbmVl
ZCB0byB0ZXN0IHRob3NlLgogICAgICAgICBjbHMuX3N2bl9jb21taXQoJ2FkZCB0cnVuaycpCiAK
ICAgICAgICAgIyBDaGFuZ2UgZGlyZWN0b3J5IG91dCBvZiB0aGUgc3ZuIGNoZWNrb3V0IHNvIHdl
IGNhbiBkZWxldGUgdGhlIGNoZWNrb3V0IGRpcmVjdG9yeS4KLSAgICAgICAgIyBfc2V0dXBfdGVz
dF9jb21taXRzIHdpbGwgQ0QgYmFjayB0byB0aGUgc3ZuIGNoZWNrb3V0IGRpcmVjdG9yeS4KLSAg
ICAgICAgb3MuY2hkaXIoJy8nKQotICAgICAgICBydW5fY29tbWFuZChbJ3JtJywgJy1yZicsIHRl
c3Rfb2JqZWN0LnN2bl9jaGVja291dF9wYXRoXSkKLSAgICAgICAgcnVuX2NvbW1hbmQoWydzdm4n
LCAnY2hlY2tvdXQnLCAnLS1xdWlldCcsIHRlc3Rfb2JqZWN0LnN2bl9yZXBvX3VybCArICcvdHJ1
bmsnLCB0ZXN0X29iamVjdC5zdm5fY2hlY2tvdXRfcGF0aF0pCisgICAgICAgIHJlbW92ZV9kaXIo
c3ZuX2NoZWNrb3V0X3BhdGgpCiAKLSAgICAgICAgY2xzLl9zZXR1cF90ZXN0X2NvbW1pdHModGVz
dF9vYmplY3QpCisgICAgICAgIGNscy5fc2V0dXBfdGVzdF9jb21taXRzKHN2bl9yZXBvX3VybCAr
ICIvdHJ1bmsiKQorICAgICAgICByZXR1cm4gc3ZuX3JlcG9fcGF0aAogCiAgICAgQGNsYXNzbWV0
aG9kCiAgICAgZGVmIHRlYXJfZG93bihjbHMsIHRlc3Rfb2JqZWN0KToKLSAgICAgICAgcnVuX2Nv
bW1hbmQoWydybScsICctcmYnLCB0ZXN0X29iamVjdC5zdm5fcmVwb19wYXRoXSkKLSAgICAgICAg
cnVuX2NvbW1hbmQoWydybScsICctcmYnLCB0ZXN0X29iamVjdC5zdm5fY2hlY2tvdXRfcGF0aF0p
CisgICAgICAgIHJlbW92ZV9kaXIodGVzdF9vYmplY3QudGVtcF9kaXJlY3RvcnkpCiAKICAgICAg
ICAgIyBOb3cgdGhhdCB3ZSd2ZSBkZWxldGVkIHRoZSBjaGVja291dCBwYXRocywgY3dkZGlyIG1h
eSBiZSBpbnZhbGlkCiAgICAgICAgICMgQ2hhbmdlIGJhY2sgdG8gYSB2YWxpZCBkaXJlY3Rvcnkg
c28gdGhhdCBsYXRlciBjYWxscyB0byBvcy5nZXRjd2QoKSBkbyBub3QgZmFpbC4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99653</attachid>
            <date>2011-07-04 13:15:54 -0700</date>
            <delta_ts>2011-07-06 11:35:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug63883_1.patch</filename>
            <type>text/plain</type>
            <size>6893</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDkwMzQ4KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMjUgQEAKKzIwMTEtMDctMDMgIERhbmllbCBCYXRlcyAgPGRiYXRlc0B3ZWJraXQub3JnPgor
CisgICAgICAgIE1ha2UgU0NNIHVuaXQgdGVzdHMgZmFzdGVyCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02Mzg4MworCisgICAgICAgIFNwZWVkcyB1cCB0
aGUgU0NNIHVuaXQgdGVzdHMgYnkgYSBmYWN0b3Igb2YgNC4gQ3VycmVudGx5LCB3ZSBjcmVhdGUg
YQorICAgICAgICBtb2NrIFNWTiByZXBvIGZvciBlYWNoIHRlc3RfIG1ldGhvZCBpbiBTVk5UZXN0
IGFuZCBHaXRUZXN0IGFuZCBjcmVhdGluZworICAgICAgICB0aGlzIHJlcG8gaXMgZXhwZW5zaXZl
LgorCisgICAgICAgIEluc3RlYWQsIGl0IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRvIGNyZWF0
ZSB0aGUgbW9jayBTVk4gcmVwbyBvbmNlCisgICAgICAgIGFuZCB0aGVuIHBlcmZvcm0gYSBmaWxl
c3lzdGVtIGNvcHkgb2YgaXQgZm9yIGVhY2ggdGVzdF8gbWV0aG9kLgorCisgICAgICAgIE5vdGUs
IFB5dGhvbiAyLjcncyB1bml0dGVzdCBtb2R1bGUgaW1wbGVtZW50cyBzdXBwb3J0IGZvciBwZXIg
Y2xhc3MgYW5kCisgICAgICAgIHBlciBtb2R1bGUgc2V0dXAgYW5kIHRlYXIgZG93biBtZXRob2Rz
IHdoaWNoIGNvdWxkIGJlIHVzZWQgdG8gaW1wbGVtZW50CisgICAgICAgIHNpbWlsYXIgZnVuY3Rp
b25hbGl0eS4gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZywgdGVzdC13ZWJraXRweSBpcyBkZXNpZ25l
ZAorICAgICAgICB0byBzdXBwb3J0IFB5dGhvbiAyLjUuIFNvLCB3ZSBjYW4ndCB0YWtlIGFkdmFu
dGFnZSBvZiB0aGVzZSBQeXRob24gMi43CisgICAgICAgIGZlYXR1cmVzIDooCisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9jaGVja291dC9zY20vc2NtX3VuaXR0ZXN0LnB5OgorCiAyMDExLTA3LTAzICBEYW5p
ZWwgQmF0ZXMgIDxkYmF0ZXNAd2Via2l0Lm9yZz4KIAogICAgICAgICBJbXBvcnQgQ2hlY2tvdXQg
aW4gc2NtX3VuaXR0ZXN0cy5weSBhbmQgbG9nZ2luZyBpbiBzdm4ucHkgdG8gZml4CkluZGV4OiBU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY20vc2NtX3VuaXR0ZXN0LnB5
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L3Nj
bS9zY21fdW5pdHRlc3QucHkJKHJldmlzaW9uIDkwMzQ4KQorKysgVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vY2hlY2tvdXQvc2NtL3NjbV91bml0dGVzdC5weQkod29ya2luZyBjb3B5KQpA
QCAtMzAsNiArMzAsNyBAQAogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50
CiAKK2ltcG9ydCBhdGV4aXQKIGltcG9ydCBiYXNlNjQKIGltcG9ydCBjb2RlY3MKIGltcG9ydCBn
ZXRwYXNzCkBAIC01Nyw2ICs1OCwyMSBAQCBmcm9tIC5naXQgaW1wb3J0IEdpdCwgQW1iaWd1b3Vz
Q29tbWl0RXJyCiBmcm9tIC5zY20gaW1wb3J0IFNDTSwgQ2hlY2tvdXROZWVkc1VwZGF0ZSwgY29t
bWl0X2Vycm9yX2hhbmRsZXIsIEF1dGhlbnRpY2F0aW9uRXJyb3IKIGZyb20gLnN2biBpbXBvcnQg
U1ZOCiAKKyMgV2UgY2FjaGUgdGhlIG1vY2sgU1ZOIHJlcG8gc28gdGhhdCB3ZSBkb24ndCBjcmVh
dGUgaXQgYWdhaW4gZm9yIGVhY2ggY2FsbCB0byBhbiBTVk5UZXN0IG9yIEdpdFRlc3QgdGVzdF8g
bWV0aG9kLgorIyBXZSBzdG9yZSBpdCBpbiBhIGdsb2JhbCB2YXJpYWJsZSBzbyB0aGF0IHdlIGNh
biBkZWxldGUgdGhpcyBjYWNoZWQgcmVwbyBvbiBleGl0KDMpLgorY2FjaGVkX3N2bl9yZXBvX3Bh
dGggPSBOb25lCisKKworZGVmIHJlbW92ZV9kaXIocGF0aCk6CisgICAgIyBDaGFuZ2UgZGlyZWN0
b3J5IHRvIC8gdG8gZW5zdXJlIHRoYXQgd2UgYXJlbid0IGluIHRoZSBkaXJlY3Rvcnkgd2Ugd2Fu
dCB0byBkZWxldGUuCisgICAgb3MuY2hkaXIoJy8nKQorICAgIHNodXRpbC5ybXRyZWUocGF0aCkK
KworCitAYXRleGl0LnJlZ2lzdGVyCitkZWYgZGVsZXRlX2NhY2hlZF9tb2NrX3JlcG9fYXRfZXhp
dCgpOgorICAgIGlmIGNhY2hlZF9zdm5fcmVwb19wYXRoOgorICAgICAgICByZW1vdmVfZGlyKGNh
Y2hlZF9zdm5fcmVwb19wYXRoKQogCiAjIEV2ZW50dWFsbHkgd2Ugd2lsbCB3YW50IHRvIHdyaXRl
IHRlc3RzIHdoaWNoIHdvcmsgZm9yIGJvdGggc2Ntcy4gKGxpa2UgdXBkYXRlX3dlYmtpdCwgY2hh
bmdlZF9maWxlcywgZXRjLikKICMgUGVyaGFwcyB0aHJvdWdoIHNvbWUgU0NNVGVzdCBiYXNlLWNs
YXNzIHdoaWNoIGJvdGggU1ZOVGVzdCBhbmQgR2l0VGVzdCBpbmhlcml0IGZyb20uCkBAIC0xMTEs
OSArMTI3LDEzIEBAIGNsYXNzIFNWTlRlc3RSZXBvc2l0b3J5OgogICAgICAgICBydW5fY29tbWFu
ZChbInN2biIsICJjb21taXQiLCAiLS1xdWlldCIsICItLW1lc3NhZ2UiLCBtZXNzYWdlXSkKIAog
ICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBfc2V0dXBfdGVzdF9jb21taXRzKGNscywgdGVzdF9v
YmplY3QpOgorICAgIGRlZiBfc2V0dXBfdGVzdF9jb21taXRzKGNscywgc3ZuX3JlcG9fdXJsKToK
KworICAgICAgICBzdm5fY2hlY2tvdXRfcGF0aCA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PSJz
dm5fdGVzdF9jaGVja291dCIpCisgICAgICAgIHJ1bl9jb21tYW5kKFsnc3ZuJywgJ2NoZWNrb3V0
JywgJy0tcXVpZXQnLCBzdm5fcmVwb191cmwsIHN2bl9jaGVja291dF9wYXRoXSkKKwogICAgICAg
ICAjIEFkZCBzb21lIHRlc3QgY29tbWl0cwotICAgICAgICBvcy5jaGRpcih0ZXN0X29iamVjdC5z
dm5fY2hlY2tvdXRfcGF0aCkKKyAgICAgICAgb3MuY2hkaXIoc3ZuX2NoZWNrb3V0X3BhdGgpCiAK
ICAgICAgICAgd3JpdGVfaW50b19maWxlX2F0X3BhdGgoInRlc3RfZmlsZSIsICJ0ZXN0MSIpCiAg
ICAgICAgIGNscy5fc3ZuX2FkZCgidGVzdF9maWxlIikKQEAgLTE0NSwzOSArMTY1LDUzIEBAIGNs
YXNzIFNWTlRlc3RSZXBvc2l0b3J5OgogCiAgICAgICAgICMgc3ZuIGRvZXMgbm90IHNlZW0gdG8g
dXBkYXRlIGFmdGVyIGNvbW1pdCBhcyBJIHdvdWxkIGV4cGVjdC4KICAgICAgICAgcnVuX2NvbW1h
bmQoWydzdm4nLCAndXBkYXRlJ10pCisgICAgICAgIHJlbW92ZV9kaXIoc3ZuX2NoZWNrb3V0X3Bh
dGgpCiAKKyAgICAjIFRoaXMgaXMgYSBob3QgZnVuY3Rpb24gc2luY2UgaXQncyBpbnZva2VkIGJ5
IHVuaXR0ZXN0IGJlZm9yZSBjYWxsaW5nIGVhY2ggdGVzdF8gbWV0aG9kIGluIFNWTlRlc3QgYW5k
CisgICAgIyBHaXRUZXN0LiBXZSBjcmVhdGUgYSBtb2NrIFNWTiByZXBvIG9uY2UgYW5kIHRoZW4g
cGVyZm9ybSBhbiBTVk4gY2hlY2tvdXQgZnJvbSBhIGZpbGVzeXN0ZW0gY29weSBvZgorICAgICMg
aXQgc2luY2UgaXQncyBleHBlbnNpdmUgdG8gY3JlYXRlIHRoZSBtb2NrIHJlcG8uCiAgICAgQGNs
YXNzbWV0aG9kCiAgICAgZGVmIHNldHVwKGNscywgdGVzdF9vYmplY3QpOgorICAgICAgICBnbG9i
YWwgY2FjaGVkX3N2bl9yZXBvX3BhdGgKKyAgICAgICAgaWYgbm90IGNhY2hlZF9zdm5fcmVwb19w
YXRoOgorICAgICAgICAgICAgY2FjaGVkX3N2bl9yZXBvX3BhdGggPSBjbHMuX3NldHVwX21vY2tf
cmVwbygpCisKKyAgICAgICAgdGVzdF9vYmplY3QudGVtcF9kaXJlY3RvcnkgPSB0ZW1wZmlsZS5t
a2R0ZW1wKHN1ZmZpeD0ic3ZuX3Rlc3QiKQorICAgICAgICB0ZXN0X29iamVjdC5zdm5fcmVwb19w
YXRoID0gb3MucGF0aC5qb2luKHRlc3Rfb2JqZWN0LnRlbXBfZGlyZWN0b3J5LCAicmVwbyIpCisg
ICAgICAgIHRlc3Rfb2JqZWN0LnN2bl9yZXBvX3VybCA9ICJmaWxlOi8vJXMiICUgdGVzdF9vYmpl
Y3Quc3ZuX3JlcG9fcGF0aAorICAgICAgICB0ZXN0X29iamVjdC5zdm5fY2hlY2tvdXRfcGF0aCA9
IG9zLnBhdGguam9pbih0ZXN0X29iamVjdC50ZW1wX2RpcmVjdG9yeSwgImNoZWNrb3V0IikKKyAg
ICAgICAgc2h1dGlsLmNvcHl0cmVlKGNhY2hlZF9zdm5fcmVwb19wYXRoLCB0ZXN0X29iamVjdC5z
dm5fcmVwb19wYXRoKQorICAgICAgICBydW5fY29tbWFuZChbJ3N2bicsICdjaGVja291dCcsICct
LXF1aWV0JywgdGVzdF9vYmplY3Quc3ZuX3JlcG9fdXJsICsgIi90cnVuayIsIHRlc3Rfb2JqZWN0
LnN2bl9jaGVja291dF9wYXRoXSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfc2V0dXBf
bW9ja19yZXBvKGNscyk6CiAgICAgICAgICMgQ3JlYXRlIGFuIHRlc3QgU1ZOIHJlcG9zaXRvcnkK
LSAgICAgICAgdGVzdF9vYmplY3Quc3ZuX3JlcG9fcGF0aCA9IHRlbXBmaWxlLm1rZHRlbXAoc3Vm
Zml4PSJzdm5fdGVzdF9yZXBvIikKLSAgICAgICAgdGVzdF9vYmplY3Quc3ZuX3JlcG9fdXJsID0g
ImZpbGU6Ly8lcyIgJSB0ZXN0X29iamVjdC5zdm5fcmVwb19wYXRoICMgTm90IHN1cmUgdGhpcyB3
aWxsIHdvcmsgb24gd2luZG93cworICAgICAgICBzdm5fcmVwb19wYXRoID0gdGVtcGZpbGUubWtk
dGVtcChzdWZmaXg9InN2bl90ZXN0X3JlcG8iKQorICAgICAgICBzdm5fcmVwb191cmwgPSAiZmls
ZTovLyVzIiAlIHN2bl9yZXBvX3BhdGggICMgTm90IHN1cmUgdGhpcyB3aWxsIHdvcmsgb24gd2lu
ZG93cwogICAgICAgICAjIGdpdCBzdm4gY29tcGxhaW5zIGlmIHdlIGRvbid0IHBhc3MgLS1wcmUt
MS41LWNvbXBhdGlibGUsIG5vdCBzdXJlIHdoeToKICAgICAgICAgIyBFeHBlY3RlZCBGUyBmb3Jt
YXQgJzInOyBmb3VuZCBmb3JtYXQgJzMnIGF0IC91c3IvbG9jYWwvbGliZXhlYy9naXQtY29yZS8v
Z2l0LXN2biBsaW5lIDE0NzcKLSAgICAgICAgcnVuX2NvbW1hbmQoWydzdm5hZG1pbicsICdjcmVh
dGUnLCAnLS1wcmUtMS41LWNvbXBhdGlibGUnLCB0ZXN0X29iamVjdC5zdm5fcmVwb19wYXRoXSkK
KyAgICAgICAgcnVuX2NvbW1hbmQoWydzdm5hZG1pbicsICdjcmVhdGUnLCAnLS1wcmUtMS41LWNv
bXBhdGlibGUnLCBzdm5fcmVwb19wYXRoXSkKIAogICAgICAgICAjIENyZWF0ZSBhIHRlc3Qgc3Zu
IGNoZWNrb3V0Ci0gICAgICAgIHRlc3Rfb2JqZWN0LnN2bl9jaGVja291dF9wYXRoID0gdGVtcGZp
bGUubWtkdGVtcChzdWZmaXg9InN2bl90ZXN0X2NoZWNrb3V0IikKLSAgICAgICAgcnVuX2NvbW1h
bmQoWydzdm4nLCAnY2hlY2tvdXQnLCAnLS1xdWlldCcsIHRlc3Rfb2JqZWN0LnN2bl9yZXBvX3Vy
bCwgdGVzdF9vYmplY3Quc3ZuX2NoZWNrb3V0X3BhdGhdKQorICAgICAgICBzdm5fY2hlY2tvdXRf
cGF0aCA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PSJzdm5fdGVzdF9jaGVja291dCIpCisgICAg
ICAgIHJ1bl9jb21tYW5kKFsnc3ZuJywgJ2NoZWNrb3V0JywgJy0tcXVpZXQnLCBzdm5fcmVwb191
cmwsIHN2bl9jaGVja291dF9wYXRoXSkKIAogICAgICAgICAjIENyZWF0ZSBhbmQgY2hlY2tvdXQg
YSB0cnVuayBkaXIgdG8gbWF0Y2ggdGhlIHN0YW5kYXJkIHN2biBjb25maWd1cmF0aW9uIHRvIG1h
dGNoIGdpdC1zdm4ncyBleHBlY3RhdGlvbnMKLSAgICAgICAgb3MuY2hkaXIodGVzdF9vYmplY3Qu
c3ZuX2NoZWNrb3V0X3BhdGgpCisgICAgICAgIG9zLmNoZGlyKHN2bl9jaGVja291dF9wYXRoKQog
ICAgICAgICBvcy5ta2RpcigndHJ1bmsnKQogICAgICAgICBjbHMuX3N2bl9hZGQoJ3RydW5rJykK
ICAgICAgICAgIyBXZSBjYW4gYWRkIHRhZ3MgYW5kIGJyYW5jaGVzIGFzIHdlbGwgaWYgd2UgZXZl
ciBuZWVkIHRvIHRlc3QgdGhvc2UuCiAgICAgICAgIGNscy5fc3ZuX2NvbW1pdCgnYWRkIHRydW5r
JykKIAogICAgICAgICAjIENoYW5nZSBkaXJlY3Rvcnkgb3V0IG9mIHRoZSBzdm4gY2hlY2tvdXQg
c28gd2UgY2FuIGRlbGV0ZSB0aGUgY2hlY2tvdXQgZGlyZWN0b3J5LgotICAgICAgICAjIF9zZXR1
cF90ZXN0X2NvbW1pdHMgd2lsbCBDRCBiYWNrIHRvIHRoZSBzdm4gY2hlY2tvdXQgZGlyZWN0b3J5
LgotICAgICAgICBvcy5jaGRpcignLycpCi0gICAgICAgIHJ1bl9jb21tYW5kKFsncm0nLCAnLXJm
JywgdGVzdF9vYmplY3Quc3ZuX2NoZWNrb3V0X3BhdGhdKQotICAgICAgICBydW5fY29tbWFuZChb
J3N2bicsICdjaGVja291dCcsICctLXF1aWV0JywgdGVzdF9vYmplY3Quc3ZuX3JlcG9fdXJsICsg
Jy90cnVuaycsIHRlc3Rfb2JqZWN0LnN2bl9jaGVja291dF9wYXRoXSkKKyAgICAgICAgcmVtb3Zl
X2Rpcihzdm5fY2hlY2tvdXRfcGF0aCkKIAotICAgICAgICBjbHMuX3NldHVwX3Rlc3RfY29tbWl0
cyh0ZXN0X29iamVjdCkKKyAgICAgICAgY2xzLl9zZXR1cF90ZXN0X2NvbW1pdHMoc3ZuX3JlcG9f
dXJsICsgIi90cnVuayIpCisgICAgICAgIHJldHVybiBzdm5fcmVwb19wYXRoCiAKICAgICBAY2xh
c3NtZXRob2QKICAgICBkZWYgdGVhcl9kb3duKGNscywgdGVzdF9vYmplY3QpOgotICAgICAgICBy
dW5fY29tbWFuZChbJ3JtJywgJy1yZicsIHRlc3Rfb2JqZWN0LnN2bl9yZXBvX3BhdGhdKQotICAg
ICAgICBydW5fY29tbWFuZChbJ3JtJywgJy1yZicsIHRlc3Rfb2JqZWN0LnN2bl9jaGVja291dF9w
YXRoXSkKKyAgICAgICAgcmVtb3ZlX2Rpcih0ZXN0X29iamVjdC50ZW1wX2RpcmVjdG9yeSkKIAog
ICAgICAgICAjIE5vdyB0aGF0IHdlJ3ZlIGRlbGV0ZWQgdGhlIGNoZWNrb3V0IHBhdGhzLCBjd2Rk
aXIgbWF5IGJlIGludmFsaWQKICAgICAgICAgIyBDaGFuZ2UgYmFjayB0byBhIHZhbGlkIGRpcmVj
dG9yeSBzbyB0aGF0IGxhdGVyIGNhbGxzIHRvIG9zLmdldGN3ZCgpIGRvIG5vdCBmYWlsLgo=
</data>
<flag name="review"
          id="94435"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>