Re: Re: Append with naive multiplexing of FDWs

"[email protected]" <[email protected]> Tue, 14 Jan 2020 17:12:21 +0800
Newsgroups gmane.comp.db.postgresql.devel.general
Message-ID <[email protected]>
This is a multi-part message in MIME format.

------=_001_NextPart115848830721_=----
Content-Type: multipart/alternative;
	boundary="----=_002_NextPart771053433183_=----"


------=_002_NextPart771053433183_=----
Content-Type: text/plain;
	charset="UTF-8"
Content-Transfer-Encoding: base64

SGVsbG8NCg0KSSBoYXZlIHRlc3RlZCB0aGUgcGF0Y2ggd2l0aCBhIHBhcnRpdGlvbiB0YWJsZSB3
aXRoIHNldmVyYWwgZm9yZWlnbg0KcGFydGl0aW9ucyBsaXZpbmcgb24gc2VwZXJhdGUgZGF0YSBu
b2Rlcy4gVGhlIGluaXRpYWwgdGVzdGluZyB3YXMgZG9uZQ0Kd2l0aCBhIHBhcnRpdGlvbiB0YWJs
ZSBoYXZpbmcgMyBmb3JlaWduIHBhcnRpdGlvbnMsIHRlc3Qgd2FzIGRvbmUgd2l0aA0KdmFyaWV0
eSBvZiBzY2FsZSBmYWN0ZXJzLiBUaGUgc2Vvbm5kIHRlc3Qgd2FzIHdpdGggZml4ZWQgZGF0YSBw
ZXIgZGF0YQ0Kbm9kZSBidXQgbnVtYmVyIG9mIGRhdGEgbm9kZXMgd2VyZSBpbmNyZWFzZWQgaW5j
cmVtZW50YWxseSB0byBzZWUNCnRoZSBwZWZvcm1hbmNlIGltcGFjdCBhcyBtb3JlIG5vZGVzIGFy
ZSBhZGRlZCB0byB0aGUgY2x1c3Rlci4gVGhlDQp0ZXN0IHRocmVlIGlzIHNpbWlsYXIgdG8gdGhl
IGluaXRpYWwgdGVzdCBidXQgd2l0aCBtdWNoIGh1Z2UgZGF0YSBhbmQNCjQgbm9kZXMuDQoNClRo
ZSByZXN1bHRzIGFyZSBzdW1tYXJ5IGlzIGdpdmVuIGJlbG93IGFuZCB0ZXN0IHNjcmlwdCBhdHRh
Y2hlZDoNCg0KVGVzdCBFTlYNClBhcmVudCBub2RlOjJDb3JlIDhHDQpDaGlsZCBOb2RlczoyQ29y
ZSA0Rw0KDQoNClRlc3Qgb25lOg0KDQoxLjEgVGhlIHBhcnRpdGlvbiBzdHJ1Y3QgYXMgYmVsb3c6
DQoNCiBbIHB0ZjooYSBpbnQsIGIgaW50LCBjIHZhcmNoYXIpXQ0KICAgIChQYXJlbnQgbm9kZSkN
CiAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwNCiAgICBbcHRmMV0gICAgICBb
cHRmMl0gICAgICBbcHRmM10NCiAoTm9kZTEpICAgKE5vZGUyKSAgICAoTm9kZTMpDQoNClRoZSB0
YWJsZSBkYXRhIGlzIHBhcnRpdGlvbmVkIGFjcm9zcyBub2RlcywgdGhlIHRlc3QgaXMgZG9uZSB1
c2luZyBhDQpzaW1wbGUgc2VsZWN0IHF1ZXJ5IGFuZCBhIGNvdW50IGFnZ3JlZ2F0ZSBhcyBzaG93
biBiZWxvdy4gVGhlIHJlc3VsdA0KaXMgYW4gYXZlcmFnZSBvZiBleGVjdXRpbmcgZWFjaCBxdWVy
eSBtdWx0aXBsZSB0aW1lcyB0byBlbnN1cmUgcmVsaWFibGUNCmFuZCBjb25zaXN0ZW50IHJlc3Vs
dHMuDQoNCuKRoHNlbGVjdCAqIGZyb20gcHRmIHdoZXJlIGIgPSAxMDA7DQrikaFzZWxlY3QgY291
bnQoKikgZnJvbSBwdGY7DQoNCjEuMi4gVGVzdCBSZXN1bHRzDQoNCiBGb3Ig4pGgIHJlc3VsdDoN
CiAgICAgICBzY2FsZXBlcm5vZGUgICAgbWFzdGVyICAgIHBhdGNoZWQgICAgIHBlcmZvcm1hbmNl
DQogICAgICAgICAgIDJHICAgICAgICAgICAgICAgICAgICA3cyAgICAgICAgICAgICAycyAgICAg
ICAgICAgICAgIDM1MCUNCiAgICAgICAgICAgNUcgICAgICAgICAgICAgICAgICAgIDE3M3MgICAg
ICAgICA2M3MgICAgICAgICAgICAgMjc1JQ0KICAgICAgICAgICAxMEcgICAgICAgICAgICAgICAg
ICA0NjJzICAgICAgICAgMTU2cyAgICAgICAgICAgMjk2JQ0KICAgICAgICAgICAyMEcgICAgICAg
ICAgICAgICAgICA5NjhzICAgICAgICAgMzI3cyAgICAgICAgICAgMjk2JQ0KICAgICAgICAgICAz
MEcgICAgICAgICAgICAgICAgICAxNDcycyAgICAgICA0OTRzICAgICAgICAgICAyOTclDQogICAg
ICAgICAgIA0KIEZvciDikaEgcmVzdWx0Og0KICAgICAgIHNjYWxlcGVybm9kZSAgICBtYXN0ZXIg
ICAgcGF0Y2hlZCAgICAgcGVyZm9ybWFuY2UNCiAgICAgICAgICAgMkcgICAgICAgICAgICAgICAg
ICAgIDEwNzlzICAgICAgIDI5MXMgICAgICAgICAgIDM3MCUNCiAgICAgICAgICAgNUcgICAgICAg
ICAgICAgICAgICAgIDI2ODhzICAgICAgIDc0MXMgICAgICAgICAgIDM2MiUNCiAgICAgICAgICAg
MTBHICAgICAgICAgICAgICAgICAgNDQ3M3MgICAgICAgMTQ5M3MgICAgICAgICAyOTklDQoNCkl0
IHRha2VzIHRvbyBsb25nIHRpbWUgdG8gdGVzdCBhIGFnZ3JlZ2F0ZSBzbyB0aGUgdGVzdCB3YXMg
ZG9uZSB3aXRoIGENCnNtYWxsZXIgZGF0YSBzaXplLg0KDQoNCjEuMy4gc3VtbWFyeQ0KDQpXaXRo
IHRoZSB0YWJsZSBwYXJ0aXRpb25lZCBvdmVyIDMgbm9kZXMsIHRoZSBhdmVyYWdlIHBlcmZvcm1h
bmNlIGdhaW4NCmFjcm9zcyB2YXJpZXR5IG9mIHNjYWxlIGZhY3RvcnMgaXMgYWxtb3N0IDMwMCUN
Cg0KDQpUZXN0IFR3bw0KMi4xIFRoZSBwYXJ0aXRpb24gc3RydWN0IGFzIGJlbG93Og0KDQogWyBw
dGY6KGEgaW50LCBiIGludCwgYyB2YXJjaGFyKV0NCiAgICAoUGFyZW50IG5vZGUpDQogICAgICAg
IHwgICAgICAgICAgICAgfCAgICAgICAgICAgICB8DQogICAgW3B0ZjFdICAgICAgICAgLi4uICAg
ICAgW3B0Zk5dDQogKE5vZGUxKSAgICAgICguLi4pICAgIChOb2RlTikNCg0K4pGgc2VsZWN0ICog
ZnJvbSBwdGYNCuKRoXNlbGVjdCAqIGZyb20gcHRmIHdoZXJlIGIgPSAxMDA7DQoNClRoaXMgdGVz
dCBpcyBkb25lIHdpdGggc2FtZSBzaXplIG9mIGRhdGEgcGVyIG5vZGUgYnV0IHRhYmxlIGlzIHBh
cnRpdGlvbmVkDQphY3Jvc3MgTiBudW1iZXIgb2Ygbm9kZXMuIEVhY2ggdmFyYXRpb24gKG1hc3Rl
ciBvciBwYXRjaGVzKSBpcyB0ZXN0ZWQNCmF0LWxlYXN0IDMgdGltZXMgdG8gZ2V0IHJlbGlhYmxl
IGFuZCBjb25zaXN0ZW50IHJlc3VsdHMuIFRoZSBwdXJwb3NlIG9mIHRoZQ0KdGVzdCBpcyB0byBz
ZWUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlIGFzIG51bWJlciBvZiBkYXRhIG5vZGVzIGFyZSBpbmNy
ZWFzZWQuDQoNCjIuMiBUaGUgcmVzdWx0cw0KDQpGb3Ig4pGgIHJlc3VsdO+8iHNjYWxlcGVybm9k
ZT0yR++8iToNCiAgICBub2RlbnVtYmVyICBtYXN0ZXIgICAgcGF0Y2hlZCAgICAgcGVyZm9ybWFu
Y2UNCiAgICAgICAgICAgICAyICAgICAgICAgICAgIDQzMnMgICAgICAgIDE4MHMgICAgICAgICAg
ICAgIDI0MCUNCiAgICAgICAgICAgICAzICAgICAgICAgICAgIDYzNnMgICAgICAgICAyMjNzICAg
ICAgICAgICAgIDI4NSUNCiAgICAgICAgICAgICA0ICAgICAgICAgICAgIDgzMHMgICAgICAgICAy
ODNzICAgICAgICAgICAgIDI5MyUNCiAgICAgICAgICAgICA1ICAgICAgICAgICAgIDEwNjVzICAg
ICAgIDM2MXMgICAgICAgICAgICAgMjk1JQ0KRm9yIOKRoSByZXN1bHTvvIhzY2FsZXBlcm5vZGU9
MTBH77yJOg0KICAgIG5vZGVudW1iZXIgIG1hc3RlciAgICBwYXRjaGVkICAgICBwZXJmb3JtYW5j
ZQ0KICAgICAgICAgICAgIDIgICAgICAgICAgICAgMjgxcyAgICAgICAgMTQwcyAgICAgICAgICAg
ICAyMDElDQogICAgICAgICAgICAgMyAgICAgICAgICAgICA0MjFzICAgICAgICAxNDBzICAgICAg
ICAgICAgIDMwMCUNCiAgICAgICAgICAgICA0ICAgICAgICAgICAgIDU2MnMgICAgICAgIDE0MXMg
ICAgICAgICAgICAgMzk4JQ0KICAgICAgICAgICAgIDUgICAgICAgICAgICAgNzAycyAgICAgICAg
MTQxcyAgICAgICAgICAgICA0OTclDQogICAgICAgICAgICAgNiAgICAgICAgICAgICA4MzNzICAg
ICAgICAxMzlzICAgICAgICAgICAgIDU5OSUNCiAgICAgICAgICAgICA3ICAgICAgICAgICAgIDk4
NnMgICAgICAgIDE0MXMgICAgICAgICAgICAgNjk5JQ0KICAgICAgICAgICAgIDggICAgICAgICAg
ICAgMTEyNXMgICAgICAxNDBzICAgICAgICAgICAgIDgwMyUNCg0KDQpUZXN0IFRocmVlDQoNClRo
aXMgdGVzdCBpcyBzaW1pbGFyIHRvIHRoZSBbdGVzdCBvbmVdIGJ1dCB3aXRoIG11Y2ggaHVnZSBk
YXRhIGFuZCANCjQgbm9kZXMuDQoNCkZvciDikaAgcmVzdWx0Og0KICAgIHNjYWxlcGVybm9kZSAg
ICBtYXN0ZXIgICAgcGF0Y2hlZCAgICAgcGVyZm9ybWFuY2UNCiAgICAgIDEwMEcgICAgICAgICAg
ICAgICAgNjU5MnMgICAgICAgMTY0OXMgICAgICAgICAzOTklDQpGb3Ig4pGhIHJlc3VsdDoNCiAg
ICBzY2FsZXBlcm5vZGUgICAgbWFzdGVyICAgIHBhdGNoZWQgICAgIHBlcmZvcm1hbmNlDQogICAg
ICAxMDBHICAgICAgICAgICAgICAgIDM1MzgzICAgICAgMTIzNjMgICAgICAgICAyODYlDQpUaGUg
cmVzdWx0IHNob3cgaXQgd29yayB3ZWxsIGluIG11Y2ggaHVnZSBkYXRhLg0KDQoNClN1bW1hcnkN
ClRoZSBwYXRjaCBpcyBwcmV0dHkgZ29vZCwgaXQgd29ya3Mgd2VsbCB3aGVuIHRoZXJlIHdlcmUg
bGl0dGxlIGRhdGEgYmFjayB0bw0KdGhlIHBhcmVudCBub2RlLiBUaGUgcGF0Y2ggZG9lc27igJl0
IHByb3ZpZGUgcGFyYWxsZWwgRkRXIHNjYW4sIGl0IGVuc3VyZXMNCnRoYXQgY2hpbGQgbm9kZXMg
Y2FuIHNlbmQgZGF0YSB0byBwYXJlbnQgaW4gcGFyYWxsZWwgYnV0ICB0aGUgcGFyZW50IGNhbiBv
bmx5DQpzZXF1ZW5ubHkgcHJvY2VzcyB0aGUgZGF0YSBmcm9tIGRhdGEgbm9kZXMuDQoNClByb3Zp
ZGluZyB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBkZWdyZGF0aW9uIGZvciBub24gRkRXIGFwcGVu
ZCBxdWVyaWVzLA0KSSB3b3VsZCByZWNvbWVuZCB0byBjb25zaWRlciB0aGlzIHBhdGNoIGFzIGFu
IGludGVyaW0gc29sdXRvbiB3aGlsZSB3ZSBhcmUNCndhaXRpbmcgZm9yIHBhcmFsbGVsIEZEVyBz
Y2FuLg0KDQoNCg0KDQpIaWdoZ28gU29mdHdhcmUgKENhbmFkYS9DaGluYS9QYWtpc3RhbikgDQpV
UkwgOiB3d3cuaGlnaGdvLmNhIA0KRU1BSUw6IG1haWx0bzptb3ZlYWQoZG90KWxpKGF0KWhpZ2hn
byhkb3QpY2ENCg==

------=_002_NextPart771053433183_=----
Content-Type: text/html;
	charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<html><head><meta http-equiv=3D"content-type" content=3D"text/html; charse=
t=3DUTF-8"><style>body { line-height: 1.5; }blockquote { margin-top: 0px; =
margin-bottom: 0px; margin-left: 0.5em; }body { font-size: 10.5pt; font-fa=
mily: 'Microsoft YaHei UI'; color: rgb(0, 0, 0); line-height: 1.5; }body {=
 font-size: 10.5pt; font-family: 'Microsoft YaHei UI'; color: rgb(0, 0, 0)=
; line-height: 1.5; }</style></head><body>=0A<div><span></span>Hello</div>=
<div><br></div><div><div style=3D"font-family: 'Microsoft YaHei UI', Tahom=
a; line-height: normal;">I have tested the patch with a partition table wi=
th several foreign</div><div style=3D"font-family: 'Microsoft YaHei UI', T=
ahoma; line-height: normal;">partitions living on seperate data nodes. The=
 initial testing was done</div><div style=3D"font-family: 'Microsoft YaHei=
 UI', Tahoma; line-height: normal;">with a partition table having 3 foreig=
n partitions, test was done&nbsp;<span style=3D"font-size: 10.5pt; backgro=
und-color: transparent;">with</span></div><div style=3D"font-family: 'Micr=
osoft YaHei UI', Tahoma; line-height: normal;"><span style=3D"font-size: 1=
0.5pt; background-color: transparent;">variety of scale facters. The seonn=
d test was with fixed data&nbsp;</span><span style=3D"font-size: 10.5pt; b=
ackground-color: transparent;">per data</span></div><div style=3D"font-fam=
ily: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><span style=3D"fo=
nt-size: 10.5pt; background-color: transparent;">node but number of data n=
odes were increased incrementally&nbsp;</span><span style=3D"font-size: 10=
.5pt; background-color: transparent;">to see</span></div><div style=3D"fon=
t-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><span style=
=3D"font-size: 10.5pt; background-color: transparent;">the peformance impa=
ct as more nodes are added&nbsp;</span><span style=3D"font-size: 10.5pt; b=
ackground-color: transparent;">to the cluster.&nbsp;</span><span style=3D"=
font-size: 10.5pt; background-color: transparent;">The</span></div><div st=
yle=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><s=
pan style=3D"font-size: 10.5pt; background-color: transparent;">test three=
&nbsp;is similar to the&nbsp;initial&nbsp;test but with&nbsp;</span><span =
style=3D"font-size: 10.5pt; background-color: transparent;">much huge data=
 and</span></div><div style=3D"font-family: 'Microsoft YaHei UI', Tahoma; =
line-height: normal;"><span style=3D"font-size: 10.5pt; background-color: =
transparent;">4 nodes.</span></div><div style=3D"font-family: 'Microsoft Y=
aHei UI', Tahoma; line-height: normal;"><br></div><div style=3D"font-famil=
y: 'Microsoft YaHei UI', Tahoma; line-height: normal;">The results are sum=
mary is given below and test script attached:</div></div><div style=3D"fon=
t-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><br></div><d=
iv style=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height: normal=
;"><div><b>Test ENV</b></div><div>Parent node:2Core 8G</div><div>Child Nod=
es:2Core 4G</div><div><br></div><div><br></div></div><div style=3D"font-fa=
mily: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><div><b>Test one=
:</b></div><div><br></div><div>1.1 The partition struct as below:</div><di=
v><br></div><div>&nbsp;[ ptf:(a int, b int, c varchar)]</div><div>&nbsp; &=
nbsp;&nbsp;(Parent node)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &n=
bsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p; |</div><div>&nbsp; &nbsp; [ptf1] &nbsp; &nbsp; &nbsp;[ptf2] &nbsp; &nbs=
p; &nbsp;[ptf3]</div><div>&nbsp;(Node1) &nbsp; (Node2) &nbsp; &nbsp;(Node3=
)</div><div><br></div><div>The table data is partitioned across nodes, the=
 test is done using a</div><div>simple&nbsp;<span style=3D"font-size: 10.5=
pt; background-color: transparent;">select query and a count&nbsp;aggregat=
e as shown below.&nbsp;The result</span></div><div><span style=3D"font-siz=
e: 10.5pt; background-color: transparent;">is an&nbsp;</span><span style=
=3D"font-size: 10.5pt; background-color: transparent;">average&nbsp;</span=
><span style=3D"font-size: 10.5pt; background-color: transparent;">of exec=
uting each query multiple times to ensure reliable</span></div><div><span =
style=3D"font-size: 10.5pt; background-color: transparent;">and&nbsp;</spa=
n><span style=3D"font-size: 10.5pt; background-color: transparent;">consis=
tent&nbsp;</span><span style=3D"font-size: 10.5pt; background-color: trans=
parent;">results.</span></div><div><br></div><div>=E2=91=A0select * from p=
tf where b =3D 100;</div><div>=E2=91=A1select count(*) from&nbsp;ptf;</div=
><div><br></div><div><div>1.2. Test Results</div><div><br></div><div><b>&n=
bsp;</b>For =E2=91=A0 result:</div><div>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sc=
alepernode &nbsp; &nbsp;master&nbsp; &nbsp; patched &nbsp; &nbsp; performa=
nce</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2G&nbsp; &nbsp;&nbs=
p;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; 7s &nb=
sp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&=
nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;350%</div><div>&nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp;5G&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&n=
bsp;&nbsp; &nbsp; &nbsp; &nbsp; 173s &nbsp; &nbsp; &nbsp; &nbsp; 63s &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 275%</div><div>&nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp;10G&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&=
nbsp;&nbsp; &nbsp; &nbsp; 462s &nbsp; &nbsp; &nbsp; &nbsp; 156s &nbsp; &nb=
sp; &nbsp; &nbsp; &nbsp; 296%</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=
 &nbsp;20G&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; =
&nbsp; &nbsp; 968s &nbsp; &nbsp; &nbsp; &nbsp; 327s &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp;&nbsp;296%</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=
30G&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; =
&nbsp; 1472s &nbsp; &nbsp; &nbsp; 494s &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&=
nbsp;297%</div><div>&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;</d=
iv><div><b>&nbsp;</b>For =E2=91=A1 result:</div><div>&nbsp; &nbsp; &nbsp; =
&nbsp;scalepernode &nbsp; &nbsp;master&nbsp; &nbsp; patched&nbsp;&nbsp; &n=
bsp; performance</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2G&nbs=
p; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; =
&nbsp;&nbsp;1079s &nbsp; &nbsp; &nbsp;&nbsp;291s &nbsp; &nbsp; &nbsp; &nbs=
p; &nbsp; 370%</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5G&nbsp;=
 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &n=
bsp; 2688s &nbsp; &nbsp; &nbsp; 741s &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 36=
2%</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;10G&nbsp; &nbsp;&nbs=
p;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; 4473s &nbsp; =
&nbsp; &nbsp; 1493s &nbsp; &nbsp; &nbsp; &nbsp; 299%</div><div><br></div><=
div>It takes too long time to test a&nbsp;aggregate so the test was done w=
ith a</div><div>smaller&nbsp;<span style=3D"font-size: 10.5pt; background-=
color: transparent;">data size.</span></div></div><div><br></div><div><br>=
</div><div><div>1.3. summary</div><div><br></div><div>With the table parti=
tioned over 3 nodes, the average performance gain</div><div>across variety=
 of scale factors is almost 300%</div></div></div>=0A<div><br></div><div><=
br></div><div><div style=3D"font-family: 'Microsoft YaHei UI', Tahoma; lin=
e-height: normal;"><b>Test Two</b></div><div style=3D"font-family: 'Micros=
oft YaHei UI', Tahoma; line-height: normal;"><b></b></div><div style=3D"fo=
nt-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;">2.1 The par=
tition struct as below:</div><div style=3D"font-family: 'Microsoft YaHei U=
I', Tahoma; line-height: normal;"><br></div><div style=3D"font-family: 'Mi=
crosoft YaHei UI', Tahoma; line-height: normal;">&nbsp;[ ptf:(a int, b int=
, c varchar)]</div><div style=3D"font-family: 'Microsoft YaHei UI', Tahoma=
; line-height: normal;">&nbsp; &nbsp;&nbsp;(Parent node)</div><div style=
=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;">&nbsp=
; &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | &nbsp=
; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |</div><div style=3D"font-family: 'Mi=
crosoft YaHei UI', Tahoma; line-height: normal;">&nbsp; &nbsp; [ptf1] &nbs=
p; &nbsp; &nbsp; &nbsp; ... &nbsp; &nbsp; &nbsp;[ptfN]</div><div style=3D"=
font-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;">&nbsp;(No=
de1) &nbsp; &nbsp; &nbsp;(...) &nbsp; &nbsp;(NodeN)</div><div style=3D"fon=
t-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><br></div><d=
iv style=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height: normal=
;">=E2=91=A0select * from ptf</div><div style=3D"font-family: 'Microsoft Y=
aHei UI', Tahoma; line-height: normal;">=E2=91=A1select * from ptf where b=
 =3D 100;</div><div style=3D"font-family: 'Microsoft YaHei UI', Tahoma; li=
ne-height: normal;"><br></div><div style=3D"font-family: 'Microsoft YaHei =
UI', Tahoma; line-height: normal;">This test is done with same size of dat=
a per node but table is partitioned</div><div style=3D"font-family: 'Micro=
soft YaHei UI', Tahoma; line-height: normal;">across&nbsp;<span style=3D"f=
ont-size: 10.5pt; background-color: transparent;">N number&nbsp;</span><sp=
an style=3D"font-size: 10.5pt; background-color: transparent;">of nodes.&n=
bsp;Each varation (master or patches) is tested</span></div><div style=3D"=
font-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><span sty=
le=3D"font-size: 10.5pt; background-color: transparent;">at-least 3 times&=
nbsp;</span><span style=3D"font-size: 10.5pt; background-color: transparen=
t;">to get reliable and&nbsp;</span><span style=3D"font-size: 10.5pt; back=
ground-color: transparent;">consistent results. The purpose of the</span><=
/div><div style=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height:=
 normal;"><span style=3D"font-size: 10.5pt; background-color: transparent;=
">test is to see impact on&nbsp;</span><span style=3D"font-size: 10.5pt; b=
ackground-color: transparent;">performance as number of&nbsp;</span><span =
style=3D"font-size: 10.5pt; background-color: transparent;">data nodes are=
 increased.</span></div></div><div><br></div><div><div style=3D"font-famil=
y: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><span style=3D"colo=
r: rgb(80, 0, 80);">2.2 The results</span></div><div style=3D"font-family:=
 'Microsoft YaHei UI', Tahoma; line-height: normal;"><br></div><div style=
=3D"line-height: normal;"><font face=3D"Microsoft YaHei UI, Tahoma">For =
=E2=91=A0 result=EF=BC=88scalepernode=3D2G=EF=BC=89:</font></div><div styl=
e=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><spa=
n style=3D"color: rgb(80, 0, 80);"><span style=3D"color: rgb(0, 0, 0);">&n=
bsp; &nbsp;&nbsp;nodenumber &nbsp;master&nbsp; &nbsp; patched &nbsp; &nbsp=
; performance</span></span></div><div style=3D"font-family: 'Microsoft YaH=
ei UI', Tahoma; line-height: normal;"><span style=3D"color: rgb(80, 0, 80)=
;"><span style=3D"color: rgb(0, 0, 0);">&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&n=
bsp;&nbsp; &nbsp;&nbsp;&nbsp;2 &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp;&nbsp;432s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 180s&nbsp; &nbsp;&nbsp;&nbsp=
; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; 240%</span></span></div><div style=3D"f=
ont-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><span styl=
e=3D"color: rgb(80, 0, 80);"><span style=3D"color: rgb(0, 0, 0);">&nbsp; &=
nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;3 &nbsp;&nbsp;&nbsp=
; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;636s&nbsp; &nbsp;&nbsp;&nbsp;=
 &nbsp; &nbsp;223s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbs=
p;285%</span></span></div><div style=3D"font-family: 'Microsoft YaHei UI',=
 Tahoma; line-height: normal;"><span style=3D"color: rgb(80, 0, 80);"><spa=
n style=3D"color: rgb(0, 0, 0);">&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nb=
sp;&nbsp; &nbsp;&nbsp;4 &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;=
 &nbsp;830s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;283s&nbsp; &nbsp;&nbsp;&=
nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;293%</span></span></div><div style=
=3D"line-height: normal;"><span style=3D"font-family: 'Microsoft YaHei UI'=
, Tahoma; color: rgb(0, 0, 0);">&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbs=
p; &nbsp;&nbsp;&nbsp;5 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&=
nbsp;&nbsp;1065s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;361s&nbsp; &nbsp;&nbsp;&nb=
sp; &nbsp;&nbsp;&nbsp; </span><font face=3D"Microsoft YaHei UI, Tahoma">&n=
bsp; &nbsp;295%</font></div><div style=3D"line-height: normal;"></div><div=
 style=3D"line-height: normal;"><font face=3D"Microsoft YaHei UI, Tahoma">=
For =E2=91=A1 result=EF=BC=88scalepernode=3D10G=EF=BC=89:</font></div><div=
 style=3D"line-height: normal;"><font face=3D"Microsoft YaHei UI, Tahoma">=
&nbsp; &nbsp;&nbsp;nodenumber &nbsp;master&nbsp; &nbsp; patched &nbsp; &nb=
sp; performance</font></div><div style=3D"line-height: normal;"><font face=
=3D"Microsoft YaHei UI, Tahoma">&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbs=
p; &nbsp;&nbsp;&nbsp;2 &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp=
;281s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 140s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;=
&nbsp;&nbsp; &nbsp; &nbsp;201%</font></div><div style=3D"font-family: 'Mic=
rosoft YaHei UI', Tahoma; line-height: normal;"><span style=3D"color: rgb(=
80, 0, 80);"><span style=3D"color: rgb(0, 0, 0);">&nbsp; &nbsp;&nbsp;&nbsp=
; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;3 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&n=
bsp; &nbsp;&nbsp;&nbsp;&nbsp;421s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 140s&nbs=
p; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;300%</span></span></=
div><div style=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height: =
normal;"><span style=3D"color: rgb(80, 0, 80);"><span style=3D"color: rgb(=
0, 0, 0);">&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;=
4 &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;562s&nbsp; &nbs=
p;&nbsp;&nbsp; &nbsp; 141s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nb=
sp; &nbsp;398%</span></span></div><div style=3D"font-family: 'Microsoft Ya=
Hei UI', Tahoma; line-height: normal;"><span style=3D"color: rgb(80, 0, 80=
);"><span style=3D"color: rgb(0, 0, 0);">&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&=
nbsp;&nbsp; &nbsp;&nbsp;&nbsp;5 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbs=
p;&nbsp;&nbsp;&nbsp;702s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 141s&nbsp; &nbsp;=
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;497%</span></span></div><div =
style=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;">=
<span style=3D"color: rgb(80, 0, 80);"><span style=3D"color: rgb(0, 0, 0);=
">&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;6 &nbsp;&nbsp;=
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;833s&nbsp; &nbsp;&nbsp;&=
nbsp; &nbsp; 139s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp=
;599%</span></span></div><div style=3D"font-family: 'Microsoft YaHei UI', =
Tahoma; line-height: normal;"><span style=3D"color: rgb(80, 0, 80);"><span=
 style=3D"color: rgb(0, 0, 0);">&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbs=
p; &nbsp; &nbsp;7 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;=
 986s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 141s&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;=
&nbsp;&nbsp; &nbsp; &nbsp;699%</span></span></div><div style=3D"font-famil=
y: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><span style=3D"colo=
r: rgb(80, 0, 80);"><span style=3D"color: rgb(0, 0, 0);">&nbsp; &nbsp;&nbs=
p;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;8&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;=
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;1125s&nbsp; &nbsp;&nbsp;&nbsp; 140s&nbsp; &=
nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;803%</span></span></div>=
</div><div style=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height=
: normal;"><span style=3D"color: rgb(80, 0, 80);"><span style=3D"color: rg=
b(0, 0, 0);"><br></span></span></div><div style=3D"font-family: 'Microsoft=
 YaHei UI', Tahoma; line-height: normal;"><span style=3D"color: rgb(80, 0,=
 80);"><span style=3D"color: rgb(0, 0, 0);"><br></span></span></div><div s=
tyle=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><=
b>Test Three</b></div><div style=3D"font-family: 'Microsoft YaHei UI', Tah=
oma; line-height: normal;"><span style=3D"color: rgb(80, 0, 80);"><span st=
yle=3D"color: rgb(0, 0, 0);"><br></span></span></div><div><div><span style=
=3D"font-size: 10.5pt; line-height: 1.5; background-color: transparent;">T=
his test is similar to the [test one] but with&nbsp;</span><span style=3D"=
font-size: 10.5pt; line-height: 1.5; background-color: transparent;">much =
huge data and&nbsp;</span></div><div><span style=3D"font-size: 10.5pt; lin=
e-height: 1.5; background-color: transparent;">4 nodes.</span></div><div><=
div><span style=3D"font-size: 10.5pt; line-height: 1.5; background-color: =
transparent;"><br></span></div><div><span style=3D"font-size: 10.5pt; line=
-height: 1.5; background-color: transparent;">For =E2=91=A0 result:</span>=
</div><div><span style=3D"color: rgb(0, 0, 0); font-size: 10.5pt; line-hei=
ght: 1.5; background-color: rgba(0, 0, 0, 0);">&nbsp; &nbsp; scalepernode =
&nbsp; &nbsp;master</span><span style=3D"color: rgb(0, 0, 0); font-size: 1=
0.5pt; line-height: 1.5; background-color: rgba(0, 0, 0, 0);">&nbsp; &nbsp=
; patched &nbsp; &nbsp; performance</span></div><div><span style=3D"font-s=
ize: 10.5pt; line-height: 1.5; background-color: transparent;">&nbsp; &nbs=
p; &nbsp; 100G &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</sp=
an><span style=3D"font-size: 10.5pt; line-height: 1.5; background-color: t=
ransparent;">6592</span><span style=3D"font-size: 10.5pt; line-height: 1.5=
; background-color: transparent;">s &nbsp; &nbsp; &nbsp;&nbsp;</span><span=
 style=3D"font-size: 10.5pt; line-height: 1.5; background-color: transpare=
nt;">1649</span><span style=3D"font-size: 10.5pt; line-height: 1.5; backgr=
ound-color: transparent;">s &nbsp; &nbsp; &nbsp; &nbsp; 399%</span></div><=
div>For =E2=91=A1 result:</div><div>&nbsp; &nbsp;&nbsp;<span style=3D"colo=
r: rgb(0, 0, 0); font-size: 10.5pt; line-height: 1.5; background-color: rg=
ba(0, 0, 0, 0);">scalepernode &nbsp; &nbsp;master</span><span style=3D"col=
or: rgb(0, 0, 0); font-size: 10.5pt; line-height: 1.5; background-color: r=
gba(0, 0, 0, 0);">&nbsp; &nbsp; patched</span><span style=3D"font-size: 10=
..5pt; line-height: 1.5; background-color: transparent;">&nbsp;</span><span=
 style=3D"font-size: 10.5pt; line-height: 1.5; background-color: transpare=
nt;">&nbsp; &nbsp; performance</span></div><div><span style=3D"font-size: =
10.5pt; line-height: 1.5; background-color: transparent;">&nbsp; &nbsp; &n=
bsp; 100G &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;35383 &nb=
sp; &nbsp; &nbsp;12363 &nbsp; &nbsp; &nbsp; &nbsp; 286%</span></div><div><=
span style=3D"font-size: 10.5pt; line-height: 1.5; background-color: trans=
parent;">The result show it work well in much huge data.</span></div></div=
></div><div><span style=3D"font-size: 10.5pt; line-height: 1.5; background=
-color: transparent;"><br></span></div><div><span style=3D"font-size: 10.5=
pt; line-height: 1.5; background-color: transparent;"><br></span></div><di=
v><div style=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height: no=
rmal;"><b>Summary</b></div><div style=3D"font-family: 'Microsoft YaHei UI'=
, Tahoma; line-height: normal;"><b></b></div><div style=3D"font-family: 'M=
icrosoft YaHei UI', Tahoma; line-height: normal;">The patch is pretty good=
, it works well when there were little data&nbsp;<span style=3D"font-size:=
 10.5pt; background-color: transparent;">back to</span></div><div style=3D=
"font-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><span st=
yle=3D"font-size: 10.5pt; background-color: transparent;">the parent node.=
 The patch doesn=E2=80=99t provide parallel FDW scan, it ensures</span></d=
iv><div style=3D"font-family: 'Microsoft YaHei UI', Tahoma; line-height: n=
ormal;"><span style=3D"font-size: 10.5pt; background-color: transparent;">=
that&nbsp;</span><span style=3D"font-size: 10.5pt; background-color: trans=
parent;">child nodes can send data to parent in parallel but &nbsp;the&nbs=
p;parent&nbsp;can&nbsp;</span><span style=3D"font-size: 10.5pt; background=
-color: transparent;">only</span></div><div style=3D"font-family: 'Microso=
ft YaHei UI', Tahoma; line-height: normal;"><span style=3D"font-size: 10.5=
pt; background-color: transparent;">sequennly process the data from data n=
odes.</span></div><div style=3D"font-family: 'Microsoft YaHei UI', Tahoma;=
 line-height: normal;"><br></div><div style=3D"font-family: 'Microsoft YaH=
ei UI', Tahoma; line-height: normal;">Providing there is no performance de=
grdation for non FDW append queries,</div><div style=3D"font-family: 'Micr=
osoft YaHei UI', Tahoma; line-height: normal;">I would recomend to conside=
r this patch as an&nbsp;<span style=3D"font-size: 10.5pt; background-color=
: transparent;">interim soluton while we are</span></div><div style=3D"fon=
t-family: 'Microsoft YaHei UI', Tahoma; line-height: normal;"><span style=
=3D"font-size: 10.5pt; background-color: transparent;">waiting for paralle=
l FDW scan.</span></div></div><div><span style=3D"font-size: 10.5pt; line-=
height: 1.5; background-color: transparent;"><br></span></div><div><br></d=
iv><hr style=3D"width: 210px; height: 1px;" color=3D"#b5c4df" size=3D"1" a=
lign=3D"left">=0A<div><span><div style=3D"MARGIN: 10px; FONT-FAMILY: verda=
na; FONT-SIZE: 10pt"><span style=3D"color: rgb(13, 10, 11); font-family: m=
onospace, monospace; font-size: 10.7333px; font-variant-ligatures: normal;=
 orphans: 2; white-space: pre-wrap; widows: 2;">Highgo Software (Canada/Ch=
ina/Pakistan) </span><br style=3D"box-sizing: border-box; color: rgb(13, 1=
0, 11); font-family: monospace, monospace; font-size: 10.7333px; font-vari=
ant-ligatures: normal; orphans: 2; white-space: pre-wrap; widows: 2;"><spa=
n style=3D"color: rgb(13, 10, 11); font-family: monospace, monospace; font=
-size: 10.7333px; font-variant-ligatures: normal; orphans: 2; white-space:=
 pre-wrap; widows: 2;">URL : </span><a href=3D"http://www.highgo.ca/" rel=
=3D"nofollow" style=3D"box-sizing: border-box; color: rgb(132, 0, 50); tex=
t-decoration: none; font-weight: 600; transition: color 0.2s ease-in-out 0=
s; font-family: monospace, monospace; font-size: 10.7333px; font-variant-l=
igatures: normal; orphans: 2; white-space: pre-wrap; widows: 2;">www.highg=
o.ca</a><span style=3D"color: rgb(13, 10, 11); font-family: monospace, mon=
ospace; font-size: 10.7333px; font-variant-ligatures: normal; orphans: 2; =
white-space: pre-wrap; widows: 2;"> </span><br style=3D"box-sizing: border=
-box; color: rgb(13, 10, 11); font-family: monospace, monospace; font-size=
: 10.7333px; font-variant-ligatures: normal; orphans: 2; white-space: pre-=
wrap; widows: 2;"><span style=3D"color: rgb(13, 10, 11); font-family: mono=
space, monospace; font-size: 10.7333px; font-variant-ligatures: normal; or=
phans: 2; white-space: pre-wrap; widows: 2;">EMAIL: mailto:movead(dot)li(a=
t)highgo(dot)ca</span></div></span></div><blockquote style=3D"margin-Top: =
0px; margin-Bottom: 0px; margin-Left: 0.5em"><div><div class=3D"FoxDiv2020=
0114163142768486"><blockquote style=3D"margin-Top: 0px; margin-Bottom: 0px=
; margin-Left: 0.5em">=0A</blockquote>=0A</div></div></blockquote>=0A</bod=
y></html>
------=_002_NextPart771053433183_=------

------=_001_NextPart115848830721_=----
Content-Type: application/octet-stream;
	name="script.tar"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
	filename="script.tar"

c2NyaXB0LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwNDA3NzcAMDAwMDAw
MAAwMDAwMDAwADAwMDAwMDAwMDAwADEzNjA3MzAwMTM2ADAwNzMxNwAgNQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABz
Y3JpcHQvcHJlcGFyZS5weQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDc3NwAwMDAwMDAw
ADAwMDAwMDAAMDAwMDAwNDI3NzEAMTM2MDUwNDM0MDQAMDExMzQyACAwAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMh
L3Vzci9iaW4vZW52IHB5dGhvbjMKZnJvbSB1dGlsIGltcG9ydCAqCgpkZWYgaGFuZGxlX2FyZ3Vt
ZW50KHJvb3QpOgogICAgY29tbWFuZF9saXN0ID0gWydiaW4nLCdzdGFydGFsbCcsJ3N0b3BhbGwn
LCdnZGF0YScsJ2luaXRkYicsJ3J1bnNlbGVjdCcsJ3J1bmNvdW50JywncnVuc2VsZWN0YWxsJywg
J2luY3JlYXNlZGF0YScsICdyZXNldHBhcmVudCddCiAgICBkZWJ1Z19vdXRwdXQoJ2hhbmRsZV9h
cmd1bWVudCBzdGFydCcpCiAgICByb290LmFyZ2xpc3QgPSBzeXMuYXJndgogICAgcm9vdC5hcmdu
dW0gPSBsZW4ocm9vdC5hcmdsaXN0KQoKICAgIGlmIHJvb3QuYXJnbnVtIDwgMjoKICAgICAgICBl
cnJvcl9leGl0KCdXcm9uZyBjYWxsIG9mIHRoaXMgdG9vbCcpCiAgICAKICAgIGlmIHJvb3QuYXJn
bGlzdFsxXSBpbiBjb21tYW5kX2xpc3Q6CiAgICAgICAgcm9vdC5jb21tYW5ka2luZCA9IHJvb3Qu
YXJnbGlzdFsxXQogICAgZWxzZToKICAgICAgICBlcnJvcl9leGl0KCdXcm9uZyBjYWxsIG9mIHRo
aXMgdG9vbCcpCgogICAgaWYgJ2dkYXRhJyA9PSByb290LmNvbW1hbmRraW5kOgogICAgICAgIGlm
IHJvb3QuYXJnbnVtID09IDI6CiAgICAgICAgICAgIHJvb3QuZGF0YXNjYWxlID0gMQogICAgICAg
IGVsaWYgcm9vdC5hcmdudW0gPT0gMzoKICAgICAgICAgICAgaWYgbm90IHJvb3QuYXJnbGlzdFsy
XS5pc251bWVyaWMoKToKICAgICAgICAgICAgICAgIGVycm9yX2V4aXQoJ1dyb25nIGNhbGwgb2Yg
dGhpcyB0b29sJykKICAgICAgICAgICAgcm9vdC5kYXRhc2NhbGUgPSBpbnQocm9vdC5hcmdsaXN0
WzJdKQogICAgZWxpZiAnaW5jcmVhc2VkYXRhJyA9PSByb290LmNvbW1hbmRraW5kOgogICAgICAg
IGlmIHJvb3QuYXJnbnVtID09IDI6CiAgICAgICAgICAgIHJvb3QuaW5jcmVhc2VzY2FsZSA9IDEK
ICAgICAgICBlbGlmIHJvb3QuYXJnbnVtID09IDM6CiAgICAgICAgICAgIGlmIG5vdCByb290LmFy
Z2xpc3RbMl0uaXNudW1lcmljKCk6CiAgICAgICAgICAgICAgICBlcnJvcl9leGl0KCdXcm9uZyBj
YWxsIG9mIHRoaXMgdG9vbCcpCiAgICAgICAgICAgIHJvb3QuaW5jcmVhc2VzY2FsZSA9IGludChy
b290LmFyZ2xpc3RbMl0pCiAgICBkZWJ1Z19vdXRwdXQoJ2hhbmRsZV9hcmd1bWVudCBlbmQnKQoK
Y2xhc3MgUHJlcGFyZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLm9wX2lu
c3RhbGxfcGF0aD0nL2gxL29wdC9wZycKICAgICAgICBzZWxmLmNwX2luc3RhbGxfcGF0aD0nL2gx
L29wdC9wZ193aXRocGF0Y2gnCiAgICAgICAgc2VsZi5yZW1vdGVfaW5zdGFsbF9wYXRoPScvaDEv
b3B0L3BnJwogICAgICAgIHNlbGYudGFyZmlsZW5hbWUgPSAncGdfYmluLnRhcicKICAgICAgICBz
ZWxmLmRhdGFkaXIgPSAnL2gxL29wdC9wZy9kYXRhJwogICAgICAgIHNlbGYudHQgPSAncGZ0Jwog
ICAgICAgIHNlbGYubm9kZV9jb25mID0gJ25vZGVfY29uZicKICAgICAgICBzZWxmLm9wcmVzdWx0
ZmlsZSA9ICdvcC5vdXQnCiAgICAgICAgc2VsZi5jcHJlc3VsdGZpbGUgPSAnY3Aub3V0JwogICAg
ICAgIHNlbGYudGVzdHRpbWVzID0gMwogICAgICAgIHNlbGYucmVtb3RlcG9ydCA9IDU0MzQKICAg
ICAgICBzZWxmLmRic3NldmVyeW5vZGUgPSAxCiAgICAgICAgc2VsZi5maXJzdF9nZW5lcmF0ZV9w
YXJlbnRfc3FsID0gVHJ1ZQogICAgICAgICNzZWxmLm9uZUdzY2FsZSA9IDE0MDAKICAgICAgICBz
ZWxmLm9uZUdzY2FsZSA9IDE0MDAwMDAwCiAgICAKICAgIGRlZiBnZXRfbm9kZV90dXBsZShzZWxm
LCBub2Rlc3RyKToKICAgICAgICBibGFua19wb3MgPSBub2Rlc3RyLmZpbmQoJyAnKQogICAgICAg
IGlmIC0xID09IGJsYW5rX3BvczoKICAgICAgICAgICAgZXJyb3JfZXhpdCgnV3Jvbmcgbm9kZSBz
dHInKQogICAgICAgIGlwID0gbm9kZXN0clswOmJsYW5rX3Bvc10KICAgICAgICBub2RlcyA9IG5v
ZGVzdHJbYmxhbmtfcG9zKzE6XQogICAgICAgIG5vZGVzID0gaW50KG5vZGVzKQogICAgICAgIHJl
dHVybiAoaXAsIG5vZGVzKQogICAgCiAgICBkZWYgbG9hZF9ub2RlcyhzZWxmKToKICAgICAgIAkj
c2VsZi5ub2RlX2xpc3QgPSBbJzE4LjIxNy4xNjUuMjM4JywnMy4xMzMuMTI0LjIwNScsJzE4LjIx
Ni4xODguMTA4JywnMy4xMzUuMTg3LjEyMycsJzMuMTUuMjE4LjIwNCddCiAgICAgICAgI3NlbGYu
bm9kZV9saXN0ID0gWycxOC4yMTcuMTY1LjIzOCcsJzMuMTMzLjEyNC4yMDUnLCcxOC4yMTYuMTg4
LjEwOCcsJzMuMTM1LjE4Ny4xMjMnXQogICAgICAgICNzZWxmLm5vZGVfbGlzdCA9IFsnMTguMjE3
LjE2NS4yMzgnLCczLjEzMy4xMjQuMjA1JywnMTguMjE2LjE4OC4xMDgnXQogICAgICAgICNzZWxm
Lm5vZGVfbGlzdCA9IFsnMTguMjE3LjE2NS4yMzgnLCczLjEzMy4xMjQuMjA1J10KICAgICAgICBz
ZWxmLm5vZGVfbGlzdCA9IFtdCiAgICAgICAgZmlsZSA9IG9wZW4oc2VsZi5ub2RlX2NvbmYsICdy
JykKICAgICAgICBmb3IgbGluZSBpbiBmaWxlLnJlYWRsaW5lcygpOgogICAgICAgICAgICBsaW5l
ID0gbGluZS5zdHJpcCgnXG4nKQogICAgICAgICAgICB0dXBsZV9pdGVtID0gc2VsZi5nZXRfbm9k
ZV90dXBsZShsaW5lKQogICAgICAgICAgICBzZWxmLm5vZGVfbGlzdC5hcHBlbmQodHVwbGVfaXRl
bSkKICAgICAgICBmaWxlLmNsb3NlKCkKICAgICAgICAjcHJpbnQoc2VsZi5ub2RlX2xpc3QpCiAg
ICAgICAgc2VsZi5ub2RlX3VzZXIgPSAnZWMyLXVzZXInCiAgICAgICAgc2VsZi5rZXlwYXRoID0g
Jy9ob21lL2VjMi11c2VyL2hpZ2hnb2tleS5wZW0nCiAgICAgICAgc2VsZi5jaGVja19kaXIoKQoK
ICAgIGRlZiBjaGVja19kaXIoc2VsZik6CiAgICAgICAgaWYgbm90IGRpcl9leGlzdChzZWxmLm9w
X2luc3RhbGxfcGF0aCk6CiAgICAgICAgICAgIGVycm9yX2V4aXQoJ29wIGluc3RhbGwgcGF0aCBp
cyBub3QgZXhpc3RzJykKICAgICAgICBpZiBub3QgZGlyX2V4aXN0KHNlbGYuY3BfaW5zdGFsbF9w
YXRoKToKICAgICAgICAgICAgZXJyb3JfZXhpdCgnY3AgaW5zdGFsbCBwYXRoIGlzIG5vdCBleGlz
dHMnKQogICAgCiAgICBkZWYgY2xlYW5fcmVtb3RlKHNlbGYpOgogICAgICAgIGZvciBpdGVtX3R1
cGxlIGluIHNlbGYubm9kZV9saXN0OgogICAgICAgICAgICBpdGVtID0gaXRlbV90dXBsZVswXQog
ICAgICAgICAgICBpZiBkaXJfcmVtb3RlX2V4aXN0KHNlbGYucmVtb3RlX2luc3RhbGxfcGF0aCwg
c2VsZi5ub2RlX3VzZXIsIGl0ZW0pOgogICAgICAgICAgICAgICAgY21kID0gJ3JtIC1yZiAlcycg
JSBzZWxmLnJlbW90ZV9pbnN0YWxsX3BhdGgKICAgICAgICAgICAgICAgIGV4ZWNfY29tbWFuZF9z
eXN0ZW1fcmVtb3RlKGNtZCxzZWxmLm5vZGVfdXNlciwgaXRlbSkKICAgICAgICAgICAgY21kID0g
J21rZGlyIC1wICAlcycgJSBzZWxmLnJlbW90ZV9pbnN0YWxsX3BhdGgKICAgICAgICAgICAgZXhl
Y19jb21tYW5kX3N5c3RlbV9yZW1vdGUoY21kLHNlbGYubm9kZV91c2VyLCBpdGVtKQogICAgCiAg
ICBkZWYgcHJlcGFyZV9iaW4oc2VsZik6CiAgICAgICAgaWYgbm90IGZpbGVfZXhpc3Qoc2VsZi50
YXJmaWxlbmFtZSk6CiAgICAgICAgICAgIHJlY29yZGN3ZCA9IGdldGN3ZCgpCiAgICAgICAgICAg
IGNtZCA9ICdjZCAlczt0YXIgLWN6dmYgJXMvJXMgLicgJSAoc2VsZi5vcF9pbnN0YWxsX3BhdGgs
IHJlY29yZGN3ZCwgc2VsZi50YXJmaWxlbmFtZSkKICAgICAgICAgICAgZXhlY19jb21hbmRfc3lz
dGVtKGNtZCkKICAgICAgICAgICAgY21kID0gJ2NkICVzJyAlIChyZWNvcmRjd2QpCiAgICAgICAg
ICAgIGV4ZWNfY29tYW5kX3N5c3RlbShjbWQpCgogICAgICAgIAogICAgICAgIGZvciBpdGVtX3R1
cGxlIGluIHNlbGYubm9kZV9saXN0OgogICAgICAgICAgICBpdGVtID0gaXRlbV90dXBsZVswXQog
ICAgICAgICAgICBjbWQgPSAnc2NwIC1yIC1pIH4vaGlnaGdva2V5LnBlbSAlcyAlc0Alczolcycg
JSAoc2VsZi50YXJmaWxlbmFtZSwgc2VsZi5ub2RlX3VzZXIsIGl0ZW0sIHNlbGYucmVtb3RlX2lu
c3RhbGxfcGF0aCkKICAgICAgICAgICAgZXhlY19jb21hbmRfc3lzdGVtKGNtZCkKCiAgICAgICAg
ICAgIGNtZCA9ICdjZCAlczt0YXIgLXh6dmYgJXMnICUgKHNlbGYucmVtb3RlX2luc3RhbGxfcGF0
aCwgc2VsZi50YXJmaWxlbmFtZSkKICAgICAgICAgICAgZXhlY19jb21tYW5kX3N5c3RlbV9yZW1v
dGUoY21kLCBzZWxmLm5vZGVfdXNlciwgaXRlbSkKCiAgICAgICAgICAgIHNsZWVwKDEpCiAgICAg
ICAgICAgIGNtZCA9ICdybSAtcmYgJXMnICUgKHNlbGYuZGF0YWRpcikKICAgICAgICAgICAgZXhl
Y19jb21tYW5kX3N5c3RlbV9yZW1vdGUoY21kLCBzZWxmLm5vZGVfdXNlciwgaXRlbSwgRmFsc2Up
CgogICAgZGVmIGluaXRkYl9yZW1vdGUoc2VsZik6CiAgICAgICAgbG9vcCA9IDEKICAgICAgICBm
b3IgaXRlbV90dXBsZSBpbiBzZWxmLm5vZGVfbGlzdDoKICAgICAgICAgICAgaXRlbSA9IGl0ZW1f
dHVwbGVbMF0KICAgICAgICAgICAgd2hpbGUgbG9vcCA8PSBpdGVtX3R1cGxlWzFdOgogICAgICAg
ICAgICAgICAgZGF0YWRpciA9IHNlbGYuZGF0YWRpciArIHN0cihsb29wKSAKICAgICAgICAgICAg
ICAgIGlmIGRpcl9yZW1vdGVfZXhpc3QoZGF0YWRpciwgc2VsZi5ub2RlX3VzZXIsIGl0ZW0pOgog
ICAgICAgICAgICAgICAgICAgIGNtZCA9ICdybSAtcmYgJXMnICUgZGF0YWRpcgogICAgICAgICAg
ICAgICAgICAgIGV4ZWNfY29tbWFuZF9zeXN0ZW1fcmVtb3RlKGNtZCxzZWxmLm5vZGVfdXNlciwg
aXRlbSkKICAgICAgICAgICAgICAgIGNtZCA9ICdjZCAlcy9iaW47IC4vaW5pdGRiICVzJyAlIChz
ZWxmLnJlbW90ZV9pbnN0YWxsX3BhdGgsIGRhdGFkaXIpCiAgICAgICAgICAgICAgICBleGVjX2Nv
bW1hbmRfc3lzdGVtX3JlbW90ZShjbWQsIHNlbGYubm9kZV91c2VyLCBpdGVtKQogICAgICAgICAg
ICAgICAgbG9vcCArPSAxCiAgICAgICAgICAgIGxvb3AgPSAxCgogICAgZGVmIG9wZ19vcChzZWxm
LCBraW5kKToKICAgICAgICBpZiBraW5kICE9ICdzdGFydCcgYW5kIGtpbmQgIT0gJ3N0b3AnOgog
ICAgICAgICAgICBlcnJvcl9leGl0KCdXcm9uZyBraW5kJykKICAgICAgICBjbWQgPSAnY2QgJXMv
YmluOyAuL3BnX2N0bCAlcyAtRCAuLi9kYXRhJyAlIChzZWxmLm9wX2luc3RhbGxfcGF0aCwga2lu
ZCkKICAgICAgICBleGVjX2NvbWFuZF9zeXN0ZW0oY21kLEZhbHNlLCBGYWxzZSkKICAgIAogICAg
ZGVmIGNwZ19vcChzZWxmLGtpbmQpOgogICAgICAgIGlmIGtpbmQgIT0gJ3N0YXJ0JyBhbmQga2lu
ZCAhPSAnc3RvcCc6CiAgICAgICAgICAgIGVycm9yX2V4aXQoJ1dyb25nIGtpbmQnKQogICAgICAg
IGNtZCA9ICdjZCAlcy9iaW47IC4vcGdfY3RsICVzIC1EIC4uL2RhdGEnICUgKHNlbGYuY3BfaW5z
dGFsbF9wYXRoLCBraW5kKQogICAgICAgIGV4ZWNfY29tYW5kX3N5c3RlbShjbWQsRmFsc2UsIEZh
bHNlKQoKICAgIGRlZiBvcGdfc3RhcnQoc2VsZik6CiAgICAgICAgc2VsZi5vcGdfb3AoJ3N0b3An
KQogICAgICAgIHNlbGYuY3BnX29wKCdzdG9wJykKICAgICAgICBzZWxmLm9wZ19vcCgnc3RhcnQn
KQoKICAgIGRlZiBjcGdfc3RhcnQoc2VsZik6CiAgICAgICAgc2VsZi5vcGdfb3AoJ3N0b3AnKQog
ICAgICAgIHNlbGYuY3BnX29wKCdzdG9wJykKICAgICAgICBzZWxmLmNwZ19vcCgnc3RhcnQnKQog
ICAgCiAgICBkZWYgc3RhcnRhbGwoc2VsZik6CiAgICAgICAgbG9vcCA9IDEKICAgICAgICBmb3Ig
aXRlbV90dXBsZSBpbiBzZWxmLm5vZGVfbGlzdDoKICAgICAgICAgICAgaXRlbSA9IGl0ZW1fdHVw
bGVbMF0KICAgICAgICAgICAgd2hpbGUgKGxvb3AgPD0gaXRlbV90dXBsZVsxXSk6CiAgICAgICAg
ICAgICAgICBkYXRhZGlyID0gc2VsZi5kYXRhZGlyICsgc3RyKGxvb3ApCiAgICAgICAgICAgICAg
ICBjbWQgPSAnY2QgJXMvYmluOyAuL3BnX2N0bCBzdGFydCAtRCAlcycgJSAoc2VsZi5yZW1vdGVf
aW5zdGFsbF9wYXRoLCBkYXRhZGlyKQogICAgICAgICAgICAgICAgZXhlY19jb21tYW5kX3N5c3Rl
bV9yZW1vdGUoY21kLCBzZWxmLm5vZGVfdXNlciwgaXRlbSkKICAgICAgICAgICAgICAgIGxvb3Ag
Kz0gMQogICAgICAgICAgICBsb29wID0gMQoKICAgIGRlZiBzdG9wYWxsKHNlbGYpOgogICAgICAg
IGxvb3AgPSAxCiAgICAgICAgZm9yIGl0ZW1fdHVwbGUgaW4gc2VsZi5ub2RlX2xpc3Q6CiAgICAg
ICAgICAgIGl0ZW0gPSBpdGVtX3R1cGxlWzBdCiAgICAgICAgICAgIHdoaWxlIChsb29wIDw9IGl0
ZW1fdHVwbGVbMV0pOgogICAgICAgICAgICAgICAgZGF0YWRpciA9IHNlbGYuZGF0YWRpciArIHN0
cihsb29wKQogICAgICAgICAgICAgICAgY21kID0gJ2NkICVzL2JpbjsgLi9wZ19jdGwgc3RvcCAt
RCAlcycgJSAoc2VsZi5yZW1vdGVfaW5zdGFsbF9wYXRoLCBkYXRhZGlyKQogICAgICAgICAgICAg
ICAgZXhlY19jb21tYW5kX3N5c3RlbV9yZW1vdGUoY21kLCBzZWxmLm5vZGVfdXNlciwgaXRlbSwg
RmFsc2UpCiAgICAgICAgICAgICAgICBsb29wICs9IDEKICAgICAgICAgICAgbG9vcCA9IDEKICAg
ICAgICBjbWQgPSAnY2QgJXMvYmluOyAuL3BnX2N0bCBzdG9wIC1EIC4uL2RhdGEnICUgKHNlbGYu
b3BfaW5zdGFsbF9wYXRoKQogICAgICAgIGV4ZWNfY29tYW5kX3N5c3RlbShjbWQsIEZhbHNlLCBG
YWxzZSkKICAgICAgICBjbWQgPSAnY2QgJXMvYmluOyAuL3BnX2N0bCBzdG9wIC1EIC4uL2RhdGEn
ICUgKHNlbGYuY3BfaW5zdGFsbF9wYXRoKQogICAgICAgIGV4ZWNfY29tYW5kX3N5c3RlbShjbWQs
IEZhbHNlLCBGYWxzZSkKICAgIAogICAgZGVmIGdlbmVyYWxfcGFyZW50X3NxbChzZWxmKToKICAg
ICAgICBzcWxfbGlzdCA9IFtdCiAgICAgICAgc3FsX2xpc3QuYXBwZW5kKCdDUkVBVEUgRVhURU5T
SU9OIElGIE5PVCBFWElTVFMgcG9zdGdyZXNfZmR3OycpCiAgICAgICAgc3FsX2xpc3QuYXBwZW5k
KCdEUk9QIFRBQkxFIElGIEVYSVNUUyBwZnQgQ0FTQ0FERTsnKQogICAgICAgIGxvb3AgPSAxCiAg
ICAgICAgbG9vcDIgPSAxCiAgICAgICAgZm9yIGl0ZW1fdHVwbGUgaW4gc2VsZi5ub2RlX2xpc3Q6
CiAgICAgICAgICAgIGl0ZW0gPSBpdGVtX3R1cGxlWzBdCiAgICAgICAgICAgIHdoaWxlIGxvb3Ag
PD0gaXRlbV90dXBsZVsxXToKICAgICAgICAgICAgICAgIHNxbF9saXN0LmFwcGVuZCgnRFJPUCBT
RVJWRVIgSUYgRVhJU1RTIHN2JXMgQ0FTQ0FERTsnICUgKGxvb3AgKyBsb29wMiAqIDEwKSkKICAg
ICAgICAgICAgICAgIGxvb3AgKz0xCiAgICAgICAgICAgIGxvb3AyICs9IDEKICAgICAgICAgICAg
bG9vcCA9IDEKICAgICAgICAKICAgICAgICBsb29wID0gMQogICAgICAgIGxvb3AyID0gMQogICAg
ICAgIGZvciBpdGVtX3R1cGxlIGluIHNlbGYubm9kZV9saXN0OgogICAgICAgICAgICBpdGVtID0g
aXRlbV90dXBsZVswXQogICAgICAgICAgICB3aGlsZSBsb29wIDw9IGl0ZW1fdHVwbGVbMV06CiAg
ICAgICAgICAgICAgICBzcWxfbGlzdC5hcHBlbmQoJ0NSRUFURSBTRVJWRVIgc3YlcyBGT1JFSUdO
IERBVEEgV1JBUFBFUiBwb3N0Z3Jlc19mZHcgT1BUSU9OUyAoaG9zdCBcJyVzXCcsIHBvcnQgXCcl
c1wnLCBkYm5hbWUgXCdwb3N0Z3Jlc1wnKTsnICUgKGxvb3AgKyBsb29wMiAqIDEwLGl0ZW0sIHNl
bGYucmVtb3RlcG9ydCArIGxvb3ApKQogICAgICAgICAgICAgICAgbG9vcCArPTEKICAgICAgICAg
ICAgbG9vcDIgKz0gMQogICAgICAgICAgICBsb29wID0gMQogICAgICAgIAogICAgICAgIGxvb3Ag
PSAxCiAgICAgICAgbG9vcDIgPSAxCiAgICAgICAgZm9yIGl0ZW1fdHVwbGUgaW4gc2VsZi5ub2Rl
X2xpc3Q6CiAgICAgICAgICAgIGl0ZW0gPSBpdGVtX3R1cGxlWzBdCiAgICAgICAgICAgIHdoaWxl
IGxvb3AgPD0gaXRlbV90dXBsZVsxXToKICAgICAgICAgICAgICAgIHNxbF9saXN0LmFwcGVuZCgn
Q1JFQVRFIFVTRVIgTUFQUElORyBGT1IgcHVibGljIFNFUlZFUiBzdiVzOycgJSAobG9vcCArIGxv
b3AyICogMTApKQogICAgICAgICAgICAgICAgbG9vcCArPTEKICAgICAgICAgICAgbG9vcDIgKz0g
MQogICAgICAgICAgICBsb29wID0gMQogICAgICAgIAogICAgICAgIGxvb3AgPSAxCiAgICAgICAg
bG9vcDIgPSAxCiAgICAgICAgZm9yIGl0ZW1fdHVwbGUgaW4gc2VsZi5ub2RlX2xpc3Q6CiAgICAg
ICAgICAgIGl0ZW0gPSBpdGVtX3R1cGxlWzBdCiAgICAgICAgICAgIHdoaWxlIGxvb3AgPD0gaXRl
bV90dXBsZVsxXToKICAgICAgICAgICAgICAgIHNxbF9saXN0LmFwcGVuZCgnQ1JFQVRFIEZPUkVJ
R04gVEFCTEUgcGZ0JXMgKGEgaW50LCBiIGludCwgYyB0ZXh0KSBTRVJWRVIgc3YlczsnICUgKGxv
b3AgKyBsb29wMiAqIDEwLCBsb29wICsgbG9vcDIgKiAxMCkpCiAgICAgICAgICAgICAgICBsb29w
ICs9MQogICAgICAgICAgICBsb29wMiArPSAxCiAgICAgICAgICAgIGxvb3AgPSAxCgogICAgICAg
IHNxbF9saXN0LmFwcGVuZCgnQ1JFQVRFIFRBQkxFIHBmdCAoYSBpbnQsIGIgaW50LCBjIHRleHQp
IFBBUlRJVElPTiBCWSBMSVNUKGEpOycpCiAgICAgICAgCiAgICAgICAgbG9vcCA9IDEKICAgICAg
ICBsb29wMiA9IDEKICAgICAgICBmb3IgaXRlbV90dXBsZSBpbiBzZWxmLm5vZGVfbGlzdDoKICAg
ICAgICAgICAgaXRlbSA9IGl0ZW1fdHVwbGVbMF0KICAgICAgICAgICAgd2hpbGUgbG9vcCA8PSBp
dGVtX3R1cGxlWzFdOgogICAgICAgICAgICAgICAgc3FsX2xpc3QuYXBwZW5kKCdBTFRFUiBUQUJM
RSBwZnQgQVRUQUNIIFBBUlRJVElPTiBwZnQlcyBGT1IgVkFMVUVTIElOICglcyk7JyAlIChsb29w
ICsgbG9vcDIgKiAxMCwgbG9vcCArIGxvb3AyICogMTApICkKICAgICAgICAgICAgICAgIGxvb3Ag
Kz0xCiAgICAgICAgICAgIGxvb3AyICs9IDEKICAgICAgICAgICAgbG9vcCA9IDEKCiAgICAgICAg
aWYgc2VsZi5maXJzdF9nZW5lcmF0ZV9wYXJlbnRfc3FsOgogICAgICAgICAgICBmaWxlID0gb3Bl
bigncGFyZW50LnNxbCcsICd3JykKICAgICAgICAgICAgc2VsZi5maXJzdF9nZW5lcmF0ZV9wYXJl
bnRfc3FsID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWxlID0gb3BlbigncGFy
ZW50LnNxbCcsICdhJykKICAgICAgICBmb3IgaXRlbSBpbiBzcWxfbGlzdDoKICAgICAgICAgICAg
ZmlsZS53cml0ZShpdGVtICsgJ1xuJykKICAgICAgICBmaWxlLmNsb3NlKCkKICAgIAogICAgZGVm
IGdlbmVyYWxfbm9kZV9zcWwoc2VsZik6CiAgICAgICAgc3FsX2xpc3QgPSBbXQogICAgICAgIHNx
bF9saXN0LmFwcGVuZCgnRFJPUCBUQUJMRSBJRiBFWElTVFMgOnRhYmxlbmFtZSBDQVNDQURFOycp
CiAgICAgICAgc3FsX2xpc3QuYXBwZW5kKCdDUkVBVEUgVEFCTEUgOnRhYmxlbmFtZShhIGludCwg
YiBpbnQsIGMgdGV4dCk7JykKICAgICAgICBzcWxfbGlzdC5hcHBlbmQoJ0lOU0VSVCBJTlRPIDp0
YWJsZW5hbWUgU0VMRUNUIDpsaXN0X3ZhbHVlLCBnZW5lcmF0ZV9zZXJpZXMoMSwlcyo6c2NhbGUp
LCBtZDUocmFuZG9tKCk6OnRleHQpJyAlIChzZWxmLm9uZUdzY2FsZSkpCiAgICAgICAgZmlsZSA9
IG9wZW4oJ25vZGUuc3FsJywgJ3cnKQogICAgICAgIGZvciBpdGVtIGluIHNxbF9saXN0OgogICAg
ICAgICAgICBmaWxlLndyaXRlKGl0ZW0gKyAnXG4nKQogICAgICAgIGZpbGUuY2xvc2UoKQogICAg
ICAgIHBhc3MKICAgIAogICAgZGVmIGNvcHlfc3FsKHNlbGYpOgogICAgICAgIHNlbGYuZ2VuZXJh
bF9ub2RlX3NxbCgpCiAgICAgICAgZm9yIGl0ZW1fdHVwbGUgaW4gc2VsZi5ub2RlX2xpc3Q6CiAg
ICAgICAgICAgIGl0ZW0gPSBpdGVtX3R1cGxlWzBdCiAgICAgICAgICAgIGNtZCA9ICdzY3AgLWkg
fi9oaWdoZ29rZXkucGVtIG5vZGUuc3FsICVzQCVzOiVzL25vZGUuc3FsJyAlIChzZWxmLm5vZGVf
dXNlciwgaXRlbSwgc2VsZi5vcF9pbnN0YWxsX3BhdGgpCiAgICAgICAgICAgIGV4ZWNfY29tYW5k
X3N5c3RlbShjbWQpCiAgICAgICAgc2VsZi5nZW5lcmFsX3BhcmVudF9zcWwoKQogICAgICAgIGNt
ZCA9ICdjcCBwYXJlbnQuc3FsICVzL2RhdGEvbm9kZS5zcWwnICUgKHNlbGYub3BfaW5zdGFsbF9w
YXRoKQogICAgICAgIGV4ZWNfY29tYW5kX3N5c3RlbShjbWQpCiAgICAgICAgY21kID0gJ2NwIHBh
cmVudC5zcWwgJXMvZGF0YS9ub2RlLnNxbCcgJSAoc2VsZi5jcF9pbnN0YWxsX3BhdGgpCiAgICAg
ICAgZXhlY19jb21hbmRfc3lzdGVtKGNtZCkKICAgIAogICAgZGVmIHJlc2V0cGFyZW50KHNlbGYp
OgogICAgICAgIHNlbGYuZ2VuZXJhbF9wYXJlbnRfc3FsKCkKICAgICAgICBjbWQgPSAnY3AgcGFy
ZW50LnNxbCAlcy9kYXRhL25vZGUuc3FsJyAlIChzZWxmLm9wX2luc3RhbGxfcGF0aCkKICAgICAg
ICBleGVjX2NvbWFuZF9zeXN0ZW0oY21kKQogICAgICAgIGNtZCA9ICdjcCBwYXJlbnQuc3FsICVz
L2RhdGEvbm9kZS5zcWwnICUgKHNlbGYuY3BfaW5zdGFsbF9wYXRoKQogICAgICAgIGV4ZWNfY29t
YW5kX3N5c3RlbShjbWQpCiAgICAgICAgc2VsZi5nZW5lcmF0ZWRhdGFfdGhyZWFkKCdjcCcsMCww
KQogICAgICAgIHNlbGYuZ2VuZXJhdGVkYXRhX3RocmVhZCgnb3AnLDAsMCkKCiAgICBkZWYgZ2Vu
ZXJhdGVkYXRhX3RocmVhZChzZWxmLCBpdGVtLCBsb29wLCBsb29wMik6CiAgICAgICAgaWYgaXRl
bSA9PSAnb3AnOgogICAgICAgICAgICBzZWxmLm9wZ19zdGFydCgpCiAgICAgICAgICAgIGNtZCA9
ICclcy9iaW4vcHNxbCAtZCBwb3N0Z3JlcyAtZiAlcy9kYXRhL25vZGUuc3FsJyAlIChzZWxmLm9w
X2luc3RhbGxfcGF0aCwgc2VsZi5vcF9pbnN0YWxsX3BhdGgpCiAgICAgICAgICAgIG91dHB1dCgn
Pj5HZW5lcmF0ZSBvcGcgdGFibGVzJykKICAgICAgICAgICAgZXhlY19jb21hbmRfc3lzdGVtKGNt
ZCkKICAgICAgICBlbGlmIGl0ZW0gPT0gJ2NwJzoKICAgICAgICAgICAgc2VsZi5jcGdfc3RhcnQo
KQogICAgICAgICAgICBjbWQgPSAnJXMvYmluL3BzcWwgLWQgcG9zdGdyZXMgLWYgJXMvZGF0YS9u
b2RlLnNxbCcgJSAoc2VsZi5jcF9pbnN0YWxsX3BhdGgsc2VsZi5jcF9pbnN0YWxsX3BhdGgpCiAg
ICAgICAgICAgIG91dHB1dCgnPj5HZW5lcmF0ZSBjcGcgdGFibGVzJykKICAgICAgICAgICAgZXhl
Y19jb21hbmRfc3lzdGVtKGNtZCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjbWQgPSAnJXMv
YmluL3BzcWwgLXAgJXMgLWQgcG9zdGdyZXMgLXYgbGlzdF92YWx1ZT0lcyAtdiBzY2FsZT0lcyAt
diB0YWJsZW5hbWU9cGZ0JXMgLWYgJXMvbm9kZS5zcWwnICUgXAogICAgICAgICAgICAgICAgICAg
IChzZWxmLnJlbW90ZV9pbnN0YWxsX3BhdGgsIHNlbGYucmVtb3RlcG9ydCArIGxvb3AsIGxvb3Ay
KjEwK2xvb3AsIHNlbGYuZGF0YXNjYWxlLGxvb3AyKjEwK2xvb3Asc2VsZi5vcF9pbnN0YWxsX3Bh
dGgpCiAgICAgICAgICAgIG91dHB1dCgnPj5HZW5lcmF0ZSAlcyBub2RlIGRhdGEnICUgaXRlbSkK
ICAgICAgICAgICAgZXhlY19jb21tYW5kX3N5c3RlbV9yZW1vdGUoY21kLCBzZWxmLm5vZGVfdXNl
ciwgaXRlbSwgVHJ1ZSkKCiAgICBkZWYgZ2VuZXJhdGVkYXRhKHNlbGYpOgogICAgICAgIHRocnVu
aW5nID0gVHJ1ZQogICAgICAgIHRocmVhZGxpc3QgPSBbXQogICAgICAgIGxvb3AgPSAxCiAgICAg
ICAgbG9vcDIgPSAxCiAgICAgICAgb3V0cHV0KCc+PkdlbmVyYXRlIGRhdGFzLi4uJykKICAgICAg
ICBzZWxmLmdlbmVyYXRlZGF0YV90aHJlYWQoJ2NwJywwLDApCiAgICAgICAgc2VsZi5nZW5lcmF0
ZWRhdGFfdGhyZWFkKCdvcCcsMCwwKQogICAgICAgIHNlbGYuc3RhcnRhbGwoKQogICAgICAgIGZv
ciBpdGVtX3R1cGxlIGluIHNlbGYubm9kZV9saXN0OgogICAgICAgICAgICBpdGVtID0gaXRlbV90
dXBsZVswXQogICAgICAgICAgICB3aGlsZSAobG9vcCA8PSBpdGVtX3R1cGxlWzFdKToKICAgICAg
ICAgICAgICAgIG10ID0gbXlUaHJlYWQoc2VsZi5nZW5lcmF0ZWRhdGFfdGhyZWFkLCBpdGVtLCBs
b29wLCBsb29wMikKICAgICAgICAgICAgICAgIG10LnN0YXJ0KCkKICAgICAgICAgICAgICAgIHRo
cmVhZGxpc3QuYXBwZW5kKG10KQogICAgICAgICAgICAgICAgbG9vcCArPSAxCiAgICAgICAgICAg
IGxvb3AyICs9IDEKICAgICAgICAgICAgbG9vcCA9IDEKICAgICAgICAKICAgICAgICB3aGlsZSh0
aHJ1bmluZyk6CiAgICAgICAgICAgIHNsZWVwKDIpCiAgICAgICAgICAgIHRocnVuaW5nID0gRmFs
c2UKICAgICAgICAgICAgZm9yIG10IGluIHRocmVhZGxpc3Q6CiAgICAgICAgICAgICAgICBtdHMg
PSBtdC5pc0FsaXZlKCkKICAgICAgICAgICAgICAgIHRocnVuaW5nID0gdGhydW5pbmcgb3IgbXRz
CiAgICAKICAgIGRlZiBpbmNyZWFzZWRhdGFfdGhyZWFkKHNlbGYsIGl0ZW0sIGxvb3AsIGxvb3Ay
KToKICAgICAgICBzcWwgPSdJTlNFUlQgSU5UTyBwZnQlcyBTRUxFQ1QgJXMsIGdlbmVyYXRlX3Nl
cmllcyglcywlcyolcyksIG1kNShyYW5kb20oKTo6dGV4dCknICUgXAogICAgICAgICAgICAgICAg
KGxvb3ArMTAqbG9vcDIsIGxvb3ArMTAqbG9vcDIsIGxvb3ArMTAqbG9vcDIsc2VsZi5vbmVHc2Nh
bGUsIHNlbGYuaW5jcmVhc2VzY2FsZSkKICAgICAgICBjbWQgPSAnJXMvYmluL3BzcWwgLXAgJXMg
LWQgcG9zdGdyZXMgLWMgXCclc1wnJyAlIChzZWxmLnJlbW90ZV9pbnN0YWxsX3BhdGgsIHNlbGYu
cmVtb3RlcG9ydCArIGxvb3Asc3FsKQogICAgICAgIG91dHB1dCgnPj5HZW5lcmF0ZSAlc0cgdG8g
JXMgbm9kZSBkYXRhJyAlIChzZWxmLmluY3JlYXNlc2NhbGUsaXRlbSkpCiAgICAgICAgZXhlY19j
b21tYW5kX3N5c3RlbV9yZW1vdGUoY21kLCBzZWxmLm5vZGVfdXNlciwgaXRlbSwgVHJ1ZSkKCiAg
ICBkZWYgaW5jcmVhc2VkYXRhKHNlbGYpOgogICAgICAgIHRocmVhZGxpc3QgPSBbXQogICAgICAg
IGxvb3AgPSAxCiAgICAgICAgbG9vcDIgPSAxCiAgICAgICAgdGhydW5pbmcgPSBUcnVlCiAgICAg
ICAgZm9yIGl0ZW1fdHVwbGUgaW4gc2VsZi5ub2RlX2xpc3Q6CiAgICAgICAgICAgIGl0ZW0gPSBp
dGVtX3R1cGxlWzBdCiAgICAgICAgICAgIHdoaWxlIChsb29wIDw9IGl0ZW1fdHVwbGVbMV0pOgog
ICAgICAgICAgICAgICAgbXQgPSBteVRocmVhZChzZWxmLmluY3JlYXNlZGF0YV90aHJlYWQsIGl0
ZW0sIGxvb3AsIGxvb3AyKQogICAgICAgICAgICAgICAgbXQuc3RhcnQoKQogICAgICAgICAgICAg
ICAgdGhyZWFkbGlzdC5hcHBlbmQobXQpCiAgICAgICAgICAgICAgICBsb29wICs9IDEKICAgICAg
ICAgICAgbG9vcDIgKz0gMQogICAgICAgICAgICBsb29wID0gMQogICAgICAgIAogICAgICAgIHdo
aWxlKHRocnVuaW5nKToKICAgICAgICAgICAgc2xlZXAoMikKICAgICAgICAgICAgdGhydW5pbmcg
PSBGYWxzZQogICAgICAgICAgICBmb3IgbXQgaW4gdGhyZWFkbGlzdDoKICAgICAgICAgICAgICAg
IG10cyA9IG10LmlzQWxpdmUoKQogICAgICAgICAgICAgICAgdGhydW5pbmcgPSB0aHJ1bmluZyBv
ciBtdHMKICAgICAgICBwYXNzCiAgICAKICAgIGRlZiBjaGFuZ2Vfbm9kZV9wZ2NvbmYoc2VsZik6
CiAgICAgICAgbG9jYWxfcGdfY29uZiA9ICclcy8lcy9wb3N0Z3Jlc3FsLmNvbmYnICUgKHNlbGYu
b3BfaW5zdGFsbF9wYXRoLCdkYXRhJykKICAgICAgICBsb2NhbF9wZ19jb25mX2NoYW5nZSA9ICcl
cy8lcy9wb3N0Z3Jlc3FsLmNvbmYuY2hhbmdlJyAlIChzZWxmLm9wX2luc3RhbGxfcGF0aCwgJ2Rh
dGEnKQogICAgICAgIGxvY2FsX3BnX2hiYSA9ICclcy8lcy9wZ19oYmEuY29uZicgJSAoc2VsZi5v
cF9pbnN0YWxsX3BhdGgsJ2RhdGEnKQogICAgICAgIGxvY2FsX3BnX2hiYV9jaGFuZ2UgPSAnJXMv
JXMvcGdfaGJhLmNvbmYuY2hhbmdlJyAlIChzZWxmLm9wX2luc3RhbGxfcGF0aCwnZGF0YScpCiAg
ICAgICAgZGVidWdfb3V0cHV0KCdjaGFuZ2Vfbm9kZV9wZ2NvbmYnKQogICAgICAgIGxvb3AgPSAx
CgogICAgICAgIGZvciBpdGVtX3R1cGxlIGluIHNlbGYubm9kZV9saXN0OgogICAgICAgICAgICBp
dGVtID0gaXRlbV90dXBsZVswXQogICAgICAgICAgICB3aGlsZSAobG9vcCA8PSBpdGVtX3R1cGxl
WzFdKToKICAgICAgICAgICAgICAgIGNtZCA9ICdjcCAlcyAlcztjcCAlcyAlcycgJSAobG9jYWxf
cGdfY29uZiwgbG9jYWxfcGdfY29uZl9jaGFuZ2UsIGxvY2FsX3BnX2hiYSwgbG9jYWxfcGdfaGJh
X2NoYW5nZSkKICAgICAgICAgICAgICAgIGV4ZWNfY29tYW5kX3N5c3RlbShjbWQpCgogICAgICAg
ICAgICAgICAgY29uZl9pdGVtID0gJ2xpc3Rlbl9hZGRyZXNzZXMgPSBcJypcJycKICAgICAgICAg
ICAgICAgIGNtZCA9ICdlY2hvICIlcyIgPj4gJXMnICUgKGNvbmZfaXRlbSwgbG9jYWxfcGdfY29u
Zl9jaGFuZ2UpCiAgICAgICAgICAgICAgICBleGVjX2NvbWFuZF9zeXN0ZW0oY21kLFRydWUpCgog
ICAgICAgICAgICAgICAgY29uZl9pdGVtID0gJ3BvcnQgPSAlcycgJSAoc2VsZi5yZW1vdGVwb3J0
ICsgbG9vcCkKICAgICAgICAgICAgICAgIGNtZCA9ICdlY2hvICIlcyIgPj4gJXMnICUgKGNvbmZf
aXRlbSwgbG9jYWxfcGdfY29uZl9jaGFuZ2UpCiAgICAgICAgICAgICAgICBleGVjX2NvbWFuZF9z
eXN0ZW0oY21kLFRydWUpCgogICAgICAgICAgICAgICAgY29uZl9pdGVtID0gJ2hvc3QgICAgYWxs
ICAgICAgICAgICAgIGFsbCAgICAgICAgICAgICBhbGwgICAgICAgICAgICB0cnVzdCcKICAgICAg
ICAgICAgICAgIGNtZCA9ICdlY2hvICIlcyIgPj4gJXMnICUgKGNvbmZfaXRlbSwgbG9jYWxfcGdf
aGJhX2NoYW5nZSkKICAgICAgICAgICAgICAgIGV4ZWNfY29tYW5kX3N5c3RlbShjbWQsVHJ1ZSkK
CiAgICAgICAgICAgICAgICBkYXRhZGlyID0gc2VsZi5kYXRhZGlyICsgc3RyKGxvb3ApCiAgICAg
ICAgICAgICAgICB0YXJfcGdjb25mX2ZpbGVfcGF0aCA9ICclcy9wb3N0Z3Jlc3FsLmNvbmYnICUg
KGRhdGFkaXIpCiAgICAgICAgICAgICAgICBjbWQgPSAnc2NwIC1pIH4vaGlnaGdva2V5LnBlbSAl
cyAlc0AlczolcycgJSAobG9jYWxfcGdfY29uZl9jaGFuZ2UsIHNlbGYubm9kZV91c2VyLCBpdGVt
LCB0YXJfcGdjb25mX2ZpbGVfcGF0aCkKICAgICAgICAgICAgICAgIGV4ZWNfY29tYW5kX3N5c3Rl
bShjbWQsIFRydWUpCgogICAgICAgICAgICAgICAgdGFyX3BnaGJhX2ZpbGVfcGF0aCA9ICclcy9w
Z19oYmEuY29uZicgJSAoZGF0YWRpcikKICAgICAgICAgICAgICAgIGNtZCA9ICdzY3AgLWkgfi9o
aWdoZ29rZXkucGVtICVzICVzQCVzOiVzJyAlIChsb2NhbF9wZ19oYmFfY2hhbmdlLCBzZWxmLm5v
ZGVfdXNlciwgaXRlbSwgdGFyX3BnaGJhX2ZpbGVfcGF0aCkKICAgICAgICAgICAgICAgIGV4ZWNf
Y29tYW5kX3N5c3RlbShjbWQsIFRydWUpCiAgICAgICAgICAgICAgICBsb29wICs9IDEKICAgICAg
ICAgICAgbG9vcCA9IDEKCiAgICBkZWYgZXhlY190ZXN0X2NvdW50KHNlbGYpOgogICAgICAgIHNx
bCA9ICdleHBsYWluIGFuYWx5c2UgdmVyYm9zZSBzZWxlY3QgY291bnQoKikgZnJvbSAlcycgJSBz
ZWxmLnR0CiAgICAgICAgY21kID0gJyVzL2Jpbi9wc3FsIC1kIHBvc3RncmVzIC1jIFwnJXNcJycg
JSAoc2VsZi50ZXN0cGF0aCxzcWwpCiAgICAgICAgb3V0cHV0KHNxbCkKICAgICAgICB0MSA9IGdl
dHRpbWUoKQogICAgICAgIGV4ZWNfY29tYW5kX3N5c3RlbShjbWQsIFRydWUpCiAgICAgICAgdDIg
PSBnZXR0aW1lKCkKICAgICAgICBvdXRwdXQoJz4+PlJ1biB0aW1lICVzIHNlY29uZCcgJSBpbnQo
dDItdDEpKQoKICAgIGRlZiBleGVjX3Rlc3Rfc2VsZWN0KHNlbGYpOgogICAgICAgIHNxbF9iYXNl
ID0gJ3NlbGVjdCAqIGZyb20gJXMgd2hlcmUgYiA9IDEwMCcgJSBzZWxmLnR0CiAgICAgICAgc3Fs
ID0gJ2V4cGxhaW4gYW5hbHlzZSB2ZXJib3NlICVzJyAlIHNxbF9iYXNlCiAgICAgICAgY21kID0g
JyVzL2Jpbi9wc3FsIC1kIHBvc3RncmVzIC1jIFwnJXNcJycgJSAoc2VsZi50ZXN0cGF0aCxzcWwp
CiAgICAgICAgdDEgPSBnZXR0aW1lKCkKICAgICAgICBvdXRwdXQoc3FsKQogICAgICAgIGV4ZWNf
Y29tYW5kX3N5c3RlbShjbWQsIFRydWUpCiAgICAgICAgdDIgPSBnZXR0aW1lKCkKICAgICAgICBv
dXRwdXQoJz4+Pj5SdW4gdGltZSAlcyBzZWNvbmQnICUgaW50KHQyLXQxKSkKICAgIAogICAgZGVm
IGV4ZWNfdGVzdF9zZWxlY3RhbGwoc2VsZik6CiAgICAgICAgc3FsX2Jhc2UgPSAnc2VsZWN0ICog
ZnJvbSAlcycgJSBzZWxmLnR0CiAgICAgICAgc3FsID0gJ2V4cGxhaW4gYW5hbHlzZSB2ZXJib3Nl
ICVzJyAlIHNxbF9iYXNlCiAgICAgICAgY21kID0gJyVzL2Jpbi9wc3FsIC1kIHBvc3RncmVzIC1j
IFwnJXNcJycgJSAoc2VsZi50ZXN0cGF0aCxzcWwpCiAgICAgICAgdDEgPSBnZXR0aW1lKCkKICAg
ICAgICBvdXRwdXQoc3FsKQogICAgICAgIGV4ZWNfY29tYW5kX3N5c3RlbShjbWQsIFRydWUpCiAg
ICAgICAgdDIgPSBnZXR0aW1lKCkKICAgICAgICBvdXRwdXQoJz4+Pj5SdW4gdGltZSAlcyBzZWNv
bmQnICUgaW50KHQyLXQxKSkKICAgIAogICAgZGVmIHJ1bnRlc3Qoc2VsZiwga2luZCk6CiAgICAg
ICAgCiAgICAgICAgb3V0cHV0KCc+PlRlc3QgV2l0aCBQYXRjaCcpCiAgICAgICAgY291bnQgPSBz
ZWxmLnRlc3R0aW1lcwogICAgICAgIHNlbGYudGVzdHBhdGggPSBzZWxmLmNwX2luc3RhbGxfcGF0
aAogICAgICAgIHNlbGYuY3BnX3N0YXJ0KCkKICAgICAgICB3aGlsZSBjb3VudCA+IDA6CiAgICAg
ICAgICAgIG91dHB1dCgnPj4+VGhlICVzdGggdGVzdCcgJSAoNCAtIGNvdW50KSApCiAgICAgICAg
ICAgIGlmIGtpbmQgPT0gMToKICAgICAgICAgICAgICAgIHNlbGYuZXhlY190ZXN0X3NlbGVjdCgp
CiAgICAgICAgICAgIGVsaWYga2luZCA9PSAyOgogICAgICAgICAgICAgICAgc2VsZi5leGVjX3Rl
c3RfY291bnQoKQogICAgICAgICAgICBlbGlmIGtpbmQgPT0gMzoKICAgICAgICAgICAgICAgIHNl
bGYuZXhlY190ZXN0X3NlbGVjdGFsbCgpCiAgICAgICAgICAgIGNvdW50IC09IDEKICAgICAgICAK
ICAgICAgICBvdXRwdXQoJz4+VGVzdCBXaXRob3V0IFBhdGNoJykKICAgICAgICBjb3VudCA9IHNl
bGYudGVzdHRpbWVzCiAgICAgICAgc2VsZi50ZXN0cGF0aCA9IHNlbGYub3BfaW5zdGFsbF9wYXRo
CiAgICAgICAgc2VsZi5vcGdfc3RhcnQoKQogICAgICAgIHdoaWxlIGNvdW50ID4gMDoKICAgICAg
ICAgICAgb3V0cHV0KCc+Pj5UaGUgJXN0aCB0ZXN0JyAlICg0IC0gY291bnQpICkKICAgICAgICAg
ICAgaWYga2luZCA9PSAxOgogICAgICAgICAgICAgICAgc2VsZi5leGVjX3Rlc3Rfc2VsZWN0KCkK
ICAgICAgICAgICAgZWxpZiBraW5kID09IDI6CiAgICAgICAgICAgICAgICBzZWxmLmV4ZWNfdGVz
dF9jb3VudCgpCiAgICAgICAgICAgIGVsaWYga2luZCA9PSAzOgogICAgICAgICAgICAgICAgc2Vs
Zi5leGVjX3Rlc3Rfc2VsZWN0YWxsKCkKICAgICAgICAgICAgY291bnQgLT0gMQogICAgCgoKCnAg
PSBQcmVwYXJlKCkKCmhhbmRsZV9hcmd1bWVudChwKQpwLmxvYWRfbm9kZXMoKQoKaWYgcC5jb21t
YW5ka2luZCA9PSAnYmluJzoKICAgIHAuY2xlYW5fcmVtb3RlKCkKICAgIHAucHJlcGFyZV9iaW4o
KQplbGlmIHAuY29tbWFuZGtpbmQgPT0gJ2luaXRkYic6CiAgICBwLmluaXRkYl9yZW1vdGUoKQog
ICAgcC5jaGFuZ2Vfbm9kZV9wZ2NvbmYoKQogICAgcC5jb3B5X3NxbCgpCmVsaWYgcC5jb21tYW5k
a2luZCA9PSAnZ2RhdGEnOgogICAgcC5nZW5lcmF0ZWRhdGEoKQplbGlmIHAuY29tbWFuZGtpbmQg
PT0gJ3N0YXJ0YWxsJzoKICAgIHAuc3RhcnRhbGwoKQplbGlmIHAuY29tbWFuZGtpbmQgPT0gJ3N0
b3BhbGwnOgogICAgcC5zdG9wYWxsKCkKZWxpZiBwLmNvbW1hbmRraW5kID09ICdydW5zZWxlY3Qn
OgogICAgcC5ydW50ZXN0KDEpCmVsaWYgcC5jb21tYW5ka2luZCA9PSAncnVuY291bnQnOgogICAg
cC5ydW50ZXN0KDIpCmVsaWYgcC5jb21tYW5ka2luZCA9PSAncnVuc2VsZWN0YWxsJzoKICAgIHAu
cnVudGVzdCgzKQplbGlmIHAuY29tbWFuZGtpbmQgPT0gJ2luY3JlYXNlZGF0YSc6CiAgICBwLmlu
Y3JlYXNlZGF0YSgpCmVsaWYgcC5jb21tYW5ka2luZCA9PSAncmVzZXRwYXJlbnQnOgogICAgcC5y
ZXNldHBhcmVudCgpCgAAAAAAAABzY3JpcHQvcnVudGVzdDEucHkAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAMDEwMDc3NwAwMDAwMDAwADAwMDAwMDAAMDAwMDAwMDEyMzMAMTM2MDY3NTExMTYAMDEx
NDY0ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAw
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAACMhL3Vzci9iaW4vZW52IHB5dGhvbjMKJycnClVzZSB0aGlzIHRv
IHRlc3QgaW5jcmVhc2Ugc2NhbGUgb2YgcGVyIG5vZGUKJycnCmZyb20gdXRpbCBpbXBvcnQgKgoK
dG90bGUgPSAyCgpjbWRfbGlzdCA9IFsnc3RvcGFsbCcsJ2JpbicsJ2luaXRkYicsJ2dkYXRhIDEn
LCAncnVuc2VsZWN0YWxsJ10KCmNtZF9saXN0LmFwcGVuZCgnaW5jcmVhc2VkYXRhIDEnKQpjbWRf
bGlzdC5hcHBlbmQoJ3J1bnNlbGVjdGFsbCcpCgpjbWRfbGlzdC5hcHBlbmQoJ2luY3JlYXNlZGF0
YSAzJykKY21kX2xpc3QuYXBwZW5kKCdydW5zZWxlY3RhbGwnKQoKY21kX2xpc3QuYXBwZW5kKCdp
bmNyZWFzZWRhdGEgNScpCmNtZF9saXN0LmFwcGVuZCgncnVuc2VsZWN0YWxsJykKCmNtZF9saXN0
LmFwcGVuZCgnaW5jcmVhc2VkYXRhIDEwJykKY21kX2xpc3QuYXBwZW5kKCdydW5zZWxlY3RhbGwn
KQoKY21kX2xpc3QuYXBwZW5kKCdpbmNyZWFzZWRhdGEgMTAnKQpjbWRfbGlzdC5hcHBlbmQoJ3J1
bnNlbGVjdGFsbCcpCgpjbWRfbGlzdC5hcHBlbmQoJ3N0b3BhbGwnKQoKZm9yIGl0ZW0gaW4gY21k
X2xpc3Q6CiAgICBjbWQgPSAnLi9wcmVwYXJlLnB5ICVzJyAlIGl0ZW0KICAgIG91dHB1dCgnPicg
KyBpdGVtKQogICAgZXhlY19jb21hbmRfc3lzdGVtKGNtZCwgVHJ1ZSkKb3V0cHV0KCdGSU5JU0gn
KQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABzY3JpcHQvcnVudGVzdDIucHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAMDEwMDc3NwAwMDAwMDAwADAwMDAwMDAAMDAwMDAwMDI0NzUAMTM2MDY3NTM3MDAAMDExNDc3
ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAACMhL3Vzci9iaW4vZW52IHB5dGhvbjMKZnJvbSB1dGlsIGltcG9ydCAq
Cgpub2RlX2xpc3QgPSBbJzE4LjIxNy4xNjUuMjM4JywnMy4xMzMuMTI0LjIwNScsJzE4LjIxNi4x
ODguMTA4JywnMy4xMzUuMTg3LjEyMycsJzMuMTUuMjE4LjIwNCcsICczLjE1LjIxNC4yMDUnLCAn
MTguMTg4LjExMC4yMjYnLCAnMTguMTkxLjExLjE1J10Kbm9kZV9saXN0X2xlbiA9IGxlbihub2Rl
X2xpc3QpCm5vZGVfbWF4ID0gOAoKZ2VuZXJhdGVfbm9kZV9jb25mKG5vZGVfbGlzdCwgbm9kZV9s
aXN0X2xlbiwgbm9kZV9saXN0X2xlbikKCmNtZF9saXN0ID0gWydzdG9wYWxsJywnYmluJywnaW5p
dGRiJywnZ2RhdGEgMTAnXQpmb3IgaXRlbSBpbiBjbWRfbGlzdDoKICAgIGNtZCA9ICcuL3ByZXBh
cmUucHkgJXMnICUgaXRlbQogICAgb3V0cHV0KCc+JyArIGl0ZW0pCiAgICBleGVjX2NvbWFuZF9z
eXN0ZW0oY21kLCBUcnVlKQoKbG9vcCA9IDIKd2hpbGUgbG9vcCA8PSBub2RlX21heDoKICAgIG91
dHB1dCgnPnRlc3QgaW4gJXMgbm9kZXMnICUgbG9vcCkKICAgIGdlbmVyYXRlX25vZGVfY29uZihu
b2RlX2xpc3QsIG5vZGVfbGlzdF9sZW4sIGxvb3ApCiAgICBsb29wICs9IDEKICAgIGNtZF9saXN0
ID0gWydyZXNldHBhcmVudCcsICdydW5zZWxlY3QnXQogICAgZm9yIGl0ZW0gaW4gY21kX2xpc3Q6
CiAgICAgICAgY21kID0gJy4vcHJlcGFyZS5weSAlcycgJSBpdGVtCiAgICAgICAgb3V0cHV0KCc+
JyArIGl0ZW0pCiAgICAgICAgZXhlY19jb21hbmRfc3lzdGVtKGNtZCwgVHJ1ZSkKCgoKY21kX2xp
c3QgPSBbJ2dkYXRhIDInXQpmb3IgaXRlbSBpbiBjbWRfbGlzdDoKICAgIGNtZCA9ICcuL3ByZXBh
cmUucHkgJXMnICUgaXRlbQogICAgb3V0cHV0KCc+JyArIGl0ZW0pCiAgICBleGVjX2NvbWFuZF9z
eXN0ZW0oY21kLCBUcnVlKQoKbm9kZV9tYXggPSA1Cmxvb3AgPSAyCndoaWxlIGxvb3AgPD0gbm9k
ZV9tYXg6CiAgICBvdXRwdXQoJz50ZXN0IGluICVzIG5vZGVzJyAlIGxvb3ApCiAgICBnZW5lcmF0
ZV9ub2RlX2NvbmYobm9kZV9saXN0LCBub2RlX2xpc3RfbGVuLCBsb29wKQogICAgbG9vcCArPSAx
CiAgICBjbWRfbGlzdCA9IFsncmVzZXRwYXJlbnQnLCAncnVuc2VsZWN0YWxsJ10KICAgIGZvciBp
dGVtIGluIGNtZF9saXN0OgogICAgICAgIGNtZCA9ICcuL3ByZXBhcmUucHkgJXMnICUgaXRlbQog
ICAgICAgIG91dHB1dCgnPicgKyBpdGVtKQogICAgICAgIGV4ZWNfY29tYW5kX3N5c3RlbShjbWQs
IFRydWUpCgpjbWQgPSAnLi9wcmVwYXJlLnB5IHN0b3BhbGwnCm91dHB1dCgnPnN0b3BhbGwnKQpl
eGVjX2NvbWFuZF9zeXN0ZW0oY21kLCBUcnVlKQpvdXRwdXQoJ0ZJTklTSCcpCgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAHNjcmlwdC9ydW50ZXN0My5weQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw
MTAwNzc3ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDU3NQAxMzYwNTc1MjY3NwAwMTE1MTIAIDAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwpmcm9tIHV0aWwgaW1wb3J0ICoKCm5v
ZGVfbGlzdCA9IFsnMTMuNTkuMjIuMTUzJywgJzMuMTMzLjE1NC4yMDInLCczLjEzNi4yMi4xOTkn
LCczLjEzMy4xMzYuMTEzJ10KZ2VuZXJhdGVfbm9kZV9jb25mKG5vZGVfbGlzdCxsZW4obm9kZV9s
aXN0KSwgNCkKCmNtZF9saXN0ID0gWydzdG9wYWxsJywnYmluJywnaW5pdGRiJywnZ2RhdGEgMScs
ICdydW5zZWxlY3QnLCdydW5jb3VudCcsJ3N0b3BhbGwnXQpmb3IgaXRlbSBpbiBjbWRfbGlzdDoK
ICAgIGNtZCA9ICcuL3ByZXBhcmUucHkgJXMnICUgaXRlbQogICAgb3V0cHV0KCc+JyArIGl0ZW0p
CiAgICBleGVjX2NvbWFuZF9zeXN0ZW0oY21kLCBUcnVlKQpvdXRwdXQoJ0ZJTklTSCcpAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAABzY3JpcHQvdXRpbC5weQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEw
MDc3NwAwMDAwMDAwADAwMDAwMDAAMDAwMDAwMDUwMTIAMTM2MDU3NTMxMjYAMDEwNjU1ACAwAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAACMhL3Vzci9iaW4vZW52IHB5dGhvbjMNCmltcG9ydCBvcw0KaW1wb3J0IHN5cw0K
aW1wb3J0IHRpbWUNCmltcG9ydCB0aHJlYWRpbmcNCg0KY2xhc3MgbXlUaHJlYWQgKHRocmVhZGlu
Zy5UaHJlYWQpOg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jLCB0dXBsZV9pdGVtLCBsb29w
LCBsb29wMik6DQogICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikNCiAgICAg
ICAgc2VsZi5mdW5jID0gZnVuYw0KICAgICAgICBzZWxmLnR1cGxlX2l0ZW0gPSB0dXBsZV9pdGVt
DQogICAgICAgIHNlbGYubG9vcCA9IGxvb3ANCiAgICAgICAgc2VsZi5sb29wMiA9IGxvb3AyDQog
ICAgZGVmIHJ1bihzZWxmKTogDQogICAgICAgIHNlbGYuZnVuYyhzZWxmLnR1cGxlX2l0ZW0sIHNl
bGYubG9vcCwgc2VsZi5sb29wMikNCg0KZGVmIGdldF9lbnYoZW52KToNCiAgICByZXR1cm4gb3Mu
Z2V0ZW52KGVudikNCg0KZGVmIG91dHB1dChtZXNzYWdlKToNCiAgICBwcmludChtZXNzYWdlKQ0K
ICAgIHN5cy5zdGRvdXQuZmx1c2goKQ0KDQpkZWYgZGVidWdfb3V0cHV0KG1lc3NhZ2UpOg0KICAg
IGRlYnVnX2VuYWJsZSA9IEZhbHNlDQogICAgaWYoZGVidWdfZW5hYmxlKToNCiAgICAgICAgb3V0
cHV0KG1lc3NhZ2UpDQoNCmRlZiBzdGFuZGVyX291dHB1dChtZXNzYWdlKToNCiAgICBwcmludCht
ZXNzYWdlKQ0KDQpkZWYgZXJyb3JfZXhpdChtZXNzYWdlKToNCiAgICBpZiBtZXNzYWdlOg0KICAg
ICAgICBvdXRwdXQobWVzc2FnZSkNCiAgICBzeXMuZXhpdCgxKQ0KDQpkZWYgbm9tYWxfZXhpdCht
ZXNzYWdlKToNCiAgICBpZiBtZXNzYWdlOg0KICAgICAgICBvdXRwdXQobWVzc2FnZSkNCiAgICBz
eXMuZXhpdCgwKQ0KDQpkZWYgcGF0aF9zcGxpY2UocGF0aDEsIHBhdGgyLCBzeXN0ZW10eXBlKToN
CiAgICByZXR1cm4gb3MucGF0aC5qb2luKHBhdGgxLHBhdGgyKQ0KDQpkZWYgZmlsZV9leGlzdChw
YXRoKToNCiAgICByZXR1cm4gb3MucGF0aC5pc2ZpbGUocGF0aCkNCg0KZGVmIGRpcl9leGlzdChw
YXRoKToNCiAgICByZXR1cm4gb3MucGF0aC5pc2RpcihwYXRoKQ0KDQpkZWYgZXhlY19jb21hbmRf
c3lzdGVtKHRoZWNvbW1hbmQsIG91dGxvZz1GYWxzZSwgcmVwb3J0PVRydWUpOg0KICAgIGRlYnVn
X291dHB1dCh0aGVjb21tYW5kKQ0KICAgIGlmIG5vdCBvdXRsb2c6DQogICAgICAgIHRoZWNvbW1h
bmQgKz0gJyA+IC9kZXYvbnVsbCAyPiYxJw0KICAgIHJlc3VsdD1vcy5zeXN0ZW0odGhlY29tbWFu
ZCkNCiAgICBpZiAwICE9IHJlc3VsdCBhbmQgcmVwb3J0Og0KICAgICAgICBlcnJvcl9leGl0KCJG
YWlsIHRvIHJ1biBjb21tYW5kICVzIiAlICh0aGVjb21tYW5kKSkNCg0KZGVmIGV4ZWNfY29tbWFu
ZF9zeXN0ZW1fcmVtb3RlKHRoZWNvbW1hbmQsIHVzZXIsIGhvc3QsIHJlcG9ydGVycm9yPVRydWUs
IG91dGxvZz1GYWxzZSk6DQogICAgaWYgbm90IG91dGxvZzoNCiAgICAgICAgdGhlY29tbWFuZCAr
PSAnID4gL2Rldi9udWxsIDI+JjEnDQogICAgY21kID0gJ3NzaCAtdCAtaSB+L2hpZ2hnb2tleS5w
ZW0gJXNAJXMgXCIlc1wiJyAlICh1c2VyLCBob3N0LCB0aGVjb21tYW5kKQ0KDQogICAgcmVzdWx0
PW9zLnN5c3RlbShjbWQpDQogICAgaWYgMCAhPSByZXN1bHQ6DQogICAgICAgIGlmIHJlcG9ydGVy
cm9yOg0KICAgICAgICAgICAgZXJyb3JfZXhpdCgiRmFpbCB0byBydW4gY29tbWFuZCAlcyIgJSAo
Y21kKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgIHJldHVy
biBUcnVlDQoNCmRlZiBkaXJfcmVtb3RlX2V4aXN0KHBhdGgsIHVzZXIsIGhvc3QpOg0KICAgIGNt
ZCA9ICdscyAlcycgJSBwYXRoDQogICAgcmV0dWx0ID0gZXhlY19jb21tYW5kX3N5c3RlbV9yZW1v
dGUoY21kLCB1c2VyLCBob3N0LCBGYWxzZSkNCiAgICByZXR1cm4gcmV0dWx0DQoNCmRlZiBzbGVl
cCh0aW1lMSk6DQogICAgdGltZS5zbGVlcCh0aW1lMSkNCg0KZGVmIGdldGN3ZCgpOg0KICAgIHJl
dHVybiBvcy5nZXRjd2QoKQ0KDQpkZWYgY2hkaXIocGF0aCk6DQogICAgb3MuY2hkaXIocGF0aCkN
Cg0KZGVmIGdldHRpbWUoKToNCiAgICByID0gdGltZS50aW1lKCkNCiAgICByZXR1cm4gcg0KDQpk
ZWYgZ2VuZXJhdGVfbm9kZV9jb25mKG5vZGVfbGlzdCwgbm9kZV9saXN0X2xlbiwgbnVtKToNCg0K
ICAgIHpzID0gaW50KG51bSAvIG5vZGVfbGlzdF9sZW4pDQogICAgeXMgPSBpbnQobnVtICUgbm9k
ZV9saXN0X2xlbikNCiAgICANCiAgICBsb29wID0gMA0KICAgIGZpbGUgPSBvcGVuKCdub2RlX2Nv
bmYnLCAndycpDQogICAgd2hpbGUgbG9vcCA8IG51bToNCiAgICAgICAgY3VyX25vZGVfbnVtID0g
enMNCiAgICAgICAgaWYgbG9vcCArIDEgPD0geXM6DQogICAgICAgICAgICBjdXJfbm9kZV9udW0g
Kz0gMQ0KDQogICAgICAgIGlmIGxvb3AgKyAxID4gbm9kZV9saXN0X2xlbjoNCiAgICAgICAgICAg
IGJyZWFrDQoNCiAgICAgICAgZmlsZS53cml0ZShzdHIobm9kZV9saXN0W2xvb3BdKSkNCiAgICAg
ICAgDQogICAgICAgIGZpbGUud3JpdGUoJyAlc1xuJyAlIGN1cl9ub2RlX251bSkNCiAgICAgICAg
bG9vcCArPSAxDQoNCg0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA=

------=_001_NextPart115848830721_=------