<?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>72243</bug_id>
          
          <creation_ts>2011-11-13 23:29:32 -0800</creation_ts>
          <short_desc>Add a tool to analyze change logs</short_desc>
          <delta_ts>2012-01-03 16:45:25 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>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>
          <dependson>72351</dependson>
    
    <dependson>72540</dependson>
    
    <dependson>72566</dependson>
    
    <dependson>72636</dependson>
    
    <dependson>72690</dependson>
    
    <dependson>72703</dependson>
          <blocked>68061</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>evan</cc>
    
    <cc>jryans</cc>
    
    <cc>leandro</cc>
    
    <cc>ojan</cc>
    
    <cc>ossy</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>501657</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-13 23:29:32 -0800</bug_when>
    <thetext>We need a tool that analyzes change logs in order to figure out areas of contributions of each contributor</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>501658</commentid>
    <comment_count>1</comment_count>
      <attachid>114885</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-13 23:30:26 -0800</bug_when>
    <thetext>Created attachment 114885
work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>501660</commentid>
    <comment_count>2</comment_count>
      <attachid>114886</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-13 23:31:13 -0800</bug_when>
    <thetext>Created attachment 114886
json files generated by the script + summary.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>503613</commentid>
    <comment_count>3</comment_count>
      <attachid>115327</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-15 22:55:32 -0800</bug_when>
    <thetext>Created attachment 115327
work in progress 2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>503614</commentid>
    <comment_count>4</comment_count>
      <attachid>115328</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-15 22:56:37 -0800</bug_when>
    <thetext>Created attachment 115328
json files + summary.html version 2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>503708</commentid>
    <comment_count>5</comment_count>
      <attachid>115348</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-16 01:39:39 -0800</bug_when>
    <thetext>Created attachment 115348
screenshot</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>506589</commentid>
    <comment_count>6</comment_count>
      <attachid>115998</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-20 14:22:47 -0800</bug_when>
    <thetext>Created attachment 115998
work in progress 3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>506720</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-20 23:05:47 -0800</bug_when>
    <thetext>I&apos;m stuck. Apparently, there&apos;s no way to get &quot;git svn blame &lt;file&gt;&quot; at a specific SVN revision. This is necessary because git svn blame for WebCore/ChangeLog-2011-10-19 consists entirely of r97937.

The only solution I can think of is to rely on each commit and retrieve change log entries added by each commit (by git/svn diff). But this will be substantially slower (we&apos;ll end up spending 1-2s per revision) so we&apos;ll need 27 hours to process 100,000 entries.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>506722</commentid>
    <comment_count>8</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-11-20 23:08:49 -0800</bug_when>
    <thetext>I&apos;m not sure I understand.  Why not just go back to before r97937 and do the blame?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>506723</commentid>
    <comment_count>9</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-20 23:14:17 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; I&apos;m not sure I understand.  Why not just go back to before r97937 and do the blame?

Do you know how to do that on git? I&apos;ve spent hours googling about that but couldn&apos;t figure it out.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>506724</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-11-20 23:23:15 -0800</bug_when>
    <thetext>Short of checking out to that revision, I&apos;m not sure.  Evan is a third-order git ninja.  I suggest asking him.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>506735</commentid>
    <comment_count>11</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-20 23:40:36 -0800</bug_when>
    <thetext>FYI, we can do this on a svn client by &quot;svn blame -r&lt;revision number&gt; &lt;paths&gt;&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>506772</commentid>
    <comment_count>12</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-11-21 00:37:33 -0800</bug_when>
    <thetext>I believe git-svn has a secret hidden svn checkout somewhere... so maybe we could use that?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507303</commentid>
    <comment_count>13</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-21 16:12:43 -0800</bug_when>
    <thetext>Okay, I&apos;m just going to add the current version that doesn&apos;t support parsing change logs from multiple directories for now so that other contributors can at least play with what I have so far.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507806</commentid>
    <comment_count>14</comment_count>
      <attachid>116271</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-22 13:48:47 -0800</bug_when>
    <thetext>Created attachment 116271
Initial patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507816</commentid>
    <comment_count>15</comment_count>
      <attachid>116271</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-11-22 14:22:31 -0800</bug_when>
    <thetext>Comment on attachment 116271
Initial patch

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

It&apos;s a big patch, I&apos;ll have to read through this again.

&gt; Tools/Scripts/webkitpy/common/checkout/changelog.py:123
&gt; +        if is_rollover:
&gt; +            self._author = None
&gt; +            self._author_name = None
&gt; +            self._author_email = None
&gt; +            self._reviewer_text = None
&gt; +            self._reviewers = []
&gt; +            self._touched_files = []

I&apos;m not a big fan of having a special entry for roll-overs...

&gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:386
&gt; +            return &apos;&apos;

Should this be none?  unicode() is probably more accurate (and python 3 compatiable) than &apos;&apos; if we decide &apos;&apos; is right.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:31
&gt; +from time import time

I tend to use import foo for system imports, instead of the from syntax (which I always use for webkitpy imports).

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:54
&gt; +        changelogs = [filesystem.join(dirname, filename) for filename in filesystem.listdir(dirname) if re.match(&apos;^ChangeLog(-(\d{4}-\d{2}-\d{2}))?$&apos;, filename)]

self._tool.filesystem. :)  Why is this static?

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:61
&gt; +    def _generate_jsons(filesystem, json_files, output_dir):

Why static?

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:71
&gt; +        filesystem = FileSystem()

The tool has a filesystem. :)  tool.filesystem

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:108
&gt; +        self._filesystem = filesystem

Yeah, I think you want to pass this a Host or a Tool object.  Tool is a subclass of Host, which is a subclass of SystemHost.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:116
&gt; +        self._areas_statistics = {}
&gt; +        for area in self._contribution_areas.names():
&gt; +            self._areas_statistics[area] = {&apos;reviewed&apos;: 0, &apos;unreviewed&apos;: 0, &apos;contributors&apos;: {}}

This can be done as a list comprehension, it&apos;s just slightly gnarly:

self._areas_statistics = dict([(area, {&apos;reviewed&apos;: 0, &apos;unreviewed&apos;: 0, &apos;contributors&apos;: {}}) for area in self._contribution_areas.names()])

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:191
&gt; +        i = 0
&gt; +        dirname = self._filesystem.dirname(changelog_path)
&gt; +        for entry in entries:

You want for entry, index in enumerate(entries): :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507827</commentid>
    <comment_count>16</comment_count>
      <attachid>116271</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-22 14:54:27 -0800</bug_when>
    <thetext>Comment on attachment 116271
Initial patch

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

&gt;&gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:386
&gt;&gt; +            return &apos;&apos;
&gt; 
&gt; Should this be none?  unicode() is probably more accurate (and python 3 compatiable) than &apos;&apos; if we decide &apos;&apos; is right.

Fixed.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:31
&gt;&gt; +from time import time
&gt; 
&gt; I tend to use import foo for system imports, instead of the from syntax (which I always use for webkitpy imports).

It seemed silly to repeat time.time() but okay. Fixed.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:54
&gt;&gt; +        changelogs = [filesystem.join(dirname, filename) for filename in filesystem.listdir(dirname) if re.match(&apos;^ChangeLog(-(\d{4}-\d{2}-\d{2}))?$&apos;, filename)]
&gt; 
&gt; self._tool.filesystem. :)  Why is this static?

For testing.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:61
&gt;&gt; +    def _generate_jsons(filesystem, json_files, output_dir):
&gt; 
&gt; Why static?

Ditto.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:71
&gt;&gt; +        filesystem = FileSystem()
&gt; 
&gt; The tool has a filesystem. :)  tool.filesystem

Fixed.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:108
&gt;&gt; +        self._filesystem = filesystem
&gt; 
&gt; Yeah, I think you want to pass this a Host or a Tool object.  Tool is a subclass of Host, which is a subclass of SystemHost.

Fixed.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:116
&gt;&gt; +            self._areas_statistics[area] = {&apos;reviewed&apos;: 0, &apos;unreviewed&apos;: 0, &apos;contributors&apos;: {}}
&gt; 
&gt; This can be done as a list comprehension, it&apos;s just slightly gnarly:
&gt; 
&gt; self._areas_statistics = dict([(area, {&apos;reviewed&apos;: 0, &apos;unreviewed&apos;: 0, &apos;contributors&apos;: {}}) for area in self._contribution_areas.names()])

Fixed.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:191
&gt;&gt; +        for entry in entries:
&gt; 
&gt; You want for entry, index in enumerate(entries): :)

Hm... I had to skip entires without author names in some changelogs but I guess it&apos;s okay to assert(entry.authors()) for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507828</commentid>
    <comment_count>17</comment_count>
      <attachid>116271</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-22 14:55:33 -0800</bug_when>
    <thetext>Comment on attachment 116271
Initial patch

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

&gt;&gt; Tools/Scripts/webkitpy/common/checkout/changelog.py:123
&gt;&gt; +            self._touched_files = []
&gt; 
&gt; I&apos;m not a big fan of having a special entry for roll-overs...

I actually realized that this rollover business is not needed for this iteration so will revert the entire change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>507837</commentid>
    <comment_count>18</comment_count>
      <attachid>116281</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-22 15:16:51 -0800</bug_when>
    <thetext>Created attachment 116281
Fixed per Eric&apos;s comment; also updated for ToT</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>508270</commentid>
    <comment_count>19</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-23 11:56:31 -0800</bug_when>
    <thetext>Ping eric.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511971</commentid>
    <comment_count>20</comment_count>
      <attachid>116281</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-11-30 11:43:37 -0800</bug_when>
    <thetext>Comment on attachment 116281
Fixed per Eric&apos;s comment; also updated for ToT

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

&gt; Tools/Scripts/webkitpy/common/checkout/changelog.py:279
&gt; +            if rolled_over_regexp.match(line):
&gt; +                break

There can never (or should never?) be anything after the rolled over line?

&gt; Tools/Scripts/webkitpy/common/system/filesystem_mock.py:400
&gt; +            raise StopIteration

You&apos;re blowing my mind.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:207
&gt; +            i += 1

You dont&apos; need this anymore. :)

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:209
&gt; +        return i

Can this work?  Isn&apos;t i tied to teh context of the for loop?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512211</commentid>
    <comment_count>21</comment_count>
      <attachid>117290</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-11-30 16:15:26 -0800</bug_when>
    <thetext>Created attachment 117290
Fixed per Eric&apos;s comment</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512225</commentid>
    <comment_count>22</comment_count>
      <attachid>117290</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-11-30 16:34:49 -0800</bug_when>
    <thetext>Comment on attachment 117290
Fixed per Eric&apos;s comment

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

I didn&apos;t review the html/js at all.  The python looks generally right, but probably needs one more round.

&gt; Tools/Scripts/webkitpy/common/checkout/changelog.py:279
&gt; +            if rolled_over_regexp.match(line):
&gt; +                break

You should comment about why break is OK.  I&apos;m sorry I didn&apos;t make that clear in my previous commetn.  Nothing big, but it&apos;s just not immediately obvious why we&apos;d terminate the loop here.

&gt; Tools/Scripts/webkitpy/common/checkout/changelog.py:288
&gt; +        yield ChangeLogEntry(&apos;&apos;.join(entry_lines[:-1]))
&gt; +

Why do we add this one at the end?  Is this part of the chagne tested?  This could make a good separate patch w/ test case. :)

&gt; Tools/Scripts/webkitpy/common/config/contributionareas.py:181
&gt; +    def names(self):
&gt; +        return [area.name() for area in self._contribution_areas]

I think map(operator.namegetter(&apos;name&apos;), self._contribution_areas) is another way to write this.   I&apos;m not sure if that&apos;s any more clear or concise though.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:32
&gt; +import time
&gt; +from webkitpy.common.checkout.scm.detection import SCMDetector

I normally put a blank line between system imports and webkitpy imports, but I don&apos;t think that&apos;s any sort of official style.  You don&apos;t need to chagne it, just letting you know.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:48
&gt; +            steps.Options.changelog_count,

What does this do?  Is this how many changelogs back to search?  Feels a bit strangely named.  Feels like it&apos;s more interesting to think about searching back to a specific date instead of a number of Changelogs.  the options &quot;git log&quot; has make sense here. :)

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:57
&gt; +    def _enumerate_changelogs(filesystem, dirname, changelog_count):
&gt; +        changelogs = [filesystem.join(dirname, filename) for filename in filesystem.listdir(dirname) if re.match(&apos;^ChangeLog(-(\d{4}-\d{2}-\d{2}))?$&apos;, filename)]
&gt; +        # Make sure ChangeLog shows up before ChangeLog-2011-01-01
&gt; +        changelogs = sorted(changelogs, key=lambda filename: filename + &apos;X&apos;, reverse=True)
&gt; +        return changelogs[:changelog_count]

Yeah, again I think we want to end up just sorting the entries instead of the logs themselves. :)  That doesn&apos;t have to be this change, but i&apos;m interested in your feel for that eventual design, if it makes sense.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:60
&gt; +    def _generate_jsons(filesystem, json_files, output_dir):

jsons?  json_files?

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:67
&gt; +            output_file = filesystem.open_text_file_for_writing(filesystem.join(output_dir, filename))
&gt; +            try:
&gt; +                print &apos;    Generating&apos;, filename
&gt; +                output_file.write(json.dumps(json_files[filename], indent=2))
&gt; +            finally:
&gt; +                output_file.close()

I think you want  to use &quot;with&quot; instead.  That will autoclose at the end of the with block.  Also, why not just use write_text_file directly?  Or even json.dump? (which can take a filehandle)!   So many better ways...

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:96
&gt; +        commands_dir = filesystem.dirname(filesystem.abspath(__file__))

You want filesystem.path_to_module(self.__module__) instead, I think.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:108
&gt; +        self._filesystem = host.filesystem
&gt; +        self._contribution_areas = ContributionAreas(host.filesystem)
&gt; +        self._scm = host.scm()

I&apos;m curious why you store the filesystem and scm separately instead of just storing the host?

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:128
&gt; +        status = new_status + (&apos; &apos; * max(len(self._previous_status) - len(new_status) - 1, 0))

local var for the max result might be helpful to clarity here.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:129
&gt; +        print &quot;\b&quot; * len(self._previous_status) + status,

\b?

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:146
&gt; +            changelog = self._filesystem.open_text_file_for_reading(path)
&gt; +            try:
&gt; +                self._print_status(&apos;Parsing entries...&apos;)
&gt; +                number_of_parsed_entries = self._analyze_entries(ChangeLog.parse_entries_from_file(changelog), path)
&gt; +            finally:
&gt; +                changelog.close()

Yup, again, &quot;with&quot; or &quot;write_text_file&quot; are better options.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:156
&gt; +            area_contributors[contributor] = {&apos;reviews&apos;: 0, &apos;reviewed&apos;: 0, &apos;unreviewed&apos;: 0}

These dictionaries start to feel like objects (with default values in their constructor).

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:173
&gt; +        if contribution_type == &apos;reviews&apos;:
&gt; +            statistics[&apos;total&apos;] += 1
&gt; +        elif reviewed:
&gt; +            statistics[&apos;reviewed&apos;] += 1
&gt; +        else:
&gt; +            statistics[&apos;unreviewed&apos;] += 1

Yeah, you type these strings for these dictionaries several times here. :)

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:182
&gt; +    def _increment_dictionary_value(self, dictionary, key):
&gt; +        dictionary[key] = dictionary.get(key, 0) + 1

Does setdefault() get you this?

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:204
&gt; +            for reviewer in reviewers_for_entry:
&gt; +                self._collect_statistics_for_contributor(reviewer.full_name, &apos;reviews&apos;, areas_for_entry, touchedfiles_for_entry, reviewed=True)
&gt; +
&gt; +            for author in authors_for_entry:
&gt; +                self._collect_statistics_for_contributor(author[&apos;name&apos;], &apos;patches&apos;, areas_for_entry, touchedfiles_for_entry,
&gt; +                    reviewed=bool(reviewers_for_entry))
&gt; +
&gt; +            for area in areas_for_entry:
&gt; +                self._areas_statistics[area][&apos;reviewed&apos; if reviewers_for_entry else &apos;unreviewed&apos;] += 1

Should you just be passing entry to these function calls?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>514415</commentid>
    <comment_count>23</comment_count>
      <attachid>117290</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-12-02 22:00:58 -0800</bug_when>
    <thetext>Comment on attachment 117290
Fixed per Eric&apos;s comment

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

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:48
&gt;&gt; +            steps.Options.changelog_count,
&gt; 
&gt; What does this do?  Is this how many changelogs back to search?  Feels a bit strangely named.  Feels like it&apos;s more interesting to think about searching back to a specific date instead of a number of Changelogs.  the options &quot;git log&quot; has make sense here. :)

Going back to specific date is tricky because people put entries with wrong dates all the time. I need to develop some heuristics for that.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:57
&gt;&gt; +        return changelogs[:changelog_count]
&gt; 
&gt; Yeah, again I think we want to end up just sorting the entries instead of the logs themselves. :)  That doesn&apos;t have to be this change, but i&apos;m interested in your feel for that eventual design, if it makes sense.

In the current design, the order in which entries appear don&apos;t matter at all. If we really think the order matter then we probably want to parse logs per revision. Even though that&apos;ll take forever (ETA 27h), it&apos;ll guarantee the ordering.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:67
&gt;&gt; +                output_file.close()
&gt; 
&gt; I think you want  to use &quot;with&quot; instead.  That will autoclose at the end of the with block.  Also, why not just use write_text_file directly?  Or even json.dump? (which can take a filehandle)!   So many better ways...

Rewritten using write_text_file.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:96
&gt;&gt; +        commands_dir = filesystem.dirname(filesystem.abspath(__file__))
&gt; 
&gt; You want filesystem.path_to_module(self.__module__) instead, I think.

Done.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:108
&gt;&gt; +        self._scm = host.scm()
&gt; 
&gt; I&apos;m curious why you store the filesystem and scm separately instead of just storing the host?

For ease of access and also because I don&apos;t really host.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:129
&gt;&gt; +        print &quot;\b&quot; * len(self._previous_status) + status,
&gt; 
&gt; \b?

Rewritten using \r.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:146
&gt;&gt; +                changelog.close()
&gt; 
&gt; Yup, again, &quot;with&quot; or &quot;write_text_file&quot; are better options.

Here, I&apos;m reading a file and parse_entries_from_file requires a file object. Reading the entire file into memory and converting it to StringIO turns out to be slow. Do I need __future__ import still for with? Since nobody&apos;s going to use this tool on Leopard, if this won&apos;t cause an error in module initialization, then I&apos;d rather avoid adding the ugly __future__ import.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:156
&gt;&gt; +            area_contributors[contributor] = {&apos;reviews&apos;: 0, &apos;reviewed&apos;: 0, &apos;unreviewed&apos;: 0}
&gt; 
&gt; These dictionaries start to feel like objects (with default values in their constructor).

Yeah but then we&apos;ll end up having lots of them, and I need to define __str__ for them.

&gt;&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:204
&gt;&gt; +                self._areas_statistics[area][&apos;reviewed&apos; if reviewers_for_entry else &apos;unreviewed&apos;] += 1
&gt; 
&gt; Should you just be passing entry to these function calls?

No. Calling _contribution_areas.areas_for_touched_files is very expensive. We can&apos;t afford to do that twice.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>514416</commentid>
    <comment_count>24</comment_count>
      <attachid>117741</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-12-02 22:05:38 -0800</bug_when>
    <thetext>Created attachment 117741
Fixed per Eric&apos;s review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>514443</commentid>
    <comment_count>25</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-12-02 23:30:34 -0800</bug_when>
    <thetext>(In reply to comment #23)
&gt; (From update of attachment 117290 [details])
&gt; Here, I&apos;m reading a file and parse_entries_from_file requires a file object. Reading the entire file into memory and converting it to StringIO turns out to be slow. Do I need __future__ import still for with? Since nobody&apos;s going to use this tool on Leopard, if this won&apos;t cause an error in module initialization, then I&apos;d rather avoid adding the ugly __future__ import.

I will remove all the __future__ imports when we drop support for python 2.5.  Until then, they&apos;re required, as there may be bots running test-webkitpy on 2.5.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>515917</commentid>
    <comment_count>26</comment_count>
      <attachid>117741</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-12-06 07:59:52 -0800</bug_when>
    <thetext>Comment on attachment 117741
Fixed per Eric&apos;s review

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

I like this; cleaner than my solution.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:115
&gt; +        self._longest_filename = max([len(path) - len(self._scm.checkout_root) for path in changelog_paths])

There&apos;s no need to create a temporary list here; just use a generator:

   self._longest_filename = max(len(path) ... for path in changelog_paths)

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:149
&gt; +        self._summary[&apos;contributors_with_reviews&apos;] = sum([1 for contributor in self._contributors_statistics.values() if contributor[&apos;reviews&apos;][&apos;total&apos;]])

Instead of sum(), you could use len(). Also, there&apos;s no need to create a temporary list, just use a generator here:

   ... = len(1 for contributor in ... if ...)

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:206
&gt; +            i += 1

No-op. You&apos;re iterating over a generator created by enumerate(), ``i&apos;&apos; will be overwritten in the next step. If you want to start from 1, you can use the start parameter of enumerate: enumerate(entries, start=1). I&apos;m not sure if it&apos;s available in the minimum version of Python we&apos;re supposed to support, but since you&apos;re using ``i&apos;&apos; only to call _print_status(), printing (i + 1) would suffice here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517460</commentid>
    <comment_count>27</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-12-08 09:10:28 -0800</bug_when>
    <thetext>Ping reviewers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517613</commentid>
    <comment_count>28</comment_count>
      <attachid>117741</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-12-08 11:39:26 -0800</bug_when>
    <thetext>Comment on attachment 117741
Fixed per Eric&apos;s review

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

I expect we could make this nicer with a few more rounds.  But this is OK to go.  Thanks for hte patch.  Please fix my and leandro&apos;s comments before landing.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:96
&gt; +        print commands_dir

Do you wnat this printing?

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog.py:137
&gt; +        if self._filename:
&gt; +            print

Hum?

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog_unittest.py:65
&gt; +        test_json = {&apos;array.json&apos;: [1, 2, 3, {&apos;key&apos;: &apos;value&apos;}], &apos;dictionary.json&apos;: {&apos;somekey&apos;: &apos;somevalue&apos;, &apos;array&apos;: [4, 5]}}
&gt; +        sys_stdout = sys.stdout
&gt; +        try:
&gt; +            sys.stdout = filesystem.open_text_file_for_writing(&apos;stdout&apos;)
&gt; +            AnalyzeChangeLog._generate_jsons(filesystem, test_json, &apos;bar&apos;)
&gt; +            self.assertEqual(set(filesystem.files.keys()), set([&apos;bar/array.json&apos;, &apos;bar/dictionary.json&apos;, &apos;stdout&apos;]))
&gt; +        finally:
&gt; +            sys.stdout = sys_stdout

Huh?  do you want OutputCapture?  That&apos;s our testing way of overriding sys.stdout.

&gt; Tools/Scripts/webkitpy/tool/commands/analyzechangelog_unittest.py:148
&gt; +        sys_stdout = sys.stdout
&gt; +        try:
&gt; +            sys.stdout = host.filesystem.open_text_file_for_writing(&apos;stdout&apos;)
&gt; +            analyzer = ChangeLogAnalyzer(host, [&apos;mock-checkout/foo/ChangeLog&apos;])
&gt; +            analyzer.analyze()
&gt; +        finally:
&gt; +            sys.stdout = sys_stdout

Again, outputcapture.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>529001</commentid>
    <comment_count>29</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-01-03 13:25:23 -0800</bug_when>
    <thetext>Committed r103959: &lt;http://trac.webkit.org/changeset/103959&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>529159</commentid>
    <comment_count>30</comment_count>
    <who name="Evan Martin">evan</who>
    <bug_when>2012-01-03 16:45:25 -0800</bug_when>
    <thetext>I just saw the git question.  In general git svn is a weak shell around underlying git commands, so if you need to do something fancy with an svn revision, the right way is to map it to a git hash first.  E.g.
  hash = git svn find-rev r1234
  git blame --complex-git-flags $hash</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>114885</attachid>
            <date>2011-11-13 23:30:26 -0800</date>
            <delta_ts>2011-11-15 22:55:32 -0800</delta_ts>
            <desc>work in progress</desc>
            <filename>wip72243</filename>
            <type>text/plain</type>
            <size>17211</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1NjcmlwdHMvYW5hbHl6ZS1jaGFuZ2Vsb2dzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL1NjcmlwdHMvYW5hbHl6ZS1jaGFuZ2Vsb2dzCShyZXZpc2lvbiAwKQorKysgVG9vbHMvU2Ny
aXB0cy9hbmFseXplLWNoYW5nZWxvZ3MJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzQ2IEBACisj
IS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1l
dDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMg
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgY29kZWNzCitp
bXBvcnQganNvbgoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2Zyb20gd2Via2l0
cHkuY29tbW9uLmNoZWNrb3V0LmNoYW5nZWxvZyBpbXBvcnQgQ2hhbmdlTG9nCisKK2RlZiB0b2tl
bml6ZV9maWxlX3BhdGgoZmlsZV9wYXRoKToKKyAgICBwYXRoX3dpdGhvdXRfZXh0ZW5zaW9uID0g
aGVhZCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZV9wYXRoKVswXQorICAgIHRva2VucyA9IFtdCisg
ICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdG9rZW5zICs9IFtoZWFkXQorICAgICAgICBoZWFkLCB0
YWlsID0gb3MucGF0aC5zcGxpdChoZWFkKQorICAgICAgICBpZiBub3QgbGVuKGhlYWQpOgorICAg
ICAgICAgICAgYnJlYWsKKyAgICAjIEZpbGUgbmFtZSBpcyBzcGVjaWFsIGZvciBjYXNlcyBsaWtl
IH5+R3RrLmNwcCBvciB+flR5cGUuY3BwCisgICAgaWYgbGVuKHRva2Vucyk6CisgICAgICAgIG0g
PSByZS5tYXRjaChyJyhbQS1aMC05XStbYS16MC05XSo/KSskJywgb3MucGF0aC5zcGxpdChwYXRo
X3dpdGhvdXRfZXh0ZW5zaW9uKVsxXSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIHJldHVy
biB0b2tlbnMsIG0uZ3JvdXAoMSkKKyAgICByZXR1cm4gdG9rZW5zLCBOb25lCisKK2RlZiBzcGxp
dF9wYXRoKHBhdGgpOgorICAgIHJlc3VsdCA9IFtdCisgICAgd2hpbGUgcGF0aCBhbmQgbGVuKHBh
dGgpOgorICAgICAgICBuZXh0X3BhdGgsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCisgICAg
ICAgIGlmIHBhdGggPT0gbmV4dF9wYXRoOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYg
dGFpbCBhbmQgbGVuKHRhaWwpOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0YWlsKQorICAg
ICAgICBwYXRoID0gbmV4dF9wYXRoCisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgc3BsaXRfY2Ft
ZWxjYXNlKG5hbWUsIHRyYW5zZm9ybT1sYW1iZGEgeDogeCk6CisgICAgcmVzdWx0ID0gW10KKyAg
ICB3aGlsZSBuYW1lIGFuZCBsZW4obmFtZSk6CisgICAgICAgIG0gPSByZS5tYXRjaCgnXihbQS1a
XVthLXowLTldKyl8KFtBLVowLTldKyg/PShbQS1aXVthLXowLTldfFwufCQpKSknLCBuYW1lKQor
ICAgICAgICBpZiBtOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0cmFuc2Zvcm0obS5ncm91
cCgwKSkpCisgICAgICAgICAgICBuYW1lID0gbmFtZVttLmVuZCgpOl0KKyAgICAgICAgZWxzZToK
KyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiB0b2tl
bl9pc19pbl9maWxlcGF0aChzaW5ndWxhcl90b2tlbiwgZmlsZV9wYXRoKToKKyAgICAjIEZJWE1F
OiBkbyBwcm9wZXIgcHVsYXJpemF0aW9uCisgICAgc3BsaXRfZmlsZV9wYXRoID0gc3BsaXRfcGF0
aChmaWxlX3BhdGgpCisgICAgcGx1cmFsX3Rva2VuID0gc2luZ3VsYXJfdG9rZW4gKyAncycKKyAg
ICBpZiBzaW5ndWxhcl90b2tlbiBpbiBzcGxpdF9maWxlX3BhdGggb3IgcGx1cmFsX3Rva2VuIGlu
IHNwbGl0X2ZpbGVfcGF0aDoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBmb3IgbmFtZSBpbiBz
cGxpdF9maWxlX3BhdGg6CisgICAgICAgIHNwbGl0X25hbWUgPSBzcGxpdF9jYW1lbGNhc2UobmFt
ZSwgbGFtYmRhIHg6IHgubG93ZXIoKSkKKyAgICAgICAgIyBOb3cgd2Ugam9pbiB0b2tlbnMgdG8g
bWF0Y2guIEp1c3QgY29tcGFyaW5nIGVhY2ggdG9rZW4gaXNuJ3Qgc3VmZmljaWVudCBmb3IgdGhp
bmdzIGxpa2UgQ01ha2VMaXN0CisgICAgICAgIGZvciBpbmRleCwgdmFsdWUgaW4gZW51bWVyYXRl
KHNwbGl0X25hbWUpOgorICAgICAgICAgICAgZm9yIGxhc3RfaW5kZXggaW4gcmFuZ2UoMSwgbGVu
KHNwbGl0X25hbWUpICsgMSk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSAnJy5qb2luKHNwbGl0
X25hbWVbaW5kZXg6bGFzdF9pbmRleF0pCisgICAgICAgICAgICAgICAgaWYgc2luZ3VsYXJfdG9r
ZW4gPT0gdmFsdWUgb3IgcGx1cmFsX3Rva2VuID09IHZhbHVlOgorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGxlbihzaW5ndWxhcl90b2tlbikgPD0g
bGVuKHZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICByZXR1cm4gRmFsc2UK
KworZGVmIGF2ZXJhZ2UobGlzdCk6CisgICAgcmV0dXJuIHN1bShsaXN0KSAvIGxlbihsaXN0KQor
CitkZWYgZG90X3Byb2R1Y3QodjEsIHYyKToKKyAgICByZXR1cm4gc3VtKHZhbHVlICogdjJbaW5k
ZXhdIGZvciBpbmRleCwgdmFsdWUgaW4gZW51bWVyYXRlKHYxKSkKKworVVNFX05BTUUgPSAxICMg
VG9rZW5pemUgdGhlIGNvbXBvbmVudCBuYW1lIGl0c2VsZgorYXJlYXNfb2ZfY29udHJpYnV0aW9u
cyA9IHsKKyAgICAnQVJNIEpJVCc6IFsnYXJtJ10sCisjICAgICdBY2NlbGVyYXRlZCBjb21wb3Np
dGluZyAvIEdQVSBhY2NlbGVyYXRpb24nOiBGSVhNRQorICAgICdBY2Nlc3NpYmlsaXR5JzogW1VT
RV9OQU1FXSwKKyAgICAnQW5kcm9pZCBwb3J0JzogWydhbmRyb2lkJ10sCisgICAgJ0FuaW1hdGlv
bic6IFtVU0VfTkFNRSwgJ2FuaW1hdG9yJ10sCisgICAgJ0FwcGxlXCdzIFdpbmRvd3MgcG9ydCc6
IFsnd2luJywgJ3dpbmRvd3MnXSwgIyBGSVhNRTogbmVlZCB0byBleGNsdWRlIGNocm9taXVtLi4u
CisgICAgJ0F1dG90b29scyBCdWlsZCc6IFsnYXV0b3Rvb2xzJ10sCisgICAgJ0Jhc2ljIHR5cGVz
IGFuZCBkYXRhIHN0cnVjdHVyZXMgKFdURiknOiBbJ3d0ZiddLAorIyAgICdCaWRpcmVjdGlvbmFs
IHRleHQnOiBGSVhNRQorIyAgICAnQnVpbGQvdGVzdCBpbmZyYXN0cnVjdHVyZSAoc3R1ZmYgdW5k
ZXIgVG9vbHMvU2NyaXB0cyknOiBGSVhNRQorICAgICdDTWFrZSBCdWlsZCc6IFsnY21ha2VsaXN0
J10sCisgICAgJ0NTUyAoQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyknOiBbJ2NzcyddLAorICAgICdD
U1MgVHJhbnNmb3Jtcyc6IFsoJ2NzcycsICd0cmFuc2Zvcm1zJyldLAorICAgICdDU1MvU1ZHIEZp
bHRlcnMnOiBbKCdjc3MnLCAnZmlsdGVycycpLCAoJ3N2ZycsICdmaWx0ZXJzJyldLAorICAgICdD
VVJMIEhUVFAgQmFja2VuZCc6IFsnQ1VSTCddLAorICAgICdSZXNvdXJjZSBDYWNoZSc6IFsoJ2xv
YWRlcicsICdjYWNoZScpXSwKKyAgICAnTWVtb3J5IENhY2hlJzogWygnZ3JhcGhpY3MnLCAnY2Fj
aGUnKV0sCisgICAgJ0NhaXJvJzogW1VTRV9OQU1FXSwKKyAgICAnQ2FudmFzJzogW1VTRV9OQU1F
XSwKKyAgICAnQ2hyb21pdW0gTGludXgnOiBbKCdjaHJvbWl1bScsICdsaW51eCcpXSwKKyMgICAg
J0NvbW1pdCBRdWV1ZSc6IEZJWE1FCisgICAgJ0NvcmUgRE9NJzogWydkb20nXSwKKyAgICAnQ29y
ZSBHcmFwaGljcyc6IFsnY2cnXSwKKyAgICAnQmluZGluZ3MnOiBbVVNFX05BTUVdLAorICAgICdE
T00gU3RvcmFnZSc6IFsnc3RvcmFnZSddLAorICAgICdEcmFnIGFuZCBEcm9wJzogWydkcmFnJ10s
CisgICAgJ0R1bXBSZW5kZXJUcmVlJzogW1VTRV9OQU1FXSwKKyAgICAnRUZMJzogWydlZmwnXSwK
KyAgICAnRWRpdGluZyAvIFNlbGVjdGlvbic6IFsnZWRpdGluZyddLAorICAgICdFdmVudCBIYW5k
bGluZyc6IFsnZXZlbnQnXSwKKyAgICAnRmFzdE1hbGxvYyc6IFtVU0VfTkFNRV0sCisgICAgJ0Zp
bGUgQVBJJzogWydmaWxlYXBpJ10sCisgICAgJ0ZvbnRzJzogW1VTRV9OQU1FXSwKKyAgICAnRm9y
bXMnOiBbVVNFX05BTUVdLAorIyAgICAnRnJhbWUgRmxhdHRlbmluZyc6IEZJWE1FCisgICAgJ0Zy
YW1lIExvYWRlcic6IFtVU0VfTkFNRV0sCisjICAgICdHZW5lcmFsJzogRklYTUUgTWF5YmUgYXV0
by1kZXRlY3QgcGVvcGxlIGNvbnRyaWJ1dGluZyB0byBhbGwgc3ViZGlyZWN0b3JpZXM/CisgICAg
J0dlb2xvY2F0aW9uIEFQSSc6IFsnZ2VvbG9jYXRpb24nXSwKKyAgICAnR3JhcGhpY3MnOiBbJ2dy
YXBoaWNzJ10sCisgICAgJ0hUTUwnOiBbJ2h0bWwnXSwKKyAgICAnSFRNTCBQYXJzZXInOiBbKCdo
dG1sJywgJ3BhcnNlcicpXSwgIyBGSVhNRTogbWF0Y2hlcyBodG1sL3RyYWNrL1dlYlZUVFBhcnNl
ci5jcHAKKyAgICAnSFRNTDUgTWVkaWEgU3VwcG9ydCc6IFsnbWVkaWEnXSwKKyAgICAnSGlzdG9y
eSc6IFsnaGlzdG9yeSddLAorIyAgICAnSGl0IHRlc3RpbmcnOiBGSVhNRQorICAgICdJbWFnZSBE
ZWNvZGVyJzogWydpbWFnZWRlY29kZXInXSwKKyMgICAgJ0lucHV0IG1ldGhvZHMnOiBGSVhNRQor
ICAgICdKU0MgQmluZGluZ3MnOiBbKCdiaW5kaW5ncycsICdqcycpXSwKKyAgICAnSmF2YVNjcmlw
dENvcmUnOiBbVVNFX05BTUVdLAorICAgICdKYXZhU2NyaXB0Q29yZSBSZWd1bGFyIEV4cHJlc3Np
b25zJzogWygnSmF2YVNjcmlwdENvcmUnLCAncmVnZXhwJyldLAorIyAgICAnTGF5b3V0IHRlc3Rz
JzogRklYTUUgYnV0IHdoYXQgZG9lcyBpdCBtZWFuIHRvIHNheSB5b3UncmUgYW4gZXhwZXJ0IG9u
IGxheW91dCB0ZXN0cz8gTWF5YmUgd29ya2VkIG9uIHRvb2xzPworICAgICdMb2FkZXInOiBbJ2xv
YWRlciddLAorICAgICdNYXRoTUwnOiBbVVNFX05BTUVdLAorICAgICdNZW1vcnkgVXNlIC8gTGVh
a3MnOiBbJ2xlYWtzJ10sICMgUHJvYmFibHkgbmVlZCBtb3JlIHRva2VucworICAgICdNZXNzYWdl
UG9ydHMnOiBbVVNFX05BTUVdLAorICAgICdOZXR3b3JrJzogWygncGxhdGZvcm0nLCAnbmV0d29y
aycpXSwKKyAgICAnbmV3LXJ1bi13ZWJraXQtdGVzdHMnOiBbJ2xheW91dF90ZXN0cyddLAorICAg
ICdPcGVuVkcgZ3JhcGhpY3MgYmFja2VuZCc6IFsnb3BlbnZnJ10sCisjICAgICdQZXJmb3JtYW5j
ZSc6IEZJWE1FCisgICAgJ1BsdWctaW5zJzogWydwbHVnaW5zJ10sCisgICAgJ1ByaW50aW5nJzog
WydwcmludGluZycsICdwcmludCddLAorICAgICdSZW5kZXJpbmcnOiBbVVNFX05BTUVdLAorICAg
ICdTVkcgKFNjYWxhYmxlIFZlY3RvciBHcmFwaGljcyknOiBbJ3N2ZyddLAorICAgICdTY3JvbGxi
YXJzJzogWydzY3JvbGwnXSwKKyAgICAnU2VjdXJpdHknOiBbVVNFX05BTUVdLCAjIFByb2JhYmx5
IG5lZWQgbW9yZSB0b2tlbnMKKyMgICAgJ1NoYWRvdyBET00nOiBGSVhNRQorICAgICdTa2lhJzog
W1VTRV9OQU1FXSwKKyAgICAnU291cCBOZXR3b3JrIEJhY2tlbmQnOiBbJ3NvdXAnXSwKKyMgICAg
J1NwZWxsIENoZWNraW5nJzogRklYTUUganVzdCBuZWVkIHRva2VucworICAgICdUYWJsZXMnOiBb
J2h0bWx0YWJsZScsICdyZW5kZXJ0YWJsZSddLAorIyAgICAnVGV4dCBFbmNvZGluZyc6IEZJWE1F
CisjICAgICdUZXh0IExheW91dCc6IEZJWE1FCisgICAgJ1RoZSBDaHJvbWl1bSBQb3J0JzogWydj
aHJvbWl1bSddLAorICAgICdUaGUgRUZMV2ViS2l0IFBvcnQnOiBbJ2VmbCddLAorICAgICdUaGUg
V2ViS2l0R1RLKyBQb3J0JzogWydndGsnXSwKKyAgICAnVGhlIEhhaWt1IFBvcnQnOiBbJ2hhaWt1
J10sCisgICAgJ1RoZSBRdFdlYktpdCBQb3J0JzogWydxdCddLAorICAgICdUaGUgV2luQ0UgUG9y
dCc6IFsnd2luY2UnXSwKKyAgICAnVGhlIFdpbkNhaXJvIFBvcnQnOiBbJ2NhaXJvJ10sCisgICAg
J1RoZSB3eFdlYktpdCBQb3J0JzogWyd3eCddLAorICAgICdUaHJlYWRpbmcnOiBbJ3RocmVhZCdd
LAorICAgICdUb29scyc6IFtVU0VfTkFNRV0sCisgICAgJ1RvdWNoIFN1cHBvcnQnOiBbJ3RvdWNo
J10sCisgICAgJ1RyYW5zZm9ybXMnOiBbJ3RyYW5zZm9ybXMnXSwgIyBUaGVyZSdzIGFsc28gQ1NT
IHRyYW5zZm9ybXMKKyAgICAnVHJhbnNpdGlvbnMnOiBbJ3RyYW5zaXRpb25zJ10sICMgVGhpcyBv
bmx5IG1hdGNoZXMgdHJhbnNpdGlvbiBldmVudHMgYXQgdGhlIG1vbWVudAorICAgICdVUkwgUGFy
c2luZyc6IFsnS1VSTCddLCAjIFByb2JhYmx5IG5lZWQgbW9yZSB0b2tlbnMKKyAgICAnVjgnOiBb
J3Y4J10sCisgICAgJ1Y4IEJpbmRpbmdzJzogWygnYmluZGluZ3MnLCAndjgnKV0sCisgICAgJ1dl
YiBJbnNwZWN0b3IgLyBEZXZlbG9wZXIgVG9vbHMnOiBbJ2luc3BlY3RvciddLAorICAgICdXZWIg
VGltaW5nJzogWydQZXJmb3JtYW5jZU5hdmlnYXRpb24nLCAnUGVyZm9ybWFuY2VUaW1pbmcnXSwg
IyBtb3JlIHRva2Vucz8KKyAgICAnV2ViQXJjaGl2ZSc6IFtVU0VfTkFNRV0sCisgICAgJ1dlYkNv
cmUgSWNvbiBEYXRhYmFzZSc6IFsnaWNvbiddLAorICAgICdXZWJHTCc6IFsnd2ViZ2wnXSwKKyAg
ICAnV2ViS2l0IFdlYnNpdGVzJzogWyd3ZWJzaXRlcyddLAorICAgICdXZWJLaXQyJzogW1VTRV9O
QU1FXSwKKyAgICAnV2ViU1FMIERhdGFiYXNlcyc6IFsoJ3N0b3JhZ2UnLCAnZGF0YWJhc2UnKV0s
CisgICAgJ1dlYlNvY2tldHMnOiBbVVNFX05BTUVdLAorICAgICdXb3JrZXJzJzogW1VTRV9OQU1F
XSwKKyAgICAnWE1MJzogW1VTRV9OQU1FXSwKKyAgICAnWE1MSHR0cFJlcXVlc3QnOiBbVVNFX05B
TUVdLAorICAgICdYU0xUJzogW1VTRV9OQU1FXSwKKyAgICAnWFNTQXVkaXRvcic6IFtVU0VfTkFN
RV0sCisgICAgJ1dlYktpdCBBUEkgVGVzdHMnOiBbJ1Rlc3RXZWJLaXRBUEknXSwKKyAgICAnd2Vi
a2l0LXBhdGNoJzogWygnd2Via2l0cHknLCAnY29tbWFuZHMnKV0sCit9CisKK2RlZiB0b2tlbml6
ZSh3b3JkKToKKyAgICB0b2tlbiA9IHdvcmQubG93ZXIoKQorICAgIHJldHVybiB0b2tlbls6LTFd
IGlmIHRva2VuWy0xXSA9PSAncycgZWxzZSB0b2tlbgorCitkZWYgYXJlYXNfb2ZfY29udHJpYnV0
aW9uc19mb3JfZW50cnkoZW50cnkpOgorICAgIGFyZWFzID0gc2V0KCkKKyAgICBmb3IgZmlsZV9w
YXRoIGluIGVudHJ5LnRvdWNoZWRfZmlsZXMoKToKKyAgICAgICAgZm9yIGFyZWEsIHRva2VucyBp
biBhcmVhc19vZl9jb250cmlidXRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgdG9rZW4g
aW4gdG9rZW5zOgorICAgICAgICAgICAgICAgIGlmIHRva2VuID09IFVTRV9OQU1FOgorICAgICAg
ICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuaXplKGFyZWEpCisgICAgICAgICAgICAgICAgaWYg
aXNpbnN0YW5jZSh0b2tlbiwgdHVwbGUpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAj
IEZJWE1FOiBTdXBwb3J0IHNldCA9IEFORCBjbGF1c2VzCisgICAgICAgICAgICAgICAgaWYgdG9r
ZW5faXNfaW5fZmlsZXBhdGgodG9rZW4sIGZpbGVfcGF0aCk6CisgICAgICAgICAgICAgICAgICAg
IGFyZWFzLmFkZChhcmVhKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgIHJldHVybiBh
cmVhcworCitjbGFzcyBDaGFuZ2VMb2dFbnVtZXJhdG9yKG9iamVjdCk6CisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIHN0YXJ0X3BhdGgpOgorICAgICAgICBzZWxmLl9zdGFydF9wYXRoID0gc3RhcnRf
cGF0aAorICAgICAgICBzZWxmLl9jaGFuZ2Vsb2dfZGlycyA9IHt9CisgICAgICAgIHJlbGF0aXZl
X3BhdGggPSBzZWxmLl9zcGxpdF9wYXRoX3JlbGF0aXZlX3RvX3NvdXJjZShzZWxmLl9zdGFydF9w
YXRoKQorICAgICAgICBpZiByZWxhdGl2ZV9wYXRoICE9IE5vbmU6CisgICAgICAgICAgICBzZWxm
Ll9lbnVtZXJhdGUoc2VsZi5fc3RhcnRfcGF0aCwgcmVsYXRpdmVfcGF0aCkKKworICAgIGRlZiBk
aXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2hhbmdlbG9nX2RpcnMua2V5cygpCisK
KyAgICBkZWYgY2hhbmdlbG9ncyhzZWxmLCBsaW1pdD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHN1
bShbc2VsZi5fc29ydF9jaGFuZ2Vsb2dzX2luX3JldmVyc2VfY2hyb25vbG9naWNhbF9vcmRlcihm
aWxlcywgcmV2ZXJzZT1UcnVlKVs6bGltaXRdIGZvciBkaXJuYW1lLCBmaWxlcyBpbiBzZWxmLl9j
aGFuZ2Vsb2dfZGlycy5pdGVtcygpXSwgW10pCisKKyAgICBkZWYgX3NwbGl0X3BhdGhfcmVsYXRp
dmVfdG9fc291cmNlKHNlbGYsIHBhdGgpOgorICAgICAgICBoZWFkLCB0YWlsID0gcGF0aCwgJycK
KyAgICAgICAgcmVsYXRpdmVfcGF0aCA9ICcnCisgICAgICAgIHdoaWxlIHRhaWwgIT0gJ1NvdXJj
ZSc6CisgICAgICAgICAgICBuZXh0X2hlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KGhlYWQpCisg
ICAgICAgICAgICBpZiBuZXh0X2hlYWQgPT0gaGVhZDoKKyAgICAgICAgICAgICAgICByZXR1cm4g
Tm9uZQorICAgICAgICAgICAgaWYgdGFpbCAhPSAnU291cmNlJyBhbmQgaGVhZCAhPSBwYXRoOgor
ICAgICAgICAgICAgICAgIHJlbGF0aXZlX3BhdGggPSBvcy5wYXRoLmpvaW4odGFpbCwgcmVsYXRp
dmVfcGF0aCkKKyAgICAgICAgICAgIGhlYWQgPSBuZXh0X2hlYWQKKyAgICAgICAgcmV0dXJuIHJl
bGF0aXZlX3BhdGgKKworICAgIGRlZiBfYWRkX3BhdGhfaWZfY2hhbmdlbG9nKHNlbGYsIHBhdGgs
IHJlbGF0aXZlX3BhdGgsIGZpbGVuYW1lKToKKyAgICAgICAgbSA9IHJlLm1hdGNoKCdDaGFuZ2VM
b2coLShcZHs0fS1cZHsyfS1cZHsyfSkpPycsIGZpbGVuYW1lKQorICAgICAgICBpZiBtIGFuZCBv
cy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgIGlmIHJlbGF0aXZlX3BhdGggbm90IGlu
IHNlbGYuX2NoYW5nZWxvZ19kaXJzOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoYW5nZWxvZ19k
aXJzW3JlbGF0aXZlX3BhdGhdID0gW10KKyAgICAgICAgICAgIHNlbGYuX2NoYW5nZWxvZ19kaXJz
W3JlbGF0aXZlX3BhdGhdLmFwcGVuZCh7J3BhdGgnOiBwYXRoLCAncmVsYXRpdmVfcGF0aCc6IG9z
LnBhdGguam9pbihyZWxhdGl2ZV9wYXRoLCBmaWxlbmFtZSksICdmaWxlbmFtZSc6IGZpbGVuYW1l
fSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAg
ZGVmIF9lbnVtZXJhdGUoc2VsZiwgcGF0aCwgcmVsYXRpdmVfcGF0aCk6CisgICAgICAgIGhlYWQs
IGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChwYXRoKQorICAgICAgICBpZiBmaWxlbmFtZSBhbmQg
c2VsZi5fYWRkX3BhdGhfaWZfY2hhbmdlbG9nKHBhdGgsIHJlbGF0aXZlX3BhdGgsIGZpbGVuYW1l
KToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBh
dGgpIG9yIChmaWxlbmFtZSBhbmQgZmlsZW5hbWVbMF0gPT0gJy4nKToKKyAgICAgICAgICAgIHJl
dHVybiAwCisgICAgICAgIHJldHVybiBzdW0oW3NlbGYuX2VudW1lcmF0ZShvcy5wYXRoLmpvaW4o
cGF0aCwgY2hpbGQpLCBvcy5wYXRoLmpvaW4ocmVsYXRpdmVfcGF0aCwgZmlsZW5hbWUpKSBmb3Ig
Y2hpbGQgaW4gb3MubGlzdGRpcihwYXRoKV0pCisKKyAgICBkZWYgX3NvcnRfY2hhbmdlbG9nc19p
bl9yZXZlcnNlX2Nocm9ub2xvZ2ljYWxfb3JkZXIoc2VsZiwgZmlsZXMsIHJldmVyc2U9RmFsc2Up
OgorICAgICAgICByZXR1cm4gc29ydGVkKGZpbGVzLCBrZXk9bGFtYmRhIGl0ZW06IGl0ZW1bJ2Zp
bGVuYW1lJ10gKyAnWCcsIHJldmVyc2U9cmV2ZXJzZSkKKworZGVmIGNvbGxlY3Rfc3RhdGlzdGlj
c19mb3JfcmV2aWV3ZXIocmV2aWV3ZXIsIGFyZWFzX29mX2NvbnRyaWJ1dGlvbnMsIGNoYW5nZWxv
Z19kaXIsIGZpbGVuYW1lcyk6CisgICAgaWYgcmV2aWV3ZXIgbm90IGluIHJldmlld2VyczoKKyAg
ICAgICAgcmV2aWV3ZXJzW3Jldmlld2VyXSA9IHsndG90YWwnOiAwLCAnYXJlYXMnOiB7fSwgJ2Zp
bGVzJzoge319CisKKyAgICByZXZpZXdlcnNbcmV2aWV3ZXJdWyd0b3RhbCddICs9IDEKKworICAg
IHJldmlld2VyX2FyZWFzID0gcmV2aWV3ZXJzW3Jldmlld2VyXVsnYXJlYXMnXQorICAgIGZvciBh
cmVhIGluIGFyZWFzX29mX2NvbnRyaWJ1dGlvbnM6CisgICAgICAgIHJldmlld2VyX2FyZWFzW2Fy
ZWFdID0gcmV2aWV3ZXJfYXJlYXMuZ2V0KGFyZWEsIDApICsgMQorICAgICAgICBhcmVhc1thcmVh
XVsncmV2aWV3ZXJzJ11bcmV2aWV3ZXJdID0gYXJlYXNbYXJlYV1bJ3Jldmlld2VycyddLmdldChy
ZXZpZXdlciwgMCkgKyAxCisKKyAgICByZXZpZXdlcl9maWxlcyA9IHJldmlld2Vyc1tyZXZpZXdl
cl1bJ2ZpbGVzJ10KKyAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgIHJlbGF0aXZl
X3BhdGggPSBvcy5wYXRoLmpvaW4oY2hhbmdlbG9nX2RpciwgbmFtZSkKKyAgICAgICAgcmV2aWV3
ZXJfZmlsZXNbcmVsYXRpdmVfcGF0aF0gPSByZXZpZXdlcl9maWxlcy5nZXQocmVsYXRpdmVfcGF0
aCwgMCkgKyAxCisKK2RlZiBhbmFseXplX2VudHJpZXMoY2hhbmdlbG9nX2RpciwgZW50cmllcywg
b3V0cHV0X2ZpbGUpOgorICAgIGwgPSAwCisgICAgbWF0Y2hlZF9maWxlX3BhdGhzID0ge30KKwor
ICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICBpZiBub3QgZW50cnkucmV2aWV3ZXJf
dGV4dCgpIG9yIG5vdCBlbnRyeS5hdXRob3JfbmFtZSgpOgorICAgICAgICAgICAgY29udGludWUK
KyAgICAgICAgYXJlYXNfb2ZfY29udHJpYnV0aW9ucyA9IGFyZWFzX29mX2NvbnRyaWJ1dGlvbnNf
Zm9yX2VudHJ5KGVudHJ5KQorICAgICAgICBmb3IgcmV2aWV3ZXJfdGV4dCBpbiBlbnRyeS5yZXZp
ZXdlcl90ZXh0X2xpc3QoKToKKyAgICAgICAgICAgIGNvbGxlY3Rfc3RhdGlzdGljc19mb3JfcmV2
aWV3ZXIocmV2aWV3ZXJfdGV4dCwgYXJlYXNfb2ZfY29udHJpYnV0aW9ucywgY2hhbmdlbG9nX2Rp
ciwgZW50cnkudG91Y2hlZF9maWxlcygpKQorICAgICAgICBmb3IgYXJlYSBpbiBhcmVhc19vZl9j
b250cmlidXRpb25zOgorICAgICAgICAgICAgYXJlYXNbYXJlYV1bJ3RvdGFsJ10gKz0gMQorICAg
ICAgICBjb250ZW50cyA9IGVudHJ5Ll9jb250ZW50cworICAgICAgICBpZiBhcmVhcyBhbmQgbGVu
KGFyZWFzKToKKyAgICAgICAgICAgIGNvbnRlbnRzICs9ICdcbiVze3slc319XG4nICUgKCcgJyAq
IDgsICcsICcuam9pbihhcmVhcykpCisgICAgICAgIHByaW50ID4+IG91dHB1dF9maWxlLCBjb250
ZW50cworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGlmIGxlbihzeXMuYXJndikg
PD0gMjoKKyAgICAgICAgcHJpbnQgIiIiVXNhZ2U6CisgICAgYW5hbHl6ZV9jaGFuZ2Vsb2dzIDxw
YXRoIHRvIGEgZGlyZWN0b3J5IHdpdGggY2hhbmdlbG9ncz4gPG91dHB1dCBkaXJlY3Rvcnk+Cisi
IiIKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBlbHNlOgorICAgICAgICBvdXRwdXRfZGlyID0g
b3MucGF0aC5hYnNwYXRoKHN5cy5hcmd2WzJdKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rp
cihvdXRwdXRfZGlyKToKKyAgICAgICAgICAgIHByaW50ICJUaGUgc2Vjb25kIGFyZ3VtZW50IG11
c3QgYmUgYSBkaXJlY3RvcnkiCisgICAgICAgICAgICBzeXMuZXhpdCgyKQorCisgICAgICAgIHBy
aW50ICdFbnVtZXJhdGluZyBDaGFuZ2VMb2cgZmlsZXMuLi4nCisgICAgICAgIGVudW1lcmF0b3Ig
PSBDaGFuZ2VMb2dFbnVtZXJhdG9yKG9zLnBhdGguYWJzcGF0aChzeXMuYXJndlsxXSkpCisKKyAg
ICAgICAgcmV2aWV3ZXJzID0ge30KKyAgICAgICAgYXJlYXMgPSB7fQorICAgICAgICBmb3IgYXJl
YSBpbiBhcmVhc19vZl9jb250cmlidXRpb25zOgorICAgICAgICAgICAgYXJlYXNbYXJlYV0gPSB7
J3RvdGFsJzogMCwgJ3Jldmlld2Vycyc6IHt9LCAnY29udHJpYnV0b3JzJzoge319CisKKyAgICAg
ICAgZm9yIGxvZyBpbiBlbnVtZXJhdG9yLmNoYW5nZWxvZ3MobGltaXQ9Myk6CisgICAgICAgICAg
ICBwcmludCAnICAgIFByb2Nlc3NpbmcgJXMnICUgbG9nWydyZWxhdGl2ZV9wYXRoJ10KKyAgICAg
ICAgICAgIGNoYW5nZWxvZ19maWxlID0gY29kZWNzLm9wZW4obG9nWydwYXRoJ10sICJyIiwgInV0
Zi04IikKKyAgICAgICAgICAgIGVudHJpZXMgPSBDaGFuZ2VMb2cucGFyc2VfZW50cmllc19mcm9t
X2ZpbGUoY2hhbmdlbG9nX2ZpbGUpCisgICAgICAgICAgICBvdXRvdXRfZmlsZV9wYXRoID0gbG9n
WydyZWxhdGl2ZV9wYXRoJ10ucmVwbGFjZSgnLycsICdfJykucmVwbGFjZSgnXFwnLCAnXycpCisg
ICAgICAgICAgICBvdXRwdXRfZmlsZSA9IGNvZGVjcy5vcGVuKG9zLnBhdGguam9pbihvdXRwdXRf
ZGlyLCBvdXRvdXRfZmlsZV9wYXRoKSwgInciLCAidXRmLTgiKQorICAgICAgICAgICAgYW5hbHl6
ZV9lbnRyaWVzKG9zLnBhdGguZGlybmFtZShsb2dbJ3JlbGF0aXZlX3BhdGgnXSksIGVudHJpZXMs
IG91dHB1dF9maWxlKQorCisgICAgICAgIG91dHB1dF9maWxlID0gY29kZWNzLm9wZW4ob3MucGF0
aC5qb2luKG91dHB1dF9kaXIsICdyZXZpZXdlcnMuanNvbicpLCAidyIsICJ1dGYtOCIpCisgICAg
ICAgIHRyeToKKyAgICAgICAgICAgIG91dHB1dF9maWxlLndyaXRlKGpzb24uZHVtcHMocmV2aWV3
ZXJzLCBpbmRlbnQ9MikpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvdXRwdXRfZmls
ZS5jbG9zZSgpCisKKyAgICAgICAgb3V0cHV0X2ZpbGUgPSBjb2RlY3Mub3Blbihvcy5wYXRoLmpv
aW4ob3V0cHV0X2RpciwgJ2FyZWFzLmpzb24nKSwgInciLCAidXRmLTgiKQorICAgICAgICB0cnk6
CisgICAgICAgICAgICBvdXRwdXRfZmlsZS53cml0ZShqc29uLmR1bXBzKGFyZWFzLCBpbmRlbnQ9
MikpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvdXRwdXRfZmlsZS5jbG9zZSgpCisK
KyMgRklYTUU6IGFkZCBhbmFseXNpcyBmb3IgYnVpbGQgZml4ZXMgYW5kIHJlYmFzZWxpbmVzCisK
KworCisKClByb3BlcnR5IGNoYW5nZXMgb246IFRvb2xzL1NjcmlwdHMvYW5hbHl6ZS1jaGFuZ2Vs
b2dzCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX18KQWRkZWQ6IHN2bjpleGVjdXRhYmxlCiAgICsgKgoKSW5kZXg6IFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L2NoYW5nZWxvZy5weQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9jaGFuZ2Vsb2cucHkJ
KHJldmlzaW9uIDEwMDAwNikKKysrIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNr
b3V0L2NoYW5nZWxvZy5weQkod29ya2luZyBjb3B5KQpAQCAtNjksNiArNjksMTAgQEAKICAgICAj
IGZpcnN0IGJ1ZyBVUkwgZm91bmQgYW55d2hlcmUgaW4gdGhlIG1lc3NhZ2UuCiAgICAgcmV0dXJu
IHBhcnNlX2J1Z19pZChtZXNzYWdlKQogCitkZWYgX3JlbW92ZU1hdGNoZWRTdWJzdHJpbmdzKHZh
bHVlLCByZWdleHBMaXN0KToKKyAgICBmb3IgcmVnZXhwIGluIHJlZ2V4cExpc3Q6CisgICAgICAg
IHZhbHVlID0gcmUuY29tcGlsZShyZWdleHAsIHJlLk1VTFRJTElORSkuc3ViKCcnLCB2YWx1ZSkK
KyAgICByZXR1cm4gdmFsdWUKIAogY2xhc3MgQ2hhbmdlTG9nRW50cnkob2JqZWN0KToKICAgICAj
IGUuZy4gMjAwOS0wNi0wMyAgRXJpYyBTZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CkBAIC05Niw2
ICsxMDAsMTQgQEAKICAgICAjIGUuZy4gZ2l0LXN2bi1pZDogaHR0cDovL3N2bi53ZWJraXQub3Jn
L3JlcG9zaXRvcnkvd2Via2l0L3RydW5rQDk2MTYxIDI2OGY0NWNjLWNkMDktMDQxMC1hYjNjLWQ1
MjY5MWI0ZGJmYwogICAgIHN2bl9pZF9yZWdleHAgPSByJ2dpdC1zdm4taWQ6IGh0dHA6Ly9zdm4u
d2Via2l0Lm9yZy9yZXBvc2l0b3J5L3dlYmtpdC90cnVua0AoP1A8c3ZuaWQ+XGQrKSAnCiAKKyAg
ICAjIEZJWE1FOiB0aGlzIHNob3VsZCByZWFsbHkgYmUgY29uZmlnX3VybHMuYnVnX3VybF9zaG9y
dCBhbmQgY29uZmlnX3VybHMuYnVnX3VybF9sb25nCisgICAgYnVnX3VybF9yZWdleHAgPSByJ15c
cypodHRwcz86Ly8uK1xkK1xzKiQnCisKKyAgICAjIGUuZy4gKGV3a192aWV3X3dpbmRvd19jbG9z
ZSk6LCAoSlNDOjpTYW1wbGluZ1JlZ2lvbjo6flNhbXBsaW5nUmVnaW9uKTosIChKU0M6OlBhcnNl
ckFyZW5hRGVsZXRhYmxlOjpvcGVyYXRvciBuZXcpOgorICAgIGZ1bmN0aW9uX25hbWVfcmVnZXhw
ID0gcideXG5ccypcKC4qXCk6JworCisgICAgdGVzdHNfbGlzdF9yZWdleHAgPSByJ15ccypUZXN0
cz86XHMqKD9QPHRlc3RzPigufFxuKSspXG5cbicKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBj
b250ZW50cywgY29tbWl0dGVyX2xpc3Q9Q29tbWl0dGVyTGlzdCgpKToKICAgICAgICAgc2VsZi5f
Y29udGVudHMgPSBjb250ZW50cwogICAgICAgICBzZWxmLl9jb21taXR0ZXJfbGlzdCA9IGNvbW1p
dHRlcl9saXN0CkBAIC0xNDAsNyArMTUyLDE0IEBACiAgICAgICAgIHNlbGYuX2F1dGhvciA9IHNl
bGYuX2NvbW1pdHRlcl9saXN0LmNvbnRyaWJ1dG9yX2J5X2VtYWlsKHNlbGYuX2F1dGhvcl9lbWFp
bCkgb3Igc2VsZi5fY29tbWl0dGVyX2xpc3QuY29udHJpYnV0b3JfYnlfbmFtZShzZWxmLl9hdXRo
b3JfbmFtZSkKIAogICAgICAgICBzZWxmLl90b3VjaGVkX2ZpbGVzID0gcmUuZmluZGFsbChzZWxm
LnRvdWNoZWRfZmlsZXNfcmVnZXhwLCBzZWxmLl9jb250ZW50cywgcmUuTVVMVElMSU5FKQorICAg
ICAgICBzZWxmLl9mdW5jdGlvbl9uYW1lID0gcmUuZmluZGFsbChzZWxmLmZ1bmN0aW9uX25hbWVf
cmVnZXhwLCBzZWxmLl9jb250ZW50cywgcmUuTVVMVElMSU5FKQogCisgICAgICAgIG1hdGNoID0g
cmUuc2VhcmNoKHNlbGYudGVzdHNfbGlzdF9yZWdleHAsIHNlbGYuX2NvbnRlbnRzLCByZS5NVUxU
SUxJTkUpCisgICAgICAgIHNlbGYuX3Rlc3RzID0gbWF0Y2guZ3JvdXAoJ3Rlc3RzJykuc3BsaXQo
KSBpZiBtYXRjaCBlbHNlIE5vbmUKKworICAgICAgICBzZWxmLl9kZXNjcmlwdGlvbiA9IF9yZW1v
dmVNYXRjaGVkU3Vic3RyaW5ncyhzZWxmLl9jb250ZW50cywKKyAgICAgICAgICAgIFtzZWxmLmRh
dGVfbGluZV9yZWdleHAsIHNlbGYuYnVnX3VybF9yZWdleHAsIHNlbGYucmV2aWV3ZWRfYnlfcmVn
ZXhwLCBzZWxmLnRlc3RzX2xpc3RfcmVnZXhwLCBzZWxmLnRvdWNoZWRfZmlsZXNfcmVnZXhwLCBz
ZWxmLmZ1bmN0aW9uX25hbWVfcmVnZXhwLCAnXG5cbiddKQorCiAgICAgZGVmIGF1dGhvcl9uYW1l
KHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fYXV0aG9yX25hbWUKIApAQCAtMTU1LDYgKzE3
NCw5IEBACiAgICAgZGVmIHJldmlld2VyX3RleHQoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxm
Ll9yZXZpZXdlcl90ZXh0CiAKKyAgICBkZWYgcmV2aWV3ZXJfdGV4dF9saXN0KHNlbGYpOgorICAg
ICAgICByZXR1cm4gc2VsZi5fcmV2aWV3ZXJfbGlzdAorCiAgICAgZGVmIHJldmlld2VyKHNlbGYp
OgogICAgICAgICByZXR1cm4gc2VsZi5fcmV2aWV3ZXIgICMgTWlnaHQgYmUgTm9uZSwgbWlnaHQg
YWxzbyBub3QgYmUgYSBSZXZpZXdlciEKIApAQCAtMTY3LDcgKzE4OSwxMiBAQAogICAgIGRlZiB0
b3VjaGVkX2ZpbGVzKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fdG91Y2hlZF9maWxlcwog
CisgICAgZGVmIGRlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZGVzY3Jp
cHRpb24KIAorICAgIGRlZiB0ZXN0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Rlc3Rz
CisKICMgRklYTUU6IFZhcmlvdXMgbWV0aG9kcyBvbiBDaGFuZ2VMb2cgc2hvdWxkIG1vdmUgaW50
byBDaGFuZ2VMb2dFbnRyeSBpbnN0ZWFkLgogY2xhc3MgQ2hhbmdlTG9nKG9iamVjdCk6CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>114886</attachid>
            <date>2011-11-13 23:31:13 -0800</date>
            <delta_ts>2011-11-15 22:56:37 -0800</delta_ts>
            <desc>json files generated by the script + summary.html</desc>
            <filename>changelogs.zip</filename>
            <type>application/zip</type>
            <size>0</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64"></data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>115327</attachid>
            <date>2011-11-15 22:55:32 -0800</date>
            <delta_ts>2011-11-20 14:22:38 -0800</delta_ts>
            <desc>work in progress 2</desc>
            <filename>wip72243b</filename>
            <type>text/plain</type>
            <size>18819</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL1NjcmlwdHMvYW5hbHl6ZS1jaGFuZ2Vsb2dzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL1NjcmlwdHMvYW5hbHl6ZS1jaGFuZ2Vsb2dzCShyZXZpc2lvbiAwKQorKysgVG9vbHMvU2Ny
aXB0cy9hbmFseXplLWNoYW5nZWxvZ3MJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzgwIEBACisj
IS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1l
dDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMg
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgY29kZWNzCitp
bXBvcnQganNvbgoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1l
Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5jaGVja291dC5jaGFuZ2Vsb2cgaW1wb3J0IENoYW5nZUxv
ZworCitkZWYgdG9rZW5pemVfZmlsZV9wYXRoKGZpbGVfcGF0aCk6CisgICAgcGF0aF93aXRob3V0
X2V4dGVuc2lvbiA9IGhlYWQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVfcGF0aClbMF0KKyAgICB0
b2tlbnMgPSBbXQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRva2VucyArPSBbaGVhZF0KKyAg
ICAgICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQoaGVhZCkKKyAgICAgICAgaWYgbm90IGxl
bihoZWFkKToKKyAgICAgICAgICAgIGJyZWFrCisgICAgIyBGaWxlIG5hbWUgaXMgc3BlY2lhbCBm
b3IgY2FzZXMgbGlrZSB+fkd0ay5jcHAgb3Igfn5UeXBlLmNwcAorICAgIGlmIGxlbih0b2tlbnMp
OgorICAgICAgICBtID0gcmUubWF0Y2gocicoW0EtWjAtOV0rW2EtejAtOV0qPykrJCcsIG9zLnBh
dGguc3BsaXQocGF0aF93aXRob3V0X2V4dGVuc2lvbilbMV0pCisgICAgICAgIGlmIG06CisgICAg
ICAgICAgICByZXR1cm4gdG9rZW5zLCBtLmdyb3VwKDEpCisgICAgcmV0dXJuIHRva2VucywgTm9u
ZQorCitkZWYgc3BsaXRfcGF0aChwYXRoKToKKyAgICByZXN1bHQgPSBbXQorICAgIHdoaWxlIHBh
dGggYW5kIGxlbihwYXRoKToKKyAgICAgICAgbmV4dF9wYXRoLCB0YWlsID0gb3MucGF0aC5zcGxp
dChwYXRoKQorICAgICAgICBpZiBwYXRoID09IG5leHRfcGF0aDoKKyAgICAgICAgICAgIGJyZWFr
CisgICAgICAgIGlmIHRhaWwgYW5kIGxlbih0YWlsKToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBl
bmQodGFpbCkKKyAgICAgICAgcGF0aCA9IG5leHRfcGF0aAorICAgIHJldHVybiByZXN1bHQKKwor
ZGVmIHNwbGl0X2NhbWVsY2FzZShuYW1lLCB0cmFuc2Zvcm09bGFtYmRhIHg6IHgpOgorICAgIHJl
c3VsdCA9IFtdCisgICAgd2hpbGUgbmFtZSBhbmQgbGVuKG5hbWUpOgorICAgICAgICBtID0gcmUu
bWF0Y2goJ14oW0EtWl1bYS16MC05XSspfChbQS1aMC05XSsoPz0oW0EtWl1bYS16MC05XXxcLnwk
KSkpJywgbmFtZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodHJh
bnNmb3JtKG0uZ3JvdXAoMCkpKQorICAgICAgICAgICAgbmFtZSA9IG5hbWVbbS5lbmQoKTpdCisg
ICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgcmV0dXJuIHJlc3Vs
dAorCitkZWYgdG9rZW5faXNfaW5fZmlsZXBhdGgoc2luZ3VsYXJfdG9rZW4sIGZpbGVfcGF0aCk6
CisgICAgIyBGSVhNRTogZG8gcHJvcGVyIHB1bGFyaXphdGlvbgorICAgIHNwbGl0X2ZpbGVfcGF0
aCA9IHNwbGl0X3BhdGgoZmlsZV9wYXRoKQorICAgIHBsdXJhbF90b2tlbiA9IHNpbmd1bGFyX3Rv
a2VuICsgJ3MnCisgICAgaWYgc2luZ3VsYXJfdG9rZW4gaW4gc3BsaXRfZmlsZV9wYXRoIG9yIHBs
dXJhbF90b2tlbiBpbiBzcGxpdF9maWxlX3BhdGg6CisgICAgICAgIHJldHVybiBUcnVlCisgICAg
Zm9yIG5hbWUgaW4gc3BsaXRfZmlsZV9wYXRoOgorICAgICAgICBzcGxpdF9uYW1lID0gc3BsaXRf
Y2FtZWxjYXNlKG5hbWUsIGxhbWJkYSB4OiB4Lmxvd2VyKCkpCisgICAgICAgICMgTm93IHdlIGpv
aW4gdG9rZW5zIHRvIG1hdGNoLiBKdXN0IGNvbXBhcmluZyBlYWNoIHRva2VuIGlzbid0IHN1ZmZp
Y2llbnQgZm9yIHRoaW5ncyBsaWtlIENNYWtlTGlzdAorICAgICAgICBmb3IgaW5kZXgsIHZhbHVl
IGluIGVudW1lcmF0ZShzcGxpdF9uYW1lKToKKyAgICAgICAgICAgIGZvciBsYXN0X2luZGV4IGlu
IHJhbmdlKDEsIGxlbihzcGxpdF9uYW1lKSArIDEpOgorICAgICAgICAgICAgICAgIHZhbHVlID0g
Jycuam9pbihzcGxpdF9uYW1lW2luZGV4Omxhc3RfaW5kZXhdKQorICAgICAgICAgICAgICAgIGlm
IHNpbmd1bGFyX3Rva2VuID09IHZhbHVlIG9yIHBsdXJhbF90b2tlbiA9PSB2YWx1ZToKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICBpZiBsZW4oc2luZ3Vs
YXJfdG9rZW4pIDw9IGxlbih2YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAg
cmV0dXJuIEZhbHNlCisKK2RlZiBhdmVyYWdlKGxpc3QpOgorICAgIHJldHVybiBzdW0obGlzdCkg
LyBsZW4obGlzdCkKKworZGVmIGRvdF9wcm9kdWN0KHYxLCB2Mik6CisgICAgcmV0dXJuIHN1bSh2
YWx1ZSAqIHYyW2luZGV4XSBmb3IgaW5kZXgsIHZhbHVlIGluIGVudW1lcmF0ZSh2MSkpCisKK1VT
RV9OQU1FID0gMSAjIFRva2VuaXplIHRoZSBjb21wb25lbnQgbmFtZSBpdHNlbGYKK2FyZWFzX29m
X2NvbnRyaWJ1dGlvbnMgPSB7CisgICAgJ0FSTSBKSVQnOiBbJ2FybSddLAorIyAgICAnQWNjZWxl
cmF0ZWQgY29tcG9zaXRpbmcgLyBHUFUgYWNjZWxlcmF0aW9uJzogRklYTUUKKyAgICAnQWNjZXNz
aWJpbGl0eSc6IFtVU0VfTkFNRV0sCisgICAgJ0FuZHJvaWQgcG9ydCc6IFsnYW5kcm9pZCddLAor
ICAgICdBbmltYXRpb24nOiBbVVNFX05BTUUsICdhbmltYXRvciddLAorICAgICdBcHBsZVwncyBX
aW5kb3dzIHBvcnQnOiBbJ3dpbicsICd3aW5kb3dzJ10sICMgRklYTUU6IG5lZWQgdG8gZXhjbHVk
ZSBjaHJvbWl1bS4uLgorICAgICdBdXRvdG9vbHMgQnVpbGQnOiBbJ2F1dG90b29scyddLAorICAg
ICdCYXNpYyB0eXBlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIChXVEYpJzogWyd3dGYnXSwKKyMgICAn
QmlkaXJlY3Rpb25hbCB0ZXh0JzogRklYTUUKKyMgICAgJ0J1aWxkL3Rlc3QgaW5mcmFzdHJ1Y3R1
cmUgKHN0dWZmIHVuZGVyIFRvb2xzL1NjcmlwdHMpJzogRklYTUUKKyAgICAnQ01ha2UgQnVpbGQn
OiBbJ2NtYWtlbGlzdCddLAorICAgICdDU1MgKENhc2NhZGluZyBTdHlsZSBTaGVldHMpJzogWydj
c3MnXSwKKyAgICAnQ1NTIFRyYW5zZm9ybXMnOiBbKCdjc3MnLCAndHJhbnNmb3JtcycpXSwKKyAg
ICAnQ1NTL1NWRyBGaWx0ZXJzJzogWygnY3NzJywgJ2ZpbHRlcnMnKSwgKCdzdmcnLCAnZmlsdGVy
cycpXSwKKyAgICAnQ1VSTCBIVFRQIEJhY2tlbmQnOiBbJ0NVUkwnXSwKKyAgICAnUmVzb3VyY2Ug
Q2FjaGUnOiBbKCdsb2FkZXInLCAnY2FjaGUnKV0sCisgICAgJ01lbW9yeSBDYWNoZSc6IFsoJ2dy
YXBoaWNzJywgJ2NhY2hlJyldLAorICAgICdDYWlybyc6IFtVU0VfTkFNRV0sCisgICAgJ0NhbnZh
cyc6IFtVU0VfTkFNRV0sCisgICAgJ0Nocm9taXVtIExpbnV4JzogWygnY2hyb21pdW0nLCAnbGlu
dXgnKV0sCisjICAgICdDb21taXQgUXVldWUnOiBGSVhNRQorICAgICdDb3JlIERPTSc6IFsnZG9t
J10sCisgICAgJ0NvcmUgR3JhcGhpY3MnOiBbJ2NnJ10sCisgICAgJ0JpbmRpbmdzJzogW1VTRV9O
QU1FXSwKKyAgICAnRE9NIFN0b3JhZ2UnOiBbJ3N0b3JhZ2UnXSwKKyAgICAnRHJhZyBhbmQgRHJv
cCc6IFsnZHJhZyddLAorICAgICdEdW1wUmVuZGVyVHJlZSc6IFtVU0VfTkFNRV0sCisgICAgJ0VG
TCc6IFsnZWZsJ10sCisgICAgJ0VkaXRpbmcgLyBTZWxlY3Rpb24nOiBbJ2VkaXRpbmcnXSwKKyAg
ICAnRXZlbnQgSGFuZGxpbmcnOiBbJ2V2ZW50J10sCisgICAgJ0Zhc3RNYWxsb2MnOiBbVVNFX05B
TUVdLAorICAgICdGaWxlIEFQSSc6IFsnZmlsZWFwaSddLAorICAgICdGb250cyc6IFtVU0VfTkFN
RV0sCisgICAgJ0Zvcm1zJzogW1VTRV9OQU1FXSwKKyMgICAgJ0ZyYW1lIEZsYXR0ZW5pbmcnOiBG
SVhNRQorICAgICdGcmFtZSBMb2FkZXInOiBbVVNFX05BTUVdLAorIyAgICAnR2VuZXJhbCc6IEZJ
WE1FIE1heWJlIGF1dG8tZGV0ZWN0IHBlb3BsZSBjb250cmlidXRpbmcgdG8gYWxsIHN1YmRpcmVj
dG9yaWVzPworICAgICdHZW9sb2NhdGlvbiBBUEknOiBbJ2dlb2xvY2F0aW9uJ10sCisgICAgJ0dy
YXBoaWNzJzogWydncmFwaGljcyddLAorICAgICdIVE1MJzogWydodG1sJ10sCisgICAgJ0hUTUwg
UGFyc2VyJzogWygnaHRtbCcsICdwYXJzZXInKV0sICMgRklYTUU6IG1hdGNoZXMgaHRtbC90cmFj
ay9XZWJWVFRQYXJzZXIuY3BwCisgICAgJ0hUTUw1IE1lZGlhIFN1cHBvcnQnOiBbJ21lZGlhJ10s
CisgICAgJ0hpc3RvcnknOiBbJ2hpc3RvcnknXSwKKyMgICAgJ0hpdCB0ZXN0aW5nJzogRklYTUUK
KyAgICAnSW1hZ2UgRGVjb2Rlcic6IFsnaW1hZ2VkZWNvZGVyJ10sCisjICAgICdJbnB1dCBtZXRo
b2RzJzogRklYTUUKKyAgICAnSlNDIEJpbmRpbmdzJzogWygnYmluZGluZ3MnLCAnanMnKV0sCisg
ICAgJ0phdmFTY3JpcHRDb3JlJzogW1VTRV9OQU1FXSwKKyAgICAnSmF2YVNjcmlwdENvcmUgUmVn
dWxhciBFeHByZXNzaW9ucyc6IFsoJ0phdmFTY3JpcHRDb3JlJywgJ3JlZ2V4cCcpXSwKKyMgICAg
J0xheW91dCB0ZXN0cyc6IEZJWE1FIGJ1dCB3aGF0IGRvZXMgaXQgbWVhbiB0byBzYXkgeW91J3Jl
IGFuIGV4cGVydCBvbiBsYXlvdXQgdGVzdHM/IE1heWJlIHdvcmtlZCBvbiB0b29scz8KKyAgICAn
TG9hZGVyJzogWydsb2FkZXInXSwKKyAgICAnTWF0aE1MJzogW1VTRV9OQU1FXSwKKyAgICAnTWVt
b3J5IFVzZSAvIExlYWtzJzogWydsZWFrcyddLCAjIFByb2JhYmx5IG5lZWQgbW9yZSB0b2tlbnMK
KyAgICAnTWVzc2FnZVBvcnRzJzogW1VTRV9OQU1FXSwKKyAgICAnTmV0d29yayc6IFsoJ3BsYXRm
b3JtJywgJ25ldHdvcmsnKV0sCisgICAgJ25ldy1ydW4td2Via2l0LXRlc3RzJzogWydsYXlvdXRf
dGVzdHMnXSwKKyAgICAnT3BlblZHIGdyYXBoaWNzIGJhY2tlbmQnOiBbJ29wZW52ZyddLAorIyAg
ICAnUGVyZm9ybWFuY2UnOiBGSVhNRQorICAgICdQbHVnLWlucyc6IFsncGx1Z2lucyddLAorICAg
ICdQcmludGluZyc6IFsncHJpbnRpbmcnLCAncHJpbnQnXSwKKyAgICAnUmVuZGVyaW5nJzogW1VT
RV9OQU1FXSwKKyAgICAnU1ZHIChTY2FsYWJsZSBWZWN0b3IgR3JhcGhpY3MpJzogWydzdmcnXSwK
KyAgICAnU2Nyb2xsYmFycyc6IFsnc2Nyb2xsJ10sCisgICAgJ1NlY3VyaXR5JzogW1VTRV9OQU1F
XSwgIyBQcm9iYWJseSBuZWVkIG1vcmUgdG9rZW5zCisjICAgICdTaGFkb3cgRE9NJzogRklYTUUK
KyAgICAnU2tpYSc6IFtVU0VfTkFNRV0sCisgICAgJ1NvdXAgTmV0d29yayBCYWNrZW5kJzogWydz
b3VwJ10sCisjICAgICdTcGVsbCBDaGVja2luZyc6IEZJWE1FIGp1c3QgbmVlZCB0b2tlbnMKKyAg
ICAnVGFibGVzJzogWydodG1sdGFibGUnLCAncmVuZGVydGFibGUnXSwKKyMgICAgJ1RleHQgRW5j
b2RpbmcnOiBGSVhNRQorIyAgICAnVGV4dCBMYXlvdXQnOiBGSVhNRQorICAgICdUaGUgQ2hyb21p
dW0gUG9ydCc6IFsnY2hyb21pdW0nXSwKKyAgICAnVGhlIEVGTFdlYktpdCBQb3J0JzogWydlZmwn
XSwKKyAgICAnVGhlIFdlYktpdEdUSysgUG9ydCc6IFsnZ3RrJ10sCisgICAgJ1RoZSBIYWlrdSBQ
b3J0JzogWydoYWlrdSddLAorICAgICdUaGUgUXRXZWJLaXQgUG9ydCc6IFsncXQnXSwKKyAgICAn
VGhlIFdpbkNFIFBvcnQnOiBbJ3dpbmNlJ10sCisgICAgJ1RoZSBXaW5DYWlybyBQb3J0JzogWydj
YWlybyddLAorICAgICdUaGUgd3hXZWJLaXQgUG9ydCc6IFsnd3gnXSwKKyAgICAnVGhyZWFkaW5n
JzogWyd0aHJlYWQnXSwKKyAgICAnVG9vbHMnOiBbVVNFX05BTUVdLAorICAgICdUb3VjaCBTdXBw
b3J0JzogWyd0b3VjaCddLAorICAgICdUcmFuc2Zvcm1zJzogWyd0cmFuc2Zvcm1zJ10sICMgVGhl
cmUncyBhbHNvIENTUyB0cmFuc2Zvcm1zCisgICAgJ1RyYW5zaXRpb25zJzogWyd0cmFuc2l0aW9u
cyddLCAjIFRoaXMgb25seSBtYXRjaGVzIHRyYW5zaXRpb24gZXZlbnRzIGF0IHRoZSBtb21lbnQK
KyAgICAnVVJMIFBhcnNpbmcnOiBbJ0tVUkwnXSwgIyBQcm9iYWJseSBuZWVkIG1vcmUgdG9rZW5z
CisgICAgJ1Y4JzogWyd2OCddLAorICAgICdWOCBCaW5kaW5ncyc6IFsoJ2JpbmRpbmdzJywgJ3Y4
JyldLAorICAgICdXZWIgSW5zcGVjdG9yIC8gRGV2ZWxvcGVyIFRvb2xzJzogWydpbnNwZWN0b3In
XSwKKyAgICAnV2ViIFRpbWluZyc6IFsnUGVyZm9ybWFuY2VOYXZpZ2F0aW9uJywgJ1BlcmZvcm1h
bmNlVGltaW5nJ10sICMgbW9yZSB0b2tlbnM/CisgICAgJ1dlYkFyY2hpdmUnOiBbVVNFX05BTUVd
LAorICAgICdXZWJDb3JlIEljb24gRGF0YWJhc2UnOiBbJ2ljb24nXSwKKyAgICAnV2ViR0wnOiBb
J3dlYmdsJ10sCisgICAgJ1dlYktpdCBXZWJzaXRlcyc6IFsnd2Vic2l0ZXMnXSwKKyAgICAnV2Vi
S2l0Mic6IFtVU0VfTkFNRV0sCisgICAgJ1dlYlNRTCBEYXRhYmFzZXMnOiBbKCdzdG9yYWdlJywg
J2RhdGFiYXNlJyldLAorICAgICdXZWJTb2NrZXRzJzogW1VTRV9OQU1FXSwKKyAgICAnV29ya2Vy
cyc6IFtVU0VfTkFNRV0sCisgICAgJ1hNTCc6IFtVU0VfTkFNRV0sCisgICAgJ1hNTEh0dHBSZXF1
ZXN0JzogW1VTRV9OQU1FXSwKKyAgICAnWFNMVCc6IFtVU0VfTkFNRV0sCisgICAgJ1hTU0F1ZGl0
b3InOiBbVVNFX05BTUVdLAorICAgICdXZWJLaXQgQVBJIFRlc3RzJzogWydUZXN0V2ViS2l0QVBJ
J10sCisgICAgJ3dlYmtpdC1wYXRjaCc6IFsoJ3dlYmtpdHB5JywgJ2NvbW1hbmRzJyldLAorfQor
CitkZWYgdG9rZW5pemUod29yZCk6CisgICAgdG9rZW4gPSB3b3JkLmxvd2VyKCkKKyAgICByZXR1
cm4gdG9rZW5bOi0xXSBpZiB0b2tlblstMV0gPT0gJ3MnIGVsc2UgdG9rZW4KKworZGVmIGFyZWFz
X29mX2NvbnRyaWJ1dGlvbnNfZm9yX2VudHJ5KGVudHJ5KToKKyAgICBhcmVhcyA9IHNldCgpCisg
ICAgZm9yIGZpbGVfcGF0aCBpbiBlbnRyeS50b3VjaGVkX2ZpbGVzKCk6CisgICAgICAgIGZvciBh
cmVhLCB0b2tlbnMgaW4gYXJlYXNfb2ZfY29udHJpYnV0aW9ucy5pdGVtcygpOgorICAgICAgICAg
ICAgZm9yIHRva2VuIGluIHRva2VuczoKKyAgICAgICAgICAgICAgICBpZiB0b2tlbiA9PSBVU0Vf
TkFNRToKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbml6ZShhcmVhKQorICAgICAg
ICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rZW4sIHR1cGxlKToKKyAgICAgICAgICAgICAgICAg
ICAgY29udGludWUgIyBGSVhNRTogU3VwcG9ydCBzZXQgPSBBTkQgY2xhdXNlcworICAgICAgICAg
ICAgICAgIGlmIHRva2VuX2lzX2luX2ZpbGVwYXRoKHRva2VuLCBmaWxlX3BhdGgpOgorICAgICAg
ICAgICAgICAgICAgICBhcmVhcy5hZGQoYXJlYSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsK
KyAgICByZXR1cm4gYXJlYXMKKworY2xhc3MgQ2hhbmdlTG9nRW51bWVyYXRvcihvYmplY3QpOgor
ICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydF9wYXRoKToKKyAgICAgICAgc2VsZi5fc3RhcnRf
cGF0aCA9IHN0YXJ0X3BhdGgKKyAgICAgICAgc2VsZi5fY2hhbmdlbG9nX2RpcnMgPSB7fQorICAg
ICAgICByZWxhdGl2ZV9wYXRoID0gc2VsZi5fc3BsaXRfcGF0aF9yZWxhdGl2ZV90b19zb3VyY2Uo
c2VsZi5fc3RhcnRfcGF0aCkKKyAgICAgICAgaWYgcmVsYXRpdmVfcGF0aCAhPSBOb25lOgorICAg
ICAgICAgICAgc2VsZi5fZW51bWVyYXRlKHNlbGYuX3N0YXJ0X3BhdGgsIHJlbGF0aXZlX3BhdGgp
CisKKyAgICBkZWYgZGlycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoYW5nZWxvZ19k
aXJzLmtleXMoKQorCisgICAgZGVmIGNoYW5nZWxvZ3Moc2VsZiwgbGltaXQ9Tm9uZSk6CisgICAg
ICAgIHJldHVybiBzdW0oW3NlbGYuX3NvcnRfY2hhbmdlbG9nc19pbl9yZXZlcnNlX2Nocm9ub2xv
Z2ljYWxfb3JkZXIoZmlsZXMsIHJldmVyc2U9VHJ1ZSlbOmxpbWl0XSBmb3IgZGlybmFtZSwgZmls
ZXMgaW4gc2VsZi5fY2hhbmdlbG9nX2RpcnMuaXRlbXMoKV0sIFtdKQorCisgICAgZGVmIF9zcGxp
dF9wYXRoX3JlbGF0aXZlX3RvX3NvdXJjZShzZWxmLCBwYXRoKToKKyAgICAgICAgaGVhZCwgdGFp
bCA9IHBhdGgsICcnCisgICAgICAgIHJlbGF0aXZlX3BhdGggPSAnJworICAgICAgICB3aGlsZSB0
YWlsICE9ICdTb3VyY2UnOgorICAgICAgICAgICAgbmV4dF9oZWFkLCB0YWlsID0gb3MucGF0aC5z
cGxpdChoZWFkKQorICAgICAgICAgICAgaWYgbmV4dF9oZWFkID09IGhlYWQ6CisgICAgICAgICAg
ICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGlmIHRhaWwgIT0gJ1NvdXJjZScgYW5kIGhl
YWQgIT0gcGF0aDoKKyAgICAgICAgICAgICAgICByZWxhdGl2ZV9wYXRoID0gb3MucGF0aC5qb2lu
KHRhaWwsIHJlbGF0aXZlX3BhdGgpCisgICAgICAgICAgICBoZWFkID0gbmV4dF9oZWFkCisgICAg
ICAgIHJldHVybiByZWxhdGl2ZV9wYXRoCisKKyAgICBkZWYgX2FkZF9wYXRoX2lmX2NoYW5nZWxv
ZyhzZWxmLCBwYXRoLCByZWxhdGl2ZV9wYXRoLCBmaWxlbmFtZSk6CisgICAgICAgIG0gPSByZS5t
YXRjaCgnQ2hhbmdlTG9nKC0oXGR7NH0tXGR7Mn0tXGR7Mn0pKT8nLCBmaWxlbmFtZSkKKyAgICAg
ICAgaWYgbSBhbmQgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICBpZiByZWxhdGl2
ZV9wYXRoIG5vdCBpbiBzZWxmLl9jaGFuZ2Vsb2dfZGlyczoKKyAgICAgICAgICAgICAgICBzZWxm
Ll9jaGFuZ2Vsb2dfZGlyc1tyZWxhdGl2ZV9wYXRoXSA9IFtdCisgICAgICAgICAgICBzZWxmLl9j
aGFuZ2Vsb2dfZGlyc1tyZWxhdGl2ZV9wYXRoXS5hcHBlbmQoeydwYXRoJzogcGF0aCwgJ3JlbGF0
aXZlX3BhdGgnOiBvcy5wYXRoLmpvaW4ocmVsYXRpdmVfcGF0aCwgZmlsZW5hbWUpLCAnZmlsZW5h
bWUnOiBmaWxlbmFtZX0pCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4g
RmFsc2UKKworICAgIGRlZiBfZW51bWVyYXRlKHNlbGYsIHBhdGgsIHJlbGF0aXZlX3BhdGgpOgor
ICAgICAgICBoZWFkLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyAgICAgICAgaWYg
ZmlsZW5hbWUgYW5kIHNlbGYuX2FkZF9wYXRoX2lmX2NoYW5nZWxvZyhwYXRoLCByZWxhdGl2ZV9w
YXRoLCBmaWxlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBpZiBub3Qgb3Mu
cGF0aC5pc2RpcihwYXRoKSBvciAoZmlsZW5hbWUgYW5kIGZpbGVuYW1lWzBdID09ICcuJyk6Cisg
ICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gc3VtKFtzZWxmLl9lbnVtZXJhdGUo
b3MucGF0aC5qb2luKHBhdGgsIGNoaWxkKSwgb3MucGF0aC5qb2luKHJlbGF0aXZlX3BhdGgsIGZp
bGVuYW1lKSkgZm9yIGNoaWxkIGluIG9zLmxpc3RkaXIocGF0aCldKQorCisgICAgZGVmIF9zb3J0
X2NoYW5nZWxvZ3NfaW5fcmV2ZXJzZV9jaHJvbm9sb2dpY2FsX29yZGVyKHNlbGYsIGZpbGVzLCBy
ZXZlcnNlPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIHNvcnRlZChmaWxlcywga2V5PWxhbWJkYSBp
dGVtOiBpdGVtWydmaWxlbmFtZSddICsgJ1gnLCByZXZlcnNlPXJldmVyc2UpCisKKworZGVmIHVw
ZGF0ZV9hcmVhc19mb3JfY29udHJpYnV0b3IoYXJlYSwgY29udHJpYnV0b3IsIGNvbnRyaWJ1dGlv
bl90eXBlKToKKyAgICBpZiBjb250cmlidXRvciBub3QgaW4gYXJlYXNbYXJlYV1bJ2NvbnRyaWJ1
dG9ycyddOgorICAgICAgICBhcmVhc1thcmVhXVsnY29udHJpYnV0b3JzJ11bY29udHJpYnV0b3Jd
ID0geydyZXZpZXdzJzogMCwgJ3BhdGNoZXMnOiAwLCAndW5yZXZpZXdlZCc6IDB9CisgICAgYXJl
YXNbYXJlYV1bJ2NvbnRyaWJ1dG9ycyddW2NvbnRyaWJ1dG9yXVtjb250cmlidXRpb25fdHlwZV0g
Kz0gMQorCitkZWYgY29sbGVjdF9zdGF0aXN0aWNzX2Zvcl9jb250cmlidXRvcihkYXRhLCBjb250
cmlidXRpb25fdHlwZSwgY29udHJpYnV0b3IsIGFyZWFzX29mX2NvbnRyaWJ1dGlvbnMsIGNoYW5n
ZWxvZ19kaXIsIGZpbGVuYW1lcyk6CisgICAgZGF0YVsndG90YWwnXSArPSAxCisKKyAgICBjb250
cmlidXRvcl9hcmVhcyA9IGRhdGFbJ2FyZWFzJ10KKyAgICBmb3IgYXJlYSBpbiBhcmVhc19vZl9j
b250cmlidXRpb25zOgorICAgICAgICBjb250cmlidXRvcl9hcmVhc1thcmVhXSA9IGNvbnRyaWJ1
dG9yX2FyZWFzLmdldChhcmVhLCAwKSArIDEKKyAgICAgICAgdXBkYXRlX2FyZWFzX2Zvcl9jb250
cmlidXRvcihhcmVhLCBjb250cmlidXRvciwgY29udHJpYnV0aW9uX3R5cGUpCisKKyAgICBjb250
cmlidXRvcl9maWxlcyA9IGRhdGFbJ2ZpbGVzJ10KKyAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6
CisgICAgICAgIHJlbGF0aXZlX3BhdGggPSBvcy5wYXRoLmpvaW4oY2hhbmdlbG9nX2RpciwgbmFt
ZSkKKyAgICAgICAgY29udHJpYnV0b3JfZmlsZXNbcmVsYXRpdmVfcGF0aF0gPSBjb250cmlidXRv
cl9maWxlcy5nZXQocmVsYXRpdmVfcGF0aCwgMCkgKyAxCisKK2RlZiBhbmFseXplX2VudHJpZXMo
Y2hhbmdlbG9nX2RpciwgZW50cmllcywgb3V0cHV0X2ZpbGUpOgorICAgIGwgPSAwCisgICAgbWF0
Y2hlZF9maWxlX3BhdGhzID0ge30KKworICAgIGkgPSAwCisgICAgcHJldmlvdXNMaW5lID0gJycK
KyAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgbnVtYmVyT2ZDaHJhY3RlcnNUb0Vy
YXNlID0gbGVuKHByZXZpb3VzTGluZSkgKyAxCisgICAgICAgIHByZXZpb3VzTGluZSA9ICIgICAg
JWQgZW50cmllcyIgJSBpCisgICAgICAgIHByaW50ICJcYiIgKiBudW1iZXJPZkNocmFjdGVyc1Rv
RXJhc2UgKyBwcmV2aW91c0xpbmUsCisgICAgICAgIGkgKz0gMQorICAgICAgICBpZiBub3QgZW50
cnkuYXV0aG9yX25hbWUoKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGFyZWFzX29m
X2NvbnRyaWJ1dGlvbnMgPSBhcmVhc19vZl9jb250cmlidXRpb25zX2Zvcl9lbnRyeShlbnRyeSkK
KworICAgICAgICBhdXRob3IgPSBlbnRyeS5hdXRob3JfbmFtZSgpCisgICAgICAgIGlmIGF1dGhv
ciBub3QgaW4gY29udHJpYnV0b3JzOgorICAgICAgICAgICAgY29udHJpYnV0b3JzW2F1dGhvcl0g
PSB7J3Jldmlld3MnOiB7J3RvdGFsJzogMCwgJ2FyZWFzJzoge30sICdmaWxlcyc6IHt9fSwgJ3Bh
dGNoZXMnOiB7J3RvdGFsJzogMCwgJ3VucmV2aWV3ZWQnOiAwLCAnYXJlYXMnOiB7fSwgJ2ZpbGVz
Jzoge319fQorCisgICAgICAgIGlmIGVudHJ5LnJldmlld2VyX3RleHQoKToKKyAgICAgICAgICAg
ICMgRklYTUU6IFRha2UgY2FyZSBvZiBtdWx0aXBsZSBhdXRob3JzCisgICAgICAgICAgICBjb2xs
ZWN0X3N0YXRpc3RpY3NfZm9yX2NvbnRyaWJ1dG9yKGNvbnRyaWJ1dG9yc1thdXRob3JdWydwYXRj
aGVzJ10sICdwYXRjaGVzJywgYXV0aG9yLCBhcmVhc19vZl9jb250cmlidXRpb25zLCBjaGFuZ2Vs
b2dfZGlyLCBlbnRyeS50b3VjaGVkX2ZpbGVzKCkpCisKKyAgICAgICAgICAgIGZvciByZXZpZXdl
ciBpbiBlbnRyeS5yZXZpZXdlcl90ZXh0X2xpc3QoKToKKyAgICAgICAgICAgICAgICBpZiByZXZp
ZXdlciBub3QgaW4gY29udHJpYnV0b3JzOgorICAgICAgICAgICAgICAgICAgICBjb250cmlidXRv
cnNbcmV2aWV3ZXJdID0geydyZXZpZXdzJzogeyd0b3RhbCc6IDAsICdhcmVhcyc6IHt9LCAnZmls
ZXMnOiB7fX0sICdwYXRjaGVzJzogeyd0b3RhbCc6IDAsICd1bnJldmlld2VkJzogMCwgJ2FyZWFz
Jzoge30sICdmaWxlcyc6IHt9fX0KKyAgICAgICAgICAgICAgICBjb2xsZWN0X3N0YXRpc3RpY3Nf
Zm9yX2NvbnRyaWJ1dG9yKGNvbnRyaWJ1dG9yc1tyZXZpZXdlcl1bJ3Jldmlld3MnXSwgJ3Jldmll
d3MnLCByZXZpZXdlciwgYXJlYXNfb2ZfY29udHJpYnV0aW9ucywgY2hhbmdlbG9nX2RpciwgZW50
cnkudG91Y2hlZF9maWxlcygpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29udHJpYnV0
b3JzW2F1dGhvcl1bJ3BhdGNoZXMnXVsndW5yZXZpZXdlZCddICs9IDEKKyAgICAgICAgICAgIGZv
ciBhcmVhIGluIGFyZWFzX29mX2NvbnRyaWJ1dGlvbnM6CisgICAgICAgICAgICAgICAgdXBkYXRl
X2FyZWFzX2Zvcl9jb250cmlidXRvcihhcmVhLCBhdXRob3IsICd1bnJldmlld2VkJykKKworICAg
ICAgICBmb3IgYXJlYSBpbiBhcmVhc19vZl9jb250cmlidXRpb25zOgorICAgICAgICAgICAgYXJl
YXNbYXJlYV1bJ3RvdGFsJyBpZiBlbnRyeS5yZXZpZXdlcl90ZXh0KCkgZWxzZSAndW5yZXZpZXdl
ZCddICs9IDEKKworICAgICAgICBjb250ZW50cyA9IGVudHJ5Ll9jb250ZW50cworICAgICAgICBp
ZiBhcmVhcyBhbmQgbGVuKGFyZWFzKToKKyAgICAgICAgICAgIGNvbnRlbnRzICs9ICdcbiVze3sl
c319XG4nICUgKCcgJyAqIDgsICcsICcuam9pbihhcmVhcykpCisgICAgICAgIHByaW50ID4+IG91
dHB1dF9maWxlLCBjb250ZW50cworICAgIHByaW50CisKK2lmIF9fbmFtZV9fID09ICdfX21haW5f
Xyc6CisgICAgaWYgbGVuKHN5cy5hcmd2KSA8PSAyOgorICAgICAgICBwcmludCAiIiJVc2FnZToK
KyAgICBhbmFseXplX2NoYW5nZWxvZ3MgPHBhdGggdG8gYSBkaXJlY3Rvcnkgd2l0aCBjaGFuZ2Vs
b2dzPiA8b3V0cHV0IGRpcmVjdG9yeT4KKyIiIgorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGVs
c2U6CisgICAgICAgIG91dHB1dF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoc3lzLmFyZ3ZbMl0pCisg
ICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKG91dHB1dF9kaXIpOgorICAgICAgICAgICAgcHJp
bnQgIlRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGRpcmVjdG9yeSIKKyAgICAgICAgICAg
IHN5cy5leGl0KDIpCisKKyAgICAgICAgc3RhcnRUaW1lID0gdGltZS50aW1lKCkKKworICAgICAg
ICBwcmludCAnRW51bWVyYXRpbmcgQ2hhbmdlTG9nIGZpbGVzLi4uJworICAgICAgICBlbnVtZXJh
dG9yID0gQ2hhbmdlTG9nRW51bWVyYXRvcihvcy5wYXRoLmFic3BhdGgoc3lzLmFyZ3ZbMV0pKQor
CisgICAgICAgIGNvbnRyaWJ1dG9ycyA9IHt9CisgICAgICAgIGFyZWFzID0ge30KKyAgICAgICAg
Zm9yIGFyZWEgaW4gYXJlYXNfb2ZfY29udHJpYnV0aW9uczoKKyAgICAgICAgICAgIGFyZWFzW2Fy
ZWFdID0geyd0b3RhbCc6IDAsICd1bnJldmlld2VkJzogMCwgJ2NvbnRyaWJ1dG9ycyc6IHt9fQor
CisgICAgICAgIGZvciBsb2cgaW4gZW51bWVyYXRvci5jaGFuZ2Vsb2dzKGxpbWl0PTMpOgorICAg
ICAgICAgICAgcHJpbnQgJyAgICBQcm9jZXNzaW5nICVzJyAlIGxvZ1sncmVsYXRpdmVfcGF0aCdd
CisgICAgICAgICAgICBjaGFuZ2Vsb2dfZmlsZSA9IGNvZGVjcy5vcGVuKGxvZ1sncGF0aCddLCAi
ciIsICJ1dGYtOCIpCisgICAgICAgICAgICBlbnRyaWVzID0gQ2hhbmdlTG9nLnBhcnNlX2VudHJp
ZXNfZnJvbV9maWxlKGNoYW5nZWxvZ19maWxlKQorICAgICAgICAgICAgb3V0b3V0X2ZpbGVfcGF0
aCA9IGxvZ1sncmVsYXRpdmVfcGF0aCddLnJlcGxhY2UoJy8nLCAnXycpLnJlcGxhY2UoJ1xcJywg
J18nKQorICAgICAgICAgICAgb3V0cHV0X2ZpbGUgPSBjb2RlY3Mub3Blbihvcy5wYXRoLmpvaW4o
b3V0cHV0X2Rpciwgb3V0b3V0X2ZpbGVfcGF0aCksICJ3IiwgInV0Zi04IikKKyAgICAgICAgICAg
IGFuYWx5emVfZW50cmllcyhvcy5wYXRoLmRpcm5hbWUobG9nWydyZWxhdGl2ZV9wYXRoJ10pLCBl
bnRyaWVzLCBvdXRwdXRfZmlsZSkKKworICAgICAgICBwcmludCAnR2VuZXJhdGluZyBqc29uIGZp
bGVzLi4uJworICAgICAgICBqc29uX2ZpbGVzID0geworICAgICAgICAgICAgJ2NvbnRyaWJ1dG9y
cy5qc29uJzogY29udHJpYnV0b3JzLAorICAgICAgICAgICAgJ2FyZWFzLmpzb24nOiBhcmVhcywK
KyAgICAgICAgfQorICAgICAgICBmb3IgZmlsZV9uYW1lIGluIGpzb25fZmlsZXM6CisgICAgICAg
ICAgICBvdXRwdXRfZmlsZSA9IGNvZGVjcy5vcGVuKG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCBm
aWxlX25hbWUpLCAidyIsICJ1dGYtOCIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAg
ICAgcHJpbnQgJyAgICBHZW5lcmF0aW5nJywgZmlsZV9uYW1lCisgICAgICAgICAgICAgICAgb3V0
cHV0X2ZpbGUud3JpdGUoanNvbi5kdW1wcyhqc29uX2ZpbGVzW2ZpbGVfbmFtZV0sIGluZGVudD0y
KSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGUuY2xv
c2UoKQorCisgICAgICAgIHRpY2sgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0VGltZQorICAgICAgICBw
cmludCAnRmluaXNoZWQgaW4gJTAyZG06JTAyZHMnICUgKGludCh0aWNrIC8gNjApLCBpbnQodGlj
ayAlIDYwKSkKKworIyBGSVhNRTogYWRkIGFuYWx5c2lzIGZvciBidWlsZCBmaXhlcyBhbmQgcmVi
YXNlbGluZXMKKworCisKKwoKUHJvcGVydHkgY2hhbmdlcyBvbjogVG9vbHMvU2NyaXB0cy9hbmFs
eXplLWNoYW5nZWxvZ3MKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmV4ZWN1dGFibGUKICAgKyAqCgpJ
bmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvY2hhbmdlbG9nLnB5
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L2No
YW5nZWxvZy5weQkocmV2aXNpb24gMTAwMjM3KQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vY2hlY2tvdXQvY2hhbmdlbG9nLnB5CSh3b3JraW5nIGNvcHkpCkBAIC02OSw2ICs2OSwx
MCBAQAogICAgICMgZmlyc3QgYnVnIFVSTCBmb3VuZCBhbnl3aGVyZSBpbiB0aGUgbWVzc2FnZS4K
ICAgICByZXR1cm4gcGFyc2VfYnVnX2lkKG1lc3NhZ2UpCiAKK2RlZiBfcmVtb3ZlTWF0Y2hlZFN1
YnN0cmluZ3ModmFsdWUsIHJlZ2V4cExpc3QpOgorICAgIGZvciByZWdleHAgaW4gcmVnZXhwTGlz
dDoKKyAgICAgICAgdmFsdWUgPSByZS5jb21waWxlKHJlZ2V4cCwgcmUuTVVMVElMSU5FKS5zdWIo
JycsIHZhbHVlKQorICAgIHJldHVybiB2YWx1ZQogCiBjbGFzcyBDaGFuZ2VMb2dFbnRyeShvYmpl
Y3QpOgogICAgICMgZS5nLiAyMDA5LTA2LTAzICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9y
Zz4KQEAgLTExMSw2ICsxMTUsMTQgQEAKICAgICAjIGUuZy4gZ2l0LXN2bi1pZDogaHR0cDovL3N2
bi53ZWJraXQub3JnL3JlcG9zaXRvcnkvd2Via2l0L3RydW5rQDk2MTYxIDI2OGY0NWNjLWNkMDkt
MDQxMC1hYjNjLWQ1MjY5MWI0ZGJmYwogICAgIHN2bl9pZF9yZWdleHAgPSByJ2dpdC1zdm4taWQ6
IGh0dHA6Ly9zdm4ud2Via2l0Lm9yZy9yZXBvc2l0b3J5L3dlYmtpdC90cnVua0AoP1A8c3ZuaWQ+
XGQrKSAnCiAKKyAgICAjIEZJWE1FOiB0aGlzIHNob3VsZCByZWFsbHkgYmUgY29uZmlnX3VybHMu
YnVnX3VybF9zaG9ydCBhbmQgY29uZmlnX3VybHMuYnVnX3VybF9sb25nCisgICAgYnVnX3VybF9y
ZWdleHAgPSByJ15ccypodHRwcz86Ly8uK1xkK1xzKiQnCisKKyAgICAjIGUuZy4gKGV3a192aWV3
X3dpbmRvd19jbG9zZSk6LCAoSlNDOjpTYW1wbGluZ1JlZ2lvbjo6flNhbXBsaW5nUmVnaW9uKTos
IChKU0M6OlBhcnNlckFyZW5hRGVsZXRhYmxlOjpvcGVyYXRvciBuZXcpOgorICAgIGZ1bmN0aW9u
X25hbWVfcmVnZXhwID0gcideXG5ccypcKC4qXCk6JworCisgICAgdGVzdHNfbGlzdF9yZWdleHAg
PSByJ15ccypUZXN0cz86XHMqKD9QPHRlc3RzPigufFxuKSspXG5cbicKKwogICAgIGRlZiBfX2lu
aXRfXyhzZWxmLCBjb250ZW50cywgY29tbWl0dGVyX2xpc3Q9Q29tbWl0dGVyTGlzdCgpKToKICAg
ICAgICAgc2VsZi5fY29udGVudHMgPSBjb250ZW50cwogICAgICAgICBzZWxmLl9jb21taXR0ZXJf
bGlzdCA9IGNvbW1pdHRlcl9saXN0CkBAIC0xNjAsNyArMTcyLDE0IEBACiAgICAgICAgIHNlbGYu
X2F1dGhvciA9IHNlbGYuX2NvbW1pdHRlcl9saXN0LmNvbnRyaWJ1dG9yX2J5X2VtYWlsKHNlbGYu
X2F1dGhvcl9lbWFpbCkgb3Igc2VsZi5fY29tbWl0dGVyX2xpc3QuY29udHJpYnV0b3JfYnlfbmFt
ZShzZWxmLl9hdXRob3JfbmFtZSkKIAogICAgICAgICBzZWxmLl90b3VjaGVkX2ZpbGVzID0gcmUu
ZmluZGFsbChzZWxmLnRvdWNoZWRfZmlsZXNfcmVnZXhwLCBzZWxmLl9jb250ZW50cywgcmUuTVVM
VElMSU5FKQorICAgICAgICBzZWxmLl9mdW5jdGlvbl9uYW1lID0gcmUuZmluZGFsbChzZWxmLmZ1
bmN0aW9uX25hbWVfcmVnZXhwLCBzZWxmLl9jb250ZW50cywgcmUuTVVMVElMSU5FKQogCisgICAg
ICAgIG1hdGNoID0gcmUuc2VhcmNoKHNlbGYudGVzdHNfbGlzdF9yZWdleHAsIHNlbGYuX2NvbnRl
bnRzLCByZS5NVUxUSUxJTkUpCisgICAgICAgIHNlbGYuX3Rlc3RzID0gbWF0Y2guZ3JvdXAoJ3Rl
c3RzJykuc3BsaXQoKSBpZiBtYXRjaCBlbHNlIE5vbmUKKworICAgICAgICBzZWxmLl9kZXNjcmlw
dGlvbiA9IF9yZW1vdmVNYXRjaGVkU3Vic3RyaW5ncyhzZWxmLl9jb250ZW50cywKKyAgICAgICAg
ICAgIFtzZWxmLmRhdGVfbGluZV9yZWdleHAsIHNlbGYuYnVnX3VybF9yZWdleHAsIHNlbGYucmV2
aWV3ZWRfYnlfcmVnZXhwLCBzZWxmLnRlc3RzX2xpc3RfcmVnZXhwLCBzZWxmLnRvdWNoZWRfZmls
ZXNfcmVnZXhwLCBzZWxmLmZ1bmN0aW9uX25hbWVfcmVnZXhwLCAnXG5cbiddKQorCiAgICAgZGVm
IGF1dGhvcl9uYW1lKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fYXV0aG9yX25hbWUKIApA
QCAtMTc1LDYgKzE5NCw5IEBACiAgICAgZGVmIHJldmlld2VyX3RleHQoc2VsZik6CiAgICAgICAg
IHJldHVybiBzZWxmLl9yZXZpZXdlcl90ZXh0CiAKKyAgICBkZWYgcmV2aWV3ZXJfdGV4dF9saXN0
KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmV2aWV3ZXJfbGlzdAorCiAgICAgZGVmIHJl
dmlld2VyKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fcmV2aWV3ZXIgICMgTWlnaHQgYmUg
Tm9uZSwgbWlnaHQgYWxzbyBub3QgYmUgYSBSZXZpZXdlciEKIApAQCAtMTg3LDcgKzIwOSwxMiBA
QAogICAgIGRlZiB0b3VjaGVkX2ZpbGVzKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fdG91
Y2hlZF9maWxlcwogCisgICAgZGVmIGRlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4g
c2VsZi5fZGVzY3JpcHRpb24KIAorICAgIGRlZiB0ZXN0cyhzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX3Rlc3RzCisKICMgRklYTUU6IFZhcmlvdXMgbWV0aG9kcyBvbiBDaGFuZ2VMb2cgc2hv
dWxkIG1vdmUgaW50byBDaGFuZ2VMb2dFbnRyeSBpbnN0ZWFkLgogY2xhc3MgQ2hhbmdlTG9nKG9i
amVjdCk6CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>115328</attachid>
            <date>2011-11-15 22:56:37 -0800</date>
            <delta_ts>2011-11-15 22:56:37 -0800</delta_ts>
            <desc>json files + summary.html version 2</desc>
            <filename>changelogs.zip</filename>
            <type>application/zip</type>
            <size>0</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64"></data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>115348</attachid>
            <date>2011-11-16 01:39:39 -0800</date>
            <delta_ts>2011-11-16 01:39:39 -0800</delta_ts>
            <desc>screenshot</desc>
            <filename>Screen shot 2011-11-16 at 1.39.01 AM.png</filename>
            <type>image/png</type>
            <size>0</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64"></data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>115998</attachid>
            <date>2011-11-20 14:22:47 -0800</date>
            <delta_ts>2011-11-22 13:48:40 -0800</delta_ts>
            <desc>work in progress 3</desc>
            <filename>bug-72243-20111120142246.patch</filename>
            <type>text/plain</type>
            <size>24397</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAwNzI4CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggYmI2MTliYTA1OTdjNWJkYThjNjY1ZTQ1MWIwMjA5MTYx
OWRhZTA3OC4uMzBlNzUxMDlkMzIxOTUwZGIxN2VhYjRlYTk3ZGZmZDJmYjQwYmNjNCAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIx
IEBACisyMDExLTExLTE4ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAg
ICAgIENoYW5nZUxvZyBzaG91bGQgYmUgYWJsZSB0byBwYXJzZSBhbm5vdGF0ZWQgY2hhbmdlbG9n
cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzI3MDMK
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNYWtlIHBh
cnNlX2VudHJpZXNfZnJvbV9maWxlIGF3YXJlIG9mIHN2biBibGFtZSBhbm5vdGF0aW9uIHN1Y2gg
YXMgIjEwMDAwMCBvc3N5QHdlYmtpdC5vcmcgIiwKKyAgICAgICAgYW5kIGV4dHJhY3QgdGhlIHJl
dmlzaW9uIG51bWJlciBmb3IgZWFjaCBlbnRyeS4KKworICAgICAgICBBbHNvIGFkZCBhIHN1cHBv
cnQgdG8gZXh0cmFjdCAic3ZuIGJsYW1lIiByZXN1bHQgZnJvbSBzdm4vZ2l0IGNoZWNrb3V0IHRv
IHNjbSBjbGFzc2VzLgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tv
dXQvY2hhbmdlbG9nLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNr
b3V0L2NoYW5nZWxvZ191bml0dGVzdC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9jaGVja291dC9zY20vZ2l0LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29t
bW9uL2NoZWNrb3V0L3NjbS9zY20ucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21t
b24vY2hlY2tvdXQvc2NtL3N2bi5weToKKwogMjAxMS0xMS0xNyAgUmFwaGFlbCBLdWJvIGRhIENv
c3RhICA8a3Vib0Bwcm9mdXNpb24ubW9iaT4KIAogICAgICAgICBbRUZMXSBDbGVhbiB1cCB0aGUg
dXNlIG9mIERBVEFfRElSIGluIHRoZSBidWlsZHN5c3RlbQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2Ny
aXB0cy9hbmFseXplLWNoYW5nZWxvZ3MgYi9Ub29scy9TY3JpcHRzL2FuYWx5emUtY2hhbmdlbG9n
cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi4zNTU0NzQ4M2FlNmJiYzgyODA2YTc5ODNlNzM3OWFlYjNiNDQ0YmE4Ci0t
LSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy9hbmFseXplLWNoYW5nZWxvZ3MKQEAgLTAs
MCArMSwyNDkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTEg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUg
bmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQor
IyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2lt
cG9ydCBjb2RlY3MKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5
cworaW1wb3J0IHRpbWUKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2Zyb20gd2Vi
a2l0cHkuY29tbW9uLmNvbmZpZy5jb250cmlidXRpb25hcmVhcyBpbXBvcnQgQ29udHJpYnV0aW9u
QXJlYXMKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5maWxlc3lzdGVtIGltcG9ydCBGaWxl
U3lzdGVtCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZXhlY3V0aXZlIGltcG9ydCBFeGVj
dXRpdmUKK2Zyb20gd2Via2l0cHkuY29tbW9uLmNoZWNrb3V0LnNjbS5kZXRlY3Rpb24gaW1wb3J0
IFNDTURldGVjdG9yCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5jaGVja291dC5jaGFuZ2Vsb2cgaW1w
b3J0IENoYW5nZUxvZworCitjbGFzcyBDaGFuZ2VMb2dFbnVtZXJhdG9yKG9iamVjdCk6CisgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0X3BhdGgpOgorICAgICAgICBzZWxmLl9zdGFydF9wYXRo
ID0gc3RhcnRfcGF0aAorICAgICAgICBzZWxmLl9jaGFuZ2Vsb2dfZGlycyA9IHt9CisgICAgICAg
IHJlbGF0aXZlX3BhdGggPSBzZWxmLl9zcGxpdF9wYXRoX3JlbGF0aXZlX3RvX3NvdXJjZShzZWxm
Ll9zdGFydF9wYXRoKQorICAgICAgICBpZiByZWxhdGl2ZV9wYXRoICE9IE5vbmU6CisgICAgICAg
ICAgICBzZWxmLl9lbnVtZXJhdGUoc2VsZi5fc3RhcnRfcGF0aCwgcmVsYXRpdmVfcGF0aCkKKwor
ICAgIGRlZiBkaXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2hhbmdlbG9nX2RpcnMu
a2V5cygpCisKKyAgICBkZWYgY2hhbmdlbG9ncyhzZWxmLCBsaW1pdD1Ob25lKToKKyAgICAgICAg
cmV0dXJuIHN1bShbc2VsZi5fc29ydF9jaGFuZ2Vsb2dzX2luX3JldmVyc2VfY2hyb25vbG9naWNh
bF9vcmRlcihmaWxlcywgcmV2ZXJzZT1UcnVlKVs6bGltaXRdIGZvciBkaXJuYW1lLCBmaWxlcyBp
biBzZWxmLl9jaGFuZ2Vsb2dfZGlycy5pdGVtcygpXSwgW10pCisKKyAgICBkZWYgX3NwbGl0X3Bh
dGhfcmVsYXRpdmVfdG9fc291cmNlKHNlbGYsIHBhdGgpOgorICAgICAgICBoZWFkLCB0YWlsID0g
cGF0aCwgJycKKyAgICAgICAgcmVsYXRpdmVfcGF0aCA9ICcnCisgICAgICAgIHdoaWxlIHRhaWwg
IT0gJ1NvdXJjZSc6CisgICAgICAgICAgICBuZXh0X2hlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0
KGhlYWQpCisgICAgICAgICAgICBpZiBuZXh0X2hlYWQgPT0gaGVhZDoKKyAgICAgICAgICAgICAg
ICByZXR1cm4gTm9uZQorICAgICAgICAgICAgaWYgdGFpbCAhPSAnU291cmNlJyBhbmQgaGVhZCAh
PSBwYXRoOgorICAgICAgICAgICAgICAgIHJlbGF0aXZlX3BhdGggPSBvcy5wYXRoLmpvaW4odGFp
bCwgcmVsYXRpdmVfcGF0aCkKKyAgICAgICAgICAgIGhlYWQgPSBuZXh0X2hlYWQKKyAgICAgICAg
cmV0dXJuIHJlbGF0aXZlX3BhdGgKKworICAgIGRlZiBfYWRkX3BhdGhfaWZfY2hhbmdlbG9nKHNl
bGYsIHBhdGgsIHJlbGF0aXZlX3BhdGgsIGZpbGVuYW1lKToKKyAgICAgICAgbSA9IHJlLm1hdGNo
KCdDaGFuZ2VMb2coLShcZHs0fS1cZHsyfS1cZHsyfSkpPycsIGZpbGVuYW1lKQorICAgICAgICBp
ZiBtIGFuZCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgIGlmIHJlbGF0aXZlX3Bh
dGggbm90IGluIHNlbGYuX2NoYW5nZWxvZ19kaXJzOgorICAgICAgICAgICAgICAgIHNlbGYuX2No
YW5nZWxvZ19kaXJzW3JlbGF0aXZlX3BhdGhdID0gW10KKyAgICAgICAgICAgIHNlbGYuX2NoYW5n
ZWxvZ19kaXJzW3JlbGF0aXZlX3BhdGhdLmFwcGVuZCh7J3BhdGgnOiBwYXRoLCAncmVsYXRpdmVf
cGF0aCc6IG9zLnBhdGguam9pbihyZWxhdGl2ZV9wYXRoLCBmaWxlbmFtZSksICdmaWxlbmFtZSc6
IGZpbGVuYW1lfSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxz
ZQorCisgICAgZGVmIF9lbnVtZXJhdGUoc2VsZiwgcGF0aCwgcmVsYXRpdmVfcGF0aCk6CisgICAg
ICAgIGhlYWQsIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChwYXRoKQorICAgICAgICBpZiBmaWxl
bmFtZSBhbmQgc2VsZi5fYWRkX3BhdGhfaWZfY2hhbmdlbG9nKHBhdGgsIHJlbGF0aXZlX3BhdGgs
IGZpbGVuYW1lKToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGlmIG5vdCBvcy5wYXRo
LmlzZGlyKHBhdGgpIG9yIChmaWxlbmFtZSBhbmQgZmlsZW5hbWVbMF0gPT0gJy4nKToKKyAgICAg
ICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiBzdW0oW3NlbGYuX2VudW1lcmF0ZShvcy5w
YXRoLmpvaW4ocGF0aCwgY2hpbGQpLCBvcy5wYXRoLmpvaW4ocmVsYXRpdmVfcGF0aCwgZmlsZW5h
bWUpKSBmb3IgY2hpbGQgaW4gb3MubGlzdGRpcihwYXRoKV0pCisKKyAgICBkZWYgX3NvcnRfY2hh
bmdlbG9nc19pbl9yZXZlcnNlX2Nocm9ub2xvZ2ljYWxfb3JkZXIoc2VsZiwgZmlsZXMsIHJldmVy
c2U9RmFsc2UpOgorICAgICAgICByZXR1cm4gc29ydGVkKGZpbGVzLCBrZXk9bGFtYmRhIGl0ZW06
IGl0ZW1bJ2ZpbGVuYW1lJ10gKyAnWCcsIHJldmVyc2U9cmV2ZXJzZSkKKworZGVmIHVwZGF0ZV9h
cmVhc19mb3JfY29udHJpYnV0b3IoYXJlYSwgY29udHJpYnV0b3IsIGNvbnRyaWJ1dGlvbl90eXBl
KToKKyAgICBpZiBjb250cmlidXRvciBub3QgaW4gYXJlYXNbYXJlYV1bJ2NvbnRyaWJ1dG9ycydd
OgorICAgICAgICBhcmVhc1thcmVhXVsnY29udHJpYnV0b3JzJ11bY29udHJpYnV0b3JdID0geydy
ZXZpZXdzJzogMCwgJ3BhdGNoZXMnOiAwLCAndW5yZXZpZXdlZCc6IDB9CisgICAgYXJlYXNbYXJl
YV1bJ2NvbnRyaWJ1dG9ycyddW2NvbnRyaWJ1dG9yXVtjb250cmlidXRpb25fdHlwZV0gKz0gMQor
CitkZWYgY29sbGVjdF9zdGF0aXN0aWNzX2Zvcl9jb250cmlidXRvcihkYXRhLCBjb250cmlidXRp
b25fdHlwZSwgY29udHJpYnV0b3IsIGFyZWFzX29mX2NvbnRyaWJ1dGlvbnMsIGNoYW5nZWxvZ19k
aXIsIGZpbGVuYW1lcyk6CisgICAgY29udHJpYnV0b3JfYXJlYXMgPSBkYXRhWydhcmVhcyddCisg
ICAgZm9yIGFyZWEgaW4gYXJlYXNfb2ZfY29udHJpYnV0aW9uczoKKyAgICAgICAgY29udHJpYnV0
b3JfYXJlYXNbYXJlYV0gPSBjb250cmlidXRvcl9hcmVhcy5nZXQoYXJlYSwgMCkgKyAxCisgICAg
ICAgIHVwZGF0ZV9hcmVhc19mb3JfY29udHJpYnV0b3IoYXJlYSwgY29udHJpYnV0b3IsIGNvbnRy
aWJ1dGlvbl90eXBlKQorCisgICAgY29udHJpYnV0b3JfZmlsZXMgPSBkYXRhWydmaWxlcyddCisg
ICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICByZWxhdGl2ZV9wYXRoID0gb3MucGF0
aC5qb2luKGNoYW5nZWxvZ19kaXIsIG5hbWUpCisgICAgICAgIGNvbnRyaWJ1dG9yX2ZpbGVzW3Jl
bGF0aXZlX3BhdGhdID0gY29udHJpYnV0b3JfZmlsZXMuZ2V0KHJlbGF0aXZlX3BhdGgsIDApICsg
MQorCitkZWYgYW5hbHl6ZV9lbnRyaWVzKGNoYW5nZWxvZ19kaXIsIGVudHJpZXMsIG91dHB1dF9m
aWxlKToKKyAgICBsID0gMAorICAgIG1hdGNoZWRfZmlsZV9wYXRocyA9IHt9CisKKyAgICBpID0g
MAorICAgIHByZXZpb3VzTGluZSA9ICcnCisgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAg
ICAgIG51bWJlck9mQ2hyYWN0ZXJzVG9FcmFzZSA9IGxlbihwcmV2aW91c0xpbmUpICsgMQorICAg
ICAgICBwcmV2aW91c0xpbmUgPSAiICAgICVkIGVudHJpZXMiICUgaQorICAgICAgICBwcmludCAi
XGIiICogbnVtYmVyT2ZDaHJhY3RlcnNUb0VyYXNlICsgcHJldmlvdXNMaW5lLAorICAgICAgICBp
ICs9IDEKKyAgICAgICAgaWYgbm90IGVudHJ5LmF1dGhvcl9uYW1lKCk6CisgICAgICAgICAgICBj
b250aW51ZQorICAgICAgICBhcmVhc19vZl9jb250cmlidXRpb25zID0gY29udHJpYnV0aW9uX2Fy
ZWFzLmFyZWFzX2Zvcl90b3VjaGVkX2ZpbGVzKGVudHJ5LnRvdWNoZWRfZmlsZXMoKSkKKworICAg
ICAgICBhdXRob3IgPSBlbnRyeS5hdXRob3JfbmFtZSgpCisgICAgICAgIGlmIGF1dGhvciBub3Qg
aW4gY29udHJpYnV0b3JzOgorICAgICAgICAgICAgY29udHJpYnV0b3JzW2F1dGhvcl0gPSB7J3Jl
dmlld3MnOiB7J3RvdGFsJzogMCwgJ2FyZWFzJzoge30sICdmaWxlcyc6IHt9fSwgJ3BhdGNoZXMn
OiB7J3Jldmlld2VkJzogMCwgJ3VucmV2aWV3ZWQnOiAwLCAnYXJlYXMnOiB7fSwgJ2ZpbGVzJzog
e319fQorCisgICAgICAgIGlmIGVudHJ5LnJldmlld2VyX3RleHQoKToKKyAgICAgICAgICAgICMg
RklYTUU6IFRha2UgY2FyZSBvZiBtdWx0aXBsZSBhdXRob3JzCisgICAgICAgICAgICBjb250cmli
dXRvcnNbYXV0aG9yXVsncGF0Y2hlcyddWydyZXZpZXdlZCddICs9IDEKKyAgICAgICAgICAgIGNv
bGxlY3Rfc3RhdGlzdGljc19mb3JfY29udHJpYnV0b3IoY29udHJpYnV0b3JzW2F1dGhvcl1bJ3Bh
dGNoZXMnXSwgJ3BhdGNoZXMnLCBhdXRob3IsIGFyZWFzX29mX2NvbnRyaWJ1dGlvbnMsIGNoYW5n
ZWxvZ19kaXIsIGVudHJ5LnRvdWNoZWRfZmlsZXMoKSkKKworICAgICAgICAgICAgZm9yIHJldmll
d2VyIGluIGVudHJ5LnJldmlld2VycygpOgorICAgICAgICAgICAgICAgIGlmIHJldmlld2VyLmZ1
bGxfbmFtZSBub3QgaW4gY29udHJpYnV0b3JzOgorICAgICAgICAgICAgICAgICAgICBjb250cmli
dXRvcnNbcmV2aWV3ZXIuZnVsbF9uYW1lXSA9IHsncmV2aWV3cyc6IHsndG90YWwnOiAwLCAnYXJl
YXMnOiB7fSwgJ2ZpbGVzJzoge319LCAncGF0Y2hlcyc6IHsncmV2aWV3ZWQnOiAwLCAndW5yZXZp
ZXdlZCc6IDAsICdhcmVhcyc6IHt9LCAnZmlsZXMnOiB7fX19CisgICAgICAgICAgICAgICAgY29u
dHJpYnV0b3JzW3Jldmlld2VyLmZ1bGxfbmFtZV1bJ3Jldmlld3MnXVsndG90YWwnXSArPSAxCisg
ICAgICAgICAgICAgICAgY29sbGVjdF9zdGF0aXN0aWNzX2Zvcl9jb250cmlidXRvcihjb250cmli
dXRvcnNbcmV2aWV3ZXIuZnVsbF9uYW1lXVsncmV2aWV3cyddLCAncmV2aWV3cycsCisgICAgICAg
ICAgICAgICAgICAgIHJldmlld2VyLmZ1bGxfbmFtZSwgYXJlYXNfb2ZfY29udHJpYnV0aW9ucywg
Y2hhbmdlbG9nX2RpciwgZW50cnkudG91Y2hlZF9maWxlcygpKQorCisgICAgICAgICAgICBzdW1t
YXJ5WydyZXZpZXdlZCddICs9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbnRyaWJ1
dG9yc1thdXRob3JdWydwYXRjaGVzJ11bJ3VucmV2aWV3ZWQnXSArPSAxCisgICAgICAgICAgICBm
b3IgYXJlYSBpbiBhcmVhc19vZl9jb250cmlidXRpb25zOgorICAgICAgICAgICAgICAgIHVwZGF0
ZV9hcmVhc19mb3JfY29udHJpYnV0b3IoYXJlYSwgYXV0aG9yLCAndW5yZXZpZXdlZCcpCisgICAg
ICAgICAgICBzdW1tYXJ5Wyd1bnJldmlld2VkJ10gKz0gMQorCisgICAgICAgIGZvciBhcmVhIGlu
IGFyZWFzX29mX2NvbnRyaWJ1dGlvbnM6CisgICAgICAgICAgICBhcmVhc1thcmVhXVsncmV2aWV3
ZWQnIGlmIGVudHJ5LnJldmlld2VyX3RleHQoKSBlbHNlICd1bnJldmlld2VkJ10gKz0gMQorCisg
ICAgICAgIGNvbnRlbnRzID0gZW50cnkuX2NvbnRlbnRzCisgICAgICAgIGlmIGFyZWFzIGFuZCBs
ZW4oYXJlYXMpOgorICAgICAgICAgICAgY29udGVudHMgKz0gJ1xuJXN7eyVzfX1cbicgJSAoJyAn
ICogOCwgJywgJy5qb2luKGFyZWFzKSkKKyAgICAgICAgcHJpbnQgPj4gb3V0cHV0X2ZpbGUsIGNv
bnRlbnRzCisgICAgcHJpbnQKKworCitjbGFzcyBDaGFuZ2VMb2dBbmFseXplcihvYmplY3QpOgor
ICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlc3lzdGVtLCBjaGFuZ2Vsb2dfcGF0aHMpOgorICAg
ICAgICBzZWxmLl9jaGFuZ2Vsb2dfcGF0aHMgPSBjaGFuZ2Vsb2dfcGF0aHMKKyAgICAgICAgc2Vs
Zi5fZmlsZXN5c3RlbSA9IGZpbGVzeXN0ZW0KKyAgICAgICAgc2VsZi5fY29udHJpYnV0aW9uX2Fy
ZWFzID0gQ29udHJpYnV0aW9uQXJlYXMoZmlsZXN5c3RlbSkKKyAgICAgICAgc2VsZi5fc2NtID0g
U0NNRGV0ZWN0b3IoZmlsZXN5c3RlbSwgRXhlY3V0aXZlKCkpLmRlZmF1bHRfc2NtKCkKKyAgICAg
ICAgc2VsZi5fcHJldmlvdXNfc3RhdHVzID0gJycKKworICAgIGRlZiBfcHJpbnRfc3RhdHVzKHNl
bGYsIG5ld19zdGF0dXMpOgorICAgICAgICBwcmludCAiXGIiICogbGVuKHNlbGYuX3ByZXZpb3Vz
X3N0YXR1cykgKyBuZXdfc3RhdHVzICsgKCcgJyAqIG1heChsZW4oc2VsZi5fcHJldmlvdXNfc3Rh
dHVzKSAtIGxlbihuZXdfc3RhdHVzKSAtIDEsIDApKSwKKyAgICAgICAgc2VsZi5fcHJldmlvdXNf
c3RhdHVzID0gbmV3X3N0YXR1cyArICcgJworCisgICAgZGVmIF9wcmludF9sYWJlbChzZWxmLCBs
YWJlbCk6CisgICAgICAgIHByaW50ICdcbiU0MHM6JyAlIGxhYmVsLAorICAgICAgICBzZWxmLl9w
cmV2aW91c19zdGF0dXMgPSAnJworCisgICAgZGVmIGFuYWx5emUoc2VsZik6CisgICAgICAgIGZv
ciBwYXRoIGluIHNlbGYuX2NoYW5nZWxvZ19wYXRoczoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50
X2xhYmVsKHNlbGYuX2ZpbGVzeXN0ZW0ucmVscGF0aChwYXRoLCBzZWxmLl9zY20uY2hlY2tvdXRf
cm9vdCkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9zdGF0dXMoJ1J1bm5pbmcgc3ZuIGJsYW1l
Li4uJykKKyAgICAgICAgICAgIHNlbGYuX3NjbS5zdm5fYmxhbWUocGF0aCkKKyAgICAgICAgICAg
IHNlbGYuX3ByaW50X3N0YXR1cygnRG9uZScpCisgICAgICAgIHByaW50CisKK2lmIF9fbmFtZV9f
ID09ICdfX21haW5fXyc6CisgICAgaWYgbGVuKHN5cy5hcmd2KSA8PSAyOgorICAgICAgICBwcmlu
dCAiIiJVc2FnZToKKyAgICBhbmFseXplX2NoYW5nZWxvZ3MgPHBhdGggdG8gYSBkaXJlY3Rvcnkg
d2l0aCBjaGFuZ2Vsb2dzPiA8b3V0cHV0IGRpcmVjdG9yeT4KKyIiIgorICAgICAgICBzeXMuZXhp
dCgxKQorICAgIGVsc2U6CisgICAgICAgIG91dHB1dF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoc3lz
LmFyZ3ZbMl0pCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKG91dHB1dF9kaXIpOgorICAg
ICAgICAgICAgcHJpbnQgIlRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGRpcmVjdG9yeSIK
KyAgICAgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICAgICAgc3RhcnRUaW1lID0gdGltZS50aW1l
KCkKKworICAgICAgICBwcmludCAnRW51bWVyYXRpbmcgQ2hhbmdlTG9nIGZpbGVzLi4uJworICAg
ICAgICBlbnVtZXJhdG9yID0gQ2hhbmdlTG9nRW51bWVyYXRvcihvcy5wYXRoLmFic3BhdGgoc3lz
LmFyZ3ZbMV0pKQorCisgICAgICAgIGNoYW5nZWxvZ3MgPSBbbG9nWydwYXRoJ10gZm9yIGxvZyBp
biBlbnVtZXJhdG9yLmNoYW5nZWxvZ3MobGltaXQ9MSldCisKKyAgICAgICAgYW5hbHl6ZXIgPSBD
aGFuZ2VMb2dBbmFseXplcihGaWxlU3lzdGVtKCksIGNoYW5nZWxvZ3MpCisgICAgICAgIGFuYWx5
emVyLmFuYWx5emUoKQorCisgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAgICAgY29udHJpYnV0
aW9uX2FyZWFzID0gQ29udHJpYnV0aW9uQXJlYXMoRmlsZVN5c3RlbSgpKQorICAgICAgICBzY20g
PSBTQ01EZXRlY3RvcihGaWxlU3lzdGVtKCksIEV4ZWN1dGl2ZSgpKS5kZWZhdWx0X3NjbSgpCisK
KyAgICAgICAgc3VtbWFyeSA9IHsncmV2aWV3ZWQnOiAwLCAndW5yZXZpZXdlZCc6IDB9CisgICAg
ICAgIGNvbnRyaWJ1dG9ycyA9IHt9CisgICAgICAgIGFyZWFzID0ge30KKyAgICAgICAgZm9yIGFy
ZWEgaW4gY29udHJpYnV0aW9uX2FyZWFzLm5hbWVzKCk6CisgICAgICAgICAgICBhcmVhc1thcmVh
XSA9IHsncmV2aWV3ZWQnOiAwLCAndW5yZXZpZXdlZCc6IDAsICdjb250cmlidXRvcnMnOiB7fX0K
KworICAgICAgICBmb3IgbG9nIGluIGNoYW5nZWxvZ3M6CisgICAgICAgICAgICBwcmludCAnICAg
IFByb2Nlc3NpbmcgJXMnICUgbG9nWydyZWxhdGl2ZV9wYXRoJ10KKyAgICAgICAgICAgIHByaW50
ICcgICAgc3ZuIGJsYW1lLi4uJworICAgICAgICAgICAgY2hhbmdlbG9nX2ZpbGUgPSBTdHJpbmdJ
TyhzY20uc3ZuX2JsYW1lKGxvZ1sncGF0aCddKSkKKyAgICAgICAgICAgIG91dG91dF9maWxlX3Bh
dGggPSBsb2dbJ3JlbGF0aXZlX3BhdGgnXS5yZXBsYWNlKCcvJywgJ18nKS5yZXBsYWNlKCdcXCcs
ICdfJykKKyAgICAgICAgICAgIG91dHB1dF9maWxlID0gY29kZWNzLm9wZW4ob3MucGF0aC5qb2lu
KG91dHB1dF9kaXIsIG91dG91dF9maWxlX3BhdGgpLCAidyIsICJ1dGYtOCIpCisgICAgICAgICAg
ICB0cnk6CisgICAgICAgICAgICAgICAgZW50cmllcyA9IENoYW5nZUxvZy5wYXJzZV9lbnRyaWVz
X2Zyb21fZmlsZShjaGFuZ2Vsb2dfZmlsZSkKKyAgICAgICAgICAgICAgICBhbmFseXplX2VudHJp
ZXMob3MucGF0aC5kaXJuYW1lKGxvZ1sncmVsYXRpdmVfcGF0aCddKSwgZW50cmllcywgb3V0cHV0
X2ZpbGUpCisgICAgICAgICAgICBmaW5hbGx5OiAgICAKKyAgICAgICAgICAgICAgICBvdXRwdXRf
ZmlsZS5jbG9zZSgpCisKKyAgICAgICAgc3VtbWFyeVsncGF0Y2hlcyddID0gc3VtbWFyeVsncmV2
aWV3ZWQnXSArIHN1bW1hcnlbJ3VucmV2aWV3ZWQnXQorICAgICAgICBzdW1tYXJ5Wydjb250cmli
dXRvcnMnXSA9IGxlbihjb250cmlidXRvcnMpCisgICAgICAgIHN1bW1hcnlbJ2NvbnRyaWJ1dG9y
c193aXRoX3Jldmlld3MnXSA9IHN1bShbMSBmb3IgY29udHJpYnV0b3IgaW4gY29udHJpYnV0b3Jz
LnZhbHVlcygpIGlmIGNvbnRyaWJ1dG9yWydyZXZpZXdzJ11bJ3RvdGFsJ11dKQorICAgICAgICBz
dW1tYXJ5Wydjb250cmlidXRvcnNfd2l0aG91dF9yZXZpZXdzJ10gPSBzdW1tYXJ5Wydjb250cmli
dXRvcnMnXSAtIHN1bW1hcnlbJ2NvbnRyaWJ1dG9yc193aXRoX3Jldmlld3MnXQorCisgICAgICAg
IHByaW50ICdHZW5lcmF0aW5nIGpzb24gZmlsZXMuLi4nCisgICAgICAgIGpzb25fZmlsZXMgPSB7
CisgICAgICAgICAgICAnc3VtbWFyeS5qc29uJzogc3VtbWFyeSwKKyAgICAgICAgICAgICdjb250
cmlidXRvcnMuanNvbic6IGNvbnRyaWJ1dG9ycywKKyAgICAgICAgICAgICdhcmVhcy5qc29uJzog
YXJlYXMsCisgICAgICAgIH0KKyAgICAgICAgZm9yIGZpbGVfbmFtZSBpbiBqc29uX2ZpbGVzOgor
ICAgICAgICAgICAgb3V0cHV0X2ZpbGUgPSBjb2RlY3Mub3Blbihvcy5wYXRoLmpvaW4ob3V0cHV0
X2RpciwgZmlsZV9uYW1lKSwgInciLCAidXRmLTgiKQorICAgICAgICAgICAgdHJ5OgorICAgICAg
ICAgICAgICAgIHByaW50ICcgICAgR2VuZXJhdGluZycsIGZpbGVfbmFtZQorICAgICAgICAgICAg
ICAgIG91dHB1dF9maWxlLndyaXRlKGpzb24uZHVtcHMoanNvbl9maWxlc1tmaWxlX25hbWVdLCBp
bmRlbnQ9MikpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG91dHB1dF9m
aWxlLmNsb3NlKCkKKworICAgICAgICB0aWNrID0gdGltZS50aW1lKCkgLSBzdGFydFRpbWUKKyAg
ICAgICAgcHJpbnQgJ0ZpbmlzaGVkIGluICUwMmRtOiUwMmRzJyAlIChpbnQodGljayAvIDYwKSwg
aW50KHRpY2sgJSA2MCkpCisKKyMgRklYTUU6IGFkZCBhbmFseXNpcyBmb3IgYnVpbGQgZml4ZXMg
YW5kIHJlYmFzZWxpbmVzCisKKworCisKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL2NoZWNrb3V0L2NoYW5nZWxvZy5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y29tbW9uL2NoZWNrb3V0L2NoYW5nZWxvZy5weQppbmRleCAyZjZjMzNiODAzZTcyOGNhYjM5Njll
MGI5ZTUwY2JjMmI0YTk2YzQyLi4wMWUxMjdkMTg3YzI2MzE4Y2NiYTc2ZjJhZDA2Njg3M2ViYWY2
NGFmIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9j
aGFuZ2Vsb2cucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQv
Y2hhbmdlbG9nLnB5CkBAIC0xMTAsOSArMTEwLDEwIEBAIGNsYXNzIENoYW5nZUxvZ0VudHJ5KG9i
amVjdCk6CiAgICAgIyBlLmcuIGdpdC1zdm4taWQ6IGh0dHA6Ly9zdm4ud2Via2l0Lm9yZy9yZXBv
c2l0b3J5L3dlYmtpdC90cnVua0A5NjE2MSAyNjhmNDVjYy1jZDA5LTA0MTAtYWIzYy1kNTI2OTFi
NGRiZmMKICAgICBzdm5faWRfcmVnZXhwID0gcidnaXQtc3ZuLWlkOiBodHRwOi8vc3ZuLndlYmtp
dC5vcmcvcmVwb3NpdG9yeS93ZWJraXQvdHJ1bmtAKD9QPHN2bmlkPlxkKykgJwogCi0gICAgZGVm
IF9faW5pdF9fKHNlbGYsIGNvbnRlbnRzLCBjb21taXR0ZXJfbGlzdD1Db21taXR0ZXJMaXN0KCkp
OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250ZW50cywgY29tbWl0dGVyX2xpc3Q9Q29tbWl0
dGVyTGlzdCgpLCByZXZpc2lvbj1Ob25lKToKICAgICAgICAgc2VsZi5fY29udGVudHMgPSBjb250
ZW50cwogICAgICAgICBzZWxmLl9jb21taXR0ZXJfbGlzdCA9IGNvbW1pdHRlcl9saXN0CisgICAg
ICAgIHNlbGYuX3JldmlzaW9uID0gcmV2aXNpb24KICAgICAgICAgc2VsZi5fcGFyc2VfZW50cnko
KQogCiAgICAgQHN0YXRpY21ldGhvZApAQCAtMTY3LDYgKzE2OCw5IEBAIGNsYXNzIENoYW5nZUxv
Z0VudHJ5KG9iamVjdCk6CiAKICAgICAgICAgc2VsZi5fdG91Y2hlZF9maWxlcyA9IHJlLmZpbmRh
bGwoc2VsZi50b3VjaGVkX2ZpbGVzX3JlZ2V4cCwgc2VsZi5fY29udGVudHMsIHJlLk1VTFRJTElO
RSkKIAorICAgIGRlZiByZXZpc2lvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jldmlz
aW9uCisKICAgICBkZWYgYXV0aG9yX25hbWUoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl9h
dXRob3JfbmFtZQogCkBAIC0yMzcsNiArMjQxLDE1IEBAIGNsYXNzIENoYW5nZUxvZyhvYmplY3Qp
OgogICAgICAgICAgICAgZW50cnlfbGluZXMuYXBwZW5kKGxpbmUpCiAgICAgICAgIHJldHVybiBO
b25lICMgV2UgbmV2ZXIgZm91bmQgYSBkYXRlIGxpbmUhCiAKKyAgICBzdm5fYmxhbWVfcmVnZXhw
ID0gcmUuY29tcGlsZShyJ14oXHMqKD9QPHJldmlzaW9uPlxkKykgW14gXSspXHMoP1A8bGluZT4u
Kj9cbiknKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfc2VwZWFyYXRlX3JldmlzaW9u
X2FuZF9saW5lKGxpbmUpOgorICAgICAgICBtYXRjaCA9IENoYW5nZUxvZy5zdm5fYmxhbWVfcmVn
ZXhwLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgIHJldHVy
biBOb25lLCBsaW5lCisgICAgICAgIHJldHVybiBpbnQobWF0Y2guZ3JvdXAoJ3JldmlzaW9uJykp
LCBtYXRjaC5ncm91cCgnbGluZScpCisKICAgICBAc3RhdGljbWV0aG9kCiAgICAgZGVmIHBhcnNl
X2VudHJpZXNfZnJvbV9maWxlKGNoYW5nZWxvZ19maWxlKToKICAgICAgICAgIiIiY2hhbmdlbG9n
X2ZpbGUgbXVzdCBiZSBhIGZpbGUtbGlrZSBvYmplY3Qgd2hpY2ggcmV0dXJucwpAQCAtMjQ0LDIw
ICsyNTcsMzUgQEAgY2xhc3MgQ2hhbmdlTG9nKG9iamVjdCk6CiAgICAgICAgIHRvIHBhc3MgZmls
ZSBvYmplY3RzIHRvIHRoaXMgY2xhc3MuIiIiCiAgICAgICAgIGRhdGVfbGluZV9yZWdleHAgPSBy
ZS5jb21waWxlKENoYW5nZUxvZ0VudHJ5LmRhdGVfbGluZV9yZWdleHApCiAgICAgICAgIHJvbGxl
ZF9vdmVyX3JlZ2V4cCA9IHJlLmNvbXBpbGUoQ2hhbmdlTG9nRW50cnkucm9sbGVkX292ZXJfcmVn
ZXhwKQotICAgICAgICBlbnRyeV9saW5lcyA9IFtdCisKICAgICAgICAgIyBUaGUgZmlyc3QgbGlu
ZSBzaG91bGQgYmUgYSBkYXRlIGxpbmUuCi0gICAgICAgIGZpcnN0X2xpbmUgPSBjaGFuZ2Vsb2df
ZmlsZS5yZWFkbGluZSgpCisgICAgICAgIHJldmlzaW9uLCBmaXJzdF9saW5lID0gQ2hhbmdlTG9n
Ll9zZXBlYXJhdGVfcmV2aXNpb25fYW5kX2xpbmUoY2hhbmdlbG9nX2ZpbGUucmVhZGxpbmUoKSkK
ICAgICAgICAgYXNzZXJ0KGlzaW5zdGFuY2UoZmlyc3RfbGluZSwgdW5pY29kZSkpCi0gICAgICAg
IGlmIG5vdCBkYXRlX2xpbmVfcmVnZXhwLm1hdGNoKGZpcnN0X2xpbmUpOgorICAgICAgICBpZiBu
b3QgZGF0ZV9saW5lX3JlZ2V4cC5tYXRjaChDaGFuZ2VMb2cuc3ZuX2JsYW1lX3JlZ2V4cC5zdWIo
JycsIGZpcnN0X2xpbmUpKToKICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLSAgICAg
ICAgZW50cnlfbGluZXMuYXBwZW5kKGZpcnN0X2xpbmUpCiAKKyAgICAgICAgZW50cnlfbGluZXMg
PSBbZmlyc3RfbGluZV0KKyAgICAgICAgcmV2aXNpb25zX2luX2VudHJ5ID0ge3JldmlzaW9uOiAx
fSBpZiByZXZpc2lvbiAhPSBOb25lIGVsc2UgTm9uZQogICAgICAgICBmb3IgbGluZSBpbiBjaGFu
Z2Vsb2dfZmlsZToKLSAgICAgICAgICAgIGlmIGRhdGVfbGluZV9yZWdleHAubWF0Y2gobGluZSkg
b3Igcm9sbGVkX292ZXJfcmVnZXhwLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgaWYgcmV2aXNp
b25zX2luX2VudHJ5OgorICAgICAgICAgICAgICAgIHJldmlzaW9uLCBsaW5lID0gQ2hhbmdlTG9n
Ll9zZXBlYXJhdGVfcmV2aXNpb25fYW5kX2xpbmUobGluZSkKKworICAgICAgICAgICAgaWYgcm9s
bGVkX292ZXJfcmVnZXhwLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAg
ICAgICAgICAgIGlmIGRhdGVfbGluZV9yZWdleHAubWF0Y2gobGluZSk6CisgICAgICAgICAgICAg
ICAgbW9zdF9wcm9iYWJsZV9yZXZpc2lvbiA9IG1heChyZXZpc2lvbnNfaW5fZW50cnksIGtleT1y
ZXZpc2lvbnNfaW5fZW50cnkuX19nZXRpdGVtX18pIGlmIHJldmlzaW9uc19pbl9lbnRyeSBlbHNl
IE5vbmUKICAgICAgICAgICAgICAgICAjIFJlbW92ZSB0aGUgZXh0cmEgbmV3bGluZSBhdCB0aGUg
ZW5kCi0gICAgICAgICAgICAgICAgeWllbGQgQ2hhbmdlTG9nRW50cnkoJycuam9pbihlbnRyeV9s
aW5lc1s6LTFdKSkKKyAgICAgICAgICAgICAgICB5aWVsZCBDaGFuZ2VMb2dFbnRyeSgnJy5qb2lu
KGVudHJ5X2xpbmVzWzotMV0pLCByZXZpc2lvbj1tb3N0X3Byb2JhYmxlX3JldmlzaW9uKQogICAg
ICAgICAgICAgICAgIGVudHJ5X2xpbmVzID0gW10KKyAgICAgICAgICAgICAgICByZXZpc2lvbnNf
aW5fZW50cnkgPSB7cmV2aXNpb246IDB9CisKICAgICAgICAgICAgIGVudHJ5X2xpbmVzLmFwcGVu
ZChsaW5lKQorICAgICAgICAgICAgaWYgcmV2aXNpb25zX2luX2VudHJ5OgorICAgICAgICAgICAg
ICAgIHJldmlzaW9uc19pbl9lbnRyeVtyZXZpc2lvbl0gPSByZXZpc2lvbnNfaW5fZW50cnkuZ2V0
KHJldmlzaW9uLCAwKSArIDEKKworICAgICAgICBtb3N0X3Byb2JhYmxlX3JldmlzaW9uID0gbWF4
KHJldmlzaW9uc19pbl9lbnRyeSwga2V5PXJldmlzaW9uc19pbl9lbnRyeS5fX2dldGl0ZW1fXykg
aWYgcmV2aXNpb25zX2luX2VudHJ5IGVsc2UgTm9uZQorICAgICAgICB5aWVsZCBDaGFuZ2VMb2dF
bnRyeSgnJy5qb2luKGVudHJ5X2xpbmVzWzotMV0pLCByZXZpc2lvbj1tb3N0X3Byb2JhYmxlX3Jl
dmlzaW9uKQogCiAgICAgZGVmIGxhdGVzdF9lbnRyeShzZWxmKToKICAgICAgICAgIyBDaGFuZ2VM
b2cgZmlsZXMgYXJlIGFsd2F5cyBVVEYtOCwgd2UgcmVhZCB0aGVtIGluIGFzIHN1Y2ggdG8gc3Vw
cG9ydCBSZXZpZXdlcnMgd2l0aCB1bmljb2RlIGluIHRoZWlyIG5hbWVzLgpkaWZmIC0tZ2l0IGEv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvY2hhbmdlbG9nX3VuaXR0ZXN0
LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvY2hhbmdlbG9nX3Vu
aXR0ZXN0LnB5CmluZGV4IGI4ODM3MGE3ZGI1MWU5MDU3MWMxZTU0ODkyODc2OTY5NjJlODg5Y2Yu
LjkzMmI2YzRlNmFmNzAwZmQyN2JhOGQ2YTBkYzNkN2Y2ZGYyNTY1MDggMTAwNjQ0Ci0tLSBhL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L2NoYW5nZWxvZ191bml0dGVzdC5w
eQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9jaGFuZ2Vsb2df
dW5pdHRlc3QucHkKQEAgLTI1MSw2ICsyNTEsNTIgQEAgY2xhc3MgQ2hhbmdlTG9nVGVzdCh1bml0
dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlZF9lbnRyaWVz
WzddLnJldmlld2VyX3RleHQoKSwgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFy
c2VkX2VudHJpZXNbOF0ucmV2aWV3ZXJfdGV4dCgpLCAnRGFyaW4gQWRsZXInKQogCisgICAgZGVm
IHRlc3RfcGFyc2VfbG9nX2VudHJpZXNfZnJvbV9hbm5vdGF0ZWRfZmlsZShzZWxmKToKKyAgICAg
ICAgY2hhbmdlbG9nX2ZpbGUgPSBTdHJpbmdJTyh1JycnMTAwMDAwIG9zc3lAd2Via2l0Lm9yZyAy
MDExLTExLTExICBDc2FiYSBPc3p0cm9nb25cdTAwZTFjICA8b3NzeUB3ZWJraXQub3JnPgorMTAw
MDAwIG9zc3lAd2Via2l0Lm9yZyAKKzEwMDAwMCBvc3N5QHdlYmtpdC5vcmcgICAgICAgICAxMDAs
MDAwICEhIQorMTAwMDAwIG9zc3lAd2Via2l0Lm9yZyAKKzEwMDAwMCBvc3N5QHdlYmtpdC5vcmcg
ICAgICAgICBSZXZpZXdlZCBieSBab2x0YW4gSGVyY3plZy4KKzEwMDAwMCBvc3N5QHdlYmtpdC5v
cmcgCisxMDAwMDAgb3NzeUB3ZWJraXQub3JnICAgICAgICAgKiBDaGFuZ2VMb2c6IFBvaW50IG91
dCByZXZpc2lvbiAxMDAsMDAwLgorMTAwMDAwIG9zc3lAd2Via2l0Lm9yZworOTM3OTggYXBAYXBw
bGUuY29tIDIwMTEtMDgtMjUgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+Cis5
Mzc5OCBhcEBhcHBsZS5jb20gCis5Mzc5OCBhcEBhcHBsZS5jb20gICAgICAgICBGaXggYnVpbGQg
d2hlbiBHQ0MgNC4yIGlzIG5vdCBpbnN0YWxsZWQuCis5Mzc5OCBhcEBhcHBsZS5jb20gCis5Mzc5
OCBhcEBhcHBsZS5jb20gICAgICAgICAqIGd0ZXN0L3hjb2RlL0NvbmZpZy9Db21waWxlclZlcnNp
b24ueGNjb25maWc6IENvcGllZCBmcm9tIFNvdXJjZS9XZWJDb3JlL0NvbmZpZ3VyYXRpb25zL0Nv
bXBpbGVyVmVyc2lvbi54Y2NvbmZpZy4KKzkzNzk4IGFwQGFwcGxlLmNvbSAgICAgICAgICogZ3Rl
c3QveGNvZGUvQ29uZmlnL0dlbmVyYWwueGNjb25maWc6Cis5Mzc5OCBhcEBhcHBsZS5jb20gICAg
ICAgICBVc2UgdGhlIHNhbWUgY29tcGlsZXIgdmVyc2lvbiBhcyBvdGhlciBwcm9qZWN0cyBkby4K
KzkzNzk4IGFwQGFwcGxlLmNvbQorOTk0OTEgYW5kcmVhcy5rbGluZ0Bub2tpYS5jb20gMjAxMS0x
MS0wMyAgQW5kcmVhcyBLbGluZyAgPGtsaW5nQHdlYmtpdC5vcmc+Cis5OTQ5MSBhbmRyZWFzLmts
aW5nQG5va2lhLmNvbSAKKzk5MTkwIGFuZHJlYXMua2xpbmdAbm9raWEuY29tICAgICAgICAgVW5y
ZXZpZXdlZCBidWlsZCBmaXgsIHNpZ2guCis5OTE5MCBhbmRyZWFzLmtsaW5nQG5va2lhLmNvbSAK
Kzk5MTkwIGFuZHJlYXMua2xpbmdAbm9raWEuY29tICAgICAgICAgKiBjc3MvQ1NTRm9udEZhY2VS
dWxlLmg6Cis5OTE5MCBhbmRyZWFzLmtsaW5nQG5va2lhLmNvbSAgICAgICAgICogY3NzL0NTU011
dGFibGVTdHlsZURlY2xhcmF0aW9uLmg6Cis5OTE5MCBhbmRyZWFzLmtsaW5nQG5va2lhLmNvbSAK
Kzk5MTkwIGFuZHJlYXMua2xpbmdAbm9raWEuY29tIDIwMTEtMTEtMDMgIEFuZHJlYXMgS2xpbmcg
IDxrbGluZ0B3ZWJraXQub3JnPgorOTkxOTAgYW5kcmVhcy5rbGluZ0Bub2tpYS5jb20gCis5OTE4
NyBhbmRyZWFzLmtsaW5nQG5va2lhLmNvbSAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGQgZml4LCBv
dXQtb2YtbGluZSBTdHlsZVNoZWV0OjpwYXJlbnRTdHlsZVNoZWV0KCkKKzk5MTg3IGFuZHJlYXMu
a2xpbmdAbm9raWEuY29tICAgICAgICAgYWdhaW4gc2luY2UgdGhlcmUncyBhIGN5Y2xlIGluIHRo
ZSBpbmNsdWRlcyBiZXR3ZWVuIENTU1J1bGUvU3R5bGVTaGVldC4KKzk5MTg3IGFuZHJlYXMua2xp
bmdAbm9raWEuY29tIAorOTkxODcgYW5kcmVhcy5rbGluZ0Bub2tpYS5jb20gICAgICAgICAqIGNz
cy9TdHlsZVNoZWV0LmNwcDoKKzk5MTg3IGFuZHJlYXMua2xpbmdAbm9raWEuY29tICAgICAgICAg
KFdlYkNvcmU6OlN0eWxlU2hlZXQ6OnBhcmVudFN0eWxlU2hlZXQpOgorOTkxODcgYW5kcmVhcy5r
bGluZ0Bub2tpYS5jb20gICAgICAgICAqIGNzcy9TdHlsZVNoZWV0Lmg6Cis5OTE4NyBhbmRyZWFz
LmtsaW5nQG5va2lhLmNvbSAKKycnJykKKyAgICAgICAgcGFyc2VkX2VudHJpZXMgPSBsaXN0KENo
YW5nZUxvZy5wYXJzZV9lbnRyaWVzX2Zyb21fZmlsZShjaGFuZ2Vsb2dfZmlsZSkpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlZF9lbnRyaWVzWzBdLnJldmlzaW9uKCksIDEwMDAwMCkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VkX2VudHJpZXNbMF0ucmV2aWV3ZXJfdGV4
dCgpLCAiWm9sdGFuIEhlcmN6ZWciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZWRf
ZW50cmllc1swXS5hdXRob3JfbmFtZSgpLCB1IkNzYWJhIE9zenRyb2dvblx1MDBlMWMiKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZWRfZW50cmllc1swXS5hdXRob3JfZW1haWwoKSwg
Im9zc3lAd2Via2l0Lm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlZF9lbnRy
aWVzWzFdLnJldmlzaW9uKCksIDkzNzk4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJz
ZWRfZW50cmllc1sxXS5hdXRob3JfbmFtZSgpLCAiQWxleGV5IFByb3NrdXJ5YWtvdiIpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlZF9lbnRyaWVzWzJdLnJldmlzaW9uKCksIDk5MTkw
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZWRfZW50cmllc1syXS5hdXRob3JfbmFt
ZSgpLCAiQW5kcmVhcyBLbGluZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlZF9l
bnRyaWVzWzNdLnJldmlzaW9uKCksIDk5MTg3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhw
YXJzZWRfZW50cmllc1szXS5hdXRob3JfbmFtZSgpLCAiQW5kcmVhcyBLbGluZyIpCisKICAgICBk
ZWYgX2Fzc2VydF9wYXJzZV9yZXZpZXdlcl90ZXh0X2FuZF9saXN0KHNlbGYsIHRleHQsIGV4cGVj
dGVkX3Jldmlld2VyX3RleHQsIGV4cGVjdGVkX3Jldmlld2VyX3RleHRfbGlzdD1Ob25lKToKICAg
ICAgICAgcmV2aWV3ZXJfdGV4dCwgcmV2aWV3ZXJfdGV4dF9saXN0ID0gQ2hhbmdlTG9nRW50cnku
X3BhcnNlX3Jldmlld2VyX3RleHQodGV4dCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmV2
aWV3ZXJfdGV4dCwgZXhwZWN0ZWRfcmV2aWV3ZXJfdGV4dCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L3NjbS9naXQucHkgYi9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY20vZ2l0LnB5CmluZGV4IGQ0ODU1NzRlMDk4MWJh
MjkzZmQ1NDI1YTg4MzczOWNiNDc1NWRmZDYuLjdjMjNiZTA1NjVjMzE5Mzc0YzNmMTc3YjE2NjJl
OTQwYzAyYmZlZGEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2No
ZWNrb3V0L3NjbS9naXQucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hl
Y2tvdXQvc2NtL2dpdC5weQpAQCAtNDAxLDYgKzQwMSw5IEBAIGNsYXNzIEdpdChTQ00sIFNWTlJl
cG9zaXRvcnkpOgogICAgIGRlZiBsYXN0X3N2bl9jb21taXRfbG9nKHNlbGYpOgogICAgICAgICBy
ZXR1cm4gc2VsZi5ydW4oWydnaXQnLCAnc3ZuJywgJ2xvZycsICctLWxpbWl0PTEnXSkKIAorICAg
IGRlZiBzdm5fYmxhbWUoc2VsZiwgcGF0aCk6CisgICAgICAgIHJldHVybiBzZWxmLnJ1bihbJ2dp
dCcsICdzdm4nLCAnYmxhbWUnLCBwYXRoXSkKKwogICAgICMgR2l0LXNwZWNpZmljIG1ldGhvZHM6
CiAgICAgZGVmIF9icmFuY2hfcmVmX2V4aXN0cyhzZWxmLCBicmFuY2hfcmVmKToKICAgICAgICAg
cmV0dXJuIHNlbGYucnVuKFsnZ2l0JywgJ3Nob3ctcmVmJywgJy0tcXVpZXQnLCAnLS12ZXJpZnkn
LCBicmFuY2hfcmVmXSwgcmV0dXJuX2V4aXRfY29kZT1UcnVlKSA9PSAwCmRpZmYgLS1naXQgYS9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY20vc2NtLnB5IGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtL3NjbS5weQppbmRleCAwMDFiN2U0
MWNjMzM2YTFkOWNjOTk0MDgzYTAzZjVmOWJhMzc0NzY0Li5iMDA0NzBiYmIyNGI3ZmE4NGIyZmE2
ZmY3NDk4MjM4YWUyZTcyY2I0IDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9jaGVja291dC9zY20vc2NtLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL2NoZWNrb3V0L3NjbS9zY20ucHkKQEAgLTIxOCw2ICsyMTgsOSBAQCBjbGFzcyBTQ006CiAg
ICAgZGVmIGxhc3Rfc3ZuX2NvbW1pdF9sb2coc2VsZik6CiAgICAgICAgIHNlbGYuX3N1YmNsYXNz
X211c3RfaW1wbGVtZW50KCkKIAorICAgIGRlZiBzdm5fYmxhbWUoc2VsZiwgcGF0aCk6CisgICAg
ICAgIHNlbGYuX3N1YmNsYXNzX211c3RfaW1wbGVtZW50KCkKKwogICAgICMgU3ViY2xhc3NlcyBt
dXN0IGluZGljYXRlIGlmIHRoZXkgc3VwcG9ydCBsb2NhbCBjb21taXRzLAogICAgICMgYnV0IHRo
ZSBTQ00gYmFzZWNsYXNzIHdpbGwgb25seSBjYWxsIGxvY2FsX2NvbW1pdHMgbWV0aG9kcyB3aGVu
IHRoaXMgaXMgdHJ1ZS4KICAgICBAc3RhdGljbWV0aG9kCmRpZmYgLS1naXQgYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9zY20vc3ZuLnB5IGIvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vY2hlY2tvdXQvc2NtL3N2bi5weQppbmRleCA1NTg3M2MzZWRlOTUwYzhk
ZDllZDc1ZDRlNGE5YzNmNGE3M2EwMjE4Li5jZDRlMWVhNjAyZTQ0MGQ0NDUwMTI0NjQzZDJlNmMy
Zjc1OGFhYTY4IDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVj
a291dC9zY20vc3ZuLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNr
b3V0L3NjbS9zdm4ucHkKQEAgLTM1MCw2ICszNTAsOSBAQCBjbGFzcyBTVk4oU0NNLCBTVk5SZXBv
c2l0b3J5KToKICAgICAgICAgIyBodHRwOi8vc3ZuYm9vay5yZWQtYmVhbi5jb20vZW4vMS4wL2No
MDNzMDMuaHRtbAogICAgICAgICByZXR1cm4gc2VsZi5zdm5fY29tbWl0X2xvZygnQkFTRScpCiAK
KyAgICBkZWYgc3ZuX2JsYW1lKHNlbGYsIHBhdGgpOgorICAgICAgICByZXR1cm4gc2VsZi5fcnVu
X3N2bihbJ2JsYW1lJywgcGF0aF0pCisKICAgICBkZWYgcHJvcHNldChzZWxmLCBwbmFtZSwgcHZh
bHVlLCBwYXRoKToKICAgICAgICAgZGlyLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQogICAg
ICAgICByZXR1cm4gc2VsZi5fcnVuX3N2bihbJ3BzZXQnLCBwbmFtZSwgcHZhbHVlLCBiYXNlXSwg
Y3dkPWRpcikKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NvbmZp
Zy9jb21taXR0ZXJzLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL2Nv
bW1pdHRlcnMucHkKaW5kZXggMDZiZGJlMmFiMTA5NzRjMmU3YjY2MmU2MDExNDU3MjBjZGU2ODZj
MS4uMzFhODk1MDRhM2FkZjQzM2JmMDI2M2IwNjlhZDRmMTQzMjk5Nzk5YSAxMDA2NDQKLS0tIGEv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL2NvbW1pdHRlcnMucHkKKysrIGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL2NvbW1pdHRlcnMucHkKQEAgLTU5
NCwxOSArNTk0LDE5IEBAIGNsYXNzIENvbW1pdHRlckxpc3Qob2JqZWN0KToKICAgICAgICAgcmV0
dXJuIGNvbnRyaWJ1dG9yV2l0aE1pbkRpc3RhbmNlLCBtaW5EaXN0YW5jZQogCiAgICAgZGVmIGFj
Y291bnRfYnlfbG9naW4oc2VsZiwgbG9naW4pOgotICAgICAgICByZXR1cm4gc2VsZi5fbG9naW5f
dG9fYWNjb3VudF9tYXAoKS5nZXQobG9naW4ubG93ZXIoKSkKKyAgICAgICAgcmV0dXJuIHNlbGYu
X2xvZ2luX3RvX2FjY291bnRfbWFwKCkuZ2V0KGxvZ2luLmxvd2VyKCkpIGlmIGxvZ2luIGVsc2Ug
Tm9uZQogCiAgICAgZGVmIGFjY291bnRfYnlfZW1haWwoc2VsZiwgZW1haWwpOgotICAgICAgICBy
ZXR1cm4gc2VsZi5fZW1haWxfdG9fYWNjb3VudF9tYXAoKS5nZXQoZW1haWwubG93ZXIoKSkKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX2VtYWlsX3RvX2FjY291bnRfbWFwKCkuZ2V0KGVtYWlsLmxvd2Vy
KCkpIGlmIGVtYWlsIGVsc2UgTm9uZQogCiAgICAgZGVmIGNvbnRyaWJ1dG9yX2J5X25hbWUoc2Vs
ZiwgbmFtZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9uYW1lX3RvX2NvbnRyaWJ1dG9yX21hcCgp
LmdldChuYW1lLmxvd2VyKCkpCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lX3RvX2NvbnRyaWJ1
dG9yX21hcCgpLmdldChuYW1lLmxvd2VyKCkpIGlmIG5hbWUgZWxzZSBOb25lCiAKICAgICBkZWYg
Y29udHJpYnV0b3JfYnlfZW1haWwoc2VsZiwgZW1haWwpOgotICAgICAgICByZXR1cm4gc2VsZi5f
Y29udHJpYnV0b3Jfb25seShzZWxmLmFjY291bnRfYnlfZW1haWwoZW1haWwpKQorICAgICAgICBy
ZXR1cm4gc2VsZi5fY29udHJpYnV0b3Jfb25seShzZWxmLmFjY291bnRfYnlfZW1haWwoZW1haWwp
KSBpZiBlbWFpbCBlbHNlIE5vbmUKIAogICAgIGRlZiBjb21taXR0ZXJfYnlfZW1haWwoc2VsZiwg
ZW1haWwpOgotICAgICAgICByZXR1cm4gc2VsZi5fY29tbWl0dGVyX29ubHkoc2VsZi5hY2NvdW50
X2J5X2VtYWlsKGVtYWlsKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbW1pdHRlcl9vbmx5KHNl
bGYuYWNjb3VudF9ieV9lbWFpbChlbWFpbCkpIGlmIGVtYWlsIGVsc2UgTm9uZQogCiAgICAgZGVm
IHJldmlld2VyX2J5X2VtYWlsKHNlbGYsIGVtYWlsKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX3Jl
dmlld2VyX29ubHkoc2VsZi5hY2NvdW50X2J5X2VtYWlsKGVtYWlsKSkKKyAgICAgICAgcmV0dXJu
IHNlbGYuX3Jldmlld2VyX29ubHkoc2VsZi5hY2NvdW50X2J5X2VtYWlsKGVtYWlsKSkgaWYgZW1h
aWwgZWxzZSBOb25lCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9j
b25maWcvY29udHJpYnV0aW9uYXJlYXMucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9jb25maWcvY29udHJpYnV0aW9uYXJlYXMucHkKaW5kZXggNmRlZDI0ZDcxOGZiZGE2NjMyOWRh
ZGEwYzNlZjBhZWYwNWMxNmFlYy4uYjQ4ZGYyYTU1YjRkMmY1YWUyMjcyZDU2ZTg1NjlhNGI3Mzk2
NGVkMyAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL2Nv
bnRyaWJ1dGlvbmFyZWFzLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2Nv
bmZpZy9jb250cmlidXRpb25hcmVhcy5weQpAQCAtMTc3LDYgKzE3Nyw5IEBAIGNsYXNzIENvbnRy
aWJ1dGlvbkFyZWFzKG9iamVjdCk6CiAgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0gPSBmaWxlc3lz
dGVtCiAgICAgICAgIHNlbGYuX2NvbnRyaWJ1dGlvbl9hcmVhcyA9IHRhYmxlCiAKKyAgICBkZWYg
bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbYXJlYS5uYW1lKCkgZm9yIGFyZWEgaW4gc2Vs
Zi5fY29udHJpYnV0aW9uX2FyZWFzXQorCiAgICAgZGVmIF9zcGxpdF9wYXRoKHNlbGYsIHBhdGgp
OgogICAgICAgICByZXN1bHQgPSBbXQogICAgICAgICB3aGlsZSBwYXRoIGFuZCBsZW4ocGF0aCk6
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116271</attachid>
            <date>2011-11-22 13:48:47 -0800</date>
            <delta_ts>2011-11-22 15:16:45 -0800</delta_ts>
            <desc>Initial patch</desc>
            <filename>bug-72243-20111122134846.patch</filename>
            <type>text/plain</type>
            <size>42989</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAwODcyCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggMDM3OTlkMDU0ZDFkZTE1M2MzZmE5YzM2N2U2OTAzNDE3
ZmFhODdiZS4uZDNmNGQwZjg3ZDBjMzlkZTkyNmI5ZWU5NjIzYzIyYWJlZjk0Y2VjYSAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI5
IEBACisyMDExLTExLTIyICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAg
ICAgIEFkZCBhIHRvb2wgdG8gYW5hbHl6ZSBjaGFuZ2UgbG9ncworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyNDMKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRp
b24gb2YgYW5hbHl6ZS1jaGFuZ2Vsb2cgY29tbWFuZC4gVGhpcyB2ZXJzaW9uIHN1cHBvcnRzIHBh
cnNpbmcgbXVsdGlwbGUgY2hhbmdlbG9ncworICAgICAgICBpbiBhIHNpbmdsZSBkaXJlY3Rvcnkg
YW5kIHN1bW1hcml6ZXMgdGhlIHJlc3VsdCBpbiBqc29uIGZpbGVzLiBJdCBhbHNvIGNvcGllcyBz
dW1tYXJ5Lmh0bWwgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgICAgZm9yIHZpc3VhbGl6
aW5nIGpzb24gZmlsZXMuCisKKyAgICAgICAgVXNhZ2U6IHdlYmtpdC1wYXRjaCBhbmFseXplLWNo
YW5nZWxvZyBbLS1jaGFuZ2Vsb2ctY291bnQgTl0gPENIQU5HRUxPR19ESVI+IDxPVVRQVVRfRElS
PgorICAgICAgICB3aGVyZSBDSEFOR0VMT0dfRElSIGlzIHRoZSBkaXJlY3RvcnkgdG8gbG9vayBm
b3IgY2hhbmdlbG9ncywgT1VUUFVUX0RJUiBpcyB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhl
IHRvb2wKKyAgICAgICAgZ2VuZXJhdGVzIGpzb24gZmlsZXMsIGFuZCBOIGlzIHRoZSBudW1iZXIg
b2YgY2hhbmdlbG9ncyB0byBwYXJzZS4KKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29t
bW9uL2NoZWNrb3V0L2NoYW5nZWxvZy5weTogRml4ZWQgYSBidWcgdGhhdCB0aGUgbGFzdCBlbnRy
eSBpbiBhIGNoYW5nZWxvZyB3aXRob3V0IHJvbGxvdmVyCisgICAgICAgIGlzIG5ldmVyIHlpZWxk
ZWQuIEFsc28gcmVhZCB0aGUgcm9sbG92ZXIgZW50cnkgZXhwbGljaXRseS4KKyAgICAgICAgKiBT
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9jaGFuZ2Vsb2dfdW5pdHRlc3QucHk6IEFk
ZGVkIGEgdGVzdCBmb3IgdGhlIGFib3ZlIGNoYW5nZS4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9jb25maWcvY29udHJpYnV0aW9uYXJlYXMucHk6IEFkZGVkIG5hbWVzKCkuCisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1fbW9jay5w
eTogQWRkZWQgcmVhZGxpbmUgYW5kIGl0ZXJhdG9yIHN1cHBvcnQgdG8gUmVhZGFibGVUZXh0Rmls
ZU9iamVjdC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0
X18ucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2FuYWx5emVj
aGFuZ2Vsb2cucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21t
YW5kcy9hbmFseXplY2hhbmdlbG9nX3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvZGF0YS9zdW1tYXJ5Lmh0bWw6IEFkZGVkLgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9vcHRpb25zLnB5OgorCiAyMDExLTEx
LTE5ICBPamFuIFZhZmFpICA8b2phbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgRml4IGpzb25w
IGNhbGxiYWNrIGNvZGUgdG8gYWRkIHRoZSBjYWxsYmFjayBpZiBqc29uIGNvbnRlbnQKZGlmZiAt
LWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L2NoYW5nZWxvZy5w
eSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L2NoYW5nZWxvZy5weQpp
bmRleCAyZjZjMzNiODAzZTcyOGNhYjM5NjllMGI5ZTUwY2JjMmI0YTk2YzQyLi43ZThhNTI5MDNl
ZTY2ZjQxZDU3ZmUyZjcxMGM0YTgzYjk2OWFiYzQxIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9jaGFuZ2Vsb2cucHkKKysrIGIvVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvY2hhbmdlbG9nLnB5CkBAIC0xMTAsMTAgKzExMCwx
OSBAQCBjbGFzcyBDaGFuZ2VMb2dFbnRyeShvYmplY3QpOgogICAgICMgZS5nLiBnaXQtc3ZuLWlk
OiBodHRwOi8vc3ZuLndlYmtpdC5vcmcvcmVwb3NpdG9yeS93ZWJraXQvdHJ1bmtAOTYxNjEgMjY4
ZjQ1Y2MtY2QwOS0wNDEwLWFiM2MtZDUyNjkxYjRkYmZjCiAgICAgc3ZuX2lkX3JlZ2V4cCA9IHIn
Z2l0LXN2bi1pZDogaHR0cDovL3N2bi53ZWJraXQub3JnL3JlcG9zaXRvcnkvd2Via2l0L3RydW5r
QCg/UDxzdm5pZD5cZCspICcKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250ZW50cywgY29t
bWl0dGVyX2xpc3Q9Q29tbWl0dGVyTGlzdCgpKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29u
dGVudHMsIGNvbW1pdHRlcl9saXN0PUNvbW1pdHRlckxpc3QoKSwgaXNfcm9sbG92ZXI9RmFsc2Up
OgogICAgICAgICBzZWxmLl9jb250ZW50cyA9IGNvbnRlbnRzCiAgICAgICAgIHNlbGYuX2NvbW1p
dHRlcl9saXN0ID0gY29tbWl0dGVyX2xpc3QKLSAgICAgICAgc2VsZi5fcGFyc2VfZW50cnkoKQor
ICAgICAgICBzZWxmLl9pc19yb2xsb3ZlciA9IGlzX3JvbGxvdmVyCisgICAgICAgIGlmIGlzX3Jv
bGxvdmVyOgorICAgICAgICAgICAgc2VsZi5fYXV0aG9yID0gTm9uZQorICAgICAgICAgICAgc2Vs
Zi5fYXV0aG9yX25hbWUgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9hdXRob3JfZW1haWwgPSBO
b25lCisgICAgICAgICAgICBzZWxmLl9yZXZpZXdlcl90ZXh0ID0gTm9uZQorICAgICAgICAgICAg
c2VsZi5fcmV2aWV3ZXJzID0gW10KKyAgICAgICAgICAgIHNlbGYuX3RvdWNoZWRfZmlsZXMgPSBb
XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcGFyc2VfZW50cnkoKQogCiAgICAg
QHN0YXRpY21ldGhvZAogICAgIGRlZiBfcGFyc2VfcmV2aWV3ZXJfdGV4dCh0ZXh0KToKQEAgLTE2
Nyw2ICsxNzYsOSBAQCBjbGFzcyBDaGFuZ2VMb2dFbnRyeShvYmplY3QpOgogCiAgICAgICAgIHNl
bGYuX3RvdWNoZWRfZmlsZXMgPSByZS5maW5kYWxsKHNlbGYudG91Y2hlZF9maWxlc19yZWdleHAs
IHNlbGYuX2NvbnRlbnRzLCByZS5NVUxUSUxJTkUpCiAKKyAgICBkZWYgaXNfcm9sbG92ZXIoc2Vs
Zik6CisgICAgICAgIHJldHVybiBzZWxmLl9pc19yb2xsb3ZlcgorCiAgICAgZGVmIGF1dGhvcl9u
YW1lKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fYXV0aG9yX25hbWUKIApAQCAtMjQ0LDIx
ICsyNTYsMzEgQEAgY2xhc3MgQ2hhbmdlTG9nKG9iamVjdCk6CiAgICAgICAgIHRvIHBhc3MgZmls
ZSBvYmplY3RzIHRvIHRoaXMgY2xhc3MuIiIiCiAgICAgICAgIGRhdGVfbGluZV9yZWdleHAgPSBy
ZS5jb21waWxlKENoYW5nZUxvZ0VudHJ5LmRhdGVfbGluZV9yZWdleHApCiAgICAgICAgIHJvbGxl
ZF9vdmVyX3JlZ2V4cCA9IHJlLmNvbXBpbGUoQ2hhbmdlTG9nRW50cnkucm9sbGVkX292ZXJfcmVn
ZXhwKQotICAgICAgICBlbnRyeV9saW5lcyA9IFtdCisKICAgICAgICAgIyBUaGUgZmlyc3QgbGlu
ZSBzaG91bGQgYmUgYSBkYXRlIGxpbmUuCiAgICAgICAgIGZpcnN0X2xpbmUgPSBjaGFuZ2Vsb2df
ZmlsZS5yZWFkbGluZSgpCiAgICAgICAgIGFzc2VydChpc2luc3RhbmNlKGZpcnN0X2xpbmUsIHVu
aWNvZGUpKQogICAgICAgICBpZiBub3QgZGF0ZV9saW5lX3JlZ2V4cC5tYXRjaChmaXJzdF9saW5l
KToKICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLSAgICAgICAgZW50cnlfbGluZXMu
YXBwZW5kKGZpcnN0X2xpbmUpCiAKKyAgICAgICAgZW50cnlfbGluZXMgPSBbZmlyc3RfbGluZV0K
KyAgICAgICAgaGFzX3JvbGxvdmVyID0gRmFsc2UKICAgICAgICAgZm9yIGxpbmUgaW4gY2hhbmdl
bG9nX2ZpbGU6Ci0gICAgICAgICAgICBpZiBkYXRlX2xpbmVfcmVnZXhwLm1hdGNoKGxpbmUpIG9y
IHJvbGxlZF9vdmVyX3JlZ2V4cC5tYXRjaChsaW5lKToKKyAgICAgICAgICAgIGlmIHJvbGxlZF9v
dmVyX3JlZ2V4cC5tYXRjaChsaW5lKToKKyAgICAgICAgICAgICAgICBoYXNfcm9sbG92ZXIgPSBU
cnVlCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgaWYgZGF0ZV9saW5lX3Jl
Z2V4cC5tYXRjaChsaW5lKToKICAgICAgICAgICAgICAgICAjIFJlbW92ZSB0aGUgZXh0cmEgbmV3
bGluZSBhdCB0aGUgZW5kCiAgICAgICAgICAgICAgICAgeWllbGQgQ2hhbmdlTG9nRW50cnkoJycu
am9pbihlbnRyeV9saW5lc1s6LTFdKSkKICAgICAgICAgICAgICAgICBlbnRyeV9saW5lcyA9IFtd
CisKICAgICAgICAgICAgIGVudHJ5X2xpbmVzLmFwcGVuZChsaW5lKQogCisgICAgICAgIHlpZWxk
IENoYW5nZUxvZ0VudHJ5KCcnLmpvaW4oZW50cnlfbGluZXNbOi0xXSkpCisgICAgICAgIGlmIGhh
c19yb2xsb3ZlcjoKKyAgICAgICAgICAgIHlpZWxkIENoYW5nZUxvZ0VudHJ5KGxpbmUsIGlzX3Jv
bGxvdmVyPVRydWUpCisKICAgICBkZWYgbGF0ZXN0X2VudHJ5KHNlbGYpOgogICAgICAgICAjIENo
YW5nZUxvZyBmaWxlcyBhcmUgYWx3YXlzIFVURi04LCB3ZSByZWFkIHRoZW0gaW4gYXMgc3VjaCB0
byBzdXBwb3J0IFJldmlld2VycyB3aXRoIHVuaWNvZGUgaW4gdGhlaXIgbmFtZXMuCiAgICAgICAg
IGNoYW5nZWxvZ19maWxlID0gY29kZWNzLm9wZW4oc2VsZi5wYXRoLCAiciIsICJ1dGYtOCIpCmRp
ZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9jaGFuZ2Vs
b2dfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jaGVja291dC9j
aGFuZ2Vsb2dfdW5pdHRlc3QucHkKaW5kZXggYjg4MzcwYTdkYjUxZTkwNTcxYzFlNTQ4OTI4NzY5
Njk2MmU4ODljZi4uZGQxNWMzMzVhODhmMDlkMTNmNGY2MTkxOWJhNTgzY2U5MjVkYzlhOCAxMDA2
NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvY2hhbmdlbG9n
X3VuaXR0ZXN0LnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0
L2NoYW5nZWxvZ191bml0dGVzdC5weQpAQCAtMjM3LDcgKzIzNyw3IEBAIGNsYXNzIENoYW5nZUxv
Z1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3BhcnNlX2xvZ19lbnRyaWVz
X2Zyb21fY2hhbmdlbG9nKHNlbGYpOgogICAgICAgICBjaGFuZ2Vsb2dfZmlsZSA9IFN0cmluZ0lP
KHNlbGYuX2V4YW1wbGVfY2hhbmdlbG9nKQogICAgICAgICBwYXJzZWRfZW50cmllcyA9IGxpc3Qo
Q2hhbmdlTG9nLnBhcnNlX2VudHJpZXNfZnJvbV9maWxlKGNoYW5nZWxvZ19maWxlKSkKLSAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHBhcnNlZF9lbnRyaWVzKSwgOSkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbHMobGVuKHBhcnNlZF9lbnRyaWVzKSwgMTApCiAgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKHBhcnNlZF9lbnRyaWVzWzBdLnJldmlld2VyX3RleHQoKSwgIkRhdmlkIExldmlu
IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VkX2VudHJpZXNbMV0uYXV0aG9yX2Vt
YWlsKCksICJkZGtpbHplckBhcHBsZS5jb20iKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhw
YXJzZWRfZW50cmllc1syXS5yZXZpZXdlcl90ZXh0KCksICJNYXJrIFJvd2UiKQpAQCAtMjUwLDYg
KzI1MCw0OCBAQCBjbGFzcyBDaGFuZ2VMb2dUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VkX2VudHJpZXNbNl0ucmV2aWV3ZXJfdGV4dCgpLCAi
VG9ueSBDaGFuZyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlZF9lbnRyaWVzWzdd
LnJldmlld2VyX3RleHQoKSwgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2Vk
X2VudHJpZXNbOF0ucmV2aWV3ZXJfdGV4dCgpLCAnRGFyaW4gQWRsZXInKQorICAgICAgICBzZWxm
LmFzc2VydFRydWUocGFyc2VkX2VudHJpZXNbOV0uaXNfcm9sbG92ZXIoKSkKKworICAgIGRlZiB0
ZXN0X3BhcnNlX2xvZ19lbnRyaWVzX3dpdGhvdXRfcm9sbG92ZXIoc2VsZik6CisgICAgICAgIGNo
YW5nZWxvZ19maWxlID0gU3RyaW5nSU8odScnJzIwMTEtMTEtMTEgIENzYWJhIE9zenRyb2dvblx1
MDBlMWMgIDxvc3N5QHdlYmtpdC5vcmc+CisKKyAgICAgICAgMTAwLDAwMCAhISEKKworICAgICAg
ICBSZXZpZXdlZCBieSBab2x0YW4gSGVyY3plZy4KKworICAgICAgICAqIENoYW5nZUxvZzogUG9p
bnQgb3V0IHJldmlzaW9uIDEwMCwwMDAuCisKKzIwMTEtMDgtMjUgIEFsZXhleSBQcm9za3VyeWFr
b3YgIDxhcEBhcHBsZS5jb20+CisKKyAgICAgICAgRml4IGJ1aWxkIHdoZW4gR0NDIDQuMiBpcyBu
b3QgaW5zdGFsbGVkLgorCisgICAgICAgICogZ3Rlc3QveGNvZGUvQ29uZmlnL0NvbXBpbGVyVmVy
c2lvbi54Y2NvbmZpZzogQ29waWVkIGZyb20gU291cmNlL1dlYkNvcmUvQ29uZmlndXJhdGlvbnMv
Q29tcGlsZXJWZXJzaW9uLnhjY29uZmlnLgorICAgICAgICAqIGd0ZXN0L3hjb2RlL0NvbmZpZy9H
ZW5lcmFsLnhjY29uZmlnOgorICAgICAgICBVc2UgdGhlIHNhbWUgY29tcGlsZXIgdmVyc2lvbiBh
cyBvdGhlciBwcm9qZWN0cyBkby4KKworMjAxMS0xMS0wMyAgQW5kcmVhcyBLbGluZyAgPGtsaW5n
QHdlYmtpdC5vcmc+CisKKyAgICAgICAgVW5yZXZpZXdlZCBidWlsZCBmaXgsIHNpZ2guCisKKyAg
ICAgICAgKiBjc3MvQ1NTRm9udEZhY2VSdWxlLmg6CisgICAgICAgICogY3NzL0NTU011dGFibGVT
dHlsZURlY2xhcmF0aW9uLmg6CisKKzIwMTEtMTEtMDMgIEFuZHJlYXMgS2xpbmcgIDxrbGluZ0B3
ZWJraXQub3JnPgorCisgICAgICAgIFVucmV2aWV3ZWQgYnVpbGQgZml4LCBvdXQtb2YtbGluZSBT
dHlsZVNoZWV0OjpwYXJlbnRTdHlsZVNoZWV0KCkKKyAgICAgICAgYWdhaW4gc2luY2UgdGhlcmUn
cyBhIGN5Y2xlIGluIHRoZSBpbmNsdWRlcyBiZXR3ZWVuIENTU1J1bGUvU3R5bGVTaGVldC4KKwor
ICAgICAgICAqIGNzcy9TdHlsZVNoZWV0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlU2hl
ZXQ6OnBhcmVudFN0eWxlU2hlZXQpOgorICAgICAgICAqIGNzcy9TdHlsZVNoZWV0Lmg6CisnJycp
CisgICAgICAgIHBhcnNlZF9lbnRyaWVzID0gbGlzdChDaGFuZ2VMb2cucGFyc2VfZW50cmllc19m
cm9tX2ZpbGUoY2hhbmdlbG9nX2ZpbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJz
ZWRfZW50cmllc1swXS5yZXZpZXdlcl90ZXh0KCksICJab2x0YW4gSGVyY3plZyIpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlZF9lbnRyaWVzWzBdLmF1dGhvcl9uYW1lKCksIHUiQ3Nh
YmEgT3N6dHJvZ29uXHUwMGUxYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlZF9l
bnRyaWVzWzBdLmF1dGhvcl9lbWFpbCgpLCAib3NzeUB3ZWJraXQub3JnIikKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbHMocGFyc2VkX2VudHJpZXNbMV0uYXV0aG9yX25hbWUoKSwgIkFsZXhleSBQ
cm9za3VyeWFrb3YiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZWRfZW50cmllc1sy
XS5hdXRob3JfbmFtZSgpLCAiQW5kcmVhcyBLbGluZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWxzKHBhcnNlZF9lbnRyaWVzWzNdLmF1dGhvcl9uYW1lKCksICJBbmRyZWFzIEtsaW5nIikKIAog
ICAgIGRlZiBfYXNzZXJ0X3BhcnNlX3Jldmlld2VyX3RleHRfYW5kX2xpc3Qoc2VsZiwgdGV4dCwg
ZXhwZWN0ZWRfcmV2aWV3ZXJfdGV4dCwgZXhwZWN0ZWRfcmV2aWV3ZXJfdGV4dF9saXN0PU5vbmUp
OgogICAgICAgICByZXZpZXdlcl90ZXh0LCByZXZpZXdlcl90ZXh0X2xpc3QgPSBDaGFuZ2VMb2dF
bnRyeS5fcGFyc2VfcmV2aWV3ZXJfdGV4dCh0ZXh0KQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vY29uZmlnL2NvbnRyaWJ1dGlvbmFyZWFzLnB5IGIvVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL2NvbnRyaWJ1dGlvbmFyZWFzLnB5CmluZGV4IDZk
ZWQyNGQ3MThmYmRhNjYzMjlkYWRhMGMzZWYwYWVmMDVjMTZhZWMuLmI0OGRmMmE1NWI0ZDJmNWFl
MjI3MmQ1NmU4NTY5YTRiNzM5NjRlZDMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL2NvbmZpZy9jb250cmlidXRpb25hcmVhcy5weQorKysgYi9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9jb25maWcvY29udHJpYnV0aW9uYXJlYXMucHkKQEAgLTE3Nyw2ICsx
NzcsOSBAQCBjbGFzcyBDb250cmlidXRpb25BcmVhcyhvYmplY3QpOgogICAgICAgICBzZWxmLl9m
aWxlc3lzdGVtID0gZmlsZXN5c3RlbQogICAgICAgICBzZWxmLl9jb250cmlidXRpb25fYXJlYXMg
PSB0YWJsZQogCisgICAgZGVmIG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gW2FyZWEubmFt
ZSgpIGZvciBhcmVhIGluIHNlbGYuX2NvbnRyaWJ1dGlvbl9hcmVhc10KKwogICAgIGRlZiBfc3Bs
aXRfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAgd2hpbGUg
cGF0aCBhbmQgbGVuKHBhdGgpOgpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1fbW9jay5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y29tbW9uL3N5c3RlbS9maWxlc3lzdGVtX21vY2sucHkKaW5kZXggNTdkY2UzZGI3M2I2ZDMyZGE1
YWRkMjFkNzEwMmE5NTU5Yzg1MWFlMS4uZjNhMWQ0NTQ3OWU0MmMzZGEwNGExNzdlZGY2OTAxNGY5
ZDZmMjM2ZiAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVt
L2ZpbGVzeXN0ZW1fbW9jay5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9z
eXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5CkBAIC0yODAsNyArMjgwLDcgQEAgY2xhc3MgTW9ja0Zp
bGVTeXN0ZW0ob2JqZWN0KToKICAgICBkZWYgb3Blbl90ZXh0X2ZpbGVfZm9yX3JlYWRpbmcoc2Vs
ZiwgcGF0aCk6CiAgICAgICAgIGlmIHNlbGYuZmlsZXNbcGF0aF0gaXMgTm9uZToKICAgICAgICAg
ICAgIHNlbGYuX3JhaXNlX25vdF9mb3VuZChwYXRoKQotICAgICAgICByZXR1cm4gUmVhZGFibGVU
ZXh0RmlsZU9iamVjdChzZWxmLCBwYXRoKQorICAgICAgICByZXR1cm4gUmVhZGFibGVUZXh0Rmls
ZU9iamVjdChzZWxmLCBwYXRoLCBzZWxmLmZpbGVzW3BhdGhdKQogCiAgICAgZGVmIG9wZW5fdGV4
dF9maWxlX2Zvcl93cml0aW5nKHNlbGYsIHBhdGgpOgogICAgICAgICByZXR1cm4gV3JpdGFibGVU
ZXh0RmlsZU9iamVjdChzZWxmLCBwYXRoKQpAQCAtMzgwLDMgKzM4MCwyMiBAQCBjbGFzcyBSZWFk
YWJsZUJpbmFyeUZpbGVPYmplY3Qob2JqZWN0KToKIGNsYXNzIFJlYWRhYmxlVGV4dEZpbGVPYmpl
Y3QoUmVhZGFibGVCaW5hcnlGaWxlT2JqZWN0KToKICAgICBkZWYgcmVhZChzZWxmLCBieXRlcz1O
b25lKToKICAgICAgICAgcmV0dXJuIFJlYWRhYmxlQmluYXJ5RmlsZU9iamVjdC5yZWFkKHNlbGYs
IGJ5dGVzKS5kZWNvZGUoJ3V0Zi04JykKKworICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAg
ICAgaWYgc2VsZi5vZmZzZXQgPj0gbGVuKHNlbGYuZGF0YSk6CisgICAgICAgICAgICByZXR1cm4g
JycKKyAgICAgICAgc3RhcnQgPSBzZWxmLm9mZnNldAorICAgICAgICB3aGlsZSBzZWxmLm9mZnNl
dCA8IGxlbihzZWxmLmRhdGEpOgorICAgICAgICAgICAgaWYgc2VsZi5kYXRhW3NlbGYub2Zmc2V0
XSA9PSAnXG4nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLm9mZnNl
dCArPSAxCisgICAgICAgIHNlbGYub2Zmc2V0ICs9IDEKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0
YVtzdGFydDpzZWxmLm9mZnNldF0uZGVjb2RlKCd1dGYtOCcpCisKKyAgICBkZWYgX19pdGVyX18o
c2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAg
ICAgaWYgc2VsZi5vZmZzZXQgPj0gbGVuKHNlbGYuZGF0YSk6CisgICAgICAgICAgICByYWlzZSBT
dG9wSXRlcmF0aW9uCisgICAgICAgIHJldHVybiBzZWxmLnJlYWRsaW5lKCkKZGlmZiAtLWdpdCBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weSBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQppbmRleCAxYTk4ZGIw
ZDQ4NmE1ZGVkNmYxODFjM2I4MWQwMTE1NGNjZWQ4NjY1Li5lZjA1YjVhYzRiZWRkYWZlZGI1YmZj
MjQ1ZjYzOTMxNGY4ODE0MDY3IDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvY29tbWFuZHMvX19pbml0X18ucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29s
L2NvbW1hbmRzL19faW5pdF9fLnB5CkBAIC0xLDYgKzEsNyBAQAogIyBSZXF1aXJlZCBmb3IgUHl0
aG9uIHRvIHNlYXJjaCB0aGlzIGRpcmVjdG9yeSBmb3IgbW9kdWxlIGZpbGVzCiAKIGZyb20gd2Vi
a2l0cHkudG9vbC5jb21tYW5kcy5hZGR1c2Vyc3RvZ3JvdXBzIGltcG9ydCBBZGRVc2Vyc1RvR3Jv
dXBzCitmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuYW5hbHl6ZWNoYW5nZWxvZyBpbXBvcnQg
QW5hbHl6ZUNoYW5nZUxvZwogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLmFwcGx5d2F0Y2hs
aXN0bG9jYWwgaW1wb3J0IEFwcGx5V2F0Y2hMaXN0TG9jYWwKIGZyb20gd2Via2l0cHkudG9vbC5j
b21tYW5kcy5idWdmb3J0ZXN0IGltcG9ydCBCdWdGb3JUZXN0CiBmcm9tIHdlYmtpdHB5LnRvb2wu
Y29tbWFuZHMuYnVnc2VhcmNoIGltcG9ydCBCdWdTZWFyY2gKZGlmZiAtLWdpdCBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9hbmFseXplY2hhbmdlbG9nLnB5IGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2FuYWx5emVjaGFuZ2Vsb2cucHkKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uYWJkMDVjMTljOWMyMTlhMzZhZTRjMjk2M2E4NzhmMDNmYTczYWI0YQotLS0gL2Rldi9u
dWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9hbmFseXplY2hh
bmdlbG9nLnB5CkBAIC0wLDAgKzEsMjE0IEBACisjIENvcHlyaWdodCAoYykgMjAxMSBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9m
IEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisj
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisj
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IGpz
b24KK2ltcG9ydCByZQorZnJvbSB0aW1lIGltcG9ydCB0aW1lCitmcm9tIHdlYmtpdHB5LmNvbW1v
bi5jaGVja291dC5zY20uZGV0ZWN0aW9uIGltcG9ydCBTQ01EZXRlY3RvcgorZnJvbSB3ZWJraXRw
eS5jb21tb24uY2hlY2tvdXQuY2hhbmdlbG9nIGltcG9ydCBDaGFuZ2VMb2cKK2Zyb20gd2Via2l0
cHkuY29tbW9uLmNvbmZpZy5jb250cmlidXRpb25hcmVhcyBpbXBvcnQgQ29udHJpYnV0aW9uQXJl
YXMKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5maWxlc3lzdGVtIGltcG9ydCBGaWxlU3lz
dGVtCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZXhlY3V0aXZlIGltcG9ydCBFeGVjdXRp
dmUKK2Zyb20gd2Via2l0cHkudG9vbC5tdWx0aWNvbW1hbmR0b29sIGltcG9ydCBBYnN0cmFjdERl
Y2xhcmF0aXZlQ29tbWFuZAorZnJvbSB3ZWJraXRweS50b29sIGltcG9ydCBzdGVwcworCisKK2Ns
YXNzIEFuYWx5emVDaGFuZ2VMb2coQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQpOgorICAgIG5h
bWUgPSAiYW5hbHl6ZS1jaGFuZ2Vsb2ciCisgICAgaGVscF90ZXh0ID0gIkV4cGVyaW1lbnRhbCBj
b21tYW5kIGZvciBhbmFseXppbmcgY2hhbmdlIGxvZ3MuIgorICAgIGxvbmdfaGVscCA9ICJUaGlz
IGNvbW1hbmQgcGFyc2VzIGNoYW5nZWxvZ3MgaW4gYSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBz
dW1tYXJpemVzIHRoZSByZXN1bHQgYXMgSlNPTiBmaWxlcy4iCisKKyAgICBkZWYgX19pbml0X18o
c2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbCisgICAgICAgICAgICBzdGVwcy5PcHRpb25zLmNo
YW5nZWxvZ19jb3VudCwKKyAgICAgICAgXQorICAgICAgICBBYnN0cmFjdERlY2xhcmF0aXZlQ29t
bWFuZC5fX2luaXRfXyhzZWxmLCBvcHRpb25zPW9wdGlvbnMpCisKKyAgICBAc3RhdGljbWV0aG9k
CisgICAgZGVmIF9lbnVtZXJhdGVfY2hhbmdlbG9ncyhmaWxlc3lzdGVtLCBkaXJuYW1lLCBjaGFu
Z2Vsb2dfY291bnQpOgorICAgICAgICBjaGFuZ2Vsb2dzID0gW2ZpbGVzeXN0ZW0uam9pbihkaXJu
YW1lLCBmaWxlbmFtZSkgZm9yIGZpbGVuYW1lIGluIGZpbGVzeXN0ZW0ubGlzdGRpcihkaXJuYW1l
KSBpZiByZS5tYXRjaCgnXkNoYW5nZUxvZygtKFxkezR9LVxkezJ9LVxkezJ9KSk/JCcsIGZpbGVu
YW1lKV0KKyAgICAgICAgIyBNYWtlIHN1cmUgQ2hhbmdlTG9nIHNob3dzIHVwIGJlZm9yZSBDaGFu
Z2VMb2ctMjAxMS0wMS0wMQorICAgICAgICBjaGFuZ2Vsb2dzID0gc29ydGVkKGNoYW5nZWxvZ3Ms
IGtleT1sYW1iZGEgZmlsZW5hbWU6IGZpbGVuYW1lICsgJ1gnLCByZXZlcnNlPVRydWUpCisKKyAg
ICAgICAgcmV0dXJuIGNoYW5nZWxvZ3NbOmNoYW5nZWxvZ19jb3VudF0KKworICAgIEBzdGF0aWNt
ZXRob2QKKyAgICBkZWYgX2dlbmVyYXRlX2pzb25zKGZpbGVzeXN0ZW0sIGpzb25fZmlsZXMsIG91
dHB1dF9kaXIpOgorICAgICAgICBmb3IgZmlsZW5hbWUgaW4ganNvbl9maWxlczoKKyAgICAgICAg
ICAgIG91dHB1dF9maWxlID0gZmlsZXN5c3RlbS5vcGVuX3RleHRfZmlsZV9mb3Jfd3JpdGluZyhm
aWxlc3lzdGVtLmpvaW4ob3V0cHV0X2RpciwgZmlsZW5hbWUpKQorICAgICAgICAgICAgdHJ5Ogor
ICAgICAgICAgICAgICAgIHByaW50ICcgICAgR2VuZXJhdGluZycsIGZpbGVuYW1lCisgICAgICAg
ICAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUoanNvbi5kdW1wcyhqc29uX2ZpbGVzW2ZpbGVuYW1l
XSwgaW5kZW50PTIpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvdXRw
dXRfZmlsZS5jbG9zZSgpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBvcHRpb25zLCBhcmdzLCB0
b29sKToKKyAgICAgICAgZmlsZXN5c3RlbSA9IEZpbGVTeXN0ZW0oKQorCisgICAgICAgIGlmIGxl
bihhcmdzKSA8IDEgb3Igbm90IGZpbGVzeXN0ZW0uZXhpc3RzKGFyZ3NbMF0pOgorICAgICAgICAg
ICAgcHJpbnQgIk5lZWQgdGhlIGRpcmVjdG9yeSBuYW1lIHRvIGxvb2sgZm9yIGNoYW5nZWxvZyBh
cyB0aGUgZmlyc3QgYXJndW1lbnQiCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY2hhbmdl
bG9nX2RpciA9IGZpbGVzeXN0ZW0uYWJzcGF0aChhcmdzWzBdKQorCisgICAgICAgIGlmIGxlbihh
cmdzKSA8IDIgb3Igbm90IGZpbGVzeXN0ZW0uZXhpc3RzKGFyZ3NbMV0pOgorICAgICAgICAgICAg
cHJpbnQgIk5lZWQgdGhlIG91dHB1dCBkaXJlY3RvcnkgbmFtZSBhcyB0aGUgZmlyc3QgYXJndW1l
bnQiCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgb3V0cHV0X2RpciA9IGFyZ3NbMV0KKwor
ICAgICAgICBzdGFydFRpbWUgPSB0aW1lKCkKKworICAgICAgICBwcmludCAnRW51bWVyYXRpbmcg
Q2hhbmdlTG9nIGZpbGVzLi4uJworICAgICAgICBjaGFuZ2Vsb2dzID0gQW5hbHl6ZUNoYW5nZUxv
Zy5fZW51bWVyYXRlX2NoYW5nZWxvZ3MoZmlsZXN5c3RlbSwgY2hhbmdlbG9nX2Rpciwgb3B0aW9u
cy5jaGFuZ2Vsb2dfY291bnQpCisKKyAgICAgICAgYW5hbHl6ZXIgPSBDaGFuZ2VMb2dBbmFseXpl
cihmaWxlc3lzdGVtLCBzZWxmLl90b29sLnNjbSgpLCBjaGFuZ2Vsb2dzKQorICAgICAgICBhbmFs
eXplci5hbmFseXplKCkKKworICAgICAgICBwcmludCAnR2VuZXJhdGluZyBqc29uIGZpbGVzLi4u
JworICAgICAgICBqc29uX2ZpbGVzID0geworICAgICAgICAgICAgJ3N1bW1hcnkuanNvbic6IGFu
YWx5emVyLnN1bW1hcnkoKSwKKyAgICAgICAgICAgICdjb250cmlidXRvcnMuanNvbic6IGFuYWx5
emVyLmNvbnRyaWJ1dG9yc19zdGF0aXN0aWNzKCksCisgICAgICAgICAgICAnYXJlYXMuanNvbic6
IGFuYWx5emVyLmFyZWFzX3N0YXRpc3RpY3MoKSwKKyAgICAgICAgfQorICAgICAgICBBbmFseXpl
Q2hhbmdlTG9nLl9nZW5lcmF0ZV9qc29ucyhmaWxlc3lzdGVtLCBqc29uX2ZpbGVzLCBvdXRwdXRf
ZGlyKQorICAgICAgICBjb21tYW5kc19kaXIgPSBmaWxlc3lzdGVtLmRpcm5hbWUoZmlsZXN5c3Rl
bS5hYnNwYXRoKF9fZmlsZV9fKSkKKyAgICAgICAgZmlsZXN5c3RlbS5jb3B5ZmlsZShmaWxlc3lz
dGVtLmpvaW4oY29tbWFuZHNfZGlyLCAnZGF0YS9zdW1tYXJ5Lmh0bWwnKSwgZmlsZXN5c3RlbS5q
b2luKG91dHB1dF9kaXIsICdzdW1tYXJ5Lmh0bWwnKSkKKworICAgICAgICB0aWNrID0gdGltZSgp
IC0gc3RhcnRUaW1lCisgICAgICAgIHByaW50ICdGaW5pc2hlZCBpbiAlMDJkbTolMDJkcycgJSAo
aW50KHRpY2sgLyA2MCksIGludCh0aWNrICUgNjApKQorCisKK2NsYXNzIENoYW5nZUxvZ0FuYWx5
emVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVzeXN0ZW0sIHNjbSwgY2hh
bmdlbG9nX3BhdGhzKToKKyAgICAgICAgc2VsZi5fY2hhbmdlbG9nX3BhdGhzID0gY2hhbmdlbG9n
X3BhdGhzCisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtCisgICAgICAgIHNl
bGYuX2NvbnRyaWJ1dGlvbl9hcmVhcyA9IENvbnRyaWJ1dGlvbkFyZWFzKGZpbGVzeXN0ZW0pCisg
ICAgICAgIHNlbGYuX3NjbSA9IHNjbQorICAgICAgICBzZWxmLl9wYXJzZWRfcmV2aXNpb25zID0g
e30KKworICAgICAgICBzZWxmLl9jb250cmlidXRvcnNfc3RhdGlzdGljcyA9IHt9CisgICAgICAg
IHNlbGYuX2FyZWFzX3N0YXRpc3RpY3MgPSB7fQorICAgICAgICBmb3IgYXJlYSBpbiBzZWxmLl9j
b250cmlidXRpb25fYXJlYXMubmFtZXMoKToKKyAgICAgICAgICAgIHNlbGYuX2FyZWFzX3N0YXRp
c3RpY3NbYXJlYV0gPSB7J3Jldmlld2VkJzogMCwgJ3VucmV2aWV3ZWQnOiAwLCAnY29udHJpYnV0
b3JzJzoge319CisgICAgICAgIHNlbGYuX3N1bW1hcnkgPSB7J3Jldmlld2VkJzogMCwgJ3VucmV2
aWV3ZWQnOiAwfQorCisgICAgICAgIHNlbGYuX2xvbmdlc3RfZmlsZW5hbWUgPSBtYXgoW2xlbihw
YXRoKSAtIGxlbihzZWxmLl9zY20uY2hlY2tvdXRfcm9vdCkgZm9yIHBhdGggaW4gY2hhbmdlbG9n
X3BhdGhzXSkKKyAgICAgICAgc2VsZi5fcHJldmlvdXNfc3RhdHVzID0gJycKKworICAgIGRlZiBj
b250cmlidXRvcnNfc3RhdGlzdGljcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRy
aWJ1dG9yc19zdGF0aXN0aWNzCisKKyAgICBkZWYgYXJlYXNfc3RhdGlzdGljcyhzZWxmKToKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX2FyZWFzX3N0YXRpc3RpY3MKKworICAgIGRlZiBzdW1tYXJ5KHNl
bGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc3VtbWFyeQorCisgICAgZGVmIF9wcmludF9zdGF0
dXMoc2VsZiwgbmV3X3N0YXR1cyk6CisgICAgICAgIHN0YXR1cyA9IG5ld19zdGF0dXMgKyAoJyAn
ICogbWF4KGxlbihzZWxmLl9wcmV2aW91c19zdGF0dXMpIC0gbGVuKG5ld19zdGF0dXMpIC0gMSwg
MCkpCisgICAgICAgIHByaW50ICJcYiIgKiBsZW4oc2VsZi5fcHJldmlvdXNfc3RhdHVzKSArIHN0
YXR1cywKKyAgICAgICAgc2VsZi5fcHJldmlvdXNfc3RhdHVzID0gc3RhdHVzICsgJyAnCisKKyAg
ICBkZWYgX3ByaW50X2ZpbGVuYW1lKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgaWYgc2VsZi5f
cHJldmlvdXNfc3RhdHVzOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgKCclJyAr
IHN0cihzZWxmLl9sb25nZXN0X2ZpbGVuYW1lKSArICdzOicpICUgZmlsZW5hbWUsCisgICAgICAg
IHNlbGYuX3ByZXZpb3VzX3N0YXR1cyA9ICcnCisKKyAgICBkZWYgYW5hbHl6ZShzZWxmKToKKyAg
ICAgICAgZm9yIHBhdGggaW4gc2VsZi5fY2hhbmdlbG9nX3BhdGhzOgorICAgICAgICAgICAgc2Vs
Zi5fcHJpbnRfZmlsZW5hbWUoc2VsZi5fZmlsZXN5c3RlbS5yZWxwYXRoKHBhdGgsIHNlbGYuX3Nj
bS5jaGVja291dF9yb290KSkKKyAgICAgICAgICAgIGNoYW5nZWxvZyA9IHNlbGYuX2ZpbGVzeXN0
ZW0ub3Blbl90ZXh0X2ZpbGVfZm9yX3JlYWRpbmcocGF0aCkKKyAgICAgICAgICAgIHRyeToKKyAg
ICAgICAgICAgICAgICBzZWxmLl9wcmludF9zdGF0dXMoJ1BhcnNpbmcgZW50cmllcy4uLicpCisg
ICAgICAgICAgICAgICAgbnVtYmVyX29mX3BhcnNlZF9lbnRyaWVzID0gc2VsZi5fYW5hbHl6ZV9l
bnRyaWVzKENoYW5nZUxvZy5wYXJzZV9lbnRyaWVzX2Zyb21fZmlsZShjaGFuZ2Vsb2cpLCBwYXRo
KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBjaGFuZ2Vsb2cuY2xvc2Uo
KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfc3RhdHVzKCdEb25lICglZCBlbnRyaWVzKScgJSBu
dW1iZXJfb2ZfcGFyc2VkX2VudHJpZXMpCisgICAgICAgIHByaW50CisgICAgICAgIHNlbGYuX3N1
bW1hcnlbJ2NvbnRyaWJ1dG9ycyddID0gbGVuKHNlbGYuX2NvbnRyaWJ1dG9yc19zdGF0aXN0aWNz
KQorICAgICAgICBzZWxmLl9zdW1tYXJ5Wydjb250cmlidXRvcnNfd2l0aF9yZXZpZXdzJ10gPSBz
dW0oWzEgZm9yIGNvbnRyaWJ1dG9yIGluIHNlbGYuX2NvbnRyaWJ1dG9yc19zdGF0aXN0aWNzLnZh
bHVlcygpIGlmIGNvbnRyaWJ1dG9yWydyZXZpZXdzJ11bJ3RvdGFsJ11dKQorICAgICAgICBzZWxm
Ll9zdW1tYXJ5Wydjb250cmlidXRvcnNfd2l0aG91dF9yZXZpZXdzJ10gPSBzZWxmLl9zdW1tYXJ5
Wydjb250cmlidXRvcnMnXSAtIHNlbGYuX3N1bW1hcnlbJ2NvbnRyaWJ1dG9yc193aXRoX3Jldmll
d3MnXQorCisgICAgZGVmIF9jb2xsZWN0X3N0YXRpc3RpY3NfZm9yX2NvbnRyaWJ1dG9yX2FyZWEo
c2VsZiwgYXJlYSwgY29udHJpYnV0b3IsIGNvbnRyaWJ1dGlvbl90eXBlLCByZXZpZXdlZCk6Cisg
ICAgICAgIGFyZWFfY29udHJpYnV0b3JzID0gc2VsZi5fYXJlYXNfc3RhdGlzdGljc1thcmVhXVsn
Y29udHJpYnV0b3JzJ10KKyAgICAgICAgaWYgY29udHJpYnV0b3Igbm90IGluIGFyZWFfY29udHJp
YnV0b3JzOgorICAgICAgICAgICAgYXJlYV9jb250cmlidXRvcnNbY29udHJpYnV0b3JdID0geydy
ZXZpZXdzJzogMCwgJ3Jldmlld2VkJzogMCwgJ3VucmV2aWV3ZWQnOiAwfQorICAgICAgICBpZiBj
b250cmlidXRpb25fdHlwZSA9PSAncGF0Y2hlcyc6CisgICAgICAgICAgICBjb250cmlidXRpb25f
dHlwZSA9ICdyZXZpZXdlZCcgaWYgcmV2aWV3ZWQgZWxzZSAndW5yZXZpZXdlZCcKKyAgICAgICAg
YXJlYV9jb250cmlidXRvcnNbY29udHJpYnV0b3JdW2NvbnRyaWJ1dGlvbl90eXBlXSArPSAxCisK
KyAgICBkZWYgX2NvbGxlY3Rfc3RhdGlzdGljc19mb3JfY29udHJpYnV0b3Ioc2VsZiwgY29udHJp
YnV0b3IsIGNvbnRyaWJ1dGlvbl90eXBlLCBhcmVhcywgdG91Y2hlZF9maWxlcywgcmV2aWV3ZWQp
OgorICAgICAgICBpZiBjb250cmlidXRvciBub3QgaW4gc2VsZi5fY29udHJpYnV0b3JzX3N0YXRp
c3RpY3M6CisgICAgICAgICAgICBzZWxmLl9jb250cmlidXRvcnNfc3RhdGlzdGljc1tjb250cmli
dXRvcl0gPSB7CisgICAgICAgICAgICAgICAgJ3Jldmlld3MnOiB7J3RvdGFsJzogMCwgJ2FyZWFz
Jzoge30sICdmaWxlcyc6IHt9fSwKKyAgICAgICAgICAgICAgICAncGF0Y2hlcyc6IHsncmV2aWV3
ZWQnOiAwLCAndW5yZXZpZXdlZCc6IDAsICdhcmVhcyc6IHt9LCAnZmlsZXMnOiB7fX19CisgICAg
ICAgIHN0YXRpc3RpY3MgPSBzZWxmLl9jb250cmlidXRvcnNfc3RhdGlzdGljc1tjb250cmlidXRv
cl1bY29udHJpYnV0aW9uX3R5cGVdCisKKyAgICAgICAgaWYgY29udHJpYnV0aW9uX3R5cGUgPT0g
J3Jldmlld3MnOgorICAgICAgICAgICAgc3RhdGlzdGljc1sndG90YWwnXSArPSAxCisgICAgICAg
IGVsaWYgcmV2aWV3ZWQ6CisgICAgICAgICAgICBzdGF0aXN0aWNzWydyZXZpZXdlZCddICs9IDEK
KyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0YXRpc3RpY3NbJ3VucmV2aWV3ZWQnXSArPSAx
CisKKyAgICAgICAgZm9yIGFyZWEgaW4gYXJlYXM6CisgICAgICAgICAgICBzZWxmLl9pbmNyZW1l
bnRfZGljdGlvbmFyeV92YWx1ZShzdGF0aXN0aWNzWydhcmVhcyddLCBhcmVhKQorICAgICAgICAg
ICAgc2VsZi5fY29sbGVjdF9zdGF0aXN0aWNzX2Zvcl9jb250cmlidXRvcl9hcmVhKGFyZWEsIGNv
bnRyaWJ1dG9yLCBjb250cmlidXRpb25fdHlwZSwgcmV2aWV3ZWQpCisgICAgICAgIGZvciB0b3Vj
aGVkZmlsZSBpbiB0b3VjaGVkX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5faW5jcmVtZW50X2Rp
Y3Rpb25hcnlfdmFsdWUoc3RhdGlzdGljc1snZmlsZXMnXSwgdG91Y2hlZGZpbGUpCisKKyAgICBk
ZWYgX2luY3JlbWVudF9kaWN0aW9uYXJ5X3ZhbHVlKHNlbGYsIGRpY3Rpb25hcnksIGtleSk6Cisg
ICAgICAgIGRpY3Rpb25hcnlba2V5XSA9IGRpY3Rpb25hcnkuZ2V0KGtleSwgMCkgKyAxCisKKyAg
ICBkZWYgX2FuYWx5emVfZW50cmllcyhzZWxmLCBlbnRyaWVzLCBjaGFuZ2Vsb2dfcGF0aCk6Cisg
ICAgICAgIGkgPSAwCisgICAgICAgIGRpcm5hbWUgPSBzZWxmLl9maWxlc3lzdGVtLmRpcm5hbWUo
Y2hhbmdlbG9nX3BhdGgpCisgICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICAg
ICAgc2VsZi5fcHJpbnRfc3RhdHVzKCcoJXMpIGVudHJpZXMnICUgaSkKKyAgICAgICAgICAgIGlm
IG5vdCBlbnRyeS5hdXRob3JfbmFtZSgpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAg
ICAgICAgICB0b3VjaGVkZmlsZXNfZm9yX2VudHJ5ID0gW3NlbGYuX2ZpbGVzeXN0ZW0ucmVscGF0
aChzZWxmLl9maWxlc3lzdGVtLmpvaW4oZGlybmFtZSwgbmFtZSksIHNlbGYuX3NjbS5jaGVja291
dF9yb290KSBmb3IgbmFtZSBpbiBlbnRyeS50b3VjaGVkX2ZpbGVzKCldCisgICAgICAgICAgICBh
cmVhc19mb3JfZW50cnkgPSBzZWxmLl9jb250cmlidXRpb25fYXJlYXMuYXJlYXNfZm9yX3RvdWNo
ZWRfZmlsZXModG91Y2hlZGZpbGVzX2Zvcl9lbnRyeSkKKyAgICAgICAgICAgIGF1dGhvcnNfZm9y
X2VudHJ5ID0gWyhlbnRyeS5hdXRob3JfbmFtZSgpLCBlbnRyeS5hdXRob3JfZW1haWwoKSldCisg
ICAgICAgICAgICByZXZpZXdlcnNfZm9yX2VudHJ5ID0gZW50cnkucmV2aWV3ZXJzKCkKKworICAg
ICAgICAgICAgZm9yIHJldmlld2VyIGluIHJldmlld2Vyc19mb3JfZW50cnk6CisgICAgICAgICAg
ICAgICAgc2VsZi5fY29sbGVjdF9zdGF0aXN0aWNzX2Zvcl9jb250cmlidXRvcihyZXZpZXdlci5m
dWxsX25hbWUsICdyZXZpZXdzJywgYXJlYXNfZm9yX2VudHJ5LCB0b3VjaGVkZmlsZXNfZm9yX2Vu
dHJ5LCByZXZpZXdlZD1UcnVlKQorCisgICAgICAgICAgICBmb3IgYXV0aG9yIGluIGF1dGhvcnNf
Zm9yX2VudHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbGxlY3Rfc3RhdGlzdGljc19mb3Jf
Y29udHJpYnV0b3IoYXV0aG9yWzBdLCAncGF0Y2hlcycsIGFyZWFzX2Zvcl9lbnRyeSwgdG91Y2hl
ZGZpbGVzX2Zvcl9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgcmV2aWV3ZWQ9Ym9vbChyZXZp
ZXdlcnNfZm9yX2VudHJ5KSkKKworICAgICAgICAgICAgZm9yIGFyZWEgaW4gYXJlYXNfZm9yX2Vu
dHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2FyZWFzX3N0YXRpc3RpY3NbYXJlYV1bJ3Jldmll
d2VkJyBpZiByZXZpZXdlcnNfZm9yX2VudHJ5IGVsc2UgJ3VucmV2aWV3ZWQnXSArPSAxCisKKyAg
ICAgICAgICAgIHNlbGYuX3N1bW1hcnlbJ3Jldmlld2VkJyBpZiByZXZpZXdlcnNfZm9yX2VudHJ5
IGVsc2UgJ3VucmV2aWV3ZWQnXSArPSAxCisKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBz
ZWxmLl9wcmludF9zdGF0dXMoJyglcykgZW50cmllcycgJSBpKQorICAgICAgICByZXR1cm4gaQpk
aWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2FuYWx5emVj
aGFuZ2Vsb2dfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFu
ZHMvYW5hbHl6ZWNoYW5nZWxvZ191bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kMDVkOGEwYmU1YWFi
MmRlNTU1MzM2YTNiM2JmZjM0MTBmMmRkNTAyCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2FuYWx5emVjaGFuZ2Vsb2dfdW5pdHRlc3QucHkK
QEAgLTAsMCArMSwxMjQgQEAKKyMgQ3B5cmlnaHQgKGMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0Ogor
IworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0
aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
CisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBqc29uCitpbXBvcnQg
c3lzCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5jb25maWcuY29udHJpYnV0aW9uYXJlYXMgaW1wb3J0
IENvbnRyaWJ1dGlvbkFyZWFzCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5ob3N0X21vY2sgaW1wb3J0
IE1vY2tIb3N0Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbV9tb2NrIGlt
cG9ydCBNb2NrRmlsZVN5c3RlbQorZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmV4ZWN1dGl2
ZSBpbXBvcnQgRXhlY3V0aXZlCitmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuYW5hbHl6ZWNo
YW5nZWxvZyBpbXBvcnQgQW5hbHl6ZUNoYW5nZUxvZworZnJvbSB3ZWJraXRweS50b29sLmNvbW1h
bmRzLmFuYWx5emVjaGFuZ2Vsb2cgaW1wb3J0IENoYW5nZUxvZ0FuYWx5emVyCitmcm9tIHdlYmtp
dHB5LnRvb2wuY29tbWFuZHMuY29tbWFuZHRlc3QgaW1wb3J0IENvbW1hbmRzVGVzdAorZnJvbSB3
ZWJraXRweS50b29sLm11bHRpY29tbWFuZHRvb2wgaW1wb3J0IEFic3RyYWN0RGVjbGFyYXRpdmVD
b21tYW5kCisKKworY2xhc3MgQW5hbHl6ZUNoYW5nZUxvZ1Rlc3QoQ29tbWFuZHNUZXN0KToKKyAg
ICBkZWYgdGVzdF9lbnVtZXJhdGVfZW51bWVyYXRlX2NoYW5nZWxvZ3Moc2VsZik6CisgICAgICAg
IGZpbGVzeXN0ZW0gPSBNb2NrRmlsZVN5c3RlbSh7CisgICAgICAgICAgICAnZm9vL0NoYW5nZUxv
Zyc6ICcnLAorICAgICAgICAgICAgJ2Zvby9DaGFuZ2VMb2ctMjAxMC0wNi0yMyc6ICcnLAorICAg
ICAgICAgICAgJ2Zvby9DaGFuZ2VMb2ctMjAxMC0xMi0zMSc6ICcnLAorICAgICAgICAgICAgJ2Zv
by9DaGFuZ2VMb2cteCc6ICcnLAorICAgICAgICAgICAgJ2Zvby9DaGFuZ2VMb2ctMjAxMS0wMS0w
MSc6ICcnLAorICAgICAgICB9KQorICAgICAgICBjaGFuZ2Vsb2dzID0gQW5hbHl6ZUNoYW5nZUxv
Zy5fZW51bWVyYXRlX2NoYW5nZWxvZ3MoZmlsZXN5c3RlbSwgJ2Zvby8nLCBOb25lKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKGNoYW5nZWxvZ3MsIFsnZm9vL0NoYW5nZUxvZycsICdmb28vQ2hh
bmdlTG9nLTIwMTEtMDEtMDEnLCAnZm9vL0NoYW5nZUxvZy0yMDEwLTEyLTMxJywgJ2Zvby9DaGFu
Z2VMb2ctMjAxMC0wNi0yMyddKQorCisgICAgICAgIGNoYW5nZWxvZ3MgPSBBbmFseXplQ2hhbmdl
TG9nLl9lbnVtZXJhdGVfY2hhbmdlbG9ncyhmaWxlc3lzdGVtLCAnZm9vLycsIDIpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWwoY2hhbmdlbG9ncywgWydmb28vQ2hhbmdlTG9nJywgJ2Zvby9DaGFu
Z2VMb2ctMjAxMS0wMS0wMSddKQorCisgICAgZGVmIHRlc3RfZ2VuZXJhdGVfanNvbnMoc2VsZik6
CisgICAgICAgIGZpbGVzeXN0ZW0gPSBNb2NrRmlsZVN5c3RlbSgpCisgICAgICAgIHRlc3RfanNv
biA9IHsnYXJyYXkuanNvbic6IFsxLCAyLCAzLCB7J2tleSc6ICd2YWx1ZSd9XSwgJ2RpY3Rpb25h
cnkuanNvbic6IHsnc29tZWtleSc6ICdzb21ldmFsdWUnLCAnYXJyYXknOiBbNCwgNV19fQorICAg
ICAgICBzeXNfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICB0cnk6CisgICAgICAgICAgICBz
eXMuc3Rkb3V0ID0gZmlsZXN5c3RlbS5vcGVuX3RleHRfZmlsZV9mb3Jfd3JpdGluZygnc3Rkb3V0
JykKKyAgICAgICAgICAgIEFuYWx5emVDaGFuZ2VMb2cuX2dlbmVyYXRlX2pzb25zKGZpbGVzeXN0
ZW0sIHRlc3RfanNvbiwgJ2JhcicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChm
aWxlc3lzdGVtLmZpbGVzLmtleXMoKSksIHNldChbJ2Jhci9hcnJheS5qc29uJywgJ2Jhci9kaWN0
aW9uYXJ5Lmpzb24nLCAnc3Rkb3V0J10pKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAg
c3lzLnN0ZG91dCA9IHN5c19zdGRvdXQKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGpzb24u
bG9hZHMoZmlsZXN5c3RlbS5maWxlc1snYmFyL2FycmF5Lmpzb24nXSksIHRlc3RfanNvblsnYXJy
YXkuanNvbiddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGpzb24ubG9hZHMoZmlsZXN5c3Rl
bS5maWxlc1snYmFyL2RpY3Rpb25hcnkuanNvbiddKSwgdGVzdF9qc29uWydkaWN0aW9uYXJ5Lmpz
b24nXSkKKworCitjbGFzcyBDaGFuZ2VMb2dBbmFseXplclRlc3QoQ29tbWFuZHNUZXN0KToKKyAg
ICBkZWYgdGVzdF9hbmFseXplX29uZV9jaGFuZ2Vsb2coc2VsZik6CisgICAgICAgIGhvc3QgPSBN
b2NrSG9zdCgpCisgICAgICAgIGhvc3QuZmlsZXN5c3RlbS5maWxlc1snbW9jay1jaGVja291dC9m
b28vQ2hhbmdlTG9nJ10gPSB1IiIiMjAxMS0xMS0xNyAgTWFyayBSb3dlICA8bXJvd2VAYXBwbGUu
Y29tPgorCisgICAgPGh0dHA6Ly93ZWJraXQub3JnL2IvNzI2NDY+IERpc2FibGUgZGVwcmVjYXRp
b24gd2FybmluZ3MgYXJvdW5kIGNvZGUgd2hlcmUgd2UgY2Fubm90IGVhc2lseQorICAgIHN3aXRj
aCBhd2F5IGZyb20gdGhlIGRlcHJlY2F0ZWQgQVBJcy4KKworICAgIFJldmlld2VkIGJ5IFNhbSBX
ZWluaWcuCisKKyAgICAqIHBsYXRmb3JtL21hYy9XZWJDb3JlTlNTdHJpbmdFeHRyYXMubW06Cisg
ICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2NmL1NvY2tldFN0cmVhbUhhbmRsZUNGTmV0LmNwcDoKKyAg
ICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpyZXBvcnRFcnJvclRvQ2xpZW50KToKKwor
MjAxMS0xMS0xOSAgS2V2aW4gT2xsaXZpZXIgIDxrZXZpbm9AdGhlb2xsaXZpZXJzLmNvbT4KKwor
ICAgIFt3eF0gQysrIGJpbmRpbmdzIGJ1aWxkIGZpeCBmb3IgbW92ZSBvZiBhcnJheSBjbGFzc2Vz
IHRvIFdURi4KKworICAgICogYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9yQ1BQLnBtOgor
ICAgIChHZXRDUFBUeXBlR2V0dGVyKToKKyAgICAoR2V0TmFtZXNwYWNlRm9yQ2xhc3MpOgorICAg
IChHZW5lcmF0ZUhlYWRlcik6CisgICAgKEdlbmVyYXRlSW1wbGVtZW50YXRpb24pOgorIiIiCisK
KyAgICAgICAgc3lzX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAg
ICAgc3lzLnN0ZG91dCA9IGhvc3QuZmlsZXN5c3RlbS5vcGVuX3RleHRfZmlsZV9mb3Jfd3JpdGlu
Zygnc3Rkb3V0JykKKyAgICAgICAgICAgIGFuYWx5emVyID0gQ2hhbmdlTG9nQW5hbHl6ZXIoaG9z
dC5maWxlc3lzdGVtLCBob3N0LnNjbSgpLCBbJ21vY2stY2hlY2tvdXQvZm9vL0NoYW5nZUxvZydd
KQorICAgICAgICAgICAgYW5hbHl6ZXIuYW5hbHl6ZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAg
ICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzX3N0ZG91dAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwoYW5hbHl6ZXIuc3VtbWFyeSgpLAorICAgICAgICAgICAgeydyZXZpZXdlZCc6IDEsICd1bnJl
dmlld2VkJzogMSwgJ2NvbnRyaWJ1dG9ycyc6IDMsICdjb250cmlidXRvcnNfd2l0aF9yZXZpZXdz
JzogMSwgJ2NvbnRyaWJ1dG9yc193aXRob3V0X3Jldmlld3MnOiAyfSkKKworICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKHNldChhbmFseXplci5jb250cmlidXRvcnNfc3RhdGlzdGljcygpLmtleXMo
KSksIHNldChbJ1NhbSBXZWluaWcnLCB1J01hcmsgUm93ZScsIHUnS2V2aW4gT2xsaXZpZXInXSkp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW5hbHl6ZXIuY29udHJpYnV0b3JzX3N0YXRpc3Rp
Y3MoKVsnU2FtIFdlaW5pZyddLAorICAgICAgICAgICAgeydyZXZpZXdzJzogeydmaWxlcyc6IHt1
J2Zvby9wbGF0Zm9ybS9tYWMvV2ViQ29yZU5TU3RyaW5nRXh0cmFzLm1tJzogMSwgdSdmb28vcGxh
dGZvcm0vbmV0d29yay9jZi9Tb2NrZXRTdHJlYW1IYW5kbGVDRk5ldC5jcHAnOiAxfSwKKyAgICAg
ICAgICAgICd0b3RhbCc6IDEsICdhcmVhcyc6IHsnTmV0d29yayc6IDF9fSwgJ3BhdGNoZXMnOiB7
J2ZpbGVzJzoge30sICdhcmVhcyc6IHt9LCAndW5yZXZpZXdlZCc6IDAsICdyZXZpZXdlZCc6IDB9
fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbmFseXplci5jb250cmlidXRvcnNfc3RhdGlz
dGljcygpW3UnTWFyayBSb3dlJ10sCisgICAgICAgICAgICB7J3Jldmlld3MnOiB7J2ZpbGVzJzog
e30sICd0b3RhbCc6IDAsICdhcmVhcyc6IHt9fSwgJ3BhdGNoZXMnOiB7J2ZpbGVzJzoge3UnZm9v
L3BsYXRmb3JtL21hYy9XZWJDb3JlTlNTdHJpbmdFeHRyYXMubW0nOiAxLAorICAgICAgICAgICAg
dSdmb28vcGxhdGZvcm0vbmV0d29yay9jZi9Tb2NrZXRTdHJlYW1IYW5kbGVDRk5ldC5jcHAnOiAx
fSwgJ2FyZWFzJzogeydOZXR3b3JrJzogMX0sICd1bnJldmlld2VkJzogMCwgJ3Jldmlld2VkJzog
MX19KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFuYWx5emVyLmNvbnRyaWJ1dG9yc19zdGF0
aXN0aWNzKClbdSdLZXZpbiBPbGxpdmllciddLAorICAgICAgICAgICAgeydyZXZpZXdzJzogeydm
aWxlcyc6IHt9LCAndG90YWwnOiAwLCAnYXJlYXMnOiB7fX0sICdwYXRjaGVzJzogeydmaWxlcyc6
IHt1J2Zvby9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JDUFAucG0nOiAxfSwKKyAgICAg
ICAgICAgICAgICAnYXJlYXMnOiB7J0JpbmRpbmdzJzogMX0sICd1bnJldmlld2VkJzogMSwgJ3Jl
dmlld2VkJzogMH19KQorCisgICAgICAgIGFyZWFzX3N0YXRpc3RpY3MgPSBhbmFseXplci5hcmVh
c19zdGF0aXN0aWNzKCkKKyAgICAgICAgYXJlYXNfd2l0aF9wYXRjaGVzID0gW2FyZWEgZm9yIGFy
ZWEgaW4gYXJlYXNfc3RhdGlzdGljcyBpZiBhcmVhc19zdGF0aXN0aWNzW2FyZWFdWydyZXZpZXdl
ZCddIG9yIGFyZWFzX3N0YXRpc3RpY3NbYXJlYV1bJ3VucmV2aWV3ZWQnXV0KKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbChzZXQoYXJlYXNfd2l0aF9wYXRjaGVzKSwgc2V0KFsnQmluZGluZ3MnLCAn
TmV0d29yayddKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmVhc19zdGF0aXN0aWNzWydC
aW5kaW5ncyddLCB7J3VucmV2aWV3ZWQnOiAxLCAncmV2aWV3ZWQnOiAwLCAnY29udHJpYnV0b3Jz
JzoKKyAgICAgICAgICAgIHt1J0tldmluIE9sbGl2aWVyJzogeydyZXZpZXdzJzogMCwgJ3VucmV2
aWV3ZWQnOiAxLCAncmV2aWV3ZWQnOiAwfX19KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFy
ZWFzX3N0YXRpc3RpY3NbJ05ldHdvcmsnXSwgeyd1bnJldmlld2VkJzogMCwgJ3Jldmlld2VkJzog
MSwgJ2NvbnRyaWJ1dG9ycyc6CisgICAgICAgICAgICB7J1NhbSBXZWluaWcnOiB7J3Jldmlld3Mn
OiAxLCAndW5yZXZpZXdlZCc6IDAsICdyZXZpZXdlZCc6IDB9LCB1J01hcmsgUm93ZSc6IHsncmV2
aWV3cyc6IDAsICd1bnJldmlld2VkJzogMCwgJ3Jldmlld2VkJzogMX19fSkKZGlmZiAtLWdpdCBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9kYXRhL3N1bW1hcnkuaHRtbCBi
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9kYXRhL3N1bW1hcnkuaHRtbApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi5hYmY4MGQ4NGZkMjBiZTM1YjdlOWZiMDZkMzVmZGM2ZmE4YTJlOGNmCi0tLSAv
ZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2RhdGEv
c3VtbWFyeS5odG1sCkBAIC0wLDAgKzEsNDU1IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgor
PGhlYWQ+Cis8dGl0bGU+Q2hhbmdlTG9nIEFuYWx5c2lzPC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0
ZXh0L2NzcyI+CisKK2JvZHkgeworICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhJyAnU2Vnb2Ug
VUkgTGlnaHQnIHNhbnMtc2VyaWY7CisgICAgZm9udC13ZWlnaHQ6IDIwMDsKKyAgICBwYWRkaW5n
OiAyMHB4OworICAgIG1pbi13aWR0aDogMTIwMHB4OworfQorCisqIHsKKyAgICBwYWRkaW5nOiAw
cHg7CisgICAgbWFyZ2luOiAwcHg7CisgICAgYm9yZGVyOiAwcHg7Cit9CisKK2gxLCBoMiwgaDMg
eworICAgIGZvbnQtd2VpZ2h0OiAyMDA7Cit9CisKK2gxIHsKKyAgICBtYXJnaW46IDAgMCAxZW0g
MDsKK30KKworaDIgeworICAgIGZvbnQtc2l6ZTogMS4yZW07CisgICAgdGV4dC1hbGlnbjogY2Vu
dGVyOworICAgIG1hcmdpbi1ib3R0b206IDFlbTsKK30KKworaDMgeworICAgIGZvbnQtc2l6ZTog
MWVtOworfQorCisudmlldyB7CisgICAgbWFyZ2luOiAwcHg7CisgICAgd2lkdGg6IDYwMHB4Owor
ICAgIGZsb2F0OiBsZWZ0OworfQorCisuZ3JhcGgtY29udGFpbmVyIHAgeworICAgIHdpZHRoOiAy
MDBweDsKKyAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICBtYXJnaW46IDIwcHggMCAyMHB4IDA7
CisgICAgcGFkZGluZzogNXB4OworICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4IGJsYWNrOwor
fQorCisuZ3JhcGgtY29udGFpbmVyIHRhYmxlIHsKKyAgICB3aWR0aDogMTAwJTsKK30KKworLmdy
YXBoLWNvbnRhaW5lciB0YWJsZSwgLmdyYXBoLWNvbnRhaW5lciB0ZCB7CisgICAgYm9yZGVyLWNv
bGxhcHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7Cit9CisKKy5ncmFwaC1jb250YWlu
ZXIgdGQgeworICAgIHBhZGRpbmc6IDVweDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogY2VudGVyOwor
fQorCisuZ3JhcGgtY29udGFpbmVyIHRkOmZpcnN0LWNoaWxkIHsKKyAgICB3aWR0aDogMjAwcHg7
CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggYmxh
Y2s7Cit9CisKKy5ncmFwaC1jb250YWluZXIgLnNlbGVjdGVkIHsKKyAgICBiYWNrZ3JvdW5kOiAj
ZWVlOworfQorCisjcmV2aWV3ZXJzIC5zZWxlY3RlZCB0ZDpmaXJzdC1jaGlsZCB7CisgICAgYm9y
ZGVyLXJhZGl1czogMTBweCAwcHggMHB4IDEwcHg7Cit9CisKKyNhcmVhcyAuc2VsZWN0ZWQgdGQ6
bGFzdC1jaGlsZCB7CisgICAgYm9yZGVyLXJhZGl1czogMHB4IDEwcHggMTBweCAwcHg7Cit9CisK
Ky5ncmFwaC1jb250YWluZXIgLmJhciB7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAg
IG1pbi1oZWlnaHQ6IDFlbTsKKyAgICBiYWNrZ3JvdW5kOiAjOWY2OworICAgIG1hcmdpbi1yaWdo
dDogMC40ZXg7Cit9CisKKy5ncmFwaC1jb250YWluZXIgLnJldmlld2VkLXBhdGNoZXMgeworICAg
IGJhY2tncm91bmQ6ICMzY2Y7CisgICAgbWFyZ2luLXJpZ2h0OiAxcHg7Cit9CisKKy5ncmFwaC1j
b250YWluZXIgLnVucmV2aWV3ZWQtcGF0Y2hlcyB7CisgICAgYmFja2dyb3VuZDogI2Y5OTsKK30K
KworLmNvbnN0cmFpbmVkIHsKKyAgICBiYWNrZ3JvdW5kOiAjZWVlOworICAgIGJvcmRlci1yYWRp
dXM6IDEwcHg7Cit9CisKKy5jb25zdHJhaW5lZCAudmVydGljYWwtYmFyIHsKKyAgICBib3JkZXIt
cmlnaHQ6IHNvbGlkIDFweCAjZWVlOworfQorCisjaGVhZGVyIHsKKyAgICBib3JkZXItc3BhY2lu
ZzogNXB4OworfQorCisjaGVhZGVyIHNlY3Rpb24geworICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7
CisgICAgd2lkdGg6IDIwMHB4OworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgYm9yZGVy
OiBzb2xpZCAycHggI2NjYzsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIHBh
ZGRpbmc6IDVweDsKKyAgICBmb250LXNpemU6IDAuOGVtOworfQorCisjaGVhZGVyIGR0IHsKKyAg
ICBmbG9hdDogbGVmdDsKK30KKworI2hlYWRlciBkdDphZnRlciB7CisgICAgY29udGVudDogJzog
JzsKK30KKworI2hlYWRlciAubGVnZW5kIHsKKyAgICB3aWR0aDogNjAwcHg7Cit9CisKKy5sZWdl
bmQgLmJhciB7CisgICAgd2lkdGg6IDE1ZXg7CisgICAgcGFkZGluZzogMnB4OworfQorCisubGVn
ZW5kIC5yZXZpZXdzIHsKKyAgICB3aWR0aDogMjVleDsKK30KKworLmxlZ2VuZCB0ZDpmaXJzdC1j
aGlsZCB7CisgICAgd2lkdGg6IDE4ZXg7Cit9CisKKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4K
KzxoMT5DaGFuZ2VMb2cgQW5hbHlzaXM8L2gxPgorCis8c2VjdGlvbiBpZD0iaGVhZGVyIj4KKzxz
ZWN0aW9uIGlkPSJzdW1tYXJ5Ij4KKzxoMj5TdW1tYXJ5PC9oMj4KKzwvc2VjdGlvbj4KKworPHNl
Y3Rpb24gY2xhc3M9ImxlZ2VuZCI+Cis8aDI+TGVnZW5kPC9oMj4KKzxkaXYgY2xhc3M9ImdyYXBo
LWNvbnRhaW5lciI+Cis8dGFibGU+Cis8dGJvZHk+Cis8dHI+PHRkPkNvbnRyaWJ1dG9yJ3MgbmFt
ZTwvdGQ+Cis8dGQ+PHNwYW4gY2xhc3M9ImJhciByZXZpZXdzIj5SZXZpZXdzPC9zcGFuPiA8c3Bh
biBjbGFzcz0idmFsdWUtY29udGFpbmVyIj4oIyBvZiByZXZpZXdzKTwvc3Bhbj48YnI+Cis8c3Bh
biBjbGFzcz0iYmFyIHJldmlld2VkLXBhdGNoZXMiPlJldmlld2VkPC9zcGFuPjxzcGFuIGNsYXNz
PSJiYXIgdW5yZXZpZXdlZC1wYXRjaGVzIj5VbnJldmlld2VkPC9zcGFuPgorPHNwYW4gY2xhc3M9
InZhbHVlLWNvbnRhaW5lciI+KCMgb2YgcmV2aWV3ZWQpOigjIG9mIHVucmV2aWV3ZWQpPC9zcGFu
PjwvdGQ+PC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPC9kaXY+Cis8L3NlY3Rpb24+Cis8L3Nl
Y3Rpb24+CisKKzxzZWN0aW9uIGlkPSJjb250cmlidXRvcnMiIGNsYXNzPSJ2aWV3Ij4KKzxoMiBp
ZD0iY29udHJpYnV0b3JzLXRpdGxlIj5Db250cmlidXRvcnM8L2gyPgorPGRpdiBjbGFzcz0iZ3Jh
cGgtY29udGFpbmVyIj48L2Rpdj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gaWQ9ImFyZWFzIiBj
bGFzcz0idmlldyI+Cis8aDIgaWQ9ImFyZWFzLXRpdGxlIj5BcmVhcyBvZiBjb250cmlidXRpb25z
PC9oMj4KKzxkaXYgY2xhc3M9ImdyYXBoLWNvbnRhaW5lciI+PC9kaXY+Cis8L3NlY3Rpb24+CisK
KzxzY3JpcHQ+CisKKy8vIE5haXZlIGltcGxlbWVudGF0aW9uIG9mIGVsZW1lbnQgZXh0ZW5zaW9u
cyBkaXNjdXNzZWQgb24gcHVibGljLXdlYmFwcHMKKworaWYgKCFFbGVtZW50LnByb3RvdHlwZS5h
cHBlbmQpIHsKKyAgICBFbGVtZW50LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoKSB7Cisg
ICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAg
ICAgICAgICAvLyBGSVhNRTogVGFrZSBjYXJlIG9mIG90aGVyIG5vZGUgdHlwZXMKKyAgICAgICAg
ICAgIGlmIChhcmd1bWVudHNbaV0gaW5zdGFuY2VvZiBFbGVtZW50IHx8IGFyZ3VtZW50c1tpXSBp
bnN0YW5jZW9mIENoYXJhY3RlckRhdGEpCisgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGls
ZChhcmd1bWVudHNbaV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRoaXMu
YXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYXJndW1lbnRzW2ldKSk7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQorCitpZiAoIU5vZGUucHJvdG90
eXBlLnJlbW92ZSkgeworICAgIE5vZGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHsK
KyAgICAgICAgdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpOworICAgICAgICByZXR1
cm4gdGhpczsKKyAgICB9Cit9CisKK2lmICghRWxlbWVudC5jcmVhdGUpIHsKKyAgICBFbGVtZW50
LmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAx
KQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudChhcmd1bWVudHNbMF0pOworICAgICAgICBpZiAoYXJndW1lbnRzLmxl
bmd0aCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICAgICAgLy8gRklY
TUU6IHRoZSBzZWNvbmQgYXJndW1lbnQgY2FuIGJlIGNvbnRlbnQgb3IgSURMIGF0dHJpYnV0ZXMK
KyAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbMV07CisgICAgICAgIGZvciAoYXR0
cmlidXRlIGluIGF0dHJpYnV0ZXMpCisgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShh
dHRyaWJ1dGUsIGF0dHJpYnV0ZXNbYXR0cmlidXRlXSk7CisKKyAgICAgICAgaWYgKGFyZ3VtZW50
cy5sZW5ndGggPj0gMykKKyAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kLmFwcGx5KGVsZW1lbnQs
IGFyZ3VtZW50c1syXSk7CisKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorfQorCitp
ZiAoIU5vZGUucHJvdG90eXBlLnJlbW92ZUFsbENoaWxkcmVuKSB7CisgICAgTm9kZS5wcm90b3R5
cGUucmVtb3ZlQWxsQ2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIHdoaWxlICh0aGlz
LmZpcnN0Q2hpbGQpCisgICAgICAgICAgICB0aGlzLmZpcnN0Q2hpbGQucmVtb3ZlKCk7CisgICAg
ICAgIHJldHVybiB0aGlzOworICAgIH0KK30KKworRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQ2xh
c3NOYW1lRnJvbUFsbEVsZW1lbnRzID0gZnVuY3Rpb24gKGNsYXNzTmFtZSkgeworICAgIHZhciBl
bGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpOworICAgIGZv
ciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCisgICAgICAgIGVsZW1lbnRz
W2ldLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTsKK30KKworZnVuY3Rpb24gZ2V0SlNPTih1
cmwsIGNhbGxiYWNrKSB7CisgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICAg
IHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpOworICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2Ug
PSBmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCkKKyAgICAg
ICAgICAgIGNhbGxiYWNrKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpOworICAgIH0KKyAg
ICB4aHIuc2VuZCgpOworfQorCitmdW5jdGlvbiBHcmFwaFZpZXcoY29udGFpbmVyKSB7CisgICAg
dGhpcy5fY29udGFpbmVyID0gY29udGFpbmVyOworICAgIHRoaXMuX2RlZmF1bHREYXRhID0gbnVs
bDsKK30KKworR3JhcGhWaWV3LnByb3RvdHlwZS5zZXREYXRhID0gZnVuY3Rpb24oZGF0YSwgY29u
c3RyYWluZWQpIHsKKyAgICBpZiAoY29uc3RyYWluZWQpCisgICAgICAgIHRoaXMuX2NvbnRhaW5l
ci5jbGFzc0xpc3QuYWRkKCdjb25zdHJhaW5lZCcpOworICAgIGVsc2UKKyAgICAgICAgdGhpcy5f
Y29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2NvbnN0cmFpbmVkJyk7CisgICAgdGhpcy5fY2xl
YXJHcmFwaCgpOworICAgIHRoaXMuX2NvbnN0cnVjdEdyYXBoKGRhdGEpOworfQorCitHcmFwaFZp
ZXcucHJvdG90eXBlLnNldERlZmF1bHREYXRhID0gZnVuY3Rpb24oZGF0YSkgeworICAgIHRoaXMu
X2RlZmF1bHREYXRhID0gZGF0YTsKKyAgICB0aGlzLnNldERhdGEoZGF0YSk7Cit9CisKK0dyYXBo
Vmlldy5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5zZXRNYXJnaW5U
b3AoKTsKKyAgICB0aGlzLnNldERhdGEodGhpcy5fZGVmYXVsdERhdGEpOworfQorCitHcmFwaFZp
ZXcucHJvdG90eXBlLmlzQ29uc3RyYWluZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9j
b250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb25zdHJhaW5lZCcpOyB9CisKK0dyYXBoVmll
dy5wcm90b3R5cGUudGFyZ2V0Um93ID0gZnVuY3Rpb24gKG5vZGUpIHsKKyAgICB2YXIgdGFyZ2V0
ID0gbnVsbDsKKworICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT0gdGhpcy5fY29udGFpbmVyKSB7
CisgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndHInKQorICAgICAgICAgICAgdGFyZ2V0
ID0gbm9kZTsKKyAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gbm9kZSAmJiB0YXJnZXQ7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5cGUuc2VsZWN0Um93
ID0gZnVuY3Rpb24gKHJvdykgeworICAgIHRoaXMuX2NvbnRhaW5lci5yZW1vdmVDbGFzc05hbWVG
cm9tQWxsRWxlbWVudHMoJ3NlbGVjdGVkJyk7CisgICAgcm93LmNsYXNzTGlzdC5hZGQoJ3NlbGVj
dGVkJyk7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5cGUuc2V0TWFyZ2luVG9wID0gZnVuY3Rpb24g
KHkpIHsgdGhpcy5fY29udGFpbmVyLnN0eWxlLm1hcmdpblRvcCA9IHkgPyB5ICsgJ3B4JyA6IG51
bGw7IH0KK0dyYXBoVmlldy5wcm90b3R5cGUuX2dyYXBoQ29udGFpbmVyID0gZnVuY3Rpb24gKCkg
eyByZXR1cm4gdGhpcy5fY29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2dyYXBoLWNv
bnRhaW5lcicpWzBdOyB9CitHcmFwaFZpZXcucHJvdG90eXBlLl9jbGVhckdyYXBoID0gZnVuY3Rp
b24gKCkgeyByZXR1cm4gdGhpcy5fZ3JhcGhDb250YWluZXIoKS5yZW1vdmVBbGxDaGlsZHJlbigp
OyB9CisKK0dyYXBoVmlldy5wcm90b3R5cGUuX251bWJlck9mUGF0Y2hlcyA9IGZ1bmN0aW9uIChk
YXRhSXRlbSkgeworICAgIHJldHVybiBkYXRhSXRlbS5udW1iZXJPZlJldmlld2VkUGF0Y2hlcyAr
IChkYXRhSXRlbS5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzICE9PSB1bmRlZmluZWQgPyBkYXRh
SXRlbS5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzIDogMCk7Cit9CisKK0dyYXBoVmlldy5wcm90
b3R5cGUuX21heGltdW1WYWx1ZSA9IGZ1bmN0aW9uIChsYWJlbHMsIGRhdGEpIHsKKyAgICB2YXIg
bnVtYmVyT2ZQYXRjaGVzID0gdGhpcy5fbnVtYmVyT2ZQYXRjaGVzOworICAgIHJldHVybiBNYXRo
Lm1heC5hcHBseShudWxsLCBsYWJlbHMubWFwKGZ1bmN0aW9uIChsYWJlbCkgeworICAgICAgICBy
ZXR1cm4gTWF0aC5tYXgobnVtYmVyT2ZQYXRjaGVzKGRhdGFbbGFiZWxdKSwgZGF0YVtsYWJlbF0u
bnVtYmVyT2ZSZXZpZXdzICE9PSB1bmRlZmluZWQgPyBkYXRhW2xhYmVsXS5udW1iZXJPZlJldmll
d3MgOiAwKTsKKyAgICB9KSk7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5cGUuX3NvcnRMYWJlbHNC
eU51bWJlck9mUmV2aXdzQW5kUmV2aWV3ZWRQYXRjaGVzID0gZnVuY3Rpb24oZGF0YSkgeworICAg
IHZhciBsYWJlbHMgPSBPYmplY3Qua2V5cyhkYXRhKTsKKyAgICBpZiAoIWxhYmVscy5sZW5ndGgp
CisgICAgICAgIHJldHVybiBudWxsOworICAgIHZhciBudW1iZXJPZlBhdGNoZXMgPSB0aGlzLl9u
dW1iZXJPZlBhdGNoZXM7CisgICAgdmFyIGNvbXB1dGVWYWx1ZSA9IGZ1bmN0aW9uIChkYXRhSXRl
bSkgeworICAgICAgICByZXR1cm4gbnVtYmVyT2ZQYXRjaGVzKGRhdGFJdGVtKSArIChkYXRhSXRl
bS5udW1iZXJPZlJldmlld3MgIT09IHVuZGVmaW5lZCA/IGRhdGFJdGVtLm51bWJlck9mUmV2aWV3
cyA6IDApOworICAgIH0KKyAgICBsYWJlbHMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4g
Y29tcHV0ZVZhbHVlKGRhdGFbYl0pIC0gY29tcHV0ZVZhbHVlKGRhdGFbYV0pOyB9KTsKKyAgICBy
ZXR1cm4gbGFiZWxzOworfQorCitHcmFwaFZpZXcucHJvdG90eXBlLl9jb25zdHJ1Y3RHcmFwaCA9
IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9ncmFwaENvbnRhaW5l
cigpOworICAgIHZhciBsYWJlbHMgPSB0aGlzLl9zb3J0TGFiZWxzQnlOdW1iZXJPZlJldml3c0Fu
ZFJldmlld2VkUGF0Y2hlcyhkYXRhKTsKKyAgICBpZiAoIWxhYmVscykgeworICAgICAgICBlbGVt
ZW50LmFwcGVuZChFbGVtZW50LmNyZWF0ZSgncCcsIHt9LCBbJ05vbmUnXSkpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgdmFyIG1heFZhbHVlID0gdGhpcy5fbWF4aW11bVZhbHVlKGxh
YmVscywgZGF0YSk7CisgICAgdmFyIGNvbXB1dGVTdHlsZUZvckJhciA9IGZ1bmN0aW9uICh2YWx1
ZSkgeyByZXR1cm4gJ3dpZHRoOicgKyAodmFsdWUgKiA4NS4wIC8gbWF4VmFsdWUpICsgJyUnIH0K
KworICAgIHZhciB0YWJsZSA9IEVsZW1lbnQuY3JlYXRlKCd0YWJsZScsIHt9LCBbRWxlbWVudC5j
cmVhdGUoJ3Rib2R5JyldKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7
IGkrKykgeworICAgICAgICB2YXIgbGFiZWwgPSBsYWJlbHNbaV07CisgICAgICAgIHZhciBpdGVt
ID0gZGF0YVtsYWJlbF07CisgICAgICAgIHZhciByb3cgPSBFbGVtZW50LmNyZWF0ZSgndHInLCB7
fSwgW0VsZW1lbnQuY3JlYXRlKCd0ZCcsIHt9LCBbbGFiZWxdKSwgRWxlbWVudC5jcmVhdGUoJ3Rk
Jywge30pXSk7CisgICAgICAgIHZhciB2YWx1ZUNlbGwgPSByb3cubGFzdENoaWxkOworCisgICAg
ICAgIGlmIChpdGVtLm51bWJlck9mUmV2aWV3cyAhPSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAg
IHZhbHVlQ2VsbC5hcHBlbmQoCisgICAgICAgICAgICAgICAgRWxlbWVudC5jcmVhdGUoJ3NwYW4n
LCB7J2NsYXNzJzogJ2JhciByZXZpZXdzJywgJ3N0eWxlJzogY29tcHV0ZVN0eWxlRm9yQmFyKGl0
ZW0ubnVtYmVyT2ZSZXZpZXdzKSB9KSwKKyAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZSgn
c3BhbicsIHsnY2xhc3MnOiAndmFsdWUtY29udGFpbmVyJ30sIFtpdGVtLm51bWJlck9mUmV2aWV3
c10pLAorICAgICAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlKCdicicpCisgICAgICAgICAgICAp
OworICAgICAgICB9CisKKyAgICAgICAgdmFsdWVDZWxsLmFwcGVuZChFbGVtZW50LmNyZWF0ZSgn
c3BhbicsIHsnY2xhc3MnOiAnYmFyIHJldmlld2VkLXBhdGNoZXMnLCAnc3R5bGUnOiBjb21wdXRl
U3R5bGVGb3JCYXIoaXRlbS5udW1iZXJPZlJldmlld2VkUGF0Y2hlcykgfSkpOworICAgICAgICBp
ZiAoaXRlbS5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzICE9PSB1bmRlZmluZWQpCisgICAgICAg
ICAgICB2YWx1ZUNlbGwuYXBwZW5kKEVsZW1lbnQuY3JlYXRlKCdzcGFuJywgeydjbGFzcyc6ICdi
YXIgdW5yZXZpZXdlZC1wYXRjaGVzJywgJ3N0eWxlJzogY29tcHV0ZVN0eWxlRm9yQmFyKGl0ZW0u
bnVtYmVyT2ZVbnJldmlld2VkUGF0Y2hlcykgfSkpOworCisgICAgICAgIHZhbHVlQ2VsbC5hcHBl
bmQoRWxlbWVudC5jcmVhdGUoJ3NwYW4nLCB7J2NsYXNzJzogJ3ZhbHVlLWNvbnRhaW5lcid9LAor
ICAgICAgICAgICAgW2l0ZW0ubnVtYmVyT2ZSZXZpZXdlZFBhdGNoZXMgKyAoaXRlbS5udW1iZXJP
ZlVucmV2aWV3ZWRQYXRjaGVzICE9PSB1bmRlZmluZWQgPyAnOicgKyBpdGVtLm51bWJlck9mVW5y
ZXZpZXdlZFBhdGNoZXMgOiAnJyldKSk7CisKKyAgICAgICAgdGFibGUuZmlyc3RDaGlsZC5hcHBl
bmQocm93KTsKKyAgICAgICAgcm93LmxhYmVsID0gbGFiZWw7CisgICAgICAgIHJvdy5kYXRhID0g
aXRlbTsKKyAgICB9CisgICAgZWxlbWVudC5hcHBlbmQodGFibGUpOworfQorCit2YXIgY29udHJp
YnV0b3JzVmlldyA9IG5ldyBHcmFwaFZpZXcoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRy
aWJ1dG9ycycpKTsKK3ZhciBhcmVhc1ZpZXcgPSBuZXcgR3JhcGhWaWV3KGRvY3VtZW50LnF1ZXJ5
U2VsZWN0b3IoJyNhcmVhcycpKTsKKworZ2V0SlNPTignc3VtbWFyeS5qc29uJywKKyAgICBmdW5j
dGlvbiAoc3VtbWFyeSkgeworICAgICAgICB2YXIgc3VtbWFyeUNvbnRhaW5lciA9IGRvY3VtZW50
LnF1ZXJ5U2VsZWN0b3IoJyNzdW1tYXJ5Jyk7CisgICAgICAgIHN1bW1hcnlDb250YWluZXIuYXBw
ZW5kKEVsZW1lbnQuY3JlYXRlKCdkbCcsIHt9LCBbCisgICAgICAgICAgICBFbGVtZW50LmNyZWF0
ZSgnZHQnLCB7fSwgWydUb3RhbCBlbnRyaWVzIChyZXZpZXdlZCknXSksCisgICAgICAgICAgICBF
bGVtZW50LmNyZWF0ZSgnZGQnLCB7fSwgWyhzdW1tYXJ5WydyZXZpZXdlZCddICsgc3VtbWFyeVsn
dW5yZXZpZXdlZCddKSArICcgKCcgKyBzdW1tYXJ5WydyZXZpZXdlZCddICsgJyknXSksCisgICAg
ICAgICAgICBFbGVtZW50LmNyZWF0ZSgnZHQnLCB7fSwgWydUb3RhbCBjb250cmlidXRvcnMnXSks
CisgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZSgnZGQnLCB7fSwgW3N1bW1hcnlbJ2NvbnRyaWJ1
dG9ycyddXSksCisgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZSgnZHQnLCB7fSwgWydDb250cmli
dXRvcnMgd2hvIHJldmlld2VkJ10pLAorICAgICAgICAgICAgRWxlbWVudC5jcmVhdGUoJ2RkJywg
e30sIFtzdW1tYXJ5Wydjb250cmlidXRvcnNfd2l0aF9yZXZpZXdzJ11dKSwKKyAgICAgICAgXSkp
OworICAgIH0pOworCitnZXRKU09OKCdjb250cmlidXRvcnMuanNvbicsCisgICAgZnVuY3Rpb24g
KGNvbnRyaWJ1dG9ycykgeworICAgICAgICBmb3IgKHZhciBjb250cmlidXRvciBpbiBjb250cmli
dXRvcnMpIHsKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yID0gY29udHJpYnV0b3JzW2NvbnRyaWJ1
dG9yXTsKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yLm51bWJlck9mUmV2aWV3cyA9IGNvbnRyaWJ1
dG9yLnJldmlld3MgPyBjb250cmlidXRvci5yZXZpZXdzLnRvdGFsIDogMDsKKyAgICAgICAgICAg
IGNvbnRyaWJ1dG9yLm51bWJlck9mUmV2aWV3ZWRQYXRjaGVzID0gY29udHJpYnV0b3IucGF0Y2hl
cyA/IGNvbnRyaWJ1dG9yLnBhdGNoZXMucmV2aWV3ZWQgOiAwOworICAgICAgICAgICAgY29udHJp
YnV0b3IubnVtYmVyT2ZVbnJldmlld2VkUGF0Y2hlcyA9IGNvbnRyaWJ1dG9yLnBhdGNoZXMgPyBj
b250cmlidXRvci5wYXRjaGVzLnVucmV2aWV3ZWQgOiAwOworICAgICAgICB9CisgICAgICAgIGNv
bnRyaWJ1dG9yc1ZpZXcuc2V0RGVmYXVsdERhdGEoY29udHJpYnV0b3JzKTsKKyAgICB9KTsKKwor
Z2V0SlNPTignYXJlYXMuanNvbicsCisgICAgZnVuY3Rpb24gKGFyZWFzKSB7CisgICAgICAgIGZv
ciAodmFyIGFyZWEgaW4gYXJlYXMpIHsKKyAgICAgICAgICAgIGFyZWFzW2FyZWFdLm51bWJlck9m
UmV2aWV3ZWRQYXRjaGVzID0gYXJlYXNbYXJlYV0ucmV2aWV3ZWQ7CisgICAgICAgICAgICBhcmVh
c1thcmVhXS5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzID0gYXJlYXNbYXJlYV0udW5yZXZpZXdl
ZDsKKyAgICAgICAgfQorICAgICAgICBhcmVhc1ZpZXcuc2V0RGVmYXVsdERhdGEoYXJlYXMpOwor
ICAgIH0pOworCitmdW5jdGlvbiBjb250cmlidXRvckFyZWFzKGNvbnRyaWJ1dG9yRGF0YSkgewor
ICAgIHZhciBhcmVhcyA9IG5ldyBPYmplY3Q7CisgICAgZm9yICh2YXIgYXJlYSBpbiBjb250cmli
dXRvckRhdGEucmV2aWV3cy5hcmVhcykgeworICAgICAgICBpZiAoIWFyZWFzW2FyZWFdKQorICAg
ICAgICAgICAgYXJlYXNbYXJlYV0gPSB7J251bWJlck9mUmV2aWV3ZWRQYXRjaGVzJzogMH07Cisg
ICAgICAgIGFyZWFzW2FyZWFdLm51bWJlck9mUmV2aWV3cyA9IGNvbnRyaWJ1dG9yRGF0YS5yZXZp
ZXdzLmFyZWFzW2FyZWFdOworICAgIH0KKyAgICBmb3IgKHZhciBhcmVhIGluIGNvbnRyaWJ1dG9y
RGF0YS5wYXRjaGVzLmFyZWFzKSB7CisgICAgICAgIGlmICghYXJlYXNbYXJlYV0pCisgICAgICAg
ICAgICBhcmVhc1thcmVhXSA9IHsnbnVtYmVyT2ZSZXZpZXdzJzogMH07CisgICAgICAgIGFyZWFz
W2FyZWFdLm51bWJlck9mUmV2aWV3ZWRQYXRjaGVzID0gY29udHJpYnV0b3JEYXRhLnBhdGNoZXMu
YXJlYXNbYXJlYV07CisgICAgfQorICAgIHJldHVybiBhcmVhczsKK30KKworZnVuY3Rpb24gYXJl
YUNvbnRyaWJ1dG9ycyhhcmVhRGF0YSkgeworICAgIHZhciBjb250cmlidXRvcnMgPSBhcmVhRGF0
YVsnY29udHJpYnV0b3JzJ107CisgICAgZm9yICh2YXIgY29udHJpYnV0b3IgaW4gY29udHJpYnV0
b3JzKSB7CisgICAgICAgIGNvbnRyaWJ1dG9yID0gY29udHJpYnV0b3JzW2NvbnRyaWJ1dG9yXTsK
KyAgICAgICAgY29udHJpYnV0b3IubnVtYmVyT2ZSZXZpZXdzID0gY29udHJpYnV0b3IucmV2aWV3
czsKKyAgICAgICAgY29udHJpYnV0b3IubnVtYmVyT2ZSZXZpZXdlZFBhdGNoZXMgPSBjb250cmli
dXRvci5yZXZpZXdlZDsKKyAgICAgICAgY29udHJpYnV0b3IubnVtYmVyT2ZVbnJldmlld2VkUGF0
Y2hlcyA9IGNvbnRyaWJ1dG9yLnVucmV2aWV3ZWQ7CisgICAgfQorICAgIHJldHVybiBjb250cmli
dXRvcnM7Cit9CisKK3ZhciBtb3VzZVRpbWVyID0gMDsKK3dpbmRvdy5vbm1vdXNlb3ZlciA9IGZ1
bmN0aW9uIChldmVudCkgeworICAgIGNsZWFyVGltZW91dChtb3VzZVRpbWVyKTsKKworICAgIHZh
ciByb3cgPSBjb250cmlidXRvcnNWaWV3LnRhcmdldFJvdyhldmVudC50YXJnZXQpOworICAgIGlm
IChyb3cpIHsKKyAgICAgICAgaWYgKCFjb250cmlidXRvcnNWaWV3LmlzQ29uc3RyYWluZWQoKSkg
eworICAgICAgICAgICAgY29udHJpYnV0b3JzVmlldy5zZWxlY3RSb3cocm93KTsKKyAgICAgICAg
ICAgIGFyZWFzVmlldy5zZXRNYXJnaW5Ub3Aocm93LmZpcnN0Q2hpbGQub2Zmc2V0VG9wKTsKKyAg
ICAgICAgICAgIGFyZWFzVmlldy5zZXREYXRhKGNvbnRyaWJ1dG9yQXJlYXMocm93LmRhdGEpLCAn
Y29uc3RyYWluZWQnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
cm93ID0gYXJlYXNWaWV3LnRhcmdldFJvdyhldmVudC50YXJnZXQpOworICAgIGlmIChyb3cpIHsK
KyAgICAgICAgaWYgKCFhcmVhc1ZpZXcuaXNDb25zdHJhaW5lZCgpKSB7CisgICAgICAgICAgICBh
cmVhc1ZpZXcuc2VsZWN0Um93KHJvdyk7CisgICAgICAgICAgICBjb250cmlidXRvcnNWaWV3LnNl
dE1hcmdpblRvcChyb3cuZmlyc3RDaGlsZC5vZmZzZXRUb3ApOworICAgICAgICAgICAgY29udHJp
YnV0b3JzVmlldy5zZXREYXRhKGFyZWFDb250cmlidXRvcnMocm93LmRhdGEpLCAnY29uc3RyYWlu
ZWQnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbW91c2VUaW1l
ciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICBjb250cmlidXRvcnNWaWV3LnJl
c2V0KCk7CisgICAgICAgIGFyZWFzVmlldy5yZXNldCgpOworICAgIH0sIDUwMCk7Cit9CisKKzwv
c2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS90b29sL3N0ZXBzL29wdGlvbnMucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wv
c3RlcHMvb3B0aW9ucy5weQppbmRleCBkNDY5MWI3NDQ0Mjk4NjRkNmViMWI0MGJmYjJlNDk1NjFh
MzM4ODFiLi5mYzc4MWE2Y2NiYTFiMmJkOWMzYjc2NzdmOWEzZjJkZTUxODYzZGQ3IDEwMDY0NAot
LS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvb3B0aW9ucy5weQorKysgYi9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvb3B0aW9ucy5weQpAQCAtNTgsMyArNTgs
NCBAQCBjbGFzcyBPcHRpb25zKG9iamVjdCk6CiAgICAgc3VnZ2VzdF9yZXZpZXdlcnMgPSBtYWtl
X29wdGlvbigiLS1zdWdnZXN0LXJldmlld2VycyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlZmF1
bHQ9RmFsc2UsIGhlbHA9Ik9mZmVyIHRvIENDIGFwcHJvcHJpYXRlIHJldmlld2Vycy4iKQogICAg
IHRlc3QgPSBtYWtlX29wdGlvbigiLS10ZXN0IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0i
dGVzdCIsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9IlJ1biBydW4td2Via2l0LXRlc3RzIGJlZm9yZSBj
b21taXR0aW5nLiIpCiAgICAgdXBkYXRlID0gbWFrZV9vcHRpb24oIi0tbm8tdXBkYXRlIiwgYWN0
aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InVwZGF0ZSIsIGRlZmF1bHQ9VHJ1ZSwgaGVscD0iRG9u
J3QgdXBkYXRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4iKQorICAgIGNoYW5nZWxvZ19jb3VudCA9
IG1ha2Vfb3B0aW9uKCItLWNoYW5nZWxvZy1jb3VudCIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJp
bnQiLCBkZXN0PSJjaGFuZ2Vsb2dfY291bnQiLCBoZWxwPSJOdW1iZXIgb2YgY2hhbmdlbG9ncyB0
byBwYXJzZS4iKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116281</attachid>
            <date>2011-11-22 15:16:51 -0800</date>
            <delta_ts>2011-11-30 16:15:19 -0800</delta_ts>
            <desc>Fixed per Eric&apos;s comment; also updated for ToT</desc>
            <filename>bug-72243-20111122151650.patch</filename>
            <type>text/plain</type>
            <size>41239</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAxMDI2CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggZjdlZmFiZmJhMjM0MmM5ZWYwYmEwOGM0MGQ4OThiODU0
NGQxODlkNy4uN2FiOTA5ZDMzNDQ2ZmI0OTcxMzUzMmQzM2ViNjM3NDgzODdjYjZkNiAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI4
IEBACisyMDExLTExLTIyICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAg
ICAgIEFkZCBhIHRvb2wgdG8gYW5hbHl6ZSBjaGFuZ2UgbG9ncworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyNDMKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRp
b24gb2YgYW5hbHl6ZS1jaGFuZ2Vsb2cgY29tbWFuZC4gVGhpcyB2ZXJzaW9uIHN1cHBvcnRzIHBh
cnNpbmcgbXVsdGlwbGUgY2hhbmdlbG9ncworICAgICAgICBpbiBhIHNpbmdsZSBkaXJlY3Rvcnkg
YW5kIHN1bW1hcml6ZXMgdGhlIHJlc3VsdCBpbiBqc29uIGZpbGVzLiBJdCBhbHNvIGNvcGllcyBz
dW1tYXJ5Lmh0bWwgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgICAgZm9yIHZpc3VhbGl6
aW5nIGpzb24gZmlsZXMuCisKKyAgICAgICAgVXNhZ2U6IHdlYmtpdC1wYXRjaCBhbmFseXplLWNo
YW5nZWxvZyBbLS1jaGFuZ2Vsb2ctY291bnQgTl0gPENIQU5HRUxPR19ESVI+IDxPVVRQVVRfRElS
PgorICAgICAgICB3aGVyZSBDSEFOR0VMT0dfRElSIGlzIHRoZSBkaXJlY3RvcnkgdG8gbG9vayBm
b3IgY2hhbmdlbG9ncywgT1VUUFVUX0RJUiBpcyB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhl
IHRvb2wKKyAgICAgICAgZ2VuZXJhdGVzIGpzb24gZmlsZXMsIGFuZCBOIGlzIHRoZSBudW1iZXIg
b2YgY2hhbmdlbG9ncyB0byBwYXJzZS4KKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29t
bW9uL2NoZWNrb3V0L2NoYW5nZWxvZy5weTogRml4ZWQgYSBidWcgaW4gcGFyc2VfZW50cmllc19m
cm9tX2ZpbGUgdGhhdCB0aGUgbGFzdCBlbnRyeSBpbgorICAgICAgICBhIGNoYW5nZWxvZyB3aXRo
b3V0IHJvbGxvdmVyIGlzIG5vdCBwYXJzZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9j
b21tb24vY29uZmlnL2NvbnRyaWJ1dGlvbmFyZWFzLnB5OiBBZGRlZCBuYW1lcygpLgorICAgICAg
ICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtX21vY2sucHk6IEFk
ZGVkIHJlYWRsaW5lIGFuZCBpdGVyYXRvciBzdXBwb3J0IHRvIFJlYWRhYmxlVGV4dEZpbGVPYmpl
Y3QuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5
OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9hbmFseXplY2hhbmdl
bG9nLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMv
YW5hbHl6ZWNoYW5nZWxvZ191bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93
ZWJraXRweS90b29sL2NvbW1hbmRzL2RhdGEvc3VtbWFyeS5odG1sOiBBZGRlZC4KKyAgICAgICAg
KiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvb3B0aW9ucy5weToKKwogMjAxMS0xMS0xNyAg
VmluY2VudCBTY2hlaWIgIDxzY2hlaWJAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFBvaW50ZXIg
TG9jazogSW5pdGlhbCBUZXN0cyBmb3IgbmF2aWdhdG9yLndlYmtpdFBvbnRlcgpkaWZmIC0tZ2l0
IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvY2hhbmdlbG9nLnB5IGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvY2hhbmdlbG9nLnB5CmluZGV4
IGM0ZDBhZDVkNzIwMTJkOGZmOWQyN2RkNGRiOTFiODI3MTNhYTNhNTQuLjU3NzY4MjhlNDE3MzJj
NmU2NWVjNzVkNjc1Y2U3M2QwMzQ1YWRhMjYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL2NoZWNrb3V0L2NoYW5nZWxvZy5weQorKysgYi9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9jaGVja291dC9jaGFuZ2Vsb2cucHkKQEAgLTI3NSwxMiArMjc1LDE3IEBA
IGNsYXNzIENoYW5nZUxvZyhvYmplY3QpOgogICAgICAgICBlbnRyeV9saW5lcy5hcHBlbmQoZmly
c3RfbGluZSkKIAogICAgICAgICBmb3IgbGluZSBpbiBjaGFuZ2Vsb2dfZmlsZToKLSAgICAgICAg
ICAgIGlmIGRhdGVfbGluZV9yZWdleHAubWF0Y2gobGluZSkgb3Igcm9sbGVkX292ZXJfcmVnZXhw
Lm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgaWYgcm9sbGVkX292ZXJfcmVnZXhwLm1hdGNoKGxp
bmUpOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIGRhdGVfbGluZV9y
ZWdleHAubWF0Y2gobGluZSk6CiAgICAgICAgICAgICAgICAgIyBSZW1vdmUgdGhlIGV4dHJhIG5l
d2xpbmUgYXQgdGhlIGVuZAogICAgICAgICAgICAgICAgIHlpZWxkIENoYW5nZUxvZ0VudHJ5KCcn
LmpvaW4oZW50cnlfbGluZXNbOi0xXSkpCiAgICAgICAgICAgICAgICAgZW50cnlfbGluZXMgPSBb
XQogICAgICAgICAgICAgZW50cnlfbGluZXMuYXBwZW5kKGxpbmUpCiAKKyAgICAgICAgeWllbGQg
Q2hhbmdlTG9nRW50cnkoJycuam9pbihlbnRyeV9saW5lc1s6LTFdKSkKKwogICAgIGRlZiBsYXRl
c3RfZW50cnkoc2VsZik6CiAgICAgICAgICMgQ2hhbmdlTG9nIGZpbGVzIGFyZSBhbHdheXMgVVRG
LTgsIHdlIHJlYWQgdGhlbSBpbiBhcyBzdWNoIHRvIHN1cHBvcnQgUmV2aWV3ZXJzIHdpdGggdW5p
Y29kZSBpbiB0aGVpciBuYW1lcy4KICAgICAgICAgY2hhbmdlbG9nX2ZpbGUgPSBjb2RlY3Mub3Bl
bihzZWxmLnBhdGgsICJyIiwgInV0Zi04IikKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL2NvbmZpZy9jb250cmlidXRpb25hcmVhcy5weSBiL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvY29tbW9uL2NvbmZpZy9jb250cmlidXRpb25hcmVhcy5weQppbmRleCA2ZGVkMjRk
NzE4ZmJkYTY2MzI5ZGFkYTBjM2VmMGFlZjA1YzE2YWVjLi5iNDhkZjJhNTViNGQyZjVhZTIyNzJk
NTZlODU2OWE0YjczOTY0ZWQzIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9jb25maWcvY29udHJpYnV0aW9uYXJlYXMucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vY29uZmlnL2NvbnRyaWJ1dGlvbmFyZWFzLnB5CkBAIC0xNzcsNiArMTc3LDkg
QEAgY2xhc3MgQ29udHJpYnV0aW9uQXJlYXMob2JqZWN0KToKICAgICAgICAgc2VsZi5fZmlsZXN5
c3RlbSA9IGZpbGVzeXN0ZW0KICAgICAgICAgc2VsZi5fY29udHJpYnV0aW9uX2FyZWFzID0gdGFi
bGUKIAorICAgIGRlZiBuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFthcmVhLm5hbWUoKSBm
b3IgYXJlYSBpbiBzZWxmLl9jb250cmlidXRpb25fYXJlYXNdCisKICAgICBkZWYgX3NwbGl0X3Bh
dGgoc2VsZiwgcGF0aCk6CiAgICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgIHdoaWxlIHBhdGgg
YW5kIGxlbihwYXRoKToKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L3N5c3RlbS9maWxlc3lzdGVtX21vY2sucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5CmluZGV4IDU3ZGNlM2RiNzNiNmQzMmRhNWFkZDIx
ZDcxMDJhOTU1OWM4NTFhZTEuLjJjNTU5YjZkZmU2N2Q0NDg0M2M5ODczMDYwYzQwZDM1ZjJmYTdh
NTEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxl
c3lzdGVtX21vY2sucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVt
L2ZpbGVzeXN0ZW1fbW9jay5weQpAQCAtMjgwLDcgKzI4MCw3IEBAIGNsYXNzIE1vY2tGaWxlU3lz
dGVtKG9iamVjdCk6CiAgICAgZGVmIG9wZW5fdGV4dF9maWxlX2Zvcl9yZWFkaW5nKHNlbGYsIHBh
dGgpOgogICAgICAgICBpZiBzZWxmLmZpbGVzW3BhdGhdIGlzIE5vbmU6CiAgICAgICAgICAgICBz
ZWxmLl9yYWlzZV9ub3RfZm91bmQocGF0aCkKLSAgICAgICAgcmV0dXJuIFJlYWRhYmxlVGV4dEZp
bGVPYmplY3Qoc2VsZiwgcGF0aCkKKyAgICAgICAgcmV0dXJuIFJlYWRhYmxlVGV4dEZpbGVPYmpl
Y3Qoc2VsZiwgcGF0aCwgc2VsZi5maWxlc1twYXRoXSkKIAogICAgIGRlZiBvcGVuX3RleHRfZmls
ZV9mb3Jfd3JpdGluZyhzZWxmLCBwYXRoKToKICAgICAgICAgcmV0dXJuIFdyaXRhYmxlVGV4dEZp
bGVPYmplY3Qoc2VsZiwgcGF0aCkKQEAgLTM4MCwzICszODAsMjIgQEAgY2xhc3MgUmVhZGFibGVC
aW5hcnlGaWxlT2JqZWN0KG9iamVjdCk6CiBjbGFzcyBSZWFkYWJsZVRleHRGaWxlT2JqZWN0KFJl
YWRhYmxlQmluYXJ5RmlsZU9iamVjdCk6CiAgICAgZGVmIHJlYWQoc2VsZiwgYnl0ZXM9Tm9uZSk6
CiAgICAgICAgIHJldHVybiBSZWFkYWJsZUJpbmFyeUZpbGVPYmplY3QucmVhZChzZWxmLCBieXRl
cykuZGVjb2RlKCd1dGYtOCcpCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIGlm
IHNlbGYub2Zmc2V0ID49IGxlbihzZWxmLmRhdGEpOgorICAgICAgICAgICAgcmV0dXJuIHVuaWNv
ZGUoKQorICAgICAgICBzdGFydCA9IHNlbGYub2Zmc2V0CisgICAgICAgIHdoaWxlIHNlbGYub2Zm
c2V0IDwgbGVuKHNlbGYuZGF0YSk6CisgICAgICAgICAgICBpZiBzZWxmLmRhdGFbc2VsZi5vZmZz
ZXRdID09ICdcbic6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYub2Zm
c2V0ICs9IDEKKyAgICAgICAgc2VsZi5vZmZzZXQgKz0gMQorICAgICAgICByZXR1cm4gc2VsZi5k
YXRhW3N0YXJ0OnNlbGYub2Zmc2V0XS5kZWNvZGUoJ3V0Zi04JykKKworICAgIGRlZiBfX2l0ZXJf
XyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAg
ICAgICBpZiBzZWxmLm9mZnNldCA+PSBsZW4oc2VsZi5kYXRhKToKKyAgICAgICAgICAgIHJhaXNl
IFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGxpbmUoKQpkaWZmIC0tZ2l0
IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5IGIvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5CmluZGV4IDFhOThk
YjBkNDg2YTVkZWQ2ZjE4MWMzYjgxZDAxMTU0Y2NlZDg2NjUuLmVmMDViNWFjNGJlZGRhZmVkYjVi
ZmMyNDVmNjM5MzE0Zjg4MTQwNjcgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
dG9vbC9jb21tYW5kcy9fX2luaXRfXy5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvY29tbWFuZHMvX19pbml0X18ucHkKQEAgLTEsNiArMSw3IEBACiAjIFJlcXVpcmVkIGZvciBQ
eXRob24gdG8gc2VhcmNoIHRoaXMgZGlyZWN0b3J5IGZvciBtb2R1bGUgZmlsZXMKIAogZnJvbSB3
ZWJraXRweS50b29sLmNvbW1hbmRzLmFkZHVzZXJzdG9ncm91cHMgaW1wb3J0IEFkZFVzZXJzVG9H
cm91cHMKK2Zyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5hbmFseXplY2hhbmdlbG9nIGltcG9y
dCBBbmFseXplQ2hhbmdlTG9nCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuYXBwbHl3YXRj
aGxpc3Rsb2NhbCBpbXBvcnQgQXBwbHlXYXRjaExpc3RMb2NhbAogZnJvbSB3ZWJraXRweS50b29s
LmNvbW1hbmRzLmJ1Z2ZvcnRlc3QgaW1wb3J0IEJ1Z0ZvclRlc3QKIGZyb20gd2Via2l0cHkudG9v
bC5jb21tYW5kcy5idWdzZWFyY2ggaW1wb3J0IEJ1Z1NlYXJjaApkaWZmIC0tZ2l0IGEvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2FuYWx5emVjaGFuZ2Vsb2cucHkgYi9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvYW5hbHl6ZWNoYW5nZWxvZy5weQpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi40MDk2NmQ0ZjQ5NDBiYmI0MTEzN2VmNmI4NmJhNTQ5Y2VhZTIwOGQ4Ci0tLSAvZGV2
L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2FuYWx5emVj
aGFuZ2Vsb2cucHkKQEAgLTAsMCArMSwyMDkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDExIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMK
KyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQg
anNvbgoraW1wb3J0IHJlCitpbXBvcnQgdGltZQorZnJvbSB3ZWJraXRweS5jb21tb24uY2hlY2tv
dXQuc2NtLmRldGVjdGlvbiBpbXBvcnQgU0NNRGV0ZWN0b3IKK2Zyb20gd2Via2l0cHkuY29tbW9u
LmNoZWNrb3V0LmNoYW5nZWxvZyBpbXBvcnQgQ2hhbmdlTG9nCitmcm9tIHdlYmtpdHB5LmNvbW1v
bi5jb25maWcuY29udHJpYnV0aW9uYXJlYXMgaW1wb3J0IENvbnRyaWJ1dGlvbkFyZWFzCitmcm9t
IHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbSBpbXBvcnQgRmlsZVN5c3RlbQorZnJv
bSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmV4ZWN1dGl2ZSBpbXBvcnQgRXhlY3V0aXZlCitmcm9t
IHdlYmtpdHB5LnRvb2wubXVsdGljb21tYW5kdG9vbCBpbXBvcnQgQWJzdHJhY3REZWNsYXJhdGl2
ZUNvbW1hbmQKK2Zyb20gd2Via2l0cHkudG9vbCBpbXBvcnQgc3RlcHMKKworCitjbGFzcyBBbmFs
eXplQ2hhbmdlTG9nKEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKKyAgICBuYW1lID0gImFu
YWx5emUtY2hhbmdlbG9nIgorICAgIGhlbHBfdGV4dCA9ICJFeHBlcmltZW50YWwgY29tbWFuZCBm
b3IgYW5hbHl6aW5nIGNoYW5nZSBsb2dzLiIKKyAgICBsb25nX2hlbHAgPSAiVGhpcyBjb21tYW5k
IHBhcnNlcyBjaGFuZ2Vsb2dzIGluIGEgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgc3VtbWFyaXpl
cyB0aGUgcmVzdWx0IGFzIEpTT04gZmlsZXMuIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgor
ICAgICAgICBvcHRpb25zID0gWworICAgICAgICAgICAgc3RlcHMuT3B0aW9ucy5jaGFuZ2Vsb2df
Y291bnQsCisgICAgICAgIF0KKyAgICAgICAgQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQuX19p
bml0X18oc2VsZiwgb3B0aW9ucz1vcHRpb25zKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRl
ZiBfZW51bWVyYXRlX2NoYW5nZWxvZ3MoZmlsZXN5c3RlbSwgZGlybmFtZSwgY2hhbmdlbG9nX2Nv
dW50KToKKyAgICAgICAgY2hhbmdlbG9ncyA9IFtmaWxlc3lzdGVtLmpvaW4oZGlybmFtZSwgZmls
ZW5hbWUpIGZvciBmaWxlbmFtZSBpbiBmaWxlc3lzdGVtLmxpc3RkaXIoZGlybmFtZSkgaWYgcmUu
bWF0Y2goJ15DaGFuZ2VMb2coLShcZHs0fS1cZHsyfS1cZHsyfSkpPyQnLCBmaWxlbmFtZSldCisg
ICAgICAgICMgTWFrZSBzdXJlIENoYW5nZUxvZyBzaG93cyB1cCBiZWZvcmUgQ2hhbmdlTG9nLTIw
MTEtMDEtMDEKKyAgICAgICAgY2hhbmdlbG9ncyA9IHNvcnRlZChjaGFuZ2Vsb2dzLCBrZXk9bGFt
YmRhIGZpbGVuYW1lOiBmaWxlbmFtZSArICdYJywgcmV2ZXJzZT1UcnVlKQorICAgICAgICByZXR1
cm4gY2hhbmdlbG9nc1s6Y2hhbmdlbG9nX2NvdW50XQorCisgICAgQHN0YXRpY21ldGhvZAorICAg
IGRlZiBfZ2VuZXJhdGVfanNvbnMoZmlsZXN5c3RlbSwganNvbl9maWxlcywgb3V0cHV0X2Rpcik6
CisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBqc29uX2ZpbGVzOgorICAgICAgICAgICAgb3V0cHV0
X2ZpbGUgPSBmaWxlc3lzdGVtLm9wZW5fdGV4dF9maWxlX2Zvcl93cml0aW5nKGZpbGVzeXN0ZW0u
am9pbihvdXRwdXRfZGlyLCBmaWxlbmFtZSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAg
ICAgICAgcHJpbnQgJyAgICBHZW5lcmF0aW5nJywgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICBv
dXRwdXRfZmlsZS53cml0ZShqc29uLmR1bXBzKGpzb25fZmlsZXNbZmlsZW5hbWVdLCBpbmRlbnQ9
MikpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG91dHB1dF9maWxlLmNs
b3NlKCkKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAg
ICAgICBmaWxlc3lzdGVtID0gc2VsZi5fdG9vbC5maWxlc3lzdGVtCisgICAgICAgIGlmIGxlbihh
cmdzKSA8IDEgb3Igbm90IGZpbGVzeXN0ZW0uZXhpc3RzKGFyZ3NbMF0pOgorICAgICAgICAgICAg
cHJpbnQgIk5lZWQgdGhlIGRpcmVjdG9yeSBuYW1lIHRvIGxvb2sgZm9yIGNoYW5nZWxvZyBhcyB0
aGUgZmlyc3QgYXJndW1lbnQiCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY2hhbmdlbG9n
X2RpciA9IGZpbGVzeXN0ZW0uYWJzcGF0aChhcmdzWzBdKQorCisgICAgICAgIGlmIGxlbihhcmdz
KSA8IDIgb3Igbm90IGZpbGVzeXN0ZW0uZXhpc3RzKGFyZ3NbMV0pOgorICAgICAgICAgICAgcHJp
bnQgIk5lZWQgdGhlIG91dHB1dCBkaXJlY3RvcnkgbmFtZSBhcyB0aGUgZmlyc3QgYXJndW1lbnQi
CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgb3V0cHV0X2RpciA9IGFyZ3NbMV0KKworICAg
ICAgICBzdGFydFRpbWUgPSB0aW1lLnRpbWUoKQorCisgICAgICAgIHByaW50ICdFbnVtZXJhdGlu
ZyBDaGFuZ2VMb2cgZmlsZXMuLi4nCisgICAgICAgIGNoYW5nZWxvZ3MgPSBBbmFseXplQ2hhbmdl
TG9nLl9lbnVtZXJhdGVfY2hhbmdlbG9ncyhmaWxlc3lzdGVtLCBjaGFuZ2Vsb2dfZGlyLCBvcHRp
b25zLmNoYW5nZWxvZ19jb3VudCkKKworICAgICAgICBhbmFseXplciA9IENoYW5nZUxvZ0FuYWx5
emVyKHNlbGYsIGNoYW5nZWxvZ3MpCisgICAgICAgIGFuYWx5emVyLmFuYWx5emUoKQorCisgICAg
ICAgIHByaW50ICdHZW5lcmF0aW5nIGpzb24gZmlsZXMuLi4nCisgICAgICAgIGpzb25fZmlsZXMg
PSB7CisgICAgICAgICAgICAnc3VtbWFyeS5qc29uJzogYW5hbHl6ZXIuc3VtbWFyeSgpLAorICAg
ICAgICAgICAgJ2NvbnRyaWJ1dG9ycy5qc29uJzogYW5hbHl6ZXIuY29udHJpYnV0b3JzX3N0YXRp
c3RpY3MoKSwKKyAgICAgICAgICAgICdhcmVhcy5qc29uJzogYW5hbHl6ZXIuYXJlYXNfc3RhdGlz
dGljcygpLAorICAgICAgICB9CisgICAgICAgIEFuYWx5emVDaGFuZ2VMb2cuX2dlbmVyYXRlX2pz
b25zKGZpbGVzeXN0ZW0sIGpzb25fZmlsZXMsIG91dHB1dF9kaXIpCisgICAgICAgIGNvbW1hbmRz
X2RpciA9IGZpbGVzeXN0ZW0uZGlybmFtZShmaWxlc3lzdGVtLmFic3BhdGgoX19maWxlX18pKQor
ICAgICAgICBmaWxlc3lzdGVtLmNvcHlmaWxlKGZpbGVzeXN0ZW0uam9pbihjb21tYW5kc19kaXIs
ICdkYXRhL3N1bW1hcnkuaHRtbCcpLCBmaWxlc3lzdGVtLmpvaW4ob3V0cHV0X2RpciwgJ3N1bW1h
cnkuaHRtbCcpKQorCisgICAgICAgIHRpY2sgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0VGltZQorICAg
ICAgICBwcmludCAnRmluaXNoZWQgaW4gJTAyZG06JTAyZHMnICUgKGludCh0aWNrIC8gNjApLCBp
bnQodGljayAlIDYwKSkKKworCitjbGFzcyBDaGFuZ2VMb2dBbmFseXplcihvYmplY3QpOgorICAg
IGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBjaGFuZ2Vsb2dfcGF0aHMpOgorICAgICAgICBzZWxm
Ll9jaGFuZ2Vsb2dfcGF0aHMgPSBjaGFuZ2Vsb2dfcGF0aHMKKyAgICAgICAgc2VsZi5fZmlsZXN5
c3RlbSA9IGhvc3QuZmlsZXN5c3RlbQorICAgICAgICBzZWxmLl9jb250cmlidXRpb25fYXJlYXMg
PSBDb250cmlidXRpb25BcmVhcyhob3N0LmZpbGVzeXN0ZW0pCisgICAgICAgIHNlbGYuX3NjbSA9
IGhvc3Quc2NtKCkKKyAgICAgICAgc2VsZi5fcGFyc2VkX3JldmlzaW9ucyA9IHt9CisKKyAgICAg
ICAgc2VsZi5fY29udHJpYnV0b3JzX3N0YXRpc3RpY3MgPSB7fQorICAgICAgICBzZWxmLl9hcmVh
c19zdGF0aXN0aWNzID0gZGljdChbKGFyZWEsIHsncmV2aWV3ZWQnOiAwLCAndW5yZXZpZXdlZCc6
IDAsICdjb250cmlidXRvcnMnOiB7fX0pIGZvciBhcmVhIGluIHNlbGYuX2NvbnRyaWJ1dGlvbl9h
cmVhcy5uYW1lcygpXSkKKyAgICAgICAgc2VsZi5fc3VtbWFyeSA9IHsncmV2aWV3ZWQnOiAwLCAn
dW5yZXZpZXdlZCc6IDB9CisKKyAgICAgICAgc2VsZi5fbG9uZ2VzdF9maWxlbmFtZSA9IG1heChb
bGVuKHBhdGgpIC0gbGVuKHNlbGYuX3NjbS5jaGVja291dF9yb290KSBmb3IgcGF0aCBpbiBjaGFu
Z2Vsb2dfcGF0aHNdKQorICAgICAgICBzZWxmLl9wcmV2aW91c19zdGF0dXMgPSAnJworCisgICAg
ZGVmIGNvbnRyaWJ1dG9yc19zdGF0aXN0aWNzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5f
Y29udHJpYnV0b3JzX3N0YXRpc3RpY3MKKworICAgIGRlZiBhcmVhc19zdGF0aXN0aWNzKHNlbGYp
OgorICAgICAgICByZXR1cm4gc2VsZi5fYXJlYXNfc3RhdGlzdGljcworCisgICAgZGVmIHN1bW1h
cnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zdW1tYXJ5CisKKyAgICBkZWYgX3ByaW50
X3N0YXR1cyhzZWxmLCBuZXdfc3RhdHVzKToKKyAgICAgICAgc3RhdHVzID0gbmV3X3N0YXR1cyAr
ICgnICcgKiBtYXgobGVuKHNlbGYuX3ByZXZpb3VzX3N0YXR1cykgLSBsZW4obmV3X3N0YXR1cykg
LSAxLCAwKSkKKyAgICAgICAgcHJpbnQgIlxiIiAqIGxlbihzZWxmLl9wcmV2aW91c19zdGF0dXMp
ICsgc3RhdHVzLAorICAgICAgICBzZWxmLl9wcmV2aW91c19zdGF0dXMgPSBzdGF0dXMgKyAnICcK
KworICAgIGRlZiBfcHJpbnRfZmlsZW5hbWUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBpZiBz
ZWxmLl9wcmV2aW91c19zdGF0dXM6CisgICAgICAgICAgICBwcmludAorICAgICAgICBwcmludCAo
JyUnICsgc3RyKHNlbGYuX2xvbmdlc3RfZmlsZW5hbWUpICsgJ3M6JykgJSBmaWxlbmFtZSwKKyAg
ICAgICAgc2VsZi5fcHJldmlvdXNfc3RhdHVzID0gJycKKworICAgIGRlZiBhbmFseXplKHNlbGYp
OgorICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLl9jaGFuZ2Vsb2dfcGF0aHM6CisgICAgICAgICAg
ICBzZWxmLl9wcmludF9maWxlbmFtZShzZWxmLl9maWxlc3lzdGVtLnJlbHBhdGgocGF0aCwgc2Vs
Zi5fc2NtLmNoZWNrb3V0X3Jvb3QpKQorICAgICAgICAgICAgY2hhbmdlbG9nID0gc2VsZi5fZmls
ZXN5c3RlbS5vcGVuX3RleHRfZmlsZV9mb3JfcmVhZGluZyhwYXRoKQorICAgICAgICAgICAgdHJ5
OgorICAgICAgICAgICAgICAgIHNlbGYuX3ByaW50X3N0YXR1cygnUGFyc2luZyBlbnRyaWVzLi4u
JykKKyAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcGFyc2VkX2VudHJpZXMgPSBzZWxmLl9hbmFs
eXplX2VudHJpZXMoQ2hhbmdlTG9nLnBhcnNlX2VudHJpZXNfZnJvbV9maWxlKGNoYW5nZWxvZyks
IHBhdGgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGNoYW5nZWxvZy5j
bG9zZSgpCisgICAgICAgICAgICBzZWxmLl9wcmludF9zdGF0dXMoJ0RvbmUgKCVkIGVudHJpZXMp
JyAlIG51bWJlcl9vZl9wYXJzZWRfZW50cmllcykKKyAgICAgICAgcHJpbnQKKyAgICAgICAgc2Vs
Zi5fc3VtbWFyeVsnY29udHJpYnV0b3JzJ10gPSBsZW4oc2VsZi5fY29udHJpYnV0b3JzX3N0YXRp
c3RpY3MpCisgICAgICAgIHNlbGYuX3N1bW1hcnlbJ2NvbnRyaWJ1dG9yc193aXRoX3Jldmlld3Mn
XSA9IHN1bShbMSBmb3IgY29udHJpYnV0b3IgaW4gc2VsZi5fY29udHJpYnV0b3JzX3N0YXRpc3Rp
Y3MudmFsdWVzKCkgaWYgY29udHJpYnV0b3JbJ3Jldmlld3MnXVsndG90YWwnXV0pCisgICAgICAg
IHNlbGYuX3N1bW1hcnlbJ2NvbnRyaWJ1dG9yc193aXRob3V0X3Jldmlld3MnXSA9IHNlbGYuX3N1
bW1hcnlbJ2NvbnRyaWJ1dG9ycyddIC0gc2VsZi5fc3VtbWFyeVsnY29udHJpYnV0b3JzX3dpdGhf
cmV2aWV3cyddCisKKyAgICBkZWYgX2NvbGxlY3Rfc3RhdGlzdGljc19mb3JfY29udHJpYnV0b3Jf
YXJlYShzZWxmLCBhcmVhLCBjb250cmlidXRvciwgY29udHJpYnV0aW9uX3R5cGUsIHJldmlld2Vk
KToKKyAgICAgICAgYXJlYV9jb250cmlidXRvcnMgPSBzZWxmLl9hcmVhc19zdGF0aXN0aWNzW2Fy
ZWFdWydjb250cmlidXRvcnMnXQorICAgICAgICBpZiBjb250cmlidXRvciBub3QgaW4gYXJlYV9j
b250cmlidXRvcnM6CisgICAgICAgICAgICBhcmVhX2NvbnRyaWJ1dG9yc1tjb250cmlidXRvcl0g
PSB7J3Jldmlld3MnOiAwLCAncmV2aWV3ZWQnOiAwLCAndW5yZXZpZXdlZCc6IDB9CisgICAgICAg
IGlmIGNvbnRyaWJ1dGlvbl90eXBlID09ICdwYXRjaGVzJzoKKyAgICAgICAgICAgIGNvbnRyaWJ1
dGlvbl90eXBlID0gJ3Jldmlld2VkJyBpZiByZXZpZXdlZCBlbHNlICd1bnJldmlld2VkJworICAg
ICAgICBhcmVhX2NvbnRyaWJ1dG9yc1tjb250cmlidXRvcl1bY29udHJpYnV0aW9uX3R5cGVdICs9
IDEKKworICAgIGRlZiBfY29sbGVjdF9zdGF0aXN0aWNzX2Zvcl9jb250cmlidXRvcihzZWxmLCBj
b250cmlidXRvciwgY29udHJpYnV0aW9uX3R5cGUsIGFyZWFzLCB0b3VjaGVkX2ZpbGVzLCByZXZp
ZXdlZCk6CisgICAgICAgIGlmIGNvbnRyaWJ1dG9yIG5vdCBpbiBzZWxmLl9jb250cmlidXRvcnNf
c3RhdGlzdGljczoKKyAgICAgICAgICAgIHNlbGYuX2NvbnRyaWJ1dG9yc19zdGF0aXN0aWNzW2Nv
bnRyaWJ1dG9yXSA9IHsKKyAgICAgICAgICAgICAgICAncmV2aWV3cyc6IHsndG90YWwnOiAwLCAn
YXJlYXMnOiB7fSwgJ2ZpbGVzJzoge319LAorICAgICAgICAgICAgICAgICdwYXRjaGVzJzogeydy
ZXZpZXdlZCc6IDAsICd1bnJldmlld2VkJzogMCwgJ2FyZWFzJzoge30sICdmaWxlcyc6IHt9fX0K
KyAgICAgICAgc3RhdGlzdGljcyA9IHNlbGYuX2NvbnRyaWJ1dG9yc19zdGF0aXN0aWNzW2NvbnRy
aWJ1dG9yXVtjb250cmlidXRpb25fdHlwZV0KKworICAgICAgICBpZiBjb250cmlidXRpb25fdHlw
ZSA9PSAncmV2aWV3cyc6CisgICAgICAgICAgICBzdGF0aXN0aWNzWyd0b3RhbCddICs9IDEKKyAg
ICAgICAgZWxpZiByZXZpZXdlZDoKKyAgICAgICAgICAgIHN0YXRpc3RpY3NbJ3Jldmlld2VkJ10g
Kz0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdGlzdGljc1sndW5yZXZpZXdlZCdd
ICs9IDEKKworICAgICAgICBmb3IgYXJlYSBpbiBhcmVhczoKKyAgICAgICAgICAgIHNlbGYuX2lu
Y3JlbWVudF9kaWN0aW9uYXJ5X3ZhbHVlKHN0YXRpc3RpY3NbJ2FyZWFzJ10sIGFyZWEpCisgICAg
ICAgICAgICBzZWxmLl9jb2xsZWN0X3N0YXRpc3RpY3NfZm9yX2NvbnRyaWJ1dG9yX2FyZWEoYXJl
YSwgY29udHJpYnV0b3IsIGNvbnRyaWJ1dGlvbl90eXBlLCByZXZpZXdlZCkKKyAgICAgICAgZm9y
IHRvdWNoZWRmaWxlIGluIHRvdWNoZWRfZmlsZXM6CisgICAgICAgICAgICBzZWxmLl9pbmNyZW1l
bnRfZGljdGlvbmFyeV92YWx1ZShzdGF0aXN0aWNzWydmaWxlcyddLCB0b3VjaGVkZmlsZSkKKwor
ICAgIGRlZiBfaW5jcmVtZW50X2RpY3Rpb25hcnlfdmFsdWUoc2VsZiwgZGljdGlvbmFyeSwga2V5
KToKKyAgICAgICAgZGljdGlvbmFyeVtrZXldID0gZGljdGlvbmFyeS5nZXQoa2V5LCAwKSArIDEK
KworICAgIGRlZiBfYW5hbHl6ZV9lbnRyaWVzKHNlbGYsIGVudHJpZXMsIGNoYW5nZWxvZ19wYXRo
KToKKyAgICAgICAgZGlybmFtZSA9IHNlbGYuX2ZpbGVzeXN0ZW0uZGlybmFtZShjaGFuZ2Vsb2df
cGF0aCkKKyAgICAgICAgZm9yIGksIGVudHJ5IGluIGVudW1lcmF0ZShlbnRyaWVzKToKKyAgICAg
ICAgICAgIHNlbGYuX3ByaW50X3N0YXR1cygnKCVzKSBlbnRyaWVzJyAlIGkpCisgICAgICAgICAg
ICBhc3NlcnQoZW50cnkuYXV0aG9ycygpKQorCisgICAgICAgICAgICB0b3VjaGVkZmlsZXNfZm9y
X2VudHJ5ID0gW3NlbGYuX2ZpbGVzeXN0ZW0ucmVscGF0aChzZWxmLl9maWxlc3lzdGVtLmpvaW4o
ZGlybmFtZSwgbmFtZSksIHNlbGYuX3NjbS5jaGVja291dF9yb290KSBmb3IgbmFtZSBpbiBlbnRy
eS50b3VjaGVkX2ZpbGVzKCldCisgICAgICAgICAgICBhcmVhc19mb3JfZW50cnkgPSBzZWxmLl9j
b250cmlidXRpb25fYXJlYXMuYXJlYXNfZm9yX3RvdWNoZWRfZmlsZXModG91Y2hlZGZpbGVzX2Zv
cl9lbnRyeSkKKyAgICAgICAgICAgIGF1dGhvcnNfZm9yX2VudHJ5ID0gZW50cnkuYXV0aG9ycygp
CisgICAgICAgICAgICByZXZpZXdlcnNfZm9yX2VudHJ5ID0gZW50cnkucmV2aWV3ZXJzKCkKKwor
ICAgICAgICAgICAgZm9yIHJldmlld2VyIGluIHJldmlld2Vyc19mb3JfZW50cnk6CisgICAgICAg
ICAgICAgICAgc2VsZi5fY29sbGVjdF9zdGF0aXN0aWNzX2Zvcl9jb250cmlidXRvcihyZXZpZXdl
ci5mdWxsX25hbWUsICdyZXZpZXdzJywgYXJlYXNfZm9yX2VudHJ5LCB0b3VjaGVkZmlsZXNfZm9y
X2VudHJ5LCByZXZpZXdlZD1UcnVlKQorCisgICAgICAgICAgICBmb3IgYXV0aG9yIGluIGF1dGhv
cnNfZm9yX2VudHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbGxlY3Rfc3RhdGlzdGljc19m
b3JfY29udHJpYnV0b3IoYXV0aG9yWyduYW1lJ10sICdwYXRjaGVzJywgYXJlYXNfZm9yX2VudHJ5
LCB0b3VjaGVkZmlsZXNfZm9yX2VudHJ5LAorICAgICAgICAgICAgICAgICAgICByZXZpZXdlZD1i
b29sKHJldmlld2Vyc19mb3JfZW50cnkpKQorCisgICAgICAgICAgICBmb3IgYXJlYSBpbiBhcmVh
c19mb3JfZW50cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fYXJlYXNfc3RhdGlzdGljc1thcmVh
XVsncmV2aWV3ZWQnIGlmIHJldmlld2Vyc19mb3JfZW50cnkgZWxzZSAndW5yZXZpZXdlZCddICs9
IDEKKworICAgICAgICAgICAgc2VsZi5fc3VtbWFyeVsncmV2aWV3ZWQnIGlmIHJldmlld2Vyc19m
b3JfZW50cnkgZWxzZSAndW5yZXZpZXdlZCddICs9IDEKKworICAgICAgICAgICAgaSArPSAxCisg
ICAgICAgIHNlbGYuX3ByaW50X3N0YXR1cygnKCVzKSBlbnRyaWVzJyAlIGkpCisgICAgICAgIHJl
dHVybiBpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMv
YW5hbHl6ZWNoYW5nZWxvZ191bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9v
bC9jb21tYW5kcy9hbmFseXplY2hhbmdlbG9nX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmYwY2E2
NmQ3MjE1MjE0MzRlNzNlZjA5NDUyMDE4MjZjZjZkMmQyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvYW5hbHl6ZWNoYW5nZWxvZ191bml0
dGVzdC5weQpAQCAtMCwwICsxLDE4MyBAQAorIyBDcHlyaWdodCAoYykgMjAxMSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
IyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdv
b2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IGpzb24K
K2ltcG9ydCBzeXMKK2Zyb20gd2Via2l0cHkuY29tbW9uLmNvbmZpZy5jb250cmlidXRpb25hcmVh
cyBpbXBvcnQgQ29udHJpYnV0aW9uQXJlYXMKK2Zyb20gd2Via2l0cHkuY29tbW9uLmhvc3RfbW9j
ayBpbXBvcnQgTW9ja0hvc3QKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5maWxlc3lzdGVt
X21vY2sgaW1wb3J0IE1vY2tGaWxlU3lzdGVtCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0u
ZXhlY3V0aXZlIGltcG9ydCBFeGVjdXRpdmUKK2Zyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5h
bmFseXplY2hhbmdlbG9nIGltcG9ydCBBbmFseXplQ2hhbmdlTG9nCitmcm9tIHdlYmtpdHB5LnRv
b2wuY29tbWFuZHMuYW5hbHl6ZWNoYW5nZWxvZyBpbXBvcnQgQ2hhbmdlTG9nQW5hbHl6ZXIKK2Zy
b20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5jb21tYW5kdGVzdCBpbXBvcnQgQ29tbWFuZHNUZXN0
Citmcm9tIHdlYmtpdHB5LnRvb2wubXVsdGljb21tYW5kdG9vbCBpbXBvcnQgQWJzdHJhY3REZWNs
YXJhdGl2ZUNvbW1hbmQKKworCitjbGFzcyBBbmFseXplQ2hhbmdlTG9nVGVzdChDb21tYW5kc1Rl
c3QpOgorICAgIGRlZiB0ZXN0X2VudW1lcmF0ZV9lbnVtZXJhdGVfY2hhbmdlbG9ncyhzZWxmKToK
KyAgICAgICAgZmlsZXN5c3RlbSA9IE1vY2tGaWxlU3lzdGVtKHsKKyAgICAgICAgICAgICdmb28v
Q2hhbmdlTG9nJzogJycsCisgICAgICAgICAgICAnZm9vL0NoYW5nZUxvZy0yMDEwLTA2LTIzJzog
JycsCisgICAgICAgICAgICAnZm9vL0NoYW5nZUxvZy0yMDEwLTEyLTMxJzogJycsCisgICAgICAg
ICAgICAnZm9vL0NoYW5nZUxvZy14JzogJycsCisgICAgICAgICAgICAnZm9vL0NoYW5nZUxvZy0y
MDExLTAxLTAxJzogJycsCisgICAgICAgIH0pCisgICAgICAgIGNoYW5nZWxvZ3MgPSBBbmFseXpl
Q2hhbmdlTG9nLl9lbnVtZXJhdGVfY2hhbmdlbG9ncyhmaWxlc3lzdGVtLCAnZm9vLycsIE5vbmUp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hhbmdlbG9ncywgWydmb28vQ2hhbmdlTG9nJywg
J2Zvby9DaGFuZ2VMb2ctMjAxMS0wMS0wMScsICdmb28vQ2hhbmdlTG9nLTIwMTAtMTItMzEnLCAn
Zm9vL0NoYW5nZUxvZy0yMDEwLTA2LTIzJ10pCisKKyAgICAgICAgY2hhbmdlbG9ncyA9IEFuYWx5
emVDaGFuZ2VMb2cuX2VudW1lcmF0ZV9jaGFuZ2Vsb2dzKGZpbGVzeXN0ZW0sICdmb28vJywgMikK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFuZ2Vsb2dzLCBbJ2Zvby9DaGFuZ2VMb2cnLCAn
Zm9vL0NoYW5nZUxvZy0yMDExLTAxLTAxJ10pCisKKyAgICBkZWYgdGVzdF9nZW5lcmF0ZV9qc29u
cyhzZWxmKToKKyAgICAgICAgZmlsZXN5c3RlbSA9IE1vY2tGaWxlU3lzdGVtKCkKKyAgICAgICAg
dGVzdF9qc29uID0geydhcnJheS5qc29uJzogWzEsIDIsIDMsIHsna2V5JzogJ3ZhbHVlJ31dLCAn
ZGljdGlvbmFyeS5qc29uJzogeydzb21la2V5JzogJ3NvbWV2YWx1ZScsICdhcnJheSc6IFs0LCA1
XX19CisgICAgICAgIHN5c19zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHRyeToKKyAgICAg
ICAgICAgIHN5cy5zdGRvdXQgPSBmaWxlc3lzdGVtLm9wZW5fdGV4dF9maWxlX2Zvcl93cml0aW5n
KCdzdGRvdXQnKQorICAgICAgICAgICAgQW5hbHl6ZUNoYW5nZUxvZy5fZ2VuZXJhdGVfanNvbnMo
ZmlsZXN5c3RlbSwgdGVzdF9qc29uLCAnYmFyJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwoc2V0KGZpbGVzeXN0ZW0uZmlsZXMua2V5cygpKSwgc2V0KFsnYmFyL2FycmF5Lmpzb24nLCAn
YmFyL2RpY3Rpb25hcnkuanNvbicsICdzdGRvdXQnXSkpCisgICAgICAgIGZpbmFsbHk6CisgICAg
ICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzX3N0ZG91dAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwoanNvbi5sb2FkcyhmaWxlc3lzdGVtLmZpbGVzWydiYXIvYXJyYXkuanNvbiddKSwgdGVzdF9q
c29uWydhcnJheS5qc29uJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoanNvbi5sb2Fkcyhm
aWxlc3lzdGVtLmZpbGVzWydiYXIvZGljdGlvbmFyeS5qc29uJ10pLCB0ZXN0X2pzb25bJ2RpY3Rp
b25hcnkuanNvbiddKQorCisKK2NsYXNzIENoYW5nZUxvZ0FuYWx5emVyVGVzdChDb21tYW5kc1Rl
c3QpOgorICAgIGRlZiB0ZXN0X2FuYWx5emVfb25lX2NoYW5nZWxvZyhzZWxmKToKKyAgICAgICAg
aG9zdCA9IE1vY2tIb3N0KCkKKyAgICAgICAgaG9zdC5maWxlc3lzdGVtLmZpbGVzWydtb2NrLWNo
ZWNrb3V0L2Zvby9DaGFuZ2VMb2cnXSA9IHUiIiIyMDExLTExLTE3ICBNYXJrIFJvd2UgIDxtcm93
ZUBhcHBsZS5jb20+CisKKyAgICA8aHR0cDovL3dlYmtpdC5vcmcvYi83MjY0Nj4gRGlzYWJsZSBk
ZXByZWNhdGlvbiB3YXJuaW5ncyBhcm91bmQgY29kZSB3aGVyZSB3ZSBjYW5ub3QgZWFzaWx5Cisg
ICAgc3dpdGNoIGF3YXkgZnJvbSB0aGUgZGVwcmVjYXRlZCBBUElzLgorCisgICAgUmV2aWV3ZWQg
YnkgU2FtIFdlaW5pZy4KKworICAgICogcGxhdGZvcm0vbWFjL1dlYkNvcmVOU1N0cmluZ0V4dHJh
cy5tbToKKyAgICAqIHBsYXRmb3JtL25ldHdvcmsvY2YvU29ja2V0U3RyZWFtSGFuZGxlQ0ZOZXQu
Y3BwOgorICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OnJlcG9ydEVycm9yVG9DbGll
bnQpOgorCisyMDExLTExLTE5ICBLZXZpbiBPbGxpdmllciAgPGtldmlub0B0aGVvbGxpdmllcnMu
Y29tPgorCisgICAgW3d4XSBDKysgYmluZGluZ3MgYnVpbGQgZml4IGZvciBtb3ZlIG9mIGFycmF5
IGNsYXNzZXMgdG8gV1RGLgorCisgICAgKiBiaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JD
UFAucG06CisgICAgKEdldENQUFR5cGVHZXR0ZXIpOgorICAgIChHZXROYW1lc3BhY2VGb3JDbGFz
cyk6CisgICAgKEdlbmVyYXRlSGVhZGVyKToKKyAgICAoR2VuZXJhdGVJbXBsZW1lbnRhdGlvbik6
CisKKzIwMTEtMTAtMjcgIFBoaWxpcHBlIE5vcm1hbmQgIDxwbm9ybWFuZEBpZ2FsaWEuY29tPiBh
bmQgWmFuIERvYmVyc2VrICA8emFuZG9iZXJzZWtAZ21haWwuY29tPgorCisgICAgICAgIFtHU3Ry
ZWFtZXJdIFdlYkF1ZGlvIEF1ZGlvRmlsZVJlYWRlciBpbXBsZW1lbnRhdGlvbgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk4MzQKKworICAgICAgICBS
ZXZpZXdlZCBieSBNYXJ0aW4gUm9iaW5zb24uCisKKyAgICAgICAgQmFzaWMgRmlsZVJlYWRlciBp
bXBsZW1lbnRhdGlvbiwgc3VwcG9ydGluZyBvbmUgb3IgMiBhdWRpbworICAgICAgICBjaGFubmVs
cy4gQW4gZW1wdHkgQXVkaW9EZXN0aW5hdGlvbiBpcyBhbHNvIHByb3ZpZGVkLCBpdHMgY29tcGxl
dGUKKyAgICAgICAgaW1wbGVtZW50YXRpb24gaXMgaGFuZGxlZCBpbiBidWcgNjk4MzUuCisKKyAg
ICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5saXN0LmFtOgor
ICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL2dzdHJlYW1lci9BdWRpb0Rlc3RpbmF0aW9uR1N0cmVh
bWVyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uOjpjcmVh
dGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbjo6aGFyZHdhcmVTYW1wbGVS
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25HU3RyZWFtZXI6OkF1ZGlv
RGVzdGluYXRpb25HU3RyZWFtZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlv
bkdTdHJlYW1lcjo6fkF1ZGlvRGVzdGluYXRpb25HU3RyZWFtZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9EZXN0aW5hdGlvbkdTdHJlYW1lcjo6c3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9EZXN0aW5hdGlvbkdTdHJlYW1lcjo6c3RvcCk6CisgICAgICAgICogcGxhdGZvcm0vYXVk
aW8vZ3N0cmVhbWVyL0F1ZGlvRGVzdGluYXRpb25HU3RyZWFtZXIuaDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uR1N0cmVhbWVyOjppc1BsYXlpbmcpOgorICAgICAg
ICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkdTdHJlYW1lcjo6c2FtcGxlUmF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uR1N0cmVhbWVyOjpzb3VyY2VQcm92aWRlcik6
CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vZ3N0cmVhbWVyL0F1ZGlvRmlsZVJlYWRlckdTdHJl
YW1lci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Z2V0R1N0cmVhbWVyQXVkaW9DYXBz
KToKKyAgICAgICAgKFdlYkNvcmU6OmdldEZsb2F0RnJvbUJ5dGVSZWFkZXIpOgorICAgICAgICAo
V2ViQ29yZTo6Y29weUdzdHJlYW1lckJ1ZmZlcnNUb0F1ZGlvQ2hhbm5lbCk6CisgICAgICAgIChX
ZWJDb3JlOjpvbkFwcHNpbmtOZXdCdWZmZXJDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpt
ZXNzYWdlQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6b25HU3RyZWFtZXJEZWludGVybGVh
dmVQYWRBZGRlZENhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6Om9uR1N0cmVhbWVyRGVpbnRl
cmxlYXZlUmVhZHlDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpvbkdTdHJlYW1lckRlY29k
ZWJpblBhZEFkZGVkQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9GaWxlUmVhZGVy
OjpBdWRpb0ZpbGVSZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9GaWxlUmVhZGVyOjp+
QXVkaW9GaWxlUmVhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRmlsZVJlYWRlcjo6aGFu
ZGxlQnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRmlsZVJlYWRlcjo6aGFuZGxlTWVz
c2FnZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0ZpbGVSZWFkZXI6OmhhbmRsZU5ld0RlaW50
ZXJsZWF2ZVBhZCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0ZpbGVSZWFkZXI6OmRlaW50ZXJs
ZWF2ZVBhZHNDb25maWd1cmVkKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRmlsZVJlYWRlcjo6
cGx1Z0RlaW50ZXJsZWF2ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0ZpbGVSZWFkZXI6OmNy
ZWF0ZUJ1cyk6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVCdXNGcm9tQXVkaW9GaWxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OmNyZWF0ZUJ1c0Zyb21Jbk1lbW9yeUF1ZGlvRmlsZSk6CisgICAgICAg
ICogcGxhdGZvcm0vYXVkaW8vZ3RrL0F1ZGlvQnVzR3RrLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb0J1czo6bG9hZFBsYXRmb3JtUmVzb3VyY2UpOgorIiIiCisKKyAgICAgICAg
c3lzX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnN0
ZG91dCA9IGhvc3QuZmlsZXN5c3RlbS5vcGVuX3RleHRfZmlsZV9mb3Jfd3JpdGluZygnc3Rkb3V0
JykKKyAgICAgICAgICAgIGFuYWx5emVyID0gQ2hhbmdlTG9nQW5hbHl6ZXIoaG9zdCwgWydtb2Nr
LWNoZWNrb3V0L2Zvby9DaGFuZ2VMb2cnXSkKKyAgICAgICAgICAgIGFuYWx5emVyLmFuYWx5emUo
KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5c19zdGRvdXQK
KworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFuYWx5emVyLnN1bW1hcnkoKSwKKyAgICAgICAg
ICAgIHsncmV2aWV3ZWQnOiAyLCAndW5yZXZpZXdlZCc6IDEsICdjb250cmlidXRvcnMnOiA2LCAn
Y29udHJpYnV0b3JzX3dpdGhfcmV2aWV3cyc6IDIsICdjb250cmlidXRvcnNfd2l0aG91dF9yZXZp
ZXdzJzogNH0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoYW5hbHl6ZXIuY29udHJp
YnV0b3JzX3N0YXRpc3RpY3MoKS5rZXlzKCkpLAorICAgICAgICAgICAgc2V0KFsnU2FtIFdlaW5p
ZycsIHUnTWFyayBSb3dlJywgdSdLZXZpbiBPbGxpdmllcicsICdNYXJ0aW4gUm9iaW5zb24nLCB1
J1BoaWxpcHBlIE5vcm1hbmQnLCB1J1phbiBEb2JlcnNlayddKSkKKworICAgICAgICBzZWxmLmFz
c2VydEVxdWFsKGFuYWx5emVyLmNvbnRyaWJ1dG9yc19zdGF0aXN0aWNzKClbJ1NhbSBXZWluaWcn
XSwKKyAgICAgICAgICAgIHsncmV2aWV3cyc6IHsnZmlsZXMnOiB7dSdmb28vcGxhdGZvcm0vbWFj
L1dlYkNvcmVOU1N0cmluZ0V4dHJhcy5tbSc6IDEsIHUnZm9vL3BsYXRmb3JtL25ldHdvcmsvY2Yv
U29ja2V0U3RyZWFtSGFuZGxlQ0ZOZXQuY3BwJzogMX0sCisgICAgICAgICAgICAndG90YWwnOiAx
LCAnYXJlYXMnOiB7J05ldHdvcmsnOiAxfX0sICdwYXRjaGVzJzogeydmaWxlcyc6IHt9LCAnYXJl
YXMnOiB7fSwgJ3VucmV2aWV3ZWQnOiAwLCAncmV2aWV3ZWQnOiAwfX0pCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWwoYW5hbHl6ZXIuY29udHJpYnV0b3JzX3N0YXRpc3RpY3MoKVt1J01hcmsgUm93
ZSddLAorICAgICAgICAgICAgeydyZXZpZXdzJzogeydmaWxlcyc6IHt9LCAndG90YWwnOiAwLCAn
YXJlYXMnOiB7fX0sICdwYXRjaGVzJzogeydmaWxlcyc6IHt1J2Zvby9wbGF0Zm9ybS9tYWMvV2Vi
Q29yZU5TU3RyaW5nRXh0cmFzLm1tJzogMSwKKyAgICAgICAgICAgIHUnZm9vL3BsYXRmb3JtL25l
dHdvcmsvY2YvU29ja2V0U3RyZWFtSGFuZGxlQ0ZOZXQuY3BwJzogMX0sICdhcmVhcyc6IHsnTmV0
d29yayc6IDF9LCAndW5yZXZpZXdlZCc6IDAsICdyZXZpZXdlZCc6IDF9fSkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbChhbmFseXplci5jb250cmlidXRvcnNfc3RhdGlzdGljcygpW3UnS2V2aW4g
T2xsaXZpZXInXSwKKyAgICAgICAgICAgIHsncmV2aWV3cyc6IHsnZmlsZXMnOiB7fSwgJ3RvdGFs
JzogMCwgJ2FyZWFzJzoge319LCAncGF0Y2hlcyc6IHsnZmlsZXMnOiB7dSdmb28vYmluZGluZ3Mv
c2NyaXB0cy9Db2RlR2VuZXJhdG9yQ1BQLnBtJzogMX0sCisgICAgICAgICAgICAgICAgJ2FyZWFz
JzogeydCaW5kaW5ncyc6IDF9LCAndW5yZXZpZXdlZCc6IDEsICdyZXZpZXdlZCc6IDB9fSkKKwor
ICAgICAgICBmaWxlc19mb3JfYXVkaW9fcGF0Y2ggPSB7dSdmb28vR05VbWFrZWZpbGUuYW0nOiAx
LCB1J2Zvby9HTlVtYWtlZmlsZS5saXN0LmFtJzogMSwgJ2Zvby9wbGF0Zm9ybS9hdWRpby9nc3Ry
ZWFtZXIvQXVkaW9EZXN0aW5hdGlvbkdTdHJlYW1lci5jcHAnOiAxLAorICAgICAgICAgICAgJ2Zv
by9wbGF0Zm9ybS9hdWRpby9nc3RyZWFtZXIvQXVkaW9EZXN0aW5hdGlvbkdTdHJlYW1lci5oJzog
MSwgJ2Zvby9wbGF0Zm9ybS9hdWRpby9nc3RyZWFtZXIvQXVkaW9GaWxlUmVhZGVyR1N0cmVhbWVy
LmNwcCc6IDEsCisgICAgICAgICAgICAnZm9vL3BsYXRmb3JtL2F1ZGlvL2d0ay9BdWRpb0J1c0d0
ay5jcHAnOiAxfQorICAgICAgICBhdXRob3JfZXhwZWN0YXRpb25fZm9yX2F1ZGlvX3BhdGNoID0g
eydyZXZpZXdzJzogeydmaWxlcyc6IHt9LCAndG90YWwnOiAwLCAnYXJlYXMnOiB7fX0sCisgICAg
ICAgICAgICAncGF0Y2hlcyc6IHsnZmlsZXMnOiBmaWxlc19mb3JfYXVkaW9fcGF0Y2gsICdhcmVh
cyc6IHsnVGhlIFdlYktpdEdUSysgUG9ydCc6IDF9LCAndW5yZXZpZXdlZCc6IDAsICdyZXZpZXdl
ZCc6IDF9fQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFuYWx5emVyLmNvbnRyaWJ1dG9yc19z
dGF0aXN0aWNzKClbdSdNYXJ0aW4gUm9iaW5zb24nXSwKKyAgICAgICAgICAgIHsncmV2aWV3cyc6
IHsnZmlsZXMnOiBmaWxlc19mb3JfYXVkaW9fcGF0Y2gsICd0b3RhbCc6IDEsICdhcmVhcyc6IHsn
VGhlIFdlYktpdEdUSysgUG9ydCc6IDF9fSwKKyAgICAgICAgICAgICAgICAncGF0Y2hlcyc6IHsn
ZmlsZXMnOiB7fSwgJ2FyZWFzJzoge30sICd1bnJldmlld2VkJzogMCwgJ3Jldmlld2VkJzogMH19
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFuYWx5emVyLmNvbnRyaWJ1dG9yc19zdGF0aXN0
aWNzKClbdSdQaGlsaXBwZSBOb3JtYW5kJ10sIGF1dGhvcl9leHBlY3RhdGlvbl9mb3JfYXVkaW9f
cGF0Y2gpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW5hbHl6ZXIuY29udHJpYnV0b3JzX3N0
YXRpc3RpY3MoKVt1J1phbiBEb2JlcnNlayddLCBhdXRob3JfZXhwZWN0YXRpb25fZm9yX2F1ZGlv
X3BhdGNoKQorCisgICAgICAgIGFyZWFzX3N0YXRpc3RpY3MgPSBhbmFseXplci5hcmVhc19zdGF0
aXN0aWNzKCkKKyAgICAgICAgYXJlYXNfd2l0aF9wYXRjaGVzID0gW2FyZWEgZm9yIGFyZWEgaW4g
YXJlYXNfc3RhdGlzdGljcyBpZiBhcmVhc19zdGF0aXN0aWNzW2FyZWFdWydyZXZpZXdlZCddIG9y
IGFyZWFzX3N0YXRpc3RpY3NbYXJlYV1bJ3VucmV2aWV3ZWQnXV0KKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbChzZXQoYXJlYXNfd2l0aF9wYXRjaGVzKSwgc2V0KFsnQmluZGluZ3MnLCAnTmV0d29y
aycsICdUaGUgV2ViS2l0R1RLKyBQb3J0J10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFy
ZWFzX3N0YXRpc3RpY3NbJ0JpbmRpbmdzJ10sIHsndW5yZXZpZXdlZCc6IDEsICdyZXZpZXdlZCc6
IDAsICdjb250cmlidXRvcnMnOgorICAgICAgICAgICAge3UnS2V2aW4gT2xsaXZpZXInOiB7J3Jl
dmlld3MnOiAwLCAndW5yZXZpZXdlZCc6IDEsICdyZXZpZXdlZCc6IDB9fX0pCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwoYXJlYXNfc3RhdGlzdGljc1snTmV0d29yayddLCB7J3VucmV2aWV3ZWQn
OiAwLCAncmV2aWV3ZWQnOiAxLCAnY29udHJpYnV0b3JzJzoKKyAgICAgICAgICAgIHsnU2FtIFdl
aW5pZyc6IHsncmV2aWV3cyc6IDEsICd1bnJldmlld2VkJzogMCwgJ3Jldmlld2VkJzogMH0sIHUn
TWFyayBSb3dlJzogeydyZXZpZXdzJzogMCwgJ3VucmV2aWV3ZWQnOiAwLCAncmV2aWV3ZWQnOiAx
fX19KQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2Rh
dGEvc3VtbWFyeS5odG1sIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2Rh
dGEvc3VtbWFyeS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmFiZjgwZDg0ZmQyMGJlMzViN2U5ZmIwNmQzNWZk
YzZmYThhMmU4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rv
b2wvY29tbWFuZHMvZGF0YS9zdW1tYXJ5Lmh0bWwKQEAgLTAsMCArMSw0NTUgQEAKKzwhRE9DVFlQ
RSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5DaGFuZ2VMb2cgQW5hbHlzaXM8L3RpdGxl
PgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKworYm9keSB7CisgICAgZm9udC1mYW1pbHk6ICdI
ZWx2ZXRpY2EnICdTZWdvZSBVSSBMaWdodCcgc2Fucy1zZXJpZjsKKyAgICBmb250LXdlaWdodDog
MjAwOworICAgIHBhZGRpbmc6IDIwcHg7CisgICAgbWluLXdpZHRoOiAxMjAwcHg7Cit9CisKKyog
eworICAgIHBhZGRpbmc6IDBweDsKKyAgICBtYXJnaW46IDBweDsKKyAgICBib3JkZXI6IDBweDsK
K30KKworaDEsIGgyLCBoMyB7CisgICAgZm9udC13ZWlnaHQ6IDIwMDsKK30KKworaDEgeworICAg
IG1hcmdpbjogMCAwIDFlbSAwOworfQorCitoMiB7CisgICAgZm9udC1zaXplOiAxLjJlbTsKKyAg
ICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCitoMyB7
CisgICAgZm9udC1zaXplOiAxZW07Cit9CisKKy52aWV3IHsKKyAgICBtYXJnaW46IDBweDsKKyAg
ICB3aWR0aDogNjAwcHg7CisgICAgZmxvYXQ6IGxlZnQ7Cit9CisKKy5ncmFwaC1jb250YWluZXIg
cCB7CisgICAgd2lkdGg6IDIwMHB4OworICAgIHRleHQtYWxpZ246IHJpZ2h0OworICAgIG1hcmdp
bjogMjBweCAwIDIwcHggMDsKKyAgICBwYWRkaW5nOiA1cHg7CisgICAgYm9yZGVyLXJpZ2h0OiBz
b2xpZCAxcHggYmxhY2s7Cit9CisKKy5ncmFwaC1jb250YWluZXIgdGFibGUgeworICAgIHdpZHRo
OiAxMDAlOworfQorCisuZ3JhcGgtY29udGFpbmVyIHRhYmxlLCAuZ3JhcGgtY29udGFpbmVyIHRk
IHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIGJvcmRlcjogbm9uZTsKK30K
KworLmdyYXBoLWNvbnRhaW5lciB0ZCB7CisgICAgcGFkZGluZzogNXB4OworICAgIHZlcnRpY2Fs
LWFsaWduOiBjZW50ZXI7Cit9CisKKy5ncmFwaC1jb250YWluZXIgdGQ6Zmlyc3QtY2hpbGQgewor
ICAgIHdpZHRoOiAyMDBweDsKKyAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICBib3JkZXItcmln
aHQ6IHNvbGlkIDFweCBibGFjazsKK30KKworLmdyYXBoLWNvbnRhaW5lciAuc2VsZWN0ZWQgewor
ICAgIGJhY2tncm91bmQ6ICNlZWU7Cit9CisKKyNyZXZpZXdlcnMgLnNlbGVjdGVkIHRkOmZpcnN0
LWNoaWxkIHsKKyAgICBib3JkZXItcmFkaXVzOiAxMHB4IDBweCAwcHggMTBweDsKK30KKworI2Fy
ZWFzIC5zZWxlY3RlZCB0ZDpsYXN0LWNoaWxkIHsKKyAgICBib3JkZXItcmFkaXVzOiAwcHggMTBw
eCAxMHB4IDBweDsKK30KKworLmdyYXBoLWNvbnRhaW5lciAuYmFyIHsKKyAgICBkaXNwbGF5OiBp
bmxpbmUtYmxvY2s7CisgICAgbWluLWhlaWdodDogMWVtOworICAgIGJhY2tncm91bmQ6ICM5ZjY7
CisgICAgbWFyZ2luLXJpZ2h0OiAwLjRleDsKK30KKworLmdyYXBoLWNvbnRhaW5lciAucmV2aWV3
ZWQtcGF0Y2hlcyB7CisgICAgYmFja2dyb3VuZDogIzNjZjsKKyAgICBtYXJnaW4tcmlnaHQ6IDFw
eDsKK30KKworLmdyYXBoLWNvbnRhaW5lciAudW5yZXZpZXdlZC1wYXRjaGVzIHsKKyAgICBiYWNr
Z3JvdW5kOiAjZjk5OworfQorCisuY29uc3RyYWluZWQgeworICAgIGJhY2tncm91bmQ6ICNlZWU7
CisgICAgYm9yZGVyLXJhZGl1czogMTBweDsKK30KKworLmNvbnN0cmFpbmVkIC52ZXJ0aWNhbC1i
YXIgeworICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4ICNlZWU7Cit9CisKKyNoZWFkZXIgewor
ICAgIGJvcmRlci1zcGFjaW5nOiA1cHg7Cit9CisKKyNoZWFkZXIgc2VjdGlvbiB7CisgICAgZGlz
cGxheTogdGFibGUtY2VsbDsKKyAgICB3aWR0aDogMjAwcHg7CisgICAgdmVydGljYWwtYWxpZ246
IHRvcDsKKyAgICBib3JkZXI6IHNvbGlkIDJweCAjY2NjOworICAgIGJvcmRlci1jb2xsYXBzZTog
Y29sbGFwc2U7CisgICAgcGFkZGluZzogNXB4OworICAgIGZvbnQtc2l6ZTogMC44ZW07Cit9CisK
KyNoZWFkZXIgZHQgeworICAgIGZsb2F0OiBsZWZ0OworfQorCisjaGVhZGVyIGR0OmFmdGVyIHsK
KyAgICBjb250ZW50OiAnOiAnOworfQorCisjaGVhZGVyIC5sZWdlbmQgeworICAgIHdpZHRoOiA2
MDBweDsKK30KKworLmxlZ2VuZCAuYmFyIHsKKyAgICB3aWR0aDogMTVleDsKKyAgICBwYWRkaW5n
OiAycHg7Cit9CisKKy5sZWdlbmQgLnJldmlld3MgeworICAgIHdpZHRoOiAyNWV4OworfQorCisu
bGVnZW5kIHRkOmZpcnN0LWNoaWxkIHsKKyAgICB3aWR0aDogMThleDsKK30KKworPC9zdHlsZT4K
KzwvaGVhZD4KKzxib2R5PgorPGgxPkNoYW5nZUxvZyBBbmFseXNpczwvaDE+CisKKzxzZWN0aW9u
IGlkPSJoZWFkZXIiPgorPHNlY3Rpb24gaWQ9InN1bW1hcnkiPgorPGgyPlN1bW1hcnk8L2gyPgor
PC9zZWN0aW9uPgorCis8c2VjdGlvbiBjbGFzcz0ibGVnZW5kIj4KKzxoMj5MZWdlbmQ8L2gyPgor
PGRpdiBjbGFzcz0iZ3JhcGgtY29udGFpbmVyIj4KKzx0YWJsZT4KKzx0Ym9keT4KKzx0cj48dGQ+
Q29udHJpYnV0b3IncyBuYW1lPC90ZD4KKzx0ZD48c3BhbiBjbGFzcz0iYmFyIHJldmlld3MiPlJl
dmlld3M8L3NwYW4+IDxzcGFuIGNsYXNzPSJ2YWx1ZS1jb250YWluZXIiPigjIG9mIHJldmlld3Mp
PC9zcGFuPjxicj4KKzxzcGFuIGNsYXNzPSJiYXIgcmV2aWV3ZWQtcGF0Y2hlcyI+UmV2aWV3ZWQ8
L3NwYW4+PHNwYW4gY2xhc3M9ImJhciB1bnJldmlld2VkLXBhdGNoZXMiPlVucmV2aWV3ZWQ8L3Nw
YW4+Cis8c3BhbiBjbGFzcz0idmFsdWUtY29udGFpbmVyIj4oIyBvZiByZXZpZXdlZCk6KCMgb2Yg
dW5yZXZpZXdlZCk8L3NwYW4+PC90ZD48L3RyPgorPC90Ym9keT4KKzwvdGFibGU+Cis8L2Rpdj4K
Kzwvc2VjdGlvbj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gaWQ9ImNvbnRyaWJ1dG9ycyIgY2xh
c3M9InZpZXciPgorPGgyIGlkPSJjb250cmlidXRvcnMtdGl0bGUiPkNvbnRyaWJ1dG9yczwvaDI+
Cis8ZGl2IGNsYXNzPSJncmFwaC1jb250YWluZXIiPjwvZGl2PgorPC9zZWN0aW9uPgorCis8c2Vj
dGlvbiBpZD0iYXJlYXMiIGNsYXNzPSJ2aWV3Ij4KKzxoMiBpZD0iYXJlYXMtdGl0bGUiPkFyZWFz
IG9mIGNvbnRyaWJ1dGlvbnM8L2gyPgorPGRpdiBjbGFzcz0iZ3JhcGgtY29udGFpbmVyIj48L2Rp
dj4KKzwvc2VjdGlvbj4KKworPHNjcmlwdD4KKworLy8gTmFpdmUgaW1wbGVtZW50YXRpb24gb2Yg
ZWxlbWVudCBleHRlbnNpb25zIGRpc2N1c3NlZCBvbiBwdWJsaWMtd2ViYXBwcworCitpZiAoIUVs
ZW1lbnQucHJvdG90eXBlLmFwcGVuZCkgeworICAgIEVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCA9
IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVu
Z3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUYWtlIGNhcmUgb2Ygb3RoZXIgbm9k
ZSB0eXBlcworICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIEVsZW1lbnQg
fHwgYXJndW1lbnRzW2ldIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkKKyAgICAgICAgICAgICAg
ICB0aGlzLmFwcGVuZENoaWxkKGFyZ3VtZW50c1tpXSk7CisgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhcmd1
bWVudHNbaV0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CisK
K2lmICghTm9kZS5wcm90b3R5cGUucmVtb3ZlKSB7CisgICAgTm9kZS5wcm90b3R5cGUucmVtb3Zl
ID0gZnVuY3Rpb24gKCkgeworICAgICAgICB0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhp
cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KKworaWYgKCFFbGVtZW50LmNyZWF0
ZSkgeworICAgIEVsZW1lbnQuY3JlYXRlID0gZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAoYXJn
dW1lbnRzLmxlbmd0aCA8IDEpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgdmFy
IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGFyZ3VtZW50c1swXSk7CisgICAgICAg
IGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsK
KworICAgICAgICAvLyBGSVhNRTogdGhlIHNlY29uZCBhcmd1bWVudCBjYW4gYmUgY29udGVudCBv
ciBJREwgYXR0cmlidXRlcworICAgICAgICB2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50c1sxXTsK
KyAgICAgICAgZm9yIChhdHRyaWJ1dGUgaW4gYXR0cmlidXRlcykKKyAgICAgICAgICAgIGVsZW1l
bnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgYXR0cmlidXRlc1thdHRyaWJ1dGVdKTsKKworICAg
ICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKQorICAgICAgICAgICAgZWxlbWVudC5hcHBl
bmQuYXBwbHkoZWxlbWVudCwgYXJndW1lbnRzWzJdKTsKKworICAgICAgICByZXR1cm4gZWxlbWVu
dDsKKyAgICB9Cit9CisKK2lmICghTm9kZS5wcm90b3R5cGUucmVtb3ZlQWxsQ2hpbGRyZW4pIHsK
KyAgICBOb2RlLnByb3RvdHlwZS5yZW1vdmVBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKKyAg
ICAgICAgd2hpbGUgKHRoaXMuZmlyc3RDaGlsZCkKKyAgICAgICAgICAgIHRoaXMuZmlyc3RDaGls
ZC5yZW1vdmUoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQorCitFbGVtZW50LnBy
b3RvdHlwZS5yZW1vdmVDbGFzc05hbWVGcm9tQWxsRWxlbWVudHMgPSBmdW5jdGlvbiAoY2xhc3NO
YW1lKSB7CisgICAgdmFyIGVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNs
YXNzTmFtZSk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykK
KyAgICAgICAgZWxlbWVudHNbaV0uY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpOworfQorCitm
dW5jdGlvbiBnZXRKU09OKHVybCwgY2FsbGJhY2spIHsKKyAgICB2YXIgeGhyID0gbmV3IFhNTEh0
dHBSZXF1ZXN0KCk7CisgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7CisgICAgeGhyLm9u
cmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYgKHRoaXMucmVhZHlT
dGF0ZSA9PSA0KQorICAgICAgICAgICAgY2FsbGJhY2soSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VU
ZXh0KSk7CisgICAgfQorICAgIHhoci5zZW5kKCk7Cit9CisKK2Z1bmN0aW9uIEdyYXBoVmlldyhj
b250YWluZXIpIHsKKyAgICB0aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7CisgICAgdGhpcy5f
ZGVmYXVsdERhdGEgPSBudWxsOworfQorCitHcmFwaFZpZXcucHJvdG90eXBlLnNldERhdGEgPSBm
dW5jdGlvbihkYXRhLCBjb25zdHJhaW5lZCkgeworICAgIGlmIChjb25zdHJhaW5lZCkKKyAgICAg
ICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2NvbnN0cmFpbmVkJyk7CisgICAgZWxz
ZQorICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnY29uc3RyYWluZWQn
KTsKKyAgICB0aGlzLl9jbGVhckdyYXBoKCk7CisgICAgdGhpcy5fY29uc3RydWN0R3JhcGgoZGF0
YSk7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5cGUuc2V0RGVmYXVsdERhdGEgPSBmdW5jdGlvbihk
YXRhKSB7CisgICAgdGhpcy5fZGVmYXVsdERhdGEgPSBkYXRhOworICAgIHRoaXMuc2V0RGF0YShk
YXRhKTsKK30KKworR3JhcGhWaWV3LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHsKKyAg
ICB0aGlzLnNldE1hcmdpblRvcCgpOworICAgIHRoaXMuc2V0RGF0YSh0aGlzLl9kZWZhdWx0RGF0
YSk7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5cGUuaXNDb25zdHJhaW5lZCA9IGZ1bmN0aW9uICgp
IHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnN0cmFpbmVk
Jyk7IH0KKworR3JhcGhWaWV3LnByb3RvdHlwZS50YXJnZXRSb3cgPSBmdW5jdGlvbiAobm9kZSkg
eworICAgIHZhciB0YXJnZXQgPSBudWxsOworCisgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPSB0
aGlzLl9jb250YWluZXIpIHsKKyAgICAgICAgaWYgKG5vZGUubG9jYWxOYW1lID09ICd0cicpCisg
ICAgICAgICAgICB0YXJnZXQgPSBub2RlOworICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2Rl
OworICAgIH0KKworICAgIHJldHVybiBub2RlICYmIHRhcmdldDsKK30KKworR3JhcGhWaWV3LnBy
b3RvdHlwZS5zZWxlY3RSb3cgPSBmdW5jdGlvbiAocm93KSB7CisgICAgdGhpcy5fY29udGFpbmVy
LnJlbW92ZUNsYXNzTmFtZUZyb21BbGxFbGVtZW50cygnc2VsZWN0ZWQnKTsKKyAgICByb3cuY2xh
c3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTsKK30KKworR3JhcGhWaWV3LnByb3RvdHlwZS5zZXRNYXJn
aW5Ub3AgPSBmdW5jdGlvbiAoeSkgeyB0aGlzLl9jb250YWluZXIuc3R5bGUubWFyZ2luVG9wID0g
eSA/IHkgKyAncHgnIDogbnVsbDsgfQorR3JhcGhWaWV3LnByb3RvdHlwZS5fZ3JhcGhDb250YWlu
ZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jb250YWluZXIuZ2V0RWxlbWVudHNCeUNs
YXNzTmFtZSgnZ3JhcGgtY29udGFpbmVyJylbMF07IH0KK0dyYXBoVmlldy5wcm90b3R5cGUuX2Ns
ZWFyR3JhcGggPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9ncmFwaENvbnRhaW5lcigpLnJl
bW92ZUFsbENoaWxkcmVuKCk7IH0KKworR3JhcGhWaWV3LnByb3RvdHlwZS5fbnVtYmVyT2ZQYXRj
aGVzID0gZnVuY3Rpb24gKGRhdGFJdGVtKSB7CisgICAgcmV0dXJuIGRhdGFJdGVtLm51bWJlck9m
UmV2aWV3ZWRQYXRjaGVzICsgKGRhdGFJdGVtLm51bWJlck9mVW5yZXZpZXdlZFBhdGNoZXMgIT09
IHVuZGVmaW5lZCA/IGRhdGFJdGVtLm51bWJlck9mVW5yZXZpZXdlZFBhdGNoZXMgOiAwKTsKK30K
KworR3JhcGhWaWV3LnByb3RvdHlwZS5fbWF4aW11bVZhbHVlID0gZnVuY3Rpb24gKGxhYmVscywg
ZGF0YSkgeworICAgIHZhciBudW1iZXJPZlBhdGNoZXMgPSB0aGlzLl9udW1iZXJPZlBhdGNoZXM7
CisgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwsIGxhYmVscy5tYXAoZnVuY3Rpb24gKGxh
YmVsKSB7CisgICAgICAgIHJldHVybiBNYXRoLm1heChudW1iZXJPZlBhdGNoZXMoZGF0YVtsYWJl
bF0pLCBkYXRhW2xhYmVsXS5udW1iZXJPZlJldmlld3MgIT09IHVuZGVmaW5lZCA/IGRhdGFbbGFi
ZWxdLm51bWJlck9mUmV2aWV3cyA6IDApOworICAgIH0pKTsKK30KKworR3JhcGhWaWV3LnByb3Rv
dHlwZS5fc29ydExhYmVsc0J5TnVtYmVyT2ZSZXZpd3NBbmRSZXZpZXdlZFBhdGNoZXMgPSBmdW5j
dGlvbihkYXRhKSB7CisgICAgdmFyIGxhYmVscyA9IE9iamVjdC5rZXlzKGRhdGEpOworICAgIGlm
ICghbGFiZWxzLmxlbmd0aCkKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgdmFyIG51bWJlck9m
UGF0Y2hlcyA9IHRoaXMuX251bWJlck9mUGF0Y2hlczsKKyAgICB2YXIgY29tcHV0ZVZhbHVlID0g
ZnVuY3Rpb24gKGRhdGFJdGVtKSB7CisgICAgICAgIHJldHVybiBudW1iZXJPZlBhdGNoZXMoZGF0
YUl0ZW0pICsgKGRhdGFJdGVtLm51bWJlck9mUmV2aWV3cyAhPT0gdW5kZWZpbmVkID8gZGF0YUl0
ZW0ubnVtYmVyT2ZSZXZpZXdzIDogMCk7CisgICAgfQorICAgIGxhYmVscy5zb3J0KGZ1bmN0aW9u
IChhLCBiKSB7IHJldHVybiBjb21wdXRlVmFsdWUoZGF0YVtiXSkgLSBjb21wdXRlVmFsdWUoZGF0
YVthXSk7IH0pOworICAgIHJldHVybiBsYWJlbHM7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5cGUu
X2NvbnN0cnVjdEdyYXBoID0gZnVuY3Rpb24gKGRhdGEpIHsKKyAgICB2YXIgZWxlbWVudCA9IHRo
aXMuX2dyYXBoQ29udGFpbmVyKCk7CisgICAgdmFyIGxhYmVscyA9IHRoaXMuX3NvcnRMYWJlbHNC
eU51bWJlck9mUmV2aXdzQW5kUmV2aWV3ZWRQYXRjaGVzKGRhdGEpOworICAgIGlmICghbGFiZWxz
KSB7CisgICAgICAgIGVsZW1lbnQuYXBwZW5kKEVsZW1lbnQuY3JlYXRlKCdwJywge30sIFsnTm9u
ZSddKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgbWF4VmFsdWUgPSB0aGlz
Ll9tYXhpbXVtVmFsdWUobGFiZWxzLCBkYXRhKTsKKyAgICB2YXIgY29tcHV0ZVN0eWxlRm9yQmFy
ID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiAnd2lkdGg6JyArICh2YWx1ZSAqIDg1LjAgLyBt
YXhWYWx1ZSkgKyAnJScgfQorCisgICAgdmFyIHRhYmxlID0gRWxlbWVudC5jcmVhdGUoJ3RhYmxl
Jywge30sIFtFbGVtZW50LmNyZWF0ZSgndGJvZHknKV0pOworICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciBsYWJlbCA9IGxhYmVsc1tpXTsK
KyAgICAgICAgdmFyIGl0ZW0gPSBkYXRhW2xhYmVsXTsKKyAgICAgICAgdmFyIHJvdyA9IEVsZW1l
bnQuY3JlYXRlKCd0cicsIHt9LCBbRWxlbWVudC5jcmVhdGUoJ3RkJywge30sIFtsYWJlbF0pLCBF
bGVtZW50LmNyZWF0ZSgndGQnLCB7fSldKTsKKyAgICAgICAgdmFyIHZhbHVlQ2VsbCA9IHJvdy5s
YXN0Q2hpbGQ7CisKKyAgICAgICAgaWYgKGl0ZW0ubnVtYmVyT2ZSZXZpZXdzICE9IHVuZGVmaW5l
ZCkgeworICAgICAgICAgICAgdmFsdWVDZWxsLmFwcGVuZCgKKyAgICAgICAgICAgICAgICBFbGVt
ZW50LmNyZWF0ZSgnc3BhbicsIHsnY2xhc3MnOiAnYmFyIHJldmlld3MnLCAnc3R5bGUnOiBjb21w
dXRlU3R5bGVGb3JCYXIoaXRlbS5udW1iZXJPZlJldmlld3MpIH0pLAorICAgICAgICAgICAgICAg
IEVsZW1lbnQuY3JlYXRlKCdzcGFuJywgeydjbGFzcyc6ICd2YWx1ZS1jb250YWluZXInfSwgW2l0
ZW0ubnVtYmVyT2ZSZXZpZXdzXSksCisgICAgICAgICAgICAgICAgRWxlbWVudC5jcmVhdGUoJ2Jy
JykKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZUNlbGwuYXBwZW5k
KEVsZW1lbnQuY3JlYXRlKCdzcGFuJywgeydjbGFzcyc6ICdiYXIgcmV2aWV3ZWQtcGF0Y2hlcycs
ICdzdHlsZSc6IGNvbXB1dGVTdHlsZUZvckJhcihpdGVtLm51bWJlck9mUmV2aWV3ZWRQYXRjaGVz
KSB9KSk7CisgICAgICAgIGlmIChpdGVtLm51bWJlck9mVW5yZXZpZXdlZFBhdGNoZXMgIT09IHVu
ZGVmaW5lZCkKKyAgICAgICAgICAgIHZhbHVlQ2VsbC5hcHBlbmQoRWxlbWVudC5jcmVhdGUoJ3Nw
YW4nLCB7J2NsYXNzJzogJ2JhciB1bnJldmlld2VkLXBhdGNoZXMnLCAnc3R5bGUnOiBjb21wdXRl
U3R5bGVGb3JCYXIoaXRlbS5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzKSB9KSk7CisKKyAgICAg
ICAgdmFsdWVDZWxsLmFwcGVuZChFbGVtZW50LmNyZWF0ZSgnc3BhbicsIHsnY2xhc3MnOiAndmFs
dWUtY29udGFpbmVyJ30sCisgICAgICAgICAgICBbaXRlbS5udW1iZXJPZlJldmlld2VkUGF0Y2hl
cyArIChpdGVtLm51bWJlck9mVW5yZXZpZXdlZFBhdGNoZXMgIT09IHVuZGVmaW5lZCA/ICc6JyAr
IGl0ZW0ubnVtYmVyT2ZVbnJldmlld2VkUGF0Y2hlcyA6ICcnKV0pKTsKKworICAgICAgICB0YWJs
ZS5maXJzdENoaWxkLmFwcGVuZChyb3cpOworICAgICAgICByb3cubGFiZWwgPSBsYWJlbDsKKyAg
ICAgICAgcm93LmRhdGEgPSBpdGVtOworICAgIH0KKyAgICBlbGVtZW50LmFwcGVuZCh0YWJsZSk7
Cit9CisKK3ZhciBjb250cmlidXRvcnNWaWV3ID0gbmV3IEdyYXBoVmlldyhkb2N1bWVudC5xdWVy
eVNlbGVjdG9yKCcjY29udHJpYnV0b3JzJykpOwordmFyIGFyZWFzVmlldyA9IG5ldyBHcmFwaFZp
ZXcoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FyZWFzJykpOworCitnZXRKU09OKCdzdW1tYXJ5
Lmpzb24nLAorICAgIGZ1bmN0aW9uIChzdW1tYXJ5KSB7CisgICAgICAgIHZhciBzdW1tYXJ5Q29u
dGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N1bW1hcnknKTsKKyAgICAgICAgc3Vt
bWFyeUNvbnRhaW5lci5hcHBlbmQoRWxlbWVudC5jcmVhdGUoJ2RsJywge30sIFsKKyAgICAgICAg
ICAgIEVsZW1lbnQuY3JlYXRlKCdkdCcsIHt9LCBbJ1RvdGFsIGVudHJpZXMgKHJldmlld2VkKSdd
KSwKKyAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlKCdkZCcsIHt9LCBbKHN1bW1hcnlbJ3Jldmll
d2VkJ10gKyBzdW1tYXJ5Wyd1bnJldmlld2VkJ10pICsgJyAoJyArIHN1bW1hcnlbJ3Jldmlld2Vk
J10gKyAnKSddKSwKKyAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlKCdkdCcsIHt9LCBbJ1RvdGFs
IGNvbnRyaWJ1dG9ycyddKSwKKyAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlKCdkZCcsIHt9LCBb
c3VtbWFyeVsnY29udHJpYnV0b3JzJ11dKSwKKyAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlKCdk
dCcsIHt9LCBbJ0NvbnRyaWJ1dG9ycyB3aG8gcmV2aWV3ZWQnXSksCisgICAgICAgICAgICBFbGVt
ZW50LmNyZWF0ZSgnZGQnLCB7fSwgW3N1bW1hcnlbJ2NvbnRyaWJ1dG9yc193aXRoX3Jldmlld3Mn
XV0pLAorICAgICAgICBdKSk7CisgICAgfSk7CisKK2dldEpTT04oJ2NvbnRyaWJ1dG9ycy5qc29u
JywKKyAgICBmdW5jdGlvbiAoY29udHJpYnV0b3JzKSB7CisgICAgICAgIGZvciAodmFyIGNvbnRy
aWJ1dG9yIGluIGNvbnRyaWJ1dG9ycykgeworICAgICAgICAgICAgY29udHJpYnV0b3IgPSBjb250
cmlidXRvcnNbY29udHJpYnV0b3JdOworICAgICAgICAgICAgY29udHJpYnV0b3IubnVtYmVyT2ZS
ZXZpZXdzID0gY29udHJpYnV0b3IucmV2aWV3cyA/IGNvbnRyaWJ1dG9yLnJldmlld3MudG90YWwg
OiAwOworICAgICAgICAgICAgY29udHJpYnV0b3IubnVtYmVyT2ZSZXZpZXdlZFBhdGNoZXMgPSBj
b250cmlidXRvci5wYXRjaGVzID8gY29udHJpYnV0b3IucGF0Y2hlcy5yZXZpZXdlZCA6IDA7Cisg
ICAgICAgICAgICBjb250cmlidXRvci5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzID0gY29udHJp
YnV0b3IucGF0Y2hlcyA/IGNvbnRyaWJ1dG9yLnBhdGNoZXMudW5yZXZpZXdlZCA6IDA7CisgICAg
ICAgIH0KKyAgICAgICAgY29udHJpYnV0b3JzVmlldy5zZXREZWZhdWx0RGF0YShjb250cmlidXRv
cnMpOworICAgIH0pOworCitnZXRKU09OKCdhcmVhcy5qc29uJywKKyAgICBmdW5jdGlvbiAoYXJl
YXMpIHsKKyAgICAgICAgZm9yICh2YXIgYXJlYSBpbiBhcmVhcykgeworICAgICAgICAgICAgYXJl
YXNbYXJlYV0ubnVtYmVyT2ZSZXZpZXdlZFBhdGNoZXMgPSBhcmVhc1thcmVhXS5yZXZpZXdlZDsK
KyAgICAgICAgICAgIGFyZWFzW2FyZWFdLm51bWJlck9mVW5yZXZpZXdlZFBhdGNoZXMgPSBhcmVh
c1thcmVhXS51bnJldmlld2VkOworICAgICAgICB9CisgICAgICAgIGFyZWFzVmlldy5zZXREZWZh
dWx0RGF0YShhcmVhcyk7CisgICAgfSk7CisKK2Z1bmN0aW9uIGNvbnRyaWJ1dG9yQXJlYXMoY29u
dHJpYnV0b3JEYXRhKSB7CisgICAgdmFyIGFyZWFzID0gbmV3IE9iamVjdDsKKyAgICBmb3IgKHZh
ciBhcmVhIGluIGNvbnRyaWJ1dG9yRGF0YS5yZXZpZXdzLmFyZWFzKSB7CisgICAgICAgIGlmICgh
YXJlYXNbYXJlYV0pCisgICAgICAgICAgICBhcmVhc1thcmVhXSA9IHsnbnVtYmVyT2ZSZXZpZXdl
ZFBhdGNoZXMnOiAwfTsKKyAgICAgICAgYXJlYXNbYXJlYV0ubnVtYmVyT2ZSZXZpZXdzID0gY29u
dHJpYnV0b3JEYXRhLnJldmlld3MuYXJlYXNbYXJlYV07CisgICAgfQorICAgIGZvciAodmFyIGFy
ZWEgaW4gY29udHJpYnV0b3JEYXRhLnBhdGNoZXMuYXJlYXMpIHsKKyAgICAgICAgaWYgKCFhcmVh
c1thcmVhXSkKKyAgICAgICAgICAgIGFyZWFzW2FyZWFdID0geydudW1iZXJPZlJldmlld3MnOiAw
fTsKKyAgICAgICAgYXJlYXNbYXJlYV0ubnVtYmVyT2ZSZXZpZXdlZFBhdGNoZXMgPSBjb250cmli
dXRvckRhdGEucGF0Y2hlcy5hcmVhc1thcmVhXTsKKyAgICB9CisgICAgcmV0dXJuIGFyZWFzOwor
fQorCitmdW5jdGlvbiBhcmVhQ29udHJpYnV0b3JzKGFyZWFEYXRhKSB7CisgICAgdmFyIGNvbnRy
aWJ1dG9ycyA9IGFyZWFEYXRhWydjb250cmlidXRvcnMnXTsKKyAgICBmb3IgKHZhciBjb250cmli
dXRvciBpbiBjb250cmlidXRvcnMpIHsKKyAgICAgICAgY29udHJpYnV0b3IgPSBjb250cmlidXRv
cnNbY29udHJpYnV0b3JdOworICAgICAgICBjb250cmlidXRvci5udW1iZXJPZlJldmlld3MgPSBj
b250cmlidXRvci5yZXZpZXdzOworICAgICAgICBjb250cmlidXRvci5udW1iZXJPZlJldmlld2Vk
UGF0Y2hlcyA9IGNvbnRyaWJ1dG9yLnJldmlld2VkOworICAgICAgICBjb250cmlidXRvci5udW1i
ZXJPZlVucmV2aWV3ZWRQYXRjaGVzID0gY29udHJpYnV0b3IudW5yZXZpZXdlZDsKKyAgICB9Cisg
ICAgcmV0dXJuIGNvbnRyaWJ1dG9yczsKK30KKwordmFyIG1vdXNlVGltZXIgPSAwOword2luZG93
Lm9ubW91c2VvdmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgY2xlYXJUaW1lb3V0KG1vdXNl
VGltZXIpOworCisgICAgdmFyIHJvdyA9IGNvbnRyaWJ1dG9yc1ZpZXcudGFyZ2V0Um93KGV2ZW50
LnRhcmdldCk7CisgICAgaWYgKHJvdykgeworICAgICAgICBpZiAoIWNvbnRyaWJ1dG9yc1ZpZXcu
aXNDb25zdHJhaW5lZCgpKSB7CisgICAgICAgICAgICBjb250cmlidXRvcnNWaWV3LnNlbGVjdFJv
dyhyb3cpOworICAgICAgICAgICAgYXJlYXNWaWV3LnNldE1hcmdpblRvcChyb3cuZmlyc3RDaGls
ZC5vZmZzZXRUb3ApOworICAgICAgICAgICAgYXJlYXNWaWV3LnNldERhdGEoY29udHJpYnV0b3JB
cmVhcyhyb3cuZGF0YSksICdjb25zdHJhaW5lZCcpOworICAgICAgICB9CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICByb3cgPSBhcmVhc1ZpZXcudGFyZ2V0Um93KGV2ZW50LnRhcmdldCk7
CisgICAgaWYgKHJvdykgeworICAgICAgICBpZiAoIWFyZWFzVmlldy5pc0NvbnN0cmFpbmVkKCkp
IHsKKyAgICAgICAgICAgIGFyZWFzVmlldy5zZWxlY3RSb3cocm93KTsKKyAgICAgICAgICAgIGNv
bnRyaWJ1dG9yc1ZpZXcuc2V0TWFyZ2luVG9wKHJvdy5maXJzdENoaWxkLm9mZnNldFRvcCk7Cisg
ICAgICAgICAgICBjb250cmlidXRvcnNWaWV3LnNldERhdGEoYXJlYUNvbnRyaWJ1dG9ycyhyb3cu
ZGF0YSksICdjb25zdHJhaW5lZCcpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBtb3VzZVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgIGNv
bnRyaWJ1dG9yc1ZpZXcucmVzZXQoKTsKKyAgICAgICAgYXJlYXNWaWV3LnJlc2V0KCk7CisgICAg
fSwgNTAwKTsKK30KKworPC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvb3B0aW9ucy5weSBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdG9vbC9zdGVwcy9vcHRpb25zLnB5CmluZGV4IGQ0NjkxYjc0NDQyOTg2NGQ2
ZWIxYjQwYmZiMmU0OTU2MWEzMzg4MWIuLmZjNzgxYTZjY2JhMWIyYmQ5YzNiNzY3N2Y5YTNmMmRl
NTE4NjNkZDcgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9v
cHRpb25zLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9vcHRpb25z
LnB5CkBAIC01OCwzICs1OCw0IEBAIGNsYXNzIE9wdGlvbnMob2JqZWN0KToKICAgICBzdWdnZXN0
X3Jldmlld2VycyA9IG1ha2Vfb3B0aW9uKCItLXN1Z2dlc3QtcmV2aWV3ZXJzIiwgYWN0aW9uPSJz
dG9yZV90cnVlIiwgZGVmYXVsdD1GYWxzZSwgaGVscD0iT2ZmZXIgdG8gQ0MgYXBwcm9wcmlhdGUg
cmV2aWV3ZXJzLiIpCiAgICAgdGVzdCA9IG1ha2Vfb3B0aW9uKCItLXRlc3QiLCBhY3Rpb249InN0
b3JlX3RydWUiLCBkZXN0PSJ0ZXN0IiwgZGVmYXVsdD1GYWxzZSwgaGVscD0iUnVuIHJ1bi13ZWJr
aXQtdGVzdHMgYmVmb3JlIGNvbW1pdHRpbmcuIikKICAgICB1cGRhdGUgPSBtYWtlX29wdGlvbigi
LS1uby11cGRhdGUiLCBhY3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0idXBkYXRlIiwgZGVmYXVs
dD1UcnVlLCBoZWxwPSJEb24ndCB1cGRhdGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiIpCisgICAg
Y2hhbmdlbG9nX2NvdW50ID0gbWFrZV9vcHRpb24oIi0tY2hhbmdlbG9nLWNvdW50IiwgYWN0aW9u
PSJzdG9yZSIsIHR5cGU9ImludCIsIGRlc3Q9ImNoYW5nZWxvZ19jb3VudCIsIGhlbHA9Ik51bWJl
ciBvZiBjaGFuZ2Vsb2dzIHRvIHBhcnNlLiIpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117290</attachid>
            <date>2011-11-30 16:15:26 -0800</date>
            <delta_ts>2011-12-02 22:03:54 -0800</delta_ts>
            <desc>Fixed per Eric&apos;s comment</desc>
            <filename>bug-72243-20111130161525.patch</filename>
            <type>text/plain</type>
            <size>40841</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDEwMTU2MSkKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDI4IEBACisyMDExLTExLTMwICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgor
CisgICAgICAgIEFkZCBhIHRvb2wgdG8gYW5hbHl6ZSBjaGFuZ2UgbG9ncworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyNDMKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgdGhlIGluaXRpYWwgaW1wbGVt
ZW50YXRpb24gb2YgYW5hbHl6ZS1jaGFuZ2Vsb2cgY29tbWFuZC4gVGhpcyB2ZXJzaW9uIHN1cHBv
cnRzIHBhcnNpbmcgbXVsdGlwbGUgY2hhbmdlbG9ncworICAgICAgICBpbiBhIHNpbmdsZSBkaXJl
Y3RvcnkgYW5kIHN1bW1hcml6ZXMgdGhlIHJlc3VsdCBpbiBqc29uIGZpbGVzLiBJdCBhbHNvIGNv
cGllcyBzdW1tYXJ5Lmh0bWwgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgICAgZm9yIHZp
c3VhbGl6aW5nIGpzb24gZmlsZXMuCisKKyAgICAgICAgVXNhZ2U6IHdlYmtpdC1wYXRjaCBhbmFs
eXplLWNoYW5nZWxvZyBbLS1jaGFuZ2Vsb2ctY291bnQgTl0gPENIQU5HRUxPR19ESVI+IDxPVVRQ
VVRfRElSPgorICAgICAgICB3aGVyZSBDSEFOR0VMT0dfRElSIGlzIHRoZSBkaXJlY3RvcnkgdG8g
bG9vayBmb3IgY2hhbmdlbG9ncywgT1VUUFVUX0RJUiBpcyB0aGUgZGlyZWN0b3J5IGludG8gd2hp
Y2ggdGhlIHRvb2wKKyAgICAgICAgZ2VuZXJhdGVzIGpzb24gZmlsZXMsIGFuZCBOIGlzIHRoZSBu
dW1iZXIgb2YgY2hhbmdlbG9ncyB0byBwYXJzZS4KKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvY29tbW9uL2NoZWNrb3V0L2NoYW5nZWxvZy5weTogRml4ZWQgYSBidWcgaW4gcGFyc2VfZW50
cmllc19mcm9tX2ZpbGUgdGhhdCB0aGUgbGFzdCBlbnRyeSBpbgorICAgICAgICBhIGNoYW5nZWxv
ZyB3aXRob3V0IHJvbGxvdmVyIGlzIG5vdCBwYXJzZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vY29uZmlnL2NvbnRyaWJ1dGlvbmFyZWFzLnB5OiBBZGRlZCBuYW1lcygpLgor
ICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9maWxlc3lzdGVtX21vY2su
cHk6IEFkZGVkIHJlYWRsaW5lIGFuZCBpdGVyYXRvciBzdXBwb3J0IHRvIFJlYWRhYmxlVGV4dEZp
bGVPYmplY3QuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5p
dF9fLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9hbmFseXpl
Y2hhbmdlbG9nLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29t
bWFuZHMvYW5hbHl6ZWNoYW5nZWxvZ191bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2RhdGEvc3VtbWFyeS5odG1sOiBBZGRlZC4KKyAg
ICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvb3B0aW9ucy5weToKKwogMjAxMS0x
MS0zMCAgQWxlamFuZHJvIEcuIENhc3RybyAgPGFsZXhAaWdhbGlhLmNvbT4KIAogICAgICAgICBN
b3ZlZCBteXNlbGYgdG8gdGhlIHJldmlld2VycyBsaXN0LgpJbmRleDogVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vY2hlY2tvdXQvY2hhbmdlbG9nLnB5Cj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL2NoZWNrb3V0L2NoYW5nZWxvZy5weQkocmV2aXNpb24g
MTAxNTYxKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY2hlY2tvdXQvY2hhbmdl
bG9nLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yNzUsMTIgKzI3NSwxNyBAQCBjbGFzcyBDaGFuZ2VM
b2cob2JqZWN0KToKICAgICAgICAgZW50cnlfbGluZXMuYXBwZW5kKGZpcnN0X2xpbmUpCiAKICAg
ICAgICAgZm9yIGxpbmUgaW4gY2hhbmdlbG9nX2ZpbGU6Ci0gICAgICAgICAgICBpZiBkYXRlX2xp
bmVfcmVnZXhwLm1hdGNoKGxpbmUpIG9yIHJvbGxlZF9vdmVyX3JlZ2V4cC5tYXRjaChsaW5lKToK
KyAgICAgICAgICAgIGlmIHJvbGxlZF9vdmVyX3JlZ2V4cC5tYXRjaChsaW5lKToKKyAgICAgICAg
ICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiBkYXRlX2xpbmVfcmVnZXhwLm1hdGNoKGxp
bmUpOgogICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRoZSBleHRyYSBuZXdsaW5lIGF0IHRoZSBl
bmQKICAgICAgICAgICAgICAgICB5aWVsZCBDaGFuZ2VMb2dFbnRyeSgnJy5qb2luKGVudHJ5X2xp
bmVzWzotMV0pKQogICAgICAgICAgICAgICAgIGVudHJ5X2xpbmVzID0gW10KICAgICAgICAgICAg
IGVudHJ5X2xpbmVzLmFwcGVuZChsaW5lKQogCisgICAgICAgIHlpZWxkIENoYW5nZUxvZ0VudHJ5
KCcnLmpvaW4oZW50cnlfbGluZXNbOi0xXSkpCisKICAgICBkZWYgbGF0ZXN0X2VudHJ5KHNlbGYp
OgogICAgICAgICAjIENoYW5nZUxvZyBmaWxlcyBhcmUgYWx3YXlzIFVURi04LCB3ZSByZWFkIHRo
ZW0gaW4gYXMgc3VjaCB0byBzdXBwb3J0IFJldmlld2VycyB3aXRoIHVuaWNvZGUgaW4gdGhlaXIg
bmFtZXMuCiAgICAgICAgIGNoYW5nZWxvZ19maWxlID0gY29kZWNzLm9wZW4oc2VsZi5wYXRoLCAi
ciIsICJ1dGYtOCIpCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcv
Y29udHJpYnV0aW9uYXJlYXMucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vY29uZmlnL2NvbnRyaWJ1dGlvbmFyZWFzLnB5CShyZXZpc2lvbiAxMDE1NjEpCisr
KyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvY29udHJpYnV0aW9uYXJlYXMu
cHkJKHdvcmtpbmcgY29weSkKQEAgLTE3Nyw2ICsxNzcsOSBAQCBjbGFzcyBDb250cmlidXRpb25B
cmVhcyhvYmplY3QpOgogICAgICAgICBzZWxmLl9maWxlc3lzdGVtID0gZmlsZXN5c3RlbQogICAg
ICAgICBzZWxmLl9jb250cmlidXRpb25fYXJlYXMgPSB0YWJsZQogCisgICAgZGVmIG5hbWVzKHNl
bGYpOgorICAgICAgICByZXR1cm4gW2FyZWEubmFtZSgpIGZvciBhcmVhIGluIHNlbGYuX2NvbnRy
aWJ1dGlvbl9hcmVhc10KKwogICAgIGRlZiBfc3BsaXRfcGF0aChzZWxmLCBwYXRoKToKICAgICAg
ICAgcmVzdWx0ID0gW10KICAgICAgICAgd2hpbGUgcGF0aCBhbmQgbGVuKHBhdGgpOgpJbmRleDog
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1fbW9jay5weQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5
c3RlbV9tb2NrLnB5CShyZXZpc2lvbiAxMDE1NjEpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yODAs
NyArMjgwLDcgQEAgY2xhc3MgTW9ja0ZpbGVTeXN0ZW0ob2JqZWN0KToKICAgICBkZWYgb3Blbl90
ZXh0X2ZpbGVfZm9yX3JlYWRpbmcoc2VsZiwgcGF0aCk6CiAgICAgICAgIGlmIHNlbGYuZmlsZXNb
cGF0aF0gaXMgTm9uZToKICAgICAgICAgICAgIHNlbGYuX3JhaXNlX25vdF9mb3VuZChwYXRoKQot
ICAgICAgICByZXR1cm4gUmVhZGFibGVUZXh0RmlsZU9iamVjdChzZWxmLCBwYXRoKQorICAgICAg
ICByZXR1cm4gUmVhZGFibGVUZXh0RmlsZU9iamVjdChzZWxmLCBwYXRoLCBzZWxmLmZpbGVzW3Bh
dGhdKQogCiAgICAgZGVmIG9wZW5fdGV4dF9maWxlX2Zvcl93cml0aW5nKHNlbGYsIHBhdGgpOgog
ICAgICAgICByZXR1cm4gV3JpdGFibGVUZXh0RmlsZU9iamVjdChzZWxmLCBwYXRoKQpAQCAtMzgw
LDMgKzM4MCwyMiBAQCBjbGFzcyBSZWFkYWJsZUJpbmFyeUZpbGVPYmplY3Qob2JqZWN0KToKIGNs
YXNzIFJlYWRhYmxlVGV4dEZpbGVPYmplY3QoUmVhZGFibGVCaW5hcnlGaWxlT2JqZWN0KToKICAg
ICBkZWYgcmVhZChzZWxmLCBieXRlcz1Ob25lKToKICAgICAgICAgcmV0dXJuIFJlYWRhYmxlQmlu
YXJ5RmlsZU9iamVjdC5yZWFkKHNlbGYsIGJ5dGVzKS5kZWNvZGUoJ3V0Zi04JykKKworICAgIGRl
ZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vZmZzZXQgPj0gbGVuKHNlbGYuZGF0
YSk6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZSgpCisgICAgICAgIHN0YXJ0ID0gc2VsZi5v
ZmZzZXQKKyAgICAgICAgd2hpbGUgc2VsZi5vZmZzZXQgPCBsZW4oc2VsZi5kYXRhKToKKyAgICAg
ICAgICAgIGlmIHNlbGYuZGF0YVtzZWxmLm9mZnNldF0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAg
ICBicmVhaworICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gMQorICAgICAgICBzZWxmLm9mZnNl
dCArPSAxCisgICAgICAgIHJldHVybiBzZWxmLmRhdGFbc3RhcnQ6c2VsZi5vZmZzZXRdLmRlY29k
ZSgndXRmLTgnKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2Vs
ZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYub2Zmc2V0ID49IGxlbihz
ZWxmLmRhdGEpOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICByZXR1
cm4gc2VsZi5yZWFkbGluZSgpCkluZGV4OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29t
bWFuZHMvX19pbml0X18ucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS90
b29sL2NvbW1hbmRzL19faW5pdF9fLnB5CShyZXZpc2lvbiAxMDE1NjEpCisrKyBUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0X18ucHkJKHdvcmtpbmcgY29weSkKQEAg
LTEsNiArMSw3IEBACiAjIFJlcXVpcmVkIGZvciBQeXRob24gdG8gc2VhcmNoIHRoaXMgZGlyZWN0
b3J5IGZvciBtb2R1bGUgZmlsZXMKIAogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLmFkZHVz
ZXJzdG9ncm91cHMgaW1wb3J0IEFkZFVzZXJzVG9Hcm91cHMKK2Zyb20gd2Via2l0cHkudG9vbC5j
b21tYW5kcy5hbmFseXplY2hhbmdlbG9nIGltcG9ydCBBbmFseXplQ2hhbmdlTG9nCiBmcm9tIHdl
YmtpdHB5LnRvb2wuY29tbWFuZHMuYXBwbHl3YXRjaGxpc3Rsb2NhbCBpbXBvcnQgQXBwbHlXYXRj
aExpc3RMb2NhbAogZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLmJ1Z2ZvcnRlc3QgaW1wb3J0
IEJ1Z0ZvclRlc3QKIGZyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5idWdzZWFyY2ggaW1wb3J0
IEJ1Z1NlYXJjaApJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2Fu
YWx5emVjaGFuZ2Vsb2cucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS90
b29sL2NvbW1hbmRzL2FuYWx5emVjaGFuZ2Vsb2cucHkJKHJldmlzaW9uIDApCisrKyBUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvYW5hbHl6ZWNoYW5nZWxvZy5weQkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwyMDkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisj
IG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQganNvbgor
aW1wb3J0IHJlCitpbXBvcnQgdGltZQorZnJvbSB3ZWJraXRweS5jb21tb24uY2hlY2tvdXQuc2Nt
LmRldGVjdGlvbiBpbXBvcnQgU0NNRGV0ZWN0b3IKK2Zyb20gd2Via2l0cHkuY29tbW9uLmNoZWNr
b3V0LmNoYW5nZWxvZyBpbXBvcnQgQ2hhbmdlTG9nCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5jb25m
aWcuY29udHJpYnV0aW9uYXJlYXMgaW1wb3J0IENvbnRyaWJ1dGlvbkFyZWFzCitmcm9tIHdlYmtp
dHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbSBpbXBvcnQgRmlsZVN5c3RlbQorZnJvbSB3ZWJr
aXRweS5jb21tb24uc3lzdGVtLmV4ZWN1dGl2ZSBpbXBvcnQgRXhlY3V0aXZlCitmcm9tIHdlYmtp
dHB5LnRvb2wubXVsdGljb21tYW5kdG9vbCBpbXBvcnQgQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1h
bmQKK2Zyb20gd2Via2l0cHkudG9vbCBpbXBvcnQgc3RlcHMKKworCitjbGFzcyBBbmFseXplQ2hh
bmdlTG9nKEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kKToKKyAgICBuYW1lID0gImFuYWx5emUt
Y2hhbmdlbG9nIgorICAgIGhlbHBfdGV4dCA9ICJFeHBlcmltZW50YWwgY29tbWFuZCBmb3IgYW5h
bHl6aW5nIGNoYW5nZSBsb2dzLiIKKyAgICBsb25nX2hlbHAgPSAiVGhpcyBjb21tYW5kIHBhcnNl
cyBjaGFuZ2Vsb2dzIGluIGEgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgc3VtbWFyaXplcyB0aGUg
cmVzdWx0IGFzIEpTT04gZmlsZXMuIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAg
ICBvcHRpb25zID0gWworICAgICAgICAgICAgc3RlcHMuT3B0aW9ucy5jaGFuZ2Vsb2dfY291bnQs
CisgICAgICAgIF0KKyAgICAgICAgQWJzdHJhY3REZWNsYXJhdGl2ZUNvbW1hbmQuX19pbml0X18o
c2VsZiwgb3B0aW9ucz1vcHRpb25zKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfZW51
bWVyYXRlX2NoYW5nZWxvZ3MoZmlsZXN5c3RlbSwgZGlybmFtZSwgY2hhbmdlbG9nX2NvdW50KToK
KyAgICAgICAgY2hhbmdlbG9ncyA9IFtmaWxlc3lzdGVtLmpvaW4oZGlybmFtZSwgZmlsZW5hbWUp
IGZvciBmaWxlbmFtZSBpbiBmaWxlc3lzdGVtLmxpc3RkaXIoZGlybmFtZSkgaWYgcmUubWF0Y2go
J15DaGFuZ2VMb2coLShcZHs0fS1cZHsyfS1cZHsyfSkpPyQnLCBmaWxlbmFtZSldCisgICAgICAg
ICMgTWFrZSBzdXJlIENoYW5nZUxvZyBzaG93cyB1cCBiZWZvcmUgQ2hhbmdlTG9nLTIwMTEtMDEt
MDEKKyAgICAgICAgY2hhbmdlbG9ncyA9IHNvcnRlZChjaGFuZ2Vsb2dzLCBrZXk9bGFtYmRhIGZp
bGVuYW1lOiBmaWxlbmFtZSArICdYJywgcmV2ZXJzZT1UcnVlKQorICAgICAgICByZXR1cm4gY2hh
bmdlbG9nc1s6Y2hhbmdlbG9nX2NvdW50XQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBf
Z2VuZXJhdGVfanNvbnMoZmlsZXN5c3RlbSwganNvbl9maWxlcywgb3V0cHV0X2Rpcik6CisgICAg
ICAgIGZvciBmaWxlbmFtZSBpbiBqc29uX2ZpbGVzOgorICAgICAgICAgICAgb3V0cHV0X2ZpbGUg
PSBmaWxlc3lzdGVtLm9wZW5fdGV4dF9maWxlX2Zvcl93cml0aW5nKGZpbGVzeXN0ZW0uam9pbihv
dXRwdXRfZGlyLCBmaWxlbmFtZSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAg
cHJpbnQgJyAgICBHZW5lcmF0aW5nJywgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICBvdXRwdXRf
ZmlsZS53cml0ZShqc29uLmR1bXBzKGpzb25fZmlsZXNbZmlsZW5hbWVdLCBpbmRlbnQ9MikpCisg
ICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG91dHB1dF9maWxlLmNsb3NlKCkK
KworICAgIGRlZiBleGVjdXRlKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRvb2wpOgorICAgICAgICBm
aWxlc3lzdGVtID0gc2VsZi5fdG9vbC5maWxlc3lzdGVtCisgICAgICAgIGlmIGxlbihhcmdzKSA8
IDEgb3Igbm90IGZpbGVzeXN0ZW0uaXNkaXIoYXJnc1swXSk6CisgICAgICAgICAgICBwcmludCAi
TmVlZCB0aGUgZGlyZWN0b3J5IG5hbWUgdG8gbG9vayBmb3IgY2hhbmdlbG9nIGFzIHRoZSBmaXJz
dCBhcmd1bWVudCIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjaGFuZ2Vsb2dfZGlyID0g
ZmlsZXN5c3RlbS5hYnNwYXRoKGFyZ3NbMF0pCisKKyAgICAgICAgaWYgbGVuKGFyZ3MpIDwgMiBv
ciBub3QgZmlsZXN5c3RlbS5pc2RpcihhcmdzWzFdKToKKyAgICAgICAgICAgIHByaW50ICJOZWVk
IHRoZSBvdXRwdXQgZGlyZWN0b3J5IG5hbWUgYXMgdGhlIHNlY29uZCBhcmd1bWVudCIKKyAgICAg
ICAgICAgIHJldHVybgorICAgICAgICBvdXRwdXRfZGlyID0gYXJnc1sxXQorCisgICAgICAgIHN0
YXJ0VGltZSA9IHRpbWUudGltZSgpCisKKyAgICAgICAgcHJpbnQgJ0VudW1lcmF0aW5nIENoYW5n
ZUxvZyBmaWxlcy4uLicKKyAgICAgICAgY2hhbmdlbG9ncyA9IEFuYWx5emVDaGFuZ2VMb2cuX2Vu
dW1lcmF0ZV9jaGFuZ2Vsb2dzKGZpbGVzeXN0ZW0sIGNoYW5nZWxvZ19kaXIsIG9wdGlvbnMuY2hh
bmdlbG9nX2NvdW50KQorCisgICAgICAgIGFuYWx5emVyID0gQ2hhbmdlTG9nQW5hbHl6ZXIodG9v
bCwgY2hhbmdlbG9ncykKKyAgICAgICAgYW5hbHl6ZXIuYW5hbHl6ZSgpCisKKyAgICAgICAgcHJp
bnQgJ0dlbmVyYXRpbmcganNvbiBmaWxlcy4uLicKKyAgICAgICAganNvbl9maWxlcyA9IHsKKyAg
ICAgICAgICAgICdzdW1tYXJ5Lmpzb24nOiBhbmFseXplci5zdW1tYXJ5KCksCisgICAgICAgICAg
ICAnY29udHJpYnV0b3JzLmpzb24nOiBhbmFseXplci5jb250cmlidXRvcnNfc3RhdGlzdGljcygp
LAorICAgICAgICAgICAgJ2FyZWFzLmpzb24nOiBhbmFseXplci5hcmVhc19zdGF0aXN0aWNzKCks
CisgICAgICAgIH0KKyAgICAgICAgQW5hbHl6ZUNoYW5nZUxvZy5fZ2VuZXJhdGVfanNvbnMoZmls
ZXN5c3RlbSwganNvbl9maWxlcywgb3V0cHV0X2RpcikKKyAgICAgICAgY29tbWFuZHNfZGlyID0g
ZmlsZXN5c3RlbS5kaXJuYW1lKGZpbGVzeXN0ZW0uYWJzcGF0aChfX2ZpbGVfXykpCisgICAgICAg
IGZpbGVzeXN0ZW0uY29weWZpbGUoZmlsZXN5c3RlbS5qb2luKGNvbW1hbmRzX2RpciwgJ2RhdGEv
c3VtbWFyeS5odG1sJyksIGZpbGVzeXN0ZW0uam9pbihvdXRwdXRfZGlyLCAnc3VtbWFyeS5odG1s
JykpCisKKyAgICAgICAgdGljayA9IHRpbWUudGltZSgpIC0gc3RhcnRUaW1lCisgICAgICAgIHBy
aW50ICdGaW5pc2hlZCBpbiAlMDJkbTolMDJkcycgJSAoaW50KHRpY2sgLyA2MCksIGludCh0aWNr
ICUgNjApKQorCisKK2NsYXNzIENoYW5nZUxvZ0FuYWx5emVyKG9iamVjdCk6CisgICAgZGVmIF9f
aW5pdF9fKHNlbGYsIGhvc3QsIGNoYW5nZWxvZ19wYXRocyk6CisgICAgICAgIHNlbGYuX2NoYW5n
ZWxvZ19wYXRocyA9IGNoYW5nZWxvZ19wYXRocworICAgICAgICBzZWxmLl9maWxlc3lzdGVtID0g
aG9zdC5maWxlc3lzdGVtCisgICAgICAgIHNlbGYuX2NvbnRyaWJ1dGlvbl9hcmVhcyA9IENvbnRy
aWJ1dGlvbkFyZWFzKGhvc3QuZmlsZXN5c3RlbSkKKyAgICAgICAgc2VsZi5fc2NtID0gaG9zdC5z
Y20oKQorICAgICAgICBzZWxmLl9wYXJzZWRfcmV2aXNpb25zID0ge30KKworICAgICAgICBzZWxm
Ll9jb250cmlidXRvcnNfc3RhdGlzdGljcyA9IHt9CisgICAgICAgIHNlbGYuX2FyZWFzX3N0YXRp
c3RpY3MgPSBkaWN0KFsoYXJlYSwgeydyZXZpZXdlZCc6IDAsICd1bnJldmlld2VkJzogMCwgJ2Nv
bnRyaWJ1dG9ycyc6IHt9fSkgZm9yIGFyZWEgaW4gc2VsZi5fY29udHJpYnV0aW9uX2FyZWFzLm5h
bWVzKCldKQorICAgICAgICBzZWxmLl9zdW1tYXJ5ID0geydyZXZpZXdlZCc6IDAsICd1bnJldmll
d2VkJzogMH0KKworICAgICAgICBzZWxmLl9sb25nZXN0X2ZpbGVuYW1lID0gbWF4KFtsZW4ocGF0
aCkgLSBsZW4oc2VsZi5fc2NtLmNoZWNrb3V0X3Jvb3QpIGZvciBwYXRoIGluIGNoYW5nZWxvZ19w
YXRoc10pCisgICAgICAgIHNlbGYuX3ByZXZpb3VzX3N0YXR1cyA9ICcnCisKKyAgICBkZWYgY29u
dHJpYnV0b3JzX3N0YXRpc3RpY3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250cmli
dXRvcnNfc3RhdGlzdGljcworCisgICAgZGVmIGFyZWFzX3N0YXRpc3RpY3Moc2VsZik6CisgICAg
ICAgIHJldHVybiBzZWxmLl9hcmVhc19zdGF0aXN0aWNzCisKKyAgICBkZWYgc3VtbWFyeShzZWxm
KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3N1bW1hcnkKKworICAgIGRlZiBfcHJpbnRfc3RhdHVz
KHNlbGYsIG5ld19zdGF0dXMpOgorICAgICAgICBzdGF0dXMgPSBuZXdfc3RhdHVzICsgKCcgJyAq
IG1heChsZW4oc2VsZi5fcHJldmlvdXNfc3RhdHVzKSAtIGxlbihuZXdfc3RhdHVzKSAtIDEsIDAp
KQorICAgICAgICBwcmludCAiXGIiICogbGVuKHNlbGYuX3ByZXZpb3VzX3N0YXR1cykgKyBzdGF0
dXMsCisgICAgICAgIHNlbGYuX3ByZXZpb3VzX3N0YXR1cyA9IHN0YXR1cyArICcgJworCisgICAg
ZGVmIF9wcmludF9maWxlbmFtZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGlmIHNlbGYuX3By
ZXZpb3VzX3N0YXR1czoKKyAgICAgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICgnJScgKyBz
dHIoc2VsZi5fbG9uZ2VzdF9maWxlbmFtZSkgKyAnczonKSAlIGZpbGVuYW1lLAorICAgICAgICBz
ZWxmLl9wcmV2aW91c19zdGF0dXMgPSAnJworCisgICAgZGVmIGFuYWx5emUoc2VsZik6CisgICAg
ICAgIGZvciBwYXRoIGluIHNlbGYuX2NoYW5nZWxvZ19wYXRoczoKKyAgICAgICAgICAgIHNlbGYu
X3ByaW50X2ZpbGVuYW1lKHNlbGYuX2ZpbGVzeXN0ZW0ucmVscGF0aChwYXRoLCBzZWxmLl9zY20u
Y2hlY2tvdXRfcm9vdCkpCisgICAgICAgICAgICBjaGFuZ2Vsb2cgPSBzZWxmLl9maWxlc3lzdGVt
Lm9wZW5fdGV4dF9maWxlX2Zvcl9yZWFkaW5nKHBhdGgpCisgICAgICAgICAgICB0cnk6CisgICAg
ICAgICAgICAgICAgc2VsZi5fcHJpbnRfc3RhdHVzKCdQYXJzaW5nIGVudHJpZXMuLi4nKQorICAg
ICAgICAgICAgICAgIG51bWJlcl9vZl9wYXJzZWRfZW50cmllcyA9IHNlbGYuX2FuYWx5emVfZW50
cmllcyhDaGFuZ2VMb2cucGFyc2VfZW50cmllc19mcm9tX2ZpbGUoY2hhbmdlbG9nKSwgcGF0aCkK
KyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgY2hhbmdlbG9nLmNsb3NlKCkK
KyAgICAgICAgICAgIHNlbGYuX3ByaW50X3N0YXR1cygnRG9uZSAoJWQgZW50cmllcyknICUgbnVt
YmVyX29mX3BhcnNlZF9lbnRyaWVzKQorICAgICAgICBwcmludAorICAgICAgICBzZWxmLl9zdW1t
YXJ5Wydjb250cmlidXRvcnMnXSA9IGxlbihzZWxmLl9jb250cmlidXRvcnNfc3RhdGlzdGljcykK
KyAgICAgICAgc2VsZi5fc3VtbWFyeVsnY29udHJpYnV0b3JzX3dpdGhfcmV2aWV3cyddID0gc3Vt
KFsxIGZvciBjb250cmlidXRvciBpbiBzZWxmLl9jb250cmlidXRvcnNfc3RhdGlzdGljcy52YWx1
ZXMoKSBpZiBjb250cmlidXRvclsncmV2aWV3cyddWyd0b3RhbCddXSkKKyAgICAgICAgc2VsZi5f
c3VtbWFyeVsnY29udHJpYnV0b3JzX3dpdGhvdXRfcmV2aWV3cyddID0gc2VsZi5fc3VtbWFyeVsn
Y29udHJpYnV0b3JzJ10gLSBzZWxmLl9zdW1tYXJ5Wydjb250cmlidXRvcnNfd2l0aF9yZXZpZXdz
J10KKworICAgIGRlZiBfY29sbGVjdF9zdGF0aXN0aWNzX2Zvcl9jb250cmlidXRvcl9hcmVhKHNl
bGYsIGFyZWEsIGNvbnRyaWJ1dG9yLCBjb250cmlidXRpb25fdHlwZSwgcmV2aWV3ZWQpOgorICAg
ICAgICBhcmVhX2NvbnRyaWJ1dG9ycyA9IHNlbGYuX2FyZWFzX3N0YXRpc3RpY3NbYXJlYV1bJ2Nv
bnRyaWJ1dG9ycyddCisgICAgICAgIGlmIGNvbnRyaWJ1dG9yIG5vdCBpbiBhcmVhX2NvbnRyaWJ1
dG9yczoKKyAgICAgICAgICAgIGFyZWFfY29udHJpYnV0b3JzW2NvbnRyaWJ1dG9yXSA9IHsncmV2
aWV3cyc6IDAsICdyZXZpZXdlZCc6IDAsICd1bnJldmlld2VkJzogMH0KKyAgICAgICAgaWYgY29u
dHJpYnV0aW9uX3R5cGUgPT0gJ3BhdGNoZXMnOgorICAgICAgICAgICAgY29udHJpYnV0aW9uX3R5
cGUgPSAncmV2aWV3ZWQnIGlmIHJldmlld2VkIGVsc2UgJ3VucmV2aWV3ZWQnCisgICAgICAgIGFy
ZWFfY29udHJpYnV0b3JzW2NvbnRyaWJ1dG9yXVtjb250cmlidXRpb25fdHlwZV0gKz0gMQorCisg
ICAgZGVmIF9jb2xsZWN0X3N0YXRpc3RpY3NfZm9yX2NvbnRyaWJ1dG9yKHNlbGYsIGNvbnRyaWJ1
dG9yLCBjb250cmlidXRpb25fdHlwZSwgYXJlYXMsIHRvdWNoZWRfZmlsZXMsIHJldmlld2VkKToK
KyAgICAgICAgaWYgY29udHJpYnV0b3Igbm90IGluIHNlbGYuX2NvbnRyaWJ1dG9yc19zdGF0aXN0
aWNzOgorICAgICAgICAgICAgc2VsZi5fY29udHJpYnV0b3JzX3N0YXRpc3RpY3NbY29udHJpYnV0
b3JdID0geworICAgICAgICAgICAgICAgICdyZXZpZXdzJzogeyd0b3RhbCc6IDAsICdhcmVhcyc6
IHt9LCAnZmlsZXMnOiB7fX0sCisgICAgICAgICAgICAgICAgJ3BhdGNoZXMnOiB7J3Jldmlld2Vk
JzogMCwgJ3VucmV2aWV3ZWQnOiAwLCAnYXJlYXMnOiB7fSwgJ2ZpbGVzJzoge319fQorICAgICAg
ICBzdGF0aXN0aWNzID0gc2VsZi5fY29udHJpYnV0b3JzX3N0YXRpc3RpY3NbY29udHJpYnV0b3Jd
W2NvbnRyaWJ1dGlvbl90eXBlXQorCisgICAgICAgIGlmIGNvbnRyaWJ1dGlvbl90eXBlID09ICdy
ZXZpZXdzJzoKKyAgICAgICAgICAgIHN0YXRpc3RpY3NbJ3RvdGFsJ10gKz0gMQorICAgICAgICBl
bGlmIHJldmlld2VkOgorICAgICAgICAgICAgc3RhdGlzdGljc1sncmV2aWV3ZWQnXSArPSAxCisg
ICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGF0aXN0aWNzWyd1bnJldmlld2VkJ10gKz0gMQor
CisgICAgICAgIGZvciBhcmVhIGluIGFyZWFzOgorICAgICAgICAgICAgc2VsZi5faW5jcmVtZW50
X2RpY3Rpb25hcnlfdmFsdWUoc3RhdGlzdGljc1snYXJlYXMnXSwgYXJlYSkKKyAgICAgICAgICAg
IHNlbGYuX2NvbGxlY3Rfc3RhdGlzdGljc19mb3JfY29udHJpYnV0b3JfYXJlYShhcmVhLCBjb250
cmlidXRvciwgY29udHJpYnV0aW9uX3R5cGUsIHJldmlld2VkKQorICAgICAgICBmb3IgdG91Y2hl
ZGZpbGUgaW4gdG91Y2hlZF9maWxlczoKKyAgICAgICAgICAgIHNlbGYuX2luY3JlbWVudF9kaWN0
aW9uYXJ5X3ZhbHVlKHN0YXRpc3RpY3NbJ2ZpbGVzJ10sIHRvdWNoZWRmaWxlKQorCisgICAgZGVm
IF9pbmNyZW1lbnRfZGljdGlvbmFyeV92YWx1ZShzZWxmLCBkaWN0aW9uYXJ5LCBrZXkpOgorICAg
ICAgICBkaWN0aW9uYXJ5W2tleV0gPSBkaWN0aW9uYXJ5LmdldChrZXksIDApICsgMQorCisgICAg
ZGVmIF9hbmFseXplX2VudHJpZXMoc2VsZiwgZW50cmllcywgY2hhbmdlbG9nX3BhdGgpOgorICAg
ICAgICBkaXJuYW1lID0gc2VsZi5fZmlsZXN5c3RlbS5kaXJuYW1lKGNoYW5nZWxvZ19wYXRoKQor
ICAgICAgICBudW1iZXJfb2ZfZW50cmllcyA9IDAKKyAgICAgICAgZm9yIG51bWJlcl9vZl9lbnRy
aWVzLCBlbnRyeSBpbiBlbnVtZXJhdGUoZW50cmllcyk6CisgICAgICAgICAgICBzZWxmLl9wcmlu
dF9zdGF0dXMoJyglcykgZW50cmllcycgJSBudW1iZXJfb2ZfZW50cmllcykKKyAgICAgICAgICAg
IGFzc2VydChlbnRyeS5hdXRob3JzKCkpCisKKyAgICAgICAgICAgIHRvdWNoZWRmaWxlc19mb3Jf
ZW50cnkgPSBbc2VsZi5fZmlsZXN5c3RlbS5yZWxwYXRoKHNlbGYuX2ZpbGVzeXN0ZW0uam9pbihk
aXJuYW1lLCBuYW1lKSwgc2VsZi5fc2NtLmNoZWNrb3V0X3Jvb3QpIGZvciBuYW1lIGluIGVudHJ5
LnRvdWNoZWRfZmlsZXMoKV0KKyAgICAgICAgICAgIGFyZWFzX2Zvcl9lbnRyeSA9IHNlbGYuX2Nv
bnRyaWJ1dGlvbl9hcmVhcy5hcmVhc19mb3JfdG91Y2hlZF9maWxlcyh0b3VjaGVkZmlsZXNfZm9y
X2VudHJ5KQorICAgICAgICAgICAgYXV0aG9yc19mb3JfZW50cnkgPSBlbnRyeS5hdXRob3JzKCkK
KyAgICAgICAgICAgIHJldmlld2Vyc19mb3JfZW50cnkgPSBlbnRyeS5yZXZpZXdlcnMoKQorCisg
ICAgICAgICAgICBmb3IgcmV2aWV3ZXIgaW4gcmV2aWV3ZXJzX2Zvcl9lbnRyeToKKyAgICAgICAg
ICAgICAgICBzZWxmLl9jb2xsZWN0X3N0YXRpc3RpY3NfZm9yX2NvbnRyaWJ1dG9yKHJldmlld2Vy
LmZ1bGxfbmFtZSwgJ3Jldmlld3MnLCBhcmVhc19mb3JfZW50cnksIHRvdWNoZWRmaWxlc19mb3Jf
ZW50cnksIHJldmlld2VkPVRydWUpCisKKyAgICAgICAgICAgIGZvciBhdXRob3IgaW4gYXV0aG9y
c19mb3JfZW50cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fY29sbGVjdF9zdGF0aXN0aWNzX2Zv
cl9jb250cmlidXRvcihhdXRob3JbJ25hbWUnXSwgJ3BhdGNoZXMnLCBhcmVhc19mb3JfZW50cnks
IHRvdWNoZWRmaWxlc19mb3JfZW50cnksCisgICAgICAgICAgICAgICAgICAgIHJldmlld2VkPWJv
b2wocmV2aWV3ZXJzX2Zvcl9lbnRyeSkpCisKKyAgICAgICAgICAgIGZvciBhcmVhIGluIGFyZWFz
X2Zvcl9lbnRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9hcmVhc19zdGF0aXN0aWNzW2FyZWFd
WydyZXZpZXdlZCcgaWYgcmV2aWV3ZXJzX2Zvcl9lbnRyeSBlbHNlICd1bnJldmlld2VkJ10gKz0g
MQorCisgICAgICAgICAgICBzZWxmLl9zdW1tYXJ5WydyZXZpZXdlZCcgaWYgcmV2aWV3ZXJzX2Zv
cl9lbnRyeSBlbHNlICd1bnJldmlld2VkJ10gKz0gMQorCisgICAgICAgIHNlbGYuX3ByaW50X3N0
YXR1cygnKCVzKSBlbnRyaWVzJyAlIG51bWJlcl9vZl9lbnRyaWVzKQorICAgICAgICByZXR1cm4g
bnVtYmVyX29mX2VudHJpZXMKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21t
YW5kcy9hbmFseXplY2hhbmdlbG9nX3VuaXR0ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9hbmFseXplY2hhbmdlbG9nX3VuaXR0ZXN0LnB5
CShyZXZpc2lvbiAwKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2Fu
YWx5emVjaGFuZ2Vsb2dfdW5pdHRlc3QucHkJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTgzIEBA
CisjIENweXJpZ2h0IChjKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisj
CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24u
CisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQganNvbgoraW1wb3J0IHN5cworZnJvbSB3ZWJraXRw
eS5jb21tb24uY29uZmlnLmNvbnRyaWJ1dGlvbmFyZWFzIGltcG9ydCBDb250cmlidXRpb25BcmVh
cworZnJvbSB3ZWJraXRweS5jb21tb24uaG9zdF9tb2NrIGltcG9ydCBNb2NrSG9zdAorZnJvbSB3
ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzeXN0ZW1fbW9jayBpbXBvcnQgTW9ja0ZpbGVTeXN0
ZW0KK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5leGVjdXRpdmUgaW1wb3J0IEV4ZWN1dGl2
ZQorZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLmFuYWx5emVjaGFuZ2Vsb2cgaW1wb3J0IEFu
YWx5emVDaGFuZ2VMb2cKK2Zyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5hbmFseXplY2hhbmdl
bG9nIGltcG9ydCBDaGFuZ2VMb2dBbmFseXplcgorZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRz
LmNvbW1hbmR0ZXN0IGltcG9ydCBDb21tYW5kc1Rlc3QKK2Zyb20gd2Via2l0cHkudG9vbC5tdWx0
aWNvbW1hbmR0b29sIGltcG9ydCBBYnN0cmFjdERlY2xhcmF0aXZlQ29tbWFuZAorCisKK2NsYXNz
IEFuYWx5emVDaGFuZ2VMb2dUZXN0KENvbW1hbmRzVGVzdCk6CisgICAgZGVmIHRlc3RfZW51bWVy
YXRlX2VudW1lcmF0ZV9jaGFuZ2Vsb2dzKHNlbGYpOgorICAgICAgICBmaWxlc3lzdGVtID0gTW9j
a0ZpbGVTeXN0ZW0oeworICAgICAgICAgICAgJ2Zvby9DaGFuZ2VMb2cnOiAnJywKKyAgICAgICAg
ICAgICdmb28vQ2hhbmdlTG9nLTIwMTAtMDYtMjMnOiAnJywKKyAgICAgICAgICAgICdmb28vQ2hh
bmdlTG9nLTIwMTAtMTItMzEnOiAnJywKKyAgICAgICAgICAgICdmb28vQ2hhbmdlTG9nLXgnOiAn
JywKKyAgICAgICAgICAgICdmb28vQ2hhbmdlTG9nLTIwMTEtMDEtMDEnOiAnJywKKyAgICAgICAg
fSkKKyAgICAgICAgY2hhbmdlbG9ncyA9IEFuYWx5emVDaGFuZ2VMb2cuX2VudW1lcmF0ZV9jaGFu
Z2Vsb2dzKGZpbGVzeXN0ZW0sICdmb28vJywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bChjaGFuZ2Vsb2dzLCBbJ2Zvby9DaGFuZ2VMb2cnLCAnZm9vL0NoYW5nZUxvZy0yMDExLTAxLTAx
JywgJ2Zvby9DaGFuZ2VMb2ctMjAxMC0xMi0zMScsICdmb28vQ2hhbmdlTG9nLTIwMTAtMDYtMjMn
XSkKKworICAgICAgICBjaGFuZ2Vsb2dzID0gQW5hbHl6ZUNoYW5nZUxvZy5fZW51bWVyYXRlX2No
YW5nZWxvZ3MoZmlsZXN5c3RlbSwgJ2Zvby8nLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
KGNoYW5nZWxvZ3MsIFsnZm9vL0NoYW5nZUxvZycsICdmb28vQ2hhbmdlTG9nLTIwMTEtMDEtMDEn
XSkKKworICAgIGRlZiB0ZXN0X2dlbmVyYXRlX2pzb25zKHNlbGYpOgorICAgICAgICBmaWxlc3lz
dGVtID0gTW9ja0ZpbGVTeXN0ZW0oKQorICAgICAgICB0ZXN0X2pzb24gPSB7J2FycmF5Lmpzb24n
OiBbMSwgMiwgMywgeydrZXknOiAndmFsdWUnfV0sICdkaWN0aW9uYXJ5Lmpzb24nOiB7J3NvbWVr
ZXknOiAnc29tZXZhbHVlJywgJ2FycmF5JzogWzQsIDVdfX0KKyAgICAgICAgc3lzX3N0ZG91dCA9
IHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGZpbGVz
eXN0ZW0ub3Blbl90ZXh0X2ZpbGVfZm9yX3dyaXRpbmcoJ3N0ZG91dCcpCisgICAgICAgICAgICBB
bmFseXplQ2hhbmdlTG9nLl9nZW5lcmF0ZV9qc29ucyhmaWxlc3lzdGVtLCB0ZXN0X2pzb24sICdi
YXInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoZmlsZXN5c3RlbS5maWxlcy5r
ZXlzKCkpLCBzZXQoWydiYXIvYXJyYXkuanNvbicsICdiYXIvZGljdGlvbmFyeS5qc29uJywgJ3N0
ZG91dCddKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXNf
c3Rkb3V0CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqc29uLmxvYWRzKGZpbGVzeXN0ZW0u
ZmlsZXNbJ2Jhci9hcnJheS5qc29uJ10pLCB0ZXN0X2pzb25bJ2FycmF5Lmpzb24nXSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbChqc29uLmxvYWRzKGZpbGVzeXN0ZW0uZmlsZXNbJ2Jhci9kaWN0
aW9uYXJ5Lmpzb24nXSksIHRlc3RfanNvblsnZGljdGlvbmFyeS5qc29uJ10pCisKKworY2xhc3Mg
Q2hhbmdlTG9nQW5hbHl6ZXJUZXN0KENvbW1hbmRzVGVzdCk6CisgICAgZGVmIHRlc3RfYW5hbHl6
ZV9vbmVfY2hhbmdlbG9nKHNlbGYpOgorICAgICAgICBob3N0ID0gTW9ja0hvc3QoKQorICAgICAg
ICBob3N0LmZpbGVzeXN0ZW0uZmlsZXNbJ21vY2stY2hlY2tvdXQvZm9vL0NoYW5nZUxvZyddID0g
dSIiIjIwMTEtMTEtMTcgIE1hcmsgUm93ZSAgPG1yb3dlQGFwcGxlLmNvbT4KKworICAgIDxodHRw
Oi8vd2Via2l0Lm9yZy9iLzcyNjQ2PiBEaXNhYmxlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGFyb3Vu
ZCBjb2RlIHdoZXJlIHdlIGNhbm5vdCBlYXNpbHkKKyAgICBzd2l0Y2ggYXdheSBmcm9tIHRoZSBk
ZXByZWNhdGVkIEFQSXMuCisKKyAgICBSZXZpZXdlZCBieSBTYW0gV2VpbmlnLgorCisgICAgKiBw
bGF0Zm9ybS9tYWMvV2ViQ29yZU5TU3RyaW5nRXh0cmFzLm1tOgorICAgICogcGxhdGZvcm0vbmV0
d29yay9jZi9Tb2NrZXRTdHJlYW1IYW5kbGVDRk5ldC5jcHA6CisgICAgKFdlYkNvcmU6OlNvY2tl
dFN0cmVhbUhhbmRsZTo6cmVwb3J0RXJyb3JUb0NsaWVudCk6CisKKzIwMTEtMTEtMTkgIEtldmlu
IE9sbGl2aWVyICA8a2V2aW5vQHRoZW9sbGl2aWVycy5jb20+CisKKyAgICBbd3hdIEMrKyBiaW5k
aW5ncyBidWlsZCBmaXggZm9yIG1vdmUgb2YgYXJyYXkgY2xhc3NlcyB0byBXVEYuCisKKyAgICAq
IGJpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvckNQUC5wbToKKyAgICAoR2V0Q1BQVHlwZUdl
dHRlcik6CisgICAgKEdldE5hbWVzcGFjZUZvckNsYXNzKToKKyAgICAoR2VuZXJhdGVIZWFkZXIp
OgorICAgIChHZW5lcmF0ZUltcGxlbWVudGF0aW9uKToKKworMjAxMS0xMC0yNyAgUGhpbGlwcGUg
Tm9ybWFuZCAgPHBub3JtYW5kQGlnYWxpYS5jb20+IGFuZCBaYW4gRG9iZXJzZWsgIDx6YW5kb2Jl
cnNla0BnbWFpbC5jb20+CisKKyAgICAgICAgW0dTdHJlYW1lcl0gV2ViQXVkaW8gQXVkaW9GaWxl
UmVhZGVyIGltcGxlbWVudGF0aW9uCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD02OTgzNAorCisgICAgICAgIFJldmlld2VkIGJ5IE1hcnRpbiBSb2JpbnNv
bi4KKworICAgICAgICBCYXNpYyBGaWxlUmVhZGVyIGltcGxlbWVudGF0aW9uLCBzdXBwb3J0aW5n
IG9uZSBvciAyIGF1ZGlvCisgICAgICAgIGNoYW5uZWxzLiBBbiBlbXB0eSBBdWRpb0Rlc3RpbmF0
aW9uIGlzIGFsc28gcHJvdmlkZWQsIGl0cyBjb21wbGV0ZQorICAgICAgICBpbXBsZW1lbnRhdGlv
biBpcyBoYW5kbGVkIGluIGJ1ZyA2OTgzNS4KKworICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgor
ICAgICAgICAqIEdOVW1ha2VmaWxlLmxpc3QuYW06CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8v
Z3N0cmVhbWVyL0F1ZGlvRGVzdGluYXRpb25HU3RyZWFtZXIuY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb246OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0Rlc3RpbmF0aW9uOjpoYXJkd2FyZVNhbXBsZVJhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9EZXN0aW5hdGlvbkdTdHJlYW1lcjo6QXVkaW9EZXN0aW5hdGlvbkdTdHJlYW1lcik6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uR1N0cmVhbWVyOjp+QXVkaW9EZXN0aW5h
dGlvbkdTdHJlYW1lcik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uR1N0cmVh
bWVyOjpzdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9uR1N0cmVhbWVy
OjpzdG9wKToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9nc3RyZWFtZXIvQXVkaW9EZXN0aW5h
dGlvbkdTdHJlYW1lci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRp
b25HU3RyZWFtZXI6OmlzUGxheWluZyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0
aW9uR1N0cmVhbWVyOjpzYW1wbGVSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGlu
YXRpb25HU3RyZWFtZXI6OnNvdXJjZVByb3ZpZGVyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRp
by9nc3RyZWFtZXIvQXVkaW9GaWxlUmVhZGVyR1N0cmVhbWVyLmNwcDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpnZXRHU3RyZWFtZXJBdWRpb0NhcHMpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0
RmxvYXRGcm9tQnl0ZVJlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpjb3B5R3N0cmVhbWVyQnVm
ZmVyc1RvQXVkaW9DaGFubmVsKToKKyAgICAgICAgKFdlYkNvcmU6Om9uQXBwc2lua05ld0J1ZmZl
ckNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6Om1lc3NhZ2VDYWxsYmFjayk6CisgICAgICAg
IChXZWJDb3JlOjpvbkdTdHJlYW1lckRlaW50ZXJsZWF2ZVBhZEFkZGVkQ2FsbGJhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6b25HU3RyZWFtZXJEZWludGVybGVhdmVSZWFkeUNhbGxiYWNrKToKKyAg
ICAgICAgKFdlYkNvcmU6Om9uR1N0cmVhbWVyRGVjb2RlYmluUGFkQWRkZWRDYWxsYmFjayk6Cisg
ICAgICAgIChXZWJDb3JlOjpBdWRpb0ZpbGVSZWFkZXI6OkF1ZGlvRmlsZVJlYWRlcik6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb0ZpbGVSZWFkZXI6On5BdWRpb0ZpbGVSZWFkZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6QXVkaW9GaWxlUmVhZGVyOjpoYW5kbGVCdWZmZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6QXVkaW9GaWxlUmVhZGVyOjpoYW5kbGVNZXNzYWdlKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvRmlsZVJlYWRlcjo6aGFuZGxlTmV3RGVpbnRlcmxlYXZlUGFkKToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvRmlsZVJlYWRlcjo6ZGVpbnRlcmxlYXZlUGFkc0NvbmZpZ3VyZWQpOgorICAg
ICAgICAoV2ViQ29yZTo6QXVkaW9GaWxlUmVhZGVyOjpwbHVnRGVpbnRlcmxlYXZlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvRmlsZVJlYWRlcjo6Y3JlYXRlQnVzKToKKyAgICAgICAgKFdlYkNv
cmU6OmNyZWF0ZUJ1c0Zyb21BdWRpb0ZpbGUpOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlQnVz
RnJvbUluTWVtb3J5QXVkaW9GaWxlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9ndGsvQXVk
aW9CdXNHdGsuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvQnVzOjpsb2FkUGxh
dGZvcm1SZXNvdXJjZSk6CisiIiIKKworICAgICAgICBzeXNfc3Rkb3V0ID0gc3lzLnN0ZG91dAor
ICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gaG9zdC5maWxlc3lzdGVtLm9w
ZW5fdGV4dF9maWxlX2Zvcl93cml0aW5nKCdzdGRvdXQnKQorICAgICAgICAgICAgYW5hbHl6ZXIg
PSBDaGFuZ2VMb2dBbmFseXplcihob3N0LCBbJ21vY2stY2hlY2tvdXQvZm9vL0NoYW5nZUxvZydd
KQorICAgICAgICAgICAgYW5hbHl6ZXIuYW5hbHl6ZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAg
ICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzX3N0ZG91dAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwoYW5hbHl6ZXIuc3VtbWFyeSgpLAorICAgICAgICAgICAgeydyZXZpZXdlZCc6IDIsICd1bnJl
dmlld2VkJzogMSwgJ2NvbnRyaWJ1dG9ycyc6IDYsICdjb250cmlidXRvcnNfd2l0aF9yZXZpZXdz
JzogMiwgJ2NvbnRyaWJ1dG9yc193aXRob3V0X3Jldmlld3MnOiA0fSkKKworICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKHNldChhbmFseXplci5jb250cmlidXRvcnNfc3RhdGlzdGljcygpLmtleXMo
KSksCisgICAgICAgICAgICBzZXQoWydTYW0gV2VpbmlnJywgdSdNYXJrIFJvd2UnLCB1J0tldmlu
IE9sbGl2aWVyJywgJ01hcnRpbiBSb2JpbnNvbicsIHUnUGhpbGlwcGUgTm9ybWFuZCcsIHUnWmFu
IERvYmVyc2VrJ10pKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW5hbHl6ZXIuY29udHJp
YnV0b3JzX3N0YXRpc3RpY3MoKVsnU2FtIFdlaW5pZyddLAorICAgICAgICAgICAgeydyZXZpZXdz
JzogeydmaWxlcyc6IHt1J2Zvby9wbGF0Zm9ybS9tYWMvV2ViQ29yZU5TU3RyaW5nRXh0cmFzLm1t
JzogMSwgdSdmb28vcGxhdGZvcm0vbmV0d29yay9jZi9Tb2NrZXRTdHJlYW1IYW5kbGVDRk5ldC5j
cHAnOiAxfSwKKyAgICAgICAgICAgICd0b3RhbCc6IDEsICdhcmVhcyc6IHsnTmV0d29yayc6IDF9
fSwgJ3BhdGNoZXMnOiB7J2ZpbGVzJzoge30sICdhcmVhcyc6IHt9LCAndW5yZXZpZXdlZCc6IDAs
ICdyZXZpZXdlZCc6IDB9fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbmFseXplci5jb250
cmlidXRvcnNfc3RhdGlzdGljcygpW3UnTWFyayBSb3dlJ10sCisgICAgICAgICAgICB7J3Jldmll
d3MnOiB7J2ZpbGVzJzoge30sICd0b3RhbCc6IDAsICdhcmVhcyc6IHt9fSwgJ3BhdGNoZXMnOiB7
J2ZpbGVzJzoge3UnZm9vL3BsYXRmb3JtL21hYy9XZWJDb3JlTlNTdHJpbmdFeHRyYXMubW0nOiAx
LAorICAgICAgICAgICAgdSdmb28vcGxhdGZvcm0vbmV0d29yay9jZi9Tb2NrZXRTdHJlYW1IYW5k
bGVDRk5ldC5jcHAnOiAxfSwgJ2FyZWFzJzogeydOZXR3b3JrJzogMX0sICd1bnJldmlld2VkJzog
MCwgJ3Jldmlld2VkJzogMX19KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFuYWx5emVyLmNv
bnRyaWJ1dG9yc19zdGF0aXN0aWNzKClbdSdLZXZpbiBPbGxpdmllciddLAorICAgICAgICAgICAg
eydyZXZpZXdzJzogeydmaWxlcyc6IHt9LCAndG90YWwnOiAwLCAnYXJlYXMnOiB7fX0sICdwYXRj
aGVzJzogeydmaWxlcyc6IHt1J2Zvby9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JDUFAu
cG0nOiAxfSwKKyAgICAgICAgICAgICAgICAnYXJlYXMnOiB7J0JpbmRpbmdzJzogMX0sICd1bnJl
dmlld2VkJzogMSwgJ3Jldmlld2VkJzogMH19KQorCisgICAgICAgIGZpbGVzX2Zvcl9hdWRpb19w
YXRjaCA9IHt1J2Zvby9HTlVtYWtlZmlsZS5hbSc6IDEsIHUnZm9vL0dOVW1ha2VmaWxlLmxpc3Qu
YW0nOiAxLCAnZm9vL3BsYXRmb3JtL2F1ZGlvL2dzdHJlYW1lci9BdWRpb0Rlc3RpbmF0aW9uR1N0
cmVhbWVyLmNwcCc6IDEsCisgICAgICAgICAgICAnZm9vL3BsYXRmb3JtL2F1ZGlvL2dzdHJlYW1l
ci9BdWRpb0Rlc3RpbmF0aW9uR1N0cmVhbWVyLmgnOiAxLCAnZm9vL3BsYXRmb3JtL2F1ZGlvL2dz
dHJlYW1lci9BdWRpb0ZpbGVSZWFkZXJHU3RyZWFtZXIuY3BwJzogMSwKKyAgICAgICAgICAgICdm
b28vcGxhdGZvcm0vYXVkaW8vZ3RrL0F1ZGlvQnVzR3RrLmNwcCc6IDF9CisgICAgICAgIGF1dGhv
cl9leHBlY3RhdGlvbl9mb3JfYXVkaW9fcGF0Y2ggPSB7J3Jldmlld3MnOiB7J2ZpbGVzJzoge30s
ICd0b3RhbCc6IDAsICdhcmVhcyc6IHt9fSwKKyAgICAgICAgICAgICdwYXRjaGVzJzogeydmaWxl
cyc6IGZpbGVzX2Zvcl9hdWRpb19wYXRjaCwgJ2FyZWFzJzogeydUaGUgV2ViS2l0R1RLKyBQb3J0
JzogMX0sICd1bnJldmlld2VkJzogMCwgJ3Jldmlld2VkJzogMX19CisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWwoYW5hbHl6ZXIuY29udHJpYnV0b3JzX3N0YXRpc3RpY3MoKVt1J01hcnRpbiBSb2Jp
bnNvbiddLAorICAgICAgICAgICAgeydyZXZpZXdzJzogeydmaWxlcyc6IGZpbGVzX2Zvcl9hdWRp
b19wYXRjaCwgJ3RvdGFsJzogMSwgJ2FyZWFzJzogeydUaGUgV2ViS2l0R1RLKyBQb3J0JzogMX19
LAorICAgICAgICAgICAgICAgICdwYXRjaGVzJzogeydmaWxlcyc6IHt9LCAnYXJlYXMnOiB7fSwg
J3VucmV2aWV3ZWQnOiAwLCAncmV2aWV3ZWQnOiAwfX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwoYW5hbHl6ZXIuY29udHJpYnV0b3JzX3N0YXRpc3RpY3MoKVt1J1BoaWxpcHBlIE5vcm1hbmQn
XSwgYXV0aG9yX2V4cGVjdGF0aW9uX2Zvcl9hdWRpb19wYXRjaCkKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbChhbmFseXplci5jb250cmlidXRvcnNfc3RhdGlzdGljcygpW3UnWmFuIERvYmVyc2Vr
J10sIGF1dGhvcl9leHBlY3RhdGlvbl9mb3JfYXVkaW9fcGF0Y2gpCisKKyAgICAgICAgYXJlYXNf
c3RhdGlzdGljcyA9IGFuYWx5emVyLmFyZWFzX3N0YXRpc3RpY3MoKQorICAgICAgICBhcmVhc193
aXRoX3BhdGNoZXMgPSBbYXJlYSBmb3IgYXJlYSBpbiBhcmVhc19zdGF0aXN0aWNzIGlmIGFyZWFz
X3N0YXRpc3RpY3NbYXJlYV1bJ3Jldmlld2VkJ10gb3IgYXJlYXNfc3RhdGlzdGljc1thcmVhXVsn
dW5yZXZpZXdlZCddXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChhcmVhc193aXRoX3Bh
dGNoZXMpLCBzZXQoWydCaW5kaW5ncycsICdOZXR3b3JrJywgJ1RoZSBXZWJLaXRHVEsrIFBvcnQn
XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJlYXNfc3RhdGlzdGljc1snQmluZGluZ3Mn
XSwgeyd1bnJldmlld2VkJzogMSwgJ3Jldmlld2VkJzogMCwgJ2NvbnRyaWJ1dG9ycyc6CisgICAg
ICAgICAgICB7dSdLZXZpbiBPbGxpdmllcic6IHsncmV2aWV3cyc6IDAsICd1bnJldmlld2VkJzog
MSwgJ3Jldmlld2VkJzogMH19fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmVhc19zdGF0
aXN0aWNzWydOZXR3b3JrJ10sIHsndW5yZXZpZXdlZCc6IDAsICdyZXZpZXdlZCc6IDEsICdjb250
cmlidXRvcnMnOgorICAgICAgICAgICAgeydTYW0gV2VpbmlnJzogeydyZXZpZXdzJzogMSwgJ3Vu
cmV2aWV3ZWQnOiAwLCAncmV2aWV3ZWQnOiAwfSwgdSdNYXJrIFJvd2UnOiB7J3Jldmlld3MnOiAw
LCAndW5yZXZpZXdlZCc6IDAsICdyZXZpZXdlZCc6IDF9fX0pCkluZGV4OiBUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvZGF0YS9zdW1tYXJ5Lmh0bWwKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2RhdGEvc3VtbWFyeS5odG1sCShy
ZXZpc2lvbiAwKQorKysgVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2RhdGEv
c3VtbWFyeS5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ1NSBAQAorPCFET0NUWVBFIGh0
bWw+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkNoYW5nZUxvZyBBbmFseXNpczwvdGl0bGU+Cis8
c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorCitib2R5IHsKKyAgICBmb250LWZhbWlseTogJ0hlbHZl
dGljYScgJ1NlZ29lIFVJIExpZ2h0JyBzYW5zLXNlcmlmOworICAgIGZvbnQtd2VpZ2h0OiAyMDA7
CisgICAgcGFkZGluZzogMjBweDsKKyAgICBtaW4td2lkdGg6IDEyMDBweDsKK30KKworKiB7Cisg
ICAgcGFkZGluZzogMHB4OworICAgIG1hcmdpbjogMHB4OworICAgIGJvcmRlcjogMHB4OworfQor
CitoMSwgaDIsIGgzIHsKKyAgICBmb250LXdlaWdodDogMjAwOworfQorCitoMSB7CisgICAgbWFy
Z2luOiAwIDAgMWVtIDA7Cit9CisKK2gyIHsKKyAgICBmb250LXNpemU6IDEuMmVtOworICAgIHRl
eHQtYWxpZ246IGNlbnRlcjsKKyAgICBtYXJnaW4tYm90dG9tOiAxZW07Cit9CisKK2gzIHsKKyAg
ICBmb250LXNpemU6IDFlbTsKK30KKworLnZpZXcgeworICAgIG1hcmdpbjogMHB4OworICAgIHdp
ZHRoOiA2MDBweDsKKyAgICBmbG9hdDogbGVmdDsKK30KKworLmdyYXBoLWNvbnRhaW5lciBwIHsK
KyAgICB3aWR0aDogMjAwcHg7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgbWFyZ2luOiAy
MHB4IDAgMjBweCAwOworICAgIHBhZGRpbmc6IDVweDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlk
IDFweCBibGFjazsKK30KKworLmdyYXBoLWNvbnRhaW5lciB0YWJsZSB7CisgICAgd2lkdGg6IDEw
MCU7Cit9CisKKy5ncmFwaC1jb250YWluZXIgdGFibGUsIC5ncmFwaC1jb250YWluZXIgdGQgewor
ICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgICAgYm9yZGVyOiBub25lOworfQorCisu
Z3JhcGgtY29udGFpbmVyIHRkIHsKKyAgICBwYWRkaW5nOiA1cHg7CisgICAgdmVydGljYWwtYWxp
Z246IGNlbnRlcjsKK30KKworLmdyYXBoLWNvbnRhaW5lciB0ZDpmaXJzdC1jaGlsZCB7CisgICAg
d2lkdGg6IDIwMHB4OworICAgIHRleHQtYWxpZ246IHJpZ2h0OworICAgIGJvcmRlci1yaWdodDog
c29saWQgMXB4IGJsYWNrOworfQorCisuZ3JhcGgtY29udGFpbmVyIC5zZWxlY3RlZCB7CisgICAg
YmFja2dyb3VuZDogI2VlZTsKK30KKworI3Jldmlld2VycyAuc2VsZWN0ZWQgdGQ6Zmlyc3QtY2hp
bGQgeworICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMHB4IDBweCAxMHB4OworfQorCisjYXJlYXMg
LnNlbGVjdGVkIHRkOmxhc3QtY2hpbGQgeworICAgIGJvcmRlci1yYWRpdXM6IDBweCAxMHB4IDEw
cHggMHB4OworfQorCisuZ3JhcGgtY29udGFpbmVyIC5iYXIgeworICAgIGRpc3BsYXk6IGlubGlu
ZS1ibG9jazsKKyAgICBtaW4taGVpZ2h0OiAxZW07CisgICAgYmFja2dyb3VuZDogIzlmNjsKKyAg
ICBtYXJnaW4tcmlnaHQ6IDAuNGV4OworfQorCisuZ3JhcGgtY29udGFpbmVyIC5yZXZpZXdlZC1w
YXRjaGVzIHsKKyAgICBiYWNrZ3JvdW5kOiAjM2NmOworICAgIG1hcmdpbi1yaWdodDogMXB4Owor
fQorCisuZ3JhcGgtY29udGFpbmVyIC51bnJldmlld2VkLXBhdGNoZXMgeworICAgIGJhY2tncm91
bmQ6ICNmOTk7Cit9CisKKy5jb25zdHJhaW5lZCB7CisgICAgYmFja2dyb3VuZDogI2VlZTsKKyAg
ICBib3JkZXItcmFkaXVzOiAxMHB4OworfQorCisuY29uc3RyYWluZWQgLnZlcnRpY2FsLWJhciB7
CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggI2VlZTsKK30KKworI2hlYWRlciB7CisgICAg
Ym9yZGVyLXNwYWNpbmc6IDVweDsKK30KKworI2hlYWRlciBzZWN0aW9uIHsKKyAgICBkaXNwbGF5
OiB0YWJsZS1jZWxsOworICAgIHdpZHRoOiAyMDBweDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9w
OworICAgIGJvcmRlcjogc29saWQgMnB4ICNjY2M7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xs
YXBzZTsKKyAgICBwYWRkaW5nOiA1cHg7CisgICAgZm9udC1zaXplOiAwLjhlbTsKK30KKworI2hl
YWRlciBkdCB7CisgICAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNoZWFkZXIgZHQ6YWZ0ZXIgeworICAg
IGNvbnRlbnQ6ICc6ICc7Cit9CisKKyNoZWFkZXIgLmxlZ2VuZCB7CisgICAgd2lkdGg6IDYwMHB4
OworfQorCisubGVnZW5kIC5iYXIgeworICAgIHdpZHRoOiAxNWV4OworICAgIHBhZGRpbmc6IDJw
eDsKK30KKworLmxlZ2VuZCAucmV2aWV3cyB7CisgICAgd2lkdGg6IDI1ZXg7Cit9CisKKy5sZWdl
bmQgdGQ6Zmlyc3QtY2hpbGQgeworICAgIHdpZHRoOiAxOGV4OworfQorCis8L3N0eWxlPgorPC9o
ZWFkPgorPGJvZHk+Cis8aDE+Q2hhbmdlTG9nIEFuYWx5c2lzPC9oMT4KKworPHNlY3Rpb24gaWQ9
ImhlYWRlciI+Cis8c2VjdGlvbiBpZD0ic3VtbWFyeSI+Cis8aDI+U3VtbWFyeTwvaDI+Cis8L3Nl
Y3Rpb24+CisKKzxzZWN0aW9uIGNsYXNzPSJsZWdlbmQiPgorPGgyPkxlZ2VuZDwvaDI+Cis8ZGl2
IGNsYXNzPSJncmFwaC1jb250YWluZXIiPgorPHRhYmxlPgorPHRib2R5PgorPHRyPjx0ZD5Db250
cmlidXRvcidzIG5hbWU8L3RkPgorPHRkPjxzcGFuIGNsYXNzPSJiYXIgcmV2aWV3cyI+UmV2aWV3
czwvc3Bhbj4gPHNwYW4gY2xhc3M9InZhbHVlLWNvbnRhaW5lciI+KCMgb2YgcmV2aWV3cyk8L3Nw
YW4+PGJyPgorPHNwYW4gY2xhc3M9ImJhciByZXZpZXdlZC1wYXRjaGVzIj5SZXZpZXdlZDwvc3Bh
bj48c3BhbiBjbGFzcz0iYmFyIHVucmV2aWV3ZWQtcGF0Y2hlcyI+VW5yZXZpZXdlZDwvc3Bhbj4K
KzxzcGFuIGNsYXNzPSJ2YWx1ZS1jb250YWluZXIiPigjIG9mIHJldmlld2VkKTooIyBvZiB1bnJl
dmlld2VkKTwvc3Bhbj48L3RkPjwvdHI+Cis8L3Rib2R5PgorPC90YWJsZT4KKzwvZGl2PgorPC9z
ZWN0aW9uPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBpZD0iY29udHJpYnV0b3JzIiBjbGFzcz0i
dmlldyI+Cis8aDIgaWQ9ImNvbnRyaWJ1dG9ycy10aXRsZSI+Q29udHJpYnV0b3JzPC9oMj4KKzxk
aXYgY2xhc3M9ImdyYXBoLWNvbnRhaW5lciI+PC9kaXY+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9u
IGlkPSJhcmVhcyIgY2xhc3M9InZpZXciPgorPGgyIGlkPSJhcmVhcy10aXRsZSI+QXJlYXMgb2Yg
Y29udHJpYnV0aW9uczwvaDI+Cis8ZGl2IGNsYXNzPSJncmFwaC1jb250YWluZXIiPjwvZGl2Pgor
PC9zZWN0aW9uPgorCis8c2NyaXB0PgorCisvLyBOYWl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBlbGVt
ZW50IGV4dGVuc2lvbnMgZGlzY3Vzc2VkIG9uIHB1YmxpYy13ZWJhcHBzCisKK2lmICghRWxlbWVu
dC5wcm90b3R5cGUuYXBwZW5kKSB7CisgICAgRWxlbWVudC5wcm90b3R5cGUuYXBwZW5kID0gZnVu
Y3Rpb24gKCkgeworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7
IGkrKykgeworICAgICAgICAgICAgLy8gRklYTUU6IFRha2UgY2FyZSBvZiBvdGhlciBub2RlIHR5
cGVzCisgICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldIGluc3RhbmNlb2YgRWxlbWVudCB8fCBh
cmd1bWVudHNbaV0gaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKQorICAgICAgICAgICAgICAgIHRo
aXMuYXBwZW5kQ2hpbGQoYXJndW1lbnRzW2ldKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGFyZ3VtZW50
c1tpXSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KKworaWYg
KCFOb2RlLnByb3RvdHlwZS5yZW1vdmUpIHsKKyAgICBOb2RlLnByb3RvdHlwZS5yZW1vdmUgPSBm
dW5jdGlvbiAoKSB7CisgICAgICAgIHRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKTsK
KyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQorCitpZiAoIUVsZW1lbnQuY3JlYXRlKSB7
CisgICAgRWxlbWVudC5jcmVhdGUgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmIChhcmd1bWVu
dHMubGVuZ3RoIDwgMSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB2YXIgZWxl
bWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYXJndW1lbnRzWzBdKTsKKyAgICAgICAgaWYg
KGFyZ3VtZW50cy5sZW5ndGggPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50OworCisg
ICAgICAgIC8vIEZJWE1FOiB0aGUgc2Vjb25kIGFyZ3VtZW50IGNhbiBiZSBjb250ZW50IG9yIElE
TCBhdHRyaWJ1dGVzCisgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gYXJndW1lbnRzWzFdOworICAg
ICAgICBmb3IgKGF0dHJpYnV0ZSBpbiBhdHRyaWJ1dGVzKQorICAgICAgICAgICAgZWxlbWVudC5z
ZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV0pOworCisgICAgICAg
IGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpCisgICAgICAgICAgICBlbGVtZW50LmFwcGVuZC5h
cHBseShlbGVtZW50LCBhcmd1bWVudHNbMl0pOworCisgICAgICAgIHJldHVybiBlbGVtZW50Owor
ICAgIH0KK30KKworaWYgKCFOb2RlLnByb3RvdHlwZS5yZW1vdmVBbGxDaGlsZHJlbikgeworICAg
IE5vZGUucHJvdG90eXBlLnJlbW92ZUFsbENoaWxkcmVuID0gZnVuY3Rpb24gKCkgeworICAgICAg
ICB3aGlsZSAodGhpcy5maXJzdENoaWxkKQorICAgICAgICAgICAgdGhpcy5maXJzdENoaWxkLnJl
bW92ZSgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CisKK0VsZW1lbnQucHJvdG90
eXBlLnJlbW92ZUNsYXNzTmFtZUZyb21BbGxFbGVtZW50cyA9IGZ1bmN0aW9uIChjbGFzc05hbWUp
IHsKKyAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NO
YW1lKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQorICAg
ICAgICBlbGVtZW50c1tpXS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7Cit9CisKK2Z1bmN0
aW9uIGdldEpTT04odXJsLCBjYWxsYmFjaykgeworICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJl
cXVlc3QoKTsKKyAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTsKKyAgICB4aHIub25yZWFk
eXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRl
ID09IDQpCisgICAgICAgICAgICBjYWxsYmFjayhKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQp
KTsKKyAgICB9CisgICAgeGhyLnNlbmQoKTsKK30KKworZnVuY3Rpb24gR3JhcGhWaWV3KGNvbnRh
aW5lcikgeworICAgIHRoaXMuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICB0aGlzLl9kZWZh
dWx0RGF0YSA9IG51bGw7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5cGUuc2V0RGF0YSA9IGZ1bmN0
aW9uKGRhdGEsIGNvbnN0cmFpbmVkKSB7CisgICAgaWYgKGNvbnN0cmFpbmVkKQorICAgICAgICB0
aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29uc3RyYWluZWQnKTsKKyAgICBlbHNlCisg
ICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdjb25zdHJhaW5lZCcpOwor
ICAgIHRoaXMuX2NsZWFyR3JhcGgoKTsKKyAgICB0aGlzLl9jb25zdHJ1Y3RHcmFwaChkYXRhKTsK
K30KKworR3JhcGhWaWV3LnByb3RvdHlwZS5zZXREZWZhdWx0RGF0YSA9IGZ1bmN0aW9uKGRhdGEp
IHsKKyAgICB0aGlzLl9kZWZhdWx0RGF0YSA9IGRhdGE7CisgICAgdGhpcy5zZXREYXRhKGRhdGEp
OworfQorCitHcmFwaFZpZXcucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkgeworICAgIHRo
aXMuc2V0TWFyZ2luVG9wKCk7CisgICAgdGhpcy5zZXREYXRhKHRoaXMuX2RlZmF1bHREYXRhKTsK
K30KKworR3JhcGhWaWV3LnByb3RvdHlwZS5pc0NvbnN0cmFpbmVkID0gZnVuY3Rpb24gKCkgeyBy
ZXR1cm4gdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnY29uc3RyYWluZWQnKTsg
fQorCitHcmFwaFZpZXcucHJvdG90eXBlLnRhcmdldFJvdyA9IGZ1bmN0aW9uIChub2RlKSB7Cisg
ICAgdmFyIHRhcmdldCA9IG51bGw7CisKKyAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9IHRoaXMu
X2NvbnRhaW5lcikgeworICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT0gJ3RyJykKKyAgICAg
ICAgICAgIHRhcmdldCA9IG5vZGU7CisgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7Cisg
ICAgfQorCisgICAgcmV0dXJuIG5vZGUgJiYgdGFyZ2V0OworfQorCitHcmFwaFZpZXcucHJvdG90
eXBlLnNlbGVjdFJvdyA9IGZ1bmN0aW9uIChyb3cpIHsKKyAgICB0aGlzLl9jb250YWluZXIucmVt
b3ZlQ2xhc3NOYW1lRnJvbUFsbEVsZW1lbnRzKCdzZWxlY3RlZCcpOworICAgIHJvdy5jbGFzc0xp
c3QuYWRkKCdzZWxlY3RlZCcpOworfQorCitHcmFwaFZpZXcucHJvdG90eXBlLnNldE1hcmdpblRv
cCA9IGZ1bmN0aW9uICh5KSB7IHRoaXMuX2NvbnRhaW5lci5zdHlsZS5tYXJnaW5Ub3AgPSB5ID8g
eSArICdweCcgOiBudWxsOyB9CitHcmFwaFZpZXcucHJvdG90eXBlLl9ncmFwaENvbnRhaW5lciA9
IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NO
YW1lKCdncmFwaC1jb250YWluZXInKVswXTsgfQorR3JhcGhWaWV3LnByb3RvdHlwZS5fY2xlYXJH
cmFwaCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2dyYXBoQ29udGFpbmVyKCkucmVtb3Zl
QWxsQ2hpbGRyZW4oKTsgfQorCitHcmFwaFZpZXcucHJvdG90eXBlLl9udW1iZXJPZlBhdGNoZXMg
PSBmdW5jdGlvbiAoZGF0YUl0ZW0pIHsKKyAgICByZXR1cm4gZGF0YUl0ZW0ubnVtYmVyT2ZSZXZp
ZXdlZFBhdGNoZXMgKyAoZGF0YUl0ZW0ubnVtYmVyT2ZVbnJldmlld2VkUGF0Y2hlcyAhPT0gdW5k
ZWZpbmVkID8gZGF0YUl0ZW0ubnVtYmVyT2ZVbnJldmlld2VkUGF0Y2hlcyA6IDApOworfQorCitH
cmFwaFZpZXcucHJvdG90eXBlLl9tYXhpbXVtVmFsdWUgPSBmdW5jdGlvbiAobGFiZWxzLCBkYXRh
KSB7CisgICAgdmFyIG51bWJlck9mUGF0Y2hlcyA9IHRoaXMuX251bWJlck9mUGF0Y2hlczsKKyAg
ICByZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCwgbGFiZWxzLm1hcChmdW5jdGlvbiAobGFiZWwp
IHsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KG51bWJlck9mUGF0Y2hlcyhkYXRhW2xhYmVsXSks
IGRhdGFbbGFiZWxdLm51bWJlck9mUmV2aWV3cyAhPT0gdW5kZWZpbmVkID8gZGF0YVtsYWJlbF0u
bnVtYmVyT2ZSZXZpZXdzIDogMCk7CisgICAgfSkpOworfQorCitHcmFwaFZpZXcucHJvdG90eXBl
Ll9zb3J0TGFiZWxzQnlOdW1iZXJPZlJldml3c0FuZFJldmlld2VkUGF0Y2hlcyA9IGZ1bmN0aW9u
KGRhdGEpIHsKKyAgICB2YXIgbGFiZWxzID0gT2JqZWN0LmtleXMoZGF0YSk7CisgICAgaWYgKCFs
YWJlbHMubGVuZ3RoKQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB2YXIgbnVtYmVyT2ZQYXRj
aGVzID0gdGhpcy5fbnVtYmVyT2ZQYXRjaGVzOworICAgIHZhciBjb21wdXRlVmFsdWUgPSBmdW5j
dGlvbiAoZGF0YUl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIG51bWJlck9mUGF0Y2hlcyhkYXRhSXRl
bSkgKyAoZGF0YUl0ZW0ubnVtYmVyT2ZSZXZpZXdzICE9PSB1bmRlZmluZWQgPyBkYXRhSXRlbS5u
dW1iZXJPZlJldmlld3MgOiAwKTsKKyAgICB9CisgICAgbGFiZWxzLnNvcnQoZnVuY3Rpb24gKGEs
IGIpIHsgcmV0dXJuIGNvbXB1dGVWYWx1ZShkYXRhW2JdKSAtIGNvbXB1dGVWYWx1ZShkYXRhW2Fd
KTsgfSk7CisgICAgcmV0dXJuIGxhYmVsczsKK30KKworR3JhcGhWaWV3LnByb3RvdHlwZS5fY29u
c3RydWN0R3JhcGggPSBmdW5jdGlvbiAoZGF0YSkgeworICAgIHZhciBlbGVtZW50ID0gdGhpcy5f
Z3JhcGhDb250YWluZXIoKTsKKyAgICB2YXIgbGFiZWxzID0gdGhpcy5fc29ydExhYmVsc0J5TnVt
YmVyT2ZSZXZpd3NBbmRSZXZpZXdlZFBhdGNoZXMoZGF0YSk7CisgICAgaWYgKCFsYWJlbHMpIHsK
KyAgICAgICAgZWxlbWVudC5hcHBlbmQoRWxlbWVudC5jcmVhdGUoJ3AnLCB7fSwgWydOb25lJ10p
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciBtYXhWYWx1ZSA9IHRoaXMuX21h
eGltdW1WYWx1ZShsYWJlbHMsIGRhdGEpOworICAgIHZhciBjb21wdXRlU3R5bGVGb3JCYXIgPSBm
dW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuICd3aWR0aDonICsgKHZhbHVlICogODUuMCAvIG1heFZh
bHVlKSArICclJyB9CisKKyAgICB2YXIgdGFibGUgPSBFbGVtZW50LmNyZWF0ZSgndGFibGUnLCB7
fSwgW0VsZW1lbnQuY3JlYXRlKCd0Ym9keScpXSk7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBs
YWJlbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGxhYmVsID0gbGFiZWxzW2ldOworICAg
ICAgICB2YXIgaXRlbSA9IGRhdGFbbGFiZWxdOworICAgICAgICB2YXIgcm93ID0gRWxlbWVudC5j
cmVhdGUoJ3RyJywge30sIFtFbGVtZW50LmNyZWF0ZSgndGQnLCB7fSwgW2xhYmVsXSksIEVsZW1l
bnQuY3JlYXRlKCd0ZCcsIHt9KV0pOworICAgICAgICB2YXIgdmFsdWVDZWxsID0gcm93Lmxhc3RD
aGlsZDsKKworICAgICAgICBpZiAoaXRlbS5udW1iZXJPZlJldmlld3MgIT0gdW5kZWZpbmVkKSB7
CisgICAgICAgICAgICB2YWx1ZUNlbGwuYXBwZW5kKAorICAgICAgICAgICAgICAgIEVsZW1lbnQu
Y3JlYXRlKCdzcGFuJywgeydjbGFzcyc6ICdiYXIgcmV2aWV3cycsICdzdHlsZSc6IGNvbXB1dGVT
dHlsZUZvckJhcihpdGVtLm51bWJlck9mUmV2aWV3cykgfSksCisgICAgICAgICAgICAgICAgRWxl
bWVudC5jcmVhdGUoJ3NwYW4nLCB7J2NsYXNzJzogJ3ZhbHVlLWNvbnRhaW5lcid9LCBbaXRlbS5u
dW1iZXJPZlJldmlld3NdKSwKKyAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZSgnYnInKQor
ICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlQ2VsbC5hcHBlbmQoRWxl
bWVudC5jcmVhdGUoJ3NwYW4nLCB7J2NsYXNzJzogJ2JhciByZXZpZXdlZC1wYXRjaGVzJywgJ3N0
eWxlJzogY29tcHV0ZVN0eWxlRm9yQmFyKGl0ZW0ubnVtYmVyT2ZSZXZpZXdlZFBhdGNoZXMpIH0p
KTsKKyAgICAgICAgaWYgKGl0ZW0ubnVtYmVyT2ZVbnJldmlld2VkUGF0Y2hlcyAhPT0gdW5kZWZp
bmVkKQorICAgICAgICAgICAgdmFsdWVDZWxsLmFwcGVuZChFbGVtZW50LmNyZWF0ZSgnc3Bhbics
IHsnY2xhc3MnOiAnYmFyIHVucmV2aWV3ZWQtcGF0Y2hlcycsICdzdHlsZSc6IGNvbXB1dGVTdHls
ZUZvckJhcihpdGVtLm51bWJlck9mVW5yZXZpZXdlZFBhdGNoZXMpIH0pKTsKKworICAgICAgICB2
YWx1ZUNlbGwuYXBwZW5kKEVsZW1lbnQuY3JlYXRlKCdzcGFuJywgeydjbGFzcyc6ICd2YWx1ZS1j
b250YWluZXInfSwKKyAgICAgICAgICAgIFtpdGVtLm51bWJlck9mUmV2aWV3ZWRQYXRjaGVzICsg
KGl0ZW0ubnVtYmVyT2ZVbnJldmlld2VkUGF0Y2hlcyAhPT0gdW5kZWZpbmVkID8gJzonICsgaXRl
bS5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzIDogJycpXSkpOworCisgICAgICAgIHRhYmxlLmZp
cnN0Q2hpbGQuYXBwZW5kKHJvdyk7CisgICAgICAgIHJvdy5sYWJlbCA9IGxhYmVsOworICAgICAg
ICByb3cuZGF0YSA9IGl0ZW07CisgICAgfQorICAgIGVsZW1lbnQuYXBwZW5kKHRhYmxlKTsKK30K
KwordmFyIGNvbnRyaWJ1dG9yc1ZpZXcgPSBuZXcgR3JhcGhWaWV3KGRvY3VtZW50LnF1ZXJ5U2Vs
ZWN0b3IoJyNjb250cmlidXRvcnMnKSk7Cit2YXIgYXJlYXNWaWV3ID0gbmV3IEdyYXBoVmlldyhk
b2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXJlYXMnKSk7CisKK2dldEpTT04oJ3N1bW1hcnkuanNv
bicsCisgICAgZnVuY3Rpb24gKHN1bW1hcnkpIHsKKyAgICAgICAgdmFyIHN1bW1hcnlDb250YWlu
ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3VtbWFyeScpOworICAgICAgICBzdW1tYXJ5
Q29udGFpbmVyLmFwcGVuZChFbGVtZW50LmNyZWF0ZSgnZGwnLCB7fSwgWworICAgICAgICAgICAg
RWxlbWVudC5jcmVhdGUoJ2R0Jywge30sIFsnVG90YWwgZW50cmllcyAocmV2aWV3ZWQpJ10pLAor
ICAgICAgICAgICAgRWxlbWVudC5jcmVhdGUoJ2RkJywge30sIFsoc3VtbWFyeVsncmV2aWV3ZWQn
XSArIHN1bW1hcnlbJ3VucmV2aWV3ZWQnXSkgKyAnICgnICsgc3VtbWFyeVsncmV2aWV3ZWQnXSAr
ICcpJ10pLAorICAgICAgICAgICAgRWxlbWVudC5jcmVhdGUoJ2R0Jywge30sIFsnVG90YWwgY29u
dHJpYnV0b3JzJ10pLAorICAgICAgICAgICAgRWxlbWVudC5jcmVhdGUoJ2RkJywge30sIFtzdW1t
YXJ5Wydjb250cmlidXRvcnMnXV0pLAorICAgICAgICAgICAgRWxlbWVudC5jcmVhdGUoJ2R0Jywg
e30sIFsnQ29udHJpYnV0b3JzIHdobyByZXZpZXdlZCddKSwKKyAgICAgICAgICAgIEVsZW1lbnQu
Y3JlYXRlKCdkZCcsIHt9LCBbc3VtbWFyeVsnY29udHJpYnV0b3JzX3dpdGhfcmV2aWV3cyddXSks
CisgICAgICAgIF0pKTsKKyAgICB9KTsKKworZ2V0SlNPTignY29udHJpYnV0b3JzLmpzb24nLAor
ICAgIGZ1bmN0aW9uIChjb250cmlidXRvcnMpIHsKKyAgICAgICAgZm9yICh2YXIgY29udHJpYnV0
b3IgaW4gY29udHJpYnV0b3JzKSB7CisgICAgICAgICAgICBjb250cmlidXRvciA9IGNvbnRyaWJ1
dG9yc1tjb250cmlidXRvcl07CisgICAgICAgICAgICBjb250cmlidXRvci5udW1iZXJPZlJldmll
d3MgPSBjb250cmlidXRvci5yZXZpZXdzID8gY29udHJpYnV0b3IucmV2aWV3cy50b3RhbCA6IDA7
CisgICAgICAgICAgICBjb250cmlidXRvci5udW1iZXJPZlJldmlld2VkUGF0Y2hlcyA9IGNvbnRy
aWJ1dG9yLnBhdGNoZXMgPyBjb250cmlidXRvci5wYXRjaGVzLnJldmlld2VkIDogMDsKKyAgICAg
ICAgICAgIGNvbnRyaWJ1dG9yLm51bWJlck9mVW5yZXZpZXdlZFBhdGNoZXMgPSBjb250cmlidXRv
ci5wYXRjaGVzID8gY29udHJpYnV0b3IucGF0Y2hlcy51bnJldmlld2VkIDogMDsKKyAgICAgICAg
fQorICAgICAgICBjb250cmlidXRvcnNWaWV3LnNldERlZmF1bHREYXRhKGNvbnRyaWJ1dG9ycyk7
CisgICAgfSk7CisKK2dldEpTT04oJ2FyZWFzLmpzb24nLAorICAgIGZ1bmN0aW9uIChhcmVhcykg
eworICAgICAgICBmb3IgKHZhciBhcmVhIGluIGFyZWFzKSB7CisgICAgICAgICAgICBhcmVhc1th
cmVhXS5udW1iZXJPZlJldmlld2VkUGF0Y2hlcyA9IGFyZWFzW2FyZWFdLnJldmlld2VkOworICAg
ICAgICAgICAgYXJlYXNbYXJlYV0ubnVtYmVyT2ZVbnJldmlld2VkUGF0Y2hlcyA9IGFyZWFzW2Fy
ZWFdLnVucmV2aWV3ZWQ7CisgICAgICAgIH0KKyAgICAgICAgYXJlYXNWaWV3LnNldERlZmF1bHRE
YXRhKGFyZWFzKTsKKyAgICB9KTsKKworZnVuY3Rpb24gY29udHJpYnV0b3JBcmVhcyhjb250cmli
dXRvckRhdGEpIHsKKyAgICB2YXIgYXJlYXMgPSBuZXcgT2JqZWN0OworICAgIGZvciAodmFyIGFy
ZWEgaW4gY29udHJpYnV0b3JEYXRhLnJldmlld3MuYXJlYXMpIHsKKyAgICAgICAgaWYgKCFhcmVh
c1thcmVhXSkKKyAgICAgICAgICAgIGFyZWFzW2FyZWFdID0geydudW1iZXJPZlJldmlld2VkUGF0
Y2hlcyc6IDB9OworICAgICAgICBhcmVhc1thcmVhXS5udW1iZXJPZlJldmlld3MgPSBjb250cmli
dXRvckRhdGEucmV2aWV3cy5hcmVhc1thcmVhXTsKKyAgICB9CisgICAgZm9yICh2YXIgYXJlYSBp
biBjb250cmlidXRvckRhdGEucGF0Y2hlcy5hcmVhcykgeworICAgICAgICBpZiAoIWFyZWFzW2Fy
ZWFdKQorICAgICAgICAgICAgYXJlYXNbYXJlYV0gPSB7J251bWJlck9mUmV2aWV3cyc6IDB9Owor
ICAgICAgICBhcmVhc1thcmVhXS5udW1iZXJPZlJldmlld2VkUGF0Y2hlcyA9IGNvbnRyaWJ1dG9y
RGF0YS5wYXRjaGVzLmFyZWFzW2FyZWFdOworICAgIH0KKyAgICByZXR1cm4gYXJlYXM7Cit9CisK
K2Z1bmN0aW9uIGFyZWFDb250cmlidXRvcnMoYXJlYURhdGEpIHsKKyAgICB2YXIgY29udHJpYnV0
b3JzID0gYXJlYURhdGFbJ2NvbnRyaWJ1dG9ycyddOworICAgIGZvciAodmFyIGNvbnRyaWJ1dG9y
IGluIGNvbnRyaWJ1dG9ycykgeworICAgICAgICBjb250cmlidXRvciA9IGNvbnRyaWJ1dG9yc1tj
b250cmlidXRvcl07CisgICAgICAgIGNvbnRyaWJ1dG9yLm51bWJlck9mUmV2aWV3cyA9IGNvbnRy
aWJ1dG9yLnJldmlld3M7CisgICAgICAgIGNvbnRyaWJ1dG9yLm51bWJlck9mUmV2aWV3ZWRQYXRj
aGVzID0gY29udHJpYnV0b3IucmV2aWV3ZWQ7CisgICAgICAgIGNvbnRyaWJ1dG9yLm51bWJlck9m
VW5yZXZpZXdlZFBhdGNoZXMgPSBjb250cmlidXRvci51bnJldmlld2VkOworICAgIH0KKyAgICBy
ZXR1cm4gY29udHJpYnV0b3JzOworfQorCit2YXIgbW91c2VUaW1lciA9IDA7Cit3aW5kb3cub25t
b3VzZW92ZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICBjbGVhclRpbWVvdXQobW91c2VUaW1l
cik7CisKKyAgICB2YXIgcm93ID0gY29udHJpYnV0b3JzVmlldy50YXJnZXRSb3coZXZlbnQudGFy
Z2V0KTsKKyAgICBpZiAocm93KSB7CisgICAgICAgIGlmICghY29udHJpYnV0b3JzVmlldy5pc0Nv
bnN0cmFpbmVkKCkpIHsKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yc1ZpZXcuc2VsZWN0Um93KHJv
dyk7CisgICAgICAgICAgICBhcmVhc1ZpZXcuc2V0TWFyZ2luVG9wKHJvdy5maXJzdENoaWxkLm9m
ZnNldFRvcCk7CisgICAgICAgICAgICBhcmVhc1ZpZXcuc2V0RGF0YShjb250cmlidXRvckFyZWFz
KHJvdy5kYXRhKSwgJ2NvbnN0cmFpbmVkJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIHJvdyA9IGFyZWFzVmlldy50YXJnZXRSb3coZXZlbnQudGFyZ2V0KTsKKyAg
ICBpZiAocm93KSB7CisgICAgICAgIGlmICghYXJlYXNWaWV3LmlzQ29uc3RyYWluZWQoKSkgewor
ICAgICAgICAgICAgYXJlYXNWaWV3LnNlbGVjdFJvdyhyb3cpOworICAgICAgICAgICAgY29udHJp
YnV0b3JzVmlldy5zZXRNYXJnaW5Ub3Aocm93LmZpcnN0Q2hpbGQub2Zmc2V0VG9wKTsKKyAgICAg
ICAgICAgIGNvbnRyaWJ1dG9yc1ZpZXcuc2V0RGF0YShhcmVhQ29udHJpYnV0b3JzKHJvdy5kYXRh
KSwgJ2NvbnN0cmFpbmVkJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIG1vdXNlVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgY29udHJp
YnV0b3JzVmlldy5yZXNldCgpOworICAgICAgICBhcmVhc1ZpZXcucmVzZXQoKTsKKyAgICB9LCA1
MDApOworfQorCis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdG9vbC9zdGVwcy9vcHRpb25zLnB5Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdG9vbC9zdGVwcy9vcHRpb25zLnB5CShyZXZpc2lvbiAxMDE1NjEpCisr
KyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvc3RlcHMvb3B0aW9ucy5weQkod29ya2luZyBj
b3B5KQpAQCAtNTgsMyArNTgsNCBAQCBjbGFzcyBPcHRpb25zKG9iamVjdCk6CiAgICAgc3VnZ2Vz
dF9yZXZpZXdlcnMgPSBtYWtlX29wdGlvbigiLS1zdWdnZXN0LXJldmlld2VycyIsIGFjdGlvbj0i
c3RvcmVfdHJ1ZSIsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9Ik9mZmVyIHRvIENDIGFwcHJvcHJpYXRl
IHJldmlld2Vycy4iKQogICAgIHRlc3QgPSBtYWtlX29wdGlvbigiLS10ZXN0IiwgYWN0aW9uPSJz
dG9yZV90cnVlIiwgZGVzdD0idGVzdCIsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9IlJ1biBydW4td2Vi
a2l0LXRlc3RzIGJlZm9yZSBjb21taXR0aW5nLiIpCiAgICAgdXBkYXRlID0gbWFrZV9vcHRpb24o
Ii0tbm8tdXBkYXRlIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InVwZGF0ZSIsIGRlZmF1
bHQ9VHJ1ZSwgaGVscD0iRG9uJ3QgdXBkYXRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4iKQorICAg
IGNoYW5nZWxvZ19jb3VudCA9IG1ha2Vfb3B0aW9uKCItLWNoYW5nZWxvZy1jb3VudCIsIGFjdGlv
bj0ic3RvcmUiLCB0eXBlPSJpbnQiLCBkZXN0PSJjaGFuZ2Vsb2dfY291bnQiLCBoZWxwPSJOdW1i
ZXIgb2YgY2hhbmdlbG9ncyB0byBwYXJzZS4iKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117741</attachid>
            <date>2011-12-02 22:05:38 -0800</date>
            <delta_ts>2011-12-08 11:39:26 -0800</delta_ts>
            <desc>Fixed per Eric&apos;s review</desc>
            <filename>bug-72243-20111202220536.patch</filename>
            <type>text/plain</type>
            <size>39457</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDEwMTkwMSkKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDI2IEBACisyMDExLTEyLTAyICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgor
CisgICAgICAgIEFkZCBhIHRvb2wgdG8gYW5hbHl6ZSBjaGFuZ2UgbG9ncworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzIyNDMKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgdGhlIGluaXRpYWwgaW1wbGVt
ZW50YXRpb24gb2YgYW5hbHl6ZS1jaGFuZ2Vsb2cgY29tbWFuZC4gVGhpcyB2ZXJzaW9uIHN1cHBv
cnRzIHBhcnNpbmcgbXVsdGlwbGUgY2hhbmdlbG9ncworICAgICAgICBpbiBhIHNpbmdsZSBkaXJl
Y3RvcnkgYW5kIHN1bW1hcml6ZXMgdGhlIHJlc3VsdCBpbiBqc29uIGZpbGVzLiBJdCBhbHNvIGNv
cGllcyBzdW1tYXJ5Lmh0bWwgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgICAgZm9yIHZp
c3VhbGl6aW5nIGpzb24gZmlsZXMuCisKKyAgICAgICAgVXNhZ2U6IHdlYmtpdC1wYXRjaCBhbmFs
eXplLWNoYW5nZWxvZyBbLS1jaGFuZ2Vsb2ctY291bnQgTl0gPENIQU5HRUxPR19ESVI+IDxPVVRQ
VVRfRElSPgorICAgICAgICB3aGVyZSBDSEFOR0VMT0dfRElSIGlzIHRoZSBkaXJlY3RvcnkgdG8g
bG9vayBmb3IgY2hhbmdlbG9ncywgT1VUUFVUX0RJUiBpcyB0aGUgZGlyZWN0b3J5IGludG8gd2hp
Y2ggdGhlIHRvb2wKKyAgICAgICAgZ2VuZXJhdGVzIGpzb24gZmlsZXMsIGFuZCBOIGlzIHRoZSBu
dW1iZXIgb2YgY2hhbmdlbG9ncyB0byBwYXJzZS4KKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvY29tbW9uL2NvbmZpZy9jb250cmlidXRpb25hcmVhcy5weTogQWRkZWQgbmFtZXMoKS4KKyAg
ICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5
OiBBZGRlZCByZWFkbGluZSBhbmQgaXRlcmF0b3Igc3VwcG9ydCB0byBSZWFkYWJsZVRleHRGaWxl
T2JqZWN0LgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9fX2luaXRf
Xy5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvYW5hbHl6ZWNo
YW5nZWxvZy5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1h
bmRzL2FuYWx5emVjaGFuZ2Vsb2dfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlw
dHMvd2Via2l0cHkvdG9vbC9jb21tYW5kcy9kYXRhL3N1bW1hcnkuaHRtbDogQWRkZWQuCisgICAg
ICAgICogU2NyaXB0cy93ZWJraXRweS90b29sL3N0ZXBzL29wdGlvbnMucHk6CisKIDIwMTEtMTIt
MDIgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgQ2hhbmdlTG9n
IHNob3VsZCBiZSBhYmxlIHRvIHBhcnNlIGFubm90YXRlZCBjaGFuZ2Vsb2dzCkluZGV4OiBUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvY29udHJpYnV0aW9uYXJlYXMucHkKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL2NvbnRyaWJ1
dGlvbmFyZWFzLnB5CShyZXZpc2lvbiAxMDE5MDEpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9jb25maWcvY29udHJpYnV0aW9uYXJlYXMucHkJKHdvcmtpbmcgY29weSkKQEAgLTE3
Nyw2ICsxNzcsOSBAQCBjbGFzcyBDb250cmlidXRpb25BcmVhcyhvYmplY3QpOgogICAgICAgICBz
ZWxmLl9maWxlc3lzdGVtID0gZmlsZXN5c3RlbQogICAgICAgICBzZWxmLl9jb250cmlidXRpb25f
YXJlYXMgPSB0YWJsZQogCisgICAgZGVmIG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gW2Fy
ZWEubmFtZSgpIGZvciBhcmVhIGluIHNlbGYuX2NvbnRyaWJ1dGlvbl9hcmVhc10KKwogICAgIGRl
ZiBfc3BsaXRfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAg
d2hpbGUgcGF0aCBhbmQgbGVuKHBhdGgpOgpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vc3lzdGVtL2ZpbGVzeXN0ZW1fbW9jay5weQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3RlbV9tb2NrLnB5CShyZXZpc2lvbiAx
MDE5MDEpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vZmlsZXN5c3Rl
bV9tb2NrLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yODAsNyArMjgwLDcgQEAgY2xhc3MgTW9ja0Zp
bGVTeXN0ZW0ob2JqZWN0KToKICAgICBkZWYgb3Blbl90ZXh0X2ZpbGVfZm9yX3JlYWRpbmcoc2Vs
ZiwgcGF0aCk6CiAgICAgICAgIGlmIHNlbGYuZmlsZXNbcGF0aF0gaXMgTm9uZToKICAgICAgICAg
ICAgIHNlbGYuX3JhaXNlX25vdF9mb3VuZChwYXRoKQotICAgICAgICByZXR1cm4gUmVhZGFibGVU
ZXh0RmlsZU9iamVjdChzZWxmLCBwYXRoKQorICAgICAgICByZXR1cm4gUmVhZGFibGVUZXh0Rmls
ZU9iamVjdChzZWxmLCBwYXRoLCBzZWxmLmZpbGVzW3BhdGhdKQogCiAgICAgZGVmIG9wZW5fdGV4
dF9maWxlX2Zvcl93cml0aW5nKHNlbGYsIHBhdGgpOgogICAgICAgICByZXR1cm4gV3JpdGFibGVU
ZXh0RmlsZU9iamVjdChzZWxmLCBwYXRoKQpAQCAtMzgwLDMgKzM4MCwyMiBAQCBjbGFzcyBSZWFk
YWJsZUJpbmFyeUZpbGVPYmplY3Qob2JqZWN0KToKIGNsYXNzIFJlYWRhYmxlVGV4dEZpbGVPYmpl
Y3QoUmVhZGFibGVCaW5hcnlGaWxlT2JqZWN0KToKICAgICBkZWYgcmVhZChzZWxmLCBieXRlcz1O
b25lKToKICAgICAgICAgcmV0dXJuIFJlYWRhYmxlQmluYXJ5RmlsZU9iamVjdC5yZWFkKHNlbGYs
IGJ5dGVzKS5kZWNvZGUoJ3V0Zi04JykKKworICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAg
ICAgaWYgc2VsZi5vZmZzZXQgPj0gbGVuKHNlbGYuZGF0YSk6CisgICAgICAgICAgICByZXR1cm4g
dW5pY29kZSgpCisgICAgICAgIHN0YXJ0ID0gc2VsZi5vZmZzZXQKKyAgICAgICAgd2hpbGUgc2Vs
Zi5vZmZzZXQgPCBsZW4oc2VsZi5kYXRhKToKKyAgICAgICAgICAgIGlmIHNlbGYuZGF0YVtzZWxm
Lm9mZnNldF0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2Vs
Zi5vZmZzZXQgKz0gMQorICAgICAgICBzZWxmLm9mZnNldCArPSAxCisgICAgICAgIHJldHVybiBz
ZWxmLmRhdGFbc3RhcnQ6c2VsZi5vZmZzZXRdLmRlY29kZSgndXRmLTgnKQorCisgICAgZGVmIF9f
aXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6
CisgICAgICAgIGlmIHNlbGYub2Zmc2V0ID49IGxlbihzZWxmLmRhdGEpOgorICAgICAgICAgICAg
cmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkbGluZSgpCkluZGV4
OiBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvX19pbml0X18ucHkKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL19faW5pdF9fLnB5
CShyZXZpc2lvbiAxMDE5MDEpCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFu
ZHMvX19pbml0X18ucHkJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3IEBACiAjIFJlcXVpcmVk
IGZvciBQeXRob24gdG8gc2VhcmNoIHRoaXMgZGlyZWN0b3J5IGZvciBtb2R1bGUgZmlsZXMKIAog
ZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLmFkZHVzZXJzdG9ncm91cHMgaW1wb3J0IEFkZFVz
ZXJzVG9Hcm91cHMKK2Zyb20gd2Via2l0cHkudG9vbC5jb21tYW5kcy5hbmFseXplY2hhbmdlbG9n
IGltcG9ydCBBbmFseXplQ2hhbmdlTG9nCiBmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuYXBw
bHl3YXRjaGxpc3Rsb2NhbCBpbXBvcnQgQXBwbHlXYXRjaExpc3RMb2NhbAogZnJvbSB3ZWJraXRw
eS50b29sLmNvbW1hbmRzLmJ1Z2ZvcnRlc3QgaW1wb3J0IEJ1Z0ZvclRlc3QKIGZyb20gd2Via2l0
cHkudG9vbC5jb21tYW5kcy5idWdzZWFyY2ggaW1wb3J0IEJ1Z1NlYXJjaApJbmRleDogVG9vbHMv
U2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2FuYWx5emVjaGFuZ2Vsb2cucHkKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2FuYWx5emVjaGFu
Z2Vsb2cucHkJKHJldmlzaW9uIDApCisrKyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29t
bWFuZHMvYW5hbHl6ZWNoYW5nZWxvZy5weQkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMDggQEAK
KyMgQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisj
CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24u
CisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50
CisKK2ltcG9ydCBqc29uCitpbXBvcnQgcmUKK2ltcG9ydCB0aW1lCisKK2Zyb20gd2Via2l0cHku
Y29tbW9uLmNoZWNrb3V0LnNjbS5kZXRlY3Rpb24gaW1wb3J0IFNDTURldGVjdG9yCitmcm9tIHdl
YmtpdHB5LmNvbW1vbi5jaGVja291dC5jaGFuZ2Vsb2cgaW1wb3J0IENoYW5nZUxvZworZnJvbSB3
ZWJraXRweS5jb21tb24uY29uZmlnLmNvbnRyaWJ1dGlvbmFyZWFzIGltcG9ydCBDb250cmlidXRp
b25BcmVhcworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzeXN0ZW0gaW1wb3J0IEZp
bGVTeXN0ZW0KK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5leGVjdXRpdmUgaW1wb3J0IEV4
ZWN1dGl2ZQorZnJvbSB3ZWJraXRweS50b29sLm11bHRpY29tbWFuZHRvb2wgaW1wb3J0IEFic3Ry
YWN0RGVjbGFyYXRpdmVDb21tYW5kCitmcm9tIHdlYmtpdHB5LnRvb2wgaW1wb3J0IHN0ZXBzCisK
KworY2xhc3MgQW5hbHl6ZUNoYW5nZUxvZyhBYnN0cmFjdERlY2xhcmF0aXZlQ29tbWFuZCk6Cisg
ICAgbmFtZSA9ICJhbmFseXplLWNoYW5nZWxvZyIKKyAgICBoZWxwX3RleHQgPSAiRXhwZXJpbWVu
dGFsIGNvbW1hbmQgZm9yIGFuYWx5emluZyBjaGFuZ2UgbG9ncy4iCisgICAgbG9uZ19oZWxwID0g
IlRoaXMgY29tbWFuZCBwYXJzZXMgY2hhbmdlbG9ncyBpbiBhIHNwZWNpZmllZCBkaXJlY3Rvcnkg
YW5kIHN1bW1hcml6ZXMgdGhlIHJlc3VsdCBhcyBKU09OIGZpbGVzLiIKKworICAgIGRlZiBfX2lu
aXRfXyhzZWxmKToKKyAgICAgICAgb3B0aW9ucyA9IFsKKyAgICAgICAgICAgIHN0ZXBzLk9wdGlv
bnMuY2hhbmdlbG9nX2NvdW50LAorICAgICAgICBdCisgICAgICAgIEFic3RyYWN0RGVjbGFyYXRp
dmVDb21tYW5kLl9faW5pdF9fKHNlbGYsIG9wdGlvbnM9b3B0aW9ucykKKworICAgIEBzdGF0aWNt
ZXRob2QKKyAgICBkZWYgX2VudW1lcmF0ZV9jaGFuZ2Vsb2dzKGZpbGVzeXN0ZW0sIGRpcm5hbWUs
IGNoYW5nZWxvZ19jb3VudCk6CisgICAgICAgIGNoYW5nZWxvZ3MgPSBbZmlsZXN5c3RlbS5qb2lu
KGRpcm5hbWUsIGZpbGVuYW1lKSBmb3IgZmlsZW5hbWUgaW4gZmlsZXN5c3RlbS5saXN0ZGlyKGRp
cm5hbWUpIGlmIHJlLm1hdGNoKCdeQ2hhbmdlTG9nKC0oXGR7NH0tXGR7Mn0tXGR7Mn0pKT8kJywg
ZmlsZW5hbWUpXQorICAgICAgICAjIE1ha2Ugc3VyZSBDaGFuZ2VMb2cgc2hvd3MgdXAgYmVmb3Jl
IENoYW5nZUxvZy0yMDExLTAxLTAxCisgICAgICAgIGNoYW5nZWxvZ3MgPSBzb3J0ZWQoY2hhbmdl
bG9ncywga2V5PWxhbWJkYSBmaWxlbmFtZTogZmlsZW5hbWUgKyAnWCcsIHJldmVyc2U9VHJ1ZSkK
KyAgICAgICAgcmV0dXJuIGNoYW5nZWxvZ3NbOmNoYW5nZWxvZ19jb3VudF0KKworICAgIEBzdGF0
aWNtZXRob2QKKyAgICBkZWYgX2dlbmVyYXRlX2pzb25zKGZpbGVzeXN0ZW0sIGpzb25zLCBvdXRw
dXRfZGlyKToKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGpzb25zOgorICAgICAgICAgICAgcHJp
bnQgJyAgICBHZW5lcmF0aW5nJywgZmlsZW5hbWUKKyAgICAgICAgICAgIGZpbGVzeXN0ZW0ud3Jp
dGVfdGV4dF9maWxlKGZpbGVzeXN0ZW0uam9pbihvdXRwdXRfZGlyLCBmaWxlbmFtZSksIGpzb24u
ZHVtcHMoanNvbnNbZmlsZW5hbWVdLCBpbmRlbnQ9MikpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxm
LCBvcHRpb25zLCBhcmdzLCB0b29sKToKKyAgICAgICAgZmlsZXN5c3RlbSA9IHNlbGYuX3Rvb2wu
ZmlsZXN5c3RlbQorICAgICAgICBpZiBsZW4oYXJncykgPCAxIG9yIG5vdCBmaWxlc3lzdGVtLmV4
aXN0cyhhcmdzWzBdKToKKyAgICAgICAgICAgIHByaW50ICJOZWVkIHRoZSBkaXJlY3RvcnkgbmFt
ZSB0byBsb29rIGZvciBjaGFuZ2Vsb2cgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IgorICAgICAgICAg
ICAgcmV0dXJuCisgICAgICAgIGNoYW5nZWxvZ19kaXIgPSBmaWxlc3lzdGVtLmFic3BhdGgoYXJn
c1swXSkKKworICAgICAgICBpZiBsZW4oYXJncykgPCAyIG9yIG5vdCBmaWxlc3lzdGVtLmV4aXN0
cyhhcmdzWzFdKToKKyAgICAgICAgICAgIHByaW50ICJOZWVkIHRoZSBvdXRwdXQgZGlyZWN0b3J5
IG5hbWUgYXMgdGhlIHNlY29uZCBhcmd1bWVudCIKKyAgICAgICAgICAgIHJldHVybgorICAgICAg
ICBvdXRwdXRfZGlyID0gYXJnc1sxXQorCisgICAgICAgIHN0YXJ0VGltZSA9IHRpbWUudGltZSgp
CisKKyAgICAgICAgcHJpbnQgJ0VudW1lcmF0aW5nIENoYW5nZUxvZyBmaWxlcy4uLicKKyAgICAg
ICAgY2hhbmdlbG9ncyA9IEFuYWx5emVDaGFuZ2VMb2cuX2VudW1lcmF0ZV9jaGFuZ2Vsb2dzKGZp
bGVzeXN0ZW0sIGNoYW5nZWxvZ19kaXIsIG9wdGlvbnMuY2hhbmdlbG9nX2NvdW50KQorCisgICAg
ICAgIGFuYWx5emVyID0gQ2hhbmdlTG9nQW5hbHl6ZXIodG9vbCwgY2hhbmdlbG9ncykKKyAgICAg
ICAgYW5hbHl6ZXIuYW5hbHl6ZSgpCisKKyAgICAgICAgcHJpbnQgJ0dlbmVyYXRpbmcganNvbiBm
aWxlcy4uLicKKyAgICAgICAganNvbl9maWxlcyA9IHsKKyAgICAgICAgICAgICdzdW1tYXJ5Lmpz
b24nOiBhbmFseXplci5zdW1tYXJ5KCksCisgICAgICAgICAgICAnY29udHJpYnV0b3JzLmpzb24n
OiBhbmFseXplci5jb250cmlidXRvcnNfc3RhdGlzdGljcygpLAorICAgICAgICAgICAgJ2FyZWFz
Lmpzb24nOiBhbmFseXplci5hcmVhc19zdGF0aXN0aWNzKCksCisgICAgICAgIH0KKyAgICAgICAg
QW5hbHl6ZUNoYW5nZUxvZy5fZ2VuZXJhdGVfanNvbnMoZmlsZXN5c3RlbSwganNvbl9maWxlcywg
b3V0cHV0X2RpcikKKyAgICAgICAgY29tbWFuZHNfZGlyID0gZmlsZXN5c3RlbS5kaXJuYW1lKGZp
bGVzeXN0ZW0ucGF0aF90b19tb2R1bGUoc2VsZi5fX21vZHVsZV9fKSkKKyAgICAgICAgcHJpbnQg
Y29tbWFuZHNfZGlyCisgICAgICAgIGZpbGVzeXN0ZW0uY29weWZpbGUoZmlsZXN5c3RlbS5qb2lu
KGNvbW1hbmRzX2RpciwgJ2RhdGEvc3VtbWFyeS5odG1sJyksIGZpbGVzeXN0ZW0uam9pbihvdXRw
dXRfZGlyLCAnc3VtbWFyeS5odG1sJykpCisKKyAgICAgICAgdGljayA9IHRpbWUudGltZSgpIC0g
c3RhcnRUaW1lCisgICAgICAgIHByaW50ICdGaW5pc2hlZCBpbiAlMDJkbTolMDJkcycgJSAoaW50
KHRpY2sgLyA2MCksIGludCh0aWNrICUgNjApKQorCisKK2NsYXNzIENoYW5nZUxvZ0FuYWx5emVy
KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIGNoYW5nZWxvZ19wYXRocyk6
CisgICAgICAgIHNlbGYuX2NoYW5nZWxvZ19wYXRocyA9IGNoYW5nZWxvZ19wYXRocworICAgICAg
ICBzZWxmLl9maWxlc3lzdGVtID0gaG9zdC5maWxlc3lzdGVtCisgICAgICAgIHNlbGYuX2NvbnRy
aWJ1dGlvbl9hcmVhcyA9IENvbnRyaWJ1dGlvbkFyZWFzKGhvc3QuZmlsZXN5c3RlbSkKKyAgICAg
ICAgc2VsZi5fc2NtID0gaG9zdC5zY20oKQorICAgICAgICBzZWxmLl9wYXJzZWRfcmV2aXNpb25z
ID0ge30KKworICAgICAgICBzZWxmLl9jb250cmlidXRvcnNfc3RhdGlzdGljcyA9IHt9CisgICAg
ICAgIHNlbGYuX2FyZWFzX3N0YXRpc3RpY3MgPSBkaWN0KFsoYXJlYSwgeydyZXZpZXdlZCc6IDAs
ICd1bnJldmlld2VkJzogMCwgJ2NvbnRyaWJ1dG9ycyc6IHt9fSkgZm9yIGFyZWEgaW4gc2VsZi5f
Y29udHJpYnV0aW9uX2FyZWFzLm5hbWVzKCldKQorICAgICAgICBzZWxmLl9zdW1tYXJ5ID0geydy
ZXZpZXdlZCc6IDAsICd1bnJldmlld2VkJzogMH0KKworICAgICAgICBzZWxmLl9sb25nZXN0X2Zp
bGVuYW1lID0gbWF4KFtsZW4ocGF0aCkgLSBsZW4oc2VsZi5fc2NtLmNoZWNrb3V0X3Jvb3QpIGZv
ciBwYXRoIGluIGNoYW5nZWxvZ19wYXRoc10pCisgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gJycK
KyAgICAgICAgc2VsZi5fbGVuZ3RoX29mX3ByZXZpb3VzX291dHB1dCA9IDAKKworICAgIGRlZiBj
b250cmlidXRvcnNfc3RhdGlzdGljcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRy
aWJ1dG9yc19zdGF0aXN0aWNzCisKKyAgICBkZWYgYXJlYXNfc3RhdGlzdGljcyhzZWxmKToKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX2FyZWFzX3N0YXRpc3RpY3MKKworICAgIGRlZiBzdW1tYXJ5KHNl
bGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc3VtbWFyeQorCisgICAgZGVmIF9wcmludF9zdGF0
dXMoc2VsZiwgc3RhdHVzKToKKyAgICAgICAgaWYgc2VsZi5fbGVuZ3RoX29mX3ByZXZpb3VzX291
dHB1dDoKKyAgICAgICAgICAgIHByaW50ICJcciIgKyAiICIgKiBzZWxmLl9sZW5ndGhfb2ZfcHJl
dmlvdXNfb3V0cHV0LAorICAgICAgICBuZXdfb3V0cHV0ID0gKCclJyArIHN0cihzZWxmLl9sb25n
ZXN0X2ZpbGVuYW1lKSArICdzOiAlcycpICUgKHNlbGYuX2ZpbGVuYW1lLCBzdGF0dXMpCisgICAg
ICAgIHByaW50ICJcciIgKyBuZXdfb3V0cHV0LAorICAgICAgICBzZWxmLl9sZW5ndGhfb2ZfcHJl
dmlvdXNfb3V0cHV0ID0gbGVuKG5ld19vdXRwdXQpCisKKyAgICBkZWYgX3NldF9maWxlbmFtZShz
ZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGlmIHNlbGYuX2ZpbGVuYW1lOgorICAgICAgICAgICAg
cHJpbnQKKyAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBmaWxlbmFtZQorCisgICAgZGVmIGFuYWx5
emUoc2VsZik6CisgICAgICAgIGZvciBwYXRoIGluIHNlbGYuX2NoYW5nZWxvZ19wYXRoczoKKyAg
ICAgICAgICAgIHNlbGYuX3NldF9maWxlbmFtZShzZWxmLl9maWxlc3lzdGVtLnJlbHBhdGgocGF0
aCwgc2VsZi5fc2NtLmNoZWNrb3V0X3Jvb3QpKQorICAgICAgICAgICAgd2l0aCBzZWxmLl9maWxl
c3lzdGVtLm9wZW5fdGV4dF9maWxlX2Zvcl9yZWFkaW5nKHBhdGgpIGFzIGNoYW5nZWxvZzoKKyAg
ICAgICAgICAgICAgICBzZWxmLl9wcmludF9zdGF0dXMoJ1BhcnNpbmcgZW50cmllcy4uLicpCisg
ICAgICAgICAgICAgICAgbnVtYmVyX29mX3BhcnNlZF9lbnRyaWVzID0gc2VsZi5fYW5hbHl6ZV9l
bnRyaWVzKENoYW5nZUxvZy5wYXJzZV9lbnRyaWVzX2Zyb21fZmlsZShjaGFuZ2Vsb2cpLCBwYXRo
KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfc3RhdHVzKCdEb25lICglZCBlbnRyaWVzKScgJSBu
dW1iZXJfb2ZfcGFyc2VkX2VudHJpZXMpCisgICAgICAgIHByaW50CisgICAgICAgIHNlbGYuX3N1
bW1hcnlbJ2NvbnRyaWJ1dG9ycyddID0gbGVuKHNlbGYuX2NvbnRyaWJ1dG9yc19zdGF0aXN0aWNz
KQorICAgICAgICBzZWxmLl9zdW1tYXJ5Wydjb250cmlidXRvcnNfd2l0aF9yZXZpZXdzJ10gPSBz
dW0oWzEgZm9yIGNvbnRyaWJ1dG9yIGluIHNlbGYuX2NvbnRyaWJ1dG9yc19zdGF0aXN0aWNzLnZh
bHVlcygpIGlmIGNvbnRyaWJ1dG9yWydyZXZpZXdzJ11bJ3RvdGFsJ11dKQorICAgICAgICBzZWxm
Ll9zdW1tYXJ5Wydjb250cmlidXRvcnNfd2l0aG91dF9yZXZpZXdzJ10gPSBzZWxmLl9zdW1tYXJ5
Wydjb250cmlidXRvcnMnXSAtIHNlbGYuX3N1bW1hcnlbJ2NvbnRyaWJ1dG9yc193aXRoX3Jldmll
d3MnXQorCisgICAgZGVmIF9jb2xsZWN0X3N0YXRpc3RpY3NfZm9yX2NvbnRyaWJ1dG9yX2FyZWEo
c2VsZiwgYXJlYSwgY29udHJpYnV0b3IsIGNvbnRyaWJ1dGlvbl90eXBlLCByZXZpZXdlZCk6Cisg
ICAgICAgIGFyZWFfY29udHJpYnV0b3JzID0gc2VsZi5fYXJlYXNfc3RhdGlzdGljc1thcmVhXVsn
Y29udHJpYnV0b3JzJ10KKyAgICAgICAgaWYgY29udHJpYnV0b3Igbm90IGluIGFyZWFfY29udHJp
YnV0b3JzOgorICAgICAgICAgICAgYXJlYV9jb250cmlidXRvcnNbY29udHJpYnV0b3JdID0geydy
ZXZpZXdzJzogMCwgJ3Jldmlld2VkJzogMCwgJ3VucmV2aWV3ZWQnOiAwfQorICAgICAgICBpZiBj
b250cmlidXRpb25fdHlwZSA9PSAncGF0Y2hlcyc6CisgICAgICAgICAgICBjb250cmlidXRpb25f
dHlwZSA9ICdyZXZpZXdlZCcgaWYgcmV2aWV3ZWQgZWxzZSAndW5yZXZpZXdlZCcKKyAgICAgICAg
YXJlYV9jb250cmlidXRvcnNbY29udHJpYnV0b3JdW2NvbnRyaWJ1dGlvbl90eXBlXSArPSAxCisK
KyAgICBkZWYgX2NvbGxlY3Rfc3RhdGlzdGljc19mb3JfY29udHJpYnV0b3Ioc2VsZiwgY29udHJp
YnV0b3IsIGNvbnRyaWJ1dGlvbl90eXBlLCBhcmVhcywgdG91Y2hlZF9maWxlcywgcmV2aWV3ZWQp
OgorICAgICAgICBpZiBjb250cmlidXRvciBub3QgaW4gc2VsZi5fY29udHJpYnV0b3JzX3N0YXRp
c3RpY3M6CisgICAgICAgICAgICBzZWxmLl9jb250cmlidXRvcnNfc3RhdGlzdGljc1tjb250cmli
dXRvcl0gPSB7CisgICAgICAgICAgICAgICAgJ3Jldmlld3MnOiB7J3RvdGFsJzogMCwgJ2FyZWFz
Jzoge30sICdmaWxlcyc6IHt9fSwKKyAgICAgICAgICAgICAgICAncGF0Y2hlcyc6IHsncmV2aWV3
ZWQnOiAwLCAndW5yZXZpZXdlZCc6IDAsICdhcmVhcyc6IHt9LCAnZmlsZXMnOiB7fX19CisgICAg
ICAgIHN0YXRpc3RpY3MgPSBzZWxmLl9jb250cmlidXRvcnNfc3RhdGlzdGljc1tjb250cmlidXRv
cl1bY29udHJpYnV0aW9uX3R5cGVdCisKKyAgICAgICAgaWYgY29udHJpYnV0aW9uX3R5cGUgPT0g
J3Jldmlld3MnOgorICAgICAgICAgICAgc3RhdGlzdGljc1sndG90YWwnXSArPSAxCisgICAgICAg
IGVsaWYgcmV2aWV3ZWQ6CisgICAgICAgICAgICBzdGF0aXN0aWNzWydyZXZpZXdlZCddICs9IDEK
KyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0YXRpc3RpY3NbJ3VucmV2aWV3ZWQnXSArPSAx
CisKKyAgICAgICAgZm9yIGFyZWEgaW4gYXJlYXM6CisgICAgICAgICAgICBzZWxmLl9pbmNyZW1l
bnRfZGljdGlvbmFyeV92YWx1ZShzdGF0aXN0aWNzWydhcmVhcyddLCBhcmVhKQorICAgICAgICAg
ICAgc2VsZi5fY29sbGVjdF9zdGF0aXN0aWNzX2Zvcl9jb250cmlidXRvcl9hcmVhKGFyZWEsIGNv
bnRyaWJ1dG9yLCBjb250cmlidXRpb25fdHlwZSwgcmV2aWV3ZWQpCisgICAgICAgIGZvciB0b3Vj
aGVkZmlsZSBpbiB0b3VjaGVkX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5faW5jcmVtZW50X2Rp
Y3Rpb25hcnlfdmFsdWUoc3RhdGlzdGljc1snZmlsZXMnXSwgdG91Y2hlZGZpbGUpCisKKyAgICBk
ZWYgX2luY3JlbWVudF9kaWN0aW9uYXJ5X3ZhbHVlKHNlbGYsIGRpY3Rpb25hcnksIGtleSk6Cisg
ICAgICAgIGRpY3Rpb25hcnlba2V5XSA9IGRpY3Rpb25hcnkuZ2V0KGtleSwgMCkgKyAxCisKKyAg
ICBkZWYgX2FuYWx5emVfZW50cmllcyhzZWxmLCBlbnRyaWVzLCBjaGFuZ2Vsb2dfcGF0aCk6Cisg
ICAgICAgIGRpcm5hbWUgPSBzZWxmLl9maWxlc3lzdGVtLmRpcm5hbWUoY2hhbmdlbG9nX3BhdGgp
CisgICAgICAgIGZvciBpLCBlbnRyeSBpbiBlbnVtZXJhdGUoZW50cmllcyk6CisgICAgICAgICAg
ICBzZWxmLl9wcmludF9zdGF0dXMoJyglcykgZW50cmllcycgJSBpKQorICAgICAgICAgICAgYXNz
ZXJ0KGVudHJ5LmF1dGhvcnMoKSkKKworICAgICAgICAgICAgdG91Y2hlZGZpbGVzX2Zvcl9lbnRy
eSA9IFtzZWxmLl9maWxlc3lzdGVtLnJlbHBhdGgoc2VsZi5fZmlsZXN5c3RlbS5qb2luKGRpcm5h
bWUsIG5hbWUpLCBzZWxmLl9zY20uY2hlY2tvdXRfcm9vdCkgZm9yIG5hbWUgaW4gZW50cnkudG91
Y2hlZF9maWxlcygpXQorICAgICAgICAgICAgYXJlYXNfZm9yX2VudHJ5ID0gc2VsZi5fY29udHJp
YnV0aW9uX2FyZWFzLmFyZWFzX2Zvcl90b3VjaGVkX2ZpbGVzKHRvdWNoZWRmaWxlc19mb3JfZW50
cnkpCisgICAgICAgICAgICBhdXRob3JzX2Zvcl9lbnRyeSA9IGVudHJ5LmF1dGhvcnMoKQorICAg
ICAgICAgICAgcmV2aWV3ZXJzX2Zvcl9lbnRyeSA9IGVudHJ5LnJldmlld2VycygpCisKKyAgICAg
ICAgICAgIGZvciByZXZpZXdlciBpbiByZXZpZXdlcnNfZm9yX2VudHJ5OgorICAgICAgICAgICAg
ICAgIHNlbGYuX2NvbGxlY3Rfc3RhdGlzdGljc19mb3JfY29udHJpYnV0b3IocmV2aWV3ZXIuZnVs
bF9uYW1lLCAncmV2aWV3cycsIGFyZWFzX2Zvcl9lbnRyeSwgdG91Y2hlZGZpbGVzX2Zvcl9lbnRy
eSwgcmV2aWV3ZWQ9VHJ1ZSkKKworICAgICAgICAgICAgZm9yIGF1dGhvciBpbiBhdXRob3JzX2Zv
cl9lbnRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9jb2xsZWN0X3N0YXRpc3RpY3NfZm9yX2Nv
bnRyaWJ1dG9yKGF1dGhvclsnbmFtZSddLCAncGF0Y2hlcycsIGFyZWFzX2Zvcl9lbnRyeSwgdG91
Y2hlZGZpbGVzX2Zvcl9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgcmV2aWV3ZWQ9Ym9vbChy
ZXZpZXdlcnNfZm9yX2VudHJ5KSkKKworICAgICAgICAgICAgZm9yIGFyZWEgaW4gYXJlYXNfZm9y
X2VudHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2FyZWFzX3N0YXRpc3RpY3NbYXJlYV1bJ3Jl
dmlld2VkJyBpZiByZXZpZXdlcnNfZm9yX2VudHJ5IGVsc2UgJ3VucmV2aWV3ZWQnXSArPSAxCisK
KyAgICAgICAgICAgIHNlbGYuX3N1bW1hcnlbJ3Jldmlld2VkJyBpZiByZXZpZXdlcnNfZm9yX2Vu
dHJ5IGVsc2UgJ3VucmV2aWV3ZWQnXSArPSAxCisKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAg
ICBzZWxmLl9wcmludF9zdGF0dXMoJyglcykgZW50cmllcycgJSBpKQorICAgICAgICByZXR1cm4g
aQpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29sL2NvbW1hbmRzL2FuYWx5emVjaGFu
Z2Vsb2dfdW5pdHRlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS90
b29sL2NvbW1hbmRzL2FuYWx5emVjaGFuZ2Vsb2dfdW5pdHRlc3QucHkJKHJldmlzaW9uIDApCisr
KyBUb29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvYW5hbHl6ZWNoYW5nZWxvZ191
bml0dGVzdC5weQkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxODMgQEAKKyMgQ3B5cmlnaHQgKGMp
IDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisj
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKK2ltcG9ydCBqc29uCitpbXBvcnQgc3lzCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5jb25maWcu
Y29udHJpYnV0aW9uYXJlYXMgaW1wb3J0IENvbnRyaWJ1dGlvbkFyZWFzCitmcm9tIHdlYmtpdHB5
LmNvbW1vbi5ob3N0X21vY2sgaW1wb3J0IE1vY2tIb3N0Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5z
eXN0ZW0uZmlsZXN5c3RlbV9tb2NrIGltcG9ydCBNb2NrRmlsZVN5c3RlbQorZnJvbSB3ZWJraXRw
eS5jb21tb24uc3lzdGVtLmV4ZWN1dGl2ZSBpbXBvcnQgRXhlY3V0aXZlCitmcm9tIHdlYmtpdHB5
LnRvb2wuY29tbWFuZHMuYW5hbHl6ZWNoYW5nZWxvZyBpbXBvcnQgQW5hbHl6ZUNoYW5nZUxvZwor
ZnJvbSB3ZWJraXRweS50b29sLmNvbW1hbmRzLmFuYWx5emVjaGFuZ2Vsb2cgaW1wb3J0IENoYW5n
ZUxvZ0FuYWx5emVyCitmcm9tIHdlYmtpdHB5LnRvb2wuY29tbWFuZHMuY29tbWFuZHRlc3QgaW1w
b3J0IENvbW1hbmRzVGVzdAorZnJvbSB3ZWJraXRweS50b29sLm11bHRpY29tbWFuZHRvb2wgaW1w
b3J0IEFic3RyYWN0RGVjbGFyYXRpdmVDb21tYW5kCisKKworY2xhc3MgQW5hbHl6ZUNoYW5nZUxv
Z1Rlc3QoQ29tbWFuZHNUZXN0KToKKyAgICBkZWYgdGVzdF9lbnVtZXJhdGVfZW51bWVyYXRlX2No
YW5nZWxvZ3Moc2VsZik6CisgICAgICAgIGZpbGVzeXN0ZW0gPSBNb2NrRmlsZVN5c3RlbSh7Cisg
ICAgICAgICAgICAnZm9vL0NoYW5nZUxvZyc6ICcnLAorICAgICAgICAgICAgJ2Zvby9DaGFuZ2VM
b2ctMjAxMC0wNi0yMyc6ICcnLAorICAgICAgICAgICAgJ2Zvby9DaGFuZ2VMb2ctMjAxMC0xMi0z
MSc6ICcnLAorICAgICAgICAgICAgJ2Zvby9DaGFuZ2VMb2cteCc6ICcnLAorICAgICAgICAgICAg
J2Zvby9DaGFuZ2VMb2ctMjAxMS0wMS0wMSc6ICcnLAorICAgICAgICB9KQorICAgICAgICBjaGFu
Z2Vsb2dzID0gQW5hbHl6ZUNoYW5nZUxvZy5fZW51bWVyYXRlX2NoYW5nZWxvZ3MoZmlsZXN5c3Rl
bSwgJ2Zvby8nLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYW5nZWxvZ3MsIFsn
Zm9vL0NoYW5nZUxvZycsICdmb28vQ2hhbmdlTG9nLTIwMTEtMDEtMDEnLCAnZm9vL0NoYW5nZUxv
Zy0yMDEwLTEyLTMxJywgJ2Zvby9DaGFuZ2VMb2ctMjAxMC0wNi0yMyddKQorCisgICAgICAgIGNo
YW5nZWxvZ3MgPSBBbmFseXplQ2hhbmdlTG9nLl9lbnVtZXJhdGVfY2hhbmdlbG9ncyhmaWxlc3lz
dGVtLCAnZm9vLycsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hhbmdlbG9ncywgWydm
b28vQ2hhbmdlTG9nJywgJ2Zvby9DaGFuZ2VMb2ctMjAxMS0wMS0wMSddKQorCisgICAgZGVmIHRl
c3RfZ2VuZXJhdGVfanNvbnMoc2VsZik6CisgICAgICAgIGZpbGVzeXN0ZW0gPSBNb2NrRmlsZVN5
c3RlbSgpCisgICAgICAgIHRlc3RfanNvbiA9IHsnYXJyYXkuanNvbic6IFsxLCAyLCAzLCB7J2tl
eSc6ICd2YWx1ZSd9XSwgJ2RpY3Rpb25hcnkuanNvbic6IHsnc29tZWtleSc6ICdzb21ldmFsdWUn
LCAnYXJyYXknOiBbNCwgNV19fQorICAgICAgICBzeXNfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAg
ICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gZmlsZXN5c3RlbS5vcGVuX3RleHRf
ZmlsZV9mb3Jfd3JpdGluZygnc3Rkb3V0JykKKyAgICAgICAgICAgIEFuYWx5emVDaGFuZ2VMb2cu
X2dlbmVyYXRlX2pzb25zKGZpbGVzeXN0ZW0sIHRlc3RfanNvbiwgJ2JhcicpCisgICAgICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKHNldChmaWxlc3lzdGVtLmZpbGVzLmtleXMoKSksIHNldChbJ2Jh
ci9hcnJheS5qc29uJywgJ2Jhci9kaWN0aW9uYXJ5Lmpzb24nLCAnc3Rkb3V0J10pKQorICAgICAg
ICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5c19zdGRvdXQKKworICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKGpzb24ubG9hZHMoZmlsZXN5c3RlbS5maWxlc1snYmFyL2FycmF5
Lmpzb24nXSksIHRlc3RfanNvblsnYXJyYXkuanNvbiddKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKGpzb24ubG9hZHMoZmlsZXN5c3RlbS5maWxlc1snYmFyL2RpY3Rpb25hcnkuanNvbiddKSwg
dGVzdF9qc29uWydkaWN0aW9uYXJ5Lmpzb24nXSkKKworCitjbGFzcyBDaGFuZ2VMb2dBbmFseXpl
clRlc3QoQ29tbWFuZHNUZXN0KToKKyAgICBkZWYgdGVzdF9hbmFseXplX29uZV9jaGFuZ2Vsb2co
c2VsZik6CisgICAgICAgIGhvc3QgPSBNb2NrSG9zdCgpCisgICAgICAgIGhvc3QuZmlsZXN5c3Rl
bS5maWxlc1snbW9jay1jaGVja291dC9mb28vQ2hhbmdlTG9nJ10gPSB1IiIiMjAxMS0xMS0xNyAg
TWFyayBSb3dlICA8bXJvd2VAYXBwbGUuY29tPgorCisgICAgPGh0dHA6Ly93ZWJraXQub3JnL2Iv
NzI2NDY+IERpc2FibGUgZGVwcmVjYXRpb24gd2FybmluZ3MgYXJvdW5kIGNvZGUgd2hlcmUgd2Ug
Y2Fubm90IGVhc2lseQorICAgIHN3aXRjaCBhd2F5IGZyb20gdGhlIGRlcHJlY2F0ZWQgQVBJcy4K
KworICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCisKKyAgICAqIHBsYXRmb3JtL21hYy9XZWJD
b3JlTlNTdHJpbmdFeHRyYXMubW06CisgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2NmL1NvY2tldFN0
cmVhbUhhbmRsZUNGTmV0LmNwcDoKKyAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpy
ZXBvcnRFcnJvclRvQ2xpZW50KToKKworMjAxMS0xMS0xOSAgS2V2aW4gT2xsaXZpZXIgIDxrZXZp
bm9AdGhlb2xsaXZpZXJzLmNvbT4KKworICAgIFt3eF0gQysrIGJpbmRpbmdzIGJ1aWxkIGZpeCBm
b3IgbW92ZSBvZiBhcnJheSBjbGFzc2VzIHRvIFdURi4KKworICAgICogYmluZGluZ3Mvc2NyaXB0
cy9Db2RlR2VuZXJhdG9yQ1BQLnBtOgorICAgIChHZXRDUFBUeXBlR2V0dGVyKToKKyAgICAoR2V0
TmFtZXNwYWNlRm9yQ2xhc3MpOgorICAgIChHZW5lcmF0ZUhlYWRlcik6CisgICAgKEdlbmVyYXRl
SW1wbGVtZW50YXRpb24pOgorCisyMDExLTEwLTI3ICBQaGlsaXBwZSBOb3JtYW5kICA8cG5vcm1h
bmRAaWdhbGlhLmNvbT4gYW5kIFphbiBEb2JlcnNlayAgPHphbmRvYmVyc2VrQGdtYWlsLmNvbT4K
KworICAgICAgICBbR1N0cmVhbWVyXSBXZWJBdWRpbyBBdWRpb0ZpbGVSZWFkZXIgaW1wbGVtZW50
YXRpb24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY5
ODM0CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTWFydGluIFJvYmluc29uLgorCisgICAgICAgIEJh
c2ljIEZpbGVSZWFkZXIgaW1wbGVtZW50YXRpb24sIHN1cHBvcnRpbmcgb25lIG9yIDIgYXVkaW8K
KyAgICAgICAgY2hhbm5lbHMuIEFuIGVtcHR5IEF1ZGlvRGVzdGluYXRpb24gaXMgYWxzbyBwcm92
aWRlZCwgaXRzIGNvbXBsZXRlCisgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIGhhbmRsZWQgaW4g
YnVnIDY5ODM1LgorCisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICogR05VbWFr
ZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9nc3RyZWFtZXIvQXVkaW9E
ZXN0aW5hdGlvbkdTdHJlYW1lci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9E
ZXN0aW5hdGlvbjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb246
OmhhcmR3YXJlU2FtcGxlUmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0Rlc3RpbmF0aW9u
R1N0cmVhbWVyOjpBdWRpb0Rlc3RpbmF0aW9uR1N0cmVhbWVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvRGVzdGluYXRpb25HU3RyZWFtZXI6On5BdWRpb0Rlc3RpbmF0aW9uR1N0cmVhbWVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25HU3RyZWFtZXI6OnN0YXJ0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25HU3RyZWFtZXI6OnN0b3ApOgorICAgICAg
ICAqIHBsYXRmb3JtL2F1ZGlvL2dzdHJlYW1lci9BdWRpb0Rlc3RpbmF0aW9uR1N0cmVhbWVyLmg6
IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkdTdHJlYW1lcjo6aXNQ
bGF5aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvRGVzdGluYXRpb25HU3RyZWFtZXI6OnNh
bXBsZVJhdGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9EZXN0aW5hdGlvbkdTdHJlYW1lcjo6
c291cmNlUHJvdmlkZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL2dzdHJlYW1lci9BdWRp
b0ZpbGVSZWFkZXJHU3RyZWFtZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmdldEdT
dHJlYW1lckF1ZGlvQ2Fwcyk6CisgICAgICAgIChXZWJDb3JlOjpnZXRGbG9hdEZyb21CeXRlUmVh
ZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OmNvcHlHc3RyZWFtZXJCdWZmZXJzVG9BdWRpb0NoYW5u
ZWwpOgorICAgICAgICAoV2ViQ29yZTo6b25BcHBzaW5rTmV3QnVmZmVyQ2FsbGJhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6bWVzc2FnZUNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6Om9uR1N0
cmVhbWVyRGVpbnRlcmxlYXZlUGFkQWRkZWRDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpv
bkdTdHJlYW1lckRlaW50ZXJsZWF2ZVJlYWR5Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6
b25HU3RyZWFtZXJEZWNvZGViaW5QYWRBZGRlZENhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvRmlsZVJlYWRlcjo6QXVkaW9GaWxlUmVhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvRmlsZVJlYWRlcjo6fkF1ZGlvRmlsZVJlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpBdWRp
b0ZpbGVSZWFkZXI6OmhhbmRsZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb0ZpbGVS
ZWFkZXI6OmhhbmRsZU1lc3NhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9GaWxlUmVhZGVy
OjpoYW5kbGVOZXdEZWludGVybGVhdmVQYWQpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9GaWxl
UmVhZGVyOjpkZWludGVybGVhdmVQYWRzQ29uZmlndXJlZCk6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb0ZpbGVSZWFkZXI6OnBsdWdEZWludGVybGVhdmUpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9GaWxlUmVhZGVyOjpjcmVhdGVCdXMpOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlQnVzRnJv
bUF1ZGlvRmlsZSk6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVCdXNGcm9tSW5NZW1vcnlBdWRp
b0ZpbGUpOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL2d0ay9BdWRpb0J1c0d0ay5jcHA6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9CdXM6OmxvYWRQbGF0Zm9ybVJlc291cmNlKToK
KyIiIgorCisgICAgICAgIHN5c19zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHRyeToKKyAg
ICAgICAgICAgIHN5cy5zdGRvdXQgPSBob3N0LmZpbGVzeXN0ZW0ub3Blbl90ZXh0X2ZpbGVfZm9y
X3dyaXRpbmcoJ3N0ZG91dCcpCisgICAgICAgICAgICBhbmFseXplciA9IENoYW5nZUxvZ0FuYWx5
emVyKGhvc3QsIFsnbW9jay1jaGVja291dC9mb28vQ2hhbmdlTG9nJ10pCisgICAgICAgICAgICBh
bmFseXplci5hbmFseXplKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRv
dXQgPSBzeXNfc3Rkb3V0CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbmFseXplci5zdW1t
YXJ5KCksCisgICAgICAgICAgICB7J3Jldmlld2VkJzogMiwgJ3VucmV2aWV3ZWQnOiAxLCAnY29u
dHJpYnV0b3JzJzogNiwgJ2NvbnRyaWJ1dG9yc193aXRoX3Jldmlld3MnOiAyLCAnY29udHJpYnV0
b3JzX3dpdGhvdXRfcmV2aWV3cyc6IDR9KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0
KGFuYWx5emVyLmNvbnRyaWJ1dG9yc19zdGF0aXN0aWNzKCkua2V5cygpKSwKKyAgICAgICAgICAg
IHNldChbJ1NhbSBXZWluaWcnLCB1J01hcmsgUm93ZScsIHUnS2V2aW4gT2xsaXZpZXInLCAnTWFy
dGluIFJvYmluc29uJywgdSdQaGlsaXBwZSBOb3JtYW5kJywgdSdaYW4gRG9iZXJzZWsnXSkpCisK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbmFseXplci5jb250cmlidXRvcnNfc3RhdGlzdGlj
cygpWydTYW0gV2VpbmlnJ10sCisgICAgICAgICAgICB7J3Jldmlld3MnOiB7J2ZpbGVzJzoge3Un
Zm9vL3BsYXRmb3JtL21hYy9XZWJDb3JlTlNTdHJpbmdFeHRyYXMubW0nOiAxLCB1J2Zvby9wbGF0
Zm9ybS9uZXR3b3JrL2NmL1NvY2tldFN0cmVhbUhhbmRsZUNGTmV0LmNwcCc6IDF9LAorICAgICAg
ICAgICAgJ3RvdGFsJzogMSwgJ2FyZWFzJzogeydOZXR3b3JrJzogMX19LCAncGF0Y2hlcyc6IHsn
ZmlsZXMnOiB7fSwgJ2FyZWFzJzoge30sICd1bnJldmlld2VkJzogMCwgJ3Jldmlld2VkJzogMH19
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFuYWx5emVyLmNvbnRyaWJ1dG9yc19zdGF0aXN0
aWNzKClbdSdNYXJrIFJvd2UnXSwKKyAgICAgICAgICAgIHsncmV2aWV3cyc6IHsnZmlsZXMnOiB7
fSwgJ3RvdGFsJzogMCwgJ2FyZWFzJzoge319LCAncGF0Y2hlcyc6IHsnZmlsZXMnOiB7dSdmb28v
cGxhdGZvcm0vbWFjL1dlYkNvcmVOU1N0cmluZ0V4dHJhcy5tbSc6IDEsCisgICAgICAgICAgICB1
J2Zvby9wbGF0Zm9ybS9uZXR3b3JrL2NmL1NvY2tldFN0cmVhbUhhbmRsZUNGTmV0LmNwcCc6IDF9
LCAnYXJlYXMnOiB7J05ldHdvcmsnOiAxfSwgJ3VucmV2aWV3ZWQnOiAwLCAncmV2aWV3ZWQnOiAx
fX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW5hbHl6ZXIuY29udHJpYnV0b3JzX3N0YXRp
c3RpY3MoKVt1J0tldmluIE9sbGl2aWVyJ10sCisgICAgICAgICAgICB7J3Jldmlld3MnOiB7J2Zp
bGVzJzoge30sICd0b3RhbCc6IDAsICdhcmVhcyc6IHt9fSwgJ3BhdGNoZXMnOiB7J2ZpbGVzJzog
e3UnZm9vL2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvckNQUC5wbSc6IDF9LAorICAgICAg
ICAgICAgICAgICdhcmVhcyc6IHsnQmluZGluZ3MnOiAxfSwgJ3VucmV2aWV3ZWQnOiAxLCAncmV2
aWV3ZWQnOiAwfX0pCisKKyAgICAgICAgZmlsZXNfZm9yX2F1ZGlvX3BhdGNoID0ge3UnZm9vL0dO
VW1ha2VmaWxlLmFtJzogMSwgdSdmb28vR05VbWFrZWZpbGUubGlzdC5hbSc6IDEsICdmb28vcGxh
dGZvcm0vYXVkaW8vZ3N0cmVhbWVyL0F1ZGlvRGVzdGluYXRpb25HU3RyZWFtZXIuY3BwJzogMSwK
KyAgICAgICAgICAgICdmb28vcGxhdGZvcm0vYXVkaW8vZ3N0cmVhbWVyL0F1ZGlvRGVzdGluYXRp
b25HU3RyZWFtZXIuaCc6IDEsICdmb28vcGxhdGZvcm0vYXVkaW8vZ3N0cmVhbWVyL0F1ZGlvRmls
ZVJlYWRlckdTdHJlYW1lci5jcHAnOiAxLAorICAgICAgICAgICAgJ2Zvby9wbGF0Zm9ybS9hdWRp
by9ndGsvQXVkaW9CdXNHdGsuY3BwJzogMX0KKyAgICAgICAgYXV0aG9yX2V4cGVjdGF0aW9uX2Zv
cl9hdWRpb19wYXRjaCA9IHsncmV2aWV3cyc6IHsnZmlsZXMnOiB7fSwgJ3RvdGFsJzogMCwgJ2Fy
ZWFzJzoge319LAorICAgICAgICAgICAgJ3BhdGNoZXMnOiB7J2ZpbGVzJzogZmlsZXNfZm9yX2F1
ZGlvX3BhdGNoLCAnYXJlYXMnOiB7J1RoZSBXZWJLaXRHVEsrIFBvcnQnOiAxfSwgJ3VucmV2aWV3
ZWQnOiAwLCAncmV2aWV3ZWQnOiAxfX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbmFseXpl
ci5jb250cmlidXRvcnNfc3RhdGlzdGljcygpW3UnTWFydGluIFJvYmluc29uJ10sCisgICAgICAg
ICAgICB7J3Jldmlld3MnOiB7J2ZpbGVzJzogZmlsZXNfZm9yX2F1ZGlvX3BhdGNoLCAndG90YWwn
OiAxLCAnYXJlYXMnOiB7J1RoZSBXZWJLaXRHVEsrIFBvcnQnOiAxfX0sCisgICAgICAgICAgICAg
ICAgJ3BhdGNoZXMnOiB7J2ZpbGVzJzoge30sICdhcmVhcyc6IHt9LCAndW5yZXZpZXdlZCc6IDAs
ICdyZXZpZXdlZCc6IDB9fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbmFseXplci5jb250
cmlidXRvcnNfc3RhdGlzdGljcygpW3UnUGhpbGlwcGUgTm9ybWFuZCddLCBhdXRob3JfZXhwZWN0
YXRpb25fZm9yX2F1ZGlvX3BhdGNoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFuYWx5emVy
LmNvbnRyaWJ1dG9yc19zdGF0aXN0aWNzKClbdSdaYW4gRG9iZXJzZWsnXSwgYXV0aG9yX2V4cGVj
dGF0aW9uX2Zvcl9hdWRpb19wYXRjaCkKKworICAgICAgICBhcmVhc19zdGF0aXN0aWNzID0gYW5h
bHl6ZXIuYXJlYXNfc3RhdGlzdGljcygpCisgICAgICAgIGFyZWFzX3dpdGhfcGF0Y2hlcyA9IFth
cmVhIGZvciBhcmVhIGluIGFyZWFzX3N0YXRpc3RpY3MgaWYgYXJlYXNfc3RhdGlzdGljc1thcmVh
XVsncmV2aWV3ZWQnXSBvciBhcmVhc19zdGF0aXN0aWNzW2FyZWFdWyd1bnJldmlld2VkJ11dCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGFyZWFzX3dpdGhfcGF0Y2hlcyksIHNldChbJ0Jp
bmRpbmdzJywgJ05ldHdvcmsnLCAnVGhlIFdlYktpdEdUSysgUG9ydCddKSkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbChhcmVhc19zdGF0aXN0aWNzWydCaW5kaW5ncyddLCB7J3VucmV2aWV3ZWQn
OiAxLCAncmV2aWV3ZWQnOiAwLCAnY29udHJpYnV0b3JzJzoKKyAgICAgICAgICAgIHt1J0tldmlu
IE9sbGl2aWVyJzogeydyZXZpZXdzJzogMCwgJ3VucmV2aWV3ZWQnOiAxLCAncmV2aWV3ZWQnOiAw
fX19KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZWFzX3N0YXRpc3RpY3NbJ05ldHdvcmsn
XSwgeyd1bnJldmlld2VkJzogMCwgJ3Jldmlld2VkJzogMSwgJ2NvbnRyaWJ1dG9ycyc6CisgICAg
ICAgICAgICB7J1NhbSBXZWluaWcnOiB7J3Jldmlld3MnOiAxLCAndW5yZXZpZXdlZCc6IDAsICdy
ZXZpZXdlZCc6IDB9LCB1J01hcmsgUm93ZSc6IHsncmV2aWV3cyc6IDAsICd1bnJldmlld2VkJzog
MCwgJ3Jldmlld2VkJzogMX19fSkKSW5kZXg6IFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdG9vbC9j
b21tYW5kcy9kYXRhL3N1bW1hcnkuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL3dl
YmtpdHB5L3Rvb2wvY29tbWFuZHMvZGF0YS9zdW1tYXJ5Lmh0bWwJKHJldmlzaW9uIDApCisrKyBU
b29scy9TY3JpcHRzL3dlYmtpdHB5L3Rvb2wvY29tbWFuZHMvZGF0YS9zdW1tYXJ5Lmh0bWwJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNDU1IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhl
YWQ+Cis8dGl0bGU+Q2hhbmdlTG9nIEFuYWx5c2lzPC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0
L2NzcyI+CisKK2JvZHkgeworICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhJyAnU2Vnb2UgVUkg
TGlnaHQnIHNhbnMtc2VyaWY7CisgICAgZm9udC13ZWlnaHQ6IDIwMDsKKyAgICBwYWRkaW5nOiAy
MHB4OworICAgIG1pbi13aWR0aDogMTIwMHB4OworfQorCisqIHsKKyAgICBwYWRkaW5nOiAwcHg7
CisgICAgbWFyZ2luOiAwcHg7CisgICAgYm9yZGVyOiAwcHg7Cit9CisKK2gxLCBoMiwgaDMgewor
ICAgIGZvbnQtd2VpZ2h0OiAyMDA7Cit9CisKK2gxIHsKKyAgICBtYXJnaW46IDAgMCAxZW0gMDsK
K30KKworaDIgeworICAgIGZvbnQtc2l6ZTogMS4yZW07CisgICAgdGV4dC1hbGlnbjogY2VudGVy
OworICAgIG1hcmdpbi1ib3R0b206IDFlbTsKK30KKworaDMgeworICAgIGZvbnQtc2l6ZTogMWVt
OworfQorCisudmlldyB7CisgICAgbWFyZ2luOiAwcHg7CisgICAgd2lkdGg6IDYwMHB4OworICAg
IGZsb2F0OiBsZWZ0OworfQorCisuZ3JhcGgtY29udGFpbmVyIHAgeworICAgIHdpZHRoOiAyMDBw
eDsKKyAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICBtYXJnaW46IDIwcHggMCAyMHB4IDA7Cisg
ICAgcGFkZGluZzogNXB4OworICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4IGJsYWNrOworfQor
CisuZ3JhcGgtY29udGFpbmVyIHRhYmxlIHsKKyAgICB3aWR0aDogMTAwJTsKK30KKworLmdyYXBo
LWNvbnRhaW5lciB0YWJsZSwgLmdyYXBoLWNvbnRhaW5lciB0ZCB7CisgICAgYm9yZGVyLWNvbGxh
cHNlOiBjb2xsYXBzZTsKKyAgICBib3JkZXI6IG5vbmU7Cit9CisKKy5ncmFwaC1jb250YWluZXIg
dGQgeworICAgIHBhZGRpbmc6IDVweDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogY2VudGVyOworfQor
CisuZ3JhcGgtY29udGFpbmVyIHRkOmZpcnN0LWNoaWxkIHsKKyAgICB3aWR0aDogMjAwcHg7Cisg
ICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggYmxhY2s7
Cit9CisKKy5ncmFwaC1jb250YWluZXIgLnNlbGVjdGVkIHsKKyAgICBiYWNrZ3JvdW5kOiAjZWVl
OworfQorCisjcmV2aWV3ZXJzIC5zZWxlY3RlZCB0ZDpmaXJzdC1jaGlsZCB7CisgICAgYm9yZGVy
LXJhZGl1czogMTBweCAwcHggMHB4IDEwcHg7Cit9CisKKyNhcmVhcyAuc2VsZWN0ZWQgdGQ6bGFz
dC1jaGlsZCB7CisgICAgYm9yZGVyLXJhZGl1czogMHB4IDEwcHggMTBweCAwcHg7Cit9CisKKy5n
cmFwaC1jb250YWluZXIgLmJhciB7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIG1p
bi1oZWlnaHQ6IDFlbTsKKyAgICBiYWNrZ3JvdW5kOiAjOWY2OworICAgIG1hcmdpbi1yaWdodDog
MC40ZXg7Cit9CisKKy5ncmFwaC1jb250YWluZXIgLnJldmlld2VkLXBhdGNoZXMgeworICAgIGJh
Y2tncm91bmQ6ICMzY2Y7CisgICAgbWFyZ2luLXJpZ2h0OiAxcHg7Cit9CisKKy5ncmFwaC1jb250
YWluZXIgLnVucmV2aWV3ZWQtcGF0Y2hlcyB7CisgICAgYmFja2dyb3VuZDogI2Y5OTsKK30KKwor
LmNvbnN0cmFpbmVkIHsKKyAgICBiYWNrZ3JvdW5kOiAjZWVlOworICAgIGJvcmRlci1yYWRpdXM6
IDEwcHg7Cit9CisKKy5jb25zdHJhaW5lZCAudmVydGljYWwtYmFyIHsKKyAgICBib3JkZXItcmln
aHQ6IHNvbGlkIDFweCAjZWVlOworfQorCisjaGVhZGVyIHsKKyAgICBib3JkZXItc3BhY2luZzog
NXB4OworfQorCisjaGVhZGVyIHNlY3Rpb24geworICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7Cisg
ICAgd2lkdGg6IDIwMHB4OworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgYm9yZGVyOiBz
b2xpZCAycHggI2NjYzsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgIHBhZGRp
bmc6IDVweDsKKyAgICBmb250LXNpemU6IDAuOGVtOworfQorCisjaGVhZGVyIGR0IHsKKyAgICBm
bG9hdDogbGVmdDsKK30KKworI2hlYWRlciBkdDphZnRlciB7CisgICAgY29udGVudDogJzogJzsK
K30KKworI2hlYWRlciAubGVnZW5kIHsKKyAgICB3aWR0aDogNjAwcHg7Cit9CisKKy5sZWdlbmQg
LmJhciB7CisgICAgd2lkdGg6IDE1ZXg7CisgICAgcGFkZGluZzogMnB4OworfQorCisubGVnZW5k
IC5yZXZpZXdzIHsKKyAgICB3aWR0aDogMjVleDsKK30KKworLmxlZ2VuZCB0ZDpmaXJzdC1jaGls
ZCB7CisgICAgd2lkdGg6IDE4ZXg7Cit9CisKKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxo
MT5DaGFuZ2VMb2cgQW5hbHlzaXM8L2gxPgorCis8c2VjdGlvbiBpZD0iaGVhZGVyIj4KKzxzZWN0
aW9uIGlkPSJzdW1tYXJ5Ij4KKzxoMj5TdW1tYXJ5PC9oMj4KKzwvc2VjdGlvbj4KKworPHNlY3Rp
b24gY2xhc3M9ImxlZ2VuZCI+Cis8aDI+TGVnZW5kPC9oMj4KKzxkaXYgY2xhc3M9ImdyYXBoLWNv
bnRhaW5lciI+Cis8dGFibGU+Cis8dGJvZHk+Cis8dHI+PHRkPkNvbnRyaWJ1dG9yJ3MgbmFtZTwv
dGQ+Cis8dGQ+PHNwYW4gY2xhc3M9ImJhciByZXZpZXdzIj5SZXZpZXdzPC9zcGFuPiA8c3BhbiBj
bGFzcz0idmFsdWUtY29udGFpbmVyIj4oIyBvZiByZXZpZXdzKTwvc3Bhbj48YnI+Cis8c3BhbiBj
bGFzcz0iYmFyIHJldmlld2VkLXBhdGNoZXMiPlJldmlld2VkPC9zcGFuPjxzcGFuIGNsYXNzPSJi
YXIgdW5yZXZpZXdlZC1wYXRjaGVzIj5VbnJldmlld2VkPC9zcGFuPgorPHNwYW4gY2xhc3M9InZh
bHVlLWNvbnRhaW5lciI+KCMgb2YgcmV2aWV3ZWQpOigjIG9mIHVucmV2aWV3ZWQpPC9zcGFuPjwv
dGQ+PC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPC9kaXY+Cis8L3NlY3Rpb24+Cis8L3NlY3Rp
b24+CisKKzxzZWN0aW9uIGlkPSJjb250cmlidXRvcnMiIGNsYXNzPSJ2aWV3Ij4KKzxoMiBpZD0i
Y29udHJpYnV0b3JzLXRpdGxlIj5Db250cmlidXRvcnM8L2gyPgorPGRpdiBjbGFzcz0iZ3JhcGgt
Y29udGFpbmVyIj48L2Rpdj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gaWQ9ImFyZWFzIiBjbGFz
cz0idmlldyI+Cis8aDIgaWQ9ImFyZWFzLXRpdGxlIj5BcmVhcyBvZiBjb250cmlidXRpb25zPC9o
Mj4KKzxkaXYgY2xhc3M9ImdyYXBoLWNvbnRhaW5lciI+PC9kaXY+Cis8L3NlY3Rpb24+CisKKzxz
Y3JpcHQ+CisKKy8vIE5haXZlIGltcGxlbWVudGF0aW9uIG9mIGVsZW1lbnQgZXh0ZW5zaW9ucyBk
aXNjdXNzZWQgb24gcHVibGljLXdlYmFwcHMKKworaWYgKCFFbGVtZW50LnByb3RvdHlwZS5hcHBl
bmQpIHsKKyAgICBFbGVtZW50LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoKSB7CisgICAg
ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAg
ICAgICAvLyBGSVhNRTogVGFrZSBjYXJlIG9mIG90aGVyIG5vZGUgdHlwZXMKKyAgICAgICAgICAg
IGlmIChhcmd1bWVudHNbaV0gaW5zdGFuY2VvZiBFbGVtZW50IHx8IGFyZ3VtZW50c1tpXSBpbnN0
YW5jZW9mIENoYXJhY3RlckRhdGEpCisgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChh
cmd1bWVudHNbaV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRoaXMuYXBw
ZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYXJndW1lbnRzW2ldKSk7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQorCitpZiAoIU5vZGUucHJvdG90eXBl
LnJlbW92ZSkgeworICAgIE5vZGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHsKKyAg
ICAgICAgdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpOworICAgICAgICByZXR1cm4g
dGhpczsKKyAgICB9Cit9CisKK2lmICghRWxlbWVudC5jcmVhdGUpIHsKKyAgICBFbGVtZW50LmNy
ZWF0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKQor
ICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudChhcmd1bWVudHNbMF0pOworICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0
aCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICAgICAgLy8gRklYTUU6
IHRoZSBzZWNvbmQgYXJndW1lbnQgY2FuIGJlIGNvbnRlbnQgb3IgSURMIGF0dHJpYnV0ZXMKKyAg
ICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbMV07CisgICAgICAgIGZvciAoYXR0cmli
dXRlIGluIGF0dHJpYnV0ZXMpCisgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRy
aWJ1dGUsIGF0dHJpYnV0ZXNbYXR0cmlidXRlXSk7CisKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5s
ZW5ndGggPj0gMykKKyAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kLmFwcGx5KGVsZW1lbnQsIGFy
Z3VtZW50c1syXSk7CisKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorfQorCitpZiAo
IU5vZGUucHJvdG90eXBlLnJlbW92ZUFsbENoaWxkcmVuKSB7CisgICAgTm9kZS5wcm90b3R5cGUu
cmVtb3ZlQWxsQ2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIHdoaWxlICh0aGlzLmZp
cnN0Q2hpbGQpCisgICAgICAgICAgICB0aGlzLmZpcnN0Q2hpbGQucmVtb3ZlKCk7CisgICAgICAg
IHJldHVybiB0aGlzOworICAgIH0KK30KKworRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQ2xhc3NO
YW1lRnJvbUFsbEVsZW1lbnRzID0gZnVuY3Rpb24gKGNsYXNzTmFtZSkgeworICAgIHZhciBlbGVt
ZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpOworICAgIGZvciAo
dmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCisgICAgICAgIGVsZW1lbnRzW2ld
LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTsKK30KKworZnVuY3Rpb24gZ2V0SlNPTih1cmws
IGNhbGxiYWNrKSB7CisgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICAgIHho
ci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpOworICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBm
dW5jdGlvbiAoKSB7CisgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCkKKyAgICAgICAg
ICAgIGNhbGxiYWNrKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpOworICAgIH0KKyAgICB4
aHIuc2VuZCgpOworfQorCitmdW5jdGlvbiBHcmFwaFZpZXcoY29udGFpbmVyKSB7CisgICAgdGhp
cy5fY29udGFpbmVyID0gY29udGFpbmVyOworICAgIHRoaXMuX2RlZmF1bHREYXRhID0gbnVsbDsK
K30KKworR3JhcGhWaWV3LnByb3RvdHlwZS5zZXREYXRhID0gZnVuY3Rpb24oZGF0YSwgY29uc3Ry
YWluZWQpIHsKKyAgICBpZiAoY29uc3RyYWluZWQpCisgICAgICAgIHRoaXMuX2NvbnRhaW5lci5j
bGFzc0xpc3QuYWRkKCdjb25zdHJhaW5lZCcpOworICAgIGVsc2UKKyAgICAgICAgdGhpcy5fY29u
dGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2NvbnN0cmFpbmVkJyk7CisgICAgdGhpcy5fY2xlYXJH
cmFwaCgpOworICAgIHRoaXMuX2NvbnN0cnVjdEdyYXBoKGRhdGEpOworfQorCitHcmFwaFZpZXcu
cHJvdG90eXBlLnNldERlZmF1bHREYXRhID0gZnVuY3Rpb24oZGF0YSkgeworICAgIHRoaXMuX2Rl
ZmF1bHREYXRhID0gZGF0YTsKKyAgICB0aGlzLnNldERhdGEoZGF0YSk7Cit9CisKK0dyYXBoVmll
dy5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7CisgICAgdGhpcy5zZXRNYXJnaW5Ub3Ao
KTsKKyAgICB0aGlzLnNldERhdGEodGhpcy5fZGVmYXVsdERhdGEpOworfQorCitHcmFwaFZpZXcu
cHJvdG90eXBlLmlzQ29uc3RyYWluZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jb250
YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb25zdHJhaW5lZCcpOyB9CisKK0dyYXBoVmlldy5w
cm90b3R5cGUudGFyZ2V0Um93ID0gZnVuY3Rpb24gKG5vZGUpIHsKKyAgICB2YXIgdGFyZ2V0ID0g
bnVsbDsKKworICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT0gdGhpcy5fY29udGFpbmVyKSB7Cisg
ICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndHInKQorICAgICAgICAgICAgdGFyZ2V0ID0g
bm9kZTsKKyAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKyAgICB9CisKKyAgICByZXR1
cm4gbm9kZSAmJiB0YXJnZXQ7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5cGUuc2VsZWN0Um93ID0g
ZnVuY3Rpb24gKHJvdykgeworICAgIHRoaXMuX2NvbnRhaW5lci5yZW1vdmVDbGFzc05hbWVGcm9t
QWxsRWxlbWVudHMoJ3NlbGVjdGVkJyk7CisgICAgcm93LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVk
Jyk7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5cGUuc2V0TWFyZ2luVG9wID0gZnVuY3Rpb24gKHkp
IHsgdGhpcy5fY29udGFpbmVyLnN0eWxlLm1hcmdpblRvcCA9IHkgPyB5ICsgJ3B4JyA6IG51bGw7
IH0KK0dyYXBoVmlldy5wcm90b3R5cGUuX2dyYXBoQ29udGFpbmVyID0gZnVuY3Rpb24gKCkgeyBy
ZXR1cm4gdGhpcy5fY29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2dyYXBoLWNvbnRh
aW5lcicpWzBdOyB9CitHcmFwaFZpZXcucHJvdG90eXBlLl9jbGVhckdyYXBoID0gZnVuY3Rpb24g
KCkgeyByZXR1cm4gdGhpcy5fZ3JhcGhDb250YWluZXIoKS5yZW1vdmVBbGxDaGlsZHJlbigpOyB9
CisKK0dyYXBoVmlldy5wcm90b3R5cGUuX251bWJlck9mUGF0Y2hlcyA9IGZ1bmN0aW9uIChkYXRh
SXRlbSkgeworICAgIHJldHVybiBkYXRhSXRlbS5udW1iZXJPZlJldmlld2VkUGF0Y2hlcyArIChk
YXRhSXRlbS5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzICE9PSB1bmRlZmluZWQgPyBkYXRhSXRl
bS5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzIDogMCk7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5
cGUuX21heGltdW1WYWx1ZSA9IGZ1bmN0aW9uIChsYWJlbHMsIGRhdGEpIHsKKyAgICB2YXIgbnVt
YmVyT2ZQYXRjaGVzID0gdGhpcy5fbnVtYmVyT2ZQYXRjaGVzOworICAgIHJldHVybiBNYXRoLm1h
eC5hcHBseShudWxsLCBsYWJlbHMubWFwKGZ1bmN0aW9uIChsYWJlbCkgeworICAgICAgICByZXR1
cm4gTWF0aC5tYXgobnVtYmVyT2ZQYXRjaGVzKGRhdGFbbGFiZWxdKSwgZGF0YVtsYWJlbF0ubnVt
YmVyT2ZSZXZpZXdzICE9PSB1bmRlZmluZWQgPyBkYXRhW2xhYmVsXS5udW1iZXJPZlJldmlld3Mg
OiAwKTsKKyAgICB9KSk7Cit9CisKK0dyYXBoVmlldy5wcm90b3R5cGUuX3NvcnRMYWJlbHNCeU51
bWJlck9mUmV2aXdzQW5kUmV2aWV3ZWRQYXRjaGVzID0gZnVuY3Rpb24oZGF0YSkgeworICAgIHZh
ciBsYWJlbHMgPSBPYmplY3Qua2V5cyhkYXRhKTsKKyAgICBpZiAoIWxhYmVscy5sZW5ndGgpCisg
ICAgICAgIHJldHVybiBudWxsOworICAgIHZhciBudW1iZXJPZlBhdGNoZXMgPSB0aGlzLl9udW1i
ZXJPZlBhdGNoZXM7CisgICAgdmFyIGNvbXB1dGVWYWx1ZSA9IGZ1bmN0aW9uIChkYXRhSXRlbSkg
eworICAgICAgICByZXR1cm4gbnVtYmVyT2ZQYXRjaGVzKGRhdGFJdGVtKSArIChkYXRhSXRlbS5u
dW1iZXJPZlJldmlld3MgIT09IHVuZGVmaW5lZCA/IGRhdGFJdGVtLm51bWJlck9mUmV2aWV3cyA6
IDApOworICAgIH0KKyAgICBsYWJlbHMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gY29t
cHV0ZVZhbHVlKGRhdGFbYl0pIC0gY29tcHV0ZVZhbHVlKGRhdGFbYV0pOyB9KTsKKyAgICByZXR1
cm4gbGFiZWxzOworfQorCitHcmFwaFZpZXcucHJvdG90eXBlLl9jb25zdHJ1Y3RHcmFwaCA9IGZ1
bmN0aW9uIChkYXRhKSB7CisgICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9ncmFwaENvbnRhaW5lcigp
OworICAgIHZhciBsYWJlbHMgPSB0aGlzLl9zb3J0TGFiZWxzQnlOdW1iZXJPZlJldml3c0FuZFJl
dmlld2VkUGF0Y2hlcyhkYXRhKTsKKyAgICBpZiAoIWxhYmVscykgeworICAgICAgICBlbGVtZW50
LmFwcGVuZChFbGVtZW50LmNyZWF0ZSgncCcsIHt9LCBbJ05vbmUnXSkpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgdmFyIG1heFZhbHVlID0gdGhpcy5fbWF4aW11bVZhbHVlKGxhYmVs
cywgZGF0YSk7CisgICAgdmFyIGNvbXB1dGVTdHlsZUZvckJhciA9IGZ1bmN0aW9uICh2YWx1ZSkg
eyByZXR1cm4gJ3dpZHRoOicgKyAodmFsdWUgKiA4NS4wIC8gbWF4VmFsdWUpICsgJyUnIH0KKwor
ICAgIHZhciB0YWJsZSA9IEVsZW1lbnQuY3JlYXRlKCd0YWJsZScsIHt9LCBbRWxlbWVudC5jcmVh
dGUoJ3Rib2R5JyldKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7IGkr
KykgeworICAgICAgICB2YXIgbGFiZWwgPSBsYWJlbHNbaV07CisgICAgICAgIHZhciBpdGVtID0g
ZGF0YVtsYWJlbF07CisgICAgICAgIHZhciByb3cgPSBFbGVtZW50LmNyZWF0ZSgndHInLCB7fSwg
W0VsZW1lbnQuY3JlYXRlKCd0ZCcsIHt9LCBbbGFiZWxdKSwgRWxlbWVudC5jcmVhdGUoJ3RkJywg
e30pXSk7CisgICAgICAgIHZhciB2YWx1ZUNlbGwgPSByb3cubGFzdENoaWxkOworCisgICAgICAg
IGlmIChpdGVtLm51bWJlck9mUmV2aWV3cyAhPSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgIHZh
bHVlQ2VsbC5hcHBlbmQoCisgICAgICAgICAgICAgICAgRWxlbWVudC5jcmVhdGUoJ3NwYW4nLCB7
J2NsYXNzJzogJ2JhciByZXZpZXdzJywgJ3N0eWxlJzogY29tcHV0ZVN0eWxlRm9yQmFyKGl0ZW0u
bnVtYmVyT2ZSZXZpZXdzKSB9KSwKKyAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZSgnc3Bh
bicsIHsnY2xhc3MnOiAndmFsdWUtY29udGFpbmVyJ30sIFtpdGVtLm51bWJlck9mUmV2aWV3c10p
LAorICAgICAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlKCdicicpCisgICAgICAgICAgICApOwor
ICAgICAgICB9CisKKyAgICAgICAgdmFsdWVDZWxsLmFwcGVuZChFbGVtZW50LmNyZWF0ZSgnc3Bh
bicsIHsnY2xhc3MnOiAnYmFyIHJldmlld2VkLXBhdGNoZXMnLCAnc3R5bGUnOiBjb21wdXRlU3R5
bGVGb3JCYXIoaXRlbS5udW1iZXJPZlJldmlld2VkUGF0Y2hlcykgfSkpOworICAgICAgICBpZiAo
aXRlbS5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzICE9PSB1bmRlZmluZWQpCisgICAgICAgICAg
ICB2YWx1ZUNlbGwuYXBwZW5kKEVsZW1lbnQuY3JlYXRlKCdzcGFuJywgeydjbGFzcyc6ICdiYXIg
dW5yZXZpZXdlZC1wYXRjaGVzJywgJ3N0eWxlJzogY29tcHV0ZVN0eWxlRm9yQmFyKGl0ZW0ubnVt
YmVyT2ZVbnJldmlld2VkUGF0Y2hlcykgfSkpOworCisgICAgICAgIHZhbHVlQ2VsbC5hcHBlbmQo
RWxlbWVudC5jcmVhdGUoJ3NwYW4nLCB7J2NsYXNzJzogJ3ZhbHVlLWNvbnRhaW5lcid9LAorICAg
ICAgICAgICAgW2l0ZW0ubnVtYmVyT2ZSZXZpZXdlZFBhdGNoZXMgKyAoaXRlbS5udW1iZXJPZlVu
cmV2aWV3ZWRQYXRjaGVzICE9PSB1bmRlZmluZWQgPyAnOicgKyBpdGVtLm51bWJlck9mVW5yZXZp
ZXdlZFBhdGNoZXMgOiAnJyldKSk7CisKKyAgICAgICAgdGFibGUuZmlyc3RDaGlsZC5hcHBlbmQo
cm93KTsKKyAgICAgICAgcm93LmxhYmVsID0gbGFiZWw7CisgICAgICAgIHJvdy5kYXRhID0gaXRl
bTsKKyAgICB9CisgICAgZWxlbWVudC5hcHBlbmQodGFibGUpOworfQorCit2YXIgY29udHJpYnV0
b3JzVmlldyA9IG5ldyBHcmFwaFZpZXcoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRyaWJ1
dG9ycycpKTsKK3ZhciBhcmVhc1ZpZXcgPSBuZXcgR3JhcGhWaWV3KGRvY3VtZW50LnF1ZXJ5U2Vs
ZWN0b3IoJyNhcmVhcycpKTsKKworZ2V0SlNPTignc3VtbWFyeS5qc29uJywKKyAgICBmdW5jdGlv
biAoc3VtbWFyeSkgeworICAgICAgICB2YXIgc3VtbWFyeUNvbnRhaW5lciA9IGRvY3VtZW50LnF1
ZXJ5U2VsZWN0b3IoJyNzdW1tYXJ5Jyk7CisgICAgICAgIHN1bW1hcnlDb250YWluZXIuYXBwZW5k
KEVsZW1lbnQuY3JlYXRlKCdkbCcsIHt9LCBbCisgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZSgn
ZHQnLCB7fSwgWydUb3RhbCBlbnRyaWVzIChyZXZpZXdlZCknXSksCisgICAgICAgICAgICBFbGVt
ZW50LmNyZWF0ZSgnZGQnLCB7fSwgWyhzdW1tYXJ5WydyZXZpZXdlZCddICsgc3VtbWFyeVsndW5y
ZXZpZXdlZCddKSArICcgKCcgKyBzdW1tYXJ5WydyZXZpZXdlZCddICsgJyknXSksCisgICAgICAg
ICAgICBFbGVtZW50LmNyZWF0ZSgnZHQnLCB7fSwgWydUb3RhbCBjb250cmlidXRvcnMnXSksCisg
ICAgICAgICAgICBFbGVtZW50LmNyZWF0ZSgnZGQnLCB7fSwgW3N1bW1hcnlbJ2NvbnRyaWJ1dG9y
cyddXSksCisgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZSgnZHQnLCB7fSwgWydDb250cmlidXRv
cnMgd2hvIHJldmlld2VkJ10pLAorICAgICAgICAgICAgRWxlbWVudC5jcmVhdGUoJ2RkJywge30s
IFtzdW1tYXJ5Wydjb250cmlidXRvcnNfd2l0aF9yZXZpZXdzJ11dKSwKKyAgICAgICAgXSkpOwor
ICAgIH0pOworCitnZXRKU09OKCdjb250cmlidXRvcnMuanNvbicsCisgICAgZnVuY3Rpb24gKGNv
bnRyaWJ1dG9ycykgeworICAgICAgICBmb3IgKHZhciBjb250cmlidXRvciBpbiBjb250cmlidXRv
cnMpIHsKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yID0gY29udHJpYnV0b3JzW2NvbnRyaWJ1dG9y
XTsKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yLm51bWJlck9mUmV2aWV3cyA9IGNvbnRyaWJ1dG9y
LnJldmlld3MgPyBjb250cmlidXRvci5yZXZpZXdzLnRvdGFsIDogMDsKKyAgICAgICAgICAgIGNv
bnRyaWJ1dG9yLm51bWJlck9mUmV2aWV3ZWRQYXRjaGVzID0gY29udHJpYnV0b3IucGF0Y2hlcyA/
IGNvbnRyaWJ1dG9yLnBhdGNoZXMucmV2aWV3ZWQgOiAwOworICAgICAgICAgICAgY29udHJpYnV0
b3IubnVtYmVyT2ZVbnJldmlld2VkUGF0Y2hlcyA9IGNvbnRyaWJ1dG9yLnBhdGNoZXMgPyBjb250
cmlidXRvci5wYXRjaGVzLnVucmV2aWV3ZWQgOiAwOworICAgICAgICB9CisgICAgICAgIGNvbnRy
aWJ1dG9yc1ZpZXcuc2V0RGVmYXVsdERhdGEoY29udHJpYnV0b3JzKTsKKyAgICB9KTsKKworZ2V0
SlNPTignYXJlYXMuanNvbicsCisgICAgZnVuY3Rpb24gKGFyZWFzKSB7CisgICAgICAgIGZvciAo
dmFyIGFyZWEgaW4gYXJlYXMpIHsKKyAgICAgICAgICAgIGFyZWFzW2FyZWFdLm51bWJlck9mUmV2
aWV3ZWRQYXRjaGVzID0gYXJlYXNbYXJlYV0ucmV2aWV3ZWQ7CisgICAgICAgICAgICBhcmVhc1th
cmVhXS5udW1iZXJPZlVucmV2aWV3ZWRQYXRjaGVzID0gYXJlYXNbYXJlYV0udW5yZXZpZXdlZDsK
KyAgICAgICAgfQorICAgICAgICBhcmVhc1ZpZXcuc2V0RGVmYXVsdERhdGEoYXJlYXMpOworICAg
IH0pOworCitmdW5jdGlvbiBjb250cmlidXRvckFyZWFzKGNvbnRyaWJ1dG9yRGF0YSkgeworICAg
IHZhciBhcmVhcyA9IG5ldyBPYmplY3Q7CisgICAgZm9yICh2YXIgYXJlYSBpbiBjb250cmlidXRv
ckRhdGEucmV2aWV3cy5hcmVhcykgeworICAgICAgICBpZiAoIWFyZWFzW2FyZWFdKQorICAgICAg
ICAgICAgYXJlYXNbYXJlYV0gPSB7J251bWJlck9mUmV2aWV3ZWRQYXRjaGVzJzogMH07CisgICAg
ICAgIGFyZWFzW2FyZWFdLm51bWJlck9mUmV2aWV3cyA9IGNvbnRyaWJ1dG9yRGF0YS5yZXZpZXdz
LmFyZWFzW2FyZWFdOworICAgIH0KKyAgICBmb3IgKHZhciBhcmVhIGluIGNvbnRyaWJ1dG9yRGF0
YS5wYXRjaGVzLmFyZWFzKSB7CisgICAgICAgIGlmICghYXJlYXNbYXJlYV0pCisgICAgICAgICAg
ICBhcmVhc1thcmVhXSA9IHsnbnVtYmVyT2ZSZXZpZXdzJzogMH07CisgICAgICAgIGFyZWFzW2Fy
ZWFdLm51bWJlck9mUmV2aWV3ZWRQYXRjaGVzID0gY29udHJpYnV0b3JEYXRhLnBhdGNoZXMuYXJl
YXNbYXJlYV07CisgICAgfQorICAgIHJldHVybiBhcmVhczsKK30KKworZnVuY3Rpb24gYXJlYUNv
bnRyaWJ1dG9ycyhhcmVhRGF0YSkgeworICAgIHZhciBjb250cmlidXRvcnMgPSBhcmVhRGF0YVsn
Y29udHJpYnV0b3JzJ107CisgICAgZm9yICh2YXIgY29udHJpYnV0b3IgaW4gY29udHJpYnV0b3Jz
KSB7CisgICAgICAgIGNvbnRyaWJ1dG9yID0gY29udHJpYnV0b3JzW2NvbnRyaWJ1dG9yXTsKKyAg
ICAgICAgY29udHJpYnV0b3IubnVtYmVyT2ZSZXZpZXdzID0gY29udHJpYnV0b3IucmV2aWV3czsK
KyAgICAgICAgY29udHJpYnV0b3IubnVtYmVyT2ZSZXZpZXdlZFBhdGNoZXMgPSBjb250cmlidXRv
ci5yZXZpZXdlZDsKKyAgICAgICAgY29udHJpYnV0b3IubnVtYmVyT2ZVbnJldmlld2VkUGF0Y2hl
cyA9IGNvbnRyaWJ1dG9yLnVucmV2aWV3ZWQ7CisgICAgfQorICAgIHJldHVybiBjb250cmlidXRv
cnM7Cit9CisKK3ZhciBtb3VzZVRpbWVyID0gMDsKK3dpbmRvdy5vbm1vdXNlb3ZlciA9IGZ1bmN0
aW9uIChldmVudCkgeworICAgIGNsZWFyVGltZW91dChtb3VzZVRpbWVyKTsKKworICAgIHZhciBy
b3cgPSBjb250cmlidXRvcnNWaWV3LnRhcmdldFJvdyhldmVudC50YXJnZXQpOworICAgIGlmIChy
b3cpIHsKKyAgICAgICAgaWYgKCFjb250cmlidXRvcnNWaWV3LmlzQ29uc3RyYWluZWQoKSkgewor
ICAgICAgICAgICAgY29udHJpYnV0b3JzVmlldy5zZWxlY3RSb3cocm93KTsKKyAgICAgICAgICAg
IGFyZWFzVmlldy5zZXRNYXJnaW5Ub3Aocm93LmZpcnN0Q2hpbGQub2Zmc2V0VG9wKTsKKyAgICAg
ICAgICAgIGFyZWFzVmlldy5zZXREYXRhKGNvbnRyaWJ1dG9yQXJlYXMocm93LmRhdGEpLCAnY29u
c3RyYWluZWQnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcm93
ID0gYXJlYXNWaWV3LnRhcmdldFJvdyhldmVudC50YXJnZXQpOworICAgIGlmIChyb3cpIHsKKyAg
ICAgICAgaWYgKCFhcmVhc1ZpZXcuaXNDb25zdHJhaW5lZCgpKSB7CisgICAgICAgICAgICBhcmVh
c1ZpZXcuc2VsZWN0Um93KHJvdyk7CisgICAgICAgICAgICBjb250cmlidXRvcnNWaWV3LnNldE1h
cmdpblRvcChyb3cuZmlyc3RDaGlsZC5vZmZzZXRUb3ApOworICAgICAgICAgICAgY29udHJpYnV0
b3JzVmlldy5zZXREYXRhKGFyZWFDb250cmlidXRvcnMocm93LmRhdGEpLCAnY29uc3RyYWluZWQn
KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbW91c2VUaW1lciA9
IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICBjb250cmlidXRvcnNWaWV3LnJlc2V0
KCk7CisgICAgICAgIGFyZWFzVmlldy5yZXNldCgpOworICAgIH0sIDUwMCk7Cit9CisKKzwvc2Ny
aXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogVG9vbHMvU2NyaXB0cy93ZWJraXRweS90b29s
L3N0ZXBzL29wdGlvbnMucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy93ZWJraXRweS90
b29sL3N0ZXBzL29wdGlvbnMucHkJKHJldmlzaW9uIDEwMTkwMSkKKysrIFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvdG9vbC9zdGVwcy9vcHRpb25zLnB5CSh3b3JraW5nIGNvcHkpCkBAIC01OCwzICs1
OCw0IEBAIGNsYXNzIE9wdGlvbnMob2JqZWN0KToKICAgICBzdWdnZXN0X3Jldmlld2VycyA9IG1h
a2Vfb3B0aW9uKCItLXN1Z2dlc3QtcmV2aWV3ZXJzIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVm
YXVsdD1GYWxzZSwgaGVscD0iT2ZmZXIgdG8gQ0MgYXBwcm9wcmlhdGUgcmV2aWV3ZXJzLiIpCiAg
ICAgdGVzdCA9IG1ha2Vfb3B0aW9uKCItLXRlc3QiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0
PSJ0ZXN0IiwgZGVmYXVsdD1GYWxzZSwgaGVscD0iUnVuIHJ1bi13ZWJraXQtdGVzdHMgYmVmb3Jl
IGNvbW1pdHRpbmcuIikKICAgICB1cGRhdGUgPSBtYWtlX29wdGlvbigiLS1uby11cGRhdGUiLCBh
Y3Rpb249InN0b3JlX2ZhbHNlIiwgZGVzdD0idXBkYXRlIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJE
b24ndCB1cGRhdGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiIpCisgICAgY2hhbmdlbG9nX2NvdW50
ID0gbWFrZV9vcHRpb24oIi0tY2hhbmdlbG9nLWNvdW50IiwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9
ImludCIsIGRlc3Q9ImNoYW5nZWxvZ19jb3VudCIsIGhlbHA9Ik51bWJlciBvZiBjaGFuZ2Vsb2dz
IHRvIHBhcnNlLiIpCg==
</data>
<flag name="review"
          id="117286"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>