<?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>38156</bug_id>
          
          <creation_ts>2010-04-26 17:44:18 -0700</creation_ts>
          <short_desc>many webkit-patch commands fail in a non-svn tracking git checkout</short_desc>
          <delta_ts>2010-06-03 14:45:04 -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="James Robinson">jamesr</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>cjerdonek</cc>
    
    <cc>eric</cc>
    
    <cc>evan</cc>
    
    <cc>ojan</cc>
    
    <cc>thakis</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>217387</commentid>
    <comment_count>0</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-04-26 17:44:18 -0700</bug_when>
    <thetext>I have a git WebKit repo that does not track SVN.  In this repo I have a branch &apos;master&apos; that tracks remote master and a topic branch my_branch.  I tried posting a patch by running &quot;webkit-patch post --git-commit=master..my_branch&quot; but it failed with:

Are you sure to continue?(y/N) y
Upload server: wkrietveld.appspot.com (change with -s/--server)
Loaded authentication cookies from /home/jamesr/.codereview_upload_cookies
Issue creation errors: {&apos;data&apos;: [&apos;Patch set contains no recognizable patches&apos;]}

Passing in &apos;--no-fancy-review&apos; let me upload the patch: https://bug-38153-attachments.webkit.org/attachment.cgi?id=54353</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229825</commentid>
    <comment_count>1</comment_count>
      <attachid>56907</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-05-24 11:25:54 -0700</bug_when>
    <thetext>Created attachment 56907
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229855</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-05-24 12:46:33 -0700</bug_when>
    <thetext>I&apos;m not sure my git-fu is up to snuff for reviewing this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>229858</commentid>
    <comment_count>3</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-05-24 13:00:02 -0700</bug_when>
    <thetext>Evan&apos;s on vacation for a couple weeks. Chris, you feel able to review this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>230274</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-25 08:07:44 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Evan&apos;s on vacation for a couple weeks. Chris, you feel able to review this?

I think so.  Probably tonight.  In the meantime, I have some quick, minor comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>230275</commentid>
    <comment_count>5</comment_count>
      <attachid>56907</attachid>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-25 08:09:08 -0700</bug_when>
    <thetext>Comment on attachment 56907
Patch

&gt; +++ b/WebKitTools/Scripts/webkitpy/common/checkout/scm.py

&gt; +    def _branch_exists(self, branch):
&gt; +        return self.run([&apos;git&apos;, &apos;show-ref&apos;, &apos;--quiet&apos;, &apos;--verify&apos;, branch], return_exit_code=True) == 0

Would it be better to call the parameter something other than &quot;branch&quot; (e.g.
&quot;branch_path&quot;) so the caller knows to pass branch names in the form: refs/heads/&lt;branch_name&gt;.

&gt;      def delete_branch(self, branch):
&gt; -        if self.run([&apos;git&apos;, &apos;show-ref&apos;, &apos;--quiet&apos;, &apos;--verify&apos;, &apos;refs/heads/&apos; + branch], return_exit_code=True) == 0:
&gt; +        if self._branch_exists(&apos;refs/heads/&apos; + branch):
&gt;              self.run([&apos;git&apos;, &apos;branch&apos;, &apos;-D&apos;, branch])

Similarly, would it be better to be more specific with the parameter name
and call it something like branch_name (to distinguish from passing in a path)?

&gt;      def svn_branch_name(self):

Since with this patch this function is no longer being used exclusively for
Git repos that track SVN, is there a more accurate name that can be used?

&gt; +        # A git clone of git://git.webkit.org/WebKit.git that is not tracking svn.
&gt; +        if self._branch_exists(&apos;refs/remotes/origin/master&apos;):
&gt; +            return &apos;refs/remotes/origin/master&apos;
&gt; +
&gt; +        raise ScriptError(message=&quot;\&quot;trunk\&quot; and \&quot;origin/master\&quot; branches do not exist. Can&apos;t find a branch to diff against.&quot;)

I recommend using single quotes -- especially for strings containing double quotes.
That way you don&apos;t need to escape the double quotes.

&gt; +    def test_svn_branch_name_git_only(self):
&gt; +        git_checkout2_path = tempfile.mkdtemp(suffix=&quot;git_test_checkout2&quot;)
&gt; +        run_command([&apos;git&apos;, &apos;clone&apos;, &apos;--quiet&apos;, self.git_checkout_path,  git_checkout2_path])
&gt; +        os.chdir(git_checkout2_path)
&gt; +        scm = detect_scm_system(git_checkout2_path)
&gt; +        self.assertEqual(scm.svn_branch_name(), &apos;refs/remotes/origin/master&apos;)

Should there be some sort of setUp/tearDown specific to these methods or
equivalent logic to set the working directory back to what is was before
the test ran?  Also, for the tests that don&apos;t need to track SVN, can we get
away without setting up the SVN repo in the setUp/tearDown?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>230366</commentid>
    <comment_count>6</comment_count>
      <attachid>57032</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-05-25 11:10:26 -0700</bug_when>
    <thetext>Created attachment 57032
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>230367</commentid>
    <comment_count>7</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-05-25 11:10:40 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 56907 [details])
&gt; &gt; +++ b/WebKitTools/Scripts/webkitpy/common/checkout/scm.py
&gt; 
&gt; &gt; +    def _branch_exists(self, branch):
&gt; &gt; +        return self.run([&apos;git&apos;, &apos;show-ref&apos;, &apos;--quiet&apos;, &apos;--verify&apos;, branch], return_exit_code=True) == 0
&gt; 
&gt; Would it be better to call the parameter something other than &quot;branch&quot; (e.g.
&gt; &quot;branch_path&quot;) so the caller knows to pass branch names in the form: refs/heads/&lt;branch_name&gt;.

Renamed to branch_ref.

&gt; &gt;      def delete_branch(self, branch):
&gt; &gt; -        if self.run([&apos;git&apos;, &apos;show-ref&apos;, &apos;--quiet&apos;, &apos;--verify&apos;, &apos;refs/heads/&apos; + branch], return_exit_code=True) == 0:
&gt; &gt; +        if self._branch_exists(&apos;refs/heads/&apos; + branch):
&gt; &gt;              self.run([&apos;git&apos;, &apos;branch&apos;, &apos;-D&apos;, branch])
&gt; 
&gt; Similarly, would it be better to be more specific with the parameter name
&gt; and call it something like branch_name (to distinguish from passing in a path)?

Done.

&gt; &gt;      def svn_branch_name(self):
&gt; 
&gt; Since with this patch this function is no longer being used exclusively for
&gt; Git repos that track SVN, is there a more accurate name that can be used?

s/svn/remote here and in a couple other functions.

&gt; &gt; +        # A git clone of git://git.webkit.org/WebKit.git that is not tracking svn.
&gt; &gt; +        if self._branch_exists(&apos;refs/remotes/origin/master&apos;):
&gt; &gt; +            return &apos;refs/remotes/origin/master&apos;
&gt; &gt; +
&gt; &gt; +        raise ScriptError(message=&quot;\&quot;trunk\&quot; and \&quot;origin/master\&quot; branches do not exist. Can&apos;t find a branch to diff against.&quot;)
&gt; 
&gt; I recommend using single quotes -- especially for strings containing double quotes.
&gt; That way you don&apos;t need to escape the double quotes.

Yeah. There is a single quote in there as well, but whatever. :)

&gt; &gt; +    def test_svn_branch_name_git_only(self):
&gt; &gt; +        git_checkout2_path = tempfile.mkdtemp(suffix=&quot;git_test_checkout2&quot;)
&gt; &gt; +        run_command([&apos;git&apos;, &apos;clone&apos;, &apos;--quiet&apos;, self.git_checkout_path,  git_checkout2_path])
&gt; &gt; +        os.chdir(git_checkout2_path)
&gt; &gt; +        scm = detect_scm_system(git_checkout2_path)
&gt; &gt; +        self.assertEqual(scm.svn_branch_name(), &apos;refs/remotes/origin/master&apos;)
&gt; 
&gt; Should there be some sort of setUp/tearDown specific to these methods or
&gt; equivalent logic to set the working directory back to what is was before
&gt; the test ran?  Also, for the tests that don&apos;t need to track SVN, can we get
&gt; away without setting up the SVN repo in the setUp/tearDown?

That&apos;s probably better. They should run a lot faster that way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>231353</commentid>
    <comment_count>8</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-05-27 10:29:09 -0700</bug_when>
    <thetext>ping</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>231668</commentid>
    <comment_count>9</comment_count>
      <attachid>57032</attachid>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-28 06:35:56 -0700</bug_when>
    <thetext>Comment on attachment 57032
Patch

I wasn&apos;t too familiar with references other than branches before reviewing
this, so I apologize if some of my comments are basic.

&gt; +++ b/WebKitTools/ChangeLog
&gt; +        If the trunk branch doesn&apos;t exist, fallback to the master branch.

When I see &quot;branch&quot;, I normally think of my locally created branches (i.e.
the refs/heads, or what gets listed when I execute git-branch), but here you
mean remote-tracking branches.  Would it be better to say &quot;remote-tracking
branch&quot; instead of just &quot;branch&quot;?

It would also be good to state up-front which one is the SVN-tracking branch
and which is the Git-tracking branch for people that don&apos;t know off-hand,
perhaps in parentheses.

&gt; +++ b/WebKitTools/Scripts/webkitpy/common/checkout/scm.py
&gt;      # Git-specific methods:
&gt; +    def _branch_exists(self, branch_ref):
&gt; +        return self.run([&apos;git&apos;, &apos;show-ref&apos;, &apos;--quiet&apos;, &apos;--verify&apos;, branch_ref], return_exit_code=True) == 0

Question: do all git commands also accept a fully-qualified reference path (i.e.
branch &quot;ref&quot;) wherever a simple branch name is accepted?

Would it be better to call this _reference_exists()?  The documentation for
git-show-ref calls the values that show-ref displays &quot;references&quot;.  See below
for more comments.

&gt; -    def delete_branch(self, branch):
&gt; -        if self.run([&apos;git&apos;, &apos;show-ref&apos;, &apos;--quiet&apos;, &apos;--verify&apos;, &apos;refs/heads/&apos; + branch], return_exit_code=True) == 0:
&gt; -            self.run([&apos;git&apos;, &apos;branch&apos;, &apos;-D&apos;, branch])
&gt; +    def delete_branch(self, branch_name):
&gt; +        if self._branch_exists(&apos;refs/heads/&apos; + branch_name):
&gt; +            self.run([&apos;git&apos;, &apos;branch&apos;, &apos;-D&apos;, branch_name])

Here you use the word &quot;branch&quot; exclusively for local &quot;refs/heads&quot; branches,
whereas above in the _branch_exists() method you use the word &quot;branch&quot; for any
git reference.

It might be good to maintain a distinction between these two notions in your
choice of variable and function names.  For example, &quot;branch&quot; could be used
exclusively for &quot;refs/heads&quot; references and &quot;reference&quot; for any ref).  You
could then further qualify these terms using branch_ref (or branch_reference)
for the fully-qualified name, and branch_name for the short name (as you have
done above).  Similarly, you could use remote_ref (or remote_reference) to
refer only to the remote-tracking branches.  Just a suggestion if that also
makes sense to you.

&gt; -    def svn_branch_name(self):
&gt; -        # FIXME: This should so something like: Git.read_git_config(&apos;svn-remote.svn.fetch&apos;).split(&apos;:&apos;)[1]
&gt; -        # but that doesn&apos;t work if the git repo is tracking multiple svn branches.
&gt; -        return &apos;trunk&apos;
&gt; +    def remote_branch_name(self):
&gt; +        # A git-svn checkout as per http://trac.webkit.org/wiki/UsingGitWithWebKit.
&gt; +        if self._branch_exists(&apos;refs/remotes/trunk&apos;):
&gt; +            # FIXME: This should so something like: Git.read_git_config(&apos;svn-remote.svn.fetch&apos;).split(&apos;:&apos;)[1]
&gt; +            # but that doesn&apos;t work if the git repo is tracking multiple svn branches.

Under what circumstances would someone track multiple SVN branches?  Could they
be doing that even if they followed the wiki instructions?  The reason I ask
is that this code seems to assume they are following the wiki instructions
anyways.

&gt; +            return &apos;refs/remotes/trunk&apos;

Before you returned just &quot;trunk&quot;, but now you return the fully-qualified
reference path.  Would it be better to name this function remote_reference()
(as discussed above)?

Out of curiosity, why did you decide to start using the fully-qualified
reference name instead of the one-word name?  It might be good to include
a comment explaining why and mentioning where it matters.

&gt; +        raise ScriptError(message=&apos;&quot;trunk&quot; and &quot;origin/master&quot; branches do not exist. Can\&apos;t find a branch to diff against.&apos;)

Saying &quot;remote-tracking branches&quot; might be clearer here.  I would also put the
&quot;Can&apos;t find...&quot; part first, and follow with the more specific info second.

&gt;          if not len(args):
&gt; -            args.append(&apos;%s..HEAD&apos; % self.svn_branch_name())
&gt; +            args.append(&apos;%s..HEAD&apos; % self.remote_branch_name())

Again to clarify, it&apos;s okay to use fully-qualified reference paths here
rather than just the one-word name?

&gt; +++ b/WebKitTools/Scripts/webkitpy/common/checkout/scm_unittest.py
&gt; @@ -635,25 +635,55 @@ Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
&gt;  
&gt; +    def setUp(self):

It would be good to document what this method does and which instance
variables it sets.

&gt; +        os.chdir(self.git_checkout_path)
&gt; +        self.scm = detect_scm_system(self.git_checkout_path)
&gt; +
&gt; +    def tearDown(self):
&gt; +        run_command([&apos;rm&apos;, &apos;-rf&apos;, self.git_checkout_path])
&gt; +        run_command([&apos;rm&apos;, &apos;-rf&apos;, self.untracking_checkout_path])

It seems like you should be os.chdir()&apos;ing back to the original working
directory in the tearDown().  You can save the original in the setUp().

&gt; +    def test_remote_branch_name(self):
&gt; +        self.assertEqual(self.scm.remote_branch_name(), &apos;refs/remotes/origin/master&apos;)
&gt; +
&gt; +    def test_remote_branch_name_untracking(self):
&gt; +        os.chdir(self.untracking_checkout_path)
&gt; +        self.assertRaises(ScriptError, self.untracking_scm.remote_branch_name)

It seems the latter method only needs one of the two checkouts created in the
setUp().  Maybe to save time you could put both asserts in a single test
method.

&gt;      def tearDown(self):
&gt;          SVNTestRepository.tear_down(self)
&gt; -        self._tear_down_git_clone_of_svn_repository()
&gt; +        self._tear_down_git_checkout()

Again, I would os.chdir() back to the original directory in the tearDown().

I expect this will be good to go once these comments are addressed.  Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>231673</commentid>
    <comment_count>10</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-28 06:41:31 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; &gt; +++ b/WebKitTools/Scripts/webkitpy/common/checkout/scm.py
&gt; &gt;      # Git-specific methods:
&gt; &gt; +    def _branch_exists(self, branch_ref):
&gt; &gt; +        return self.run([&apos;git&apos;, &apos;show-ref&apos;, &apos;--quiet&apos;, &apos;--verify&apos;, branch_ref], return_exit_code=True) == 0
&gt; 
&gt; Question: do all git commands also accept a fully-qualified reference path (i.e.
&gt; branch &quot;ref&quot;) wherever a simple branch name is accepted?
&gt; 
&gt; Would it be better to call this _reference_exists()?  The documentation for
&gt; git-show-ref calls the values that show-ref displays &quot;references&quot;.  See below
&gt; for more comments.

Similarly, the parameter name should probably also be changed if the method name is changed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>231907</commentid>
    <comment_count>11</comment_count>
      <attachid>57369</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-05-28 13:33:40 -0700</bug_when>
    <thetext>Created attachment 57369
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>231909</commentid>
    <comment_count>12</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-05-28 13:34:02 -0700</bug_when>
    <thetext>Thanks for the thorough review.

(In reply to comment #9)
&gt; &gt; +++ b/WebKitTools/Scripts/webkitpy/common/checkout/scm.py
&gt; &gt;      # Git-specific methods:
&gt; &gt; +    def _branch_exists(self, branch_ref):
&gt; &gt; +        return self.run([&apos;git&apos;, &apos;show-ref&apos;, &apos;--quiet&apos;, &apos;--verify&apos;, branch_ref], return_exit_code=True) == 0
&gt; 
&gt; Question: do all git commands also accept a fully-qualified reference path (i.e.
&gt; branch &quot;ref&quot;) wherever a simple branch name is accepted?

No. git branch -D fails if you give it a reference. That&apos;s the only case I&apos;ve found so far that doesn&apos;t accept a reference.

&gt; Would it be better to call this _reference_exists()?  The documentation for
&gt; git-show-ref calls the values that show-ref displays &quot;references&quot;.  See below
&gt; for more comments.

Done.

&gt; &gt; -    def delete_branch(self, branch):
&gt; &gt; -        if self.run([&apos;git&apos;, &apos;show-ref&apos;, &apos;--quiet&apos;, &apos;--verify&apos;, &apos;refs/heads/&apos; + branch], return_exit_code=True) == 0:
&gt; &gt; -            self.run([&apos;git&apos;, &apos;branch&apos;, &apos;-D&apos;, branch])
&gt; &gt; +    def delete_branch(self, branch_name):
&gt; &gt; +        if self._branch_exists(&apos;refs/heads/&apos; + branch_name):
&gt; &gt; +            self.run([&apos;git&apos;, &apos;branch&apos;, &apos;-D&apos;, branch_name])
&gt; 
&gt; Here you use the word &quot;branch&quot; exclusively for local &quot;refs/heads&quot; branches,
&gt; whereas above in the _branch_exists() method you use the word &quot;branch&quot; for any
&gt; git reference.
&gt; 
&gt; It might be good to maintain a distinction between these two notions in your
&gt; choice of variable and function names.  For example, &quot;branch&quot; could be used
&gt; exclusively for &quot;refs/heads&quot; references and &quot;reference&quot; for any ref).  You
&gt; could then further qualify these terms using branch_ref (or branch_reference)
&gt; for the fully-qualified name, and branch_name for the short name (as you have
&gt; done above).  Similarly, you could use remote_ref (or remote_reference) to
&gt; refer only to the remote-tracking branches.  Just a suggestion if that also
&gt; makes sense to you.

This makes total sense to me. I changed all the places I could find. I prefer branch_ref to reference. I think reference is too generic of a word. Also, I wouldn&apos;t normally abbreviate to ref, but git does it all over the place in git commands (e.g. show-ref), so I think it&apos;s OK here.

&gt; &gt; -    def svn_branch_name(self):
&gt; &gt; -        # FIXME: This should so something like: Git.read_git_config(&apos;svn-remote.svn.fetch&apos;).split(&apos;:&apos;)[1]
&gt; &gt; -        # but that doesn&apos;t work if the git repo is tracking multiple svn branches.
&gt; &gt; -        return &apos;trunk&apos;
&gt; &gt; +    def remote_branch_name(self):
&gt; &gt; +        # A git-svn checkout as per http://trac.webkit.org/wiki/UsingGitWithWebKit.
&gt; &gt; +        if self._branch_exists(&apos;refs/remotes/trunk&apos;):
&gt; &gt; +            # FIXME: This should so something like: Git.read_git_config(&apos;svn-remote.svn.fetch&apos;).split(&apos;:&apos;)[1]
&gt; &gt; +            # but that doesn&apos;t work if the git repo is tracking multiple svn branches.
&gt; 
&gt; Under what circumstances would someone track multiple SVN branches?  Could they
&gt; be doing that even if they followed the wiki instructions?  The reason I ask
&gt; is that this code seems to assume they are following the wiki instructions
&gt; anyways.

Yes, we used Git.read_git_config(&apos;svn-remote.svn.fetch&apos;).split(&apos;:&apos;)[1] for a few days and it broke at least one person (Oliver). I think you would track multiple svn repos if you wanted to also track a fork (e.g. a release branch) from the same git repo. I don&apos;t know though. Tracking multiple svn repos was too much for me to wrap my little head around, so I just changed the code back to how it was (&apos;trunk&apos;). We could try to make this more generic, but noone has seemed to need that yet.

&gt; &gt; +            return &apos;refs/remotes/trunk&apos;
&gt; 
&gt; Out of curiosity, why did you decide to start using the fully-qualified
&gt; reference name instead of the one-word name?  It might be good to include
&gt; a comment explaining why and mentioning where it matters.

There were a couple places that needed the ref and the other places that only needed a branch but were OK with taking the ref. I also prefer that it&apos;s more explicit, e.g. if you create refs/heads/trunk, we don&apos;t want to use that, right? Added a comment.

&gt; &gt; +        raise ScriptError(message=&apos;&quot;trunk&quot; and &quot;origin/master&quot; branches do not exist. Can\&apos;t find a branch to diff against.&apos;)
&gt; 
&gt; Saying &quot;remote-tracking branches&quot; might be clearer here.  I would also put the
&gt; &quot;Can&apos;t find...&quot; part first, and follow with the more specific info second.

Fixed. I also changed this code around a bit to avoid copy-pasting the branch_refs.

&gt; &gt;          if not len(args):
&gt; &gt; -            args.append(&apos;%s..HEAD&apos; % self.svn_branch_name())
&gt; &gt; +            args.append(&apos;%s..HEAD&apos; % self.remote_branch_name())
&gt; 
&gt; Again to clarify, it&apos;s okay to use fully-qualified reference paths here
&gt; rather than just the one-word name?

Correct.

&gt; &gt; +++ b/WebKitTools/Scripts/webkitpy/common/checkout/scm_unittest.py
&gt; &gt; @@ -635,25 +635,55 @@ Q1dTBx0AAAB42itg4GlgYJjGwMDDyODMxMDw34GBgQEAJPQDJA==
&gt; &gt;  
&gt; &gt; +    def setUp(self):
&gt; 
&gt; It would be good to document what this method does and which instance
&gt; variables it sets.

I added a docstring explaining what the method does. I don&apos;t feel like documenting each instance variable is worthwhile though and likely to get out of date if the code changes.

&gt; &gt; +        os.chdir(self.git_checkout_path)
&gt; &gt; +        self.scm = detect_scm_system(self.git_checkout_path)
&gt; &gt; +
&gt; &gt; +    def tearDown(self):
&gt; &gt; +        run_command([&apos;rm&apos;, &apos;-rf&apos;, self.git_checkout_path])
&gt; &gt; +        run_command([&apos;rm&apos;, &apos;-rf&apos;, self.untracking_checkout_path])
&gt; 
&gt; It seems like you should be os.chdir()&apos;ing back to the original working
&gt; directory in the tearDown().  You can save the original in the setUp().
&gt;
&gt; &gt;      def tearDown(self):
&gt; &gt;          SVNTestRepository.tear_down(self)
&gt; &gt; -        self._tear_down_git_clone_of_svn_repository()
&gt; &gt; +        self._tear_down_git_checkout()
&gt; 
&gt; Again, I would os.chdir() back to the original directory in the tearDown().

I did like SVNTestRepository.tear_down and changed to the checkout root.

&gt; &gt; +    def test_remote_branch_name(self):
&gt; &gt; +        self.assertEqual(self.scm.remote_branch_name(), &apos;refs/remotes/origin/master&apos;)
&gt; &gt; +
&gt; &gt; +    def test_remote_branch_name_untracking(self):
&gt; &gt; +        os.chdir(self.untracking_checkout_path)
&gt; &gt; +        self.assertRaises(ScriptError, self.untracking_scm.remote_branch_name)
&gt; 
&gt; It seems the latter method only needs one of the two checkouts created in the
&gt; setUp().  Maybe to save time you could put both asserts in a single test
&gt; method.

Good point. Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>232061</commentid>
    <comment_count>13</comment_count>
      <attachid>57369</attachid>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-28 20:43:53 -0700</bug_when>
    <thetext>Comment on attachment 57369
Patch

Thanks for your responses.  A couple final comments for you to consider before landing.  r=me

&gt; +        raise ScriptError(message=&apos;Can\&apos;t find a branch to diff against. %s branches do not exist.&apos; % &quot;and&quot;.join(remote_branch_refs))

Looks like this needs to be &quot; and &quot;.  You can also go back to double quotes now if you want. :)

&gt; +    def tearDown(self):
&gt; +        # Change back to a valid directory so that later calls to os.getcwd() do not fail.
&gt; +        os.chdir(detect_scm_system(os.path.dirname(__file__)).checkout_root)

I would have returned to the original directory to be consistent with the philosophy
of tests leaving no trace behind.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>232064</commentid>
    <comment_count>14</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-05-28 20:49:04 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; &gt; Question: do all git commands also accept a fully-qualified reference path (i.e.
&gt; &gt; branch &quot;ref&quot;) wherever a simple branch name is accepted?
&gt; 
&gt; No. git branch -D fails if you give it a reference. That&apos;s the only case I&apos;ve found so far that doesn&apos;t accept a reference.

From the below, it looks like it accepts a reference.  Perhaps what you meant is that it only accepts branch references (and not, say, remote-tracking references).

&gt; -    def delete_branch(self, branch):
&gt; -        if self.run([&apos;git&apos;, &apos;show-ref&apos;, &apos;--quiet&apos;, &apos;--verify&apos;, &apos;refs/heads/&apos; + branch], return_exit_code=True) == 0:
&gt; -            self.run([&apos;git&apos;, &apos;branch&apos;, &apos;-D&apos;, branch])
&gt; +    def delete_branch(self, branch_name):
&gt; +        if self._branch_ref_exists(&apos;refs/heads/&apos; + branch_name):
&gt; +            self.run([&apos;git&apos;, &apos;branch&apos;, &apos;-D&apos;, branch_name])</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233888</commentid>
    <comment_count>15</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-06-03 13:08:21 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; (In reply to comment #12)
&gt; &gt; &gt; Question: do all git commands also accept a fully-qualified reference path (i.e.
&gt; &gt; &gt; branch &quot;ref&quot;) wherever a simple branch name is accepted?
&gt; &gt; 
&gt; &gt; No. git branch -D fails if you give it a reference. That&apos;s the only case I&apos;ve found so far that doesn&apos;t accept a reference.
&gt; 
&gt; From the below, it looks like it accepts a reference.  Perhaps what you meant is that it only accepts branch references (and not, say, remote-tracking references).

Nope. We&apos;re only passing the branch_name to git branch. We pass the reference to _branch_ref_exists. If you pass the reference to git branch, you get an error.

&gt; &gt; +    def delete_branch(self, branch_name):
&gt; &gt; +        if self._branch_ref_exists(&apos;refs/heads/&apos; + branch_name):
&gt; &gt; +            self.run([&apos;git&apos;, &apos;branch&apos;, &apos;-D&apos;, branch_name])</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233894</commentid>
    <comment_count>16</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2010-06-03 13:21:01 -0700</bug_when>
    <thetext>Committed r60633: &lt;http://trac.webkit.org/changeset/60633&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>233934</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-03 14:45:04 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/60633 might have broken GTK Linux 64-bit Release
The following changes are on the blame list:
http://trac.webkit.org/changeset/60632
http://trac.webkit.org/changeset/60633
http://trac.webkit.org/changeset/60634
http://trac.webkit.org/changeset/60635
http://trac.webkit.org/changeset/60636</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56907</attachid>
            <date>2010-05-24 11:25:54 -0700</date>
            <delta_ts>2010-05-25 11:10:21 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38156-20100524112553.patch</filename>
            <type>text/plain</type>
            <size>5336</size>
            <attacher name="Ojan Vafai">ojan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBmNDhlMDMxNzQwYzAzYzA3ODliNGU0ZDNkOTZiMzgwMzhiMTEwMzA5Li4wYTNiMjY2
Yjc1OGM2ZDY2N2U2ZTg3MDMyMTdlMjFjYTdmZmMzNmFkIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAK
KzIwMTAtMDUtMjQgIE9qYW4gVmFmYWkgIDxvamFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBtYW55IHdlYmtpdC1wYXRjaCBj
b21tYW5kcyBmYWlsIGluIGEgbm9uLXN2biB0cmFja2luZyBnaXQgY2hlY2tvdXQKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM4MTU2CisKKyAgICAgICAg
SWYgdGhlIHRydW5rIGJyYW5jaCBkb2Vzbid0IGV4aXN0LCBmYWxsYmFjayB0byB0aGUgbWFzdGVy
IGJyYW5jaC4KKyAgICAgICAgSWYgbmVpdGhlciBleGlzdHMsIHRoZW4gZXJyb3Igb3V0LiBUaGlz
IG1ha2VzIHdlYmtpdC1wYXRjaCB3b3JrCisgICAgICAgIGZvciBhbnlvbmUgdGhhdCBmb2xsb3dz
IHRoZSBpbnRydWN0aW9ucyBhdCBodHRwOi8vdHJhYy53ZWJraXQub3JnL3dpa2kvVXNpbmdHaXRX
aXRoV2ViS2l0CisgICAgICAgIHRvIGNoZWNrb3V0IHdlYmtpdC4gVGhlIGZhbGxiYWNrIHRvIG1h
c3RlciBpcyBmb3IgcGVvcGxlIHdobyBkb24ndAorICAgICAgICBkbyB0aGUgc3RlcHMgb24gdGhh
dCBwYWdlIGZvciB0cmFja2luZyBzdm4uCisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9jaGVja291dC9zY20ucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24v
Y2hlY2tvdXQvc2NtX3VuaXR0ZXN0LnB5OgorCiAyMDEwLTA1LTI0ICBFcmljIFNlaWRlbCAgPGVy
aWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBDaHJpcyBKZXJkb25lay4KZGlm
ZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L3Nj
bS5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L3NjbS5w
eQppbmRleCBlNjhjY2ZhOWE1YmU3YmY2Yjc5N2M4OTFjZjMwZTAwMGExMDRhNWQwLi5mNGJkZWUz
MGUwOWEzMjA4ODEzZDdiNzUzN2M3Mjk1MDc1YTVmN2I4IDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY20ucHkKKysrIGIvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtLnB5CkBAIC02OTMsMTggKzY5
MywyOCBAQCBjbGFzcyBHaXQoU0NNKToKICAgICAgICAgcmV0dXJuIHNlbGYucnVuKFsnZ2l0Jywg
J3N2bicsICdsb2cnLCAnLS1saW1pdD0xJ10pCiAKICAgICAjIEdpdC1zcGVjaWZpYyBtZXRob2Rz
OgorICAgIGRlZiBfYnJhbmNoX2V4aXN0cyhzZWxmLCBicmFuY2gpOgorICAgICAgICByZXR1cm4g
c2VsZi5ydW4oWydnaXQnLCAnc2hvdy1yZWYnLCAnLS1xdWlldCcsICctLXZlcmlmeScsIGJyYW5j
aF0sIHJldHVybl9leGl0X2NvZGU9VHJ1ZSkgPT0gMAogCiAgICAgZGVmIGRlbGV0ZV9icmFuY2go
c2VsZiwgYnJhbmNoKToKLSAgICAgICAgaWYgc2VsZi5ydW4oWydnaXQnLCAnc2hvdy1yZWYnLCAn
LS1xdWlldCcsICctLXZlcmlmeScsICdyZWZzL2hlYWRzLycgKyBicmFuY2hdLCByZXR1cm5fZXhp
dF9jb2RlPVRydWUpID09IDA6CisgICAgICAgIGlmIHNlbGYuX2JyYW5jaF9leGlzdHMoJ3JlZnMv
aGVhZHMvJyArIGJyYW5jaCk6CiAgICAgICAgICAgICBzZWxmLnJ1bihbJ2dpdCcsICdicmFuY2gn
LCAnLUQnLCBicmFuY2hdKQogCiAgICAgZGVmIHN2bl9tZXJnZV9iYXNlKHNlbGYpOgogICAgICAg
ICByZXR1cm4gc2VsZi5ydW4oWydnaXQnLCAnbWVyZ2UtYmFzZScsIHNlbGYuc3ZuX2JyYW5jaF9u
YW1lKCksICdIRUFEJ10pLnN0cmlwKCkKIAogICAgIGRlZiBzdm5fYnJhbmNoX25hbWUoc2VsZik6
Ci0gICAgICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIHNvIHNvbWV0aGluZyBsaWtlOiBHaXQucmVh
ZF9naXRfY29uZmlnKCdzdm4tcmVtb3RlLnN2bi5mZXRjaCcpLnNwbGl0KCc6JylbMV0KLSAgICAg
ICAgIyBidXQgdGhhdCBkb2Vzbid0IHdvcmsgaWYgdGhlIGdpdCByZXBvIGlzIHRyYWNraW5nIG11
bHRpcGxlIHN2biBicmFuY2hlcy4KLSAgICAgICAgcmV0dXJuICd0cnVuaycKKyAgICAgICAgIyBB
IGdpdC1zdm4gY2hlY2tvdXQgYXMgcGVyIGh0dHA6Ly90cmFjLndlYmtpdC5vcmcvd2lraS9Vc2lu
Z0dpdFdpdGhXZWJLaXQuCisgICAgICAgIGlmIHNlbGYuX2JyYW5jaF9leGlzdHMoJ3JlZnMvcmVt
b3Rlcy90cnVuaycpOgorICAgICAgICAgICAgIyBGSVhNRTogVGhpcyBzaG91bGQgc28gc29tZXRo
aW5nIGxpa2U6IEdpdC5yZWFkX2dpdF9jb25maWcoJ3N2bi1yZW1vdGUuc3ZuLmZldGNoJykuc3Bs
aXQoJzonKVsxXQorICAgICAgICAgICAgIyBidXQgdGhhdCBkb2Vzbid0IHdvcmsgaWYgdGhlIGdp
dCByZXBvIGlzIHRyYWNraW5nIG11bHRpcGxlIHN2biBicmFuY2hlcy4KKyAgICAgICAgICAgIHJl
dHVybiAncmVmcy9yZW1vdGVzL3RydW5rJworCisgICAgICAgICMgQSBnaXQgY2xvbmUgb2YgZ2l0
Oi8vZ2l0LndlYmtpdC5vcmcvV2ViS2l0LmdpdCB0aGF0IGlzIG5vdCB0cmFja2luZyBzdm4uCisg
ICAgICAgIGlmIHNlbGYuX2JyYW5jaF9leGlzdHMoJ3JlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVy
Jyk6CisgICAgICAgICAgICByZXR1cm4gJ3JlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyJworCisg
ICAgICAgIHJhaXNlIFNjcmlwdEVycm9yKG1lc3NhZ2U9IlwidHJ1bmtcIiBhbmQgXCJvcmlnaW4v
bWFzdGVyXCIgYnJhbmNoZXMgZG8gbm90IGV4aXN0LiBDYW4ndCBmaW5kIGEgYnJhbmNoIHRvIGRp
ZmYgYWdhaW5zdC4iKQogCiAgICAgZGVmIGNvbW1pdF9sb2NhbGx5X3dpdGhfbWVzc2FnZShzZWxm
LCBtZXNzYWdlKToKICAgICAgICAgc2VsZi5ydW4oWydnaXQnLCAnY29tbWl0JywgJy0tYWxsJywg
Jy1GJywgJy0nXSwgaW5wdXQ9bWVzc2FnZSkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L3NjbV91bml0dGVzdC5weSBiL1dlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L3NjbV91bml0dGVzdC5weQppbmRleCBi
NmFlMzg4MDRiNTg3YjFmMGIxOTNiZGRkYzhlZTVmMDEzYjJjZmZkLi5hMGViYmYzYzljZjljMTY1
ZTExMzdhZjFkMzc2ZWExOWM5ZGZhNmU3IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY21fdW5pdHRlc3QucHkKKysrIGIvV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtX3VuaXR0ZXN0LnB5CkBAIC02
ODMsMTMgKzY4MywxMiBAQCBjbGFzcyBHaXRUZXN0KFNDTVRlc3QpOgogICAgICAgICBzZWxmLmFz
c2VydEVxdWFsKGxlbihzZWxmLnNjbS5sb2NhbF9jb21taXRzKCkpLCAwKQogCiAgICAgZGVmIHRl
c3RfZGVsZXRlX2JyYW5jaChzZWxmKToKLSAgICAgICAgb2xkX2JyYW5jaCA9IHJ1bl9jb21tYW5k
KFsnZ2l0JywgJ3N5bWJvbGljLXJlZicsICdIRUFEJ10pLnN0cmlwKCkKICAgICAgICAgbmV3X2Jy
YW5jaCA9ICdmb28nCiAKICAgICAgICAgcnVuX2NvbW1hbmQoWydnaXQnLCAnY2hlY2tvdXQnLCAn
LWInLCBuZXdfYnJhbmNoXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW5fY29tbWFuZChb
J2dpdCcsICdzeW1ib2xpYy1yZWYnLCAnSEVBRCddKS5zdHJpcCgpLCAncmVmcy9oZWFkcy8nICsg
bmV3X2JyYW5jaCkKIAotICAgICAgICBydW5fY29tbWFuZChbJ2dpdCcsICdjaGVja291dCcsIG9s
ZF9icmFuY2hdKQorICAgICAgICBydW5fY29tbWFuZChbJ2dpdCcsICdjaGVja291dCcsICctYics
ICdiYXInXSkKICAgICAgICAgc2VsZi5zY20uZGVsZXRlX2JyYW5jaChuZXdfYnJhbmNoKQogCiAg
ICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmUuc2VhcmNoKHInZm9vJywgcnVuX2NvbW1hbmQoWydn
aXQnLCAnYnJhbmNoJ10pKSkKQEAgLTg4MSw2ICs4ODAsMjQgQEAgY2xhc3MgR2l0VGVzdChTQ01U
ZXN0KToKICAgICAgICAgc2NtID0gZGV0ZWN0X3NjbV9zeXN0ZW0oc2VsZi5naXRfY2hlY2tvdXRf
cGF0aCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU2NyaXB0RXJyb3IsIHNjbS5jb21taXRf
d2l0aF9tZXNzYWdlLCAiYW5vdGhlciB0ZXN0IGNvbW1pdCIsIHNxdWFzaD1UcnVlKQogCisgICAg
ZGVmIHRlc3Rfc3ZuX2JyYW5jaF9uYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
KHNlbGYuc2NtLnN2bl9icmFuY2hfbmFtZSgpLCAncmVmcy9yZW1vdGVzL3RydW5rJykKKworICAg
IGRlZiB0ZXN0X3N2bl9icmFuY2hfbmFtZV9naXRfb25seShzZWxmKToKKyAgICAgICAgZ2l0X2No
ZWNrb3V0Ml9wYXRoID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9ImdpdF90ZXN0X2NoZWNrb3V0
MiIpCisgICAgICAgIHJ1bl9jb21tYW5kKFsnZ2l0JywgJ2Nsb25lJywgJy0tcXVpZXQnLCBzZWxm
LmdpdF9jaGVja291dF9wYXRoLCAgZ2l0X2NoZWNrb3V0Ml9wYXRoXSkKKyAgICAgICAgb3MuY2hk
aXIoZ2l0X2NoZWNrb3V0Ml9wYXRoKQorICAgICAgICBzY20gPSBkZXRlY3Rfc2NtX3N5c3RlbShn
aXRfY2hlY2tvdXQyX3BhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2NtLnN2bl9icmFu
Y2hfbmFtZSgpLCAncmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXInKQorCisgICAgZGVmIHRlc3Rf
c3ZuX2JyYW5jaF9uYW1lX2dpdF9vbmx5X3VudHJhY2tpbmcoc2VsZik6CisgICAgICAgICIiIlRl
c3RzIGEgZ2l0IGNoZWNrb3V0IHRoYXQgaXMgbm90IHRyYWNraW5nIGFub3RoZXIgcmVwby4iIiIK
KyAgICAgICAgZ2l0X2NoZWNrb3V0Ml9wYXRoID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9Imdp
dF90ZXN0X2NoZWNrb3V0MiIpCisgICAgICAgIHJ1bl9jb21tYW5kKFsnZ2l0JywgJ2luaXQnLCAn
LS1xdWlldCcsIGdpdF9jaGVja291dDJfcGF0aF0pCisgICAgICAgIG9zLmNoZGlyKGdpdF9jaGVj
a291dDJfcGF0aCkKKyAgICAgICAgc2NtID0gZGV0ZWN0X3NjbV9zeXN0ZW0oZ2l0X2NoZWNrb3V0
Ml9wYXRoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTY3JpcHRFcnJvciwgc2NtLnN2bl9i
cmFuY2hfbmFtZSkKKwogICAgIGRlZiB0ZXN0X3JldmVyc2VfZGlmZihzZWxmKToKICAgICAgICAg
c2VsZi5fc2hhcmVkX3Rlc3RfcmV2ZXJzZV9kaWZmKCkKIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>57032</attachid>
            <date>2010-05-25 11:10:26 -0700</date>
            <delta_ts>2010-05-28 13:33:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38156-20100525111025.patch</filename>
            <type>text/plain</type>
            <size>12114</size>
            <attacher name="Ojan Vafai">ojan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBhZDE1OTU1NjA1NmU4YjU5NWNjYWEwMzBkMjg3NzMxNDU5YTZmZDIzLi41YjE3OTI1
MjgxNDVhYjlkYjJlNmE1ZmQxZDY4YWI1NDgyNTdhZmM3IDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAK
KzIwMTAtMDUtMjQgIE9qYW4gVmFmYWkgIDxvamFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBtYW55IHdlYmtpdC1wYXRjaCBj
b21tYW5kcyBmYWlsIGluIGEgbm9uLXN2biB0cmFja2luZyBnaXQgY2hlY2tvdXQKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM4MTU2CisKKyAgICAgICAg
SWYgdGhlIHRydW5rIGJyYW5jaCBkb2Vzbid0IGV4aXN0LCBmYWxsYmFjayB0byB0aGUgbWFzdGVy
IGJyYW5jaC4KKyAgICAgICAgSWYgbmVpdGhlciBleGlzdHMsIHRoZW4gZXJyb3Igb3V0LiBUaGlz
IG1ha2VzIHdlYmtpdC1wYXRjaCB3b3JrCisgICAgICAgIGZvciBhbnlvbmUgdGhhdCBmb2xsb3dz
IHRoZSBpbnRydWN0aW9ucyBhdCBodHRwOi8vdHJhYy53ZWJraXQub3JnL3dpa2kvVXNpbmdHaXRX
aXRoV2ViS2l0CisgICAgICAgIHRvIGNoZWNrb3V0IHdlYmtpdC4gVGhlIGZhbGxiYWNrIHRvIG1h
c3RlciBpcyBmb3IgcGVvcGxlIHdobyBkb24ndAorICAgICAgICBkbyB0aGUgc3RlcHMgb24gdGhh
dCBwYWdlIGZvciB0cmFja2luZyBzdm4uCisKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9jaGVja291dC9zY20ucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24v
Y2hlY2tvdXQvc2NtX3VuaXR0ZXN0LnB5OgorCiAyMDEwLTA1LTI0ICBBbnRvbmlvIEdvbWVzICA8
dG9uaWtpdG9vQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwg
YW5kIEtlbnQgVGFtdXJhIChmb3IgdGhlIENocm9taXVtIHBhcnQpLgpkaWZmIC0tZ2l0IGEvV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtLnB5IGIvV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtLnB5CmluZGV4IGVlYTc2
YmU2MTVlNjZkYTViYjFiNjVjYmJkZGQ5YmFlNmUyYzc1NzYuLmViYWQwMjg0ZjJlNDIxMjBhNTU3
NjQxZmE3ZDIwMWRhMjE1ZDBjZjggMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL2NoZWNrb3V0L3NjbS5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9jaGVja291dC9zY20ucHkKQEAgLTI0MCw3ICsyNDAsNyBAQCBjbGFzcyBT
Q006CiAgICAgZGVmIHN1cHBvcnRzX2xvY2FsX2NvbW1pdHMoKToKICAgICAgICAgcmFpc2UgTm90
SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQiCiAKLSAgICBkZWYg
c3ZuX21lcmdlX2Jhc2UoKToKKyAgICBkZWYgcmVtb3RlX21lcmdlX2Jhc2UoKToKICAgICAgICAg
cmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQiCiAK
ICAgICBkZWYgY29tbWl0X2xvY2FsbHlfd2l0aF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgpAQCAt
NDY1LDExICs0NjUsMTEgQEAgY2xhc3MgR2l0KFNDTSk6CiAKICAgICBkZWYgZGlzY2FyZF9sb2Nh
bF9jb21taXRzKHNlbGYpOgogICAgICAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBwcm9iYWJseSB1
c2UgY3dkPXNlbGYuY2hlY2tvdXRfcm9vdAotICAgICAgICBzZWxmLnJ1bihbJ2dpdCcsICdyZXNl
dCcsICctLWhhcmQnLCBzZWxmLnN2bl9icmFuY2hfbmFtZSgpXSkKKyAgICAgICAgc2VsZi5ydW4o
WydnaXQnLCAncmVzZXQnLCAnLS1oYXJkJywgc2VsZi5yZW1vdGVfYnJhbmNoX25hbWUoKV0pCiAg
ICAgCiAgICAgZGVmIGxvY2FsX2NvbW1pdHMoc2VsZik6CiAgICAgICAgICMgRklYTUU6IFRoaXMg
c2hvdWxkIHByb2JhYmx5IHVzZSBjd2Q9c2VsZi5jaGVja291dF9yb290Ci0gICAgICAgIHJldHVy
biBzZWxmLnJ1bihbJ2dpdCcsICdsb2cnLCAnLS1wcmV0dHk9b25lbGluZScsICdIRUFELi4uJyAr
IHNlbGYuc3ZuX2JyYW5jaF9uYW1lKCldKS5zcGxpdGxpbmVzKCkKKyAgICAgICAgcmV0dXJuIHNl
bGYucnVuKFsnZ2l0JywgJ2xvZycsICctLXByZXR0eT1vbmVsaW5lJywgJ0hFQUQuLi4nICsgc2Vs
Zi5yZW1vdGVfYnJhbmNoX25hbWUoKV0pLnNwbGl0bGluZXMoKQogCiAgICAgZGVmIHJlYmFzZV9p
bl9wcm9ncmVzcyhzZWxmKToKICAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKG9zLnBhdGgu
am9pbihzZWxmLmNoZWNrb3V0X3Jvb3QsICcuZ2l0L3JlYmFzZS1hcHBseScpKQpAQCAtNTA3LDcg
KzUwNyw3IEBAIGNsYXNzIEdpdChTQ00pOgogICAgICAgICAgICAgcmV0dXJuIGdpdF9jb21taXQK
IAogICAgICAgICBpZiBzZWxmLnNob3VsZF9zcXVhc2goc3F1YXNoKToKLSAgICAgICAgICAgIHJl
dHVybiBzZWxmLnN2bl9tZXJnZV9iYXNlKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJlbW90
ZV9tZXJnZV9iYXNlKCkKIAogICAgICAgICAjIEZJWE1FOiBOb24tc3F1YXNoIGJlaGF2aW9yIHNo
b3VsZCBtYXRjaCBjb21taXRfd2l0aF9tZXNzYWdlLiBJdCByYWlzZXMgYW4gZXJyb3IKICAgICAg
ICAgIyBpZiB0aGVyZSBhcmUgd29ya2luZyBjb3B5IGNoYW5nZXMgYW5kIC0tc3F1YXNoIG9yIC0t
bm8tc3F1YXNoIHdhc24ndCBwYXNzZWQgaW4uCkBAIC02MDIsMTQgKzYwMiwxNCBAQCBjbGFzcyBH
aXQoU0NNKToKICAgICAgICAgICAgICAgICBpZiBudW1fbG9jYWxfY29tbWl0cyA+IDEgb3IgKG51
bV9sb2NhbF9jb21taXRzID4gMCBhbmQgbm90IHNlbGYud29ya2luZ19kaXJlY3RvcnlfaXNfY2xl
YW4oKSk6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFNjcmlwdEVycm9yKG1lc3NhZ2U9c2Vs
Zi5fZ2V0X3NxdWFzaF9lcnJvcl9tZXNzYWdlKG51bV9sb2NhbF9jb21taXRzKSkKIAotICAgICAg
ICBpZiBzcXVhc2ggYW5kIHNlbGYuX3N2bl9icmFuY2hfaGFzX2V4dHJhX2NvbW1pdHMoKToKKyAg
ICAgICAgaWYgc3F1YXNoIGFuZCBzZWxmLl9yZW1vdGVfYnJhbmNoX2hhc19leHRyYV9jb21taXRz
KCk6CiAgICAgICAgICAgICByYWlzZSBTY3JpcHRFcnJvcihtZXNzYWdlPSJDYW5ub3QgdXNlIC0t
c3F1YXNoIHdoZW4gSEVBRCBpcyBub3QgZnVsbHkgbWVyZ2VkL3JlYmFzZWQgdG8gJXMuICIKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgYnJhbmNoIG5lZWRzIHRv
IGJlIHN5bmNlZCBmaXJzdC4iICUgc2VsZi5zdm5fYnJhbmNoX25hbWUoKSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgYnJhbmNoIG5lZWRzIHRvIGJlIHN5bmNl
ZCBmaXJzdC4iICUgc2VsZi5yZW1vdGVfYnJhbmNoX25hbWUoKSkKIAogICAgICAgICByZXR1cm4g
c3F1YXNoCiAKLSAgICBkZWYgX3N2bl9icmFuY2hfaGFzX2V4dHJhX2NvbW1pdHMoc2VsZik6Ci0g
ICAgICAgIHJldHVybiBsZW4ocnVuX2NvbW1hbmQoWydnaXQnLCAncmV2LWxpc3QnLCAnLS1tYXgt
Y291bnQ9MScsIHNlbGYuc3ZuX2JyYW5jaF9uYW1lKCksICdeSEVBRCddKSkKKyAgICBkZWYgX3Jl
bW90ZV9icmFuY2hfaGFzX2V4dHJhX2NvbW1pdHMoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4o
cnVuX2NvbW1hbmQoWydnaXQnLCAncmV2LWxpc3QnLCAnLS1tYXgtY291bnQ9MScsIHNlbGYucmVt
b3RlX2JyYW5jaF9uYW1lKCksICdeSEVBRCddKSkKIAogICAgIGRlZiBjb21taXRfd2l0aF9tZXNz
YWdlKHNlbGYsIG1lc3NhZ2UsIHVzZXJuYW1lPU5vbmUsIGdpdF9jb21taXQ9Tm9uZSwgc3F1YXNo
PU5vbmUpOgogICAgICAgICAjIFVzZXJuYW1lIGlzIGlnbm9yZWQgZHVyaW5nIEdpdCBjb21taXRz
LgpAQCAtNjI0LDcgKzYyNCw3IEBAIGNsYXNzIEdpdChTQ00pOgogCiAgICAgICAgIHNxdWFzaCA9
IHNlbGYuc2hvdWxkX3NxdWFzaChzcXVhc2gpCiAgICAgICAgIGlmIHNxdWFzaDoKLSAgICAgICAg
ICAgIHNlbGYucnVuKFsnZ2l0JywgJ3Jlc2V0JywgJy0tc29mdCcsIHNlbGYuc3ZuX2JyYW5jaF9u
YW1lKCldKQorICAgICAgICAgICAgc2VsZi5ydW4oWydnaXQnLCAncmVzZXQnLCAnLS1zb2Z0Jywg
c2VsZi5yZW1vdGVfYnJhbmNoX25hbWUoKV0pCiAgICAgICAgICAgICBzZWxmLmNvbW1pdF9sb2Nh
bGx5X3dpdGhfbWVzc2FnZShtZXNzYWdlKQogICAgICAgICBlbGlmIG5vdCBzZWxmLndvcmtpbmdf
ZGlyZWN0b3J5X2lzX2NsZWFuKCk6CiAgICAgICAgICAgICBpZiBub3QgbGVuKHNlbGYubG9jYWxf
Y29tbWl0cygpKToKQEAgLTY2Miw3ICs2NjIsNyBAQCBjbGFzcyBHaXQoU0NNKToKICAgICAgICAg
IyBXZSB3cmFwIGluIGEgdHJ5Li4uZmluYWxseSBibG9jayBzbyBpZiBhbnl0aGluZyBnb2VzIHdy
b25nLCB3ZSBjbGVhbiB1cCB0aGUgYnJhbmNoZXMuCiAgICAgICAgIGNvbW1pdF9zdWNjZWVkZWQg
PSBUcnVlCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYucnVuKFsnZ2l0JywgJ2NoZWNr
b3V0JywgJy1xJywgJy1iJywgTUVSR0VfQlJBTkNILCBzZWxmLnN2bl9icmFuY2hfbmFtZSgpXSkK
KyAgICAgICAgICAgIHNlbGYucnVuKFsnZ2l0JywgJ2NoZWNrb3V0JywgJy1xJywgJy1iJywgTUVS
R0VfQlJBTkNILCBzZWxmLnJlbW90ZV9icmFuY2hfbmFtZSgpXSkKIAogICAgICAgICAgICAgZm9y
IGNvbW1pdCBpbiBjb21taXRfaWRzOgogICAgICAgICAgICAgICAgICMgV2UncmUgb24gYSBkaWZm
ZXJlbnQgYnJhbmNoIG5vdywgc28gY29udmVydCAiaGVhZCIgdG8gdGhlIGJyYW5jaCBuYW1lLgpA
QCAtNjkzLDE4ICs2OTMsMjggQEAgY2xhc3MgR2l0KFNDTSk6CiAgICAgICAgIHJldHVybiBzZWxm
LnJ1bihbJ2dpdCcsICdzdm4nLCAnbG9nJywgJy0tbGltaXQ9MSddKQogCiAgICAgIyBHaXQtc3Bl
Y2lmaWMgbWV0aG9kczoKKyAgICBkZWYgX2JyYW5jaF9leGlzdHMoc2VsZiwgYnJhbmNoX3JlZik6
CisgICAgICAgIHJldHVybiBzZWxmLnJ1bihbJ2dpdCcsICdzaG93LXJlZicsICctLXF1aWV0Jywg
Jy0tdmVyaWZ5JywgYnJhbmNoX3JlZl0sIHJldHVybl9leGl0X2NvZGU9VHJ1ZSkgPT0gMAogCi0g
ICAgZGVmIGRlbGV0ZV9icmFuY2goc2VsZiwgYnJhbmNoKToKLSAgICAgICAgaWYgc2VsZi5ydW4o
WydnaXQnLCAnc2hvdy1yZWYnLCAnLS1xdWlldCcsICctLXZlcmlmeScsICdyZWZzL2hlYWRzLycg
KyBicmFuY2hdLCByZXR1cm5fZXhpdF9jb2RlPVRydWUpID09IDA6Ci0gICAgICAgICAgICBzZWxm
LnJ1bihbJ2dpdCcsICdicmFuY2gnLCAnLUQnLCBicmFuY2hdKQorICAgIGRlZiBkZWxldGVfYnJh
bmNoKHNlbGYsIGJyYW5jaF9uYW1lKToKKyAgICAgICAgaWYgc2VsZi5fYnJhbmNoX2V4aXN0cygn
cmVmcy9oZWFkcy8nICsgYnJhbmNoX25hbWUpOgorICAgICAgICAgICAgc2VsZi5ydW4oWydnaXQn
LCAnYnJhbmNoJywgJy1EJywgYnJhbmNoX25hbWVdKQogCi0gICAgZGVmIHN2bl9tZXJnZV9iYXNl
KHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5ydW4oWydnaXQnLCAnbWVyZ2UtYmFzZScsIHNl
bGYuc3ZuX2JyYW5jaF9uYW1lKCksICdIRUFEJ10pLnN0cmlwKCkKKyAgICBkZWYgcmVtb3RlX21l
cmdlX2Jhc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJ1bihbJ2dpdCcsICdtZXJnZS1i
YXNlJywgc2VsZi5yZW1vdGVfYnJhbmNoX25hbWUoKSwgJ0hFQUQnXSkuc3RyaXAoKQogCi0gICAg
ZGVmIHN2bl9icmFuY2hfbmFtZShzZWxmKToKLSAgICAgICAgIyBGSVhNRTogVGhpcyBzaG91bGQg
c28gc29tZXRoaW5nIGxpa2U6IEdpdC5yZWFkX2dpdF9jb25maWcoJ3N2bi1yZW1vdGUuc3ZuLmZl
dGNoJykuc3BsaXQoJzonKVsxXQotICAgICAgICAjIGJ1dCB0aGF0IGRvZXNuJ3Qgd29yayBpZiB0
aGUgZ2l0IHJlcG8gaXMgdHJhY2tpbmcgbXVsdGlwbGUgc3ZuIGJyYW5jaGVzLgotICAgICAgICBy
ZXR1cm4gJ3RydW5rJworICAgIGRlZiByZW1vdGVfYnJhbmNoX25hbWUoc2VsZik6CisgICAgICAg
ICMgQSBnaXQtc3ZuIGNoZWNrb3V0IGFzIHBlciBodHRwOi8vdHJhYy53ZWJraXQub3JnL3dpa2kv
VXNpbmdHaXRXaXRoV2ViS2l0LgorICAgICAgICBpZiBzZWxmLl9icmFuY2hfZXhpc3RzKCdyZWZz
L3JlbW90ZXMvdHJ1bmsnKToKKyAgICAgICAgICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIHNvIHNv
bWV0aGluZyBsaWtlOiBHaXQucmVhZF9naXRfY29uZmlnKCdzdm4tcmVtb3RlLnN2bi5mZXRjaCcp
LnNwbGl0KCc6JylbMV0KKyAgICAgICAgICAgICMgYnV0IHRoYXQgZG9lc24ndCB3b3JrIGlmIHRo
ZSBnaXQgcmVwbyBpcyB0cmFja2luZyBtdWx0aXBsZSBzdm4gYnJhbmNoZXMuCisgICAgICAgICAg
ICByZXR1cm4gJ3JlZnMvcmVtb3Rlcy90cnVuaycKKworICAgICAgICAjIEEgZ2l0IGNsb25lIG9m
IGdpdDovL2dpdC53ZWJraXQub3JnL1dlYktpdC5naXQgdGhhdCBpcyBub3QgdHJhY2tpbmcgc3Zu
LgorICAgICAgICBpZiBzZWxmLl9icmFuY2hfZXhpc3RzKCdyZWZzL3JlbW90ZXMvb3JpZ2luL21h
c3RlcicpOgorICAgICAgICAgICAgcmV0dXJuICdyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcicK
KworICAgICAgICByYWlzZSBTY3JpcHRFcnJvcihtZXNzYWdlPScidHJ1bmsiIGFuZCAib3JpZ2lu
L21hc3RlciIgYnJhbmNoZXMgZG8gbm90IGV4aXN0LiBDYW5cJ3QgZmluZCBhIGJyYW5jaCB0byBk
aWZmIGFnYWluc3QuJykKIAogICAgIGRlZiBjb21taXRfbG9jYWxseV93aXRoX21lc3NhZ2Uoc2Vs
ZiwgbWVzc2FnZSk6CiAgICAgICAgIHNlbGYucnVuKFsnZ2l0JywgJ2NvbW1pdCcsICctLWFsbCcs
ICctRicsICctJ10sIGlucHV0PW1lc3NhZ2UpCkBAIC03MjYsNyArNzM2LDcgQEAgY2xhc3MgR2l0
KFNDTSk6CiAgICAgIyBBIEIgICAgIDogW0EsIEJdICAoZGlmZmVyZW50IGZyb20gZ2l0IGRpZmYs
IHdoaWNoIHdvdWxkIHVzZSAicmV2LWxpc3QgQS4uQiIpCiAgICAgZGVmIGNvbW1pdF9pZHNfZnJv
bV9jb21taXRpc2hfYXJndW1lbnRzKHNlbGYsIGFyZ3MpOgogICAgICAgICBpZiBub3QgbGVuKGFy
Z3MpOgotICAgICAgICAgICAgYXJncy5hcHBlbmQoJyVzLi5IRUFEJyAlIHNlbGYuc3ZuX2JyYW5j
aF9uYW1lKCkpCisgICAgICAgICAgICBhcmdzLmFwcGVuZCgnJXMuLkhFQUQnICUgc2VsZi5yZW1v
dGVfYnJhbmNoX25hbWUoKSkKIAogICAgICAgICBjb21taXRfaWRzID0gW10KICAgICAgICAgZm9y
IGNvbW1pdGlzaCBpbiBhcmdzOgpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vY2hlY2tvdXQvc2NtX3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtX3VuaXR0ZXN0LnB5CmluZGV4IDhlZWE0ZDhh
ODUxNTVkNDIyN2U5ZTcwYTdhYzUwNGU5OGJhNWQxY2IuLjUzODA1MjI0OWJhMzRhMzViNWFiYTY1
MzVhMzkxYWIxN2JmMzA5ZGIgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL2NoZWNrb3V0L3NjbV91bml0dGVzdC5weQorKysgYi9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY21fdW5pdHRlc3QucHkKQEAgLTYzNSwyNSAr
NjM1LDU1IEBAIFExZFRCeDBBQUFCNDJpdGc0R2xnWUpqR3dNRER5T0RNeE1EdzM0R0JnUUVBSlBR
REpBPT0KIAogY2xhc3MgR2l0VGVzdChTQ01UZXN0KToKIAotICAgIGRlZiBfc2V0dXBfZ2l0X2Ns
b25lX29mX3N2bl9yZXBvc2l0b3J5KHNlbGYpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAg
ICAgIyAtLXF1aWV0IGRvZXNuJ3QgbWFrZSBnaXQgc3ZuIHNpbGVudCwgc28gd2UgdXNlIHJ1bl9z
aWxlbnQgdG8gcmVkaXJlY3Qgb3V0cHV0CisgICAgICAgIHNlbGYudW50cmFja2luZ19jaGVja291
dF9wYXRoID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9ImdpdF90ZXN0X2NoZWNrb3V0MiIpCisg
ICAgICAgIHJ1bl9jb21tYW5kKFsnZ2l0JywgJ2luaXQnLCBzZWxmLnVudHJhY2tpbmdfY2hlY2tv
dXRfcGF0aF0pCisKKyAgICAgICAgb3MuY2hkaXIoc2VsZi51bnRyYWNraW5nX2NoZWNrb3V0X3Bh
dGgpCisgICAgICAgIHdyaXRlX2ludG9fZmlsZV9hdF9wYXRoKCdmb29fZmlsZScsICdmb28nKQor
ICAgICAgICBydW5fY29tbWFuZChbJ2dpdCcsICdhZGQnLCAnZm9vX2ZpbGUnXSkKKyAgICAgICAg
cnVuX2NvbW1hbmQoWydnaXQnLCAnY29tbWl0JywgJy1hbScsICdkdW1teSBjb21taXQnXSkKKyAg
ICAgICAgc2VsZi51bnRyYWNraW5nX3NjbSA9IGRldGVjdF9zY21fc3lzdGVtKHNlbGYudW50cmFj
a2luZ19jaGVja291dF9wYXRoKQorCisgICAgICAgIHNlbGYuZ2l0X2NoZWNrb3V0X3BhdGggPSB0
ZW1wZmlsZS5ta2R0ZW1wKHN1ZmZpeD0iZ2l0X3Rlc3RfY2hlY2tvdXQiKQorICAgICAgICBydW5f
Y29tbWFuZChbJ2dpdCcsICdjbG9uZScsICctLXF1aWV0Jywgc2VsZi51bnRyYWNraW5nX2NoZWNr
b3V0X3BhdGgsIHNlbGYuZ2l0X2NoZWNrb3V0X3BhdGhdKQorICAgICAgICBvcy5jaGRpcihzZWxm
LmdpdF9jaGVja291dF9wYXRoKQorICAgICAgICBzZWxmLnNjbSA9IGRldGVjdF9zY21fc3lzdGVt
KHNlbGYuZ2l0X2NoZWNrb3V0X3BhdGgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAg
ICAgIHJ1bl9jb21tYW5kKFsncm0nLCAnLXJmJywgc2VsZi5naXRfY2hlY2tvdXRfcGF0aF0pCisg
ICAgICAgIHJ1bl9jb21tYW5kKFsncm0nLCAnLXJmJywgc2VsZi51bnRyYWNraW5nX2NoZWNrb3V0
X3BhdGhdKQorCisgICAgZGVmIHRlc3RfcmVtb3RlX2JyYW5jaF9uYW1lKHNlbGYpOgorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NtLnJlbW90ZV9icmFuY2hfbmFtZSgpLCAncmVmcy9y
ZW1vdGVzL29yaWdpbi9tYXN0ZXInKQorCisgICAgZGVmIHRlc3RfcmVtb3RlX2JyYW5jaF9uYW1l
X3VudHJhY2tpbmcoc2VsZik6CisgICAgICAgIG9zLmNoZGlyKHNlbGYudW50cmFja2luZ19jaGVj
a291dF9wYXRoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTY3JpcHRFcnJvciwgc2VsZi51
bnRyYWNraW5nX3NjbS5yZW1vdGVfYnJhbmNoX25hbWUpCisKKworY2xhc3MgR2l0U1ZOVGVzdChT
Q01UZXN0KToKKworICAgIGRlZiBfc2V0dXBfZ2l0X2NoZWNrb3V0KHNlbGYpOgogICAgICAgICBz
ZWxmLmdpdF9jaGVja291dF9wYXRoID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9ImdpdF90ZXN0
X2NoZWNrb3V0IikKICAgICAgICAgIyAtLXF1aWV0IGRvZXNuJ3QgbWFrZSBnaXQgc3ZuIHNpbGVu
dCwgc28gd2UgdXNlIHJ1bl9zaWxlbnQgdG8gcmVkaXJlY3Qgb3V0cHV0CiAgICAgICAgIHJ1bl9z
aWxlbnQoWydnaXQnLCAnc3ZuJywgJ2Nsb25lJywgJy1UJywgJ3RydW5rJywgc2VsZi5zdm5fcmVw
b191cmwsIHNlbGYuZ2l0X2NoZWNrb3V0X3BhdGhdKQorICAgICAgICBvcy5jaGRpcihzZWxmLmdp
dF9jaGVja291dF9wYXRoKQogCi0gICAgZGVmIF90ZWFyX2Rvd25fZ2l0X2Nsb25lX29mX3N2bl9y
ZXBvc2l0b3J5KHNlbGYpOgorICAgIGRlZiBfdGVhcl9kb3duX2dpdF9jaGVja291dChzZWxmKToK
ICAgICAgICAgcnVuX2NvbW1hbmQoWydybScsICctcmYnLCBzZWxmLmdpdF9jaGVja291dF9wYXRo
XSkKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgU1ZOVGVzdFJlcG9zaXRvcnkuc2V0
dXAoc2VsZikKLSAgICAgICAgc2VsZi5fc2V0dXBfZ2l0X2Nsb25lX29mX3N2bl9yZXBvc2l0b3J5
KCkKLSAgICAgICAgb3MuY2hkaXIoc2VsZi5naXRfY2hlY2tvdXRfcGF0aCkKKyAgICAgICAgc2Vs
Zi5fc2V0dXBfZ2l0X2NoZWNrb3V0KCkKICAgICAgICAgc2VsZi5zY20gPSBkZXRlY3Rfc2NtX3N5
c3RlbShzZWxmLmdpdF9jaGVja291dF9wYXRoKQogICAgICAgICAjIEZvciBoaXN0b3JpY2FsIHJl
YXNvbnMsIHdlIHRlc3Qgc29tZSBjaGVja291dCBjb2RlIGhlcmUgdG9vLgogICAgICAgICBzZWxm
LmNoZWNrb3V0ID0gQ2hlY2tvdXQoc2VsZi5zY20pCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6
CiAgICAgICAgIFNWTlRlc3RSZXBvc2l0b3J5LnRlYXJfZG93bihzZWxmKQotICAgICAgICBzZWxm
Ll90ZWFyX2Rvd25fZ2l0X2Nsb25lX29mX3N2bl9yZXBvc2l0b3J5KCkKKyAgICAgICAgc2VsZi5f
dGVhcl9kb3duX2dpdF9jaGVja291dCgpCiAKICAgICBkZWYgdGVzdF9kZXRlY3Rpb24oc2VsZik6
CiAgICAgICAgIHNjbSA9IGRldGVjdF9zY21fc3lzdGVtKHNlbGYuZ2l0X2NoZWNrb3V0X3BhdGgp
CkBAIC02ODMsMjUgKzcxMywyNCBAQCBjbGFzcyBHaXRUZXN0KFNDTVRlc3QpOgogICAgICAgICBz
ZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnNjbS5sb2NhbF9jb21taXRzKCkpLCAwKQogCiAgICAg
ZGVmIHRlc3RfZGVsZXRlX2JyYW5jaChzZWxmKToKLSAgICAgICAgb2xkX2JyYW5jaCA9IHJ1bl9j
b21tYW5kKFsnZ2l0JywgJ3N5bWJvbGljLXJlZicsICdIRUFEJ10pLnN0cmlwKCkKICAgICAgICAg
bmV3X2JyYW5jaCA9ICdmb28nCiAKICAgICAgICAgcnVuX2NvbW1hbmQoWydnaXQnLCAnY2hlY2tv
dXQnLCAnLWInLCBuZXdfYnJhbmNoXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW5fY29t
bWFuZChbJ2dpdCcsICdzeW1ib2xpYy1yZWYnLCAnSEVBRCddKS5zdHJpcCgpLCAncmVmcy9oZWFk
cy8nICsgbmV3X2JyYW5jaCkKIAotICAgICAgICBydW5fY29tbWFuZChbJ2dpdCcsICdjaGVja291
dCcsIG9sZF9icmFuY2hdKQorICAgICAgICBydW5fY29tbWFuZChbJ2dpdCcsICdjaGVja291dCcs
ICctYicsICdiYXInXSkKICAgICAgICAgc2VsZi5zY20uZGVsZXRlX2JyYW5jaChuZXdfYnJhbmNo
KQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmUuc2VhcmNoKHInZm9vJywgcnVuX2NvbW1h
bmQoWydnaXQnLCAnYnJhbmNoJ10pKSkKIAotICAgIGRlZiB0ZXN0X3N2bl9tZXJnZV9iYXNlKHNl
bGYpOgorICAgIGRlZiB0ZXN0X3JlbW90ZV9tZXJnZV9iYXNlKHNlbGYpOgogICAgICAgICAjIERp
ZmYgdG8gbWVyZ2UtYmFzZSBzaG91bGQgaW5jbHVkZSB3b3JraW5nLWNvcHkgY2hhbmdlcywKICAg
ICAgICAgIyB3aGljaCB0aGUgZGlmZiB0byBzdm5fYnJhbmNoLi4gZG9lc24ndC4KICAgICAgICAg
dGVzdF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYuZ2l0X2NoZWNrb3V0X3BhdGgsICd0ZXN0X2Zp
bGUnKQogICAgICAgICB3cml0ZV9pbnRvX2ZpbGVfYXRfcGF0aCh0ZXN0X2ZpbGUsICdmb28nKQog
Ci0gICAgICAgIGRpZmZfdG9fY29tbW9uX2Jhc2UgPSBfZ2l0X2RpZmYoc2VsZi5zY20uc3ZuX2Jy
YW5jaF9uYW1lKCkgKyAnLi4nKQotICAgICAgICBkaWZmX3RvX21lcmdlX2Jhc2UgPSBfZ2l0X2Rp
ZmYoc2VsZi5zY20uc3ZuX21lcmdlX2Jhc2UoKSkKKyAgICAgICAgZGlmZl90b19jb21tb25fYmFz
ZSA9IF9naXRfZGlmZihzZWxmLnNjbS5yZW1vdGVfYnJhbmNoX25hbWUoKSArICcuLicpCisgICAg
ICAgIGRpZmZfdG9fbWVyZ2VfYmFzZSA9IF9naXRfZGlmZihzZWxmLnNjbS5yZW1vdGVfbWVyZ2Vf
YmFzZSgpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmUuc2VhcmNoKHInZm9vJywgZGlm
Zl90b19jb21tb25fYmFzZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gocidm
b28nLCBkaWZmX3RvX21lcmdlX2Jhc2UpKQpAQCAtODg4LDYgKzkxNyw5IEBAIGNsYXNzIEdpdFRl
c3QoU0NNVGVzdCk6CiAgICAgICAgIHNjbSA9IGRldGVjdF9zY21fc3lzdGVtKHNlbGYuZ2l0X2No
ZWNrb3V0X3BhdGgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFNjcmlwdEVycm9yLCBzY20u
Y29tbWl0X3dpdGhfbWVzc2FnZSwgImFub3RoZXIgdGVzdCBjb21taXQiLCBzcXVhc2g9VHJ1ZSkK
IAorICAgIGRlZiB0ZXN0X3JlbW90ZV9icmFuY2hfbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChzZWxmLnNjbS5yZW1vdGVfYnJhbmNoX25hbWUoKSwgJ3JlZnMvcmVtb3Rlcy90
cnVuaycpCisKICAgICBkZWYgdGVzdF9yZXZlcnNlX2RpZmYoc2VsZik6CiAgICAgICAgIHNlbGYu
X3NoYXJlZF90ZXN0X3JldmVyc2VfZGlmZigpCiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>57369</attachid>
            <date>2010-05-28 13:33:40 -0700</date>
            <delta_ts>2010-05-28 20:43:53 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38156-20100528133338.patch</filename>
            <type>text/plain</type>
            <size>13370</size>
            <attacher name="Ojan Vafai">ojan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAwNTVlOTU0MmJmYjEyMDY0MmU3Zjg5ZjgwZWI1YWMyMTE0YzYyNDllLi45ZmEyNmJh
MWViZmIyMGI5ZGU5OGJiMjViNzg2NjUxMjg5YTk1ZmQ5IDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAK
KzIwMTAtMDUtMjQgIE9qYW4gVmFmYWkgIDxvamFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBtYW55IHdlYmtpdC1wYXRjaCBj
b21tYW5kcyBmYWlsIGluIGEgbm9uLXN2biB0cmFja2luZyBnaXQgY2hlY2tvdXQKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM4MTU2CisKKyAgICAgICAg
SWYgdGhlIHN2bi10cmFja2luZy1icmFuY2ggKHRydW5rKSBkb2Vzbid0IGV4aXN0LCBmYWxsYmFj
ayB0byB0aGUgZ2l0IHJlbW90ZS10cmFja2luZy1icmFuY2ggKG1hc3RlcikuCisgICAgICAgIElm
IG5laXRoZXIgZXhpc3RzLCB0aGVuIGVycm9yIG91dC4gVGhpcyBtYWtlcyB3ZWJraXQtcGF0Y2gg
d29yaworICAgICAgICBmb3IgYW55b25lIHRoYXQgZm9sbG93cyB0aGUgaW50cnVjdGlvbnMgYXQg
aHR0cDovL3RyYWMud2Via2l0Lm9yZy93aWtpL1VzaW5nR2l0V2l0aFdlYktpdAorICAgICAgICB0
byBjaGVja291dCB3ZWJraXQuIFRoZSBmYWxsYmFjayB0byBtYXN0ZXIgaXMgZm9yIHBlb3BsZSB3
aG8gZG9uJ3QKKyAgICAgICAgZG8gdGhlIHN0ZXBzIG9uIHRoYXQgcGFnZSBmb3IgdHJhY2tpbmcg
c3ZuLgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtLnB5
OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L3NjbV91bml0dGVz
dC5weToKKwogMjAxMC0wNS0yOCAgQ2hyaXMgRmxlaXphY2ggIDxjZmxlaXphY2hAYXBwbGUuY29t
PgogCiAgICAgICAgIFJldmlld2VkIGJ5IEJldGggRGFraW4uCmRpZmYgLS1naXQgYS9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY20ucHkgYi9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY20ucHkKaW5kZXggZWVhNzZiZTYx
NWU2NmRhNWJiMWI2NWNiYmRkZDliYWU2ZTJjNzU3Ni4uYjM0ZWI4MDZmZGZhODYyM2UyN2I1ZTcy
M2QzMDNhNWE2YjAyNTQyMyAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vY2hlY2tvdXQvc2NtLnB5CisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL2NoZWNrb3V0L3NjbS5weQpAQCAtMjQwLDcgKzI0MCw3IEBAIGNsYXNzIFNDTToK
ICAgICBkZWYgc3VwcG9ydHNfbG9jYWxfY29tbWl0cygpOgogICAgICAgICByYWlzZSBOb3RJbXBs
ZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKIAotICAgIGRlZiBzdm5f
bWVyZ2VfYmFzZSgpOgorICAgIGRlZiByZW1vdGVfbWVyZ2VfYmFzZSgpOgogICAgICAgICByYWlz
ZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKIAogICAg
IGRlZiBjb21taXRfbG9jYWxseV93aXRoX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CkBAIC00NjUs
MTEgKzQ2NSwxMSBAQCBjbGFzcyBHaXQoU0NNKToKIAogICAgIGRlZiBkaXNjYXJkX2xvY2FsX2Nv
bW1pdHMoc2VsZik6CiAgICAgICAgICMgRklYTUU6IFRoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBj
d2Q9c2VsZi5jaGVja291dF9yb290Ci0gICAgICAgIHNlbGYucnVuKFsnZ2l0JywgJ3Jlc2V0Jywg
Jy0taGFyZCcsIHNlbGYuc3ZuX2JyYW5jaF9uYW1lKCldKQorICAgICAgICBzZWxmLnJ1bihbJ2dp
dCcsICdyZXNldCcsICctLWhhcmQnLCBzZWxmLnJlbW90ZV9icmFuY2hfcmVmKCldKQogICAgIAog
ICAgIGRlZiBsb2NhbF9jb21taXRzKHNlbGYpOgogICAgICAgICAjIEZJWE1FOiBUaGlzIHNob3Vs
ZCBwcm9iYWJseSB1c2UgY3dkPXNlbGYuY2hlY2tvdXRfcm9vdAotICAgICAgICByZXR1cm4gc2Vs
Zi5ydW4oWydnaXQnLCAnbG9nJywgJy0tcHJldHR5PW9uZWxpbmUnLCAnSEVBRC4uLicgKyBzZWxm
LnN2bl9icmFuY2hfbmFtZSgpXSkuc3BsaXRsaW5lcygpCisgICAgICAgIHJldHVybiBzZWxmLnJ1
bihbJ2dpdCcsICdsb2cnLCAnLS1wcmV0dHk9b25lbGluZScsICdIRUFELi4uJyArIHNlbGYucmVt
b3RlX2JyYW5jaF9yZWYoKV0pLnNwbGl0bGluZXMoKQogCiAgICAgZGVmIHJlYmFzZV9pbl9wcm9n
cmVzcyhzZWxmKToKICAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihz
ZWxmLmNoZWNrb3V0X3Jvb3QsICcuZ2l0L3JlYmFzZS1hcHBseScpKQpAQCAtNTA3LDcgKzUwNyw3
IEBAIGNsYXNzIEdpdChTQ00pOgogICAgICAgICAgICAgcmV0dXJuIGdpdF9jb21taXQKIAogICAg
ICAgICBpZiBzZWxmLnNob3VsZF9zcXVhc2goc3F1YXNoKToKLSAgICAgICAgICAgIHJldHVybiBz
ZWxmLnN2bl9tZXJnZV9iYXNlKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJlbW90ZV9tZXJn
ZV9iYXNlKCkKIAogICAgICAgICAjIEZJWE1FOiBOb24tc3F1YXNoIGJlaGF2aW9yIHNob3VsZCBt
YXRjaCBjb21taXRfd2l0aF9tZXNzYWdlLiBJdCByYWlzZXMgYW4gZXJyb3IKICAgICAgICAgIyBp
ZiB0aGVyZSBhcmUgd29ya2luZyBjb3B5IGNoYW5nZXMgYW5kIC0tc3F1YXNoIG9yIC0tbm8tc3F1
YXNoIHdhc24ndCBwYXNzZWQgaW4uCkBAIC02MDIsMTQgKzYwMiwxNCBAQCBjbGFzcyBHaXQoU0NN
KToKICAgICAgICAgICAgICAgICBpZiBudW1fbG9jYWxfY29tbWl0cyA+IDEgb3IgKG51bV9sb2Nh
bF9jb21taXRzID4gMCBhbmQgbm90IHNlbGYud29ya2luZ19kaXJlY3RvcnlfaXNfY2xlYW4oKSk6
CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFNjcmlwdEVycm9yKG1lc3NhZ2U9c2VsZi5fZ2V0
X3NxdWFzaF9lcnJvcl9tZXNzYWdlKG51bV9sb2NhbF9jb21taXRzKSkKIAotICAgICAgICBpZiBz
cXVhc2ggYW5kIHNlbGYuX3N2bl9icmFuY2hfaGFzX2V4dHJhX2NvbW1pdHMoKToKKyAgICAgICAg
aWYgc3F1YXNoIGFuZCBzZWxmLl9yZW1vdGVfYnJhbmNoX2hhc19leHRyYV9jb21taXRzKCk6CiAg
ICAgICAgICAgICByYWlzZSBTY3JpcHRFcnJvcihtZXNzYWdlPSJDYW5ub3QgdXNlIC0tc3F1YXNo
IHdoZW4gSEVBRCBpcyBub3QgZnVsbHkgbWVyZ2VkL3JlYmFzZWQgdG8gJXMuICIKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgYnJhbmNoIG5lZWRzIHRvIGJlIHN5
bmNlZCBmaXJzdC4iICUgc2VsZi5zdm5fYnJhbmNoX25hbWUoKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIlRoaXMgYnJhbmNoIG5lZWRzIHRvIGJlIHN5bmNlZCBmaXJz
dC4iICUgc2VsZi5yZW1vdGVfYnJhbmNoX3JlZigpKQogCiAgICAgICAgIHJldHVybiBzcXVhc2gK
IAotICAgIGRlZiBfc3ZuX2JyYW5jaF9oYXNfZXh0cmFfY29tbWl0cyhzZWxmKToKLSAgICAgICAg
cmV0dXJuIGxlbihydW5fY29tbWFuZChbJ2dpdCcsICdyZXYtbGlzdCcsICctLW1heC1jb3VudD0x
Jywgc2VsZi5zdm5fYnJhbmNoX25hbWUoKSwgJ15IRUFEJ10pKQorICAgIGRlZiBfcmVtb3RlX2Jy
YW5jaF9oYXNfZXh0cmFfY29tbWl0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihydW5fY29t
bWFuZChbJ2dpdCcsICdyZXYtbGlzdCcsICctLW1heC1jb3VudD0xJywgc2VsZi5yZW1vdGVfYnJh
bmNoX3JlZigpLCAnXkhFQUQnXSkpCiAKICAgICBkZWYgY29tbWl0X3dpdGhfbWVzc2FnZShzZWxm
LCBtZXNzYWdlLCB1c2VybmFtZT1Ob25lLCBnaXRfY29tbWl0PU5vbmUsIHNxdWFzaD1Ob25lKToK
ICAgICAgICAgIyBVc2VybmFtZSBpcyBpZ25vcmVkIGR1cmluZyBHaXQgY29tbWl0cy4KQEAgLTYy
NCw3ICs2MjQsNyBAQCBjbGFzcyBHaXQoU0NNKToKIAogICAgICAgICBzcXVhc2ggPSBzZWxmLnNo
b3VsZF9zcXVhc2goc3F1YXNoKQogICAgICAgICBpZiBzcXVhc2g6Ci0gICAgICAgICAgICBzZWxm
LnJ1bihbJ2dpdCcsICdyZXNldCcsICctLXNvZnQnLCBzZWxmLnN2bl9icmFuY2hfbmFtZSgpXSkK
KyAgICAgICAgICAgIHNlbGYucnVuKFsnZ2l0JywgJ3Jlc2V0JywgJy0tc29mdCcsIHNlbGYucmVt
b3RlX2JyYW5jaF9yZWYoKV0pCiAgICAgICAgICAgICBzZWxmLmNvbW1pdF9sb2NhbGx5X3dpdGhf
bWVzc2FnZShtZXNzYWdlKQogICAgICAgICBlbGlmIG5vdCBzZWxmLndvcmtpbmdfZGlyZWN0b3J5
X2lzX2NsZWFuKCk6CiAgICAgICAgICAgICBpZiBub3QgbGVuKHNlbGYubG9jYWxfY29tbWl0cygp
KToKQEAgLTY1MCw4ICs2NTAsOCBAQCBjbGFzcyBHaXQoU0NNKToKIAogICAgICAgICAjIFdlIHdh
bnQgdG8gc3F1YXNoIGFsbCB0aGlzIGJyYW5jaCdzIGNvbW1pdHMgaW50byBvbmUgY29tbWl0IHdp
dGggdGhlIHByb3BlciBkZXNjcmlwdGlvbi4KICAgICAgICAgIyBXZSBkbyB0aGlzIGJ5IGRvaW5n
IGEgIm1lcmdlIC0tc3F1YXNoIiBpbnRvIGEgbmV3IGNvbW1pdCBicmFuY2gsIHRoZW4gZGNvbW1p
dHRpbmcgdGhhdC4KLSAgICAgICAgTUVSR0VfQlJBTkNIID0gJ3dlYmtpdC1wYXRjaC1sYW5kJwot
ICAgICAgICBzZWxmLmRlbGV0ZV9icmFuY2goTUVSR0VfQlJBTkNIKQorICAgICAgICBNRVJHRV9C
UkFOQ0hfTkFNRSA9ICd3ZWJraXQtcGF0Y2gtbGFuZCcKKyAgICAgICAgc2VsZi5kZWxldGVfYnJh
bmNoKE1FUkdFX0JSQU5DSF9OQU1FKQogCiAgICAgICAgICMgV2UgbWlnaHQgYmUgaW4gYSBkaXJl
Y3RvcnkgdGhhdCdzIHByZXNlbnQgaW4gdGhpcyBicmFuY2ggYnV0IG5vdCBpbiB0aGUKICAgICAg
ICAgIyB0cnVuay4gIE1vdmUgdXAgdG8gdGhlIHRvcCBvZiB0aGUgdHJlZSBzbyB0aGF0IGdpdCBj
b21tYW5kcyB0aGF0IGV4cGVjdCBhCkBAIC02NjIsNyArNjYyLDcgQEAgY2xhc3MgR2l0KFNDTSk6
CiAgICAgICAgICMgV2Ugd3JhcCBpbiBhIHRyeS4uLmZpbmFsbHkgYmxvY2sgc28gaWYgYW55dGhp
bmcgZ29lcyB3cm9uZywgd2UgY2xlYW4gdXAgdGhlIGJyYW5jaGVzLgogICAgICAgICBjb21taXRf
c3VjY2VlZGVkID0gVHJ1ZQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLnJ1bihbJ2dp
dCcsICdjaGVja291dCcsICctcScsICctYicsIE1FUkdFX0JSQU5DSCwgc2VsZi5zdm5fYnJhbmNo
X25hbWUoKV0pCisgICAgICAgICAgICBzZWxmLnJ1bihbJ2dpdCcsICdjaGVja291dCcsICctcScs
ICctYicsIE1FUkdFX0JSQU5DSF9OQU1FLCBzZWxmLnJlbW90ZV9icmFuY2hfcmVmKCldKQogCiAg
ICAgICAgICAgICBmb3IgY29tbWl0IGluIGNvbW1pdF9pZHM6CiAgICAgICAgICAgICAgICAgIyBX
ZSdyZSBvbiBhIGRpZmZlcmVudCBicmFuY2ggbm93LCBzbyBjb252ZXJ0ICJoZWFkIiB0byB0aGUg
YnJhbmNoIG5hbWUuCkBAIC02ODEsNyArNjgxLDcgQEAgY2xhc3MgR2l0KFNDTSk6CiAgICAgICAg
ICAgICAjIEFuZCB0aGVuIHN3YXAgYmFjayB0byB0aGUgb3JpZ2luYWwgYnJhbmNoIGFuZCBjbGVh
biB1cC4KICAgICAgICAgICAgIHNlbGYuY2xlYW5fd29ya2luZ19kaXJlY3RvcnkoKQogICAgICAg
ICAgICAgc2VsZi5ydW4oWydnaXQnLCAnY2hlY2tvdXQnLCAnLXEnLCBicmFuY2hfbmFtZV0pCi0g
ICAgICAgICAgICBzZWxmLmRlbGV0ZV9icmFuY2goTUVSR0VfQlJBTkNIKQorICAgICAgICAgICAg
c2VsZi5kZWxldGVfYnJhbmNoKE1FUkdFX0JSQU5DSF9OQU1FKQogCiAgICAgICAgIHJldHVybiBv
dXRwdXQKIApAQCAtNjkzLDE4ICs2OTMsMzEgQEAgY2xhc3MgR2l0KFNDTSk6CiAgICAgICAgIHJl
dHVybiBzZWxmLnJ1bihbJ2dpdCcsICdzdm4nLCAnbG9nJywgJy0tbGltaXQ9MSddKQogCiAgICAg
IyBHaXQtc3BlY2lmaWMgbWV0aG9kczoKKyAgICBkZWYgX2JyYW5jaF9yZWZfZXhpc3RzKHNlbGYs
IGJyYW5jaF9yZWYpOgorICAgICAgICByZXR1cm4gc2VsZi5ydW4oWydnaXQnLCAnc2hvdy1yZWYn
LCAnLS1xdWlldCcsICctLXZlcmlmeScsIGJyYW5jaF9yZWZdLCByZXR1cm5fZXhpdF9jb2RlPVRy
dWUpID09IDAKIAotICAgIGRlZiBkZWxldGVfYnJhbmNoKHNlbGYsIGJyYW5jaCk6Ci0gICAgICAg
IGlmIHNlbGYucnVuKFsnZ2l0JywgJ3Nob3ctcmVmJywgJy0tcXVpZXQnLCAnLS12ZXJpZnknLCAn
cmVmcy9oZWFkcy8nICsgYnJhbmNoXSwgcmV0dXJuX2V4aXRfY29kZT1UcnVlKSA9PSAwOgotICAg
ICAgICAgICAgc2VsZi5ydW4oWydnaXQnLCAnYnJhbmNoJywgJy1EJywgYnJhbmNoXSkKKyAgICBk
ZWYgZGVsZXRlX2JyYW5jaChzZWxmLCBicmFuY2hfbmFtZSk6CisgICAgICAgIGlmIHNlbGYuX2Jy
YW5jaF9yZWZfZXhpc3RzKCdyZWZzL2hlYWRzLycgKyBicmFuY2hfbmFtZSk6CisgICAgICAgICAg
ICBzZWxmLnJ1bihbJ2dpdCcsICdicmFuY2gnLCAnLUQnLCBicmFuY2hfbmFtZV0pCiAKLSAgICBk
ZWYgc3ZuX21lcmdlX2Jhc2Uoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLnJ1bihbJ2dpdCcs
ICdtZXJnZS1iYXNlJywgc2VsZi5zdm5fYnJhbmNoX25hbWUoKSwgJ0hFQUQnXSkuc3RyaXAoKQor
ICAgIGRlZiByZW1vdGVfbWVyZ2VfYmFzZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucnVu
KFsnZ2l0JywgJ21lcmdlLWJhc2UnLCBzZWxmLnJlbW90ZV9icmFuY2hfcmVmKCksICdIRUFEJ10p
LnN0cmlwKCkKKworICAgIGRlZiByZW1vdGVfYnJhbmNoX3JlZihzZWxmKToKKyAgICAgICAgIyBV
c2UgcmVmZXJlbmNlcyBzbyB0aGF0IHdlIGNhbiBhdm9pZCBjb2xsaXNpb25zLCBlLmcuIHdlIGRv
bid0IHdhbnQgdG8gb3BlcmF0ZSBvbiByZWZzL2hlYWRzL3RydW5rIGlmIGl0IGV4aXN0cy4KIAot
ICAgIGRlZiBzdm5fYnJhbmNoX25hbWUoc2VsZik6CiAgICAgICAgICMgRklYTUU6IFRoaXMgc2hv
dWxkIHNvIHNvbWV0aGluZyBsaWtlOiBHaXQucmVhZF9naXRfY29uZmlnKCdzdm4tcmVtb3RlLnN2
bi5mZXRjaCcpLnNwbGl0KCc6JylbMV0KICAgICAgICAgIyBidXQgdGhhdCBkb2Vzbid0IHdvcmsg
aWYgdGhlIGdpdCByZXBvIGlzIHRyYWNraW5nIG11bHRpcGxlIHN2biBicmFuY2hlcy4KLSAgICAg
ICAgcmV0dXJuICd0cnVuaycKKyAgICAgICAgcmVtb3RlX2JyYW5jaF9yZWZzID0gWworICAgICAg
ICAgICAgJ3JlZnMvcmVtb3Rlcy90cnVuaycsICAjIEEgZ2l0LXN2biBjaGVja291dCBhcyBwZXIg
aHR0cDovL3RyYWMud2Via2l0Lm9yZy93aWtpL1VzaW5nR2l0V2l0aFdlYktpdC4KKyAgICAgICAg
ICAgICdyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlcicsICAjIEEgZ2l0IGNsb25lIG9mIGdpdDov
L2dpdC53ZWJraXQub3JnL1dlYktpdC5naXQgdGhhdCBpcyBub3QgdHJhY2tpbmcgc3ZuLgorICAg
ICAgICBdCisKKyAgICAgICAgZm9yIHJlZiBpbiByZW1vdGVfYnJhbmNoX3JlZnM6CisgICAgICAg
ICAgICBpZiBzZWxmLl9icmFuY2hfcmVmX2V4aXN0cyhyZWYpOgorICAgICAgICAgICAgICAgIHJl
dHVybiByZWYKKworICAgICAgICByYWlzZSBTY3JpcHRFcnJvcihtZXNzYWdlPSdDYW5cJ3QgZmlu
ZCBhIGJyYW5jaCB0byBkaWZmIGFnYWluc3QuICVzIGJyYW5jaGVzIGRvIG5vdCBleGlzdC4nICUg
ImFuZCIuam9pbihyZW1vdGVfYnJhbmNoX3JlZnMpKQogCiAgICAgZGVmIGNvbW1pdF9sb2NhbGx5
X3dpdGhfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKICAgICAgICAgc2VsZi5ydW4oWydnaXQnLCAn
Y29tbWl0JywgJy0tYWxsJywgJy1GJywgJy0nXSwgaW5wdXQ9bWVzc2FnZSkKQEAgLTcyNiw3ICs3
MzksNyBAQCBjbGFzcyBHaXQoU0NNKToKICAgICAjIEEgQiAgICAgOiBbQSwgQl0gIChkaWZmZXJl
bnQgZnJvbSBnaXQgZGlmZiwgd2hpY2ggd291bGQgdXNlICJyZXYtbGlzdCBBLi5CIikKICAgICBk
ZWYgY29tbWl0X2lkc19mcm9tX2NvbW1pdGlzaF9hcmd1bWVudHMoc2VsZiwgYXJncyk6CiAgICAg
ICAgIGlmIG5vdCBsZW4oYXJncyk6Ci0gICAgICAgICAgICBhcmdzLmFwcGVuZCgnJXMuLkhFQUQn
ICUgc2VsZi5zdm5fYnJhbmNoX25hbWUoKSkKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCclcy4u
SEVBRCcgJSBzZWxmLnJlbW90ZV9icmFuY2hfcmVmKCkpCiAKICAgICAgICAgY29tbWl0X2lkcyA9
IFtdCiAgICAgICAgIGZvciBjb21taXRpc2ggaW4gYXJnczoKZGlmZiAtLWdpdCBhL1dlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L3NjbV91bml0dGVzdC5weSBiL1dl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L3NjbV91bml0dGVzdC5w
eQppbmRleCA4ZWVhNGQ4YTg1MTU1ZDQyMjdlOWU3MGE3YWM1MDRlOThiYTVkMWNiLi4zMTViZGUz
OTQxYmEyMWU3ZDAxMWNmODNjYWVlYzkwOGRiYWNmODcxIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY21fdW5pdHRlc3QucHkKKysrIGIv
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtX3VuaXR0ZXN0
LnB5CkBAIC02MzUsMjUgKzYzNSw1OSBAQCBRMWRUQngwQUFBQjQyaXRnNEdsZ1lKakd3TUREeU9E
TXhNRHczNEdCZ1FFQUpQUURKQT09CiAKIGNsYXNzIEdpdFRlc3QoU0NNVGVzdCk6CiAKLSAgICBk
ZWYgX3NldHVwX2dpdF9jbG9uZV9vZl9zdm5fcmVwb3NpdG9yeShzZWxmKToKKyAgICBkZWYgc2V0
VXAoc2VsZik6CisgICAgICAgICIiIlNldHMgdXAgZnJlc2ggZ2l0IHJlcG9zaXRvcnkgd2l0aCBv
bmUgY29tbWl0LiBUaGVuIHNldHVwcyBhIHNlY29uZCBnaXQKKyAgICAgICAgcmVwbyB0aGF0IHRy
YWNrcyB0aGUgZmlyc3Qgb25lLiIiIgorICAgICAgICBzZWxmLnVudHJhY2tpbmdfY2hlY2tvdXRf
cGF0aCA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PSJnaXRfdGVzdF9jaGVja291dDIiKQorICAg
ICAgICBydW5fY29tbWFuZChbJ2dpdCcsICdpbml0Jywgc2VsZi51bnRyYWNraW5nX2NoZWNrb3V0
X3BhdGhdKQorCisgICAgICAgIG9zLmNoZGlyKHNlbGYudW50cmFja2luZ19jaGVja291dF9wYXRo
KQorICAgICAgICB3cml0ZV9pbnRvX2ZpbGVfYXRfcGF0aCgnZm9vX2ZpbGUnLCAnZm9vJykKKyAg
ICAgICAgcnVuX2NvbW1hbmQoWydnaXQnLCAnYWRkJywgJ2Zvb19maWxlJ10pCisgICAgICAgIHJ1
bl9jb21tYW5kKFsnZ2l0JywgJ2NvbW1pdCcsICctYW0nLCAnZHVtbXkgY29tbWl0J10pCisgICAg
ICAgIHNlbGYudW50cmFja2luZ19zY20gPSBkZXRlY3Rfc2NtX3N5c3RlbShzZWxmLnVudHJhY2tp
bmdfY2hlY2tvdXRfcGF0aCkKKworICAgICAgICBzZWxmLnRyYWNraW5nX2dpdF9jaGVja291dF9w
YXRoID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9ImdpdF90ZXN0X2NoZWNrb3V0IikKKyAgICAg
ICAgcnVuX2NvbW1hbmQoWydnaXQnLCAnY2xvbmUnLCAnLS1xdWlldCcsIHNlbGYudW50cmFja2lu
Z19jaGVja291dF9wYXRoLCBzZWxmLnRyYWNraW5nX2dpdF9jaGVja291dF9wYXRoXSkKKyAgICAg
ICAgb3MuY2hkaXIoc2VsZi50cmFja2luZ19naXRfY2hlY2tvdXRfcGF0aCkKKyAgICAgICAgc2Vs
Zi50cmFja2luZ19zY20gPSBkZXRlY3Rfc2NtX3N5c3RlbShzZWxmLnRyYWNraW5nX2dpdF9jaGVj
a291dF9wYXRoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIENoYW5nZSBi
YWNrIHRvIGEgdmFsaWQgZGlyZWN0b3J5IHNvIHRoYXQgbGF0ZXIgY2FsbHMgdG8gb3MuZ2V0Y3dk
KCkgZG8gbm90IGZhaWwuCisgICAgICAgIG9zLmNoZGlyKGRldGVjdF9zY21fc3lzdGVtKG9zLnBh
dGguZGlybmFtZShfX2ZpbGVfXykpLmNoZWNrb3V0X3Jvb3QpCisgICAgICAgIHJ1bl9jb21tYW5k
KFsncm0nLCAnLXJmJywgc2VsZi50cmFja2luZ19naXRfY2hlY2tvdXRfcGF0aF0pCisgICAgICAg
IHJ1bl9jb21tYW5kKFsncm0nLCAnLXJmJywgc2VsZi51bnRyYWNraW5nX2NoZWNrb3V0X3BhdGhd
KQorCisgICAgZGVmIHRlc3RfcmVtb3RlX2JyYW5jaF9yZWYoc2VsZik6CisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWwoc2VsZi50cmFja2luZ19zY20ucmVtb3RlX2JyYW5jaF9yZWYoKSwgJ3JlZnMv
cmVtb3Rlcy9vcmlnaW4vbWFzdGVyJykKKworICAgICAgICBvcy5jaGRpcihzZWxmLnVudHJhY2tp
bmdfY2hlY2tvdXRfcGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU2NyaXB0RXJyb3Is
IHNlbGYudW50cmFja2luZ19zY20ucmVtb3RlX2JyYW5jaF9yZWYpCisKKworY2xhc3MgR2l0U1ZO
VGVzdChTQ01UZXN0KToKKworICAgIGRlZiBfc2V0dXBfZ2l0X2NoZWNrb3V0KHNlbGYpOgogICAg
ICAgICBzZWxmLmdpdF9jaGVja291dF9wYXRoID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9Imdp
dF90ZXN0X2NoZWNrb3V0IikKICAgICAgICAgIyAtLXF1aWV0IGRvZXNuJ3QgbWFrZSBnaXQgc3Zu
IHNpbGVudCwgc28gd2UgdXNlIHJ1bl9zaWxlbnQgdG8gcmVkaXJlY3Qgb3V0cHV0CiAgICAgICAg
IHJ1bl9zaWxlbnQoWydnaXQnLCAnc3ZuJywgJ2Nsb25lJywgJy1UJywgJ3RydW5rJywgc2VsZi5z
dm5fcmVwb191cmwsIHNlbGYuZ2l0X2NoZWNrb3V0X3BhdGhdKQorICAgICAgICBvcy5jaGRpcihz
ZWxmLmdpdF9jaGVja291dF9wYXRoKQogCi0gICAgZGVmIF90ZWFyX2Rvd25fZ2l0X2Nsb25lX29m
X3N2bl9yZXBvc2l0b3J5KHNlbGYpOgorICAgIGRlZiBfdGVhcl9kb3duX2dpdF9jaGVja291dChz
ZWxmKToKKyAgICAgICAgIyBDaGFuZ2UgYmFjayB0byBhIHZhbGlkIGRpcmVjdG9yeSBzbyB0aGF0
IGxhdGVyIGNhbGxzIHRvIG9zLmdldGN3ZCgpIGRvIG5vdCBmYWlsLgorICAgICAgICBvcy5jaGRp
cihkZXRlY3Rfc2NtX3N5c3RlbShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKS5jaGVja291dF9y
b290KQogICAgICAgICBydW5fY29tbWFuZChbJ3JtJywgJy1yZicsIHNlbGYuZ2l0X2NoZWNrb3V0
X3BhdGhdKQogCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBTVk5UZXN0UmVwb3NpdG9y
eS5zZXR1cChzZWxmKQotICAgICAgICBzZWxmLl9zZXR1cF9naXRfY2xvbmVfb2Zfc3ZuX3JlcG9z
aXRvcnkoKQotICAgICAgICBvcy5jaGRpcihzZWxmLmdpdF9jaGVja291dF9wYXRoKQorICAgICAg
ICBzZWxmLl9zZXR1cF9naXRfY2hlY2tvdXQoKQogICAgICAgICBzZWxmLnNjbSA9IGRldGVjdF9z
Y21fc3lzdGVtKHNlbGYuZ2l0X2NoZWNrb3V0X3BhdGgpCiAgICAgICAgICMgRm9yIGhpc3Rvcmlj
YWwgcmVhc29ucywgd2UgdGVzdCBzb21lIGNoZWNrb3V0IGNvZGUgaGVyZSB0b28uCiAgICAgICAg
IHNlbGYuY2hlY2tvdXQgPSBDaGVja291dChzZWxmLnNjbSkKIAogICAgIGRlZiB0ZWFyRG93bihz
ZWxmKToKICAgICAgICAgU1ZOVGVzdFJlcG9zaXRvcnkudGVhcl9kb3duKHNlbGYpCi0gICAgICAg
IHNlbGYuX3RlYXJfZG93bl9naXRfY2xvbmVfb2Zfc3ZuX3JlcG9zaXRvcnkoKQorICAgICAgICBz
ZWxmLl90ZWFyX2Rvd25fZ2l0X2NoZWNrb3V0KCkKIAogICAgIGRlZiB0ZXN0X2RldGVjdGlvbihz
ZWxmKToKICAgICAgICAgc2NtID0gZGV0ZWN0X3NjbV9zeXN0ZW0oc2VsZi5naXRfY2hlY2tvdXRf
cGF0aCkKQEAgLTY4MywyNSArNzE3LDI0IEBAIGNsYXNzIEdpdFRlc3QoU0NNVGVzdCk6CiAgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc2NtLmxvY2FsX2NvbW1pdHMoKSksIDApCiAK
ICAgICBkZWYgdGVzdF9kZWxldGVfYnJhbmNoKHNlbGYpOgotICAgICAgICBvbGRfYnJhbmNoID0g
cnVuX2NvbW1hbmQoWydnaXQnLCAnc3ltYm9saWMtcmVmJywgJ0hFQUQnXSkuc3RyaXAoKQogICAg
ICAgICBuZXdfYnJhbmNoID0gJ2ZvbycKIAogICAgICAgICBydW5fY29tbWFuZChbJ2dpdCcsICdj
aGVja291dCcsICctYicsIG5ld19icmFuY2hdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1
bl9jb21tYW5kKFsnZ2l0JywgJ3N5bWJvbGljLXJlZicsICdIRUFEJ10pLnN0cmlwKCksICdyZWZz
L2hlYWRzLycgKyBuZXdfYnJhbmNoKQogCi0gICAgICAgIHJ1bl9jb21tYW5kKFsnZ2l0JywgJ2No
ZWNrb3V0Jywgb2xkX2JyYW5jaF0pCisgICAgICAgIHJ1bl9jb21tYW5kKFsnZ2l0JywgJ2NoZWNr
b3V0JywgJy1iJywgJ2JhciddKQogICAgICAgICBzZWxmLnNjbS5kZWxldGVfYnJhbmNoKG5ld19i
cmFuY2gpCiAKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZS5zZWFyY2gocidmb28nLCBydW5f
Y29tbWFuZChbJ2dpdCcsICdicmFuY2gnXSkpKQogCi0gICAgZGVmIHRlc3Rfc3ZuX21lcmdlX2Jh
c2Uoc2VsZik6CisgICAgZGVmIHRlc3RfcmVtb3RlX21lcmdlX2Jhc2Uoc2VsZik6CiAgICAgICAg
ICMgRGlmZiB0byBtZXJnZS1iYXNlIHNob3VsZCBpbmNsdWRlIHdvcmtpbmctY29weSBjaGFuZ2Vz
LAogICAgICAgICAjIHdoaWNoIHRoZSBkaWZmIHRvIHN2bl9icmFuY2guLiBkb2Vzbid0LgogICAg
ICAgICB0ZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5naXRfY2hlY2tvdXRfcGF0aCwgJ3Rl
c3RfZmlsZScpCiAgICAgICAgIHdyaXRlX2ludG9fZmlsZV9hdF9wYXRoKHRlc3RfZmlsZSwgJ2Zv
bycpCiAKLSAgICAgICAgZGlmZl90b19jb21tb25fYmFzZSA9IF9naXRfZGlmZihzZWxmLnNjbS5z
dm5fYnJhbmNoX25hbWUoKSArICcuLicpCi0gICAgICAgIGRpZmZfdG9fbWVyZ2VfYmFzZSA9IF9n
aXRfZGlmZihzZWxmLnNjbS5zdm5fbWVyZ2VfYmFzZSgpKQorICAgICAgICBkaWZmX3RvX2NvbW1v
bl9iYXNlID0gX2dpdF9kaWZmKHNlbGYuc2NtLnJlbW90ZV9icmFuY2hfcmVmKCkgKyAnLi4nKQor
ICAgICAgICBkaWZmX3RvX21lcmdlX2Jhc2UgPSBfZ2l0X2RpZmYoc2VsZi5zY20ucmVtb3RlX21l
cmdlX2Jhc2UoKSkKIAogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlLnNlYXJjaChyJ2Zvbycs
IGRpZmZfdG9fY29tbW9uX2Jhc2UpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNo
KHInZm9vJywgZGlmZl90b19tZXJnZV9iYXNlKSkKQEAgLTg4OCw2ICs5MjEsOSBAQCBjbGFzcyBH
aXRUZXN0KFNDTVRlc3QpOgogICAgICAgICBzY20gPSBkZXRlY3Rfc2NtX3N5c3RlbShzZWxmLmdp
dF9jaGVja291dF9wYXRoKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTY3JpcHRFcnJvciwg
c2NtLmNvbW1pdF93aXRoX21lc3NhZ2UsICJhbm90aGVyIHRlc3QgY29tbWl0Iiwgc3F1YXNoPVRy
dWUpCiAKKyAgICBkZWYgdGVzdF9yZW1vdGVfYnJhbmNoX3JlZihzZWxmKToKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbChzZWxmLnNjbS5yZW1vdGVfYnJhbmNoX3JlZigpLCAncmVmcy9yZW1vdGVz
L3RydW5rJykKKwogICAgIGRlZiB0ZXN0X3JldmVyc2VfZGlmZihzZWxmKToKICAgICAgICAgc2Vs
Zi5fc2hhcmVkX3Rlc3RfcmV2ZXJzZV9kaWZmKCkKIAo=
</data>
<flag name="review"
          id="41933"
          type_id="1"
          status="+"
          setter="cjerdonek"
    />
          </attachment>
      

    </bug>

</bugzilla>