<?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>152345</bug_id>
          
          <creation_ts>2015-12-16 10:50:18 -0800</creation_ts>
          <short_desc>Teach dashboard code to compare non-integer revisions.</short_desc>
          <delta_ts>2016-02-12 14:17:06 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>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=152913</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=153332</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=153467</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=153330</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=153609</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=153621</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=153624</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=153818</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=153820</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=153882</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=154180</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>152910</dependson>
    
    <dependson>153330</dependson>
    
    <dependson>153332</dependson>
    
    <dependson>153467</dependson>
    
    <dependson>153609</dependson>
    
    <dependson>153624</dependson>
          <blocked>153820</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Jason Marcell">jmarcell</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>adele</cc>
    
    <cc>ap</cc>
    
    <cc>dbates</cc>
    
    <cc>dean_johnson</cc>
    
    <cc>dino</cc>
    
    <cc>jmarcell</cc>
    
    <cc>lforschler</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1149684</commentid>
    <comment_count>0</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2015-12-16 10:50:18 -0800</bug_when>
    <thetext>Teach dashboard code to compare non-integer revisions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1149685</commentid>
    <comment_count>1</comment_count>
      <attachid>267470</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2015-12-16 10:58:47 -0800</bug_when>
    <thetext>Created attachment 267470
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1149749</commentid>
    <comment_count>2</comment_count>
      <attachid>267470</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2015-12-16 14:00:14 -0800</bug_when>
    <thetext>Comment on attachment 267470
Patch

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

I didn&apos;t review this at all, just opened at a random place and couldn&apos;t help but post a couple comments.

It&apos;s great to have tests!

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html:5
&gt; +    &lt;meta charset=&quot;UTF-8&quot; /&gt;
&gt; +    &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;

The first line is sufficient. Also, please don&apos;t use XML auto-closing syntax in HTML, it&apos;s invalid there.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html:9
&gt; +    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://code.jquery.com/qunit/qunit-1.20.0.css&quot;&gt;

We try to make our tests not access external resources. There are already parts of jquery in External directory for the dashboard.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1149754</commentid>
    <comment_count>3</comment_count>
      <attachid>267492</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2015-12-16 14:30:36 -0800</bug_when>
    <thetext>Created attachment 267492
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1149755</commentid>
    <comment_count>4</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2015-12-16 14:33:29 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; Comment on attachment 267470 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=267470&amp;action=review
&gt; 
&gt; I didn&apos;t review this at all, just opened at a random place and couldn&apos;t help
&gt; but post a couple comments.
&gt; 
&gt; It&apos;s great to have tests!
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html:5
&gt; &gt; +    &lt;meta charset=&quot;UTF-8&quot; /&gt;
&gt; &gt; +    &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&gt; 
&gt; The first line is sufficient. Also, please don&apos;t use XML auto-closing syntax
&gt; in HTML, it&apos;s invalid there.

Thanks, I addressed these issues.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html:9
&gt; &gt; +    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://code.jquery.com/qunit/qunit-1.20.0.css&quot;&gt;
&gt; 
&gt; We try to make our tests not access external resources. There are already
&gt; parts of jquery in External directory for the dashboard.

Thanks for clarifying. I wasn&apos;t sure if I was supposed to add external code, but it sounds like we have a specific place just for doing that. I put the CSS file in there too. Should it go in External or Styles? Also, check-webkit-style did not like all of the tabs present in QUnit:

    ERROR: Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/External/qunit-1.20.0.css:300:  Line contains tab character.  [whitespace/tab] [5]

Is that an issue?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150101</commentid>
    <comment_count>5</comment_count>
      <attachid>267492</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2015-12-17 15:24:50 -0800</bug_when>
    <thetext>Comment on attachment 267492
Patch

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

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:34
&gt; +

I&apos;m going to remove these lines as I did not realize these settings are persistent. I have a better way of doing this anyway that does not involve touching the production classes but instead uses the mock classes.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:116
&gt; +

I&apos;m going to remove these lines as I did not realize these settings are persistent. I have a better way of doing this anyway that does not involve touching the production classes but instead uses the mock classes.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/QueueView.js:36
&gt; +

I&apos;m going to remove these lines as I did not realize these settings are persistent. I have a better way of doing this anyway that does not involve touching the production classes but instead uses the mock classes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150123</commentid>
    <comment_count>6</comment_count>
      <attachid>267593</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2015-12-17 16:09:38 -0800</bug_when>
    <thetext>Created attachment 267593
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150162</commentid>
    <comment_count>7</comment_count>
      <attachid>267593</attachid>
    <who name="Dean Johnson">dean_johnson</who>
    <bug_when>2015-12-17 18:21:45 -0800</bug_when>
    <thetext>Comment on attachment 267593
Patch

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

Looks good overall. Few things, but otherwise nice work... I know a lot of people will be happy to see these changes merged. :)

Also, thanks for adding QUnit! It&apos;s awesome that we have a way to test our front-end now.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:301
&gt;          var sortedRepositories = Dashboard.sortedRepositories;
&gt;          for (var i = 0; i &lt; sortedRepositories.length; ++i) {
&gt;              var repositoryName = sortedRepositories[i].name;
&gt; -            var result = b.revision[repositoryName] - a.revision[repositoryName];
&gt; +            var trac = sortedRepositories[i].trac;
&gt; +            if (!trac || b.revision[repositoryName] === undefined || a.revision[repositoryName] === undefined)
&gt; +                return undefined;
&gt; +            var result = trac.compareRevisions(b.revision[repositoryName], a.revision[repositoryName]);
&gt;              if (result)
&gt;                  return result;
&gt;          }

Could compareIterations and compareIterationsByRevisions share this piece of code? It looks identical.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:272
&gt; +    compareRevisions: function(a, b)
&gt; +    {
&gt; +        var indexA = this.recordedCommits.objectIndexOf(a, &quot;revisionNumber&quot;);
&gt; +        var indexB = this.recordedCommits.objectIndexOf(b, &quot;revisionNumber&quot;);
&gt; +        if (indexA === undefined || indexB === undefined) {
&gt; +            this.loadMoreHistoricalData();
&gt; +            return undefined;
&gt; +        }
&gt; +        return indexA - indexB;
&gt; +    },

This seems to make the assumption that a &gt; b. Is it ever possible that b &gt; a? If so, maybe use indexA as max(IndexA, indexB) and indexB as min(indexA, indexB).

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Utilities.js:170
&gt; +{

I think this may make more sense as something like: indexOfObjectWithProperty. I don&apos;t like how verbose that is necessarily though, but it does seem a bit confusing without reading the function code. Ideas?

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Utilities.js:172
&gt; +        if (this[i][property] === searchTerm) return i;

Nit: I think this would look a little nicer on two lines.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/MockOverrides.js:5
&gt; +        if (x) {

What is x? Could we use a better variable?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150178</commentid>
    <comment_count>8</comment_count>
      <attachid>267593</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2015-12-17 19:21:27 -0800</bug_when>
    <thetext>Comment on attachment 267593
Patch

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

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:276
&gt; -            var result = b.revision[repositoryName] - a.revision[repositoryName];
&gt; +            var trac = sortedRepositories[i].trac;
&gt; +            if (!trac || b.revision[repositoryName] === undefined || a.revision[repositoryName] === undefined)
&gt; +                return undefined;

Can you give an example where we would not have a revision for a repository?

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:298
&gt; +            var trac = sortedRepositories[i].trac;
&gt; +            if (!trac || b.revision[repositoryName] === undefined || a.revision[repositoryName] === undefined)
&gt; +                return undefined;
&gt; +            var result = trac.compareRevisions(b.revision[repositoryName], a.revision[repositoryName]);

Ditto.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:95
&gt; +            if (!trac.latestRecordedRevisionNumber || comparison === undefined || comparison &gt; 0) {

Can you give an example when comparison === undefined?

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:100
&gt; +            totalRevisionsBehind += trac.commitsOnBranch(branch.name, function(commit, index, arr) { return index &gt; arr.objectIndexOf(latestProductiveRevisionNumber, &quot;revisionNumber&quot;); }).length;

The name arr is not a good name for the array of commits. I am assuming arr is short for &quot;array&quot;. Regardless, neither &quot;arr&quot; nor &quot;array&quot; are good names because the former is an abbreviation of the latter (and I do not find it more canonical than the word &quot;array&quot;) and the latter is a generic term that does not convey anything about the contents of the array. Maybe a better name would be commits or allCommits?

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:145
&gt; +        var commits = trac.commitsOnBranch(branch.name, function(commit, index, arr) { return index &gt;= arr.objectIndexOf(firstRevisionNumber, &quot;revisionNumber&quot;) &amp;&amp; index &lt;= arr.objectIndexOf(lastRevisionNumber, &quot;revisionNumber&quot;); });

Ditto.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:68
&gt; +        return this.recordedCommits.filter(function(commit, index, arr) {

Ditto.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:266
&gt; +        var indexA = this.recordedCommits.objectIndexOf(a, &quot;revisionNumber&quot;);
&gt; +        var indexB = this.recordedCommits.objectIndexOf(b, &quot;revisionNumber&quot;);

Can you elaborate on when a commit would not have a revision?

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:269
&gt; +            this.loadMoreHistoricalData();
&gt; +            return undefined;

This does not seem like the correct approach. Having a comparison function fetch more data and have a polymorphic return type is weird.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150186</commentid>
    <comment_count>9</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2015-12-17 20:23:29 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; Comment on attachment 267593 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=267593&amp;action=review
&gt; 
&gt; Looks good overall. Few things, but otherwise nice work... I know a lot of
&gt; people will be happy to see these changes merged. :)
&gt; 
&gt; Also, thanks for adding QUnit! It&apos;s awesome that we have a way to test our
&gt; front-end now.
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:301
&gt; &gt;          var sortedRepositories = Dashboard.sortedRepositories;
&gt; &gt;          for (var i = 0; i &lt; sortedRepositories.length; ++i) {
&gt; &gt;              var repositoryName = sortedRepositories[i].name;
&gt; &gt; -            var result = b.revision[repositoryName] - a.revision[repositoryName];
&gt; &gt; +            var trac = sortedRepositories[i].trac;
&gt; &gt; +            if (!trac || b.revision[repositoryName] === undefined || a.revision[repositoryName] === undefined)
&gt; &gt; +                return undefined;
&gt; &gt; +            var result = trac.compareRevisions(b.revision[repositoryName], a.revision[repositoryName]);
&gt; &gt;              if (result)
&gt; &gt;                  return result;
&gt; &gt;          }
&gt; 
&gt; Could compareIterations and compareIterationsByRevisions share this piece of
&gt; code? It looks identical.

Yes, both compareIterations and compareIterationsByRevisions are very similar. The latter was introduced here:
https://bugs.webkit.org/show_bug.cgi?id=143885

We should probably find a way to collapse these into a single function if possible so that we are not duplicating code.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:272
&gt; &gt; +    compareRevisions: function(a, b)
&gt; &gt; +    {
&gt; &gt; +        var indexA = this.recordedCommits.objectIndexOf(a, &quot;revisionNumber&quot;);
&gt; &gt; +        var indexB = this.recordedCommits.objectIndexOf(b, &quot;revisionNumber&quot;);
&gt; &gt; +        if (indexA === undefined || indexB === undefined) {
&gt; &gt; +            this.loadMoreHistoricalData();
&gt; &gt; +            return undefined;
&gt; &gt; +        }
&gt; &gt; +        return indexA - indexB;
&gt; &gt; +    },
&gt; 
&gt; This seems to make the assumption that a &gt; b. Is it ever possible that b &gt;
&gt; a? If so, maybe use indexA as max(IndexA, indexB) and indexB as min(indexA,
&gt; indexB).

This does not make the assumption that a &gt; b.

This is a pretty common pattern used for things like sort functions. The expected API is as follows: negative return value if the first parameter is less than the second, zero if they’re equal, a positive return value otherwise.

See, for examples of this pattern, the following:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort 

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Utilities.js:170
&gt; &gt; +{
&gt; 
&gt; I think this may make more sense as something like:
&gt; indexOfObjectWithProperty. I don&apos;t like how verbose that is necessarily
&gt; though, but it does seem a bit confusing without reading the function code.
&gt; Ideas?

That doesn&apos;t seem like a bad name, but I&apos;m open to other suggestions. I&apos;ll use that if there are no better suggestions.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Utilities.js:172
&gt; &gt; +        if (this[i][property] === searchTerm) return i;
&gt; 
&gt; Nit: I think this would look a little nicer on two lines.

I&apos;ll add a line break.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/MockOverrides.js:5
&gt; &gt; +        if (x) {
&gt; 
&gt; What is x? Could we use a better variable?

x is actually the value that the user passes to the setter. Should we use &apos;value&apos; as the variable name instead?

Some background: My intention for the MockOverrides.js file was to provide a place where we would override class methods (rather than creating a derived Mock subclass). The idea is that you want to cherry-pick some functionality in a particular method of some class while leaving some other functionality out. To that end, I copied this code from the original setter (bad variable name and all) while leaving out some code that getting in the way of my testing. I know copy/paste code is usually a bad idea, but it&apos;s going to help with testing :/

And if you&apos;re wondering why I overrode the method in the original class instead of just creating a Mock subclass that overrides the method, this is a class that I&apos;m not directly instantiating myself, so I&apos;m not in a position to provide a Mock class as a substitute.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150215</commentid>
    <comment_count>10</comment_count>
      <attachid>267593</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2015-12-17 23:10:15 -0800</bug_when>
    <thetext>Comment on attachment 267593
Patch

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

&gt;&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:276
&gt;&gt; +                return undefined;
&gt; 
&gt; Can you give an example where we would not have a revision for a repository?

Ideally we shouldn&apos;t, but I believe I have seen instances where the defaultBranches() method of a subclass of Buildbot provided branches for a queue/iteration that were not involved in the build. I can look into this further.

&gt;&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:95
&gt;&gt; +            if (!trac.latestRecordedRevisionNumber || comparison === undefined || comparison &gt; 0) {
&gt; 
&gt; Can you give an example when comparison === undefined?

When the dashboard code first starts up, the Trac instances pull some minimum amount of historical data. The revision(s) in question aren&apos;t necessarily present in the &quot;recordCommits&quot; array at first. If they are not in the &quot;recordedCommits&quot; array yet, then we have no way of reasoning about the comparison of the two commits in question. What, then, should I return? I chose to return &quot;undefined&quot;.

&gt;&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:100
&gt;&gt; +            totalRevisionsBehind += trac.commitsOnBranch(branch.name, function(commit, index, arr) { return index &gt; arr.objectIndexOf(latestProductiveRevisionNumber, &quot;revisionNumber&quot;); }).length;
&gt; 
&gt; The name arr is not a good name for the array of commits. I am assuming arr is short for &quot;array&quot;. Regardless, neither &quot;arr&quot; nor &quot;array&quot; are good names because the former is an abbreviation of the latter (and I do not find it more canonical than the word &quot;array&quot;) and the latter is a generic term that does not convey anything about the contents of the array. Maybe a better name would be commits or allCommits?

It&apos;s actually comparing the individual &quot;commit&quot; to the Trac&apos;s internal &quot;recordedCommits&quot; array. I&apos;ll use the name &quot;recordedCommits&quot; here to remain consistent.

&gt;&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:266
&gt;&gt; +        var indexB = this.recordedCommits.objectIndexOf(b, &quot;revisionNumber&quot;);
&gt; 
&gt; Can you elaborate on when a commit would not have a revision?

The Trac class loads commits incrementally. At first, the revision in question may not be in the recordedCommits array. If that&apos;s the case we &quot;loadMoreHistoricalData&quot; and it will be there the next time.

&gt;&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:269
&gt;&gt; +            return undefined;
&gt; 
&gt; This does not seem like the correct approach. Having a comparison function fetch more data and have a polymorphic return type is weird.

I&apos;m open to changing this. I agree that side effects in functions should generally be avoided. Perhaps we can shift the loading of more data out to the call site of this function.

I might disagree with you, however, on the decision to return &quot;undefined&quot;. We need a way to convey that we have an invalid comparison. When the dashboard code first starts up, the Trac instances pull some minimum amount of historical data. The revision(s) in question aren&apos;t necessarily present in the &quot;recordCommits&quot; array at first. If they are not in the &quot;recordedCommits&quot; array yet, then we have no way of reasoning about the comparison of the two commits in question. What, then, should I return? I chose to return &quot;undefined&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1150216</commentid>
    <comment_count>11</comment_count>
      <attachid>267593</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2015-12-17 23:10:18 -0800</bug_when>
    <thetext>Comment on attachment 267593
Patch

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

&gt;&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:276
&gt;&gt; +                return undefined;
&gt; 
&gt; Can you give an example where we would not have a revision for a repository?

Ideally we shouldn&apos;t, but I believe I have seen instances where the defaultBranches() method of a subclass of Buildbot provided branches for a queue/iteration that were not involved in the build. I can look into this further.

&gt;&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:95
&gt;&gt; +            if (!trac.latestRecordedRevisionNumber || comparison === undefined || comparison &gt; 0) {
&gt; 
&gt; Can you give an example when comparison === undefined?

When the dashboard code first starts up, the Trac instances pull some minimum amount of historical data. The revision(s) in question aren&apos;t necessarily present in the &quot;recordCommits&quot; array at first. If they are not in the &quot;recordedCommits&quot; array yet, then we have no way of reasoning about the comparison of the two commits in question. What, then, should I return? I chose to return &quot;undefined&quot;.

&gt;&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:100
&gt;&gt; +            totalRevisionsBehind += trac.commitsOnBranch(branch.name, function(commit, index, arr) { return index &gt; arr.objectIndexOf(latestProductiveRevisionNumber, &quot;revisionNumber&quot;); }).length;
&gt; 
&gt; The name arr is not a good name for the array of commits. I am assuming arr is short for &quot;array&quot;. Regardless, neither &quot;arr&quot; nor &quot;array&quot; are good names because the former is an abbreviation of the latter (and I do not find it more canonical than the word &quot;array&quot;) and the latter is a generic term that does not convey anything about the contents of the array. Maybe a better name would be commits or allCommits?

It&apos;s actually comparing the individual &quot;commit&quot; to the Trac&apos;s internal &quot;recordedCommits&quot; array. I&apos;ll use the name &quot;recordedCommits&quot; here to remain consistent.

&gt;&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:266
&gt;&gt; +        var indexB = this.recordedCommits.objectIndexOf(b, &quot;revisionNumber&quot;);
&gt; 
&gt; Can you elaborate on when a commit would not have a revision?

The Trac class loads commits incrementally. At first, the revision in question may not be in the recordedCommits array. If that&apos;s the case we &quot;loadMoreHistoricalData&quot; and it will be there the next time.

&gt;&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:269
&gt;&gt; +            return undefined;
&gt; 
&gt; This does not seem like the correct approach. Having a comparison function fetch more data and have a polymorphic return type is weird.

I&apos;m open to changing this. I agree that side effects in functions should generally be avoided. Perhaps we can shift the loading of more data out to the call site of this function.

I might disagree with you, however, on the decision to return &quot;undefined&quot;. We need a way to convey that we have an invalid comparison. When the dashboard code first starts up, the Trac instances pull some minimum amount of historical data. The revision(s) in question aren&apos;t necessarily present in the &quot;recordCommits&quot; array at first. If they are not in the &quot;recordedCommits&quot; array yet, then we have no way of reasoning about the comparison of the two commits in question. What, then, should I return? I chose to return &quot;undefined&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153286</commentid>
    <comment_count>12</comment_count>
      <attachid>268424</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-06 17:15:47 -0800</bug_when>
    <thetext>Created attachment 268424
1. Adding QUnit for unit testing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153287</commentid>
    <comment_count>13</comment_count>
      <attachid>268425</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-06 17:18:17 -0800</bug_when>
    <thetext>Created attachment 268425
2. Adding a unit test to test BuildbotQueueView._appendPendingRevisionCount.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153292</commentid>
    <comment_count>14</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-06 17:21:19 -0800</bug_when>
    <thetext>I want to continue working on the feedback that I&apos;ve received from my previous PFR, but I don&apos;t want that to hold up landing these other patches. We should be able to land QUnit as its own patch and the unit tests as their own patch as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153659</commentid>
    <comment_count>15</comment_count>
      <attachid>268503</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-07 15:51:22 -0800</bug_when>
    <thetext>Created attachment 268503
3. Refactor compareIterations to remove duplicate code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153663</commentid>
    <comment_count>16</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-07 15:54:38 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #7)
&gt; &gt; Comment on attachment 267593 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=267593&amp;action=review
&gt; &gt; 
&gt; &gt; Looks good overall. Few things, but otherwise nice work... I know a lot of
&gt; &gt; people will be happy to see these changes merged. :)
&gt; &gt; 
&gt; &gt; Also, thanks for adding QUnit! It&apos;s awesome that we have a way to test our
&gt; &gt; front-end now.
&gt; &gt; 
&gt; &gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:301
&gt; &gt; &gt;          var sortedRepositories = Dashboard.sortedRepositories;
&gt; &gt; &gt;          for (var i = 0; i &lt; sortedRepositories.length; ++i) {
&gt; &gt; &gt;              var repositoryName = sortedRepositories[i].name;
&gt; &gt; &gt; -            var result = b.revision[repositoryName] - a.revision[repositoryName];
&gt; &gt; &gt; +            var trac = sortedRepositories[i].trac;
&gt; &gt; &gt; +            if (!trac || b.revision[repositoryName] === undefined || a.revision[repositoryName] === undefined)
&gt; &gt; &gt; +                return undefined;
&gt; &gt; &gt; +            var result = trac.compareRevisions(b.revision[repositoryName], a.revision[repositoryName]);
&gt; &gt; &gt;              if (result)
&gt; &gt; &gt;                  return result;
&gt; &gt; &gt;          }
&gt; &gt; 
&gt; &gt; Could compareIterations and compareIterationsByRevisions share this piece of
&gt; &gt; code? It looks identical.
&gt; 
&gt; Yes, both compareIterations and compareIterationsByRevisions are very
&gt; similar. The latter was introduced here:
&gt; https://bugs.webkit.org/show_bug.cgi?id=143885
&gt; 
&gt; We should probably find a way to collapse these into a single function if
&gt; possible so that we are not duplicating code.

I have addressed this in its own patch. Please see the following:
https://bugs.webkit.org/attachment.cgi?id=268503&amp;action=review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153860</commentid>
    <comment_count>17</comment_count>
      <attachid>268424</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-01-08 10:37:31 -0800</bug_when>
    <thetext>Comment on attachment 268424
1. Adding QUnit for unit testing.

Please file a new bug to add QUnit that blocks this bug (bug #152345) unless you plan to address the original purpose of this bug as described in comment #0 in the short term (at most a week).

It is preferred to break a patch into dependent bugs instead of separating a patch into sub-patches associated with the same bug because it makes it keeps each bug focused on exactly change. Among other benefits, using the one patch per bug strategy allows for having a dedicated forum for talking about the patch that may be otherwise hard to follow (or considered noise to some people) when interleaved in a bigger conversation about a bug that has multiple patches. In the rare cases that its reasonable to have one bug with multiple patches (parts) and each part lands as they are written then we tend to format the ChangeLog entry with the same bug title and bug URL for each of these parts and mention in the description portion of the ChangeLog entry for each patch that it represents a part of the bug fix. One such example of this can be seen in the ChangeLog entries in the patches on bug #136516 that landed in &lt;http://trac.webkit.org/changeset/173260&gt; and &lt;http://trac.webkit.org/changeset/173332&gt;, respectively.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153862</commentid>
    <comment_count>18</comment_count>
      <attachid>268425</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-01-08 10:42:28 -0800</bug_when>
    <thetext>Comment on attachment 268425
2. Adding a unit test to test BuildbotQueueView._appendPendingRevisionCount.

Similar to my remarks in comment #17, I suggest that we either file a separate bug for this patch or combine this patch with the patch for adding QUnit (attachment #268424) and file a single bug for both. The benefit of the latter approach is that we directly convey the purpose of adding the QUnit framework as the means for supporting the effort to add a unit test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153885</commentid>
    <comment_count>19</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-08 11:01:41 -0800</bug_when>
    <thetext>I will combine the two patches and file a new bug with them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153899</commentid>
    <comment_count>20</comment_count>
      <attachid>268503</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-01-08 11:18:08 -0800</bug_when>
    <thetext>Comment on attachment 268503
3. Refactor compareIterations to remove duplicate code.

I can see how this patch could be tangentially thought of as &quot;part&quot; of the bug fix assuming you fix up the ChangeLog entry as described in my remark in comment #17. You may want to consider filing a new bug for this part if you do not plan to address the original bug (comment #0) in a timely manner.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153902</commentid>
    <comment_count>21</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-08 11:20:21 -0800</bug_when>
    <thetext>Right, I only addressed it here because multiple people have commented on this section of code in the course of reviewing my original patch. I will do the same as with the QUnit patch: I will file a separate bug with a separate patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153930</commentid>
    <comment_count>22</comment_count>
      <attachid>268424</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-08 11:59:22 -0800</bug_when>
    <thetext>Comment on attachment 268424
1. Adding QUnit for unit testing.

See: https://bugs.webkit.org/show_bug.cgi?id=152910</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153931</commentid>
    <comment_count>23</comment_count>
      <attachid>268425</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-08 12:00:36 -0800</bug_when>
    <thetext>Comment on attachment 268425
2. Adding a unit test to test BuildbotQueueView._appendPendingRevisionCount.

See: https://bugs.webkit.org/show_bug.cgi?id=152910</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153932</commentid>
    <comment_count>24</comment_count>
      <attachid>268503</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-08 12:01:16 -0800</bug_when>
    <thetext>Comment on attachment 268503
3. Refactor compareIterations to remove duplicate code.

See: https://bugs.webkit.org/show_bug.cgi?id=152913</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1161148</commentid>
    <comment_count>25</comment_count>
      <attachid>270457</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-02-01 17:28:36 -0800</bug_when>
    <thetext>Created attachment 270457
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1161807</commentid>
    <comment_count>26</comment_count>
      <attachid>270457</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-02-03 15:22:27 -0800</bug_when>
    <thetext>Comment on attachment 270457
Patch

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

&gt; Tools/ChangeLog:20
&gt; +        (Trac.prototype.commitsOnBranchLaterThanRevision): Finds revisions on a branch great later than the specified revision.

Nit: This sentence does not read well.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:290
&gt; +            indexA = trac.indexOfRevision(a.revision[repositoryName]);

This will define a global variable named indexA. We should make this a local variable as you did for variable trac.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:291
&gt; +            indexB = trac.indexOfRevision(b.revision[repositoryName]);

Ditto.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:73
&gt; +    _commitsOnBranch: function(branchName, filter)
&gt;      {
&gt; +        if (!filter)
&gt; +            filter = function(commit) { return true; };
&gt;          return this.recordedCommits.filter(function(commit, index, array) {
&gt;              return (!commit.containsBranchLocation || commit.branches.includes(branchName)) &amp;&amp; filter(commit, index, array);
&gt;          });
&gt;      },

We always pass a filter to this function and that filter only looks at the index position. So, I suggest we remove the filter argument and have this function take optional begin and end index positions:

_commitsOnBranch(branchName, beginPosition, endPosition)
{
    beginPosition = beginPosition || 0;
    endPosition = endPosition || this.recordedCommits.length - 1;
    let commits = [];
    for (let i = beginPosition; i &lt;= endPosition; ++i) {
        let commit = this.recordedCommits[i]
        if (!commit.containsBranchLocation || commit.branches.includes(branchName))
            commits.push(commit);
    }
    return commits;
},

This will allow us to remove the need to iterate over the entire array of recorded commits once we know either a begin or end position (or both).

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:82
&gt; +        var indexToBeLaterThan = this.indexOfRevision(revision);
&gt; +        function selectCommitsLaterThanRevision(commit, index, allCommits) {
&gt; +            return index &gt; indexToBeLaterThan;
&gt; +        }
&gt; +        var commits = this._commitsOnBranch(branchName, selectCommitsLaterThanRevision.bind(this));
&gt; +        return commits;

Then we can implement this as:

let indexToBeLaterThan = this.indexOfRevision(revision);
console.assert(indexToBeLaterThan !== -1, revision + &quot; is not in the list of recorded commits&quot;);
if (indexToBeLaterThan === -1)
    return [];
return this._commitsOnBranch(branchName, null, indexToBeLaterThan + 1);

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:93
&gt; +        var indexOfFirstRevision = this.indexOfRevision(firstRevision);
&gt; +        var indexOfLastRevision = this.indexOfRevision(lastRevision);
&gt; +        function selectCommitsInRange(commit, index, allCommits) {
&gt; +            return index &gt;= indexOfFirstRevision &amp;&amp; index &lt;= indexOfLastRevision;
&gt; +        }
&gt; +        var commits = this._commitsOnBranch(branchName, selectCommitsInRange.bind(this));
&gt; +        return commits;

And we can implement this as:

let indexOfFirstRevision = this.indexOfRevision(firstRevision);
console.assert(indexOfFirstRevision !== -1, firstRevision + &quot; is not in the list of recorded commits&quot;);
if (indexOfFirstRevision === -1)
    return [];
let indexOfLastRevision = this.indexOfRevision(lastRevision);
console.assert(indexOfLastRevision !== -1, indexOfLastRevision + &quot; is not in the list of recorded commits&quot;);
if (indexOfLastRevision === -1)
    return [];
return this._commitOnBranch(branchName, null, indexOfFirstRevision, indexOfLastRevision);

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Utilities.js:177
&gt; +Array.prototype.indexOfObjectPassingTest = function(predicate)
&gt; +{
&gt; +    for (var i = 0; i &lt; this.length; ++i) {
&gt; +        if (predicate(this[i]))
&gt; +            return i;
&gt; +    }
&gt; +
&gt; +    return -1;
&gt; +};

This function is only used by Trac.indexOfRevision(). Unless you plan to make use of this function in a near future patch, I suggest that we inline the implementation of this function into Trac.indexOfRevision() and remove this function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1161808</commentid>
    <comment_count>27</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-02-03 15:24:35 -0800</bug_when>
    <thetext>(In reply to comment #26)
&gt; &gt; [...]
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:82
&gt; &gt; +        var indexToBeLaterThan = this.indexOfRevision(revision);
&gt; &gt; +        function selectCommitsLaterThanRevision(commit, index, allCommits) {
&gt; &gt; +            return index &gt; indexToBeLaterThan;
&gt; &gt; +        }
&gt; &gt; +        var commits = this._commitsOnBranch(branchName, selectCommitsLaterThanRevision.bind(this));
&gt; &gt; +        return commits;
&gt; 
&gt; Then we can implement this as:
&gt; 
&gt; [...]
&gt; return this._commitsOnBranch(branchName, null, indexToBeLaterThan + 1);

err, I meant to write:

return this._commitsOnBranch(branchName, indexToBeLaterThan + 1);

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:93
&gt; &gt; +        var indexOfFirstRevision = this.indexOfRevision(firstRevision);
&gt; &gt; +        var indexOfLastRevision = this.indexOfRevision(lastRevision);
&gt; &gt; +        function selectCommitsInRange(commit, index, allCommits) {
&gt; &gt; +            return index &gt;= indexOfFirstRevision &amp;&amp; index &lt;= indexOfLastRevision;
&gt; &gt; +        }
&gt; &gt; +        var commits = this._commitsOnBranch(branchName, selectCommitsInRange.bind(this));
&gt; &gt; +        return commits;
&gt; 
&gt; And we can implement this as:
&gt; 
&gt; [...]
&gt; return this._commitOnBranch(branchName, null, indexOfFirstRevision,
&gt; indexOfLastRevision);
&gt; 

err, I meant to write:

return this._commitsOnBranch(branchName, indexOfFirstRevision, indexOfLastRevision);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1161809</commentid>
    <comment_count>28</comment_count>
      <attachid>270457</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-02-03 15:24:58 -0800</bug_when>
    <thetext>Comment on attachment 270457
Patch

I would like to see another iteration of this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1161859</commentid>
    <comment_count>29</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-02-03 17:59:53 -0800</bug_when>
    <thetext>(In reply to comment #26)
&gt; Comment on attachment 270457 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=270457&amp;action=review
&gt; 
&gt; &gt; Tools/ChangeLog:20
&gt; &gt; +        (Trac.prototype.commitsOnBranchLaterThanRevision): Finds revisions on a branch great later than the specified revision.
&gt; 
&gt; Nit: This sentence does not read well.
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:290
&gt; &gt; +            indexA = trac.indexOfRevision(a.revision[repositoryName]);
&gt; 
&gt; This will define a global variable named indexA. We should make this a local
&gt; variable as you did for variable trac.
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:291
&gt; &gt; +            indexB = trac.indexOfRevision(b.revision[repositoryName]);
&gt; 
&gt; Ditto.
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:73
&gt; &gt; +    _commitsOnBranch: function(branchName, filter)
&gt; &gt;      {
&gt; &gt; +        if (!filter)
&gt; &gt; +            filter = function(commit) { return true; };
&gt; &gt;          return this.recordedCommits.filter(function(commit, index, array) {
&gt; &gt;              return (!commit.containsBranchLocation || commit.branches.includes(branchName)) &amp;&amp; filter(commit, index, array);
&gt; &gt;          });
&gt; &gt;      },
&gt; 
&gt; We always pass a filter to this function and that filter only looks at the
&gt; index position. So, I suggest we remove the filter argument and have this
&gt; function take optional begin and end index positions:
&gt; 
&gt; _commitsOnBranch(branchName, beginPosition, endPosition)
&gt; {
&gt;     beginPosition = beginPosition || 0;
&gt;     endPosition = endPosition || this.recordedCommits.length - 1;

What if endPosition is 0? Maybe we should instead do something like:

if (endPosition === undefined)
    endPosition = this.recordedCommits.length - 1;

&gt;     let commits = [];

Why are you using &apos;let&apos; instead of &apos;var&apos;?

&gt;     for (let i = beginPosition; i &lt;= endPosition; ++i) {
&gt;         let commit = this.recordedCommits[i]
&gt;         if (!commit.containsBranchLocation ||
&gt; commit.branches.includes(branchName))
&gt;             commits.push(commit);
&gt;     }
&gt;     return commits;
&gt; },
&gt; 
&gt; This will allow us to remove the need to iterate over the entire array of
&gt; recorded commits once we know either a begin or end position (or both).
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:82
&gt; &gt; +        var indexToBeLaterThan = this.indexOfRevision(revision);
&gt; &gt; +        function selectCommitsLaterThanRevision(commit, index, allCommits) {
&gt; &gt; +            return index &gt; indexToBeLaterThan;
&gt; &gt; +        }
&gt; &gt; +        var commits = this._commitsOnBranch(branchName, selectCommitsLaterThanRevision.bind(this));
&gt; &gt; +        return commits;
&gt; 
&gt; Then we can implement this as:
&gt; 
&gt; let indexToBeLaterThan = this.indexOfRevision(revision);
&gt; console.assert(indexToBeLaterThan !== -1, revision + &quot; is not in the list of
&gt; recorded commits&quot;);
&gt; if (indexToBeLaterThan === -1)
&gt;     return [];
&gt; return this._commitsOnBranch(branchName, null, indexToBeLaterThan + 1);
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:93
&gt; &gt; +        var indexOfFirstRevision = this.indexOfRevision(firstRevision);
&gt; &gt; +        var indexOfLastRevision = this.indexOfRevision(lastRevision);
&gt; &gt; +        function selectCommitsInRange(commit, index, allCommits) {
&gt; &gt; +            return index &gt;= indexOfFirstRevision &amp;&amp; index &lt;= indexOfLastRevision;
&gt; &gt; +        }
&gt; &gt; +        var commits = this._commitsOnBranch(branchName, selectCommitsInRange.bind(this));
&gt; &gt; +        return commits;
&gt; 
&gt; And we can implement this as:
&gt; 
&gt; let indexOfFirstRevision = this.indexOfRevision(firstRevision);
&gt; console.assert(indexOfFirstRevision !== -1, firstRevision + &quot; is not in the
&gt; list of recorded commits&quot;);
&gt; if (indexOfFirstRevision === -1)
&gt;     return [];
&gt; let indexOfLastRevision = this.indexOfRevision(lastRevision);
&gt; console.assert(indexOfLastRevision !== -1, indexOfLastRevision + &quot; is not in
&gt; the list of recorded commits&quot;);
&gt; if (indexOfLastRevision === -1)
&gt;     return [];
&gt; return this._commitOnBranch(branchName, null, indexOfFirstRevision,
&gt; indexOfLastRevision);
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Utilities.js:177
&gt; &gt; +Array.prototype.indexOfObjectPassingTest = function(predicate)
&gt; &gt; +{
&gt; &gt; +    for (var i = 0; i &lt; this.length; ++i) {
&gt; &gt; +        if (predicate(this[i]))
&gt; &gt; +            return i;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    return -1;
&gt; &gt; +};
&gt; 
&gt; This function is only used by Trac.indexOfRevision(). Unless you plan to
&gt; make use of this function in a near future patch, I suggest that we inline
&gt; the implementation of this function into Trac.indexOfRevision() and remove
&gt; this function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1161860</commentid>
    <comment_count>30</comment_count>
      <attachid>270620</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-02-03 18:08:53 -0800</bug_when>
    <thetext>Created attachment 270620
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1162239</commentid>
    <comment_count>31</comment_count>
      <attachid>270705</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-02-04 16:29:24 -0800</bug_when>
    <thetext>Created attachment 270705
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1162243</commentid>
    <comment_count>32</comment_count>
      <attachid>270705</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-02-04 16:45:15 -0800</bug_when>
    <thetext>Comment on attachment 270705
Patch

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

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:171
&gt; +            if (!latestProductiveRevisionNumber || !trac.latestRecordedRevisionNumber || !nextRevision)

trac.nextRevision can potentially return undefined if there isn&apos;t a nextRevision. We need to check for that and continue if that&apos;s the case.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:304
&gt; +        return undefined;

I needed to return undefined here because returning the same commit if no later commits were found is technically inaccurate and was causing a bug. Also, since I am potentially returning undefined, I needed to add a check at the call site for undefined.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:151
&gt; +{

This is a new unit test to check for the case where there are no pending commits.

I&apos;m doing a lot of setup here to explicitly set the state whereas a lot of the other tests in this module rely on the module&apos;s setup function to set the state up. As Dan and I have discussed, it&apos;s probably better to favor this style where we explicitly set the state for each unit tests. I think it would be a good idea to submit a new patch, after landing this one, that makes the other tests in this module match this more explicit style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1162256</commentid>
    <comment_count>33</comment_count>
      <attachid>270708</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-02-04 17:45:25 -0800</bug_when>
    <thetext>Created attachment 270708
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1162516</commentid>
    <comment_count>34</comment_count>
      <attachid>270708</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-02-05 15:20:38 -0800</bug_when>
    <thetext>Comment on attachment 270708
Patch

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

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:292
&gt; +            if (indexA &gt; -1 &amp;&amp; indexB &gt; -1) {

This is OK as-is. I suggest explicitly comparing against -1.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:172
&gt; +            var nextRevision = trac.nextRevision(branch.name, latestProductiveRevisionNumber);
&gt; +            if (!latestProductiveRevisionNumber || !trac.latestRecordedRevisionNumber || !nextRevision)
&gt;                  continue;

This is very minor. I suggest we compute nextRevision and early return (if necessary) after line 171.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:237
&gt;              if (context.firstRevision &lt;= context.lastRevision)

This is incorrect for Git SHAs, which are not numeric.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:96
&gt; +        console.assert(indexOfLastRevision !== -1, indexOfLastRevision + &quot; is not in the list of recorded commits&quot;);

indexOfLastRevision =&gt; lastRevision

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:304
&gt; +        return undefined;

I suggest either returning null or we may want to define a named constant (it could equal null), maybe Trac.NO_MORE_REVISIONS, if we feel this may improve the readability at the call site.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:310
&gt; +        for (var i = 0; i &lt; commits.length; ++i)

Nit: Missing braces. We add braces whenever the body of the control-flow statement is more than one line.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:167
&gt; +        return {
&gt; +            revision: {
&gt; +                &quot;openSource&quot;: 33021
&gt; +            }
&gt; +        };

This is OK as-is. I would have written this as:

var iteration = {
    revision: { &quot;openSource&quot;: 33021 },
};
return iteration;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1162517</commentid>
    <comment_count>35</comment_count>
      <attachid>270708</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-02-05 15:22:21 -0800</bug_when>
    <thetext>Comment on attachment 270708
Patch

r- for the correctness issue in BuildbotQueueView.prototype._revisionContentWithPopoverForIteration().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1162703</commentid>
    <comment_count>36</comment_count>
      <attachid>270813</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-02-06 20:56:15 -0800</bug_when>
    <thetext>Created attachment 270813
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1162917</commentid>
    <comment_count>37</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-02-08 10:38:18 -0800</bug_when>
    <thetext>(In reply to comment #34)
&gt; Comment on attachment 270708 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=270708&amp;action=review
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueue.js:292
&gt; &gt; +            if (indexA &gt; -1 &amp;&amp; indexB &gt; -1) {
&gt; 
&gt; This is OK as-is. I suggest explicitly comparing against -1.

Done.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:172
&gt; &gt; +            var nextRevision = trac.nextRevision(branch.name, latestProductiveRevisionNumber);
&gt; &gt; +            if (!latestProductiveRevisionNumber || !trac.latestRecordedRevisionNumber || !nextRevision)
&gt; &gt;                  continue;
&gt; 
&gt; This is very minor. I suggest we compute nextRevision and early return (if
&gt; necessary) after line 171.

Done.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:237
&gt; &gt;              if (context.firstRevision &lt;= context.lastRevision)
&gt; 
&gt; This is incorrect for Git SHAs, which are not numeric.

I addressed this.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:96
&gt; &gt; +        console.assert(indexOfLastRevision !== -1, indexOfLastRevision + &quot; is not in the list of recorded commits&quot;);
&gt; 
&gt; indexOfLastRevision =&gt; lastRevision
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:304
&gt; &gt; +        return undefined;
&gt; 
&gt; I suggest either returning null or we may want to define a named constant
&gt; (it could equal null), maybe Trac.NO_MORE_REVISIONS, if we feel this may
&gt; improve the readability at the call site.

I went with Tac.NO_MORE_REVISIONS and defined it as &apos;null&apos;.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Trac.js:310
&gt; &gt; +        for (var i = 0; i &lt; commits.length; ++i)
&gt; 
&gt; Nit: Missing braces. We add braces whenever the body of the control-flow
&gt; statement is more than one line.

Fixed.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:167
&gt; &gt; +        return {
&gt; &gt; +            revision: {
&gt; &gt; +                &quot;openSource&quot;: 33021
&gt; &gt; +            }
&gt; &gt; +        };
&gt; 
&gt; This is OK as-is. I would have written this as:
&gt; 
&gt; var iteration = {
&gt;     revision: { &quot;openSource&quot;: 33021 },
&gt; };
&gt; return iteration;

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1163656</commentid>
    <comment_count>38</comment_count>
      <attachid>270813</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-02-10 16:13:50 -0800</bug_when>
    <thetext>Comment on attachment 270813
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1163664</commentid>
    <comment_count>39</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-02-10 16:30:29 -0800</bug_when>
    <thetext>Dan, thank you for all of your help and for your review!

Landed: http://trac.webkit.org/changeset/196402</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>267470</attachid>
            <date>2015-12-16 10:58:47 -0800</date>
            <delta_ts>2015-12-16 14:30:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152345-20151216105809.patch</filename>
            <type>text/plain</type>
            <size>27811</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0MTQ2CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggMjcxMGI4YWYwODRjZTg1MGU2ODEwZTlhMDg3MjJkMjVj
NzAzYTc4Ni4uYzAwNThjY2FhMmQxMDhiMjc1MGNhZTY0ZGY4NzlmNjdiZDJkOWFiOSAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU5
IEBACisyMDE1LTEyLTE2ICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgorCisg
ICAgICAgIFRlYWNoIGRhc2hib2FyZCBjb2RlIHRvIGNvbXBhcmUgbm9uLWludGVnZXIgcmV2aXNp
b25zLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUy
MzQ1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBC
dWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNo
Ym9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1ZXVlLmpzOgorICAgICAgICAoQnVpbGRib3RRdWV1ZS5w
cm90b3R5cGUuY29tcGFyZUl0ZXJhdGlvbnMpOiBDb21wYXJlIG5vbi1pbnRlZ2VyIHJldmlzaW9u
cy4KKyAgICAgICAgKEJ1aWxkYm90UXVldWUucHJvdG90eXBlLmNvbXBhcmVJdGVyYXRpb25zQnlS
ZXZpc2lvbnMpOiBEaXR0by4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJr
aXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1ZXVl
Vmlldy5qczoKKyAgICAgICAgKEJ1aWxkYm90UXVldWVWaWV3KTogRXhpdCBjb25zdHJ1Y3RvciBl
YXJseSBpZiB3ZSBhcmUgdW5pdCB0ZXN0aW5nLgorICAgICAgICAoQnVpbGRib3RRdWV1ZVZpZXcu
cHJvdG90eXBlLl9hcHBlbmRQZW5kaW5nUmV2aXNpb25Db3VudCk6IFVzZSBUcmFjLmNvbXBhcmVS
ZXZpc2lvbnMgaW4gb3JkZXIgdG8gY29tcGFyZSBub24taW50ZWdlciByZXZpc2lvbnMuCisgICAg
ICAgIFdlIGFsc28gdXNlIHRoZSBmdWxsIGZvcm0gb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdp
dGggQXJyYXkuZmlsdGVyKCkgY29tYmluZWQgd2l0aCBBcnJheS5vYmplY3RJbmRleE9mIGluIG9y
ZGVyIHRvIGNvbXBhcmUKKyAgICAgICAgYXJyYXkgaW5kaWNlcyBpbnN0ZWFkIG9mIGludGVnZXIg
cmV2aXNpb24gbnVtYmVycy4gV2UgYWxzbyBleGl0IHRoZSBmdW5jdGlvbiBlYXJseSB0byBhdm9p
ZCBlcnJvcnMgd2hlbiB1bml0IHRlc3RpbmcuCisgICAgICAgIChCdWlsZGJvdFF1ZXVlVmlldy5w
cm90b3R5cGUuX3BvcG92ZXJMaW5lc0ZvckNvbW1pdFJhbmdlKTogVXNlIFRyYWMuY29tcGFyZVJl
dmlzaW9ucyBpbiBvcmRlciB0byBjb21wYXJlIG5vbi1pbnRlZ2VyIHJldmlzaW9ucy4KKyAgICAg
ICAgV2UgYWxzbyB1c2UgdGhlIGZ1bGwgZm9ybSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0
aCBBcnJheS5maWx0ZXIoKSBjb21iaW5lZCB3aXRoIEFycmF5Lm9iamVjdEluZGV4T2YgaW4gb3Jk
ZXIgdG8gY29tcGFyZQorICAgICAgICBhcnJheSBpbmRpY2VzIGluc3RlYWQgb2YgaW50ZWdlciBy
ZXZpc2lvbiBudW1iZXJzLgorICAgICAgICAoQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLl9w
cmVzZW50UG9wb3ZlckZvclBlbmRpbmdDb21taXRzKTogVXNlIFRyYWMubmV4dFJldmlzaW9uIGlu
c3RlYWQgb2YgaW5jcmVtZW50aW5nIGFuCisgICAgICAgIGludGVnZXIuCisgICAgICAgIChCdWls
ZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUuX3JldmlzaW9uQ29udGVudFdpdGhQb3BvdmVyRm9ySXRl
cmF0aW9uKTogRGl0dG8uCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0
Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvUXVldWVWaWV3LmpzOgor
ICAgICAgICAoUXVldWVWaWV3KTogRXhpdCB0aGUgY29uc3RydWN0b3IgZWFybHkgdG8gYXZvaWQg
ZXJyb3JzIHdoZW4gdW5pdCB0ZXN0aW5nLgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1
aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1RyYWMu
anM6CisgICAgICAgIChUcmFjLnByb3RvdHlwZS5jb21taXRzT25CcmFuY2gpOiBVc2UgdGhlIGZ1
bGwgZm9ybSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBBcnJheS5maWx0ZXIoKSBjb21i
aW5lZCB3aXRoCisgICAgICAgIEFycmF5Lm9iamVjdEluZGV4T2YgaW4gb3JkZXIgdG8gY29tcGFy
ZSBhcnJheSBpbmRpY2VzIGluc3RlYWQgb2YgaW50ZWdlciByZXZpc2lvbiBudW1iZXJzLgorICAg
ICAgICAoVHJhYy5wcm90b3R5cGUuX3BhcnNlUmV2aXNpb25Gcm9tVVJMKTogQWRkZWQuIEJyb2tl
IHRoaXMgb3V0IGludG8gaXRzIG93biBmdW5jdGlvbiBpbiBvcmRlciB0byB1bml0IHRlc3QgbW9y
ZSBlYXNpbHkuCisgICAgICAgIEFsc28gcmVtb3ZlZCB0aGUgY2FsbCB0byBwYXJzZUludCBpbiBh
bnRpY2lwYXRpb24gb2Ygbm9uLWludGVnZXIgcmV2aXNpb25zLgorICAgICAgICAoVHJhYy5wcm90
b3R5cGUuX2xvYWRlZCk6IFNvcnQgYnkgZGF0ZSBhZnRlciBuZXcgY29tbWl0cyBhcmUgYWRkZWQg
c2luY2Ugd2UgY2FuIG5vIGxvbmdlciBzb3J0IGJ5IHJldmlzaW9uIG51bWJlcnMuCisgICAgICAg
IChUcmFjLnByb3RvdHlwZS5jb21wYXJlUmV2aXNpb25zKTogQWRkZWQuIEdpdmVuIHR3byByZXZp
c2lvbnMgd2UgY29tcGFyZSB0aGVpciBpbmRpY2VzIHdpdGhpbiB0aGUgInJlY29yZGVkQ29tbWl0
cyIgYXJyYXkuCisgICAgICAgIElmIGVpdGhlciByZXZpc2lvbiBpcyBub3QgZm91bmQgaW4gdGhl
ICJyZWNvcmRlZENvbW1pdHMiIGFycmF5LCB3ZSByZXR1cm4gdW5kZWZpbmVkIGFuZCBsb2FkIG1v
cmUgaGlzdG9yaWNhbCBkYXRhLgorICAgICAgICAoVHJhYy5wcm90b3R5cGUubmV4dFJldmlzaW9u
KTogQWRkZWQuIEdpdmVuIGEgYnJhbmNoIGFuZCByZXZpc2lvbiwgd2UgZmluZCB0aGUgbmV4dCBy
ZXZpc2lvbiBjaHJvbm9sb2dpY2FsbHkuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVp
bGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVXRpbGl0
aWVzLmpzOgorICAgICAgICAoQXJyYXkucHJvdG90eXBlLm9iamVjdEluZGV4T2YpOiBBZGRlZC4g
RmluZHMgYW4gb2JqZWN0LCBpbiBhbiBhcnJheSBvZiBvYmplY3RzLCB3aGVyZSB0aGUgc2VhcmNo
IHRlcm0gbWF0Y2hlcyB0aGUgZ2l2ZW4KKyAgICAgICAgcHJvcGVydHkuCisgICAgICAgICogQnVp
bGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJv
YXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWUuanM6IEFkZGVkLgorICAgICAgICAo
TW9ja0J1aWxkYm90UXVldWUpOiBBZGRlZC4gTW9jayBCdWlsZGJvdFF1ZXVlIG9iamVjdCB0aGF0
IGRvZXNuJ3QgbmVlZCB0byB0YWxrIHRvIGFuIGFjdHVhbCBCdWlsZGJvdCBzZXJ2ZXIuCisgICAg
ICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0
bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWVWaWV3LmpzOiBBZGRl
ZC4KKyAgICAgICAgKE1vY2tCdWlsZGJvdFF1ZXVlVmlldyk6IEFkZGVkLiBNb2NrIEJ1aWxkYm90
UXVldWVWaWV3IG9iamVjdCB0aGF0IHJldHVybnMgYSBwcmUtc3BlY2lmaWVkIF9sYXRlc3RQcm9k
dWN0aXZlSXRlcmF0aW9uIHdpdGhvdXQKKyAgICAgICAgdGhlIG5lZWQgdG8gdGFsayB0byBhIHJl
YWwgQnVpbGRib3Qgc2VydmVyLgorICAgICAgICAoTW9ja0J1aWxkYm90UXVldWVWaWV3LnByb3Rv
dHlwZS5fbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbik6IEFkZGVkLiBSZXR1cm5zIGEgcHJlLXNw
ZWNpZmllZCBfbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbgorICAgICAgICB3aXRob3V0IHRoZSBu
ZWVkIHRvIHRhbGsgdG8gYSByZWFsIEJ1aWxkYm90IHNlcnZlci4KKyAgICAgICAgKiBCdWlsZFNs
YXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQv
U2NyaXB0cy90ZXN0cy9Nb2NrT3ZlcnJpZGVzLmpzOiBBZGRlZC4KKyAgICAgICAgKHNldCBsYWJl
bCk6IEFkZGVkLiBUaGUgcmVhbCAibGFiZWwiIHNldHRlciB3YXMgdGhyb3dpbmcgYW4gZXhjZXB0
aW9uIGluIHRoZSB1bml0IHRlc3RzIHNvIEkgb3ZlcnJvZGUgaXQgd2l0aCBhIHNpbXBsaWZpZWQK
KyAgICAgICAgdmVyc2lvbi4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJr
aXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrVHJh
Yy5qczogQWRkZWQuCisgICAgICAgIChNb2NrVHJhYyk6IEFkZGVkLiBNb2NrIFRyYWMgY29uc3Ry
dWN0b3IgdGhhdCBoYXMgcHJlLXBvcHVsYXRlZCAicmVjb3JkZWRDb21taXRzIiBhbmQgZG9lcyBu
b3QgbmVlZCB0byB0YWxrIHRvIGEgcmVhbCBUcmFjCisgICAgICAgIHNlcnZlci4KKyAgICAgICAg
KE1vY2tUcmFjLnByb3RvdHlwZS5nZXQgb2xkZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlcik6IEFk
ZGVkLiBSZXR1cm5zIGEgcHJlLXNwZWNpZmllZCByZXZpc2lvbi4KKyAgICAgICAgKE1vY2tUcmFj
LnByb3RvdHlwZS5nZXQgbGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlcik6IERpdHRvLgorICAg
ICAgICAoTW9ja1RyYWMucHJvdG90eXBlLmxvYWRNb3JlSGlzdG9yaWNhbERhdGEpOiBBZGRlZC4g
T3ZlcnJpZGVzIHRoZSByZWFsIGxvYWRNb3JlSGlzdG9yaWNhbERhdGEgc28gdGhhdCB3ZSBkb24n
dCB3YXN0ZSB0aW1lCisgICAgICAgIHRyeWluZyB0byB0YWxrIHRvIFRyYWMuCisgICAgICAgICog
QnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFz
aGJvYXJkL1NjcmlwdHMvdGVzdHMvaW5kZXguaHRtbDogQWRkZWQuIFdlYiBwYWdlIGNvbnRhaW5l
ciBmb3IKKyAgICAgICAgUVVuaXQgdW5pdCB0ZXN0cy4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3Vw
cG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0
cy90ZXN0cy90ZXN0cy5qczogQWRkZWQuIFFVbml0IHVuaXQgdGVzdHMuCisKIDIwMTUtMTItMTYg
IFlvdWVubiBGYWJsZXQgIDx5b3Vlbm4uZmFibGV0QGNyZi5jYW5vbi5mcj4KIAogICAgICAgICBF
bmZvcmNlIHRlbXBvcmFyaWx5IGJvdHMgdG8gc3luYyBXZWJLaXQgYW5kIFdQVCB0ZXN0aGFybmVz
cy5qcwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZS5qcyBi
L1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19o
dG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanMKaW5kZXggZTRhOTk1MTFmODk5
MmI3NDhlZTg4MGYzMDA1NzM2ZDg2ZDJhZGRhOC4uYzVjOTMwZmE3NGMyZjkwMzQ2MWIxN2I4ZDJl
ODA5MmU3NDZiNWVkMCAxMDA2NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RR
dWV1ZS5qcworKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNv
bmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1ZXVlLmpzCkBAIC0y
NzEsNyArMjcxLDEwIEBAIEJ1aWxkYm90UXVldWUucHJvdG90eXBlID0gewogICAgICAgICB2YXIg
c29ydGVkUmVwb3NpdG9yaWVzID0gRGFzaGJvYXJkLnNvcnRlZFJlcG9zaXRvcmllczsKICAgICAg
ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWRSZXBvc2l0b3JpZXMubGVuZ3RoOyArK2kpIHsK
ICAgICAgICAgICAgIHZhciByZXBvc2l0b3J5TmFtZSA9IHNvcnRlZFJlcG9zaXRvcmllc1tpXS5u
YW1lOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGIucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVd
IC0gYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV07CisgICAgICAgICAgICB2YXIgdHJhYyA9IHNv
cnRlZFJlcG9zaXRvcmllc1tpXS50cmFjOworICAgICAgICAgICAgaWYgKCF0cmFjIHx8IGIucmV2
aXNpb25bcmVwb3NpdG9yeU5hbWVdID09PSB1bmRlZmluZWQgfHwgYS5yZXZpc2lvbltyZXBvc2l0
b3J5TmFtZV0gPT09IHVuZGVmaW5lZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVk
OworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyYWMuY29tcGFyZVJldmlzaW9ucyhiLnJldmlz
aW9uW3JlcG9zaXRvcnlOYW1lXSwgYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0pOwogICAgICAg
ICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAg
ICB9CkBAIC0yODksNyArMjkyLDEwIEBAIEJ1aWxkYm90UXVldWUucHJvdG90eXBlID0gewogICAg
ICAgICB2YXIgc29ydGVkUmVwb3NpdG9yaWVzID0gRGFzaGJvYXJkLnNvcnRlZFJlcG9zaXRvcmll
czsKICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWRSZXBvc2l0b3JpZXMubGVuZ3Ro
OyArK2kpIHsKICAgICAgICAgICAgIHZhciByZXBvc2l0b3J5TmFtZSA9IHNvcnRlZFJlcG9zaXRv
cmllc1tpXS5uYW1lOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGIucmV2aXNpb25bcmVwb3Np
dG9yeU5hbWVdIC0gYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV07CisgICAgICAgICAgICB2YXIg
dHJhYyA9IHNvcnRlZFJlcG9zaXRvcmllc1tpXS50cmFjOworICAgICAgICAgICAgaWYgKCF0cmFj
IHx8IGIucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdID09PSB1bmRlZmluZWQgfHwgYS5yZXZpc2lv
bltyZXBvc2l0b3J5TmFtZV0gPT09IHVuZGVmaW5lZCkKKyAgICAgICAgICAgICAgICByZXR1cm4g
dW5kZWZpbmVkOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyYWMuY29tcGFyZVJldmlzaW9u
cyhiLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSwgYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0p
OwogICAgICAgICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0
OwogICAgICAgICB9CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1
ZXVlVmlldy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29u
ZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWVWaWV3LmpzCmlu
ZGV4IDkyNjdmNDlkYTc1NzJkMDQzZDNiOTY5Yjk0N2RmODA5MjViMTdlMzguLjc4MTRmOTY5OTk4
M2MwZjUxMDdkMTQzNWI3YWFhNWQ0NDFlYjkzYjEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0J1aWxkU2xh
dmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9T
Y3JpcHRzL0J1aWxkYm90UXVldWVWaWV3LmpzCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0
L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1
aWxkYm90UXVldWVWaWV3LmpzCkBAIC0yOSw2ICsyOSw5IEBAIEJ1aWxkYm90UXVldWVWaWV3ID0g
ZnVuY3Rpb24ocXVldWVzKQogCiAgICAgdGhpcy5xdWV1ZXMgPSBxdWV1ZXMgfHwgW107CiAKKyAg
ICBpZiAoc2V0dGluZ3MuZ2V0T2JqZWN0KCJNb2NrIikpCisgICAgICAgIHJldHVybjsKKwogICAg
IHRoaXMucXVldWVzLmZvckVhY2goZnVuY3Rpb24ocXVldWUpIHsKICAgICAgICAgaWYgKHRoaXMu
cGxhdGZvcm0gJiYgdGhpcy5wbGF0Zm9ybSAhPSBxdWV1ZS5wbGF0Zm9ybSkKICAgICAgICAgICAg
IHRocm93ICJBIGJ1aWxkYm90IHZpZXcgbWF5IG5vdCBjb250YWluIHF1ZXVlcyBmb3IgbXVsdGlw
bGUgcGxhdGZvcm1zLiIKQEAgLTkxLDEyICs5NCwxMyBAQCBCdWlsZGJvdFF1ZXVlVmlldy5wcm90
b3R5cGUgPSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICBpZiAoIXRy
YWMpCiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoIXRyYWMubGF0
ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlciB8fCB0cmFjLm9sZGVzdFJlY29yZGVkUmV2aXNpb25O
dW1iZXIgPiBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIpIHsKKyAgICAgICAgICAgIGNv
bXBhcmlzb24gPSB0cmFjLmNvbXBhcmVSZXZpc2lvbnModHJhYy5vbGRlc3RSZWNvcmRlZFJldmlz
aW9uTnVtYmVyLCBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIpOworICAgICAgICAgICAg
aWYgKCF0cmFjLmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIgfHwgY29tcGFyaXNvbiA9PT0g
dW5kZWZpbmVkIHx8IGNvbXBhcmlzb24gPiAwKSB7CiAgICAgICAgICAgICAgICAgdHJhYy5sb2Fk
TW9yZUhpc3RvcmljYWxEYXRhKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAg
ICAgfQogCi0gICAgICAgICAgICB0b3RhbFJldmlzaW9uc0JlaGluZCArPSB0cmFjLmNvbW1pdHNP
bkJyYW5jaChicmFuY2gubmFtZSwgZnVuY3Rpb24oY29tbWl0KSB7IHJldHVybiBjb21taXQucmV2
aXNpb25OdW1iZXIgPiBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXI7IH0pLmxlbmd0aDsK
KyAgICAgICAgICAgIHRvdGFsUmV2aXNpb25zQmVoaW5kICs9IHRyYWMuY29tbWl0c09uQnJhbmNo
KGJyYW5jaC5uYW1lLCBmdW5jdGlvbihjb21taXQsIGluZGV4LCBhcnIpIHsgcmV0dXJuIGluZGV4
ID4gYXJyLm9iamVjdEluZGV4T2YobGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyLCAicmV2
aXNpb25OdW1iZXIiKTsgfSkubGVuZ3RoOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCF0b3Rh
bFJldmlzaW9uc0JlaGluZCkKQEAgLTEwNyw2ICsxMTEsOSBAQCBCdWlsZGJvdFF1ZXVlVmlldy5w
cm90b3R5cGUgPSB7CiAgICAgICAgIHZhciBzdGF0dXMgPSBuZXcgU3RhdHVzTGluZVZpZXcobWVz
c2FnZUVsZW1lbnQsIFN0YXR1c0xpbmVWaWV3LlN0YXR1cy5Ob0J1YmJsZSk7CiAgICAgICAgIHRo
aXMuZWxlbWVudC5hcHBlbmRDaGlsZChzdGF0dXMuZWxlbWVudCk7CiAKKyAgICAgICAgaWYgKHNl
dHRpbmdzLmdldE9iamVjdCgiTW9jayIpKQorICAgICAgICAgICAgcmV0dXJuOworCiAgICAgICAg
IG5ldyBQb3BvdmVyVHJhY2tlcihtZXNzYWdlRWxlbWVudCwgdGhpcy5fcHJlc2VudFBvcG92ZXJG
b3JQZW5kaW5nQ29tbWl0cy5iaW5kKHRoaXMpLCBxdWV1ZSk7CiAgICAgfSwKIApAQCAtMTM3LDEx
ICsxNDQsMTEgQEAgQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlID0gewogICAgICAgICAgICAg
cmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnNvbGUuYXNzZXJ0KHRyYWMu
b2xkZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlciA8PSBmaXJzdFJldmlzaW9uTnVtYmVyKTsKKyAg
ICAgICAgY29uc29sZS5hc3NlcnQodHJhYy5jb21wYXJlUmV2aXNpb25zKHRyYWMub2xkZXN0UmVj
b3JkZWRSZXZpc2lvbk51bWJlciwgZmlyc3RSZXZpc2lvbk51bWJlcikgPD0gMCk7CiAKICAgICAg
ICAgLy8gRklYTUU6IFRvIGJlIDEwMCUgY29ycmVjdCwgd2Ugc2hvdWxkIGFsc28gZmlsdGVyIG91
dCBjaGFuZ2VzIHRoYXQgYXJlIGlnbm9yZWQgYnkKICAgICAgICAgLy8gdGhlIHF1ZXVlLCBzZWUg
X3Nob3VsZF9maWxlX3RyaWdnZXJfYnVpbGQgaW4gd2tidWlsZC5weS4KLSAgICAgICAgdmFyIGNv
bW1pdHMgPSB0cmFjLmNvbW1pdHNPbkJyYW5jaChicmFuY2gsIGZ1bmN0aW9uKGNvbW1pdCkgeyBy
ZXR1cm4gY29tbWl0LnJldmlzaW9uTnVtYmVyID49IGZpcnN0UmV2aXNpb25OdW1iZXIgJiYgY29t
bWl0LnJldmlzaW9uTnVtYmVyIDw9IGxhc3RSZXZpc2lvbk51bWJlcjsgfSk7CisgICAgICAgIHZh
ciBjb21taXRzID0gdHJhYy5jb21taXRzT25CcmFuY2goYnJhbmNoLm5hbWUsIGZ1bmN0aW9uKGNv
bW1pdCwgaW5kZXgsIGFycikgeyByZXR1cm4gaW5kZXggPj0gYXJyLm9iamVjdEluZGV4T2YoZmly
c3RSZXZpc2lvbk51bWJlciwgInJldmlzaW9uTnVtYmVyIikgJiYgaW5kZXggPD0gYXJyLm9iamVj
dEluZGV4T2YobGFzdFJldmlzaW9uTnVtYmVyLCAicmV2aXNpb25OdW1iZXIiKTsgfSk7CiAgICAg
ICAgIHJldHVybiBjb21taXRzLm1hcChmdW5jdGlvbihjb21taXQpIHsKICAgICAgICAgICAgIHJl
dHVybiBsaW5lRm9yQ29tbWl0KHRyYWMsIGNvbW1pdCk7CiAgICAgICAgIH0sIHRoaXMpLnJldmVy
c2UoKTsKQEAgLTE2Niw3ICsxNzMsNyBAQCBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUgPSB7
CiAgICAgICAgICAgICB2YXIgbGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyID0gbGF0ZXN0
UHJvZHVjdGl2ZUl0ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV07CiAgICAgICAgICAg
ICBpZiAoIWxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlciB8fCAhdHJhYy5sYXRlc3RSZWNv
cmRlZFJldmlzaW9uTnVtYmVyKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgdmFyIGxpbmVzID0gdGhpcy5fcG9wb3ZlckxpbmVzRm9yQ29tbWl0UmFuZ2UodHJhYywgYnJh
bmNoLm5hbWUsIGxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlciArIDEsIHRyYWMubGF0ZXN0
UmVjb3JkZWRSZXZpc2lvbk51bWJlcik7CisgICAgICAgICAgICB2YXIgbGluZXMgPSB0aGlzLl9w
b3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSh0cmFjLCBicmFuY2gsIHRyYWMubmV4dFJldmlzaW9u
KGJyYW5jaC5uYW1lLCBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIpLCB0cmFjLmxhdGVz
dFJlY29yZGVkUmV2aXNpb25OdW1iZXIpOwogICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGxpbmVz
Lmxlbmd0aDsKICAgICAgICAgICAgIGlmIChsZW5ndGggJiYgc2hvdWxkQWRkRGl2aWRlcikKICAg
ICAgICAgICAgICAgICB0aGlzLl9hZGREaXZpZGVyVG9Qb3BvdmVyKGNvbnRlbnQpOwpAQCAtMjMz
LDcgKzI0MCw3IEBAIEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsKICAgICAgICAgICAg
IHZhciBjb250ZXh0ID0gewogICAgICAgICAgICAgICAgIHRyYWM6IHJlcG9zaXRvcnkudHJhYywK
ICAgICAgICAgICAgICAgICBicmFuY2g6IGJyYW5jaC5uYW1lLAotICAgICAgICAgICAgICAgIGZp
cnN0UmV2aXNpb246IHByZXZpb3VzSXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSAr
IDEsCisgICAgICAgICAgICAgICAgZmlyc3RSZXZpc2lvbjogcmVwb3NpdG9yeS50cmFjLm5leHRS
ZXZpc2lvbihicmFuY2gubmFtZSwgcHJldmlvdXNJdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9y
eU5hbWVdKSwKICAgICAgICAgICAgICAgICBsYXN0UmV2aXNpb246IGl0ZXJhdGlvbi5yZXZpc2lv
bltyZXBvc2l0b3J5TmFtZV0KICAgICAgICAgICAgIH07CiAgICAgICAgICAgICBpZiAoY29udGV4
dC5maXJzdFJldmlzaW9uIDw9IGNvbnRleHQubGFzdFJldmlzaW9uKQpkaWZmIC0tZ2l0IGEvVG9v
bHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwv
ZGFzaGJvYXJkL1NjcmlwdHMvUXVldWVWaWV3LmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQv
YnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvUXVl
dWVWaWV3LmpzCmluZGV4IGI3MTk0YWEyMDIwOGQ4ZDM5ZGFkNmRiMDExMjI5MzVkZGY0MGYzYWIu
LjFiYTliOGJmNmFhNjQ1YWFlN2Y3N2IyZTkzNmViOWRhMjRhM2NiMjMgMTAwNjQ0Ci0tLSBhL1Rv
b2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1s
L2Rhc2hib2FyZC9TY3JpcHRzL1F1ZXVlVmlldy5qcworKysgYi9Ub29scy9CdWlsZFNsYXZlU3Vw
cG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0
cy9RdWV1ZVZpZXcuanMKQEAgLTMxLDYgKzMxLDkgQEAgUXVldWVWaWV3ID0gZnVuY3Rpb24oKQog
ICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJxdWV1ZS12aWV3Iik7CiAgICAgdGhpcy5l
bGVtZW50Ll9fcXVldWVWaWV3ID0gdGhpczsKIAorICAgIGlmIChzZXR0aW5ncy5nZXRPYmplY3Qo
Ik1vY2siKSkKKyAgICAgICAgcmV0dXJuOworCiAgICAgdGhpcy51cGRhdGVUaW1lciA9IG51bGw7
CiAgICAgc2V0VGltZW91dCh0aGlzLl91cGRhdGVIaWRkZW5TdGF0ZS5iaW5kKHRoaXMpLCAwKTsg
Ly8gTGV0cyBzdWJjbGFzcyBjb25zdHJ1Y3RvciBmaW5pc2ggYmVmb3JlIGNhbGxpbmcgX3VwZGF0
ZUhpZGRlblN0YXRlLgogICAgIHNldHRpbmdzLmFkZFNldHRpbmdMaXN0ZW5lcigiaGlkZGVuUGxh
dGZvcm1GYW1pbGllcyIsIHRoaXMuX3VwZGF0ZUhpZGRlblN0YXRlLmJpbmQodGhpcykpOwpkaWZm
IC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVHJhYy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVT
dXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3Jp
cHRzL1RyYWMuanMKaW5kZXggYTFkZDI4ZmEyNzUwZWMyOTMzY2I4YmZlYThkYzA0NWMzYTE1MjZj
Yi4uNmVhNmFjZjAyZGQ4YjZjZDI4OTU4YjdjZjNjMzA2MjQ0NTNhYjRjNiAxMDA2NDQKLS0tIGEv
VG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0
bWwvZGFzaGJvYXJkL1NjcmlwdHMvVHJhYy5qcworKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9y
dC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9U
cmFjLmpzCkBAIC02NSw4ICs2NSw4IEBAIFRyYWMucHJvdG90eXBlID0gewogCiAgICAgY29tbWl0
c09uQnJhbmNoOiBmdW5jdGlvbihicmFuY2gsIGZpbHRlcikKICAgICB7Ci0gICAgICAgIHJldHVy
biB0aGlzLnJlY29yZGVkQ29tbWl0cy5maWx0ZXIoZnVuY3Rpb24oY29tbWl0KSB7Ci0gICAgICAg
ICAgICByZXR1cm4gKCFjb21taXQuY29udGFpbnNCcmFuY2hMb2NhdGlvbiB8fCBjb21taXQuYnJh
bmNoID09PSBicmFuY2gpICYmIGZpbHRlcihjb21taXQpOworICAgICAgICByZXR1cm4gdGhpcy5y
ZWNvcmRlZENvbW1pdHMuZmlsdGVyKGZ1bmN0aW9uKGNvbW1pdCwgaW5kZXgsIGFycikgeworICAg
ICAgICAgICAgcmV0dXJuICghY29tbWl0LmNvbnRhaW5zQnJhbmNoTG9jYXRpb24gfHwgY29tbWl0
LmJyYW5jaCA9PT0gYnJhbmNoKSAmJiBmaWx0ZXIoY29tbWl0LCBpbmRleCwgYXJyKTsKICAgICAg
ICAgfSk7CiAgICAgfSwKIApAQCAtODcsMTcgKzg3LDE5IEBAIFRyYWMucHJvdG90eXBlID0gewog
ICAgICAgICAgICAgIiZkYXlzYmFjaz0iICsgKCh0b0RheSAtIGZyb21EYXkpIC8gMTAwMCAvIDYw
IC8gNjAgLyAyNCk7CiAgICAgfSwKIAotICAgIF9jb252ZXJ0Q29tbWl0SW5mb0VsZW1lbnRUb09i
amVjdDogZnVuY3Rpb24oZG9jLCBjb21taXRFbGVtZW50KQorICAgIF9wYXJzZVJldmlzaW9uRnJv
bVVSTDogZnVuY3Rpb24odXJsKQogICAgIHsKLSAgICAgICAgdmFyIGxpbmsgPSBkb2MuZXZhbHVh
dGUoIi4vbGluayIsIGNvbW1pdEVsZW1lbnQsIG51bGwsIFhQYXRoUmVzdWx0LlNUUklOR19UWVBF
KS5zdHJpbmdWYWx1ZTsKLQogICAgICAgICAvLyBUaGVyZSBhcmUgbXVsdGlwbGUgbGluayBmb3Jt
YXRzIGZvciBUcmFjIHRoYXQgd2Ugc3VwcG9ydDoKICAgICAgICAgLy8gaHR0cHM6Ly90cmFjLndl
YmtpdC5vcmcvY2hhbmdlc2V0LzE5MDQ5NwogICAgICAgICAvLyBodHRwOi8vdHJhYy5mb29iYXIu
Y29tL3JlcG9zaXRvcnkvY2hhbmdlc2V0Lzc1Mzg4L3Byb2plY3QKLSAgICAgICAgdmFyIGxpbmtD
b21wb25lbnRzID0gbGluay5zcGxpdCgiLyIpOwotICAgICAgICB2YXIgcmV2aXNpb25OdW1iZXIg
PSBwYXJzZUludChsaW5rQ29tcG9uZW50cy5wb3AoKSk7Ci0gICAgICAgIGlmICghcmV2aXNpb25O
dW1iZXIpCi0gICAgICAgICAgICB2YXIgcmV2aXNpb25OdW1iZXIgPSBwYXJzZUludChsaW5rQ29t
cG9uZW50cy5wb3AoKSk7CisgICAgICAgIC8vIGh0dHBzOi8vZ2l0LmZvb2Jhci5jb20vdHJhYy9X
aGF0ZXZlci5naXQvY2hhbmdlc2V0LzBlNDk4ZGI1ZDhlNWI1YTM0MjYzMQorICAgICAgICByZXR1
cm4gL2NoYW5nZXNldFwvKFthLWYwLTldKykuKiQvLmV4ZWModXJsKVsxXTsKKyAgICB9LAorCisg
ICAgX2NvbnZlcnRDb21taXRJbmZvRWxlbWVudFRvT2JqZWN0OiBmdW5jdGlvbihkb2MsIGNvbW1p
dEVsZW1lbnQpCisgICAgeworICAgICAgICB2YXIgbGluayA9IGRvYy5ldmFsdWF0ZSgiLi9saW5r
IiwgY29tbWl0RWxlbWVudCwgbnVsbCwgWFBhdGhSZXN1bHQuU1RSSU5HX1RZUEUpLnN0cmluZ1Zh
bHVlOworICAgICAgICB2YXIgcmV2aXNpb25OdW1iZXIgPSB0aGlzLl9wYXJzZVJldmlzaW9uRnJv
bVVSTChsaW5rKTsKIAogICAgICAgICBmdW5jdGlvbiB0cmFjTlNSZXNvbHZlcihwcmVmaXgpCiAg
ICAgICAgIHsKQEAgLTE5NSw3ICsxOTcsNyBAQCBUcmFjLnByb3RvdHlwZSA9IHsKICAgICAgICAg
fQogCiAgICAgICAgIGlmIChuZXdDb21taXRzLmxlbmd0aCkKLSAgICAgICAgICAgIHRoaXMucmVj
b3JkZWRDb21taXRzID0gbmV3Q29tbWl0cy5jb25jYXQodGhpcy5yZWNvcmRlZENvbW1pdHMpLnNv
cnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYS5yZXZpc2lvbk51bWJlciAtIGIucmV2aXNpb25O
dW1iZXI7IH0pOworICAgICAgICAgICAgdGhpcy5yZWNvcmRlZENvbW1pdHMgPSBuZXdDb21taXRz
LmNvbmNhdCh0aGlzLnJlY29yZGVkQ29tbWl0cykuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVy
biBhLmRhdGUgLSBiLmRhdGU7IH0pOwogCiAgICAgICAgIGlmIChuZXdDb21taXRzLmxlbmd0aCB8
fCBrbm93bkNvbW1pdHNXZXJlVXBkYXRlZCkKICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVu
dFRvTGlzdGVuZXJzKFRyYWMuRXZlbnQuQ29tbWl0c1VwZGF0ZWQsIG51bGwpOwpAQCAtMjU3LDQg
KzI1OSwyNCBAQCBUcmFjLnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgIHRoaXMuX2xvYWRlZChk
YXRhRG9jdW1lbnQpOwogICAgICAgICB9LmJpbmQodGhpcyksIHRoaXMuX25lZWRzQXV0aGVudGlj
YXRpb24gPyB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9IDoge30pOwogICAgIH0sCisKKyAgICBj
b21wYXJlUmV2aXNpb25zOiBmdW5jdGlvbihhLCBiKQorICAgIHsKKyAgICAgICAgdmFyIGluZGV4
QSA9IHRoaXMucmVjb3JkZWRDb21taXRzLm9iamVjdEluZGV4T2YoYSwgInJldmlzaW9uTnVtYmVy
Iik7CisgICAgICAgIHZhciBpbmRleEIgPSB0aGlzLnJlY29yZGVkQ29tbWl0cy5vYmplY3RJbmRl
eE9mKGIsICJyZXZpc2lvbk51bWJlciIpOworICAgICAgICBpZiAoaW5kZXhBID09PSB1bmRlZmlu
ZWQgfHwgaW5kZXhCID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgIHRoaXMubG9hZE1vcmVI
aXN0b3JpY2FsRGF0YSgpOworICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gaW5kZXhBIC0gaW5kZXhCOworICAgIH0sCisKKyAgICBuZXh0UmV2
aXNpb246IGZ1bmN0aW9uKGJyYW5jaE5hbWUsIHJldmlzaW9uKSB7CisgICAgICAgIHZhciBjb21t
aXRzT25CcmFuY2ggPSB0aGlzLmNvbW1pdHNPbkJyYW5jaChicmFuY2hOYW1lLCBmdW5jdGlvbihj
b21taXQpIHsgcmV0dXJuIGNvbW1pdDsgfSk7IC8vIFRPRE86IG1heWJlIHdlIHNob3VsZCBjYWNo
ZSB0aGlzPworICAgICAgICB2YXIgaW5kZXggPSBjb21taXRzT25CcmFuY2gub2JqZWN0SW5kZXhP
ZihyZXZpc2lvbiwgInJldmlzaW9uTnVtYmVyIik7CisgICAgICAgIHZhciBuZXh0Q29tbWl0ID0g
Y29tbWl0c09uQnJhbmNoW2luZGV4ICsgMV07CisgICAgICAgIGlmIChuZXh0Q29tbWl0KQorICAg
ICAgICAgICAgcmV0dXJuIG5leHRDb21taXQucmV2aXNpb25OdW1iZXI7CisgICAgICAgIHJldHVy
biB1bmRlZmluZWQ7CisgICAgfQogfTsKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBw
b3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRz
L1V0aWxpdGllcy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1V0aWxpdGllcy5qcwppbmRleCAy
ZDcwMjUwMWU3MWZhNmU5Y2VmM2Q2MjEyMzBiOTllOWYxMmQxMGRmLi4xYTU0NDE5ZGQxZDk3OTEw
NWI1MTIxYmU3NzFkZDVhOTE5MWIzYWM0IDEwMDY0NAotLS0gYS9Ub29scy9CdWlsZFNsYXZlU3Vw
cG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0
cy9VdGlsaXRpZXMuanMKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0
Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVXRpbGl0aWVzLmpzCkBA
IC0xNjYsNiArMTY2LDEzIEBAIEFycmF5LnByb3RvdHlwZS5maW5kRmlyc3QgPSBmdW5jdGlvbihw
cmVkaWNhdGUpCiAgICAgcmV0dXJuIG51bGw7CiB9OwogCitBcnJheS5wcm90b3R5cGUub2JqZWN0
SW5kZXhPZiA9IGZ1bmN0aW9uKHNlYXJjaFRlcm0sIHByb3BlcnR5KQoreworICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkKKyAgICAgICAgaWYgKHRoaXNbaV1bcHJvcGVy
dHldID09PSBzZWFyY2hUZXJtKSByZXR1cm4gaTsKKyAgICByZXR1cm4gdW5kZWZpbmVkOworfTsK
KwogQXJyYXkucHJvdG90eXBlLmF2ZXJhZ2UgPSBmdW5jdGlvbigpCiB7CiAgICAgdmFyIHN1bSA9
IDA7CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3Jn
LWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrQnVpbGRib3RR
dWV1ZS5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmln
L3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlLmpz
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmMwZWMzMTY3ZTJiNTRiNThlOTdmYjFlZGM5NGNiMjM2YzA5YzU0MWQKLS0t
IC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3Jn
LWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrQnVpbGRib3RR
dWV1ZS5qcwpAQCAtMCwwICsxLDI1IEBACitNb2NrQnVpbGRib3RRdWV1ZSA9IGZ1bmN0aW9uKCkK
K3sKKyAgICBpbmZvID0geworICAgICAgICBicmFuY2hlczogIiIsCisgICAgICAgIHBsYXRmb3Jt
OiAiIiwKKyAgICAgICAgZGVidWc6ICIiLAorICAgICAgICBidWlsZGVyOiAiIiwKKyAgICAgICAg
dGVzdGVyOiAiIiwKKyAgICAgICAgcGVyZm9ybWFuY2U6ICIiLAorICAgICAgICBzdGF0aWNBbmFs
eXplcjogIiIsCisgICAgICAgIGxlYWtzOiAiIiwKKyAgICAgICAgYXJjaGl0ZWN0dXJlOiAiIiwK
KyAgICAgICAgdGVzdENhdGVnb3J5OiAiIiwKKyAgICAgICAgaGVhZGluZzogIiIsCisgICAgICAg
IGNyYXNoZXNPbmx5OiAiIgorICAgIH07CisgICAgQnVpbGRib3RRdWV1ZS5jYWxsKHRoaXMsICJN
b2NrIEJ1aWxkQm90IiwgImlkIiwgaW5mbyk7Cit9OworCitCYXNlT2JqZWN0LmFkZENvbnN0cnVj
dG9yRnVuY3Rpb25zKE1vY2tCdWlsZGJvdFF1ZXVlKTsKKworTW9ja0J1aWxkYm90UXVldWUucHJv
dG90eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBNb2NrQnVpbGRib3RRdWV1ZSwKKyAgICBfX3By
b3RvX186IEJ1aWxkYm90UXVldWUucHJvdG90eXBlCit9CmRpZmYgLS1naXQgYS9Ub29scy9CdWls
ZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9h
cmQvU2NyaXB0cy90ZXN0cy9Nb2NrQnVpbGRib3RRdWV1ZVZpZXcuanMgYi9Ub29scy9CdWlsZFNs
YXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQv
U2NyaXB0cy90ZXN0cy9Nb2NrQnVpbGRib3RRdWV1ZVZpZXcuanMKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMzJkMGUz
MTQ4MjFhOTc2ZGRjNzA0NGVhMzc1MGQxYmVmY2U5YTkxNAotLS0gL2Rldi9udWxsCisrKyBiL1Rv
b2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1s
L2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlVmlldy5qcwpAQCAtMCww
ICsxLDIwIEBACitNb2NrQnVpbGRib3RRdWV1ZVZpZXcgPSBmdW5jdGlvbihxdWV1ZXMpCit7Cisg
ICAgQnVpbGRib3RRdWV1ZVZpZXcuY2FsbCh0aGlzLCBxdWV1ZXMpOworfTsKKworQmFzZU9iamVj
dC5hZGRDb25zdHJ1Y3RvckZ1bmN0aW9ucyhNb2NrQnVpbGRib3RRdWV1ZVZpZXcpOworCitNb2Nr
QnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBNb2NrQnVp
bGRib3RRdWV1ZVZpZXcsCisgICAgX19wcm90b19fOiBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5
cGUsCisKKyAgICBfbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbjogZnVuY3Rpb24ocXVldWUpCisg
ICAgeworICAgICAgICByZXR1cm4geworICAgICAgICAgICAgcmV2aXNpb246IHsKKyAgICAgICAg
ICAgICAgICAiV2Via2l0IFJlcG8iOiAzMzAyMAorICAgICAgICAgICAgfQorICAgICAgICB9Owor
ICAgIH0KK307CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJr
aXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrT3Zl
cnJpZGVzLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja092ZXJyaWRlcy5qcwpu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi44NTYyYjg2NzFkNWYyYzkyYjIzZjJkNDk0ODIzY2E2MjEyMjUwZjUwCi0tLSAv
ZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1j
b25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja092ZXJyaWRlcy5q
cwpAQCAtMCwwICsxLDExIEBACisvLyBUaGUgcmVhbCAibGFiZWwiIHNldHRlciB3YXMgdGhyb3dp
bmcgYW4gZXhjZXB0aW9uIGluIHRoZSB1bml0IHRlc3RzIHNvIEkgb3ZlcnJvZGUgaXQgd2l0aCBh
IHNpbXBsaWZpZWQgdmVyc2lvbi4KK09iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGF0dXNMaW5lVmll
dy5wcm90b3R5cGUsICJsYWJlbCIsIHsKKyAgICBzZXQ6IGZ1bmN0aW9uIGxhYmVsKHgpCisgICAg
eworICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgdGhpcy5fbGFiZWxFbGVtZW50LnRleHRD
b250ZW50ID0geDsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5f
bGFiZWxFbGVtZW50LCB0aGlzLl9tZXNzYWdlRWxlbWVudCk7CisgICAgICAgICAgICB0aGlzLmVs
ZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgibm8tbGFiZWwiKTsKKyAgICAgICAgfQorICAgIH0KK30p
OwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1j
b25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja1RyYWMuanMgYi9U
b29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRt
bC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrVHJhYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hNDhmOTE1
MmM4OTA1YWM4MTg0OTM2ZWE3MzNiOGZjZmQ1M2M4ZWZlCi0tLSAvZGV2L251bGwKKysrIGIvVG9v
bHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwv
ZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja1RyYWMuanMKQEAgLTAsMCArMSw3NyBAQAorTW9j
a1RyYWMgPSBmdW5jdGlvbigpCit7CisgICAgVHJhYy5jYWxsKHRoaXMsICJodHRwczovL3RyYWMu
d2Via2l0Lm9yZy8iKTsKKyAgICB0aGlzLnJlY29yZGVkQ29tbWl0cyA9IFsKKyAgICAgICAgewor
ICAgICAgICAgICAgInJldmlzaW9uTnVtYmVyIjogMzMwMTgsCisgICAgICAgICAgICAibGluayI6
ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL3JlcG9zaXRvcnkvY2hhbmdlc2V0Lzc3MDE4L3NhZmFy
aSIsCisgICAgICAgICAgICAidGl0bGUiOiB7fSwKKyAgICAgICAgICAgICJhdXRob3IiOiAiSm9o
biIsCisgICAgICAgICAgICAiZGF0ZSI6ICIyMDE1LTExLTE1VDE3OjA1OjQ0LjAwMFoiLAorICAg
ICAgICAgICAgImRlc2NyaXB0aW9uIjogImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJjb250
YWluc0JyYW5jaExvY2F0aW9uIjogdHJ1ZSwKKyAgICAgICAgICAgICJicmFuY2giOiAidHJ1bmsi
CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJyZXZpc2lvbk51bWJlciI6IDMz
MDE5LAorICAgICAgICAgICAgImxpbmsiOiAiaHR0cDovL3RyYWMud2Via2l0Lm9yZy9yZXBvc2l0
b3J5L2NoYW5nZXNldC83NzAxOS9zYWZhcmkiLAorICAgICAgICAgICAgInRpdGxlIjoge30sCisg
ICAgICAgICAgICAiYXV0aG9yIjogIlBhdWwiLAorICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0x
MS0xNlQwMToxODoyMy4wMDBaIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlw
dGlvbiIsCisgICAgICAgICAgICAiY29udGFpbnNCcmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAg
ICAgICAgICAiYnJhbmNoIjogInRydW5rIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAg
ICAgICAicmV2aXNpb25OdW1iZXIiOiAzMzAyMCwKKyAgICAgICAgICAgICJsaW5rIjogImh0dHA6
Ly90cmFjLndlYmtpdC5vcmcvcmVwb3NpdG9yeS9jaGFuZ2VzZXQvNzcwMjAvc2FmYXJpIiwKKyAg
ICAgICAgICAgICJ0aXRsZSI6IHt9LAorICAgICAgICAgICAgImF1dGhvciI6ICJHZW9yZ2UiLAor
ICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0xMS0xNlQwMToxOToyNy4wMDBaIiwKKyAgICAgICAg
ICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAiY29udGFpbnNC
cmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAgICAgICAgICAiYnJhbmNoIjogInRydW5rIgorICAg
ICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAicmV2aXNpb25OdW1iZXIiOiAzMzAyMSwK
KyAgICAgICAgICAgICJsaW5rIjogImh0dHA6Ly90cmFjLndlYmtpdC5vcmcvcmVwb3NpdG9yeS9j
aGFuZ2VzZXQvNzcwMjEvc2FmYXJpIiwKKyAgICAgICAgICAgICJ0aXRsZSI6IHt9LAorICAgICAg
ICAgICAgImF1dGhvciI6ICJSaW5nbyIsCisgICAgICAgICAgICAiZGF0ZSI6ICIyMDE1LTExLTE2
VDAxOjIwOjU4LjAwMFoiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRlc2NyaXB0aW9u
IiwKKyAgICAgICAgICAgICJjb250YWluc0JyYW5jaExvY2F0aW9uIjogdHJ1ZSwKKyAgICAgICAg
ICAgICJicmFuY2giOiAic29tZU90aGVyQnJhbmNoIgorICAgICAgICB9LAorICAgICAgICB7Cisg
ICAgICAgICAgICAicmV2aXNpb25OdW1iZXIiOiAzMzAyMiwKKyAgICAgICAgICAgICJsaW5rIjog
Imh0dHA6Ly90cmFjLndlYmtpdC5vcmcvcmVwb3NpdG9yeS9jaGFuZ2VzZXQvNzcwMjIvc2FmYXJp
IiwKKyAgICAgICAgICAgICJ0aXRsZSI6IHt9LAorICAgICAgICAgICAgImF1dGhvciI6ICJCb2Ii
LAorICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0xMS0xNlQwMToyMjowMS4wMDBaIiwKKyAgICAg
ICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAiY29udGFp
bnNCcmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAgICAgICAgICAiYnJhbmNoIjogInRydW5rIgor
ICAgICAgICB9CisgICAgXTsKK307CisKK0Jhc2VPYmplY3QuYWRkQ29uc3RydWN0b3JGdW5jdGlv
bnMoTW9ja1RyYWMpOworCitNb2NrVHJhYy5wcm90b3R5cGUgPSB7CisgICAgY29uc3RydWN0b3I6
IE1vY2tUcmFjLAorICAgIF9fcHJvdG9fXzogVHJhYy5wcm90b3R5cGUsCisKKyAgICBnZXQgb2xk
ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gMzMwMTg7
CisgICAgfSwKKworICAgIGdldCBsYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVyKCkKKyAgICB7
CisgICAgICAgIHJldHVybiAzMzAyMjsKKyAgICB9LAorCisgICAgbG9hZE1vcmVIaXN0b3JpY2Fs
RGF0YTogZnVuY3Rpb24oKQorICAgIHsKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL3Rlc3RzL2luZGV4Lmh0bWwgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9i
dWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0
cy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjM3ODc4ZjU0MDE5ZDc2ZWU0MTQ0ZjhhNmJhMTg3MGY5
NDU3NDQyODkKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWls
ZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9p
bmRleC5odG1sCkBAIC0wLDAgKzEsNTggQEAKKzwhZG9jdHlwZSBodG1sPgorPGh0bWw+CisgIDxo
ZWFkPgorICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9
ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorCisg
ICAgPHRpdGxlPldlYktpdCBCb3QgV2F0Y2hlcidzIERhc2hib2FyZCBRVW5pdCBUZXN0IFJ1bm5l
cjwvdGl0bGU+CisKKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY29k
ZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTEuMjAuMC5jc3MiPgorICAgIDxsaW5rIHJlbD0ic3R5
bGVzaGVldCIgaHJlZj0iLi4vLi4vU3R5bGVzL01haW4uY3NzIj48L2xpbms+CisgICAgPGxpbmsg
cmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9TdHlsZXMvUG9wb3Zlci5jc3MiPjwvbGluaz4K
KyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL1N0eWxlcy9RdWV1ZVZpZXcu
Y3NzIj48L2xpbms+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9TdHls
ZXMvU3RhdHVzTGluZVZpZXcuY3NzIj48L2xpbms+CisKKyAgICA8c2NyaXB0IHNyYz0iLi4vVXRp
bGl0aWVzLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQmFzZU9iamVjdC5qcyI+
PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0Rhc2hib2FyZC5qcyI+PC9zY3JpcHQ+Cisg
ICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNy
Yz0iLi4vQnVnemlsbGEuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWJibGVR
dWV1ZVNlcnZlci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1dlYktpdEJ1aWxk
Ym90LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RRdWV1ZS5qcyI+
PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1YmJsZVF1ZXVlLmpzIj48L3NjcmlwdD4K
KyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RJdGVyYXRpb24uanMiPjwvc2NyaXB0PgorICAg
IDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdFRlc3RSZXN1bHRzLmpzIj48L3NjcmlwdD4KKyAgICA8
c2NyaXB0IHNyYz0iLi4vR2VvbWV0cnkuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIu
Li9Qb3BvdmVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vUG9wb3ZlclRyYWNr
ZXIuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9RdWV1ZVZpZXcuanMiPjwvc2Ny
aXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdFF1ZXVlVmlldy5qcyI+PC9zY3JpcHQ+
CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90QnVpbGRlclF1ZXVlVmlldy5qcyI+PC9zY3Jp
cHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90VGVzdGVyUXVldWVWaWV3LmpzIj48L3Nj
cmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RDb21iaW5lZFF1ZXVlVmlldy5qcyI+
PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90UGVyZm9ybWFuY2VRdWV1ZVZp
ZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdExlYWtzUXVldWVW
aWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnViYmxlUXVldWVWaWV3Lmpz
Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vU3RhdHVzTGluZVZpZXcuanMiPjwvc2Ny
aXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9TZXR0aW5ncy5qcyI+PC9zY3JpcHQ+CisgICAgPHNj
cmlwdCBzcmM9Ii4uL1RyYWMuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJodHRwczov
L2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0xLjIwLjAuanMiPjwvc2NyaXB0PgorCisgICAg
PCEtLSB5b3VyIHRlc3RzLCBhbnkgYW5kIGFsbCB0byBydW4gd2l0aCB0aGUgZ2l2ZW4gZml4dHVy
ZXMgYmVsb3cgLS0+CisgICAgPHNjcmlwdCBzcmM9Ik1vY2tPdmVycmlkZXMuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSJNb2NrVHJhYy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9Ik1vY2tCdWlsZGJvdFF1ZXVlLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iTW9j
a0J1aWxkYm90UXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0idGVzdHMu
anMiPjwvc2NyaXB0PgorCisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGRpdiBpZD0icXVuaXQi
PjwvZGl2PiA8IS0tIFFVbml0IGZpbGxzIHRoaXMgd2l0aCByZXN1bHRzLCBldGMgLS0+CisgICAg
PGRpdiBpZD0icXVuaXQtZml4dHVyZSI+CisKKyAgICAgIDwhLS0gYW55IEhUTUwgeW91IHdhbnQg
dG8gYmUgcHJlc2VudCBpbiBlYWNoIHRlc3QgKHdpbGwgYmUgcmVzZXQgZm9yIGVhY2ggdGVzdCkg
LS0+CisKKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5k
IG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtp
dC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpz
IGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGlj
X2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNWZkZTQw
MDdlZDIzYjQxNTU1OTU1OTNmZGEzZTU1Zjk5ZDcxOGY1ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rv
b2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1s
L2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzCkBAIC0wLDAgKzEsMzcgQEAKK1FVbml0
LnRlc3QoIlRyYWMgVGVzdCIsIGZ1bmN0aW9uKCBhc3NlcnQgKQoreworICAgIHQgPSBuZXcgTW9j
a1RyYWMoKTsKKyAgICBhc3NlcnQuZXF1YWwodC5fcGFyc2VSZXZpc2lvbkZyb21VUkwoImh0dHBz
Oi8vdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC8xOTA0OTciKSwgIjE5MDQ5NyIsICJ0ZXN0IF9w
YXJzZVJldmlzaW9uRnJvbVVSTCBTVk4iKTsKKyAgICBhc3NlcnQuZXF1YWwodC5fcGFyc2VSZXZp
c2lvbkZyb21VUkwoImh0dHA6Ly90cmFjLmZvb2Jhci5jb20vcmVwb3NpdG9yeS9jaGFuZ2VzZXQv
NzUzODgvcHJvamVjdCIpLCAiNzUzODgiLCAidGVzdCBfcGFyc2VSZXZpc2lvbkZyb21VUkwgU1ZO
IHdpdGggc3VmZml4Iik7CisgICAgYXNzZXJ0LmVxdWFsKHQuX3BhcnNlUmV2aXNpb25Gcm9tVVJM
KCJodHRwczovL2dpdC5mb29iYXIuY29tL3RyYWMvV2hhdGV2ZXIuZ2l0L2NoYW5nZXNldC8wZTQ5
OGRiNWQ4ZTViNWEzNDI2MzEiKSwgIjBlNDk4ZGI1ZDhlNWI1YTM0MjYzMSIsICJ0ZXN0IF9wYXJz
ZVJldmlzaW9uRnJvbVVSTCBHaXQiKTsKKyAgICBhc3NlcnQuZXF1YWwodC5uZXh0UmV2aXNpb24o
InRydW5rIiwgMzMwMjApLCAzMzAyMiwgInRlc3QgbmV4dENvbW1pdCIpOworICAgIGFzc2VydC5l
cXVhbCh0LmNvbXBhcmVSZXZpc2lvbnMoMzMwMjAsIDMzMDIyKSwgLTIsICJ0ZXN0IGNvbXBhcmVS
ZXZpc2lvbnMgbGVzcyB0aGFuIik7CisgICAgYXNzZXJ0LmVxdWFsKHQuY29tcGFyZVJldmlzaW9u
cygzMzAyMiwgMzMwMjApLCAyLCAidGVzdCBjb21wYXJlUmV2aXNpb25zIGdyZWF0ZXIgdGhhbiIp
OworICAgIGFzc2VydC5lcXVhbCh0LmNvbXBhcmVSZXZpc2lvbnMoMzMwMjIsIDMzMDIyKSwgMCwg
InRlc3QgY29tcGFyZVJldmlzaW9ucyBlcXVhbCIpOworICAgIGFzc2VydC5lcXVhbCh0LnJlY29y
ZGVkQ29tbWl0cy5vYmplY3RJbmRleE9mKDMzMDIyLCAicmV2aXNpb25OdW1iZXIiKSwgNCwgIm9i
amVjdEluZGV4T2YiKTsKK30pOworCit2YXIgc2V0dGluZ3MgPSBuZXcgU2V0dGluZ3M7CitzZXR0
aW5ncy5zZXRPYmplY3QoIk1vY2siLCB0cnVlKTsKK1FVbml0LnRlc3QoIkJ1aWxkQm90UXVldWUg
VGVzdCIsIGZ1bmN0aW9uKCBhc3NlcnQgKQoreworICAgIHRyYWMgPSBuZXcgTW9ja1RyYWMoKTsK
KyAgICBhc3NlcnQub2sodHJhYywgInRyYWMgaXMgbm90IG51bGwiKTsKKworICAgIHZhciBxdWV1
ZSA9IG5ldyBNb2NrQnVpbGRib3RRdWV1ZSgpOworICAgIHF1ZXVlLmJyYW5jaGVzID0gW3sKKyAg
ICAgICAgbmFtZTogInRydW5rIiwKKyAgICAgICAgcmVwb3NpdG9yeTogeworICAgICAgICAgICAg
bmFtZTogIldlYmtpdCBSZXBvIiwKKyAgICAgICAgICAgIHRyYWM6IHRyYWMKKyAgICAgICAgfQor
ICAgIH1dCisgICAgYXNzZXJ0Lm9rKHF1ZXVlLCAicXVldWUgaXMgbm90IG51bGwiKTsKKworICAg
IHZhciB2aWV3ID0gbmV3IE1vY2tCdWlsZGJvdFF1ZXVlVmlldyhbcXVldWVdKTsKKyAgICBhc3Nl
cnQub2sodmlldywgInZpZXcgaXMgbm90IG51bGwiKTsKKworICAgIHZpZXcuX2FwcGVuZFBlbmRp
bmdSZXZpc2lvbkNvdW50KHF1ZXVlKTsKKyAgICB2YXIgcmV2aXNpb25zQmVoaW5kID0gdmlldy5l
bGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lc3NhZ2UiKVswXS5pbm5lckhUTUwubWF0
Y2goLy4qKFxkKykgcmV2aXNpb24ofHMpIGJlaGluZC8pWzFdOworICAgIGFzc2VydC5lcXVhbChy
ZXZpc2lvbnNCZWhpbmQsIDEsICJhc3NlcnQgcmV2aXNpb25zIGJlaGluZCIpOworfSk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>267492</attachid>
            <date>2015-12-16 14:30:36 -0800</date>
            <delta_ts>2015-12-17 16:09:34 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152345-20151216142958.patch</filename>
            <type>text/plain</type>
            <size>150836</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0MTY5CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggNWFiNWQxYzFmNzQzMGI1ZWY0NjliZDU2N2UwYWJhMDcy
N2NjY2I1OS4uMTM0ZTMwMjgxOTIzZWExZTVmMzczMDFhZDM2MDdiYTU4OWQyZDNhMyAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDYx
IEBACisyMDE1LTEyLTE2ICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgorCisg
ICAgICAgIFRlYWNoIGRhc2hib2FyZCBjb2RlIHRvIGNvbXBhcmUgbm9uLWludGVnZXIgcmV2aXNp
b25zLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUy
MzQ1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBC
dWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNo
Ym9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmNzczogQWRkZWQuCisgICAgICAgICogQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L0V4dGVybmFsL3F1bml0LTEuMjAuMC5qczogQWRkZWQuCisgICAgICAgICogQnVpbGRTbGF2ZVN1
cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Njcmlw
dHMvQnVpbGRib3RRdWV1ZS5qczoKKyAgICAgICAgKEJ1aWxkYm90UXVldWUucHJvdG90eXBlLmNv
bXBhcmVJdGVyYXRpb25zKTogQ29tcGFyZSBub24taW50ZWdlciByZXZpc2lvbnMuCisgICAgICAg
IChCdWlsZGJvdFF1ZXVlLnByb3RvdHlwZS5jb21wYXJlSXRlcmF0aW9uc0J5UmV2aXNpb25zKTog
RGl0dG8uCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcuanM6Cisg
ICAgICAgIChCdWlsZGJvdFF1ZXVlVmlldyk6IEV4aXQgY29uc3RydWN0b3IgZWFybHkgaWYgd2Ug
YXJlIHVuaXQgdGVzdGluZy4KKyAgICAgICAgKEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZS5f
YXBwZW5kUGVuZGluZ1JldmlzaW9uQ291bnQpOiBVc2UgVHJhYy5jb21wYXJlUmV2aXNpb25zIGlu
IG9yZGVyIHRvIGNvbXBhcmUgbm9uLWludGVnZXIgcmV2aXNpb25zLgorICAgICAgICBXZSBhbHNv
IHVzZSB0aGUgZnVsbCBmb3JtIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIEFycmF5LmZp
bHRlcigpIGNvbWJpbmVkIHdpdGggQXJyYXkub2JqZWN0SW5kZXhPZiBpbiBvcmRlciB0byBjb21w
YXJlCisgICAgICAgIGFycmF5IGluZGljZXMgaW5zdGVhZCBvZiBpbnRlZ2VyIHJldmlzaW9uIG51
bWJlcnMuIFdlIGFsc28gZXhpdCB0aGUgZnVuY3Rpb24gZWFybHkgdG8gYXZvaWQgZXJyb3JzIHdo
ZW4gdW5pdCB0ZXN0aW5nLgorICAgICAgICAoQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLl9w
b3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSk6IFVzZSBUcmFjLmNvbXBhcmVSZXZpc2lvbnMgaW4g
b3JkZXIgdG8gY29tcGFyZSBub24taW50ZWdlciByZXZpc2lvbnMuCisgICAgICAgIFdlIGFsc28g
dXNlIHRoZSBmdWxsIGZvcm0gb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggQXJyYXkuZmls
dGVyKCkgY29tYmluZWQgd2l0aCBBcnJheS5vYmplY3RJbmRleE9mIGluIG9yZGVyIHRvIGNvbXBh
cmUKKyAgICAgICAgYXJyYXkgaW5kaWNlcyBpbnN0ZWFkIG9mIGludGVnZXIgcmV2aXNpb24gbnVt
YmVycy4KKyAgICAgICAgKEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZS5fcHJlc2VudFBvcG92
ZXJGb3JQZW5kaW5nQ29tbWl0cyk6IFVzZSBUcmFjLm5leHRSZXZpc2lvbiBpbnN0ZWFkIG9mIGlu
Y3JlbWVudGluZyBhbgorICAgICAgICBpbnRlZ2VyLgorICAgICAgICAoQnVpbGRib3RRdWV1ZVZp
ZXcucHJvdG90eXBlLl9yZXZpc2lvbkNvbnRlbnRXaXRoUG9wb3ZlckZvckl0ZXJhdGlvbik6IERp
dHRvLgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmln
L3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1F1ZXVlVmlldy5qczoKKyAgICAgICAgKFF1
ZXVlVmlldyk6IEV4aXQgdGhlIGNvbnN0cnVjdG9yIGVhcmx5IHRvIGF2b2lkIGVycm9ycyB3aGVu
IHVuaXQgdGVzdGluZy4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQu
b3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzOgorICAgICAg
ICAoVHJhYy5wcm90b3R5cGUuY29tbWl0c09uQnJhbmNoKTogVXNlIHRoZSBmdWxsIGZvcm0gb2Yg
dGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggQXJyYXkuZmlsdGVyKCkgY29tYmluZWQgd2l0aAor
ICAgICAgICBBcnJheS5vYmplY3RJbmRleE9mIGluIG9yZGVyIHRvIGNvbXBhcmUgYXJyYXkgaW5k
aWNlcyBpbnN0ZWFkIG9mIGludGVnZXIgcmV2aXNpb24gbnVtYmVycy4KKyAgICAgICAgKFRyYWMu
cHJvdG90eXBlLl9wYXJzZVJldmlzaW9uRnJvbVVSTCk6IEFkZGVkLiBCcm9rZSB0aGlzIG91dCBp
bnRvIGl0cyBvd24gZnVuY3Rpb24gaW4gb3JkZXIgdG8gdW5pdCB0ZXN0IG1vcmUgZWFzaWx5Lgor
ICAgICAgICBBbHNvIHJlbW92ZWQgdGhlIGNhbGwgdG8gcGFyc2VJbnQgaW4gYW50aWNpcGF0aW9u
IG9mIG5vbi1pbnRlZ2VyIHJldmlzaW9ucy4KKyAgICAgICAgKFRyYWMucHJvdG90eXBlLl9sb2Fk
ZWQpOiBTb3J0IGJ5IGRhdGUgYWZ0ZXIgbmV3IGNvbW1pdHMgYXJlIGFkZGVkIHNpbmNlIHdlIGNh
biBubyBsb25nZXIgc29ydCBieSByZXZpc2lvbiBudW1iZXJzLgorICAgICAgICAoVHJhYy5wcm90
b3R5cGUuY29tcGFyZVJldmlzaW9ucyk6IEFkZGVkLiBHaXZlbiB0d28gcmV2aXNpb25zIHdlIGNv
bXBhcmUgdGhlaXIgaW5kaWNlcyB3aXRoaW4gdGhlICJyZWNvcmRlZENvbW1pdHMiIGFycmF5Lgor
ICAgICAgICBJZiBlaXRoZXIgcmV2aXNpb24gaXMgbm90IGZvdW5kIGluIHRoZSAicmVjb3JkZWRD
b21taXRzIiBhcnJheSwgd2UgcmV0dXJuIHVuZGVmaW5lZCBhbmQgbG9hZCBtb3JlIGhpc3Rvcmlj
YWwgZGF0YS4KKyAgICAgICAgKFRyYWMucHJvdG90eXBlLm5leHRSZXZpc2lvbik6IEFkZGVkLiBH
aXZlbiBhIGJyYW5jaCBhbmQgcmV2aXNpb24sIHdlIGZpbmQgdGhlIG5leHQgcmV2aXNpb24gY2hy
b25vbG9naWNhbGx5LgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5v
cmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1V0aWxpdGllcy5qczoKKyAg
ICAgICAgKEFycmF5LnByb3RvdHlwZS5vYmplY3RJbmRleE9mKTogQWRkZWQuIEZpbmRzIGFuIG9i
amVjdCwgaW4gYW4gYXJyYXkgb2Ygb2JqZWN0cywgd2hlcmUgdGhlIHNlYXJjaCB0ZXJtIG1hdGNo
ZXMgdGhlIGdpdmVuCisgICAgICAgIHByb3BlcnR5LgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBw
b3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRz
L3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlLmpzOiBBZGRlZC4KKyAgICAgICAgKE1vY2tCdWlsZGJv
dFF1ZXVlKTogQWRkZWQuIE1vY2sgQnVpbGRib3RRdWV1ZSBvYmplY3QgdGhhdCBkb2Vzbid0IG5l
ZWQgdG8gdGFsayB0byBhbiBhY3R1YWwgQnVpbGRib3Qgc2VydmVyLgorICAgICAgICAqIEJ1aWxk
U2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2Fy
ZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlVmlldy5qczogQWRkZWQuCisgICAgICAg
IChNb2NrQnVpbGRib3RRdWV1ZVZpZXcpOiBBZGRlZC4gTW9jayBCdWlsZGJvdFF1ZXVlVmlldyBv
YmplY3QgdGhhdCByZXR1cm5zIGEgcHJlLXNwZWNpZmllZCBfbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJh
dGlvbiB3aXRob3V0CisgICAgICAgIHRoZSBuZWVkIHRvIHRhbGsgdG8gYSByZWFsIEJ1aWxkYm90
IHNlcnZlci4KKyAgICAgICAgKE1vY2tCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUuX2xhdGVz
dFByb2R1Y3RpdmVJdGVyYXRpb24pOiBBZGRlZC4gUmV0dXJucyBhIHByZS1zcGVjaWZpZWQgX2xh
dGVzdFByb2R1Y3RpdmVJdGVyYXRpb24KKyAgICAgICAgd2l0aG91dCB0aGUgbmVlZCB0byB0YWxr
IHRvIGEgcmVhbCBCdWlsZGJvdCBzZXJ2ZXIuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQv
YnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVz
dHMvTW9ja092ZXJyaWRlcy5qczogQWRkZWQuCisgICAgICAgIChzZXQgbGFiZWwpOiBBZGRlZC4g
VGhlIHJlYWwgImxhYmVsIiBzZXR0ZXIgd2FzIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpbiB0aGUg
dW5pdCB0ZXN0cyBzbyBJIG92ZXJyb2RlIGl0IHdpdGggYSBzaW1wbGlmaWVkCisgICAgICAgIHZl
cnNpb24uCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja1RyYWMuanM6IEFkZGVk
LgorICAgICAgICAoTW9ja1RyYWMpOiBBZGRlZC4gTW9jayBUcmFjIGNvbnN0cnVjdG9yIHRoYXQg
aGFzIHByZS1wb3B1bGF0ZWQgInJlY29yZGVkQ29tbWl0cyIgYW5kIGRvZXMgbm90IG5lZWQgdG8g
dGFsayB0byBhIHJlYWwgVHJhYworICAgICAgICBzZXJ2ZXIuCisgICAgICAgIChNb2NrVHJhYy5w
cm90b3R5cGUuZ2V0IG9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpOiBBZGRlZC4gUmV0dXJu
cyBhIHByZS1zcGVjaWZpZWQgcmV2aXNpb24uCisgICAgICAgIChNb2NrVHJhYy5wcm90b3R5cGUu
Z2V0IGxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpOiBEaXR0by4KKyAgICAgICAgKE1vY2tU
cmFjLnByb3RvdHlwZS5sb2FkTW9yZUhpc3RvcmljYWxEYXRhKTogQWRkZWQuIE92ZXJyaWRlcyB0
aGUgcmVhbCBsb2FkTW9yZUhpc3RvcmljYWxEYXRhIHNvIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGlt
ZQorICAgICAgICB0cnlpbmcgdG8gdGFsayB0byBUcmFjLgorICAgICAgICAqIEJ1aWxkU2xhdmVT
dXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3Jp
cHRzL3Rlc3RzL2luZGV4Lmh0bWw6IEFkZGVkLiBXZWIgcGFnZSBjb250YWluZXIgZm9yCisgICAg
ICAgIFFVbml0IHVuaXQgdGVzdHMuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVz
dHMuanM6IEFkZGVkLiBRVW5pdCB1bml0IHRlc3RzLgorCiAyMDE1LTEyLTE2ICBUaW0gSG9ydG9u
ICA8dGltb3RoeV9ob3J0b25AYXBwbGUuY29tPgogCiAgICAgICAgIFttYWMtd2syXSBmYXN0L2V2
ZW50cyBmb3JjZSBjbGljayB0ZXN0cyBjcmFzaGluZwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L0V4dGVybmFsL3F1bml0LTEuMjAuMC5jc3MgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWls
ZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwvcXVuaXQt
MS4yMC4wLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hNTllMjgyNGNlMzE2M2NhZGM3MDU5ZTAxYWNlMDVlZDYy
NjM3ODhkCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0LTEu
MjAuMC5jc3MKQEAgLTAsMCArMSwzMDEgQEAKKy8qIQorICogUVVuaXQgMS4yMC4wCisgKiBodHRw
Oi8vcXVuaXRqcy5jb20vCisgKgorICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBv
dGhlciBjb250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQorICog
aHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIERhdGU6IDIwMTUtMTAtMjdUMTc6NTNa
CisgKi8KKworLyoqIEZvbnQgRmFtaWx5IGFuZCBTaXplcyAqLworCisjcXVuaXQtdGVzdHMsICNx
dW5pdC1oZWFkZXIsICNxdW5pdC1iYW5uZXIsICNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIsICNx
dW5pdC1maWx0ZXJlZFRlc3QsICNxdW5pdC11c2VyQWdlbnQsICNxdW5pdC10ZXN0cmVzdWx0IHsK
Kwlmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIExpZ2h0IiwgIkhlbHZldGljYU5ldWUtTGln
aHQiLCAiSGVsdmV0aWNhIE5ldWUiLCBDYWxpYnJpLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNl
cmlmOworfQorCisjcXVuaXQtdGVzdHJ1bm5lci10b29sYmFyLCAjcXVuaXQtZmlsdGVyZWRUZXN0
LCAjcXVuaXQtdXNlckFnZW50LCAjcXVuaXQtdGVzdHJlc3VsdCwgI3F1bml0LXRlc3RzIGxpIHsg
Zm9udC1zaXplOiBzbWFsbDsgfQorI3F1bml0LXRlc3RzIHsgZm9udC1zaXplOiBzbWFsbGVyOyB9
CisKKworLyoqIFJlc2V0cyAqLworCisjcXVuaXQtdGVzdHMsICNxdW5pdC1oZWFkZXIsICNxdW5p
dC1iYW5uZXIsICNxdW5pdC1maWx0ZXJlZFRlc3QsICNxdW5pdC11c2VyQWdlbnQsICNxdW5pdC10
ZXN0cmVzdWx0LCAjcXVuaXQtbW9kdWxlZmlsdGVyIHsKKwltYXJnaW46IDA7CisJcGFkZGluZzog
MDsKK30KKworCisvKiogSGVhZGVyICovCisKKyNxdW5pdC1oZWFkZXIgeworCXBhZGRpbmc6IDAu
NWVtIDAgMC41ZW0gMWVtOworCisJY29sb3I6ICM4Njk5QTQ7CisJYmFja2dyb3VuZC1jb2xvcjog
IzBEMzM0OTsKKworCWZvbnQtc2l6ZTogMS41ZW07CisJbGluZS1oZWlnaHQ6IDFlbTsKKwlmb250
LXdlaWdodDogNDAwOworCisJYm9yZGVyLXJhZGl1czogNXB4IDVweCAwIDA7Cit9CisKKyNxdW5p
dC1oZWFkZXIgYSB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCWNvbG9yOiAjQzJDQ0QxOwor
fQorCisjcXVuaXQtaGVhZGVyIGE6aG92ZXIsCisjcXVuaXQtaGVhZGVyIGE6Zm9jdXMgeworCWNv
bG9yOiAjRkZGOworfQorCisjcXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIGxhYmVsIHsKKwlkaXNw
bGF5OiBpbmxpbmUtYmxvY2s7CisJcGFkZGluZzogMCAwLjVlbSAwIDAuMWVtOworfQorCisjcXVu
aXQtYmFubmVyIHsKKwloZWlnaHQ6IDVweDsKK30KKworI3F1bml0LXRlc3RydW5uZXItdG9vbGJh
ciB7CisJcGFkZGluZzogMC41ZW0gMWVtIDAuNWVtIDFlbTsKKwljb2xvcjogIzVFNzQwQjsKKwli
YWNrZ3JvdW5kLWNvbG9yOiAjRUVFOworCW92ZXJmbG93OiBoaWRkZW47Cit9CisKKyNxdW5pdC1m
aWx0ZXJlZFRlc3QgeworCXBhZGRpbmc6IDAuNWVtIDFlbSAwLjVlbSAxZW07CisJYmFja2dyb3Vu
ZC1jb2xvcjogI0Y0RkY3NzsKKwljb2xvcjogIzM2NjA5NzsKK30KKworI3F1bml0LXVzZXJBZ2Vu
dCB7CisJcGFkZGluZzogMC41ZW0gMWVtIDAuNWVtIDFlbTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAj
MkI4MUFGOworCWNvbG9yOiAjRkZGOworCXRleHQtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuNSkg
MnB4IDJweCAxcHg7Cit9CisKKyNxdW5pdC1tb2R1bGVmaWx0ZXItY29udGFpbmVyIHsKKwlmbG9h
dDogcmlnaHQ7CisJcGFkZGluZzogMC4yZW07Cit9CisKKy5xdW5pdC11cmwtY29uZmlnIHsKKwlk
aXNwbGF5OiBpbmxpbmUtYmxvY2s7CisJcGFkZGluZzogMC4xZW07Cit9CisKKy5xdW5pdC1maWx0
ZXIgeworCWRpc3BsYXk6IGJsb2NrOworCWZsb2F0OiByaWdodDsKKwltYXJnaW4tbGVmdDogMWVt
OworfQorCisvKiogVGVzdHM6IFBhc3MvRmFpbCAqLworCisjcXVuaXQtdGVzdHMgeworCWxpc3Qt
c3R5bGUtcG9zaXRpb246IGluc2lkZTsKK30KKworI3F1bml0LXRlc3RzIGxpIHsKKwlwYWRkaW5n
OiAwLjRlbSAxZW0gMC40ZW0gMWVtOworCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGOwor
CWxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKK30KKworI3F1bml0LXRlc3RzID4gbGkgewor
CWRpc3BsYXk6IG5vbmU7Cit9CisKKyNxdW5pdC10ZXN0cyBsaS5ydW5uaW5nLAorI3F1bml0LXRl
c3RzIGxpLnBhc3MsCisjcXVuaXQtdGVzdHMgbGkuZmFpbCwKKyNxdW5pdC10ZXN0cyBsaS5za2lw
cGVkIHsKKwlkaXNwbGF5OiBsaXN0LWl0ZW07Cit9CisKKyNxdW5pdC10ZXN0cy5oaWRlcGFzcyBs
aS5ydW5uaW5nLAorI3F1bml0LXRlc3RzLmhpZGVwYXNzIGxpLnBhc3MgeworCXZpc2liaWxpdHk6
IGhpZGRlbjsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJd2lkdGg6ICAgMDsKKwloZWlnaHQ6ICAw
OworCXBhZGRpbmc6IDA7CisJYm9yZGVyOiAgMDsKKwltYXJnaW46ICAwOworfQorCisjcXVuaXQt
dGVzdHMgbGkgc3Ryb25nIHsKKwljdXJzb3I6IHBvaW50ZXI7Cit9CisKKyNxdW5pdC10ZXN0cyBs
aS5za2lwcGVkIHN0cm9uZyB7CisJY3Vyc29yOiBkZWZhdWx0OworfQorCisjcXVuaXQtdGVzdHMg
bGkgYSB7CisJcGFkZGluZzogMC41ZW07CisJY29sb3I6ICNDMkNDRDE7CisJdGV4dC1kZWNvcmF0
aW9uOiBub25lOworfQorCisjcXVuaXQtdGVzdHMgbGkgcCBhIHsKKwlwYWRkaW5nOiAwLjI1ZW07
CisJY29sb3I6ICM2QjY0NjQ7Cit9CisjcXVuaXQtdGVzdHMgbGkgYTpob3ZlciwKKyNxdW5pdC10
ZXN0cyBsaSBhOmZvY3VzIHsKKwljb2xvcjogIzAwMDsKK30KKworI3F1bml0LXRlc3RzIGxpIC5y
dW50aW1lIHsKKwlmbG9hdDogcmlnaHQ7CisJZm9udC1zaXplOiBzbWFsbGVyOworfQorCisucXVu
aXQtYXNzZXJ0LWxpc3QgeworCW1hcmdpbi10b3A6IDAuNWVtOworCXBhZGRpbmc6IDAuNWVtOwor
CisJYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKKworCWJvcmRlci1yYWRpdXM6IDVweDsKK30KKwor
LnF1bml0LXNvdXJjZSB7CisJbWFyZ2luOiAwLjZlbSAwIDAuM2VtOworfQorCisucXVuaXQtY29s
bGFwc2VkIHsKKwlkaXNwbGF5OiBub25lOworfQorCisjcXVuaXQtdGVzdHMgdGFibGUgeworCWJv
cmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisJbWFyZ2luLXRvcDogMC4yZW07Cit9CisKKyNxdW5p
dC10ZXN0cyB0aCB7CisJdGV4dC1hbGlnbjogcmlnaHQ7CisJdmVydGljYWwtYWxpZ246IHRvcDsK
KwlwYWRkaW5nOiAwIDAuNWVtIDAgMDsKK30KKworI3F1bml0LXRlc3RzIHRkIHsKKwl2ZXJ0aWNh
bC1hbGlnbjogdG9wOworfQorCisjcXVuaXQtdGVzdHMgcHJlIHsKKwltYXJnaW46IDA7CisJd2hp
dGUtc3BhY2U6IHByZS13cmFwOworCXdvcmQtd3JhcDogYnJlYWstd29yZDsKK30KKworI3F1bml0
LXRlc3RzIGRlbCB7CisJYmFja2dyb3VuZC1jb2xvcjogI0UwRjJCRTsKKwljb2xvcjogIzM3NEUw
QzsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKyNxdW5pdC10ZXN0cyBpbnMgeworCWJh
Y2tncm91bmQtY29sb3I6ICNGRkNBQ0E7CisJY29sb3I6ICM1MDA7CisJdGV4dC1kZWNvcmF0aW9u
OiBub25lOworfQorCisvKioqIFRlc3QgQ291bnRzICovCisKKyNxdW5pdC10ZXN0cyBiLmNvdW50
cyAgICAgICAgICAgICAgICAgICAgICAgeyBjb2xvcjogIzAwMDsgfQorI3F1bml0LXRlc3RzIGIu
cGFzc2VkICAgICAgICAgICAgICAgICAgICAgICB7IGNvbG9yOiAjNUU3NDBCOyB9CisjcXVuaXQt
dGVzdHMgYi5mYWlsZWQgICAgICAgICAgICAgICAgICAgICAgIHsgY29sb3I6ICM3MTA5MDk7IH0K
KworI3F1bml0LXRlc3RzIGxpIGxpIHsKKwlwYWRkaW5nOiA1cHg7CisJYmFja2dyb3VuZC1jb2xv
cjogI0ZGRjsKKwlib3JkZXItYm90dG9tOiBub25lOworCWxpc3Qtc3R5bGUtcG9zaXRpb246IGlu
c2lkZTsKK30KKworLyoqKiBQYXNzaW5nIFN0eWxlcyAqLworCisjcXVuaXQtdGVzdHMgbGkgbGku
cGFzcyB7CisJY29sb3I6ICMzQzUxMEM7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKKwlib3Jk
ZXItbGVmdDogMTBweCBzb2xpZCAjQzZFNzQ2OworfQorCisjcXVuaXQtdGVzdHMgLnBhc3MgICAg
ICAgICAgICAgICAgICAgICAgICAgIHsgY29sb3I6ICM1MjhDRTA7IGJhY2tncm91bmQtY29sb3I6
ICNEMkUwRTY7IH0KKyNxdW5pdC10ZXN0cyAucGFzcyAudGVzdC1uYW1lICAgICAgICAgICAgICAg
eyBjb2xvcjogIzM2NjA5NzsgfQorCisjcXVuaXQtdGVzdHMgLnBhc3MgLnRlc3QtYWN0dWFsLAor
I3F1bml0LXRlc3RzIC5wYXNzIC50ZXN0LWV4cGVjdGVkICAgICAgICAgICB7IGNvbG9yOiAjOTk5
OyB9CisKKyNxdW5pdC1iYW5uZXIucXVuaXQtcGFzcyAgICAgICAgICAgICAgICAgICAgeyBiYWNr
Z3JvdW5kLWNvbG9yOiAjQzZFNzQ2OyB9CisKKy8qKiogRmFpbGluZyBTdHlsZXMgKi8KKworI3F1
bml0LXRlc3RzIGxpIGxpLmZhaWwgeworCWNvbG9yOiAjNzEwOTA5OworCWJhY2tncm91bmQtY29s
b3I6ICNGRkY7CisJYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgI0VFNTc1NzsKKwl3aGl0ZS1zcGFj
ZTogcHJlOworfQorCisjcXVuaXQtdGVzdHMgPiBsaTpsYXN0LWNoaWxkIHsKKwlib3JkZXItcmFk
aXVzOiAwIDAgNXB4IDVweDsKK30KKworI3F1bml0LXRlc3RzIC5mYWlsICAgICAgICAgICAgICAg
ICAgICAgICAgICB7IGNvbG9yOiAjMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjRUU1NzU3OyB9Cisj
cXVuaXQtdGVzdHMgLmZhaWwgLnRlc3QtbmFtZSwKKyNxdW5pdC10ZXN0cyAuZmFpbCAubW9kdWxl
LW5hbWUgICAgICAgICAgICAgeyBjb2xvcjogIzAwMDsgfQorCisjcXVuaXQtdGVzdHMgLmZhaWwg
LnRlc3QtYWN0dWFsICAgICAgICAgICAgIHsgY29sb3I6ICNFRTU3NTc7IH0KKyNxdW5pdC10ZXN0
cyAuZmFpbCAudGVzdC1leHBlY3RlZCAgICAgICAgICAgeyBjb2xvcjogIzAwODAwMDsgfQorCisj
cXVuaXQtYmFubmVyLnF1bml0LWZhaWwgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1j
b2xvcjogI0VFNTc1NzsgfQorCisvKioqIFNraXBwZWQgdGVzdHMgKi8KKworI3F1bml0LXRlc3Rz
IC5za2lwcGVkIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRUJFQ0U5OworfQorCisjcXVuaXQtdGVz
dHMgLnF1bml0LXNraXBwZWQtbGFiZWwgeworCWJhY2tncm91bmQtY29sb3I6ICNGNEZGNzc7CisJ
ZGlzcGxheTogaW5saW5lLWJsb2NrOworCWZvbnQtc3R5bGU6IG5vcm1hbDsKKwljb2xvcjogIzM2
NjA5NzsKKwlsaW5lLWhlaWdodDogMS44ZW07CisJcGFkZGluZzogMCAwLjVlbTsKKwltYXJnaW46
IC0wLjRlbSAwLjRlbSAtMC40ZW0gMDsKK30KKworLyoqIFJlc3VsdCAqLworCisjcXVuaXQtdGVz
dHJlc3VsdCB7CisJcGFkZGluZzogMC41ZW0gMWVtIDAuNWVtIDFlbTsKKworCWNvbG9yOiAjMkI4
MUFGOworCWJhY2tncm91bmQtY29sb3I6ICNEMkUwRTY7CisKKwlib3JkZXItYm90dG9tOiAxcHgg
c29saWQgI0ZGRjsKK30KKyNxdW5pdC10ZXN0cmVzdWx0IC5tb2R1bGUtbmFtZSB7CisJZm9udC13
ZWlnaHQ6IDcwMDsKK30KKworLyoqIEZpeHR1cmUgKi8KKworI3F1bml0LWZpeHR1cmUgeworCXBv
c2l0aW9uOiBhYnNvbHV0ZTsKKwl0b3A6IC0xMDAwMHB4OworCWxlZnQ6IC0xMDAwMHB4OworCXdp
ZHRoOiAxMDAwcHg7CisJaGVpZ2h0OiAxMDAwcHg7Cit9CmRpZmYgLS1naXQgYS9Ub29scy9CdWls
ZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9h
cmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVp
bGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0
LTEuMjAuMC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45MDQ5NDNmMDg4ZWRmZDNlY2IwZTdjZjJjYzcwYmM0YTU4
NzZjM2RhCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0LTEu
MjAuMC5qcwpAQCAtMCwwICsxLDQxNTggQEAKKy8qIQorICogUVVuaXQgMS4yMC4wCisgKiBodHRw
Oi8vcXVuaXRqcy5jb20vCisgKgorICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBv
dGhlciBjb250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQorICog
aHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIERhdGU6IDIwMTUtMTAtMjdUMTc6NTNa
CisgKi8KKworKGZ1bmN0aW9uKCBnbG9iYWwgKSB7CisKK3ZhciBRVW5pdCA9IHt9OworCit2YXIg
RGF0ZSA9IGdsb2JhbC5EYXRlOwordmFyIG5vdyA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCkgewor
CXJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKK307CisKK3ZhciBzZXRUaW1lb3V0ID0gZ2xv
YmFsLnNldFRpbWVvdXQ7Cit2YXIgY2xlYXJUaW1lb3V0ID0gZ2xvYmFsLmNsZWFyVGltZW91dDsK
KworLy8gU3RvcmUgYSBsb2NhbCB3aW5kb3cgZnJvbSB0aGUgZ2xvYmFsIHRvIGFsbG93IGRpcmVj
dCByZWZlcmVuY2VzLgordmFyIHdpbmRvdyA9IGdsb2JhbC53aW5kb3c7CisKK3ZhciBkZWZpbmVk
ID0geworCWRvY3VtZW50OiB3aW5kb3cgJiYgd2luZG93LmRvY3VtZW50ICE9PSB1bmRlZmluZWQs
CisJc2V0VGltZW91dDogc2V0VGltZW91dCAhPT0gdW5kZWZpbmVkLAorCXNlc3Npb25TdG9yYWdl
OiAoZnVuY3Rpb24oKSB7CisJCXZhciB4ID0gInF1bml0LXRlc3Qtc3RyaW5nIjsKKwkJdHJ5IHsK
KwkJCXNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIHgsIHggKTsKKwkJCXNlc3Npb25TdG9yYWdlLnJl
bW92ZUl0ZW0oIHggKTsKKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoICggZSApIHsKKwkJCXJl
dHVybiBmYWxzZTsKKwkJfQorCX0oKSApCit9OworCit2YXIgZmlsZU5hbWUgPSAoIHNvdXJjZUZy
b21TdGFja3RyYWNlKCAwICkgfHwgIiIgKS5yZXBsYWNlKCAvKDpcZCspK1wpPy8sICIiICkucmVw
bGFjZSggLy4rXC8vLCAiIiApOwordmFyIGdsb2JhbFN0YXJ0Q2FsbGVkID0gZmFsc2U7Cit2YXIg
cnVuU3RhcnRlZCA9IGZhbHNlOworCit2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRv
U3RyaW5nLAorCWhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CisKKy8v
IHJldHVybnMgYSBuZXcgQXJyYXkgd2l0aCB0aGUgZWxlbWVudHMgdGhhdCBhcmUgaW4gYSBidXQg
bm90IGluIGIKK2Z1bmN0aW9uIGRpZmYoIGEsIGIgKSB7CisJdmFyIGksIGosCisJCXJlc3VsdCA9
IGEuc2xpY2UoKTsKKworCWZvciAoIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrICkgewor
CQlmb3IgKCBqID0gMDsgaiA8IGIubGVuZ3RoOyBqKysgKSB7CisJCQlpZiAoIHJlc3VsdFsgaSBd
ID09PSBiWyBqIF0gKSB7CisJCQkJcmVzdWx0LnNwbGljZSggaSwgMSApOworCQkJCWktLTsKKwkJ
CQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvLyBmcm9tIGpx
dWVyeS5qcworZnVuY3Rpb24gaW5BcnJheSggZWxlbSwgYXJyYXkgKSB7CisJaWYgKCBhcnJheS5p
bmRleE9mICkgeworCQlyZXR1cm4gYXJyYXkuaW5kZXhPZiggZWxlbSApOworCX0KKworCWZvciAo
IHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJ
CWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApIHsKKwkJCXJldHVybiBpOworCQl9CisJfQorCisJ
cmV0dXJuIC0xOworfQorCisvKioKKyAqIE1ha2VzIGEgY2xvbmUgb2YgYW4gb2JqZWN0IHVzaW5n
IG9ubHkgQXJyYXkgb3IgT2JqZWN0IGFzIGJhc2UsCisgKiBhbmQgY29waWVzIG92ZXIgdGhlIG93
biBlbnVtZXJhYmxlIHByb3BlcnRpZXMuCisgKgorICogQHBhcmFtIHtPYmplY3R9IG9iagorICog
QHJldHVybiB7T2JqZWN0fSBOZXcgb2JqZWN0IHdpdGggb25seSB0aGUgb3duIHByb3BlcnRpZXMg
KHJlY3Vyc2l2ZWx5KS4KKyAqLworZnVuY3Rpb24gb2JqZWN0VmFsdWVzICggb2JqICkgeworCXZh
ciBrZXksIHZhbCwKKwkJdmFscyA9IFFVbml0LmlzKCAiYXJyYXkiLCBvYmogKSA/IFtdIDoge307
CisJZm9yICgga2V5IGluIG9iaiApIHsKKwkJaWYgKCBoYXNPd24uY2FsbCggb2JqLCBrZXkgKSAp
IHsKKwkJCXZhbCA9IG9ialsga2V5IF07CisJCQl2YWxzWyBrZXkgXSA9IHZhbCA9PT0gT2JqZWN0
KCB2YWwgKSA/IG9iamVjdFZhbHVlcyggdmFsICkgOiB2YWw7CisJCX0KKwl9CisJcmV0dXJuIHZh
bHM7Cit9CisKK2Z1bmN0aW9uIGV4dGVuZCggYSwgYiwgdW5kZWZPbmx5ICkgeworCWZvciAoIHZh
ciBwcm9wIGluIGIgKSB7CisJCWlmICggaGFzT3duLmNhbGwoIGIsIHByb3AgKSApIHsKKworCQkJ
Ly8gQXZvaWQgIk1lbWJlciBub3QgZm91bmQiIGVycm9yIGluIElFOCBjYXVzZWQgYnkgbWVzc2lu
ZyB3aXRoIHdpbmRvdy5jb25zdHJ1Y3RvcgorCQkJLy8gVGhpcyBibG9jayBydW5zIG9uIGV2ZXJ5
IGVudmlyb25tZW50LCBzbyBgZ2xvYmFsYCBpcyBiZWluZyB1c2VkIGluc3RlYWQgb2YgYHdpbmRv
d2AKKwkJCS8vIHRvIGF2b2lkIGVycm9ycyBvbiBub2RlLgorCQkJaWYgKCBwcm9wICE9PSAiY29u
c3RydWN0b3IiIHx8IGEgIT09IGdsb2JhbCApIHsKKwkJCQlpZiAoIGJbIHByb3AgXSA9PT0gdW5k
ZWZpbmVkICkgeworCQkJCQlkZWxldGUgYVsgcHJvcCBdOworCQkJCX0gZWxzZSBpZiAoICEoIHVu
ZGVmT25seSAmJiB0eXBlb2YgYVsgcHJvcCBdICE9PSAidW5kZWZpbmVkIiApICkgeworCQkJCQlh
WyBwcm9wIF0gPSBiWyBwcm9wIF07CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGE7
Cit9CisKK2Z1bmN0aW9uIG9iamVjdFR5cGUoIG9iaiApIHsKKwlpZiAoIHR5cGVvZiBvYmogPT09
ICJ1bmRlZmluZWQiICkgeworCQlyZXR1cm4gInVuZGVmaW5lZCI7CisJfQorCisJLy8gQ29uc2lk
ZXI6IHR5cGVvZiBudWxsID09PSBvYmplY3QKKwlpZiAoIG9iaiA9PT0gbnVsbCApIHsKKwkJcmV0
dXJuICJudWxsIjsKKwl9CisKKwl2YXIgbWF0Y2ggPSB0b1N0cmluZy5jYWxsKCBvYmogKS5tYXRj
aCggL15cW29iamVjdFxzKC4qKVxdJC8gKSwKKwkJdHlwZSA9IG1hdGNoICYmIG1hdGNoWyAxIF07
CisKKwlzd2l0Y2ggKCB0eXBlICkgeworCQljYXNlICJOdW1iZXIiOgorCQkJaWYgKCBpc05hTigg
b2JqICkgKSB7CisJCQkJcmV0dXJuICJuYW4iOworCQkJfQorCQkJcmV0dXJuICJudW1iZXIiOwor
CQljYXNlICJTdHJpbmciOgorCQljYXNlICJCb29sZWFuIjoKKwkJY2FzZSAiQXJyYXkiOgorCQlj
YXNlICJTZXQiOgorCQljYXNlICJNYXAiOgorCQljYXNlICJEYXRlIjoKKwkJY2FzZSAiUmVnRXhw
IjoKKwkJY2FzZSAiRnVuY3Rpb24iOgorCQljYXNlICJTeW1ib2wiOgorCQkJcmV0dXJuIHR5cGUu
dG9Mb3dlckNhc2UoKTsKKwl9CisJaWYgKCB0eXBlb2Ygb2JqID09PSAib2JqZWN0IiApIHsKKwkJ
cmV0dXJuICJvYmplY3QiOworCX0KK30KKworLy8gU2FmZSBvYmplY3QgdHlwZSBjaGVja2luZwor
ZnVuY3Rpb24gaXMoIHR5cGUsIG9iaiApIHsKKwlyZXR1cm4gUVVuaXQub2JqZWN0VHlwZSggb2Jq
ICkgPT09IHR5cGU7Cit9CisKK3ZhciBnZXRVcmxQYXJhbXMgPSBmdW5jdGlvbigpIHsKKwl2YXIg
aSwgY3VycmVudDsKKwl2YXIgdXJsUGFyYW1zID0ge307CisJdmFyIGxvY2F0aW9uID0gd2luZG93
LmxvY2F0aW9uOworCXZhciBwYXJhbXMgPSBsb2NhdGlvbi5zZWFyY2guc2xpY2UoIDEgKS5zcGxp
dCggIiYiICk7CisJdmFyIGxlbmd0aCA9IHBhcmFtcy5sZW5ndGg7CisKKwlpZiAoIHBhcmFtc1sg
MCBdICkgeworCQlmb3IgKCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJY3VycmVudCA9
IHBhcmFtc1sgaSBdLnNwbGl0KCAiPSIgKTsKKwkJCWN1cnJlbnRbIDAgXSA9IGRlY29kZVVSSUNv
bXBvbmVudCggY3VycmVudFsgMCBdICk7CisKKwkJCS8vIGFsbG93IGp1c3QgYSBrZXkgdG8gdHVy
biBvbiBhIGZsYWcsIGUuZy4sIHRlc3QuaHRtbD9ub2dsb2JhbHMKKwkJCWN1cnJlbnRbIDEgXSA9
IGN1cnJlbnRbIDEgXSA/IGRlY29kZVVSSUNvbXBvbmVudCggY3VycmVudFsgMSBdICkgOiB0cnVl
OworCQkJaWYgKCB1cmxQYXJhbXNbIGN1cnJlbnRbIDAgXSBdICkgeworCQkJCXVybFBhcmFtc1sg
Y3VycmVudFsgMCBdIF0gPSBbXS5jb25jYXQoIHVybFBhcmFtc1sgY3VycmVudFsgMCBdIF0sIGN1
cnJlbnRbIDEgXSApOworCQkJfSBlbHNlIHsKKwkJCQl1cmxQYXJhbXNbIGN1cnJlbnRbIDAgXSBd
ID0gY3VycmVudFsgMSBdOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHVybFBhcmFtczsKK307
CisKKy8vIERvZXNuJ3Qgc3VwcG9ydCBJRTYgdG8gSUU5LCBpdCB3aWxsIHJldHVybiB1bmRlZmlu
ZWQgb24gdGhlc2UgYnJvd3NlcnMKKy8vIFNlZSBhbHNvIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemls
bGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yL1N0YWNr
CitmdW5jdGlvbiBleHRyYWN0U3RhY2t0cmFjZSggZSwgb2Zmc2V0ICkgeworCW9mZnNldCA9IG9m
ZnNldCA9PT0gdW5kZWZpbmVkID8gNCA6IG9mZnNldDsKKworCXZhciBzdGFjaywgaW5jbHVkZSwg
aTsKKworCWlmICggZS5zdGFjayApIHsKKwkJc3RhY2sgPSBlLnN0YWNrLnNwbGl0KCAiXG4iICk7
CisJCWlmICggL15lcnJvciQvaS50ZXN0KCBzdGFja1sgMCBdICkgKSB7CisJCQlzdGFjay5zaGlm
dCgpOworCQl9CisJCWlmICggZmlsZU5hbWUgKSB7CisJCQlpbmNsdWRlID0gW107CisJCQlmb3Ig
KCBpID0gb2Zmc2V0OyBpIDwgc3RhY2subGVuZ3RoOyBpKysgKSB7CisJCQkJaWYgKCBzdGFja1sg
aSBdLmluZGV4T2YoIGZpbGVOYW1lICkgIT09IC0xICkgeworCQkJCQlicmVhazsKKwkJCQl9CisJ
CQkJaW5jbHVkZS5wdXNoKCBzdGFja1sgaSBdICk7CisJCQl9CisJCQlpZiAoIGluY2x1ZGUubGVu
Z3RoICkgeworCQkJCXJldHVybiBpbmNsdWRlLmpvaW4oICJcbiIgKTsKKwkJCX0KKwkJfQorCQly
ZXR1cm4gc3RhY2tbIG9mZnNldCBdOworCisJLy8gU3VwcG9ydDogU2FmYXJpIDw9NiBvbmx5CisJ
fSBlbHNlIGlmICggZS5zb3VyY2VVUkwgKSB7CisKKwkJLy8gZXhjbHVkZSB1c2VsZXNzIHNlbGYt
cmVmZXJlbmNlIGZvciBnZW5lcmF0ZWQgRXJyb3Igb2JqZWN0cworCQlpZiAoIC9xdW5pdC5qcyQv
LnRlc3QoIGUuc291cmNlVVJMICkgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBmb3IgYWN0
dWFsIGV4Y2VwdGlvbnMsIHRoaXMgaXMgdXNlZnVsCisJCXJldHVybiBlLnNvdXJjZVVSTCArICI6
IiArIGUubGluZTsKKwl9Cit9CisKK2Z1bmN0aW9uIHNvdXJjZUZyb21TdGFja3RyYWNlKCBvZmZz
ZXQgKSB7CisJdmFyIGVycm9yID0gbmV3IEVycm9yKCk7CisKKwkvLyBTdXBwb3J0OiBTYWZhcmkg
PD03IG9ubHksIElFIDw9MTAgLSAxMSBvbmx5CisJLy8gTm90IGFsbCBicm93c2VycyBnZW5lcmF0
ZSB0aGUgYHN0YWNrYCBwcm9wZXJ0eSBmb3IgYG5ldyBFcnJvcigpYCwgc2VlIGFsc28gIzYzNgor
CWlmICggIWVycm9yLnN0YWNrICkgeworCQl0cnkgeworCQkJdGhyb3cgZXJyb3I7CisJCX0gY2F0
Y2ggKCBlcnIgKSB7CisJCQllcnJvciA9IGVycjsKKwkJfQorCX0KKworCXJldHVybiBleHRyYWN0
U3RhY2t0cmFjZSggZXJyb3IsIG9mZnNldCApOworfQorCisvKioKKyAqIENvbmZpZyBvYmplY3Q6
IE1haW50YWluIGludGVybmFsIHN0YXRlCisgKiBMYXRlciBleHBvc2VkIGFzIFFVbml0LmNvbmZp
ZworICogYGNvbmZpZ2AgaW5pdGlhbGl6ZWQgYXQgdG9wIG9mIHNjb3BlCisgKi8KK3ZhciBjb25m
aWcgPSB7CisJLy8gVGhlIHF1ZXVlIG9mIHRlc3RzIHRvIHJ1bgorCXF1ZXVlOiBbXSwKKworCS8v
IGJsb2NrIHVudGlsIGRvY3VtZW50IHJlYWR5CisJYmxvY2tpbmc6IHRydWUsCisKKwkvLyBieSBk
ZWZhdWx0LCBydW4gcHJldmlvdXNseSBmYWlsZWQgdGVzdHMgZmlyc3QKKwkvLyB2ZXJ5IHVzZWZ1
bCBpbiBjb21iaW5hdGlvbiB3aXRoICJIaWRlIHBhc3NlZCB0ZXN0cyIgY2hlY2tlZAorCXJlb3Jk
ZXI6IHRydWUsCisKKwkvLyBieSBkZWZhdWx0LCBtb2RpZnkgZG9jdW1lbnQudGl0bGUgd2hlbiBz
dWl0ZSBpcyBkb25lCisJYWx0ZXJ0aXRsZTogdHJ1ZSwKKworCS8vIEhUTUwgUmVwb3J0ZXI6IGNv
bGxhcHNlIGV2ZXJ5IHRlc3QgZXhjZXB0IHRoZSBmaXJzdCBmYWlsaW5nIHRlc3QKKwkvLyBJZiBm
YWxzZSwgYWxsIGZhaWxpbmcgdGVzdHMgd2lsbCBiZSBleHBhbmRlZAorCWNvbGxhcHNlOiB0cnVl
LAorCisJLy8gYnkgZGVmYXVsdCwgc2Nyb2xsIHRvIHRvcCBvZiB0aGUgcGFnZSB3aGVuIHN1aXRl
IGlzIGRvbmUKKwlzY3JvbGx0b3A6IHRydWUsCisKKwkvLyBkZXB0aCB1cC10byB3aGljaCBvYmpl
Y3Qgd2lsbCBiZSBkdW1wZWQKKwltYXhEZXB0aDogNSwKKworCS8vIHdoZW4gZW5hYmxlZCwgYWxs
IHRlc3RzIG11c3QgY2FsbCBleHBlY3QoKQorCXJlcXVpcmVFeHBlY3RzOiBmYWxzZSwKKworCS8v
IGFkZCBjaGVja2JveGVzIHRoYXQgYXJlIHBlcnNpc3RlZCBpbiB0aGUgcXVlcnktc3RyaW5nCisJ
Ly8gd2hlbiBlbmFibGVkLCB0aGUgaWQgaXMgc2V0IHRvIGB0cnVlYCBhcyBhIGBRVW5pdC5jb25m
aWdgIHByb3BlcnR5CisJdXJsQ29uZmlnOiBbCisJCXsKKwkJCWlkOiAiaGlkZXBhc3NlZCIsCisJ
CQlsYWJlbDogIkhpZGUgcGFzc2VkIHRlc3RzIiwKKwkJCXRvb2x0aXA6ICJPbmx5IHNob3cgdGVz
dHMgYW5kIGFzc2VydGlvbnMgdGhhdCBmYWlsLiBTdG9yZWQgYXMgcXVlcnktc3RyaW5ncy4iCisJ
CX0sCisJCXsKKwkJCWlkOiAibm9nbG9iYWxzIiwKKwkJCWxhYmVsOiAiQ2hlY2sgZm9yIEdsb2Jh
bHMiLAorCQkJdG9vbHRpcDogIkVuYWJsaW5nIHRoaXMgd2lsbCB0ZXN0IGlmIGFueSB0ZXN0IGlu
dHJvZHVjZXMgbmV3IHByb3BlcnRpZXMgb24gdGhlICIgKworCQkJCSJnbG9iYWwgb2JqZWN0IChg
d2luZG93YCBpbiBCcm93c2VycykuIFN0b3JlZCBhcyBxdWVyeS1zdHJpbmdzLiIKKwkJfSwKKwkJ
eworCQkJaWQ6ICJub3RyeWNhdGNoIiwKKwkJCWxhYmVsOiAiTm8gdHJ5LWNhdGNoIiwKKwkJCXRv
b2x0aXA6ICJFbmFibGluZyB0aGlzIHdpbGwgcnVuIHRlc3RzIG91dHNpZGUgb2YgYSB0cnktY2F0
Y2ggYmxvY2suIE1ha2VzIGRlYnVnZ2luZyAiICsKKwkJCQkiZXhjZXB0aW9ucyBpbiBJRSByZWFz
b25hYmxlLiBTdG9yZWQgYXMgcXVlcnktc3RyaW5ncy4iCisJCX0KKwldLAorCisJLy8gU2V0IG9m
IGFsbCBtb2R1bGVzLgorCW1vZHVsZXM6IFtdLAorCisJLy8gU3RhY2sgb2YgbmVzdGVkIG1vZHVs
ZXMKKwltb2R1bGVTdGFjazogW10sCisKKwkvLyBUaGUgZmlyc3QgdW5uYW1lZCBtb2R1bGUKKwlj
dXJyZW50TW9kdWxlOiB7CisJCW5hbWU6ICIiLAorCQl0ZXN0czogW10KKwl9LAorCisJY2FsbGJh
Y2tzOiB7fQorfTsKKwordmFyIHVybFBhcmFtcyA9IGRlZmluZWQuZG9jdW1lbnQgPyBnZXRVcmxQ
YXJhbXMoKSA6IHt9OworCisvLyBQdXNoIGEgbG9vc2UgdW5uYW1lZCBtb2R1bGUgdG8gdGhlIG1v
ZHVsZXMgY29sbGVjdGlvbgorY29uZmlnLm1vZHVsZXMucHVzaCggY29uZmlnLmN1cnJlbnRNb2R1
bGUgKTsKKworaWYgKCB1cmxQYXJhbXMuZmlsdGVyID09PSB0cnVlICkgeworCWRlbGV0ZSB1cmxQ
YXJhbXMuZmlsdGVyOworfQorCisvLyBTdHJpbmcgc2VhcmNoIGFueXdoZXJlIGluIG1vZHVsZU5h
bWUrdGVzdE5hbWUKK2NvbmZpZy5maWx0ZXIgPSB1cmxQYXJhbXMuZmlsdGVyOworCitjb25maWcu
dGVzdElkID0gW107CitpZiAoIHVybFBhcmFtcy50ZXN0SWQgKSB7CisJLy8gRW5zdXJlIHRoYXQg
dXJsUGFyYW1zLnRlc3RJZCBpcyBhbiBhcnJheQorCXVybFBhcmFtcy50ZXN0SWQgPSBkZWNvZGVV
UklDb21wb25lbnQoIHVybFBhcmFtcy50ZXN0SWQgKS5zcGxpdCggIiwiICk7CisJZm9yICh2YXIg
aSA9IDA7IGkgPCB1cmxQYXJhbXMudGVzdElkLmxlbmd0aDsgaSsrICkgeworCQljb25maWcudGVz
dElkLnB1c2goIHVybFBhcmFtcy50ZXN0SWRbIGkgXSApOworCX0KK30KKwordmFyIGxvZ2dpbmdD
YWxsYmFja3MgPSB7fTsKKworLy8gUmVnaXN0ZXIgbG9nZ2luZyBjYWxsYmFja3MKK2Z1bmN0aW9u
IHJlZ2lzdGVyTG9nZ2luZ0NhbGxiYWNrcyggb2JqICkgeworCXZhciBpLCBsLCBrZXksCisJCWNh
bGxiYWNrTmFtZXMgPSBbICJiZWdpbiIsICJkb25lIiwgImxvZyIsICJ0ZXN0U3RhcnQiLCAidGVz
dERvbmUiLAorCQkJIm1vZHVsZVN0YXJ0IiwgIm1vZHVsZURvbmUiIF07CisKKwlmdW5jdGlvbiBy
ZWdpc3RlckxvZ2dpbmdDYWxsYmFjaygga2V5ICkgeworCQl2YXIgbG9nZ2luZ0NhbGxiYWNrID0g
ZnVuY3Rpb24oIGNhbGxiYWNrICkgeworCQkJaWYgKCBvYmplY3RUeXBlKCBjYWxsYmFjayApICE9
PSAiZnVuY3Rpb24iICkgeworCQkJCXRocm93IG5ldyBFcnJvcigKKwkJCQkJIlFVbml0IGxvZ2dp
bmcgbWV0aG9kcyByZXF1aXJlIGEgY2FsbGJhY2sgZnVuY3Rpb24gYXMgdGhlaXIgZmlyc3QgcGFy
YW1ldGVycy4iCisJCQkJKTsKKwkJCX0KKworCQkJY29uZmlnLmNhbGxiYWNrc1sga2V5IF0ucHVz
aCggY2FsbGJhY2sgKTsKKwkJfTsKKworCQkvLyBERVBSRUNBVEVEOiBUaGlzIHdpbGwgYmUgcmVt
b3ZlZCBvbiBRVW5pdCAyLjAuMCsKKwkJLy8gU3RvcmVzIHRoZSByZWdpc3RlcmVkIGZ1bmN0aW9u
cyBhbGxvd2luZyByZXN0b3JpbmcKKwkJLy8gYXQgdmVyaWZ5TG9nZ2luZ0NhbGxiYWNrcygpIGlm
IG1vZGlmaWVkCisJCWxvZ2dpbmdDYWxsYmFja3NbIGtleSBdID0gbG9nZ2luZ0NhbGxiYWNrOwor
CisJCXJldHVybiBsb2dnaW5nQ2FsbGJhY2s7CisJfQorCisJZm9yICggaSA9IDAsIGwgPSBjYWxs
YmFja05hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJa2V5ID0gY2FsbGJhY2tOYW1lc1sg
aSBdOworCisJCS8vIEluaXRpYWxpemUga2V5IGNvbGxlY3Rpb24gb2YgbG9nZ2luZyBjYWxsYmFj
aworCQlpZiAoIG9iamVjdFR5cGUoIGNvbmZpZy5jYWxsYmFja3NbIGtleSBdICkgPT09ICJ1bmRl
ZmluZWQiICkgeworCQkJY29uZmlnLmNhbGxiYWNrc1sga2V5IF0gPSBbXTsKKwkJfQorCisJCW9i
alsga2V5IF0gPSByZWdpc3RlckxvZ2dpbmdDYWxsYmFjaygga2V5ICk7CisJfQorfQorCitmdW5j
dGlvbiBydW5Mb2dnaW5nQ2FsbGJhY2tzKCBrZXksIGFyZ3MgKSB7CisJdmFyIGksIGwsIGNhbGxi
YWNrczsKKworCWNhbGxiYWNrcyA9IGNvbmZpZy5jYWxsYmFja3NbIGtleSBdOworCWZvciAoIGkg
PSAwLCBsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJY2FsbGJhY2tzWyBp
IF0oIGFyZ3MgKTsKKwl9Cit9CisKKy8vIERFUFJFQ0FURUQ6IFRoaXMgd2lsbCBiZSByZW1vdmVk
IG9uIDIuMC4wKworLy8gVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyBpZiB0aGUgbG9nZ2luZ0NhbGxi
YWNrcyB3ZXJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyCisvLyBJZiBzbywgaXQgd2lsbCByZXN0b3Jl
IGl0LCBhc3NpZ24gdGhlIGdpdmVuIGNhbGxiYWNrIGFuZCBwcmludCBhIGNvbnNvbGUgd2Fybmlu
ZworZnVuY3Rpb24gdmVyaWZ5TG9nZ2luZ0NhbGxiYWNrcygpIHsKKwl2YXIgbG9nZ2luZ0NhbGxi
YWNrLCB1c2VyQ2FsbGJhY2s7CisKKwlmb3IgKCBsb2dnaW5nQ2FsbGJhY2sgaW4gbG9nZ2luZ0Nh
bGxiYWNrcyApIHsKKwkJaWYgKCBRVW5pdFsgbG9nZ2luZ0NhbGxiYWNrIF0gIT09IGxvZ2dpbmdD
YWxsYmFja3NbIGxvZ2dpbmdDYWxsYmFjayBdICkgeworCisJCQl1c2VyQ2FsbGJhY2sgPSBRVW5p
dFsgbG9nZ2luZ0NhbGxiYWNrIF07CisKKwkJCS8vIFJlc3RvcmUgdGhlIGNhbGxiYWNrIGZ1bmN0
aW9uCisJCQlRVW5pdFsgbG9nZ2luZ0NhbGxiYWNrIF0gPSBsb2dnaW5nQ2FsbGJhY2tzWyBsb2dn
aW5nQ2FsbGJhY2sgXTsKKworCQkJLy8gQXNzaWduIHRoZSBkZXByZWNhdGVkIGdpdmVuIGNhbGxi
YWNrCisJCQlRVW5pdFsgbG9nZ2luZ0NhbGxiYWNrIF0oIHVzZXJDYWxsYmFjayApOworCisJCQlp
ZiAoIGdsb2JhbC5jb25zb2xlICYmIGdsb2JhbC5jb25zb2xlLndhcm4gKSB7CisJCQkJZ2xvYmFs
LmNvbnNvbGUud2FybigKKwkJCQkJIlFVbml0LiIgKyBsb2dnaW5nQ2FsbGJhY2sgKyAiIHdhcyBy
ZXBsYWNlZCB3aXRoIGEgbmV3IHZhbHVlLlxuIiArCisJCQkJCSJQbGVhc2UsIGNoZWNrIG91dCB0
aGUgZG9jdW1lbnRhdGlvbiBvbiBob3cgdG8gYXBwbHkgbG9nZ2luZyBjYWxsYmFja3MuXG4iICsK
KwkJCQkJIlJlZmVyZW5jZTogaHR0cDovL2FwaS5xdW5pdGpzLmNvbS9jYXRlZ29yeS9jYWxsYmFj
a3MvIgorCQkJCSk7CisJCQl9CisJCX0KKwl9Cit9CisKKyggZnVuY3Rpb24oKSB7CisJaWYgKCAh
ZGVmaW5lZC5kb2N1bWVudCApIHsKKwkJcmV0dXJuOworCX0KKworCS8vIGBvbkVycm9yRm5QcmV2
YCBpbml0aWFsaXplZCBhdCB0b3Agb2Ygc2NvcGUKKwkvLyBQcmVzZXJ2ZSBvdGhlciBoYW5kbGVy
cworCXZhciBvbkVycm9yRm5QcmV2ID0gd2luZG93Lm9uZXJyb3I7CisKKwkvLyBDb3ZlciB1bmNh
dWdodCBleGNlcHRpb25zCisJLy8gUmV0dXJuaW5nIHRydWUgd2lsbCBzdXBwcmVzcyB0aGUgZGVm
YXVsdCBicm93c2VyIGhhbmRsZXIsCisJLy8gcmV0dXJuaW5nIGZhbHNlIHdpbGwgbGV0IGl0IHJ1
bi4KKwl3aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uKCBlcnJvciwgZmlsZVBhdGgsIGxpbmVyTnIg
KSB7CisJCXZhciByZXQgPSBmYWxzZTsKKwkJaWYgKCBvbkVycm9yRm5QcmV2ICkgeworCQkJcmV0
ID0gb25FcnJvckZuUHJldiggZXJyb3IsIGZpbGVQYXRoLCBsaW5lck5yICk7CisJCX0KKworCQkv
LyBUcmVhdCByZXR1cm4gdmFsdWUgYXMgd2luZG93Lm9uZXJyb3IgaXRzZWxmIGRvZXMsCisJCS8v
IE9ubHkgZG8gb3VyIGhhbmRsaW5nIGlmIG5vdCBzdXBwcmVzc2VkLgorCQlpZiAoIHJldCAhPT0g
dHJ1ZSApIHsKKwkJCWlmICggUVVuaXQuY29uZmlnLmN1cnJlbnQgKSB7CisJCQkJaWYgKCBRVW5p
dC5jb25maWcuY3VycmVudC5pZ25vcmVHbG9iYWxFcnJvcnMgKSB7CisJCQkJCXJldHVybiB0cnVl
OworCQkJCX0KKwkJCQlRVW5pdC5wdXNoRmFpbHVyZSggZXJyb3IsIGZpbGVQYXRoICsgIjoiICsg
bGluZXJOciApOworCQkJfSBlbHNlIHsKKwkJCQlRVW5pdC50ZXN0KCAiZ2xvYmFsIGZhaWx1cmUi
LCBleHRlbmQoZnVuY3Rpb24oKSB7CisJCQkJCVFVbml0LnB1c2hGYWlsdXJlKCBlcnJvciwgZmls
ZVBhdGggKyAiOiIgKyBsaW5lck5yICk7CisJCQkJfSwgeyB2YWxpZFRlc3Q6IHRydWUgfSApICk7
CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gcmV0OworCX07Cit9ICko
KTsKKworUVVuaXQudXJsUGFyYW1zID0gdXJsUGFyYW1zOworCisvLyBGaWd1cmUgb3V0IGlmIHdl
J3JlIHJ1bm5pbmcgdGhlIHRlc3RzIGZyb20gYSBzZXJ2ZXIgb3Igbm90CitRVW5pdC5pc0xvY2Fs
ID0gISggZGVmaW5lZC5kb2N1bWVudCAmJiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgIT09ICJm
aWxlOiIgKTsKKworLy8gRXhwb3NlIHRoZSBjdXJyZW50IFFVbml0IHZlcnNpb24KK1FVbml0LnZl
cnNpb24gPSAiMS4yMC4wIjsKKworZXh0ZW5kKCBRVW5pdCwgeworCisJLy8gY2FsbCBvbiBzdGFy
dCBvZiBtb2R1bGUgdGVzdCB0byBwcmVwZW5kIG5hbWUgdG8gYWxsIHRlc3RzCisJbW9kdWxlOiBm
dW5jdGlvbiggbmFtZSwgdGVzdEVudmlyb25tZW50LCBleGVjdXRlTm93ICkgeworCQl2YXIgbW9k
dWxlLCBtb2R1bGVGbnM7CisJCXZhciBjdXJyZW50TW9kdWxlID0gY29uZmlnLmN1cnJlbnRNb2R1
bGU7CisKKwkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyICkgeworCQkJaWYgKCB0ZXN0RW52
aXJvbm1lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiApIHsKKwkJCQlleGVjdXRlTm93ID0gdGVzdEVu
dmlyb25tZW50OworCQkJCXRlc3RFbnZpcm9ubWVudCA9IHVuZGVmaW5lZDsKKwkJCX0KKwkJfQor
CisJCS8vIERFUFJFQ0FURUQ6IGhhbmRsZXMgc2V0dXAvdGVhcmRvd24gZnVuY3Rpb25zLAorCQkv
LyBiZWZvcmVFYWNoIGFuZCBhZnRlckVhY2ggc2hvdWxkIGJlIHVzZWQgaW5zdGVhZAorCQlpZiAo
IHRlc3RFbnZpcm9ubWVudCAmJiB0ZXN0RW52aXJvbm1lbnQuc2V0dXAgKSB7CisJCQl0ZXN0RW52
aXJvbm1lbnQuYmVmb3JlRWFjaCA9IHRlc3RFbnZpcm9ubWVudC5zZXR1cDsKKwkJCWRlbGV0ZSB0
ZXN0RW52aXJvbm1lbnQuc2V0dXA7CisJCX0KKwkJaWYgKCB0ZXN0RW52aXJvbm1lbnQgJiYgdGVz
dEVudmlyb25tZW50LnRlYXJkb3duICkgeworCQkJdGVzdEVudmlyb25tZW50LmFmdGVyRWFjaCA9
IHRlc3RFbnZpcm9ubWVudC50ZWFyZG93bjsKKwkJCWRlbGV0ZSB0ZXN0RW52aXJvbm1lbnQudGVh
cmRvd247CisJCX0KKworCQltb2R1bGUgPSBjcmVhdGVNb2R1bGUoKTsKKworCQltb2R1bGVGbnMg
PSB7CisJCQliZWZvcmVFYWNoOiBzZXRIb29rKCBtb2R1bGUsICJiZWZvcmVFYWNoIiApLAorCQkJ
YWZ0ZXJFYWNoOiBzZXRIb29rKCBtb2R1bGUsICJhZnRlckVhY2giICkKKwkJfTsKKworCQlpZiAo
IGV4ZWN1dGVOb3cgaW5zdGFuY2VvZiBGdW5jdGlvbiApIHsKKwkJCWNvbmZpZy5tb2R1bGVTdGFj
ay5wdXNoKCBtb2R1bGUgKTsKKwkJCXNldEN1cnJlbnRNb2R1bGUoIG1vZHVsZSApOworCQkJZXhl
Y3V0ZU5vdy5jYWxsKCBtb2R1bGUudGVzdEVudmlyb25tZW50LCBtb2R1bGVGbnMgKTsKKwkJCWNv
bmZpZy5tb2R1bGVTdGFjay5wb3AoKTsKKwkJCW1vZHVsZSA9IG1vZHVsZS5wYXJlbnRNb2R1bGUg
fHwgY3VycmVudE1vZHVsZTsKKwkJfQorCisJCXNldEN1cnJlbnRNb2R1bGUoIG1vZHVsZSApOwor
CisJCWZ1bmN0aW9uIGNyZWF0ZU1vZHVsZSgpIHsKKwkJCXZhciBwYXJlbnRNb2R1bGUgPSBjb25m
aWcubW9kdWxlU3RhY2subGVuZ3RoID8KKwkJCQljb25maWcubW9kdWxlU3RhY2suc2xpY2UoIC0x
IClbIDAgXSA6IG51bGw7CisJCQl2YXIgbW9kdWxlTmFtZSA9IHBhcmVudE1vZHVsZSAhPT0gbnVs
bCA/CisJCQkJWyBwYXJlbnRNb2R1bGUubmFtZSwgbmFtZSBdLmpvaW4oICIgPiAiICkgOiBuYW1l
OworCQkJdmFyIG1vZHVsZSA9IHsKKwkJCQluYW1lOiBtb2R1bGVOYW1lLAorCQkJCXBhcmVudE1v
ZHVsZTogcGFyZW50TW9kdWxlLAorCQkJCXRlc3RzOiBbXQorCQkJfTsKKworCQkJdmFyIGVudiA9
IHt9OworCQkJaWYgKCBwYXJlbnRNb2R1bGUgKSB7CisJCQkJZXh0ZW5kKCBlbnYsIHBhcmVudE1v
ZHVsZS50ZXN0RW52aXJvbm1lbnQgKTsKKwkJCQlkZWxldGUgZW52LmJlZm9yZUVhY2g7CisJCQkJ
ZGVsZXRlIGVudi5hZnRlckVhY2g7CisJCQl9CisJCQlleHRlbmQoIGVudiwgdGVzdEVudmlyb25t
ZW50ICk7CisJCQltb2R1bGUudGVzdEVudmlyb25tZW50ID0gZW52OworCisJCQljb25maWcubW9k
dWxlcy5wdXNoKCBtb2R1bGUgKTsKKwkJCXJldHVybiBtb2R1bGU7CisJCX0KKworCQlmdW5jdGlv
biBzZXRDdXJyZW50TW9kdWxlKCBtb2R1bGUgKSB7CisJCQljb25maWcuY3VycmVudE1vZHVsZSA9
IG1vZHVsZTsKKwkJfQorCisJfSwKKworCS8vIERFUFJFQ0FURUQ6IFFVbml0LmFzeW5jVGVzdCgp
IHdpbGwgYmUgcmVtb3ZlZCBpbiBRVW5pdCAyLjAuCisJYXN5bmNUZXN0OiBhc3luY1Rlc3QsCisK
Kwl0ZXN0OiB0ZXN0LAorCisJc2tpcDogc2tpcCwKKworCW9ubHk6IG9ubHksCisKKwkvLyBERVBS
RUNBVEVEOiBUaGUgZnVuY3Rpb25hbGl0eSBvZiBRVW5pdC5zdGFydCgpIHdpbGwgYmUgYWx0ZXJl
ZCBpbiBRVW5pdCAyLjAuCisJLy8gSW4gUVVuaXQgMi4wLCBpbnZva2luZyBpdCB3aWxsIE9OTFkg
YWZmZWN0IHRoZSBgUVVuaXQuY29uZmlnLmF1dG9zdGFydGAgYmxvY2tpbmcgYmVoYXZpb3IuCisJ
c3RhcnQ6IGZ1bmN0aW9uKCBjb3VudCApIHsKKwkJdmFyIGdsb2JhbFN0YXJ0QWxyZWFkeUNhbGxl
ZCA9IGdsb2JhbFN0YXJ0Q2FsbGVkOworCisJCWlmICggIWNvbmZpZy5jdXJyZW50ICkgeworCQkJ
Z2xvYmFsU3RhcnRDYWxsZWQgPSB0cnVlOworCisJCQlpZiAoIHJ1blN0YXJ0ZWQgKSB7CisJCQkJ
dGhyb3cgbmV3IEVycm9yKCAiQ2FsbGVkIHN0YXJ0KCkgb3V0c2lkZSBvZiBhIHRlc3QgY29udGV4
dCB3aGlsZSBhbHJlYWR5IHN0YXJ0ZWQiICk7CisJCQl9IGVsc2UgaWYgKCBnbG9iYWxTdGFydEFs
cmVhZHlDYWxsZWQgfHwgY291bnQgPiAxICkgeworCQkJCXRocm93IG5ldyBFcnJvciggIkNhbGxl
ZCBzdGFydCgpIG91dHNpZGUgb2YgYSB0ZXN0IGNvbnRleHQgdG9vIG1hbnkgdGltZXMiICk7CisJ
CQl9IGVsc2UgaWYgKCBjb25maWcuYXV0b3N0YXJ0ICkgeworCQkJCXRocm93IG5ldyBFcnJvcigg
IkNhbGxlZCBzdGFydCgpIG91dHNpZGUgb2YgYSB0ZXN0IGNvbnRleHQgd2hlbiAiICsKKwkJCQkJ
IlFVbml0LmNvbmZpZy5hdXRvc3RhcnQgd2FzIHRydWUiICk7CisJCQl9IGVsc2UgaWYgKCAhY29u
ZmlnLnBhZ2VMb2FkZWQgKSB7CisKKwkJCQkvLyBUaGUgcGFnZSBpc24ndCBjb21wbGV0ZWx5IGxv
YWRlZCB5ZXQsIHNvIGJhaWwgb3V0IGFuZCBsZXQgYFFVbml0LmxvYWRgIGhhbmRsZSBpdAorCQkJ
CWNvbmZpZy5hdXRvc3RhcnQgPSB0cnVlOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsK
KworCQkJLy8gSWYgYSB0ZXN0IGlzIHJ1bm5pbmcsIGFkanVzdCBpdHMgc2VtYXBob3JlCisJCQlj
b25maWcuY3VycmVudC5zZW1hcGhvcmUgLT0gY291bnQgfHwgMTsKKworCQkJLy8gSWYgc2VtYXBo
b3JlIGlzIG5vbi1udW1lcmljLCB0aHJvdyBlcnJvcgorCQkJaWYgKCBpc05hTiggY29uZmlnLmN1
cnJlbnQuc2VtYXBob3JlICkgKSB7CisJCQkJY29uZmlnLmN1cnJlbnQuc2VtYXBob3JlID0gMDsK
KworCQkJCVFVbml0LnB1c2hGYWlsdXJlKAorCQkJCQkiQ2FsbGVkIHN0YXJ0KCkgd2l0aCBhIG5v
bi1udW1lcmljIGRlY3JlbWVudC4iLAorCQkJCQlzb3VyY2VGcm9tU3RhY2t0cmFjZSggMiApCisJ
CQkJKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIERvbid0IHN0YXJ0IHVudGlsIGVxdWFs
IG51bWJlciBvZiBzdG9wLWNhbGxzCisJCQlpZiAoIGNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSA+
IDAgKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyB0aHJvdyBhbiBFcnJvciBpZiBzdGFy
dCBpcyBjYWxsZWQgbW9yZSBvZnRlbiB0aGFuIHN0b3AKKwkJCWlmICggY29uZmlnLmN1cnJlbnQu
c2VtYXBob3JlIDwgMCApIHsKKwkJCQljb25maWcuY3VycmVudC5zZW1hcGhvcmUgPSAwOworCisJ
CQkJUVVuaXQucHVzaEZhaWx1cmUoCisJCQkJCSJDYWxsZWQgc3RhcnQoKSB3aGlsZSBhbHJlYWR5
IHN0YXJ0ZWQgKHRlc3QncyBzZW1hcGhvcmUgd2FzIDAgYWxyZWFkeSkiLAorCQkJCQlzb3VyY2VG
cm9tU3RhY2t0cmFjZSggMiApCisJCQkJKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQly
ZXN1bWVQcm9jZXNzaW5nKCk7CisJfSwKKworCS8vIERFUFJFQ0FURUQ6IFFVbml0LnN0b3AoKSB3
aWxsIGJlIHJlbW92ZWQgaW4gUVVuaXQgMi4wLgorCXN0b3A6IGZ1bmN0aW9uKCBjb3VudCApIHsK
KworCQkvLyBJZiB0aGVyZSBpc24ndCBhIHRlc3QgcnVubmluZywgZG9uJ3QgYWxsb3cgUVVuaXQu
c3RvcCgpIHRvIGJlIGNhbGxlZAorCQlpZiAoICFjb25maWcuY3VycmVudCApIHsKKwkJCXRocm93
IG5ldyBFcnJvciggIkNhbGxlZCBzdG9wKCkgb3V0c2lkZSBvZiBhIHRlc3QgY29udGV4dCIgKTsK
KwkJfQorCisJCS8vIElmIGEgdGVzdCBpcyBydW5uaW5nLCBhZGp1c3QgaXRzIHNlbWFwaG9yZQor
CQljb25maWcuY3VycmVudC5zZW1hcGhvcmUgKz0gY291bnQgfHwgMTsKKworCQlwYXVzZVByb2Nl
c3NpbmcoKTsKKwl9LAorCisJY29uZmlnOiBjb25maWcsCisKKwlpczogaXMsCisKKwlvYmplY3RU
eXBlOiBvYmplY3RUeXBlLAorCisJZXh0ZW5kOiBleHRlbmQsCisKKwlsb2FkOiBmdW5jdGlvbigp
IHsKKwkJY29uZmlnLnBhZ2VMb2FkZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgdGhlIGNv
bmZpZ3VyYXRpb24gb3B0aW9ucworCQlleHRlbmQoIGNvbmZpZywgeworCQkJc3RhdHM6IHsgYWxs
OiAwLCBiYWQ6IDAgfSwKKwkJCW1vZHVsZVN0YXRzOiB7IGFsbDogMCwgYmFkOiAwIH0sCisJCQlz
dGFydGVkOiAwLAorCQkJdXBkYXRlUmF0ZTogMTAwMCwKKwkJCWF1dG9zdGFydDogdHJ1ZSwKKwkJ
CWZpbHRlcjogIiIKKwkJfSwgdHJ1ZSApOworCisJCWNvbmZpZy5ibG9ja2luZyA9IGZhbHNlOwor
CisJCWlmICggY29uZmlnLmF1dG9zdGFydCApIHsKKwkJCXJlc3VtZVByb2Nlc3NpbmcoKTsKKwkJ
fQorCX0sCisKKwlzdGFjazogZnVuY3Rpb24oIG9mZnNldCApIHsKKwkJb2Zmc2V0ID0gKCBvZmZz
ZXQgfHwgMCApICsgMjsKKwkJcmV0dXJuIHNvdXJjZUZyb21TdGFja3RyYWNlKCBvZmZzZXQgKTsK
Kwl9Cit9KTsKKworcmVnaXN0ZXJMb2dnaW5nQ2FsbGJhY2tzKCBRVW5pdCApOworCitmdW5jdGlv
biBiZWdpbigpIHsKKwl2YXIgaSwgbCwKKwkJbW9kdWxlc0xvZyA9IFtdOworCisJLy8gSWYgdGhl
IHRlc3QgcnVuIGhhc24ndCBvZmZpY2lhbGx5IGJlZ3VuIHlldAorCWlmICggIWNvbmZpZy5zdGFy
dGVkICkgeworCisJCS8vIFJlY29yZCB0aGUgdGltZSBvZiB0aGUgdGVzdCBydW4ncyBiZWdpbm5p
bmcKKwkJY29uZmlnLnN0YXJ0ZWQgPSBub3coKTsKKworCQl2ZXJpZnlMb2dnaW5nQ2FsbGJhY2tz
KCk7CisKKwkJLy8gRGVsZXRlIHRoZSBsb29zZSB1bm5hbWVkIG1vZHVsZSBpZiB1bnVzZWQuCisJ
CWlmICggY29uZmlnLm1vZHVsZXNbIDAgXS5uYW1lID09PSAiIiAmJiBjb25maWcubW9kdWxlc1sg
MCBdLnRlc3RzLmxlbmd0aCA9PT0gMCApIHsKKwkJCWNvbmZpZy5tb2R1bGVzLnNoaWZ0KCk7CisJ
CX0KKworCQkvLyBBdm9pZCB1bm5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBieSBub3QgbG9nZ2luZyBt
b2R1bGVzJyB0ZXN0IGVudmlyb25tZW50cworCQlmb3IgKCBpID0gMCwgbCA9IGNvbmZpZy5tb2R1
bGVzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCW1vZHVsZXNMb2cucHVzaCh7CisJCQkJbmFt
ZTogY29uZmlnLm1vZHVsZXNbIGkgXS5uYW1lLAorCQkJCXRlc3RzOiBjb25maWcubW9kdWxlc1sg
aSBdLnRlc3RzCisJCQl9KTsKKwkJfQorCisJCS8vIFRoZSB0ZXN0IHJ1biBpcyBvZmZpY2lhbGx5
IGJlZ2lubmluZyBub3cKKwkJcnVuTG9nZ2luZ0NhbGxiYWNrcyggImJlZ2luIiwgeworCQkJdG90
YWxUZXN0czogVGVzdC5jb3VudCwKKwkJCW1vZHVsZXM6IG1vZHVsZXNMb2cKKwkJfSk7CisJfQor
CisJY29uZmlnLmJsb2NraW5nID0gZmFsc2U7CisJcHJvY2VzcyggdHJ1ZSApOworfQorCitmdW5j
dGlvbiBwcm9jZXNzKCBsYXN0ICkgeworCWZ1bmN0aW9uIG5leHQoKSB7CisJCXByb2Nlc3MoIGxh
c3QgKTsKKwl9CisJdmFyIHN0YXJ0ID0gbm93KCk7CisJY29uZmlnLmRlcHRoID0gKCBjb25maWcu
ZGVwdGggfHwgMCApICsgMTsKKworCXdoaWxlICggY29uZmlnLnF1ZXVlLmxlbmd0aCAmJiAhY29u
ZmlnLmJsb2NraW5nICkgeworCQlpZiAoICFkZWZpbmVkLnNldFRpbWVvdXQgfHwgY29uZmlnLnVw
ZGF0ZVJhdGUgPD0gMCB8fAorCQkJCSggKCBub3coKSAtIHN0YXJ0ICkgPCBjb25maWcudXBkYXRl
UmF0ZSApICkgeworCQkJaWYgKCBjb25maWcuY3VycmVudCApIHsKKworCQkJCS8vIFJlc2V0IGFz
eW5jIHRyYWNraW5nIGZvciBlYWNoIHBoYXNlIG9mIHRoZSBUZXN0IGxpZmVjeWNsZQorCQkJCWNv
bmZpZy5jdXJyZW50LnVzZWRBc3luYyA9IGZhbHNlOworCQkJfQorCQkJY29uZmlnLnF1ZXVlLnNo
aWZ0KCkoKTsKKwkJfSBlbHNlIHsKKwkJCXNldFRpbWVvdXQoIG5leHQsIDEzICk7CisJCQlicmVh
azsKKwkJfQorCX0KKwljb25maWcuZGVwdGgtLTsKKwlpZiAoIGxhc3QgJiYgIWNvbmZpZy5ibG9j
a2luZyAmJiAhY29uZmlnLnF1ZXVlLmxlbmd0aCAmJiBjb25maWcuZGVwdGggPT09IDAgKSB7CisJ
CWRvbmUoKTsKKwl9Cit9CisKK2Z1bmN0aW9uIHBhdXNlUHJvY2Vzc2luZygpIHsKKwljb25maWcu
YmxvY2tpbmcgPSB0cnVlOworCisJaWYgKCBjb25maWcudGVzdFRpbWVvdXQgJiYgZGVmaW5lZC5z
ZXRUaW1lb3V0ICkgeworCQljbGVhclRpbWVvdXQoIGNvbmZpZy50aW1lb3V0ICk7CisJCWNvbmZp
Zy50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKKwkJCWlmICggY29uZmlnLmN1cnJl
bnQgKSB7CisJCQkJY29uZmlnLmN1cnJlbnQuc2VtYXBob3JlID0gMDsKKwkJCQlRVW5pdC5wdXNo
RmFpbHVyZSggIlRlc3QgdGltZWQgb3V0Iiwgc291cmNlRnJvbVN0YWNrdHJhY2UoIDIgKSApOwor
CQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoICJUZXN0IHRpbWVkIG91dCIgKTsKKwkJ
CX0KKwkJCXJlc3VtZVByb2Nlc3NpbmcoKTsKKwkJfSwgY29uZmlnLnRlc3RUaW1lb3V0ICk7CisJ
fQorfQorCitmdW5jdGlvbiByZXN1bWVQcm9jZXNzaW5nKCkgeworCXJ1blN0YXJ0ZWQgPSB0cnVl
OworCisJLy8gQSBzbGlnaHQgZGVsYXkgdG8gYWxsb3cgdGhpcyBpdGVyYXRpb24gb2YgdGhlIGV2
ZW50IGxvb3AgdG8gZmluaXNoIChtb3JlIGFzc2VydGlvbnMsIGV0Yy4pCisJaWYgKCBkZWZpbmVk
LnNldFRpbWVvdXQgKSB7CisJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisJCQlpZiAoIGNvbmZp
Zy5jdXJyZW50ICYmIGNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSA+IDAgKSB7CisJCQkJcmV0dXJu
OworCQkJfQorCQkJaWYgKCBjb25maWcudGltZW91dCApIHsKKwkJCQljbGVhclRpbWVvdXQoIGNv
bmZpZy50aW1lb3V0ICk7CisJCQl9CisKKwkJCWJlZ2luKCk7CisJCX0sIDEzICk7CisJfSBlbHNl
IHsKKwkJYmVnaW4oKTsKKwl9Cit9CisKK2Z1bmN0aW9uIGRvbmUoKSB7CisJdmFyIHJ1bnRpbWUs
IHBhc3NlZDsKKworCWNvbmZpZy5hdXRvcnVuID0gdHJ1ZTsKKworCS8vIExvZyB0aGUgbGFzdCBt
b2R1bGUgcmVzdWx0cworCWlmICggY29uZmlnLnByZXZpb3VzTW9kdWxlICkgeworCQlydW5Mb2dn
aW5nQ2FsbGJhY2tzKCAibW9kdWxlRG9uZSIsIHsKKwkJCW5hbWU6IGNvbmZpZy5wcmV2aW91c01v
ZHVsZS5uYW1lLAorCQkJdGVzdHM6IGNvbmZpZy5wcmV2aW91c01vZHVsZS50ZXN0cywKKwkJCWZh
aWxlZDogY29uZmlnLm1vZHVsZVN0YXRzLmJhZCwKKwkJCXBhc3NlZDogY29uZmlnLm1vZHVsZVN0
YXRzLmFsbCAtIGNvbmZpZy5tb2R1bGVTdGF0cy5iYWQsCisJCQl0b3RhbDogY29uZmlnLm1vZHVs
ZVN0YXRzLmFsbCwKKwkJCXJ1bnRpbWU6IG5vdygpIC0gY29uZmlnLm1vZHVsZVN0YXRzLnN0YXJ0
ZWQKKwkJfSk7CisJfQorCWRlbGV0ZSBjb25maWcucHJldmlvdXNNb2R1bGU7CisKKwlydW50aW1l
ID0gbm93KCkgLSBjb25maWcuc3RhcnRlZDsKKwlwYXNzZWQgPSBjb25maWcuc3RhdHMuYWxsIC0g
Y29uZmlnLnN0YXRzLmJhZDsKKworCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJkb25lIiwgeworCQlm
YWlsZWQ6IGNvbmZpZy5zdGF0cy5iYWQsCisJCXBhc3NlZDogcGFzc2VkLAorCQl0b3RhbDogY29u
ZmlnLnN0YXRzLmFsbCwKKwkJcnVudGltZTogcnVudGltZQorCX0pOworfQorCitmdW5jdGlvbiBz
ZXRIb29rKCBtb2R1bGUsIGhvb2tOYW1lICkgeworCWlmICggbW9kdWxlLnRlc3RFbnZpcm9ubWVu
dCA9PT0gdW5kZWZpbmVkICkgeworCQltb2R1bGUudGVzdEVudmlyb25tZW50ID0ge307CisJfQor
CisJcmV0dXJuIGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKKwkJbW9kdWxlLnRlc3RFbnZpcm9ubWVu
dFsgaG9va05hbWUgXSA9IGNhbGxiYWNrOworCX07Cit9CisKK3ZhciBmb2N1c2VkID0gZmFsc2U7
CisKK2Z1bmN0aW9uIFRlc3QoIHNldHRpbmdzICkgeworCXZhciBpLCBsOworCisJKytUZXN0LmNv
dW50OworCisJZXh0ZW5kKCB0aGlzLCBzZXR0aW5ncyApOworCXRoaXMuYXNzZXJ0aW9ucyA9IFtd
OworCXRoaXMuc2VtYXBob3JlID0gMDsKKwl0aGlzLnVzZWRBc3luYyA9IGZhbHNlOworCXRoaXMu
bW9kdWxlID0gY29uZmlnLmN1cnJlbnRNb2R1bGU7CisJdGhpcy5zdGFjayA9IHNvdXJjZUZyb21T
dGFja3RyYWNlKCAzICk7CisKKwkvLyBSZWdpc3RlciB1bmlxdWUgc3RyaW5ncworCWZvciAoIGkg
PSAwLCBsID0gdGhpcy5tb2R1bGUudGVzdHM7IGkgPCBsLmxlbmd0aDsgaSsrICkgeworCQlpZiAo
IHRoaXMubW9kdWxlLnRlc3RzWyBpIF0ubmFtZSA9PT0gdGhpcy50ZXN0TmFtZSApIHsKKwkJCXRo
aXMudGVzdE5hbWUgKz0gIiAiOworCQl9CisJfQorCisJdGhpcy50ZXN0SWQgPSBnZW5lcmF0ZUhh
c2goIHRoaXMubW9kdWxlLm5hbWUsIHRoaXMudGVzdE5hbWUgKTsKKworCXRoaXMubW9kdWxlLnRl
c3RzLnB1c2goeworCQluYW1lOiB0aGlzLnRlc3ROYW1lLAorCQl0ZXN0SWQ6IHRoaXMudGVzdElk
CisJfSk7CisKKwlpZiAoIHNldHRpbmdzLnNraXAgKSB7CisKKwkJLy8gU2tpcHBlZCB0ZXN0cyB3
aWxsIGZ1bGx5IGlnbm9yZSBhbnkgc2VudCBjYWxsYmFjaworCQl0aGlzLmNhbGxiYWNrID0gZnVu
Y3Rpb24oKSB7fTsKKwkJdGhpcy5hc3luYyA9IGZhbHNlOworCQl0aGlzLmV4cGVjdGVkID0gMDsK
Kwl9IGVsc2UgeworCQl0aGlzLmFzc2VydCA9IG5ldyBBc3NlcnQoIHRoaXMgKTsKKwl9Cit9CisK
K1Rlc3QuY291bnQgPSAwOworCitUZXN0LnByb3RvdHlwZSA9IHsKKwliZWZvcmU6IGZ1bmN0aW9u
KCkgeworCQlpZiAoCisKKwkJCS8vIEVtaXQgbW9kdWxlU3RhcnQgd2hlbiB3ZSdyZSBzd2l0Y2hp
bmcgZnJvbSBvbmUgbW9kdWxlIHRvIGFub3RoZXIKKwkJCXRoaXMubW9kdWxlICE9PSBjb25maWcu
cHJldmlvdXNNb2R1bGUgfHwKKworCQkJCS8vIFRoZXkgY291bGQgYmUgZXF1YWwgKGJvdGggdW5k
ZWZpbmVkKSBidXQgaWYgdGhlIHByZXZpb3VzTW9kdWxlIHByb3BlcnR5IGRvZXNuJ3QKKwkJCQkv
LyB5ZXQgZXhpc3QgaXQgbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgdGVzdCBpbiBhIHN1aXRlIHRo
YXQgaXNuJ3Qgd3JhcHBlZCBpbiBhCisJCQkJLy8gbW9kdWxlLCBpbiB3aGljaCBjYXNlIHdlJ2xs
IGp1c3QgZW1pdCBhIG1vZHVsZVN0YXJ0IGV2ZW50IGZvciAndW5kZWZpbmVkJy4KKwkJCQkvLyBX
aXRob3V0IHRoaXMsIHJlcG9ydGVycyBjYW4gZ2V0IHRlc3RTdGFydCBiZWZvcmUgbW9kdWxlU3Rh
cnQgIHdoaWNoIGlzIGEgcHJvYmxlbS4KKwkJCQkhaGFzT3duLmNhbGwoIGNvbmZpZywgInByZXZp
b3VzTW9kdWxlIiApCisJCSkgeworCQkJaWYgKCBoYXNPd24uY2FsbCggY29uZmlnLCAicHJldmlv
dXNNb2R1bGUiICkgKSB7CisJCQkJcnVuTG9nZ2luZ0NhbGxiYWNrcyggIm1vZHVsZURvbmUiLCB7
CisJCQkJCW5hbWU6IGNvbmZpZy5wcmV2aW91c01vZHVsZS5uYW1lLAorCQkJCQl0ZXN0czogY29u
ZmlnLnByZXZpb3VzTW9kdWxlLnRlc3RzLAorCQkJCQlmYWlsZWQ6IGNvbmZpZy5tb2R1bGVTdGF0
cy5iYWQsCisJCQkJCXBhc3NlZDogY29uZmlnLm1vZHVsZVN0YXRzLmFsbCAtIGNvbmZpZy5tb2R1
bGVTdGF0cy5iYWQsCisJCQkJCXRvdGFsOiBjb25maWcubW9kdWxlU3RhdHMuYWxsLAorCQkJCQly
dW50aW1lOiBub3coKSAtIGNvbmZpZy5tb2R1bGVTdGF0cy5zdGFydGVkCisJCQkJfSk7CisJCQl9
CisJCQljb25maWcucHJldmlvdXNNb2R1bGUgPSB0aGlzLm1vZHVsZTsKKwkJCWNvbmZpZy5tb2R1
bGVTdGF0cyA9IHsgYWxsOiAwLCBiYWQ6IDAsIHN0YXJ0ZWQ6IG5vdygpIH07CisJCQlydW5Mb2dn
aW5nQ2FsbGJhY2tzKCAibW9kdWxlU3RhcnQiLCB7CisJCQkJbmFtZTogdGhpcy5tb2R1bGUubmFt
ZSwKKwkJCQl0ZXN0czogdGhpcy5tb2R1bGUudGVzdHMKKwkJCX0pOworCQl9CisKKwkJY29uZmln
LmN1cnJlbnQgPSB0aGlzOworCisJCWlmICggdGhpcy5tb2R1bGUudGVzdEVudmlyb25tZW50ICkg
eworCQkJZGVsZXRlIHRoaXMubW9kdWxlLnRlc3RFbnZpcm9ubWVudC5iZWZvcmVFYWNoOworCQkJ
ZGVsZXRlIHRoaXMubW9kdWxlLnRlc3RFbnZpcm9ubWVudC5hZnRlckVhY2g7CisJCX0KKwkJdGhp
cy50ZXN0RW52aXJvbm1lbnQgPSBleHRlbmQoIHt9LCB0aGlzLm1vZHVsZS50ZXN0RW52aXJvbm1l
bnQgKTsKKworCQl0aGlzLnN0YXJ0ZWQgPSBub3coKTsKKwkJcnVuTG9nZ2luZ0NhbGxiYWNrcygg
InRlc3RTdGFydCIsIHsKKwkJCW5hbWU6IHRoaXMudGVzdE5hbWUsCisJCQltb2R1bGU6IHRoaXMu
bW9kdWxlLm5hbWUsCisJCQl0ZXN0SWQ6IHRoaXMudGVzdElkCisJCX0pOworCisJCWlmICggIWNv
bmZpZy5wb2xsdXRpb24gKSB7CisJCQlzYXZlR2xvYmFsKCk7CisJCX0KKwl9LAorCisJcnVuOiBm
dW5jdGlvbigpIHsKKwkJdmFyIHByb21pc2U7CisKKwkJY29uZmlnLmN1cnJlbnQgPSB0aGlzOwor
CisJCWlmICggdGhpcy5hc3luYyApIHsKKwkJCVFVbml0LnN0b3AoKTsKKwkJfQorCisJCXRoaXMu
Y2FsbGJhY2tTdGFydGVkID0gbm93KCk7CisKKwkJaWYgKCBjb25maWcubm90cnljYXRjaCApIHsK
KwkJCXJ1blRlc3QoIHRoaXMgKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXRyeSB7CisJCQlydW5U
ZXN0KCB0aGlzICk7CisJCX0gY2F0Y2ggKCBlICkgeworCQkJdGhpcy5wdXNoRmFpbHVyZSggIkRp
ZWQgb24gdGVzdCAjIiArICggdGhpcy5hc3NlcnRpb25zLmxlbmd0aCArIDEgKSArICIgIiArCisJ
CQkJdGhpcy5zdGFjayArICI6ICIgKyAoIGUubWVzc2FnZSB8fCBlICksIGV4dHJhY3RTdGFja3Ry
YWNlKCBlLCAwICkgKTsKKworCQkJLy8gZWxzZSBuZXh0IHRlc3Qgd2lsbCBjYXJyeSB0aGUgcmVz
cG9uc2liaWxpdHkKKwkJCXNhdmVHbG9iYWwoKTsKKworCQkJLy8gUmVzdGFydCB0aGUgdGVzdHMg
aWYgdGhleSdyZSBibG9ja2luZworCQkJaWYgKCBjb25maWcuYmxvY2tpbmcgKSB7CisJCQkJUVVu
aXQuc3RhcnQoKTsKKwkJCX0KKwkJfQorCisJCWZ1bmN0aW9uIHJ1blRlc3QoIHRlc3QgKSB7CisJ
CQlwcm9taXNlID0gdGVzdC5jYWxsYmFjay5jYWxsKCB0ZXN0LnRlc3RFbnZpcm9ubWVudCwgdGVz
dC5hc3NlcnQgKTsKKwkJCXRlc3QucmVzb2x2ZVByb21pc2UoIHByb21pc2UgKTsKKwkJfQorCX0s
CisKKwlhZnRlcjogZnVuY3Rpb24oKSB7CisJCWNoZWNrUG9sbHV0aW9uKCk7CisJfSwKKworCXF1
ZXVlSG9vazogZnVuY3Rpb24oIGhvb2ssIGhvb2tOYW1lICkgeworCQl2YXIgcHJvbWlzZSwKKwkJ
CXRlc3QgPSB0aGlzOworCQlyZXR1cm4gZnVuY3Rpb24gcnVuSG9vaygpIHsKKwkJCWNvbmZpZy5j
dXJyZW50ID0gdGVzdDsKKwkJCWlmICggY29uZmlnLm5vdHJ5Y2F0Y2ggKSB7CisJCQkJY2FsbEhv
b2soKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0cnkgeworCQkJCWNhbGxIb29rKCk7CisJCQl9
IGNhdGNoICggZXJyb3IgKSB7CisJCQkJdGVzdC5wdXNoRmFpbHVyZSggaG9va05hbWUgKyAiIGZh
aWxlZCBvbiAiICsgdGVzdC50ZXN0TmFtZSArICI6ICIgKworCQkJCSggZXJyb3IubWVzc2FnZSB8
fCBlcnJvciApLCBleHRyYWN0U3RhY2t0cmFjZSggZXJyb3IsIDAgKSApOworCQkJfQorCisJCQlm
dW5jdGlvbiBjYWxsSG9vaygpIHsKKwkJCQlwcm9taXNlID0gaG9vay5jYWxsKCB0ZXN0LnRlc3RF
bnZpcm9ubWVudCwgdGVzdC5hc3NlcnQgKTsKKwkJCQl0ZXN0LnJlc29sdmVQcm9taXNlKCBwcm9t
aXNlLCBob29rTmFtZSApOworCQkJfQorCQl9OworCX0sCisKKwkvLyBDdXJyZW50bHkgb25seSB1
c2VkIGZvciBtb2R1bGUgbGV2ZWwgaG9va3MsIGNhbiBiZSB1c2VkIHRvIGFkZCBnbG9iYWwgbGV2
ZWwgb25lcworCWhvb2tzOiBmdW5jdGlvbiggaGFuZGxlciApIHsKKwkJdmFyIGhvb2tzID0gW107
CisKKwkJZnVuY3Rpb24gcHJvY2Vzc0hvb2tzKCB0ZXN0LCBtb2R1bGUgKSB7CisJCQlpZiAoIG1v
ZHVsZS5wYXJlbnRNb2R1bGUgKSB7CisJCQkJcHJvY2Vzc0hvb2tzKCB0ZXN0LCBtb2R1bGUucGFy
ZW50TW9kdWxlICk7CisJCQl9CisJCQlpZiAoIG1vZHVsZS50ZXN0RW52aXJvbm1lbnQgJiYKKwkJ
CQlRVW5pdC5vYmplY3RUeXBlKCBtb2R1bGUudGVzdEVudmlyb25tZW50WyBoYW5kbGVyIF0gKSA9
PT0gImZ1bmN0aW9uIiApIHsKKwkJCQlob29rcy5wdXNoKCB0ZXN0LnF1ZXVlSG9vayggbW9kdWxl
LnRlc3RFbnZpcm9ubWVudFsgaGFuZGxlciBdLCBoYW5kbGVyICkgKTsKKwkJCX0KKwkJfQorCisJ
CS8vIEhvb2tzIGFyZSBpZ25vcmVkIG9uIHNraXBwZWQgdGVzdHMKKwkJaWYgKCAhdGhpcy5za2lw
ICkgeworCQkJcHJvY2Vzc0hvb2tzKCB0aGlzLCB0aGlzLm1vZHVsZSApOworCQl9CisJCXJldHVy
biBob29rczsKKwl9LAorCisJZmluaXNoOiBmdW5jdGlvbigpIHsKKwkJY29uZmlnLmN1cnJlbnQg
PSB0aGlzOworCQlpZiAoIGNvbmZpZy5yZXF1aXJlRXhwZWN0cyAmJiB0aGlzLmV4cGVjdGVkID09
PSBudWxsICkgeworCQkJdGhpcy5wdXNoRmFpbHVyZSggIkV4cGVjdGVkIG51bWJlciBvZiBhc3Nl
cnRpb25zIHRvIGJlIGRlZmluZWQsIGJ1dCBleHBlY3QoKSB3YXMgIiArCisJCQkJIm5vdCBjYWxs
ZWQuIiwgdGhpcy5zdGFjayApOworCQl9IGVsc2UgaWYgKCB0aGlzLmV4cGVjdGVkICE9PSBudWxs
ICYmIHRoaXMuZXhwZWN0ZWQgIT09IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGggKSB7CisJCQl0aGlz
LnB1c2hGYWlsdXJlKCAiRXhwZWN0ZWQgIiArIHRoaXMuZXhwZWN0ZWQgKyAiIGFzc2VydGlvbnMs
IGJ1dCAiICsKKwkJCQl0aGlzLmFzc2VydGlvbnMubGVuZ3RoICsgIiB3ZXJlIHJ1biIsIHRoaXMu
c3RhY2sgKTsKKwkJfSBlbHNlIGlmICggdGhpcy5leHBlY3RlZCA9PT0gbnVsbCAmJiAhdGhpcy5h
c3NlcnRpb25zLmxlbmd0aCApIHsKKwkJCXRoaXMucHVzaEZhaWx1cmUoICJFeHBlY3RlZCBhdCBs
ZWFzdCBvbmUgYXNzZXJ0aW9uLCBidXQgbm9uZSB3ZXJlIHJ1biAtIGNhbGwgIiArCisJCQkJImV4
cGVjdCgwKSB0byBhY2NlcHQgemVybyBhc3NlcnRpb25zLiIsIHRoaXMuc3RhY2sgKTsKKwkJfQor
CisJCXZhciBpLAorCQkJYmFkID0gMDsKKworCQl0aGlzLnJ1bnRpbWUgPSBub3coKSAtIHRoaXMu
c3RhcnRlZDsKKwkJY29uZmlnLnN0YXRzLmFsbCArPSB0aGlzLmFzc2VydGlvbnMubGVuZ3RoOwor
CQljb25maWcubW9kdWxlU3RhdHMuYWxsICs9IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGg7CisKKwkJ
Zm9yICggaSA9IDA7IGkgPCB0aGlzLmFzc2VydGlvbnMubGVuZ3RoOyBpKysgKSB7CisJCQlpZiAo
ICF0aGlzLmFzc2VydGlvbnNbIGkgXS5yZXN1bHQgKSB7CisJCQkJYmFkKys7CisJCQkJY29uZmln
LnN0YXRzLmJhZCsrOworCQkJCWNvbmZpZy5tb2R1bGVTdGF0cy5iYWQrKzsKKwkJCX0KKwkJfQor
CisJCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJ0ZXN0RG9uZSIsIHsKKwkJCW5hbWU6IHRoaXMudGVz
dE5hbWUsCisJCQltb2R1bGU6IHRoaXMubW9kdWxlLm5hbWUsCisJCQlza2lwcGVkOiAhIXRoaXMu
c2tpcCwKKwkJCWZhaWxlZDogYmFkLAorCQkJcGFzc2VkOiB0aGlzLmFzc2VydGlvbnMubGVuZ3Ro
IC0gYmFkLAorCQkJdG90YWw6IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGgsCisJCQlydW50aW1lOiB0
aGlzLnJ1bnRpbWUsCisKKwkJCS8vIEhUTUwgUmVwb3J0ZXIgdXNlCisJCQlhc3NlcnRpb25zOiB0
aGlzLmFzc2VydGlvbnMsCisJCQl0ZXN0SWQ6IHRoaXMudGVzdElkLAorCisJCQkvLyBTb3VyY2Ug
b2YgVGVzdAorCQkJc291cmNlOiB0aGlzLnN0YWNrLAorCisJCQkvLyBERVBSRUNBVEVEOiB0aGlz
IHByb3BlcnR5IHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjAuMCwgdXNlIHJ1bnRpbWUgaW5zdGVhZAor
CQkJZHVyYXRpb246IHRoaXMucnVudGltZQorCQl9KTsKKworCQkvLyBRVW5pdC5yZXNldCgpIGlz
IGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVwbGFjZWQgZm9yIGEgbmV3CisJCS8vIGZpeHR1cmUg
cmVzZXQgZnVuY3Rpb24gb24gUVVuaXQgMi4wLzIuMS4KKwkJLy8gSXQncyBzdGlsbCBjYWxsZWQg
aGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaGFuZGxpbmcKKwkJUVVuaXQucmVzZXQo
KTsKKworCQljb25maWcuY3VycmVudCA9IHVuZGVmaW5lZDsKKwl9LAorCisJcXVldWU6IGZ1bmN0
aW9uKCkgeworCQl2YXIgcHJpb3JpdHksCisJCQl0ZXN0ID0gdGhpczsKKworCQlpZiAoICF0aGlz
LnZhbGlkKCkgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlmdW5jdGlvbiBydW4oKSB7CisKKwkJ
CS8vIGVhY2ggb2YgdGhlc2UgY2FuIGJ5IGFzeW5jCisJCQlzeW5jaHJvbml6ZShbCisJCQkJZnVu
Y3Rpb24oKSB7CisJCQkJCXRlc3QuYmVmb3JlKCk7CisJCQkJfSwKKworCQkJCXRlc3QuaG9va3Mo
ICJiZWZvcmVFYWNoIiApLAorCQkJCWZ1bmN0aW9uKCkgeworCQkJCQl0ZXN0LnJ1bigpOworCQkJ
CX0sCisKKwkJCQl0ZXN0Lmhvb2tzKCAiYWZ0ZXJFYWNoIiApLnJldmVyc2UoKSwKKworCQkJCWZ1
bmN0aW9uKCkgeworCQkJCQl0ZXN0LmFmdGVyKCk7CisJCQkJfSwKKwkJCQlmdW5jdGlvbigpIHsK
KwkJCQkJdGVzdC5maW5pc2goKTsKKwkJCQl9CisJCQldKTsKKwkJfQorCisJCS8vIFByaW9yaXRp
emUgcHJldmlvdXNseSBmYWlsZWQgdGVzdHMsIGRldGVjdGVkIGZyb20gc2Vzc2lvblN0b3JhZ2UK
KwkJcHJpb3JpdHkgPSBRVW5pdC5jb25maWcucmVvcmRlciAmJiBkZWZpbmVkLnNlc3Npb25TdG9y
YWdlICYmCisJCQkJK3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oICJxdW5pdC10ZXN0LSIgKyB0aGlz
Lm1vZHVsZS5uYW1lICsgIi0iICsgdGhpcy50ZXN0TmFtZSApOworCisJCXJldHVybiBzeW5jaHJv
bml6ZSggcnVuLCBwcmlvcml0eSApOworCX0sCisKKwlwdXNoOiBmdW5jdGlvbiggcmVzdWx0LCBh
Y3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBuZWdhdGl2ZSApIHsKKwkJdmFyIHNvdXJjZSwKKwkJ
CWRldGFpbHMgPSB7CisJCQkJbW9kdWxlOiB0aGlzLm1vZHVsZS5uYW1lLAorCQkJCW5hbWU6IHRo
aXMudGVzdE5hbWUsCisJCQkJcmVzdWx0OiByZXN1bHQsCisJCQkJbWVzc2FnZTogbWVzc2FnZSwK
KwkJCQlhY3R1YWw6IGFjdHVhbCwKKwkJCQlleHBlY3RlZDogZXhwZWN0ZWQsCisJCQkJdGVzdElk
OiB0aGlzLnRlc3RJZCwKKwkJCQluZWdhdGl2ZTogbmVnYXRpdmUgfHwgZmFsc2UsCisJCQkJcnVu
dGltZTogbm93KCkgLSB0aGlzLnN0YXJ0ZWQKKwkJCX07CisKKwkJaWYgKCAhcmVzdWx0ICkgewor
CQkJc291cmNlID0gc291cmNlRnJvbVN0YWNrdHJhY2UoKTsKKworCQkJaWYgKCBzb3VyY2UgKSB7
CisJCQkJZGV0YWlscy5zb3VyY2UgPSBzb3VyY2U7CisJCQl9CisJCX0KKworCQlydW5Mb2dnaW5n
Q2FsbGJhY2tzKCAibG9nIiwgZGV0YWlscyApOworCisJCXRoaXMuYXNzZXJ0aW9ucy5wdXNoKHsK
KwkJCXJlc3VsdDogISFyZXN1bHQsCisJCQltZXNzYWdlOiBtZXNzYWdlCisJCX0pOworCX0sCisK
KwlwdXNoRmFpbHVyZTogZnVuY3Rpb24oIG1lc3NhZ2UsIHNvdXJjZSwgYWN0dWFsICkgeworCQlp
ZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBUZXN0ICkgKSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoICJw
dXNoRmFpbHVyZSgpIGFzc2VydGlvbiBvdXRzaWRlIHRlc3QgY29udGV4dCwgd2FzICIgKworCQkJ
CXNvdXJjZUZyb21TdGFja3RyYWNlKCAyICkgKTsKKwkJfQorCisJCXZhciBkZXRhaWxzID0gewor
CQkJCW1vZHVsZTogdGhpcy5tb2R1bGUubmFtZSwKKwkJCQluYW1lOiB0aGlzLnRlc3ROYW1lLAor
CQkJCXJlc3VsdDogZmFsc2UsCisJCQkJbWVzc2FnZTogbWVzc2FnZSB8fCAiZXJyb3IiLAorCQkJ
CWFjdHVhbDogYWN0dWFsIHx8IG51bGwsCisJCQkJdGVzdElkOiB0aGlzLnRlc3RJZCwKKwkJCQly
dW50aW1lOiBub3coKSAtIHRoaXMuc3RhcnRlZAorCQkJfTsKKworCQlpZiAoIHNvdXJjZSApIHsK
KwkJCWRldGFpbHMuc291cmNlID0gc291cmNlOworCQl9CisKKwkJcnVuTG9nZ2luZ0NhbGxiYWNr
cyggImxvZyIsIGRldGFpbHMgKTsKKworCQl0aGlzLmFzc2VydGlvbnMucHVzaCh7CisJCQlyZXN1
bHQ6IGZhbHNlLAorCQkJbWVzc2FnZTogbWVzc2FnZQorCQl9KTsKKwl9LAorCisJcmVzb2x2ZVBy
b21pc2U6IGZ1bmN0aW9uKCBwcm9taXNlLCBwaGFzZSApIHsKKwkJdmFyIHRoZW4sIG1lc3NhZ2Us
CisJCQl0ZXN0ID0gdGhpczsKKwkJaWYgKCBwcm9taXNlICE9IG51bGwgKSB7CisJCQl0aGVuID0g
cHJvbWlzZS50aGVuOworCQkJaWYgKCBRVW5pdC5vYmplY3RUeXBlKCB0aGVuICkgPT09ICJmdW5j
dGlvbiIgKSB7CisJCQkJUVVuaXQuc3RvcCgpOworCQkJCXRoZW4uY2FsbCgKKwkJCQkJcHJvbWlz
ZSwKKwkJCQkJZnVuY3Rpb24oKSB7IFFVbml0LnN0YXJ0KCk7IH0sCisJCQkJCWZ1bmN0aW9uKCBl
cnJvciApIHsKKwkJCQkJCW1lc3NhZ2UgPSAiUHJvbWlzZSByZWplY3RlZCAiICsKKwkJCQkJCQko
ICFwaGFzZSA/ICJkdXJpbmciIDogcGhhc2UucmVwbGFjZSggL0VhY2gkLywgIiIgKSApICsKKwkJ
CQkJCQkiICIgKyB0ZXN0LnRlc3ROYW1lICsgIjogIiArICggZXJyb3IubWVzc2FnZSB8fCBlcnJv
ciApOworCQkJCQkJdGVzdC5wdXNoRmFpbHVyZSggbWVzc2FnZSwgZXh0cmFjdFN0YWNrdHJhY2Uo
IGVycm9yLCAwICkgKTsKKworCQkJCQkJLy8gZWxzZSBuZXh0IHRlc3Qgd2lsbCBjYXJyeSB0aGUg
cmVzcG9uc2liaWxpdHkKKwkJCQkJCXNhdmVHbG9iYWwoKTsKKworCQkJCQkJLy8gVW5ibG9jawor
CQkJCQkJUVVuaXQuc3RhcnQoKTsKKwkJCQkJfQorCQkJCSk7CisJCQl9CisJCX0KKwl9LAorCisJ
dmFsaWQ6IGZ1bmN0aW9uKCkgeworCQl2YXIgaW5jbHVkZSwKKwkJCWZpbHRlciA9IGNvbmZpZy5m
aWx0ZXIgJiYgY29uZmlnLmZpbHRlci50b0xvd2VyQ2FzZSgpLAorCQkJbW9kdWxlID0gUVVuaXQu
dXJsUGFyYW1zLm1vZHVsZSAmJiBRVW5pdC51cmxQYXJhbXMubW9kdWxlLnRvTG93ZXJDYXNlKCks
CisJCQlmdWxsTmFtZSA9ICggdGhpcy5tb2R1bGUubmFtZSArICI6ICIgKyB0aGlzLnRlc3ROYW1l
ICkudG9Mb3dlckNhc2UoKTsKKworCQlmdW5jdGlvbiB0ZXN0SW5Nb2R1bGVDaGFpbiggdGVzdE1v
ZHVsZSApIHsKKwkJCXZhciB0ZXN0TW9kdWxlTmFtZSA9IHRlc3RNb2R1bGUubmFtZSA/IHRlc3RN
b2R1bGUubmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDsKKwkJCWlmICggdGVzdE1vZHVsZU5hbWUg
PT09IG1vZHVsZSApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoIHRlc3RNb2R1
bGUucGFyZW50TW9kdWxlICkgeworCQkJCXJldHVybiB0ZXN0SW5Nb2R1bGVDaGFpbiggdGVzdE1v
ZHVsZS5wYXJlbnRNb2R1bGUgKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJ
fQorCQl9CisKKwkJLy8gSW50ZXJuYWxseS1nZW5lcmF0ZWQgdGVzdHMgYXJlIGFsd2F5cyB2YWxp
ZAorCQlpZiAoIHRoaXMuY2FsbGJhY2sgJiYgdGhpcy5jYWxsYmFjay52YWxpZFRlc3QgKSB7CisJ
CQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCWlmICggY29uZmlnLnRlc3RJZC5sZW5ndGggPiAwICYm
IGluQXJyYXkoIHRoaXMudGVzdElkLCBjb25maWcudGVzdElkICkgPCAwICkgeworCQkJcmV0dXJu
IGZhbHNlOworCQl9CisKKwkJaWYgKCBtb2R1bGUgJiYgIXRlc3RJbk1vZHVsZUNoYWluKCB0aGlz
Lm1vZHVsZSApICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCAhZmlsdGVyICkg
eworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpbmNsdWRlID0gZmlsdGVyLmNoYXJBdCggMCAp
ICE9PSAiISI7CisJCWlmICggIWluY2x1ZGUgKSB7CisJCQlmaWx0ZXIgPSBmaWx0ZXIuc2xpY2Uo
IDEgKTsKKwkJfQorCisJCS8vIElmIHRoZSBmaWx0ZXIgbWF0Y2hlcywgd2UgbmVlZCB0byBob25v
dXIgaW5jbHVkZQorCQlpZiAoIGZ1bGxOYW1lLmluZGV4T2YoIGZpbHRlciApICE9PSAtMSApIHsK
KwkJCXJldHVybiBpbmNsdWRlOworCQl9CisKKwkJLy8gT3RoZXJ3aXNlLCBkbyB0aGUgb3Bwb3Np
dGUKKwkJcmV0dXJuICFpbmNsdWRlOworCX0KK307CisKKy8vIFJlc2V0cyB0aGUgdGVzdCBzZXR1
cC4gVXNlZnVsIGZvciB0ZXN0cyB0aGF0IG1vZGlmeSB0aGUgRE9NLgorLyoKK0RFUFJFQ0FURUQ6
IFVzZSBtdWx0aXBsZSB0ZXN0cyBpbnN0ZWFkIG9mIHJlc2V0dGluZyBpbnNpZGUgYSB0ZXN0Lgor
VXNlIHRlc3RTdGFydCBvciB0ZXN0RG9uZSBmb3IgY3VzdG9tIGNsZWFudXAuCitUaGlzIG1ldGhv
ZCB3aWxsIHRocm93IGFuIGVycm9yIGluIDIuMCwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjEK
KyovCitRVW5pdC5yZXNldCA9IGZ1bmN0aW9uKCkgeworCisJLy8gUmV0dXJuIG9uIG5vbi1icm93
c2VyIGVudmlyb25tZW50cworCS8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG5vdCBicmVhayBvbiBu
b2RlIHRlc3RzCisJaWYgKCAhZGVmaW5lZC5kb2N1bWVudCApIHsKKwkJcmV0dXJuOworCX0KKwor
CXZhciBmaXh0dXJlID0gZGVmaW5lZC5kb2N1bWVudCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJ
ZCAmJgorCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICJxdW5pdC1maXh0dXJlIiApOworCisJ
aWYgKCBmaXh0dXJlICkgeworCQlmaXh0dXJlLmlubmVySFRNTCA9IGNvbmZpZy5maXh0dXJlOwor
CX0KK307CisKK1FVbml0LnB1c2hGYWlsdXJlID0gZnVuY3Rpb24oKSB7CisJaWYgKCAhUVVuaXQu
Y29uZmlnLmN1cnJlbnQgKSB7CisJCXRocm93IG5ldyBFcnJvciggInB1c2hGYWlsdXJlKCkgYXNz
ZXJ0aW9uIG91dHNpZGUgdGVzdCBjb250ZXh0LCBpbiAiICsKKwkJCXNvdXJjZUZyb21TdGFja3Ry
YWNlKCAyICkgKTsKKwl9CisKKwkvLyBHZXRzIGN1cnJlbnQgdGVzdCBvYmoKKwl2YXIgY3VycmVu
dFRlc3QgPSBRVW5pdC5jb25maWcuY3VycmVudDsKKworCXJldHVybiBjdXJyZW50VGVzdC5wdXNo
RmFpbHVyZS5hcHBseSggY3VycmVudFRlc3QsIGFyZ3VtZW50cyApOworfTsKKworLy8gQmFzZWQg
b24gSmF2YSdzIFN0cmluZy5oYXNoQ29kZSwgYSBzaW1wbGUgYnV0IG5vdAorLy8gcmlnb3JvdXNs
eSBjb2xsaXNpb24gcmVzaXN0YW50IGhhc2hpbmcgZnVuY3Rpb24KK2Z1bmN0aW9uIGdlbmVyYXRl
SGFzaCggbW9kdWxlLCB0ZXN0TmFtZSApIHsKKwl2YXIgaGV4LAorCQlpID0gMCwKKwkJaGFzaCA9
IDAsCisJCXN0ciA9IG1vZHVsZSArICJceDFDIiArIHRlc3ROYW1lLAorCQlsZW4gPSBzdHIubGVu
Z3RoOworCisJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisJCWhhc2ggID0gKCAoIGhhc2ggPDwg
NSApIC0gaGFzaCApICsgc3RyLmNoYXJDb2RlQXQoIGkgKTsKKwkJaGFzaCB8PSAwOworCX0KKwor
CS8vIENvbnZlcnQgdGhlIHBvc3NpYmx5IG5lZ2F0aXZlIGludGVnZXIgaGFzaCBjb2RlIGludG8g
YW4gOCBjaGFyYWN0ZXIgaGV4IHN0cmluZywgd2hpY2ggaXNuJ3QKKwkvLyBzdHJpY3RseSBuZWNl
c3NhcnkgYnV0IGluY3JlYXNlcyB1c2VyIHVuZGVyc3RhbmRpbmcgdGhhdCB0aGUgaWQgaXMgYSBT
SEEtbGlrZSBoYXNoCisJaGV4ID0gKCAweDEwMDAwMDAwMCArIGhhc2ggKS50b1N0cmluZyggMTYg
KTsKKwlpZiAoIGhleC5sZW5ndGggPCA4ICkgeworCQloZXggPSAiMDAwMDAwMCIgKyBoZXg7CisJ
fQorCisJcmV0dXJuIGhleC5zbGljZSggLTggKTsKK30KKworZnVuY3Rpb24gc3luY2hyb25pemUo
IGNhbGxiYWNrLCBwcmlvcml0eSApIHsKKwl2YXIgbGFzdCA9ICFwcmlvcml0eTsKKworCWlmICgg
UVVuaXQub2JqZWN0VHlwZSggY2FsbGJhY2sgKSA9PT0gImFycmF5IiApIHsKKwkJd2hpbGUgKCBj
YWxsYmFjay5sZW5ndGggKSB7CisJCQlzeW5jaHJvbml6ZSggY2FsbGJhY2suc2hpZnQoKSApOwor
CQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoIHByaW9yaXR5ICkgeworCQlwcmlvcml0eUZpbGwo
IGNhbGxiYWNrICk7CisJfSBlbHNlIHsKKwkJY29uZmlnLnF1ZXVlLnB1c2goIGNhbGxiYWNrICk7
CisJfQorCisJaWYgKCBjb25maWcuYXV0b3J1biAmJiAhY29uZmlnLmJsb2NraW5nICkgeworCQlw
cm9jZXNzKCBsYXN0ICk7CisJfQorfQorCisvLyBQbGFjZSBwcmV2aW91c2x5IGZhaWxlZCB0ZXN0
cyBvbiBhIHF1ZXVlIHByaW9yaXR5IGxpbmUsIHJlc3BlY3RpbmcgdGhlIG9yZGVyIHRoZXkgZ2V0
IGFzc2lnbmVkLgorZnVuY3Rpb24gcHJpb3JpdHlGaWxsKCBjYWxsYmFjayApIHsKKwl2YXIgcXVl
dWUsIHByaW9yaXRpemVkUXVldWU7CisKKwlxdWV1ZSA9IGNvbmZpZy5xdWV1ZS5zbGljZSggcHJp
b3JpdHlGaWxsLnBvcyApOworCXByaW9yaXRpemVkUXVldWUgPSBjb25maWcucXVldWUuc2xpY2Uo
IDAsIC1jb25maWcucXVldWUubGVuZ3RoICsgcHJpb3JpdHlGaWxsLnBvcyApOworCisJcXVldWUu
dW5zaGlmdCggY2FsbGJhY2sgKTsKKwlxdWV1ZS51bnNoaWZ0LmFwcGx5KCBxdWV1ZSwgcHJpb3Jp
dGl6ZWRRdWV1ZSApOworCisJY29uZmlnLnF1ZXVlID0gcXVldWU7CisKKwlwcmlvcml0eUZpbGwu
cG9zICs9IDE7Cit9Citwcmlvcml0eUZpbGwucG9zID0gMDsKKworZnVuY3Rpb24gc2F2ZUdsb2Jh
bCgpIHsKKwljb25maWcucG9sbHV0aW9uID0gW107CisKKwlpZiAoIGNvbmZpZy5ub2dsb2JhbHMg
KSB7CisJCWZvciAoIHZhciBrZXkgaW4gZ2xvYmFsICkgeworCQkJaWYgKCBoYXNPd24uY2FsbCgg
Z2xvYmFsLCBrZXkgKSApIHsKKworCQkJCS8vIGluIE9wZXJhIHNvbWV0aW1lcyBET00gZWxlbWVu
dCBpZHMgc2hvdyB1cCBoZXJlLCBpZ25vcmUgdGhlbQorCQkJCWlmICggL15xdW5pdC10ZXN0LW91
dHB1dC8udGVzdCgga2V5ICkgKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQljb25maWcu
cG9sbHV0aW9uLnB1c2goIGtleSApOworCQkJfQorCQl9CisJfQorfQorCitmdW5jdGlvbiBjaGVj
a1BvbGx1dGlvbigpIHsKKwl2YXIgbmV3R2xvYmFscywKKwkJZGVsZXRlZEdsb2JhbHMsCisJCW9s
ZCA9IGNvbmZpZy5wb2xsdXRpb247CisKKwlzYXZlR2xvYmFsKCk7CisKKwluZXdHbG9iYWxzID0g
ZGlmZiggY29uZmlnLnBvbGx1dGlvbiwgb2xkICk7CisJaWYgKCBuZXdHbG9iYWxzLmxlbmd0aCA+
IDAgKSB7CisJCVFVbml0LnB1c2hGYWlsdXJlKCAiSW50cm9kdWNlZCBnbG9iYWwgdmFyaWFibGUo
cyk6ICIgKyBuZXdHbG9iYWxzLmpvaW4oICIsICIgKSApOworCX0KKworCWRlbGV0ZWRHbG9iYWxz
ID0gZGlmZiggb2xkLCBjb25maWcucG9sbHV0aW9uICk7CisJaWYgKCBkZWxldGVkR2xvYmFscy5s
ZW5ndGggPiAwICkgeworCQlRVW5pdC5wdXNoRmFpbHVyZSggIkRlbGV0ZWQgZ2xvYmFsIHZhcmlh
YmxlKHMpOiAiICsgZGVsZXRlZEdsb2JhbHMuam9pbiggIiwgIiApICk7CisJfQorfQorCisvLyBX
aWxsIGJlIGV4cG9zZWQgYXMgUVVuaXQuYXN5bmNUZXN0CitmdW5jdGlvbiBhc3luY1Rlc3QoIHRl
c3ROYW1lLCBleHBlY3RlZCwgY2FsbGJhY2sgKSB7CisJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09
PSAyICkgeworCQljYWxsYmFjayA9IGV4cGVjdGVkOworCQlleHBlY3RlZCA9IG51bGw7CisJfQor
CisJUVVuaXQudGVzdCggdGVzdE5hbWUsIGV4cGVjdGVkLCBjYWxsYmFjaywgdHJ1ZSApOworfQor
CisvLyBXaWxsIGJlIGV4cG9zZWQgYXMgUVVuaXQudGVzdAorZnVuY3Rpb24gdGVzdCggdGVzdE5h
bWUsIGV4cGVjdGVkLCBjYWxsYmFjaywgYXN5bmMgKSB7CisJaWYgKCBmb2N1c2VkICkgIHsgcmV0
dXJuOyB9CisKKwl2YXIgbmV3VGVzdDsKKworCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAp
IHsKKwkJY2FsbGJhY2sgPSBleHBlY3RlZDsKKwkJZXhwZWN0ZWQgPSBudWxsOworCX0KKworCW5l
d1Rlc3QgPSBuZXcgVGVzdCh7CisJCXRlc3ROYW1lOiB0ZXN0TmFtZSwKKwkJZXhwZWN0ZWQ6IGV4
cGVjdGVkLAorCQlhc3luYzogYXN5bmMsCisJCWNhbGxiYWNrOiBjYWxsYmFjaworCX0pOworCisJ
bmV3VGVzdC5xdWV1ZSgpOworfQorCisvLyBXaWxsIGJlIGV4cG9zZWQgYXMgUVVuaXQuc2tpcAor
ZnVuY3Rpb24gc2tpcCggdGVzdE5hbWUgKSB7CisJaWYgKCBmb2N1c2VkICkgIHsgcmV0dXJuOyB9
CisKKwl2YXIgdGVzdCA9IG5ldyBUZXN0KHsKKwkJdGVzdE5hbWU6IHRlc3ROYW1lLAorCQlza2lw
OiB0cnVlCisJfSk7CisKKwl0ZXN0LnF1ZXVlKCk7Cit9CisKKy8vIFdpbGwgYmUgZXhwb3NlZCBh
cyBRVW5pdC5vbmx5CitmdW5jdGlvbiBvbmx5KCB0ZXN0TmFtZSwgZXhwZWN0ZWQsIGNhbGxiYWNr
LCBhc3luYyApIHsKKwl2YXIgbmV3VGVzdDsKKworCWlmICggZm9jdXNlZCApICB7IHJldHVybjsg
fQorCisJUVVuaXQuY29uZmlnLnF1ZXVlLmxlbmd0aCA9IDA7CisJZm9jdXNlZCA9IHRydWU7CisK
KwlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgKSB7CisJCWNhbGxiYWNrID0gZXhwZWN0ZWQ7
CisJCWV4cGVjdGVkID0gbnVsbDsKKwl9CisKKwluZXdUZXN0ID0gbmV3IFRlc3QoeworCQl0ZXN0
TmFtZTogdGVzdE5hbWUsCisJCWV4cGVjdGVkOiBleHBlY3RlZCwKKwkJYXN5bmM6IGFzeW5jLAor
CQljYWxsYmFjazogY2FsbGJhY2sKKwl9KTsKKworCW5ld1Rlc3QucXVldWUoKTsKK30KKworZnVu
Y3Rpb24gQXNzZXJ0KCB0ZXN0Q29udGV4dCApIHsKKwl0aGlzLnRlc3QgPSB0ZXN0Q29udGV4dDsK
K30KKworLy8gQXNzZXJ0IGhlbHBlcnMKK1FVbml0LmFzc2VydCA9IEFzc2VydC5wcm90b3R5cGUg
PSB7CisKKwkvLyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgYXNzZXJ0aW9ucyB0byBn
dWFyYW50ZWUgdGhhdCBmYWlsZWQgdGVzdAorCS8vIChubyBhc3NlcnRpb25zIGFyZSBydW4gYXQg
YWxsKSBkb24ndCBzbGlwIHRocm91Z2guCisJZXhwZWN0OiBmdW5jdGlvbiggYXNzZXJ0cyApIHsK
KwkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgeworCQkJdGhpcy50ZXN0LmV4cGVjdGVk
ID0gYXNzZXJ0czsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnRlc3QuZXhwZWN0ZWQ7CisJ
CX0KKwl9LAorCisJLy8gSW5jcmVtZW50IHRoaXMgVGVzdCdzIHNlbWFwaG9yZSBjb3VudGVyLCB0
aGVuIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQKKwkvLyBkZWNyZW1lbnRzIHRoYXQgY291bnRlciBh
IG1heGltdW0gb2Ygb25jZS4KKwlhc3luYzogZnVuY3Rpb24oIGNvdW50ICkgeworCQl2YXIgdGVz
dCA9IHRoaXMudGVzdCwKKwkJCXBvcHBlZCA9IGZhbHNlLAorCQkJYWNjZXB0Q2FsbENvdW50ID0g
Y291bnQ7CisKKwkJaWYgKCB0eXBlb2YgYWNjZXB0Q2FsbENvdW50ID09PSAidW5kZWZpbmVkIiAp
IHsKKwkJCWFjY2VwdENhbGxDb3VudCA9IDE7CisJCX0KKworCQl0ZXN0LnNlbWFwaG9yZSArPSAx
OworCQl0ZXN0LnVzZWRBc3luYyA9IHRydWU7CisJCXBhdXNlUHJvY2Vzc2luZygpOworCisJCXJl
dHVybiBmdW5jdGlvbiBkb25lKCkgeworCisJCQlpZiAoIHBvcHBlZCApIHsKKwkJCQl0ZXN0LnB1
c2hGYWlsdXJlKCAiVG9vIG1hbnkgY2FsbHMgdG8gdGhlIGBhc3NlcnQuYXN5bmNgIGNhbGxiYWNr
IiwKKwkJCQkJc291cmNlRnJvbVN0YWNrdHJhY2UoIDIgKSApOworCQkJCXJldHVybjsKKwkJCX0K
KwkJCWFjY2VwdENhbGxDb3VudCAtPSAxOworCQkJaWYgKCBhY2NlcHRDYWxsQ291bnQgPiAwICkg
eworCQkJCXJldHVybjsKKwkJCX0KKworCQkJdGVzdC5zZW1hcGhvcmUgLT0gMTsKKwkJCXBvcHBl
ZCA9IHRydWU7CisJCQlyZXN1bWVQcm9jZXNzaW5nKCk7CisJCX07CisJfSwKKworCS8vIEV4cG9y
dHMgdGVzdC5wdXNoKCkgdG8gdGhlIHVzZXIgQVBJCisJcHVzaDogZnVuY3Rpb24oIC8qIHJlc3Vs
dCwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgbmVnYXRpdmUgKi8gKSB7CisJCXZhciBhc3Nl
cnQgPSB0aGlzLAorCQkJY3VycmVudFRlc3QgPSAoIGFzc2VydCBpbnN0YW5jZW9mIEFzc2VydCAm
JiBhc3NlcnQudGVzdCApIHx8IFFVbml0LmNvbmZpZy5jdXJyZW50OworCisJCS8vIEJhY2t3YXJk
cyBjb21wYXRpYmlsaXR5IGZpeC4KKwkJLy8gQWxsb3dzIHRoZSBkaXJlY3QgdXNlIG9mIGdsb2Jh
bCBleHBvcnRlZCBhc3NlcnRpb25zIGFuZCBRVW5pdC5hc3NlcnQuKgorCQkvLyBBbHRob3VnaCwg
aXQncyB1c2UgaXMgbm90IHJlY29tbWVuZGVkIGFzIGl0IGNhbiBsZWFrIGFzc2VydGlvbnMKKwkJ
Ly8gdG8gb3RoZXIgdGVzdHMgZnJvbSBhc3luYyB0ZXN0cywgYmVjYXVzZSB3ZSBvbmx5IGdldCBh
IHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCB0ZXN0LAorCQkvLyBub3QgZXhhY3RseSB0aGUgdGVz
dCB3aGVyZSBhc3NlcnRpb24gd2VyZSBpbnRlbmRlZCB0byBiZSBjYWxsZWQuCisJCWlmICggIWN1
cnJlbnRUZXN0ICkgeworCQkJdGhyb3cgbmV3IEVycm9yKCAiYXNzZXJ0aW9uIG91dHNpZGUgdGVz
dCBjb250ZXh0LCBpbiAiICsgc291cmNlRnJvbVN0YWNrdHJhY2UoIDIgKSApOworCQl9CisKKwkJ
aWYgKCBjdXJyZW50VGVzdC51c2VkQXN5bmMgPT09IHRydWUgJiYgY3VycmVudFRlc3Quc2VtYXBo
b3JlID09PSAwICkgeworCQkJY3VycmVudFRlc3QucHVzaEZhaWx1cmUoICJBc3NlcnRpb24gYWZ0
ZXIgdGhlIGZpbmFsIGBhc3NlcnQuYXN5bmNgIHdhcyByZXNvbHZlZCIsCisJCQkJc291cmNlRnJv
bVN0YWNrdHJhY2UoIDIgKSApOworCisJCQkvLyBBbGxvdyB0aGlzIGFzc2VydGlvbiB0byBjb250
aW51ZSBydW5uaW5nIGFueXdheS4uLgorCQl9CisKKwkJaWYgKCAhKCBhc3NlcnQgaW5zdGFuY2Vv
ZiBBc3NlcnQgKSApIHsKKwkJCWFzc2VydCA9IGN1cnJlbnRUZXN0LmFzc2VydDsKKwkJfQorCQly
ZXR1cm4gYXNzZXJ0LnRlc3QucHVzaC5hcHBseSggYXNzZXJ0LnRlc3QsIGFyZ3VtZW50cyApOwor
CX0sCisKKwlvazogZnVuY3Rpb24oIHJlc3VsdCwgbWVzc2FnZSApIHsKKwkJbWVzc2FnZSA9IG1l
c3NhZ2UgfHwgKCByZXN1bHQgPyAib2theSIgOiAiZmFpbGVkLCBleHBlY3RlZCBhcmd1bWVudCB0
byBiZSB0cnV0aHksIHdhczogIiArCisJCQlRVW5pdC5kdW1wLnBhcnNlKCByZXN1bHQgKSApOwor
CQl0aGlzLnB1c2goICEhcmVzdWx0LCByZXN1bHQsIHRydWUsIG1lc3NhZ2UgKTsKKwl9LAorCisJ
bm90T2s6IGZ1bmN0aW9uKCByZXN1bHQsIG1lc3NhZ2UgKSB7CisJCW1lc3NhZ2UgPSBtZXNzYWdl
IHx8ICggIXJlc3VsdCA/ICJva2F5IiA6ICJmYWlsZWQsIGV4cGVjdGVkIGFyZ3VtZW50IHRvIGJl
IGZhbHN5LCB3YXM6ICIgKworCQkJUVVuaXQuZHVtcC5wYXJzZSggcmVzdWx0ICkgKTsKKwkJdGhp
cy5wdXNoKCAhcmVzdWx0LCByZXN1bHQsIGZhbHNlLCBtZXNzYWdlLCB0cnVlICk7CisJfSwKKwor
CWVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJLypqc2hp
bnQgZXFlcWVxOmZhbHNlICovCisJCXRoaXMucHVzaCggZXhwZWN0ZWQgPT0gYWN0dWFsLCBhY3R1
YWwsIGV4cGVjdGVkLCBtZXNzYWdlICk7CisJfSwKKworCW5vdEVxdWFsOiBmdW5jdGlvbiggYWN0
dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJLypqc2hpbnQgZXFlcWVxOmZhbHNlICovCisJ
CXRoaXMucHVzaCggZXhwZWN0ZWQgIT0gYWN0dWFsLCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdl
LCB0cnVlICk7CisJfSwKKworCXByb3BFcXVhbDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0ZWQs
IG1lc3NhZ2UgKSB7CisJCWFjdHVhbCA9IG9iamVjdFZhbHVlcyggYWN0dWFsICk7CisJCWV4cGVj
dGVkID0gb2JqZWN0VmFsdWVzKCBleHBlY3RlZCApOworCQl0aGlzLnB1c2goIFFVbml0LmVxdWl2
KCBhY3R1YWwsIGV4cGVjdGVkICksIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKTsKKwl9LAor
CisJbm90UHJvcEVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsK
KwkJYWN0dWFsID0gb2JqZWN0VmFsdWVzKCBhY3R1YWwgKTsKKwkJZXhwZWN0ZWQgPSBvYmplY3RW
YWx1ZXMoIGV4cGVjdGVkICk7CisJCXRoaXMucHVzaCggIVFVbml0LmVxdWl2KCBhY3R1YWwsIGV4
cGVjdGVkICksIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIHRydWUgKTsKKwl9LAorCisJZGVl
cEVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJdGhpcy5w
dXNoKCBRVW5pdC5lcXVpdiggYWN0dWFsLCBleHBlY3RlZCApLCBhY3R1YWwsIGV4cGVjdGVkLCBt
ZXNzYWdlICk7CisJfSwKKworCW5vdERlZXBFcXVhbDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0
ZWQsIG1lc3NhZ2UgKSB7CisJCXRoaXMucHVzaCggIVFVbml0LmVxdWl2KCBhY3R1YWwsIGV4cGVj
dGVkICksIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIHRydWUgKTsKKwl9LAorCisJc3RyaWN0
RXF1YWw6IGZ1bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQl0aGlzLnB1
c2goIGV4cGVjdGVkID09PSBhY3R1YWwsIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKTsKKwl9
LAorCisJbm90U3RyaWN0RXF1YWw6IGZ1bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdl
ICkgeworCQl0aGlzLnB1c2goIGV4cGVjdGVkICE9PSBhY3R1YWwsIGFjdHVhbCwgZXhwZWN0ZWQs
IG1lc3NhZ2UsIHRydWUgKTsKKwl9LAorCisJInRocm93cyI6IGZ1bmN0aW9uKCBibG9jaywgZXhw
ZWN0ZWQsIG1lc3NhZ2UgKSB7CisJCXZhciBhY3R1YWwsIGV4cGVjdGVkVHlwZSwKKwkJCWV4cGVj
dGVkT3V0cHV0ID0gZXhwZWN0ZWQsCisJCQlvayA9IGZhbHNlLAorCQkJY3VycmVudFRlc3QgPSAo
IHRoaXMgaW5zdGFuY2VvZiBBc3NlcnQgJiYgdGhpcy50ZXN0ICkgfHwgUVVuaXQuY29uZmlnLmN1
cnJlbnQ7CisKKwkJLy8gJ2V4cGVjdGVkJyBpcyBvcHRpb25hbCB1bmxlc3MgZG9pbmcgc3RyaW5n
IGNvbXBhcmlzb24KKwkJaWYgKCBtZXNzYWdlID09IG51bGwgJiYgdHlwZW9mIGV4cGVjdGVkID09
PSAic3RyaW5nIiApIHsKKwkJCW1lc3NhZ2UgPSBleHBlY3RlZDsKKwkJCWV4cGVjdGVkID0gbnVs
bDsKKwkJfQorCisJCWN1cnJlbnRUZXN0Lmlnbm9yZUdsb2JhbEVycm9ycyA9IHRydWU7CisJCXRy
eSB7CisJCQlibG9jay5jYWxsKCBjdXJyZW50VGVzdC50ZXN0RW52aXJvbm1lbnQgKTsKKwkJfSBj
YXRjaCAoZSkgeworCQkJYWN0dWFsID0gZTsKKwkJfQorCQljdXJyZW50VGVzdC5pZ25vcmVHbG9i
YWxFcnJvcnMgPSBmYWxzZTsKKworCQlpZiAoIGFjdHVhbCApIHsKKwkJCWV4cGVjdGVkVHlwZSA9
IFFVbml0Lm9iamVjdFR5cGUoIGV4cGVjdGVkICk7CisKKwkJCS8vIHdlIGRvbid0IHdhbnQgdG8g
dmFsaWRhdGUgdGhyb3duIGVycm9yCisJCQlpZiAoICFleHBlY3RlZCApIHsKKwkJCQlvayA9IHRy
dWU7CisJCQkJZXhwZWN0ZWRPdXRwdXQgPSBudWxsOworCisJCQkvLyBleHBlY3RlZCBpcyBhIHJl
Z2V4cAorCQkJfSBlbHNlIGlmICggZXhwZWN0ZWRUeXBlID09PSAicmVnZXhwIiApIHsKKwkJCQlv
ayA9IGV4cGVjdGVkLnRlc3QoIGVycm9yU3RyaW5nKCBhY3R1YWwgKSApOworCisJCQkvLyBleHBl
Y3RlZCBpcyBhIHN0cmluZworCQkJfSBlbHNlIGlmICggZXhwZWN0ZWRUeXBlID09PSAic3RyaW5n
IiApIHsKKwkJCQlvayA9IGV4cGVjdGVkID09PSBlcnJvclN0cmluZyggYWN0dWFsICk7CisKKwkJ
CS8vIGV4cGVjdGVkIGlzIGEgY29uc3RydWN0b3IsIG1heWJlIGFuIEVycm9yIGNvbnN0cnVjdG9y
CisJCQl9IGVsc2UgaWYgKCBleHBlY3RlZFR5cGUgPT09ICJmdW5jdGlvbiIgJiYgYWN0dWFsIGlu
c3RhbmNlb2YgZXhwZWN0ZWQgKSB7CisJCQkJb2sgPSB0cnVlOworCisJCQkvLyBleHBlY3RlZCBp
cyBhbiBFcnJvciBvYmplY3QKKwkJCX0gZWxzZSBpZiAoIGV4cGVjdGVkVHlwZSA9PT0gIm9iamVj
dCIgKSB7CisJCQkJb2sgPSBhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZC5jb25zdHJ1Y3RvciAm
JgorCQkJCQlhY3R1YWwubmFtZSA9PT0gZXhwZWN0ZWQubmFtZSAmJgorCQkJCQlhY3R1YWwubWVz
c2FnZSA9PT0gZXhwZWN0ZWQubWVzc2FnZTsKKworCQkJLy8gZXhwZWN0ZWQgaXMgYSB2YWxpZGF0
aW9uIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0aW9uIHBhc3NlZAorCQkJ
fSBlbHNlIGlmICggZXhwZWN0ZWRUeXBlID09PSAiZnVuY3Rpb24iICYmIGV4cGVjdGVkLmNhbGwo
IHt9LCBhY3R1YWwgKSA9PT0gdHJ1ZSApIHsKKwkJCQlleHBlY3RlZE91dHB1dCA9IG51bGw7CisJ
CQkJb2sgPSB0cnVlOworCQkJfQorCQl9CisKKwkJY3VycmVudFRlc3QuYXNzZXJ0LnB1c2goIG9r
LCBhY3R1YWwsIGV4cGVjdGVkT3V0cHV0LCBtZXNzYWdlICk7CisJfQorfTsKKworLy8gUHJvdmlk
ZSBhbiBhbHRlcm5hdGl2ZSB0byBhc3NlcnQudGhyb3dzKCksIGZvciBlbnZpcm9ubWVudHMgdGhh
dCBjb25zaWRlciB0aHJvd3MgYSByZXNlcnZlZCB3b3JkCisvLyBLbm93biB0byB1cyBhcmU6IENs
b3N1cmUgQ29tcGlsZXIsIE5hcndoYWwKKyhmdW5jdGlvbigpIHsKKwkvKmpzaGludCBzdWI6dHJ1
ZSAqLworCUFzc2VydC5wcm90b3R5cGUucmFpc2VzID0gQXNzZXJ0LnByb3RvdHlwZVsgInRocm93
cyIgXTsKK30oKSk7CisKK2Z1bmN0aW9uIGVycm9yU3RyaW5nKCBlcnJvciApIHsKKwl2YXIgbmFt
ZSwgbWVzc2FnZSwKKwkJcmVzdWx0RXJyb3JTdHJpbmcgPSBlcnJvci50b1N0cmluZygpOworCWlm
ICggcmVzdWx0RXJyb3JTdHJpbmcuc3Vic3RyaW5nKCAwLCA3ICkgPT09ICJbb2JqZWN0IiApIHsK
KwkJbmFtZSA9IGVycm9yLm5hbWUgPyBlcnJvci5uYW1lLnRvU3RyaW5nKCkgOiAiRXJyb3IiOwor
CQltZXNzYWdlID0gZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UudG9TdHJpbmcoKSA6ICIi
OworCQlpZiAoIG5hbWUgJiYgbWVzc2FnZSApIHsKKwkJCXJldHVybiBuYW1lICsgIjogIiArIG1l
c3NhZ2U7CisJCX0gZWxzZSBpZiAoIG5hbWUgKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfSBlbHNl
IGlmICggbWVzc2FnZSApIHsKKwkJCXJldHVybiBtZXNzYWdlOworCQl9IGVsc2UgeworCQkJcmV0
dXJuICJFcnJvciI7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gcmVzdWx0RXJyb3JTdHJpbmc7
CisJfQorfQorCisvLyBUZXN0IGZvciBlcXVhbGl0eSBhbnkgSmF2YVNjcmlwdCB0eXBlLgorLy8g
QXV0aG9yOiBQaGlsaXBwZSBSYXRow6kgPHByYXRoZUBnbWFpbC5jb20+CitRVW5pdC5lcXVpdiA9
IChmdW5jdGlvbigpIHsKKworCS8vIFN0YWNrIHRvIGRlY2lkZSBiZXR3ZWVuIHNraXAvYWJvcnQg
ZnVuY3Rpb25zCisJdmFyIGNhbGxlcnMgPSBbXTsKKworCS8vIFN0YWNrIHRvIGF2b2lkaW5nIGxv
b3BzIGZyb20gY2lyY3VsYXIgcmVmZXJlbmNpbmcKKwl2YXIgcGFyZW50cyA9IFtdOworCXZhciBw
YXJlbnRzQiA9IFtdOworCisJZnVuY3Rpb24gdXNlU3RyaWN0RXF1YWxpdHkoIGIsIGEgKSB7CisK
KwkJLypqc2hpbnQgZXFlcWVxOmZhbHNlICovCisJCWlmICggYiBpbnN0YW5jZW9mIGEuY29uc3Ry
dWN0b3IgfHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IgKSB7CisKKwkJCS8vIFRvIGNhdGNo
IHNob3J0IGFubm90YXRpb24gVlMgJ25ldycgYW5ub3RhdGlvbiBvZiBhIGRlY2xhcmF0aW9uLiBl
LmcuOgorCQkJLy8gYHZhciBpID0gMTtgCisJCQkvLyBgdmFyIGogPSBuZXcgTnVtYmVyKDEpO2AK
KwkJCXJldHVybiBhID09IGI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gYSA9PT0gYjsKKwkJfQor
CX0KKworCWZ1bmN0aW9uIGNvbXBhcmVDb25zdHJ1Y3RvcnMoIGEsIGIgKSB7CisJCXZhciBnZXRQ
cm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiggb2JqICkgeworCisJCQkv
KmpzaGludCBwcm90bzogdHJ1ZSAqLworCQkJcmV0dXJuIG9iai5fX3Byb3RvX187CisJCX07CisJ
CXZhciBwcm90b0EgPSBnZXRQcm90byggYSApOworCQl2YXIgcHJvdG9CID0gZ2V0UHJvdG8oIGIg
KTsKKworCQkvLyBDb21wYXJpbmcgY29uc3RydWN0b3JzIGlzIG1vcmUgc3RyaWN0IHRoYW4gdXNp
bmcgYGluc3RhbmNlb2ZgCisJCWlmICggYS5jb25zdHJ1Y3RvciA9PT0gYi5jb25zdHJ1Y3RvciAp
IHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJLy8gUmVmICM4NTEKKwkJLy8gSWYgdGhlIG9i
aiBwcm90b3R5cGUgZGVzY2VuZHMgZnJvbSBhIG51bGwgY29uc3RydWN0b3IsIHRyZWF0IGl0CisJ
CS8vIGFzIGEgbnVsbCBwcm90b3R5cGUuCisJCWlmICggcHJvdG9BICYmIHByb3RvQS5jb25zdHJ1
Y3RvciA9PT0gbnVsbCApIHsKKwkJCXByb3RvQSA9IG51bGw7CisJCX0KKwkJaWYgKCBwcm90b0Ig
JiYgcHJvdG9CLmNvbnN0cnVjdG9yID09PSBudWxsICkgeworCQkJcHJvdG9CID0gbnVsbDsKKwkJ
fQorCisJCS8vIEFsbG93IG9iamVjdHMgd2l0aCBubyBwcm90b3R5cGUgdG8gYmUgZXF1aXZhbGVu
dCB0bworCQkvLyBvYmplY3RzIHdpdGggT2JqZWN0IGFzIHRoZWlyIGNvbnN0cnVjdG9yLgorCQlp
ZiAoICggcHJvdG9BID09PSBudWxsICYmIHByb3RvQiA9PT0gT2JqZWN0LnByb3RvdHlwZSApIHx8
CisJCQkJKCBwcm90b0IgPT09IG51bGwgJiYgcHJvdG9BID09PSBPYmplY3QucHJvdG90eXBlICkg
KSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwl2YXIg
Y2FsbGJhY2tzID0geworCQkic3RyaW5nIjogdXNlU3RyaWN0RXF1YWxpdHksCisJCSJib29sZWFu
IjogdXNlU3RyaWN0RXF1YWxpdHksCisJCSJudW1iZXIiOiB1c2VTdHJpY3RFcXVhbGl0eSwKKwkJ
Im51bGwiOiB1c2VTdHJpY3RFcXVhbGl0eSwKKwkJInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFs
aXR5LAorCQkic3ltYm9sIjogdXNlU3RyaWN0RXF1YWxpdHksCisKKwkJIm5hbiI6IGZ1bmN0aW9u
KCBiICkgeworCQkJcmV0dXJuIGlzTmFOKCBiICk7CisJCX0sCisKKwkJImRhdGUiOiBmdW5jdGlv
biggYiwgYSApIHsKKwkJCXJldHVybiBRVW5pdC5vYmplY3RUeXBlKCBiICkgPT09ICJkYXRlIiAm
JiBhLnZhbHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7CisJCX0sCisKKwkJInJlZ2V4cCI6IGZ1bmN0
aW9uKCBiLCBhICkgeworCQkJcmV0dXJuIFFVbml0Lm9iamVjdFR5cGUoIGIgKSA9PT0gInJlZ2V4
cCIgJiYKKworCQkJCS8vIFRoZSByZWdleCBpdHNlbGYKKwkJCQlhLnNvdXJjZSA9PT0gYi5zb3Vy
Y2UgJiYKKworCQkJCS8vIEFuZCBpdHMgbW9kaWZpZXJzCisJCQkJYS5nbG9iYWwgPT09IGIuZ2xv
YmFsICYmCisKKwkJCQkvLyAoZ21pKSAuLi4KKwkJCQlhLmlnbm9yZUNhc2UgPT09IGIuaWdub3Jl
Q2FzZSAmJgorCQkJCWEubXVsdGlsaW5lID09PSBiLm11bHRpbGluZSAmJgorCQkJCWEuc3RpY2t5
ID09PSBiLnN0aWNreTsKKwkJfSwKKworCQkvLyAtIHNraXAgd2hlbiB0aGUgcHJvcGVydHkgaXMg
YSBtZXRob2Qgb2YgYW4gaW5zdGFuY2UgKE9PUCkKKwkJLy8gLSBhYm9ydCBvdGhlcndpc2UsCisJ
CS8vIGluaXRpYWwgPT09IHdvdWxkIGhhdmUgY2F0Y2ggaWRlbnRpY2FsIHJlZmVyZW5jZXMgYW55
d2F5CisJCSJmdW5jdGlvbiI6IGZ1bmN0aW9uKCkgeworCQkJdmFyIGNhbGxlciA9IGNhbGxlcnNb
IGNhbGxlcnMubGVuZ3RoIC0gMSBdOworCQkJcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmIHR5
cGVvZiBjYWxsZXIgIT09ICJ1bmRlZmluZWQiOworCQl9LAorCisJCSJhcnJheSI6IGZ1bmN0aW9u
KCBiLCBhICkgeworCQkJdmFyIGksIGosIGxlbiwgbG9vcCwgYUNpcmN1bGFyLCBiQ2lyY3VsYXI7
CisKKwkJCS8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQorCQkJaWYgKCBRVW5p
dC5vYmplY3RUeXBlKCBiICkgIT09ICJhcnJheSIgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJ
fQorCisJCQlsZW4gPSBhLmxlbmd0aDsKKwkJCWlmICggbGVuICE9PSBiLmxlbmd0aCApIHsKKwkJ
CQkvLyBzYWZlIGFuZCBmYXN0ZXIKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCS8vIFRy
YWNrIHJlZmVyZW5jZSB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCisJCQlwYXJlbnRzLnB1
c2goIGEgKTsKKwkJCXBhcmVudHNCLnB1c2goIGIgKTsKKwkJCWZvciAoIGkgPSAwOyBpIDwgbGVu
OyBpKysgKSB7CisJCQkJbG9vcCA9IGZhbHNlOworCQkJCWZvciAoIGogPSAwOyBqIDwgcGFyZW50
cy5sZW5ndGg7IGorKyApIHsKKwkJCQkJYUNpcmN1bGFyID0gcGFyZW50c1sgaiBdID09PSBhWyBp
IF07CisJCQkJCWJDaXJjdWxhciA9IHBhcmVudHNCWyBqIF0gPT09IGJbIGkgXTsKKwkJCQkJaWYg
KCBhQ2lyY3VsYXIgfHwgYkNpcmN1bGFyICkgeworCQkJCQkJaWYgKCBhWyBpIF0gPT09IGJbIGkg
XSB8fCBhQ2lyY3VsYXIgJiYgYkNpcmN1bGFyICkgeworCQkJCQkJCWxvb3AgPSB0cnVlOworCQkJ
CQkJfSBlbHNlIHsKKwkJCQkJCQlwYXJlbnRzLnBvcCgpOworCQkJCQkJCXBhcmVudHNCLnBvcCgp
OworCQkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAo
ICFsb29wICYmICFpbm5lckVxdWl2KCBhWyBpIF0sIGJbIGkgXSApICkgeworCQkJCQlwYXJlbnRz
LnBvcCgpOworCQkJCQlwYXJlbnRzQi5wb3AoKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0K
KwkJCX0KKwkJCXBhcmVudHMucG9wKCk7CisJCQlwYXJlbnRzQi5wb3AoKTsKKwkJCXJldHVybiB0
cnVlOworCQl9LAorCisJCSJzZXQiOiBmdW5jdGlvbiggYiwgYSApIHsKKwkJCXZhciBhQXJyYXks
IGJBcnJheTsKKworCQkJLy8gYGJgIGNvdWxkIGJlIGFueSBvYmplY3QgaGVyZQorCQkJaWYgKCBR
VW5pdC5vYmplY3RUeXBlKCBiICkgIT09ICJzZXQiICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJ
CX0KKworCQkJYUFycmF5ID0gW107CisJCQlhLmZvckVhY2goIGZ1bmN0aW9uKCB2ICkgeworCQkJ
CWFBcnJheS5wdXNoKCB2ICk7CisJCQl9KTsKKwkJCWJBcnJheSA9IFtdOworCQkJYi5mb3JFYWNo
KCBmdW5jdGlvbiggdiApIHsKKwkJCQliQXJyYXkucHVzaCggdiApOworCQkJfSk7CisKKwkJCXJl
dHVybiBpbm5lckVxdWl2KCBiQXJyYXksIGFBcnJheSApOworCQl9LAorCisJCSJtYXAiOiBmdW5j
dGlvbiggYiwgYSApIHsKKwkJCXZhciBhQXJyYXksIGJBcnJheTsKKworCQkJLy8gYGJgIGNvdWxk
IGJlIGFueSBvYmplY3QgaGVyZQorCQkJaWYgKCBRVW5pdC5vYmplY3RUeXBlKCBiICkgIT09ICJt
YXAiICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJYUFycmF5ID0gW107CisJCQlh
LmZvckVhY2goIGZ1bmN0aW9uKCB2LCBrICkgeworCQkJCWFBcnJheS5wdXNoKCBbIGssIHYgXSAp
OworCQkJfSk7CisJCQliQXJyYXkgPSBbXTsKKwkJCWIuZm9yRWFjaCggZnVuY3Rpb24oIHYsIGsg
KSB7CisJCQkJYkFycmF5LnB1c2goIFsgaywgdiBdICk7CisJCQl9KTsKKworCQkJcmV0dXJuIGlu
bmVyRXF1aXYoIGJBcnJheSwgYUFycmF5ICk7CisJCX0sCisKKwkJIm9iamVjdCI6IGZ1bmN0aW9u
KCBiLCBhICkgeworCQkJdmFyIGksIGosIGxvb3AsIGFDaXJjdWxhciwgYkNpcmN1bGFyOworCisJ
CQkvLyBEZWZhdWx0IHRvIHRydWUKKwkJCXZhciBlcSA9IHRydWU7CisJCQl2YXIgYVByb3BlcnRp
ZXMgPSBbXTsKKwkJCXZhciBiUHJvcGVydGllcyA9IFtdOworCisJCQlpZiAoIGNvbXBhcmVDb25z
dHJ1Y3RvcnMoIGEsIGIgKSA9PT0gZmFsc2UgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQor
CisJCQkvLyBTdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCisJ
CQljYWxsZXJzLnB1c2goIGEuY29uc3RydWN0b3IgKTsKKworCQkJLy8gVHJhY2sgcmVmZXJlbmNl
IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMKKwkJCXBhcmVudHMucHVzaCggYSApOworCQkJ
cGFyZW50c0IucHVzaCggYiApOworCisJCQkvLyBCZSBzdHJpY3Q6IGRvbid0IGVuc3VyZSBoYXNP
d25Qcm9wZXJ0eSBhbmQgZ28gZGVlcAorCQkJZm9yICggaSBpbiBhICkgeworCQkJCWxvb3AgPSBm
YWxzZTsKKwkJCQlmb3IgKCBqID0gMDsgaiA8IHBhcmVudHMubGVuZ3RoOyBqKysgKSB7CisJCQkJ
CWFDaXJjdWxhciA9IHBhcmVudHNbIGogXSA9PT0gYVsgaSBdOworCQkJCQliQ2lyY3VsYXIgPSBw
YXJlbnRzQlsgaiBdID09PSBiWyBpIF07CisJCQkJCWlmICggYUNpcmN1bGFyIHx8IGJDaXJjdWxh
ciApIHsKKwkJCQkJCWlmICggYVsgaSBdID09PSBiWyBpIF0gfHwgYUNpcmN1bGFyICYmIGJDaXJj
dWxhciApIHsKKwkJCQkJCQlsb29wID0gdHJ1ZTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZXEg
PSBmYWxzZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlhUHJv
cGVydGllcy5wdXNoKCBpICk7CisJCQkJaWYgKCAhbG9vcCAmJiAhaW5uZXJFcXVpdiggYVsgaSBd
LCBiWyBpIF0gKSApIHsKKwkJCQkJZXEgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJ
fQorCisJCQlwYXJlbnRzLnBvcCgpOworCQkJcGFyZW50c0IucG9wKCk7CisKKwkJCS8vIFVuc3Rh
Y2ssIHdlIGFyZSBkb25lCisJCQljYWxsZXJzLnBvcCgpOworCisJCQlmb3IgKCBpIGluIGIgKSB7
CisKKwkJCQkvLyBDb2xsZWN0IGIncyBwcm9wZXJ0aWVzCisJCQkJYlByb3BlcnRpZXMucHVzaCgg
aSApOworCQkJfQorCisJCQkvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKKwkJ
CXJldHVybiBlcSAmJiBpbm5lckVxdWl2KCBhUHJvcGVydGllcy5zb3J0KCksIGJQcm9wZXJ0aWVz
LnNvcnQoKSApOworCQl9CisJfTsKKworCWZ1bmN0aW9uIHR5cGVFcXVpdiggYSwgYiApIHsKKwkJ
dmFyIHByb3AgPSBRVW5pdC5vYmplY3RUeXBlKCBhICk7CisJCXJldHVybiBjYWxsYmFja3NbIHBy
b3AgXSggYiwgYSApOworCX0KKworCS8vIFRoZSByZWFsIGVxdWl2IGZ1bmN0aW9uCisJZnVuY3Rp
b24gaW5uZXJFcXVpdigpIHsKKwkJdmFyIGFyZ3MgPSBbXS5zbGljZS5hcHBseSggYXJndW1lbnRz
ICk7CisJCWlmICggYXJncy5sZW5ndGggPCAyICkgeworCisJCQkvLyBFbmQgdHJhbnNpdGlvbgor
CQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gKCAoZnVuY3Rpb24oIGEsIGIgKSB7CisJ
CQlpZiAoIGEgPT09IGIgKSB7CisKKwkJCQkvLyBDYXRjaCB0aGUgbW9zdCB5b3UgY2FuCisJCQkJ
cmV0dXJuIHRydWU7CisJCQl9IGVsc2UgaWYgKCBhID09PSBudWxsIHx8IGIgPT09IG51bGwgfHwg
dHlwZW9mIGEgPT09ICJ1bmRlZmluZWQiIHx8CisJCQkJCXR5cGVvZiBiID09PSAidW5kZWZpbmVk
IiB8fAorCQkJCQlRVW5pdC5vYmplY3RUeXBlKCBhICkgIT09IFFVbml0Lm9iamVjdFR5cGUoIGIg
KSApIHsKKworCQkJCS8vIERvbid0IGxvc2UgdGltZSB3aXRoIGVycm9yIHByb25lIGNhc2VzCisJ
CQkJcmV0dXJuIGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdHlwZUVxdWl2KCBhLCBi
ICk7CisJCQl9CisKKwkJLy8gQXBwbHkgdHJhbnNpdGlvbiB3aXRoICgxLi5uKSBhcmd1bWVudHMK
KwkJfSggYXJnc1sgMCBdLCBhcmdzWyAxIF0gKSApICYmCisJCQlpbm5lckVxdWl2LmFwcGx5KCB0
aGlzLCBhcmdzLnNwbGljZSggMSwgYXJncy5sZW5ndGggLSAxICkgKSApOworCX0KKworCXJldHVy
biBpbm5lckVxdWl2OworfSgpKTsKKworLy8gQmFzZWQgb24ganNEdW1wIGJ5IEFyaWVsIEZsZXNs
ZXIKKy8vIGh0dHA6Ly9mbGVzbGVyLmJsb2dzcG90LmNvbS8yMDA4LzA1L2pzZHVtcC1wcmV0dHkt
ZHVtcC1vZi1hbnktamF2YXNjcmlwdC5odG1sCitRVW5pdC5kdW1wID0gKGZ1bmN0aW9uKCkgewor
CWZ1bmN0aW9uIHF1b3RlKCBzdHIgKSB7CisJCXJldHVybiAiXCIiICsgc3RyLnRvU3RyaW5nKCku
cmVwbGFjZSggL1xcL2csICJcXFxcIiApLnJlcGxhY2UoIC8iL2csICJcXFwiIiApICsgIlwiIjsK
Kwl9CisJZnVuY3Rpb24gbGl0ZXJhbCggbyApIHsKKwkJcmV0dXJuIG8gKyAiIjsKKwl9CisJZnVu
Y3Rpb24gam9pbiggcHJlLCBhcnIsIHBvc3QgKSB7CisJCXZhciBzID0gZHVtcC5zZXBhcmF0b3Io
KSwKKwkJCWJhc2UgPSBkdW1wLmluZGVudCgpLAorCQkJaW5uZXIgPSBkdW1wLmluZGVudCggMSAp
OworCQlpZiAoIGFyci5qb2luICkgeworCQkJYXJyID0gYXJyLmpvaW4oICIsIiArIHMgKyBpbm5l
ciApOworCQl9CisJCWlmICggIWFyciApIHsKKwkJCXJldHVybiBwcmUgKyBwb3N0OworCQl9CisJ
CXJldHVybiBbIHByZSwgaW5uZXIgKyBhcnIsIGJhc2UgKyBwb3N0IF0uam9pbiggcyApOworCX0K
KwlmdW5jdGlvbiBhcnJheSggYXJyLCBzdGFjayApIHsKKwkJdmFyIGkgPSBhcnIubGVuZ3RoLAor
CQkJcmV0ID0gbmV3IEFycmF5KCBpICk7CisKKwkJaWYgKCBkdW1wLm1heERlcHRoICYmIGR1bXAu
ZGVwdGggPiBkdW1wLm1heERlcHRoICkgeworCQkJcmV0dXJuICJbb2JqZWN0IEFycmF5XSI7CisJ
CX0KKworCQl0aGlzLnVwKCk7CisJCXdoaWxlICggaS0tICkgeworCQkJcmV0WyBpIF0gPSB0aGlz
LnBhcnNlKCBhcnJbIGkgXSwgdW5kZWZpbmVkLCBzdGFjayApOworCQl9CisJCXRoaXMuZG93bigp
OworCQlyZXR1cm4gam9pbiggIlsiLCByZXQsICJdIiApOworCX0KKworCXZhciByZU5hbWUgPSAv
XmZ1bmN0aW9uIChcdyspLywKKwkJZHVtcCA9IHsKKworCQkJLy8gb2JqVHlwZSBpcyB1c2VkIG1v
c3RseSBpbnRlcm5hbGx5LCB5b3UgY2FuIGZpeCBhIChjdXN0b20pIHR5cGUgaW4gYWR2YW5jZQor
CQkJcGFyc2U6IGZ1bmN0aW9uKCBvYmosIG9ialR5cGUsIHN0YWNrICkgeworCQkJCXN0YWNrID0g
c3RhY2sgfHwgW107CisJCQkJdmFyIHJlcywgcGFyc2VyLCBwYXJzZXJUeXBlLAorCQkJCQlpblN0
YWNrID0gaW5BcnJheSggb2JqLCBzdGFjayApOworCisJCQkJaWYgKCBpblN0YWNrICE9PSAtMSAp
IHsKKwkJCQkJcmV0dXJuICJyZWN1cnNpb24oIiArICggaW5TdGFjayAtIHN0YWNrLmxlbmd0aCAp
ICsgIikiOworCQkJCX0KKworCQkJCW9ialR5cGUgPSBvYmpUeXBlIHx8IHRoaXMudHlwZU9mKCBv
YmogICk7CisJCQkJcGFyc2VyID0gdGhpcy5wYXJzZXJzWyBvYmpUeXBlIF07CisJCQkJcGFyc2Vy
VHlwZSA9IHR5cGVvZiBwYXJzZXI7CisKKwkJCQlpZiAoIHBhcnNlclR5cGUgPT09ICJmdW5jdGlv
biIgKSB7CisJCQkJCXN0YWNrLnB1c2goIG9iaiApOworCQkJCQlyZXMgPSBwYXJzZXIuY2FsbCgg
dGhpcywgb2JqLCBzdGFjayApOworCQkJCQlzdGFjay5wb3AoKTsKKwkJCQkJcmV0dXJuIHJlczsK
KwkJCQl9CisJCQkJcmV0dXJuICggcGFyc2VyVHlwZSA9PT0gInN0cmluZyIgKSA/IHBhcnNlciA6
IHRoaXMucGFyc2Vycy5lcnJvcjsKKwkJCX0sCisJCQl0eXBlT2Y6IGZ1bmN0aW9uKCBvYmogKSB7
CisJCQkJdmFyIHR5cGU7CisJCQkJaWYgKCBvYmogPT09IG51bGwgKSB7CisJCQkJCXR5cGUgPSAi
bnVsbCI7CisJCQkJfSBlbHNlIGlmICggdHlwZW9mIG9iaiA9PT0gInVuZGVmaW5lZCIgKSB7CisJ
CQkJCXR5cGUgPSAidW5kZWZpbmVkIjsKKwkJCQl9IGVsc2UgaWYgKCBRVW5pdC5pcyggInJlZ2V4
cCIsIG9iaiApICkgeworCQkJCQl0eXBlID0gInJlZ2V4cCI7CisJCQkJfSBlbHNlIGlmICggUVVu
aXQuaXMoICJkYXRlIiwgb2JqICkgKSB7CisJCQkJCXR5cGUgPSAiZGF0ZSI7CisJCQkJfSBlbHNl
IGlmICggUVVuaXQuaXMoICJmdW5jdGlvbiIsIG9iaiApICkgeworCQkJCQl0eXBlID0gImZ1bmN0
aW9uIjsKKwkJCQl9IGVsc2UgaWYgKCBvYmouc2V0SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCAmJgor
CQkJCQkJb2JqLmRvY3VtZW50ICE9PSB1bmRlZmluZWQgJiYKKwkJCQkJCW9iai5ub2RlVHlwZSA9
PT0gdW5kZWZpbmVkICkgeworCQkJCQl0eXBlID0gIndpbmRvdyI7CisJCQkJfSBlbHNlIGlmICgg
b2JqLm5vZGVUeXBlID09PSA5ICkgeworCQkJCQl0eXBlID0gImRvY3VtZW50IjsKKwkJCQl9IGVs
c2UgaWYgKCBvYmoubm9kZVR5cGUgKSB7CisJCQkJCXR5cGUgPSAibm9kZSI7CisJCQkJfSBlbHNl
IGlmICgKKworCQkJCQkvLyBuYXRpdmUgYXJyYXlzCisJCQkJCXRvU3RyaW5nLmNhbGwoIG9iaiAp
ID09PSAiW29iamVjdCBBcnJheV0iIHx8CisKKwkJCQkJLy8gTm9kZUxpc3Qgb2JqZWN0cworCQkJ
CQkoIHR5cGVvZiBvYmoubGVuZ3RoID09PSAibnVtYmVyIiAmJiBvYmouaXRlbSAhPT0gdW5kZWZp
bmVkICYmCisJCQkJCSggb2JqLmxlbmd0aCA/IG9iai5pdGVtKCAwICkgPT09IG9ialsgMCBdIDog
KCBvYmouaXRlbSggMCApID09PSBudWxsICYmCisJCQkJCW9ialsgMCBdID09PSB1bmRlZmluZWQg
KSApICkKKwkJCQkpIHsKKwkJCQkJdHlwZSA9ICJhcnJheSI7CisJCQkJfSBlbHNlIGlmICggb2Jq
LmNvbnN0cnVjdG9yID09PSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgKSB7CisJCQkJCXR5
cGUgPSAiZXJyb3IiOworCQkJCX0gZWxzZSB7CisJCQkJCXR5cGUgPSB0eXBlb2Ygb2JqOworCQkJ
CX0KKwkJCQlyZXR1cm4gdHlwZTsKKwkJCX0sCisJCQlzZXBhcmF0b3I6IGZ1bmN0aW9uKCkgewor
CQkJCXJldHVybiB0aGlzLm11bHRpbGluZSA/IHRoaXMuSFRNTCA/ICI8YnIgLz4iIDogIlxuIiA6
IHRoaXMuSFRNTCA/ICImIzE2MDsiIDogIiAiOworCQkJfSwKKwkJCS8vIGV4dHJhIGNhbiBiZSBh
IG51bWJlciwgc2hvcnRjdXQgZm9yIGluY3JlYXNpbmctY2FsbGluZy1kZWNyZWFzaW5nCisJCQlp
bmRlbnQ6IGZ1bmN0aW9uKCBleHRyYSApIHsKKwkJCQlpZiAoICF0aGlzLm11bHRpbGluZSApIHsK
KwkJCQkJcmV0dXJuICIiOworCQkJCX0KKwkJCQl2YXIgY2hyID0gdGhpcy5pbmRlbnRDaGFyOwor
CQkJCWlmICggdGhpcy5IVE1MICkgeworCQkJCQljaHIgPSBjaHIucmVwbGFjZSggL1x0L2csICIg
ICAiICkucmVwbGFjZSggLyAvZywgIiYjMTYwOyIgKTsKKwkJCQl9CisJCQkJcmV0dXJuIG5ldyBB
cnJheSggdGhpcy5kZXB0aCArICggZXh0cmEgfHwgMCApICkuam9pbiggY2hyICk7CisJCQl9LAor
CQkJdXA6IGZ1bmN0aW9uKCBhICkgeworCQkJCXRoaXMuZGVwdGggKz0gYSB8fCAxOworCQkJfSwK
KwkJCWRvd246IGZ1bmN0aW9uKCBhICkgeworCQkJCXRoaXMuZGVwdGggLT0gYSB8fCAxOworCQkJ
fSwKKwkJCXNldFBhcnNlcjogZnVuY3Rpb24oIG5hbWUsIHBhcnNlciApIHsKKwkJCQl0aGlzLnBh
cnNlcnNbIG5hbWUgXSA9IHBhcnNlcjsKKwkJCX0sCisJCQkvLyBUaGUgbmV4dCAzIGFyZSBleHBv
c2VkIHNvIHlvdSBjYW4gdXNlIHRoZW0KKwkJCXF1b3RlOiBxdW90ZSwKKwkJCWxpdGVyYWw6IGxp
dGVyYWwsCisJCQlqb2luOiBqb2luLAorCQkJLy8KKwkJCWRlcHRoOiAxLAorCQkJbWF4RGVwdGg6
IFFVbml0LmNvbmZpZy5tYXhEZXB0aCwKKworCQkJLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiBwYXJz
ZXJzLCB0byBtb2RpZnkgdGhlbSwgdXNlIGR1bXAuc2V0UGFyc2VyCisJCQlwYXJzZXJzOiB7CisJ
CQkJd2luZG93OiAiW1dpbmRvd10iLAorCQkJCWRvY3VtZW50OiAiW0RvY3VtZW50XSIsCisJCQkJ
ZXJyb3I6IGZ1bmN0aW9uKCBlcnJvciApIHsKKwkJCQkJcmV0dXJuICJFcnJvcihcIiIgKyBlcnJv
ci5tZXNzYWdlICsgIlwiKSI7CisJCQkJfSwKKwkJCQl1bmtub3duOiAiW1Vua25vd25dIiwKKwkJ
CQkibnVsbCI6ICJudWxsIiwKKwkJCQkidW5kZWZpbmVkIjogInVuZGVmaW5lZCIsCisJCQkJImZ1
bmN0aW9uIjogZnVuY3Rpb24oIGZuICkgeworCQkJCQl2YXIgcmV0ID0gImZ1bmN0aW9uIiwKKwor
CQkJCQkJLy8gZnVuY3Rpb25zIG5ldmVyIGhhdmUgbmFtZSBpbiBJRQorCQkJCQkJbmFtZSA9ICJu
YW1lIiBpbiBmbiA/IGZuLm5hbWUgOiAoIHJlTmFtZS5leGVjKCBmbiApIHx8IFtdIClbIDEgXTsK
KworCQkJCQlpZiAoIG5hbWUgKSB7CisJCQkJCQlyZXQgKz0gIiAiICsgbmFtZTsKKwkJCQkJfQor
CQkJCQlyZXQgKz0gIiggIjsKKworCQkJCQlyZXQgPSBbIHJldCwgZHVtcC5wYXJzZSggZm4sICJm
dW5jdGlvbkFyZ3MiICksICIpeyIgXS5qb2luKCAiIiApOworCQkJCQlyZXR1cm4gam9pbiggcmV0
LCBkdW1wLnBhcnNlKCBmbiwgImZ1bmN0aW9uQ29kZSIgKSwgIn0iICk7CisJCQkJfSwKKwkJCQlh
cnJheTogYXJyYXksCisJCQkJbm9kZWxpc3Q6IGFycmF5LAorCQkJCSJhcmd1bWVudHMiOiBhcnJh
eSwKKwkJCQlvYmplY3Q6IGZ1bmN0aW9uKCBtYXAsIHN0YWNrICkgeworCQkJCQl2YXIga2V5cywg
a2V5LCB2YWwsIGksIG5vbkVudW1lcmFibGVQcm9wZXJ0aWVzLAorCQkJCQkJcmV0ID0gW107CisK
KwkJCQkJaWYgKCBkdW1wLm1heERlcHRoICYmIGR1bXAuZGVwdGggPiBkdW1wLm1heERlcHRoICkg
eworCQkJCQkJcmV0dXJuICJbb2JqZWN0IE9iamVjdF0iOworCQkJCQl9CisKKwkJCQkJZHVtcC51
cCgpOworCQkJCQlrZXlzID0gW107CisJCQkJCWZvciAoIGtleSBpbiBtYXAgKSB7CisJCQkJCQlr
ZXlzLnB1c2goIGtleSApOworCQkJCQl9CisKKwkJCQkJLy8gU29tZSBwcm9wZXJ0aWVzIGFyZSBu
b3QgYWx3YXlzIGVudW1lcmFibGUgb24gRXJyb3Igb2JqZWN0cy4KKwkJCQkJbm9uRW51bWVyYWJs
ZVByb3BlcnRpZXMgPSBbICJtZXNzYWdlIiwgIm5hbWUiIF07CisJCQkJCWZvciAoIGkgaW4gbm9u
RW51bWVyYWJsZVByb3BlcnRpZXMgKSB7CisJCQkJCQlrZXkgPSBub25FbnVtZXJhYmxlUHJvcGVy
dGllc1sgaSBdOworCQkJCQkJaWYgKCBrZXkgaW4gbWFwICYmIGluQXJyYXkoIGtleSwga2V5cyAp
IDwgMCApIHsKKwkJCQkJCQlrZXlzLnB1c2goIGtleSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJ
CWtleXMuc29ydCgpOworCQkJCQlmb3IgKCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKysgKSB7
CisJCQkJCQlrZXkgPSBrZXlzWyBpIF07CisJCQkJCQl2YWwgPSBtYXBbIGtleSBdOworCQkJCQkJ
cmV0LnB1c2goIGR1bXAucGFyc2UoIGtleSwgImtleSIgKSArICI6ICIgKworCQkJCQkJCWR1bXAu
cGFyc2UoIHZhbCwgdW5kZWZpbmVkLCBzdGFjayApICk7CisJCQkJCX0KKwkJCQkJZHVtcC5kb3du
KCk7CisJCQkJCXJldHVybiBqb2luKCAieyIsIHJldCwgIn0iICk7CisJCQkJfSwKKwkJCQlub2Rl
OiBmdW5jdGlvbiggbm9kZSApIHsKKwkJCQkJdmFyIGxlbiwgaSwgdmFsLAorCQkJCQkJb3BlbiA9
IGR1bXAuSFRNTCA/ICImbHQ7IiA6ICI8IiwKKwkJCQkJCWNsb3NlID0gZHVtcC5IVE1MID8gIiZn
dDsiIDogIj4iLAorCQkJCQkJdGFnID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLAorCQkJ
CQkJcmV0ID0gb3BlbiArIHRhZywKKwkJCQkJCWF0dHJzID0gbm9kZS5hdHRyaWJ1dGVzOworCisJ
CQkJCWlmICggYXR0cnMgKSB7CisJCQkJCQlmb3IgKCBpID0gMCwgbGVuID0gYXR0cnMubGVuZ3Ro
OyBpIDwgbGVuOyBpKysgKSB7CisJCQkJCQkJdmFsID0gYXR0cnNbIGkgXS5ub2RlVmFsdWU7CisK
KwkJCQkJCQkvLyBJRTYgaW5jbHVkZXMgYWxsIGF0dHJpYnV0ZXMgaW4gLmF0dHJpYnV0ZXMsIGV2
ZW4gb25lcyBub3QgZXhwbGljaXRseQorCQkJCQkJCS8vIHNldC4gVGhvc2UgaGF2ZSB2YWx1ZXMg
bGlrZSB1bmRlZmluZWQsIG51bGwsIDAsIGZhbHNlLCAiIiBvcgorCQkJCQkJCS8vICJpbmhlcml0
Ii4KKwkJCQkJCQlpZiAoIHZhbCAmJiB2YWwgIT09ICJpbmhlcml0IiApIHsKKwkJCQkJCQkJcmV0
ICs9ICIgIiArIGF0dHJzWyBpIF0ubm9kZU5hbWUgKyAiPSIgKworCQkJCQkJCQkJZHVtcC5wYXJz
ZSggdmFsLCAiYXR0cmlidXRlIiApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQly
ZXQgKz0gY2xvc2U7CisKKwkJCQkJLy8gU2hvdyBjb250ZW50IG9mIFRleHROb2RlIG9yIENEQVRB
U2VjdGlvbgorCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDMgfHwgbm9kZS5ub2RlVHlwZSA9
PT0gNCApIHsKKwkJCQkJCXJldCArPSBub2RlLm5vZGVWYWx1ZTsKKwkJCQkJfQorCisJCQkJCXJl
dHVybiByZXQgKyBvcGVuICsgIi8iICsgdGFnICsgY2xvc2U7CisJCQkJfSwKKworCQkJCS8vIGZ1
bmN0aW9uIGNhbGxzIGl0IGludGVybmFsbHksIGl0J3MgdGhlIGFyZ3VtZW50cyBwYXJ0IG9mIHRo
ZSBmdW5jdGlvbgorCQkJCWZ1bmN0aW9uQXJnczogZnVuY3Rpb24oIGZuICkgeworCQkJCQl2YXIg
YXJncywKKwkJCQkJCWwgPSBmbi5sZW5ndGg7CisKKwkJCQkJaWYgKCAhbCApIHsKKwkJCQkJCXJl
dHVybiAiIjsKKwkJCQkJfQorCisJCQkJCWFyZ3MgPSBuZXcgQXJyYXkoIGwgKTsKKwkJCQkJd2hp
bGUgKCBsLS0gKSB7CisKKwkJCQkJCS8vIDk3IGlzICdhJworCQkJCQkJYXJnc1sgbCBdID0gU3Ry
aW5nLmZyb21DaGFyQ29kZSggOTcgKyBsICk7CisJCQkJCX0KKwkJCQkJcmV0dXJuICIgIiArIGFy
Z3Muam9pbiggIiwgIiApICsgIiAiOworCQkJCX0sCisJCQkJLy8gb2JqZWN0IGNhbGxzIGl0IGlu
dGVybmFsbHksIHRoZSBrZXkgcGFydCBvZiBhbiBpdGVtIGluIGEgbWFwCisJCQkJa2V5OiBxdW90
ZSwKKwkJCQkvLyBmdW5jdGlvbiBjYWxscyBpdCBpbnRlcm5hbGx5LCBpdCdzIHRoZSBjb250ZW50
IG9mIHRoZSBmdW5jdGlvbgorCQkJCWZ1bmN0aW9uQ29kZTogIltjb2RlXSIsCisJCQkJLy8gbm9k
ZSBjYWxscyBpdCBpbnRlcm5hbGx5LCBpdCdzIGFuIGh0bWwgYXR0cmlidXRlIHZhbHVlCisJCQkJ
YXR0cmlidXRlOiBxdW90ZSwKKwkJCQlzdHJpbmc6IHF1b3RlLAorCQkJCWRhdGU6IHF1b3RlLAor
CQkJCXJlZ2V4cDogbGl0ZXJhbCwKKwkJCQludW1iZXI6IGxpdGVyYWwsCisJCQkJImJvb2xlYW4i
OiBsaXRlcmFsCisJCQl9LAorCQkJLy8gaWYgdHJ1ZSwgZW50aXRpZXMgYXJlIGVzY2FwZWQgKCA8
LCA+LCBcdCwgc3BhY2UgYW5kIFxuICkKKwkJCUhUTUw6IGZhbHNlLAorCQkJLy8gaW5kZW50YXRp
b24gdW5pdAorCQkJaW5kZW50Q2hhcjogIiAgIiwKKwkJCS8vIGlmIHRydWUsIGl0ZW1zIGluIGEg
Y29sbGVjdGlvbiwgYXJlIHNlcGFyYXRlZCBieSBhIFxuLCBlbHNlIGp1c3QgYSBzcGFjZS4KKwkJ
CW11bHRpbGluZTogdHJ1ZQorCQl9OworCisJcmV0dXJuIGR1bXA7Cit9KCkpOworCisvLyBiYWNr
IGNvbXBhdAorUVVuaXQuanNEdW1wID0gUVVuaXQuZHVtcDsKKworLy8gRm9yIGJyb3dzZXIsIGV4
cG9ydCBvbmx5IHNlbGVjdCBnbG9iYWxzCitpZiAoIGRlZmluZWQuZG9jdW1lbnQgKSB7CisKKwkv
LyBEZXByZWNhdGVkCisJLy8gRXh0ZW5kIGFzc2VydCBtZXRob2RzIHRvIFFVbml0IGFuZCBHbG9i
YWwgc2NvcGUgdGhyb3VnaCBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCShmdW5jdGlvbigpIHsK
KwkJdmFyIGksCisJCQlhc3NlcnRpb25zID0gQXNzZXJ0LnByb3RvdHlwZTsKKworCQlmdW5jdGlv
biBhcHBseUN1cnJlbnQoIGN1cnJlbnQgKSB7CisJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CisJCQkJ
dmFyIGFzc2VydCA9IG5ldyBBc3NlcnQoIFFVbml0LmNvbmZpZy5jdXJyZW50ICk7CisJCQkJY3Vy
cmVudC5hcHBseSggYXNzZXJ0LCBhcmd1bWVudHMgKTsKKwkJCX07CisJCX0KKworCQlmb3IgKCBp
IGluIGFzc2VydGlvbnMgKSB7CisJCQlRVW5pdFsgaSBdID0gYXBwbHlDdXJyZW50KCBhc3NlcnRp
b25zWyBpIF0gKTsKKwkJfQorCX0pKCk7CisKKwkoZnVuY3Rpb24oKSB7CisJCXZhciBpLCBsLAor
CQkJa2V5cyA9IFsKKwkJCQkidGVzdCIsCisJCQkJIm1vZHVsZSIsCisJCQkJImV4cGVjdCIsCisJ
CQkJImFzeW5jVGVzdCIsCisJCQkJInN0YXJ0IiwKKwkJCQkic3RvcCIsCisJCQkJIm9rIiwKKwkJ
CQkibm90T2siLAorCQkJCSJlcXVhbCIsCisJCQkJIm5vdEVxdWFsIiwKKwkJCQkicHJvcEVxdWFs
IiwKKwkJCQkibm90UHJvcEVxdWFsIiwKKwkJCQkiZGVlcEVxdWFsIiwKKwkJCQkibm90RGVlcEVx
dWFsIiwKKwkJCQkic3RyaWN0RXF1YWwiLAorCQkJCSJub3RTdHJpY3RFcXVhbCIsCisJCQkJInRo
cm93cyIsCisJCQkJInJhaXNlcyIKKwkJCV07CisKKwkJZm9yICggaSA9IDAsIGwgPSBrZXlzLmxl
bmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCXdpbmRvd1sga2V5c1sgaSBdIF0gPSBRVW5pdFsga2V5
c1sgaSBdIF07CisJCX0KKwl9KSgpOworCisJd2luZG93LlFVbml0ID0gUVVuaXQ7Cit9CisKKy8v
IEZvciBub2RlanMKK2lmICggdHlwZW9mIG1vZHVsZSAhPT0gInVuZGVmaW5lZCIgJiYgbW9kdWxl
ICYmIG1vZHVsZS5leHBvcnRzICkgeworCW1vZHVsZS5leHBvcnRzID0gUVVuaXQ7CisKKwkvLyBG
b3IgY29uc2lzdGVuY3kgd2l0aCBDb21tb25KUyBlbnZpcm9ubWVudHMnIGV4cG9ydHMKKwltb2R1
bGUuZXhwb3J0cy5RVW5pdCA9IFFVbml0OworfQorCisvLyBGb3IgQ29tbW9uSlMgd2l0aCBleHBv
cnRzLCBidXQgd2l0aG91dCBtb2R1bGUuZXhwb3J0cywgbGlrZSBSaGlubworaWYgKCB0eXBlb2Yg
ZXhwb3J0cyAhPT0gInVuZGVmaW5lZCIgJiYgZXhwb3J0cyApIHsKKwlleHBvcnRzLlFVbml0ID0g
UVVuaXQ7Cit9CisKK2lmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUu
YW1kICkgeworCWRlZmluZSggZnVuY3Rpb24oKSB7CisJCXJldHVybiBRVW5pdDsKKwl9ICk7CisJ
UVVuaXQuY29uZmlnLmF1dG9zdGFydCA9IGZhbHNlOworfQorCisvKgorICogVGhpcyBmaWxlIGlz
IGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBnb29nbGUtZGlmZi1tYXRjaC1wYXRjaCdzIEphdmFTY3Jp
cHQgaW1wbGVtZW50YXRpb24KKyAqIChodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1k
aWZmLW1hdGNoLXBhdGNoL3NvdXJjZS9icm93c2UvdHJ1bmsvamF2YXNjcmlwdC9kaWZmX21hdGNo
X3BhdGNoX3VuY29tcHJlc3NlZC5qcyksCisgKiBtb2RpZmljYXRpb25zIGFyZSBsaWNlbnNlZCBh
cyBtb3JlIGZ1bGx5IHNldCBmb3J0aCBpbiBMSUNFTlNFLnR4dC4KKyAqCisgKiBUaGUgb3JpZ2lu
YWwgc291cmNlIG9mIGdvb2dsZS1kaWZmLW1hdGNoLXBhdGNoIGlzIGF0dHJpYnV0YWJsZSBhbmQg
bGljZW5zZWQgYXMgZm9sbG93czoKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBHb29nbGUgSW5jLgor
ICogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoLworICoK
KyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAi
TGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxp
YW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBM
aWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0Ut
Mi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0
byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2Ug
aXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElF
UyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgor
ICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBl
cm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICog
TW9yZSBJbmZvOgorICogIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLWRpZmYtbWF0
Y2gtcGF0Y2gvCisgKgorICogVXNhZ2U6IFFVbml0LmRpZmYoZXhwZWN0ZWQsIGFjdHVhbCkKKyAq
CisgKi8KK1FVbml0LmRpZmYgPSAoIGZ1bmN0aW9uKCkgeworCWZ1bmN0aW9uIERpZmZNYXRjaFBh
dGNoKCkgeworCX0KKworCS8vICBESUZGIEZVTkNUSU9OUworCisJLyoqCisJICogVGhlIGRhdGEg
c3RydWN0dXJlIHJlcHJlc2VudGluZyBhIGRpZmYgaXMgYW4gYXJyYXkgb2YgdHVwbGVzOgorCSAq
IFtbRElGRl9ERUxFVEUsICdIZWxsbyddLCBbRElGRl9JTlNFUlQsICdHb29kYnllJ10sIFtESUZG
X0VRVUFMLCAnIHdvcmxkLiddXQorCSAqIHdoaWNoIG1lYW5zOiBkZWxldGUgJ0hlbGxvJywgYWRk
ICdHb29kYnllJyBhbmQga2VlcCAnIHdvcmxkLicKKwkgKi8KKwl2YXIgRElGRl9ERUxFVEUgPSAt
MSwKKwkJRElGRl9JTlNFUlQgPSAxLAorCQlESUZGX0VRVUFMID0gMDsKKworCS8qKgorCSAqIEZp
bmQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIHRleHRzLiAgU2ltcGxpZmllcyB0aGUgcHJv
YmxlbSBieSBzdHJpcHBpbmcKKwkgKiBhbnkgY29tbW9uIHByZWZpeCBvciBzdWZmaXggb2ZmIHRo
ZSB0ZXh0cyBiZWZvcmUgZGlmZmluZy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgT2xkIHN0
cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIE5ldyBzdHJpbmcg
dG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdENoZWNrbGluZXMgT3B0aW9u
YWwgc3BlZWR1cCBmbGFnLiBJZiBwcmVzZW50IGFuZCBmYWxzZSwKKwkgKiAgICAgdGhlbiBkb24n
dCBydW4gYSBsaW5lLWxldmVsIGRpZmYgZmlyc3QgdG8gaWRlbnRpZnkgdGhlIGNoYW5nZWQgYXJl
YXMuCisJICogICAgIERlZmF1bHRzIHRvIHRydWUsIHdoaWNoIGRvZXMgYSBmYXN0ZXIsIHNsaWdo
dGx5IGxlc3Mgb3B0aW1hbCBkaWZmLgorCSAqIEByZXR1cm4geyFBcnJheS48IURpZmZNYXRjaFBh
dGNoLkRpZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5w
cm90b3R5cGUuRGlmZk1haW4gPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyLCBvcHRDaGVja2xpbmVz
ICkgeworCQl2YXIgZGVhZGxpbmUsIGNoZWNrbGluZXMsIGNvbW1vbmxlbmd0aCwKKwkJCWNvbW1v
bnByZWZpeCwgY29tbW9uc3VmZml4LCBkaWZmczsKKworCQkvLyBUaGUgZGlmZiBtdXN0IGJlIGNv
bXBsZXRlIGluIHVwIHRvIDEgc2Vjb25kLgorCQlkZWFkbGluZSA9ICggbmV3IERhdGUoKSApLmdl
dFRpbWUoKSArIDEwMDA7CisKKwkJLy8gQ2hlY2sgZm9yIG51bGwgaW5wdXRzLgorCQlpZiAoIHRl
eHQxID09PSBudWxsIHx8IHRleHQyID09PSBudWxsICkgeworCQkJdGhyb3cgbmV3IEVycm9yKCAi
TnVsbCBpbnB1dC4gKERpZmZNYWluKSIgKTsKKwkJfQorCisJCS8vIENoZWNrIGZvciBlcXVhbGl0
eSAoc3BlZWR1cCkuCisJCWlmICggdGV4dDEgPT09IHRleHQyICkgeworCQkJaWYgKCB0ZXh0MSAp
IHsKKwkJCQlyZXR1cm4gWworCQkJCQlbIERJRkZfRVFVQUwsIHRleHQxIF0KKwkJCQldOworCQkJ
fQorCQkJcmV0dXJuIFtdOworCQl9CisKKwkJaWYgKCB0eXBlb2Ygb3B0Q2hlY2tsaW5lcyA9PT0g
InVuZGVmaW5lZCIgKSB7CisJCQlvcHRDaGVja2xpbmVzID0gdHJ1ZTsKKwkJfQorCisJCWNoZWNr
bGluZXMgPSBvcHRDaGVja2xpbmVzOworCisJCS8vIFRyaW0gb2ZmIGNvbW1vbiBwcmVmaXggKHNw
ZWVkdXApLgorCQljb21tb25sZW5ndGggPSB0aGlzLmRpZmZDb21tb25QcmVmaXgoIHRleHQxLCB0
ZXh0MiApOworCQljb21tb25wcmVmaXggPSB0ZXh0MS5zdWJzdHJpbmcoIDAsIGNvbW1vbmxlbmd0
aCApOworCQl0ZXh0MSA9IHRleHQxLnN1YnN0cmluZyggY29tbW9ubGVuZ3RoICk7CisJCXRleHQy
ID0gdGV4dDIuc3Vic3RyaW5nKCBjb21tb25sZW5ndGggKTsKKworCQkvLyBUcmltIG9mZiBjb21t
b24gc3VmZml4IChzcGVlZHVwKS4KKwkJY29tbW9ubGVuZ3RoID0gdGhpcy5kaWZmQ29tbW9uU3Vm
Zml4KCB0ZXh0MSwgdGV4dDIgKTsKKwkJY29tbW9uc3VmZml4ID0gdGV4dDEuc3Vic3RyaW5nKCB0
ZXh0MS5sZW5ndGggLSBjb21tb25sZW5ndGggKTsKKwkJdGV4dDEgPSB0ZXh0MS5zdWJzdHJpbmco
IDAsIHRleHQxLmxlbmd0aCAtIGNvbW1vbmxlbmd0aCApOworCQl0ZXh0MiA9IHRleHQyLnN1YnN0
cmluZyggMCwgdGV4dDIubGVuZ3RoIC0gY29tbW9ubGVuZ3RoICk7CisKKwkJLy8gQ29tcHV0ZSB0
aGUgZGlmZiBvbiB0aGUgbWlkZGxlIGJsb2NrLgorCQlkaWZmcyA9IHRoaXMuZGlmZkNvbXB1dGUo
IHRleHQxLCB0ZXh0MiwgY2hlY2tsaW5lcywgZGVhZGxpbmUgKTsKKworCQkvLyBSZXN0b3JlIHRo
ZSBwcmVmaXggYW5kIHN1ZmZpeC4KKwkJaWYgKCBjb21tb25wcmVmaXggKSB7CisJCQlkaWZmcy51
bnNoaWZ0KCBbIERJRkZfRVFVQUwsIGNvbW1vbnByZWZpeCBdICk7CisJCX0KKwkJaWYgKCBjb21t
b25zdWZmaXggKSB7CisJCQlkaWZmcy5wdXNoKCBbIERJRkZfRVFVQUwsIGNvbW1vbnN1ZmZpeCBd
ICk7CisJCX0KKwkJdGhpcy5kaWZmQ2xlYW51cE1lcmdlKCBkaWZmcyApOworCQlyZXR1cm4gZGlm
ZnM7CisJfTsKKworCS8qKgorCSAqIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGVkaXRzIGJ5IGVsaW1p
bmF0aW5nIG9wZXJhdGlvbmFsbHkgdHJpdmlhbCBlcXVhbGl0aWVzLgorCSAqIEBwYXJhbSB7IUFy
cmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLgor
CSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ2xlYW51cEVmZmljaWVuY3kgPSBm
dW5jdGlvbiggZGlmZnMgKSB7CisJCXZhciBjaGFuZ2VzLCBlcXVhbGl0aWVzLCBlcXVhbGl0aWVz
TGVuZ3RoLCBsYXN0ZXF1YWxpdHksCisJCQlwb2ludGVyLCBwcmVJbnMsIHByZURlbCwgcG9zdElu
cywgcG9zdERlbDsKKwkJY2hhbmdlcyA9IGZhbHNlOworCQllcXVhbGl0aWVzID0gW107IC8vIFN0
YWNrIG9mIGluZGljZXMgd2hlcmUgZXF1YWxpdGllcyBhcmUgZm91bmQuCisJCWVxdWFsaXRpZXNM
ZW5ndGggPSAwOyAvLyBLZWVwaW5nIG91ciBvd24gbGVuZ3RoIHZhciBpcyBmYXN0ZXIgaW4gSlMu
CisJCS8qKiBAdHlwZSB7P3N0cmluZ30gKi8KKwkJbGFzdGVxdWFsaXR5ID0gbnVsbDsKKwkJLy8g
QWx3YXlzIGVxdWFsIHRvIGRpZmZzW2VxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCAtIDFdXVsx
XQorCQlwb2ludGVyID0gMDsgLy8gSW5kZXggb2YgY3VycmVudCBwb3NpdGlvbi4KKwkJLy8gSXMg
dGhlcmUgYW4gaW5zZXJ0aW9uIG9wZXJhdGlvbiBiZWZvcmUgdGhlIGxhc3QgZXF1YWxpdHkuCisJ
CXByZUlucyA9IGZhbHNlOworCQkvLyBJcyB0aGVyZSBhIGRlbGV0aW9uIG9wZXJhdGlvbiBiZWZv
cmUgdGhlIGxhc3QgZXF1YWxpdHkuCisJCXByZURlbCA9IGZhbHNlOworCQkvLyBJcyB0aGVyZSBh
biBpbnNlcnRpb24gb3BlcmF0aW9uIGFmdGVyIHRoZSBsYXN0IGVxdWFsaXR5LgorCQlwb3N0SW5z
ID0gZmFsc2U7CisJCS8vIElzIHRoZXJlIGEgZGVsZXRpb24gb3BlcmF0aW9uIGFmdGVyIHRoZSBs
YXN0IGVxdWFsaXR5LgorCQlwb3N0RGVsID0gZmFsc2U7CisJCXdoaWxlICggcG9pbnRlciA8IGRp
ZmZzLmxlbmd0aCApIHsKKworCQkJLy8gRXF1YWxpdHkgZm91bmQuCisJCQlpZiAoIGRpZmZzWyBw
b2ludGVyIF1bIDAgXSA9PT0gRElGRl9FUVVBTCApIHsKKwkJCQlpZiAoIGRpZmZzWyBwb2ludGVy
IF1bIDEgXS5sZW5ndGggPCA0ICYmICggcG9zdElucyB8fCBwb3N0RGVsICkgKSB7CisKKwkJCQkJ
Ly8gQ2FuZGlkYXRlIGZvdW5kLgorCQkJCQllcXVhbGl0aWVzWyBlcXVhbGl0aWVzTGVuZ3RoKysg
XSA9IHBvaW50ZXI7CisJCQkJCXByZUlucyA9IHBvc3RJbnM7CisJCQkJCXByZURlbCA9IHBvc3RE
ZWw7CisJCQkJCWxhc3RlcXVhbGl0eSA9IGRpZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQl9IGVs
c2UgeworCisJCQkJCS8vIE5vdCBhIGNhbmRpZGF0ZSwgYW5kIGNhbiBuZXZlciBiZWNvbWUgb25l
LgorCQkJCQllcXVhbGl0aWVzTGVuZ3RoID0gMDsKKwkJCQkJbGFzdGVxdWFsaXR5ID0gbnVsbDsK
KwkJCQl9CisJCQkJcG9zdElucyA9IHBvc3REZWwgPSBmYWxzZTsKKworCQkJLy8gQW4gaW5zZXJ0
aW9uIG9yIGRlbGV0aW9uLgorCQkJfSBlbHNlIHsKKworCQkJCWlmICggZGlmZnNbIHBvaW50ZXIg
XVsgMCBdID09PSBESUZGX0RFTEVURSApIHsKKwkJCQkJcG9zdERlbCA9IHRydWU7CisJCQkJfSBl
bHNlIHsKKwkJCQkJcG9zdElucyA9IHRydWU7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBGaXZl
IHR5cGVzIHRvIGJlIHNwbGl0OgorCQkJCSAqIDxpbnM+QTwvaW5zPjxkZWw+QjwvZGVsPlhZPGlu
cz5DPC9pbnM+PGRlbD5EPC9kZWw+CisJCQkJICogPGlucz5BPC9pbnM+WDxpbnM+QzwvaW5zPjxk
ZWw+RDwvZGVsPgorCQkJCSAqIDxpbnM+QTwvaW5zPjxkZWw+QjwvZGVsPlg8aW5zPkM8L2lucz4K
KwkJCQkgKiA8aW5zPkE8L2RlbD5YPGlucz5DPC9pbnM+PGRlbD5EPC9kZWw+CisJCQkJICogPGlu
cz5BPC9pbnM+PGRlbD5CPC9kZWw+WDxkZWw+QzwvZGVsPgorCQkJCSAqLworCQkJCWlmICggbGFz
dGVxdWFsaXR5ICYmICggKCBwcmVJbnMgJiYgcHJlRGVsICYmIHBvc3RJbnMgJiYgcG9zdERlbCAp
IHx8CisJCQkJCQkoICggbGFzdGVxdWFsaXR5Lmxlbmd0aCA8IDIgKSAmJgorCQkJCQkJKCBwcmVJ
bnMgKyBwcmVEZWwgKyBwb3N0SW5zICsgcG9zdERlbCApID09PSAzICkgKSApIHsKKworCQkJCQkv
LyBEdXBsaWNhdGUgcmVjb3JkLgorCQkJCQlkaWZmcy5zcGxpY2UoCisJCQkJCQllcXVhbGl0aWVz
WyBlcXVhbGl0aWVzTGVuZ3RoIC0gMSBdLAorCQkJCQkJMCwKKwkJCQkJCVsgRElGRl9ERUxFVEUs
IGxhc3RlcXVhbGl0eSBdCisJCQkJCSk7CisKKwkJCQkJLy8gQ2hhbmdlIHNlY29uZCBjb3B5IHRv
IGluc2VydC4KKwkJCQkJZGlmZnNbIGVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGggLSAxIF0g
KyAxIF1bIDAgXSA9IERJRkZfSU5TRVJUOworCQkJCQllcXVhbGl0aWVzTGVuZ3RoLS07IC8vIFRo
cm93IGF3YXkgdGhlIGVxdWFsaXR5IHdlIGp1c3QgZGVsZXRlZDsKKwkJCQkJbGFzdGVxdWFsaXR5
ID0gbnVsbDsKKwkJCQkJaWYgKCBwcmVJbnMgJiYgcHJlRGVsICkgeworCQkJCQkJLy8gTm8gY2hh
bmdlcyBtYWRlIHdoaWNoIGNvdWxkIGFmZmVjdCBwcmV2aW91cyBlbnRyeSwga2VlcCBnb2luZy4K
KwkJCQkJCXBvc3RJbnMgPSBwb3N0RGVsID0gdHJ1ZTsKKwkJCQkJCWVxdWFsaXRpZXNMZW5ndGgg
PSAwOworCQkJCQl9IGVsc2UgeworCQkJCQkJZXF1YWxpdGllc0xlbmd0aC0tOyAvLyBUaHJvdyBh
d2F5IHRoZSBwcmV2aW91cyBlcXVhbGl0eS4KKwkJCQkJCXBvaW50ZXIgPSBlcXVhbGl0aWVzTGVu
Z3RoID4gMCA/IGVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGggLSAxIF0gOiAtMTsKKwkJCQkJ
CXBvc3RJbnMgPSBwb3N0RGVsID0gZmFsc2U7CisJCQkJCX0KKwkJCQkJY2hhbmdlcyA9IHRydWU7
CisJCQkJfQorCQkJfQorCQkJcG9pbnRlcisrOworCQl9CisKKwkJaWYgKCBjaGFuZ2VzICkgewor
CQkJdGhpcy5kaWZmQ2xlYW51cE1lcmdlKCBkaWZmcyApOworCQl9CisJfTsKKworCS8qKgorCSAq
IENvbnZlcnQgYSBkaWZmIGFycmF5IGludG8gYSBwcmV0dHkgSFRNTCByZXBvcnQuCisJICogQHBh
cmFtIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0
dXBsZXMuCisJICogQHBhcmFtIHtpbnRlZ2VyfSBzdHJpbmcgdG8gYmUgYmVhdXRpZmllZC4KKwkg
KiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgcmVwcmVzZW50YXRpb24uCisJICovCisJRGlmZk1hdGNo
UGF0Y2gucHJvdG90eXBlLmRpZmZQcmV0dHlIdG1sID0gZnVuY3Rpb24oIGRpZmZzICkgeworCQl2
YXIgb3AsIGRhdGEsIHgsCisJCQlodG1sID0gW107CisJCWZvciAoIHggPSAwOyB4IDwgZGlmZnMu
bGVuZ3RoOyB4KysgKSB7CisJCQlvcCA9IGRpZmZzWyB4IF1bIDAgXTsgLy8gT3BlcmF0aW9uIChp
bnNlcnQsIGRlbGV0ZSwgZXF1YWwpCisJCQlkYXRhID0gZGlmZnNbIHggXVsgMSBdOyAvLyBUZXh0
IG9mIGNoYW5nZS4KKwkJCXN3aXRjaCAoIG9wICkgeworCQkJY2FzZSBESUZGX0lOU0VSVDoKKwkJ
CQlodG1sWyB4IF0gPSAiPGlucz4iICsgZGF0YSArICI8L2lucz4iOworCQkJCWJyZWFrOworCQkJ
Y2FzZSBESUZGX0RFTEVURToKKwkJCQlodG1sWyB4IF0gPSAiPGRlbD4iICsgZGF0YSArICI8L2Rl
bD4iOworCQkJCWJyZWFrOworCQkJY2FzZSBESUZGX0VRVUFMOgorCQkJCWh0bWxbIHggXSA9ICI8
c3Bhbj4iICsgZGF0YSArICI8L3NwYW4+IjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1
cm4gaHRtbC5qb2luKCAiIiApOworCX07CisKKwkvKioKKwkgKiBEZXRlcm1pbmUgdGhlIGNvbW1v
biBwcmVmaXggb2YgdHdvIHN0cmluZ3MuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0
IHN0cmluZy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy4KKwkgKiBA
cmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb21tb24gdG8gdGhlIHN0
YXJ0IG9mIGVhY2gKKwkgKiAgICAgc3RyaW5nLgorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3Rv
dHlwZS5kaWZmQ29tbW9uUHJlZml4ID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiApIHsKKwkJdmFy
IHBvaW50ZXJtaWQsIHBvaW50ZXJtYXgsIHBvaW50ZXJtaW4sIHBvaW50ZXJzdGFydDsKKwkJLy8g
UXVpY2sgY2hlY2sgZm9yIGNvbW1vbiBudWxsIGNhc2VzLgorCQlpZiAoICF0ZXh0MSB8fCAhdGV4
dDIgfHwgdGV4dDEuY2hhckF0KCAwICkgIT09IHRleHQyLmNoYXJBdCggMCApICkgeworCQkJcmV0
dXJuIDA7CisJCX0KKwkJLy8gQmluYXJ5IHNlYXJjaC4KKwkJLy8gUGVyZm9ybWFuY2UgYW5hbHlz
aXM6IGh0dHA6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAwNy8xMC8wOS8KKwkJcG9pbnRlcm1p
biA9IDA7CisJCXBvaW50ZXJtYXggPSBNYXRoLm1pbiggdGV4dDEubGVuZ3RoLCB0ZXh0Mi5sZW5n
dGggKTsKKwkJcG9pbnRlcm1pZCA9IHBvaW50ZXJtYXg7CisJCXBvaW50ZXJzdGFydCA9IDA7CisJ
CXdoaWxlICggcG9pbnRlcm1pbiA8IHBvaW50ZXJtaWQgKSB7CisJCQlpZiAoIHRleHQxLnN1YnN0
cmluZyggcG9pbnRlcnN0YXJ0LCBwb2ludGVybWlkICkgPT09CisJCQkJCXRleHQyLnN1YnN0cmlu
ZyggcG9pbnRlcnN0YXJ0LCBwb2ludGVybWlkICkgKSB7CisJCQkJcG9pbnRlcm1pbiA9IHBvaW50
ZXJtaWQ7CisJCQkJcG9pbnRlcnN0YXJ0ID0gcG9pbnRlcm1pbjsKKwkJCX0gZWxzZSB7CisJCQkJ
cG9pbnRlcm1heCA9IHBvaW50ZXJtaWQ7CisJCQl9CisJCQlwb2ludGVybWlkID0gTWF0aC5mbG9v
ciggKCBwb2ludGVybWF4IC0gcG9pbnRlcm1pbiApIC8gMiArIHBvaW50ZXJtaW4gKTsKKwkJfQor
CQlyZXR1cm4gcG9pbnRlcm1pZDsKKwl9OworCisJLyoqCisJICogRGV0ZXJtaW5lIHRoZSBjb21t
b24gc3VmZml4IG9mIHR3byBzdHJpbmdzLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJz
dCBzdHJpbmcuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNlY29uZCBzdHJpbmcuCisJICog
QHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29tbW9uIHRvIHRoZSBl
bmQgb2YgZWFjaCBzdHJpbmcuCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZD
b21tb25TdWZmaXggPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyICkgeworCQl2YXIgcG9pbnRlcm1p
ZCwgcG9pbnRlcm1heCwgcG9pbnRlcm1pbiwgcG9pbnRlcmVuZDsKKwkJLy8gUXVpY2sgY2hlY2sg
Zm9yIGNvbW1vbiBudWxsIGNhc2VzLgorCQlpZiAoICF0ZXh0MSB8fAorCQkJCSF0ZXh0MiB8fAor
CQkJCXRleHQxLmNoYXJBdCggdGV4dDEubGVuZ3RoIC0gMSApICE9PSB0ZXh0Mi5jaGFyQXQoIHRl
eHQyLmxlbmd0aCAtIDEgKSApIHsKKwkJCXJldHVybiAwOworCQl9CisJCS8vIEJpbmFyeSBzZWFy
Y2guCisJCS8vIFBlcmZvcm1hbmNlIGFuYWx5c2lzOiBodHRwOi8vbmVpbC5mcmFzZXIubmFtZS9u
ZXdzLzIwMDcvMTAvMDkvCisJCXBvaW50ZXJtaW4gPSAwOworCQlwb2ludGVybWF4ID0gTWF0aC5t
aW4oIHRleHQxLmxlbmd0aCwgdGV4dDIubGVuZ3RoICk7CisJCXBvaW50ZXJtaWQgPSBwb2ludGVy
bWF4OworCQlwb2ludGVyZW5kID0gMDsKKwkJd2hpbGUgKCBwb2ludGVybWluIDwgcG9pbnRlcm1p
ZCApIHsKKwkJCWlmICggdGV4dDEuc3Vic3RyaW5nKCB0ZXh0MS5sZW5ndGggLSBwb2ludGVybWlk
LCB0ZXh0MS5sZW5ndGggLSBwb2ludGVyZW5kICkgPT09CisJCQkJCXRleHQyLnN1YnN0cmluZygg
dGV4dDIubGVuZ3RoIC0gcG9pbnRlcm1pZCwgdGV4dDIubGVuZ3RoIC0gcG9pbnRlcmVuZCApICkg
eworCQkJCXBvaW50ZXJtaW4gPSBwb2ludGVybWlkOworCQkJCXBvaW50ZXJlbmQgPSBwb2ludGVy
bWluOworCQkJfSBlbHNlIHsKKwkJCQlwb2ludGVybWF4ID0gcG9pbnRlcm1pZDsKKwkJCX0KKwkJ
CXBvaW50ZXJtaWQgPSBNYXRoLmZsb29yKCAoIHBvaW50ZXJtYXggLSBwb2ludGVybWluICkgLyAy
ICsgcG9pbnRlcm1pbiApOworCQl9CisJCXJldHVybiBwb2ludGVybWlkOworCX07CisKKwkvKioK
KwkgKiBGaW5kIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byB0ZXh0cy4gIEFzc3VtZXMgdGhh
dCB0aGUgdGV4dHMgZG8gbm90CisJICogaGF2ZSBhbnkgY29tbW9uIHByZWZpeCBvciBzdWZmaXgu
CisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIE9sZCBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAq
IEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFy
YW0ge2Jvb2xlYW59IGNoZWNrbGluZXMgU3BlZWR1cCBmbGFnLiAgSWYgZmFsc2UsIHRoZW4gZG9u
J3QgcnVuIGEKKwkgKiAgICAgbGluZS1sZXZlbCBkaWZmIGZpcnN0IHRvIGlkZW50aWZ5IHRoZSBj
aGFuZ2VkIGFyZWFzLgorCSAqICAgICBJZiB0cnVlLCB0aGVuIHJ1biBhIGZhc3Rlciwgc2xpZ2h0
bHkgbGVzcyBvcHRpbWFsIGRpZmYuCisJICogQHBhcmFtIHtudW1iZXJ9IGRlYWRsaW5lIFRpbWUg
d2hlbiB0aGUgZGlmZiBzaG91bGQgYmUgY29tcGxldGUgYnkuCisJICogQHJldHVybiB7IUFycmF5
LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqIEBwcml2
YXRlCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDb21wdXRlID0gZnVuY3Rp
b24oIHRleHQxLCB0ZXh0MiwgY2hlY2tsaW5lcywgZGVhZGxpbmUgKSB7CisJCXZhciBkaWZmcywg
bG9uZ3RleHQsIHNob3J0dGV4dCwgaSwgaG0sCisJCQl0ZXh0MUEsIHRleHQyQSwgdGV4dDFCLCB0
ZXh0MkIsCisJCQltaWRDb21tb24sIGRpZmZzQSwgZGlmZnNCOworCisJCWlmICggIXRleHQxICkg
eworCQkJLy8gSnVzdCBhZGQgc29tZSB0ZXh0IChzcGVlZHVwKS4KKwkJCXJldHVybiBbCisJCQkJ
WyBESUZGX0lOU0VSVCwgdGV4dDIgXQorCQkJXTsKKwkJfQorCisJCWlmICggIXRleHQyICkgewor
CQkJLy8gSnVzdCBkZWxldGUgc29tZSB0ZXh0IChzcGVlZHVwKS4KKwkJCXJldHVybiBbCisJCQkJ
WyBESUZGX0RFTEVURSwgdGV4dDEgXQorCQkJXTsKKwkJfQorCisJCWxvbmd0ZXh0ID0gdGV4dDEu
bGVuZ3RoID4gdGV4dDIubGVuZ3RoID8gdGV4dDEgOiB0ZXh0MjsKKwkJc2hvcnR0ZXh0ID0gdGV4
dDEubGVuZ3RoID4gdGV4dDIubGVuZ3RoID8gdGV4dDIgOiB0ZXh0MTsKKwkJaSA9IGxvbmd0ZXh0
LmluZGV4T2YoIHNob3J0dGV4dCApOworCQlpZiAoIGkgIT09IC0xICkgeworCQkJLy8gU2hvcnRl
ciB0ZXh0IGlzIGluc2lkZSB0aGUgbG9uZ2VyIHRleHQgKHNwZWVkdXApLgorCQkJZGlmZnMgPSBb
CisJCQkJWyBESUZGX0lOU0VSVCwgbG9uZ3RleHQuc3Vic3RyaW5nKCAwLCBpICkgXSwKKwkJCQlb
IERJRkZfRVFVQUwsIHNob3J0dGV4dCBdLAorCQkJCVsgRElGRl9JTlNFUlQsIGxvbmd0ZXh0LnN1
YnN0cmluZyggaSArIHNob3J0dGV4dC5sZW5ndGggKSBdCisJCQldOworCQkJLy8gU3dhcCBpbnNl
cnRpb25zIGZvciBkZWxldGlvbnMgaWYgZGlmZiBpcyByZXZlcnNlZC4KKwkJCWlmICggdGV4dDEu
bGVuZ3RoID4gdGV4dDIubGVuZ3RoICkgeworCQkJCWRpZmZzWyAwIF1bIDAgXSA9IGRpZmZzWyAy
IF1bIDAgXSA9IERJRkZfREVMRVRFOworCQkJfQorCQkJcmV0dXJuIGRpZmZzOworCQl9CisKKwkJ
aWYgKCBzaG9ydHRleHQubGVuZ3RoID09PSAxICkgeworCQkJLy8gU2luZ2xlIGNoYXJhY3RlciBz
dHJpbmcuCisJCQkvLyBBZnRlciB0aGUgcHJldmlvdXMgc3BlZWR1cCwgdGhlIGNoYXJhY3RlciBj
YW4ndCBiZSBhbiBlcXVhbGl0eS4KKwkJCXJldHVybiBbCisJCQkJWyBESUZGX0RFTEVURSwgdGV4
dDEgXSwKKwkJCQlbIERJRkZfSU5TRVJULCB0ZXh0MiBdCisJCQldOworCQl9CisKKwkJLy8gQ2hl
Y2sgdG8gc2VlIGlmIHRoZSBwcm9ibGVtIGNhbiBiZSBzcGxpdCBpbiB0d28uCisJCWhtID0gdGhp
cy5kaWZmSGFsZk1hdGNoKCB0ZXh0MSwgdGV4dDIgKTsKKwkJaWYgKCBobSApIHsKKwkJCS8vIEEg
aGFsZi1tYXRjaCB3YXMgZm91bmQsIHNvcnQgb3V0IHRoZSByZXR1cm4gZGF0YS4KKwkJCXRleHQx
QSA9IGhtWyAwIF07CisJCQl0ZXh0MUIgPSBobVsgMSBdOworCQkJdGV4dDJBID0gaG1bIDIgXTsK
KwkJCXRleHQyQiA9IGhtWyAzIF07CisJCQltaWRDb21tb24gPSBobVsgNCBdOworCQkJLy8gU2Vu
ZCBib3RoIHBhaXJzIG9mZiBmb3Igc2VwYXJhdGUgcHJvY2Vzc2luZy4KKwkJCWRpZmZzQSA9IHRo
aXMuRGlmZk1haW4oIHRleHQxQSwgdGV4dDJBLCBjaGVja2xpbmVzLCBkZWFkbGluZSApOworCQkJ
ZGlmZnNCID0gdGhpcy5EaWZmTWFpbiggdGV4dDFCLCB0ZXh0MkIsIGNoZWNrbGluZXMsIGRlYWRs
aW5lICk7CisJCQkvLyBNZXJnZSB0aGUgcmVzdWx0cy4KKwkJCXJldHVybiBkaWZmc0EuY29uY2F0
KCBbCisJCQkJWyBESUZGX0VRVUFMLCBtaWRDb21tb24gXQorCQkJXSwgZGlmZnNCICk7CisJCX0K
KworCQlpZiAoIGNoZWNrbGluZXMgJiYgdGV4dDEubGVuZ3RoID4gMTAwICYmIHRleHQyLmxlbmd0
aCA+IDEwMCApIHsKKwkJCXJldHVybiB0aGlzLmRpZmZMaW5lTW9kZSggdGV4dDEsIHRleHQyLCBk
ZWFkbGluZSApOworCQl9CisKKwkJcmV0dXJuIHRoaXMuZGlmZkJpc2VjdCggdGV4dDEsIHRleHQy
LCBkZWFkbGluZSApOworCX07CisKKwkvKioKKwkgKiBEbyB0aGUgdHdvIHRleHRzIHNoYXJlIGEg
c3Vic3RyaW5nIHdoaWNoIGlzIGF0IGxlYXN0IGhhbGYgdGhlIGxlbmd0aCBvZiB0aGUKKwkgKiBs
b25nZXIgdGV4dD8KKwkgKiBUaGlzIHNwZWVkdXAgY2FuIHByb2R1Y2Ugbm9uLW1pbmltYWwgZGlm
ZnMuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0IHN0cmluZy4KKwkgKiBAcGFyYW0g
e3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy4KKwkgKiBAcmV0dXJuIHtBcnJheS48c3RyaW5n
Pn0gRml2ZSBlbGVtZW50IEFycmF5LCBjb250YWluaW5nIHRoZSBwcmVmaXggb2YKKwkgKiAgICAg
dGV4dDEsIHRoZSBzdWZmaXggb2YgdGV4dDEsIHRoZSBwcmVmaXggb2YgdGV4dDIsIHRoZSBzdWZm
aXggb2YKKwkgKiAgICAgdGV4dDIgYW5kIHRoZSBjb21tb24gbWlkZGxlLiAgT3IgbnVsbCBpZiB0
aGVyZSB3YXMgbm8gbWF0Y2guCisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5w
cm90b3R5cGUuZGlmZkhhbGZNYXRjaCA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIgKSB7CisJCXZh
ciBsb25ndGV4dCwgc2hvcnR0ZXh0LCBkbXAsCisJCQl0ZXh0MUEsIHRleHQyQiwgdGV4dDJBLCB0
ZXh0MUIsIG1pZENvbW1vbiwKKwkJCWhtMSwgaG0yLCBobTsKKworCQlsb25ndGV4dCA9IHRleHQx
Lmxlbmd0aCA+IHRleHQyLmxlbmd0aCA/IHRleHQxIDogdGV4dDI7CisJCXNob3J0dGV4dCA9IHRl
eHQxLmxlbmd0aCA+IHRleHQyLmxlbmd0aCA/IHRleHQyIDogdGV4dDE7CisJCWlmICggbG9uZ3Rl
eHQubGVuZ3RoIDwgNCB8fCBzaG9ydHRleHQubGVuZ3RoICogMiA8IGxvbmd0ZXh0Lmxlbmd0aCAp
IHsKKwkJCXJldHVybiBudWxsOyAvLyBQb2ludGxlc3MuCisJCX0KKwkJZG1wID0gdGhpczsgLy8g
J3RoaXMnIGJlY29tZXMgJ3dpbmRvdycgaW4gYSBjbG9zdXJlLgorCisJCS8qKgorCQkgKiBEb2Vz
IGEgc3Vic3RyaW5nIG9mIHNob3J0dGV4dCBleGlzdCB3aXRoaW4gbG9uZ3RleHQgc3VjaCB0aGF0
IHRoZSBzdWJzdHJpbmcKKwkJICogaXMgYXQgbGVhc3QgaGFsZiB0aGUgbGVuZ3RoIG9mIGxvbmd0
ZXh0PworCQkgKiBDbG9zdXJlLCBidXQgZG9lcyBub3QgcmVmZXJlbmNlIGFueSBleHRlcm5hbCB2
YXJpYWJsZXMuCisJCSAqIEBwYXJhbSB7c3RyaW5nfSBsb25ndGV4dCBMb25nZXIgc3RyaW5nLgor
CQkgKiBAcGFyYW0ge3N0cmluZ30gc2hvcnR0ZXh0IFNob3J0ZXIgc3RyaW5nLgorCQkgKiBAcGFy
YW0ge251bWJlcn0gaSBTdGFydCBpbmRleCBvZiBxdWFydGVyIGxlbmd0aCBzdWJzdHJpbmcgd2l0
aGluIGxvbmd0ZXh0LgorCQkgKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gRml2ZSBlbGVtZW50
IEFycmF5LCBjb250YWluaW5nIHRoZSBwcmVmaXggb2YKKwkJICogICAgIGxvbmd0ZXh0LCB0aGUg
c3VmZml4IG9mIGxvbmd0ZXh0LCB0aGUgcHJlZml4IG9mIHNob3J0dGV4dCwgdGhlIHN1ZmZpeAor
CQkgKiAgICAgb2Ygc2hvcnR0ZXh0IGFuZCB0aGUgY29tbW9uIG1pZGRsZS4gIE9yIG51bGwgaWYg
dGhlcmUgd2FzIG5vIG1hdGNoLgorCQkgKiBAcHJpdmF0ZQorCQkgKi8KKwkJZnVuY3Rpb24gZGlm
ZkhhbGZNYXRjaEkoIGxvbmd0ZXh0LCBzaG9ydHRleHQsIGkgKSB7CisJCQl2YXIgc2VlZCwgaiwg
YmVzdENvbW1vbiwgcHJlZml4TGVuZ3RoLCBzdWZmaXhMZW5ndGgsCisJCQkJYmVzdExvbmd0ZXh0
QSwgYmVzdExvbmd0ZXh0QiwgYmVzdFNob3J0dGV4dEEsIGJlc3RTaG9ydHRleHRCOworCQkJLy8g
U3RhcnQgd2l0aCBhIDEvNCBsZW5ndGggc3Vic3RyaW5nIGF0IHBvc2l0aW9uIGkgYXMgYSBzZWVk
LgorCQkJc2VlZCA9IGxvbmd0ZXh0LnN1YnN0cmluZyggaSwgaSArIE1hdGguZmxvb3IoIGxvbmd0
ZXh0Lmxlbmd0aCAvIDQgKSApOworCQkJaiA9IC0xOworCQkJYmVzdENvbW1vbiA9ICIiOworCQkJ
d2hpbGUgKCAoIGogPSBzaG9ydHRleHQuaW5kZXhPZiggc2VlZCwgaiArIDEgKSApICE9PSAtMSAp
IHsKKwkJCQlwcmVmaXhMZW5ndGggPSBkbXAuZGlmZkNvbW1vblByZWZpeCggbG9uZ3RleHQuc3Vi
c3RyaW5nKCBpICksCisJCQkJCXNob3J0dGV4dC5zdWJzdHJpbmcoIGogKSApOworCQkJCXN1ZmZp
eExlbmd0aCA9IGRtcC5kaWZmQ29tbW9uU3VmZml4KCBsb25ndGV4dC5zdWJzdHJpbmcoIDAsIGkg
KSwKKwkJCQkJc2hvcnR0ZXh0LnN1YnN0cmluZyggMCwgaiApICk7CisJCQkJaWYgKCBiZXN0Q29t
bW9uLmxlbmd0aCA8IHN1ZmZpeExlbmd0aCArIHByZWZpeExlbmd0aCApIHsKKwkJCQkJYmVzdENv
bW1vbiA9IHNob3J0dGV4dC5zdWJzdHJpbmcoIGogLSBzdWZmaXhMZW5ndGgsIGogKSArCisJCQkJ
CQlzaG9ydHRleHQuc3Vic3RyaW5nKCBqLCBqICsgcHJlZml4TGVuZ3RoICk7CisJCQkJCWJlc3RM
b25ndGV4dEEgPSBsb25ndGV4dC5zdWJzdHJpbmcoIDAsIGkgLSBzdWZmaXhMZW5ndGggKTsKKwkJ
CQkJYmVzdExvbmd0ZXh0QiA9IGxvbmd0ZXh0LnN1YnN0cmluZyggaSArIHByZWZpeExlbmd0aCAp
OworCQkJCQliZXN0U2hvcnR0ZXh0QSA9IHNob3J0dGV4dC5zdWJzdHJpbmcoIDAsIGogLSBzdWZm
aXhMZW5ndGggKTsKKwkJCQkJYmVzdFNob3J0dGV4dEIgPSBzaG9ydHRleHQuc3Vic3RyaW5nKCBq
ICsgcHJlZml4TGVuZ3RoICk7CisJCQkJfQorCQkJfQorCQkJaWYgKCBiZXN0Q29tbW9uLmxlbmd0
aCAqIDIgPj0gbG9uZ3RleHQubGVuZ3RoICkgeworCQkJCXJldHVybiBbIGJlc3RMb25ndGV4dEEs
IGJlc3RMb25ndGV4dEIsCisJCQkJCWJlc3RTaG9ydHRleHRBLCBiZXN0U2hvcnR0ZXh0QiwgYmVz
dENvbW1vbgorCQkJCV07CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9
CisKKwkJLy8gRmlyc3QgY2hlY2sgaWYgdGhlIHNlY29uZCBxdWFydGVyIGlzIHRoZSBzZWVkIGZv
ciBhIGhhbGYtbWF0Y2guCisJCWhtMSA9IGRpZmZIYWxmTWF0Y2hJKCBsb25ndGV4dCwgc2hvcnR0
ZXh0LAorCQkJTWF0aC5jZWlsKCBsb25ndGV4dC5sZW5ndGggLyA0ICkgKTsKKwkJLy8gQ2hlY2sg
YWdhaW4gYmFzZWQgb24gdGhlIHRoaXJkIHF1YXJ0ZXIuCisJCWhtMiA9IGRpZmZIYWxmTWF0Y2hJ
KCBsb25ndGV4dCwgc2hvcnR0ZXh0LAorCQkJTWF0aC5jZWlsKCBsb25ndGV4dC5sZW5ndGggLyAy
ICkgKTsKKwkJaWYgKCAhaG0xICYmICFobTIgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNl
IGlmICggIWhtMiApIHsKKwkJCWhtID0gaG0xOworCQl9IGVsc2UgaWYgKCAhaG0xICkgeworCQkJ
aG0gPSBobTI7CisJCX0gZWxzZSB7CisJCQkvLyBCb3RoIG1hdGNoZWQuICBTZWxlY3QgdGhlIGxv
bmdlc3QuCisJCQlobSA9IGhtMVsgNCBdLmxlbmd0aCA+IGhtMlsgNCBdLmxlbmd0aCA/IGhtMSA6
IGhtMjsKKwkJfQorCisJCS8vIEEgaGFsZi1tYXRjaCB3YXMgZm91bmQsIHNvcnQgb3V0IHRoZSBy
ZXR1cm4gZGF0YS4KKwkJdGV4dDFBLCB0ZXh0MUIsIHRleHQyQSwgdGV4dDJCOworCQlpZiAoIHRl
eHQxLmxlbmd0aCA+IHRleHQyLmxlbmd0aCApIHsKKwkJCXRleHQxQSA9IGhtWyAwIF07CisJCQl0
ZXh0MUIgPSBobVsgMSBdOworCQkJdGV4dDJBID0gaG1bIDIgXTsKKwkJCXRleHQyQiA9IGhtWyAz
IF07CisJCX0gZWxzZSB7CisJCQl0ZXh0MkEgPSBobVsgMCBdOworCQkJdGV4dDJCID0gaG1bIDEg
XTsKKwkJCXRleHQxQSA9IGhtWyAyIF07CisJCQl0ZXh0MUIgPSBobVsgMyBdOworCQl9CisJCW1p
ZENvbW1vbiA9IGhtWyA0IF07CisJCXJldHVybiBbIHRleHQxQSwgdGV4dDFCLCB0ZXh0MkEsIHRl
eHQyQiwgbWlkQ29tbW9uIF07CisJfTsKKworCS8qKgorCSAqIERvIGEgcXVpY2sgbGluZS1sZXZl
bCBkaWZmIG9uIGJvdGggc3RyaW5ncywgdGhlbiByZWRpZmYgdGhlIHBhcnRzIGZvcgorCSAqIGdy
ZWF0ZXIgYWNjdXJhY3kuCisJICogVGhpcyBzcGVlZHVwIGNhbiBwcm9kdWNlIG5vbi1taW5pbWFs
IGRpZmZzLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZl
ZC4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZmZWQuCisJ
ICogQHBhcmFtIHtudW1iZXJ9IGRlYWRsaW5lIFRpbWUgd2hlbiB0aGUgZGlmZiBzaG91bGQgYmUg
Y29tcGxldGUgYnkuCisJICogQHJldHVybiB7IUFycmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59
IEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqIEBwcml2YXRlCisJICovCisJRGlmZk1hdGNoUGF0
Y2gucHJvdG90eXBlLmRpZmZMaW5lTW9kZSA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIsIGRlYWRs
aW5lICkgeworCQl2YXIgYSwgZGlmZnMsIGxpbmVhcnJheSwgcG9pbnRlciwgY291bnRJbnNlcnQs
CisJCQljb3VudERlbGV0ZSwgdGV4dEluc2VydCwgdGV4dERlbGV0ZSwgajsKKwkJLy8gU2NhbiB0
aGUgdGV4dCBvbiBhIGxpbmUtYnktbGluZSBiYXNpcyBmaXJzdC4KKwkJYSA9IHRoaXMuZGlmZkxp
bmVzVG9DaGFycyggdGV4dDEsIHRleHQyICk7CisJCXRleHQxID0gYS5jaGFyczE7CisJCXRleHQy
ID0gYS5jaGFyczI7CisJCWxpbmVhcnJheSA9IGEubGluZUFycmF5OworCisJCWRpZmZzID0gdGhp
cy5EaWZmTWFpbiggdGV4dDEsIHRleHQyLCBmYWxzZSwgZGVhZGxpbmUgKTsKKworCQkvLyBDb252
ZXJ0IHRoZSBkaWZmIGJhY2sgdG8gb3JpZ2luYWwgdGV4dC4KKwkJdGhpcy5kaWZmQ2hhcnNUb0xp
bmVzKCBkaWZmcywgbGluZWFycmF5ICk7CisJCS8vIEVsaW1pbmF0ZSBmcmVhayBtYXRjaGVzIChl
LmcuIGJsYW5rIGxpbmVzKQorCQl0aGlzLmRpZmZDbGVhbnVwU2VtYW50aWMoIGRpZmZzICk7CisK
KwkJLy8gUmVkaWZmIGFueSByZXBsYWNlbWVudCBibG9ja3MsIHRoaXMgdGltZSBjaGFyYWN0ZXIt
YnktY2hhcmFjdGVyLgorCQkvLyBBZGQgYSBkdW1teSBlbnRyeSBhdCB0aGUgZW5kLgorCQlkaWZm
cy5wdXNoKCBbIERJRkZfRVFVQUwsICIiIF0gKTsKKwkJcG9pbnRlciA9IDA7CisJCWNvdW50RGVs
ZXRlID0gMDsKKwkJY291bnRJbnNlcnQgPSAwOworCQl0ZXh0RGVsZXRlID0gIiI7CisJCXRleHRJ
bnNlcnQgPSAiIjsKKwkJd2hpbGUgKCBwb2ludGVyIDwgZGlmZnMubGVuZ3RoICkgeworCQkJc3dp
dGNoICggZGlmZnNbIHBvaW50ZXIgXVsgMCBdICkgeworCQkJY2FzZSBESUZGX0lOU0VSVDoKKwkJ
CQljb3VudEluc2VydCsrOworCQkJCXRleHRJbnNlcnQgKz0gZGlmZnNbIHBvaW50ZXIgXVsgMSBd
OworCQkJCWJyZWFrOworCQkJY2FzZSBESUZGX0RFTEVURToKKwkJCQljb3VudERlbGV0ZSsrOwor
CQkJCXRleHREZWxldGUgKz0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJCWJyZWFrOworCQkJ
Y2FzZSBESUZGX0VRVUFMOgorCQkJCS8vIFVwb24gcmVhY2hpbmcgYW4gZXF1YWxpdHksIGNoZWNr
IGZvciBwcmlvciByZWR1bmRhbmNpZXMuCisJCQkJaWYgKCBjb3VudERlbGV0ZSA+PSAxICYmIGNv
dW50SW5zZXJ0ID49IDEgKSB7CisJCQkJCS8vIERlbGV0ZSB0aGUgb2ZmZW5kaW5nIHJlY29yZHMg
YW5kIGFkZCB0aGUgbWVyZ2VkIG9uZXMuCisJCQkJCWRpZmZzLnNwbGljZSggcG9pbnRlciAtIGNv
dW50RGVsZXRlIC0gY291bnRJbnNlcnQsCisJCQkJCQljb3VudERlbGV0ZSArIGNvdW50SW5zZXJ0
ICk7CisJCQkJCXBvaW50ZXIgPSBwb2ludGVyIC0gY291bnREZWxldGUgLSBjb3VudEluc2VydDsK
KwkJCQkJYSA9IHRoaXMuRGlmZk1haW4oIHRleHREZWxldGUsIHRleHRJbnNlcnQsIGZhbHNlLCBk
ZWFkbGluZSApOworCQkJCQlmb3IgKCBqID0gYS5sZW5ndGggLSAxOyBqID49IDA7IGotLSApIHsK
KwkJCQkJCWRpZmZzLnNwbGljZSggcG9pbnRlciwgMCwgYVsgaiBdICk7CisJCQkJCX0KKwkJCQkJ
cG9pbnRlciA9IHBvaW50ZXIgKyBhLmxlbmd0aDsKKwkJCQl9CisJCQkJY291bnRJbnNlcnQgPSAw
OworCQkJCWNvdW50RGVsZXRlID0gMDsKKwkJCQl0ZXh0RGVsZXRlID0gIiI7CisJCQkJdGV4dElu
c2VydCA9ICIiOworCQkJCWJyZWFrOworCQkJfQorCQkJcG9pbnRlcisrOworCQl9CisJCWRpZmZz
LnBvcCgpOyAvLyBSZW1vdmUgdGhlIGR1bW15IGVudHJ5IGF0IHRoZSBlbmQuCisKKwkJcmV0dXJu
IGRpZmZzOworCX07CisKKwkvKioKKwkgKiBGaW5kIHRoZSAnbWlkZGxlIHNuYWtlJyBvZiBhIGRp
ZmYsIHNwbGl0IHRoZSBwcm9ibGVtIGluIHR3bworCSAqIGFuZCByZXR1cm4gdGhlIHJlY3Vyc2l2
ZWx5IGNvbnN0cnVjdGVkIGRpZmYuCisJICogU2VlIE15ZXJzIDE5ODYgcGFwZXI6IEFuIE8oTkQp
IERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBJdHMgVmFyaWF0aW9ucy4KKwkgKiBAcGFyYW0ge3N0
cmluZ30gdGV4dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtzdHJpbmd9
IHRleHQyIE5ldyBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7bnVtYmVyfSBkZWFk
bGluZSBUaW1lIGF0IHdoaWNoIHRvIGJhaWwgaWYgbm90IHlldCBjb21wbGV0ZS4KKwkgKiBAcmV0
dXJuIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gQXJyYXkgb2YgZGlmZiB0dXBsZXMu
CisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkJpc2Vj
dCA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIsIGRlYWRsaW5lICkgeworCQl2YXIgdGV4dDFMZW5n
dGgsIHRleHQyTGVuZ3RoLCBtYXhELCB2T2Zmc2V0LCB2TGVuZ3RoLAorCQkJdjEsIHYyLCB4LCBk
ZWx0YSwgZnJvbnQsIGsxc3RhcnQsIGsxZW5kLCBrMnN0YXJ0LAorCQkJazJlbmQsIGsyT2Zmc2V0
LCBrMU9mZnNldCwgeDEsIHgyLCB5MSwgeTIsIGQsIGsxLCBrMjsKKwkJLy8gQ2FjaGUgdGhlIHRl
eHQgbGVuZ3RocyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzLgorCQl0ZXh0MUxlbmd0aCA9IHRl
eHQxLmxlbmd0aDsKKwkJdGV4dDJMZW5ndGggPSB0ZXh0Mi5sZW5ndGg7CisJCW1heEQgPSBNYXRo
LmNlaWwoICggdGV4dDFMZW5ndGggKyB0ZXh0Mkxlbmd0aCApIC8gMiApOworCQl2T2Zmc2V0ID0g
bWF4RDsKKwkJdkxlbmd0aCA9IDIgKiBtYXhEOworCQl2MSA9IG5ldyBBcnJheSggdkxlbmd0aCAp
OworCQl2MiA9IG5ldyBBcnJheSggdkxlbmd0aCApOworCQkvLyBTZXR0aW5nIGFsbCBlbGVtZW50
cyB0byAtMSBpcyBmYXN0ZXIgaW4gQ2hyb21lICYgRmlyZWZveCB0aGFuIG1peGluZworCQkvLyBp
bnRlZ2VycyBhbmQgdW5kZWZpbmVkLgorCQlmb3IgKCB4ID0gMDsgeCA8IHZMZW5ndGg7IHgrKyAp
IHsKKwkJCXYxWyB4IF0gPSAtMTsKKwkJCXYyWyB4IF0gPSAtMTsKKwkJfQorCQl2MVsgdk9mZnNl
dCArIDEgXSA9IDA7CisJCXYyWyB2T2Zmc2V0ICsgMSBdID0gMDsKKwkJZGVsdGEgPSB0ZXh0MUxl
bmd0aCAtIHRleHQyTGVuZ3RoOworCQkvLyBJZiB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYXJhY3Rl
cnMgaXMgb2RkLCB0aGVuIHRoZSBmcm9udCBwYXRoIHdpbGwgY29sbGlkZQorCQkvLyB3aXRoIHRo
ZSByZXZlcnNlIHBhdGguCisJCWZyb250ID0gKCBkZWx0YSAlIDIgIT09IDAgKTsKKwkJLy8gT2Zm
c2V0cyBmb3Igc3RhcnQgYW5kIGVuZCBvZiBrIGxvb3AuCisJCS8vIFByZXZlbnRzIG1hcHBpbmcg
b2Ygc3BhY2UgYmV5b25kIHRoZSBncmlkLgorCQlrMXN0YXJ0ID0gMDsKKwkJazFlbmQgPSAwOwor
CQlrMnN0YXJ0ID0gMDsKKwkJazJlbmQgPSAwOworCQlmb3IgKCBkID0gMDsgZCA8IG1heEQ7IGQr
KyApIHsKKwkJCS8vIEJhaWwgb3V0IGlmIGRlYWRsaW5lIGlzIHJlYWNoZWQuCisJCQlpZiAoICgg
bmV3IERhdGUoKSApLmdldFRpbWUoKSA+IGRlYWRsaW5lICkgeworCQkJCWJyZWFrOworCQkJfQor
CisJCQkvLyBXYWxrIHRoZSBmcm9udCBwYXRoIG9uZSBzdGVwLgorCQkJZm9yICggazEgPSAtZCAr
IGsxc3RhcnQ7IGsxIDw9IGQgLSBrMWVuZDsgazEgKz0gMiApIHsKKwkJCQlrMU9mZnNldCA9IHZP
ZmZzZXQgKyBrMTsKKwkJCQlpZiAoIGsxID09PSAtZCB8fCAoIGsxICE9PSBkICYmIHYxWyBrMU9m
ZnNldCAtIDEgXSA8IHYxWyBrMU9mZnNldCArIDEgXSApICkgeworCQkJCQl4MSA9IHYxWyBrMU9m
ZnNldCArIDEgXTsKKwkJCQl9IGVsc2UgeworCQkJCQl4MSA9IHYxWyBrMU9mZnNldCAtIDEgXSAr
IDE7CisJCQkJfQorCQkJCXkxID0geDEgLSBrMTsKKwkJCQl3aGlsZSAoIHgxIDwgdGV4dDFMZW5n
dGggJiYgeTEgPCB0ZXh0Mkxlbmd0aCAmJgorCQkJCQl0ZXh0MS5jaGFyQXQoIHgxICkgPT09IHRl
eHQyLmNoYXJBdCggeTEgKSApIHsKKwkJCQkJeDErKzsKKwkJCQkJeTErKzsKKwkJCQl9CisJCQkJ
djFbIGsxT2Zmc2V0IF0gPSB4MTsKKwkJCQlpZiAoIHgxID4gdGV4dDFMZW5ndGggKSB7CisJCQkJ
CS8vIFJhbiBvZmYgdGhlIHJpZ2h0IG9mIHRoZSBncmFwaC4KKwkJCQkJazFlbmQgKz0gMjsKKwkJ
CQl9IGVsc2UgaWYgKCB5MSA+IHRleHQyTGVuZ3RoICkgeworCQkJCQkvLyBSYW4gb2ZmIHRoZSBi
b3R0b20gb2YgdGhlIGdyYXBoLgorCQkJCQlrMXN0YXJ0ICs9IDI7CisJCQkJfSBlbHNlIGlmICgg
ZnJvbnQgKSB7CisJCQkJCWsyT2Zmc2V0ID0gdk9mZnNldCArIGRlbHRhIC0gazE7CisJCQkJCWlm
ICggazJPZmZzZXQgPj0gMCAmJiBrMk9mZnNldCA8IHZMZW5ndGggJiYgdjJbIGsyT2Zmc2V0IF0g
IT09IC0xICkgeworCQkJCQkJLy8gTWlycm9yIHgyIG9udG8gdG9wLWxlZnQgY29vcmRpbmF0ZSBz
eXN0ZW0uCisJCQkJCQl4MiA9IHRleHQxTGVuZ3RoIC0gdjJbIGsyT2Zmc2V0IF07CisJCQkJCQlp
ZiAoIHgxID49IHgyICkgeworCQkJCQkJCS8vIE92ZXJsYXAgZGV0ZWN0ZWQuCisJCQkJCQkJcmV0
dXJuIHRoaXMuZGlmZkJpc2VjdFNwbGl0KCB0ZXh0MSwgdGV4dDIsIHgxLCB5MSwgZGVhZGxpbmUg
KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gV2FsayB0aGUgcmV2ZXJz
ZSBwYXRoIG9uZSBzdGVwLgorCQkJZm9yICggazIgPSAtZCArIGsyc3RhcnQ7IGsyIDw9IGQgLSBr
MmVuZDsgazIgKz0gMiApIHsKKwkJCQlrMk9mZnNldCA9IHZPZmZzZXQgKyBrMjsKKwkJCQlpZiAo
IGsyID09PSAtZCB8fCAoIGsyICE9PSBkICYmIHYyWyBrMk9mZnNldCAtIDEgXSA8IHYyWyBrMk9m
ZnNldCArIDEgXSApICkgeworCQkJCQl4MiA9IHYyWyBrMk9mZnNldCArIDEgXTsKKwkJCQl9IGVs
c2UgeworCQkJCQl4MiA9IHYyWyBrMk9mZnNldCAtIDEgXSArIDE7CisJCQkJfQorCQkJCXkyID0g
eDIgLSBrMjsKKwkJCQl3aGlsZSAoIHgyIDwgdGV4dDFMZW5ndGggJiYgeTIgPCB0ZXh0Mkxlbmd0
aCAmJgorCQkJCQl0ZXh0MS5jaGFyQXQoIHRleHQxTGVuZ3RoIC0geDIgLSAxICkgPT09CisJCQkJ
CXRleHQyLmNoYXJBdCggdGV4dDJMZW5ndGggLSB5MiAtIDEgKSApIHsKKwkJCQkJeDIrKzsKKwkJ
CQkJeTIrKzsKKwkJCQl9CisJCQkJdjJbIGsyT2Zmc2V0IF0gPSB4MjsKKwkJCQlpZiAoIHgyID4g
dGV4dDFMZW5ndGggKSB7CisJCQkJCS8vIFJhbiBvZmYgdGhlIGxlZnQgb2YgdGhlIGdyYXBoLgor
CQkJCQlrMmVuZCArPSAyOworCQkJCX0gZWxzZSBpZiAoIHkyID4gdGV4dDJMZW5ndGggKSB7CisJ
CQkJCS8vIFJhbiBvZmYgdGhlIHRvcCBvZiB0aGUgZ3JhcGguCisJCQkJCWsyc3RhcnQgKz0gMjsK
KwkJCQl9IGVsc2UgaWYgKCAhZnJvbnQgKSB7CisJCQkJCWsxT2Zmc2V0ID0gdk9mZnNldCArIGRl
bHRhIC0gazI7CisJCQkJCWlmICggazFPZmZzZXQgPj0gMCAmJiBrMU9mZnNldCA8IHZMZW5ndGgg
JiYgdjFbIGsxT2Zmc2V0IF0gIT09IC0xICkgeworCQkJCQkJeDEgPSB2MVsgazFPZmZzZXQgXTsK
KwkJCQkJCXkxID0gdk9mZnNldCArIHgxIC0gazFPZmZzZXQ7CisJCQkJCQkvLyBNaXJyb3IgeDIg
b250byB0b3AtbGVmdCBjb29yZGluYXRlIHN5c3RlbS4KKwkJCQkJCXgyID0gdGV4dDFMZW5ndGgg
LSB4MjsKKwkJCQkJCWlmICggeDEgPj0geDIgKSB7CisJCQkJCQkJLy8gT3ZlcmxhcCBkZXRlY3Rl
ZC4KKwkJCQkJCQlyZXR1cm4gdGhpcy5kaWZmQmlzZWN0U3BsaXQoIHRleHQxLCB0ZXh0MiwgeDEs
IHkxLCBkZWFkbGluZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8v
IERpZmYgdG9vayB0b28gbG9uZyBhbmQgaGl0IHRoZSBkZWFkbGluZSBvcgorCQkvLyBudW1iZXIg
b2YgZGlmZnMgZXF1YWxzIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBubyBjb21tb25hbGl0eSBhdCBh
bGwuCisJCXJldHVybiBbCisJCQlbIERJRkZfREVMRVRFLCB0ZXh0MSBdLAorCQkJWyBESUZGX0lO
U0VSVCwgdGV4dDIgXQorCQldOworCX07CisKKwkvKioKKwkgKiBHaXZlbiB0aGUgbG9jYXRpb24g
b2YgdGhlICdtaWRkbGUgc25ha2UnLCBzcGxpdCB0aGUgZGlmZiBpbiB0d28gcGFydHMKKwkgKiBh
bmQgcmVjdXJzZS4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgT2xkIHN0cmluZyB0byBiZSBk
aWZmZWQuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIE5ldyBzdHJpbmcgdG8gYmUgZGlmZmVk
LgorCSAqIEBwYXJhbSB7bnVtYmVyfSB4IEluZGV4IG9mIHNwbGl0IHBvaW50IGluIHRleHQxLgor
CSAqIEBwYXJhbSB7bnVtYmVyfSB5IEluZGV4IG9mIHNwbGl0IHBvaW50IGluIHRleHQyLgorCSAq
IEBwYXJhbSB7bnVtYmVyfSBkZWFkbGluZSBUaW1lIGF0IHdoaWNoIHRvIGJhaWwgaWYgbm90IHll
dCBjb21wbGV0ZS4KKwkgKiBAcmV0dXJuIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0g
QXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0Y2hQYXRj
aC5wcm90b3R5cGUuZGlmZkJpc2VjdFNwbGl0ID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiwgeCwg
eSwgZGVhZGxpbmUgKSB7CisJCXZhciB0ZXh0MWEsIHRleHQxYiwgdGV4dDJhLCB0ZXh0MmIsIGRp
ZmZzLCBkaWZmc2I7CisJCXRleHQxYSA9IHRleHQxLnN1YnN0cmluZyggMCwgeCApOworCQl0ZXh0
MmEgPSB0ZXh0Mi5zdWJzdHJpbmcoIDAsIHkgKTsKKwkJdGV4dDFiID0gdGV4dDEuc3Vic3RyaW5n
KCB4ICk7CisJCXRleHQyYiA9IHRleHQyLnN1YnN0cmluZyggeSApOworCisJCS8vIENvbXB1dGUg
Ym90aCBkaWZmcyBzZXJpYWxseS4KKwkJZGlmZnMgPSB0aGlzLkRpZmZNYWluKCB0ZXh0MWEsIHRl
eHQyYSwgZmFsc2UsIGRlYWRsaW5lICk7CisJCWRpZmZzYiA9IHRoaXMuRGlmZk1haW4oIHRleHQx
YiwgdGV4dDJiLCBmYWxzZSwgZGVhZGxpbmUgKTsKKworCQlyZXR1cm4gZGlmZnMuY29uY2F0KCBk
aWZmc2IgKTsKKwl9OworCisJLyoqCisJICogUmVkdWNlIHRoZSBudW1iZXIgb2YgZWRpdHMgYnkg
ZWxpbWluYXRpbmcgc2VtYW50aWNhbGx5IHRyaXZpYWwgZXF1YWxpdGllcy4KKwkgKiBAcGFyYW0g
eyFBcnJheS48IURpZmZNYXRjaFBhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxl
cy4KKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNsZWFudXBTZW1hbnRpYyA9
IGZ1bmN0aW9uKCBkaWZmcyApIHsKKwkJdmFyIGNoYW5nZXMsIGVxdWFsaXRpZXMsIGVxdWFsaXRp
ZXNMZW5ndGgsIGxhc3RlcXVhbGl0eSwKKwkJCXBvaW50ZXIsIGxlbmd0aEluc2VydGlvbnMyLCBs
ZW5ndGhEZWxldGlvbnMyLCBsZW5ndGhJbnNlcnRpb25zMSwKKwkJCWxlbmd0aERlbGV0aW9uczEs
IGRlbGV0aW9uLCBpbnNlcnRpb24sIG92ZXJsYXBMZW5ndGgxLCBvdmVybGFwTGVuZ3RoMjsKKwkJ
Y2hhbmdlcyA9IGZhbHNlOworCQllcXVhbGl0aWVzID0gW107IC8vIFN0YWNrIG9mIGluZGljZXMg
d2hlcmUgZXF1YWxpdGllcyBhcmUgZm91bmQuCisJCWVxdWFsaXRpZXNMZW5ndGggPSAwOyAvLyBL
ZWVwaW5nIG91ciBvd24gbGVuZ3RoIHZhciBpcyBmYXN0ZXIgaW4gSlMuCisJCS8qKiBAdHlwZSB7
P3N0cmluZ30gKi8KKwkJbGFzdGVxdWFsaXR5ID0gbnVsbDsKKwkJLy8gQWx3YXlzIGVxdWFsIHRv
IGRpZmZzW2VxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCAtIDFdXVsxXQorCQlwb2ludGVyID0g
MDsgLy8gSW5kZXggb2YgY3VycmVudCBwb3NpdGlvbi4KKwkJLy8gTnVtYmVyIG9mIGNoYXJhY3Rl
cnMgdGhhdCBjaGFuZ2VkIHByaW9yIHRvIHRoZSBlcXVhbGl0eS4KKwkJbGVuZ3RoSW5zZXJ0aW9u
czEgPSAwOworCQlsZW5ndGhEZWxldGlvbnMxID0gMDsKKwkJLy8gTnVtYmVyIG9mIGNoYXJhY3Rl
cnMgdGhhdCBjaGFuZ2VkIGFmdGVyIHRoZSBlcXVhbGl0eS4KKwkJbGVuZ3RoSW5zZXJ0aW9uczIg
PSAwOworCQlsZW5ndGhEZWxldGlvbnMyID0gMDsKKwkJd2hpbGUgKCBwb2ludGVyIDwgZGlmZnMu
bGVuZ3RoICkgeworCQkJaWYgKCBkaWZmc1sgcG9pbnRlciBdWyAwIF0gPT09IERJRkZfRVFVQUwg
KSB7IC8vIEVxdWFsaXR5IGZvdW5kLgorCQkJCWVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGgr
KyBdID0gcG9pbnRlcjsKKwkJCQlsZW5ndGhJbnNlcnRpb25zMSA9IGxlbmd0aEluc2VydGlvbnMy
OworCQkJCWxlbmd0aERlbGV0aW9uczEgPSBsZW5ndGhEZWxldGlvbnMyOworCQkJCWxlbmd0aElu
c2VydGlvbnMyID0gMDsKKwkJCQlsZW5ndGhEZWxldGlvbnMyID0gMDsKKwkJCQlsYXN0ZXF1YWxp
dHkgPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQl9IGVsc2UgeyAvLyBBbiBpbnNlcnRpb24g
b3IgZGVsZXRpb24uCisJCQkJaWYgKCBkaWZmc1sgcG9pbnRlciBdWyAwIF0gPT09IERJRkZfSU5T
RVJUICkgeworCQkJCQlsZW5ndGhJbnNlcnRpb25zMiArPSBkaWZmc1sgcG9pbnRlciBdWyAxIF0u
bGVuZ3RoOworCQkJCX0gZWxzZSB7CisJCQkJCWxlbmd0aERlbGV0aW9uczIgKz0gZGlmZnNbIHBv
aW50ZXIgXVsgMSBdLmxlbmd0aDsKKwkJCQl9CisJCQkJLy8gRWxpbWluYXRlIGFuIGVxdWFsaXR5
IHRoYXQgaXMgc21hbGxlciBvciBlcXVhbCB0byB0aGUgZWRpdHMgb24gYm90aAorCQkJCS8vIHNp
ZGVzIG9mIGl0LgorCQkJCWlmICggbGFzdGVxdWFsaXR5ICYmICggbGFzdGVxdWFsaXR5Lmxlbmd0
aCA8PQorCQkJCQkJTWF0aC5tYXgoIGxlbmd0aEluc2VydGlvbnMxLCBsZW5ndGhEZWxldGlvbnMx
ICkgKSAmJgorCQkJCQkJKCBsYXN0ZXF1YWxpdHkubGVuZ3RoIDw9IE1hdGgubWF4KCBsZW5ndGhJ
bnNlcnRpb25zMiwKKwkJCQkJCQlsZW5ndGhEZWxldGlvbnMyICkgKSApIHsKKworCQkJCQkvLyBE
dXBsaWNhdGUgcmVjb3JkLgorCQkJCQlkaWZmcy5zcGxpY2UoCisJCQkJCQllcXVhbGl0aWVzWyBl
cXVhbGl0aWVzTGVuZ3RoIC0gMSBdLAorCQkJCQkJMCwKKwkJCQkJCVsgRElGRl9ERUxFVEUsIGxh
c3RlcXVhbGl0eSBdCisJCQkJCSk7CisKKwkJCQkJLy8gQ2hhbmdlIHNlY29uZCBjb3B5IHRvIGlu
c2VydC4KKwkJCQkJZGlmZnNbIGVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGggLSAxIF0gKyAx
IF1bIDAgXSA9IERJRkZfSU5TRVJUOworCisJCQkJCS8vIFRocm93IGF3YXkgdGhlIGVxdWFsaXR5
IHdlIGp1c3QgZGVsZXRlZC4KKwkJCQkJZXF1YWxpdGllc0xlbmd0aC0tOworCisJCQkJCS8vIFRo
cm93IGF3YXkgdGhlIHByZXZpb3VzIGVxdWFsaXR5IChpdCBuZWVkcyB0byBiZSByZWV2YWx1YXRl
ZCkuCisJCQkJCWVxdWFsaXRpZXNMZW5ndGgtLTsKKwkJCQkJcG9pbnRlciA9IGVxdWFsaXRpZXNM
ZW5ndGggPiAwID8gZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCAtIDEgXSA6IC0xOworCisJ
CQkJCS8vIFJlc2V0IHRoZSBjb3VudGVycy4KKwkJCQkJbGVuZ3RoSW5zZXJ0aW9uczEgPSAwOwor
CQkJCQlsZW5ndGhEZWxldGlvbnMxID0gMDsKKwkJCQkJbGVuZ3RoSW5zZXJ0aW9uczIgPSAwOwor
CQkJCQlsZW5ndGhEZWxldGlvbnMyID0gMDsKKwkJCQkJbGFzdGVxdWFsaXR5ID0gbnVsbDsKKwkJ
CQkJY2hhbmdlcyA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJcG9pbnRlcisrOworCQl9CisKKwkJ
Ly8gTm9ybWFsaXplIHRoZSBkaWZmLgorCQlpZiAoIGNoYW5nZXMgKSB7CisJCQl0aGlzLmRpZmZD
bGVhbnVwTWVyZ2UoIGRpZmZzICk7CisJCX0KKworCQkvLyBGaW5kIGFueSBvdmVybGFwcyBiZXR3
ZWVuIGRlbGV0aW9ucyBhbmQgaW5zZXJ0aW9ucy4KKwkJLy8gZS5nOiA8ZGVsPmFiY3h4eDwvZGVs
PjxpbnM+eHh4ZGVmPC9pbnM+CisJCS8vICAgLT4gPGRlbD5hYmM8L2RlbD54eHg8aW5zPmRlZjwv
aW5zPgorCQkvLyBlLmc6IDxkZWw+eHh4YWJjPC9kZWw+PGlucz5kZWZ4eHg8L2lucz4KKwkJLy8g
ICAtPiA8aW5zPmRlZjwvaW5zPnh4eDxkZWw+YWJjPC9kZWw+CisJCS8vIE9ubHkgZXh0cmFjdCBh
biBvdmVybGFwIGlmIGl0IGlzIGFzIGJpZyBhcyB0aGUgZWRpdCBhaGVhZCBvciBiZWhpbmQgaXQu
CisJCXBvaW50ZXIgPSAxOworCQl3aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggKSB7CisJ
CQlpZiAoIGRpZmZzWyBwb2ludGVyIC0gMSBdWyAwIF0gPT09IERJRkZfREVMRVRFICYmCisJCQkJ
CWRpZmZzWyBwb2ludGVyIF1bIDAgXSA9PT0gRElGRl9JTlNFUlQgKSB7CisJCQkJZGVsZXRpb24g
PSBkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBdOworCQkJCWluc2VydGlvbiA9IGRpZmZzWyBwb2lu
dGVyIF1bIDEgXTsKKwkJCQlvdmVybGFwTGVuZ3RoMSA9IHRoaXMuZGlmZkNvbW1vbk92ZXJsYXAo
IGRlbGV0aW9uLCBpbnNlcnRpb24gKTsKKwkJCQlvdmVybGFwTGVuZ3RoMiA9IHRoaXMuZGlmZkNv
bW1vbk92ZXJsYXAoIGluc2VydGlvbiwgZGVsZXRpb24gKTsKKwkJCQlpZiAoIG92ZXJsYXBMZW5n
dGgxID49IG92ZXJsYXBMZW5ndGgyICkgeworCQkJCQlpZiAoIG92ZXJsYXBMZW5ndGgxID49IGRl
bGV0aW9uLmxlbmd0aCAvIDIgfHwKKwkJCQkJCQlvdmVybGFwTGVuZ3RoMSA+PSBpbnNlcnRpb24u
bGVuZ3RoIC8gMiApIHsKKwkJCQkJCS8vIE92ZXJsYXAgZm91bmQuICBJbnNlcnQgYW4gZXF1YWxp
dHkgYW5kIHRyaW0gdGhlIHN1cnJvdW5kaW5nIGVkaXRzLgorCQkJCQkJZGlmZnMuc3BsaWNlKAor
CQkJCQkJCXBvaW50ZXIsCisJCQkJCQkJMCwKKwkJCQkJCQlbIERJRkZfRVFVQUwsIGluc2VydGlv
bi5zdWJzdHJpbmcoIDAsIG92ZXJsYXBMZW5ndGgxICkgXQorCQkJCQkJKTsKKwkJCQkJCWRpZmZz
WyBwb2ludGVyIC0gMSBdWyAxIF0gPQorCQkJCQkJCWRlbGV0aW9uLnN1YnN0cmluZyggMCwgZGVs
ZXRpb24ubGVuZ3RoIC0gb3ZlcmxhcExlbmd0aDEgKTsKKwkJCQkJCWRpZmZzWyBwb2ludGVyICsg
MSBdWyAxIF0gPSBpbnNlcnRpb24uc3Vic3RyaW5nKCBvdmVybGFwTGVuZ3RoMSApOworCQkJCQkJ
cG9pbnRlcisrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCBvdmVybGFwTGVuZ3Ro
MiA+PSBkZWxldGlvbi5sZW5ndGggLyAyIHx8CisJCQkJCQkJb3ZlcmxhcExlbmd0aDIgPj0gaW5z
ZXJ0aW9uLmxlbmd0aCAvIDIgKSB7CisKKwkJCQkJCS8vIFJldmVyc2Ugb3ZlcmxhcCBmb3VuZC4K
KwkJCQkJCS8vIEluc2VydCBhbiBlcXVhbGl0eSBhbmQgc3dhcCBhbmQgdHJpbSB0aGUgc3Vycm91
bmRpbmcgZWRpdHMuCisJCQkJCQlkaWZmcy5zcGxpY2UoCisJCQkJCQkJcG9pbnRlciwKKwkJCQkJ
CQkwLAorCQkJCQkJCVsgRElGRl9FUVVBTCwgZGVsZXRpb24uc3Vic3RyaW5nKCAwLCBvdmVybGFw
TGVuZ3RoMiApIF0KKwkJCQkJCSk7CisKKwkJCQkJCWRpZmZzWyBwb2ludGVyIC0gMSBdWyAwIF0g
PSBESUZGX0lOU0VSVDsKKwkJCQkJCWRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0gPQorCQkJCQkJ
CWluc2VydGlvbi5zdWJzdHJpbmcoIDAsIGluc2VydGlvbi5sZW5ndGggLSBvdmVybGFwTGVuZ3Ro
MiApOworCQkJCQkJZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDAgXSA9IERJRkZfREVMRVRFOworCQkJ
CQkJZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXSA9CisJCQkJCQkJZGVsZXRpb24uc3Vic3RyaW5n
KCBvdmVybGFwTGVuZ3RoMiApOworCQkJCQkJcG9pbnRlcisrOworCQkJCQl9CisJCQkJfQorCQkJ
CXBvaW50ZXIrKzsKKwkJCX0KKwkJCXBvaW50ZXIrKzsKKwkJfQorCX07CisKKwkvKioKKwkgKiBE
ZXRlcm1pbmUgaWYgdGhlIHN1ZmZpeCBvZiBvbmUgc3RyaW5nIGlzIHRoZSBwcmVmaXggb2YgYW5v
dGhlci4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLgorCSAqIEBwYXJh
bSB7c3RyaW5nfSB0ZXh0MiBTZWNvbmQgc3RyaW5nLgorCSAqIEByZXR1cm4ge251bWJlcn0gVGhl
IG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbW1vbiB0byB0aGUgZW5kIG9mIHRoZSBmaXJzdAorCSAq
ICAgICBzdHJpbmcgYW5kIHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIHN0cmluZy4KKwkgKiBAcHJp
dmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uT3ZlcmxhcCA9
IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIgKSB7CisJCXZhciB0ZXh0MUxlbmd0aCwgdGV4dDJMZW5n
dGgsIHRleHRMZW5ndGgsCisJCQliZXN0LCBsZW5ndGgsIHBhdHRlcm4sIGZvdW5kOworCQkvLyBD
YWNoZSB0aGUgdGV4dCBsZW5ndGhzIHRvIHByZXZlbnQgbXVsdGlwbGUgY2FsbHMuCisJCXRleHQx
TGVuZ3RoID0gdGV4dDEubGVuZ3RoOworCQl0ZXh0Mkxlbmd0aCA9IHRleHQyLmxlbmd0aDsKKwkJ
Ly8gRWxpbWluYXRlIHRoZSBudWxsIGNhc2UuCisJCWlmICggdGV4dDFMZW5ndGggPT09IDAgfHwg
dGV4dDJMZW5ndGggPT09IDAgKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvLyBUcnVuY2F0ZSB0
aGUgbG9uZ2VyIHN0cmluZy4KKwkJaWYgKCB0ZXh0MUxlbmd0aCA+IHRleHQyTGVuZ3RoICkgewor
CQkJdGV4dDEgPSB0ZXh0MS5zdWJzdHJpbmcoIHRleHQxTGVuZ3RoIC0gdGV4dDJMZW5ndGggKTsK
KwkJfSBlbHNlIGlmICggdGV4dDFMZW5ndGggPCB0ZXh0Mkxlbmd0aCApIHsKKwkJCXRleHQyID0g
dGV4dDIuc3Vic3RyaW5nKCAwLCB0ZXh0MUxlbmd0aCApOworCQl9CisJCXRleHRMZW5ndGggPSBN
YXRoLm1pbiggdGV4dDFMZW5ndGgsIHRleHQyTGVuZ3RoICk7CisJCS8vIFF1aWNrIGNoZWNrIGZv
ciB0aGUgd29yc3QgY2FzZS4KKwkJaWYgKCB0ZXh0MSA9PT0gdGV4dDIgKSB7CisJCQlyZXR1cm4g
dGV4dExlbmd0aDsKKwkJfQorCisJCS8vIFN0YXJ0IGJ5IGxvb2tpbmcgZm9yIGEgc2luZ2xlIGNo
YXJhY3RlciBtYXRjaAorCQkvLyBhbmQgaW5jcmVhc2UgbGVuZ3RoIHVudGlsIG5vIG1hdGNoIGlz
IGZvdW5kLgorCQkvLyBQZXJmb3JtYW5jZSBhbmFseXNpczogaHR0cDovL25laWwuZnJhc2VyLm5h
bWUvbmV3cy8yMDEwLzExLzA0LworCQliZXN0ID0gMDsKKwkJbGVuZ3RoID0gMTsKKwkJd2hpbGUg
KCB0cnVlICkgeworCQkJcGF0dGVybiA9IHRleHQxLnN1YnN0cmluZyggdGV4dExlbmd0aCAtIGxl
bmd0aCApOworCQkJZm91bmQgPSB0ZXh0Mi5pbmRleE9mKCBwYXR0ZXJuICk7CisJCQlpZiAoIGZv
dW5kID09PSAtMSApIHsKKwkJCQlyZXR1cm4gYmVzdDsKKwkJCX0KKwkJCWxlbmd0aCArPSBmb3Vu
ZDsKKwkJCWlmICggZm91bmQgPT09IDAgfHwgdGV4dDEuc3Vic3RyaW5nKCB0ZXh0TGVuZ3RoIC0g
bGVuZ3RoICkgPT09CisJCQkJCXRleHQyLnN1YnN0cmluZyggMCwgbGVuZ3RoICkgKSB7CisJCQkJ
YmVzdCA9IGxlbmd0aDsKKwkJCQlsZW5ndGgrKzsKKwkJCX0KKwkJfQorCX07CisKKwkvKioKKwkg
KiBTcGxpdCB0d28gdGV4dHMgaW50byBhbiBhcnJheSBvZiBzdHJpbmdzLiAgUmVkdWNlIHRoZSB0
ZXh0cyB0byBhIHN0cmluZyBvZgorCSAqIGhhc2hlcyB3aGVyZSBlYWNoIFVuaWNvZGUgY2hhcmFj
dGVyIHJlcHJlc2VudHMgb25lIGxpbmUuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0
IHN0cmluZy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy4KKwkgKiBA
cmV0dXJuIHt7Y2hhcnMxOiBzdHJpbmcsIGNoYXJzMjogc3RyaW5nLCBsaW5lQXJyYXk6ICFBcnJh
eS48c3RyaW5nPn19CisJICogICAgIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBlbmNvZGVkIHRl
eHQxLCB0aGUgZW5jb2RlZCB0ZXh0MiBhbmQKKwkgKiAgICAgdGhlIGFycmF5IG9mIHVuaXF1ZSBz
dHJpbmdzLgorCSAqICAgICBUaGUgemVyb3RoIGVsZW1lbnQgb2YgdGhlIGFycmF5IG9mIHVuaXF1
ZSBzdHJpbmdzIGlzIGludGVudGlvbmFsbHkgYmxhbmsuCisJICogQHByaXZhdGUKKwkgKi8KKwlE
aWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkxpbmVzVG9DaGFycyA9IGZ1bmN0aW9uKCB0ZXh0
MSwgdGV4dDIgKSB7CisJCXZhciBsaW5lQXJyYXksIGxpbmVIYXNoLCBjaGFyczEsIGNoYXJzMjsK
KwkJbGluZUFycmF5ID0gW107IC8vIGUuZy4gbGluZUFycmF5WzRdID09PSAnSGVsbG9cbicKKwkJ
bGluZUhhc2ggPSB7fTsgLy8gZS5nLiBsaW5lSGFzaFsnSGVsbG9cbiddID09PSA0CisKKwkJLy8g
J1x4MDAnIGlzIGEgdmFsaWQgY2hhcmFjdGVyLCBidXQgdmFyaW91cyBkZWJ1Z2dlcnMgZG9uJ3Qg
bGlrZSBpdC4KKwkJLy8gU28gd2UnbGwgaW5zZXJ0IGEganVuayBlbnRyeSB0byBhdm9pZCBnZW5l
cmF0aW5nIGEgbnVsbCBjaGFyYWN0ZXIuCisJCWxpbmVBcnJheVsgMCBdID0gIiI7CisKKwkJLyoq
CisJCSAqIFNwbGl0IGEgdGV4dCBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuICBSZWR1Y2UgdGhl
IHRleHRzIHRvIGEgc3RyaW5nIG9mCisJCSAqIGhhc2hlcyB3aGVyZSBlYWNoIFVuaWNvZGUgY2hh
cmFjdGVyIHJlcHJlc2VudHMgb25lIGxpbmUuCisJCSAqIE1vZGlmaWVzIGxpbmVhcnJheSBhbmQg
bGluZWhhc2ggdGhyb3VnaCBiZWluZyBhIGNsb3N1cmUuCisJCSAqIEBwYXJhbSB7c3RyaW5nfSB0
ZXh0IFN0cmluZyB0byBlbmNvZGUuCisJCSAqIEByZXR1cm4ge3N0cmluZ30gRW5jb2RlZCBzdHJp
bmcuCisJCSAqIEBwcml2YXRlCisJCSAqLworCQlmdW5jdGlvbiBkaWZmTGluZXNUb0NoYXJzTXVu
Z2UoIHRleHQgKSB7CisJCQl2YXIgY2hhcnMsIGxpbmVTdGFydCwgbGluZUVuZCwgbGluZUFycmF5
TGVuZ3RoLCBsaW5lOworCQkJY2hhcnMgPSAiIjsKKwkJCS8vIFdhbGsgdGhlIHRleHQsIHB1bGxp
bmcgb3V0IGEgc3Vic3RyaW5nIGZvciBlYWNoIGxpbmUuCisJCQkvLyB0ZXh0LnNwbGl0KCdcbicp
IHdvdWxkIHdvdWxkIHRlbXBvcmFyaWx5IGRvdWJsZSBvdXIgbWVtb3J5IGZvb3RwcmludC4KKwkJ
CS8vIE1vZGlmeWluZyB0ZXh0IHdvdWxkIGNyZWF0ZSBtYW55IGxhcmdlIHN0cmluZ3MgdG8gZ2Fy
YmFnZSBjb2xsZWN0LgorCQkJbGluZVN0YXJ0ID0gMDsKKwkJCWxpbmVFbmQgPSAtMTsKKwkJCS8v
IEtlZXBpbmcgb3VyIG93biBsZW5ndGggdmFyaWFibGUgaXMgZmFzdGVyIHRoYW4gbG9va2luZyBp
dCB1cC4KKwkJCWxpbmVBcnJheUxlbmd0aCA9IGxpbmVBcnJheS5sZW5ndGg7CisJCQl3aGlsZSAo
IGxpbmVFbmQgPCB0ZXh0Lmxlbmd0aCAtIDEgKSB7CisJCQkJbGluZUVuZCA9IHRleHQuaW5kZXhP
ZiggIlxuIiwgbGluZVN0YXJ0ICk7CisJCQkJaWYgKCBsaW5lRW5kID09PSAtMSApIHsKKwkJCQkJ
bGluZUVuZCA9IHRleHQubGVuZ3RoIC0gMTsKKwkJCQl9CisJCQkJbGluZSA9IHRleHQuc3Vic3Ry
aW5nKCBsaW5lU3RhcnQsIGxpbmVFbmQgKyAxICk7CisJCQkJbGluZVN0YXJ0ID0gbGluZUVuZCAr
IDE7CisKKwkJCQlpZiAoIGxpbmVIYXNoLmhhc093blByb3BlcnR5ID8gbGluZUhhc2guaGFzT3du
UHJvcGVydHkoIGxpbmUgKSA6CisJCQkJCQkJKCBsaW5lSGFzaFsgbGluZSBdICE9PSB1bmRlZmlu
ZWQgKSApIHsKKwkJCQkJY2hhcnMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggbGluZUhhc2hbIGxp
bmUgXSApOworCQkJCX0gZWxzZSB7CisJCQkJCWNoYXJzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUo
IGxpbmVBcnJheUxlbmd0aCApOworCQkJCQlsaW5lSGFzaFsgbGluZSBdID0gbGluZUFycmF5TGVu
Z3RoOworCQkJCQlsaW5lQXJyYXlbIGxpbmVBcnJheUxlbmd0aCsrIF0gPSBsaW5lOworCQkJCX0K
KwkJCX0KKwkJCXJldHVybiBjaGFyczsKKwkJfQorCisJCWNoYXJzMSA9IGRpZmZMaW5lc1RvQ2hh
cnNNdW5nZSggdGV4dDEgKTsKKwkJY2hhcnMyID0gZGlmZkxpbmVzVG9DaGFyc011bmdlKCB0ZXh0
MiApOworCQlyZXR1cm4geworCQkJY2hhcnMxOiBjaGFyczEsCisJCQljaGFyczI6IGNoYXJzMiwK
KwkJCWxpbmVBcnJheTogbGluZUFycmF5CisJCX07CisJfTsKKworCS8qKgorCSAqIFJlaHlkcmF0
ZSB0aGUgdGV4dCBpbiBhIGRpZmYgZnJvbSBhIHN0cmluZyBvZiBsaW5lIGhhc2hlcyB0byByZWFs
IGxpbmVzIG9mCisJICogdGV4dC4KKwkgKiBAcGFyYW0geyFBcnJheS48IURpZmZNYXRjaFBhdGNo
LkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKiBAcGFyYW0geyFBcnJheS48
c3RyaW5nPn0gbGluZUFycmF5IEFycmF5IG9mIHVuaXF1ZSBzdHJpbmdzLgorCSAqIEBwcml2YXRl
CisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDaGFyc1RvTGluZXMgPSBmdW5j
dGlvbiggZGlmZnMsIGxpbmVBcnJheSApIHsKKwkJdmFyIHgsIGNoYXJzLCB0ZXh0LCB5OworCQlm
b3IgKCB4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrICkgeworCQkJY2hhcnMgPSBkaWZmc1sg
eCBdWyAxIF07CisJCQl0ZXh0ID0gW107CisJCQlmb3IgKCB5ID0gMDsgeSA8IGNoYXJzLmxlbmd0
aDsgeSsrICkgeworCQkJCXRleHRbIHkgXSA9IGxpbmVBcnJheVsgY2hhcnMuY2hhckNvZGVBdCgg
eSApIF07CisJCQl9CisJCQlkaWZmc1sgeCBdWyAxIF0gPSB0ZXh0LmpvaW4oICIiICk7CisJCX0K
Kwl9OworCisJLyoqCisJICogUmVvcmRlciBhbmQgbWVyZ2UgbGlrZSBlZGl0IHNlY3Rpb25zLiAg
TWVyZ2UgZXF1YWxpdGllcy4KKwkgKiBBbnkgZWRpdCBzZWN0aW9uIGNhbiBtb3ZlIGFzIGxvbmcg
YXMgaXQgZG9lc24ndCBjcm9zcyBhbiBlcXVhbGl0eS4KKwkgKiBAcGFyYW0geyFBcnJheS48IURp
ZmZNYXRjaFBhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKi8KKwlE
aWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNsZWFudXBNZXJnZSA9IGZ1bmN0aW9uKCBkaWZm
cyApIHsKKwkJdmFyIHBvaW50ZXIsIGNvdW50RGVsZXRlLCBjb3VudEluc2VydCwgdGV4dEluc2Vy
dCwgdGV4dERlbGV0ZSwKKwkJCWNvbW1vbmxlbmd0aCwgY2hhbmdlcywgZGlmZlBvaW50ZXIsIHBv
c2l0aW9uOworCQlkaWZmcy5wdXNoKCBbIERJRkZfRVFVQUwsICIiIF0gKTsgLy8gQWRkIGEgZHVt
bXkgZW50cnkgYXQgdGhlIGVuZC4KKwkJcG9pbnRlciA9IDA7CisJCWNvdW50RGVsZXRlID0gMDsK
KwkJY291bnRJbnNlcnQgPSAwOworCQl0ZXh0RGVsZXRlID0gIiI7CisJCXRleHRJbnNlcnQgPSAi
IjsKKwkJY29tbW9ubGVuZ3RoOworCQl3aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggKSB7
CisJCQlzd2l0Y2ggKCBkaWZmc1sgcG9pbnRlciBdWyAwIF0gKSB7CisJCQljYXNlIERJRkZfSU5T
RVJUOgorCQkJCWNvdW50SW5zZXJ0Kys7CisJCQkJdGV4dEluc2VydCArPSBkaWZmc1sgcG9pbnRl
ciBdWyAxIF07CisJCQkJcG9pbnRlcisrOworCQkJCWJyZWFrOworCQkJY2FzZSBESUZGX0RFTEVU
RToKKwkJCQljb3VudERlbGV0ZSsrOworCQkJCXRleHREZWxldGUgKz0gZGlmZnNbIHBvaW50ZXIg
XVsgMSBdOworCQkJCXBvaW50ZXIrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgRElGRl9FUVVBTDoK
KwkJCQkvLyBVcG9uIHJlYWNoaW5nIGFuIGVxdWFsaXR5LCBjaGVjayBmb3IgcHJpb3IgcmVkdW5k
YW5jaWVzLgorCQkJCWlmICggY291bnREZWxldGUgKyBjb3VudEluc2VydCA+IDEgKSB7CisJCQkJ
CWlmICggY291bnREZWxldGUgIT09IDAgJiYgY291bnRJbnNlcnQgIT09IDAgKSB7CisJCQkJCQkv
LyBGYWN0b3Igb3V0IGFueSBjb21tb24gcHJlZml4aWVzLgorCQkJCQkJY29tbW9ubGVuZ3RoID0g
dGhpcy5kaWZmQ29tbW9uUHJlZml4KCB0ZXh0SW5zZXJ0LCB0ZXh0RGVsZXRlICk7CisJCQkJCQlp
ZiAoIGNvbW1vbmxlbmd0aCAhPT0gMCApIHsKKwkJCQkJCQlpZiAoICggcG9pbnRlciAtIGNvdW50
RGVsZXRlIC0gY291bnRJbnNlcnQgKSA+IDAgJiYKKwkJCQkJCQkJCWRpZmZzWyBwb2ludGVyIC0g
Y291bnREZWxldGUgLSBjb3VudEluc2VydCAtIDEgXVsgMCBdID09PQorCQkJCQkJCQkJRElGRl9F
UVVBTCApIHsKKwkJCQkJCQkJZGlmZnNbIHBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50SW5z
ZXJ0IC0gMSBdWyAxIF0gKz0KKwkJCQkJCQkJCXRleHRJbnNlcnQuc3Vic3RyaW5nKCAwLCBjb21t
b25sZW5ndGggKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlkaWZmcy5zcGxpY2UoIDAsIDAs
IFsgRElGRl9FUVVBTCwKKwkJCQkJCQkJCXRleHRJbnNlcnQuc3Vic3RyaW5nKCAwLCBjb21tb25s
ZW5ndGggKQorCQkJCQkJCQldICk7CisJCQkJCQkJCXBvaW50ZXIrKzsKKwkJCQkJCQl9CisJCQkJ
CQkJdGV4dEluc2VydCA9IHRleHRJbnNlcnQuc3Vic3RyaW5nKCBjb21tb25sZW5ndGggKTsKKwkJ
CQkJCQl0ZXh0RGVsZXRlID0gdGV4dERlbGV0ZS5zdWJzdHJpbmcoIGNvbW1vbmxlbmd0aCApOwor
CQkJCQkJfQorCQkJCQkJLy8gRmFjdG9yIG91dCBhbnkgY29tbW9uIHN1ZmZpeGllcy4KKwkJCQkJ
CWNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZkNvbW1vblN1ZmZpeCggdGV4dEluc2VydCwgdGV4dERl
bGV0ZSApOworCQkJCQkJaWYgKCBjb21tb25sZW5ndGggIT09IDAgKSB7CisJCQkJCQkJZGlmZnNb
IHBvaW50ZXIgXVsgMSBdID0gdGV4dEluc2VydC5zdWJzdHJpbmcoIHRleHRJbnNlcnQubGVuZ3Ro
IC0KKwkJCQkJCQkJCWNvbW1vbmxlbmd0aCApICsgZGlmZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJ
CQkJCXRleHRJbnNlcnQgPSB0ZXh0SW5zZXJ0LnN1YnN0cmluZyggMCwgdGV4dEluc2VydC5sZW5n
dGggLQorCQkJCQkJCQljb21tb25sZW5ndGggKTsKKwkJCQkJCQl0ZXh0RGVsZXRlID0gdGV4dERl
bGV0ZS5zdWJzdHJpbmcoIDAsIHRleHREZWxldGUubGVuZ3RoIC0KKwkJCQkJCQkJY29tbW9ubGVu
Z3RoICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gRGVsZXRlIHRoZSBvZmZlbmRpbmcgcmVj
b3JkcyBhbmQgYWRkIHRoZSBtZXJnZWQgb25lcy4KKwkJCQkJaWYgKCBjb3VudERlbGV0ZSA9PT0g
MCApIHsKKwkJCQkJCWRpZmZzLnNwbGljZSggcG9pbnRlciAtIGNvdW50SW5zZXJ0LAorCQkJCQkJ
CWNvdW50RGVsZXRlICsgY291bnRJbnNlcnQsIFsgRElGRl9JTlNFUlQsIHRleHRJbnNlcnQgXSAp
OworCQkJCQl9IGVsc2UgaWYgKCBjb3VudEluc2VydCA9PT0gMCApIHsKKwkJCQkJCWRpZmZzLnNw
bGljZSggcG9pbnRlciAtIGNvdW50RGVsZXRlLAorCQkJCQkJCWNvdW50RGVsZXRlICsgY291bnRJ
bnNlcnQsIFsgRElGRl9ERUxFVEUsIHRleHREZWxldGUgXSApOworCQkJCQl9IGVsc2UgeworCQkJ
CQkJZGlmZnMuc3BsaWNlKAorCQkJCQkJCXBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50SW5z
ZXJ0LAorCQkJCQkJCWNvdW50RGVsZXRlICsgY291bnRJbnNlcnQsCisJCQkJCQkJWyBESUZGX0RF
TEVURSwgdGV4dERlbGV0ZSBdLCBbIERJRkZfSU5TRVJULCB0ZXh0SW5zZXJ0IF0KKwkJCQkJCSk7
CisJCQkJCX0KKwkJCQkJcG9pbnRlciA9IHBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50SW5z
ZXJ0ICsKKwkJCQkJCSggY291bnREZWxldGUgPyAxIDogMCApICsgKCBjb3VudEluc2VydCA/IDEg
OiAwICkgKyAxOworCQkJCX0gZWxzZSBpZiAoIHBvaW50ZXIgIT09IDAgJiYgZGlmZnNbIHBvaW50
ZXIgLSAxIF1bIDAgXSA9PT0gRElGRl9FUVVBTCApIHsKKworCQkJCQkvLyBNZXJnZSB0aGlzIGVx
dWFsaXR5IHdpdGggdGhlIHByZXZpb3VzIG9uZS4KKwkJCQkJZGlmZnNbIHBvaW50ZXIgLSAxIF1b
IDEgXSArPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJCWRpZmZzLnNwbGljZSggcG9pbnRl
ciwgMSApOworCQkJCX0gZWxzZSB7CisJCQkJCXBvaW50ZXIrKzsKKwkJCQl9CisJCQkJY291bnRJ
bnNlcnQgPSAwOworCQkJCWNvdW50RGVsZXRlID0gMDsKKwkJCQl0ZXh0RGVsZXRlID0gIiI7CisJ
CQkJdGV4dEluc2VydCA9ICIiOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICggZGlmZnNb
IGRpZmZzLmxlbmd0aCAtIDEgXVsgMSBdID09PSAiIiApIHsKKwkJCWRpZmZzLnBvcCgpOyAvLyBS
ZW1vdmUgdGhlIGR1bW15IGVudHJ5IGF0IHRoZSBlbmQuCisJCX0KKworCQkvLyBTZWNvbmQgcGFz
czogbG9vayBmb3Igc2luZ2xlIGVkaXRzIHN1cnJvdW5kZWQgb24gYm90aCBzaWRlcyBieSBlcXVh
bGl0aWVzCisJCS8vIHdoaWNoIGNhbiBiZSBzaGlmdGVkIHNpZGV3YXlzIHRvIGVsaW1pbmF0ZSBh
biBlcXVhbGl0eS4KKwkJLy8gZS5nOiBBPGlucz5CQTwvaW5zPkMgLT4gPGlucz5BQjwvaW5zPkFD
CisJCWNoYW5nZXMgPSBmYWxzZTsKKwkJcG9pbnRlciA9IDE7CisKKwkJLy8gSW50ZW50aW9uYWxs
eSBpZ25vcmUgdGhlIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnQgKGRvbid0IG5lZWQgY2hlY2tpbmcp
LgorCQl3aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggLSAxICkgeworCQkJaWYgKCBkaWZm
c1sgcG9pbnRlciAtIDEgXVsgMCBdID09PSBESUZGX0VRVUFMICYmCisJCQkJCWRpZmZzWyBwb2lu
dGVyICsgMSBdWyAwIF0gPT09IERJRkZfRVFVQUwgKSB7CisKKwkJCQlkaWZmUG9pbnRlciA9IGRp
ZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQlwb3NpdGlvbiA9IGRpZmZQb2ludGVyLnN1YnN0cmlu
ZygKKwkJCQkJZGlmZlBvaW50ZXIubGVuZ3RoIC0gZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXS5s
ZW5ndGgKKwkJCQkpOworCisJCQkJLy8gVGhpcyBpcyBhIHNpbmdsZSBlZGl0IHN1cnJvdW5kZWQg
YnkgZXF1YWxpdGllcy4KKwkJCQlpZiAoIHBvc2l0aW9uID09PSBkaWZmc1sgcG9pbnRlciAtIDEg
XVsgMSBdICkgeworCisJCQkJCS8vIFNoaWZ0IHRoZSBlZGl0IG92ZXIgdGhlIHByZXZpb3VzIGVx
dWFsaXR5LgorCQkJCQlkaWZmc1sgcG9pbnRlciBdWyAxIF0gPSBkaWZmc1sgcG9pbnRlciAtIDEg
XVsgMSBdICsKKwkJCQkJCWRpZmZzWyBwb2ludGVyIF1bIDEgXS5zdWJzdHJpbmcoIDAsIGRpZmZz
WyBwb2ludGVyIF1bIDEgXS5sZW5ndGggLQorCQkJCQkJCWRpZmZzWyBwb2ludGVyIC0gMSBdWyAx
IF0ubGVuZ3RoICk7CisJCQkJCWRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF0gPQorCQkJCQkJZGlm
ZnNbIHBvaW50ZXIgLSAxIF1bIDEgXSArIGRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF07CisJCQkJ
CWRpZmZzLnNwbGljZSggcG9pbnRlciAtIDEsIDEgKTsKKwkJCQkJY2hhbmdlcyA9IHRydWU7CisJ
CQkJfSBlbHNlIGlmICggZGlmZlBvaW50ZXIuc3Vic3RyaW5nKCAwLCBkaWZmc1sgcG9pbnRlciAr
IDEgXVsgMSBdLmxlbmd0aCApID09PQorCQkJCQkJZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXSAp
IHsKKworCQkJCQkvLyBTaGlmdCB0aGUgZWRpdCBvdmVyIHRoZSBuZXh0IGVxdWFsaXR5LgorCQkJ
CQlkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBdICs9IGRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF07
CisJCQkJCWRpZmZzWyBwb2ludGVyIF1bIDEgXSA9CisJCQkJCQlkaWZmc1sgcG9pbnRlciBdWyAx
IF0uc3Vic3RyaW5nKCBkaWZmc1sgcG9pbnRlciArIDEgXVsgMSBdLmxlbmd0aCApICsKKwkJCQkJ
CWRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF07CisJCQkJCWRpZmZzLnNwbGljZSggcG9pbnRlciAr
IDEsIDEgKTsKKwkJCQkJY2hhbmdlcyA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJcG9pbnRlcisr
OworCQl9CisJCS8vIElmIHNoaWZ0cyB3ZXJlIG1hZGUsIHRoZSBkaWZmIG5lZWRzIHJlb3JkZXJp
bmcgYW5kIGFub3RoZXIgc2hpZnQgc3dlZXAuCisJCWlmICggY2hhbmdlcyApIHsKKwkJCXRoaXMu
ZGlmZkNsZWFudXBNZXJnZSggZGlmZnMgKTsKKwkJfQorCX07CisKKwlyZXR1cm4gZnVuY3Rpb24o
IG8sIG4gKSB7CisJCXZhciBkaWZmLCBvdXRwdXQsIHRleHQ7CisJCWRpZmYgPSBuZXcgRGlmZk1h
dGNoUGF0Y2goKTsKKwkJb3V0cHV0ID0gZGlmZi5EaWZmTWFpbiggbywgbiApOworCQlkaWZmLmRp
ZmZDbGVhbnVwRWZmaWNpZW5jeSggb3V0cHV0ICk7CisJCXRleHQgPSBkaWZmLmRpZmZQcmV0dHlI
dG1sKCBvdXRwdXQgKTsKKworCQlyZXR1cm4gdGV4dDsKKwl9OworfSgpICk7CisKKy8vIEdldCBh
IHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCwgbGlrZSB3aW5kb3cgaW4gYnJvd3NlcnMK
K30oIChmdW5jdGlvbigpIHsKKwlyZXR1cm4gdGhpczsKK30pKCkgKSk7CisKKyhmdW5jdGlvbigp
IHsKKworLy8gRG9uJ3QgbG9hZCB0aGUgSFRNTCBSZXBvcnRlciBvbiBub24tQnJvd3NlciBlbnZp
cm9ubWVudHMKK2lmICggdHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIgfHwgIXdpbmRvdy5k
b2N1bWVudCApIHsKKwlyZXR1cm47Cit9CisKKy8vIERlcHJlY2F0ZWQgUVVuaXQuaW5pdCAtIFJl
ZiAjNTMwCisvLyBSZS1pbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMKK1FVbml0
LmluaXQgPSBmdW5jdGlvbigpIHsKKwl2YXIgdGVzdHMsIGJhbm5lciwgcmVzdWx0LCBxdW5pdCwK
KwkJY29uZmlnID0gUVVuaXQuY29uZmlnOworCisJY29uZmlnLnN0YXRzID0geyBhbGw6IDAsIGJh
ZDogMCB9OworCWNvbmZpZy5tb2R1bGVTdGF0cyA9IHsgYWxsOiAwLCBiYWQ6IDAgfTsKKwljb25m
aWcuc3RhcnRlZCA9IDA7CisJY29uZmlnLnVwZGF0ZVJhdGUgPSAxMDAwOworCWNvbmZpZy5ibG9j
a2luZyA9IGZhbHNlOworCWNvbmZpZy5hdXRvc3RhcnQgPSB0cnVlOworCWNvbmZpZy5hdXRvcnVu
ID0gZmFsc2U7CisJY29uZmlnLmZpbHRlciA9ICIiOworCWNvbmZpZy5xdWV1ZSA9IFtdOworCisJ
Ly8gUmV0dXJuIG9uIG5vbi1icm93c2VyIGVudmlyb25tZW50cworCS8vIFRoaXMgaXMgbmVjZXNz
YXJ5IHRvIG5vdCBicmVhayBvbiBub2RlIHRlc3RzCisJaWYgKCB0eXBlb2Ygd2luZG93ID09PSAi
dW5kZWZpbmVkIiApIHsKKwkJcmV0dXJuOworCX0KKworCXF1bml0ID0gaWQoICJxdW5pdCIgKTsK
KwlpZiAoIHF1bml0ICkgeworCQlxdW5pdC5pbm5lckhUTUwgPQorCQkJIjxoMSBpZD0ncXVuaXQt
aGVhZGVyJz4iICsgZXNjYXBlVGV4dCggZG9jdW1lbnQudGl0bGUgKSArICI8L2gxPiIgKworCQkJ
IjxoMiBpZD0ncXVuaXQtYmFubmVyJz48L2gyPiIgKworCQkJIjxkaXYgaWQ9J3F1bml0LXRlc3Ry
dW5uZXItdG9vbGJhcic+PC9kaXY+IiArCisJCQkiPGgyIGlkPSdxdW5pdC11c2VyQWdlbnQnPjwv
aDI+IiArCisJCQkiPG9sIGlkPSdxdW5pdC10ZXN0cyc+PC9vbD4iOworCX0KKworCXRlc3RzID0g
aWQoICJxdW5pdC10ZXN0cyIgKTsKKwliYW5uZXIgPSBpZCggInF1bml0LWJhbm5lciIgKTsKKwly
ZXN1bHQgPSBpZCggInF1bml0LXRlc3RyZXN1bHQiICk7CisKKwlpZiAoIHRlc3RzICkgeworCQl0
ZXN0cy5pbm5lckhUTUwgPSAiIjsKKwl9CisKKwlpZiAoIGJhbm5lciApIHsKKwkJYmFubmVyLmNs
YXNzTmFtZSA9ICIiOworCX0KKworCWlmICggcmVzdWx0ICkgeworCQlyZXN1bHQucGFyZW50Tm9k
ZS5yZW1vdmVDaGlsZCggcmVzdWx0ICk7CisJfQorCisJaWYgKCB0ZXN0cyApIHsKKwkJcmVzdWx0
ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInAiICk7CisJCXJlc3VsdC5pZCA9ICJxdW5pdC10
ZXN0cmVzdWx0IjsKKwkJcmVzdWx0LmNsYXNzTmFtZSA9ICJyZXN1bHQiOworCQl0ZXN0cy5wYXJl
bnROb2RlLmluc2VydEJlZm9yZSggcmVzdWx0LCB0ZXN0cyApOworCQlyZXN1bHQuaW5uZXJIVE1M
ID0gIlJ1bm5pbmcuLi48YnIgLz4mIzE2MDsiOworCX0KK307CisKK3ZhciBjb25maWcgPSBRVW5p
dC5jb25maWcsCisJY29sbGFwc2VOZXh0ID0gZmFsc2UsCisJaGFzT3duID0gT2JqZWN0LnByb3Rv
dHlwZS5oYXNPd25Qcm9wZXJ0eSwKKwlkZWZpbmVkID0geworCQlkb2N1bWVudDogd2luZG93LmRv
Y3VtZW50ICE9PSB1bmRlZmluZWQsCisJCXNlc3Npb25TdG9yYWdlOiAoZnVuY3Rpb24oKSB7CisJ
CQl2YXIgeCA9ICJxdW5pdC10ZXN0LXN0cmluZyI7CisJCQl0cnkgeworCQkJCXNlc3Npb25TdG9y
YWdlLnNldEl0ZW0oIHgsIHggKTsKKwkJCQlzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCB4ICk7
CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGNhdGNoICggZSApIHsKKwkJCQlyZXR1cm4gZmFsc2U7
CisJCQl9CisJCX0oKSkKKwl9LAorCW1vZHVsZXNMaXN0ID0gW107CisKKy8qKgorKiBFc2NhcGUg
dGV4dCBmb3IgYXR0cmlidXRlIG9yIHRleHQgY29udGVudC4KKyovCitmdW5jdGlvbiBlc2NhcGVU
ZXh0KCBzICkgeworCWlmICggIXMgKSB7CisJCXJldHVybiAiIjsKKwl9CisJcyA9IHMgKyAiIjsK
KworCS8vIEJvdGggc2luZ2xlIHF1b3RlcyBhbmQgZG91YmxlIHF1b3RlcyAoZm9yIGF0dHJpYnV0
ZXMpCisJcmV0dXJuIHMucmVwbGFjZSggL1snIjw+Jl0vZywgZnVuY3Rpb24oIHMgKSB7CisJCXN3
aXRjaCAoIHMgKSB7CisJCWNhc2UgIiciOgorCQkJcmV0dXJuICImIzAzOTsiOworCQljYXNlICJc
IiI6CisJCQlyZXR1cm4gIiZxdW90OyI7CisJCWNhc2UgIjwiOgorCQkJcmV0dXJuICImbHQ7IjsK
KwkJY2FzZSAiPiI6CisJCQlyZXR1cm4gIiZndDsiOworCQljYXNlICImIjoKKwkJCXJldHVybiAi
JmFtcDsiOworCQl9CisJfSk7Cit9CisKKy8qKgorICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxl
bQorICogQHBhcmFtIHtzdHJpbmd9IHR5cGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCisgKi8K
K2Z1bmN0aW9uIGFkZEV2ZW50KCBlbGVtLCB0eXBlLCBmbiApIHsKKwlpZiAoIGVsZW0uYWRkRXZl
bnRMaXN0ZW5lciApIHsKKworCQkvLyBTdGFuZGFyZHMtYmFzZWQgYnJvd3NlcnMKKwkJZWxlbS5h
ZGRFdmVudExpc3RlbmVyKCB0eXBlLCBmbiwgZmFsc2UgKTsKKwl9IGVsc2UgaWYgKCBlbGVtLmF0
dGFjaEV2ZW50ICkgeworCisJCS8vIHN1cHBvcnQ6IElFIDw5CisJCWVsZW0uYXR0YWNoRXZlbnQo
ICJvbiIgKyB0eXBlLCBmdW5jdGlvbigpIHsKKwkJCXZhciBldmVudCA9IHdpbmRvdy5ldmVudDsK
KwkJCWlmICggIWV2ZW50LnRhcmdldCApIHsKKwkJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNF
bGVtZW50IHx8IGRvY3VtZW50OworCQkJfQorCisJCQlmbi5jYWxsKCBlbGVtLCBldmVudCApOwor
CQl9KTsKKwl9Cit9CisKKy8qKgorICogQHBhcmFtIHtBcnJheXxOb2RlTGlzdH0gZWxlbXMKKyAq
IEBwYXJhbSB7c3RyaW5nfSB0eXBlCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbgorICovCitmdW5j
dGlvbiBhZGRFdmVudHMoIGVsZW1zLCB0eXBlLCBmbiApIHsKKwl2YXIgaSA9IGVsZW1zLmxlbmd0
aDsKKwl3aGlsZSAoIGktLSApIHsKKwkJYWRkRXZlbnQoIGVsZW1zWyBpIF0sIHR5cGUsIGZuICk7
CisJfQorfQorCitmdW5jdGlvbiBoYXNDbGFzcyggZWxlbSwgbmFtZSApIHsKKwlyZXR1cm4gKCAi
ICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIiApLmluZGV4T2YoICIgIiArIG5hbWUgKyAiICIgKSA+
PSAwOworfQorCitmdW5jdGlvbiBhZGRDbGFzcyggZWxlbSwgbmFtZSApIHsKKwlpZiAoICFoYXND
bGFzcyggZWxlbSwgbmFtZSApICkgeworCQllbGVtLmNsYXNzTmFtZSArPSAoIGVsZW0uY2xhc3NO
YW1lID8gIiAiIDogIiIgKSArIG5hbWU7CisJfQorfQorCitmdW5jdGlvbiB0b2dnbGVDbGFzcygg
ZWxlbSwgbmFtZSApIHsKKwlpZiAoIGhhc0NsYXNzKCBlbGVtLCBuYW1lICkgKSB7CisJCXJlbW92
ZUNsYXNzKCBlbGVtLCBuYW1lICk7CisJfSBlbHNlIHsKKwkJYWRkQ2xhc3MoIGVsZW0sIG5hbWUg
KTsKKwl9Cit9CisKK2Z1bmN0aW9uIHJlbW92ZUNsYXNzKCBlbGVtLCBuYW1lICkgeworCXZhciBz
ZXQgPSAiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIjsKKworCS8vIENsYXNzIG5hbWUgbWF5IGFw
cGVhciBtdWx0aXBsZSB0aW1lcworCXdoaWxlICggc2V0LmluZGV4T2YoICIgIiArIG5hbWUgKyAi
ICIgKSA+PSAwICkgeworCQlzZXQgPSBzZXQucmVwbGFjZSggIiAiICsgbmFtZSArICIgIiwgIiAi
ICk7CisJfQorCisJLy8gdHJpbSBmb3IgcHJldHRpbmVzcworCWVsZW0uY2xhc3NOYW1lID0gdHlw
ZW9mIHNldC50cmltID09PSAiZnVuY3Rpb24iID8gc2V0LnRyaW0oKSA6IHNldC5yZXBsYWNlKCAv
XlxzK3xccyskL2csICIiICk7Cit9CisKK2Z1bmN0aW9uIGlkKCBuYW1lICkgeworCXJldHVybiBk
ZWZpbmVkLmRvY3VtZW50ICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkICYmIGRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKCBuYW1lICk7Cit9CisKK2Z1bmN0aW9uIGdldFVybENvbmZpZ0h0bWwoKSB7
CisJdmFyIGksIGosIHZhbCwKKwkJZXNjYXBlZCwgZXNjYXBlZFRvb2x0aXAsCisJCXNlbGVjdGlv
biA9IGZhbHNlLAorCQlsZW4gPSBjb25maWcudXJsQ29uZmlnLmxlbmd0aCwKKwkJdXJsQ29uZmln
SHRtbCA9ICIiOworCisJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKwkJdmFsID0gY29u
ZmlnLnVybENvbmZpZ1sgaSBdOworCQlpZiAoIHR5cGVvZiB2YWwgPT09ICJzdHJpbmciICkgewor
CQkJdmFsID0geworCQkJCWlkOiB2YWwsCisJCQkJbGFiZWw6IHZhbAorCQkJfTsKKwkJfQorCisJ
CWVzY2FwZWQgPSBlc2NhcGVUZXh0KCB2YWwuaWQgKTsKKwkJZXNjYXBlZFRvb2x0aXAgPSBlc2Nh
cGVUZXh0KCB2YWwudG9vbHRpcCApOworCisJCWlmICggY29uZmlnWyB2YWwuaWQgXSA9PT0gdW5k
ZWZpbmVkICkgeworCQkJY29uZmlnWyB2YWwuaWQgXSA9IFFVbml0LnVybFBhcmFtc1sgdmFsLmlk
IF07CisJCX0KKworCQlpZiAoICF2YWwudmFsdWUgfHwgdHlwZW9mIHZhbC52YWx1ZSA9PT0gInN0
cmluZyIgKSB7CisJCQl1cmxDb25maWdIdG1sICs9ICI8aW5wdXQgaWQ9J3F1bml0LXVybGNvbmZp
Zy0iICsgZXNjYXBlZCArCisJCQkJIicgbmFtZT0nIiArIGVzY2FwZWQgKyAiJyB0eXBlPSdjaGVj
a2JveCciICsKKwkJCQkoIHZhbC52YWx1ZSA/ICIgdmFsdWU9JyIgKyBlc2NhcGVUZXh0KCB2YWwu
dmFsdWUgKSArICInIiA6ICIiICkgKworCQkJCSggY29uZmlnWyB2YWwuaWQgXSA/ICIgY2hlY2tl
ZD0nY2hlY2tlZCciIDogIiIgKSArCisJCQkJIiB0aXRsZT0nIiArIGVzY2FwZWRUb29sdGlwICsg
IicgLz48bGFiZWwgZm9yPSdxdW5pdC11cmxjb25maWctIiArIGVzY2FwZWQgKworCQkJCSInIHRp
dGxlPSciICsgZXNjYXBlZFRvb2x0aXAgKyAiJz4iICsgdmFsLmxhYmVsICsgIjwvbGFiZWw+IjsK
KwkJfSBlbHNlIHsKKwkJCXVybENvbmZpZ0h0bWwgKz0gIjxsYWJlbCBmb3I9J3F1bml0LXVybGNv
bmZpZy0iICsgZXNjYXBlZCArCisJCQkJIicgdGl0bGU9JyIgKyBlc2NhcGVkVG9vbHRpcCArICIn
PiIgKyB2YWwubGFiZWwgKworCQkJCSI6IDwvbGFiZWw+PHNlbGVjdCBpZD0ncXVuaXQtdXJsY29u
ZmlnLSIgKyBlc2NhcGVkICsKKwkJCQkiJyBuYW1lPSciICsgZXNjYXBlZCArICInIHRpdGxlPSci
ICsgZXNjYXBlZFRvb2x0aXAgKyAiJz48b3B0aW9uPjwvb3B0aW9uPiI7CisKKwkJCWlmICggUVVu
aXQuaXMoICJhcnJheSIsIHZhbC52YWx1ZSApICkgeworCQkJCWZvciAoIGogPSAwOyBqIDwgdmFs
LnZhbHVlLmxlbmd0aDsgaisrICkgeworCQkJCQllc2NhcGVkID0gZXNjYXBlVGV4dCggdmFsLnZh
bHVlWyBqIF0gKTsKKwkJCQkJdXJsQ29uZmlnSHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nIiArIGVz
Y2FwZWQgKyAiJyIgKworCQkJCQkJKCBjb25maWdbIHZhbC5pZCBdID09PSB2YWwudmFsdWVbIGog
XSA/CisJCQkJCQkJKCBzZWxlY3Rpb24gPSB0cnVlICkgJiYgIiBzZWxlY3RlZD0nc2VsZWN0ZWQn
IiA6ICIiICkgKworCQkJCQkJIj4iICsgZXNjYXBlZCArICI8L29wdGlvbj4iOworCQkJCX0KKwkJ
CX0gZWxzZSB7CisJCQkJZm9yICggaiBpbiB2YWwudmFsdWUgKSB7CisJCQkJCWlmICggaGFzT3du
LmNhbGwoIHZhbC52YWx1ZSwgaiApICkgeworCQkJCQkJdXJsQ29uZmlnSHRtbCArPSAiPG9wdGlv
biB2YWx1ZT0nIiArIGVzY2FwZVRleHQoIGogKSArICInIiArCisJCQkJCQkJKCBjb25maWdbIHZh
bC5pZCBdID09PSBqID8KKwkJCQkJCQkJKCBzZWxlY3Rpb24gPSB0cnVlICkgJiYgIiBzZWxlY3Rl
ZD0nc2VsZWN0ZWQnIiA6ICIiICkgKworCQkJCQkJCSI+IiArIGVzY2FwZVRleHQoIHZhbC52YWx1
ZVsgaiBdICkgKyAiPC9vcHRpb24+IjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICggY29u
ZmlnWyB2YWwuaWQgXSAmJiAhc2VsZWN0aW9uICkgeworCQkJCWVzY2FwZWQgPSBlc2NhcGVUZXh0
KCBjb25maWdbIHZhbC5pZCBdICk7CisJCQkJdXJsQ29uZmlnSHRtbCArPSAiPG9wdGlvbiB2YWx1
ZT0nIiArIGVzY2FwZWQgKworCQkJCQkiJyBzZWxlY3RlZD0nc2VsZWN0ZWQnIGRpc2FibGVkPSdk
aXNhYmxlZCc+IiArIGVzY2FwZWQgKyAiPC9vcHRpb24+IjsKKwkJCX0KKwkJCXVybENvbmZpZ0h0
bWwgKz0gIjwvc2VsZWN0PiI7CisJCX0KKwl9CisKKwlyZXR1cm4gdXJsQ29uZmlnSHRtbDsKK30K
KworLy8gSGFuZGxlICJjbGljayIgZXZlbnRzIG9uIHRvb2xiYXIgY2hlY2tib3hlcyBhbmQgImNo
YW5nZSIgZm9yIHNlbGVjdCBtZW51cy4KKy8vIFVwZGF0ZXMgdGhlIFVSTCB3aXRoIHRoZSBuZXcg
c3RhdGUgb2YgYGNvbmZpZy51cmxDb25maWdgIHZhbHVlcy4KK2Z1bmN0aW9uIHRvb2xiYXJDaGFu
Z2VkKCkgeworCXZhciB1cGRhdGVkVXJsLCB2YWx1ZSwKKwkJZmllbGQgPSB0aGlzLAorCQlwYXJh
bXMgPSB7fTsKKworCS8vIERldGVjdCBpZiBmaWVsZCBpcyBhIHNlbGVjdCBtZW51IG9yIGEgY2hl
Y2tib3gKKwlpZiAoICJzZWxlY3RlZEluZGV4IiBpbiBmaWVsZCApIHsKKwkJdmFsdWUgPSBmaWVs
ZC5vcHRpb25zWyBmaWVsZC5zZWxlY3RlZEluZGV4IF0udmFsdWUgfHwgdW5kZWZpbmVkOworCX0g
ZWxzZSB7CisJCXZhbHVlID0gZmllbGQuY2hlY2tlZCA/ICggZmllbGQuZGVmYXVsdFZhbHVlIHx8
IHRydWUgKSA6IHVuZGVmaW5lZDsKKwl9CisKKwlwYXJhbXNbIGZpZWxkLm5hbWUgXSA9IHZhbHVl
OworCXVwZGF0ZWRVcmwgPSBzZXRVcmwoIHBhcmFtcyApOworCisJaWYgKCAiaGlkZXBhc3NlZCIg
PT09IGZpZWxkLm5hbWUgJiYgInJlcGxhY2VTdGF0ZSIgaW4gd2luZG93Lmhpc3RvcnkgKSB7CisJ
CWNvbmZpZ1sgZmllbGQubmFtZSBdID0gdmFsdWUgfHwgZmFsc2U7CisJCWlmICggdmFsdWUgKSB7
CisJCQlhZGRDbGFzcyggaWQoICJxdW5pdC10ZXN0cyIgKSwgImhpZGVwYXNzIiApOworCQl9IGVs
c2UgeworCQkJcmVtb3ZlQ2xhc3MoIGlkKCAicXVuaXQtdGVzdHMiICksICJoaWRlcGFzcyIgKTsK
KwkJfQorCisJCS8vIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcmVmcmVzaCB0aGUgd2hvbGUgcGFn
ZQorCQl3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoIG51bGwsICIiLCB1cGRhdGVkVXJsICk7
CisJfSBlbHNlIHsKKwkJd2luZG93LmxvY2F0aW9uID0gdXBkYXRlZFVybDsKKwl9Cit9CisKK2Z1
bmN0aW9uIHNldFVybCggcGFyYW1zICkgeworCXZhciBrZXksCisJCXF1ZXJ5c3RyaW5nID0gIj8i
OworCisJcGFyYW1zID0gUVVuaXQuZXh0ZW5kKCBRVW5pdC5leHRlbmQoIHt9LCBRVW5pdC51cmxQ
YXJhbXMgKSwgcGFyYW1zICk7CisKKwlmb3IgKCBrZXkgaW4gcGFyYW1zICkgeworCQlpZiAoIGhh
c093bi5jYWxsKCBwYXJhbXMsIGtleSApICkgeworCQkJaWYgKCBwYXJhbXNbIGtleSBdID09PSB1
bmRlZmluZWQgKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlxdWVyeXN0cmluZyArPSBlbmNv
ZGVVUklDb21wb25lbnQoIGtleSApOworCQkJaWYgKCBwYXJhbXNbIGtleSBdICE9PSB0cnVlICkg
eworCQkJCXF1ZXJ5c3RyaW5nICs9ICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggcGFyYW1zWyBr
ZXkgXSApOworCQkJfQorCQkJcXVlcnlzdHJpbmcgKz0gIiYiOworCQl9CisJfQorCXJldHVybiBs
b2NhdGlvbi5wcm90b2NvbCArICIvLyIgKyBsb2NhdGlvbi5ob3N0ICsKKwkJbG9jYXRpb24ucGF0
aG5hbWUgKyBxdWVyeXN0cmluZy5zbGljZSggMCwgLTEgKTsKK30KKworZnVuY3Rpb24gYXBwbHlV
cmxQYXJhbXMoKSB7CisJdmFyIHNlbGVjdGVkTW9kdWxlLAorCQltb2R1bGVzTGlzdCA9IGlkKCAi
cXVuaXQtbW9kdWxlZmlsdGVyIiApLAorCQlmaWx0ZXIgPSBpZCggInF1bml0LWZpbHRlci1pbnB1
dCIgKS52YWx1ZTsKKworCXNlbGVjdGVkTW9kdWxlID0gbW9kdWxlc0xpc3QgPworCQlkZWNvZGVV
UklDb21wb25lbnQoIG1vZHVsZXNMaXN0Lm9wdGlvbnNbIG1vZHVsZXNMaXN0LnNlbGVjdGVkSW5k
ZXggXS52YWx1ZSApIDoKKwkJdW5kZWZpbmVkOworCisJd2luZG93LmxvY2F0aW9uID0gc2V0VXJs
KHsKKwkJbW9kdWxlOiAoIHNlbGVjdGVkTW9kdWxlID09PSAiIiApID8gdW5kZWZpbmVkIDogc2Vs
ZWN0ZWRNb2R1bGUsCisJCWZpbHRlcjogKCBmaWx0ZXIgPT09ICIiICkgPyB1bmRlZmluZWQgOiBm
aWx0ZXIsCisKKwkJLy8gUmVtb3ZlIHRlc3RJZCBmaWx0ZXIKKwkJdGVzdElkOiB1bmRlZmluZWQK
Kwl9KTsKK30KKworZnVuY3Rpb24gdG9vbGJhclVybENvbmZpZ0NvbnRhaW5lcigpIHsKKwl2YXIg
dXJsQ29uZmlnQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInNwYW4iICk7CisK
Kwl1cmxDb25maWdDb250YWluZXIuaW5uZXJIVE1MID0gZ2V0VXJsQ29uZmlnSHRtbCgpOworCWFk
ZENsYXNzKCB1cmxDb25maWdDb250YWluZXIsICJxdW5pdC11cmwtY29uZmlnIiApOworCisJLy8g
Rm9yIG9sZElFIHN1cHBvcnQ6CisJLy8gKiBBZGQgaGFuZGxlcnMgdG8gdGhlIGluZGl2aWR1YWwg
ZWxlbWVudHMgaW5zdGVhZCBvZiB0aGUgY29udGFpbmVyCisJLy8gKiBVc2UgImNsaWNrIiBpbnN0
ZWFkIG9mICJjaGFuZ2UiIGZvciBjaGVja2JveGVzCisJYWRkRXZlbnRzKCB1cmxDb25maWdDb250
YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKSwgImNsaWNrIiwgdG9vbGJhckNo
YW5nZWQgKTsKKwlhZGRFdmVudHMoIHVybENvbmZpZ0NvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFn
TmFtZSggInNlbGVjdCIgKSwgImNoYW5nZSIsIHRvb2xiYXJDaGFuZ2VkICk7CisKKwlyZXR1cm4g
dXJsQ29uZmlnQ29udGFpbmVyOworfQorCitmdW5jdGlvbiB0b29sYmFyTG9vc2VGaWx0ZXIoKSB7
CisJdmFyIGZpbHRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJmb3JtIiApLAorCQlsYWJl
bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJsYWJlbCIgKSwKKwkJaW5wdXQgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCAiaW5wdXQiICksCisJCWJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoICJidXR0b24iICk7CisKKwlhZGRDbGFzcyggZmlsdGVyLCAicXVuaXQtZmlsdGVyIiAp
OworCisJbGFiZWwuaW5uZXJIVE1MID0gIkZpbHRlcjogIjsKKworCWlucHV0LnR5cGUgPSAidGV4
dCI7CisJaW5wdXQudmFsdWUgPSBjb25maWcuZmlsdGVyIHx8ICIiOworCWlucHV0Lm5hbWUgPSAi
ZmlsdGVyIjsKKwlpbnB1dC5pZCA9ICJxdW5pdC1maWx0ZXItaW5wdXQiOworCisJYnV0dG9uLmlu
bmVySFRNTCA9ICJHbyI7CisKKwlsYWJlbC5hcHBlbmRDaGlsZCggaW5wdXQgKTsKKworCWZpbHRl
ci5hcHBlbmRDaGlsZCggbGFiZWwgKTsKKwlmaWx0ZXIuYXBwZW5kQ2hpbGQoIGJ1dHRvbiApOwor
CWFkZEV2ZW50KCBmaWx0ZXIsICJzdWJtaXQiLCBmdW5jdGlvbiggZXYgKSB7CisJCWFwcGx5VXJs
UGFyYW1zKCk7CisKKwkJaWYgKCBldiAmJiBldi5wcmV2ZW50RGVmYXVsdCApIHsKKwkJCWV2LnBy
ZXZlbnREZWZhdWx0KCk7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfSk7CisKKwlyZXR1cm4g
ZmlsdGVyOworfQorCitmdW5jdGlvbiB0b29sYmFyTW9kdWxlRmlsdGVySHRtbCgpIHsKKwl2YXIg
aSwKKwkJbW9kdWxlRmlsdGVySHRtbCA9ICIiOworCisJaWYgKCAhbW9kdWxlc0xpc3QubGVuZ3Ro
ICkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJbW9kdWxlc0xpc3Quc29ydChmdW5jdGlvbigg
YSwgYiApIHsKKwkJcmV0dXJuIGEubG9jYWxlQ29tcGFyZSggYiApOworCX0pOworCisJbW9kdWxl
RmlsdGVySHRtbCArPSAiPGxhYmVsIGZvcj0ncXVuaXQtbW9kdWxlZmlsdGVyJz5Nb2R1bGU6IDwv
bGFiZWw+IiArCisJCSI8c2VsZWN0IGlkPSdxdW5pdC1tb2R1bGVmaWx0ZXInIG5hbWU9J21vZHVs
ZWZpbHRlcic+PG9wdGlvbiB2YWx1ZT0nJyAiICsKKwkJKCBRVW5pdC51cmxQYXJhbXMubW9kdWxl
ID09PSB1bmRlZmluZWQgPyAic2VsZWN0ZWQ9J3NlbGVjdGVkJyIgOiAiIiApICsKKwkJIj48IEFs
bCBNb2R1bGVzID48L29wdGlvbj4iOworCisJZm9yICggaSA9IDA7IGkgPCBtb2R1bGVzTGlzdC5s
ZW5ndGg7IGkrKyApIHsKKwkJbW9kdWxlRmlsdGVySHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nIiAr
CisJCQllc2NhcGVUZXh0KCBlbmNvZGVVUklDb21wb25lbnQoIG1vZHVsZXNMaXN0WyBpIF0gKSAp
ICsgIicgIiArCisJCQkoIFFVbml0LnVybFBhcmFtcy5tb2R1bGUgPT09IG1vZHVsZXNMaXN0WyBp
IF0gPyAic2VsZWN0ZWQ9J3NlbGVjdGVkJyIgOiAiIiApICsKKwkJCSI+IiArIGVzY2FwZVRleHQo
IG1vZHVsZXNMaXN0WyBpIF0gKSArICI8L29wdGlvbj4iOworCX0KKwltb2R1bGVGaWx0ZXJIdG1s
ICs9ICI8L3NlbGVjdD4iOworCisJcmV0dXJuIG1vZHVsZUZpbHRlckh0bWw7Cit9CisKK2Z1bmN0
aW9uIHRvb2xiYXJNb2R1bGVGaWx0ZXIoKSB7CisJdmFyIHRvb2xiYXIgPSBpZCggInF1bml0LXRl
c3RydW5uZXItdG9vbGJhciIgKSwKKwkJbW9kdWxlRmlsdGVyID0gZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCggInNwYW4iICksCisJCW1vZHVsZUZpbHRlckh0bWwgPSB0b29sYmFyTW9kdWxlRmlsdGVy
SHRtbCgpOworCisJaWYgKCAhdG9vbGJhciB8fCAhbW9kdWxlRmlsdGVySHRtbCApIHsKKwkJcmV0
dXJuIGZhbHNlOworCX0KKworCW1vZHVsZUZpbHRlci5zZXRBdHRyaWJ1dGUoICJpZCIsICJxdW5p
dC1tb2R1bGVmaWx0ZXItY29udGFpbmVyIiApOworCW1vZHVsZUZpbHRlci5pbm5lckhUTUwgPSBt
b2R1bGVGaWx0ZXJIdG1sOworCisJYWRkRXZlbnQoIG1vZHVsZUZpbHRlci5sYXN0Q2hpbGQsICJj
aGFuZ2UiLCBhcHBseVVybFBhcmFtcyApOworCisJdG9vbGJhci5hcHBlbmRDaGlsZCggbW9kdWxl
RmlsdGVyICk7Cit9CisKK2Z1bmN0aW9uIGFwcGVuZFRvb2xiYXIoKSB7CisJdmFyIHRvb2xiYXIg
PSBpZCggInF1bml0LXRlc3RydW5uZXItdG9vbGJhciIgKTsKKworCWlmICggdG9vbGJhciApIHsK
KwkJdG9vbGJhci5hcHBlbmRDaGlsZCggdG9vbGJhclVybENvbmZpZ0NvbnRhaW5lcigpICk7CisJ
CXRvb2xiYXIuYXBwZW5kQ2hpbGQoIHRvb2xiYXJMb29zZUZpbHRlcigpICk7CisJfQorfQorCitm
dW5jdGlvbiBhcHBlbmRIZWFkZXIoKSB7CisJdmFyIGhlYWRlciA9IGlkKCAicXVuaXQtaGVhZGVy
IiApOworCisJaWYgKCBoZWFkZXIgKSB7CisJCWhlYWRlci5pbm5lckhUTUwgPSAiPGEgaHJlZj0n
IiArCisJCQlzZXRVcmwoeyBmaWx0ZXI6IHVuZGVmaW5lZCwgbW9kdWxlOiB1bmRlZmluZWQsIHRl
c3RJZDogdW5kZWZpbmVkIH0pICsKKwkJCSInPiIgKyBoZWFkZXIuaW5uZXJIVE1MICsgIjwvYT4g
IjsKKwl9Cit9CisKK2Z1bmN0aW9uIGFwcGVuZEJhbm5lcigpIHsKKwl2YXIgYmFubmVyID0gaWQo
ICJxdW5pdC1iYW5uZXIiICk7CisKKwlpZiAoIGJhbm5lciApIHsKKwkJYmFubmVyLmNsYXNzTmFt
ZSA9ICIiOworCX0KK30KKworZnVuY3Rpb24gYXBwZW5kVGVzdFJlc3VsdHMoKSB7CisJdmFyIHRl
c3RzID0gaWQoICJxdW5pdC10ZXN0cyIgKSwKKwkJcmVzdWx0ID0gaWQoICJxdW5pdC10ZXN0cmVz
dWx0IiApOworCisJaWYgKCByZXN1bHQgKSB7CisJCXJlc3VsdC5wYXJlbnROb2RlLnJlbW92ZUNo
aWxkKCByZXN1bHQgKTsKKwl9CisKKwlpZiAoIHRlc3RzICkgeworCQl0ZXN0cy5pbm5lckhUTUwg
PSAiIjsKKwkJcmVzdWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInAiICk7CisJCXJlc3Vs
dC5pZCA9ICJxdW5pdC10ZXN0cmVzdWx0IjsKKwkJcmVzdWx0LmNsYXNzTmFtZSA9ICJyZXN1bHQi
OworCQl0ZXN0cy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggcmVzdWx0LCB0ZXN0cyApOworCQly
ZXN1bHQuaW5uZXJIVE1MID0gIlJ1bm5pbmcuLi48YnIgLz4mIzE2MDsiOworCX0KK30KKworZnVu
Y3Rpb24gc3RvcmVGaXh0dXJlKCkgeworCXZhciBmaXh0dXJlID0gaWQoICJxdW5pdC1maXh0dXJl
IiApOworCWlmICggZml4dHVyZSApIHsKKwkJY29uZmlnLmZpeHR1cmUgPSBmaXh0dXJlLmlubmVy
SFRNTDsKKwl9Cit9CisKK2Z1bmN0aW9uIGFwcGVuZEZpbHRlcmVkVGVzdCgpIHsKKwl2YXIgdGVz
dElkID0gUVVuaXQuY29uZmlnLnRlc3RJZDsKKwlpZiAoICF0ZXN0SWQgfHwgdGVzdElkLmxlbmd0
aCA8PSAwICkgeworCQlyZXR1cm4gIiI7CisJfQorCXJldHVybiAiPGRpdiBpZD0ncXVuaXQtZmls
dGVyZWRUZXN0Jz5SZXJ1bm5pbmcgc2VsZWN0ZWQgdGVzdHM6ICIgKyB0ZXN0SWQuam9pbigiLCAi
KSArCisJCSIgPGEgaWQ9J3F1bml0LWNsZWFyRmlsdGVyJyBocmVmPSciICsKKwkJc2V0VXJsKHsg
ZmlsdGVyOiB1bmRlZmluZWQsIG1vZHVsZTogdW5kZWZpbmVkLCB0ZXN0SWQ6IHVuZGVmaW5lZCB9
KSArCisJCSInPiIgKyAiUnVuIGFsbCB0ZXN0cyIgKyAiPC9hPjwvZGl2PiI7Cit9CisKK2Z1bmN0
aW9uIGFwcGVuZFVzZXJBZ2VudCgpIHsKKwl2YXIgdXNlckFnZW50ID0gaWQoICJxdW5pdC11c2Vy
QWdlbnQiICk7CisKKwlpZiAoIHVzZXJBZ2VudCApIHsKKwkJdXNlckFnZW50LmlubmVySFRNTCA9
ICIiOworCQl1c2VyQWdlbnQuYXBwZW5kQ2hpbGQoCisJCQlkb2N1bWVudC5jcmVhdGVUZXh0Tm9k
ZSgKKwkJCQkiUVVuaXQgIiArIFFVbml0LnZlcnNpb24gKyAiOyAiICsgbmF2aWdhdG9yLnVzZXJB
Z2VudAorCQkJKQorCQkpOworCX0KK30KKworZnVuY3Rpb24gYXBwZW5kVGVzdHNMaXN0KCBtb2R1
bGVzICkgeworCXZhciBpLCBsLCB4LCB6LCB0ZXN0LCBtb2R1bGVPYmo7CisKKwlmb3IgKCBpID0g
MCwgbCA9IG1vZHVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQltb2R1bGVPYmogPSBtb2R1
bGVzWyBpIF07CisKKwkJaWYgKCBtb2R1bGVPYmoubmFtZSApIHsKKwkJCW1vZHVsZXNMaXN0LnB1
c2goIG1vZHVsZU9iai5uYW1lICk7CisJCX0KKworCQlmb3IgKCB4ID0gMCwgeiA9IG1vZHVsZU9i
ai50ZXN0cy5sZW5ndGg7IHggPCB6OyB4KysgKSB7CisJCQl0ZXN0ID0gbW9kdWxlT2JqLnRlc3Rz
WyB4IF07CisKKwkJCWFwcGVuZFRlc3QoIHRlc3QubmFtZSwgdGVzdC50ZXN0SWQsIG1vZHVsZU9i
ai5uYW1lICk7CisJCX0KKwl9Cit9CisKK2Z1bmN0aW9uIGFwcGVuZFRlc3QoIG5hbWUsIHRlc3RJ
ZCwgbW9kdWxlTmFtZSApIHsKKwl2YXIgdGl0bGUsIHJlcnVuVHJpZ2dlciwgdGVzdEJsb2NrLCBh
c3NlcnRMaXN0LAorCQl0ZXN0cyA9IGlkKCAicXVuaXQtdGVzdHMiICk7CisKKwlpZiAoICF0ZXN0
cyApIHsKKwkJcmV0dXJuOworCX0KKworCXRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgg
InN0cm9uZyIgKTsKKwl0aXRsZS5pbm5lckhUTUwgPSBnZXROYW1lSHRtbCggbmFtZSwgbW9kdWxl
TmFtZSApOworCisJcmVydW5UcmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImEiICk7
CisJcmVydW5UcmlnZ2VyLmlubmVySFRNTCA9ICJSZXJ1biI7CisJcmVydW5UcmlnZ2VyLmhyZWYg
PSBzZXRVcmwoeyB0ZXN0SWQ6IHRlc3RJZCB9KTsKKworCXRlc3RCbG9jayA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoICJsaSIgKTsKKwl0ZXN0QmxvY2suYXBwZW5kQ2hpbGQoIHRpdGxlICk7CisJ
dGVzdEJsb2NrLmFwcGVuZENoaWxkKCByZXJ1blRyaWdnZXIgKTsKKwl0ZXN0QmxvY2suaWQgPSAi
cXVuaXQtdGVzdC1vdXRwdXQtIiArIHRlc3RJZDsKKworCWFzc2VydExpc3QgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCAib2wiICk7CisJYXNzZXJ0TGlzdC5jbGFzc05hbWUgPSAicXVuaXQtYXNz
ZXJ0LWxpc3QiOworCisJdGVzdEJsb2NrLmFwcGVuZENoaWxkKCBhc3NlcnRMaXN0ICk7CisKKwl0
ZXN0cy5hcHBlbmRDaGlsZCggdGVzdEJsb2NrICk7Cit9CisKKy8vIEhUTUwgUmVwb3J0ZXIgaW5p
dGlhbGl6YXRpb24gYW5kIGxvYWQKK1FVbml0LmJlZ2luKGZ1bmN0aW9uKCBkZXRhaWxzICkgewor
CXZhciBxdW5pdCA9IGlkKCAicXVuaXQiICk7CisKKwkvLyBGaXh0dXJlIGlzIHRoZSBvbmx5IG9u
ZSBuZWNlc3NhcnkgdG8gcnVuIHdpdGhvdXQgdGhlICNxdW5pdCBlbGVtZW50CisJc3RvcmVGaXh0
dXJlKCk7CisKKwlpZiAoIHF1bml0ICkgeworCQlxdW5pdC5pbm5lckhUTUwgPQorCQkJIjxoMSBp
ZD0ncXVuaXQtaGVhZGVyJz4iICsgZXNjYXBlVGV4dCggZG9jdW1lbnQudGl0bGUgKSArICI8L2gx
PiIgKworCQkJIjxoMiBpZD0ncXVuaXQtYmFubmVyJz48L2gyPiIgKworCQkJIjxkaXYgaWQ9J3F1
bml0LXRlc3RydW5uZXItdG9vbGJhcic+PC9kaXY+IiArCisJCQlhcHBlbmRGaWx0ZXJlZFRlc3Qo
KSArCisJCQkiPGgyIGlkPSdxdW5pdC11c2VyQWdlbnQnPjwvaDI+IiArCisJCQkiPG9sIGlkPSdx
dW5pdC10ZXN0cyc+PC9vbD4iOworCX0KKworCWFwcGVuZEhlYWRlcigpOworCWFwcGVuZEJhbm5l
cigpOworCWFwcGVuZFRlc3RSZXN1bHRzKCk7CisJYXBwZW5kVXNlckFnZW50KCk7CisJYXBwZW5k
VG9vbGJhcigpOworCWFwcGVuZFRlc3RzTGlzdCggZGV0YWlscy5tb2R1bGVzICk7CisJdG9vbGJh
ck1vZHVsZUZpbHRlcigpOworCisJaWYgKCBxdW5pdCAmJiBjb25maWcuaGlkZXBhc3NlZCApIHsK
KwkJYWRkQ2xhc3MoIHF1bml0Lmxhc3RDaGlsZCwgImhpZGVwYXNzIiApOworCX0KK30pOworCitR
VW5pdC5kb25lKGZ1bmN0aW9uKCBkZXRhaWxzICkgeworCXZhciBpLCBrZXksCisJCWJhbm5lciA9
IGlkKCAicXVuaXQtYmFubmVyIiApLAorCQl0ZXN0cyA9IGlkKCAicXVuaXQtdGVzdHMiICksCisJ
CWh0bWwgPSBbCisJCQkiVGVzdHMgY29tcGxldGVkIGluICIsCisJCQlkZXRhaWxzLnJ1bnRpbWUs
CisJCQkiIG1pbGxpc2Vjb25kcy48YnIgLz4iLAorCQkJIjxzcGFuIGNsYXNzPSdwYXNzZWQnPiIs
CisJCQlkZXRhaWxzLnBhc3NlZCwKKwkJCSI8L3NwYW4+IGFzc2VydGlvbnMgb2YgPHNwYW4gY2xh
c3M9J3RvdGFsJz4iLAorCQkJZGV0YWlscy50b3RhbCwKKwkJCSI8L3NwYW4+IHBhc3NlZCwgPHNw
YW4gY2xhc3M9J2ZhaWxlZCc+IiwKKwkJCWRldGFpbHMuZmFpbGVkLAorCQkJIjwvc3Bhbj4gZmFp
bGVkLiIKKwkJXS5qb2luKCAiIiApOworCisJaWYgKCBiYW5uZXIgKSB7CisJCWJhbm5lci5jbGFz
c05hbWUgPSBkZXRhaWxzLmZhaWxlZCA/ICJxdW5pdC1mYWlsIiA6ICJxdW5pdC1wYXNzIjsKKwl9
CisKKwlpZiAoIHRlc3RzICkgeworCQlpZCggInF1bml0LXRlc3RyZXN1bHQiICkuaW5uZXJIVE1M
ID0gaHRtbDsKKwl9CisKKwlpZiAoIGNvbmZpZy5hbHRlcnRpdGxlICYmIGRlZmluZWQuZG9jdW1l
bnQgJiYgZG9jdW1lbnQudGl0bGUgKSB7CisKKwkJLy8gc2hvdyDinJYgZm9yIGdvb2QsIOKclCBm
b3IgYmFkIHN1aXRlIHJlc3VsdCBpbiB0aXRsZQorCQkvLyB1c2UgZXNjYXBlIHNlcXVlbmNlcyBp
biBjYXNlIGZpbGUgZ2V0cyBsb2FkZWQgd2l0aCBub24tdXRmLTgtY2hhcnNldAorCQlkb2N1bWVu
dC50aXRsZSA9IFsKKwkJCSggZGV0YWlscy5mYWlsZWQgPyAiXHUyNzE2IiA6ICJcdTI3MTQiICks
CisJCQlkb2N1bWVudC50aXRsZS5yZXBsYWNlKCAvXltcdTI3MTRcdTI3MTZdIC9pLCAiIiApCisJ
CV0uam9pbiggIiAiICk7CisJfQorCisJLy8gY2xlYXIgb3duIHNlc3Npb25TdG9yYWdlIGl0ZW1z
IGlmIGFsbCB0ZXN0cyBwYXNzZWQKKwlpZiAoIGNvbmZpZy5yZW9yZGVyICYmIGRlZmluZWQuc2Vz
c2lvblN0b3JhZ2UgJiYgZGV0YWlscy5mYWlsZWQgPT09IDAgKSB7CisJCWZvciAoIGkgPSAwOyBp
IDwgc2Vzc2lvblN0b3JhZ2UubGVuZ3RoOyBpKysgKSB7CisJCQlrZXkgPSBzZXNzaW9uU3RvcmFn
ZS5rZXkoIGkrKyApOworCQkJaWYgKCBrZXkuaW5kZXhPZiggInF1bml0LXRlc3QtIiApID09PSAw
ICkgeworCQkJCXNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oIGtleSApOworCQkJfQorCQl9CisJ
fQorCisJLy8gc2Nyb2xsIGJhY2sgdG8gdG9wIHRvIHNob3cgcmVzdWx0cworCWlmICggY29uZmln
LnNjcm9sbHRvcCAmJiB3aW5kb3cuc2Nyb2xsVG8gKSB7CisJCXdpbmRvdy5zY3JvbGxUbyggMCwg
MCApOworCX0KK30pOworCitmdW5jdGlvbiBnZXROYW1lSHRtbCggbmFtZSwgbW9kdWxlICkgewor
CXZhciBuYW1lSHRtbCA9ICIiOworCisJaWYgKCBtb2R1bGUgKSB7CisJCW5hbWVIdG1sID0gIjxz
cGFuIGNsYXNzPSdtb2R1bGUtbmFtZSc+IiArIGVzY2FwZVRleHQoIG1vZHVsZSApICsgIjwvc3Bh
bj46ICI7CisJfQorCisJbmFtZUh0bWwgKz0gIjxzcGFuIGNsYXNzPSd0ZXN0LW5hbWUnPiIgKyBl
c2NhcGVUZXh0KCBuYW1lICkgKyAiPC9zcGFuPiI7CisKKwlyZXR1cm4gbmFtZUh0bWw7Cit9CisK
K1FVbml0LnRlc3RTdGFydChmdW5jdGlvbiggZGV0YWlscyApIHsKKwl2YXIgcnVubmluZywgdGVz
dEJsb2NrLCBiYWQ7CisKKwl0ZXN0QmxvY2sgPSBpZCggInF1bml0LXRlc3Qtb3V0cHV0LSIgKyBk
ZXRhaWxzLnRlc3RJZCApOworCWlmICggdGVzdEJsb2NrICkgeworCQl0ZXN0QmxvY2suY2xhc3NO
YW1lID0gInJ1bm5pbmciOworCX0gZWxzZSB7CisKKwkJLy8gUmVwb3J0IGxhdGVyIHJlZ2lzdGVy
ZWQgdGVzdHMKKwkJYXBwZW5kVGVzdCggZGV0YWlscy5uYW1lLCBkZXRhaWxzLnRlc3RJZCwgZGV0
YWlscy5tb2R1bGUgKTsKKwl9CisKKwlydW5uaW5nID0gaWQoICJxdW5pdC10ZXN0cmVzdWx0IiAp
OworCWlmICggcnVubmluZyApIHsKKwkJYmFkID0gUVVuaXQuY29uZmlnLnJlb3JkZXIgJiYgZGVm
aW5lZC5zZXNzaW9uU3RvcmFnZSAmJgorCQkJK3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oICJxdW5p
dC10ZXN0LSIgKyBkZXRhaWxzLm1vZHVsZSArICItIiArIGRldGFpbHMubmFtZSApOworCisJCXJ1
bm5pbmcuaW5uZXJIVE1MID0gKCBiYWQgPworCQkJIlJlcnVubmluZyBwcmV2aW91c2x5IGZhaWxl
ZCB0ZXN0OiA8YnIgLz4iIDoKKwkJCSJSdW5uaW5nOiA8YnIgLz4iICkgKworCQkJZ2V0TmFtZUh0
bWwoIGRldGFpbHMubmFtZSwgZGV0YWlscy5tb2R1bGUgKTsKKwl9CisKK30pOworCitmdW5jdGlv
biBzdHJpcEh0bWwoIHN0cmluZyApIHsKKwkvLyBzdHJpcCB0YWdzLCBodG1sIGVudGl0eSBhbmQg
d2hpdGVzcGFjZXMKKwlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoLzxcLz9bXj5dKyg+fCQpL2csICIi
KS5yZXBsYWNlKC9cJnF1b3Q7L2csICIiKS5yZXBsYWNlKC9ccysvZywgIiIpOworfQorCitRVW5p
dC5sb2coZnVuY3Rpb24oIGRldGFpbHMgKSB7CisJdmFyIGFzc2VydExpc3QsIGFzc2VydExpLAor
CQltZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsLCBkaWZmLAorCQlzaG93RGlmZiA9IGZhbHNlLAor
CQl0ZXN0SXRlbSA9IGlkKCAicXVuaXQtdGVzdC1vdXRwdXQtIiArIGRldGFpbHMudGVzdElkICk7
CisKKwlpZiAoICF0ZXN0SXRlbSApIHsKKwkJcmV0dXJuOworCX0KKworCW1lc3NhZ2UgPSBlc2Nh
cGVUZXh0KCBkZXRhaWxzLm1lc3NhZ2UgKSB8fCAoIGRldGFpbHMucmVzdWx0ID8gIm9rYXkiIDog
ImZhaWxlZCIgKTsKKwltZXNzYWdlID0gIjxzcGFuIGNsYXNzPSd0ZXN0LW1lc3NhZ2UnPiIgKyBt
ZXNzYWdlICsgIjwvc3Bhbj4iOworCW1lc3NhZ2UgKz0gIjxzcGFuIGNsYXNzPSdydW50aW1lJz5A
ICIgKyBkZXRhaWxzLnJ1bnRpbWUgKyAiIG1zPC9zcGFuPiI7CisKKwkvLyBwdXNoRmFpbHVyZSBk
b2Vzbid0IHByb3ZpZGUgZGV0YWlscy5leHBlY3RlZAorCS8vIHdoZW4gaXQgY2FsbHMsIGl0J3Mg
aW1wbGljaXQgdG8gYWxzbyBub3Qgc2hvdyBleHBlY3RlZCBhbmQgZGlmZiBzdHVmZgorCS8vIEFs
c28sIHdlIG5lZWQgdG8gY2hlY2sgZGV0YWlscy5leHBlY3RlZCBleGlzdGVuY2UsIGFzIGl0IGNh
biBleGlzdCBhbmQgYmUgdW5kZWZpbmVkCisJaWYgKCAhZGV0YWlscy5yZXN1bHQgJiYgaGFzT3du
LmNhbGwoIGRldGFpbHMsICJleHBlY3RlZCIgKSApIHsKKwkJaWYgKCBkZXRhaWxzLm5lZ2F0aXZl
ICkgeworCQkJZXhwZWN0ZWQgPSBlc2NhcGVUZXh0KCAiTk9UICIgKyBRVW5pdC5kdW1wLnBhcnNl
KCBkZXRhaWxzLmV4cGVjdGVkICkgKTsKKwkJfSBlbHNlIHsKKwkJCWV4cGVjdGVkID0gZXNjYXBl
VGV4dCggUVVuaXQuZHVtcC5wYXJzZSggZGV0YWlscy5leHBlY3RlZCApICk7CisJCX0KKworCQlh
Y3R1YWwgPSBlc2NhcGVUZXh0KCBRVW5pdC5kdW1wLnBhcnNlKCBkZXRhaWxzLmFjdHVhbCApICk7
CisJCW1lc3NhZ2UgKz0gIjx0YWJsZT48dHIgY2xhc3M9J3Rlc3QtZXhwZWN0ZWQnPjx0aD5FeHBl
Y3RlZDogPC90aD48dGQ+PHByZT4iICsKKwkJCWV4cGVjdGVkICsKKwkJCSI8L3ByZT48L3RkPjwv
dHI+IjsKKworCQlpZiAoIGFjdHVhbCAhPT0gZXhwZWN0ZWQgKSB7CisKKwkJCW1lc3NhZ2UgKz0g
Ijx0ciBjbGFzcz0ndGVzdC1hY3R1YWwnPjx0aD5SZXN1bHQ6IDwvdGg+PHRkPjxwcmU+IiArCisJ
CQkJYWN0dWFsICsgIjwvcHJlPjwvdGQ+PC90cj4iOworCisJCQkvLyBEb24ndCBzaG93IGRpZmYg
aWYgYWN0dWFsIG9yIGV4cGVjdGVkIGFyZSBib29sZWFucworCQkJaWYgKCAhKCAvXih0cnVlfGZh
bHNlKSQvLnRlc3QoIGFjdHVhbCApICkgJiYKKwkJCQkJISggL14odHJ1ZXxmYWxzZSkkLy50ZXN0
KCBleHBlY3RlZCApICkgKSB7CisJCQkJZGlmZiA9IFFVbml0LmRpZmYoIGV4cGVjdGVkLCBhY3R1
YWwgKTsKKwkJCQlzaG93RGlmZiA9IHN0cmlwSHRtbCggZGlmZiApLmxlbmd0aCAhPT0KKwkJCQkJ
c3RyaXBIdG1sKCBleHBlY3RlZCApLmxlbmd0aCArCisJCQkJCXN0cmlwSHRtbCggYWN0dWFsICku
bGVuZ3RoOworCQkJfQorCisJCQkvLyBEb24ndCBzaG93IGRpZmYgaWYgZXhwZWN0ZWQgYW5kIGFj
dHVhbCBhcmUgdG90YWxseSBkaWZmZXJlbnQKKwkJCWlmICggc2hvd0RpZmYgKSB7CisJCQkJbWVz
c2FnZSArPSAiPHRyIGNsYXNzPSd0ZXN0LWRpZmYnPjx0aD5EaWZmOiA8L3RoPjx0ZD48cHJlPiIg
KworCQkJCQlkaWZmICsgIjwvcHJlPjwvdGQ+PC90cj4iOworCQkJfQorCQl9IGVsc2UgaWYgKCBl
eHBlY3RlZC5pbmRleE9mKCAiW29iamVjdCBBcnJheV0iICkgIT09IC0xIHx8CisJCQkJZXhwZWN0
ZWQuaW5kZXhPZiggIltvYmplY3QgT2JqZWN0XSIgKSAhPT0gLTEgKSB7CisJCQltZXNzYWdlICs9
ICI8dHIgY2xhc3M9J3Rlc3QtbWVzc2FnZSc+PHRoPk1lc3NhZ2U6IDwvdGg+PHRkPiIgKworCQkJ
CSJEaWZmIHN1cHByZXNzZWQgYXMgdGhlIGRlcHRoIG9mIG9iamVjdCBpcyBtb3JlIHRoYW4gY3Vy
cmVudCBtYXggZGVwdGggKCIgKworCQkJCVFVbml0LmNvbmZpZy5tYXhEZXB0aCArICIpLjxwPkhp
bnQ6IFVzZSA8Y29kZT5RVW5pdC5kdW1wLm1heERlcHRoPC9jb2RlPiB0byAiICsKKwkJCQkiIHJ1
biB3aXRoIGEgaGlnaGVyIG1heCBkZXB0aCBvciA8YSBocmVmPSciICsgc2V0VXJsKHsgbWF4RGVw
dGg6IC0xIH0pICsgIic+IiArCisJCQkJIlJlcnVuPC9hPiB3aXRob3V0IG1heCBkZXB0aC48L3A+
PC90ZD48L3RyPiI7CisJCX0KKworCQlpZiAoIGRldGFpbHMuc291cmNlICkgeworCQkJbWVzc2Fn
ZSArPSAiPHRyIGNsYXNzPSd0ZXN0LXNvdXJjZSc+PHRoPlNvdXJjZTogPC90aD48dGQ+PHByZT4i
ICsKKwkJCQllc2NhcGVUZXh0KCBkZXRhaWxzLnNvdXJjZSApICsgIjwvcHJlPjwvdGQ+PC90cj4i
OworCQl9CisKKwkJbWVzc2FnZSArPSAiPC90YWJsZT4iOworCisJLy8gdGhpcyBvY2NvdXJzIHdo
ZW4gcHVzaEZhaWx1cmUgaXMgc2V0IGFuZCB3ZSBoYXZlIGFuIGV4dHJhY3RlZCBzdGFjayB0cmFj
ZQorCX0gZWxzZSBpZiAoICFkZXRhaWxzLnJlc3VsdCAmJiBkZXRhaWxzLnNvdXJjZSApIHsKKwkJ
bWVzc2FnZSArPSAiPHRhYmxlPiIgKworCQkJIjx0ciBjbGFzcz0ndGVzdC1zb3VyY2UnPjx0aD5T
b3VyY2U6IDwvdGg+PHRkPjxwcmU+IiArCisJCQllc2NhcGVUZXh0KCBkZXRhaWxzLnNvdXJjZSAp
ICsgIjwvcHJlPjwvdGQ+PC90cj4iICsKKwkJCSI8L3RhYmxlPiI7CisJfQorCisJYXNzZXJ0TGlz
dCA9IHRlc3RJdGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAib2wiIClbIDAgXTsKKworCWFzc2Vy
dExpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImxpIiApOworCWFzc2VydExpLmNsYXNzTmFt
ZSA9IGRldGFpbHMucmVzdWx0ID8gInBhc3MiIDogImZhaWwiOworCWFzc2VydExpLmlubmVySFRN
TCA9IG1lc3NhZ2U7CisJYXNzZXJ0TGlzdC5hcHBlbmRDaGlsZCggYXNzZXJ0TGkgKTsKK30pOwor
CitRVW5pdC50ZXN0RG9uZShmdW5jdGlvbiggZGV0YWlscyApIHsKKwl2YXIgdGVzdFRpdGxlLCB0
aW1lLCB0ZXN0SXRlbSwgYXNzZXJ0TGlzdCwKKwkJZ29vZCwgYmFkLCB0ZXN0Q291bnRzLCBza2lw
cGVkLCBzb3VyY2VOYW1lLAorCQl0ZXN0cyA9IGlkKCAicXVuaXQtdGVzdHMiICk7CisKKwlpZiAo
ICF0ZXN0cyApIHsKKwkJcmV0dXJuOworCX0KKworCXRlc3RJdGVtID0gaWQoICJxdW5pdC10ZXN0
LW91dHB1dC0iICsgZGV0YWlscy50ZXN0SWQgKTsKKworCWFzc2VydExpc3QgPSB0ZXN0SXRlbS5n
ZXRFbGVtZW50c0J5VGFnTmFtZSggIm9sIiApWyAwIF07CisKKwlnb29kID0gZGV0YWlscy5wYXNz
ZWQ7CisJYmFkID0gZGV0YWlscy5mYWlsZWQ7CisKKwkvLyBzdG9yZSByZXN1bHQgd2hlbiBwb3Nz
aWJsZQorCWlmICggY29uZmlnLnJlb3JkZXIgJiYgZGVmaW5lZC5zZXNzaW9uU3RvcmFnZSApIHsK
KwkJaWYgKCBiYWQgKSB7CisJCQlzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCAicXVuaXQtdGVzdC0i
ICsgZGV0YWlscy5tb2R1bGUgKyAiLSIgKyBkZXRhaWxzLm5hbWUsIGJhZCApOworCQl9IGVsc2Ug
eworCQkJc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSggInF1bml0LXRlc3QtIiArIGRldGFpbHMu
bW9kdWxlICsgIi0iICsgZGV0YWlscy5uYW1lICk7CisJCX0KKwl9CisKKwlpZiAoIGJhZCA9PT0g
MCApIHsKKworCQkvLyBDb2xsYXBzZSB0aGUgcGFzc2luZyB0ZXN0cworCQlhZGRDbGFzcyggYXNz
ZXJ0TGlzdCwgInF1bml0LWNvbGxhcHNlZCIgKTsKKwl9IGVsc2UgaWYgKCBiYWQgJiYgY29uZmln
LmNvbGxhcHNlICYmICFjb2xsYXBzZU5leHQgKSB7CisKKwkJLy8gU2tpcCBjb2xsYXBzaW5nIHRo
ZSBmaXJzdCBmYWlsaW5nIHRlc3QKKwkJY29sbGFwc2VOZXh0ID0gdHJ1ZTsKKwl9IGVsc2Ugewor
CisJCS8vIENvbGxhcHNlIHJlbWFpbmluZyB0ZXN0cworCQlhZGRDbGFzcyggYXNzZXJ0TGlzdCwg
InF1bml0LWNvbGxhcHNlZCIgKTsKKwl9CisKKwkvLyB0ZXN0SXRlbS5maXJzdENoaWxkIGlzIHRo
ZSB0ZXN0IG5hbWUKKwl0ZXN0VGl0bGUgPSB0ZXN0SXRlbS5maXJzdENoaWxkOworCisJdGVzdENv
dW50cyA9IGJhZCA/CisJCSI8YiBjbGFzcz0nZmFpbGVkJz4iICsgYmFkICsgIjwvYj4sICIgKyAi
PGIgY2xhc3M9J3Bhc3NlZCc+IiArIGdvb2QgKyAiPC9iPiwgIiA6CisJCSIiOworCisJdGVzdFRp
dGxlLmlubmVySFRNTCArPSAiIDxiIGNsYXNzPSdjb3VudHMnPigiICsgdGVzdENvdW50cyArCisJ
CWRldGFpbHMuYXNzZXJ0aW9ucy5sZW5ndGggKyAiKTwvYj4iOworCisJaWYgKCBkZXRhaWxzLnNr
aXBwZWQgKSB7CisJCXRlc3RJdGVtLmNsYXNzTmFtZSA9ICJza2lwcGVkIjsKKwkJc2tpcHBlZCA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJlbSIgKTsKKwkJc2tpcHBlZC5jbGFzc05hbWUgPSAi
cXVuaXQtc2tpcHBlZC1sYWJlbCI7CisJCXNraXBwZWQuaW5uZXJIVE1MID0gInNraXBwZWQiOwor
CQl0ZXN0SXRlbS5pbnNlcnRCZWZvcmUoIHNraXBwZWQsIHRlc3RUaXRsZSApOworCX0gZWxzZSB7
CisJCWFkZEV2ZW50KCB0ZXN0VGl0bGUsICJjbGljayIsIGZ1bmN0aW9uKCkgeworCQkJdG9nZ2xl
Q2xhc3MoIGFzc2VydExpc3QsICJxdW5pdC1jb2xsYXBzZWQiICk7CisJCX0pOworCisJCXRlc3RJ
dGVtLmNsYXNzTmFtZSA9IGJhZCA/ICJmYWlsIiA6ICJwYXNzIjsKKworCQl0aW1lID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCggInNwYW4iICk7CisJCXRpbWUuY2xhc3NOYW1lID0gInJ1bnRpbWUi
OworCQl0aW1lLmlubmVySFRNTCA9IGRldGFpbHMucnVudGltZSArICIgbXMiOworCQl0ZXN0SXRl
bS5pbnNlcnRCZWZvcmUoIHRpbWUsIGFzc2VydExpc3QgKTsKKwl9CisKKwkvLyBTaG93IHRoZSBz
b3VyY2Ugb2YgdGhlIHRlc3Qgd2hlbiBzaG93aW5nIGFzc2VydGlvbnMKKwlpZiAoIGRldGFpbHMu
c291cmNlICkgeworCQlzb3VyY2VOYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInAiICk7
CisJCXNvdXJjZU5hbWUuaW5uZXJIVE1MID0gIjxzdHJvbmc+U291cmNlOiA8L3N0cm9uZz4iICsg
ZGV0YWlscy5zb3VyY2U7CisJCWFkZENsYXNzKCBzb3VyY2VOYW1lLCAicXVuaXQtc291cmNlIiAp
OworCQlpZiAoIGJhZCA9PT0gMCApIHsKKwkJCWFkZENsYXNzKCBzb3VyY2VOYW1lLCAicXVuaXQt
Y29sbGFwc2VkIiApOworCQl9CisJCWFkZEV2ZW50KCB0ZXN0VGl0bGUsICJjbGljayIsIGZ1bmN0
aW9uKCkgeworCQkJdG9nZ2xlQ2xhc3MoIHNvdXJjZU5hbWUsICJxdW5pdC1jb2xsYXBzZWQiICk7
CisJCX0pOworCQl0ZXN0SXRlbS5hcHBlbmRDaGlsZCggc291cmNlTmFtZSApOworCX0KK30pOwor
CitpZiAoIGRlZmluZWQuZG9jdW1lbnQgKSB7CisKKwkvLyBBdm9pZCByZWFkeVN0YXRlIGlzc3Vl
IHdpdGggcGhhbnRvbWpzCisJLy8gUmVmOiAjODE4CisJdmFyIG5vdFBoYW50b20gPSAoIGZ1bmN0
aW9uKCBwICkgeworCQlyZXR1cm4gISggcCAmJiBwLnZlcnNpb24gJiYgcC52ZXJzaW9uLm1ham9y
ID4gMCApOworCX0gKSggd2luZG93LnBoYW50b20gKTsKKworCWlmICggbm90UGhhbnRvbSAmJiBk
b2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgeworCQlRVW5pdC5sb2FkKCk7CisJ
fSBlbHNlIHsKKwkJYWRkRXZlbnQoIHdpbmRvdywgImxvYWQiLCBRVW5pdC5sb2FkICk7CisJfQor
fSBlbHNlIHsKKwljb25maWcucGFnZUxvYWRlZCA9IHRydWU7CisJY29uZmlnLmF1dG9ydW4gPSB0
cnVlOworfQorCit9KSgpOwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVp
bGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRi
b3RRdWV1ZS5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29u
ZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanMKaW5kZXgg
ZTRhOTk1MTFmODk5MmI3NDhlZTg4MGYzMDA1NzM2ZDg2ZDJhZGRhOC4uYzVjOTMwZmE3NGMyZjkw
MzQ2MWIxN2I4ZDJlODA5MmU3NDZiNWVkMCAxMDA2NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1
cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Njcmlw
dHMvQnVpbGRib3RRdWV1ZS5qcworKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1
ZXVlLmpzCkBAIC0yNzEsNyArMjcxLDEwIEBAIEJ1aWxkYm90UXVldWUucHJvdG90eXBlID0gewog
ICAgICAgICB2YXIgc29ydGVkUmVwb3NpdG9yaWVzID0gRGFzaGJvYXJkLnNvcnRlZFJlcG9zaXRv
cmllczsKICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWRSZXBvc2l0b3JpZXMubGVu
Z3RoOyArK2kpIHsKICAgICAgICAgICAgIHZhciByZXBvc2l0b3J5TmFtZSA9IHNvcnRlZFJlcG9z
aXRvcmllc1tpXS5uYW1lOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGIucmV2aXNpb25bcmVw
b3NpdG9yeU5hbWVdIC0gYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV07CisgICAgICAgICAgICB2
YXIgdHJhYyA9IHNvcnRlZFJlcG9zaXRvcmllc1tpXS50cmFjOworICAgICAgICAgICAgaWYgKCF0
cmFjIHx8IGIucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdID09PSB1bmRlZmluZWQgfHwgYS5yZXZp
c2lvbltyZXBvc2l0b3J5TmFtZV0gPT09IHVuZGVmaW5lZCkKKyAgICAgICAgICAgICAgICByZXR1
cm4gdW5kZWZpbmVkOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyYWMuY29tcGFyZVJldmlz
aW9ucyhiLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSwgYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFt
ZV0pOwogICAgICAgICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmVz
dWx0OwogICAgICAgICB9CkBAIC0yODksNyArMjkyLDEwIEBAIEJ1aWxkYm90UXVldWUucHJvdG90
eXBlID0gewogICAgICAgICB2YXIgc29ydGVkUmVwb3NpdG9yaWVzID0gRGFzaGJvYXJkLnNvcnRl
ZFJlcG9zaXRvcmllczsKICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWRSZXBvc2l0
b3JpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgIHZhciByZXBvc2l0b3J5TmFtZSA9IHNv
cnRlZFJlcG9zaXRvcmllc1tpXS5uYW1lOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGIucmV2
aXNpb25bcmVwb3NpdG9yeU5hbWVdIC0gYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV07CisgICAg
ICAgICAgICB2YXIgdHJhYyA9IHNvcnRlZFJlcG9zaXRvcmllc1tpXS50cmFjOworICAgICAgICAg
ICAgaWYgKCF0cmFjIHx8IGIucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdID09PSB1bmRlZmluZWQg
fHwgYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0gPT09IHVuZGVmaW5lZCkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyYWMuY29t
cGFyZVJldmlzaW9ucyhiLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSwgYS5yZXZpc2lvbltyZXBv
c2l0b3J5TmFtZV0pOwogICAgICAgICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0OwogICAgICAgICB9CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3Vw
cG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0
cy9CdWlsZGJvdFF1ZXVlVmlldy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndl
YmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVl
dWVWaWV3LmpzCmluZGV4IDkyNjdmNDlkYTc1NzJkMDQzZDNiOTY5Yjk0N2RmODA5MjViMTdlMzgu
Ljc4MTRmOTY5OTk4M2MwZjUxMDdkMTQzNWI3YWFhNWQ0NDFlYjkzYjEgMTAwNjQ0Ci0tLSBhL1Rv
b2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1s
L2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWVWaWV3LmpzCisrKyBiL1Rvb2xzL0J1aWxk
U2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2Fy
ZC9TY3JpcHRzL0J1aWxkYm90UXVldWVWaWV3LmpzCkBAIC0yOSw2ICsyOSw5IEBAIEJ1aWxkYm90
UXVldWVWaWV3ID0gZnVuY3Rpb24ocXVldWVzKQogCiAgICAgdGhpcy5xdWV1ZXMgPSBxdWV1ZXMg
fHwgW107CiAKKyAgICBpZiAoc2V0dGluZ3MuZ2V0T2JqZWN0KCJNb2NrIikpCisgICAgICAgIHJl
dHVybjsKKwogICAgIHRoaXMucXVldWVzLmZvckVhY2goZnVuY3Rpb24ocXVldWUpIHsKICAgICAg
ICAgaWYgKHRoaXMucGxhdGZvcm0gJiYgdGhpcy5wbGF0Zm9ybSAhPSBxdWV1ZS5wbGF0Zm9ybSkK
ICAgICAgICAgICAgIHRocm93ICJBIGJ1aWxkYm90IHZpZXcgbWF5IG5vdCBjb250YWluIHF1ZXVl
cyBmb3IgbXVsdGlwbGUgcGxhdGZvcm1zLiIKQEAgLTkxLDEyICs5NCwxMyBAQCBCdWlsZGJvdFF1
ZXVlVmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAg
ICAgICBpZiAoIXRyYWMpCiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBp
ZiAoIXRyYWMubGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlciB8fCB0cmFjLm9sZGVzdFJlY29y
ZGVkUmV2aXNpb25OdW1iZXIgPiBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIpIHsKKyAg
ICAgICAgICAgIGNvbXBhcmlzb24gPSB0cmFjLmNvbXBhcmVSZXZpc2lvbnModHJhYy5vbGRlc3RS
ZWNvcmRlZFJldmlzaW9uTnVtYmVyLCBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIpOwor
ICAgICAgICAgICAgaWYgKCF0cmFjLmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIgfHwgY29t
cGFyaXNvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbXBhcmlzb24gPiAwKSB7CiAgICAgICAgICAgICAg
ICAgdHJhYy5sb2FkTW9yZUhpc3RvcmljYWxEYXRhKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJu
OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB0b3RhbFJldmlzaW9uc0JlaGluZCArPSB0
cmFjLmNvbW1pdHNPbkJyYW5jaChicmFuY2gubmFtZSwgZnVuY3Rpb24oY29tbWl0KSB7IHJldHVy
biBjb21taXQucmV2aXNpb25OdW1iZXIgPiBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXI7
IH0pLmxlbmd0aDsKKyAgICAgICAgICAgIHRvdGFsUmV2aXNpb25zQmVoaW5kICs9IHRyYWMuY29t
bWl0c09uQnJhbmNoKGJyYW5jaC5uYW1lLCBmdW5jdGlvbihjb21taXQsIGluZGV4LCBhcnIpIHsg
cmV0dXJuIGluZGV4ID4gYXJyLm9iamVjdEluZGV4T2YobGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9u
TnVtYmVyLCAicmV2aXNpb25OdW1iZXIiKTsgfSkubGVuZ3RoOwogICAgICAgICB9CiAKICAgICAg
ICAgaWYgKCF0b3RhbFJldmlzaW9uc0JlaGluZCkKQEAgLTEwNyw2ICsxMTEsOSBAQCBCdWlsZGJv
dFF1ZXVlVmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAgIHZhciBzdGF0dXMgPSBuZXcgU3RhdHVz
TGluZVZpZXcobWVzc2FnZUVsZW1lbnQsIFN0YXR1c0xpbmVWaWV3LlN0YXR1cy5Ob0J1YmJsZSk7
CiAgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChzdGF0dXMuZWxlbWVudCk7CiAKKyAg
ICAgICAgaWYgKHNldHRpbmdzLmdldE9iamVjdCgiTW9jayIpKQorICAgICAgICAgICAgcmV0dXJu
OworCiAgICAgICAgIG5ldyBQb3BvdmVyVHJhY2tlcihtZXNzYWdlRWxlbWVudCwgdGhpcy5fcHJl
c2VudFBvcG92ZXJGb3JQZW5kaW5nQ29tbWl0cy5iaW5kKHRoaXMpLCBxdWV1ZSk7CiAgICAgfSwK
IApAQCAtMTM3LDExICsxNDQsMTEgQEAgQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlID0gewog
ICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnNvbGUu
YXNzZXJ0KHRyYWMub2xkZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlciA8PSBmaXJzdFJldmlzaW9u
TnVtYmVyKTsKKyAgICAgICAgY29uc29sZS5hc3NlcnQodHJhYy5jb21wYXJlUmV2aXNpb25zKHRy
YWMub2xkZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlciwgZmlyc3RSZXZpc2lvbk51bWJlcikgPD0g
MCk7CiAKICAgICAgICAgLy8gRklYTUU6IFRvIGJlIDEwMCUgY29ycmVjdCwgd2Ugc2hvdWxkIGFs
c28gZmlsdGVyIG91dCBjaGFuZ2VzIHRoYXQgYXJlIGlnbm9yZWQgYnkKICAgICAgICAgLy8gdGhl
IHF1ZXVlLCBzZWUgX3Nob3VsZF9maWxlX3RyaWdnZXJfYnVpbGQgaW4gd2tidWlsZC5weS4KLSAg
ICAgICAgdmFyIGNvbW1pdHMgPSB0cmFjLmNvbW1pdHNPbkJyYW5jaChicmFuY2gsIGZ1bmN0aW9u
KGNvbW1pdCkgeyByZXR1cm4gY29tbWl0LnJldmlzaW9uTnVtYmVyID49IGZpcnN0UmV2aXNpb25O
dW1iZXIgJiYgY29tbWl0LnJldmlzaW9uTnVtYmVyIDw9IGxhc3RSZXZpc2lvbk51bWJlcjsgfSk7
CisgICAgICAgIHZhciBjb21taXRzID0gdHJhYy5jb21taXRzT25CcmFuY2goYnJhbmNoLm5hbWUs
IGZ1bmN0aW9uKGNvbW1pdCwgaW5kZXgsIGFycikgeyByZXR1cm4gaW5kZXggPj0gYXJyLm9iamVj
dEluZGV4T2YoZmlyc3RSZXZpc2lvbk51bWJlciwgInJldmlzaW9uTnVtYmVyIikgJiYgaW5kZXgg
PD0gYXJyLm9iamVjdEluZGV4T2YobGFzdFJldmlzaW9uTnVtYmVyLCAicmV2aXNpb25OdW1iZXIi
KTsgfSk7CiAgICAgICAgIHJldHVybiBjb21taXRzLm1hcChmdW5jdGlvbihjb21taXQpIHsKICAg
ICAgICAgICAgIHJldHVybiBsaW5lRm9yQ29tbWl0KHRyYWMsIGNvbW1pdCk7CiAgICAgICAgIH0s
IHRoaXMpLnJldmVyc2UoKTsKQEAgLTE2Niw3ICsxNzMsNyBAQCBCdWlsZGJvdFF1ZXVlVmlldy5w
cm90b3R5cGUgPSB7CiAgICAgICAgICAgICB2YXIgbGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVt
YmVyID0gbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV07
CiAgICAgICAgICAgICBpZiAoIWxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlciB8fCAhdHJh
Yy5sYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVyKQogICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5fcG9wb3ZlckxpbmVzRm9yQ29tbWl0UmFu
Z2UodHJhYywgYnJhbmNoLm5hbWUsIGxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlciArIDEs
IHRyYWMubGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlcik7CisgICAgICAgICAgICB2YXIgbGlu
ZXMgPSB0aGlzLl9wb3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSh0cmFjLCBicmFuY2gsIHRyYWMu
bmV4dFJldmlzaW9uKGJyYW5jaC5uYW1lLCBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIp
LCB0cmFjLmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpOwogICAgICAgICAgICAgdmFyIGxl
bmd0aCA9IGxpbmVzLmxlbmd0aDsKICAgICAgICAgICAgIGlmIChsZW5ndGggJiYgc2hvdWxkQWRk
RGl2aWRlcikKICAgICAgICAgICAgICAgICB0aGlzLl9hZGREaXZpZGVyVG9Qb3BvdmVyKGNvbnRl
bnQpOwpAQCAtMjMzLDcgKzI0MCw3IEBAIEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsK
ICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gewogICAgICAgICAgICAgICAgIHRyYWM6IHJlcG9z
aXRvcnkudHJhYywKICAgICAgICAgICAgICAgICBicmFuY2g6IGJyYW5jaC5uYW1lLAotICAgICAg
ICAgICAgICAgIGZpcnN0UmV2aXNpb246IHByZXZpb3VzSXRlcmF0aW9uLnJldmlzaW9uW3JlcG9z
aXRvcnlOYW1lXSArIDEsCisgICAgICAgICAgICAgICAgZmlyc3RSZXZpc2lvbjogcmVwb3NpdG9y
eS50cmFjLm5leHRSZXZpc2lvbihicmFuY2gubmFtZSwgcHJldmlvdXNJdGVyYXRpb24ucmV2aXNp
b25bcmVwb3NpdG9yeU5hbWVdKSwKICAgICAgICAgICAgICAgICBsYXN0UmV2aXNpb246IGl0ZXJh
dGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0KICAgICAgICAgICAgIH07CiAgICAgICAgICAg
ICBpZiAoY29udGV4dC5maXJzdFJldmlzaW9uIDw9IGNvbnRleHQubGFzdFJldmlzaW9uKQpkaWZm
IC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvUXVldWVWaWV3LmpzIGIvVG9vbHMvQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L1NjcmlwdHMvUXVldWVWaWV3LmpzCmluZGV4IGI3MTk0YWEyMDIwOGQ4ZDM5ZGFkNmRiMDExMjI5
MzVkZGY0MGYzYWIuLjFiYTliOGJmNmFhNjQ1YWFlN2Y3N2IyZTkzNmViOWRhMjRhM2NiMjMgMTAw
NjQ0Ci0tLSBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmln
L3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1F1ZXVlVmlldy5qcworKysgYi9Ub29scy9C
dWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNo
Ym9hcmQvU2NyaXB0cy9RdWV1ZVZpZXcuanMKQEAgLTMxLDYgKzMxLDkgQEAgUXVldWVWaWV3ID0g
ZnVuY3Rpb24oKQogICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJxdWV1ZS12aWV3Iik7
CiAgICAgdGhpcy5lbGVtZW50Ll9fcXVldWVWaWV3ID0gdGhpczsKIAorICAgIGlmIChzZXR0aW5n
cy5nZXRPYmplY3QoIk1vY2siKSkKKyAgICAgICAgcmV0dXJuOworCiAgICAgdGhpcy51cGRhdGVU
aW1lciA9IG51bGw7CiAgICAgc2V0VGltZW91dCh0aGlzLl91cGRhdGVIaWRkZW5TdGF0ZS5iaW5k
KHRoaXMpLCAwKTsgLy8gTGV0cyBzdWJjbGFzcyBjb25zdHJ1Y3RvciBmaW5pc2ggYmVmb3JlIGNh
bGxpbmcgX3VwZGF0ZUhpZGRlblN0YXRlLgogICAgIHNldHRpbmdzLmFkZFNldHRpbmdMaXN0ZW5l
cigiaGlkZGVuUGxhdGZvcm1GYW1pbGllcyIsIHRoaXMuX3VwZGF0ZUhpZGRlblN0YXRlLmJpbmQo
dGhpcykpOwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0
Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVHJhYy5qcyBiL1Rvb2xz
L0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rh
c2hib2FyZC9TY3JpcHRzL1RyYWMuanMKaW5kZXggYTFkZDI4ZmEyNzUwZWMyOTMzY2I4YmZlYThk
YzA0NWMzYTE1MjZjYi4uNmVhNmFjZjAyZGQ4YjZjZDI4OTU4YjdjZjNjMzA2MjQ0NTNhYjRjNiAx
MDA2NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVHJhYy5qcworKysgYi9Ub29scy9CdWls
ZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9h
cmQvU2NyaXB0cy9UcmFjLmpzCkBAIC02NSw4ICs2NSw4IEBAIFRyYWMucHJvdG90eXBlID0gewog
CiAgICAgY29tbWl0c09uQnJhbmNoOiBmdW5jdGlvbihicmFuY2gsIGZpbHRlcikKICAgICB7Ci0g
ICAgICAgIHJldHVybiB0aGlzLnJlY29yZGVkQ29tbWl0cy5maWx0ZXIoZnVuY3Rpb24oY29tbWl0
KSB7Ci0gICAgICAgICAgICByZXR1cm4gKCFjb21taXQuY29udGFpbnNCcmFuY2hMb2NhdGlvbiB8
fCBjb21taXQuYnJhbmNoID09PSBicmFuY2gpICYmIGZpbHRlcihjb21taXQpOworICAgICAgICBy
ZXR1cm4gdGhpcy5yZWNvcmRlZENvbW1pdHMuZmlsdGVyKGZ1bmN0aW9uKGNvbW1pdCwgaW5kZXgs
IGFycikgeworICAgICAgICAgICAgcmV0dXJuICghY29tbWl0LmNvbnRhaW5zQnJhbmNoTG9jYXRp
b24gfHwgY29tbWl0LmJyYW5jaCA9PT0gYnJhbmNoKSAmJiBmaWx0ZXIoY29tbWl0LCBpbmRleCwg
YXJyKTsKICAgICAgICAgfSk7CiAgICAgfSwKIApAQCAtODcsMTcgKzg3LDE5IEBAIFRyYWMucHJv
dG90eXBlID0gewogICAgICAgICAgICAgIiZkYXlzYmFjaz0iICsgKCh0b0RheSAtIGZyb21EYXkp
IC8gMTAwMCAvIDYwIC8gNjAgLyAyNCk7CiAgICAgfSwKIAotICAgIF9jb252ZXJ0Q29tbWl0SW5m
b0VsZW1lbnRUb09iamVjdDogZnVuY3Rpb24oZG9jLCBjb21taXRFbGVtZW50KQorICAgIF9wYXJz
ZVJldmlzaW9uRnJvbVVSTDogZnVuY3Rpb24odXJsKQogICAgIHsKLSAgICAgICAgdmFyIGxpbmsg
PSBkb2MuZXZhbHVhdGUoIi4vbGluayIsIGNvbW1pdEVsZW1lbnQsIG51bGwsIFhQYXRoUmVzdWx0
LlNUUklOR19UWVBFKS5zdHJpbmdWYWx1ZTsKLQogICAgICAgICAvLyBUaGVyZSBhcmUgbXVsdGlw
bGUgbGluayBmb3JtYXRzIGZvciBUcmFjIHRoYXQgd2Ugc3VwcG9ydDoKICAgICAgICAgLy8gaHR0
cHM6Ly90cmFjLndlYmtpdC5vcmcvY2hhbmdlc2V0LzE5MDQ5NwogICAgICAgICAvLyBodHRwOi8v
dHJhYy5mb29iYXIuY29tL3JlcG9zaXRvcnkvY2hhbmdlc2V0Lzc1Mzg4L3Byb2plY3QKLSAgICAg
ICAgdmFyIGxpbmtDb21wb25lbnRzID0gbGluay5zcGxpdCgiLyIpOwotICAgICAgICB2YXIgcmV2
aXNpb25OdW1iZXIgPSBwYXJzZUludChsaW5rQ29tcG9uZW50cy5wb3AoKSk7Ci0gICAgICAgIGlm
ICghcmV2aXNpb25OdW1iZXIpCi0gICAgICAgICAgICB2YXIgcmV2aXNpb25OdW1iZXIgPSBwYXJz
ZUludChsaW5rQ29tcG9uZW50cy5wb3AoKSk7CisgICAgICAgIC8vIGh0dHBzOi8vZ2l0LmZvb2Jh
ci5jb20vdHJhYy9XaGF0ZXZlci5naXQvY2hhbmdlc2V0LzBlNDk4ZGI1ZDhlNWI1YTM0MjYzMQor
ICAgICAgICByZXR1cm4gL2NoYW5nZXNldFwvKFthLWYwLTldKykuKiQvLmV4ZWModXJsKVsxXTsK
KyAgICB9LAorCisgICAgX2NvbnZlcnRDb21taXRJbmZvRWxlbWVudFRvT2JqZWN0OiBmdW5jdGlv
bihkb2MsIGNvbW1pdEVsZW1lbnQpCisgICAgeworICAgICAgICB2YXIgbGluayA9IGRvYy5ldmFs
dWF0ZSgiLi9saW5rIiwgY29tbWl0RWxlbWVudCwgbnVsbCwgWFBhdGhSZXN1bHQuU1RSSU5HX1RZ
UEUpLnN0cmluZ1ZhbHVlOworICAgICAgICB2YXIgcmV2aXNpb25OdW1iZXIgPSB0aGlzLl9wYXJz
ZVJldmlzaW9uRnJvbVVSTChsaW5rKTsKIAogICAgICAgICBmdW5jdGlvbiB0cmFjTlNSZXNvbHZl
cihwcmVmaXgpCiAgICAgICAgIHsKQEAgLTE5NSw3ICsxOTcsNyBAQCBUcmFjLnByb3RvdHlwZSA9
IHsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuZXdDb21taXRzLmxlbmd0aCkKLSAgICAgICAg
ICAgIHRoaXMucmVjb3JkZWRDb21taXRzID0gbmV3Q29tbWl0cy5jb25jYXQodGhpcy5yZWNvcmRl
ZENvbW1pdHMpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYS5yZXZpc2lvbk51bWJlciAt
IGIucmV2aXNpb25OdW1iZXI7IH0pOworICAgICAgICAgICAgdGhpcy5yZWNvcmRlZENvbW1pdHMg
PSBuZXdDb21taXRzLmNvbmNhdCh0aGlzLnJlY29yZGVkQ29tbWl0cykuc29ydChmdW5jdGlvbihh
LCBiKSB7IHJldHVybiBhLmRhdGUgLSBiLmRhdGU7IH0pOwogCiAgICAgICAgIGlmIChuZXdDb21t
aXRzLmxlbmd0aCB8fCBrbm93bkNvbW1pdHNXZXJlVXBkYXRlZCkKICAgICAgICAgICAgIHRoaXMu
ZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFRyYWMuRXZlbnQuQ29tbWl0c1VwZGF0ZWQsIG51bGwp
OwpAQCAtMjU3LDQgKzI1OSwyNCBAQCBUcmFjLnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgIHRo
aXMuX2xvYWRlZChkYXRhRG9jdW1lbnQpOwogICAgICAgICB9LmJpbmQodGhpcyksIHRoaXMuX25l
ZWRzQXV0aGVudGljYXRpb24gPyB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9IDoge30pOwogICAg
IH0sCisKKyAgICBjb21wYXJlUmV2aXNpb25zOiBmdW5jdGlvbihhLCBiKQorICAgIHsKKyAgICAg
ICAgdmFyIGluZGV4QSA9IHRoaXMucmVjb3JkZWRDb21taXRzLm9iamVjdEluZGV4T2YoYSwgInJl
dmlzaW9uTnVtYmVyIik7CisgICAgICAgIHZhciBpbmRleEIgPSB0aGlzLnJlY29yZGVkQ29tbWl0
cy5vYmplY3RJbmRleE9mKGIsICJyZXZpc2lvbk51bWJlciIpOworICAgICAgICBpZiAoaW5kZXhB
ID09PSB1bmRlZmluZWQgfHwgaW5kZXhCID09PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgIHRo
aXMubG9hZE1vcmVIaXN0b3JpY2FsRGF0YSgpOworICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5l
ZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5kZXhBIC0gaW5kZXhCOworICAgIH0sCisK
KyAgICBuZXh0UmV2aXNpb246IGZ1bmN0aW9uKGJyYW5jaE5hbWUsIHJldmlzaW9uKSB7CisgICAg
ICAgIHZhciBjb21taXRzT25CcmFuY2ggPSB0aGlzLmNvbW1pdHNPbkJyYW5jaChicmFuY2hOYW1l
LCBmdW5jdGlvbihjb21taXQpIHsgcmV0dXJuIGNvbW1pdDsgfSk7IC8vIFRPRE86IG1heWJlIHdl
IHNob3VsZCBjYWNoZSB0aGlzPworICAgICAgICB2YXIgaW5kZXggPSBjb21taXRzT25CcmFuY2gu
b2JqZWN0SW5kZXhPZihyZXZpc2lvbiwgInJldmlzaW9uTnVtYmVyIik7CisgICAgICAgIHZhciBu
ZXh0Q29tbWl0ID0gY29tbWl0c09uQnJhbmNoW2luZGV4ICsgMV07CisgICAgICAgIGlmIChuZXh0
Q29tbWl0KQorICAgICAgICAgICAgcmV0dXJuIG5leHRDb21taXQucmV2aXNpb25OdW1iZXI7Cisg
ICAgICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfQogfTsKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL1V0aWxpdGllcy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxk
LndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1V0aWxpdGll
cy5qcwppbmRleCAyZDcwMjUwMWU3MWZhNmU5Y2VmM2Q2MjEyMzBiOTllOWYxMmQxMGRmLi4xYTU0
NDE5ZGQxZDk3OTEwNWI1MTIxYmU3NzFkZDVhOTE5MWIzYWM0IDEwMDY0NAotLS0gYS9Ub29scy9C
dWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNo
Ym9hcmQvU2NyaXB0cy9VdGlsaXRpZXMuanMKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQv
YnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVXRp
bGl0aWVzLmpzCkBAIC0xNjYsNiArMTY2LDEzIEBAIEFycmF5LnByb3RvdHlwZS5maW5kRmlyc3Qg
PSBmdW5jdGlvbihwcmVkaWNhdGUpCiAgICAgcmV0dXJuIG51bGw7CiB9OwogCitBcnJheS5wcm90
b3R5cGUub2JqZWN0SW5kZXhPZiA9IGZ1bmN0aW9uKHNlYXJjaFRlcm0sIHByb3BlcnR5KQorewor
ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkKKyAgICAgICAgaWYgKHRo
aXNbaV1bcHJvcGVydHldID09PSBzZWFyY2hUZXJtKSByZXR1cm4gaTsKKyAgICByZXR1cm4gdW5k
ZWZpbmVkOworfTsKKwogQXJyYXkucHJvdG90eXBlLmF2ZXJhZ2UgPSBmdW5jdGlvbigpCiB7CiAg
ICAgdmFyIHN1bSA9IDA7CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWls
ZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9N
b2NrQnVpbGRib3RRdWV1ZS5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtp
dC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWls
ZGJvdFF1ZXVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmMwZWMzMTY3ZTJiNTRiNThlOTdmYjFlZGM5NGNiMjM2
YzA5YzU0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWls
ZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9N
b2NrQnVpbGRib3RRdWV1ZS5qcwpAQCAtMCwwICsxLDI1IEBACitNb2NrQnVpbGRib3RRdWV1ZSA9
IGZ1bmN0aW9uKCkKK3sKKyAgICBpbmZvID0geworICAgICAgICBicmFuY2hlczogIiIsCisgICAg
ICAgIHBsYXRmb3JtOiAiIiwKKyAgICAgICAgZGVidWc6ICIiLAorICAgICAgICBidWlsZGVyOiAi
IiwKKyAgICAgICAgdGVzdGVyOiAiIiwKKyAgICAgICAgcGVyZm9ybWFuY2U6ICIiLAorICAgICAg
ICBzdGF0aWNBbmFseXplcjogIiIsCisgICAgICAgIGxlYWtzOiAiIiwKKyAgICAgICAgYXJjaGl0
ZWN0dXJlOiAiIiwKKyAgICAgICAgdGVzdENhdGVnb3J5OiAiIiwKKyAgICAgICAgaGVhZGluZzog
IiIsCisgICAgICAgIGNyYXNoZXNPbmx5OiAiIgorICAgIH07CisgICAgQnVpbGRib3RRdWV1ZS5j
YWxsKHRoaXMsICJNb2NrIEJ1aWxkQm90IiwgImlkIiwgaW5mbyk7Cit9OworCitCYXNlT2JqZWN0
LmFkZENvbnN0cnVjdG9yRnVuY3Rpb25zKE1vY2tCdWlsZGJvdFF1ZXVlKTsKKworTW9ja0J1aWxk
Ym90UXVldWUucHJvdG90eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBNb2NrQnVpbGRib3RRdWV1
ZSwKKyAgICBfX3Byb3RvX186IEJ1aWxkYm90UXVldWUucHJvdG90eXBlCit9CmRpZmYgLS1naXQg
YS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNf
aHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrQnVpbGRib3RRdWV1ZVZpZXcuanMgYi9U
b29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRt
bC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrQnVpbGRib3RRdWV1ZVZpZXcuanMKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uMzJkMGUzMTQ4MjFhOTc2ZGRjNzA0NGVhMzc1MGQxYmVmY2U5YTkxNAotLS0gL2Rldi9u
dWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmln
L3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlVmll
dy5qcwpAQCAtMCwwICsxLDIwIEBACitNb2NrQnVpbGRib3RRdWV1ZVZpZXcgPSBmdW5jdGlvbihx
dWV1ZXMpCit7CisgICAgQnVpbGRib3RRdWV1ZVZpZXcuY2FsbCh0aGlzLCBxdWV1ZXMpOworfTsK
KworQmFzZU9iamVjdC5hZGRDb25zdHJ1Y3RvckZ1bmN0aW9ucyhNb2NrQnVpbGRib3RRdWV1ZVZp
ZXcpOworCitNb2NrQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlID0geworICAgIGNvbnN0cnVj
dG9yOiBNb2NrQnVpbGRib3RRdWV1ZVZpZXcsCisgICAgX19wcm90b19fOiBCdWlsZGJvdFF1ZXVl
Vmlldy5wcm90b3R5cGUsCisKKyAgICBfbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbjogZnVuY3Rp
b24ocXVldWUpCisgICAgeworICAgICAgICByZXR1cm4geworICAgICAgICAgICAgcmV2aXNpb246
IHsKKyAgICAgICAgICAgICAgICAiV2Via2l0IFJlcG8iOiAzMzAyMAorICAgICAgICAgICAgfQor
ICAgICAgICB9OworICAgIH0KK307CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9y
dC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90
ZXN0cy9Nb2NrT3ZlcnJpZGVzLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Vi
a2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja092
ZXJyaWRlcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44NTYyYjg2NzFkNWYyYzkyYjIzZjJkNDk0ODIzY2E2MjEy
MjUwZjUwCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9j
a092ZXJyaWRlcy5qcwpAQCAtMCwwICsxLDExIEBACisvLyBUaGUgcmVhbCAibGFiZWwiIHNldHRl
ciB3YXMgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGluIHRoZSB1bml0IHRlc3RzIHNvIEkgb3ZlcnJv
ZGUgaXQgd2l0aCBhIHNpbXBsaWZpZWQgdmVyc2lvbi4KK09iamVjdC5kZWZpbmVQcm9wZXJ0eShT
dGF0dXNMaW5lVmlldy5wcm90b3R5cGUsICJsYWJlbCIsIHsKKyAgICBzZXQ6IGZ1bmN0aW9uIGxh
YmVsKHgpCisgICAgeworICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgdGhpcy5fbGFiZWxF
bGVtZW50LnRleHRDb250ZW50ID0geDsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudC5pbnNlcnRC
ZWZvcmUodGhpcy5fbGFiZWxFbGVtZW50LCB0aGlzLl9tZXNzYWdlRWxlbWVudCk7CisgICAgICAg
ICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgibm8tbGFiZWwiKTsKKyAgICAgICAg
fQorICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9j
a1RyYWMuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZp
Zy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrVHJhYy5qcwpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi5hNDhmOTE1MmM4OTA1YWM4MTg0OTM2ZWE3MzNiOGZjZmQ1M2M4ZWZlCi0tLSAvZGV2L251
bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja1RyYWMuanMKQEAgLTAsMCAr
MSw3NyBAQAorTW9ja1RyYWMgPSBmdW5jdGlvbigpCit7CisgICAgVHJhYy5jYWxsKHRoaXMsICJo
dHRwczovL3RyYWMud2Via2l0Lm9yZy8iKTsKKyAgICB0aGlzLnJlY29yZGVkQ29tbWl0cyA9IFsK
KyAgICAgICAgeworICAgICAgICAgICAgInJldmlzaW9uTnVtYmVyIjogMzMwMTgsCisgICAgICAg
ICAgICAibGluayI6ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL3JlcG9zaXRvcnkvY2hhbmdlc2V0
Lzc3MDE4L3NhZmFyaSIsCisgICAgICAgICAgICAidGl0bGUiOiB7fSwKKyAgICAgICAgICAgICJh
dXRob3IiOiAiSm9obiIsCisgICAgICAgICAgICAiZGF0ZSI6ICIyMDE1LTExLTE1VDE3OjA1OjQ0
LjAwMFoiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRlc2NyaXB0aW9uIiwKKyAgICAg
ICAgICAgICJjb250YWluc0JyYW5jaExvY2F0aW9uIjogdHJ1ZSwKKyAgICAgICAgICAgICJicmFu
Y2giOiAidHJ1bmsiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJyZXZpc2lv
bk51bWJlciI6IDMzMDE5LAorICAgICAgICAgICAgImxpbmsiOiAiaHR0cDovL3RyYWMud2Via2l0
Lm9yZy9yZXBvc2l0b3J5L2NoYW5nZXNldC83NzAxOS9zYWZhcmkiLAorICAgICAgICAgICAgInRp
dGxlIjoge30sCisgICAgICAgICAgICAiYXV0aG9yIjogIlBhdWwiLAorICAgICAgICAgICAgImRh
dGUiOiAiMjAxNS0xMS0xNlQwMToxODoyMy4wMDBaIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlv
biI6ICJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAiY29udGFpbnNCcmFuY2hMb2NhdGlvbiI6
IHRydWUsCisgICAgICAgICAgICAiYnJhbmNoIjogInRydW5rIgorICAgICAgICB9LAorICAgICAg
ICB7CisgICAgICAgICAgICAicmV2aXNpb25OdW1iZXIiOiAzMzAyMCwKKyAgICAgICAgICAgICJs
aW5rIjogImh0dHA6Ly90cmFjLndlYmtpdC5vcmcvcmVwb3NpdG9yeS9jaGFuZ2VzZXQvNzcwMjAv
c2FmYXJpIiwKKyAgICAgICAgICAgICJ0aXRsZSI6IHt9LAorICAgICAgICAgICAgImF1dGhvciI6
ICJHZW9yZ2UiLAorICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0xMS0xNlQwMToxOToyNy4wMDBa
IiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiIsCisgICAgICAgICAg
ICAiY29udGFpbnNCcmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAgICAgICAgICAiYnJhbmNoIjog
InRydW5rIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAicmV2aXNpb25OdW1i
ZXIiOiAzMzAyMSwKKyAgICAgICAgICAgICJsaW5rIjogImh0dHA6Ly90cmFjLndlYmtpdC5vcmcv
cmVwb3NpdG9yeS9jaGFuZ2VzZXQvNzcwMjEvc2FmYXJpIiwKKyAgICAgICAgICAgICJ0aXRsZSI6
IHt9LAorICAgICAgICAgICAgImF1dGhvciI6ICJSaW5nbyIsCisgICAgICAgICAgICAiZGF0ZSI6
ICIyMDE1LTExLTE2VDAxOjIwOjU4LjAwMFoiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjog
ImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJjb250YWluc0JyYW5jaExvY2F0aW9uIjogdHJ1
ZSwKKyAgICAgICAgICAgICJicmFuY2giOiAic29tZU90aGVyQnJhbmNoIgorICAgICAgICB9LAor
ICAgICAgICB7CisgICAgICAgICAgICAicmV2aXNpb25OdW1iZXIiOiAzMzAyMiwKKyAgICAgICAg
ICAgICJsaW5rIjogImh0dHA6Ly90cmFjLndlYmtpdC5vcmcvcmVwb3NpdG9yeS9jaGFuZ2VzZXQv
NzcwMjIvc2FmYXJpIiwKKyAgICAgICAgICAgICJ0aXRsZSI6IHt9LAorICAgICAgICAgICAgImF1
dGhvciI6ICJCb2IiLAorICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0xMS0xNlQwMToyMjowMS4w
MDBaIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiIsCisgICAgICAg
ICAgICAiY29udGFpbnNCcmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAgICAgICAgICAiYnJhbmNo
IjogInRydW5rIgorICAgICAgICB9CisgICAgXTsKK307CisKK0Jhc2VPYmplY3QuYWRkQ29uc3Ry
dWN0b3JGdW5jdGlvbnMoTW9ja1RyYWMpOworCitNb2NrVHJhYy5wcm90b3R5cGUgPSB7CisgICAg
Y29uc3RydWN0b3I6IE1vY2tUcmFjLAorICAgIF9fcHJvdG9fXzogVHJhYy5wcm90b3R5cGUsCisK
KyAgICBnZXQgb2xkZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlcigpCisgICAgeworICAgICAgICBy
ZXR1cm4gMzMwMTg7CisgICAgfSwKKworICAgIGdldCBsYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVt
YmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiAzMzAyMjsKKyAgICB9LAorCisgICAgbG9hZE1v
cmVIaXN0b3JpY2FsRGF0YTogZnVuY3Rpb24oKQorICAgIHsKKyAgICB9LAorfTsKZGlmZiAtLWdp
dCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1Ymxp
Y19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL2luZGV4Lmh0bWwgYi9Ub29scy9CdWlsZFNs
YXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQv
U2NyaXB0cy90ZXN0cy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmFlYmI4OGIyYmIzYTJhOTY1ZTYx
ODM0OWIzNjYyYzllMTk1MDE0MjIKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZl
U3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2Ny
aXB0cy90ZXN0cy9pbmRleC5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzwhZG9jdHlwZSBodG1sPgor
PGh0bWw+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KKworICAgIDx0aXRs
ZT5XZWJLaXQgQm90IFdhdGNoZXIncyBEYXNoYm9hcmQgUVVuaXQgVGVzdCBSdW5uZXI8L3RpdGxl
PgorCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9FeHRlcm5hbC9xdW5p
dC0xLjIwLjAuY3NzIj4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL1N0
eWxlcy9NYWluLmNzcyI+PC9saW5rPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0i
Li4vLi4vU3R5bGVzL1BvcG92ZXIuY3NzIj48L2xpbms+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNo
ZWV0IiBocmVmPSIuLi8uLi9TdHlsZXMvUXVldWVWaWV3LmNzcyI+PC9saW5rPgorICAgIDxsaW5r
IHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vU3R5bGVzL1N0YXR1c0xpbmVWaWV3LmNzcyI+
PC9saW5rPgorCisgICAgPHNjcmlwdCBzcmM9Ii4uL1V0aWxpdGllcy5qcyI+PC9zY3JpcHQ+Cisg
ICAgPHNjcmlwdCBzcmM9Ii4uL0Jhc2VPYmplY3QuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQg
c3JjPSIuLi9EYXNoYm9hcmQuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWls
ZGJvdC5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1Z3ppbGxhLmpzIj48L3Nj
cmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnViYmxlUXVldWVTZXJ2ZXIuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSIuLi9XZWJLaXRCdWlsZGJvdC5qcyI+PC9zY3JpcHQ+CisgICAg
PHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90UXVldWUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQg
c3JjPSIuLi9CdWJibGVRdWV1ZS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1
aWxkYm90SXRlcmF0aW9uLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRi
b3RUZXN0UmVzdWx0cy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0dlb21ldHJ5
LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vUG9wb3Zlci5qcyI+PC9zY3JpcHQ+
CisgICAgPHNjcmlwdCBzcmM9Ii4uL1BvcG92ZXJUcmFja2VyLmpzIj48L3NjcmlwdD4KKyAgICA8
c2NyaXB0IHNyYz0iLi4vUXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0i
Li4vQnVpbGRib3RRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9C
dWlsZGJvdEJ1aWxkZXJRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIu
Li9CdWlsZGJvdFRlc3RlclF1ZXVlVmlldy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9
Ii4uL0J1aWxkYm90Q29tYmluZWRRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQg
c3JjPSIuLi9CdWlsZGJvdFBlcmZvcm1hbmNlUXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8
c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RMZWFrc1F1ZXVlVmlldy5qcyI+PC9zY3JpcHQ+CisgICAg
PHNjcmlwdCBzcmM9Ii4uL0J1YmJsZVF1ZXVlVmlldy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlw
dCBzcmM9Ii4uL1N0YXR1c0xpbmVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0i
Li4vU2V0dGluZ3MuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9UcmFjLmpzIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vLi4vRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmpz
Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iTW9ja092ZXJyaWRlcy5qcyI+PC9zY3JpcHQ+
CisgICAgPHNjcmlwdCBzcmM9Ik1vY2tUcmFjLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNy
Yz0iTW9ja0J1aWxkYm90UXVldWUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJNb2Nr
QnVpbGRib3RRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJ0ZXN0cy5q
cyI+PC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxkaXYgaWQ9InF1bml0Ij48L2Rp
dj4KKyAgICA8ZGl2IGlkPSJxdW5pdC1maXh0dXJlIj48L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4K
XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZl
U3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2Ny
aXB0cy90ZXN0cy90ZXN0cy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtp
dC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpz
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjVmZGU0MDA3ZWQyM2I0MTU1NTk1NTkzZmRhM2U1NWY5OWQ3MThmNWYKLS0t
IC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3Jn
LWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5qcwpAQCAt
MCwwICsxLDM3IEBACitRVW5pdC50ZXN0KCJUcmFjIFRlc3QiLCBmdW5jdGlvbiggYXNzZXJ0ICkK
K3sKKyAgICB0ID0gbmV3IE1vY2tUcmFjKCk7CisgICAgYXNzZXJ0LmVxdWFsKHQuX3BhcnNlUmV2
aXNpb25Gcm9tVVJMKCJodHRwczovL3RyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQvMTkwNDk3Iiks
ICIxOTA0OTciLCAidGVzdCBfcGFyc2VSZXZpc2lvbkZyb21VUkwgU1ZOIik7CisgICAgYXNzZXJ0
LmVxdWFsKHQuX3BhcnNlUmV2aXNpb25Gcm9tVVJMKCJodHRwOi8vdHJhYy5mb29iYXIuY29tL3Jl
cG9zaXRvcnkvY2hhbmdlc2V0Lzc1Mzg4L3Byb2plY3QiKSwgIjc1Mzg4IiwgInRlc3QgX3BhcnNl
UmV2aXNpb25Gcm9tVVJMIFNWTiB3aXRoIHN1ZmZpeCIpOworICAgIGFzc2VydC5lcXVhbCh0Ll9w
YXJzZVJldmlzaW9uRnJvbVVSTCgiaHR0cHM6Ly9naXQuZm9vYmFyLmNvbS90cmFjL1doYXRldmVy
LmdpdC9jaGFuZ2VzZXQvMGU0OThkYjVkOGU1YjVhMzQyNjMxIiksICIwZTQ5OGRiNWQ4ZTViNWEz
NDI2MzEiLCAidGVzdCBfcGFyc2VSZXZpc2lvbkZyb21VUkwgR2l0Iik7CisgICAgYXNzZXJ0LmVx
dWFsKHQubmV4dFJldmlzaW9uKCJ0cnVuayIsIDMzMDIwKSwgMzMwMjIsICJ0ZXN0IG5leHRDb21t
aXQiKTsKKyAgICBhc3NlcnQuZXF1YWwodC5jb21wYXJlUmV2aXNpb25zKDMzMDIwLCAzMzAyMiks
IC0yLCAidGVzdCBjb21wYXJlUmV2aXNpb25zIGxlc3MgdGhhbiIpOworICAgIGFzc2VydC5lcXVh
bCh0LmNvbXBhcmVSZXZpc2lvbnMoMzMwMjIsIDMzMDIwKSwgMiwgInRlc3QgY29tcGFyZVJldmlz
aW9ucyBncmVhdGVyIHRoYW4iKTsKKyAgICBhc3NlcnQuZXF1YWwodC5jb21wYXJlUmV2aXNpb25z
KDMzMDIyLCAzMzAyMiksIDAsICJ0ZXN0IGNvbXBhcmVSZXZpc2lvbnMgZXF1YWwiKTsKKyAgICBh
c3NlcnQuZXF1YWwodC5yZWNvcmRlZENvbW1pdHMub2JqZWN0SW5kZXhPZigzMzAyMiwgInJldmlz
aW9uTnVtYmVyIiksIDQsICJvYmplY3RJbmRleE9mIik7Cit9KTsKKwordmFyIHNldHRpbmdzID0g
bmV3IFNldHRpbmdzOworc2V0dGluZ3Muc2V0T2JqZWN0KCJNb2NrIiwgdHJ1ZSk7CitRVW5pdC50
ZXN0KCJCdWlsZEJvdFF1ZXVlIFRlc3QiLCBmdW5jdGlvbiggYXNzZXJ0ICkKK3sKKyAgICB0cmFj
ID0gbmV3IE1vY2tUcmFjKCk7CisgICAgYXNzZXJ0Lm9rKHRyYWMsICJ0cmFjIGlzIG5vdCBudWxs
Iik7CisKKyAgICB2YXIgcXVldWUgPSBuZXcgTW9ja0J1aWxkYm90UXVldWUoKTsKKyAgICBxdWV1
ZS5icmFuY2hlcyA9IFt7CisgICAgICAgIG5hbWU6ICJ0cnVuayIsCisgICAgICAgIHJlcG9zaXRv
cnk6IHsKKyAgICAgICAgICAgIG5hbWU6ICJXZWJraXQgUmVwbyIsCisgICAgICAgICAgICB0cmFj
OiB0cmFjCisgICAgICAgIH0KKyAgICB9XQorICAgIGFzc2VydC5vayhxdWV1ZSwgInF1ZXVlIGlz
IG5vdCBudWxsIik7CisKKyAgICB2YXIgdmlldyA9IG5ldyBNb2NrQnVpbGRib3RRdWV1ZVZpZXco
W3F1ZXVlXSk7CisgICAgYXNzZXJ0Lm9rKHZpZXcsICJ2aWV3IGlzIG5vdCBudWxsIik7CisKKyAg
ICB2aWV3Ll9hcHBlbmRQZW5kaW5nUmV2aXNpb25Db3VudChxdWV1ZSk7CisgICAgdmFyIHJldmlz
aW9uc0JlaGluZCA9IHZpZXcuZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZXNzYWdl
IilbMF0uaW5uZXJIVE1MLm1hdGNoKC8uKihcZCspIHJldmlzaW9uKHxzKSBiZWhpbmQvKVsxXTsK
KyAgICBhc3NlcnQuZXF1YWwocmV2aXNpb25zQmVoaW5kLCAxLCAiYXNzZXJ0IHJldmlzaW9ucyBi
ZWhpbmQiKTsKK30pOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>267593</attachid>
            <date>2015-12-17 16:09:38 -0800</date>
            <delta_ts>2016-01-06 17:15:42 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152345-20151217160900.patch</filename>
            <type>text/plain</type>
            <size>149035</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0MjQzCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggZDc4NzcwNmIwMTFkMmIwYmRkNWQwMTZiY2VkZGM5NmMx
ZWI0MTVhZS4uYzEzZjNjYjNjZTQwMTA4NjE2YzNlNjNjMmJmN2M3MDZmY2FkMzM2ZiAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU4
IEBACisyMDE1LTEyLTE2ICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgorCisg
ICAgICAgIFRlYWNoIGRhc2hib2FyZCBjb2RlIHRvIGNvbXBhcmUgbm9uLWludGVnZXIgcmV2aXNp
b25zLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUy
MzQ1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBC
dWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNo
Ym9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmNzczogQWRkZWQuCisgICAgICAgICogQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L0V4dGVybmFsL3F1bml0LTEuMjAuMC5qczogQWRkZWQuCisgICAgICAgICogQnVpbGRTbGF2ZVN1
cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Njcmlw
dHMvQnVpbGRib3RRdWV1ZS5qczoKKyAgICAgICAgKEJ1aWxkYm90UXVldWUucHJvdG90eXBlLmNv
bXBhcmVJdGVyYXRpb25zKTogQ29tcGFyZSBub24taW50ZWdlciByZXZpc2lvbnMuCisgICAgICAg
IChCdWlsZGJvdFF1ZXVlLnByb3RvdHlwZS5jb21wYXJlSXRlcmF0aW9uc0J5UmV2aXNpb25zKTog
RGl0dG8uCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcuanM6Cisg
ICAgICAgIChCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUuX2FwcGVuZFBlbmRpbmdSZXZpc2lv
bkNvdW50KTogVXNlIFRyYWMuY29tcGFyZVJldmlzaW9ucyBpbiBvcmRlciB0byBjb21wYXJlIG5v
bi1pbnRlZ2VyIHJldmlzaW9ucy4KKyAgICAgICAgV2UgYWxzbyB1c2UgdGhlIGZ1bGwgZm9ybSBv
ZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBBcnJheS5maWx0ZXIoKSBjb21iaW5lZCB3aXRo
IEFycmF5Lm9iamVjdEluZGV4T2YgaW4gb3JkZXIgdG8gY29tcGFyZQorICAgICAgICBhcnJheSBp
bmRpY2VzIGluc3RlYWQgb2YgaW50ZWdlciByZXZpc2lvbiBudW1iZXJzLgorICAgICAgICAoQnVp
bGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLl9wb3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSk6IFVz
ZSBUcmFjLmNvbXBhcmVSZXZpc2lvbnMgaW4gb3JkZXIgdG8gY29tcGFyZSBub24taW50ZWdlciBy
ZXZpc2lvbnMuCisgICAgICAgIFdlIGFsc28gdXNlIHRoZSBmdWxsIGZvcm0gb2YgdGhlIGNhbGxi
YWNrIGZ1bmN0aW9uIHdpdGggQXJyYXkuZmlsdGVyKCkgY29tYmluZWQgd2l0aCBBcnJheS5vYmpl
Y3RJbmRleE9mIGluIG9yZGVyIHRvIGNvbXBhcmUKKyAgICAgICAgYXJyYXkgaW5kaWNlcyBpbnN0
ZWFkIG9mIGludGVnZXIgcmV2aXNpb24gbnVtYmVycy4KKyAgICAgICAgKEJ1aWxkYm90UXVldWVW
aWV3LnByb3RvdHlwZS5fcHJlc2VudFBvcG92ZXJGb3JQZW5kaW5nQ29tbWl0cyk6IFVzZSBUcmFj
Lm5leHRSZXZpc2lvbiBpbnN0ZWFkIG9mIGluY3JlbWVudGluZyBhbgorICAgICAgICBpbnRlZ2Vy
LgorICAgICAgICAoQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLl9yZXZpc2lvbkNvbnRlbnRX
aXRoUG9wb3ZlckZvckl0ZXJhdGlvbik6IERpdHRvLgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBw
b3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRz
L1RyYWMuanM6CisgICAgICAgIChUcmFjLnByb3RvdHlwZS5jb21taXRzT25CcmFuY2gpOiBVc2Ug
dGhlIGZ1bGwgZm9ybSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBBcnJheS5maWx0ZXIo
KSBjb21iaW5lZCB3aXRoCisgICAgICAgIEFycmF5Lm9iamVjdEluZGV4T2YgaW4gb3JkZXIgdG8g
Y29tcGFyZSBhcnJheSBpbmRpY2VzIGluc3RlYWQgb2YgaW50ZWdlciByZXZpc2lvbiBudW1iZXJz
LgorICAgICAgICAoVHJhYy5wcm90b3R5cGUuX3BhcnNlUmV2aXNpb25Gcm9tVVJMKTogQWRkZWQu
IEJyb2tlIHRoaXMgb3V0IGludG8gaXRzIG93biBmdW5jdGlvbiBpbiBvcmRlciB0byB1bml0IHRl
c3QgbW9yZSBlYXNpbHkuCisgICAgICAgIEFsc28gcmVtb3ZlZCB0aGUgY2FsbCB0byBwYXJzZUlu
dCBpbiBhbnRpY2lwYXRpb24gb2Ygbm9uLWludGVnZXIgcmV2aXNpb25zLgorICAgICAgICAoVHJh
Yy5wcm90b3R5cGUuX2xvYWRlZCk6IFNvcnQgYnkgZGF0ZSBhZnRlciBuZXcgY29tbWl0cyBhcmUg
YWRkZWQgc2luY2Ugd2UgY2FuIG5vIGxvbmdlciBzb3J0IGJ5IHJldmlzaW9uIG51bWJlcnMuCisg
ICAgICAgIChUcmFjLnByb3RvdHlwZS5jb21wYXJlUmV2aXNpb25zKTogQWRkZWQuIEdpdmVuIHR3
byByZXZpc2lvbnMgd2UgY29tcGFyZSB0aGVpciBpbmRpY2VzIHdpdGhpbiB0aGUgInJlY29yZGVk
Q29tbWl0cyIgYXJyYXkuCisgICAgICAgIElmIGVpdGhlciByZXZpc2lvbiBpcyBub3QgZm91bmQg
aW4gdGhlICJyZWNvcmRlZENvbW1pdHMiIGFycmF5LCB3ZSByZXR1cm4gdW5kZWZpbmVkIGFuZCBs
b2FkIG1vcmUgaGlzdG9yaWNhbCBkYXRhLgorICAgICAgICAoVHJhYy5wcm90b3R5cGUubmV4dFJl
dmlzaW9uKTogQWRkZWQuIEdpdmVuIGEgYnJhbmNoIGFuZCByZXZpc2lvbiwgd2UgZmluZCB0aGUg
bmV4dCByZXZpc2lvbiBjaHJvbm9sb2dpY2FsbHkuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBv
cnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMv
VXRpbGl0aWVzLmpzOgorICAgICAgICAoQXJyYXkucHJvdG90eXBlLm9iamVjdEluZGV4T2YpOiBB
ZGRlZC4gRmluZHMgYW4gb2JqZWN0LCBpbiBhbiBhcnJheSBvZiBvYmplY3RzLCB3aGVyZSB0aGUg
c2VhcmNoIHRlcm0gbWF0Y2hlcyB0aGUgZ2l2ZW4KKyAgICAgICAgcHJvcGVydHkuCisgICAgICAg
ICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwv
ZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWUuanM6IEFkZGVkLgorICAg
ICAgICAoTW9ja0J1aWxkYm90UXVldWUpOiBBZGRlZC4gTW9jayBCdWlsZGJvdFF1ZXVlIG9iamVj
dCB0aGF0IGRvZXNuJ3QgbmVlZCB0byB0YWxrIHRvIGFuIGFjdHVhbCBCdWlsZGJvdCBzZXJ2ZXIu
CisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVi
bGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWVWaWV3Lmpz
OiBBZGRlZC4KKyAgICAgICAgKE1vY2tCdWlsZGJvdFF1ZXVlVmlldyk6IEFkZGVkLiBNb2NrIEJ1
aWxkYm90UXVldWVWaWV3IG9iamVjdCB0aGF0IHJldHVybnMgYSBwcmUtc3BlY2lmaWVkIF9sYXRl
c3RQcm9kdWN0aXZlSXRlcmF0aW9uIHdpdGhvdXQKKyAgICAgICAgdGhlIG5lZWQgdG8gdGFsayB0
byBhIHJlYWwgQnVpbGRib3Qgc2VydmVyLgorICAgICAgICAoTW9ja0J1aWxkYm90UXVldWVWaWV3
LnByb3RvdHlwZS5fbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbik6IEFkZGVkLiBSZXR1cm5zIGEg
cHJlLXNwZWNpZmllZCBfbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbgorICAgICAgICB3aXRob3V0
IHRoZSBuZWVkIHRvIHRhbGsgdG8gYSByZWFsIEJ1aWxkYm90IHNlcnZlci4KKyAgICAgICAgKiBC
dWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNo
Ym9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrT3ZlcnJpZGVzLmpzOiBBZGRlZC4KKyAgICAgICAgKHNl
dCBsYWJlbCk6IEFkZGVkLiBUaGUgcmVhbCAibGFiZWwiIHNldHRlciB3YXMgdGhyb3dpbmcgYW4g
ZXhjZXB0aW9uIGluIHRoZSB1bml0IHRlc3RzIHNvIEkgb3ZlcnJvZGUgaXQgd2l0aCBhIHNpbXBs
aWZpZWQKKyAgICAgICAgdmVyc2lvbi4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWls
ZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9N
b2NrVHJhYy5qczogQWRkZWQuCisgICAgICAgIChNb2NrVHJhYyk6IEFkZGVkLiBNb2NrIFRyYWMg
Y29uc3RydWN0b3IgdGhhdCBoYXMgcHJlLXBvcHVsYXRlZCAicmVjb3JkZWRDb21taXRzIiBhbmQg
ZG9lcyBub3QgbmVlZCB0byB0YWxrIHRvIGEgcmVhbCBUcmFjCisgICAgICAgIHNlcnZlci4KKyAg
ICAgICAgKE1vY2tUcmFjLnByb3RvdHlwZS5nZXQgb2xkZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJl
cik6IEFkZGVkLiBSZXR1cm5zIGEgcHJlLXNwZWNpZmllZCByZXZpc2lvbi4KKyAgICAgICAgKE1v
Y2tUcmFjLnByb3RvdHlwZS5nZXQgbGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlcik6IERpdHRv
LgorICAgICAgICAoTW9ja1RyYWMucHJvdG90eXBlLmxvYWRNb3JlSGlzdG9yaWNhbERhdGEpOiBB
ZGRlZC4gT3ZlcnJpZGVzIHRoZSByZWFsIGxvYWRNb3JlSGlzdG9yaWNhbERhdGEgc28gdGhhdCB3
ZSBkb24ndCB3YXN0ZSB0aW1lCisgICAgICAgIHRyeWluZyB0byB0YWxrIHRvIFRyYWMuCisgICAg
ICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0
bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvaW5kZXguaHRtbDogQWRkZWQuIFdlYiBwYWdlIGNv
bnRhaW5lciBmb3IKKyAgICAgICAgUVVuaXQgdW5pdCB0ZXN0cy4KKyAgICAgICAgKiBCdWlsZFNs
YXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQv
U2NyaXB0cy90ZXN0cy90ZXN0cy5qczogQWRkZWQuIFFVbml0IHVuaXQgdGVzdHMuCisKIDIwMTUt
MTItMTcgIEFha2FzaCBKYWluICA8YWFrYXNoX2phaW5AYXBwbGUuY29tPgogCiAgICAgICAgIHJ1
bi13ZWJraXQtdGVzdHMgc2hvdWxkbid0IHN0YXJ0IG11bHRpcGxlIGlPUyBzaW11bGF0b3JzIHdo
aWxlIG9ubHkgcnVubmluZyBvbmUgdGVzdApkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1
cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVy
bmFsL3F1bml0LTEuMjAuMC5jc3MgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJr
aXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4w
LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi5hNTllMjgyNGNlMzE2M2NhZGM3MDU5ZTAxYWNlMDVlZDYyNjM3ODhk
Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0
Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0LTEuMjAuMC5j
c3MKQEAgLTAsMCArMSwzMDEgQEAKKy8qIQorICogUVVuaXQgMS4yMC4wCisgKiBodHRwOi8vcXVu
aXRqcy5jb20vCisgKgorICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBj
b250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQorICogaHR0cDov
L2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIERhdGU6IDIwMTUtMTAtMjdUMTc6NTNaCisgKi8K
KworLyoqIEZvbnQgRmFtaWx5IGFuZCBTaXplcyAqLworCisjcXVuaXQtdGVzdHMsICNxdW5pdC1o
ZWFkZXIsICNxdW5pdC1iYW5uZXIsICNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIsICNxdW5pdC1m
aWx0ZXJlZFRlc3QsICNxdW5pdC11c2VyQWdlbnQsICNxdW5pdC10ZXN0cmVzdWx0IHsKKwlmb250
LWZhbWlseTogIkhlbHZldGljYSBOZXVlIExpZ2h0IiwgIkhlbHZldGljYU5ldWUtTGlnaHQiLCAi
SGVsdmV0aWNhIE5ldWUiLCBDYWxpYnJpLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwor
fQorCisjcXVuaXQtdGVzdHJ1bm5lci10b29sYmFyLCAjcXVuaXQtZmlsdGVyZWRUZXN0LCAjcXVu
aXQtdXNlckFnZW50LCAjcXVuaXQtdGVzdHJlc3VsdCwgI3F1bml0LXRlc3RzIGxpIHsgZm9udC1z
aXplOiBzbWFsbDsgfQorI3F1bml0LXRlc3RzIHsgZm9udC1zaXplOiBzbWFsbGVyOyB9CisKKwor
LyoqIFJlc2V0cyAqLworCisjcXVuaXQtdGVzdHMsICNxdW5pdC1oZWFkZXIsICNxdW5pdC1iYW5u
ZXIsICNxdW5pdC1maWx0ZXJlZFRlc3QsICNxdW5pdC11c2VyQWdlbnQsICNxdW5pdC10ZXN0cmVz
dWx0LCAjcXVuaXQtbW9kdWxlZmlsdGVyIHsKKwltYXJnaW46IDA7CisJcGFkZGluZzogMDsKK30K
KworCisvKiogSGVhZGVyICovCisKKyNxdW5pdC1oZWFkZXIgeworCXBhZGRpbmc6IDAuNWVtIDAg
MC41ZW0gMWVtOworCisJY29sb3I6ICM4Njk5QTQ7CisJYmFja2dyb3VuZC1jb2xvcjogIzBEMzM0
OTsKKworCWZvbnQtc2l6ZTogMS41ZW07CisJbGluZS1oZWlnaHQ6IDFlbTsKKwlmb250LXdlaWdo
dDogNDAwOworCisJYm9yZGVyLXJhZGl1czogNXB4IDVweCAwIDA7Cit9CisKKyNxdW5pdC1oZWFk
ZXIgYSB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCWNvbG9yOiAjQzJDQ0QxOworfQorCisj
cXVuaXQtaGVhZGVyIGE6aG92ZXIsCisjcXVuaXQtaGVhZGVyIGE6Zm9jdXMgeworCWNvbG9yOiAj
RkZGOworfQorCisjcXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIGxhYmVsIHsKKwlkaXNwbGF5OiBp
bmxpbmUtYmxvY2s7CisJcGFkZGluZzogMCAwLjVlbSAwIDAuMWVtOworfQorCisjcXVuaXQtYmFu
bmVyIHsKKwloZWlnaHQ6IDVweDsKK30KKworI3F1bml0LXRlc3RydW5uZXItdG9vbGJhciB7CisJ
cGFkZGluZzogMC41ZW0gMWVtIDAuNWVtIDFlbTsKKwljb2xvcjogIzVFNzQwQjsKKwliYWNrZ3Jv
dW5kLWNvbG9yOiAjRUVFOworCW92ZXJmbG93OiBoaWRkZW47Cit9CisKKyNxdW5pdC1maWx0ZXJl
ZFRlc3QgeworCXBhZGRpbmc6IDAuNWVtIDFlbSAwLjVlbSAxZW07CisJYmFja2dyb3VuZC1jb2xv
cjogI0Y0RkY3NzsKKwljb2xvcjogIzM2NjA5NzsKK30KKworI3F1bml0LXVzZXJBZ2VudCB7CisJ
cGFkZGluZzogMC41ZW0gMWVtIDAuNWVtIDFlbTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjMkI4MUFG
OworCWNvbG9yOiAjRkZGOworCXRleHQtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuNSkgMnB4IDJw
eCAxcHg7Cit9CisKKyNxdW5pdC1tb2R1bGVmaWx0ZXItY29udGFpbmVyIHsKKwlmbG9hdDogcmln
aHQ7CisJcGFkZGluZzogMC4yZW07Cit9CisKKy5xdW5pdC11cmwtY29uZmlnIHsKKwlkaXNwbGF5
OiBpbmxpbmUtYmxvY2s7CisJcGFkZGluZzogMC4xZW07Cit9CisKKy5xdW5pdC1maWx0ZXIgewor
CWRpc3BsYXk6IGJsb2NrOworCWZsb2F0OiByaWdodDsKKwltYXJnaW4tbGVmdDogMWVtOworfQor
CisvKiogVGVzdHM6IFBhc3MvRmFpbCAqLworCisjcXVuaXQtdGVzdHMgeworCWxpc3Qtc3R5bGUt
cG9zaXRpb246IGluc2lkZTsKK30KKworI3F1bml0LXRlc3RzIGxpIHsKKwlwYWRkaW5nOiAwLjRl
bSAxZW0gMC40ZW0gMWVtOworCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGOworCWxpc3Qt
c3R5bGUtcG9zaXRpb246IGluc2lkZTsKK30KKworI3F1bml0LXRlc3RzID4gbGkgeworCWRpc3Bs
YXk6IG5vbmU7Cit9CisKKyNxdW5pdC10ZXN0cyBsaS5ydW5uaW5nLAorI3F1bml0LXRlc3RzIGxp
LnBhc3MsCisjcXVuaXQtdGVzdHMgbGkuZmFpbCwKKyNxdW5pdC10ZXN0cyBsaS5za2lwcGVkIHsK
KwlkaXNwbGF5OiBsaXN0LWl0ZW07Cit9CisKKyNxdW5pdC10ZXN0cy5oaWRlcGFzcyBsaS5ydW5u
aW5nLAorI3F1bml0LXRlc3RzLmhpZGVwYXNzIGxpLnBhc3MgeworCXZpc2liaWxpdHk6IGhpZGRl
bjsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJd2lkdGg6ICAgMDsKKwloZWlnaHQ6ICAwOworCXBh
ZGRpbmc6IDA7CisJYm9yZGVyOiAgMDsKKwltYXJnaW46ICAwOworfQorCisjcXVuaXQtdGVzdHMg
bGkgc3Ryb25nIHsKKwljdXJzb3I6IHBvaW50ZXI7Cit9CisKKyNxdW5pdC10ZXN0cyBsaS5za2lw
cGVkIHN0cm9uZyB7CisJY3Vyc29yOiBkZWZhdWx0OworfQorCisjcXVuaXQtdGVzdHMgbGkgYSB7
CisJcGFkZGluZzogMC41ZW07CisJY29sb3I6ICNDMkNDRDE7CisJdGV4dC1kZWNvcmF0aW9uOiBu
b25lOworfQorCisjcXVuaXQtdGVzdHMgbGkgcCBhIHsKKwlwYWRkaW5nOiAwLjI1ZW07CisJY29s
b3I6ICM2QjY0NjQ7Cit9CisjcXVuaXQtdGVzdHMgbGkgYTpob3ZlciwKKyNxdW5pdC10ZXN0cyBs
aSBhOmZvY3VzIHsKKwljb2xvcjogIzAwMDsKK30KKworI3F1bml0LXRlc3RzIGxpIC5ydW50aW1l
IHsKKwlmbG9hdDogcmlnaHQ7CisJZm9udC1zaXplOiBzbWFsbGVyOworfQorCisucXVuaXQtYXNz
ZXJ0LWxpc3QgeworCW1hcmdpbi10b3A6IDAuNWVtOworCXBhZGRpbmc6IDAuNWVtOworCisJYmFj
a2dyb3VuZC1jb2xvcjogI0ZGRjsKKworCWJvcmRlci1yYWRpdXM6IDVweDsKK30KKworLnF1bml0
LXNvdXJjZSB7CisJbWFyZ2luOiAwLjZlbSAwIDAuM2VtOworfQorCisucXVuaXQtY29sbGFwc2Vk
IHsKKwlkaXNwbGF5OiBub25lOworfQorCisjcXVuaXQtdGVzdHMgdGFibGUgeworCWJvcmRlci1j
b2xsYXBzZTogY29sbGFwc2U7CisJbWFyZ2luLXRvcDogMC4yZW07Cit9CisKKyNxdW5pdC10ZXN0
cyB0aCB7CisJdGV4dC1hbGlnbjogcmlnaHQ7CisJdmVydGljYWwtYWxpZ246IHRvcDsKKwlwYWRk
aW5nOiAwIDAuNWVtIDAgMDsKK30KKworI3F1bml0LXRlc3RzIHRkIHsKKwl2ZXJ0aWNhbC1hbGln
bjogdG9wOworfQorCisjcXVuaXQtdGVzdHMgcHJlIHsKKwltYXJnaW46IDA7CisJd2hpdGUtc3Bh
Y2U6IHByZS13cmFwOworCXdvcmQtd3JhcDogYnJlYWstd29yZDsKK30KKworI3F1bml0LXRlc3Rz
IGRlbCB7CisJYmFja2dyb3VuZC1jb2xvcjogI0UwRjJCRTsKKwljb2xvcjogIzM3NEUwQzsKKwl0
ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKyNxdW5pdC10ZXN0cyBpbnMgeworCWJhY2tncm91
bmQtY29sb3I6ICNGRkNBQ0E7CisJY29sb3I6ICM1MDA7CisJdGV4dC1kZWNvcmF0aW9uOiBub25l
OworfQorCisvKioqIFRlc3QgQ291bnRzICovCisKKyNxdW5pdC10ZXN0cyBiLmNvdW50cyAgICAg
ICAgICAgICAgICAgICAgICAgeyBjb2xvcjogIzAwMDsgfQorI3F1bml0LXRlc3RzIGIucGFzc2Vk
ICAgICAgICAgICAgICAgICAgICAgICB7IGNvbG9yOiAjNUU3NDBCOyB9CisjcXVuaXQtdGVzdHMg
Yi5mYWlsZWQgICAgICAgICAgICAgICAgICAgICAgIHsgY29sb3I6ICM3MTA5MDk7IH0KKworI3F1
bml0LXRlc3RzIGxpIGxpIHsKKwlwYWRkaW5nOiA1cHg7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZG
RjsKKwlib3JkZXItYm90dG9tOiBub25lOworCWxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsK
K30KKworLyoqKiBQYXNzaW5nIFN0eWxlcyAqLworCisjcXVuaXQtdGVzdHMgbGkgbGkucGFzcyB7
CisJY29sb3I6ICMzQzUxMEM7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKKwlib3JkZXItbGVm
dDogMTBweCBzb2xpZCAjQzZFNzQ2OworfQorCisjcXVuaXQtdGVzdHMgLnBhc3MgICAgICAgICAg
ICAgICAgICAgICAgICAgIHsgY29sb3I6ICM1MjhDRTA7IGJhY2tncm91bmQtY29sb3I6ICNEMkUw
RTY7IH0KKyNxdW5pdC10ZXN0cyAucGFzcyAudGVzdC1uYW1lICAgICAgICAgICAgICAgeyBjb2xv
cjogIzM2NjA5NzsgfQorCisjcXVuaXQtdGVzdHMgLnBhc3MgLnRlc3QtYWN0dWFsLAorI3F1bml0
LXRlc3RzIC5wYXNzIC50ZXN0LWV4cGVjdGVkICAgICAgICAgICB7IGNvbG9yOiAjOTk5OyB9CisK
KyNxdW5pdC1iYW5uZXIucXVuaXQtcGFzcyAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5k
LWNvbG9yOiAjQzZFNzQ2OyB9CisKKy8qKiogRmFpbGluZyBTdHlsZXMgKi8KKworI3F1bml0LXRl
c3RzIGxpIGxpLmZhaWwgeworCWNvbG9yOiAjNzEwOTA5OworCWJhY2tncm91bmQtY29sb3I6ICNG
RkY7CisJYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgI0VFNTc1NzsKKwl3aGl0ZS1zcGFjZTogcHJl
OworfQorCisjcXVuaXQtdGVzdHMgPiBsaTpsYXN0LWNoaWxkIHsKKwlib3JkZXItcmFkaXVzOiAw
IDAgNXB4IDVweDsKK30KKworI3F1bml0LXRlc3RzIC5mYWlsICAgICAgICAgICAgICAgICAgICAg
ICAgICB7IGNvbG9yOiAjMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjRUU1NzU3OyB9CisjcXVuaXQt
dGVzdHMgLmZhaWwgLnRlc3QtbmFtZSwKKyNxdW5pdC10ZXN0cyAuZmFpbCAubW9kdWxlLW5hbWUg
ICAgICAgICAgICAgeyBjb2xvcjogIzAwMDsgfQorCisjcXVuaXQtdGVzdHMgLmZhaWwgLnRlc3Qt
YWN0dWFsICAgICAgICAgICAgIHsgY29sb3I6ICNFRTU3NTc7IH0KKyNxdW5pdC10ZXN0cyAuZmFp
bCAudGVzdC1leHBlY3RlZCAgICAgICAgICAgeyBjb2xvcjogIzAwODAwMDsgfQorCisjcXVuaXQt
YmFubmVyLnF1bml0LWZhaWwgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1jb2xvcjog
I0VFNTc1NzsgfQorCisvKioqIFNraXBwZWQgdGVzdHMgKi8KKworI3F1bml0LXRlc3RzIC5za2lw
cGVkIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRUJFQ0U5OworfQorCisjcXVuaXQtdGVzdHMgLnF1
bml0LXNraXBwZWQtbGFiZWwgeworCWJhY2tncm91bmQtY29sb3I6ICNGNEZGNzc7CisJZGlzcGxh
eTogaW5saW5lLWJsb2NrOworCWZvbnQtc3R5bGU6IG5vcm1hbDsKKwljb2xvcjogIzM2NjA5NzsK
KwlsaW5lLWhlaWdodDogMS44ZW07CisJcGFkZGluZzogMCAwLjVlbTsKKwltYXJnaW46IC0wLjRl
bSAwLjRlbSAtMC40ZW0gMDsKK30KKworLyoqIFJlc3VsdCAqLworCisjcXVuaXQtdGVzdHJlc3Vs
dCB7CisJcGFkZGluZzogMC41ZW0gMWVtIDAuNWVtIDFlbTsKKworCWNvbG9yOiAjMkI4MUFGOwor
CWJhY2tncm91bmQtY29sb3I6ICNEMkUwRTY7CisKKwlib3JkZXItYm90dG9tOiAxcHggc29saWQg
I0ZGRjsKK30KKyNxdW5pdC10ZXN0cmVzdWx0IC5tb2R1bGUtbmFtZSB7CisJZm9udC13ZWlnaHQ6
IDcwMDsKK30KKworLyoqIEZpeHR1cmUgKi8KKworI3F1bml0LWZpeHR1cmUgeworCXBvc2l0aW9u
OiBhYnNvbHV0ZTsKKwl0b3A6IC0xMDAwMHB4OworCWxlZnQ6IC0xMDAwMHB4OworCXdpZHRoOiAx
MDAwcHg7CisJaGVpZ2h0OiAxMDAwcHg7Cit9CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZl
U3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0
ZXJuYWwvcXVuaXQtMS4yMC4wLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Vi
a2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0LTEuMjAu
MC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi45MDQ5NDNmMDg4ZWRmZDNlY2IwZTdjZjJjYzcwYmM0YTU4NzZjM2Rh
Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0
Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0LTEuMjAuMC5q
cwpAQCAtMCwwICsxLDQxNTggQEAKKy8qIQorICogUVVuaXQgMS4yMC4wCisgKiBodHRwOi8vcXVu
aXRqcy5jb20vCisgKgorICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBj
b250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQorICogaHR0cDov
L2pxdWVyeS5vcmcvbGljZW5zZQorICoKKyAqIERhdGU6IDIwMTUtMTAtMjdUMTc6NTNaCisgKi8K
KworKGZ1bmN0aW9uKCBnbG9iYWwgKSB7CisKK3ZhciBRVW5pdCA9IHt9OworCit2YXIgRGF0ZSA9
IGdsb2JhbC5EYXRlOwordmFyIG5vdyA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCkgeworCXJldHVy
biBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKK307CisKK3ZhciBzZXRUaW1lb3V0ID0gZ2xvYmFsLnNl
dFRpbWVvdXQ7Cit2YXIgY2xlYXJUaW1lb3V0ID0gZ2xvYmFsLmNsZWFyVGltZW91dDsKKworLy8g
U3RvcmUgYSBsb2NhbCB3aW5kb3cgZnJvbSB0aGUgZ2xvYmFsIHRvIGFsbG93IGRpcmVjdCByZWZl
cmVuY2VzLgordmFyIHdpbmRvdyA9IGdsb2JhbC53aW5kb3c7CisKK3ZhciBkZWZpbmVkID0gewor
CWRvY3VtZW50OiB3aW5kb3cgJiYgd2luZG93LmRvY3VtZW50ICE9PSB1bmRlZmluZWQsCisJc2V0
VGltZW91dDogc2V0VGltZW91dCAhPT0gdW5kZWZpbmVkLAorCXNlc3Npb25TdG9yYWdlOiAoZnVu
Y3Rpb24oKSB7CisJCXZhciB4ID0gInF1bml0LXRlc3Qtc3RyaW5nIjsKKwkJdHJ5IHsKKwkJCXNl
c3Npb25TdG9yYWdlLnNldEl0ZW0oIHgsIHggKTsKKwkJCXNlc3Npb25TdG9yYWdlLnJlbW92ZUl0
ZW0oIHggKTsKKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoICggZSApIHsKKwkJCXJldHVybiBm
YWxzZTsKKwkJfQorCX0oKSApCit9OworCit2YXIgZmlsZU5hbWUgPSAoIHNvdXJjZUZyb21TdGFj
a3RyYWNlKCAwICkgfHwgIiIgKS5yZXBsYWNlKCAvKDpcZCspK1wpPy8sICIiICkucmVwbGFjZSgg
Ly4rXC8vLCAiIiApOwordmFyIGdsb2JhbFN0YXJ0Q2FsbGVkID0gZmFsc2U7Cit2YXIgcnVuU3Rh
cnRlZCA9IGZhbHNlOworCit2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5n
LAorCWhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CisKKy8vIHJldHVy
bnMgYSBuZXcgQXJyYXkgd2l0aCB0aGUgZWxlbWVudHMgdGhhdCBhcmUgaW4gYSBidXQgbm90IGlu
IGIKK2Z1bmN0aW9uIGRpZmYoIGEsIGIgKSB7CisJdmFyIGksIGosCisJCXJlc3VsdCA9IGEuc2xp
Y2UoKTsKKworCWZvciAoIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrICkgeworCQlmb3Ig
KCBqID0gMDsgaiA8IGIubGVuZ3RoOyBqKysgKSB7CisJCQlpZiAoIHJlc3VsdFsgaSBdID09PSBi
WyBqIF0gKSB7CisJCQkJcmVzdWx0LnNwbGljZSggaSwgMSApOworCQkJCWktLTsKKwkJCQlicmVh
azsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvLyBmcm9tIGpxdWVyeS5q
cworZnVuY3Rpb24gaW5BcnJheSggZWxlbSwgYXJyYXkgKSB7CisJaWYgKCBhcnJheS5pbmRleE9m
ICkgeworCQlyZXR1cm4gYXJyYXkuaW5kZXhPZiggZWxlbSApOworCX0KKworCWZvciAoIHZhciBp
ID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCWlmICgg
YXJyYXlbIGkgXSA9PT0gZWxlbSApIHsKKwkJCXJldHVybiBpOworCQl9CisJfQorCisJcmV0dXJu
IC0xOworfQorCisvKioKKyAqIE1ha2VzIGEgY2xvbmUgb2YgYW4gb2JqZWN0IHVzaW5nIG9ubHkg
QXJyYXkgb3IgT2JqZWN0IGFzIGJhc2UsCisgKiBhbmQgY29waWVzIG92ZXIgdGhlIG93biBlbnVt
ZXJhYmxlIHByb3BlcnRpZXMuCisgKgorICogQHBhcmFtIHtPYmplY3R9IG9iagorICogQHJldHVy
biB7T2JqZWN0fSBOZXcgb2JqZWN0IHdpdGggb25seSB0aGUgb3duIHByb3BlcnRpZXMgKHJlY3Vy
c2l2ZWx5KS4KKyAqLworZnVuY3Rpb24gb2JqZWN0VmFsdWVzICggb2JqICkgeworCXZhciBrZXks
IHZhbCwKKwkJdmFscyA9IFFVbml0LmlzKCAiYXJyYXkiLCBvYmogKSA/IFtdIDoge307CisJZm9y
ICgga2V5IGluIG9iaiApIHsKKwkJaWYgKCBoYXNPd24uY2FsbCggb2JqLCBrZXkgKSApIHsKKwkJ
CXZhbCA9IG9ialsga2V5IF07CisJCQl2YWxzWyBrZXkgXSA9IHZhbCA9PT0gT2JqZWN0KCB2YWwg
KSA/IG9iamVjdFZhbHVlcyggdmFsICkgOiB2YWw7CisJCX0KKwl9CisJcmV0dXJuIHZhbHM7Cit9
CisKK2Z1bmN0aW9uIGV4dGVuZCggYSwgYiwgdW5kZWZPbmx5ICkgeworCWZvciAoIHZhciBwcm9w
IGluIGIgKSB7CisJCWlmICggaGFzT3duLmNhbGwoIGIsIHByb3AgKSApIHsKKworCQkJLy8gQXZv
aWQgIk1lbWJlciBub3QgZm91bmQiIGVycm9yIGluIElFOCBjYXVzZWQgYnkgbWVzc2luZyB3aXRo
IHdpbmRvdy5jb25zdHJ1Y3RvcgorCQkJLy8gVGhpcyBibG9jayBydW5zIG9uIGV2ZXJ5IGVudmly
b25tZW50LCBzbyBgZ2xvYmFsYCBpcyBiZWluZyB1c2VkIGluc3RlYWQgb2YgYHdpbmRvd2AKKwkJ
CS8vIHRvIGF2b2lkIGVycm9ycyBvbiBub2RlLgorCQkJaWYgKCBwcm9wICE9PSAiY29uc3RydWN0
b3IiIHx8IGEgIT09IGdsb2JhbCApIHsKKwkJCQlpZiAoIGJbIHByb3AgXSA9PT0gdW5kZWZpbmVk
ICkgeworCQkJCQlkZWxldGUgYVsgcHJvcCBdOworCQkJCX0gZWxzZSBpZiAoICEoIHVuZGVmT25s
eSAmJiB0eXBlb2YgYVsgcHJvcCBdICE9PSAidW5kZWZpbmVkIiApICkgeworCQkJCQlhWyBwcm9w
IF0gPSBiWyBwcm9wIF07CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGE7Cit9CisK
K2Z1bmN0aW9uIG9iamVjdFR5cGUoIG9iaiApIHsKKwlpZiAoIHR5cGVvZiBvYmogPT09ICJ1bmRl
ZmluZWQiICkgeworCQlyZXR1cm4gInVuZGVmaW5lZCI7CisJfQorCisJLy8gQ29uc2lkZXI6IHR5
cGVvZiBudWxsID09PSBvYmplY3QKKwlpZiAoIG9iaiA9PT0gbnVsbCApIHsKKwkJcmV0dXJuICJu
dWxsIjsKKwl9CisKKwl2YXIgbWF0Y2ggPSB0b1N0cmluZy5jYWxsKCBvYmogKS5tYXRjaCggL15c
W29iamVjdFxzKC4qKVxdJC8gKSwKKwkJdHlwZSA9IG1hdGNoICYmIG1hdGNoWyAxIF07CisKKwlz
d2l0Y2ggKCB0eXBlICkgeworCQljYXNlICJOdW1iZXIiOgorCQkJaWYgKCBpc05hTiggb2JqICkg
KSB7CisJCQkJcmV0dXJuICJuYW4iOworCQkJfQorCQkJcmV0dXJuICJudW1iZXIiOworCQljYXNl
ICJTdHJpbmciOgorCQljYXNlICJCb29sZWFuIjoKKwkJY2FzZSAiQXJyYXkiOgorCQljYXNlICJT
ZXQiOgorCQljYXNlICJNYXAiOgorCQljYXNlICJEYXRlIjoKKwkJY2FzZSAiUmVnRXhwIjoKKwkJ
Y2FzZSAiRnVuY3Rpb24iOgorCQljYXNlICJTeW1ib2wiOgorCQkJcmV0dXJuIHR5cGUudG9Mb3dl
ckNhc2UoKTsKKwl9CisJaWYgKCB0eXBlb2Ygb2JqID09PSAib2JqZWN0IiApIHsKKwkJcmV0dXJu
ICJvYmplY3QiOworCX0KK30KKworLy8gU2FmZSBvYmplY3QgdHlwZSBjaGVja2luZworZnVuY3Rp
b24gaXMoIHR5cGUsIG9iaiApIHsKKwlyZXR1cm4gUVVuaXQub2JqZWN0VHlwZSggb2JqICkgPT09
IHR5cGU7Cit9CisKK3ZhciBnZXRVcmxQYXJhbXMgPSBmdW5jdGlvbigpIHsKKwl2YXIgaSwgY3Vy
cmVudDsKKwl2YXIgdXJsUGFyYW1zID0ge307CisJdmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0
aW9uOworCXZhciBwYXJhbXMgPSBsb2NhdGlvbi5zZWFyY2guc2xpY2UoIDEgKS5zcGxpdCggIiYi
ICk7CisJdmFyIGxlbmd0aCA9IHBhcmFtcy5sZW5ndGg7CisKKwlpZiAoIHBhcmFtc1sgMCBdICkg
eworCQlmb3IgKCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJY3VycmVudCA9IHBhcmFt
c1sgaSBdLnNwbGl0KCAiPSIgKTsKKwkJCWN1cnJlbnRbIDAgXSA9IGRlY29kZVVSSUNvbXBvbmVu
dCggY3VycmVudFsgMCBdICk7CisKKwkJCS8vIGFsbG93IGp1c3QgYSBrZXkgdG8gdHVybiBvbiBh
IGZsYWcsIGUuZy4sIHRlc3QuaHRtbD9ub2dsb2JhbHMKKwkJCWN1cnJlbnRbIDEgXSA9IGN1cnJl
bnRbIDEgXSA/IGRlY29kZVVSSUNvbXBvbmVudCggY3VycmVudFsgMSBdICkgOiB0cnVlOworCQkJ
aWYgKCB1cmxQYXJhbXNbIGN1cnJlbnRbIDAgXSBdICkgeworCQkJCXVybFBhcmFtc1sgY3VycmVu
dFsgMCBdIF0gPSBbXS5jb25jYXQoIHVybFBhcmFtc1sgY3VycmVudFsgMCBdIF0sIGN1cnJlbnRb
IDEgXSApOworCQkJfSBlbHNlIHsKKwkJCQl1cmxQYXJhbXNbIGN1cnJlbnRbIDAgXSBdID0gY3Vy
cmVudFsgMSBdOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHVybFBhcmFtczsKK307CisKKy8v
IERvZXNuJ3Qgc3VwcG9ydCBJRTYgdG8gSUU5LCBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQgb24g
dGhlc2UgYnJvd3NlcnMKKy8vIFNlZSBhbHNvIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3Jn
L2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yL1N0YWNrCitmdW5j
dGlvbiBleHRyYWN0U3RhY2t0cmFjZSggZSwgb2Zmc2V0ICkgeworCW9mZnNldCA9IG9mZnNldCA9
PT0gdW5kZWZpbmVkID8gNCA6IG9mZnNldDsKKworCXZhciBzdGFjaywgaW5jbHVkZSwgaTsKKwor
CWlmICggZS5zdGFjayApIHsKKwkJc3RhY2sgPSBlLnN0YWNrLnNwbGl0KCAiXG4iICk7CisJCWlm
ICggL15lcnJvciQvaS50ZXN0KCBzdGFja1sgMCBdICkgKSB7CisJCQlzdGFjay5zaGlmdCgpOwor
CQl9CisJCWlmICggZmlsZU5hbWUgKSB7CisJCQlpbmNsdWRlID0gW107CisJCQlmb3IgKCBpID0g
b2Zmc2V0OyBpIDwgc3RhY2subGVuZ3RoOyBpKysgKSB7CisJCQkJaWYgKCBzdGFja1sgaSBdLmlu
ZGV4T2YoIGZpbGVOYW1lICkgIT09IC0xICkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaW5j
bHVkZS5wdXNoKCBzdGFja1sgaSBdICk7CisJCQl9CisJCQlpZiAoIGluY2x1ZGUubGVuZ3RoICkg
eworCQkJCXJldHVybiBpbmNsdWRlLmpvaW4oICJcbiIgKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4g
c3RhY2tbIG9mZnNldCBdOworCisJLy8gU3VwcG9ydDogU2FmYXJpIDw9NiBvbmx5CisJfSBlbHNl
IGlmICggZS5zb3VyY2VVUkwgKSB7CisKKwkJLy8gZXhjbHVkZSB1c2VsZXNzIHNlbGYtcmVmZXJl
bmNlIGZvciBnZW5lcmF0ZWQgRXJyb3Igb2JqZWN0cworCQlpZiAoIC9xdW5pdC5qcyQvLnRlc3Qo
IGUuc291cmNlVVJMICkgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBmb3IgYWN0dWFsIGV4
Y2VwdGlvbnMsIHRoaXMgaXMgdXNlZnVsCisJCXJldHVybiBlLnNvdXJjZVVSTCArICI6IiArIGUu
bGluZTsKKwl9Cit9CisKK2Z1bmN0aW9uIHNvdXJjZUZyb21TdGFja3RyYWNlKCBvZmZzZXQgKSB7
CisJdmFyIGVycm9yID0gbmV3IEVycm9yKCk7CisKKwkvLyBTdXBwb3J0OiBTYWZhcmkgPD03IG9u
bHksIElFIDw9MTAgLSAxMSBvbmx5CisJLy8gTm90IGFsbCBicm93c2VycyBnZW5lcmF0ZSB0aGUg
YHN0YWNrYCBwcm9wZXJ0eSBmb3IgYG5ldyBFcnJvcigpYCwgc2VlIGFsc28gIzYzNgorCWlmICgg
IWVycm9yLnN0YWNrICkgeworCQl0cnkgeworCQkJdGhyb3cgZXJyb3I7CisJCX0gY2F0Y2ggKCBl
cnIgKSB7CisJCQllcnJvciA9IGVycjsKKwkJfQorCX0KKworCXJldHVybiBleHRyYWN0U3RhY2t0
cmFjZSggZXJyb3IsIG9mZnNldCApOworfQorCisvKioKKyAqIENvbmZpZyBvYmplY3Q6IE1haW50
YWluIGludGVybmFsIHN0YXRlCisgKiBMYXRlciBleHBvc2VkIGFzIFFVbml0LmNvbmZpZworICog
YGNvbmZpZ2AgaW5pdGlhbGl6ZWQgYXQgdG9wIG9mIHNjb3BlCisgKi8KK3ZhciBjb25maWcgPSB7
CisJLy8gVGhlIHF1ZXVlIG9mIHRlc3RzIHRvIHJ1bgorCXF1ZXVlOiBbXSwKKworCS8vIGJsb2Nr
IHVudGlsIGRvY3VtZW50IHJlYWR5CisJYmxvY2tpbmc6IHRydWUsCisKKwkvLyBieSBkZWZhdWx0
LCBydW4gcHJldmlvdXNseSBmYWlsZWQgdGVzdHMgZmlyc3QKKwkvLyB2ZXJ5IHVzZWZ1bCBpbiBj
b21iaW5hdGlvbiB3aXRoICJIaWRlIHBhc3NlZCB0ZXN0cyIgY2hlY2tlZAorCXJlb3JkZXI6IHRy
dWUsCisKKwkvLyBieSBkZWZhdWx0LCBtb2RpZnkgZG9jdW1lbnQudGl0bGUgd2hlbiBzdWl0ZSBp
cyBkb25lCisJYWx0ZXJ0aXRsZTogdHJ1ZSwKKworCS8vIEhUTUwgUmVwb3J0ZXI6IGNvbGxhcHNl
IGV2ZXJ5IHRlc3QgZXhjZXB0IHRoZSBmaXJzdCBmYWlsaW5nIHRlc3QKKwkvLyBJZiBmYWxzZSwg
YWxsIGZhaWxpbmcgdGVzdHMgd2lsbCBiZSBleHBhbmRlZAorCWNvbGxhcHNlOiB0cnVlLAorCisJ
Ly8gYnkgZGVmYXVsdCwgc2Nyb2xsIHRvIHRvcCBvZiB0aGUgcGFnZSB3aGVuIHN1aXRlIGlzIGRv
bmUKKwlzY3JvbGx0b3A6IHRydWUsCisKKwkvLyBkZXB0aCB1cC10byB3aGljaCBvYmplY3Qgd2ls
bCBiZSBkdW1wZWQKKwltYXhEZXB0aDogNSwKKworCS8vIHdoZW4gZW5hYmxlZCwgYWxsIHRlc3Rz
IG11c3QgY2FsbCBleHBlY3QoKQorCXJlcXVpcmVFeHBlY3RzOiBmYWxzZSwKKworCS8vIGFkZCBj
aGVja2JveGVzIHRoYXQgYXJlIHBlcnNpc3RlZCBpbiB0aGUgcXVlcnktc3RyaW5nCisJLy8gd2hl
biBlbmFibGVkLCB0aGUgaWQgaXMgc2V0IHRvIGB0cnVlYCBhcyBhIGBRVW5pdC5jb25maWdgIHBy
b3BlcnR5CisJdXJsQ29uZmlnOiBbCisJCXsKKwkJCWlkOiAiaGlkZXBhc3NlZCIsCisJCQlsYWJl
bDogIkhpZGUgcGFzc2VkIHRlc3RzIiwKKwkJCXRvb2x0aXA6ICJPbmx5IHNob3cgdGVzdHMgYW5k
IGFzc2VydGlvbnMgdGhhdCBmYWlsLiBTdG9yZWQgYXMgcXVlcnktc3RyaW5ncy4iCisJCX0sCisJ
CXsKKwkJCWlkOiAibm9nbG9iYWxzIiwKKwkJCWxhYmVsOiAiQ2hlY2sgZm9yIEdsb2JhbHMiLAor
CQkJdG9vbHRpcDogIkVuYWJsaW5nIHRoaXMgd2lsbCB0ZXN0IGlmIGFueSB0ZXN0IGludHJvZHVj
ZXMgbmV3IHByb3BlcnRpZXMgb24gdGhlICIgKworCQkJCSJnbG9iYWwgb2JqZWN0IChgd2luZG93
YCBpbiBCcm93c2VycykuIFN0b3JlZCBhcyBxdWVyeS1zdHJpbmdzLiIKKwkJfSwKKwkJeworCQkJ
aWQ6ICJub3RyeWNhdGNoIiwKKwkJCWxhYmVsOiAiTm8gdHJ5LWNhdGNoIiwKKwkJCXRvb2x0aXA6
ICJFbmFibGluZyB0aGlzIHdpbGwgcnVuIHRlc3RzIG91dHNpZGUgb2YgYSB0cnktY2F0Y2ggYmxv
Y2suIE1ha2VzIGRlYnVnZ2luZyAiICsKKwkJCQkiZXhjZXB0aW9ucyBpbiBJRSByZWFzb25hYmxl
LiBTdG9yZWQgYXMgcXVlcnktc3RyaW5ncy4iCisJCX0KKwldLAorCisJLy8gU2V0IG9mIGFsbCBt
b2R1bGVzLgorCW1vZHVsZXM6IFtdLAorCisJLy8gU3RhY2sgb2YgbmVzdGVkIG1vZHVsZXMKKwlt
b2R1bGVTdGFjazogW10sCisKKwkvLyBUaGUgZmlyc3QgdW5uYW1lZCBtb2R1bGUKKwljdXJyZW50
TW9kdWxlOiB7CisJCW5hbWU6ICIiLAorCQl0ZXN0czogW10KKwl9LAorCisJY2FsbGJhY2tzOiB7
fQorfTsKKwordmFyIHVybFBhcmFtcyA9IGRlZmluZWQuZG9jdW1lbnQgPyBnZXRVcmxQYXJhbXMo
KSA6IHt9OworCisvLyBQdXNoIGEgbG9vc2UgdW5uYW1lZCBtb2R1bGUgdG8gdGhlIG1vZHVsZXMg
Y29sbGVjdGlvbgorY29uZmlnLm1vZHVsZXMucHVzaCggY29uZmlnLmN1cnJlbnRNb2R1bGUgKTsK
KworaWYgKCB1cmxQYXJhbXMuZmlsdGVyID09PSB0cnVlICkgeworCWRlbGV0ZSB1cmxQYXJhbXMu
ZmlsdGVyOworfQorCisvLyBTdHJpbmcgc2VhcmNoIGFueXdoZXJlIGluIG1vZHVsZU5hbWUrdGVz
dE5hbWUKK2NvbmZpZy5maWx0ZXIgPSB1cmxQYXJhbXMuZmlsdGVyOworCitjb25maWcudGVzdElk
ID0gW107CitpZiAoIHVybFBhcmFtcy50ZXN0SWQgKSB7CisJLy8gRW5zdXJlIHRoYXQgdXJsUGFy
YW1zLnRlc3RJZCBpcyBhbiBhcnJheQorCXVybFBhcmFtcy50ZXN0SWQgPSBkZWNvZGVVUklDb21w
b25lbnQoIHVybFBhcmFtcy50ZXN0SWQgKS5zcGxpdCggIiwiICk7CisJZm9yICh2YXIgaSA9IDA7
IGkgPCB1cmxQYXJhbXMudGVzdElkLmxlbmd0aDsgaSsrICkgeworCQljb25maWcudGVzdElkLnB1
c2goIHVybFBhcmFtcy50ZXN0SWRbIGkgXSApOworCX0KK30KKwordmFyIGxvZ2dpbmdDYWxsYmFj
a3MgPSB7fTsKKworLy8gUmVnaXN0ZXIgbG9nZ2luZyBjYWxsYmFja3MKK2Z1bmN0aW9uIHJlZ2lz
dGVyTG9nZ2luZ0NhbGxiYWNrcyggb2JqICkgeworCXZhciBpLCBsLCBrZXksCisJCWNhbGxiYWNr
TmFtZXMgPSBbICJiZWdpbiIsICJkb25lIiwgImxvZyIsICJ0ZXN0U3RhcnQiLCAidGVzdERvbmUi
LAorCQkJIm1vZHVsZVN0YXJ0IiwgIm1vZHVsZURvbmUiIF07CisKKwlmdW5jdGlvbiByZWdpc3Rl
ckxvZ2dpbmdDYWxsYmFjaygga2V5ICkgeworCQl2YXIgbG9nZ2luZ0NhbGxiYWNrID0gZnVuY3Rp
b24oIGNhbGxiYWNrICkgeworCQkJaWYgKCBvYmplY3RUeXBlKCBjYWxsYmFjayApICE9PSAiZnVu
Y3Rpb24iICkgeworCQkJCXRocm93IG5ldyBFcnJvcigKKwkJCQkJIlFVbml0IGxvZ2dpbmcgbWV0
aG9kcyByZXF1aXJlIGEgY2FsbGJhY2sgZnVuY3Rpb24gYXMgdGhlaXIgZmlyc3QgcGFyYW1ldGVy
cy4iCisJCQkJKTsKKwkJCX0KKworCQkJY29uZmlnLmNhbGxiYWNrc1sga2V5IF0ucHVzaCggY2Fs
bGJhY2sgKTsKKwkJfTsKKworCQkvLyBERVBSRUNBVEVEOiBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBv
biBRVW5pdCAyLjAuMCsKKwkJLy8gU3RvcmVzIHRoZSByZWdpc3RlcmVkIGZ1bmN0aW9ucyBhbGxv
d2luZyByZXN0b3JpbmcKKwkJLy8gYXQgdmVyaWZ5TG9nZ2luZ0NhbGxiYWNrcygpIGlmIG1vZGlm
aWVkCisJCWxvZ2dpbmdDYWxsYmFja3NbIGtleSBdID0gbG9nZ2luZ0NhbGxiYWNrOworCisJCXJl
dHVybiBsb2dnaW5nQ2FsbGJhY2s7CisJfQorCisJZm9yICggaSA9IDAsIGwgPSBjYWxsYmFja05h
bWVzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJa2V5ID0gY2FsbGJhY2tOYW1lc1sgaSBdOwor
CisJCS8vIEluaXRpYWxpemUga2V5IGNvbGxlY3Rpb24gb2YgbG9nZ2luZyBjYWxsYmFjaworCQlp
ZiAoIG9iamVjdFR5cGUoIGNvbmZpZy5jYWxsYmFja3NbIGtleSBdICkgPT09ICJ1bmRlZmluZWQi
ICkgeworCQkJY29uZmlnLmNhbGxiYWNrc1sga2V5IF0gPSBbXTsKKwkJfQorCisJCW9ialsga2V5
IF0gPSByZWdpc3RlckxvZ2dpbmdDYWxsYmFjaygga2V5ICk7CisJfQorfQorCitmdW5jdGlvbiBy
dW5Mb2dnaW5nQ2FsbGJhY2tzKCBrZXksIGFyZ3MgKSB7CisJdmFyIGksIGwsIGNhbGxiYWNrczsK
KworCWNhbGxiYWNrcyA9IGNvbmZpZy5jYWxsYmFja3NbIGtleSBdOworCWZvciAoIGkgPSAwLCBs
ID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJY2FsbGJhY2tzWyBpIF0oIGFy
Z3MgKTsKKwl9Cit9CisKKy8vIERFUFJFQ0FURUQ6IFRoaXMgd2lsbCBiZSByZW1vdmVkIG9uIDIu
MC4wKworLy8gVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyBpZiB0aGUgbG9nZ2luZ0NhbGxiYWNrcyB3
ZXJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyCisvLyBJZiBzbywgaXQgd2lsbCByZXN0b3JlIGl0LCBh
c3NpZ24gdGhlIGdpdmVuIGNhbGxiYWNrIGFuZCBwcmludCBhIGNvbnNvbGUgd2FybmluZworZnVu
Y3Rpb24gdmVyaWZ5TG9nZ2luZ0NhbGxiYWNrcygpIHsKKwl2YXIgbG9nZ2luZ0NhbGxiYWNrLCB1
c2VyQ2FsbGJhY2s7CisKKwlmb3IgKCBsb2dnaW5nQ2FsbGJhY2sgaW4gbG9nZ2luZ0NhbGxiYWNr
cyApIHsKKwkJaWYgKCBRVW5pdFsgbG9nZ2luZ0NhbGxiYWNrIF0gIT09IGxvZ2dpbmdDYWxsYmFj
a3NbIGxvZ2dpbmdDYWxsYmFjayBdICkgeworCisJCQl1c2VyQ2FsbGJhY2sgPSBRVW5pdFsgbG9n
Z2luZ0NhbGxiYWNrIF07CisKKwkJCS8vIFJlc3RvcmUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisJ
CQlRVW5pdFsgbG9nZ2luZ0NhbGxiYWNrIF0gPSBsb2dnaW5nQ2FsbGJhY2tzWyBsb2dnaW5nQ2Fs
bGJhY2sgXTsKKworCQkJLy8gQXNzaWduIHRoZSBkZXByZWNhdGVkIGdpdmVuIGNhbGxiYWNrCisJ
CQlRVW5pdFsgbG9nZ2luZ0NhbGxiYWNrIF0oIHVzZXJDYWxsYmFjayApOworCisJCQlpZiAoIGds
b2JhbC5jb25zb2xlICYmIGdsb2JhbC5jb25zb2xlLndhcm4gKSB7CisJCQkJZ2xvYmFsLmNvbnNv
bGUud2FybigKKwkJCQkJIlFVbml0LiIgKyBsb2dnaW5nQ2FsbGJhY2sgKyAiIHdhcyByZXBsYWNl
ZCB3aXRoIGEgbmV3IHZhbHVlLlxuIiArCisJCQkJCSJQbGVhc2UsIGNoZWNrIG91dCB0aGUgZG9j
dW1lbnRhdGlvbiBvbiBob3cgdG8gYXBwbHkgbG9nZ2luZyBjYWxsYmFja3MuXG4iICsKKwkJCQkJ
IlJlZmVyZW5jZTogaHR0cDovL2FwaS5xdW5pdGpzLmNvbS9jYXRlZ29yeS9jYWxsYmFja3MvIgor
CQkJCSk7CisJCQl9CisJCX0KKwl9Cit9CisKKyggZnVuY3Rpb24oKSB7CisJaWYgKCAhZGVmaW5l
ZC5kb2N1bWVudCApIHsKKwkJcmV0dXJuOworCX0KKworCS8vIGBvbkVycm9yRm5QcmV2YCBpbml0
aWFsaXplZCBhdCB0b3Agb2Ygc2NvcGUKKwkvLyBQcmVzZXJ2ZSBvdGhlciBoYW5kbGVycworCXZh
ciBvbkVycm9yRm5QcmV2ID0gd2luZG93Lm9uZXJyb3I7CisKKwkvLyBDb3ZlciB1bmNhdWdodCBl
eGNlcHRpb25zCisJLy8gUmV0dXJuaW5nIHRydWUgd2lsbCBzdXBwcmVzcyB0aGUgZGVmYXVsdCBi
cm93c2VyIGhhbmRsZXIsCisJLy8gcmV0dXJuaW5nIGZhbHNlIHdpbGwgbGV0IGl0IHJ1bi4KKwl3
aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uKCBlcnJvciwgZmlsZVBhdGgsIGxpbmVyTnIgKSB7CisJ
CXZhciByZXQgPSBmYWxzZTsKKwkJaWYgKCBvbkVycm9yRm5QcmV2ICkgeworCQkJcmV0ID0gb25F
cnJvckZuUHJldiggZXJyb3IsIGZpbGVQYXRoLCBsaW5lck5yICk7CisJCX0KKworCQkvLyBUcmVh
dCByZXR1cm4gdmFsdWUgYXMgd2luZG93Lm9uZXJyb3IgaXRzZWxmIGRvZXMsCisJCS8vIE9ubHkg
ZG8gb3VyIGhhbmRsaW5nIGlmIG5vdCBzdXBwcmVzc2VkLgorCQlpZiAoIHJldCAhPT0gdHJ1ZSAp
IHsKKwkJCWlmICggUVVuaXQuY29uZmlnLmN1cnJlbnQgKSB7CisJCQkJaWYgKCBRVW5pdC5jb25m
aWcuY3VycmVudC5pZ25vcmVHbG9iYWxFcnJvcnMgKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJ
CX0KKwkJCQlRVW5pdC5wdXNoRmFpbHVyZSggZXJyb3IsIGZpbGVQYXRoICsgIjoiICsgbGluZXJO
ciApOworCQkJfSBlbHNlIHsKKwkJCQlRVW5pdC50ZXN0KCAiZ2xvYmFsIGZhaWx1cmUiLCBleHRl
bmQoZnVuY3Rpb24oKSB7CisJCQkJCVFVbml0LnB1c2hGYWlsdXJlKCBlcnJvciwgZmlsZVBhdGgg
KyAiOiIgKyBsaW5lck5yICk7CisJCQkJfSwgeyB2YWxpZFRlc3Q6IHRydWUgfSApICk7CisJCQl9
CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gcmV0OworCX07Cit9ICkoKTsKKwor
UVVuaXQudXJsUGFyYW1zID0gdXJsUGFyYW1zOworCisvLyBGaWd1cmUgb3V0IGlmIHdlJ3JlIHJ1
bm5pbmcgdGhlIHRlc3RzIGZyb20gYSBzZXJ2ZXIgb3Igbm90CitRVW5pdC5pc0xvY2FsID0gISgg
ZGVmaW5lZC5kb2N1bWVudCAmJiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgIT09ICJmaWxlOiIg
KTsKKworLy8gRXhwb3NlIHRoZSBjdXJyZW50IFFVbml0IHZlcnNpb24KK1FVbml0LnZlcnNpb24g
PSAiMS4yMC4wIjsKKworZXh0ZW5kKCBRVW5pdCwgeworCisJLy8gY2FsbCBvbiBzdGFydCBvZiBt
b2R1bGUgdGVzdCB0byBwcmVwZW5kIG5hbWUgdG8gYWxsIHRlc3RzCisJbW9kdWxlOiBmdW5jdGlv
biggbmFtZSwgdGVzdEVudmlyb25tZW50LCBleGVjdXRlTm93ICkgeworCQl2YXIgbW9kdWxlLCBt
b2R1bGVGbnM7CisJCXZhciBjdXJyZW50TW9kdWxlID0gY29uZmlnLmN1cnJlbnRNb2R1bGU7CisK
KwkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyICkgeworCQkJaWYgKCB0ZXN0RW52aXJvbm1l
bnQgaW5zdGFuY2VvZiBGdW5jdGlvbiApIHsKKwkJCQlleGVjdXRlTm93ID0gdGVzdEVudmlyb25t
ZW50OworCQkJCXRlc3RFbnZpcm9ubWVudCA9IHVuZGVmaW5lZDsKKwkJCX0KKwkJfQorCisJCS8v
IERFUFJFQ0FURUQ6IGhhbmRsZXMgc2V0dXAvdGVhcmRvd24gZnVuY3Rpb25zLAorCQkvLyBiZWZv
cmVFYWNoIGFuZCBhZnRlckVhY2ggc2hvdWxkIGJlIHVzZWQgaW5zdGVhZAorCQlpZiAoIHRlc3RF
bnZpcm9ubWVudCAmJiB0ZXN0RW52aXJvbm1lbnQuc2V0dXAgKSB7CisJCQl0ZXN0RW52aXJvbm1l
bnQuYmVmb3JlRWFjaCA9IHRlc3RFbnZpcm9ubWVudC5zZXR1cDsKKwkJCWRlbGV0ZSB0ZXN0RW52
aXJvbm1lbnQuc2V0dXA7CisJCX0KKwkJaWYgKCB0ZXN0RW52aXJvbm1lbnQgJiYgdGVzdEVudmly
b25tZW50LnRlYXJkb3duICkgeworCQkJdGVzdEVudmlyb25tZW50LmFmdGVyRWFjaCA9IHRlc3RF
bnZpcm9ubWVudC50ZWFyZG93bjsKKwkJCWRlbGV0ZSB0ZXN0RW52aXJvbm1lbnQudGVhcmRvd247
CisJCX0KKworCQltb2R1bGUgPSBjcmVhdGVNb2R1bGUoKTsKKworCQltb2R1bGVGbnMgPSB7CisJ
CQliZWZvcmVFYWNoOiBzZXRIb29rKCBtb2R1bGUsICJiZWZvcmVFYWNoIiApLAorCQkJYWZ0ZXJF
YWNoOiBzZXRIb29rKCBtb2R1bGUsICJhZnRlckVhY2giICkKKwkJfTsKKworCQlpZiAoIGV4ZWN1
dGVOb3cgaW5zdGFuY2VvZiBGdW5jdGlvbiApIHsKKwkJCWNvbmZpZy5tb2R1bGVTdGFjay5wdXNo
KCBtb2R1bGUgKTsKKwkJCXNldEN1cnJlbnRNb2R1bGUoIG1vZHVsZSApOworCQkJZXhlY3V0ZU5v
dy5jYWxsKCBtb2R1bGUudGVzdEVudmlyb25tZW50LCBtb2R1bGVGbnMgKTsKKwkJCWNvbmZpZy5t
b2R1bGVTdGFjay5wb3AoKTsKKwkJCW1vZHVsZSA9IG1vZHVsZS5wYXJlbnRNb2R1bGUgfHwgY3Vy
cmVudE1vZHVsZTsKKwkJfQorCisJCXNldEN1cnJlbnRNb2R1bGUoIG1vZHVsZSApOworCisJCWZ1
bmN0aW9uIGNyZWF0ZU1vZHVsZSgpIHsKKwkJCXZhciBwYXJlbnRNb2R1bGUgPSBjb25maWcubW9k
dWxlU3RhY2subGVuZ3RoID8KKwkJCQljb25maWcubW9kdWxlU3RhY2suc2xpY2UoIC0xIClbIDAg
XSA6IG51bGw7CisJCQl2YXIgbW9kdWxlTmFtZSA9IHBhcmVudE1vZHVsZSAhPT0gbnVsbCA/CisJ
CQkJWyBwYXJlbnRNb2R1bGUubmFtZSwgbmFtZSBdLmpvaW4oICIgPiAiICkgOiBuYW1lOworCQkJ
dmFyIG1vZHVsZSA9IHsKKwkJCQluYW1lOiBtb2R1bGVOYW1lLAorCQkJCXBhcmVudE1vZHVsZTog
cGFyZW50TW9kdWxlLAorCQkJCXRlc3RzOiBbXQorCQkJfTsKKworCQkJdmFyIGVudiA9IHt9Owor
CQkJaWYgKCBwYXJlbnRNb2R1bGUgKSB7CisJCQkJZXh0ZW5kKCBlbnYsIHBhcmVudE1vZHVsZS50
ZXN0RW52aXJvbm1lbnQgKTsKKwkJCQlkZWxldGUgZW52LmJlZm9yZUVhY2g7CisJCQkJZGVsZXRl
IGVudi5hZnRlckVhY2g7CisJCQl9CisJCQlleHRlbmQoIGVudiwgdGVzdEVudmlyb25tZW50ICk7
CisJCQltb2R1bGUudGVzdEVudmlyb25tZW50ID0gZW52OworCisJCQljb25maWcubW9kdWxlcy5w
dXNoKCBtb2R1bGUgKTsKKwkJCXJldHVybiBtb2R1bGU7CisJCX0KKworCQlmdW5jdGlvbiBzZXRD
dXJyZW50TW9kdWxlKCBtb2R1bGUgKSB7CisJCQljb25maWcuY3VycmVudE1vZHVsZSA9IG1vZHVs
ZTsKKwkJfQorCisJfSwKKworCS8vIERFUFJFQ0FURUQ6IFFVbml0LmFzeW5jVGVzdCgpIHdpbGwg
YmUgcmVtb3ZlZCBpbiBRVW5pdCAyLjAuCisJYXN5bmNUZXN0OiBhc3luY1Rlc3QsCisKKwl0ZXN0
OiB0ZXN0LAorCisJc2tpcDogc2tpcCwKKworCW9ubHk6IG9ubHksCisKKwkvLyBERVBSRUNBVEVE
OiBUaGUgZnVuY3Rpb25hbGl0eSBvZiBRVW5pdC5zdGFydCgpIHdpbGwgYmUgYWx0ZXJlZCBpbiBR
VW5pdCAyLjAuCisJLy8gSW4gUVVuaXQgMi4wLCBpbnZva2luZyBpdCB3aWxsIE9OTFkgYWZmZWN0
IHRoZSBgUVVuaXQuY29uZmlnLmF1dG9zdGFydGAgYmxvY2tpbmcgYmVoYXZpb3IuCisJc3RhcnQ6
IGZ1bmN0aW9uKCBjb3VudCApIHsKKwkJdmFyIGdsb2JhbFN0YXJ0QWxyZWFkeUNhbGxlZCA9IGds
b2JhbFN0YXJ0Q2FsbGVkOworCisJCWlmICggIWNvbmZpZy5jdXJyZW50ICkgeworCQkJZ2xvYmFs
U3RhcnRDYWxsZWQgPSB0cnVlOworCisJCQlpZiAoIHJ1blN0YXJ0ZWQgKSB7CisJCQkJdGhyb3cg
bmV3IEVycm9yKCAiQ2FsbGVkIHN0YXJ0KCkgb3V0c2lkZSBvZiBhIHRlc3QgY29udGV4dCB3aGls
ZSBhbHJlYWR5IHN0YXJ0ZWQiICk7CisJCQl9IGVsc2UgaWYgKCBnbG9iYWxTdGFydEFscmVhZHlD
YWxsZWQgfHwgY291bnQgPiAxICkgeworCQkJCXRocm93IG5ldyBFcnJvciggIkNhbGxlZCBzdGFy
dCgpIG91dHNpZGUgb2YgYSB0ZXN0IGNvbnRleHQgdG9vIG1hbnkgdGltZXMiICk7CisJCQl9IGVs
c2UgaWYgKCBjb25maWcuYXV0b3N0YXJ0ICkgeworCQkJCXRocm93IG5ldyBFcnJvciggIkNhbGxl
ZCBzdGFydCgpIG91dHNpZGUgb2YgYSB0ZXN0IGNvbnRleHQgd2hlbiAiICsKKwkJCQkJIlFVbml0
LmNvbmZpZy5hdXRvc3RhcnQgd2FzIHRydWUiICk7CisJCQl9IGVsc2UgaWYgKCAhY29uZmlnLnBh
Z2VMb2FkZWQgKSB7CisKKwkJCQkvLyBUaGUgcGFnZSBpc24ndCBjb21wbGV0ZWx5IGxvYWRlZCB5
ZXQsIHNvIGJhaWwgb3V0IGFuZCBsZXQgYFFVbml0LmxvYWRgIGhhbmRsZSBpdAorCQkJCWNvbmZp
Zy5hdXRvc3RhcnQgPSB0cnVlOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsKKworCQkJ
Ly8gSWYgYSB0ZXN0IGlzIHJ1bm5pbmcsIGFkanVzdCBpdHMgc2VtYXBob3JlCisJCQljb25maWcu
Y3VycmVudC5zZW1hcGhvcmUgLT0gY291bnQgfHwgMTsKKworCQkJLy8gSWYgc2VtYXBob3JlIGlz
IG5vbi1udW1lcmljLCB0aHJvdyBlcnJvcgorCQkJaWYgKCBpc05hTiggY29uZmlnLmN1cnJlbnQu
c2VtYXBob3JlICkgKSB7CisJCQkJY29uZmlnLmN1cnJlbnQuc2VtYXBob3JlID0gMDsKKworCQkJ
CVFVbml0LnB1c2hGYWlsdXJlKAorCQkJCQkiQ2FsbGVkIHN0YXJ0KCkgd2l0aCBhIG5vbi1udW1l
cmljIGRlY3JlbWVudC4iLAorCQkJCQlzb3VyY2VGcm9tU3RhY2t0cmFjZSggMiApCisJCQkJKTsK
KwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIERvbid0IHN0YXJ0IHVudGlsIGVxdWFsIG51bWJl
ciBvZiBzdG9wLWNhbGxzCisJCQlpZiAoIGNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSA+IDAgKSB7
CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyB0aHJvdyBhbiBFcnJvciBpZiBzdGFydCBpcyBj
YWxsZWQgbW9yZSBvZnRlbiB0aGFuIHN0b3AKKwkJCWlmICggY29uZmlnLmN1cnJlbnQuc2VtYXBo
b3JlIDwgMCApIHsKKwkJCQljb25maWcuY3VycmVudC5zZW1hcGhvcmUgPSAwOworCisJCQkJUVVu
aXQucHVzaEZhaWx1cmUoCisJCQkJCSJDYWxsZWQgc3RhcnQoKSB3aGlsZSBhbHJlYWR5IHN0YXJ0
ZWQgKHRlc3QncyBzZW1hcGhvcmUgd2FzIDAgYWxyZWFkeSkiLAorCQkJCQlzb3VyY2VGcm9tU3Rh
Y2t0cmFjZSggMiApCisJCQkJKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlyZXN1bWVQ
cm9jZXNzaW5nKCk7CisJfSwKKworCS8vIERFUFJFQ0FURUQ6IFFVbml0LnN0b3AoKSB3aWxsIGJl
IHJlbW92ZWQgaW4gUVVuaXQgMi4wLgorCXN0b3A6IGZ1bmN0aW9uKCBjb3VudCApIHsKKworCQkv
LyBJZiB0aGVyZSBpc24ndCBhIHRlc3QgcnVubmluZywgZG9uJ3QgYWxsb3cgUVVuaXQuc3RvcCgp
IHRvIGJlIGNhbGxlZAorCQlpZiAoICFjb25maWcuY3VycmVudCApIHsKKwkJCXRocm93IG5ldyBF
cnJvciggIkNhbGxlZCBzdG9wKCkgb3V0c2lkZSBvZiBhIHRlc3QgY29udGV4dCIgKTsKKwkJfQor
CisJCS8vIElmIGEgdGVzdCBpcyBydW5uaW5nLCBhZGp1c3QgaXRzIHNlbWFwaG9yZQorCQljb25m
aWcuY3VycmVudC5zZW1hcGhvcmUgKz0gY291bnQgfHwgMTsKKworCQlwYXVzZVByb2Nlc3Npbmco
KTsKKwl9LAorCisJY29uZmlnOiBjb25maWcsCisKKwlpczogaXMsCisKKwlvYmplY3RUeXBlOiBv
YmplY3RUeXBlLAorCisJZXh0ZW5kOiBleHRlbmQsCisKKwlsb2FkOiBmdW5jdGlvbigpIHsKKwkJ
Y29uZmlnLnBhZ2VMb2FkZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgdGhlIGNvbmZpZ3Vy
YXRpb24gb3B0aW9ucworCQlleHRlbmQoIGNvbmZpZywgeworCQkJc3RhdHM6IHsgYWxsOiAwLCBi
YWQ6IDAgfSwKKwkJCW1vZHVsZVN0YXRzOiB7IGFsbDogMCwgYmFkOiAwIH0sCisJCQlzdGFydGVk
OiAwLAorCQkJdXBkYXRlUmF0ZTogMTAwMCwKKwkJCWF1dG9zdGFydDogdHJ1ZSwKKwkJCWZpbHRl
cjogIiIKKwkJfSwgdHJ1ZSApOworCisJCWNvbmZpZy5ibG9ja2luZyA9IGZhbHNlOworCisJCWlm
ICggY29uZmlnLmF1dG9zdGFydCApIHsKKwkJCXJlc3VtZVByb2Nlc3NpbmcoKTsKKwkJfQorCX0s
CisKKwlzdGFjazogZnVuY3Rpb24oIG9mZnNldCApIHsKKwkJb2Zmc2V0ID0gKCBvZmZzZXQgfHwg
MCApICsgMjsKKwkJcmV0dXJuIHNvdXJjZUZyb21TdGFja3RyYWNlKCBvZmZzZXQgKTsKKwl9Cit9
KTsKKworcmVnaXN0ZXJMb2dnaW5nQ2FsbGJhY2tzKCBRVW5pdCApOworCitmdW5jdGlvbiBiZWdp
bigpIHsKKwl2YXIgaSwgbCwKKwkJbW9kdWxlc0xvZyA9IFtdOworCisJLy8gSWYgdGhlIHRlc3Qg
cnVuIGhhc24ndCBvZmZpY2lhbGx5IGJlZ3VuIHlldAorCWlmICggIWNvbmZpZy5zdGFydGVkICkg
eworCisJCS8vIFJlY29yZCB0aGUgdGltZSBvZiB0aGUgdGVzdCBydW4ncyBiZWdpbm5pbmcKKwkJ
Y29uZmlnLnN0YXJ0ZWQgPSBub3coKTsKKworCQl2ZXJpZnlMb2dnaW5nQ2FsbGJhY2tzKCk7CisK
KwkJLy8gRGVsZXRlIHRoZSBsb29zZSB1bm5hbWVkIG1vZHVsZSBpZiB1bnVzZWQuCisJCWlmICgg
Y29uZmlnLm1vZHVsZXNbIDAgXS5uYW1lID09PSAiIiAmJiBjb25maWcubW9kdWxlc1sgMCBdLnRl
c3RzLmxlbmd0aCA9PT0gMCApIHsKKwkJCWNvbmZpZy5tb2R1bGVzLnNoaWZ0KCk7CisJCX0KKwor
CQkvLyBBdm9pZCB1bm5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBieSBub3QgbG9nZ2luZyBtb2R1bGVz
JyB0ZXN0IGVudmlyb25tZW50cworCQlmb3IgKCBpID0gMCwgbCA9IGNvbmZpZy5tb2R1bGVzLmxl
bmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCW1vZHVsZXNMb2cucHVzaCh7CisJCQkJbmFtZTogY29u
ZmlnLm1vZHVsZXNbIGkgXS5uYW1lLAorCQkJCXRlc3RzOiBjb25maWcubW9kdWxlc1sgaSBdLnRl
c3RzCisJCQl9KTsKKwkJfQorCisJCS8vIFRoZSB0ZXN0IHJ1biBpcyBvZmZpY2lhbGx5IGJlZ2lu
bmluZyBub3cKKwkJcnVuTG9nZ2luZ0NhbGxiYWNrcyggImJlZ2luIiwgeworCQkJdG90YWxUZXN0
czogVGVzdC5jb3VudCwKKwkJCW1vZHVsZXM6IG1vZHVsZXNMb2cKKwkJfSk7CisJfQorCisJY29u
ZmlnLmJsb2NraW5nID0gZmFsc2U7CisJcHJvY2VzcyggdHJ1ZSApOworfQorCitmdW5jdGlvbiBw
cm9jZXNzKCBsYXN0ICkgeworCWZ1bmN0aW9uIG5leHQoKSB7CisJCXByb2Nlc3MoIGxhc3QgKTsK
Kwl9CisJdmFyIHN0YXJ0ID0gbm93KCk7CisJY29uZmlnLmRlcHRoID0gKCBjb25maWcuZGVwdGgg
fHwgMCApICsgMTsKKworCXdoaWxlICggY29uZmlnLnF1ZXVlLmxlbmd0aCAmJiAhY29uZmlnLmJs
b2NraW5nICkgeworCQlpZiAoICFkZWZpbmVkLnNldFRpbWVvdXQgfHwgY29uZmlnLnVwZGF0ZVJh
dGUgPD0gMCB8fAorCQkJCSggKCBub3coKSAtIHN0YXJ0ICkgPCBjb25maWcudXBkYXRlUmF0ZSAp
ICkgeworCQkJaWYgKCBjb25maWcuY3VycmVudCApIHsKKworCQkJCS8vIFJlc2V0IGFzeW5jIHRy
YWNraW5nIGZvciBlYWNoIHBoYXNlIG9mIHRoZSBUZXN0IGxpZmVjeWNsZQorCQkJCWNvbmZpZy5j
dXJyZW50LnVzZWRBc3luYyA9IGZhbHNlOworCQkJfQorCQkJY29uZmlnLnF1ZXVlLnNoaWZ0KCko
KTsKKwkJfSBlbHNlIHsKKwkJCXNldFRpbWVvdXQoIG5leHQsIDEzICk7CisJCQlicmVhazsKKwkJ
fQorCX0KKwljb25maWcuZGVwdGgtLTsKKwlpZiAoIGxhc3QgJiYgIWNvbmZpZy5ibG9ja2luZyAm
JiAhY29uZmlnLnF1ZXVlLmxlbmd0aCAmJiBjb25maWcuZGVwdGggPT09IDAgKSB7CisJCWRvbmUo
KTsKKwl9Cit9CisKK2Z1bmN0aW9uIHBhdXNlUHJvY2Vzc2luZygpIHsKKwljb25maWcuYmxvY2tp
bmcgPSB0cnVlOworCisJaWYgKCBjb25maWcudGVzdFRpbWVvdXQgJiYgZGVmaW5lZC5zZXRUaW1l
b3V0ICkgeworCQljbGVhclRpbWVvdXQoIGNvbmZpZy50aW1lb3V0ICk7CisJCWNvbmZpZy50aW1l
b3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKKwkJCWlmICggY29uZmlnLmN1cnJlbnQgKSB7
CisJCQkJY29uZmlnLmN1cnJlbnQuc2VtYXBob3JlID0gMDsKKwkJCQlRVW5pdC5wdXNoRmFpbHVy
ZSggIlRlc3QgdGltZWQgb3V0Iiwgc291cmNlRnJvbVN0YWNrdHJhY2UoIDIgKSApOworCQkJfSBl
bHNlIHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoICJUZXN0IHRpbWVkIG91dCIgKTsKKwkJCX0KKwkJ
CXJlc3VtZVByb2Nlc3NpbmcoKTsKKwkJfSwgY29uZmlnLnRlc3RUaW1lb3V0ICk7CisJfQorfQor
CitmdW5jdGlvbiByZXN1bWVQcm9jZXNzaW5nKCkgeworCXJ1blN0YXJ0ZWQgPSB0cnVlOworCisJ
Ly8gQSBzbGlnaHQgZGVsYXkgdG8gYWxsb3cgdGhpcyBpdGVyYXRpb24gb2YgdGhlIGV2ZW50IGxv
b3AgdG8gZmluaXNoIChtb3JlIGFzc2VydGlvbnMsIGV0Yy4pCisJaWYgKCBkZWZpbmVkLnNldFRp
bWVvdXQgKSB7CisJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisJCQlpZiAoIGNvbmZpZy5jdXJy
ZW50ICYmIGNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSA+IDAgKSB7CisJCQkJcmV0dXJuOworCQkJ
fQorCQkJaWYgKCBjb25maWcudGltZW91dCApIHsKKwkJCQljbGVhclRpbWVvdXQoIGNvbmZpZy50
aW1lb3V0ICk7CisJCQl9CisKKwkJCWJlZ2luKCk7CisJCX0sIDEzICk7CisJfSBlbHNlIHsKKwkJ
YmVnaW4oKTsKKwl9Cit9CisKK2Z1bmN0aW9uIGRvbmUoKSB7CisJdmFyIHJ1bnRpbWUsIHBhc3Nl
ZDsKKworCWNvbmZpZy5hdXRvcnVuID0gdHJ1ZTsKKworCS8vIExvZyB0aGUgbGFzdCBtb2R1bGUg
cmVzdWx0cworCWlmICggY29uZmlnLnByZXZpb3VzTW9kdWxlICkgeworCQlydW5Mb2dnaW5nQ2Fs
bGJhY2tzKCAibW9kdWxlRG9uZSIsIHsKKwkJCW5hbWU6IGNvbmZpZy5wcmV2aW91c01vZHVsZS5u
YW1lLAorCQkJdGVzdHM6IGNvbmZpZy5wcmV2aW91c01vZHVsZS50ZXN0cywKKwkJCWZhaWxlZDog
Y29uZmlnLm1vZHVsZVN0YXRzLmJhZCwKKwkJCXBhc3NlZDogY29uZmlnLm1vZHVsZVN0YXRzLmFs
bCAtIGNvbmZpZy5tb2R1bGVTdGF0cy5iYWQsCisJCQl0b3RhbDogY29uZmlnLm1vZHVsZVN0YXRz
LmFsbCwKKwkJCXJ1bnRpbWU6IG5vdygpIC0gY29uZmlnLm1vZHVsZVN0YXRzLnN0YXJ0ZWQKKwkJ
fSk7CisJfQorCWRlbGV0ZSBjb25maWcucHJldmlvdXNNb2R1bGU7CisKKwlydW50aW1lID0gbm93
KCkgLSBjb25maWcuc3RhcnRlZDsKKwlwYXNzZWQgPSBjb25maWcuc3RhdHMuYWxsIC0gY29uZmln
LnN0YXRzLmJhZDsKKworCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJkb25lIiwgeworCQlmYWlsZWQ6
IGNvbmZpZy5zdGF0cy5iYWQsCisJCXBhc3NlZDogcGFzc2VkLAorCQl0b3RhbDogY29uZmlnLnN0
YXRzLmFsbCwKKwkJcnVudGltZTogcnVudGltZQorCX0pOworfQorCitmdW5jdGlvbiBzZXRIb29r
KCBtb2R1bGUsIGhvb2tOYW1lICkgeworCWlmICggbW9kdWxlLnRlc3RFbnZpcm9ubWVudCA9PT0g
dW5kZWZpbmVkICkgeworCQltb2R1bGUudGVzdEVudmlyb25tZW50ID0ge307CisJfQorCisJcmV0
dXJuIGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKKwkJbW9kdWxlLnRlc3RFbnZpcm9ubWVudFsgaG9v
a05hbWUgXSA9IGNhbGxiYWNrOworCX07Cit9CisKK3ZhciBmb2N1c2VkID0gZmFsc2U7CisKK2Z1
bmN0aW9uIFRlc3QoIHNldHRpbmdzICkgeworCXZhciBpLCBsOworCisJKytUZXN0LmNvdW50Owor
CisJZXh0ZW5kKCB0aGlzLCBzZXR0aW5ncyApOworCXRoaXMuYXNzZXJ0aW9ucyA9IFtdOworCXRo
aXMuc2VtYXBob3JlID0gMDsKKwl0aGlzLnVzZWRBc3luYyA9IGZhbHNlOworCXRoaXMubW9kdWxl
ID0gY29uZmlnLmN1cnJlbnRNb2R1bGU7CisJdGhpcy5zdGFjayA9IHNvdXJjZUZyb21TdGFja3Ry
YWNlKCAzICk7CisKKwkvLyBSZWdpc3RlciB1bmlxdWUgc3RyaW5ncworCWZvciAoIGkgPSAwLCBs
ID0gdGhpcy5tb2R1bGUudGVzdHM7IGkgPCBsLmxlbmd0aDsgaSsrICkgeworCQlpZiAoIHRoaXMu
bW9kdWxlLnRlc3RzWyBpIF0ubmFtZSA9PT0gdGhpcy50ZXN0TmFtZSApIHsKKwkJCXRoaXMudGVz
dE5hbWUgKz0gIiAiOworCQl9CisJfQorCisJdGhpcy50ZXN0SWQgPSBnZW5lcmF0ZUhhc2goIHRo
aXMubW9kdWxlLm5hbWUsIHRoaXMudGVzdE5hbWUgKTsKKworCXRoaXMubW9kdWxlLnRlc3RzLnB1
c2goeworCQluYW1lOiB0aGlzLnRlc3ROYW1lLAorCQl0ZXN0SWQ6IHRoaXMudGVzdElkCisJfSk7
CisKKwlpZiAoIHNldHRpbmdzLnNraXAgKSB7CisKKwkJLy8gU2tpcHBlZCB0ZXN0cyB3aWxsIGZ1
bGx5IGlnbm9yZSBhbnkgc2VudCBjYWxsYmFjaworCQl0aGlzLmNhbGxiYWNrID0gZnVuY3Rpb24o
KSB7fTsKKwkJdGhpcy5hc3luYyA9IGZhbHNlOworCQl0aGlzLmV4cGVjdGVkID0gMDsKKwl9IGVs
c2UgeworCQl0aGlzLmFzc2VydCA9IG5ldyBBc3NlcnQoIHRoaXMgKTsKKwl9Cit9CisKK1Rlc3Qu
Y291bnQgPSAwOworCitUZXN0LnByb3RvdHlwZSA9IHsKKwliZWZvcmU6IGZ1bmN0aW9uKCkgewor
CQlpZiAoCisKKwkJCS8vIEVtaXQgbW9kdWxlU3RhcnQgd2hlbiB3ZSdyZSBzd2l0Y2hpbmcgZnJv
bSBvbmUgbW9kdWxlIHRvIGFub3RoZXIKKwkJCXRoaXMubW9kdWxlICE9PSBjb25maWcucHJldmlv
dXNNb2R1bGUgfHwKKworCQkJCS8vIFRoZXkgY291bGQgYmUgZXF1YWwgKGJvdGggdW5kZWZpbmVk
KSBidXQgaWYgdGhlIHByZXZpb3VzTW9kdWxlIHByb3BlcnR5IGRvZXNuJ3QKKwkJCQkvLyB5ZXQg
ZXhpc3QgaXQgbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgdGVzdCBpbiBhIHN1aXRlIHRoYXQgaXNu
J3Qgd3JhcHBlZCBpbiBhCisJCQkJLy8gbW9kdWxlLCBpbiB3aGljaCBjYXNlIHdlJ2xsIGp1c3Qg
ZW1pdCBhIG1vZHVsZVN0YXJ0IGV2ZW50IGZvciAndW5kZWZpbmVkJy4KKwkJCQkvLyBXaXRob3V0
IHRoaXMsIHJlcG9ydGVycyBjYW4gZ2V0IHRlc3RTdGFydCBiZWZvcmUgbW9kdWxlU3RhcnQgIHdo
aWNoIGlzIGEgcHJvYmxlbS4KKwkJCQkhaGFzT3duLmNhbGwoIGNvbmZpZywgInByZXZpb3VzTW9k
dWxlIiApCisJCSkgeworCQkJaWYgKCBoYXNPd24uY2FsbCggY29uZmlnLCAicHJldmlvdXNNb2R1
bGUiICkgKSB7CisJCQkJcnVuTG9nZ2luZ0NhbGxiYWNrcyggIm1vZHVsZURvbmUiLCB7CisJCQkJ
CW5hbWU6IGNvbmZpZy5wcmV2aW91c01vZHVsZS5uYW1lLAorCQkJCQl0ZXN0czogY29uZmlnLnBy
ZXZpb3VzTW9kdWxlLnRlc3RzLAorCQkJCQlmYWlsZWQ6IGNvbmZpZy5tb2R1bGVTdGF0cy5iYWQs
CisJCQkJCXBhc3NlZDogY29uZmlnLm1vZHVsZVN0YXRzLmFsbCAtIGNvbmZpZy5tb2R1bGVTdGF0
cy5iYWQsCisJCQkJCXRvdGFsOiBjb25maWcubW9kdWxlU3RhdHMuYWxsLAorCQkJCQlydW50aW1l
OiBub3coKSAtIGNvbmZpZy5tb2R1bGVTdGF0cy5zdGFydGVkCisJCQkJfSk7CisJCQl9CisJCQlj
b25maWcucHJldmlvdXNNb2R1bGUgPSB0aGlzLm1vZHVsZTsKKwkJCWNvbmZpZy5tb2R1bGVTdGF0
cyA9IHsgYWxsOiAwLCBiYWQ6IDAsIHN0YXJ0ZWQ6IG5vdygpIH07CisJCQlydW5Mb2dnaW5nQ2Fs
bGJhY2tzKCAibW9kdWxlU3RhcnQiLCB7CisJCQkJbmFtZTogdGhpcy5tb2R1bGUubmFtZSwKKwkJ
CQl0ZXN0czogdGhpcy5tb2R1bGUudGVzdHMKKwkJCX0pOworCQl9CisKKwkJY29uZmlnLmN1cnJl
bnQgPSB0aGlzOworCisJCWlmICggdGhpcy5tb2R1bGUudGVzdEVudmlyb25tZW50ICkgeworCQkJ
ZGVsZXRlIHRoaXMubW9kdWxlLnRlc3RFbnZpcm9ubWVudC5iZWZvcmVFYWNoOworCQkJZGVsZXRl
IHRoaXMubW9kdWxlLnRlc3RFbnZpcm9ubWVudC5hZnRlckVhY2g7CisJCX0KKwkJdGhpcy50ZXN0
RW52aXJvbm1lbnQgPSBleHRlbmQoIHt9LCB0aGlzLm1vZHVsZS50ZXN0RW52aXJvbm1lbnQgKTsK
KworCQl0aGlzLnN0YXJ0ZWQgPSBub3coKTsKKwkJcnVuTG9nZ2luZ0NhbGxiYWNrcyggInRlc3RT
dGFydCIsIHsKKwkJCW5hbWU6IHRoaXMudGVzdE5hbWUsCisJCQltb2R1bGU6IHRoaXMubW9kdWxl
Lm5hbWUsCisJCQl0ZXN0SWQ6IHRoaXMudGVzdElkCisJCX0pOworCisJCWlmICggIWNvbmZpZy5w
b2xsdXRpb24gKSB7CisJCQlzYXZlR2xvYmFsKCk7CisJCX0KKwl9LAorCisJcnVuOiBmdW5jdGlv
bigpIHsKKwkJdmFyIHByb21pc2U7CisKKwkJY29uZmlnLmN1cnJlbnQgPSB0aGlzOworCisJCWlm
ICggdGhpcy5hc3luYyApIHsKKwkJCVFVbml0LnN0b3AoKTsKKwkJfQorCisJCXRoaXMuY2FsbGJh
Y2tTdGFydGVkID0gbm93KCk7CisKKwkJaWYgKCBjb25maWcubm90cnljYXRjaCApIHsKKwkJCXJ1
blRlc3QoIHRoaXMgKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXRyeSB7CisJCQlydW5UZXN0KCB0
aGlzICk7CisJCX0gY2F0Y2ggKCBlICkgeworCQkJdGhpcy5wdXNoRmFpbHVyZSggIkRpZWQgb24g
dGVzdCAjIiArICggdGhpcy5hc3NlcnRpb25zLmxlbmd0aCArIDEgKSArICIgIiArCisJCQkJdGhp
cy5zdGFjayArICI6ICIgKyAoIGUubWVzc2FnZSB8fCBlICksIGV4dHJhY3RTdGFja3RyYWNlKCBl
LCAwICkgKTsKKworCQkJLy8gZWxzZSBuZXh0IHRlc3Qgd2lsbCBjYXJyeSB0aGUgcmVzcG9uc2li
aWxpdHkKKwkJCXNhdmVHbG9iYWwoKTsKKworCQkJLy8gUmVzdGFydCB0aGUgdGVzdHMgaWYgdGhl
eSdyZSBibG9ja2luZworCQkJaWYgKCBjb25maWcuYmxvY2tpbmcgKSB7CisJCQkJUVVuaXQuc3Rh
cnQoKTsKKwkJCX0KKwkJfQorCisJCWZ1bmN0aW9uIHJ1blRlc3QoIHRlc3QgKSB7CisJCQlwcm9t
aXNlID0gdGVzdC5jYWxsYmFjay5jYWxsKCB0ZXN0LnRlc3RFbnZpcm9ubWVudCwgdGVzdC5hc3Nl
cnQgKTsKKwkJCXRlc3QucmVzb2x2ZVByb21pc2UoIHByb21pc2UgKTsKKwkJfQorCX0sCisKKwlh
ZnRlcjogZnVuY3Rpb24oKSB7CisJCWNoZWNrUG9sbHV0aW9uKCk7CisJfSwKKworCXF1ZXVlSG9v
azogZnVuY3Rpb24oIGhvb2ssIGhvb2tOYW1lICkgeworCQl2YXIgcHJvbWlzZSwKKwkJCXRlc3Qg
PSB0aGlzOworCQlyZXR1cm4gZnVuY3Rpb24gcnVuSG9vaygpIHsKKwkJCWNvbmZpZy5jdXJyZW50
ID0gdGVzdDsKKwkJCWlmICggY29uZmlnLm5vdHJ5Y2F0Y2ggKSB7CisJCQkJY2FsbEhvb2soKTsK
KwkJCQlyZXR1cm47CisJCQl9CisJCQl0cnkgeworCQkJCWNhbGxIb29rKCk7CisJCQl9IGNhdGNo
ICggZXJyb3IgKSB7CisJCQkJdGVzdC5wdXNoRmFpbHVyZSggaG9va05hbWUgKyAiIGZhaWxlZCBv
biAiICsgdGVzdC50ZXN0TmFtZSArICI6ICIgKworCQkJCSggZXJyb3IubWVzc2FnZSB8fCBlcnJv
ciApLCBleHRyYWN0U3RhY2t0cmFjZSggZXJyb3IsIDAgKSApOworCQkJfQorCisJCQlmdW5jdGlv
biBjYWxsSG9vaygpIHsKKwkJCQlwcm9taXNlID0gaG9vay5jYWxsKCB0ZXN0LnRlc3RFbnZpcm9u
bWVudCwgdGVzdC5hc3NlcnQgKTsKKwkJCQl0ZXN0LnJlc29sdmVQcm9taXNlKCBwcm9taXNlLCBo
b29rTmFtZSApOworCQkJfQorCQl9OworCX0sCisKKwkvLyBDdXJyZW50bHkgb25seSB1c2VkIGZv
ciBtb2R1bGUgbGV2ZWwgaG9va3MsIGNhbiBiZSB1c2VkIHRvIGFkZCBnbG9iYWwgbGV2ZWwgb25l
cworCWhvb2tzOiBmdW5jdGlvbiggaGFuZGxlciApIHsKKwkJdmFyIGhvb2tzID0gW107CisKKwkJ
ZnVuY3Rpb24gcHJvY2Vzc0hvb2tzKCB0ZXN0LCBtb2R1bGUgKSB7CisJCQlpZiAoIG1vZHVsZS5w
YXJlbnRNb2R1bGUgKSB7CisJCQkJcHJvY2Vzc0hvb2tzKCB0ZXN0LCBtb2R1bGUucGFyZW50TW9k
dWxlICk7CisJCQl9CisJCQlpZiAoIG1vZHVsZS50ZXN0RW52aXJvbm1lbnQgJiYKKwkJCQlRVW5p
dC5vYmplY3RUeXBlKCBtb2R1bGUudGVzdEVudmlyb25tZW50WyBoYW5kbGVyIF0gKSA9PT0gImZ1
bmN0aW9uIiApIHsKKwkJCQlob29rcy5wdXNoKCB0ZXN0LnF1ZXVlSG9vayggbW9kdWxlLnRlc3RF
bnZpcm9ubWVudFsgaGFuZGxlciBdLCBoYW5kbGVyICkgKTsKKwkJCX0KKwkJfQorCisJCS8vIEhv
b2tzIGFyZSBpZ25vcmVkIG9uIHNraXBwZWQgdGVzdHMKKwkJaWYgKCAhdGhpcy5za2lwICkgewor
CQkJcHJvY2Vzc0hvb2tzKCB0aGlzLCB0aGlzLm1vZHVsZSApOworCQl9CisJCXJldHVybiBob29r
czsKKwl9LAorCisJZmluaXNoOiBmdW5jdGlvbigpIHsKKwkJY29uZmlnLmN1cnJlbnQgPSB0aGlz
OworCQlpZiAoIGNvbmZpZy5yZXF1aXJlRXhwZWN0cyAmJiB0aGlzLmV4cGVjdGVkID09PSBudWxs
ICkgeworCQkJdGhpcy5wdXNoRmFpbHVyZSggIkV4cGVjdGVkIG51bWJlciBvZiBhc3NlcnRpb25z
IHRvIGJlIGRlZmluZWQsIGJ1dCBleHBlY3QoKSB3YXMgIiArCisJCQkJIm5vdCBjYWxsZWQuIiwg
dGhpcy5zdGFjayApOworCQl9IGVsc2UgaWYgKCB0aGlzLmV4cGVjdGVkICE9PSBudWxsICYmIHRo
aXMuZXhwZWN0ZWQgIT09IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGggKSB7CisJCQl0aGlzLnB1c2hG
YWlsdXJlKCAiRXhwZWN0ZWQgIiArIHRoaXMuZXhwZWN0ZWQgKyAiIGFzc2VydGlvbnMsIGJ1dCAi
ICsKKwkJCQl0aGlzLmFzc2VydGlvbnMubGVuZ3RoICsgIiB3ZXJlIHJ1biIsIHRoaXMuc3RhY2sg
KTsKKwkJfSBlbHNlIGlmICggdGhpcy5leHBlY3RlZCA9PT0gbnVsbCAmJiAhdGhpcy5hc3NlcnRp
b25zLmxlbmd0aCApIHsKKwkJCXRoaXMucHVzaEZhaWx1cmUoICJFeHBlY3RlZCBhdCBsZWFzdCBv
bmUgYXNzZXJ0aW9uLCBidXQgbm9uZSB3ZXJlIHJ1biAtIGNhbGwgIiArCisJCQkJImV4cGVjdCgw
KSB0byBhY2NlcHQgemVybyBhc3NlcnRpb25zLiIsIHRoaXMuc3RhY2sgKTsKKwkJfQorCisJCXZh
ciBpLAorCQkJYmFkID0gMDsKKworCQl0aGlzLnJ1bnRpbWUgPSBub3coKSAtIHRoaXMuc3RhcnRl
ZDsKKwkJY29uZmlnLnN0YXRzLmFsbCArPSB0aGlzLmFzc2VydGlvbnMubGVuZ3RoOworCQljb25m
aWcubW9kdWxlU3RhdHMuYWxsICs9IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGg7CisKKwkJZm9yICgg
aSA9IDA7IGkgPCB0aGlzLmFzc2VydGlvbnMubGVuZ3RoOyBpKysgKSB7CisJCQlpZiAoICF0aGlz
LmFzc2VydGlvbnNbIGkgXS5yZXN1bHQgKSB7CisJCQkJYmFkKys7CisJCQkJY29uZmlnLnN0YXRz
LmJhZCsrOworCQkJCWNvbmZpZy5tb2R1bGVTdGF0cy5iYWQrKzsKKwkJCX0KKwkJfQorCisJCXJ1
bkxvZ2dpbmdDYWxsYmFja3MoICJ0ZXN0RG9uZSIsIHsKKwkJCW5hbWU6IHRoaXMudGVzdE5hbWUs
CisJCQltb2R1bGU6IHRoaXMubW9kdWxlLm5hbWUsCisJCQlza2lwcGVkOiAhIXRoaXMuc2tpcCwK
KwkJCWZhaWxlZDogYmFkLAorCQkJcGFzc2VkOiB0aGlzLmFzc2VydGlvbnMubGVuZ3RoIC0gYmFk
LAorCQkJdG90YWw6IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGgsCisJCQlydW50aW1lOiB0aGlzLnJ1
bnRpbWUsCisKKwkJCS8vIEhUTUwgUmVwb3J0ZXIgdXNlCisJCQlhc3NlcnRpb25zOiB0aGlzLmFz
c2VydGlvbnMsCisJCQl0ZXN0SWQ6IHRoaXMudGVzdElkLAorCisJCQkvLyBTb3VyY2Ugb2YgVGVz
dAorCQkJc291cmNlOiB0aGlzLnN0YWNrLAorCisJCQkvLyBERVBSRUNBVEVEOiB0aGlzIHByb3Bl
cnR5IHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjAuMCwgdXNlIHJ1bnRpbWUgaW5zdGVhZAorCQkJZHVy
YXRpb246IHRoaXMucnVudGltZQorCQl9KTsKKworCQkvLyBRVW5pdC5yZXNldCgpIGlzIGRlcHJl
Y2F0ZWQgYW5kIHdpbGwgYmUgcmVwbGFjZWQgZm9yIGEgbmV3CisJCS8vIGZpeHR1cmUgcmVzZXQg
ZnVuY3Rpb24gb24gUVVuaXQgMi4wLzIuMS4KKwkJLy8gSXQncyBzdGlsbCBjYWxsZWQgaGVyZSBm
b3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaGFuZGxpbmcKKwkJUVVuaXQucmVzZXQoKTsKKwor
CQljb25maWcuY3VycmVudCA9IHVuZGVmaW5lZDsKKwl9LAorCisJcXVldWU6IGZ1bmN0aW9uKCkg
eworCQl2YXIgcHJpb3JpdHksCisJCQl0ZXN0ID0gdGhpczsKKworCQlpZiAoICF0aGlzLnZhbGlk
KCkgKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlmdW5jdGlvbiBydW4oKSB7CisKKwkJCS8vIGVh
Y2ggb2YgdGhlc2UgY2FuIGJ5IGFzeW5jCisJCQlzeW5jaHJvbml6ZShbCisJCQkJZnVuY3Rpb24o
KSB7CisJCQkJCXRlc3QuYmVmb3JlKCk7CisJCQkJfSwKKworCQkJCXRlc3QuaG9va3MoICJiZWZv
cmVFYWNoIiApLAorCQkJCWZ1bmN0aW9uKCkgeworCQkJCQl0ZXN0LnJ1bigpOworCQkJCX0sCisK
KwkJCQl0ZXN0Lmhvb2tzKCAiYWZ0ZXJFYWNoIiApLnJldmVyc2UoKSwKKworCQkJCWZ1bmN0aW9u
KCkgeworCQkJCQl0ZXN0LmFmdGVyKCk7CisJCQkJfSwKKwkJCQlmdW5jdGlvbigpIHsKKwkJCQkJ
dGVzdC5maW5pc2goKTsKKwkJCQl9CisJCQldKTsKKwkJfQorCisJCS8vIFByaW9yaXRpemUgcHJl
dmlvdXNseSBmYWlsZWQgdGVzdHMsIGRldGVjdGVkIGZyb20gc2Vzc2lvblN0b3JhZ2UKKwkJcHJp
b3JpdHkgPSBRVW5pdC5jb25maWcucmVvcmRlciAmJiBkZWZpbmVkLnNlc3Npb25TdG9yYWdlICYm
CisJCQkJK3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oICJxdW5pdC10ZXN0LSIgKyB0aGlzLm1vZHVs
ZS5uYW1lICsgIi0iICsgdGhpcy50ZXN0TmFtZSApOworCisJCXJldHVybiBzeW5jaHJvbml6ZSgg
cnVuLCBwcmlvcml0eSApOworCX0sCisKKwlwdXNoOiBmdW5jdGlvbiggcmVzdWx0LCBhY3R1YWws
IGV4cGVjdGVkLCBtZXNzYWdlLCBuZWdhdGl2ZSApIHsKKwkJdmFyIHNvdXJjZSwKKwkJCWRldGFp
bHMgPSB7CisJCQkJbW9kdWxlOiB0aGlzLm1vZHVsZS5uYW1lLAorCQkJCW5hbWU6IHRoaXMudGVz
dE5hbWUsCisJCQkJcmVzdWx0OiByZXN1bHQsCisJCQkJbWVzc2FnZTogbWVzc2FnZSwKKwkJCQlh
Y3R1YWw6IGFjdHVhbCwKKwkJCQlleHBlY3RlZDogZXhwZWN0ZWQsCisJCQkJdGVzdElkOiB0aGlz
LnRlc3RJZCwKKwkJCQluZWdhdGl2ZTogbmVnYXRpdmUgfHwgZmFsc2UsCisJCQkJcnVudGltZTog
bm93KCkgLSB0aGlzLnN0YXJ0ZWQKKwkJCX07CisKKwkJaWYgKCAhcmVzdWx0ICkgeworCQkJc291
cmNlID0gc291cmNlRnJvbVN0YWNrdHJhY2UoKTsKKworCQkJaWYgKCBzb3VyY2UgKSB7CisJCQkJ
ZGV0YWlscy5zb3VyY2UgPSBzb3VyY2U7CisJCQl9CisJCX0KKworCQlydW5Mb2dnaW5nQ2FsbGJh
Y2tzKCAibG9nIiwgZGV0YWlscyApOworCisJCXRoaXMuYXNzZXJ0aW9ucy5wdXNoKHsKKwkJCXJl
c3VsdDogISFyZXN1bHQsCisJCQltZXNzYWdlOiBtZXNzYWdlCisJCX0pOworCX0sCisKKwlwdXNo
RmFpbHVyZTogZnVuY3Rpb24oIG1lc3NhZ2UsIHNvdXJjZSwgYWN0dWFsICkgeworCQlpZiAoICEo
IHRoaXMgaW5zdGFuY2VvZiBUZXN0ICkgKSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoICJwdXNoRmFp
bHVyZSgpIGFzc2VydGlvbiBvdXRzaWRlIHRlc3QgY29udGV4dCwgd2FzICIgKworCQkJCXNvdXJj
ZUZyb21TdGFja3RyYWNlKCAyICkgKTsKKwkJfQorCisJCXZhciBkZXRhaWxzID0geworCQkJCW1v
ZHVsZTogdGhpcy5tb2R1bGUubmFtZSwKKwkJCQluYW1lOiB0aGlzLnRlc3ROYW1lLAorCQkJCXJl
c3VsdDogZmFsc2UsCisJCQkJbWVzc2FnZTogbWVzc2FnZSB8fCAiZXJyb3IiLAorCQkJCWFjdHVh
bDogYWN0dWFsIHx8IG51bGwsCisJCQkJdGVzdElkOiB0aGlzLnRlc3RJZCwKKwkJCQlydW50aW1l
OiBub3coKSAtIHRoaXMuc3RhcnRlZAorCQkJfTsKKworCQlpZiAoIHNvdXJjZSApIHsKKwkJCWRl
dGFpbHMuc291cmNlID0gc291cmNlOworCQl9CisKKwkJcnVuTG9nZ2luZ0NhbGxiYWNrcyggImxv
ZyIsIGRldGFpbHMgKTsKKworCQl0aGlzLmFzc2VydGlvbnMucHVzaCh7CisJCQlyZXN1bHQ6IGZh
bHNlLAorCQkJbWVzc2FnZTogbWVzc2FnZQorCQl9KTsKKwl9LAorCisJcmVzb2x2ZVByb21pc2U6
IGZ1bmN0aW9uKCBwcm9taXNlLCBwaGFzZSApIHsKKwkJdmFyIHRoZW4sIG1lc3NhZ2UsCisJCQl0
ZXN0ID0gdGhpczsKKwkJaWYgKCBwcm9taXNlICE9IG51bGwgKSB7CisJCQl0aGVuID0gcHJvbWlz
ZS50aGVuOworCQkJaWYgKCBRVW5pdC5vYmplY3RUeXBlKCB0aGVuICkgPT09ICJmdW5jdGlvbiIg
KSB7CisJCQkJUVVuaXQuc3RvcCgpOworCQkJCXRoZW4uY2FsbCgKKwkJCQkJcHJvbWlzZSwKKwkJ
CQkJZnVuY3Rpb24oKSB7IFFVbml0LnN0YXJ0KCk7IH0sCisJCQkJCWZ1bmN0aW9uKCBlcnJvciAp
IHsKKwkJCQkJCW1lc3NhZ2UgPSAiUHJvbWlzZSByZWplY3RlZCAiICsKKwkJCQkJCQkoICFwaGFz
ZSA/ICJkdXJpbmciIDogcGhhc2UucmVwbGFjZSggL0VhY2gkLywgIiIgKSApICsKKwkJCQkJCQki
ICIgKyB0ZXN0LnRlc3ROYW1lICsgIjogIiArICggZXJyb3IubWVzc2FnZSB8fCBlcnJvciApOwor
CQkJCQkJdGVzdC5wdXNoRmFpbHVyZSggbWVzc2FnZSwgZXh0cmFjdFN0YWNrdHJhY2UoIGVycm9y
LCAwICkgKTsKKworCQkJCQkJLy8gZWxzZSBuZXh0IHRlc3Qgd2lsbCBjYXJyeSB0aGUgcmVzcG9u
c2liaWxpdHkKKwkJCQkJCXNhdmVHbG9iYWwoKTsKKworCQkJCQkJLy8gVW5ibG9jaworCQkJCQkJ
UVVuaXQuc3RhcnQoKTsKKwkJCQkJfQorCQkJCSk7CisJCQl9CisJCX0KKwl9LAorCisJdmFsaWQ6
IGZ1bmN0aW9uKCkgeworCQl2YXIgaW5jbHVkZSwKKwkJCWZpbHRlciA9IGNvbmZpZy5maWx0ZXIg
JiYgY29uZmlnLmZpbHRlci50b0xvd2VyQ2FzZSgpLAorCQkJbW9kdWxlID0gUVVuaXQudXJsUGFy
YW1zLm1vZHVsZSAmJiBRVW5pdC51cmxQYXJhbXMubW9kdWxlLnRvTG93ZXJDYXNlKCksCisJCQlm
dWxsTmFtZSA9ICggdGhpcy5tb2R1bGUubmFtZSArICI6ICIgKyB0aGlzLnRlc3ROYW1lICkudG9M
b3dlckNhc2UoKTsKKworCQlmdW5jdGlvbiB0ZXN0SW5Nb2R1bGVDaGFpbiggdGVzdE1vZHVsZSAp
IHsKKwkJCXZhciB0ZXN0TW9kdWxlTmFtZSA9IHRlc3RNb2R1bGUubmFtZSA/IHRlc3RNb2R1bGUu
bmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDsKKwkJCWlmICggdGVzdE1vZHVsZU5hbWUgPT09IG1v
ZHVsZSApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoIHRlc3RNb2R1bGUucGFy
ZW50TW9kdWxlICkgeworCQkJCXJldHVybiB0ZXN0SW5Nb2R1bGVDaGFpbiggdGVzdE1vZHVsZS5w
YXJlbnRNb2R1bGUgKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9
CisKKwkJLy8gSW50ZXJuYWxseS1nZW5lcmF0ZWQgdGVzdHMgYXJlIGFsd2F5cyB2YWxpZAorCQlp
ZiAoIHRoaXMuY2FsbGJhY2sgJiYgdGhpcy5jYWxsYmFjay52YWxpZFRlc3QgKSB7CisJCQlyZXR1
cm4gdHJ1ZTsKKwkJfQorCisJCWlmICggY29uZmlnLnRlc3RJZC5sZW5ndGggPiAwICYmIGluQXJy
YXkoIHRoaXMudGVzdElkLCBjb25maWcudGVzdElkICkgPCAwICkgeworCQkJcmV0dXJuIGZhbHNl
OworCQl9CisKKwkJaWYgKCBtb2R1bGUgJiYgIXRlc3RJbk1vZHVsZUNoYWluKCB0aGlzLm1vZHVs
ZSApICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCAhZmlsdGVyICkgeworCQkJ
cmV0dXJuIHRydWU7CisJCX0KKworCQlpbmNsdWRlID0gZmlsdGVyLmNoYXJBdCggMCApICE9PSAi
ISI7CisJCWlmICggIWluY2x1ZGUgKSB7CisJCQlmaWx0ZXIgPSBmaWx0ZXIuc2xpY2UoIDEgKTsK
KwkJfQorCisJCS8vIElmIHRoZSBmaWx0ZXIgbWF0Y2hlcywgd2UgbmVlZCB0byBob25vdXIgaW5j
bHVkZQorCQlpZiAoIGZ1bGxOYW1lLmluZGV4T2YoIGZpbHRlciApICE9PSAtMSApIHsKKwkJCXJl
dHVybiBpbmNsdWRlOworCQl9CisKKwkJLy8gT3RoZXJ3aXNlLCBkbyB0aGUgb3Bwb3NpdGUKKwkJ
cmV0dXJuICFpbmNsdWRlOworCX0KK307CisKKy8vIFJlc2V0cyB0aGUgdGVzdCBzZXR1cC4gVXNl
ZnVsIGZvciB0ZXN0cyB0aGF0IG1vZGlmeSB0aGUgRE9NLgorLyoKK0RFUFJFQ0FURUQ6IFVzZSBt
dWx0aXBsZSB0ZXN0cyBpbnN0ZWFkIG9mIHJlc2V0dGluZyBpbnNpZGUgYSB0ZXN0LgorVXNlIHRl
c3RTdGFydCBvciB0ZXN0RG9uZSBmb3IgY3VzdG9tIGNsZWFudXAuCitUaGlzIG1ldGhvZCB3aWxs
IHRocm93IGFuIGVycm9yIGluIDIuMCwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjEKKyovCitR
VW5pdC5yZXNldCA9IGZ1bmN0aW9uKCkgeworCisJLy8gUmV0dXJuIG9uIG5vbi1icm93c2VyIGVu
dmlyb25tZW50cworCS8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG5vdCBicmVhayBvbiBub2RlIHRl
c3RzCisJaWYgKCAhZGVmaW5lZC5kb2N1bWVudCApIHsKKwkJcmV0dXJuOworCX0KKworCXZhciBm
aXh0dXJlID0gZGVmaW5lZC5kb2N1bWVudCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCAmJgor
CQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICJxdW5pdC1maXh0dXJlIiApOworCisJaWYgKCBm
aXh0dXJlICkgeworCQlmaXh0dXJlLmlubmVySFRNTCA9IGNvbmZpZy5maXh0dXJlOworCX0KK307
CisKK1FVbml0LnB1c2hGYWlsdXJlID0gZnVuY3Rpb24oKSB7CisJaWYgKCAhUVVuaXQuY29uZmln
LmN1cnJlbnQgKSB7CisJCXRocm93IG5ldyBFcnJvciggInB1c2hGYWlsdXJlKCkgYXNzZXJ0aW9u
IG91dHNpZGUgdGVzdCBjb250ZXh0LCBpbiAiICsKKwkJCXNvdXJjZUZyb21TdGFja3RyYWNlKCAy
ICkgKTsKKwl9CisKKwkvLyBHZXRzIGN1cnJlbnQgdGVzdCBvYmoKKwl2YXIgY3VycmVudFRlc3Qg
PSBRVW5pdC5jb25maWcuY3VycmVudDsKKworCXJldHVybiBjdXJyZW50VGVzdC5wdXNoRmFpbHVy
ZS5hcHBseSggY3VycmVudFRlc3QsIGFyZ3VtZW50cyApOworfTsKKworLy8gQmFzZWQgb24gSmF2
YSdzIFN0cmluZy5oYXNoQ29kZSwgYSBzaW1wbGUgYnV0IG5vdAorLy8gcmlnb3JvdXNseSBjb2xs
aXNpb24gcmVzaXN0YW50IGhhc2hpbmcgZnVuY3Rpb24KK2Z1bmN0aW9uIGdlbmVyYXRlSGFzaCgg
bW9kdWxlLCB0ZXN0TmFtZSApIHsKKwl2YXIgaGV4LAorCQlpID0gMCwKKwkJaGFzaCA9IDAsCisJ
CXN0ciA9IG1vZHVsZSArICJceDFDIiArIHRlc3ROYW1lLAorCQlsZW4gPSBzdHIubGVuZ3RoOwor
CisJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CisJCWhhc2ggID0gKCAoIGhhc2ggPDwgNSApIC0g
aGFzaCApICsgc3RyLmNoYXJDb2RlQXQoIGkgKTsKKwkJaGFzaCB8PSAwOworCX0KKworCS8vIENv
bnZlcnQgdGhlIHBvc3NpYmx5IG5lZ2F0aXZlIGludGVnZXIgaGFzaCBjb2RlIGludG8gYW4gOCBj
aGFyYWN0ZXIgaGV4IHN0cmluZywgd2hpY2ggaXNuJ3QKKwkvLyBzdHJpY3RseSBuZWNlc3Nhcnkg
YnV0IGluY3JlYXNlcyB1c2VyIHVuZGVyc3RhbmRpbmcgdGhhdCB0aGUgaWQgaXMgYSBTSEEtbGlr
ZSBoYXNoCisJaGV4ID0gKCAweDEwMDAwMDAwMCArIGhhc2ggKS50b1N0cmluZyggMTYgKTsKKwlp
ZiAoIGhleC5sZW5ndGggPCA4ICkgeworCQloZXggPSAiMDAwMDAwMCIgKyBoZXg7CisJfQorCisJ
cmV0dXJuIGhleC5zbGljZSggLTggKTsKK30KKworZnVuY3Rpb24gc3luY2hyb25pemUoIGNhbGxi
YWNrLCBwcmlvcml0eSApIHsKKwl2YXIgbGFzdCA9ICFwcmlvcml0eTsKKworCWlmICggUVVuaXQu
b2JqZWN0VHlwZSggY2FsbGJhY2sgKSA9PT0gImFycmF5IiApIHsKKwkJd2hpbGUgKCBjYWxsYmFj
ay5sZW5ndGggKSB7CisJCQlzeW5jaHJvbml6ZSggY2FsbGJhY2suc2hpZnQoKSApOworCQl9CisJ
CXJldHVybjsKKwl9CisKKwlpZiAoIHByaW9yaXR5ICkgeworCQlwcmlvcml0eUZpbGwoIGNhbGxi
YWNrICk7CisJfSBlbHNlIHsKKwkJY29uZmlnLnF1ZXVlLnB1c2goIGNhbGxiYWNrICk7CisJfQor
CisJaWYgKCBjb25maWcuYXV0b3J1biAmJiAhY29uZmlnLmJsb2NraW5nICkgeworCQlwcm9jZXNz
KCBsYXN0ICk7CisJfQorfQorCisvLyBQbGFjZSBwcmV2aW91c2x5IGZhaWxlZCB0ZXN0cyBvbiBh
IHF1ZXVlIHByaW9yaXR5IGxpbmUsIHJlc3BlY3RpbmcgdGhlIG9yZGVyIHRoZXkgZ2V0IGFzc2ln
bmVkLgorZnVuY3Rpb24gcHJpb3JpdHlGaWxsKCBjYWxsYmFjayApIHsKKwl2YXIgcXVldWUsIHBy
aW9yaXRpemVkUXVldWU7CisKKwlxdWV1ZSA9IGNvbmZpZy5xdWV1ZS5zbGljZSggcHJpb3JpdHlG
aWxsLnBvcyApOworCXByaW9yaXRpemVkUXVldWUgPSBjb25maWcucXVldWUuc2xpY2UoIDAsIC1j
b25maWcucXVldWUubGVuZ3RoICsgcHJpb3JpdHlGaWxsLnBvcyApOworCisJcXVldWUudW5zaGlm
dCggY2FsbGJhY2sgKTsKKwlxdWV1ZS51bnNoaWZ0LmFwcGx5KCBxdWV1ZSwgcHJpb3JpdGl6ZWRR
dWV1ZSApOworCisJY29uZmlnLnF1ZXVlID0gcXVldWU7CisKKwlwcmlvcml0eUZpbGwucG9zICs9
IDE7Cit9Citwcmlvcml0eUZpbGwucG9zID0gMDsKKworZnVuY3Rpb24gc2F2ZUdsb2JhbCgpIHsK
Kwljb25maWcucG9sbHV0aW9uID0gW107CisKKwlpZiAoIGNvbmZpZy5ub2dsb2JhbHMgKSB7CisJ
CWZvciAoIHZhciBrZXkgaW4gZ2xvYmFsICkgeworCQkJaWYgKCBoYXNPd24uY2FsbCggZ2xvYmFs
LCBrZXkgKSApIHsKKworCQkJCS8vIGluIE9wZXJhIHNvbWV0aW1lcyBET00gZWxlbWVudCBpZHMg
c2hvdyB1cCBoZXJlLCBpZ25vcmUgdGhlbQorCQkJCWlmICggL15xdW5pdC10ZXN0LW91dHB1dC8u
dGVzdCgga2V5ICkgKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQljb25maWcucG9sbHV0
aW9uLnB1c2goIGtleSApOworCQkJfQorCQl9CisJfQorfQorCitmdW5jdGlvbiBjaGVja1BvbGx1
dGlvbigpIHsKKwl2YXIgbmV3R2xvYmFscywKKwkJZGVsZXRlZEdsb2JhbHMsCisJCW9sZCA9IGNv
bmZpZy5wb2xsdXRpb247CisKKwlzYXZlR2xvYmFsKCk7CisKKwluZXdHbG9iYWxzID0gZGlmZigg
Y29uZmlnLnBvbGx1dGlvbiwgb2xkICk7CisJaWYgKCBuZXdHbG9iYWxzLmxlbmd0aCA+IDAgKSB7
CisJCVFVbml0LnB1c2hGYWlsdXJlKCAiSW50cm9kdWNlZCBnbG9iYWwgdmFyaWFibGUocyk6ICIg
KyBuZXdHbG9iYWxzLmpvaW4oICIsICIgKSApOworCX0KKworCWRlbGV0ZWRHbG9iYWxzID0gZGlm
Ziggb2xkLCBjb25maWcucG9sbHV0aW9uICk7CisJaWYgKCBkZWxldGVkR2xvYmFscy5sZW5ndGgg
PiAwICkgeworCQlRVW5pdC5wdXNoRmFpbHVyZSggIkRlbGV0ZWQgZ2xvYmFsIHZhcmlhYmxlKHMp
OiAiICsgZGVsZXRlZEdsb2JhbHMuam9pbiggIiwgIiApICk7CisJfQorfQorCisvLyBXaWxsIGJl
IGV4cG9zZWQgYXMgUVVuaXQuYXN5bmNUZXN0CitmdW5jdGlvbiBhc3luY1Rlc3QoIHRlc3ROYW1l
LCBleHBlY3RlZCwgY2FsbGJhY2sgKSB7CisJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyICkg
eworCQljYWxsYmFjayA9IGV4cGVjdGVkOworCQlleHBlY3RlZCA9IG51bGw7CisJfQorCisJUVVu
aXQudGVzdCggdGVzdE5hbWUsIGV4cGVjdGVkLCBjYWxsYmFjaywgdHJ1ZSApOworfQorCisvLyBX
aWxsIGJlIGV4cG9zZWQgYXMgUVVuaXQudGVzdAorZnVuY3Rpb24gdGVzdCggdGVzdE5hbWUsIGV4
cGVjdGVkLCBjYWxsYmFjaywgYXN5bmMgKSB7CisJaWYgKCBmb2N1c2VkICkgIHsgcmV0dXJuOyB9
CisKKwl2YXIgbmV3VGVzdDsKKworCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMiApIHsKKwkJ
Y2FsbGJhY2sgPSBleHBlY3RlZDsKKwkJZXhwZWN0ZWQgPSBudWxsOworCX0KKworCW5ld1Rlc3Qg
PSBuZXcgVGVzdCh7CisJCXRlc3ROYW1lOiB0ZXN0TmFtZSwKKwkJZXhwZWN0ZWQ6IGV4cGVjdGVk
LAorCQlhc3luYzogYXN5bmMsCisJCWNhbGxiYWNrOiBjYWxsYmFjaworCX0pOworCisJbmV3VGVz
dC5xdWV1ZSgpOworfQorCisvLyBXaWxsIGJlIGV4cG9zZWQgYXMgUVVuaXQuc2tpcAorZnVuY3Rp
b24gc2tpcCggdGVzdE5hbWUgKSB7CisJaWYgKCBmb2N1c2VkICkgIHsgcmV0dXJuOyB9CisKKwl2
YXIgdGVzdCA9IG5ldyBUZXN0KHsKKwkJdGVzdE5hbWU6IHRlc3ROYW1lLAorCQlza2lwOiB0cnVl
CisJfSk7CisKKwl0ZXN0LnF1ZXVlKCk7Cit9CisKKy8vIFdpbGwgYmUgZXhwb3NlZCBhcyBRVW5p
dC5vbmx5CitmdW5jdGlvbiBvbmx5KCB0ZXN0TmFtZSwgZXhwZWN0ZWQsIGNhbGxiYWNrLCBhc3lu
YyApIHsKKwl2YXIgbmV3VGVzdDsKKworCWlmICggZm9jdXNlZCApICB7IHJldHVybjsgfQorCisJ
UVVuaXQuY29uZmlnLnF1ZXVlLmxlbmd0aCA9IDA7CisJZm9jdXNlZCA9IHRydWU7CisKKwlpZiAo
IGFyZ3VtZW50cy5sZW5ndGggPT09IDIgKSB7CisJCWNhbGxiYWNrID0gZXhwZWN0ZWQ7CisJCWV4
cGVjdGVkID0gbnVsbDsKKwl9CisKKwluZXdUZXN0ID0gbmV3IFRlc3QoeworCQl0ZXN0TmFtZTog
dGVzdE5hbWUsCisJCWV4cGVjdGVkOiBleHBlY3RlZCwKKwkJYXN5bmM6IGFzeW5jLAorCQljYWxs
YmFjazogY2FsbGJhY2sKKwl9KTsKKworCW5ld1Rlc3QucXVldWUoKTsKK30KKworZnVuY3Rpb24g
QXNzZXJ0KCB0ZXN0Q29udGV4dCApIHsKKwl0aGlzLnRlc3QgPSB0ZXN0Q29udGV4dDsKK30KKwor
Ly8gQXNzZXJ0IGhlbHBlcnMKK1FVbml0LmFzc2VydCA9IEFzc2VydC5wcm90b3R5cGUgPSB7CisK
KwkvLyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgYXNzZXJ0aW9ucyB0byBndWFyYW50
ZWUgdGhhdCBmYWlsZWQgdGVzdAorCS8vIChubyBhc3NlcnRpb25zIGFyZSBydW4gYXQgYWxsKSBk
b24ndCBzbGlwIHRocm91Z2guCisJZXhwZWN0OiBmdW5jdGlvbiggYXNzZXJ0cyApIHsKKwkJaWYg
KCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgeworCQkJdGhpcy50ZXN0LmV4cGVjdGVkID0gYXNz
ZXJ0czsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnRlc3QuZXhwZWN0ZWQ7CisJCX0KKwl9
LAorCisJLy8gSW5jcmVtZW50IHRoaXMgVGVzdCdzIHNlbWFwaG9yZSBjb3VudGVyLCB0aGVuIHJl
dHVybiBhIGZ1bmN0aW9uIHRoYXQKKwkvLyBkZWNyZW1lbnRzIHRoYXQgY291bnRlciBhIG1heGlt
dW0gb2Ygb25jZS4KKwlhc3luYzogZnVuY3Rpb24oIGNvdW50ICkgeworCQl2YXIgdGVzdCA9IHRo
aXMudGVzdCwKKwkJCXBvcHBlZCA9IGZhbHNlLAorCQkJYWNjZXB0Q2FsbENvdW50ID0gY291bnQ7
CisKKwkJaWYgKCB0eXBlb2YgYWNjZXB0Q2FsbENvdW50ID09PSAidW5kZWZpbmVkIiApIHsKKwkJ
CWFjY2VwdENhbGxDb3VudCA9IDE7CisJCX0KKworCQl0ZXN0LnNlbWFwaG9yZSArPSAxOworCQl0
ZXN0LnVzZWRBc3luYyA9IHRydWU7CisJCXBhdXNlUHJvY2Vzc2luZygpOworCisJCXJldHVybiBm
dW5jdGlvbiBkb25lKCkgeworCisJCQlpZiAoIHBvcHBlZCApIHsKKwkJCQl0ZXN0LnB1c2hGYWls
dXJlKCAiVG9vIG1hbnkgY2FsbHMgdG8gdGhlIGBhc3NlcnQuYXN5bmNgIGNhbGxiYWNrIiwKKwkJ
CQkJc291cmNlRnJvbVN0YWNrdHJhY2UoIDIgKSApOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWFj
Y2VwdENhbGxDb3VudCAtPSAxOworCQkJaWYgKCBhY2NlcHRDYWxsQ291bnQgPiAwICkgeworCQkJ
CXJldHVybjsKKwkJCX0KKworCQkJdGVzdC5zZW1hcGhvcmUgLT0gMTsKKwkJCXBvcHBlZCA9IHRy
dWU7CisJCQlyZXN1bWVQcm9jZXNzaW5nKCk7CisJCX07CisJfSwKKworCS8vIEV4cG9ydHMgdGVz
dC5wdXNoKCkgdG8gdGhlIHVzZXIgQVBJCisJcHVzaDogZnVuY3Rpb24oIC8qIHJlc3VsdCwgYWN0
dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgbmVnYXRpdmUgKi8gKSB7CisJCXZhciBhc3NlcnQgPSB0
aGlzLAorCQkJY3VycmVudFRlc3QgPSAoIGFzc2VydCBpbnN0YW5jZW9mIEFzc2VydCAmJiBhc3Nl
cnQudGVzdCApIHx8IFFVbml0LmNvbmZpZy5jdXJyZW50OworCisJCS8vIEJhY2t3YXJkcyBjb21w
YXRpYmlsaXR5IGZpeC4KKwkJLy8gQWxsb3dzIHRoZSBkaXJlY3QgdXNlIG9mIGdsb2JhbCBleHBv
cnRlZCBhc3NlcnRpb25zIGFuZCBRVW5pdC5hc3NlcnQuKgorCQkvLyBBbHRob3VnaCwgaXQncyB1
c2UgaXMgbm90IHJlY29tbWVuZGVkIGFzIGl0IGNhbiBsZWFrIGFzc2VydGlvbnMKKwkJLy8gdG8g
b3RoZXIgdGVzdHMgZnJvbSBhc3luYyB0ZXN0cywgYmVjYXVzZSB3ZSBvbmx5IGdldCBhIHJlZmVy
ZW5jZSB0byB0aGUgY3VycmVudCB0ZXN0LAorCQkvLyBub3QgZXhhY3RseSB0aGUgdGVzdCB3aGVy
ZSBhc3NlcnRpb24gd2VyZSBpbnRlbmRlZCB0byBiZSBjYWxsZWQuCisJCWlmICggIWN1cnJlbnRU
ZXN0ICkgeworCQkJdGhyb3cgbmV3IEVycm9yKCAiYXNzZXJ0aW9uIG91dHNpZGUgdGVzdCBjb250
ZXh0LCBpbiAiICsgc291cmNlRnJvbVN0YWNrdHJhY2UoIDIgKSApOworCQl9CisKKwkJaWYgKCBj
dXJyZW50VGVzdC51c2VkQXN5bmMgPT09IHRydWUgJiYgY3VycmVudFRlc3Quc2VtYXBob3JlID09
PSAwICkgeworCQkJY3VycmVudFRlc3QucHVzaEZhaWx1cmUoICJBc3NlcnRpb24gYWZ0ZXIgdGhl
IGZpbmFsIGBhc3NlcnQuYXN5bmNgIHdhcyByZXNvbHZlZCIsCisJCQkJc291cmNlRnJvbVN0YWNr
dHJhY2UoIDIgKSApOworCisJCQkvLyBBbGxvdyB0aGlzIGFzc2VydGlvbiB0byBjb250aW51ZSBy
dW5uaW5nIGFueXdheS4uLgorCQl9CisKKwkJaWYgKCAhKCBhc3NlcnQgaW5zdGFuY2VvZiBBc3Nl
cnQgKSApIHsKKwkJCWFzc2VydCA9IGN1cnJlbnRUZXN0LmFzc2VydDsKKwkJfQorCQlyZXR1cm4g
YXNzZXJ0LnRlc3QucHVzaC5hcHBseSggYXNzZXJ0LnRlc3QsIGFyZ3VtZW50cyApOworCX0sCisK
KwlvazogZnVuY3Rpb24oIHJlc3VsdCwgbWVzc2FnZSApIHsKKwkJbWVzc2FnZSA9IG1lc3NhZ2Ug
fHwgKCByZXN1bHQgPyAib2theSIgOiAiZmFpbGVkLCBleHBlY3RlZCBhcmd1bWVudCB0byBiZSB0
cnV0aHksIHdhczogIiArCisJCQlRVW5pdC5kdW1wLnBhcnNlKCByZXN1bHQgKSApOworCQl0aGlz
LnB1c2goICEhcmVzdWx0LCByZXN1bHQsIHRydWUsIG1lc3NhZ2UgKTsKKwl9LAorCisJbm90T2s6
IGZ1bmN0aW9uKCByZXN1bHQsIG1lc3NhZ2UgKSB7CisJCW1lc3NhZ2UgPSBtZXNzYWdlIHx8ICgg
IXJlc3VsdCA/ICJva2F5IiA6ICJmYWlsZWQsIGV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIGZhbHN5
LCB3YXM6ICIgKworCQkJUVVuaXQuZHVtcC5wYXJzZSggcmVzdWx0ICkgKTsKKwkJdGhpcy5wdXNo
KCAhcmVzdWx0LCByZXN1bHQsIGZhbHNlLCBtZXNzYWdlLCB0cnVlICk7CisJfSwKKworCWVxdWFs
OiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJLypqc2hpbnQgZXFl
cWVxOmZhbHNlICovCisJCXRoaXMucHVzaCggZXhwZWN0ZWQgPT0gYWN0dWFsLCBhY3R1YWwsIGV4
cGVjdGVkLCBtZXNzYWdlICk7CisJfSwKKworCW5vdEVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBl
eHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJLypqc2hpbnQgZXFlcWVxOmZhbHNlICovCisJCXRoaXMu
cHVzaCggZXhwZWN0ZWQgIT0gYWN0dWFsLCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCB0cnVl
ICk7CisJfSwKKworCXByb3BFcXVhbDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3Nh
Z2UgKSB7CisJCWFjdHVhbCA9IG9iamVjdFZhbHVlcyggYWN0dWFsICk7CisJCWV4cGVjdGVkID0g
b2JqZWN0VmFsdWVzKCBleHBlY3RlZCApOworCQl0aGlzLnB1c2goIFFVbml0LmVxdWl2KCBhY3R1
YWwsIGV4cGVjdGVkICksIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKTsKKwl9LAorCisJbm90
UHJvcEVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJYWN0
dWFsID0gb2JqZWN0VmFsdWVzKCBhY3R1YWwgKTsKKwkJZXhwZWN0ZWQgPSBvYmplY3RWYWx1ZXMo
IGV4cGVjdGVkICk7CisJCXRoaXMucHVzaCggIVFVbml0LmVxdWl2KCBhY3R1YWwsIGV4cGVjdGVk
ICksIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIHRydWUgKTsKKwl9LAorCisJZGVlcEVxdWFs
OiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJdGhpcy5wdXNoKCBR
VW5pdC5lcXVpdiggYWN0dWFsLCBleHBlY3RlZCApLCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdl
ICk7CisJfSwKKworCW5vdERlZXBFcXVhbDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0ZWQsIG1l
c3NhZ2UgKSB7CisJCXRoaXMucHVzaCggIVFVbml0LmVxdWl2KCBhY3R1YWwsIGV4cGVjdGVkICks
IGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIHRydWUgKTsKKwl9LAorCisJc3RyaWN0RXF1YWw6
IGZ1bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQl0aGlzLnB1c2goIGV4
cGVjdGVkID09PSBhY3R1YWwsIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKTsKKwl9LAorCisJ
bm90U3RyaWN0RXF1YWw6IGZ1bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgewor
CQl0aGlzLnB1c2goIGV4cGVjdGVkICE9PSBhY3R1YWwsIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3Nh
Z2UsIHRydWUgKTsKKwl9LAorCisJInRocm93cyI6IGZ1bmN0aW9uKCBibG9jaywgZXhwZWN0ZWQs
IG1lc3NhZ2UgKSB7CisJCXZhciBhY3R1YWwsIGV4cGVjdGVkVHlwZSwKKwkJCWV4cGVjdGVkT3V0
cHV0ID0gZXhwZWN0ZWQsCisJCQlvayA9IGZhbHNlLAorCQkJY3VycmVudFRlc3QgPSAoIHRoaXMg
aW5zdGFuY2VvZiBBc3NlcnQgJiYgdGhpcy50ZXN0ICkgfHwgUVVuaXQuY29uZmlnLmN1cnJlbnQ7
CisKKwkJLy8gJ2V4cGVjdGVkJyBpcyBvcHRpb25hbCB1bmxlc3MgZG9pbmcgc3RyaW5nIGNvbXBh
cmlzb24KKwkJaWYgKCBtZXNzYWdlID09IG51bGwgJiYgdHlwZW9mIGV4cGVjdGVkID09PSAic3Ry
aW5nIiApIHsKKwkJCW1lc3NhZ2UgPSBleHBlY3RlZDsKKwkJCWV4cGVjdGVkID0gbnVsbDsKKwkJ
fQorCisJCWN1cnJlbnRUZXN0Lmlnbm9yZUdsb2JhbEVycm9ycyA9IHRydWU7CisJCXRyeSB7CisJ
CQlibG9jay5jYWxsKCBjdXJyZW50VGVzdC50ZXN0RW52aXJvbm1lbnQgKTsKKwkJfSBjYXRjaCAo
ZSkgeworCQkJYWN0dWFsID0gZTsKKwkJfQorCQljdXJyZW50VGVzdC5pZ25vcmVHbG9iYWxFcnJv
cnMgPSBmYWxzZTsKKworCQlpZiAoIGFjdHVhbCApIHsKKwkJCWV4cGVjdGVkVHlwZSA9IFFVbml0
Lm9iamVjdFR5cGUoIGV4cGVjdGVkICk7CisKKwkJCS8vIHdlIGRvbid0IHdhbnQgdG8gdmFsaWRh
dGUgdGhyb3duIGVycm9yCisJCQlpZiAoICFleHBlY3RlZCApIHsKKwkJCQlvayA9IHRydWU7CisJ
CQkJZXhwZWN0ZWRPdXRwdXQgPSBudWxsOworCisJCQkvLyBleHBlY3RlZCBpcyBhIHJlZ2V4cAor
CQkJfSBlbHNlIGlmICggZXhwZWN0ZWRUeXBlID09PSAicmVnZXhwIiApIHsKKwkJCQlvayA9IGV4
cGVjdGVkLnRlc3QoIGVycm9yU3RyaW5nKCBhY3R1YWwgKSApOworCisJCQkvLyBleHBlY3RlZCBp
cyBhIHN0cmluZworCQkJfSBlbHNlIGlmICggZXhwZWN0ZWRUeXBlID09PSAic3RyaW5nIiApIHsK
KwkJCQlvayA9IGV4cGVjdGVkID09PSBlcnJvclN0cmluZyggYWN0dWFsICk7CisKKwkJCS8vIGV4
cGVjdGVkIGlzIGEgY29uc3RydWN0b3IsIG1heWJlIGFuIEVycm9yIGNvbnN0cnVjdG9yCisJCQl9
IGVsc2UgaWYgKCBleHBlY3RlZFR5cGUgPT09ICJmdW5jdGlvbiIgJiYgYWN0dWFsIGluc3RhbmNl
b2YgZXhwZWN0ZWQgKSB7CisJCQkJb2sgPSB0cnVlOworCisJCQkvLyBleHBlY3RlZCBpcyBhbiBF
cnJvciBvYmplY3QKKwkJCX0gZWxzZSBpZiAoIGV4cGVjdGVkVHlwZSA9PT0gIm9iamVjdCIgKSB7
CisJCQkJb2sgPSBhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZC5jb25zdHJ1Y3RvciAmJgorCQkJ
CQlhY3R1YWwubmFtZSA9PT0gZXhwZWN0ZWQubmFtZSAmJgorCQkJCQlhY3R1YWwubWVzc2FnZSA9
PT0gZXhwZWN0ZWQubWVzc2FnZTsKKworCQkJLy8gZXhwZWN0ZWQgaXMgYSB2YWxpZGF0aW9uIGZ1
bmN0aW9uIHdoaWNoIHJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0aW9uIHBhc3NlZAorCQkJfSBlbHNl
IGlmICggZXhwZWN0ZWRUeXBlID09PSAiZnVuY3Rpb24iICYmIGV4cGVjdGVkLmNhbGwoIHt9LCBh
Y3R1YWwgKSA9PT0gdHJ1ZSApIHsKKwkJCQlleHBlY3RlZE91dHB1dCA9IG51bGw7CisJCQkJb2sg
PSB0cnVlOworCQkJfQorCQl9CisKKwkJY3VycmVudFRlc3QuYXNzZXJ0LnB1c2goIG9rLCBhY3R1
YWwsIGV4cGVjdGVkT3V0cHV0LCBtZXNzYWdlICk7CisJfQorfTsKKworLy8gUHJvdmlkZSBhbiBh
bHRlcm5hdGl2ZSB0byBhc3NlcnQudGhyb3dzKCksIGZvciBlbnZpcm9ubWVudHMgdGhhdCBjb25z
aWRlciB0aHJvd3MgYSByZXNlcnZlZCB3b3JkCisvLyBLbm93biB0byB1cyBhcmU6IENsb3N1cmUg
Q29tcGlsZXIsIE5hcndoYWwKKyhmdW5jdGlvbigpIHsKKwkvKmpzaGludCBzdWI6dHJ1ZSAqLwor
CUFzc2VydC5wcm90b3R5cGUucmFpc2VzID0gQXNzZXJ0LnByb3RvdHlwZVsgInRocm93cyIgXTsK
K30oKSk7CisKK2Z1bmN0aW9uIGVycm9yU3RyaW5nKCBlcnJvciApIHsKKwl2YXIgbmFtZSwgbWVz
c2FnZSwKKwkJcmVzdWx0RXJyb3JTdHJpbmcgPSBlcnJvci50b1N0cmluZygpOworCWlmICggcmVz
dWx0RXJyb3JTdHJpbmcuc3Vic3RyaW5nKCAwLCA3ICkgPT09ICJbb2JqZWN0IiApIHsKKwkJbmFt
ZSA9IGVycm9yLm5hbWUgPyBlcnJvci5uYW1lLnRvU3RyaW5nKCkgOiAiRXJyb3IiOworCQltZXNz
YWdlID0gZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UudG9TdHJpbmcoKSA6ICIiOworCQlp
ZiAoIG5hbWUgJiYgbWVzc2FnZSApIHsKKwkJCXJldHVybiBuYW1lICsgIjogIiArIG1lc3NhZ2U7
CisJCX0gZWxzZSBpZiAoIG5hbWUgKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfSBlbHNlIGlmICgg
bWVzc2FnZSApIHsKKwkJCXJldHVybiBtZXNzYWdlOworCQl9IGVsc2UgeworCQkJcmV0dXJuICJF
cnJvciI7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gcmVzdWx0RXJyb3JTdHJpbmc7CisJfQor
fQorCisvLyBUZXN0IGZvciBlcXVhbGl0eSBhbnkgSmF2YVNjcmlwdCB0eXBlLgorLy8gQXV0aG9y
OiBQaGlsaXBwZSBSYXRow6kgPHByYXRoZUBnbWFpbC5jb20+CitRVW5pdC5lcXVpdiA9IChmdW5j
dGlvbigpIHsKKworCS8vIFN0YWNrIHRvIGRlY2lkZSBiZXR3ZWVuIHNraXAvYWJvcnQgZnVuY3Rp
b25zCisJdmFyIGNhbGxlcnMgPSBbXTsKKworCS8vIFN0YWNrIHRvIGF2b2lkaW5nIGxvb3BzIGZy
b20gY2lyY3VsYXIgcmVmZXJlbmNpbmcKKwl2YXIgcGFyZW50cyA9IFtdOworCXZhciBwYXJlbnRz
QiA9IFtdOworCisJZnVuY3Rpb24gdXNlU3RyaWN0RXF1YWxpdHkoIGIsIGEgKSB7CisKKwkJLypq
c2hpbnQgZXFlcWVxOmZhbHNlICovCisJCWlmICggYiBpbnN0YW5jZW9mIGEuY29uc3RydWN0b3Ig
fHwgYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3IgKSB7CisKKwkJCS8vIFRvIGNhdGNoIHNob3J0
IGFubm90YXRpb24gVlMgJ25ldycgYW5ub3RhdGlvbiBvZiBhIGRlY2xhcmF0aW9uLiBlLmcuOgor
CQkJLy8gYHZhciBpID0gMTtgCisJCQkvLyBgdmFyIGogPSBuZXcgTnVtYmVyKDEpO2AKKwkJCXJl
dHVybiBhID09IGI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gYSA9PT0gYjsKKwkJfQorCX0KKwor
CWZ1bmN0aW9uIGNvbXBhcmVDb25zdHJ1Y3RvcnMoIGEsIGIgKSB7CisJCXZhciBnZXRQcm90byA9
IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiggb2JqICkgeworCisJCQkvKmpzaGlu
dCBwcm90bzogdHJ1ZSAqLworCQkJcmV0dXJuIG9iai5fX3Byb3RvX187CisJCX07CisJCXZhciBw
cm90b0EgPSBnZXRQcm90byggYSApOworCQl2YXIgcHJvdG9CID0gZ2V0UHJvdG8oIGIgKTsKKwor
CQkvLyBDb21wYXJpbmcgY29uc3RydWN0b3JzIGlzIG1vcmUgc3RyaWN0IHRoYW4gdXNpbmcgYGlu
c3RhbmNlb2ZgCisJCWlmICggYS5jb25zdHJ1Y3RvciA9PT0gYi5jb25zdHJ1Y3RvciApIHsKKwkJ
CXJldHVybiB0cnVlOworCQl9CisKKwkJLy8gUmVmICM4NTEKKwkJLy8gSWYgdGhlIG9iaiBwcm90
b3R5cGUgZGVzY2VuZHMgZnJvbSBhIG51bGwgY29uc3RydWN0b3IsIHRyZWF0IGl0CisJCS8vIGFz
IGEgbnVsbCBwcm90b3R5cGUuCisJCWlmICggcHJvdG9BICYmIHByb3RvQS5jb25zdHJ1Y3RvciA9
PT0gbnVsbCApIHsKKwkJCXByb3RvQSA9IG51bGw7CisJCX0KKwkJaWYgKCBwcm90b0IgJiYgcHJv
dG9CLmNvbnN0cnVjdG9yID09PSBudWxsICkgeworCQkJcHJvdG9CID0gbnVsbDsKKwkJfQorCisJ
CS8vIEFsbG93IG9iamVjdHMgd2l0aCBubyBwcm90b3R5cGUgdG8gYmUgZXF1aXZhbGVudCB0bwor
CQkvLyBvYmplY3RzIHdpdGggT2JqZWN0IGFzIHRoZWlyIGNvbnN0cnVjdG9yLgorCQlpZiAoICgg
cHJvdG9BID09PSBudWxsICYmIHByb3RvQiA9PT0gT2JqZWN0LnByb3RvdHlwZSApIHx8CisJCQkJ
KCBwcm90b0IgPT09IG51bGwgJiYgcHJvdG9BID09PSBPYmplY3QucHJvdG90eXBlICkgKSB7CisJ
CQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwl2YXIgY2FsbGJh
Y2tzID0geworCQkic3RyaW5nIjogdXNlU3RyaWN0RXF1YWxpdHksCisJCSJib29sZWFuIjogdXNl
U3RyaWN0RXF1YWxpdHksCisJCSJudW1iZXIiOiB1c2VTdHJpY3RFcXVhbGl0eSwKKwkJIm51bGwi
OiB1c2VTdHJpY3RFcXVhbGl0eSwKKwkJInVuZGVmaW5lZCI6IHVzZVN0cmljdEVxdWFsaXR5LAor
CQkic3ltYm9sIjogdXNlU3RyaWN0RXF1YWxpdHksCisKKwkJIm5hbiI6IGZ1bmN0aW9uKCBiICkg
eworCQkJcmV0dXJuIGlzTmFOKCBiICk7CisJCX0sCisKKwkJImRhdGUiOiBmdW5jdGlvbiggYiwg
YSApIHsKKwkJCXJldHVybiBRVW5pdC5vYmplY3RUeXBlKCBiICkgPT09ICJkYXRlIiAmJiBhLnZh
bHVlT2YoKSA9PT0gYi52YWx1ZU9mKCk7CisJCX0sCisKKwkJInJlZ2V4cCI6IGZ1bmN0aW9uKCBi
LCBhICkgeworCQkJcmV0dXJuIFFVbml0Lm9iamVjdFR5cGUoIGIgKSA9PT0gInJlZ2V4cCIgJiYK
KworCQkJCS8vIFRoZSByZWdleCBpdHNlbGYKKwkJCQlhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYK
KworCQkJCS8vIEFuZCBpdHMgbW9kaWZpZXJzCisJCQkJYS5nbG9iYWwgPT09IGIuZ2xvYmFsICYm
CisKKwkJCQkvLyAoZ21pKSAuLi4KKwkJCQlhLmlnbm9yZUNhc2UgPT09IGIuaWdub3JlQ2FzZSAm
JgorCQkJCWEubXVsdGlsaW5lID09PSBiLm11bHRpbGluZSAmJgorCQkJCWEuc3RpY2t5ID09PSBi
LnN0aWNreTsKKwkJfSwKKworCQkvLyAtIHNraXAgd2hlbiB0aGUgcHJvcGVydHkgaXMgYSBtZXRo
b2Qgb2YgYW4gaW5zdGFuY2UgKE9PUCkKKwkJLy8gLSBhYm9ydCBvdGhlcndpc2UsCisJCS8vIGlu
aXRpYWwgPT09IHdvdWxkIGhhdmUgY2F0Y2ggaWRlbnRpY2FsIHJlZmVyZW5jZXMgYW55d2F5CisJ
CSJmdW5jdGlvbiI6IGZ1bmN0aW9uKCkgeworCQkJdmFyIGNhbGxlciA9IGNhbGxlcnNbIGNhbGxl
cnMubGVuZ3RoIC0gMSBdOworCQkJcmV0dXJuIGNhbGxlciAhPT0gT2JqZWN0ICYmIHR5cGVvZiBj
YWxsZXIgIT09ICJ1bmRlZmluZWQiOworCQl9LAorCisJCSJhcnJheSI6IGZ1bmN0aW9uKCBiLCBh
ICkgeworCQkJdmFyIGksIGosIGxlbiwgbG9vcCwgYUNpcmN1bGFyLCBiQ2lyY3VsYXI7CisKKwkJ
CS8vIGIgY291bGQgYmUgYW4gb2JqZWN0IGxpdGVyYWwgaGVyZQorCQkJaWYgKCBRVW5pdC5vYmpl
Y3RUeXBlKCBiICkgIT09ICJhcnJheSIgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJ
CQlsZW4gPSBhLmxlbmd0aDsKKwkJCWlmICggbGVuICE9PSBiLmxlbmd0aCApIHsKKwkJCQkvLyBz
YWZlIGFuZCBmYXN0ZXIKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCS8vIFRyYWNrIHJl
ZmVyZW5jZSB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCisJCQlwYXJlbnRzLnB1c2goIGEg
KTsKKwkJCXBhcmVudHNCLnB1c2goIGIgKTsKKwkJCWZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysg
KSB7CisJCQkJbG9vcCA9IGZhbHNlOworCQkJCWZvciAoIGogPSAwOyBqIDwgcGFyZW50cy5sZW5n
dGg7IGorKyApIHsKKwkJCQkJYUNpcmN1bGFyID0gcGFyZW50c1sgaiBdID09PSBhWyBpIF07CisJ
CQkJCWJDaXJjdWxhciA9IHBhcmVudHNCWyBqIF0gPT09IGJbIGkgXTsKKwkJCQkJaWYgKCBhQ2ly
Y3VsYXIgfHwgYkNpcmN1bGFyICkgeworCQkJCQkJaWYgKCBhWyBpIF0gPT09IGJbIGkgXSB8fCBh
Q2lyY3VsYXIgJiYgYkNpcmN1bGFyICkgeworCQkJCQkJCWxvb3AgPSB0cnVlOworCQkJCQkJfSBl
bHNlIHsKKwkJCQkJCQlwYXJlbnRzLnBvcCgpOworCQkJCQkJCXBhcmVudHNCLnBvcCgpOworCQkJ
CQkJCXJldHVybiBmYWxzZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoICFsb29w
ICYmICFpbm5lckVxdWl2KCBhWyBpIF0sIGJbIGkgXSApICkgeworCQkJCQlwYXJlbnRzLnBvcCgp
OworCQkJCQlwYXJlbnRzQi5wb3AoKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0K
KwkJCXBhcmVudHMucG9wKCk7CisJCQlwYXJlbnRzQi5wb3AoKTsKKwkJCXJldHVybiB0cnVlOwor
CQl9LAorCisJCSJzZXQiOiBmdW5jdGlvbiggYiwgYSApIHsKKwkJCXZhciBhQXJyYXksIGJBcnJh
eTsKKworCQkJLy8gYGJgIGNvdWxkIGJlIGFueSBvYmplY3QgaGVyZQorCQkJaWYgKCBRVW5pdC5v
YmplY3RUeXBlKCBiICkgIT09ICJzZXQiICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwor
CQkJYUFycmF5ID0gW107CisJCQlhLmZvckVhY2goIGZ1bmN0aW9uKCB2ICkgeworCQkJCWFBcnJh
eS5wdXNoKCB2ICk7CisJCQl9KTsKKwkJCWJBcnJheSA9IFtdOworCQkJYi5mb3JFYWNoKCBmdW5j
dGlvbiggdiApIHsKKwkJCQliQXJyYXkucHVzaCggdiApOworCQkJfSk7CisKKwkJCXJldHVybiBp
bm5lckVxdWl2KCBiQXJyYXksIGFBcnJheSApOworCQl9LAorCisJCSJtYXAiOiBmdW5jdGlvbigg
YiwgYSApIHsKKwkJCXZhciBhQXJyYXksIGJBcnJheTsKKworCQkJLy8gYGJgIGNvdWxkIGJlIGFu
eSBvYmplY3QgaGVyZQorCQkJaWYgKCBRVW5pdC5vYmplY3RUeXBlKCBiICkgIT09ICJtYXAiICkg
eworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJYUFycmF5ID0gW107CisJCQlhLmZvckVh
Y2goIGZ1bmN0aW9uKCB2LCBrICkgeworCQkJCWFBcnJheS5wdXNoKCBbIGssIHYgXSApOworCQkJ
fSk7CisJCQliQXJyYXkgPSBbXTsKKwkJCWIuZm9yRWFjaCggZnVuY3Rpb24oIHYsIGsgKSB7CisJ
CQkJYkFycmF5LnB1c2goIFsgaywgdiBdICk7CisJCQl9KTsKKworCQkJcmV0dXJuIGlubmVyRXF1
aXYoIGJBcnJheSwgYUFycmF5ICk7CisJCX0sCisKKwkJIm9iamVjdCI6IGZ1bmN0aW9uKCBiLCBh
ICkgeworCQkJdmFyIGksIGosIGxvb3AsIGFDaXJjdWxhciwgYkNpcmN1bGFyOworCisJCQkvLyBE
ZWZhdWx0IHRvIHRydWUKKwkJCXZhciBlcSA9IHRydWU7CisJCQl2YXIgYVByb3BlcnRpZXMgPSBb
XTsKKwkJCXZhciBiUHJvcGVydGllcyA9IFtdOworCisJCQlpZiAoIGNvbXBhcmVDb25zdHJ1Y3Rv
cnMoIGEsIGIgKSA9PT0gZmFsc2UgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQkv
LyBTdGFjayBjb25zdHJ1Y3RvciBiZWZvcmUgdHJhdmVyc2luZyBwcm9wZXJ0aWVzCisJCQljYWxs
ZXJzLnB1c2goIGEuY29uc3RydWN0b3IgKTsKKworCQkJLy8gVHJhY2sgcmVmZXJlbmNlIHRvIGF2
b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMKKwkJCXBhcmVudHMucHVzaCggYSApOworCQkJcGFyZW50
c0IucHVzaCggYiApOworCisJCQkvLyBCZSBzdHJpY3Q6IGRvbid0IGVuc3VyZSBoYXNPd25Qcm9w
ZXJ0eSBhbmQgZ28gZGVlcAorCQkJZm9yICggaSBpbiBhICkgeworCQkJCWxvb3AgPSBmYWxzZTsK
KwkJCQlmb3IgKCBqID0gMDsgaiA8IHBhcmVudHMubGVuZ3RoOyBqKysgKSB7CisJCQkJCWFDaXJj
dWxhciA9IHBhcmVudHNbIGogXSA9PT0gYVsgaSBdOworCQkJCQliQ2lyY3VsYXIgPSBwYXJlbnRz
QlsgaiBdID09PSBiWyBpIF07CisJCQkJCWlmICggYUNpcmN1bGFyIHx8IGJDaXJjdWxhciApIHsK
KwkJCQkJCWlmICggYVsgaSBdID09PSBiWyBpIF0gfHwgYUNpcmN1bGFyICYmIGJDaXJjdWxhciAp
IHsKKwkJCQkJCQlsb29wID0gdHJ1ZTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZXEgPSBmYWxz
ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlhUHJvcGVydGll
cy5wdXNoKCBpICk7CisJCQkJaWYgKCAhbG9vcCAmJiAhaW5uZXJFcXVpdiggYVsgaSBdLCBiWyBp
IF0gKSApIHsKKwkJCQkJZXEgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJ
CQlwYXJlbnRzLnBvcCgpOworCQkJcGFyZW50c0IucG9wKCk7CisKKwkJCS8vIFVuc3RhY2ssIHdl
IGFyZSBkb25lCisJCQljYWxsZXJzLnBvcCgpOworCisJCQlmb3IgKCBpIGluIGIgKSB7CisKKwkJ
CQkvLyBDb2xsZWN0IGIncyBwcm9wZXJ0aWVzCisJCQkJYlByb3BlcnRpZXMucHVzaCggaSApOwor
CQkJfQorCisJCQkvLyBFbnN1cmVzIGlkZW50aWNhbCBwcm9wZXJ0aWVzIG5hbWUKKwkJCXJldHVy
biBlcSAmJiBpbm5lckVxdWl2KCBhUHJvcGVydGllcy5zb3J0KCksIGJQcm9wZXJ0aWVzLnNvcnQo
KSApOworCQl9CisJfTsKKworCWZ1bmN0aW9uIHR5cGVFcXVpdiggYSwgYiApIHsKKwkJdmFyIHBy
b3AgPSBRVW5pdC5vYmplY3RUeXBlKCBhICk7CisJCXJldHVybiBjYWxsYmFja3NbIHByb3AgXSgg
YiwgYSApOworCX0KKworCS8vIFRoZSByZWFsIGVxdWl2IGZ1bmN0aW9uCisJZnVuY3Rpb24gaW5u
ZXJFcXVpdigpIHsKKwkJdmFyIGFyZ3MgPSBbXS5zbGljZS5hcHBseSggYXJndW1lbnRzICk7CisJ
CWlmICggYXJncy5sZW5ndGggPCAyICkgeworCisJCQkvLyBFbmQgdHJhbnNpdGlvbgorCQkJcmV0
dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gKCAoZnVuY3Rpb24oIGEsIGIgKSB7CisJCQlpZiAo
IGEgPT09IGIgKSB7CisKKwkJCQkvLyBDYXRjaCB0aGUgbW9zdCB5b3UgY2FuCisJCQkJcmV0dXJu
IHRydWU7CisJCQl9IGVsc2UgaWYgKCBhID09PSBudWxsIHx8IGIgPT09IG51bGwgfHwgdHlwZW9m
IGEgPT09ICJ1bmRlZmluZWQiIHx8CisJCQkJCXR5cGVvZiBiID09PSAidW5kZWZpbmVkIiB8fAor
CQkJCQlRVW5pdC5vYmplY3RUeXBlKCBhICkgIT09IFFVbml0Lm9iamVjdFR5cGUoIGIgKSApIHsK
KworCQkJCS8vIERvbid0IGxvc2UgdGltZSB3aXRoIGVycm9yIHByb25lIGNhc2VzCisJCQkJcmV0
dXJuIGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdHlwZUVxdWl2KCBhLCBiICk7CisJ
CQl9CisKKwkJLy8gQXBwbHkgdHJhbnNpdGlvbiB3aXRoICgxLi5uKSBhcmd1bWVudHMKKwkJfSgg
YXJnc1sgMCBdLCBhcmdzWyAxIF0gKSApICYmCisJCQlpbm5lckVxdWl2LmFwcGx5KCB0aGlzLCBh
cmdzLnNwbGljZSggMSwgYXJncy5sZW5ndGggLSAxICkgKSApOworCX0KKworCXJldHVybiBpbm5l
ckVxdWl2OworfSgpKTsKKworLy8gQmFzZWQgb24ganNEdW1wIGJ5IEFyaWVsIEZsZXNsZXIKKy8v
IGh0dHA6Ly9mbGVzbGVyLmJsb2dzcG90LmNvbS8yMDA4LzA1L2pzZHVtcC1wcmV0dHktZHVtcC1v
Zi1hbnktamF2YXNjcmlwdC5odG1sCitRVW5pdC5kdW1wID0gKGZ1bmN0aW9uKCkgeworCWZ1bmN0
aW9uIHF1b3RlKCBzdHIgKSB7CisJCXJldHVybiAiXCIiICsgc3RyLnRvU3RyaW5nKCkucmVwbGFj
ZSggL1xcL2csICJcXFxcIiApLnJlcGxhY2UoIC8iL2csICJcXFwiIiApICsgIlwiIjsKKwl9CisJ
ZnVuY3Rpb24gbGl0ZXJhbCggbyApIHsKKwkJcmV0dXJuIG8gKyAiIjsKKwl9CisJZnVuY3Rpb24g
am9pbiggcHJlLCBhcnIsIHBvc3QgKSB7CisJCXZhciBzID0gZHVtcC5zZXBhcmF0b3IoKSwKKwkJ
CWJhc2UgPSBkdW1wLmluZGVudCgpLAorCQkJaW5uZXIgPSBkdW1wLmluZGVudCggMSApOworCQlp
ZiAoIGFyci5qb2luICkgeworCQkJYXJyID0gYXJyLmpvaW4oICIsIiArIHMgKyBpbm5lciApOwor
CQl9CisJCWlmICggIWFyciApIHsKKwkJCXJldHVybiBwcmUgKyBwb3N0OworCQl9CisJCXJldHVy
biBbIHByZSwgaW5uZXIgKyBhcnIsIGJhc2UgKyBwb3N0IF0uam9pbiggcyApOworCX0KKwlmdW5j
dGlvbiBhcnJheSggYXJyLCBzdGFjayApIHsKKwkJdmFyIGkgPSBhcnIubGVuZ3RoLAorCQkJcmV0
ID0gbmV3IEFycmF5KCBpICk7CisKKwkJaWYgKCBkdW1wLm1heERlcHRoICYmIGR1bXAuZGVwdGgg
PiBkdW1wLm1heERlcHRoICkgeworCQkJcmV0dXJuICJbb2JqZWN0IEFycmF5XSI7CisJCX0KKwor
CQl0aGlzLnVwKCk7CisJCXdoaWxlICggaS0tICkgeworCQkJcmV0WyBpIF0gPSB0aGlzLnBhcnNl
KCBhcnJbIGkgXSwgdW5kZWZpbmVkLCBzdGFjayApOworCQl9CisJCXRoaXMuZG93bigpOworCQly
ZXR1cm4gam9pbiggIlsiLCByZXQsICJdIiApOworCX0KKworCXZhciByZU5hbWUgPSAvXmZ1bmN0
aW9uIChcdyspLywKKwkJZHVtcCA9IHsKKworCQkJLy8gb2JqVHlwZSBpcyB1c2VkIG1vc3RseSBp
bnRlcm5hbGx5LCB5b3UgY2FuIGZpeCBhIChjdXN0b20pIHR5cGUgaW4gYWR2YW5jZQorCQkJcGFy
c2U6IGZ1bmN0aW9uKCBvYmosIG9ialR5cGUsIHN0YWNrICkgeworCQkJCXN0YWNrID0gc3RhY2sg
fHwgW107CisJCQkJdmFyIHJlcywgcGFyc2VyLCBwYXJzZXJUeXBlLAorCQkJCQlpblN0YWNrID0g
aW5BcnJheSggb2JqLCBzdGFjayApOworCisJCQkJaWYgKCBpblN0YWNrICE9PSAtMSApIHsKKwkJ
CQkJcmV0dXJuICJyZWN1cnNpb24oIiArICggaW5TdGFjayAtIHN0YWNrLmxlbmd0aCApICsgIiki
OworCQkJCX0KKworCQkJCW9ialR5cGUgPSBvYmpUeXBlIHx8IHRoaXMudHlwZU9mKCBvYmogICk7
CisJCQkJcGFyc2VyID0gdGhpcy5wYXJzZXJzWyBvYmpUeXBlIF07CisJCQkJcGFyc2VyVHlwZSA9
IHR5cGVvZiBwYXJzZXI7CisKKwkJCQlpZiAoIHBhcnNlclR5cGUgPT09ICJmdW5jdGlvbiIgKSB7
CisJCQkJCXN0YWNrLnB1c2goIG9iaiApOworCQkJCQlyZXMgPSBwYXJzZXIuY2FsbCggdGhpcywg
b2JqLCBzdGFjayApOworCQkJCQlzdGFjay5wb3AoKTsKKwkJCQkJcmV0dXJuIHJlczsKKwkJCQl9
CisJCQkJcmV0dXJuICggcGFyc2VyVHlwZSA9PT0gInN0cmluZyIgKSA/IHBhcnNlciA6IHRoaXMu
cGFyc2Vycy5lcnJvcjsKKwkJCX0sCisJCQl0eXBlT2Y6IGZ1bmN0aW9uKCBvYmogKSB7CisJCQkJ
dmFyIHR5cGU7CisJCQkJaWYgKCBvYmogPT09IG51bGwgKSB7CisJCQkJCXR5cGUgPSAibnVsbCI7
CisJCQkJfSBlbHNlIGlmICggdHlwZW9mIG9iaiA9PT0gInVuZGVmaW5lZCIgKSB7CisJCQkJCXR5
cGUgPSAidW5kZWZpbmVkIjsKKwkJCQl9IGVsc2UgaWYgKCBRVW5pdC5pcyggInJlZ2V4cCIsIG9i
aiApICkgeworCQkJCQl0eXBlID0gInJlZ2V4cCI7CisJCQkJfSBlbHNlIGlmICggUVVuaXQuaXMo
ICJkYXRlIiwgb2JqICkgKSB7CisJCQkJCXR5cGUgPSAiZGF0ZSI7CisJCQkJfSBlbHNlIGlmICgg
UVVuaXQuaXMoICJmdW5jdGlvbiIsIG9iaiApICkgeworCQkJCQl0eXBlID0gImZ1bmN0aW9uIjsK
KwkJCQl9IGVsc2UgaWYgKCBvYmouc2V0SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCAmJgorCQkJCQkJ
b2JqLmRvY3VtZW50ICE9PSB1bmRlZmluZWQgJiYKKwkJCQkJCW9iai5ub2RlVHlwZSA9PT0gdW5k
ZWZpbmVkICkgeworCQkJCQl0eXBlID0gIndpbmRvdyI7CisJCQkJfSBlbHNlIGlmICggb2JqLm5v
ZGVUeXBlID09PSA5ICkgeworCQkJCQl0eXBlID0gImRvY3VtZW50IjsKKwkJCQl9IGVsc2UgaWYg
KCBvYmoubm9kZVR5cGUgKSB7CisJCQkJCXR5cGUgPSAibm9kZSI7CisJCQkJfSBlbHNlIGlmICgK
KworCQkJCQkvLyBuYXRpdmUgYXJyYXlzCisJCQkJCXRvU3RyaW5nLmNhbGwoIG9iaiApID09PSAi
W29iamVjdCBBcnJheV0iIHx8CisKKwkJCQkJLy8gTm9kZUxpc3Qgb2JqZWN0cworCQkJCQkoIHR5
cGVvZiBvYmoubGVuZ3RoID09PSAibnVtYmVyIiAmJiBvYmouaXRlbSAhPT0gdW5kZWZpbmVkICYm
CisJCQkJCSggb2JqLmxlbmd0aCA/IG9iai5pdGVtKCAwICkgPT09IG9ialsgMCBdIDogKCBvYmou
aXRlbSggMCApID09PSBudWxsICYmCisJCQkJCW9ialsgMCBdID09PSB1bmRlZmluZWQgKSApICkK
KwkJCQkpIHsKKwkJCQkJdHlwZSA9ICJhcnJheSI7CisJCQkJfSBlbHNlIGlmICggb2JqLmNvbnN0
cnVjdG9yID09PSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgKSB7CisJCQkJCXR5cGUgPSAi
ZXJyb3IiOworCQkJCX0gZWxzZSB7CisJCQkJCXR5cGUgPSB0eXBlb2Ygb2JqOworCQkJCX0KKwkJ
CQlyZXR1cm4gdHlwZTsKKwkJCX0sCisJCQlzZXBhcmF0b3I6IGZ1bmN0aW9uKCkgeworCQkJCXJl
dHVybiB0aGlzLm11bHRpbGluZSA/IHRoaXMuSFRNTCA/ICI8YnIgLz4iIDogIlxuIiA6IHRoaXMu
SFRNTCA/ICImIzE2MDsiIDogIiAiOworCQkJfSwKKwkJCS8vIGV4dHJhIGNhbiBiZSBhIG51bWJl
ciwgc2hvcnRjdXQgZm9yIGluY3JlYXNpbmctY2FsbGluZy1kZWNyZWFzaW5nCisJCQlpbmRlbnQ6
IGZ1bmN0aW9uKCBleHRyYSApIHsKKwkJCQlpZiAoICF0aGlzLm11bHRpbGluZSApIHsKKwkJCQkJ
cmV0dXJuICIiOworCQkJCX0KKwkJCQl2YXIgY2hyID0gdGhpcy5pbmRlbnRDaGFyOworCQkJCWlm
ICggdGhpcy5IVE1MICkgeworCQkJCQljaHIgPSBjaHIucmVwbGFjZSggL1x0L2csICIgICAiICku
cmVwbGFjZSggLyAvZywgIiYjMTYwOyIgKTsKKwkJCQl9CisJCQkJcmV0dXJuIG5ldyBBcnJheSgg
dGhpcy5kZXB0aCArICggZXh0cmEgfHwgMCApICkuam9pbiggY2hyICk7CisJCQl9LAorCQkJdXA6
IGZ1bmN0aW9uKCBhICkgeworCQkJCXRoaXMuZGVwdGggKz0gYSB8fCAxOworCQkJfSwKKwkJCWRv
d246IGZ1bmN0aW9uKCBhICkgeworCQkJCXRoaXMuZGVwdGggLT0gYSB8fCAxOworCQkJfSwKKwkJ
CXNldFBhcnNlcjogZnVuY3Rpb24oIG5hbWUsIHBhcnNlciApIHsKKwkJCQl0aGlzLnBhcnNlcnNb
IG5hbWUgXSA9IHBhcnNlcjsKKwkJCX0sCisJCQkvLyBUaGUgbmV4dCAzIGFyZSBleHBvc2VkIHNv
IHlvdSBjYW4gdXNlIHRoZW0KKwkJCXF1b3RlOiBxdW90ZSwKKwkJCWxpdGVyYWw6IGxpdGVyYWws
CisJCQlqb2luOiBqb2luLAorCQkJLy8KKwkJCWRlcHRoOiAxLAorCQkJbWF4RGVwdGg6IFFVbml0
LmNvbmZpZy5tYXhEZXB0aCwKKworCQkJLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiBwYXJzZXJzLCB0
byBtb2RpZnkgdGhlbSwgdXNlIGR1bXAuc2V0UGFyc2VyCisJCQlwYXJzZXJzOiB7CisJCQkJd2lu
ZG93OiAiW1dpbmRvd10iLAorCQkJCWRvY3VtZW50OiAiW0RvY3VtZW50XSIsCisJCQkJZXJyb3I6
IGZ1bmN0aW9uKCBlcnJvciApIHsKKwkJCQkJcmV0dXJuICJFcnJvcihcIiIgKyBlcnJvci5tZXNz
YWdlICsgIlwiKSI7CisJCQkJfSwKKwkJCQl1bmtub3duOiAiW1Vua25vd25dIiwKKwkJCQkibnVs
bCI6ICJudWxsIiwKKwkJCQkidW5kZWZpbmVkIjogInVuZGVmaW5lZCIsCisJCQkJImZ1bmN0aW9u
IjogZnVuY3Rpb24oIGZuICkgeworCQkJCQl2YXIgcmV0ID0gImZ1bmN0aW9uIiwKKworCQkJCQkJ
Ly8gZnVuY3Rpb25zIG5ldmVyIGhhdmUgbmFtZSBpbiBJRQorCQkJCQkJbmFtZSA9ICJuYW1lIiBp
biBmbiA/IGZuLm5hbWUgOiAoIHJlTmFtZS5leGVjKCBmbiApIHx8IFtdIClbIDEgXTsKKworCQkJ
CQlpZiAoIG5hbWUgKSB7CisJCQkJCQlyZXQgKz0gIiAiICsgbmFtZTsKKwkJCQkJfQorCQkJCQly
ZXQgKz0gIiggIjsKKworCQkJCQlyZXQgPSBbIHJldCwgZHVtcC5wYXJzZSggZm4sICJmdW5jdGlv
bkFyZ3MiICksICIpeyIgXS5qb2luKCAiIiApOworCQkJCQlyZXR1cm4gam9pbiggcmV0LCBkdW1w
LnBhcnNlKCBmbiwgImZ1bmN0aW9uQ29kZSIgKSwgIn0iICk7CisJCQkJfSwKKwkJCQlhcnJheTog
YXJyYXksCisJCQkJbm9kZWxpc3Q6IGFycmF5LAorCQkJCSJhcmd1bWVudHMiOiBhcnJheSwKKwkJ
CQlvYmplY3Q6IGZ1bmN0aW9uKCBtYXAsIHN0YWNrICkgeworCQkJCQl2YXIga2V5cywga2V5LCB2
YWwsIGksIG5vbkVudW1lcmFibGVQcm9wZXJ0aWVzLAorCQkJCQkJcmV0ID0gW107CisKKwkJCQkJ
aWYgKCBkdW1wLm1heERlcHRoICYmIGR1bXAuZGVwdGggPiBkdW1wLm1heERlcHRoICkgeworCQkJ
CQkJcmV0dXJuICJbb2JqZWN0IE9iamVjdF0iOworCQkJCQl9CisKKwkJCQkJZHVtcC51cCgpOwor
CQkJCQlrZXlzID0gW107CisJCQkJCWZvciAoIGtleSBpbiBtYXAgKSB7CisJCQkJCQlrZXlzLnB1
c2goIGtleSApOworCQkJCQl9CisKKwkJCQkJLy8gU29tZSBwcm9wZXJ0aWVzIGFyZSBub3QgYWx3
YXlzIGVudW1lcmFibGUgb24gRXJyb3Igb2JqZWN0cy4KKwkJCQkJbm9uRW51bWVyYWJsZVByb3Bl
cnRpZXMgPSBbICJtZXNzYWdlIiwgIm5hbWUiIF07CisJCQkJCWZvciAoIGkgaW4gbm9uRW51bWVy
YWJsZVByb3BlcnRpZXMgKSB7CisJCQkJCQlrZXkgPSBub25FbnVtZXJhYmxlUHJvcGVydGllc1sg
aSBdOworCQkJCQkJaWYgKCBrZXkgaW4gbWFwICYmIGluQXJyYXkoIGtleSwga2V5cyApIDwgMCAp
IHsKKwkJCQkJCQlrZXlzLnB1c2goIGtleSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWtleXMu
c29ydCgpOworCQkJCQlmb3IgKCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKysgKSB7CisJCQkJ
CQlrZXkgPSBrZXlzWyBpIF07CisJCQkJCQl2YWwgPSBtYXBbIGtleSBdOworCQkJCQkJcmV0LnB1
c2goIGR1bXAucGFyc2UoIGtleSwgImtleSIgKSArICI6ICIgKworCQkJCQkJCWR1bXAucGFyc2Uo
IHZhbCwgdW5kZWZpbmVkLCBzdGFjayApICk7CisJCQkJCX0KKwkJCQkJZHVtcC5kb3duKCk7CisJ
CQkJCXJldHVybiBqb2luKCAieyIsIHJldCwgIn0iICk7CisJCQkJfSwKKwkJCQlub2RlOiBmdW5j
dGlvbiggbm9kZSApIHsKKwkJCQkJdmFyIGxlbiwgaSwgdmFsLAorCQkJCQkJb3BlbiA9IGR1bXAu
SFRNTCA/ICImbHQ7IiA6ICI8IiwKKwkJCQkJCWNsb3NlID0gZHVtcC5IVE1MID8gIiZndDsiIDog
Ij4iLAorCQkJCQkJdGFnID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLAorCQkJCQkJcmV0
ID0gb3BlbiArIHRhZywKKwkJCQkJCWF0dHJzID0gbm9kZS5hdHRyaWJ1dGVzOworCisJCQkJCWlm
ICggYXR0cnMgKSB7CisJCQkJCQlmb3IgKCBpID0gMCwgbGVuID0gYXR0cnMubGVuZ3RoOyBpIDwg
bGVuOyBpKysgKSB7CisJCQkJCQkJdmFsID0gYXR0cnNbIGkgXS5ub2RlVmFsdWU7CisKKwkJCQkJ
CQkvLyBJRTYgaW5jbHVkZXMgYWxsIGF0dHJpYnV0ZXMgaW4gLmF0dHJpYnV0ZXMsIGV2ZW4gb25l
cyBub3QgZXhwbGljaXRseQorCQkJCQkJCS8vIHNldC4gVGhvc2UgaGF2ZSB2YWx1ZXMgbGlrZSB1
bmRlZmluZWQsIG51bGwsIDAsIGZhbHNlLCAiIiBvcgorCQkJCQkJCS8vICJpbmhlcml0Ii4KKwkJ
CQkJCQlpZiAoIHZhbCAmJiB2YWwgIT09ICJpbmhlcml0IiApIHsKKwkJCQkJCQkJcmV0ICs9ICIg
IiArIGF0dHJzWyBpIF0ubm9kZU5hbWUgKyAiPSIgKworCQkJCQkJCQkJZHVtcC5wYXJzZSggdmFs
LCAiYXR0cmlidXRlIiApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXQgKz0g
Y2xvc2U7CisKKwkJCQkJLy8gU2hvdyBjb250ZW50IG9mIFRleHROb2RlIG9yIENEQVRBU2VjdGlv
bgorCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDMgfHwgbm9kZS5ub2RlVHlwZSA9PT0gNCAp
IHsKKwkJCQkJCXJldCArPSBub2RlLm5vZGVWYWx1ZTsKKwkJCQkJfQorCisJCQkJCXJldHVybiBy
ZXQgKyBvcGVuICsgIi8iICsgdGFnICsgY2xvc2U7CisJCQkJfSwKKworCQkJCS8vIGZ1bmN0aW9u
IGNhbGxzIGl0IGludGVybmFsbHksIGl0J3MgdGhlIGFyZ3VtZW50cyBwYXJ0IG9mIHRoZSBmdW5j
dGlvbgorCQkJCWZ1bmN0aW9uQXJnczogZnVuY3Rpb24oIGZuICkgeworCQkJCQl2YXIgYXJncywK
KwkJCQkJCWwgPSBmbi5sZW5ndGg7CisKKwkJCQkJaWYgKCAhbCApIHsKKwkJCQkJCXJldHVybiAi
IjsKKwkJCQkJfQorCisJCQkJCWFyZ3MgPSBuZXcgQXJyYXkoIGwgKTsKKwkJCQkJd2hpbGUgKCBs
LS0gKSB7CisKKwkJCQkJCS8vIDk3IGlzICdhJworCQkJCQkJYXJnc1sgbCBdID0gU3RyaW5nLmZy
b21DaGFyQ29kZSggOTcgKyBsICk7CisJCQkJCX0KKwkJCQkJcmV0dXJuICIgIiArIGFyZ3Muam9p
biggIiwgIiApICsgIiAiOworCQkJCX0sCisJCQkJLy8gb2JqZWN0IGNhbGxzIGl0IGludGVybmFs
bHksIHRoZSBrZXkgcGFydCBvZiBhbiBpdGVtIGluIGEgbWFwCisJCQkJa2V5OiBxdW90ZSwKKwkJ
CQkvLyBmdW5jdGlvbiBjYWxscyBpdCBpbnRlcm5hbGx5LCBpdCdzIHRoZSBjb250ZW50IG9mIHRo
ZSBmdW5jdGlvbgorCQkJCWZ1bmN0aW9uQ29kZTogIltjb2RlXSIsCisJCQkJLy8gbm9kZSBjYWxs
cyBpdCBpbnRlcm5hbGx5LCBpdCdzIGFuIGh0bWwgYXR0cmlidXRlIHZhbHVlCisJCQkJYXR0cmli
dXRlOiBxdW90ZSwKKwkJCQlzdHJpbmc6IHF1b3RlLAorCQkJCWRhdGU6IHF1b3RlLAorCQkJCXJl
Z2V4cDogbGl0ZXJhbCwKKwkJCQludW1iZXI6IGxpdGVyYWwsCisJCQkJImJvb2xlYW4iOiBsaXRl
cmFsCisJCQl9LAorCQkJLy8gaWYgdHJ1ZSwgZW50aXRpZXMgYXJlIGVzY2FwZWQgKCA8LCA+LCBc
dCwgc3BhY2UgYW5kIFxuICkKKwkJCUhUTUw6IGZhbHNlLAorCQkJLy8gaW5kZW50YXRpb24gdW5p
dAorCQkJaW5kZW50Q2hhcjogIiAgIiwKKwkJCS8vIGlmIHRydWUsIGl0ZW1zIGluIGEgY29sbGVj
dGlvbiwgYXJlIHNlcGFyYXRlZCBieSBhIFxuLCBlbHNlIGp1c3QgYSBzcGFjZS4KKwkJCW11bHRp
bGluZTogdHJ1ZQorCQl9OworCisJcmV0dXJuIGR1bXA7Cit9KCkpOworCisvLyBiYWNrIGNvbXBh
dAorUVVuaXQuanNEdW1wID0gUVVuaXQuZHVtcDsKKworLy8gRm9yIGJyb3dzZXIsIGV4cG9ydCBv
bmx5IHNlbGVjdCBnbG9iYWxzCitpZiAoIGRlZmluZWQuZG9jdW1lbnQgKSB7CisKKwkvLyBEZXBy
ZWNhdGVkCisJLy8gRXh0ZW5kIGFzc2VydCBtZXRob2RzIHRvIFFVbml0IGFuZCBHbG9iYWwgc2Nv
cGUgdGhyb3VnaCBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCShmdW5jdGlvbigpIHsKKwkJdmFy
IGksCisJCQlhc3NlcnRpb25zID0gQXNzZXJ0LnByb3RvdHlwZTsKKworCQlmdW5jdGlvbiBhcHBs
eUN1cnJlbnQoIGN1cnJlbnQgKSB7CisJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CisJCQkJdmFyIGFz
c2VydCA9IG5ldyBBc3NlcnQoIFFVbml0LmNvbmZpZy5jdXJyZW50ICk7CisJCQkJY3VycmVudC5h
cHBseSggYXNzZXJ0LCBhcmd1bWVudHMgKTsKKwkJCX07CisJCX0KKworCQlmb3IgKCBpIGluIGFz
c2VydGlvbnMgKSB7CisJCQlRVW5pdFsgaSBdID0gYXBwbHlDdXJyZW50KCBhc3NlcnRpb25zWyBp
IF0gKTsKKwkJfQorCX0pKCk7CisKKwkoZnVuY3Rpb24oKSB7CisJCXZhciBpLCBsLAorCQkJa2V5
cyA9IFsKKwkJCQkidGVzdCIsCisJCQkJIm1vZHVsZSIsCisJCQkJImV4cGVjdCIsCisJCQkJImFz
eW5jVGVzdCIsCisJCQkJInN0YXJ0IiwKKwkJCQkic3RvcCIsCisJCQkJIm9rIiwKKwkJCQkibm90
T2siLAorCQkJCSJlcXVhbCIsCisJCQkJIm5vdEVxdWFsIiwKKwkJCQkicHJvcEVxdWFsIiwKKwkJ
CQkibm90UHJvcEVxdWFsIiwKKwkJCQkiZGVlcEVxdWFsIiwKKwkJCQkibm90RGVlcEVxdWFsIiwK
KwkJCQkic3RyaWN0RXF1YWwiLAorCQkJCSJub3RTdHJpY3RFcXVhbCIsCisJCQkJInRocm93cyIs
CisJCQkJInJhaXNlcyIKKwkJCV07CisKKwkJZm9yICggaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsg
aSA8IGw7IGkrKyApIHsKKwkJCXdpbmRvd1sga2V5c1sgaSBdIF0gPSBRVW5pdFsga2V5c1sgaSBd
IF07CisJCX0KKwl9KSgpOworCisJd2luZG93LlFVbml0ID0gUVVuaXQ7Cit9CisKKy8vIEZvciBu
b2RlanMKK2lmICggdHlwZW9mIG1vZHVsZSAhPT0gInVuZGVmaW5lZCIgJiYgbW9kdWxlICYmIG1v
ZHVsZS5leHBvcnRzICkgeworCW1vZHVsZS5leHBvcnRzID0gUVVuaXQ7CisKKwkvLyBGb3IgY29u
c2lzdGVuY3kgd2l0aCBDb21tb25KUyBlbnZpcm9ubWVudHMnIGV4cG9ydHMKKwltb2R1bGUuZXhw
b3J0cy5RVW5pdCA9IFFVbml0OworfQorCisvLyBGb3IgQ29tbW9uSlMgd2l0aCBleHBvcnRzLCBi
dXQgd2l0aG91dCBtb2R1bGUuZXhwb3J0cywgbGlrZSBSaGlubworaWYgKCB0eXBlb2YgZXhwb3J0
cyAhPT0gInVuZGVmaW5lZCIgJiYgZXhwb3J0cyApIHsKKwlleHBvcnRzLlFVbml0ID0gUVVuaXQ7
Cit9CisKK2lmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkg
eworCWRlZmluZSggZnVuY3Rpb24oKSB7CisJCXJldHVybiBRVW5pdDsKKwl9ICk7CisJUVVuaXQu
Y29uZmlnLmF1dG9zdGFydCA9IGZhbHNlOworfQorCisvKgorICogVGhpcyBmaWxlIGlzIGEgbW9k
aWZpZWQgdmVyc2lvbiBvZiBnb29nbGUtZGlmZi1tYXRjaC1wYXRjaCdzIEphdmFTY3JpcHQgaW1w
bGVtZW50YXRpb24KKyAqIChodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1h
dGNoLXBhdGNoL3NvdXJjZS9icm93c2UvdHJ1bmsvamF2YXNjcmlwdC9kaWZmX21hdGNoX3BhdGNo
X3VuY29tcHJlc3NlZC5qcyksCisgKiBtb2RpZmljYXRpb25zIGFyZSBsaWNlbnNlZCBhcyBtb3Jl
IGZ1bGx5IHNldCBmb3J0aCBpbiBMSUNFTlNFLnR4dC4KKyAqCisgKiBUaGUgb3JpZ2luYWwgc291
cmNlIG9mIGdvb2dsZS1kaWZmLW1hdGNoLXBhdGNoIGlzIGF0dHJpYnV0YWJsZSBhbmQgbGljZW5z
ZWQgYXMgZm9sbG93czoKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBHb29nbGUgSW5jLgorICogaHR0
cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoLworICoKKyAqIExp
Y2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5z
ZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3
aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNl
IGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisg
KgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3
cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlz
dHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBD
T05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2Vl
IHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Np
b25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogTW9yZSBJ
bmZvOgorICogIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLWRpZmYtbWF0Y2gtcGF0
Y2gvCisgKgorICogVXNhZ2U6IFFVbml0LmRpZmYoZXhwZWN0ZWQsIGFjdHVhbCkKKyAqCisgKi8K
K1FVbml0LmRpZmYgPSAoIGZ1bmN0aW9uKCkgeworCWZ1bmN0aW9uIERpZmZNYXRjaFBhdGNoKCkg
eworCX0KKworCS8vICBESUZGIEZVTkNUSU9OUworCisJLyoqCisJICogVGhlIGRhdGEgc3RydWN0
dXJlIHJlcHJlc2VudGluZyBhIGRpZmYgaXMgYW4gYXJyYXkgb2YgdHVwbGVzOgorCSAqIFtbRElG
Rl9ERUxFVEUsICdIZWxsbyddLCBbRElGRl9JTlNFUlQsICdHb29kYnllJ10sIFtESUZGX0VRVUFM
LCAnIHdvcmxkLiddXQorCSAqIHdoaWNoIG1lYW5zOiBkZWxldGUgJ0hlbGxvJywgYWRkICdHb29k
YnllJyBhbmQga2VlcCAnIHdvcmxkLicKKwkgKi8KKwl2YXIgRElGRl9ERUxFVEUgPSAtMSwKKwkJ
RElGRl9JTlNFUlQgPSAxLAorCQlESUZGX0VRVUFMID0gMDsKKworCS8qKgorCSAqIEZpbmQgdGhl
IGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIHRleHRzLiAgU2ltcGxpZmllcyB0aGUgcHJvYmxlbSBi
eSBzdHJpcHBpbmcKKwkgKiBhbnkgY29tbW9uIHByZWZpeCBvciBzdWZmaXggb2ZmIHRoZSB0ZXh0
cyBiZWZvcmUgZGlmZmluZy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgT2xkIHN0cmluZyB0
byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIE5ldyBzdHJpbmcgdG8gYmUg
ZGlmZmVkLgorCSAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdENoZWNrbGluZXMgT3B0aW9uYWwgc3Bl
ZWR1cCBmbGFnLiBJZiBwcmVzZW50IGFuZCBmYWxzZSwKKwkgKiAgICAgdGhlbiBkb24ndCBydW4g
YSBsaW5lLWxldmVsIGRpZmYgZmlyc3QgdG8gaWRlbnRpZnkgdGhlIGNoYW5nZWQgYXJlYXMuCisJ
ICogICAgIERlZmF1bHRzIHRvIHRydWUsIHdoaWNoIGRvZXMgYSBmYXN0ZXIsIHNsaWdodGx5IGxl
c3Mgb3B0aW1hbCBkaWZmLgorCSAqIEByZXR1cm4geyFBcnJheS48IURpZmZNYXRjaFBhdGNoLkRp
ZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5
cGUuRGlmZk1haW4gPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyLCBvcHRDaGVja2xpbmVzICkgewor
CQl2YXIgZGVhZGxpbmUsIGNoZWNrbGluZXMsIGNvbW1vbmxlbmd0aCwKKwkJCWNvbW1vbnByZWZp
eCwgY29tbW9uc3VmZml4LCBkaWZmczsKKworCQkvLyBUaGUgZGlmZiBtdXN0IGJlIGNvbXBsZXRl
IGluIHVwIHRvIDEgc2Vjb25kLgorCQlkZWFkbGluZSA9ICggbmV3IERhdGUoKSApLmdldFRpbWUo
KSArIDEwMDA7CisKKwkJLy8gQ2hlY2sgZm9yIG51bGwgaW5wdXRzLgorCQlpZiAoIHRleHQxID09
PSBudWxsIHx8IHRleHQyID09PSBudWxsICkgeworCQkJdGhyb3cgbmV3IEVycm9yKCAiTnVsbCBp
bnB1dC4gKERpZmZNYWluKSIgKTsKKwkJfQorCisJCS8vIENoZWNrIGZvciBlcXVhbGl0eSAoc3Bl
ZWR1cCkuCisJCWlmICggdGV4dDEgPT09IHRleHQyICkgeworCQkJaWYgKCB0ZXh0MSApIHsKKwkJ
CQlyZXR1cm4gWworCQkJCQlbIERJRkZfRVFVQUwsIHRleHQxIF0KKwkJCQldOworCQkJfQorCQkJ
cmV0dXJuIFtdOworCQl9CisKKwkJaWYgKCB0eXBlb2Ygb3B0Q2hlY2tsaW5lcyA9PT0gInVuZGVm
aW5lZCIgKSB7CisJCQlvcHRDaGVja2xpbmVzID0gdHJ1ZTsKKwkJfQorCisJCWNoZWNrbGluZXMg
PSBvcHRDaGVja2xpbmVzOworCisJCS8vIFRyaW0gb2ZmIGNvbW1vbiBwcmVmaXggKHNwZWVkdXAp
LgorCQljb21tb25sZW5ndGggPSB0aGlzLmRpZmZDb21tb25QcmVmaXgoIHRleHQxLCB0ZXh0MiAp
OworCQljb21tb25wcmVmaXggPSB0ZXh0MS5zdWJzdHJpbmcoIDAsIGNvbW1vbmxlbmd0aCApOwor
CQl0ZXh0MSA9IHRleHQxLnN1YnN0cmluZyggY29tbW9ubGVuZ3RoICk7CisJCXRleHQyID0gdGV4
dDIuc3Vic3RyaW5nKCBjb21tb25sZW5ndGggKTsKKworCQkvLyBUcmltIG9mZiBjb21tb24gc3Vm
Zml4IChzcGVlZHVwKS4KKwkJY29tbW9ubGVuZ3RoID0gdGhpcy5kaWZmQ29tbW9uU3VmZml4KCB0
ZXh0MSwgdGV4dDIgKTsKKwkJY29tbW9uc3VmZml4ID0gdGV4dDEuc3Vic3RyaW5nKCB0ZXh0MS5s
ZW5ndGggLSBjb21tb25sZW5ndGggKTsKKwkJdGV4dDEgPSB0ZXh0MS5zdWJzdHJpbmcoIDAsIHRl
eHQxLmxlbmd0aCAtIGNvbW1vbmxlbmd0aCApOworCQl0ZXh0MiA9IHRleHQyLnN1YnN0cmluZygg
MCwgdGV4dDIubGVuZ3RoIC0gY29tbW9ubGVuZ3RoICk7CisKKwkJLy8gQ29tcHV0ZSB0aGUgZGlm
ZiBvbiB0aGUgbWlkZGxlIGJsb2NrLgorCQlkaWZmcyA9IHRoaXMuZGlmZkNvbXB1dGUoIHRleHQx
LCB0ZXh0MiwgY2hlY2tsaW5lcywgZGVhZGxpbmUgKTsKKworCQkvLyBSZXN0b3JlIHRoZSBwcmVm
aXggYW5kIHN1ZmZpeC4KKwkJaWYgKCBjb21tb25wcmVmaXggKSB7CisJCQlkaWZmcy51bnNoaWZ0
KCBbIERJRkZfRVFVQUwsIGNvbW1vbnByZWZpeCBdICk7CisJCX0KKwkJaWYgKCBjb21tb25zdWZm
aXggKSB7CisJCQlkaWZmcy5wdXNoKCBbIERJRkZfRVFVQUwsIGNvbW1vbnN1ZmZpeCBdICk7CisJ
CX0KKwkJdGhpcy5kaWZmQ2xlYW51cE1lcmdlKCBkaWZmcyApOworCQlyZXR1cm4gZGlmZnM7CisJ
fTsKKworCS8qKgorCSAqIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGVkaXRzIGJ5IGVsaW1pbmF0aW5n
IG9wZXJhdGlvbmFsbHkgdHJpdmlhbCBlcXVhbGl0aWVzLgorCSAqIEBwYXJhbSB7IUFycmF5Ljwh
RGlmZk1hdGNoUGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqLwor
CURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ2xlYW51cEVmZmljaWVuY3kgPSBmdW5jdGlv
biggZGlmZnMgKSB7CisJCXZhciBjaGFuZ2VzLCBlcXVhbGl0aWVzLCBlcXVhbGl0aWVzTGVuZ3Ro
LCBsYXN0ZXF1YWxpdHksCisJCQlwb2ludGVyLCBwcmVJbnMsIHByZURlbCwgcG9zdElucywgcG9z
dERlbDsKKwkJY2hhbmdlcyA9IGZhbHNlOworCQllcXVhbGl0aWVzID0gW107IC8vIFN0YWNrIG9m
IGluZGljZXMgd2hlcmUgZXF1YWxpdGllcyBhcmUgZm91bmQuCisJCWVxdWFsaXRpZXNMZW5ndGgg
PSAwOyAvLyBLZWVwaW5nIG91ciBvd24gbGVuZ3RoIHZhciBpcyBmYXN0ZXIgaW4gSlMuCisJCS8q
KiBAdHlwZSB7P3N0cmluZ30gKi8KKwkJbGFzdGVxdWFsaXR5ID0gbnVsbDsKKwkJLy8gQWx3YXlz
IGVxdWFsIHRvIGRpZmZzW2VxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCAtIDFdXVsxXQorCQlw
b2ludGVyID0gMDsgLy8gSW5kZXggb2YgY3VycmVudCBwb3NpdGlvbi4KKwkJLy8gSXMgdGhlcmUg
YW4gaW5zZXJ0aW9uIG9wZXJhdGlvbiBiZWZvcmUgdGhlIGxhc3QgZXF1YWxpdHkuCisJCXByZUlu
cyA9IGZhbHNlOworCQkvLyBJcyB0aGVyZSBhIGRlbGV0aW9uIG9wZXJhdGlvbiBiZWZvcmUgdGhl
IGxhc3QgZXF1YWxpdHkuCisJCXByZURlbCA9IGZhbHNlOworCQkvLyBJcyB0aGVyZSBhbiBpbnNl
cnRpb24gb3BlcmF0aW9uIGFmdGVyIHRoZSBsYXN0IGVxdWFsaXR5LgorCQlwb3N0SW5zID0gZmFs
c2U7CisJCS8vIElzIHRoZXJlIGEgZGVsZXRpb24gb3BlcmF0aW9uIGFmdGVyIHRoZSBsYXN0IGVx
dWFsaXR5LgorCQlwb3N0RGVsID0gZmFsc2U7CisJCXdoaWxlICggcG9pbnRlciA8IGRpZmZzLmxl
bmd0aCApIHsKKworCQkJLy8gRXF1YWxpdHkgZm91bmQuCisJCQlpZiAoIGRpZmZzWyBwb2ludGVy
IF1bIDAgXSA9PT0gRElGRl9FUVVBTCApIHsKKwkJCQlpZiAoIGRpZmZzWyBwb2ludGVyIF1bIDEg
XS5sZW5ndGggPCA0ICYmICggcG9zdElucyB8fCBwb3N0RGVsICkgKSB7CisKKwkJCQkJLy8gQ2Fu
ZGlkYXRlIGZvdW5kLgorCQkJCQllcXVhbGl0aWVzWyBlcXVhbGl0aWVzTGVuZ3RoKysgXSA9IHBv
aW50ZXI7CisJCQkJCXByZUlucyA9IHBvc3RJbnM7CisJCQkJCXByZURlbCA9IHBvc3REZWw7CisJ
CQkJCWxhc3RlcXVhbGl0eSA9IGRpZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQl9IGVsc2Ugewor
CisJCQkJCS8vIE5vdCBhIGNhbmRpZGF0ZSwgYW5kIGNhbiBuZXZlciBiZWNvbWUgb25lLgorCQkJ
CQllcXVhbGl0aWVzTGVuZ3RoID0gMDsKKwkJCQkJbGFzdGVxdWFsaXR5ID0gbnVsbDsKKwkJCQl9
CisJCQkJcG9zdElucyA9IHBvc3REZWwgPSBmYWxzZTsKKworCQkJLy8gQW4gaW5zZXJ0aW9uIG9y
IGRlbGV0aW9uLgorCQkJfSBlbHNlIHsKKworCQkJCWlmICggZGlmZnNbIHBvaW50ZXIgXVsgMCBd
ID09PSBESUZGX0RFTEVURSApIHsKKwkJCQkJcG9zdERlbCA9IHRydWU7CisJCQkJfSBlbHNlIHsK
KwkJCQkJcG9zdElucyA9IHRydWU7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBGaXZlIHR5cGVz
IHRvIGJlIHNwbGl0OgorCQkJCSAqIDxpbnM+QTwvaW5zPjxkZWw+QjwvZGVsPlhZPGlucz5DPC9p
bnM+PGRlbD5EPC9kZWw+CisJCQkJICogPGlucz5BPC9pbnM+WDxpbnM+QzwvaW5zPjxkZWw+RDwv
ZGVsPgorCQkJCSAqIDxpbnM+QTwvaW5zPjxkZWw+QjwvZGVsPlg8aW5zPkM8L2lucz4KKwkJCQkg
KiA8aW5zPkE8L2RlbD5YPGlucz5DPC9pbnM+PGRlbD5EPC9kZWw+CisJCQkJICogPGlucz5BPC9p
bnM+PGRlbD5CPC9kZWw+WDxkZWw+QzwvZGVsPgorCQkJCSAqLworCQkJCWlmICggbGFzdGVxdWFs
aXR5ICYmICggKCBwcmVJbnMgJiYgcHJlRGVsICYmIHBvc3RJbnMgJiYgcG9zdERlbCApIHx8CisJ
CQkJCQkoICggbGFzdGVxdWFsaXR5Lmxlbmd0aCA8IDIgKSAmJgorCQkJCQkJKCBwcmVJbnMgKyBw
cmVEZWwgKyBwb3N0SW5zICsgcG9zdERlbCApID09PSAzICkgKSApIHsKKworCQkJCQkvLyBEdXBs
aWNhdGUgcmVjb3JkLgorCQkJCQlkaWZmcy5zcGxpY2UoCisJCQkJCQllcXVhbGl0aWVzWyBlcXVh
bGl0aWVzTGVuZ3RoIC0gMSBdLAorCQkJCQkJMCwKKwkJCQkJCVsgRElGRl9ERUxFVEUsIGxhc3Rl
cXVhbGl0eSBdCisJCQkJCSk7CisKKwkJCQkJLy8gQ2hhbmdlIHNlY29uZCBjb3B5IHRvIGluc2Vy
dC4KKwkJCQkJZGlmZnNbIGVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGggLSAxIF0gKyAxIF1b
IDAgXSA9IERJRkZfSU5TRVJUOworCQkJCQllcXVhbGl0aWVzTGVuZ3RoLS07IC8vIFRocm93IGF3
YXkgdGhlIGVxdWFsaXR5IHdlIGp1c3QgZGVsZXRlZDsKKwkJCQkJbGFzdGVxdWFsaXR5ID0gbnVs
bDsKKwkJCQkJaWYgKCBwcmVJbnMgJiYgcHJlRGVsICkgeworCQkJCQkJLy8gTm8gY2hhbmdlcyBt
YWRlIHdoaWNoIGNvdWxkIGFmZmVjdCBwcmV2aW91cyBlbnRyeSwga2VlcCBnb2luZy4KKwkJCQkJ
CXBvc3RJbnMgPSBwb3N0RGVsID0gdHJ1ZTsKKwkJCQkJCWVxdWFsaXRpZXNMZW5ndGggPSAwOwor
CQkJCQl9IGVsc2UgeworCQkJCQkJZXF1YWxpdGllc0xlbmd0aC0tOyAvLyBUaHJvdyBhd2F5IHRo
ZSBwcmV2aW91cyBlcXVhbGl0eS4KKwkJCQkJCXBvaW50ZXIgPSBlcXVhbGl0aWVzTGVuZ3RoID4g
MCA/IGVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGggLSAxIF0gOiAtMTsKKwkJCQkJCXBvc3RJ
bnMgPSBwb3N0RGVsID0gZmFsc2U7CisJCQkJCX0KKwkJCQkJY2hhbmdlcyA9IHRydWU7CisJCQkJ
fQorCQkJfQorCQkJcG9pbnRlcisrOworCQl9CisKKwkJaWYgKCBjaGFuZ2VzICkgeworCQkJdGhp
cy5kaWZmQ2xlYW51cE1lcmdlKCBkaWZmcyApOworCQl9CisJfTsKKworCS8qKgorCSAqIENvbnZl
cnQgYSBkaWZmIGFycmF5IGludG8gYSBwcmV0dHkgSFRNTCByZXBvcnQuCisJICogQHBhcmFtIHsh
QXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMu
CisJICogQHBhcmFtIHtpbnRlZ2VyfSBzdHJpbmcgdG8gYmUgYmVhdXRpZmllZC4KKwkgKiBAcmV0
dXJuIHtzdHJpbmd9IEhUTUwgcmVwcmVzZW50YXRpb24uCisJICovCisJRGlmZk1hdGNoUGF0Y2gu
cHJvdG90eXBlLmRpZmZQcmV0dHlIdG1sID0gZnVuY3Rpb24oIGRpZmZzICkgeworCQl2YXIgb3As
IGRhdGEsIHgsCisJCQlodG1sID0gW107CisJCWZvciAoIHggPSAwOyB4IDwgZGlmZnMubGVuZ3Ro
OyB4KysgKSB7CisJCQlvcCA9IGRpZmZzWyB4IF1bIDAgXTsgLy8gT3BlcmF0aW9uIChpbnNlcnQs
IGRlbGV0ZSwgZXF1YWwpCisJCQlkYXRhID0gZGlmZnNbIHggXVsgMSBdOyAvLyBUZXh0IG9mIGNo
YW5nZS4KKwkJCXN3aXRjaCAoIG9wICkgeworCQkJY2FzZSBESUZGX0lOU0VSVDoKKwkJCQlodG1s
WyB4IF0gPSAiPGlucz4iICsgZGF0YSArICI8L2lucz4iOworCQkJCWJyZWFrOworCQkJY2FzZSBE
SUZGX0RFTEVURToKKwkJCQlodG1sWyB4IF0gPSAiPGRlbD4iICsgZGF0YSArICI8L2RlbD4iOwor
CQkJCWJyZWFrOworCQkJY2FzZSBESUZGX0VRVUFMOgorCQkJCWh0bWxbIHggXSA9ICI8c3Bhbj4i
ICsgZGF0YSArICI8L3NwYW4+IjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaHRt
bC5qb2luKCAiIiApOworCX07CisKKwkvKioKKwkgKiBEZXRlcm1pbmUgdGhlIGNvbW1vbiBwcmVm
aXggb2YgdHdvIHN0cmluZ3MuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0IHN0cmlu
Zy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy4KKwkgKiBAcmV0dXJu
IHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb21tb24gdG8gdGhlIHN0YXJ0IG9m
IGVhY2gKKwkgKiAgICAgc3RyaW5nLgorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5k
aWZmQ29tbW9uUHJlZml4ID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiApIHsKKwkJdmFyIHBvaW50
ZXJtaWQsIHBvaW50ZXJtYXgsIHBvaW50ZXJtaW4sIHBvaW50ZXJzdGFydDsKKwkJLy8gUXVpY2sg
Y2hlY2sgZm9yIGNvbW1vbiBudWxsIGNhc2VzLgorCQlpZiAoICF0ZXh0MSB8fCAhdGV4dDIgfHwg
dGV4dDEuY2hhckF0KCAwICkgIT09IHRleHQyLmNoYXJBdCggMCApICkgeworCQkJcmV0dXJuIDA7
CisJCX0KKwkJLy8gQmluYXJ5IHNlYXJjaC4KKwkJLy8gUGVyZm9ybWFuY2UgYW5hbHlzaXM6IGh0
dHA6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAwNy8xMC8wOS8KKwkJcG9pbnRlcm1pbiA9IDA7
CisJCXBvaW50ZXJtYXggPSBNYXRoLm1pbiggdGV4dDEubGVuZ3RoLCB0ZXh0Mi5sZW5ndGggKTsK
KwkJcG9pbnRlcm1pZCA9IHBvaW50ZXJtYXg7CisJCXBvaW50ZXJzdGFydCA9IDA7CisJCXdoaWxl
ICggcG9pbnRlcm1pbiA8IHBvaW50ZXJtaWQgKSB7CisJCQlpZiAoIHRleHQxLnN1YnN0cmluZygg
cG9pbnRlcnN0YXJ0LCBwb2ludGVybWlkICkgPT09CisJCQkJCXRleHQyLnN1YnN0cmluZyggcG9p
bnRlcnN0YXJ0LCBwb2ludGVybWlkICkgKSB7CisJCQkJcG9pbnRlcm1pbiA9IHBvaW50ZXJtaWQ7
CisJCQkJcG9pbnRlcnN0YXJ0ID0gcG9pbnRlcm1pbjsKKwkJCX0gZWxzZSB7CisJCQkJcG9pbnRl
cm1heCA9IHBvaW50ZXJtaWQ7CisJCQl9CisJCQlwb2ludGVybWlkID0gTWF0aC5mbG9vciggKCBw
b2ludGVybWF4IC0gcG9pbnRlcm1pbiApIC8gMiArIHBvaW50ZXJtaW4gKTsKKwkJfQorCQlyZXR1
cm4gcG9pbnRlcm1pZDsKKwl9OworCisJLyoqCisJICogRGV0ZXJtaW5lIHRoZSBjb21tb24gc3Vm
Zml4IG9mIHR3byBzdHJpbmdzLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJp
bmcuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNlY29uZCBzdHJpbmcuCisJICogQHJldHVy
biB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29tbW9uIHRvIHRoZSBlbmQgb2Yg
ZWFjaCBzdHJpbmcuCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDb21tb25T
dWZmaXggPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyICkgeworCQl2YXIgcG9pbnRlcm1pZCwgcG9p
bnRlcm1heCwgcG9pbnRlcm1pbiwgcG9pbnRlcmVuZDsKKwkJLy8gUXVpY2sgY2hlY2sgZm9yIGNv
bW1vbiBudWxsIGNhc2VzLgorCQlpZiAoICF0ZXh0MSB8fAorCQkJCSF0ZXh0MiB8fAorCQkJCXRl
eHQxLmNoYXJBdCggdGV4dDEubGVuZ3RoIC0gMSApICE9PSB0ZXh0Mi5jaGFyQXQoIHRleHQyLmxl
bmd0aCAtIDEgKSApIHsKKwkJCXJldHVybiAwOworCQl9CisJCS8vIEJpbmFyeSBzZWFyY2guCisJ
CS8vIFBlcmZvcm1hbmNlIGFuYWx5c2lzOiBodHRwOi8vbmVpbC5mcmFzZXIubmFtZS9uZXdzLzIw
MDcvMTAvMDkvCisJCXBvaW50ZXJtaW4gPSAwOworCQlwb2ludGVybWF4ID0gTWF0aC5taW4oIHRl
eHQxLmxlbmd0aCwgdGV4dDIubGVuZ3RoICk7CisJCXBvaW50ZXJtaWQgPSBwb2ludGVybWF4Owor
CQlwb2ludGVyZW5kID0gMDsKKwkJd2hpbGUgKCBwb2ludGVybWluIDwgcG9pbnRlcm1pZCApIHsK
KwkJCWlmICggdGV4dDEuc3Vic3RyaW5nKCB0ZXh0MS5sZW5ndGggLSBwb2ludGVybWlkLCB0ZXh0
MS5sZW5ndGggLSBwb2ludGVyZW5kICkgPT09CisJCQkJCXRleHQyLnN1YnN0cmluZyggdGV4dDIu
bGVuZ3RoIC0gcG9pbnRlcm1pZCwgdGV4dDIubGVuZ3RoIC0gcG9pbnRlcmVuZCApICkgeworCQkJ
CXBvaW50ZXJtaW4gPSBwb2ludGVybWlkOworCQkJCXBvaW50ZXJlbmQgPSBwb2ludGVybWluOwor
CQkJfSBlbHNlIHsKKwkJCQlwb2ludGVybWF4ID0gcG9pbnRlcm1pZDsKKwkJCX0KKwkJCXBvaW50
ZXJtaWQgPSBNYXRoLmZsb29yKCAoIHBvaW50ZXJtYXggLSBwb2ludGVybWluICkgLyAyICsgcG9p
bnRlcm1pbiApOworCQl9CisJCXJldHVybiBwb2ludGVybWlkOworCX07CisKKwkvKioKKwkgKiBG
aW5kIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byB0ZXh0cy4gIEFzc3VtZXMgdGhhdCB0aGUg
dGV4dHMgZG8gbm90CisJICogaGF2ZSBhbnkgY29tbW9uIHByZWZpeCBvciBzdWZmaXguCisJICog
QHBhcmFtIHtzdHJpbmd9IHRleHQxIE9sZCBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJh
bSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0ge2Jv
b2xlYW59IGNoZWNrbGluZXMgU3BlZWR1cCBmbGFnLiAgSWYgZmFsc2UsIHRoZW4gZG9uJ3QgcnVu
IGEKKwkgKiAgICAgbGluZS1sZXZlbCBkaWZmIGZpcnN0IHRvIGlkZW50aWZ5IHRoZSBjaGFuZ2Vk
IGFyZWFzLgorCSAqICAgICBJZiB0cnVlLCB0aGVuIHJ1biBhIGZhc3Rlciwgc2xpZ2h0bHkgbGVz
cyBvcHRpbWFsIGRpZmYuCisJICogQHBhcmFtIHtudW1iZXJ9IGRlYWRsaW5lIFRpbWUgd2hlbiB0
aGUgZGlmZiBzaG91bGQgYmUgY29tcGxldGUgYnkuCisJICogQHJldHVybiB7IUFycmF5LjwhRGlm
Zk1hdGNoUGF0Y2guRGlmZj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqIEBwcml2YXRlCisJ
ICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDb21wdXRlID0gZnVuY3Rpb24oIHRl
eHQxLCB0ZXh0MiwgY2hlY2tsaW5lcywgZGVhZGxpbmUgKSB7CisJCXZhciBkaWZmcywgbG9uZ3Rl
eHQsIHNob3J0dGV4dCwgaSwgaG0sCisJCQl0ZXh0MUEsIHRleHQyQSwgdGV4dDFCLCB0ZXh0MkIs
CisJCQltaWRDb21tb24sIGRpZmZzQSwgZGlmZnNCOworCisJCWlmICggIXRleHQxICkgeworCQkJ
Ly8gSnVzdCBhZGQgc29tZSB0ZXh0IChzcGVlZHVwKS4KKwkJCXJldHVybiBbCisJCQkJWyBESUZG
X0lOU0VSVCwgdGV4dDIgXQorCQkJXTsKKwkJfQorCisJCWlmICggIXRleHQyICkgeworCQkJLy8g
SnVzdCBkZWxldGUgc29tZSB0ZXh0IChzcGVlZHVwKS4KKwkJCXJldHVybiBbCisJCQkJWyBESUZG
X0RFTEVURSwgdGV4dDEgXQorCQkJXTsKKwkJfQorCisJCWxvbmd0ZXh0ID0gdGV4dDEubGVuZ3Ro
ID4gdGV4dDIubGVuZ3RoID8gdGV4dDEgOiB0ZXh0MjsKKwkJc2hvcnR0ZXh0ID0gdGV4dDEubGVu
Z3RoID4gdGV4dDIubGVuZ3RoID8gdGV4dDIgOiB0ZXh0MTsKKwkJaSA9IGxvbmd0ZXh0LmluZGV4
T2YoIHNob3J0dGV4dCApOworCQlpZiAoIGkgIT09IC0xICkgeworCQkJLy8gU2hvcnRlciB0ZXh0
IGlzIGluc2lkZSB0aGUgbG9uZ2VyIHRleHQgKHNwZWVkdXApLgorCQkJZGlmZnMgPSBbCisJCQkJ
WyBESUZGX0lOU0VSVCwgbG9uZ3RleHQuc3Vic3RyaW5nKCAwLCBpICkgXSwKKwkJCQlbIERJRkZf
RVFVQUwsIHNob3J0dGV4dCBdLAorCQkJCVsgRElGRl9JTlNFUlQsIGxvbmd0ZXh0LnN1YnN0cmlu
ZyggaSArIHNob3J0dGV4dC5sZW5ndGggKSBdCisJCQldOworCQkJLy8gU3dhcCBpbnNlcnRpb25z
IGZvciBkZWxldGlvbnMgaWYgZGlmZiBpcyByZXZlcnNlZC4KKwkJCWlmICggdGV4dDEubGVuZ3Ro
ID4gdGV4dDIubGVuZ3RoICkgeworCQkJCWRpZmZzWyAwIF1bIDAgXSA9IGRpZmZzWyAyIF1bIDAg
XSA9IERJRkZfREVMRVRFOworCQkJfQorCQkJcmV0dXJuIGRpZmZzOworCQl9CisKKwkJaWYgKCBz
aG9ydHRleHQubGVuZ3RoID09PSAxICkgeworCQkJLy8gU2luZ2xlIGNoYXJhY3RlciBzdHJpbmcu
CisJCQkvLyBBZnRlciB0aGUgcHJldmlvdXMgc3BlZWR1cCwgdGhlIGNoYXJhY3RlciBjYW4ndCBi
ZSBhbiBlcXVhbGl0eS4KKwkJCXJldHVybiBbCisJCQkJWyBESUZGX0RFTEVURSwgdGV4dDEgXSwK
KwkJCQlbIERJRkZfSU5TRVJULCB0ZXh0MiBdCisJCQldOworCQl9CisKKwkJLy8gQ2hlY2sgdG8g
c2VlIGlmIHRoZSBwcm9ibGVtIGNhbiBiZSBzcGxpdCBpbiB0d28uCisJCWhtID0gdGhpcy5kaWZm
SGFsZk1hdGNoKCB0ZXh0MSwgdGV4dDIgKTsKKwkJaWYgKCBobSApIHsKKwkJCS8vIEEgaGFsZi1t
YXRjaCB3YXMgZm91bmQsIHNvcnQgb3V0IHRoZSByZXR1cm4gZGF0YS4KKwkJCXRleHQxQSA9IGht
WyAwIF07CisJCQl0ZXh0MUIgPSBobVsgMSBdOworCQkJdGV4dDJBID0gaG1bIDIgXTsKKwkJCXRl
eHQyQiA9IGhtWyAzIF07CisJCQltaWRDb21tb24gPSBobVsgNCBdOworCQkJLy8gU2VuZCBib3Ro
IHBhaXJzIG9mZiBmb3Igc2VwYXJhdGUgcHJvY2Vzc2luZy4KKwkJCWRpZmZzQSA9IHRoaXMuRGlm
Zk1haW4oIHRleHQxQSwgdGV4dDJBLCBjaGVja2xpbmVzLCBkZWFkbGluZSApOworCQkJZGlmZnNC
ID0gdGhpcy5EaWZmTWFpbiggdGV4dDFCLCB0ZXh0MkIsIGNoZWNrbGluZXMsIGRlYWRsaW5lICk7
CisJCQkvLyBNZXJnZSB0aGUgcmVzdWx0cy4KKwkJCXJldHVybiBkaWZmc0EuY29uY2F0KCBbCisJ
CQkJWyBESUZGX0VRVUFMLCBtaWRDb21tb24gXQorCQkJXSwgZGlmZnNCICk7CisJCX0KKworCQlp
ZiAoIGNoZWNrbGluZXMgJiYgdGV4dDEubGVuZ3RoID4gMTAwICYmIHRleHQyLmxlbmd0aCA+IDEw
MCApIHsKKwkJCXJldHVybiB0aGlzLmRpZmZMaW5lTW9kZSggdGV4dDEsIHRleHQyLCBkZWFkbGlu
ZSApOworCQl9CisKKwkJcmV0dXJuIHRoaXMuZGlmZkJpc2VjdCggdGV4dDEsIHRleHQyLCBkZWFk
bGluZSApOworCX07CisKKwkvKioKKwkgKiBEbyB0aGUgdHdvIHRleHRzIHNoYXJlIGEgc3Vic3Ry
aW5nIHdoaWNoIGlzIGF0IGxlYXN0IGhhbGYgdGhlIGxlbmd0aCBvZiB0aGUKKwkgKiBsb25nZXIg
dGV4dD8KKwkgKiBUaGlzIHNwZWVkdXAgY2FuIHByb2R1Y2Ugbm9uLW1pbmltYWwgZGlmZnMuCisJ
ICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0IHN0cmluZy4KKwkgKiBAcGFyYW0ge3N0cmlu
Z30gdGV4dDIgU2Vjb25kIHN0cmluZy4KKwkgKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gRml2
ZSBlbGVtZW50IEFycmF5LCBjb250YWluaW5nIHRoZSBwcmVmaXggb2YKKwkgKiAgICAgdGV4dDEs
IHRoZSBzdWZmaXggb2YgdGV4dDEsIHRoZSBwcmVmaXggb2YgdGV4dDIsIHRoZSBzdWZmaXggb2YK
KwkgKiAgICAgdGV4dDIgYW5kIHRoZSBjb21tb24gbWlkZGxlLiAgT3IgbnVsbCBpZiB0aGVyZSB3
YXMgbm8gbWF0Y2guCisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5
cGUuZGlmZkhhbGZNYXRjaCA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIgKSB7CisJCXZhciBsb25n
dGV4dCwgc2hvcnR0ZXh0LCBkbXAsCisJCQl0ZXh0MUEsIHRleHQyQiwgdGV4dDJBLCB0ZXh0MUIs
IG1pZENvbW1vbiwKKwkJCWhtMSwgaG0yLCBobTsKKworCQlsb25ndGV4dCA9IHRleHQxLmxlbmd0
aCA+IHRleHQyLmxlbmd0aCA/IHRleHQxIDogdGV4dDI7CisJCXNob3J0dGV4dCA9IHRleHQxLmxl
bmd0aCA+IHRleHQyLmxlbmd0aCA/IHRleHQyIDogdGV4dDE7CisJCWlmICggbG9uZ3RleHQubGVu
Z3RoIDwgNCB8fCBzaG9ydHRleHQubGVuZ3RoICogMiA8IGxvbmd0ZXh0Lmxlbmd0aCApIHsKKwkJ
CXJldHVybiBudWxsOyAvLyBQb2ludGxlc3MuCisJCX0KKwkJZG1wID0gdGhpczsgLy8gJ3RoaXMn
IGJlY29tZXMgJ3dpbmRvdycgaW4gYSBjbG9zdXJlLgorCisJCS8qKgorCQkgKiBEb2VzIGEgc3Vi
c3RyaW5nIG9mIHNob3J0dGV4dCBleGlzdCB3aXRoaW4gbG9uZ3RleHQgc3VjaCB0aGF0IHRoZSBz
dWJzdHJpbmcKKwkJICogaXMgYXQgbGVhc3QgaGFsZiB0aGUgbGVuZ3RoIG9mIGxvbmd0ZXh0Pwor
CQkgKiBDbG9zdXJlLCBidXQgZG9lcyBub3QgcmVmZXJlbmNlIGFueSBleHRlcm5hbCB2YXJpYWJs
ZXMuCisJCSAqIEBwYXJhbSB7c3RyaW5nfSBsb25ndGV4dCBMb25nZXIgc3RyaW5nLgorCQkgKiBA
cGFyYW0ge3N0cmluZ30gc2hvcnR0ZXh0IFNob3J0ZXIgc3RyaW5nLgorCQkgKiBAcGFyYW0ge251
bWJlcn0gaSBTdGFydCBpbmRleCBvZiBxdWFydGVyIGxlbmd0aCBzdWJzdHJpbmcgd2l0aGluIGxv
bmd0ZXh0LgorCQkgKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gRml2ZSBlbGVtZW50IEFycmF5
LCBjb250YWluaW5nIHRoZSBwcmVmaXggb2YKKwkJICogICAgIGxvbmd0ZXh0LCB0aGUgc3VmZml4
IG9mIGxvbmd0ZXh0LCB0aGUgcHJlZml4IG9mIHNob3J0dGV4dCwgdGhlIHN1ZmZpeAorCQkgKiAg
ICAgb2Ygc2hvcnR0ZXh0IGFuZCB0aGUgY29tbW9uIG1pZGRsZS4gIE9yIG51bGwgaWYgdGhlcmUg
d2FzIG5vIG1hdGNoLgorCQkgKiBAcHJpdmF0ZQorCQkgKi8KKwkJZnVuY3Rpb24gZGlmZkhhbGZN
YXRjaEkoIGxvbmd0ZXh0LCBzaG9ydHRleHQsIGkgKSB7CisJCQl2YXIgc2VlZCwgaiwgYmVzdENv
bW1vbiwgcHJlZml4TGVuZ3RoLCBzdWZmaXhMZW5ndGgsCisJCQkJYmVzdExvbmd0ZXh0QSwgYmVz
dExvbmd0ZXh0QiwgYmVzdFNob3J0dGV4dEEsIGJlc3RTaG9ydHRleHRCOworCQkJLy8gU3RhcnQg
d2l0aCBhIDEvNCBsZW5ndGggc3Vic3RyaW5nIGF0IHBvc2l0aW9uIGkgYXMgYSBzZWVkLgorCQkJ
c2VlZCA9IGxvbmd0ZXh0LnN1YnN0cmluZyggaSwgaSArIE1hdGguZmxvb3IoIGxvbmd0ZXh0Lmxl
bmd0aCAvIDQgKSApOworCQkJaiA9IC0xOworCQkJYmVzdENvbW1vbiA9ICIiOworCQkJd2hpbGUg
KCAoIGogPSBzaG9ydHRleHQuaW5kZXhPZiggc2VlZCwgaiArIDEgKSApICE9PSAtMSApIHsKKwkJ
CQlwcmVmaXhMZW5ndGggPSBkbXAuZGlmZkNvbW1vblByZWZpeCggbG9uZ3RleHQuc3Vic3RyaW5n
KCBpICksCisJCQkJCXNob3J0dGV4dC5zdWJzdHJpbmcoIGogKSApOworCQkJCXN1ZmZpeExlbmd0
aCA9IGRtcC5kaWZmQ29tbW9uU3VmZml4KCBsb25ndGV4dC5zdWJzdHJpbmcoIDAsIGkgKSwKKwkJ
CQkJc2hvcnR0ZXh0LnN1YnN0cmluZyggMCwgaiApICk7CisJCQkJaWYgKCBiZXN0Q29tbW9uLmxl
bmd0aCA8IHN1ZmZpeExlbmd0aCArIHByZWZpeExlbmd0aCApIHsKKwkJCQkJYmVzdENvbW1vbiA9
IHNob3J0dGV4dC5zdWJzdHJpbmcoIGogLSBzdWZmaXhMZW5ndGgsIGogKSArCisJCQkJCQlzaG9y
dHRleHQuc3Vic3RyaW5nKCBqLCBqICsgcHJlZml4TGVuZ3RoICk7CisJCQkJCWJlc3RMb25ndGV4
dEEgPSBsb25ndGV4dC5zdWJzdHJpbmcoIDAsIGkgLSBzdWZmaXhMZW5ndGggKTsKKwkJCQkJYmVz
dExvbmd0ZXh0QiA9IGxvbmd0ZXh0LnN1YnN0cmluZyggaSArIHByZWZpeExlbmd0aCApOworCQkJ
CQliZXN0U2hvcnR0ZXh0QSA9IHNob3J0dGV4dC5zdWJzdHJpbmcoIDAsIGogLSBzdWZmaXhMZW5n
dGggKTsKKwkJCQkJYmVzdFNob3J0dGV4dEIgPSBzaG9ydHRleHQuc3Vic3RyaW5nKCBqICsgcHJl
Zml4TGVuZ3RoICk7CisJCQkJfQorCQkJfQorCQkJaWYgKCBiZXN0Q29tbW9uLmxlbmd0aCAqIDIg
Pj0gbG9uZ3RleHQubGVuZ3RoICkgeworCQkJCXJldHVybiBbIGJlc3RMb25ndGV4dEEsIGJlc3RM
b25ndGV4dEIsCisJCQkJCWJlc3RTaG9ydHRleHRBLCBiZXN0U2hvcnR0ZXh0QiwgYmVzdENvbW1v
bgorCQkJCV07CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisKKwkJ
Ly8gRmlyc3QgY2hlY2sgaWYgdGhlIHNlY29uZCBxdWFydGVyIGlzIHRoZSBzZWVkIGZvciBhIGhh
bGYtbWF0Y2guCisJCWhtMSA9IGRpZmZIYWxmTWF0Y2hJKCBsb25ndGV4dCwgc2hvcnR0ZXh0LAor
CQkJTWF0aC5jZWlsKCBsb25ndGV4dC5sZW5ndGggLyA0ICkgKTsKKwkJLy8gQ2hlY2sgYWdhaW4g
YmFzZWQgb24gdGhlIHRoaXJkIHF1YXJ0ZXIuCisJCWhtMiA9IGRpZmZIYWxmTWF0Y2hJKCBsb25n
dGV4dCwgc2hvcnR0ZXh0LAorCQkJTWF0aC5jZWlsKCBsb25ndGV4dC5sZW5ndGggLyAyICkgKTsK
KwkJaWYgKCAhaG0xICYmICFobTIgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfSBlbHNlIGlmICgg
IWhtMiApIHsKKwkJCWhtID0gaG0xOworCQl9IGVsc2UgaWYgKCAhaG0xICkgeworCQkJaG0gPSBo
bTI7CisJCX0gZWxzZSB7CisJCQkvLyBCb3RoIG1hdGNoZWQuICBTZWxlY3QgdGhlIGxvbmdlc3Qu
CisJCQlobSA9IGhtMVsgNCBdLmxlbmd0aCA+IGhtMlsgNCBdLmxlbmd0aCA/IGhtMSA6IGhtMjsK
KwkJfQorCisJCS8vIEEgaGFsZi1tYXRjaCB3YXMgZm91bmQsIHNvcnQgb3V0IHRoZSByZXR1cm4g
ZGF0YS4KKwkJdGV4dDFBLCB0ZXh0MUIsIHRleHQyQSwgdGV4dDJCOworCQlpZiAoIHRleHQxLmxl
bmd0aCA+IHRleHQyLmxlbmd0aCApIHsKKwkJCXRleHQxQSA9IGhtWyAwIF07CisJCQl0ZXh0MUIg
PSBobVsgMSBdOworCQkJdGV4dDJBID0gaG1bIDIgXTsKKwkJCXRleHQyQiA9IGhtWyAzIF07CisJ
CX0gZWxzZSB7CisJCQl0ZXh0MkEgPSBobVsgMCBdOworCQkJdGV4dDJCID0gaG1bIDEgXTsKKwkJ
CXRleHQxQSA9IGhtWyAyIF07CisJCQl0ZXh0MUIgPSBobVsgMyBdOworCQl9CisJCW1pZENvbW1v
biA9IGhtWyA0IF07CisJCXJldHVybiBbIHRleHQxQSwgdGV4dDFCLCB0ZXh0MkEsIHRleHQyQiwg
bWlkQ29tbW9uIF07CisJfTsKKworCS8qKgorCSAqIERvIGEgcXVpY2sgbGluZS1sZXZlbCBkaWZm
IG9uIGJvdGggc3RyaW5ncywgdGhlbiByZWRpZmYgdGhlIHBhcnRzIGZvcgorCSAqIGdyZWF0ZXIg
YWNjdXJhY3kuCisJICogVGhpcyBzcGVlZHVwIGNhbiBwcm9kdWNlIG5vbi1taW5pbWFsIGRpZmZz
LgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkg
KiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBh
cmFtIHtudW1iZXJ9IGRlYWRsaW5lIFRpbWUgd2hlbiB0aGUgZGlmZiBzaG91bGQgYmUgY29tcGxl
dGUgYnkuCisJICogQHJldHVybiB7IUFycmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59IEFycmF5
IG9mIGRpZmYgdHVwbGVzLgorCSAqIEBwcml2YXRlCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJv
dG90eXBlLmRpZmZMaW5lTW9kZSA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIsIGRlYWRsaW5lICkg
eworCQl2YXIgYSwgZGlmZnMsIGxpbmVhcnJheSwgcG9pbnRlciwgY291bnRJbnNlcnQsCisJCQlj
b3VudERlbGV0ZSwgdGV4dEluc2VydCwgdGV4dERlbGV0ZSwgajsKKwkJLy8gU2NhbiB0aGUgdGV4
dCBvbiBhIGxpbmUtYnktbGluZSBiYXNpcyBmaXJzdC4KKwkJYSA9IHRoaXMuZGlmZkxpbmVzVG9D
aGFycyggdGV4dDEsIHRleHQyICk7CisJCXRleHQxID0gYS5jaGFyczE7CisJCXRleHQyID0gYS5j
aGFyczI7CisJCWxpbmVhcnJheSA9IGEubGluZUFycmF5OworCisJCWRpZmZzID0gdGhpcy5EaWZm
TWFpbiggdGV4dDEsIHRleHQyLCBmYWxzZSwgZGVhZGxpbmUgKTsKKworCQkvLyBDb252ZXJ0IHRo
ZSBkaWZmIGJhY2sgdG8gb3JpZ2luYWwgdGV4dC4KKwkJdGhpcy5kaWZmQ2hhcnNUb0xpbmVzKCBk
aWZmcywgbGluZWFycmF5ICk7CisJCS8vIEVsaW1pbmF0ZSBmcmVhayBtYXRjaGVzIChlLmcuIGJs
YW5rIGxpbmVzKQorCQl0aGlzLmRpZmZDbGVhbnVwU2VtYW50aWMoIGRpZmZzICk7CisKKwkJLy8g
UmVkaWZmIGFueSByZXBsYWNlbWVudCBibG9ja3MsIHRoaXMgdGltZSBjaGFyYWN0ZXItYnktY2hh
cmFjdGVyLgorCQkvLyBBZGQgYSBkdW1teSBlbnRyeSBhdCB0aGUgZW5kLgorCQlkaWZmcy5wdXNo
KCBbIERJRkZfRVFVQUwsICIiIF0gKTsKKwkJcG9pbnRlciA9IDA7CisJCWNvdW50RGVsZXRlID0g
MDsKKwkJY291bnRJbnNlcnQgPSAwOworCQl0ZXh0RGVsZXRlID0gIiI7CisJCXRleHRJbnNlcnQg
PSAiIjsKKwkJd2hpbGUgKCBwb2ludGVyIDwgZGlmZnMubGVuZ3RoICkgeworCQkJc3dpdGNoICgg
ZGlmZnNbIHBvaW50ZXIgXVsgMCBdICkgeworCQkJY2FzZSBESUZGX0lOU0VSVDoKKwkJCQljb3Vu
dEluc2VydCsrOworCQkJCXRleHRJbnNlcnQgKz0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJ
CWJyZWFrOworCQkJY2FzZSBESUZGX0RFTEVURToKKwkJCQljb3VudERlbGV0ZSsrOworCQkJCXRl
eHREZWxldGUgKz0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJCWJyZWFrOworCQkJY2FzZSBE
SUZGX0VRVUFMOgorCQkJCS8vIFVwb24gcmVhY2hpbmcgYW4gZXF1YWxpdHksIGNoZWNrIGZvciBw
cmlvciByZWR1bmRhbmNpZXMuCisJCQkJaWYgKCBjb3VudERlbGV0ZSA+PSAxICYmIGNvdW50SW5z
ZXJ0ID49IDEgKSB7CisJCQkJCS8vIERlbGV0ZSB0aGUgb2ZmZW5kaW5nIHJlY29yZHMgYW5kIGFk
ZCB0aGUgbWVyZ2VkIG9uZXMuCisJCQkJCWRpZmZzLnNwbGljZSggcG9pbnRlciAtIGNvdW50RGVs
ZXRlIC0gY291bnRJbnNlcnQsCisJCQkJCQljb3VudERlbGV0ZSArIGNvdW50SW5zZXJ0ICk7CisJ
CQkJCXBvaW50ZXIgPSBwb2ludGVyIC0gY291bnREZWxldGUgLSBjb3VudEluc2VydDsKKwkJCQkJ
YSA9IHRoaXMuRGlmZk1haW4oIHRleHREZWxldGUsIHRleHRJbnNlcnQsIGZhbHNlLCBkZWFkbGlu
ZSApOworCQkJCQlmb3IgKCBqID0gYS5sZW5ndGggLSAxOyBqID49IDA7IGotLSApIHsKKwkJCQkJ
CWRpZmZzLnNwbGljZSggcG9pbnRlciwgMCwgYVsgaiBdICk7CisJCQkJCX0KKwkJCQkJcG9pbnRl
ciA9IHBvaW50ZXIgKyBhLmxlbmd0aDsKKwkJCQl9CisJCQkJY291bnRJbnNlcnQgPSAwOworCQkJ
CWNvdW50RGVsZXRlID0gMDsKKwkJCQl0ZXh0RGVsZXRlID0gIiI7CisJCQkJdGV4dEluc2VydCA9
ICIiOworCQkJCWJyZWFrOworCQkJfQorCQkJcG9pbnRlcisrOworCQl9CisJCWRpZmZzLnBvcCgp
OyAvLyBSZW1vdmUgdGhlIGR1bW15IGVudHJ5IGF0IHRoZSBlbmQuCisKKwkJcmV0dXJuIGRpZmZz
OworCX07CisKKwkvKioKKwkgKiBGaW5kIHRoZSAnbWlkZGxlIHNuYWtlJyBvZiBhIGRpZmYsIHNw
bGl0IHRoZSBwcm9ibGVtIGluIHR3bworCSAqIGFuZCByZXR1cm4gdGhlIHJlY3Vyc2l2ZWx5IGNv
bnN0cnVjdGVkIGRpZmYuCisJICogU2VlIE15ZXJzIDE5ODYgcGFwZXI6IEFuIE8oTkQpIERpZmZl
cmVuY2UgQWxnb3JpdGhtIGFuZCBJdHMgVmFyaWF0aW9ucy4KKwkgKiBAcGFyYW0ge3N0cmluZ30g
dGV4dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQy
IE5ldyBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7bnVtYmVyfSBkZWFkbGluZSBU
aW1lIGF0IHdoaWNoIHRvIGJhaWwgaWYgbm90IHlldCBjb21wbGV0ZS4KKwkgKiBAcmV0dXJuIHsh
QXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gQXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICog
QHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkJpc2VjdCA9IGZ1
bmN0aW9uKCB0ZXh0MSwgdGV4dDIsIGRlYWRsaW5lICkgeworCQl2YXIgdGV4dDFMZW5ndGgsIHRl
eHQyTGVuZ3RoLCBtYXhELCB2T2Zmc2V0LCB2TGVuZ3RoLAorCQkJdjEsIHYyLCB4LCBkZWx0YSwg
ZnJvbnQsIGsxc3RhcnQsIGsxZW5kLCBrMnN0YXJ0LAorCQkJazJlbmQsIGsyT2Zmc2V0LCBrMU9m
ZnNldCwgeDEsIHgyLCB5MSwgeTIsIGQsIGsxLCBrMjsKKwkJLy8gQ2FjaGUgdGhlIHRleHQgbGVu
Z3RocyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzLgorCQl0ZXh0MUxlbmd0aCA9IHRleHQxLmxl
bmd0aDsKKwkJdGV4dDJMZW5ndGggPSB0ZXh0Mi5sZW5ndGg7CisJCW1heEQgPSBNYXRoLmNlaWwo
ICggdGV4dDFMZW5ndGggKyB0ZXh0Mkxlbmd0aCApIC8gMiApOworCQl2T2Zmc2V0ID0gbWF4RDsK
KwkJdkxlbmd0aCA9IDIgKiBtYXhEOworCQl2MSA9IG5ldyBBcnJheSggdkxlbmd0aCApOworCQl2
MiA9IG5ldyBBcnJheSggdkxlbmd0aCApOworCQkvLyBTZXR0aW5nIGFsbCBlbGVtZW50cyB0byAt
MSBpcyBmYXN0ZXIgaW4gQ2hyb21lICYgRmlyZWZveCB0aGFuIG1peGluZworCQkvLyBpbnRlZ2Vy
cyBhbmQgdW5kZWZpbmVkLgorCQlmb3IgKCB4ID0gMDsgeCA8IHZMZW5ndGg7IHgrKyApIHsKKwkJ
CXYxWyB4IF0gPSAtMTsKKwkJCXYyWyB4IF0gPSAtMTsKKwkJfQorCQl2MVsgdk9mZnNldCArIDEg
XSA9IDA7CisJCXYyWyB2T2Zmc2V0ICsgMSBdID0gMDsKKwkJZGVsdGEgPSB0ZXh0MUxlbmd0aCAt
IHRleHQyTGVuZ3RoOworCQkvLyBJZiB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaXMg
b2RkLCB0aGVuIHRoZSBmcm9udCBwYXRoIHdpbGwgY29sbGlkZQorCQkvLyB3aXRoIHRoZSByZXZl
cnNlIHBhdGguCisJCWZyb250ID0gKCBkZWx0YSAlIDIgIT09IDAgKTsKKwkJLy8gT2Zmc2V0cyBm
b3Igc3RhcnQgYW5kIGVuZCBvZiBrIGxvb3AuCisJCS8vIFByZXZlbnRzIG1hcHBpbmcgb2Ygc3Bh
Y2UgYmV5b25kIHRoZSBncmlkLgorCQlrMXN0YXJ0ID0gMDsKKwkJazFlbmQgPSAwOworCQlrMnN0
YXJ0ID0gMDsKKwkJazJlbmQgPSAwOworCQlmb3IgKCBkID0gMDsgZCA8IG1heEQ7IGQrKyApIHsK
KwkJCS8vIEJhaWwgb3V0IGlmIGRlYWRsaW5lIGlzIHJlYWNoZWQuCisJCQlpZiAoICggbmV3IERh
dGUoKSApLmdldFRpbWUoKSA+IGRlYWRsaW5lICkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQkv
LyBXYWxrIHRoZSBmcm9udCBwYXRoIG9uZSBzdGVwLgorCQkJZm9yICggazEgPSAtZCArIGsxc3Rh
cnQ7IGsxIDw9IGQgLSBrMWVuZDsgazEgKz0gMiApIHsKKwkJCQlrMU9mZnNldCA9IHZPZmZzZXQg
KyBrMTsKKwkJCQlpZiAoIGsxID09PSAtZCB8fCAoIGsxICE9PSBkICYmIHYxWyBrMU9mZnNldCAt
IDEgXSA8IHYxWyBrMU9mZnNldCArIDEgXSApICkgeworCQkJCQl4MSA9IHYxWyBrMU9mZnNldCAr
IDEgXTsKKwkJCQl9IGVsc2UgeworCQkJCQl4MSA9IHYxWyBrMU9mZnNldCAtIDEgXSArIDE7CisJ
CQkJfQorCQkJCXkxID0geDEgLSBrMTsKKwkJCQl3aGlsZSAoIHgxIDwgdGV4dDFMZW5ndGggJiYg
eTEgPCB0ZXh0Mkxlbmd0aCAmJgorCQkJCQl0ZXh0MS5jaGFyQXQoIHgxICkgPT09IHRleHQyLmNo
YXJBdCggeTEgKSApIHsKKwkJCQkJeDErKzsKKwkJCQkJeTErKzsKKwkJCQl9CisJCQkJdjFbIGsx
T2Zmc2V0IF0gPSB4MTsKKwkJCQlpZiAoIHgxID4gdGV4dDFMZW5ndGggKSB7CisJCQkJCS8vIFJh
biBvZmYgdGhlIHJpZ2h0IG9mIHRoZSBncmFwaC4KKwkJCQkJazFlbmQgKz0gMjsKKwkJCQl9IGVs
c2UgaWYgKCB5MSA+IHRleHQyTGVuZ3RoICkgeworCQkJCQkvLyBSYW4gb2ZmIHRoZSBib3R0b20g
b2YgdGhlIGdyYXBoLgorCQkJCQlrMXN0YXJ0ICs9IDI7CisJCQkJfSBlbHNlIGlmICggZnJvbnQg
KSB7CisJCQkJCWsyT2Zmc2V0ID0gdk9mZnNldCArIGRlbHRhIC0gazE7CisJCQkJCWlmICggazJP
ZmZzZXQgPj0gMCAmJiBrMk9mZnNldCA8IHZMZW5ndGggJiYgdjJbIGsyT2Zmc2V0IF0gIT09IC0x
ICkgeworCQkJCQkJLy8gTWlycm9yIHgyIG9udG8gdG9wLWxlZnQgY29vcmRpbmF0ZSBzeXN0ZW0u
CisJCQkJCQl4MiA9IHRleHQxTGVuZ3RoIC0gdjJbIGsyT2Zmc2V0IF07CisJCQkJCQlpZiAoIHgx
ID49IHgyICkgeworCQkJCQkJCS8vIE92ZXJsYXAgZGV0ZWN0ZWQuCisJCQkJCQkJcmV0dXJuIHRo
aXMuZGlmZkJpc2VjdFNwbGl0KCB0ZXh0MSwgdGV4dDIsIHgxLCB5MSwgZGVhZGxpbmUgKTsKKwkJ
CQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gV2FsayB0aGUgcmV2ZXJzZSBwYXRo
IG9uZSBzdGVwLgorCQkJZm9yICggazIgPSAtZCArIGsyc3RhcnQ7IGsyIDw9IGQgLSBrMmVuZDsg
azIgKz0gMiApIHsKKwkJCQlrMk9mZnNldCA9IHZPZmZzZXQgKyBrMjsKKwkJCQlpZiAoIGsyID09
PSAtZCB8fCAoIGsyICE9PSBkICYmIHYyWyBrMk9mZnNldCAtIDEgXSA8IHYyWyBrMk9mZnNldCAr
IDEgXSApICkgeworCQkJCQl4MiA9IHYyWyBrMk9mZnNldCArIDEgXTsKKwkJCQl9IGVsc2Ugewor
CQkJCQl4MiA9IHYyWyBrMk9mZnNldCAtIDEgXSArIDE7CisJCQkJfQorCQkJCXkyID0geDIgLSBr
MjsKKwkJCQl3aGlsZSAoIHgyIDwgdGV4dDFMZW5ndGggJiYgeTIgPCB0ZXh0Mkxlbmd0aCAmJgor
CQkJCQl0ZXh0MS5jaGFyQXQoIHRleHQxTGVuZ3RoIC0geDIgLSAxICkgPT09CisJCQkJCXRleHQy
LmNoYXJBdCggdGV4dDJMZW5ndGggLSB5MiAtIDEgKSApIHsKKwkJCQkJeDIrKzsKKwkJCQkJeTIr
KzsKKwkJCQl9CisJCQkJdjJbIGsyT2Zmc2V0IF0gPSB4MjsKKwkJCQlpZiAoIHgyID4gdGV4dDFM
ZW5ndGggKSB7CisJCQkJCS8vIFJhbiBvZmYgdGhlIGxlZnQgb2YgdGhlIGdyYXBoLgorCQkJCQlr
MmVuZCArPSAyOworCQkJCX0gZWxzZSBpZiAoIHkyID4gdGV4dDJMZW5ndGggKSB7CisJCQkJCS8v
IFJhbiBvZmYgdGhlIHRvcCBvZiB0aGUgZ3JhcGguCisJCQkJCWsyc3RhcnQgKz0gMjsKKwkJCQl9
IGVsc2UgaWYgKCAhZnJvbnQgKSB7CisJCQkJCWsxT2Zmc2V0ID0gdk9mZnNldCArIGRlbHRhIC0g
azI7CisJCQkJCWlmICggazFPZmZzZXQgPj0gMCAmJiBrMU9mZnNldCA8IHZMZW5ndGggJiYgdjFb
IGsxT2Zmc2V0IF0gIT09IC0xICkgeworCQkJCQkJeDEgPSB2MVsgazFPZmZzZXQgXTsKKwkJCQkJ
CXkxID0gdk9mZnNldCArIHgxIC0gazFPZmZzZXQ7CisJCQkJCQkvLyBNaXJyb3IgeDIgb250byB0
b3AtbGVmdCBjb29yZGluYXRlIHN5c3RlbS4KKwkJCQkJCXgyID0gdGV4dDFMZW5ndGggLSB4MjsK
KwkJCQkJCWlmICggeDEgPj0geDIgKSB7CisJCQkJCQkJLy8gT3ZlcmxhcCBkZXRlY3RlZC4KKwkJ
CQkJCQlyZXR1cm4gdGhpcy5kaWZmQmlzZWN0U3BsaXQoIHRleHQxLCB0ZXh0MiwgeDEsIHkxLCBk
ZWFkbGluZSApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8vIERpZmYg
dG9vayB0b28gbG9uZyBhbmQgaGl0IHRoZSBkZWFkbGluZSBvcgorCQkvLyBudW1iZXIgb2YgZGlm
ZnMgZXF1YWxzIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBubyBjb21tb25hbGl0eSBhdCBhbGwuCisJ
CXJldHVybiBbCisJCQlbIERJRkZfREVMRVRFLCB0ZXh0MSBdLAorCQkJWyBESUZGX0lOU0VSVCwg
dGV4dDIgXQorCQldOworCX07CisKKwkvKioKKwkgKiBHaXZlbiB0aGUgbG9jYXRpb24gb2YgdGhl
ICdtaWRkbGUgc25ha2UnLCBzcGxpdCB0aGUgZGlmZiBpbiB0d28gcGFydHMKKwkgKiBhbmQgcmVj
dXJzZS4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQu
CisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIE5ldyBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAq
IEBwYXJhbSB7bnVtYmVyfSB4IEluZGV4IG9mIHNwbGl0IHBvaW50IGluIHRleHQxLgorCSAqIEBw
YXJhbSB7bnVtYmVyfSB5IEluZGV4IG9mIHNwbGl0IHBvaW50IGluIHRleHQyLgorCSAqIEBwYXJh
bSB7bnVtYmVyfSBkZWFkbGluZSBUaW1lIGF0IHdoaWNoIHRvIGJhaWwgaWYgbm90IHlldCBjb21w
bGV0ZS4KKwkgKiBAcmV0dXJuIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gQXJyYXkg
b2YgZGlmZiB0dXBsZXMuCisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90
b3R5cGUuZGlmZkJpc2VjdFNwbGl0ID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiwgeCwgeSwgZGVh
ZGxpbmUgKSB7CisJCXZhciB0ZXh0MWEsIHRleHQxYiwgdGV4dDJhLCB0ZXh0MmIsIGRpZmZzLCBk
aWZmc2I7CisJCXRleHQxYSA9IHRleHQxLnN1YnN0cmluZyggMCwgeCApOworCQl0ZXh0MmEgPSB0
ZXh0Mi5zdWJzdHJpbmcoIDAsIHkgKTsKKwkJdGV4dDFiID0gdGV4dDEuc3Vic3RyaW5nKCB4ICk7
CisJCXRleHQyYiA9IHRleHQyLnN1YnN0cmluZyggeSApOworCisJCS8vIENvbXB1dGUgYm90aCBk
aWZmcyBzZXJpYWxseS4KKwkJZGlmZnMgPSB0aGlzLkRpZmZNYWluKCB0ZXh0MWEsIHRleHQyYSwg
ZmFsc2UsIGRlYWRsaW5lICk7CisJCWRpZmZzYiA9IHRoaXMuRGlmZk1haW4oIHRleHQxYiwgdGV4
dDJiLCBmYWxzZSwgZGVhZGxpbmUgKTsKKworCQlyZXR1cm4gZGlmZnMuY29uY2F0KCBkaWZmc2Ig
KTsKKwl9OworCisJLyoqCisJICogUmVkdWNlIHRoZSBudW1iZXIgb2YgZWRpdHMgYnkgZWxpbWlu
YXRpbmcgc2VtYW50aWNhbGx5IHRyaXZpYWwgZXF1YWxpdGllcy4KKwkgKiBAcGFyYW0geyFBcnJh
eS48IURpZmZNYXRjaFBhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkg
Ki8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNsZWFudXBTZW1hbnRpYyA9IGZ1bmN0
aW9uKCBkaWZmcyApIHsKKwkJdmFyIGNoYW5nZXMsIGVxdWFsaXRpZXMsIGVxdWFsaXRpZXNMZW5n
dGgsIGxhc3RlcXVhbGl0eSwKKwkJCXBvaW50ZXIsIGxlbmd0aEluc2VydGlvbnMyLCBsZW5ndGhE
ZWxldGlvbnMyLCBsZW5ndGhJbnNlcnRpb25zMSwKKwkJCWxlbmd0aERlbGV0aW9uczEsIGRlbGV0
aW9uLCBpbnNlcnRpb24sIG92ZXJsYXBMZW5ndGgxLCBvdmVybGFwTGVuZ3RoMjsKKwkJY2hhbmdl
cyA9IGZhbHNlOworCQllcXVhbGl0aWVzID0gW107IC8vIFN0YWNrIG9mIGluZGljZXMgd2hlcmUg
ZXF1YWxpdGllcyBhcmUgZm91bmQuCisJCWVxdWFsaXRpZXNMZW5ndGggPSAwOyAvLyBLZWVwaW5n
IG91ciBvd24gbGVuZ3RoIHZhciBpcyBmYXN0ZXIgaW4gSlMuCisJCS8qKiBAdHlwZSB7P3N0cmlu
Z30gKi8KKwkJbGFzdGVxdWFsaXR5ID0gbnVsbDsKKwkJLy8gQWx3YXlzIGVxdWFsIHRvIGRpZmZz
W2VxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCAtIDFdXVsxXQorCQlwb2ludGVyID0gMDsgLy8g
SW5kZXggb2YgY3VycmVudCBwb3NpdGlvbi4KKwkJLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhh
dCBjaGFuZ2VkIHByaW9yIHRvIHRoZSBlcXVhbGl0eS4KKwkJbGVuZ3RoSW5zZXJ0aW9uczEgPSAw
OworCQlsZW5ndGhEZWxldGlvbnMxID0gMDsKKwkJLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhh
dCBjaGFuZ2VkIGFmdGVyIHRoZSBlcXVhbGl0eS4KKwkJbGVuZ3RoSW5zZXJ0aW9uczIgPSAwOwor
CQlsZW5ndGhEZWxldGlvbnMyID0gMDsKKwkJd2hpbGUgKCBwb2ludGVyIDwgZGlmZnMubGVuZ3Ro
ICkgeworCQkJaWYgKCBkaWZmc1sgcG9pbnRlciBdWyAwIF0gPT09IERJRkZfRVFVQUwgKSB7IC8v
IEVxdWFsaXR5IGZvdW5kLgorCQkJCWVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGgrKyBdID0g
cG9pbnRlcjsKKwkJCQlsZW5ndGhJbnNlcnRpb25zMSA9IGxlbmd0aEluc2VydGlvbnMyOworCQkJ
CWxlbmd0aERlbGV0aW9uczEgPSBsZW5ndGhEZWxldGlvbnMyOworCQkJCWxlbmd0aEluc2VydGlv
bnMyID0gMDsKKwkJCQlsZW5ndGhEZWxldGlvbnMyID0gMDsKKwkJCQlsYXN0ZXF1YWxpdHkgPSBk
aWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQl9IGVsc2UgeyAvLyBBbiBpbnNlcnRpb24gb3IgZGVs
ZXRpb24uCisJCQkJaWYgKCBkaWZmc1sgcG9pbnRlciBdWyAwIF0gPT09IERJRkZfSU5TRVJUICkg
eworCQkJCQlsZW5ndGhJbnNlcnRpb25zMiArPSBkaWZmc1sgcG9pbnRlciBdWyAxIF0ubGVuZ3Ro
OworCQkJCX0gZWxzZSB7CisJCQkJCWxlbmd0aERlbGV0aW9uczIgKz0gZGlmZnNbIHBvaW50ZXIg
XVsgMSBdLmxlbmd0aDsKKwkJCQl9CisJCQkJLy8gRWxpbWluYXRlIGFuIGVxdWFsaXR5IHRoYXQg
aXMgc21hbGxlciBvciBlcXVhbCB0byB0aGUgZWRpdHMgb24gYm90aAorCQkJCS8vIHNpZGVzIG9m
IGl0LgorCQkJCWlmICggbGFzdGVxdWFsaXR5ICYmICggbGFzdGVxdWFsaXR5Lmxlbmd0aCA8PQor
CQkJCQkJTWF0aC5tYXgoIGxlbmd0aEluc2VydGlvbnMxLCBsZW5ndGhEZWxldGlvbnMxICkgKSAm
JgorCQkJCQkJKCBsYXN0ZXF1YWxpdHkubGVuZ3RoIDw9IE1hdGgubWF4KCBsZW5ndGhJbnNlcnRp
b25zMiwKKwkJCQkJCQlsZW5ndGhEZWxldGlvbnMyICkgKSApIHsKKworCQkJCQkvLyBEdXBsaWNh
dGUgcmVjb3JkLgorCQkJCQlkaWZmcy5zcGxpY2UoCisJCQkJCQllcXVhbGl0aWVzWyBlcXVhbGl0
aWVzTGVuZ3RoIC0gMSBdLAorCQkJCQkJMCwKKwkJCQkJCVsgRElGRl9ERUxFVEUsIGxhc3RlcXVh
bGl0eSBdCisJCQkJCSk7CisKKwkJCQkJLy8gQ2hhbmdlIHNlY29uZCBjb3B5IHRvIGluc2VydC4K
KwkJCQkJZGlmZnNbIGVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGggLSAxIF0gKyAxIF1bIDAg
XSA9IERJRkZfSU5TRVJUOworCisJCQkJCS8vIFRocm93IGF3YXkgdGhlIGVxdWFsaXR5IHdlIGp1
c3QgZGVsZXRlZC4KKwkJCQkJZXF1YWxpdGllc0xlbmd0aC0tOworCisJCQkJCS8vIFRocm93IGF3
YXkgdGhlIHByZXZpb3VzIGVxdWFsaXR5IChpdCBuZWVkcyB0byBiZSByZWV2YWx1YXRlZCkuCisJ
CQkJCWVxdWFsaXRpZXNMZW5ndGgtLTsKKwkJCQkJcG9pbnRlciA9IGVxdWFsaXRpZXNMZW5ndGgg
PiAwID8gZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCAtIDEgXSA6IC0xOworCisJCQkJCS8v
IFJlc2V0IHRoZSBjb3VudGVycy4KKwkJCQkJbGVuZ3RoSW5zZXJ0aW9uczEgPSAwOworCQkJCQls
ZW5ndGhEZWxldGlvbnMxID0gMDsKKwkJCQkJbGVuZ3RoSW5zZXJ0aW9uczIgPSAwOworCQkJCQls
ZW5ndGhEZWxldGlvbnMyID0gMDsKKwkJCQkJbGFzdGVxdWFsaXR5ID0gbnVsbDsKKwkJCQkJY2hh
bmdlcyA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJcG9pbnRlcisrOworCQl9CisKKwkJLy8gTm9y
bWFsaXplIHRoZSBkaWZmLgorCQlpZiAoIGNoYW5nZXMgKSB7CisJCQl0aGlzLmRpZmZDbGVhbnVw
TWVyZ2UoIGRpZmZzICk7CisJCX0KKworCQkvLyBGaW5kIGFueSBvdmVybGFwcyBiZXR3ZWVuIGRl
bGV0aW9ucyBhbmQgaW5zZXJ0aW9ucy4KKwkJLy8gZS5nOiA8ZGVsPmFiY3h4eDwvZGVsPjxpbnM+
eHh4ZGVmPC9pbnM+CisJCS8vICAgLT4gPGRlbD5hYmM8L2RlbD54eHg8aW5zPmRlZjwvaW5zPgor
CQkvLyBlLmc6IDxkZWw+eHh4YWJjPC9kZWw+PGlucz5kZWZ4eHg8L2lucz4KKwkJLy8gICAtPiA8
aW5zPmRlZjwvaW5zPnh4eDxkZWw+YWJjPC9kZWw+CisJCS8vIE9ubHkgZXh0cmFjdCBhbiBvdmVy
bGFwIGlmIGl0IGlzIGFzIGJpZyBhcyB0aGUgZWRpdCBhaGVhZCBvciBiZWhpbmQgaXQuCisJCXBv
aW50ZXIgPSAxOworCQl3aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggKSB7CisJCQlpZiAo
IGRpZmZzWyBwb2ludGVyIC0gMSBdWyAwIF0gPT09IERJRkZfREVMRVRFICYmCisJCQkJCWRpZmZz
WyBwb2ludGVyIF1bIDAgXSA9PT0gRElGRl9JTlNFUlQgKSB7CisJCQkJZGVsZXRpb24gPSBkaWZm
c1sgcG9pbnRlciAtIDEgXVsgMSBdOworCQkJCWluc2VydGlvbiA9IGRpZmZzWyBwb2ludGVyIF1b
IDEgXTsKKwkJCQlvdmVybGFwTGVuZ3RoMSA9IHRoaXMuZGlmZkNvbW1vbk92ZXJsYXAoIGRlbGV0
aW9uLCBpbnNlcnRpb24gKTsKKwkJCQlvdmVybGFwTGVuZ3RoMiA9IHRoaXMuZGlmZkNvbW1vbk92
ZXJsYXAoIGluc2VydGlvbiwgZGVsZXRpb24gKTsKKwkJCQlpZiAoIG92ZXJsYXBMZW5ndGgxID49
IG92ZXJsYXBMZW5ndGgyICkgeworCQkJCQlpZiAoIG92ZXJsYXBMZW5ndGgxID49IGRlbGV0aW9u
Lmxlbmd0aCAvIDIgfHwKKwkJCQkJCQlvdmVybGFwTGVuZ3RoMSA+PSBpbnNlcnRpb24ubGVuZ3Ro
IC8gMiApIHsKKwkJCQkJCS8vIE92ZXJsYXAgZm91bmQuICBJbnNlcnQgYW4gZXF1YWxpdHkgYW5k
IHRyaW0gdGhlIHN1cnJvdW5kaW5nIGVkaXRzLgorCQkJCQkJZGlmZnMuc3BsaWNlKAorCQkJCQkJ
CXBvaW50ZXIsCisJCQkJCQkJMCwKKwkJCQkJCQlbIERJRkZfRVFVQUwsIGluc2VydGlvbi5zdWJz
dHJpbmcoIDAsIG92ZXJsYXBMZW5ndGgxICkgXQorCQkJCQkJKTsKKwkJCQkJCWRpZmZzWyBwb2lu
dGVyIC0gMSBdWyAxIF0gPQorCQkJCQkJCWRlbGV0aW9uLnN1YnN0cmluZyggMCwgZGVsZXRpb24u
bGVuZ3RoIC0gb3ZlcmxhcExlbmd0aDEgKTsKKwkJCQkJCWRpZmZzWyBwb2ludGVyICsgMSBdWyAx
IF0gPSBpbnNlcnRpb24uc3Vic3RyaW5nKCBvdmVybGFwTGVuZ3RoMSApOworCQkJCQkJcG9pbnRl
cisrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCBvdmVybGFwTGVuZ3RoMiA+PSBk
ZWxldGlvbi5sZW5ndGggLyAyIHx8CisJCQkJCQkJb3ZlcmxhcExlbmd0aDIgPj0gaW5zZXJ0aW9u
Lmxlbmd0aCAvIDIgKSB7CisKKwkJCQkJCS8vIFJldmVyc2Ugb3ZlcmxhcCBmb3VuZC4KKwkJCQkJ
CS8vIEluc2VydCBhbiBlcXVhbGl0eSBhbmQgc3dhcCBhbmQgdHJpbSB0aGUgc3Vycm91bmRpbmcg
ZWRpdHMuCisJCQkJCQlkaWZmcy5zcGxpY2UoCisJCQkJCQkJcG9pbnRlciwKKwkJCQkJCQkwLAor
CQkJCQkJCVsgRElGRl9FUVVBTCwgZGVsZXRpb24uc3Vic3RyaW5nKCAwLCBvdmVybGFwTGVuZ3Ro
MiApIF0KKwkJCQkJCSk7CisKKwkJCQkJCWRpZmZzWyBwb2ludGVyIC0gMSBdWyAwIF0gPSBESUZG
X0lOU0VSVDsKKwkJCQkJCWRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0gPQorCQkJCQkJCWluc2Vy
dGlvbi5zdWJzdHJpbmcoIDAsIGluc2VydGlvbi5sZW5ndGggLSBvdmVybGFwTGVuZ3RoMiApOwor
CQkJCQkJZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDAgXSA9IERJRkZfREVMRVRFOworCQkJCQkJZGlm
ZnNbIHBvaW50ZXIgKyAxIF1bIDEgXSA9CisJCQkJCQkJZGVsZXRpb24uc3Vic3RyaW5nKCBvdmVy
bGFwTGVuZ3RoMiApOworCQkJCQkJcG9pbnRlcisrOworCQkJCQl9CisJCQkJfQorCQkJCXBvaW50
ZXIrKzsKKwkJCX0KKwkJCXBvaW50ZXIrKzsKKwkJfQorCX07CisKKwkvKioKKwkgKiBEZXRlcm1p
bmUgaWYgdGhlIHN1ZmZpeCBvZiBvbmUgc3RyaW5nIGlzIHRoZSBwcmVmaXggb2YgYW5vdGhlci4K
KwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLgorCSAqIEBwYXJhbSB7c3Ry
aW5nfSB0ZXh0MiBTZWNvbmQgc3RyaW5nLgorCSAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJl
ciBvZiBjaGFyYWN0ZXJzIGNvbW1vbiB0byB0aGUgZW5kIG9mIHRoZSBmaXJzdAorCSAqICAgICBz
dHJpbmcgYW5kIHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIHN0cmluZy4KKwkgKiBAcHJpdmF0ZQor
CSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uT3ZlcmxhcCA9IGZ1bmN0
aW9uKCB0ZXh0MSwgdGV4dDIgKSB7CisJCXZhciB0ZXh0MUxlbmd0aCwgdGV4dDJMZW5ndGgsIHRl
eHRMZW5ndGgsCisJCQliZXN0LCBsZW5ndGgsIHBhdHRlcm4sIGZvdW5kOworCQkvLyBDYWNoZSB0
aGUgdGV4dCBsZW5ndGhzIHRvIHByZXZlbnQgbXVsdGlwbGUgY2FsbHMuCisJCXRleHQxTGVuZ3Ro
ID0gdGV4dDEubGVuZ3RoOworCQl0ZXh0Mkxlbmd0aCA9IHRleHQyLmxlbmd0aDsKKwkJLy8gRWxp
bWluYXRlIHRoZSBudWxsIGNhc2UuCisJCWlmICggdGV4dDFMZW5ndGggPT09IDAgfHwgdGV4dDJM
ZW5ndGggPT09IDAgKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvLyBUcnVuY2F0ZSB0aGUgbG9u
Z2VyIHN0cmluZy4KKwkJaWYgKCB0ZXh0MUxlbmd0aCA+IHRleHQyTGVuZ3RoICkgeworCQkJdGV4
dDEgPSB0ZXh0MS5zdWJzdHJpbmcoIHRleHQxTGVuZ3RoIC0gdGV4dDJMZW5ndGggKTsKKwkJfSBl
bHNlIGlmICggdGV4dDFMZW5ndGggPCB0ZXh0Mkxlbmd0aCApIHsKKwkJCXRleHQyID0gdGV4dDIu
c3Vic3RyaW5nKCAwLCB0ZXh0MUxlbmd0aCApOworCQl9CisJCXRleHRMZW5ndGggPSBNYXRoLm1p
biggdGV4dDFMZW5ndGgsIHRleHQyTGVuZ3RoICk7CisJCS8vIFF1aWNrIGNoZWNrIGZvciB0aGUg
d29yc3QgY2FzZS4KKwkJaWYgKCB0ZXh0MSA9PT0gdGV4dDIgKSB7CisJCQlyZXR1cm4gdGV4dExl
bmd0aDsKKwkJfQorCisJCS8vIFN0YXJ0IGJ5IGxvb2tpbmcgZm9yIGEgc2luZ2xlIGNoYXJhY3Rl
ciBtYXRjaAorCQkvLyBhbmQgaW5jcmVhc2UgbGVuZ3RoIHVudGlsIG5vIG1hdGNoIGlzIGZvdW5k
LgorCQkvLyBQZXJmb3JtYW5jZSBhbmFseXNpczogaHR0cDovL25laWwuZnJhc2VyLm5hbWUvbmV3
cy8yMDEwLzExLzA0LworCQliZXN0ID0gMDsKKwkJbGVuZ3RoID0gMTsKKwkJd2hpbGUgKCB0cnVl
ICkgeworCQkJcGF0dGVybiA9IHRleHQxLnN1YnN0cmluZyggdGV4dExlbmd0aCAtIGxlbmd0aCAp
OworCQkJZm91bmQgPSB0ZXh0Mi5pbmRleE9mKCBwYXR0ZXJuICk7CisJCQlpZiAoIGZvdW5kID09
PSAtMSApIHsKKwkJCQlyZXR1cm4gYmVzdDsKKwkJCX0KKwkJCWxlbmd0aCArPSBmb3VuZDsKKwkJ
CWlmICggZm91bmQgPT09IDAgfHwgdGV4dDEuc3Vic3RyaW5nKCB0ZXh0TGVuZ3RoIC0gbGVuZ3Ro
ICkgPT09CisJCQkJCXRleHQyLnN1YnN0cmluZyggMCwgbGVuZ3RoICkgKSB7CisJCQkJYmVzdCA9
IGxlbmd0aDsKKwkJCQlsZW5ndGgrKzsKKwkJCX0KKwkJfQorCX07CisKKwkvKioKKwkgKiBTcGxp
dCB0d28gdGV4dHMgaW50byBhbiBhcnJheSBvZiBzdHJpbmdzLiAgUmVkdWNlIHRoZSB0ZXh0cyB0
byBhIHN0cmluZyBvZgorCSAqIGhhc2hlcyB3aGVyZSBlYWNoIFVuaWNvZGUgY2hhcmFjdGVyIHJl
cHJlc2VudHMgb25lIGxpbmUuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0IHN0cmlu
Zy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy4KKwkgKiBAcmV0dXJu
IHt7Y2hhcnMxOiBzdHJpbmcsIGNoYXJzMjogc3RyaW5nLCBsaW5lQXJyYXk6ICFBcnJheS48c3Ry
aW5nPn19CisJICogICAgIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBlbmNvZGVkIHRleHQxLCB0
aGUgZW5jb2RlZCB0ZXh0MiBhbmQKKwkgKiAgICAgdGhlIGFycmF5IG9mIHVuaXF1ZSBzdHJpbmdz
LgorCSAqICAgICBUaGUgemVyb3RoIGVsZW1lbnQgb2YgdGhlIGFycmF5IG9mIHVuaXF1ZSBzdHJp
bmdzIGlzIGludGVudGlvbmFsbHkgYmxhbmsuCisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0
Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkxpbmVzVG9DaGFycyA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4
dDIgKSB7CisJCXZhciBsaW5lQXJyYXksIGxpbmVIYXNoLCBjaGFyczEsIGNoYXJzMjsKKwkJbGlu
ZUFycmF5ID0gW107IC8vIGUuZy4gbGluZUFycmF5WzRdID09PSAnSGVsbG9cbicKKwkJbGluZUhh
c2ggPSB7fTsgLy8gZS5nLiBsaW5lSGFzaFsnSGVsbG9cbiddID09PSA0CisKKwkJLy8gJ1x4MDAn
IGlzIGEgdmFsaWQgY2hhcmFjdGVyLCBidXQgdmFyaW91cyBkZWJ1Z2dlcnMgZG9uJ3QgbGlrZSBp
dC4KKwkJLy8gU28gd2UnbGwgaW5zZXJ0IGEganVuayBlbnRyeSB0byBhdm9pZCBnZW5lcmF0aW5n
IGEgbnVsbCBjaGFyYWN0ZXIuCisJCWxpbmVBcnJheVsgMCBdID0gIiI7CisKKwkJLyoqCisJCSAq
IFNwbGl0IGEgdGV4dCBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuICBSZWR1Y2UgdGhlIHRleHRz
IHRvIGEgc3RyaW5nIG9mCisJCSAqIGhhc2hlcyB3aGVyZSBlYWNoIFVuaWNvZGUgY2hhcmFjdGVy
IHJlcHJlc2VudHMgb25lIGxpbmUuCisJCSAqIE1vZGlmaWVzIGxpbmVhcnJheSBhbmQgbGluZWhh
c2ggdGhyb3VnaCBiZWluZyBhIGNsb3N1cmUuCisJCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFN0
cmluZyB0byBlbmNvZGUuCisJCSAqIEByZXR1cm4ge3N0cmluZ30gRW5jb2RlZCBzdHJpbmcuCisJ
CSAqIEBwcml2YXRlCisJCSAqLworCQlmdW5jdGlvbiBkaWZmTGluZXNUb0NoYXJzTXVuZ2UoIHRl
eHQgKSB7CisJCQl2YXIgY2hhcnMsIGxpbmVTdGFydCwgbGluZUVuZCwgbGluZUFycmF5TGVuZ3Ro
LCBsaW5lOworCQkJY2hhcnMgPSAiIjsKKwkJCS8vIFdhbGsgdGhlIHRleHQsIHB1bGxpbmcgb3V0
IGEgc3Vic3RyaW5nIGZvciBlYWNoIGxpbmUuCisJCQkvLyB0ZXh0LnNwbGl0KCdcbicpIHdvdWxk
IHdvdWxkIHRlbXBvcmFyaWx5IGRvdWJsZSBvdXIgbWVtb3J5IGZvb3RwcmludC4KKwkJCS8vIE1v
ZGlmeWluZyB0ZXh0IHdvdWxkIGNyZWF0ZSBtYW55IGxhcmdlIHN0cmluZ3MgdG8gZ2FyYmFnZSBj
b2xsZWN0LgorCQkJbGluZVN0YXJ0ID0gMDsKKwkJCWxpbmVFbmQgPSAtMTsKKwkJCS8vIEtlZXBp
bmcgb3VyIG93biBsZW5ndGggdmFyaWFibGUgaXMgZmFzdGVyIHRoYW4gbG9va2luZyBpdCB1cC4K
KwkJCWxpbmVBcnJheUxlbmd0aCA9IGxpbmVBcnJheS5sZW5ndGg7CisJCQl3aGlsZSAoIGxpbmVF
bmQgPCB0ZXh0Lmxlbmd0aCAtIDEgKSB7CisJCQkJbGluZUVuZCA9IHRleHQuaW5kZXhPZiggIlxu
IiwgbGluZVN0YXJ0ICk7CisJCQkJaWYgKCBsaW5lRW5kID09PSAtMSApIHsKKwkJCQkJbGluZUVu
ZCA9IHRleHQubGVuZ3RoIC0gMTsKKwkJCQl9CisJCQkJbGluZSA9IHRleHQuc3Vic3RyaW5nKCBs
aW5lU3RhcnQsIGxpbmVFbmQgKyAxICk7CisJCQkJbGluZVN0YXJ0ID0gbGluZUVuZCArIDE7CisK
KwkJCQlpZiAoIGxpbmVIYXNoLmhhc093blByb3BlcnR5ID8gbGluZUhhc2guaGFzT3duUHJvcGVy
dHkoIGxpbmUgKSA6CisJCQkJCQkJKCBsaW5lSGFzaFsgbGluZSBdICE9PSB1bmRlZmluZWQgKSAp
IHsKKwkJCQkJY2hhcnMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggbGluZUhhc2hbIGxpbmUgXSAp
OworCQkJCX0gZWxzZSB7CisJCQkJCWNoYXJzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGxpbmVB
cnJheUxlbmd0aCApOworCQkJCQlsaW5lSGFzaFsgbGluZSBdID0gbGluZUFycmF5TGVuZ3RoOwor
CQkJCQlsaW5lQXJyYXlbIGxpbmVBcnJheUxlbmd0aCsrIF0gPSBsaW5lOworCQkJCX0KKwkJCX0K
KwkJCXJldHVybiBjaGFyczsKKwkJfQorCisJCWNoYXJzMSA9IGRpZmZMaW5lc1RvQ2hhcnNNdW5n
ZSggdGV4dDEgKTsKKwkJY2hhcnMyID0gZGlmZkxpbmVzVG9DaGFyc011bmdlKCB0ZXh0MiApOwor
CQlyZXR1cm4geworCQkJY2hhcnMxOiBjaGFyczEsCisJCQljaGFyczI6IGNoYXJzMiwKKwkJCWxp
bmVBcnJheTogbGluZUFycmF5CisJCX07CisJfTsKKworCS8qKgorCSAqIFJlaHlkcmF0ZSB0aGUg
dGV4dCBpbiBhIGRpZmYgZnJvbSBhIHN0cmluZyBvZiBsaW5lIGhhc2hlcyB0byByZWFsIGxpbmVz
IG9mCisJICogdGV4dC4KKwkgKiBAcGFyYW0geyFBcnJheS48IURpZmZNYXRjaFBhdGNoLkRpZmY+
fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKiBAcGFyYW0geyFBcnJheS48c3RyaW5n
Pn0gbGluZUFycmF5IEFycmF5IG9mIHVuaXF1ZSBzdHJpbmdzLgorCSAqIEBwcml2YXRlCisJICov
CisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDaGFyc1RvTGluZXMgPSBmdW5jdGlvbigg
ZGlmZnMsIGxpbmVBcnJheSApIHsKKwkJdmFyIHgsIGNoYXJzLCB0ZXh0LCB5OworCQlmb3IgKCB4
ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrICkgeworCQkJY2hhcnMgPSBkaWZmc1sgeCBdWyAx
IF07CisJCQl0ZXh0ID0gW107CisJCQlmb3IgKCB5ID0gMDsgeSA8IGNoYXJzLmxlbmd0aDsgeSsr
ICkgeworCQkJCXRleHRbIHkgXSA9IGxpbmVBcnJheVsgY2hhcnMuY2hhckNvZGVBdCggeSApIF07
CisJCQl9CisJCQlkaWZmc1sgeCBdWyAxIF0gPSB0ZXh0LmpvaW4oICIiICk7CisJCX0KKwl9Owor
CisJLyoqCisJICogUmVvcmRlciBhbmQgbWVyZ2UgbGlrZSBlZGl0IHNlY3Rpb25zLiAgTWVyZ2Ug
ZXF1YWxpdGllcy4KKwkgKiBBbnkgZWRpdCBzZWN0aW9uIGNhbiBtb3ZlIGFzIGxvbmcgYXMgaXQg
ZG9lc24ndCBjcm9zcyBhbiBlcXVhbGl0eS4KKwkgKiBAcGFyYW0geyFBcnJheS48IURpZmZNYXRj
aFBhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKi8KKwlEaWZmTWF0
Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNsZWFudXBNZXJnZSA9IGZ1bmN0aW9uKCBkaWZmcyApIHsK
KwkJdmFyIHBvaW50ZXIsIGNvdW50RGVsZXRlLCBjb3VudEluc2VydCwgdGV4dEluc2VydCwgdGV4
dERlbGV0ZSwKKwkJCWNvbW1vbmxlbmd0aCwgY2hhbmdlcywgZGlmZlBvaW50ZXIsIHBvc2l0aW9u
OworCQlkaWZmcy5wdXNoKCBbIERJRkZfRVFVQUwsICIiIF0gKTsgLy8gQWRkIGEgZHVtbXkgZW50
cnkgYXQgdGhlIGVuZC4KKwkJcG9pbnRlciA9IDA7CisJCWNvdW50RGVsZXRlID0gMDsKKwkJY291
bnRJbnNlcnQgPSAwOworCQl0ZXh0RGVsZXRlID0gIiI7CisJCXRleHRJbnNlcnQgPSAiIjsKKwkJ
Y29tbW9ubGVuZ3RoOworCQl3aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggKSB7CisJCQlz
d2l0Y2ggKCBkaWZmc1sgcG9pbnRlciBdWyAwIF0gKSB7CisJCQljYXNlIERJRkZfSU5TRVJUOgor
CQkJCWNvdW50SW5zZXJ0Kys7CisJCQkJdGV4dEluc2VydCArPSBkaWZmc1sgcG9pbnRlciBdWyAx
IF07CisJCQkJcG9pbnRlcisrOworCQkJCWJyZWFrOworCQkJY2FzZSBESUZGX0RFTEVURToKKwkJ
CQljb3VudERlbGV0ZSsrOworCQkJCXRleHREZWxldGUgKz0gZGlmZnNbIHBvaW50ZXIgXVsgMSBd
OworCQkJCXBvaW50ZXIrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgRElGRl9FUVVBTDoKKwkJCQkv
LyBVcG9uIHJlYWNoaW5nIGFuIGVxdWFsaXR5LCBjaGVjayBmb3IgcHJpb3IgcmVkdW5kYW5jaWVz
LgorCQkJCWlmICggY291bnREZWxldGUgKyBjb3VudEluc2VydCA+IDEgKSB7CisJCQkJCWlmICgg
Y291bnREZWxldGUgIT09IDAgJiYgY291bnRJbnNlcnQgIT09IDAgKSB7CisJCQkJCQkvLyBGYWN0
b3Igb3V0IGFueSBjb21tb24gcHJlZml4aWVzLgorCQkJCQkJY29tbW9ubGVuZ3RoID0gdGhpcy5k
aWZmQ29tbW9uUHJlZml4KCB0ZXh0SW5zZXJ0LCB0ZXh0RGVsZXRlICk7CisJCQkJCQlpZiAoIGNv
bW1vbmxlbmd0aCAhPT0gMCApIHsKKwkJCQkJCQlpZiAoICggcG9pbnRlciAtIGNvdW50RGVsZXRl
IC0gY291bnRJbnNlcnQgKSA+IDAgJiYKKwkJCQkJCQkJCWRpZmZzWyBwb2ludGVyIC0gY291bnRE
ZWxldGUgLSBjb3VudEluc2VydCAtIDEgXVsgMCBdID09PQorCQkJCQkJCQkJRElGRl9FUVVBTCAp
IHsKKwkJCQkJCQkJZGlmZnNbIHBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50SW5zZXJ0IC0g
MSBdWyAxIF0gKz0KKwkJCQkJCQkJCXRleHRJbnNlcnQuc3Vic3RyaW5nKCAwLCBjb21tb25sZW5n
dGggKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlkaWZmcy5zcGxpY2UoIDAsIDAsIFsgRElG
Rl9FUVVBTCwKKwkJCQkJCQkJCXRleHRJbnNlcnQuc3Vic3RyaW5nKCAwLCBjb21tb25sZW5ndGgg
KQorCQkJCQkJCQldICk7CisJCQkJCQkJCXBvaW50ZXIrKzsKKwkJCQkJCQl9CisJCQkJCQkJdGV4
dEluc2VydCA9IHRleHRJbnNlcnQuc3Vic3RyaW5nKCBjb21tb25sZW5ndGggKTsKKwkJCQkJCQl0
ZXh0RGVsZXRlID0gdGV4dERlbGV0ZS5zdWJzdHJpbmcoIGNvbW1vbmxlbmd0aCApOworCQkJCQkJ
fQorCQkJCQkJLy8gRmFjdG9yIG91dCBhbnkgY29tbW9uIHN1ZmZpeGllcy4KKwkJCQkJCWNvbW1v
bmxlbmd0aCA9IHRoaXMuZGlmZkNvbW1vblN1ZmZpeCggdGV4dEluc2VydCwgdGV4dERlbGV0ZSAp
OworCQkJCQkJaWYgKCBjb21tb25sZW5ndGggIT09IDAgKSB7CisJCQkJCQkJZGlmZnNbIHBvaW50
ZXIgXVsgMSBdID0gdGV4dEluc2VydC5zdWJzdHJpbmcoIHRleHRJbnNlcnQubGVuZ3RoIC0KKwkJ
CQkJCQkJCWNvbW1vbmxlbmd0aCApICsgZGlmZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJCQkJCXRl
eHRJbnNlcnQgPSB0ZXh0SW5zZXJ0LnN1YnN0cmluZyggMCwgdGV4dEluc2VydC5sZW5ndGggLQor
CQkJCQkJCQljb21tb25sZW5ndGggKTsKKwkJCQkJCQl0ZXh0RGVsZXRlID0gdGV4dERlbGV0ZS5z
dWJzdHJpbmcoIDAsIHRleHREZWxldGUubGVuZ3RoIC0KKwkJCQkJCQkJY29tbW9ubGVuZ3RoICk7
CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gRGVsZXRlIHRoZSBvZmZlbmRpbmcgcmVjb3JkcyBh
bmQgYWRkIHRoZSBtZXJnZWQgb25lcy4KKwkJCQkJaWYgKCBjb3VudERlbGV0ZSA9PT0gMCApIHsK
KwkJCQkJCWRpZmZzLnNwbGljZSggcG9pbnRlciAtIGNvdW50SW5zZXJ0LAorCQkJCQkJCWNvdW50
RGVsZXRlICsgY291bnRJbnNlcnQsIFsgRElGRl9JTlNFUlQsIHRleHRJbnNlcnQgXSApOworCQkJ
CQl9IGVsc2UgaWYgKCBjb3VudEluc2VydCA9PT0gMCApIHsKKwkJCQkJCWRpZmZzLnNwbGljZSgg
cG9pbnRlciAtIGNvdW50RGVsZXRlLAorCQkJCQkJCWNvdW50RGVsZXRlICsgY291bnRJbnNlcnQs
IFsgRElGRl9ERUxFVEUsIHRleHREZWxldGUgXSApOworCQkJCQl9IGVsc2UgeworCQkJCQkJZGlm
ZnMuc3BsaWNlKAorCQkJCQkJCXBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50SW5zZXJ0LAor
CQkJCQkJCWNvdW50RGVsZXRlICsgY291bnRJbnNlcnQsCisJCQkJCQkJWyBESUZGX0RFTEVURSwg
dGV4dERlbGV0ZSBdLCBbIERJRkZfSU5TRVJULCB0ZXh0SW5zZXJ0IF0KKwkJCQkJCSk7CisJCQkJ
CX0KKwkJCQkJcG9pbnRlciA9IHBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50SW5zZXJ0ICsK
KwkJCQkJCSggY291bnREZWxldGUgPyAxIDogMCApICsgKCBjb3VudEluc2VydCA/IDEgOiAwICkg
KyAxOworCQkJCX0gZWxzZSBpZiAoIHBvaW50ZXIgIT09IDAgJiYgZGlmZnNbIHBvaW50ZXIgLSAx
IF1bIDAgXSA9PT0gRElGRl9FUVVBTCApIHsKKworCQkJCQkvLyBNZXJnZSB0aGlzIGVxdWFsaXR5
IHdpdGggdGhlIHByZXZpb3VzIG9uZS4KKwkJCQkJZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXSAr
PSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJCWRpZmZzLnNwbGljZSggcG9pbnRlciwgMSAp
OworCQkJCX0gZWxzZSB7CisJCQkJCXBvaW50ZXIrKzsKKwkJCQl9CisJCQkJY291bnRJbnNlcnQg
PSAwOworCQkJCWNvdW50RGVsZXRlID0gMDsKKwkJCQl0ZXh0RGVsZXRlID0gIiI7CisJCQkJdGV4
dEluc2VydCA9ICIiOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICggZGlmZnNbIGRpZmZz
Lmxlbmd0aCAtIDEgXVsgMSBdID09PSAiIiApIHsKKwkJCWRpZmZzLnBvcCgpOyAvLyBSZW1vdmUg
dGhlIGR1bW15IGVudHJ5IGF0IHRoZSBlbmQuCisJCX0KKworCQkvLyBTZWNvbmQgcGFzczogbG9v
ayBmb3Igc2luZ2xlIGVkaXRzIHN1cnJvdW5kZWQgb24gYm90aCBzaWRlcyBieSBlcXVhbGl0aWVz
CisJCS8vIHdoaWNoIGNhbiBiZSBzaGlmdGVkIHNpZGV3YXlzIHRvIGVsaW1pbmF0ZSBhbiBlcXVh
bGl0eS4KKwkJLy8gZS5nOiBBPGlucz5CQTwvaW5zPkMgLT4gPGlucz5BQjwvaW5zPkFDCisJCWNo
YW5nZXMgPSBmYWxzZTsKKwkJcG9pbnRlciA9IDE7CisKKwkJLy8gSW50ZW50aW9uYWxseSBpZ25v
cmUgdGhlIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnQgKGRvbid0IG5lZWQgY2hlY2tpbmcpLgorCQl3
aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggLSAxICkgeworCQkJaWYgKCBkaWZmc1sgcG9p
bnRlciAtIDEgXVsgMCBdID09PSBESUZGX0VRVUFMICYmCisJCQkJCWRpZmZzWyBwb2ludGVyICsg
MSBdWyAwIF0gPT09IERJRkZfRVFVQUwgKSB7CisKKwkJCQlkaWZmUG9pbnRlciA9IGRpZmZzWyBw
b2ludGVyIF1bIDEgXTsKKwkJCQlwb3NpdGlvbiA9IGRpZmZQb2ludGVyLnN1YnN0cmluZygKKwkJ
CQkJZGlmZlBvaW50ZXIubGVuZ3RoIC0gZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXS5sZW5ndGgK
KwkJCQkpOworCisJCQkJLy8gVGhpcyBpcyBhIHNpbmdsZSBlZGl0IHN1cnJvdW5kZWQgYnkgZXF1
YWxpdGllcy4KKwkJCQlpZiAoIHBvc2l0aW9uID09PSBkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBd
ICkgeworCisJCQkJCS8vIFNoaWZ0IHRoZSBlZGl0IG92ZXIgdGhlIHByZXZpb3VzIGVxdWFsaXR5
LgorCQkJCQlkaWZmc1sgcG9pbnRlciBdWyAxIF0gPSBkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBd
ICsKKwkJCQkJCWRpZmZzWyBwb2ludGVyIF1bIDEgXS5zdWJzdHJpbmcoIDAsIGRpZmZzWyBwb2lu
dGVyIF1bIDEgXS5sZW5ndGggLQorCQkJCQkJCWRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0ubGVu
Z3RoICk7CisJCQkJCWRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF0gPQorCQkJCQkJZGlmZnNbIHBv
aW50ZXIgLSAxIF1bIDEgXSArIGRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF07CisJCQkJCWRpZmZz
LnNwbGljZSggcG9pbnRlciAtIDEsIDEgKTsKKwkJCQkJY2hhbmdlcyA9IHRydWU7CisJCQkJfSBl
bHNlIGlmICggZGlmZlBvaW50ZXIuc3Vic3RyaW5nKCAwLCBkaWZmc1sgcG9pbnRlciArIDEgXVsg
MSBdLmxlbmd0aCApID09PQorCQkJCQkJZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXSApIHsKKwor
CQkJCQkvLyBTaGlmdCB0aGUgZWRpdCBvdmVyIHRoZSBuZXh0IGVxdWFsaXR5LgorCQkJCQlkaWZm
c1sgcG9pbnRlciAtIDEgXVsgMSBdICs9IGRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF07CisJCQkJ
CWRpZmZzWyBwb2ludGVyIF1bIDEgXSA9CisJCQkJCQlkaWZmc1sgcG9pbnRlciBdWyAxIF0uc3Vi
c3RyaW5nKCBkaWZmc1sgcG9pbnRlciArIDEgXVsgMSBdLmxlbmd0aCApICsKKwkJCQkJCWRpZmZz
WyBwb2ludGVyICsgMSBdWyAxIF07CisJCQkJCWRpZmZzLnNwbGljZSggcG9pbnRlciArIDEsIDEg
KTsKKwkJCQkJY2hhbmdlcyA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJcG9pbnRlcisrOworCQl9
CisJCS8vIElmIHNoaWZ0cyB3ZXJlIG1hZGUsIHRoZSBkaWZmIG5lZWRzIHJlb3JkZXJpbmcgYW5k
IGFub3RoZXIgc2hpZnQgc3dlZXAuCisJCWlmICggY2hhbmdlcyApIHsKKwkJCXRoaXMuZGlmZkNs
ZWFudXBNZXJnZSggZGlmZnMgKTsKKwkJfQorCX07CisKKwlyZXR1cm4gZnVuY3Rpb24oIG8sIG4g
KSB7CisJCXZhciBkaWZmLCBvdXRwdXQsIHRleHQ7CisJCWRpZmYgPSBuZXcgRGlmZk1hdGNoUGF0
Y2goKTsKKwkJb3V0cHV0ID0gZGlmZi5EaWZmTWFpbiggbywgbiApOworCQlkaWZmLmRpZmZDbGVh
bnVwRWZmaWNpZW5jeSggb3V0cHV0ICk7CisJCXRleHQgPSBkaWZmLmRpZmZQcmV0dHlIdG1sKCBv
dXRwdXQgKTsKKworCQlyZXR1cm4gdGV4dDsKKwl9OworfSgpICk7CisKKy8vIEdldCBhIHJlZmVy
ZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdCwgbGlrZSB3aW5kb3cgaW4gYnJvd3NlcnMKK30oIChm
dW5jdGlvbigpIHsKKwlyZXR1cm4gdGhpczsKK30pKCkgKSk7CisKKyhmdW5jdGlvbigpIHsKKwor
Ly8gRG9uJ3QgbG9hZCB0aGUgSFRNTCBSZXBvcnRlciBvbiBub24tQnJvd3NlciBlbnZpcm9ubWVu
dHMKK2lmICggdHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIgfHwgIXdpbmRvdy5kb2N1bWVu
dCApIHsKKwlyZXR1cm47Cit9CisKKy8vIERlcHJlY2F0ZWQgUVVuaXQuaW5pdCAtIFJlZiAjNTMw
CisvLyBSZS1pbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMKK1FVbml0LmluaXQg
PSBmdW5jdGlvbigpIHsKKwl2YXIgdGVzdHMsIGJhbm5lciwgcmVzdWx0LCBxdW5pdCwKKwkJY29u
ZmlnID0gUVVuaXQuY29uZmlnOworCisJY29uZmlnLnN0YXRzID0geyBhbGw6IDAsIGJhZDogMCB9
OworCWNvbmZpZy5tb2R1bGVTdGF0cyA9IHsgYWxsOiAwLCBiYWQ6IDAgfTsKKwljb25maWcuc3Rh
cnRlZCA9IDA7CisJY29uZmlnLnVwZGF0ZVJhdGUgPSAxMDAwOworCWNvbmZpZy5ibG9ja2luZyA9
IGZhbHNlOworCWNvbmZpZy5hdXRvc3RhcnQgPSB0cnVlOworCWNvbmZpZy5hdXRvcnVuID0gZmFs
c2U7CisJY29uZmlnLmZpbHRlciA9ICIiOworCWNvbmZpZy5xdWV1ZSA9IFtdOworCisJLy8gUmV0
dXJuIG9uIG5vbi1icm93c2VyIGVudmlyb25tZW50cworCS8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRv
IG5vdCBicmVhayBvbiBub2RlIHRlc3RzCisJaWYgKCB0eXBlb2Ygd2luZG93ID09PSAidW5kZWZp
bmVkIiApIHsKKwkJcmV0dXJuOworCX0KKworCXF1bml0ID0gaWQoICJxdW5pdCIgKTsKKwlpZiAo
IHF1bml0ICkgeworCQlxdW5pdC5pbm5lckhUTUwgPQorCQkJIjxoMSBpZD0ncXVuaXQtaGVhZGVy
Jz4iICsgZXNjYXBlVGV4dCggZG9jdW1lbnQudGl0bGUgKSArICI8L2gxPiIgKworCQkJIjxoMiBp
ZD0ncXVuaXQtYmFubmVyJz48L2gyPiIgKworCQkJIjxkaXYgaWQ9J3F1bml0LXRlc3RydW5uZXIt
dG9vbGJhcic+PC9kaXY+IiArCisJCQkiPGgyIGlkPSdxdW5pdC11c2VyQWdlbnQnPjwvaDI+IiAr
CisJCQkiPG9sIGlkPSdxdW5pdC10ZXN0cyc+PC9vbD4iOworCX0KKworCXRlc3RzID0gaWQoICJx
dW5pdC10ZXN0cyIgKTsKKwliYW5uZXIgPSBpZCggInF1bml0LWJhbm5lciIgKTsKKwlyZXN1bHQg
PSBpZCggInF1bml0LXRlc3RyZXN1bHQiICk7CisKKwlpZiAoIHRlc3RzICkgeworCQl0ZXN0cy5p
bm5lckhUTUwgPSAiIjsKKwl9CisKKwlpZiAoIGJhbm5lciApIHsKKwkJYmFubmVyLmNsYXNzTmFt
ZSA9ICIiOworCX0KKworCWlmICggcmVzdWx0ICkgeworCQlyZXN1bHQucGFyZW50Tm9kZS5yZW1v
dmVDaGlsZCggcmVzdWx0ICk7CisJfQorCisJaWYgKCB0ZXN0cyApIHsKKwkJcmVzdWx0ID0gZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCggInAiICk7CisJCXJlc3VsdC5pZCA9ICJxdW5pdC10ZXN0cmVz
dWx0IjsKKwkJcmVzdWx0LmNsYXNzTmFtZSA9ICJyZXN1bHQiOworCQl0ZXN0cy5wYXJlbnROb2Rl
Lmluc2VydEJlZm9yZSggcmVzdWx0LCB0ZXN0cyApOworCQlyZXN1bHQuaW5uZXJIVE1MID0gIlJ1
bm5pbmcuLi48YnIgLz4mIzE2MDsiOworCX0KK307CisKK3ZhciBjb25maWcgPSBRVW5pdC5jb25m
aWcsCisJY29sbGFwc2VOZXh0ID0gZmFsc2UsCisJaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5o
YXNPd25Qcm9wZXJ0eSwKKwlkZWZpbmVkID0geworCQlkb2N1bWVudDogd2luZG93LmRvY3VtZW50
ICE9PSB1bmRlZmluZWQsCisJCXNlc3Npb25TdG9yYWdlOiAoZnVuY3Rpb24oKSB7CisJCQl2YXIg
eCA9ICJxdW5pdC10ZXN0LXN0cmluZyI7CisJCQl0cnkgeworCQkJCXNlc3Npb25TdG9yYWdlLnNl
dEl0ZW0oIHgsIHggKTsKKwkJCQlzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCB4ICk7CisJCQkJ
cmV0dXJuIHRydWU7CisJCQl9IGNhdGNoICggZSApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9
CisJCX0oKSkKKwl9LAorCW1vZHVsZXNMaXN0ID0gW107CisKKy8qKgorKiBFc2NhcGUgdGV4dCBm
b3IgYXR0cmlidXRlIG9yIHRleHQgY29udGVudC4KKyovCitmdW5jdGlvbiBlc2NhcGVUZXh0KCBz
ICkgeworCWlmICggIXMgKSB7CisJCXJldHVybiAiIjsKKwl9CisJcyA9IHMgKyAiIjsKKworCS8v
IEJvdGggc2luZ2xlIHF1b3RlcyBhbmQgZG91YmxlIHF1b3RlcyAoZm9yIGF0dHJpYnV0ZXMpCisJ
cmV0dXJuIHMucmVwbGFjZSggL1snIjw+Jl0vZywgZnVuY3Rpb24oIHMgKSB7CisJCXN3aXRjaCAo
IHMgKSB7CisJCWNhc2UgIiciOgorCQkJcmV0dXJuICImIzAzOTsiOworCQljYXNlICJcIiI6CisJ
CQlyZXR1cm4gIiZxdW90OyI7CisJCWNhc2UgIjwiOgorCQkJcmV0dXJuICImbHQ7IjsKKwkJY2Fz
ZSAiPiI6CisJCQlyZXR1cm4gIiZndDsiOworCQljYXNlICImIjoKKwkJCXJldHVybiAiJmFtcDsi
OworCQl9CisJfSk7Cit9CisKKy8qKgorICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbQorICog
QHBhcmFtIHtzdHJpbmd9IHR5cGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCisgKi8KK2Z1bmN0
aW9uIGFkZEV2ZW50KCBlbGVtLCB0eXBlLCBmbiApIHsKKwlpZiAoIGVsZW0uYWRkRXZlbnRMaXN0
ZW5lciApIHsKKworCQkvLyBTdGFuZGFyZHMtYmFzZWQgYnJvd3NlcnMKKwkJZWxlbS5hZGRFdmVu
dExpc3RlbmVyKCB0eXBlLCBmbiwgZmFsc2UgKTsKKwl9IGVsc2UgaWYgKCBlbGVtLmF0dGFjaEV2
ZW50ICkgeworCisJCS8vIHN1cHBvcnQ6IElFIDw5CisJCWVsZW0uYXR0YWNoRXZlbnQoICJvbiIg
KyB0eXBlLCBmdW5jdGlvbigpIHsKKwkJCXZhciBldmVudCA9IHdpbmRvdy5ldmVudDsKKwkJCWlm
ICggIWV2ZW50LnRhcmdldCApIHsKKwkJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50
IHx8IGRvY3VtZW50OworCQkJfQorCisJCQlmbi5jYWxsKCBlbGVtLCBldmVudCApOworCQl9KTsK
Kwl9Cit9CisKKy8qKgorICogQHBhcmFtIHtBcnJheXxOb2RlTGlzdH0gZWxlbXMKKyAqIEBwYXJh
bSB7c3RyaW5nfSB0eXBlCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbgorICovCitmdW5jdGlvbiBh
ZGRFdmVudHMoIGVsZW1zLCB0eXBlLCBmbiApIHsKKwl2YXIgaSA9IGVsZW1zLmxlbmd0aDsKKwl3
aGlsZSAoIGktLSApIHsKKwkJYWRkRXZlbnQoIGVsZW1zWyBpIF0sIHR5cGUsIGZuICk7CisJfQor
fQorCitmdW5jdGlvbiBoYXNDbGFzcyggZWxlbSwgbmFtZSApIHsKKwlyZXR1cm4gKCAiICIgKyBl
bGVtLmNsYXNzTmFtZSArICIgIiApLmluZGV4T2YoICIgIiArIG5hbWUgKyAiICIgKSA+PSAwOwor
fQorCitmdW5jdGlvbiBhZGRDbGFzcyggZWxlbSwgbmFtZSApIHsKKwlpZiAoICFoYXNDbGFzcygg
ZWxlbSwgbmFtZSApICkgeworCQllbGVtLmNsYXNzTmFtZSArPSAoIGVsZW0uY2xhc3NOYW1lID8g
IiAiIDogIiIgKSArIG5hbWU7CisJfQorfQorCitmdW5jdGlvbiB0b2dnbGVDbGFzcyggZWxlbSwg
bmFtZSApIHsKKwlpZiAoIGhhc0NsYXNzKCBlbGVtLCBuYW1lICkgKSB7CisJCXJlbW92ZUNsYXNz
KCBlbGVtLCBuYW1lICk7CisJfSBlbHNlIHsKKwkJYWRkQ2xhc3MoIGVsZW0sIG5hbWUgKTsKKwl9
Cit9CisKK2Z1bmN0aW9uIHJlbW92ZUNsYXNzKCBlbGVtLCBuYW1lICkgeworCXZhciBzZXQgPSAi
ICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIjsKKworCS8vIENsYXNzIG5hbWUgbWF5IGFwcGVhciBt
dWx0aXBsZSB0aW1lcworCXdoaWxlICggc2V0LmluZGV4T2YoICIgIiArIG5hbWUgKyAiICIgKSA+
PSAwICkgeworCQlzZXQgPSBzZXQucmVwbGFjZSggIiAiICsgbmFtZSArICIgIiwgIiAiICk7CisJ
fQorCisJLy8gdHJpbSBmb3IgcHJldHRpbmVzcworCWVsZW0uY2xhc3NOYW1lID0gdHlwZW9mIHNl
dC50cmltID09PSAiZnVuY3Rpb24iID8gc2V0LnRyaW0oKSA6IHNldC5yZXBsYWNlKCAvXlxzK3xc
cyskL2csICIiICk7Cit9CisKK2Z1bmN0aW9uIGlkKCBuYW1lICkgeworCXJldHVybiBkZWZpbmVk
LmRvY3VtZW50ICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkICYmIGRvY3VtZW50LmdldEVsZW1l
bnRCeUlkKCBuYW1lICk7Cit9CisKK2Z1bmN0aW9uIGdldFVybENvbmZpZ0h0bWwoKSB7CisJdmFy
IGksIGosIHZhbCwKKwkJZXNjYXBlZCwgZXNjYXBlZFRvb2x0aXAsCisJCXNlbGVjdGlvbiA9IGZh
bHNlLAorCQlsZW4gPSBjb25maWcudXJsQ29uZmlnLmxlbmd0aCwKKwkJdXJsQ29uZmlnSHRtbCA9
ICIiOworCisJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKwkJdmFsID0gY29uZmlnLnVy
bENvbmZpZ1sgaSBdOworCQlpZiAoIHR5cGVvZiB2YWwgPT09ICJzdHJpbmciICkgeworCQkJdmFs
ID0geworCQkJCWlkOiB2YWwsCisJCQkJbGFiZWw6IHZhbAorCQkJfTsKKwkJfQorCisJCWVzY2Fw
ZWQgPSBlc2NhcGVUZXh0KCB2YWwuaWQgKTsKKwkJZXNjYXBlZFRvb2x0aXAgPSBlc2NhcGVUZXh0
KCB2YWwudG9vbHRpcCApOworCisJCWlmICggY29uZmlnWyB2YWwuaWQgXSA9PT0gdW5kZWZpbmVk
ICkgeworCQkJY29uZmlnWyB2YWwuaWQgXSA9IFFVbml0LnVybFBhcmFtc1sgdmFsLmlkIF07CisJ
CX0KKworCQlpZiAoICF2YWwudmFsdWUgfHwgdHlwZW9mIHZhbC52YWx1ZSA9PT0gInN0cmluZyIg
KSB7CisJCQl1cmxDb25maWdIdG1sICs9ICI8aW5wdXQgaWQ9J3F1bml0LXVybGNvbmZpZy0iICsg
ZXNjYXBlZCArCisJCQkJIicgbmFtZT0nIiArIGVzY2FwZWQgKyAiJyB0eXBlPSdjaGVja2JveCci
ICsKKwkJCQkoIHZhbC52YWx1ZSA/ICIgdmFsdWU9JyIgKyBlc2NhcGVUZXh0KCB2YWwudmFsdWUg
KSArICInIiA6ICIiICkgKworCQkJCSggY29uZmlnWyB2YWwuaWQgXSA/ICIgY2hlY2tlZD0nY2hl
Y2tlZCciIDogIiIgKSArCisJCQkJIiB0aXRsZT0nIiArIGVzY2FwZWRUb29sdGlwICsgIicgLz48
bGFiZWwgZm9yPSdxdW5pdC11cmxjb25maWctIiArIGVzY2FwZWQgKworCQkJCSInIHRpdGxlPSci
ICsgZXNjYXBlZFRvb2x0aXAgKyAiJz4iICsgdmFsLmxhYmVsICsgIjwvbGFiZWw+IjsKKwkJfSBl
bHNlIHsKKwkJCXVybENvbmZpZ0h0bWwgKz0gIjxsYWJlbCBmb3I9J3F1bml0LXVybGNvbmZpZy0i
ICsgZXNjYXBlZCArCisJCQkJIicgdGl0bGU9JyIgKyBlc2NhcGVkVG9vbHRpcCArICInPiIgKyB2
YWwubGFiZWwgKworCQkJCSI6IDwvbGFiZWw+PHNlbGVjdCBpZD0ncXVuaXQtdXJsY29uZmlnLSIg
KyBlc2NhcGVkICsKKwkJCQkiJyBuYW1lPSciICsgZXNjYXBlZCArICInIHRpdGxlPSciICsgZXNj
YXBlZFRvb2x0aXAgKyAiJz48b3B0aW9uPjwvb3B0aW9uPiI7CisKKwkJCWlmICggUVVuaXQuaXMo
ICJhcnJheSIsIHZhbC52YWx1ZSApICkgeworCQkJCWZvciAoIGogPSAwOyBqIDwgdmFsLnZhbHVl
Lmxlbmd0aDsgaisrICkgeworCQkJCQllc2NhcGVkID0gZXNjYXBlVGV4dCggdmFsLnZhbHVlWyBq
IF0gKTsKKwkJCQkJdXJsQ29uZmlnSHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nIiArIGVzY2FwZWQg
KyAiJyIgKworCQkJCQkJKCBjb25maWdbIHZhbC5pZCBdID09PSB2YWwudmFsdWVbIGogXSA/CisJ
CQkJCQkJKCBzZWxlY3Rpb24gPSB0cnVlICkgJiYgIiBzZWxlY3RlZD0nc2VsZWN0ZWQnIiA6ICIi
ICkgKworCQkJCQkJIj4iICsgZXNjYXBlZCArICI8L29wdGlvbj4iOworCQkJCX0KKwkJCX0gZWxz
ZSB7CisJCQkJZm9yICggaiBpbiB2YWwudmFsdWUgKSB7CisJCQkJCWlmICggaGFzT3duLmNhbGwo
IHZhbC52YWx1ZSwgaiApICkgeworCQkJCQkJdXJsQ29uZmlnSHRtbCArPSAiPG9wdGlvbiB2YWx1
ZT0nIiArIGVzY2FwZVRleHQoIGogKSArICInIiArCisJCQkJCQkJKCBjb25maWdbIHZhbC5pZCBd
ID09PSBqID8KKwkJCQkJCQkJKCBzZWxlY3Rpb24gPSB0cnVlICkgJiYgIiBzZWxlY3RlZD0nc2Vs
ZWN0ZWQnIiA6ICIiICkgKworCQkJCQkJCSI+IiArIGVzY2FwZVRleHQoIHZhbC52YWx1ZVsgaiBd
ICkgKyAiPC9vcHRpb24+IjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICggY29uZmlnWyB2
YWwuaWQgXSAmJiAhc2VsZWN0aW9uICkgeworCQkJCWVzY2FwZWQgPSBlc2NhcGVUZXh0KCBjb25m
aWdbIHZhbC5pZCBdICk7CisJCQkJdXJsQ29uZmlnSHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nIiAr
IGVzY2FwZWQgKworCQkJCQkiJyBzZWxlY3RlZD0nc2VsZWN0ZWQnIGRpc2FibGVkPSdkaXNhYmxl
ZCc+IiArIGVzY2FwZWQgKyAiPC9vcHRpb24+IjsKKwkJCX0KKwkJCXVybENvbmZpZ0h0bWwgKz0g
Ijwvc2VsZWN0PiI7CisJCX0KKwl9CisKKwlyZXR1cm4gdXJsQ29uZmlnSHRtbDsKK30KKworLy8g
SGFuZGxlICJjbGljayIgZXZlbnRzIG9uIHRvb2xiYXIgY2hlY2tib3hlcyBhbmQgImNoYW5nZSIg
Zm9yIHNlbGVjdCBtZW51cy4KKy8vIFVwZGF0ZXMgdGhlIFVSTCB3aXRoIHRoZSBuZXcgc3RhdGUg
b2YgYGNvbmZpZy51cmxDb25maWdgIHZhbHVlcy4KK2Z1bmN0aW9uIHRvb2xiYXJDaGFuZ2VkKCkg
eworCXZhciB1cGRhdGVkVXJsLCB2YWx1ZSwKKwkJZmllbGQgPSB0aGlzLAorCQlwYXJhbXMgPSB7
fTsKKworCS8vIERldGVjdCBpZiBmaWVsZCBpcyBhIHNlbGVjdCBtZW51IG9yIGEgY2hlY2tib3gK
KwlpZiAoICJzZWxlY3RlZEluZGV4IiBpbiBmaWVsZCApIHsKKwkJdmFsdWUgPSBmaWVsZC5vcHRp
b25zWyBmaWVsZC5zZWxlY3RlZEluZGV4IF0udmFsdWUgfHwgdW5kZWZpbmVkOworCX0gZWxzZSB7
CisJCXZhbHVlID0gZmllbGQuY2hlY2tlZCA/ICggZmllbGQuZGVmYXVsdFZhbHVlIHx8IHRydWUg
KSA6IHVuZGVmaW5lZDsKKwl9CisKKwlwYXJhbXNbIGZpZWxkLm5hbWUgXSA9IHZhbHVlOworCXVw
ZGF0ZWRVcmwgPSBzZXRVcmwoIHBhcmFtcyApOworCisJaWYgKCAiaGlkZXBhc3NlZCIgPT09IGZp
ZWxkLm5hbWUgJiYgInJlcGxhY2VTdGF0ZSIgaW4gd2luZG93Lmhpc3RvcnkgKSB7CisJCWNvbmZp
Z1sgZmllbGQubmFtZSBdID0gdmFsdWUgfHwgZmFsc2U7CisJCWlmICggdmFsdWUgKSB7CisJCQlh
ZGRDbGFzcyggaWQoICJxdW5pdC10ZXN0cyIgKSwgImhpZGVwYXNzIiApOworCQl9IGVsc2Ugewor
CQkJcmVtb3ZlQ2xhc3MoIGlkKCAicXVuaXQtdGVzdHMiICksICJoaWRlcGFzcyIgKTsKKwkJfQor
CisJCS8vIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcmVmcmVzaCB0aGUgd2hvbGUgcGFnZQorCQl3
aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoIG51bGwsICIiLCB1cGRhdGVkVXJsICk7CisJfSBl
bHNlIHsKKwkJd2luZG93LmxvY2F0aW9uID0gdXBkYXRlZFVybDsKKwl9Cit9CisKK2Z1bmN0aW9u
IHNldFVybCggcGFyYW1zICkgeworCXZhciBrZXksCisJCXF1ZXJ5c3RyaW5nID0gIj8iOworCisJ
cGFyYW1zID0gUVVuaXQuZXh0ZW5kKCBRVW5pdC5leHRlbmQoIHt9LCBRVW5pdC51cmxQYXJhbXMg
KSwgcGFyYW1zICk7CisKKwlmb3IgKCBrZXkgaW4gcGFyYW1zICkgeworCQlpZiAoIGhhc093bi5j
YWxsKCBwYXJhbXMsIGtleSApICkgeworCQkJaWYgKCBwYXJhbXNbIGtleSBdID09PSB1bmRlZmlu
ZWQgKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlxdWVyeXN0cmluZyArPSBlbmNvZGVVUklD
b21wb25lbnQoIGtleSApOworCQkJaWYgKCBwYXJhbXNbIGtleSBdICE9PSB0cnVlICkgeworCQkJ
CXF1ZXJ5c3RyaW5nICs9ICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggcGFyYW1zWyBrZXkgXSAp
OworCQkJfQorCQkJcXVlcnlzdHJpbmcgKz0gIiYiOworCQl9CisJfQorCXJldHVybiBsb2NhdGlv
bi5wcm90b2NvbCArICIvLyIgKyBsb2NhdGlvbi5ob3N0ICsKKwkJbG9jYXRpb24ucGF0aG5hbWUg
KyBxdWVyeXN0cmluZy5zbGljZSggMCwgLTEgKTsKK30KKworZnVuY3Rpb24gYXBwbHlVcmxQYXJh
bXMoKSB7CisJdmFyIHNlbGVjdGVkTW9kdWxlLAorCQltb2R1bGVzTGlzdCA9IGlkKCAicXVuaXQt
bW9kdWxlZmlsdGVyIiApLAorCQlmaWx0ZXIgPSBpZCggInF1bml0LWZpbHRlci1pbnB1dCIgKS52
YWx1ZTsKKworCXNlbGVjdGVkTW9kdWxlID0gbW9kdWxlc0xpc3QgPworCQlkZWNvZGVVUklDb21w
b25lbnQoIG1vZHVsZXNMaXN0Lm9wdGlvbnNbIG1vZHVsZXNMaXN0LnNlbGVjdGVkSW5kZXggXS52
YWx1ZSApIDoKKwkJdW5kZWZpbmVkOworCisJd2luZG93LmxvY2F0aW9uID0gc2V0VXJsKHsKKwkJ
bW9kdWxlOiAoIHNlbGVjdGVkTW9kdWxlID09PSAiIiApID8gdW5kZWZpbmVkIDogc2VsZWN0ZWRN
b2R1bGUsCisJCWZpbHRlcjogKCBmaWx0ZXIgPT09ICIiICkgPyB1bmRlZmluZWQgOiBmaWx0ZXIs
CisKKwkJLy8gUmVtb3ZlIHRlc3RJZCBmaWx0ZXIKKwkJdGVzdElkOiB1bmRlZmluZWQKKwl9KTsK
K30KKworZnVuY3Rpb24gdG9vbGJhclVybENvbmZpZ0NvbnRhaW5lcigpIHsKKwl2YXIgdXJsQ29u
ZmlnQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInNwYW4iICk7CisKKwl1cmxD
b25maWdDb250YWluZXIuaW5uZXJIVE1MID0gZ2V0VXJsQ29uZmlnSHRtbCgpOworCWFkZENsYXNz
KCB1cmxDb25maWdDb250YWluZXIsICJxdW5pdC11cmwtY29uZmlnIiApOworCisJLy8gRm9yIG9s
ZElFIHN1cHBvcnQ6CisJLy8gKiBBZGQgaGFuZGxlcnMgdG8gdGhlIGluZGl2aWR1YWwgZWxlbWVu
dHMgaW5zdGVhZCBvZiB0aGUgY29udGFpbmVyCisJLy8gKiBVc2UgImNsaWNrIiBpbnN0ZWFkIG9m
ICJjaGFuZ2UiIGZvciBjaGVja2JveGVzCisJYWRkRXZlbnRzKCB1cmxDb25maWdDb250YWluZXIu
Z2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKSwgImNsaWNrIiwgdG9vbGJhckNoYW5nZWQg
KTsKKwlhZGRFdmVudHMoIHVybENvbmZpZ0NvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgg
InNlbGVjdCIgKSwgImNoYW5nZSIsIHRvb2xiYXJDaGFuZ2VkICk7CisKKwlyZXR1cm4gdXJsQ29u
ZmlnQ29udGFpbmVyOworfQorCitmdW5jdGlvbiB0b29sYmFyTG9vc2VGaWx0ZXIoKSB7CisJdmFy
IGZpbHRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJmb3JtIiApLAorCQlsYWJlbCA9IGRv
Y3VtZW50LmNyZWF0ZUVsZW1lbnQoICJsYWJlbCIgKSwKKwkJaW5wdXQgPSBkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCAiaW5wdXQiICksCisJCWJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
ICJidXR0b24iICk7CisKKwlhZGRDbGFzcyggZmlsdGVyLCAicXVuaXQtZmlsdGVyIiApOworCisJ
bGFiZWwuaW5uZXJIVE1MID0gIkZpbHRlcjogIjsKKworCWlucHV0LnR5cGUgPSAidGV4dCI7CisJ
aW5wdXQudmFsdWUgPSBjb25maWcuZmlsdGVyIHx8ICIiOworCWlucHV0Lm5hbWUgPSAiZmlsdGVy
IjsKKwlpbnB1dC5pZCA9ICJxdW5pdC1maWx0ZXItaW5wdXQiOworCisJYnV0dG9uLmlubmVySFRN
TCA9ICJHbyI7CisKKwlsYWJlbC5hcHBlbmRDaGlsZCggaW5wdXQgKTsKKworCWZpbHRlci5hcHBl
bmRDaGlsZCggbGFiZWwgKTsKKwlmaWx0ZXIuYXBwZW5kQ2hpbGQoIGJ1dHRvbiApOworCWFkZEV2
ZW50KCBmaWx0ZXIsICJzdWJtaXQiLCBmdW5jdGlvbiggZXYgKSB7CisJCWFwcGx5VXJsUGFyYW1z
KCk7CisKKwkJaWYgKCBldiAmJiBldi5wcmV2ZW50RGVmYXVsdCApIHsKKwkJCWV2LnByZXZlbnRE
ZWZhdWx0KCk7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfSk7CisKKwlyZXR1cm4gZmlsdGVy
OworfQorCitmdW5jdGlvbiB0b29sYmFyTW9kdWxlRmlsdGVySHRtbCgpIHsKKwl2YXIgaSwKKwkJ
bW9kdWxlRmlsdGVySHRtbCA9ICIiOworCisJaWYgKCAhbW9kdWxlc0xpc3QubGVuZ3RoICkgewor
CQlyZXR1cm4gZmFsc2U7CisJfQorCisJbW9kdWxlc0xpc3Quc29ydChmdW5jdGlvbiggYSwgYiAp
IHsKKwkJcmV0dXJuIGEubG9jYWxlQ29tcGFyZSggYiApOworCX0pOworCisJbW9kdWxlRmlsdGVy
SHRtbCArPSAiPGxhYmVsIGZvcj0ncXVuaXQtbW9kdWxlZmlsdGVyJz5Nb2R1bGU6IDwvbGFiZWw+
IiArCisJCSI8c2VsZWN0IGlkPSdxdW5pdC1tb2R1bGVmaWx0ZXInIG5hbWU9J21vZHVsZWZpbHRl
cic+PG9wdGlvbiB2YWx1ZT0nJyAiICsKKwkJKCBRVW5pdC51cmxQYXJhbXMubW9kdWxlID09PSB1
bmRlZmluZWQgPyAic2VsZWN0ZWQ9J3NlbGVjdGVkJyIgOiAiIiApICsKKwkJIj48IEFsbCBNb2R1
bGVzID48L29wdGlvbj4iOworCisJZm9yICggaSA9IDA7IGkgPCBtb2R1bGVzTGlzdC5sZW5ndGg7
IGkrKyApIHsKKwkJbW9kdWxlRmlsdGVySHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nIiArCisJCQll
c2NhcGVUZXh0KCBlbmNvZGVVUklDb21wb25lbnQoIG1vZHVsZXNMaXN0WyBpIF0gKSApICsgIicg
IiArCisJCQkoIFFVbml0LnVybFBhcmFtcy5tb2R1bGUgPT09IG1vZHVsZXNMaXN0WyBpIF0gPyAi
c2VsZWN0ZWQ9J3NlbGVjdGVkJyIgOiAiIiApICsKKwkJCSI+IiArIGVzY2FwZVRleHQoIG1vZHVs
ZXNMaXN0WyBpIF0gKSArICI8L29wdGlvbj4iOworCX0KKwltb2R1bGVGaWx0ZXJIdG1sICs9ICI8
L3NlbGVjdD4iOworCisJcmV0dXJuIG1vZHVsZUZpbHRlckh0bWw7Cit9CisKK2Z1bmN0aW9uIHRv
b2xiYXJNb2R1bGVGaWx0ZXIoKSB7CisJdmFyIHRvb2xiYXIgPSBpZCggInF1bml0LXRlc3RydW5u
ZXItdG9vbGJhciIgKSwKKwkJbW9kdWxlRmlsdGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgg
InNwYW4iICksCisJCW1vZHVsZUZpbHRlckh0bWwgPSB0b29sYmFyTW9kdWxlRmlsdGVySHRtbCgp
OworCisJaWYgKCAhdG9vbGJhciB8fCAhbW9kdWxlRmlsdGVySHRtbCApIHsKKwkJcmV0dXJuIGZh
bHNlOworCX0KKworCW1vZHVsZUZpbHRlci5zZXRBdHRyaWJ1dGUoICJpZCIsICJxdW5pdC1tb2R1
bGVmaWx0ZXItY29udGFpbmVyIiApOworCW1vZHVsZUZpbHRlci5pbm5lckhUTUwgPSBtb2R1bGVG
aWx0ZXJIdG1sOworCisJYWRkRXZlbnQoIG1vZHVsZUZpbHRlci5sYXN0Q2hpbGQsICJjaGFuZ2Ui
LCBhcHBseVVybFBhcmFtcyApOworCisJdG9vbGJhci5hcHBlbmRDaGlsZCggbW9kdWxlRmlsdGVy
ICk7Cit9CisKK2Z1bmN0aW9uIGFwcGVuZFRvb2xiYXIoKSB7CisJdmFyIHRvb2xiYXIgPSBpZCgg
InF1bml0LXRlc3RydW5uZXItdG9vbGJhciIgKTsKKworCWlmICggdG9vbGJhciApIHsKKwkJdG9v
bGJhci5hcHBlbmRDaGlsZCggdG9vbGJhclVybENvbmZpZ0NvbnRhaW5lcigpICk7CisJCXRvb2xi
YXIuYXBwZW5kQ2hpbGQoIHRvb2xiYXJMb29zZUZpbHRlcigpICk7CisJfQorfQorCitmdW5jdGlv
biBhcHBlbmRIZWFkZXIoKSB7CisJdmFyIGhlYWRlciA9IGlkKCAicXVuaXQtaGVhZGVyIiApOwor
CisJaWYgKCBoZWFkZXIgKSB7CisJCWhlYWRlci5pbm5lckhUTUwgPSAiPGEgaHJlZj0nIiArCisJ
CQlzZXRVcmwoeyBmaWx0ZXI6IHVuZGVmaW5lZCwgbW9kdWxlOiB1bmRlZmluZWQsIHRlc3RJZDog
dW5kZWZpbmVkIH0pICsKKwkJCSInPiIgKyBoZWFkZXIuaW5uZXJIVE1MICsgIjwvYT4gIjsKKwl9
Cit9CisKK2Z1bmN0aW9uIGFwcGVuZEJhbm5lcigpIHsKKwl2YXIgYmFubmVyID0gaWQoICJxdW5p
dC1iYW5uZXIiICk7CisKKwlpZiAoIGJhbm5lciApIHsKKwkJYmFubmVyLmNsYXNzTmFtZSA9ICIi
OworCX0KK30KKworZnVuY3Rpb24gYXBwZW5kVGVzdFJlc3VsdHMoKSB7CisJdmFyIHRlc3RzID0g
aWQoICJxdW5pdC10ZXN0cyIgKSwKKwkJcmVzdWx0ID0gaWQoICJxdW5pdC10ZXN0cmVzdWx0IiAp
OworCisJaWYgKCByZXN1bHQgKSB7CisJCXJlc3VsdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBy
ZXN1bHQgKTsKKwl9CisKKwlpZiAoIHRlc3RzICkgeworCQl0ZXN0cy5pbm5lckhUTUwgPSAiIjsK
KwkJcmVzdWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInAiICk7CisJCXJlc3VsdC5pZCA9
ICJxdW5pdC10ZXN0cmVzdWx0IjsKKwkJcmVzdWx0LmNsYXNzTmFtZSA9ICJyZXN1bHQiOworCQl0
ZXN0cy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggcmVzdWx0LCB0ZXN0cyApOworCQlyZXN1bHQu
aW5uZXJIVE1MID0gIlJ1bm5pbmcuLi48YnIgLz4mIzE2MDsiOworCX0KK30KKworZnVuY3Rpb24g
c3RvcmVGaXh0dXJlKCkgeworCXZhciBmaXh0dXJlID0gaWQoICJxdW5pdC1maXh0dXJlIiApOwor
CWlmICggZml4dHVyZSApIHsKKwkJY29uZmlnLmZpeHR1cmUgPSBmaXh0dXJlLmlubmVySFRNTDsK
Kwl9Cit9CisKK2Z1bmN0aW9uIGFwcGVuZEZpbHRlcmVkVGVzdCgpIHsKKwl2YXIgdGVzdElkID0g
UVVuaXQuY29uZmlnLnRlc3RJZDsKKwlpZiAoICF0ZXN0SWQgfHwgdGVzdElkLmxlbmd0aCA8PSAw
ICkgeworCQlyZXR1cm4gIiI7CisJfQorCXJldHVybiAiPGRpdiBpZD0ncXVuaXQtZmlsdGVyZWRU
ZXN0Jz5SZXJ1bm5pbmcgc2VsZWN0ZWQgdGVzdHM6ICIgKyB0ZXN0SWQuam9pbigiLCAiKSArCisJ
CSIgPGEgaWQ9J3F1bml0LWNsZWFyRmlsdGVyJyBocmVmPSciICsKKwkJc2V0VXJsKHsgZmlsdGVy
OiB1bmRlZmluZWQsIG1vZHVsZTogdW5kZWZpbmVkLCB0ZXN0SWQ6IHVuZGVmaW5lZCB9KSArCisJ
CSInPiIgKyAiUnVuIGFsbCB0ZXN0cyIgKyAiPC9hPjwvZGl2PiI7Cit9CisKK2Z1bmN0aW9uIGFw
cGVuZFVzZXJBZ2VudCgpIHsKKwl2YXIgdXNlckFnZW50ID0gaWQoICJxdW5pdC11c2VyQWdlbnQi
ICk7CisKKwlpZiAoIHVzZXJBZ2VudCApIHsKKwkJdXNlckFnZW50LmlubmVySFRNTCA9ICIiOwor
CQl1c2VyQWdlbnQuYXBwZW5kQ2hpbGQoCisJCQlkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgKKwkJ
CQkiUVVuaXQgIiArIFFVbml0LnZlcnNpb24gKyAiOyAiICsgbmF2aWdhdG9yLnVzZXJBZ2VudAor
CQkJKQorCQkpOworCX0KK30KKworZnVuY3Rpb24gYXBwZW5kVGVzdHNMaXN0KCBtb2R1bGVzICkg
eworCXZhciBpLCBsLCB4LCB6LCB0ZXN0LCBtb2R1bGVPYmo7CisKKwlmb3IgKCBpID0gMCwgbCA9
IG1vZHVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQltb2R1bGVPYmogPSBtb2R1bGVzWyBp
IF07CisKKwkJaWYgKCBtb2R1bGVPYmoubmFtZSApIHsKKwkJCW1vZHVsZXNMaXN0LnB1c2goIG1v
ZHVsZU9iai5uYW1lICk7CisJCX0KKworCQlmb3IgKCB4ID0gMCwgeiA9IG1vZHVsZU9iai50ZXN0
cy5sZW5ndGg7IHggPCB6OyB4KysgKSB7CisJCQl0ZXN0ID0gbW9kdWxlT2JqLnRlc3RzWyB4IF07
CisKKwkJCWFwcGVuZFRlc3QoIHRlc3QubmFtZSwgdGVzdC50ZXN0SWQsIG1vZHVsZU9iai5uYW1l
ICk7CisJCX0KKwl9Cit9CisKK2Z1bmN0aW9uIGFwcGVuZFRlc3QoIG5hbWUsIHRlc3RJZCwgbW9k
dWxlTmFtZSApIHsKKwl2YXIgdGl0bGUsIHJlcnVuVHJpZ2dlciwgdGVzdEJsb2NrLCBhc3NlcnRM
aXN0LAorCQl0ZXN0cyA9IGlkKCAicXVuaXQtdGVzdHMiICk7CisKKwlpZiAoICF0ZXN0cyApIHsK
KwkJcmV0dXJuOworCX0KKworCXRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInN0cm9u
ZyIgKTsKKwl0aXRsZS5pbm5lckhUTUwgPSBnZXROYW1lSHRtbCggbmFtZSwgbW9kdWxlTmFtZSAp
OworCisJcmVydW5UcmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImEiICk7CisJcmVy
dW5UcmlnZ2VyLmlubmVySFRNTCA9ICJSZXJ1biI7CisJcmVydW5UcmlnZ2VyLmhyZWYgPSBzZXRV
cmwoeyB0ZXN0SWQ6IHRlc3RJZCB9KTsKKworCXRlc3RCbG9jayA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoICJsaSIgKTsKKwl0ZXN0QmxvY2suYXBwZW5kQ2hpbGQoIHRpdGxlICk7CisJdGVzdEJs
b2NrLmFwcGVuZENoaWxkKCByZXJ1blRyaWdnZXIgKTsKKwl0ZXN0QmxvY2suaWQgPSAicXVuaXQt
dGVzdC1vdXRwdXQtIiArIHRlc3RJZDsKKworCWFzc2VydExpc3QgPSBkb2N1bWVudC5jcmVhdGVF
bGVtZW50KCAib2wiICk7CisJYXNzZXJ0TGlzdC5jbGFzc05hbWUgPSAicXVuaXQtYXNzZXJ0LWxp
c3QiOworCisJdGVzdEJsb2NrLmFwcGVuZENoaWxkKCBhc3NlcnRMaXN0ICk7CisKKwl0ZXN0cy5h
cHBlbmRDaGlsZCggdGVzdEJsb2NrICk7Cit9CisKKy8vIEhUTUwgUmVwb3J0ZXIgaW5pdGlhbGl6
YXRpb24gYW5kIGxvYWQKK1FVbml0LmJlZ2luKGZ1bmN0aW9uKCBkZXRhaWxzICkgeworCXZhciBx
dW5pdCA9IGlkKCAicXVuaXQiICk7CisKKwkvLyBGaXh0dXJlIGlzIHRoZSBvbmx5IG9uZSBuZWNl
c3NhcnkgdG8gcnVuIHdpdGhvdXQgdGhlICNxdW5pdCBlbGVtZW50CisJc3RvcmVGaXh0dXJlKCk7
CisKKwlpZiAoIHF1bml0ICkgeworCQlxdW5pdC5pbm5lckhUTUwgPQorCQkJIjxoMSBpZD0ncXVu
aXQtaGVhZGVyJz4iICsgZXNjYXBlVGV4dCggZG9jdW1lbnQudGl0bGUgKSArICI8L2gxPiIgKwor
CQkJIjxoMiBpZD0ncXVuaXQtYmFubmVyJz48L2gyPiIgKworCQkJIjxkaXYgaWQ9J3F1bml0LXRl
c3RydW5uZXItdG9vbGJhcic+PC9kaXY+IiArCisJCQlhcHBlbmRGaWx0ZXJlZFRlc3QoKSArCisJ
CQkiPGgyIGlkPSdxdW5pdC11c2VyQWdlbnQnPjwvaDI+IiArCisJCQkiPG9sIGlkPSdxdW5pdC10
ZXN0cyc+PC9vbD4iOworCX0KKworCWFwcGVuZEhlYWRlcigpOworCWFwcGVuZEJhbm5lcigpOwor
CWFwcGVuZFRlc3RSZXN1bHRzKCk7CisJYXBwZW5kVXNlckFnZW50KCk7CisJYXBwZW5kVG9vbGJh
cigpOworCWFwcGVuZFRlc3RzTGlzdCggZGV0YWlscy5tb2R1bGVzICk7CisJdG9vbGJhck1vZHVs
ZUZpbHRlcigpOworCisJaWYgKCBxdW5pdCAmJiBjb25maWcuaGlkZXBhc3NlZCApIHsKKwkJYWRk
Q2xhc3MoIHF1bml0Lmxhc3RDaGlsZCwgImhpZGVwYXNzIiApOworCX0KK30pOworCitRVW5pdC5k
b25lKGZ1bmN0aW9uKCBkZXRhaWxzICkgeworCXZhciBpLCBrZXksCisJCWJhbm5lciA9IGlkKCAi
cXVuaXQtYmFubmVyIiApLAorCQl0ZXN0cyA9IGlkKCAicXVuaXQtdGVzdHMiICksCisJCWh0bWwg
PSBbCisJCQkiVGVzdHMgY29tcGxldGVkIGluICIsCisJCQlkZXRhaWxzLnJ1bnRpbWUsCisJCQki
IG1pbGxpc2Vjb25kcy48YnIgLz4iLAorCQkJIjxzcGFuIGNsYXNzPSdwYXNzZWQnPiIsCisJCQlk
ZXRhaWxzLnBhc3NlZCwKKwkJCSI8L3NwYW4+IGFzc2VydGlvbnMgb2YgPHNwYW4gY2xhc3M9J3Rv
dGFsJz4iLAorCQkJZGV0YWlscy50b3RhbCwKKwkJCSI8L3NwYW4+IHBhc3NlZCwgPHNwYW4gY2xh
c3M9J2ZhaWxlZCc+IiwKKwkJCWRldGFpbHMuZmFpbGVkLAorCQkJIjwvc3Bhbj4gZmFpbGVkLiIK
KwkJXS5qb2luKCAiIiApOworCisJaWYgKCBiYW5uZXIgKSB7CisJCWJhbm5lci5jbGFzc05hbWUg
PSBkZXRhaWxzLmZhaWxlZCA/ICJxdW5pdC1mYWlsIiA6ICJxdW5pdC1wYXNzIjsKKwl9CisKKwlp
ZiAoIHRlc3RzICkgeworCQlpZCggInF1bml0LXRlc3RyZXN1bHQiICkuaW5uZXJIVE1MID0gaHRt
bDsKKwl9CisKKwlpZiAoIGNvbmZpZy5hbHRlcnRpdGxlICYmIGRlZmluZWQuZG9jdW1lbnQgJiYg
ZG9jdW1lbnQudGl0bGUgKSB7CisKKwkJLy8gc2hvdyDinJYgZm9yIGdvb2QsIOKclCBmb3IgYmFk
IHN1aXRlIHJlc3VsdCBpbiB0aXRsZQorCQkvLyB1c2UgZXNjYXBlIHNlcXVlbmNlcyBpbiBjYXNl
IGZpbGUgZ2V0cyBsb2FkZWQgd2l0aCBub24tdXRmLTgtY2hhcnNldAorCQlkb2N1bWVudC50aXRs
ZSA9IFsKKwkJCSggZGV0YWlscy5mYWlsZWQgPyAiXHUyNzE2IiA6ICJcdTI3MTQiICksCisJCQlk
b2N1bWVudC50aXRsZS5yZXBsYWNlKCAvXltcdTI3MTRcdTI3MTZdIC9pLCAiIiApCisJCV0uam9p
biggIiAiICk7CisJfQorCisJLy8gY2xlYXIgb3duIHNlc3Npb25TdG9yYWdlIGl0ZW1zIGlmIGFs
bCB0ZXN0cyBwYXNzZWQKKwlpZiAoIGNvbmZpZy5yZW9yZGVyICYmIGRlZmluZWQuc2Vzc2lvblN0
b3JhZ2UgJiYgZGV0YWlscy5mYWlsZWQgPT09IDAgKSB7CisJCWZvciAoIGkgPSAwOyBpIDwgc2Vz
c2lvblN0b3JhZ2UubGVuZ3RoOyBpKysgKSB7CisJCQlrZXkgPSBzZXNzaW9uU3RvcmFnZS5rZXko
IGkrKyApOworCQkJaWYgKCBrZXkuaW5kZXhPZiggInF1bml0LXRlc3QtIiApID09PSAwICkgewor
CQkJCXNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oIGtleSApOworCQkJfQorCQl9CisJfQorCisJ
Ly8gc2Nyb2xsIGJhY2sgdG8gdG9wIHRvIHNob3cgcmVzdWx0cworCWlmICggY29uZmlnLnNjcm9s
bHRvcCAmJiB3aW5kb3cuc2Nyb2xsVG8gKSB7CisJCXdpbmRvdy5zY3JvbGxUbyggMCwgMCApOwor
CX0KK30pOworCitmdW5jdGlvbiBnZXROYW1lSHRtbCggbmFtZSwgbW9kdWxlICkgeworCXZhciBu
YW1lSHRtbCA9ICIiOworCisJaWYgKCBtb2R1bGUgKSB7CisJCW5hbWVIdG1sID0gIjxzcGFuIGNs
YXNzPSdtb2R1bGUtbmFtZSc+IiArIGVzY2FwZVRleHQoIG1vZHVsZSApICsgIjwvc3Bhbj46ICI7
CisJfQorCisJbmFtZUh0bWwgKz0gIjxzcGFuIGNsYXNzPSd0ZXN0LW5hbWUnPiIgKyBlc2NhcGVU
ZXh0KCBuYW1lICkgKyAiPC9zcGFuPiI7CisKKwlyZXR1cm4gbmFtZUh0bWw7Cit9CisKK1FVbml0
LnRlc3RTdGFydChmdW5jdGlvbiggZGV0YWlscyApIHsKKwl2YXIgcnVubmluZywgdGVzdEJsb2Nr
LCBiYWQ7CisKKwl0ZXN0QmxvY2sgPSBpZCggInF1bml0LXRlc3Qtb3V0cHV0LSIgKyBkZXRhaWxz
LnRlc3RJZCApOworCWlmICggdGVzdEJsb2NrICkgeworCQl0ZXN0QmxvY2suY2xhc3NOYW1lID0g
InJ1bm5pbmciOworCX0gZWxzZSB7CisKKwkJLy8gUmVwb3J0IGxhdGVyIHJlZ2lzdGVyZWQgdGVz
dHMKKwkJYXBwZW5kVGVzdCggZGV0YWlscy5uYW1lLCBkZXRhaWxzLnRlc3RJZCwgZGV0YWlscy5t
b2R1bGUgKTsKKwl9CisKKwlydW5uaW5nID0gaWQoICJxdW5pdC10ZXN0cmVzdWx0IiApOworCWlm
ICggcnVubmluZyApIHsKKwkJYmFkID0gUVVuaXQuY29uZmlnLnJlb3JkZXIgJiYgZGVmaW5lZC5z
ZXNzaW9uU3RvcmFnZSAmJgorCQkJK3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oICJxdW5pdC10ZXN0
LSIgKyBkZXRhaWxzLm1vZHVsZSArICItIiArIGRldGFpbHMubmFtZSApOworCisJCXJ1bm5pbmcu
aW5uZXJIVE1MID0gKCBiYWQgPworCQkJIlJlcnVubmluZyBwcmV2aW91c2x5IGZhaWxlZCB0ZXN0
OiA8YnIgLz4iIDoKKwkJCSJSdW5uaW5nOiA8YnIgLz4iICkgKworCQkJZ2V0TmFtZUh0bWwoIGRl
dGFpbHMubmFtZSwgZGV0YWlscy5tb2R1bGUgKTsKKwl9CisKK30pOworCitmdW5jdGlvbiBzdHJp
cEh0bWwoIHN0cmluZyApIHsKKwkvLyBzdHJpcCB0YWdzLCBodG1sIGVudGl0eSBhbmQgd2hpdGVz
cGFjZXMKKwlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoLzxcLz9bXj5dKyg+fCQpL2csICIiKS5yZXBs
YWNlKC9cJnF1b3Q7L2csICIiKS5yZXBsYWNlKC9ccysvZywgIiIpOworfQorCitRVW5pdC5sb2co
ZnVuY3Rpb24oIGRldGFpbHMgKSB7CisJdmFyIGFzc2VydExpc3QsIGFzc2VydExpLAorCQltZXNz
YWdlLCBleHBlY3RlZCwgYWN0dWFsLCBkaWZmLAorCQlzaG93RGlmZiA9IGZhbHNlLAorCQl0ZXN0
SXRlbSA9IGlkKCAicXVuaXQtdGVzdC1vdXRwdXQtIiArIGRldGFpbHMudGVzdElkICk7CisKKwlp
ZiAoICF0ZXN0SXRlbSApIHsKKwkJcmV0dXJuOworCX0KKworCW1lc3NhZ2UgPSBlc2NhcGVUZXh0
KCBkZXRhaWxzLm1lc3NhZ2UgKSB8fCAoIGRldGFpbHMucmVzdWx0ID8gIm9rYXkiIDogImZhaWxl
ZCIgKTsKKwltZXNzYWdlID0gIjxzcGFuIGNsYXNzPSd0ZXN0LW1lc3NhZ2UnPiIgKyBtZXNzYWdl
ICsgIjwvc3Bhbj4iOworCW1lc3NhZ2UgKz0gIjxzcGFuIGNsYXNzPSdydW50aW1lJz5AICIgKyBk
ZXRhaWxzLnJ1bnRpbWUgKyAiIG1zPC9zcGFuPiI7CisKKwkvLyBwdXNoRmFpbHVyZSBkb2Vzbid0
IHByb3ZpZGUgZGV0YWlscy5leHBlY3RlZAorCS8vIHdoZW4gaXQgY2FsbHMsIGl0J3MgaW1wbGlj
aXQgdG8gYWxzbyBub3Qgc2hvdyBleHBlY3RlZCBhbmQgZGlmZiBzdHVmZgorCS8vIEFsc28sIHdl
IG5lZWQgdG8gY2hlY2sgZGV0YWlscy5leHBlY3RlZCBleGlzdGVuY2UsIGFzIGl0IGNhbiBleGlz
dCBhbmQgYmUgdW5kZWZpbmVkCisJaWYgKCAhZGV0YWlscy5yZXN1bHQgJiYgaGFzT3duLmNhbGwo
IGRldGFpbHMsICJleHBlY3RlZCIgKSApIHsKKwkJaWYgKCBkZXRhaWxzLm5lZ2F0aXZlICkgewor
CQkJZXhwZWN0ZWQgPSBlc2NhcGVUZXh0KCAiTk9UICIgKyBRVW5pdC5kdW1wLnBhcnNlKCBkZXRh
aWxzLmV4cGVjdGVkICkgKTsKKwkJfSBlbHNlIHsKKwkJCWV4cGVjdGVkID0gZXNjYXBlVGV4dCgg
UVVuaXQuZHVtcC5wYXJzZSggZGV0YWlscy5leHBlY3RlZCApICk7CisJCX0KKworCQlhY3R1YWwg
PSBlc2NhcGVUZXh0KCBRVW5pdC5kdW1wLnBhcnNlKCBkZXRhaWxzLmFjdHVhbCApICk7CisJCW1l
c3NhZ2UgKz0gIjx0YWJsZT48dHIgY2xhc3M9J3Rlc3QtZXhwZWN0ZWQnPjx0aD5FeHBlY3RlZDog
PC90aD48dGQ+PHByZT4iICsKKwkJCWV4cGVjdGVkICsKKwkJCSI8L3ByZT48L3RkPjwvdHI+IjsK
KworCQlpZiAoIGFjdHVhbCAhPT0gZXhwZWN0ZWQgKSB7CisKKwkJCW1lc3NhZ2UgKz0gIjx0ciBj
bGFzcz0ndGVzdC1hY3R1YWwnPjx0aD5SZXN1bHQ6IDwvdGg+PHRkPjxwcmU+IiArCisJCQkJYWN0
dWFsICsgIjwvcHJlPjwvdGQ+PC90cj4iOworCisJCQkvLyBEb24ndCBzaG93IGRpZmYgaWYgYWN0
dWFsIG9yIGV4cGVjdGVkIGFyZSBib29sZWFucworCQkJaWYgKCAhKCAvXih0cnVlfGZhbHNlKSQv
LnRlc3QoIGFjdHVhbCApICkgJiYKKwkJCQkJISggL14odHJ1ZXxmYWxzZSkkLy50ZXN0KCBleHBl
Y3RlZCApICkgKSB7CisJCQkJZGlmZiA9IFFVbml0LmRpZmYoIGV4cGVjdGVkLCBhY3R1YWwgKTsK
KwkJCQlzaG93RGlmZiA9IHN0cmlwSHRtbCggZGlmZiApLmxlbmd0aCAhPT0KKwkJCQkJc3RyaXBI
dG1sKCBleHBlY3RlZCApLmxlbmd0aCArCisJCQkJCXN0cmlwSHRtbCggYWN0dWFsICkubGVuZ3Ro
OworCQkJfQorCisJCQkvLyBEb24ndCBzaG93IGRpZmYgaWYgZXhwZWN0ZWQgYW5kIGFjdHVhbCBh
cmUgdG90YWxseSBkaWZmZXJlbnQKKwkJCWlmICggc2hvd0RpZmYgKSB7CisJCQkJbWVzc2FnZSAr
PSAiPHRyIGNsYXNzPSd0ZXN0LWRpZmYnPjx0aD5EaWZmOiA8L3RoPjx0ZD48cHJlPiIgKworCQkJ
CQlkaWZmICsgIjwvcHJlPjwvdGQ+PC90cj4iOworCQkJfQorCQl9IGVsc2UgaWYgKCBleHBlY3Rl
ZC5pbmRleE9mKCAiW29iamVjdCBBcnJheV0iICkgIT09IC0xIHx8CisJCQkJZXhwZWN0ZWQuaW5k
ZXhPZiggIltvYmplY3QgT2JqZWN0XSIgKSAhPT0gLTEgKSB7CisJCQltZXNzYWdlICs9ICI8dHIg
Y2xhc3M9J3Rlc3QtbWVzc2FnZSc+PHRoPk1lc3NhZ2U6IDwvdGg+PHRkPiIgKworCQkJCSJEaWZm
IHN1cHByZXNzZWQgYXMgdGhlIGRlcHRoIG9mIG9iamVjdCBpcyBtb3JlIHRoYW4gY3VycmVudCBt
YXggZGVwdGggKCIgKworCQkJCVFVbml0LmNvbmZpZy5tYXhEZXB0aCArICIpLjxwPkhpbnQ6IFVz
ZSA8Y29kZT5RVW5pdC5kdW1wLm1heERlcHRoPC9jb2RlPiB0byAiICsKKwkJCQkiIHJ1biB3aXRo
IGEgaGlnaGVyIG1heCBkZXB0aCBvciA8YSBocmVmPSciICsgc2V0VXJsKHsgbWF4RGVwdGg6IC0x
IH0pICsgIic+IiArCisJCQkJIlJlcnVuPC9hPiB3aXRob3V0IG1heCBkZXB0aC48L3A+PC90ZD48
L3RyPiI7CisJCX0KKworCQlpZiAoIGRldGFpbHMuc291cmNlICkgeworCQkJbWVzc2FnZSArPSAi
PHRyIGNsYXNzPSd0ZXN0LXNvdXJjZSc+PHRoPlNvdXJjZTogPC90aD48dGQ+PHByZT4iICsKKwkJ
CQllc2NhcGVUZXh0KCBkZXRhaWxzLnNvdXJjZSApICsgIjwvcHJlPjwvdGQ+PC90cj4iOworCQl9
CisKKwkJbWVzc2FnZSArPSAiPC90YWJsZT4iOworCisJLy8gdGhpcyBvY2NvdXJzIHdoZW4gcHVz
aEZhaWx1cmUgaXMgc2V0IGFuZCB3ZSBoYXZlIGFuIGV4dHJhY3RlZCBzdGFjayB0cmFjZQorCX0g
ZWxzZSBpZiAoICFkZXRhaWxzLnJlc3VsdCAmJiBkZXRhaWxzLnNvdXJjZSApIHsKKwkJbWVzc2Fn
ZSArPSAiPHRhYmxlPiIgKworCQkJIjx0ciBjbGFzcz0ndGVzdC1zb3VyY2UnPjx0aD5Tb3VyY2U6
IDwvdGg+PHRkPjxwcmU+IiArCisJCQllc2NhcGVUZXh0KCBkZXRhaWxzLnNvdXJjZSApICsgIjwv
cHJlPjwvdGQ+PC90cj4iICsKKwkJCSI8L3RhYmxlPiI7CisJfQorCisJYXNzZXJ0TGlzdCA9IHRl
c3RJdGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAib2wiIClbIDAgXTsKKworCWFzc2VydExpID0g
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImxpIiApOworCWFzc2VydExpLmNsYXNzTmFtZSA9IGRl
dGFpbHMucmVzdWx0ID8gInBhc3MiIDogImZhaWwiOworCWFzc2VydExpLmlubmVySFRNTCA9IG1l
c3NhZ2U7CisJYXNzZXJ0TGlzdC5hcHBlbmRDaGlsZCggYXNzZXJ0TGkgKTsKK30pOworCitRVW5p
dC50ZXN0RG9uZShmdW5jdGlvbiggZGV0YWlscyApIHsKKwl2YXIgdGVzdFRpdGxlLCB0aW1lLCB0
ZXN0SXRlbSwgYXNzZXJ0TGlzdCwKKwkJZ29vZCwgYmFkLCB0ZXN0Q291bnRzLCBza2lwcGVkLCBz
b3VyY2VOYW1lLAorCQl0ZXN0cyA9IGlkKCAicXVuaXQtdGVzdHMiICk7CisKKwlpZiAoICF0ZXN0
cyApIHsKKwkJcmV0dXJuOworCX0KKworCXRlc3RJdGVtID0gaWQoICJxdW5pdC10ZXN0LW91dHB1
dC0iICsgZGV0YWlscy50ZXN0SWQgKTsKKworCWFzc2VydExpc3QgPSB0ZXN0SXRlbS5nZXRFbGVt
ZW50c0J5VGFnTmFtZSggIm9sIiApWyAwIF07CisKKwlnb29kID0gZGV0YWlscy5wYXNzZWQ7CisJ
YmFkID0gZGV0YWlscy5mYWlsZWQ7CisKKwkvLyBzdG9yZSByZXN1bHQgd2hlbiBwb3NzaWJsZQor
CWlmICggY29uZmlnLnJlb3JkZXIgJiYgZGVmaW5lZC5zZXNzaW9uU3RvcmFnZSApIHsKKwkJaWYg
KCBiYWQgKSB7CisJCQlzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCAicXVuaXQtdGVzdC0iICsgZGV0
YWlscy5tb2R1bGUgKyAiLSIgKyBkZXRhaWxzLm5hbWUsIGJhZCApOworCQl9IGVsc2UgeworCQkJ
c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSggInF1bml0LXRlc3QtIiArIGRldGFpbHMubW9kdWxl
ICsgIi0iICsgZGV0YWlscy5uYW1lICk7CisJCX0KKwl9CisKKwlpZiAoIGJhZCA9PT0gMCApIHsK
KworCQkvLyBDb2xsYXBzZSB0aGUgcGFzc2luZyB0ZXN0cworCQlhZGRDbGFzcyggYXNzZXJ0TGlz
dCwgInF1bml0LWNvbGxhcHNlZCIgKTsKKwl9IGVsc2UgaWYgKCBiYWQgJiYgY29uZmlnLmNvbGxh
cHNlICYmICFjb2xsYXBzZU5leHQgKSB7CisKKwkJLy8gU2tpcCBjb2xsYXBzaW5nIHRoZSBmaXJz
dCBmYWlsaW5nIHRlc3QKKwkJY29sbGFwc2VOZXh0ID0gdHJ1ZTsKKwl9IGVsc2UgeworCisJCS8v
IENvbGxhcHNlIHJlbWFpbmluZyB0ZXN0cworCQlhZGRDbGFzcyggYXNzZXJ0TGlzdCwgInF1bml0
LWNvbGxhcHNlZCIgKTsKKwl9CisKKwkvLyB0ZXN0SXRlbS5maXJzdENoaWxkIGlzIHRoZSB0ZXN0
IG5hbWUKKwl0ZXN0VGl0bGUgPSB0ZXN0SXRlbS5maXJzdENoaWxkOworCisJdGVzdENvdW50cyA9
IGJhZCA/CisJCSI8YiBjbGFzcz0nZmFpbGVkJz4iICsgYmFkICsgIjwvYj4sICIgKyAiPGIgY2xh
c3M9J3Bhc3NlZCc+IiArIGdvb2QgKyAiPC9iPiwgIiA6CisJCSIiOworCisJdGVzdFRpdGxlLmlu
bmVySFRNTCArPSAiIDxiIGNsYXNzPSdjb3VudHMnPigiICsgdGVzdENvdW50cyArCisJCWRldGFp
bHMuYXNzZXJ0aW9ucy5sZW5ndGggKyAiKTwvYj4iOworCisJaWYgKCBkZXRhaWxzLnNraXBwZWQg
KSB7CisJCXRlc3RJdGVtLmNsYXNzTmFtZSA9ICJza2lwcGVkIjsKKwkJc2tpcHBlZCA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoICJlbSIgKTsKKwkJc2tpcHBlZC5jbGFzc05hbWUgPSAicXVuaXQt
c2tpcHBlZC1sYWJlbCI7CisJCXNraXBwZWQuaW5uZXJIVE1MID0gInNraXBwZWQiOworCQl0ZXN0
SXRlbS5pbnNlcnRCZWZvcmUoIHNraXBwZWQsIHRlc3RUaXRsZSApOworCX0gZWxzZSB7CisJCWFk
ZEV2ZW50KCB0ZXN0VGl0bGUsICJjbGljayIsIGZ1bmN0aW9uKCkgeworCQkJdG9nZ2xlQ2xhc3Mo
IGFzc2VydExpc3QsICJxdW5pdC1jb2xsYXBzZWQiICk7CisJCX0pOworCisJCXRlc3RJdGVtLmNs
YXNzTmFtZSA9IGJhZCA/ICJmYWlsIiA6ICJwYXNzIjsKKworCQl0aW1lID0gZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCggInNwYW4iICk7CisJCXRpbWUuY2xhc3NOYW1lID0gInJ1bnRpbWUiOworCQl0
aW1lLmlubmVySFRNTCA9IGRldGFpbHMucnVudGltZSArICIgbXMiOworCQl0ZXN0SXRlbS5pbnNl
cnRCZWZvcmUoIHRpbWUsIGFzc2VydExpc3QgKTsKKwl9CisKKwkvLyBTaG93IHRoZSBzb3VyY2Ug
b2YgdGhlIHRlc3Qgd2hlbiBzaG93aW5nIGFzc2VydGlvbnMKKwlpZiAoIGRldGFpbHMuc291cmNl
ICkgeworCQlzb3VyY2VOYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInAiICk7CisJCXNv
dXJjZU5hbWUuaW5uZXJIVE1MID0gIjxzdHJvbmc+U291cmNlOiA8L3N0cm9uZz4iICsgZGV0YWls
cy5zb3VyY2U7CisJCWFkZENsYXNzKCBzb3VyY2VOYW1lLCAicXVuaXQtc291cmNlIiApOworCQlp
ZiAoIGJhZCA9PT0gMCApIHsKKwkJCWFkZENsYXNzKCBzb3VyY2VOYW1lLCAicXVuaXQtY29sbGFw
c2VkIiApOworCQl9CisJCWFkZEV2ZW50KCB0ZXN0VGl0bGUsICJjbGljayIsIGZ1bmN0aW9uKCkg
eworCQkJdG9nZ2xlQ2xhc3MoIHNvdXJjZU5hbWUsICJxdW5pdC1jb2xsYXBzZWQiICk7CisJCX0p
OworCQl0ZXN0SXRlbS5hcHBlbmRDaGlsZCggc291cmNlTmFtZSApOworCX0KK30pOworCitpZiAo
IGRlZmluZWQuZG9jdW1lbnQgKSB7CisKKwkvLyBBdm9pZCByZWFkeVN0YXRlIGlzc3VlIHdpdGgg
cGhhbnRvbWpzCisJLy8gUmVmOiAjODE4CisJdmFyIG5vdFBoYW50b20gPSAoIGZ1bmN0aW9uKCBw
ICkgeworCQlyZXR1cm4gISggcCAmJiBwLnZlcnNpb24gJiYgcC52ZXJzaW9uLm1ham9yID4gMCAp
OworCX0gKSggd2luZG93LnBoYW50b20gKTsKKworCWlmICggbm90UGhhbnRvbSAmJiBkb2N1bWVu
dC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgeworCQlRVW5pdC5sb2FkKCk7CisJfSBlbHNl
IHsKKwkJYWRkRXZlbnQoIHdpbmRvdywgImxvYWQiLCBRVW5pdC5sb2FkICk7CisJfQorfSBlbHNl
IHsKKwljb25maWcucGFnZUxvYWRlZCA9IHRydWU7CisJY29uZmlnLmF1dG9ydW4gPSB0cnVlOwor
fQorCit9KSgpOwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Vi
a2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1
ZS5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1
YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanMKaW5kZXggZTRhOTk1
MTFmODk5MmI3NDhlZTg4MGYzMDA1NzM2ZDg2ZDJhZGRhOC4uYzVjOTMwZmE3NGMyZjkwMzQ2MWIx
N2I4ZDJlODA5MmU3NDZiNWVkMCAxMDA2NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQv
YnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVp
bGRib3RRdWV1ZS5qcworKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQu
b3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1ZXVlLmpz
CkBAIC0yNzEsNyArMjcxLDEwIEBAIEJ1aWxkYm90UXVldWUucHJvdG90eXBlID0gewogICAgICAg
ICB2YXIgc29ydGVkUmVwb3NpdG9yaWVzID0gRGFzaGJvYXJkLnNvcnRlZFJlcG9zaXRvcmllczsK
ICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWRSZXBvc2l0b3JpZXMubGVuZ3RoOyAr
K2kpIHsKICAgICAgICAgICAgIHZhciByZXBvc2l0b3J5TmFtZSA9IHNvcnRlZFJlcG9zaXRvcmll
c1tpXS5uYW1lOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGIucmV2aXNpb25bcmVwb3NpdG9y
eU5hbWVdIC0gYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV07CisgICAgICAgICAgICB2YXIgdHJh
YyA9IHNvcnRlZFJlcG9zaXRvcmllc1tpXS50cmFjOworICAgICAgICAgICAgaWYgKCF0cmFjIHx8
IGIucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdID09PSB1bmRlZmluZWQgfHwgYS5yZXZpc2lvblty
ZXBvc2l0b3J5TmFtZV0gPT09IHVuZGVmaW5lZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5k
ZWZpbmVkOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyYWMuY29tcGFyZVJldmlzaW9ucyhi
LnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSwgYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0pOwog
ICAgICAgICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Owog
ICAgICAgICB9CkBAIC0yODksNyArMjkyLDEwIEBAIEJ1aWxkYm90UXVldWUucHJvdG90eXBlID0g
ewogICAgICAgICB2YXIgc29ydGVkUmVwb3NpdG9yaWVzID0gRGFzaGJvYXJkLnNvcnRlZFJlcG9z
aXRvcmllczsKICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWRSZXBvc2l0b3JpZXMu
bGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgIHZhciByZXBvc2l0b3J5TmFtZSA9IHNvcnRlZFJl
cG9zaXRvcmllc1tpXS5uYW1lOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGIucmV2aXNpb25b
cmVwb3NpdG9yeU5hbWVdIC0gYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV07CisgICAgICAgICAg
ICB2YXIgdHJhYyA9IHNvcnRlZFJlcG9zaXRvcmllc1tpXS50cmFjOworICAgICAgICAgICAgaWYg
KCF0cmFjIHx8IGIucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdID09PSB1bmRlZmluZWQgfHwgYS5y
ZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0gPT09IHVuZGVmaW5lZCkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gdW5kZWZpbmVkOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyYWMuY29tcGFyZVJl
dmlzaW9ucyhiLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSwgYS5yZXZpc2lvbltyZXBvc2l0b3J5
TmFtZV0pOwogICAgICAgICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgICAgICByZXR1cm4g
cmVzdWx0OwogICAgICAgICB9CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9i
dWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWls
ZGJvdFF1ZXVlVmlldy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5v
cmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWVWaWV3
LmpzCmluZGV4IDkyNjdmNDlkYTc1NzJkMDQzZDNiOTY5Yjk0N2RmODA5MjViMTdlMzguLjA2NjMw
M2UxZDcyMjBlYmQxOWUzODI3NzRjOWU2ODIzNDBmMGQyYmMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0J1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWVWaWV3LmpzCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVT
dXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3Jp
cHRzL0J1aWxkYm90UXVldWVWaWV3LmpzCkBAIC05MSwxMiArOTEsMTMgQEAgQnVpbGRib3RRdWV1
ZVZpZXcucHJvdG90eXBlID0gewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAg
ICAgaWYgKCF0cmFjKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYg
KCF0cmFjLmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIgfHwgdHJhYy5vbGRlc3RSZWNvcmRl
ZFJldmlzaW9uTnVtYmVyID4gbGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyKSB7CisgICAg
ICAgICAgICBjb21wYXJpc29uID0gdHJhYy5jb21wYXJlUmV2aXNpb25zKHRyYWMub2xkZXN0UmVj
b3JkZWRSZXZpc2lvbk51bWJlciwgbGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyKTsKKyAg
ICAgICAgICAgIGlmICghdHJhYy5sYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVyIHx8IGNvbXBh
cmlzb24gPT09IHVuZGVmaW5lZCB8fCBjb21wYXJpc29uID4gMCkgewogICAgICAgICAgICAgICAg
IHRyYWMubG9hZE1vcmVIaXN0b3JpY2FsRGF0YSgpOwogICAgICAgICAgICAgICAgIHJldHVybjsK
ICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdG90YWxSZXZpc2lvbnNCZWhpbmQgKz0gdHJh
Yy5jb21taXRzT25CcmFuY2goYnJhbmNoLm5hbWUsIGZ1bmN0aW9uKGNvbW1pdCkgeyByZXR1cm4g
Y29tbWl0LnJldmlzaW9uTnVtYmVyID4gbGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyOyB9
KS5sZW5ndGg7CisgICAgICAgICAgICB0b3RhbFJldmlzaW9uc0JlaGluZCArPSB0cmFjLmNvbW1p
dHNPbkJyYW5jaChicmFuY2gubmFtZSwgZnVuY3Rpb24oY29tbWl0LCBpbmRleCwgYXJyKSB7IHJl
dHVybiBpbmRleCA+IGFyci5vYmplY3RJbmRleE9mKGxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51
bWJlciwgInJldmlzaW9uTnVtYmVyIik7IH0pLmxlbmd0aDsKICAgICAgICAgfQogCiAgICAgICAg
IGlmICghdG90YWxSZXZpc2lvbnNCZWhpbmQpCkBAIC0xMzcsMTEgKzEzOCwxMSBAQCBCdWlsZGJv
dFF1ZXVlVmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAg
ICAgICB9CiAKLSAgICAgICAgY29uc29sZS5hc3NlcnQodHJhYy5vbGRlc3RSZWNvcmRlZFJldmlz
aW9uTnVtYmVyIDw9IGZpcnN0UmV2aXNpb25OdW1iZXIpOworICAgICAgICBjb25zb2xlLmFzc2Vy
dCh0cmFjLmNvbXBhcmVSZXZpc2lvbnModHJhYy5vbGRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVy
LCBmaXJzdFJldmlzaW9uTnVtYmVyKSA8PSAwKTsKIAogICAgICAgICAvLyBGSVhNRTogVG8gYmUg
MTAwJSBjb3JyZWN0LCB3ZSBzaG91bGQgYWxzbyBmaWx0ZXIgb3V0IGNoYW5nZXMgdGhhdCBhcmUg
aWdub3JlZCBieQogICAgICAgICAvLyB0aGUgcXVldWUsIHNlZSBfc2hvdWxkX2ZpbGVfdHJpZ2dl
cl9idWlsZCBpbiB3a2J1aWxkLnB5LgotICAgICAgICB2YXIgY29tbWl0cyA9IHRyYWMuY29tbWl0
c09uQnJhbmNoKGJyYW5jaCwgZnVuY3Rpb24oY29tbWl0KSB7IHJldHVybiBjb21taXQucmV2aXNp
b25OdW1iZXIgPj0gZmlyc3RSZXZpc2lvbk51bWJlciAmJiBjb21taXQucmV2aXNpb25OdW1iZXIg
PD0gbGFzdFJldmlzaW9uTnVtYmVyOyB9KTsKKyAgICAgICAgdmFyIGNvbW1pdHMgPSB0cmFjLmNv
bW1pdHNPbkJyYW5jaChicmFuY2gubmFtZSwgZnVuY3Rpb24oY29tbWl0LCBpbmRleCwgYXJyKSB7
IHJldHVybiBpbmRleCA+PSBhcnIub2JqZWN0SW5kZXhPZihmaXJzdFJldmlzaW9uTnVtYmVyLCAi
cmV2aXNpb25OdW1iZXIiKSAmJiBpbmRleCA8PSBhcnIub2JqZWN0SW5kZXhPZihsYXN0UmV2aXNp
b25OdW1iZXIsICJyZXZpc2lvbk51bWJlciIpOyB9KTsKICAgICAgICAgcmV0dXJuIGNvbW1pdHMu
bWFwKGZ1bmN0aW9uKGNvbW1pdCkgewogICAgICAgICAgICAgcmV0dXJuIGxpbmVGb3JDb21taXQo
dHJhYywgY29tbWl0KTsKICAgICAgICAgfSwgdGhpcykucmV2ZXJzZSgpOwpAQCAtMTY2LDcgKzE2
Nyw3IEBAIEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgIHZhciBs
YXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIgPSBsYXRlc3RQcm9kdWN0aXZlSXRlcmF0aW9u
LnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXTsKICAgICAgICAgICAgIGlmICghbGF0ZXN0UHJvZHVj
dGl2ZVJldmlzaW9uTnVtYmVyIHx8ICF0cmFjLmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIp
CiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB2YXIgbGluZXMgPSB0aGlz
Ll9wb3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSh0cmFjLCBicmFuY2gubmFtZSwgbGF0ZXN0UHJv
ZHVjdGl2ZVJldmlzaW9uTnVtYmVyICsgMSwgdHJhYy5sYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVt
YmVyKTsKKyAgICAgICAgICAgIHZhciBsaW5lcyA9IHRoaXMuX3BvcG92ZXJMaW5lc0ZvckNvbW1p
dFJhbmdlKHRyYWMsIGJyYW5jaCwgdHJhYy5uZXh0UmV2aXNpb24oYnJhbmNoLm5hbWUsIGxhdGVz
dFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlciksIHRyYWMubGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51
bWJlcik7CiAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gbGluZXMubGVuZ3RoOwogICAgICAgICAg
ICAgaWYgKGxlbmd0aCAmJiBzaG91bGRBZGREaXZpZGVyKQogICAgICAgICAgICAgICAgIHRoaXMu
X2FkZERpdmlkZXJUb1BvcG92ZXIoY29udGVudCk7CkBAIC0yMzMsNyArMjM0LDcgQEAgQnVpbGRi
b3RRdWV1ZVZpZXcucHJvdG90eXBlID0gewogICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB7CiAg
ICAgICAgICAgICAgICAgdHJhYzogcmVwb3NpdG9yeS50cmFjLAogICAgICAgICAgICAgICAgIGJy
YW5jaDogYnJhbmNoLm5hbWUsCi0gICAgICAgICAgICAgICAgZmlyc3RSZXZpc2lvbjogcHJldmlv
dXNJdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdICsgMSwKKyAgICAgICAgICAgICAg
ICBmaXJzdFJldmlzaW9uOiByZXBvc2l0b3J5LnRyYWMubmV4dFJldmlzaW9uKGJyYW5jaC5uYW1l
LCBwcmV2aW91c0l0ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0pLAogICAgICAgICAg
ICAgICAgIGxhc3RSZXZpc2lvbjogaXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXQog
ICAgICAgICAgICAgfTsKICAgICAgICAgICAgIGlmIChjb250ZXh0LmZpcnN0UmV2aXNpb24gPD0g
Y29udGV4dC5sYXN0UmV2aXNpb24pCmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9y
dC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9U
cmFjLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVHJhYy5qcwppbmRleCBhMWRkMjhmYTI3NTBl
YzI5MzNjYjhiZmVhOGRjMDQ1YzNhMTUyNmNiLi42ZWE2YWNmMDJkZDhiNmNkMjg5NThiN2NmM2Mz
MDYyNDQ1M2FiNGM2IDEwMDY0NAotLS0gYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzCisr
KyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1Ymxp
Y19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1RyYWMuanMKQEAgLTY1LDggKzY1LDggQEAgVHJhYy5w
cm90b3R5cGUgPSB7CiAKICAgICBjb21taXRzT25CcmFuY2g6IGZ1bmN0aW9uKGJyYW5jaCwgZmls
dGVyKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVjb3JkZWRDb21taXRzLmZpbHRlcihm
dW5jdGlvbihjb21taXQpIHsKLSAgICAgICAgICAgIHJldHVybiAoIWNvbW1pdC5jb250YWluc0Jy
YW5jaExvY2F0aW9uIHx8IGNvbW1pdC5icmFuY2ggPT09IGJyYW5jaCkgJiYgZmlsdGVyKGNvbW1p
dCk7CisgICAgICAgIHJldHVybiB0aGlzLnJlY29yZGVkQ29tbWl0cy5maWx0ZXIoZnVuY3Rpb24o
Y29tbWl0LCBpbmRleCwgYXJyKSB7CisgICAgICAgICAgICByZXR1cm4gKCFjb21taXQuY29udGFp
bnNCcmFuY2hMb2NhdGlvbiB8fCBjb21taXQuYnJhbmNoID09PSBicmFuY2gpICYmIGZpbHRlcihj
b21taXQsIGluZGV4LCBhcnIpOwogICAgICAgICB9KTsKICAgICB9LAogCkBAIC04NywxNyArODcs
MTkgQEAgVHJhYy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICAiJmRheXNiYWNrPSIgKyAoKHRv
RGF5IC0gZnJvbURheSkgLyAxMDAwIC8gNjAgLyA2MCAvIDI0KTsKICAgICB9LAogCi0gICAgX2Nv
bnZlcnRDb21taXRJbmZvRWxlbWVudFRvT2JqZWN0OiBmdW5jdGlvbihkb2MsIGNvbW1pdEVsZW1l
bnQpCisgICAgX3BhcnNlUmV2aXNpb25Gcm9tVVJMOiBmdW5jdGlvbih1cmwpCiAgICAgewotICAg
ICAgICB2YXIgbGluayA9IGRvYy5ldmFsdWF0ZSgiLi9saW5rIiwgY29tbWl0RWxlbWVudCwgbnVs
bCwgWFBhdGhSZXN1bHQuU1RSSU5HX1RZUEUpLnN0cmluZ1ZhbHVlOwotCiAgICAgICAgIC8vIFRo
ZXJlIGFyZSBtdWx0aXBsZSBsaW5rIGZvcm1hdHMgZm9yIFRyYWMgdGhhdCB3ZSBzdXBwb3J0Ogog
ICAgICAgICAvLyBodHRwczovL3RyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQvMTkwNDk3CiAgICAg
ICAgIC8vIGh0dHA6Ly90cmFjLmZvb2Jhci5jb20vcmVwb3NpdG9yeS9jaGFuZ2VzZXQvNzUzODgv
cHJvamVjdAotICAgICAgICB2YXIgbGlua0NvbXBvbmVudHMgPSBsaW5rLnNwbGl0KCIvIik7Ci0g
ICAgICAgIHZhciByZXZpc2lvbk51bWJlciA9IHBhcnNlSW50KGxpbmtDb21wb25lbnRzLnBvcCgp
KTsKLSAgICAgICAgaWYgKCFyZXZpc2lvbk51bWJlcikKLSAgICAgICAgICAgIHZhciByZXZpc2lv
bk51bWJlciA9IHBhcnNlSW50KGxpbmtDb21wb25lbnRzLnBvcCgpKTsKKyAgICAgICAgLy8gaHR0
cHM6Ly9naXQuZm9vYmFyLmNvbS90cmFjL1doYXRldmVyLmdpdC9jaGFuZ2VzZXQvMGU0OThkYjVk
OGU1YjVhMzQyNjMxCisgICAgICAgIHJldHVybiAvY2hhbmdlc2V0XC8oW2EtZjAtOV0rKS4qJC8u
ZXhlYyh1cmwpWzFdOworICAgIH0sCisKKyAgICBfY29udmVydENvbW1pdEluZm9FbGVtZW50VG9P
YmplY3Q6IGZ1bmN0aW9uKGRvYywgY29tbWl0RWxlbWVudCkKKyAgICB7CisgICAgICAgIHZhciBs
aW5rID0gZG9jLmV2YWx1YXRlKCIuL2xpbmsiLCBjb21taXRFbGVtZW50LCBudWxsLCBYUGF0aFJl
c3VsdC5TVFJJTkdfVFlQRSkuc3RyaW5nVmFsdWU7CisgICAgICAgIHZhciByZXZpc2lvbk51bWJl
ciA9IHRoaXMuX3BhcnNlUmV2aXNpb25Gcm9tVVJMKGxpbmspOwogCiAgICAgICAgIGZ1bmN0aW9u
IHRyYWNOU1Jlc29sdmVyKHByZWZpeCkKICAgICAgICAgewpAQCAtMTk1LDcgKzE5Nyw3IEBAIFRy
YWMucHJvdG90eXBlID0gewogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5ld0NvbW1pdHMubGVu
Z3RoKQotICAgICAgICAgICAgdGhpcy5yZWNvcmRlZENvbW1pdHMgPSBuZXdDb21taXRzLmNvbmNh
dCh0aGlzLnJlY29yZGVkQ29tbWl0cykuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhLnJl
dmlzaW9uTnVtYmVyIC0gYi5yZXZpc2lvbk51bWJlcjsgfSk7CisgICAgICAgICAgICB0aGlzLnJl
Y29yZGVkQ29tbWl0cyA9IG5ld0NvbW1pdHMuY29uY2F0KHRoaXMucmVjb3JkZWRDb21taXRzKS5z
b3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEuZGF0ZSAtIGIuZGF0ZTsgfSk7CiAKICAgICAg
ICAgaWYgKG5ld0NvbW1pdHMubGVuZ3RoIHx8IGtub3duQ29tbWl0c1dlcmVVcGRhdGVkKQogICAg
ICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoVHJhYy5FdmVudC5Db21taXRz
VXBkYXRlZCwgbnVsbCk7CkBAIC0yNTcsNCArMjU5LDI0IEBAIFRyYWMucHJvdG90eXBlID0gewog
ICAgICAgICAgICAgdGhpcy5fbG9hZGVkKGRhdGFEb2N1bWVudCk7CiAgICAgICAgIH0uYmluZCh0
aGlzKSwgdGhpcy5fbmVlZHNBdXRoZW50aWNhdGlvbiA/IHsgd2l0aENyZWRlbnRpYWxzOiB0cnVl
IH0gOiB7fSk7CiAgICAgfSwKKworICAgIGNvbXBhcmVSZXZpc2lvbnM6IGZ1bmN0aW9uKGEsIGIp
CisgICAgeworICAgICAgICB2YXIgaW5kZXhBID0gdGhpcy5yZWNvcmRlZENvbW1pdHMub2JqZWN0
SW5kZXhPZihhLCAicmV2aXNpb25OdW1iZXIiKTsKKyAgICAgICAgdmFyIGluZGV4QiA9IHRoaXMu
cmVjb3JkZWRDb21taXRzLm9iamVjdEluZGV4T2YoYiwgInJldmlzaW9uTnVtYmVyIik7CisgICAg
ICAgIGlmIChpbmRleEEgPT09IHVuZGVmaW5lZCB8fCBpbmRleEIgPT09IHVuZGVmaW5lZCkgewor
ICAgICAgICAgICAgdGhpcy5sb2FkTW9yZUhpc3RvcmljYWxEYXRhKCk7CisgICAgICAgICAgICBy
ZXR1cm4gdW5kZWZpbmVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbmRleEEgLSBpbmRl
eEI7CisgICAgfSwKKworICAgIG5leHRSZXZpc2lvbjogZnVuY3Rpb24oYnJhbmNoTmFtZSwgcmV2
aXNpb24pIHsKKyAgICAgICAgdmFyIGNvbW1pdHNPbkJyYW5jaCA9IHRoaXMuY29tbWl0c09uQnJh
bmNoKGJyYW5jaE5hbWUsIGZ1bmN0aW9uKGNvbW1pdCkgeyByZXR1cm4gY29tbWl0OyB9KTsgLy8g
VE9ETzogbWF5YmUgd2Ugc2hvdWxkIGNhY2hlIHRoaXM/CisgICAgICAgIHZhciBpbmRleCA9IGNv
bW1pdHNPbkJyYW5jaC5vYmplY3RJbmRleE9mKHJldmlzaW9uLCAicmV2aXNpb25OdW1iZXIiKTsK
KyAgICAgICAgdmFyIG5leHRDb21taXQgPSBjb21taXRzT25CcmFuY2hbaW5kZXggKyAxXTsKKyAg
ICAgICAgaWYgKG5leHRDb21taXQpCisgICAgICAgICAgICByZXR1cm4gbmV4dENvbW1pdC5yZXZp
c2lvbk51bWJlcjsKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICB9CiB9OwpkaWZmIC0t
Z2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVi
bGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVXRpbGl0aWVzLmpzIGIvVG9vbHMvQnVpbGRTbGF2
ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Nj
cmlwdHMvVXRpbGl0aWVzLmpzCmluZGV4IDJkNzAyNTAxZTcxZmE2ZTljZWYzZDYyMTIzMGI5OWU5
ZjEyZDEwZGYuLjFhNTQ0MTlkZDFkOTc5MTA1YjUxMjFiZTc3MWRkNWE5MTkxYjNhYzQgMTAwNjQ0
Ci0tLSBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1
YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1V0aWxpdGllcy5qcworKysgYi9Ub29scy9CdWls
ZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9h
cmQvU2NyaXB0cy9VdGlsaXRpZXMuanMKQEAgLTE2Niw2ICsxNjYsMTMgQEAgQXJyYXkucHJvdG90
eXBlLmZpbmRGaXJzdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkKICAgICByZXR1cm4gbnVsbDsKIH07
CiAKK0FycmF5LnByb3RvdHlwZS5vYmplY3RJbmRleE9mID0gZnVuY3Rpb24oc2VhcmNoVGVybSwg
cHJvcGVydHkpCit7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKQor
ICAgICAgICBpZiAodGhpc1tpXVtwcm9wZXJ0eV0gPT09IHNlYXJjaFRlcm0pIHJldHVybiBpOwor
ICAgIHJldHVybiB1bmRlZmluZWQ7Cit9OworCiBBcnJheS5wcm90b3R5cGUuYXZlcmFnZSA9IGZ1
bmN0aW9uKCkKIHsKICAgICB2YXIgc3VtID0gMDsKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xh
dmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9T
Y3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBv
cnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMv
dGVzdHMvTW9ja0J1aWxkYm90UXVldWUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzBlYzMxNjdlMmI1NGI1OGU5
N2ZiMWVkYzk0Y2IyMzZjMDljNTQxZAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xh
dmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9T
Y3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlLmpzCkBAIC0wLDAgKzEsMjUgQEAKK01vY2tC
dWlsZGJvdFF1ZXVlID0gZnVuY3Rpb24oKQoreworICAgIGluZm8gPSB7CisgICAgICAgIGJyYW5j
aGVzOiAiIiwKKyAgICAgICAgcGxhdGZvcm06ICIiLAorICAgICAgICBkZWJ1ZzogIiIsCisgICAg
ICAgIGJ1aWxkZXI6ICIiLAorICAgICAgICB0ZXN0ZXI6ICIiLAorICAgICAgICBwZXJmb3JtYW5j
ZTogIiIsCisgICAgICAgIHN0YXRpY0FuYWx5emVyOiAiIiwKKyAgICAgICAgbGVha3M6ICIiLAor
ICAgICAgICBhcmNoaXRlY3R1cmU6ICIiLAorICAgICAgICB0ZXN0Q2F0ZWdvcnk6ICIiLAorICAg
ICAgICBoZWFkaW5nOiAiIiwKKyAgICAgICAgY3Jhc2hlc09ubHk6ICIiCisgICAgfTsKKyAgICBC
dWlsZGJvdFF1ZXVlLmNhbGwodGhpcywgIk1vY2sgQnVpbGRCb3QiLCAiaWQiLCBpbmZvKTsKK307
CisKK0Jhc2VPYmplY3QuYWRkQ29uc3RydWN0b3JGdW5jdGlvbnMoTW9ja0J1aWxkYm90UXVldWUp
OworCitNb2NrQnVpbGRib3RRdWV1ZS5wcm90b3R5cGUgPSB7CisgICAgY29uc3RydWN0b3I6IE1v
Y2tCdWlsZGJvdFF1ZXVlLAorICAgIF9fcHJvdG9fXzogQnVpbGRib3RRdWV1ZS5wcm90b3R5cGUK
K30KZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1
ZXVlVmlldy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29u
ZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVl
Vmlldy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5kYzMyOGIyZTRkZTU1ZmUyNzY2N2VkZjgwMDQxNjAxNzQyZTJm
OTFlCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Vi
a2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1
aWxkYm90UXVldWVWaWV3LmpzCkBAIC0wLDAgKzEsMjYgQEAKK01vY2tCdWlsZGJvdFF1ZXVlVmll
dyA9IGZ1bmN0aW9uKHF1ZXVlcykKK3sKKyAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCJkaXYiKTsKKyAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgicXVldWUt
dmlldyIpOworICAgIHRoaXMuZWxlbWVudC5fX3F1ZXVlVmlldyA9IHRoaXM7CisKKyAgICB0aGlz
LnF1ZXVlcyA9IHF1ZXVlcyB8fCBbXTsKKworICAgIEJhc2VPYmplY3QuY2FsbCh0aGlzKTsKK307
CisKK0Jhc2VPYmplY3QuYWRkQ29uc3RydWN0b3JGdW5jdGlvbnMoTW9ja0J1aWxkYm90UXVldWVW
aWV3KTsKKworTW9ja0J1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1
Y3RvcjogTW9ja0J1aWxkYm90UXVldWVWaWV3LAorICAgIF9fcHJvdG9fXzogQnVpbGRib3RRdWV1
ZVZpZXcucHJvdG90eXBlLAorCisgICAgX2xhdGVzdFByb2R1Y3RpdmVJdGVyYXRpb246IGZ1bmN0
aW9uKHF1ZXVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHJldmlzaW9u
OiB7CisgICAgICAgICAgICAgICAgIldlYmtpdCBSZXBvIjogMzMwMjAKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfTsKKyAgICB9Cit9OwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBv
cnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMv
dGVzdHMvTW9ja092ZXJyaWRlcy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndl
YmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tP
dmVycmlkZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODU2MmI4NjcxZDVmMmM5MmIyM2YyZDQ5NDgyM2NhNjIx
MjI1MGY1MAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxk
LndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01v
Y2tPdmVycmlkZXMuanMKQEAgLTAsMCArMSwxMSBAQAorLy8gVGhlIHJlYWwgImxhYmVsIiBzZXR0
ZXIgd2FzIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpbiB0aGUgdW5pdCB0ZXN0cyBzbyBJIG92ZXJy
b2RlIGl0IHdpdGggYSBzaW1wbGlmaWVkIHZlcnNpb24uCitPYmplY3QuZGVmaW5lUHJvcGVydHko
U3RhdHVzTGluZVZpZXcucHJvdG90eXBlLCAibGFiZWwiLCB7CisgICAgc2V0OiBmdW5jdGlvbiBs
YWJlbCh4KQorICAgIHsKKyAgICAgICAgaWYgKHgpIHsKKyAgICAgICAgICAgIHRoaXMuX2xhYmVs
RWxlbWVudC50ZXh0Q29udGVudCA9IHg7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnQuaW5zZXJ0
QmVmb3JlKHRoaXMuX2xhYmVsRWxlbWVudCwgdGhpcy5fbWVzc2FnZUVsZW1lbnQpOworICAgICAg
ICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoIm5vLWxhYmVsIik7CisgICAgICAg
IH0KKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxk
LndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01v
Y2tUcmFjLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja1RyYWMuanMKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uYTQ4ZjkxNTJjODkwNWFjODE4NDkzNmVhNzMzYjhmY2ZkNTNjOGVmZQotLS0gL2Rldi9u
dWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmln
L3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tUcmFjLmpzCkBAIC0wLDAg
KzEsNzcgQEAKK01vY2tUcmFjID0gZnVuY3Rpb24oKQoreworICAgIFRyYWMuY2FsbCh0aGlzLCAi
aHR0cHM6Ly90cmFjLndlYmtpdC5vcmcvIik7CisgICAgdGhpcy5yZWNvcmRlZENvbW1pdHMgPSBb
CisgICAgICAgIHsKKyAgICAgICAgICAgICJyZXZpc2lvbk51bWJlciI6IDMzMDE4LAorICAgICAg
ICAgICAgImxpbmsiOiAiaHR0cDovL3RyYWMud2Via2l0Lm9yZy9yZXBvc2l0b3J5L2NoYW5nZXNl
dC83NzAxOC9zYWZhcmkiLAorICAgICAgICAgICAgInRpdGxlIjoge30sCisgICAgICAgICAgICAi
YXV0aG9yIjogIkpvaG4iLAorICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0xMS0xNVQxNzowNTo0
NC4wMDBaIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiIsCisgICAg
ICAgICAgICAiY29udGFpbnNCcmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAgICAgICAgICAiYnJh
bmNoIjogInRydW5rIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAicmV2aXNp
b25OdW1iZXIiOiAzMzAxOSwKKyAgICAgICAgICAgICJsaW5rIjogImh0dHA6Ly90cmFjLndlYmtp
dC5vcmcvcmVwb3NpdG9yeS9jaGFuZ2VzZXQvNzcwMTkvc2FmYXJpIiwKKyAgICAgICAgICAgICJ0
aXRsZSI6IHt9LAorICAgICAgICAgICAgImF1dGhvciI6ICJQYXVsIiwKKyAgICAgICAgICAgICJk
YXRlIjogIjIwMTUtMTEtMTZUMDE6MTg6MjMuMDAwWiIsCisgICAgICAgICAgICAiZGVzY3JpcHRp
b24iOiAiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgImNvbnRhaW5zQnJhbmNoTG9jYXRpb24i
OiB0cnVlLAorICAgICAgICAgICAgImJyYW5jaCI6ICJ0cnVuayIKKyAgICAgICAgfSwKKyAgICAg
ICAgeworICAgICAgICAgICAgInJldmlzaW9uTnVtYmVyIjogMzMwMjAsCisgICAgICAgICAgICAi
bGluayI6ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL3JlcG9zaXRvcnkvY2hhbmdlc2V0Lzc3MDIw
L3NhZmFyaSIsCisgICAgICAgICAgICAidGl0bGUiOiB7fSwKKyAgICAgICAgICAgICJhdXRob3Ii
OiAiR2VvcmdlIiwKKyAgICAgICAgICAgICJkYXRlIjogIjIwMTUtMTEtMTZUMDE6MTk6MjcuMDAw
WiIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzY3JpcHRpb24iLAorICAgICAgICAg
ICAgImNvbnRhaW5zQnJhbmNoTG9jYXRpb24iOiB0cnVlLAorICAgICAgICAgICAgImJyYW5jaCI6
ICJ0cnVuayIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInJldmlzaW9uTnVt
YmVyIjogMzMwMjEsCisgICAgICAgICAgICAibGluayI6ICJodHRwOi8vdHJhYy53ZWJraXQub3Jn
L3JlcG9zaXRvcnkvY2hhbmdlc2V0Lzc3MDIxL3NhZmFyaSIsCisgICAgICAgICAgICAidGl0bGUi
OiB7fSwKKyAgICAgICAgICAgICJhdXRob3IiOiAiUmluZ28iLAorICAgICAgICAgICAgImRhdGUi
OiAiMjAxNS0xMS0xNlQwMToyMDo1OC4wMDBaIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6
ICJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAiY29udGFpbnNCcmFuY2hMb2NhdGlvbiI6IHRy
dWUsCisgICAgICAgICAgICAiYnJhbmNoIjogInNvbWVPdGhlckJyYW5jaCIKKyAgICAgICAgfSwK
KyAgICAgICAgeworICAgICAgICAgICAgInJldmlzaW9uTnVtYmVyIjogMzMwMjIsCisgICAgICAg
ICAgICAibGluayI6ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL3JlcG9zaXRvcnkvY2hhbmdlc2V0
Lzc3MDIyL3NhZmFyaSIsCisgICAgICAgICAgICAidGl0bGUiOiB7fSwKKyAgICAgICAgICAgICJh
dXRob3IiOiAiQm9iIiwKKyAgICAgICAgICAgICJkYXRlIjogIjIwMTUtMTEtMTZUMDE6MjI6MDEu
MDAwWiIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzY3JpcHRpb24iLAorICAgICAg
ICAgICAgImNvbnRhaW5zQnJhbmNoTG9jYXRpb24iOiB0cnVlLAorICAgICAgICAgICAgImJyYW5j
aCI6ICJ0cnVuayIKKyAgICAgICAgfQorICAgIF07Cit9OworCitCYXNlT2JqZWN0LmFkZENvbnN0
cnVjdG9yRnVuY3Rpb25zKE1vY2tUcmFjKTsKKworTW9ja1RyYWMucHJvdG90eXBlID0geworICAg
IGNvbnN0cnVjdG9yOiBNb2NrVHJhYywKKyAgICBfX3Byb3RvX186IFRyYWMucHJvdG90eXBlLAor
CisgICAgZ2V0IG9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIDMzMDE4OworICAgIH0sCisKKyAgICBnZXQgbGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51
bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gMzMwMjI7CisgICAgfSwKKworICAgIGxvYWRN
b3JlSGlzdG9yaWNhbERhdGE6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgfSwKK307CmRpZmYgLS1n
aXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJs
aWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9pbmRleC5odG1sIGIvVG9vbHMvQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L1NjcmlwdHMvdGVzdHMvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hZWJiODhiMmJiM2EyYTk2NWU2
MTgzNDliMzY2MmM5ZTE5NTAxNDIyCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2
ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Nj
cmlwdHMvdGVzdHMvaW5kZXguaHRtbApAQCAtMCwwICsxLDUxIEBACis8IWRvY3R5cGUgaHRtbD4K
KzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+CisKKyAgICA8dGl0
bGU+V2ViS2l0IEJvdCBXYXRjaGVyJ3MgRGFzaGJvYXJkIFFVbml0IFRlc3QgUnVubmVyPC90aXRs
ZT4KKworICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vRXh0ZXJuYWwvcXVu
aXQtMS4yMC4wLmNzcyI+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9T
dHlsZXMvTWFpbi5jc3MiPjwvbGluaz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9
Ii4uLy4uL1N0eWxlcy9Qb3BvdmVyLmNzcyI+PC9saW5rPgorICAgIDxsaW5rIHJlbD0ic3R5bGVz
aGVldCIgaHJlZj0iLi4vLi4vU3R5bGVzL1F1ZXVlVmlldy5jc3MiPjwvbGluaz4KKyAgICA8bGlu
ayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL1N0eWxlcy9TdGF0dXNMaW5lVmlldy5jc3Mi
PjwvbGluaz4KKworICAgIDxzY3JpcHQgc3JjPSIuLi9VdGlsaXRpZXMuanMiPjwvc2NyaXB0Pgor
ICAgIDxzY3JpcHQgc3JjPSIuLi9CYXNlT2JqZWN0LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0
IHNyYz0iLi4vRGFzaGJvYXJkLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVp
bGRib3QuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWd6aWxsYS5qcyI+PC9z
Y3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1YmJsZVF1ZXVlU2VydmVyLmpzIj48L3Njcmlw
dD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vV2ViS2l0QnVpbGRib3QuanMiPjwvc2NyaXB0PgorICAg
IDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdFF1ZXVlLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0
IHNyYz0iLi4vQnViYmxlUXVldWUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9C
dWlsZGJvdEl0ZXJhdGlvbi5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxk
Ym90VGVzdFJlc3VsdHMuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9HZW9tZXRy
eS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1BvcG92ZXIuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSIuLi9Qb3BvdmVyVHJhY2tlci5qcyI+PC9zY3JpcHQ+CisgICAg
PHNjcmlwdCBzcmM9Ii4uL1F1ZXVlVmlldy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9
Ii4uL0J1aWxkYm90UXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4v
QnVpbGRib3RCdWlsZGVyUXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0i
Li4vQnVpbGRib3RUZXN0ZXJRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3Jj
PSIuLi9CdWlsZGJvdENvbWJpbmVkUXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0
IHNyYz0iLi4vQnVpbGRib3RQZXJmb3JtYW5jZVF1ZXVlVmlldy5qcyI+PC9zY3JpcHQ+CisgICAg
PHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90TGVha3NRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAg
IDxzY3JpcHQgc3JjPSIuLi9CdWJibGVRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3Jp
cHQgc3JjPSIuLi9TdGF0dXNMaW5lVmlldy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9
Ii4uL1NldHRpbmdzLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vVHJhYy5qcyI+
PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uLy4uL0V4dGVybmFsL3F1bml0LTEuMjAuMC5q
cyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ik1vY2tPdmVycmlkZXMuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSJNb2NrVHJhYy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9Ik1vY2tCdWlsZGJvdFF1ZXVlLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iTW9j
a0J1aWxkYm90UXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0idGVzdHMu
anMiPjwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8ZGl2IGlkPSJxdW5pdCI+PC9k
aXY+CisgICAgPGRpdiBpZD0icXVuaXQtZml4dHVyZSI+PC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+
ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2
ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Nj
cmlwdHMvdGVzdHMvdGVzdHMuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJr
aXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5q
cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5iNTQ1OTIxNzk0ODU1NmQxYWZjYTk0YTE1MmJjN2VlMWE3NmQwZDAyCi0t
LSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanMKQEAg
LTAsMCArMSwzNiBAQAorUVVuaXQudGVzdCgiVHJhYyBUZXN0IiwgZnVuY3Rpb24oIGFzc2VydCAp
Cit7CisgICAgdCA9IG5ldyBNb2NrVHJhYygpOworICAgIGFzc2VydC5lcXVhbCh0Ll9wYXJzZVJl
dmlzaW9uRnJvbVVSTCgiaHR0cHM6Ly90cmFjLndlYmtpdC5vcmcvY2hhbmdlc2V0LzE5MDQ5NyIp
LCAiMTkwNDk3IiwgInRlc3QgX3BhcnNlUmV2aXNpb25Gcm9tVVJMIFNWTiIpOworICAgIGFzc2Vy
dC5lcXVhbCh0Ll9wYXJzZVJldmlzaW9uRnJvbVVSTCgiaHR0cDovL3RyYWMuZm9vYmFyLmNvbS9y
ZXBvc2l0b3J5L2NoYW5nZXNldC83NTM4OC9wcm9qZWN0IiksICI3NTM4OCIsICJ0ZXN0IF9wYXJz
ZVJldmlzaW9uRnJvbVVSTCBTVk4gd2l0aCBzdWZmaXgiKTsKKyAgICBhc3NlcnQuZXF1YWwodC5f
cGFyc2VSZXZpc2lvbkZyb21VUkwoImh0dHBzOi8vZ2l0LmZvb2Jhci5jb20vdHJhYy9XaGF0ZXZl
ci5naXQvY2hhbmdlc2V0LzBlNDk4ZGI1ZDhlNWI1YTM0MjYzMSIpLCAiMGU0OThkYjVkOGU1YjVh
MzQyNjMxIiwgInRlc3QgX3BhcnNlUmV2aXNpb25Gcm9tVVJMIEdpdCIpOworICAgIGFzc2VydC5l
cXVhbCh0Lm5leHRSZXZpc2lvbigidHJ1bmsiLCAzMzAyMCksIDMzMDIyLCAidGVzdCBuZXh0Q29t
bWl0Iik7CisgICAgYXNzZXJ0LmVxdWFsKHQuY29tcGFyZVJldmlzaW9ucygzMzAyMCwgMzMwMjIp
LCAtMiwgInRlc3QgY29tcGFyZVJldmlzaW9ucyBsZXNzIHRoYW4iKTsKKyAgICBhc3NlcnQuZXF1
YWwodC5jb21wYXJlUmV2aXNpb25zKDMzMDIyLCAzMzAyMCksIDIsICJ0ZXN0IGNvbXBhcmVSZXZp
c2lvbnMgZ3JlYXRlciB0aGFuIik7CisgICAgYXNzZXJ0LmVxdWFsKHQuY29tcGFyZVJldmlzaW9u
cygzMzAyMiwgMzMwMjIpLCAwLCAidGVzdCBjb21wYXJlUmV2aXNpb25zIGVxdWFsIik7CisgICAg
YXNzZXJ0LmVxdWFsKHQucmVjb3JkZWRDb21taXRzLm9iamVjdEluZGV4T2YoMzMwMjIsICJyZXZp
c2lvbk51bWJlciIpLCA0LCAib2JqZWN0SW5kZXhPZiIpOworfSk7CisKK3ZhciBzZXR0aW5ncyA9
IG5ldyBTZXR0aW5nczsKK1FVbml0LnRlc3QoIkJ1aWxkQm90UXVldWUgVGVzdCIsIGZ1bmN0aW9u
KCBhc3NlcnQgKQoreworICAgIHRyYWMgPSBuZXcgTW9ja1RyYWMoKTsKKyAgICBhc3NlcnQub2so
dHJhYywgInRyYWMgaXMgbm90IG51bGwiKTsKKworICAgIHZhciBxdWV1ZSA9IG5ldyBNb2NrQnVp
bGRib3RRdWV1ZSgpOworICAgIHF1ZXVlLmJyYW5jaGVzID0gW3sKKyAgICAgICAgbmFtZTogInRy
dW5rIiwKKyAgICAgICAgcmVwb3NpdG9yeTogeworICAgICAgICAgICAgbmFtZTogIldlYmtpdCBS
ZXBvIiwKKyAgICAgICAgICAgIHRyYWM6IHRyYWMKKyAgICAgICAgfQorICAgIH1dCisgICAgYXNz
ZXJ0Lm9rKHF1ZXVlLCAicXVldWUgaXMgbm90IG51bGwiKTsKKworICAgIHZhciB2aWV3ID0gbmV3
IE1vY2tCdWlsZGJvdFF1ZXVlVmlldyhbcXVldWVdKTsKKyAgICBhc3NlcnQub2sodmlldywgInZp
ZXcgaXMgbm90IG51bGwiKTsKKworICAgIHZpZXcuX2FwcGVuZFBlbmRpbmdSZXZpc2lvbkNvdW50
KHF1ZXVlKTsKKyAgICB2YXIgcmV2aXNpb25zQmVoaW5kID0gdmlldy5lbGVtZW50LmdldEVsZW1l
bnRzQnlDbGFzc05hbWUoIm1lc3NhZ2UiKVswXS5pbm5lckhUTUwubWF0Y2goLy4qKFxkKykgcmV2
aXNpb24ofHMpIGJlaGluZC8pWzFdOworICAgIGFzc2VydC5lcXVhbChyZXZpc2lvbnNCZWhpbmQs
IDEsICJhc3NlcnQgcmV2aXNpb25zIGJlaGluZCIpOworfSk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268424</attachid>
            <date>2016-01-06 17:15:47 -0800</date>
            <delta_ts>2016-01-08 11:59:22 -0800</delta_ts>
            <desc>1. Adding QUnit for unit testing.</desc>
            <filename>bug-152345-20160106171515.patch</filename>
            <type>text/plain</type>
            <size>130195</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0Njc4CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggNTYwMzU3NjI1OTEyZmM5YWYxNDAzYTdmM2U3NWYyMThh
ODFkY2M5Mi4uYzZkOTQzODZhNTZjN2NkNDQ1NDA5ZjA5NGYzYmVhMzIwNmVmNzE3MCAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE4
NiBAQAorMjAxNi0wMS0wNiAgSmFzb24gTWFyY2VsbCAgPGptYXJjZWxsQGFwcGxlLmNvbT4KKwor
ICAgICAgICBBZGRpbmcgUVVuaXQgZm9yIHVuaXQgdGVzdGluZy4KKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjM0NQorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0LTEu
MjAuMC5jc3M6IEFkZGVkLgorICAgICAgICAoI3F1bml0LXRlc3RzLCAjcXVuaXQtaGVhZGVyLCAj
cXVuaXQtYmFubmVyLCAjcXVuaXQtdGVzdHJ1bm5lci10b29sYmFyLCAjcXVuaXQtZmlsdGVyZWRU
ZXN0LCAjcXVuaXQtdXNlckFnZW50LCAjcXVuaXQtdGVzdHJlc3VsdCk6CisgICAgICAgICgjcXVu
aXQtdGVzdHJ1bm5lci10b29sYmFyLCAjcXVuaXQtZmlsdGVyZWRUZXN0LCAjcXVuaXQtdXNlckFn
ZW50LCAjcXVuaXQtdGVzdHJlc3VsdCwgI3F1bml0LXRlc3RzIGxpKToKKyAgICAgICAgKCNxdW5p
dC10ZXN0cyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMsICNxdW5pdC1oZWFkZXIsICNxdW5pdC1i
YW5uZXIsICNxdW5pdC1maWx0ZXJlZFRlc3QsICNxdW5pdC11c2VyQWdlbnQsICNxdW5pdC10ZXN0
cmVzdWx0LCAjcXVuaXQtbW9kdWxlZmlsdGVyKToKKyAgICAgICAgKCNxdW5pdC1oZWFkZXIpOgor
ICAgICAgICAoI3F1bml0LWhlYWRlciBhKToKKyAgICAgICAgKCNxdW5pdC1oZWFkZXIgYTpmb2N1
cyk6CisgICAgICAgICgjcXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIGxhYmVsKToKKyAgICAgICAg
KCNxdW5pdC1iYW5uZXIpOgorICAgICAgICAoI3F1bml0LXRlc3RydW5uZXItdG9vbGJhcik6Cisg
ICAgICAgICgjcXVuaXQtZmlsdGVyZWRUZXN0KToKKyAgICAgICAgKCNxdW5pdC11c2VyQWdlbnQp
OgorICAgICAgICAoI3F1bml0LW1vZHVsZWZpbHRlci1jb250YWluZXIpOgorICAgICAgICAoLnF1
bml0LXVybC1jb25maWcpOgorICAgICAgICAoLnF1bml0LWZpbHRlcik6CisgICAgICAgICgjcXVu
aXQtdGVzdHMgbGkpOgorICAgICAgICAoI3F1bml0LXRlc3RzID4gbGkpOgorICAgICAgICAoI3F1
bml0LXRlc3RzIGxpLnNraXBwZWQpOgorICAgICAgICAoI3F1bml0LXRlc3RzLmhpZGVwYXNzIGxp
LnBhc3MpOgorICAgICAgICAoI3F1bml0LXRlc3RzIGxpIHN0cm9uZyk6CisgICAgICAgICgjcXVu
aXQtdGVzdHMgbGkuc2tpcHBlZCBzdHJvbmcpOgorICAgICAgICAoI3F1bml0LXRlc3RzIGxpIGEp
OgorICAgICAgICAoI3F1bml0LXRlc3RzIGxpIHAgYSk6CisgICAgICAgICgjcXVuaXQtdGVzdHMg
bGkgYTpmb2N1cyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgLnJ1bnRpbWUpOgorICAgICAg
ICAoLnF1bml0LWFzc2VydC1saXN0KToKKyAgICAgICAgKC5xdW5pdC1zb3VyY2UpOgorICAgICAg
ICAoLnF1bml0LWNvbGxhcHNlZCk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgdGFibGUpOgorICAg
ICAgICAoI3F1bml0LXRlc3RzIHRoKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyB0ZCk6CisgICAg
ICAgICgjcXVuaXQtdGVzdHMgcHJlKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBkZWwpOgorICAg
ICAgICAoI3F1bml0LXRlc3RzIGlucyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgYi5jb3VudHMp
OgorICAgICAgICAoI3F1bml0LXRlc3RzIGIucGFzc2VkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0
cyBiLmZhaWxlZCk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgbGkpOgorICAgICAgICAoI3F1
bml0LXRlc3RzIGxpIGxpLnBhc3MpOgorICAgICAgICAoI3F1bml0LXRlc3RzIC5wYXNzKToKKyAg
ICAgICAgKCNxdW5pdC10ZXN0cyAucGFzcyAudGVzdC1uYW1lKToKKyAgICAgICAgKCNxdW5pdC10
ZXN0cyAucGFzcyAudGVzdC1leHBlY3RlZCk6CisgICAgICAgICgjcXVuaXQtYmFubmVyLnF1bml0
LXBhc3MpOgorICAgICAgICAoI3F1bml0LXRlc3RzIGxpIGxpLmZhaWwpOgorICAgICAgICAoI3F1
bml0LXRlc3RzID4gbGk6bGFzdC1jaGlsZCk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgLmZhaWwp
OgorICAgICAgICAoI3F1bml0LXRlc3RzIC5mYWlsIC5tb2R1bGUtbmFtZSk6CisgICAgICAgICgj
cXVuaXQtdGVzdHMgLmZhaWwgLnRlc3QtYWN0dWFsKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyAu
ZmFpbCAudGVzdC1leHBlY3RlZCk6CisgICAgICAgICgjcXVuaXQtYmFubmVyLnF1bml0LWZhaWwp
OgorICAgICAgICAoI3F1bml0LXRlc3RzIC5za2lwcGVkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0
cyAucXVuaXQtc2tpcHBlZC1sYWJlbCk6CisgICAgICAgICgjcXVuaXQtdGVzdHJlc3VsdCk6Cisg
ICAgICAgICgjcXVuaXQtdGVzdHJlc3VsdCAubW9kdWxlLW5hbWUpOgorICAgICAgICAoI3F1bml0
LWZpeHR1cmUpOgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuanM6IEFk
ZGVkLgorICAgICAgICAobm93LkRhdGUubm93KToKKyAgICAgICAgKGRlZmluZWQuc2Vzc2lvblN0
b3JhZ2UpOgorICAgICAgICAoZGlmZik6CisgICAgICAgIChpbkFycmF5KToKKyAgICAgICAgKG9i
amVjdFZhbHVlcyk6CisgICAgICAgIChleHRlbmQpOgorICAgICAgICAob2JqZWN0VHlwZSk6Cisg
ICAgICAgIChpcyk6CisgICAgICAgIChnZXRVcmxQYXJhbXMpOgorICAgICAgICAoZXh0cmFjdFN0
YWNrdHJhY2UpOgorICAgICAgICAoc291cmNlRnJvbVN0YWNrdHJhY2UpOgorICAgICAgICAodXJs
UGFyYW1zLmRlZmluZWQuZG9jdW1lbnQuZ2V0VXJsUGFyYW1zKToKKyAgICAgICAgKHJlZ2lzdGVy
TG9nZ2luZ0NhbGxiYWNrcy5yZWdpc3RlckxvZ2dpbmdDYWxsYmFjay5sb2dnaW5nQ2FsbGJhY2sp
OgorICAgICAgICAocmVnaXN0ZXJMb2dnaW5nQ2FsbGJhY2tzLnJlZ2lzdGVyTG9nZ2luZ0NhbGxi
YWNrKToKKyAgICAgICAgKHJ1bkxvZ2dpbmdDYWxsYmFja3MpOgorICAgICAgICAodmVyaWZ5TG9n
Z2luZ0NhbGxiYWNrcyk6CisgICAgICAgICh3aW5kb3cub25lcnJvcik6CisgICAgICAgIChjcmVh
dGVNb2R1bGUpOgorICAgICAgICAoc2V0Q3VycmVudE1vZHVsZSk6CisgICAgICAgIChtb2R1bGUp
OgorICAgICAgICAoc3RhcnQpOgorICAgICAgICAoc3RvcCk6CisgICAgICAgIChsb2FkKToKKyAg
ICAgICAgKHN0YWNrKToKKyAgICAgICAgKGJlZ2luKToKKyAgICAgICAgKHByb2Nlc3MubmV4dCk6
CisgICAgICAgIChwcm9jZXNzKToKKyAgICAgICAgKHBhdXNlUHJvY2Vzc2luZyk6CisgICAgICAg
IChkb25lKToKKyAgICAgICAgKFRlc3QudGhpcy5jYWxsYmFjayk6CisgICAgICAgIChUZXN0KToK
KyAgICAgICAgKFRlc3QucHJvdG90eXBlLmJlZm9yZSk6CisgICAgICAgIChUZXN0LnByb3RvdHlw
ZS5ydW5UZXN0KToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnJ1bik6CisgICAgICAgIChUZXN0
LnByb3RvdHlwZS5hZnRlcik6CisgICAgICAgIChUZXN0LnByb3RvdHlwZS5yZXR1cm4ucnVuSG9v
ay5jYWxsSG9vayk6CisgICAgICAgIChUZXN0LnByb3RvdHlwZS5yZXR1cm4ucnVuSG9vayk6Cisg
ICAgICAgIChUZXN0LnByb3RvdHlwZS5xdWV1ZUhvb2spOgorICAgICAgICAoVGVzdC5wcm90b3R5
cGUuKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLmhvb2tzKToKKyAgICAgICAgKFRlc3QucHJv
dG90eXBlLmZpbmlzaCk6CisgICAgICAgIChUZXN0LnByb3RvdHlwZS5xdWV1ZSk6CisgICAgICAg
IChUZXN0LnByb3RvdHlwZS5wdXNoKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnB1c2hGYWls
dXJlKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnJlc29sdmVQcm9taXNlKToKKyAgICAgICAg
KFRlc3QucHJvdG90eXBlLnRlc3RJbk1vZHVsZUNoYWluKToKKyAgICAgICAgKFRlc3QucHJvdG90
eXBlLnZhbGlkKToKKyAgICAgICAgKFFVbml0LnJlc2V0KToKKyAgICAgICAgKFFVbml0LnB1c2hG
YWlsdXJlKToKKyAgICAgICAgKGdlbmVyYXRlSGFzaCk6CisgICAgICAgIChzeW5jaHJvbml6ZSk6
CisgICAgICAgIChwcmlvcml0eUZpbGwpOgorICAgICAgICAoc2F2ZUdsb2JhbCk6CisgICAgICAg
IChjaGVja1BvbGx1dGlvbik6CisgICAgICAgIChhc3luY1Rlc3QpOgorICAgICAgICAodGVzdCk6
CisgICAgICAgIChza2lwKToKKyAgICAgICAgKG9ubHkpOgorICAgICAgICAoQXNzZXJ0KToKKyAg
ICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLmV4cGVjdCk6CisgICAgICAgIChR
VW5pdC5hc3NlcnQuQXNzZXJ0LnByb3RvdHlwZS5yZXR1cm4uZG9uZSk6CisgICAgICAgIChRVW5p
dC5hc3NlcnQuQXNzZXJ0LnByb3RvdHlwZS5hc3luYyk6CisgICAgICAgIChRVW5pdC5hc3NlcnQu
QXNzZXJ0LnByb3RvdHlwZS5wdXNoKToKKyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJv
dG90eXBlLm9rKToKKyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLm5vdE9r
KToKKyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLmVxdWFsKToKKyAgICAg
ICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLm5vdEVxdWFsKToKKyAgICAgICAgKFFV
bml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLnByb3BFcXVhbCk6CisgICAgICAgIChRVW5pdC5h
c3NlcnQuQXNzZXJ0LnByb3RvdHlwZS5ub3RQcm9wRXF1YWwpOgorICAgICAgICAoUVVuaXQuYXNz
ZXJ0LkFzc2VydC5wcm90b3R5cGUuZGVlcEVxdWFsKToKKyAgICAgICAgKFFVbml0LmFzc2VydC5B
c3NlcnQucHJvdG90eXBlLm5vdERlZXBFcXVhbCk6CisgICAgICAgIChRVW5pdC5hc3NlcnQuQXNz
ZXJ0LnByb3RvdHlwZS5zdHJpY3RFcXVhbCk6CisgICAgICAgIChRVW5pdC5hc3NlcnQuQXNzZXJ0
LnByb3RvdHlwZS5ub3RTdHJpY3RFcXVhbCk6CisgICAgICAgIChRVW5pdC5hc3NlcnQuQXNzZXJ0
LnByb3RvdHlwZS5zdHJpbmdfYXBwZWFyZWRfaGVyZSk6CisgICAgICAgIChlcnJvclN0cmluZyk6
CisgICAgICAgIChjb21wYXJlQ29uc3RydWN0b3JzKToKKyAgICAgICAgKGNhbGxiYWNrcy5zdHJp
bmdfYXBwZWFyZWRfaGVyZSk6CisgICAgICAgICh0eXBlRXF1aXYpOgorICAgICAgICAoaW5uZXJF
cXVpdik6CisgICAgICAgIChRVW5pdC5lcXVpdik6CisgICAgICAgIChsaXRlcmFsKToKKyAgICAg
ICAgKGpvaW4pOgorICAgICAgICAoYXJyYXkpOgorICAgICAgICAoZHVtcC5wYXJzZSk6CisgICAg
ICAgIChkdW1wLnR5cGVPZik6CisgICAgICAgIChkdW1wLnNlcGFyYXRvcik6CisgICAgICAgIChk
dW1wLmluZGVudCk6CisgICAgICAgIChkdW1wLnVwKToKKyAgICAgICAgKGR1bXAuZG93bik6Cisg
ICAgICAgIChkdW1wLnNldFBhcnNlcik6CisgICAgICAgIChkdW1wLnBhcnNlcnMuZXJyb3IpOgor
ICAgICAgICAoZHVtcC5wYXJzZXJzLnN0cmluZ19hcHBlYXJlZF9oZXJlKToKKyAgICAgICAgKGR1
bXAucGFyc2Vycy5vYmplY3QpOgorICAgICAgICAoZHVtcC5wYXJzZXJzLm5vZGUpOgorICAgICAg
ICAoZHVtcC5wYXJzZXJzLmZ1bmN0aW9uQXJncyk6CisgICAgICAgIChyZU5hbWUpOgorICAgICAg
ICAoUVVuaXQuZHVtcCk6CisgICAgICAgIChkZWZpbmVkLmRvY3VtZW50LmFwcGx5Q3VycmVudCk6
CisgICAgICAgICh0eXBlb2YuZGVmaW5lLnN0cmluZ19hcHBlYXJlZF9oZXJlLmRlZmluZS5hbWQu
ZGVmaW5lKToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5EaWZmTWFpbik6Cisg
ICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNsZWFudXBFZmZpY2llbmN5KToK
KyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmUHJldHR5SHRtbCk6CisgICAg
ICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNvbW1vblByZWZpeCk6CisgICAgICAg
IChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNvbW1vblN1ZmZpeCk6CisgICAgICAgIChE
aWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNvbXB1dGUpOgorICAgICAgICAoZGlmZkhhbGZN
YXRjaEkpOgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZIYWxmTWF0Y2gp
OgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZMaW5lTW9kZSk6CisgICAg
ICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkJpc2VjdCk6CisgICAgICAgIChEaWZm
TWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkJpc2VjdFNwbGl0KToKKyAgICAgICAgKERpZmZNYXRj
aFBhdGNoLnByb3RvdHlwZS5kaWZmQ2xlYW51cFNlbWFudGljKToKKyAgICAgICAgKERpZmZNYXRj
aFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uT3ZlcmxhcCk6CisgICAgICAgIChkaWZmTGluZXNU
b0NoYXJzTXVuZ2UpOgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZMaW5l
c1RvQ2hhcnMpOgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDaGFyc1Rv
TGluZXMpOgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDbGVhbnVwTWVy
Z2UpOgorICAgICAgICAoUVVuaXQuZGlmZik6CisgICAgICAgIChRVW5pdC5pbml0KToKKwogMjAx
Ni0wMS0wNiAgWW91ZW5uIEZhYmxldCAgPHlvdWVubi5mYWJsZXRAY3JmLmNhbm9uLmZyPgogCiAg
ICAgICAgIFB5dGhvbiBTQ00gc2hvdWxkIGJlIGFibGUgdG8gcmV0cmlldmUgdW50cmFja2VkIGZp
bGVzIC0gQWRkIEdJVCBzdXBwb3J0CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9y
dC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwv
cXVuaXQtMS4yMC4wLmNzcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5v
cmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuY3Nz
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmE1OWUyODI0Y2UzMTYzY2FkYzcwNTllMDFhY2UwNWVkNjI2Mzc4OGQKLS0t
IC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3Jn
LWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmNzcwpA
QCAtMCwwICsxLDMwMSBAQAorLyohCisgKiBRVW5pdCAxLjIwLjAKKyAqIGh0dHA6Ly9xdW5pdGpz
LmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRy
aWJ1dG9ycworICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCisgKiBodHRwOi8vanF1
ZXJ5Lm9yZy9saWNlbnNlCisgKgorICogRGF0ZTogMjAxNS0xMC0yN1QxNzo1M1oKKyAqLworCisv
KiogRm9udCBGYW1pbHkgYW5kIFNpemVzICovCisKKyNxdW5pdC10ZXN0cywgI3F1bml0LWhlYWRl
ciwgI3F1bml0LWJhbm5lciwgI3F1bml0LXRlc3RydW5uZXItdG9vbGJhciwgI3F1bml0LWZpbHRl
cmVkVGVzdCwgI3F1bml0LXVzZXJBZ2VudCwgI3F1bml0LXRlc3RyZXN1bHQgeworCWZvbnQtZmFt
aWx5OiAiSGVsdmV0aWNhIE5ldWUgTGlnaHQiLCAiSGVsdmV0aWNhTmV1ZS1MaWdodCIsICJIZWx2
ZXRpY2EgTmV1ZSIsIENhbGlicmksIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7Cit9CisK
KyNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIsICNxdW5pdC1maWx0ZXJlZFRlc3QsICNxdW5pdC11
c2VyQWdlbnQsICNxdW5pdC10ZXN0cmVzdWx0LCAjcXVuaXQtdGVzdHMgbGkgeyBmb250LXNpemU6
IHNtYWxsOyB9CisjcXVuaXQtdGVzdHMgeyBmb250LXNpemU6IHNtYWxsZXI7IH0KKworCisvKiog
UmVzZXRzICovCisKKyNxdW5pdC10ZXN0cywgI3F1bml0LWhlYWRlciwgI3F1bml0LWJhbm5lciwg
I3F1bml0LWZpbHRlcmVkVGVzdCwgI3F1bml0LXVzZXJBZ2VudCwgI3F1bml0LXRlc3RyZXN1bHQs
ICNxdW5pdC1tb2R1bGVmaWx0ZXIgeworCW1hcmdpbjogMDsKKwlwYWRkaW5nOiAwOworfQorCisK
Ky8qKiBIZWFkZXIgKi8KKworI3F1bml0LWhlYWRlciB7CisJcGFkZGluZzogMC41ZW0gMCAwLjVl
bSAxZW07CisKKwljb2xvcjogIzg2OTlBNDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjMEQzMzQ5Owor
CisJZm9udC1zaXplOiAxLjVlbTsKKwlsaW5lLWhlaWdodDogMWVtOworCWZvbnQtd2VpZ2h0OiA0
MDA7CisKKwlib3JkZXItcmFkaXVzOiA1cHggNXB4IDAgMDsKK30KKworI3F1bml0LWhlYWRlciBh
IHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJY29sb3I6ICNDMkNDRDE7Cit9CisKKyNxdW5p
dC1oZWFkZXIgYTpob3ZlciwKKyNxdW5pdC1oZWFkZXIgYTpmb2N1cyB7CisJY29sb3I6ICNGRkY7
Cit9CisKKyNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIgbGFiZWwgeworCWRpc3BsYXk6IGlubGlu
ZS1ibG9jazsKKwlwYWRkaW5nOiAwIDAuNWVtIDAgMC4xZW07Cit9CisKKyNxdW5pdC1iYW5uZXIg
eworCWhlaWdodDogNXB4OworfQorCisjcXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIHsKKwlwYWRk
aW5nOiAwLjVlbSAxZW0gMC41ZW0gMWVtOworCWNvbG9yOiAjNUU3NDBCOworCWJhY2tncm91bmQt
Y29sb3I6ICNFRUU7CisJb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworI3F1bml0LWZpbHRlcmVkVGVz
dCB7CisJcGFkZGluZzogMC41ZW0gMWVtIDAuNWVtIDFlbTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAj
RjRGRjc3OworCWNvbG9yOiAjMzY2MDk3OworfQorCisjcXVuaXQtdXNlckFnZW50IHsKKwlwYWRk
aW5nOiAwLjVlbSAxZW0gMC41ZW0gMWVtOworCWJhY2tncm91bmQtY29sb3I6ICMyQjgxQUY7CisJ
Y29sb3I6ICNGRkY7CisJdGV4dC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC41KSAycHggMnB4IDFw
eDsKK30KKworI3F1bml0LW1vZHVsZWZpbHRlci1jb250YWluZXIgeworCWZsb2F0OiByaWdodDsK
KwlwYWRkaW5nOiAwLjJlbTsKK30KKworLnF1bml0LXVybC1jb25maWcgeworCWRpc3BsYXk6IGlu
bGluZS1ibG9jazsKKwlwYWRkaW5nOiAwLjFlbTsKK30KKworLnF1bml0LWZpbHRlciB7CisJZGlz
cGxheTogYmxvY2s7CisJZmxvYXQ6IHJpZ2h0OworCW1hcmdpbi1sZWZ0OiAxZW07Cit9CisKKy8q
KiBUZXN0czogUGFzcy9GYWlsICovCisKKyNxdW5pdC10ZXN0cyB7CisJbGlzdC1zdHlsZS1wb3Np
dGlvbjogaW5zaWRlOworfQorCisjcXVuaXQtdGVzdHMgbGkgeworCXBhZGRpbmc6IDAuNGVtIDFl
bSAwLjRlbSAxZW07CisJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkY7CisJbGlzdC1zdHls
ZS1wb3NpdGlvbjogaW5zaWRlOworfQorCisjcXVuaXQtdGVzdHMgPiBsaSB7CisJZGlzcGxheTog
bm9uZTsKK30KKworI3F1bml0LXRlc3RzIGxpLnJ1bm5pbmcsCisjcXVuaXQtdGVzdHMgbGkucGFz
cywKKyNxdW5pdC10ZXN0cyBsaS5mYWlsLAorI3F1bml0LXRlc3RzIGxpLnNraXBwZWQgeworCWRp
c3BsYXk6IGxpc3QtaXRlbTsKK30KKworI3F1bml0LXRlc3RzLmhpZGVwYXNzIGxpLnJ1bm5pbmcs
CisjcXVuaXQtdGVzdHMuaGlkZXBhc3MgbGkucGFzcyB7CisJdmlzaWJpbGl0eTogaGlkZGVuOwor
CXBvc2l0aW9uOiBhYnNvbHV0ZTsKKwl3aWR0aDogICAwOworCWhlaWdodDogIDA7CisJcGFkZGlu
ZzogMDsKKwlib3JkZXI6ICAwOworCW1hcmdpbjogIDA7Cit9CisKKyNxdW5pdC10ZXN0cyBsaSBz
dHJvbmcgeworCWN1cnNvcjogcG9pbnRlcjsKK30KKworI3F1bml0LXRlc3RzIGxpLnNraXBwZWQg
c3Ryb25nIHsKKwljdXJzb3I6IGRlZmF1bHQ7Cit9CisKKyNxdW5pdC10ZXN0cyBsaSBhIHsKKwlw
YWRkaW5nOiAwLjVlbTsKKwljb2xvcjogI0MyQ0NEMTsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7
Cit9CisKKyNxdW5pdC10ZXN0cyBsaSBwIGEgeworCXBhZGRpbmc6IDAuMjVlbTsKKwljb2xvcjog
IzZCNjQ2NDsKK30KKyNxdW5pdC10ZXN0cyBsaSBhOmhvdmVyLAorI3F1bml0LXRlc3RzIGxpIGE6
Zm9jdXMgeworCWNvbG9yOiAjMDAwOworfQorCisjcXVuaXQtdGVzdHMgbGkgLnJ1bnRpbWUgewor
CWZsb2F0OiByaWdodDsKKwlmb250LXNpemU6IHNtYWxsZXI7Cit9CisKKy5xdW5pdC1hc3NlcnQt
bGlzdCB7CisJbWFyZ2luLXRvcDogMC41ZW07CisJcGFkZGluZzogMC41ZW07CisKKwliYWNrZ3Jv
dW5kLWNvbG9yOiAjRkZGOworCisJYm9yZGVyLXJhZGl1czogNXB4OworfQorCisucXVuaXQtc291
cmNlIHsKKwltYXJnaW46IDAuNmVtIDAgMC4zZW07Cit9CisKKy5xdW5pdC1jb2xsYXBzZWQgewor
CWRpc3BsYXk6IG5vbmU7Cit9CisKKyNxdW5pdC10ZXN0cyB0YWJsZSB7CisJYm9yZGVyLWNvbGxh
cHNlOiBjb2xsYXBzZTsKKwltYXJnaW4tdG9wOiAwLjJlbTsKK30KKworI3F1bml0LXRlc3RzIHRo
IHsKKwl0ZXh0LWFsaWduOiByaWdodDsKKwl2ZXJ0aWNhbC1hbGlnbjogdG9wOworCXBhZGRpbmc6
IDAgMC41ZW0gMCAwOworfQorCisjcXVuaXQtdGVzdHMgdGQgeworCXZlcnRpY2FsLWFsaWduOiB0
b3A7Cit9CisKKyNxdW5pdC10ZXN0cyBwcmUgeworCW1hcmdpbjogMDsKKwl3aGl0ZS1zcGFjZTog
cHJlLXdyYXA7CisJd29yZC13cmFwOiBicmVhay13b3JkOworfQorCisjcXVuaXQtdGVzdHMgZGVs
IHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRTBGMkJFOworCWNvbG9yOiAjMzc0RTBDOworCXRleHQt
ZGVjb3JhdGlvbjogbm9uZTsKK30KKworI3F1bml0LXRlc3RzIGlucyB7CisJYmFja2dyb3VuZC1j
b2xvcjogI0ZGQ0FDQTsKKwljb2xvcjogIzUwMDsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9
CisKKy8qKiogVGVzdCBDb3VudHMgKi8KKworI3F1bml0LXRlc3RzIGIuY291bnRzICAgICAgICAg
ICAgICAgICAgICAgICB7IGNvbG9yOiAjMDAwOyB9CisjcXVuaXQtdGVzdHMgYi5wYXNzZWQgICAg
ICAgICAgICAgICAgICAgICAgIHsgY29sb3I6ICM1RTc0MEI7IH0KKyNxdW5pdC10ZXN0cyBiLmZh
aWxlZCAgICAgICAgICAgICAgICAgICAgICAgeyBjb2xvcjogIzcxMDkwOTsgfQorCisjcXVuaXQt
dGVzdHMgbGkgbGkgeworCXBhZGRpbmc6IDVweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOwor
CWJvcmRlci1ib3R0b206IG5vbmU7CisJbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5zaWRlOworfQor
CisvKioqIFBhc3NpbmcgU3R5bGVzICovCisKKyNxdW5pdC10ZXN0cyBsaSBsaS5wYXNzIHsKKwlj
b2xvcjogIzNDNTEwQzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOworCWJvcmRlci1sZWZ0OiAx
MHB4IHNvbGlkICNDNkU3NDY7Cit9CisKKyNxdW5pdC10ZXN0cyAucGFzcyAgICAgICAgICAgICAg
ICAgICAgICAgICAgeyBjb2xvcjogIzUyOENFMDsgYmFja2dyb3VuZC1jb2xvcjogI0QyRTBFNjsg
fQorI3F1bml0LXRlc3RzIC5wYXNzIC50ZXN0LW5hbWUgICAgICAgICAgICAgICB7IGNvbG9yOiAj
MzY2MDk3OyB9CisKKyNxdW5pdC10ZXN0cyAucGFzcyAudGVzdC1hY3R1YWwsCisjcXVuaXQtdGVz
dHMgLnBhc3MgLnRlc3QtZXhwZWN0ZWQgICAgICAgICAgIHsgY29sb3I6ICM5OTk7IH0KKworI3F1
bml0LWJhbm5lci5xdW5pdC1wYXNzICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtY29s
b3I6ICNDNkU3NDY7IH0KKworLyoqKiBGYWlsaW5nIFN0eWxlcyAqLworCisjcXVuaXQtdGVzdHMg
bGkgbGkuZmFpbCB7CisJY29sb3I6ICM3MTA5MDk7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsK
Kwlib3JkZXItbGVmdDogMTBweCBzb2xpZCAjRUU1NzU3OworCXdoaXRlLXNwYWNlOiBwcmU7Cit9
CisKKyNxdW5pdC10ZXN0cyA+IGxpOmxhc3QtY2hpbGQgeworCWJvcmRlci1yYWRpdXM6IDAgMCA1
cHggNXB4OworfQorCisjcXVuaXQtdGVzdHMgLmZhaWwgICAgICAgICAgICAgICAgICAgICAgICAg
IHsgY29sb3I6ICMwMDA7IGJhY2tncm91bmQtY29sb3I6ICNFRTU3NTc7IH0KKyNxdW5pdC10ZXN0
cyAuZmFpbCAudGVzdC1uYW1lLAorI3F1bml0LXRlc3RzIC5mYWlsIC5tb2R1bGUtbmFtZSAgICAg
ICAgICAgICB7IGNvbG9yOiAjMDAwOyB9CisKKyNxdW5pdC10ZXN0cyAuZmFpbCAudGVzdC1hY3R1
YWwgICAgICAgICAgICAgeyBjb2xvcjogI0VFNTc1NzsgfQorI3F1bml0LXRlc3RzIC5mYWlsIC50
ZXN0LWV4cGVjdGVkICAgICAgICAgICB7IGNvbG9yOiAjMDA4MDAwOyB9CisKKyNxdW5pdC1iYW5u
ZXIucXVuaXQtZmFpbCAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRUU1
NzU3OyB9CisKKy8qKiogU2tpcHBlZCB0ZXN0cyAqLworCisjcXVuaXQtdGVzdHMgLnNraXBwZWQg
eworCWJhY2tncm91bmQtY29sb3I6ICNFQkVDRTk7Cit9CisKKyNxdW5pdC10ZXN0cyAucXVuaXQt
c2tpcHBlZC1sYWJlbCB7CisJYmFja2dyb3VuZC1jb2xvcjogI0Y0RkY3NzsKKwlkaXNwbGF5OiBp
bmxpbmUtYmxvY2s7CisJZm9udC1zdHlsZTogbm9ybWFsOworCWNvbG9yOiAjMzY2MDk3OworCWxp
bmUtaGVpZ2h0OiAxLjhlbTsKKwlwYWRkaW5nOiAwIDAuNWVtOworCW1hcmdpbjogLTAuNGVtIDAu
NGVtIC0wLjRlbSAwOworfQorCisvKiogUmVzdWx0ICovCisKKyNxdW5pdC10ZXN0cmVzdWx0IHsK
KwlwYWRkaW5nOiAwLjVlbSAxZW0gMC41ZW0gMWVtOworCisJY29sb3I6ICMyQjgxQUY7CisJYmFj
a2dyb3VuZC1jb2xvcjogI0QyRTBFNjsKKworCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZG
OworfQorI3F1bml0LXRlc3RyZXN1bHQgLm1vZHVsZS1uYW1lIHsKKwlmb250LXdlaWdodDogNzAw
OworfQorCisvKiogRml4dHVyZSAqLworCisjcXVuaXQtZml4dHVyZSB7CisJcG9zaXRpb246IGFi
c29sdXRlOworCXRvcDogLTEwMDAwcHg7CisJbGVmdDogLTEwMDAwcHg7CisJd2lkdGg6IDEwMDBw
eDsKKwloZWlnaHQ6IDEwMDBweDsKK30KZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBw
b3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9FeHRlcm5h
bC9xdW5pdC0xLjIwLjAuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQu
b3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmpz
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjkwNDk0M2YwODhlZGZkM2VjYjBlN2NmMmNjNzBiYzRhNTg3NmMzZGEKLS0t
IC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3Jn
LWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmpzCkBA
IC0wLDAgKzEsNDE1OCBAQAorLyohCisgKiBRVW5pdCAxLjIwLjAKKyAqIGh0dHA6Ly9xdW5pdGpz
LmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRy
aWJ1dG9ycworICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCisgKiBodHRwOi8vanF1
ZXJ5Lm9yZy9saWNlbnNlCisgKgorICogRGF0ZTogMjAxNS0xMC0yN1QxNzo1M1oKKyAqLworCiso
ZnVuY3Rpb24oIGdsb2JhbCApIHsKKwordmFyIFFVbml0ID0ge307CisKK3ZhciBEYXRlID0gZ2xv
YmFsLkRhdGU7Cit2YXIgbm93ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKSB7CisJcmV0dXJuIG5l
dyBEYXRlKCkuZ2V0VGltZSgpOworfTsKKwordmFyIHNldFRpbWVvdXQgPSBnbG9iYWwuc2V0VGlt
ZW91dDsKK3ZhciBjbGVhclRpbWVvdXQgPSBnbG9iYWwuY2xlYXJUaW1lb3V0OworCisvLyBTdG9y
ZSBhIGxvY2FsIHdpbmRvdyBmcm9tIHRoZSBnbG9iYWwgdG8gYWxsb3cgZGlyZWN0IHJlZmVyZW5j
ZXMuCit2YXIgd2luZG93ID0gZ2xvYmFsLndpbmRvdzsKKwordmFyIGRlZmluZWQgPSB7CisJZG9j
dW1lbnQ6IHdpbmRvdyAmJiB3aW5kb3cuZG9jdW1lbnQgIT09IHVuZGVmaW5lZCwKKwlzZXRUaW1l
b3V0OiBzZXRUaW1lb3V0ICE9PSB1bmRlZmluZWQsCisJc2Vzc2lvblN0b3JhZ2U6IChmdW5jdGlv
bigpIHsKKwkJdmFyIHggPSAicXVuaXQtdGVzdC1zdHJpbmciOworCQl0cnkgeworCQkJc2Vzc2lv
blN0b3JhZ2Uuc2V0SXRlbSggeCwgeCApOworCQkJc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgg
eCApOworCQkJcmV0dXJuIHRydWU7CisJCX0gY2F0Y2ggKCBlICkgeworCQkJcmV0dXJuIGZhbHNl
OworCQl9CisJfSgpICkKK307CisKK3ZhciBmaWxlTmFtZSA9ICggc291cmNlRnJvbVN0YWNrdHJh
Y2UoIDAgKSB8fCAiIiApLnJlcGxhY2UoIC8oOlxkKykrXCk/LywgIiIgKS5yZXBsYWNlKCAvLitc
Ly8sICIiICk7Cit2YXIgZ2xvYmFsU3RhcnRDYWxsZWQgPSBmYWxzZTsKK3ZhciBydW5TdGFydGVk
ID0gZmFsc2U7CisKK3ZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCisJ
aGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKKworLy8gcmV0dXJucyBh
IG5ldyBBcnJheSB3aXRoIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBpbiBhIGJ1dCBub3QgaW4gYgor
ZnVuY3Rpb24gZGlmZiggYSwgYiApIHsKKwl2YXIgaSwgaiwKKwkJcmVzdWx0ID0gYS5zbGljZSgp
OworCisJZm9yICggaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKysgKSB7CisJCWZvciAoIGog
PSAwOyBqIDwgYi5sZW5ndGg7IGorKyApIHsKKwkJCWlmICggcmVzdWx0WyBpIF0gPT09IGJbIGog
XSApIHsKKwkJCQlyZXN1bHQuc3BsaWNlKCBpLCAxICk7CisJCQkJaS0tOworCQkJCWJyZWFrOwor
CQkJfQorCQl9CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8vIGZyb20ganF1ZXJ5LmpzCitm
dW5jdGlvbiBpbkFycmF5KCBlbGVtLCBhcnJheSApIHsKKwlpZiAoIGFycmF5LmluZGV4T2YgKSB7
CisJCXJldHVybiBhcnJheS5pbmRleE9mKCBlbGVtICk7CisJfQorCisJZm9yICggdmFyIGkgPSAw
LCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJaWYgKCBhcnJh
eVsgaSBdID09PSBlbGVtICkgeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7
Cit9CisKKy8qKgorICogTWFrZXMgYSBjbG9uZSBvZiBhbiBvYmplY3QgdXNpbmcgb25seSBBcnJh
eSBvciBPYmplY3QgYXMgYmFzZSwKKyAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgb3duIGVudW1lcmFi
bGUgcHJvcGVydGllcy4KKyAqCisgKiBAcGFyYW0ge09iamVjdH0gb2JqCisgKiBAcmV0dXJuIHtP
YmplY3R9IE5ldyBvYmplY3Qgd2l0aCBvbmx5IHRoZSBvd24gcHJvcGVydGllcyAocmVjdXJzaXZl
bHkpLgorICovCitmdW5jdGlvbiBvYmplY3RWYWx1ZXMgKCBvYmogKSB7CisJdmFyIGtleSwgdmFs
LAorCQl2YWxzID0gUVVuaXQuaXMoICJhcnJheSIsIG9iaiApID8gW10gOiB7fTsKKwlmb3IgKCBr
ZXkgaW4gb2JqICkgeworCQlpZiAoIGhhc093bi5jYWxsKCBvYmosIGtleSApICkgeworCQkJdmFs
ID0gb2JqWyBrZXkgXTsKKwkJCXZhbHNbIGtleSBdID0gdmFsID09PSBPYmplY3QoIHZhbCApID8g
b2JqZWN0VmFsdWVzKCB2YWwgKSA6IHZhbDsKKwkJfQorCX0KKwlyZXR1cm4gdmFsczsKK30KKwor
ZnVuY3Rpb24gZXh0ZW5kKCBhLCBiLCB1bmRlZk9ubHkgKSB7CisJZm9yICggdmFyIHByb3AgaW4g
YiApIHsKKwkJaWYgKCBoYXNPd24uY2FsbCggYiwgcHJvcCApICkgeworCisJCQkvLyBBdm9pZCAi
TWVtYmVyIG5vdCBmb3VuZCIgZXJyb3IgaW4gSUU4IGNhdXNlZCBieSBtZXNzaW5nIHdpdGggd2lu
ZG93LmNvbnN0cnVjdG9yCisJCQkvLyBUaGlzIGJsb2NrIHJ1bnMgb24gZXZlcnkgZW52aXJvbm1l
bnQsIHNvIGBnbG9iYWxgIGlzIGJlaW5nIHVzZWQgaW5zdGVhZCBvZiBgd2luZG93YAorCQkJLy8g
dG8gYXZvaWQgZXJyb3JzIG9uIG5vZGUuCisJCQlpZiAoIHByb3AgIT09ICJjb25zdHJ1Y3RvciIg
fHwgYSAhPT0gZ2xvYmFsICkgeworCQkJCWlmICggYlsgcHJvcCBdID09PSB1bmRlZmluZWQgKSB7
CisJCQkJCWRlbGV0ZSBhWyBwcm9wIF07CisJCQkJfSBlbHNlIGlmICggISggdW5kZWZPbmx5ICYm
IHR5cGVvZiBhWyBwcm9wIF0gIT09ICJ1bmRlZmluZWQiICkgKSB7CisJCQkJCWFbIHByb3AgXSA9
IGJbIHByb3AgXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYTsKK30KKworZnVu
Y3Rpb24gb2JqZWN0VHlwZSggb2JqICkgeworCWlmICggdHlwZW9mIG9iaiA9PT0gInVuZGVmaW5l
ZCIgKSB7CisJCXJldHVybiAidW5kZWZpbmVkIjsKKwl9CisKKwkvLyBDb25zaWRlcjogdHlwZW9m
IG51bGwgPT09IG9iamVjdAorCWlmICggb2JqID09PSBudWxsICkgeworCQlyZXR1cm4gIm51bGwi
OworCX0KKworCXZhciBtYXRjaCA9IHRvU3RyaW5nLmNhbGwoIG9iaiApLm1hdGNoKCAvXlxbb2Jq
ZWN0XHMoLiopXF0kLyApLAorCQl0eXBlID0gbWF0Y2ggJiYgbWF0Y2hbIDEgXTsKKworCXN3aXRj
aCAoIHR5cGUgKSB7CisJCWNhc2UgIk51bWJlciI6CisJCQlpZiAoIGlzTmFOKCBvYmogKSApIHsK
KwkJCQlyZXR1cm4gIm5hbiI7CisJCQl9CisJCQlyZXR1cm4gIm51bWJlciI7CisJCWNhc2UgIlN0
cmluZyI6CisJCWNhc2UgIkJvb2xlYW4iOgorCQljYXNlICJBcnJheSI6CisJCWNhc2UgIlNldCI6
CisJCWNhc2UgIk1hcCI6CisJCWNhc2UgIkRhdGUiOgorCQljYXNlICJSZWdFeHAiOgorCQljYXNl
ICJGdW5jdGlvbiI6CisJCWNhc2UgIlN5bWJvbCI6CisJCQlyZXR1cm4gdHlwZS50b0xvd2VyQ2Fz
ZSgpOworCX0KKwlpZiAoIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICkgeworCQlyZXR1cm4gIm9i
amVjdCI7CisJfQorfQorCisvLyBTYWZlIG9iamVjdCB0eXBlIGNoZWNraW5nCitmdW5jdGlvbiBp
cyggdHlwZSwgb2JqICkgeworCXJldHVybiBRVW5pdC5vYmplY3RUeXBlKCBvYmogKSA9PT0gdHlw
ZTsKK30KKwordmFyIGdldFVybFBhcmFtcyA9IGZ1bmN0aW9uKCkgeworCXZhciBpLCBjdXJyZW50
OworCXZhciB1cmxQYXJhbXMgPSB7fTsKKwl2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247
CisJdmFyIHBhcmFtcyA9IGxvY2F0aW9uLnNlYXJjaC5zbGljZSggMSApLnNwbGl0KCAiJiIgKTsK
Kwl2YXIgbGVuZ3RoID0gcGFyYW1zLmxlbmd0aDsKKworCWlmICggcGFyYW1zWyAwIF0gKSB7CisJ
CWZvciAoIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQljdXJyZW50ID0gcGFyYW1zWyBp
IF0uc3BsaXQoICI9IiApOworCQkJY3VycmVudFsgMCBdID0gZGVjb2RlVVJJQ29tcG9uZW50KCBj
dXJyZW50WyAwIF0gKTsKKworCQkJLy8gYWxsb3cganVzdCBhIGtleSB0byB0dXJuIG9uIGEgZmxh
ZywgZS5nLiwgdGVzdC5odG1sP25vZ2xvYmFscworCQkJY3VycmVudFsgMSBdID0gY3VycmVudFsg
MSBdID8gZGVjb2RlVVJJQ29tcG9uZW50KCBjdXJyZW50WyAxIF0gKSA6IHRydWU7CisJCQlpZiAo
IHVybFBhcmFtc1sgY3VycmVudFsgMCBdIF0gKSB7CisJCQkJdXJsUGFyYW1zWyBjdXJyZW50WyAw
IF0gXSA9IFtdLmNvbmNhdCggdXJsUGFyYW1zWyBjdXJyZW50WyAwIF0gXSwgY3VycmVudFsgMSBd
ICk7CisJCQl9IGVsc2UgeworCQkJCXVybFBhcmFtc1sgY3VycmVudFsgMCBdIF0gPSBjdXJyZW50
WyAxIF07CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gdXJsUGFyYW1zOworfTsKKworLy8gRG9l
c24ndCBzdXBwb3J0IElFNiB0byBJRTksIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZCBvbiB0aGVz
ZSBicm93c2VycworLy8gU2VlIGFsc28gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4v
SmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IvU3RhY2sKK2Z1bmN0aW9u
IGV4dHJhY3RTdGFja3RyYWNlKCBlLCBvZmZzZXQgKSB7CisJb2Zmc2V0ID0gb2Zmc2V0ID09PSB1
bmRlZmluZWQgPyA0IDogb2Zmc2V0OworCisJdmFyIHN0YWNrLCBpbmNsdWRlLCBpOworCisJaWYg
KCBlLnN0YWNrICkgeworCQlzdGFjayA9IGUuc3RhY2suc3BsaXQoICJcbiIgKTsKKwkJaWYgKCAv
XmVycm9yJC9pLnRlc3QoIHN0YWNrWyAwIF0gKSApIHsKKwkJCXN0YWNrLnNoaWZ0KCk7CisJCX0K
KwkJaWYgKCBmaWxlTmFtZSApIHsKKwkJCWluY2x1ZGUgPSBbXTsKKwkJCWZvciAoIGkgPSBvZmZz
ZXQ7IGkgPCBzdGFjay5sZW5ndGg7IGkrKyApIHsKKwkJCQlpZiAoIHN0YWNrWyBpIF0uaW5kZXhP
ZiggZmlsZU5hbWUgKSAhPT0gLTEgKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpbmNsdWRl
LnB1c2goIHN0YWNrWyBpIF0gKTsKKwkJCX0KKwkJCWlmICggaW5jbHVkZS5sZW5ndGggKSB7CisJ
CQkJcmV0dXJuIGluY2x1ZGUuam9pbiggIlxuIiApOworCQkJfQorCQl9CisJCXJldHVybiBzdGFj
a1sgb2Zmc2V0IF07CisKKwkvLyBTdXBwb3J0OiBTYWZhcmkgPD02IG9ubHkKKwl9IGVsc2UgaWYg
KCBlLnNvdXJjZVVSTCApIHsKKworCQkvLyBleGNsdWRlIHVzZWxlc3Mgc2VsZi1yZWZlcmVuY2Ug
Zm9yIGdlbmVyYXRlZCBFcnJvciBvYmplY3RzCisJCWlmICggL3F1bml0LmpzJC8udGVzdCggZS5z
b3VyY2VVUkwgKSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGZvciBhY3R1YWwgZXhjZXB0
aW9ucywgdGhpcyBpcyB1c2VmdWwKKwkJcmV0dXJuIGUuc291cmNlVVJMICsgIjoiICsgZS5saW5l
OworCX0KK30KKworZnVuY3Rpb24gc291cmNlRnJvbVN0YWNrdHJhY2UoIG9mZnNldCApIHsKKwl2
YXIgZXJyb3IgPSBuZXcgRXJyb3IoKTsKKworCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTcgb25seSwg
SUUgPD0xMCAtIDExIG9ubHkKKwkvLyBOb3QgYWxsIGJyb3dzZXJzIGdlbmVyYXRlIHRoZSBgc3Rh
Y2tgIHByb3BlcnR5IGZvciBgbmV3IEVycm9yKClgLCBzZWUgYWxzbyAjNjM2CisJaWYgKCAhZXJy
b3Iuc3RhY2sgKSB7CisJCXRyeSB7CisJCQl0aHJvdyBlcnJvcjsKKwkJfSBjYXRjaCAoIGVyciAp
IHsKKwkJCWVycm9yID0gZXJyOworCQl9CisJfQorCisJcmV0dXJuIGV4dHJhY3RTdGFja3RyYWNl
KCBlcnJvciwgb2Zmc2V0ICk7Cit9CisKKy8qKgorICogQ29uZmlnIG9iamVjdDogTWFpbnRhaW4g
aW50ZXJuYWwgc3RhdGUKKyAqIExhdGVyIGV4cG9zZWQgYXMgUVVuaXQuY29uZmlnCisgKiBgY29u
ZmlnYCBpbml0aWFsaXplZCBhdCB0b3Agb2Ygc2NvcGUKKyAqLwordmFyIGNvbmZpZyA9IHsKKwkv
LyBUaGUgcXVldWUgb2YgdGVzdHMgdG8gcnVuCisJcXVldWU6IFtdLAorCisJLy8gYmxvY2sgdW50
aWwgZG9jdW1lbnQgcmVhZHkKKwlibG9ja2luZzogdHJ1ZSwKKworCS8vIGJ5IGRlZmF1bHQsIHJ1
biBwcmV2aW91c2x5IGZhaWxlZCB0ZXN0cyBmaXJzdAorCS8vIHZlcnkgdXNlZnVsIGluIGNvbWJp
bmF0aW9uIHdpdGggIkhpZGUgcGFzc2VkIHRlc3RzIiBjaGVja2VkCisJcmVvcmRlcjogdHJ1ZSwK
KworCS8vIGJ5IGRlZmF1bHQsIG1vZGlmeSBkb2N1bWVudC50aXRsZSB3aGVuIHN1aXRlIGlzIGRv
bmUKKwlhbHRlcnRpdGxlOiB0cnVlLAorCisJLy8gSFRNTCBSZXBvcnRlcjogY29sbGFwc2UgZXZl
cnkgdGVzdCBleGNlcHQgdGhlIGZpcnN0IGZhaWxpbmcgdGVzdAorCS8vIElmIGZhbHNlLCBhbGwg
ZmFpbGluZyB0ZXN0cyB3aWxsIGJlIGV4cGFuZGVkCisJY29sbGFwc2U6IHRydWUsCisKKwkvLyBi
eSBkZWZhdWx0LCBzY3JvbGwgdG8gdG9wIG9mIHRoZSBwYWdlIHdoZW4gc3VpdGUgaXMgZG9uZQor
CXNjcm9sbHRvcDogdHJ1ZSwKKworCS8vIGRlcHRoIHVwLXRvIHdoaWNoIG9iamVjdCB3aWxsIGJl
IGR1bXBlZAorCW1heERlcHRoOiA1LAorCisJLy8gd2hlbiBlbmFibGVkLCBhbGwgdGVzdHMgbXVz
dCBjYWxsIGV4cGVjdCgpCisJcmVxdWlyZUV4cGVjdHM6IGZhbHNlLAorCisJLy8gYWRkIGNoZWNr
Ym94ZXMgdGhhdCBhcmUgcGVyc2lzdGVkIGluIHRoZSBxdWVyeS1zdHJpbmcKKwkvLyB3aGVuIGVu
YWJsZWQsIHRoZSBpZCBpcyBzZXQgdG8gYHRydWVgIGFzIGEgYFFVbml0LmNvbmZpZ2AgcHJvcGVy
dHkKKwl1cmxDb25maWc6IFsKKwkJeworCQkJaWQ6ICJoaWRlcGFzc2VkIiwKKwkJCWxhYmVsOiAi
SGlkZSBwYXNzZWQgdGVzdHMiLAorCQkJdG9vbHRpcDogIk9ubHkgc2hvdyB0ZXN0cyBhbmQgYXNz
ZXJ0aW9ucyB0aGF0IGZhaWwuIFN0b3JlZCBhcyBxdWVyeS1zdHJpbmdzLiIKKwkJfSwKKwkJewor
CQkJaWQ6ICJub2dsb2JhbHMiLAorCQkJbGFiZWw6ICJDaGVjayBmb3IgR2xvYmFscyIsCisJCQl0
b29sdGlwOiAiRW5hYmxpbmcgdGhpcyB3aWxsIHRlc3QgaWYgYW55IHRlc3QgaW50cm9kdWNlcyBu
ZXcgcHJvcGVydGllcyBvbiB0aGUgIiArCisJCQkJImdsb2JhbCBvYmplY3QgKGB3aW5kb3dgIGlu
IEJyb3dzZXJzKS4gU3RvcmVkIGFzIHF1ZXJ5LXN0cmluZ3MuIgorCQl9LAorCQl7CisJCQlpZDog
Im5vdHJ5Y2F0Y2giLAorCQkJbGFiZWw6ICJObyB0cnktY2F0Y2giLAorCQkJdG9vbHRpcDogIkVu
YWJsaW5nIHRoaXMgd2lsbCBydW4gdGVzdHMgb3V0c2lkZSBvZiBhIHRyeS1jYXRjaCBibG9jay4g
TWFrZXMgZGVidWdnaW5nICIgKworCQkJCSJleGNlcHRpb25zIGluIElFIHJlYXNvbmFibGUuIFN0
b3JlZCBhcyBxdWVyeS1zdHJpbmdzLiIKKwkJfQorCV0sCisKKwkvLyBTZXQgb2YgYWxsIG1vZHVs
ZXMuCisJbW9kdWxlczogW10sCisKKwkvLyBTdGFjayBvZiBuZXN0ZWQgbW9kdWxlcworCW1vZHVs
ZVN0YWNrOiBbXSwKKworCS8vIFRoZSBmaXJzdCB1bm5hbWVkIG1vZHVsZQorCWN1cnJlbnRNb2R1
bGU6IHsKKwkJbmFtZTogIiIsCisJCXRlc3RzOiBbXQorCX0sCisKKwljYWxsYmFja3M6IHt9Cit9
OworCit2YXIgdXJsUGFyYW1zID0gZGVmaW5lZC5kb2N1bWVudCA/IGdldFVybFBhcmFtcygpIDog
e307CisKKy8vIFB1c2ggYSBsb29zZSB1bm5hbWVkIG1vZHVsZSB0byB0aGUgbW9kdWxlcyBjb2xs
ZWN0aW9uCitjb25maWcubW9kdWxlcy5wdXNoKCBjb25maWcuY3VycmVudE1vZHVsZSApOworCitp
ZiAoIHVybFBhcmFtcy5maWx0ZXIgPT09IHRydWUgKSB7CisJZGVsZXRlIHVybFBhcmFtcy5maWx0
ZXI7Cit9CisKKy8vIFN0cmluZyBzZWFyY2ggYW55d2hlcmUgaW4gbW9kdWxlTmFtZSt0ZXN0TmFt
ZQorY29uZmlnLmZpbHRlciA9IHVybFBhcmFtcy5maWx0ZXI7CisKK2NvbmZpZy50ZXN0SWQgPSBb
XTsKK2lmICggdXJsUGFyYW1zLnRlc3RJZCApIHsKKwkvLyBFbnN1cmUgdGhhdCB1cmxQYXJhbXMu
dGVzdElkIGlzIGFuIGFycmF5CisJdXJsUGFyYW1zLnRlc3RJZCA9IGRlY29kZVVSSUNvbXBvbmVu
dCggdXJsUGFyYW1zLnRlc3RJZCApLnNwbGl0KCAiLCIgKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8
IHVybFBhcmFtcy50ZXN0SWQubGVuZ3RoOyBpKysgKSB7CisJCWNvbmZpZy50ZXN0SWQucHVzaCgg
dXJsUGFyYW1zLnRlc3RJZFsgaSBdICk7CisJfQorfQorCit2YXIgbG9nZ2luZ0NhbGxiYWNrcyA9
IHt9OworCisvLyBSZWdpc3RlciBsb2dnaW5nIGNhbGxiYWNrcworZnVuY3Rpb24gcmVnaXN0ZXJM
b2dnaW5nQ2FsbGJhY2tzKCBvYmogKSB7CisJdmFyIGksIGwsIGtleSwKKwkJY2FsbGJhY2tOYW1l
cyA9IFsgImJlZ2luIiwgImRvbmUiLCAibG9nIiwgInRlc3RTdGFydCIsICJ0ZXN0RG9uZSIsCisJ
CQkibW9kdWxlU3RhcnQiLCAibW9kdWxlRG9uZSIgXTsKKworCWZ1bmN0aW9uIHJlZ2lzdGVyTG9n
Z2luZ0NhbGxiYWNrKCBrZXkgKSB7CisJCXZhciBsb2dnaW5nQ2FsbGJhY2sgPSBmdW5jdGlvbigg
Y2FsbGJhY2sgKSB7CisJCQlpZiAoIG9iamVjdFR5cGUoIGNhbGxiYWNrICkgIT09ICJmdW5jdGlv
biIgKSB7CisJCQkJdGhyb3cgbmV3IEVycm9yKAorCQkJCQkiUVVuaXQgbG9nZ2luZyBtZXRob2Rz
IHJlcXVpcmUgYSBjYWxsYmFjayBmdW5jdGlvbiBhcyB0aGVpciBmaXJzdCBwYXJhbWV0ZXJzLiIK
KwkJCQkpOworCQkJfQorCisJCQljb25maWcuY2FsbGJhY2tzWyBrZXkgXS5wdXNoKCBjYWxsYmFj
ayApOworCQl9OworCisJCS8vIERFUFJFQ0FURUQ6IFRoaXMgd2lsbCBiZSByZW1vdmVkIG9uIFFV
bml0IDIuMC4wKworCQkvLyBTdG9yZXMgdGhlIHJlZ2lzdGVyZWQgZnVuY3Rpb25zIGFsbG93aW5n
IHJlc3RvcmluZworCQkvLyBhdCB2ZXJpZnlMb2dnaW5nQ2FsbGJhY2tzKCkgaWYgbW9kaWZpZWQK
KwkJbG9nZ2luZ0NhbGxiYWNrc1sga2V5IF0gPSBsb2dnaW5nQ2FsbGJhY2s7CisKKwkJcmV0dXJu
IGxvZ2dpbmdDYWxsYmFjazsKKwl9CisKKwlmb3IgKCBpID0gMCwgbCA9IGNhbGxiYWNrTmFtZXMu
bGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQlrZXkgPSBjYWxsYmFja05hbWVzWyBpIF07CisKKwkJ
Ly8gSW5pdGlhbGl6ZSBrZXkgY29sbGVjdGlvbiBvZiBsb2dnaW5nIGNhbGxiYWNrCisJCWlmICgg
b2JqZWN0VHlwZSggY29uZmlnLmNhbGxiYWNrc1sga2V5IF0gKSA9PT0gInVuZGVmaW5lZCIgKSB7
CisJCQljb25maWcuY2FsbGJhY2tzWyBrZXkgXSA9IFtdOworCQl9CisKKwkJb2JqWyBrZXkgXSA9
IHJlZ2lzdGVyTG9nZ2luZ0NhbGxiYWNrKCBrZXkgKTsKKwl9Cit9CisKK2Z1bmN0aW9uIHJ1bkxv
Z2dpbmdDYWxsYmFja3MoIGtleSwgYXJncyApIHsKKwl2YXIgaSwgbCwgY2FsbGJhY2tzOworCisJ
Y2FsbGJhY2tzID0gY29uZmlnLmNhbGxiYWNrc1sga2V5IF07CisJZm9yICggaSA9IDAsIGwgPSBj
YWxsYmFja3MubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQljYWxsYmFja3NbIGkgXSggYXJncyAp
OworCX0KK30KKworLy8gREVQUkVDQVRFRDogVGhpcyB3aWxsIGJlIHJlbW92ZWQgb24gMi4wLjAr
CisvLyBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIGlmIHRoZSBsb2dnaW5nQ2FsbGJhY2tzIHdlcmUg
bW9kaWZpZWQgYnkgdGhlIHVzZXIKKy8vIElmIHNvLCBpdCB3aWxsIHJlc3RvcmUgaXQsIGFzc2ln
biB0aGUgZ2l2ZW4gY2FsbGJhY2sgYW5kIHByaW50IGEgY29uc29sZSB3YXJuaW5nCitmdW5jdGlv
biB2ZXJpZnlMb2dnaW5nQ2FsbGJhY2tzKCkgeworCXZhciBsb2dnaW5nQ2FsbGJhY2ssIHVzZXJD
YWxsYmFjazsKKworCWZvciAoIGxvZ2dpbmdDYWxsYmFjayBpbiBsb2dnaW5nQ2FsbGJhY2tzICkg
eworCQlpZiAoIFFVbml0WyBsb2dnaW5nQ2FsbGJhY2sgXSAhPT0gbG9nZ2luZ0NhbGxiYWNrc1sg
bG9nZ2luZ0NhbGxiYWNrIF0gKSB7CisKKwkJCXVzZXJDYWxsYmFjayA9IFFVbml0WyBsb2dnaW5n
Q2FsbGJhY2sgXTsKKworCQkJLy8gUmVzdG9yZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKwkJCVFV
bml0WyBsb2dnaW5nQ2FsbGJhY2sgXSA9IGxvZ2dpbmdDYWxsYmFja3NbIGxvZ2dpbmdDYWxsYmFj
ayBdOworCisJCQkvLyBBc3NpZ24gdGhlIGRlcHJlY2F0ZWQgZ2l2ZW4gY2FsbGJhY2sKKwkJCVFV
bml0WyBsb2dnaW5nQ2FsbGJhY2sgXSggdXNlckNhbGxiYWNrICk7CisKKwkJCWlmICggZ2xvYmFs
LmNvbnNvbGUgJiYgZ2xvYmFsLmNvbnNvbGUud2FybiApIHsKKwkJCQlnbG9iYWwuY29uc29sZS53
YXJuKAorCQkJCQkiUVVuaXQuIiArIGxvZ2dpbmdDYWxsYmFjayArICIgd2FzIHJlcGxhY2VkIHdp
dGggYSBuZXcgdmFsdWUuXG4iICsKKwkJCQkJIlBsZWFzZSwgY2hlY2sgb3V0IHRoZSBkb2N1bWVu
dGF0aW9uIG9uIGhvdyB0byBhcHBseSBsb2dnaW5nIGNhbGxiYWNrcy5cbiIgKworCQkJCQkiUmVm
ZXJlbmNlOiBodHRwOi8vYXBpLnF1bml0anMuY29tL2NhdGVnb3J5L2NhbGxiYWNrcy8iCisJCQkJ
KTsKKwkJCX0KKwkJfQorCX0KK30KKworKCBmdW5jdGlvbigpIHsKKwlpZiAoICFkZWZpbmVkLmRv
Y3VtZW50ICkgeworCQlyZXR1cm47CisJfQorCisJLy8gYG9uRXJyb3JGblByZXZgIGluaXRpYWxp
emVkIGF0IHRvcCBvZiBzY29wZQorCS8vIFByZXNlcnZlIG90aGVyIGhhbmRsZXJzCisJdmFyIG9u
RXJyb3JGblByZXYgPSB3aW5kb3cub25lcnJvcjsKKworCS8vIENvdmVyIHVuY2F1Z2h0IGV4Y2Vw
dGlvbnMKKwkvLyBSZXR1cm5pbmcgdHJ1ZSB3aWxsIHN1cHByZXNzIHRoZSBkZWZhdWx0IGJyb3dz
ZXIgaGFuZGxlciwKKwkvLyByZXR1cm5pbmcgZmFsc2Ugd2lsbCBsZXQgaXQgcnVuLgorCXdpbmRv
dy5vbmVycm9yID0gZnVuY3Rpb24oIGVycm9yLCBmaWxlUGF0aCwgbGluZXJOciApIHsKKwkJdmFy
IHJldCA9IGZhbHNlOworCQlpZiAoIG9uRXJyb3JGblByZXYgKSB7CisJCQlyZXQgPSBvbkVycm9y
Rm5QcmV2KCBlcnJvciwgZmlsZVBhdGgsIGxpbmVyTnIgKTsKKwkJfQorCisJCS8vIFRyZWF0IHJl
dHVybiB2YWx1ZSBhcyB3aW5kb3cub25lcnJvciBpdHNlbGYgZG9lcywKKwkJLy8gT25seSBkbyBv
dXIgaGFuZGxpbmcgaWYgbm90IHN1cHByZXNzZWQuCisJCWlmICggcmV0ICE9PSB0cnVlICkgewor
CQkJaWYgKCBRVW5pdC5jb25maWcuY3VycmVudCApIHsKKwkJCQlpZiAoIFFVbml0LmNvbmZpZy5j
dXJyZW50Lmlnbm9yZUdsb2JhbEVycm9ycyApIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQor
CQkJCVFVbml0LnB1c2hGYWlsdXJlKCBlcnJvciwgZmlsZVBhdGggKyAiOiIgKyBsaW5lck5yICk7
CisJCQl9IGVsc2UgeworCQkJCVFVbml0LnRlc3QoICJnbG9iYWwgZmFpbHVyZSIsIGV4dGVuZChm
dW5jdGlvbigpIHsKKwkJCQkJUVVuaXQucHVzaEZhaWx1cmUoIGVycm9yLCBmaWxlUGF0aCArICI6
IiArIGxpbmVyTnIgKTsKKwkJCQl9LCB7IHZhbGlkVGVzdDogdHJ1ZSB9ICkgKTsKKwkJCX0KKwkJ
CXJldHVybiBmYWxzZTsKKwkJfQorCisJCXJldHVybiByZXQ7CisJfTsKK30gKSgpOworCitRVW5p
dC51cmxQYXJhbXMgPSB1cmxQYXJhbXM7CisKKy8vIEZpZ3VyZSBvdXQgaWYgd2UncmUgcnVubmlu
ZyB0aGUgdGVzdHMgZnJvbSBhIHNlcnZlciBvciBub3QKK1FVbml0LmlzTG9jYWwgPSAhKCBkZWZp
bmVkLmRvY3VtZW50ICYmIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCAhPT0gImZpbGU6IiApOwor
CisvLyBFeHBvc2UgdGhlIGN1cnJlbnQgUVVuaXQgdmVyc2lvbgorUVVuaXQudmVyc2lvbiA9ICIx
LjIwLjAiOworCitleHRlbmQoIFFVbml0LCB7CisKKwkvLyBjYWxsIG9uIHN0YXJ0IG9mIG1vZHVs
ZSB0ZXN0IHRvIHByZXBlbmQgbmFtZSB0byBhbGwgdGVzdHMKKwltb2R1bGU6IGZ1bmN0aW9uKCBu
YW1lLCB0ZXN0RW52aXJvbm1lbnQsIGV4ZWN1dGVOb3cgKSB7CisJCXZhciBtb2R1bGUsIG1vZHVs
ZUZuczsKKwkJdmFyIGN1cnJlbnRNb2R1bGUgPSBjb25maWcuY3VycmVudE1vZHVsZTsKKworCQlp
ZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgKSB7CisJCQlpZiAoIHRlc3RFbnZpcm9ubWVudCBp
bnN0YW5jZW9mIEZ1bmN0aW9uICkgeworCQkJCWV4ZWN1dGVOb3cgPSB0ZXN0RW52aXJvbm1lbnQ7
CisJCQkJdGVzdEVudmlyb25tZW50ID0gdW5kZWZpbmVkOworCQkJfQorCQl9CisKKwkJLy8gREVQ
UkVDQVRFRDogaGFuZGxlcyBzZXR1cC90ZWFyZG93biBmdW5jdGlvbnMsCisJCS8vIGJlZm9yZUVh
Y2ggYW5kIGFmdGVyRWFjaCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCisJCWlmICggdGVzdEVudmly
b25tZW50ICYmIHRlc3RFbnZpcm9ubWVudC5zZXR1cCApIHsKKwkJCXRlc3RFbnZpcm9ubWVudC5i
ZWZvcmVFYWNoID0gdGVzdEVudmlyb25tZW50LnNldHVwOworCQkJZGVsZXRlIHRlc3RFbnZpcm9u
bWVudC5zZXR1cDsKKwkJfQorCQlpZiAoIHRlc3RFbnZpcm9ubWVudCAmJiB0ZXN0RW52aXJvbm1l
bnQudGVhcmRvd24gKSB7CisJCQl0ZXN0RW52aXJvbm1lbnQuYWZ0ZXJFYWNoID0gdGVzdEVudmly
b25tZW50LnRlYXJkb3duOworCQkJZGVsZXRlIHRlc3RFbnZpcm9ubWVudC50ZWFyZG93bjsKKwkJ
fQorCisJCW1vZHVsZSA9IGNyZWF0ZU1vZHVsZSgpOworCisJCW1vZHVsZUZucyA9IHsKKwkJCWJl
Zm9yZUVhY2g6IHNldEhvb2soIG1vZHVsZSwgImJlZm9yZUVhY2giICksCisJCQlhZnRlckVhY2g6
IHNldEhvb2soIG1vZHVsZSwgImFmdGVyRWFjaCIgKQorCQl9OworCisJCWlmICggZXhlY3V0ZU5v
dyBpbnN0YW5jZW9mIEZ1bmN0aW9uICkgeworCQkJY29uZmlnLm1vZHVsZVN0YWNrLnB1c2goIG1v
ZHVsZSApOworCQkJc2V0Q3VycmVudE1vZHVsZSggbW9kdWxlICk7CisJCQlleGVjdXRlTm93LmNh
bGwoIG1vZHVsZS50ZXN0RW52aXJvbm1lbnQsIG1vZHVsZUZucyApOworCQkJY29uZmlnLm1vZHVs
ZVN0YWNrLnBvcCgpOworCQkJbW9kdWxlID0gbW9kdWxlLnBhcmVudE1vZHVsZSB8fCBjdXJyZW50
TW9kdWxlOworCQl9CisKKwkJc2V0Q3VycmVudE1vZHVsZSggbW9kdWxlICk7CisKKwkJZnVuY3Rp
b24gY3JlYXRlTW9kdWxlKCkgeworCQkJdmFyIHBhcmVudE1vZHVsZSA9IGNvbmZpZy5tb2R1bGVT
dGFjay5sZW5ndGggPworCQkJCWNvbmZpZy5tb2R1bGVTdGFjay5zbGljZSggLTEgKVsgMCBdIDog
bnVsbDsKKwkJCXZhciBtb2R1bGVOYW1lID0gcGFyZW50TW9kdWxlICE9PSBudWxsID8KKwkJCQlb
IHBhcmVudE1vZHVsZS5uYW1lLCBuYW1lIF0uam9pbiggIiA+ICIgKSA6IG5hbWU7CisJCQl2YXIg
bW9kdWxlID0geworCQkJCW5hbWU6IG1vZHVsZU5hbWUsCisJCQkJcGFyZW50TW9kdWxlOiBwYXJl
bnRNb2R1bGUsCisJCQkJdGVzdHM6IFtdCisJCQl9OworCisJCQl2YXIgZW52ID0ge307CisJCQlp
ZiAoIHBhcmVudE1vZHVsZSApIHsKKwkJCQlleHRlbmQoIGVudiwgcGFyZW50TW9kdWxlLnRlc3RF
bnZpcm9ubWVudCApOworCQkJCWRlbGV0ZSBlbnYuYmVmb3JlRWFjaDsKKwkJCQlkZWxldGUgZW52
LmFmdGVyRWFjaDsKKwkJCX0KKwkJCWV4dGVuZCggZW52LCB0ZXN0RW52aXJvbm1lbnQgKTsKKwkJ
CW1vZHVsZS50ZXN0RW52aXJvbm1lbnQgPSBlbnY7CisKKwkJCWNvbmZpZy5tb2R1bGVzLnB1c2go
IG1vZHVsZSApOworCQkJcmV0dXJuIG1vZHVsZTsKKwkJfQorCisJCWZ1bmN0aW9uIHNldEN1cnJl
bnRNb2R1bGUoIG1vZHVsZSApIHsKKwkJCWNvbmZpZy5jdXJyZW50TW9kdWxlID0gbW9kdWxlOwor
CQl9CisKKwl9LAorCisJLy8gREVQUkVDQVRFRDogUVVuaXQuYXN5bmNUZXN0KCkgd2lsbCBiZSBy
ZW1vdmVkIGluIFFVbml0IDIuMC4KKwlhc3luY1Rlc3Q6IGFzeW5jVGVzdCwKKworCXRlc3Q6IHRl
c3QsCisKKwlza2lwOiBza2lwLAorCisJb25seTogb25seSwKKworCS8vIERFUFJFQ0FURUQ6IFRo
ZSBmdW5jdGlvbmFsaXR5IG9mIFFVbml0LnN0YXJ0KCkgd2lsbCBiZSBhbHRlcmVkIGluIFFVbml0
IDIuMC4KKwkvLyBJbiBRVW5pdCAyLjAsIGludm9raW5nIGl0IHdpbGwgT05MWSBhZmZlY3QgdGhl
IGBRVW5pdC5jb25maWcuYXV0b3N0YXJ0YCBibG9ja2luZyBiZWhhdmlvci4KKwlzdGFydDogZnVu
Y3Rpb24oIGNvdW50ICkgeworCQl2YXIgZ2xvYmFsU3RhcnRBbHJlYWR5Q2FsbGVkID0gZ2xvYmFs
U3RhcnRDYWxsZWQ7CisKKwkJaWYgKCAhY29uZmlnLmN1cnJlbnQgKSB7CisJCQlnbG9iYWxTdGFy
dENhbGxlZCA9IHRydWU7CisKKwkJCWlmICggcnVuU3RhcnRlZCApIHsKKwkJCQl0aHJvdyBuZXcg
RXJyb3IoICJDYWxsZWQgc3RhcnQoKSBvdXRzaWRlIG9mIGEgdGVzdCBjb250ZXh0IHdoaWxlIGFs
cmVhZHkgc3RhcnRlZCIgKTsKKwkJCX0gZWxzZSBpZiAoIGdsb2JhbFN0YXJ0QWxyZWFkeUNhbGxl
ZCB8fCBjb3VudCA+IDEgKSB7CisJCQkJdGhyb3cgbmV3IEVycm9yKCAiQ2FsbGVkIHN0YXJ0KCkg
b3V0c2lkZSBvZiBhIHRlc3QgY29udGV4dCB0b28gbWFueSB0aW1lcyIgKTsKKwkJCX0gZWxzZSBp
ZiAoIGNvbmZpZy5hdXRvc3RhcnQgKSB7CisJCQkJdGhyb3cgbmV3IEVycm9yKCAiQ2FsbGVkIHN0
YXJ0KCkgb3V0c2lkZSBvZiBhIHRlc3QgY29udGV4dCB3aGVuICIgKworCQkJCQkiUVVuaXQuY29u
ZmlnLmF1dG9zdGFydCB3YXMgdHJ1ZSIgKTsKKwkJCX0gZWxzZSBpZiAoICFjb25maWcucGFnZUxv
YWRlZCApIHsKKworCQkJCS8vIFRoZSBwYWdlIGlzbid0IGNvbXBsZXRlbHkgbG9hZGVkIHlldCwg
c28gYmFpbCBvdXQgYW5kIGxldCBgUVVuaXQubG9hZGAgaGFuZGxlIGl0CisJCQkJY29uZmlnLmF1
dG9zdGFydCA9IHRydWU7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCisJCQkvLyBJ
ZiBhIHRlc3QgaXMgcnVubmluZywgYWRqdXN0IGl0cyBzZW1hcGhvcmUKKwkJCWNvbmZpZy5jdXJy
ZW50LnNlbWFwaG9yZSAtPSBjb3VudCB8fCAxOworCisJCQkvLyBJZiBzZW1hcGhvcmUgaXMgbm9u
LW51bWVyaWMsIHRocm93IGVycm9yCisJCQlpZiAoIGlzTmFOKCBjb25maWcuY3VycmVudC5zZW1h
cGhvcmUgKSApIHsKKwkJCQljb25maWcuY3VycmVudC5zZW1hcGhvcmUgPSAwOworCisJCQkJUVVu
aXQucHVzaEZhaWx1cmUoCisJCQkJCSJDYWxsZWQgc3RhcnQoKSB3aXRoIGEgbm9uLW51bWVyaWMg
ZGVjcmVtZW50LiIsCisJCQkJCXNvdXJjZUZyb21TdGFja3RyYWNlKCAyICkKKwkJCQkpOworCQkJ
CXJldHVybjsKKwkJCX0KKworCQkJLy8gRG9uJ3Qgc3RhcnQgdW50aWwgZXF1YWwgbnVtYmVyIG9m
IHN0b3AtY2FsbHMKKwkJCWlmICggY29uZmlnLmN1cnJlbnQuc2VtYXBob3JlID4gMCApIHsKKwkJ
CQlyZXR1cm47CisJCQl9CisKKwkJCS8vIHRocm93IGFuIEVycm9yIGlmIHN0YXJ0IGlzIGNhbGxl
ZCBtb3JlIG9mdGVuIHRoYW4gc3RvcAorCQkJaWYgKCBjb25maWcuY3VycmVudC5zZW1hcGhvcmUg
PCAwICkgeworCQkJCWNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSA9IDA7CisKKwkJCQlRVW5pdC5w
dXNoRmFpbHVyZSgKKwkJCQkJIkNhbGxlZCBzdGFydCgpIHdoaWxlIGFscmVhZHkgc3RhcnRlZCAo
dGVzdCdzIHNlbWFwaG9yZSB3YXMgMCBhbHJlYWR5KSIsCisJCQkJCXNvdXJjZUZyb21TdGFja3Ry
YWNlKCAyICkKKwkJCQkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCXJlc3VtZVByb2Nl
c3NpbmcoKTsKKwl9LAorCisJLy8gREVQUkVDQVRFRDogUVVuaXQuc3RvcCgpIHdpbGwgYmUgcmVt
b3ZlZCBpbiBRVW5pdCAyLjAuCisJc3RvcDogZnVuY3Rpb24oIGNvdW50ICkgeworCisJCS8vIElm
IHRoZXJlIGlzbid0IGEgdGVzdCBydW5uaW5nLCBkb24ndCBhbGxvdyBRVW5pdC5zdG9wKCkgdG8g
YmUgY2FsbGVkCisJCWlmICggIWNvbmZpZy5jdXJyZW50ICkgeworCQkJdGhyb3cgbmV3IEVycm9y
KCAiQ2FsbGVkIHN0b3AoKSBvdXRzaWRlIG9mIGEgdGVzdCBjb250ZXh0IiApOworCQl9CisKKwkJ
Ly8gSWYgYSB0ZXN0IGlzIHJ1bm5pbmcsIGFkanVzdCBpdHMgc2VtYXBob3JlCisJCWNvbmZpZy5j
dXJyZW50LnNlbWFwaG9yZSArPSBjb3VudCB8fCAxOworCisJCXBhdXNlUHJvY2Vzc2luZygpOwor
CX0sCisKKwljb25maWc6IGNvbmZpZywKKworCWlzOiBpcywKKworCW9iamVjdFR5cGU6IG9iamVj
dFR5cGUsCisKKwlleHRlbmQ6IGV4dGVuZCwKKworCWxvYWQ6IGZ1bmN0aW9uKCkgeworCQljb25m
aWcucGFnZUxvYWRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlv
biBvcHRpb25zCisJCWV4dGVuZCggY29uZmlnLCB7CisJCQlzdGF0czogeyBhbGw6IDAsIGJhZDog
MCB9LAorCQkJbW9kdWxlU3RhdHM6IHsgYWxsOiAwLCBiYWQ6IDAgfSwKKwkJCXN0YXJ0ZWQ6IDAs
CisJCQl1cGRhdGVSYXRlOiAxMDAwLAorCQkJYXV0b3N0YXJ0OiB0cnVlLAorCQkJZmlsdGVyOiAi
IgorCQl9LCB0cnVlICk7CisKKwkJY29uZmlnLmJsb2NraW5nID0gZmFsc2U7CisKKwkJaWYgKCBj
b25maWcuYXV0b3N0YXJ0ICkgeworCQkJcmVzdW1lUHJvY2Vzc2luZygpOworCQl9CisJfSwKKwor
CXN0YWNrOiBmdW5jdGlvbiggb2Zmc2V0ICkgeworCQlvZmZzZXQgPSAoIG9mZnNldCB8fCAwICkg
KyAyOworCQlyZXR1cm4gc291cmNlRnJvbVN0YWNrdHJhY2UoIG9mZnNldCApOworCX0KK30pOwor
CityZWdpc3RlckxvZ2dpbmdDYWxsYmFja3MoIFFVbml0ICk7CisKK2Z1bmN0aW9uIGJlZ2luKCkg
eworCXZhciBpLCBsLAorCQltb2R1bGVzTG9nID0gW107CisKKwkvLyBJZiB0aGUgdGVzdCBydW4g
aGFzbid0IG9mZmljaWFsbHkgYmVndW4geWV0CisJaWYgKCAhY29uZmlnLnN0YXJ0ZWQgKSB7CisK
KwkJLy8gUmVjb3JkIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHJ1bidzIGJlZ2lubmluZworCQljb25m
aWcuc3RhcnRlZCA9IG5vdygpOworCisJCXZlcmlmeUxvZ2dpbmdDYWxsYmFja3MoKTsKKworCQkv
LyBEZWxldGUgdGhlIGxvb3NlIHVubmFtZWQgbW9kdWxlIGlmIHVudXNlZC4KKwkJaWYgKCBjb25m
aWcubW9kdWxlc1sgMCBdLm5hbWUgPT09ICIiICYmIGNvbmZpZy5tb2R1bGVzWyAwIF0udGVzdHMu
bGVuZ3RoID09PSAwICkgeworCQkJY29uZmlnLm1vZHVsZXMuc2hpZnQoKTsKKwkJfQorCisJCS8v
IEF2b2lkIHVubmVjZXNzYXJ5IGluZm9ybWF0aW9uIGJ5IG5vdCBsb2dnaW5nIG1vZHVsZXMnIHRl
c3QgZW52aXJvbm1lbnRzCisJCWZvciAoIGkgPSAwLCBsID0gY29uZmlnLm1vZHVsZXMubGVuZ3Ro
OyBpIDwgbDsgaSsrICkgeworCQkJbW9kdWxlc0xvZy5wdXNoKHsKKwkJCQluYW1lOiBjb25maWcu
bW9kdWxlc1sgaSBdLm5hbWUsCisJCQkJdGVzdHM6IGNvbmZpZy5tb2R1bGVzWyBpIF0udGVzdHMK
KwkJCX0pOworCQl9CisKKwkJLy8gVGhlIHRlc3QgcnVuIGlzIG9mZmljaWFsbHkgYmVnaW5uaW5n
IG5vdworCQlydW5Mb2dnaW5nQ2FsbGJhY2tzKCAiYmVnaW4iLCB7CisJCQl0b3RhbFRlc3RzOiBU
ZXN0LmNvdW50LAorCQkJbW9kdWxlczogbW9kdWxlc0xvZworCQl9KTsKKwl9CisKKwljb25maWcu
YmxvY2tpbmcgPSBmYWxzZTsKKwlwcm9jZXNzKCB0cnVlICk7Cit9CisKK2Z1bmN0aW9uIHByb2Nl
c3MoIGxhc3QgKSB7CisJZnVuY3Rpb24gbmV4dCgpIHsKKwkJcHJvY2VzcyggbGFzdCApOworCX0K
Kwl2YXIgc3RhcnQgPSBub3coKTsKKwljb25maWcuZGVwdGggPSAoIGNvbmZpZy5kZXB0aCB8fCAw
ICkgKyAxOworCisJd2hpbGUgKCBjb25maWcucXVldWUubGVuZ3RoICYmICFjb25maWcuYmxvY2tp
bmcgKSB7CisJCWlmICggIWRlZmluZWQuc2V0VGltZW91dCB8fCBjb25maWcudXBkYXRlUmF0ZSA8
PSAwIHx8CisJCQkJKCAoIG5vdygpIC0gc3RhcnQgKSA8IGNvbmZpZy51cGRhdGVSYXRlICkgKSB7
CisJCQlpZiAoIGNvbmZpZy5jdXJyZW50ICkgeworCisJCQkJLy8gUmVzZXQgYXN5bmMgdHJhY2tp
bmcgZm9yIGVhY2ggcGhhc2Ugb2YgdGhlIFRlc3QgbGlmZWN5Y2xlCisJCQkJY29uZmlnLmN1cnJl
bnQudXNlZEFzeW5jID0gZmFsc2U7CisJCQl9CisJCQljb25maWcucXVldWUuc2hpZnQoKSgpOwor
CQl9IGVsc2UgeworCQkJc2V0VGltZW91dCggbmV4dCwgMTMgKTsKKwkJCWJyZWFrOworCQl9CisJ
fQorCWNvbmZpZy5kZXB0aC0tOworCWlmICggbGFzdCAmJiAhY29uZmlnLmJsb2NraW5nICYmICFj
b25maWcucXVldWUubGVuZ3RoICYmIGNvbmZpZy5kZXB0aCA9PT0gMCApIHsKKwkJZG9uZSgpOwor
CX0KK30KKworZnVuY3Rpb24gcGF1c2VQcm9jZXNzaW5nKCkgeworCWNvbmZpZy5ibG9ja2luZyA9
IHRydWU7CisKKwlpZiAoIGNvbmZpZy50ZXN0VGltZW91dCAmJiBkZWZpbmVkLnNldFRpbWVvdXQg
KSB7CisJCWNsZWFyVGltZW91dCggY29uZmlnLnRpbWVvdXQgKTsKKwkJY29uZmlnLnRpbWVvdXQg
PSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworCQkJaWYgKCBjb25maWcuY3VycmVudCApIHsKKwkJ
CQljb25maWcuY3VycmVudC5zZW1hcGhvcmUgPSAwOworCQkJCVFVbml0LnB1c2hGYWlsdXJlKCAi
VGVzdCB0aW1lZCBvdXQiLCBzb3VyY2VGcm9tU3RhY2t0cmFjZSggMiApICk7CisJCQl9IGVsc2Ug
eworCQkJCXRocm93IG5ldyBFcnJvciggIlRlc3QgdGltZWQgb3V0IiApOworCQkJfQorCQkJcmVz
dW1lUHJvY2Vzc2luZygpOworCQl9LCBjb25maWcudGVzdFRpbWVvdXQgKTsKKwl9Cit9CisKK2Z1
bmN0aW9uIHJlc3VtZVByb2Nlc3NpbmcoKSB7CisJcnVuU3RhcnRlZCA9IHRydWU7CisKKwkvLyBB
IHNsaWdodCBkZWxheSB0byBhbGxvdyB0aGlzIGl0ZXJhdGlvbiBvZiB0aGUgZXZlbnQgbG9vcCB0
byBmaW5pc2ggKG1vcmUgYXNzZXJ0aW9ucywgZXRjLikKKwlpZiAoIGRlZmluZWQuc2V0VGltZW91
dCApIHsKKwkJc2V0VGltZW91dChmdW5jdGlvbigpIHsKKwkJCWlmICggY29uZmlnLmN1cnJlbnQg
JiYgY29uZmlnLmN1cnJlbnQuc2VtYXBob3JlID4gMCApIHsKKwkJCQlyZXR1cm47CisJCQl9CisJ
CQlpZiAoIGNvbmZpZy50aW1lb3V0ICkgeworCQkJCWNsZWFyVGltZW91dCggY29uZmlnLnRpbWVv
dXQgKTsKKwkJCX0KKworCQkJYmVnaW4oKTsKKwkJfSwgMTMgKTsKKwl9IGVsc2UgeworCQliZWdp
bigpOworCX0KK30KKworZnVuY3Rpb24gZG9uZSgpIHsKKwl2YXIgcnVudGltZSwgcGFzc2VkOwor
CisJY29uZmlnLmF1dG9ydW4gPSB0cnVlOworCisJLy8gTG9nIHRoZSBsYXN0IG1vZHVsZSByZXN1
bHRzCisJaWYgKCBjb25maWcucHJldmlvdXNNb2R1bGUgKSB7CisJCXJ1bkxvZ2dpbmdDYWxsYmFj
a3MoICJtb2R1bGVEb25lIiwgeworCQkJbmFtZTogY29uZmlnLnByZXZpb3VzTW9kdWxlLm5hbWUs
CisJCQl0ZXN0czogY29uZmlnLnByZXZpb3VzTW9kdWxlLnRlc3RzLAorCQkJZmFpbGVkOiBjb25m
aWcubW9kdWxlU3RhdHMuYmFkLAorCQkJcGFzc2VkOiBjb25maWcubW9kdWxlU3RhdHMuYWxsIC0g
Y29uZmlnLm1vZHVsZVN0YXRzLmJhZCwKKwkJCXRvdGFsOiBjb25maWcubW9kdWxlU3RhdHMuYWxs
LAorCQkJcnVudGltZTogbm93KCkgLSBjb25maWcubW9kdWxlU3RhdHMuc3RhcnRlZAorCQl9KTsK
Kwl9CisJZGVsZXRlIGNvbmZpZy5wcmV2aW91c01vZHVsZTsKKworCXJ1bnRpbWUgPSBub3coKSAt
IGNvbmZpZy5zdGFydGVkOworCXBhc3NlZCA9IGNvbmZpZy5zdGF0cy5hbGwgLSBjb25maWcuc3Rh
dHMuYmFkOworCisJcnVuTG9nZ2luZ0NhbGxiYWNrcyggImRvbmUiLCB7CisJCWZhaWxlZDogY29u
ZmlnLnN0YXRzLmJhZCwKKwkJcGFzc2VkOiBwYXNzZWQsCisJCXRvdGFsOiBjb25maWcuc3RhdHMu
YWxsLAorCQlydW50aW1lOiBydW50aW1lCisJfSk7Cit9CisKK2Z1bmN0aW9uIHNldEhvb2soIG1v
ZHVsZSwgaG9va05hbWUgKSB7CisJaWYgKCBtb2R1bGUudGVzdEVudmlyb25tZW50ID09PSB1bmRl
ZmluZWQgKSB7CisJCW1vZHVsZS50ZXN0RW52aXJvbm1lbnQgPSB7fTsKKwl9CisKKwlyZXR1cm4g
ZnVuY3Rpb24oIGNhbGxiYWNrICkgeworCQltb2R1bGUudGVzdEVudmlyb25tZW50WyBob29rTmFt
ZSBdID0gY2FsbGJhY2s7CisJfTsKK30KKwordmFyIGZvY3VzZWQgPSBmYWxzZTsKKworZnVuY3Rp
b24gVGVzdCggc2V0dGluZ3MgKSB7CisJdmFyIGksIGw7CisKKwkrK1Rlc3QuY291bnQ7CisKKwll
eHRlbmQoIHRoaXMsIHNldHRpbmdzICk7CisJdGhpcy5hc3NlcnRpb25zID0gW107CisJdGhpcy5z
ZW1hcGhvcmUgPSAwOworCXRoaXMudXNlZEFzeW5jID0gZmFsc2U7CisJdGhpcy5tb2R1bGUgPSBj
b25maWcuY3VycmVudE1vZHVsZTsKKwl0aGlzLnN0YWNrID0gc291cmNlRnJvbVN0YWNrdHJhY2Uo
IDMgKTsKKworCS8vIFJlZ2lzdGVyIHVuaXF1ZSBzdHJpbmdzCisJZm9yICggaSA9IDAsIGwgPSB0
aGlzLm1vZHVsZS50ZXN0czsgaSA8IGwubGVuZ3RoOyBpKysgKSB7CisJCWlmICggdGhpcy5tb2R1
bGUudGVzdHNbIGkgXS5uYW1lID09PSB0aGlzLnRlc3ROYW1lICkgeworCQkJdGhpcy50ZXN0TmFt
ZSArPSAiICI7CisJCX0KKwl9CisKKwl0aGlzLnRlc3RJZCA9IGdlbmVyYXRlSGFzaCggdGhpcy5t
b2R1bGUubmFtZSwgdGhpcy50ZXN0TmFtZSApOworCisJdGhpcy5tb2R1bGUudGVzdHMucHVzaCh7
CisJCW5hbWU6IHRoaXMudGVzdE5hbWUsCisJCXRlc3RJZDogdGhpcy50ZXN0SWQKKwl9KTsKKwor
CWlmICggc2V0dGluZ3Muc2tpcCApIHsKKworCQkvLyBTa2lwcGVkIHRlc3RzIHdpbGwgZnVsbHkg
aWdub3JlIGFueSBzZW50IGNhbGxiYWNrCisJCXRoaXMuY2FsbGJhY2sgPSBmdW5jdGlvbigpIHt9
OworCQl0aGlzLmFzeW5jID0gZmFsc2U7CisJCXRoaXMuZXhwZWN0ZWQgPSAwOworCX0gZWxzZSB7
CisJCXRoaXMuYXNzZXJ0ID0gbmV3IEFzc2VydCggdGhpcyApOworCX0KK30KKworVGVzdC5jb3Vu
dCA9IDA7CisKK1Rlc3QucHJvdG90eXBlID0geworCWJlZm9yZTogZnVuY3Rpb24oKSB7CisJCWlm
ICgKKworCQkJLy8gRW1pdCBtb2R1bGVTdGFydCB3aGVuIHdlJ3JlIHN3aXRjaGluZyBmcm9tIG9u
ZSBtb2R1bGUgdG8gYW5vdGhlcgorCQkJdGhpcy5tb2R1bGUgIT09IGNvbmZpZy5wcmV2aW91c01v
ZHVsZSB8fAorCisJCQkJLy8gVGhleSBjb3VsZCBiZSBlcXVhbCAoYm90aCB1bmRlZmluZWQpIGJ1
dCBpZiB0aGUgcHJldmlvdXNNb2R1bGUgcHJvcGVydHkgZG9lc24ndAorCQkJCS8vIHlldCBleGlz
dCBpdCBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdCB0ZXN0IGluIGEgc3VpdGUgdGhhdCBpc24ndCB3
cmFwcGVkIGluIGEKKwkJCQkvLyBtb2R1bGUsIGluIHdoaWNoIGNhc2Ugd2UnbGwganVzdCBlbWl0
IGEgbW9kdWxlU3RhcnQgZXZlbnQgZm9yICd1bmRlZmluZWQnLgorCQkJCS8vIFdpdGhvdXQgdGhp
cywgcmVwb3J0ZXJzIGNhbiBnZXQgdGVzdFN0YXJ0IGJlZm9yZSBtb2R1bGVTdGFydCAgd2hpY2gg
aXMgYSBwcm9ibGVtLgorCQkJCSFoYXNPd24uY2FsbCggY29uZmlnLCAicHJldmlvdXNNb2R1bGUi
ICkKKwkJKSB7CisJCQlpZiAoIGhhc093bi5jYWxsKCBjb25maWcsICJwcmV2aW91c01vZHVsZSIg
KSApIHsKKwkJCQlydW5Mb2dnaW5nQ2FsbGJhY2tzKCAibW9kdWxlRG9uZSIsIHsKKwkJCQkJbmFt
ZTogY29uZmlnLnByZXZpb3VzTW9kdWxlLm5hbWUsCisJCQkJCXRlc3RzOiBjb25maWcucHJldmlv
dXNNb2R1bGUudGVzdHMsCisJCQkJCWZhaWxlZDogY29uZmlnLm1vZHVsZVN0YXRzLmJhZCwKKwkJ
CQkJcGFzc2VkOiBjb25maWcubW9kdWxlU3RhdHMuYWxsIC0gY29uZmlnLm1vZHVsZVN0YXRzLmJh
ZCwKKwkJCQkJdG90YWw6IGNvbmZpZy5tb2R1bGVTdGF0cy5hbGwsCisJCQkJCXJ1bnRpbWU6IG5v
dygpIC0gY29uZmlnLm1vZHVsZVN0YXRzLnN0YXJ0ZWQKKwkJCQl9KTsKKwkJCX0KKwkJCWNvbmZp
Zy5wcmV2aW91c01vZHVsZSA9IHRoaXMubW9kdWxlOworCQkJY29uZmlnLm1vZHVsZVN0YXRzID0g
eyBhbGw6IDAsIGJhZDogMCwgc3RhcnRlZDogbm93KCkgfTsKKwkJCXJ1bkxvZ2dpbmdDYWxsYmFj
a3MoICJtb2R1bGVTdGFydCIsIHsKKwkJCQluYW1lOiB0aGlzLm1vZHVsZS5uYW1lLAorCQkJCXRl
c3RzOiB0aGlzLm1vZHVsZS50ZXN0cworCQkJfSk7CisJCX0KKworCQljb25maWcuY3VycmVudCA9
IHRoaXM7CisKKwkJaWYgKCB0aGlzLm1vZHVsZS50ZXN0RW52aXJvbm1lbnQgKSB7CisJCQlkZWxl
dGUgdGhpcy5tb2R1bGUudGVzdEVudmlyb25tZW50LmJlZm9yZUVhY2g7CisJCQlkZWxldGUgdGhp
cy5tb2R1bGUudGVzdEVudmlyb25tZW50LmFmdGVyRWFjaDsKKwkJfQorCQl0aGlzLnRlc3RFbnZp
cm9ubWVudCA9IGV4dGVuZCgge30sIHRoaXMubW9kdWxlLnRlc3RFbnZpcm9ubWVudCApOworCisJ
CXRoaXMuc3RhcnRlZCA9IG5vdygpOworCQlydW5Mb2dnaW5nQ2FsbGJhY2tzKCAidGVzdFN0YXJ0
IiwgeworCQkJbmFtZTogdGhpcy50ZXN0TmFtZSwKKwkJCW1vZHVsZTogdGhpcy5tb2R1bGUubmFt
ZSwKKwkJCXRlc3RJZDogdGhpcy50ZXN0SWQKKwkJfSk7CisKKwkJaWYgKCAhY29uZmlnLnBvbGx1
dGlvbiApIHsKKwkJCXNhdmVHbG9iYWwoKTsKKwkJfQorCX0sCisKKwlydW46IGZ1bmN0aW9uKCkg
eworCQl2YXIgcHJvbWlzZTsKKworCQljb25maWcuY3VycmVudCA9IHRoaXM7CisKKwkJaWYgKCB0
aGlzLmFzeW5jICkgeworCQkJUVVuaXQuc3RvcCgpOworCQl9CisKKwkJdGhpcy5jYWxsYmFja1N0
YXJ0ZWQgPSBub3coKTsKKworCQlpZiAoIGNvbmZpZy5ub3RyeWNhdGNoICkgeworCQkJcnVuVGVz
dCggdGhpcyApOworCQkJcmV0dXJuOworCQl9CisKKwkJdHJ5IHsKKwkJCXJ1blRlc3QoIHRoaXMg
KTsKKwkJfSBjYXRjaCAoIGUgKSB7CisJCQl0aGlzLnB1c2hGYWlsdXJlKCAiRGllZCBvbiB0ZXN0
ICMiICsgKCB0aGlzLmFzc2VydGlvbnMubGVuZ3RoICsgMSApICsgIiAiICsKKwkJCQl0aGlzLnN0
YWNrICsgIjogIiArICggZS5tZXNzYWdlIHx8IGUgKSwgZXh0cmFjdFN0YWNrdHJhY2UoIGUsIDAg
KSApOworCisJCQkvLyBlbHNlIG5leHQgdGVzdCB3aWxsIGNhcnJ5IHRoZSByZXNwb25zaWJpbGl0
eQorCQkJc2F2ZUdsb2JhbCgpOworCisJCQkvLyBSZXN0YXJ0IHRoZSB0ZXN0cyBpZiB0aGV5J3Jl
IGJsb2NraW5nCisJCQlpZiAoIGNvbmZpZy5ibG9ja2luZyApIHsKKwkJCQlRVW5pdC5zdGFydCgp
OworCQkJfQorCQl9CisKKwkJZnVuY3Rpb24gcnVuVGVzdCggdGVzdCApIHsKKwkJCXByb21pc2Ug
PSB0ZXN0LmNhbGxiYWNrLmNhbGwoIHRlc3QudGVzdEVudmlyb25tZW50LCB0ZXN0LmFzc2VydCAp
OworCQkJdGVzdC5yZXNvbHZlUHJvbWlzZSggcHJvbWlzZSApOworCQl9CisJfSwKKworCWFmdGVy
OiBmdW5jdGlvbigpIHsKKwkJY2hlY2tQb2xsdXRpb24oKTsKKwl9LAorCisJcXVldWVIb29rOiBm
dW5jdGlvbiggaG9vaywgaG9va05hbWUgKSB7CisJCXZhciBwcm9taXNlLAorCQkJdGVzdCA9IHRo
aXM7CisJCXJldHVybiBmdW5jdGlvbiBydW5Ib29rKCkgeworCQkJY29uZmlnLmN1cnJlbnQgPSB0
ZXN0OworCQkJaWYgKCBjb25maWcubm90cnljYXRjaCApIHsKKwkJCQljYWxsSG9vaygpOworCQkJ
CXJldHVybjsKKwkJCX0KKwkJCXRyeSB7CisJCQkJY2FsbEhvb2soKTsKKwkJCX0gY2F0Y2ggKCBl
cnJvciApIHsKKwkJCQl0ZXN0LnB1c2hGYWlsdXJlKCBob29rTmFtZSArICIgZmFpbGVkIG9uICIg
KyB0ZXN0LnRlc3ROYW1lICsgIjogIiArCisJCQkJKCBlcnJvci5tZXNzYWdlIHx8IGVycm9yICks
IGV4dHJhY3RTdGFja3RyYWNlKCBlcnJvciwgMCApICk7CisJCQl9CisKKwkJCWZ1bmN0aW9uIGNh
bGxIb29rKCkgeworCQkJCXByb21pc2UgPSBob29rLmNhbGwoIHRlc3QudGVzdEVudmlyb25tZW50
LCB0ZXN0LmFzc2VydCApOworCQkJCXRlc3QucmVzb2x2ZVByb21pc2UoIHByb21pc2UsIGhvb2tO
YW1lICk7CisJCQl9CisJCX07CisJfSwKKworCS8vIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIG1v
ZHVsZSBsZXZlbCBob29rcywgY2FuIGJlIHVzZWQgdG8gYWRkIGdsb2JhbCBsZXZlbCBvbmVzCisJ
aG9va3M6IGZ1bmN0aW9uKCBoYW5kbGVyICkgeworCQl2YXIgaG9va3MgPSBbXTsKKworCQlmdW5j
dGlvbiBwcm9jZXNzSG9va3MoIHRlc3QsIG1vZHVsZSApIHsKKwkJCWlmICggbW9kdWxlLnBhcmVu
dE1vZHVsZSApIHsKKwkJCQlwcm9jZXNzSG9va3MoIHRlc3QsIG1vZHVsZS5wYXJlbnRNb2R1bGUg
KTsKKwkJCX0KKwkJCWlmICggbW9kdWxlLnRlc3RFbnZpcm9ubWVudCAmJgorCQkJCVFVbml0Lm9i
amVjdFR5cGUoIG1vZHVsZS50ZXN0RW52aXJvbm1lbnRbIGhhbmRsZXIgXSApID09PSAiZnVuY3Rp
b24iICkgeworCQkJCWhvb2tzLnB1c2goIHRlc3QucXVldWVIb29rKCBtb2R1bGUudGVzdEVudmly
b25tZW50WyBoYW5kbGVyIF0sIGhhbmRsZXIgKSApOworCQkJfQorCQl9CisKKwkJLy8gSG9va3Mg
YXJlIGlnbm9yZWQgb24gc2tpcHBlZCB0ZXN0cworCQlpZiAoICF0aGlzLnNraXAgKSB7CisJCQlw
cm9jZXNzSG9va3MoIHRoaXMsIHRoaXMubW9kdWxlICk7CisJCX0KKwkJcmV0dXJuIGhvb2tzOwor
CX0sCisKKwlmaW5pc2g6IGZ1bmN0aW9uKCkgeworCQljb25maWcuY3VycmVudCA9IHRoaXM7CisJ
CWlmICggY29uZmlnLnJlcXVpcmVFeHBlY3RzICYmIHRoaXMuZXhwZWN0ZWQgPT09IG51bGwgKSB7
CisJCQl0aGlzLnB1c2hGYWlsdXJlKCAiRXhwZWN0ZWQgbnVtYmVyIG9mIGFzc2VydGlvbnMgdG8g
YmUgZGVmaW5lZCwgYnV0IGV4cGVjdCgpIHdhcyAiICsKKwkJCQkibm90IGNhbGxlZC4iLCB0aGlz
LnN0YWNrICk7CisJCX0gZWxzZSBpZiAoIHRoaXMuZXhwZWN0ZWQgIT09IG51bGwgJiYgdGhpcy5l
eHBlY3RlZCAhPT0gdGhpcy5hc3NlcnRpb25zLmxlbmd0aCApIHsKKwkJCXRoaXMucHVzaEZhaWx1
cmUoICJFeHBlY3RlZCAiICsgdGhpcy5leHBlY3RlZCArICIgYXNzZXJ0aW9ucywgYnV0ICIgKwor
CQkJCXRoaXMuYXNzZXJ0aW9ucy5sZW5ndGggKyAiIHdlcmUgcnVuIiwgdGhpcy5zdGFjayApOwor
CQl9IGVsc2UgaWYgKCB0aGlzLmV4cGVjdGVkID09PSBudWxsICYmICF0aGlzLmFzc2VydGlvbnMu
bGVuZ3RoICkgeworCQkJdGhpcy5wdXNoRmFpbHVyZSggIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBh
c3NlcnRpb24sIGJ1dCBub25lIHdlcmUgcnVuIC0gY2FsbCAiICsKKwkJCQkiZXhwZWN0KDApIHRv
IGFjY2VwdCB6ZXJvIGFzc2VydGlvbnMuIiwgdGhpcy5zdGFjayApOworCQl9CisKKwkJdmFyIGks
CisJCQliYWQgPSAwOworCisJCXRoaXMucnVudGltZSA9IG5vdygpIC0gdGhpcy5zdGFydGVkOwor
CQljb25maWcuc3RhdHMuYWxsICs9IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGg7CisJCWNvbmZpZy5t
b2R1bGVTdGF0cy5hbGwgKz0gdGhpcy5hc3NlcnRpb25zLmxlbmd0aDsKKworCQlmb3IgKCBpID0g
MDsgaSA8IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGg7IGkrKyApIHsKKwkJCWlmICggIXRoaXMuYXNz
ZXJ0aW9uc1sgaSBdLnJlc3VsdCApIHsKKwkJCQliYWQrKzsKKwkJCQljb25maWcuc3RhdHMuYmFk
Kys7CisJCQkJY29uZmlnLm1vZHVsZVN0YXRzLmJhZCsrOworCQkJfQorCQl9CisKKwkJcnVuTG9n
Z2luZ0NhbGxiYWNrcyggInRlc3REb25lIiwgeworCQkJbmFtZTogdGhpcy50ZXN0TmFtZSwKKwkJ
CW1vZHVsZTogdGhpcy5tb2R1bGUubmFtZSwKKwkJCXNraXBwZWQ6ICEhdGhpcy5za2lwLAorCQkJ
ZmFpbGVkOiBiYWQsCisJCQlwYXNzZWQ6IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGggLSBiYWQsCisJ
CQl0b3RhbDogdGhpcy5hc3NlcnRpb25zLmxlbmd0aCwKKwkJCXJ1bnRpbWU6IHRoaXMucnVudGlt
ZSwKKworCQkJLy8gSFRNTCBSZXBvcnRlciB1c2UKKwkJCWFzc2VydGlvbnM6IHRoaXMuYXNzZXJ0
aW9ucywKKwkJCXRlc3RJZDogdGhpcy50ZXN0SWQsCisKKwkJCS8vIFNvdXJjZSBvZiBUZXN0CisJ
CQlzb3VyY2U6IHRoaXMuc3RhY2ssCisKKwkJCS8vIERFUFJFQ0FURUQ6IHRoaXMgcHJvcGVydHkg
d2lsbCBiZSByZW1vdmVkIGluIDIuMC4wLCB1c2UgcnVudGltZSBpbnN0ZWFkCisJCQlkdXJhdGlv
bjogdGhpcy5ydW50aW1lCisJCX0pOworCisJCS8vIFFVbml0LnJlc2V0KCkgaXMgZGVwcmVjYXRl
ZCBhbmQgd2lsbCBiZSByZXBsYWNlZCBmb3IgYSBuZXcKKwkJLy8gZml4dHVyZSByZXNldCBmdW5j
dGlvbiBvbiBRVW5pdCAyLjAvMi4xLgorCQkvLyBJdCdzIHN0aWxsIGNhbGxlZCBoZXJlIGZvciBi
YWNrd2FyZHMgY29tcGF0aWJpbGl0eSBoYW5kbGluZworCQlRVW5pdC5yZXNldCgpOworCisJCWNv
bmZpZy5jdXJyZW50ID0gdW5kZWZpbmVkOworCX0sCisKKwlxdWV1ZTogZnVuY3Rpb24oKSB7CisJ
CXZhciBwcmlvcml0eSwKKwkJCXRlc3QgPSB0aGlzOworCisJCWlmICggIXRoaXMudmFsaWQoKSAp
IHsKKwkJCXJldHVybjsKKwkJfQorCisJCWZ1bmN0aW9uIHJ1bigpIHsKKworCQkJLy8gZWFjaCBv
ZiB0aGVzZSBjYW4gYnkgYXN5bmMKKwkJCXN5bmNocm9uaXplKFsKKwkJCQlmdW5jdGlvbigpIHsK
KwkJCQkJdGVzdC5iZWZvcmUoKTsKKwkJCQl9LAorCisJCQkJdGVzdC5ob29rcyggImJlZm9yZUVh
Y2giICksCisJCQkJZnVuY3Rpb24oKSB7CisJCQkJCXRlc3QucnVuKCk7CisJCQkJfSwKKworCQkJ
CXRlc3QuaG9va3MoICJhZnRlckVhY2giICkucmV2ZXJzZSgpLAorCisJCQkJZnVuY3Rpb24oKSB7
CisJCQkJCXRlc3QuYWZ0ZXIoKTsKKwkJCQl9LAorCQkJCWZ1bmN0aW9uKCkgeworCQkJCQl0ZXN0
LmZpbmlzaCgpOworCQkJCX0KKwkJCV0pOworCQl9CisKKwkJLy8gUHJpb3JpdGl6ZSBwcmV2aW91
c2x5IGZhaWxlZCB0ZXN0cywgZGV0ZWN0ZWQgZnJvbSBzZXNzaW9uU3RvcmFnZQorCQlwcmlvcml0
eSA9IFFVbml0LmNvbmZpZy5yZW9yZGVyICYmIGRlZmluZWQuc2Vzc2lvblN0b3JhZ2UgJiYKKwkJ
CQkrc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSggInF1bml0LXRlc3QtIiArIHRoaXMubW9kdWxlLm5h
bWUgKyAiLSIgKyB0aGlzLnRlc3ROYW1lICk7CisKKwkJcmV0dXJuIHN5bmNocm9uaXplKCBydW4s
IHByaW9yaXR5ICk7CisJfSwKKworCXB1c2g6IGZ1bmN0aW9uKCByZXN1bHQsIGFjdHVhbCwgZXhw
ZWN0ZWQsIG1lc3NhZ2UsIG5lZ2F0aXZlICkgeworCQl2YXIgc291cmNlLAorCQkJZGV0YWlscyA9
IHsKKwkJCQltb2R1bGU6IHRoaXMubW9kdWxlLm5hbWUsCisJCQkJbmFtZTogdGhpcy50ZXN0TmFt
ZSwKKwkJCQlyZXN1bHQ6IHJlc3VsdCwKKwkJCQltZXNzYWdlOiBtZXNzYWdlLAorCQkJCWFjdHVh
bDogYWN0dWFsLAorCQkJCWV4cGVjdGVkOiBleHBlY3RlZCwKKwkJCQl0ZXN0SWQ6IHRoaXMudGVz
dElkLAorCQkJCW5lZ2F0aXZlOiBuZWdhdGl2ZSB8fCBmYWxzZSwKKwkJCQlydW50aW1lOiBub3co
KSAtIHRoaXMuc3RhcnRlZAorCQkJfTsKKworCQlpZiAoICFyZXN1bHQgKSB7CisJCQlzb3VyY2Ug
PSBzb3VyY2VGcm9tU3RhY2t0cmFjZSgpOworCisJCQlpZiAoIHNvdXJjZSApIHsKKwkJCQlkZXRh
aWxzLnNvdXJjZSA9IHNvdXJjZTsKKwkJCX0KKwkJfQorCisJCXJ1bkxvZ2dpbmdDYWxsYmFja3Mo
ICJsb2ciLCBkZXRhaWxzICk7CisKKwkJdGhpcy5hc3NlcnRpb25zLnB1c2goeworCQkJcmVzdWx0
OiAhIXJlc3VsdCwKKwkJCW1lc3NhZ2U6IG1lc3NhZ2UKKwkJfSk7CisJfSwKKworCXB1c2hGYWls
dXJlOiBmdW5jdGlvbiggbWVzc2FnZSwgc291cmNlLCBhY3R1YWwgKSB7CisJCWlmICggISggdGhp
cyBpbnN0YW5jZW9mIFRlc3QgKSApIHsKKwkJCXRocm93IG5ldyBFcnJvciggInB1c2hGYWlsdXJl
KCkgYXNzZXJ0aW9uIG91dHNpZGUgdGVzdCBjb250ZXh0LCB3YXMgIiArCisJCQkJc291cmNlRnJv
bVN0YWNrdHJhY2UoIDIgKSApOworCQl9CisKKwkJdmFyIGRldGFpbHMgPSB7CisJCQkJbW9kdWxl
OiB0aGlzLm1vZHVsZS5uYW1lLAorCQkJCW5hbWU6IHRoaXMudGVzdE5hbWUsCisJCQkJcmVzdWx0
OiBmYWxzZSwKKwkJCQltZXNzYWdlOiBtZXNzYWdlIHx8ICJlcnJvciIsCisJCQkJYWN0dWFsOiBh
Y3R1YWwgfHwgbnVsbCwKKwkJCQl0ZXN0SWQ6IHRoaXMudGVzdElkLAorCQkJCXJ1bnRpbWU6IG5v
dygpIC0gdGhpcy5zdGFydGVkCisJCQl9OworCisJCWlmICggc291cmNlICkgeworCQkJZGV0YWls
cy5zb3VyY2UgPSBzb3VyY2U7CisJCX0KKworCQlydW5Mb2dnaW5nQ2FsbGJhY2tzKCAibG9nIiwg
ZGV0YWlscyApOworCisJCXRoaXMuYXNzZXJ0aW9ucy5wdXNoKHsKKwkJCXJlc3VsdDogZmFsc2Us
CisJCQltZXNzYWdlOiBtZXNzYWdlCisJCX0pOworCX0sCisKKwlyZXNvbHZlUHJvbWlzZTogZnVu
Y3Rpb24oIHByb21pc2UsIHBoYXNlICkgeworCQl2YXIgdGhlbiwgbWVzc2FnZSwKKwkJCXRlc3Qg
PSB0aGlzOworCQlpZiAoIHByb21pc2UgIT0gbnVsbCApIHsKKwkJCXRoZW4gPSBwcm9taXNlLnRo
ZW47CisJCQlpZiAoIFFVbml0Lm9iamVjdFR5cGUoIHRoZW4gKSA9PT0gImZ1bmN0aW9uIiApIHsK
KwkJCQlRVW5pdC5zdG9wKCk7CisJCQkJdGhlbi5jYWxsKAorCQkJCQlwcm9taXNlLAorCQkJCQlm
dW5jdGlvbigpIHsgUVVuaXQuc3RhcnQoKTsgfSwKKwkJCQkJZnVuY3Rpb24oIGVycm9yICkgewor
CQkJCQkJbWVzc2FnZSA9ICJQcm9taXNlIHJlamVjdGVkICIgKworCQkJCQkJCSggIXBoYXNlID8g
ImR1cmluZyIgOiBwaGFzZS5yZXBsYWNlKCAvRWFjaCQvLCAiIiApICkgKworCQkJCQkJCSIgIiAr
IHRlc3QudGVzdE5hbWUgKyAiOiAiICsgKCBlcnJvci5tZXNzYWdlIHx8IGVycm9yICk7CisJCQkJ
CQl0ZXN0LnB1c2hGYWlsdXJlKCBtZXNzYWdlLCBleHRyYWN0U3RhY2t0cmFjZSggZXJyb3IsIDAg
KSApOworCisJCQkJCQkvLyBlbHNlIG5leHQgdGVzdCB3aWxsIGNhcnJ5IHRoZSByZXNwb25zaWJp
bGl0eQorCQkJCQkJc2F2ZUdsb2JhbCgpOworCisJCQkJCQkvLyBVbmJsb2NrCisJCQkJCQlRVW5p
dC5zdGFydCgpOworCQkJCQl9CisJCQkJKTsKKwkJCX0KKwkJfQorCX0sCisKKwl2YWxpZDogZnVu
Y3Rpb24oKSB7CisJCXZhciBpbmNsdWRlLAorCQkJZmlsdGVyID0gY29uZmlnLmZpbHRlciAmJiBj
b25maWcuZmlsdGVyLnRvTG93ZXJDYXNlKCksCisJCQltb2R1bGUgPSBRVW5pdC51cmxQYXJhbXMu
bW9kdWxlICYmIFFVbml0LnVybFBhcmFtcy5tb2R1bGUudG9Mb3dlckNhc2UoKSwKKwkJCWZ1bGxO
YW1lID0gKCB0aGlzLm1vZHVsZS5uYW1lICsgIjogIiArIHRoaXMudGVzdE5hbWUgKS50b0xvd2Vy
Q2FzZSgpOworCisJCWZ1bmN0aW9uIHRlc3RJbk1vZHVsZUNoYWluKCB0ZXN0TW9kdWxlICkgewor
CQkJdmFyIHRlc3RNb2R1bGVOYW1lID0gdGVzdE1vZHVsZS5uYW1lID8gdGVzdE1vZHVsZS5uYW1l
LnRvTG93ZXJDYXNlKCkgOiBudWxsOworCQkJaWYgKCB0ZXN0TW9kdWxlTmFtZSA9PT0gbW9kdWxl
ICkgeworCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIGlmICggdGVzdE1vZHVsZS5wYXJlbnRN
b2R1bGUgKSB7CisJCQkJcmV0dXJuIHRlc3RJbk1vZHVsZUNoYWluKCB0ZXN0TW9kdWxlLnBhcmVu
dE1vZHVsZSApOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwor
CQkvLyBJbnRlcm5hbGx5LWdlbmVyYXRlZCB0ZXN0cyBhcmUgYWx3YXlzIHZhbGlkCisJCWlmICgg
dGhpcy5jYWxsYmFjayAmJiB0aGlzLmNhbGxiYWNrLnZhbGlkVGVzdCApIHsKKwkJCXJldHVybiB0
cnVlOworCQl9CisKKwkJaWYgKCBjb25maWcudGVzdElkLmxlbmd0aCA+IDAgJiYgaW5BcnJheSgg
dGhpcy50ZXN0SWQsIGNvbmZpZy50ZXN0SWQgKSA8IDAgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJ
CX0KKworCQlpZiAoIG1vZHVsZSAmJiAhdGVzdEluTW9kdWxlQ2hhaW4oIHRoaXMubW9kdWxlICkg
KSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoICFmaWx0ZXIgKSB7CisJCQlyZXR1
cm4gdHJ1ZTsKKwkJfQorCisJCWluY2x1ZGUgPSBmaWx0ZXIuY2hhckF0KCAwICkgIT09ICIhIjsK
KwkJaWYgKCAhaW5jbHVkZSApIHsKKwkJCWZpbHRlciA9IGZpbHRlci5zbGljZSggMSApOworCQl9
CisKKwkJLy8gSWYgdGhlIGZpbHRlciBtYXRjaGVzLCB3ZSBuZWVkIHRvIGhvbm91ciBpbmNsdWRl
CisJCWlmICggZnVsbE5hbWUuaW5kZXhPZiggZmlsdGVyICkgIT09IC0xICkgeworCQkJcmV0dXJu
IGluY2x1ZGU7CisJCX0KKworCQkvLyBPdGhlcndpc2UsIGRvIHRoZSBvcHBvc2l0ZQorCQlyZXR1
cm4gIWluY2x1ZGU7CisJfQorfTsKKworLy8gUmVzZXRzIHRoZSB0ZXN0IHNldHVwLiBVc2VmdWwg
Zm9yIHRlc3RzIHRoYXQgbW9kaWZ5IHRoZSBET00uCisvKgorREVQUkVDQVRFRDogVXNlIG11bHRp
cGxlIHRlc3RzIGluc3RlYWQgb2YgcmVzZXR0aW5nIGluc2lkZSBhIHRlc3QuCitVc2UgdGVzdFN0
YXJ0IG9yIHRlc3REb25lIGZvciBjdXN0b20gY2xlYW51cC4KK1RoaXMgbWV0aG9kIHdpbGwgdGhy
b3cgYW4gZXJyb3IgaW4gMi4wLCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDIuMQorKi8KK1FVbml0
LnJlc2V0ID0gZnVuY3Rpb24oKSB7CisKKwkvLyBSZXR1cm4gb24gbm9uLWJyb3dzZXIgZW52aXJv
bm1lbnRzCisJLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gbm90IGJyZWFrIG9uIG5vZGUgdGVzdHMK
KwlpZiAoICFkZWZpbmVkLmRvY3VtZW50ICkgeworCQlyZXR1cm47CisJfQorCisJdmFyIGZpeHR1
cmUgPSBkZWZpbmVkLmRvY3VtZW50ICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkICYmCisJCQlk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCggInF1bml0LWZpeHR1cmUiICk7CisKKwlpZiAoIGZpeHR1
cmUgKSB7CisJCWZpeHR1cmUuaW5uZXJIVE1MID0gY29uZmlnLmZpeHR1cmU7CisJfQorfTsKKwor
UVVuaXQucHVzaEZhaWx1cmUgPSBmdW5jdGlvbigpIHsKKwlpZiAoICFRVW5pdC5jb25maWcuY3Vy
cmVudCApIHsKKwkJdGhyb3cgbmV3IEVycm9yKCAicHVzaEZhaWx1cmUoKSBhc3NlcnRpb24gb3V0
c2lkZSB0ZXN0IGNvbnRleHQsIGluICIgKworCQkJc291cmNlRnJvbVN0YWNrdHJhY2UoIDIgKSAp
OworCX0KKworCS8vIEdldHMgY3VycmVudCB0ZXN0IG9iagorCXZhciBjdXJyZW50VGVzdCA9IFFV
bml0LmNvbmZpZy5jdXJyZW50OworCisJcmV0dXJuIGN1cnJlbnRUZXN0LnB1c2hGYWlsdXJlLmFw
cGx5KCBjdXJyZW50VGVzdCwgYXJndW1lbnRzICk7Cit9OworCisvLyBCYXNlZCBvbiBKYXZhJ3Mg
U3RyaW5nLmhhc2hDb2RlLCBhIHNpbXBsZSBidXQgbm90CisvLyByaWdvcm91c2x5IGNvbGxpc2lv
biByZXNpc3RhbnQgaGFzaGluZyBmdW5jdGlvbgorZnVuY3Rpb24gZ2VuZXJhdGVIYXNoKCBtb2R1
bGUsIHRlc3ROYW1lICkgeworCXZhciBoZXgsCisJCWkgPSAwLAorCQloYXNoID0gMCwKKwkJc3Ry
ID0gbW9kdWxlICsgIlx4MUMiICsgdGVzdE5hbWUsCisJCWxlbiA9IHN0ci5sZW5ndGg7CisKKwlm
b3IgKCA7IGkgPCBsZW47IGkrKyApIHsKKwkJaGFzaCAgPSAoICggaGFzaCA8PCA1ICkgLSBoYXNo
ICkgKyBzdHIuY2hhckNvZGVBdCggaSApOworCQloYXNoIHw9IDA7CisJfQorCisJLy8gQ29udmVy
dCB0aGUgcG9zc2libHkgbmVnYXRpdmUgaW50ZWdlciBoYXNoIGNvZGUgaW50byBhbiA4IGNoYXJh
Y3RlciBoZXggc3RyaW5nLCB3aGljaCBpc24ndAorCS8vIHN0cmljdGx5IG5lY2Vzc2FyeSBidXQg
aW5jcmVhc2VzIHVzZXIgdW5kZXJzdGFuZGluZyB0aGF0IHRoZSBpZCBpcyBhIFNIQS1saWtlIGhh
c2gKKwloZXggPSAoIDB4MTAwMDAwMDAwICsgaGFzaCApLnRvU3RyaW5nKCAxNiApOworCWlmICgg
aGV4Lmxlbmd0aCA8IDggKSB7CisJCWhleCA9ICIwMDAwMDAwIiArIGhleDsKKwl9CisKKwlyZXR1
cm4gaGV4LnNsaWNlKCAtOCApOworfQorCitmdW5jdGlvbiBzeW5jaHJvbml6ZSggY2FsbGJhY2ss
IHByaW9yaXR5ICkgeworCXZhciBsYXN0ID0gIXByaW9yaXR5OworCisJaWYgKCBRVW5pdC5vYmpl
Y3RUeXBlKCBjYWxsYmFjayApID09PSAiYXJyYXkiICkgeworCQl3aGlsZSAoIGNhbGxiYWNrLmxl
bmd0aCApIHsKKwkJCXN5bmNocm9uaXplKCBjYWxsYmFjay5zaGlmdCgpICk7CisJCX0KKwkJcmV0
dXJuOworCX0KKworCWlmICggcHJpb3JpdHkgKSB7CisJCXByaW9yaXR5RmlsbCggY2FsbGJhY2sg
KTsKKwl9IGVsc2UgeworCQljb25maWcucXVldWUucHVzaCggY2FsbGJhY2sgKTsKKwl9CisKKwlp
ZiAoIGNvbmZpZy5hdXRvcnVuICYmICFjb25maWcuYmxvY2tpbmcgKSB7CisJCXByb2Nlc3MoIGxh
c3QgKTsKKwl9Cit9CisKKy8vIFBsYWNlIHByZXZpb3VzbHkgZmFpbGVkIHRlc3RzIG9uIGEgcXVl
dWUgcHJpb3JpdHkgbGluZSwgcmVzcGVjdGluZyB0aGUgb3JkZXIgdGhleSBnZXQgYXNzaWduZWQu
CitmdW5jdGlvbiBwcmlvcml0eUZpbGwoIGNhbGxiYWNrICkgeworCXZhciBxdWV1ZSwgcHJpb3Jp
dGl6ZWRRdWV1ZTsKKworCXF1ZXVlID0gY29uZmlnLnF1ZXVlLnNsaWNlKCBwcmlvcml0eUZpbGwu
cG9zICk7CisJcHJpb3JpdGl6ZWRRdWV1ZSA9IGNvbmZpZy5xdWV1ZS5zbGljZSggMCwgLWNvbmZp
Zy5xdWV1ZS5sZW5ndGggKyBwcmlvcml0eUZpbGwucG9zICk7CisKKwlxdWV1ZS51bnNoaWZ0KCBj
YWxsYmFjayApOworCXF1ZXVlLnVuc2hpZnQuYXBwbHkoIHF1ZXVlLCBwcmlvcml0aXplZFF1ZXVl
ICk7CisKKwljb25maWcucXVldWUgPSBxdWV1ZTsKKworCXByaW9yaXR5RmlsbC5wb3MgKz0gMTsK
K30KK3ByaW9yaXR5RmlsbC5wb3MgPSAwOworCitmdW5jdGlvbiBzYXZlR2xvYmFsKCkgeworCWNv
bmZpZy5wb2xsdXRpb24gPSBbXTsKKworCWlmICggY29uZmlnLm5vZ2xvYmFscyApIHsKKwkJZm9y
ICggdmFyIGtleSBpbiBnbG9iYWwgKSB7CisJCQlpZiAoIGhhc093bi5jYWxsKCBnbG9iYWwsIGtl
eSApICkgeworCisJCQkJLy8gaW4gT3BlcmEgc29tZXRpbWVzIERPTSBlbGVtZW50IGlkcyBzaG93
IHVwIGhlcmUsIGlnbm9yZSB0aGVtCisJCQkJaWYgKCAvXnF1bml0LXRlc3Qtb3V0cHV0Ly50ZXN0
KCBrZXkgKSApIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWNvbmZpZy5wb2xsdXRpb24u
cHVzaCgga2V5ICk7CisJCQl9CisJCX0KKwl9Cit9CisKK2Z1bmN0aW9uIGNoZWNrUG9sbHV0aW9u
KCkgeworCXZhciBuZXdHbG9iYWxzLAorCQlkZWxldGVkR2xvYmFscywKKwkJb2xkID0gY29uZmln
LnBvbGx1dGlvbjsKKworCXNhdmVHbG9iYWwoKTsKKworCW5ld0dsb2JhbHMgPSBkaWZmKCBjb25m
aWcucG9sbHV0aW9uLCBvbGQgKTsKKwlpZiAoIG5ld0dsb2JhbHMubGVuZ3RoID4gMCApIHsKKwkJ
UVVuaXQucHVzaEZhaWx1cmUoICJJbnRyb2R1Y2VkIGdsb2JhbCB2YXJpYWJsZShzKTogIiArIG5l
d0dsb2JhbHMuam9pbiggIiwgIiApICk7CisJfQorCisJZGVsZXRlZEdsb2JhbHMgPSBkaWZmKCBv
bGQsIGNvbmZpZy5wb2xsdXRpb24gKTsKKwlpZiAoIGRlbGV0ZWRHbG9iYWxzLmxlbmd0aCA+IDAg
KSB7CisJCVFVbml0LnB1c2hGYWlsdXJlKCAiRGVsZXRlZCBnbG9iYWwgdmFyaWFibGUocyk6ICIg
KyBkZWxldGVkR2xvYmFscy5qb2luKCAiLCAiICkgKTsKKwl9Cit9CisKKy8vIFdpbGwgYmUgZXhw
b3NlZCBhcyBRVW5pdC5hc3luY1Rlc3QKK2Z1bmN0aW9uIGFzeW5jVGVzdCggdGVzdE5hbWUsIGV4
cGVjdGVkLCBjYWxsYmFjayApIHsKKwlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgKSB7CisJ
CWNhbGxiYWNrID0gZXhwZWN0ZWQ7CisJCWV4cGVjdGVkID0gbnVsbDsKKwl9CisKKwlRVW5pdC50
ZXN0KCB0ZXN0TmFtZSwgZXhwZWN0ZWQsIGNhbGxiYWNrLCB0cnVlICk7Cit9CisKKy8vIFdpbGwg
YmUgZXhwb3NlZCBhcyBRVW5pdC50ZXN0CitmdW5jdGlvbiB0ZXN0KCB0ZXN0TmFtZSwgZXhwZWN0
ZWQsIGNhbGxiYWNrLCBhc3luYyApIHsKKwlpZiAoIGZvY3VzZWQgKSAgeyByZXR1cm47IH0KKwor
CXZhciBuZXdUZXN0OworCisJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyICkgeworCQljYWxs
YmFjayA9IGV4cGVjdGVkOworCQlleHBlY3RlZCA9IG51bGw7CisJfQorCisJbmV3VGVzdCA9IG5l
dyBUZXN0KHsKKwkJdGVzdE5hbWU6IHRlc3ROYW1lLAorCQlleHBlY3RlZDogZXhwZWN0ZWQsCisJ
CWFzeW5jOiBhc3luYywKKwkJY2FsbGJhY2s6IGNhbGxiYWNrCisJfSk7CisKKwluZXdUZXN0LnF1
ZXVlKCk7Cit9CisKKy8vIFdpbGwgYmUgZXhwb3NlZCBhcyBRVW5pdC5za2lwCitmdW5jdGlvbiBz
a2lwKCB0ZXN0TmFtZSApIHsKKwlpZiAoIGZvY3VzZWQgKSAgeyByZXR1cm47IH0KKworCXZhciB0
ZXN0ID0gbmV3IFRlc3QoeworCQl0ZXN0TmFtZTogdGVzdE5hbWUsCisJCXNraXA6IHRydWUKKwl9
KTsKKworCXRlc3QucXVldWUoKTsKK30KKworLy8gV2lsbCBiZSBleHBvc2VkIGFzIFFVbml0Lm9u
bHkKK2Z1bmN0aW9uIG9ubHkoIHRlc3ROYW1lLCBleHBlY3RlZCwgY2FsbGJhY2ssIGFzeW5jICkg
eworCXZhciBuZXdUZXN0OworCisJaWYgKCBmb2N1c2VkICkgIHsgcmV0dXJuOyB9CisKKwlRVW5p
dC5jb25maWcucXVldWUubGVuZ3RoID0gMDsKKwlmb2N1c2VkID0gdHJ1ZTsKKworCWlmICggYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMiApIHsKKwkJY2FsbGJhY2sgPSBleHBlY3RlZDsKKwkJZXhwZWN0
ZWQgPSBudWxsOworCX0KKworCW5ld1Rlc3QgPSBuZXcgVGVzdCh7CisJCXRlc3ROYW1lOiB0ZXN0
TmFtZSwKKwkJZXhwZWN0ZWQ6IGV4cGVjdGVkLAorCQlhc3luYzogYXN5bmMsCisJCWNhbGxiYWNr
OiBjYWxsYmFjaworCX0pOworCisJbmV3VGVzdC5xdWV1ZSgpOworfQorCitmdW5jdGlvbiBBc3Nl
cnQoIHRlc3RDb250ZXh0ICkgeworCXRoaXMudGVzdCA9IHRlc3RDb250ZXh0OworfQorCisvLyBB
c3NlcnQgaGVscGVycworUVVuaXQuYXNzZXJ0ID0gQXNzZXJ0LnByb3RvdHlwZSA9IHsKKworCS8v
IFNwZWNpZnkgdGhlIG51bWJlciBvZiBleHBlY3RlZCBhc3NlcnRpb25zIHRvIGd1YXJhbnRlZSB0
aGF0IGZhaWxlZCB0ZXN0CisJLy8gKG5vIGFzc2VydGlvbnMgYXJlIHJ1biBhdCBhbGwpIGRvbid0
IHNsaXAgdGhyb3VnaC4KKwlleHBlY3Q6IGZ1bmN0aW9uKCBhc3NlcnRzICkgeworCQlpZiAoIGFy
Z3VtZW50cy5sZW5ndGggPT09IDEgKSB7CisJCQl0aGlzLnRlc3QuZXhwZWN0ZWQgPSBhc3NlcnRz
OworCQl9IGVsc2UgeworCQkJcmV0dXJuIHRoaXMudGVzdC5leHBlY3RlZDsKKwkJfQorCX0sCisK
KwkvLyBJbmNyZW1lbnQgdGhpcyBUZXN0J3Mgc2VtYXBob3JlIGNvdW50ZXIsIHRoZW4gcmV0dXJu
IGEgZnVuY3Rpb24gdGhhdAorCS8vIGRlY3JlbWVudHMgdGhhdCBjb3VudGVyIGEgbWF4aW11bSBv
ZiBvbmNlLgorCWFzeW5jOiBmdW5jdGlvbiggY291bnQgKSB7CisJCXZhciB0ZXN0ID0gdGhpcy50
ZXN0LAorCQkJcG9wcGVkID0gZmFsc2UsCisJCQlhY2NlcHRDYWxsQ291bnQgPSBjb3VudDsKKwor
CQlpZiAoIHR5cGVvZiBhY2NlcHRDYWxsQ291bnQgPT09ICJ1bmRlZmluZWQiICkgeworCQkJYWNj
ZXB0Q2FsbENvdW50ID0gMTsKKwkJfQorCisJCXRlc3Quc2VtYXBob3JlICs9IDE7CisJCXRlc3Qu
dXNlZEFzeW5jID0gdHJ1ZTsKKwkJcGF1c2VQcm9jZXNzaW5nKCk7CisKKwkJcmV0dXJuIGZ1bmN0
aW9uIGRvbmUoKSB7CisKKwkJCWlmICggcG9wcGVkICkgeworCQkJCXRlc3QucHVzaEZhaWx1cmUo
ICJUb28gbWFueSBjYWxscyB0byB0aGUgYGFzc2VydC5hc3luY2AgY2FsbGJhY2siLAorCQkJCQlz
b3VyY2VGcm9tU3RhY2t0cmFjZSggMiApICk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYWNjZXB0
Q2FsbENvdW50IC09IDE7CisJCQlpZiAoIGFjY2VwdENhbGxDb3VudCA+IDAgKSB7CisJCQkJcmV0
dXJuOworCQkJfQorCisJCQl0ZXN0LnNlbWFwaG9yZSAtPSAxOworCQkJcG9wcGVkID0gdHJ1ZTsK
KwkJCXJlc3VtZVByb2Nlc3NpbmcoKTsKKwkJfTsKKwl9LAorCisJLy8gRXhwb3J0cyB0ZXN0LnB1
c2goKSB0byB0aGUgdXNlciBBUEkKKwlwdXNoOiBmdW5jdGlvbiggLyogcmVzdWx0LCBhY3R1YWws
IGV4cGVjdGVkLCBtZXNzYWdlLCBuZWdhdGl2ZSAqLyApIHsKKwkJdmFyIGFzc2VydCA9IHRoaXMs
CisJCQljdXJyZW50VGVzdCA9ICggYXNzZXJ0IGluc3RhbmNlb2YgQXNzZXJ0ICYmIGFzc2VydC50
ZXN0ICkgfHwgUVVuaXQuY29uZmlnLmN1cnJlbnQ7CisKKwkJLy8gQmFja3dhcmRzIGNvbXBhdGli
aWxpdHkgZml4LgorCQkvLyBBbGxvd3MgdGhlIGRpcmVjdCB1c2Ugb2YgZ2xvYmFsIGV4cG9ydGVk
IGFzc2VydGlvbnMgYW5kIFFVbml0LmFzc2VydC4qCisJCS8vIEFsdGhvdWdoLCBpdCdzIHVzZSBp
cyBub3QgcmVjb21tZW5kZWQgYXMgaXQgY2FuIGxlYWsgYXNzZXJ0aW9ucworCQkvLyB0byBvdGhl
ciB0ZXN0cyBmcm9tIGFzeW5jIHRlc3RzLCBiZWNhdXNlIHdlIG9ubHkgZ2V0IGEgcmVmZXJlbmNl
IHRvIHRoZSBjdXJyZW50IHRlc3QsCisJCS8vIG5vdCBleGFjdGx5IHRoZSB0ZXN0IHdoZXJlIGFz
c2VydGlvbiB3ZXJlIGludGVuZGVkIHRvIGJlIGNhbGxlZC4KKwkJaWYgKCAhY3VycmVudFRlc3Qg
KSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoICJhc3NlcnRpb24gb3V0c2lkZSB0ZXN0IGNvbnRleHQs
IGluICIgKyBzb3VyY2VGcm9tU3RhY2t0cmFjZSggMiApICk7CisJCX0KKworCQlpZiAoIGN1cnJl
bnRUZXN0LnVzZWRBc3luYyA9PT0gdHJ1ZSAmJiBjdXJyZW50VGVzdC5zZW1hcGhvcmUgPT09IDAg
KSB7CisJCQljdXJyZW50VGVzdC5wdXNoRmFpbHVyZSggIkFzc2VydGlvbiBhZnRlciB0aGUgZmlu
YWwgYGFzc2VydC5hc3luY2Agd2FzIHJlc29sdmVkIiwKKwkJCQlzb3VyY2VGcm9tU3RhY2t0cmFj
ZSggMiApICk7CisKKwkJCS8vIEFsbG93IHRoaXMgYXNzZXJ0aW9uIHRvIGNvbnRpbnVlIHJ1bm5p
bmcgYW55d2F5Li4uCisJCX0KKworCQlpZiAoICEoIGFzc2VydCBpbnN0YW5jZW9mIEFzc2VydCAp
ICkgeworCQkJYXNzZXJ0ID0gY3VycmVudFRlc3QuYXNzZXJ0OworCQl9CisJCXJldHVybiBhc3Nl
cnQudGVzdC5wdXNoLmFwcGx5KCBhc3NlcnQudGVzdCwgYXJndW1lbnRzICk7CisJfSwKKworCW9r
OiBmdW5jdGlvbiggcmVzdWx0LCBtZXNzYWdlICkgeworCQltZXNzYWdlID0gbWVzc2FnZSB8fCAo
IHJlc3VsdCA/ICJva2F5IiA6ICJmYWlsZWQsIGV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIHRydXRo
eSwgd2FzOiAiICsKKwkJCVFVbml0LmR1bXAucGFyc2UoIHJlc3VsdCApICk7CisJCXRoaXMucHVz
aCggISFyZXN1bHQsIHJlc3VsdCwgdHJ1ZSwgbWVzc2FnZSApOworCX0sCisKKwlub3RPazogZnVu
Y3Rpb24oIHJlc3VsdCwgbWVzc2FnZSApIHsKKwkJbWVzc2FnZSA9IG1lc3NhZ2UgfHwgKCAhcmVz
dWx0ID8gIm9rYXkiIDogImZhaWxlZCwgZXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgZmFsc3ksIHdh
czogIiArCisJCQlRVW5pdC5kdW1wLnBhcnNlKCByZXN1bHQgKSApOworCQl0aGlzLnB1c2goICFy
ZXN1bHQsIHJlc3VsdCwgZmFsc2UsIG1lc3NhZ2UsIHRydWUgKTsKKwl9LAorCisJZXF1YWw6IGZ1
bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQkvKmpzaGludCBlcWVxZXE6
ZmFsc2UgKi8KKwkJdGhpcy5wdXNoKCBleHBlY3RlZCA9PSBhY3R1YWwsIGFjdHVhbCwgZXhwZWN0
ZWQsIG1lc3NhZ2UgKTsKKwl9LAorCisJbm90RXF1YWw6IGZ1bmN0aW9uKCBhY3R1YWwsIGV4cGVj
dGVkLCBtZXNzYWdlICkgeworCQkvKmpzaGludCBlcWVxZXE6ZmFsc2UgKi8KKwkJdGhpcy5wdXNo
KCBleHBlY3RlZCAhPSBhY3R1YWwsIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIHRydWUgKTsK
Kwl9LAorCisJcHJvcEVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSAp
IHsKKwkJYWN0dWFsID0gb2JqZWN0VmFsdWVzKCBhY3R1YWwgKTsKKwkJZXhwZWN0ZWQgPSBvYmpl
Y3RWYWx1ZXMoIGV4cGVjdGVkICk7CisJCXRoaXMucHVzaCggUVVuaXQuZXF1aXYoIGFjdHVhbCwg
ZXhwZWN0ZWQgKSwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApOworCX0sCisKKwlub3RQcm9w
RXF1YWw6IGZ1bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQlhY3R1YWwg
PSBvYmplY3RWYWx1ZXMoIGFjdHVhbCApOworCQlleHBlY3RlZCA9IG9iamVjdFZhbHVlcyggZXhw
ZWN0ZWQgKTsKKwkJdGhpcy5wdXNoKCAhUVVuaXQuZXF1aXYoIGFjdHVhbCwgZXhwZWN0ZWQgKSwg
YWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgdHJ1ZSApOworCX0sCisKKwlkZWVwRXF1YWw6IGZ1
bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQl0aGlzLnB1c2goIFFVbml0
LmVxdWl2KCBhY3R1YWwsIGV4cGVjdGVkICksIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKTsK
Kwl9LAorCisJbm90RGVlcEVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2Fn
ZSApIHsKKwkJdGhpcy5wdXNoKCAhUVVuaXQuZXF1aXYoIGFjdHVhbCwgZXhwZWN0ZWQgKSwgYWN0
dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgdHJ1ZSApOworCX0sCisKKwlzdHJpY3RFcXVhbDogZnVu
Y3Rpb24oIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKSB7CisJCXRoaXMucHVzaCggZXhwZWN0
ZWQgPT09IGFjdHVhbCwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApOworCX0sCisKKwlub3RT
dHJpY3RFcXVhbDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKSB7CisJCXRo
aXMucHVzaCggZXhwZWN0ZWQgIT09IGFjdHVhbCwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwg
dHJ1ZSApOworCX0sCisKKwkidGhyb3dzIjogZnVuY3Rpb24oIGJsb2NrLCBleHBlY3RlZCwgbWVz
c2FnZSApIHsKKwkJdmFyIGFjdHVhbCwgZXhwZWN0ZWRUeXBlLAorCQkJZXhwZWN0ZWRPdXRwdXQg
PSBleHBlY3RlZCwKKwkJCW9rID0gZmFsc2UsCisJCQljdXJyZW50VGVzdCA9ICggdGhpcyBpbnN0
YW5jZW9mIEFzc2VydCAmJiB0aGlzLnRlc3QgKSB8fCBRVW5pdC5jb25maWcuY3VycmVudDsKKwor
CQkvLyAnZXhwZWN0ZWQnIGlzIG9wdGlvbmFsIHVubGVzcyBkb2luZyBzdHJpbmcgY29tcGFyaXNv
bgorCQlpZiAoIG1lc3NhZ2UgPT0gbnVsbCAmJiB0eXBlb2YgZXhwZWN0ZWQgPT09ICJzdHJpbmci
ICkgeworCQkJbWVzc2FnZSA9IGV4cGVjdGVkOworCQkJZXhwZWN0ZWQgPSBudWxsOworCQl9CisK
KwkJY3VycmVudFRlc3QuaWdub3JlR2xvYmFsRXJyb3JzID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCWJs
b2NrLmNhbGwoIGN1cnJlbnRUZXN0LnRlc3RFbnZpcm9ubWVudCApOworCQl9IGNhdGNoIChlKSB7
CisJCQlhY3R1YWwgPSBlOworCQl9CisJCWN1cnJlbnRUZXN0Lmlnbm9yZUdsb2JhbEVycm9ycyA9
IGZhbHNlOworCisJCWlmICggYWN0dWFsICkgeworCQkJZXhwZWN0ZWRUeXBlID0gUVVuaXQub2Jq
ZWN0VHlwZSggZXhwZWN0ZWQgKTsKKworCQkJLy8gd2UgZG9uJ3Qgd2FudCB0byB2YWxpZGF0ZSB0
aHJvd24gZXJyb3IKKwkJCWlmICggIWV4cGVjdGVkICkgeworCQkJCW9rID0gdHJ1ZTsKKwkJCQll
eHBlY3RlZE91dHB1dCA9IG51bGw7CisKKwkJCS8vIGV4cGVjdGVkIGlzIGEgcmVnZXhwCisJCQl9
IGVsc2UgaWYgKCBleHBlY3RlZFR5cGUgPT09ICJyZWdleHAiICkgeworCQkJCW9rID0gZXhwZWN0
ZWQudGVzdCggZXJyb3JTdHJpbmcoIGFjdHVhbCApICk7CisKKwkJCS8vIGV4cGVjdGVkIGlzIGEg
c3RyaW5nCisJCQl9IGVsc2UgaWYgKCBleHBlY3RlZFR5cGUgPT09ICJzdHJpbmciICkgeworCQkJ
CW9rID0gZXhwZWN0ZWQgPT09IGVycm9yU3RyaW5nKCBhY3R1YWwgKTsKKworCQkJLy8gZXhwZWN0
ZWQgaXMgYSBjb25zdHJ1Y3RvciwgbWF5YmUgYW4gRXJyb3IgY29uc3RydWN0b3IKKwkJCX0gZWxz
ZSBpZiAoIGV4cGVjdGVkVHlwZSA9PT0gImZ1bmN0aW9uIiAmJiBhY3R1YWwgaW5zdGFuY2VvZiBl
eHBlY3RlZCApIHsKKwkJCQlvayA9IHRydWU7CisKKwkJCS8vIGV4cGVjdGVkIGlzIGFuIEVycm9y
IG9iamVjdAorCQkJfSBlbHNlIGlmICggZXhwZWN0ZWRUeXBlID09PSAib2JqZWN0IiApIHsKKwkJ
CQlvayA9IGFjdHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkLmNvbnN0cnVjdG9yICYmCisJCQkJCWFj
dHVhbC5uYW1lID09PSBleHBlY3RlZC5uYW1lICYmCisJCQkJCWFjdHVhbC5tZXNzYWdlID09PSBl
eHBlY3RlZC5tZXNzYWdlOworCisJCQkvLyBleHBlY3RlZCBpcyBhIHZhbGlkYXRpb24gZnVuY3Rp
b24gd2hpY2ggcmV0dXJucyB0cnVlIGlmIHZhbGlkYXRpb24gcGFzc2VkCisJCQl9IGVsc2UgaWYg
KCBleHBlY3RlZFR5cGUgPT09ICJmdW5jdGlvbiIgJiYgZXhwZWN0ZWQuY2FsbCgge30sIGFjdHVh
bCApID09PSB0cnVlICkgeworCQkJCWV4cGVjdGVkT3V0cHV0ID0gbnVsbDsKKwkJCQlvayA9IHRy
dWU7CisJCQl9CisJCX0KKworCQljdXJyZW50VGVzdC5hc3NlcnQucHVzaCggb2ssIGFjdHVhbCwg
ZXhwZWN0ZWRPdXRwdXQsIG1lc3NhZ2UgKTsKKwl9Cit9OworCisvLyBQcm92aWRlIGFuIGFsdGVy
bmF0aXZlIHRvIGFzc2VydC50aHJvd3MoKSwgZm9yIGVudmlyb25tZW50cyB0aGF0IGNvbnNpZGVy
IHRocm93cyBhIHJlc2VydmVkIHdvcmQKKy8vIEtub3duIHRvIHVzIGFyZTogQ2xvc3VyZSBDb21w
aWxlciwgTmFyd2hhbAorKGZ1bmN0aW9uKCkgeworCS8qanNoaW50IHN1Yjp0cnVlICovCisJQXNz
ZXJ0LnByb3RvdHlwZS5yYWlzZXMgPSBBc3NlcnQucHJvdG90eXBlWyAidGhyb3dzIiBdOworfSgp
KTsKKworZnVuY3Rpb24gZXJyb3JTdHJpbmcoIGVycm9yICkgeworCXZhciBuYW1lLCBtZXNzYWdl
LAorCQlyZXN1bHRFcnJvclN0cmluZyA9IGVycm9yLnRvU3RyaW5nKCk7CisJaWYgKCByZXN1bHRF
cnJvclN0cmluZy5zdWJzdHJpbmcoIDAsIDcgKSA9PT0gIltvYmplY3QiICkgeworCQluYW1lID0g
ZXJyb3IubmFtZSA/IGVycm9yLm5hbWUudG9TdHJpbmcoKSA6ICJFcnJvciI7CisJCW1lc3NhZ2Ug
PSBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZS50b1N0cmluZygpIDogIiI7CisJCWlmICgg
bmFtZSAmJiBtZXNzYWdlICkgeworCQkJcmV0dXJuIG5hbWUgKyAiOiAiICsgbWVzc2FnZTsKKwkJ
fSBlbHNlIGlmICggbmFtZSApIHsKKwkJCXJldHVybiBuYW1lOworCQl9IGVsc2UgaWYgKCBtZXNz
YWdlICkgeworCQkJcmV0dXJuIG1lc3NhZ2U7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gIkVycm9y
IjsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiByZXN1bHRFcnJvclN0cmluZzsKKwl9Cit9CisK
Ky8vIFRlc3QgZm9yIGVxdWFsaXR5IGFueSBKYXZhU2NyaXB0IHR5cGUuCisvLyBBdXRob3I6IFBo
aWxpcHBlIFJhdGjDqSA8cHJhdGhlQGdtYWlsLmNvbT4KK1FVbml0LmVxdWl2ID0gKGZ1bmN0aW9u
KCkgeworCisJLy8gU3RhY2sgdG8gZGVjaWRlIGJldHdlZW4gc2tpcC9hYm9ydCBmdW5jdGlvbnMK
Kwl2YXIgY2FsbGVycyA9IFtdOworCisJLy8gU3RhY2sgdG8gYXZvaWRpbmcgbG9vcHMgZnJvbSBj
aXJjdWxhciByZWZlcmVuY2luZworCXZhciBwYXJlbnRzID0gW107CisJdmFyIHBhcmVudHNCID0g
W107CisKKwlmdW5jdGlvbiB1c2VTdHJpY3RFcXVhbGl0eSggYiwgYSApIHsKKworCQkvKmpzaGlu
dCBlcWVxZXE6ZmFsc2UgKi8KKwkJaWYgKCBiIGluc3RhbmNlb2YgYS5jb25zdHJ1Y3RvciB8fCBh
IGluc3RhbmNlb2YgYi5jb25zdHJ1Y3RvciApIHsKKworCQkJLy8gVG8gY2F0Y2ggc2hvcnQgYW5u
b3RhdGlvbiBWUyAnbmV3JyBhbm5vdGF0aW9uIG9mIGEgZGVjbGFyYXRpb24uIGUuZy46CisJCQkv
LyBgdmFyIGkgPSAxO2AKKwkJCS8vIGB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7YAorCQkJcmV0dXJu
IGEgPT0gYjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBhID09PSBiOworCQl9CisJfQorCisJZnVu
Y3Rpb24gY29tcGFyZUNvbnN0cnVjdG9ycyggYSwgYiApIHsKKwkJdmFyIGdldFByb3RvID0gT2Jq
ZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKCBvYmogKSB7CisKKwkJCS8qanNoaW50IHBy
b3RvOiB0cnVlICovCisJCQlyZXR1cm4gb2JqLl9fcHJvdG9fXzsKKwkJfTsKKwkJdmFyIHByb3Rv
QSA9IGdldFByb3RvKCBhICk7CisJCXZhciBwcm90b0IgPSBnZXRQcm90byggYiApOworCisJCS8v
IENvbXBhcmluZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBgaW5zdGFu
Y2VvZmAKKwkJaWYgKCBhLmNvbnN0cnVjdG9yID09PSBiLmNvbnN0cnVjdG9yICkgeworCQkJcmV0
dXJuIHRydWU7CisJCX0KKworCQkvLyBSZWYgIzg1MQorCQkvLyBJZiB0aGUgb2JqIHByb3RvdHlw
ZSBkZXNjZW5kcyBmcm9tIGEgbnVsbCBjb25zdHJ1Y3RvciwgdHJlYXQgaXQKKwkJLy8gYXMgYSBu
dWxsIHByb3RvdHlwZS4KKwkJaWYgKCBwcm90b0EgJiYgcHJvdG9BLmNvbnN0cnVjdG9yID09PSBu
dWxsICkgeworCQkJcHJvdG9BID0gbnVsbDsKKwkJfQorCQlpZiAoIHByb3RvQiAmJiBwcm90b0Iu
Y29uc3RydWN0b3IgPT09IG51bGwgKSB7CisJCQlwcm90b0IgPSBudWxsOworCQl9CisKKwkJLy8g
QWxsb3cgb2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSB0byBiZSBlcXVpdmFsZW50IHRvCisJCS8v
IG9iamVjdHMgd2l0aCBPYmplY3QgYXMgdGhlaXIgY29uc3RydWN0b3IuCisJCWlmICggKCBwcm90
b0EgPT09IG51bGwgJiYgcHJvdG9CID09PSBPYmplY3QucHJvdG90eXBlICkgfHwKKwkJCQkoIHBy
b3RvQiA9PT0gbnVsbCAmJiBwcm90b0EgPT09IE9iamVjdC5wcm90b3R5cGUgKSApIHsKKwkJCXJl
dHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXZhciBjYWxsYmFja3Mg
PSB7CisJCSJzdHJpbmciOiB1c2VTdHJpY3RFcXVhbGl0eSwKKwkJImJvb2xlYW4iOiB1c2VTdHJp
Y3RFcXVhbGl0eSwKKwkJIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAorCQkibnVsbCI6IHVz
ZVN0cmljdEVxdWFsaXR5LAorCQkidW5kZWZpbmVkIjogdXNlU3RyaWN0RXF1YWxpdHksCisJCSJz
eW1ib2wiOiB1c2VTdHJpY3RFcXVhbGl0eSwKKworCQkibmFuIjogZnVuY3Rpb24oIGIgKSB7CisJ
CQlyZXR1cm4gaXNOYU4oIGIgKTsKKwkJfSwKKworCQkiZGF0ZSI6IGZ1bmN0aW9uKCBiLCBhICkg
eworCQkJcmV0dXJuIFFVbml0Lm9iamVjdFR5cGUoIGIgKSA9PT0gImRhdGUiICYmIGEudmFsdWVP
ZigpID09PSBiLnZhbHVlT2YoKTsKKwkJfSwKKworCQkicmVnZXhwIjogZnVuY3Rpb24oIGIsIGEg
KSB7CisJCQlyZXR1cm4gUVVuaXQub2JqZWN0VHlwZSggYiApID09PSAicmVnZXhwIiAmJgorCisJ
CQkJLy8gVGhlIHJlZ2V4IGl0c2VsZgorCQkJCWEuc291cmNlID09PSBiLnNvdXJjZSAmJgorCisJ
CQkJLy8gQW5kIGl0cyBtb2RpZmllcnMKKwkJCQlhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYKKwor
CQkJCS8vIChnbWkpIC4uLgorCQkJCWEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCisJ
CQkJYS5tdWx0aWxpbmUgPT09IGIubXVsdGlsaW5lICYmCisJCQkJYS5zdGlja3kgPT09IGIuc3Rp
Y2t5OworCQl9LAorCisJCS8vIC0gc2tpcCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBhIG1ldGhvZCBv
ZiBhbiBpbnN0YW5jZSAoT09QKQorCQkvLyAtIGFib3J0IG90aGVyd2lzZSwKKwkJLy8gaW5pdGlh
bCA9PT0gd291bGQgaGF2ZSBjYXRjaCBpZGVudGljYWwgcmVmZXJlbmNlcyBhbnl3YXkKKwkJImZ1
bmN0aW9uIjogZnVuY3Rpb24oKSB7CisJCQl2YXIgY2FsbGVyID0gY2FsbGVyc1sgY2FsbGVycy5s
ZW5ndGggLSAxIF07CisJCQlyZXR1cm4gY2FsbGVyICE9PSBPYmplY3QgJiYgdHlwZW9mIGNhbGxl
ciAhPT0gInVuZGVmaW5lZCI7CisJCX0sCisKKwkJImFycmF5IjogZnVuY3Rpb24oIGIsIGEgKSB7
CisJCQl2YXIgaSwgaiwgbGVuLCBsb29wLCBhQ2lyY3VsYXIsIGJDaXJjdWxhcjsKKworCQkJLy8g
YiBjb3VsZCBiZSBhbiBvYmplY3QgbGl0ZXJhbCBoZXJlCisJCQlpZiAoIFFVbml0Lm9iamVjdFR5
cGUoIGIgKSAhPT0gImFycmF5IiApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWxl
biA9IGEubGVuZ3RoOworCQkJaWYgKCBsZW4gIT09IGIubGVuZ3RoICkgeworCQkJCS8vIHNhZmUg
YW5kIGZhc3RlcgorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJLy8gVHJhY2sgcmVmZXJl
bmNlIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMKKwkJCXBhcmVudHMucHVzaCggYSApOwor
CQkJcGFyZW50c0IucHVzaCggYiApOworCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsK
KwkJCQlsb29wID0gZmFsc2U7CisJCQkJZm9yICggaiA9IDA7IGogPCBwYXJlbnRzLmxlbmd0aDsg
aisrICkgeworCQkJCQlhQ2lyY3VsYXIgPSBwYXJlbnRzWyBqIF0gPT09IGFbIGkgXTsKKwkJCQkJ
YkNpcmN1bGFyID0gcGFyZW50c0JbIGogXSA9PT0gYlsgaSBdOworCQkJCQlpZiAoIGFDaXJjdWxh
ciB8fCBiQ2lyY3VsYXIgKSB7CisJCQkJCQlpZiAoIGFbIGkgXSA9PT0gYlsgaSBdIHx8IGFDaXJj
dWxhciAmJiBiQ2lyY3VsYXIgKSB7CisJCQkJCQkJbG9vcCA9IHRydWU7CisJCQkJCQl9IGVsc2Ug
eworCQkJCQkJCXBhcmVudHMucG9wKCk7CisJCQkJCQkJcGFyZW50c0IucG9wKCk7CisJCQkJCQkJ
cmV0dXJuIGZhbHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmICggIWxvb3AgJiYg
IWlubmVyRXF1aXYoIGFbIGkgXSwgYlsgaSBdICkgKSB7CisJCQkJCXBhcmVudHMucG9wKCk7CisJ
CQkJCXBhcmVudHNCLnBvcCgpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJ
cGFyZW50cy5wb3AoKTsKKwkJCXBhcmVudHNCLnBvcCgpOworCQkJcmV0dXJuIHRydWU7CisJCX0s
CisKKwkJInNldCI6IGZ1bmN0aW9uKCBiLCBhICkgeworCQkJdmFyIGFBcnJheSwgYkFycmF5Owor
CisJCQkvLyBgYmAgY291bGQgYmUgYW55IG9iamVjdCBoZXJlCisJCQlpZiAoIFFVbml0Lm9iamVj
dFR5cGUoIGIgKSAhPT0gInNldCIgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlh
QXJyYXkgPSBbXTsKKwkJCWEuZm9yRWFjaCggZnVuY3Rpb24oIHYgKSB7CisJCQkJYUFycmF5LnB1
c2goIHYgKTsKKwkJCX0pOworCQkJYkFycmF5ID0gW107CisJCQliLmZvckVhY2goIGZ1bmN0aW9u
KCB2ICkgeworCQkJCWJBcnJheS5wdXNoKCB2ICk7CisJCQl9KTsKKworCQkJcmV0dXJuIGlubmVy
RXF1aXYoIGJBcnJheSwgYUFycmF5ICk7CisJCX0sCisKKwkJIm1hcCI6IGZ1bmN0aW9uKCBiLCBh
ICkgeworCQkJdmFyIGFBcnJheSwgYkFycmF5OworCisJCQkvLyBgYmAgY291bGQgYmUgYW55IG9i
amVjdCBoZXJlCisJCQlpZiAoIFFVbml0Lm9iamVjdFR5cGUoIGIgKSAhPT0gIm1hcCIgKSB7CisJ
CQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlhQXJyYXkgPSBbXTsKKwkJCWEuZm9yRWFjaCgg
ZnVuY3Rpb24oIHYsIGsgKSB7CisJCQkJYUFycmF5LnB1c2goIFsgaywgdiBdICk7CisJCQl9KTsK
KwkJCWJBcnJheSA9IFtdOworCQkJYi5mb3JFYWNoKCBmdW5jdGlvbiggdiwgayApIHsKKwkJCQli
QXJyYXkucHVzaCggWyBrLCB2IF0gKTsKKwkJCX0pOworCisJCQlyZXR1cm4gaW5uZXJFcXVpdigg
YkFycmF5LCBhQXJyYXkgKTsKKwkJfSwKKworCQkib2JqZWN0IjogZnVuY3Rpb24oIGIsIGEgKSB7
CisJCQl2YXIgaSwgaiwgbG9vcCwgYUNpcmN1bGFyLCBiQ2lyY3VsYXI7CisKKwkJCS8vIERlZmF1
bHQgdG8gdHJ1ZQorCQkJdmFyIGVxID0gdHJ1ZTsKKwkJCXZhciBhUHJvcGVydGllcyA9IFtdOwor
CQkJdmFyIGJQcm9wZXJ0aWVzID0gW107CisKKwkJCWlmICggY29tcGFyZUNvbnN0cnVjdG9ycygg
YSwgYiApID09PSBmYWxzZSApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCS8vIFN0
YWNrIGNvbnN0cnVjdG9yIGJlZm9yZSB0cmF2ZXJzaW5nIHByb3BlcnRpZXMKKwkJCWNhbGxlcnMu
cHVzaCggYS5jb25zdHJ1Y3RvciApOworCisJCQkvLyBUcmFjayByZWZlcmVuY2UgdG8gYXZvaWQg
Y2lyY3VsYXIgcmVmZXJlbmNlcworCQkJcGFyZW50cy5wdXNoKCBhICk7CisJCQlwYXJlbnRzQi5w
dXNoKCBiICk7CisKKwkJCS8vIEJlIHN0cmljdDogZG9uJ3QgZW5zdXJlIGhhc093blByb3BlcnR5
IGFuZCBnbyBkZWVwCisJCQlmb3IgKCBpIGluIGEgKSB7CisJCQkJbG9vcCA9IGZhbHNlOworCQkJ
CWZvciAoIGogPSAwOyBqIDwgcGFyZW50cy5sZW5ndGg7IGorKyApIHsKKwkJCQkJYUNpcmN1bGFy
ID0gcGFyZW50c1sgaiBdID09PSBhWyBpIF07CisJCQkJCWJDaXJjdWxhciA9IHBhcmVudHNCWyBq
IF0gPT09IGJbIGkgXTsKKwkJCQkJaWYgKCBhQ2lyY3VsYXIgfHwgYkNpcmN1bGFyICkgeworCQkJ
CQkJaWYgKCBhWyBpIF0gPT09IGJbIGkgXSB8fCBhQ2lyY3VsYXIgJiYgYkNpcmN1bGFyICkgewor
CQkJCQkJCWxvb3AgPSB0cnVlOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQllcSA9IGZhbHNlOwor
CQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWFQcm9wZXJ0aWVzLnB1
c2goIGkgKTsKKwkJCQlpZiAoICFsb29wICYmICFpbm5lckVxdWl2KCBhWyBpIF0sIGJbIGkgXSAp
ICkgeworCQkJCQllcSA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXBh
cmVudHMucG9wKCk7CisJCQlwYXJlbnRzQi5wb3AoKTsKKworCQkJLy8gVW5zdGFjaywgd2UgYXJl
IGRvbmUKKwkJCWNhbGxlcnMucG9wKCk7CisKKwkJCWZvciAoIGkgaW4gYiApIHsKKworCQkJCS8v
IENvbGxlY3QgYidzIHByb3BlcnRpZXMKKwkJCQliUHJvcGVydGllcy5wdXNoKCBpICk7CisJCQl9
CisKKwkJCS8vIEVuc3VyZXMgaWRlbnRpY2FsIHByb3BlcnRpZXMgbmFtZQorCQkJcmV0dXJuIGVx
ICYmIGlubmVyRXF1aXYoIGFQcm9wZXJ0aWVzLnNvcnQoKSwgYlByb3BlcnRpZXMuc29ydCgpICk7
CisJCX0KKwl9OworCisJZnVuY3Rpb24gdHlwZUVxdWl2KCBhLCBiICkgeworCQl2YXIgcHJvcCA9
IFFVbml0Lm9iamVjdFR5cGUoIGEgKTsKKwkJcmV0dXJuIGNhbGxiYWNrc1sgcHJvcCBdKCBiLCBh
ICk7CisJfQorCisJLy8gVGhlIHJlYWwgZXF1aXYgZnVuY3Rpb24KKwlmdW5jdGlvbiBpbm5lckVx
dWl2KCkgeworCQl2YXIgYXJncyA9IFtdLnNsaWNlLmFwcGx5KCBhcmd1bWVudHMgKTsKKwkJaWYg
KCBhcmdzLmxlbmd0aCA8IDIgKSB7CisKKwkJCS8vIEVuZCB0cmFuc2l0aW9uCisJCQlyZXR1cm4g
dHJ1ZTsKKwkJfQorCisJCXJldHVybiAoIChmdW5jdGlvbiggYSwgYiApIHsKKwkJCWlmICggYSA9
PT0gYiApIHsKKworCQkJCS8vIENhdGNoIHRoZSBtb3N0IHlvdSBjYW4KKwkJCQlyZXR1cm4gdHJ1
ZTsKKwkJCX0gZWxzZSBpZiAoIGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9
PT0gInVuZGVmaW5lZCIgfHwKKwkJCQkJdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8CisJCQkJ
CVFVbml0Lm9iamVjdFR5cGUoIGEgKSAhPT0gUVVuaXQub2JqZWN0VHlwZSggYiApICkgeworCisJ
CQkJLy8gRG9uJ3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKKwkJCQlyZXR1cm4g
ZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiB0eXBlRXF1aXYoIGEsIGIgKTsKKwkJCX0K
KworCQkvLyBBcHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cworCQl9KCBhcmdz
WyAwIF0sIGFyZ3NbIDEgXSApICkgJiYKKwkJCWlubmVyRXF1aXYuYXBwbHkoIHRoaXMsIGFyZ3Mu
c3BsaWNlKCAxLCBhcmdzLmxlbmd0aCAtIDEgKSApICk7CisJfQorCisJcmV0dXJuIGlubmVyRXF1
aXY7Cit9KCkpOworCisvLyBCYXNlZCBvbiBqc0R1bXAgYnkgQXJpZWwgRmxlc2xlcgorLy8gaHR0
cDovL2ZsZXNsZXIuYmxvZ3Nwb3QuY29tLzIwMDgvMDUvanNkdW1wLXByZXR0eS1kdW1wLW9mLWFu
eS1qYXZhc2NyaXB0Lmh0bWwKK1FVbml0LmR1bXAgPSAoZnVuY3Rpb24oKSB7CisJZnVuY3Rpb24g
cXVvdGUoIHN0ciApIHsKKwkJcmV0dXJuICJcIiIgKyBzdHIudG9TdHJpbmcoKS5yZXBsYWNlKCAv
XFwvZywgIlxcXFwiICkucmVwbGFjZSggLyIvZywgIlxcXCIiICkgKyAiXCIiOworCX0KKwlmdW5j
dGlvbiBsaXRlcmFsKCBvICkgeworCQlyZXR1cm4gbyArICIiOworCX0KKwlmdW5jdGlvbiBqb2lu
KCBwcmUsIGFyciwgcG9zdCApIHsKKwkJdmFyIHMgPSBkdW1wLnNlcGFyYXRvcigpLAorCQkJYmFz
ZSA9IGR1bXAuaW5kZW50KCksCisJCQlpbm5lciA9IGR1bXAuaW5kZW50KCAxICk7CisJCWlmICgg
YXJyLmpvaW4gKSB7CisJCQlhcnIgPSBhcnIuam9pbiggIiwiICsgcyArIGlubmVyICk7CisJCX0K
KwkJaWYgKCAhYXJyICkgeworCQkJcmV0dXJuIHByZSArIHBvc3Q7CisJCX0KKwkJcmV0dXJuIFsg
cHJlLCBpbm5lciArIGFyciwgYmFzZSArIHBvc3QgXS5qb2luKCBzICk7CisJfQorCWZ1bmN0aW9u
IGFycmF5KCBhcnIsIHN0YWNrICkgeworCQl2YXIgaSA9IGFyci5sZW5ndGgsCisJCQlyZXQgPSBu
ZXcgQXJyYXkoIGkgKTsKKworCQlpZiAoIGR1bXAubWF4RGVwdGggJiYgZHVtcC5kZXB0aCA+IGR1
bXAubWF4RGVwdGggKSB7CisJCQlyZXR1cm4gIltvYmplY3QgQXJyYXldIjsKKwkJfQorCisJCXRo
aXMudXAoKTsKKwkJd2hpbGUgKCBpLS0gKSB7CisJCQlyZXRbIGkgXSA9IHRoaXMucGFyc2UoIGFy
clsgaSBdLCB1bmRlZmluZWQsIHN0YWNrICk7CisJCX0KKwkJdGhpcy5kb3duKCk7CisJCXJldHVy
biBqb2luKCAiWyIsIHJldCwgIl0iICk7CisJfQorCisJdmFyIHJlTmFtZSA9IC9eZnVuY3Rpb24g
KFx3KykvLAorCQlkdW1wID0geworCisJCQkvLyBvYmpUeXBlIGlzIHVzZWQgbW9zdGx5IGludGVy
bmFsbHksIHlvdSBjYW4gZml4IGEgKGN1c3RvbSkgdHlwZSBpbiBhZHZhbmNlCisJCQlwYXJzZTog
ZnVuY3Rpb24oIG9iaiwgb2JqVHlwZSwgc3RhY2sgKSB7CisJCQkJc3RhY2sgPSBzdGFjayB8fCBb
XTsKKwkJCQl2YXIgcmVzLCBwYXJzZXIsIHBhcnNlclR5cGUsCisJCQkJCWluU3RhY2sgPSBpbkFy
cmF5KCBvYmosIHN0YWNrICk7CisKKwkJCQlpZiAoIGluU3RhY2sgIT09IC0xICkgeworCQkJCQly
ZXR1cm4gInJlY3Vyc2lvbigiICsgKCBpblN0YWNrIC0gc3RhY2subGVuZ3RoICkgKyAiKSI7CisJ
CQkJfQorCisJCQkJb2JqVHlwZSA9IG9ialR5cGUgfHwgdGhpcy50eXBlT2YoIG9iaiAgKTsKKwkJ
CQlwYXJzZXIgPSB0aGlzLnBhcnNlcnNbIG9ialR5cGUgXTsKKwkJCQlwYXJzZXJUeXBlID0gdHlw
ZW9mIHBhcnNlcjsKKworCQkJCWlmICggcGFyc2VyVHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKKwkJ
CQkJc3RhY2sucHVzaCggb2JqICk7CisJCQkJCXJlcyA9IHBhcnNlci5jYWxsKCB0aGlzLCBvYmos
IHN0YWNrICk7CisJCQkJCXN0YWNrLnBvcCgpOworCQkJCQlyZXR1cm4gcmVzOworCQkJCX0KKwkJ
CQlyZXR1cm4gKCBwYXJzZXJUeXBlID09PSAic3RyaW5nIiApID8gcGFyc2VyIDogdGhpcy5wYXJz
ZXJzLmVycm9yOworCQkJfSwKKwkJCXR5cGVPZjogZnVuY3Rpb24oIG9iaiApIHsKKwkJCQl2YXIg
dHlwZTsKKwkJCQlpZiAoIG9iaiA9PT0gbnVsbCApIHsKKwkJCQkJdHlwZSA9ICJudWxsIjsKKwkJ
CQl9IGVsc2UgaWYgKCB0eXBlb2Ygb2JqID09PSAidW5kZWZpbmVkIiApIHsKKwkJCQkJdHlwZSA9
ICJ1bmRlZmluZWQiOworCQkJCX0gZWxzZSBpZiAoIFFVbml0LmlzKCAicmVnZXhwIiwgb2JqICkg
KSB7CisJCQkJCXR5cGUgPSAicmVnZXhwIjsKKwkJCQl9IGVsc2UgaWYgKCBRVW5pdC5pcyggImRh
dGUiLCBvYmogKSApIHsKKwkJCQkJdHlwZSA9ICJkYXRlIjsKKwkJCQl9IGVsc2UgaWYgKCBRVW5p
dC5pcyggImZ1bmN0aW9uIiwgb2JqICkgKSB7CisJCQkJCXR5cGUgPSAiZnVuY3Rpb24iOworCQkJ
CX0gZWxzZSBpZiAoIG9iai5zZXRJbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmCisJCQkJCQlvYmou
ZG9jdW1lbnQgIT09IHVuZGVmaW5lZCAmJgorCQkJCQkJb2JqLm5vZGVUeXBlID09PSB1bmRlZmlu
ZWQgKSB7CisJCQkJCXR5cGUgPSAid2luZG93IjsKKwkJCQl9IGVsc2UgaWYgKCBvYmoubm9kZVR5
cGUgPT09IDkgKSB7CisJCQkJCXR5cGUgPSAiZG9jdW1lbnQiOworCQkJCX0gZWxzZSBpZiAoIG9i
ai5ub2RlVHlwZSApIHsKKwkJCQkJdHlwZSA9ICJub2RlIjsKKwkJCQl9IGVsc2UgaWYgKAorCisJ
CQkJCS8vIG5hdGl2ZSBhcnJheXMKKwkJCQkJdG9TdHJpbmcuY2FsbCggb2JqICkgPT09ICJbb2Jq
ZWN0IEFycmF5XSIgfHwKKworCQkJCQkvLyBOb2RlTGlzdCBvYmplY3RzCisJCQkJCSggdHlwZW9m
IG9iai5sZW5ndGggPT09ICJudW1iZXIiICYmIG9iai5pdGVtICE9PSB1bmRlZmluZWQgJiYKKwkJ
CQkJKCBvYmoubGVuZ3RoID8gb2JqLml0ZW0oIDAgKSA9PT0gb2JqWyAwIF0gOiAoIG9iai5pdGVt
KCAwICkgPT09IG51bGwgJiYKKwkJCQkJb2JqWyAwIF0gPT09IHVuZGVmaW5lZCApICkgKQorCQkJ
CSkgeworCQkJCQl0eXBlID0gImFycmF5IjsKKwkJCQl9IGVsc2UgaWYgKCBvYmouY29uc3RydWN0
b3IgPT09IEVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciApIHsKKwkJCQkJdHlwZSA9ICJlcnJv
ciI7CisJCQkJfSBlbHNlIHsKKwkJCQkJdHlwZSA9IHR5cGVvZiBvYmo7CisJCQkJfQorCQkJCXJl
dHVybiB0eXBlOworCQkJfSwKKwkJCXNlcGFyYXRvcjogZnVuY3Rpb24oKSB7CisJCQkJcmV0dXJu
IHRoaXMubXVsdGlsaW5lID8gdGhpcy5IVE1MID8gIjxiciAvPiIgOiAiXG4iIDogdGhpcy5IVE1M
ID8gIiYjMTYwOyIgOiAiICI7CisJCQl9LAorCQkJLy8gZXh0cmEgY2FuIGJlIGEgbnVtYmVyLCBz
aG9ydGN1dCBmb3IgaW5jcmVhc2luZy1jYWxsaW5nLWRlY3JlYXNpbmcKKwkJCWluZGVudDogZnVu
Y3Rpb24oIGV4dHJhICkgeworCQkJCWlmICggIXRoaXMubXVsdGlsaW5lICkgeworCQkJCQlyZXR1
cm4gIiI7CisJCQkJfQorCQkJCXZhciBjaHIgPSB0aGlzLmluZGVudENoYXI7CisJCQkJaWYgKCB0
aGlzLkhUTUwgKSB7CisJCQkJCWNociA9IGNoci5yZXBsYWNlKCAvXHQvZywgIiAgICIgKS5yZXBs
YWNlKCAvIC9nLCAiJiMxNjA7IiApOworCQkJCX0KKwkJCQlyZXR1cm4gbmV3IEFycmF5KCB0aGlz
LmRlcHRoICsgKCBleHRyYSB8fCAwICkgKS5qb2luKCBjaHIgKTsKKwkJCX0sCisJCQl1cDogZnVu
Y3Rpb24oIGEgKSB7CisJCQkJdGhpcy5kZXB0aCArPSBhIHx8IDE7CisJCQl9LAorCQkJZG93bjog
ZnVuY3Rpb24oIGEgKSB7CisJCQkJdGhpcy5kZXB0aCAtPSBhIHx8IDE7CisJCQl9LAorCQkJc2V0
UGFyc2VyOiBmdW5jdGlvbiggbmFtZSwgcGFyc2VyICkgeworCQkJCXRoaXMucGFyc2Vyc1sgbmFt
ZSBdID0gcGFyc2VyOworCQkJfSwKKwkJCS8vIFRoZSBuZXh0IDMgYXJlIGV4cG9zZWQgc28geW91
IGNhbiB1c2UgdGhlbQorCQkJcXVvdGU6IHF1b3RlLAorCQkJbGl0ZXJhbDogbGl0ZXJhbCwKKwkJ
CWpvaW46IGpvaW4sCisJCQkvLworCQkJZGVwdGg6IDEsCisJCQltYXhEZXB0aDogUVVuaXQuY29u
ZmlnLm1heERlcHRoLAorCisJCQkvLyBUaGlzIGlzIHRoZSBsaXN0IG9mIHBhcnNlcnMsIHRvIG1v
ZGlmeSB0aGVtLCB1c2UgZHVtcC5zZXRQYXJzZXIKKwkJCXBhcnNlcnM6IHsKKwkJCQl3aW5kb3c6
ICJbV2luZG93XSIsCisJCQkJZG9jdW1lbnQ6ICJbRG9jdW1lbnRdIiwKKwkJCQllcnJvcjogZnVu
Y3Rpb24oIGVycm9yICkgeworCQkJCQlyZXR1cm4gIkVycm9yKFwiIiArIGVycm9yLm1lc3NhZ2Ug
KyAiXCIpIjsKKwkJCQl9LAorCQkJCXVua25vd246ICJbVW5rbm93bl0iLAorCQkJCSJudWxsIjog
Im51bGwiLAorCQkJCSJ1bmRlZmluZWQiOiAidW5kZWZpbmVkIiwKKwkJCQkiZnVuY3Rpb24iOiBm
dW5jdGlvbiggZm4gKSB7CisJCQkJCXZhciByZXQgPSAiZnVuY3Rpb24iLAorCisJCQkJCQkvLyBm
dW5jdGlvbnMgbmV2ZXIgaGF2ZSBuYW1lIGluIElFCisJCQkJCQluYW1lID0gIm5hbWUiIGluIGZu
ID8gZm4ubmFtZSA6ICggcmVOYW1lLmV4ZWMoIGZuICkgfHwgW10gKVsgMSBdOworCisJCQkJCWlm
ICggbmFtZSApIHsKKwkJCQkJCXJldCArPSAiICIgKyBuYW1lOworCQkJCQl9CisJCQkJCXJldCAr
PSAiKCAiOworCisJCQkJCXJldCA9IFsgcmV0LCBkdW1wLnBhcnNlKCBmbiwgImZ1bmN0aW9uQXJn
cyIgKSwgIil7IiBdLmpvaW4oICIiICk7CisJCQkJCXJldHVybiBqb2luKCByZXQsIGR1bXAucGFy
c2UoIGZuLCAiZnVuY3Rpb25Db2RlIiApLCAifSIgKTsKKwkJCQl9LAorCQkJCWFycmF5OiBhcnJh
eSwKKwkJCQlub2RlbGlzdDogYXJyYXksCisJCQkJImFyZ3VtZW50cyI6IGFycmF5LAorCQkJCW9i
amVjdDogZnVuY3Rpb24oIG1hcCwgc3RhY2sgKSB7CisJCQkJCXZhciBrZXlzLCBrZXksIHZhbCwg
aSwgbm9uRW51bWVyYWJsZVByb3BlcnRpZXMsCisJCQkJCQlyZXQgPSBbXTsKKworCQkJCQlpZiAo
IGR1bXAubWF4RGVwdGggJiYgZHVtcC5kZXB0aCA+IGR1bXAubWF4RGVwdGggKSB7CisJCQkJCQly
ZXR1cm4gIltvYmplY3QgT2JqZWN0XSI7CisJCQkJCX0KKworCQkJCQlkdW1wLnVwKCk7CisJCQkJ
CWtleXMgPSBbXTsKKwkJCQkJZm9yICgga2V5IGluIG1hcCApIHsKKwkJCQkJCWtleXMucHVzaCgg
a2V5ICk7CisJCQkJCX0KKworCQkJCQkvLyBTb21lIHByb3BlcnRpZXMgYXJlIG5vdCBhbHdheXMg
ZW51bWVyYWJsZSBvbiBFcnJvciBvYmplY3RzLgorCQkJCQlub25FbnVtZXJhYmxlUHJvcGVydGll
cyA9IFsgIm1lc3NhZ2UiLCAibmFtZSIgXTsKKwkJCQkJZm9yICggaSBpbiBub25FbnVtZXJhYmxl
UHJvcGVydGllcyApIHsKKwkJCQkJCWtleSA9IG5vbkVudW1lcmFibGVQcm9wZXJ0aWVzWyBpIF07
CisJCQkJCQlpZiAoIGtleSBpbiBtYXAgJiYgaW5BcnJheSgga2V5LCBrZXlzICkgPCAwICkgewor
CQkJCQkJCWtleXMucHVzaCgga2V5ICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJa2V5cy5zb3J0
KCk7CisJCQkJCWZvciAoIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyApIHsKKwkJCQkJCWtl
eSA9IGtleXNbIGkgXTsKKwkJCQkJCXZhbCA9IG1hcFsga2V5IF07CisJCQkJCQlyZXQucHVzaCgg
ZHVtcC5wYXJzZSgga2V5LCAia2V5IiApICsgIjogIiArCisJCQkJCQkJZHVtcC5wYXJzZSggdmFs
LCB1bmRlZmluZWQsIHN0YWNrICkgKTsKKwkJCQkJfQorCQkJCQlkdW1wLmRvd24oKTsKKwkJCQkJ
cmV0dXJuIGpvaW4oICJ7IiwgcmV0LCAifSIgKTsKKwkJCQl9LAorCQkJCW5vZGU6IGZ1bmN0aW9u
KCBub2RlICkgeworCQkJCQl2YXIgbGVuLCBpLCB2YWwsCisJCQkJCQlvcGVuID0gZHVtcC5IVE1M
ID8gIiZsdDsiIDogIjwiLAorCQkJCQkJY2xvc2UgPSBkdW1wLkhUTUwgPyAiJmd0OyIgOiAiPiIs
CisJCQkJCQl0YWcgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCisJCQkJCQlyZXQgPSBv
cGVuICsgdGFnLAorCQkJCQkJYXR0cnMgPSBub2RlLmF0dHJpYnV0ZXM7CisKKwkJCQkJaWYgKCBh
dHRycyApIHsKKwkJCQkJCWZvciAoIGkgPSAwLCBsZW4gPSBhdHRycy5sZW5ndGg7IGkgPCBsZW47
IGkrKyApIHsKKwkJCQkJCQl2YWwgPSBhdHRyc1sgaSBdLm5vZGVWYWx1ZTsKKworCQkJCQkJCS8v
IElFNiBpbmNsdWRlcyBhbGwgYXR0cmlidXRlcyBpbiAuYXR0cmlidXRlcywgZXZlbiBvbmVzIG5v
dCBleHBsaWNpdGx5CisJCQkJCQkJLy8gc2V0LiBUaG9zZSBoYXZlIHZhbHVlcyBsaWtlIHVuZGVm
aW5lZCwgbnVsbCwgMCwgZmFsc2UsICIiIG9yCisJCQkJCQkJLy8gImluaGVyaXQiLgorCQkJCQkJ
CWlmICggdmFsICYmIHZhbCAhPT0gImluaGVyaXQiICkgeworCQkJCQkJCQlyZXQgKz0gIiAiICsg
YXR0cnNbIGkgXS5ub2RlTmFtZSArICI9IiArCisJCQkJCQkJCQlkdW1wLnBhcnNlKCB2YWwsICJh
dHRyaWJ1dGUiICk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldCArPSBjbG9z
ZTsKKworCQkJCQkvLyBTaG93IGNvbnRlbnQgb2YgVGV4dE5vZGUgb3IgQ0RBVEFTZWN0aW9uCisJ
CQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMyB8fCBub2RlLm5vZGVUeXBlID09PSA0ICkgewor
CQkJCQkJcmV0ICs9IG5vZGUubm9kZVZhbHVlOworCQkJCQl9CisKKwkJCQkJcmV0dXJuIHJldCAr
IG9wZW4gKyAiLyIgKyB0YWcgKyBjbG9zZTsKKwkJCQl9LAorCisJCQkJLy8gZnVuY3Rpb24gY2Fs
bHMgaXQgaW50ZXJuYWxseSwgaXQncyB0aGUgYXJndW1lbnRzIHBhcnQgb2YgdGhlIGZ1bmN0aW9u
CisJCQkJZnVuY3Rpb25BcmdzOiBmdW5jdGlvbiggZm4gKSB7CisJCQkJCXZhciBhcmdzLAorCQkJ
CQkJbCA9IGZuLmxlbmd0aDsKKworCQkJCQlpZiAoICFsICkgeworCQkJCQkJcmV0dXJuICIiOwor
CQkJCQl9CisKKwkJCQkJYXJncyA9IG5ldyBBcnJheSggbCApOworCQkJCQl3aGlsZSAoIGwtLSAp
IHsKKworCQkJCQkJLy8gOTcgaXMgJ2EnCisJCQkJCQlhcmdzWyBsIF0gPSBTdHJpbmcuZnJvbUNo
YXJDb2RlKCA5NyArIGwgKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gIiAiICsgYXJncy5qb2luKCAi
LCAiICkgKyAiICI7CisJCQkJfSwKKwkJCQkvLyBvYmplY3QgY2FsbHMgaXQgaW50ZXJuYWxseSwg
dGhlIGtleSBwYXJ0IG9mIGFuIGl0ZW0gaW4gYSBtYXAKKwkJCQlrZXk6IHF1b3RlLAorCQkJCS8v
IGZ1bmN0aW9uIGNhbGxzIGl0IGludGVybmFsbHksIGl0J3MgdGhlIGNvbnRlbnQgb2YgdGhlIGZ1
bmN0aW9uCisJCQkJZnVuY3Rpb25Db2RlOiAiW2NvZGVdIiwKKwkJCQkvLyBub2RlIGNhbGxzIGl0
IGludGVybmFsbHksIGl0J3MgYW4gaHRtbCBhdHRyaWJ1dGUgdmFsdWUKKwkJCQlhdHRyaWJ1dGU6
IHF1b3RlLAorCQkJCXN0cmluZzogcXVvdGUsCisJCQkJZGF0ZTogcXVvdGUsCisJCQkJcmVnZXhw
OiBsaXRlcmFsLAorCQkJCW51bWJlcjogbGl0ZXJhbCwKKwkJCQkiYm9vbGVhbiI6IGxpdGVyYWwK
KwkJCX0sCisJCQkvLyBpZiB0cnVlLCBlbnRpdGllcyBhcmUgZXNjYXBlZCAoIDwsID4sIFx0LCBz
cGFjZSBhbmQgXG4gKQorCQkJSFRNTDogZmFsc2UsCisJCQkvLyBpbmRlbnRhdGlvbiB1bml0CisJ
CQlpbmRlbnRDaGFyOiAiICAiLAorCQkJLy8gaWYgdHJ1ZSwgaXRlbXMgaW4gYSBjb2xsZWN0aW9u
LCBhcmUgc2VwYXJhdGVkIGJ5IGEgXG4sIGVsc2UganVzdCBhIHNwYWNlLgorCQkJbXVsdGlsaW5l
OiB0cnVlCisJCX07CisKKwlyZXR1cm4gZHVtcDsKK30oKSk7CisKKy8vIGJhY2sgY29tcGF0CitR
VW5pdC5qc0R1bXAgPSBRVW5pdC5kdW1wOworCisvLyBGb3IgYnJvd3NlciwgZXhwb3J0IG9ubHkg
c2VsZWN0IGdsb2JhbHMKK2lmICggZGVmaW5lZC5kb2N1bWVudCApIHsKKworCS8vIERlcHJlY2F0
ZWQKKwkvLyBFeHRlbmQgYXNzZXJ0IG1ldGhvZHMgdG8gUVVuaXQgYW5kIEdsb2JhbCBzY29wZSB0
aHJvdWdoIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJKGZ1bmN0aW9uKCkgeworCQl2YXIgaSwK
KwkJCWFzc2VydGlvbnMgPSBBc3NlcnQucHJvdG90eXBlOworCisJCWZ1bmN0aW9uIGFwcGx5Q3Vy
cmVudCggY3VycmVudCApIHsKKwkJCXJldHVybiBmdW5jdGlvbigpIHsKKwkJCQl2YXIgYXNzZXJ0
ID0gbmV3IEFzc2VydCggUVVuaXQuY29uZmlnLmN1cnJlbnQgKTsKKwkJCQljdXJyZW50LmFwcGx5
KCBhc3NlcnQsIGFyZ3VtZW50cyApOworCQkJfTsKKwkJfQorCisJCWZvciAoIGkgaW4gYXNzZXJ0
aW9ucyApIHsKKwkJCVFVbml0WyBpIF0gPSBhcHBseUN1cnJlbnQoIGFzc2VydGlvbnNbIGkgXSAp
OworCQl9CisJfSkoKTsKKworCShmdW5jdGlvbigpIHsKKwkJdmFyIGksIGwsCisJCQlrZXlzID0g
WworCQkJCSJ0ZXN0IiwKKwkJCQkibW9kdWxlIiwKKwkJCQkiZXhwZWN0IiwKKwkJCQkiYXN5bmNU
ZXN0IiwKKwkJCQkic3RhcnQiLAorCQkJCSJzdG9wIiwKKwkJCQkib2siLAorCQkJCSJub3RPayIs
CisJCQkJImVxdWFsIiwKKwkJCQkibm90RXF1YWwiLAorCQkJCSJwcm9wRXF1YWwiLAorCQkJCSJu
b3RQcm9wRXF1YWwiLAorCQkJCSJkZWVwRXF1YWwiLAorCQkJCSJub3REZWVwRXF1YWwiLAorCQkJ
CSJzdHJpY3RFcXVhbCIsCisJCQkJIm5vdFN0cmljdEVxdWFsIiwKKwkJCQkidGhyb3dzIiwKKwkJ
CQkicmFpc2VzIgorCQkJXTsKKworCQlmb3IgKCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwg
bDsgaSsrICkgeworCQkJd2luZG93WyBrZXlzWyBpIF0gXSA9IFFVbml0WyBrZXlzWyBpIF0gXTsK
KwkJfQorCX0pKCk7CisKKwl3aW5kb3cuUVVuaXQgPSBRVW5pdDsKK30KKworLy8gRm9yIG5vZGVq
cworaWYgKCB0eXBlb2YgbW9kdWxlICE9PSAidW5kZWZpbmVkIiAmJiBtb2R1bGUgJiYgbW9kdWxl
LmV4cG9ydHMgKSB7CisJbW9kdWxlLmV4cG9ydHMgPSBRVW5pdDsKKworCS8vIEZvciBjb25zaXN0
ZW5jeSB3aXRoIENvbW1vbkpTIGVudmlyb25tZW50cycgZXhwb3J0cworCW1vZHVsZS5leHBvcnRz
LlFVbml0ID0gUVVuaXQ7Cit9CisKKy8vIEZvciBDb21tb25KUyB3aXRoIGV4cG9ydHMsIGJ1dCB3
aXRob3V0IG1vZHVsZS5leHBvcnRzLCBsaWtlIFJoaW5vCitpZiAoIHR5cGVvZiBleHBvcnRzICE9
PSAidW5kZWZpbmVkIiAmJiBleHBvcnRzICkgeworCWV4cG9ydHMuUVVuaXQgPSBRVW5pdDsKK30K
KworaWYgKCB0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQgKSB7CisJ
ZGVmaW5lKCBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIFFVbml0OworCX0gKTsKKwlRVW5pdC5jb25m
aWcuYXV0b3N0YXJ0ID0gZmFsc2U7Cit9CisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYSBtb2RpZmll
ZCB2ZXJzaW9uIG9mIGdvb2dsZS1kaWZmLW1hdGNoLXBhdGNoJ3MgSmF2YVNjcmlwdCBpbXBsZW1l
bnRhdGlvbgorICogKGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLWRpZmYtbWF0Y2gt
cGF0Y2gvc291cmNlL2Jyb3dzZS90cnVuay9qYXZhc2NyaXB0L2RpZmZfbWF0Y2hfcGF0Y2hfdW5j
b21wcmVzc2VkLmpzKSwKKyAqIG1vZGlmaWNhdGlvbnMgYXJlIGxpY2Vuc2VkIGFzIG1vcmUgZnVs
bHkgc2V0IGZvcnRoIGluIExJQ0VOU0UudHh0LgorICoKKyAqIFRoZSBvcmlnaW5hbCBzb3VyY2Ug
b2YgZ29vZ2xlLWRpZmYtbWF0Y2gtcGF0Y2ggaXMgYXR0cmlidXRhYmxlIGFuZCBsaWNlbnNlZCBh
cyBmb2xsb3dzOgorICoKKyAqIENvcHlyaWdodCAyMDA2IEdvb2dsZSBJbmMuCisgKiBodHRwOi8v
Y29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLWRpZmYtbWF0Y2gtcGF0Y2gvCisgKgorICogTGljZW5z
ZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7
CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgg
dGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQK
KyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisg
KiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRp
bmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmli
dXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJ
VElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhl
IExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMg
YW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBNb3JlIEluZm86
CisgKiAgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1wYXRjaC8K
KyAqCisgKiBVc2FnZTogUVVuaXQuZGlmZihleHBlY3RlZCwgYWN0dWFsKQorICoKKyAqLworUVVu
aXQuZGlmZiA9ICggZnVuY3Rpb24oKSB7CisJZnVuY3Rpb24gRGlmZk1hdGNoUGF0Y2goKSB7CisJ
fQorCisJLy8gIERJRkYgRlVOQ1RJT05TCisKKwkvKioKKwkgKiBUaGUgZGF0YSBzdHJ1Y3R1cmUg
cmVwcmVzZW50aW5nIGEgZGlmZiBpcyBhbiBhcnJheSBvZiB0dXBsZXM6CisJICogW1tESUZGX0RF
TEVURSwgJ0hlbGxvJ10sIFtESUZGX0lOU0VSVCwgJ0dvb2RieWUnXSwgW0RJRkZfRVFVQUwsICcg
d29ybGQuJ11dCisJICogd2hpY2ggbWVhbnM6IGRlbGV0ZSAnSGVsbG8nLCBhZGQgJ0dvb2RieWUn
IGFuZCBrZWVwICcgd29ybGQuJworCSAqLworCXZhciBESUZGX0RFTEVURSA9IC0xLAorCQlESUZG
X0lOU0VSVCA9IDEsCisJCURJRkZfRVFVQUwgPSAwOworCisJLyoqCisJICogRmluZCB0aGUgZGlm
ZmVyZW5jZXMgYmV0d2VlbiB0d28gdGV4dHMuICBTaW1wbGlmaWVzIHRoZSBwcm9ibGVtIGJ5IHN0
cmlwcGluZworCSAqIGFueSBjb21tb24gcHJlZml4IG9yIHN1ZmZpeCBvZmYgdGhlIHRleHRzIGJl
Zm9yZSBkaWZmaW5nLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJl
IGRpZmZlZC4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZm
ZWQuCisJICogQHBhcmFtIHtib29sZWFuPX0gb3B0Q2hlY2tsaW5lcyBPcHRpb25hbCBzcGVlZHVw
IGZsYWcuIElmIHByZXNlbnQgYW5kIGZhbHNlLAorCSAqICAgICB0aGVuIGRvbid0IHJ1biBhIGxp
bmUtbGV2ZWwgZGlmZiBmaXJzdCB0byBpZGVudGlmeSB0aGUgY2hhbmdlZCBhcmVhcy4KKwkgKiAg
ICAgRGVmYXVsdHMgdG8gdHJ1ZSwgd2hpY2ggZG9lcyBhIGZhc3Rlciwgc2xpZ2h0bHkgbGVzcyBv
cHRpbWFsIGRpZmYuCisJICogQHJldHVybiB7IUFycmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59
IEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5E
aWZmTWFpbiA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIsIG9wdENoZWNrbGluZXMgKSB7CisJCXZh
ciBkZWFkbGluZSwgY2hlY2tsaW5lcywgY29tbW9ubGVuZ3RoLAorCQkJY29tbW9ucHJlZml4LCBj
b21tb25zdWZmaXgsIGRpZmZzOworCisJCS8vIFRoZSBkaWZmIG11c3QgYmUgY29tcGxldGUgaW4g
dXAgdG8gMSBzZWNvbmQuCisJCWRlYWRsaW5lID0gKCBuZXcgRGF0ZSgpICkuZ2V0VGltZSgpICsg
MTAwMDsKKworCQkvLyBDaGVjayBmb3IgbnVsbCBpbnB1dHMuCisJCWlmICggdGV4dDEgPT09IG51
bGwgfHwgdGV4dDIgPT09IG51bGwgKSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoICJOdWxsIGlucHV0
LiAoRGlmZk1haW4pIiApOworCQl9CisKKwkJLy8gQ2hlY2sgZm9yIGVxdWFsaXR5IChzcGVlZHVw
KS4KKwkJaWYgKCB0ZXh0MSA9PT0gdGV4dDIgKSB7CisJCQlpZiAoIHRleHQxICkgeworCQkJCXJl
dHVybiBbCisJCQkJCVsgRElGRl9FUVVBTCwgdGV4dDEgXQorCQkJCV07CisJCQl9CisJCQlyZXR1
cm4gW107CisJCX0KKworCQlpZiAoIHR5cGVvZiBvcHRDaGVja2xpbmVzID09PSAidW5kZWZpbmVk
IiApIHsKKwkJCW9wdENoZWNrbGluZXMgPSB0cnVlOworCQl9CisKKwkJY2hlY2tsaW5lcyA9IG9w
dENoZWNrbGluZXM7CisKKwkJLy8gVHJpbSBvZmYgY29tbW9uIHByZWZpeCAoc3BlZWR1cCkuCisJ
CWNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZkNvbW1vblByZWZpeCggdGV4dDEsIHRleHQyICk7CisJ
CWNvbW1vbnByZWZpeCA9IHRleHQxLnN1YnN0cmluZyggMCwgY29tbW9ubGVuZ3RoICk7CisJCXRl
eHQxID0gdGV4dDEuc3Vic3RyaW5nKCBjb21tb25sZW5ndGggKTsKKwkJdGV4dDIgPSB0ZXh0Mi5z
dWJzdHJpbmcoIGNvbW1vbmxlbmd0aCApOworCisJCS8vIFRyaW0gb2ZmIGNvbW1vbiBzdWZmaXgg
KHNwZWVkdXApLgorCQljb21tb25sZW5ndGggPSB0aGlzLmRpZmZDb21tb25TdWZmaXgoIHRleHQx
LCB0ZXh0MiApOworCQljb21tb25zdWZmaXggPSB0ZXh0MS5zdWJzdHJpbmcoIHRleHQxLmxlbmd0
aCAtIGNvbW1vbmxlbmd0aCApOworCQl0ZXh0MSA9IHRleHQxLnN1YnN0cmluZyggMCwgdGV4dDEu
bGVuZ3RoIC0gY29tbW9ubGVuZ3RoICk7CisJCXRleHQyID0gdGV4dDIuc3Vic3RyaW5nKCAwLCB0
ZXh0Mi5sZW5ndGggLSBjb21tb25sZW5ndGggKTsKKworCQkvLyBDb21wdXRlIHRoZSBkaWZmIG9u
IHRoZSBtaWRkbGUgYmxvY2suCisJCWRpZmZzID0gdGhpcy5kaWZmQ29tcHV0ZSggdGV4dDEsIHRl
eHQyLCBjaGVja2xpbmVzLCBkZWFkbGluZSApOworCisJCS8vIFJlc3RvcmUgdGhlIHByZWZpeCBh
bmQgc3VmZml4LgorCQlpZiAoIGNvbW1vbnByZWZpeCApIHsKKwkJCWRpZmZzLnVuc2hpZnQoIFsg
RElGRl9FUVVBTCwgY29tbW9ucHJlZml4IF0gKTsKKwkJfQorCQlpZiAoIGNvbW1vbnN1ZmZpeCAp
IHsKKwkJCWRpZmZzLnB1c2goIFsgRElGRl9FUVVBTCwgY29tbW9uc3VmZml4IF0gKTsKKwkJfQor
CQl0aGlzLmRpZmZDbGVhbnVwTWVyZ2UoIGRpZmZzICk7CisJCXJldHVybiBkaWZmczsKKwl9Owor
CisJLyoqCisJICogUmVkdWNlIHRoZSBudW1iZXIgb2YgZWRpdHMgYnkgZWxpbWluYXRpbmcgb3Bl
cmF0aW9uYWxseSB0cml2aWFsIGVxdWFsaXRpZXMuCisJICogQHBhcmFtIHshQXJyYXkuPCFEaWZm
TWF0Y2hQYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICovCisJRGlm
Zk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDbGVhbnVwRWZmaWNpZW5jeSA9IGZ1bmN0aW9uKCBk
aWZmcyApIHsKKwkJdmFyIGNoYW5nZXMsIGVxdWFsaXRpZXMsIGVxdWFsaXRpZXNMZW5ndGgsIGxh
c3RlcXVhbGl0eSwKKwkJCXBvaW50ZXIsIHByZUlucywgcHJlRGVsLCBwb3N0SW5zLCBwb3N0RGVs
OworCQljaGFuZ2VzID0gZmFsc2U7CisJCWVxdWFsaXRpZXMgPSBbXTsgLy8gU3RhY2sgb2YgaW5k
aWNlcyB3aGVyZSBlcXVhbGl0aWVzIGFyZSBmb3VuZC4KKwkJZXF1YWxpdGllc0xlbmd0aCA9IDA7
IC8vIEtlZXBpbmcgb3VyIG93biBsZW5ndGggdmFyIGlzIGZhc3RlciBpbiBKUy4KKwkJLyoqIEB0
eXBlIHs/c3RyaW5nfSAqLworCQlsYXN0ZXF1YWxpdHkgPSBudWxsOworCQkvLyBBbHdheXMgZXF1
YWwgdG8gZGlmZnNbZXF1YWxpdGllc1tlcXVhbGl0aWVzTGVuZ3RoIC0gMV1dWzFdCisJCXBvaW50
ZXIgPSAwOyAvLyBJbmRleCBvZiBjdXJyZW50IHBvc2l0aW9uLgorCQkvLyBJcyB0aGVyZSBhbiBp
bnNlcnRpb24gb3BlcmF0aW9uIGJlZm9yZSB0aGUgbGFzdCBlcXVhbGl0eS4KKwkJcHJlSW5zID0g
ZmFsc2U7CisJCS8vIElzIHRoZXJlIGEgZGVsZXRpb24gb3BlcmF0aW9uIGJlZm9yZSB0aGUgbGFz
dCBlcXVhbGl0eS4KKwkJcHJlRGVsID0gZmFsc2U7CisJCS8vIElzIHRoZXJlIGFuIGluc2VydGlv
biBvcGVyYXRpb24gYWZ0ZXIgdGhlIGxhc3QgZXF1YWxpdHkuCisJCXBvc3RJbnMgPSBmYWxzZTsK
KwkJLy8gSXMgdGhlcmUgYSBkZWxldGlvbiBvcGVyYXRpb24gYWZ0ZXIgdGhlIGxhc3QgZXF1YWxp
dHkuCisJCXBvc3REZWwgPSBmYWxzZTsKKwkJd2hpbGUgKCBwb2ludGVyIDwgZGlmZnMubGVuZ3Ro
ICkgeworCisJCQkvLyBFcXVhbGl0eSBmb3VuZC4KKwkJCWlmICggZGlmZnNbIHBvaW50ZXIgXVsg
MCBdID09PSBESUZGX0VRVUFMICkgeworCQkJCWlmICggZGlmZnNbIHBvaW50ZXIgXVsgMSBdLmxl
bmd0aCA8IDQgJiYgKCBwb3N0SW5zIHx8IHBvc3REZWwgKSApIHsKKworCQkJCQkvLyBDYW5kaWRh
dGUgZm91bmQuCisJCQkJCWVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGgrKyBdID0gcG9pbnRl
cjsKKwkJCQkJcHJlSW5zID0gcG9zdEluczsKKwkJCQkJcHJlRGVsID0gcG9zdERlbDsKKwkJCQkJ
bGFzdGVxdWFsaXR5ID0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJCX0gZWxzZSB7CisKKwkJ
CQkJLy8gTm90IGEgY2FuZGlkYXRlLCBhbmQgY2FuIG5ldmVyIGJlY29tZSBvbmUuCisJCQkJCWVx
dWFsaXRpZXNMZW5ndGggPSAwOworCQkJCQlsYXN0ZXF1YWxpdHkgPSBudWxsOworCQkJCX0KKwkJ
CQlwb3N0SW5zID0gcG9zdERlbCA9IGZhbHNlOworCisJCQkvLyBBbiBpbnNlcnRpb24gb3IgZGVs
ZXRpb24uCisJCQl9IGVsc2UgeworCisJCQkJaWYgKCBkaWZmc1sgcG9pbnRlciBdWyAwIF0gPT09
IERJRkZfREVMRVRFICkgeworCQkJCQlwb3N0RGVsID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJ
CQlwb3N0SW5zID0gdHJ1ZTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIEZpdmUgdHlwZXMgdG8g
YmUgc3BsaXQ6CisJCQkJICogPGlucz5BPC9pbnM+PGRlbD5CPC9kZWw+WFk8aW5zPkM8L2lucz48
ZGVsPkQ8L2RlbD4KKwkJCQkgKiA8aW5zPkE8L2lucz5YPGlucz5DPC9pbnM+PGRlbD5EPC9kZWw+
CisJCQkJICogPGlucz5BPC9pbnM+PGRlbD5CPC9kZWw+WDxpbnM+QzwvaW5zPgorCQkJCSAqIDxp
bnM+QTwvZGVsPlg8aW5zPkM8L2lucz48ZGVsPkQ8L2RlbD4KKwkJCQkgKiA8aW5zPkE8L2lucz48
ZGVsPkI8L2RlbD5YPGRlbD5DPC9kZWw+CisJCQkJICovCisJCQkJaWYgKCBsYXN0ZXF1YWxpdHkg
JiYgKCAoIHByZUlucyAmJiBwcmVEZWwgJiYgcG9zdElucyAmJiBwb3N0RGVsICkgfHwKKwkJCQkJ
CSggKCBsYXN0ZXF1YWxpdHkubGVuZ3RoIDwgMiApICYmCisJCQkJCQkoIHByZUlucyArIHByZURl
bCArIHBvc3RJbnMgKyBwb3N0RGVsICkgPT09IDMgKSApICkgeworCisJCQkJCS8vIER1cGxpY2F0
ZSByZWNvcmQuCisJCQkJCWRpZmZzLnNwbGljZSgKKwkJCQkJCWVxdWFsaXRpZXNbIGVxdWFsaXRp
ZXNMZW5ndGggLSAxIF0sCisJCQkJCQkwLAorCQkJCQkJWyBESUZGX0RFTEVURSwgbGFzdGVxdWFs
aXR5IF0KKwkJCQkJKTsKKworCQkJCQkvLyBDaGFuZ2Ugc2Vjb25kIGNvcHkgdG8gaW5zZXJ0Lgor
CQkJCQlkaWZmc1sgZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCAtIDEgXSArIDEgXVsgMCBd
ID0gRElGRl9JTlNFUlQ7CisJCQkJCWVxdWFsaXRpZXNMZW5ndGgtLTsgLy8gVGhyb3cgYXdheSB0
aGUgZXF1YWxpdHkgd2UganVzdCBkZWxldGVkOworCQkJCQlsYXN0ZXF1YWxpdHkgPSBudWxsOwor
CQkJCQlpZiAoIHByZUlucyAmJiBwcmVEZWwgKSB7CisJCQkJCQkvLyBObyBjaGFuZ2VzIG1hZGUg
d2hpY2ggY291bGQgYWZmZWN0IHByZXZpb3VzIGVudHJ5LCBrZWVwIGdvaW5nLgorCQkJCQkJcG9z
dElucyA9IHBvc3REZWwgPSB0cnVlOworCQkJCQkJZXF1YWxpdGllc0xlbmd0aCA9IDA7CisJCQkJ
CX0gZWxzZSB7CisJCQkJCQllcXVhbGl0aWVzTGVuZ3RoLS07IC8vIFRocm93IGF3YXkgdGhlIHBy
ZXZpb3VzIGVxdWFsaXR5LgorCQkJCQkJcG9pbnRlciA9IGVxdWFsaXRpZXNMZW5ndGggPiAwID8g
ZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCAtIDEgXSA6IC0xOworCQkJCQkJcG9zdElucyA9
IHBvc3REZWwgPSBmYWxzZTsKKwkJCQkJfQorCQkJCQljaGFuZ2VzID0gdHJ1ZTsKKwkJCQl9CisJ
CQl9CisJCQlwb2ludGVyKys7CisJCX0KKworCQlpZiAoIGNoYW5nZXMgKSB7CisJCQl0aGlzLmRp
ZmZDbGVhbnVwTWVyZ2UoIGRpZmZzICk7CisJCX0KKwl9OworCisJLyoqCisJICogQ29udmVydCBh
IGRpZmYgYXJyYXkgaW50byBhIHByZXR0eSBIVE1MIHJlcG9ydC4KKwkgKiBAcGFyYW0geyFBcnJh
eS48IURpZmZNYXRjaFBhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkg
KiBAcGFyYW0ge2ludGVnZXJ9IHN0cmluZyB0byBiZSBiZWF1dGlmaWVkLgorCSAqIEByZXR1cm4g
e3N0cmluZ30gSFRNTCByZXByZXNlbnRhdGlvbi4KKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90
b3R5cGUuZGlmZlByZXR0eUh0bWwgPSBmdW5jdGlvbiggZGlmZnMgKSB7CisJCXZhciBvcCwgZGF0
YSwgeCwKKwkJCWh0bWwgPSBbXTsKKwkJZm9yICggeCA9IDA7IHggPCBkaWZmcy5sZW5ndGg7IHgr
KyApIHsKKwkJCW9wID0gZGlmZnNbIHggXVsgMCBdOyAvLyBPcGVyYXRpb24gKGluc2VydCwgZGVs
ZXRlLCBlcXVhbCkKKwkJCWRhdGEgPSBkaWZmc1sgeCBdWyAxIF07IC8vIFRleHQgb2YgY2hhbmdl
LgorCQkJc3dpdGNoICggb3AgKSB7CisJCQljYXNlIERJRkZfSU5TRVJUOgorCQkJCWh0bWxbIHgg
XSA9ICI8aW5zPiIgKyBkYXRhICsgIjwvaW5zPiI7CisJCQkJYnJlYWs7CisJCQljYXNlIERJRkZf
REVMRVRFOgorCQkJCWh0bWxbIHggXSA9ICI8ZGVsPiIgKyBkYXRhICsgIjwvZGVsPiI7CisJCQkJ
YnJlYWs7CisJCQljYXNlIERJRkZfRVFVQUw6CisJCQkJaHRtbFsgeCBdID0gIjxzcGFuPiIgKyBk
YXRhICsgIjwvc3Bhbj4iOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBodG1sLmpv
aW4oICIiICk7CisJfTsKKworCS8qKgorCSAqIERldGVybWluZSB0aGUgY29tbW9uIHByZWZpeCBv
ZiB0d28gc3RyaW5ncy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLgor
CSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBTZWNvbmQgc3RyaW5nLgorCSAqIEByZXR1cm4ge251
bWJlcn0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbW1vbiB0byB0aGUgc3RhcnQgb2YgZWFj
aAorCSAqICAgICBzdHJpbmcuCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZD
b21tb25QcmVmaXggPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyICkgeworCQl2YXIgcG9pbnRlcm1p
ZCwgcG9pbnRlcm1heCwgcG9pbnRlcm1pbiwgcG9pbnRlcnN0YXJ0OworCQkvLyBRdWljayBjaGVj
ayBmb3IgY29tbW9uIG51bGwgY2FzZXMuCisJCWlmICggIXRleHQxIHx8ICF0ZXh0MiB8fCB0ZXh0
MS5jaGFyQXQoIDAgKSAhPT0gdGV4dDIuY2hhckF0KCAwICkgKSB7CisJCQlyZXR1cm4gMDsKKwkJ
fQorCQkvLyBCaW5hcnkgc2VhcmNoLgorCQkvLyBQZXJmb3JtYW5jZSBhbmFseXNpczogaHR0cDov
L25laWwuZnJhc2VyLm5hbWUvbmV3cy8yMDA3LzEwLzA5LworCQlwb2ludGVybWluID0gMDsKKwkJ
cG9pbnRlcm1heCA9IE1hdGgubWluKCB0ZXh0MS5sZW5ndGgsIHRleHQyLmxlbmd0aCApOworCQlw
b2ludGVybWlkID0gcG9pbnRlcm1heDsKKwkJcG9pbnRlcnN0YXJ0ID0gMDsKKwkJd2hpbGUgKCBw
b2ludGVybWluIDwgcG9pbnRlcm1pZCApIHsKKwkJCWlmICggdGV4dDEuc3Vic3RyaW5nKCBwb2lu
dGVyc3RhcnQsIHBvaW50ZXJtaWQgKSA9PT0KKwkJCQkJdGV4dDIuc3Vic3RyaW5nKCBwb2ludGVy
c3RhcnQsIHBvaW50ZXJtaWQgKSApIHsKKwkJCQlwb2ludGVybWluID0gcG9pbnRlcm1pZDsKKwkJ
CQlwb2ludGVyc3RhcnQgPSBwb2ludGVybWluOworCQkJfSBlbHNlIHsKKwkJCQlwb2ludGVybWF4
ID0gcG9pbnRlcm1pZDsKKwkJCX0KKwkJCXBvaW50ZXJtaWQgPSBNYXRoLmZsb29yKCAoIHBvaW50
ZXJtYXggLSBwb2ludGVybWluICkgLyAyICsgcG9pbnRlcm1pbiApOworCQl9CisJCXJldHVybiBw
b2ludGVybWlkOworCX07CisKKwkvKioKKwkgKiBEZXRlcm1pbmUgdGhlIGNvbW1vbiBzdWZmaXgg
b2YgdHdvIHN0cmluZ3MuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0IHN0cmluZy4K
KwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy4KKwkgKiBAcmV0dXJuIHtu
dW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb21tb24gdG8gdGhlIGVuZCBvZiBlYWNo
IHN0cmluZy4KKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNvbW1vblN1ZmZp
eCA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIgKSB7CisJCXZhciBwb2ludGVybWlkLCBwb2ludGVy
bWF4LCBwb2ludGVybWluLCBwb2ludGVyZW5kOworCQkvLyBRdWljayBjaGVjayBmb3IgY29tbW9u
IG51bGwgY2FzZXMuCisJCWlmICggIXRleHQxIHx8CisJCQkJIXRleHQyIHx8CisJCQkJdGV4dDEu
Y2hhckF0KCB0ZXh0MS5sZW5ndGggLSAxICkgIT09IHRleHQyLmNoYXJBdCggdGV4dDIubGVuZ3Ro
IC0gMSApICkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJLy8gQmluYXJ5IHNlYXJjaC4KKwkJLy8g
UGVyZm9ybWFuY2UgYW5hbHlzaXM6IGh0dHA6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAwNy8x
MC8wOS8KKwkJcG9pbnRlcm1pbiA9IDA7CisJCXBvaW50ZXJtYXggPSBNYXRoLm1pbiggdGV4dDEu
bGVuZ3RoLCB0ZXh0Mi5sZW5ndGggKTsKKwkJcG9pbnRlcm1pZCA9IHBvaW50ZXJtYXg7CisJCXBv
aW50ZXJlbmQgPSAwOworCQl3aGlsZSAoIHBvaW50ZXJtaW4gPCBwb2ludGVybWlkICkgeworCQkJ
aWYgKCB0ZXh0MS5zdWJzdHJpbmcoIHRleHQxLmxlbmd0aCAtIHBvaW50ZXJtaWQsIHRleHQxLmxl
bmd0aCAtIHBvaW50ZXJlbmQgKSA9PT0KKwkJCQkJdGV4dDIuc3Vic3RyaW5nKCB0ZXh0Mi5sZW5n
dGggLSBwb2ludGVybWlkLCB0ZXh0Mi5sZW5ndGggLSBwb2ludGVyZW5kICkgKSB7CisJCQkJcG9p
bnRlcm1pbiA9IHBvaW50ZXJtaWQ7CisJCQkJcG9pbnRlcmVuZCA9IHBvaW50ZXJtaW47CisJCQl9
IGVsc2UgeworCQkJCXBvaW50ZXJtYXggPSBwb2ludGVybWlkOworCQkJfQorCQkJcG9pbnRlcm1p
ZCA9IE1hdGguZmxvb3IoICggcG9pbnRlcm1heCAtIHBvaW50ZXJtaW4gKSAvIDIgKyBwb2ludGVy
bWluICk7CisJCX0KKwkJcmV0dXJuIHBvaW50ZXJtaWQ7CisJfTsKKworCS8qKgorCSAqIEZpbmQg
dGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIHRleHRzLiAgQXNzdW1lcyB0aGF0IHRoZSB0ZXh0
cyBkbyBub3QKKwkgKiBoYXZlIGFueSBjb21tb24gcHJlZml4IG9yIHN1ZmZpeC4KKwkgKiBAcGFy
YW0ge3N0cmluZ30gdGV4dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtz
dHJpbmd9IHRleHQyIE5ldyBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7Ym9vbGVh
bn0gY2hlY2tsaW5lcyBTcGVlZHVwIGZsYWcuICBJZiBmYWxzZSwgdGhlbiBkb24ndCBydW4gYQor
CSAqICAgICBsaW5lLWxldmVsIGRpZmYgZmlyc3QgdG8gaWRlbnRpZnkgdGhlIGNoYW5nZWQgYXJl
YXMuCisJICogICAgIElmIHRydWUsIHRoZW4gcnVuIGEgZmFzdGVyLCBzbGlnaHRseSBsZXNzIG9w
dGltYWwgZGlmZi4KKwkgKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSB3aGVuIHRoZSBk
aWZmIHNob3VsZCBiZSBjb21wbGV0ZSBieS4KKwkgKiBAcmV0dXJuIHshQXJyYXkuPCFEaWZmTWF0
Y2hQYXRjaC5EaWZmPn0gQXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICogQHByaXZhdGUKKwkgKi8K
KwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNvbXB1dGUgPSBmdW5jdGlvbiggdGV4dDEs
IHRleHQyLCBjaGVja2xpbmVzLCBkZWFkbGluZSApIHsKKwkJdmFyIGRpZmZzLCBsb25ndGV4dCwg
c2hvcnR0ZXh0LCBpLCBobSwKKwkJCXRleHQxQSwgdGV4dDJBLCB0ZXh0MUIsIHRleHQyQiwKKwkJ
CW1pZENvbW1vbiwgZGlmZnNBLCBkaWZmc0I7CisKKwkJaWYgKCAhdGV4dDEgKSB7CisJCQkvLyBK
dXN0IGFkZCBzb21lIHRleHQgKHNwZWVkdXApLgorCQkJcmV0dXJuIFsKKwkJCQlbIERJRkZfSU5T
RVJULCB0ZXh0MiBdCisJCQldOworCQl9CisKKwkJaWYgKCAhdGV4dDIgKSB7CisJCQkvLyBKdXN0
IGRlbGV0ZSBzb21lIHRleHQgKHNwZWVkdXApLgorCQkJcmV0dXJuIFsKKwkJCQlbIERJRkZfREVM
RVRFLCB0ZXh0MSBdCisJCQldOworCQl9CisKKwkJbG9uZ3RleHQgPSB0ZXh0MS5sZW5ndGggPiB0
ZXh0Mi5sZW5ndGggPyB0ZXh0MSA6IHRleHQyOworCQlzaG9ydHRleHQgPSB0ZXh0MS5sZW5ndGgg
PiB0ZXh0Mi5sZW5ndGggPyB0ZXh0MiA6IHRleHQxOworCQlpID0gbG9uZ3RleHQuaW5kZXhPZigg
c2hvcnR0ZXh0ICk7CisJCWlmICggaSAhPT0gLTEgKSB7CisJCQkvLyBTaG9ydGVyIHRleHQgaXMg
aW5zaWRlIHRoZSBsb25nZXIgdGV4dCAoc3BlZWR1cCkuCisJCQlkaWZmcyA9IFsKKwkJCQlbIERJ
RkZfSU5TRVJULCBsb25ndGV4dC5zdWJzdHJpbmcoIDAsIGkgKSBdLAorCQkJCVsgRElGRl9FUVVB
TCwgc2hvcnR0ZXh0IF0sCisJCQkJWyBESUZGX0lOU0VSVCwgbG9uZ3RleHQuc3Vic3RyaW5nKCBp
ICsgc2hvcnR0ZXh0Lmxlbmd0aCApIF0KKwkJCV07CisJCQkvLyBTd2FwIGluc2VydGlvbnMgZm9y
IGRlbGV0aW9ucyBpZiBkaWZmIGlzIHJldmVyc2VkLgorCQkJaWYgKCB0ZXh0MS5sZW5ndGggPiB0
ZXh0Mi5sZW5ndGggKSB7CisJCQkJZGlmZnNbIDAgXVsgMCBdID0gZGlmZnNbIDIgXVsgMCBdID0g
RElGRl9ERUxFVEU7CisJCQl9CisJCQlyZXR1cm4gZGlmZnM7CisJCX0KKworCQlpZiAoIHNob3J0
dGV4dC5sZW5ndGggPT09IDEgKSB7CisJCQkvLyBTaW5nbGUgY2hhcmFjdGVyIHN0cmluZy4KKwkJ
CS8vIEFmdGVyIHRoZSBwcmV2aW91cyBzcGVlZHVwLCB0aGUgY2hhcmFjdGVyIGNhbid0IGJlIGFu
IGVxdWFsaXR5LgorCQkJcmV0dXJuIFsKKwkJCQlbIERJRkZfREVMRVRFLCB0ZXh0MSBdLAorCQkJ
CVsgRElGRl9JTlNFUlQsIHRleHQyIF0KKwkJCV07CisJCX0KKworCQkvLyBDaGVjayB0byBzZWUg
aWYgdGhlIHByb2JsZW0gY2FuIGJlIHNwbGl0IGluIHR3by4KKwkJaG0gPSB0aGlzLmRpZmZIYWxm
TWF0Y2goIHRleHQxLCB0ZXh0MiApOworCQlpZiAoIGhtICkgeworCQkJLy8gQSBoYWxmLW1hdGNo
IHdhcyBmb3VuZCwgc29ydCBvdXQgdGhlIHJldHVybiBkYXRhLgorCQkJdGV4dDFBID0gaG1bIDAg
XTsKKwkJCXRleHQxQiA9IGhtWyAxIF07CisJCQl0ZXh0MkEgPSBobVsgMiBdOworCQkJdGV4dDJC
ID0gaG1bIDMgXTsKKwkJCW1pZENvbW1vbiA9IGhtWyA0IF07CisJCQkvLyBTZW5kIGJvdGggcGFp
cnMgb2ZmIGZvciBzZXBhcmF0ZSBwcm9jZXNzaW5nLgorCQkJZGlmZnNBID0gdGhpcy5EaWZmTWFp
biggdGV4dDFBLCB0ZXh0MkEsIGNoZWNrbGluZXMsIGRlYWRsaW5lICk7CisJCQlkaWZmc0IgPSB0
aGlzLkRpZmZNYWluKCB0ZXh0MUIsIHRleHQyQiwgY2hlY2tsaW5lcywgZGVhZGxpbmUgKTsKKwkJ
CS8vIE1lcmdlIHRoZSByZXN1bHRzLgorCQkJcmV0dXJuIGRpZmZzQS5jb25jYXQoIFsKKwkJCQlb
IERJRkZfRVFVQUwsIG1pZENvbW1vbiBdCisJCQldLCBkaWZmc0IgKTsKKwkJfQorCisJCWlmICgg
Y2hlY2tsaW5lcyAmJiB0ZXh0MS5sZW5ndGggPiAxMDAgJiYgdGV4dDIubGVuZ3RoID4gMTAwICkg
eworCQkJcmV0dXJuIHRoaXMuZGlmZkxpbmVNb2RlKCB0ZXh0MSwgdGV4dDIsIGRlYWRsaW5lICk7
CisJCX0KKworCQlyZXR1cm4gdGhpcy5kaWZmQmlzZWN0KCB0ZXh0MSwgdGV4dDIsIGRlYWRsaW5l
ICk7CisJfTsKKworCS8qKgorCSAqIERvIHRoZSB0d28gdGV4dHMgc2hhcmUgYSBzdWJzdHJpbmcg
d2hpY2ggaXMgYXQgbGVhc3QgaGFsZiB0aGUgbGVuZ3RoIG9mIHRoZQorCSAqIGxvbmdlciB0ZXh0
PworCSAqIFRoaXMgc3BlZWR1cCBjYW4gcHJvZHVjZSBub24tbWluaW1hbCBkaWZmcy4KKwkgKiBA
cGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0
ZXh0MiBTZWNvbmQgc3RyaW5nLgorCSAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSBGaXZlIGVs
ZW1lbnQgQXJyYXksIGNvbnRhaW5pbmcgdGhlIHByZWZpeCBvZgorCSAqICAgICB0ZXh0MSwgdGhl
IHN1ZmZpeCBvZiB0ZXh0MSwgdGhlIHByZWZpeCBvZiB0ZXh0MiwgdGhlIHN1ZmZpeCBvZgorCSAq
ICAgICB0ZXh0MiBhbmQgdGhlIGNvbW1vbiBtaWRkbGUuICBPciBudWxsIGlmIHRoZXJlIHdhcyBu
byBtYXRjaC4KKwkgKiBAcHJpdmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5k
aWZmSGFsZk1hdGNoID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiApIHsKKwkJdmFyIGxvbmd0ZXh0
LCBzaG9ydHRleHQsIGRtcCwKKwkJCXRleHQxQSwgdGV4dDJCLCB0ZXh0MkEsIHRleHQxQiwgbWlk
Q29tbW9uLAorCQkJaG0xLCBobTIsIGhtOworCisJCWxvbmd0ZXh0ID0gdGV4dDEubGVuZ3RoID4g
dGV4dDIubGVuZ3RoID8gdGV4dDEgOiB0ZXh0MjsKKwkJc2hvcnR0ZXh0ID0gdGV4dDEubGVuZ3Ro
ID4gdGV4dDIubGVuZ3RoID8gdGV4dDIgOiB0ZXh0MTsKKwkJaWYgKCBsb25ndGV4dC5sZW5ndGgg
PCA0IHx8IHNob3J0dGV4dC5sZW5ndGggKiAyIDwgbG9uZ3RleHQubGVuZ3RoICkgeworCQkJcmV0
dXJuIG51bGw7IC8vIFBvaW50bGVzcy4KKwkJfQorCQlkbXAgPSB0aGlzOyAvLyAndGhpcycgYmVj
b21lcyAnd2luZG93JyBpbiBhIGNsb3N1cmUuCisKKwkJLyoqCisJCSAqIERvZXMgYSBzdWJzdHJp
bmcgb2Ygc2hvcnR0ZXh0IGV4aXN0IHdpdGhpbiBsb25ndGV4dCBzdWNoIHRoYXQgdGhlIHN1YnN0
cmluZworCQkgKiBpcyBhdCBsZWFzdCBoYWxmIHRoZSBsZW5ndGggb2YgbG9uZ3RleHQ/CisJCSAq
IENsb3N1cmUsIGJ1dCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IGV4dGVybmFsIHZhcmlhYmxlcy4K
KwkJICogQHBhcmFtIHtzdHJpbmd9IGxvbmd0ZXh0IExvbmdlciBzdHJpbmcuCisJCSAqIEBwYXJh
bSB7c3RyaW5nfSBzaG9ydHRleHQgU2hvcnRlciBzdHJpbmcuCisJCSAqIEBwYXJhbSB7bnVtYmVy
fSBpIFN0YXJ0IGluZGV4IG9mIHF1YXJ0ZXIgbGVuZ3RoIHN1YnN0cmluZyB3aXRoaW4gbG9uZ3Rl
eHQuCisJCSAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSBGaXZlIGVsZW1lbnQgQXJyYXksIGNv
bnRhaW5pbmcgdGhlIHByZWZpeCBvZgorCQkgKiAgICAgbG9uZ3RleHQsIHRoZSBzdWZmaXggb2Yg
bG9uZ3RleHQsIHRoZSBwcmVmaXggb2Ygc2hvcnR0ZXh0LCB0aGUgc3VmZml4CisJCSAqICAgICBv
ZiBzaG9ydHRleHQgYW5kIHRoZSBjb21tb24gbWlkZGxlLiAgT3IgbnVsbCBpZiB0aGVyZSB3YXMg
bm8gbWF0Y2guCisJCSAqIEBwcml2YXRlCisJCSAqLworCQlmdW5jdGlvbiBkaWZmSGFsZk1hdGNo
SSggbG9uZ3RleHQsIHNob3J0dGV4dCwgaSApIHsKKwkJCXZhciBzZWVkLCBqLCBiZXN0Q29tbW9u
LCBwcmVmaXhMZW5ndGgsIHN1ZmZpeExlbmd0aCwKKwkJCQliZXN0TG9uZ3RleHRBLCBiZXN0TG9u
Z3RleHRCLCBiZXN0U2hvcnR0ZXh0QSwgYmVzdFNob3J0dGV4dEI7CisJCQkvLyBTdGFydCB3aXRo
IGEgMS80IGxlbmd0aCBzdWJzdHJpbmcgYXQgcG9zaXRpb24gaSBhcyBhIHNlZWQuCisJCQlzZWVk
ID0gbG9uZ3RleHQuc3Vic3RyaW5nKCBpLCBpICsgTWF0aC5mbG9vciggbG9uZ3RleHQubGVuZ3Ro
IC8gNCApICk7CisJCQlqID0gLTE7CisJCQliZXN0Q29tbW9uID0gIiI7CisJCQl3aGlsZSAoICgg
aiA9IHNob3J0dGV4dC5pbmRleE9mKCBzZWVkLCBqICsgMSApICkgIT09IC0xICkgeworCQkJCXBy
ZWZpeExlbmd0aCA9IGRtcC5kaWZmQ29tbW9uUHJlZml4KCBsb25ndGV4dC5zdWJzdHJpbmcoIGkg
KSwKKwkJCQkJc2hvcnR0ZXh0LnN1YnN0cmluZyggaiApICk7CisJCQkJc3VmZml4TGVuZ3RoID0g
ZG1wLmRpZmZDb21tb25TdWZmaXgoIGxvbmd0ZXh0LnN1YnN0cmluZyggMCwgaSApLAorCQkJCQlz
aG9ydHRleHQuc3Vic3RyaW5nKCAwLCBqICkgKTsKKwkJCQlpZiAoIGJlc3RDb21tb24ubGVuZ3Ro
IDwgc3VmZml4TGVuZ3RoICsgcHJlZml4TGVuZ3RoICkgeworCQkJCQliZXN0Q29tbW9uID0gc2hv
cnR0ZXh0LnN1YnN0cmluZyggaiAtIHN1ZmZpeExlbmd0aCwgaiApICsKKwkJCQkJCXNob3J0dGV4
dC5zdWJzdHJpbmcoIGosIGogKyBwcmVmaXhMZW5ndGggKTsKKwkJCQkJYmVzdExvbmd0ZXh0QSA9
IGxvbmd0ZXh0LnN1YnN0cmluZyggMCwgaSAtIHN1ZmZpeExlbmd0aCApOworCQkJCQliZXN0TG9u
Z3RleHRCID0gbG9uZ3RleHQuc3Vic3RyaW5nKCBpICsgcHJlZml4TGVuZ3RoICk7CisJCQkJCWJl
c3RTaG9ydHRleHRBID0gc2hvcnR0ZXh0LnN1YnN0cmluZyggMCwgaiAtIHN1ZmZpeExlbmd0aCAp
OworCQkJCQliZXN0U2hvcnR0ZXh0QiA9IHNob3J0dGV4dC5zdWJzdHJpbmcoIGogKyBwcmVmaXhM
ZW5ndGggKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoIGJlc3RDb21tb24ubGVuZ3RoICogMiA+PSBs
b25ndGV4dC5sZW5ndGggKSB7CisJCQkJcmV0dXJuIFsgYmVzdExvbmd0ZXh0QSwgYmVzdExvbmd0
ZXh0QiwKKwkJCQkJYmVzdFNob3J0dGV4dEEsIGJlc3RTaG9ydHRleHRCLCBiZXN0Q29tbW9uCisJ
CQkJXTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKworCQkvLyBG
aXJzdCBjaGVjayBpZiB0aGUgc2Vjb25kIHF1YXJ0ZXIgaXMgdGhlIHNlZWQgZm9yIGEgaGFsZi1t
YXRjaC4KKwkJaG0xID0gZGlmZkhhbGZNYXRjaEkoIGxvbmd0ZXh0LCBzaG9ydHRleHQsCisJCQlN
YXRoLmNlaWwoIGxvbmd0ZXh0Lmxlbmd0aCAvIDQgKSApOworCQkvLyBDaGVjayBhZ2FpbiBiYXNl
ZCBvbiB0aGUgdGhpcmQgcXVhcnRlci4KKwkJaG0yID0gZGlmZkhhbGZNYXRjaEkoIGxvbmd0ZXh0
LCBzaG9ydHRleHQsCisJCQlNYXRoLmNlaWwoIGxvbmd0ZXh0Lmxlbmd0aCAvIDIgKSApOworCQlp
ZiAoICFobTEgJiYgIWhtMiApIHsKKwkJCXJldHVybiBudWxsOworCQl9IGVsc2UgaWYgKCAhaG0y
ICkgeworCQkJaG0gPSBobTE7CisJCX0gZWxzZSBpZiAoICFobTEgKSB7CisJCQlobSA9IGhtMjsK
KwkJfSBlbHNlIHsKKwkJCS8vIEJvdGggbWF0Y2hlZC4gIFNlbGVjdCB0aGUgbG9uZ2VzdC4KKwkJ
CWhtID0gaG0xWyA0IF0ubGVuZ3RoID4gaG0yWyA0IF0ubGVuZ3RoID8gaG0xIDogaG0yOworCQl9
CisKKwkJLy8gQSBoYWxmLW1hdGNoIHdhcyBmb3VuZCwgc29ydCBvdXQgdGhlIHJldHVybiBkYXRh
LgorCQl0ZXh0MUEsIHRleHQxQiwgdGV4dDJBLCB0ZXh0MkI7CisJCWlmICggdGV4dDEubGVuZ3Ro
ID4gdGV4dDIubGVuZ3RoICkgeworCQkJdGV4dDFBID0gaG1bIDAgXTsKKwkJCXRleHQxQiA9IGht
WyAxIF07CisJCQl0ZXh0MkEgPSBobVsgMiBdOworCQkJdGV4dDJCID0gaG1bIDMgXTsKKwkJfSBl
bHNlIHsKKwkJCXRleHQyQSA9IGhtWyAwIF07CisJCQl0ZXh0MkIgPSBobVsgMSBdOworCQkJdGV4
dDFBID0gaG1bIDIgXTsKKwkJCXRleHQxQiA9IGhtWyAzIF07CisJCX0KKwkJbWlkQ29tbW9uID0g
aG1bIDQgXTsKKwkJcmV0dXJuIFsgdGV4dDFBLCB0ZXh0MUIsIHRleHQyQSwgdGV4dDJCLCBtaWRD
b21tb24gXTsKKwl9OworCisJLyoqCisJICogRG8gYSBxdWljayBsaW5lLWxldmVsIGRpZmYgb24g
Ym90aCBzdHJpbmdzLCB0aGVuIHJlZGlmZiB0aGUgcGFydHMgZm9yCisJICogZ3JlYXRlciBhY2N1
cmFjeS4KKwkgKiBUaGlzIHNwZWVkdXAgY2FuIHByb2R1Y2Ugbm9uLW1pbmltYWwgZGlmZnMuCisJ
ICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIE9sZCBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBw
YXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0g
e251bWJlcn0gZGVhZGxpbmUgVGltZSB3aGVuIHRoZSBkaWZmIHNob3VsZCBiZSBjb21wbGV0ZSBi
eS4KKwkgKiBAcmV0dXJuIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gQXJyYXkgb2Yg
ZGlmZiB0dXBsZXMuCisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5
cGUuZGlmZkxpbmVNb2RlID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUgKSB7CisJ
CXZhciBhLCBkaWZmcywgbGluZWFycmF5LCBwb2ludGVyLCBjb3VudEluc2VydCwKKwkJCWNvdW50
RGVsZXRlLCB0ZXh0SW5zZXJ0LCB0ZXh0RGVsZXRlLCBqOworCQkvLyBTY2FuIHRoZSB0ZXh0IG9u
IGEgbGluZS1ieS1saW5lIGJhc2lzIGZpcnN0LgorCQlhID0gdGhpcy5kaWZmTGluZXNUb0NoYXJz
KCB0ZXh0MSwgdGV4dDIgKTsKKwkJdGV4dDEgPSBhLmNoYXJzMTsKKwkJdGV4dDIgPSBhLmNoYXJz
MjsKKwkJbGluZWFycmF5ID0gYS5saW5lQXJyYXk7CisKKwkJZGlmZnMgPSB0aGlzLkRpZmZNYWlu
KCB0ZXh0MSwgdGV4dDIsIGZhbHNlLCBkZWFkbGluZSApOworCisJCS8vIENvbnZlcnQgdGhlIGRp
ZmYgYmFjayB0byBvcmlnaW5hbCB0ZXh0LgorCQl0aGlzLmRpZmZDaGFyc1RvTGluZXMoIGRpZmZz
LCBsaW5lYXJyYXkgKTsKKwkJLy8gRWxpbWluYXRlIGZyZWFrIG1hdGNoZXMgKGUuZy4gYmxhbmsg
bGluZXMpCisJCXRoaXMuZGlmZkNsZWFudXBTZW1hbnRpYyggZGlmZnMgKTsKKworCQkvLyBSZWRp
ZmYgYW55IHJlcGxhY2VtZW50IGJsb2NrcywgdGhpcyB0aW1lIGNoYXJhY3Rlci1ieS1jaGFyYWN0
ZXIuCisJCS8vIEFkZCBhIGR1bW15IGVudHJ5IGF0IHRoZSBlbmQuCisJCWRpZmZzLnB1c2goIFsg
RElGRl9FUVVBTCwgIiIgXSApOworCQlwb2ludGVyID0gMDsKKwkJY291bnREZWxldGUgPSAwOwor
CQljb3VudEluc2VydCA9IDA7CisJCXRleHREZWxldGUgPSAiIjsKKwkJdGV4dEluc2VydCA9ICIi
OworCQl3aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggKSB7CisJCQlzd2l0Y2ggKCBkaWZm
c1sgcG9pbnRlciBdWyAwIF0gKSB7CisJCQljYXNlIERJRkZfSU5TRVJUOgorCQkJCWNvdW50SW5z
ZXJ0Kys7CisJCQkJdGV4dEluc2VydCArPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJYnJl
YWs7CisJCQljYXNlIERJRkZfREVMRVRFOgorCQkJCWNvdW50RGVsZXRlKys7CisJCQkJdGV4dERl
bGV0ZSArPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJYnJlYWs7CisJCQljYXNlIERJRkZf
RVFVQUw6CisJCQkJLy8gVXBvbiByZWFjaGluZyBhbiBlcXVhbGl0eSwgY2hlY2sgZm9yIHByaW9y
IHJlZHVuZGFuY2llcy4KKwkJCQlpZiAoIGNvdW50RGVsZXRlID49IDEgJiYgY291bnRJbnNlcnQg
Pj0gMSApIHsKKwkJCQkJLy8gRGVsZXRlIHRoZSBvZmZlbmRpbmcgcmVjb3JkcyBhbmQgYWRkIHRo
ZSBtZXJnZWQgb25lcy4KKwkJCQkJZGlmZnMuc3BsaWNlKCBwb2ludGVyIC0gY291bnREZWxldGUg
LSBjb3VudEluc2VydCwKKwkJCQkJCWNvdW50RGVsZXRlICsgY291bnRJbnNlcnQgKTsKKwkJCQkJ
cG9pbnRlciA9IHBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50SW5zZXJ0OworCQkJCQlhID0g
dGhpcy5EaWZmTWFpbiggdGV4dERlbGV0ZSwgdGV4dEluc2VydCwgZmFsc2UsIGRlYWRsaW5lICk7
CisJCQkJCWZvciAoIGogPSBhLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tICkgeworCQkJCQkJZGlm
ZnMuc3BsaWNlKCBwb2ludGVyLCAwLCBhWyBqIF0gKTsKKwkJCQkJfQorCQkJCQlwb2ludGVyID0g
cG9pbnRlciArIGEubGVuZ3RoOworCQkJCX0KKwkJCQljb3VudEluc2VydCA9IDA7CisJCQkJY291
bnREZWxldGUgPSAwOworCQkJCXRleHREZWxldGUgPSAiIjsKKwkJCQl0ZXh0SW5zZXJ0ID0gIiI7
CisJCQkJYnJlYWs7CisJCQl9CisJCQlwb2ludGVyKys7CisJCX0KKwkJZGlmZnMucG9wKCk7IC8v
IFJlbW92ZSB0aGUgZHVtbXkgZW50cnkgYXQgdGhlIGVuZC4KKworCQlyZXR1cm4gZGlmZnM7CisJ
fTsKKworCS8qKgorCSAqIEZpbmQgdGhlICdtaWRkbGUgc25ha2UnIG9mIGEgZGlmZiwgc3BsaXQg
dGhlIHByb2JsZW0gaW4gdHdvCisJICogYW5kIHJldHVybiB0aGUgcmVjdXJzaXZlbHkgY29uc3Ry
dWN0ZWQgZGlmZi4KKwkgKiBTZWUgTXllcnMgMTk4NiBwYXBlcjogQW4gTyhORCkgRGlmZmVyZW5j
ZSBBbGdvcml0aG0gYW5kIEl0cyBWYXJpYXRpb25zLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0
MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3
IHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtudW1iZXJ9IGRlYWRsaW5lIFRpbWUg
YXQgd2hpY2ggdG8gYmFpbCBpZiBub3QgeWV0IGNvbXBsZXRlLgorCSAqIEByZXR1cm4geyFBcnJh
eS48IURpZmZNYXRjaFBhdGNoLkRpZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKiBAcHJp
dmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQmlzZWN0ID0gZnVuY3Rp
b24oIHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUgKSB7CisJCXZhciB0ZXh0MUxlbmd0aCwgdGV4dDJM
ZW5ndGgsIG1heEQsIHZPZmZzZXQsIHZMZW5ndGgsCisJCQl2MSwgdjIsIHgsIGRlbHRhLCBmcm9u
dCwgazFzdGFydCwgazFlbmQsIGsyc3RhcnQsCisJCQlrMmVuZCwgazJPZmZzZXQsIGsxT2Zmc2V0
LCB4MSwgeDIsIHkxLCB5MiwgZCwgazEsIGsyOworCQkvLyBDYWNoZSB0aGUgdGV4dCBsZW5ndGhz
IHRvIHByZXZlbnQgbXVsdGlwbGUgY2FsbHMuCisJCXRleHQxTGVuZ3RoID0gdGV4dDEubGVuZ3Ro
OworCQl0ZXh0Mkxlbmd0aCA9IHRleHQyLmxlbmd0aDsKKwkJbWF4RCA9IE1hdGguY2VpbCggKCB0
ZXh0MUxlbmd0aCArIHRleHQyTGVuZ3RoICkgLyAyICk7CisJCXZPZmZzZXQgPSBtYXhEOworCQl2
TGVuZ3RoID0gMiAqIG1heEQ7CisJCXYxID0gbmV3IEFycmF5KCB2TGVuZ3RoICk7CisJCXYyID0g
bmV3IEFycmF5KCB2TGVuZ3RoICk7CisJCS8vIFNldHRpbmcgYWxsIGVsZW1lbnRzIHRvIC0xIGlz
IGZhc3RlciBpbiBDaHJvbWUgJiBGaXJlZm94IHRoYW4gbWl4aW5nCisJCS8vIGludGVnZXJzIGFu
ZCB1bmRlZmluZWQuCisJCWZvciAoIHggPSAwOyB4IDwgdkxlbmd0aDsgeCsrICkgeworCQkJdjFb
IHggXSA9IC0xOworCQkJdjJbIHggXSA9IC0xOworCQl9CisJCXYxWyB2T2Zmc2V0ICsgMSBdID0g
MDsKKwkJdjJbIHZPZmZzZXQgKyAxIF0gPSAwOworCQlkZWx0YSA9IHRleHQxTGVuZ3RoIC0gdGV4
dDJMZW5ndGg7CisJCS8vIElmIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBpcyBvZGQs
IHRoZW4gdGhlIGZyb250IHBhdGggd2lsbCBjb2xsaWRlCisJCS8vIHdpdGggdGhlIHJldmVyc2Ug
cGF0aC4KKwkJZnJvbnQgPSAoIGRlbHRhICUgMiAhPT0gMCApOworCQkvLyBPZmZzZXRzIGZvciBz
dGFydCBhbmQgZW5kIG9mIGsgbG9vcC4KKwkJLy8gUHJldmVudHMgbWFwcGluZyBvZiBzcGFjZSBi
ZXlvbmQgdGhlIGdyaWQuCisJCWsxc3RhcnQgPSAwOworCQlrMWVuZCA9IDA7CisJCWsyc3RhcnQg
PSAwOworCQlrMmVuZCA9IDA7CisJCWZvciAoIGQgPSAwOyBkIDwgbWF4RDsgZCsrICkgeworCQkJ
Ly8gQmFpbCBvdXQgaWYgZGVhZGxpbmUgaXMgcmVhY2hlZC4KKwkJCWlmICggKCBuZXcgRGF0ZSgp
ICkuZ2V0VGltZSgpID4gZGVhZGxpbmUgKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8vIFdh
bGsgdGhlIGZyb250IHBhdGggb25lIHN0ZXAuCisJCQlmb3IgKCBrMSA9IC1kICsgazFzdGFydDsg
azEgPD0gZCAtIGsxZW5kOyBrMSArPSAyICkgeworCQkJCWsxT2Zmc2V0ID0gdk9mZnNldCArIGsx
OworCQkJCWlmICggazEgPT09IC1kIHx8ICggazEgIT09IGQgJiYgdjFbIGsxT2Zmc2V0IC0gMSBd
IDwgdjFbIGsxT2Zmc2V0ICsgMSBdICkgKSB7CisJCQkJCXgxID0gdjFbIGsxT2Zmc2V0ICsgMSBd
OworCQkJCX0gZWxzZSB7CisJCQkJCXgxID0gdjFbIGsxT2Zmc2V0IC0gMSBdICsgMTsKKwkJCQl9
CisJCQkJeTEgPSB4MSAtIGsxOworCQkJCXdoaWxlICggeDEgPCB0ZXh0MUxlbmd0aCAmJiB5MSA8
IHRleHQyTGVuZ3RoICYmCisJCQkJCXRleHQxLmNoYXJBdCggeDEgKSA9PT0gdGV4dDIuY2hhckF0
KCB5MSApICkgeworCQkJCQl4MSsrOworCQkJCQl5MSsrOworCQkJCX0KKwkJCQl2MVsgazFPZmZz
ZXQgXSA9IHgxOworCQkJCWlmICggeDEgPiB0ZXh0MUxlbmd0aCApIHsKKwkJCQkJLy8gUmFuIG9m
ZiB0aGUgcmlnaHQgb2YgdGhlIGdyYXBoLgorCQkJCQlrMWVuZCArPSAyOworCQkJCX0gZWxzZSBp
ZiAoIHkxID4gdGV4dDJMZW5ndGggKSB7CisJCQkJCS8vIFJhbiBvZmYgdGhlIGJvdHRvbSBvZiB0
aGUgZ3JhcGguCisJCQkJCWsxc3RhcnQgKz0gMjsKKwkJCQl9IGVsc2UgaWYgKCBmcm9udCApIHsK
KwkJCQkJazJPZmZzZXQgPSB2T2Zmc2V0ICsgZGVsdGEgLSBrMTsKKwkJCQkJaWYgKCBrMk9mZnNl
dCA+PSAwICYmIGsyT2Zmc2V0IDwgdkxlbmd0aCAmJiB2MlsgazJPZmZzZXQgXSAhPT0gLTEgKSB7
CisJCQkJCQkvLyBNaXJyb3IgeDIgb250byB0b3AtbGVmdCBjb29yZGluYXRlIHN5c3RlbS4KKwkJ
CQkJCXgyID0gdGV4dDFMZW5ndGggLSB2MlsgazJPZmZzZXQgXTsKKwkJCQkJCWlmICggeDEgPj0g
eDIgKSB7CisJCQkJCQkJLy8gT3ZlcmxhcCBkZXRlY3RlZC4KKwkJCQkJCQlyZXR1cm4gdGhpcy5k
aWZmQmlzZWN0U3BsaXQoIHRleHQxLCB0ZXh0MiwgeDEsIHkxLCBkZWFkbGluZSApOworCQkJCQkJ
fQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBXYWxrIHRoZSByZXZlcnNlIHBhdGggb25l
IHN0ZXAuCisJCQlmb3IgKCBrMiA9IC1kICsgazJzdGFydDsgazIgPD0gZCAtIGsyZW5kOyBrMiAr
PSAyICkgeworCQkJCWsyT2Zmc2V0ID0gdk9mZnNldCArIGsyOworCQkJCWlmICggazIgPT09IC1k
IHx8ICggazIgIT09IGQgJiYgdjJbIGsyT2Zmc2V0IC0gMSBdIDwgdjJbIGsyT2Zmc2V0ICsgMSBd
ICkgKSB7CisJCQkJCXgyID0gdjJbIGsyT2Zmc2V0ICsgMSBdOworCQkJCX0gZWxzZSB7CisJCQkJ
CXgyID0gdjJbIGsyT2Zmc2V0IC0gMSBdICsgMTsKKwkJCQl9CisJCQkJeTIgPSB4MiAtIGsyOwor
CQkJCXdoaWxlICggeDIgPCB0ZXh0MUxlbmd0aCAmJiB5MiA8IHRleHQyTGVuZ3RoICYmCisJCQkJ
CXRleHQxLmNoYXJBdCggdGV4dDFMZW5ndGggLSB4MiAtIDEgKSA9PT0KKwkJCQkJdGV4dDIuY2hh
ckF0KCB0ZXh0Mkxlbmd0aCAtIHkyIC0gMSApICkgeworCQkJCQl4MisrOworCQkJCQl5MisrOwor
CQkJCX0KKwkJCQl2MlsgazJPZmZzZXQgXSA9IHgyOworCQkJCWlmICggeDIgPiB0ZXh0MUxlbmd0
aCApIHsKKwkJCQkJLy8gUmFuIG9mZiB0aGUgbGVmdCBvZiB0aGUgZ3JhcGguCisJCQkJCWsyZW5k
ICs9IDI7CisJCQkJfSBlbHNlIGlmICggeTIgPiB0ZXh0Mkxlbmd0aCApIHsKKwkJCQkJLy8gUmFu
IG9mZiB0aGUgdG9wIG9mIHRoZSBncmFwaC4KKwkJCQkJazJzdGFydCArPSAyOworCQkJCX0gZWxz
ZSBpZiAoICFmcm9udCApIHsKKwkJCQkJazFPZmZzZXQgPSB2T2Zmc2V0ICsgZGVsdGEgLSBrMjsK
KwkJCQkJaWYgKCBrMU9mZnNldCA+PSAwICYmIGsxT2Zmc2V0IDwgdkxlbmd0aCAmJiB2MVsgazFP
ZmZzZXQgXSAhPT0gLTEgKSB7CisJCQkJCQl4MSA9IHYxWyBrMU9mZnNldCBdOworCQkJCQkJeTEg
PSB2T2Zmc2V0ICsgeDEgLSBrMU9mZnNldDsKKwkJCQkJCS8vIE1pcnJvciB4MiBvbnRvIHRvcC1s
ZWZ0IGNvb3JkaW5hdGUgc3lzdGVtLgorCQkJCQkJeDIgPSB0ZXh0MUxlbmd0aCAtIHgyOworCQkJ
CQkJaWYgKCB4MSA+PSB4MiApIHsKKwkJCQkJCQkvLyBPdmVybGFwIGRldGVjdGVkLgorCQkJCQkJ
CXJldHVybiB0aGlzLmRpZmZCaXNlY3RTcGxpdCggdGV4dDEsIHRleHQyLCB4MSwgeTEsIGRlYWRs
aW5lICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gRGlmZiB0b29r
IHRvbyBsb25nIGFuZCBoaXQgdGhlIGRlYWRsaW5lIG9yCisJCS8vIG51bWJlciBvZiBkaWZmcyBl
cXVhbHMgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIG5vIGNvbW1vbmFsaXR5IGF0IGFsbC4KKwkJcmV0
dXJuIFsKKwkJCVsgRElGRl9ERUxFVEUsIHRleHQxIF0sCisJCQlbIERJRkZfSU5TRVJULCB0ZXh0
MiBdCisJCV07CisJfTsKKworCS8qKgorCSAqIEdpdmVuIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ21p
ZGRsZSBzbmFrZScsIHNwbGl0IHRoZSBkaWZmIGluIHR3byBwYXJ0cworCSAqIGFuZCByZWN1cnNl
LgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkg
KiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBh
cmFtIHtudW1iZXJ9IHggSW5kZXggb2Ygc3BsaXQgcG9pbnQgaW4gdGV4dDEuCisJICogQHBhcmFt
IHtudW1iZXJ9IHkgSW5kZXggb2Ygc3BsaXQgcG9pbnQgaW4gdGV4dDIuCisJICogQHBhcmFtIHtu
dW1iZXJ9IGRlYWRsaW5lIFRpbWUgYXQgd2hpY2ggdG8gYmFpbCBpZiBub3QgeWV0IGNvbXBsZXRl
LgorCSAqIEByZXR1cm4geyFBcnJheS48IURpZmZNYXRjaFBhdGNoLkRpZmY+fSBBcnJheSBvZiBk
aWZmIHR1cGxlcy4KKwkgKiBAcHJpdmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlw
ZS5kaWZmQmlzZWN0U3BsaXQgPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyLCB4LCB5LCBkZWFkbGlu
ZSApIHsKKwkJdmFyIHRleHQxYSwgdGV4dDFiLCB0ZXh0MmEsIHRleHQyYiwgZGlmZnMsIGRpZmZz
YjsKKwkJdGV4dDFhID0gdGV4dDEuc3Vic3RyaW5nKCAwLCB4ICk7CisJCXRleHQyYSA9IHRleHQy
LnN1YnN0cmluZyggMCwgeSApOworCQl0ZXh0MWIgPSB0ZXh0MS5zdWJzdHJpbmcoIHggKTsKKwkJ
dGV4dDJiID0gdGV4dDIuc3Vic3RyaW5nKCB5ICk7CisKKwkJLy8gQ29tcHV0ZSBib3RoIGRpZmZz
IHNlcmlhbGx5LgorCQlkaWZmcyA9IHRoaXMuRGlmZk1haW4oIHRleHQxYSwgdGV4dDJhLCBmYWxz
ZSwgZGVhZGxpbmUgKTsKKwkJZGlmZnNiID0gdGhpcy5EaWZmTWFpbiggdGV4dDFiLCB0ZXh0MmIs
IGZhbHNlLCBkZWFkbGluZSApOworCisJCXJldHVybiBkaWZmcy5jb25jYXQoIGRpZmZzYiApOwor
CX07CisKKwkvKioKKwkgKiBSZWR1Y2UgdGhlIG51bWJlciBvZiBlZGl0cyBieSBlbGltaW5hdGlu
ZyBzZW1hbnRpY2FsbHkgdHJpdmlhbCBlcXVhbGl0aWVzLgorCSAqIEBwYXJhbSB7IUFycmF5Ljwh
RGlmZk1hdGNoUGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqLwor
CURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ2xlYW51cFNlbWFudGljID0gZnVuY3Rpb24o
IGRpZmZzICkgeworCQl2YXIgY2hhbmdlcywgZXF1YWxpdGllcywgZXF1YWxpdGllc0xlbmd0aCwg
bGFzdGVxdWFsaXR5LAorCQkJcG9pbnRlciwgbGVuZ3RoSW5zZXJ0aW9uczIsIGxlbmd0aERlbGV0
aW9uczIsIGxlbmd0aEluc2VydGlvbnMxLAorCQkJbGVuZ3RoRGVsZXRpb25zMSwgZGVsZXRpb24s
IGluc2VydGlvbiwgb3ZlcmxhcExlbmd0aDEsIG92ZXJsYXBMZW5ndGgyOworCQljaGFuZ2VzID0g
ZmFsc2U7CisJCWVxdWFsaXRpZXMgPSBbXTsgLy8gU3RhY2sgb2YgaW5kaWNlcyB3aGVyZSBlcXVh
bGl0aWVzIGFyZSBmb3VuZC4KKwkJZXF1YWxpdGllc0xlbmd0aCA9IDA7IC8vIEtlZXBpbmcgb3Vy
IG93biBsZW5ndGggdmFyIGlzIGZhc3RlciBpbiBKUy4KKwkJLyoqIEB0eXBlIHs/c3RyaW5nfSAq
LworCQlsYXN0ZXF1YWxpdHkgPSBudWxsOworCQkvLyBBbHdheXMgZXF1YWwgdG8gZGlmZnNbZXF1
YWxpdGllc1tlcXVhbGl0aWVzTGVuZ3RoIC0gMV1dWzFdCisJCXBvaW50ZXIgPSAwOyAvLyBJbmRl
eCBvZiBjdXJyZW50IHBvc2l0aW9uLgorCQkvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGNo
YW5nZWQgcHJpb3IgdG8gdGhlIGVxdWFsaXR5LgorCQlsZW5ndGhJbnNlcnRpb25zMSA9IDA7CisJ
CWxlbmd0aERlbGV0aW9uczEgPSAwOworCQkvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGNo
YW5nZWQgYWZ0ZXIgdGhlIGVxdWFsaXR5LgorCQlsZW5ndGhJbnNlcnRpb25zMiA9IDA7CisJCWxl
bmd0aERlbGV0aW9uczIgPSAwOworCQl3aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggKSB7
CisJCQlpZiAoIGRpZmZzWyBwb2ludGVyIF1bIDAgXSA9PT0gRElGRl9FUVVBTCApIHsgLy8gRXF1
YWxpdHkgZm91bmQuCisJCQkJZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCsrIF0gPSBwb2lu
dGVyOworCQkJCWxlbmd0aEluc2VydGlvbnMxID0gbGVuZ3RoSW5zZXJ0aW9uczI7CisJCQkJbGVu
Z3RoRGVsZXRpb25zMSA9IGxlbmd0aERlbGV0aW9uczI7CisJCQkJbGVuZ3RoSW5zZXJ0aW9uczIg
PSAwOworCQkJCWxlbmd0aERlbGV0aW9uczIgPSAwOworCQkJCWxhc3RlcXVhbGl0eSA9IGRpZmZz
WyBwb2ludGVyIF1bIDEgXTsKKwkJCX0gZWxzZSB7IC8vIEFuIGluc2VydGlvbiBvciBkZWxldGlv
bi4KKwkJCQlpZiAoIGRpZmZzWyBwb2ludGVyIF1bIDAgXSA9PT0gRElGRl9JTlNFUlQgKSB7CisJ
CQkJCWxlbmd0aEluc2VydGlvbnMyICs9IGRpZmZzWyBwb2ludGVyIF1bIDEgXS5sZW5ndGg7CisJ
CQkJfSBlbHNlIHsKKwkJCQkJbGVuZ3RoRGVsZXRpb25zMiArPSBkaWZmc1sgcG9pbnRlciBdWyAx
IF0ubGVuZ3RoOworCQkJCX0KKwkJCQkvLyBFbGltaW5hdGUgYW4gZXF1YWxpdHkgdGhhdCBpcyBz
bWFsbGVyIG9yIGVxdWFsIHRvIHRoZSBlZGl0cyBvbiBib3RoCisJCQkJLy8gc2lkZXMgb2YgaXQu
CisJCQkJaWYgKCBsYXN0ZXF1YWxpdHkgJiYgKCBsYXN0ZXF1YWxpdHkubGVuZ3RoIDw9CisJCQkJ
CQlNYXRoLm1heCggbGVuZ3RoSW5zZXJ0aW9uczEsIGxlbmd0aERlbGV0aW9uczEgKSApICYmCisJ
CQkJCQkoIGxhc3RlcXVhbGl0eS5sZW5ndGggPD0gTWF0aC5tYXgoIGxlbmd0aEluc2VydGlvbnMy
LAorCQkJCQkJCWxlbmd0aERlbGV0aW9uczIgKSApICkgeworCisJCQkJCS8vIER1cGxpY2F0ZSBy
ZWNvcmQuCisJCQkJCWRpZmZzLnNwbGljZSgKKwkJCQkJCWVxdWFsaXRpZXNbIGVxdWFsaXRpZXNM
ZW5ndGggLSAxIF0sCisJCQkJCQkwLAorCQkJCQkJWyBESUZGX0RFTEVURSwgbGFzdGVxdWFsaXR5
IF0KKwkJCQkJKTsKKworCQkJCQkvLyBDaGFuZ2Ugc2Vjb25kIGNvcHkgdG8gaW5zZXJ0LgorCQkJ
CQlkaWZmc1sgZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCAtIDEgXSArIDEgXVsgMCBdID0g
RElGRl9JTlNFUlQ7CisKKwkJCQkJLy8gVGhyb3cgYXdheSB0aGUgZXF1YWxpdHkgd2UganVzdCBk
ZWxldGVkLgorCQkJCQllcXVhbGl0aWVzTGVuZ3RoLS07CisKKwkJCQkJLy8gVGhyb3cgYXdheSB0
aGUgcHJldmlvdXMgZXF1YWxpdHkgKGl0IG5lZWRzIHRvIGJlIHJlZXZhbHVhdGVkKS4KKwkJCQkJ
ZXF1YWxpdGllc0xlbmd0aC0tOworCQkJCQlwb2ludGVyID0gZXF1YWxpdGllc0xlbmd0aCA+IDAg
PyBlcXVhbGl0aWVzWyBlcXVhbGl0aWVzTGVuZ3RoIC0gMSBdIDogLTE7CisKKwkJCQkJLy8gUmVz
ZXQgdGhlIGNvdW50ZXJzLgorCQkJCQlsZW5ndGhJbnNlcnRpb25zMSA9IDA7CisJCQkJCWxlbmd0
aERlbGV0aW9uczEgPSAwOworCQkJCQlsZW5ndGhJbnNlcnRpb25zMiA9IDA7CisJCQkJCWxlbmd0
aERlbGV0aW9uczIgPSAwOworCQkJCQlsYXN0ZXF1YWxpdHkgPSBudWxsOworCQkJCQljaGFuZ2Vz
ID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlwb2ludGVyKys7CisJCX0KKworCQkvLyBOb3JtYWxp
emUgdGhlIGRpZmYuCisJCWlmICggY2hhbmdlcyApIHsKKwkJCXRoaXMuZGlmZkNsZWFudXBNZXJn
ZSggZGlmZnMgKTsKKwkJfQorCisJCS8vIEZpbmQgYW55IG92ZXJsYXBzIGJldHdlZW4gZGVsZXRp
b25zIGFuZCBpbnNlcnRpb25zLgorCQkvLyBlLmc6IDxkZWw+YWJjeHh4PC9kZWw+PGlucz54eHhk
ZWY8L2lucz4KKwkJLy8gICAtPiA8ZGVsPmFiYzwvZGVsPnh4eDxpbnM+ZGVmPC9pbnM+CisJCS8v
IGUuZzogPGRlbD54eHhhYmM8L2RlbD48aW5zPmRlZnh4eDwvaW5zPgorCQkvLyAgIC0+IDxpbnM+
ZGVmPC9pbnM+eHh4PGRlbD5hYmM8L2RlbD4KKwkJLy8gT25seSBleHRyYWN0IGFuIG92ZXJsYXAg
aWYgaXQgaXMgYXMgYmlnIGFzIHRoZSBlZGl0IGFoZWFkIG9yIGJlaGluZCBpdC4KKwkJcG9pbnRl
ciA9IDE7CisJCXdoaWxlICggcG9pbnRlciA8IGRpZmZzLmxlbmd0aCApIHsKKwkJCWlmICggZGlm
ZnNbIHBvaW50ZXIgLSAxIF1bIDAgXSA9PT0gRElGRl9ERUxFVEUgJiYKKwkJCQkJZGlmZnNbIHBv
aW50ZXIgXVsgMCBdID09PSBESUZGX0lOU0VSVCApIHsKKwkJCQlkZWxldGlvbiA9IGRpZmZzWyBw
b2ludGVyIC0gMSBdWyAxIF07CisJCQkJaW5zZXJ0aW9uID0gZGlmZnNbIHBvaW50ZXIgXVsgMSBd
OworCQkJCW92ZXJsYXBMZW5ndGgxID0gdGhpcy5kaWZmQ29tbW9uT3ZlcmxhcCggZGVsZXRpb24s
IGluc2VydGlvbiApOworCQkJCW92ZXJsYXBMZW5ndGgyID0gdGhpcy5kaWZmQ29tbW9uT3Zlcmxh
cCggaW5zZXJ0aW9uLCBkZWxldGlvbiApOworCQkJCWlmICggb3ZlcmxhcExlbmd0aDEgPj0gb3Zl
cmxhcExlbmd0aDIgKSB7CisJCQkJCWlmICggb3ZlcmxhcExlbmd0aDEgPj0gZGVsZXRpb24ubGVu
Z3RoIC8gMiB8fAorCQkJCQkJCW92ZXJsYXBMZW5ndGgxID49IGluc2VydGlvbi5sZW5ndGggLyAy
ICkgeworCQkJCQkJLy8gT3ZlcmxhcCBmb3VuZC4gIEluc2VydCBhbiBlcXVhbGl0eSBhbmQgdHJp
bSB0aGUgc3Vycm91bmRpbmcgZWRpdHMuCisJCQkJCQlkaWZmcy5zcGxpY2UoCisJCQkJCQkJcG9p
bnRlciwKKwkJCQkJCQkwLAorCQkJCQkJCVsgRElGRl9FUVVBTCwgaW5zZXJ0aW9uLnN1YnN0cmlu
ZyggMCwgb3ZlcmxhcExlbmd0aDEgKSBdCisJCQkJCQkpOworCQkJCQkJZGlmZnNbIHBvaW50ZXIg
LSAxIF1bIDEgXSA9CisJCQkJCQkJZGVsZXRpb24uc3Vic3RyaW5nKCAwLCBkZWxldGlvbi5sZW5n
dGggLSBvdmVybGFwTGVuZ3RoMSApOworCQkJCQkJZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXSA9
IGluc2VydGlvbi5zdWJzdHJpbmcoIG92ZXJsYXBMZW5ndGgxICk7CisJCQkJCQlwb2ludGVyKys7
CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIG92ZXJsYXBMZW5ndGgyID49IGRlbGV0
aW9uLmxlbmd0aCAvIDIgfHwKKwkJCQkJCQlvdmVybGFwTGVuZ3RoMiA+PSBpbnNlcnRpb24ubGVu
Z3RoIC8gMiApIHsKKworCQkJCQkJLy8gUmV2ZXJzZSBvdmVybGFwIGZvdW5kLgorCQkJCQkJLy8g
SW5zZXJ0IGFuIGVxdWFsaXR5IGFuZCBzd2FwIGFuZCB0cmltIHRoZSBzdXJyb3VuZGluZyBlZGl0
cy4KKwkJCQkJCWRpZmZzLnNwbGljZSgKKwkJCQkJCQlwb2ludGVyLAorCQkJCQkJCTAsCisJCQkJ
CQkJWyBESUZGX0VRVUFMLCBkZWxldGlvbi5zdWJzdHJpbmcoIDAsIG92ZXJsYXBMZW5ndGgyICkg
XQorCQkJCQkJKTsKKworCQkJCQkJZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDAgXSA9IERJRkZfSU5T
RVJUOworCQkJCQkJZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXSA9CisJCQkJCQkJaW5zZXJ0aW9u
LnN1YnN0cmluZyggMCwgaW5zZXJ0aW9uLmxlbmd0aCAtIG92ZXJsYXBMZW5ndGgyICk7CisJCQkJ
CQlkaWZmc1sgcG9pbnRlciArIDEgXVsgMCBdID0gRElGRl9ERUxFVEU7CisJCQkJCQlkaWZmc1sg
cG9pbnRlciArIDEgXVsgMSBdID0KKwkJCQkJCQlkZWxldGlvbi5zdWJzdHJpbmcoIG92ZXJsYXBM
ZW5ndGgyICk7CisJCQkJCQlwb2ludGVyKys7CisJCQkJCX0KKwkJCQl9CisJCQkJcG9pbnRlcisr
OworCQkJfQorCQkJcG9pbnRlcisrOworCQl9CisJfTsKKworCS8qKgorCSAqIERldGVybWluZSBp
ZiB0aGUgc3VmZml4IG9mIG9uZSBzdHJpbmcgaXMgdGhlIHByZWZpeCBvZiBhbm90aGVyLgorCSAq
IEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuCisJICogQHBhcmFtIHtzdHJpbmd9
IHRleHQyIFNlY29uZCBzdHJpbmcuCisJICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9m
IGNoYXJhY3RlcnMgY29tbW9uIHRvIHRoZSBlbmQgb2YgdGhlIGZpcnN0CisJICogICAgIHN0cmlu
ZyBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBzZWNvbmQgc3RyaW5nLgorCSAqIEBwcml2YXRlCisJICov
CisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDb21tb25PdmVybGFwID0gZnVuY3Rpb24o
IHRleHQxLCB0ZXh0MiApIHsKKwkJdmFyIHRleHQxTGVuZ3RoLCB0ZXh0Mkxlbmd0aCwgdGV4dExl
bmd0aCwKKwkJCWJlc3QsIGxlbmd0aCwgcGF0dGVybiwgZm91bmQ7CisJCS8vIENhY2hlIHRoZSB0
ZXh0IGxlbmd0aHMgdG8gcHJldmVudCBtdWx0aXBsZSBjYWxscy4KKwkJdGV4dDFMZW5ndGggPSB0
ZXh0MS5sZW5ndGg7CisJCXRleHQyTGVuZ3RoID0gdGV4dDIubGVuZ3RoOworCQkvLyBFbGltaW5h
dGUgdGhlIG51bGwgY2FzZS4KKwkJaWYgKCB0ZXh0MUxlbmd0aCA9PT0gMCB8fCB0ZXh0Mkxlbmd0
aCA9PT0gMCApIHsKKwkJCXJldHVybiAwOworCQl9CisJCS8vIFRydW5jYXRlIHRoZSBsb25nZXIg
c3RyaW5nLgorCQlpZiAoIHRleHQxTGVuZ3RoID4gdGV4dDJMZW5ndGggKSB7CisJCQl0ZXh0MSA9
IHRleHQxLnN1YnN0cmluZyggdGV4dDFMZW5ndGggLSB0ZXh0Mkxlbmd0aCApOworCQl9IGVsc2Ug
aWYgKCB0ZXh0MUxlbmd0aCA8IHRleHQyTGVuZ3RoICkgeworCQkJdGV4dDIgPSB0ZXh0Mi5zdWJz
dHJpbmcoIDAsIHRleHQxTGVuZ3RoICk7CisJCX0KKwkJdGV4dExlbmd0aCA9IE1hdGgubWluKCB0
ZXh0MUxlbmd0aCwgdGV4dDJMZW5ndGggKTsKKwkJLy8gUXVpY2sgY2hlY2sgZm9yIHRoZSB3b3Jz
dCBjYXNlLgorCQlpZiAoIHRleHQxID09PSB0ZXh0MiApIHsKKwkJCXJldHVybiB0ZXh0TGVuZ3Ro
OworCQl9CisKKwkJLy8gU3RhcnQgYnkgbG9va2luZyBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyIG1h
dGNoCisJCS8vIGFuZCBpbmNyZWFzZSBsZW5ndGggdW50aWwgbm8gbWF0Y2ggaXMgZm91bmQuCisJ
CS8vIFBlcmZvcm1hbmNlIGFuYWx5c2lzOiBodHRwOi8vbmVpbC5mcmFzZXIubmFtZS9uZXdzLzIw
MTAvMTEvMDQvCisJCWJlc3QgPSAwOworCQlsZW5ndGggPSAxOworCQl3aGlsZSAoIHRydWUgKSB7
CisJCQlwYXR0ZXJuID0gdGV4dDEuc3Vic3RyaW5nKCB0ZXh0TGVuZ3RoIC0gbGVuZ3RoICk7CisJ
CQlmb3VuZCA9IHRleHQyLmluZGV4T2YoIHBhdHRlcm4gKTsKKwkJCWlmICggZm91bmQgPT09IC0x
ICkgeworCQkJCXJldHVybiBiZXN0OworCQkJfQorCQkJbGVuZ3RoICs9IGZvdW5kOworCQkJaWYg
KCBmb3VuZCA9PT0gMCB8fCB0ZXh0MS5zdWJzdHJpbmcoIHRleHRMZW5ndGggLSBsZW5ndGggKSA9
PT0KKwkJCQkJdGV4dDIuc3Vic3RyaW5nKCAwLCBsZW5ndGggKSApIHsKKwkJCQliZXN0ID0gbGVu
Z3RoOworCQkJCWxlbmd0aCsrOworCQkJfQorCQl9CisJfTsKKworCS8qKgorCSAqIFNwbGl0IHR3
byB0ZXh0cyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuICBSZWR1Y2UgdGhlIHRleHRzIHRvIGEg
c3RyaW5nIG9mCisJICogaGFzaGVzIHdoZXJlIGVhY2ggVW5pY29kZSBjaGFyYWN0ZXIgcmVwcmVz
ZW50cyBvbmUgbGluZS4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLgor
CSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBTZWNvbmQgc3RyaW5nLgorCSAqIEByZXR1cm4ge3tj
aGFyczE6IHN0cmluZywgY2hhcnMyOiBzdHJpbmcsIGxpbmVBcnJheTogIUFycmF5LjxzdHJpbmc+
fX0KKwkgKiAgICAgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgdGV4dDEsIHRoZSBl
bmNvZGVkIHRleHQyIGFuZAorCSAqICAgICB0aGUgYXJyYXkgb2YgdW5pcXVlIHN0cmluZ3MuCisJ
ICogICAgIFRoZSB6ZXJvdGggZWxlbWVudCBvZiB0aGUgYXJyYXkgb2YgdW5pcXVlIHN0cmluZ3Mg
aXMgaW50ZW50aW9uYWxseSBibGFuay4KKwkgKiBAcHJpdmF0ZQorCSAqLworCURpZmZNYXRjaFBh
dGNoLnByb3RvdHlwZS5kaWZmTGluZXNUb0NoYXJzID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiAp
IHsKKwkJdmFyIGxpbmVBcnJheSwgbGluZUhhc2gsIGNoYXJzMSwgY2hhcnMyOworCQlsaW5lQXJy
YXkgPSBbXTsgLy8gZS5nLiBsaW5lQXJyYXlbNF0gPT09ICdIZWxsb1xuJworCQlsaW5lSGFzaCA9
IHt9OyAvLyBlLmcuIGxpbmVIYXNoWydIZWxsb1xuJ10gPT09IDQKKworCQkvLyAnXHgwMCcgaXMg
YSB2YWxpZCBjaGFyYWN0ZXIsIGJ1dCB2YXJpb3VzIGRlYnVnZ2VycyBkb24ndCBsaWtlIGl0Lgor
CQkvLyBTbyB3ZSdsbCBpbnNlcnQgYSBqdW5rIGVudHJ5IHRvIGF2b2lkIGdlbmVyYXRpbmcgYSBu
dWxsIGNoYXJhY3Rlci4KKwkJbGluZUFycmF5WyAwIF0gPSAiIjsKKworCQkvKioKKwkJICogU3Bs
aXQgYSB0ZXh0IGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy4gIFJlZHVjZSB0aGUgdGV4dHMgdG8g
YSBzdHJpbmcgb2YKKwkJICogaGFzaGVzIHdoZXJlIGVhY2ggVW5pY29kZSBjaGFyYWN0ZXIgcmVw
cmVzZW50cyBvbmUgbGluZS4KKwkJICogTW9kaWZpZXMgbGluZWFycmF5IGFuZCBsaW5laGFzaCB0
aHJvdWdoIGJlaW5nIGEgY2xvc3VyZS4KKwkJICogQHBhcmFtIHtzdHJpbmd9IHRleHQgU3RyaW5n
IHRvIGVuY29kZS4KKwkJICogQHJldHVybiB7c3RyaW5nfSBFbmNvZGVkIHN0cmluZy4KKwkJICog
QHByaXZhdGUKKwkJICovCisJCWZ1bmN0aW9uIGRpZmZMaW5lc1RvQ2hhcnNNdW5nZSggdGV4dCAp
IHsKKwkJCXZhciBjaGFycywgbGluZVN0YXJ0LCBsaW5lRW5kLCBsaW5lQXJyYXlMZW5ndGgsIGxp
bmU7CisJCQljaGFycyA9ICIiOworCQkJLy8gV2FsayB0aGUgdGV4dCwgcHVsbGluZyBvdXQgYSBz
dWJzdHJpbmcgZm9yIGVhY2ggbGluZS4KKwkJCS8vIHRleHQuc3BsaXQoJ1xuJykgd291bGQgd291
bGQgdGVtcG9yYXJpbHkgZG91YmxlIG91ciBtZW1vcnkgZm9vdHByaW50LgorCQkJLy8gTW9kaWZ5
aW5nIHRleHQgd291bGQgY3JlYXRlIG1hbnkgbGFyZ2Ugc3RyaW5ncyB0byBnYXJiYWdlIGNvbGxl
Y3QuCisJCQlsaW5lU3RhcnQgPSAwOworCQkJbGluZUVuZCA9IC0xOworCQkJLy8gS2VlcGluZyBv
dXIgb3duIGxlbmd0aCB2YXJpYWJsZSBpcyBmYXN0ZXIgdGhhbiBsb29raW5nIGl0IHVwLgorCQkJ
bGluZUFycmF5TGVuZ3RoID0gbGluZUFycmF5Lmxlbmd0aDsKKwkJCXdoaWxlICggbGluZUVuZCA8
IHRleHQubGVuZ3RoIC0gMSApIHsKKwkJCQlsaW5lRW5kID0gdGV4dC5pbmRleE9mKCAiXG4iLCBs
aW5lU3RhcnQgKTsKKwkJCQlpZiAoIGxpbmVFbmQgPT09IC0xICkgeworCQkJCQlsaW5lRW5kID0g
dGV4dC5sZW5ndGggLSAxOworCQkJCX0KKwkJCQlsaW5lID0gdGV4dC5zdWJzdHJpbmcoIGxpbmVT
dGFydCwgbGluZUVuZCArIDEgKTsKKwkJCQlsaW5lU3RhcnQgPSBsaW5lRW5kICsgMTsKKworCQkJ
CWlmICggbGluZUhhc2guaGFzT3duUHJvcGVydHkgPyBsaW5lSGFzaC5oYXNPd25Qcm9wZXJ0eSgg
bGluZSApIDoKKwkJCQkJCQkoIGxpbmVIYXNoWyBsaW5lIF0gIT09IHVuZGVmaW5lZCApICkgewor
CQkJCQljaGFycyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBsaW5lSGFzaFsgbGluZSBdICk7CisJ
CQkJfSBlbHNlIHsKKwkJCQkJY2hhcnMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggbGluZUFycmF5
TGVuZ3RoICk7CisJCQkJCWxpbmVIYXNoWyBsaW5lIF0gPSBsaW5lQXJyYXlMZW5ndGg7CisJCQkJ
CWxpbmVBcnJheVsgbGluZUFycmF5TGVuZ3RoKysgXSA9IGxpbmU7CisJCQkJfQorCQkJfQorCQkJ
cmV0dXJuIGNoYXJzOworCQl9CisKKwkJY2hhcnMxID0gZGlmZkxpbmVzVG9DaGFyc011bmdlKCB0
ZXh0MSApOworCQljaGFyczIgPSBkaWZmTGluZXNUb0NoYXJzTXVuZ2UoIHRleHQyICk7CisJCXJl
dHVybiB7CisJCQljaGFyczE6IGNoYXJzMSwKKwkJCWNoYXJzMjogY2hhcnMyLAorCQkJbGluZUFy
cmF5OiBsaW5lQXJyYXkKKwkJfTsKKwl9OworCisJLyoqCisJICogUmVoeWRyYXRlIHRoZSB0ZXh0
IGluIGEgZGlmZiBmcm9tIGEgc3RyaW5nIG9mIGxpbmUgaGFzaGVzIHRvIHJlYWwgbGluZXMgb2YK
KwkgKiB0ZXh0LgorCSAqIEBwYXJhbSB7IUFycmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59IGRp
ZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqIEBwYXJhbSB7IUFycmF5LjxzdHJpbmc+fSBs
aW5lQXJyYXkgQXJyYXkgb2YgdW5pcXVlIHN0cmluZ3MuCisJICogQHByaXZhdGUKKwkgKi8KKwlE
aWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNoYXJzVG9MaW5lcyA9IGZ1bmN0aW9uKCBkaWZm
cywgbGluZUFycmF5ICkgeworCQl2YXIgeCwgY2hhcnMsIHRleHQsIHk7CisJCWZvciAoIHggPSAw
OyB4IDwgZGlmZnMubGVuZ3RoOyB4KysgKSB7CisJCQljaGFycyA9IGRpZmZzWyB4IF1bIDEgXTsK
KwkJCXRleHQgPSBbXTsKKwkJCWZvciAoIHkgPSAwOyB5IDwgY2hhcnMubGVuZ3RoOyB5KysgKSB7
CisJCQkJdGV4dFsgeSBdID0gbGluZUFycmF5WyBjaGFycy5jaGFyQ29kZUF0KCB5ICkgXTsKKwkJ
CX0KKwkJCWRpZmZzWyB4IF1bIDEgXSA9IHRleHQuam9pbiggIiIgKTsKKwkJfQorCX07CisKKwkv
KioKKwkgKiBSZW9yZGVyIGFuZCBtZXJnZSBsaWtlIGVkaXQgc2VjdGlvbnMuICBNZXJnZSBlcXVh
bGl0aWVzLgorCSAqIEFueSBlZGl0IHNlY3Rpb24gY2FuIG1vdmUgYXMgbG9uZyBhcyBpdCBkb2Vz
bid0IGNyb3NzIGFuIGVxdWFsaXR5LgorCSAqIEBwYXJhbSB7IUFycmF5LjwhRGlmZk1hdGNoUGF0
Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqLworCURpZmZNYXRjaFBh
dGNoLnByb3RvdHlwZS5kaWZmQ2xlYW51cE1lcmdlID0gZnVuY3Rpb24oIGRpZmZzICkgeworCQl2
YXIgcG9pbnRlciwgY291bnREZWxldGUsIGNvdW50SW5zZXJ0LCB0ZXh0SW5zZXJ0LCB0ZXh0RGVs
ZXRlLAorCQkJY29tbW9ubGVuZ3RoLCBjaGFuZ2VzLCBkaWZmUG9pbnRlciwgcG9zaXRpb247CisJ
CWRpZmZzLnB1c2goIFsgRElGRl9FUVVBTCwgIiIgXSApOyAvLyBBZGQgYSBkdW1teSBlbnRyeSBh
dCB0aGUgZW5kLgorCQlwb2ludGVyID0gMDsKKwkJY291bnREZWxldGUgPSAwOworCQljb3VudElu
c2VydCA9IDA7CisJCXRleHREZWxldGUgPSAiIjsKKwkJdGV4dEluc2VydCA9ICIiOworCQljb21t
b25sZW5ndGg7CisJCXdoaWxlICggcG9pbnRlciA8IGRpZmZzLmxlbmd0aCApIHsKKwkJCXN3aXRj
aCAoIGRpZmZzWyBwb2ludGVyIF1bIDAgXSApIHsKKwkJCWNhc2UgRElGRl9JTlNFUlQ6CisJCQkJ
Y291bnRJbnNlcnQrKzsKKwkJCQl0ZXh0SW5zZXJ0ICs9IGRpZmZzWyBwb2ludGVyIF1bIDEgXTsK
KwkJCQlwb2ludGVyKys7CisJCQkJYnJlYWs7CisJCQljYXNlIERJRkZfREVMRVRFOgorCQkJCWNv
dW50RGVsZXRlKys7CisJCQkJdGV4dERlbGV0ZSArPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJ
CQkJcG9pbnRlcisrOworCQkJCWJyZWFrOworCQkJY2FzZSBESUZGX0VRVUFMOgorCQkJCS8vIFVw
b24gcmVhY2hpbmcgYW4gZXF1YWxpdHksIGNoZWNrIGZvciBwcmlvciByZWR1bmRhbmNpZXMuCisJ
CQkJaWYgKCBjb3VudERlbGV0ZSArIGNvdW50SW5zZXJ0ID4gMSApIHsKKwkJCQkJaWYgKCBjb3Vu
dERlbGV0ZSAhPT0gMCAmJiBjb3VudEluc2VydCAhPT0gMCApIHsKKwkJCQkJCS8vIEZhY3RvciBv
dXQgYW55IGNvbW1vbiBwcmVmaXhpZXMuCisJCQkJCQljb21tb25sZW5ndGggPSB0aGlzLmRpZmZD
b21tb25QcmVmaXgoIHRleHRJbnNlcnQsIHRleHREZWxldGUgKTsKKwkJCQkJCWlmICggY29tbW9u
bGVuZ3RoICE9PSAwICkgeworCQkJCQkJCWlmICggKCBwb2ludGVyIC0gY291bnREZWxldGUgLSBj
b3VudEluc2VydCApID4gMCAmJgorCQkJCQkJCQkJZGlmZnNbIHBvaW50ZXIgLSBjb3VudERlbGV0
ZSAtIGNvdW50SW5zZXJ0IC0gMSBdWyAwIF0gPT09CisJCQkJCQkJCQlESUZGX0VRVUFMICkgewor
CQkJCQkJCQlkaWZmc1sgcG9pbnRlciAtIGNvdW50RGVsZXRlIC0gY291bnRJbnNlcnQgLSAxIF1b
IDEgXSArPQorCQkJCQkJCQkJdGV4dEluc2VydC5zdWJzdHJpbmcoIDAsIGNvbW1vbmxlbmd0aCAp
OworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWRpZmZzLnNwbGljZSggMCwgMCwgWyBESUZGX0VR
VUFMLAorCQkJCQkJCQkJdGV4dEluc2VydC5zdWJzdHJpbmcoIDAsIGNvbW1vbmxlbmd0aCApCisJ
CQkJCQkJCV0gKTsKKwkJCQkJCQkJcG9pbnRlcisrOworCQkJCQkJCX0KKwkJCQkJCQl0ZXh0SW5z
ZXJ0ID0gdGV4dEluc2VydC5zdWJzdHJpbmcoIGNvbW1vbmxlbmd0aCApOworCQkJCQkJCXRleHRE
ZWxldGUgPSB0ZXh0RGVsZXRlLnN1YnN0cmluZyggY29tbW9ubGVuZ3RoICk7CisJCQkJCQl9CisJ
CQkJCQkvLyBGYWN0b3Igb3V0IGFueSBjb21tb24gc3VmZml4aWVzLgorCQkJCQkJY29tbW9ubGVu
Z3RoID0gdGhpcy5kaWZmQ29tbW9uU3VmZml4KCB0ZXh0SW5zZXJ0LCB0ZXh0RGVsZXRlICk7CisJ
CQkJCQlpZiAoIGNvbW1vbmxlbmd0aCAhPT0gMCApIHsKKwkJCQkJCQlkaWZmc1sgcG9pbnRlciBd
WyAxIF0gPSB0ZXh0SW5zZXJ0LnN1YnN0cmluZyggdGV4dEluc2VydC5sZW5ndGggLQorCQkJCQkJ
CQkJY29tbW9ubGVuZ3RoICkgKyBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJCQkJdGV4dElu
c2VydCA9IHRleHRJbnNlcnQuc3Vic3RyaW5nKCAwLCB0ZXh0SW5zZXJ0Lmxlbmd0aCAtCisJCQkJ
CQkJCWNvbW1vbmxlbmd0aCApOworCQkJCQkJCXRleHREZWxldGUgPSB0ZXh0RGVsZXRlLnN1YnN0
cmluZyggMCwgdGV4dERlbGV0ZS5sZW5ndGggLQorCQkJCQkJCQljb21tb25sZW5ndGggKTsKKwkJ
CQkJCX0KKwkJCQkJfQorCQkJCQkvLyBEZWxldGUgdGhlIG9mZmVuZGluZyByZWNvcmRzIGFuZCBh
ZGQgdGhlIG1lcmdlZCBvbmVzLgorCQkJCQlpZiAoIGNvdW50RGVsZXRlID09PSAwICkgeworCQkJ
CQkJZGlmZnMuc3BsaWNlKCBwb2ludGVyIC0gY291bnRJbnNlcnQsCisJCQkJCQkJY291bnREZWxl
dGUgKyBjb3VudEluc2VydCwgWyBESUZGX0lOU0VSVCwgdGV4dEluc2VydCBdICk7CisJCQkJCX0g
ZWxzZSBpZiAoIGNvdW50SW5zZXJ0ID09PSAwICkgeworCQkJCQkJZGlmZnMuc3BsaWNlKCBwb2lu
dGVyIC0gY291bnREZWxldGUsCisJCQkJCQkJY291bnREZWxldGUgKyBjb3VudEluc2VydCwgWyBE
SUZGX0RFTEVURSwgdGV4dERlbGV0ZSBdICk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkaWZmcy5z
cGxpY2UoCisJCQkJCQkJcG9pbnRlciAtIGNvdW50RGVsZXRlIC0gY291bnRJbnNlcnQsCisJCQkJ
CQkJY291bnREZWxldGUgKyBjb3VudEluc2VydCwKKwkJCQkJCQlbIERJRkZfREVMRVRFLCB0ZXh0
RGVsZXRlIF0sIFsgRElGRl9JTlNFUlQsIHRleHRJbnNlcnQgXQorCQkJCQkJKTsKKwkJCQkJfQor
CQkJCQlwb2ludGVyID0gcG9pbnRlciAtIGNvdW50RGVsZXRlIC0gY291bnRJbnNlcnQgKworCQkJ
CQkJKCBjb3VudERlbGV0ZSA/IDEgOiAwICkgKyAoIGNvdW50SW5zZXJ0ID8gMSA6IDAgKSArIDE7
CisJCQkJfSBlbHNlIGlmICggcG9pbnRlciAhPT0gMCAmJiBkaWZmc1sgcG9pbnRlciAtIDEgXVsg
MCBdID09PSBESUZGX0VRVUFMICkgeworCisJCQkJCS8vIE1lcmdlIHRoaXMgZXF1YWxpdHkgd2l0
aCB0aGUgcHJldmlvdXMgb25lLgorCQkJCQlkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBdICs9IGRp
ZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQkJZGlmZnMuc3BsaWNlKCBwb2ludGVyLCAxICk7CisJ
CQkJfSBlbHNlIHsKKwkJCQkJcG9pbnRlcisrOworCQkJCX0KKwkJCQljb3VudEluc2VydCA9IDA7
CisJCQkJY291bnREZWxldGUgPSAwOworCQkJCXRleHREZWxldGUgPSAiIjsKKwkJCQl0ZXh0SW5z
ZXJ0ID0gIiI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCBkaWZmc1sgZGlmZnMubGVu
Z3RoIC0gMSBdWyAxIF0gPT09ICIiICkgeworCQkJZGlmZnMucG9wKCk7IC8vIFJlbW92ZSB0aGUg
ZHVtbXkgZW50cnkgYXQgdGhlIGVuZC4KKwkJfQorCisJCS8vIFNlY29uZCBwYXNzOiBsb29rIGZv
ciBzaW5nbGUgZWRpdHMgc3Vycm91bmRlZCBvbiBib3RoIHNpZGVzIGJ5IGVxdWFsaXRpZXMKKwkJ
Ly8gd2hpY2ggY2FuIGJlIHNoaWZ0ZWQgc2lkZXdheXMgdG8gZWxpbWluYXRlIGFuIGVxdWFsaXR5
LgorCQkvLyBlLmc6IEE8aW5zPkJBPC9pbnM+QyAtPiA8aW5zPkFCPC9pbnM+QUMKKwkJY2hhbmdl
cyA9IGZhbHNlOworCQlwb2ludGVyID0gMTsKKworCQkvLyBJbnRlbnRpb25hbGx5IGlnbm9yZSB0
aGUgZmlyc3QgYW5kIGxhc3QgZWxlbWVudCAoZG9uJ3QgbmVlZCBjaGVja2luZykuCisJCXdoaWxl
ICggcG9pbnRlciA8IGRpZmZzLmxlbmd0aCAtIDEgKSB7CisJCQlpZiAoIGRpZmZzWyBwb2ludGVy
IC0gMSBdWyAwIF0gPT09IERJRkZfRVFVQUwgJiYKKwkJCQkJZGlmZnNbIHBvaW50ZXIgKyAxIF1b
IDAgXSA9PT0gRElGRl9FUVVBTCApIHsKKworCQkJCWRpZmZQb2ludGVyID0gZGlmZnNbIHBvaW50
ZXIgXVsgMSBdOworCQkJCXBvc2l0aW9uID0gZGlmZlBvaW50ZXIuc3Vic3RyaW5nKAorCQkJCQlk
aWZmUG9pbnRlci5sZW5ndGggLSBkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBdLmxlbmd0aAorCQkJ
CSk7CisKKwkJCQkvLyBUaGlzIGlzIGEgc2luZ2xlIGVkaXQgc3Vycm91bmRlZCBieSBlcXVhbGl0
aWVzLgorCQkJCWlmICggcG9zaXRpb24gPT09IGRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0gKSB7
CisKKwkJCQkJLy8gU2hpZnQgdGhlIGVkaXQgb3ZlciB0aGUgcHJldmlvdXMgZXF1YWxpdHkuCisJ
CQkJCWRpZmZzWyBwb2ludGVyIF1bIDEgXSA9IGRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0gKwor
CQkJCQkJZGlmZnNbIHBvaW50ZXIgXVsgMSBdLnN1YnN0cmluZyggMCwgZGlmZnNbIHBvaW50ZXIg
XVsgMSBdLmxlbmd0aCAtCisJCQkJCQkJZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXS5sZW5ndGgg
KTsKKwkJCQkJZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXSA9CisJCQkJCQlkaWZmc1sgcG9pbnRl
ciAtIDEgXVsgMSBdICsgZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXTsKKwkJCQkJZGlmZnMuc3Bs
aWNlKCBwb2ludGVyIC0gMSwgMSApOworCQkJCQljaGFuZ2VzID0gdHJ1ZTsKKwkJCQl9IGVsc2Ug
aWYgKCBkaWZmUG9pbnRlci5zdWJzdHJpbmcoIDAsIGRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF0u
bGVuZ3RoICkgPT09CisJCQkJCQlkaWZmc1sgcG9pbnRlciArIDEgXVsgMSBdICkgeworCisJCQkJ
CS8vIFNoaWZ0IHRoZSBlZGl0IG92ZXIgdGhlIG5leHQgZXF1YWxpdHkuCisJCQkJCWRpZmZzWyBw
b2ludGVyIC0gMSBdWyAxIF0gKz0gZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXTsKKwkJCQkJZGlm
ZnNbIHBvaW50ZXIgXVsgMSBdID0KKwkJCQkJCWRpZmZzWyBwb2ludGVyIF1bIDEgXS5zdWJzdHJp
bmcoIGRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF0ubGVuZ3RoICkgKworCQkJCQkJZGlmZnNbIHBv
aW50ZXIgKyAxIF1bIDEgXTsKKwkJCQkJZGlmZnMuc3BsaWNlKCBwb2ludGVyICsgMSwgMSApOwor
CQkJCQljaGFuZ2VzID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlwb2ludGVyKys7CisJCX0KKwkJ
Ly8gSWYgc2hpZnRzIHdlcmUgbWFkZSwgdGhlIGRpZmYgbmVlZHMgcmVvcmRlcmluZyBhbmQgYW5v
dGhlciBzaGlmdCBzd2VlcC4KKwkJaWYgKCBjaGFuZ2VzICkgeworCQkJdGhpcy5kaWZmQ2xlYW51
cE1lcmdlKCBkaWZmcyApOworCQl9CisJfTsKKworCXJldHVybiBmdW5jdGlvbiggbywgbiApIHsK
KwkJdmFyIGRpZmYsIG91dHB1dCwgdGV4dDsKKwkJZGlmZiA9IG5ldyBEaWZmTWF0Y2hQYXRjaCgp
OworCQlvdXRwdXQgPSBkaWZmLkRpZmZNYWluKCBvLCBuICk7CisJCWRpZmYuZGlmZkNsZWFudXBF
ZmZpY2llbmN5KCBvdXRwdXQgKTsKKwkJdGV4dCA9IGRpZmYuZGlmZlByZXR0eUh0bWwoIG91dHB1
dCApOworCisJCXJldHVybiB0ZXh0OworCX07Cit9KCkgKTsKKworLy8gR2V0IGEgcmVmZXJlbmNl
IHRvIHRoZSBnbG9iYWwgb2JqZWN0LCBsaWtlIHdpbmRvdyBpbiBicm93c2VycworfSggKGZ1bmN0
aW9uKCkgeworCXJldHVybiB0aGlzOworfSkoKSApKTsKKworKGZ1bmN0aW9uKCkgeworCisvLyBE
b24ndCBsb2FkIHRoZSBIVE1MIFJlcG9ydGVyIG9uIG5vbi1Ccm93c2VyIGVudmlyb25tZW50cwor
aWYgKCB0eXBlb2Ygd2luZG93ID09PSAidW5kZWZpbmVkIiB8fCAhd2luZG93LmRvY3VtZW50ICkg
eworCXJldHVybjsKK30KKworLy8gRGVwcmVjYXRlZCBRVW5pdC5pbml0IC0gUmVmICM1MzAKKy8v
IFJlLWluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworUVVuaXQuaW5pdCA9IGZ1
bmN0aW9uKCkgeworCXZhciB0ZXN0cywgYmFubmVyLCByZXN1bHQsIHF1bml0LAorCQljb25maWcg
PSBRVW5pdC5jb25maWc7CisKKwljb25maWcuc3RhdHMgPSB7IGFsbDogMCwgYmFkOiAwIH07CisJ
Y29uZmlnLm1vZHVsZVN0YXRzID0geyBhbGw6IDAsIGJhZDogMCB9OworCWNvbmZpZy5zdGFydGVk
ID0gMDsKKwljb25maWcudXBkYXRlUmF0ZSA9IDEwMDA7CisJY29uZmlnLmJsb2NraW5nID0gZmFs
c2U7CisJY29uZmlnLmF1dG9zdGFydCA9IHRydWU7CisJY29uZmlnLmF1dG9ydW4gPSBmYWxzZTsK
Kwljb25maWcuZmlsdGVyID0gIiI7CisJY29uZmlnLnF1ZXVlID0gW107CisKKwkvLyBSZXR1cm4g
b24gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzCisJLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gbm90
IGJyZWFrIG9uIG5vZGUgdGVzdHMKKwlpZiAoIHR5cGVvZiB3aW5kb3cgPT09ICJ1bmRlZmluZWQi
ICkgeworCQlyZXR1cm47CisJfQorCisJcXVuaXQgPSBpZCggInF1bml0IiApOworCWlmICggcXVu
aXQgKSB7CisJCXF1bml0LmlubmVySFRNTCA9CisJCQkiPGgxIGlkPSdxdW5pdC1oZWFkZXInPiIg
KyBlc2NhcGVUZXh0KCBkb2N1bWVudC50aXRsZSApICsgIjwvaDE+IiArCisJCQkiPGgyIGlkPSdx
dW5pdC1iYW5uZXInPjwvaDI+IiArCisJCQkiPGRpdiBpZD0ncXVuaXQtdGVzdHJ1bm5lci10b29s
YmFyJz48L2Rpdj4iICsKKwkJCSI8aDIgaWQ9J3F1bml0LXVzZXJBZ2VudCc+PC9oMj4iICsKKwkJ
CSI8b2wgaWQ9J3F1bml0LXRlc3RzJz48L29sPiI7CisJfQorCisJdGVzdHMgPSBpZCggInF1bml0
LXRlc3RzIiApOworCWJhbm5lciA9IGlkKCAicXVuaXQtYmFubmVyIiApOworCXJlc3VsdCA9IGlk
KCAicXVuaXQtdGVzdHJlc3VsdCIgKTsKKworCWlmICggdGVzdHMgKSB7CisJCXRlc3RzLmlubmVy
SFRNTCA9ICIiOworCX0KKworCWlmICggYmFubmVyICkgeworCQliYW5uZXIuY2xhc3NOYW1lID0g
IiI7CisJfQorCisJaWYgKCByZXN1bHQgKSB7CisJCXJlc3VsdC5wYXJlbnROb2RlLnJlbW92ZUNo
aWxkKCByZXN1bHQgKTsKKwl9CisKKwlpZiAoIHRlc3RzICkgeworCQlyZXN1bHQgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCAicCIgKTsKKwkJcmVzdWx0LmlkID0gInF1bml0LXRlc3RyZXN1bHQi
OworCQlyZXN1bHQuY2xhc3NOYW1lID0gInJlc3VsdCI7CisJCXRlc3RzLnBhcmVudE5vZGUuaW5z
ZXJ0QmVmb3JlKCByZXN1bHQsIHRlc3RzICk7CisJCXJlc3VsdC5pbm5lckhUTUwgPSAiUnVubmlu
Zy4uLjxiciAvPiYjMTYwOyI7CisJfQorfTsKKwordmFyIGNvbmZpZyA9IFFVbml0LmNvbmZpZywK
Kwljb2xsYXBzZU5leHQgPSBmYWxzZSwKKwloYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093
blByb3BlcnR5LAorCWRlZmluZWQgPSB7CisJCWRvY3VtZW50OiB3aW5kb3cuZG9jdW1lbnQgIT09
IHVuZGVmaW5lZCwKKwkJc2Vzc2lvblN0b3JhZ2U6IChmdW5jdGlvbigpIHsKKwkJCXZhciB4ID0g
InF1bml0LXRlc3Qtc3RyaW5nIjsKKwkJCXRyeSB7CisJCQkJc2Vzc2lvblN0b3JhZ2Uuc2V0SXRl
bSggeCwgeCApOworCQkJCXNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oIHggKTsKKwkJCQlyZXR1
cm4gdHJ1ZTsKKwkJCX0gY2F0Y2ggKCBlICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJ
fSgpKQorCX0sCisJbW9kdWxlc0xpc3QgPSBbXTsKKworLyoqCisqIEVzY2FwZSB0ZXh0IGZvciBh
dHRyaWJ1dGUgb3IgdGV4dCBjb250ZW50LgorKi8KK2Z1bmN0aW9uIGVzY2FwZVRleHQoIHMgKSB7
CisJaWYgKCAhcyApIHsKKwkJcmV0dXJuICIiOworCX0KKwlzID0gcyArICIiOworCisJLy8gQm90
aCBzaW5nbGUgcXVvdGVzIGFuZCBkb3VibGUgcXVvdGVzIChmb3IgYXR0cmlidXRlcykKKwlyZXR1
cm4gcy5yZXBsYWNlKCAvWyciPD4mXS9nLCBmdW5jdGlvbiggcyApIHsKKwkJc3dpdGNoICggcyAp
IHsKKwkJY2FzZSAiJyI6CisJCQlyZXR1cm4gIiYjMDM5OyI7CisJCWNhc2UgIlwiIjoKKwkJCXJl
dHVybiAiJnF1b3Q7IjsKKwkJY2FzZSAiPCI6CisJCQlyZXR1cm4gIiZsdDsiOworCQljYXNlICI+
IjoKKwkJCXJldHVybiAiJmd0OyI7CisJCWNhc2UgIiYiOgorCQkJcmV0dXJuICImYW1wOyI7CisJ
CX0KKwl9KTsKK30KKworLyoqCisgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCisgKiBAcGFy
YW0ge3N0cmluZ30gdHlwZQorICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KKyAqLworZnVuY3Rpb24g
YWRkRXZlbnQoIGVsZW0sIHR5cGUsIGZuICkgeworCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVy
ICkgeworCisJCS8vIFN0YW5kYXJkcy1iYXNlZCBicm93c2VycworCQllbGVtLmFkZEV2ZW50TGlz
dGVuZXIoIHR5cGUsIGZuLCBmYWxzZSApOworCX0gZWxzZSBpZiAoIGVsZW0uYXR0YWNoRXZlbnQg
KSB7CisKKwkJLy8gc3VwcG9ydDogSUUgPDkKKwkJZWxlbS5hdHRhY2hFdmVudCggIm9uIiArIHR5
cGUsIGZ1bmN0aW9uKCkgeworCQkJdmFyIGV2ZW50ID0gd2luZG93LmV2ZW50OworCQkJaWYgKCAh
ZXZlbnQudGFyZ2V0ICkgeworCQkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnNyY0VsZW1lbnQgfHwg
ZG9jdW1lbnQ7CisJCQl9CisKKwkJCWZuLmNhbGwoIGVsZW0sIGV2ZW50ICk7CisJCX0pOworCX0K
K30KKworLyoqCisgKiBAcGFyYW0ge0FycmF5fE5vZGVMaXN0fSBlbGVtcworICogQHBhcmFtIHtz
dHJpbmd9IHR5cGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCisgKi8KK2Z1bmN0aW9uIGFkZEV2
ZW50cyggZWxlbXMsIHR5cGUsIGZuICkgeworCXZhciBpID0gZWxlbXMubGVuZ3RoOworCXdoaWxl
ICggaS0tICkgeworCQlhZGRFdmVudCggZWxlbXNbIGkgXSwgdHlwZSwgZm4gKTsKKwl9Cit9CisK
K2Z1bmN0aW9uIGhhc0NsYXNzKCBlbGVtLCBuYW1lICkgeworCXJldHVybiAoICIgIiArIGVsZW0u
Y2xhc3NOYW1lICsgIiAiICkuaW5kZXhPZiggIiAiICsgbmFtZSArICIgIiApID49IDA7Cit9CisK
K2Z1bmN0aW9uIGFkZENsYXNzKCBlbGVtLCBuYW1lICkgeworCWlmICggIWhhc0NsYXNzKCBlbGVt
LCBuYW1lICkgKSB7CisJCWVsZW0uY2xhc3NOYW1lICs9ICggZWxlbS5jbGFzc05hbWUgPyAiICIg
OiAiIiApICsgbmFtZTsKKwl9Cit9CisKK2Z1bmN0aW9uIHRvZ2dsZUNsYXNzKCBlbGVtLCBuYW1l
ICkgeworCWlmICggaGFzQ2xhc3MoIGVsZW0sIG5hbWUgKSApIHsKKwkJcmVtb3ZlQ2xhc3MoIGVs
ZW0sIG5hbWUgKTsKKwl9IGVsc2UgeworCQlhZGRDbGFzcyggZWxlbSwgbmFtZSApOworCX0KK30K
KworZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoIGVsZW0sIG5hbWUgKSB7CisJdmFyIHNldCA9ICIgIiAr
IGVsZW0uY2xhc3NOYW1lICsgIiAiOworCisJLy8gQ2xhc3MgbmFtZSBtYXkgYXBwZWFyIG11bHRp
cGxlIHRpbWVzCisJd2hpbGUgKCBzZXQuaW5kZXhPZiggIiAiICsgbmFtZSArICIgIiApID49IDAg
KSB7CisJCXNldCA9IHNldC5yZXBsYWNlKCAiICIgKyBuYW1lICsgIiAiLCAiICIgKTsKKwl9CisK
KwkvLyB0cmltIGZvciBwcmV0dGluZXNzCisJZWxlbS5jbGFzc05hbWUgPSB0eXBlb2Ygc2V0LnRy
aW0gPT09ICJmdW5jdGlvbiIgPyBzZXQudHJpbSgpIDogc2V0LnJlcGxhY2UoIC9eXHMrfFxzKyQv
ZywgIiIgKTsKK30KKworZnVuY3Rpb24gaWQoIG5hbWUgKSB7CisJcmV0dXJuIGRlZmluZWQuZG9j
dW1lbnQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoIG5hbWUgKTsKK30KKworZnVuY3Rpb24gZ2V0VXJsQ29uZmlnSHRtbCgpIHsKKwl2YXIgaSwg
aiwgdmFsLAorCQllc2NhcGVkLCBlc2NhcGVkVG9vbHRpcCwKKwkJc2VsZWN0aW9uID0gZmFsc2Us
CisJCWxlbiA9IGNvbmZpZy51cmxDb25maWcubGVuZ3RoLAorCQl1cmxDb25maWdIdG1sID0gIiI7
CisKKwlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworCQl2YWwgPSBjb25maWcudXJsQ29u
ZmlnWyBpIF07CisJCWlmICggdHlwZW9mIHZhbCA9PT0gInN0cmluZyIgKSB7CisJCQl2YWwgPSB7
CisJCQkJaWQ6IHZhbCwKKwkJCQlsYWJlbDogdmFsCisJCQl9OworCQl9CisKKwkJZXNjYXBlZCA9
IGVzY2FwZVRleHQoIHZhbC5pZCApOworCQllc2NhcGVkVG9vbHRpcCA9IGVzY2FwZVRleHQoIHZh
bC50b29sdGlwICk7CisKKwkJaWYgKCBjb25maWdbIHZhbC5pZCBdID09PSB1bmRlZmluZWQgKSB7
CisJCQljb25maWdbIHZhbC5pZCBdID0gUVVuaXQudXJsUGFyYW1zWyB2YWwuaWQgXTsKKwkJfQor
CisJCWlmICggIXZhbC52YWx1ZSB8fCB0eXBlb2YgdmFsLnZhbHVlID09PSAic3RyaW5nIiApIHsK
KwkJCXVybENvbmZpZ0h0bWwgKz0gIjxpbnB1dCBpZD0ncXVuaXQtdXJsY29uZmlnLSIgKyBlc2Nh
cGVkICsKKwkJCQkiJyBuYW1lPSciICsgZXNjYXBlZCArICInIHR5cGU9J2NoZWNrYm94JyIgKwor
CQkJCSggdmFsLnZhbHVlID8gIiB2YWx1ZT0nIiArIGVzY2FwZVRleHQoIHZhbC52YWx1ZSApICsg
IiciIDogIiIgKSArCisJCQkJKCBjb25maWdbIHZhbC5pZCBdID8gIiBjaGVja2VkPSdjaGVja2Vk
JyIgOiAiIiApICsKKwkJCQkiIHRpdGxlPSciICsgZXNjYXBlZFRvb2x0aXAgKyAiJyAvPjxsYWJl
bCBmb3I9J3F1bml0LXVybGNvbmZpZy0iICsgZXNjYXBlZCArCisJCQkJIicgdGl0bGU9JyIgKyBl
c2NhcGVkVG9vbHRpcCArICInPiIgKyB2YWwubGFiZWwgKyAiPC9sYWJlbD4iOworCQl9IGVsc2Ug
eworCQkJdXJsQ29uZmlnSHRtbCArPSAiPGxhYmVsIGZvcj0ncXVuaXQtdXJsY29uZmlnLSIgKyBl
c2NhcGVkICsKKwkJCQkiJyB0aXRsZT0nIiArIGVzY2FwZWRUb29sdGlwICsgIic+IiArIHZhbC5s
YWJlbCArCisJCQkJIjogPC9sYWJlbD48c2VsZWN0IGlkPSdxdW5pdC11cmxjb25maWctIiArIGVz
Y2FwZWQgKworCQkJCSInIG5hbWU9JyIgKyBlc2NhcGVkICsgIicgdGl0bGU9JyIgKyBlc2NhcGVk
VG9vbHRpcCArICInPjxvcHRpb24+PC9vcHRpb24+IjsKKworCQkJaWYgKCBRVW5pdC5pcyggImFy
cmF5IiwgdmFsLnZhbHVlICkgKSB7CisJCQkJZm9yICggaiA9IDA7IGogPCB2YWwudmFsdWUubGVu
Z3RoOyBqKysgKSB7CisJCQkJCWVzY2FwZWQgPSBlc2NhcGVUZXh0KCB2YWwudmFsdWVbIGogXSAp
OworCQkJCQl1cmxDb25maWdIdG1sICs9ICI8b3B0aW9uIHZhbHVlPSciICsgZXNjYXBlZCArICIn
IiArCisJCQkJCQkoIGNvbmZpZ1sgdmFsLmlkIF0gPT09IHZhbC52YWx1ZVsgaiBdID8KKwkJCQkJ
CQkoIHNlbGVjdGlvbiA9IHRydWUgKSAmJiAiIHNlbGVjdGVkPSdzZWxlY3RlZCciIDogIiIgKSAr
CisJCQkJCQkiPiIgKyBlc2NhcGVkICsgIjwvb3B0aW9uPiI7CisJCQkJfQorCQkJfSBlbHNlIHsK
KwkJCQlmb3IgKCBqIGluIHZhbC52YWx1ZSApIHsKKwkJCQkJaWYgKCBoYXNPd24uY2FsbCggdmFs
LnZhbHVlLCBqICkgKSB7CisJCQkJCQl1cmxDb25maWdIdG1sICs9ICI8b3B0aW9uIHZhbHVlPSci
ICsgZXNjYXBlVGV4dCggaiApICsgIiciICsKKwkJCQkJCQkoIGNvbmZpZ1sgdmFsLmlkIF0gPT09
IGogPworCQkJCQkJCQkoIHNlbGVjdGlvbiA9IHRydWUgKSAmJiAiIHNlbGVjdGVkPSdzZWxlY3Rl
ZCciIDogIiIgKSArCisJCQkJCQkJIj4iICsgZXNjYXBlVGV4dCggdmFsLnZhbHVlWyBqIF0gKSAr
ICI8L29wdGlvbj4iOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKCBjb25maWdbIHZhbC5p
ZCBdICYmICFzZWxlY3Rpb24gKSB7CisJCQkJZXNjYXBlZCA9IGVzY2FwZVRleHQoIGNvbmZpZ1sg
dmFsLmlkIF0gKTsKKwkJCQl1cmxDb25maWdIdG1sICs9ICI8b3B0aW9uIHZhbHVlPSciICsgZXNj
YXBlZCArCisJCQkJCSInIHNlbGVjdGVkPSdzZWxlY3RlZCcgZGlzYWJsZWQ9J2Rpc2FibGVkJz4i
ICsgZXNjYXBlZCArICI8L29wdGlvbj4iOworCQkJfQorCQkJdXJsQ29uZmlnSHRtbCArPSAiPC9z
ZWxlY3Q+IjsKKwkJfQorCX0KKworCXJldHVybiB1cmxDb25maWdIdG1sOworfQorCisvLyBIYW5k
bGUgImNsaWNrIiBldmVudHMgb24gdG9vbGJhciBjaGVja2JveGVzIGFuZCAiY2hhbmdlIiBmb3Ig
c2VsZWN0IG1lbnVzLgorLy8gVXBkYXRlcyB0aGUgVVJMIHdpdGggdGhlIG5ldyBzdGF0ZSBvZiBg
Y29uZmlnLnVybENvbmZpZ2AgdmFsdWVzLgorZnVuY3Rpb24gdG9vbGJhckNoYW5nZWQoKSB7CisJ
dmFyIHVwZGF0ZWRVcmwsIHZhbHVlLAorCQlmaWVsZCA9IHRoaXMsCisJCXBhcmFtcyA9IHt9Owor
CisJLy8gRGV0ZWN0IGlmIGZpZWxkIGlzIGEgc2VsZWN0IG1lbnUgb3IgYSBjaGVja2JveAorCWlm
ICggInNlbGVjdGVkSW5kZXgiIGluIGZpZWxkICkgeworCQl2YWx1ZSA9IGZpZWxkLm9wdGlvbnNb
IGZpZWxkLnNlbGVjdGVkSW5kZXggXS52YWx1ZSB8fCB1bmRlZmluZWQ7CisJfSBlbHNlIHsKKwkJ
dmFsdWUgPSBmaWVsZC5jaGVja2VkID8gKCBmaWVsZC5kZWZhdWx0VmFsdWUgfHwgdHJ1ZSApIDog
dW5kZWZpbmVkOworCX0KKworCXBhcmFtc1sgZmllbGQubmFtZSBdID0gdmFsdWU7CisJdXBkYXRl
ZFVybCA9IHNldFVybCggcGFyYW1zICk7CisKKwlpZiAoICJoaWRlcGFzc2VkIiA9PT0gZmllbGQu
bmFtZSAmJiAicmVwbGFjZVN0YXRlIiBpbiB3aW5kb3cuaGlzdG9yeSApIHsKKwkJY29uZmlnWyBm
aWVsZC5uYW1lIF0gPSB2YWx1ZSB8fCBmYWxzZTsKKwkJaWYgKCB2YWx1ZSApIHsKKwkJCWFkZENs
YXNzKCBpZCggInF1bml0LXRlc3RzIiApLCAiaGlkZXBhc3MiICk7CisJCX0gZWxzZSB7CisJCQly
ZW1vdmVDbGFzcyggaWQoICJxdW5pdC10ZXN0cyIgKSwgImhpZGVwYXNzIiApOworCQl9CisKKwkJ
Ly8gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byByZWZyZXNoIHRoZSB3aG9sZSBwYWdlCisJCXdpbmRv
dy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSggbnVsbCwgIiIsIHVwZGF0ZWRVcmwgKTsKKwl9IGVsc2Ug
eworCQl3aW5kb3cubG9jYXRpb24gPSB1cGRhdGVkVXJsOworCX0KK30KKworZnVuY3Rpb24gc2V0
VXJsKCBwYXJhbXMgKSB7CisJdmFyIGtleSwKKwkJcXVlcnlzdHJpbmcgPSAiPyI7CisKKwlwYXJh
bXMgPSBRVW5pdC5leHRlbmQoIFFVbml0LmV4dGVuZCgge30sIFFVbml0LnVybFBhcmFtcyApLCBw
YXJhbXMgKTsKKworCWZvciAoIGtleSBpbiBwYXJhbXMgKSB7CisJCWlmICggaGFzT3duLmNhbGwo
IHBhcmFtcywga2V5ICkgKSB7CisJCQlpZiAoIHBhcmFtc1sga2V5IF0gPT09IHVuZGVmaW5lZCAp
IHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXF1ZXJ5c3RyaW5nICs9IGVuY29kZVVSSUNvbXBv
bmVudCgga2V5ICk7CisJCQlpZiAoIHBhcmFtc1sga2V5IF0gIT09IHRydWUgKSB7CisJCQkJcXVl
cnlzdHJpbmcgKz0gIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KCBwYXJhbXNbIGtleSBdICk7CisJ
CQl9CisJCQlxdWVyeXN0cmluZyArPSAiJiI7CisJCX0KKwl9CisJcmV0dXJuIGxvY2F0aW9uLnBy
b3RvY29sICsgIi8vIiArIGxvY2F0aW9uLmhvc3QgKworCQlsb2NhdGlvbi5wYXRobmFtZSArIHF1
ZXJ5c3RyaW5nLnNsaWNlKCAwLCAtMSApOworfQorCitmdW5jdGlvbiBhcHBseVVybFBhcmFtcygp
IHsKKwl2YXIgc2VsZWN0ZWRNb2R1bGUsCisJCW1vZHVsZXNMaXN0ID0gaWQoICJxdW5pdC1tb2R1
bGVmaWx0ZXIiICksCisJCWZpbHRlciA9IGlkKCAicXVuaXQtZmlsdGVyLWlucHV0IiApLnZhbHVl
OworCisJc2VsZWN0ZWRNb2R1bGUgPSBtb2R1bGVzTGlzdCA/CisJCWRlY29kZVVSSUNvbXBvbmVu
dCggbW9kdWxlc0xpc3Qub3B0aW9uc1sgbW9kdWxlc0xpc3Quc2VsZWN0ZWRJbmRleCBdLnZhbHVl
ICkgOgorCQl1bmRlZmluZWQ7CisKKwl3aW5kb3cubG9jYXRpb24gPSBzZXRVcmwoeworCQltb2R1
bGU6ICggc2VsZWN0ZWRNb2R1bGUgPT09ICIiICkgPyB1bmRlZmluZWQgOiBzZWxlY3RlZE1vZHVs
ZSwKKwkJZmlsdGVyOiAoIGZpbHRlciA9PT0gIiIgKSA/IHVuZGVmaW5lZCA6IGZpbHRlciwKKwor
CQkvLyBSZW1vdmUgdGVzdElkIGZpbHRlcgorCQl0ZXN0SWQ6IHVuZGVmaW5lZAorCX0pOworfQor
CitmdW5jdGlvbiB0b29sYmFyVXJsQ29uZmlnQ29udGFpbmVyKCkgeworCXZhciB1cmxDb25maWdD
b250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic3BhbiIgKTsKKworCXVybENvbmZp
Z0NvbnRhaW5lci5pbm5lckhUTUwgPSBnZXRVcmxDb25maWdIdG1sKCk7CisJYWRkQ2xhc3MoIHVy
bENvbmZpZ0NvbnRhaW5lciwgInF1bml0LXVybC1jb25maWciICk7CisKKwkvLyBGb3Igb2xkSUUg
c3VwcG9ydDoKKwkvLyAqIEFkZCBoYW5kbGVycyB0byB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyBp
bnN0ZWFkIG9mIHRoZSBjb250YWluZXIKKwkvLyAqIFVzZSAiY2xpY2siIGluc3RlYWQgb2YgImNo
YW5nZSIgZm9yIGNoZWNrYm94ZXMKKwlhZGRFdmVudHMoIHVybENvbmZpZ0NvbnRhaW5lci5nZXRF
bGVtZW50c0J5VGFnTmFtZSggImlucHV0IiApLCAiY2xpY2siLCB0b29sYmFyQ2hhbmdlZCApOwor
CWFkZEV2ZW50cyggdXJsQ29uZmlnQ29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAic2Vs
ZWN0IiApLCAiY2hhbmdlIiwgdG9vbGJhckNoYW5nZWQgKTsKKworCXJldHVybiB1cmxDb25maWdD
b250YWluZXI7Cit9CisKK2Z1bmN0aW9uIHRvb2xiYXJMb29zZUZpbHRlcigpIHsKKwl2YXIgZmls
dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImZvcm0iICksCisJCWxhYmVsID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCggImxhYmVsIiApLAorCQlpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoICJpbnB1dCIgKSwKKwkJYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImJ1
dHRvbiIgKTsKKworCWFkZENsYXNzKCBmaWx0ZXIsICJxdW5pdC1maWx0ZXIiICk7CisKKwlsYWJl
bC5pbm5lckhUTUwgPSAiRmlsdGVyOiAiOworCisJaW5wdXQudHlwZSA9ICJ0ZXh0IjsKKwlpbnB1
dC52YWx1ZSA9IGNvbmZpZy5maWx0ZXIgfHwgIiI7CisJaW5wdXQubmFtZSA9ICJmaWx0ZXIiOwor
CWlucHV0LmlkID0gInF1bml0LWZpbHRlci1pbnB1dCI7CisKKwlidXR0b24uaW5uZXJIVE1MID0g
IkdvIjsKKworCWxhYmVsLmFwcGVuZENoaWxkKCBpbnB1dCApOworCisJZmlsdGVyLmFwcGVuZENo
aWxkKCBsYWJlbCApOworCWZpbHRlci5hcHBlbmRDaGlsZCggYnV0dG9uICk7CisJYWRkRXZlbnQo
IGZpbHRlciwgInN1Ym1pdCIsIGZ1bmN0aW9uKCBldiApIHsKKwkJYXBwbHlVcmxQYXJhbXMoKTsK
KworCQlpZiAoIGV2ICYmIGV2LnByZXZlbnREZWZhdWx0ICkgeworCQkJZXYucHJldmVudERlZmF1
bHQoKTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9KTsKKworCXJldHVybiBmaWx0ZXI7Cit9
CisKK2Z1bmN0aW9uIHRvb2xiYXJNb2R1bGVGaWx0ZXJIdG1sKCkgeworCXZhciBpLAorCQltb2R1
bGVGaWx0ZXJIdG1sID0gIiI7CisKKwlpZiAoICFtb2R1bGVzTGlzdC5sZW5ndGggKSB7CisJCXJl
dHVybiBmYWxzZTsKKwl9CisKKwltb2R1bGVzTGlzdC5zb3J0KGZ1bmN0aW9uKCBhLCBiICkgewor
CQlyZXR1cm4gYS5sb2NhbGVDb21wYXJlKCBiICk7CisJfSk7CisKKwltb2R1bGVGaWx0ZXJIdG1s
ICs9ICI8bGFiZWwgZm9yPSdxdW5pdC1tb2R1bGVmaWx0ZXInPk1vZHVsZTogPC9sYWJlbD4iICsK
KwkJIjxzZWxlY3QgaWQ9J3F1bml0LW1vZHVsZWZpbHRlcicgbmFtZT0nbW9kdWxlZmlsdGVyJz48
b3B0aW9uIHZhbHVlPScnICIgKworCQkoIFFVbml0LnVybFBhcmFtcy5tb2R1bGUgPT09IHVuZGVm
aW5lZCA/ICJzZWxlY3RlZD0nc2VsZWN0ZWQnIiA6ICIiICkgKworCQkiPjwgQWxsIE1vZHVsZXMg
Pjwvb3B0aW9uPiI7CisKKwlmb3IgKCBpID0gMDsgaSA8IG1vZHVsZXNMaXN0Lmxlbmd0aDsgaSsr
ICkgeworCQltb2R1bGVGaWx0ZXJIdG1sICs9ICI8b3B0aW9uIHZhbHVlPSciICsKKwkJCWVzY2Fw
ZVRleHQoIGVuY29kZVVSSUNvbXBvbmVudCggbW9kdWxlc0xpc3RbIGkgXSApICkgKyAiJyAiICsK
KwkJCSggUVVuaXQudXJsUGFyYW1zLm1vZHVsZSA9PT0gbW9kdWxlc0xpc3RbIGkgXSA/ICJzZWxl
Y3RlZD0nc2VsZWN0ZWQnIiA6ICIiICkgKworCQkJIj4iICsgZXNjYXBlVGV4dCggbW9kdWxlc0xp
c3RbIGkgXSApICsgIjwvb3B0aW9uPiI7CisJfQorCW1vZHVsZUZpbHRlckh0bWwgKz0gIjwvc2Vs
ZWN0PiI7CisKKwlyZXR1cm4gbW9kdWxlRmlsdGVySHRtbDsKK30KKworZnVuY3Rpb24gdG9vbGJh
ck1vZHVsZUZpbHRlcigpIHsKKwl2YXIgdG9vbGJhciA9IGlkKCAicXVuaXQtdGVzdHJ1bm5lci10
b29sYmFyIiApLAorCQltb2R1bGVGaWx0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic3Bh
biIgKSwKKwkJbW9kdWxlRmlsdGVySHRtbCA9IHRvb2xiYXJNb2R1bGVGaWx0ZXJIdG1sKCk7CisK
KwlpZiAoICF0b29sYmFyIHx8ICFtb2R1bGVGaWx0ZXJIdG1sICkgeworCQlyZXR1cm4gZmFsc2U7
CisJfQorCisJbW9kdWxlRmlsdGVyLnNldEF0dHJpYnV0ZSggImlkIiwgInF1bml0LW1vZHVsZWZp
bHRlci1jb250YWluZXIiICk7CisJbW9kdWxlRmlsdGVyLmlubmVySFRNTCA9IG1vZHVsZUZpbHRl
ckh0bWw7CisKKwlhZGRFdmVudCggbW9kdWxlRmlsdGVyLmxhc3RDaGlsZCwgImNoYW5nZSIsIGFw
cGx5VXJsUGFyYW1zICk7CisKKwl0b29sYmFyLmFwcGVuZENoaWxkKCBtb2R1bGVGaWx0ZXIgKTsK
K30KKworZnVuY3Rpb24gYXBwZW5kVG9vbGJhcigpIHsKKwl2YXIgdG9vbGJhciA9IGlkKCAicXVu
aXQtdGVzdHJ1bm5lci10b29sYmFyIiApOworCisJaWYgKCB0b29sYmFyICkgeworCQl0b29sYmFy
LmFwcGVuZENoaWxkKCB0b29sYmFyVXJsQ29uZmlnQ29udGFpbmVyKCkgKTsKKwkJdG9vbGJhci5h
cHBlbmRDaGlsZCggdG9vbGJhckxvb3NlRmlsdGVyKCkgKTsKKwl9Cit9CisKK2Z1bmN0aW9uIGFw
cGVuZEhlYWRlcigpIHsKKwl2YXIgaGVhZGVyID0gaWQoICJxdW5pdC1oZWFkZXIiICk7CisKKwlp
ZiAoIGhlYWRlciApIHsKKwkJaGVhZGVyLmlubmVySFRNTCA9ICI8YSBocmVmPSciICsKKwkJCXNl
dFVybCh7IGZpbHRlcjogdW5kZWZpbmVkLCBtb2R1bGU6IHVuZGVmaW5lZCwgdGVzdElkOiB1bmRl
ZmluZWQgfSkgKworCQkJIic+IiArIGhlYWRlci5pbm5lckhUTUwgKyAiPC9hPiAiOworCX0KK30K
KworZnVuY3Rpb24gYXBwZW5kQmFubmVyKCkgeworCXZhciBiYW5uZXIgPSBpZCggInF1bml0LWJh
bm5lciIgKTsKKworCWlmICggYmFubmVyICkgeworCQliYW5uZXIuY2xhc3NOYW1lID0gIiI7CisJ
fQorfQorCitmdW5jdGlvbiBhcHBlbmRUZXN0UmVzdWx0cygpIHsKKwl2YXIgdGVzdHMgPSBpZCgg
InF1bml0LXRlc3RzIiApLAorCQlyZXN1bHQgPSBpZCggInF1bml0LXRlc3RyZXN1bHQiICk7CisK
KwlpZiAoIHJlc3VsdCApIHsKKwkJcmVzdWx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHJlc3Vs
dCApOworCX0KKworCWlmICggdGVzdHMgKSB7CisJCXRlc3RzLmlubmVySFRNTCA9ICIiOworCQly
ZXN1bHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAicCIgKTsKKwkJcmVzdWx0LmlkID0gInF1
bml0LXRlc3RyZXN1bHQiOworCQlyZXN1bHQuY2xhc3NOYW1lID0gInJlc3VsdCI7CisJCXRlc3Rz
LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCByZXN1bHQsIHRlc3RzICk7CisJCXJlc3VsdC5pbm5l
ckhUTUwgPSAiUnVubmluZy4uLjxiciAvPiYjMTYwOyI7CisJfQorfQorCitmdW5jdGlvbiBzdG9y
ZUZpeHR1cmUoKSB7CisJdmFyIGZpeHR1cmUgPSBpZCggInF1bml0LWZpeHR1cmUiICk7CisJaWYg
KCBmaXh0dXJlICkgeworCQljb25maWcuZml4dHVyZSA9IGZpeHR1cmUuaW5uZXJIVE1MOworCX0K
K30KKworZnVuY3Rpb24gYXBwZW5kRmlsdGVyZWRUZXN0KCkgeworCXZhciB0ZXN0SWQgPSBRVW5p
dC5jb25maWcudGVzdElkOworCWlmICggIXRlc3RJZCB8fCB0ZXN0SWQubGVuZ3RoIDw9IDAgKSB7
CisJCXJldHVybiAiIjsKKwl9CisJcmV0dXJuICI8ZGl2IGlkPSdxdW5pdC1maWx0ZXJlZFRlc3Qn
PlJlcnVubmluZyBzZWxlY3RlZCB0ZXN0czogIiArIHRlc3RJZC5qb2luKCIsICIpICsKKwkJIiA8
YSBpZD0ncXVuaXQtY2xlYXJGaWx0ZXInIGhyZWY9JyIgKworCQlzZXRVcmwoeyBmaWx0ZXI6IHVu
ZGVmaW5lZCwgbW9kdWxlOiB1bmRlZmluZWQsIHRlc3RJZDogdW5kZWZpbmVkIH0pICsKKwkJIic+
IiArICJSdW4gYWxsIHRlc3RzIiArICI8L2E+PC9kaXY+IjsKK30KKworZnVuY3Rpb24gYXBwZW5k
VXNlckFnZW50KCkgeworCXZhciB1c2VyQWdlbnQgPSBpZCggInF1bml0LXVzZXJBZ2VudCIgKTsK
KworCWlmICggdXNlckFnZW50ICkgeworCQl1c2VyQWdlbnQuaW5uZXJIVE1MID0gIiI7CisJCXVz
ZXJBZ2VudC5hcHBlbmRDaGlsZCgKKwkJCWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKAorCQkJCSJR
VW5pdCAiICsgUVVuaXQudmVyc2lvbiArICI7ICIgKyBuYXZpZ2F0b3IudXNlckFnZW50CisJCQkp
CisJCSk7CisJfQorfQorCitmdW5jdGlvbiBhcHBlbmRUZXN0c0xpc3QoIG1vZHVsZXMgKSB7CisJ
dmFyIGksIGwsIHgsIHosIHRlc3QsIG1vZHVsZU9iajsKKworCWZvciAoIGkgPSAwLCBsID0gbW9k
dWxlcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCW1vZHVsZU9iaiA9IG1vZHVsZXNbIGkgXTsK
KworCQlpZiAoIG1vZHVsZU9iai5uYW1lICkgeworCQkJbW9kdWxlc0xpc3QucHVzaCggbW9kdWxl
T2JqLm5hbWUgKTsKKwkJfQorCisJCWZvciAoIHggPSAwLCB6ID0gbW9kdWxlT2JqLnRlc3RzLmxl
bmd0aDsgeCA8IHo7IHgrKyApIHsKKwkJCXRlc3QgPSBtb2R1bGVPYmoudGVzdHNbIHggXTsKKwor
CQkJYXBwZW5kVGVzdCggdGVzdC5uYW1lLCB0ZXN0LnRlc3RJZCwgbW9kdWxlT2JqLm5hbWUgKTsK
KwkJfQorCX0KK30KKworZnVuY3Rpb24gYXBwZW5kVGVzdCggbmFtZSwgdGVzdElkLCBtb2R1bGVO
YW1lICkgeworCXZhciB0aXRsZSwgcmVydW5UcmlnZ2VyLCB0ZXN0QmxvY2ssIGFzc2VydExpc3Qs
CisJCXRlc3RzID0gaWQoICJxdW5pdC10ZXN0cyIgKTsKKworCWlmICggIXRlc3RzICkgeworCQly
ZXR1cm47CisJfQorCisJdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic3Ryb25nIiAp
OworCXRpdGxlLmlubmVySFRNTCA9IGdldE5hbWVIdG1sKCBuYW1lLCBtb2R1bGVOYW1lICk7CisK
KwlyZXJ1blRyaWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKKwlyZXJ1blRy
aWdnZXIuaW5uZXJIVE1MID0gIlJlcnVuIjsKKwlyZXJ1blRyaWdnZXIuaHJlZiA9IHNldFVybCh7
IHRlc3RJZDogdGVzdElkIH0pOworCisJdGVzdEJsb2NrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCggImxpIiApOworCXRlc3RCbG9jay5hcHBlbmRDaGlsZCggdGl0bGUgKTsKKwl0ZXN0QmxvY2su
YXBwZW5kQ2hpbGQoIHJlcnVuVHJpZ2dlciApOworCXRlc3RCbG9jay5pZCA9ICJxdW5pdC10ZXN0
LW91dHB1dC0iICsgdGVzdElkOworCisJYXNzZXJ0TGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoICJvbCIgKTsKKwlhc3NlcnRMaXN0LmNsYXNzTmFtZSA9ICJxdW5pdC1hc3NlcnQtbGlzdCI7
CisKKwl0ZXN0QmxvY2suYXBwZW5kQ2hpbGQoIGFzc2VydExpc3QgKTsKKworCXRlc3RzLmFwcGVu
ZENoaWxkKCB0ZXN0QmxvY2sgKTsKK30KKworLy8gSFRNTCBSZXBvcnRlciBpbml0aWFsaXphdGlv
biBhbmQgbG9hZAorUVVuaXQuYmVnaW4oZnVuY3Rpb24oIGRldGFpbHMgKSB7CisJdmFyIHF1bml0
ID0gaWQoICJxdW5pdCIgKTsKKworCS8vIEZpeHR1cmUgaXMgdGhlIG9ubHkgb25lIG5lY2Vzc2Fy
eSB0byBydW4gd2l0aG91dCB0aGUgI3F1bml0IGVsZW1lbnQKKwlzdG9yZUZpeHR1cmUoKTsKKwor
CWlmICggcXVuaXQgKSB7CisJCXF1bml0LmlubmVySFRNTCA9CisJCQkiPGgxIGlkPSdxdW5pdC1o
ZWFkZXInPiIgKyBlc2NhcGVUZXh0KCBkb2N1bWVudC50aXRsZSApICsgIjwvaDE+IiArCisJCQki
PGgyIGlkPSdxdW5pdC1iYW5uZXInPjwvaDI+IiArCisJCQkiPGRpdiBpZD0ncXVuaXQtdGVzdHJ1
bm5lci10b29sYmFyJz48L2Rpdj4iICsKKwkJCWFwcGVuZEZpbHRlcmVkVGVzdCgpICsKKwkJCSI8
aDIgaWQ9J3F1bml0LXVzZXJBZ2VudCc+PC9oMj4iICsKKwkJCSI8b2wgaWQ9J3F1bml0LXRlc3Rz
Jz48L29sPiI7CisJfQorCisJYXBwZW5kSGVhZGVyKCk7CisJYXBwZW5kQmFubmVyKCk7CisJYXBw
ZW5kVGVzdFJlc3VsdHMoKTsKKwlhcHBlbmRVc2VyQWdlbnQoKTsKKwlhcHBlbmRUb29sYmFyKCk7
CisJYXBwZW5kVGVzdHNMaXN0KCBkZXRhaWxzLm1vZHVsZXMgKTsKKwl0b29sYmFyTW9kdWxlRmls
dGVyKCk7CisKKwlpZiAoIHF1bml0ICYmIGNvbmZpZy5oaWRlcGFzc2VkICkgeworCQlhZGRDbGFz
cyggcXVuaXQubGFzdENoaWxkLCAiaGlkZXBhc3MiICk7CisJfQorfSk7CisKK1FVbml0LmRvbmUo
ZnVuY3Rpb24oIGRldGFpbHMgKSB7CisJdmFyIGksIGtleSwKKwkJYmFubmVyID0gaWQoICJxdW5p
dC1iYW5uZXIiICksCisJCXRlc3RzID0gaWQoICJxdW5pdC10ZXN0cyIgKSwKKwkJaHRtbCA9IFsK
KwkJCSJUZXN0cyBjb21wbGV0ZWQgaW4gIiwKKwkJCWRldGFpbHMucnVudGltZSwKKwkJCSIgbWls
bGlzZWNvbmRzLjxiciAvPiIsCisJCQkiPHNwYW4gY2xhc3M9J3Bhc3NlZCc+IiwKKwkJCWRldGFp
bHMucGFzc2VkLAorCQkJIjwvc3Bhbj4gYXNzZXJ0aW9ucyBvZiA8c3BhbiBjbGFzcz0ndG90YWwn
PiIsCisJCQlkZXRhaWxzLnRvdGFsLAorCQkJIjwvc3Bhbj4gcGFzc2VkLCA8c3BhbiBjbGFzcz0n
ZmFpbGVkJz4iLAorCQkJZGV0YWlscy5mYWlsZWQsCisJCQkiPC9zcGFuPiBmYWlsZWQuIgorCQld
LmpvaW4oICIiICk7CisKKwlpZiAoIGJhbm5lciApIHsKKwkJYmFubmVyLmNsYXNzTmFtZSA9IGRl
dGFpbHMuZmFpbGVkID8gInF1bml0LWZhaWwiIDogInF1bml0LXBhc3MiOworCX0KKworCWlmICgg
dGVzdHMgKSB7CisJCWlkKCAicXVuaXQtdGVzdHJlc3VsdCIgKS5pbm5lckhUTUwgPSBodG1sOwor
CX0KKworCWlmICggY29uZmlnLmFsdGVydGl0bGUgJiYgZGVmaW5lZC5kb2N1bWVudCAmJiBkb2N1
bWVudC50aXRsZSApIHsKKworCQkvLyBzaG93IOKcliBmb3IgZ29vZCwg4pyUIGZvciBiYWQgc3Vp
dGUgcmVzdWx0IGluIHRpdGxlCisJCS8vIHVzZSBlc2NhcGUgc2VxdWVuY2VzIGluIGNhc2UgZmls
ZSBnZXRzIGxvYWRlZCB3aXRoIG5vbi11dGYtOC1jaGFyc2V0CisJCWRvY3VtZW50LnRpdGxlID0g
WworCQkJKCBkZXRhaWxzLmZhaWxlZCA/ICJcdTI3MTYiIDogIlx1MjcxNCIgKSwKKwkJCWRvY3Vt
ZW50LnRpdGxlLnJlcGxhY2UoIC9eW1x1MjcxNFx1MjcxNl0gL2ksICIiICkKKwkJXS5qb2luKCAi
ICIgKTsKKwl9CisKKwkvLyBjbGVhciBvd24gc2Vzc2lvblN0b3JhZ2UgaXRlbXMgaWYgYWxsIHRl
c3RzIHBhc3NlZAorCWlmICggY29uZmlnLnJlb3JkZXIgJiYgZGVmaW5lZC5zZXNzaW9uU3RvcmFn
ZSAmJiBkZXRhaWxzLmZhaWxlZCA9PT0gMCApIHsKKwkJZm9yICggaSA9IDA7IGkgPCBzZXNzaW9u
U3RvcmFnZS5sZW5ndGg7IGkrKyApIHsKKwkJCWtleSA9IHNlc3Npb25TdG9yYWdlLmtleSggaSsr
ICk7CisJCQlpZiAoIGtleS5pbmRleE9mKCAicXVuaXQtdGVzdC0iICkgPT09IDAgKSB7CisJCQkJ
c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgga2V5ICk7CisJCQl9CisJCX0KKwl9CisKKwkvLyBz
Y3JvbGwgYmFjayB0byB0b3AgdG8gc2hvdyByZXN1bHRzCisJaWYgKCBjb25maWcuc2Nyb2xsdG9w
ICYmIHdpbmRvdy5zY3JvbGxUbyApIHsKKwkJd2luZG93LnNjcm9sbFRvKCAwLCAwICk7CisJfQor
fSk7CisKK2Z1bmN0aW9uIGdldE5hbWVIdG1sKCBuYW1lLCBtb2R1bGUgKSB7CisJdmFyIG5hbWVI
dG1sID0gIiI7CisKKwlpZiAoIG1vZHVsZSApIHsKKwkJbmFtZUh0bWwgPSAiPHNwYW4gY2xhc3M9
J21vZHVsZS1uYW1lJz4iICsgZXNjYXBlVGV4dCggbW9kdWxlICkgKyAiPC9zcGFuPjogIjsKKwl9
CisKKwluYW1lSHRtbCArPSAiPHNwYW4gY2xhc3M9J3Rlc3QtbmFtZSc+IiArIGVzY2FwZVRleHQo
IG5hbWUgKSArICI8L3NwYW4+IjsKKworCXJldHVybiBuYW1lSHRtbDsKK30KKworUVVuaXQudGVz
dFN0YXJ0KGZ1bmN0aW9uKCBkZXRhaWxzICkgeworCXZhciBydW5uaW5nLCB0ZXN0QmxvY2ssIGJh
ZDsKKworCXRlc3RCbG9jayA9IGlkKCAicXVuaXQtdGVzdC1vdXRwdXQtIiArIGRldGFpbHMudGVz
dElkICk7CisJaWYgKCB0ZXN0QmxvY2sgKSB7CisJCXRlc3RCbG9jay5jbGFzc05hbWUgPSAicnVu
bmluZyI7CisJfSBlbHNlIHsKKworCQkvLyBSZXBvcnQgbGF0ZXIgcmVnaXN0ZXJlZCB0ZXN0cwor
CQlhcHBlbmRUZXN0KCBkZXRhaWxzLm5hbWUsIGRldGFpbHMudGVzdElkLCBkZXRhaWxzLm1vZHVs
ZSApOworCX0KKworCXJ1bm5pbmcgPSBpZCggInF1bml0LXRlc3RyZXN1bHQiICk7CisJaWYgKCBy
dW5uaW5nICkgeworCQliYWQgPSBRVW5pdC5jb25maWcucmVvcmRlciAmJiBkZWZpbmVkLnNlc3Np
b25TdG9yYWdlICYmCisJCQkrc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSggInF1bml0LXRlc3QtIiAr
IGRldGFpbHMubW9kdWxlICsgIi0iICsgZGV0YWlscy5uYW1lICk7CisKKwkJcnVubmluZy5pbm5l
ckhUTUwgPSAoIGJhZCA/CisJCQkiUmVydW5uaW5nIHByZXZpb3VzbHkgZmFpbGVkIHRlc3Q6IDxi
ciAvPiIgOgorCQkJIlJ1bm5pbmc6IDxiciAvPiIgKSArCisJCQlnZXROYW1lSHRtbCggZGV0YWls
cy5uYW1lLCBkZXRhaWxzLm1vZHVsZSApOworCX0KKworfSk7CisKK2Z1bmN0aW9uIHN0cmlwSHRt
bCggc3RyaW5nICkgeworCS8vIHN0cmlwIHRhZ3MsIGh0bWwgZW50aXR5IGFuZCB3aGl0ZXNwYWNl
cworCXJldHVybiBzdHJpbmcucmVwbGFjZSgvPFwvP1tePl0rKD58JCkvZywgIiIpLnJlcGxhY2Uo
L1wmcXVvdDsvZywgIiIpLnJlcGxhY2UoL1xzKy9nLCAiIik7Cit9CisKK1FVbml0LmxvZyhmdW5j
dGlvbiggZGV0YWlscyApIHsKKwl2YXIgYXNzZXJ0TGlzdCwgYXNzZXJ0TGksCisJCW1lc3NhZ2Us
IGV4cGVjdGVkLCBhY3R1YWwsIGRpZmYsCisJCXNob3dEaWZmID0gZmFsc2UsCisJCXRlc3RJdGVt
ID0gaWQoICJxdW5pdC10ZXN0LW91dHB1dC0iICsgZGV0YWlscy50ZXN0SWQgKTsKKworCWlmICgg
IXRlc3RJdGVtICkgeworCQlyZXR1cm47CisJfQorCisJbWVzc2FnZSA9IGVzY2FwZVRleHQoIGRl
dGFpbHMubWVzc2FnZSApIHx8ICggZGV0YWlscy5yZXN1bHQgPyAib2theSIgOiAiZmFpbGVkIiAp
OworCW1lc3NhZ2UgPSAiPHNwYW4gY2xhc3M9J3Rlc3QtbWVzc2FnZSc+IiArIG1lc3NhZ2UgKyAi
PC9zcGFuPiI7CisJbWVzc2FnZSArPSAiPHNwYW4gY2xhc3M9J3J1bnRpbWUnPkAgIiArIGRldGFp
bHMucnVudGltZSArICIgbXM8L3NwYW4+IjsKKworCS8vIHB1c2hGYWlsdXJlIGRvZXNuJ3QgcHJv
dmlkZSBkZXRhaWxzLmV4cGVjdGVkCisJLy8gd2hlbiBpdCBjYWxscywgaXQncyBpbXBsaWNpdCB0
byBhbHNvIG5vdCBzaG93IGV4cGVjdGVkIGFuZCBkaWZmIHN0dWZmCisJLy8gQWxzbywgd2UgbmVl
ZCB0byBjaGVjayBkZXRhaWxzLmV4cGVjdGVkIGV4aXN0ZW5jZSwgYXMgaXQgY2FuIGV4aXN0IGFu
ZCBiZSB1bmRlZmluZWQKKwlpZiAoICFkZXRhaWxzLnJlc3VsdCAmJiBoYXNPd24uY2FsbCggZGV0
YWlscywgImV4cGVjdGVkIiApICkgeworCQlpZiAoIGRldGFpbHMubmVnYXRpdmUgKSB7CisJCQll
eHBlY3RlZCA9IGVzY2FwZVRleHQoICJOT1QgIiArIFFVbml0LmR1bXAucGFyc2UoIGRldGFpbHMu
ZXhwZWN0ZWQgKSApOworCQl9IGVsc2UgeworCQkJZXhwZWN0ZWQgPSBlc2NhcGVUZXh0KCBRVW5p
dC5kdW1wLnBhcnNlKCBkZXRhaWxzLmV4cGVjdGVkICkgKTsKKwkJfQorCisJCWFjdHVhbCA9IGVz
Y2FwZVRleHQoIFFVbml0LmR1bXAucGFyc2UoIGRldGFpbHMuYWN0dWFsICkgKTsKKwkJbWVzc2Fn
ZSArPSAiPHRhYmxlPjx0ciBjbGFzcz0ndGVzdC1leHBlY3RlZCc+PHRoPkV4cGVjdGVkOiA8L3Ro
Pjx0ZD48cHJlPiIgKworCQkJZXhwZWN0ZWQgKworCQkJIjwvcHJlPjwvdGQ+PC90cj4iOworCisJ
CWlmICggYWN0dWFsICE9PSBleHBlY3RlZCApIHsKKworCQkJbWVzc2FnZSArPSAiPHRyIGNsYXNz
PSd0ZXN0LWFjdHVhbCc+PHRoPlJlc3VsdDogPC90aD48dGQ+PHByZT4iICsKKwkJCQlhY3R1YWwg
KyAiPC9wcmU+PC90ZD48L3RyPiI7CisKKwkJCS8vIERvbid0IHNob3cgZGlmZiBpZiBhY3R1YWwg
b3IgZXhwZWN0ZWQgYXJlIGJvb2xlYW5zCisJCQlpZiAoICEoIC9eKHRydWV8ZmFsc2UpJC8udGVz
dCggYWN0dWFsICkgKSAmJgorCQkJCQkhKCAvXih0cnVlfGZhbHNlKSQvLnRlc3QoIGV4cGVjdGVk
ICkgKSApIHsKKwkJCQlkaWZmID0gUVVuaXQuZGlmZiggZXhwZWN0ZWQsIGFjdHVhbCApOworCQkJ
CXNob3dEaWZmID0gc3RyaXBIdG1sKCBkaWZmICkubGVuZ3RoICE9PQorCQkJCQlzdHJpcEh0bWwo
IGV4cGVjdGVkICkubGVuZ3RoICsKKwkJCQkJc3RyaXBIdG1sKCBhY3R1YWwgKS5sZW5ndGg7CisJ
CQl9CisKKwkJCS8vIERvbid0IHNob3cgZGlmZiBpZiBleHBlY3RlZCBhbmQgYWN0dWFsIGFyZSB0
b3RhbGx5IGRpZmZlcmVudAorCQkJaWYgKCBzaG93RGlmZiApIHsKKwkJCQltZXNzYWdlICs9ICI8
dHIgY2xhc3M9J3Rlc3QtZGlmZic+PHRoPkRpZmY6IDwvdGg+PHRkPjxwcmU+IiArCisJCQkJCWRp
ZmYgKyAiPC9wcmU+PC90ZD48L3RyPiI7CisJCQl9CisJCX0gZWxzZSBpZiAoIGV4cGVjdGVkLmlu
ZGV4T2YoICJbb2JqZWN0IEFycmF5XSIgKSAhPT0gLTEgfHwKKwkJCQlleHBlY3RlZC5pbmRleE9m
KCAiW29iamVjdCBPYmplY3RdIiApICE9PSAtMSApIHsKKwkJCW1lc3NhZ2UgKz0gIjx0ciBjbGFz
cz0ndGVzdC1tZXNzYWdlJz48dGg+TWVzc2FnZTogPC90aD48dGQ+IiArCisJCQkJIkRpZmYgc3Vw
cHJlc3NlZCBhcyB0aGUgZGVwdGggb2Ygb2JqZWN0IGlzIG1vcmUgdGhhbiBjdXJyZW50IG1heCBk
ZXB0aCAoIiArCisJCQkJUVVuaXQuY29uZmlnLm1heERlcHRoICsgIikuPHA+SGludDogVXNlIDxj
b2RlPlFVbml0LmR1bXAubWF4RGVwdGg8L2NvZGU+IHRvICIgKworCQkJCSIgcnVuIHdpdGggYSBo
aWdoZXIgbWF4IGRlcHRoIG9yIDxhIGhyZWY9JyIgKyBzZXRVcmwoeyBtYXhEZXB0aDogLTEgfSkg
KyAiJz4iICsKKwkJCQkiUmVydW48L2E+IHdpdGhvdXQgbWF4IGRlcHRoLjwvcD48L3RkPjwvdHI+
IjsKKwkJfQorCisJCWlmICggZGV0YWlscy5zb3VyY2UgKSB7CisJCQltZXNzYWdlICs9ICI8dHIg
Y2xhc3M9J3Rlc3Qtc291cmNlJz48dGg+U291cmNlOiA8L3RoPjx0ZD48cHJlPiIgKworCQkJCWVz
Y2FwZVRleHQoIGRldGFpbHMuc291cmNlICkgKyAiPC9wcmU+PC90ZD48L3RyPiI7CisJCX0KKwor
CQltZXNzYWdlICs9ICI8L3RhYmxlPiI7CisKKwkvLyB0aGlzIG9jY291cnMgd2hlbiBwdXNoRmFp
bHVyZSBpcyBzZXQgYW5kIHdlIGhhdmUgYW4gZXh0cmFjdGVkIHN0YWNrIHRyYWNlCisJfSBlbHNl
IGlmICggIWRldGFpbHMucmVzdWx0ICYmIGRldGFpbHMuc291cmNlICkgeworCQltZXNzYWdlICs9
ICI8dGFibGU+IiArCisJCQkiPHRyIGNsYXNzPSd0ZXN0LXNvdXJjZSc+PHRoPlNvdXJjZTogPC90
aD48dGQ+PHByZT4iICsKKwkJCWVzY2FwZVRleHQoIGRldGFpbHMuc291cmNlICkgKyAiPC9wcmU+
PC90ZD48L3RyPiIgKworCQkJIjwvdGFibGU+IjsKKwl9CisKKwlhc3NlcnRMaXN0ID0gdGVzdEl0
ZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJvbCIgKVsgMCBdOworCisJYXNzZXJ0TGkgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCAibGkiICk7CisJYXNzZXJ0TGkuY2xhc3NOYW1lID0gZGV0YWls
cy5yZXN1bHQgPyAicGFzcyIgOiAiZmFpbCI7CisJYXNzZXJ0TGkuaW5uZXJIVE1MID0gbWVzc2Fn
ZTsKKwlhc3NlcnRMaXN0LmFwcGVuZENoaWxkKCBhc3NlcnRMaSApOworfSk7CisKK1FVbml0LnRl
c3REb25lKGZ1bmN0aW9uKCBkZXRhaWxzICkgeworCXZhciB0ZXN0VGl0bGUsIHRpbWUsIHRlc3RJ
dGVtLCBhc3NlcnRMaXN0LAorCQlnb29kLCBiYWQsIHRlc3RDb3VudHMsIHNraXBwZWQsIHNvdXJj
ZU5hbWUsCisJCXRlc3RzID0gaWQoICJxdW5pdC10ZXN0cyIgKTsKKworCWlmICggIXRlc3RzICkg
eworCQlyZXR1cm47CisJfQorCisJdGVzdEl0ZW0gPSBpZCggInF1bml0LXRlc3Qtb3V0cHV0LSIg
KyBkZXRhaWxzLnRlc3RJZCApOworCisJYXNzZXJ0TGlzdCA9IHRlc3RJdGVtLmdldEVsZW1lbnRz
QnlUYWdOYW1lKCAib2wiIClbIDAgXTsKKworCWdvb2QgPSBkZXRhaWxzLnBhc3NlZDsKKwliYWQg
PSBkZXRhaWxzLmZhaWxlZDsKKworCS8vIHN0b3JlIHJlc3VsdCB3aGVuIHBvc3NpYmxlCisJaWYg
KCBjb25maWcucmVvcmRlciAmJiBkZWZpbmVkLnNlc3Npb25TdG9yYWdlICkgeworCQlpZiAoIGJh
ZCApIHsKKwkJCXNlc3Npb25TdG9yYWdlLnNldEl0ZW0oICJxdW5pdC10ZXN0LSIgKyBkZXRhaWxz
Lm1vZHVsZSArICItIiArIGRldGFpbHMubmFtZSwgYmFkICk7CisJCX0gZWxzZSB7CisJCQlzZXNz
aW9uU3RvcmFnZS5yZW1vdmVJdGVtKCAicXVuaXQtdGVzdC0iICsgZGV0YWlscy5tb2R1bGUgKyAi
LSIgKyBkZXRhaWxzLm5hbWUgKTsKKwkJfQorCX0KKworCWlmICggYmFkID09PSAwICkgeworCisJ
CS8vIENvbGxhcHNlIHRoZSBwYXNzaW5nIHRlc3RzCisJCWFkZENsYXNzKCBhc3NlcnRMaXN0LCAi
cXVuaXQtY29sbGFwc2VkIiApOworCX0gZWxzZSBpZiAoIGJhZCAmJiBjb25maWcuY29sbGFwc2Ug
JiYgIWNvbGxhcHNlTmV4dCApIHsKKworCQkvLyBTa2lwIGNvbGxhcHNpbmcgdGhlIGZpcnN0IGZh
aWxpbmcgdGVzdAorCQljb2xsYXBzZU5leHQgPSB0cnVlOworCX0gZWxzZSB7CisKKwkJLy8gQ29s
bGFwc2UgcmVtYWluaW5nIHRlc3RzCisJCWFkZENsYXNzKCBhc3NlcnRMaXN0LCAicXVuaXQtY29s
bGFwc2VkIiApOworCX0KKworCS8vIHRlc3RJdGVtLmZpcnN0Q2hpbGQgaXMgdGhlIHRlc3QgbmFt
ZQorCXRlc3RUaXRsZSA9IHRlc3RJdGVtLmZpcnN0Q2hpbGQ7CisKKwl0ZXN0Q291bnRzID0gYmFk
ID8KKwkJIjxiIGNsYXNzPSdmYWlsZWQnPiIgKyBiYWQgKyAiPC9iPiwgIiArICI8YiBjbGFzcz0n
cGFzc2VkJz4iICsgZ29vZCArICI8L2I+LCAiIDoKKwkJIiI7CisKKwl0ZXN0VGl0bGUuaW5uZXJI
VE1MICs9ICIgPGIgY2xhc3M9J2NvdW50cyc+KCIgKyB0ZXN0Q291bnRzICsKKwkJZGV0YWlscy5h
c3NlcnRpb25zLmxlbmd0aCArICIpPC9iPiI7CisKKwlpZiAoIGRldGFpbHMuc2tpcHBlZCApIHsK
KwkJdGVzdEl0ZW0uY2xhc3NOYW1lID0gInNraXBwZWQiOworCQlza2lwcGVkID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCggImVtIiApOworCQlza2lwcGVkLmNsYXNzTmFtZSA9ICJxdW5pdC1za2lw
cGVkLWxhYmVsIjsKKwkJc2tpcHBlZC5pbm5lckhUTUwgPSAic2tpcHBlZCI7CisJCXRlc3RJdGVt
Lmluc2VydEJlZm9yZSggc2tpcHBlZCwgdGVzdFRpdGxlICk7CisJfSBlbHNlIHsKKwkJYWRkRXZl
bnQoIHRlc3RUaXRsZSwgImNsaWNrIiwgZnVuY3Rpb24oKSB7CisJCQl0b2dnbGVDbGFzcyggYXNz
ZXJ0TGlzdCwgInF1bml0LWNvbGxhcHNlZCIgKTsKKwkJfSk7CisKKwkJdGVzdEl0ZW0uY2xhc3NO
YW1lID0gYmFkID8gImZhaWwiIDogInBhc3MiOworCisJCXRpbWUgPSBkb2N1bWVudC5jcmVhdGVF
bGVtZW50KCAic3BhbiIgKTsKKwkJdGltZS5jbGFzc05hbWUgPSAicnVudGltZSI7CisJCXRpbWUu
aW5uZXJIVE1MID0gZGV0YWlscy5ydW50aW1lICsgIiBtcyI7CisJCXRlc3RJdGVtLmluc2VydEJl
Zm9yZSggdGltZSwgYXNzZXJ0TGlzdCApOworCX0KKworCS8vIFNob3cgdGhlIHNvdXJjZSBvZiB0
aGUgdGVzdCB3aGVuIHNob3dpbmcgYXNzZXJ0aW9ucworCWlmICggZGV0YWlscy5zb3VyY2UgKSB7
CisJCXNvdXJjZU5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAicCIgKTsKKwkJc291cmNl
TmFtZS5pbm5lckhUTUwgPSAiPHN0cm9uZz5Tb3VyY2U6IDwvc3Ryb25nPiIgKyBkZXRhaWxzLnNv
dXJjZTsKKwkJYWRkQ2xhc3MoIHNvdXJjZU5hbWUsICJxdW5pdC1zb3VyY2UiICk7CisJCWlmICgg
YmFkID09PSAwICkgeworCQkJYWRkQ2xhc3MoIHNvdXJjZU5hbWUsICJxdW5pdC1jb2xsYXBzZWQi
ICk7CisJCX0KKwkJYWRkRXZlbnQoIHRlc3RUaXRsZSwgImNsaWNrIiwgZnVuY3Rpb24oKSB7CisJ
CQl0b2dnbGVDbGFzcyggc291cmNlTmFtZSwgInF1bml0LWNvbGxhcHNlZCIgKTsKKwkJfSk7CisJ
CXRlc3RJdGVtLmFwcGVuZENoaWxkKCBzb3VyY2VOYW1lICk7CisJfQorfSk7CisKK2lmICggZGVm
aW5lZC5kb2N1bWVudCApIHsKKworCS8vIEF2b2lkIHJlYWR5U3RhdGUgaXNzdWUgd2l0aCBwaGFu
dG9tanMKKwkvLyBSZWY6ICM4MTgKKwl2YXIgbm90UGhhbnRvbSA9ICggZnVuY3Rpb24oIHAgKSB7
CisJCXJldHVybiAhKCBwICYmIHAudmVyc2lvbiAmJiBwLnZlcnNpb24ubWFqb3IgPiAwICk7CisJ
fSApKCB3aW5kb3cucGhhbnRvbSApOworCisJaWYgKCBub3RQaGFudG9tICYmIGRvY3VtZW50LnJl
YWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CisJCVFVbml0LmxvYWQoKTsKKwl9IGVsc2Ugewor
CQlhZGRFdmVudCggd2luZG93LCAibG9hZCIsIFFVbml0LmxvYWQgKTsKKwl9Cit9IGVsc2Ugewor
CWNvbmZpZy5wYWdlTG9hZGVkID0gdHJ1ZTsKKwljb25maWcuYXV0b3J1biA9IHRydWU7Cit9CisK
K30pKCk7Cg==
</data>
<flag name="review"
          id="293372"
          type_id="1"
          status="-"
          setter="dbates"
    />
    <flag name="commit-queue"
          id="293373"
          type_id="3"
          status="-"
          setter="dbates"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268425</attachid>
            <date>2016-01-06 17:18:17 -0800</date>
            <delta_ts>2016-01-08 12:00:36 -0800</delta_ts>
            <desc>2. Adding a unit test to test BuildbotQueueView._appendPendingRevisionCount.</desc>
            <filename>bug-152345-20160106171745.patch</filename>
            <type>text/plain</type>
            <size>12107</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0Njc4CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggYzZkOTQzODZhNTZjN2NkNDQ1NDA5ZjA5NGYzYmVhMzIw
NmVmNzE3MC4uM2M0YTE1MTlmOWE1YWU0YTZhOTMzOWJiY2RhNjQ4ZjJlZGIxYTY1ZCAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDMz
IEBACiAyMDE2LTAxLTA2ICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgogCisg
ICAgICAgIEFkZGluZyBhIHVuaXQgdGVzdCB0byB0ZXN0IEJ1aWxkYm90UXVldWVWaWV3Ll9hcHBl
bmRQZW5kaW5nUmV2aXNpb25Db3VudC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE1MjM0NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWUu
anM6IEFkZGVkLgorICAgICAgICAoTW9ja0J1aWxkYm90UXVldWUpOiBBZGRlZC4gTW9jayBCdWls
ZGJvdFF1ZXVlIG9iamVjdCB0aGF0IGRvZXNuJ3QgbmVlZCB0byB0YWxrIHRvIGFuIGFjdHVhbCBC
dWlsZGJvdCBzZXJ2ZXIuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0
Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxk
Ym90UXVldWVWaWV3LmpzOiBBZGRlZC4KKyAgICAgICAgKE1vY2tCdWlsZGJvdFF1ZXVlVmlldyk6
IEFkZGVkLiBNb2NrIEJ1aWxkYm90UXVldWVWaWV3IG9iamVjdCB0aGF0IHJldHVybnMgYSBwcmUt
c3BlY2lmaWVkIF9sYXRlc3RQcm9kdWN0aXZlSXRlcmF0aW9uIHdpdGhvdXQKKyAgICAgICAgdGhl
IG5lZWQgdG8gdGFsayB0byBhIHJlYWwgQnVpbGRib3Qgc2VydmVyLgorICAgICAgICAoTW9ja0J1
aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZS5fbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbik6IEFk
ZGVkLiBSZXR1cm5zIGEgcHJlLXNwZWNpZmllZCBfbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbgor
ICAgICAgICB3aXRob3V0IHRoZSBuZWVkIHRvIHRhbGsgdG8gYSByZWFsIEJ1aWxkYm90IHNlcnZl
ci4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9w
dWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrT3ZlcnJpZGVzLmpzOiBBZGRl
ZC4KKyAgICAgICAgKHNldCBsYWJlbCk6IEFkZGVkLiBUaGUgcmVhbCAibGFiZWwiIHNldHRlciB3
YXMgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGluIHRoZSB1bml0IHRlc3RzIHNvIEkgb3ZlcnJvZGUg
aXQgd2l0aCBhIHNpbXBsaWZpZWQKKyAgICAgICAgdmVyc2lvbi4KKyAgICAgICAgKiBCdWlsZFNs
YXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQv
U2NyaXB0cy90ZXN0cy9Nb2NrVHJhYy5qczogQWRkZWQuCisgICAgICAgIChNb2NrVHJhYyk6IEFk
ZGVkLiBNb2NrIFRyYWMgY29uc3RydWN0b3IgdGhhdCBoYXMgcHJlLXBvcHVsYXRlZCAicmVjb3Jk
ZWRDb21taXRzIiBhbmQgZG9lcyBub3QgbmVlZCB0byB0YWxrIHRvIGEgcmVhbCBUcmFjCisgICAg
ICAgIHNlcnZlci4KKyAgICAgICAgKE1vY2tUcmFjLnByb3RvdHlwZS5nZXQgb2xkZXN0UmVjb3Jk
ZWRSZXZpc2lvbk51bWJlcik6IEFkZGVkLiBSZXR1cm5zIGEgcHJlLXNwZWNpZmllZCByZXZpc2lv
bi4KKyAgICAgICAgKE1vY2tUcmFjLnByb3RvdHlwZS5nZXQgbGF0ZXN0UmVjb3JkZWRSZXZpc2lv
bk51bWJlcik6IERpdHRvLgorICAgICAgICAoTW9ja1RyYWMucHJvdG90eXBlLmxvYWRNb3JlSGlz
dG9yaWNhbERhdGEpOiBBZGRlZC4gT3ZlcnJpZGVzIHRoZSByZWFsIGxvYWRNb3JlSGlzdG9yaWNh
bERhdGEgc28gdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCisgICAgICAgIHRyeWluZyB0byB0YWxr
IHRvIFRyYWMuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1j
b25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvaW5kZXguaHRtbDogQWRk
ZWQuIFdlYiBwYWdlIGNvbnRhaW5lciBmb3IKKyAgICAgICAgUVVuaXQgdW5pdCB0ZXN0cy4KKyAg
ICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNf
aHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5qczogQWRkZWQuIFFVbml0IHVuaXQg
dGVzdHMuCisKKzIwMTYtMDEtMDYgIEphc29uIE1hcmNlbGwgIDxqbWFyY2VsbEBhcHBsZS5jb20+
CisKICAgICAgICAgQWRkaW5nIFFVbml0IGZvciB1bml0IHRlc3RpbmcuCiAgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTIzNDUKIApkaWZmIC0tZ2l0IGEv
VG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0
bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWUuanMgYi9Ub29scy9C
dWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNo
Ym9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrQnVpbGRib3RRdWV1ZS5qcwpuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jMGVj
MzE2N2UyYjU0YjU4ZTk3ZmIxZWRjOTRjYjIzNmMwOWM1NDFkCi0tLSAvZGV2L251bGwKKysrIGIv
VG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0
bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWUuanMKQEAgLTAsMCAr
MSwyNSBAQAorTW9ja0J1aWxkYm90UXVldWUgPSBmdW5jdGlvbigpCit7CisgICAgaW5mbyA9IHsK
KyAgICAgICAgYnJhbmNoZXM6ICIiLAorICAgICAgICBwbGF0Zm9ybTogIiIsCisgICAgICAgIGRl
YnVnOiAiIiwKKyAgICAgICAgYnVpbGRlcjogIiIsCisgICAgICAgIHRlc3RlcjogIiIsCisgICAg
ICAgIHBlcmZvcm1hbmNlOiAiIiwKKyAgICAgICAgc3RhdGljQW5hbHl6ZXI6ICIiLAorICAgICAg
ICBsZWFrczogIiIsCisgICAgICAgIGFyY2hpdGVjdHVyZTogIiIsCisgICAgICAgIHRlc3RDYXRl
Z29yeTogIiIsCisgICAgICAgIGhlYWRpbmc6ICIiLAorICAgICAgICBjcmFzaGVzT25seTogIiIK
KyAgICB9OworICAgIEJ1aWxkYm90UXVldWUuY2FsbCh0aGlzLCAiTW9jayBCdWlsZEJvdCIsICJp
ZCIsIGluZm8pOworfTsKKworQmFzZU9iamVjdC5hZGRDb25zdHJ1Y3RvckZ1bmN0aW9ucyhNb2Nr
QnVpbGRib3RRdWV1ZSk7CisKK01vY2tCdWlsZGJvdFF1ZXVlLnByb3RvdHlwZSA9IHsKKyAgICBj
b25zdHJ1Y3RvcjogTW9ja0J1aWxkYm90UXVldWUsCisgICAgX19wcm90b19fOiBCdWlsZGJvdFF1
ZXVlLnByb3RvdHlwZQorfQpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVp
bGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMv
TW9ja0J1aWxkYm90UXVldWVWaWV3LmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9j
a0J1aWxkYm90UXVldWVWaWV3LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRjMzI4YjJlNGRlNTVmZTI3NjY3ZWRm
ODAwNDE2MDE3NDJlMmY5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3Vw
cG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0
cy90ZXN0cy9Nb2NrQnVpbGRib3RRdWV1ZVZpZXcuanMKQEAgLTAsMCArMSwyNiBAQAorTW9ja0J1
aWxkYm90UXVldWVWaWV3ID0gZnVuY3Rpb24ocXVldWVzKQoreworICAgIHRoaXMuZWxlbWVudCA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHRoaXMuZWxlbWVudC5jbGFzc0xp
c3QuYWRkKCJxdWV1ZS12aWV3Iik7CisgICAgdGhpcy5lbGVtZW50Ll9fcXVldWVWaWV3ID0gdGhp
czsKKworICAgIHRoaXMucXVldWVzID0gcXVldWVzIHx8IFtdOworCisgICAgQmFzZU9iamVjdC5j
YWxsKHRoaXMpOworfTsKKworQmFzZU9iamVjdC5hZGRDb25zdHJ1Y3RvckZ1bmN0aW9ucyhNb2Nr
QnVpbGRib3RRdWV1ZVZpZXcpOworCitNb2NrQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlID0g
eworICAgIGNvbnN0cnVjdG9yOiBNb2NrQnVpbGRib3RRdWV1ZVZpZXcsCisgICAgX19wcm90b19f
OiBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUsCisKKyAgICBfbGF0ZXN0UHJvZHVjdGl2ZUl0
ZXJhdGlvbjogZnVuY3Rpb24ocXVldWUpCisgICAgeworICAgICAgICByZXR1cm4geworICAgICAg
ICAgICAgcmV2aXNpb246IHsKKyAgICAgICAgICAgICAgICAiV2Via2l0IFJlcG8iOiAzMzAyMAor
ICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK307CmRpZmYgLS1naXQgYS9Ub29scy9C
dWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNo
Ym9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrT3ZlcnJpZGVzLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1
cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Njcmlw
dHMvdGVzdHMvTW9ja092ZXJyaWRlcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44NTYyYjg2NzFkNWYyYzkyYjIz
ZjJkNDk0ODIzY2E2MjEyMjUwZjUwCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2
ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Nj
cmlwdHMvdGVzdHMvTW9ja092ZXJyaWRlcy5qcwpAQCAtMCwwICsxLDExIEBACisvLyBUaGUgcmVh
bCAibGFiZWwiIHNldHRlciB3YXMgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGluIHRoZSB1bml0IHRl
c3RzIHNvIEkgb3ZlcnJvZGUgaXQgd2l0aCBhIHNpbXBsaWZpZWQgdmVyc2lvbi4KK09iamVjdC5k
ZWZpbmVQcm9wZXJ0eShTdGF0dXNMaW5lVmlldy5wcm90b3R5cGUsICJsYWJlbCIsIHsKKyAgICBz
ZXQ6IGZ1bmN0aW9uIGxhYmVsKHgpCisgICAgeworICAgICAgICBpZiAoeCkgeworICAgICAgICAg
ICAgdGhpcy5fbGFiZWxFbGVtZW50LnRleHRDb250ZW50ID0geDsKKyAgICAgICAgICAgIHRoaXMu
ZWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5fbGFiZWxFbGVtZW50LCB0aGlzLl9tZXNzYWdlRWxl
bWVudCk7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgibm8tbGFi
ZWwiKTsKKyAgICAgICAgfQorICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2
ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Nj
cmlwdHMvdGVzdHMvTW9ja1RyYWMuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2Nr
VHJhYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5hNDhmOTE1MmM4OTA1YWM4MTg0OTM2ZWE3MzNiOGZjZmQ1M2M4
ZWZlCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Vi
a2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja1Ry
YWMuanMKQEAgLTAsMCArMSw3NyBAQAorTW9ja1RyYWMgPSBmdW5jdGlvbigpCit7CisgICAgVHJh
Yy5jYWxsKHRoaXMsICJodHRwczovL3RyYWMud2Via2l0Lm9yZy8iKTsKKyAgICB0aGlzLnJlY29y
ZGVkQ29tbWl0cyA9IFsKKyAgICAgICAgeworICAgICAgICAgICAgInJldmlzaW9uTnVtYmVyIjog
MzMwMTgsCisgICAgICAgICAgICAibGluayI6ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL3JlcG9z
aXRvcnkvY2hhbmdlc2V0Lzc3MDE4L3NhZmFyaSIsCisgICAgICAgICAgICAidGl0bGUiOiB7fSwK
KyAgICAgICAgICAgICJhdXRob3IiOiAiSm9obiIsCisgICAgICAgICAgICAiZGF0ZSI6ICIyMDE1
LTExLTE1VDE3OjA1OjQ0LjAwMFoiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRlc2Ny
aXB0aW9uIiwKKyAgICAgICAgICAgICJjb250YWluc0JyYW5jaExvY2F0aW9uIjogdHJ1ZSwKKyAg
ICAgICAgICAgICJicmFuY2giOiAidHJ1bmsiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAg
ICAgICAgICJyZXZpc2lvbk51bWJlciI6IDMzMDE5LAorICAgICAgICAgICAgImxpbmsiOiAiaHR0
cDovL3RyYWMud2Via2l0Lm9yZy9yZXBvc2l0b3J5L2NoYW5nZXNldC83NzAxOS9zYWZhcmkiLAor
ICAgICAgICAgICAgInRpdGxlIjoge30sCisgICAgICAgICAgICAiYXV0aG9yIjogIlBhdWwiLAor
ICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0xMS0xNlQwMToxODoyMy4wMDBaIiwKKyAgICAgICAg
ICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAiY29udGFpbnNC
cmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAgICAgICAgICAiYnJhbmNoIjogInRydW5rIgorICAg
ICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAicmV2aXNpb25OdW1iZXIiOiAzMzAyMCwK
KyAgICAgICAgICAgICJsaW5rIjogImh0dHA6Ly90cmFjLndlYmtpdC5vcmcvcmVwb3NpdG9yeS9j
aGFuZ2VzZXQvNzcwMjAvc2FmYXJpIiwKKyAgICAgICAgICAgICJ0aXRsZSI6IHt9LAorICAgICAg
ICAgICAgImF1dGhvciI6ICJHZW9yZ2UiLAorICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0xMS0x
NlQwMToxOToyNy4wMDBaIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlv
biIsCisgICAgICAgICAgICAiY29udGFpbnNCcmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAgICAg
ICAgICAiYnJhbmNoIjogInRydW5rIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAg
ICAicmV2aXNpb25OdW1iZXIiOiAzMzAyMSwKKyAgICAgICAgICAgICJsaW5rIjogImh0dHA6Ly90
cmFjLndlYmtpdC5vcmcvcmVwb3NpdG9yeS9jaGFuZ2VzZXQvNzcwMjEvc2FmYXJpIiwKKyAgICAg
ICAgICAgICJ0aXRsZSI6IHt9LAorICAgICAgICAgICAgImF1dGhvciI6ICJSaW5nbyIsCisgICAg
ICAgICAgICAiZGF0ZSI6ICIyMDE1LTExLTE2VDAxOjIwOjU4LjAwMFoiLAorICAgICAgICAgICAg
ImRlc2NyaXB0aW9uIjogImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJjb250YWluc0JyYW5j
aExvY2F0aW9uIjogdHJ1ZSwKKyAgICAgICAgICAgICJicmFuY2giOiAic29tZU90aGVyQnJhbmNo
IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAicmV2aXNpb25OdW1iZXIiOiAz
MzAyMiwKKyAgICAgICAgICAgICJsaW5rIjogImh0dHA6Ly90cmFjLndlYmtpdC5vcmcvcmVwb3Np
dG9yeS9jaGFuZ2VzZXQvNzcwMjIvc2FmYXJpIiwKKyAgICAgICAgICAgICJ0aXRsZSI6IHt9LAor
ICAgICAgICAgICAgImF1dGhvciI6ICJCb2IiLAorICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0x
MS0xNlQwMToyMjowMS4wMDBaIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlw
dGlvbiIsCisgICAgICAgICAgICAiY29udGFpbnNCcmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAg
ICAgICAgICAiYnJhbmNoIjogInRydW5rIgorICAgICAgICB9CisgICAgXTsKK307CisKK0Jhc2VP
YmplY3QuYWRkQ29uc3RydWN0b3JGdW5jdGlvbnMoTW9ja1RyYWMpOworCitNb2NrVHJhYy5wcm90
b3R5cGUgPSB7CisgICAgY29uc3RydWN0b3I6IE1vY2tUcmFjLAorICAgIF9fcHJvdG9fXzogVHJh
Yy5wcm90b3R5cGUsCisKKyAgICBnZXQgb2xkZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlcigpCisg
ICAgeworICAgICAgICByZXR1cm4gMzMwMTg7CisgICAgfSwKKworICAgIGdldCBsYXRlc3RSZWNv
cmRlZFJldmlzaW9uTnVtYmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiAzMzAyMjsKKyAgICB9
LAorCisgICAgbG9hZE1vcmVIaXN0b3JpY2FsRGF0YTogZnVuY3Rpb24oKQorICAgIHsKKyAgICB9
LAorfTsKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5v
cmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL2luZGV4Lmh0bWwg
Yi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNf
aHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmFlYmI4
OGIyYmIzYTJhOTY1ZTYxODM0OWIzNjYyYzllMTk1MDE0MjIKLS0tIC9kZXYvbnVsbAorKysgYi9U
b29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRt
bC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9pbmRleC5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzwh
ZG9jdHlwZSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIg
Lz4KKworICAgIDx0aXRsZT5XZWJLaXQgQm90IFdhdGNoZXIncyBEYXNoYm9hcmQgUVVuaXQgVGVz
dCBSdW5uZXI8L3RpdGxlPgorCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8u
Li9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuY3NzIj4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQi
IGhyZWY9Ii4uLy4uL1N0eWxlcy9NYWluLmNzcyI+PC9saW5rPgorICAgIDxsaW5rIHJlbD0ic3R5
bGVzaGVldCIgaHJlZj0iLi4vLi4vU3R5bGVzL1BvcG92ZXIuY3NzIj48L2xpbms+CisgICAgPGxp
bmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9TdHlsZXMvUXVldWVWaWV3LmNzcyI+PC9s
aW5rPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vU3R5bGVzL1N0YXR1
c0xpbmVWaWV3LmNzcyI+PC9saW5rPgorCisgICAgPHNjcmlwdCBzcmM9Ii4uL1V0aWxpdGllcy5q
cyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0Jhc2VPYmplY3QuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSIuLi9EYXNoYm9hcmQuanMiPjwvc2NyaXB0PgorICAgIDxzY3Jp
cHQgc3JjPSIuLi9CdWlsZGJvdC5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1
Z3ppbGxhLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnViYmxlUXVldWVTZXJ2
ZXIuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9XZWJLaXRCdWlsZGJvdC5qcyI+
PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90UXVldWUuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWJibGVRdWV1ZS5qcyI+PC9zY3JpcHQ+CisgICAgPHNj
cmlwdCBzcmM9Ii4uL0J1aWxkYm90SXRlcmF0aW9uLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0
IHNyYz0iLi4vQnVpbGRib3RUZXN0UmVzdWx0cy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9Ii4uL0dlb21ldHJ5LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vUG9wb3Zl
ci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1BvcG92ZXJUcmFja2VyLmpzIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vUXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAg
ICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxz
Y3JpcHQgc3JjPSIuLi9CdWlsZGJvdEJ1aWxkZXJRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAg
IDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdFRlc3RlclF1ZXVlVmlldy5qcyI+PC9zY3JpcHQ+Cisg
ICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90Q29tYmluZWRRdWV1ZVZpZXcuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdFBlcmZvcm1hbmNlUXVldWVWaWV3LmpzIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RMZWFrc1F1ZXVlVmlldy5qcyI+
PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1YmJsZVF1ZXVlVmlldy5qcyI+PC9zY3Jp
cHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1N0YXR1c0xpbmVWaWV3LmpzIj48L3NjcmlwdD4KKyAg
ICA8c2NyaXB0IHNyYz0iLi4vU2V0dGluZ3MuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3Jj
PSIuLi9UcmFjLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vLi4vRXh0ZXJuYWwv
cXVuaXQtMS4yMC4wLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iTW9ja092ZXJyaWRl
cy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ik1vY2tUcmFjLmpzIj48L3NjcmlwdD4K
KyAgICA8c2NyaXB0IHNyYz0iTW9ja0J1aWxkYm90UXVldWUuanMiPjwvc2NyaXB0PgorICAgIDxz
Y3JpcHQgc3JjPSJNb2NrQnVpbGRib3RRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3Jp
cHQgc3JjPSJ0ZXN0cy5qcyI+PC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxkaXYg
aWQ9InF1bml0Ij48L2Rpdj4KKyAgICA8ZGl2IGlkPSJxdW5pdC1maXh0dXJlIj48L2Rpdj4KKzwv
Ym9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9U
b29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRt
bC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBw
b3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRz
L3Rlc3RzL3Rlc3RzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRhMjA2OWM2YzZhNzY3NjFlZTU5ZTk2MzFjZDYw
YTRiZGYwNTdlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9i
dWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0
cy90ZXN0cy5qcwpAQCAtMCwwICsxLDIzIEBACit2YXIgc2V0dGluZ3MgPSBuZXcgU2V0dGluZ3M7
CitRVW5pdC50ZXN0KCJCdWlsZEJvdFF1ZXVlIFRlc3QiLCBmdW5jdGlvbiggYXNzZXJ0ICkKK3sK
KyAgICB0cmFjID0gbmV3IE1vY2tUcmFjKCk7CisgICAgYXNzZXJ0Lm9rKHRyYWMsICJ0cmFjIGlz
IG5vdCBudWxsIik7CisKKyAgICB2YXIgcXVldWUgPSBuZXcgTW9ja0J1aWxkYm90UXVldWUoKTsK
KyAgICBxdWV1ZS5icmFuY2hlcyA9IFt7CisgICAgICAgIG5hbWU6ICJ0cnVuayIsCisgICAgICAg
IHJlcG9zaXRvcnk6IHsKKyAgICAgICAgICAgIG5hbWU6ICJXZWJraXQgUmVwbyIsCisgICAgICAg
ICAgICB0cmFjOiB0cmFjCisgICAgICAgIH0KKyAgICB9XQorICAgIGFzc2VydC5vayhxdWV1ZSwg
InF1ZXVlIGlzIG5vdCBudWxsIik7CisKKyAgICB2YXIgdmlldyA9IG5ldyBNb2NrQnVpbGRib3RR
dWV1ZVZpZXcoW3F1ZXVlXSk7CisgICAgYXNzZXJ0Lm9rKHZpZXcsICJ2aWV3IGlzIG5vdCBudWxs
Iik7CisKKyAgICB2aWV3Ll9hcHBlbmRQZW5kaW5nUmV2aXNpb25Db3VudChxdWV1ZSk7CisgICAg
dmFyIHJldmlzaW9uc0JlaGluZCA9IHZpZXcuZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1l
KCJtZXNzYWdlIilbMF0uaW5uZXJIVE1MLm1hdGNoKC8uKihcZCspIHJldmlzaW9uKHxzKSBiZWhp
bmQvKVsxXTsKKyAgICBhc3NlcnQuZXF1YWwocmV2aXNpb25zQmVoaW5kLCAxLCAiYXNzZXJ0IHJl
dmlzaW9ucyBiZWhpbmQiKTsKK30pOwo=
</data>
<flag name="review"
          id="293374"
          type_id="1"
          status="-"
          setter="dbates"
    />
    <flag name="commit-queue"
          id="293375"
          type_id="3"
          status="-"
          setter="dbates"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268503</attachid>
            <date>2016-01-07 15:51:22 -0800</date>
            <delta_ts>2016-01-08 12:01:16 -0800</delta_ts>
            <desc>3. Refactor compareIterations to remove duplicate code.</desc>
            <filename>bug-152345-20160107155051.patch</filename>
            <type>text/plain</type>
            <size>4712</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0NzMwCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggM2U3NWZkYThkMzU3Zjk0MzI0MGFjZmY1OWI5NjBiMmQ0
MGZmMGE0Mi4uMDc5ZDRlMjAzNTFhNTg0OWFmZmUxYWNhNmQyYWE3NWMyMzkyN2I2OCAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1
IEBACisyMDE2LTAxLTA3ICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgorCisg
ICAgICAgIFJlZmFjdG9yIGNvbXBhcmVJdGVyYXRpb25zIHRvIHJlbW92ZSBkdXBsaWNhdGUgY29k
ZS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjM0
NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogQnVp
bGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJv
YXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZS5qczoKKyAgICAgICAgKEJ1aWxkYm90UXVldWUucHJv
dG90eXBlLmNvbXBhcmVJdGVyYXRpb25zKTogUmVmYWN0b3JlZCB0byByZW1vdmUgZHVwbGljYXRl
IGNvZGUuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanM6IEFkZGVkIHRl
c3RzIGluIG9yZGVyIHRvIGVuc3VyZQorICAgICAgICB0aGUgc2FtZSBiZWhhdmlvciBiZWZvcmUg
YW5kIGFmdGVyIHJlZmFjdG9yLgorCiAyMDE2LTAxLTA2ICBKYXNvbiBNYXJjZWxsICA8am1hcmNl
bGxAYXBwbGUuY29tPgogCiAgICAgICAgIEFkZGluZyBhIHVuaXQgdGVzdCB0byB0ZXN0IEJ1aWxk
Ym90UXVldWVWaWV3Ll9hcHBlbmRQZW5kaW5nUmV2aXNpb25Db3VudC4KZGlmZiAtLWdpdCBhL1Rv
b2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1s
L2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanMgYi9Ub29scy9CdWlsZFNsYXZlU3Vw
cG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0
cy9CdWlsZGJvdFF1ZXVlLmpzCmluZGV4IGU0YTk5NTExZjg5OTJiNzQ4ZWU4ODBmMzAwNTczNmQ4
NmQyYWRkYTguLjFkOGQxNmQ0YTkyNjcxMGViMjEzMDBmODE4OGEzN2U3NmE0YjRiYjcgMTAwNjQ0
Ci0tLSBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1
YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanMKKysrIGIvVG9vbHMv
QnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFz
aGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZS5qcwpAQCAtMjY4LDEzICsyNjgsOSBAQCBCdWls
ZGJvdFF1ZXVlLnByb3RvdHlwZSA9IHsKIAogICAgIGNvbXBhcmVJdGVyYXRpb25zOiBmdW5jdGlv
bihhLCBiKQogICAgIHsKLSAgICAgICAgdmFyIHNvcnRlZFJlcG9zaXRvcmllcyA9IERhc2hib2Fy
ZC5zb3J0ZWRSZXBvc2l0b3JpZXM7Ci0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc29ydGVk
UmVwb3NpdG9yaWVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICB2YXIgcmVwb3NpdG9yeU5h
bWUgPSBzb3J0ZWRSZXBvc2l0b3JpZXNbaV0ubmFtZTsKLSAgICAgICAgICAgIHZhciByZXN1bHQg
PSBiLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSAtIGEucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVd
OwotICAgICAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0
OwotICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IHRoaXMuY29tcGFyZUl0ZXJhdGlvbnNCeVJl
dmlzaW9ucyhhLCBiKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiBy
ZXN1bHQ7CiAKICAgICAgICAgLy8gQSBsb2FkZWQgaXRlcmF0aW9uIG1heSBub3QgaGF2ZSByZXZp
c2lvbiBudW1iZXJzIGlmIGl0IGZhaWxlZCBlYXJseSwgYmVmb3JlIHN2biBzdGVwcyBmaW5pc2hl
ZC4KICAgICAgICAgcmVzdWx0ID0gYi5sb2FkZWQgLSBhLmxvYWRlZDsKZGlmZiAtLWdpdCBhL1Rv
b2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1s
L2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBv
cnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMv
dGVzdHMvdGVzdHMuanMKaW5kZXggZGEyMDY5YzZjNmE3Njc2MWVlNTllOTYzMWNkNjBhNGJkZjA1
N2U2ZS4uZjc4MjE5YzJiMmU3NTA1NjQ4ODVjYzY0Nzg0MWEwYWNlZjA1NDRhZCAxMDA2NDQKLS0t
IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGlj
X2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanMKKysrIGIvVG9vbHMvQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L1NjcmlwdHMvdGVzdHMvdGVzdHMuanMKQEAgLTIxLDMgKzIxLDM1IEBAIFFVbml0LnRlc3QoIkJ1
aWxkQm90UXVldWUgVGVzdCIsIGZ1bmN0aW9uKCBhc3NlcnQgKQogICAgIHZhciByZXZpc2lvbnNC
ZWhpbmQgPSB2aWV3LmVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVzc2FnZSIpWzBd
LmlubmVySFRNTC5tYXRjaCgvLiooXGQrKSByZXZpc2lvbih8cykgYmVoaW5kLylbMV07CiAgICAg
YXNzZXJ0LmVxdWFsKHJldmlzaW9uc0JlaGluZCwgMSwgImFzc2VydCByZXZpc2lvbnMgYmVoaW5k
Iik7CiB9KTsKKworUVVuaXQudGVzdCgiQnVpbGRCb3RJdGVyYXRpb24gY29tcGFyZUl0ZXJhdGlv
bnMgVGVzdCIsIGZ1bmN0aW9uKCBhc3NlcnQgKQoreworICAgIHZhciBxdWV1ZSA9IG5ldyBNb2Nr
QnVpbGRib3RRdWV1ZSgpOworICAgIHF1ZXVlLmJyYW5jaGVzID0gW3sKKyAgICAgICAgbmFtZTog
InRydW5rIiwKKyAgICAgICAgcmVwb3NpdG9yeTogeworICAgICAgICAgICAgbmFtZTogIm9wZW5T
b3VyY2UiLAorICAgICAgICB9CisgICAgfV0KKyAgICBhc3NlcnQub2socXVldWUsICJxdWV1ZSBp
cyBub3QgbnVsbCIpOworCisgICAgdmFyIGl0ZXJhdGlvbjEgPSBuZXcgQnVpbGRib3RJdGVyYXRp
b24ocXVldWUsIDQyLCBmYWxzZSk7CisgICAgdmFyIGl0ZXJhdGlvbjIgPSBuZXcgQnVpbGRib3RJ
dGVyYXRpb24ocXVldWUsIDQzLCBmYWxzZSk7CisgICAgYXNzZXJ0Lm9rKHF1ZXVlLmNvbXBhcmVJ
dGVyYXRpb25zKGl0ZXJhdGlvbjIsIGl0ZXJhdGlvbjEpIDwgMCwgImNvbXBhcmVJdGVyYXRpb25z
OiBsZXNzIHRoYW4iKTsKKyAgICBhc3NlcnQub2socXVldWUuY29tcGFyZUl0ZXJhdGlvbnMoaXRl
cmF0aW9uMSwgaXRlcmF0aW9uMikgPiAwLCAiY29tcGFyZUl0ZXJhdGlvbnM6IGdyZWF0ZXIgdGhh
biIpOworICAgIGFzc2VydC5vayhxdWV1ZS5jb21wYXJlSXRlcmF0aW9ucyhpdGVyYXRpb24yLCBp
dGVyYXRpb24yKSA9PT0gMCwgImNvbXBhcmVJdGVyYXRpb25zOiBlcXVhbCIpOworCisgICAgaXRl
cmF0aW9uMS5sb2FkZWQgPSBmYWxzZTsgaXRlcmF0aW9uMi5sb2FkZWQgPSB0cnVlOworICAgIGFz
c2VydC5vayhxdWV1ZS5jb21wYXJlSXRlcmF0aW9ucyhpdGVyYXRpb24xLCBpdGVyYXRpb24yKSA+
IDAsICJjb21wYXJlSXRlcmF0aW9uczogZ3JlYXRlciB0aGFuIik7CisgICAgYXNzZXJ0Lm9rKHF1
ZXVlLmNvbXBhcmVJdGVyYXRpb25zKGl0ZXJhdGlvbjIsIGl0ZXJhdGlvbjEpIDwgMCwgImNvbXBh
cmVJdGVyYXRpb25zOiBsZXNzIHRoYW4iKTsKKworICAgIGl0ZXJhdGlvbjEucmV2aXNpb24gPSB7
ICJvcGVuU291cmNlIjogNDIgfTsKKyAgICBpdGVyYXRpb24yLnJldmlzaW9uID0geyAib3BlblNv
dXJjZSI6IDQzIH07CisgICAgYXNzZXJ0Lm9rKHF1ZXVlLmNvbXBhcmVJdGVyYXRpb25zKGl0ZXJh
dGlvbjIsIGl0ZXJhdGlvbjEpIDwgMCwgImNvbXBhcmVJdGVyYXRpb25zOiBsZXNzIHRoYW4iKTsK
KyAgICBhc3NlcnQub2socXVldWUuY29tcGFyZUl0ZXJhdGlvbnMoaXRlcmF0aW9uMSwgaXRlcmF0
aW9uMikgPiAwLCAiY29tcGFyZUl0ZXJhdGlvbnM6IGdyZWF0ZXIgdGhhbiIpOworICAgIGFzc2Vy
dC5vayhxdWV1ZS5jb21wYXJlSXRlcmF0aW9ucyhpdGVyYXRpb24yLCBpdGVyYXRpb24yKSA9PT0g
MCwgImNvbXBhcmVJdGVyYXRpb25zOiBlcXVhbCIpOworCisgICAgYXNzZXJ0Lm9rKHF1ZXVlLmNv
bXBhcmVJdGVyYXRpb25zQnlSZXZpc2lvbnMoaXRlcmF0aW9uMiwgaXRlcmF0aW9uMSkgPCAwLCAi
Y29tcGFyZUl0ZXJhdGlvbnNCeVJldmlzaW9uczogbGVzcyB0aGFuIik7CisgICAgYXNzZXJ0Lm9r
KHF1ZXVlLmNvbXBhcmVJdGVyYXRpb25zQnlSZXZpc2lvbnMoaXRlcmF0aW9uMSwgaXRlcmF0aW9u
MikgPiAwLCAiY29tcGFyZUl0ZXJhdGlvbnNCeVJldmlzaW9uczogZ3JlYXRlciB0aGFuIik7Cisg
ICAgYXNzZXJ0Lm9rKHF1ZXVlLmNvbXBhcmVJdGVyYXRpb25zQnlSZXZpc2lvbnMoaXRlcmF0aW9u
MiwgaXRlcmF0aW9uMikgPT09IDAsICJjb21wYXJlSXRlcmF0aW9uc0J5UmV2aXNpb25zOiBlcXVh
bCIpOworfSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=
</data>
<flag name="commit-queue"
          id="293473"
          type_id="3"
          status="-"
          setter="dbates"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>270457</attachid>
            <date>2016-02-01 17:28:36 -0800</date>
            <delta_ts>2016-02-03 18:08:48 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152345-20160201172812.patch</filename>
            <type>text/plain</type>
            <size>14289</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk1OTkzCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggODZhNmFlMzBhMTdmNDdmZGFhZWEzNzk2ZDU5ZDdkM2Nl
NzBlMGFhNy4uZGVkMjBiYzdhYzUyNGM3MmNlNDljMWI0YTZkZWQ3ODk5N2E1NjQyMyAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDMz
IEBACiAyMDE2LTAyLTAxICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgogCisg
ICAgICAgIFRlYWNoIGRhc2hib2FyZCBjb2RlIHRvIGNvbXBhcmUgbm9uLWludGVnZXIgcmV2aXNp
b25zCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTIz
NDUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIEJ1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanM6CisgICAgICAgIChCdWlsZGJvdFF1ZXVlLnBy
b3RvdHlwZS5jb21wYXJlSXRlcmF0aW9uc0J5UmV2aXNpb25zKTogQ29tcGFyZSBub24taW50ZWdl
ciByZXZpc2lvbnMuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcu
anM6CisgICAgICAgIChCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUuX2FwcGVuZFBlbmRpbmdS
ZXZpc2lvbkNvdW50KTogVXNlIFRyYWMuaW5kZXhPZlJldmlzaW9uIGluIG9yZGVyIHRvIGNvbXBh
cmUgbm9uLWludGVnZXIKKyAgICAgICAgcmV2aXNpb25zLiBBbHNvIHVzZXMgbmV3IFRyYWMuY29t
bWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24gbWV0aG9kLgorICAgICAgICAoQnVpbGRib3RR
dWV1ZVZpZXcucHJvdG90eXBlLl9wb3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSk6IERpdHRvLgor
ICAgICAgICAoQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLl9wcmVzZW50UG9wb3ZlckZvclBl
bmRpbmdDb21taXRzKTogVXNlIFRyYWMuaW5kZXhPZlJldmlzaW9uIGluIG9yZGVyIHRvIGNvbXBh
cmUgbm9uLWludGVnZXIKKyAgICAgICAgcmV2aXNpb25zLiBBbHNvIHVzZXMgbmV3IFRyYWMubmV4
dFJldmlzaW9uIG1ldGhvZCB0byBjYWxjdWxhdGUgYSByZXZpc2lvbiByYW5nZS4KKyAgICAgICAg
KEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZS5fcmV2aXNpb25Db250ZW50V2l0aFBvcG92ZXJG
b3JJdGVyYXRpb24pOiBEaXR0by4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzOgor
ICAgICAgICAoVHJhYy5wcm90b3R5cGUuX2NvbW1pdHNPbkJyYW5jaCk6IFJlbmFtZWQgdGhpcyB0
byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZCBiZSBhIHByaXZhdGUgbWV0aG9kIHVzZWQgYnkgdGhl
IGxhdHRlciB0d28gbmV3CisgICAgICAgIG1ldGhvZHMuCisgICAgICAgIChUcmFjLnByb3RvdHlw
ZS5jb21taXRzT25CcmFuY2hMYXRlclRoYW5SZXZpc2lvbik6IEZpbmRzIHJldmlzaW9ucyBvbiBh
IGJyYW5jaCBncmVhdCBsYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgcmV2aXNpb24uCisgICAgICAg
IChUcmFjLnByb3RvdHlwZS5jb21taXRzT25CcmFuY2hJblJldmlzaW9uUmFuZ2UpOiBGaW5kcyBy
ZXZpc2lvbnMgb24gYSBicmFuY2ggd2l0aGluIGEgc3BlY2lmaWVkIHJhbmdlLgorICAgICAgICAo
VHJhYy5wcm90b3R5cGUubmV4dFJldmlzaW9uKTogRmluZHMgdGhlIG5leHQgcmV2aXNpb24gYWZ0
ZXIgYSBnaXZlbiByZXZpc2lvbiBvbiBhIHNwZWNpZmljIGJyYW5jaC4KKyAgICAgICAgKFRyYWMu
cHJvdG90eXBlLmluZGV4T2ZSZXZpc2lvbik6IEZpbmRzIHRoZSBpbmRleCBvZiBhIGdpdmVuIHJl
dmlzaW9uIHdpdGhpbiB0aGUgcmVjb3JkZWRDb21taXRzIGFycmF5LgorICAgICAgICAoVHJhYy5w
cm90b3R5cGUuY29tbWl0c09uQnJhbmNoKTogRGVsZXRlZC4gUmVuYW1lZCB0byBfY29tbWl0c09u
QnJhbmNoLgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29u
ZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1V0aWxpdGllcy5qczoKKyAgICAgICAg
KEFycmF5LnByb3RvdHlwZS5pbmRleE9mT2JqZWN0UGFzc2luZ1Rlc3QpOiBGaW5kcyBhbiBlbGVt
ZW50IG9mIGFuIGFycmF5IGZvciB3aGljaCB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24geWllbGRz
IHRydWUuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanM6IEFkZGVkIHVu
aXQgdGVzdHMuCisKKzIwMTYtMDItMDEgIEphc29uIE1hcmNlbGwgIDxqbWFyY2VsbEBhcHBsZS5j
b20+CisKICAgICAgICAgQWRkIGNvZGUgdG8gcGFyc2UgdGhlIGdpdCBicmFuY2hlcyBvdXQgb2Yg
dGhlIFRyYWMgUlNTIGZlZWQKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTE1MzYyNAogCmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9i
dWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWls
ZGJvdFF1ZXVlLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1j
b25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZS5qcwppbmRl
eCA3NzE5OGQwYmRlNjM3ZmRhZjdlYWY2ODViZTA4MzI2NzQwMmJlNmRlLi40ZjljOTIyM2U1ZGM1
NTMxOGUxM2Q1M2VjZjc1NGYxODFhZWY1YmFiIDEwMDY0NAotLS0gYS9Ub29scy9CdWlsZFNsYXZl
U3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2Ny
aXB0cy9CdWlsZGJvdFF1ZXVlLmpzCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxk
LndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90
UXVldWUuanMKQEAgLTI4NSw5ICsyODUsMTUgQEAgQnVpbGRib3RRdWV1ZS5wcm90b3R5cGUgPSB7
CiAgICAgICAgIHZhciBzb3J0ZWRSZXBvc2l0b3JpZXMgPSBEYXNoYm9hcmQuc29ydGVkUmVwb3Np
dG9yaWVzOwogICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvcnRlZFJlcG9zaXRvcmllcy5s
ZW5ndGg7ICsraSkgewogICAgICAgICAgICAgdmFyIHJlcG9zaXRvcnlOYW1lID0gc29ydGVkUmVw
b3NpdG9yaWVzW2ldLm5hbWU7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYi5yZXZpc2lvblty
ZXBvc2l0b3J5TmFtZV0gLSBhLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXTsKLSAgICAgICAgICAg
IGlmIChyZXN1bHQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAg
IHZhciB0cmFjID0gc29ydGVkUmVwb3NpdG9yaWVzW2ldLnRyYWM7CisgICAgICAgICAgICBjb25z
b2xlLmFzc2VydCh0cmFjKTsKKyAgICAgICAgICAgIGluZGV4QSA9IHRyYWMuaW5kZXhPZlJldmlz
aW9uKGEucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdKTsKKyAgICAgICAgICAgIGluZGV4QiA9IHRy
YWMuaW5kZXhPZlJldmlzaW9uKGIucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdKTsKKyAgICAgICAg
ICAgIGlmIChpbmRleEEgPiAtMSAmJiBpbmRleEIgPiAtMSkgeworICAgICAgICAgICAgICAgIHZh
ciByZXN1bHQgPSBpbmRleEIgLSBpbmRleEE7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KICAgICAg
ICAgfQogCiAgICAgICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1
cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Njcmlw
dHMvQnVpbGRib3RRdWV1ZVZpZXcuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1
ZXVlVmlldy5qcwppbmRleCAwMTA5ODQ0YmExMjhmNzVkNjViYzE1YTUyMTI5MWY3NTc0YTU2NzY1
Li5jMWY1M2YyYjNmOTU3ODEwZWNmNDUyYWRkZGIwZTcyM2QwNzJkNDRiIDEwMDY0NAotLS0gYS9U
b29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRt
bC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1ZXVlVmlldy5qcworKysgYi9Ub29scy9CdWls
ZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9h
cmQvU2NyaXB0cy9CdWlsZGJvdFF1ZXVlVmlldy5qcwpAQCAtOTQsMTIgKzk0LDEyIEBAIEJ1aWxk
Ym90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAg
ICAgICAgICAgIGlmICghdHJhYykKICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgIGlmICghdHJhYy5sYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVyIHx8IHRyYWMub2xkZXN0
UmVjb3JkZWRSZXZpc2lvbk51bWJlciA+IGxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlcikg
eworICAgICAgICAgICAgaWYgKCF0cmFjLmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIgfHwg
dHJhYy5pbmRleE9mUmV2aXNpb24odHJhYy5vbGRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVyKSA+
IHRyYWMuaW5kZXhPZlJldmlzaW9uKGxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlcikpIHsK
ICAgICAgICAgICAgICAgICB0cmFjLmxvYWRNb3JlSGlzdG9yaWNhbERhdGEoKTsKICAgICAgICAg
ICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHRvdGFsUmV2aXNp
b25zQmVoaW5kICs9IHRyYWMuY29tbWl0c09uQnJhbmNoKGJyYW5jaC5uYW1lLCBmdW5jdGlvbihj
b21taXQpIHsgcmV0dXJuIGNvbW1pdC5yZXZpc2lvbk51bWJlciA+IGxhdGVzdFByb2R1Y3RpdmVS
ZXZpc2lvbk51bWJlcjsgfSkubGVuZ3RoOworICAgICAgICAgICAgdG90YWxSZXZpc2lvbnNCZWhp
bmQgKz0gdHJhYy5jb21taXRzT25CcmFuY2hMYXRlclRoYW5SZXZpc2lvbihicmFuY2gubmFtZSwg
bGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyKS5sZW5ndGg7CiAgICAgICAgIH0KIAogICAg
ICAgICBpZiAoIXRvdGFsUmV2aXNpb25zQmVoaW5kKQpAQCAtMTQwLDExICsxNDAsMTEgQEAgQnVp
bGRib3RRdWV1ZVZpZXcucHJvdG90eXBlID0gewogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsK
ICAgICAgICAgfQogCi0gICAgICAgIGNvbnNvbGUuYXNzZXJ0KHRyYWMub2xkZXN0UmVjb3JkZWRS
ZXZpc2lvbk51bWJlciA8PSBmaXJzdFJldmlzaW9uTnVtYmVyKTsKKyAgICAgICAgY29uc29sZS5h
c3NlcnQodHJhYy5pbmRleE9mUmV2aXNpb24odHJhYy5vbGRlc3RSZWNvcmRlZFJldmlzaW9uTnVt
YmVyKSA8PSB0cmFjLmluZGV4T2ZSZXZpc2lvbihmaXJzdFJldmlzaW9uTnVtYmVyKSk7CiAKICAg
ICAgICAgLy8gRklYTUU6IFRvIGJlIDEwMCUgY29ycmVjdCwgd2Ugc2hvdWxkIGFsc28gZmlsdGVy
IG91dCBjaGFuZ2VzIHRoYXQgYXJlIGlnbm9yZWQgYnkKICAgICAgICAgLy8gdGhlIHF1ZXVlLCBz
ZWUgX3Nob3VsZF9maWxlX3RyaWdnZXJfYnVpbGQgaW4gd2tidWlsZC5weS4KLSAgICAgICAgdmFy
IGNvbW1pdHMgPSB0cmFjLmNvbW1pdHNPbkJyYW5jaChicmFuY2gubmFtZSwgZnVuY3Rpb24oY29t
bWl0KSB7IHJldHVybiBjb21taXQucmV2aXNpb25OdW1iZXIgPj0gZmlyc3RSZXZpc2lvbk51bWJl
ciAmJiBjb21taXQucmV2aXNpb25OdW1iZXIgPD0gbGFzdFJldmlzaW9uTnVtYmVyOyB9KTsKKyAg
ICAgICAgdmFyIGNvbW1pdHMgPSB0cmFjLmNvbW1pdHNPbkJyYW5jaEluUmV2aXNpb25SYW5nZShi
cmFuY2gubmFtZSwgZmlyc3RSZXZpc2lvbk51bWJlciwgbGFzdFJldmlzaW9uTnVtYmVyKTsKICAg
ICAgICAgcmV0dXJuIGNvbW1pdHMubWFwKGZ1bmN0aW9uKGNvbW1pdCkgewogICAgICAgICAgICAg
cmV0dXJuIGxpbmVGb3JDb21taXQodHJhYywgY29tbWl0KTsKICAgICAgICAgfSwgdGhpcykucmV2
ZXJzZSgpOwpAQCAtMTY5LDcgKzE2OSw3IEBAIEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9
IHsKICAgICAgICAgICAgIHZhciBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIgPSBsYXRl
c3RQcm9kdWN0aXZlSXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXTsKICAgICAgICAg
ICAgIGlmICghbGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyIHx8ICF0cmFjLmxhdGVzdFJl
Y29yZGVkUmV2aXNpb25OdW1iZXIpCiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
ICAgICB2YXIgbGluZXMgPSB0aGlzLl9wb3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSh0cmFjLCBi
cmFuY2gsIGxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlciArIDEsIHRyYWMubGF0ZXN0UmVj
b3JkZWRSZXZpc2lvbk51bWJlcik7CisgICAgICAgICAgICB2YXIgbGluZXMgPSB0aGlzLl9wb3Bv
dmVyTGluZXNGb3JDb21taXRSYW5nZSh0cmFjLCBicmFuY2gsIHRyYWMubmV4dFJldmlzaW9uKGJy
YW5jaC5uYW1lLCBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIpLCB0cmFjLmxhdGVzdFJl
Y29yZGVkUmV2aXNpb25OdW1iZXIpOwogICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGxpbmVzLmxl
bmd0aDsKICAgICAgICAgICAgIGlmIChsZW5ndGggJiYgc2hvdWxkQWRkRGl2aWRlcikKICAgICAg
ICAgICAgICAgICB0aGlzLl9hZGREaXZpZGVyVG9Qb3BvdmVyKGNvbnRlbnQpOwpAQCAtMjIwLDYg
KzIyMCw3IEBAIEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsKICAgICAgICAgdmFyIHJl
cG9zaXRvcnkgPSBicmFuY2gucmVwb3NpdG9yeTsKICAgICAgICAgdmFyIHJlcG9zaXRvcnlOYW1l
ID0gcmVwb3NpdG9yeS5uYW1lOwogICAgICAgICBjb25zb2xlLmFzc2VydChpdGVyYXRpb24ucmV2
aXNpb25bcmVwb3NpdG9yeU5hbWVdKTsKKyAgICAgICAgdmFyIHRyYWMgPSByZXBvc2l0b3J5LnRy
YWM7CiAgICAgICAgIHZhciBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIp
OwogICAgICAgICB2YXIgcmV2aXNpb24gPSBpdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9yeU5h
bWVdOwogICAgICAgICBpZiAocmVwb3NpdG9yeS5pc1NWTikKQEAgLTIzMSwxMiArMjMyLDEyIEBA
IEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgIGNvbnNvbGUuYXNz
ZXJ0KGZhbHNlLCAiU2hvdWxkIG5vdCBnZXQgaGVyZTsgIiArIHJlcG9zaXRvcnkubmFtZSArICIg
ZGlkIG5vdCBzcGVjaWZ5IGEga25vd24gVkNTIHR5cGUuIik7CiAgICAgICAgIGNvbnRlbnQuY2xh
c3NMaXN0LmFkZCgicmV2aXNpb24tbnVtYmVyIik7CiAKLSAgICAgICAgaWYgKHByZXZpb3VzSXRl
cmF0aW9uKSB7CisgICAgICAgIGlmIChwcmV2aW91c0l0ZXJhdGlvbiAmJiB0cmFjLmluZGV4T2ZS
ZXZpc2lvbihwcmV2aW91c0l0ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0pID4gLTEg
JiYgdHJhYy5pbmRleE9mUmV2aXNpb24oaXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1l
XSkgPiAtMSkgewogICAgICAgICAgICAgY29uc29sZS5hc3NlcnQocHJldmlvdXNJdGVyYXRpb24u
cmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdKTsKICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gewog
ICAgICAgICAgICAgICAgIHRyYWM6IHJlcG9zaXRvcnkudHJhYywKICAgICAgICAgICAgICAgICBi
cmFuY2g6IGJyYW5jaCwKLSAgICAgICAgICAgICAgICBmaXJzdFJldmlzaW9uOiBwcmV2aW91c0l0
ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0gKyAxLAorICAgICAgICAgICAgICAgIGZp
cnN0UmV2aXNpb246IHRyYWMubmV4dFJldmlzaW9uKGJyYW5jaC5uYW1lLCBwcmV2aW91c0l0ZXJh
dGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0pLAogICAgICAgICAgICAgICAgIGxhc3RSZXZp
c2lvbjogaXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXQogICAgICAgICAgICAgfTsK
ICAgICAgICAgICAgIGlmIChjb250ZXh0LmZpcnN0UmV2aXNpb24gPD0gY29udGV4dC5sYXN0UmV2
aXNpb24pCmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQu
b3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzIGIvVG9vbHMv
QnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFz
aGJvYXJkL1NjcmlwdHMvVHJhYy5qcwppbmRleCBhNDg4ZDFjMTZjN2JmYTAyZjI0ZGJjOGY1NTEz
MjUyN2Q0ZjVlMmE4Li5kZDIzM2JhYTk1YmM4ODUxYjI4YzU5MWNiOTU5YzFlMjU1OGFiNTYyIDEw
MDY0NAotLS0gYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZp
Zy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzCisrKyBiL1Rvb2xzL0J1aWxk
U2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2Fy
ZC9TY3JpcHRzL1RyYWMuanMKQEAgLTYzLDEzICs2MywzNiBAQCBUcmFjLnByb3RvdHlwZSA9IHsK
ICAgICAgICAgcmV0dXJuIHRoaXMucmVjb3JkZWRDb21taXRzW3RoaXMucmVjb3JkZWRDb21taXRz
Lmxlbmd0aCAtIDFdLnJldmlzaW9uTnVtYmVyOwogICAgIH0sCiAKLSAgICBjb21taXRzT25CcmFu
Y2g6IGZ1bmN0aW9uKGJyYW5jaE5hbWUsIGZpbHRlcikKKyAgICBfY29tbWl0c09uQnJhbmNoOiBm
dW5jdGlvbihicmFuY2hOYW1lLCBmaWx0ZXIpCiAgICAgeworICAgICAgICBpZiAoIWZpbHRlcikK
KyAgICAgICAgICAgIGZpbHRlciA9IGZ1bmN0aW9uKGNvbW1pdCkgeyByZXR1cm4gdHJ1ZTsgfTsK
ICAgICAgICAgcmV0dXJuIHRoaXMucmVjb3JkZWRDb21taXRzLmZpbHRlcihmdW5jdGlvbihjb21t
aXQsIGluZGV4LCBhcnJheSkgewogICAgICAgICAgICAgcmV0dXJuICghY29tbWl0LmNvbnRhaW5z
QnJhbmNoTG9jYXRpb24gfHwgY29tbWl0LmJyYW5jaGVzLmluY2x1ZGVzKGJyYW5jaE5hbWUpKSAm
JiBmaWx0ZXIoY29tbWl0LCBpbmRleCwgYXJyYXkpOwogICAgICAgICB9KTsKICAgICB9LAogCisg
ICAgY29tbWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb246IGZ1bmN0aW9uKGJyYW5jaE5hbWUs
IHJldmlzaW9uKQorICAgIHsKKyAgICAgICAgdmFyIGluZGV4VG9CZUxhdGVyVGhhbiA9IHRoaXMu
aW5kZXhPZlJldmlzaW9uKHJldmlzaW9uKTsKKyAgICAgICAgZnVuY3Rpb24gc2VsZWN0Q29tbWl0
c0xhdGVyVGhhblJldmlzaW9uKGNvbW1pdCwgaW5kZXgsIGFsbENvbW1pdHMpIHsKKyAgICAgICAg
ICAgIHJldHVybiBpbmRleCA+IGluZGV4VG9CZUxhdGVyVGhhbjsKKyAgICAgICAgfQorICAgICAg
ICB2YXIgY29tbWl0cyA9IHRoaXMuX2NvbW1pdHNPbkJyYW5jaChicmFuY2hOYW1lLCBzZWxlY3RD
b21taXRzTGF0ZXJUaGFuUmV2aXNpb24uYmluZCh0aGlzKSk7CisgICAgICAgIHJldHVybiBjb21t
aXRzOworICAgIH0sCisKKyAgICBjb21taXRzT25CcmFuY2hJblJldmlzaW9uUmFuZ2U6IGZ1bmN0
aW9uKGJyYW5jaE5hbWUsIGZpcnN0UmV2aXNpb24sIGxhc3RSZXZpc2lvbikKKyAgICB7CisgICAg
ICAgIHZhciBpbmRleE9mRmlyc3RSZXZpc2lvbiA9IHRoaXMuaW5kZXhPZlJldmlzaW9uKGZpcnN0
UmV2aXNpb24pOworICAgICAgICB2YXIgaW5kZXhPZkxhc3RSZXZpc2lvbiA9IHRoaXMuaW5kZXhP
ZlJldmlzaW9uKGxhc3RSZXZpc2lvbik7CisgICAgICAgIGZ1bmN0aW9uIHNlbGVjdENvbW1pdHNJ
blJhbmdlKGNvbW1pdCwgaW5kZXgsIGFsbENvbW1pdHMpIHsKKyAgICAgICAgICAgIHJldHVybiBp
bmRleCA+PSBpbmRleE9mRmlyc3RSZXZpc2lvbiAmJiBpbmRleCA8PSBpbmRleE9mTGFzdFJldmlz
aW9uOworICAgICAgICB9CisgICAgICAgIHZhciBjb21taXRzID0gdGhpcy5fY29tbWl0c09uQnJh
bmNoKGJyYW5jaE5hbWUsIHNlbGVjdENvbW1pdHNJblJhbmdlLmJpbmQodGhpcykpOworICAgICAg
ICByZXR1cm4gY29tbWl0czsKKyAgICB9LAorCiAgICAgcmV2aXNpb25VUkw6IGZ1bmN0aW9uKHJl
dmlzaW9uKQogICAgIHsKICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVVSTCArICJjaGFuZ2VzZXQv
IiArIGVuY29kZVVSSUNvbXBvbmVudChyZXZpc2lvbik7CkBAIC0yNjYsNCArMjg5LDE3IEBAIFRy
YWMucHJvdG90eXBlID0gewogICAgICAgICAgICAgdGhpcy5fbG9hZGVkKGRhdGFEb2N1bWVudCk7
CiAgICAgICAgIH0uYmluZCh0aGlzKSwgdGhpcy5fbmVlZHNBdXRoZW50aWNhdGlvbiA/IHsgd2l0
aENyZWRlbnRpYWxzOiB0cnVlIH0gOiB7fSk7CiAgICAgfSwKKworICAgIG5leHRSZXZpc2lvbjog
ZnVuY3Rpb24oYnJhbmNoTmFtZSwgcmV2aXNpb24pIHsKKyAgICAgICAgdmFyIGNvbW1pdHMgPSB0
aGlzLmNvbW1pdHNPbkJyYW5jaExhdGVyVGhhblJldmlzaW9uKGJyYW5jaE5hbWUsIHJldmlzaW9u
KTsKKyAgICAgICAgaWYgKGNvbW1pdHMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHJldHVybiBj
b21taXRzWzBdLnJldmlzaW9uTnVtYmVyOworICAgICAgICByZXR1cm4gcmV2aXNpb247CisgICAg
fSwKKworICAgIGluZGV4T2ZSZXZpc2lvbjogZnVuY3Rpb24ocmV2aXNpb24pIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMucmVjb3JkZWRDb21taXRzLmluZGV4T2ZPYmplY3RQYXNzaW5nVGVzdChmdW5j
dGlvbihjb21taXQpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21taXQucmV2aXNpb25OdW1iZXIg
PT09IHJldmlzaW9uOworICAgICAgICB9KTsKKyAgICB9LAogfTsKZGlmZiAtLWdpdCBhL1Rvb2xz
L0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rh
c2hib2FyZC9TY3JpcHRzL1V0aWxpdGllcy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1
aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1V0aWxp
dGllcy5qcwppbmRleCAyZDcwMjUwMWU3MWZhNmU5Y2VmM2Q2MjEyMzBiOTllOWYxMmQxMGRmLi4w
ZjZhYmU4MjJmZGRhNjM0NmJkMzMyYzVlMGQ4ZjQwOWMyMTRmMTMxIDEwMDY0NAotLS0gYS9Ub29s
cy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9k
YXNoYm9hcmQvU2NyaXB0cy9VdGlsaXRpZXMuanMKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBv
cnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMv
VXRpbGl0aWVzLmpzCkBAIC0xNjYsNiArMTY2LDE2IEBAIEFycmF5LnByb3RvdHlwZS5maW5kRmly
c3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpCiAgICAgcmV0dXJuIG51bGw7CiB9OwogCitBcnJheS5w
cm90b3R5cGUuaW5kZXhPZk9iamVjdFBhc3NpbmdUZXN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKQor
eworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkgeworICAgICAgICBp
ZiAocHJlZGljYXRlKHRoaXNbaV0pKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisg
ICAgcmV0dXJuIC0xOworfTsKKwogQXJyYXkucHJvdG90eXBlLmF2ZXJhZ2UgPSBmdW5jdGlvbigp
CiB7CiAgICAgdmFyIHN1bSA9IDA7CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9y
dC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90
ZXN0cy90ZXN0cy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzCmluZGV4
IDhmZWUyNzBiMTE4OTI1NjQ0Nzc2N2U5ZjliMGFmOWUxZGUyMGYyZmEuLmU0Y2UyNzFmMWU5Y2Qy
ZDU5NTk3ZmVkZTAyMzFmNzJiZjNmZjAxZmMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0J1aWxkU2xhdmVT
dXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3Jp
cHRzL3Rlc3RzL3Rlc3RzLmpzCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndl
YmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3Rz
LmpzCkBAIC03Miw2ICs3MiwzMyBAQCB0ZXN0KCJfcGFyc2VSZXZpc2lvbkZyb21VUkwiLCBmdW5j
dGlvbigpCiAgICAgc3RyaWN0RXF1YWwodGhpcy50cmFjLl9wYXJzZVJldmlzaW9uRnJvbVVSTCgi
aHR0cHM6Ly9naXQuZm9vYmFyLmNvbS90cmFjL1doYXRldmVyLmdpdC9jaGFuZ2VzZXQvMGU0OThk
YjVkOGU1YjVhMzQyNjMxIiksICIwZTQ5OGRiNWQ4ZTViNWEzNDI2MzEiLCAiR2l0Iik7CiB9KTsK
IAordGVzdCgibmV4dFJldmlzaW9uIiwgZnVuY3Rpb24oKQoreworICAgIHRoaXMudHJhYy5yZWNv
cmRlZENvbW1pdHMgPSBNb2NrVHJhYy5FWEFNUExFX1RSQUNfQ09NTUlUUzsKKyAgICBzdHJpY3RF
cXVhbCh0aGlzLnRyYWMubmV4dFJldmlzaW9uKCJ0cnVuayIsIDMzMDIwKSwgMzMwMjIsICJuZXh0
UmV2aXNpb24gc2FtZSBicmFuY2giKTsKKyAgICBzdHJpY3RFcXVhbCh0aGlzLnRyYWMubmV4dFJl
dmlzaW9uKCJ0cnVuayIsIDMzMDE5KSwgMzMwMjAsICJuZXh0UmV2aXNpb24gZGlmZmVyZW50IGJy
YW5jaCIpOworfSk7CisKK3Rlc3QoImluZGV4T2ZSZXZpc2lvbiIsIGZ1bmN0aW9uKCkKK3sKKyAg
ICB0aGlzLnRyYWMucmVjb3JkZWRDb21taXRzID0gTW9ja1RyYWMuRVhBTVBMRV9UUkFDX0NPTU1J
VFM7CisgICAgc3RyaWN0RXF1YWwodGhpcy50cmFjLmluZGV4T2ZSZXZpc2lvbigzMzAyMCksIDIs
ICJpbmRleE9mUmV2aXNpb24iKTsKK30pOworCit0ZXN0KCJjb21taXRzT25CcmFuY2hMYXRlclRo
YW5SZXZpc2lvbiIsIGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLnRyYWMucmVjb3JkZWRDb21taXRz
ID0gTW9ja1RyYWMuRVhBTVBMRV9UUkFDX0NPTU1JVFM7CisgICAgdmFyIGNvbW1pdHMgPSB0aGlz
LnRyYWMuY29tbWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24oInRydW5rIiwgMzMwMjApOwor
ICAgIGVxdWFsKGNvbW1pdHMubGVuZ3RoLCAxLCAiZ3JlYXRlciB0aGFuIDMzMDIwIik7Cit9KTsK
KwordGVzdCgiY29tbWl0c09uQnJhbmNoSW5SZXZpc2lvblJhbmdlIiwgZnVuY3Rpb24oKQorewor
ICAgIHRoaXMudHJhYy5yZWNvcmRlZENvbW1pdHMgPSBNb2NrVHJhYy5FWEFNUExFX1RSQUNfQ09N
TUlUUzsKKyAgICB2YXIgY29tbWl0cyA9IHRoaXMudHJhYy5jb21taXRzT25CcmFuY2hJblJldmlz
aW9uUmFuZ2UoInRydW5rIiwgMzMwMjAsIDMzMDIyKTsKKyAgICBlcXVhbChjb21taXRzLmxlbmd0
aCwgMiwgImluIHJhbmdlIDMzMDIwLCAzMzAyMiIpOworfSk7CisKIG1vZHVsZSgiQnVpbGRCb3RR
dWV1ZVZpZXciLCB7CiAgICAgc2V0dXA6IGZ1bmN0aW9uKCkgewogICAgICAgICB0aGlzLnRyYWMg
PSBuZXcgTW9ja1RyYWMoKTsKQEAgLTE3NSwxMiArMjAyLDEzIEBAIHRlc3QoIl9yZXZpc2lvbkNv
bnRlbnRXaXRoUG9wb3ZlckZvckl0ZXJhdGlvbiBoYXMgcHJldmlvdXNJdGVyYXRpb24iLCBmdW5j
dGlvbigpCiAKIG1vZHVsZSgiQnVpbGRCb3RRdWV1ZSIsIHsKICAgICBzZXR1cDogZnVuY3Rpb24o
KSB7CisgICAgICAgIERhc2hib2FyZC5SZXBvc2l0b3J5Lk9wZW5Tb3VyY2UudHJhYyA9IG5ldyBN
b2NrVHJhYygpOworICAgICAgICBEYXNoYm9hcmQuUmVwb3NpdG9yeS5PcGVuU291cmNlLnRyYWMu
cmVjb3JkZWRDb21taXRzID0gTW9ja1RyYWMuRVhBTVBMRV9UUkFDX0NPTU1JVFM7CisgICAgICAg
IERhc2hib2FyZC5SZXBvc2l0b3J5LkludGVybmFsLnRyYWMgPSBuZXcgTW9ja1RyYWMoKTsKICAg
ICAgICAgdGhpcy5xdWV1ZSA9IG5ldyBNb2NrQnVpbGRib3RRdWV1ZSgpOwogICAgICAgICB0aGlz
LnF1ZXVlLmJyYW5jaGVzID0gW3sKICAgICAgICAgICAgIG5hbWU6ICJ0cnVuayIsCi0gICAgICAg
ICAgICByZXBvc2l0b3J5OiB7Ci0gICAgICAgICAgICAgICAgbmFtZTogIm9wZW5Tb3VyY2UiLAot
ICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwb3NpdG9yeTogRGFzaGJvYXJkLlJlcG9zaXRv
cnkuT3BlbnNvdXJjZQogICAgICAgICB9XTsKICAgICB9CiB9KTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>270620</attachid>
            <date>2016-02-03 18:08:53 -0800</date>
            <delta_ts>2016-02-04 16:29:16 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152345-20160203180830.patch</filename>
            <type>text/plain</type>
            <size>13708</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk2MDk4CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggODg0NGU2NThkMTA4MzhkNWIxNzRlNmNlMjNhMjI5ODU2
NTQ0MjgxNC4uZjg2MTQ4NTYxZmQ3NGQ3M2JjM2Y3YTZjYmUyM2IxZDk3NWUyNjNjMiAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI5
IEBACisyMDE2LTAyLTAzICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgorCisg
ICAgICAgIFRlYWNoIGRhc2hib2FyZCBjb2RlIHRvIGNvbXBhcmUgbm9uLWludGVnZXIgcmV2aXNp
b25zCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTIz
NDUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIEJ1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanM6CisgICAgICAgIChCdWlsZGJvdFF1ZXVlLnBy
b3RvdHlwZS5jb21wYXJlSXRlcmF0aW9uc0J5UmV2aXNpb25zKTogQ29tcGFyZSBub24taW50ZWdl
ciByZXZpc2lvbnMuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcu
anM6CisgICAgICAgIChCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUuX2FwcGVuZFBlbmRpbmdS
ZXZpc2lvbkNvdW50KTogVXNlIFRyYWMuaW5kZXhPZlJldmlzaW9uIGluIG9yZGVyIHRvIGNvbXBh
cmUgbm9uLWludGVnZXIKKyAgICAgICAgcmV2aXNpb25zLiBBbHNvIHVzZXMgbmV3IFRyYWMuY29t
bWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24gbWV0aG9kLgorICAgICAgICAoQnVpbGRib3RR
dWV1ZVZpZXcucHJvdG90eXBlLl9wb3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSk6IERpdHRvLgor
ICAgICAgICAoQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLl9wcmVzZW50UG9wb3ZlckZvclBl
bmRpbmdDb21taXRzKTogVXNlIFRyYWMuaW5kZXhPZlJldmlzaW9uIGluIG9yZGVyIHRvIGNvbXBh
cmUgbm9uLWludGVnZXIKKyAgICAgICAgcmV2aXNpb25zLiBBbHNvIHVzZXMgbmV3IFRyYWMubmV4
dFJldmlzaW9uIG1ldGhvZCB0byBjYWxjdWxhdGUgYSByZXZpc2lvbiByYW5nZS4KKyAgICAgICAg
KEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZS5fcmV2aXNpb25Db250ZW50V2l0aFBvcG92ZXJG
b3JJdGVyYXRpb24pOiBEaXR0by4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzOgor
ICAgICAgICAoVHJhYy5wcm90b3R5cGUuX2NvbW1pdHNPbkJyYW5jaCk6IFJlbmFtZWQgdGhpcyB0
byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZCBiZSBhIHByaXZhdGUgbWV0aG9kIHVzZWQgYnkgdGhl
IGxhdHRlciB0d28gbmV3CisgICAgICAgIG1ldGhvZHMuCisgICAgICAgIChUcmFjLnByb3RvdHlw
ZS5jb21taXRzT25CcmFuY2hMYXRlclRoYW5SZXZpc2lvbik6IEZpbmRzIHJldmlzaW9ucyBvbiBh
IGJyYW5jaCBsYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgcmV2aXNpb24uCisgICAgICAgIChUcmFj
LnByb3RvdHlwZS5jb21taXRzT25CcmFuY2hJblJldmlzaW9uUmFuZ2UpOiBGaW5kcyByZXZpc2lv
bnMgb24gYSBicmFuY2ggd2l0aGluIGEgc3BlY2lmaWVkIHJhbmdlLgorICAgICAgICAoVHJhYy5w
cm90b3R5cGUubmV4dFJldmlzaW9uKTogRmluZHMgdGhlIG5leHQgcmV2aXNpb24gYWZ0ZXIgYSBn
aXZlbiByZXZpc2lvbiBvbiBhIHNwZWNpZmljIGJyYW5jaC4KKyAgICAgICAgKFRyYWMucHJvdG90
eXBlLmluZGV4T2ZSZXZpc2lvbik6IEZpbmRzIHRoZSBpbmRleCBvZiBhIGdpdmVuIHJldmlzaW9u
IHdpdGhpbiB0aGUgcmVjb3JkZWRDb21taXRzIGFycmF5LgorICAgICAgICAoVHJhYy5wcm90b3R5
cGUuY29tbWl0c09uQnJhbmNoKTogRGVsZXRlZC4gUmVuYW1lZCB0byBfY29tbWl0c09uQnJhbmNo
LgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1
YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzOiBBZGRlZCB1bml0IHRl
c3RzLgorCiAyMDE2LTAyLTAzICBCcmlhbiBCdXJnICA8YmJ1cmdAYXBwbGUuY29tPgogCiAgICAg
ICAgIGdpdC1hZGQtcmV2aWV3ZXIgc2hvdWxkIHdvcmsgd2hlbiBydW4gZnJvbSBhIHN1YmRpcmVj
dG9yeSB3aXRoaW4gdGhlIHJlcG9zaXRvcnkKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVT
dXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3Jp
cHRzL0J1aWxkYm90UXVldWUuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJr
aXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1ZXVl
LmpzCmluZGV4IDc3MTk4ZDBiZGU2MzdmZGFmN2VhZjY4NWJlMDgzMjY3NDAyYmU2ZGUuLmJlNzI5
NzU1MWM3YmE3ODk5NzdmNTQ4NjEwNzhjYjQ3MzNkNmJiNTEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0J1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanMKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBv
cnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMv
QnVpbGRib3RRdWV1ZS5qcwpAQCAtMjg1LDkgKzI4NSwxNSBAQCBCdWlsZGJvdFF1ZXVlLnByb3Rv
dHlwZSA9IHsKICAgICAgICAgdmFyIHNvcnRlZFJlcG9zaXRvcmllcyA9IERhc2hib2FyZC5zb3J0
ZWRSZXBvc2l0b3JpZXM7CiAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc29ydGVkUmVwb3Np
dG9yaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICB2YXIgcmVwb3NpdG9yeU5hbWUgPSBz
b3J0ZWRSZXBvc2l0b3JpZXNbaV0ubmFtZTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBiLnJl
dmlzaW9uW3JlcG9zaXRvcnlOYW1lXSAtIGEucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdOwotICAg
ICAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
ICAgICAgICAgdmFyIHRyYWMgPSBzb3J0ZWRSZXBvc2l0b3JpZXNbaV0udHJhYzsKKyAgICAgICAg
ICAgIGNvbnNvbGUuYXNzZXJ0KHRyYWMpOworICAgICAgICAgICAgdmFyIGluZGV4QSA9IHRyYWMu
aW5kZXhPZlJldmlzaW9uKGEucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdKTsKKyAgICAgICAgICAg
IHZhciBpbmRleEIgPSB0cmFjLmluZGV4T2ZSZXZpc2lvbihiLnJldmlzaW9uW3JlcG9zaXRvcnlO
YW1lXSk7CisgICAgICAgICAgICBpZiAoaW5kZXhBID4gLTEgJiYgaW5kZXhCID4gLTEpIHsKKyAg
ICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gaW5kZXhCIC0gaW5kZXhBOworICAgICAgICAgICAg
ICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
ICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL1Rv
b2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1s
L2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWVWaWV3LmpzIGIvVG9vbHMvQnVpbGRTbGF2
ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Nj
cmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcuanMKaW5kZXggMDEwOTg0NGJhMTI4Zjc1ZDY1YmMxNWE1
MjEyOTFmNzU3NGE1Njc2NS4uYzFmNTNmMmIzZjk1NzgxMGVjZjQ1MmFkZGRiMGU3MjNkMDcyZDQ0
YiAxMDA2NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1j
b25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcuanMK
KysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVi
bGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcuanMKQEAgLTk0LDEy
ICs5NCwxMiBAQCBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICAg
ICAgY29udGludWU7CiAgICAgICAgICAgICBpZiAoIXRyYWMpCiAgICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICBpZiAoIXRyYWMubGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJl
ciB8fCB0cmFjLm9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIgPiBsYXRlc3RQcm9kdWN0aXZl
UmV2aXNpb25OdW1iZXIpIHsKKyAgICAgICAgICAgIGlmICghdHJhYy5sYXRlc3RSZWNvcmRlZFJl
dmlzaW9uTnVtYmVyIHx8IHRyYWMuaW5kZXhPZlJldmlzaW9uKHRyYWMub2xkZXN0UmVjb3JkZWRS
ZXZpc2lvbk51bWJlcikgPiB0cmFjLmluZGV4T2ZSZXZpc2lvbihsYXRlc3RQcm9kdWN0aXZlUmV2
aXNpb25OdW1iZXIpKSB7CiAgICAgICAgICAgICAgICAgdHJhYy5sb2FkTW9yZUhpc3RvcmljYWxE
YXRhKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAg
ICAgICB0b3RhbFJldmlzaW9uc0JlaGluZCArPSB0cmFjLmNvbW1pdHNPbkJyYW5jaChicmFuY2gu
bmFtZSwgZnVuY3Rpb24oY29tbWl0KSB7IHJldHVybiBjb21taXQucmV2aXNpb25OdW1iZXIgPiBs
YXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXI7IH0pLmxlbmd0aDsKKyAgICAgICAgICAgIHRv
dGFsUmV2aXNpb25zQmVoaW5kICs9IHRyYWMuY29tbWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNp
b24oYnJhbmNoLm5hbWUsIGxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlcikubGVuZ3RoOwog
ICAgICAgICB9CiAKICAgICAgICAgaWYgKCF0b3RhbFJldmlzaW9uc0JlaGluZCkKQEAgLTE0MCwx
MSArMTQwLDExIEBAIEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsKICAgICAgICAgICAg
IHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICBjb25zb2xlLmFzc2VydCh0cmFj
Lm9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIgPD0gZmlyc3RSZXZpc2lvbk51bWJlcik7Cisg
ICAgICAgIGNvbnNvbGUuYXNzZXJ0KHRyYWMuaW5kZXhPZlJldmlzaW9uKHRyYWMub2xkZXN0UmVj
b3JkZWRSZXZpc2lvbk51bWJlcikgPD0gdHJhYy5pbmRleE9mUmV2aXNpb24oZmlyc3RSZXZpc2lv
bk51bWJlcikpOwogCiAgICAgICAgIC8vIEZJWE1FOiBUbyBiZSAxMDAlIGNvcnJlY3QsIHdlIHNo
b3VsZCBhbHNvIGZpbHRlciBvdXQgY2hhbmdlcyB0aGF0IGFyZSBpZ25vcmVkIGJ5CiAgICAgICAg
IC8vIHRoZSBxdWV1ZSwgc2VlIF9zaG91bGRfZmlsZV90cmlnZ2VyX2J1aWxkIGluIHdrYnVpbGQu
cHkuCi0gICAgICAgIHZhciBjb21taXRzID0gdHJhYy5jb21taXRzT25CcmFuY2goYnJhbmNoLm5h
bWUsIGZ1bmN0aW9uKGNvbW1pdCkgeyByZXR1cm4gY29tbWl0LnJldmlzaW9uTnVtYmVyID49IGZp
cnN0UmV2aXNpb25OdW1iZXIgJiYgY29tbWl0LnJldmlzaW9uTnVtYmVyIDw9IGxhc3RSZXZpc2lv
bk51bWJlcjsgfSk7CisgICAgICAgIHZhciBjb21taXRzID0gdHJhYy5jb21taXRzT25CcmFuY2hJ
blJldmlzaW9uUmFuZ2UoYnJhbmNoLm5hbWUsIGZpcnN0UmV2aXNpb25OdW1iZXIsIGxhc3RSZXZp
c2lvbk51bWJlcik7CiAgICAgICAgIHJldHVybiBjb21taXRzLm1hcChmdW5jdGlvbihjb21taXQp
IHsKICAgICAgICAgICAgIHJldHVybiBsaW5lRm9yQ29tbWl0KHRyYWMsIGNvbW1pdCk7CiAgICAg
ICAgIH0sIHRoaXMpLnJldmVyc2UoKTsKQEAgLTE2OSw3ICsxNjksNyBAQCBCdWlsZGJvdFF1ZXVl
Vmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICB2YXIgbGF0ZXN0UHJvZHVjdGl2ZVJldmlz
aW9uTnVtYmVyID0gbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5
TmFtZV07CiAgICAgICAgICAgICBpZiAoIWxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlciB8
fCAhdHJhYy5sYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVyKQogICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5fcG9wb3ZlckxpbmVzRm9yQ29t
bWl0UmFuZ2UodHJhYywgYnJhbmNoLCBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIgKyAx
LCB0cmFjLmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpOworICAgICAgICAgICAgdmFyIGxp
bmVzID0gdGhpcy5fcG9wb3ZlckxpbmVzRm9yQ29tbWl0UmFuZ2UodHJhYywgYnJhbmNoLCB0cmFj
Lm5leHRSZXZpc2lvbihicmFuY2gubmFtZSwgbGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVy
KSwgdHJhYy5sYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVyKTsKICAgICAgICAgICAgIHZhciBs
ZW5ndGggPSBsaW5lcy5sZW5ndGg7CiAgICAgICAgICAgICBpZiAobGVuZ3RoICYmIHNob3VsZEFk
ZERpdmlkZXIpCiAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRGl2aWRlclRvUG9wb3Zlcihjb250
ZW50KTsKQEAgLTIyMCw2ICsyMjAsNyBAQCBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUgPSB7
CiAgICAgICAgIHZhciByZXBvc2l0b3J5ID0gYnJhbmNoLnJlcG9zaXRvcnk7CiAgICAgICAgIHZh
ciByZXBvc2l0b3J5TmFtZSA9IHJlcG9zaXRvcnkubmFtZTsKICAgICAgICAgY29uc29sZS5hc3Nl
cnQoaXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSk7CisgICAgICAgIHZhciB0cmFj
ID0gcmVwb3NpdG9yeS50cmFjOwogICAgICAgICB2YXIgY29udGVudCA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgdmFyIHJldmlzaW9uID0gaXRlcmF0aW9uLnJldmlz
aW9uW3JlcG9zaXRvcnlOYW1lXTsKICAgICAgICAgaWYgKHJlcG9zaXRvcnkuaXNTVk4pCkBAIC0y
MzEsMTIgKzIzMiwxMiBAQCBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAg
ICAgICBjb25zb2xlLmFzc2VydChmYWxzZSwgIlNob3VsZCBub3QgZ2V0IGhlcmU7ICIgKyByZXBv
c2l0b3J5Lm5hbWUgKyAiIGRpZCBub3Qgc3BlY2lmeSBhIGtub3duIFZDUyB0eXBlLiIpOwogICAg
ICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoInJldmlzaW9uLW51bWJlciIpOwogCi0gICAgICAg
IGlmIChwcmV2aW91c0l0ZXJhdGlvbikgeworICAgICAgICBpZiAocHJldmlvdXNJdGVyYXRpb24g
JiYgdHJhYy5pbmRleE9mUmV2aXNpb24ocHJldmlvdXNJdGVyYXRpb24ucmV2aXNpb25bcmVwb3Np
dG9yeU5hbWVdKSA+IC0xICYmIHRyYWMuaW5kZXhPZlJldmlzaW9uKGl0ZXJhdGlvbi5yZXZpc2lv
bltyZXBvc2l0b3J5TmFtZV0pID4gLTEpIHsKICAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KHBy
ZXZpb3VzSXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSk7CiAgICAgICAgICAgICB2
YXIgY29udGV4dCA9IHsKICAgICAgICAgICAgICAgICB0cmFjOiByZXBvc2l0b3J5LnRyYWMsCiAg
ICAgICAgICAgICAgICAgYnJhbmNoOiBicmFuY2gsCi0gICAgICAgICAgICAgICAgZmlyc3RSZXZp
c2lvbjogcHJldmlvdXNJdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdICsgMSwKKyAg
ICAgICAgICAgICAgICBmaXJzdFJldmlzaW9uOiB0cmFjLm5leHRSZXZpc2lvbihicmFuY2gubmFt
ZSwgcHJldmlvdXNJdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdKSwKICAgICAgICAg
ICAgICAgICBsYXN0UmV2aXNpb246IGl0ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0K
ICAgICAgICAgICAgIH07CiAgICAgICAgICAgICBpZiAoY29udGV4dC5maXJzdFJldmlzaW9uIDw9
IGNvbnRleHQubGFzdFJldmlzaW9uKQpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBv
cnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMv
VHJhYy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmln
L3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1RyYWMuanMKaW5kZXggYTQ4OGQxYzE2Yzdi
ZmEwMmYyNGRiYzhmNTUxMzI1MjdkNGY1ZTJhOC4uNTVhZTFhZWI1NTNlNDE5YjNiNWE0YzhlYjkw
OTlmZTI5MWNjMDhjMSAxMDA2NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVHJhYy5qcwor
KysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJs
aWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzCkBAIC02MywxMSArNjMsNDAgQEAgVHJh
Yy5wcm90b3R5cGUgPSB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlY29yZGVkQ29tbWl0c1t0aGlz
LnJlY29yZGVkQ29tbWl0cy5sZW5ndGggLSAxXS5yZXZpc2lvbk51bWJlcjsKICAgICB9LAogCi0g
ICAgY29tbWl0c09uQnJhbmNoOiBmdW5jdGlvbihicmFuY2hOYW1lLCBmaWx0ZXIpCisgICAgX2Nv
bW1pdHNPbkJyYW5jaDogZnVuY3Rpb24oYnJhbmNoTmFtZSwgYmVnaW5Qb3NpdGlvbiwgZW5kUG9z
aXRpb24pCiAgICAgewotICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRlZENvbW1pdHMuZmlsdGVy
KGZ1bmN0aW9uKGNvbW1pdCwgaW5kZXgsIGFycmF5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKCFj
b21taXQuY29udGFpbnNCcmFuY2hMb2NhdGlvbiB8fCBjb21taXQuYnJhbmNoZXMuaW5jbHVkZXMo
YnJhbmNoTmFtZSkpICYmIGZpbHRlcihjb21taXQsIGluZGV4LCBhcnJheSk7Ci0gICAgICAgIH0p
OworICAgICAgICBiZWdpblBvc2l0aW9uID0gYmVnaW5Qb3NpdGlvbiB8fCAwOworICAgICAgICBp
ZiAoZW5kUG9zaXRpb24gPT09IHVuZGVmaW5lZCkKKyAgICAgICAgICAgIGVuZFBvc2l0aW9uID0g
dGhpcy5yZWNvcmRlZENvbW1pdHMubGVuZ3RoIC0gMTsKKyAgICAgICAgdmFyIGNvbW1pdHMgPSBb
XTsKKyAgICAgICAgZm9yICh2YXIgaSA9IGJlZ2luUG9zaXRpb247IGkgPD0gZW5kUG9zaXRpb247
ICsraSkgeworICAgICAgICAgICAgdmFyIGNvbW1pdCA9IHRoaXMucmVjb3JkZWRDb21taXRzW2ld
OworICAgICAgICAgICAgaWYgKCFjb21taXQuY29udGFpbnNCcmFuY2hMb2NhdGlvbiB8fCBjb21t
aXQuYnJhbmNoZXMuaW5jbHVkZXMoYnJhbmNoTmFtZSkpCisgICAgICAgICAgICAgICAgY29tbWl0
cy5wdXNoKGNvbW1pdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbW1pdHM7CisgICAg
fSwKKworICAgIGNvbW1pdHNPbkJyYW5jaExhdGVyVGhhblJldmlzaW9uOiBmdW5jdGlvbihicmFu
Y2hOYW1lLCByZXZpc2lvbikKKyAgICB7CisgICAgICAgIHZhciBpbmRleFRvQmVMYXRlclRoYW4g
PSB0aGlzLmluZGV4T2ZSZXZpc2lvbihyZXZpc2lvbik7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0
KGluZGV4VG9CZUxhdGVyVGhhbiAhPT0gLTEsIHJldmlzaW9uICsgIiBpcyBub3QgaW4gdGhlIGxp
c3Qgb2YgcmVjb3JkZWQgY29tbWl0cyIpOworICAgICAgICBpZiAoaW5kZXhUb0JlTGF0ZXJUaGFu
ID09PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2Nv
bW1pdHNPbkJyYW5jaChicmFuY2hOYW1lLCBpbmRleFRvQmVMYXRlclRoYW4gKyAxKTsKKyAgICB9
LAorCisgICAgY29tbWl0c09uQnJhbmNoSW5SZXZpc2lvblJhbmdlOiBmdW5jdGlvbihicmFuY2hO
YW1lLCBmaXJzdFJldmlzaW9uLCBsYXN0UmV2aXNpb24pCisgICAgeworICAgICAgICB2YXIgaW5k
ZXhPZkZpcnN0UmV2aXNpb24gPSB0aGlzLmluZGV4T2ZSZXZpc2lvbihmaXJzdFJldmlzaW9uKTsK
KyAgICAgICAgY29uc29sZS5hc3NlcnQoaW5kZXhPZkZpcnN0UmV2aXNpb24gIT09IC0xLCBmaXJz
dFJldmlzaW9uICsgIiBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgcmVjb3JkZWQgY29tbWl0cyIpOwor
ICAgICAgICBpZiAoaW5kZXhPZkZpcnN0UmV2aXNpb24gPT09IC0xKQorICAgICAgICAgICAgcmV0
dXJuIFtdOworICAgICAgICB2YXIgaW5kZXhPZkxhc3RSZXZpc2lvbiA9IHRoaXMuaW5kZXhPZlJl
dmlzaW9uKGxhc3RSZXZpc2lvbik7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGluZGV4T2ZMYXN0
UmV2aXNpb24gIT09IC0xLCBpbmRleE9mTGFzdFJldmlzaW9uICsgIiBpcyBub3QgaW4gdGhlIGxp
c3Qgb2YgcmVjb3JkZWQgY29tbWl0cyIpOworICAgICAgICBpZiAoaW5kZXhPZkxhc3RSZXZpc2lv
biA9PT0gLTEpCisgICAgICAgICAgICByZXR1cm4gW107CisgICAgICAgIHJldHVybiB0aGlzLl9j
b21taXRzT25CcmFuY2goYnJhbmNoTmFtZSwgaW5kZXhPZkZpcnN0UmV2aXNpb24sIGluZGV4T2ZM
YXN0UmV2aXNpb24pOwogICAgIH0sCiAKICAgICByZXZpc2lvblVSTDogZnVuY3Rpb24ocmV2aXNp
b24pCkBAIC0yNjYsNCArMjk1LDIxIEBAIFRyYWMucHJvdG90eXBlID0gewogICAgICAgICAgICAg
dGhpcy5fbG9hZGVkKGRhdGFEb2N1bWVudCk7CiAgICAgICAgIH0uYmluZCh0aGlzKSwgdGhpcy5f
bmVlZHNBdXRoZW50aWNhdGlvbiA/IHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0gOiB7fSk7CiAg
ICAgfSwKKworICAgIG5leHRSZXZpc2lvbjogZnVuY3Rpb24oYnJhbmNoTmFtZSwgcmV2aXNpb24p
CisgICAgeworICAgICAgICB2YXIgY29tbWl0cyA9IHRoaXMuY29tbWl0c09uQnJhbmNoTGF0ZXJU
aGFuUmV2aXNpb24oYnJhbmNoTmFtZSwgcmV2aXNpb24pOworICAgICAgICBpZiAoY29tbWl0cy5s
ZW5ndGggPiAwKQorICAgICAgICAgICAgcmV0dXJuIGNvbW1pdHNbMF0ucmV2aXNpb25OdW1iZXI7
CisgICAgICAgIHJldHVybiByZXZpc2lvbjsKKyAgICB9LAorCisgICAgaW5kZXhPZlJldmlzaW9u
OiBmdW5jdGlvbihyZXZpc2lvbikKKyAgICB7CisgICAgICAgIHZhciBjb21taXRzID0gdGhpcy5y
ZWNvcmRlZENvbW1pdHM7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWl0cy5sZW5n
dGg7ICsraSkKKyAgICAgICAgICAgIGlmIChjb21taXRzW2ldLnJldmlzaW9uTnVtYmVyID09PSBy
ZXZpc2lvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgcmV0dXJuIC0xOwor
ICAgIH0sCiB9OwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Vi
a2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMu
anMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJs
aWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5qcwppbmRleCA4ZmVlMjcwYjEx
ODkyNTY0NDc3NjdlOWY5YjBhZjllMWRlMjBmMmZhLi5lNGNlMjcxZjFlOWNkMmQ1OTU5N2ZlZGUw
MjMxZjcyYmYzZmYwMWZjIDEwMDY0NAotLS0gYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWls
ZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90
ZXN0cy5qcworKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNv
bmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5qcwpAQCAtNzIs
NiArNzIsMzMgQEAgdGVzdCgiX3BhcnNlUmV2aXNpb25Gcm9tVVJMIiwgZnVuY3Rpb24oKQogICAg
IHN0cmljdEVxdWFsKHRoaXMudHJhYy5fcGFyc2VSZXZpc2lvbkZyb21VUkwoImh0dHBzOi8vZ2l0
LmZvb2Jhci5jb20vdHJhYy9XaGF0ZXZlci5naXQvY2hhbmdlc2V0LzBlNDk4ZGI1ZDhlNWI1YTM0
MjYzMSIpLCAiMGU0OThkYjVkOGU1YjVhMzQyNjMxIiwgIkdpdCIpOwogfSk7CiAKK3Rlc3QoIm5l
eHRSZXZpc2lvbiIsIGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLnRyYWMucmVjb3JkZWRDb21taXRz
ID0gTW9ja1RyYWMuRVhBTVBMRV9UUkFDX0NPTU1JVFM7CisgICAgc3RyaWN0RXF1YWwodGhpcy50
cmFjLm5leHRSZXZpc2lvbigidHJ1bmsiLCAzMzAyMCksIDMzMDIyLCAibmV4dFJldmlzaW9uIHNh
bWUgYnJhbmNoIik7CisgICAgc3RyaWN0RXF1YWwodGhpcy50cmFjLm5leHRSZXZpc2lvbigidHJ1
bmsiLCAzMzAxOSksIDMzMDIwLCAibmV4dFJldmlzaW9uIGRpZmZlcmVudCBicmFuY2giKTsKK30p
OworCit0ZXN0KCJpbmRleE9mUmV2aXNpb24iLCBmdW5jdGlvbigpCit7CisgICAgdGhpcy50cmFj
LnJlY29yZGVkQ29tbWl0cyA9IE1vY2tUcmFjLkVYQU1QTEVfVFJBQ19DT01NSVRTOworICAgIHN0
cmljdEVxdWFsKHRoaXMudHJhYy5pbmRleE9mUmV2aXNpb24oMzMwMjApLCAyLCAiaW5kZXhPZlJl
dmlzaW9uIik7Cit9KTsKKwordGVzdCgiY29tbWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24i
LCBmdW5jdGlvbigpCit7CisgICAgdGhpcy50cmFjLnJlY29yZGVkQ29tbWl0cyA9IE1vY2tUcmFj
LkVYQU1QTEVfVFJBQ19DT01NSVRTOworICAgIHZhciBjb21taXRzID0gdGhpcy50cmFjLmNvbW1p
dHNPbkJyYW5jaExhdGVyVGhhblJldmlzaW9uKCJ0cnVuayIsIDMzMDIwKTsKKyAgICBlcXVhbChj
b21taXRzLmxlbmd0aCwgMSwgImdyZWF0ZXIgdGhhbiAzMzAyMCIpOworfSk7CisKK3Rlc3QoImNv
bW1pdHNPbkJyYW5jaEluUmV2aXNpb25SYW5nZSIsIGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLnRy
YWMucmVjb3JkZWRDb21taXRzID0gTW9ja1RyYWMuRVhBTVBMRV9UUkFDX0NPTU1JVFM7CisgICAg
dmFyIGNvbW1pdHMgPSB0aGlzLnRyYWMuY29tbWl0c09uQnJhbmNoSW5SZXZpc2lvblJhbmdlKCJ0
cnVuayIsIDMzMDIwLCAzMzAyMik7CisgICAgZXF1YWwoY29tbWl0cy5sZW5ndGgsIDIsICJpbiBy
YW5nZSAzMzAyMCwgMzMwMjIiKTsKK30pOworCiBtb2R1bGUoIkJ1aWxkQm90UXVldWVWaWV3Iiwg
ewogICAgIHNldHVwOiBmdW5jdGlvbigpIHsKICAgICAgICAgdGhpcy50cmFjID0gbmV3IE1vY2tU
cmFjKCk7CkBAIC0xNzUsMTIgKzIwMiwxMyBAQCB0ZXN0KCJfcmV2aXNpb25Db250ZW50V2l0aFBv
cG92ZXJGb3JJdGVyYXRpb24gaGFzIHByZXZpb3VzSXRlcmF0aW9uIiwgZnVuY3Rpb24oKQogCiBt
b2R1bGUoIkJ1aWxkQm90UXVldWUiLCB7CiAgICAgc2V0dXA6IGZ1bmN0aW9uKCkgeworICAgICAg
ICBEYXNoYm9hcmQuUmVwb3NpdG9yeS5PcGVuU291cmNlLnRyYWMgPSBuZXcgTW9ja1RyYWMoKTsK
KyAgICAgICAgRGFzaGJvYXJkLlJlcG9zaXRvcnkuT3BlblNvdXJjZS50cmFjLnJlY29yZGVkQ29t
bWl0cyA9IE1vY2tUcmFjLkVYQU1QTEVfVFJBQ19DT01NSVRTOworICAgICAgICBEYXNoYm9hcmQu
UmVwb3NpdG9yeS5JbnRlcm5hbC50cmFjID0gbmV3IE1vY2tUcmFjKCk7CiAgICAgICAgIHRoaXMu
cXVldWUgPSBuZXcgTW9ja0J1aWxkYm90UXVldWUoKTsKICAgICAgICAgdGhpcy5xdWV1ZS5icmFu
Y2hlcyA9IFt7CiAgICAgICAgICAgICBuYW1lOiAidHJ1bmsiLAotICAgICAgICAgICAgcmVwb3Np
dG9yeTogewotICAgICAgICAgICAgICAgIG5hbWU6ICJvcGVuU291cmNlIiwKLSAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIHJlcG9zaXRvcnk6IERhc2hib2FyZC5SZXBvc2l0b3J5Lk9wZW5zb3Vy
Y2UKICAgICAgICAgfV07CiAgICAgfQogfSk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>270705</attachid>
            <date>2016-02-04 16:29:24 -0800</date>
            <delta_ts>2016-02-04 17:45:19 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152345-20160204162900.patch</filename>
            <type>text/plain</type>
            <size>15140</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk2MTU0CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggYTQzMmM1YzIzMzQzZjRiNTU3MGQ5OWFkNTVhMWE0NzMy
NmYyMGRlYS4uOWVkN2E3YzZmZTY1NTkxMGFlNGVlYTgwYjg2MGEyMDUxNDk1MTY0ZCAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI5
IEBACisyMDE2LTAyLTA0ICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgorCisg
ICAgICAgIFRlYWNoIGRhc2hib2FyZCBjb2RlIHRvIGNvbXBhcmUgbm9uLWludGVnZXIgcmV2aXNp
b25zCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTIz
NDUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIEJ1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanM6CisgICAgICAgIChCdWlsZGJvdFF1ZXVlLnBy
b3RvdHlwZS5jb21wYXJlSXRlcmF0aW9uc0J5UmV2aXNpb25zKTogQ29tcGFyZSBub24taW50ZWdl
ciByZXZpc2lvbnMuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcu
anM6CisgICAgICAgIChCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUuX2FwcGVuZFBlbmRpbmdS
ZXZpc2lvbkNvdW50KTogVXNlIFRyYWMuaW5kZXhPZlJldmlzaW9uIGluIG9yZGVyIHRvIGNvbXBh
cmUgbm9uLWludGVnZXIKKyAgICAgICAgcmV2aXNpb25zLiBBbHNvIHVzZXMgbmV3IFRyYWMuY29t
bWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24gbWV0aG9kLgorICAgICAgICAoQnVpbGRib3RR
dWV1ZVZpZXcucHJvdG90eXBlLl9wb3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSk6IERpdHRvLgor
ICAgICAgICAoQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLl9wcmVzZW50UG9wb3ZlckZvclBl
bmRpbmdDb21taXRzKTogVXNlIFRyYWMuaW5kZXhPZlJldmlzaW9uIGluIG9yZGVyIHRvIGNvbXBh
cmUgbm9uLWludGVnZXIKKyAgICAgICAgcmV2aXNpb25zLiBBbHNvIHVzZXMgbmV3IFRyYWMubmV4
dFJldmlzaW9uIG1ldGhvZCB0byBjYWxjdWxhdGUgYSByZXZpc2lvbiByYW5nZS4KKyAgICAgICAg
KEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZS5fcmV2aXNpb25Db250ZW50V2l0aFBvcG92ZXJG
b3JJdGVyYXRpb24pOiBEaXR0by4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzOgor
ICAgICAgICAoVHJhYy5wcm90b3R5cGUuX2NvbW1pdHNPbkJyYW5jaCk6IFJlbmFtZWQgdGhpcyB0
byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZCBiZSBhIHByaXZhdGUgbWV0aG9kIHVzZWQgYnkgdGhl
IGxhdHRlciB0d28gbmV3CisgICAgICAgIG1ldGhvZHMuCisgICAgICAgIChUcmFjLnByb3RvdHlw
ZS5jb21taXRzT25CcmFuY2hMYXRlclRoYW5SZXZpc2lvbik6IEZpbmRzIHJldmlzaW9ucyBvbiBh
IGJyYW5jaCBsYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgcmV2aXNpb24uCisgICAgICAgIChUcmFj
LnByb3RvdHlwZS5jb21taXRzT25CcmFuY2hJblJldmlzaW9uUmFuZ2UpOiBGaW5kcyByZXZpc2lv
bnMgb24gYSBicmFuY2ggd2l0aGluIGEgc3BlY2lmaWVkIHJhbmdlLgorICAgICAgICAoVHJhYy5w
cm90b3R5cGUubmV4dFJldmlzaW9uKTogRmluZHMgdGhlIG5leHQgcmV2aXNpb24gYWZ0ZXIgYSBn
aXZlbiByZXZpc2lvbiBvbiBhIHNwZWNpZmljIGJyYW5jaC4KKyAgICAgICAgKFRyYWMucHJvdG90
eXBlLmluZGV4T2ZSZXZpc2lvbik6IEZpbmRzIHRoZSBpbmRleCBvZiBhIGdpdmVuIHJldmlzaW9u
IHdpdGhpbiB0aGUgcmVjb3JkZWRDb21taXRzIGFycmF5LgorICAgICAgICAoVHJhYy5wcm90b3R5
cGUuY29tbWl0c09uQnJhbmNoKTogRGVsZXRlZC4gUmVuYW1lZCB0byBfY29tbWl0c09uQnJhbmNo
LgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1
YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzOiBBZGRlZCB1bml0IHRl
c3RzLgorCiAyMDE2LTAyLTAzICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CiAKICAg
ICAgICAgcnVuLWpzYy1zdHJlc3MtdGVzdHMgc2hvdWxkIGJlIGJldHRlciBhdCB0ZWxsaW5nIHlv
dSBkZXRhaWxzIGFib3V0IHRlc3QgZmFpbHVyZXMKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xh
dmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9T
Y3JpcHRzL0J1aWxkYm90UXVldWUuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1
ZXVlLmpzCmluZGV4IDc3MTk4ZDBiZGU2MzdmZGFmN2VhZjY4NWJlMDgzMjY3NDAyYmU2ZGUuLmJl
NzI5NzU1MWM3YmE3ODk5NzdmNTQ4NjEwNzhjYjQ3MzNkNmJiNTEgMTAwNjQ0Ci0tLSBhL1Rvb2xz
L0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rh
c2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanMKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1
cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Njcmlw
dHMvQnVpbGRib3RRdWV1ZS5qcwpAQCAtMjg1LDkgKzI4NSwxNSBAQCBCdWlsZGJvdFF1ZXVlLnBy
b3RvdHlwZSA9IHsKICAgICAgICAgdmFyIHNvcnRlZFJlcG9zaXRvcmllcyA9IERhc2hib2FyZC5z
b3J0ZWRSZXBvc2l0b3JpZXM7CiAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc29ydGVkUmVw
b3NpdG9yaWVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICB2YXIgcmVwb3NpdG9yeU5hbWUg
PSBzb3J0ZWRSZXBvc2l0b3JpZXNbaV0ubmFtZTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBi
LnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSAtIGEucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdOwot
ICAgICAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Owor
ICAgICAgICAgICAgdmFyIHRyYWMgPSBzb3J0ZWRSZXBvc2l0b3JpZXNbaV0udHJhYzsKKyAgICAg
ICAgICAgIGNvbnNvbGUuYXNzZXJ0KHRyYWMpOworICAgICAgICAgICAgdmFyIGluZGV4QSA9IHRy
YWMuaW5kZXhPZlJldmlzaW9uKGEucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdKTsKKyAgICAgICAg
ICAgIHZhciBpbmRleEIgPSB0cmFjLmluZGV4T2ZSZXZpc2lvbihiLnJldmlzaW9uW3JlcG9zaXRv
cnlOYW1lXSk7CisgICAgICAgICAgICBpZiAoaW5kZXhBID4gLTEgJiYgaW5kZXhCID4gLTEpIHsK
KyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gaW5kZXhCIC0gaW5kZXhBOworICAgICAgICAg
ICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBh
L1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19o
dG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWVWaWV3LmpzIGIvVG9vbHMvQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcuanMKaW5kZXggZTE3ZmI2M2E0NGU3NDUyYzMzMTc5
MTlkZTU0NDI4OWQ3NzkzZDU0Zi4uM2I4ODhjZjhhZGE3ODQzMWYyZDBiZmZjOTJmMWU5NzdiZGEx
MmYyZSAxMDA2NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcu
anMKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcuanMKQEAgLTk0
LDEyICs5NCwxMiBAQCBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAg
ICAgICAgY29udGludWU7CiAgICAgICAgICAgICBpZiAoIXRyYWMpCiAgICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICBpZiAoIXRyYWMubGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51
bWJlciB8fCB0cmFjLm9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIgPiBsYXRlc3RQcm9kdWN0
aXZlUmV2aXNpb25OdW1iZXIpIHsKKyAgICAgICAgICAgIGlmICghdHJhYy5sYXRlc3RSZWNvcmRl
ZFJldmlzaW9uTnVtYmVyIHx8IHRyYWMuaW5kZXhPZlJldmlzaW9uKHRyYWMub2xkZXN0UmVjb3Jk
ZWRSZXZpc2lvbk51bWJlcikgPiB0cmFjLmluZGV4T2ZSZXZpc2lvbihsYXRlc3RQcm9kdWN0aXZl
UmV2aXNpb25OdW1iZXIpKSB7CiAgICAgICAgICAgICAgICAgdHJhYy5sb2FkTW9yZUhpc3Rvcmlj
YWxEYXRhKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAg
ICAgICAgICB0b3RhbFJldmlzaW9uc0JlaGluZCArPSB0cmFjLmNvbW1pdHNPbkJyYW5jaChicmFu
Y2gubmFtZSwgZnVuY3Rpb24oY29tbWl0KSB7IHJldHVybiBjb21taXQucmV2aXNpb25OdW1iZXIg
PiBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXI7IH0pLmxlbmd0aDsKKyAgICAgICAgICAg
IHRvdGFsUmV2aXNpb25zQmVoaW5kICs9IHRyYWMuY29tbWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2
aXNpb24oYnJhbmNoLm5hbWUsIGxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlcikubGVuZ3Ro
OwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCF0b3RhbFJldmlzaW9uc0JlaGluZCkKQEAgLTE0
MCwxMSArMTQwLDExIEBAIEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsKICAgICAgICAg
ICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICBjb25zb2xlLmFzc2VydCh0
cmFjLm9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIgPD0gZmlyc3RSZXZpc2lvbk51bWJlcik7
CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KHRyYWMuaW5kZXhPZlJldmlzaW9uKHRyYWMub2xkZXN0
UmVjb3JkZWRSZXZpc2lvbk51bWJlcikgPD0gdHJhYy5pbmRleE9mUmV2aXNpb24oZmlyc3RSZXZp
c2lvbk51bWJlcikpOwogCiAgICAgICAgIC8vIEZJWE1FOiBUbyBiZSAxMDAlIGNvcnJlY3QsIHdl
IHNob3VsZCBhbHNvIGZpbHRlciBvdXQgY2hhbmdlcyB0aGF0IGFyZSBpZ25vcmVkIGJ5CiAgICAg
ICAgIC8vIHRoZSBxdWV1ZSwgc2VlIF9zaG91bGRfZmlsZV90cmlnZ2VyX2J1aWxkIGluIHdrYnVp
bGQucHkuCi0gICAgICAgIHZhciBjb21taXRzID0gdHJhYy5jb21taXRzT25CcmFuY2goYnJhbmNo
Lm5hbWUsIGZ1bmN0aW9uKGNvbW1pdCkgeyByZXR1cm4gY29tbWl0LnJldmlzaW9uTnVtYmVyID49
IGZpcnN0UmV2aXNpb25OdW1iZXIgJiYgY29tbWl0LnJldmlzaW9uTnVtYmVyIDw9IGxhc3RSZXZp
c2lvbk51bWJlcjsgfSk7CisgICAgICAgIHZhciBjb21taXRzID0gdHJhYy5jb21taXRzT25CcmFu
Y2hJblJldmlzaW9uUmFuZ2UoYnJhbmNoLm5hbWUsIGZpcnN0UmV2aXNpb25OdW1iZXIsIGxhc3RS
ZXZpc2lvbk51bWJlcik7CiAgICAgICAgIHJldHVybiBjb21taXRzLm1hcChmdW5jdGlvbihjb21t
aXQpIHsKICAgICAgICAgICAgIHJldHVybiBsaW5lRm9yQ29tbWl0LmNhbGwodGhpcywgdHJhYywg
Y29tbWl0KTsKICAgICAgICAgfSwgdGhpcykucmV2ZXJzZSgpOwpAQCAtMTY3LDkgKzE2NywxMCBA
QCBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICB2YXIgcmVwb3Np
dG9yeU5hbWUgPSByZXBvc2l0b3J5Lm5hbWU7CiAgICAgICAgICAgICB2YXIgdHJhYyA9IHJlcG9z
aXRvcnkudHJhYzsKICAgICAgICAgICAgIHZhciBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1i
ZXIgPSBsYXRlc3RQcm9kdWN0aXZlSXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXTsK
LSAgICAgICAgICAgIGlmICghbGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyIHx8ICF0cmFj
LmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpCisgICAgICAgICAgICB2YXIgbmV4dFJldmlz
aW9uID0gdHJhYy5uZXh0UmV2aXNpb24oYnJhbmNoLm5hbWUsIGxhdGVzdFByb2R1Y3RpdmVSZXZp
c2lvbk51bWJlcik7CisgICAgICAgICAgICBpZiAoIWxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51
bWJlciB8fCAhdHJhYy5sYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVyIHx8ICFuZXh0UmV2aXNp
b24pCiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB2YXIgbGluZXMgPSB0
aGlzLl9wb3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSh0cmFjLCBicmFuY2gsIGxhdGVzdFByb2R1
Y3RpdmVSZXZpc2lvbk51bWJlciArIDEsIHRyYWMubGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJl
cik7CisgICAgICAgICAgICB2YXIgbGluZXMgPSB0aGlzLl9wb3BvdmVyTGluZXNGb3JDb21taXRS
YW5nZSh0cmFjLCBicmFuY2gsIG5leHRSZXZpc2lvbiwgdHJhYy5sYXRlc3RSZWNvcmRlZFJldmlz
aW9uTnVtYmVyKTsKICAgICAgICAgICAgIHZhciBsZW5ndGggPSBsaW5lcy5sZW5ndGg7CiAgICAg
ICAgICAgICBpZiAobGVuZ3RoICYmIHNob3VsZEFkZERpdmlkZXIpCiAgICAgICAgICAgICAgICAg
dGhpcy5fYWRkRGl2aWRlclRvUG9wb3Zlcihjb250ZW50KTsKQEAgLTIyMCwxNiArMjIxLDE3IEBA
IEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsKICAgICAgICAgdmFyIHJlcG9zaXRvcnkg
PSBicmFuY2gucmVwb3NpdG9yeTsKICAgICAgICAgdmFyIHJlcG9zaXRvcnlOYW1lID0gcmVwb3Np
dG9yeS5uYW1lOwogICAgICAgICBjb25zb2xlLmFzc2VydChpdGVyYXRpb24ucmV2aXNpb25bcmVw
b3NpdG9yeU5hbWVdKTsKKyAgICAgICAgdmFyIHRyYWMgPSByZXBvc2l0b3J5LnRyYWM7CiAgICAg
ICAgIHZhciBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAg
ICBjb250ZW50LnRleHRDb250ZW50ID0gdGhpcy5fZm9ybWF0UmV2aXNpb25Gb3JEaXNwbGF5KGl0
ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0sIHJlcG9zaXRvcnkpOwogICAgICAgICBj
b250ZW50LmNsYXNzTGlzdC5hZGQoInJldmlzaW9uLW51bWJlciIpOwogCi0gICAgICAgIGlmIChw
cmV2aW91c0l0ZXJhdGlvbikgeworICAgICAgICBpZiAocHJldmlvdXNJdGVyYXRpb24gJiYgdHJh
Yy5pbmRleE9mUmV2aXNpb24ocHJldmlvdXNJdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9yeU5h
bWVdKSA+IC0xICYmIHRyYWMuaW5kZXhPZlJldmlzaW9uKGl0ZXJhdGlvbi5yZXZpc2lvbltyZXBv
c2l0b3J5TmFtZV0pID4gLTEpIHsKICAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KHByZXZpb3Vz
SXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSk7CiAgICAgICAgICAgICB2YXIgY29u
dGV4dCA9IHsKICAgICAgICAgICAgICAgICB0cmFjOiByZXBvc2l0b3J5LnRyYWMsCiAgICAgICAg
ICAgICAgICAgYnJhbmNoOiBicmFuY2gsCi0gICAgICAgICAgICAgICAgZmlyc3RSZXZpc2lvbjog
cHJldmlvdXNJdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdICsgMSwKKyAgICAgICAg
ICAgICAgICBmaXJzdFJldmlzaW9uOiB0cmFjLm5leHRSZXZpc2lvbihicmFuY2gubmFtZSwgcHJl
dmlvdXNJdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdKSwKICAgICAgICAgICAgICAg
ICBsYXN0UmV2aXNpb246IGl0ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0KICAgICAg
ICAgICAgIH07CiAgICAgICAgICAgICBpZiAoY29udGV4dC5maXJzdFJldmlzaW9uIDw9IGNvbnRl
eHQubGFzdFJldmlzaW9uKQpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVp
bGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVHJhYy5q
cyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1Ymxp
Y19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1RyYWMuanMKaW5kZXggYTQ4OGQxYzE2YzdiZmEwMmYy
NGRiYzhmNTUxMzI1MjdkNGY1ZTJhOC4uNGQzODRkZjcxN2U2MTBmOThkOTM5MDQ4MGFmZjRlNjNl
M2FiMjA2MSAxMDA2NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0
Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVHJhYy5qcworKysgYi9U
b29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRt
bC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzCkBAIC02MywxMSArNjMsNDAgQEAgVHJhYy5wcm90
b3R5cGUgPSB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlY29yZGVkQ29tbWl0c1t0aGlzLnJlY29y
ZGVkQ29tbWl0cy5sZW5ndGggLSAxXS5yZXZpc2lvbk51bWJlcjsKICAgICB9LAogCi0gICAgY29t
bWl0c09uQnJhbmNoOiBmdW5jdGlvbihicmFuY2hOYW1lLCBmaWx0ZXIpCisgICAgX2NvbW1pdHNP
bkJyYW5jaDogZnVuY3Rpb24oYnJhbmNoTmFtZSwgYmVnaW5Qb3NpdGlvbiwgZW5kUG9zaXRpb24p
CiAgICAgewotICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRlZENvbW1pdHMuZmlsdGVyKGZ1bmN0
aW9uKGNvbW1pdCwgaW5kZXgsIGFycmF5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKCFjb21taXQu
Y29udGFpbnNCcmFuY2hMb2NhdGlvbiB8fCBjb21taXQuYnJhbmNoZXMuaW5jbHVkZXMoYnJhbmNo
TmFtZSkpICYmIGZpbHRlcihjb21taXQsIGluZGV4LCBhcnJheSk7Ci0gICAgICAgIH0pOworICAg
ICAgICBiZWdpblBvc2l0aW9uID0gYmVnaW5Qb3NpdGlvbiB8fCAwOworICAgICAgICBpZiAoZW5k
UG9zaXRpb24gPT09IHVuZGVmaW5lZCkKKyAgICAgICAgICAgIGVuZFBvc2l0aW9uID0gdGhpcy5y
ZWNvcmRlZENvbW1pdHMubGVuZ3RoIC0gMTsKKyAgICAgICAgdmFyIGNvbW1pdHMgPSBbXTsKKyAg
ICAgICAgZm9yICh2YXIgaSA9IGJlZ2luUG9zaXRpb247IGkgPD0gZW5kUG9zaXRpb247ICsraSkg
eworICAgICAgICAgICAgdmFyIGNvbW1pdCA9IHRoaXMucmVjb3JkZWRDb21taXRzW2ldOworICAg
ICAgICAgICAgaWYgKCFjb21taXQuY29udGFpbnNCcmFuY2hMb2NhdGlvbiB8fCBjb21taXQuYnJh
bmNoZXMuaW5jbHVkZXMoYnJhbmNoTmFtZSkpCisgICAgICAgICAgICAgICAgY29tbWl0cy5wdXNo
KGNvbW1pdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbW1pdHM7CisgICAgfSwKKwor
ICAgIGNvbW1pdHNPbkJyYW5jaExhdGVyVGhhblJldmlzaW9uOiBmdW5jdGlvbihicmFuY2hOYW1l
LCByZXZpc2lvbikKKyAgICB7CisgICAgICAgIHZhciBpbmRleFRvQmVMYXRlclRoYW4gPSB0aGlz
LmluZGV4T2ZSZXZpc2lvbihyZXZpc2lvbik7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGluZGV4
VG9CZUxhdGVyVGhhbiAhPT0gLTEsIHJldmlzaW9uICsgIiBpcyBub3QgaW4gdGhlIGxpc3Qgb2Yg
cmVjb3JkZWQgY29tbWl0cyIpOworICAgICAgICBpZiAoaW5kZXhUb0JlTGF0ZXJUaGFuID09PSAt
MSkKKyAgICAgICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2NvbW1pdHNP
bkJyYW5jaChicmFuY2hOYW1lLCBpbmRleFRvQmVMYXRlclRoYW4gKyAxKTsKKyAgICB9LAorCisg
ICAgY29tbWl0c09uQnJhbmNoSW5SZXZpc2lvblJhbmdlOiBmdW5jdGlvbihicmFuY2hOYW1lLCBm
aXJzdFJldmlzaW9uLCBsYXN0UmV2aXNpb24pCisgICAgeworICAgICAgICB2YXIgaW5kZXhPZkZp
cnN0UmV2aXNpb24gPSB0aGlzLmluZGV4T2ZSZXZpc2lvbihmaXJzdFJldmlzaW9uKTsKKyAgICAg
ICAgY29uc29sZS5hc3NlcnQoaW5kZXhPZkZpcnN0UmV2aXNpb24gIT09IC0xLCBmaXJzdFJldmlz
aW9uICsgIiBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgcmVjb3JkZWQgY29tbWl0cyIpOworICAgICAg
ICBpZiAoaW5kZXhPZkZpcnN0UmV2aXNpb24gPT09IC0xKQorICAgICAgICAgICAgcmV0dXJuIFtd
OworICAgICAgICB2YXIgaW5kZXhPZkxhc3RSZXZpc2lvbiA9IHRoaXMuaW5kZXhPZlJldmlzaW9u
KGxhc3RSZXZpc2lvbik7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGluZGV4T2ZMYXN0UmV2aXNp
b24gIT09IC0xLCBpbmRleE9mTGFzdFJldmlzaW9uICsgIiBpcyBub3QgaW4gdGhlIGxpc3Qgb2Yg
cmVjb3JkZWQgY29tbWl0cyIpOworICAgICAgICBpZiAoaW5kZXhPZkxhc3RSZXZpc2lvbiA9PT0g
LTEpCisgICAgICAgICAgICByZXR1cm4gW107CisgICAgICAgIHJldHVybiB0aGlzLl9jb21taXRz
T25CcmFuY2goYnJhbmNoTmFtZSwgaW5kZXhPZkZpcnN0UmV2aXNpb24sIGluZGV4T2ZMYXN0UmV2
aXNpb24pOwogICAgIH0sCiAKICAgICByZXZpc2lvblVSTDogZnVuY3Rpb24ocmV2aXNpb24pCkBA
IC0yNjYsNCArMjk1LDIxIEBAIFRyYWMucHJvdG90eXBlID0gewogICAgICAgICAgICAgdGhpcy5f
bG9hZGVkKGRhdGFEb2N1bWVudCk7CiAgICAgICAgIH0uYmluZCh0aGlzKSwgdGhpcy5fbmVlZHNB
dXRoZW50aWNhdGlvbiA/IHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0gOiB7fSk7CiAgICAgfSwK
KworICAgIG5leHRSZXZpc2lvbjogZnVuY3Rpb24oYnJhbmNoTmFtZSwgcmV2aXNpb24pCisgICAg
eworICAgICAgICB2YXIgY29tbWl0cyA9IHRoaXMuY29tbWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2
aXNpb24oYnJhbmNoTmFtZSwgcmV2aXNpb24pOworICAgICAgICBpZiAoY29tbWl0cy5sZW5ndGgg
PiAwKQorICAgICAgICAgICAgcmV0dXJuIGNvbW1pdHNbMF0ucmV2aXNpb25OdW1iZXI7CisgICAg
ICAgIHJldHVybiB1bmRlZmluZWQ7CisgICAgfSwKKworICAgIGluZGV4T2ZSZXZpc2lvbjogZnVu
Y3Rpb24ocmV2aXNpb24pCisgICAgeworICAgICAgICB2YXIgY29tbWl0cyA9IHRoaXMucmVjb3Jk
ZWRDb21taXRzOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1pdHMubGVuZ3RoOyAr
K2kpCisgICAgICAgICAgICBpZiAoY29tbWl0c1tpXS5yZXZpc2lvbk51bWJlciA9PT0gcmV2aXNp
b24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9
LAogfTsKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5v
cmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzIGIv
VG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0
bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanMKaW5kZXggMzY2ZjAwYmM1ZTdmMmM4
OTkwODM0MzNhOTdiNTkwYzllYmNiMjYzYS4uNDQ5NDIwYTU0MzFiMmRhNDEyYjAzMzBkNjA4YTY4
OTdjMWM0YzEwYSAxMDA2NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Vi
a2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMu
anMKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanMKQEAgLTcyLDYgKzcy
LDQwIEBAIHRlc3QoIl9wYXJzZVJldmlzaW9uRnJvbVVSTCIsIGZ1bmN0aW9uKCkKICAgICBzdHJp
Y3RFcXVhbCh0aGlzLnRyYWMuX3BhcnNlUmV2aXNpb25Gcm9tVVJMKCJodHRwczovL2dpdC5mb29i
YXIuY29tL3RyYWMvV2hhdGV2ZXIuZ2l0L2NoYW5nZXNldC8wZTQ5OGRiNWQ4ZTViNWEzNDI2MzEi
KSwgIjBlNDk4ZGI1ZDhlNWI1YTM0MjYzMSIsICJHaXQiKTsKIH0pOwogCit0ZXN0KCJuZXh0UmV2
aXNpb24iLCBmdW5jdGlvbigpCit7CisgICAgdGhpcy50cmFjLnJlY29yZGVkQ29tbWl0cyA9IE1v
Y2tUcmFjLkVYQU1QTEVfVFJBQ19DT01NSVRTOworICAgIHN0cmljdEVxdWFsKHRoaXMudHJhYy5u
ZXh0UmV2aXNpb24oInRydW5rIiwgMzMwMjApLCAzMzAyMiwgIm5leHRSZXZpc2lvbiBzYW1lIGJy
YW5jaCIpOworICAgIHN0cmljdEVxdWFsKHRoaXMudHJhYy5uZXh0UmV2aXNpb24oInRydW5rIiwg
MzMwMTkpLCAzMzAyMCwgIm5leHRSZXZpc2lvbiBkaWZmZXJlbnQgYnJhbmNoIik7Cit9KTsKKwor
dGVzdCgiaW5kZXhPZlJldmlzaW9uIiwgZnVuY3Rpb24oKQoreworICAgIHRoaXMudHJhYy5yZWNv
cmRlZENvbW1pdHMgPSBNb2NrVHJhYy5FWEFNUExFX1RSQUNfQ09NTUlUUzsKKyAgICBzdHJpY3RF
cXVhbCh0aGlzLnRyYWMuaW5kZXhPZlJldmlzaW9uKDMzMDIwKSwgMiwgImluZGV4T2ZSZXZpc2lv
biIpOworfSk7CisKK3Rlc3QoImNvbW1pdHNPbkJyYW5jaExhdGVyVGhhblJldmlzaW9uIiwgZnVu
Y3Rpb24oKQoreworICAgIHRoaXMudHJhYy5yZWNvcmRlZENvbW1pdHMgPSBNb2NrVHJhYy5FWEFN
UExFX1RSQUNfQ09NTUlUUzsKKyAgICB2YXIgY29tbWl0cyA9IHRoaXMudHJhYy5jb21taXRzT25C
cmFuY2hMYXRlclRoYW5SZXZpc2lvbigidHJ1bmsiLCAzMzAyMCk7CisgICAgZXF1YWwoY29tbWl0
cy5sZW5ndGgsIDEsICJncmVhdGVyIHRoYW4gMzMwMjAiKTsKK30pOworCit0ZXN0KCJjb21taXRz
T25CcmFuY2hMYXRlclRoYW5SZXZpc2lvbiBubyBjb21taXRzIiwgZnVuY3Rpb24oKQoreworICAg
IHRoaXMudHJhYy5yZWNvcmRlZENvbW1pdHMgPSBNb2NrVHJhYy5FWEFNUExFX1RSQUNfQ09NTUlU
UzsKKyAgICB2YXIgY29tbWl0cyA9IHRoaXMudHJhYy5jb21taXRzT25CcmFuY2hMYXRlclRoYW5S
ZXZpc2lvbigic29tZU90aGVyQnJhbmNoIiwgIjMzMDIxIik7CisgICAgZXF1YWwoY29tbWl0cy5s
ZW5ndGgsIDAsICJncmVhdGVyIHRoYW4gMzMwMjEiKTsKK30pOworCit0ZXN0KCJjb21taXRzT25C
cmFuY2hJblJldmlzaW9uUmFuZ2UiLCBmdW5jdGlvbigpCit7CisgICAgdGhpcy50cmFjLnJlY29y
ZGVkQ29tbWl0cyA9IE1vY2tUcmFjLkVYQU1QTEVfVFJBQ19DT01NSVRTOworICAgIHZhciBjb21t
aXRzID0gdGhpcy50cmFjLmNvbW1pdHNPbkJyYW5jaEluUmV2aXNpb25SYW5nZSgidHJ1bmsiLCAz
MzAyMCwgMzMwMjIpOworICAgIGVxdWFsKGNvbW1pdHMubGVuZ3RoLCAyLCAiaW4gcmFuZ2UgMzMw
MjAsIDMzMDIyIik7Cit9KTsKKwogbW9kdWxlKCJCdWlsZEJvdFF1ZXVlVmlldyIsIHsKICAgICBz
ZXR1cDogZnVuY3Rpb24oKSB7CiAgICAgICAgIHRoaXMudHJhYyA9IG5ldyBNb2NrVHJhYygpOwpA
QCAtMTEzLDYgKzE0NywzMiBAQCB0ZXN0KCJfcHJlc2VudFBvcG92ZXJGb3JQZW5kaW5nQ29tbWl0
cyIsIGZ1bmN0aW9uKCkKICAgICBzdHJpY3RFcXVhbChub2RlTGlzdC5sZW5ndGgsIDEsICJoYXMg
MSBwZW5kaW5nIGNvbW1pdCIpOwogfSk7CiAKK3Rlc3QoIl9wcmVzZW50UG9wb3ZlckZvclBlbmRp
bmdDb21taXRzIG5vIHBlbmRpbmcgY29tbWl0cyIsIGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLnNv
bWVPdGhlckJyYW5jaCA9IHsKKyAgICAgICAgbmFtZTogInNvbWVPdGhlckJyYW5jaCIsCisgICAg
ICAgIHJlcG9zaXRvcnk6IHsKKyAgICAgICAgICAgIG5hbWU6ICJvcGVuU291cmNlIiwKKyAgICAg
ICAgICAgIHRyYWM6IHRoaXMudHJhYywKKyAgICAgICAgICAgIGlzU1ZOOiB0cnVlLAorICAgICAg
ICB9CisgICAgfTsKKyAgICB0aGlzLnF1ZXVlLmJyYW5jaGVzID0gW3RoaXMuc29tZU90aGVyQnJh
bmNoXTsKKyAgICB0aGlzLnZpZXcuX2xhdGVzdFByb2R1Y3RpdmVJdGVyYXRpb24gPSBmdW5jdGlv
bihxdWV1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICByZXZpc2lvbjog
eworICAgICAgICAgICAgICAgICJvcGVuU291cmNlIjogIjMzMDIxIgorICAgICAgICAgICAgfQor
ICAgICAgICB9OworICAgIH0KKyAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoImRpdiIpOworICAgIHZhciBwb3BvdmVyID0gbmV3IERhc2hib2FyZC5Qb3BvdmVyKCk7Cisg
ICAgdGhpcy52aWV3Ll9wcmVzZW50UG9wb3ZlckZvclBlbmRpbmdDb21taXRzKGVsZW1lbnQsIHBv
cG92ZXIsIHRoaXMucXVldWUpOworICAgIHZhciBub2RlTGlzdCA9IHBvcG92ZXIuX2VsZW1lbnQu
Z2V0RWxlbWVudHNCeUNsYXNzTmFtZSgicGVuZGluZy1jb21taXQiKTsKKyAgICBzdHJpY3RFcXVh
bChub2RlTGlzdC5sZW5ndGgsIDAsICJoYXMgMCBwZW5kaW5nIGNvbW1pdHMiKTsKK30pOworCiB0
ZXN0KCJfcHJlc2VudFBvcG92ZXJGb3JSZXZpc2lvblJhbmdlIiwgZnVuY3Rpb24oKQogewogICAg
IHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CkBAIC0xOTEsMTIg
KzI1MSwxMyBAQCB0ZXN0KCJfZm9ybWF0UmV2aXNpb25Gb3JEaXNwbGF5IEdpdCIsIGZ1bmN0aW9u
KCkKIAogbW9kdWxlKCJCdWlsZEJvdFF1ZXVlIiwgewogICAgIHNldHVwOiBmdW5jdGlvbigpIHsK
KyAgICAgICAgRGFzaGJvYXJkLlJlcG9zaXRvcnkuT3BlblNvdXJjZS50cmFjID0gbmV3IE1vY2tU
cmFjKCk7CisgICAgICAgIERhc2hib2FyZC5SZXBvc2l0b3J5Lk9wZW5Tb3VyY2UudHJhYy5yZWNv
cmRlZENvbW1pdHMgPSBNb2NrVHJhYy5FWEFNUExFX1RSQUNfQ09NTUlUUzsKKyAgICAgICAgRGFz
aGJvYXJkLlJlcG9zaXRvcnkuSW50ZXJuYWwudHJhYyA9IG5ldyBNb2NrVHJhYygpOwogICAgICAg
ICB0aGlzLnF1ZXVlID0gbmV3IE1vY2tCdWlsZGJvdFF1ZXVlKCk7CiAgICAgICAgIHRoaXMucXVl
dWUuYnJhbmNoZXMgPSBbewogICAgICAgICAgICAgbmFtZTogInRydW5rIiwKLSAgICAgICAgICAg
IHJlcG9zaXRvcnk6IHsKLSAgICAgICAgICAgICAgICBuYW1lOiAib3BlblNvdXJjZSIsCi0gICAg
ICAgICAgICB9CisgICAgICAgICAgICByZXBvc2l0b3J5OiBEYXNoYm9hcmQuUmVwb3NpdG9yeS5P
cGVuc291cmNlCiAgICAgICAgIH1dOwogICAgIH0KIH0pOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>270708</attachid>
            <date>2016-02-04 17:45:25 -0800</date>
            <delta_ts>2016-02-06 20:56:10 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152345-20160204174502.patch</filename>
            <type>text/plain</type>
            <size>15221</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk2MTU4CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggYTE5ZGQ1Y2FkMDAwNjkxZTRiZWIyZTM3M2FmZGY1YzU1
ZmJmMWY3Zi4uZDE4MmU1MGFjYWM2ZGU0YjlmOTZmZjZhNDc0MzRlZTkwYTVmN2UwYyAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDMx
IEBACiAyMDE2LTAyLTA0ICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgogCisg
ICAgICAgIFRlYWNoIGRhc2hib2FyZCBjb2RlIHRvIGNvbXBhcmUgbm9uLWludGVnZXIgcmV2aXNp
b25zCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTIz
NDUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIEJ1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanM6CisgICAgICAgIChCdWlsZGJvdFF1ZXVlLnBy
b3RvdHlwZS5jb21wYXJlSXRlcmF0aW9uc0J5UmV2aXNpb25zKTogQ29tcGFyZSBub24taW50ZWdl
ciByZXZpc2lvbnMuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcu
anM6CisgICAgICAgIChCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUuX2FwcGVuZFBlbmRpbmdS
ZXZpc2lvbkNvdW50KTogVXNlIFRyYWMuaW5kZXhPZlJldmlzaW9uIGluIG9yZGVyIHRvIGNvbXBh
cmUgbm9uLWludGVnZXIKKyAgICAgICAgcmV2aXNpb25zLiBBbHNvIHVzZXMgbmV3IFRyYWMuY29t
bWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24gbWV0aG9kLgorICAgICAgICAoQnVpbGRib3RR
dWV1ZVZpZXcucHJvdG90eXBlLl9wb3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSk6IERpdHRvLgor
ICAgICAgICAoQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLl9wcmVzZW50UG9wb3ZlckZvclBl
bmRpbmdDb21taXRzKTogVXNlIFRyYWMuaW5kZXhPZlJldmlzaW9uIGluIG9yZGVyIHRvIGNvbXBh
cmUgbm9uLWludGVnZXIKKyAgICAgICAgcmV2aXNpb25zLiBBbHNvIHVzZXMgbmV3IFRyYWMubmV4
dFJldmlzaW9uIG1ldGhvZCB0byBjYWxjdWxhdGUgYSByZXZpc2lvbiByYW5nZS4KKyAgICAgICAg
KEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZS5fcmV2aXNpb25Db250ZW50V2l0aFBvcG92ZXJG
b3JJdGVyYXRpb24pOiBEaXR0by4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzOgor
ICAgICAgICAoVHJhYy5wcm90b3R5cGUuX2NvbW1pdHNPbkJyYW5jaCk6IFJlbmFtZWQgdGhpcyB0
byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZCBiZSBhIHByaXZhdGUgbWV0aG9kIHVzZWQgYnkgdGhl
IGxhdHRlciB0d28gbmV3CisgICAgICAgIG1ldGhvZHMuCisgICAgICAgIChUcmFjLnByb3RvdHlw
ZS5jb21taXRzT25CcmFuY2hMYXRlclRoYW5SZXZpc2lvbik6IEZpbmRzIHJldmlzaW9ucyBvbiBh
IGJyYW5jaCBsYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgcmV2aXNpb24uCisgICAgICAgIChUcmFj
LnByb3RvdHlwZS5jb21taXRzT25CcmFuY2hJblJldmlzaW9uUmFuZ2UpOiBGaW5kcyByZXZpc2lv
bnMgb24gYSBicmFuY2ggd2l0aGluIGEgc3BlY2lmaWVkIHJhbmdlLgorICAgICAgICAoVHJhYy5w
cm90b3R5cGUubmV4dFJldmlzaW9uKTogRmluZHMgdGhlIG5leHQgcmV2aXNpb24gYWZ0ZXIgYSBn
aXZlbiByZXZpc2lvbiBvbiBhIHNwZWNpZmljIGJyYW5jaC4KKyAgICAgICAgKFRyYWMucHJvdG90
eXBlLmluZGV4T2ZSZXZpc2lvbik6IEZpbmRzIHRoZSBpbmRleCBvZiBhIGdpdmVuIHJldmlzaW9u
IHdpdGhpbiB0aGUgcmVjb3JkZWRDb21taXRzIGFycmF5LgorICAgICAgICAoVHJhYy5wcm90b3R5
cGUuY29tbWl0c09uQnJhbmNoKTogRGVsZXRlZC4gUmVuYW1lZCB0byBfY29tbWl0c09uQnJhbmNo
LgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1
YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzOiBBZGRlZCB1bml0IHRl
c3RzLgorCisyMDE2LTAyLTA0ICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgor
CiAgICAgICAgIFRoZSBzdGF0dXMgbWVzc2FnZSBmb3IgcGFzc2luZyBjb21iaW5lZCBidWlsZGVy
IHF1ZXVlcyBzaG91bGQgc2F5ICJhbGwgYnVpbGRzIHN1Y2NlZWRlZCIgd2hlbiBleHBhbmRlZC4K
ICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1Mzg4Mgog
CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNv
bmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1ZXVlLmpzIGIvVG9v
bHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwv
ZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZS5qcwppbmRleCA3NzE5OGQwYmRlNjM3ZmRh
ZjdlYWY2ODViZTA4MzI2NzQwMmJlNmRlLi5iZTcyOTc1NTFjN2JhNzg5OTc3ZjU0ODYxMDc4Y2I0
NzMzZDZiYjUxIDEwMDY0NAotLS0gYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJr
aXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1ZXVl
LmpzCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmln
L3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanMKQEAgLTI4NSw5
ICsyODUsMTUgQEAgQnVpbGRib3RRdWV1ZS5wcm90b3R5cGUgPSB7CiAgICAgICAgIHZhciBzb3J0
ZWRSZXBvc2l0b3JpZXMgPSBEYXNoYm9hcmQuc29ydGVkUmVwb3NpdG9yaWVzOwogICAgICAgICBm
b3IgKHZhciBpID0gMDsgaSA8IHNvcnRlZFJlcG9zaXRvcmllcy5sZW5ndGg7ICsraSkgewogICAg
ICAgICAgICAgdmFyIHJlcG9zaXRvcnlOYW1lID0gc29ydGVkUmVwb3NpdG9yaWVzW2ldLm5hbWU7
Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0gLSBh
LnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIHZhciB0cmFjID0gc29ydGVk
UmVwb3NpdG9yaWVzW2ldLnRyYWM7CisgICAgICAgICAgICBjb25zb2xlLmFzc2VydCh0cmFjKTsK
KyAgICAgICAgICAgIHZhciBpbmRleEEgPSB0cmFjLmluZGV4T2ZSZXZpc2lvbihhLnJldmlzaW9u
W3JlcG9zaXRvcnlOYW1lXSk7CisgICAgICAgICAgICB2YXIgaW5kZXhCID0gdHJhYy5pbmRleE9m
UmV2aXNpb24oYi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0pOworICAgICAgICAgICAgaWYgKGlu
ZGV4QSA+IC0xICYmIGluZGV4QiA+IC0xKSB7CisgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9
IGluZGV4QiAtIGluZGV4QTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAg
ICAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWls
ZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJv
dFF1ZXVlVmlldy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWVWaWV3Lmpz
CmluZGV4IGUxN2ZiNjNhNDRlNzQ1MmMzMzE3OTE5ZGU1NDQyODlkNzc5M2Q1NGYuLjNiODg4Y2Y4
YWRhNzg0MzFmMmQwYmZmYzkyZjFlOTc3YmRhMTJmMmUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0J1aWxk
U2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2Fy
ZC9TY3JpcHRzL0J1aWxkYm90UXVldWVWaWV3LmpzCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBw
b3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRz
L0J1aWxkYm90UXVldWVWaWV3LmpzCkBAIC05NCwxMiArOTQsMTIgQEAgQnVpbGRib3RRdWV1ZVZp
ZXcucHJvdG90eXBlID0gewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAg
aWYgKCF0cmFjKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKCF0
cmFjLmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIgfHwgdHJhYy5vbGRlc3RSZWNvcmRlZFJl
dmlzaW9uTnVtYmVyID4gbGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyKSB7CisgICAgICAg
ICAgICBpZiAoIXRyYWMubGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlciB8fCB0cmFjLmluZGV4
T2ZSZXZpc2lvbih0cmFjLm9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpID4gdHJhYy5pbmRl
eE9mUmV2aXNpb24obGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyKSkgewogICAgICAgICAg
ICAgICAgIHRyYWMubG9hZE1vcmVIaXN0b3JpY2FsRGF0YSgpOwogICAgICAgICAgICAgICAgIHJl
dHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdG90YWxSZXZpc2lvbnNCZWhpbmQg
Kz0gdHJhYy5jb21taXRzT25CcmFuY2goYnJhbmNoLm5hbWUsIGZ1bmN0aW9uKGNvbW1pdCkgeyBy
ZXR1cm4gY29tbWl0LnJldmlzaW9uTnVtYmVyID4gbGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVt
YmVyOyB9KS5sZW5ndGg7CisgICAgICAgICAgICB0b3RhbFJldmlzaW9uc0JlaGluZCArPSB0cmFj
LmNvbW1pdHNPbkJyYW5jaExhdGVyVGhhblJldmlzaW9uKGJyYW5jaC5uYW1lLCBsYXRlc3RQcm9k
dWN0aXZlUmV2aXNpb25OdW1iZXIpLmxlbmd0aDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgh
dG90YWxSZXZpc2lvbnNCZWhpbmQpCkBAIC0xNDAsMTEgKzE0MCwxMSBAQCBCdWlsZGJvdFF1ZXVl
Vmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9
CiAKLSAgICAgICAgY29uc29sZS5hc3NlcnQodHJhYy5vbGRlc3RSZWNvcmRlZFJldmlzaW9uTnVt
YmVyIDw9IGZpcnN0UmV2aXNpb25OdW1iZXIpOworICAgICAgICBjb25zb2xlLmFzc2VydCh0cmFj
LmluZGV4T2ZSZXZpc2lvbih0cmFjLm9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpIDw9IHRy
YWMuaW5kZXhPZlJldmlzaW9uKGZpcnN0UmV2aXNpb25OdW1iZXIpKTsKIAogICAgICAgICAvLyBG
SVhNRTogVG8gYmUgMTAwJSBjb3JyZWN0LCB3ZSBzaG91bGQgYWxzbyBmaWx0ZXIgb3V0IGNoYW5n
ZXMgdGhhdCBhcmUgaWdub3JlZCBieQogICAgICAgICAvLyB0aGUgcXVldWUsIHNlZSBfc2hvdWxk
X2ZpbGVfdHJpZ2dlcl9idWlsZCBpbiB3a2J1aWxkLnB5LgotICAgICAgICB2YXIgY29tbWl0cyA9
IHRyYWMuY29tbWl0c09uQnJhbmNoKGJyYW5jaC5uYW1lLCBmdW5jdGlvbihjb21taXQpIHsgcmV0
dXJuIGNvbW1pdC5yZXZpc2lvbk51bWJlciA+PSBmaXJzdFJldmlzaW9uTnVtYmVyICYmIGNvbW1p
dC5yZXZpc2lvbk51bWJlciA8PSBsYXN0UmV2aXNpb25OdW1iZXI7IH0pOworICAgICAgICB2YXIg
Y29tbWl0cyA9IHRyYWMuY29tbWl0c09uQnJhbmNoSW5SZXZpc2lvblJhbmdlKGJyYW5jaC5uYW1l
LCBmaXJzdFJldmlzaW9uTnVtYmVyLCBsYXN0UmV2aXNpb25OdW1iZXIpOwogICAgICAgICByZXR1
cm4gY29tbWl0cy5tYXAoZnVuY3Rpb24oY29tbWl0KSB7CiAgICAgICAgICAgICByZXR1cm4gbGlu
ZUZvckNvbW1pdC5jYWxsKHRoaXMsIHRyYWMsIGNvbW1pdCk7CiAgICAgICAgIH0sIHRoaXMpLnJl
dmVyc2UoKTsKQEAgLTE2Nyw5ICsxNjcsMTAgQEAgQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBl
ID0gewogICAgICAgICAgICAgdmFyIHJlcG9zaXRvcnlOYW1lID0gcmVwb3NpdG9yeS5uYW1lOwog
ICAgICAgICAgICAgdmFyIHRyYWMgPSByZXBvc2l0b3J5LnRyYWM7CiAgICAgICAgICAgICB2YXIg
bGF0ZXN0UHJvZHVjdGl2ZVJldmlzaW9uTnVtYmVyID0gbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlv
bi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV07Ci0gICAgICAgICAgICBpZiAoIWxhdGVzdFByb2R1
Y3RpdmVSZXZpc2lvbk51bWJlciB8fCAhdHJhYy5sYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVy
KQorICAgICAgICAgICAgdmFyIG5leHRSZXZpc2lvbiA9IHRyYWMubmV4dFJldmlzaW9uKGJyYW5j
aC5uYW1lLCBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIpOworICAgICAgICAgICAgaWYg
KCFsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIgfHwgIXRyYWMubGF0ZXN0UmVjb3JkZWRS
ZXZpc2lvbk51bWJlciB8fCAhbmV4dFJldmlzaW9uKQogICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5fcG9wb3ZlckxpbmVzRm9yQ29tbWl0UmFu
Z2UodHJhYywgYnJhbmNoLCBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1iZXIgKyAxLCB0cmFj
LmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpOworICAgICAgICAgICAgdmFyIGxpbmVzID0g
dGhpcy5fcG9wb3ZlckxpbmVzRm9yQ29tbWl0UmFuZ2UodHJhYywgYnJhbmNoLCBuZXh0UmV2aXNp
b24sIHRyYWMubGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlcik7CiAgICAgICAgICAgICB2YXIg
bGVuZ3RoID0gbGluZXMubGVuZ3RoOwogICAgICAgICAgICAgaWYgKGxlbmd0aCAmJiBzaG91bGRB
ZGREaXZpZGVyKQogICAgICAgICAgICAgICAgIHRoaXMuX2FkZERpdmlkZXJUb1BvcG92ZXIoY29u
dGVudCk7CkBAIC0yMjAsMTYgKzIyMSwxNyBAQCBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUg
PSB7CiAgICAgICAgIHZhciByZXBvc2l0b3J5ID0gYnJhbmNoLnJlcG9zaXRvcnk7CiAgICAgICAg
IHZhciByZXBvc2l0b3J5TmFtZSA9IHJlcG9zaXRvcnkubmFtZTsKICAgICAgICAgY29uc29sZS5h
c3NlcnQoaXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSk7CisgICAgICAgIHZhciB0
cmFjID0gcmVwb3NpdG9yeS50cmFjOwogICAgICAgICB2YXIgY29udGVudCA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgY29udGVudC50ZXh0Q29udGVudCA9IHRoaXMu
X2Zvcm1hdFJldmlzaW9uRm9yRGlzcGxheShpdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9yeU5h
bWVdLCByZXBvc2l0b3J5KTsKICAgICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKCJyZXZpc2lv
bi1udW1iZXIiKTsKIAotICAgICAgICBpZiAocHJldmlvdXNJdGVyYXRpb24pIHsKKyAgICAgICAg
aWYgKHByZXZpb3VzSXRlcmF0aW9uICYmIHRyYWMuaW5kZXhPZlJldmlzaW9uKHByZXZpb3VzSXRl
cmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSkgPiAtMSAmJiB0cmFjLmluZGV4T2ZSZXZp
c2lvbihpdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdKSA+IC0xKSB7CiAgICAgICAg
ICAgICBjb25zb2xlLmFzc2VydChwcmV2aW91c0l0ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5
TmFtZV0pOwogICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB7CiAgICAgICAgICAgICAgICAgdHJh
YzogcmVwb3NpdG9yeS50cmFjLAogICAgICAgICAgICAgICAgIGJyYW5jaDogYnJhbmNoLAotICAg
ICAgICAgICAgICAgIGZpcnN0UmV2aXNpb246IHByZXZpb3VzSXRlcmF0aW9uLnJldmlzaW9uW3Jl
cG9zaXRvcnlOYW1lXSArIDEsCisgICAgICAgICAgICAgICAgZmlyc3RSZXZpc2lvbjogdHJhYy5u
ZXh0UmV2aXNpb24oYnJhbmNoLm5hbWUsIHByZXZpb3VzSXRlcmF0aW9uLnJldmlzaW9uW3JlcG9z
aXRvcnlOYW1lXSksCiAgICAgICAgICAgICAgICAgbGFzdFJldmlzaW9uOiBpdGVyYXRpb24ucmV2
aXNpb25bcmVwb3NpdG9yeU5hbWVdCiAgICAgICAgICAgICB9OwogICAgICAgICAgICAgaWYgKGNv
bnRleHQuZmlyc3RSZXZpc2lvbiA8PSBjb250ZXh0Lmxhc3RSZXZpc2lvbikKZGlmZiAtLWdpdCBh
L1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19o
dG1sL2Rhc2hib2FyZC9TY3JpcHRzL1RyYWMuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9i
dWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFj
LmpzCmluZGV4IGE0ODhkMWMxNmM3YmZhMDJmMjRkYmM4ZjU1MTMyNTI3ZDRmNWUyYTguLjRkMzg0
ZGY3MTdlNjEwZjk4ZDkzOTA0ODBhZmY0ZTYzZTNhYjIwNjEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0J1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL1RyYWMuanMKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVHJhYy5qcwpA
QCAtNjMsMTEgKzYzLDQwIEBAIFRyYWMucHJvdG90eXBlID0gewogICAgICAgICByZXR1cm4gdGhp
cy5yZWNvcmRlZENvbW1pdHNbdGhpcy5yZWNvcmRlZENvbW1pdHMubGVuZ3RoIC0gMV0ucmV2aXNp
b25OdW1iZXI7CiAgICAgfSwKIAotICAgIGNvbW1pdHNPbkJyYW5jaDogZnVuY3Rpb24oYnJhbmNo
TmFtZSwgZmlsdGVyKQorICAgIF9jb21taXRzT25CcmFuY2g6IGZ1bmN0aW9uKGJyYW5jaE5hbWUs
IGJlZ2luUG9zaXRpb24sIGVuZFBvc2l0aW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMu
cmVjb3JkZWRDb21taXRzLmZpbHRlcihmdW5jdGlvbihjb21taXQsIGluZGV4LCBhcnJheSkgewot
ICAgICAgICAgICAgcmV0dXJuICghY29tbWl0LmNvbnRhaW5zQnJhbmNoTG9jYXRpb24gfHwgY29t
bWl0LmJyYW5jaGVzLmluY2x1ZGVzKGJyYW5jaE5hbWUpKSAmJiBmaWx0ZXIoY29tbWl0LCBpbmRl
eCwgYXJyYXkpOwotICAgICAgICB9KTsKKyAgICAgICAgYmVnaW5Qb3NpdGlvbiA9IGJlZ2luUG9z
aXRpb24gfHwgMDsKKyAgICAgICAgaWYgKGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQpCisgICAg
ICAgICAgICBlbmRQb3NpdGlvbiA9IHRoaXMucmVjb3JkZWRDb21taXRzLmxlbmd0aCAtIDE7Cisg
ICAgICAgIHZhciBjb21taXRzID0gW107CisgICAgICAgIGZvciAodmFyIGkgPSBiZWdpblBvc2l0
aW9uOyBpIDw9IGVuZFBvc2l0aW9uOyArK2kpIHsKKyAgICAgICAgICAgIHZhciBjb21taXQgPSB0
aGlzLnJlY29yZGVkQ29tbWl0c1tpXTsKKyAgICAgICAgICAgIGlmICghY29tbWl0LmNvbnRhaW5z
QnJhbmNoTG9jYXRpb24gfHwgY29tbWl0LmJyYW5jaGVzLmluY2x1ZGVzKGJyYW5jaE5hbWUpKQor
ICAgICAgICAgICAgICAgIGNvbW1pdHMucHVzaChjb21taXQpOworICAgICAgICB9CisgICAgICAg
IHJldHVybiBjb21taXRzOworICAgIH0sCisKKyAgICBjb21taXRzT25CcmFuY2hMYXRlclRoYW5S
ZXZpc2lvbjogZnVuY3Rpb24oYnJhbmNoTmFtZSwgcmV2aXNpb24pCisgICAgeworICAgICAgICB2
YXIgaW5kZXhUb0JlTGF0ZXJUaGFuID0gdGhpcy5pbmRleE9mUmV2aXNpb24ocmV2aXNpb24pOwor
ICAgICAgICBjb25zb2xlLmFzc2VydChpbmRleFRvQmVMYXRlclRoYW4gIT09IC0xLCByZXZpc2lv
biArICIgaXMgbm90IGluIHRoZSBsaXN0IG9mIHJlY29yZGVkIGNvbW1pdHMiKTsKKyAgICAgICAg
aWYgKGluZGV4VG9CZUxhdGVyVGhhbiA9PT0gLTEpCisgICAgICAgICAgICByZXR1cm4gW107Cisg
ICAgICAgIHJldHVybiB0aGlzLl9jb21taXRzT25CcmFuY2goYnJhbmNoTmFtZSwgaW5kZXhUb0Jl
TGF0ZXJUaGFuICsgMSk7CisgICAgfSwKKworICAgIGNvbW1pdHNPbkJyYW5jaEluUmV2aXNpb25S
YW5nZTogZnVuY3Rpb24oYnJhbmNoTmFtZSwgZmlyc3RSZXZpc2lvbiwgbGFzdFJldmlzaW9uKQor
ICAgIHsKKyAgICAgICAgdmFyIGluZGV4T2ZGaXJzdFJldmlzaW9uID0gdGhpcy5pbmRleE9mUmV2
aXNpb24oZmlyc3RSZXZpc2lvbik7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGluZGV4T2ZGaXJz
dFJldmlzaW9uICE9PSAtMSwgZmlyc3RSZXZpc2lvbiArICIgaXMgbm90IGluIHRoZSBsaXN0IG9m
IHJlY29yZGVkIGNvbW1pdHMiKTsKKyAgICAgICAgaWYgKGluZGV4T2ZGaXJzdFJldmlzaW9uID09
PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgdmFyIGluZGV4T2ZMYXN0UmV2
aXNpb24gPSB0aGlzLmluZGV4T2ZSZXZpc2lvbihsYXN0UmV2aXNpb24pOworICAgICAgICBjb25z
b2xlLmFzc2VydChpbmRleE9mTGFzdFJldmlzaW9uICE9PSAtMSwgaW5kZXhPZkxhc3RSZXZpc2lv
biArICIgaXMgbm90IGluIHRoZSBsaXN0IG9mIHJlY29yZGVkIGNvbW1pdHMiKTsKKyAgICAgICAg
aWYgKGluZGV4T2ZMYXN0UmV2aXNpb24gPT09IC0xKQorICAgICAgICAgICAgcmV0dXJuIFtdOwor
ICAgICAgICByZXR1cm4gdGhpcy5fY29tbWl0c09uQnJhbmNoKGJyYW5jaE5hbWUsIGluZGV4T2ZG
aXJzdFJldmlzaW9uLCBpbmRleE9mTGFzdFJldmlzaW9uKTsKICAgICB9LAogCiAgICAgcmV2aXNp
b25VUkw6IGZ1bmN0aW9uKHJldmlzaW9uKQpAQCAtMjY2LDQgKzI5NSwyMSBAQCBUcmFjLnByb3Rv
dHlwZSA9IHsKICAgICAgICAgICAgIHRoaXMuX2xvYWRlZChkYXRhRG9jdW1lbnQpOwogICAgICAg
ICB9LmJpbmQodGhpcyksIHRoaXMuX25lZWRzQXV0aGVudGljYXRpb24gPyB7IHdpdGhDcmVkZW50
aWFsczogdHJ1ZSB9IDoge30pOwogICAgIH0sCisKKyAgICBuZXh0UmV2aXNpb246IGZ1bmN0aW9u
KGJyYW5jaE5hbWUsIHJldmlzaW9uKQorICAgIHsKKyAgICAgICAgdmFyIGNvbW1pdHMgPSB0aGlz
LmNvbW1pdHNPbkJyYW5jaExhdGVyVGhhblJldmlzaW9uKGJyYW5jaE5hbWUsIHJldmlzaW9uKTsK
KyAgICAgICAgaWYgKGNvbW1pdHMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHJldHVybiBjb21t
aXRzWzBdLnJldmlzaW9uTnVtYmVyOworICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0s
CisKKyAgICBpbmRleE9mUmV2aXNpb246IGZ1bmN0aW9uKHJldmlzaW9uKQorICAgIHsKKyAgICAg
ICAgdmFyIGNvbW1pdHMgPSB0aGlzLnJlY29yZGVkQ29tbWl0czsKKyAgICAgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCBjb21taXRzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgaWYgKGNvbW1pdHNb
aV0ucmV2aXNpb25OdW1iZXIgPT09IHJldmlzaW9uKQorICAgICAgICAgICAgICAgIHJldHVybiBp
OworICAgICAgICByZXR1cm4gLTE7CisgICAgfSwKIH07CmRpZmYgLS1naXQgYS9Ub29scy9CdWls
ZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9h
cmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxk
LndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rl
c3RzLmpzCmluZGV4IDM2NmYwMGJjNWU3ZjJjODk5MDgzNDMzYTk3YjU5MGM5ZWJjYjI2M2EuLjA5
NjJhNGU2Y2ZhNmFhNzBhNzJlOGEyNTRjODQ2MWFhN2E5ZDFmZTYgMTAwNjQ0Ci0tLSBhL1Rvb2xz
L0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rh
c2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBw
b3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRz
L3Rlc3RzL3Rlc3RzLmpzCkBAIC03Miw2ICs3Miw0MCBAQCB0ZXN0KCJfcGFyc2VSZXZpc2lvbkZy
b21VUkwiLCBmdW5jdGlvbigpCiAgICAgc3RyaWN0RXF1YWwodGhpcy50cmFjLl9wYXJzZVJldmlz
aW9uRnJvbVVSTCgiaHR0cHM6Ly9naXQuZm9vYmFyLmNvbS90cmFjL1doYXRldmVyLmdpdC9jaGFu
Z2VzZXQvMGU0OThkYjVkOGU1YjVhMzQyNjMxIiksICIwZTQ5OGRiNWQ4ZTViNWEzNDI2MzEiLCAi
R2l0Iik7CiB9KTsKIAordGVzdCgibmV4dFJldmlzaW9uIiwgZnVuY3Rpb24oKQoreworICAgIHRo
aXMudHJhYy5yZWNvcmRlZENvbW1pdHMgPSBNb2NrVHJhYy5FWEFNUExFX1RSQUNfQ09NTUlUUzsK
KyAgICBzdHJpY3RFcXVhbCh0aGlzLnRyYWMubmV4dFJldmlzaW9uKCJ0cnVuayIsIDMzMDIwKSwg
MzMwMjIsICJuZXh0UmV2aXNpb24gc2FtZSBicmFuY2giKTsKKyAgICBzdHJpY3RFcXVhbCh0aGlz
LnRyYWMubmV4dFJldmlzaW9uKCJ0cnVuayIsIDMzMDE5KSwgMzMwMjAsICJuZXh0UmV2aXNpb24g
ZGlmZmVyZW50IGJyYW5jaCIpOworfSk7CisKK3Rlc3QoImluZGV4T2ZSZXZpc2lvbiIsIGZ1bmN0
aW9uKCkKK3sKKyAgICB0aGlzLnRyYWMucmVjb3JkZWRDb21taXRzID0gTW9ja1RyYWMuRVhBTVBM
RV9UUkFDX0NPTU1JVFM7CisgICAgc3RyaWN0RXF1YWwodGhpcy50cmFjLmluZGV4T2ZSZXZpc2lv
bigzMzAyMCksIDIsICJpbmRleE9mUmV2aXNpb24iKTsKK30pOworCit0ZXN0KCJjb21taXRzT25C
cmFuY2hMYXRlclRoYW5SZXZpc2lvbiIsIGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLnRyYWMucmVj
b3JkZWRDb21taXRzID0gTW9ja1RyYWMuRVhBTVBMRV9UUkFDX0NPTU1JVFM7CisgICAgdmFyIGNv
bW1pdHMgPSB0aGlzLnRyYWMuY29tbWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24oInRydW5r
IiwgMzMwMjApOworICAgIGVxdWFsKGNvbW1pdHMubGVuZ3RoLCAxLCAiZ3JlYXRlciB0aGFuIDMz
MDIwIik7Cit9KTsKKwordGVzdCgiY29tbWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24gbm8g
Y29tbWl0cyIsIGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLnRyYWMucmVjb3JkZWRDb21taXRzID0g
TW9ja1RyYWMuRVhBTVBMRV9UUkFDX0NPTU1JVFM7CisgICAgdmFyIGNvbW1pdHMgPSB0aGlzLnRy
YWMuY29tbWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24oInNvbWVPdGhlckJyYW5jaCIsIDMz
MDIxKTsKKyAgICBlcXVhbChjb21taXRzLmxlbmd0aCwgMCwgImdyZWF0ZXIgdGhhbiAzMzAyMSIp
OworfSk7CisKK3Rlc3QoImNvbW1pdHNPbkJyYW5jaEluUmV2aXNpb25SYW5nZSIsIGZ1bmN0aW9u
KCkKK3sKKyAgICB0aGlzLnRyYWMucmVjb3JkZWRDb21taXRzID0gTW9ja1RyYWMuRVhBTVBMRV9U
UkFDX0NPTU1JVFM7CisgICAgdmFyIGNvbW1pdHMgPSB0aGlzLnRyYWMuY29tbWl0c09uQnJhbmNo
SW5SZXZpc2lvblJhbmdlKCJ0cnVuayIsIDMzMDIwLCAzMzAyMik7CisgICAgZXF1YWwoY29tbWl0
cy5sZW5ndGgsIDIsICJpbiByYW5nZSAzMzAyMCwgMzMwMjIiKTsKK30pOworCiBtb2R1bGUoIkJ1
aWxkQm90UXVldWVWaWV3IiwgewogICAgIHNldHVwOiBmdW5jdGlvbigpIHsKICAgICAgICAgdGhp
cy50cmFjID0gbmV3IE1vY2tUcmFjKCk7CkBAIC0xMTMsNiArMTQ3LDMyIEBAIHRlc3QoIl9wcmVz
ZW50UG9wb3ZlckZvclBlbmRpbmdDb21taXRzIiwgZnVuY3Rpb24oKQogICAgIHN0cmljdEVxdWFs
KG5vZGVMaXN0Lmxlbmd0aCwgMSwgImhhcyAxIHBlbmRpbmcgY29tbWl0Iik7CiB9KTsKIAordGVz
dCgiX3ByZXNlbnRQb3BvdmVyRm9yUGVuZGluZ0NvbW1pdHMgbm8gcGVuZGluZyBjb21taXRzIiwg
ZnVuY3Rpb24oKQoreworICAgIHRoaXMuc29tZU90aGVyQnJhbmNoID0geworICAgICAgICBuYW1l
OiAic29tZU90aGVyQnJhbmNoIiwKKyAgICAgICAgcmVwb3NpdG9yeTogeworICAgICAgICAgICAg
bmFtZTogIm9wZW5Tb3VyY2UiLAorICAgICAgICAgICAgdHJhYzogdGhpcy50cmFjLAorICAgICAg
ICAgICAgaXNTVk46IHRydWUsCisgICAgICAgIH0KKyAgICB9OworICAgIHRoaXMucXVldWUuYnJh
bmNoZXMgPSBbdGhpcy5zb21lT3RoZXJCcmFuY2hdOworICAgIHRoaXMudmlldy5fbGF0ZXN0UHJv
ZHVjdGl2ZUl0ZXJhdGlvbiA9IGZ1bmN0aW9uKHF1ZXVlKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHsKKyAgICAgICAgICAgIHJldmlzaW9uOiB7CisgICAgICAgICAgICAgICAgIm9wZW5Tb3VyY2Ui
OiAzMzAyMQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKyAgICB2YXIgZWxlbWVu
dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHZhciBwb3BvdmVyID0gbmV3
IERhc2hib2FyZC5Qb3BvdmVyKCk7CisgICAgdGhpcy52aWV3Ll9wcmVzZW50UG9wb3ZlckZvclBl
bmRpbmdDb21taXRzKGVsZW1lbnQsIHBvcG92ZXIsIHRoaXMucXVldWUpOworICAgIHZhciBub2Rl
TGlzdCA9IHBvcG92ZXIuX2VsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgicGVuZGluZy1j
b21taXQiKTsKKyAgICBzdHJpY3RFcXVhbChub2RlTGlzdC5sZW5ndGgsIDAsICJoYXMgMCBwZW5k
aW5nIGNvbW1pdHMiKTsKK30pOworCiB0ZXN0KCJfcHJlc2VudFBvcG92ZXJGb3JSZXZpc2lvblJh
bmdlIiwgZnVuY3Rpb24oKQogewogICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCgiZGl2Iik7CkBAIC0xOTEsMTIgKzI1MSwxMyBAQCB0ZXN0KCJfZm9ybWF0UmV2aXNpb25G
b3JEaXNwbGF5IEdpdCIsIGZ1bmN0aW9uKCkKIAogbW9kdWxlKCJCdWlsZEJvdFF1ZXVlIiwgewog
ICAgIHNldHVwOiBmdW5jdGlvbigpIHsKKyAgICAgICAgRGFzaGJvYXJkLlJlcG9zaXRvcnkuT3Bl
blNvdXJjZS50cmFjID0gbmV3IE1vY2tUcmFjKCk7CisgICAgICAgIERhc2hib2FyZC5SZXBvc2l0
b3J5Lk9wZW5Tb3VyY2UudHJhYy5yZWNvcmRlZENvbW1pdHMgPSBNb2NrVHJhYy5FWEFNUExFX1RS
QUNfQ09NTUlUUzsKKyAgICAgICAgRGFzaGJvYXJkLlJlcG9zaXRvcnkuSW50ZXJuYWwudHJhYyA9
IG5ldyBNb2NrVHJhYygpOwogICAgICAgICB0aGlzLnF1ZXVlID0gbmV3IE1vY2tCdWlsZGJvdFF1
ZXVlKCk7CiAgICAgICAgIHRoaXMucXVldWUuYnJhbmNoZXMgPSBbewogICAgICAgICAgICAgbmFt
ZTogInRydW5rIiwKLSAgICAgICAgICAgIHJlcG9zaXRvcnk6IHsKLSAgICAgICAgICAgICAgICBu
YW1lOiAib3BlblNvdXJjZSIsCi0gICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvc2l0b3J5
OiBEYXNoYm9hcmQuUmVwb3NpdG9yeS5PcGVuc291cmNlCiAgICAgICAgIH1dOwogICAgIH0KIH0p
Owo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>270813</attachid>
            <date>2016-02-06 20:56:15 -0800</date>
            <delta_ts>2016-02-10 16:13:50 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152345-20160206205552.patch</filename>
            <type>text/plain</type>
            <size>16375</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk2MjM1CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggZTE5MDdlMDRjZDE5ODI4MDIwYjRhY2JhNzBlZTA3NGE0
MzVmNDlhMi4uM2Q4NTdiNjk0MmM3NzkzMjFmMTQ5ZDE5NTg1OGZmMTJhZGFhNDUwMCAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI5
IEBACisyMDE2LTAyLTA2ICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgorCisg
ICAgICAgIFRlYWNoIGRhc2hib2FyZCBjb2RlIHRvIGNvbXBhcmUgbm9uLWludGVnZXIgcmV2aXNp
b25zCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTIz
NDUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIEJ1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanM6CisgICAgICAgIChCdWlsZGJvdFF1ZXVlLnBy
b3RvdHlwZS5jb21wYXJlSXRlcmF0aW9uc0J5UmV2aXNpb25zKTogQ29tcGFyZSBub24taW50ZWdl
ciByZXZpc2lvbnMuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcu
anM6CisgICAgICAgIChCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUuX2FwcGVuZFBlbmRpbmdS
ZXZpc2lvbkNvdW50KTogVXNlIFRyYWMuaW5kZXhPZlJldmlzaW9uIGluIG9yZGVyIHRvIGNvbXBh
cmUgbm9uLWludGVnZXIKKyAgICAgICAgcmV2aXNpb25zLiBBbHNvIHVzZXMgbmV3IFRyYWMuY29t
bWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24gbWV0aG9kLgorICAgICAgICAoQnVpbGRib3RR
dWV1ZVZpZXcucHJvdG90eXBlLl9wb3BvdmVyTGluZXNGb3JDb21taXRSYW5nZSk6IERpdHRvLgor
ICAgICAgICAoQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLl9wcmVzZW50UG9wb3ZlckZvclBl
bmRpbmdDb21taXRzKTogVXNlIFRyYWMuaW5kZXhPZlJldmlzaW9uIGluIG9yZGVyIHRvIGNvbXBh
cmUgbm9uLWludGVnZXIKKyAgICAgICAgcmV2aXNpb25zLiBBbHNvIHVzZXMgbmV3IFRyYWMubmV4
dFJldmlzaW9uIG1ldGhvZCB0byBjYWxjdWxhdGUgYSByZXZpc2lvbiByYW5nZS4KKyAgICAgICAg
KEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZS5fcmV2aXNpb25Db250ZW50V2l0aFBvcG92ZXJG
b3JJdGVyYXRpb24pOiBEaXR0by4KKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9UcmFjLmpzOgor
ICAgICAgICAoVHJhYy5wcm90b3R5cGUuX2NvbW1pdHNPbkJyYW5jaCk6IFJlbmFtZWQgdGhpcyB0
byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZCBiZSBhIHByaXZhdGUgbWV0aG9kIHVzZWQgYnkgdGhl
IGxhdHRlciB0d28gbmV3CisgICAgICAgIG1ldGhvZHMuCisgICAgICAgIChUcmFjLnByb3RvdHlw
ZS5jb21taXRzT25CcmFuY2hMYXRlclRoYW5SZXZpc2lvbik6IEZpbmRzIHJldmlzaW9ucyBvbiBh
IGJyYW5jaCBsYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgcmV2aXNpb24uCisgICAgICAgIChUcmFj
LnByb3RvdHlwZS5jb21taXRzT25CcmFuY2hJblJldmlzaW9uUmFuZ2UpOiBGaW5kcyByZXZpc2lv
bnMgb24gYSBicmFuY2ggd2l0aGluIGEgc3BlY2lmaWVkIHJhbmdlLgorICAgICAgICAoVHJhYy5w
cm90b3R5cGUubmV4dFJldmlzaW9uKTogRmluZHMgdGhlIG5leHQgcmV2aXNpb24gYWZ0ZXIgYSBn
aXZlbiByZXZpc2lvbiBvbiBhIHNwZWNpZmljIGJyYW5jaC4KKyAgICAgICAgKFRyYWMucHJvdG90
eXBlLmluZGV4T2ZSZXZpc2lvbik6IEZpbmRzIHRoZSBpbmRleCBvZiBhIGdpdmVuIHJldmlzaW9u
IHdpdGhpbiB0aGUgcmVjb3JkZWRDb21taXRzIGFycmF5LgorICAgICAgICAoVHJhYy5wcm90b3R5
cGUuY29tbWl0c09uQnJhbmNoKTogRGVsZXRlZC4gUmVuYW1lZCB0byBfY29tbWl0c09uQnJhbmNo
LgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1
YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzOiBBZGRlZCB1bml0IHRl
c3RzLgorCiAyMDE2LTAyLTA1ICBBYWthc2ggSmFpbiAgPGFha2FzaF9qYWluQGFwcGxlLmNvbT4K
IAogICAgICAgICB0ZXN0cyBmYWlsIGlmIGRpc3BsYXkgc2xlZXBzIHdoaWxlIHJ1bi13ZWJraXQt
dGVzdHMgaXMgcnVubmluZwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVp
bGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRi
b3RRdWV1ZS5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29u
ZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWUuanMKaW5kZXgg
NzcxOThkMGJkZTYzN2ZkYWY3ZWFmNjg1YmUwODMyNjc0MDJiZTZkZS4uMjI5YWI4NjMwMzgwNzM1
NTMyODhlYWUzYjRkOTk0MTc3OGYyNjc3NyAxMDA2NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1
cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Njcmlw
dHMvQnVpbGRib3RRdWV1ZS5qcworKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9CdWlsZGJvdFF1
ZXVlLmpzCkBAIC0yODUsOSArMjg1LDE1IEBAIEJ1aWxkYm90UXVldWUucHJvdG90eXBlID0gewog
ICAgICAgICB2YXIgc29ydGVkUmVwb3NpdG9yaWVzID0gRGFzaGJvYXJkLnNvcnRlZFJlcG9zaXRv
cmllczsKICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWRSZXBvc2l0b3JpZXMubGVu
Z3RoOyArK2kpIHsKICAgICAgICAgICAgIHZhciByZXBvc2l0b3J5TmFtZSA9IHNvcnRlZFJlcG9z
aXRvcmllc1tpXS5uYW1lOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGIucmV2aXNpb25bcmVw
b3NpdG9yeU5hbWVdIC0gYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV07Ci0gICAgICAgICAgICBp
ZiAocmVzdWx0KQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB2
YXIgdHJhYyA9IHNvcnRlZFJlcG9zaXRvcmllc1tpXS50cmFjOworICAgICAgICAgICAgY29uc29s
ZS5hc3NlcnQodHJhYyk7CisgICAgICAgICAgICB2YXIgaW5kZXhBID0gdHJhYy5pbmRleE9mUmV2
aXNpb24oYS5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0pOworICAgICAgICAgICAgdmFyIGluZGV4
QiA9IHRyYWMuaW5kZXhPZlJldmlzaW9uKGIucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdKTsKKyAg
ICAgICAgICAgIGlmIChpbmRleEEgIT09IC0xICYmIGluZGV4QiAhPT0gLTEpIHsKKyAgICAgICAg
ICAgICAgICB2YXIgcmVzdWx0ID0gaW5kZXhCIC0gaW5kZXhBOworICAgICAgICAgICAgICAgIGlm
IChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAg
ICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL0J1aWxkYm90UXVldWVWaWV3LmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBv
cnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMv
QnVpbGRib3RRdWV1ZVZpZXcuanMKaW5kZXggZTE3ZmI2M2E0NGU3NDUyYzMzMTc5MTlkZTU0NDI4
OWQ3NzkzZDU0Zi4uOTJiODI5Yzk2Nzk0ZmNkZTNhMGRhMWVmZTFlNTI0OGRlNDc5OWFkYSAxMDA2
NDQKLS0tIGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcuanMKKysrIGIv
VG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0
bWwvZGFzaGJvYXJkL1NjcmlwdHMvQnVpbGRib3RRdWV1ZVZpZXcuanMKQEAgLTk0LDEyICs5NCwx
MiBAQCBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICAgICAgY29u
dGludWU7CiAgICAgICAgICAgICBpZiAoIXRyYWMpCiAgICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICBpZiAoIXRyYWMubGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlciB8fCB0
cmFjLm9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIgPiBsYXRlc3RQcm9kdWN0aXZlUmV2aXNp
b25OdW1iZXIpIHsKKyAgICAgICAgICAgIGlmICghdHJhYy5sYXRlc3RSZWNvcmRlZFJldmlzaW9u
TnVtYmVyIHx8IHRyYWMuaW5kZXhPZlJldmlzaW9uKHRyYWMub2xkZXN0UmVjb3JkZWRSZXZpc2lv
bk51bWJlcikgPiB0cmFjLmluZGV4T2ZSZXZpc2lvbihsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25O
dW1iZXIpKSB7CiAgICAgICAgICAgICAgICAgdHJhYy5sb2FkTW9yZUhpc3RvcmljYWxEYXRhKCk7
CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB0
b3RhbFJldmlzaW9uc0JlaGluZCArPSB0cmFjLmNvbW1pdHNPbkJyYW5jaChicmFuY2gubmFtZSwg
ZnVuY3Rpb24oY29tbWl0KSB7IHJldHVybiBjb21taXQucmV2aXNpb25OdW1iZXIgPiBsYXRlc3RQ
cm9kdWN0aXZlUmV2aXNpb25OdW1iZXI7IH0pLmxlbmd0aDsKKyAgICAgICAgICAgIHRvdGFsUmV2
aXNpb25zQmVoaW5kICs9IHRyYWMuY29tbWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24oYnJh
bmNoLm5hbWUsIGxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51bWJlcikubGVuZ3RoOwogICAgICAg
ICB9CiAKICAgICAgICAgaWYgKCF0b3RhbFJldmlzaW9uc0JlaGluZCkKQEAgLTE0MCwxMSArMTQw
LDExIEBAIEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgIHJldHVy
biByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICBjb25zb2xlLmFzc2VydCh0cmFjLm9sZGVz
dFJlY29yZGVkUmV2aXNpb25OdW1iZXIgPD0gZmlyc3RSZXZpc2lvbk51bWJlcik7CisgICAgICAg
IGNvbnNvbGUuYXNzZXJ0KHRyYWMuaW5kZXhPZlJldmlzaW9uKHRyYWMub2xkZXN0UmVjb3JkZWRS
ZXZpc2lvbk51bWJlcikgPD0gdHJhYy5pbmRleE9mUmV2aXNpb24oZmlyc3RSZXZpc2lvbk51bWJl
cikpOwogCiAgICAgICAgIC8vIEZJWE1FOiBUbyBiZSAxMDAlIGNvcnJlY3QsIHdlIHNob3VsZCBh
bHNvIGZpbHRlciBvdXQgY2hhbmdlcyB0aGF0IGFyZSBpZ25vcmVkIGJ5CiAgICAgICAgIC8vIHRo
ZSBxdWV1ZSwgc2VlIF9zaG91bGRfZmlsZV90cmlnZ2VyX2J1aWxkIGluIHdrYnVpbGQucHkuCi0g
ICAgICAgIHZhciBjb21taXRzID0gdHJhYy5jb21taXRzT25CcmFuY2goYnJhbmNoLm5hbWUsIGZ1
bmN0aW9uKGNvbW1pdCkgeyByZXR1cm4gY29tbWl0LnJldmlzaW9uTnVtYmVyID49IGZpcnN0UmV2
aXNpb25OdW1iZXIgJiYgY29tbWl0LnJldmlzaW9uTnVtYmVyIDw9IGxhc3RSZXZpc2lvbk51bWJl
cjsgfSk7CisgICAgICAgIHZhciBjb21taXRzID0gdHJhYy5jb21taXRzT25CcmFuY2hJblJldmlz
aW9uUmFuZ2UoYnJhbmNoLm5hbWUsIGZpcnN0UmV2aXNpb25OdW1iZXIsIGxhc3RSZXZpc2lvbk51
bWJlcik7CiAgICAgICAgIHJldHVybiBjb21taXRzLm1hcChmdW5jdGlvbihjb21taXQpIHsKICAg
ICAgICAgICAgIHJldHVybiBsaW5lRm9yQ29tbWl0LmNhbGwodGhpcywgdHJhYywgY29tbWl0KTsK
ICAgICAgICAgfSwgdGhpcykucmV2ZXJzZSgpOwpAQCAtMTY5LDcgKzE2OSwxMCBAQCBCdWlsZGJv
dFF1ZXVlVmlldy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICB2YXIgbGF0ZXN0UHJvZHVjdGl2
ZVJldmlzaW9uTnVtYmVyID0gbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbi5yZXZpc2lvbltyZXBv
c2l0b3J5TmFtZV07CiAgICAgICAgICAgICBpZiAoIWxhdGVzdFByb2R1Y3RpdmVSZXZpc2lvbk51
bWJlciB8fCAhdHJhYy5sYXRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVyKQogICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5fcG9wb3ZlckxpbmVz
Rm9yQ29tbWl0UmFuZ2UodHJhYywgYnJhbmNoLCBsYXRlc3RQcm9kdWN0aXZlUmV2aXNpb25OdW1i
ZXIgKyAxLCB0cmFjLmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpOworICAgICAgICAgICAg
dmFyIG5leHRSZXZpc2lvbiA9IHRyYWMubmV4dFJldmlzaW9uKGJyYW5jaC5uYW1lLCBsYXRlc3RQ
cm9kdWN0aXZlUmV2aXNpb25OdW1iZXIpOworICAgICAgICAgICAgaWYgKG5leHRSZXZpc2lvbiA9
PT0gVHJhYy5OT19NT1JFX1JFVklTSU9OUykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgIHZhciBsaW5lcyA9IHRoaXMuX3BvcG92ZXJMaW5lc0ZvckNvbW1pdFJhbmdlKHRy
YWMsIGJyYW5jaCwgbmV4dFJldmlzaW9uLCB0cmFjLmxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1i
ZXIpOwogICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGxpbmVzLmxlbmd0aDsKICAgICAgICAgICAg
IGlmIChsZW5ndGggJiYgc2hvdWxkQWRkRGl2aWRlcikKICAgICAgICAgICAgICAgICB0aGlzLl9h
ZGREaXZpZGVyVG9Qb3BvdmVyKGNvbnRlbnQpOwpAQCAtMjIwLDIxICsyMjMsNDEgQEAgQnVpbGRi
b3RRdWV1ZVZpZXcucHJvdG90eXBlID0gewogICAgICAgICB2YXIgcmVwb3NpdG9yeSA9IGJyYW5j
aC5yZXBvc2l0b3J5OwogICAgICAgICB2YXIgcmVwb3NpdG9yeU5hbWUgPSByZXBvc2l0b3J5Lm5h
bWU7CiAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGl0ZXJhdGlvbi5yZXZpc2lvbltyZXBvc2l0b3J5
TmFtZV0pOworICAgICAgICB2YXIgdHJhYyA9IHJlcG9zaXRvcnkudHJhYzsKICAgICAgICAgdmFy
IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgIGNvbnRl
bnQudGV4dENvbnRlbnQgPSB0aGlzLl9mb3JtYXRSZXZpc2lvbkZvckRpc3BsYXkoaXRlcmF0aW9u
LnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSwgcmVwb3NpdG9yeSk7CiAgICAgICAgIGNvbnRlbnQu
Y2xhc3NMaXN0LmFkZCgicmV2aXNpb24tbnVtYmVyIik7CiAKLSAgICAgICAgaWYgKHByZXZpb3Vz
SXRlcmF0aW9uKSB7Ci0gICAgICAgICAgICBjb25zb2xlLmFzc2VydChwcmV2aW91c0l0ZXJhdGlv
bi5yZXZpc2lvbltyZXBvc2l0b3J5TmFtZV0pOwotICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB7
Ci0gICAgICAgICAgICAgICAgdHJhYzogcmVwb3NpdG9yeS50cmFjLAotICAgICAgICAgICAgICAg
IGJyYW5jaDogYnJhbmNoLAotICAgICAgICAgICAgICAgIGZpcnN0UmV2aXNpb246IHByZXZpb3Vz
SXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXSArIDEsCi0gICAgICAgICAgICAgICAg
bGFzdFJldmlzaW9uOiBpdGVyYXRpb24ucmV2aXNpb25bcmVwb3NpdG9yeU5hbWVdCi0gICAgICAg
ICAgICB9OwotICAgICAgICAgICAgaWYgKGNvbnRleHQuZmlyc3RSZXZpc2lvbiA8PSBjb250ZXh0
Lmxhc3RSZXZpc2lvbikKLSAgICAgICAgICAgICAgICBuZXcgUG9wb3ZlclRyYWNrZXIoY29udGVu
dCwgdGhpcy5fcHJlc2VudFBvcG92ZXJGb3JSZXZpc2lvblJhbmdlLmJpbmQodGhpcyksIGNvbnRl
eHQpOwotICAgICAgICB9CisgICAgICAgIGlmICghcHJldmlvdXNJdGVyYXRpb24pCisgICAgICAg
ICAgICByZXR1cm4gY29udGVudDsKKworICAgICAgICB2YXIgcHJldmlvdXNJdGVyYXRpb25SZXZp
c2lvbiA9IHByZXZpb3VzSXRlcmF0aW9uLnJldmlzaW9uW3JlcG9zaXRvcnlOYW1lXTsKKyAgICAg
ICAgY29uc29sZS5hc3NlcnQocHJldmlvdXNJdGVyYXRpb25SZXZpc2lvbik7CisgICAgICAgIHZh
ciBwcmV2aW91c0l0ZXJhdGlvblJldmlzaW9uSW5kZXggPSB0cmFjLmluZGV4T2ZSZXZpc2lvbihw
cmV2aW91c0l0ZXJhdGlvblJldmlzaW9uKTsKKyAgICAgICAgaWYgKHByZXZpb3VzSXRlcmF0aW9u
UmV2aXNpb25JbmRleCA9PT0gLTEpCisgICAgICAgICAgICByZXR1cm4gY29udGVudDsKKworICAg
ICAgICB2YXIgZmlyc3RSZXZpc2lvbiA9IHRyYWMubmV4dFJldmlzaW9uKGJyYW5jaC5uYW1lLCBw
cmV2aW91c0l0ZXJhdGlvblJldmlzaW9uKTsKKyAgICAgICAgaWYgKGZpcnN0UmV2aXNpb24gPT09
IFRyYWMuTk9fTU9SRV9SRVZJU0lPTlMpCisgICAgICAgICAgICByZXR1cm4gY29udGVudDsKKyAg
ICAgICAgdmFyIGZpcnN0UmV2aXNpb25JbmRleCA9IHRyYWMuaW5kZXhPZlJldmlzaW9uKGZpcnN0
UmV2aXNpb24pOworICAgICAgICBjb25zb2xlLmFzc2VydChmaXJzdFJldmlzaW9uSW5kZXggIT09
IC0xKTsKKworICAgICAgICB2YXIgbGFzdFJldmlzaW9uID0gaXRlcmF0aW9uLnJldmlzaW9uW3Jl
cG9zaXRvcnlOYW1lXTsKKyAgICAgICAgdmFyIGxhc3RSZXZpc2lvbkluZGV4ID0gdHJhYy5pbmRl
eE9mUmV2aXNpb24obGFzdFJldmlzaW9uKTsKKyAgICAgICAgaWYgKGxhc3RSZXZpc2lvbkluZGV4
ID09PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50OworCisgICAgICAgIGlmIChmaXJz
dFJldmlzaW9uSW5kZXggPiBsYXN0UmV2aXNpb25JbmRleCkKKyAgICAgICAgICAgIHJldHVybiBj
b250ZW50OworCisgICAgICAgIHZhciBjb250ZXh0ID0geworICAgICAgICAgICAgdHJhYzogdHJh
YywKKyAgICAgICAgICAgIGJyYW5jaDogYnJhbmNoLAorICAgICAgICAgICAgZmlyc3RSZXZpc2lv
bjogZmlyc3RSZXZpc2lvbiwKKyAgICAgICAgICAgIGxhc3RSZXZpc2lvbjogbGFzdFJldmlzaW9u
LAorICAgICAgICB9OworICAgICAgICBuZXcgUG9wb3ZlclRyYWNrZXIoY29udGVudCwgdGhpcy5f
cHJlc2VudFBvcG92ZXJGb3JSZXZpc2lvblJhbmdlLmJpbmQodGhpcyksIGNvbnRleHQpOwogCiAg
ICAgICAgIHJldHVybiBjb250ZW50OwogICAgIH0sCmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNs
YXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQv
U2NyaXB0cy9UcmFjLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvVHJhYy5qcwppbmRleCBhNDg4
ZDFjMTZjN2JmYTAyZjI0ZGJjOGY1NTEzMjUyN2Q0ZjVlMmE4Li41NDZiYjNkMDlkYjA1NzM1MDdl
NjQxZjM0YzE2MzQzOGJmZTVmZjIwIDEwMDY0NAotLS0gYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9y
dC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy9U
cmFjLmpzCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29u
ZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL1RyYWMuanMKQEAgLTM3LDYgKzM3LDgg
QEAgVHJhYyA9IGZ1bmN0aW9uKGJhc2VVUkwsIG9wdGlvbnMpCiAKIEJhc2VPYmplY3QuYWRkQ29u
c3RydWN0b3JGdW5jdGlvbnMoVHJhYyk7CiAKK1RyYWMuTk9fTU9SRV9SRVZJU0lPTlMgPSBudWxs
OworCiBUcmFjLk5lZWRzQXV0aGVudGljYXRpb24gPSAibmVlZHNBdXRoZW50aWNhdGlvbiI7CiBU
cmFjLlVwZGF0ZUludGVydmFsID0gNDUwMDA7IC8vIDQ1IHNlY29uZHMKIApAQCAtNjMsMTEgKzY1
LDQwIEBAIFRyYWMucHJvdG90eXBlID0gewogICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRlZENv
bW1pdHNbdGhpcy5yZWNvcmRlZENvbW1pdHMubGVuZ3RoIC0gMV0ucmV2aXNpb25OdW1iZXI7CiAg
ICAgfSwKIAotICAgIGNvbW1pdHNPbkJyYW5jaDogZnVuY3Rpb24oYnJhbmNoTmFtZSwgZmlsdGVy
KQorICAgIF9jb21taXRzT25CcmFuY2g6IGZ1bmN0aW9uKGJyYW5jaE5hbWUsIGJlZ2luUG9zaXRp
b24sIGVuZFBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgYmVnaW5Qb3NpdGlvbiA9IGJlZ2luUG9z
aXRpb24gfHwgMDsKKyAgICAgICAgaWYgKGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQpCisgICAg
ICAgICAgICBlbmRQb3NpdGlvbiA9IHRoaXMucmVjb3JkZWRDb21taXRzLmxlbmd0aCAtIDE7Cisg
ICAgICAgIHZhciBjb21taXRzID0gW107CisgICAgICAgIGZvciAodmFyIGkgPSBiZWdpblBvc2l0
aW9uOyBpIDw9IGVuZFBvc2l0aW9uOyArK2kpIHsKKyAgICAgICAgICAgIHZhciBjb21taXQgPSB0
aGlzLnJlY29yZGVkQ29tbWl0c1tpXTsKKyAgICAgICAgICAgIGlmICghY29tbWl0LmNvbnRhaW5z
QnJhbmNoTG9jYXRpb24gfHwgY29tbWl0LmJyYW5jaGVzLmluY2x1ZGVzKGJyYW5jaE5hbWUpKQor
ICAgICAgICAgICAgICAgIGNvbW1pdHMucHVzaChjb21taXQpOworICAgICAgICB9CisgICAgICAg
IHJldHVybiBjb21taXRzOworICAgIH0sCisKKyAgICBjb21taXRzT25CcmFuY2hMYXRlclRoYW5S
ZXZpc2lvbjogZnVuY3Rpb24oYnJhbmNoTmFtZSwgcmV2aXNpb24pCisgICAgeworICAgICAgICB2
YXIgaW5kZXhUb0JlTGF0ZXJUaGFuID0gdGhpcy5pbmRleE9mUmV2aXNpb24ocmV2aXNpb24pOwor
ICAgICAgICBjb25zb2xlLmFzc2VydChpbmRleFRvQmVMYXRlclRoYW4gIT09IC0xLCByZXZpc2lv
biArICIgaXMgbm90IGluIHRoZSBsaXN0IG9mIHJlY29yZGVkIGNvbW1pdHMiKTsKKyAgICAgICAg
aWYgKGluZGV4VG9CZUxhdGVyVGhhbiA9PT0gLTEpCisgICAgICAgICAgICByZXR1cm4gW107Cisg
ICAgICAgIHJldHVybiB0aGlzLl9jb21taXRzT25CcmFuY2goYnJhbmNoTmFtZSwgaW5kZXhUb0Jl
TGF0ZXJUaGFuICsgMSk7CisgICAgfSwKKworICAgIGNvbW1pdHNPbkJyYW5jaEluUmV2aXNpb25S
YW5nZTogZnVuY3Rpb24oYnJhbmNoTmFtZSwgZmlyc3RSZXZpc2lvbiwgbGFzdFJldmlzaW9uKQog
ICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVjb3JkZWRDb21taXRzLmZpbHRlcihmdW5jdGlv
bihjb21taXQsIGluZGV4LCBhcnJheSkgewotICAgICAgICAgICAgcmV0dXJuICghY29tbWl0LmNv
bnRhaW5zQnJhbmNoTG9jYXRpb24gfHwgY29tbWl0LmJyYW5jaGVzLmluY2x1ZGVzKGJyYW5jaE5h
bWUpKSAmJiBmaWx0ZXIoY29tbWl0LCBpbmRleCwgYXJyYXkpOwotICAgICAgICB9KTsKKyAgICAg
ICAgdmFyIGluZGV4T2ZGaXJzdFJldmlzaW9uID0gdGhpcy5pbmRleE9mUmV2aXNpb24oZmlyc3RS
ZXZpc2lvbik7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGluZGV4T2ZGaXJzdFJldmlzaW9uICE9
PSAtMSwgZmlyc3RSZXZpc2lvbiArICIgaXMgbm90IGluIHRoZSBsaXN0IG9mIHJlY29yZGVkIGNv
bW1pdHMiKTsKKyAgICAgICAgaWYgKGluZGV4T2ZGaXJzdFJldmlzaW9uID09PSAtMSkKKyAgICAg
ICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgdmFyIGluZGV4T2ZMYXN0UmV2aXNpb24gPSB0aGlz
LmluZGV4T2ZSZXZpc2lvbihsYXN0UmV2aXNpb24pOworICAgICAgICBjb25zb2xlLmFzc2VydChp
bmRleE9mTGFzdFJldmlzaW9uICE9PSAtMSwgbGFzdFJldmlzaW9uICsgIiBpcyBub3QgaW4gdGhl
IGxpc3Qgb2YgcmVjb3JkZWQgY29tbWl0cyIpOworICAgICAgICBpZiAoaW5kZXhPZkxhc3RSZXZp
c2lvbiA9PT0gLTEpCisgICAgICAgICAgICByZXR1cm4gW107CisgICAgICAgIHJldHVybiB0aGlz
Ll9jb21taXRzT25CcmFuY2goYnJhbmNoTmFtZSwgaW5kZXhPZkZpcnN0UmV2aXNpb24sIGluZGV4
T2ZMYXN0UmV2aXNpb24pOwogICAgIH0sCiAKICAgICByZXZpc2lvblVSTDogZnVuY3Rpb24ocmV2
aXNpb24pCkBAIC0yNjYsNCArMjk3LDIyIEBAIFRyYWMucHJvdG90eXBlID0gewogICAgICAgICAg
ICAgdGhpcy5fbG9hZGVkKGRhdGFEb2N1bWVudCk7CiAgICAgICAgIH0uYmluZCh0aGlzKSwgdGhp
cy5fbmVlZHNBdXRoZW50aWNhdGlvbiA/IHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0gOiB7fSk7
CiAgICAgfSwKKworICAgIG5leHRSZXZpc2lvbjogZnVuY3Rpb24oYnJhbmNoTmFtZSwgcmV2aXNp
b24pCisgICAgeworICAgICAgICB2YXIgY29tbWl0cyA9IHRoaXMuY29tbWl0c09uQnJhbmNoTGF0
ZXJUaGFuUmV2aXNpb24oYnJhbmNoTmFtZSwgcmV2aXNpb24pOworICAgICAgICBpZiAoY29tbWl0
cy5sZW5ndGggPiAwKQorICAgICAgICAgICAgcmV0dXJuIGNvbW1pdHNbMF0ucmV2aXNpb25OdW1i
ZXI7CisgICAgICAgIHJldHVybiBUcmFjLk5PX01PUkVfUkVWSVNJT05TOworICAgIH0sCisKKyAg
ICBpbmRleE9mUmV2aXNpb246IGZ1bmN0aW9uKHJldmlzaW9uKQorICAgIHsKKyAgICAgICAgdmFy
IGNvbW1pdHMgPSB0aGlzLnJlY29yZGVkQ29tbWl0czsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCBjb21taXRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoY29tbWl0c1tpXS5y
ZXZpc2lvbk51bWJlciA9PT0gcmV2aXNpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0sCiB9OwpkaWZmIC0tZ2l0IGEvVG9v
bHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwv
ZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9y
dC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90
ZXN0cy90ZXN0cy5qcwppbmRleCAzNjZmMDBiYzVlN2YyYzg5OTA4MzQzM2E5N2I1OTBjOWViY2Iy
NjNhLi45NjlmYWIyNTU2ODlmZDc3MWM1NDFhYzdjZjEwODE4MGE3YWZiYzZkIDEwMDY0NAotLS0g
YS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNf
aHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5qcworKysgYi9Ub29scy9CdWlsZFNs
YXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQv
U2NyaXB0cy90ZXN0cy90ZXN0cy5qcwpAQCAtNzIsNiArNzIsNDAgQEAgdGVzdCgiX3BhcnNlUmV2
aXNpb25Gcm9tVVJMIiwgZnVuY3Rpb24oKQogICAgIHN0cmljdEVxdWFsKHRoaXMudHJhYy5fcGFy
c2VSZXZpc2lvbkZyb21VUkwoImh0dHBzOi8vZ2l0LmZvb2Jhci5jb20vdHJhYy9XaGF0ZXZlci5n
aXQvY2hhbmdlc2V0LzBlNDk4ZGI1ZDhlNWI1YTM0MjYzMSIpLCAiMGU0OThkYjVkOGU1YjVhMzQy
NjMxIiwgIkdpdCIpOwogfSk7CiAKK3Rlc3QoIm5leHRSZXZpc2lvbiIsIGZ1bmN0aW9uKCkKK3sK
KyAgICB0aGlzLnRyYWMucmVjb3JkZWRDb21taXRzID0gTW9ja1RyYWMuRVhBTVBMRV9UUkFDX0NP
TU1JVFM7CisgICAgc3RyaWN0RXF1YWwodGhpcy50cmFjLm5leHRSZXZpc2lvbigidHJ1bmsiLCAz
MzAyMCksIDMzMDIyLCAibmV4dFJldmlzaW9uIHNhbWUgYnJhbmNoIik7CisgICAgc3RyaWN0RXF1
YWwodGhpcy50cmFjLm5leHRSZXZpc2lvbigidHJ1bmsiLCAzMzAxOSksIDMzMDIwLCAibmV4dFJl
dmlzaW9uIGRpZmZlcmVudCBicmFuY2giKTsKK30pOworCit0ZXN0KCJpbmRleE9mUmV2aXNpb24i
LCBmdW5jdGlvbigpCit7CisgICAgdGhpcy50cmFjLnJlY29yZGVkQ29tbWl0cyA9IE1vY2tUcmFj
LkVYQU1QTEVfVFJBQ19DT01NSVRTOworICAgIHN0cmljdEVxdWFsKHRoaXMudHJhYy5pbmRleE9m
UmV2aXNpb24oMzMwMjApLCAyLCAiaW5kZXhPZlJldmlzaW9uIik7Cit9KTsKKwordGVzdCgiY29t
bWl0c09uQnJhbmNoTGF0ZXJUaGFuUmV2aXNpb24iLCBmdW5jdGlvbigpCit7CisgICAgdGhpcy50
cmFjLnJlY29yZGVkQ29tbWl0cyA9IE1vY2tUcmFjLkVYQU1QTEVfVFJBQ19DT01NSVRTOworICAg
IHZhciBjb21taXRzID0gdGhpcy50cmFjLmNvbW1pdHNPbkJyYW5jaExhdGVyVGhhblJldmlzaW9u
KCJ0cnVuayIsIDMzMDIwKTsKKyAgICBlcXVhbChjb21taXRzLmxlbmd0aCwgMSwgImdyZWF0ZXIg
dGhhbiAzMzAyMCIpOworfSk7CisKK3Rlc3QoImNvbW1pdHNPbkJyYW5jaExhdGVyVGhhblJldmlz
aW9uIG5vIGNvbW1pdHMiLCBmdW5jdGlvbigpCit7CisgICAgdGhpcy50cmFjLnJlY29yZGVkQ29t
bWl0cyA9IE1vY2tUcmFjLkVYQU1QTEVfVFJBQ19DT01NSVRTOworICAgIHZhciBjb21taXRzID0g
dGhpcy50cmFjLmNvbW1pdHNPbkJyYW5jaExhdGVyVGhhblJldmlzaW9uKCJzb21lT3RoZXJCcmFu
Y2giLCAzMzAyMSk7CisgICAgZXF1YWwoY29tbWl0cy5sZW5ndGgsIDAsICJncmVhdGVyIHRoYW4g
MzMwMjEiKTsKK30pOworCit0ZXN0KCJjb21taXRzT25CcmFuY2hJblJldmlzaW9uUmFuZ2UiLCBm
dW5jdGlvbigpCit7CisgICAgdGhpcy50cmFjLnJlY29yZGVkQ29tbWl0cyA9IE1vY2tUcmFjLkVY
QU1QTEVfVFJBQ19DT01NSVRTOworICAgIHZhciBjb21taXRzID0gdGhpcy50cmFjLmNvbW1pdHNP
bkJyYW5jaEluUmV2aXNpb25SYW5nZSgidHJ1bmsiLCAzMzAyMCwgMzMwMjIpOworICAgIGVxdWFs
KGNvbW1pdHMubGVuZ3RoLCAyLCAiaW4gcmFuZ2UgMzMwMjAsIDMzMDIyIik7Cit9KTsKKwogbW9k
dWxlKCJCdWlsZEJvdFF1ZXVlVmlldyIsIHsKICAgICBzZXR1cDogZnVuY3Rpb24oKSB7CiAgICAg
ICAgIHRoaXMudHJhYyA9IG5ldyBNb2NrVHJhYygpOwpAQCAtMTEzLDYgKzE0NywzMSBAQCB0ZXN0
KCJfcHJlc2VudFBvcG92ZXJGb3JQZW5kaW5nQ29tbWl0cyIsIGZ1bmN0aW9uKCkKICAgICBzdHJp
Y3RFcXVhbChub2RlTGlzdC5sZW5ndGgsIDEsICJoYXMgMSBwZW5kaW5nIGNvbW1pdCIpOwogfSk7
CiAKK3Rlc3QoIl9wcmVzZW50UG9wb3ZlckZvclBlbmRpbmdDb21taXRzIG5vIHBlbmRpbmcgY29t
bWl0cyIsIGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLnNvbWVPdGhlckJyYW5jaCA9IHsKKyAgICAg
ICAgbmFtZTogInNvbWVPdGhlckJyYW5jaCIsCisgICAgICAgIHJlcG9zaXRvcnk6IHsKKyAgICAg
ICAgICAgIG5hbWU6ICJvcGVuU291cmNlIiwKKyAgICAgICAgICAgIHRyYWM6IHRoaXMudHJhYywK
KyAgICAgICAgICAgIGlzU1ZOOiB0cnVlLAorICAgICAgICB9CisgICAgfTsKKyAgICB0aGlzLnF1
ZXVlLmJyYW5jaGVzID0gW3RoaXMuc29tZU90aGVyQnJhbmNoXTsKKyAgICB0aGlzLnZpZXcuX2xh
dGVzdFByb2R1Y3RpdmVJdGVyYXRpb24gPSBmdW5jdGlvbihxdWV1ZSkKKyAgICB7CisgICAgICAg
IHZhciBpdGVyYXRpb24gPSB7CisgICAgICAgICAgICByZXZpc2lvbjogeyAib3BlblNvdXJjZSI6
IDMzMDIxIH0sCisgICAgICAgIH07CisgICAgICAgIHJldHVybiBpdGVyYXRpb247CisgICAgfQor
ICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgdmFy
IHBvcG92ZXIgPSBuZXcgRGFzaGJvYXJkLlBvcG92ZXIoKTsKKyAgICB0aGlzLnZpZXcuX3ByZXNl
bnRQb3BvdmVyRm9yUGVuZGluZ0NvbW1pdHMoZWxlbWVudCwgcG9wb3ZlciwgdGhpcy5xdWV1ZSk7
CisgICAgdmFyIG5vZGVMaXN0ID0gcG9wb3Zlci5fZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NO
YW1lKCJwZW5kaW5nLWNvbW1pdCIpOworICAgIHN0cmljdEVxdWFsKG5vZGVMaXN0Lmxlbmd0aCwg
MCwgImhhcyAwIHBlbmRpbmcgY29tbWl0cyIpOworfSk7CisKIHRlc3QoIl9wcmVzZW50UG9wb3Zl
ckZvclJldmlzaW9uUmFuZ2UiLCBmdW5jdGlvbigpCiB7CiAgICAgdmFyIGVsZW1lbnQgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKQEAgLTE5MSwxMiArMjUwLDEzIEBAIHRlc3QoIl9m
b3JtYXRSZXZpc2lvbkZvckRpc3BsYXkgR2l0IiwgZnVuY3Rpb24oKQogCiBtb2R1bGUoIkJ1aWxk
Qm90UXVldWUiLCB7CiAgICAgc2V0dXA6IGZ1bmN0aW9uKCkgeworICAgICAgICBEYXNoYm9hcmQu
UmVwb3NpdG9yeS5PcGVuU291cmNlLnRyYWMgPSBuZXcgTW9ja1RyYWMoKTsKKyAgICAgICAgRGFz
aGJvYXJkLlJlcG9zaXRvcnkuT3BlblNvdXJjZS50cmFjLnJlY29yZGVkQ29tbWl0cyA9IE1vY2tU
cmFjLkVYQU1QTEVfVFJBQ19DT01NSVRTOworICAgICAgICBEYXNoYm9hcmQuUmVwb3NpdG9yeS5J
bnRlcm5hbC50cmFjID0gbmV3IE1vY2tUcmFjKCk7CiAgICAgICAgIHRoaXMucXVldWUgPSBuZXcg
TW9ja0J1aWxkYm90UXVldWUoKTsKICAgICAgICAgdGhpcy5xdWV1ZS5icmFuY2hlcyA9IFt7CiAg
ICAgICAgICAgICBuYW1lOiAidHJ1bmsiLAotICAgICAgICAgICAgcmVwb3NpdG9yeTogewotICAg
ICAgICAgICAgICAgIG5hbWU6ICJvcGVuU291cmNlIiwKLSAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIHJlcG9zaXRvcnk6IERhc2hib2FyZC5SZXBvc2l0b3J5Lk9wZW5zb3VyY2UKICAgICAgICAg
fV07CiAgICAgfQogfSk7Cg==
</data>
<flag name="review"
          id="295648"
          type_id="1"
          status="+"
          setter="dbates"
    />
          </attachment>
      

    </bug>

</bugzilla>