[Edu-sig] Steps for making a Fractal with Python

Markus Gritsch gritsch@iue.tuwien.ac.at
Tue, 10 Jul 2001 09:12:22 +0200


This is a multi-part message in MIME format.
--------------BFD45A5A87DC8AE4E557A208
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: base64

S2lyYnkgVXJuZXIgd3JvdGU6DQoNCj4gVGhlIHNvdXJjZSBkZWZpbmVzIGFuIEltYWdlIHRo
ZW4gdXNlcyBpbS5wdXRwaXhlbCgoaSxqKSx2YWx1ZSkNCj4gaW4gYSBsb29wIHRocm91Z2gg
YWxsIChpLGopIGltYWdlIGNvb3JkaW5hdGVzLCB0byBlYWNoIG9mIHdoaWNoDQo+IHRoZXJl
IGNvcnJlc3BvbmRzIGEgY29tcGxleCBudW1iZXIsIHdoaWNoIGZlZWRzIGludG8gYSBzcGVj
aWFsDQo+IGxvb3AgYW5kIGVpdGhlciBkaXZlcmdlcyBvciBjb252ZXJnZXMgYWZ0ZXIgbiBp
dGVyYXRpb25zLg0KDQpJIHRoaW5rIGRvaW5nIGFsbCB0aGUgbG9vcGluZyBmb3IgZXZlcnkg
c2luZ2xlIGNvb3JkaW5hdGUgaW4gUHl0aG9uIG11c3QgYmUNCnF1aXRlIHNsb3cgY29tcGFy
ZWQgdG8gZG9pbmcgaXQgaW4gQy4gIFNvbWUgbW9udGggYWdvLCB0aGVyZSB3YXMgYW4gaW50
ZXJlc3RpbmcNCm9wdGltaXphdGlvbiBvZiBhIE1hbmRlbGJyb3QtcHJvZ3JhbSBvbiB0aGUg
d3hQeXRob24gbWFpbGluZyBsaXN0LiAgVGhlIHRyaWNrDQp3YXMgdG8gdXNlIE51bWVyaWMg
dG8gcGVyZm9ybSBtYXRyaXgtbXVsdGlwbGljYXRpb25zIG9mIHRoZSAqd2hvbGUqIHBpY3R1
cmUsDQphbmQgdGFrZSBhIGxvb2sgYWZ0ZXIgZXZlcnkgbXVsdGlwbGljYXRpb24gd2hpY2gg
cGl4ZWxzIGZ1bGZpbGxlZCB0aGUNCmNvbnZlcmdlbmNlLWNvbmRpdGlvbi4gIEhlcmUgaXMg
dGhlIHJlbGV2YW50IGNvZGUsIHRoZSBmdWxsIHByb2dyYW0gaXMNCmF0dGFjaGVkLg0KDQog
ICAgICAgIHdoaWxlIChpdGVyYXRpb25zIDwgc2VsZi5NQVhfSVRFUkFUSU9OUykgYW5kIGxl
bihpX25vKToNCiAgICAgICAgICAgICMgZG8gdGhlIGNhbGN1bGF0aW9ucyBpbi1wbGFjZQ0K
ICAgICAgICAgICAgTnVtZXJpYy5tdWx0aXBseSh6Xywgel8sIHpfKQ0KICAgICAgICAgICAg
TnVtZXJpYy5hZGQoel8sIGNfLCB6XykNCiAgICAgICAgICAgIG92ZXJmbG93ID0gTnVtZXJp
Yy5ncmVhdGVyX2VxdWFsKGFicyh6XyksIDIuMCkNCiAgICAgICAgICAgIG5vdF9vdmVyZmxv
dyA9IE51bWVyaWMubG9naWNhbF9ub3Qob3ZlcmZsb3cpDQogICAgICAgICAgICAjIGdldCB0
aGUgaW5kaWNlcyB3aGVyZSBvdmVyZmxvdyBvY2N1cmVkDQogICAgICAgICAgICAjIyMjb3Zl
cmZsb3dJbmRpY2VzID0gTnVtZXJpYy5jb21wcmVzcyhvdmVyZmxvdywgaV9ubykgIyBzbG93
ZXINCiAgICAgICAgICAgIG92ZXJmbG93SW5kaWNlcyA9IE51bWVyaWMucmVwZWF0KGlfbm8s
IG92ZXJmbG93KSAjIGZhc3Rlcg0KICAgICAgICAgICAgIyBzZXQgdGhlIHBpeGVsIGluZGlj
ZXMgdGhlcmUNCiAgICAgICAgICAgIGZvciBpZHggaW4gb3ZlcmZsb3dJbmRpY2VzOg0KICAg
ICAgICAgICAgICAgIGRhdGFbaWR4XSA9IGl0ZXJhdGlvbnMNCiAgICAgICAgICAgICMgY29t
cHV0ZSB0aGUgbmV3IGFycmF5IG9mIG5vbi1vdmVyZmxvdyBpbmRpY2VzDQogICAgICAgICAg
ICBpX25vID0gTnVtZXJpYy5yZXBlYXQoaV9ubywgbm90X292ZXJmbG93KQ0KICAgICAgICAg
ICAgIyB1cGRhdGUgdGhlIHRvZG8gYXJyYXlzDQogICAgICAgICAgICBjXyA9IE51bWVyaWMu
cmVwZWF0KGNfLCBub3Rfb3ZlcmZsb3cpDQogICAgICAgICAgICB6XyA9IE51bWVyaWMucmVw
ZWF0KHpfLCBub3Rfb3ZlcmZsb3cpDQogICAgICAgICAgICBpdGVyYXRpb25zID0gaXRlcmF0
aW9ucyArIDENCg0KDQpFbmpveSwgTWFya3VzDQoNCg==
--------------BFD45A5A87DC8AE4E557A208
Content-Type: application/octet-stream;
 name="mandelbrot10.py"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="mandelbrot10.py"

IyEgL3Vzci9iaW4vZW52IHB5dGhvbiANCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIzk0eDc4IyMNCg0KIiIiDQpNYW5kZWxicm90IHByb2dyYW0sIGZvciBubyBwYXJ0aWN1
bGFyIHJlYXNvbi4NCg0KICAgICAgICBKb2huIEZhcnJlbGw6IGluaXRpYWwgdmVyc2lvbg0K
ICAgICAgICAgIFJvYmluIER1bm46IGludHJvZHVjZWQgd3hJbWFnZS5TZXREYXRhIGluc3Rl
YWQgb2Ygd3hCaXRtYXBGcm9tRGF0YQ0KICAgIElvbmVsIFNpbWlvbmVzY3U6IHVzZWQgdGhl
IE51bWVyaWMgcGFja2FnZSwgYW5kIHJld3JvdGUgYWxsIG9mIHRoZQ0KICAgICAgICAgICAg
ICAgICAgICAgICAgY29tcHV0YXRpb24gYW5kIGRhdGEgZGlzcGxheWluZyBjb2RlDQpBbGV4
YW5kZXIgU21pc2hsYWpldjogc3VnZ2VzdGlvbnMgb24gb3B0aW1pc2luZyBsb29wcyBhbmQg
ZHJhd2luZw0KICAgICAgTWFya3VzIEdyaXRzY2g6IGluLXBsYWNlIGNhbGN1bGF0aW9uIGlu
IHRoZSBtYW5kZWxicm90IHdoaWxlIGxvb3ANCiAgICAgICBNaWtlIEZsZXRjaGVyOiBtaW5v
ciBjaGFuZ2VzDQoiIiINCg0KaW1wb3J0IE51bWVyaWMNCmNsYXNzIE1hbmRlbGJyb3RHZW5l
cmF0b3I6DQogICAgJycnU2xpZ2h0bHkgc2xvd2VyIG1hbmRlbGJyb3QgZ2VuZXJhdG9yLCB0
aGlzIG9uZSB1c2VzIGluc3RhbmNlIGF0dHJpYnV0ZXMgaW5zdGVhZCBvZg0KICAgIGdsb2Jh
bHMgYW5kIHByb3ZpZGVzIGZvciAidGlsaW5nIiBkaXNwbGF5JycnDQogICAgZGVmIF9faW5p
dF9fKCBzZWxmLCB3aWR0aD0yMDAsIGhlaWdodD0yMDAsIGNvb3JkaW5hdGVzPSgoLTIuMCwt
MS41KSwoMS4wLDEuNSkpLA0KICAgICAgICAgICAgICAgICAgeGRpdmlzb3I9MCwgeWRpdmlz
b3I9MCwgaXRlcmF0aW9ucyA9IDI1NSwgcmVkcmF3Q2FsbGJhY2s9Tm9uZSwNCiAgICAgICAg
ICAgICAgICAgIHN0YXR1c0NhbGxiYWNrPU5vbmUgKToNCiAgICAgICAgc2VsZi53aWR0aCA9
IHdpZHRoDQogICAgICAgIHNlbGYuaGVpZ2h0ID0gaGVpZ2h0DQogICAgICAgIHNlbGYuY29v
cmRpbmF0ZXMgPSBjb29yZGluYXRlcw0KICAgICAgICAjIyMgc2hvdWxkIGNoZWNrIGZvciBy
ZW1haW5kZXJzIHNvbWV3aGVyZSBhbmQgYmUgYSBsaXR0bGUNCiAgICAgICAgIyBzbWFydGVy
IGFib3V0IHZhbGlkIHJhbmdlcyBmb3IgZGl2aXNvcnMgKDEwMHMgb2YgZGl2aXNpb25zDQog
ICAgICAgICMgaW4gYm90aCBkaXJlY3Rpb25zIG1lYW5zIDEwMDAwcyBvZiBjYWxjcykuLi4N
CiAgICAgICAgaWYgbm90IHhkaXZpc29yOg0KICAgICAgICAgICAgeGRpdmlzb3IgPSAxICN3
aWR0aC81MCBvciAxDQogICAgICAgIGlmIG5vdCB5ZGl2aXNvcjoNCiAgICAgICAgICAgIHlk
aXZpc29yID0gMTAgI2hlaWdodC81MCBvciAxDQogICAgICAgIHNlbGYueGRpdmlzb3IgPSB4
ZGl2aXNvcg0KICAgICAgICBzZWxmLnlkaXZpc29yID0geWRpdmlzb3INCiAgICAgICAgc2Vs
Zi5yZWRyYXdDYWxsYmFjayA9IHJlZHJhd0NhbGxiYWNrDQogICAgICAgIHNlbGYuc3RhdHVz
Q2FsbGJhY2sgPSBzdGF0dXNDYWxsYmFjayBvciBzZWxmLnByaW50U3RhdHVzDQogICAgICAg
IHNlbGYuTUFYX0lURVJBVElPTlMgPSBpdGVyYXRpb25zDQogICAgICAgIHNlbGYuZGF0YSA9
IE51bWVyaWMuemVyb3Mod2lkdGgqaGVpZ2h0KQ0KICAgICAgICBzZWxmLmRhdGEuc2hhcGUg
PSAod2lkdGgsIGhlaWdodCkNCiAgICAgICAgIyMjIFNldCB1cCB0aWxpbmcgaW5mbywgc2hv
dWxkIHJlYWxseSBqdXN0IGRvIGFsbCB0aGUgc2V0dXAgaGVyZSBhbmQgdXNlIGENCiAgICAg
ICAgIyMjIHJhbmRvbSBjaG9pY2UgdG8gZGVjaWRlIHdoaWNoIHRpbGUgdG8gY29tcHV0ZSBu
ZXh0DQogICAgICAgIHNlbGYuY3VycmVudFRpbGUgPSAoLTEsMCkNCiAgICAgICAgc2VsZi50
aWxlRGltZW5zaW9ucyA9ICggd2lkdGgveGRpdmlzb3IsIGhlaWdodC95ZGl2aXNvciApDQog
ICAgICAgIHNlbGYudGlsZVNpemUgPSAod2lkdGgveGRpdmlzb3IpKiAoaGVpZ2h0L3lkaXZp
c29yKQ0KICAgICAgICAoeGEseWEpLCh4Yix5YikgPSBjb29yZGluYXRlcw0KICAgICAgICBz
ZWxmLnhfc3RhcnRzID0gTnVtZXJpYy5hcmFuZ2UoIHhhLCB4YisoKHhiLXhhKS94ZGl2aXNv
ciksICh4Yi14YSkveGRpdmlzb3IpDQogICAgICAgIHNlbGYueV9zdGFydHMgPSBOdW1lcmlj
LmFyYW5nZSggeWEsIHliKygoeWIteWEpL3lkaXZpc29yKSwgKHliLXlhKS95ZGl2aXNvcikN
CiAgICBkZWYgRG9BbGxUaWxlcyggc2VsZiApOg0KICAgICAgICB3aGlsZSBzZWxmLkRvVGls
ZSgpOg0KICAgICAgICAgICAgcGFzcw0KICAgIGRlZiBEb1RpbGUoIHNlbGYsIGV2ZW50PU5v
bmUgKToNCiAgICAgICAgJycnVHJpZ2dlcmVkIGV2ZW50IHRvIGRyYXcgYSBzaW5nbGUgdGls
ZSBpbnRvIHRoZSBkYXRhIG9iamVjdCcnJw0KICAgICAgICB4X2luZGV4LCB5X2luZGV4ID0g
c2VsZi5jdXJyZW50VGlsZQ0KICAgICAgICBpZiB4X2luZGV4IDwgc2VsZi54ZGl2aXNvci0x
Og0KICAgICAgICAgICAgc2VsZi5jdXJyZW50VGlsZSA9IHhfaW5kZXgsIHlfaW5kZXggPSB4
X2luZGV4KzEsIHlfaW5kZXgNCiAgICAgICAgZWxpZiB5X2luZGV4IDwgc2VsZi55ZGl2aXNv
ci0xOg0KICAgICAgICAgICAgc2VsZi5jdXJyZW50VGlsZSA9IHhfaW5kZXgsIHlfaW5kZXgg
PSAwLCB5X2luZGV4KzENCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIHNlbGYucmVk
cmF3Q2FsbGJhY2s6DQogICAgICAgICAgICAgICAgc2VsZi5yZWRyYXdDYWxsYmFjayggc2Vs
Zi5kYXRhLCAwKQ0KICAgICAgICAgICAgcmV0dXJuIDANCiAgICAgICAgcHJpbnQgJ3N0YXJ0
aW5nIGl0ZXJhdGlvbicsIHhfaW5kZXgsIHlfaW5kZXgNCiAgICAgICAgY29vcmRzID0gKCAo
c2VsZi54X3N0YXJ0c1t4X2luZGV4XSxzZWxmLnlfc3RhcnRzW3lfaW5kZXhdKSwNCiAgICAg
ICAgICAgICAgICAgICAoc2VsZi54X3N0YXJ0c1t4X2luZGV4KzFdLHNlbGYueV9zdGFydHNb
eV9pbmRleCsxXSksICApDQogICAgICAgIHBhcnQgPSBzZWxmLl90aWxlKCBjb29yZHMgKQ0K
ICAgICAgICBwYXJ0LnNoYXBlID0gc2VsZi50aWxlRGltZW5zaW9uc1sxXSxzZWxmLnRpbGVE
aW1lbnNpb25zWzBdDQogICAgICAgIHNlbGYuZGF0YVsoc2VsZi5oZWlnaHQvc2VsZi55ZGl2
aXNvcikqeV9pbmRleDooc2VsZi5oZWlnaHQvc2VsZi55ZGl2aXNvcikqDQogICAgICAgICAg
ICAgICAgICAoeV9pbmRleCsxKSwNCiAgICAgICAgICAgICAgICAgIChzZWxmLndpZHRoL3Nl
bGYueGRpdmlzb3IpKnhfaW5kZXg6KHNlbGYud2lkdGgvc2VsZi54ZGl2aXNvcikqDQogICAg
ICAgICAgICAgICAgICAoeF9pbmRleCsxKSwgXSA9IHBhcnQNCiAgICAgICAgaWYgc2VsZi5y
ZWRyYXdDYWxsYmFjazoNCiAgICAgICAgICAgIHNlbGYucmVkcmF3Q2FsbGJhY2soIHNlbGYu
ZGF0YSwgMSApICMgdGhlcmUgbWF5IGJlIG1vcmUgdG8gZG8uLi4NCiAgICAgICAgcmV0dXJu
IDENCiAgICBkZWYgcHJpbnRTdGF0dXMoc2VsZiwgKmFyZ3VtZW50cyApOg0KICAgICAgICBw
YXNzICNwcmludCBhcmd1bWVudHMNCiAgICBkZWYgX3RpbGUoc2VsZiwgY29vcmRpbmF0ZXMp
Og0KICAgICAgICAiIiJDYWxjdWxhdGUgYSBzaW5nbGUgdGlsZSdzIHZhbHVlIiIiDQojIyAg
ICAgIHByaW50ICd0aWxlJw0KICAgICAgICAoYywgeikgPSBzZWxmLl9zZXR1cChjb29yZGlu
YXRlcykNCiAgICAgICAgaXRlcmF0aW9ucyA9IDANCiAgICAgICAgc2l6ZSA9IHNlbGYudGls
ZVNpemUNCiAgICAgICAgaV9ubyA9IE51bWVyaWMuYXJhbmdlKHNpemUpICAgICAgICMgbm9u
LW92ZXJmbG93IGluZGljZXMNCiAgICAgICAgZGF0YSA9IHNlbGYuTUFYX0lURVJBVElPTlMg
KyBOdW1lcmljLnplcm9zKHNpemUpDQogICAgICAgICMgaW5pdGlhbGl6ZSB0aGUgInRvZG8i
IGFycmF5czsNCiAgICAgICAgIyB0aGV5IHdpbGwgY29udGFpbiBqdXN0IHRoZSBzcG90cyB3
aGVyZSB3ZSBzdGlsbCBuZWVkIHRvIGl0ZXJhdGUNCiAgICAgICAgY18gPSBOdW1lcmljLmFy
cmF5KGMpLmFzdHlwZShOdW1lcmljLkNvbXBsZXgzMikNCiAgICAgICAgel8gPSBOdW1lcmlj
LmFycmF5KHopLmFzdHlwZShOdW1lcmljLkNvbXBsZXgzMikNCiAgICAgICAgcHJvZ3Jlc3NN
b25pdG9yID0gc2VsZi5zdGF0dXNDYWxsYmFjaw0KICAgICAgICB3aGlsZSAoaXRlcmF0aW9u
cyA8IHNlbGYuTUFYX0lURVJBVElPTlMpIGFuZCBsZW4oaV9ubyk6DQogICAgICAgICAgICAj
IGRvIHRoZSBjYWxjdWxhdGlvbnMgaW4tcGxhY2UNCiAgICAgICAgICAgIE51bWVyaWMubXVs
dGlwbHkoel8sIHpfLCB6XykNCiAgICAgICAgICAgIE51bWVyaWMuYWRkKHpfLCBjXywgel8p
DQogICAgICAgICAgICBvdmVyZmxvdyA9IE51bWVyaWMuZ3JlYXRlcl9lcXVhbChhYnMoel8p
LCAyLjApDQogICAgICAgICAgICBub3Rfb3ZlcmZsb3cgPSBOdW1lcmljLmxvZ2ljYWxfbm90
KG92ZXJmbG93KQ0KICAgICAgICAgICAgIyBnZXQgdGhlIGluZGljZXMgd2hlcmUgb3ZlcmZs
b3cgb2NjdXJlZA0KICAgICAgICAgICAgIyMjI292ZXJmbG93SW5kaWNlcyA9IE51bWVyaWMu
Y29tcHJlc3Mob3ZlcmZsb3csIGlfbm8pICMgc2xvd2VyDQogICAgICAgICAgICBvdmVyZmxv
d0luZGljZXMgPSBOdW1lcmljLnJlcGVhdChpX25vLCBvdmVyZmxvdykgIyBmYXN0ZXINCiAg
ICAgICAgICAgICMgc2V0IHRoZSBwaXhlbCBpbmRpY2VzIHRoZXJlDQogICAgICAgICAgICBm
b3IgaWR4IGluIG92ZXJmbG93SW5kaWNlczoNCiAgICAgICAgICAgICAgICBkYXRhW2lkeF0g
PSBpdGVyYXRpb25zDQogICAgICAgICAgICAjIGNvbXB1dGUgdGhlIG5ldyBhcnJheSBvZiBu
b24tb3ZlcmZsb3cgaW5kaWNlcw0KICAgICAgICAgICAgaV9ubyA9IE51bWVyaWMucmVwZWF0
KGlfbm8sIG5vdF9vdmVyZmxvdykNCiAgICAgICAgICAgICMgdXBkYXRlIHRoZSB0b2RvIGFy
cmF5cw0KICAgICAgICAgICAgY18gPSBOdW1lcmljLnJlcGVhdChjXywgbm90X292ZXJmbG93
KQ0KICAgICAgICAgICAgel8gPSBOdW1lcmljLnJlcGVhdCh6Xywgbm90X292ZXJmbG93KQ0K
ICAgICAgICAgICAgaXRlcmF0aW9ucyA9IGl0ZXJhdGlvbnMgKyAxDQogICAgICAgICAgICBw
cm9ncmVzc01vbml0b3IoaXRlcmF0aW9ucywgMTAwLjAgKiBsZW4oaV9ubykgLyBzaXplKQ0K
ICAgICAgICByZXR1cm4gZGF0YQ0KICAgIGRlZiBfc2V0dXAoc2VsZiwgY29vcmRpbmF0ZXMp
Og0KICAgICAgICAnJydzZXR1cCBmb3IgcHJvY2Vzc2luZyBvZiBhIHNpbmdsZSB0aWxlJycn
DQogICAgICAgICMgd2UgdXNlIGEgc2luZ2xlIGFycmF5IGZvciB0aGUgcmVhbCB2YWx1ZXMg
Y29ycmVzcG9uZGluZyB0byB0aGUgeCBjb29yZGluYXRlcw0KICAgICAgICB3aWR0aCwgaGVp
Z2h0ID0gc2VsZi50aWxlRGltZW5zaW9ucw0KICAgICAgICBkaWZmID0gY29vcmRpbmF0ZXNb
MV1bMF0gLSBjb29yZGluYXRlc1swXVswXQ0KICAgICAgICB4cyA9IDBqICsgKGNvb3JkaW5h
dGVzWzBdWzBdICsgTnVtZXJpYy5hcmFuZ2Uod2lkdGgpLmFzdHlwZShOdW1lcmljLkZsb2F0
MzIpICoNCiAgICAgICAgICAgICAgICAgICBkaWZmIC8gd2lkdGggKQ0KICAgICAgICAjIHdl
IHVzZSBhIHNpbmdsZSBhcnJheSBmb3IgdGhlIGltYWdpbmFyeSB2YWx1ZXMgY29ycmVzcG9u
ZGluZyB0byB0aGUgeSBjb29yZGluYXRlcw0KICAgICAgICBkaWZmID0gY29vcmRpbmF0ZXNb
MV1bMV0gLSBjb29yZGluYXRlc1swXVsxXQ0KICAgICAgICB5cyA9IDFqICogKGNvb3JkaW5h
dGVzWzBdWzFdICsgTnVtZXJpYy5hcmFuZ2UoaGVpZ2h0KS5hc3R5cGUoTnVtZXJpYy5GbG9h
dDMyKSAqDQogICAgICAgICAgICAgICAgICAgZGlmZiAvIGhlaWdodCApDQogICAgICAgICMg
d2UgYnVpbGQgPGM+IGluIGRpcmVjdCBjb3JyZXBvbmRlbmNlIHdpdGggdGhlIHBpeGVscyBp
biB0aGUgaW1hZ2UNCiAgICAgICAgYyA9IE51bWVyaWMuYWRkLm91dGVyKHlzLCB4cykNCiAg
ICAgICAgeiA9IE51bWVyaWMuemVyb3MoKGhlaWdodCwgd2lkdGgpKS5hc3R5cGUoTnVtZXJp
Yy5Db21wbGV4MzIpDQogICAgICAgICMgdXNlIGZsYXR0ZW5lZCByZXByZXNlbnRhdGlvbnMg
Zm9yIGVhc2llciBoYW5kbGluZyBvZiBhcnJheSBlbGVtZW50cw0KICAgICAgICBjID0gTnVt
ZXJpYy5yYXZlbChjKQ0KICAgICAgICB6ID0gTnVtZXJpYy5yYXZlbCh6KQ0KICAgICAgICBy
ZXR1cm4gKGMsIHopDQoNCnRyeToNCiMjICAgICAgcmFpc2UgSW1wb3J0RXJyb3INCiAgICBm
cm9tIHd4UHl0aG9uLnd4IGltcG9ydCAqDQogICAgY2xhc3MgTWFuZGVsQ2FudmFzKHd4V2lu
ZG93KToNCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgaWQgPSAtMSwgd2lk
dGg9NjAwLCBoZWlnaHQ9NjAwLA0KICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXM9
KCgtMi4wLC0xLjUpLCgxLjAsMS41KSksIHdlaWdodHMgPSgxNiwxLDMyKSwNCiAgICAgICAg
ICAgICAgICAgICAgIGl0ZXJhdGlvbnM9MjU1LCB4ZGl2aXNvcj0wLCB5ZGl2aXNvcj0wKToN
CiAgICAgICAgICAgIHd4Lnd4V2luZG93Ll9faW5pdF9fKHNlbGYsIHBhcmVudCwgaWQpDQog
ICAgICAgICAgICBzZWxmLndpZHRoICA9IHdpZHRoDQogICAgICAgICAgICBzZWxmLmhlaWdo
dCA9IGhlaWdodA0KICAgICAgICAgICAgc2VsZi5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVz
DQogICAgICAgICAgICBzZWxmLndlaWdodHMgPSB3ZWlnaHRzDQogICAgICAgICAgICBzZWxm
LnBhcmVudCA9IHBhcmVudA0KICAgICAgICAgICAgc2VsZi5ib3JkZXIgPSAoMSwxKQ0KICAg
ICAgICAgICAgc2VsZi5TZXRTaXplKHd4U2l6ZSh3aWR0aCwgaGVpZ2h0KSkNCiAgICAgICAg
ICAgIHNlbGYuU2V0QmFja2dyb3VuZENvbG91cih3eC53eE5hbWVkQ29sb3VyKCJibGFjayIp
KQ0KICAgICAgICAgICAgc2VsZi5iaXRtYXAgPSBOb25lDQogICAgICAgICAgICBzZWxmLmNv
bG91cnMgPSBOdW1lcmljLnplcm9zKCAoaXRlcmF0aW9ucyArIDEsIDMpICkNCiAgICAgICAg
ICAgIGFyYW5nZU1heCA9IE51bWVyaWMuYXJhbmdlKDAsIGl0ZXJhdGlvbnMgKyAxKQ0KICAg
ICAgICAgICAgc2VsZi5jb2xvdXJzWzosMF0gPSBOdW1lcmljLmNsaXAoYXJhbmdlTWF4ICog
d2VpZ2h0c1swXSwgMCwgaXRlcmF0aW9ucykNCiAgICAgICAgICAgIHNlbGYuY29sb3Vyc1s6
LDFdID0gTnVtZXJpYy5jbGlwKGFyYW5nZU1heCAqIHdlaWdodHNbMV0sIDAsIGl0ZXJhdGlv
bnMpDQogICAgICAgICAgICBzZWxmLmNvbG91cnNbOiwyXSA9IE51bWVyaWMuY2xpcChhcmFu
Z2VNYXggKiB3ZWlnaHRzWzJdLCAwLCBpdGVyYXRpb25zKQ0KICAgICAgICAgICAgc2VsZi5p
bWFnZSA9IHd4RW1wdHlJbWFnZSh3aWR0aCwgaGVpZ2h0KQ0KICAgICAgICAgICAgc2VsZi5i
aXRtYXAgPSBzZWxmLmltYWdlLkNvbnZlcnRUb0JpdG1hcCgpDQogICAgICAgICAgICBzZWxm
LmdlbmVyYXRvciA9IE1hbmRlbGJyb3RHZW5lcmF0b3IoIHdpZHRoPXdpZHRoLCBoZWlnaHQ9
aGVpZ2h0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb29yZGluYXRlcz1jb29yZGluYXRlcywNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3Q2FsbGJhY2s9c2VsZi5kYXRhVXBk
YXRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpdGVyYXRpb25zPWl0ZXJhdGlvbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHhkaXZpc29yPXhkaXZpc29yLCB5ZGl2aXNvcj15ZGl2
aXNvcikNCiAgICAgICAgICAgIGltcG9ydCB0aHJlYWRpbmcNCiAgICAgICAgICAgIHNlbGYu
dGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCggdGFyZ2V0ID0gc2VsZi5nZW5lcmF0b3IuRG9B
bGxUaWxlcyApDQogICAgICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpDQoNCiAgICAgICAg
ZGVmIGRhdGFVcGRhdGUoIHNlbGYsIGRhdGEsIG1vcmU9MCApOg0KIyMgICAgICAgICAgcHJp
bnQgJ2RhdGFVcGRhdGUnLCBtb3JlDQogICAgICAgICAgICBpZiBtb3JlOg0KICAgICAgICAg
ICAgICAgIGRhdGEuc2hhcGUgPSAoc2VsZi5oZWlnaHQsIHNlbGYud2lkdGgpDQogICAgICAg
ICAgICAgICAgIyBidWlsZCB0aGUgcGl4ZWwgdmFsdWVzDQogICAgICAgICAgICAgICAgcGl4
ZWxzID0gTnVtZXJpYy50YWtlKHNlbGYuY29sb3VycywgZGF0YSkNCiAgICAgICAgICAgICAg
ICAjIGNyZWF0ZSB0aGUgaW1hZ2UgZGF0YQ0KICAgICAgICAgICAgICAgIGJpdG1hcCA9IHBp
eGVscy5hc3R5cGUoTnVtZXJpYy5VbnNpZ25lZEludDgpLnRvc3RyaW5nKCkNCiAgICAgICAg
ICAgICAgICAjIGNyZWF0ZSB0aGUgaW1hZ2UgaXRzZWxmDQogICAgICAgICAgICAgICAgc2Vs
Zi5pbWFnZS5TZXREYXRhKGJpdG1hcCkNCiAgICAgICAgICAgICAgICBzZWxmLmJpdG1hcCA9
IHNlbGYuaW1hZ2UuQ29udmVydFRvQml0bWFwKCkNCiAgICAgICAgICAgICAgICBzZWxmLlJl
ZnJlc2goKQ0KDQogICAgICAgIGRlZiBPblBhaW50KHNlbGYsIGV2ZW50KToNCiAgICAgICAg
ICAgIGRjID0gd3hQYWludERDKHNlbGYpDQogICAgICAgICAgICBkYy5CZWdpbkRyYXdpbmco
KQ0KICAgICAgICAgICAgaWYgc2VsZi5iaXRtYXAgIT0gMToNCiAgICAgICAgICAgICAgICBk
Yy5EcmF3Qml0bWFwKHNlbGYuYml0bWFwLCAwLCAwLCBmYWxzZSkNCiAgICAgICAgICAgIGRj
LkVuZERyYXdpbmcoKQ0KICAgIGNsYXNzIE15RnJhbWUod3hGcmFtZSk6DQogICAgICAgIGRl
ZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIElELCB0aXRsZSk6DQogICAgICAgICAgICB3eEZy
YW1lLl9faW5pdF9fKHNlbGYsIHBhcmVudCwgSUQsIHRpdGxlKQ0KICAgICAgICAgICAgc2Vs
Zi5DcmVhdGVTdGF0dXNCYXIoKQ0KIyMgICAgICAgICAgc2VsZi5wcm9ncmVzcygwLCAxMDAp
DQogICAgICAgICAgICBzZWxmLkNlbnRyZSh3eEJPVEgpDQogICAgICAgICAgICBtZGIgPSBN
YW5kZWxDYW52YXMoc2VsZiwgd2lkdGg9MjAwLCBoZWlnaHQ9MjAwLCBpdGVyYXRpb25zPTI1
NSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjLCB4ZGl2aXNvcj01LCB5ZGl2
aXNvcj0yMCkNCg0KICAgICAgICAgICAgc2VsZi5TZXRBdXRvTGF5b3V0KHRydWUpDQogICAg
ICAgICAgICBzZWxmLkxheW91dCgpDQogICAgICAgICAgICBzZWxmLkZpdCgpDQogICAgICAg
ICAgICBzeiA9IHNlbGYuR2V0Q2xpZW50U2l6ZSgpDQogICAgICAgICAgICBzZWxmLlNldENs
aWVudFNpemUod3hTaXplKHN6LndpZHRoLTcsIHN6LmhlaWdodC0xNCkpDQoNCiMjICAgICAg
ICAgIGRlZiBwcm9ncmVzcyhzZWxmLCBkb25lLCBwZXJjZW50KToNCiMjICAgICAgICAgICAg
ICBzZWxmLlNldFN0YXR1c1RleHQoIiVkLyVkLCAlMi4yZiIgJSAoZG9uZSwgTUFYX0lURVJB
VElPTlMsIHBlcmNlbnQpICsgDQojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICIlIG9mIHBpeGVscyBsZWZ0IikNCg0KICAgIGNsYXNzIE15QXBwKHd4QXBwKToNCiAgICAg
ICAgZGVmIE9uSW5pdChzZWxmKToNCiAgICAgICAgICAgIGZyYW1lID0gTXlGcmFtZShOVUxM
LCAtMSwgIk1hbmRlbGJyb3QiKQ0KICAgICAgICAgICAgZnJhbWUuU2hvdyh0cnVlKQ0KICAg
ICAgICAgICAgc2VsZi5TZXRUb3BXaW5kb3coZnJhbWUpDQogICAgICAgICAgICByZXR1cm4g
dHJ1ZQ0KDQogICAgYXBwID0gTXlBcHAoMCkNCiAgICBhcHAuTWFpbkxvb3AoKQ0KZXhjZXB0
IEltcG9ydEVycm9yOg0KICAgIGRlZiB0ZXN0KCk6DQogICAgICAgIG0gPSBNYW5kZWxicm90
R2VuZXJhdG9yKCkNCiAgICAgICAgd2hpbGUgbS5Eb1RpbGUoKToNCiAgICAgICAgICAgIHBy
aW50ICcuJw0KICAgIHRlc3QoKQ0K
--------------BFD45A5A87DC8AE4E557A208--