<?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>215712</bug_id>
          
          <creation_ts>2020-08-20 13:22:17 -0700</creation_ts>
          <short_desc>[webkitcorepy] Standard Popen mocking API</short_desc>
          <delta_ts>2020-08-26 14:01:24 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=214378</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jonathan Bedard">jbedard</reporter>
          <assigned_to name="Jonathan Bedard">jbedard</assigned_to>
          <cc>aakash_jain</cc>
    
    <cc>dean_johnson</cc>
    
    <cc>dewei_zhu</cc>
    
    <cc>jlewis3</cc>
    
    <cc>slewis</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1681791</commentid>
    <comment_count>0</comment_count>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2020-08-20 13:22:17 -0700</bug_when>
    <thetext>Tests frequently need to mock subprocess calls. It&apos;s not obvious, but all subprocess calls can be mocked by mocking Popen well. We should have common way of mocking subprocess calls that is thorough enough that code being tested does not have to consider the testing harness that will be testing it. (namely, I think the &quot;Executive&quot; idiom of webkitpy makes testing much harder)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1681792</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-08-20 13:22:34 -0700</bug_when>
    <thetext>&lt;rdar://problem/67501911&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1681799</commentid>
    <comment_count>2</comment_count>
      <attachid>406963</attachid>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2020-08-20 13:43:02 -0700</bug_when>
    <thetext>Created attachment 406963
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1681805</commentid>
    <comment_count>3</comment_count>
      <attachid>406963</attachid>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2020-08-20 13:53:27 -0700</bug_when>
    <thetext>Comment on attachment 406963
Patch

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

&gt; Tools/Scripts/libraries/webkitcorepy/README.md:85
&gt; +    ls=lambda args, input=None, cwd=None: mocks.ProcessCompletion(returncode=0, stdout=&apos;file1.txt\nfile2.txt\n&apos;),

The most interesting part of this PR, in my opinion, is actually the API for generating the mocked subprocess call. I&apos;ve already used this myself for prototyping some SCM tooling, and it seems both sufficiently flexible for complicated mocking while being short enough for more trivial use cases.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1682832</commentid>
    <comment_count>4</comment_count>
      <attachid>407245</attachid>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2020-08-25 15:52:08 -0700</bug_when>
    <thetext>Created attachment 407245
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1682847</commentid>
    <comment_count>5</comment_count>
    <who name="Matt Lewis">jlewis3</who>
    <bug_when>2020-08-25 16:41:50 -0700</bug_when>
    <thetext>Talked offline, but I think the api for unit testing and integration testing could use a bit of simplification.

rather than with mocks.Subprocess(mocks.Subprocess.Router(&apos;ls&apos;, completion=mocks.ProcessCompletion(returncode=0, stdout=&apos;file1.txt\nfile2.txt\n&apos;),)):

we should have something a bit easier a la:
with mocks.Subprocess(&apos;ls&apos;,completion=mocks.ProcessCompletion(returncode=0, stdout=&apos;file1.txt\nfile2.txt\n&apos;), )):

and
(found by back an forth with Jonathan)

mocks.Subprocess.group_commands(
    mocks.Subprocess.Router(...),
    mocks.Subprocess.Router(...),
):

for unit and integration tests respectively.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1682852</commentid>
    <comment_count>6</comment_count>
      <attachid>407245</attachid>
    <who name="">dewei_zhu</who>
    <bug_when>2020-08-25 16:55:17 -0700</bug_when>
    <thetext>Comment on attachment 407245
Patch

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

&gt; Tools/Scripts/libraries/webkitcorepy/webkitcorepy/mocks/popen.py:43
&gt; +    if sys.version_info &gt; (3, 0):

I still see a lot of things in common in the implementation of __init__, communicate and etc.
Wouldn&apos;t it be much clearer if we have a base class?
```
class PopenBase(object):
      def __init__
...

if sys.version_info &gt; (3, 0):
    class Popen(PopenBase):
        def __init__
        def __enter__
        def __exit__
        ...
else:
    class Popen(PopenBase):
        ...
```</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683031</commentid>
    <comment_count>7</comment_count>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2020-08-26 10:40:02 -0700</bug_when>
    <thetext>(In reply to dewei_zhu from comment #6)
&gt; Comment on attachment 407245 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=407245&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/libraries/webkitcorepy/webkitcorepy/mocks/popen.py:43
&gt; &gt; +    if sys.version_info &gt; (3, 0):
&gt; 
&gt; I still see a lot of things in common in the implementation of __init__,
&gt; communicate and etc.
&gt; Wouldn&apos;t it be much clearer if we have a base class?
&gt; ...

That does work much better, yes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683064</commentid>
    <comment_count>8</comment_count>
      <attachid>407317</attachid>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2020-08-26 11:44:14 -0700</bug_when>
    <thetext>Created attachment 407317
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683065</commentid>
    <comment_count>9</comment_count>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2020-08-26 11:44:51 -0700</bug_when>
    <thetext>(In reply to Matt Lewis from comment #5)
&gt; Talked offline, but I think the api for unit testing and integration testing
&gt; could use a bit of simplification.
&gt; 
&gt; rather than with mocks.Subprocess(mocks.Subprocess.Router(&apos;ls&apos;,
&gt; completion=mocks.ProcessCompletion(returncode=0,
&gt; stdout=&apos;file1.txt\nfile2.txt\n&apos;),)):
&gt; 
&gt; we should have something a bit easier a la:
&gt; with mocks.Subprocess(&apos;ls&apos;,completion=mocks.ProcessCompletion(returncode=0,
&gt; stdout=&apos;file1.txt\nfile2.txt\n&apos;), )):
&gt; 
&gt; and
&gt; (found by back an forth with Jonathan)
&gt; 
&gt; mocks.Subprocess.group_commands(
&gt;     mocks.Subprocess.Router(...),
&gt;     mocks.Subprocess.Router(...),
&gt; ):
&gt; 
&gt; for unit and integration tests respectively.

Turns out we don&apos;t even need group_commands to make this API work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683070</commentid>
    <comment_count>10</comment_count>
    <who name="Matt Lewis">jlewis3</who>
    <bug_when>2020-08-26 12:29:30 -0700</bug_when>
    <thetext>I like this much better. While I would prefer &apos;Router&apos; be more specific, it&apos;s more of a nit in the direction of my personal preference, especially since it seems like you want to keep it short and brief due to subprocess&apos;s existing naming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683073</commentid>
    <comment_count>11</comment_count>
      <attachid>407317</attachid>
    <who name="">dewei_zhu</who>
    <bug_when>2020-08-26 12:33:06 -0700</bug_when>
    <thetext>Comment on attachment 407317
Patch

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

&gt; Tools/Scripts/libraries/webkitcorepy/webkitcorepy/mocks/popen.py:237
&gt; +    @property
&gt; +    def universal_newlines(self):
&gt; +        return self.text_mode
&gt; +
&gt; +    @universal_newlines.setter
&gt; +    def universal_newlines(self, universal_newlines):
&gt; +        self.text_mode = bool(universal_newlines)
&gt; +
&gt; +    def poll(self):
&gt; +        if not self._completion:
&gt; +            self.stdin.seek(0)
&gt; +            self._completion = Subprocess.completion_for(*self._args, cwd=self._cwd, input=self.stdin.read())
&gt; +
&gt; +            (self.stdout or sys.stdout).write(string_utils.decode(self._completion.stdout, target_type=self._stdout_type))
&gt; +            (self.stdout or sys.stdout).flush()
&gt; +
&gt; +            (self.stderr or sys.stderr).write(string_utils.decode(self._completion.stderr, target_type=self._stderr_type))
&gt; +            (self.stderr or sys.stderr).flush()
&gt; +
&gt; +        if self.returncode is not None and time.time() &gt;= self._start_time + self._completion.elapsed:
&gt; +            self.returncode = self._completion.returncode
&gt; +            if self.stdout:
&gt; +                self.stdout.seek(0)
&gt; +            if self.stderr:
&gt; +                self.stderr.seek(0)
&gt; +
&gt; +        return self.returncode
&gt; +
&gt; +    def send_signal(self, sig):
&gt; +        if self.returncode is not None:
&gt; +            return
&gt; +
&gt; +        if sig not in [signal.SIGTERM, signal.SIGKILL]:
&gt; +            raise ValueError(&apos;Mock Popen object cannot handle signal {}&apos;.format(sig))
&gt; +        log.critical(&apos;Mock process {} send signal {}&apos;.format(self.pid, sig))
&gt; +        self.returncode = -1
&gt; +
&gt; +    def terminate(self):
&gt; +        self.send_signal(signal.SIGTERM)
&gt; +
&gt; +    def kill(self):
&gt; +        self.send_signal(signal.SIGKILL)

Those might fit better on the base class?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683075</commentid>
    <comment_count>12</comment_count>
    <who name="">dewei_zhu</who>
    <bug_when>2020-08-26 12:33:19 -0700</bug_when>
    <thetext>r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683085</commentid>
    <comment_count>13</comment_count>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2020-08-26 12:45:02 -0700</bug_when>
    <thetext>(In reply to dewei_zhu from comment #11)
&gt; Comment on attachment 407317 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=407317&amp;action=review
&gt; 
&gt; ...
&gt; 
&gt; Those might fit better on the base class?

I can move those, that would mean we have two entirely difference Popen definitions, one for Python 2 and one for Python 3 (instead of just declaring the specific functions that need differences)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683089</commentid>
    <comment_count>14</comment_count>
    <who name="Matt Lewis">jlewis3</who>
    <bug_when>2020-08-26 12:59:26 -0700</bug_when>
    <thetext>(In reply to Matt Lewis from comment #10)
&gt; I like this much better. While I would prefer &apos;Router&apos; be more specific,
&gt; it&apos;s more of a nit in the direction of my personal preference, especially
&gt; since it seems like you want to keep it short and brief due to subprocess&apos;s
&gt; existing naming.

Offline talk determined using &quot;CommandRoute&quot; in place of Router, with the option of being able to use &quot;Route&quot; as well for brevity&apos;s sake.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683093</commentid>
    <comment_count>15</comment_count>
      <attachid>407328</attachid>
    <who name="Jonathan Bedard">jbedard</who>
    <bug_when>2020-08-26 13:17:25 -0700</bug_when>
    <thetext>Created attachment 407328
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683097</commentid>
    <comment_count>16</comment_count>
    <who name="Matt Lewis">jlewis3</who>
    <bug_when>2020-08-26 13:25:36 -0700</bug_when>
    <thetext>LGTM. r+</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1683127</commentid>
    <comment_count>17</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-08-26 14:01:23 -0700</bug_when>
    <thetext>Committed r266190: &lt;https://trac.webkit.org/changeset/266190&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 407328.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>406963</attachid>
            <date>2020-08-20 13:43:02 -0700</date>
            <delta_ts>2020-08-25 15:52:06 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-215712-20200820134302.patch</filename>
            <type>text/plain</type>
            <size>19404</size>
            <attacher name="Jonathan Bedard">jbedard</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDI2NTk2MSkKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDMyIEBACisyMDIwLTA4LTIwICBKb25hdGhhbiBCZWRhcmQgIDxqYmVkYXJkQGFwcGxlLmNv
bT4KKworICAgICAgICBbd2Via2l0Y29yZXB5XSBTdGFuZGFyZCBQb3BlbiBtb2NraW5nIEFQSQor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE1NzEyCisg
ICAgICAgIDxyZGFyOi8vcHJvYmxlbS82NzUwMTkxMT4KKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIFNjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVw
eS9SRUFETUUubWQ6IEFkZCBtb2Nrcy5TdWJwcm9jZXNzIGRvY3VtZW50YXRpb24uCisgICAgICAg
ICogU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9fX2luaXRfXy5w
eTogQnVtcCB2ZXJzaW9uLgorICAgICAgICAqIFNjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVw
eS93ZWJraXRjb3JlcHkvbW9ja3MvX19pbml0X18ucHk6IEV4cG9ydCBTdWJwcm9jZXNzLCBQcm9j
ZXNzQ29tcGxldGlvbi4KKyAgICAgICAgKiBTY3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkv
d2Via2l0Y29yZXB5L21vY2tzL3BvcGVuLnB5OiBBZGRlZC4KKyAgICAgICAgKFByb2Nlc3NDb21w
bGV0aW9uKTogQ2xhc3Mgd2hpY2ggY2FwdHVyZXMgdGhlIHJlc3VsdCBvZiBhIG1vY2sgUG9wZW4g
Y2FsbC4KKyAgICAgICAgKFN1YnByb2Nlc3MpOgorICAgICAgICAoU3VicHJvY2Vzcy5jb21wbGV0
aW9uX2Zvcik6IEV4dHJhY3QgZmlsZSBuYW1lIGZyb20gYXJndW1lbnRzLCBmaW5kIHRoZSBjb21w
bGV0aW9uIGdlbmVyYXRvciwgYW5kIGNhbGwKKyAgICAgICAgaXQgd2l0aCB0aGUgcHJvdmllZGVk
IGFyZ3VtZW50cywgd29ya2luZyBkaXJlY3RvcnkgYW5kIHN0ZGluLgorICAgICAgICAoU3VicHJv
Y2Vzcy5jb21wbGV0aW9uX2dlbmVyYXRvcl9mb3IpOiBHaXZlbiBhIGZpbGUsIHNlYXJjaCB0aHJv
dWdoIHRoZSBtb2NrZWQgU3VicHJvY2VzcyBzdGFjayB0byBmaW5kIHRoZQorICAgICAgICBmaXJz
dCBjb21wbGV0aW9uIGZvciB0aGUgcHJvdmlkZWQgZmlsZS4KKyAgICAgICAgKFN1YnByb2Nlc3Mu
X19pbml0X18pOiBCaW5kIGEgZmlsZSAtPiBjb21wbGV0aW9uIGRpY3Rpb25hcnkgdG8gdGhlIG1v
Y2tlZCBTdWJwcm9jZXNzIHN0YWNrLgorICAgICAgICAoUG9wZW4pOiBNb2NrIFBvcGVuIG9iamVj
dCAoZm9yIGJvdGggUHl0aG9uIDIgYW5kIDMpLiBUaGlzIG9iamVjdCBleHRyYWN0cyBhIFByb2Nl
c3NDb21wbGV0aW9uIG9iamVjdCBmcm9tIHRoZQorICAgICAgICBtb2NrZWQgU3VicHJvY2VzcyBz
dGFjayBhbmQgYmVoYWl2ZXMgYWNjb3JkaW5nIHRvIHRoZSBjb250ZW50IG9mIHRoYXQgb2JqZWN0
LgorICAgICAgICAqIFNjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkv
dGVzdHMvbW9ja3MvcG9wZW5fdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAoTW9ja1BvcGVu
KToKKyAgICAgICAgKE1vY2tQb3Blbi50ZXN0X25vX2ZpbGUpOgorICAgICAgICAoTW9ja1BvcGVu
LnRlc3RfcG9wZW4pOgorICAgICAgICAoTW9ja1BvcGVuLnRlc3RfcnVuKToKKyAgICAgICAgKE1v
Y2tQb3Blbi50ZXN0X2NoZWNrX291dHB1dCk6CisgICAgICAgIChNb2NrUG9wZW4udGVzdF9jaGVj
a19jYWxsKToKKwogMjAyMC0wOC0yMCAgRGllZ28gUGlubyBHYXJjaWEgIDxkcGlub0BpZ2FsaWEu
Y29tPgogCiAgICAgICAgIFtld3NdIEFkZCAnanNjLW1pcHMtdGVzdHMnIGJ1YmJsZQpJbmRleDog
VG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L1JFQURNRS5tZAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvUkVBRE1FLm1kCShyZXZp
c2lvbiAyNjU5NTgpCisrKyBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvUkVB
RE1FLm1kCSh3b3JraW5nIGNvcHkpCkBAIC03NiwzICs3NiwxNSBAQCBmcm9tIHdlYmtpdGNvcmVw
eSBpbXBvcnQgcnVuCiAKIHJlc3VsdCA9IHJ1bihbc3lzLmV4ZWN1dGFibGUsICctYycsICdwcmlu
dCgibWVzc2FnZSIpJ10sIGNhcHR1cmVfb3V0cHV0PVRydWUsIGVuY29kaW5nPSd1dGYtOCcpCiBg
YGAKKworTW9ja2luZyBvZiBzdWJwcm9jZXNzIGNvbW1hbmRzOgorYGBgCitmcm9tIHdlYmtpdGNv
cmVweSBpbXBvcnQgbW9ja3MsIHJ1bgorCit3aXRoIG1vY2tzLlN1YnByb2Nlc3MoZGljdCgKKyAg
ICBscz1sYW1iZGEgYXJncywgaW5wdXQ9Tm9uZSwgY3dkPU5vbmU6IG1vY2tzLlByb2Nlc3NDb21w
bGV0aW9uKHJldHVybmNvZGU9MCwgc3Rkb3V0PSdmaWxlMS50eHRcbmZpbGUyLnR4dFxuJyksCisp
KToKKyAgICByZXN1bHQgPSBydW4oWydscyddLCBjYXB0dXJlX291dHB1dD1UcnVlLCBlbmNvZGlu
Zz0ndXRmLTgnKQorICAgIGFzc2VydCByZXN1bHQucmV0dXJuY29kZSA9PSAwCisgICAgYXNzZXJ0
IHJlc3VsdC5zdGRvdXQgPT0gJ2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nCitgYGAKSW5kZXg6IFRv
b2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvX19pbml0X18u
cHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dl
YmtpdGNvcmVweS9fX2luaXRfXy5weQkocmV2aXNpb24gMjY1OTU4KQorKysgVG9vbHMvU2NyaXB0
cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9fX2luaXRfXy5weQkod29ya2lu
ZyBjb3B5KQpAQCAtMzUsNyArMzUsNyBAQCBmcm9tIHdlYmtpdGNvcmVweS50aW1lb3V0IGltcG9y
dCBUaW1lb3V0CiBmcm9tIHdlYmtpdGNvcmVweS5zdWJwcm9jZXNzX3V0aWxzIGltcG9ydCBUaW1l
b3V0RXhwaXJlZCwgQ29tcGxldGVkUHJvY2VzcywgcnVuCiBmcm9tIHdlYmtpdGNvcmVweS5vdXRw
dXRfY2FwdHVyZSBpbXBvcnQgTG9nZ2VyQ2FwdHVyZSwgT3V0cHV0Q2FwdHVyZSwgT3V0cHV0RHVw
bGljYXRlCiAKLXZlcnNpb24gPSBWZXJzaW9uKDAsIDMsIDApCit2ZXJzaW9uID0gVmVyc2lvbigw
LCAzLCAxKQogCiBmcm9tIHdlYmtpdGNvcmVweS5hdXRvaW5zdGFsbCBpbXBvcnQgUGFja2FnZSwg
QXV0b0luc3RhbGwKIGlmIHN5cy52ZXJzaW9uX2luZm8gPiAoMywgMCk6CkluZGV4OiBUb29scy9T
Y3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5L21vY2tzL19faW5pdF9f
LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93
ZWJraXRjb3JlcHkvbW9ja3MvX19pbml0X18ucHkJKHJldmlzaW9uIDI2NTk1OCkKKysrIFRvb2xz
L1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9ja3MvX19pbml0
X18ucHkJKHdvcmtpbmcgY29weSkKQEAgLTIyLDMgKzIyLDQgQEAKIAogZnJvbSB3ZWJraXRjb3Jl
cHkubW9ja3MuY29udGV4dF9zdGFjayBpbXBvcnQgQ29udGV4dFN0YWNrCiBmcm9tIHdlYmtpdGNv
cmVweS5tb2Nrcy50aW1lXyBpbXBvcnQgVGltZQorZnJvbSB3ZWJraXRjb3JlcHkubW9ja3MucG9w
ZW4gaW1wb3J0IFByb2Nlc3NDb21wbGV0aW9uLCBTdWJwcm9jZXNzCkluZGV4OiBUb29scy9TY3Jp
cHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5L21vY2tzL3BvcGVuLnB5Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRj
b3JlcHkvbW9ja3MvcG9wZW4ucHkJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvU2NyaXB0cy9saWJy
YXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9tb2Nrcy9wb3Blbi5weQkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDI2NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBt
ZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorIyBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisj
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OCisjIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisjIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorCitpbXBvcnQgb3MKK2ltcG9ydCBpbworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzaWdu
YWwKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKK2Zyb20gd2Via2l0Y29yZXB5IGltcG9ydCBs
b2csIHN0cmluZ191dGlscywgVGltZW91dCwgVGltZW91dEV4cGlyZWQKK2Zyb20gd2Via2l0Y29y
ZXB5Lm1vY2tzIGltcG9ydCBDb250ZXh0U3RhY2sKKworCitjbGFzcyBQcm9jZXNzQ29tcGxldGlv
bihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXR1cm5jb2RlPU5vbmUsIHN0ZG91
dD1Ob25lLCBzdGRlcnI9Tm9uZSwgZWxhcHNlZD0wKToKKyAgICAgICAgc2VsZi5yZXR1cm5jb2Rl
ID0gMSBpZiByZXR1cm5jb2RlIGlzIE5vbmUgZWxzZSByZXR1cm5jb2RlCisgICAgICAgIHNlbGYu
c3Rkb3V0ID0gc3RyaW5nX3V0aWxzLmVuY29kZShzdGRvdXQpIGlmIHN0ZG91dCBlbHNlIGInJwor
ICAgICAgICBzZWxmLnN0ZGVyciA9IHN0cmluZ191dGlscy5lbmNvZGUoc3RkZXJyKSBpZiBzdGRl
cnIgZWxzZSBiJycKKyAgICAgICAgc2VsZi5lbGFwc2VkID0gZWxhcHNlZAorCisKK2NsYXNzIFN1
YnByb2Nlc3MoQ29udGV4dFN0YWNrKToKKyAgICB0b3AgPSBOb25lCisKKyAgICBAY2xhc3NtZXRo
b2QKKyAgICBkZWYgY29tcGxldGlvbl9mb3IoY2xzLCBhcmdzLCBpbnB1dD1Ob25lLCBjd2Q9Tm9u
ZSk6CisgICAgICAgIHJldHVybiBjbHMuY29tcGxldGlvbl9nZW5lcmF0b3JfZm9yKGFyZ3NbMF0p
KGFyZ3MsIGlucHV0PWlucHV0LCBjd2Q9Y3dkKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVm
IGNvbXBsZXRpb25fZ2VuZXJhdG9yX2ZvcihjbHMsIGZpbGUpOgorICAgICAgICBjdXJyZW50ID0g
Y2xzLnRvcAorICAgICAgICB3aGlsZSBjdXJyZW50OgorICAgICAgICAgICAgY29tcGxldGlvbiA9
IGN1cnJlbnQuY29tcGxldGlvbnMuZ2V0KGZpbGUpCisgICAgICAgICAgICBpZiBjb21wbGV0aW9u
OgorICAgICAgICAgICAgICAgIHJldHVybiBjb21wbGV0aW9uCisgICAgICAgICAgICBjdXJyZW50
ID0gY3VycmVudC5wcmV2aW91cworCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPiAoMywg
MCk6CisgICAgICAgICAgICByYWlzZSBGaWxlTm90Rm91bmRFcnJvcigiTm8gc3VjaCBmaWxlIG9y
IGRpcmVjdG9yeTogJ3twYXRofSc6ICd7cGF0aH0nIi5mb3JtYXQocGF0aD1maWxlKSkKKyAgICAg
ICAgcmFpc2UgT1NFcnJvcignW0Vycm5vIDJdIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknKQor
CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbXBsZXRpb25zPU5vbmUpOgorICAgICAgICAjIEFs
bG93IG1vY2sgdG8gYmUgbWFuYWdlZCB2aWEgYXV0b2luc3RhbGwKKyAgICAgICAgZnJvbSBtb2Nr
IGltcG9ydCBwYXRjaAorICAgICAgICBzdXBlcihTdWJwcm9jZXNzLCBzZWxmKS5fX2luaXRfXyhj
bHM9U3VicHJvY2VzcykKKyAgICAgICAgc2VsZi5jb21wbGV0aW9ucyA9IGNvbXBsZXRpb25zIG9y
IHt9CisgICAgICAgIHNlbGYucGF0Y2hlcy5hcHBlbmQocGF0Y2goJ3N1YnByb2Nlc3MuUG9wZW4n
LCBuZXc9UG9wZW4pKQorCisKK2NsYXNzIFBvcGVuKG9iamVjdCk6CisgICAgTkVYVF9QSUQgPSBv
cy5nZXRwaWQoKSArIDEKKworICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPiAoMywgMCk6CisgICAg
ICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmdzLCBidWZzaXplPS0xLCBleGVjdXRhYmxlPU5vbmUs
CisgICAgICAgICAgICAgICAgICAgICBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5v
bmUsCisgICAgICAgICAgICAgICAgICAgICBwcmVleGVjX2ZuPU5vbmUsIGNsb3NlX2Zkcz1UcnVl
LAorICAgICAgICAgICAgICAgICAgICAgc2hlbGw9RmFsc2UsIGN3ZD1Ob25lLCBlbnY9Tm9uZSwg
dW5pdmVyc2FsX25ld2xpbmVzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBzdGFydHVwaW5m
bz1Ob25lLCBjcmVhdGlvbmZsYWdzPTAsCisgICAgICAgICAgICAgICAgICAgICByZXN0b3JlX3Np
Z25hbHM9VHJ1ZSwgc3RhcnRfbmV3X3Nlc3Npb249RmFsc2UsCisgICAgICAgICAgICAgICAgICAg
ICBwYXNzX2Zkcz0oKSwgZW5jb2Rpbmc9Tm9uZSwgZXJyb3JzPU5vbmUsIHRleHQ9Tm9uZSk6CisK
KyAgICAgICAgICAgIHNlbGYuX2NvbXBsZXRpb24gPSBOb25lCisgICAgICAgICAgICBzZWxmLl9j
b21tdW5pY2F0aW9uX3N0YXJ0ZWQgPSBGYWxzZQorICAgICAgICAgICAgaWYgYnVmc2l6ZSBpcyBO
b25lOgorICAgICAgICAgICAgICAgIGJ1ZnNpemUgPSAtMQorICAgICAgICAgICAgaWYgbm90IGlz
aW5zdGFuY2UoYnVmc2l6ZSwgaW50KToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3Io
ImJ1ZnNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIikKKworICAgICAgICAgICAgaWYgcGFzc19mZHMg
YW5kIG5vdCBjbG9zZV9mZHM6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oInBhc3NfZmRzIG92
ZXJyaWRpbmcgY2xvc2VfZmRzLiIpCisKKyAgICAgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKyAg
ICAgICAgICAgIHNlbGYuX2FyZ3MgPSBhcmdzCisgICAgICAgICAgICBzZWxmLl9jd2QgPSBjd2QK
KyAgICAgICAgICAgIHNlbGYuc3RkaW4gPSBzdGRpbiBvciBzdHJpbmdfdXRpbHMuQnl0ZXNJTygp
CisgICAgICAgICAgICBzZWxmLnN0ZG91dCA9IHN0cmluZ191dGlscy5CeXRlc0lPKCkgaWYgc3Rk
b3V0ID09IHN1YnByb2Nlc3MuUElQRSBlbHNlIHN0ZG91dAorICAgICAgICAgICAgc2VsZi5fc3Rk
b3V0X3R5cGUgPSBieXRlcyBpZiBzdGRvdXQgPT0gc3VicHJvY2Vzcy5QSVBFIGVsc2Ugc3RyCisg
ICAgICAgICAgICBzZWxmLnN0ZGVyciA9IHN0cmluZ191dGlscy5CeXRlc0lPKCkgaWYgc3RkZXJy
ID09IHN1YnByb2Nlc3MuUElQRSBlbHNlIHN0ZGVycgorICAgICAgICAgICAgc2VsZi5fc3RkZXJy
X3R5cGUgPSBieXRlcyBpZiBzdGRlcnIgPT0gc3VicHJvY2Vzcy5QSVBFIGVsc2Ugc3RyCisgICAg
ICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBOb25lCisgICAgICAgICAgICBzZWxmLmVuY29kaW5n
ID0gZW5jb2RpbmcKKyAgICAgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisKKyAgICAgICAg
ICAgIGlmICh0ZXh0IGlzIG5vdCBOb25lIGFuZCB1bml2ZXJzYWxfbmV3bGluZXMgaXMgbm90IE5v
bmUgYW5kIGJvb2wodW5pdmVyc2FsX25ld2xpbmVzKSAhPSBib29sKHRleHQpKToKKyAgICAgICAg
ICAgICAgICByYWlzZSBzdWJwcm9jZXNzLlN1YnByb2Nlc3NFcnJvcignQ2Fubm90IGRpc2FtYmln
dWF0ZSB3aGVuIGJvdGggdGV4dCBhbmQgdW5pdmVyc2FsX25ld2xpbmVzIGFyZSBzdXBwbGllZCBi
dXQgZGlmZmVyZW50LiBQYXNzIG9uZSBvciB0aGUgb3RoZXIuJykKKworICAgICAgICAgICAgc2Vs
Zi50ZXh0X21vZGUgPSBlbmNvZGluZyBvciBlcnJvcnMgb3IgdGV4dCBvciB1bml2ZXJzYWxfbmV3
bGluZXMKKworICAgICAgICAgICAgaWYgc2VsZi5zdGRpbiBpcyBub3QgTm9uZSBhbmQgc2VsZi50
ZXh0X21vZGU6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRpbiA9IGlvLlRleHRJT1dyYXBwZXIo
c2VsZi5zdGRpbiwgd3JpdGVfdGhyb3VnaD1UcnVlLCBsaW5lX2J1ZmZlcmluZz0oYnVmc2l6ZSA9
PSAxKSwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGVycm9ycz1lcnJvcnMpCisgICAgICAgICAgICBpZiBz
ZWxmLnN0ZG91dCBpcyBub3QgTm9uZSBhbmQgc2VsZi50ZXh0X21vZGU6CisgICAgICAgICAgICAg
ICAgc2VsZi5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKHNlbGYuc3Rkb3V0LCBlbmNvZGluZz1l
bmNvZGluZywgZXJyb3JzPWVycm9ycykKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGRvdXRfdHlw
ZSA9IHN0cgorICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnIgaXMgbm90IE5vbmUgYW5kIHNlbGYu
dGV4dF9tb2RlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyID0gaW8uVGV4dElPV3JhcHBl
cihzZWxmLnN0ZGVyciwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGVycm9ycz1lcnJvcnMpCisgICAgICAg
ICAgICAgICAgc2VsZi5fc3RkZXJyX3R5cGUgPSBzdHIKKworICAgICAgICAgICAgU3VicHJvY2Vz
cy5jb21wbGV0aW9uX2dlbmVyYXRvcl9mb3IoYXJnc1swXSkKKworICAgICAgICAgICAgc2VsZi5w
aWQgPSBzZWxmLk5FWFRfUElECisgICAgICAgICAgICBzZWxmLk5FWFRfUElEICs9IDEKKworICAg
ICAgICAgICAgc2VsZi5fc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisKKyAgICAgICAgZGVmIGNv
bW11bmljYXRlKHNlbGYsIGlucHV0PU5vbmUsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICAgICBp
ZiBzZWxmLl9jb21tdW5pY2F0aW9uX3N0YXJ0ZWQgYW5kIGlucHV0OgorICAgICAgICAgICAgICAg
IHJhaXNlIFZhbHVlRXJyb3IoJ0Nhbm5vdCBzZW5kIGlucHV0IGFmdGVyIHN0YXJ0aW5nIGNvbW11
bmljYXRpb24nKQorCisgICAgICAgICAgICBzZWxmLl9jb21tdW5pY2F0aW9uX3N0YXJ0ZWQgPSBU
cnVlCisgICAgICAgICAgICBpZiBpbnB1dDoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLndy
aXRlKGlucHV0KQorICAgICAgICAgICAgc2VsZi53YWl0KHRpbWVvdXQ9dGltZW91dCkKKyAgICAg
ICAgICAgIHJldHVybiBzZWxmLnN0ZG91dC5yZWFkKCkgaWYgc2VsZi5zdGRvdXQgZWxzZSBOb25l
LCBzZWxmLnN0ZGVyci5yZWFkKCkgaWYgc2VsZi5zdGRlcnIgZWxzZSBOb25lCisKKyAgICAgICAg
ZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgICAgIGlmIHNlbGYucG9sbCgp
IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBpZiB0
aW1lb3V0IGFuZCAoc2VsZi5fY29tcGxldGlvbi5lbGFwc2VkIGlzIE5vbmUgb3IgdGltZW91dCA8
IHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVGltZW91
dEV4cGlyZWQoc2VsZi5fYXJncywgdGltZW91dCkKKworICAgICAgICAgICAgaWYgc2VsZi5fY29t
cGxldGlvbi5lbGFwc2VkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJv
cignUnVubmluZyBhIGNvbW1hbmQgdGhhdCBoYW5ncyB3aXRob3V0IGEgdGltZW91dCcpCisKKyAg
ICAgICAgICAgIGlmIHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZDoKKyAgICAgICAgICAgICAgICB0
aW1lLnNsZWVwKHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZCkKKworICAgICAgICAgICAgc2VsZi5y
ZXR1cm5jb2RlID0gc2VsZi5fY29tcGxldGlvbi5yZXR1cm5jb2RlCisgICAgICAgICAgICBpZiBz
ZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5zZWVrKDApCisgICAgICAg
ICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyci5zZWVrKDAp
CisKKyAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxm
CisKKyAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNl
YmFjayk6CisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzZWxm
LnN0ZG91dC5jbG9zZSgpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAg
ICAgICBzZWxmLnN0ZGVyci5jbG9zZSgpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGluOgorICAg
ICAgICAgICAgICAgIHNlbGYuc3RkaW4uY2xvc2UoKQorCisgICAgZWxzZToKKyAgICAgICAgZGVm
IF9faW5pdF9fKHNlbGYsIGFyZ3MsIGJ1ZnNpemU9LTEsIGV4ZWN1dGFibGU9Tm9uZSwKKyAgICAg
ICAgICAgICAgICAgICAgIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwKKyAg
ICAgICAgICAgICAgICAgICAgIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPVRydWUsCisgICAg
ICAgICAgICAgICAgICAgICBzaGVsbD1GYWxzZSwgY3dkPU5vbmUsIGVudj1Ob25lLCB1bml2ZXJz
YWxfbmV3bGluZXM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvPU5vbmUs
IGNyZWF0aW9uZmxhZ3M9MCk6CisKKyAgICAgICAgICAgIHNlbGYuX2NvbXBsZXRpb24gPSBOb25l
CisgICAgICAgICAgICBzZWxmLl9jb21tdW5pY2F0aW9uX3N0YXJ0ZWQgPSBGYWxzZQorICAgICAg
ICAgICAgaWYgYnVmc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJ1ZnNpemUgPSAtMQor
ICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmc2l6ZSwgaW50KToKKyAgICAgICAgICAg
ICAgICByYWlzZSBUeXBlRXJyb3IoImJ1ZnNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIikKKworICAg
ICAgICAgICAgc2VsZi5fYXJncyA9IGFyZ3MKKyAgICAgICAgICAgIHNlbGYuX2N3ZCA9IGN3ZAor
ICAgICAgICAgICAgc2VsZi5zdGRpbiA9IHN0ZGluIG9yIHN0cmluZ191dGlscy5CeXRlc0lPKCkK
KyAgICAgICAgICAgIHNlbGYuc3Rkb3V0ID0gc3RyaW5nX3V0aWxzLkJ5dGVzSU8oKSBpZiBzdGRv
dXQgPT0gc3VicHJvY2Vzcy5QSVBFIGVsc2Ugc3Rkb3V0CisgICAgICAgICAgICBzZWxmLl9zdGRv
dXRfdHlwZSA9IGJ5dGVzIGlmIHN0ZG91dCA9PSBzdWJwcm9jZXNzLlBJUEUgZWxzZSBzdHIKKyAg
ICAgICAgICAgIHNlbGYuc3RkZXJyID0gc3RyaW5nX3V0aWxzLkJ5dGVzSU8oKSBpZiBzdGRlcnIg
PT0gc3VicHJvY2Vzcy5QSVBFIGVsc2Ugc3RkZXJyCisgICAgICAgICAgICBzZWxmLl9zdGRlcnJf
dHlwZSA9IGJ5dGVzIGlmIHN0ZGVyciA9PSBzdWJwcm9jZXNzLlBJUEUgZWxzZSBzdHIKKyAgICAg
ICAgICAgIHNlbGYucmV0dXJuY29kZSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYudGV4dF9tb2Rl
ID0gdW5pdmVyc2FsX25ld2xpbmVzCisKKyAgICAgICAgICAgIFN1YnByb2Nlc3MuY29tcGxldGlv
bl9nZW5lcmF0b3JfZm9yKGFyZ3NbMF0pCisKKyAgICAgICAgICAgIHNlbGYucGlkID0gc2VsZi5O
RVhUX1BJRAorICAgICAgICAgICAgc2VsZi5ORVhUX1BJRCArPSAxCisKKyAgICAgICAgICAgIHNl
bGYuX3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorCisgICAgICAgIGRlZiBjb21tdW5pY2F0ZShz
ZWxmLCBpbnB1dD1Ob25lKToKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbW11bmljYXRpb25fc3Rh
cnRlZCBhbmQgaW5wdXQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignQ2Fubm90
IHNlbmQgaW5wdXQgYWZ0ZXIgc3RhcnRpbmcgY29tbXVuaWNhdGlvbicpCisKKyAgICAgICAgICAg
IHNlbGYuX2NvbW11bmljYXRpb25fc3RhcnRlZCA9IFRydWUKKyAgICAgICAgICAgIGlmIGlucHV0
OgorICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4ud3JpdGUoaW5wdXQpCisgICAgICAgICAgICBz
ZWxmLndhaXQoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3Rkb3V0LnJlYWQoKSBpZiBzZWxm
LnN0ZG91dCBlbHNlIE5vbmUsIHNlbGYuc3RkZXJyLnJlYWQoKSBpZiBzZWxmLnN0ZGVyciBlbHNl
IE5vbmUKKworICAgICAgICBkZWYgd2FpdChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYucG9s
bCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAj
IE5lZWQgdG8gY2hlY2sgdGhlIHRpbWVvdXQgY29udGV4dAorICAgICAgICAgICAgdGltZW91dCA9
IFRpbWVvdXQuZGlmZmVyZW5jZSgpCisgICAgICAgICAgICBpZiB0aW1lb3V0IGFuZCAoc2VsZi5f
Y29tcGxldGlvbi5lbGFwc2VkIGlzIE5vbmUgb3IgdGltZW91dCA8IHNlbGYuX2NvbXBsZXRpb24u
ZWxhcHNlZCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVGltZW91dEV4cGlyZWQoc2VsZi5fYXJn
cywgdGltZW91dCkKKworICAgICAgICAgICAgaWYgc2VsZi5fY29tcGxldGlvbi5lbGFwc2VkIGlz
IE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignUnVubmluZyBhIGNvbW1h
bmQgdGhhdCBoYW5ncyB3aXRob3V0IGEgdGltZW91dCcpCisKKyAgICAgICAgICAgIGlmIHNlbGYu
X2NvbXBsZXRpb24uZWxhcHNlZDoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNlbGYuX2Nv
bXBsZXRpb24uZWxhcHNlZCkKKworICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gc2VsZi5f
Y29tcGxldGlvbi5yZXR1cm5jb2RlCisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dDoKKyAgICAg
ICAgICAgICAgICBzZWxmLnN0ZG91dC5zZWVrKDApCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGVy
cjoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyci5zZWVrKDApCisKKyAgICBAcHJvcGVydHkK
KyAgICBkZWYgdW5pdmVyc2FsX25ld2xpbmVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50
ZXh0X21vZGUKKworICAgIEB1bml2ZXJzYWxfbmV3bGluZXMuc2V0dGVyCisgICAgZGVmIHVuaXZl
cnNhbF9uZXdsaW5lcyhzZWxmLCB1bml2ZXJzYWxfbmV3bGluZXMpOgorICAgICAgICBzZWxmLnRl
eHRfbW9kZSA9IGJvb2wodW5pdmVyc2FsX25ld2xpbmVzKQorCisgICAgZGVmIHBvbGwoc2VsZik6
CisgICAgICAgIGlmIG5vdCBzZWxmLl9jb21wbGV0aW9uOgorICAgICAgICAgICAgc2VsZi5fY29t
cGxldGlvbiA9IFN1YnByb2Nlc3MuY29tcGxldGlvbl9mb3Ioc2VsZi5fYXJncywgaW5wdXQ9c2Vs
Zi5zdGRpbi5yZWFkKCksIGN3ZD1zZWxmLl9jd2QpCisKKyAgICAgICAgICAgIChzZWxmLnN0ZG91
dCBvciBzeXMuc3Rkb3V0KS53cml0ZShzdHJpbmdfdXRpbHMuZGVjb2RlKHNlbGYuX2NvbXBsZXRp
b24uc3Rkb3V0LCB0YXJnZXRfdHlwZT1zZWxmLl9zdGRvdXRfdHlwZSkpCisgICAgICAgICAgICAo
c2VsZi5zdGRvdXQgb3Igc3lzLnN0ZG91dCkuZmx1c2goKQorCisgICAgICAgICAgICAoc2VsZi5z
dGRlcnIgb3Igc3lzLnN0ZGVycikud3JpdGUoc3RyaW5nX3V0aWxzLmRlY29kZShzZWxmLl9jb21w
bGV0aW9uLnN0ZGVyciwgdGFyZ2V0X3R5cGU9c2VsZi5fc3RkZXJyX3R5cGUpKQorICAgICAgICAg
ICAgKHNlbGYuc3RkZXJyIG9yIHN5cy5zdGRlcnIpLmZsdXNoKCkKKworICAgICAgICBpZiBzZWxm
LnJldHVybmNvZGUgaXMgbm90IE5vbmUgYW5kIHRpbWUudGltZSgpID49IHNlbGYuX3N0YXJ0X3Rp
bWUgKyBzZWxmLl9jb21wbGV0aW9uLmVsYXBzZWQ6CisgICAgICAgICAgICBzZWxmLnJldHVybmNv
ZGUgPSBzZWxmLl9jb21wbGV0aW9uLnJldHVybmNvZGUKKyAgICAgICAgICAgIGlmIHNlbGYuc3Rk
b3V0OgorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgICAgIGlm
IHNlbGYuc3RkZXJyOgorICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyLnNlZWsoMCkKKworICAg
ICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCisKKyAgICBkZWYgc2VuZF9zaWduYWwoc2VsZiwg
c2lnKToKKyAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAg
ICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2lnIG5vdCBpbiBbc2lnbmFsLlNJR1RFUk0sIHNpZ25h
bC5TSUdLSUxMXToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ01vY2sgUG9wZW4gb2Jq
ZWN0IGNhbm5vdCBoYW5kbGUgc2lnbmFsIHt9Jy5mb3JtYXQoc2lnKSkKKyAgICAgICAgbG9nLmNy
aXRpY2FsKCdNb2NrIHByb2Nlc3Mge30gc2VuZCBzaWduYWwge30nLmZvcm1hdChzZWxmLnBpZCwg
c2lnKSkKKyAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gLTEKKworICAgIGRlZiB0ZXJtaW5hdGUo
c2VsZik6CisgICAgICAgIHNlbGYuc2VuZF9zaWduYWwoc2lnbmFsLlNJR1RFUk0pCisKKyAgICBk
ZWYga2lsbChzZWxmKToKKyAgICAgICAgc2VsZi5zZW5kX3NpZ25hbChzaWduYWwuU0lHS0lMTCkK
SW5kZXg6IFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkv
dGVzdHMvbW9ja3MvcG9wZW5fdW5pdHRlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0
cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS90ZXN0cy9tb2Nrcy9wb3Blbl91
bml0dGVzdC5weQkobm9uZXhpc3RlbnQpCisrKyBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJr
aXRjb3JlcHkvd2Via2l0Y29yZXB5L3Rlc3RzL21vY2tzL3BvcGVuX3VuaXR0ZXN0LnB5CSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNzIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBh
cmUgbWV0OgorIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyMg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTgorIyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwor
IyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHdlYmtp
dGNvcmVweSBpbXBvcnQgT3V0cHV0Q2FwdHVyZSwgbW9ja3MsIHJ1bgorCisKK2NsYXNzIE1vY2tQ
b3Blbih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfbm9fZmlsZShzZWxmKToKKyAg
ICAgICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNzKCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNz
ZXJ0UmFpc2VzKE9TRXJyb3IpOgorICAgICAgICAgICAgICAgIHJ1bihbJ2ludmFsaWQtZmlsZSdd
KQorCisgICAgZGVmIHRlc3RfcG9wZW4oc2VsZik6CisgICAgICAgIHdpdGggbW9ja3MuVGltZToK
KyAgICAgICAgICAgIHdpdGggbW9ja3MuU3VicHJvY2VzcyhkaWN0KAorICAgICAgICAgICAgICAg
IGxzPWxhbWJkYSBhcmdzLCBpbnB1dD1Ob25lLCBjd2Q9Tm9uZTogbW9ja3MuUHJvY2Vzc0NvbXBs
ZXRpb24ocmV0dXJuY29kZT0wLCBzdGRvdXQ9J2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nKSwKKyAg
ICAgICAgICAgICAgICBzbGVlcD1sYW1iZGEgYXJncywgaW5wdXQ9Tm9uZSwgY3dkPU5vbmU6IG1v
Y2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwgZWxhcHNlZD1pbnQoYXJnc1sxXSkp
LAorICAgICAgICAgICAgKSk6CisgICAgICAgICAgICAgICAgbHMgPSBzdWJwcm9jZXNzLlBvcGVu
KFsnbHMnXSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkK
KyAgICAgICAgICAgICAgICBscy53YWl0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKDAsIGxzLnBvbGwoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInZmls
ZTEudHh0XG5maWxlMi50eHRcbicsIGxzLnN0ZG91dC5yZWFkKCkpCisKKyAgICAgICAgICAgICAg
ICBzbGVlcCA9IHN1YnByb2Nlc3MuUG9wZW4oWydzbGVlcCcsICcxJ10sIHN0ZG91dD1zdWJwcm9j
ZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgICAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChOb25lLCBzbGVlcC5wb2xsKCkpCisgICAgICAgICAgICAgICAgc2xlZXAud2Fp
dCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzbGVlcC5wb2xsKCkpCisK
KyAgICBkZWYgdGVzdF9ydW4oc2VsZik6CisgICAgICAgIHdpdGggT3V0cHV0Q2FwdHVyZSgpIGFz
IGNhcHR1cmVkOgorICAgICAgICAgICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNzKGRpY3QobHM9bGFt
YmRhIGFyZ3MsIGlucHV0PU5vbmUsIGN3ZD1Ob25lOiBtb2Nrcy5Qcm9jZXNzQ29tcGxldGlvbihy
ZXR1cm5jb2RlPTAsIHN0ZG91dD0nZmlsZTEudHh0XG5maWxlMi50eHRcbicpKSk6CisgICAgICAg
ICAgICAgICAgcmVzdWx0ID0gcnVuKFsnbHMnXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFsKHJlc3VsdC5yZXR1cm5jb2RlLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwocmVzdWx0LnN0ZG91dCwgTm9uZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKHJlc3VsdC5zdGRlcnIsIE5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXB0
dXJlZC5zdGRvdXQuZ2V0dmFsdWUoKSwgJ2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nKQorCisgICAg
ZGVmIHRlc3RfY2hlY2tfb3V0cHV0KHNlbGYpOgorICAgICAgICB3aXRoIG1vY2tzLlN1YnByb2Nl
c3MoZGljdChscz1sYW1iZGEgYXJncywgaW5wdXQ9Tm9uZSwgY3dkPU5vbmU6IG1vY2tzLlByb2Nl
c3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwgc3Rkb3V0PSdmaWxlMS50eHRcbmZpbGUyLnR4dFxu
JykpKToKKyAgICAgICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsnbHMn
XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBiJ2ZpbGUxLnR4dFxuZmls
ZTIudHh0XG4nKQorCisgICAgZGVmIHRlc3RfY2hlY2tfY2FsbChzZWxmKToKKyAgICAgICAgd2l0
aCBPdXRwdXRDYXB0dXJlKCkgYXMgY2FwdHVyZWQ6CisgICAgICAgICAgICB3aXRoIG1vY2tzLlN1
YnByb2Nlc3MoZGljdChscz1sYW1iZGEgYXJncywgaW5wdXQ9Tm9uZSwgY3dkPU5vbmU6IG1vY2tz
LlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwgc3Rkb3V0PSdmaWxlMS50eHRcbmZpbGUy
LnR4dFxuJykpKToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdWJwcm9jZXNzLmNoZWNrX2Nh
bGwoWydscyddKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAwKQor
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FwdHVyZWQuc3Rkb3V0LmdldHZhbHVlKCksICdm
aWxlMS50eHRcbmZpbGUyLnR4dFxuJykK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>407245</attachid>
            <date>2020-08-25 15:52:08 -0700</date>
            <delta_ts>2020-08-26 11:44:12 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-215712-20200825155207.patch</filename>
            <type>text/plain</type>
            <size>28659</size>
            <attacher name="Jonathan Bedard">jbedard</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDI2NjE0OCkKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDQyIEBACisyMDIwLTA4LTI1ICBKb25hdGhhbiBCZWRhcmQgIDxqYmVkYXJkQGFwcGxlLmNv
bT4KKworICAgICAgICBbd2Via2l0Y29yZXB5XSBTdGFuZGFyZCBQb3BlbiBtb2NraW5nIEFQSQor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE1NzEyCisg
ICAgICAgIDxyZGFyOi8vcHJvYmxlbS82NzUwMTkxMT4KKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIFNjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVw
eS9SRUFETUUubWQ6IEFkZCBtb2Nrcy5TdWJwcm9jZXNzIGRvY3VtZW50YXRpb24uCisgICAgICAg
ICogU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9fX2luaXRfXy5w
eTogQnVtcCB2ZXJzaW9uLgorICAgICAgICAqIFNjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVw
eS93ZWJraXRjb3JlcHkvbW9ja3MvX19pbml0X18ucHk6ICBFeHBvcnQgU3VicHJvY2VzcywgUHJv
Y2Vzc0NvbXBsZXRpb24uCisgICAgICAgICogU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5
L3dlYmtpdGNvcmVweS9tb2Nrcy9wb3Blbi5weTogQWRkZWQuCisgICAgICAgIChQb3Blbik6IE1v
Y2sgUG9wZW4gb2JqZWN0IChmb3IgYm90aCBQeXRob24gMiBhbmQgMykuIFRoaXMgb2JqZWN0IGV4
dHJhY3RzIGEgUHJvY2Vzc0NvbXBsZXRpb24gb2JqZWN0IGZyb20gdGhlCisgICAgICAgIG1vY2tl
ZCBTdWJwcm9jZXNzIHN0YWNrIGFuZCBiZWhhaXZlcyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnQg
b2YgdGhhdCBvYmplY3QuCisgICAgICAgICogU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5
L3dlYmtpdGNvcmVweS9tb2Nrcy9zdWJwcm9jZXNzLnB5OiBBZGRlZC4KKyAgICAgICAgKFByb2Nl
c3NDb21wbGV0aW9uKTogQ2xhc3Mgd2hpY2ggY2FwdHVyZXMgdGhlIHJlc3VsdCBvZiBhIG1vY2sg
UG9wZW4gY2FsbC4KKyAgICAgICAgKFN1YnByb2Nlc3MpOgorICAgICAgICAoU3VicHJvY2Vzcy5S
b3V0ZXIpOiBPYmplY3Qgd2hpY2ggcm91dGVzIGEgc2V0IG9mIHN1YnByb2Nlc3MgYXJndW1lbnRz
IHRvIGEgc3BlY2lmaWMgUHJvY2Vzc0NvbXBsZXRpb24gb3IgY2FsbGJhY2sgd2hpY2gKKyAgICAg
ICAgZ2VuZXJhdGVzIGEgUHJvY2Vzc0NvbXBsZXRpb24uCisgICAgICAgIChTdWJwcm9jZXNzLmNv
bXBsZXRpb25fZ2VuZXJhdG9yX2Zvcik6IEdpdmVuIGEgZmlsZSwgc2VhcmNoIHRocm91Z2ggdGhl
IG1vY2tlZCBTdWJwcm9jZXNzIHN0YWNrIHRvIGZpbmQgdGhlCisgICAgICAgIGZpcnN0IGNvbXBs
ZXRpb24gZm9yIHRoZSBwcm92aWRlZCBmaWxlLgorICAgICAgICAoU3VicHJvY2Vzcy5jb21wbGV0
aW9uX2Zvcik6IEV4dHJhY3QgZmlsZSBuYW1lIGZyb20gYXJndW1lbnRzLCBmaW5kIHRoZSBjb21w
bGV0aW9uIGdlbmVyYXRvciwgYW5kIGNhbGwKKyAgICAgICAgaXQgd2l0aCB0aGUgcHJvdmllZGVk
IGFyZ3VtZW50cywgd29ya2luZyBkaXJlY3RvcnkgYW5kIHN0ZGluLgorICAgICAgICAoU3VicHJv
Y2Vzcy5fX2luaXRfXyk6CisgICAgICAgICogU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5
L3dlYmtpdGNvcmVweS90ZXN0cy9tb2Nrcy9zdWJwcm9jZXNzX3VuaXR0ZXN0LnB5OiBBZGRlZC4K
KyAgICAgICAgKE1vY2tTdWJwcm9jZXNzKToKKyAgICAgICAgKE1vY2tTdWJwcm9jZXNzLnRlc3Rf
bm9fZmlsZSk6CisgICAgICAgIChNb2NrU3VicHJvY2Vzcy50ZXN0X3BvcGVuKToKKyAgICAgICAg
KE1vY2tTdWJwcm9jZXNzLnRlc3Rfb3JkZXJlZCk6CisgICAgICAgIChNb2NrU3VicHJvY2Vzcy50
ZXN0X2FyZ3VtZW50X3ByaW9yaXR5KToKKyAgICAgICAgKE1vY2tTdWJwcm9jZXNzLnRlc3RfY3dk
X3ByaW9yaXR5KToKKyAgICAgICAgKE1vY2tTdWJwcm9jZXNzLnRlc3RfaW5wdXRfcHJpb3JpdHkp
OgorICAgICAgICAoTW9ja0NoZWNrT3V0cHV0KToKKyAgICAgICAgKE1vY2tDaGVja091dHB1dC50
ZXN0X3BvcGVuKToKKyAgICAgICAgKE1vY2tDaGVja0NhbGwpOgorICAgICAgICAoTW9ja0NoZWNr
Q2FsbC50ZXN0X3BvcGVuKToKKyAgICAgICAgKE1vY2tSdW4pOgorICAgICAgICAoTW9ja1J1bi50
ZXN0X3BvcGVuKToKKwogMjAyMC0wOC0yNSAgQ2FybG9zIEFsYmVydG8gTG9wZXogUGVyZXogIDxj
bG9wZXpAaWdhbGlhLmNvbT4KIAogICAgICAgICBbV1BFXVtRdF0gRml4IHF0LXdwZS1taW5pYnJv
d3NlciBvbiBEZWJpYW4xMApJbmRleDogVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29y
ZXB5L1JFQURNRS5tZAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJr
aXRjb3JlcHkvUkVBRE1FLm1kCShyZXZpc2lvbiAyNjYxMzApCisrKyBUb29scy9TY3JpcHRzL2xp
YnJhcmllcy93ZWJraXRjb3JlcHkvUkVBRE1FLm1kCSh3b3JraW5nIGNvcHkpCkBAIC03NiwzICs3
NiwyMyBAQCBmcm9tIHdlYmtpdGNvcmVweSBpbXBvcnQgcnVuCiAKIHJlc3VsdCA9IHJ1bihbc3lz
LmV4ZWN1dGFibGUsICctYycsICdwcmludCgibWVzc2FnZSIpJ10sIGNhcHR1cmVfb3V0cHV0PVRy
dWUsIGVuY29kaW5nPSd1dGYtOCcpCiBgYGAKKworTW9ja2luZyBvZiBzdWJwcm9jZXNzIGNvbW1h
bmRzOgorYGBgCitmcm9tIHdlYmtpdGNvcmVweSBpbXBvcnQgbW9ja3MsIHJ1bgorCit3aXRoIG1v
Y2tzLlN1YnByb2Nlc3MobW9ja3MuU3VicHJvY2Vzcy5Sb3V0ZXIoCisgICAgJ2xzJywgY29tcGxl
dGlvbj1tb2Nrcy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5jb2RlPTAsIHN0ZG91dD0nZmlsZTEu
dHh0XG5maWxlMi50eHRcbicpLAorKSk6CisgICAgcmVzdWx0ID0gcnVuKFsnbHMnXSwgY2FwdHVy
ZV9vdXRwdXQ9VHJ1ZSwgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICBhc3NlcnQgcmVzdWx0LnJldHVy
bmNvZGUgPT0gMAorICAgIGFzc2VydCByZXN1bHQuc3Rkb3V0ID09ICdmaWxlMS50eHRcbmZpbGUy
LnR4dFxuJworYGBgCitUaGUgbW9ja2luZyBzeXN0ZW0gZm9yIHN1YnByb2Nlc3MgYWxzbyBzdXBw
b3J0cyBvdGhlciBzdWJwcm9jZXNzIEFQSXMgYmFzZWQgb24gUG9wZW46CitgYGAKK3dpdGggbW9j
a3MuU3VicHJvY2Vzcyhtb2Nrcy5TdWJwcm9jZXNzLlJvdXRlcigKKyAgICAnbHMnLCBjb21wbGV0
aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwgc3Rkb3V0PSdmaWxlMS50
eHRcbmZpbGUyLnR4dFxuJyksCispKToKKyAgICBhc3NlcnQgc3VicHJvY2Vzcy5jaGVja19vdXRw
dXQoWydscyddKSA9PSBiJ2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nCisgICAgYXNzZXJ0IHN1YnBy
b2Nlc3MuY2hlY2tfY2FsbChbJ2xzJ10pID09IDAKK2BgYApJbmRleDogVG9vbHMvU2NyaXB0cy9s
aWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9fX2luaXRfXy5weQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5L19f
aW5pdF9fLnB5CShyZXZpc2lvbiAyNjYxMzApCisrKyBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93
ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5L19faW5pdF9fLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0z
NSw3ICszNSw3IEBAIGZyb20gd2Via2l0Y29yZXB5LnRpbWVvdXQgaW1wb3J0IFRpbWVvdXQKIGZy
b20gd2Via2l0Y29yZXB5LnN1YnByb2Nlc3NfdXRpbHMgaW1wb3J0IFRpbWVvdXRFeHBpcmVkLCBD
b21wbGV0ZWRQcm9jZXNzLCBydW4KIGZyb20gd2Via2l0Y29yZXB5Lm91dHB1dF9jYXB0dXJlIGlt
cG9ydCBMb2dnZXJDYXB0dXJlLCBPdXRwdXRDYXB0dXJlLCBPdXRwdXREdXBsaWNhdGUKIAotdmVy
c2lvbiA9IFZlcnNpb24oMCwgNCwgMCkKK3ZlcnNpb24gPSBWZXJzaW9uKDAsIDQsIDEpCiAKIGZy
b20gd2Via2l0Y29yZXB5LmF1dG9pbnN0YWxsIGltcG9ydCBQYWNrYWdlLCBBdXRvSW5zdGFsbAog
aWYgc3lzLnZlcnNpb25faW5mbyA+ICgzLCAwKToKSW5kZXg6IFRvb2xzL1NjcmlwdHMvbGlicmFy
aWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9ja3MvX19pbml0X18ucHkKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9t
b2Nrcy9fX2luaXRfXy5weQkocmV2aXNpb24gMjY2MTMwKQorKysgVG9vbHMvU2NyaXB0cy9saWJy
YXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9tb2Nrcy9fX2luaXRfXy5weQkod29ya2lu
ZyBjb3B5KQpAQCAtMjIsMyArMjIsNCBAQAogCiBmcm9tIHdlYmtpdGNvcmVweS5tb2Nrcy5jb250
ZXh0X3N0YWNrIGltcG9ydCBDb250ZXh0U3RhY2sKIGZyb20gd2Via2l0Y29yZXB5Lm1vY2tzLnRp
bWVfIGltcG9ydCBUaW1lCitmcm9tIHdlYmtpdGNvcmVweS5tb2Nrcy5zdWJwcm9jZXNzIGltcG9y
dCBQcm9jZXNzQ29tcGxldGlvbiwgU3VicHJvY2VzcwpJbmRleDogVG9vbHMvU2NyaXB0cy9saWJy
YXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9tb2Nrcy9wb3Blbi5weQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5L21v
Y2tzL3BvcGVuLnB5CShub25leGlzdGVudCkKKysrIFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dl
YmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9ja3MvcG9wZW4ucHkJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwyNDUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TgorIyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1w
b3J0IG9zCitpbXBvcnQgaW8KK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc2lnbmFsCitpbXBv
cnQgc3lzCitpbXBvcnQgdGltZQorCitmcm9tIHdlYmtpdGNvcmVweSBpbXBvcnQgbG9nLCBzdHJp
bmdfdXRpbHMsIFRpbWVvdXQsIFRpbWVvdXRFeHBpcmVkCitmcm9tIHdlYmtpdGNvcmVweS5tb2Nr
cyBpbXBvcnQgU3VicHJvY2VzcworCisjIFRoaXMgZmlsZSBpcyBtb2NrZWQgdmVyc2lvbiBvZiB0
aGUgc3VicHJvY2Vzcy5Qb3BlbiBvYmplY3QuIFRoaXMgb2JqZWN0IGRpZmZlcnMgc2xpZ2h0bHkg
YmV0d2VlbiBQeXRob24gMiBhbmQgMy4KKyMgVGhpcyBvYmplY3QgaXMgbm90IGEgY29tcGxldGUg
bW9jayBvZiBzdWJwcm9jZXNzLlBvcGVuLCBidXQgaXQgZG9lcyBlbmFibGUgdGhvcm91Z2ggdGVz
dGluZyBvZiBjb2RlIHdoaWNoIHVzZXMgUG9wZW4sCisjIGluIHBhcnRpY3VsYXIsIHRoZSBzdWJw
cm9jZXNzLmNoZWNrX2NhbGwsIHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0IGFuZCBzdWJwcm9jZXNz
LnJ1biBjb21tYW5kcy4KKyMKKyMgSWYgeW91IGZpbmQgeW91cnNlbGYgbmVlZGluZyB0byBlZGl0
IHRoaXMgZmlsZSwgbGVhbiBoZWF2aWx5IG9uIHRoZSB0ZXN0aW5nIGluCisjIHdlYmtpdGNvcmVw
eS50ZXN0cy5tb2Nrcy5zdWJwcm9jZXNzX3VuaXR0ZXN0IGFuZCBQeXRob24ncyBpbXBsZW1lbnRh
dGlvbiBvZiBQb3Blbi4KKworY2xhc3MgUG9wZW4ob2JqZWN0KToKKyAgICBORVhUX1BJRCA9IG9z
LmdldHBpZCgpICsgMQorCisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+ICgzLCAwKToKKyAgICAg
ICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3MsIGJ1ZnNpemU9LTEsIGV4ZWN1dGFibGU9Tm9uZSwK
KyAgICAgICAgICAgICAgICAgICAgIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9u
ZSwKKyAgICAgICAgICAgICAgICAgICAgIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPVRydWUs
CisgICAgICAgICAgICAgICAgICAgICBzaGVsbD1GYWxzZSwgY3dkPU5vbmUsIGVudj1Ob25lLCB1
bml2ZXJzYWxfbmV3bGluZXM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZv
PU5vbmUsIGNyZWF0aW9uZmxhZ3M9MCwKKyAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfc2ln
bmFscz1UcnVlLCBzdGFydF9uZXdfc2Vzc2lvbj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAg
IHBhc3NfZmRzPSgpLCBlbmNvZGluZz1Ob25lLCBlcnJvcnM9Tm9uZSwgdGV4dD1Ob25lKToKKwor
ICAgICAgICAgICAgc2VsZi5fY29tcGxldGlvbiA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuX2Nv
bW11bmljYXRpb25fc3RhcnRlZCA9IEZhbHNlCisgICAgICAgICAgICBpZiBidWZzaXplIGlzIE5v
bmU6CisgICAgICAgICAgICAgICAgYnVmc2l6ZSA9IC0xCisgICAgICAgICAgICBpZiBub3QgaXNp
bnN0YW5jZShidWZzaXplLCBpbnQpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigi
YnVmc2l6ZSBtdXN0IGJlIGFuIGludGVnZXIiKQorCisgICAgICAgICAgICBpZiBwYXNzX2ZkcyBh
bmQgbm90IGNsb3NlX2ZkczoKKyAgICAgICAgICAgICAgICBsb2cud2FybigicGFzc19mZHMgb3Zl
cnJpZGluZyBjbG9zZV9mZHMuIikKKworICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAg
ICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGFyZywgKHN0ciwgYnl0ZXMsIG9zLlBhdGhM
aWtlKSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAg
ICAgICAgICAgICAgICdleHBlY3RlZCB7fSwge30gb3Igb3MuUGF0aExpa2Ugb2JqZWN0LCBub3Qg
e30nLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBieXRlcywgdHlwZShhcmcpLAorICAg
ICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKyAgICAg
ICAgICAgIHNlbGYuX2FyZ3MgPSBhcmdzCisgICAgICAgICAgICBzZWxmLl9jd2QgPSBjd2QKKyAg
ICAgICAgICAgIHNlbGYuc3RkaW4gPSBzdHJpbmdfdXRpbHMuQnl0ZXNJTygpIGlmIHN0ZGluIGlz
IE5vbmUgb3Igc3RkaW4gPT0gLTEgZWxzZSBzdGRpbgorICAgICAgICAgICAgc2VsZi5zdGRvdXQg
PSBzdHJpbmdfdXRpbHMuQnl0ZXNJTygpIGlmIHN0ZG91dCA9PSAtMSBlbHNlIHN0ZG91dAorICAg
ICAgICAgICAgc2VsZi5fc3Rkb3V0X3R5cGUgPSBieXRlcyBpZiBzdGRvdXQgPT0gLTEgZWxzZSBz
dHIKKyAgICAgICAgICAgIHNlbGYuc3RkZXJyID0gc3RyaW5nX3V0aWxzLkJ5dGVzSU8oKSBpZiBz
dGRlcnIgPT0gLTEgZWxzZSBzdGRlcnIKKyAgICAgICAgICAgIHNlbGYuX3N0ZGVycl90eXBlID0g
Ynl0ZXMgaWYgc3RkZXJyID09IC0xIGVsc2Ugc3RyCisgICAgICAgICAgICBzZWxmLnJldHVybmNv
ZGUgPSBOb25lCisgICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAg
ICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisKKyAgICAgICAgICAgIGlmICh0ZXh0IGlzIG5vdCBO
b25lIGFuZCB1bml2ZXJzYWxfbmV3bGluZXMgaXMgbm90IE5vbmUgYW5kIGJvb2wodW5pdmVyc2Fs
X25ld2xpbmVzKSAhPSBib29sKHRleHQpKToKKyAgICAgICAgICAgICAgICByYWlzZSBzdWJwcm9j
ZXNzLlN1YnByb2Nlc3NFcnJvcignQ2Fubm90IGRpc2FtYmlndWF0ZSB3aGVuIGJvdGggdGV4dCBh
bmQgdW5pdmVyc2FsX25ld2xpbmVzIGFyZSBzdXBwbGllZCBidXQgZGlmZmVyZW50LiBQYXNzIG9u
ZSBvciB0aGUgb3RoZXIuJykKKworICAgICAgICAgICAgc2VsZi50ZXh0X21vZGUgPSBlbmNvZGlu
ZyBvciBlcnJvcnMgb3IgdGV4dCBvciB1bml2ZXJzYWxfbmV3bGluZXMKKworICAgICAgICAgICAg
aWYgc2VsZi5zdGRpbiBpcyBub3QgTm9uZSBhbmQgc2VsZi50ZXh0X21vZGU6CisgICAgICAgICAg
ICAgICAgc2VsZi5zdGRpbiA9IGlvLlRleHRJT1dyYXBwZXIoc2VsZi5zdGRpbiwgd3JpdGVfdGhy
b3VnaD1UcnVlLCBsaW5lX2J1ZmZlcmluZz0oYnVmc2l6ZSA9PSAxKSwgZW5jb2Rpbmc9ZW5jb2Rp
bmcsIGVycm9ycz1lcnJvcnMpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dCBpcyBub3QgTm9u
ZSBhbmQgc2VsZi50ZXh0X21vZGU6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQgPSBpby5U
ZXh0SU9XcmFwcGVyKHNlbGYuc3Rkb3V0LCBlbmNvZGluZz1lbmNvZGluZywgZXJyb3JzPWVycm9y
cykKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGRvdXRfdHlwZSA9IHN0cgorICAgICAgICAgICAg
aWYgc2VsZi5zdGRlcnIgaXMgbm90IE5vbmUgYW5kIHNlbGYudGV4dF9tb2RlOgorICAgICAgICAg
ICAgICAgIHNlbGYuc3RkZXJyID0gaW8uVGV4dElPV3JhcHBlcihzZWxmLnN0ZGVyciwgZW5jb2Rp
bmc9ZW5jb2RpbmcsIGVycm9ycz1lcnJvcnMpCisgICAgICAgICAgICAgICAgc2VsZi5fc3RkZXJy
X3R5cGUgPSBzdHIKKworICAgICAgICAgICAgU3VicHJvY2Vzcy5jb21wbGV0aW9uX2dlbmVyYXRv
cl9mb3IoYXJnc1swXSkKKworICAgICAgICAgICAgc2VsZi5waWQgPSBzZWxmLk5FWFRfUElECisg
ICAgICAgICAgICBzZWxmLk5FWFRfUElEICs9IDEKKworICAgICAgICAgICAgc2VsZi5fc3RhcnRf
dGltZSA9IHRpbWUudGltZSgpCisKKyAgICAgICAgZGVmIGNvbW11bmljYXRlKHNlbGYsIGlucHV0
PU5vbmUsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICAgICBpZiBzZWxmLl9jb21tdW5pY2F0aW9u
X3N0YXJ0ZWQgYW5kIGlucHV0OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0Nh
bm5vdCBzZW5kIGlucHV0IGFmdGVyIHN0YXJ0aW5nIGNvbW11bmljYXRpb24nKQorCisgICAgICAg
ICAgICBzZWxmLl9jb21tdW5pY2F0aW9uX3N0YXJ0ZWQgPSBUcnVlCisgICAgICAgICAgICBpZiBp
bnB1dDoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLndyaXRlKHN0cmluZ191dGlscy5lbmNv
ZGUoaW5wdXQpKQorICAgICAgICAgICAgc2VsZi53YWl0KHRpbWVvdXQ9dGltZW91dCkKKyAgICAg
ICAgICAgIHJldHVybiBzZWxmLnN0ZG91dC5yZWFkKCkgaWYgc2VsZi5zdGRvdXQgZWxzZSBOb25l
LCBzZWxmLnN0ZGVyci5yZWFkKCkgaWYgc2VsZi5zdGRlcnIgZWxzZSBOb25lCisKKyAgICAgICAg
ZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgICAgIGlmIHNlbGYucG9sbCgp
IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBpZiB0
aW1lb3V0IGFuZCAoc2VsZi5fY29tcGxldGlvbi5lbGFwc2VkIGlzIE5vbmUgb3IgdGltZW91dCA8
IHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVGltZW91
dEV4cGlyZWQoc2VsZi5fYXJncywgdGltZW91dCkKKworICAgICAgICAgICAgaWYgc2VsZi5fY29t
cGxldGlvbi5lbGFwc2VkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJv
cignUnVubmluZyBhIGNvbW1hbmQgdGhhdCBoYW5ncyB3aXRob3V0IGEgdGltZW91dCcpCisKKyAg
ICAgICAgICAgIGlmIHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZDoKKyAgICAgICAgICAgICAgICB0
aW1lLnNsZWVwKHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZCkKKworICAgICAgICAgICAgc2VsZi5y
ZXR1cm5jb2RlID0gc2VsZi5fY29tcGxldGlvbi5yZXR1cm5jb2RlCisgICAgICAgICAgICBpZiBz
ZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5zZWVrKDApCisgICAgICAg
ICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyci5zZWVrKDAp
CisKKyAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxm
CisKKyAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNl
YmFjayk6CisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzZWxm
LnN0ZG91dC5jbG9zZSgpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAg
ICAgICBzZWxmLnN0ZGVyci5jbG9zZSgpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGluOgorICAg
ICAgICAgICAgICAgIHNlbGYuc3RkaW4uY2xvc2UoKQorCisgICAgZWxzZToKKyAgICAgICAgZGVm
IF9faW5pdF9fKHNlbGYsIGFyZ3MsIGJ1ZnNpemU9LTEsIGV4ZWN1dGFibGU9Tm9uZSwKKyAgICAg
ICAgICAgICAgICAgICAgIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwKKyAg
ICAgICAgICAgICAgICAgICAgIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPVRydWUsCisgICAg
ICAgICAgICAgICAgICAgICBzaGVsbD1GYWxzZSwgY3dkPU5vbmUsIGVudj1Ob25lLCB1bml2ZXJz
YWxfbmV3bGluZXM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvPU5vbmUs
IGNyZWF0aW9uZmxhZ3M9MCk6CisKKyAgICAgICAgICAgIHNlbGYuX2NvbXBsZXRpb24gPSBOb25l
CisgICAgICAgICAgICBzZWxmLl9jb21tdW5pY2F0aW9uX3N0YXJ0ZWQgPSBGYWxzZQorICAgICAg
ICAgICAgaWYgYnVmc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJ1ZnNpemUgPSAtMQor
ICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmc2l6ZSwgaW50KToKKyAgICAgICAgICAg
ICAgICByYWlzZSBUeXBlRXJyb3IoImJ1ZnNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIikKKworICAg
ICAgICAgICAgc2VsZi5fYXJncyA9IGFyZ3MKKyAgICAgICAgICAgIHNlbGYuX2N3ZCA9IGN3ZAor
ICAgICAgICAgICAgc2VsZi5zdGRpbiA9IHN0cmluZ191dGlscy5CeXRlc0lPKCkgaWYgc3RkaW4g
aXMgTm9uZSBvciBzdGRpbiA9PSAtMSBlbHNlIHN0ZGluCisgICAgICAgICAgICBzZWxmLnN0ZG91
dCA9IHN0cmluZ191dGlscy5CeXRlc0lPKCkgaWYgc3Rkb3V0ID09IC0xIGVsc2Ugc3Rkb3V0Cisg
ICAgICAgICAgICBzZWxmLl9zdGRvdXRfdHlwZSA9IGJ5dGVzIGlmIHN0ZG91dCA9PSAtMSBlbHNl
IHN0cgorICAgICAgICAgICAgc2VsZi5zdGRlcnIgPSBzdHJpbmdfdXRpbHMuQnl0ZXNJTygpIGlm
IHN0ZGVyciA9PSAtMSBlbHNlIHN0ZGVycgorICAgICAgICAgICAgc2VsZi5fc3RkZXJyX3R5cGUg
PSBieXRlcyBpZiBzdGRlcnIgPT0gLTEgZWxzZSBzdHIKKyAgICAgICAgICAgIHNlbGYucmV0dXJu
Y29kZSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYudGV4dF9tb2RlID0gdW5pdmVyc2FsX25ld2xp
bmVzCisKKyAgICAgICAgICAgIFN1YnByb2Nlc3MuY29tcGxldGlvbl9nZW5lcmF0b3JfZm9yKGFy
Z3NbMF0pCisKKyAgICAgICAgICAgIHNlbGYucGlkID0gc2VsZi5ORVhUX1BJRAorICAgICAgICAg
ICAgc2VsZi5ORVhUX1BJRCArPSAxCisKKyAgICAgICAgICAgIHNlbGYuX3N0YXJ0X3RpbWUgPSB0
aW1lLnRpbWUoKQorCisgICAgICAgIGRlZiBjb21tdW5pY2F0ZShzZWxmLCBpbnB1dD1Ob25lKToK
KyAgICAgICAgICAgIGlmIHNlbGYuX2NvbW11bmljYXRpb25fc3RhcnRlZCBhbmQgaW5wdXQ6Cisg
ICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignQ2Fubm90IHNlbmQgaW5wdXQgYWZ0ZXIg
c3RhcnRpbmcgY29tbXVuaWNhdGlvbicpCisKKyAgICAgICAgICAgIHNlbGYuX2NvbW11bmljYXRp
b25fc3RhcnRlZCA9IFRydWUKKyAgICAgICAgICAgIGlmIGlucHV0OgorICAgICAgICAgICAgICAg
IHNlbGYuc3RkaW4ud3JpdGUoaW5wdXQpCisgICAgICAgICAgICBzZWxmLndhaXQoKQorICAgICAg
ICAgICAgcmV0dXJuIHNlbGYuc3Rkb3V0LnJlYWQoKSBpZiBzZWxmLnN0ZG91dCBlbHNlIE5vbmUs
IHNlbGYuc3RkZXJyLnJlYWQoKSBpZiBzZWxmLnN0ZGVyciBlbHNlIE5vbmUKKworICAgICAgICBk
ZWYgd2FpdChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYucG9sbCgpIGlzIG5vdCBOb25lOgor
ICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAjIE5lZWQgdG8gY2hlY2sgdGhl
IHRpbWVvdXQgY29udGV4dAorICAgICAgICAgICAgdGltZW91dCA9IFRpbWVvdXQuZGlmZmVyZW5j
ZSgpCisgICAgICAgICAgICBpZiB0aW1lb3V0IGFuZCAoc2VsZi5fY29tcGxldGlvbi5lbGFwc2Vk
IGlzIE5vbmUgb3IgdGltZW91dCA8IHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZCk6CisgICAgICAg
ICAgICAgICAgcmFpc2UgVGltZW91dEV4cGlyZWQoc2VsZi5fYXJncywgdGltZW91dCkKKworICAg
ICAgICAgICAgaWYgc2VsZi5fY29tcGxldGlvbi5lbGFwc2VkIGlzIE5vbmU6CisgICAgICAgICAg
ICAgICAgcmFpc2UgVmFsdWVFcnJvcignUnVubmluZyBhIGNvbW1hbmQgdGhhdCBoYW5ncyB3aXRo
b3V0IGEgdGltZW91dCcpCisKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbXBsZXRpb24uZWxhcHNl
ZDoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZCkK
KworICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gc2VsZi5fY29tcGxldGlvbi5yZXR1cm5j
b2RlCisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzZWxmLnN0
ZG91dC5zZWVrKDApCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAgICAg
ICBzZWxmLnN0ZGVyci5zZWVrKDApCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdW5pdmVyc2Fs
X25ld2xpbmVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXh0X21vZGUKKworICAgIEB1
bml2ZXJzYWxfbmV3bGluZXMuc2V0dGVyCisgICAgZGVmIHVuaXZlcnNhbF9uZXdsaW5lcyhzZWxm
LCB1bml2ZXJzYWxfbmV3bGluZXMpOgorICAgICAgICBzZWxmLnRleHRfbW9kZSA9IGJvb2wodW5p
dmVyc2FsX25ld2xpbmVzKQorCisgICAgZGVmIHBvbGwoc2VsZik6CisgICAgICAgIGlmIG5vdCBz
ZWxmLl9jb21wbGV0aW9uOgorICAgICAgICAgICAgc2VsZi5zdGRpbi5zZWVrKDApCisgICAgICAg
ICAgICBzZWxmLl9jb21wbGV0aW9uID0gU3VicHJvY2Vzcy5jb21wbGV0aW9uX2Zvcigqc2VsZi5f
YXJncywgY3dkPXNlbGYuX2N3ZCwgaW5wdXQ9c2VsZi5zdGRpbi5yZWFkKCkpCisKKyAgICAgICAg
ICAgIChzZWxmLnN0ZG91dCBvciBzeXMuc3Rkb3V0KS53cml0ZShzdHJpbmdfdXRpbHMuZGVjb2Rl
KHNlbGYuX2NvbXBsZXRpb24uc3Rkb3V0LCB0YXJnZXRfdHlwZT1zZWxmLl9zdGRvdXRfdHlwZSkp
CisgICAgICAgICAgICAoc2VsZi5zdGRvdXQgb3Igc3lzLnN0ZG91dCkuZmx1c2goKQorCisgICAg
ICAgICAgICAoc2VsZi5zdGRlcnIgb3Igc3lzLnN0ZGVycikud3JpdGUoc3RyaW5nX3V0aWxzLmRl
Y29kZShzZWxmLl9jb21wbGV0aW9uLnN0ZGVyciwgdGFyZ2V0X3R5cGU9c2VsZi5fc3RkZXJyX3R5
cGUpKQorICAgICAgICAgICAgKHNlbGYuc3RkZXJyIG9yIHN5cy5zdGRlcnIpLmZsdXNoKCkKKwor
ICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmUgYW5kIHRpbWUudGltZSgpID49
IHNlbGYuX3N0YXJ0X3RpbWUgKyBzZWxmLl9jb21wbGV0aW9uLmVsYXBzZWQ6CisgICAgICAgICAg
ICBzZWxmLnJldHVybmNvZGUgPSBzZWxmLl9jb21wbGV0aW9uLnJldHVybmNvZGUKKyAgICAgICAg
ICAgIGlmIHNlbGYuc3Rkb3V0OgorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LnNlZWsoMCkK
KyAgICAgICAgICAgIGlmIHNlbGYuc3RkZXJyOgorICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJy
LnNlZWsoMCkKKworICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCisKKyAgICBkZWYgc2Vu
ZF9zaWduYWwoc2VsZiwgc2lnKToKKyAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIG5vdCBO
b25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2lnIG5vdCBpbiBbc2lnbmFs
LlNJR1RFUk0sIHNpZ25hbC5TSUdLSUxMXToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3Io
J01vY2sgUG9wZW4gb2JqZWN0IGNhbm5vdCBoYW5kbGUgc2lnbmFsIHt9Jy5mb3JtYXQoc2lnKSkK
KyAgICAgICAgbG9nLmNyaXRpY2FsKCdNb2NrIHByb2Nlc3Mge30gc2VuZCBzaWduYWwge30nLmZv
cm1hdChzZWxmLnBpZCwgc2lnKSkKKyAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gLTEKKworICAg
IGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHNlbGYuc2VuZF9zaWduYWwoc2lnbmFsLlNJ
R1RFUk0pCisKKyAgICBkZWYga2lsbChzZWxmKToKKyAgICAgICAgc2VsZi5zZW5kX3NpZ25hbChz
aWduYWwuU0lHS0lMTCkKSW5kZXg6IFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVw
eS93ZWJraXRjb3JlcHkvbW9ja3Mvc3VicHJvY2Vzcy5weQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9T
Y3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5L21vY2tzL3N1YnByb2Nl
c3MucHkJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29y
ZXB5L3dlYmtpdGNvcmVweS9tb2Nrcy9zdWJwcm9jZXNzLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTYxIEBACisjIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04K
KyMgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9y
dCByZQoraW1wb3J0IHN5cworCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgY21wX3RvX2tleQorZnJv
bSB3ZWJraXRjb3JlcHkgaW1wb3J0IHN0cmluZ191dGlscywgdW5pY29kZQorZnJvbSB3ZWJraXRj
b3JlcHkubW9ja3MgaW1wb3J0IENvbnRleHRTdGFjaworCisKK2NsYXNzIFByb2Nlc3NDb21wbGV0
aW9uKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJldHVybmNvZGU9Tm9uZSwgc3Rk
b3V0PU5vbmUsIHN0ZGVycj1Ob25lLCBlbGFwc2VkPTApOgorICAgICAgICBzZWxmLnJldHVybmNv
ZGUgPSAxIGlmIHJldHVybmNvZGUgaXMgTm9uZSBlbHNlIHJldHVybmNvZGUKKyAgICAgICAgc2Vs
Zi5zdGRvdXQgPSBzdHJpbmdfdXRpbHMuZW5jb2RlKHN0ZG91dCkgaWYgc3Rkb3V0IGVsc2UgYicn
CisgICAgICAgIHNlbGYuc3RkZXJyID0gc3RyaW5nX3V0aWxzLmVuY29kZShzdGRlcnIpIGlmIHN0
ZGVyciBlbHNlIGInJworICAgICAgICBzZWxmLmVsYXBzZWQgPSBlbGFwc2VkCisKKworY2xhc3Mg
U3VicHJvY2VzcyhDb250ZXh0U3RhY2spOgorICAgICIiIgorICAgIE9yZ2FuaXplIFByb2Nlc3ND
b21wbGV0aW9ucyBzbyBjYWxscyB0byBzdWJwcm9jZXNzIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBh
IFByb2Nlc3NDb21wbGV0aW9uIGZvcgorICAgIGEgc2V0IG9mIGFyZ3VtZW50cyBvciB0cmlnZ2Vy
IGEgUHJvY2Vzc0NvbXBsZXRpb24gZ2VuZXJhdG9yLiBtb2Nrcy5TdWJwcm9jZXNzIG1ha2VzIGFu
IGF0dGVtcHQgdG8KKyAgICBwcmlvcml0aXplIFJvdXRlciBvYmplY3RzIGZvciBhIGdpdmVuIHNl
dCBvZiBhcmd1bWVudHMgc3VjaCB0aGF0IHRoZSBtb3N0IHNwZWNpZmljIGFwcGxpY2FibGUgcm91
dGVyCisgICAgaXMgcHJlZmVyZWQuCisKKyAgICBFeGFtcGxlIHVzYWdlOgorICAgICAgICB3aXRo
IG1vY2tzLlN1YnByb2Nlc3MobW9ja3MuU3VicHJvY2Vzcy5Sb3V0ZXIoCisgICAgICAgICAgICAn
bHMnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwgc3Rk
b3V0PSdmaWxlMS50eHRcbmZpbGUyLnR4dFxuJyksCisgICAgICAgICkpOgorICAgICAgICAgICAg
cmVzdWx0ID0gcnVuKFsnbHMnXSwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgZW5jb2Rpbmc9J3V0Zi04
JykKKyAgICAgICAgICAgIGFzc2VydCByZXN1bHQucmV0dXJuY29kZSA9PSAwCisgICAgICAgICAg
ICBhc3NlcnQgcmVzdWx0LnN0ZG91dCA9PSAnZmlsZTEudHh0XG5maWxlMi50eHRcbicKKyAgICAi
IiIKKyAgICB0b3AgPSBOb25lCisKKyAgICBjbGFzcyBSb3V0ZXIob2JqZWN0KToKKyAgICAgICAg
ZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICBjb21wbGV0
aW9uID0ga3dhcmdzLmdldCgnY29tcGxldGlvbicsIFByb2Nlc3NDb21wbGV0aW9uKCkpCisgICAg
ICAgICAgICBjd2QgPSBrd2FyZ3MuZ2V0KCdjd2QnLCBOb25lKQorICAgICAgICAgICAgaW5wdXQg
PSBrd2FyZ3MuZ2V0KCdpbnB1dCcsIE5vbmUpCisgICAgICAgICAgICBnZW5lcmF0b3IgPSBrd2Fy
Z3MuZ2V0KCdnZW5lcmF0b3InLCBOb25lKQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFy
Z3MsIHN0cikgb3IgaXNpbnN0YW5jZShhcmdzLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBz
ZWxmLmFyZ3MgPSBbYXJnc10KKyAgICAgICAgICAgIGVsaWYgbm90IGFyZ3M6CisgICAgICAgICAg
ICAgICAgcmFpc2UgVmFsdWVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWQgdG8gY29t
cGxldGlvbiByb3V0ZXInKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxm
LmFyZ3MgPSBhcmdzCisKKyAgICAgICAgICAgIHNlbGYuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yIG9y
IChsYW1iZGEgKmFyZ3MsICoqa3dhcmdzOiBjb21wbGV0aW9uKQorICAgICAgICAgICAgc2VsZi5j
d2QgPSBjd2QKKyAgICAgICAgICAgIHNlbGYuaW5wdXQgPSBzdHJpbmdfdXRpbHMuZW5jb2RlKGlu
cHV0KSBpZiBpbnB1dCBlbHNlIE5vbmUKKworICAgICAgICBkZWYgbWF0Y2hlcyhzZWxmLCAqYXJn
cywgKiprd2FyZ3MpOgorICAgICAgICAgICAgY3dkID0ga3dhcmdzLmdldCgnY3dkJywgTm9uZSkK
KyAgICAgICAgICAgIGlucHV0ID0ga3dhcmdzLmdldCgnaW5wdXQnLCBOb25lKQorCisgICAgICAg
ICAgICBpZiBsZW4oc2VsZi5hcmdzKSA+IGxlbihhcmdzKToKKyAgICAgICAgICAgICAgICByZXR1
cm4gRmFsc2UKKworICAgICAgICAgICAgZm9yIGNvdW50IGluIHJhbmdlKGxlbihzZWxmLmFyZ3Mp
KToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmFyZ3NbY291bnRdIGlzIE5vbmU6CisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5hcmdz
W2NvdW50XSA9PSBhcmdzW2NvdW50XToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAg
ICAgICAgICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZi5hcmdzW2NvdW50XSwgJ21hdGNoJykgYW5k
IHNlbGYuYXJnc1tjb3VudF0ubWF0Y2goYXJnc1tjb3VudF0pOgorICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsaWYgcmUubWF0Y2goc2VsZi5hcmdzW2NvdW50
XSwgYXJnc1tjb3VudF0pOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAg
ICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICAgICBpZiBzZWxmLmN3ZCBpcyBub3QgTm9u
ZSBhbmQgY3dkICE9IHNlbGYuY3dkOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAg
ICAgICAgICAgaWYgc2VsZi5pbnB1dCBpcyBub3QgTm9uZSBhbmQgaW5wdXQgIT0gc2VsZi5pbnB1
dDoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiBUcnVl
CisKKyAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAg
ICAgICBjd2QgPSBrd2FyZ3MuZ2V0KCdjd2QnLCBOb25lKQorICAgICAgICAgICAgaW5wdXQgPSBr
d2FyZ3MuZ2V0KCdpbnB1dCcsIE5vbmUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZW5lcmF0
b3IoKmFyZ3MsIGN3ZD1jd2QsIGlucHV0PWlucHV0KQorCisgICAgICAgIEBjbGFzc21ldGhvZAor
ICAgICAgICBkZWYgY29tcGFyZShjbHMsIGEsIGIpOgorICAgICAgICAgICAgZm9yIGNhbmRpZGF0
ZSBpbiBbCisgICAgICAgICAgICAgICAgbGVuKGIuYXJncykgLSBsZW4oYS5hcmdzKSwKKyAgICAg
ICAgICAgICAgICAwIGlmIHR5cGUoYS5jd2QpID09IHR5cGUoYi5jd2QpIGVsc2UgLTEgaWYgYS5j
d2QgZWxzZSAxLAorICAgICAgICAgICAgICAgIDAgaWYgdHlwZShhLmlucHV0KSA9PSB0eXBlKGIu
aW5wdXQpIGVsc2UgLTEgaWYgYS5pbnB1dCBlbHNlIDEsCisgICAgICAgICAgICBdOgorICAgICAg
ICAgICAgICAgIGlmIGNhbmRpZGF0ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRp
ZGF0ZQorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBj
b21wbGV0aW9uX2dlbmVyYXRvcl9mb3IoY2xzLCBwcm9ncmFtKToKKyAgICAgICAgY3VycmVudCA9
IGNscy50b3AKKyAgICAgICAgY2FuZGlkYXRlcyA9IFtdCisgICAgICAgIHdoaWxlIGN1cnJlbnQ6
CisgICAgICAgICAgICBmb3IgY29tcGxldGlvbiBpbiBjdXJyZW50LmNvbXBsZXRpb25zOgorICAg
ICAgICAgICAgICAgIGlmIGNvbXBsZXRpb24uYXJnc1swXSA9PSBwcm9ncmFtOgorICAgICAgICAg
ICAgICAgICAgICBjYW5kaWRhdGVzLmFwcGVuZChjb21wbGV0aW9uKQorICAgICAgICAgICAgICAg
IGlmIGN1cnJlbnQub3JkZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAg
ICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZpb3VzCisKKyAgICAgICAgaWYgY2FuZGlkYXRlczoK
KyAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGVzCisKKyAgICAgICAgaWYgc3lzLnZlcnNpb25f
aW5mbyA+ICgzLCAwKToKKyAgICAgICAgICAgIHJhaXNlIEZpbGVOb3RGb3VuZEVycm9yKCJObyBz
dWNoIGZpbGUgb3IgZGlyZWN0b3J5OiAne3BhdGh9JzogJ3twYXRofSciLmZvcm1hdChwYXRoPXBy
b2dyYW0pKQorICAgICAgICByYWlzZSBPU0Vycm9yKCdbRXJybm8gMl0gTm8gc3VjaCBmaWxlIG9y
IGRpcmVjdG9yeScpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgY29tcGxldGlvbl9mb3Io
Y2xzLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBjYW5kaWRhdGVzID0gWworICAgICAgICAg
ICAgY2FuZGlkYXRlIGZvciBjYW5kaWRhdGUgaW4gY2xzLmNvbXBsZXRpb25fZ2VuZXJhdG9yX2Zv
cihhcmdzWzBdKSBpZiBjYW5kaWRhdGUubWF0Y2hlcygqYXJncywgKiprd2FyZ3MpCisgICAgICAg
IF0KKyAgICAgICAgaWYgbm90IGNhbmRpZGF0ZXM6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRp
b25FcnJvcignUHJvdmlkZWQgYXJndW1lbnRzIHRvIHt9IGRvIG5vdCBtYXRjaCBhIHByb3ZpZGVk
IGNvbXBsZXRpb24nLmZvcm1hdChhcmdzWzBdKSkKKworICAgICAgICBjb21wbGV0aW9uID0gY2Fu
ZGlkYXRlc1swXQorICAgICAgICBjdXJyZW50ID0gY2xzLnRvcAorICAgICAgICB3aGlsZSBjdXJy
ZW50OgorICAgICAgICAgICAgaWYgY3VycmVudC5vcmRlcmVkIGFuZCBjb21wbGV0aW9uIGlzIGN1
cnJlbnQuY29tcGxldGlvbnNbMF06CisgICAgICAgICAgICAgICAgY3VycmVudC5jb21wbGV0aW9u
cy5wb3AoMCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY3VycmVudCA9IGN1
cnJlbnQucHJldmlvdXMKKyAgICAgICAgcmV0dXJuIGNvbXBsZXRpb24oKmFyZ3MsICoqa3dhcmdz
KQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICpjb21wbGV0aW9ucywgKiprd2FyZ3MpOgorICAg
ICAgICBvcmRlcmVkID0ga3dhcmdzLmdldCgnb3JkZXJlZCcsIEZhbHNlKQorICAgICAgICBzdXBl
cihTdWJwcm9jZXNzLCBzZWxmKS5fX2luaXRfXyhjbHM9U3VicHJvY2VzcykKKworICAgICAgICAj
IEFsbG93IG1vY2sgdG8gYmUgbWFuYWdlZCB2aWEgYXV0b2luc3RhbGwKKyAgICAgICAgZnJvbSBt
b2NrIGltcG9ydCBwYXRjaAorICAgICAgICBmcm9tIHdlYmtpdGNvcmVweS5tb2Nrcy5wb3BlbiBp
bXBvcnQgUG9wZW4KKyAgICAgICAgc2VsZi5wYXRjaGVzLmFwcGVuZChwYXRjaCgnc3VicHJvY2Vz
cy5Qb3BlbicsIG5ldz1Qb3BlbikpCisKKyAgICAgICAgc2VsZi5jb21wbGV0aW9ucyA9IGxpc3Qo
Y29tcGxldGlvbnMpIGlmIG9yZGVyZWQgZWxzZSBzb3J0ZWQoY29tcGxldGlvbnMsIGtleT1jbXBf
dG9fa2V5KHNlbGYuUm91dGVyLmNvbXBhcmUpKQorICAgICAgICBzZWxmLm9yZGVyZWQgPSBvcmRl
cmVkCkluZGV4OiBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvd2Via2l0Y29y
ZXB5L3Rlc3RzL21vY2tzL3N1YnByb2Nlc3NfdW5pdHRlc3QucHkKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS90ZXN0cy9tb2Nr
cy9zdWJwcm9jZXNzX3VuaXR0ZXN0LnB5CShub25leGlzdGVudCkKKysrIFRvb2xzL1NjcmlwdHMv
bGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvdGVzdHMvbW9ja3Mvc3VicHJvY2Vz
c191bml0dGVzdC5weQkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMCBAQAorIyBDb3B5cmln
aHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisjIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTCisjIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHVu
aXR0ZXN0CisKK2Zyb20gd2Via2l0Y29yZXB5IGltcG9ydCBCeXRlc0lPLCBPdXRwdXRDYXB0dXJl
LCBtb2NrcywgcnVuCisKKworY2xhc3MgTW9ja1N1YnByb2Nlc3ModW5pdHRlc3QuVGVzdENhc2Up
OgorICAgIExTID0gbW9ja3MuU3VicHJvY2Vzcy5Sb3V0ZXIoCisgICAgICAgICdscycsCisgICAg
ICAgIGNvbXBsZXRpb249bW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24ocmV0dXJuY29kZT0wLCBzdGRv
dXQ9J2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nKSwKKyAgICApCisgICAgU0xFRVAgPSBtb2Nrcy5T
dWJwcm9jZXNzLlJvdXRlcigKKyAgICAgICAgJ3NsZWVwJywKKyAgICAgICAgZ2VuZXJhdG9yPWxh
bWJkYSAqYXJncywgKiprd2FyZ3M6IG1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9
MCwgZWxhcHNlZD1pbnQoYXJnc1sxXSkpLAorICAgICkKKworICAgIGRlZiB0ZXN0X25vX2ZpbGUo
c2VsZik6CisgICAgICAgIHdpdGggbW9ja3MuU3VicHJvY2VzcyhzZWxmLkxTLCBzZWxmLlNMRUVQ
KToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcik6CisgICAgICAg
ICAgICAgICAgcnVuKFsnaW52YWxpZC1maWxlJ10pCisKKyAgICBkZWYgdGVzdF9wb3BlbihzZWxm
KToKKyAgICAgICAgd2l0aCBtb2Nrcy5UaW1lOgorICAgICAgICAgICAgd2l0aCBtb2Nrcy5TdWJw
cm9jZXNzKHNlbGYuTFMsIHNlbGYuU0xFRVApOgorICAgICAgICAgICAgICAgIGxzID0gc3VicHJv
Y2Vzcy5Qb3BlbihbJ2xzJ10sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9j
ZXNzLlBJUEUpCisgICAgICAgICAgICAgICAgbHMud2FpdCgpCisgICAgICAgICAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbCgwLCBscy5wb2xsKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbChiJ2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nLCBscy5zdGRvdXQucmVhZCgpKQorCisgICAg
ICAgICAgICAgICAgc2xlZXAgPSBzdWJwcm9jZXNzLlBvcGVuKFsnc2xlZXAnLCAnMSddLCBzdGRv
dXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2xlZXAucG9sbCgpKQorICAgICAgICAgICAgICAg
IHNsZWVwLndhaXQoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2xlZXAu
cG9sbCgpKQorCisgICAgZGVmIHRlc3Rfb3JkZXJlZChzZWxmKToKKyAgICAgICAgd2l0aCBPdXRw
dXRDYXB0dXJlKCksIG1vY2tzLlN1YnByb2Nlc3MoCisgICAgICAgICAgICBtb2Nrcy5TdWJwcm9j
ZXNzLlJvdXRlcignY29tbWFuZCcsIGNvbXBsZXRpb249bW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24o
cmV0dXJuY29kZT0wKSksCisgICAgICAgICAgICBtb2Nrcy5TdWJwcm9jZXNzLlJvdXRlcignY29t
bWFuZCcsIGNvbXBsZXRpb249bW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24ocmV0dXJuY29kZT0xKSks
CisgICAgICAgICAgICBvcmRlcmVkPVRydWUsCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKHJ1bihbJ2NvbW1hbmQnXSkucmV0dXJuY29kZSwgMCkKKyAgICAgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWwocnVuKFsnY29tbWFuZCddKS5yZXR1cm5jb2RlLCAxKQorICAgICAg
ICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKToKKyAgICAgICAgICAgICAgICBy
dW4oWydjb21tYW5kJ10pCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudF9wcmlvcml0eShzZWxmKToK
KyAgICAgICAgd2l0aCBPdXRwdXRDYXB0dXJlKCksIG1vY2tzLlN1YnByb2Nlc3MoCisgICAgICAg
ICAgICBtb2Nrcy5TdWJwcm9jZXNzLlJvdXRlcignY29tbWFuZCcsICctLWhlbHAnLCBjb21wbGV0
aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCkpLAorICAgICAgICAgICAg
bW9ja3MuU3VicHJvY2Vzcy5Sb3V0ZXIoJ2NvbW1hbmQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nl
c3NDb21wbGV0aW9uKHJldHVybmNvZGU9MSkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbChydW4oWydjb21tYW5kJ10pLnJldHVybmNvZGUsIDEpCisgICAgICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKHJ1bihbJ2NvbW1hbmQnLCAnLS1oZWxwJ10pLnJldHVybmNvZGUs
IDApCisKKyAgICBkZWYgdGVzdF9jd2RfcHJpb3JpdHkoc2VsZik6CisgICAgICAgIHdpdGggT3V0
cHV0Q2FwdHVyZSgpLCBtb2Nrcy5TdWJwcm9jZXNzKAorICAgICAgICAgICAgbW9ja3MuU3VicHJv
Y2Vzcy5Sb3V0ZXIoJ2NvbW1hbmQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9u
KHJldHVybmNvZGU9MCksIGN3ZD0nL2V4YW1wbGUnKSwKKyAgICAgICAgICAgIG1vY2tzLlN1YnBy
b2Nlc3MuUm91dGVyKCdjb21tYW5kJywgY29tcGxldGlvbj1tb2Nrcy5Qcm9jZXNzQ29tcGxldGlv
bihyZXR1cm5jb2RlPTEpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwocnVuKFsnY29tbWFuZCddKS5yZXR1cm5jb2RlLCAxKQorICAgICAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbChydW4oWydjb21tYW5kJ10sIGN3ZD0nL2V4YW1wbGUnKS5yZXR1cm5jb2RlLCAwKQor
CisgICAgZGVmIHRlc3RfaW5wdXRfcHJpb3JpdHkoc2VsZik6CisgICAgICAgIHdpdGggT3V0cHV0
Q2FwdHVyZSgpLCBtb2Nrcy5TdWJwcm9jZXNzKAorICAgICAgICAgICAgbW9ja3MuU3VicHJvY2Vz
cy5Sb3V0ZXIoJ2NvbW1hbmQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJl
dHVybmNvZGU9MCksIGlucHV0PSdzdGRpbicpLAorICAgICAgICAgICAgbW9ja3MuU3VicHJvY2Vz
cy5Sb3V0ZXIoJ2NvbW1hbmQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJl
dHVybmNvZGU9MSkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChy
dW4oWydjb21tYW5kJ10pLnJldHVybmNvZGUsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVx
dWFsKHJ1bihbJ2NvbW1hbmQnXSwgaW5wdXQ9J3N0ZGluJykucmV0dXJuY29kZSwgMCkKKyAgICAg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKFsnY29tbWFuZCddLCBzdGRpbj1CeXRlc0lPKGIn
c3RkaW4nKSkucmV0dXJuY29kZSwgMCkKKworCitjbGFzcyBNb2NrQ2hlY2tPdXRwdXQodW5pdHRl
c3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3BvcGVuKHNlbGYpOgorICAgICAgICB3aXRoIG1v
Y2tzLlN1YnByb2Nlc3MoTW9ja1N1YnByb2Nlc3MuTFMpOgorICAgICAgICAgICAgcmVzdWx0ID0g
c3VicHJvY2Vzcy5jaGVja19vdXRwdXQoWydscyddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbChyZXN1bHQsIGInZmlsZTEudHh0XG5maWxlMi50eHRcbicpCisKKworY2xhc3MgTW9ja0No
ZWNrQ2FsbCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcG9wZW4oc2VsZik6Cisg
ICAgICAgIHdpdGggT3V0cHV0Q2FwdHVyZSgpIGFzIGNhcHR1cmVkOgorICAgICAgICAgICAgd2l0
aCBtb2Nrcy5TdWJwcm9jZXNzKE1vY2tTdWJwcm9jZXNzLkxTKToKKyAgICAgICAgICAgICAgICBy
ZXN1bHQgPSBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoWydscyddKQorICAgICAgICAgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2Fw
dHVyZWQuc3Rkb3V0LmdldHZhbHVlKCksICdmaWxlMS50eHRcbmZpbGUyLnR4dFxuJykKKworCitj
bGFzcyBNb2NrUnVuKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9wb3BlbihzZWxm
KToKKyAgICAgICAgd2l0aCBPdXRwdXRDYXB0dXJlKCkgYXMgY2FwdHVyZWQ6CisgICAgICAgICAg
ICB3aXRoIG1vY2tzLlN1YnByb2Nlc3MoTW9ja1N1YnByb2Nlc3MuTFMpOgorICAgICAgICAgICAg
ICAgIHJlc3VsdCA9IHJ1bihbJ2xzJ10pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bChyZXN1bHQucmV0dXJuY29kZSwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFs
KHJlc3VsdC5zdGRvdXQsIE5vbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChy
ZXN1bHQuc3RkZXJyLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FwdHVyZWQu
c3Rkb3V0LmdldHZhbHVlKCksICdmaWxlMS50eHRcbmZpbGUyLnR4dFxuJykK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>407317</attachid>
            <date>2020-08-26 11:44:14 -0700</date>
            <delta_ts>2020-08-26 13:17:23 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-215712-20200826114413.patch</filename>
            <type>text/plain</type>
            <size>31747</size>
            <attacher name="Jonathan Bedard">jbedard</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDI2NjE3NykKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDM3IEBACisyMDIwLTA4LTI2ICBKb25hdGhhbiBCZWRhcmQgIDxqYmVkYXJkQGFwcGxlLmNv
bT4KKworICAgICAgIFt3ZWJraXRjb3JlcHldIFN0YW5kYXJkIFBvcGVuIG1vY2tpbmcgQVBJCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTU3MTIKKyAg
ICAgICAgPHJkYXI6Ly9wcm9ibGVtLzY3NTAxOTExPgorCisgICAgICAgIFJldmlld2VkIGJ5IERl
d2VpIFpodS4KKworICAgICAgICAqIFNjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS9SRUFE
TUUubWQ6IEFkZCBtb2Nrcy5TdWJwcm9jZXNzIGRvY3VtZW50YXRpb24uCisgICAgICAgICogU2Ny
aXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9fX2luaXRfXy5weTogQnVt
cCB2ZXJzaW9uLgorICAgICAgICAqIFNjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJr
aXRjb3JlcHkvbW9ja3MvX19pbml0X18ucHk6ICBFeHBvcnQgU3VicHJvY2VzcywgUHJvY2Vzc0Nv
bXBsZXRpb24uCisgICAgICAgICogU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtp
dGNvcmVweS9tb2Nrcy9wb3Blbi5weTogQWRkZWQuCisgICAgICAgIChQb3Blbik6IE1vY2sgUG9w
ZW4gb2JqZWN0IChmb3IgYm90aCBQeXRob24gMiBhbmQgMykuIFRoaXMgb2JqZWN0IGV4dHJhY3Rz
IGEgUHJvY2Vzc0NvbXBsZXRpb24gb2JqZWN0IGZyb20gdGhlCisgICAgICAgIG1vY2tlZCBTdWJw
cm9jZXNzIHN0YWNrIGFuZCBiZWhhaXZlcyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnQgb2YgdGhh
dCBvYmplY3QuCisgICAgICAgICogU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtp
dGNvcmVweS9tb2Nrcy9zdWJwcm9jZXNzLnB5OiBBZGRlZC4KKyAgICAgICAgKFBvcGVuQmFzZSk6
IEJhc2UgY2xhc3MgdG8gc2hhcmUgY29kZSBiZXR3ZWVuIFB5dGhvbiAyIGFuZCAzIGNvbnN0cnVj
dG9yLgorICAgICAgICAoUG9wZW4pOiBNb2NrIFBvcGVuIG9iamVjdCAoZm9yIGJvdGggUHl0aG9u
IDIgYW5kIDMpLiBUaGlzIG9iamVjdCBleHRyYWN0cyBhIFByb2Nlc3NDb21wbGV0aW9uIG9iamVj
dCBmcm9tIHRoZQorICAgICAgICBtb2NrZWQgU3VicHJvY2VzcyBzdGFjayBhbmQgYmVoYWl2ZXMg
YWNjb3JkaW5nIHRvIHRoZSBjb250ZW50IG9mIHRoYXQgb2JqZWN0LgorICAgICAgICAqIFNjcmlw
dHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9ja3Mvc3VicHJvY2Vzcy5w
eTogQWRkZWQuCisgICAgICAgIChQcm9jZXNzQ29tcGxldGlvbik6IENsYXNzIHdoaWNoIGNhcHR1
cmVzIHRoZSByZXN1bHQgb2YgYSBtb2NrIFBvcGVuIGNhbGwuCisgICAgICAgIChTdWJwcm9jZXNz
KToKKyAgICAgICAgKFN1YnByb2Nlc3MuUm91dGVyKTogT2JqZWN0IHdoaWNoIHJvdXRlcyBhIHNl
dCBvZiBzdWJwcm9jZXNzIGFyZ3VtZW50cyB0byBhIHNwZWNpZmljIFByb2Nlc3NDb21wbGV0aW9u
IG9yIGNhbGxiYWNrIHdoaWNoCisgICAgICAgIGdlbmVyYXRlcyBhIFByb2Nlc3NDb21wbGV0aW9u
LgorICAgICAgICAoU3VicHJvY2Vzcy5jb21wbGV0aW9uX2dlbmVyYXRvcl9mb3IpOiBHaXZlbiBh
IGZpbGUsIHNlYXJjaCB0aHJvdWdoIHRoZSBtb2NrZWQgU3VicHJvY2VzcyBzdGFjayB0byBmaW5k
IHRoZQorICAgICAgICBmaXJzdCBjb21wbGV0aW9uIGZvciB0aGUgcHJvdmlkZWQgZmlsZS4KKyAg
ICAgICAgKFN1YnByb2Nlc3MuY29tcGxldGlvbl9mb3IpOiBFeHRyYWN0IGZpbGUgbmFtZSBmcm9t
IGFyZ3VtZW50cywgZmluZCB0aGUgY29tcGxldGlvbiBnZW5lcmF0b3IsIGFuZCBjYWxsCisgICAg
ICAgIGl0IHdpdGggdGhlIHByb3ZpZWRlZCBhcmd1bWVudHMsIHdvcmtpbmcgZGlyZWN0b3J5IGFu
ZCBzdGRpbi4KKyAgICAgICAgKFN1YnByb2Nlc3MuX19pbml0X18pOgorICAgICAgICAqIFNjcmlw
dHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvdGVzdHMvbW9ja3Mvc3VicHJv
Y2Vzc191bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgIChNb2NrU3VicHJvY2Vzcyk6CisgICAg
ICAgIChNb2NrQ2hlY2tPdXRwdXQpOgorICAgICAgICAoTW9ja0NoZWNrQ2FsbCk6CisgICAgICAg
IChNb2NrUnVuKToKKwogMjAyMC0wOC0yNiAgWW91ZW5uIEZhYmxldCAgPHlvdWVubkBhcHBsZS5j
b20+CiAKICAgICAgICAgZW51bWVyYXRlRGV2aWNlcyBzaG91bGQgZXhwb3NlIGF1ZGlvb3V0cHV0
IGRldmljZXMgdGhhdCBhcmUgdGllZCB0byBhbiBhdWRpbyBpbnB1dCBkZXZpY2UKSW5kZXg6IFRv
b2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS9SRUFETUUubWQKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L1JFQURNRS5tZAkocmV2aXNp
b24gMjY2MTcwKQorKysgVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L1JFQURN
RS5tZAkod29ya2luZyBjb3B5KQpAQCAtNzYsMyArNzYsMzUgQEAgZnJvbSB3ZWJraXRjb3JlcHkg
aW1wb3J0IHJ1bgogCiByZXN1bHQgPSBydW4oW3N5cy5leGVjdXRhYmxlLCAnLWMnLCAncHJpbnQo
Im1lc3NhZ2UiKSddLCBjYXB0dXJlX291dHB1dD1UcnVlLCBlbmNvZGluZz0ndXRmLTgnKQogYGBg
CisKK01vY2tpbmcgb2Ygc3VicHJvY2VzcyBjb21tYW5kczoKK2BgYAorZnJvbSB3ZWJraXRjb3Jl
cHkgaW1wb3J0IG1vY2tzLCBydW4KKword2l0aCBtb2Nrcy5TdWJwcm9jZXNzKAorICAgICdscycs
IGNvbXBsZXRpb249bW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24ocmV0dXJuY29kZT0wLCBzdGRvdXQ9
J2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nKSwKKyk6CisgICAgcmVzdWx0ID0gcnVuKFsnbHMnXSwg
Y2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICBhc3NlcnQgcmVzdWx0
LnJldHVybmNvZGUgPT0gMAorICAgIGFzc2VydCByZXN1bHQuc3Rkb3V0ID09ICdmaWxlMS50eHRc
bmZpbGUyLnR4dFxuJworYGBgCitUaGUgbW9ja2luZyBzeXN0ZW0gZm9yIHN1YnByb2Nlc3MgYWxz
byBzdXBwb3J0cyBvdGhlciBzdWJwcm9jZXNzIEFQSXMgYmFzZWQgb24gUG9wZW46CitgYGAKK3dp
dGggbW9ja3MuU3VicHJvY2VzcygKKyAgICAnbHMnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3ND
b21wbGV0aW9uKHJldHVybmNvZGU9MCwgc3Rkb3V0PSdmaWxlMS50eHRcbmZpbGUyLnR4dFxuJyks
CispOgorICAgIGFzc2VydCBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbJ2xzJ10pID09IGInZmls
ZTEudHh0XG5maWxlMi50eHRcbicKKyAgICBhc3NlcnQgc3VicHJvY2Vzcy5jaGVja19jYWxsKFsn
bHMnXSkgPT0gMAorYGBgCitGb3Igd3JpdGluZyBpbnRlZ3JhdGlvbiB0ZXN0cywgdGhlIG1vY2tp
bmcgc3lzdGVtIGZvciBzdWJwcm9jZXNzIHN1cHBvcnRzIG1vY2tpbmcgbXVsdGlwbGUgcHJvY2Vz
cyBjYWxscyBhdCB0aGUgc2FtZSB0aW1lOgorYGBgCit3aXRoIG1vY2tzLlN1YnByb2Nlc3MoCisg
ICAgbW9ja3MuU3VicHJvY2Vzcy5Sb3V0ZXIoJ2NvbW1hbmQtYScsICdhcmd1bWVudCcsIGNvbXBs
ZXRpb249bW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24ocmV0dXJuY29kZT0wKSksCisgICAgbW9ja3Mu
U3VicHJvY2Vzcy5Sb3V0ZXIoJ2NvbW1hbmQtYicsIGNvbXBsZXRpb249bW9ja3MuUHJvY2Vzc0Nv
bXBsZXRpb24ocmV0dXJuY29kZT0tMSkpLAorKToKKyAgICByZXN1bHQgPSBydW4oWydjb21tYW5k
LWEnLCAnYXJndW1lbnQnXSkKKyAgICBhc3NlcnQgcmVzdWx0LnJldHVybmNvZGUgPT0gMAorCisg
ICAgcmVzdWx0ID0gcnVuKFsnY29tbWFuZC1iJ10pCisgICAgYXNzZXJ0IHJlc3VsdC5yZXR1cm5j
b2RlID09IC0xCitgYGAKSW5kZXg6IFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVw
eS93ZWJraXRjb3JlcHkvX19pbml0X18ucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy9s
aWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9fX2luaXRfXy5weQkocmV2aXNpb24g
MjY2MTcwKQorKysgVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNv
cmVweS9fX2luaXRfXy5weQkod29ya2luZyBjb3B5KQpAQCAtMzUsNyArMzUsNyBAQCBmcm9tIHdl
YmtpdGNvcmVweS50aW1lb3V0IGltcG9ydCBUaW1lb3V0CiBmcm9tIHdlYmtpdGNvcmVweS5zdWJw
cm9jZXNzX3V0aWxzIGltcG9ydCBUaW1lb3V0RXhwaXJlZCwgQ29tcGxldGVkUHJvY2VzcywgcnVu
CiBmcm9tIHdlYmtpdGNvcmVweS5vdXRwdXRfY2FwdHVyZSBpbXBvcnQgTG9nZ2VyQ2FwdHVyZSwg
T3V0cHV0Q2FwdHVyZSwgT3V0cHV0RHVwbGljYXRlCiAKLXZlcnNpb24gPSBWZXJzaW9uKDAsIDQs
IDApCit2ZXJzaW9uID0gVmVyc2lvbigwLCA0LCAxKQogCiBmcm9tIHdlYmtpdGNvcmVweS5hdXRv
aW5zdGFsbCBpbXBvcnQgUGFja2FnZSwgQXV0b0luc3RhbGwKIGlmIHN5cy52ZXJzaW9uX2luZm8g
PiAoMywgMCk6CkluZGV4OiBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvd2Vi
a2l0Y29yZXB5L21vY2tzL19faW5pdF9fLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMv
bGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9ja3MvX19pbml0X18ucHkJKHJl
dmlzaW9uIDI2NjE3MCkKKysrIFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93
ZWJraXRjb3JlcHkvbW9ja3MvX19pbml0X18ucHkJKHdvcmtpbmcgY29weSkKQEAgLTIyLDMgKzIy
LDQgQEAKIAogZnJvbSB3ZWJraXRjb3JlcHkubW9ja3MuY29udGV4dF9zdGFjayBpbXBvcnQgQ29u
dGV4dFN0YWNrCiBmcm9tIHdlYmtpdGNvcmVweS5tb2Nrcy50aW1lXyBpbXBvcnQgVGltZQorZnJv
bSB3ZWJraXRjb3JlcHkubW9ja3Muc3VicHJvY2VzcyBpbXBvcnQgUHJvY2Vzc0NvbXBsZXRpb24s
IFN1YnByb2Nlc3MKSW5kZXg6IFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93
ZWJraXRjb3JlcHkvbW9ja3MvcG9wZW4ucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy9s
aWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9tb2Nrcy9wb3Blbi5weQkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvd2Via2l0Y29y
ZXB5L21vY2tzL3BvcGVuLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjM3IEBACisjIENv
cHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyMgQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBvcworaW1wb3J0IGlvCitp
bXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUK
KworZnJvbSB3ZWJraXRjb3JlcHkgaW1wb3J0IGxvZywgc3RyaW5nX3V0aWxzLCBUaW1lb3V0LCBU
aW1lb3V0RXhwaXJlZCwgdW5pY29kZQorZnJvbSB3ZWJraXRjb3JlcHkubW9ja3MgaW1wb3J0IFN1
YnByb2Nlc3MKKworIyBUaGlzIGZpbGUgaXMgbW9ja2VkIHZlcnNpb24gb2YgdGhlIHN1YnByb2Nl
c3MuUG9wZW4gb2JqZWN0LiBUaGlzIG9iamVjdCBkaWZmZXJzIHNsaWdodGx5IGJldHdlZW4gUHl0
aG9uIDIgYW5kIDMuCisjIFRoaXMgb2JqZWN0IGlzIG5vdCBhIGNvbXBsZXRlIG1vY2sgb2Ygc3Vi
cHJvY2Vzcy5Qb3BlbiwgYnV0IGl0IGRvZXMgZW5hYmxlIHRob3JvdWdoIHRlc3Rpbmcgb2YgY29k
ZSB3aGljaCB1c2VzIFBvcGVuLAorIyBpbiBwYXJ0aWN1bGFyLCB0aGUgc3VicHJvY2Vzcy5jaGVj
a19jYWxsLCBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCBhbmQgc3VicHJvY2Vzcy5ydW4gY29tbWFu
ZHMuCisjCisjIElmIHlvdSBmaW5kIHlvdXJzZWxmIG5lZWRpbmcgdG8gZWRpdCB0aGlzIGZpbGUs
IGxlYW4gaGVhdmlseSBvbiB0aGUgdGVzdGluZyBpbgorIyB3ZWJraXRjb3JlcHkudGVzdHMubW9j
a3Muc3VicHJvY2Vzc191bml0dGVzdCBhbmQgUHl0aG9uJ3MgaW1wbGVtZW50YXRpb24gb2YgUG9w
ZW4uCisKK2NsYXNzIFBvcGVuQmFzZShvYmplY3QpOgorICAgIE5FWFRfUElEID0gb3MuZ2V0cGlk
KCkgKyAxCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJncywgYnVmc2l6ZT1Ob25lLCBjd2Q9
Tm9uZSwgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHN0ZGVycj1Ob25lKToKKyAgICAgICAgc2Vs
Zi5fY29tcGxldGlvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5fY29tbXVuaWNhdGlvbl9zdGFydGVk
ID0gRmFsc2UKKyAgICAgICAgaWYgYnVmc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgYnVmc2l6
ZSA9IC0xCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ1ZnNpemUsIGludCk6CisgICAgICAg
ICAgICByYWlzZSBUeXBlRXJyb3IoImJ1ZnNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIikKKworICAg
ICAgICBzZWxmLl9hcmdzID0gYXJncworICAgICAgICBzZWxmLl9jd2QgPSBjd2QKKworICAgICAg
ICBzZWxmLnJldHVybmNvZGUgPSBOb25lCisKKyAgICAgICAgc2VsZi5zdGRpbiA9IHN0cmluZ191
dGlscy5CeXRlc0lPKCkgaWYgc3RkaW4gaXMgTm9uZSBvciBzdGRpbiA9PSAtMSBlbHNlIHN0ZGlu
CisgICAgICAgIHNlbGYuc3Rkb3V0ID0gc3RyaW5nX3V0aWxzLkJ5dGVzSU8oKSBpZiBzdGRvdXQg
PT0gLTEgZWxzZSBzdGRvdXQKKyAgICAgICAgc2VsZi5fc3Rkb3V0X3R5cGUgPSBieXRlcyBpZiBz
dGRvdXQgPT0gLTEgZWxzZSBzdHIKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBzdHJpbmdfdXRpbHMu
Qnl0ZXNJTygpIGlmIHN0ZGVyciA9PSAtMSBlbHNlIHN0ZGVycgorICAgICAgICBzZWxmLl9zdGRl
cnJfdHlwZSA9IGJ5dGVzIGlmIHN0ZGVyciA9PSAtMSBlbHNlIHN0cgorCisgICAgICAgIFN1YnBy
b2Nlc3MuY29tcGxldGlvbl9nZW5lcmF0b3JfZm9yKGFyZ3NbMF0pCisKKyAgICAgICAgc2VsZi5w
aWQgPSBzZWxmLk5FWFRfUElECisgICAgICAgIHNlbGYuTkVYVF9QSUQgKz0gMQorCisgICAgICAg
IHNlbGYuX3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorCisKK2NsYXNzIFBvcGVuKFBvcGVuQmFz
ZSk6CisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+ICgzLCAwKToKKyAgICAgICAgZGVmIF9faW5p
dF9fKHNlbGYsIGFyZ3MsIGJ1ZnNpemU9Tm9uZSwgZXhlY3V0YWJsZT1Ob25lLAorICAgICAgICAg
ICAgICAgICAgICAgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHN0ZGVycj1Ob25lLAorICAgICAg
ICAgICAgICAgICAgICAgcHJlZXhlY19mbj1Ob25lLCBjbG9zZV9mZHM9VHJ1ZSwKKyAgICAgICAg
ICAgICAgICAgICAgIHNoZWxsPUZhbHNlLCBjd2Q9Tm9uZSwgZW52PU5vbmUsIHVuaXZlcnNhbF9u
ZXdsaW5lcz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm89Tm9uZSwgY3Jl
YXRpb25mbGFncz0wLAorICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9zaWduYWxzPVRydWUs
IHN0YXJ0X25ld19zZXNzaW9uPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgcGFzc19mZHM9
KCksIGVuY29kaW5nPU5vbmUsIGVycm9ycz1Ob25lLCB0ZXh0PU5vbmUpOgorCisgICAgICAgICAg
ICBzdXBlcihQb3Blbiwgc2VsZikuX19pbml0X18oYXJncywgYnVmc2l6ZT1idWZzaXplLCBjd2Q9
Y3dkLCBzdGRpbj1zdGRpbiwgc3Rkb3V0PXN0ZG91dCwgc3RkZXJyPXN0ZGVycikKKworICAgICAg
ICAgICAgaWYgcGFzc19mZHMgYW5kIG5vdCBjbG9zZV9mZHM6CisgICAgICAgICAgICAgICAgbG9n
Lndhcm4oInBhc3NfZmRzIG92ZXJyaWRpbmcgY2xvc2VfZmRzLiIpCisKKyAgICAgICAgICAgIGZv
ciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhcmcsIChz
dHIsIGJ5dGVzLCBvcy5QYXRoTGlrZSkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBl
RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAnZXhwZWN0ZWQge30sIHt9IG9yIG9zLlBh
dGhMaWtlIG9iamVjdCwgbm90IHt9JywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgYnl0
ZXMsIHR5cGUoYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICBzZWxm
LmFyZ3MgPSBhcmdzCisgICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAg
ICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisKKyAgICAgICAgICAgIGlmICh0ZXh0IGlzIG5v
dCBOb25lIGFuZCB1bml2ZXJzYWxfbmV3bGluZXMgaXMgbm90IE5vbmUgYW5kIGJvb2wodW5pdmVy
c2FsX25ld2xpbmVzKSAhPSBib29sKHRleHQpKToKKyAgICAgICAgICAgICAgICByYWlzZSBzdWJw
cm9jZXNzLlN1YnByb2Nlc3NFcnJvcignQ2Fubm90IGRpc2FtYmlndWF0ZSB3aGVuIGJvdGggdGV4
dCBhbmQgdW5pdmVyc2FsX25ld2xpbmVzIGFyZSBzdXBwbGllZCBidXQgZGlmZmVyZW50LiBQYXNz
IG9uZSBvciB0aGUgb3RoZXIuJykKKworICAgICAgICAgICAgc2VsZi50ZXh0X21vZGUgPSBlbmNv
ZGluZyBvciBlcnJvcnMgb3IgdGV4dCBvciB1bml2ZXJzYWxfbmV3bGluZXMKKworICAgICAgICAg
ICAgaWYgc2VsZi5zdGRpbiBpcyBub3QgTm9uZSBhbmQgc2VsZi50ZXh0X21vZGU6CisgICAgICAg
ICAgICAgICAgc2VsZi5zdGRpbiA9IGlvLlRleHRJT1dyYXBwZXIoc2VsZi5zdGRpbiwgd3JpdGVf
dGhyb3VnaD1UcnVlLCBsaW5lX2J1ZmZlcmluZz0oYnVmc2l6ZSA9PSAxKSwgZW5jb2Rpbmc9ZW5j
b2RpbmcsIGVycm9ycz1lcnJvcnMpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dCBpcyBub3Qg
Tm9uZSBhbmQgc2VsZi50ZXh0X21vZGU6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQgPSBp
by5UZXh0SU9XcmFwcGVyKHNlbGYuc3Rkb3V0LCBlbmNvZGluZz1lbmNvZGluZywgZXJyb3JzPWVy
cm9ycykKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGRvdXRfdHlwZSA9IHN0cgorICAgICAgICAg
ICAgaWYgc2VsZi5zdGRlcnIgaXMgbm90IE5vbmUgYW5kIHNlbGYudGV4dF9tb2RlOgorICAgICAg
ICAgICAgICAgIHNlbGYuc3RkZXJyID0gaW8uVGV4dElPV3JhcHBlcihzZWxmLnN0ZGVyciwgZW5j
b2Rpbmc9ZW5jb2RpbmcsIGVycm9ycz1lcnJvcnMpCisgICAgICAgICAgICAgICAgc2VsZi5fc3Rk
ZXJyX3R5cGUgPSBzdHIKKworICAgICAgICBkZWYgY29tbXVuaWNhdGUoc2VsZiwgaW5wdXQ9Tm9u
ZSwgdGltZW91dD1Ob25lKToKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbW11bmljYXRpb25fc3Rh
cnRlZCBhbmQgaW5wdXQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignQ2Fubm90
IHNlbmQgaW5wdXQgYWZ0ZXIgc3RhcnRpbmcgY29tbXVuaWNhdGlvbicpCisKKyAgICAgICAgICAg
IHNlbGYuX2NvbW11bmljYXRpb25fc3RhcnRlZCA9IFRydWUKKyAgICAgICAgICAgIGlmIGlucHV0
OgorICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4ud3JpdGUoc3RyaW5nX3V0aWxzLmVuY29kZShp
bnB1dCkpCisgICAgICAgICAgICBzZWxmLndhaXQodGltZW91dD10aW1lb3V0KQorICAgICAgICAg
ICAgcmV0dXJuIHNlbGYuc3Rkb3V0LnJlYWQoKSBpZiBzZWxmLnN0ZG91dCBlbHNlIE5vbmUsIHNl
bGYuc3RkZXJyLnJlYWQoKSBpZiBzZWxmLnN0ZGVyciBlbHNlIE5vbmUKKworICAgICAgICBkZWYg
d2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAgICAgaWYgc2VsZi5wb2xsKCkgaXMg
bm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGlmIHRpbWVv
dXQgYW5kIChzZWxmLl9jb21wbGV0aW9uLmVsYXBzZWQgaXMgTm9uZSBvciB0aW1lb3V0IDwgc2Vs
Zi5fY29tcGxldGlvbi5lbGFwc2VkKToKKyAgICAgICAgICAgICAgICByYWlzZSBUaW1lb3V0RXhw
aXJlZChzZWxmLl9hcmdzLCB0aW1lb3V0KQorCisgICAgICAgICAgICBpZiBzZWxmLl9jb21wbGV0
aW9uLmVsYXBzZWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdS
dW5uaW5nIGEgY29tbWFuZCB0aGF0IGhhbmdzIHdpdGhvdXQgYSB0aW1lb3V0JykKKworICAgICAg
ICAgICAgaWYgc2VsZi5fY29tcGxldGlvbi5lbGFwc2VkOgorICAgICAgICAgICAgICAgIHRpbWUu
c2xlZXAoc2VsZi5fY29tcGxldGlvbi5lbGFwc2VkKQorCisgICAgICAgICAgICBzZWxmLnJldHVy
bmNvZGUgPSBzZWxmLl9jb21wbGV0aW9uLnJldHVybmNvZGUKKyAgICAgICAgICAgIGlmIHNlbGYu
c3Rkb3V0OgorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgICAg
IGlmIHNlbGYuc3RkZXJyOgorICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyLnNlZWsoMCkKKwor
ICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKwor
ICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNr
KToKKyAgICAgICAgICAgIGlmIHNlbGYuc3Rkb3V0OgorICAgICAgICAgICAgICAgIHNlbGYuc3Rk
b3V0LmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkZXJyOgorICAgICAgICAgICAgICAg
IHNlbGYuc3RkZXJyLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW46CisgICAgICAg
ICAgICAgICAgc2VsZi5zdGRpbi5jbG9zZSgpCisKKyAgICBlbHNlOgorICAgICAgICBkZWYgX19p
bml0X18oc2VsZiwgYXJncywgYnVmc2l6ZT0tMSwgZXhlY3V0YWJsZT1Ob25lLAorICAgICAgICAg
ICAgICAgICAgICAgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHN0ZGVycj1Ob25lLAorICAgICAg
ICAgICAgICAgICAgICAgcHJlZXhlY19mbj1Ob25lLCBjbG9zZV9mZHM9VHJ1ZSwKKyAgICAgICAg
ICAgICAgICAgICAgIHNoZWxsPUZhbHNlLCBjd2Q9Tm9uZSwgZW52PU5vbmUsIHVuaXZlcnNhbF9u
ZXdsaW5lcz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm89Tm9uZSwgY3Jl
YXRpb25mbGFncz0wKToKKworICAgICAgICAgICAgc3VwZXIoUG9wZW4sIHNlbGYpLl9faW5pdF9f
KGFyZ3MsIGJ1ZnNpemU9YnVmc2l6ZSwgY3dkPWN3ZCwgc3RkaW49c3RkaW4sIHN0ZG91dD1zdGRv
dXQsIHN0ZGVycj1zdGRlcnIpCisKKyAgICAgICAgICAgIGZvciBpbmRleCBpbiByYW5nZShsZW4o
YXJncykpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGFyZ3NbaW5kZXhdLCAo
c3RyLCB1bmljb2RlKSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZXhl
Y3YoKSBhcmcge30gbXVzdCBjb250YWluIG9ubHkgc3RyaW5ncycuZm9ybWF0KGluZGV4ICsgMSkp
CisKKyAgICAgICAgICAgIHNlbGYudGV4dF9tb2RlID0gdW5pdmVyc2FsX25ld2xpbmVzCisKKyAg
ICAgICAgZGVmIGNvbW11bmljYXRlKHNlbGYsIGlucHV0PU5vbmUpOgorICAgICAgICAgICAgaWYg
c2VsZi5fY29tbXVuaWNhdGlvbl9zdGFydGVkIGFuZCBpbnB1dDoKKyAgICAgICAgICAgICAgICBy
YWlzZSBWYWx1ZUVycm9yKCdDYW5ub3Qgc2VuZCBpbnB1dCBhZnRlciBzdGFydGluZyBjb21tdW5p
Y2F0aW9uJykKKworICAgICAgICAgICAgc2VsZi5fY29tbXVuaWNhdGlvbl9zdGFydGVkID0gVHJ1
ZQorICAgICAgICAgICAgaWYgaW5wdXQ6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi53cml0
ZShpbnB1dCkKKyAgICAgICAgICAgIHNlbGYud2FpdCgpCisgICAgICAgICAgICByZXR1cm4gc2Vs
Zi5zdGRvdXQucmVhZCgpIGlmIHNlbGYuc3Rkb3V0IGVsc2UgTm9uZSwgc2VsZi5zdGRlcnIucmVh
ZCgpIGlmIHNlbGYuc3RkZXJyIGVsc2UgTm9uZQorCisgICAgICAgIGRlZiB3YWl0KHNlbGYpOgor
ICAgICAgICAgICAgaWYgc2VsZi5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAg
cmV0dXJuCisKKyAgICAgICAgICAgICMgTmVlZCB0byBjaGVjayB0aGUgdGltZW91dCBjb250ZXh0
CisgICAgICAgICAgICB0aW1lb3V0ID0gVGltZW91dC5kaWZmZXJlbmNlKCkKKyAgICAgICAgICAg
IGlmIHRpbWVvdXQgYW5kIChzZWxmLl9jb21wbGV0aW9uLmVsYXBzZWQgaXMgTm9uZSBvciB0aW1l
b3V0IDwgc2VsZi5fY29tcGxldGlvbi5lbGFwc2VkKToKKyAgICAgICAgICAgICAgICByYWlzZSBU
aW1lb3V0RXhwaXJlZChzZWxmLl9hcmdzLCB0aW1lb3V0KQorCisgICAgICAgICAgICBpZiBzZWxm
Ll9jb21wbGV0aW9uLmVsYXBzZWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1
ZUVycm9yKCdSdW5uaW5nIGEgY29tbWFuZCB0aGF0IGhhbmdzIHdpdGhvdXQgYSB0aW1lb3V0JykK
KworICAgICAgICAgICAgaWYgc2VsZi5fY29tcGxldGlvbi5lbGFwc2VkOgorICAgICAgICAgICAg
ICAgIHRpbWUuc2xlZXAoc2VsZi5fY29tcGxldGlvbi5lbGFwc2VkKQorCisgICAgICAgICAgICBz
ZWxmLnJldHVybmNvZGUgPSBzZWxmLl9jb21wbGV0aW9uLnJldHVybmNvZGUKKyAgICAgICAgICAg
IGlmIHNlbGYuc3Rkb3V0OgorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LnNlZWsoMCkKKyAg
ICAgICAgICAgIGlmIHNlbGYuc3RkZXJyOgorICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyLnNl
ZWsoMCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB1bml2ZXJzYWxfbmV3bGluZXMoc2VsZik6
CisgICAgICAgIHJldHVybiBzZWxmLnRleHRfbW9kZQorCisgICAgQHVuaXZlcnNhbF9uZXdsaW5l
cy5zZXR0ZXIKKyAgICBkZWYgdW5pdmVyc2FsX25ld2xpbmVzKHNlbGYsIHVuaXZlcnNhbF9uZXds
aW5lcyk6CisgICAgICAgIHNlbGYudGV4dF9tb2RlID0gYm9vbCh1bml2ZXJzYWxfbmV3bGluZXMp
CisKKyAgICBkZWYgcG9sbChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2NvbXBsZXRpb246
CisgICAgICAgICAgICBzZWxmLnN0ZGluLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuX2NvbXBs
ZXRpb24gPSBTdWJwcm9jZXNzLmNvbXBsZXRpb25fZm9yKCpzZWxmLl9hcmdzLCBjd2Q9c2VsZi5f
Y3dkLCBpbnB1dD1zZWxmLnN0ZGluLnJlYWQoKSkKKworICAgICAgICAgICAgKHNlbGYuc3Rkb3V0
IG9yIHN5cy5zdGRvdXQpLndyaXRlKHN0cmluZ191dGlscy5kZWNvZGUoc2VsZi5fY29tcGxldGlv
bi5zdGRvdXQsIHRhcmdldF90eXBlPXNlbGYuX3N0ZG91dF90eXBlKSkKKyAgICAgICAgICAgIChz
ZWxmLnN0ZG91dCBvciBzeXMuc3Rkb3V0KS5mbHVzaCgpCisKKyAgICAgICAgICAgIChzZWxmLnN0
ZGVyciBvciBzeXMuc3RkZXJyKS53cml0ZShzdHJpbmdfdXRpbHMuZGVjb2RlKHNlbGYuX2NvbXBs
ZXRpb24uc3RkZXJyLCB0YXJnZXRfdHlwZT1zZWxmLl9zdGRlcnJfdHlwZSkpCisgICAgICAgICAg
ICAoc2VsZi5zdGRlcnIgb3Igc3lzLnN0ZGVycikuZmx1c2goKQorCisgICAgICAgIGlmIHNlbGYu
cmV0dXJuY29kZSBpcyBub3QgTm9uZSBhbmQgdGltZS50aW1lKCkgPj0gc2VsZi5fc3RhcnRfdGlt
ZSArIHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZDoKKyAgICAgICAgICAgIHNlbGYucmV0dXJuY29k
ZSA9IHNlbGYuX2NvbXBsZXRpb24ucmV0dXJuY29kZQorICAgICAgICAgICAgaWYgc2VsZi5zdGRv
dXQ6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQuc2VlaygwKQorICAgICAgICAgICAgaWYg
c2VsZi5zdGRlcnI6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRlcnIuc2VlaygwKQorCisgICAg
ICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKKworICAgIGRlZiBzZW5kX3NpZ25hbChzZWxmLCBz
aWcpOgorICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAg
ICByZXR1cm4KKworICAgICAgICBpZiBzaWcgbm90IGluIFtzaWduYWwuU0lHVEVSTSwgc2lnbmFs
LlNJR0tJTExdOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTW9jayBQb3BlbiBvYmpl
Y3QgY2Fubm90IGhhbmRsZSBzaWduYWwge30nLmZvcm1hdChzaWcpKQorICAgICAgICBsb2cuY3Jp
dGljYWwoJ01vY2sgcHJvY2VzcyB7fSBzZW5kIHNpZ25hbCB7fScuZm9ybWF0KHNlbGYucGlkLCBz
aWcpKQorICAgICAgICBzZWxmLnJldHVybmNvZGUgPSAtMQorCisgICAgZGVmIHRlcm1pbmF0ZShz
ZWxmKToKKyAgICAgICAgc2VsZi5zZW5kX3NpZ25hbChzaWduYWwuU0lHVEVSTSkKKworICAgIGRl
ZiBraWxsKHNlbGYpOgorICAgICAgICBzZWxmLnNlbmRfc2lnbmFsKHNpZ25hbC5TSUdLSUxMKQpJ
bmRleDogVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9t
b2Nrcy9zdWJwcm9jZXNzLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvbGlicmFyaWVz
L3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9ja3Mvc3VicHJvY2Vzcy5weQkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5
L21vY2tzL3N1YnByb2Nlc3MucHkJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxODUgQEAKKyMg
Q29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMg
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiAgUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIwor
IyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIyBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IHJlCitpbXBvcnQgc3lz
CisKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCBjbXBfdG9fa2V5Citmcm9tIHdlYmtpdGNvcmVweSBp
bXBvcnQgc3RyaW5nX3V0aWxzLCB1bmljb2RlCitmcm9tIHdlYmtpdGNvcmVweS5tb2NrcyBpbXBv
cnQgQ29udGV4dFN0YWNrCisKKworY2xhc3MgUHJvY2Vzc0NvbXBsZXRpb24ob2JqZWN0KToKKyAg
ICBkZWYgX19pbml0X18oc2VsZiwgcmV0dXJuY29kZT1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJy
PU5vbmUsIGVsYXBzZWQ9MCk6CisgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IDEgaWYgcmV0dXJu
Y29kZSBpcyBOb25lIGVsc2UgcmV0dXJuY29kZQorICAgICAgICBzZWxmLnN0ZG91dCA9IHN0cmlu
Z191dGlscy5lbmNvZGUoc3Rkb3V0KSBpZiBzdGRvdXQgZWxzZSBiJycKKyAgICAgICAgc2VsZi5z
dGRlcnIgPSBzdHJpbmdfdXRpbHMuZW5jb2RlKHN0ZGVycikgaWYgc3RkZXJyIGVsc2UgYicnCisg
ICAgICAgIHNlbGYuZWxhcHNlZCA9IGVsYXBzZWQKKworCitjbGFzcyBTdWJwcm9jZXNzKENvbnRl
eHRTdGFjayk6CisgICAgIiIiCisgICAgT3JnYW5pemUgUHJvY2Vzc0NvbXBsZXRpb25zIHNvIGNh
bGxzIHRvIHN1YnByb2Nlc3MgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIGEgUHJvY2Vzc0NvbXBsZXRp
b24gZm9yCisgICAgYSBzZXQgb2YgYXJndW1lbnRzIG9yIHRyaWdnZXIgYSBQcm9jZXNzQ29tcGxl
dGlvbiBnZW5lcmF0b3IuIG1vY2tzLlN1YnByb2Nlc3MgbWFrZXMgYW4gYXR0ZW1wdCB0bworICAg
IHByaW9yaXRpemUgUm91dGVyIG9iamVjdHMgZm9yIGEgZ2l2ZW4gc2V0IG9mIGFyZ3VtZW50cyBz
dWNoIHRoYXQgdGhlIG1vc3Qgc3BlY2lmaWMgYXBwbGljYWJsZSByb3V0ZXIKKyAgICBpcyBwcmVm
ZXJlZC4KKworICAgIEV4YW1wbGUgdXNhZ2UgbW9ja2luZyBhIHNpbmdsZSBjb21tYW5kOgorICAg
ICAgICB3aXRoIG1vY2tzLlN1YnByb2Nlc3MoCisgICAgICAgICAgICAnbHMnLCBjb21wbGV0aW9u
PW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwgc3Rkb3V0PSdmaWxlMS50eHRc
bmZpbGUyLnR4dFxuJyksCisgICAgICAgICk6CisgICAgICAgICAgICByZXN1bHQgPSBydW4oWyds
cyddLCBjYXB0dXJlX291dHB1dD1UcnVlLCBlbmNvZGluZz0ndXRmLTgnKQorICAgICAgICAgICAg
YXNzZXJ0IHJlc3VsdC5yZXR1cm5jb2RlID09IDAKKyAgICAgICAgICAgIGFzc2VydCByZXN1bHQu
c3Rkb3V0ID09ICdmaWxlMS50eHRcbmZpbGUyLnR4dFxuJworCisgICAgRXhhbXBsZSB1c2FnZSBt
b2NraW5nIGEgc2V0IG9mIGNvbW1hbmRzOgorICAgICAgICB3aXRoIG1vY2tzLlN1YnByb2Nlc3Mo
CisgICAgICAgICAgICBtb2Nrcy5TdWJwcm9jZXNzLlJvdXRlcignY29tbWFuZC1hJywgJ2FyZ3Vt
ZW50JywgY29tcGxldGlvbj1tb2Nrcy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5jb2RlPTApKSwK
KyAgICAgICAgICAgIG1vY2tzLlN1YnByb2Nlc3MuUm91dGVyKCdjb21tYW5kLWInLCBjb21wbGV0
aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9LTEpKSwKKyAgICAgICAgKToK
KyAgICAgICAgICAgIHJlc3VsdCA9IHJ1bihbJ2NvbW1hbmQtYScsICdhcmd1bWVudCddKQorICAg
ICAgICAgICAgYXNzZXJ0IHJlc3VsdC5yZXR1cm5jb2RlID09IDAKKworICAgICAgICAgICAgcmVz
dWx0ID0gcnVuKFsnY29tbWFuZC1iJ10pCisgICAgICAgICAgICBhc3NlcnQgcmVzdWx0LnJldHVy
bmNvZGUgPT0gLTEKKyAgICAiIiIKKyAgICB0b3AgPSBOb25lCisKKyAgICBjbGFzcyBSb3V0ZXIo
b2JqZWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Cisg
ICAgICAgICAgICBjb21wbGV0aW9uID0ga3dhcmdzLnBvcCgnY29tcGxldGlvbicsIFByb2Nlc3ND
b21wbGV0aW9uKCkpCisgICAgICAgICAgICBjd2QgPSBrd2FyZ3MucG9wKCdjd2QnLCBOb25lKQor
ICAgICAgICAgICAgaW5wdXQgPSBrd2FyZ3MucG9wKCdpbnB1dCcsIE5vbmUpCisgICAgICAgICAg
ICBnZW5lcmF0b3IgPSBrd2FyZ3MucG9wKCdnZW5lcmF0b3InLCBOb25lKQorICAgICAgICAgICAg
aWYga3dhcmdzLmtleXMoKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ19faW5p
dF9fKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCB7fScuZm9ybWF0KGt3YXJn
cy5rZXlzKClbMF0pKQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZ3MsIHN0cikgb3Ig
aXNpbnN0YW5jZShhcmdzLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBzZWxmLmFyZ3MgPSBb
YXJnc10KKyAgICAgICAgICAgIGVsaWYgbm90IGFyZ3M6CisgICAgICAgICAgICAgICAgcmFpc2Ug
VmFsdWVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWQgdG8gY29tcGxldGlvbiByb3V0
ZXInKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFyZ3MgPSBhcmdz
CisKKyAgICAgICAgICAgIHNlbGYuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yIG9yIChsYW1iZGEgKmFy
Z3MsICoqa3dhcmdzOiBjb21wbGV0aW9uKQorICAgICAgICAgICAgc2VsZi5jd2QgPSBjd2QKKyAg
ICAgICAgICAgIHNlbGYuaW5wdXQgPSBzdHJpbmdfdXRpbHMuZW5jb2RlKGlucHV0KSBpZiBpbnB1
dCBlbHNlIE5vbmUKKworICAgICAgICBkZWYgbWF0Y2hlcyhzZWxmLCAqYXJncywgKiprd2FyZ3Mp
OgorICAgICAgICAgICAgY3dkID0ga3dhcmdzLnBvcCgnY3dkJywgTm9uZSkKKyAgICAgICAgICAg
IGlucHV0ID0ga3dhcmdzLnBvcCgnaW5wdXQnLCBOb25lKQorICAgICAgICAgICAgaWYga3dhcmdz
LmtleXMoKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ21hdGNoZXMoKSBnb3Qg
YW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50IHt9Jy5mb3JtYXQoa3dhcmdzLmtleXMoKVsw
XSkpCisKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmFyZ3MpID4gbGVuKGFyZ3MpOgorICAgICAg
ICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICAgICBmb3IgY291bnQgaW4gcmFuZ2Uo
bGVuKHNlbGYuYXJncykpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuYXJnc1tjb3VudF0gaXMg
Tm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgICAgICAg
ICBpZiBzZWxmLmFyZ3NbY291bnRdID09IGFyZ3NbY291bnRdOgorICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLmFyZ3NbY291bnRd
LCAnbWF0Y2gnKSBhbmQgc2VsZi5hcmdzW2NvdW50XS5tYXRjaChhcmdzW2NvdW50XSk6CisgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiByZS5tYXRjaChz
ZWxmLmFyZ3NbY291bnRdLCBhcmdzW2NvdW50XSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgICAgIGlmIHNlbGYu
Y3dkIGlzIG5vdCBOb25lIGFuZCBjd2QgIT0gc2VsZi5jd2Q6CisgICAgICAgICAgICAgICAgcmV0
dXJuIEZhbHNlCisgICAgICAgICAgICBpZiBzZWxmLmlucHV0IGlzIG5vdCBOb25lIGFuZCBpbnB1
dCAhPSBzZWxmLmlucHV0OgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAg
ICAgcmV0dXJuIFRydWUKKworICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dh
cmdzKToKKyAgICAgICAgICAgIGN3ZCA9IGt3YXJncy5wb3AoJ2N3ZCcsIE5vbmUpCisgICAgICAg
ICAgICBpbnB1dCA9IGt3YXJncy5wb3AoJ2lucHV0JywgTm9uZSkKKyAgICAgICAgICAgIGlmIGt3
YXJncy5rZXlzKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdfX2NhbGxfXygp
IGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQge30nLmZvcm1hdChrd2FyZ3Mua2V5
cygpWzBdKSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdlbmVyYXRvcigqYXJncywgY3dkPWN3
ZCwgaW5wdXQ9aW5wdXQpCisKKyAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgIGRlZiBjb21w
YXJlKGNscywgYSwgYik6CisgICAgICAgICAgICBmb3IgY2FuZGlkYXRlIGluIFsKKyAgICAgICAg
ICAgICAgICBsZW4oYi5hcmdzKSAtIGxlbihhLmFyZ3MpLAorICAgICAgICAgICAgICAgIDAgaWYg
dHlwZShhLmN3ZCkgPT0gdHlwZShiLmN3ZCkgZWxzZSAtMSBpZiBhLmN3ZCBlbHNlIDEsCisgICAg
ICAgICAgICAgICAgMCBpZiB0eXBlKGEuaW5wdXQpID09IHR5cGUoYi5pbnB1dCkgZWxzZSAtMSBp
ZiBhLmlucHV0IGVsc2UgMSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICAgICAgaWYgY2Fu
ZGlkYXRlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlCisgICAgICAgICAg
ICByZXR1cm4gMAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGNvbXBsZXRpb25fZ2VuZXJh
dG9yX2ZvcihjbHMsIHByb2dyYW0pOgorICAgICAgICBjdXJyZW50ID0gY2xzLnRvcAorICAgICAg
ICBjYW5kaWRhdGVzID0gW10KKyAgICAgICAgd2hpbGUgY3VycmVudDoKKyAgICAgICAgICAgIGZv
ciBjb21wbGV0aW9uIGluIGN1cnJlbnQuY29tcGxldGlvbnM6CisgICAgICAgICAgICAgICAgaWYg
Y29tcGxldGlvbi5hcmdzWzBdID09IHByb2dyYW06CisgICAgICAgICAgICAgICAgICAgIGNhbmRp
ZGF0ZXMuYXBwZW5kKGNvbXBsZXRpb24pCisgICAgICAgICAgICAgICAgaWYgY3VycmVudC5vcmRl
cmVkOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY3VycmVudCA9IGN1
cnJlbnQucHJldmlvdXMKKworICAgICAgICBpZiBjYW5kaWRhdGVzOgorICAgICAgICAgICAgcmV0
dXJuIGNhbmRpZGF0ZXMKKworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvID4gKDMsIDApOgor
ICAgICAgICAgICAgcmFpc2UgRmlsZU5vdEZvdW5kRXJyb3IoIk5vIHN1Y2ggZmlsZSBvciBkaXJl
Y3Rvcnk6ICd7cGF0aH0nOiAne3BhdGh9JyIuZm9ybWF0KHBhdGg9cHJvZ3JhbSkpCisgICAgICAg
IHJhaXNlIE9TRXJyb3IoJ1tFcnJubyAyXSBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JykKKwor
ICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjb21wbGV0aW9uX2ZvcihjbHMsICphcmdzLCAqKmt3
YXJncyk6CisgICAgICAgIGNhbmRpZGF0ZXMgPSBbCisgICAgICAgICAgICBjYW5kaWRhdGUgZm9y
IGNhbmRpZGF0ZSBpbiBjbHMuY29tcGxldGlvbl9nZW5lcmF0b3JfZm9yKGFyZ3NbMF0pIGlmIGNh
bmRpZGF0ZS5tYXRjaGVzKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgXQorICAgICAgICBpZiBu
b3QgY2FuZGlkYXRlczoKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdQcm92aWRl
ZCBhcmd1bWVudHMgdG8ge30gZG8gbm90IG1hdGNoIGEgcHJvdmlkZWQgY29tcGxldGlvbicuZm9y
bWF0KGFyZ3NbMF0pKQorCisgICAgICAgIGNvbXBsZXRpb24gPSBjYW5kaWRhdGVzWzBdCisgICAg
ICAgIGN1cnJlbnQgPSBjbHMudG9wCisgICAgICAgIHdoaWxlIGN1cnJlbnQ6CisgICAgICAgICAg
ICBpZiBjdXJyZW50Lm9yZGVyZWQgYW5kIGNvbXBsZXRpb24gaXMgY3VycmVudC5jb21wbGV0aW9u
c1swXToKKyAgICAgICAgICAgICAgICBjdXJyZW50LmNvbXBsZXRpb25zLnBvcCgwKQorICAgICAg
ICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91cwor
ICAgICAgICByZXR1cm4gY29tcGxldGlvbigqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgX19p
bml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgaWYgYWxsKFtpc2luc3RhbmNl
KGFyZywgU3VicHJvY2Vzcy5Sb3V0ZXIpIGZvciBhcmcgaW4gYXJnc10pOgorICAgICAgICAgICAg
c2VsZi5vcmRlcmVkID0ga3dhcmdzLnBvcCgnb3JkZXJlZCcsIEZhbHNlKQorICAgICAgICAgICAg
aWYga3dhcmdzLmtleXMoKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ19faW5p
dF9fKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCB7fScuZm9ybWF0KGt3YXJn
cy5rZXlzKClbMF0pKQorICAgICAgICAgICAgc2VsZi5jb21wbGV0aW9ucyA9IGxpc3QoYXJncykg
aWYgc2VsZi5vcmRlcmVkIGVsc2Ugc29ydGVkKGFyZ3MsIGtleT1jbXBfdG9fa2V5KHNlbGYuUm91
dGVyLmNvbXBhcmUpKQorICAgICAgICBlbGlmIGFueShbaXNpbnN0YW5jZShhcmcsIFN1YnByb2Nl
c3MuUm91dGVyKSBmb3IgYXJnIGluIGFyZ3NdKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJv
cignbW9ja3MuU3VicHJvY2VzcyBhcmd1bWVudHMgbXVzdCBiZSBvZiBhIGNvbnNpc3RlbnQgdHlw
ZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm9yZGVyZWQgPSBGYWxzZQorICAg
ICAgICAgICAgc2VsZi5jb21wbGV0aW9ucyA9IFtTdWJwcm9jZXNzLlJvdXRlcigqYXJncywgKipr
d2FyZ3MpXQorCisgICAgICAgIHN1cGVyKFN1YnByb2Nlc3MsIHNlbGYpLl9faW5pdF9fKGNscz1T
dWJwcm9jZXNzKQorCisgICAgICAgICMgQWxsb3cgbW9jayB0byBiZSBtYW5hZ2VkIHZpYSBhdXRv
aW5zdGFsbAorICAgICAgICBmcm9tIG1vY2sgaW1wb3J0IHBhdGNoCisgICAgICAgIGZyb20gd2Vi
a2l0Y29yZXB5Lm1vY2tzLnBvcGVuIGltcG9ydCBQb3BlbgorICAgICAgICBzZWxmLnBhdGNoZXMu
YXBwZW5kKHBhdGNoKCdzdWJwcm9jZXNzLlBvcGVuJywgbmV3PVBvcGVuKSkKSW5kZXg6IFRvb2xz
L1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvdGVzdHMvbW9ja3Mv
c3VicHJvY2Vzc191bml0dGVzdC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3JpcHRzL2xpYnJh
cmllcy93ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5L3Rlc3RzL21vY2tzL3N1YnByb2Nlc3NfdW5p
dHRlc3QucHkJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0
Y29yZXB5L3dlYmtpdGNvcmVweS90ZXN0cy9tb2Nrcy9zdWJwcm9jZXNzX3VuaXR0ZXN0LnB5CSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTU1IEBACisjIENvcHlyaWdodCAoQykgMjAyMCBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyMgYXJlIG1ldDoKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5Z
CisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04KKyMgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMKKyMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB3
ZWJraXRjb3JlcHkgaW1wb3J0IEJ5dGVzSU8sIE91dHB1dENhcHR1cmUsIG1vY2tzLCBydW4KKwor
CitjbGFzcyBNb2NrU3VicHJvY2Vzcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgTFMgPSBtb2Nr
cy5TdWJwcm9jZXNzLlJvdXRlcigKKyAgICAgICAgJ2xzJywKKyAgICAgICAgY29tcGxldGlvbj1t
b2Nrcy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5jb2RlPTAsIHN0ZG91dD0nZmlsZTEudHh0XG5m
aWxlMi50eHRcbicpLAorICAgICkKKyAgICBTTEVFUCA9IG1vY2tzLlN1YnByb2Nlc3MuUm91dGVy
KAorICAgICAgICAnc2xlZXAnLAorICAgICAgICBnZW5lcmF0b3I9bGFtYmRhICphcmdzLCAqKmt3
YXJnczogbW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24ocmV0dXJuY29kZT0wLCBlbGFwc2VkPWludChh
cmdzWzFdKSksCisgICAgKQorCisgICAgZGVmIHRlc3RfZG9jdW1lbnRhdGlvbihzZWxmKToKKyAg
ICAgICAgd2l0aCBPdXRwdXRDYXB0dXJlKCk6CisgICAgICAgICAgICB3aXRoIG1vY2tzLlN1YnBy
b2Nlc3MoCisgICAgICAgICAgICAgICAgICAgIG1vY2tzLlN1YnByb2Nlc3MuUm91dGVyKCdjb21t
YW5kLWEnLCAnYXJndW1lbnQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJl
dHVybmNvZGU9MCkpLAorICAgICAgICAgICAgICAgICAgICBtb2Nrcy5TdWJwcm9jZXNzLlJvdXRl
cignY29tbWFuZC1iJywgY29tcGxldGlvbj1tb2Nrcy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5j
b2RlPS0xKSksCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bihb
J2NvbW1hbmQtYScsICdhcmd1bWVudCddKQorICAgICAgICAgICAgICAgIGFzc2VydCByZXN1bHQu
cmV0dXJuY29kZSA9PSAwCisKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBydW4oWydjb21tYW5k
LWInXSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgcmVzdWx0LnJldHVybmNvZGUgPT0gLTEKKwor
ICAgICAgICAgICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNzKAorICAgICAgICAgICAgICAgICAgICAn
bHMnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwgc3Rk
b3V0PSdmaWxlMS50eHRcbmZpbGUyLnR4dFxuJyksCisgICAgICAgICAgICApOgorICAgICAgICAg
ICAgICAgIGFzc2VydCBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbJ2xzJ10pID09IGInZmlsZTEu
dHh0XG5maWxlMi50eHRcbicKKyAgICAgICAgICAgICAgICBhc3NlcnQgc3VicHJvY2Vzcy5jaGVj
a19jYWxsKFsnbHMnXSkgPT0gMAorCisgICAgICAgICAgICB3aXRoIG1vY2tzLlN1YnByb2Nlc3Mo
CisgICAgICAgICAgICAgICAgICAgIG1vY2tzLlN1YnByb2Nlc3MuUm91dGVyKCdjb21tYW5kLWEn
LCAnYXJndW1lbnQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNv
ZGU9MCkpLAorICAgICAgICAgICAgICAgICAgICBtb2Nrcy5TdWJwcm9jZXNzLlJvdXRlcignY29t
bWFuZC1iJywgY29tcGxldGlvbj1tb2Nrcy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5jb2RlPS0x
KSksCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bihbJ2NvbW1h
bmQtYScsICdhcmd1bWVudCddKQorICAgICAgICAgICAgICAgIGFzc2VydCByZXN1bHQucmV0dXJu
Y29kZSA9PSAwCisKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBydW4oWydjb21tYW5kLWInXSkK
KyAgICAgICAgICAgICAgICBhc3NlcnQgcmVzdWx0LnJldHVybmNvZGUgPT0gLTEKKworICAgIGRl
ZiB0ZXN0X25vX2ZpbGUoc2VsZik6CisgICAgICAgIHdpdGggbW9ja3MuU3VicHJvY2VzcyhzZWxm
LkxTLCBzZWxmLlNMRUVQKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NF
cnJvcik6CisgICAgICAgICAgICAgICAgcnVuKFsnaW52YWxpZC1maWxlJ10pCisKKyAgICBkZWYg
dGVzdF9pbXBsaWVkX3JvdXRlcihzZWxmKToKKyAgICAgICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNz
KCdjb21tYW5kJywgY29tcGxldGlvbj1tb2Nrcy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5jb2Rl
PTApKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKFsnY29tbWFuZCddKS5yZXR1
cm5jb2RlLCAwKQorCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3Ip
OgorICAgICAgICAgICAgICAgIHJ1bihbJ2ludmFsaWQtZmlsZSddKQorCisgICAgZGVmIHRlc3Rf
cG9wZW4oc2VsZik6CisgICAgICAgIHdpdGggbW9ja3MuVGltZToKKyAgICAgICAgICAgIHdpdGgg
bW9ja3MuU3VicHJvY2VzcyhzZWxmLkxTLCBzZWxmLlNMRUVQKToKKyAgICAgICAgICAgICAgICBs
cyA9IHN1YnByb2Nlc3MuUG9wZW4oWydscyddLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRl
cnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAgICAgICAgIGxzLndhaXQoKQorICAgICAgICAg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbHMucG9sbCgpKQorICAgICAgICAgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwoYidmaWxlMS50eHRcbmZpbGUyLnR4dFxuJywgbHMuc3Rkb3V0LnJlYWQo
KSkKKworICAgICAgICAgICAgICAgIHNsZWVwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ3NsZWVwJywg
JzEnXSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAg
ICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNsZWVwLnBvbGwoKSkKKyAgICAg
ICAgICAgICAgICBzbGVlcC53YWl0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFs
KDAsIHNsZWVwLnBvbGwoKSkKKworICAgIGRlZiB0ZXN0X29yZGVyZWQoc2VsZik6CisgICAgICAg
IHdpdGggT3V0cHV0Q2FwdHVyZSgpLCBtb2Nrcy5TdWJwcm9jZXNzKAorICAgICAgICAgICAgbW9j
a3MuU3VicHJvY2Vzcy5Sb3V0ZXIoJ2NvbW1hbmQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3ND
b21wbGV0aW9uKHJldHVybmNvZGU9MCkpLAorICAgICAgICAgICAgbW9ja3MuU3VicHJvY2Vzcy5S
b3V0ZXIoJ2NvbW1hbmQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVy
bmNvZGU9MSkpLAorICAgICAgICAgICAgb3JkZXJlZD1UcnVlLAorICAgICAgICApOgorICAgICAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oWydjb21tYW5kJ10pLnJldHVybmNvZGUsIDApCisg
ICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihbJ2NvbW1hbmQnXSkucmV0dXJuY29kZSwg
MSkKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcik6CisgICAgICAg
ICAgICAgICAgcnVuKFsnY29tbWFuZCddKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRfcHJpb3Jp
dHkoc2VsZik6CisgICAgICAgIHdpdGggT3V0cHV0Q2FwdHVyZSgpLCBtb2Nrcy5TdWJwcm9jZXNz
KAorICAgICAgICAgICAgbW9ja3MuU3VicHJvY2Vzcy5Sb3V0ZXIoJ2NvbW1hbmQnLCAnLS1oZWxw
JywgY29tcGxldGlvbj1tb2Nrcy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5jb2RlPTApKSwKKyAg
ICAgICAgICAgIG1vY2tzLlN1YnByb2Nlc3MuUm91dGVyKCdjb21tYW5kJywgY29tcGxldGlvbj1t
b2Nrcy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5jb2RlPTEpKSwKKyAgICAgICAgKToKKyAgICAg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKFsnY29tbWFuZCddKS5yZXR1cm5jb2RlLCAxKQor
ICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oWydjb21tYW5kJywgJy0taGVscCddKS5y
ZXR1cm5jb2RlLCAwKQorCisgICAgZGVmIHRlc3RfY3dkX3ByaW9yaXR5KHNlbGYpOgorICAgICAg
ICB3aXRoIE91dHB1dENhcHR1cmUoKSwgbW9ja3MuU3VicHJvY2VzcygKKyAgICAgICAgICAgIG1v
Y2tzLlN1YnByb2Nlc3MuUm91dGVyKCdjb21tYW5kJywgY29tcGxldGlvbj1tb2Nrcy5Qcm9jZXNz
Q29tcGxldGlvbihyZXR1cm5jb2RlPTApLCBjd2Q9Jy9leGFtcGxlJyksCisgICAgICAgICAgICBt
b2Nrcy5TdWJwcm9jZXNzLlJvdXRlcignY29tbWFuZCcsIGNvbXBsZXRpb249bW9ja3MuUHJvY2Vz
c0NvbXBsZXRpb24ocmV0dXJuY29kZT0xKSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKHJ1bihbJ2NvbW1hbmQnXSkucmV0dXJuY29kZSwgMSkKKyAgICAgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWwocnVuKFsnY29tbWFuZCddLCBjd2Q9Jy9leGFtcGxlJykucmV0dXJu
Y29kZSwgMCkKKworICAgIGRlZiB0ZXN0X2lucHV0X3ByaW9yaXR5KHNlbGYpOgorICAgICAgICB3
aXRoIE91dHB1dENhcHR1cmUoKSwgbW9ja3MuU3VicHJvY2VzcygKKyAgICAgICAgICAgIG1vY2tz
LlN1YnByb2Nlc3MuUm91dGVyKCdjb21tYW5kJywgY29tcGxldGlvbj1tb2Nrcy5Qcm9jZXNzQ29t
cGxldGlvbihyZXR1cm5jb2RlPTApLCBpbnB1dD0nc3RkaW4nKSwKKyAgICAgICAgICAgIG1vY2tz
LlN1YnByb2Nlc3MuUm91dGVyKCdjb21tYW5kJywgY29tcGxldGlvbj1tb2Nrcy5Qcm9jZXNzQ29t
cGxldGlvbihyZXR1cm5jb2RlPTEpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWwocnVuKFsnY29tbWFuZCddKS5yZXR1cm5jb2RlLCAxKQorICAgICAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbChydW4oWydjb21tYW5kJ10sIGlucHV0PSdzdGRpbicpLnJldHVybmNvZGUs
IDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihbJ2NvbW1hbmQnXSwgc3RkaW49
Qnl0ZXNJTyhiJ3N0ZGluJykpLnJldHVybmNvZGUsIDApCisKKworY2xhc3MgTW9ja0NoZWNrT3V0
cHV0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9wb3BlbihzZWxmKToKKyAgICAg
ICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNzKE1vY2tTdWJwcm9jZXNzLkxTKToKKyAgICAgICAgICAg
IHJlc3VsdCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsnbHMnXSkKKyAgICAgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBiJ2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nKQorCisKK2Ns
YXNzIE1vY2tDaGVja0NhbGwodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3BvcGVu
KHNlbGYpOgorICAgICAgICB3aXRoIE91dHB1dENhcHR1cmUoKSBhcyBjYXB0dXJlZDoKKyAgICAg
ICAgICAgIHdpdGggbW9ja3MuU3VicHJvY2VzcyhNb2NrU3VicHJvY2Vzcy5MUyk6CisgICAgICAg
ICAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5jaGVja19jYWxsKFsnbHMnXSkKKyAgICAgICAg
ICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMCkKKworICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFsKGNhcHR1cmVkLnN0ZG91dC5nZXR2YWx1ZSgpLCAnZmlsZTEudHh0XG5maWxlMi50eHRc
bicpCisKKworY2xhc3MgTW9ja1J1bih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rf
cG9wZW4oc2VsZik6CisgICAgICAgIHdpdGggT3V0cHV0Q2FwdHVyZSgpIGFzIGNhcHR1cmVkOgor
ICAgICAgICAgICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNzKE1vY2tTdWJwcm9jZXNzLkxTKToKKyAg
ICAgICAgICAgICAgICByZXN1bHQgPSBydW4oWydscyddKQorICAgICAgICAgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWwocmVzdWx0LnJldHVybmNvZGUsIDApCisgICAgICAgICAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChyZXN1bHQuc3Rkb3V0LCBOb25lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWwocmVzdWx0LnN0ZGVyciwgTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFs
KGNhcHR1cmVkLnN0ZG91dC5nZXR2YWx1ZSgpLCAnZmlsZTEudHh0XG5maWxlMi50eHRcbicpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>407328</attachid>
            <date>2020-08-26 13:17:25 -0700</date>
            <delta_ts>2020-08-26 14:01:24 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-215712-20200826131724.patch</filename>
            <type>text/plain</type>
            <size>31753</size>
            <attacher name="Jonathan Bedard">jbedard</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDI2NjE3NykKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDM3IEBACisyMDIwLTA4LTI2ICBKb25hdGhhbiBCZWRhcmQgIDxqYmVkYXJkQGFwcGxlLmNv
bT4KKworICAgICAgIFt3ZWJraXRjb3JlcHldIFN0YW5kYXJkIFBvcGVuIG1vY2tpbmcgQVBJCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTU3MTIKKyAg
ICAgICAgPHJkYXI6Ly9wcm9ibGVtLzY3NTAxOTExPgorCisgICAgICAgIFJldmlld2VkIGJ5IERl
d2VpIFpodS4KKworICAgICAgICAqIFNjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS9SRUFE
TUUubWQ6IEFkZCBtb2Nrcy5TdWJwcm9jZXNzIGRvY3VtZW50YXRpb24uCisgICAgICAgICogU2Ny
aXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9fX2luaXRfXy5weTogQnVt
cCB2ZXJzaW9uLgorICAgICAgICAqIFNjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJr
aXRjb3JlcHkvbW9ja3MvX19pbml0X18ucHk6ICBFeHBvcnQgU3VicHJvY2VzcywgUHJvY2Vzc0Nv
bXBsZXRpb24uCisgICAgICAgICogU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtp
dGNvcmVweS9tb2Nrcy9wb3Blbi5weTogQWRkZWQuCisgICAgICAgIChQb3Blbik6IE1vY2sgUG9w
ZW4gb2JqZWN0IChmb3IgYm90aCBQeXRob24gMiBhbmQgMykuIFRoaXMgb2JqZWN0IGV4dHJhY3Rz
IGEgUHJvY2Vzc0NvbXBsZXRpb24gb2JqZWN0IGZyb20gdGhlCisgICAgICAgIG1vY2tlZCBTdWJw
cm9jZXNzIHN0YWNrIGFuZCBiZWhhaXZlcyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnQgb2YgdGhh
dCBvYmplY3QuCisgICAgICAgICogU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtp
dGNvcmVweS9tb2Nrcy9zdWJwcm9jZXNzLnB5OiBBZGRlZC4KKyAgICAgICAgKFBvcGVuQmFzZSk6
IEJhc2UgY2xhc3MgdG8gc2hhcmUgY29kZSBiZXR3ZWVuIFB5dGhvbiAyIGFuZCAzIGNvbnN0cnVj
dG9yLgorICAgICAgICAoUG9wZW4pOiBNb2NrIFBvcGVuIG9iamVjdCAoZm9yIGJvdGggUHl0aG9u
IDIgYW5kIDMpLiBUaGlzIG9iamVjdCBleHRyYWN0cyBhIFByb2Nlc3NDb21wbGV0aW9uIG9iamVj
dCBmcm9tIHRoZQorICAgICAgICBtb2NrZWQgU3VicHJvY2VzcyBzdGFjayBhbmQgYmVoYWl2ZXMg
YWNjb3JkaW5nIHRvIHRoZSBjb250ZW50IG9mIHRoYXQgb2JqZWN0LgorICAgICAgICAqIFNjcmlw
dHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9ja3Mvc3VicHJvY2Vzcy5w
eTogQWRkZWQuCisgICAgICAgIChQcm9jZXNzQ29tcGxldGlvbik6IENsYXNzIHdoaWNoIGNhcHR1
cmVzIHRoZSByZXN1bHQgb2YgYSBtb2NrIFBvcGVuIGNhbGwuCisgICAgICAgIChTdWJwcm9jZXNz
KToKKyAgICAgICAgKFN1YnByb2Nlc3MuQ29tbWFuZFJvdXRlKTogT2JqZWN0IHdoaWNoIHJvdXRl
cyBhIHNldCBvZiBzdWJwcm9jZXNzIGFyZ3VtZW50cyB0byBhIHNwZWNpZmljIFByb2Nlc3NDb21w
bGV0aW9uIG9yIGNhbGxiYWNrIHdoaWNoCisgICAgICAgIGdlbmVyYXRlcyBhIFByb2Nlc3NDb21w
bGV0aW9uLgorICAgICAgICAoU3VicHJvY2Vzcy5jb21wbGV0aW9uX2dlbmVyYXRvcl9mb3IpOiBH
aXZlbiBhIGZpbGUsIHNlYXJjaCB0aHJvdWdoIHRoZSBtb2NrZWQgU3VicHJvY2VzcyBzdGFjayB0
byBmaW5kIHRoZQorICAgICAgICBmaXJzdCBjb21wbGV0aW9uIGZvciB0aGUgcHJvdmlkZWQgZmls
ZS4KKyAgICAgICAgKFN1YnByb2Nlc3MuY29tcGxldGlvbl9mb3IpOiBFeHRyYWN0IGZpbGUgbmFt
ZSBmcm9tIGFyZ3VtZW50cywgZmluZCB0aGUgY29tcGxldGlvbiBnZW5lcmF0b3IsIGFuZCBjYWxs
CisgICAgICAgIGl0IHdpdGggdGhlIHByb3ZpZWRlZCBhcmd1bWVudHMsIHdvcmtpbmcgZGlyZWN0
b3J5IGFuZCBzdGRpbi4KKyAgICAgICAgKFN1YnByb2Nlc3MuX19pbml0X18pOgorICAgICAgICAq
IFNjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvdGVzdHMvbW9ja3Mv
c3VicHJvY2Vzc191bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgIChNb2NrU3VicHJvY2Vzcyk6
CisgICAgICAgIChNb2NrQ2hlY2tPdXRwdXQpOgorICAgICAgICAoTW9ja0NoZWNrQ2FsbCk6Cisg
ICAgICAgIChNb2NrUnVuKToKKwogMjAyMC0wOC0yNiAgWW91ZW5uIEZhYmxldCAgPHlvdWVubkBh
cHBsZS5jb20+CiAKICAgICAgICAgZW51bWVyYXRlRGV2aWNlcyBzaG91bGQgZXhwb3NlIGF1ZGlv
b3V0cHV0IGRldmljZXMgdGhhdCBhcmUgdGllZCB0byBhbiBhdWRpbyBpbnB1dCBkZXZpY2UKSW5k
ZXg6IFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS9SRUFETUUubWQKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L1JFQURNRS5tZAko
cmV2aXNpb24gMjY2MTcwKQorKysgVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5
L1JFQURNRS5tZAkod29ya2luZyBjb3B5KQpAQCAtNzYsMyArNzYsMzUgQEAgZnJvbSB3ZWJraXRj
b3JlcHkgaW1wb3J0IHJ1bgogCiByZXN1bHQgPSBydW4oW3N5cy5leGVjdXRhYmxlLCAnLWMnLCAn
cHJpbnQoIm1lc3NhZ2UiKSddLCBjYXB0dXJlX291dHB1dD1UcnVlLCBlbmNvZGluZz0ndXRmLTgn
KQogYGBgCisKK01vY2tpbmcgb2Ygc3VicHJvY2VzcyBjb21tYW5kczoKK2BgYAorZnJvbSB3ZWJr
aXRjb3JlcHkgaW1wb3J0IG1vY2tzLCBydW4KKword2l0aCBtb2Nrcy5TdWJwcm9jZXNzKAorICAg
ICdscycsIGNvbXBsZXRpb249bW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24ocmV0dXJuY29kZT0wLCBz
dGRvdXQ9J2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nKSwKKyk6CisgICAgcmVzdWx0ID0gcnVuKFsn
bHMnXSwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICBhc3NlcnQg
cmVzdWx0LnJldHVybmNvZGUgPT0gMAorICAgIGFzc2VydCByZXN1bHQuc3Rkb3V0ID09ICdmaWxl
MS50eHRcbmZpbGUyLnR4dFxuJworYGBgCitUaGUgbW9ja2luZyBzeXN0ZW0gZm9yIHN1YnByb2Nl
c3MgYWxzbyBzdXBwb3J0cyBvdGhlciBzdWJwcm9jZXNzIEFQSXMgYmFzZWQgb24gUG9wZW46Citg
YGAKK3dpdGggbW9ja3MuU3VicHJvY2VzcygKKyAgICAnbHMnLCBjb21wbGV0aW9uPW1vY2tzLlBy
b2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwgc3Rkb3V0PSdmaWxlMS50eHRcbmZpbGUyLnR4
dFxuJyksCispOgorICAgIGFzc2VydCBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbJ2xzJ10pID09
IGInZmlsZTEudHh0XG5maWxlMi50eHRcbicKKyAgICBhc3NlcnQgc3VicHJvY2Vzcy5jaGVja19j
YWxsKFsnbHMnXSkgPT0gMAorYGBgCitGb3Igd3JpdGluZyBpbnRlZ3JhdGlvbiB0ZXN0cywgdGhl
IG1vY2tpbmcgc3lzdGVtIGZvciBzdWJwcm9jZXNzIHN1cHBvcnRzIG1vY2tpbmcgbXVsdGlwbGUg
cHJvY2VzcyBjYWxscyBhdCB0aGUgc2FtZSB0aW1lOgorYGBgCit3aXRoIG1vY2tzLlN1YnByb2Nl
c3MoCisgICAgbW9ja3MuU3VicHJvY2Vzcy5Db21tYW5kUm91dGUoJ2NvbW1hbmQtYScsICdhcmd1
bWVudCcsIGNvbXBsZXRpb249bW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24ocmV0dXJuY29kZT0wKSks
CisgICAgbW9ja3MuU3VicHJvY2Vzcy5Db21tYW5kUm91dGUoJ2NvbW1hbmQtYicsIGNvbXBsZXRp
b249bW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24ocmV0dXJuY29kZT0tMSkpLAorKToKKyAgICByZXN1
bHQgPSBydW4oWydjb21tYW5kLWEnLCAnYXJndW1lbnQnXSkKKyAgICBhc3NlcnQgcmVzdWx0LnJl
dHVybmNvZGUgPT0gMAorCisgICAgcmVzdWx0ID0gcnVuKFsnY29tbWFuZC1iJ10pCisgICAgYXNz
ZXJ0IHJlc3VsdC5yZXR1cm5jb2RlID09IC0xCitgYGAKSW5kZXg6IFRvb2xzL1NjcmlwdHMvbGli
cmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvX19pbml0X18ucHkKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9fX2lu
aXRfXy5weQkocmV2aXNpb24gMjY2MTcwKQorKysgVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Vi
a2l0Y29yZXB5L3dlYmtpdGNvcmVweS9fX2luaXRfXy5weQkod29ya2luZyBjb3B5KQpAQCAtMzUs
NyArMzUsNyBAQCBmcm9tIHdlYmtpdGNvcmVweS50aW1lb3V0IGltcG9ydCBUaW1lb3V0CiBmcm9t
IHdlYmtpdGNvcmVweS5zdWJwcm9jZXNzX3V0aWxzIGltcG9ydCBUaW1lb3V0RXhwaXJlZCwgQ29t
cGxldGVkUHJvY2VzcywgcnVuCiBmcm9tIHdlYmtpdGNvcmVweS5vdXRwdXRfY2FwdHVyZSBpbXBv
cnQgTG9nZ2VyQ2FwdHVyZSwgT3V0cHV0Q2FwdHVyZSwgT3V0cHV0RHVwbGljYXRlCiAKLXZlcnNp
b24gPSBWZXJzaW9uKDAsIDQsIDApCit2ZXJzaW9uID0gVmVyc2lvbigwLCA0LCAxKQogCiBmcm9t
IHdlYmtpdGNvcmVweS5hdXRvaW5zdGFsbCBpbXBvcnQgUGFja2FnZSwgQXV0b0luc3RhbGwKIGlm
IHN5cy52ZXJzaW9uX2luZm8gPiAoMywgMCk6CkluZGV4OiBUb29scy9TY3JpcHRzL2xpYnJhcmll
cy93ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5L21vY2tzL19faW5pdF9fLnB5Cj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9j
a3MvX19pbml0X18ucHkJKHJldmlzaW9uIDI2NjE3MCkKKysrIFRvb2xzL1NjcmlwdHMvbGlicmFy
aWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9ja3MvX19pbml0X18ucHkJKHdvcmtpbmcg
Y29weSkKQEAgLTIyLDMgKzIyLDQgQEAKIAogZnJvbSB3ZWJraXRjb3JlcHkubW9ja3MuY29udGV4
dF9zdGFjayBpbXBvcnQgQ29udGV4dFN0YWNrCiBmcm9tIHdlYmtpdGNvcmVweS5tb2Nrcy50aW1l
XyBpbXBvcnQgVGltZQorZnJvbSB3ZWJraXRjb3JlcHkubW9ja3Muc3VicHJvY2VzcyBpbXBvcnQg
UHJvY2Vzc0NvbXBsZXRpb24sIFN1YnByb2Nlc3MKSW5kZXg6IFRvb2xzL1NjcmlwdHMvbGlicmFy
aWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9ja3MvcG9wZW4ucHkKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS9tb2Nr
cy9wb3Blbi5weQkobm9uZXhpc3RlbnQpCisrKyBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJr
aXRjb3JlcHkvd2Via2l0Y29yZXB5L21vY2tzL3BvcGVuLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMjQxIEBACisjIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04K
KyMgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9y
dCBvcworaW1wb3J0IGlvCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHNpZ25hbAoraW1wb3J0
IHN5cworaW1wb3J0IHRpbWUKKworZnJvbSB3ZWJraXRjb3JlcHkgaW1wb3J0IGxvZywgc3RyaW5n
X3V0aWxzLCBUaW1lb3V0LCBUaW1lb3V0RXhwaXJlZCwgdW5pY29kZQorZnJvbSB3ZWJraXRjb3Jl
cHkubW9ja3MgaW1wb3J0IFN1YnByb2Nlc3MKKworIyBUaGlzIGZpbGUgaXMgbW9ja2VkIHZlcnNp
b24gb2YgdGhlIHN1YnByb2Nlc3MuUG9wZW4gb2JqZWN0LiBUaGlzIG9iamVjdCBkaWZmZXJzIHNs
aWdodGx5IGJldHdlZW4gUHl0aG9uIDIgYW5kIDMuCisjIFRoaXMgb2JqZWN0IGlzIG5vdCBhIGNv
bXBsZXRlIG1vY2sgb2Ygc3VicHJvY2Vzcy5Qb3BlbiwgYnV0IGl0IGRvZXMgZW5hYmxlIHRob3Jv
dWdoIHRlc3Rpbmcgb2YgY29kZSB3aGljaCB1c2VzIFBvcGVuLAorIyBpbiBwYXJ0aWN1bGFyLCB0
aGUgc3VicHJvY2Vzcy5jaGVja19jYWxsLCBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCBhbmQgc3Vi
cHJvY2Vzcy5ydW4gY29tbWFuZHMuCisjCisjIElmIHlvdSBmaW5kIHlvdXJzZWxmIG5lZWRpbmcg
dG8gZWRpdCB0aGlzIGZpbGUsIGxlYW4gaGVhdmlseSBvbiB0aGUgdGVzdGluZyBpbgorIyB3ZWJr
aXRjb3JlcHkudGVzdHMubW9ja3Muc3VicHJvY2Vzc191bml0dGVzdCBhbmQgUHl0aG9uJ3MgaW1w
bGVtZW50YXRpb24gb2YgUG9wZW4uCisKKworY2xhc3MgUG9wZW5CYXNlKG9iamVjdCk6CisgICAg
TkVYVF9QSUQgPSBvcy5nZXRwaWQoKSArIDEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmdz
LCBidWZzaXplPU5vbmUsIGN3ZD1Ob25lLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJy
PU5vbmUpOgorICAgICAgICBzZWxmLl9jb21wbGV0aW9uID0gTm9uZQorICAgICAgICBzZWxmLl9j
b21tdW5pY2F0aW9uX3N0YXJ0ZWQgPSBGYWxzZQorICAgICAgICBpZiBidWZzaXplIGlzIE5vbmU6
CisgICAgICAgICAgICBidWZzaXplID0gLTEKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVm
c2l6ZSwgaW50KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYnVmc2l6ZSBtdXN0IGJl
IGFuIGludGVnZXIiKQorCisgICAgICAgIHNlbGYuX2FyZ3MgPSBhcmdzCisgICAgICAgIHNlbGYu
X2N3ZCA9IGN3ZAorCisgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IE5vbmUKKworICAgICAgICBz
ZWxmLnN0ZGluID0gc3RyaW5nX3V0aWxzLkJ5dGVzSU8oKSBpZiBzdGRpbiBpcyBOb25lIG9yIHN0
ZGluID09IC0xIGVsc2Ugc3RkaW4KKyAgICAgICAgc2VsZi5zdGRvdXQgPSBzdHJpbmdfdXRpbHMu
Qnl0ZXNJTygpIGlmIHN0ZG91dCA9PSAtMSBlbHNlIHN0ZG91dAorICAgICAgICBzZWxmLl9zdGRv
dXRfdHlwZSA9IGJ5dGVzIGlmIHN0ZG91dCA9PSAtMSBlbHNlIHN0cgorICAgICAgICBzZWxmLnN0
ZGVyciA9IHN0cmluZ191dGlscy5CeXRlc0lPKCkgaWYgc3RkZXJyID09IC0xIGVsc2Ugc3RkZXJy
CisgICAgICAgIHNlbGYuX3N0ZGVycl90eXBlID0gYnl0ZXMgaWYgc3RkZXJyID09IC0xIGVsc2Ug
c3RyCisKKyAgICAgICAgU3VicHJvY2Vzcy5jb21wbGV0aW9uX2dlbmVyYXRvcl9mb3IoYXJnc1sw
XSkKKworICAgICAgICBzZWxmLnBpZCA9IHNlbGYuTkVYVF9QSUQKKyAgICAgICAgc2VsZi5ORVhU
X1BJRCArPSAxCisKKyAgICAgICAgc2VsZi5fc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisKKyAg
ICBAcHJvcGVydHkKKyAgICBkZWYgdW5pdmVyc2FsX25ld2xpbmVzKHNlbGYpOgorICAgICAgICBy
ZXR1cm4gc2VsZi50ZXh0X21vZGUKKworICAgIEB1bml2ZXJzYWxfbmV3bGluZXMuc2V0dGVyCisg
ICAgZGVmIHVuaXZlcnNhbF9uZXdsaW5lcyhzZWxmLCB1bml2ZXJzYWxfbmV3bGluZXMpOgorICAg
ICAgICBzZWxmLnRleHRfbW9kZSA9IGJvb2wodW5pdmVyc2FsX25ld2xpbmVzKQorCisgICAgZGVm
IHBvbGwoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9jb21wbGV0aW9uOgorICAgICAgICAg
ICAgc2VsZi5zdGRpbi5zZWVrKDApCisgICAgICAgICAgICBzZWxmLl9jb21wbGV0aW9uID0gU3Vi
cHJvY2Vzcy5jb21wbGV0aW9uX2Zvcigqc2VsZi5fYXJncywgY3dkPXNlbGYuX2N3ZCwgaW5wdXQ9
c2VsZi5zdGRpbi5yZWFkKCkpCisKKyAgICAgICAgICAgIChzZWxmLnN0ZG91dCBvciBzeXMuc3Rk
b3V0KS53cml0ZSgKKyAgICAgICAgICAgICAgICBzdHJpbmdfdXRpbHMuZGVjb2RlKHNlbGYuX2Nv
bXBsZXRpb24uc3Rkb3V0LCB0YXJnZXRfdHlwZT1zZWxmLl9zdGRvdXRfdHlwZSkpCisgICAgICAg
ICAgICAoc2VsZi5zdGRvdXQgb3Igc3lzLnN0ZG91dCkuZmx1c2goKQorCisgICAgICAgICAgICAo
c2VsZi5zdGRlcnIgb3Igc3lzLnN0ZGVycikud3JpdGUoCisgICAgICAgICAgICAgICAgc3RyaW5n
X3V0aWxzLmRlY29kZShzZWxmLl9jb21wbGV0aW9uLnN0ZGVyciwgdGFyZ2V0X3R5cGU9c2VsZi5f
c3RkZXJyX3R5cGUpKQorICAgICAgICAgICAgKHNlbGYuc3RkZXJyIG9yIHN5cy5zdGRlcnIpLmZs
dXNoKCkKKworICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmUgYW5kIHRpbWUu
dGltZSgpID49IHNlbGYuX3N0YXJ0X3RpbWUgKyBzZWxmLl9jb21wbGV0aW9uLmVsYXBzZWQ6Cisg
ICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBzZWxmLl9jb21wbGV0aW9uLnJldHVybmNvZGUK
KyAgICAgICAgICAgIGlmIHNlbGYuc3Rkb3V0OgorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0
LnNlZWsoMCkKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkZXJyOgorICAgICAgICAgICAgICAgIHNl
bGYuc3RkZXJyLnNlZWsoMCkKKworICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCisKKyAg
ICBkZWYgc2VuZF9zaWduYWwoc2VsZiwgc2lnKToKKyAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2Rl
IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2lnIG5vdCBp
biBbc2lnbmFsLlNJR1RFUk0sIHNpZ25hbC5TSUdLSUxMXToKKyAgICAgICAgICAgIHJhaXNlIFZh
bHVlRXJyb3IoJ01vY2sgUG9wZW4gb2JqZWN0IGNhbm5vdCBoYW5kbGUgc2lnbmFsIHt9Jy5mb3Jt
YXQoc2lnKSkKKyAgICAgICAgbG9nLmNyaXRpY2FsKCdNb2NrIHByb2Nlc3Mge30gc2VuZCBzaWdu
YWwge30nLmZvcm1hdChzZWxmLnBpZCwgc2lnKSkKKyAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0g
LTEKKworICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHNlbGYuc2VuZF9zaWduYWwo
c2lnbmFsLlNJR1RFUk0pCisKKyAgICBkZWYga2lsbChzZWxmKToKKyAgICAgICAgc2VsZi5zZW5k
X3NpZ25hbChzaWduYWwuU0lHS0lMTCkKKworCitpZiBzeXMudmVyc2lvbl9pbmZvID4gKDMsIDAp
OgorICAgIGNsYXNzIFBvcGVuKFBvcGVuQmFzZSk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxm
LCBhcmdzLCBidWZzaXplPU5vbmUsIGV4ZWN1dGFibGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAg
ICAgIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwKKyAgICAgICAgICAgICAg
ICAgICAgIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPVRydWUsCisgICAgICAgICAgICAgICAg
ICAgICBzaGVsbD1GYWxzZSwgY3dkPU5vbmUsIGVudj1Ob25lLCB1bml2ZXJzYWxfbmV3bGluZXM9
Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvPU5vbmUsIGNyZWF0aW9uZmxh
Z3M9MCwKKyAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfc2lnbmFscz1UcnVlLCBzdGFydF9u
ZXdfc2Vzc2lvbj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIHBhc3NfZmRzPSgpLCBlbmNv
ZGluZz1Ob25lLCBlcnJvcnM9Tm9uZSwgdGV4dD1Ob25lKToKKworICAgICAgICAgICAgc3VwZXIo
UG9wZW4sIHNlbGYpLl9faW5pdF9fKGFyZ3MsIGJ1ZnNpemU9YnVmc2l6ZSwgY3dkPWN3ZCwgc3Rk
aW49c3RkaW4sIHN0ZG91dD1zdGRvdXQsIHN0ZGVycj1zdGRlcnIpCisKKyAgICAgICAgICAgIGlm
IHBhc3NfZmRzIGFuZCBub3QgY2xvc2VfZmRzOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJw
YXNzX2ZkcyBvdmVycmlkaW5nIGNsb3NlX2Zkcy4iKQorCisgICAgICAgICAgICBmb3IgYXJnIGlu
IGFyZ3M6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYXJnLCAoc3RyLCBieXRl
cywgb3MuUGF0aExpa2UpKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAor
ICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGVjdGVkIHt9LCB7fSBvciBvcy5QYXRoTGlrZSBv
YmplY3QsIG5vdCB7fScsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIGJ5dGVzLCB0eXBl
KGFyZyksCisgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgc2VsZi5hcmdzID0g
YXJncworICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgICAgICBz
ZWxmLmVycm9ycyA9IGVycm9ycworCisgICAgICAgICAgICBpZiAodGV4dCBpcyBub3QgTm9uZSBh
bmQgdW5pdmVyc2FsX25ld2xpbmVzIGlzIG5vdCBOb25lIGFuZCBib29sKHVuaXZlcnNhbF9uZXds
aW5lcykgIT0gYm9vbCh0ZXh0KSk6CisgICAgICAgICAgICAgICAgcmFpc2Ugc3VicHJvY2Vzcy5T
dWJwcm9jZXNzRXJyb3IoJ0Nhbm5vdCBkaXNhbWJpZ3VhdGUgd2hlbiBib3RoIHRleHQgYW5kIHVu
aXZlcnNhbF9uZXdsaW5lcyBhcmUgc3VwcGxpZWQgYnV0IGRpZmZlcmVudC4gUGFzcyBvbmUgb3Ig
dGhlIG90aGVyLicpCisKKyAgICAgICAgICAgIHNlbGYudGV4dF9tb2RlID0gZW5jb2Rpbmcgb3Ig
ZXJyb3JzIG9yIHRleHQgb3IgdW5pdmVyc2FsX25ld2xpbmVzCisKKyAgICAgICAgICAgIGlmIHNl
bGYuc3RkaW4gaXMgbm90IE5vbmUgYW5kIHNlbGYudGV4dF9tb2RlOgorICAgICAgICAgICAgICAg
IHNlbGYuc3RkaW4gPSBpby5UZXh0SU9XcmFwcGVyKHNlbGYuc3RkaW4sIHdyaXRlX3Rocm91Z2g9
VHJ1ZSwgbGluZV9idWZmZXJpbmc9KGJ1ZnNpemUgPT0gMSksIGVuY29kaW5nPWVuY29kaW5nLCBl
cnJvcnM9ZXJyb3JzKQorICAgICAgICAgICAgaWYgc2VsZi5zdGRvdXQgaXMgbm90IE5vbmUgYW5k
IHNlbGYudGV4dF9tb2RlOgorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0ID0gaW8uVGV4dElP
V3JhcHBlcihzZWxmLnN0ZG91dCwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGVycm9ycz1lcnJvcnMpCisg
ICAgICAgICAgICAgICAgc2VsZi5fc3Rkb3V0X3R5cGUgPSBzdHIKKyAgICAgICAgICAgIGlmIHNl
bGYuc3RkZXJyIGlzIG5vdCBOb25lIGFuZCBzZWxmLnRleHRfbW9kZToKKyAgICAgICAgICAgICAg
ICBzZWxmLnN0ZGVyciA9IGlvLlRleHRJT1dyYXBwZXIoc2VsZi5zdGRlcnIsIGVuY29kaW5nPWVu
Y29kaW5nLCBlcnJvcnM9ZXJyb3JzKQorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZGVycl90eXBl
ID0gc3RyCisKKyAgICAgICAgZGVmIGNvbW11bmljYXRlKHNlbGYsIGlucHV0PU5vbmUsIHRpbWVv
dXQ9Tm9uZSk6CisgICAgICAgICAgICBpZiBzZWxmLl9jb21tdW5pY2F0aW9uX3N0YXJ0ZWQgYW5k
IGlucHV0OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0Nhbm5vdCBzZW5kIGlu
cHV0IGFmdGVyIHN0YXJ0aW5nIGNvbW11bmljYXRpb24nKQorCisgICAgICAgICAgICBzZWxmLl9j
b21tdW5pY2F0aW9uX3N0YXJ0ZWQgPSBUcnVlCisgICAgICAgICAgICBpZiBpbnB1dDoKKyAgICAg
ICAgICAgICAgICBzZWxmLnN0ZGluLndyaXRlKHN0cmluZ191dGlscy5lbmNvZGUoaW5wdXQpKQor
ICAgICAgICAgICAgc2VsZi53YWl0KHRpbWVvdXQ9dGltZW91dCkKKyAgICAgICAgICAgIHJldHVy
biBzZWxmLnN0ZG91dC5yZWFkKCkgaWYgc2VsZi5zdGRvdXQgZWxzZSBOb25lLCBzZWxmLnN0ZGVy
ci5yZWFkKCkgaWYgc2VsZi5zdGRlcnIgZWxzZSBOb25lCisKKyAgICAgICAgZGVmIHdhaXQoc2Vs
ZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgICAgIGlmIHNlbGYucG9sbCgpIGlzIG5vdCBOb25l
OgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBpZiB0aW1lb3V0IGFuZCAo
c2VsZi5fY29tcGxldGlvbi5lbGFwc2VkIGlzIE5vbmUgb3IgdGltZW91dCA8IHNlbGYuX2NvbXBs
ZXRpb24uZWxhcHNlZCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVGltZW91dEV4cGlyZWQoc2Vs
Zi5fYXJncywgdGltZW91dCkKKworICAgICAgICAgICAgaWYgc2VsZi5fY29tcGxldGlvbi5lbGFw
c2VkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignUnVubmluZyBh
IGNvbW1hbmQgdGhhdCBoYW5ncyB3aXRob3V0IGEgdGltZW91dCcpCisKKyAgICAgICAgICAgIGlm
IHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZDoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNl
bGYuX2NvbXBsZXRpb24uZWxhcHNlZCkKKworICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0g
c2VsZi5fY29tcGxldGlvbi5yZXR1cm5jb2RlCisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dDoK
KyAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5zZWVrKDApCisgICAgICAgICAgICBpZiBzZWxm
LnN0ZGVycjoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyci5zZWVrKDApCisKKyAgICAgICAg
ZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAg
ZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CisgICAg
ICAgICAgICBpZiBzZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5jbG9z
ZSgpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAgICAgICBzZWxmLnN0
ZGVyci5jbG9zZSgpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGluOgorICAgICAgICAgICAgICAg
IHNlbGYuc3RkaW4uY2xvc2UoKQorCitlbHNlOgorICAgIGNsYXNzIFBvcGVuKFBvcGVuQmFzZSk6
CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmdzLCBidWZzaXplPS0xLCBleGVjdXRhYmxl
PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3Rk
ZXJyPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBwcmVleGVjX2ZuPU5vbmUsIGNsb3NlX2Zk
cz1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgc2hlbGw9RmFsc2UsIGN3ZD1Ob25lLCBlbnY9
Tm9uZSwgdW5pdmVyc2FsX25ld2xpbmVzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBzdGFy
dHVwaW5mbz1Ob25lLCBjcmVhdGlvbmZsYWdzPTApOgorCisgICAgICAgICAgICBzdXBlcihQb3Bl
biwgc2VsZikuX19pbml0X18oYXJncywgYnVmc2l6ZT1idWZzaXplLCBjd2Q9Y3dkLCBzdGRpbj1z
dGRpbiwgc3Rkb3V0PXN0ZG91dCwgc3RkZXJyPXN0ZGVycikKKworICAgICAgICAgICAgZm9yIGlu
ZGV4IGluIHJhbmdlKGxlbihhcmdzKSk6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFu
Y2UoYXJnc1tpbmRleF0sIChzdHIsIHVuaWNvZGUpKToKKyAgICAgICAgICAgICAgICAgICAgcmFp
c2UgVHlwZUVycm9yKCdleGVjdigpIGFyZyB7fSBtdXN0IGNvbnRhaW4gb25seSBzdHJpbmdzJy5m
b3JtYXQoaW5kZXggKyAxKSkKKworICAgICAgICAgICAgc2VsZi50ZXh0X21vZGUgPSB1bml2ZXJz
YWxfbmV3bGluZXMKKworICAgICAgICBkZWYgY29tbXVuaWNhdGUoc2VsZiwgaW5wdXQ9Tm9uZSk6
CisgICAgICAgICAgICBpZiBzZWxmLl9jb21tdW5pY2F0aW9uX3N0YXJ0ZWQgYW5kIGlucHV0Ogor
ICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0Nhbm5vdCBzZW5kIGlucHV0IGFmdGVy
IHN0YXJ0aW5nIGNvbW11bmljYXRpb24nKQorCisgICAgICAgICAgICBzZWxmLl9jb21tdW5pY2F0
aW9uX3N0YXJ0ZWQgPSBUcnVlCisgICAgICAgICAgICBpZiBpbnB1dDoKKyAgICAgICAgICAgICAg
ICBzZWxmLnN0ZGluLndyaXRlKGlucHV0KQorICAgICAgICAgICAgc2VsZi53YWl0KCkKKyAgICAg
ICAgICAgIHJldHVybiBzZWxmLnN0ZG91dC5yZWFkKCkgaWYgc2VsZi5zdGRvdXQgZWxzZSBOb25l
LCBzZWxmLnN0ZGVyci5yZWFkKCkgaWYgc2VsZi5zdGRlcnIgZWxzZSBOb25lCisKKyAgICAgICAg
ZGVmIHdhaXQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLnBvbGwoKSBpcyBub3QgTm9uZToK
KyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgIyBOZWVkIHRvIGNoZWNrIHRo
ZSB0aW1lb3V0IGNvbnRleHQKKyAgICAgICAgICAgIHRpbWVvdXQgPSBUaW1lb3V0LmRpZmZlcmVu
Y2UoKQorICAgICAgICAgICAgaWYgdGltZW91dCBhbmQgKHNlbGYuX2NvbXBsZXRpb24uZWxhcHNl
ZCBpcyBOb25lIG9yIHRpbWVvdXQgPCBzZWxmLl9jb21wbGV0aW9uLmVsYXBzZWQpOgorICAgICAg
ICAgICAgICAgIHJhaXNlIFRpbWVvdXRFeHBpcmVkKHNlbGYuX2FyZ3MsIHRpbWVvdXQpCisKKyAg
ICAgICAgICAgIGlmIHNlbGYuX2NvbXBsZXRpb24uZWxhcHNlZCBpcyBOb25lOgorICAgICAgICAg
ICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1J1bm5pbmcgYSBjb21tYW5kIHRoYXQgaGFuZ3Mgd2l0
aG91dCBhIHRpbWVvdXQnKQorCisgICAgICAgICAgICBpZiBzZWxmLl9jb21wbGV0aW9uLmVsYXBz
ZWQ6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLl9jb21wbGV0aW9uLmVsYXBzZWQp
CisKKyAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IHNlbGYuX2NvbXBsZXRpb24ucmV0dXJu
Y29kZQorICAgICAgICAgICAgaWYgc2VsZi5zdGRvdXQ6CisgICAgICAgICAgICAgICAgc2VsZi5z
dGRvdXQuc2VlaygwKQorICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICAg
ICAgc2VsZi5zdGRlcnIuc2VlaygwKQpJbmRleDogVG9vbHMvU2NyaXB0cy9saWJyYXJpZXMvd2Vi
a2l0Y29yZXB5L3dlYmtpdGNvcmVweS9tb2Nrcy9zdWJwcm9jZXNzLnB5Cj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJraXRjb3JlcHkvbW9ja3Mv
c3VicHJvY2Vzcy5weQkobm9uZXhpc3RlbnQpCisrKyBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93
ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5L21vY2tzL3N1YnByb2Nlc3MucHkJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxODcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0
OgorIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyMgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTgorIyBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworIyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCBjbXBfdG9f
a2V5Citmcm9tIHdlYmtpdGNvcmVweSBpbXBvcnQgc3RyaW5nX3V0aWxzLCB1bmljb2RlCitmcm9t
IHdlYmtpdGNvcmVweS5tb2NrcyBpbXBvcnQgQ29udGV4dFN0YWNrCisKKworY2xhc3MgUHJvY2Vz
c0NvbXBsZXRpb24ob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmV0dXJuY29kZT1O
b25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsIGVsYXBzZWQ9MCk6CisgICAgICAgIHNlbGYu
cmV0dXJuY29kZSA9IDEgaWYgcmV0dXJuY29kZSBpcyBOb25lIGVsc2UgcmV0dXJuY29kZQorICAg
ICAgICBzZWxmLnN0ZG91dCA9IHN0cmluZ191dGlscy5lbmNvZGUoc3Rkb3V0KSBpZiBzdGRvdXQg
ZWxzZSBiJycKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBzdHJpbmdfdXRpbHMuZW5jb2RlKHN0ZGVy
cikgaWYgc3RkZXJyIGVsc2UgYicnCisgICAgICAgIHNlbGYuZWxhcHNlZCA9IGVsYXBzZWQKKwor
CitjbGFzcyBTdWJwcm9jZXNzKENvbnRleHRTdGFjayk6CisgICAgIiIiCisgICAgT3JnYW5pemUg
UHJvY2Vzc0NvbXBsZXRpb25zIHNvIGNhbGxzIHRvIHN1YnByb2Nlc3MgZnVuY3Rpb25zIHdpbGwg
cmV0dXJuIGEgUHJvY2Vzc0NvbXBsZXRpb24gZm9yCisgICAgYSBzZXQgb2YgYXJndW1lbnRzIG9y
IHRyaWdnZXIgYSBQcm9jZXNzQ29tcGxldGlvbiBnZW5lcmF0b3IuIG1vY2tzLlN1YnByb2Nlc3Mg
bWFrZXMgYW4gYXR0ZW1wdCB0bworICAgIHByaW9yaXRpemUgQ29tbWFuZFJvdXRlIG9iamVjdHMg
Zm9yIGEgZ2l2ZW4gc2V0IG9mIGFyZ3VtZW50cyBzdWNoIHRoYXQgdGhlIG1vc3Qgc3BlY2lmaWMg
YXBwbGljYWJsZSByb3V0ZQorICAgIGlzIHByZWZlcmVkLgorCisgICAgRXhhbXBsZSB1c2FnZSBt
b2NraW5nIGEgc2luZ2xlIGNvbW1hbmQ6CisgICAgICAgIHdpdGggbW9ja3MuU3VicHJvY2VzcygK
KyAgICAgICAgICAgICdscycsIGNvbXBsZXRpb249bW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24ocmV0
dXJuY29kZT0wLCBzdGRvdXQ9J2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nKSwKKyAgICAgICAgKToK
KyAgICAgICAgICAgIHJlc3VsdCA9IHJ1bihbJ2xzJ10sIGNhcHR1cmVfb3V0cHV0PVRydWUsIGVu
Y29kaW5nPSd1dGYtOCcpCisgICAgICAgICAgICBhc3NlcnQgcmVzdWx0LnJldHVybmNvZGUgPT0g
MAorICAgICAgICAgICAgYXNzZXJ0IHJlc3VsdC5zdGRvdXQgPT0gJ2ZpbGUxLnR4dFxuZmlsZTIu
dHh0XG4nCisKKyAgICBFeGFtcGxlIHVzYWdlIG1vY2tpbmcgYSBzZXQgb2YgY29tbWFuZHM6Cisg
ICAgICAgIHdpdGggbW9ja3MuU3VicHJvY2VzcygKKyAgICAgICAgICAgIG1vY2tzLlN1YnByb2Nl
c3MuQ29tbWFuZFJvdXRlKCdjb21tYW5kLWEnLCAnYXJndW1lbnQnLCBjb21wbGV0aW9uPW1vY2tz
LlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCkpLAorICAgICAgICAgICAgbW9ja3MuU3Vi
cHJvY2Vzcy5Db21tYW5kUm91dGUoJ2NvbW1hbmQtYicsIGNvbXBsZXRpb249bW9ja3MuUHJvY2Vz
c0NvbXBsZXRpb24ocmV0dXJuY29kZT0tMSkpLAorICAgICAgICApOgorICAgICAgICAgICAgcmVz
dWx0ID0gcnVuKFsnY29tbWFuZC1hJywgJ2FyZ3VtZW50J10pCisgICAgICAgICAgICBhc3NlcnQg
cmVzdWx0LnJldHVybmNvZGUgPT0gMAorCisgICAgICAgICAgICByZXN1bHQgPSBydW4oWydjb21t
YW5kLWInXSkKKyAgICAgICAgICAgIGFzc2VydCByZXN1bHQucmV0dXJuY29kZSA9PSAtMQorICAg
ICIiIgorICAgIHRvcCA9IE5vbmUKKworICAgIGNsYXNzIENvbW1hbmRSb3V0ZShvYmplY3QpOgor
ICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAg
IGNvbXBsZXRpb24gPSBrd2FyZ3MucG9wKCdjb21wbGV0aW9uJywgUHJvY2Vzc0NvbXBsZXRpb24o
KSkKKyAgICAgICAgICAgIGN3ZCA9IGt3YXJncy5wb3AoJ2N3ZCcsIE5vbmUpCisgICAgICAgICAg
ICBpbnB1dCA9IGt3YXJncy5wb3AoJ2lucHV0JywgTm9uZSkKKyAgICAgICAgICAgIGdlbmVyYXRv
ciA9IGt3YXJncy5wb3AoJ2dlbmVyYXRvcicsIE5vbmUpCisgICAgICAgICAgICBpZiBrd2FyZ3Mu
a2V5cygpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignX19pbml0X18oKSBnb3Qg
YW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50IHt9Jy5mb3JtYXQoa3dhcmdzLmtleXMoKVsw
XSkpCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJncywgc3RyKSBvciBpc2luc3RhbmNl
KGFyZ3MsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXJncyA9IFthcmdzXQorICAg
ICAgICAgICAgZWxpZiBub3QgYXJnczoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9y
KCdBcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZCB0byBhIENvbW1hbmRSb3V0ZScpCisgICAgICAg
ICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKworICAgICAgICAg
ICAgc2VsZi5nZW5lcmF0b3IgPSBnZW5lcmF0b3Igb3IgKGxhbWJkYSAqYXJncywgKiprd2FyZ3M6
IGNvbXBsZXRpb24pCisgICAgICAgICAgICBzZWxmLmN3ZCA9IGN3ZAorICAgICAgICAgICAgc2Vs
Zi5pbnB1dCA9IHN0cmluZ191dGlscy5lbmNvZGUoaW5wdXQpIGlmIGlucHV0IGVsc2UgTm9uZQor
CisgICAgICAgIGRlZiBtYXRjaGVzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAg
ICBjd2QgPSBrd2FyZ3MucG9wKCdjd2QnLCBOb25lKQorICAgICAgICAgICAgaW5wdXQgPSBrd2Fy
Z3MucG9wKCdpbnB1dCcsIE5vbmUpCisgICAgICAgICAgICBpZiBrd2FyZ3Mua2V5cygpOgorICAg
ICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbWF0Y2hlcygpIGdvdCBhbiB1bmV4cGVjdGVk
IGtleXdvcmQgYXJndW1lbnQge30nLmZvcm1hdChrd2FyZ3Mua2V5cygpWzBdKSkKKworICAgICAg
ICAgICAgaWYgbGVuKHNlbGYuYXJncykgPiBsZW4oYXJncyk6CisgICAgICAgICAgICAgICAgcmV0
dXJuIEZhbHNlCisKKyAgICAgICAgICAgIGZvciBjb3VudCBpbiByYW5nZShsZW4oc2VsZi5hcmdz
KSk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5hcmdzW2NvdW50XSBpcyBOb25lOgorICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuYXJn
c1tjb3VudF0gPT0gYXJnc1tjb3VudF06CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisg
ICAgICAgICAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGYuYXJnc1tjb3VudF0sICdtYXRjaCcpIGFu
ZCBzZWxmLmFyZ3NbY291bnRdLm1hdGNoKGFyZ3NbY291bnRdKToKKyAgICAgICAgICAgICAgICAg
ICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbGlmIHJlLm1hdGNoKHNlbGYuYXJnc1tjb3Vu
dF0sIGFyZ3NbY291bnRdKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAg
ICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAgICAgaWYgc2VsZi5jd2QgaXMgbm90IE5v
bmUgYW5kIGN3ZCAhPSBzZWxmLmN3ZDoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAg
ICAgICAgICAgIGlmIHNlbGYuaW5wdXQgaXMgbm90IE5vbmUgYW5kIGlucHV0ICE9IHNlbGYuaW5w
dXQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICByZXR1cm4gVHJ1
ZQorCisgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAg
ICAgICAgY3dkID0ga3dhcmdzLnBvcCgnY3dkJywgTm9uZSkKKyAgICAgICAgICAgIGlucHV0ID0g
a3dhcmdzLnBvcCgnaW5wdXQnLCBOb25lKQorICAgICAgICAgICAgaWYga3dhcmdzLmtleXMoKToK
KyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ19fY2FsbF9fKCkgZ290IGFuIHVuZXhw
ZWN0ZWQga2V5d29yZCBhcmd1bWVudCB7fScuZm9ybWF0KGt3YXJncy5rZXlzKClbMF0pKQorICAg
ICAgICAgICAgcmV0dXJuIHNlbGYuZ2VuZXJhdG9yKCphcmdzLCBjd2Q9Y3dkLCBpbnB1dD1pbnB1
dCkKKworICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgZGVmIGNvbXBhcmUoY2xzLCBhLCBi
KToKKyAgICAgICAgICAgIGZvciBjYW5kaWRhdGUgaW4gWworICAgICAgICAgICAgICAgIGxlbihi
LmFyZ3MpIC0gbGVuKGEuYXJncyksCisgICAgICAgICAgICAgICAgMCBpZiB0eXBlKGEuY3dkKSA9
PSB0eXBlKGIuY3dkKSBlbHNlIC0xIGlmIGEuY3dkIGVsc2UgMSwKKyAgICAgICAgICAgICAgICAw
IGlmIHR5cGUoYS5pbnB1dCkgPT0gdHlwZShiLmlucHV0KSBlbHNlIC0xIGlmIGEuaW5wdXQgZWxz
ZSAxLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgICAgICBpZiBjYW5kaWRhdGU6CisgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGUKKyAgICAgICAgICAgIHJldHVybiAwCisK
KyAgICBSb3V0ZSA9IENvbW1hbmRSb3V0ZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGNv
bXBsZXRpb25fZ2VuZXJhdG9yX2ZvcihjbHMsIHByb2dyYW0pOgorICAgICAgICBjdXJyZW50ID0g
Y2xzLnRvcAorICAgICAgICBjYW5kaWRhdGVzID0gW10KKyAgICAgICAgd2hpbGUgY3VycmVudDoK
KyAgICAgICAgICAgIGZvciBjb21wbGV0aW9uIGluIGN1cnJlbnQuY29tcGxldGlvbnM6CisgICAg
ICAgICAgICAgICAgaWYgY29tcGxldGlvbi5hcmdzWzBdID09IHByb2dyYW06CisgICAgICAgICAg
ICAgICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKGNvbXBsZXRpb24pCisgICAgICAgICAgICAgICAg
aWYgY3VycmVudC5vcmRlcmVkOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAg
ICAgY3VycmVudCA9IGN1cnJlbnQucHJldmlvdXMKKworICAgICAgICBpZiBjYW5kaWRhdGVzOgor
ICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZXMKKworICAgICAgICBpZiBzeXMudmVyc2lvbl9p
bmZvID4gKDMsIDApOgorICAgICAgICAgICAgcmFpc2UgRmlsZU5vdEZvdW5kRXJyb3IoIk5vIHN1
Y2ggZmlsZSBvciBkaXJlY3Rvcnk6ICd7cGF0aH0nOiAne3BhdGh9JyIuZm9ybWF0KHBhdGg9cHJv
Z3JhbSkpCisgICAgICAgIHJhaXNlIE9TRXJyb3IoJ1tFcnJubyAyXSBObyBzdWNoIGZpbGUgb3Ig
ZGlyZWN0b3J5JykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjb21wbGV0aW9uX2Zvcihj
bHMsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGNhbmRpZGF0ZXMgPSBbCisgICAgICAgICAg
ICBjYW5kaWRhdGUgZm9yIGNhbmRpZGF0ZSBpbiBjbHMuY29tcGxldGlvbl9nZW5lcmF0b3JfZm9y
KGFyZ3NbMF0pIGlmIGNhbmRpZGF0ZS5tYXRjaGVzKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAg
XQorICAgICAgICBpZiBub3QgY2FuZGlkYXRlczoKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlv
bkVycm9yKCdQcm92aWRlZCBhcmd1bWVudHMgdG8ge30gZG8gbm90IG1hdGNoIGEgcHJvdmlkZWQg
Y29tcGxldGlvbicuZm9ybWF0KGFyZ3NbMF0pKQorCisgICAgICAgIGNvbXBsZXRpb24gPSBjYW5k
aWRhdGVzWzBdCisgICAgICAgIGN1cnJlbnQgPSBjbHMudG9wCisgICAgICAgIHdoaWxlIGN1cnJl
bnQ6CisgICAgICAgICAgICBpZiBjdXJyZW50Lm9yZGVyZWQgYW5kIGNvbXBsZXRpb24gaXMgY3Vy
cmVudC5jb21wbGV0aW9uc1swXToKKyAgICAgICAgICAgICAgICBjdXJyZW50LmNvbXBsZXRpb25z
LnBvcCgwKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjdXJyZW50ID0gY3Vy
cmVudC5wcmV2aW91cworICAgICAgICByZXR1cm4gY29tcGxldGlvbigqYXJncywgKiprd2FyZ3Mp
CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgaWYg
YWxsKFtpc2luc3RhbmNlKGFyZywgc2VsZi5Db21tYW5kUm91dGUpIGZvciBhcmcgaW4gYXJnc10p
OgorICAgICAgICAgICAgc2VsZi5vcmRlcmVkID0ga3dhcmdzLnBvcCgnb3JkZXJlZCcsIEZhbHNl
KQorICAgICAgICAgICAgaWYga3dhcmdzLmtleXMoKToKKyAgICAgICAgICAgICAgICByYWlzZSBU
eXBlRXJyb3IoJ19faW5pdF9fKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCB7
fScuZm9ybWF0KGt3YXJncy5rZXlzKClbMF0pKQorICAgICAgICAgICAgc2VsZi5jb21wbGV0aW9u
cyA9IGxpc3QoYXJncykgaWYgc2VsZi5vcmRlcmVkIGVsc2Ugc29ydGVkKGFyZ3MsIGtleT1jbXBf
dG9fa2V5KHNlbGYuQ29tbWFuZFJvdXRlLmNvbXBhcmUpKQorICAgICAgICBlbGlmIGFueShbaXNp
bnN0YW5jZShhcmcsIHNlbGYuQ29tbWFuZFJvdXRlKSBmb3IgYXJnIGluIGFyZ3NdKToKKyAgICAg
ICAgICAgIHJhaXNlIFR5cGVFcnJvcignbW9ja3MuU3VicHJvY2VzcyBhcmd1bWVudHMgbXVzdCBi
ZSBvZiBhIGNvbnNpc3RlbnQgdHlwZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxm
Lm9yZGVyZWQgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jb21wbGV0aW9ucyA9IFtzZWxmLkNv
bW1hbmRSb3V0ZSgqYXJncywgKiprd2FyZ3MpXQorCisgICAgICAgIHN1cGVyKFN1YnByb2Nlc3Ms
IHNlbGYpLl9faW5pdF9fKGNscz1TdWJwcm9jZXNzKQorCisgICAgICAgICMgQWxsb3cgbW9jayB0
byBiZSBtYW5hZ2VkIHZpYSBhdXRvaW5zdGFsbAorICAgICAgICBmcm9tIG1vY2sgaW1wb3J0IHBh
dGNoCisgICAgICAgIGZyb20gd2Via2l0Y29yZXB5Lm1vY2tzLnBvcGVuIGltcG9ydCBQb3Blbgor
ICAgICAgICBzZWxmLnBhdGNoZXMuYXBwZW5kKHBhdGNoKCdzdWJwcm9jZXNzLlBvcGVuJywgbmV3
PVBvcGVuKSkKSW5kZXg6IFRvb2xzL1NjcmlwdHMvbGlicmFyaWVzL3dlYmtpdGNvcmVweS93ZWJr
aXRjb3JlcHkvdGVzdHMvbW9ja3Mvc3VicHJvY2Vzc191bml0dGVzdC5weQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9TY3JpcHRzL2xpYnJhcmllcy93ZWJraXRjb3JlcHkvd2Via2l0Y29yZXB5L3Rlc3Rz
L21vY2tzL3N1YnByb2Nlc3NfdW5pdHRlc3QucHkJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvU2Ny
aXB0cy9saWJyYXJpZXMvd2Via2l0Y29yZXB5L3dlYmtpdGNvcmVweS90ZXN0cy9tb2Nrcy9zdWJw
cm9jZXNzX3VuaXR0ZXN0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTUyIEBACisjIENv
cHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyMgQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBv
cnQgdW5pdHRlc3QKKworZnJvbSB3ZWJraXRjb3JlcHkgaW1wb3J0IEJ5dGVzSU8sIE91dHB1dENh
cHR1cmUsIG1vY2tzLCBydW4KKworCitjbGFzcyBNb2NrU3VicHJvY2Vzcyh1bml0dGVzdC5UZXN0
Q2FzZSk6CisgICAgTFMgPSBtb2Nrcy5TdWJwcm9jZXNzLlJvdXRlKAorICAgICAgICAnbHMnLAor
ICAgICAgICBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwg
c3Rkb3V0PSdmaWxlMS50eHRcbmZpbGUyLnR4dFxuJyksCisgICAgKQorICAgIFNMRUVQID0gbW9j
a3MuU3VicHJvY2Vzcy5Sb3V0ZSgKKyAgICAgICAgJ3NsZWVwJywKKyAgICAgICAgZ2VuZXJhdG9y
PWxhbWJkYSAqYXJncywgKiprd2FyZ3M6IG1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNv
ZGU9MCwgZWxhcHNlZD1pbnQoYXJnc1sxXSkpLAorICAgICkKKworICAgIGRlZiB0ZXN0X2RvY3Vt
ZW50YXRpb24oc2VsZik6CisgICAgICAgIHdpdGggT3V0cHV0Q2FwdHVyZSgpOgorICAgICAgICAg
ICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNzKAorICAgICAgICAgICAgICAgICAgICAnbHMnLCBjb21w
bGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwgc3Rkb3V0PSdmaWxl
MS50eHRcbmZpbGUyLnR4dFxuJyksCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHJl
c3VsdCA9IHJ1bihbJ2xzJ10sIGNhcHR1cmVfb3V0cHV0PVRydWUsIGVuY29kaW5nPSd1dGYtOCcp
CisgICAgICAgICAgICAgICAgYXNzZXJ0IHJlc3VsdC5yZXR1cm5jb2RlID09IDAKKyAgICAgICAg
ICAgICAgICBhc3NlcnQgcmVzdWx0LnN0ZG91dCA9PSAnZmlsZTEudHh0XG5maWxlMi50eHRcbicK
KworICAgICAgICAgICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNzKAorICAgICAgICAgICAgICAgICAg
ICAnbHMnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNvZGU9MCwg
c3Rkb3V0PSdmaWxlMS50eHRcbmZpbGUyLnR4dFxuJyksCisgICAgICAgICAgICApOgorICAgICAg
ICAgICAgICAgIGFzc2VydCBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbJ2xzJ10pID09IGInZmls
ZTEudHh0XG5maWxlMi50eHRcbicKKyAgICAgICAgICAgICAgICBhc3NlcnQgc3VicHJvY2Vzcy5j
aGVja19jYWxsKFsnbHMnXSkgPT0gMAorCisgICAgICAgICAgICB3aXRoIG1vY2tzLlN1YnByb2Nl
c3MoCisgICAgICAgICAgICAgICAgICAgIG1vY2tzLlN1YnByb2Nlc3MuQ29tbWFuZFJvdXRlKCdj
b21tYW5kLWEnLCAnYXJndW1lbnQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9u
KHJldHVybmNvZGU9MCkpLAorICAgICAgICAgICAgICAgICAgICBtb2Nrcy5TdWJwcm9jZXNzLkNv
bW1hbmRSb3V0ZSgnY29tbWFuZC1iJywgY29tcGxldGlvbj1tb2Nrcy5Qcm9jZXNzQ29tcGxldGlv
bihyZXR1cm5jb2RlPS0xKSksCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHJlc3Vs
dCA9IHJ1bihbJ2NvbW1hbmQtYScsICdhcmd1bWVudCddKQorICAgICAgICAgICAgICAgIGFzc2Vy
dCByZXN1bHQucmV0dXJuY29kZSA9PSAwCisKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBydW4o
Wydjb21tYW5kLWInXSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgcmVzdWx0LnJldHVybmNvZGUg
PT0gLTEKKworICAgIGRlZiB0ZXN0X25vX2ZpbGUoc2VsZik6CisgICAgICAgIHdpdGggbW9ja3Mu
U3VicHJvY2VzcyhzZWxmLkxTLCBzZWxmLlNMRUVQKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5h
c3NlcnRSYWlzZXMoT1NFcnJvcik6CisgICAgICAgICAgICAgICAgcnVuKFsnaW52YWxpZC1maWxl
J10pCisKKyAgICBkZWYgdGVzdF9pbXBsaWVkX3JvdXRlKHNlbGYpOgorICAgICAgICB3aXRoIG1v
Y2tzLlN1YnByb2Nlc3MoJ2NvbW1hbmQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0
aW9uKHJldHVybmNvZGU9MCkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oWydj
b21tYW5kJ10pLnJldHVybmNvZGUsIDApCisKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRS
YWlzZXMoT1NFcnJvcik6CisgICAgICAgICAgICAgICAgcnVuKFsnaW52YWxpZC1maWxlJ10pCisK
KyAgICBkZWYgdGVzdF9wb3BlbihzZWxmKToKKyAgICAgICAgd2l0aCBtb2Nrcy5UaW1lOgorICAg
ICAgICAgICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNzKHNlbGYuTFMsIHNlbGYuU0xFRVApOgorICAg
ICAgICAgICAgICAgIGxzID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2xzJ10sIHN0ZG91dD1zdWJwcm9j
ZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgICAgICAgICAgbHMud2Fp
dCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBscy5wb2xsKCkpCisgICAg
ICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nLCBs
cy5zdGRvdXQucmVhZCgpKQorCisgICAgICAgICAgICAgICAgc2xlZXAgPSBzdWJwcm9jZXNzLlBv
cGVuKFsnc2xlZXAnLCAnMSddLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJv
Y2Vzcy5QSVBFKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2xlZXAu
cG9sbCgpKQorICAgICAgICAgICAgICAgIHNsZWVwLndhaXQoKQorICAgICAgICAgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwoMCwgc2xlZXAucG9sbCgpKQorCisgICAgZGVmIHRlc3Rfb3JkZXJlZChz
ZWxmKToKKyAgICAgICAgd2l0aCBPdXRwdXRDYXB0dXJlKCksIG1vY2tzLlN1YnByb2Nlc3MoCisg
ICAgICAgICAgICBtb2Nrcy5TdWJwcm9jZXNzLlJvdXRlKCdjb21tYW5kJywgY29tcGxldGlvbj1t
b2Nrcy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5jb2RlPTApKSwKKyAgICAgICAgICAgIG1vY2tz
LlN1YnByb2Nlc3MuUm91dGUoJ2NvbW1hbmQnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21w
bGV0aW9uKHJldHVybmNvZGU9MSkpLAorICAgICAgICAgICAgb3JkZXJlZD1UcnVlLAorICAgICAg
ICApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oWydjb21tYW5kJ10pLnJldHVy
bmNvZGUsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihbJ2NvbW1hbmQnXSku
cmV0dXJuY29kZSwgMSkKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJv
cik6CisgICAgICAgICAgICAgICAgcnVuKFsnY29tbWFuZCddKQorCisgICAgZGVmIHRlc3RfYXJn
dW1lbnRfcHJpb3JpdHkoc2VsZik6CisgICAgICAgIHdpdGggT3V0cHV0Q2FwdHVyZSgpLCBtb2Nr
cy5TdWJwcm9jZXNzKAorICAgICAgICAgICAgbW9ja3MuU3VicHJvY2Vzcy5Sb3V0ZSgnY29tbWFu
ZCcsICctLWhlbHAnLCBjb21wbGV0aW9uPW1vY2tzLlByb2Nlc3NDb21wbGV0aW9uKHJldHVybmNv
ZGU9MCkpLAorICAgICAgICAgICAgbW9ja3MuU3VicHJvY2Vzcy5Sb3V0ZSgnY29tbWFuZCcsIGNv
bXBsZXRpb249bW9ja3MuUHJvY2Vzc0NvbXBsZXRpb24ocmV0dXJuY29kZT0xKSksCisgICAgICAg
ICk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihbJ2NvbW1hbmQnXSkucmV0dXJu
Y29kZSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKFsnY29tbWFuZCcsICct
LWhlbHAnXSkucmV0dXJuY29kZSwgMCkKKworICAgIGRlZiB0ZXN0X2N3ZF9wcmlvcml0eShzZWxm
KToKKyAgICAgICAgd2l0aCBPdXRwdXRDYXB0dXJlKCksIG1vY2tzLlN1YnByb2Nlc3MoCisgICAg
ICAgICAgICBtb2Nrcy5TdWJwcm9jZXNzLlJvdXRlKCdjb21tYW5kJywgY29tcGxldGlvbj1tb2Nr
cy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5jb2RlPTApLCBjd2Q9Jy9leGFtcGxlJyksCisgICAg
ICAgICAgICBtb2Nrcy5TdWJwcm9jZXNzLlJvdXRlKCdjb21tYW5kJywgY29tcGxldGlvbj1tb2Nr
cy5Qcm9jZXNzQ29tcGxldGlvbihyZXR1cm5jb2RlPTEpKSwKKyAgICAgICAgKToKKyAgICAgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKFsnY29tbWFuZCddKS5yZXR1cm5jb2RlLCAxKQorICAg
ICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oWydjb21tYW5kJ10sIGN3ZD0nL2V4YW1wbGUn
KS5yZXR1cm5jb2RlLCAwKQorCisgICAgZGVmIHRlc3RfaW5wdXRfcHJpb3JpdHkoc2VsZik6Cisg
ICAgICAgIHdpdGggT3V0cHV0Q2FwdHVyZSgpLCBtb2Nrcy5TdWJwcm9jZXNzKAorICAgICAgICAg
ICAgbW9ja3MuU3VicHJvY2Vzcy5Sb3V0ZSgnY29tbWFuZCcsIGNvbXBsZXRpb249bW9ja3MuUHJv
Y2Vzc0NvbXBsZXRpb24ocmV0dXJuY29kZT0wKSwgaW5wdXQ9J3N0ZGluJyksCisgICAgICAgICAg
ICBtb2Nrcy5TdWJwcm9jZXNzLlJvdXRlKCdjb21tYW5kJywgY29tcGxldGlvbj1tb2Nrcy5Qcm9j
ZXNzQ29tcGxldGlvbihyZXR1cm5jb2RlPTEpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwocnVuKFsnY29tbWFuZCddKS5yZXR1cm5jb2RlLCAxKQorICAgICAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbChydW4oWydjb21tYW5kJ10sIGlucHV0PSdzdGRpbicpLnJldHVy
bmNvZGUsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihbJ2NvbW1hbmQnXSwg
c3RkaW49Qnl0ZXNJTyhiJ3N0ZGluJykpLnJldHVybmNvZGUsIDApCisKKworY2xhc3MgTW9ja0No
ZWNrT3V0cHV0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9wb3BlbihzZWxmKToK
KyAgICAgICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNzKE1vY2tTdWJwcm9jZXNzLkxTKToKKyAgICAg
ICAgICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsnbHMnXSkKKyAgICAgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBiJ2ZpbGUxLnR4dFxuZmlsZTIudHh0XG4nKQor
CisKK2NsYXNzIE1vY2tDaGVja0NhbGwodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0
X3BvcGVuKHNlbGYpOgorICAgICAgICB3aXRoIE91dHB1dENhcHR1cmUoKSBhcyBjYXB0dXJlZDoK
KyAgICAgICAgICAgIHdpdGggbW9ja3MuU3VicHJvY2VzcyhNb2NrU3VicHJvY2Vzcy5MUyk6Cisg
ICAgICAgICAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5jaGVja19jYWxsKFsnbHMnXSkKKyAg
ICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMCkKKworICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKGNhcHR1cmVkLnN0ZG91dC5nZXR2YWx1ZSgpLCAnZmlsZTEudHh0XG5maWxl
Mi50eHRcbicpCisKKworY2xhc3MgTW9ja1J1bih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVm
IHRlc3RfcG9wZW4oc2VsZik6CisgICAgICAgIHdpdGggT3V0cHV0Q2FwdHVyZSgpIGFzIGNhcHR1
cmVkOgorICAgICAgICAgICAgd2l0aCBtb2Nrcy5TdWJwcm9jZXNzKE1vY2tTdWJwcm9jZXNzLkxT
KToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBydW4oWydscyddKQorICAgICAgICAgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnJldHVybmNvZGUsIDApCisgICAgICAgICAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc3Rkb3V0LCBOb25lKQorICAgICAgICAgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwocmVzdWx0LnN0ZGVyciwgTm9uZSkKKworICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFsKGNhcHR1cmVkLnN0ZG91dC5nZXR2YWx1ZSgpLCAnZmlsZTEudHh0XG5maWxlMi50eHRc
bicpCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>