<?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>180140</bug_id>
          
          <creation_ts>2017-11-29 07:42:30 -0800</creation_ts>
          <short_desc>Add StyleBench</short_desc>
          <delta_ts>2017-12-01 07:32:32 -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>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cdumez</cc>
    
    <cc>commit-queue</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>ggaren</cc>
    
    <cc>joepeck</cc>
    
    <cc>lforschler</cc>
    
    <cc>rniwa</cc>
    
    <cc>ryanhaddad</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1375803</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2017-11-29 07:42:30 -0800</bug_when>
    <thetext>StyleBench is a benchmark for testing style resolution performance.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1375818</commentid>
    <comment_count>1</comment_count>
      <attachid>327854</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2017-11-29 08:17:59 -0800</bug_when>
    <thetext>Created attachment 327854
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1375819</commentid>
    <comment_count>2</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2017-11-29 08:21:08 -0800</bug_when>
    <thetext>&lt;rdar://problem/35366401&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1375943</commentid>
    <comment_count>3</comment_count>
      <attachid>327854</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2017-11-29 11:41:35 -0800</bug_when>
    <thetext>Comment on attachment 327854
patch

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

&gt; PerformanceTests/StyleBench/InteractiveRunner.html:21
&gt; +function formatTestName(suiteName, testName) {

Opening function parens on new line please (everywhere)

&gt; PerformanceTests/StyleBench/InteractiveRunner.html:42
&gt; +        label.appendChild(document.createTextNode(formatTestName(suite.name)));

or just set textContent?

&gt; PerformanceTests/StyleBench/InteractiveRunner.html:53
&gt; +            anchor.appendChild(document.createTextNode(formatTestName(suite.name, test.name)));

Set textContent?

&gt; PerformanceTests/StyleBench/resources/style-bench.js:26
&gt; +function nextAnimationFrame() { return new Promise((resolve) =&gt; requestAnimationFrame(resolve)); }

No reason to have this all on one line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1375981</commentid>
    <comment_count>4</comment_count>
      <attachid>327854</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2017-11-29 13:02:08 -0800</bug_when>
    <thetext>Comment on attachment 327854
patch

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

Neat! I skipped the test runner stuff but the rest looked good to me.

&gt; PerformanceTests/StyleBench/resources/style-bench.js:32
&gt; +        const configuration = {

Style: You could just `return` instead of using the local which you immediately return.

&gt; PerformanceTests/StyleBench/resources/style-bench.js:79
&gt; +        let configuration = this.defaultConfiguration();
&gt; +        configuration.name = &apos;Sibling combinators&apos;;
&gt; +        configuration.combinators = [
&gt; +            &apos; &apos;,
&gt; +            &apos; &apos;,
&gt; +            &apos;&gt;&apos;,
&gt; +            &apos;&gt;&apos;,
&gt; +            &apos;~&apos;,
&gt; +            &apos;+&apos;,
&gt; +        ];
&gt; +        return configuration;

Another way to write these configuration functions would be to use `Object.assign` to add/override additional properties on the default configuration. Like so:

    return Object.assign(this.defaultConfiguration(), {
        name: &apos;Sibling combinators&apos;,
        combinators: [&apos; &apos;, &apos; &apos;, &apos;&gt;&apos;, &apos;&gt;&apos;, &apos;~&apos;, &apos;+&apos;],
    });

But use the approach you find easiest to read!

Also there is an inconsistent mix of single quoted and double quoted strings. We normally prefer to be consistent within a single file.

&gt; PerformanceTests/StyleBench/resources/style-bench.js:116
&gt; +        ];

I&apos;d be interested to see one that includes `:matches()`, `:all()`, `:not()` pseudo classeses in the future! We make use of that a lot in Web Inspector.

If there was one for `var()` where custom properties have different values after mutation would that spend most of its time in style resolution as well, or not to the same degree?

&gt; PerformanceTests/StyleBench/resources/style-bench.js:299
&gt; +

Style: Unnecessary blank line.

&gt; PerformanceTests/StyleBench/resources/style-bench.js:348
&gt; +            const classList = element.classList;
&gt; +            classList.add(this.randomClassName());
&gt; +
&gt; +            const canRemove = classList.length;
&gt; +            if (!canRemove)
&gt; +                continue;

Because line 344 just added a class name it seems `classList.length` would never be 0, right? So I think you can drop lines 346-348 and even make this a straight for loop by moving the increment into the for loop header.

Or perhaps line 344 is an accident of a copy/paste from addClasses?

&gt; PerformanceTests/StyleBench/resources/tests.js:22
&gt; +    const suite = {

Style: Same as before, you can drop the temporary local and just `return`.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1376030</commentid>
    <comment_count>5</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2017-11-29 14:16:22 -0800</bug_when>
    <thetext>&gt; Also there is an inconsistent mix of single quoted and double quoted
&gt; strings. We normally prefer to be consistent within a single file.

Do we have a preference?
 
&gt; &gt; PerformanceTests/StyleBench/resources/style-bench.js:116
&gt; &gt; +        ];
&gt; 
&gt; I&apos;d be interested to see one that includes `:matches()`, `:all()`, `:not()`
&gt; pseudo classeses in the future! We make use of that a lot in Web Inspector.

Yeah. It will be easy to add more cases.

Thanks for the comments!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1376269</commentid>
    <comment_count>6</comment_count>
      <attachid>327967</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2017-11-30 03:58:06 -0800</bug_when>
    <thetext>Created attachment 327967
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1376274</commentid>
    <comment_count>7</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2017-11-30 04:03:25 -0800</bug_when>
    <thetext>&gt; &gt; PerformanceTests/StyleBench/InteractiveRunner.html:21

I didn&apos;t do any fixes to this copy-code from Speedometer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1376275</commentid>
    <comment_count>8</comment_count>
      <attachid>327967</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-11-30 04:30:28 -0800</bug_when>
    <thetext>Comment on attachment 327967
patch

Clearing flags on attachment: 327967

Committed r225324: &lt;https://trac.webkit.org/changeset/225324&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1376276</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-11-30 04:30:30 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1376527</commentid>
    <comment_count>10</comment_count>
    <who name="Ryan Haddad">ryanhaddad</who>
    <bug_when>2017-11-30 14:39:54 -0800</bug_when>
    <thetext>StyleBench is failing on the perf bot:

Running StyleBench/InteractiveRunner.html (184 of 184)
ERROR: layer at (0,0) size 785x630
FAILED
Finished: 0.873694 s

https://build.webkit.org/builders/Apple%20El%20Capitan%20Release%20WK2%20%28Perf%29/builds/1742</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1376804</commentid>
    <comment_count>11</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2017-12-01 07:32:32 -0800</bug_when>
    <thetext>Skipped InteractiveRunner.html in https://trac.webkit.org/r225392</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>327854</attachid>
            <date>2017-11-29 08:17:59 -0800</date>
            <delta_ts>2017-11-30 03:58:06 -0800</delta_ts>
            <desc>patch</desc>
            <filename>style-bench.patch</filename>
            <type>text/plain</type>
            <size>29155</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1h
bmNlVGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAyMjUyNjYpCisrKyBQZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDg3IEBACisyMDE3LTExLTI5ICBB
bnR0aSBLb2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBBZGQgU3R5bGVCZW5j
aAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTgwMTQw
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3R5bGVC
ZW5jaCB0ZXN0cyBwZXJmb3JtYW5jZSBvZiBDU1Mgc3R5bGUgcmVzb2x1dGlvbiBhbmQgc3R5bGUg
aW52YWxpZGF0aW9uLiBFYWNoIHRlc3QgcnVuCisgICAgICAgIGNyZWF0ZXMgYSBsYXJnZSBkb2N1
bWVudCBhbmQgYSBsYXJnZSBzdHlsZXNoZWV0IHVzaW5nIHZhcnlpbmcgc2V0dGluZ3MuIEl0IHRo
ZW4gYXBwbGllcworICAgICAgICBhIHNlcmllcyBvZiBtdXRhdGlvbnMgdG8gdGhlIGRvY3VtZW50
IGFuZCBtZWFzdXJlcyB0aGUgdGltZSB0byB1cGRhdGUgdGhlIHN0eWxlIGFuZCByZW5kZXJpbmcu
CisgICAgICAgIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNpbXBsZSwgbW9zdCBvZiB0aGUgcHJl
c3N1cmUgaXMgb24gc2VsZWN0b3IgbWF0Y2hpbmcuCisKKyAgICAgICAgU3R5bGVCZW5jaCB1c2Vz
IFNwZWVkb21ldGVyIGZyYW1ld29yayBmb3IgVUkgYW5kIG1lYXN1cmVtZW50cy4gRm9yIHByb2Zp
bGluZyBwdXJwb3NlcywgaXQgY2FuIGFsc28KKyAgICAgICAgYmUgcnVuIGxvY2FsbHkgYnkgb3Bl
bmluZyBzdHlsZS1iZW5jaC5odG1sIGRpcmVjdGx5LgorCisgICAgICAgIFRoZXJlIGFyZSBjdXJy
ZW50bHkgZm91ciBzdWJ0ZXN0czoKKworICAgICAgICAtIGNoaWxkIGFuZCBkZXNjZW5kYW50IGNv
bWJpbmF0b3JzIG9ubHkgKGFsbCBvdGhlciB0ZXN0cyBoYXZlIHRoZXNlIHRvbykuCisgICAgICAg
IC0gc2libGluZyBjb21iaW5hdG9yczogJ34nIGFuZCAnKycKKyAgICAgICAgLSBwb3NpdGlvbmFs
IHBzZXVkbyBjbGFzc2VzOiA6bnRoLWNoaWxkIGFuZCBzaW1pbGFyCisgICAgICAgIC0gOjpiZWZv
cmUgYW5kIDo6YWZ0ZXIgcHNldWRvIGVsZW1lbnRzCisKKyAgICAgICAgVGhlIG1lYXN1cmVkIERP
TSBtdXRhdGlvbnMgYXJlOgorCisgICAgICAgIC0gYWRkIGNsYXNzZXMKKyAgICAgICAgLSByZW1v
dmUgY2xhc3NlcworICAgICAgICAtIGFkZCBsZWFmIGVsZW1lbnRzCisgICAgICAgIC0gcmVtb3Zl
IGxlYWYgZWxlbWVudHMKKworICAgICAgICAqIFN0eWxlQmVuY2g6IEFkZGVkLgorICAgICAgICAq
IFN0eWxlQmVuY2gvSW50ZXJhY3RpdmVSdW5uZXIuaHRtbDogQWRkZWQuCisKKyAgICAgICAgICAg
IENvcGllZCBhbmQgY3VzdG9taXplZCBmcm9tIFNwZWVkb21ldGVyLgorCisgICAgICAgICogU3R5
bGVCZW5jaC9pbmRleC5odG1sOiBBZGRlZC4KKworICAgICAgICAgICAgQ29waWVkIGFuZCBjdXN0
b21pemVkIGZyb20gU3BlZWRvbWV0ZXIuCisKKyAgICAgICAgKiBTdHlsZUJlbmNoL3Jlc291cmNl
czogQWRkZWQuCisgICAgICAgICogU3R5bGVCZW5jaC9yZXNvdXJjZXMvc3R5bGUtYmVuY2guaHRt
bDogQWRkZWQuCisgICAgICAgICogU3R5bGVCZW5jaC9yZXNvdXJjZXMvc3R5bGUtYmVuY2guanM6
IEFkZGVkLgorCisgICAgICAgICAgICBUaGUgdGVzdCBjbGFzcy4KKworICAgICAgICAoUmFuZG9t
KToKKyAgICAgICAgKFJhbmRvbS5wcm90b3R5cGUuZ2V0IG5leHQpOgorICAgICAgICAoUmFuZG9t
LnByb3RvdHlwZS5jaGFuY2UpOgorICAgICAgICAoUmFuZG9tLnByb3RvdHlwZS5udW1iZXIpOgor
ICAgICAgICAobmV4dEFuaW1hdGlvbkZyYW1lKToKKyAgICAgICAgKGRlZmF1bHRDb25maWd1cmF0
aW9uKToKKyAgICAgICAgKGRlc2NlbmRhbnRDb21iaW5hdG9yQ29uZmlndXJhdGlvbik6CisgICAg
ICAgIChzaWJsaW5nQ29tYmluYXRvckNvbmZpZ3VyYXRpb24pOgorICAgICAgICAocHNldWRvQ2xh
c3NDb25maWd1cmF0aW9uKToKKyAgICAgICAgKGJlZm9yZUFuZEFmdGVyQ29uZmlndXJhdGlvbik6
CisgICAgICAgIChwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMpOgorCisgICAgICAgICAgICBGb3Vy
IHByZWRlZmluZWQgY29uZmlndXJhdGlvbnMuCisKKyAgICAgICAgKHByb3RvdHlwZS5yYW5kb21F
bGVtZW50TmFtZSk6CisgICAgICAgIChwcm90b3R5cGUucmFuZG9tQ29tYmluYXRvcik6CisgICAg
ICAgIChwcm90b3R5cGUucmFuZG9tUHNldWRvQ2xhc3MpOgorICAgICAgICAocHJvdG90eXBlLm1h
a2VTaW1wbGVTZWxlY3Rvcik6CisgICAgICAgIChwcm90b3R5cGUubWFrZVNlbGVjdG9yKToKKyAg
ICAgICAgKHByb3RvdHlwZS5nZXQgcmFuZG9tQ29sb3JDb21wb25lbnQpOgorICAgICAgICAocHJv
dG90eXBlLm1ha2VEZWNsYXJhdGlvbik6CisgICAgICAgIChwcm90b3R5cGUubWFrZVJ1bGUpOgor
ICAgICAgICAocHJvdG90eXBlLm1ha2VTdHlsZXNoZWV0KToKKyAgICAgICAgKHByb3RvdHlwZS5t
YWtlU3R5bGUpOgorICAgICAgICAocHJvdG90eXBlLm1ha2VFbGVtZW50KToKKyAgICAgICAgKHBy
b3RvdHlwZS5tYWtlVHJlZVdpdGhEZXB0aCk6CisgICAgICAgIChwcm90b3R5cGUubWFrZVRyZWUp
OgorICAgICAgICAocHJvdG90eXBlLnVwZGF0ZUNhY2hlZFRlc3RFbGVtZW50cyk6CisgICAgICAg
IChwcm90b3R5cGUucmFuZG9tVHJlZUVsZW1lbnQpOgorICAgICAgICAocHJvdG90eXBlLmFkZENs
YXNzZXMpOgorICAgICAgICAocHJvdG90eXBlLnJlbW92ZUNsYXNzZXMpOgorICAgICAgICAocHJv
dG90eXBlLmFkZExlYWZFbGVtZW50cyk6CisgICAgICAgIChwcm90b3R5cGUucmVtb3ZlTGVhZkVs
ZW1lbnRzKToKKyAgICAgICAgKHByb3RvdHlwZS5hc3luYy5ydW5Gb3JldmVyKToKKyAgICAgICAg
KiBTdHlsZUJlbmNoL3Jlc291cmNlcy90ZXN0cy5qczogQWRkZWQuCisgICAgICAgIChtYWtlU3Rl
cHMpOgorICAgICAgICAobWFrZVN1aXRlKToKKworICAgICAgICAgICAgR2VuZXJhdGVzIFNwZWVk
b21ldGVyIFN1aXRlcy4KKwogMjAxNy0xMS0yMiAgQW50dGkgS29pdmlzdG8gIDxhbnR0aUBhcHBs
ZS5jb20+CiAKICAgICAgICAgQWRkIHBlcmZvcm1hbmNlIHRlc3QgZm9yIGlubGluZXMgYW5kIGlu
bGluZS1ibG9ja3Mgd2l0aG91dCB0ZXh0CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL1N0eWxlQmVu
Y2gvSW50ZXJhY3RpdmVSdW5uZXIuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3Rz
L1N0eWxlQmVuY2gvSW50ZXJhY3RpdmVSdW5uZXIuaHRtbAkobm9uZXhpc3RlbnQpCisrKyBQZXJm
b3JtYW5jZVRlc3RzL1N0eWxlQmVuY2gvSW50ZXJhY3RpdmVSdW5uZXIuaHRtbAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDE3NCBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgor
PHRpdGxlPlNwZWVkb21ldGVyIDIuMCBJbnRlcmFjdGl2ZSBSdW5uZXI8L3RpdGxlPgorPHNjcmlw
dCBzcmM9Ii4uL1NwZWVkb21ldGVyL3Jlc291cmNlcy9iZW5jaG1hcmstcnVubmVyLmpzIiBkZWZl
cj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi9TcGVlZG9tZXRlci9yZXNvdXJjZXMvc2VsZWN0
b3ItYmVuY2guanMiIGRlZmVyPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uL1NwZWVkb21ldGVy
L3Jlc291cmNlcy90ZXN0cy5qcyIgZGVmZXI+PC9zY3JpcHQ+Cis8c3R5bGU+CitpZnJhbWUgeyBi
b3JkZXI6IDFweCBzb2xpZCBibGFjazsgfQorb2wgeyBsaXN0LXN0eWxlOiBub25lOyBtYXJnaW46
IDA7IHBhZGRpbmc6IDA7IH0KK29sIG9sIHsgbWFyZ2luLWxlZnQ6IDJlbTsgbGlzdC1wb3NpdGlv
bjogb3V0c2lkZTsgfQorLnJ1bm5pbmcgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQor
LnJhbiB7IGNvbG9yOiBncmV5OyB9CituYXYgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAx
MHB4OyBoZWlnaHQ6IDYwMHB4OyB9CituYXYgPiBvbCB7IGhlaWdodDogMTAwJTsgb3ZlcmZsb3ct
eTogc2Nyb2xsOyB9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8c2NyaXB0PgorCitmdW5j
dGlvbiBmb3JtYXRUZXN0TmFtZShzdWl0ZU5hbWUsIHRlc3ROYW1lKSB7CisgICAgcmV0dXJuIHN1
aXRlTmFtZSArICh0ZXN0TmFtZSA/ICcvJyArIHRlc3ROYW1lIDogJycpOworfQorCitmdW5jdGlv
biBjcmVhdGVVSUZvclN1aXRlcyhzdWl0ZXMsIG9uc3RlcCwgb25ydW4pIHsKKyAgICB2YXIgY29u
dHJvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25hdicpOworICAgIHZhciBvbCA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ29sJyk7CisgICAgdmFyIGNoZWNrYm94ZXMgPSBbXTsKKyAgICBm
b3IgKHZhciBzdWl0ZUluZGV4ID0gMDsgc3VpdGVJbmRleCA8IHN1aXRlcy5sZW5ndGg7IHN1aXRl
SW5kZXgrKykgeworICAgICAgICB2YXIgc3VpdGUgPSBzdWl0ZXNbc3VpdGVJbmRleF07CisgICAg
ICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CisgICAgICAgIHZhciBj
aGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CisgICAgICAgIGNoZWNr
Ym94LmlkID0gc3VpdGUubmFtZTsKKyAgICAgICAgY2hlY2tib3gudHlwZSA9ICdjaGVja2JveCc7
CisgICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSAhc3VpdGUuZGlzYWJsZWQ7CisgICAgICAgIGNo
ZWNrYm94Lm9uY2hhbmdlID0gKGZ1bmN0aW9uIChzdWl0ZSwgY2hlY2tib3gpIHsgcmV0dXJuIGZ1
bmN0aW9uICgpIHsgc3VpdGUuZGlzYWJsZWQgPSAhY2hlY2tib3guY2hlY2tlZDsgfSB9KShzdWl0
ZSwgY2hlY2tib3gpOworICAgICAgICBjaGVja2JveC5vbmNoYW5nZSgpOworICAgICAgICBjaGVj
a2JveGVzLnB1c2goY2hlY2tib3gpOworCisgICAgICAgIGxpLmFwcGVuZENoaWxkKGNoZWNrYm94
KTsKKyAgICAgICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTsK
KyAgICAgICAgbGFiZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZm9ybWF0
VGVzdE5hbWUoc3VpdGUubmFtZSkpKTsKKyAgICAgICAgbGkuYXBwZW5kQ2hpbGQobGFiZWwpOwor
ICAgICAgICBsYWJlbC5odG1sRm9yID0gY2hlY2tib3guaWQ7CisKKyAgICAgICAgdmFyIHRlc3RM
aXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb2wnKTsKKyAgICAgICAgZm9yICh2YXIgdGVz
dEluZGV4ID0gMDsgdGVzdEluZGV4IDwgc3VpdGUudGVzdHMubGVuZ3RoOyB0ZXN0SW5kZXgrKykg
eworICAgICAgICAgICAgdmFyIHRlc3RJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGkn
KTsKKyAgICAgICAgICAgIHZhciB0ZXN0ID0gc3VpdGUudGVzdHNbdGVzdEluZGV4XTsKKyAgICAg
ICAgICAgIHZhciBhbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CisgICAgICAg
ICAgICBhbmNob3IuaWQgPSBzdWl0ZS5uYW1lICsgJy0nICsgdGVzdC5uYW1lOworICAgICAgICAg
ICAgdGVzdC5hbmNob3IgPSBhbmNob3I7CisgICAgICAgICAgICBhbmNob3IuYXBwZW5kQ2hpbGQo
ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZm9ybWF0VGVzdE5hbWUoc3VpdGUubmFtZSwgdGVzdC5u
YW1lKSkpOworICAgICAgICAgICAgdGVzdEl0ZW0uYXBwZW5kQ2hpbGQoYW5jaG9yKTsKKyAgICAg
ICAgICAgIHRlc3RMaXN0LmFwcGVuZENoaWxkKHRlc3RJdGVtKTsKKyAgICAgICAgfQorICAgICAg
ICBsaS5hcHBlbmRDaGlsZCh0ZXN0TGlzdCk7CisKKyAgICAgICAgb2wuYXBwZW5kQ2hpbGQobGkp
OworICAgIH0KKworICAgIGNvbnRyb2wuYXBwZW5kQ2hpbGQob2wpOworCisgICAgdmFyIGJ1dHRv
biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOworICAgIGJ1dHRvbi50ZXh0Q29u
dGVudCA9ICdTdGVwJzsKKyAgICBidXR0b24ub25jbGljayA9IG9uc3RlcDsKKyAgICBjb250cm9s
LmFwcGVuZENoaWxkKGJ1dHRvbik7CisKKyAgICB2YXIgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgnYnV0dG9uJyk7CisgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1J1bic7CisgICAg
YnV0dG9uLmlkID0gJ3J1blN1aXRlcyc7CisgICAgYnV0dG9uLm9uY2xpY2sgPSBvbnJ1bjsKKyAg
ICBjb250cm9sLmFwcGVuZENoaWxkKGJ1dHRvbik7CisKKyAgICB2YXIgYnV0dG9uID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CisgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1Nl
bGVjdCBhbGwnOworICAgIGJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkgeworICAgICAgICBm
b3IgKHZhciBzdWl0ZUluZGV4ID0gMDsgc3VpdGVJbmRleCA8IHN1aXRlcy5sZW5ndGg7IHN1aXRl
SW5kZXgrKykgeworICAgICAgICAgICAgc3VpdGVzW3N1aXRlSW5kZXhdLmRpc2FibGVkID0gZmFs
c2U7CisgICAgICAgICAgICBjaGVja2JveGVzW3N1aXRlSW5kZXhdLmNoZWNrZWQgPSB0cnVlOwor
ICAgICAgICB9CisgICAgfTsKKyAgICBjb250cm9sLmFwcGVuZENoaWxkKGJ1dHRvbik7CisKKyAg
ICB2YXIgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CisgICAgYnV0
dG9uLnRleHRDb250ZW50ID0gJ1Vuc2VsZWN0IGFsbCc7CisgICAgYnV0dG9uLm9uY2xpY2sgPSBm
dW5jdGlvbiAoKSB7CisgICAgICAgIGZvciAodmFyIHN1aXRlSW5kZXggPSAwOyBzdWl0ZUluZGV4
IDwgc3VpdGVzLmxlbmd0aDsgc3VpdGVJbmRleCsrKSB7CisgICAgICAgICAgICBzdWl0ZXNbc3Vp
dGVJbmRleF0uZGlzYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgY2hlY2tib3hlc1tzdWl0ZUlu
ZGV4XS5jaGVja2VkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgIH07CisgICAgY29udHJvbC5h
cHBlbmRDaGlsZChidXR0b24pOworCisgICAgcmV0dXJuIGNvbnRyb2w7Cit9CisKK3ZhciBwYXJz
ZVF1ZXJ5U3RyaW5nID0gKGZ1bmN0aW9uIChwYWlyTGlzdCkgeworICAgIHZhciBwYWlycyA9IHt9
OworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFpckxpc3QubGVuZ3RoOyArK2kpIHsKKyAgICAg
ICAgdmFyIGtleVZhbHVlID0gcGFpckxpc3RbaV0uc3BsaXQoJz0nLCAyKTsKKyAgICAgICAgaWYg
KGtleVZhbHVlLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgcGFpcnNba2V5VmFsdWVbMF1dID0g
Jyc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhaXJzW2tleVZhbHVlWzBdXSA9IGRlY29k
ZVVSSUNvbXBvbmVudChrZXlWYWx1ZVsxXS5yZXBsYWNlKC9cKy9nLCAnICcpKTsKKyAgICB9Cisg
ICAgcmV0dXJuIHBhaXJzOworfSkod2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHIoMSkuc3Bs
aXQoJyYnKSk7CisKK2Z1bmN0aW9uIGRpc2FibGVBbGxTdWl0ZXNFeGNlcHQoc3VpdGVOYW1lKSB7
CisgICAgU3VpdGVzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAgICBpZiAoZWxl
bWVudC5uYW1lICE9PSBzdWl0ZU5hbWUpCisgICAgICAgICAgICBlbGVtZW50LmRpc2FibGVkID0g
dHJ1ZTsKKyAgICB9KTsKK30KKworZnVuY3Rpb24gc3RhcnRUZXN0KCkgeworICAgIHZhciBxdWVy
eVBhcmFtID0gcGFyc2VRdWVyeVN0cmluZ1snc3VpdGUnXTsKKyAgICBpZiAocXVlcnlQYXJhbSAh
PT0gdW5kZWZpbmVkKQorICAgICAgICBkaXNhYmxlQWxsU3VpdGVzRXhjZXB0KHF1ZXJ5UGFyYW0p
OworCisgICAgdmFyIHJ1bm5lciA9IG5ldyBCZW5jaG1hcmtSdW5uZXIoU3VpdGVzLCB7CisgICAg
ICAgIHdpbGxSdW5UZXN0OiBmdW5jdGlvbiAoc3VpdGUsIHRlc3QpIHsKKyAgICAgICAgICAgIHRl
c3QuYW5jaG9yLmNsYXNzTGlzdC5hZGQoJ3J1bm5pbmcnKTsKKyAgICAgICAgfSwKKyAgICAgICAg
ZGlkUnVuVGVzdDogZnVuY3Rpb24gKHN1aXRlLCB0ZXN0KSB7CisgICAgICAgICAgICB2YXIgY2xh
c3NMaXN0ID0gdGVzdC5hbmNob3IuY2xhc3NMaXN0OworICAgICAgICAgICAgY2xhc3NMaXN0LnJl
bW92ZSgncnVubmluZycpOworICAgICAgICAgICAgY2xhc3NMaXN0LmFkZCgncmFuJyk7CisgICAg
ICAgIH0sCisgICAgICAgIGRpZFJ1blN1aXRlczogZnVuY3Rpb24gKG1lYXN1cmVkVmFsdWVzKSB7
CisgICAgICAgICAgICB2YXIgcmVzdWx0cyA9ICcnOworICAgICAgICAgICAgZm9yICh2YXIgc3Vp
dGVOYW1lIGluIG1lYXN1cmVkVmFsdWVzLnRlc3RzKSB7CisgICAgICAgICAgICAgICAgdmFyIHN1
aXRlUmVzdWx0cyA9IG1lYXN1cmVkVmFsdWVzLnRlc3RzW3N1aXRlTmFtZV07CisgICAgICAgICAg
ICAgICAgZm9yICh2YXIgdGVzdE5hbWUgaW4gc3VpdGVSZXN1bHRzLnRlc3RzKSB7CisgICAgICAg
ICAgICAgICAgICAgIHZhciB0ZXN0UmVzdWx0cyA9IHN1aXRlUmVzdWx0cy50ZXN0c1t0ZXN0TmFt
ZV07CisgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN1YnRlc3ROYW1lIGluIHRlc3RSZXN1
bHRzLnRlc3RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzICs9IHN1aXRlTmFt
ZSArICcgOiAnICsgdGVzdE5hbWUgKyAnIDogJyArIHN1YnRlc3ROYW1lCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKyAnOiAnICsgdGVzdFJlc3VsdHMudGVzdHNbc3VidGVzdE5hbWVdICsg
JyBtc1xuJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICByZXN1bHRzICs9IHN1aXRlTmFtZSArICcgOiAnICsgc3VpdGVSZXN1bHRzLnRv
dGFsICsgJyBtc1xuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdHMgKz0gJ0Fy
aXRobWV0aWMgTWVhbiA6ICcgKyBtZWFzdXJlZFZhbHVlcy5tZWFuICArICcgbXNcbic7CisgICAg
ICAgICAgICByZXN1bHRzICs9ICdHZW9tZXRyaWMgTWVhbiA6ICcgKyBtZWFzdXJlZFZhbHVlcy5n
ZW9tZWFuICArICcgbXNcbic7CisgICAgICAgICAgICByZXN1bHRzICs9ICdUb3RhbCA6ICcgKyBt
ZWFzdXJlZFZhbHVlcy50b3RhbCArICcgbXNcbic7CisgICAgICAgICAgICByZXN1bHRzICs9ICdT
Y29yZSA6ICcgKyBtZWFzdXJlZFZhbHVlcy5zY29yZSArICcgcnBtXG4nOworCisgICAgICAgICAg
ICBpZiAoIXJlc3VsdHMpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB2
YXIgcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7CisgICAgICAgICAgICBkb2N1
bWVudC5ib2R5LmFwcGVuZENoaWxkKHByZSk7CisgICAgICAgICAgICBwcmUudGV4dENvbnRlbnQg
PSByZXN1bHRzOworICAgICAgICB9CisgICAgfSk7CisKKyAgICB2YXIgY3VycmVudFN0YXRlID0g
bnVsbDsKKworICAgIC8vIERvbid0IGNhbGwgc3RlcCB3aGlsZSBzdGVwIGlzIGFscmVhZHkgZXhl
Y3V0aW5nLgorICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY3JlYXRlVUlGb3JTdWl0ZXMo
U3VpdGVzLAorICAgICAgICBmdW5jdGlvbiAoKSB7IHJ1bm5lci5zdGVwKGN1cnJlbnRTdGF0ZSku
dGhlbihmdW5jdGlvbiAoc3RhdGUpIHsgY3VycmVudFN0YXRlID0gc3RhdGU7IH0pOyB9LAorICAg
ICAgICBmdW5jdGlvbiAoKSB7IHJ1bm5lci5ydW5BbGxTdGVwcyhjdXJyZW50U3RhdGUpOyBjdXJy
ZW50U3RhdGUgPSBudWxsOyB9KSk7CisKKyAgICBpZiAocGFyc2VRdWVyeVN0cmluZ1snc3RhcnRB
dXRvbWF0aWNhbGx5J10gIT09IHVuZGVmaW5lZCkKKyAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVu
dEJ5SWQoJ3J1blN1aXRlcycpLmNsaWNrKCk7Cit9CisKK3dpbmRvdy5hZGRFdmVudExpc3RlbmVy
KCdsb2FkJywgc3RhcnRUZXN0KTsKKworPC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4
OiBQZXJmb3JtYW5jZVRlc3RzL1N0eWxlQmVuY2gvaW5kZXguaHRtbAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQ
ZXJmb3JtYW5jZVRlc3RzL1N0eWxlQmVuY2gvaW5kZXguaHRtbAkobm9uZXhpc3RlbnQpCisrKyBQ
ZXJmb3JtYW5jZVRlc3RzL1N0eWxlQmVuY2gvaW5kZXguaHRtbAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDg1IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEg
aHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRm
LTgiPgorICAgIDx0aXRsZT5TdHlsZUJlbmNoIDAuMTwvdGl0bGU+CisgICAgPGxpbmsgcmVsPSJz
dHlsZXNoZWV0IiBocmVmPSIuLi9TcGVlZG9tZXRlci9yZXNvdXJjZXMvbWFpbi5jc3MiPgorICAg
IDxzY3JpcHQgc3JjPSIuLi9TcGVlZG9tZXRlci9yZXNvdXJjZXMvbWFpbi5qcyIgZGVmZXI+PC9z
Y3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1NwZWVkb21ldGVyL3Jlc291cmNlcy9iZW5jaG1h
cmstcnVubmVyLmpzIiBkZWZlcj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL2JlbmNobWFyay1yZXBvcnQuanMiIGRlZmVyPjwvc2NyaXB0PgorICAg
IDxzY3JpcHQgc3JjPSIuLi9yZXNvdXJjZXMvc3RhdGlzdGljcy5qcyIgZGVmZXI+PC9zY3JpcHQ+
CisgICAgPHNjcmlwdCBzcmM9InJlc291cmNlcy9zdHlsZS1iZW5jaC5qcyIgZGVmZXI+PC9zY3Jp
cHQ+CisgICAgPHNjcmlwdCBzcmM9InJlc291cmNlcy90ZXN0cy5qcyIgZGVmZXI+PC9zY3JpcHQ+
CisgICAgPHNjcmlwdD4KKyAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHsK
KyAgICAgICAgICAgIGlmICghd2luZG93LmxvY2F0aW9uLnByb3RvY29sLnN0YXJ0c1dpdGgoJ2h0
dHAnKSkKKyAgICAgICAgICAgICAgICBzaG93U2VjdGlvbignbG9jYWwtbWVzc2FnZScsIGZhbHNl
KTsKKyAgICAgICAgfSk7CisgICAgPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxtYWluPgor
ICAgIDxhIGlkPSJsb2dvLWxpbmsiIGhyZWY9ImphdmFzY3JpcHQ6c2hvd0hvbWUoKSI+PC9hPgor
CisgICAgPHNlY3Rpb24gaWQ9ImhvbWUiIGNsYXNzPSJzZWxlY3RlZCI+CisgICAgICAgIDxwPgor
ICAgICAgICAgICAgU3R5bGVCZW5jaCBpcyBhIGJyb3dzZXIgYmVuY2htYXJrIHRoYXQgbWVhc3Vy
ZXMgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBzdHlsZSByZXNvbHV0aW9uIG1lY2hhbmlzbS4KKyAg
ICAgICAgPC9wPgorICAgICAgICA8cCBpZD0ic2NyZWVuLXNpemUtd2FybmluZyI+PHN0cm9uZz4K
KyAgICAgICAgICAgIFlvdXIgYnJvd3NlciB3aW5kb3cgaXMgdG9vIHNtYWxsLiBGb3IgbW9zdCBh
Y2N1cmF0ZSByZXN1bHRzLCBwbGVhc2UgbWFrZSB0aGUgdmlldyBwb3J0IHNpemUgYXQgbGVhc3Qg
ODUwcHggYnkgNjUwcHguPGJyPgorICAgICAgICAgICAgSXQncyBjdXJyZW50bHkgPHNwYW4gaWQ9
InNjcmVlbi1zaXplIj48L3NwYW4+LgorICAgICAgICA8L3N0cm9uZz4KKyAgICAgICAgPGRpdiBj
bGFzcz0iYnV0dG9ucyI+CisgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9InN0YXJ0VGVzdCgp
Ij5TdGFydCBUZXN0PC9idXR0b24+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8cCBjbGFzcz0i
c2hvdy1hYm91dCI+PGEgaHJlZj0iamF2YXNjcmlwdDpzaG93QWJvdXQoKSI+QWJvdXQgU3R5bGVC
ZW5jaDwvYT48L3A+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9InJ1bm5pbmci
PgorICAgICAgICA8ZGl2IGlkPSJ0ZXN0Q29udGFpbmVyIj48L2Rpdj4KKyAgICAgICAgPGRpdiBp
ZD0icHJvZ3Jlc3MiPjxkaXYgaWQ9InByb2dyZXNzLWNvbXBsZXRlZCI+PC9kaXY+PC9kaXY+Cisg
ICAgICAgIDxkaXYgaWQ9ImluZm8iPjwvZGl2PgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0
aW9uIGlkPSJzdW1tYXJpemVkLXJlc3VsdHMiPgorICAgICAgICA8aDE+UnVucyAvIE1pbnV0ZTwv
aDE+CisgICAgICAgIDxkaXYgY2xhc3M9ImdhdWdlIj48ZGl2IGNsYXNzPSJ3aW5kb3ciPjxkaXYg
Y2xhc3M9Im5lZWRsZSI+PC9kaXY+PC9kaXY+PC9kaXY+CisgICAgICAgIDxocj4KKyAgICAgICAg
PGRpdiBpZD0icmVzdWx0LW51bWJlciI+PC9kaXY+CisgICAgICAgIDxkaXYgaWQ9ImNvbmZpZGVu
Y2UtbnVtYmVyIj48L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucyI+CisgICAgICAg
ICAgICA8YnV0dG9uIG9uY2xpY2s9InN0YXJ0VGVzdCgpIj5UZXN0IEFnYWluPC9idXR0b24+Cisg
ICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJzaG93LWRldGFpbHMiIG9uY2xpY2s9InNob3dSZXN1
bHREZXRhaWxzKCkiPkRldGFpbHM8L2J1dHRvbj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9zZWN0
aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9ImRldGFpbGVkLXJlc3VsdHMiPgorICAgICAgICA8aDE+
RGV0YWlsZWQgUmVzdWx0czwvaDE+CisgICAgICAgIDx0YWJsZSBjbGFzcz0icmVzdWx0cy10YWJs
ZSI+PC90YWJsZT4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJyZXN1bHRzLXRhYmxlIj48L3RhYmxl
PgorICAgICAgICA8ZGl2IGNsYXNzPSJhcml0aG1ldGljLW1lYW4iPjxsYWJlbD5Bcml0aG1ldGlj
IE1lYW46PC9sYWJlbD48c3BhbiBpZD0icmVzdWx0cy13aXRoLXN0YXRpc3RpY3MiPjwvc3Bhbj48
L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucyI+CisgICAgICAgICAgICA8YnV0dG9u
IG9uY2xpY2s9InN0YXJ0VGVzdCgpIj5UZXN0IEFnYWluPC9idXR0b24+CisgICAgICAgICAgICA8
YnV0dG9uIGlkPSJzaG93LXN1bW1hcnkiIG9uY2xpY2s9InNob3dSZXN1bHRzU3VtbWFyeSgpIj5T
dW1tYXJ5PC9idXR0b24+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8cCBjbGFzcz0ic2hvdy1h
Ym91dCI+PGEgaHJlZj0iamF2YXNjcmlwdDpzaG93QWJvdXQoKSI+QWJvdXQgU3R5bGVCZW5jaDwv
YT48L3A+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9ImFib3V0Ij4KKyAgICAg
ICAgPGgxPkFib3V0IFN0eWxlQmVuY2g8L2gxPgorCisgICAgICAgIDxwPlN0eWxlQmVuY2ggdGVz
dHMgcGVyZm9ybWFuY2Ugb2YgQ1NTIHN0eWxlIHJlc29sdXRpb24gYW5kIHN0eWxlIGludmFsaWRh
dGlvbi4gRWFjaCB0ZXN0IHJ1biBjcmVhdGVzIGEgbGFyZ2UgZG9jdW1lbnQgYW5kIGEgbGFyZ2Ug
c3R5bGVzaGVldCB1c2luZyB2YXJ5aW5nIHNldHRpbmdzLiBJdCB0aGVuIGFwcGxpZXMgYSBzZXJp
ZXMgb2YgbXV0YXRpb25zIHRvIHRoZSBkb2N1bWVudCBhbmQgbWVhc3VyZXMgdGhlIHRpbWUgdG8g
dXBkYXRlIHRoZSByZW5kZXJpbmcuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNpbXBsZSwgbW9z
dCBvZiB0aGUgcHJlc3N1cmUgaXMgb24gc2VsZWN0b3IgbWF0Y2hpbmcuPC9wPgorCisgICAgICAg
IDxwPlN0eWxlQmVuY2ggdXNlcyBTcGVlZG9tZXRlciBmcmFtZXdvcmsgZm9yIFVJIGFuZCBtZWFz
dXJlbWVudHMuPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiBpZD0ibG9jYWwtbWVz
c2FnZSI+CisgICAgICAgIDxoMj5BY2Nlc3MgdmlhICdmaWxlOicgcHJvdG9jb2w8L2gxPgorICAg
ICAgICA8cD5UbyBydW4gbG9jYWxseSwgbGF1bmNoIGEgd2ViIHNlcnZlciB1bmRlciBQZXJmb3Jt
YW5jZVRlc3RzIGRpcmVjdG9yeSB3aXRoICdweXRob24gLW0gU2ltcGxlSFRUUFNlcnZlciA4MDAx
JyBhbmQgYWNjZXNzIHZpYSA8YSBocmVmPSJodHRwOi8vbG9jYWxob3N0OjgwMDEvU3R5bGVCZW5j
aCI+aHR0cDovL2xvY2FsaG9zdDo4MDAxL1N0eWxlQmVuY2g8L2E+LgorICAgICAgICA8L3A+Cisg
ICAgICAgIDxwPgorICAgICAgICAgICAgSW5kaXZpZHVhbCB0ZXN0cyAod2l0aG91dCBtZWFzdXJl
bWVudCkgY2FuIGFsc28gYmUgcnVuIGxvY2FsbHkgYnkgb3BlbmluZyA8YSBocmVmPSJyZXNvdXJj
ZXMvc3R5bGUtYmVuY2guaHRtbCI+UGVyZm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNoL3Jlc291cmNl
cy9zdHlsZS1iZW5jaC5odG1sPC9hPgorICAgICAgICA8L3A+CisgICAgPC9zZWN0aW9uPgorPC9t
YWluPgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNo
L3Jlc291cmNlcy9zdHlsZS1iZW5jaC5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVz
dHMvU3R5bGVCZW5jaC9yZXNvdXJjZXMvc3R5bGUtYmVuY2guaHRtbAkobm9uZXhpc3RlbnQpCisr
KyBQZXJmb3JtYW5jZVRlc3RzL1N0eWxlQmVuY2gvcmVzb3VyY2VzL3N0eWxlLWJlbmNoLmh0bWwJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMiBAQAorPCFkb2N0eXBlIGh0bWw+Cis8c2NyaXB0
IHNyYz0ic3R5bGUtYmVuY2guanMiPjwvc2NyaXB0PgorPGJvZHk+Cis8ZGl2IGlkPSJ0ZXN0cm9v
dCI+PC9kaXY+Cis8ZGl2IGlkPSJjb250cm9scyI+Cis8c2VsZWN0Pjwvc2VsZWN0PgorPGJ1dHRv
biBvbmNsaWNrPSJjcmVhdGVCZW5jaG1hcmtGcm9tU2VsZWN0KCkiPkluaXRpYWxpemU8L2J1dHRv
bj4KKzxidXR0b24gb25jbGljaz0iY3JlYXRlQmVuY2htYXJrRnJvbVNlbGVjdCgpLnJ1bkZvcmV2
ZXIoKSI+SW5pdGlhbGl6ZSBhbmQgcnVuPC9idXR0b24+Cis8L2Rpdj4KKzxzY3JpcHQ+Citjb25z
dCBjb25maWd1cmF0aW9ucyA9IFN0eWxlQmVuY2gucHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7
CisKK2NvbnN0IHNlbGVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjb250cm9scyBzZWxl
Y3QiKTsKK2ZvciAoY29uc3QgY29uZmlndXJhdGlvbiBvZiBjb25maWd1cmF0aW9ucykgeworICAg
IGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOworICAgIG9w
dGlvbi5pbm5lckhUTUwgPSBjb25maWd1cmF0aW9uLm5hbWU7CisgICAgc2VsZWN0LmFwcGVuZENo
aWxkKG9wdGlvbik7Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZUJlbmNobWFyayhjb25maWd1cmF0aW9u
KQoreworICAgIGNvbnRyb2xzLnJlbW92ZSgpOworCisgICAgcmV0dXJuIG5ldyBTdHlsZUJlbmNo
KGNvbmZpZ3VyYXRpb24pOworfQorCitmdW5jdGlvbiBjcmVhdGVCZW5jaG1hcmtGcm9tU2VsZWN0
KCkKK3sKKyAgICByZXR1cm4gY3JlYXRlQmVuY2htYXJrKGNvbmZpZ3VyYXRpb25zW3NlbGVjdC5z
ZWxlY3RlZEluZGV4XSk7Cit9Cis8L3NjcmlwdD4KKwpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9T
dHlsZUJlbmNoL3Jlc291cmNlcy9zdHlsZS1iZW5jaC5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3Jt
YW5jZVRlc3RzL1N0eWxlQmVuY2gvcmVzb3VyY2VzL3N0eWxlLWJlbmNoLmpzCShub25leGlzdGVu
dCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvU3R5bGVCZW5jaC9yZXNvdXJjZXMvc3R5bGUtYmVuY2gu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOTQgQEAKK2NsYXNzIFJhbmRvbQoreworICAg
IGNvbnN0cnVjdG9yKHNlZWQpCisgICAgeworICAgICAgICB0aGlzLnNlZWQgPSBzZWVkICUgMjE0
NzQ4MzY0NzsKKyAgICAgICAgaWYgKHRoaXMuc2VlZCA8PSAwKQorICAgICAgICAgICAgdGhpcy5z
ZWVkICs9IDIxNDc0ODM2NDY7CisgICAgfQorCisgICAgZ2V0IG5leHQoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMuc2VlZCA9IHRoaXMuc2VlZCAqIDE2ODA3ICUgMjE0NzQ4MzY0NzsKKyAg
ICB9CisKKyAgICBjaGFuY2UoY2hhbmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmV4
dCAlIDEwMDAgPCBjaGFuY2UgKiAxMDAwOworICAgIH0KKworICAgIG51bWJlcih1bmRlcikKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLm5leHQgJSB1bmRlcjsKKyAgICB9Cit9CisKK2Z1bmN0
aW9uIG5leHRBbmltYXRpb25GcmFtZSgpIHsgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9
PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSkpOyB9CisKK2NsYXNzIFN0eWxlQmVuY2gK
K3sKKyAgICBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb24oKQorICAgIHsKKyAgICAgICAgY29u
c3QgY29uZmlndXJhdGlvbiA9IHsKKyAgICAgICAgICAgIG5hbWU6ICdEZWZhdWx0JywKKyAgICAg
ICAgICAgIGVsZW1lbnRUeXBlQ291bnQ6IDEwLAorICAgICAgICAgICAgZWxlbWVudENoYW5jZTog
MC41LAorICAgICAgICAgICAgY2xhc3NDb3VudDogMjAwLAorICAgICAgICAgICAgY2xhc3NDaGFu
Y2U6IDAuMywKKyAgICAgICAgICAgIGNvbWJpbmF0b3JzOiBbCisgICAgICAgICAgICAgICAgJyAn
LAorICAgICAgICAgICAgICAgICc+JywKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBwc2V1
ZG9DbGFzc2VzOiBbXSwKKyAgICAgICAgICAgIHBzZXVkb0NsYXNzQ2hhbmNlOiAwLAorICAgICAg
ICAgICAgYmVmb3JlQWZ0ZXJDaGFuY2U6IDAsCisgICAgICAgICAgICBtYXhpbXVtU2VsZWN0b3JM
ZW5ndGg6IDYsCisgICAgICAgICAgICBydWxlQ291bnQ6IDUwMDAsCisgICAgICAgICAgICBlbGVt
ZW50Q291bnQ6IDIwMDAwLAorICAgICAgICAgICAgbWF4aW11bVRyZWVEZXB0aDogNiwKKyAgICAg
ICAgICAgIG1heGltdW1UcmVlV2lkdGg6IDUwLAorICAgICAgICAgICAgcmVwZWF0aW5nU2VxdWVu
Y2VDaGFuY2U6IDAuMiwKKyAgICAgICAgICAgIHJlcGVhdGluZ1NlcXVlbmNlTWF4aW11bUxlbmd0
aDogMywKKyAgICAgICAgICAgIHJ1bnM6IDEwLAorICAgICAgICAgICAgbXV0YXRpb25DaGFuY2U6
IDAuMDEsCisgICAgICAgICAgICBzdHlsZVNlZWQ6IDEsCisgICAgICAgICAgICBkb21TZWVkOiAx
LAorICAgICAgICB9OworICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAg
ICBzdGF0aWMgZGVzY2VuZGFudENvbWJpbmF0b3JDb25maWd1cmF0aW9uKCkKKyAgICB7CisgICAg
ICAgIGxldCBjb25maWd1cmF0aW9uID0gdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbigpOworICAg
ICAgICBjb25maWd1cmF0aW9uLm5hbWUgPSAnRGVzY2VuZGFudCBjb21iaW5hdG9ycyc7CisgICAg
ICAgIHJldHVybiBjb25maWd1cmF0aW9uOworICAgIH0KKworICAgIHN0YXRpYyBzaWJsaW5nQ29t
YmluYXRvckNvbmZpZ3VyYXRpb24oKQorICAgIHsKKyAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb24g
PSB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGNvbmZpZ3VyYXRpb24ubmFt
ZSA9ICdTaWJsaW5nIGNvbWJpbmF0b3JzJzsKKyAgICAgICAgY29uZmlndXJhdGlvbi5jb21iaW5h
dG9ycyA9IFsKKyAgICAgICAgICAgICcgJywKKyAgICAgICAgICAgICcgJywKKyAgICAgICAgICAg
ICc+JywKKyAgICAgICAgICAgICc+JywKKyAgICAgICAgICAgICd+JywKKyAgICAgICAgICAgICcr
JywKKyAgICAgICAgXTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247CisgICAgfQorCisg
ICAgc3RhdGljIHBzZXVkb0NsYXNzQ29uZmlndXJhdGlvbigpCisgICAgeworICAgICAgICBsZXQg
Y29uZmlndXJhdGlvbiA9IHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgY29u
ZmlndXJhdGlvbi5uYW1lID0gJ1Bvc2l0aW9uYWwgcHNldWRvIGNsYXNzZXMnOworICAgICAgICBj
b25maWd1cmF0aW9uLnBzZXVkb0NsYXNzQ2hhbmNlID0gMC4xOworICAgICAgICBjb25maWd1cmF0
aW9uLnBzZXVkb0NsYXNzZXMgPSBbCisgICAgICAgICAgICAnbnRoLWNoaWxkKDJuKzEpJywKKyAg
ICAgICAgICAgICdudGgtbGFzdC1jaGlsZCgzbiknLAorICAgICAgICAgICAgJ250aC1vZi10eXBl
KDNuKScsCisgICAgICAgICAgICAnbnRoLWxhc3Qtb2YtdHlwZSg0biknLAorICAgICAgICAgICAg
J2ZpcnN0LWNoaWxkJywKKyAgICAgICAgICAgICdsYXN0LWNoaWxkJywKKyAgICAgICAgICAgICdm
aXJzdC1vZi10eXBlJywKKyAgICAgICAgICAgICdsYXN0LW9mLXR5cGUnLAorICAgICAgICAgICAg
J29ubHktb2YtdHlwZScsCisgICAgICAgIF07CisgICAgICAgIHJldHVybiBjb25maWd1cmF0aW9u
OworICAgIH0KKworICAgIHN0YXRpYyBiZWZvcmVBbmRBZnRlckNvbmZpZ3VyYXRpb24oKQorICAg
IHsKKyAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9u
KCk7CisgICAgICAgIGNvbmZpZ3VyYXRpb24ubmFtZSA9ICc6OmJlZm9yZSBhbmQgOjphZnRlciBw
c2V1ZG8gZWxlbWVudHMnOworICAgICAgICBjb25maWd1cmF0aW9uLmJlZm9yZUFmdGVyQ2hhbmNl
ID0gMC4xOworICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICBzdGF0
aWMgcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBbCisg
ICAgICAgICAgICB0aGlzLmRlc2NlbmRhbnRDb21iaW5hdG9yQ29uZmlndXJhdGlvbigpLAorICAg
ICAgICAgICAgdGhpcy5zaWJsaW5nQ29tYmluYXRvckNvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAg
ICAgIHRoaXMucHNldWRvQ2xhc3NDb25maWd1cmF0aW9uKCksCisgICAgICAgICAgICB0aGlzLmJl
Zm9yZUFuZEFmdGVyQ29uZmlndXJhdGlvbigpLAorICAgICAgICBdOworICAgIH0KKworICAgIGNv
bnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24pCisgICAgeworICAgICAgICB0aGlzLmNvbmZpZ3VyYXRp
b24gPSBjb25maWd1cmF0aW9uOworCisgICAgICAgIHRoaXMuYmFzZVN0eWxlID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgic3R5bGUiKTsKKyAgICAgICAgdGhpcy5iYXNlU3R5bGUudGV4dENvbnRl
bnQgPSBgCisgICAgICAgICAgICAjdGVzdHJvb3QgeworICAgICAgICAgICAgICAgIGZvbnQtc2l6
ZTogMTBweDsKKyAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMTBweDsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICN0ZXN0cm9vdCAqIHsKKyAgICAgICAgICAgICAgICBkaXNwbGF5OiBp
bmxpbmUtYmxvY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjdGVzdHJvb3QgOmVtcHR5
IHsKKyAgICAgICAgICAgICAgICB3aWR0aDoxMHB4OworICAgICAgICAgICAgICAgIGhlaWdodDox
MHB4OworICAgICAgICAgICAgfQorICAgICAgICBgOworICAgICAgICBkb2N1bWVudC5oZWFkLmFw
cGVuZENoaWxkKHRoaXMuYmFzZVN0eWxlKTsKKworICAgICAgICB0aGlzLnJhbmRvbSA9IG5ldyBS
YW5kb20odGhpcy5jb25maWd1cmF0aW9uLnN0eWxlU2VlZCk7CisgICAgICAgIHRoaXMubWFrZVN0
eWxlKCk7CisKKyAgICAgICAgdGhpcy5yYW5kb20gPSBuZXcgUmFuZG9tKHRoaXMuY29uZmlndXJh
dGlvbi5kb21TZWVkKTsKKyAgICAgICAgdGhpcy5tYWtlVHJlZSgpOworICAgIH0KKworICAgIHJh
bmRvbUVsZW1lbnROYW1lKCkKKyAgICB7CisgICAgICAgIGNvbnN0IGVsZW1lbnRUeXBlQ291bnQg
PSB0aGlzLmNvbmZpZ3VyYXRpb24uZWxlbWVudFR5cGVDb3VudDsKKyAgICAgICAgcmV0dXJuIGBl
bGVtJHsgdGhpcy5yYW5kb20ubnVtYmVyKGVsZW1lbnRUeXBlQ291bnQpIH1gOworICAgIH0KKwor
ICAgIHJhbmRvbUNsYXNzTmFtZSgpCisgICAgeworICAgICAgICBjb25zdCBjbGFzc0NvdW50ID0g
dGhpcy5jb25maWd1cmF0aW9uLmNsYXNzQ291bnQ7CisgICAgICAgIHJldHVybiBgY2xhc3MkeyB0
aGlzLnJhbmRvbS5udW1iZXIoY2xhc3NDb3VudCkgfWA7CisgICAgfQorCisgICAgcmFuZG9tQ2xh
c3NOYW1lRnJvbVJhbmdlKHJhbmdlKQorICAgIHsKKyAgICAgICAgY29uc3QgbWF4aW11bSA9IE1h
dGgucm91bmQocmFuZ2UgKiB0aGlzLmNvbmZpZ3VyYXRpb24uY2xhc3NDb3VudCk7CisgICAgICAg
IHJldHVybiBgY2xhc3MkeyB0aGlzLnJhbmRvbS5udW1iZXIobWF4aW11bSkgfWA7CisgICAgfQor
CisgICAgcmFuZG9tQ29tYmluYXRvcigpCisgICAgeworICAgICAgICBjb25zdCBjb21iaW5hdG9y
cyA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21iaW5hdG9yczsKKyAgICAgICAgcmV0dXJuIGNvbWJp
bmF0b3JzW3RoaXMucmFuZG9tLm51bWJlcihjb21iaW5hdG9ycy5sZW5ndGgpXQorICAgIH0KKwor
ICAgIHJhbmRvbVBzZXVkb0NsYXNzKCkKKyAgICB7CisgICAgICAgIGNvbnN0IHBzZXVkb0NsYXNz
ZXMgPSB0aGlzLmNvbmZpZ3VyYXRpb24ucHNldWRvQ2xhc3NlczsKKyAgICAgICAgcmV0dXJuIHBz
ZXVkb0NsYXNzZXNbdGhpcy5yYW5kb20ubnVtYmVyKHBzZXVkb0NsYXNzZXMubGVuZ3RoKV0KKyAg
ICB9CisKKyAgICBtYWtlU2ltcGxlU2VsZWN0b3IoaW5kZXgsIGxlbmd0aCkKKyAgICB7CisgICAg
ICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID09IGxlbmd0aCAtIDE7CisgICAgICAgIGNvbnN0IHVz
ZVBzZXVkb0NsYXNzID0gdGhpcy5yYW5kb20uY2hhbmNlKHRoaXMuY29uZmlndXJhdGlvbi5wc2V1
ZG9DbGFzc0NoYW5jZSkgJiYgdGhpcy5jb25maWd1cmF0aW9uLnBzZXVkb0NsYXNzZXMubGVuZ3Ro
OworICAgICAgICBjb25zdCB1c2VFbGVtZW50ID0gdXNlUHNldWRvQ2xhc3MgfHwgdGhpcy5yYW5k
b20uY2hhbmNlKHRoaXMuY29uZmlndXJhdGlvbi5lbGVtZW50Q2hhbmNlKTsgLy8gOm50aC1vZi10
eXBlIGV0YyBvbmx5IG1ha2Ugc2Vuc2Ugd2l0aCBlbGVtZW50CisgICAgICAgIGNvbnN0IHVzZUNs
YXNzID0gIXVzZUVsZW1lbnQgfHwgdGhpcy5yYW5kb20uY2hhbmNlKHRoaXMuY29uZmlndXJhdGlv
bi5jbGFzc0NoYW5jZSk7CisgICAgICAgIGNvbnN0IHVzZUJlZm9yZU9yQWZ0ZXIgPSBpc0xhc3Qg
JiYgdGhpcy5yYW5kb20uY2hhbmNlKHRoaXMuY29uZmlndXJhdGlvbi5iZWZvcmVBZnRlckNoYW5j
ZSk7CisgICAgICAgIGxldCByZXN1bHQgPSAiIjsKKyAgICAgICAgaWYgKHVzZUVsZW1lbnQpCisg
ICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5yYW5kb21FbGVtZW50TmFtZSgpOworICAgICAgICBp
ZiAodXNlQ2xhc3MpIHsKKyAgICAgICAgICAgIC8vIFVzZSBhIHNtYWxsZXIgcG9vbCBvZiBjbGFz
cyBuYW1lcyBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzZWxlY3RvcnMgdG8gY3JlYXRlIGNvbnRh
aW5lcnMuCisgICAgICAgICAgICByZXN1bHQgKz0gIi4iICsgdGhpcy5yYW5kb21DbGFzc05hbWVG
cm9tUmFuZ2UoKGluZGV4ICsgMSkgLyBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmICh1
c2VQc2V1ZG9DbGFzcykKKyAgICAgICAgICAgIHJlc3VsdCArPSAgIjoiICsgdGhpcy5yYW5kb21Q
c2V1ZG9DbGFzcygpOworICAgICAgICBpZiAodXNlQmVmb3JlT3JBZnRlcikgeworICAgICAgICAg
ICAgaWYgKHRoaXMucmFuZG9tLmNoYW5jZSgwLjUpKQorICAgICAgICAgICAgICAgIHJlc3VsdCAr
PSAgIjo6YmVmb3JlIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQg
Kz0gICI6OmFmdGVyIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0K
KworICAgIG1ha2VTZWxlY3RvcigpCisgICAgeworICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlz
LnJhbmRvbS5udW1iZXIodGhpcy5jb25maWd1cmF0aW9uLm1heGltdW1TZWxlY3Rvckxlbmd0aCkg
KyAxOworICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5tYWtlU2ltcGxlU2VsZWN0b3IoMCwgbGVu
Z3RoKTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAg
ICAgICAgY29uc3QgY29tYmluYXRvciA9IHRoaXMucmFuZG9tQ29tYmluYXRvcigpOworICAgICAg
ICAgICAgaWYgKGNvbWJpbmF0b3IgIT0gJyAnKQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAi
ICIgKyBjb21iaW5hdG9yOworICAgICAgICAgICAgcmVzdWx0ICs9ICIgIiArIHRoaXMubWFrZVNp
bXBsZVNlbGVjdG9yKGksIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisKKyAgICBnZXQgcmFuZG9tQ29sb3JDb21wb25lbnQoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMucmFuZG9tLm5leHQgJSAyNTY7CisgICAgfQorCisgICAgbWFrZURlY2xh
cmF0aW9uKHNlbGVjdG9yKQorICAgIHsKKyAgICAgICAgbGV0IGRlY2xhcmF0aW9uID0gYGJhY2tn
cm91bmQtY29sb3I6IHJnYigke3RoaXMucmFuZG9tQ29sb3JDb21wb25lbnR9LCAke3RoaXMucmFu
ZG9tQ29sb3JDb21wb25lbnR9LCAke3RoaXMucmFuZG9tQ29sb3JDb21wb25lbnR9KTtgOworCisg
ICAgICAgIGlmIChzZWxlY3Rvci5lbmRzV2l0aCgnOjpiZWZvcmUnKSB8fCBzZWxlY3Rvci5lbmRz
V2l0aCgnOjphZnRlcicpKQorICAgICAgICAgICAgZGVjbGFyYXRpb24gKz0gIiBjb250ZW50OiAn
XHhhMCc7IjsKKworICAgICAgICByZXR1cm4gZGVjbGFyYXRpb247CisgICAgfQorCisgICAgbWFr
ZVJ1bGUoKQorICAgIHsKKyAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLm1ha2VTZWxlY3Rv
cigpOworICAgICAgICByZXR1cm4gc2VsZWN0b3IgKyAiIHsgIiArIHRoaXMubWFrZURlY2xhcmF0
aW9uKHNlbGVjdG9yKSArICIgfSI7CisgICAgfQorCisgICAgbWFrZVN0eWxlc2hlZXQoc2l6ZSkK
KyAgICB7CisgICAgICAgIGxldCBjc3NUZXh0ID0gIiI7CisgICAgICAgIGZvciAobGV0IGkgPSAw
OyBpIDwgc2l6ZTsgKytpKQorICAgICAgICAgICAgY3NzVGV4dCArPSB0aGlzLm1ha2VSdWxlKCkg
KyAiXG4iOworICAgICAgICByZXR1cm4gY3NzVGV4dDsKKyAgICB9CisKKyAgICBtYWtlU3R5bGUo
KQorICAgIHsKKyAgICAgICAgdGhpcy50ZXN0U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCJzdHlsZSIpOworICAgICAgICB0aGlzLnRlc3RTdHlsZS50ZXh0Q29udGVudCA9IHRoaXMubWFr
ZVN0eWxlc2hlZXQodGhpcy5jb25maWd1cmF0aW9uLnJ1bGVDb3VudCk7CisKKyAgICAgICAgZG9j
dW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLnRlc3RTdHlsZSk7CisgICAgfQorCisgICAgbWFr
ZUVsZW1lbnQoKQorICAgIHsKKyAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQodGhpcy5yYW5kb21FbGVtZW50TmFtZSgpKTsKKyAgICAgICAgY29uc3QgaGFzQ2xh
c3NlcyA9IHRoaXMucmFuZG9tLmNoYW5jZSgwLjUpOworICAgICAgICBpZiAoaGFzQ2xhc3Nlcykg
eworICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLnJhbmRvbS5udW1iZXIoMykgKyAxOwor
ICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICAgICAg
ICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLnJhbmRvbUNsYXNzTmFtZSgpKTsKKyAgICAg
ICAgfQorICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBtYWtlVHJlZVdpdGhE
ZXB0aChwYXJlbnQsIHJlbWFpbmluZ0NvdW50LCBkZXB0aCkKKyAgICB7CisgICAgICAgIGNvbnN0
IG1heGltdW1EZXB0aCA9IHRoaXMuY29uZmlndXJhdGlvbi5tYXhpbXVtVHJlZURlcHRoOworICAg
ICAgICBjb25zdCBtYXhpbXVtV2lkdGggPSAgdGhpcy5jb25maWd1cmF0aW9uLm1heGltdW1UcmVl
V2lkdGg7CisgICAgICAgIGNvbnN0IG5vbkVtcHR5Q2hhbmNlID0gKG1heGltdW1EZXB0aCAtIGRl
cHRoKSAvIG1heGltdW1EZXB0aDsKKworICAgICAgICBjb25zdCBzaG91bGRSZXBlYXQgPSB0aGlz
LnJhbmRvbS5jaGFuY2UodGhpcy5jb25maWd1cmF0aW9uLnJlcGVhdGluZ1NlcXVlbmNlQ2hhbmNl
KTsKKyAgICAgICAgY29uc3QgcmVwZWF0aW5nU2VxdWVuY2VMZW5ndGggPSBzaG91bGRSZXBlYXQg
PyB0aGlzLnJhbmRvbS5udW1iZXIodGhpcy5jb25maWd1cmF0aW9uLnJlcGVhdGluZ1NlcXVlbmNl
TWF4aW11bUxlbmd0aCkgKyAxIDogMDsKKworICAgICAgICBsZXQgY2hpbGRDb3VudCA9IDA7Cisg
ICAgICAgIGlmIChkZXB0aCA9PSAwKQorICAgICAgICAgICAgY2hpbGRDb3VudCA9IHJlbWFpbmlu
Z0NvdW50OworICAgICAgICBlbHNlIGlmICh0aGlzLnJhbmRvbS5jaGFuY2Uobm9uRW1wdHlDaGFu
Y2UpKQorICAgICAgICAgICAgY2hpbGRDb3VudCA9IHRoaXMucmFuZG9tLm51bWJlcihtYXhpbXVt
V2lkdGggKiAoZGVwdGggLyBtYXhpbXVtRGVwdGggKyAxKSk7CisKKyAgICAgICAgbGV0IHJlcGVh
dGluZ1NlcXVlbmNlID0gW107CisgICAgICAgIGxldCByZXBlYXRpbmdTZXF1ZW5jZVNpemUgPSAw
OworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7ICsraSkgeworICAgICAg
ICAgICAgaWYgKHNob3VsZFJlcGVhdCAmJiByZXBlYXRpbmdTZXF1ZW5jZS5sZW5ndGggPT0gcmVw
ZWF0aW5nU2VxdWVuY2VMZW5ndGggJiYgcmVwZWF0aW5nU2VxdWVuY2VTaXplIDwgcmVtYWluaW5n
Q291bnQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN1YnRyZWUgb2YgcmVwZWF0aW5n
U2VxdWVuY2UpCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChzdWJ0cmVl
LmNsb25lTm9kZSh0cnVlKSk7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nQ291bnQgLT0gcmVw
ZWF0aW5nU2VxdWVuY2VTaXplOworICAgICAgICAgICAgICAgIGlmICghcmVtYWluaW5nQ291bnQp
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMubWFrZUVs
ZW1lbnQoKTsKKyAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKKworICAg
ICAgICAgICAgaWYgKCEtLXJlbWFpbmluZ0NvdW50KQorICAgICAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICAgICAgcmVtYWluaW5nQ291bnQgPSB0aGlzLm1ha2VUcmVlV2l0aERlcHRoKGVs
ZW1lbnQsIHJlbWFpbmluZ0NvdW50LCBkZXB0aCArIDEpOworICAgICAgICAgICAgaWYgKCFyZW1h
aW5pbmdDb3VudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgaWYg
KHNob3VsZFJlcGVhdCAmJiByZXBlYXRpbmdTZXF1ZW5jZS5sZW5ndGggPCByZXBlYXRpbmdTZXF1
ZW5jZUxlbmd0aCkgeworCisgICAgICAgICAgICAgICAgcmVwZWF0aW5nU2VxdWVuY2UucHVzaChl
bGVtZW50KTsKKyAgICAgICAgICAgICAgICByZXBlYXRpbmdTZXF1ZW5jZVNpemUgKz0gZWxlbWVu
dC5xdWVyeVNlbGVjdG9yQWxsKCIqIikubGVuZ3RoICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICByZXR1cm4gcmVtYWluaW5nQ291bnQ7CisgICAgfQorCisgICAgbWFrZVRy
ZWUoKQorICAgIHsKKyAgICAgICAgdGhpcy50ZXN0Um9vdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0
b3IoIiN0ZXN0cm9vdCIpOworICAgICAgICBjb25zdCBlbGVtZW50Q291bnQgPSB0aGlzLmNvbmZp
Z3VyYXRpb24uZWxlbWVudENvdW50OworCisgICAgICAgIHRoaXMubWFrZVRyZWVXaXRoRGVwdGgo
dGhpcy50ZXN0Um9vdCwgZWxlbWVudENvdW50LCAwKTsKKworICAgICAgICB0aGlzLnVwZGF0ZUNh
Y2hlZFRlc3RFbGVtZW50cygpOworICAgIH0KKworICAgIHVwZGF0ZUNhY2hlZFRlc3RFbGVtZW50
cygpCisgICAgeworICAgICAgICB0aGlzLnRlc3RFbGVtZW50cyA9IHRoaXMudGVzdFJvb3QucXVl
cnlTZWxlY3RvckFsbCgiKiIpOworICAgIH0KKworICAgIHJhbmRvbVRyZWVFbGVtZW50KCkKKyAg
ICB7CisgICAgICAgIGNvbnN0IHJhbmRvbUluZGV4ID0gdGhpcy5yYW5kb20ubnVtYmVyKHRoaXMu
dGVzdEVsZW1lbnRzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiB0aGlzLnRlc3RFbGVtZW50c1ty
YW5kb21JbmRleF0KKyAgICB9CisKKyAgICBhZGRDbGFzc2VzKGNvdW50KQorICAgIHsKKyAgICAg
ICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBl
bGVtZW50ID0gdGhpcy5yYW5kb21UcmVlRWxlbWVudCgpOworCisgICAgICAgICAgICBjb25zdCBj
bGFzc0xpc3QgPSBlbGVtZW50LmNsYXNzTGlzdDsKKyAgICAgICAgICAgIGNsYXNzTGlzdC5hZGQo
dGhpcy5yYW5kb21DbGFzc05hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZW1vdmVD
bGFzc2VzKGNvdW50KQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsp
IHsKKyAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnJhbmRvbVRyZWVFbGVtZW50KCk7
CisKKyAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0OworICAg
ICAgICAgICAgY2xhc3NMaXN0LmFkZCh0aGlzLnJhbmRvbUNsYXNzTmFtZSgpKTsKKworICAgICAg
ICAgICAgY29uc3QgY2FuUmVtb3ZlID0gY2xhc3NMaXN0Lmxlbmd0aDsKKyAgICAgICAgICAgIGlm
ICghY2FuUmVtb3ZlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgKytp
OworICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShjbGFzc0xpc3RbMF0pOworICAgICAgICB9
CisgICAgfQorCisgICAgYWRkTGVhZkVsZW1lbnRzKGNvdW50KQorICAgIHsKKyAgICAgICAgZm9y
IChsZXQgaSA9IDA7IGkgPCBjb3VudDspIHsKKyAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRo
aXMucmFuZG9tVHJlZUVsZW1lbnQoKTsKKyAgICAgICAgICAgIC8vIEF2b2lkIGFsdGVyaW5nIHRy
ZWUgc2hhcGUgYnkgdHVybmluZyBtYW55IGxlYXZlcyBpbnRvIGNvbnRhaW5lcnMuCisgICAgICAg
ICAgICBpZiAoIXBhcmVudC5maXJzdENoaWxkKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgKytpOworICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBwYXJlbnQuY2hp
bGROb2RlczsKKyAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yYW5kb20ubnVtYmVyKGNo
aWxkcmVuLmxlbmd0aCArIDEpOworICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlz
Lm1ha2VFbGVtZW50KCksIGNoaWxkcmVuW2luZGV4XSk7CisgICAgICAgIH0KKyAgICAgICAgdGhp
cy51cGRhdGVDYWNoZWRUZXN0RWxlbWVudHMoKTsKKyAgICB9CisKKyAgICByZW1vdmVMZWFmRWxl
bWVudHMoY291bnQpCisgICAgeworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50Oykg
eworICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucmFuZG9tVHJlZUVsZW1lbnQoKTsK
KworICAgICAgICAgICAgY29uc3QgY2FuUmVtb3ZlID0gIWVsZW1lbnQuZmlyc3RDaGlsZCAmJiBl
bGVtZW50LnBhcmVudE5vZGU7CisgICAgICAgICAgICBpZiAoIWNhblJlbW92ZSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIGVsZW1lbnQu
cGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICB0aGlz
LnVwZGF0ZUNhY2hlZFRlc3RFbGVtZW50cygpOworICAgIH0KKworICAgIGFzeW5jIHJ1bkZvcmV2
ZXIoKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHRoaXMuYWRk
Q2xhc3NlcygxMCk7CisgICAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzZXMoMTApOworICAgICAg
ICAgICAgdGhpcy5hZGRMZWFmRWxlbWVudHMoMTApOworICAgICAgICAgICAgdGhpcy5yZW1vdmVM
ZWFmRWxlbWVudHMoMTApOworCisgICAgICAgICAgICBhd2FpdCBuZXh0QW5pbWF0aW9uRnJhbWUo
KTsKKyAgICAgICAgfQorICAgIH0KK30KSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvU3R5bGVCZW5j
aC9yZXNvdXJjZXMvdGVzdHMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9TdHls
ZUJlbmNoL3Jlc291cmNlcy90ZXN0cy5qcwkobm9uZXhpc3RlbnQpCisrKyBQZXJmb3JtYW5jZVRl
c3RzL1N0eWxlQmVuY2gvcmVzb3VyY2VzL3Rlc3RzLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMzcgQEAKK2Z1bmN0aW9uIG1ha2VTdGVwcyhjb3VudCkKK3sKKyAgICBsZXQgc3RlcHMgPSBb
XTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgc3RlcHMu
cHVzaChuZXcgQmVuY2htYXJrVGVzdFN0ZXAoJ0FkZGluZyBjbGFzc2VzJywgKGJlbmNoLCBjb250
ZW50V2luZG93LCBjb250ZW50RG9jdW1lbnQpID0+IHsKKyAgICAgICAgICAgIGJlbmNoLmFkZENs
YXNzZXMoMTAwKTsKKyAgICAgICAgfSkpOworICAgICAgICBzdGVwcy5wdXNoKG5ldyBCZW5jaG1h
cmtUZXN0U3RlcCgnUmVtb3ZpbmcgY2xhc3NlcycsIChiZW5jaCwgY29udGVudFdpbmRvdywgY29u
dGVudERvY3VtZW50KSA9PiB7CisgICAgICAgICAgICBiZW5jaC5yZW1vdmVDbGFzc2VzKDEwMCk7
CisgICAgICAgIH0pKTsKKyAgICAgICAgc3RlcHMucHVzaChuZXcgQmVuY2htYXJrVGVzdFN0ZXAo
J0FkZGluZyBsZWFmIGVsZW1lbnRzJywgKGJlbmNoLCBjb250ZW50V2luZG93LCBjb250ZW50RG9j
dW1lbnQpID0+IHsKKyAgICAgICAgICAgIGJlbmNoLmFkZExlYWZFbGVtZW50cygxMDApOworICAg
ICAgICB9KSk7CisgICAgICAgIHN0ZXBzLnB1c2gobmV3IEJlbmNobWFya1Rlc3RTdGVwKCdSZW1v
dmluZyBsZWFmIGVsZW1lbnRzJywgKGJlbmNoLCBjb250ZW50V2luZG93LCBjb250ZW50RG9jdW1l
bnQpID0+IHsKKyAgICAgICAgICAgIGJlbmNoLnJlbW92ZUxlYWZFbGVtZW50cygxMDApOworICAg
ICAgICB9KSk7CisgICAgfQorICAgIHJldHVybiBzdGVwczsKK30KKworZnVuY3Rpb24gbWFrZVN1
aXRlKGNvbmZpZ3VyYXRpb24pIHsKKyAgICBjb25zdCBzdWl0ZSA9IHsKKyAgICAgICAgbmFtZTog
Y29uZmlndXJhdGlvbi5uYW1lLAorICAgICAgICB1cmw6ICdzdHlsZS1iZW5jaC5odG1sJywKKyAg
ICAgICAgcHJlcGFyZTogKHJ1bm5lciwgY29udGVudFdpbmRvdywgY29udGVudERvY3VtZW50KSA9
PiB7CisgICAgICAgICAgICByZXR1cm4gcnVubmVyLndhaXRGb3JFbGVtZW50KCcjdGVzdHJvb3Qn
KS50aGVuKChlbGVtZW50KSA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRXaW5k
b3cuY3JlYXRlQmVuY2htYXJrKGNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgfSk7CisgICAg
ICAgIH0sCisgICAgICAgIHRlc3RzOiBtYWtlU3RlcHMoNSksCisgICAgfTsKKyAgICByZXR1cm4g
c3VpdGU7Cit9CisKK3ZhciBTdWl0ZXMgPSBbXTsKK2ZvciAoY29uc3QgY29uZmlndXJhdGlvbiBv
ZiBTdHlsZUJlbmNoLnByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKQorICAgIFN1aXRlcy5wdXNo
KG1ha2VTdWl0ZShjb25maWd1cmF0aW9uKSk7Cg==
</data>
<flag name="review"
          id="347051"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>327967</attachid>
            <date>2017-11-30 03:58:06 -0800</date>
            <delta_ts>2017-11-30 04:30:28 -0800</delta_ts>
            <desc>patch</desc>
            <filename>style-bench-2.patch</filename>
            <type>text/plain</type>
            <size>29123</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1h
bmNlVGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAyMjUyNjYpCisrKyBQZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDg3IEBACisyMDE3LTExLTI5ICBB
bnR0aSBLb2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBBZGQgU3R5bGVCZW5j
aAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTgwMTQw
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgU2ltb24gRnJhc2VyIGFuZCBKb3NlcGggUGVjb3Jhcm8u
CisKKyAgICAgICAgU3R5bGVCZW5jaCB0ZXN0cyBwZXJmb3JtYW5jZSBvZiB0aGUgQ1NTIHN0eWxl
IHJlc29sdXRpb24gYW5kIHN0eWxlIGludmFsaWRhdGlvbi4gRWFjaCB0ZXN0IHJ1bgorICAgICAg
ICBjcmVhdGVzIGEgbGFyZ2UgZG9jdW1lbnQgYW5kIGEgbGFyZ2Ugc3R5bGVzaGVldCB1c2luZyB2
YXJ5aW5nIHNldHRpbmdzLiBJdCB0aGVuIGFwcGxpZXMKKyAgICAgICAgYSBzZXJpZXMgb2YgbXV0
YXRpb25zIHRvIHRoZSBkb2N1bWVudCBhbmQgbWVhc3VyZXMgdGhlIHRpbWUgdG8gdXBkYXRlIHRo
ZSBzdHlsZSBhbmQgcmVuZGVyaW5nLgorICAgICAgICBUaGUgcmVzdWx0aW5nIGxheW91dCBpcyBz
aW1wbGUsIG1vc3Qgb2YgdGhlIHByZXNzdXJlIGlzIG9uIHNlbGVjdG9yIG1hdGNoaW5nLgorCisg
ICAgICAgIFN0eWxlQmVuY2ggdXNlcyBTcGVlZG9tZXRlciBmcmFtZXdvcmsgZm9yIFVJIGFuZCBt
ZWFzdXJlbWVudHMuIEZvciBwcm9maWxpbmcgcHVycG9zZXMsIGl0IGNhbiBhbHNvCisgICAgICAg
IGJlIHJ1biBsb2NhbGx5IGJ5IG9wZW5pbmcgc3R5bGUtYmVuY2guaHRtbCBkaXJlY3RseS4KKwor
ICAgICAgICBUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgc3VidGVzdHM6CisKKyAgICAgICAgLSBj
aGlsZCBhbmQgZGVzY2VuZGFudCBjb21iaW5hdG9ycyBvbmx5IChhbGwgb3RoZXIgdGVzdHMgaGF2
ZSB0aGVzZSB0b28pLgorICAgICAgICAtIHNpYmxpbmcgY29tYmluYXRvcnM6ICd+JyBhbmQgJysn
CisgICAgICAgIC0gcG9zaXRpb25hbCBwc2V1ZG8gY2xhc3NlczogOm50aC1jaGlsZCBhbmQgc2lt
aWxhcgorICAgICAgICAtIDo6YmVmb3JlIGFuZCA6OmFmdGVyIHBzZXVkbyBlbGVtZW50cworCisg
ICAgICAgIFRoZSBtZWFzdXJlZCBET00gbXV0YXRpb25zIGFyZToKKworICAgICAgICAtIGFkZCBj
bGFzc2VzCisgICAgICAgIC0gcmVtb3ZlIGNsYXNzZXMKKyAgICAgICAgLSBhZGQgbGVhZiBlbGVt
ZW50cworICAgICAgICAtIHJlbW92ZSBsZWFmIGVsZW1lbnRzCisKKyAgICAgICAgKiBTdHlsZUJl
bmNoOiBBZGRlZC4KKyAgICAgICAgKiBTdHlsZUJlbmNoL0ludGVyYWN0aXZlUnVubmVyLmh0bWw6
IEFkZGVkLgorCisgICAgICAgICAgICBDb3BpZWQgYW5kIGN1c3RvbWl6ZWQgZnJvbSBTcGVlZG9t
ZXRlci4KKworICAgICAgICAqIFN0eWxlQmVuY2gvaW5kZXguaHRtbDogQWRkZWQuCisKKyAgICAg
ICAgICAgIENvcGllZCBhbmQgY3VzdG9taXplZCBmcm9tIFNwZWVkb21ldGVyLgorCisgICAgICAg
ICogU3R5bGVCZW5jaC9yZXNvdXJjZXM6IEFkZGVkLgorICAgICAgICAqIFN0eWxlQmVuY2gvcmVz
b3VyY2VzL3N0eWxlLWJlbmNoLmh0bWw6IEFkZGVkLgorICAgICAgICAqIFN0eWxlQmVuY2gvcmVz
b3VyY2VzL3N0eWxlLWJlbmNoLmpzOiBBZGRlZC4KKworICAgICAgICAgICAgVGhlIHRlc3QgY2xh
c3MuCisKKyAgICAgICAgKFJhbmRvbSk6CisgICAgICAgIChSYW5kb20ucHJvdG90eXBlLmdldCBu
ZXh0KToKKyAgICAgICAgKFJhbmRvbS5wcm90b3R5cGUuY2hhbmNlKToKKyAgICAgICAgKFJhbmRv
bS5wcm90b3R5cGUubnVtYmVyKToKKyAgICAgICAgKG5leHRBbmltYXRpb25GcmFtZSk6CisgICAg
ICAgIChkZWZhdWx0Q29uZmlndXJhdGlvbik6CisgICAgICAgIChkZXNjZW5kYW50Q29tYmluYXRv
ckNvbmZpZ3VyYXRpb24pOgorICAgICAgICAoc2libGluZ0NvbWJpbmF0b3JDb25maWd1cmF0aW9u
KToKKyAgICAgICAgKHBzZXVkb0NsYXNzQ29uZmlndXJhdGlvbik6CisgICAgICAgIChiZWZvcmVB
bmRBZnRlckNvbmZpZ3VyYXRpb24pOgorICAgICAgICAocHJlZGVmaW5lZENvbmZpZ3VyYXRpb25z
KToKKworICAgICAgICAgICAgRm91ciBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb25zLgorCisgICAg
ICAgIChwcm90b3R5cGUucmFuZG9tRWxlbWVudE5hbWUpOgorICAgICAgICAocHJvdG90eXBlLnJh
bmRvbUNvbWJpbmF0b3IpOgorICAgICAgICAocHJvdG90eXBlLnJhbmRvbVBzZXVkb0NsYXNzKToK
KyAgICAgICAgKHByb3RvdHlwZS5tYWtlU2ltcGxlU2VsZWN0b3IpOgorICAgICAgICAocHJvdG90
eXBlLm1ha2VTZWxlY3Rvcik6CisgICAgICAgIChwcm90b3R5cGUuZ2V0IHJhbmRvbUNvbG9yQ29t
cG9uZW50KToKKyAgICAgICAgKHByb3RvdHlwZS5tYWtlRGVjbGFyYXRpb24pOgorICAgICAgICAo
cHJvdG90eXBlLm1ha2VSdWxlKToKKyAgICAgICAgKHByb3RvdHlwZS5tYWtlU3R5bGVzaGVldCk6
CisgICAgICAgIChwcm90b3R5cGUubWFrZVN0eWxlKToKKyAgICAgICAgKHByb3RvdHlwZS5tYWtl
RWxlbWVudCk6CisgICAgICAgIChwcm90b3R5cGUubWFrZVRyZWVXaXRoRGVwdGgpOgorICAgICAg
ICAocHJvdG90eXBlLm1ha2VUcmVlKToKKyAgICAgICAgKHByb3RvdHlwZS51cGRhdGVDYWNoZWRU
ZXN0RWxlbWVudHMpOgorICAgICAgICAocHJvdG90eXBlLnJhbmRvbVRyZWVFbGVtZW50KToKKyAg
ICAgICAgKHByb3RvdHlwZS5hZGRDbGFzc2VzKToKKyAgICAgICAgKHByb3RvdHlwZS5yZW1vdmVD
bGFzc2VzKToKKyAgICAgICAgKHByb3RvdHlwZS5hZGRMZWFmRWxlbWVudHMpOgorICAgICAgICAo
cHJvdG90eXBlLnJlbW92ZUxlYWZFbGVtZW50cyk6CisgICAgICAgIChwcm90b3R5cGUuYXN5bmMu
cnVuRm9yZXZlcik6CisgICAgICAgICogU3R5bGVCZW5jaC9yZXNvdXJjZXMvdGVzdHMuanM6IEFk
ZGVkLgorICAgICAgICAobWFrZVN0ZXBzKToKKyAgICAgICAgKG1ha2VTdWl0ZSk6CisKKyAgICAg
ICAgICAgIEdlbmVyYXRlcyBTcGVlZG9tZXRlciBTdWl0ZXMuCisKIDIwMTctMTEtMjIgIEFudHRp
IEtvaXZpc3RvICA8YW50dGlAYXBwbGUuY29tPgogCiAgICAgICAgIEFkZCBwZXJmb3JtYW5jZSB0
ZXN0IGZvciBpbmxpbmVzIGFuZCBpbmxpbmUtYmxvY2tzIHdpdGhvdXQgdGV4dApJbmRleDogUGVy
Zm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNoL0ludGVyYWN0aXZlUnVubmVyLmh0bWwKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNoL0ludGVyYWN0aXZlUnVubmVyLmh0bWwJ
KG5vbmV4aXN0ZW50KQorKysgUGVyZm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNoL0ludGVyYWN0aXZl
UnVubmVyLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzQgQEAKKzwhRE9DVFlQRSBo
dG1sPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5TcGVlZG9tZXRlciAyLjAgSW50ZXJhY3RpdmUg
UnVubmVyPC90aXRsZT4KKzxzY3JpcHQgc3JjPSIuLi9TcGVlZG9tZXRlci9yZXNvdXJjZXMvYmVu
Y2htYXJrLXJ1bm5lci5qcyIgZGVmZXI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vU3BlZWRv
bWV0ZXIvcmVzb3VyY2VzL3NlbGVjdG9yLWJlbmNoLmpzIiBkZWZlcj48L3NjcmlwdD4KKzxzY3Jp
cHQgc3JjPSIuLi9TcGVlZG9tZXRlci9yZXNvdXJjZXMvdGVzdHMuanMiIGRlZmVyPjwvc2NyaXB0
PgorPHN0eWxlPgoraWZyYW1lIHsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IH0KK29sIHsgbGlz
dC1zdHlsZTogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyB9CitvbCBvbCB7IG1hcmdpbi1s
ZWZ0OiAyZW07IGxpc3QtcG9zaXRpb246IG91dHNpZGU7IH0KKy5ydW5uaW5nIHsgdGV4dC1kZWNv
cmF0aW9uOiB1bmRlcmxpbmU7IH0KKy5yYW4geyBjb2xvcjogZ3JleTsgfQorbmF2IHsgcG9zaXRp
b246IGFic29sdXRlOyByaWdodDogMTBweDsgaGVpZ2h0OiA2MDBweDsgfQorbmF2ID4gb2wgeyBo
ZWlnaHQ6IDEwMCU7IG92ZXJmbG93LXk6IHNjcm9sbDsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxi
b2R5PgorPHNjcmlwdD4KKworZnVuY3Rpb24gZm9ybWF0VGVzdE5hbWUoc3VpdGVOYW1lLCB0ZXN0
TmFtZSkgeworICAgIHJldHVybiBzdWl0ZU5hbWUgKyAodGVzdE5hbWUgPyAnLycgKyB0ZXN0TmFt
ZSA6ICcnKTsKK30KKworZnVuY3Rpb24gY3JlYXRlVUlGb3JTdWl0ZXMoc3VpdGVzLCBvbnN0ZXAs
IG9ucnVuKSB7CisgICAgdmFyIGNvbnRyb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduYXYn
KTsKKyAgICB2YXIgb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbCcpOworICAgIHZhciBj
aGVja2JveGVzID0gW107CisgICAgZm9yICh2YXIgc3VpdGVJbmRleCA9IDA7IHN1aXRlSW5kZXgg
PCBzdWl0ZXMubGVuZ3RoOyBzdWl0ZUluZGV4KyspIHsKKyAgICAgICAgdmFyIHN1aXRlID0gc3Vp
dGVzW3N1aXRlSW5kZXhdOworICAgICAgICB2YXIgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCdsaScpOworICAgICAgICB2YXIgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdp
bnB1dCcpOworICAgICAgICBjaGVja2JveC5pZCA9IHN1aXRlLm5hbWU7CisgICAgICAgIGNoZWNr
Ym94LnR5cGUgPSAnY2hlY2tib3gnOworICAgICAgICBjaGVja2JveC5jaGVja2VkID0gIXN1aXRl
LmRpc2FibGVkOworICAgICAgICBjaGVja2JveC5vbmNoYW5nZSA9IChmdW5jdGlvbiAoc3VpdGUs
IGNoZWNrYm94KSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHN1aXRlLmRpc2FibGVkID0gIWNoZWNr
Ym94LmNoZWNrZWQ7IH0gfSkoc3VpdGUsIGNoZWNrYm94KTsKKyAgICAgICAgY2hlY2tib3gub25j
aGFuZ2UoKTsKKyAgICAgICAgY2hlY2tib3hlcy5wdXNoKGNoZWNrYm94KTsKKworICAgICAgICBs
aS5hcHBlbmRDaGlsZChjaGVja2JveCk7CisgICAgICAgIHZhciBsYWJlbCA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7CisgICAgICAgIGxhYmVsLmFwcGVuZENoaWxkKGRvY3VtZW50
LmNyZWF0ZVRleHROb2RlKGZvcm1hdFRlc3ROYW1lKHN1aXRlLm5hbWUpKSk7CisgICAgICAgIGxp
LmFwcGVuZENoaWxkKGxhYmVsKTsKKyAgICAgICAgbGFiZWwuaHRtbEZvciA9IGNoZWNrYm94Lmlk
OworCisgICAgICAgIHZhciB0ZXN0TGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29sJyk7
CisgICAgICAgIGZvciAodmFyIHRlc3RJbmRleCA9IDA7IHRlc3RJbmRleCA8IHN1aXRlLnRlc3Rz
Lmxlbmd0aDsgdGVzdEluZGV4KyspIHsKKyAgICAgICAgICAgIHZhciB0ZXN0SXRlbSA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CisgICAgICAgICAgICB2YXIgdGVzdCA9IHN1aXRlLnRl
c3RzW3Rlc3RJbmRleF07CisgICAgICAgICAgICB2YXIgYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgnYScpOworICAgICAgICAgICAgYW5jaG9yLmlkID0gc3VpdGUubmFtZSArICctJyAr
IHRlc3QubmFtZTsKKyAgICAgICAgICAgIHRlc3QuYW5jaG9yID0gYW5jaG9yOworICAgICAgICAg
ICAgYW5jaG9yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGZvcm1hdFRlc3RO
YW1lKHN1aXRlLm5hbWUsIHRlc3QubmFtZSkpKTsKKyAgICAgICAgICAgIHRlc3RJdGVtLmFwcGVu
ZENoaWxkKGFuY2hvcik7CisgICAgICAgICAgICB0ZXN0TGlzdC5hcHBlbmRDaGlsZCh0ZXN0SXRl
bSk7CisgICAgICAgIH0KKyAgICAgICAgbGkuYXBwZW5kQ2hpbGQodGVzdExpc3QpOworCisgICAg
ICAgIG9sLmFwcGVuZENoaWxkKGxpKTsKKyAgICB9CisKKyAgICBjb250cm9sLmFwcGVuZENoaWxk
KG9sKTsKKworICAgIHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24n
KTsKKyAgICBidXR0b24udGV4dENvbnRlbnQgPSAnU3RlcCc7CisgICAgYnV0dG9uLm9uY2xpY2sg
PSBvbnN0ZXA7CisgICAgY29udHJvbC5hcHBlbmRDaGlsZChidXR0b24pOworCisgICAgdmFyIGJ1
dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOworICAgIGJ1dHRvbi50ZXh0
Q29udGVudCA9ICdSdW4nOworICAgIGJ1dHRvbi5pZCA9ICdydW5TdWl0ZXMnOworICAgIGJ1dHRv
bi5vbmNsaWNrID0gb25ydW47CisgICAgY29udHJvbC5hcHBlbmRDaGlsZChidXR0b24pOworCisg
ICAgdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOworICAgIGJ1
dHRvbi50ZXh0Q29udGVudCA9ICdTZWxlY3QgYWxsJzsKKyAgICBidXR0b24ub25jbGljayA9IGZ1
bmN0aW9uICgpIHsKKyAgICAgICAgZm9yICh2YXIgc3VpdGVJbmRleCA9IDA7IHN1aXRlSW5kZXgg
PCBzdWl0ZXMubGVuZ3RoOyBzdWl0ZUluZGV4KyspIHsKKyAgICAgICAgICAgIHN1aXRlc1tzdWl0
ZUluZGV4XS5kaXNhYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgY2hlY2tib3hlc1tzdWl0ZUlu
ZGV4XS5jaGVja2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07CisgICAgY29udHJvbC5hcHBl
bmRDaGlsZChidXR0b24pOworCisgICAgdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoJ2J1dHRvbicpOworICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdVbnNlbGVjdCBhbGwnOwor
ICAgIGJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkgeworICAgICAgICBmb3IgKHZhciBzdWl0
ZUluZGV4ID0gMDsgc3VpdGVJbmRleCA8IHN1aXRlcy5sZW5ndGg7IHN1aXRlSW5kZXgrKykgewor
ICAgICAgICAgICAgc3VpdGVzW3N1aXRlSW5kZXhdLmRpc2FibGVkID0gdHJ1ZTsKKyAgICAgICAg
ICAgIGNoZWNrYm94ZXNbc3VpdGVJbmRleF0uY2hlY2tlZCA9IGZhbHNlOworICAgICAgICB9CisK
KyAgICB9OworICAgIGNvbnRyb2wuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKKworICAgIHJldHVybiBj
b250cm9sOworfQorCit2YXIgcGFyc2VRdWVyeVN0cmluZyA9IChmdW5jdGlvbiAocGFpckxpc3Qp
IHsKKyAgICB2YXIgcGFpcnMgPSB7fTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJMaXN0
Lmxlbmd0aDsgKytpKSB7CisgICAgICAgIHZhciBrZXlWYWx1ZSA9IHBhaXJMaXN0W2ldLnNwbGl0
KCc9JywgMik7CisgICAgICAgIGlmIChrZXlWYWx1ZS5sZW5ndGggPT0gMSkKKyAgICAgICAgICAg
IHBhaXJzW2tleVZhbHVlWzBdXSA9ICcnOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYWly
c1trZXlWYWx1ZVswXV0gPSBkZWNvZGVVUklDb21wb25lbnQoa2V5VmFsdWVbMV0ucmVwbGFjZSgv
XCsvZywgJyAnKSk7CisgICAgfQorICAgIHJldHVybiBwYWlyczsKK30pKHdpbmRvdy5sb2NhdGlv
bi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KCcmJykpOworCitmdW5jdGlvbiBkaXNhYmxlQWxsU3Vp
dGVzRXhjZXB0KHN1aXRlTmFtZSkgeworICAgIFN1aXRlcy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1l
bnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQubmFtZSAhPT0gc3VpdGVOYW1lKQorICAgICAgICAg
ICAgZWxlbWVudC5kaXNhYmxlZCA9IHRydWU7CisgICAgfSk7Cit9CisKK2Z1bmN0aW9uIHN0YXJ0
VGVzdCgpIHsKKyAgICB2YXIgcXVlcnlQYXJhbSA9IHBhcnNlUXVlcnlTdHJpbmdbJ3N1aXRlJ107
CisgICAgaWYgKHF1ZXJ5UGFyYW0gIT09IHVuZGVmaW5lZCkKKyAgICAgICAgZGlzYWJsZUFsbFN1
aXRlc0V4Y2VwdChxdWVyeVBhcmFtKTsKKworICAgIHZhciBydW5uZXIgPSBuZXcgQmVuY2htYXJr
UnVubmVyKFN1aXRlcywgeworICAgICAgICB3aWxsUnVuVGVzdDogZnVuY3Rpb24gKHN1aXRlLCB0
ZXN0KSB7CisgICAgICAgICAgICB0ZXN0LmFuY2hvci5jbGFzc0xpc3QuYWRkKCdydW5uaW5nJyk7
CisgICAgICAgIH0sCisgICAgICAgIGRpZFJ1blRlc3Q6IGZ1bmN0aW9uIChzdWl0ZSwgdGVzdCkg
eworICAgICAgICAgICAgdmFyIGNsYXNzTGlzdCA9IHRlc3QuYW5jaG9yLmNsYXNzTGlzdDsKKyAg
ICAgICAgICAgIGNsYXNzTGlzdC5yZW1vdmUoJ3J1bm5pbmcnKTsKKyAgICAgICAgICAgIGNsYXNz
TGlzdC5hZGQoJ3JhbicpOworICAgICAgICB9LAorICAgICAgICBkaWRSdW5TdWl0ZXM6IGZ1bmN0
aW9uIChtZWFzdXJlZFZhbHVlcykgeworICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSAnJzsKKyAg
ICAgICAgICAgIGZvciAodmFyIHN1aXRlTmFtZSBpbiBtZWFzdXJlZFZhbHVlcy50ZXN0cykgewor
ICAgICAgICAgICAgICAgIHZhciBzdWl0ZVJlc3VsdHMgPSBtZWFzdXJlZFZhbHVlcy50ZXN0c1tz
dWl0ZU5hbWVdOworICAgICAgICAgICAgICAgIGZvciAodmFyIHRlc3ROYW1lIGluIHN1aXRlUmVz
dWx0cy50ZXN0cykgeworICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdFJlc3VsdHMgPSBzdWl0
ZVJlc3VsdHMudGVzdHNbdGVzdE5hbWVdOworICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBz
dWJ0ZXN0TmFtZSBpbiB0ZXN0UmVzdWx0cy50ZXN0cykgeworICAgICAgICAgICAgICAgICAgICAg
ICAgcmVzdWx0cyArPSBzdWl0ZU5hbWUgKyAnIDogJyArIHRlc3ROYW1lICsgJyA6ICcgKyBzdWJ0
ZXN0TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJzogJyArIHRlc3RSZXN1bHRz
LnRlc3RzW3N1YnRlc3ROYW1lXSArICcgbXNcbic7CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0cyArPSBzdWl0ZU5hbWUgKyAn
IDogJyArIHN1aXRlUmVzdWx0cy50b3RhbCArICcgbXNcbic7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICByZXN1bHRzICs9ICdBcml0aG1ldGljIE1lYW4gOiAnICsgbWVhc3VyZWRWYWx1ZXMu
bWVhbiAgKyAnIG1zXG4nOworICAgICAgICAgICAgcmVzdWx0cyArPSAnR2VvbWV0cmljIE1lYW4g
OiAnICsgbWVhc3VyZWRWYWx1ZXMuZ2VvbWVhbiAgKyAnIG1zXG4nOworICAgICAgICAgICAgcmVz
dWx0cyArPSAnVG90YWwgOiAnICsgbWVhc3VyZWRWYWx1ZXMudG90YWwgKyAnIG1zXG4nOworICAg
ICAgICAgICAgcmVzdWx0cyArPSAnU2NvcmUgOiAnICsgbWVhc3VyZWRWYWx1ZXMuc2NvcmUgKyAn
IHJwbVxuJzsKKworICAgICAgICAgICAgaWYgKCFyZXN1bHRzKQorICAgICAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICAgICAgdmFyIHByZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3By
ZScpOworICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwcmUpOworICAgICAg
ICAgICAgcHJlLnRleHRDb250ZW50ID0gcmVzdWx0czsKKyAgICAgICAgfQorICAgIH0pOworCisg
ICAgdmFyIGN1cnJlbnRTdGF0ZSA9IG51bGw7CisKKyAgICAvLyBEb24ndCBjYWxsIHN0ZXAgd2hp
bGUgc3RlcCBpcyBhbHJlYWR5IGV4ZWN1dGluZy4KKyAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENo
aWxkKGNyZWF0ZVVJRm9yU3VpdGVzKFN1aXRlcywKKyAgICAgICAgZnVuY3Rpb24gKCkgeyBydW5u
ZXIuc3RlcChjdXJyZW50U3RhdGUpLnRoZW4oZnVuY3Rpb24gKHN0YXRlKSB7IGN1cnJlbnRTdGF0
ZSA9IHN0YXRlOyB9KTsgfSwKKyAgICAgICAgZnVuY3Rpb24gKCkgeyBydW5uZXIucnVuQWxsU3Rl
cHMoY3VycmVudFN0YXRlKTsgY3VycmVudFN0YXRlID0gbnVsbDsgfSkpOworCisgICAgaWYgKHBh
cnNlUXVlcnlTdHJpbmdbJ3N0YXJ0QXV0b21hdGljYWxseSddICE9PSB1bmRlZmluZWQpCisgICAg
ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdydW5TdWl0ZXMnKS5jbGljaygpOworfQorCit3
aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHN0YXJ0VGVzdCk7CisKKzwvc2NyaXB0Pgor
PC9ib2R5PgorPC9odG1sPgpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNoL2luZGV4
Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNoL2luZGV4Lmh0
bWwJKG5vbmV4aXN0ZW50KQorKysgUGVyZm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNoL2luZGV4Lmh0
bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4NSBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRt
bD4KKzxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0i
dGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KKyAgICA8dGl0bGU+U3R5bGVCZW5jaCAwLjE8L3Rp
dGxlPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vU3BlZWRvbWV0ZXIvcmVz
b3VyY2VzL21haW4uY3NzIj4KKyAgICA8c2NyaXB0IHNyYz0iLi4vU3BlZWRvbWV0ZXIvcmVzb3Vy
Y2VzL21haW4uanMiIGRlZmVyPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9TcGVlZG9t
ZXRlci9yZXNvdXJjZXMvYmVuY2htYXJrLXJ1bm5lci5qcyIgZGVmZXI+PC9zY3JpcHQ+CisgICAg
PHNjcmlwdCBzcmM9Ii4uL1NwZWVkb21ldGVyL3Jlc291cmNlcy9iZW5jaG1hcmstcmVwb3J0Lmpz
IiBkZWZlcj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL3N0YXRpc3Rp
Y3MuanMiIGRlZmVyPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvc3R5bGUt
YmVuY2guanMiIGRlZmVyPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvdGVz
dHMuanMiIGRlZmVyPjwvc2NyaXB0PgorICAgIDxzY3JpcHQ+CisgICAgICAgIGFkZEV2ZW50TGlz
dGVuZXIoJ2xvYWQnLCAoKSA9PiB7CisgICAgICAgICAgICBpZiAoIXdpbmRvdy5sb2NhdGlvbi5w
cm90b2NvbC5zdGFydHNXaXRoKCdodHRwJykpCisgICAgICAgICAgICAgICAgc2hvd1NlY3Rpb24o
J2xvY2FsLW1lc3NhZ2UnLCBmYWxzZSk7CisgICAgICAgIH0pOworICAgIDwvc2NyaXB0PgorPC9o
ZWFkPgorPGJvZHk+Cis8bWFpbj4KKyAgICA8YSBpZD0ibG9nby1saW5rIiBocmVmPSJqYXZhc2Ny
aXB0OnNob3dIb21lKCkiPjwvYT4KKworICAgIDxzZWN0aW9uIGlkPSJob21lIiBjbGFzcz0ic2Vs
ZWN0ZWQiPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFN0eWxlQmVuY2ggaXMgYSBicm93c2Vy
IGJlbmNobWFyayB0aGF0IG1lYXN1cmVzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgc3R5bGUgcmVz
b2x1dGlvbiBtZWNoYW5pc20uCisgICAgICAgIDwvcD4KKyAgICAgICAgPHAgaWQ9InNjcmVlbi1z
aXplLXdhcm5pbmciPjxzdHJvbmc+CisgICAgICAgICAgICBZb3VyIGJyb3dzZXIgd2luZG93IGlz
IHRvbyBzbWFsbC4gRm9yIG1vc3QgYWNjdXJhdGUgcmVzdWx0cywgcGxlYXNlIG1ha2UgdGhlIHZp
ZXcgcG9ydCBzaXplIGF0IGxlYXN0IDg1MHB4IGJ5IDY1MHB4Ljxicj4KKyAgICAgICAgICAgIEl0
J3MgY3VycmVudGx5IDxzcGFuIGlkPSJzY3JlZW4tc2l6ZSI+PC9zcGFuPi4KKyAgICAgICAgPC9z
dHJvbmc+CisgICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbnMiPgorICAgICAgICAgICAgPGJ1dHRv
biBvbmNsaWNrPSJzdGFydFRlc3QoKSI+U3RhcnQgVGVzdDwvYnV0dG9uPgorICAgICAgICA8L2Rp
dj4KKyAgICAgICAgPHAgY2xhc3M9InNob3ctYWJvdXQiPjxhIGhyZWY9ImphdmFzY3JpcHQ6c2hv
d0Fib3V0KCkiPkFib3V0IFN0eWxlQmVuY2g8L2E+PC9wPgorICAgIDwvc2VjdGlvbj4KKworICAg
IDxzZWN0aW9uIGlkPSJydW5uaW5nIj4KKyAgICAgICAgPGRpdiBpZD0idGVzdENvbnRhaW5lciI+
PC9kaXY+CisgICAgICAgIDxkaXYgaWQ9InByb2dyZXNzIj48ZGl2IGlkPSJwcm9ncmVzcy1jb21w
bGV0ZWQiPjwvZGl2PjwvZGl2PgorICAgICAgICA8ZGl2IGlkPSJpbmZvIj48L2Rpdj4KKyAgICA8
L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0ic3VtbWFyaXplZC1yZXN1bHRzIj4KKyAgICAg
ICAgPGgxPlJ1bnMgLyBNaW51dGU8L2gxPgorICAgICAgICA8ZGl2IGNsYXNzPSJnYXVnZSI+PGRp
diBjbGFzcz0id2luZG93Ij48ZGl2IGNsYXNzPSJuZWVkbGUiPjwvZGl2PjwvZGl2PjwvZGl2Pgor
ICAgICAgICA8aHI+CisgICAgICAgIDxkaXYgaWQ9InJlc3VsdC1udW1iZXIiPjwvZGl2PgorICAg
ICAgICA8ZGl2IGlkPSJjb25maWRlbmNlLW51bWJlciI+PC9kaXY+CisgICAgICAgIDxkaXYgY2xh
c3M9ImJ1dHRvbnMiPgorICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJzdGFydFRlc3QoKSI+
VGVzdCBBZ2FpbjwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic2hvdy1kZXRh
aWxzIiBvbmNsaWNrPSJzaG93UmVzdWx0RGV0YWlscygpIj5EZXRhaWxzPC9idXR0b24+CisgICAg
ICAgIDwvZGl2PgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSJkZXRhaWxlZC1y
ZXN1bHRzIj4KKyAgICAgICAgPGgxPkRldGFpbGVkIFJlc3VsdHM8L2gxPgorICAgICAgICA8dGFi
bGUgY2xhc3M9InJlc3VsdHMtdGFibGUiPjwvdGFibGU+CisgICAgICAgIDx0YWJsZSBjbGFzcz0i
cmVzdWx0cy10YWJsZSI+PC90YWJsZT4KKyAgICAgICAgPGRpdiBjbGFzcz0iYXJpdGhtZXRpYy1t
ZWFuIj48bGFiZWw+QXJpdGhtZXRpYyBNZWFuOjwvbGFiZWw+PHNwYW4gaWQ9InJlc3VsdHMtd2l0
aC1zdGF0aXN0aWNzIj48L3NwYW4+PC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbnMi
PgorICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJzdGFydFRlc3QoKSI+VGVzdCBBZ2Fpbjwv
YnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiBpZD0ic2hvdy1zdW1tYXJ5IiBvbmNsaWNrPSJz
aG93UmVzdWx0c1N1bW1hcnkoKSI+U3VtbWFyeTwvYnV0dG9uPgorICAgICAgICA8L2Rpdj4KKyAg
ICAgICAgPHAgY2xhc3M9InNob3ctYWJvdXQiPjxhIGhyZWY9ImphdmFzY3JpcHQ6c2hvd0Fib3V0
KCkiPkFib3V0IFN0eWxlQmVuY2g8L2E+PC9wPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0
aW9uIGlkPSJhYm91dCI+CisgICAgICAgIDxoMT5BYm91dCBTdHlsZUJlbmNoPC9oMT4KKworICAg
ICAgICA8cD5TdHlsZUJlbmNoIHRlc3RzIHBlcmZvcm1hbmNlIG9mIENTUyBzdHlsZSByZXNvbHV0
aW9uIGFuZCBzdHlsZSBpbnZhbGlkYXRpb24uIEVhY2ggdGVzdCBydW4gY3JlYXRlcyBhIGxhcmdl
IGRvY3VtZW50IGFuZCBhIGxhcmdlIHN0eWxlc2hlZXQgdXNpbmcgdmFyeWluZyBzZXR0aW5ncy4g
SXQgdGhlbiBhcHBsaWVzIGEgc2VyaWVzIG9mIG11dGF0aW9ucyB0byB0aGUgZG9jdW1lbnQgYW5k
IG1lYXN1cmVzIHRoZSB0aW1lIHRvIHVwZGF0ZSB0aGUgcmVuZGVyaW5nLiBUaGUgcmVzdWx0aW5n
IGxheW91dCBpcyBzaW1wbGUsIG1vc3Qgb2YgdGhlIHByZXNzdXJlIGlzIG9uIHNlbGVjdG9yIG1h
dGNoaW5nLjwvcD4KKworICAgICAgICA8cD5TdHlsZUJlbmNoIHVzZXMgU3BlZWRvbWV0ZXIgZnJh
bWV3b3JrIGZvciBVSSBhbmQgbWVhc3VyZW1lbnRzLjwvcD4KKyAgICA8L3NlY3Rpb24+CisgICAg
PHNlY3Rpb24gaWQ9ImxvY2FsLW1lc3NhZ2UiPgorICAgICAgICA8aDI+QWNjZXNzIHZpYSAnZmls
ZTonIHByb3RvY29sPC9oMT4KKyAgICAgICAgPHA+VG8gcnVuIGxvY2FsbHksIGxhdW5jaCBhIHdl
YiBzZXJ2ZXIgdW5kZXIgUGVyZm9ybWFuY2VUZXN0cyBkaXJlY3Rvcnkgd2l0aCAncHl0aG9uIC1t
IFNpbXBsZUhUVFBTZXJ2ZXIgODAwMScgYW5kIGFjY2VzcyB2aWEgPGEgaHJlZj0iaHR0cDovL2xv
Y2FsaG9zdDo4MDAxL1N0eWxlQmVuY2giPmh0dHA6Ly9sb2NhbGhvc3Q6ODAwMS9TdHlsZUJlbmNo
PC9hPi4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIEluZGl2aWR1YWwg
dGVzdHMgKHdpdGhvdXQgbWVhc3VyZW1lbnQpIGNhbiBhbHNvIGJlIHJ1biBsb2NhbGx5IGJ5IG9w
ZW5pbmcgPGEgaHJlZj0icmVzb3VyY2VzL3N0eWxlLWJlbmNoLmh0bWwiPlBlcmZvcm1hbmNlVGVz
dHMvU3R5bGVCZW5jaC9yZXNvdXJjZXMvc3R5bGUtYmVuY2guaHRtbDwvYT4KKyAgICAgICAgPC9w
PgorICAgIDwvc2VjdGlvbj4KKzwvbWFpbj4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IFBlcmZv
cm1hbmNlVGVzdHMvU3R5bGVCZW5jaC9yZXNvdXJjZXMvc3R5bGUtYmVuY2guaHRtbAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL1N0eWxlQmVuY2gvcmVzb3VyY2VzL3N0eWxlLWJlbmNo
Lmh0bWwJKG5vbmV4aXN0ZW50KQorKysgUGVyZm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNoL3Jlc291
cmNlcy9zdHlsZS1iZW5jaC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzIgQEAKKzwh
ZG9jdHlwZSBodG1sPgorPHNjcmlwdCBzcmM9InN0eWxlLWJlbmNoLmpzIj48L3NjcmlwdD4KKzxi
b2R5PgorPGRpdiBpZD0idGVzdHJvb3QiPjwvZGl2PgorPGRpdiBpZD0iY29udHJvbHMiPgorPHNl
bGVjdD48L3NlbGVjdD4KKzxidXR0b24gb25jbGljaz0iY3JlYXRlQmVuY2htYXJrRnJvbVNlbGVj
dCgpIj5Jbml0aWFsaXplPC9idXR0b24+Cis8YnV0dG9uIG9uY2xpY2s9ImNyZWF0ZUJlbmNobWFy
a0Zyb21TZWxlY3QoKS5ydW5Gb3JldmVyKCkiPkluaXRpYWxpemUgYW5kIHJ1bjwvYnV0dG9uPgor
PC9kaXY+Cis8c2NyaXB0PgorY29uc3QgY29uZmlndXJhdGlvbnMgPSBTdHlsZUJlbmNoLnByZWRl
ZmluZWRDb25maWd1cmF0aW9ucygpOworCitjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5xdWVyeVNl
bGVjdG9yKCIjY29udHJvbHMgc2VsZWN0Iik7Citmb3IgKGNvbnN0IGNvbmZpZ3VyYXRpb24gb2Yg
Y29uZmlndXJhdGlvbnMpIHsKKyAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJvcHRpb24iKTsKKyAgICBvcHRpb24uaW5uZXJIVE1MID0gY29uZmlndXJhdGlvbi5uYW1l
OworICAgIHNlbGVjdC5hcHBlbmRDaGlsZChvcHRpb24pOworfQorCitmdW5jdGlvbiBjcmVhdGVC
ZW5jaG1hcmsoY29uZmlndXJhdGlvbikKK3sKKyAgICBjb250cm9scy5yZW1vdmUoKTsKKworICAg
IHJldHVybiBuZXcgU3R5bGVCZW5jaChjb25maWd1cmF0aW9uKTsKK30KKworZnVuY3Rpb24gY3Jl
YXRlQmVuY2htYXJrRnJvbVNlbGVjdCgpCit7CisgICAgcmV0dXJuIGNyZWF0ZUJlbmNobWFyayhj
b25maWd1cmF0aW9uc1tzZWxlY3Quc2VsZWN0ZWRJbmRleF0pOworfQorPC9zY3JpcHQ+CisKSW5k
ZXg6IFBlcmZvcm1hbmNlVGVzdHMvU3R5bGVCZW5jaC9yZXNvdXJjZXMvc3R5bGUtYmVuY2guanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNoL3Jlc291cmNlcy9zdHls
ZS1iZW5jaC5qcwkobm9uZXhpc3RlbnQpCisrKyBQZXJmb3JtYW5jZVRlc3RzL1N0eWxlQmVuY2gv
cmVzb3VyY2VzL3N0eWxlLWJlbmNoLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzg1IEBA
CitjbGFzcyBSYW5kb20KK3sKKyAgICBjb25zdHJ1Y3RvcihzZWVkKQorICAgIHsKKyAgICAgICAg
dGhpcy5zZWVkID0gc2VlZCAlIDIxNDc0ODM2NDc7CisgICAgICAgIGlmICh0aGlzLnNlZWQgPD0g
MCkKKyAgICAgICAgICAgIHRoaXMuc2VlZCArPSAyMTQ3NDgzNjQ2OworICAgIH0KKworICAgIGdl
dCBuZXh0KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnNlZWQgPSB0aGlzLnNlZWQgKiAx
NjgwNyAlIDIxNDc0ODM2NDc7CisgICAgfQorCisgICAgY2hhbmNlKGNoYW5jZSkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLm5leHQgJSAxMDQ4NTc2IDwgY2hhbmNlICogMTA0ODU3NjsKKyAg
ICB9CisKKyAgICBudW1iZXIodW5kZXIpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5uZXh0
ICUgdW5kZXI7CisgICAgfQorfQorCitmdW5jdGlvbiBuZXh0QW5pbWF0aW9uRnJhbWUoKQorewor
ICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShy
ZXNvbHZlKSk7Cit9CisKK2NsYXNzIFN0eWxlQmVuY2gKK3sKKyAgICBzdGF0aWMgZGVmYXVsdENv
bmZpZ3VyYXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIG5hbWU6
ICdEZWZhdWx0JywKKyAgICAgICAgICAgIGVsZW1lbnRUeXBlQ291bnQ6IDEwLAorICAgICAgICAg
ICAgZWxlbWVudENoYW5jZTogMC41LAorICAgICAgICAgICAgY2xhc3NDb3VudDogMjAwLAorICAg
ICAgICAgICAgY2xhc3NDaGFuY2U6IDAuMywKKyAgICAgICAgICAgIGNvbWJpbmF0b3JzOiBbJyAn
LCAnPicsXSwKKyAgICAgICAgICAgIHBzZXVkb0NsYXNzZXM6IFtdLAorICAgICAgICAgICAgcHNl
dWRvQ2xhc3NDaGFuY2U6IDAsCisgICAgICAgICAgICBiZWZvcmVBZnRlckNoYW5jZTogMCwKKyAg
ICAgICAgICAgIG1heGltdW1TZWxlY3Rvckxlbmd0aDogNiwKKyAgICAgICAgICAgIHJ1bGVDb3Vu
dDogNTAwMCwKKyAgICAgICAgICAgIGVsZW1lbnRDb3VudDogMjAwMDAsCisgICAgICAgICAgICBt
YXhpbXVtVHJlZURlcHRoOiA2LAorICAgICAgICAgICAgbWF4aW11bVRyZWVXaWR0aDogNTAsCisg
ICAgICAgICAgICByZXBlYXRpbmdTZXF1ZW5jZUNoYW5jZTogMC4yLAorICAgICAgICAgICAgcmVw
ZWF0aW5nU2VxdWVuY2VNYXhpbXVtTGVuZ3RoOiAzLAorICAgICAgICAgICAgbGVhZkNsYXNzTXV0
YXRpb25DaGFuY2U6IDAuMSwKKyAgICAgICAgICAgIHN0eWxlU2VlZDogMSwKKyAgICAgICAgICAg
IGRvbVNlZWQ6IDIsCisgICAgICAgIH07CisgICAgfQorCisgICAgc3RhdGljIGRlc2NlbmRhbnRD
b21iaW5hdG9yQ29uZmlndXJhdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gT2JqZWN0LmFz
c2lnbih0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKCksIHsKKyAgICAgICAgICAgIG5hbWU6ICdE
ZXNjZW5kYW50IGFuZCBjaGlsZCBjb21iaW5hdG9ycycsCisgICAgICAgIH0pOworICAgIH0KKwor
ICAgIHN0YXRpYyBzaWJsaW5nQ29tYmluYXRvckNvbmZpZ3VyYXRpb24oKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbigpLCB7Cisg
ICAgICAgICAgICBuYW1lOiAnU2libGluZyBjb21iaW5hdG9ycycsCisgICAgICAgICAgICBjb21i
aW5hdG9yczogWycgJywgJyAnLCAnPicsICc+JywgJ34nLCAnKycsXSwKKyAgICAgICAgfSk7Cisg
ICAgfQorCisgICAgc3RhdGljIHBzZXVkb0NsYXNzQ29uZmlndXJhdGlvbigpCisgICAgeworICAg
ICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKCksIHsK
KyAgICAgICAgICAgIG5hbWU6ICdQb3NpdGlvbmFsIHBzZXVkbyBjbGFzc2VzJywKKyAgICAgICAg
ICAgIHBzZXVkb0NsYXNzQ2hhbmNlOiAwLjEsCisgICAgICAgICAgICBwc2V1ZG9DbGFzc2VzOiBb
CisgICAgICAgICAgICAgICAgJ250aC1jaGlsZCgybisxKScsCisgICAgICAgICAgICAgICAgJ250
aC1sYXN0LWNoaWxkKDNuKScsCisgICAgICAgICAgICAgICAgJ250aC1vZi10eXBlKDNuKScsCisg
ICAgICAgICAgICAgICAgJ250aC1sYXN0LW9mLXR5cGUoNG4pJywKKyAgICAgICAgICAgICAgICAn
Zmlyc3QtY2hpbGQnLAorICAgICAgICAgICAgICAgICdsYXN0LWNoaWxkJywKKyAgICAgICAgICAg
ICAgICAnZmlyc3Qtb2YtdHlwZScsCisgICAgICAgICAgICAgICAgJ2xhc3Qtb2YtdHlwZScsCisg
ICAgICAgICAgICAgICAgJ29ubHktb2YtdHlwZScsCisgICAgICAgICAgICBdLAorICAgICAgICB9
KTsKKyAgICB9CisKKyAgICBzdGF0aWMgYmVmb3JlQW5kQWZ0ZXJDb25maWd1cmF0aW9uKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRp
b24oKSwgeworICAgICAgICAgICAgbmFtZTogJ0JlZm9yZSBhbmQgYWZ0ZXIgcHNldWRvIGVsZW1l
bnRzJywKKyAgICAgICAgICAgIGJlZm9yZUFmdGVyQ2hhbmNlOiAwLjEsCisgICAgICAgIH0pOwor
ICAgIH0KKworICAgIHN0YXRpYyBwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgIHRoaXMuZGVzY2VuZGFudENvbWJpbmF0b3JDb25m
aWd1cmF0aW9uKCksCisgICAgICAgICAgICB0aGlzLnNpYmxpbmdDb21iaW5hdG9yQ29uZmlndXJh
dGlvbigpLAorICAgICAgICAgICAgdGhpcy5wc2V1ZG9DbGFzc0NvbmZpZ3VyYXRpb24oKSwKKyAg
ICAgICAgICAgIHRoaXMuYmVmb3JlQW5kQWZ0ZXJDb25maWd1cmF0aW9uKCksCisgICAgICAgIF07
CisgICAgfQorCisgICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbikKKyAgICB7CisgICAgICAg
IHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisKKyAgICAgICAgdGhpcy5iYXNl
U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOworICAgICAgICB0aGlzLmJh
c2VTdHlsZS50ZXh0Q29udGVudCA9IGAKKyAgICAgICAgICAgICN0ZXN0cm9vdCB7CisgICAgICAg
ICAgICAgICAgZm9udC1zaXplOiAxMHB4OworICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAx
MHB4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgI3Rlc3Ryb290ICogeworICAgICAgICAg
ICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICN0ZXN0cm9vdCA6ZW1wdHkgeworICAgICAgICAgICAgICAgIHdpZHRoOjEwcHg7CisgICAgICAg
ICAgICAgICAgaGVpZ2h0OjEwcHg7CisgICAgICAgICAgICB9CisgICAgICAgIGA7CisgICAgICAg
IGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5iYXNlU3R5bGUpOworCisgICAgICAgIHRo
aXMucmFuZG9tID0gbmV3IFJhbmRvbSh0aGlzLmNvbmZpZ3VyYXRpb24uc3R5bGVTZWVkKTsKKyAg
ICAgICAgdGhpcy5tYWtlU3R5bGUoKTsKKworICAgICAgICB0aGlzLnJhbmRvbSA9IG5ldyBSYW5k
b20odGhpcy5jb25maWd1cmF0aW9uLmRvbVNlZWQpOworICAgICAgICB0aGlzLm1ha2VUcmVlKCk7
CisgICAgfQorCisgICAgcmFuZG9tRWxlbWVudE5hbWUoKQorICAgIHsKKyAgICAgICAgY29uc3Qg
ZWxlbWVudFR5cGVDb3VudCA9IHRoaXMuY29uZmlndXJhdGlvbi5lbGVtZW50VHlwZUNvdW50Owor
ICAgICAgICByZXR1cm4gYGVsZW0keyB0aGlzLnJhbmRvbS5udW1iZXIoZWxlbWVudFR5cGVDb3Vu
dCkgfWA7CisgICAgfQorCisgICAgcmFuZG9tQ2xhc3NOYW1lKCkKKyAgICB7CisgICAgICAgIGNv
bnN0IGNsYXNzQ291bnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY2xhc3NDb3VudDsKKyAgICAgICAg
cmV0dXJuIGBjbGFzcyR7IHRoaXMucmFuZG9tLm51bWJlcihjbGFzc0NvdW50KSB9YDsKKyAgICB9
CisKKyAgICByYW5kb21DbGFzc05hbWVGcm9tUmFuZ2UocmFuZ2UpCisgICAgeworICAgICAgICBj
b25zdCBtYXhpbXVtID0gTWF0aC5yb3VuZChyYW5nZSAqIHRoaXMuY29uZmlndXJhdGlvbi5jbGFz
c0NvdW50KTsKKyAgICAgICAgcmV0dXJuIGBjbGFzcyR7IHRoaXMucmFuZG9tLm51bWJlcihtYXhp
bXVtKSB9YDsKKyAgICB9CisKKyAgICByYW5kb21Db21iaW5hdG9yKCkKKyAgICB7CisgICAgICAg
IGNvbnN0IGNvbWJpbmF0b3JzID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbWJpbmF0b3JzOworICAg
ICAgICByZXR1cm4gY29tYmluYXRvcnNbdGhpcy5yYW5kb20ubnVtYmVyKGNvbWJpbmF0b3JzLmxl
bmd0aCldCisgICAgfQorCisgICAgcmFuZG9tUHNldWRvQ2xhc3MoKQorICAgIHsKKyAgICAgICAg
Y29uc3QgcHNldWRvQ2xhc3NlcyA9IHRoaXMuY29uZmlndXJhdGlvbi5wc2V1ZG9DbGFzc2VzOwor
ICAgICAgICByZXR1cm4gcHNldWRvQ2xhc3Nlc1t0aGlzLnJhbmRvbS5udW1iZXIocHNldWRvQ2xh
c3Nlcy5sZW5ndGgpXQorICAgIH0KKworICAgIG1ha2VTaW1wbGVTZWxlY3RvcihpbmRleCwgbGVu
Z3RoKQorICAgIHsKKyAgICAgICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT0gbGVuZ3RoIC0gMTsK
KyAgICAgICAgY29uc3QgdXNlUHNldWRvQ2xhc3MgPSB0aGlzLnJhbmRvbS5jaGFuY2UodGhpcy5j
b25maWd1cmF0aW9uLnBzZXVkb0NsYXNzQ2hhbmNlKSAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ucHNl
dWRvQ2xhc3Nlcy5sZW5ndGg7CisgICAgICAgIGNvbnN0IHVzZUVsZW1lbnQgPSB1c2VQc2V1ZG9D
bGFzcyB8fCB0aGlzLnJhbmRvbS5jaGFuY2UodGhpcy5jb25maWd1cmF0aW9uLmVsZW1lbnRDaGFu
Y2UpOyAvLyA6bnRoLW9mLXR5cGUgZXRjIG9ubHkgbWFrZSBzZW5zZSB3aXRoIGVsZW1lbnQKKyAg
ICAgICAgY29uc3QgdXNlQ2xhc3MgPSAhdXNlRWxlbWVudCB8fCB0aGlzLnJhbmRvbS5jaGFuY2Uo
dGhpcy5jb25maWd1cmF0aW9uLmNsYXNzQ2hhbmNlKTsKKyAgICAgICAgY29uc3QgdXNlQmVmb3Jl
T3JBZnRlciA9IGlzTGFzdCAmJiB0aGlzLnJhbmRvbS5jaGFuY2UodGhpcy5jb25maWd1cmF0aW9u
LmJlZm9yZUFmdGVyQ2hhbmNlKTsKKyAgICAgICAgbGV0IHJlc3VsdCA9ICIiOworICAgICAgICBp
ZiAodXNlRWxlbWVudCkKKyAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnJhbmRvbUVsZW1lbnRO
YW1lKCk7CisgICAgICAgIGlmICh1c2VDbGFzcykgeworICAgICAgICAgICAgLy8gVXNlIGEgc21h
bGxlciBwb29sIG9mIGNsYXNzIG5hbWVzIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNlbGVjdG9y
cyB0byBjcmVhdGUgY29udGFpbmVycy4KKyAgICAgICAgICAgIHJlc3VsdCArPSAiLiIgKyB0aGlz
LnJhbmRvbUNsYXNzTmFtZUZyb21SYW5nZSgoaW5kZXggKyAxKSAvIGxlbmd0aCk7CisgICAgICAg
IH0KKyAgICAgICAgaWYgKHVzZVBzZXVkb0NsYXNzKQorICAgICAgICAgICAgcmVzdWx0ICs9ICAi
OiIgKyB0aGlzLnJhbmRvbVBzZXVkb0NsYXNzKCk7CisgICAgICAgIGlmICh1c2VCZWZvcmVPckFm
dGVyKSB7CisgICAgICAgICAgICBpZiAodGhpcy5yYW5kb20uY2hhbmNlKDAuNSkpCisgICAgICAg
ICAgICAgICAgcmVzdWx0ICs9ICAiOjpiZWZvcmUiOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIHJlc3VsdCArPSAgIjo6YWZ0ZXIiOworICAgICAgICB9CisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfQorCisgICAgbWFrZVNlbGVjdG9yKCkKKyAgICB7CisgICAgICAgIGNv
bnN0IGxlbmd0aCA9IHRoaXMucmFuZG9tLm51bWJlcih0aGlzLmNvbmZpZ3VyYXRpb24ubWF4aW11
bVNlbGVjdG9yTGVuZ3RoKSArIDE7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm1ha2VTaW1w
bGVTZWxlY3RvcigwLCBsZW5ndGgpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0
aDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBjb21iaW5hdG9yID0gdGhpcy5yYW5kb21Db21i
aW5hdG9yKCk7CisgICAgICAgICAgICBpZiAoY29tYmluYXRvciAhPSAnICcpCisgICAgICAgICAg
ICAgICAgcmVzdWx0ICs9ICIgIiArIGNvbWJpbmF0b3I7CisgICAgICAgICAgICByZXN1bHQgKz0g
IiAiICsgdGhpcy5tYWtlU2ltcGxlU2VsZWN0b3IoaSwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGdldCByYW5kb21Db2xvckNvbXBvbmVu
dCgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5yYW5kb20ubmV4dCAlIDI1NjsKKyAgICB9
CisKKyAgICBtYWtlRGVjbGFyYXRpb24oc2VsZWN0b3IpCisgICAgeworICAgICAgICBsZXQgZGVj
bGFyYXRpb24gPSBgYmFja2dyb3VuZC1jb2xvcjogcmdiKCR7dGhpcy5yYW5kb21Db2xvckNvbXBv
bmVudH0sICR7dGhpcy5yYW5kb21Db2xvckNvbXBvbmVudH0sICR7dGhpcy5yYW5kb21Db2xvckNv
bXBvbmVudH0pO2A7CisKKyAgICAgICAgaWYgKHNlbGVjdG9yLmVuZHNXaXRoKCc6OmJlZm9yZScp
IHx8IHNlbGVjdG9yLmVuZHNXaXRoKCc6OmFmdGVyJykpCisgICAgICAgICAgICBkZWNsYXJhdGlv
biArPSAiIGNvbnRlbnQ6ICdceGEwJzsiOworCisgICAgICAgIHJldHVybiBkZWNsYXJhdGlvbjsK
KyAgICB9CisKKyAgICBtYWtlUnVsZSgpCisgICAgeworICAgICAgICBjb25zdCBzZWxlY3RvciA9
IHRoaXMubWFrZVNlbGVjdG9yKCk7CisgICAgICAgIHJldHVybiBzZWxlY3RvciArICIgeyAiICsg
dGhpcy5tYWtlRGVjbGFyYXRpb24oc2VsZWN0b3IpICsgIiB9IjsKKyAgICB9CisKKyAgICBtYWtl
U3R5bGVzaGVldChzaXplKQorICAgIHsKKyAgICAgICAgbGV0IGNzc1RleHQgPSAiIjsKKyAgICAg
ICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgICAgICAgICBjc3NUZXh0ICs9
IHRoaXMubWFrZVJ1bGUoKSArICJcbiI7CisgICAgICAgIHJldHVybiBjc3NUZXh0OworICAgIH0K
KworICAgIG1ha2VTdHlsZSgpCisgICAgeworICAgICAgICB0aGlzLnRlc3RTdHlsZSA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CisgICAgICAgIHRoaXMudGVzdFN0eWxlLnRleHRD
b250ZW50ID0gdGhpcy5tYWtlU3R5bGVzaGVldCh0aGlzLmNvbmZpZ3VyYXRpb24ucnVsZUNvdW50
KTsKKworICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMudGVzdFN0eWxlKTsK
KyAgICB9CisKKyAgICBtYWtlRWxlbWVudCgpCisgICAgeworICAgICAgICBjb25zdCBlbGVtZW50
ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLnJhbmRvbUVsZW1lbnROYW1lKCkpOworICAg
ICAgICBjb25zdCBoYXNDbGFzc2VzID0gdGhpcy5yYW5kb20uY2hhbmNlKDAuNSk7CisgICAgICAg
IGlmIChoYXNDbGFzc2VzKSB7CisgICAgICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMucmFuZG9t
Lm51bWJlcigzKSArIDE7CisgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyAr
K2kpCisgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMucmFuZG9tQ2xh
c3NOYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0KKwor
ICAgIG1ha2VUcmVlV2l0aERlcHRoKHBhcmVudCwgcmVtYWluaW5nQ291bnQsIGRlcHRoKQorICAg
IHsKKyAgICAgICAgY29uc3QgbWF4aW11bURlcHRoID0gdGhpcy5jb25maWd1cmF0aW9uLm1heGlt
dW1UcmVlRGVwdGg7CisgICAgICAgIGNvbnN0IG1heGltdW1XaWR0aCA9ICB0aGlzLmNvbmZpZ3Vy
YXRpb24ubWF4aW11bVRyZWVXaWR0aDsKKyAgICAgICAgY29uc3Qgbm9uRW1wdHlDaGFuY2UgPSAo
bWF4aW11bURlcHRoIC0gZGVwdGgpIC8gbWF4aW11bURlcHRoOworCisgICAgICAgIGNvbnN0IHNo
b3VsZFJlcGVhdCA9IHRoaXMucmFuZG9tLmNoYW5jZSh0aGlzLmNvbmZpZ3VyYXRpb24ucmVwZWF0
aW5nU2VxdWVuY2VDaGFuY2UpOworICAgICAgICBjb25zdCByZXBlYXRpbmdTZXF1ZW5jZUxlbmd0
aCA9IHNob3VsZFJlcGVhdCA/IHRoaXMucmFuZG9tLm51bWJlcih0aGlzLmNvbmZpZ3VyYXRpb24u
cmVwZWF0aW5nU2VxdWVuY2VNYXhpbXVtTGVuZ3RoKSArIDEgOiAwOworCisgICAgICAgIGxldCBj
aGlsZENvdW50ID0gMDsKKyAgICAgICAgaWYgKGRlcHRoID09IDApCisgICAgICAgICAgICBjaGls
ZENvdW50ID0gcmVtYWluaW5nQ291bnQ7CisgICAgICAgIGVsc2UgaWYgKHRoaXMucmFuZG9tLmNo
YW5jZShub25FbXB0eUNoYW5jZSkpCisgICAgICAgICAgICBjaGlsZENvdW50ID0gdGhpcy5yYW5k
b20ubnVtYmVyKG1heGltdW1XaWR0aCAqIGRlcHRoIC8gbWF4aW11bURlcHRoKTsKKworICAgICAg
ICBsZXQgcmVwZWF0aW5nU2VxdWVuY2UgPSBbXTsKKyAgICAgICAgbGV0IHJlcGVhdGluZ1NlcXVl
bmNlU2l6ZSA9IDA7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgKytp
KSB7CisgICAgICAgICAgICBpZiAoc2hvdWxkUmVwZWF0ICYmIHJlcGVhdGluZ1NlcXVlbmNlLmxl
bmd0aCA9PSByZXBlYXRpbmdTZXF1ZW5jZUxlbmd0aCAmJiByZXBlYXRpbmdTZXF1ZW5jZVNpemUg
PCByZW1haW5pbmdDb3VudCkgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3VidHJlZSBv
ZiByZXBlYXRpbmdTZXF1ZW5jZSkKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENo
aWxkKHN1YnRyZWUuY2xvbmVOb2RlKHRydWUpKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdD
b3VudCAtPSByZXBlYXRpbmdTZXF1ZW5jZVNpemU7CisgICAgICAgICAgICAgICAgaWYgKCFyZW1h
aW5pbmdDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0g
dGhpcy5tYWtlRWxlbWVudCgpOworICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1l
bnQpOworCisgICAgICAgICAgICBpZiAoIS0tcmVtYWluaW5nQ291bnQpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZW1haW5pbmdDb3VudCA9IHRoaXMubWFrZVRyZWVX
aXRoRGVwdGgoZWxlbWVudCwgcmVtYWluaW5nQ291bnQsIGRlcHRoICsgMSk7CisgICAgICAgICAg
ICBpZiAoIXJlbWFpbmluZ0NvdW50KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAg
ICAgICAgICBpZiAoc2hvdWxkUmVwZWF0ICYmIHJlcGVhdGluZ1NlcXVlbmNlLmxlbmd0aCA8IHJl
cGVhdGluZ1NlcXVlbmNlTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmVwZWF0aW5nU2VxdWVu
Y2UucHVzaChlbGVtZW50KTsKKyAgICAgICAgICAgICAgICByZXBlYXRpbmdTZXF1ZW5jZVNpemUg
Kz0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCIqIikubGVuZ3RoICsgMTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVtYWluaW5nQ291bnQ7CisgICAgfQorCisg
ICAgbWFrZVRyZWUoKQorICAgIHsKKyAgICAgICAgdGhpcy50ZXN0Um9vdCA9IGRvY3VtZW50LnF1
ZXJ5U2VsZWN0b3IoIiN0ZXN0cm9vdCIpOworICAgICAgICBjb25zdCBlbGVtZW50Q291bnQgPSB0
aGlzLmNvbmZpZ3VyYXRpb24uZWxlbWVudENvdW50OworCisgICAgICAgIHRoaXMubWFrZVRyZWVX
aXRoRGVwdGgodGhpcy50ZXN0Um9vdCwgZWxlbWVudENvdW50LCAwKTsKKworICAgICAgICB0aGlz
LnVwZGF0ZUNhY2hlZFRlc3RFbGVtZW50cygpOworICAgIH0KKworICAgIHVwZGF0ZUNhY2hlZFRl
c3RFbGVtZW50cygpCisgICAgeworICAgICAgICB0aGlzLnRlc3RFbGVtZW50cyA9IHRoaXMudGVz
dFJvb3QucXVlcnlTZWxlY3RvckFsbCgiKiIpOworICAgIH0KKworICAgIHJhbmRvbVRyZWVFbGVt
ZW50KCkKKyAgICB7CisgICAgICAgIGNvbnN0IHJhbmRvbUluZGV4ID0gdGhpcy5yYW5kb20ubnVt
YmVyKHRoaXMudGVzdEVsZW1lbnRzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiB0aGlzLnRlc3RF
bGVtZW50c1tyYW5kb21JbmRleF0KKyAgICB9CisKKyAgICBhZGRDbGFzc2VzKGNvdW50KQorICAg
IHsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDspIHsKKyAgICAgICAgICAgIGNv
bnN0IGVsZW1lbnQgPSB0aGlzLnJhbmRvbVRyZWVFbGVtZW50KCk7CisgICAgICAgICAgICAvLyBU
aGVyZSBhcmUgbW9yZSBsZWF2ZXMgdGhhbiBicmFuY2hlcy4gQXZvaWQgc2tld2luZyB0b3dhcmRz
IGxlYWYgbXV0YXRpb25zLgorICAgICAgICAgICAgaWYgKCFlbGVtZW50LmZpcnN0Q2hpbGQgJiYg
IXRoaXMucmFuZG9tLmNoYW5jZSh0aGlzLmNvbmZpZ3VyYXRpb24ubGVhZkNsYXNzTXV0YXRpb25D
aGFuY2UpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgKytpOworICAg
ICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7CisgICAgICAgICAg
ICBjbGFzc0xpc3QuYWRkKHRoaXMucmFuZG9tQ2xhc3NOYW1lKCkpOworICAgICAgICB9CisgICAg
fQorCisgICAgcmVtb3ZlQ2xhc3Nlcyhjb3VudCkKKyAgICB7CisgICAgICAgIGZvciAobGV0IGkg
PSAwOyBpIDwgY291bnQ7KSB7CisgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5yYW5k
b21UcmVlRWxlbWVudCgpOworICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5j
bGFzc0xpc3Q7CisgICAgICAgICAgICBpZiAoIWVsZW1lbnQuZmlyc3RDaGlsZCAmJiAhdGhpcy5y
YW5kb20uY2hhbmNlKHRoaXMuY29uZmlndXJhdGlvbi5sZWFmQ2xhc3NNdXRhdGlvbkNoYW5jZSkp
CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIWNsYXNzTGlzdC5s
ZW5ndGgpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICArK2k7CisgICAg
ICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKGNsYXNzTGlzdFswXSk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBhZGRMZWFmRWxlbWVudHMoY291bnQpCisgICAgeworICAgICAgICBmb3IgKGxldCBp
ID0gMDsgaSA8IGNvdW50OykgeworICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5yYW5k
b21UcmVlRWxlbWVudCgpOworICAgICAgICAgICAgLy8gQXZvaWQgYWx0ZXJpbmcgdHJlZSBzaGFw
ZSBieSB0dXJuaW5nIG1hbnkgbGVhdmVzIGludG8gY29udGFpbmVycy4KKyAgICAgICAgICAgIGlm
ICghcGFyZW50LmZpcnN0Q2hpbGQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICArK2k7CisgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZE5vZGVz
OworICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJhbmRvbS5udW1iZXIoY2hpbGRyZW4u
bGVuZ3RoICsgMSk7CisgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMubWFrZUVs
ZW1lbnQoKSwgY2hpbGRyZW5baW5kZXhdKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnVwZGF0
ZUNhY2hlZFRlc3RFbGVtZW50cygpOworICAgIH0KKworICAgIHJlbW92ZUxlYWZFbGVtZW50cyhj
b3VudCkKKyAgICB7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7KSB7CisgICAg
ICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5yYW5kb21UcmVlRWxlbWVudCgpOworCisgICAg
ICAgICAgICBjb25zdCBjYW5SZW1vdmUgPSAhZWxlbWVudC5maXJzdENoaWxkICYmIGVsZW1lbnQu
cGFyZW50Tm9kZTsKKyAgICAgICAgICAgIGlmICghY2FuUmVtb3ZlKQorICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgKytpOworICAgICAgICAgICAgZWxlbWVudC5wYXJlbnRO
b2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpOworICAgICAgICB9CisgICAgICAgIHRoaXMudXBkYXRl
Q2FjaGVkVGVzdEVsZW1lbnRzKCk7CisgICAgfQorCisgICAgYXN5bmMgcnVuRm9yZXZlcigpCisg
ICAgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdGhpcy5hZGRDbGFzc2Vz
KDEwKTsKKyAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2xhc3NlcygxMCk7CisgICAgICAgICAgICB0
aGlzLmFkZExlYWZFbGVtZW50cygxMCk7CisgICAgICAgICAgICB0aGlzLnJlbW92ZUxlYWZFbGVt
ZW50cygxMCk7CisKKyAgICAgICAgICAgIGF3YWl0IG5leHRBbmltYXRpb25GcmFtZSgpOworICAg
ICAgICB9CisgICAgfQorfQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9TdHlsZUJlbmNoL3Jlc291
cmNlcy90ZXN0cy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL1N0eWxlQmVuY2gv
cmVzb3VyY2VzL3Rlc3RzLmpzCShub25leGlzdGVudCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvU3R5
bGVCZW5jaC9yZXNvdXJjZXMvdGVzdHMuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNyBA
QAorZnVuY3Rpb24gbWFrZVN0ZXBzKGNvdW50KQoreworICAgIGxldCBzdGVwcyA9IFtdOworICAg
IGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBzdGVwcy5wdXNoKG5l
dyBCZW5jaG1hcmtUZXN0U3RlcCgnQWRkaW5nIGNsYXNzZXMnLCAoYmVuY2gsIGNvbnRlbnRXaW5k
b3csIGNvbnRlbnREb2N1bWVudCkgPT4geworICAgICAgICAgICAgYmVuY2guYWRkQ2xhc3Nlcygx
MDApOworICAgICAgICB9KSk7CisgICAgICAgIHN0ZXBzLnB1c2gobmV3IEJlbmNobWFya1Rlc3RT
dGVwKCdSZW1vdmluZyBjbGFzc2VzJywgKGJlbmNoLCBjb250ZW50V2luZG93LCBjb250ZW50RG9j
dW1lbnQpID0+IHsKKyAgICAgICAgICAgIGJlbmNoLnJlbW92ZUNsYXNzZXMoMTAwKTsKKyAgICAg
ICAgfSkpOworICAgICAgICBzdGVwcy5wdXNoKG5ldyBCZW5jaG1hcmtUZXN0U3RlcCgnQWRkaW5n
IGxlYWYgZWxlbWVudHMnLCAoYmVuY2gsIGNvbnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkg
PT4geworICAgICAgICAgICAgYmVuY2guYWRkTGVhZkVsZW1lbnRzKDEwMCk7CisgICAgICAgIH0p
KTsKKyAgICAgICAgc3RlcHMucHVzaChuZXcgQmVuY2htYXJrVGVzdFN0ZXAoJ1JlbW92aW5nIGxl
YWYgZWxlbWVudHMnLCAoYmVuY2gsIGNvbnRlbnRXaW5kb3csIGNvbnRlbnREb2N1bWVudCkgPT4g
eworICAgICAgICAgICAgYmVuY2gucmVtb3ZlTGVhZkVsZW1lbnRzKDEwMCk7CisgICAgICAgIH0p
KTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZXBzOworfQorCitmdW5jdGlvbiBtYWtlU3VpdGUoY29u
ZmlndXJhdGlvbikKK3sKKyAgICByZXR1cm4geworICAgICAgICBuYW1lOiBjb25maWd1cmF0aW9u
Lm5hbWUsCisgICAgICAgIHVybDogJ3N0eWxlLWJlbmNoLmh0bWwnLAorICAgICAgICBwcmVwYXJl
OiAocnVubmVyLCBjb250ZW50V2luZG93LCBjb250ZW50RG9jdW1lbnQpID0+IHsKKyAgICAgICAg
ICAgIHJldHVybiBydW5uZXIud2FpdEZvckVsZW1lbnQoJyN0ZXN0cm9vdCcpLnRoZW4oKGVsZW1l
bnQpID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudFdpbmRvdy5jcmVhdGVCZW5j
aG1hcmsoY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSwKKyAgICAg
ICAgdGVzdHM6IG1ha2VTdGVwcyg1KSwKKyAgICB9OworfQorCit2YXIgU3VpdGVzID0gW107Citm
b3IgKGNvbnN0IGNvbmZpZ3VyYXRpb24gb2YgU3R5bGVCZW5jaC5wcmVkZWZpbmVkQ29uZmlndXJh
dGlvbnMoKSkKKyAgICBTdWl0ZXMucHVzaChtYWtlU3VpdGUoY29uZmlndXJhdGlvbikpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>