<?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>76312</bug_id>
          
          <creation_ts>2012-01-13 14:33:37 -0800</creation_ts>
          <short_desc>Port Mozilla&apos;s Graph Server</short_desc>
          <delta_ts>2012-01-26 00:29:02 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>10266</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>abarth</cc>
    
    <cc>evan</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>535997</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-01-13 14:33:37 -0800</bug_when>
    <thetext>Mozilla has a gorgeous UI for perf bot results on http://graphs.mozilla.org/. We should consider adopting its UI.

From IRC conversation with rhelmer,
[2:16pm] rhelmer: rniwa: so the interactive bit is e.g. http://graphs.mozilla.org/graph.html#tests=[[115,1,12]]&amp;sel=none&amp;displayrange=7&amp;datatype=running
[2:17pm] rhelmer: rniwa: if you look at the xhr it&apos;s doing, you get [14:17:00.450] GET http://graphs-new.mozilla.org/api/test?attribute=short for the manifest
[2:17pm] rhelmer: rniwa: and for the specific test [115,1,12] it&apos;s doing http://graphs-new.mozilla.org/api/test/runs?id=115&amp;branchid=1&amp;platformid=12
[2:18pm] rhelmer: rniwa: the manifest contains three maps, and you can figure out all possible platform/branch/test combinations from these
[2:18pm] rhelmer: rniwa: if you click &quot;add more test data&quot; on the left, you can multi-select any valid combination
[2:18pm] mbrandt|brb is now known as mbrandt.
[2:18pm] rhelmer: rniwa: and the current URL will be updated, like tests=[[1,2,3],[4,5,6]] and so on

[2:21pm] rhelmer: rniwa: really the code is split between ommon.js and graph-2.js in https://github.com/rhelmer/graphs/tree/master/js
[2:21pm] rhelmer: er, common.js
[2:22pm] rhelmer: rniwa: https://github.com/rhelmer/graphs/blob/master/scripts/static_graphs.js is run by cron (with node.js) to generate the static images on http://graphs.mozilla.org
[2:23pm] lonnen: cmore: instagr.am/p/e6WhY/
[2:23pm] rhelmer: rniwa: we&apos;re working on this project to improve our perf collection and tools https://wiki.mozilla.org/Auto-tools/Projects/Signal_From_Noise so I hope to see some refactoring and improvements made soon 

Also see http://roberthelmer.com/blog/?p=185</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>537510</commentid>
    <comment_count>1</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-01-17 17:53:20 -0800</bug_when>
    <thetext>I&apos;ve made a lot of progress over the weekend. I wrote an app-engine backend and deployed it on http://webkit-perf.appspot.com/ (no dashboard support yet) and also did some refactoring of the frontend code, which I&apos;m trying to upstream on https://bugzilla.mozilla.org/show_bug.cgi?id=718872 and elsewhere.

See http://webkit-perf.appspot.com/graph.html for a demo.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>541732</commentid>
    <comment_count>2</comment_count>
      <attachid>123817</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-01-24 14:54:18 -0800</bug_when>
    <thetext>Created attachment 123817
Adds the WebKit backend &amp; config.js</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>541739</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-01-24 14:59:00 -0800</bug_when>
    <thetext>Attachment 123817 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;ChangeLog&apos;, u&apos;Websites/perf-webkit.appspot...&quot; exit_code: 1

Websites/perf-webkit.appspot.com/manifest_handler.py:42:  multiple statements on one line (semicolon)  [pep8/E702] [5]
Websites/perf-webkit.appspot.com/dashboard_handler.py:58:  multiple statements on one line (semicolon)  [pep8/E702] [5]
Websites/perf-webkit.appspot.com/create_handler.py:44:  multiple statements on one line (semicolon)  [pep8/E702] [5]
Websites/perf-webkit.appspot.com/runs_handler.py:87:  multiple statements on one line (semicolon)  [pep8/E702] [5]
Total errors found: 4 in 12 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>542620</commentid>
    <comment_count>4</comment_count>
      <attachid>124010</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-01-25 14:22:39 -0800</bug_when>
    <thetext>Created attachment 124010
Fixed a bunch of bugs</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>542622</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-01-25 14:24:00 -0800</bug_when>
    <thetext>I presume you&apos;re just looking for a rubberstamp here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>542624</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-01-25 14:24:59 -0800</bug_when>
    <thetext>Attachment 124010 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;ChangeLog&apos;, u&apos;Websites/webkit-perf.appspot...&quot; exit_code: 1

Websites/webkit-perf.appspot.com/runs_handler.py:87:  multiple statements on one line (semicolon)  [pep8/E702] [5]
Websites/webkit-perf.appspot.com/create_handler.py:44:  multiple statements on one line (semicolon)  [pep8/E702] [5]
Websites/webkit-perf.appspot.com/manifest_handler.py:42:  multiple statements on one line (semicolon)  [pep8/E702] [5]
Websites/webkit-perf.appspot.com/dashboard_handler.py:58:  multiple statements on one line (semicolon)  [pep8/E702] [5]
Total errors found: 4 in 13 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>542629</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-01-25 14:26:21 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; I presume you&apos;re just looking for a rubberstamp here.

Yes. This thing is already up and running so the only difference review can make is whether it&apos;s in webkit repository or not.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>542632</commentid>
    <comment_count>8</comment_count>
      <attachid>124010</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-01-25 14:31:17 -0800</bug_when>
    <thetext>Comment on attachment 124010
Fixed a bunch of bugs

Ok.  I would have put this in the &quot;Tools&quot; folder, but this is fine now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>542922</commentid>
    <comment_count>9</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-01-26 00:29:02 -0800</bug_when>
    <thetext>Committed r105971: &lt;http://trac.webkit.org/changeset/105971&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>123817</attachid>
            <date>2012-01-24 14:54:18 -0800</date>
            <delta_ts>2012-01-25 14:22:35 -0800</delta_ts>
            <desc>Adds the WebKit backend &amp; config.js</desc>
            <filename>bug-76312-20120124145417.patch</filename>
            <type>text/plain</type>
            <size>38627</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDEwNTgx
NCkKKysrIENoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY4IEBACisyMDEyLTAx
LTI0ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAgIFBvcnQgTW96
aWxsYSdzIEdyYXBoIFNlcnZlcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NzYzMTIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBBZGQgdGhlIGFwcCBlbmdpbmUgYmFja2VuZCBmb3IgdGhlIE1vemlsbGEncyBn
cmFwaCBzZXJ2ZXIgdXNlZCBvbiBwZXJmLXdlYmtpdC5hcHBzcG90LmNvbS4KKworICAgICAgICBU
byBkZXBsb3kgd2Via2l0LXBlcmYuYXBwc3BvdC5jb20sIHlvdSBhbHNvIG5lZWQgdG8gcHVsbCBp
bmRleC5odG1sLCBlbWJlZC5odG1sLCBncmFwaC5odG1sLCBqcSwKKyAgICAgICAganMgKGV4Y2Vw
dCBjb25maWcuanMpLCBhbmQgY3NzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ3Jh
cGhzLgorCisgICAgICAgICogV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5jb206IEFkZGVk
LgorICAgICAgICAqIFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL2FwcC55YW1sOiBB
ZGRlZC4KKyAgICAgICAgKiBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9jcmVhdGVf
aGFuZGxlci5weTogQWRkZWQuCisgICAgICAgIChDcmVhdGVIYW5kbGVyKToKKyAgICAgICAgKENy
ZWF0ZUhhbmRsZXIucG9zdCk6CisgICAgICAgIChDcmVhdGVIYW5kbGVyLl9jcmVhdGVCdWlsZGVy
KToKKyAgICAgICAgKENyZWF0ZUhhbmRsZXIuX2NyZWF0ZUJ1aWxkZXIuZXhlY3V0ZSk6CisgICAg
ICAgIChDcmVhdGVIYW5kbGVyLl9jcmVhdGVCcmFuY2gpOgorICAgICAgICAoQ3JlYXRlSGFuZGxl
ci5fY3JlYXRlQnJhbmNoLmV4ZWN1dGUpOgorICAgICAgICAoQ3JlYXRlSGFuZGxlci5fY3JlYXRl
UGxhdGZvcm0pOgorICAgICAgICAoQ3JlYXRlSGFuZGxlci5fY3JlYXRlUGxhdGZvcm0uZXhlY3V0
ZSk6CisgICAgICAgICogV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5jb20vZGFzaGJvYXJk
X2hhbmRsZXIucHk6IEFkZGVkLgorICAgICAgICAoRGFzaGJvYXJkSGFuZGxlcik6CisgICAgICAg
IChEYXNoYm9hcmRIYW5kbGVyLmdldCk6CisgICAgICAgICogV2Vic2l0ZXMvcGVyZi13ZWJraXQu
YXBwc3BvdC5jb20vaW5kZXgueWFtbDogQWRkZWQuCisgICAgICAgICogV2Vic2l0ZXMvcGVyZi13
ZWJraXQuYXBwc3BvdC5jb20vbWFpbi5weTogQWRkZWQuCisgICAgICAgIChtYWluKToKKyAgICAg
ICAgKiBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9tYW5pZmVzdF9oYW5kbGVyLnB5
OiBBZGRlZC4KKyAgICAgICAgKE1hbmlmZXN0SGFuZGxlcik6CisgICAgICAgIChNYW5pZmVzdEhh
bmRsZXIuZ2V0KToKKyAgICAgICAgKiBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9t
b2RlbHMucHk6IEFkZGVkLgorICAgICAgICAoTnVtZXJpY0lkSG9sZGVyKToKKyAgICAgICAgKE51
bWVyaWNJZEhvbGRlci53aG9zZSk6CisgICAgICAgIChjcmVhdGVJblRyYW5zYWN0aW9uV2l0aE51
bWVyaWNJZEhvbGRlcik6CisgICAgICAgIChtb2RlbEZyb21OdW1lcmljSWQpOgorICAgICAgICAo
QnJhbmNoKToKKyAgICAgICAgKFBsYXRmb3JtKToKKyAgICAgICAgKEJ1aWxkZXIpOgorICAgICAg
ICAoQnVpbGRlci5hdXRoZW50aWNhdGUpOgorICAgICAgICAoQnVpbGRlci5oYXNoZWRQYXNzd29y
ZCk6CisgICAgICAgIChCdWlsZCk6CisgICAgICAgIChUZXN0KToKKyAgICAgICAgKFRlc3RSZXN1
bHQpOgorICAgICAgICAoUmVwb3J0TG9nKToKKyAgICAgICAgKiBXZWJzaXRlcy9wZXJmLXdlYmtp
dC5hcHBzcG90LmNvbS9yZXBvcnRfaGFuZGxlci5weTogQWRkZWQuCisgICAgICAgIChSZXBvcnRI
YW5kbGVyKToKKyAgICAgICAgKFJlcG9ydEhhbmRsZXIucG9zdCk6CisgICAgICAgIChSZXBvcnRI
YW5kbGVyLl9tb2RlbEJ5S2V5TmFtZUluQm9keU9yRXJyb3IpOgorICAgICAgICAoUmVwb3J0SGFu
ZGxlci5faW50ZWdlckluQm9keSk6CisgICAgICAgIChSZXBvcnRIYW5kbGVyLl90aW1lc3RhbXBJ
bkJvZHkpOgorICAgICAgICAoUmVwb3J0SGFuZGxlci5fb3V0cHV0KToKKyAgICAgICAgKFJlcG9y
dEhhbmRsZXIuX3Jlc3VsdHNBcmVWYWxpZCk6CisgICAgICAgIChSZXBvcnRIYW5kbGVyLl9jcmVh
dGVCdWlsZElmUG9zc2libGUpOgorICAgICAgICAoUmVwb3J0SGFuZGxlci5fY3JlYXRlQnVpbGRJ
ZlBvc3NpYmxlLmV4ZWN1dGUpOgorICAgICAgICAoUmVwb3J0SGFuZGxlci5fYWRkVGVzdElmTmVl
ZGVkKToKKyAgICAgICAgKFJlcG9ydEhhbmRsZXIuX2FkZFRlc3RJZk5lZWRlZC5leGVjdXRlKToK
KyAgICAgICAgKiBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9ydW5zX2hhbmRsZXIu
cHk6IEFkZGVkLgorICAgICAgICAoUnVuc0hhbmRsZXIpOgorICAgICAgICAoUnVuc0hhbmRsZXIu
Z2V0KToKKyAgICAgICAgKiBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9zdGF0aWM6
IEFkZGVkLgorICAgICAgICAqIFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL3N0YXRp
Yy9jcmVhdGUtbW9kZWxzLmh0bWw6IEFkZGVkLgorICAgICAgICAqIFdlYnNpdGVzL3BlcmYtd2Vi
a2l0LmFwcHNwb3QuY29tL3N0YXRpYy9tYW51YWwtc3VibWl0Lmh0bWw6IEFkZGVkLgorCiAyMDEy
LTAxLTI0ICBTaW1vbiBIYXVzbWFubiAgPHNpbW9uLmhhdXNtYW5uQG5va2lhLmNvbT4KIAogICAg
ICAgICBTb21lIHFtYWtlIGJ1aWxkIGZpbGVzIG11c3QgaW5jbHVkZSBRdDUncyAicXVpY2siIG1v
ZHVsZS4KSW5kZXg6IFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL2FwcC55YW1sCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL2FwcC55YW1sCShy
ZXZpc2lvbiAwKQorKysgV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5jb20vYXBwLnlhbWwJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDMgQEAKK2FwcGxpY2F0aW9uOiB3ZWJraXQtcGVyZgor
dmVyc2lvbjogNworcnVudGltZTogcHl0aG9uMjcKK2FwaV92ZXJzaW9uOiAxCit0aHJlYWRzYWZl
OiBmYWxzZQorCitoYW5kbGVyczoKKy0gdXJsOiAvZmF2aWNvblwuaWNvCisgIHN0YXRpY19maWxl
czogZmF2aWNvbi5pY28KKyAgdXBsb2FkOiBmYXZpY29uXC5pY28KKworLSB1cmw6IC9hZG1pbi8o
KC4rKVwuaHRtbCkKKyAgc3RhdGljX2ZpbGVzOiBzdGF0aWMvXDEKKyAgdXBsb2FkOiBzdGF0aWMK
KyAgbG9naW46IGFkbWluCisKKy0gdXJsOiAvCisgIHN0YXRpY19maWxlczogaW5kZXguaHRtbAor
ICB1cGxvYWQ6IGluZGV4Lmh0bWwKKworLSB1cmw6IC8oLitcLmh0bWwpCisgIHN0YXRpY19maWxl
czogXDEKKyAgdXBsb2FkOiAoLitcLmh0bWwpCisKKy0gdXJsOiAvY3NzCisgIHN0YXRpY19kaXI6
IGNzcworCistIHVybDogL2pzCisgIHN0YXRpY19kaXI6IGpzCisKKy0gdXJsOiAvanEKKyAgc3Rh
dGljX2RpcjoganEKKworLSB1cmw6IC9hcGkvdGVzdC9yZXBvcnQKKyAgc2NyaXB0OiBtYWluLnB5
CisgIHNlY3VyZTogYWx3YXlzCisKKy0gdXJsOiAvYXBpL2NyZWF0ZS8oXHcrKQorICBzY3JpcHQ6
IG1haW4ucHkKKyAgbG9naW46IGFkbWluCisKKy0gdXJsOiAuKgorICBzY3JpcHQ6IG1haW4ucHkK
SW5kZXg6IFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL2NyZWF0ZV9oYW5kbGVyLnB5
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL2NyZWF0ZV9o
YW5kbGVyLnB5CShyZXZpc2lvbiAwKQorKysgV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5j
b20vY3JlYXRlX2hhbmRsZXIucHkJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTE3IEBACisjIS91
c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoK
KyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9S
UworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgd2ViYXBwMgorZnJv
bSBnb29nbGUuYXBwZW5naW5lLmV4dCBpbXBvcnQgZGIKKworaW1wb3J0IGpzb24KKworZnJvbSBt
b2RlbHMgaW1wb3J0IEJ1aWxkZXIKK2Zyb20gbW9kZWxzIGltcG9ydCBCcmFuY2gKK2Zyb20gbW9k
ZWxzIGltcG9ydCBOdW1lcmljSWRIb2xkZXIKK2Zyb20gbW9kZWxzIGltcG9ydCBQbGF0Zm9ybQor
ZnJvbSBtb2RlbHMgaW1wb3J0IGNyZWF0ZUluVHJhbnNhY3Rpb25XaXRoTnVtZXJpY0lkSG9sZGVy
CisKKworY2xhc3MgQ3JlYXRlSGFuZGxlcih3ZWJhcHAyLlJlcXVlc3RIYW5kbGVyKToKKyAgICBk
ZWYgcG9zdChzZWxmLCBtb2RlbCk6CisgICAgICAgIHNlbGYucmVzcG9uc2UuaGVhZGVyc1snQ29u
dGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCc7CisKKyAgICAgICAgdHJ5
OgorICAgICAgICAgICAgcGF5bG9hZCA9IGpzb24ubG9hZHMoc2VsZi5yZXF1ZXN0LmJvZHkpCisg
ICAgICAgICAgICBrZXkgPSBwYXlsb2FkLmdldCgna2V5JywgJycpCisgICAgICAgICAgICBuYW1l
ID0gcGF5bG9hZC5nZXQoJ25hbWUnLCAnJykKKyAgICAgICAgICAgIHBhc3N3b3JkID0gcGF5bG9h
ZC5nZXQoJ3Bhc3N3b3JkJywgJycpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYu
cmVzcG9uc2Uub3V0LndyaXRlKCJGYWlsZWQgdG8gcGFyc2UgdGhlIHBheWxvYWQ6ICVzIiAlIHNl
bGYucmVxdWVzdC5ib2R5KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbW9kZWwg
PT0gJ2J1aWxkZXInOgorICAgICAgICAgICAgZXJyb3IgPSBzZWxmLl9jcmVhdGVCdWlsZGVyKG5h
bWUsIHBhc3N3b3JkKQorICAgICAgICBlbGlmIG1vZGVsID09ICdicmFuY2gnOgorICAgICAgICAg
ICAgZXJyb3IgPSBzZWxmLl9jcmVhdGVCcmFuY2goa2V5LCBuYW1lKQorICAgICAgICBlbGlmIG1v
ZGVsID09ICdwbGF0Zm9ybSc6CisgICAgICAgICAgICBlcnJvciA9IHNlbGYuX2NyZWF0ZVBsYXRm
b3JtKGtleSwgbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVycm9yID0gIlVua25v
d24gbW9kZWwgdHlwZTogJXNcbiIgJSBtb2RlbAorCisgICAgICAgIHNlbGYucmVzcG9uc2Uub3V0
LndyaXRlKGVycm9yICsgJ1xuJyBpZiBlcnJvciBlbHNlICdPSycpCisKKyAgICBkZWYgX2NyZWF0
ZUJ1aWxkZXIoc2VsZiwgbmFtZSwgcGFzc3dvcmQpOgorICAgICAgICBpZiBub3QgbmFtZSBvciBu
b3QgcGFzc3dvcmQ6CisgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgbmFtZSBvciBwYXNzd29y
ZCcKKworICAgICAgICBwYXNzd29yZCA9IEJ1aWxkZXIuaGFzaGVkUGFzc3dvcmQocGFzc3dvcmQp
CisKKyAgICAgICAgZGVmIGV4ZWN1dGUoKToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBOb25lCisg
ICAgICAgICAgICBib3QgPSBCdWlsZGVyLmdldF9ieV9rZXlfbmFtZShuYW1lKQorICAgICAgICAg
ICAgaWYgYm90OgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnVXBkYXRpbmcgdGhlIHBhc3N3
b3JkIHNpbmNlIGJvdCAiJXMiIGFscmVhZHkgZXhpc3RzJyAlIG5hbWUKKyAgICAgICAgICAgICAg
ICBib3QucGFzc3dvcmQgPSBwYXNzd29yZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAg
ICAgICBib3QgPSBCdWlsZGVyKG5hbWU9bmFtZSwgcGFzc3dvcmQ9cGFzc3dvcmQsIGtleV9uYW1l
PW5hbWUpCisgICAgICAgICAgICBib3QucHV0KCkKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdl
CisKKyAgICAgICAgcmV0dXJuIGRiLnJ1bl9pbl90cmFuc2FjdGlvbihleGVjdXRlKQorCisgICAg
ZGVmIF9jcmVhdGVCcmFuY2goc2VsZiwga2V5LCBuYW1lKToKKyAgICAgICAgaWYgbm90IGtleSBv
ciBub3QgbmFtZToKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBrZXkgb3IgbmFtZScKKwor
ICAgICAgICBlcnJvciA9IFtOb25lXQorCisgICAgICAgIGRlZiBleGVjdXRlKGlkKToKKyAgICAg
ICAgICAgIGlmIEJyYW5jaC5nZXRfYnlfa2V5X25hbWUoa2V5KToKKyAgICAgICAgICAgICAgICBl
cnJvclswXSA9ICdCcmFuY2ggIiVzIiBhbHJlYWR5IGV4aXN0cycgJSBrZXkKKyAgICAgICAgICAg
ICAgICByZXR1cm4KKyAgICAgICAgICAgIGJyYW5jaCA9IEJyYW5jaChpZD1pZCwgbmFtZT1uYW1l
LCBrZXlfbmFtZT1rZXkpCisgICAgICAgICAgICBicmFuY2gucHV0KCkKKyAgICAgICAgICAgIHJl
dHVybiBicmFuY2gKKworICAgICAgICBjcmVhdGVJblRyYW5zYWN0aW9uV2l0aE51bWVyaWNJZEhv
bGRlcihleGVjdXRlKQorICAgICAgICByZXR1cm4gZXJyb3JbMF0KKworICAgIGRlZiBfY3JlYXRl
UGxhdGZvcm0oc2VsZiwga2V5LCBuYW1lKToKKyAgICAgICAgaWYgbm90IGtleSBvciBub3QgbmFt
ZToKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBrZXkgbmFtZScKKworICAgICAgICBlcnJv
ciA9IFtOb25lXQorCisgICAgICAgIGRlZiBleGVjdXRlKGlkKToKKyAgICAgICAgICAgIGlmIFBs
YXRmb3JtLmdldF9ieV9rZXlfbmFtZShrZXkpOgorICAgICAgICAgICAgICAgIGVycm9yWzBdID0g
J1BsYXRmb3JtICIlcyIgYWxyZWFkeSBleGlzdHMnICUga2V5CisgICAgICAgICAgICAgICAgcmV0
dXJuCisgICAgICAgICAgICBwbGF0Zm9ybSA9IFBsYXRmb3JtKGlkPWlkLCBuYW1lPW5hbWUsIGtl
eV9uYW1lPWtleSkKKyAgICAgICAgICAgIHBsYXRmb3JtLnB1dCgpCisgICAgICAgICAgICByZXR1
cm4gcGxhdGZvcm0KKworICAgICAgICBjcmVhdGVJblRyYW5zYWN0aW9uV2l0aE51bWVyaWNJZEhv
bGRlcihleGVjdXRlKQorICAgICAgICByZXR1cm4gZXJyb3JbMF0KSW5kZXg6IFdlYnNpdGVzL3Bl
cmYtd2Via2l0LmFwcHNwb3QuY29tL2Rhc2hib2FyZF9oYW5kbGVyLnB5Cj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL2Rhc2hib2FyZF9oYW5kbGVyLnB5CShy
ZXZpc2lvbiAwKQorKysgV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5jb20vZGFzaGJvYXJk
X2hhbmRsZXIucHkJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTkgQEAKKyMhL3Vzci9iaW4vZW52
IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3Ry
aWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCB3ZWJhcHAyCisKK2ltcG9ydCBqc29u
CisKK2Zyb20gbW9kZWxzIGltcG9ydCBCdWlsZGVyCitmcm9tIG1vZGVscyBpbXBvcnQgQnJhbmNo
Citmcm9tIG1vZGVscyBpbXBvcnQgUGxhdGZvcm0KK2Zyb20gbW9kZWxzIGltcG9ydCBUZXN0CisK
KworY2xhc3MgRGFzaGJvYXJkSGFuZGxlcih3ZWJhcHAyLlJlcXVlc3RIYW5kbGVyKToKKyAgICBk
ZWYgZ2V0KHNlbGYpOgorICAgICAgICB3ZWJraXRUcnVuayA9IEJyYW5jaC5nZXRfYnlfa2V5X25h
bWUoJ3dlYmtpdC10cnVuaycpCisKKyAgICAgICAgIyBGSVhNRTogRGV0ZXJtaW5lIHBvcHVsYXIg
YnJhbmNoZXMsIHBsYXRmb3JtcywgYW5kIHRlc3RzCisgICAgICAgIGRhc2hib2FyZCA9IHsKKyAg
ICAgICAgICAgICdkZWZhdWx0QnJhbmNoJzogJ1dlYktpdCB0cnVuaycsCisgICAgICAgICAgICAn
YnJhbmNoVG9JZCc6IHt3ZWJraXRUcnVuay5uYW1lOiB3ZWJraXRUcnVuay5pZH0sCisgICAgICAg
ICAgICAncGxhdGZvcm1Ub0lkJzoge30sCisgICAgICAgICAgICAndGVzdFRvSWQnOiB7fSwKKyAg
ICAgICAgfQorCisgICAgICAgIGZvciBwbGF0Zm9ybSBpbiBQbGF0Zm9ybS5hbGwoKToKKyAgICAg
ICAgICAgIGRhc2hib2FyZFsncGxhdGZvcm1Ub0lkJ11bcGxhdGZvcm0ubmFtZV0gPSBwbGF0Zm9y
bS5pZAorCisgICAgICAgIGZvciB0ZXN0IGluIFRlc3QuYWxsKCk6CisgICAgICAgICAgICBkYXNo
Ym9hcmRbJ3Rlc3RUb0lkJ11bdGVzdC5uYW1lXSA9IHRlc3QuaWQKKworICAgICAgICBzZWxmLnJl
c3BvbnNlLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJz
ZXQ9dXRmLTgnOworICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZShqc29uLmR1bXBzKGRh
c2hib2FyZCkpCkluZGV4OiBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9pbmRleC55
YW1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL2luZGV4
LnlhbWwJKHJldmlzaW9uIDApCisrKyBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9p
bmRleC55YW1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExIEBACitpbmRleGVzOgorCisjIEFV
VE9HRU5FUkFURUQKKworIyBUaGlzIGluZGV4LnlhbWwgaXMgYXV0b21hdGljYWxseSB1cGRhdGVk
IHdoZW5ldmVyIHRoZSBkZXZfYXBwc2VydmVyCisjIGRldGVjdHMgdGhhdCBhIG5ldyB0eXBlIG9m
IHF1ZXJ5IGlzIHJ1bi4gIElmIHlvdSB3YW50IHRvIG1hbmFnZSB0aGUKKyMgaW5kZXgueWFtbCBm
aWxlIG1hbnVhbGx5LCByZW1vdmUgdGhlIGFib3ZlIG1hcmtlciBsaW5lICh0aGUgbGluZQorIyBz
YXlpbmcgIiMgQVVUT0dFTkVSQVRFRCIpLiAgSWYgeW91IHdhbnQgdG8gbWFuYWdlIHNvbWUgaW5k
ZXhlcworIyBtYW51YWxseSwgbW92ZSB0aGVtIGFib3ZlIHRoZSBtYXJrZXIgbGluZS4gIFRoZSBp
bmRleC55YW1sIGZpbGUgaXMKKyMgYXV0b21hdGljYWxseSB1cGxvYWRlZCB0byB0aGUgYWRtaW4g
Y29uc29sZSB3aGVuIHlvdSBuZXh0IGRlcGxveQorIyB5b3VyIGFwcGxpY2F0aW9uIHVzaW5nIGFw
cGNmZy5weS4KSW5kZXg6IFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL21haW4ucHkK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5jb20vbWFpbi5weQko
cmV2aXNpb24gMCkKKysrIFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL21haW4ucHkJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIwor
IyBDb3B5cmlnaHQgMjAwNywgMjAxMSBHb29nbGUgSW5jLgorIworIyBMaWNlbnNlZCB1bmRlciB0
aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1h
eSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNl
LgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0
dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVx
dWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJl
CisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJB
UyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBL
SU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRo
ZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRp
b25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgd2ViYXBwMgorZnJvbSBnb29nbGUu
YXBwZW5naW5lLmV4dC53ZWJhcHAgaW1wb3J0IHV0aWwKKworaW1wb3J0IGpzb24KKworZnJvbSBj
cmVhdGVfaGFuZGxlciBpbXBvcnQgQ3JlYXRlSGFuZGxlcgorZnJvbSBkYXNoYm9hcmRfaGFuZGxl
ciBpbXBvcnQgRGFzaGJvYXJkSGFuZGxlcgorZnJvbSBtYW5pZmVzdF9oYW5kbGVyIGltcG9ydCBN
YW5pZmVzdEhhbmRsZXIKK2Zyb20gcmVwb3J0X2hhbmRsZXIgaW1wb3J0IFJlcG9ydEhhbmRsZXIK
K2Zyb20gcnVuc19oYW5kbGVyIGltcG9ydCBSdW5zSGFuZGxlcgorCityb3V0ZXMgPSBbCisgICAg
KCcvYXBpL2NyZWF0ZS8oLiopJywgQ3JlYXRlSGFuZGxlciksCisgICAgKCcvYXBpL3Rlc3QvPycs
IE1hbmlmZXN0SGFuZGxlciksCisgICAgKCcvYXBpL3Rlc3QvcmVwb3J0Lz8nLCBSZXBvcnRIYW5k
bGVyKSwKKyAgICAoJy9hcGkvdGVzdC9ydW5zLz8nLCBSdW5zSGFuZGxlciksCisgICAgKCcvYXBp
L3Rlc3QvZGFzaGJvYXJkLz8nLCBEYXNoYm9hcmRIYW5kbGVyKSwKK10KKworCitkZWYgbWFpbigp
OgorICAgIGFwcGxpY2F0aW9uID0gd2ViYXBwMi5XU0dJQXBwbGljYXRpb24ocm91dGVzLCBkZWJ1
Zz1UcnVlKQorICAgIHV0aWwucnVuX3dzZ2lfYXBwKGFwcGxpY2F0aW9uKQorCisKK2lmIF9fbmFt
ZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCkluZGV4OiBXZWJzaXRlcy9wZXJmLXdlYmtp
dC5hcHBzcG90LmNvbS9tYW5pZmVzdF9oYW5kbGVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVz
L3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL21hbmlmZXN0X2hhbmRsZXIucHkJKHJldmlzaW9uIDAp
CisrKyBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9tYW5pZmVzdF9oYW5kbGVyLnB5
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMg
Q29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisj
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisj
ICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBp
dHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
IyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorCitpbXBvcnQgd2ViYXBwMgorCitpbXBvcnQganNvbgorCitmcm9tIG1v
ZGVscyBpbXBvcnQgQnVpbGRlcgorZnJvbSBtb2RlbHMgaW1wb3J0IEJyYW5jaAorZnJvbSBtb2Rl
bHMgaW1wb3J0IFBsYXRmb3JtCitmcm9tIG1vZGVscyBpbXBvcnQgVGVzdAorCisKK2NsYXNzIE1h
bmlmZXN0SGFuZGxlcih3ZWJhcHAyLlJlcXVlc3RIYW5kbGVyKToKKyAgICBkZWYgZ2V0KHNlbGYp
OgorICAgICAgICBzZWxmLnJlc3BvbnNlLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQv
cGxhaW47IGNoYXJzZXQ9dXRmLTgnOworICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZSgn
eyJ0ZXN0TWFwIjonKQorCisgICAgICAgIHRlc3RNYXAgPSB7fQorICAgICAgICBwbGF0Zm9ybUlk
TWFwID0ge30KKyAgICAgICAgYnJhbmNoSWRNYXAgPSB7fQorICAgICAgICBmb3IgdGVzdCBpbiBU
ZXN0LmFsbCgpOgorICAgICAgICAgICAgYnJhbmNoSWRzID0gW0JyYW5jaC5nZXQoYnJhbmNoS2V5
KS5pZCBmb3IgYnJhbmNoS2V5IGluIHRlc3QuYnJhbmNoZXNdCisgICAgICAgICAgICBwbGF0Zm9y
bUlkcyA9IFtQbGF0Zm9ybS5nZXQocGxhdGZvcm1LZXkpLmlkIGZvciBwbGF0Zm9ybUtleSBpbiB0
ZXN0LnBsYXRmb3Jtc10KKyAgICAgICAgICAgIHRlc3RNYXBbdGVzdC5pZF0gPSB7CisgICAgICAg
ICAgICAgICAgJ25hbWUnOiB0ZXN0Lm5hbWUsCisgICAgICAgICAgICAgICAgJ2JyYW5jaElkcyc6
IGJyYW5jaElkcywKKyAgICAgICAgICAgICAgICAncGxhdGZvcm1JZHMnOiBwbGF0Zm9ybUlkcywK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIHBsYXRmb3JtSWQgaW4gcGxhdGZvcm1J
ZHM6CisgICAgICAgICAgICAgICAgcGxhdGZvcm1JZE1hcC5zZXRkZWZhdWx0KHBsYXRmb3JtSWQs
IHsndGVzdHMnOiBbXSwgJ2JyYW5jaGVzJzogW119KQorICAgICAgICAgICAgICAgIHBsYXRmb3Jt
SWRNYXBbcGxhdGZvcm1JZF1bJ3Rlc3RzJ10uYXBwZW5kKHRlc3QuaWQpCisgICAgICAgICAgICAg
ICAgcGxhdGZvcm1JZE1hcFtwbGF0Zm9ybUlkXVsnYnJhbmNoZXMnXSArPSBicmFuY2hJZHMKKwor
ICAgICAgICAgICAgZm9yIGJyYW5jaElkIGluIGJyYW5jaElkczoKKyAgICAgICAgICAgICAgICBi
cmFuY2hJZE1hcC5zZXRkZWZhdWx0KGJyYW5jaElkLCB7J3Rlc3RzJzogW10sICdwbGF0Zm9ybXMn
OiBbXX0pCisgICAgICAgICAgICAgICAgYnJhbmNoSWRNYXBbYnJhbmNoSWRdWyd0ZXN0cyddLmFw
cGVuZCh0ZXN0LmlkKQorICAgICAgICAgICAgICAgIGJyYW5jaElkTWFwW2JyYW5jaElkXVsncGxh
dGZvcm1zJ10gKz0gcGxhdGZvcm1JZHMKKworICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0
ZShqc29uLmR1bXBzKHRlc3RNYXApKQorICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZSgn
LCJwbGF0Zm9ybU1hcCI6JykKKworICAgICAgICBwbGF0Zm9ybU1hcCA9IHt9CisgICAgICAgIGZv
ciBwbGF0Zm9ybSBpbiBQbGF0Zm9ybS5hbGwoKToKKyAgICAgICAgICAgIGlmIHBsYXRmb3JtLmlk
IG5vdCBpbiBwbGF0Zm9ybUlkTWFwOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAg
ICAgICBwbGF0Zm9ybU1hcFtwbGF0Zm9ybS5pZF0gPSB7CisgICAgICAgICAgICAgICAgJ25hbWUn
OiBwbGF0Zm9ybS5uYW1lLAorICAgICAgICAgICAgICAgICd0ZXN0SWRzJzogbGlzdChzZXQocGxh
dGZvcm1JZE1hcFtwbGF0Zm9ybS5pZF1bJ3Rlc3RzJ10pKSwKKyAgICAgICAgICAgICAgICAnYnJh
bmNoSWRzJzogbGlzdChzZXQocGxhdGZvcm1JZE1hcFtwbGF0Zm9ybS5pZF1bJ2JyYW5jaGVzJ10p
KSwKKyAgICAgICAgICAgIH0KKworICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZShqc29u
LmR1bXBzKHBsYXRmb3JtTWFwKSkKKyAgICAgICAgc2VsZi5yZXNwb25zZS5vdXQud3JpdGUoJywi
YnJhbmNoTWFwIjonKQorCisgICAgICAgIGJyYW5jaE1hcCA9IHt9CisgICAgICAgIGZvciBicmFu
Y2ggaW4gQnJhbmNoLmFsbCgpOgorICAgICAgICAgICAgaWYgYnJhbmNoLmlkIG5vdCBpbiBicmFu
Y2hJZE1hcDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgYnJhbmNoTWFw
W2JyYW5jaC5pZF0gPSB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiBicmFuY2gubmFtZSwKKyAg
ICAgICAgICAgICAgICAndGVzdElkcyc6IGxpc3Qoc2V0KGJyYW5jaElkTWFwW2JyYW5jaC5pZF1b
J3Rlc3RzJ10pKSwKKyAgICAgICAgICAgICAgICAncGxhdGZvcm1JZHMnOiBsaXN0KHNldChicmFu
Y2hJZE1hcFticmFuY2guaWRdWydwbGF0Zm9ybXMnXSkpLAorICAgICAgICAgICAgfQorCisgICAg
ICAgIHNlbGYucmVzcG9uc2Uub3V0LndyaXRlKGpzb24uZHVtcHMoYnJhbmNoTWFwKSkKKyAgICAg
ICAgc2VsZi5yZXNwb25zZS5vdXQud3JpdGUoJ30nKQpJbmRleDogV2Vic2l0ZXMvcGVyZi13ZWJr
aXQuYXBwc3BvdC5jb20vbW9kZWxzLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3BlcmYtd2Vi
a2l0LmFwcHNwb3QuY29tL21vZGVscy5weQkocmV2aXNpb24gMCkKKysrIFdlYnNpdGVzL3BlcmYt
d2Via2l0LmFwcHNwb3QuY29tL21vZGVscy5weQkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMTIg
QEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisj
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBoYXNo
bGliCitpbXBvcnQgcmUKKworZnJvbSBnb29nbGUuYXBwZW5naW5lLmV4dCBpbXBvcnQgZGIKKwor
CitjbGFzcyBOdW1lcmljSWRIb2xkZXIoZGIuTW9kZWwpOgorICAgIG93bmVyID0gZGIuUmVmZXJl
bmNlUHJvcGVydHkoKQorICAgICMgRHVtbXkgY2xhc3Mgd2hvc2Ugc29sZSBwdXJwb3NlIGlzIHRv
IGdlbmVyYXRlIGtleSgpLmlkKCkKKworCitkZWYgY3JlYXRlSW5UcmFuc2FjdGlvbldpdGhOdW1l
cmljSWRIb2xkZXIoY2FsbGJhY2spOgorICAgIGlkSG9sZGVyID0gTnVtZXJpY0lkSG9sZGVyKCkK
KyAgICBpZEhvbGRlci5wdXQoKQorICAgIGlkSG9sZGVyID0gTnVtZXJpY0lkSG9sZGVyLmdldChp
ZEhvbGRlci5rZXkoKSkKKyAgICBvd25lciA9IGRiLnJ1bl9pbl90cmFuc2FjdGlvbihjYWxsYmFj
aywgaWRIb2xkZXIua2V5KCkuaWQoKSkKKyAgICBpZiBvd25lcjoKKyAgICAgICAgaWRIb2xkZXIu
b3duZXIgPSBvd25lcgorICAgICAgICBpZEhvbGRlci5wdXQoKQorICAgIGVsc2U6CisgICAgICAg
IGlkSG9sZGVyLmRlbGV0ZSgpCisgICAgcmV0dXJuIG93bmVyCisKKworZGVmIG1vZGVsRnJvbU51
bWVyaWNJZChpZCwgZXhwZWN0ZWRLaW5kKToKKyAgICBpZEhvbGRlciA9IE51bWVyaWNJZEhvbGRl
ci5nZXRfYnlfaWQoaWQpCisgICAgcmV0dXJuIGlkSG9sZGVyLm93bmVyIGlmIGlkSG9sZGVyIGFu
ZCBpZEhvbGRlci5vd25lciBhbmQgaXNpbnN0YW5jZShpZEhvbGRlci5vd25lciwgZXhwZWN0ZWRL
aW5kKSBlbHNlIE5vbmUKKworCitjbGFzcyBCcmFuY2goZGIuTW9kZWwpOgorICAgIGlkID0gZGIu
SW50ZWdlclByb3BlcnR5KHJlcXVpcmVkPVRydWUpCisgICAgbmFtZSA9IGRiLlN0cmluZ1Byb3Bl
cnR5KHJlcXVpcmVkPVRydWUpCisKKworY2xhc3MgUGxhdGZvcm0oZGIuTW9kZWwpOgorICAgIGlk
ID0gZGIuSW50ZWdlclByb3BlcnR5KHJlcXVpcmVkPVRydWUpCisgICAgbmFtZSA9IGRiLlN0cmlu
Z1Byb3BlcnR5KHJlcXVpcmVkPVRydWUpCisKKworY2xhc3MgQnVpbGRlcihkYi5Nb2RlbCk6Cisg
ICAgbmFtZSA9IGRiLlN0cmluZ1Byb3BlcnR5KHJlcXVpcmVkPVRydWUpCisgICAgcGFzc3dvcmQg
PSBkYi5TdHJpbmdQcm9wZXJ0eShyZXF1aXJlZD1UcnVlKQorCisgICAgZGVmIGF1dGhlbnRpY2F0
ZShzZWxmLCByYXdQYXNzd29yZCk6CisgICAgICAgIHJldHVybiBzZWxmLnBhc3N3b3JkID09IGhh
c2hsaWIuc2hhMjU2KHJhd1Bhc3N3b3JkKS5oZXhkaWdlc3QoKQorCisgICAgQHN0YXRpY21ldGhv
ZAorICAgIGRlZiBoYXNoZWRQYXNzd29yZChyYXdQYXNzd29yZCk6CisgICAgICAgIHJldHVybiBo
YXNobGliLnNoYTI1NihyYXdQYXNzd29yZCkuaGV4ZGlnZXN0KCkKKworCitjbGFzcyBCdWlsZChk
Yi5Nb2RlbCk6CisgICAgYnJhbmNoID0gZGIuUmVmZXJlbmNlUHJvcGVydHkoQnJhbmNoLCByZXF1
aXJlZD1UcnVlLCBjb2xsZWN0aW9uX25hbWU9J2J1aWxkX2JyYW5jaCcpCisgICAgcGxhdGZvcm0g
PSBkYi5SZWZlcmVuY2VQcm9wZXJ0eShQbGF0Zm9ybSwgcmVxdWlyZWQ9VHJ1ZSwgY29sbGVjdGlv
bl9uYW1lPSdidWlsZF9wbGF0Zm9ybScpCisgICAgYnVpbGRlciA9IGRiLlJlZmVyZW5jZVByb3Bl
cnR5KEJ1aWxkZXIsIHJlcXVpcmVkPVRydWUsIGNvbGxlY3Rpb25fbmFtZT0nYnVpbGRlcl9rZXkn
KQorICAgIGJ1aWxkTnVtYmVyID0gZGIuSW50ZWdlclByb3BlcnR5KHJlcXVpcmVkPVRydWUpCisg
ICAgcmV2aXNpb24gPSBkYi5JbnRlZ2VyUHJvcGVydHkocmVxdWlyZWQ9VHJ1ZSkKKyAgICB0aW1l
c3RhbXAgPSBkYi5EYXRlVGltZVByb3BlcnR5KHJlcXVpcmVkPVRydWUpCisKKworIyBVc2VkIHRv
IGdlbmVyYXRlIFRlc3RNYXAgaW4gdGhlIG1hbmlmZXN0IGVmZmljaWVudGx5CitjbGFzcyBUZXN0
KGRiLk1vZGVsKToKKyAgICBpZCA9IGRiLkludGVnZXJQcm9wZXJ0eShyZXF1aXJlZD1UcnVlKQor
ICAgIG5hbWUgPSBkYi5TdHJpbmdQcm9wZXJ0eShyZXF1aXJlZD1UcnVlKQorICAgIGJyYW5jaGVz
ID0gZGIuTGlzdFByb3BlcnR5KGRiLktleSkKKyAgICBwbGF0Zm9ybXMgPSBkYi5MaXN0UHJvcGVy
dHkoZGIuS2V5KQorCisKK2NsYXNzIFRlc3RSZXN1bHQoZGIuTW9kZWwpOgorICAgIG5hbWUgPSBk
Yi5TdHJpbmdQcm9wZXJ0eShyZXF1aXJlZD1UcnVlKQorICAgIGJ1aWxkID0gZGIuUmVmZXJlbmNl
UHJvcGVydHkoQnVpbGQsIHJlcXVpcmVkPVRydWUpCisgICAgdmFsdWUgPSBkYi5GbG9hdFByb3Bl
cnR5KHJlcXVpcmVkPVRydWUpCisgICAgdmFsdWVNZWRpYW4gPSBkYi5GbG9hdFByb3BlcnR5KCkK
KyAgICB2YWx1ZVN0ZGV2ID0gZGIuRmxvYXRQcm9wZXJ0eSgpCisgICAgdmFsdWVNaW4gPSBkYi5G
bG9hdFByb3BlcnR5KCkKKyAgICB2YWx1ZU1heCA9IGRiLkZsb2F0UHJvcGVydHkoKQorCisKKyMg
VGVtcG9yYXJpbHkgbG9nIHJlcG9ydHMgc2VudCBieSBib3RzCitjbGFzcyBSZXBvcnRMb2coZGIu
TW9kZWwpOgorICAgIHRpbWVzdGFtcCA9IGRiLkRhdGVUaW1lUHJvcGVydHkocmVxdWlyZWQ9VHJ1
ZSkKKyAgICBoZWFkZXJzID0gZGIuVGV4dFByb3BlcnR5KCkKKyAgICBwYXlsb2FkID0gZGIuVGV4
dFByb3BlcnR5KCkKSW5kZXg6IFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL3JlcG9y
dF9oYW5kbGVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3Qu
Y29tL3JlcG9ydF9oYW5kbGVyLnB5CShyZXZpc2lvbiAwKQorKysgV2Vic2l0ZXMvcGVyZi13ZWJr
aXQuYXBwc3BvdC5jb20vcmVwb3J0X2hhbmRsZXIucHkJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTY4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEyIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMK
KyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQg
d2ViYXBwMgorZnJvbSBnb29nbGUuYXBwZW5naW5lLmV4dCBpbXBvcnQgZGIKKworaW1wb3J0IGpz
b24KK2ltcG9ydCByZQoraW1wb3J0IHRpbWUKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1l
CisKK2Zyb20gbW9kZWxzIGltcG9ydCBCdWlsZGVyCitmcm9tIG1vZGVscyBpbXBvcnQgQnJhbmNo
Citmcm9tIG1vZGVscyBpbXBvcnQgQnVpbGQKK2Zyb20gbW9kZWxzIGltcG9ydCBOdW1lcmljSWRI
b2xkZXIKK2Zyb20gbW9kZWxzIGltcG9ydCBQbGF0Zm9ybQorZnJvbSBtb2RlbHMgaW1wb3J0IFJl
cG9ydExvZworZnJvbSBtb2RlbHMgaW1wb3J0IFRlc3QKK2Zyb20gbW9kZWxzIGltcG9ydCBUZXN0
UmVzdWx0Citmcm9tIG1vZGVscyBpbXBvcnQgY3JlYXRlSW5UcmFuc2FjdGlvbldpdGhOdW1lcmlj
SWRIb2xkZXIKKworCitjbGFzcyBSZXBvcnRIYW5kbGVyKHdlYmFwcDIuUmVxdWVzdEhhbmRsZXIp
OgorICAgIGRlZiBwb3N0KHNlbGYpOgorICAgICAgICBzZWxmLnJlc3BvbnNlLmhlYWRlcnNbJ0Nv
bnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnCisKKyAgICAgICAgaGVh
ZGVycyA9ICJcbiIuam9pbihba2V5ICsgJzogJyArIHZhbHVlIGZvciBrZXksIHZhbHVlIGluIHNl
bGYucmVxdWVzdC5oZWFkZXJzLml0ZW1zKCldKQorCisgICAgICAgICMgRG8gYXMgYmVzdCBhcyB3
ZSBjYW4gdG8gcmVtb3ZlIHRoZSBwYXNzd29yZAorICAgICAgICByZXF1ZXN0X2JvZHlfd2l0aG91
dF9wYXNzd29yZCA9IHJlLnN1YihyJyJwYXNzd29yZCJccyo6XHMqIi4rPyIsJywgJycsIHNlbGYu
cmVxdWVzdC5ib2R5KQorICAgICAgICBsb2cgPSBSZXBvcnRMb2codGltZXN0YW1wPWRhdGV0aW1l
Lm5vdygpLCBoZWFkZXJzPWhlYWRlcnMsIHBheWxvYWQ9cmVxdWVzdF9ib2R5X3dpdGhvdXRfcGFz
c3dvcmQpCisgICAgICAgIGxvZy5wdXQoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNl
bGYuX2JvZHkgPSBqc29uLmxvYWRzKHNlbGYucmVxdWVzdC5ib2R5KQorICAgICAgICBleGNlcHQg
VmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9vdXRwdXQoJ0ZhaWxlZCB0byBw
YXJzZSB0aGUgcGF5bG9hZCBhcyBhIGpzb24uIFJlcG9ydCBrZXk6ICVkJyAlIGxvZy5rZXkoKS5p
ZCgpKQorCisgICAgICAgIGJ1aWxkZXIgPSBzZWxmLl9tb2RlbEJ5S2V5TmFtZUluQm9keU9yRXJy
b3IoQnVpbGRlciwgJ2J1aWxkZXItbmFtZScpCisgICAgICAgIGJyYW5jaCA9IHNlbGYuX21vZGVs
QnlLZXlOYW1lSW5Cb2R5T3JFcnJvcihCcmFuY2gsICdicmFuY2gnKQorICAgICAgICBwbGF0Zm9y
bSA9IHNlbGYuX21vZGVsQnlLZXlOYW1lSW5Cb2R5T3JFcnJvcihQbGF0Zm9ybSwgJ3BsYXRmb3Jt
JykKKyAgICAgICAgYnVpbGROdW1iZXIgPSBzZWxmLl9pbnRlZ2VySW5Cb2R5KCdidWlsZC1udW1i
ZXInKQorICAgICAgICByZXZpc2lvbiA9IHNlbGYuX2ludGVnZXJJbkJvZHkoJ3JldmlzaW9uJykK
KyAgICAgICAgdGltZXN0YW1wID0gc2VsZi5fdGltZXN0YW1wSW5Cb2R5KCkKKworICAgICAgICBm
YWlsZWQgPSBGYWxzZQorICAgICAgICBpZiBidWlsZGVyIGFuZCBub3QgYnVpbGRlci5hdXRoZW50
aWNhdGUoc2VsZi5fYm9keS5nZXQoJ3Bhc3N3b3JkJywgJycpKToKKyAgICAgICAgICAgIHNlbGYu
X291dHB1dCgnQXV0aGVudGljYXRpb24gZmFpbGVkJykKKyAgICAgICAgICAgIGZhaWxlZCA9IFRy
dWUKKworICAgICAgICBpZiBub3Qgc2VsZi5fcmVzdWx0c0FyZVZhbGlkKCk6CisgICAgICAgICAg
ICBzZWxmLl9vdXRwdXQoIlRoZSBwYXlsb2FkIGRvZXNuJ3QgY29udGFpbiByZXN1bHRzIG9yIHJl
c3VsdHMgYXJlIG1hbGZvcm1lZCIpCisgICAgICAgICAgICBmYWlsZWQgPSBUcnVlCisKKyAgICAg
ICAgaWYgbm90IChidWlsZGVyIGFuZCBicmFuY2ggYW5kIHBsYXRmb3JtIGFuZCBidWlsZE51bWJl
ciBhbmQgcmV2aXNpb24gYW5kIHRpbWVzdGFtcCkgb3IgZmFpbGVkOgorICAgICAgICAgICAgcmV0
dXJuCisKKyAgICAgICAgYnVpbGQgPSBzZWxmLl9jcmVhdGVCdWlsZElmUG9zc2libGUoYnVpbGRl
ciwgYnVpbGROdW1iZXIsIGJyYW5jaCwgcGxhdGZvcm0sIHJldmlzaW9uLCB0aW1lc3RhbXApCisg
ICAgICAgIGlmIG5vdCBidWlsZDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciB0
ZXN0LCByZXN1bHQgaW4gc2VsZi5fYm9keVsncmVzdWx0cyddLml0ZXJpdGVtcygpOgorICAgICAg
ICAgICAgc2VsZi5fYWRkVGVzdElmTmVlZGVkKHRlc3QsIGJyYW5jaCwgcGxhdGZvcm0pCisgICAg
ICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgZGljdCk6CisgICAgICAgICAgICAgICAgVGVz
dFJlc3VsdChuYW1lPXRlc3QsIGJ1aWxkPWJ1aWxkLCB2YWx1ZT1mbG9hdChyZXN1bHQuZ2V0KCdh
dmVyYWdlJywgMCkpLCB2YWx1ZU1lZGlhbj1mbG9hdChyZXN1bHQuZ2V0KCdtZWRpYW4nLCAwKSks
CisgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RkZXY9ZmxvYXQocmVzdWx0LmdldCgnc3RkZXYn
LCAwKSksIHZhbHVlTWluPWZsb2F0KHJlc3VsdC5nZXQoJ21pbicsIDApKSwgdmFsdWVNYXg9Zmxv
YXQocmVzdWx0LmdldCgnbWF4JywgMCkpKS5wdXQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAg
ICAgICAgICAgICBUZXN0UmVzdWx0KG5hbWU9dGVzdCwgYnVpbGQ9YnVpbGQsIHZhbHVlPWZsb2F0
KHJlc3VsdCkpLnB1dCgpCisKKyAgICAgICAgbG9nID0gUmVwb3J0TG9nLmdldChsb2cua2V5KCkp
CisgICAgICAgIGxvZy5kZWxldGUoKQorCisgICAgICAgIHJldHVybiBzZWxmLl9vdXRwdXQoJ09L
JykKKworICAgIGRlZiBfbW9kZWxCeUtleU5hbWVJbkJvZHlPckVycm9yKHNlbGYsIG1vZGVsLCBr
ZXlOYW1lKToKKyAgICAgICAga2V5ID0gc2VsZi5fYm9keS5nZXQoa2V5TmFtZSwgJycpCisgICAg
ICAgIGluc3RhbmNlID0ga2V5IGFuZCBtb2RlbC5nZXRfYnlfa2V5X25hbWUoa2V5KQorICAgICAg
ICBpZiBub3QgaW5zdGFuY2U6CisgICAgICAgICAgICBzZWxmLl9vdXRwdXQoJ1RoZXJlIGFyZSBu
byAlcyBuYW1lZCAiJXMiJyAlIChtb2RlbC5fX25hbWVfXy5sb3dlcigpLCBrZXkpKQorICAgICAg
ICByZXR1cm4gaW5zdGFuY2UKKworICAgIGRlZiBfaW50ZWdlckluQm9keShzZWxmLCBrZXkpOgor
ICAgICAgICB2YWx1ZSA9IHNlbGYuX2JvZHkuZ2V0KGtleSwgJycpCisgICAgICAgIHRyeToKKyAg
ICAgICAgICAgIHJldHVybiBpbnQodmFsdWUpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAg
IHJldHVybiBzZWxmLl9vdXRwdXQoJ0ludmFsaWQgJXM6ICIlcyInICUgKGtleS5yZXBsYWNlKCct
JywgJyAnKSwgdmFsdWUpKQorCisgICAgZGVmIF90aW1lc3RhbXBJbkJvZHkoc2VsZik6CisgICAg
ICAgIHZhbHVlID0gc2VsZi5fYm9keS5nZXQoJ3RpbWVzdGFtcCcsICcnKQorICAgICAgICB0cnk6
CisgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChpbnQodmFsdWUpKQor
ICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fb3V0cHV0KCdGYWlsZWQg
dG8gcGFyc2UgdGhlIHRpbWVzdGFtcDogJXMnICUgdmFsdWUpCisKKyAgICBkZWYgX291dHB1dChz
ZWxmLCBtZXNzYWdlKToKKyAgICAgICAgc2VsZi5yZXNwb25zZS5vdXQud3JpdGUobWVzc2FnZSAr
ICdcbicpCisKKyAgICBkZWYgX3Jlc3VsdHNBcmVWYWxpZChzZWxmKToKKyAgICAgICAgaWYgJ3Jl
c3VsdHMnIG5vdCBpbiBzZWxmLl9ib2R5IG9yIG5vdCBpc2luc3RhbmNlKHNlbGYuX2JvZHlbJ3Jl
c3VsdHMnXSwgZGljdCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBmb3Ig
dGVzdFJlc3VsdCBpbiBzZWxmLl9ib2R5WydyZXN1bHRzJ10udmFsdWVzKCk6CisgICAgICAgICAg
ICBpZiBpc2luc3RhbmNlKHRlc3RSZXN1bHQsIGRpY3QpOgorICAgICAgICAgICAgICAgIGZvciB2
YWx1ZSBpbiB0ZXN0UmVzdWx0LnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qg
aXNpbnN0YW5jZSh2YWx1ZSwgaW50KSBhbmQgbm90IGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KToK
KyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgICAgIGlm
ICdhdmVyYWdlJyBub3QgaW4gdGVzdFJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IEZhbHNlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCBpc2lu
c3RhbmNlKHRlc3RSZXN1bHQsIGludCkgYW5kIG5vdCBpc2luc3RhbmNlKHRlc3RSZXN1bHQsIGZs
b2F0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICByZXR1cm4gVHJ1
ZQorCisgICAgZGVmIF9jcmVhdGVCdWlsZElmUG9zc2libGUoc2VsZiwgYnVpbGRlciwgYnVpbGRO
dW1iZXIsIGJyYW5jaCwgcGxhdGZvcm0sIHJldmlzaW9uLCB0aW1lc3RhbXApOgorICAgICAgICBr
ZXlfbmFtZSA9IGJ1aWxkZXIubmFtZSArICc6JyArIHN0cihpbnQodGltZS5ta3RpbWUodGltZXN0
YW1wLnRpbWV0dXBsZSgpKSkpCisKKyAgICAgICAgZGVmIGV4ZWN1dGUoKToKKyAgICAgICAgICAg
IGJ1aWxkID0gQnVpbGQuZ2V0X2J5X2tleV9uYW1lKGtleV9uYW1lKQorICAgICAgICAgICAgaWYg
YnVpbGQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX291dHB1dCgnVGhlIGJ1aWxkIGF0
ICVzIGFscmVhZHkgZXhpc3RzIGZvciAlcycgJSAoc3RyKHRpbWVzdGFtcCksIGJ1aWxkZXIubmFt
ZSkpCisKKyAgICAgICAgICAgIHJldHVybiBCdWlsZChicmFuY2g9YnJhbmNoLCBwbGF0Zm9ybT1w
bGF0Zm9ybSwgYnVpbGRlcj1idWlsZGVyLCBidWlsZE51bWJlcj1idWlsZE51bWJlciwKKyAgICAg
ICAgICAgICAgICB0aW1lc3RhbXA9dGltZXN0YW1wLCByZXZpc2lvbj1yZXZpc2lvbiwga2V5X25h
bWU9a2V5X25hbWUpLnB1dCgpCisgICAgICAgIHJldHVybiBkYi5ydW5faW5fdHJhbnNhY3Rpb24o
ZXhlY3V0ZSkKKworICAgIGRlZiBfYWRkVGVzdElmTmVlZGVkKHNlbGYsIHRlc3ROYW1lLCBicmFu
Y2gsIHBsYXRmb3JtKToKKworICAgICAgICBkZWYgZXhlY3V0ZShpZCk6CisgICAgICAgICAgICB0
ZXN0ID0gVGVzdC5nZXRfYnlfa2V5X25hbWUodGVzdE5hbWUpCisgICAgICAgICAgICByZXR1cm5W
YWx1ZSA9IE5vbmUKKyAgICAgICAgICAgIGlmIG5vdCB0ZXN0OgorICAgICAgICAgICAgICAgIHRl
c3QgPSBUZXN0KGlkPWlkLCBuYW1lPXRlc3ROYW1lLCBrZXlfbmFtZT10ZXN0TmFtZSkKKyAgICAg
ICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHRlc3QKKyAgICAgICAgICAgIGlmIGJyYW5jaC5rZXko
KSBub3QgaW4gdGVzdC5icmFuY2hlczoKKyAgICAgICAgICAgICAgICB0ZXN0LmJyYW5jaGVzLmFw
cGVuZChicmFuY2gua2V5KCkpCisgICAgICAgICAgICBpZiBwbGF0Zm9ybS5rZXkoKSBub3QgaW4g
dGVzdC5wbGF0Zm9ybXM6CisgICAgICAgICAgICAgICAgdGVzdC5wbGF0Zm9ybXMuYXBwZW5kKHBs
YXRmb3JtLmtleSgpKQorICAgICAgICAgICAgdGVzdC5wdXQoKQorICAgICAgICAgICAgcmV0dXJu
IHJldHVyblZhbHVlCisgICAgICAgIGNyZWF0ZUluVHJhbnNhY3Rpb25XaXRoTnVtZXJpY0lkSG9s
ZGVyKGV4ZWN1dGUpCkluZGV4OiBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9ydW5z
X2hhbmRsZXIucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5j
b20vcnVuc19oYW5kbGVyLnB5CShyZXZpc2lvbiAwKQorKysgV2Vic2l0ZXMvcGVyZi13ZWJraXQu
YXBwc3BvdC5jb20vcnVuc19oYW5kbGVyLnB5CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk0IEBA
CisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisj
IG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgd2ViYXBw
MgorCitpbXBvcnQganNvbgorZnJvbSB0aW1lIGltcG9ydCBta3RpbWUKK2Zyb20gZGF0ZXRpbWUg
aW1wb3J0IGRhdGV0aW1lCisKK2Zyb20gbW9kZWxzIGltcG9ydCBCdWlsZAorZnJvbSBtb2RlbHMg
aW1wb3J0IEJ1aWxkZXIKK2Zyb20gbW9kZWxzIGltcG9ydCBCcmFuY2gKK2Zyb20gbW9kZWxzIGlt
cG9ydCBOdW1lcmljSWRIb2xkZXIKK2Zyb20gbW9kZWxzIGltcG9ydCBQbGF0Zm9ybQorZnJvbSBt
b2RlbHMgaW1wb3J0IFRlc3QKK2Zyb20gbW9kZWxzIGltcG9ydCBUZXN0UmVzdWx0Citmcm9tIG1v
ZGVscyBpbXBvcnQgbW9kZWxGcm9tTnVtZXJpY0lkCisKKworY2xhc3MgUnVuc0hhbmRsZXIod2Vi
YXBwMi5SZXF1ZXN0SGFuZGxlcik6CisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgdHJ5Ogor
ICAgICAgICAgICAgdGVzdElkID0gaW50KHNlbGYucmVxdWVzdC5nZXQoJ2lkJywgMCkpCisgICAg
ICAgICAgICBicmFuY2hJZCA9IGludChzZWxmLnJlcXVlc3QuZ2V0KCdicmFuY2hpZCcsIDApKQor
ICAgICAgICAgICAgcGxhdGZvcm1JZCA9IGludChzZWxmLnJlcXVlc3QuZ2V0KCdwbGF0Zm9ybWlk
JywgMCkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAjIEZJWE1FOiBP
dXRwdXQgYW4gZXJyb3IgaGVyZQorICAgICAgICAgICAgdGVzdElkID0gMAorICAgICAgICAgICAg
YnJhbmNoSWQgPSAwCisgICAgICAgICAgICBwbGF0Zm9ybUlkID0gMAorCisgICAgICAgICMgRklY
TUU6IEp1c3QgZmV0Y2ggYnVpbGRzIHNwZWNpZmllZCBieSAiZGF5cyIKKyAgICAgICAgIyBkYXlz
ID0gc2VsZi5yZXF1ZXN0LmdldCgnZGF5cycsIDM2NSkKKworICAgICAgICBidWlsZHMgPSBCdWls
ZC5hbGwoKQorICAgICAgICBidWlsZHMuZmlsdGVyKCdicmFuY2ggPScsIG1vZGVsRnJvbU51bWVy
aWNJZChicmFuY2hJZCwgQnJhbmNoKSkKKyAgICAgICAgYnVpbGRzLmZpbHRlcigncGxhdGZvcm0g
PScsIG1vZGVsRnJvbU51bWVyaWNJZChwbGF0Zm9ybUlkLCBQbGF0Zm9ybSkpCisKKyAgICAgICAg
dGVzdCA9IG1vZGVsRnJvbU51bWVyaWNJZCh0ZXN0SWQsIFRlc3QpCisgICAgICAgIHRlc3ROYW1l
ID0gdGVzdC5uYW1lIGlmIHRlc3QgZWxzZSBOb25lCisgICAgICAgIHRlc3RfcnVucyA9IFtdCisg
ICAgICAgIGF2ZXJhZ2VzID0ge30KKyAgICAgICAgdmFsdWVzID0gW10KKyAgICAgICAgdGltZXN0
YW1wcyA9IFtdCisKKyAgICAgICAgZm9yIGJ1aWxkIGluIGJ1aWxkczoKKyAgICAgICAgICAgIHJl
c3VsdHMgPSBUZXN0UmVzdWx0LmFsbCgpCisgICAgICAgICAgICByZXN1bHRzLmZpbHRlcignbmFt
ZSA9JywgdGVzdE5hbWUpCisgICAgICAgICAgICByZXN1bHRzLmZpbHRlcignYnVpbGQgPScsIGJ1
aWxkKQorICAgICAgICAgICAgZm9yIHJlc3VsdCBpbiByZXN1bHRzOgorICAgICAgICAgICAgICAg
IGJ1aWxkZXJJZCA9IGJ1aWxkLmJ1aWxkZXIua2V5KCkuaWQoKQorICAgICAgICAgICAgICAgIHBv
c2l4VGltZXN0YW1wID0gbWt0aW1lKGJ1aWxkLnRpbWVzdGFtcC50aW1ldHVwbGUoKSkKKyAgICAg
ICAgICAgICAgICB0ZXN0X3J1bnMuYXBwZW5kKFtyZXN1bHQua2V5KCkuaWQoKSwKKyAgICAgICAg
ICAgICAgICAgICAgW2J1aWxkLmtleSgpLmlkKCksIGJ1aWxkLmJ1aWxkTnVtYmVyLCBidWlsZC5y
ZXZpc2lvbl0sCisgICAgICAgICAgICAgICAgICAgIHBvc2l4VGltZXN0YW1wLCByZXN1bHQudmFs
dWUsIDAsIFtdLCBidWlsZGVySWRdKQorICAgICAgICAgICAgICAgICMgRklYTUU6IENhbGN1bGF0
ZSB0aGUgYXZlcmFnZTsgaW4gcHJhY3RpY2UsIHdlIHdvdWxkbid0IGhhdmUgbW9yZSB0aGFuIG9u
ZSB2YWx1ZSBmb3IgYSBnaXZlbiByZXZpc2lvbgorICAgICAgICAgICAgICAgIGF2ZXJhZ2VzW2J1
aWxkLnJldmlzaW9uXSA9IHJlc3VsdC52YWx1ZQorICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBl
bmQocmVzdWx0LnZhbHVlKQorICAgICAgICAgICAgICAgIHRpbWVzdGFtcHMuYXBwZW5kKHBvc2l4
VGltZXN0YW1wKQorCisgICAgICAgIHNlbGYucmVzcG9uc2UuaGVhZGVyc1snQ29udGVudC1UeXBl
J10gPSAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCc7CisgICAgICAgIHNlbGYucmVz
cG9uc2Uub3V0LndyaXRlKGpzb24uZHVtcHMoeworICAgICAgICAgICAgJ3Rlc3RfcnVucyc6IHRl
c3RfcnVucywKKyAgICAgICAgICAgICdhdmVyYWdlcyc6IGF2ZXJhZ2VzLAorICAgICAgICAgICAg
J21pbic6IG1pbih2YWx1ZXMpIGlmIHZhbHVlcyBlbHNlIE5vbmUsCisgICAgICAgICAgICAnbWF4
JzogbWF4KHZhbHVlcykgaWYgdmFsdWVzIGVsc2UgTm9uZSwKKyAgICAgICAgICAgICdkYXRlX3Jh
bmdlJzogW21pbih0aW1lc3RhbXBzKSwgbWF4KHRpbWVzdGFtcHMpXSBpZiB0aW1lc3RhbXBzIGVs
c2UgTm9uZSwKKyAgICAgICAgICAgICdzdGF0JzogJ29rJ30pKQpJbmRleDogV2Vic2l0ZXMvcGVy
Zi13ZWJraXQuYXBwc3BvdC5jb20vc3RhdGljL2NyZWF0ZS1tb2RlbHMuaHRtbAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9zdGF0aWMvY3JlYXRlLW1vZGVs
cy5odG1sCShyZXZpc2lvbiAwKQorKysgV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5jb20v
c3RhdGljL2NyZWF0ZS1tb2RlbHMuaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2OSBAQAor
PCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkNyZWF0ZSBuZXcgbW9kZWxz
PC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CitlbSB7IGZvbnQtc3R5bGU6IG5vcm1h
bDsgY29sb3I6IHJlZDsgfQorcHJlIHtib3JkZXI6IHNvbGlkIDFweCBibGFjazsgcGFkZGluZzog
NXB4O30KK2gzIHtmb250LXNpemU6IDFlbTt9Cis8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8
aDE+Q3JlYXRlIG5ldyBtb2RlbHM8L2gxPgorCis8cD5LZXk6IGNhbm9uaWNhbGl6ZWQgbmFtZSB1
c2VkIGJ5IGJ1aWxkIGJvdHMgYW5kIHN0b3JhZ2UuIE5hbWU6IGh1bWFuIGZyaWVuZGx5IG5hbWU8
L3A+CisKKzxoMj5CdWlsZGVyPC9oMj4KKzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIvYXBp
L2NyZWF0ZS9idWlsZGVyIiBvbnN1Ym1pdD0icmV0dXJuIHN1Ym1pdEJ5WEhSKHRoaXMsIGV2ZW50
KSI+Cis8bGFiZWwgZm9yPSJuYW1lIj5OYW1lL0tleTwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQi
IG5hbWU9Im5hbWUiPgorPGxhYmVsIGZvcj0icGFzc3dvcmQiPlBhc3N3b3JkPC9sYWJlbD48aW5w
dXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIj4KKzxidXR0b24gdHlwZT0ic3VibWl0
Ij5DcmVhdGU8L2J1dHRvbj4KKzwvZm9ybT4KKworPGgyPkJyYW5jaDwvaDI+Cis8Zm9ybSBtZXRo
b2Q9InBvc3QiIGFjdGlvbj0iL2FwaS9jcmVhdGUvYnJhbmNoIiBvbnN1Ym1pdD0icmV0dXJuIHN1
Ym1pdEJ5WEhSKHRoaXMsIGV2ZW50KTsiPgorPGxhYmVsIGZvcj0ia2V5Ij5LZXk8L2xhYmVsPjxp
bnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJrZXkiPgorPGxhYmVsIGZvcj0ibmFtZSI+TmFtZTwvbGFi
ZWw+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5hbWUiPgorPGJ1dHRvbiB0eXBlPSJzdWJtaXQi
PkNyZWF0ZTwvYnV0dG9uPgorPC9mb3JtPgorCis8aDI+UGxhdGZvcm08L2gyPgorPGZvcm0gbWV0
aG9kPSJwb3N0IiBhY3Rpb249Ii9hcGkvY3JlYXRlL3BsYXRmb3JtIiBvbnN1Ym1pdD0icmV0dXJu
IHN1Ym1pdEJ5WEhSKHRoaXMsIGV2ZW50KSI+Cis8bGFiZWwgZm9yPSJrZXkiPktleTwvbGFiZWw+
PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImtleSI+Cis8bGFiZWwgZm9yPSJuYW1lIj5OYW1lPC9s
YWJlbD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmFtZSI+Cis8YnV0dG9uIHR5cGU9InN1Ym1p
dCI+Q3JlYXRlPC9idXR0b24+Cis8L2Zvcm0+CisKKzxoMj5SZXN1bHQ6PC9oMj4KKzxoMz5TdGF0
dXMgY29kZTwvaDM+Cis8cCBpZD0ic3RhdHVzIj48L3A+Cis8aDM+SGVhZGVyczwvaDM+Cis8cHJl
IGlkPSJoZWFkZXJzIj48L3ByZT4KKzxoMz5SZXNwb25zZTwvaDM+Cis8cHJlIGlkPSJyZXNwb25z
ZSIgbmFtZT0icmVzcG9uc2UiPjwvcHJlPgorPHNjcmlwdD4KKworJCA9IGZ1bmN0aW9uIChpZCkg
eyByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyB9CisKK2Z1bmN0aW9uIHN1Ym1p
dEJ5WEhSKGZvcm0sIGV2ZW50KSB7CisgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKworICAg
IHZhciBjb250ZW50cyA9IHt9CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtLmVsZW1lbnRz
Lmxlbmd0aDsgaSsrKQorICAgICAgICBjb250ZW50c1tmb3JtLmVsZW1lbnRzW2ldLm5hbWVdID0g
Zm9ybS5lbGVtZW50c1tpXS52YWx1ZTsKKworICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVl
c3Q7CisgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAg
aWYgKHhoci5yZWFkeVN0YXRlICE9IDQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICQo
J3N0YXR1cycpLmlubmVyVGV4dCA9IHhoci5zdGF0dXM7CisgICAgICAgICQoJ2hlYWRlcnMnKS5p
bm5lclRleHQgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisgICAgICAgICQoJ3Jlc3Bv
bnNlJykuaW5uZXJIVE1MID0geGhyLnJlc3BvbnNlVGV4dDsKKyAgICB9CisgICAgeGhyLm9wZW4o
Zm9ybS5tZXRob2QsIGZvcm0uYWN0aW9uLCB0cnVlKTsKKyAgICB4aHIuc2VuZChKU09OLnN0cmlu
Z2lmeShjb250ZW50cykpOworfQorCis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6
IFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL3N0YXRpYy9tYW51YWwtc3VibWl0Lmh0
bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5jb20vc3RhdGlj
L21hbnVhbC1zdWJtaXQuaHRtbAkocmV2aXNpb24gMCkKKysrIFdlYnNpdGVzL3BlcmYtd2Via2l0
LmFwcHNwb3QuY29tL3N0YXRpYy9tYW51YWwtc3VibWl0Lmh0bWwJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsNjkgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5UZXN0
IHN1Ym1pc3Npb24gb2YgYSBidWlsZCByZXBvcnQ8L3RpdGxlPgorPHN0eWxlIHR5cGU9InRleHQv
Y3NzIj4KK2VtIHsgZm9udC1zdHlsZTogbm9ybWFsOyBjb2xvcjogcmVkOyB9CitwcmUge2JvcmRl
cjogc29saWQgMXB4IGJsYWNrOyBwYWRkaW5nOiA1cHg7fQoraDMge2ZvbnQtc2l6ZTogMWVtO30K
Kzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5UZXN0IHN1Ym1pc3Npb24gb2YgYSBidWls
ZCByZXBvcnQ8L2gxPgorPHA+U3BlY2lmeSB0aGUgcGF5bG9hZCBhbmQgc3VibWl0OjwvcD4KKzx0
ZXh0YXJlYSBpZD0iZGF0YSIgbmFtZT0iZGF0YSIgcm93cz0iMjAiIGNvbHM9IjEwMCI+PC90ZXh0
YXJlYT48YnI+Cis8ZW0gaWQ9Impzb25fZXJyb3IiPjwvZW0+PGJyPgorPGJ1dHRvbiB0eXBlPSJz
dWJtaXQiIG9uY2xpY2s9InN1Ym1pdCgpIj5TdWJtaXQ8L2J1dHRvbj4KKworPGgyPlJlc3VsdDo8
L2gyPgorPGgzPlN0YXR1cyBjb2RlPC9oMz4KKzxwIGlkPSJzdGF0dXMiPjwvcD4KKzxoMz5IZWFk
ZXJzPC9oMz4KKzxwcmUgaWQ9ImhlYWRlcnMiPjwvcHJlPgorPGgzPlJlc3BvbnNlPC9oMz4KKzxw
cmUgaWQ9InJlc3BvbnNlIiBuYW1lPSJyZXNwb25zZSI+PC9wcmU+Cis8c2NyaXB0PgorCiskID0g
ZnVuY3Rpb24gKGlkKSB7IHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7IH0KKwor
JCgnZGF0YScpLm9uaW5wdXQgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHBheWxvYWQgPSAkKCdk
YXRhJykudmFsdWU7CisgICAgdHJ5IHsKKyAgICAgICAgSlNPTi5wYXJzZShwYXlsb2FkKTsKKyAg
ICAgICAgJCgnanNvbl9lcnJvcicpLmlubmVyVGV4dCA9ICcnOworICAgIH0gY2F0Y2ggKGVycm9y
KSB7CisgICAgICAgICQoJ2pzb25fZXJyb3InKS5pbm5lclRleHQgPSBlcnJvcjsKKyAgICB9Cit9
CisKK2Z1bmN0aW9uIHN1Ym1pdCgpIHsKKyAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0
OworICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIGlm
ICh4aHIucmVhZHlTdGF0ZSAhPSA0KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAkKCdz
dGF0dXMnKS5pbm5lclRleHQgPSB4aHIuc3RhdHVzOworICAgICAgICAkKCdoZWFkZXJzJykuaW5u
ZXJUZXh0ID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpOworICAgICAgICAkKCdyZXNwb25z
ZScpLmlubmVySFRNTCA9IHhoci5yZXNwb25zZVRleHQ7CisgICAgfQorICAgIHhoci5vcGVuKCdQ
T1NUJywnL2FwaS90ZXN0L3JlcG9ydC8nLCB0cnVlKTsKKyAgICB4aHIuc2VuZCgkKCdkYXRhJyku
dmFsdWUpOworfQorCiskKCdkYXRhJykudmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7CisgICAgJ3Bh
c3N3b3JkJzogJ3Rlc3QnLAorICAgICdicmFuY2gnOiAnd2Via2l0LXRydW5rJywKKyAgICAncGxh
dGZvcm0nOiAnY2hyb21pdW0tbWFjJywKKyAgICAnYnVpbGRlci1uYW1lJzogJ2dvb2dsZS1tYWMt
MicsCisgICAgJ2J1aWxkLW51bWJlcic6ICcxMjMnLAorICAgICd0aW1lc3RhbXAnOiBwYXJzZUlu
dChEYXRlLm5vdygpIC8gMTAwMCksCisgICAgJ3JldmlzaW9uJzogMTA0ODU2LAorICAgICdyZXN1
bHRzJzoKKyAgICAgICAgeworICAgICAgICAgICAgJ3dlYmtpdF9zdHlsZV90ZXN0JzogeydhdmVy
YWdlJzogMTAwLCAnbWVkaWFuJzogMTAyLCAnc3RkZXYnOiA1LCAnbWluJzogOTAsICdtYXgnOiAx
MTB9LAorICAgICAgICAgICAgJ3NvbWVfdGVzdCc6IDU0LAorICAgICAgICB9LAorfSwgbnVsbCwg
JyAgJyk7CisKKzwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124010</attachid>
            <date>2012-01-25 14:22:39 -0800</date>
            <delta_ts>2012-01-25 14:31:17 -0800</delta_ts>
            <desc>Fixed a bunch of bugs</desc>
            <filename>bug-76312-20120125142238.patch</filename>
            <type>text/plain</type>
            <size>41642</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDEwNTgx
NCkKKysrIENoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY4IEBACisyMDEyLTAx
LTI0ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAgIFBvcnQgTW96
aWxsYSdzIEdyYXBoIFNlcnZlcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NzYzMTIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBBZGQgdGhlIGFwcCBlbmdpbmUgYmFja2VuZCBmb3IgdGhlIE1vemlsbGEncyBn
cmFwaCBzZXJ2ZXIgdXNlZCBvbiBwZXJmLXdlYmtpdC5hcHBzcG90LmNvbS4KKworICAgICAgICBU
byBkZXBsb3kgd2Via2l0LXBlcmYuYXBwc3BvdC5jb20sIHlvdSBhbHNvIG5lZWQgdG8gcHVsbCBp
bmRleC5odG1sLCBlbWJlZC5odG1sLCBncmFwaC5odG1sLCBqcSwKKyAgICAgICAganMgKGV4Y2Vw
dCBjb25maWcuanMpLCBhbmQgY3NzIChleGNlcHQgdGl0bGUucG5nKSBmcm9tIGh0dHBzOi8vZ2l0
aHViLmNvbS9tb3ppbGxhL2dyYXBocy4KKworICAgICAgICAqIFdlYnNpdGVzL3BlcmYtd2Via2l0
LmFwcHNwb3QuY29tOiBBZGRlZC4KKyAgICAgICAgKiBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBz
cG90LmNvbS9hcHAueWFtbDogQWRkZWQuCisgICAgICAgICogV2Vic2l0ZXMvcGVyZi13ZWJraXQu
YXBwc3BvdC5jb20vY3JlYXRlX2hhbmRsZXIucHk6IEFkZGVkLgorICAgICAgICAoQ3JlYXRlSGFu
ZGxlcik6CisgICAgICAgIChDcmVhdGVIYW5kbGVyLnBvc3QpOgorICAgICAgICAoQ3JlYXRlSGFu
ZGxlci5fY3JlYXRlQnVpbGRlcik6CisgICAgICAgIChDcmVhdGVIYW5kbGVyLl9jcmVhdGVCdWls
ZGVyLmV4ZWN1dGUpOgorICAgICAgICAoQ3JlYXRlSGFuZGxlci5fY3JlYXRlQnJhbmNoKToKKyAg
ICAgICAgKENyZWF0ZUhhbmRsZXIuX2NyZWF0ZUJyYW5jaC5leGVjdXRlKToKKyAgICAgICAgKENy
ZWF0ZUhhbmRsZXIuX2NyZWF0ZVBsYXRmb3JtKToKKyAgICAgICAgKENyZWF0ZUhhbmRsZXIuX2Ny
ZWF0ZVBsYXRmb3JtLmV4ZWN1dGUpOgorICAgICAgICAqIFdlYnNpdGVzL3BlcmYtd2Via2l0LmFw
cHNwb3QuY29tL2Rhc2hib2FyZF9oYW5kbGVyLnB5OiBBZGRlZC4KKyAgICAgICAgKERhc2hib2Fy
ZEhhbmRsZXIpOgorICAgICAgICAoRGFzaGJvYXJkSGFuZGxlci5nZXQpOgorICAgICAgICAqIFdl
YnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL2luZGV4LnlhbWw6IEFkZGVkLgorICAgICAg
ICAqIFdlYnNpdGVzL3BlcmYtd2Via2l0LmFwcHNwb3QuY29tL21haW4ucHk6IEFkZGVkLgorICAg
ICAgICAobWFpbik6CisgICAgICAgICogV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5jb20v
bWFuaWZlc3RfaGFuZGxlci5weTogQWRkZWQuCisgICAgICAgIChNYW5pZmVzdEhhbmRsZXIpOgor
ICAgICAgICAoTWFuaWZlc3RIYW5kbGVyLmdldCk6CisgICAgICAgICogV2Vic2l0ZXMvcGVyZi13
ZWJraXQuYXBwc3BvdC5jb20vbW9kZWxzLnB5OiBBZGRlZC4KKyAgICAgICAgKE51bWVyaWNJZEhv
bGRlcik6CisgICAgICAgIChOdW1lcmljSWRIb2xkZXIud2hvc2UpOgorICAgICAgICAoY3JlYXRl
SW5UcmFuc2FjdGlvbldpdGhOdW1lcmljSWRIb2xkZXIpOgorICAgICAgICAobW9kZWxGcm9tTnVt
ZXJpY0lkKToKKyAgICAgICAgKEJyYW5jaCk6CisgICAgICAgIChQbGF0Zm9ybSk6CisgICAgICAg
IChCdWlsZGVyKToKKyAgICAgICAgKEJ1aWxkZXIuYXV0aGVudGljYXRlKToKKyAgICAgICAgKEJ1
aWxkZXIuaGFzaGVkUGFzc3dvcmQpOgorICAgICAgICAoQnVpbGQpOgorICAgICAgICAoVGVzdCk6
CisgICAgICAgIChUZXN0UmVzdWx0KToKKyAgICAgICAgKFJlcG9ydExvZyk6CisgICAgICAgICog
V2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3BvdC5jb20vcmVwb3J0X2hhbmRsZXIucHk6IEFkZGVk
LgorICAgICAgICAoUmVwb3J0SGFuZGxlcik6CisgICAgICAgIChSZXBvcnRIYW5kbGVyLnBvc3Qp
OgorICAgICAgICAoUmVwb3J0SGFuZGxlci5fbW9kZWxCeUtleU5hbWVJbkJvZHlPckVycm9yKToK
KyAgICAgICAgKFJlcG9ydEhhbmRsZXIuX2ludGVnZXJJbkJvZHkpOgorICAgICAgICAoUmVwb3J0
SGFuZGxlci5fdGltZXN0YW1wSW5Cb2R5KToKKyAgICAgICAgKFJlcG9ydEhhbmRsZXIuX291dHB1
dCk6CisgICAgICAgIChSZXBvcnRIYW5kbGVyLl9yZXN1bHRzQXJlVmFsaWQpOgorICAgICAgICAo
UmVwb3J0SGFuZGxlci5fY3JlYXRlQnVpbGRJZlBvc3NpYmxlKToKKyAgICAgICAgKFJlcG9ydEhh
bmRsZXIuX2NyZWF0ZUJ1aWxkSWZQb3NzaWJsZS5leGVjdXRlKToKKyAgICAgICAgKFJlcG9ydEhh
bmRsZXIuX2FkZFRlc3RJZk5lZWRlZCk6CisgICAgICAgIChSZXBvcnRIYW5kbGVyLl9hZGRUZXN0
SWZOZWVkZWQuZXhlY3V0ZSk6CisgICAgICAgICogV2Vic2l0ZXMvcGVyZi13ZWJraXQuYXBwc3Bv
dC5jb20vcnVuc19oYW5kbGVyLnB5OiBBZGRlZC4KKyAgICAgICAgKFJ1bnNIYW5kbGVyKToKKyAg
ICAgICAgKFJ1bnNIYW5kbGVyLmdldCk6CisgICAgICAgICogV2Vic2l0ZXMvcGVyZi13ZWJraXQu
YXBwc3BvdC5jb20vc3RhdGljOiBBZGRlZC4KKyAgICAgICAgKiBXZWJzaXRlcy9wZXJmLXdlYmtp
dC5hcHBzcG90LmNvbS9zdGF0aWMvY3JlYXRlLW1vZGVscy5odG1sOiBBZGRlZC4KKyAgICAgICAg
KiBXZWJzaXRlcy9wZXJmLXdlYmtpdC5hcHBzcG90LmNvbS9zdGF0aWMvbWFudWFsLXN1Ym1pdC5o
dG1sOiBBZGRlZC4KKwogMjAxMi0wMS0yNCAgU2ltb24gSGF1c21hbm4gIDxzaW1vbi5oYXVzbWFu
bkBub2tpYS5jb20+CiAKICAgICAgICAgU29tZSBxbWFrZSBidWlsZCBmaWxlcyBtdXN0IGluY2x1
ZGUgUXQ1J3MgInF1aWNrIiBtb2R1bGUuCkluZGV4OiBXZWJzaXRlcy93ZWJraXQtcGVyZi5hcHBz
cG90LmNvbS9hcHAueWFtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJzaXRlcy93ZWJraXQtcGVyZi5hcHBz
cG90LmNvbS9hcHAueWFtbAkocmV2aXNpb24gMCkKKysrIFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFw
cHNwb3QuY29tL2FwcC55YW1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUwIEBACithcHBsaWNh
dGlvbjogd2Via2l0LXBlcmYKK3ZlcnNpb246IDgKK3J1bnRpbWU6IHB5dGhvbjI3CithcGlfdmVy
c2lvbjogMQordGhyZWFkc2FmZTogZmFsc2UKKworaGFuZGxlcnM6CistIHVybDogL2Zhdmljb25c
LmljbworICBzdGF0aWNfZmlsZXM6IGZhdmljb24uaWNvCisgIHVwbG9hZDogZmF2aWNvblwuaWNv
CisKKy0gdXJsOiAvYWRtaW4vKCguKylcLmh0bWwpCisgIHN0YXRpY19maWxlczogc3RhdGljL1wx
CisgIHVwbG9hZDogc3RhdGljCisgIHNlY3VyZTogYWx3YXlzCisgIGxvZ2luOiBhZG1pbgorCist
IHVybDogLworICBzdGF0aWNfZmlsZXM6IGluZGV4Lmh0bWwKKyAgdXBsb2FkOiBpbmRleC5odG1s
CisKKy0gdXJsOiAvKC4rXC5odG1sKQorICBzdGF0aWNfZmlsZXM6IFwxCisgIHVwbG9hZDogKC4r
XC5odG1sKQorCistIHVybDogL2NzcworICBzdGF0aWNfZGlyOiBjc3MKKworLSB1cmw6IC9qcwor
ICBzdGF0aWNfZGlyOiBqcworCistIHVybDogL2pxCisgIHN0YXRpY19kaXI6IGpxCisKKy0gdXJs
OiAvYXBpL3Rlc3QvcmVwb3J0CisgIHNjcmlwdDogbWFpbi5weQorICBzZWN1cmU6IGFsd2F5cwor
CistIHVybDogL2FkbWluL3JlcG9ydAorICBzY3JpcHQ6IG1haW4ucHkKKyAgc2VjdXJlOiBhbHdh
eXMKKyAgbG9naW46IGFkbWluCisKKy0gdXJsOiAvYXBpL2NyZWF0ZS8oXHcrKQorICBzY3JpcHQ6
IG1haW4ucHkKKyAgc2VjdXJlOiBhbHdheXMKKyAgbG9naW46IGFkbWluCisKKy0gdXJsOiAuKgor
ICBzY3JpcHQ6IG1haW4ucHkKSW5kZXg6IFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFwcHNwb3QuY29t
L2NyZWF0ZV9oYW5kbGVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFw
cHNwb3QuY29tL2NyZWF0ZV9oYW5kbGVyLnB5CShyZXZpc2lvbiAwKQorKysgV2Vic2l0ZXMvd2Vi
a2l0LXBlcmYuYXBwc3BvdC5jb20vY3JlYXRlX2hhbmRsZXIucHkJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsMTE3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEy
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERF
UlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitp
bXBvcnQgd2ViYXBwMgorZnJvbSBnb29nbGUuYXBwZW5naW5lLmV4dCBpbXBvcnQgZGIKKworaW1w
b3J0IGpzb24KKworZnJvbSBtb2RlbHMgaW1wb3J0IEJ1aWxkZXIKK2Zyb20gbW9kZWxzIGltcG9y
dCBCcmFuY2gKK2Zyb20gbW9kZWxzIGltcG9ydCBOdW1lcmljSWRIb2xkZXIKK2Zyb20gbW9kZWxz
IGltcG9ydCBQbGF0Zm9ybQorZnJvbSBtb2RlbHMgaW1wb3J0IGNyZWF0ZUluVHJhbnNhY3Rpb25X
aXRoTnVtZXJpY0lkSG9sZGVyCisKKworY2xhc3MgQ3JlYXRlSGFuZGxlcih3ZWJhcHAyLlJlcXVl
c3RIYW5kbGVyKToKKyAgICBkZWYgcG9zdChzZWxmLCBtb2RlbCk6CisgICAgICAgIHNlbGYucmVz
cG9uc2UuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbjsgY2hhcnNldD11dGYt
OCc7CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGF5bG9hZCA9IGpzb24ubG9hZHMoc2Vs
Zi5yZXF1ZXN0LmJvZHkpCisgICAgICAgICAgICBrZXkgPSBwYXlsb2FkLmdldCgna2V5JywgJycp
CisgICAgICAgICAgICBuYW1lID0gcGF5bG9hZC5nZXQoJ25hbWUnLCAnJykKKyAgICAgICAgICAg
IHBhc3N3b3JkID0gcGF5bG9hZC5nZXQoJ3Bhc3N3b3JkJywgJycpCisgICAgICAgIGV4Y2VwdDoK
KyAgICAgICAgICAgIHNlbGYucmVzcG9uc2Uub3V0LndyaXRlKCJGYWlsZWQgdG8gcGFyc2UgdGhl
IHBheWxvYWQ6ICVzIiAlIHNlbGYucmVxdWVzdC5ib2R5KQorICAgICAgICAgICAgcmV0dXJuCisK
KyAgICAgICAgaWYgbW9kZWwgPT0gJ2J1aWxkZXInOgorICAgICAgICAgICAgZXJyb3IgPSBzZWxm
Ll9jcmVhdGVCdWlsZGVyKG5hbWUsIHBhc3N3b3JkKQorICAgICAgICBlbGlmIG1vZGVsID09ICdi
cmFuY2gnOgorICAgICAgICAgICAgZXJyb3IgPSBzZWxmLl9jcmVhdGVCcmFuY2goa2V5LCBuYW1l
KQorICAgICAgICBlbGlmIG1vZGVsID09ICdwbGF0Zm9ybSc6CisgICAgICAgICAgICBlcnJvciA9
IHNlbGYuX2NyZWF0ZVBsYXRmb3JtKGtleSwgbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAg
ICAgIGVycm9yID0gIlVua25vd24gbW9kZWwgdHlwZTogJXNcbiIgJSBtb2RlbAorCisgICAgICAg
IHNlbGYucmVzcG9uc2Uub3V0LndyaXRlKGVycm9yICsgJ1xuJyBpZiBlcnJvciBlbHNlICdPSycp
CisKKyAgICBkZWYgX2NyZWF0ZUJ1aWxkZXIoc2VsZiwgbmFtZSwgcGFzc3dvcmQpOgorICAgICAg
ICBpZiBub3QgbmFtZSBvciBub3QgcGFzc3dvcmQ6CisgICAgICAgICAgICByZXR1cm4gJ0ludmFs
aWQgbmFtZSBvciBwYXNzd29yZCcKKworICAgICAgICBwYXNzd29yZCA9IEJ1aWxkZXIuaGFzaGVk
UGFzc3dvcmQocGFzc3dvcmQpCisKKyAgICAgICAgZGVmIGV4ZWN1dGUoKToKKyAgICAgICAgICAg
IG1lc3NhZ2UgPSBOb25lCisgICAgICAgICAgICBib3QgPSBCdWlsZGVyLmdldF9ieV9rZXlfbmFt
ZShuYW1lKQorICAgICAgICAgICAgaWYgYm90OgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAn
VXBkYXRpbmcgdGhlIHBhc3N3b3JkIHNpbmNlIGJvdCAiJXMiIGFscmVhZHkgZXhpc3RzJyAlIG5h
bWUKKyAgICAgICAgICAgICAgICBib3QucGFzc3dvcmQgPSBwYXNzd29yZAorICAgICAgICAgICAg
ZWxzZToKKyAgICAgICAgICAgICAgICBib3QgPSBCdWlsZGVyKG5hbWU9bmFtZSwgcGFzc3dvcmQ9
cGFzc3dvcmQsIGtleV9uYW1lPW5hbWUpCisgICAgICAgICAgICBib3QucHV0KCkKKyAgICAgICAg
ICAgIHJldHVybiBtZXNzYWdlCisKKyAgICAgICAgcmV0dXJuIGRiLnJ1bl9pbl90cmFuc2FjdGlv
bihleGVjdXRlKQorCisgICAgZGVmIF9jcmVhdGVCcmFuY2goc2VsZiwga2V5LCBuYW1lKToKKyAg
ICAgICAgaWYgbm90IGtleSBvciBub3QgbmFtZToKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxp
ZCBrZXkgb3IgbmFtZScKKworICAgICAgICBlcnJvciA9IFtOb25lXQorCisgICAgICAgIGRlZiBl
eGVjdXRlKGlkKToKKyAgICAgICAgICAgIGlmIEJyYW5jaC5nZXRfYnlfa2V5X25hbWUoa2V5KToK
KyAgICAgICAgICAgICAgICBlcnJvclswXSA9ICdCcmFuY2ggIiVzIiBhbHJlYWR5IGV4aXN0cycg
JSBrZXkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGJyYW5jaCA9IEJyYW5j
aChpZD1pZCwgbmFtZT1uYW1lLCBrZXlfbmFtZT1rZXkpCisgICAgICAgICAgICBicmFuY2gucHV0
KCkKKyAgICAgICAgICAgIHJldHVybiBicmFuY2gKKworICAgICAgICBjcmVhdGVJblRyYW5zYWN0
aW9uV2l0aE51bWVyaWNJZEhvbGRlcihleGVjdXRlKQorICAgICAgICByZXR1cm4gZXJyb3JbMF0K
KworICAgIGRlZiBfY3JlYXRlUGxhdGZvcm0oc2VsZiwga2V5LCBuYW1lKToKKyAgICAgICAgaWYg
bm90IGtleSBvciBub3QgbmFtZToKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBrZXkgbmFt
ZScKKworICAgICAgICBlcnJvciA9IFtOb25lXQorCisgICAgICAgIGRlZiBleGVjdXRlKGlkKToK
KyAgICAgICAgICAgIGlmIFBsYXRmb3JtLmdldF9ieV9rZXlfbmFtZShrZXkpOgorICAgICAgICAg
ICAgICAgIGVycm9yWzBdID0gJ1BsYXRmb3JtICIlcyIgYWxyZWFkeSBleGlzdHMnICUga2V5Cisg
ICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBwbGF0Zm9ybSA9IFBsYXRmb3JtKGlk
PWlkLCBuYW1lPW5hbWUsIGtleV9uYW1lPWtleSkKKyAgICAgICAgICAgIHBsYXRmb3JtLnB1dCgp
CisgICAgICAgICAgICByZXR1cm4gcGxhdGZvcm0KKworICAgICAgICBjcmVhdGVJblRyYW5zYWN0
aW9uV2l0aE51bWVyaWNJZEhvbGRlcihleGVjdXRlKQorICAgICAgICByZXR1cm4gZXJyb3JbMF0K
SW5kZXg6IFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFwcHNwb3QuY29tL2Rhc2hib2FyZF9oYW5kbGVy
LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFwcHNwb3QuY29tL2Rhc2hi
b2FyZF9oYW5kbGVyLnB5CShyZXZpc2lvbiAwKQorKysgV2Vic2l0ZXMvd2Via2l0LXBlcmYuYXBw
c3BvdC5jb20vZGFzaGJvYXJkX2hhbmRsZXIucHkJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTkg
QEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisj
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCB3ZWJh
cHAyCisKK2ltcG9ydCBqc29uCisKK2Zyb20gbW9kZWxzIGltcG9ydCBCdWlsZGVyCitmcm9tIG1v
ZGVscyBpbXBvcnQgQnJhbmNoCitmcm9tIG1vZGVscyBpbXBvcnQgUGxhdGZvcm0KK2Zyb20gbW9k
ZWxzIGltcG9ydCBUZXN0CisKKworY2xhc3MgRGFzaGJvYXJkSGFuZGxlcih3ZWJhcHAyLlJlcXVl
c3RIYW5kbGVyKToKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICB3ZWJraXRUcnVuayA9IEJy
YW5jaC5nZXRfYnlfa2V5X25hbWUoJ3dlYmtpdC10cnVuaycpCisKKyAgICAgICAgIyBGSVhNRTog
RGV0ZXJtaW5lIHBvcHVsYXIgYnJhbmNoZXMsIHBsYXRmb3JtcywgYW5kIHRlc3RzCisgICAgICAg
IGRhc2hib2FyZCA9IHsKKyAgICAgICAgICAgICdkZWZhdWx0QnJhbmNoJzogJ1dlYktpdCB0cnVu
aycsCisgICAgICAgICAgICAnYnJhbmNoVG9JZCc6IHt3ZWJraXRUcnVuay5uYW1lOiB3ZWJraXRU
cnVuay5pZH0sCisgICAgICAgICAgICAncGxhdGZvcm1Ub0lkJzoge30sCisgICAgICAgICAgICAn
dGVzdFRvSWQnOiB7fSwKKyAgICAgICAgfQorCisgICAgICAgIGZvciBwbGF0Zm9ybSBpbiBQbGF0
Zm9ybS5hbGwoKToKKyAgICAgICAgICAgIGRhc2hib2FyZFsncGxhdGZvcm1Ub0lkJ11bcGxhdGZv
cm0ubmFtZV0gPSBwbGF0Zm9ybS5pZAorCisgICAgICAgIGZvciB0ZXN0IGluIFRlc3QuYWxsKCk6
CisgICAgICAgICAgICBkYXNoYm9hcmRbJ3Rlc3RUb0lkJ11bdGVzdC5uYW1lXSA9IHRlc3QuaWQK
KworICAgICAgICBzZWxmLnJlc3BvbnNlLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxp
Y2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnOworICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53
cml0ZShqc29uLmR1bXBzKGRhc2hib2FyZCkpCkluZGV4OiBXZWJzaXRlcy93ZWJraXQtcGVyZi5h
cHBzcG90LmNvbS9pbmRleC55YW1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3dlYmtpdC1wZXJm
LmFwcHNwb3QuY29tL2luZGV4LnlhbWwJKHJldmlzaW9uIDApCisrKyBXZWJzaXRlcy93ZWJraXQt
cGVyZi5hcHBzcG90LmNvbS9pbmRleC55YW1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExIEBA
CitpbmRleGVzOgorCisjIEFVVE9HRU5FUkFURUQKKworIyBUaGlzIGluZGV4LnlhbWwgaXMgYXV0
b21hdGljYWxseSB1cGRhdGVkIHdoZW5ldmVyIHRoZSBkZXZfYXBwc2VydmVyCisjIGRldGVjdHMg
dGhhdCBhIG5ldyB0eXBlIG9mIHF1ZXJ5IGlzIHJ1bi4gIElmIHlvdSB3YW50IHRvIG1hbmFnZSB0
aGUKKyMgaW5kZXgueWFtbCBmaWxlIG1hbnVhbGx5LCByZW1vdmUgdGhlIGFib3ZlIG1hcmtlciBs
aW5lICh0aGUgbGluZQorIyBzYXlpbmcgIiMgQVVUT0dFTkVSQVRFRCIpLiAgSWYgeW91IHdhbnQg
dG8gbWFuYWdlIHNvbWUgaW5kZXhlcworIyBtYW51YWxseSwgbW92ZSB0aGVtIGFib3ZlIHRoZSBt
YXJrZXIgbGluZS4gIFRoZSBpbmRleC55YW1sIGZpbGUgaXMKKyMgYXV0b21hdGljYWxseSB1cGxv
YWRlZCB0byB0aGUgYWRtaW4gY29uc29sZSB3aGVuIHlvdSBuZXh0IGRlcGxveQorIyB5b3VyIGFw
cGxpY2F0aW9uIHVzaW5nIGFwcGNmZy5weS4KSW5kZXg6IFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFw
cHNwb3QuY29tL21haW4ucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vic2l0ZXMvd2Via2l0LXBlcmYuYXBw
c3BvdC5jb20vbWFpbi5weQkocmV2aXNpb24gMCkKKysrIFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFw
cHNwb3QuY29tL21haW4ucHkJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDYgQEAKKyMhL3Vzci9i
aW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAwNywgMjAxMSBHb29nbGUgSW5jLgorIwor
IyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxp
Y2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5j
ZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vu
c2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIu
MAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGlu
IHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRp
c3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBD
T05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUg
dGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lv
bnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgd2Vi
YXBwMgorZnJvbSBnb29nbGUuYXBwZW5naW5lLmV4dC53ZWJhcHAgaW1wb3J0IHV0aWwKKworaW1w
b3J0IGpzb24KKworZnJvbSBjcmVhdGVfaGFuZGxlciBpbXBvcnQgQ3JlYXRlSGFuZGxlcgorZnJv
bSBkYXNoYm9hcmRfaGFuZGxlciBpbXBvcnQgRGFzaGJvYXJkSGFuZGxlcgorZnJvbSBtYW5pZmVz
dF9oYW5kbGVyIGltcG9ydCBNYW5pZmVzdEhhbmRsZXIKK2Zyb20gcmVwb3J0X2hhbmRsZXIgaW1w
b3J0IFJlcG9ydEhhbmRsZXIKK2Zyb20gcmVwb3J0X2hhbmRsZXIgaW1wb3J0IEFkbWluUmVwb3J0
SGFuZGxlcgorZnJvbSBydW5zX2hhbmRsZXIgaW1wb3J0IFJ1bnNIYW5kbGVyCisKK3JvdXRlcyA9
IFsKKyAgICAoJy9hcGkvY3JlYXRlLyguKiknLCBDcmVhdGVIYW5kbGVyKSwKKyAgICAoJy9hcGkv
dGVzdC8/JywgTWFuaWZlc3RIYW5kbGVyKSwKKyAgICAoJy9hcGkvdGVzdC9yZXBvcnQvPycsIFJl
cG9ydEhhbmRsZXIpLAorICAgICgnL2FkbWluL3JlcG9ydC8/JywgQWRtaW5SZXBvcnRIYW5kbGVy
KSwKKyAgICAoJy9hcGkvdGVzdC9ydW5zLz8nLCBSdW5zSGFuZGxlciksCisgICAgKCcvYXBpL3Rl
c3QvZGFzaGJvYXJkLz8nLCBEYXNoYm9hcmRIYW5kbGVyKSwKK10KKworCitkZWYgbWFpbigpOgor
ICAgIGFwcGxpY2F0aW9uID0gd2ViYXBwMi5XU0dJQXBwbGljYXRpb24ocm91dGVzLCBkZWJ1Zz1U
cnVlKQorICAgIHV0aWwucnVuX3dzZ2lfYXBwKGFwcGxpY2F0aW9uKQorCisKK2lmIF9fbmFtZV9f
ID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCkluZGV4OiBXZWJzaXRlcy93ZWJraXQtcGVyZi5h
cHBzcG90LmNvbS9tYW5pZmVzdF9oYW5kbGVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3dl
YmtpdC1wZXJmLmFwcHNwb3QuY29tL21hbmlmZXN0X2hhbmRsZXIucHkJKHJldmlzaW9uIDApCisr
KyBXZWJzaXRlcy93ZWJraXQtcGVyZi5hcHBzcG90LmNvbS9tYW5pZmVzdF9oYW5kbGVyLnB5CShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29w
eXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorCitpbXBvcnQgd2ViYXBwMgorCitpbXBvcnQganNvbgorCitmcm9tIG1vZGVs
cyBpbXBvcnQgQnVpbGRlcgorZnJvbSBtb2RlbHMgaW1wb3J0IEJyYW5jaAorZnJvbSBtb2RlbHMg
aW1wb3J0IFBsYXRmb3JtCitmcm9tIG1vZGVscyBpbXBvcnQgVGVzdAorCisKK2NsYXNzIE1hbmlm
ZXN0SGFuZGxlcih3ZWJhcHAyLlJlcXVlc3RIYW5kbGVyKToKKyAgICBkZWYgZ2V0KHNlbGYpOgor
ICAgICAgICBzZWxmLnJlc3BvbnNlLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxh
aW47IGNoYXJzZXQ9dXRmLTgnOworICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZSgneyJ0
ZXN0TWFwIjonKQorCisgICAgICAgIHRlc3RNYXAgPSB7fQorICAgICAgICBwbGF0Zm9ybUlkTWFw
ID0ge30KKyAgICAgICAgYnJhbmNoSWRNYXAgPSB7fQorICAgICAgICBmb3IgdGVzdCBpbiBUZXN0
LmFsbCgpOgorICAgICAgICAgICAgYnJhbmNoSWRzID0gW0JyYW5jaC5nZXQoYnJhbmNoS2V5KS5p
ZCBmb3IgYnJhbmNoS2V5IGluIHRlc3QuYnJhbmNoZXNdCisgICAgICAgICAgICBwbGF0Zm9ybUlk
cyA9IFtQbGF0Zm9ybS5nZXQocGxhdGZvcm1LZXkpLmlkIGZvciBwbGF0Zm9ybUtleSBpbiB0ZXN0
LnBsYXRmb3Jtc10KKyAgICAgICAgICAgIHRlc3RNYXBbdGVzdC5pZF0gPSB7CisgICAgICAgICAg
ICAgICAgJ25hbWUnOiB0ZXN0Lm5hbWUsCisgICAgICAgICAgICAgICAgJ2JyYW5jaElkcyc6IGJy
YW5jaElkcywKKyAgICAgICAgICAgICAgICAncGxhdGZvcm1JZHMnOiBwbGF0Zm9ybUlkcywKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIHBsYXRmb3JtSWQgaW4gcGxhdGZvcm1JZHM6
CisgICAgICAgICAgICAgICAgcGxhdGZvcm1JZE1hcC5zZXRkZWZhdWx0KHBsYXRmb3JtSWQsIHsn
dGVzdHMnOiBbXSwgJ2JyYW5jaGVzJzogW119KQorICAgICAgICAgICAgICAgIHBsYXRmb3JtSWRN
YXBbcGxhdGZvcm1JZF1bJ3Rlc3RzJ10uYXBwZW5kKHRlc3QuaWQpCisgICAgICAgICAgICAgICAg
cGxhdGZvcm1JZE1hcFtwbGF0Zm9ybUlkXVsnYnJhbmNoZXMnXSArPSBicmFuY2hJZHMKKworICAg
ICAgICAgICAgZm9yIGJyYW5jaElkIGluIGJyYW5jaElkczoKKyAgICAgICAgICAgICAgICBicmFu
Y2hJZE1hcC5zZXRkZWZhdWx0KGJyYW5jaElkLCB7J3Rlc3RzJzogW10sICdwbGF0Zm9ybXMnOiBb
XX0pCisgICAgICAgICAgICAgICAgYnJhbmNoSWRNYXBbYnJhbmNoSWRdWyd0ZXN0cyddLmFwcGVu
ZCh0ZXN0LmlkKQorICAgICAgICAgICAgICAgIGJyYW5jaElkTWFwW2JyYW5jaElkXVsncGxhdGZv
cm1zJ10gKz0gcGxhdGZvcm1JZHMKKworICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZShq
c29uLmR1bXBzKHRlc3RNYXApKQorICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZSgnLCJw
bGF0Zm9ybU1hcCI6JykKKworICAgICAgICBwbGF0Zm9ybU1hcCA9IHt9CisgICAgICAgIGZvciBw
bGF0Zm9ybSBpbiBQbGF0Zm9ybS5hbGwoKToKKyAgICAgICAgICAgIGlmIHBsYXRmb3JtLmlkIG5v
dCBpbiBwbGF0Zm9ybUlkTWFwOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAg
ICBwbGF0Zm9ybU1hcFtwbGF0Zm9ybS5pZF0gPSB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiBw
bGF0Zm9ybS5uYW1lLAorICAgICAgICAgICAgICAgICd0ZXN0SWRzJzogbGlzdChzZXQocGxhdGZv
cm1JZE1hcFtwbGF0Zm9ybS5pZF1bJ3Rlc3RzJ10pKSwKKyAgICAgICAgICAgICAgICAnYnJhbmNo
SWRzJzogbGlzdChzZXQocGxhdGZvcm1JZE1hcFtwbGF0Zm9ybS5pZF1bJ2JyYW5jaGVzJ10pKSwK
KyAgICAgICAgICAgIH0KKworICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZShqc29uLmR1
bXBzKHBsYXRmb3JtTWFwKSkKKyAgICAgICAgc2VsZi5yZXNwb25zZS5vdXQud3JpdGUoJywiYnJh
bmNoTWFwIjonKQorCisgICAgICAgIGJyYW5jaE1hcCA9IHt9CisgICAgICAgIGZvciBicmFuY2gg
aW4gQnJhbmNoLmFsbCgpOgorICAgICAgICAgICAgaWYgYnJhbmNoLmlkIG5vdCBpbiBicmFuY2hJ
ZE1hcDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgYnJhbmNoTWFwW2Jy
YW5jaC5pZF0gPSB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiBicmFuY2gubmFtZSwKKyAgICAg
ICAgICAgICAgICAndGVzdElkcyc6IGxpc3Qoc2V0KGJyYW5jaElkTWFwW2JyYW5jaC5pZF1bJ3Rl
c3RzJ10pKSwKKyAgICAgICAgICAgICAgICAncGxhdGZvcm1JZHMnOiBsaXN0KHNldChicmFuY2hJ
ZE1hcFticmFuY2guaWRdWydwbGF0Zm9ybXMnXSkpLAorICAgICAgICAgICAgfQorCisgICAgICAg
IHNlbGYucmVzcG9uc2Uub3V0LndyaXRlKGpzb24uZHVtcHMoYnJhbmNoTWFwKSkKKyAgICAgICAg
c2VsZi5yZXNwb25zZS5vdXQud3JpdGUoJ30nKQpJbmRleDogV2Vic2l0ZXMvd2Via2l0LXBlcmYu
YXBwc3BvdC5jb20vbW9kZWxzLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3dlYmtpdC1wZXJm
LmFwcHNwb3QuY29tL21vZGVscy5weQkocmV2aXNpb24gMCkKKysrIFdlYnNpdGVzL3dlYmtpdC1w
ZXJmLmFwcHNwb3QuY29tL21vZGVscy5weQkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMTIgQEAK
KyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMg
bWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
IyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05F
UiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBoYXNobGli
CitpbXBvcnQgcmUKKworZnJvbSBnb29nbGUuYXBwZW5naW5lLmV4dCBpbXBvcnQgZGIKKworCitj
bGFzcyBOdW1lcmljSWRIb2xkZXIoZGIuTW9kZWwpOgorICAgIG93bmVyID0gZGIuUmVmZXJlbmNl
UHJvcGVydHkoKQorICAgICMgRHVtbXkgY2xhc3Mgd2hvc2Ugc29sZSBwdXJwb3NlIGlzIHRvIGdl
bmVyYXRlIGtleSgpLmlkKCkKKworCitkZWYgY3JlYXRlSW5UcmFuc2FjdGlvbldpdGhOdW1lcmlj
SWRIb2xkZXIoY2FsbGJhY2spOgorICAgIGlkSG9sZGVyID0gTnVtZXJpY0lkSG9sZGVyKCkKKyAg
ICBpZEhvbGRlci5wdXQoKQorICAgIGlkSG9sZGVyID0gTnVtZXJpY0lkSG9sZGVyLmdldChpZEhv
bGRlci5rZXkoKSkKKyAgICBvd25lciA9IGRiLnJ1bl9pbl90cmFuc2FjdGlvbihjYWxsYmFjaywg
aWRIb2xkZXIua2V5KCkuaWQoKSkKKyAgICBpZiBvd25lcjoKKyAgICAgICAgaWRIb2xkZXIub3du
ZXIgPSBvd25lcgorICAgICAgICBpZEhvbGRlci5wdXQoKQorICAgIGVsc2U6CisgICAgICAgIGlk
SG9sZGVyLmRlbGV0ZSgpCisgICAgcmV0dXJuIG93bmVyCisKKworZGVmIG1vZGVsRnJvbU51bWVy
aWNJZChpZCwgZXhwZWN0ZWRLaW5kKToKKyAgICBpZEhvbGRlciA9IE51bWVyaWNJZEhvbGRlci5n
ZXRfYnlfaWQoaWQpCisgICAgcmV0dXJuIGlkSG9sZGVyLm93bmVyIGlmIGlkSG9sZGVyIGFuZCBp
ZEhvbGRlci5vd25lciBhbmQgaXNpbnN0YW5jZShpZEhvbGRlci5vd25lciwgZXhwZWN0ZWRLaW5k
KSBlbHNlIE5vbmUKKworCitjbGFzcyBCcmFuY2goZGIuTW9kZWwpOgorICAgIGlkID0gZGIuSW50
ZWdlclByb3BlcnR5KHJlcXVpcmVkPVRydWUpCisgICAgbmFtZSA9IGRiLlN0cmluZ1Byb3BlcnR5
KHJlcXVpcmVkPVRydWUpCisKKworY2xhc3MgUGxhdGZvcm0oZGIuTW9kZWwpOgorICAgIGlkID0g
ZGIuSW50ZWdlclByb3BlcnR5KHJlcXVpcmVkPVRydWUpCisgICAgbmFtZSA9IGRiLlN0cmluZ1By
b3BlcnR5KHJlcXVpcmVkPVRydWUpCisKKworY2xhc3MgQnVpbGRlcihkYi5Nb2RlbCk6CisgICAg
bmFtZSA9IGRiLlN0cmluZ1Byb3BlcnR5KHJlcXVpcmVkPVRydWUpCisgICAgcGFzc3dvcmQgPSBk
Yi5TdHJpbmdQcm9wZXJ0eShyZXF1aXJlZD1UcnVlKQorCisgICAgZGVmIGF1dGhlbnRpY2F0ZShz
ZWxmLCByYXdQYXNzd29yZCk6CisgICAgICAgIHJldHVybiBzZWxmLnBhc3N3b3JkID09IGhhc2hs
aWIuc2hhMjU2KHJhd1Bhc3N3b3JkKS5oZXhkaWdlc3QoKQorCisgICAgQHN0YXRpY21ldGhvZAor
ICAgIGRlZiBoYXNoZWRQYXNzd29yZChyYXdQYXNzd29yZCk6CisgICAgICAgIHJldHVybiBoYXNo
bGliLnNoYTI1NihyYXdQYXNzd29yZCkuaGV4ZGlnZXN0KCkKKworCitjbGFzcyBCdWlsZChkYi5N
b2RlbCk6CisgICAgYnJhbmNoID0gZGIuUmVmZXJlbmNlUHJvcGVydHkoQnJhbmNoLCByZXF1aXJl
ZD1UcnVlLCBjb2xsZWN0aW9uX25hbWU9J2J1aWxkX2JyYW5jaCcpCisgICAgcGxhdGZvcm0gPSBk
Yi5SZWZlcmVuY2VQcm9wZXJ0eShQbGF0Zm9ybSwgcmVxdWlyZWQ9VHJ1ZSwgY29sbGVjdGlvbl9u
YW1lPSdidWlsZF9wbGF0Zm9ybScpCisgICAgYnVpbGRlciA9IGRiLlJlZmVyZW5jZVByb3BlcnR5
KEJ1aWxkZXIsIHJlcXVpcmVkPVRydWUsIGNvbGxlY3Rpb25fbmFtZT0nYnVpbGRlcl9rZXknKQor
ICAgIGJ1aWxkTnVtYmVyID0gZGIuSW50ZWdlclByb3BlcnR5KHJlcXVpcmVkPVRydWUpCisgICAg
cmV2aXNpb24gPSBkYi5JbnRlZ2VyUHJvcGVydHkocmVxdWlyZWQ9VHJ1ZSkKKyAgICB0aW1lc3Rh
bXAgPSBkYi5EYXRlVGltZVByb3BlcnR5KHJlcXVpcmVkPVRydWUpCisKKworIyBVc2VkIHRvIGdl
bmVyYXRlIFRlc3RNYXAgaW4gdGhlIG1hbmlmZXN0IGVmZmljaWVudGx5CitjbGFzcyBUZXN0KGRi
Lk1vZGVsKToKKyAgICBpZCA9IGRiLkludGVnZXJQcm9wZXJ0eShyZXF1aXJlZD1UcnVlKQorICAg
IG5hbWUgPSBkYi5TdHJpbmdQcm9wZXJ0eShyZXF1aXJlZD1UcnVlKQorICAgIGJyYW5jaGVzID0g
ZGIuTGlzdFByb3BlcnR5KGRiLktleSkKKyAgICBwbGF0Zm9ybXMgPSBkYi5MaXN0UHJvcGVydHko
ZGIuS2V5KQorCisKK2NsYXNzIFRlc3RSZXN1bHQoZGIuTW9kZWwpOgorICAgIG5hbWUgPSBkYi5T
dHJpbmdQcm9wZXJ0eShyZXF1aXJlZD1UcnVlKQorICAgIGJ1aWxkID0gZGIuUmVmZXJlbmNlUHJv
cGVydHkoQnVpbGQsIHJlcXVpcmVkPVRydWUpCisgICAgdmFsdWUgPSBkYi5GbG9hdFByb3BlcnR5
KHJlcXVpcmVkPVRydWUpCisgICAgdmFsdWVNZWRpYW4gPSBkYi5GbG9hdFByb3BlcnR5KCkKKyAg
ICB2YWx1ZVN0ZGV2ID0gZGIuRmxvYXRQcm9wZXJ0eSgpCisgICAgdmFsdWVNaW4gPSBkYi5GbG9h
dFByb3BlcnR5KCkKKyAgICB2YWx1ZU1heCA9IGRiLkZsb2F0UHJvcGVydHkoKQorCisKKyMgVGVt
cG9yYXJpbHkgbG9nIHJlcG9ydHMgc2VudCBieSBib3RzCitjbGFzcyBSZXBvcnRMb2coZGIuTW9k
ZWwpOgorICAgIHRpbWVzdGFtcCA9IGRiLkRhdGVUaW1lUHJvcGVydHkocmVxdWlyZWQ9VHJ1ZSkK
KyAgICBoZWFkZXJzID0gZGIuVGV4dFByb3BlcnR5KCkKKyAgICBwYXlsb2FkID0gZGIuVGV4dFBy
b3BlcnR5KCkKSW5kZXg6IFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFwcHNwb3QuY29tL3JlcG9ydF9o
YW5kbGVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFwcHNwb3QuY29t
L3JlcG9ydF9oYW5kbGVyLnB5CShyZXZpc2lvbiAwKQorKysgV2Vic2l0ZXMvd2Via2l0LXBlcmYu
YXBwc3BvdC5jb20vcmVwb3J0X2hhbmRsZXIucHkJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTg0
IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMg
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
IyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgd2Vi
YXBwMgorZnJvbSBnb29nbGUuYXBwZW5naW5lLmV4dCBpbXBvcnQgZGIKKworaW1wb3J0IGpzb24K
K2ltcG9ydCByZQoraW1wb3J0IHRpbWUKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCisK
K2Zyb20gbW9kZWxzIGltcG9ydCBCdWlsZGVyCitmcm9tIG1vZGVscyBpbXBvcnQgQnJhbmNoCitm
cm9tIG1vZGVscyBpbXBvcnQgQnVpbGQKK2Zyb20gbW9kZWxzIGltcG9ydCBOdW1lcmljSWRIb2xk
ZXIKK2Zyb20gbW9kZWxzIGltcG9ydCBQbGF0Zm9ybQorZnJvbSBtb2RlbHMgaW1wb3J0IFJlcG9y
dExvZworZnJvbSBtb2RlbHMgaW1wb3J0IFRlc3QKK2Zyb20gbW9kZWxzIGltcG9ydCBUZXN0UmVz
dWx0Citmcm9tIG1vZGVscyBpbXBvcnQgY3JlYXRlSW5UcmFuc2FjdGlvbldpdGhOdW1lcmljSWRI
b2xkZXIKKworCitjbGFzcyBSZXBvcnRIYW5kbGVyKHdlYmFwcDIuUmVxdWVzdEhhbmRsZXIpOgor
ICAgIGRlZiBwb3N0KHNlbGYpOgorICAgICAgICBzZWxmLnJlc3BvbnNlLmhlYWRlcnNbJ0NvbnRl
bnQtVHlwZSddID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnCisKKyAgICAgICAgaGVhZGVy
cyA9ICJcbiIuam9pbihba2V5ICsgJzogJyArIHZhbHVlIGZvciBrZXksIHZhbHVlIGluIHNlbGYu
cmVxdWVzdC5oZWFkZXJzLml0ZW1zKCldKQorCisgICAgICAgICMgRG8gYXMgYmVzdCBhcyB3ZSBj
YW4gdG8gcmVtb3ZlIHRoZSBwYXNzd29yZAorICAgICAgICByZXF1ZXN0X2JvZHlfd2l0aG91dF9w
YXNzd29yZCA9IHJlLnN1YihyJyJwYXNzd29yZCJccyo6XHMqIi4rPyIsJywgJycsIHNlbGYucmVx
dWVzdC5ib2R5KQorICAgICAgICBsb2cgPSBSZXBvcnRMb2codGltZXN0YW1wPWRhdGV0aW1lLm5v
dygpLCBoZWFkZXJzPWhlYWRlcnMsIHBheWxvYWQ9cmVxdWVzdF9ib2R5X3dpdGhvdXRfcGFzc3dv
cmQpCisgICAgICAgIGxvZy5wdXQoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYu
X2JvZHkgPSBqc29uLmxvYWRzKHNlbGYucmVxdWVzdC5ib2R5KQorICAgICAgICBleGNlcHQgVmFs
dWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9vdXRwdXQoJ0ZhaWxlZCB0byBwYXJz
ZSB0aGUgcGF5bG9hZCBhcyBhIGpzb24uIFJlcG9ydCBrZXk6ICVkJyAlIGxvZy5rZXkoKS5pZCgp
KQorCisgICAgICAgIGJ1aWxkZXIgPSBzZWxmLl9tb2RlbEJ5S2V5TmFtZUluQm9keU9yRXJyb3Io
QnVpbGRlciwgJ2J1aWxkZXItbmFtZScpCisgICAgICAgIGJyYW5jaCA9IHNlbGYuX21vZGVsQnlL
ZXlOYW1lSW5Cb2R5T3JFcnJvcihCcmFuY2gsICdicmFuY2gnKQorICAgICAgICBwbGF0Zm9ybSA9
IHNlbGYuX21vZGVsQnlLZXlOYW1lSW5Cb2R5T3JFcnJvcihQbGF0Zm9ybSwgJ3BsYXRmb3JtJykK
KyAgICAgICAgYnVpbGROdW1iZXIgPSBzZWxmLl9pbnRlZ2VySW5Cb2R5KCdidWlsZC1udW1iZXIn
KQorICAgICAgICByZXZpc2lvbiA9IHNlbGYuX2ludGVnZXJJbkJvZHkoJ3JldmlzaW9uJykKKyAg
ICAgICAgdGltZXN0YW1wID0gc2VsZi5fdGltZXN0YW1wSW5Cb2R5KCkKKworICAgICAgICBmYWls
ZWQgPSBGYWxzZQorICAgICAgICBpZiBidWlsZGVyIGFuZCBub3QgKHNlbGYuYnlwYXNzQXV0aGVu
dGljYXRpb24oKSBvciBidWlsZGVyLmF1dGhlbnRpY2F0ZShzZWxmLl9ib2R5LmdldCgncGFzc3dv
cmQnLCAnJykpKToKKyAgICAgICAgICAgIHNlbGYuX291dHB1dCgnQXV0aGVudGljYXRpb24gZmFp
bGVkJykKKyAgICAgICAgICAgIGZhaWxlZCA9IFRydWUKKworICAgICAgICBpZiBub3Qgc2VsZi5f
cmVzdWx0c0FyZVZhbGlkKCk6CisgICAgICAgICAgICBzZWxmLl9vdXRwdXQoIlRoZSBwYXlsb2Fk
IGRvZXNuJ3QgY29udGFpbiByZXN1bHRzIG9yIHJlc3VsdHMgYXJlIG1hbGZvcm1lZCIpCisgICAg
ICAgICAgICBmYWlsZWQgPSBUcnVlCisKKyAgICAgICAgaWYgbm90IChidWlsZGVyIGFuZCBicmFu
Y2ggYW5kIHBsYXRmb3JtIGFuZCBidWlsZE51bWJlciBhbmQgcmV2aXNpb24gYW5kIHRpbWVzdGFt
cCkgb3IgZmFpbGVkOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgYnVpbGQgPSBzZWxm
Ll9jcmVhdGVCdWlsZElmUG9zc2libGUoYnVpbGRlciwgYnVpbGROdW1iZXIsIGJyYW5jaCwgcGxh
dGZvcm0sIHJldmlzaW9uLCB0aW1lc3RhbXApCisgICAgICAgIGlmIG5vdCBidWlsZDoKKyAgICAg
ICAgICAgIHJldHVybgorCisgICAgICAgIGZvciB0ZXN0LCByZXN1bHQgaW4gc2VsZi5fYm9keVsn
cmVzdWx0cyddLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5fYWRkVGVzdElmTmVlZGVk
KHRlc3QsIGJyYW5jaCwgcGxhdGZvcm0pCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3Vs
dCwgZGljdCk6CisgICAgICAgICAgICAgICAgVGVzdFJlc3VsdChuYW1lPXRlc3QsIGJ1aWxkPWJ1
aWxkLCB2YWx1ZT1mbG9hdChyZXN1bHQuZ2V0KCdhdmcnLCAwKSksIHZhbHVlTWVkaWFuPWZsb2F0
KHJlc3VsdC5nZXQoJ21lZGlhbicsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVTdGRl
dj1mbG9hdChyZXN1bHQuZ2V0KCdzdGRldicsIDApKSwgdmFsdWVNaW49ZmxvYXQocmVzdWx0Lmdl
dCgnbWluJywgMCkpLCB2YWx1ZU1heD1mbG9hdChyZXN1bHQuZ2V0KCdtYXgnLCAwKSkpLnB1dCgp
CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFRlc3RSZXN1bHQobmFtZT10ZXN0
LCBidWlsZD1idWlsZCwgdmFsdWU9ZmxvYXQocmVzdWx0KSkucHV0KCkKKworICAgICAgICBsb2cg
PSBSZXBvcnRMb2cuZ2V0KGxvZy5rZXkoKSkKKyAgICAgICAgbG9nLmRlbGV0ZSgpCisKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX291dHB1dCgnT0snKQorCisgICAgZGVmIF9tb2RlbEJ5S2V5TmFtZUlu
Qm9keU9yRXJyb3Ioc2VsZiwgbW9kZWwsIGtleU5hbWUpOgorICAgICAgICBrZXkgPSBzZWxmLl9i
b2R5LmdldChrZXlOYW1lLCAnJykKKyAgICAgICAgaW5zdGFuY2UgPSBrZXkgYW5kIG1vZGVsLmdl
dF9ieV9rZXlfbmFtZShrZXkpCisgICAgICAgIGlmIG5vdCBpbnN0YW5jZToKKyAgICAgICAgICAg
IHNlbGYuX291dHB1dCgnVGhlcmUgYXJlIG5vICVzIG5hbWVkICIlcyInICUgKG1vZGVsLl9fbmFt
ZV9fLmxvd2VyKCksIGtleSkpCisgICAgICAgIHJldHVybiBpbnN0YW5jZQorCisgICAgZGVmIF9p
bnRlZ2VySW5Cb2R5KHNlbGYsIGtleSk6CisgICAgICAgIHZhbHVlID0gc2VsZi5fYm9keS5nZXQo
a2V5LCAnJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGludCh2YWx1ZSkKKyAg
ICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX291dHB1dCgnSW52YWxpZCAl
czogIiVzIicgJSAoa2V5LnJlcGxhY2UoJy0nLCAnICcpLCB2YWx1ZSkpCisKKyAgICBkZWYgX3Rp
bWVzdGFtcEluQm9keShzZWxmKToKKyAgICAgICAgdmFsdWUgPSBzZWxmLl9ib2R5LmdldCgndGlt
ZXN0YW1wJywgJycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5m
cm9tdGltZXN0YW1wKGludCh2YWx1ZSkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJl
dHVybiBzZWxmLl9vdXRwdXQoJ0ZhaWxlZCB0byBwYXJzZSB0aGUgdGltZXN0YW1wOiAlcycgJSB2
YWx1ZSkKKworICAgIGRlZiBfb3V0cHV0KHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLnJl
c3BvbnNlLm91dC53cml0ZShtZXNzYWdlICsgJ1xuJykKKworICAgIGRlZiBieXBhc3NBdXRoZW50
aWNhdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX3Jlc3VsdHNB
cmVWYWxpZChzZWxmKToKKworICAgICAgICBkZWYgX2lzRmxvYXRDb252ZXJ0aWJsZSh2YWx1ZSk6
CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmxvYXQodmFsdWUpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAg
ICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgJ3Jlc3VsdHMnIG5vdCBpbiBz
ZWxmLl9ib2R5IG9yIG5vdCBpc2luc3RhbmNlKHNlbGYuX2JvZHlbJ3Jlc3VsdHMnXSwgZGljdCk6
CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBmb3IgdGVzdFJlc3VsdCBpbiBz
ZWxmLl9ib2R5WydyZXN1bHRzJ10udmFsdWVzKCk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNl
KHRlc3RSZXN1bHQsIGRpY3QpOgorICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB0ZXN0UmVz
dWx0LnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgX2lzRmxvYXRDb252ZXJ0
aWJsZSh2YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAg
ICAgICAgICAgICBpZiAnYXZnJyBub3QgaW4gdGVzdFJlc3VsdDoKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlm
IG5vdCBfaXNGbG9hdENvbnZlcnRpYmxlKHRlc3RSZXN1bHQpOgorICAgICAgICAgICAgICAgIHJl
dHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX2NyZWF0ZUJ1aWxk
SWZQb3NzaWJsZShzZWxmLCBidWlsZGVyLCBidWlsZE51bWJlciwgYnJhbmNoLCBwbGF0Zm9ybSwg
cmV2aXNpb24sIHRpbWVzdGFtcCk6CisgICAgICAgIGtleV9uYW1lID0gYnVpbGRlci5uYW1lICsg
JzonICsgc3RyKGludCh0aW1lLm1rdGltZSh0aW1lc3RhbXAudGltZXR1cGxlKCkpKSkKKworICAg
ICAgICBkZWYgZXhlY3V0ZSgpOgorICAgICAgICAgICAgYnVpbGQgPSBCdWlsZC5nZXRfYnlfa2V5
X25hbWUoa2V5X25hbWUpCisgICAgICAgICAgICBpZiBidWlsZDoKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gc2VsZi5fb3V0cHV0KCdUaGUgYnVpbGQgYXQgJXMgYWxyZWFkeSBleGlzdHMgZm9yICVz
JyAlIChzdHIodGltZXN0YW1wKSwgYnVpbGRlci5uYW1lKSkKKworICAgICAgICAgICAgcmV0dXJu
IEJ1aWxkKGJyYW5jaD1icmFuY2gsIHBsYXRmb3JtPXBsYXRmb3JtLCBidWlsZGVyPWJ1aWxkZXIs
IGJ1aWxkTnVtYmVyPWJ1aWxkTnVtYmVyLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcD10aW1l
c3RhbXAsIHJldmlzaW9uPXJldmlzaW9uLCBrZXlfbmFtZT1rZXlfbmFtZSkucHV0KCkKKyAgICAg
ICAgcmV0dXJuIGRiLnJ1bl9pbl90cmFuc2FjdGlvbihleGVjdXRlKQorCisgICAgZGVmIF9hZGRU
ZXN0SWZOZWVkZWQoc2VsZiwgdGVzdE5hbWUsIGJyYW5jaCwgcGxhdGZvcm0pOgorCisgICAgICAg
IGRlZiBleGVjdXRlKGlkKToKKyAgICAgICAgICAgIHRlc3QgPSBUZXN0LmdldF9ieV9rZXlfbmFt
ZSh0ZXN0TmFtZSkKKyAgICAgICAgICAgIHJldHVyblZhbHVlID0gTm9uZQorICAgICAgICAgICAg
aWYgbm90IHRlc3Q6CisgICAgICAgICAgICAgICAgdGVzdCA9IFRlc3QoaWQ9aWQsIG5hbWU9dGVz
dE5hbWUsIGtleV9uYW1lPXRlc3ROYW1lKQorICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0g
dGVzdAorICAgICAgICAgICAgaWYgYnJhbmNoLmtleSgpIG5vdCBpbiB0ZXN0LmJyYW5jaGVzOgor
ICAgICAgICAgICAgICAgIHRlc3QuYnJhbmNoZXMuYXBwZW5kKGJyYW5jaC5rZXkoKSkKKyAgICAg
ICAgICAgIGlmIHBsYXRmb3JtLmtleSgpIG5vdCBpbiB0ZXN0LnBsYXRmb3JtczoKKyAgICAgICAg
ICAgICAgICB0ZXN0LnBsYXRmb3Jtcy5hcHBlbmQocGxhdGZvcm0ua2V5KCkpCisgICAgICAgICAg
ICB0ZXN0LnB1dCgpCisgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWUKKyAgICAgICAgY3Jl
YXRlSW5UcmFuc2FjdGlvbldpdGhOdW1lcmljSWRIb2xkZXIoZXhlY3V0ZSkKKworCitjbGFzcyBB
ZG1pblJlcG9ydEhhbmRsZXIoUmVwb3J0SGFuZGxlcik6CisgICAgZGVmIGJ5cGFzc0F1dGhlbnRp
Y2F0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQpJbmRleDogV2Vic2l0ZXMvd2Via2l0
LXBlcmYuYXBwc3BvdC5jb20vcnVuc19oYW5kbGVyLnB5Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVz
L3dlYmtpdC1wZXJmLmFwcHNwb3QuY29tL3J1bnNfaGFuZGxlci5weQkocmV2aXNpb24gMCkKKysr
IFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFwcHNwb3QuY29tL3J1bnNfaGFuZGxlci5weQkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw5NCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdo
dCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMg
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKworaW1wb3J0IHdlYmFwcDIKKworaW1wb3J0IGpzb24KK2Zyb20gdGltZSBpbXBvcnQg
bWt0aW1lCitmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQorCitmcm9tIG1vZGVscyBpbXBv
cnQgQnVpbGQKK2Zyb20gbW9kZWxzIGltcG9ydCBCdWlsZGVyCitmcm9tIG1vZGVscyBpbXBvcnQg
QnJhbmNoCitmcm9tIG1vZGVscyBpbXBvcnQgTnVtZXJpY0lkSG9sZGVyCitmcm9tIG1vZGVscyBp
bXBvcnQgUGxhdGZvcm0KK2Zyb20gbW9kZWxzIGltcG9ydCBUZXN0Citmcm9tIG1vZGVscyBpbXBv
cnQgVGVzdFJlc3VsdAorZnJvbSBtb2RlbHMgaW1wb3J0IG1vZGVsRnJvbU51bWVyaWNJZAorCisK
K2NsYXNzIFJ1bnNIYW5kbGVyKHdlYmFwcDIuUmVxdWVzdEhhbmRsZXIpOgorICAgIGRlZiBnZXQo
c2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3RJZCA9IGludChzZWxmLnJlcXVl
c3QuZ2V0KCdpZCcsIDApKQorICAgICAgICAgICAgYnJhbmNoSWQgPSBpbnQoc2VsZi5yZXF1ZXN0
LmdldCgnYnJhbmNoaWQnLCAwKSkKKyAgICAgICAgICAgIHBsYXRmb3JtSWQgPSBpbnQoc2VsZi5y
ZXF1ZXN0LmdldCgncGxhdGZvcm1pZCcsIDApKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgor
ICAgICAgICAgICAgIyBGSVhNRTogT3V0cHV0IGFuIGVycm9yIGhlcmUKKyAgICAgICAgICAgIHRl
c3RJZCA9IDAKKyAgICAgICAgICAgIGJyYW5jaElkID0gMAorICAgICAgICAgICAgcGxhdGZvcm1J
ZCA9IDAKKworICAgICAgICAjIEZJWE1FOiBKdXN0IGZldGNoIGJ1aWxkcyBzcGVjaWZpZWQgYnkg
ImRheXMiCisgICAgICAgICMgZGF5cyA9IHNlbGYucmVxdWVzdC5nZXQoJ2RheXMnLCAzNjUpCisK
KyAgICAgICAgYnVpbGRzID0gQnVpbGQuYWxsKCkKKyAgICAgICAgYnVpbGRzLmZpbHRlcignYnJh
bmNoID0nLCBtb2RlbEZyb21OdW1lcmljSWQoYnJhbmNoSWQsIEJyYW5jaCkpCisgICAgICAgIGJ1
aWxkcy5maWx0ZXIoJ3BsYXRmb3JtID0nLCBtb2RlbEZyb21OdW1lcmljSWQocGxhdGZvcm1JZCwg
UGxhdGZvcm0pKQorCisgICAgICAgIHRlc3QgPSBtb2RlbEZyb21OdW1lcmljSWQodGVzdElkLCBU
ZXN0KQorICAgICAgICB0ZXN0TmFtZSA9IHRlc3QubmFtZSBpZiB0ZXN0IGVsc2UgTm9uZQorICAg
ICAgICB0ZXN0X3J1bnMgPSBbXQorICAgICAgICBhdmVyYWdlcyA9IHt9CisgICAgICAgIHZhbHVl
cyA9IFtdCisgICAgICAgIHRpbWVzdGFtcHMgPSBbXQorCisgICAgICAgIGZvciBidWlsZCBpbiBi
dWlsZHM6CisgICAgICAgICAgICByZXN1bHRzID0gVGVzdFJlc3VsdC5hbGwoKQorICAgICAgICAg
ICAgcmVzdWx0cy5maWx0ZXIoJ25hbWUgPScsIHRlc3ROYW1lKQorICAgICAgICAgICAgcmVzdWx0
cy5maWx0ZXIoJ2J1aWxkID0nLCBidWlsZCkKKyAgICAgICAgICAgIGZvciByZXN1bHQgaW4gcmVz
dWx0czoKKyAgICAgICAgICAgICAgICBidWlsZGVySWQgPSBidWlsZC5idWlsZGVyLmtleSgpLmlk
KCkKKyAgICAgICAgICAgICAgICBwb3NpeFRpbWVzdGFtcCA9IG1rdGltZShidWlsZC50aW1lc3Rh
bXAudGltZXR1cGxlKCkpCisgICAgICAgICAgICAgICAgdGVzdF9ydW5zLmFwcGVuZChbcmVzdWx0
LmtleSgpLmlkKCksCisgICAgICAgICAgICAgICAgICAgIFtidWlsZC5rZXkoKS5pZCgpLCBidWls
ZC5idWlsZE51bWJlciwgYnVpbGQucmV2aXNpb25dLAorICAgICAgICAgICAgICAgICAgICBwb3Np
eFRpbWVzdGFtcCwgcmVzdWx0LnZhbHVlLCAwLCBbXSwgYnVpbGRlcklkXSkKKyAgICAgICAgICAg
ICAgICAjIEZJWE1FOiBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2U7IGluIHByYWN0aWNlLCB3ZSB3b3Vs
ZG4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgdmFsdWUgZm9yIGEgZ2l2ZW4gcmV2aXNpb24KKyAgICAg
ICAgICAgICAgICBhdmVyYWdlc1tidWlsZC5yZXZpc2lvbl0gPSByZXN1bHQudmFsdWUKKyAgICAg
ICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHJlc3VsdC52YWx1ZSkKKyAgICAgICAgICAgICAgICB0
aW1lc3RhbXBzLmFwcGVuZChwb3NpeFRpbWVzdGFtcCkKKworICAgICAgICBzZWxmLnJlc3BvbnNl
LmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRm
LTgnOworICAgICAgICBzZWxmLnJlc3BvbnNlLm91dC53cml0ZShqc29uLmR1bXBzKHsKKyAgICAg
ICAgICAgICd0ZXN0X3J1bnMnOiB0ZXN0X3J1bnMsCisgICAgICAgICAgICAnYXZlcmFnZXMnOiBh
dmVyYWdlcywKKyAgICAgICAgICAgICdtaW4nOiBtaW4odmFsdWVzKSBpZiB2YWx1ZXMgZWxzZSBO
b25lLAorICAgICAgICAgICAgJ21heCc6IG1heCh2YWx1ZXMpIGlmIHZhbHVlcyBlbHNlIE5vbmUs
CisgICAgICAgICAgICAnZGF0ZV9yYW5nZSc6IFttaW4odGltZXN0YW1wcyksIG1heCh0aW1lc3Rh
bXBzKV0gaWYgdGltZXN0YW1wcyBlbHNlIE5vbmUsCisgICAgICAgICAgICAnc3RhdCc6ICdvayd9
KSkKSW5kZXg6IFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFwcHNwb3QuY29tL2pzL2NvbmZpZy5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJzaXRlcy93ZWJraXQtcGVyZi5hcHBzcG90LmNvbS9qcy9jb25maWcu
anMJKHJldmlzaW9uIDApCisrKyBXZWJzaXRlcy93ZWJraXQtcGVyZi5hcHBzcG90LmNvbS9qcy9j
b25maWcuanMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzggQEAKKy8qIFRoaXMgU291cmNlIENv
ZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWMKKyAq
IExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRl
ZCB3aXRoIHRoaXMgZmlsZSwKKyAqIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxs
YS5vcmcvTVBMLzIuMC8uICovCisKK3ZhciBVU0VfR0VORVJBVEVEX0lNQUdFU19JTl9EQVNIQk9B
UkQgPSBmYWxzZTsKK3ZhciBNQVhfR1JBUEhTID0gNjsKK3ZhciBNQVhfQ1NFVFMgPSAxMDA7Cit2
YXIgREFZID0gODY0MDAwMDA7CisKK3ZhciBDT0xPUlMgPSBbJyNlNzQ1NGMnLCAnIzZkYmE0Yics
ICcjNDk4NmNmJywgJyNmNTk4M2QnLCAnIzg4NGU5ZicsICcjYmY1YzQxJ107CisKKy8vIHNlcnZl
ciBmb3IgSlNPTiBwZXJmb3JtYW5jZSBkYXRhCit2YXIgU0VSVkVSID0gbG9jYXRpb24ucHJvdG9j
b2wuaW5kZXhPZignaHR0cCcpID09IDAgPyBsb2NhdGlvbi5vcmlnaW4gOiAnaHR0cDovL3dlYmtp
dC1wZXJmLmFwcHNwb3QuY29tJzsKKworLy8gc2VydmVyIGZvciBzdGF0aWMgZGFzaGJvYXJkIGlt
YWdlcwordmFyIElNQUdFX1NFUlZFUiA9IFNFUlZFUjsKKwordmFyIExJR0hUX0NPTE9SUyA9ICQu
bWFwKENPTE9SUywgZnVuY3Rpb24oY29sb3IpIHsKKyAgICByZXR1cm4gJC5jb2xvci5wYXJzZShj
b2xvcikuYWRkKCdhJywgLS41KS50b1N0cmluZygpOworfSk7CisKK3ZhciBQTE9UX09QVElPTlMg
PSB7CisgICAgeGF4aXM6IHsgbW9kZTogJ3RpbWUnIH0sCisgICAgeWF4aXM6IHsgbWluOiAwIH0s
CisgICAgc2VsZWN0aW9uOiB7IG1vZGU6ICd4JywgY29sb3I6ICcjOTdjNmU1JyB9LAorICAgIHNl
cmllczogeyBzaGFkb3dTaXplOiAwIH0sCisgICAgbGluZXM6IHsgc2hvdzogZmFsc2UgfSwKKyAg
ICBwb2ludHM6IHsgc2hvdzogdHJ1ZSB9LAorICAgIGdyaWQ6IHsKKyAgICAgICAgY29sb3I6ICcj
Y2RkNmRmJywKKyAgICAgICAgYm9yZGVyV2lkdGg6IDIsCisgICAgICAgIGJhY2tncm91bmRDb2xv
cjogJyNmZmYnLAorICAgICAgICBob3ZlcmFibGU6IHRydWUsCisgICAgICAgIGNsaWNrYWJsZTog
dHJ1ZSwKKyAgICAgICAgYXV0b0hpZ2hsaWdodDogZmFsc2UKKyAgICB9Cit9OworCit2YXIgT1ZF
UlZJRVdfT1BUSU9OUyA9IHsKKyAgICB4YXhpczogeyBtb2RlOiAndGltZScgfSwKKyAgICB5YXhp
czogeyBtaW46IDAgfSwKKyAgICBzZWxlY3Rpb246IHsgbW9kZTogJ3gnLCBjb2xvcjogJyM5N2M2
ZTUnIH0sCisgICAgc2VyaWVzOiB7CisgICAgICAgIGxpbmVzOiB7IHNob3c6IHRydWUsIGxpbmVX
aWR0aDogMSB9LAorICAgICAgICBzaGFkb3dTaXplOiAwCisgICAgfSwKKyAgICBncmlkOiB7Cisg
ICAgICAgIGNvbG9yOiAnI2NkZDZkZicsCisgICAgICAgIGJvcmRlcldpZHRoOiAyLAorICAgICAg
ICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmJywKKyAgICAgICAgdGlja0NvbG9yOiAncmdiYSgwLDAs
MCwwKScKKyAgICB9Cit9OworCitmdW5jdGlvbiB1cmxGb3JDaGFuZ2VzZXQoYnJhbmNoLCBjaGFu
Z2VzZXQpCit7CisgICAgcmV0dXJuICdodHRwOi8vdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC8n
ICsgY2hhbmdlc2V0OworfQorCitmdW5jdGlvbiB1cmxGb3JDaGFuZ2VzZXRMaXN0KGJyYW5jaCwg
Y2hhbmdlc2V0TGlzdCkKK3sKKyAgICB2YXIgbWluID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgY2hh
bmdlc2V0TGlzdCk7CisgICAgdmFyIG1heCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIGNoYW5nZXNl
dExpc3QpOworICAgIHJldHVybiAnaHR0cDovL3RyYWMud2Via2l0Lm9yZy9sb2cvP3Jldj0nICsg
bWF4ICsgJyZzdG9wX3Jldj0nICsgbWluICsgJyZ2ZXJib3NlPW9uJzsKK30KKworLy8gRklYTUUg
bW92ZSB0aGlzIGJhY2sgdG8gZGFzaGJvYXJkLmpzIG9uY2UgdGhlIGJ1ZyA3MTg5MjUgaXMgZml4
ZWQKK2Z1bmN0aW9uIGZldGNoRGFzaGJvYXJkTWFuaWZlc3QoY2FsbGJhY2spCit7CisgICAgJC5h
amF4U2V0dXAoeworICAgICAgICAnZXJyb3InOiBmdW5jdGlvbih4aHIsIGUsIG1lc3NhZ2UpIHsK
KyAgICAgICAgICAgIGVycm9yKCdDb3VsZCBub3QgZG93bmxvYWQgZGFzaGJvYXJkIGRhdGEgZnJv
bSBzZXJ2ZXInLCBlKTsKKyAgICAgICAgfSwKKyAgICAgICAgY2FjaGU6IHRydWUsCisgICAgfSk7
CisKKyAgICAkLmdldEpTT04oU0VSVkVSICsgJy9hcGkvdGVzdC9kYXNoYm9hcmQnLCBjYWxsYmFj
ayk7Cit9CkluZGV4OiBXZWJzaXRlcy93ZWJraXQtcGVyZi5hcHBzcG90LmNvbS9zdGF0aWMvY3Jl
YXRlLW1vZGVscy5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYnNpdGVzL3dlYmtpdC1wZXJmLmFwcHNw
b3QuY29tL3N0YXRpYy9jcmVhdGUtbW9kZWxzLmh0bWwJKHJldmlzaW9uIDApCisrKyBXZWJzaXRl
cy93ZWJraXQtcGVyZi5hcHBzcG90LmNvbS9zdGF0aWMvY3JlYXRlLW1vZGVscy5odG1sCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDY5IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+
Cis8dGl0bGU+Q3JlYXRlIG5ldyBtb2RlbHM8L3RpdGxlPgorPHN0eWxlIHR5cGU9InRleHQvY3Nz
Ij4KK2VtIHsgZm9udC1zdHlsZTogbm9ybWFsOyBjb2xvcjogcmVkOyB9CitwcmUge2JvcmRlcjog
c29saWQgMXB4IGJsYWNrOyBwYWRkaW5nOiA1cHg7fQoraDMge2ZvbnQtc2l6ZTogMWVtO30KKzwv
c3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5DcmVhdGUgbmV3IG1vZGVsczwvaDE+CisKKzxw
PktleTogY2Fub25pY2FsaXplZCBuYW1lIHVzZWQgYnkgYnVpbGQgYm90cyBhbmQgc3RvcmFnZS4g
TmFtZTogaHVtYW4gZnJpZW5kbHkgbmFtZTwvcD4KKworPGgyPkJ1aWxkZXI8L2gyPgorPGZvcm0g
bWV0aG9kPSJwb3N0IiBhY3Rpb249Ii9hcGkvY3JlYXRlL2J1aWxkZXIiIG9uc3VibWl0PSJyZXR1
cm4gc3VibWl0QnlYSFIodGhpcywgZXZlbnQpIj4KKzxsYWJlbCBmb3I9Im5hbWUiPk5hbWUvS2V5
PC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmFtZSI+Cis8bGFiZWwgZm9yPSJwYXNz
d29yZCI+UGFzc3dvcmQ8L2xhYmVsPjxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icGFzc3dv
cmQiPgorPGJ1dHRvbiB0eXBlPSJzdWJtaXQiPkNyZWF0ZTwvYnV0dG9uPgorPC9mb3JtPgorCis8
aDI+QnJhbmNoPC9oMj4KKzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIvYXBpL2NyZWF0ZS9i
cmFuY2giIG9uc3VibWl0PSJyZXR1cm4gc3VibWl0QnlYSFIodGhpcywgZXZlbnQpOyI+Cis8bGFi
ZWwgZm9yPSJrZXkiPktleTwvbGFiZWw+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImtleSI+Cis8
bGFiZWwgZm9yPSJuYW1lIj5OYW1lPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmFt
ZSI+Cis8YnV0dG9uIHR5cGU9InN1Ym1pdCI+Q3JlYXRlPC9idXR0b24+Cis8L2Zvcm0+CisKKzxo
Mj5QbGF0Zm9ybTwvaDI+Cis8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iL2FwaS9jcmVhdGUv
cGxhdGZvcm0iIG9uc3VibWl0PSJyZXR1cm4gc3VibWl0QnlYSFIodGhpcywgZXZlbnQpIj4KKzxs
YWJlbCBmb3I9ImtleSI+S2V5PC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ia2V5Ij4K
KzxsYWJlbCBmb3I9Im5hbWUiPk5hbWU8L2xhYmVsPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJu
YW1lIj4KKzxidXR0b24gdHlwZT0ic3VibWl0Ij5DcmVhdGU8L2J1dHRvbj4KKzwvZm9ybT4KKwor
PGgyPlJlc3VsdDo8L2gyPgorPGgzPlN0YXR1cyBjb2RlPC9oMz4KKzxwIGlkPSJzdGF0dXMiPjwv
cD4KKzxoMz5IZWFkZXJzPC9oMz4KKzxwcmUgaWQ9ImhlYWRlcnMiPjwvcHJlPgorPGgzPlJlc3Bv
bnNlPC9oMz4KKzxwcmUgaWQ9InJlc3BvbnNlIiBuYW1lPSJyZXNwb25zZSI+PC9wcmU+Cis8c2Ny
aXB0PgorCiskID0gZnVuY3Rpb24gKGlkKSB7IHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJ
ZChpZCk7IH0KKworZnVuY3Rpb24gc3VibWl0QnlYSFIoZm9ybSwgZXZlbnQpIHsKKyAgICBldmVu
dC5wcmV2ZW50RGVmYXVsdCgpOworCisgICAgdmFyIGNvbnRlbnRzID0ge30KKyAgICBmb3IgKHZh
ciBpID0gMDsgaSA8IGZvcm0uZWxlbWVudHMubGVuZ3RoOyBpKyspCisgICAgICAgIGNvbnRlbnRz
W2Zvcm0uZWxlbWVudHNbaV0ubmFtZV0gPSBmb3JtLmVsZW1lbnRzW2ldLnZhbHVlOworCisgICAg
dmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDsKKyAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdl
ID0gZnVuY3Rpb24gKCkgeworICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT0gNCkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgJCgnc3RhdHVzJykuaW5uZXJUZXh0ID0geGhyLnN0YXR1
czsKKyAgICAgICAgJCgnaGVhZGVycycpLmlubmVyVGV4dCA9IHhoci5nZXRBbGxSZXNwb25zZUhl
YWRlcnMoKTsKKyAgICAgICAgJCgncmVzcG9uc2UnKS5pbm5lckhUTUwgPSB4aHIucmVzcG9uc2VU
ZXh0OworICAgIH0KKyAgICB4aHIub3Blbihmb3JtLm1ldGhvZCwgZm9ybS5hY3Rpb24sIHRydWUp
OworICAgIHhoci5zZW5kKEpTT04uc3RyaW5naWZ5KGNvbnRlbnRzKSk7Cit9CisKKzwvc2NyaXB0
PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogV2Vic2l0ZXMvd2Via2l0LXBlcmYuYXBwc3BvdC5j
b20vc3RhdGljL21hbnVhbC1zdWJtaXQuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJzaXRlcy93ZWJr
aXQtcGVyZi5hcHBzcG90LmNvbS9zdGF0aWMvbWFudWFsLXN1Ym1pdC5odG1sCShyZXZpc2lvbiAw
KQorKysgV2Vic2l0ZXMvd2Via2l0LXBlcmYuYXBwc3BvdC5jb20vc3RhdGljL21hbnVhbC1zdWJt
aXQuaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2OCBAQAorPCFET0NUWVBFIGh0bWw+Cis8
aHRtbD4KKzxoZWFkPgorPHRpdGxlPlRlc3Qgc3VibWlzc2lvbiBvZiBhIGJ1aWxkIHJlcG9ydDwv
dGl0bGU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorZW0geyBmb250LXN0eWxlOiBub3JtYWw7
IGNvbG9yOiByZWQ7IH0KK3ByZSB7Ym9yZGVyOiBzb2xpZCAxcHggYmxhY2s7IHBhZGRpbmc6IDVw
eDt9CitoMyB7Zm9udC1zaXplOiAxZW07fQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgx
PlRlc3Qgc3VibWlzc2lvbiBvZiBhIGJ1aWxkIHJlcG9ydDwvaDE+Cis8cD5TcGVjaWZ5IHRoZSBw
YXlsb2FkIGFuZCBzdWJtaXQ6PC9wPgorPHRleHRhcmVhIGlkPSJkYXRhIiBuYW1lPSJkYXRhIiBy
b3dzPSIyMCIgY29scz0iMTAwIj48L3RleHRhcmVhPjxicj4KKzxlbSBpZD0ianNvbl9lcnJvciI+
PC9lbT48YnI+Cis8YnV0dG9uIHR5cGU9InN1Ym1pdCIgb25jbGljaz0ic3VibWl0KCkiPlN1Ym1p
dDwvYnV0dG9uPgorCis8aDI+UmVzdWx0OjwvaDI+Cis8aDM+U3RhdHVzIGNvZGU8L2gzPgorPHAg
aWQ9InN0YXR1cyI+PC9wPgorPGgzPkhlYWRlcnM8L2gzPgorPHByZSBpZD0iaGVhZGVycyI+PC9w
cmU+Cis8aDM+UmVzcG9uc2U8L2gzPgorPHByZSBpZD0icmVzcG9uc2UiIG5hbWU9InJlc3BvbnNl
Ij48L3ByZT4KKzxzY3JpcHQ+CisKKyQgPSBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKGlkKTsgfQorCiskKCdkYXRhJykub25pbnB1dCA9IGZ1bmN0aW9uICgp
IHsKKyAgICB2YXIgcGF5bG9hZCA9ICQoJ2RhdGEnKS52YWx1ZTsKKyAgICB0cnkgeworICAgICAg
ICBKU09OLnBhcnNlKHBheWxvYWQpOworICAgICAgICAkKCdqc29uX2Vycm9yJykuaW5uZXJUZXh0
ID0gJyc7CisgICAgfSBjYXRjaCAoZXJyb3IpIHsKKyAgICAgICAgJCgnanNvbl9lcnJvcicpLmlu
bmVyVGV4dCA9IGVycm9yOworICAgIH0KK30KKworZnVuY3Rpb24gc3VibWl0KCkgeworICAgIHZh
ciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7CisgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9
IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9IDQpCisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgICQoJ3N0YXR1cycpLmlubmVyVGV4dCA9IHhoci5zdGF0dXM7
CisgICAgICAgICQoJ2hlYWRlcnMnKS5pbm5lclRleHQgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFk
ZXJzKCk7CisgICAgICAgICQoJ3Jlc3BvbnNlJykuaW5uZXJIVE1MID0geGhyLnJlc3BvbnNlVGV4
dDsKKyAgICB9CisgICAgeGhyLm9wZW4oJ1BPU1QnLCcvYWRtaW4vcmVwb3J0LycsIHRydWUpOwor
ICAgIHhoci5zZW5kKCQoJ2RhdGEnKS52YWx1ZSk7Cit9CisKKyQoJ2RhdGEnKS52YWx1ZSA9IEpT
T04uc3RyaW5naWZ5KHsKKyAgICAnYnJhbmNoJzogJ3dlYmtpdC10cnVuaycsCisgICAgJ3BsYXRm
b3JtJzogJ2Nocm9taXVtLW1hYycsCisgICAgJ2J1aWxkZXItbmFtZSc6ICdnb29nbGUtbWFjLTIn
LAorICAgICdidWlsZC1udW1iZXInOiAnMTIzJywKKyAgICAndGltZXN0YW1wJzogcGFyc2VJbnQo
RGF0ZS5ub3coKSAvIDEwMDApLAorICAgICdyZXZpc2lvbic6IDEwNDg1NiwKKyAgICAncmVzdWx0
cyc6CisgICAgICAgIHsKKyAgICAgICAgICAgICd3ZWJraXRfc3R5bGVfdGVzdCc6IHsnYXZnJzog
MTAwLCAnbWVkaWFuJzogMTAyLCAnc3RkZXYnOiA1LCAnbWluJzogOTAsICdtYXgnOiAxMTB9LAor
ICAgICAgICAgICAgJ3NvbWVfdGVzdCc6IDU0LAorICAgICAgICB9LAorfSwgbnVsbCwgJyAgJyk7
CisKKzwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgo=
</data>
<flag name="review"
          id="125175"
          type_id="1"
          status="+"
          setter="abarth"
    />
          </attachment>
      

    </bug>

</bugzilla>