-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmaiass.sh
More file actions
executable file
·9 lines (9 loc) · 358 KB
/
maiass.sh
File metadata and controls
executable file
·9 lines (9 loc) · 358 KB
1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash
# Packed bundle: decodes embedded payload then evals it.
_decode() {
base64 -d
}
eval "$(_decode <<'__PAYLOAD__'
IyBHZW5lcmF0ZWQgYnkgc2NyaXB0cy9idW5kbGUtYmFzaC5zaCBvbiAyMDI2LTA0LTE1VDIzOjExOjI5WgojIEVudHJ5OiBtYWlhc3Muc2gKIyBOb3RlOiBUaGlzIGlzIGEgYnVuZGxlZCBmaWxlLiBEbyBub3QgZWRpdCBkaXJlY3RseS4KZXhwb3J0IF9fTUFJQVNTX0JVTkRMRUQ9MQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNQUlBU1MgKE1vZHVsYXIgQUktQXVnbWVudGVkIFNlbWFudGljIFNjcmliZSkgdjUuMTAuNTMKIyBJbnRlbGxpZ2VudCBHaXQgd29ya2Zsb3cgYXV0b21hdGlvbiBzY3JpcHQKIyBDb3B5cmlnaHQgKGMpIDIwMjUgVmVsdmFyeSBQdHkgTHRkCiMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBUaGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YgdGhlIFZlbHZhcnkgYmFzaCBzY3JpcHRzIGxpYnJhcnkuCiMgQXV0aG9yOiB2c21hc2ggPDY3MDI1Mit2c21hc2hAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFJlc29sdmUgdGhpcyBzY3JpcHTigJlzIHJlYWwgcGF0aCBldmVuIGlmIHN5bWxpbmtlZApTT1VSQ0U9IiR7QkFTSF9TT1VSQ0VbMF19Igp3aGlsZSBbIC1oICIkU09VUkNFIiBdOyBkbwogIERJUj0iJChjZCAtUCAiJChkaXJuYW1lICIkU09VUkNFIikiID4vZGV2L251bGwgMj4mMSAmJiBwd2QpIgogIFNPVVJDRT0iJChyZWFkbGluayAiJFNPVVJDRSIpIgogIFtbICRTT1VSQ0UgIT0gLyogXV0gJiYgU09VUkNFPSIkRElSLyRTT1VSQ0UiCmRvbmUKU0NSSVBUX1BBVEg9IiQoY2QgLVAgIiQoZGlybmFtZSAiJFNPVVJDRSIpIiA+L2Rldi9udWxsIDI+JjEgJiYgcHdkKSIKCiMgRGV0ZWN0IGxpYmV4ZWMgbGF5b3V0OiBpbiBkZXYsIGxpYiBpcyBuZXh0IHRvIHRoZSBzY3JpcHQ7IGluIGJyZXcsIGl0J3MgbmVzdGVkCmlmIFtbIC1kICIkU0NSSVBUX1BBVEgvbGliL2NvcmUiIF1dOyB0aGVuCiAgTElCRVhFQ19ESVI9IiRTQ1JJUFRfUEFUSC9saWIiCmVsc2UKICBMSUJFWEVDX0RJUj0iJFNDUklQVF9QQVRILy4uL2xpYmV4ZWMvbGliIgpmaQpQUk9KRUNUX0RJUj0iJChwd2QpIgoKIyBNYWtlIG1haW4gc2NyaXB0IHBhdGggYW5kIHZlcnNpb24gYXZhaWxhYmxlIHRvIGFsbCBzb3VyY2VkIGxpYnMKZXhwb3J0IE1BSUFTU19NQUlOX1NDUklQVD0iJFNPVVJDRSIKIyBQcmVmZXIgZXhwbGljaXQgZW52IG92ZXJyaWRlLCBlbHNlIHBhcnNlIGZyb20gc2NyaXB0IGhlYWRlciBjb21tZW50LCBlbHNlIDAuMC4wCmV4cG9ydCBNQUlBU1NfQ0xJRU5UX1ZFUlNJT049NS4xMC41MwoKIyAtLS0gQmVnaW4gaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvY29yZS9sb2dnZXIuc2ggLS0tCmlmIFtbIC16ICIke19fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfbG9nZ2VyX3NoOi19IiBdXTsgdGhlbiBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX2xvZ2dlcl9zaD0xCgpzdXBwb3J0c191bmljb2RlKCkgewogIGNhc2UgIiRPU1RZUEUiIGluCiAgICBtc3lzKnxjeWd3aW4qfHdpbjMyKQogICAgICBbWyAtbiAiJFdUX1NFU1NJT04iIHx8ICIkVEVSTV9QUk9HUkFNIiA9PSAidnNjb2RlIiBdXSAmJiByZXR1cm4gMAogICAgICByZXR1cm4gMQogICAgICA7OwogICAgKikKICAgICAgW1sgIiRMQU5HIiA9fiBVVEYtOCB8fCAiJExDX0FMTCIgPX4gVVRGLTggXV0gJiYgcmV0dXJuIDAKICAgICAgcmV0dXJuIDEKICAgICAgOzsKICBlc2FjCn0KZXhwb3J0IHVuaWNvZGVfc3VwcG9ydGVkPXN1cHBvcnRzX3VuaWNvZGUKCnN1cHBvcnRzX3RydWVjb2xvcigpIHsgW1sgIiR7Q09MT1JURVJNOi19IiA9PSAqdHJ1ZWNvbG9yKiB8fCAiJHtDT0xPUlRFUk06LX0iID09ICoyNGJpdCogXV07IH0Kc3VwcG9ydHNfMjU2Y29sb3IoKSAgeyBsb2NhbCBuOyBuPSQodHB1dCBjb2xvcnMgMj4vZGV2L251bGwgfHwgZWNobyAwKTsgWyAiJG4iIC1nZSAyNTYgXTsgfQoKZXhwb3J0IHR3b2ZpdmVzaXhjb2xvcl9zdXBwb3J0ZWQ9c3VwcG9ydHNfMjU2Y29sb3IKZXhwb3J0IHRydWVjb2xvcl9zdXBwb3J0ZWQ9c3VwcG9ydHNfdHJ1ZWNvbG9yCgojIENvbG9yIGFuZCBzdHlsZSBkZWZpbml0aW9ucwojIEJvbGQgY29sb3JzIChmb3IgZW1waGFzaXMgYW5kIGltcG9ydGFudCBtZXNzYWdlcykKQkN5YW49J1wwMzNbMTszNm0nICAgICAgIyBCb2xkIEN5YW4KQlJlZD0nXDAzM1sxOzMxbScgICAgICAgIyBCb2xkIFJlZApCR3JlZW49J1wwMzNbMTszMm0nICAgICAjIEJvbGQgR3JlZW4KQkJsdWU9J1wwMzNbMTszNG0nICAgICAgIyBCb2xkIEJsdWUKQlllbGxvdz0nXDAzM1sxOzMzbScgICAgIyBCb2xkIFllbGxvdwpCUHVycGxlPSdcMDMzWzE7MzVtJyAgICAjIEJvbGQgUHVycGxlCkJXaGl0ZT0nXDAzM1sxOzM3bScgICAgICMgQm9sZCBXaGl0ZQpCTWFnZW50YT0nXDAzM1sxOzM1bScgICAjIEJvbGQgTWFnZW50YQpCQXF1YT0nXDAzM1sxOzk2bScgICAgICAjIEJvbGQgQXF1YQpCU29mdFBpbms9J1wwMzNbMzg7NTsyMThtJyAjIEJvbGQgU29mdCBQaW5rCkJOYXZ5PSdcMDMzWzE7MzRtJyAgICAgICMgQm9sZCBOYXZ5CkJHcmV5PSdcMDMzWzE7MzVtJyAgICAgICMgQm9sZCBHcmV5CkJPcmFuZ2U9J1wwMzNbMTszODsyOzI1NTsxNjU7MG0nICAgICMgQm9sZCBPcmFuZ2UKCiMgUmVndWxhciBjb2xvcnMgKGZvciBzdGFuZGFyZCBtZXNzYWdlcykKQ3lhbj0nXDAzM1swOzM2bScgICAgICAgIyBDeWFuClJlZD0nXDAzM1swOzMxbScgICAgICAgICMgUmVkCkdyZWVuPSdcMDMzWzA7MzJtJyAgICAgICMgR3JlZW4KQmx1ZT0nXDAzM1swOzM0bScgICAgICAgIyBCbHVlClllbGxvdz0nXDAzM1swOzMzbScgICAgICMgWWVsbG93ClB1cnBsZT0nXDAzM1swOzM1bScgICAgICMgUHVycGxlCldoaXRlPSdcMDMzWzA7MzdtJyAgICAgICMgV2hpdGUKTWFnZW50YT0nXDAzM1swOzM1bScgICAgIyBNYWdlbnRhCkFxdWE9J1wwMzNbMDs5Nm0nICAgICAgICMgQXF1YQpTb2Z0UGluaz0nXDAzM1szODs1OzIxOG0nICMgU29mdCBQaW5rCk5hdnk9J1wwMzNbMDszNG0nICAgICAgICMgTmF2eQpHcmV5PSdcMDMzWzA7MzVtJyAgICAgICMgR3JleQpPcmFuZ2U9J1wwMzNbMzg7NTsyMDhtJyAgICMgT3JhbmdlCgojIFNwZWNpYWwgZm9ybWF0dGluZwpDb2xvcl9PZmY9J1wwMzNbMG0nICAgICAjIFRleHQgUmVzZXQKQldoaXRlQkc9J1wwMzNbNDdtJyAgICAgIyBXaGl0ZSBCYWNrZ3JvdW5kCk5DPSdcMDMzWzBtJwpCb2xkPSdcMDMzWzFtJwpVbmRlcmxpbmU9J1wwMzNbNG0nClJldmVyc2U9J1wwMzNbN20nClJlc2V0PSdcMDMzWzBtJwoKIyBQcmludCBhIHllbGxvdyB1c2VyIHByb21wdCAobm8gbmV3bGluZSkKIyBVc2FnZTogcHJpbnRfcHJvbXB0ICJFbnRlciBjaG9pY2U6ICIKcHJpbnRfcHJvbXB0KCkgewogICAgZWNobyAtZW4gIiR7QlllbGxvd30kMSR7Q29sb3JfT2ZmfSIKfQoKIyBQcmludCBhIHNlY3Rpb24gaGVhZGVyCnByaW50X3NlY3Rpb24oKSB7CiAgICBlY2hvIC1lICJcbiR7WWVsbG93feKWtiAkMSR7Q29sb3JfT2ZmfSIKfQoKIyBMb2dnaW5nIGZ1bmN0aW9uIC0gd3JpdGVzIHRvIGxvZyBmaWxlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZApsb2dfbWVzc2FnZSgpIHsKICAgIGlmIFtbICIkZW5hYmxlX2xvZ2dpbmciID09ICJ0cnVlIiBdXTsgdGhlbgogICAgICAgIGVjaG8gIlskKGRhdGUgJyslWS0lbS0lZCAlSDolTTolUycpXSAkMSIgPj4gIiRsb2dfZmlsZSIKICAgIGZpCn0KCiMgUHJpbnQgYSBzdWNjZXNzIG1lc3NhZ2UKcHJpbnRfc3VjY2VzcygpIHsKICAgIGVjaG8gLWUgIiR7R3JlZW594pyUICQxJHtDb2xvcl9PZmZ9IgogICAgbG9nX21lc3NhZ2UgIlNVQ0NFU1M6ICQxIgp9CgojIFByaW50IGEgbWVzc2FnZSB0aGF0J3MgYWx3YXlzIHNob3duIHJlZ2FyZGxlc3Mgb2YgdmVyYm9zaXR5IGxldmVsCnByaW50X2Fsd2F5cygpewogIGxvY2FsIG1lc3NhZ2U9IiQxIgogIGVjaG8gLWUgIiR7QXF1YX3ihLkgJG1lc3NhZ2Uke0NvbG9yX09mZn0iCiAgbG9nX21lc3NhZ2UgIklORk86ICRtZXNzYWdlIgp9CgojIFByaW50IGFuIGluZm8gbWVzc2FnZSB3aXRoIHZlcmJvc2l0eSBsZXZlbCBzdXBwb3J0CiMgVXNhZ2U6IHByaW50X2luZm8gIm1lc3NhZ2UiIFtsZXZlbF0KIyBMZXZlbHM6IGJyaWVmLCBub3JtYWwsIGRlYnVnIChkZWZhdWx0OiBub3JtYWwpCnByaW50X2luZm8oKSB7CiAgICBsb2NhbCBtZXNzYWdlPSIkMSIKICAgIGxvY2FsIGxldmVsPSIkezI6LWJyaWVmfSIKICAgICMgaWYgbGV2ZWw9YWx3YXlzLCBzaG93IG1lc3NhZ2UgcmVnYXJkbGVzcyBvZiB2ZXJib3NpdHkgbGV2ZWwKICAgIGlmIFtbICIkbGV2ZWwiID09ICJhbHdheXMiIF1dOyB0aGVuCiAgICAgICAgZWNobyAtZSAiJHtCU29mdFBpbmt9fCkpICR7Q29sb3JfT2ZmfSRtZXNzYWdlJHtDb2xvcl9PZmZ9IgogICAgICAgIGxvZ19tZXNzYWdlICJJTkZPOiAkbWVzc2FnZSIKICAgICAgICByZXR1cm4KICAgIGZpCgogICAgIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdHJlYXQgZGVidWdfbW9kZT10cnVlIGFzIHZlcmJvc2l0eV9sZXZlbD1kZWJ1ZwogICAgaWYgW1sgIiRkZWJ1Z19tb2RlIiA9PSAidHJ1ZSIgJiYgIiR2ZXJib3NpdHlfbGV2ZWwiICE9ICJkZWJ1ZyIgXV07IHRoZW4KICAgICAgICAjIE9ubHkgbG9nIHRoaXMgd2hlbiBub3QgYWxyZWFkeSBpbiBkZWJ1ZyB2ZXJib3NpdHkgdG8gYXZvaWQgbm9pc2UKICAgICAgICBsb2dfbWVzc2FnZSAiREVQUkVDQVRFRDogVXNpbmcgZGVidWdfbW9kZT10cnVlIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgTUFJQVNTX1ZFUkJPU0lUWT1kZWJ1ZyBpbnN0ZWFkLiIKICAgICAgICAjIFRyZWF0IGFzIGlmIHZlcmJvc2l0eV9sZXZlbCBpcyBkZWJ1ZwogICAgICAgIGxvY2FsIGVmZmVjdGl2ZV92ZXJib3NpdHk9ImRlYnVnIgogICAgZWxzZQogICAgICAgIGxvY2FsIGVmZmVjdGl2ZV92ZXJib3NpdHk9IiR2ZXJib3NpdHlfbGV2ZWwiCiAgICBmaQoKICAgICMgU2hvdyBiYXNlZCBvbiB2ZXJib3NpdHkgbGV2ZWwKICAgIGNhc2UgIiRlZmZlY3RpdmVfdmVyYm9zaXR5IiBpbgogICAgICAgICJicmllZiIpCiAgICAgICAgICAgICMgT25seSBzaG93IGVzc2VudGlhbCBtZXNzYWdlcyBpbiBicmllZiBtb2RlCiAgICAgICAgICAgIGlmIFtbICIkbGV2ZWwiID09ICJicmllZiIgXV07IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gLWUgIiR7QlNvZnRQaW5rfXwpKSAke0NvbG9yX09mZn0kbWVzc2FnZSR7Q29sb3JfT2ZmfSIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgOzsKICAgICAgICAibm9ybWFsIikKICAgICAgICAgICAgIyBTaG93IGJyaWVmIGFuZCBub3JtYWwgbWVzc2FnZXMKICAgICAgICAgICAgaWYgW1sgIiRsZXZlbCIgPT0gImJyaWVmIiB8fCAiJGxldmVsIiA9PSAibm9ybWFsIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgZWNobyAtZSAiJHtCU29mdFBpbmt9fCkpICR7Q29sb3JfT2ZmfSRtZXNzYWdlJHtDb2xvcl9PZmZ9IgogICAgICAgICAgICBmaQogICAgICAgICAgICA7OwogICAgICAgICJkZWJ1ZyIpCiAgICAgICAgICAgICMgU2hvdyBhbGwgbWVzc2FnZXMsIHVzZSBib2xkIGZvciBkZWJ1ZyBsZXZlbCBtZXNzYWdlcwogICAgICAgICAgICBpZiBbWyAiJGxldmVsIiA9PSAiZGVidWciIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvIC1lICIke0JTb2Z0UGlua318KSkgJHtDb2xvcl9PZmZ9JG1lc3NhZ2Uke0NvbG9yX09mZn0iCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gLWUgIiR7QlNvZnRQaW5rfXwpKSAke0NvbG9yX09mZn0kbWVzc2FnZSR7Q29sb3JfT2ZmfSIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgOzsKICAgIGVzYWMKCiAgICBsb2dfbWVzc2FnZSAiSU5GTzogJG1lc3NhZ2UiCn0KCiMgUHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UKcHJpbnRfd2FybmluZygpIHsKICAgIGVjaG8gLWUgIiR7T3JhbmdlfeKaoCAkMSR7Q29sb3JfT2ZmfSIKICAgIGxvZ19tZXNzYWdlICJXQVJOSU5HOiAkMSIKfQoKIyBQcmludCBhbiBlcnJvciBtZXNzYWdlICh1c2luZyBib2xkIGZvciBlbXBoYXNpcyBhcyBlcnJvcnMgYXJlIGltcG9ydGFudCkKcHJpbnRfZXJyb3IoKSB7CiAgICBlY2hvIC1lICIke0JSZWR94pyYICQxJHtDb2xvcl9PZmZ9IgogICAgbG9nX21lc3NhZ2UgIkVSUk9SOiAkMSIKfQoKIyBQcmludCBhIHNlY3Rpb24gaGVhZGVyIChhbHdheXMgc2hvd24gcmVnYXJkbGVzcyBvZiB2ZXJib3NpdHkpCnByaW50X3NlY3Rpb24oKSB7CiAgICBlY2hvIC1lICJcbiR7V2hpdGV94pa2ICQxJHtDb2xvcl9PZmZ9IgogICAgbG9nX21lc3NhZ2UgIlNFQ1RJT046ICQxIgp9CgpwcmludF9kZWJ1ZygpewogICAgbG9jYWwgbWVzc2FnZT0iJDEiCiAgICAjIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0cmVhdCBkZWJ1Z19tb2RlPXRydWUgYXMgdmVyYm9zaXR5X2xldmVsPWRlYnVnCiAgICBpZiBbWyAiJGRlYnVnX21vZGUiID09ICJ0cnVlIiAmJiAiJHZlcmJvc2l0eV9sZXZlbCIgIT0gImRlYnVnIiBdXTsgdGhlbgogICAgICAgIGxvZ19tZXNzYWdlICJERVBSRUNBVEVEOiBVc2luZyBkZWJ1Z19tb2RlPXRydWUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBNQUlBU1NfVkVSQk9TSVRZPWRlYnVnIGluc3RlYWQuIgogICAgICAgIGxvY2FsIGVmZmVjdGl2ZV92ZXJib3NpdHk9ImRlYnVnIgogICAgZWxzZQogICAgICAgIGxvY2FsIGVmZmVjdGl2ZV92ZXJib3NpdHk9IiR2ZXJib3NpdHlfbGV2ZWwiCiAgICBmaQogICAgaWYgW1sgIiRlZmZlY3RpdmVfdmVyYm9zaXR5IiA9PSAiZGVidWciIHx8ICIkZWZmZWN0aXZlX3ZlcmJvc2l0eSIgPT0gInRyYWNlIiBdXTsgdGhlbgogICAgICAgIGVjaG8gLWUgIiR7Q29sb3JfT2ZmffCfkJskbWVzc2FnZSR7Q29sb3JfT2ZmfSIKICAgICAgICBsb2dfbWVzc2FnZSAiREVCVUc6ICRtZXNzYWdlIgogICAgZmkKCn0KCiMgUHJpbnQgYSB0cmFjZSBtZXNzYWdlIOKAlCBsb2cgZmlsZSBPTkxZLCBuZXZlciBzdGRvdXQvc3RkZXJyLgojIFVzZSBmb3IgZnVsbCBBUEkgcmVzcG9uc2VzLCBjcmVkZW50aWFsIHZhbHVlcywgZmluZ2VycHJpbnQgZGV0YWlscywgZXRjLgpwcmludF90cmFjZSgpewogICAgbG9jYWwgbWVzc2FnZT0iJDEiCiAgICBpZiBbWyAiJHZlcmJvc2l0eV9sZXZlbCIgPT0gInRyYWNlIiBdXTsgdGhlbgogICAgICAgIGxvZ19tZXNzYWdlICJUUkFDRTogJG1lc3NhZ2UiCiAgICBmaQp9CgojIFJlZGFjdCBhIHNlbnNpdGl2ZSB2YWx1ZSBmb3Igc2FmZSBkaXNwbGF5LgojICJhbm9uX2I1YmYzZWI5LTI2YjktNGM2Ny05OWMzLTRmZDE3MzdlZjZhNCIg4oaSICJhbm9uX2I1Yi4uLmE0IgpyZWRhY3RfdmFsdWUoKSB7CiAgICBsb2NhbCB2YWx1ZT0iJDEiCiAgICBpZiBbWyAteiAiJHZhbHVlIiBdXTsgdGhlbgogICAgICAgIGVjaG8gIm51bGwiCiAgICAgICAgcmV0dXJuCiAgICBmaQogICAgbG9jYWwgbGVuPSR7I3ZhbHVlfQogICAgaWYgW1sgJGxlbiAtbGUgOCBdXTsgdGhlbgogICAgICAgIGVjaG8gIioqKiIKICAgICAgICByZXR1cm4KICAgIGZpCiAgICBlY2hvICIke3ZhbHVlOjA6OH0uLi4ke3ZhbHVlOiAtMn0iCn0KCiMgTGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gaGV4IGNvbG9ycwppbnRlcnBvbGF0ZV9jb2xvcigpIHsKICBsb2NhbCBzdGFydD0iJDEiIGVuZD0iJDIiIHZhbHVlPSIkMyIgbWluPSIkNCIgbWF4PSIkNSIKICBsb2NhbCBzcj0kKHByaW50ZiAiJWQiIDB4JHtzdGFydDoxOjJ9KQogIGxvY2FsIHNnPSQocHJpbnRmICIlZCIgMHgke3N0YXJ0OjM6Mn0pCiAgbG9jYWwgc2I9JChwcmludGYgIiVkIiAweCR7c3RhcnQ6NToyfSkKICBsb2NhbCBlcj0kKHByaW50ZiAiJWQiIDB4JHtlbmQ6MToyfSkKICBsb2NhbCBlZz0kKHByaW50ZiAiJWQiIDB4JHtlbmQ6MzoyfSkKICBsb2NhbCBlYj0kKHByaW50ZiAiJWQiIDB4JHtlbmQ6NToyfSkKCiAgIyBub3JtYWxpemUgdmFsdWUgaW50byAwLi4xCiAgbG9jYWwgcmF0aW89JCgoICh2YWx1ZSAtIG1pbikgKiAxMDAwIC8gKG1heCAtIG1pbikgKSkKICBbWyAkcmF0aW8gLWx0IDAgXV0gJiYgcmF0aW89MAogIFtbICRyYXRpbyAtZ3QgMTAwMCBdXSAmJiByYXRpbz0xMDAwCgogIGxvY2FsIHI9JCgoIHNyICsgKGVyIC0gc3IpICogcmF0aW8gLyAxMDAwICkpCiAgbG9jYWwgZz0kKCggc2cgKyAoZWcgLSBzZykgKiByYXRpbyAvIDEwMDAgKSkKICBsb2NhbCBiPSQoKCBzYiArIChlYiAtIHNiKSAqIHJhdGlvIC8gMTAwMCApKQoKICBwcmludGYgIiMlMDJYJTAyWCUwMlhcbiIgJHIgJGcgJGIKfQoKIyBNYXN0ZXIgZnVuY3Rpb24KY3JlZGl0X2NvbG9yKCkgewogIGxvY2FsIGNyZWRpdHM9IiQxIgogIGlmICgoIGNyZWRpdHMgPj0gMTAwMCApKTsgdGhlbgogICAgZWNobyAiIzAwRkYwMCIgIyBncmVlbgogIGVsaWYgKCggY3JlZGl0cyA+PSAzMDAgKSk7IHRoZW4KICAgIGludGVycG9sYXRlX2NvbG9yICIjMDBGRkZGIiAiI0ZGQTUwMCIgIiRjcmVkaXRzIiAzMDAgMTAwMAogIGVsc2UKICAgIGludGVycG9sYXRlX2NvbG9yICIjRkZBNTAwIiAiI0ZGMDAwMCIgIiRjcmVkaXRzIiAwIDMwMAogIGZpCn0KCiMgSW50ZWdlciBSR0IgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBoZXggY29sb3JzLgojIFVzYWdlOiBpbnRlcnBvbGF0ZV9jb2xvciAiI1JSR0dCQiIgIiNSUkdHQkIiIHZhbHVlIG1pbiBtYXggIC0+IGVjaG9lcyAiI1JSR0dCQiIKaW50ZXJwb2xhdGVfY29sb3IoKSB7CiAgbG9jYWwgc3RhcnQ9IiQxIiBlbmQ9IiQyIiB2YWw9IiQzIiBtaW49IiQ0IiBtYXg9IiQ1IgogICMgQ2xhbXAKICBbICIkdmFsIiAtbHQgIiRtaW4iIF0gJiYgdmFsPSIkbWluIgogIFsgIiR2YWwiIC1ndCAiJG1heCIgXSAmJiB2YWw9IiRtYXgiCiAgbG9jYWwgcmFuZ2U9JCgoIG1heCAtIG1pbiApKTsgWyAiJHJhbmdlIiAtbGUgMCBdICYmIHJhbmdlPTEKICBsb2NhbCBwb3M9JCgoIHZhbCAtIG1pbiApKQoKICAjIEhleCAtPiBpbnQKICBsb2NhbCBzcj0kKCgxNiMke3N0YXJ0OjE6Mn0pKSBzZz0kKCgxNiMke3N0YXJ0OjM6Mn0pKSBzYj0kKCgxNiMke3N0YXJ0OjU6Mn0pKQogIGxvY2FsIGVyPSQoKDE2IyR7ZW5kOjE6Mn0pKSAgIGVnPSQoKDE2IyR7ZW5kOjM6Mn0pKSAgIGViPSQoKDE2IyR7ZW5kOjU6Mn0pKQoKICAjIExpbmVhciBpbnRlcnAgKGludGVnZXIgbWF0aCkKICBsb2NhbCByPSQoKCBzciArICggKGVyIC0gc3IpICogcG9zICkgLyByYW5nZSApKQogIGxvY2FsIGc9JCgoIHNnICsgKCAoZWcgLSBzZykgKiBwb3MgKSAvIHJhbmdlICkpCiAgbG9jYWwgYj0kKCggc2IgKyAoIChlYiAtIHNiKSAqIHBvcyApIC8gcmFuZ2UgKSkKCiAgcHJpbnRmICIjJTAyWCUwMlglMDJYXG4iICIkciIgIiRnIiAiJGIiCn0KCiMgU2ltcGxlIGRldGVjdG9yOiBtYW55IHRlcm1pbmFscyBleHBvcnQgQ09MT1JURVJNPXRydWVjb2xvci8yNGJpdApzdXBwb3J0c190cnVlY29sb3IoKSB7CiAgWyAiJHtDT0xPUlRFUk06LX0iID0gInRydWVjb2xvciIgXSB8fCBbICIke0NPTE9SVEVSTTotfSIgPSAiMjRiaXQiIF0KfQoKIyBDcmVkaXRzIOKGkiBjb2xvcmVkIHRleHQsIHRyYWZmaWMtbGlnaHQgZ3JhZGllbnQKIyBCYW5kczoKIyAgID49MTAwMCBzb2xpZCBncmVlbgojICAgNjAw4oCTMTAwMCBpbnRlcnBvbGF0ZSBncmVlbuKGknllbGxvdwojICAgMzAw4oCTNjAwICBpbnRlcnBvbGF0ZSB5ZWxsb3fihpJvcmFuZ2UKIyAgIDDigJMzMDAgICAgaW50ZXJwb2xhdGUgb3Jhbmdl4oaScmVkCnByaW50X2NyZWRpdF9jb2xvcigpIHsKICBsb2NhbCBjcmVkaXRzPSIkMSIgdGV4dD0iJHsyOi0kMX0iIGhleCByIGcgYgoKICBpZiBbICIkY3JlZGl0cyIgLWdlIDEwMDAgXTsgdGhlbgogICAgaGV4PSIjMDBBQTAwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNvbGlkIGdyZWVuIChub3QgbmVvbikKICBlbGlmIFsgIiRjcmVkaXRzIiAtZ3QgNjAwIF07IHRoZW4KICAgIGhleD0kKGludGVycG9sYXRlX2NvbG9yICIjMDBBQTAwIiAiI0ZGRkYwMCIgIiRjcmVkaXRzIiA2MDAgMTAwMCkgICMgZ3JlZW7ihpJ5ZWxsb3cKICBlbGlmIFsgIiRjcmVkaXRzIiAtZ3QgMzAwIF07IHRoZW4KICAgIGhleD0kKGludGVycG9sYXRlX2NvbG9yICIjRkZGRjAwIiAiI0ZGQTUwMCIgIiRjcmVkaXRzIiAzMDAgNjAwKSAgICMgeWVsbG934oaSb3JhbmdlCiAgZWxpZiBbICIkY3JlZGl0cyIgLWdlIDAgXTsgdGhlbgogICAgaGV4PSQoaW50ZXJwb2xhdGVfY29sb3IgIiNGRkE1MDAiICIjRkYwMDAwIiAiJGNyZWRpdHMiIDAgMzAwKSAgICAgIyBvcmFuZ2XihpJyZWQKICBlbHNlCiAgICBoZXg9IiNGRjAwMDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5lZ2F0aXZlIOKGkiByZWQKICBmaQoKICBpZiBzdXBwb3J0c190cnVlY29sb3I7IHRoZW4KICAgIHI9JCgoMTYjJHtoZXg6MToyfSkpOyBnPSQoKDE2IyR7aGV4OjM6Mn0pKTsgYj0kKCgxNiMke2hleDo1OjJ9KSkKICAgIHByaW50ZiAiXDAzM1szODsyOyVkOyVkOyVkbSVzXDAzM1swbVxuIiAiJHIiICIkZyIgIiRiIiAiJHRleHQiCiAgZWxzZQogICAgIyAyNTYtY29sb3IgZmFsbGJhY2sgdG8gbmVhcmVzdCBmaXhlZCBjb2xvcnMgKG5vIGdyYWRpZW50KQogICAgIyBncmVlbj0zNCwgeWVsbG93PTIyNiwgb3Jhbmdl4omIMjA4LCByZWQ9MTk2CiAgICBsb2NhbCBjb2RlCiAgICBpZiAgIFsgIiRjcmVkaXRzIiAtZ2UgMTAwMCBdOyB0aGVuIGNvZGU9MzQKICAgIGVsaWYgWyAiJGNyZWRpdHMiIC1ndCA2MDAgIF07IHRoZW4gY29kZT0yMjYKICAgIGVsaWYgWyAiJGNyZWRpdHMiIC1ndCAzMDAgIF07IHRoZW4gY29kZT0yMDgKICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZT0xOTYKICAgIGZpCiAgICBwcmludGYgIlwwMzNbMzg7NTslZG0lc1wwMzNbMG1cbiIgIiRjb2RlIiAiJHRleHQiCiAgZmkKfQoKIyBwcmludCBhIGxpbmUgdGhhdCBoYXMgYSBncmFkaWVudCBvZiBjb2xvcnMgZnJvbSBvbmUgdG8gYW5vdGhlci4gZGVmYXVsdCB0byBzb2Z0IHBpbmsgdG8gYnVyZ3VuZHkKIyB1c2UgYSB1bmljb2RlIGRhc2ggaWYgdW5pY29kZSBpcyBzdXBwb3J0ZWQgb3IgYSByZWd1bGFyIGRhc2ggaWYgbm90CnByaW50X2dyYWRpZW50X2xpbmUoKSB7CiAgIyBEZWZhdWx0czogc29mdCBwaW5rIC0+IGJ1cmd1bmR5CiAgbG9jYWwgcmVwZWF0PSIkezE6LTgwfSIKICBsb2NhbCBzdGFydF9oZXg9IiR7MjotI2Y3YjJjNH0iICAgIyBzb2Z0IHBpbmsKICBsb2NhbCBlbmRfaGV4PSIkezM6LSM2YjAwMjJ9IiAgICAgIyBidXJndW5keQogIGxvY2FsIGNoYXIgcmVzZXQKCiAgIyBQcmVmZXIgVW5pY29kZSBsb25nIGRhc2gKICBjaGFyPSfilZAnCiAgcmVzZXQ9IiR7Q29sb3JfT2ZmOi1cXDAzM1swbX0iCgogICMgVHJ1ZWNvbG9yIHBhdGggKHNtb290aGVzdCkKICBpZiBzdXBwb3J0c190cnVlY29sb3I7IHRoZW4KICAgIGxvY2FsIHNoPSIke3N0YXJ0X2hleCNcI30iIGVoPSIke2VuZF9oZXgjXCN9IgogICAgbG9jYWwgcjE9JCgoMTYjJHtzaDowOjJ9KSkgZzE9JCgoMTYjJHtzaDoyOjJ9KSkgYjE9JCgoMTYjJHtzaDo0OjJ9KSkKICAgIGxvY2FsIHIyPSQoKDE2IyR7ZWg6MDoyfSkpIGcyPSQoKDE2IyR7ZWg6MjoyfSkpIGIyPSQoKDE2IyR7ZWg6NDoyfSkpCiAgICBhd2sgLXYgbj0iJHJlcGVhdCIgLXYgYz0iJGNoYXIiIC12IHIxPSIkcjEiIC12IGcxPSIkZzEiIC12IGIxPSIkYjEiIC12IHIyPSIkcjIiIC12IGcyPSIkZzIiIC12IGIyPSIkYjIiICcKICAgICAgQkVHSU4gewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgIHQgPSAobiA+IDEpID8gaSAvIChuIC0gMSkgOiAwCiAgICAgICAgICByID0gaW50KHIxICsgKHIyIC0gcjEpICogdCArIDAuNSkKICAgICAgICAgIGcgPSBpbnQoZzEgKyAoZzIgLSBnMSkgKiB0ICsgMC41KQogICAgICAgICAgYiA9IGludChiMSArIChiMiAtIGIxKSAqIHQgKyAwLjUpCiAgICAgICAgICBwcmludGYoIlwwMzNbMzg7MjslZDslZDslZG0lcyIsIHIsIGcsIGIsIGMpCiAgICAgICAgfQogICAgICAgIHByaW50ZigiXDAzM1swbVxuIikKICAgICAgfScKICAgIHJldHVybgogIGZpCgogICMgMjU2LWNvbG9yIGZhbGxiYWNrIChibG9ja3kgYnV0IGRlY2VudCkKICBpZiBzdXBwb3J0c18yNTZjb2xvcjsgdGhlbgogICAgIyBQaW5rIC0+IGJ1cmd1bmR5LWlzaCBwYWxldHRlCiAgICBsb2NhbCBwYWxldHRlPSgyMjQgMjE3IDIxOCAyMTIgMjExIDIxMCAyMDUgMjA0IDE5OCAxOTcgMTYxIDEyNSA4OSA4OCA1MikKICAgIGxvY2FsIHRvdGFsPSR7I3BhbGV0dGVbQF19CiAgICBsb2NhbCBwcmludGVkPTAKICAgIGxvY2FsIHBlcj0kKCggKHJlcGVhdCArIHRvdGFsIC0gMSkgLyB0b3RhbCApKQogICAgbG9jYWwgc3BhY2VzIGNodW5rIGNvZGUgY291bnQKICAgIHdoaWxlIFsgIiRwcmludGVkIiAtbHQgIiRyZXBlYXQiIF07IGRvCiAgICAgIGZvciBjb2RlIGluICIke3BhbGV0dGVbQF19IjsgZG8KICAgICAgICBjb3VudD0kKCggcmVwZWF0IC0gcHJpbnRlZCApKQogICAgICAgIFsgIiRjb3VudCIgLWxlIDAgXSAmJiBicmVhawogICAgICAgIFsgIiRjb3VudCIgLWd0ICIkcGVyIiBdICYmIGNvdW50PSIkcGVyIgogICAgICAgIHByaW50ZiAiXDAzM1szODs1OyVzbSIgIiRjb2RlIgogICAgICAgIHNwYWNlcz0kKHByaW50ZiAiJSpzIiAiJGNvdW50IiAiIikKICAgICAgICAjIHJlcGxhY2Ugc3BhY2VzIHdpdGggdGhlIGNob3NlbiBjaGFyICh3b3JrcyB3aXRoIG11bHRpYnl0ZSByZXBsYWNlbWVudCkKICAgICAgICBwcmludGYgIiVzIiAiJHtzcGFjZXMvLyAvJGNoYXJ9IgogICAgICAgIHByaW50ZWQ9JCgoIHByaW50ZWQgKyBjb3VudCApKQogICAgICBkb25lCiAgICBkb25lCiAgICBwcmludGYgIlwwMzNbMG1cbiIKICAgIHJldHVybgogIGZpCgogICMgUGxhaW4gQVNDSUkgZmFsbGJhY2sKICBsb2NhbCBzcGFjZXM9JChwcmludGYgIiUqcyIgIiRyZXBlYXQiICIiKQogIHByaW50ZiAiJXNcbiIgIiR7c3BhY2VzLy8gLyRjaGFyfSIKfQoKIyBwcmludCBsaW5lIGZ1bmN0aW9uIHdpdGggb3B0aW9uYWwgY29sb3VyIGFuZCBjaGFyYWN0ZXIKcHJpbnRfbGluZSgpIHsKICAgIGxvY2FsIGNvbG9yPSIkezE6LSRCQmx1ZX0iICAgIyBkZWZhdWx0IHRvICRCQmx1ZSBpZiB1bnNldAogICAgbG9jYWwgY2hhcj0iJHsyOi09fSIgICAgICAgICAjIGRlZmF1bHQgdG8gJz0nCiAgICBsb2NhbCByZXBlYXQ9IiR7MzotODB9IiAgICAgICMgZGVmYXVsdCB0byA4MAogICAgbG9jYWwgbGluZQoKICAgIGxpbmU9JChwcmludGYgIiUqcyIgIiRyZXBlYXQiICIiIHwgdHIgJyAnICIkY2hhciIpCiAgICBlY2hvIC1lICIke2NvbG9yfSR7bGluZX0ke0NvbG9yX09mZn0iCn0KCmNvbG91cl9tYWlhc3MoKXsKICBsb2NhbCByZXNldD0kJ1xlWzBtJwogICMgU29mdCBwaW5rIC0+IGJ1cmd1bmR5IGFjcm9zcyBNIEEgSSBBIFMgUwogIGxvY2FsIC1hIGNvbHM9KDIxOCAyMTEgMjA1IDE5OCAxNjEgODgpCiAgbG9jYWwgd29yZD0iTUFJQVNTIgogIGxvY2FsIGNvbG9yZWQ9IiIKICBmb3IgKChpPTA7IGk8JHsjd29yZH07IGkrKykpOyBkbwogICAgY29sb3JlZCs9JCdcZVszODs1Oycke2NvbHNbaV19bSIke3dvcmQ6aToxfSIKICBkb25lCiAgZWNobyAkY29sb3JlZAp9CgpwcmludF90aGFua3MoKSB7CiAgbG9jYWwgcmVzZXQ9JCdcZVswbScKICBsb2NhbCBtYWlhc3M9JChjb2xvdXJfbWFpYXNzKQogIHByaW50ZiAnXGVbMzg7NTsyMThtfCkpICVzIFRoYW5rIHlvdSBmb3IgdXNpbmcgJXMlcyEg4pyoXG4nICIkcmVzZXQiICIkbWFpYXNzIiAiJHJlc2V0Igp9CgojIGRldmxvZy5zaCBpcyBteSBwZXJzb25hbCBzY3JpcHQgZm9yIGxvZ2dpbmcgd29yayBpbiBnb29nbGUgc2hlZXRzLgojIGlmIGRldmxvZy5zaCBpcyBub3QgYSBiYXNoIHNjcmlwdCwgY3JlYXRlIGFuIGVtcHR5IGZ1bmN0aW9uIHRvIHByZXZlbnQgZXJyb3JzCmlmIFsgLXogIiQodHlwZSAtdCBkZXZsb2cuc2gpIiBdOyB0aGVuCiAgICBmdW5jdGlvbiBkZXZsb2cuc2goKSB7CiAgICAgICAgOgogICAgfQpmaQoKIyBQcmludCBhIGRlY29yYXRlZCBoZWFkZXIKcHJpbnRfaGVhZGVyKCkgewoKICAgIGxvY2FsIG1haWFzcz0kKGNvbG91cl9tYWlhc3MpCiAgICBwcmludF9ncmFkaWVudF9saW5lIDYwICIjMDAwMEZGIiAiIzI5Q0NDMSIKICAgIGVjaG8gLWUgIiR7QlNvZnRQaW5rfXwpKSR7QkJsdWV9ICAgICAgICAgICAgIFdlbGNvbWUgdG8gJHttYWlhc3N9ICR7Qmx1ZX0gUkMgdiR7TUFJQVNTX0NMSUVOVF9WRVJTSU9OfSAke0NvbG9yX09mZn0iCiAgICBwcmludF9ncmFkaWVudF9saW5lIDYwICIjMDAwMEZGIiAiIzI5Q0NDMSIKfQoKZnVuY3Rpb24gbG9ndGhpcygpewogICAgIyBicmFuY2hfbmFtZSBqaXJhX3RpY2tldF9udW1iZXIgcHJvamVjdF9uYW1lIGNsaWVudF9uYW1lCiAgICAjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzEwNzMKICAgIGRlYnVnbXNnPSQoZGV2bG9nLnNoIC0tICIkMSIgIj8iICIke2xvZ19wcm9qZWN0Oi0ke3Byb2plY3RfbmFtZTotJHtwcm9qZWN0Oi11bmtub3dufX19IiAiJHtsb2dfY2xpZW50Oj1WZWx2YXJ5fSIgIiR7amlyYV90aWNrZXRfbnVtYmVyOj1EZXZvcHN9IiAiJHtsb2dfc3ViY2xpZW50Oi11bmtub3dufSIpID4vZGV2L251bGwgMj4mMQoKfQoKZmkgIyBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX2xvZ2dlcl9zaAojIC0tLSBFbmQgaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvY29yZS9sb2dnZXIuc2ggLS0tCgojIC0tLSBCZWdpbiBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi9jb25maWcvZW52YXJzLnNoIC0tLQppZiBbWyAteiAiJHtfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb25maWdfZW52YXJzX3NoOi19IiBdXTsgdGhlbiBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb25maWdfZW52YXJzX3NoPTEKCiMgRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3cgbG9hZGVkIHdpdGggc2VjdXJlIHByaW9yaXR5IHN5c3RlbSBhYm92ZQoKIyBTZWN1cmUgZW52aXJvbm1lbnQgdmFyaWFibGUgbG9hZGluZyB3aXRoIHByaW9yaXR5IG9yZGVyCmxvYWRfZW52aXJvbm1lbnRfdmFyaWFibGVzKCkgewogICAgbG9jYWwgcHJvamVjdF9lbnY9Ii5lbnYubWFpYXNzIgogICAgbG9jYWwgbG9jYWxfZW52PSIuZW52Lm1haWFzcy5sb2NhbCIKCiAgICAjIFByaW9yaXR5IDE6IFByb2plY3Qtc3BlY2lmaWMgZW52IGZpbGUKICAgIGlmIFtbIC1mICIkcHJvamVjdF9lbnYiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiTG9hZGluZyBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gZnJvbSAke0JDeWFufSRwcm9qZWN0X2VudiR7Q29sb3JfT2ZmfSIgImRlYnVnIgogICAgICAgIHNvdXJjZSAiJHByb2plY3RfZW52IgogICAgZmkKCiAgICAjIFByaW9yaXR5IDEuNTogTG9jYWwgb3ZlcnJpZGUgZW52IGZpbGUgKHRha2VzIHByZWNlZGVuY2Ugb3ZlciBwcm9qZWN0IGVudikKICAgIGlmIFtbIC1mICIkbG9jYWxfZW52IiBdXTsgdGhlbgogICAgICAgIHByaW50X2luZm8gIkxvYWRpbmcgbG9jYWwgY29uZmlndXJhdGlvbiBmcm9tICR7QkN5YW59JGxvY2FsX2VudiR7Q29sb3JfT2ZmfSIgImRlYnVnIgogICAgICAgIHNvdXJjZSAiJGxvY2FsX2VudiIKICAgIGZpCgogICAgIyBQcmlvcml0eSAyOiBTZWN1cmUgc3RvcmFnZSAoY3Jvc3MtcGxhdGZvcm0pCiAgICBsb2FkX3NlY3VyZV92YXJpYWJsZXMKCiAgICAjIFByaW9yaXR5IDM6IFN5c3RlbSBlbnZpcm9ubWVudCAoYWxyZWFkeSBleHBvcnRlZCBieSBzaGVsbCwgbm90aGluZyB0byBsb2FkKQp9CgojIEdldCBlbnZpcm9ubWVudC1zcGVjaWZpYyBzZXJ2aWNlIG5hbWUgZm9yIHNlY3VyZSBzdG9yYWdlCiMgUHJvZHVjdGlvbiAoZGVmYXVsdCk6ICJtYWlhc3MiIC0gTk8gU1VGRklYIChiYWNrd2FyZCBjb21wYXRpYmxlKQojIExvY2FsaG9zdDogIm1haWFzc19sb2NhbGhvc3QiCiMgUHJldmlldzogIm1haWFzc19wcmV2aWV3IgpnZXRfc2VjdXJlX3NlcnZpY2VfbmFtZSgpIHsKICAgIGxvY2FsIGhvc3Q9IiR7TUFJQVNTX0FJX0hPU1Q6LWh0dHBzOi8vcG91bmQubWFpYXNzLm5ldH0iCiAgICAKICAgICMgQ2hlY2sgZm9yIGxvY2FsaG9zdC8xMjcuMC4wLjEKICAgIGlmIFtbICIkaG9zdCIgPT0gKiJsb2NhbGhvc3QiKiBdXSB8fCBbWyAiJGhvc3QiID09ICoiMTI3LjAuMC4xIiogXV07IHRoZW4KICAgICAgICBlY2hvICJtYWlhc3NfbG9jYWxob3N0IgogICAgIyBDaGVjayBmb3IgcHJldmlldyBlbnZpcm9ubWVudAogICAgZWxpZiBbWyAiJGhvc3QiID09ICoicHJldmlldyIqIF1dOyB0aGVuCiAgICAgICAgZWNobyAibWFpYXNzX3ByZXZpZXciCiAgICAjIFByb2R1Y3Rpb24gKGRlZmF1bHQpIC0gTk8gU1VGRklYIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICBlbHNlCiAgICAgICAgZWNobyAibWFpYXNzIgogICAgZmkKfQoKIyBMb2FkIHNlbnNpdGl2ZSB2YXJpYWJsZXMgZnJvbSBzZWN1cmUgc3RvcmFnZQpsb2FkX3NlY3VyZV92YXJpYWJsZXMoKSB7CiAgICBsb2NhbCBzZWN1cmVfdmFycz0oIk1BSUFTU19BSV9UT0tFTiIgIk1BSUFTU19TVUJTQ1JJUFRJT05fSUQiKQogICAgbG9jYWwgdG9rZW5fcHJvbXB0ZWQ9MAogICAgbG9jYWwgc2VydmljZV9uYW1lPSQoZ2V0X3NlY3VyZV9zZXJ2aWNlX25hbWUpCgogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBVc2luZyBzZWN1cmUgc3RvcmFnZSBzZXJ2aWNlIG5hbWU6ICRzZXJ2aWNlX25hbWUgKGhvc3Q6ICR7TUFJQVNTX0FJX0hPU1Q6LWh0dHBzOi8vcG91bmQubWFpYXNzLm5ldH0pIiAiZGVidWciCgogICAgZm9yIHZhciBpbiAiJHtzZWN1cmVfdmFyc1tAXX0iOyBkbwogICAgICAgICMgQ2hlY2sgaWYgd2Ugc2hvdWxkIHByZWZlciBzZWN1cmUgc3RvcmFnZSBvdmVyIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAgICAgbG9jYWwgcHJlZmVyX3NlY3VyZT1mYWxzZQogICAgICAgIGlmIFtbICIkdmFyIiA9PSAiTUFJQVNTX0FJX1RPS0VOIiAmJiAtbiAiJHshdmFyfSIgXV07IHRoZW4KICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgZXhpc3RpbmcgdG9rZW4gbG9va3MgaW52YWxpZAogICAgICAgICAgICBpZiBbWyAiJHshdmFyfSIgPX4gXmludmFsaWRffF50ZXN0X3xfdGVzdCQgXV0gfHwgW1sgIiR7IXZhcn0iID09ICJESVNBQkxFRCIgXV07IHRoZW4KICAgICAgICAgICAgICAgIHByZWZlcl9zZWN1cmU9dHJ1ZQogICAgICAgICAgICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBFbnZpcm9ubWVudCB0b2tlbiBhcHBlYXJzIGludmFsaWQsIGNoZWNraW5nIHNlY3VyZSBzdG9yYWdlIiAiZGVidWciCiAgICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICAjIFNraXAgaWYgYWxyZWFkeSBzZXQgd2l0aCB2YWxpZCB0b2tlbiAodW5sZXNzIHdlIHdhbnQgdG8gcHJlZmVyIHNlY3VyZSBzdG9yYWdlKQogICAgICAgIGlmIFtbIC1uICIkeyF2YXJ9IiAmJiAiJHByZWZlcl9zZWN1cmUiICE9ICJ0cnVlIiBdXTsgdGhlbgogICAgICAgICAgICBjb250aW51ZSAgIyBhbHJlYWR5IHNldCB2aWEgLmVudiBvciBlbnYgdmFyCiAgICAgICAgZmkKCiAgICAgICAgbG9jYWwgdmFsdWU9IiIKICAgICAgICBpZiBbWyAiJE9TVFlQRSIgPT0gImRhcndpbiIqIF1dOyB0aGVuCiAgICAgICAgICAgIHZhbHVlPSQoc2VjdXJpdHkgZmluZC1nZW5lcmljLXBhc3N3b3JkIC1zICIkc2VydmljZV9uYW1lIiAtYSAiJHZhciIgLXcgMj4vZGV2L251bGwpCiAgICAgICAgZWxpZiBjb21tYW5kIC12IHNlY3JldC10b29sID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgICB2YWx1ZT0kKHNlY3JldC10b29sIGxvb2t1cCBzZXJ2aWNlICIkc2VydmljZV9uYW1lIiBrZXkgIiR2YXIiIDI+L2Rldi9udWxsKQogICAgICAgIGZpCgogICAgICAgIGlmIFtbIC1uICIkdmFsdWUiIF1dOyB0aGVuCiAgICAgICAgICAgIGV4cG9ydCAiJHZhciI9IiR2YWx1ZSIKICAgICAgICAgICAgaWYgW1sgIiRwcmVmZXJfc2VjdXJlIiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgICAgICAgICAgICAgIHByaW50X2RlYnVnICJERUJVRzogUmVwbGFjZWQgaW52YWxpZCBlbnZpcm9ubWVudCB0b2tlbiB3aXRoIHNlY3VyZSBzdG9yYWdlIHRva2VuIiAiZGVidWciCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHByaW50X2RlYnVnICJERUJVRzogTG9hZGVkICR2YXIgZnJvbSBzZWN1cmUgc3RvcmFnZSIgImRlYnVnIgogICAgICAgICAgICBmaQogICAgICAgIGVsaWYgW1sgIiR2YXIiID09ICJNQUlBU1NfQUlfVE9LRU4iICYmIC16ICIkdmFsdWUiICYmIC16ICIkeyF2YXJ9IiAmJiAiJHRva2VuX3Byb21wdGVkIiAtZXEgMCBdXTsgdGhlbgogICAgICAgICAgICAjIEhhbmRsZSBtaXNzaW5nIEFJIHRva2VuIC0gY2hlY2sgaWYgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGFub255bW91cyBzdWJzY3JpcHRpb24KICAgICAgICAgICAgaWYgW1sgISAtdCAwIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF93YXJuaW5nICJBSSB0b2tlbiBub3QgZm91bmQgYW5kIHRlcm1pbmFsIGlzIG5vdCBpbnRlcmFjdGl2ZS4gUGxlYXNlIHNldCBNQUlBU1NfQUlfVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGUuIgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZmkKCiAgICAgICAgICAgICMgQ2hlY2sgaWYgYXV0b21hdGljIGFub255bW91cyBzdWJzY3JpcHRpb24gaXMgZW5hYmxlZCAoY2hlY2sgZW52IHZhciBkaXJlY3RseSkKICAgICAgICAgICAgaWYgW1sgIiR7TUFJQVNTX0FJX0lOVkFMSURfVE9LRU5fQ0hPSUNFUzotfSIgPT0gImZhbHNlIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSBhbHJlYWR5IHRyaWVkIHRvIGNyZWF0ZSBhbm9ueW1vdXMgc3Vic2NyaXB0aW9uIHRoaXMgc2Vzc2lvbgogICAgICAgICAgICAgICAgaWYgW1sgIiRfTUFJQVNTX0FOT05fQVRURU1QVEVEIiAhPSAidHJ1ZSIgXV07IHRoZW4KICAgICAgICAgICAgICAgICAgICBwcmludF9pbmZvICJObyBBSSB0b2tlbiBmb3VuZC4gQXV0b21hdGljYWxseSBjcmVhdGluZyBhbm9ueW1vdXMgc3Vic2NyaXB0aW9uLi4uIgogICAgICAgICAgICAgICAgICAgIGV4cG9ydCBfTUFJQVNTX0FOT05fQVRURU1QVEVEPSJ0cnVlIgogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICMgV2UgbmVlZCB0byBjYWxsIHRoZSBhbm9ueW1vdXMgc3Vic2NyaXB0aW9uIGZ1bmN0aW9uLCBidXQgaXQncyBpbiBhaS5zaAogICAgICAgICAgICAgICAgICAgICMgRm9yIG5vdywganVzdCBtYXJrIHRoYXQgd2UgbmVlZCB0byBoYW5kbGUgdGhpcyBpbiB0aGUgQUkgbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0IF9NQUlBU1NfTkVFRF9BTk9OX1RPS0VOPSJ0cnVlIgogICAgICAgICAgICAgICAgICAgIGV4cG9ydCBNQUlBU1NfQUlfVE9LRU49IiIgICMgU2V0IGVtcHR5IHRvIHRyaWdnZXIgQUkgbW9kdWxlIGhhbmRsaW5nCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcHJpbnRfd2FybmluZyAiQW5vbnltb3VzIHN1YnNjcmlwdGlvbiBhbHJlYWR5IGF0dGVtcHRlZCB0aGlzIHNlc3Npb24uIEFJIGZlYXR1cmVzIHdpbGwgYmUgZGlzYWJsZWQuIgogICAgICAgICAgICAgICAgICAgIGV4cG9ydCBNQUlBU1NfQUlfVE9LRU49IkRJU0FCTEVEIgogICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgZmkKICAgICAgICBmaQogICAgZG9uZQp9CiMgU3RvcmUgc2Vuc2l0aXZlIHZhcmlhYmxlcyBpbiBzZWN1cmUgc3RvcmFnZQpzdG9yZV9zZWN1cmVfdmFyaWFibGUoKSB7CiAgICBsb2NhbCB2YXJfbmFtZT0iJDEiCiAgICBsb2NhbCB2YXJfdmFsdWU9IiQyIgogICAgbG9jYWwgc2VydmljZV9uYW1lPSQoZ2V0X3NlY3VyZV9zZXJ2aWNlX25hbWUpCgogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBTdG9yaW5nICR2YXJfbmFtZSBpbiBzZWN1cmUgc3RvcmFnZSBzZXJ2aWNlOiAkc2VydmljZV9uYW1lIiAiZGVidWciCgogICAgaWYgW1sgIiRPU1RZUEUiID09ICJkYXJ3aW4iKiBdXTsgdGhlbgogICAgICAgICMgVXNlIGRpcmVjdCBhcmd1bWVudCBpbnN0ZWFkIG9mIHN0ZGluIHRvIGF2b2lkIHBhcnNpbmcgaXNzdWVzCiAgICAgICAgc2VjdXJpdHkgYWRkLWdlbmVyaWMtcGFzc3dvcmQgLVUgLXMgIiRzZXJ2aWNlX25hbWUiIC1hICIkdmFyX25hbWUiIC13ICIkdmFyX3ZhbHVlIiAyPi9kZXYvbnVsbAogICAgZWxpZiBjb21tYW5kIC12IHNlY3JldC10b29sID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gLW4gIiR2YXJfdmFsdWUiIHwgc2VjcmV0LXRvb2wgc3RvcmUgLS1sYWJlbD0iTUFJQVNTICR2YXJfbmFtZSAoJHNlcnZpY2VfbmFtZSkiIHNlcnZpY2UgIiRzZXJ2aWNlX25hbWUiIGtleSAiJHZhcl9uYW1lIgogICAgZWxzZQogICAgICAgIHByaW50X3dhcm5pbmcgIk5vIHNlY3VyZSBzdG9yYWdlIGJhY2tlbmQgYXZhaWxhYmxlIgogICAgICAgIHJldHVybiAxCiAgICBmaQp9CgojIFJlbW92ZSBzZW5zaXRpdmUgdmFyaWFibGVzIGZyb20gc2VjdXJlIHN0b3JhZ2UKcmVtb3ZlX3NlY3VyZV92YXJpYWJsZSgpIHsKICAgIGxvY2FsIHZhcl9uYW1lPSIkMSIKICAgIGxvY2FsIHNlcnZpY2VfbmFtZT0kKGdldF9zZWN1cmVfc2VydmljZV9uYW1lKQoKICAgIHByaW50X2RlYnVnICJERUJVRzogUmVtb3ZpbmcgJHZhcl9uYW1lIGZyb20gc2VjdXJlIHN0b3JhZ2Ugc2VydmljZTogJHNlcnZpY2VfbmFtZSIgImRlYnVnIgoKICAgIGlmIFtbICIkT1NUWVBFIiA9PSAiZGFyd2luIiogXV07IHRoZW4KICAgICAgICBzZWN1cml0eSBkZWxldGUtZ2VuZXJpYy1wYXNzd29yZCAtcyAiJHNlcnZpY2VfbmFtZSIgLWEgIiR2YXJfbmFtZSIgMj4vZGV2L251bGwKICAgIGVsaWYgY29tbWFuZCAtdiBzZWNyZXQtdG9vbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAjIE5vIGRpcmVjdCBkZWxldGUgd2l0aCBzZWNyZXQtdG9vbDsgbmVlZCB0byB1c2Uga2V5cmluZyBDTEkgb3IgbGV0IHVzZXIgaGFuZGxlIGl0CiAgICAgICAgcHJpbnRfd2FybmluZyAiUmVtb3Zpbmcgc2VjcmV0cyBmcm9tIExpbnV4IGtleXJpbmdzIHJlcXVpcmVzIG1hbnVhbCBpbnRlcnZlbnRpb24iCiAgICBlbHNlCiAgICAgICAgcHJpbnRfd2FybmluZyAiTm8gc2VjdXJlIHN0b3JhZ2UgYmFja2VuZCBhdmFpbGFibGUiCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCn0KCmZpICMgX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29uZmlnX2VudmFyc19zaAojIC0tLSBFbmQgaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvY29uZmlnL2VudmFycy5zaCAtLS0KCiMgTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCBuZXcgcHJpb3JpdHkgc3lzdGVtCmxvYWRfZW52aXJvbm1lbnRfdmFyaWFibGVzCgpleHBvcnQgaWdub3JlX2xvY2FsX2Vudj0iJHtNQUlBU1NfSUdOT1JFX0xPQ0FMX0VOVjo9ZmFsc2V9IgoKIyAtLS0gQmVnaW4gaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvdXRpbHMvdXRpbHMuc2ggLS0tCmlmIFtbIC16ICIke19fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX3V0aWxzX3V0aWxzX3NoOi19IiBdXTsgdGhlbiBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl91dGlsc191dGlsc19zaD0xCgptYXNrX2FwaV9rZXkoKSB7CiAgICBsb2NhbCBhcGlfa2V5PSIkMSIKCiAgICAjIENoZWNrIGlmIGtleSBpcyBlbXB0eSBvciB0b28gc2hvcnQKICAgIGlmIFtbIC16ICIkYXBpX2tleSIgXV0gfHwgW1sgJHsjYXBpX2tleX0gLWx0IDggXV07IHRoZW4KICAgICAgICBlY2hvICJbSU5WQUxJRF9LRVldIgogICAgICAgIHJldHVybgogICAgZmkKCiAgICAjIEV4dHJhY3QgZmlyc3QgNCBhbmQgbGFzdCA0IGNoYXJhY3RlcnMgdXNpbmcgcGFyYW1ldGVyIGV4cGFuc2lvbgogICAgbG9jYWwgZmlyc3RfZm91cj0iJHthcGlfa2V5OjA6NH0iCiAgICBsb2NhbCBsYXN0X2ZvdXI9IiR7YXBpX2tleTogLTR9IgoKICAgIGVjaG8gIiR7Zmlyc3RfZm91cn0qKioqJHtsYXN0X2ZvdXJ9Igp9Cgplc2NhcGVfcmVnZXgoKSB7CiAgIyBFc2NhcGVzIGFsbCByZWdleCBtZXRhY2hhcmFjdGVycwogIGVjaG8gIiQxIiB8IHNlZCAtZSAncy9bXVtcLy5eJCorPygpe318XS9cXCYvZycKfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQ1JJVElDQUw6IE1BQ0hJTkUgRklOR0VSUFJJTlQgQUxHT1JJVEhNIC0gRE8gTk9UIE1PRElGWQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXQVJOSU5HOiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBtYWNoaW5lIGZpbmdlcnByaW50cyBmb3IgYW5vbnltb3VzIGN1c3RvbWVycy4KIyBDaGFuZ2luZyB0aGlzIGFsZ29yaXRobSB3aWxsIGNhdXNlIEFMTCBhbm9ueW1vdXMgY3VzdG9tZXJzIHRvIGxvc2UgdGhlaXIgY3JlZGl0cyEKIyAKIyBDdXJyZW50IGFsZ29yaXRobTogTUFDfENQVXxEaXNrfEtlcm5lbCDihpIgU0hBLTI1NiBoZXgKIyAKIyBJRiBZT1UgTkVFRCBUTyBVUEdSQURFIFRISVMgUFJPQ0VTUzoKIyAxLiBDcmVhdGUgYSBORVcgZnVuY3Rpb24gKGUuZy4sIGdlbmVyYXRlX21hY2hpbmVfZmluZ2VycHJpbnRfdjIpCiMgMi4gTWFrZSB0aGUgbmV3IGZ1bmN0aW9uIGNoZWNrIHRoaXMgb25lIGFzIGEgZmFsbGJhY2sKIyAzLiBVcGRhdGUgdGhlIGRhdGFiYXNlIHRvIGhhbmRsZSBtdWx0aXBsZSBmaW5nZXJwcmludCB2ZXJzaW9ucwojIDQuIE5FVkVSIG1vZGlmeSB0aGlzIGV4aXN0aW5nIGZ1bmN0aW9uCiMKIyBUaGlzIGFsZ29yaXRobSB3YXMgZXN0YWJsaXNoZWQgb24gQXVndXN0IDcsIDIwMjUgYW5kIG11c3QgcmVtYWluIHN0YWJsZS4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpnZW5lcmF0ZV9tYWNoaW5lX2ZpbmdlcnByaW50KCkgewogICMgR2V0IE1BQyBhZGRyZXNzCiAgZ2V0X21hY19hZGRyZXNzKCkgewogICAgaWYgY29tbWFuZCAtdiBpcCAmPi9kZXYvbnVsbDsgdGhlbgogICAgICBpcCBsaW5rIHwgYXdrICcvZXRoZXIvIHtwcmludCAkMjsgZXhpdH0nCiAgICBlbHNlCiAgICAgICMgbWFjT1MgZmFsbGJhY2sKICAgICAgbmV0d29ya3NldHVwIC1saXN0YWxsaGFyZHdhcmVwb3J0cyB8IFwKICAgICAgICBhd2sgJy9EZXZpY2V8RXRoZXJuZXQgQWRkcmVzcy8gewogICAgICAgICAgaWYgKCQxID09ICJEZXZpY2U6IikgZGV2PSQyOwogICAgICAgICAgZWxzZSBpZiAoJDEgPT0gIkV0aGVybmV0IikgewogICAgICAgICAgICBwcmludCAkMzsKICAgICAgICAgICAgZXhpdAogICAgICAgICAgfQogICAgICAgIH0nCiAgICBmaQogIH0KCiAgIyBHZXQgQ1BVIGluZm8KICBnZXRfY3B1X2luZm8oKSB7CiAgICBpZiBbWyAiJE9TVFlQRSIgPT0gImRhcndpbiIqIF1dOyB0aGVuCiAgICAgIHN5c2N0bCAtbiBtYWNoZGVwLmNwdS5icmFuZF9zdHJpbmcKICAgIGVsc2UKICAgICAgZ3JlcCAtbTEgJ21vZGVsIG5hbWUnIC9wcm9jL2NwdWluZm8gfCBjdXQgLWQgJzonIC1mIDIgfCB4YXJncwogICAgZmkKICB9CgogICMgR2V0IGRpc2sgSUQgb3Igdm9sdW1lIFVVSUQKICBnZXRfZGlza19pZGVudGlmaWVyKCkgewogICAgaWYgW1sgIiRPU1RZUEUiID09ICJkYXJ3aW4iKiBdXTsgdGhlbgogICAgICBkaXNrdXRpbCBpbmZvIC8gfCBhd2sgLUYnOiAnICcvVm9sdW1lIFVVSUQvIHtwcmludCAkMjsgZXhpdH0nCiAgICBlbHNlCiAgICAgIHJvb3RfZGlzaz0kKGRmIC8gfCB0YWlsIC0xIHwgYXdrICd7cHJpbnQgJDF9JyB8IHNlZCAncy9bMC05XSokLy8nKQogICAgICBsc2JsayAtbm8gU0VSSUFMICIkcm9vdF9kaXNrIiAyPi9kZXYvbnVsbCB8fCBlY2hvICJ1bmtub3duLXNlcmlhbCIKICAgIGZpCiAgfQoKICAjIEtlcm5lbCBpbmZvCiAgZ2V0X2tlcm5lbF9pbmZvKCkgewogICAgdW5hbWUgLXNybQogIH0KCiAgIyBIYXNoaW5nIGhlbHBlcgogIGhhc2hfZmluZ2VycHJpbnQoKSB7CiAgICBpZiBjb21tYW5kIC12IHNoYTI1NnN1bSAmPi9kZXYvbnVsbDsgdGhlbgogICAgICBzaGEyNTZzdW0KICAgIGVsc2UKICAgICAgc2hhc3VtIC1hIDI1NgogICAgZmkKICB9CgogICMgTWFpbiBmaW5nZXJwcmludCBnZW5lcmF0aW9uCiAgbWFjPSQoZ2V0X21hY19hZGRyZXNzKQogIGNwdT0kKGdldF9jcHVfaW5mbykKICBkaXNrPSQoZ2V0X2Rpc2tfaWRlbnRpZmllcikKICBrZXJuZWw9JChnZXRfa2VybmVsX2luZm8pCgogIGZpbmdlcnByaW50X2lucHV0PSIke21hY318JHtjcHV9fCR7ZGlza318JHtrZXJuZWx9IgogIGVjaG8gIiRmaW5nZXJwcmludF9pbnB1dCIgfCBoYXNoX2ZpbmdlcnByaW50IHwgYXdrICd7cHJpbnQgJDF9Jwp9CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBNQUNISU5FIEZJTkdFUlBSSU5UIFYyIC0gSEFSRFdBUkUgT05MWSAoTk8gS0VSTkVMIFZFUlNJT04pCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFRoaXMgdmVyc2lvbiBleGNsdWRlcyBrZXJuZWwgdmVyc2lvbiB0byBwcmV2ZW50IGZpbmdlcnByaW50IGNoYW5nZXMgb24gT1MgdXBkYXRlcy4KIyBVc2VkIGZvciBuZXcgYW5vbnltb3VzIHN1YnNjcmlwdGlvbnMgYW5kIG1pZ3JhdGlvbiBmcm9tIHYxLgojIEFsZ29yaXRobTogTUFDfENQVXxEaXNrIOKGkiBTSEEtMjU2IGhleAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmdlbmVyYXRlX21hY2hpbmVfZmluZ2VycHJpbnRfdjIoKSB7CiAgIyBEZWZpbmUgaGVscGVyIGZ1bmN0aW9ucyBsb2NhbGx5IChzYW1lIGFzIHYxIGJ1dCB3aXRob3V0IGtlcm5lbCkKICBnZXRfbWFjX2FkZHJlc3MoKSB7CiAgICBpZiBjb21tYW5kIC12IGlwICY+L2Rldi9udWxsOyB0aGVuCiAgICAgIGlwIGxpbmsgfCBhd2sgJy9ldGhlci8ge3ByaW50ICQyOyBleGl0fScKICAgIGVsc2UKICAgICAgIyBtYWNPUwogICAgICBuZXR3b3Jrc2V0dXAgLWxpc3RhbGxoYXJkd2FyZXBvcnRzIHwgYXdrICcvV2ktRml8RXRoZXJuZXQve2dldGxpbmU7IHByaW50ICQyOyBleGl0fScgMj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biIKICAgIGZpCiAgfQoKICBnZXRfY3B1X2luZm8oKSB7CiAgICBpZiBjb21tYW5kIC12IHN5c2N0bCAmPi9kZXYvbnVsbDsgdGhlbgogICAgICAjIG1hY09TCiAgICAgIHN5c2N0bCAtbiBtYWNoZGVwLmNwdS5icmFuZF9zdHJpbmcgMj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biIKICAgIGVsc2UKICAgICAgIyBMaW51eAogICAgICBncmVwICJtb2RlbCBuYW1lIiAvcHJvYy9jcHVpbmZvIHwgaGVhZCAtMSB8IGN1dCAtZDogLWYyIHwgeGFyZ3MgMj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biIKICAgIGZpCiAgfQoKICBnZXRfZGlza19pZGVudGlmaWVyKCkgewogICAgaWYgY29tbWFuZCAtdiBkaXNrdXRpbCAmPi9kZXYvbnVsbDsgdGhlbgogICAgICAjIG1hY09TIC0gZ2V0IFVVSUQgb2YgYm9vdCBkaXNrCiAgICAgIGRpc2t1dGlsIGluZm8gLyB8IGdyZXAgIlZvbHVtZSBVVUlEIiB8IGF3ayAne3ByaW50ICQzfScgMj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biIKICAgIGVsc2UKICAgICAgIyBMaW51eCAtIGdldCBzZXJpYWwgb2Ygcm9vdCBmaWxlc3lzdGVtIGRldmljZQogICAgICBsb2NhbCByb290X2Rldj0kKGRmIC8gfCB0YWlsIC0xIHwgYXdrICd7cHJpbnQgJDF9JyB8IHNlZCAncy9bMC05XSokLy8nKQogICAgICBsc2JsayAtbm8gU0VSSUFMICIkcm9vdF9kZXYiIDI+L2Rldi9udWxsIHwgaGVhZCAtMSB8fCBlY2hvICJ1bmtub3duIgogICAgZmkKICB9CgogIGhhc2hfZmluZ2VycHJpbnQoKSB7CiAgICBpZiBjb21tYW5kIC12IHNoYXN1bSAmPi9kZXYvbnVsbDsgdGhlbgogICAgICBzaGFzdW0gLWEgMjU2CiAgICBlbHNlCiAgICAgIHNoYTI1NnN1bQogICAgZmkKICB9CgogICMgR2VuZXJhdGUgZmluZ2VycHJpbnQgY29tcG9uZW50cwogIG1hYz0kKGdldF9tYWNfYWRkcmVzcykKICBjcHU9JChnZXRfY3B1X2luZm8pIAogIGRpc2s9JChnZXRfZGlza19pZGVudGlmaWVyKQogIAogICMgQ3JlYXRlIGZpbmdlcnByaW50IGlucHV0IFdJVEhPVVQga2VybmVsIHZlcnNpb24KICBmaW5nZXJwcmludF9pbnB1dD0iJHttYWN9fCR7Y3B1fXwke2Rpc2t9IgogIGVjaG8gIiRmaW5nZXJwcmludF9pbnB1dCIgfCBoYXNoX2ZpbmdlcnByaW50IHwgYXdrICd7cHJpbnQgJDF9Jwp9CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBTUElOTkVSIFVUSUxJVFkgRlVOQ1RJT05TCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNob3dzIGEgc3Bpbm5lciBhbmltYXRpb24gZHVyaW5nIGxvbmctcnVubmluZyBvcGVyYXRpb25zIHRvIGluZGljYXRlIHByb2dyZXNzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyBTdGFydCBhIHNwaW5uZXIgYW5pbWF0aW9uIGluIHRoZSBiYWNrZ3JvdW5kCiMgVXNhZ2U6IHN0YXJ0X3NwaW5uZXIgIkxvYWRpbmcgbWVzc2FnZSIKc3RhcnRfc3Bpbm5lcigpIHsKICBsb2NhbCBtZXNzYWdlPSIkezE6LVdvcmtpbmd9IgogIGxvY2FsIHNwaW5zdHI9J+Kgi+KgmeKgueKguOKgvOKgtOKgpuKgp+Kgh+KgjycKICAKICAjIFVzZSBjb2xvcnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgcGxhaW4gdGV4dAogIGxvY2FsIGNvbG9yX29uPSIke0JZZWxsb3c6LVwwMzNbMTszM219IgogIGxvY2FsIGNvbG9yX29mZj0iJHtDb2xvcl9PZmY6LVwwMzNbMG19IgogIAogICMgSGlkZSBjdXJzb3IKICB0cHV0IGNpdmlzID4mMiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgCiAgIyBTdGFydCBzcGlubmVyIGluIGJhY2tncm91bmQKICB7CiAgICBsb2NhbCBpPTAKICAgIHdoaWxlIHRydWU7IGRvCiAgICAgIGxvY2FsIGNoYXI9IiR7c3BpbnN0cjppKyslJHsjc3BpbnN0cn06MX0iCiAgICAgIHByaW50ZiAiXHIke2NvbG9yX29ufSR7Y2hhcn0ke2NvbG9yX29mZn0gJHttZXNzYWdlfS4uLiIgPiYyCiAgICAgIHNsZWVwIDAuMQogICAgZG9uZQogIH0gJgogIAogICMgU2F2ZSB0aGUgc3Bpbm5lciBQSUQKICBTUElOTkVSX1BJRD0kIQogIGV4cG9ydCBTUElOTkVSX1BJRAp9CgojIFN0b3AgdGhlIHNwaW5uZXIgYW5pbWF0aW9uCiMgVXNhZ2U6IHN0b3Bfc3Bpbm5lciBbZXhpdF9jb2RlXQpzdG9wX3NwaW5uZXIoKSB7CiAgbG9jYWwgZXhpdF9jb2RlPSIkezE6LTB9IgogIAogIGlmIFtbIC1uICIke1NQSU5ORVJfUElEOi19IiBdXTsgdGhlbgogICAgIyBLaWxsIHRoZSBzcGlubmVyIHByb2Nlc3MKICAgIGtpbGwgIiRTUElOTkVSX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgd2FpdCAiJFNQSU5ORVJfUElEIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICB1bnNldCBTUElOTkVSX1BJRAogICAgCiAgICAjIENsZWFyIHRoZSBzcGlubmVyIGxpbmUKICAgIHByaW50ZiAiXHIlKnNcciIgIjEwMCIgIiIgPiYyCiAgICAKICAgICMgU2hvdyBjdXJzb3IgYWdhaW4KICAgIHRwdXQgY25vcm0gPiYyIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIAogICAgIyBTaG93IGNvbXBsZXRpb24gc3RhdHVzIGlmIHN1Y2Nlc3NmdWwKICAgIGlmIFtbICRleGl0X2NvZGUgLWVxIDAgXV07IHRoZW4KICAgICAgbG9jYWwgY29sb3Jfb249IiR7QkdyZWVuOi1cMDMzWzE7MzJtfSIKICAgICAgbG9jYWwgY29sb3Jfb2ZmPSIke0NvbG9yX09mZjotXDAzM1swbX0iCiAgICAgIHByaW50ZiAiJHtjb2xvcl9vbn3inJMke2NvbG9yX29mZn0gRG9uZVxuIiA+JjIKICAgIGZpCiAgZmkKfQoKZmkgIyBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl91dGlsc191dGlsc19zaAojIC0tLSBFbmQgaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvdXRpbHMvdXRpbHMuc2ggLS0tCgojIC0tLSBCZWdpbiBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi9jb3JlL2xvZ2dlci5zaCAtLS0KaWYgW1sgLXogIiR7X19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV9sb2dnZXJfc2g6LX0iIF1dOyB0aGVuIF9fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfbG9nZ2VyX3NoPTEKCmZpICMgX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV9sb2dnZXJfc2gKIyAtLS0gRW5kIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL2NvcmUvbG9nZ2VyLnNoIC0tLQoKIyAtLS0gQmVnaW4gaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvY29yZS9pbml0LnNoIC0tLQppZiBbWyAteiAiJHtfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX2luaXRfc2g6LX0iIF1dOyB0aGVuIF9fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfaW5pdF9zaD0xCgpleHBvcnQgdG90YWxfdG9rZW5zPScnCmV4cG9ydCBjb21wbGV0aW9uX3Rva2Vucz0nJwpleHBvcnQgcHJvbXB0X3Rva2Vucz0nJwpleHBvcnQgdmVyc2lvbl9wcmltYXJ5X2ZpbGU9IiR7TUFJQVNTX1ZFUlNJT05fUFJJTUFSWV9GSUxFOi19IgpleHBvcnQgdmVyc2lvbl9wcmltYXJ5X3R5cGU9IiR7TUFJQVNTX1ZFUlNJT05fUFJJTUFSWV9UWVBFOi19IgpleHBvcnQgdmVyc2lvbl9wcmltYXJ5X2xpbmVfc3RhcnQ9IiR7TUFJQVNTX1ZFUlNJT05fUFJJTUFSWV9MSU5FX1NUQVJUOi19IgpleHBvcnQgdmVyc2lvbl9zZWNvbmRhcnlfZmlsZXM9IiR7TUFJQVNTX1ZFUlNJT05fU0VDT05EQVJZX0ZJTEVTOi19IgoKbG9hZF9mcm9tX2VudigpewogIGxvY2FsIGVudl9maWxlPSIkMSIKICBpZiBbWyAtZiAiJGVudl9maWxlIiBdXTsgdGhlbgogICAgcHJpbnRfZGVidWcgIkxvYWRpbmcgTUFJQVNTXyogdmFyaWFibGVzIGZyb20gJGVudl9maWxlIgoKICAgIHdoaWxlIElGUz0gcmVhZCAtciBsaW5lIHx8IFtbIC1uICIkbGluZSIgXV07IGRvCiAgICAgICMgVHJpbSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UKICAgICAgbGluZT0iJHtsaW5lIyIke2xpbmUlJVshWzpzcGFjZTpdXSp9In0iCiAgICAgIGxpbmU9IiR7bGluZSUiJHtsaW5lIyMqWyFbOnNwYWNlOl1dfSJ9IgoKICAgICAgIyBTa2lwIGJsYW5rIGxpbmVzIGFuZCBjb21tZW50cwogICAgICBbWyAteiAiJGxpbmUiIHx8ICIkbGluZSIgPT0gXCMqIF1dICYmIGNvbnRpbnVlCgogICAgICAjIE9ubHkgcHJvY2VzcyBNQUlBU1NfKiBhc3NpZ25tZW50cwogICAgICBpZiBbWyAiJGxpbmUiID1+IF5NQUlBU1NfIF1dOyB0aGVuCiAgICAgICAgbG9jYWwga2V5PSIke2xpbmUlJT0qfSIKICAgICAgICBsb2NhbCB2YWx1ZT0iJHtsaW5lIyo9fSIKCiAgICAgICAgIyBTdHJpcCBzdXJyb3VuZGluZyBtYXRjaGluZyBxdW90ZXMgd2l0aCBQT1NJWC1zYWZlIGN1dAogICAgICAgIGlmIFtbICIkdmFsdWUiID09IFwiKlwiICYmICIkdmFsdWUiID09ICpcIiBdXSB8fCBbWyAiJHZhbHVlIiA9PSBcJypcJyAmJiAiJHZhbHVlIiA9PSAqXCcgXV07IHRoZW4KICAgICAgICAgIHZhbHVlPSQoZWNobyAiJHZhbHVlIiB8IGN1dCAtYzItIHwgcmV2IHwgY3V0IC1jMi0gfCByZXYpCiAgICAgICAgZmkKCiAgICAgICAgZXhwb3J0ICIka2V5PSR2YWx1ZSIKICAgICAgICBwcmludF9pbmZvICJTZXQgJGtleT0kdmFsdWUiCiAgICAgIGZpCiAgICBkb25lIDwgIiRlbnZfZmlsZSIKICBmaQp9CgojIEZ1bmN0aW9uIHRvIGxvYWQgTUFJQVNTXyogdmFyaWFibGVzIGZyb20gLmVudiBmaWxlcwpsb2FkX2J1bXBzY3JpcHRfZW52KCkgewogIGxvY2FsIGVudl9maWxlPSIuZW52Lm1haWFzcyIKICBsb2FkX2Zyb21fZW52ICIkZW52X2ZpbGUiCiAgZW52X2ZpbGU9Ii5lbnYubWFpYXNzLmxvY2FsIgogIGxvYWRfZnJvbV9lbnYgIiRlbnZfZmlsZSIKfQoKIyBGdW5jdGlvbiB0byBzZXQgdXAgYnJhbmNoIGFuZCBjaGFuZ2Vsb2cgdmFyaWFibGVzIHdpdGggb3ZlcnJpZGUgbG9naWMKc2V0dXBfYnVtcHNjcmlwdF92YXJpYWJsZXMoKSB7CgogICAgICAjIEluaXRpYWxpemUgZGVidWcgbW9kZSBlYXJseSBzbyBpdCdzIGF2YWlsYWJsZSB0aHJvdWdob3V0IHRoZSBzY3JpcHQKICAgICAgZXhwb3J0IGRlYnVnX21vZGU9IiR7TUFJQVNTX0RFQlVHOj1mYWxzZX0iCiAgICAgIGV4cG9ydCBhdXRvcHVzaF9jb21taXRzPSIke01BSUFTU19BVVRPUFVTSF9DT01NSVRTOj1mYWxzZX0iCiAgICAgIGV4cG9ydCBicmFuZD0iJHtNQUlBU1NfQlJBTkQ6PU1BSUFTU30iCiAgICAgICMgSW5pdGlhbGl6ZSBicmV2aXR5IGFuZCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gLSBzZXQgZGVidWcgZm9yIHRlc3RpbmcKICAgICAgZXhwb3J0IHZlcmJvc2l0eV9sZXZlbD0iJHtNQUlBU1NfVkVSQk9TSVRZOj1icmllZn0iCiAgICAgIGV4cG9ydCBlbmFibGVfbG9nZ2luZz0iJHtNQUlBU1NfTE9HR0lORzo9dHJ1ZX0iCiAgICAgIGV4cG9ydCBsb2dfZmlsZT0iJHtNQUlBU1NfTE9HX0ZJTEU6PW1haWFzcy5sb2d9IgogICAgICBleHBvcnQgY3JlZGl0PSdudWfDqXQnCiAgICAgIGV4cG9ydCBoaWRlZ2l0PSIke01BSUFTU19ISURFR0lUOj10cnVlfSIKCiAgICAgICMgSW5pdGlhbGl6ZSBBSSB2YXJpYWJsZXMgZWFybHkgc28gdGhleSdyZSBhdmFpbGFibGUgd2hlbiBnZXRfY29tbWl0X21lc3NhZ2UgaXMgY2FsbGVkCiAgICAgIGV4cG9ydCBhaV9pbnZhbGlkX3Rva2VuX2Nob2ljZXM9IiR7TUFJQVNTX0FJX0lOVkFMSURfVE9LRU5fQ0hPSUNFUzotZmFsc2V9IgogICAgICBleHBvcnQgYWlfbW9kZT0iJHtNQUlBU1NfQUlfTU9ERTotYXNrfSIKICAgICAgcHJpbnRfZGVidWcgIkRFQlVHIElOSVQ6IEZpcnN0IGFpX21vZGUgYXNzaWdubWVudCAtIE1BSUFTU19BSV9NT0RFPScke01BSUFTU19BSV9NT0RFOi19JywgYWlfbW9kZT0nJGFpX21vZGUnIgogICAgICBleHBvcnQgYWlfdG9rZW49IiR7TUFJQVNTX0FJX1RPS0VOOi19IgogICAgICBleHBvcnQgYWlfbW9kZWw9IiR7TUFJQVNTX0FJX01PREVMOj1ncHQtNH0iCiAgICAgIGV4cG9ydCBhaV90ZW1wZXJhdHVyZT0iJHtNQUlBU1NfQUlfVEVNUEVSQVRVUkU6PTAuOH0iCiAgICAgIGV4cG9ydCBhaV9tYXhfY2hhcmFjdGVycz0iJHtNQUlBU1NfQUlfTUFYX0NIQVJBQ1RFUlM6PTgwMDB9IgogICAgICBleHBvcnQgYWlfdGltZW91dD0iJHtNQUlBU1NfQUlfVElNRU9VVDo9MzB9IgogICAgICBleHBvcnQgYWlfY29tbWl0X21lc3NhZ2Vfc3R5bGU9IiR7TUFJQVNTX0FJX0NPTU1JVF9NRVNTQUdFX1NUWUxFOj1idWxsZXR9IgogICAgICBleHBvcnQgbWFpYXNzX2hvc3Q9IiR7TUFJQVNTX0FJX0hPU1Q6LWh0dHBzOi8vcG91bmQubWFpYXNzLm5ldH0iCiAgICAgIGV4cG9ydCBtYWlhc3NfZW5kcG9pbnQ9IiR7bWFpYXNzX2hvc3R9L3Byb3h5IgogICAgICBleHBvcnQgbWFpYXNzX3Rva2VucmVxdWVzdD0iJHttYWlhc3NfaG9zdH0vdjEvdG9rZW4iCiAgICAgIGV4cG9ydCBtYWlhc3NfdmFsaWRhdGVfZW5kcG9pbnQ9IiR7bWFpYXNzX2hvc3R9L3YxL3ZhbGlkYXRlIgogICAgICAjIExlZ2FjeSBlbmRwb2ludHMgLSBwcm94eSBzaG91bGQgcHJvdmlkZSBwYXltZW50IFVSTHMgZHluYW1pY2FsbHkgd2l0aCBzdWJzY3JpcHRpb25faWQKICAgICAgZXhwb3J0IG1haWFzc19yZWdpc3Rlcl9lbmRwb2ludD0iJHtNQUlBU1NfUkVHSVNURVJfRU5EUE9JTlQ6LWh0dHBzOi8vbWFpYXNzLm5ldC9yZWdpc3Rlcn0iCiAgICAgIGV4cG9ydCBtYWlhc3NfdG9wdXBfZW5kcG9pbnQ9IiR7TUFJQVNTX1RPUFVQX0VORFBPSU5UOi1odHRwczovL21haWFzcy5uZXQvdG9wLXVwfSIKCiAgICAgICMgQ2xpZW50IGlkZW50aXR5L3ZlcnNpb24gZm9yIHByb3h5IG1pbi12ZXJzaW9uIGVuZm9yY2VtZW50CiAgICAgIGV4cG9ydCBjbGllbnRfbmFtZT0iJHtNQUlBU1NfQ0xJRU5UX05BTUU6LWJhc2htYWlhc3N9IgogICAgICBleHBvcnQgY2xpZW50X3ZlcnNpb249IiR7TUFJQVNTX0NMSUVOVF9WRVJTSU9OOi0wLjAuMH0iCgogICAgICAjIEluaXRpYWxpemUgY29uZmlndXJhYmxlIHZlcnNpb24gZmlsZSBzeXN0ZW0KICAgICAgZXhwb3J0IHZlcnNpb25fcHJpbWFyeV9maWxlPSIke01BSUFTU19WRVJTSU9OX1BSSU1BUllfRklMRTotfSIKICAgICAgZXhwb3J0IHZlcnNpb25fcHJpbWFyeV90eXBlPSIke01BSUFTU19WRVJTSU9OX1BSSU1BUllfVFlQRTotfSIKICAgICAgZXhwb3J0IHZlcnNpb25fcHJpbWFyeV9saW5lX3N0YXJ0PSIke01BSUFTU19WRVJTSU9OX1BSSU1BUllfTElORV9TVEFSVDotfSIKICAgICAgZXhwb3J0IHZlcnNpb25fc2Vjb25kYXJ5X2ZpbGVzPSIke01BSUFTU19WRVJTSU9OX1NFQ09OREFSWV9GSUxFUzotfSIKCiAgICAgICMgVmVyc2lvbiBjaGVja2luZyBjb25maWd1cmF0aW9uCiAgICAgIGV4cG9ydCBhdXRvX3VwZGF0ZV9jaGVjaz0iJHtNQUlBU1NfQVVUT19VUERBVEVfQ0hFQ0s6LXRydWV9IgoKICAgICAgIyBJbml0aWFsaXplIGJyYW5jaCBuYW1lcyB3aXRoIE1BSUFTU18qIG92ZXJyaWRlcwogICAgICBleHBvcnQgcGF0Y2hfcmVsZWFzZXM9IiR7TUFJQVNTX1BBVENIX1JFTEVBU0VTOi19IgoKICAgICAgIyBCcmFuY2ggbmFtZSBkZWZhdWx0cyB3aXRoIE1BSUFTU18qIG92ZXJyaWRlcwogICAgICBleHBvcnQgZGV2ZWxvcGJyYW5jaD0iJHtNQUlBU1NfREVWRUxPUEJSQU5DSDotZGV2ZWxvcH0iCiAgICAgIGV4cG9ydCBzdGFnaW5nYnJhbmNoPSIke01BSUFTU19TVEFHSU5HQlJBTkNIOi1zdGFnaW5nfSIKICAgICAgZXhwb3J0IG1haW5icmFuY2g9IiR7TUFJQVNTX01BSU5CUkFOQ0g6LW1haW59IgogICAgICBleHBvcnQgcHVzaF9hYnN0cmFjdHNfdG9fcmVtb3RlPSIke01BSUFTU19QVVNIX0FCU1RSQUNUU19UT19SRU1PVEU6LX0iCiAgICAgIAogICAgICAjIEF1dG8teWVzIGZ1bmN0aW9uYWxpdHkgZm9yIG5vbi1pbnRlcmFjdGl2ZSB3b3JrZmxvd3MKICAgICAgZXhwb3J0IGF1dG9fc3RhZ2VfdW5zdGFnZWQ9IiR7TUFJQVNTX0FVVE9fU1RBR0VfVU5TVEFHRUQ6LWZhbHNlfSIKICAgICAgZXhwb3J0IGF1dG9fcHVzaF9jb21taXRzPSIke01BSUFTU19BVVRPX1BVU0hfQ09NTUlUUzotZmFsc2V9IgogICAgICBleHBvcnQgYXV0b19tZXJnZV90b19kZXZlbG9wPSIke01BSUFTU19BVVRPX01FUkdFX1RPX0RFVkVMT1A6LWZhbHNlfSIKICAgICAgZXhwb3J0IGF1dG9fYXBwcm92ZV9haV9zdWdnZXN0aW9ucz0iJHtNQUlBU1NfQVVUT19BUFBST1ZFX0FJX1NVR0dFU1RJT05TOi1mYWxzZX0iCiAgICAgIAogICAgICAjIE92ZXJyaWRlIGFsbCBhdXRvLXllcyBzZXR0aW5ncyBpZiAtLWF1dG8vLWEgZmxhZyB3YXMgdXNlZAogICAgICBpZiBbWyAiJHthdXRvX21vZGVfZW5hYmxlZDotZmFsc2V9IiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgICAgICBwcmludF9pbmZvICJBdXRvLW1vZGUgZW5hYmxlZDogT3ZlcnJpZGluZyBhbGwgYXV0by15ZXMgc2V0dGluZ3MgdG8gdHJ1ZSIKICAgICAgICBleHBvcnQgYXV0b19zdGFnZV91bnN0YWdlZD0idHJ1ZSIKICAgICAgICBleHBvcnQgYXV0b19wdXNoX2NvbW1pdHM9InRydWUiCiAgICAgICAgZXhwb3J0IGF1dG9fbWVyZ2VfdG9fZGV2ZWxvcD0idHJ1ZSIKICAgICAgICBleHBvcnQgYXV0b19hcHByb3ZlX2FpX3N1Z2dlc3Rpb25zPSJ0cnVlIgogICAgICBmaQogICAgICAKICBleHBvcnQgZGV2ZWxvcGJyYW5jaD0iJHtNQUlBU1NfREVWRUxPUEJSQU5DSDotZGV2ZWxvcH0iCiAgZXhwb3J0IHN0YWdpbmdicmFuY2g9IiR7TUFJQVNTX1NUQUdJTkdCUkFOQ0g6LXN0YWdpbmd9IgogIGV4cG9ydCBtYWluYnJhbmNoPSIke01BSUFTU19NQUlOQlJBTkNIOi1tYWlufSIKICBleHBvcnQgcHVzaF9hYnN0cmFjdHNfdG9fcmVtb3RlPSIke01BSUFTU19QVVNIX0FCU1RSQUNUU19UT19SRU1PVEU6LX0iCgogICMgQ2hhbmdlbG9nIGRlZmF1bHRzIHdpdGggTUFJQVNTXyogb3ZlcnJpZGVzCiAgZXhwb3J0IGNoYW5nZWxvZ19wYXRoPSIke01BSUFTU19DSEFOR0VMT0dfUEFUSDotLn0iCiAgZXhwb3J0IGNoYW5nZWxvZ19uYW1lPSIke01BSUFTU19DSEFOR0VMT0dfTkFNRTotQ0hBTkdFTE9HLm1kfSIKICBleHBvcnQgY2hhbmdlbG9nX2ludGVybmFsX25hbWU9IiR7TUFJQVNTX0NIQU5HRUxPR19JTlRFUk5BTF9OQU1FOi0ke01BSUFTU19DSEFOR0VMT0dfSU5URVJOQUxfTkFNRTotLkNIQU5HRUxPR19pbnRlcm5hbC5tZH19IgogIGV4cG9ydCBjaGFuZ2Vsb2dfaW50ZXJuYWxfcGF0aD0iJHtNQUlBU1NfQ0hBTkdFTE9HX0lOVEVSTkFMX1BBVEg6LS59IgoKICAjIFJlcG9zaXRvcnkgdHlwZSAoZm9yIGZ1dHVyZSBtdWx0aS1yZXBvIHN1cHBvcnQpCiAgZXhwb3J0IHJlcG9fdHlwZT0iJHtNQUlBU1NfUkVQT19UWVBFOi1iZXNwb2tlfSIKCiAgIyBQYXRoIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gcmVwb3NpdG9yeSB0eXBlCiAgY2FzZSAiJHJlcG9fdHlwZSIgaW4KICAgICJ3b3JkcHJlc3MtdGhlbWUiKQogICAgICAjIFdvcmRQcmVzcyB0aGVtZTogcmVwbyByb290IGlzIHRoZSB0aGVtZSBkaXJlY3RvcnkKICAgICAgZXhwb3J0IHZlcnNpb25fZmlsZV9wYXRoPSIke01BSUFTU19WRVJTSU9OX1BBVEg6LS59IgogICAgICBleHBvcnQgcGFja2FnZV9qc29uX3BhdGg9IiR7TUFJQVNTX1BBQ0tBR0VfUEFUSDotLn0iCiAgICAgIGV4cG9ydCB3b3JkcHJlc3NfZmlsZXNfcGF0aD0iJHtNQUlBU1NfV1BfRklMRVNfUEFUSDotLn0iCiAgICAgIDs7CiAgICAid29yZHByZXNzLXBsdWdpbiIpCiAgICAgICMgV29yZFByZXNzIHBsdWdpbjogcmVwbyByb290IGlzIHRoZSBwbHVnaW4gZGlyZWN0b3J5CiAgICAgIGV4cG9ydCB2ZXJzaW9uX2ZpbGVfcGF0aD0iJHtNQUlBU1NfVkVSU0lPTl9QQVRIOi0ufSIKICAgICAgZXhwb3J0IHBhY2thZ2VfanNvbl9wYXRoPSIke01BSUFTU19QQUNLQUdFX1BBVEg6LS59IgogICAgICBleHBvcnQgd29yZHByZXNzX2ZpbGVzX3BhdGg9IiR7TUFJQVNTX1dQX0ZJTEVTX1BBVEg6LS59IgogICAgICA7OwogICAgIndvcmRwcmVzcy1zaXRlIikKICAgICAgIyBXb3JkUHJlc3Mgc2l0ZTogdGhlbWUvcGx1Z2luIGluIHN1YmRpcmVjdG9yeQogICAgICBleHBvcnQgdmVyc2lvbl9maWxlX3BhdGg9IiR7TUFJQVNTX1ZFUlNJT05fUEFUSDotd3AtY29udGVudC90aGVtZXMvYWN0aXZlLXRoZW1lfSIKICAgICAgZXhwb3J0IHBhY2thZ2VfanNvbl9wYXRoPSIke01BSUFTU19QQUNLQUdFX1BBVEg6LXdwLWNvbnRlbnQvdGhlbWVzL2FjdGl2ZS10aGVtZX0iCiAgICAgIGV4cG9ydCB3b3JkcHJlc3NfZmlsZXNfcGF0aD0iJHtNQUlBU1NfV1BfRklMRVNfUEFUSDotd3AtY29udGVudC90aGVtZXMvYWN0aXZlLXRoZW1lfSIKICAgICAgOzsKICAgICJjcmFmdCIpCiAgICAgICMgQ3JhZnQgQ01TOiB0eXBpY2FsbHkgcmVwbyByb290CiAgICAgIGV4cG9ydCB2ZXJzaW9uX2ZpbGVfcGF0aD0iJHtNQUlBU1NfVkVSU0lPTl9QQVRIOi0ufSIKICAgICAgZXhwb3J0IHBhY2thZ2VfanNvbl9wYXRoPSIke01BSUFTU19QQUNLQUdFX1BBVEg6LS59IgogICAgICBleHBvcnQgd29yZHByZXNzX2ZpbGVzX3BhdGg9IiIgICMgTm90IGFwcGxpY2FibGUgZm9yIENyYWZ0CiAgICAgIDs7CiAgICAiYmVzcG9rZSIpCiAgICAgICMgQmVzcG9rZS9jdXN0b20gYXBwczogdHlwaWNhbGx5IHJlcG8gcm9vdAogICAgICBleHBvcnQgdmVyc2lvbl9maWxlX3BhdGg9IiR7TUFJQVNTX1ZFUlNJT05fUEFUSDotLn0iCiAgICAgIGV4cG9ydCBwYWNrYWdlX2pzb25fcGF0aD0iJHtNQUlBU1NfUEFDS0FHRV9QQVRIOi0ufSIKICAgICAgZXhwb3J0IHdvcmRwcmVzc19maWxlc19wYXRoPSIiICAjIE5vdCBhcHBsaWNhYmxlIGZvciBiZXNwb2tlCiAgICAgIDs7CiAgICAqKQogICAgICAjIERlZmF1bHQgZmFsbGJhY2sKICAgICAgZXhwb3J0IHZlcnNpb25fZmlsZV9wYXRoPSIke01BSUFTU19WRVJTSU9OX1BBVEg6LS59IgogICAgICBleHBvcnQgcGFja2FnZV9qc29uX3BhdGg9IiR7TUFJQVNTX1BBQ0tBR0VfUEFUSDotLn0iCiAgICAgIGV4cG9ydCB3b3JkcHJlc3NfZmlsZXNfcGF0aD0iJHtNQUlBU1NfV1BfRklMRVNfUEFUSDotfSIKICAgICAgOzsKICBlc2FjCgogIHByaW50X2RlYnVnICJCcmFuY2ggY29uZmlndXJhdGlvbjoiIAogIHByaW50X2RlYnVnICIgIERldmVsb3A6ICRkZXZlbG9wYnJhbmNoIgogIHByaW50X2RlYnVnICIgIFN0YWdpbmc6ICRzdGFnaW5nYnJhbmNoIgogIHByaW50X2RlYnVnICIgIE1haW46ICRtYWluYnJhbmNoIgoKICBwcmludF9kZWJ1ZyAiQ2hhbmdlbG9nIGNvbmZpZ3VyYXRpb246IgogIHByaW50X2RlYnVnICIgIFBhdGg6ICRjaGFuZ2Vsb2dfcGF0aCIKICBwcmludF9kZWJ1ZyAiICBNYWluIGNoYW5nZWxvZzogJGNoYW5nZWxvZ19wYXRoLyRjaGFuZ2Vsb2dfbmFtZSIKICBwcmludF9kZWJ1ZyAiICBJbnRlcm5hbCBjaGFuZ2Vsb2c6ICRjaGFuZ2Vsb2dfaW50ZXJuYWxfcGF0aC8kY2hhbmdlbG9nX2ludGVybmFsX25hbWUiCgogICMgUHVsbCByZXF1ZXN0IGNvbmZpZ3VyYXRpb24KICBleHBvcnQgc3RhZ2luZ19wdWxscmVxdWVzdHM9IiR7TUFJQVNTX1NUQUdJTkdfUFVMTFJFUVVFU1RTOi1vbn0iCiAgZXhwb3J0IG1haW5fcHVsbHJlcXVlc3RzPSIke01BSUFTU19NQUlOX1BVTExSRVFVRVNUUzotb259IgoKICAjIEF1dG8tZGV0ZWN0IHJlcG9zaXRvcnkgcHJvdmlkZXIgKEdpdEh1Yi9CaXRidWNrZXQpIGFuZCBleHRyYWN0IHJlcG8gaW5mbyBmcm9tIGdpdCByZW1vdGUKICBsb2NhbCBnaXRfcmVtb3RlX3VybAogIGdpdF9yZW1vdGVfdXJsPSQoZ2l0IHJlbW90ZSBnZXQtdXJsIG9yaWdpbiAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQoKICAjIEluaXRpYWxpemUgcmVwb3NpdG9yeSB2YXJpYWJsZXMKICBleHBvcnQgUkVQT19QUk9WSURFUj0iJHtNQUlBU1NfUkVQT19QUk9WSURFUjotfSIKICBleHBvcnQgQklUQlVDS0VUX1dPUktTUEFDRT0iJHtNQUlBU1NfQklUQlVDS0VUX1dPUktTUEFDRTotfSIKICBleHBvcnQgQklUQlVDS0VUX1JFUE9fU0xVRz0iJHtNQUlBU1NfQklUQlVDS0VUX1JFUE9fU0xVRzotfSIKICBleHBvcnQgR0lUSFVCX09XTkVSPSIke01BSUFTU19HSVRIVUJfT1dORVI6LX0iCiAgZXhwb3J0IEdJVEhVQl9SRVBPPSIke01BSUFTU19HSVRIVUJfUkVQTzotfSIKCiAgIyBEZXRlY3QgQml0YnVja2V0CnJlc29sdmVkX2hvc3Q9JChzc2ggLUcgIiR7Z2l0X3JlbW90ZV91cmwjKkB9IiAyPi9kZXYvbnVsbCB8IGF3ayAnL15ob3N0bmFtZSAvIHsgcHJpbnQgJDIgfScpCmlmIFtbICIkZ2l0X3JlbW90ZV91cmwiID1+IEAoLipiaXRidWNrZXRcLm9yZylbOi9dKFteL10rKS8oW14vXC5dKykgXV07IHRoZW4KICBleHBvcnQgUkVQT19QUk9WSURFUj0iYml0YnVja2V0IgogIGV4cG9ydCBCSVRCVUNLRVRfV09SS1NQQUNFPSIke01BSUFTU19CSVRCVUNLRVRfV09SS1NQQUNFOi0ke0JBU0hfUkVNQVRDSFsyXX19IgogIGV4cG9ydCBCSVRCVUNLRVRfUkVQT19TTFVHPSIke01BSUFTU19CSVRCVUNLRVRfUkVQT19TTFVHOi0ke0JBU0hfUkVNQVRDSFszXX19IgogIGV4cG9ydCBjbGllbnQ9CmVsaWYgW1sgIiRnaXRfcmVtb3RlX3VybCIgPX4gQCguKmdpdGh1YlwuY29tKVs6L10oW14vXSspLyhbXi9cLl0rKSBdXTsgdGhlbgogIGV4cG9ydCBSRVBPX1BST1ZJREVSPSJnaXRodWIiCiAgZXhwb3J0IEdJVEhVQl9PV05FUj0iJHtNQUlBU1NfR0lUSFVCX09XTkVSOi0ke0JBU0hfUkVNQVRDSFsyXX19IgogIGV4cG9ydCBHSVRIVUJfUkVQTz0iJHtNQUlBU1NfR0lUSFVCX1JFUE86LSR7QkFTSF9SRU1BVENIWzNdfX0iCmZpCgogICMgQ2FsY3VsYXRlIFdvcmRQcmVzcyB2ZXJzaW9uIGNvbnN0YW50IGZvciB0aGVtZXMvcGx1Z2lucwogIGlmIFtbICIkcmVwb190eXBlIiA9PSAid29yZHByZXNzLXRoZW1lIiB8fCAiJHJlcG9fdHlwZSIgPT0gIndvcmRwcmVzcy1wbHVnaW4iIF1dOyB0aGVuCiAgICBpZiBbWyAtbiAiJHdvcmRwcmVzc19maWxlc19wYXRoIiBdXTsgdGhlbgogICAgICAjIFVzZSB0aGUgZm9sZGVyIG5hbWUgKGJhc2VuYW1lIG9mIHRoZSB3b3JkcHJlc3NfZmlsZXNfcGF0aCkKICAgICAgbG9jYWwgZm9sZGVyX25hbWUKICAgICAgZm9sZGVyX25hbWU9JChiYXNlbmFtZSAiJHdvcmRwcmVzc19maWxlc19wYXRoIikKCiAgICAgIGlmIFtbIC1uICIkZm9sZGVyX25hbWUiICYmICIkZm9sZGVyX25hbWUiICE9ICIuIiBdXTsgdGhlbgogICAgICAgICMgQ29udmVydCBmb2xkZXIgbmFtZSB0byBjb25zdGFudCBmb3JtYXQ6IHVwcGVyY2FzZSwgcmVwbGFjZSBkYXNoZXMgd2l0aCB1bmRlcnNjb3JlcwogICAgICAgIGxvY2FsIHdwX2NvbnN0YW50CiAgICAgICAgd3BfY29uc3RhbnQ9JChlY2hvICIkZm9sZGVyX25hbWUiIHwgdHIgJ1s6bG93ZXI6XScgJ1s6dXBwZXI6XScgfCBzZWQgJ3MvLS9fL2cnKQogICAgICAgIGV4cG9ydCB3cFZlcnNpb25Db25zdGFudD0iJHtNQUlBU1NfV1BfVkVSU0lPTl9DT05TVEFOVDotJHt3cF9jb25zdGFudH1fUkVMRUFTRV9WRVJTSU9OfSIKICAgICAgZWxzZQogICAgICAgICMgSWYgd29yZHByZXNzX2ZpbGVzX3BhdGggaXMgIi4iLCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG5hbWUKICAgICAgICBsb2NhbCBjdXJyZW50X2RpcgogICAgICAgIGN1cnJlbnRfZGlyPSQoYmFzZW5hbWUgIiQocHdkKSIpCiAgICAgICAgbG9jYWwgd3BfY29uc3RhbnQKICAgICAgICB3cF9jb25zdGFudD0kKGVjaG8gIiRjdXJyZW50X2RpciIgfCB0ciAnWzpsb3dlcjpdJyAnWzp1cHBlcjpdJyB8IHNlZCAncy8tL18vZycpCiAgICAgICAgZXhwb3J0IHdwVmVyc2lvbkNvbnN0YW50PSIke01BSUFTU19XUF9WRVJTSU9OX0NPTlNUQU5UOi0ke3dwX2NvbnN0YW50fV9SRUxFQVNFX1ZFUlNJT059IgogICAgICBmaQogICAgZWxzZQogICAgICBleHBvcnQgd3BWZXJzaW9uQ29uc3RhbnQ9IiR7TUFJQVNTX1dQX1ZFUlNJT05fQ09OU1RBTlQ6LX0iCiAgICBmaQogIGVsc2UKICAgIGV4cG9ydCB3cFZlcnNpb25Db25zdGFudD0iJHtNQUlBU1NfV1BfVkVSU0lPTl9DT05TVEFOVDotfSIKICBmaQoKICBwcmludF9kZWJ1ZyAiUmVwb3NpdG9yeSB0eXBlOiAkcmVwb190eXBlIgogIHByaW50X2RlYnVnICJQYXRoIGNvbmZpZ3VyYXRpb246IgogIHByaW50X2RlYnVnICIgIFZlcnNpb24gZmlsZTogJHZlcnNpb25fZmlsZV9wYXRoIgogIHByaW50X2RlYnVnICIgIFBhY2thZ2UuanNvbjogJHBhY2thZ2VfanNvbl9wYXRoIgogIGlmIFtbIC1uICIkd29yZHByZXNzX2ZpbGVzX3BhdGgiIF1dOyB0aGVuCiAgICBwcmludF9kZWJ1ZyAiICBXb3JkUHJlc3MgZmlsZXM6ICR3b3JkcHJlc3NfZmlsZXNfcGF0aCIKICBmaQoKICAjIEFJIGNvbW1pdCBtZXNzYWdlIGNvbmZpZ3VyYXRpb24gLSBEb24ndCBvdmVycmlkZSBpZiBhbHJlYWR5IHNldAogIHByaW50X2RlYnVnICJERUJVRyBJTklUOiBCZWZvcmUgc2Vjb25kIGFzc2lnbm1lbnQgLSBNQUlBU1NfQUlfTU9ERT0nJHtNQUlBU1NfQUlfTU9ERTotfScsIGN1cnJlbnQgYWlfbW9kZT0nJGFpX21vZGUnIgogIGlmIFtbIC16ICIkYWlfbW9kZSIgXV07IHRoZW4KICAgIGV4cG9ydCBhaV9tb2RlPSIke01BSUFTU19BSV9NT0RFOi1hc2t9IgogICAgcHJpbnRfZGVidWcgIkRFQlVHIElOSVQ6IGFpX21vZGUgd2FzIGVtcHR5LCBzZXR0aW5nIHRvOiAnJGFpX21vZGUnIgogIGVsc2UKICAgIHByaW50X2RlYnVnICJERUJVRyBJTklUOiBhaV9tb2RlIGFscmVhZHkgc2V0IHRvOiAnJGFpX21vZGUnLCBrZWVwaW5nIGl0IgogIGZpCiAgCiAgZXhwb3J0IGFpX3Rva2VuPSIke01BSUFTU19BSV9UT0tFTjotfSIKICBwcmludF9kZWJ1ZyAiREVCVUcgSU5JVDogYWlfdG9rZW4gbGVuZ3RoPSR7I2FpX3Rva2VufSIKICBleHBvcnQgYWlfbW9kZWw9IiR7TUFJQVNTX0FJX01PREVMOi1ncHQtMy41LXR1cmJvfSIKCiAgIyBEZXRlcm1pbmUgdGhlIEFJIGNvbW1pdCBtZXNzYWdlIHN0eWxlCiAgaWYgW1sgLW4gIiRNQUlBU1NfQUlfQ09NTUlUX01FU1NBR0VfU1RZTEUiIF1dOyB0aGVuCiAgICBhaV9jb21taXRfc3R5bGU9IiRNQUlBU1NfQUlfQ09NTUlUX01FU1NBR0VfU1RZTEUiCiAgICBwcmludF9kZWJ1ZyAiVXNpbmcgQUkgY29tbWl0IHN0eWxlIGZyb20gLmVudjogJGFpX2NvbW1pdF9zdHlsZSIKICBlbGlmIFtbIC1mICIubWFpYXNzLnByb21wdCIgXV07IHRoZW4KICAgIGFpX2NvbW1pdF9zdHlsZT0iY3VzdG9tIgogICAgcHJpbnRfZGVidWcgIk5vIHN0eWxlIHNldCBpbiAuZW52OyB1c2luZyBsb2NhbCBwcm9tcHQgZmlsZTogLm1haWFzcy5wcm9tcHQiCiAgZWxpZiBbWyAtZiAiJEhPTUUvLm1haWFzcy5wcm9tcHQiIF1dOyB0aGVuCiAgICBhaV9jb21taXRfc3R5bGU9Imdsb2JhbF9jdXN0b20iCiAgICBwcmludF9kZWJ1ZyAiTm8gc3R5bGUgc2V0IGluIC5lbnY7IHVzaW5nIGdsb2JhbCBwcm9tcHQgZmlsZTogfi8ubWFpYXNzLnByb21wdCIKICBlbHNlCiAgICBhaV9jb21taXRfc3R5bGU9ImJ1bGxldCIKICAgIHByaW50X2RlYnVnICJObyBzdHlsZSBvciBwcm9tcHQgZmlsZXMgZm91bmQ7IGRlZmF1bHRpbmcgdG8gJ2J1bGxldCciCiAgZmkKCiAgZXhwb3J0IGFpX2NvbW1pdF9zdHlsZQoKICBleHBvcnQgZGVidWdfbW9kZT0iJHtNQUlBU1NfREVCVUc6LWZhbHNlfSIKCiAgIyBWYWxpZGF0ZSBBSSBjb25maWd1cmF0aW9uIC0gcHJldmVudCBhc2svYXV0b3N1Z2dlc3QgbW9kZXMgd2l0aG91dCB0b2tlbgogIHByaW50X2RlYnVnICJERUJVRyBJTklUOiBBSSBtb2RlIHNldCB0byAnJGFpX21vZGUnIC0gdG9rZW4gdmFsaWRhdGlvbiB3aWxsIGhhcHBlbiB3aGVuIEFJIGZlYXR1cmVzIGFyZSB1c2VkIgogIAogIHByaW50X2RlYnVnICJERUJVRyBJTklUOiBGaW5hbCBhaV9tb2RlPSckYWlfbW9kZSciCgogIHByaW50X2RlYnVnICJJbnRlZ3JhdGlvbiBjb25maWd1cmF0aW9uOiIKICBwcmludF9kZWJ1ZyAiICBTdGFnaW5nIHB1bGwgcmVxdWVzdHM6ICRzdGFnaW5nX3B1bGxyZXF1ZXN0cyIKICBwcmludF9kZWJ1ZyAiICBNYWluIHB1bGwgcmVxdWVzdHM6ICRtYWluX3B1bGxyZXF1ZXN0cyIKICBwcmludF9kZWJ1ZyAiICBBSSBjb21taXQgbWVzc2FnZXM6ICRhaV9tb2RlIgogIGlmIFtbICIkYWlfbW9kZSIgIT0gIm9mZiIgJiYgLW4gIiRhaV90b2tlbiIgXV07IHRoZW4KICAgIHByaW50X2RlYnVnICIgIEFJIG1vZGVsOiAkYWlfbW9kZWwiCiAgICBwcmludF9kZWJ1ZyAiICBBSSB0ZW1wZXJhdHVyZTogJGFpX3RlbXBlcmF0dXJlIgogICAgcHJpbnRfZGVidWcgIiAgQUkgTWF4IGNvbW1pdCBjaGFyYWN0ZXJzOiAkYWlfbWF4X2NoYXJhY3RlcnMiCiAgICBwcmludF9kZWJ1ZyAiICBBSSBjb21taXQgc3R5bGU6ICRhaV9jb21taXRfc3R5bGUiCiAgZmkKICBpZiBbWyAiJFJFUE9fUFJPVklERVIiID09ICJiaXRidWNrZXQiICYmIC1uICIkQklUQlVDS0VUX1dPUktTUEFDRSIgXV07IHRoZW4KICAgIHByaW50X2RlYnVnICIgIFJlcG9zaXRvcnk6IEJpdGJ1Y2tldCAoJEJJVEJVQ0tFVF9XT1JLU1BBQ0UvJEJJVEJVQ0tFVF9SRVBPX1NMVUcpIgogICAgZXhwb3J0IGNsaWVudD0iJEJJVEJVQ0tFVF9XT1JLU1BBQ0UiCiAgICBleHBvcnQgcHJvamVjdD0iJEJJVEJVQ0tFVF9SRVBPX1NMVUciCiAgZWxpZiBbWyAiJFJFUE9fUFJPVklERVIiID09ICJnaXRodWIiICYmIC1uICIkR0lUSFVCX09XTkVSIiBdXTsgdGhlbgogICAgcHJpbnRfZGVidWcgIiAgUmVwb3NpdG9yeTogR2l0SHViICgkR0lUSFVCX09XTkVSLyRHSVRIVUJfUkVQTykiCiAgICBleHBvcnQgY2xpZW50PSIkR0lUSFVCX09XTkVSIgogICAgZXhwb3J0IHByb2plY3Q9IiRHSVRIVUJfUkVQTyIKICBmaQogIGlmIFtbIC1uICIkd3BWZXJzaW9uQ29uc3RhbnQiIF1dOyB0aGVuCiAgICBwcmludF9kZWJ1ZyAiICBXb3JkUHJlc3MgdmVyc2lvbiBjb25zdGFudDogJHdwVmVyc2lvbkNvbnN0YW50IgogIGZpCn0KCmZpICMgX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV9pbml0X3NoCiMgLS0tIEVuZCBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi9jb3JlL2luaXQuc2ggLS0tCgojIC0tLSBCZWdpbiBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi9jb3JlL3ZlcnNpb24uc2ggLS0tCmlmIFtbIC16ICIke19fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfdmVyc2lvbl9zaDotfSIgXV07IHRoZW4gX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV92ZXJzaW9uX3NoPTEKCiMgc2V0cyB2YWx1ZSB0byAkY3VycmVudHZlcnNpb24gYW5kIG5ld3ZlcnNpb24uCiMgdXNhZ2U6IGdldFZlcnNpb24gW21ham9yfG1pbm9yfHBhdGNofHNwZWNpZmljX3ZlcnNpb25dCiMgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3Qgc2V0LCBidW1wcyB0aGUgcGF0Y2ggdmVyc2lvbgoKIyBIZWxwZXIgZnVuY3Rpb24gdG8gcmVhZCB2ZXJzaW9uIGZyb20gYSBmaWxlIGJhc2VkIG9uIHR5cGUgYW5kIGxpbmUgc3RhcnQKcmVhZF92ZXJzaW9uX2Zyb21fZmlsZSgpIHsKICAgIGxvY2FsIGZpbGU9IiQxIgogICAgbG9jYWwgZmlsZV90eXBlPSIkMiIKICAgIGxvY2FsIGxpbmVfc3RhcnQ9IiQzIgogICAgbG9jYWwgdmVyc2lvbj0iIgoKICAgIGlmIFtbICEgLWYgIiRmaWxlIiBdXTsgdGhlbgogICAgICAgIHJldHVybiAxCiAgICBmaQoKICAgIGNhc2UgIiRmaWxlX3R5cGUiIGluCiAgICAgICAgImpzb24iKQogICAgICAgICAgICAjIEpTT04gZmlsZSAtIGxvb2sgZm9yICJ2ZXJzaW9uIiBwcm9wZXJ0eQogICAgICAgICAgICBpZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgICAgICAgdmVyc2lvbj0kKGpxIC1yICcudmVyc2lvbicgIiRmaWxlIiAyPi9kZXYvbnVsbCkKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIyBGYWxsYmFjayBtZXRob2QgdXNpbmcgZ3JlcCBhbmQgc2VkCiAgICAgICAgICAgICAgICB2ZXJzaW9uPSQoZ3JlcCAnInZlcnNpb24iJyAiJGZpbGUiIHwgaGVhZCAtMSB8IHNlZCAncy8uKiJ2ZXJzaW9uIltbOnNwYWNlOl1dKjpbWzpzcGFjZTpdXSoiXChbXiJdKlwpIi4qL1wxLycpCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIDs7CiAgICAgICAgInR4dCIpCiAgICAgICAgICAgICMgVGV4dCBmaWxlIC0gbG9vayBmb3IgbGluZSBzdGFydGluZyB3aXRoIHNwZWNpZmllZCBwcmVmaXgKICAgICAgICAgICAgaWYgW1sgLW4gIiRsaW5lX3N0YXJ0IiBdXTsgdGhlbgogICAgICAgICAgICAgICAgdmVyc2lvbj0kKGdyZXAgIl4ke2xpbmVfc3RhcnR9IiAiJGZpbGUiIHwgaGVhZCAtMSB8IHNlZCAicy9eJHtsaW5lX3N0YXJ0fS8vIiB8IHNlZCAncy9eW1s6c3BhY2U6XV0qLy8nIHwgc2VkICdzL1tbOnNwYWNlOl1dKiQvLycpCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICMgSWYgbm8gbGluZSBzdGFydCBzcGVjaWZpZWQsIGFzc3VtZSBlbnRpcmUgZmlsZSBjb250ZW50IGlzIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgICAgICB2ZXJzaW9uPSQoY2F0ICIkZmlsZSIgfCB0ciAtZCAnXG5ccicpCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIDs7CiAgICAgICAgInBhdHRlcm4iKQogICAgICAgICAgICAjIFBhdHRlcm4tYmFzZWQgbWF0Y2hpbmcgLSBleHRyYWN0IHZlcnNpb24gZnJvbSByZWdleCBwYXR0ZXJuCiAgICAgICAgICAgICMgbGluZV9zdGFydCBjb250YWlucyB0aGUgcGF0dGVybiB3aXRoIHt2ZXJzaW9ufSBwbGFjZWhvbGRlcgogICAgICAgICAgICBpZiBbWyAtbiAiJGxpbmVfc3RhcnQiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAjIEZvciBQSFAgZGVmaW5lIHN0YXRlbWVudHMsIGV4dHJhY3QgdGhlIHZlcnNpb24gZGlyZWN0bHkKICAgICAgICAgICAgICAgIGlmIFtbICIkbGluZV9zdGFydCIgPT0gKiJkZWZpbmUoIiogXV07IHRoZW4KICAgICAgICAgICAgICAgICAgICAjIEV4dHJhY3QgY29uc3RhbnQgbmFtZSBmcm9tIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICBsb2NhbCBjb25zdF9uYW1lCiAgICAgICAgICAgICAgICAgICAgY29uc3RfbmFtZT0kKGVjaG8gIiRsaW5lX3N0YXJ0IiB8IHNlZCAicy8uKmRlZmluZSgnXChbXiddKlwpJy4qL1wxLyIgfCBzZWQgInMvLipkZWZpbmUoXCJcKFteXCJdKlwpXCIuKi9cMS8iKQogICAgICAgICAgICAgICAgICAgIGlmIFtbIC1uICIkY29uc3RfbmFtZSIgXV07IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgIyBGaW5kIHRoZSBkZWZpbmUgbGluZSBhbmQgZXh0cmFjdCB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249JChncmVwICJkZWZpbmUoJyR7Y29uc3RfbmFtZX0nIiAiJGZpbGUiIHwgc2VkICJzLy4qJ1teJ10qJ1tbOnNwYWNlOl1dKixbWzpzcGFjZTpdXSonXChbXiddKlwpJy4qL1wxLyIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIFtbIC16ICIkdmVyc2lvbiIgXV07IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249JChncmVwICJkZWZpbmUoXCIke2NvbnN0X25hbWV9XCIiICIkZmlsZSIgfCBzZWQgInMvLipcIlteXCJdKlwiW1s6c3BhY2U6XV0qLFtbOnNwYWNlOl1dKlwiXChbXlwiXSpcKVwiLiovXDEvIikKICAgICAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICMgR2VuZXJpYyBwYXR0ZXJuIG1hdGNoaW5nIC0gcmVwbGFjZSB7dmVyc2lvbn0gd2l0aCBjYXB0dXJlIGdyb3VwCiAgICAgICAgICAgICAgICAgICAgbG9jYWwgc2VhcmNoX3BhdHRlcm4KICAgICAgICAgICAgICAgICAgICBzZWFyY2hfcGF0dGVybj0kKGVjaG8gIiRsaW5lX3N0YXJ0IiB8IHNlZCAicy97dmVyc2lvbn0vXFwoW14nXCJdKlxcKS9nIikKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSQoc2VkIC1uICJzLy4qJHtzZWFyY2hfcGF0dGVybn0uKi9cMS9wIiAiJGZpbGUiIHwgaGVhZCAtMSkKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgcHJpbnRfZXJyb3IgIlVuc3VwcG9ydGVkIGZpbGUgdHlwZTogJGZpbGVfdHlwZSIKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgOzsKICAgIGVzYWMKCiAgICBpZiBbWyAtbiAiJHZlcnNpb24iICYmICIkdmVyc2lvbiIgIT0gIm51bGwiIF1dOyB0aGVuCiAgICAgICAgZWNobyAiJHZlcnNpb24iCiAgICAgICAgcmV0dXJuIDAKICAgIGVsc2UKICAgICAgICByZXR1cm4gMQogICAgZmkKfQoKIyBIZWxwZXIgZnVuY3Rpb24gdG8gdXBkYXRlIHZlcnNpb24gaW4gYSBmaWxlIGJhc2VkIG9uIHR5cGUgYW5kIGxpbmUgc3RhcnQKdXBkYXRlX3ZlcnNpb25faW5fZmlsZSgpIHsKICAgIGxvY2FsIGZpbGU9IiQxIgogICAgbG9jYWwgZmlsZV90eXBlPSIkMiIKICAgIGxvY2FsIGxpbmVfc3RhcnQ9IiQzIgogICAgbG9jYWwgbmV3X3ZlcnNpb249IiQ0IgoKICAgIGlmIFtbICEgLWYgIiRmaWxlIiBdXTsgdGhlbgogICAgICAgIHByaW50X3dhcm5pbmcgIkZpbGUgbm90IGZvdW5kOiAkZmlsZSIKICAgICAgICByZXR1cm4gMQogICAgZmkKCiAgICBjYXNlICIkZmlsZV90eXBlIiBpbgogICAgICAgICJqc29uIikKICAgICAgICAgICAgIyBKU09OIGZpbGUgLSB1cGRhdGUgInZlcnNpb24iIHByb3BlcnR5CiAgICAgICAgICAgIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICAgICAgICBqcSAiLnZlcnNpb24gPSBcIiRuZXdfdmVyc2lvblwiIiAiJGZpbGUiID4gIiR7ZmlsZX0udG1wIiAmJiBtdiAiJHtmaWxlfS50bXAiICIkZmlsZSIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIyBGYWxsYmFjayB0byBzZWQKICAgICAgICAgICAgICAgIHNlZF9pbnBsYWNlICJzL1widmVyc2lvblwiOiBcIi4qXCIvXCJ2ZXJzaW9uXCI6IFwiJG5ld192ZXJzaW9uXCIvIiAiJGZpbGUiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIDs7CiAgICAgICAgInR4dCIpCiAgICAgICAgICAgICMgVGV4dCBmaWxlIC0gdXBkYXRlIGxpbmUgc3RhcnRpbmcgd2l0aCBzcGVjaWZpZWQgcHJlZml4CiAgICAgICAgICAgIGlmIFtbIC1uICIkbGluZV9zdGFydCIgXV07IHRoZW4KCiAgICAgICAgICAgICAgICBhd2sgLXYgcHJlZml4PSIkbGluZV9zdGFydCIgLXYgdmVyc2lvbj0iJG5ld192ZXJzaW9uIiAnCiAgICAgICAgICAgICAgICAgIEJFR0lOIHsgbGVuID0gbGVuZ3RoKHByZWZpeCkgfQogICAgICAgICAgICAgICAgICBzdWJzdHIoJDAsIDEsIGxlbikgPT0gcHJlZml4IHsgcHJpbnQgcHJlZml4IHZlcnNpb247IG5leHQgfQogICAgICAgICAgICAgICAgICB7IHByaW50IH0KICAgICAgICAgICAgICAgICcgIiRmaWxlIiA+ICIke2ZpbGV9LnRtcCIgJiYgbXYgIiR7ZmlsZX0udG1wIiAiJGZpbGUiCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICMgSWYgbm8gbGluZSBzdGFydCBzcGVjaWZpZWQsIHJlcGxhY2UgZW50aXJlIGZpbGUgY29udGVudAogICAgICAgICAgICAgICAgZWNobyAiJG5ld192ZXJzaW9uIiA+ICIkZmlsZSIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgOzsKICAgICAgICAicGF0dGVybiIpCiAgICAgICAgICAgICMgUGF0dGVybi1iYXNlZCByZXBsYWNlbWVudCAtIHJlcGxhY2UgdmVyc2lvbiBpbiByZWdleCBwYXR0ZXJuCiAgICAgICAgICAgICMgbGluZV9zdGFydCBjb250YWlucyB0aGUgcGF0dGVybiB3aXRoIHt2ZXJzaW9ufSBwbGFjZWhvbGRlcgogICAgICAgICAgICBpZiBbWyAtbiAiJGxpbmVfc3RhcnQiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAjIEZvciBQSFAgZGVmaW5lIHN0YXRlbWVudHMsIHVzZSBhIHNwZWNpZmljIGFwcHJvYWNoCiAgICAgICAgICAgICAgICBpZiBbWyAiJGxpbmVfc3RhcnQiID09ICoiZGVmaW5lKCIqIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgIyBFeHRyYWN0IHRoZSBjb25zdGFudCBuYW1lIGZyb20gdGhlIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICBsb2NhbCBjb25zdF9uYW1lCiAgICAgICAgICAgICAgICAgICAgY29uc3RfbmFtZT0kKGVjaG8gIiRsaW5lX3N0YXJ0IiB8IHNlZCAicy8uKmRlZmluZSgnXChbXiddKlwpJy4qL1wxLyIgfCBzZWQgInMvLipkZWZpbmUoXCJcKFteXCJdKlwpXCIuKi9cMS8iKQogICAgICAgICAgICAgICAgICAgIGlmIFtbIC1uICIkY29uc3RfbmFtZSIgXV07IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgIyBSZXBsYWNlIFBIUCBkZWZpbmUgc3RhdGVtZW50IHdpdGggbmV3IHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgc2VkX2lucGxhY2UgInMvZGVmaW5lKCcke2NvbnN0X25hbWV9J1tbOnNwYWNlOl1dKixbWzpzcGFjZTpdXSonW14nXSonKS9kZWZpbmUoJyR7Y29uc3RfbmFtZX0nLCcke25ld192ZXJzaW9ufScpL2ciICIkZmlsZSIKICAgICAgICAgICAgICAgICAgICAgICAgc2VkX2lucGxhY2UgInMvZGVmaW5lKFwiJHtjb25zdF9uYW1lfVwiW1s6c3BhY2U6XV0qLFtbOnNwYWNlOl1dKlwiW15cIl0qXCIpL2RlZmluZShcIiR7Y29uc3RfbmFtZX1cIixcIiR7bmV3X3ZlcnNpb259XCIpL2ciICIkZmlsZSIKICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICMgR2VuZXJpYyBwYXR0ZXJuIHJlcGxhY2VtZW50IC0gcmVwbGFjZSB7dmVyc2lvbn0gd2l0aCBuZXcgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgIGxvY2FsIHJlcGxhY2VtZW50X3RleHQKICAgICAgICAgICAgICAgICAgICAjIFNhZmVyIHRoYW4gc2VkLCB3b3JrcyBmaW5lIGluIG1hY09TIC9iaW4vYmFzaAogICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50X3RleHQ9JHtsaW5lX3N0YXJ0Ly9ce3ZlcnNpb25cfS8kbmV3X3ZlcnNpb259CgogICAgICAgICAgICAgICAgICAgICMgMSkgRXNjYXBlIHJlZ2V4IG1ldGFjaGFyYWN0ZXJzIGluIHRoZSB0ZW1wbGF0ZSBsaW5lLAogICAgICAgICAgICAgICAgICAgICMgICAgYnV0IERPIE5PVCBlc2NhcGUgeyBvciB9IHNvIHdlIGNhbiBzdGlsbCBzZWUge3ZlcnNpb259CiAgICAgICAgICAgICAgICAgICAgbG9jYWwgbWF0Y2hfcGF0dGVybgogICAgICAgICAgICAgICAgICAgIG1hdGNoX3BhdHRlcm49JChwcmludGYgJyVzXG4nICIkbGluZV9zdGFydCIgXAogICAgICAgICAgICAgICAgICAgIHwgc2VkICdzL1tcLy5eJCorPygpW1xdfF0vXFwmL2cnKQoKICAgICAgICAgICAgICAgICAgICAjIDIpIFR1cm4gdGhlIGxpdGVyYWwge3ZlcnNpb259IGludG8gYSB3aWxkY2FyZAogICAgICAgICAgICAgICAgICAgICMgICAgVGhpcyBiZWNvbWVzIGUuZy4gTVlWQVIgPSAiLioiCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hfcGF0dGVybj0ke21hdGNoX3BhdHRlcm4vL1x7dmVyc2lvblx9Ly4qfQoKICAgICAgICAgICAgICAgICAgICAjIDMpIFJlcGxhY2UgbWF0Y2hpbmcgbGluZXMgaW4gdGhlIGZpbGUKICAgICAgICAgICAgICAgICAgICBzZWRfaW5wbGFjZSAicy8ke21hdGNoX3BhdHRlcm59LyR7cmVwbGFjZW1lbnRfdGV4dH0vZyIgIiRmaWxlIgoKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIDs7CiAgICAgICAgKikKICAgICAgICAgICAgcHJpbnRfZXJyb3IgIlVuc3VwcG9ydGVkIGZpbGUgdHlwZTogJGZpbGVfdHlwZSIKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgOzsKICAgIGVzYWMKCiAgICByZXR1cm4gMAp9CgojIEhlbHBlciBmdW5jdGlvbiB0byBwYXJzZSBzZWNvbmRhcnkgdmVyc2lvbiBmaWxlcyBjb25maWd1cmF0aW9uCnBhcnNlX3NlY29uZGFyeV92ZXJzaW9uX2ZpbGVzKCkgewogICAgbG9jYWwgY29uZmlnPSIkMSIKICAgIGxvY2FsIC1hIGZpbGVzX2FycmF5CgogICAgaWYgW1sgLXogIiRjb25maWciIF1dOyB0aGVuCiAgICAgICAgcmV0dXJuIDAKICAgIGZpCgogICAgIyBSZXBsYWNlIGVzY2FwZWQgcGlwZXMgKFx8KSB3aXRoIGEgcGxhY2Vob2xkZXIgc28gdGhleSBzdXJ2aXZlIHRoZSBJRlMgc3BsaXQKICAgIGxvY2FsIHNhZmVfY29uZmlnPSIke2NvbmZpZy8vXFxcfC8kJ1x4MDEnfSIKICAgIElGUz0nfCcgcmVhZCAtcmEgZmlsZXNfYXJyYXkgPDw8ICIkc2FmZV9jb25maWciCgogICAgZm9yIGZpbGVfY29uZmlnIGluICIke2ZpbGVzX2FycmF5W0BdfSI7IGRvCiAgICAgICAgIyBSZXN0b3JlIGVzY2FwZWQgcGlwZXMgd2l0aGluIHRoZSBlbnRyeQogICAgICAgIGZpbGVfY29uZmlnPSIke2ZpbGVfY29uZmlnLy8kJ1x4MDEnL3x9IgogICAgICAgIGlmIFtbIC1uICIkZmlsZV9jb25maWciIF1dOyB0aGVuCiAgICAgICAgICAgICMgU3BsaXQgb25seSBvbiBmaXJzdCB0d28gY29sb25zIHRvIGhhbmRsZSBjb2xvbnMgaW4gbGluZV9zdGFydCBwYXR0ZXJucwogICAgICAgICAgICBsb2NhbCBmaWxlIHR5cGUgbGluZV9zdGFydAogICAgICAgICAgICBmaWxlPSQoZWNobyAiJGZpbGVfY29uZmlnIiB8IGN1dCAtZCc6JyAtZjEpCiAgICAgICAgICAgIHR5cGU9JChlY2hvICIkZmlsZV9jb25maWciIHwgY3V0IC1kJzonIC1mMikKICAgICAgICAgICAgIyBFdmVyeXRoaW5nIGFmdGVyIHRoZSBzZWNvbmQgY29sb24gaXMgdGhlIGxpbmVfc3RhcnQgcGF0dGVybgogICAgICAgICAgICBsaW5lX3N0YXJ0PSQoZWNobyAiJGZpbGVfY29uZmlnIiB8IGN1dCAtZCc6JyAtZjMtKQogICAgICAgICAgICAKICAgICAgICAgICAgIyBTZXQgZGVmYXVsdHMKICAgICAgICAgICAgdHlwZT0iJHt0eXBlOi10eHR9IgoKICAgICAgICAgICAgaWYgW1sgLWYgIiRmaWxlIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgZWNobyAiJGZpbGU6JHR5cGU6JGxpbmVfc3RhcnQiCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gIlNraXBwaW5nICRmaWxlIChub3QgZm91bmQpIiA+JjIKICAgICAgICAgICAgZmkKICAgICAgICBmaQogICAgZG9uZQp9CgojIENvbXBhcmUgdHdvIHNlbWFudGljIHZlcnNpb24gc3RyaW5ncwojIFJldHVybnMgMCAodHJ1ZSkgaWYgdmVyc2lvbjEgPiB2ZXJzaW9uMiwgMSAoZmFsc2UpIG90aGVyd2lzZQp2ZXJzaW9uX2lzX2dyZWF0ZXIoKSB7CiAgICBsb2NhbCB2ZXJzaW9uMT0iJDEiCiAgICBsb2NhbCB2ZXJzaW9uMj0iJDIiCgogICAgIyBTcGxpdCB2ZXJzaW9ucyBpbnRvIG1ham9yLm1pbm9yLnBhdGNoIGNvbXBvbmVudHMKICAgIGxvY2FsIHYxX21ham9yCiAgICBsb2NhbCB2MV9taW5vcgogICAgbG9jYWwgdjFfcGF0Y2gKICAgIGxvY2FsIHYyX21ham9yCiAgICBsb2NhbCB2Ml9taW5vcgogICAgbG9jYWwgdjJfcGF0Y2gKCiAgICB2MV9tYWpvcj0kKGVjaG8gIiR2ZXJzaW9uMSIgfCBjdXQgLWQuIC1mMSkKICAgIHYxX21pbm9yPSQoZWNobyAiJHZlcnNpb24xIiB8IGN1dCAtZC4gLWYyKQogICAgdjFfcGF0Y2g9JChlY2hvICIkdmVyc2lvbjEiIHwgY3V0IC1kLiAtZjMpCgogICAgdjJfbWFqb3I9JChlY2hvICIkdmVyc2lvbjIiIHwgY3V0IC1kLiAtZjEpCiAgICB2Ml9taW5vcj0kKGVjaG8gIiR2ZXJzaW9uMiIgfCBjdXQgLWQuIC1mMikKICAgIHYyX3BhdGNoPSQoZWNobyAiJHZlcnNpb24yIiB8IGN1dCAtZC4gLWYzKQoKICAgICMgQ29tcGFyZSBtYWpvciB2ZXJzaW9uCiAgICBpZiBbICIkdjFfbWFqb3IiIC1ndCAiJHYyX21ham9yIiBdOyB0aGVuCiAgICAgICAgcmV0dXJuIDAgICMgdmVyc2lvbjEgPiB2ZXJzaW9uMgogICAgZWxpZiBbICIkdjFfbWFqb3IiIC1sdCAiJHYyX21ham9yIiBdOyB0aGVuCiAgICAgICAgcmV0dXJuIDEgICMgdmVyc2lvbjEgPCB2ZXJzaW9uMgogICAgZmkKCiAgICAjIE1ham9yIHZlcnNpb25zIGFyZSBlcXVhbCwgY29tcGFyZSBtaW5vciB2ZXJzaW9uCiAgICBpZiBbICIkdjFfbWlub3IiIC1ndCAiJHYyX21pbm9yIiBdOyB0aGVuCiAgICAgICAgcmV0dXJuIDAgICMgdmVyc2lvbjEgPiB2ZXJzaW9uMgogICAgZWxpZiBbICIkdjFfbWlub3IiIC1sdCAiJHYyX21pbm9yIiBdOyB0aGVuCiAgICAgICAgcmV0dXJuIDEgICMgdmVyc2lvbjEgPCB2ZXJzaW9uMgogICAgZmkKCiAgICAjIE1ham9yIGFuZCBtaW5vciB2ZXJzaW9ucyBhcmUgZXF1YWwsIGNvbXBhcmUgcGF0Y2ggdmVyc2lvbgogICAgaWYgWyAiJHYxX3BhdGNoIiAtZ3QgIiR2Ml9wYXRjaCIgXTsgdGhlbgogICAgICAgIHJldHVybiAwICAjIHZlcnNpb24xID4gdmVyc2lvbjIKICAgIGVsc2UKICAgICAgICByZXR1cm4gMSAgIyB2ZXJzaW9uMSA8PSB2ZXJzaW9uMgogICAgZmkKfQoKZnVuY3Rpb24gZ2V0VmVyc2lvbigpewojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENvcHlyaWdodCAoYykgMjAyNSBWZWx2YXJ5IFB0eSBMdGQKIyBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgZnVuY3Rpb24gaXMgcGFydCBvZiB0aGUgVmVsdmFyeSBiYXNoIHNjcmlwdHMgbGlicmFyeS4KIyBMaWNlbnNlZCB1bmRlciB0aGUgRW5kIFVzZXIgTGljZW5zZSBBZ3JlZW1lbnQgKGV1bGEudHh0KSBwcm92aWRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBsb2NhbCB2ZXJzaW9uX2FyZz0iJDEiICAjIG1ham9yLCBtaW5vciwgcGF0Y2gsIG9yIHNwZWNpZmljIHZlcnNpb24KCiAgICAjIEluaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcyAoY29tcGF0aWJsZSB3aXRoIG9sZGVyIGJhc2ggdmVyc2lvbnMpCiAgICB2ZXJzaW9uX3NvdXJjZT0iIgogICAgdmVyc2lvbl9zb3VyY2VfZmlsZT0iIgogICAgdmVyc2lvbl9zb3VyY2VfdHlwZT0iIgogICAgdmVyc2lvbl9zb3VyY2VfbGluZV9zdGFydD0iIgogICAgY3VycmVudHZlcnNpb249IiIKICAgIG5ld3ZlcnNpb249IiIKCiAgICBwcmludF9kZWJ1ZyAiRGV0ZXJtaW5pbmcgVmVyc2lvbiBTb3VyY2UiCgogICAgIyBDaGVjayBmb3IgY3VzdG9tIHByaW1hcnkgdmVyc2lvbiBmaWxlIGZpcnN0CiAgICBpZiBbWyAtbiAiJHZlcnNpb25fcHJpbWFyeV9maWxlIiAmJiAtbiAiJHZlcnNpb25fcHJpbWFyeV90eXBlIiBdXTsgdGhlbgogICAgICAgIHByaW50X2RlYnVnICJDaGVja2luZyBjdXN0b20gcHJpbWFyeSB2ZXJzaW9uIGZpbGU6ICR2ZXJzaW9uX3ByaW1hcnlfZmlsZSIKICAgICAgICBpZiBjdXJyZW50dmVyc2lvbj0kKHJlYWRfdmVyc2lvbl9mcm9tX2ZpbGUgIiR2ZXJzaW9uX3ByaW1hcnlfZmlsZSIgIiR2ZXJzaW9uX3ByaW1hcnlfdHlwZSIgIiR2ZXJzaW9uX3ByaW1hcnlfbGluZV9zdGFydCIpOyB0aGVuCiAgICAgICAgICAgIHByaW50X2RlYnVnICJGb3VuZCBjdXN0b20gcHJpbWFyeSB2ZXJzaW9uIGZpbGU6ICR2ZXJzaW9uX3ByaW1hcnlfZmlsZSAtIHVzaW5nIGFzIHZlcnNpb24gc291cmNlIgogICAgICAgICAgICB2ZXJzaW9uX3NvdXJjZT0iY3VzdG9tX3ByaW1hcnkiCiAgICAgICAgICAgIHZlcnNpb25fc291cmNlX2ZpbGU9IiR2ZXJzaW9uX3ByaW1hcnlfZmlsZSIKICAgICAgICAgICAgdmVyc2lvbl9zb3VyY2VfdHlwZT0iJHZlcnNpb25fcHJpbWFyeV90eXBlIgogICAgICAgICAgICB2ZXJzaW9uX3NvdXJjZV9saW5lX3N0YXJ0PSIkdmVyc2lvbl9wcmltYXJ5X2xpbmVfc3RhcnQiCiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludF9lcnJvciAiQ291bGQgbm90IHJlYWQgdmVyc2lvbiBmcm9tIGN1c3RvbSBwcmltYXJ5IGZpbGU6ICR2ZXJzaW9uX3ByaW1hcnlfZmlsZSIKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICBmaQogICAgIyBGYWxsYmFjayB0byBwYWNrYWdlLmpzb24gKGxlZ2FjeSBiZWhhdmlvcikKICAgIGVsaWYgWyAtZiAiJHtwYWNrYWdlX2pzb25fcGF0aH0vcGFja2FnZS5qc29uIiBdOyB0aGVuCiAgICAgICAgbG9jYWwgcGFja2FnZV9qc29uX2ZpbGU9IiR7cGFja2FnZV9qc29uX3BhdGh9L3BhY2thZ2UuanNvbiIKICAgICAgICBwcmludF9kZWJ1ZyAiRm91bmQgcGFja2FnZS5qc29uIGF0ICRwYWNrYWdlX2pzb25fZmlsZSAtIHVzaW5nIGFzIHZlcnNpb24gc291cmNlIgogICAgICAgIHZlcnNpb25fc291cmNlPSJwYWNrYWdlLmpzb24iCiAgICAgICAgdmVyc2lvbl9zb3VyY2VfZmlsZT0iJHBhY2thZ2VfanNvbl9maWxlIgogICAgICAgIHZlcnNpb25fc291cmNlX3R5cGU9Impzb24iCiAgICAgICAgdmVyc2lvbl9zb3VyY2VfbGluZV9zdGFydD0iIgoKICAgICAgICBpZiBjdXJyZW50dmVyc2lvbj0kKHJlYWRfdmVyc2lvbl9mcm9tX2ZpbGUgIiRwYWNrYWdlX2pzb25fZmlsZSIgImpzb24iICIiKTsgdGhlbgogICAgICAgICAgICA6ICMgU3VjY2VzcywgY3VycmVudHZlcnNpb24gaXMgc2V0CiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludF9lcnJvciAiQ291bGQgbm90IHJlYWQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvbi4gRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgICMgRmFsbGJhY2sgdG8gVkVSU0lPTiBmaWxlIChsZWdhY3kgYmVoYXZpb3IpCiAgICBlbGlmIFsgLWYgIiR2ZXJzaW9uX2ZpbGVfcGF0aC9WRVJTSU9OIiBdOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiTm8gcGFja2FnZS5qc29uIGZvdW5kIC0gdXNpbmcgVkVSU0lPTiBmaWxlIGF0ICR2ZXJzaW9uX2ZpbGVfcGF0aC9WRVJTSU9OIgogICAgICAgIHZlcnNpb25fc291cmNlPSJWRVJTSU9OIgogICAgICAgIHZlcnNpb25fc291cmNlX2ZpbGU9IiR2ZXJzaW9uX2ZpbGVfcGF0aC9WRVJTSU9OIgogICAgICAgIHZlcnNpb25fc291cmNlX3R5cGU9InR4dCIKICAgICAgICB2ZXJzaW9uX3NvdXJjZV9saW5lX3N0YXJ0PSIiCgogICAgICAgIGlmIGN1cnJlbnR2ZXJzaW9uPSQocmVhZF92ZXJzaW9uX2Zyb21fZmlsZSAiJHZlcnNpb25fZmlsZV9wYXRoL1ZFUlNJT04iICJ0eHQiICIiKTsgdGhlbgogICAgICAgICAgICA6ICMgU3VjY2VzcywgY3VycmVudHZlcnNpb24gaXMgc2V0CiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludF9lcnJvciAiVkVSU0lPTiBmaWxlIGlzIGVtcHR5LiBFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICBmaQogICAgZWxzZQogICAgICAgIHByaW50X2Vycm9yICJObyB2ZXJzaW9uIHNvdXJjZSBmb3VuZCEgUGxlYXNlIGNyZWF0ZSBlaXRoZXI6IgogICAgICAgIGlmIFtbIC1uICIkdmVyc2lvbl9wcmltYXJ5X2ZpbGUiIF1dOyB0aGVuCiAgICAgICAgICAgIHByaW50X2Vycm9yICIgIC0gQ3VzdG9tIHByaW1hcnkgdmVyc2lvbiBmaWxlOiAkdmVyc2lvbl9wcmltYXJ5X2ZpbGUsIG9yIgogICAgICAgIGZpCiAgICAgICAgcHJpbnRfZXJyb3IgIiAgLSBwYWNrYWdlLmpzb24gYXQgJHBhY2thZ2VfanNvbl9wYXRoL3BhY2thZ2UuanNvbiB3aXRoIHZlcnNpb24gZmllbGQsIG9yIgogICAgICAgIHByaW50X2Vycm9yICIgIC0gVkVSU0lPTiBmaWxlIGF0ICR2ZXJzaW9uX2ZpbGVfcGF0aC9WRVJTSU9OIgogICAgICAgIHJldHVybiAxCiAgICBmaQoKICAgICMgQ2FsY3VsYXRlIG5ldyB2ZXJzaW9uIGJhc2VkIG9uIGFyZ3VtZW50CiAgICBpZiBbIC16ICIkdmVyc2lvbl9hcmciIF07IHRoZW4KICAgICAgIHByaW50X2luZm8gIk5vIHZlcnNpb24gc3BlY2lmaWVkLCBidW1waW5nIHBhdGNoIHZlcnNpb24uLi4iCiAgICAgICBuZXd2ZXJzaW9uPSQoZWNobyAiJGN1cnJlbnR2ZXJzaW9uIiB8IGF3ayAtRi4gJ3skTkYgPSAkTkYgKyAxO30gMScgfCBzZWQgJ3MvIC8uL2cnKQogICAgZWxzZQogICAgICAgIHByaW50X2luZm8gIlNldHRpbmcgdmVyc2lvbiBiYXNlZCBvbiBhcmd1bWVudDogJHZlcnNpb25fYXJnIgogICAgICAgIGlmIFsgIiR2ZXJzaW9uX2FyZyIgPT0gIm1ham9yIiBdOyB0aGVuCiAgICAgICAgICAgIG5ld3ZlcnNpb249JChlY2hvICIkY3VycmVudHZlcnNpb24iIHwgYXdrIC1GLiAneyQxID0gJDEgKyAxOyAkMiA9IDA7ICQzID0gMDt9IDEnIHwgc2VkICdzLyAvLi9nJykKICAgICAgICBlbGlmIFsgIiR2ZXJzaW9uX2FyZyIgPT0gIm1pbm9yIiBdOyB0aGVuCiAgICAgICAgICAgIG5ld3ZlcnNpb249JChlY2hvICIkY3VycmVudHZlcnNpb24iIHwgYXdrIC1GLiAneyQyID0gJDIgKyAxOyAkMyA9IDA7fSAxJyB8IHNlZCAncy8gLy4vZycpCiAgICAgICAgZWxpZiBbICIkdmVyc2lvbl9hcmciID09ICJwYXRjaCIgXTsgdGhlbgogICAgICAgICAgICBuZXd2ZXJzaW9uPSQoZWNobyAiJGN1cnJlbnR2ZXJzaW9uIiB8IGF3ayAtRi4gJ3skMyA9ICQzICsgMTt9IDEnIHwgc2VkICdzLyAvLi9nJykKICAgICAgICBlbHNlCiAgICAgICAgICAgICMgVmFsaWRhdGUgc3BlY2lmaWMgdmVyc2lvbiBmb3JtYXQgKFguWS5aKQogICAgICAgICAgICBpZiBbWyAhICIkdmVyc2lvbl9hcmciID1+IF5bMC05XStcLlswLTldK1wuWzAtOV0rJCBdXTsgdGhlbgogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IgIkludmFsaWQgdmVyc2lvbiBmb3JtYXQ6ICR2ZXJzaW9uX2FyZyIKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yICJWZXJzaW9uIG11c3QgYmUgaW4gbWFqb3IubWlub3IucGF0Y2ggZm9ybWF0IChlLmcuLCAxLjIuMykiCiAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICBmaQoKICAgICAgICAgICAgIyBHZXQgbGF0ZXN0IHZlcnNpb24gZnJvbSBnaXQgdGFncyBmb3IgY29tcGFyaXNvbgogICAgICAgICAgICBsb2NhbCBsYXRlc3RfdGFnX3ZlcnNpb24KICAgICAgICAgICAgbGF0ZXN0X3RhZ192ZXJzaW9uPSQoZ2V0X2xhdGVzdF92ZXJzaW9uX2Zyb21fdGFncykKCiAgICAgICAgICAgIGlmIFtbIC1uICIkbGF0ZXN0X3RhZ192ZXJzaW9uIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgcHJpbnRfaW5mbyAiTGF0ZXN0IGdpdCB0YWcgdmVyc2lvbjogJGxhdGVzdF90YWdfdmVyc2lvbiIKICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgbmV3IHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGxhdGVzdCB0YWcKICAgICAgICAgICAgICAgIGlmICEgdmVyc2lvbl9pc19ncmVhdGVyICIkdmVyc2lvbl9hcmciICIkbGF0ZXN0X3RhZ192ZXJzaW9uIjsgdGhlbgogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yICJWZXJzaW9uICR2ZXJzaW9uX2FyZyBpcyBsb3dlciB0aGFuIGxhdGVzdCB2ZXJzaW9uICRsYXRlc3RfdGFnX3ZlcnNpb24iCiAgICAgICAgICAgICAgICAgICAgZWNobyAiV291bGQgeW91IGxpa2UgdG86IgogICAgICAgICAgICAgICAgICAgIGVjaG8gIjEpIEJ1bXAgdGhlIHBhdGNoIHZlcnNpb24gKCR7bGF0ZXN0X3RhZ192ZXJzaW9ufSDihpIgJChlY2hvICIkbGF0ZXN0X3RhZ192ZXJzaW9uIiB8IGF3ayAtRi4gJ3skMyA9ICQzICsgMTt9IDEnIHwgc2VkICdzLyAvLi9nJykpIgogICAgICAgICAgICAgICAgICAgIGVjaG8gIjIpIFRyeSBlbnRlcmluZyBhbm90aGVyIHZlcnNpb24gbnVtYmVyIgogICAgICAgICAgICAgICAgICAgIGVjaG8gIjMpIEV4aXQgKGRlZmF1bHQpIgogICAgICAgICAgICAgICAgICAgIHJlYWQgLXAgIiQoZWNobyAtZSAke0JDeWFufUVudGVyIGNob2ljZSBbMS8yLzNdOiAke0NvbG9yX09mZn0pIiBjaG9pY2UKCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiJGNob2ljZSIgaW4KICAgICAgICAgICAgICAgICAgICAgICAgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZlcnNpb249JChlY2hvICIkbGF0ZXN0X3RhZ192ZXJzaW9uIiB8IGF3ayAtRi4gJ3skMyA9ICQzICsgMTt9IDEnIHwgc2VkICdzLyAvLi9nJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIlVzaW5nIHBhdGNoIGJ1bXA6ICRuZXd2ZXJzaW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAgICAgMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgLXAgIiQoZWNobyAtZSAke0JDeWFufUVudGVyIG5ldyB2ZXJzaW9uOiAke0NvbG9yX09mZn0pIiBuZXdfaW5wdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFtbIC1uICIkbmV3X2lucHV0IiBdXTsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUmVjdXJzaXZlbHkgY2FsbCBnZXRWZXJzaW9uIHdpdGggbmV3IGlucHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmVyc2lvbiAiJG5ld19pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJD8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvciAiTm8gdmVyc2lvbiBlbnRlcmVkLiBFeGl0aW5nLiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgICAgICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvciAiRXhpdGluZy4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICBlc2FjCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAjIE5vIGdpdCB0YWdzIGV4aXN0IHlldCAtIHRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gdGFnCiAgICAgICAgICAgICAgICBwcmludF9pbmZvICJObyB2ZXJzaW9uIHRhZ3MgZm91bmQgaW4gcmVwb3NpdG9yeSIKICAgICAgICAgICAgICAgIHByaW50X2luZm8gIlRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgdmVyc2lvbiB0YWc6ICR2ZXJzaW9uX2FyZyIKICAgICAgICAgICAgICAgICMgQ29tcGFyZSBhZ2FpbnN0IGN1cnJlbnQgdmVyc2lvbiBpbiBmaWxlIHRvIGVuc3VyZSB3ZSdyZSBub3QgZ29pbmcgYmFja3dhcmRzCiAgICAgICAgICAgICAgICBpZiAhIHZlcnNpb25faXNfZ3JlYXRlciAiJHZlcnNpb25fYXJnIiAiJGN1cnJlbnR2ZXJzaW9uIjsgdGhlbgogICAgICAgICAgICAgICAgICAgIHByaW50X3dhcm5pbmcgIlNwZWNpZmllZCB2ZXJzaW9uICR2ZXJzaW9uX2FyZyBpcyBub3QgZ3JlYXRlciB0aGFuIGN1cnJlbnQgZmlsZSB2ZXJzaW9uICRjdXJyZW50dmVyc2lvbiIKICAgICAgICAgICAgICAgICAgICBlY2hvICJXb3VsZCB5b3UgbGlrZSB0bzoiCiAgICAgICAgICAgICAgICAgICAgZWNobyAiMSkgVXNlIGN1cnJlbnQgZmlsZSB2ZXJzaW9uIGFuZCBidW1wIHBhdGNoICgke2N1cnJlbnR2ZXJzaW9ufSDihpIgJChlY2hvICIkY3VycmVudHZlcnNpb24iIHwgYXdrIC1GLiAneyQzID0gJDMgKyAxO30gMScgfCBzZWQgJ3MvIC8uL2cnKSkiCiAgICAgICAgICAgICAgICAgICAgZWNobyAiMikgVHJ5IGVudGVyaW5nIGFub3RoZXIgdmVyc2lvbiBudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgZWNobyAiMykgQ29udGludWUgd2l0aCAkdmVyc2lvbl9hcmcgYW55d2F5IgogICAgICAgICAgICAgICAgICAgIGVjaG8gIjQpIEV4aXQgKGRlZmF1bHQpIgogICAgICAgICAgICAgICAgICAgIHJlYWQgLXAgIiQoZWNobyAtZSAke0JDeWFufUVudGVyIGNob2ljZSBbMS8yLzMvNF06ICR7Q29sb3JfT2ZmfSkiIGNob2ljZQoKICAgICAgICAgICAgICAgICAgICBjYXNlICIkY2hvaWNlIiBpbgogICAgICAgICAgICAgICAgICAgICAgICAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmVyc2lvbj0kKGVjaG8gIiRjdXJyZW50dmVyc2lvbiIgfCBhd2sgLUYuICd7JDMgPSAkMyArIDE7fSAxJyB8IHNlZCAncy8gLy4vZycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdWNjZXNzICJVc2luZyBmaWxlIHZlcnNpb24gcGF0Y2ggYnVtcDogJG5ld3ZlcnNpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICAgICAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCAtcCAiJChlY2hvIC1lICR7QkN5YW59RW50ZXIgbmV3IHZlcnNpb246ICR7Q29sb3JfT2ZmfSkiIG5ld19pbnB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgW1sgLW4gIiRuZXdfaW5wdXQiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWN1cnNpdmVseSBjYWxsIGdldFZlcnNpb24gd2l0aCBuZXcgaW5wdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWZXJzaW9uICIkbmV3X2lucHV0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yICJObyB2ZXJzaW9uIGVudGVyZWQuIEV4aXRpbmcuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAgICAgMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2luZm8gIkNvbnRpbnVpbmcgd2l0aCB2ZXJzaW9uICR2ZXJzaW9uX2FyZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZlcnNpb249IiR2ZXJzaW9uX2FyZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgICAgICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9pbmZvICJFeGl0aW5nLiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgIGVzYWMKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBuZXd2ZXJzaW9uPSIkdmVyc2lvbl9hcmciCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICBmaQoKICAgIHByaW50X2luZm8gIlZlcnNpb24gc291cmNlOiAke0JXaGl0ZX0kdmVyc2lvbl9zb3VyY2Uke0NvbG9yX09mZn0iCiAgICBwcmludF9pbmZvICJDdXJyZW50IHZlcnNpb246ICR7QldoaXRlfSRjdXJyZW50dmVyc2lvbiR7Q29sb3JfT2ZmfSIKICAgIHByaW50X3N1Y2Nlc3MgIk5ldyB2ZXJzaW9uOiAke0JXaGl0ZX0kbmV3dmVyc2lvbiR7Q29sb3JfT2ZmfSIKfQoKZnVuY3Rpb24gYnVtcFZlcnNpb24oKSB7CiAgICAjIGlmICRuZXd2ZXJzaW9uIGlzIG5vdCBzZXQsIGV4aXQgd2l0aCBhbiBlcnJvcgogICAgaWYgWyAteiAiJG5ld3ZlcnNpb24iIF07IHRoZW4KICAgICAgICBwcmludF9lcnJvciAiTm8gbmV3IHZlcnNpb24gc2V0LiBFeGl0aW5nLiIKICAgICAgICBnaXQgY2hlY2tvdXQgIiRvcmlnaW5hbF9icmFuY2giCiAgICAgICAgcHJpbnRfaW5mbyAiUmV0dXJuZWQgdG8gb3JpZ2luYWwgYnJhbmNoOiAkb3JpZ2luYWxfYnJhbmNoIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICAjIGlmICR2ZXJzaW9uX3NvdXJjZSBpcyBub3Qgc2V0LCBleGl0IHdpdGggYW4gZXJyb3IKICAgIGlmIFsgLXogIiR2ZXJzaW9uX3NvdXJjZSIgXTsgdGhlbgogICAgICAgIHByaW50X2Vycm9yICJObyB2ZXJzaW9uIHNvdXJjZSBkZXRlcm1pbmVkLiBQbGVhc2UgcnVuIGdldFZlcnNpb24gZmlyc3QuIEV4aXRpbmcuIgogICAgICAgICMgcmV0dXJuIHRvIG9yaWdpbmFsIGJyYW5jaAogICAgICAgIGdpdCBjaGVja291dCAiJG9yaWdpbmFsX2JyYW5jaCIKICAgICAgICBwcmludF9pbmZvICJSZXR1cm5lZCB0byBvcmlnaW5hbCBicmFuY2g6ICRvcmlnaW5hbF9icmFuY2giCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgIHByaW50X2RlYnVnICJVcGRhdGluZyBWZXJzaW9uIE51bWJlcnMiCgogICAgIyBVcGRhdGUgdGhlIHByaW1hcnkgdmVyc2lvbiBzb3VyY2UgZmlyc3QKICAgIGlmIFsgIiR2ZXJzaW9uX3NvdXJjZSIgPSAiY3VzdG9tX3ByaW1hcnkiIF07IHRoZW4KICAgICAgICBwcmludF9pbmZvICJVcGRhdGluZyBjdXN0b20gcHJpbWFyeSB2ZXJzaW9uIHNvdXJjZTogJHZlcnNpb25fc291cmNlX2ZpbGUuLi4iCiAgICAgICAgd2FzX2V4ZWN1dGFibGU9JCh0ZXN0IC14ICIkdmVyc2lvbl9zb3VyY2VfZmlsZSIgJiYgZWNobyAieWVzIiB8fCBlY2hvICJubyIpCgogICAgICAgIGlmIHVwZGF0ZV92ZXJzaW9uX2luX2ZpbGUgIiR2ZXJzaW9uX3NvdXJjZV9maWxlIiAiJHZlcnNpb25fc291cmNlX3R5cGUiICIkdmVyc2lvbl9zb3VyY2VfbGluZV9zdGFydCIgIiRuZXd2ZXJzaW9uIjsgdGhlbgogICAgICAgICAgICBpZiBbWyAiJHdhc19leGVjdXRhYmxlIiA9PSAieWVzIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgY2htb2QgK3ggIiR2ZXJzaW9uX3NvdXJjZV9maWxlIgogICAgICAgICAgICAgICAgcHJpbnRfaW5mbyAiUmVzdG9yZWQgK3ggb24gJHZlcnNpb25fc291cmNlX2ZpbGUiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIlVwZGF0ZWQgdmVyc2lvbiB0byAkbmV3dmVyc2lvbiBpbiAkdmVyc2lvbl9zb3VyY2VfZmlsZSIKICAgICAgICBlbHNlCiAgICAgICAgICAgIHByaW50X2Vycm9yICJGYWlsZWQgdG8gdXBkYXRlIHZlcnNpb24gaW4gJHZlcnNpb25fc291cmNlX2ZpbGUiCiAgICAgICAgICAgIGV4aXQgMQogICAgICAgIGZpCiAgICBlbGlmIFsgIiR2ZXJzaW9uX3NvdXJjZSIgPSAicGFja2FnZS5qc29uIiBdOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiVXBkYXRpbmcgcHJpbWFyeSB2ZXJzaW9uIHNvdXJjZTogcGFja2FnZS5qc29uLi4uIgogICAgICAgIGxvY2FsIHBhY2thZ2VfanNvbl9maWxlPSIke3BhY2thZ2VfanNvbl9wYXRofS9wYWNrYWdlLmpzb24iCiAgICAgICAgaWYgdXBkYXRlX3ZlcnNpb25faW5fZmlsZSAiJHBhY2thZ2VfanNvbl9maWxlIiAianNvbiIgIiIgIiRuZXd2ZXJzaW9uIjsgdGhlbgogICAgICAgICAgICBwcmludF9zdWNjZXNzICJVcGRhdGVkIHZlcnNpb24gdG8gJG5ld3ZlcnNpb24gaW4gcGFja2FnZS5qc29uIgogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJpbnRfZXJyb3IgIkZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbiBpbiBwYWNrYWdlLmpzb24iCiAgICAgICAgICAgIGV4aXQgMQogICAgICAgIGZpCgogICAgICAgICMgQWxzbyB1cGRhdGUgVkVSU0lPTiBmaWxlIGlmIGl0IGV4aXN0cyAoZm9yIGNvbXBhdGliaWxpdHkpCiAgICAgICAgaWYgWyAtZiAiJHZlcnNpb25fZmlsZV9wYXRoL1ZFUlNJT04iIF07IHRoZW4KICAgICAgICAgICAgcHJpbnRfaW5mbyAiVXBkYXRpbmcgVkVSU0lPTiBmaWxlIGZvciBjb21wYXRpYmlsaXR5Li4uIgogICAgICAgICAgICBpZiB1cGRhdGVfdmVyc2lvbl9pbl9maWxlICIkdmVyc2lvbl9maWxlX3BhdGgvVkVSU0lPTiIgInR4dCIgIiIgIiRuZXd2ZXJzaW9uIjsgdGhlbgogICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAiVXBkYXRlZCB2ZXJzaW9uIHRvICRuZXd2ZXJzaW9uIGluIFZFUlNJT04gZmlsZSIKICAgICAgICAgICAgZmkKICAgICAgICBmaQogICAgZWxzZQogICAgICAgICMgVkVSU0lPTiBmaWxlIGlzIHRoZSBwcmltYXJ5IHNvdXJjZQogICAgICAgIHByaW50X2luZm8gIlVwZGF0aW5nIHByaW1hcnkgdmVyc2lvbiBzb3VyY2U6IFZFUlNJT04gZmlsZS4uLiIKICAgICAgICBpZiB1cGRhdGVfdmVyc2lvbl9pbl9maWxlICIkdmVyc2lvbl9maWxlX3BhdGgvVkVSU0lPTiIgInR4dCIgIiIgIiRuZXd2ZXJzaW9uIjsgdGhlbgogICAgICAgICAgICBwcmludF9zdWNjZXNzICJVcGRhdGVkIHZlcnNpb24gdG8gJG5ld3ZlcnNpb24gaW4gVkVSU0lPTiBmaWxlIgogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJpbnRfZXJyb3IgIkZhaWxlZCB0byB1cGRhdGUgdmVyc2lvbiBpbiBWRVJTSU9OIGZpbGUiCiAgICAgICAgICAgIGV4aXQgMQogICAgICAgIGZpCgogICAgICAgICMgQWxzbyB1cGRhdGUgcGFja2FnZS5qc29uIGlmIGl0IGV4aXN0cyAoZm9yIGNvbXBhdGliaWxpdHkpCiAgICAgICAgbG9jYWwgcGFja2FnZV9qc29uX2ZpbGU9IiR7cGFja2FnZV9qc29uX3BhdGh9L3BhY2thZ2UuanNvbiIKICAgICAgICBpZiBbIC1mICIkcGFja2FnZV9qc29uX2ZpbGUiIF07IHRoZW4KICAgICAgICAgICAgcHJpbnRfaW5mbyAiVXBkYXRpbmcgcGFja2FnZS5qc29uIGZvciBjb21wYXRpYmlsaXR5Li4uIgogICAgICAgICAgICBpZiB1cGRhdGVfdmVyc2lvbl9pbl9maWxlICIkcGFja2FnZV9qc29uX2ZpbGUiICJqc29uIiAiIiAiJG5ld3ZlcnNpb24iOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF9zdWNjZXNzICJVcGRhdGVkIHZlcnNpb24gdG8gJG5ld3ZlcnNpb24gaW4gcGFja2FnZS5qc29uIgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICBmaQoKICAgICMgVXBkYXRlIHNlY29uZGFyeSB2ZXJzaW9uIGZpbGVzIGlmIGNvbmZpZ3VyZWQKICAgIGlmIFtbIC1uICIkdmVyc2lvbl9zZWNvbmRhcnlfZmlsZXMiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiVXBkYXRpbmcgc2Vjb25kYXJ5IHZlcnNpb24gZmlsZXMuLi4iCiAgICAgICAgd2hpbGUgSUZTPSByZWFkIC1yIGZpbGVfY29uZmlnOyBkbwogICAgICAgICAgICBpZiBbWyAtbiAiJGZpbGVfY29uZmlnIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgIyBTcGxpdCBvbmx5IG9uIGZpcnN0IHR3byBjb2xvbnMgdG8gaGFuZGxlIGNvbG9ucyBpbiBsaW5lX3N0YXJ0IHBhdHRlcm5zCiAgICAgICAgICAgICAgICBsb2NhbCBzZWNfZmlsZSBzZWNfdHlwZSBzZWNfbGluZV9zdGFydAogICAgICAgICAgICAgICAgc2VjX2ZpbGU9JChlY2hvICIkZmlsZV9jb25maWciIHwgY3V0IC1kJzonIC1mMSkKICAgICAgICAgICAgICAgIHNlY190eXBlPSQoZWNobyAiJGZpbGVfY29uZmlnIiB8IGN1dCAtZCc6JyAtZjIpCiAgICAgICAgICAgICAgICAjIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIHNlY29uZCBjb2xvbiBpcyB0aGUgbGluZV9zdGFydCBwYXR0ZXJuCiAgICAgICAgICAgICAgICBzZWNfbGluZV9zdGFydD0kKGVjaG8gIiRmaWxlX2NvbmZpZyIgfCBjdXQgLWQnOicgLWYzLSkKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIyBTZXQgZGVmYXVsdHMKICAgICAgICAgICAgICAgIHNlY190eXBlPSIke3NlY190eXBlOi10eHR9IgogICAgICAgICAgICAgICAgIyBUcmFjayB3aGljaCBmaWxlcyB3ZXJlIGV4ZWN1dGFibGUgYmVmb3JlCiAgICAgICAgICAgICAgICB3YXNfZXhlY3V0YWJsZT0kKHRlc3QgLXggIiRzZWNfZmlsZSIgJiYgZWNobyAieWVzIiB8fCBlY2hvICJubyIpCiAgICAgICAgICAgICAgICBwcmludF9pbmZvICJVcGRhdGluZyAkc2VjX2ZpbGUsIGFzICRzZWNfdHlwZSIgImRlYnVnIgoKICAgICAgICAgICAgICAgIGlmIHVwZGF0ZV92ZXJzaW9uX2luX2ZpbGUgIiRzZWNfZmlsZSIgIiRzZWNfdHlwZSIgIiRzZWNfbGluZV9zdGFydCIgIiRuZXd2ZXJzaW9uIjsgdGhlbgogICAgICAgICAgICAgICAgICAgIGlmIFtbICIkd2FzX2V4ZWN1dGFibGUiID09ICJ5ZXMiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGNobW9kICt4ICIkc2VjX2ZpbGUiCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2luZm8gIlJlc3RvcmVkICt4IG9uICRzZWNfZmlsZSIKICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIlVwZGF0ZWQgdmVyc2lvbiB0byAkbmV3dmVyc2lvbiBpbiAkc2VjX2ZpbGUiCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcHJpbnRfd2FybmluZyAiRmFpbGVkIHRvIHVwZGF0ZSB2ZXJzaW9uIGluICRzZWNfZmlsZSIKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGZpCiAgICAgICAgZG9uZSA8PDwgIiQocGFyc2Vfc2Vjb25kYXJ5X3ZlcnNpb25fZmlsZXMgIiR2ZXJzaW9uX3NlY29uZGFyeV9maWxlcyIpIgogICAgZmkKCiAgICAjIFVwZGF0ZSBXb3JkUHJlc3MgZmlsZXMgaWYgYXBwbGljYWJsZSAobGVnYWN5IHN1cHBvcnQpCiAgICBpZiBbWyAtbiAiJHdvcmRwcmVzc19maWxlc19wYXRoIiBdXTsgdGhlbgogICAgICAgICMgQ2hlY2sgZm9yIHN0eWxlLmNzcyBpbiBib3RoIHJvb3QgYW5kIHJlc291cmNlcy8gc3ViZGlyZWN0b3J5IChTYWdlIHRoZW1lcykKICAgICAgICBsb2NhbCBzdHlsZV9jc3NfcGF0aD0iIgogICAgICAgIGlmIFtbIC1mICIkd29yZHByZXNzX2ZpbGVzX3BhdGgvc3R5bGUuY3NzIiBdXTsgdGhlbgogICAgICAgICAgICBzdHlsZV9jc3NfcGF0aD0iJHdvcmRwcmVzc19maWxlc19wYXRoL3N0eWxlLmNzcyIKICAgICAgICBlbGlmIFtbIC1mICIkd29yZHByZXNzX2ZpbGVzX3BhdGgvcmVzb3VyY2VzL3N0eWxlLmNzcyIgXV07IHRoZW4KICAgICAgICAgICAgc3R5bGVfY3NzX3BhdGg9IiR3b3JkcHJlc3NfZmlsZXNfcGF0aC9yZXNvdXJjZXMvc3R5bGUuY3NzIgogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgaWYgW1sgLW4gIiRzdHlsZV9jc3NfcGF0aCIgXV07IHRoZW4KICAgICAgICAgICAgaWYgc2VkX2lucGxhY2UgInMvVmVyc2lvbjogLiovVmVyc2lvbjogJG5ld3ZlcnNpb24vIiAiJHN0eWxlX2Nzc19wYXRoIjsgdGhlbgogICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAiVXBkYXRlZCB2ZXJzaW9uIGluICQoYmFzZW5hbWUgIiRzdHlsZV9jc3NfcGF0aCIpIgogICAgICAgICAgICBmaQogICAgICAgIGZpCgogICAgICAgICMgQ2hlY2sgZm9yIGZ1bmN0aW9ucy5waHAgaW4gYm90aCByb290IGFuZCByZXNvdXJjZXMvIHN1YmRpcmVjdG9yeSAoU2FnZSB0aGVtZXMpCiAgICAgICAgbG9jYWwgZnVuY3Rpb25zX3BocF9wYXRoPSIiCiAgICAgICAgaWYgW1sgLWYgIiR3b3JkcHJlc3NfZmlsZXNfcGF0aC9mdW5jdGlvbnMucGhwIiBdXTsgdGhlbgogICAgICAgICAgICBmdW5jdGlvbnNfcGhwX3BhdGg9IiR3b3JkcHJlc3NfZmlsZXNfcGF0aC9mdW5jdGlvbnMucGhwIgogICAgICAgIGVsaWYgW1sgLWYgIiR3b3JkcHJlc3NfZmlsZXNfcGF0aC9yZXNvdXJjZXMvZnVuY3Rpb25zLnBocCIgXV07IHRoZW4KICAgICAgICAgICAgZnVuY3Rpb25zX3BocF9wYXRoPSIkd29yZHByZXNzX2ZpbGVzX3BhdGgvcmVzb3VyY2VzL2Z1bmN0aW9ucy5waHAiCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICBpZiBbWyAtbiAiJGZ1bmN0aW9uc19waHBfcGF0aCIgXV07IHRoZW4KICAgICAgICAgICAgIyBFbnN1cmUgd3BWZXJzaW9uQ29uc3RhbnQgaXMgc2V0LCBnZW5lcmF0ZSBmcm9tIHRoZW1lIGRpcmVjdG9yeSBpZiBlbXB0eQogICAgICAgICAgICBsb2NhbCB3cF9jb25zdGFudD0iJHdwVmVyc2lvbkNvbnN0YW50IgogICAgICAgICAgICBpZiBbWyAteiAiJHdwX2NvbnN0YW50IiBdXTsgdGhlbgogICAgICAgICAgICAgICAgIyBHZW5lcmF0ZSBjb25zdGFudCBuYW1lIGZyb20gdGhlbWUgZGlyZWN0b3J5IG5hbWUKICAgICAgICAgICAgICAgIGxvY2FsIHRoZW1lX2Rpcj0kKGJhc2VuYW1lICIkd29yZHByZXNzX2ZpbGVzX3BhdGgiKQogICAgICAgICAgICAgICAgd3BfY29uc3RhbnQ9JChlY2hvICIke3RoZW1lX2Rpcn0iIHwgdHIgJ1s6bG93ZXI6XScgJ1s6dXBwZXI6XScgfCBzZWQgJ3MvLS9fL2cnKV9SRUxFQVNFX1ZFUlNJT04KICAgICAgICAgICAgICAgIHByaW50X2luZm8gIk1BSUFTU19XUF9WRVJTSU9OX0NPTlNUQU5UIGlzIGVtcHR5LCBhdXRvLWdlbmVyYXRlZCAnJHdwX2NvbnN0YW50JyBmcm9tIHRoZW1lIGRpcmVjdG9yeSAnJHRoZW1lX2RpciciCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBzZWRfaW5wbGFjZSAicy9eZGVmaW5lLiouJHdwX2NvbnN0YW50LiovZGVmaW5lKCckd3BfY29uc3RhbnQnLCckbmV3dmVyc2lvbicpOy8iICIkZnVuY3Rpb25zX3BocF9wYXRoIjsgdGhlbgogICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAiVXBkYXRlZCB2ZXJzaW9uIGNvbnN0YW50ICckd3BfY29uc3RhbnQnIGluICQoYmFzZW5hbWUgIiRmdW5jdGlvbnNfcGhwX3BhdGgiKSIKICAgICAgICAgICAgZmkKICAgICAgICBmaQogICAgZmkKfQoKZmkgIyBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX3ZlcnNpb25fc2gKIyAtLS0gRW5kIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL2NvcmUvdmVyc2lvbi5zaCAtLS0KCiMgLS0tIEJlZ2luIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL2NvcmUvdmVyc2lvbi1jaGVjay5zaCAtLS0KaWYgW1sgLXogIiR7X19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV92ZXJzaW9uX2NoZWNrX3NoOi19IiBdXTsgdGhlbiBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX3ZlcnNpb25fY2hlY2tfc2g9MQoKIyBWZXJzaW9uIGNoZWNraW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGJhc2htYWlhc3MKIyBDaGVja3MgR2l0SHViIHJlbGVhc2VzIEFQSSBmb3IgdXBkYXRlcyB3aXRoIGRhaWx5IGZyZXF1ZW5jeSBsaW1pdGluZwoKIyBHZXQgY3VycmVudCB2ZXJzaW9uIGZyb20gTUFJQVNTX0NMSUVOVF9WRVJTSU9OIGVudmlyb25tZW50IHZhcmlhYmxlCmdldF9jdXJyZW50X3ZlcnNpb24oKSB7CiAgICAjIFVzZSB0aGUgdmVyc2lvbiB0aGF0J3MgYWxyZWFkeSBleHBvcnRlZCBieSBtYWlhc3Muc2gKICAgIGlmIFtbIC1uICIke01BSUFTU19DTElFTlRfVkVSU0lPTn0iIF1dOyB0aGVuCiAgICAgICAgZWNobyAiJHtNQUlBU1NfQ0xJRU5UX1ZFUlNJT059IgogICAgICAgIHJldHVybiAwCiAgICBmaQogICAgCiAgICAjIEZhbGxiYWNrOiBleHRyYWN0IGZyb20gbWFpYXNzLnNoIGlmIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBhdmFpbGFibGUKICAgIGxvY2FsIGJhc2htYWlhc3Nfcm9vdD0iIgogICAgbG9jYWwgdmVyc2lvbj0iIgogICAgCiAgICAjIEZpbmQgYmFzaG1haWFzcyByb290IGRpcmVjdG9yeSAod2hlcmUgdGhpcyBzY3JpcHQgaXMgbG9jYXRlZCkKICAgIGlmIFtbIC1uICIke0JBU0hfU09VUkNFWzBdfSIgXV07IHRoZW4KICAgICAgICBiYXNobWFpYXNzX3Jvb3Q9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKS8uLi8uLiIgJiYgcHdkKSIKICAgIGVsaWYgW1sgLW4gIiR7X01BSUFTU19ST09UfSIgXV07IHRoZW4KICAgICAgICBiYXNobWFpYXNzX3Jvb3Q9IiR7X01BSUFTU19ST09UfSIKICAgIGZpCiAgICAKICAgICMgRXh0cmFjdCB2ZXJzaW9uIGZyb20gbWFpYXNzLnNoIE1BSUFTU19DTElFTlRfVkVSU0lPTiBsaW5lCiAgICBpZiBbWyAtbiAiJGJhc2htYWlhc3Nfcm9vdCIgJiYgLWYgIiRiYXNobWFpYXNzX3Jvb3QvbWFpYXNzLnNoIiBdXTsgdGhlbgogICAgICAgIHZlcnNpb249JChncmVwIC1FICdeZXhwb3J0IE1BSUFTU19DTElFTlRfVkVSU0lPTj0nICIkYmFzaG1haWFzc19yb290L21haWFzcy5zaCIgMj4vZGV2L251bGwgfCBjdXQgLWQnPScgLWYyKQogICAgZmkKICAgIAogICAgZWNobyAiJHt2ZXJzaW9uOi11bmtub3dufSIKfQoKIyBDaGVjayBpZiB2ZXJzaW9uIGNoZWNrIGlzIGR1ZSAoZGFpbHkgZnJlcXVlbmN5KQppc192ZXJzaW9uX2NoZWNrX2R1ZSgpIHsKICAgIGxvY2FsIHNlcnZpY2VfbmFtZQogICAgc2VydmljZV9uYW1lPSQoZ2V0X3NlY3VyZV9zZXJ2aWNlX25hbWUpCiAgICBsb2NhbCBsYXN0X2NoZWNrPSIiCiAgICBsb2NhbCBub3cKICAgIG5vdz0kKGRhdGUgKyVzKQogICAgbG9jYWwgb25lX2RheT0kKCgyNCAqIDYwICogNjApKQogICAgCiAgICAjIEdldCBsYXN0IGNoZWNrIHRpbWVzdGFtcCBmcm9tIHNlY3VyZSBzdG9yYWdlCiAgICBpZiBbWyAiJE9TVFlQRSIgPT0gImRhcndpbiIqIF1dOyB0aGVuCiAgICAgICAgbGFzdF9jaGVjaz0kKHNlY3VyaXR5IGZpbmQtZ2VuZXJpYy1wYXNzd29yZCAtcyAiJHNlcnZpY2VfbmFtZSIgLWEgIk1BSUFTU19MQVNUX1ZFUlNJT05fQ0hFQ0siIC13IDI+L2Rldi9udWxsKQogICAgZWxpZiBjb21tYW5kIC12IHNlY3JldC10b29sID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGxhc3RfY2hlY2s9JChzZWNyZXQtdG9vbCBsb29rdXAgc2VydmljZSAiJHNlcnZpY2VfbmFtZSIga2V5ICJNQUlBU1NfTEFTVF9WRVJTSU9OX0NIRUNLIiAyPi9kZXYvbnVsbCkKICAgIGZpCiAgICAKICAgICMgSWYgbm8gbGFzdCBjaGVjayBvciBtb3JlIHRoYW4gMjQgaG91cnMgYWdvLCBjaGVjayBpcyBkdWUKICAgIGlmIFtbIC16ICIkbGFzdF9jaGVjayIgXV0gfHwgW1sgJCgobm93IC0gbGFzdF9jaGVjaykpIC1ndCAkb25lX2RheSBdXTsgdGhlbgogICAgICAgIHJldHVybiAwICAjIENoZWNrIGlzIGR1ZQogICAgZWxzZQogICAgICAgIHJldHVybiAxICAjIENoZWNrIG5vdCBkdWUKICAgIGZpCn0KCiMgU3RvcmUgbGFzdCB2ZXJzaW9uIGNoZWNrIHRpbWVzdGFtcApzdG9yZV92ZXJzaW9uX2NoZWNrX3RpbWVzdGFtcCgpIHsKICAgIGxvY2FsIHNlcnZpY2VfbmFtZQogICAgc2VydmljZV9uYW1lPSQoZ2V0X3NlY3VyZV9zZXJ2aWNlX25hbWUpCiAgICBsb2NhbCBub3cKICAgIG5vdz0kKGRhdGUgKyVzKQogICAgCiAgICBpZiBbWyAiJE9TVFlQRSIgPT0gImRhcndpbiIqIF1dOyB0aGVuCiAgICAgICAgc2VjdXJpdHkgYWRkLWdlbmVyaWMtcGFzc3dvcmQgLVUgLXMgIiRzZXJ2aWNlX25hbWUiIC1hICJNQUlBU1NfTEFTVF9WRVJTSU9OX0NIRUNLIiAtdyAiJG5vdyIgMj4vZGV2L251bGwKICAgIGVsaWYgY29tbWFuZCAtdiBzZWNyZXQtdG9vbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBlY2hvIC1uICIkbm93IiB8IHNlY3JldC10b29sIHN0b3JlIC0tbGFiZWw9Ik1BSUFTUyBMYXN0IFZlcnNpb24gQ2hlY2sgKCRzZXJ2aWNlX25hbWUpIiBzZXJ2aWNlICIkc2VydmljZV9uYW1lIiBrZXkgIk1BSUFTU19MQVNUX1ZFUlNJT05fQ0hFQ0siCiAgICBmaQp9CgojIENvbXBhcmUgdmVyc2lvbiBzdHJpbmdzIChzZW12ZXItbGlrZSkKY29tcGFyZV92ZXJzaW9ucygpIHsKICAgIGxvY2FsIGN1cnJlbnQ9IiQxIgogICAgbG9jYWwgbGF0ZXN0PSIkMiIKICAgIAogICAgIyBSZW1vdmUgJ3YnIHByZWZpeCBpZiBwcmVzZW50CiAgICBjdXJyZW50PSQoZWNobyAiJGN1cnJlbnQiIHwgc2VkICdzL152Ly8nKQogICAgbGF0ZXN0PSQoZWNobyAiJGxhdGVzdCIgfCBzZWQgJ3MvXnYvLycpCiAgICAKICAgICMgQ29udmVydCB0byBzcGFjZS1zZXBhcmF0ZWQgZm9yIGVhc2llciBwcm9jZXNzaW5nCiAgICBjdXJyZW50PSQoZWNobyAiJGN1cnJlbnQiIHwgdHIgJy4nICcgJykKICAgIGxhdGVzdD0kKGVjaG8gIiRsYXRlc3QiIHwgdHIgJy4nICcgJykKICAgIAogICAgIyBDb21wYXJlIGVhY2ggcGFydCBtYW51YWxseSAoYmFzaCAzLjIgY29tcGF0aWJsZSkKICAgIGxvY2FsIGN1cnJfbWFqb3IgY3Vycl9taW5vciBjdXJyX3BhdGNoCiAgICBsb2NhbCBsYXRlc3RfbWFqb3IgbGF0ZXN0X21pbm9yIGxhdGVzdF9wYXRjaAogICAgCiAgICByZWFkIC1yIGN1cnJfbWFqb3IgY3Vycl9taW5vciBjdXJyX3BhdGNoIDw8PCAiJGN1cnJlbnQiCiAgICByZWFkIC1yIGxhdGVzdF9tYWpvciBsYXRlc3RfbWlub3IgbGF0ZXN0X3BhdGNoIDw8PCAiJGxhdGVzdCIKICAgIAogICAgIyBEZWZhdWx0IHRvIDAgaWYgZW1wdHkKICAgIGN1cnJfbWFqb3I9JHtjdXJyX21ham9yOi0wfQogICAgY3Vycl9taW5vcj0ke2N1cnJfbWlub3I6LTB9CiAgICBjdXJyX3BhdGNoPSR7Y3Vycl9wYXRjaDotMH0KICAgIGxhdGVzdF9tYWpvcj0ke2xhdGVzdF9tYWpvcjotMH0KICAgIGxhdGVzdF9taW5vcj0ke2xhdGVzdF9taW5vcjotMH0KICAgIGxhdGVzdF9wYXRjaD0ke2xhdGVzdF9wYXRjaDotMH0KICAgIAogICAgIyBDb21wYXJlIG1ham9yIHZlcnNpb24KICAgIGlmIFtbICRsYXRlc3RfbWFqb3IgLWd0ICRjdXJyX21ham9yIF1dOyB0aGVuCiAgICAgICAgcmV0dXJuIDAgICMgTGF0ZXN0IGlzIG5ld2VyCiAgICBlbGlmIFtbICRjdXJyX21ham9yIC1ndCAkbGF0ZXN0X21ham9yIF1dOyB0aGVuCiAgICAgICAgcmV0dXJuIDEgICMgQ3VycmVudCBpcyBuZXdlcgogICAgZmkKICAgIAogICAgIyBDb21wYXJlIG1pbm9yIHZlcnNpb24KICAgIGlmIFtbICRsYXRlc3RfbWlub3IgLWd0ICRjdXJyX21pbm9yIF1dOyB0aGVuCiAgICAgICAgcmV0dXJuIDAgICMgTGF0ZXN0IGlzIG5ld2VyCiAgICBlbGlmIFtbICRjdXJyX21pbm9yIC1ndCAkbGF0ZXN0X21pbm9yIF1dOyB0aGVuCiAgICAgICAgcmV0dXJuIDEgICMgQ3VycmVudCBpcyBuZXdlcgogICAgZmkKICAgIAogICAgIyBDb21wYXJlIHBhdGNoIHZlcnNpb24KICAgIGlmIFtbICRsYXRlc3RfcGF0Y2ggLWd0ICRjdXJyX3BhdGNoIF1dOyB0aGVuCiAgICAgICAgcmV0dXJuIDAgICMgTGF0ZXN0IGlzIG5ld2VyCiAgICBlbGlmIFtbICRjdXJyX3BhdGNoIC1ndCAkbGF0ZXN0X3BhdGNoIF1dOyB0aGVuCiAgICAgICAgcmV0dXJuIDEgICMgQ3VycmVudCBpcyBuZXdlcgogICAgZmkKICAgIAogICAgcmV0dXJuIDEgICMgVmVyc2lvbnMgYXJlIGVxdWFsCn0KCiMgRmV0Y2ggbGF0ZXN0IHZlcnNpb24gZnJvbSBHaXRIdWIgQVBJCmZldGNoX2xhdGVzdF92ZXJzaW9uKCkgewogICAgbG9jYWwgYXBpX3VybD0iaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy92c21hc2gvbWFpYXNzL3JlbGVhc2VzL2xhdGVzdCIKICAgIGxvY2FsIHJlc3BvbnNlPSIiCiAgICBsb2NhbCBsYXRlc3RfdmVyc2lvbj0iIgogICAgCiAgICAjIFRyeSBjdXJsIGZpcnN0LCB0aGVuIHdnZXQKICAgIGlmIGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICByZXNwb25zZT0kKGN1cmwgLXMgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAtSCAiVXNlci1BZ2VudDogYmFzaG1haWFzcy12ZXJzaW9uLWNoZWNrIiAiJGFwaV91cmwiIDI+L2Rldi9udWxsKQogICAgZWxpZiBjb21tYW5kIC12IHdnZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgcmVzcG9uc2U9JCh3Z2V0IC1xIC1PIC0gLS1oZWFkZXI9IkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAtLXVzZXItYWdlbnQ9ImJhc2htYWlhc3MtdmVyc2lvbi1jaGVjayIgIiRhcGlfdXJsIiAyPi9kZXYvbnVsbCkKICAgIGVsc2UKICAgICAgICBwcmludF9kZWJ1ZyAiTm8gSFRUUCBjbGllbnQgYXZhaWxhYmxlIChjdXJsL3dnZXQpIiAiZGVidWciCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCiAgICAKICAgICMgRXh0cmFjdCB2ZXJzaW9uIHVzaW5nIGJhc2ljIHRleHQgcHJvY2Vzc2luZyAoYXZvaWQganEgZGVwZW5kZW5jeSkKICAgIGlmIFtbIC1uICIkcmVzcG9uc2UiIF1dOyB0aGVuCiAgICAgICAgIyBMb29rIGZvciAidGFnX25hbWUiOiAidjUuOC4xNSIgcGF0dGVybgogICAgICAgIGxhdGVzdF92ZXJzaW9uPSQoZWNobyAiJHJlc3BvbnNlIiB8IGdyZXAgLW8gJyJ0YWdfbmFtZSJbWzpzcGFjZTpdXSo6W1s6c3BhY2U6XV0qIlteIl0qIicgfCBjdXQgLWQnIicgLWY0KQogICAgICAgIAogICAgICAgIGlmIFtbIC1uICIkbGF0ZXN0X3ZlcnNpb24iIF1dOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiRsYXRlc3RfdmVyc2lvbiIKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBmaQogICAgZmkKICAgIAogICAgIyBGYWxsYmFjayB2ZXJzaW9uIGlmIEFQSSBmYWlscwogICAgZWNobyAidjUuOC4xNSIKICAgIHJldHVybiAxCn0KCiMgTWFpbiB2ZXJzaW9uIGNoZWNrIGZ1bmN0aW9uCmNoZWNrX2Zvcl91cGRhdGVzKCkgewogICAgbG9jYWwgZm9yY2VfY2hlY2s9IiQxIiAgIyAiZm9yY2UiIHRvIGJ5cGFzcyBkYWlseSBsaW1pdAogICAgbG9jYWwgY3VycmVudF92ZXJzaW9uPSIiCiAgICBsb2NhbCBsYXRlc3RfdmVyc2lvbj0iIgogICAgbG9jYWwgcXVpZXQ9IiR7MjotZmFsc2V9IiAgIyAicXVpZXQiIHRvIHN1cHByZXNzIG91dHB1dAogICAgCiAgICAjIFNraXAgaWYgbm90IGR1ZSAodW5sZXNzIGZvcmNlZCkKICAgIGlmIFtbICIkZm9yY2VfY2hlY2siICE9ICJmb3JjZSIgXV0gJiYgISBpc192ZXJzaW9uX2NoZWNrX2R1ZTsgdGhlbgogICAgICAgIFtbICIkcXVpZXQiICE9ICJxdWlldCIgXV0gJiYgcHJpbnRfZGVidWcgIlZlcnNpb24gY2hlY2sgbm90IGR1ZSAoY2hlY2tlZCB3aXRoaW4gMjQgaG91cnMpIiAiZGVidWciCiAgICAgICAgcmV0dXJuIDAKICAgIGZpCiAgICAKICAgIGN1cnJlbnRfdmVyc2lvbj0kKGdldF9jdXJyZW50X3ZlcnNpb24pCiAgICBpZiBbWyAteiAiJGN1cnJlbnRfdmVyc2lvbiIgXV07IHRoZW4KICAgICAgICBbWyAiJHF1aWV0IiAhPSAicXVpZXQiIF1dICYmIHByaW50X3dhcm5pbmcgIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3VycmVudCB2ZXJzaW9uIgogICAgICAgIHJldHVybiAxCiAgICBmaQogICAgCiAgICBsYXRlc3RfdmVyc2lvbj0kKGZldGNoX2xhdGVzdF92ZXJzaW9uKQogICAgaWYgW1sgLXogIiRsYXRlc3RfdmVyc2lvbiIgXV07IHRoZW4KICAgICAgICBbWyAiJHF1aWV0IiAhPSAicXVpZXQiIF1dICYmIHByaW50X3dhcm5pbmcgIkNvdWxkIG5vdCBmZXRjaCBsYXRlc3QgdmVyc2lvbiBmcm9tIEdpdEh1YiIKICAgICAgICByZXR1cm4gMQogICAgZmkKICAgIAogICAgIyBTdG9yZSBjaGVjayB0aW1lc3RhbXAKICAgIHN0b3JlX3ZlcnNpb25fY2hlY2tfdGltZXN0YW1wCiAgICAKICAgICMgQ29tcGFyZSB2ZXJzaW9ucwogICAgaWYgY29tcGFyZV92ZXJzaW9ucyAiJGN1cnJlbnRfdmVyc2lvbiIgIiRsYXRlc3RfdmVyc2lvbiI7IHRoZW4KICAgICAgICBpZiBbWyAiJHF1aWV0IiAhPSAicXVpZXQiIF1dOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiIKICAgICAgICAgICAgcHJpbnRfaW5mbyAi8J+TpiBVcGRhdGUgQXZhaWxhYmxlISIKICAgICAgICAgICAgcHJpbnRfaW5mbyAiICAgQ3VycmVudDogJHtjdXJyZW50X3ZlcnNpb259IgogICAgICAgICAgICBwcmludF9pbmZvICIgICBMYXRlc3Q6ICAke2xhdGVzdF92ZXJzaW9ufSIKICAgICAgICAgICAgZWNobyAiIgogICAgICAgICAgICBwcmludF9pbmZvICJUbyB1cGRhdGU6IgogICAgICAgICAgICBpZiBjb21tYW5kIC12IGJyZXcgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF9pbmZvICIgICBicmV3IHVwZGF0ZSAmJiBicmV3IHVwZ3JhZGUgbWFpYXNzIgogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwcmludF9pbmZvICIgICBjdXJsIC1mc1NMIGh0dHBzOi8vbWFpYXNzLm5ldC9pbnN0YWxsLnNoIHwgYmFzaCIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgZWNobyAiIgogICAgICAgIGZpCiAgICAgICAgcmV0dXJuIDIgICMgVXBkYXRlIGF2YWlsYWJsZQogICAgZWxzZQogICAgICAgIFtbICIkcXVpZXQiICE9ICJxdWlldCIgXV0gJiYgW1sgIiRmb3JjZV9jaGVjayIgPT0gImZvcmNlIiBdXSAmJiBwcmludF9zdWNjZXNzICJZb3UncmUgcnVubmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gKCRjdXJyZW50X3ZlcnNpb24pIgogICAgICAgIHJldHVybiAwICAjIFVwIHRvIGRhdGUKICAgIGZpCn0KCiMgQXV0by1jaGVjayBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbnMgKHF1aWV0LCBkYWlseSBsaW1pdCkKYXV0b19jaGVja192ZXJzaW9uKCkgewogICAgIyBPbmx5IGNoZWNrIGlmIE1BSUFTU19BVVRPX1VQREFURV9DSEVDSyBpcyBub3QgZGlzYWJsZWQKICAgIGlmIFtbICIke01BSUFTU19BVVRPX1VQREFURV9DSEVDSzotdHJ1ZX0iID09ICJmYWxzZSIgXV07IHRoZW4KICAgICAgICByZXR1cm4gMAogICAgZmkKICAgIAogICAgIyBSdW4gaW4gYmFja2dyb3VuZCB0byBhdm9pZCBibG9ja2luZwogICAgY2hlY2tfZm9yX3VwZGF0ZXMgImF1dG8iICJxdWlldCIgJgp9CgojIE1hbnVhbCBjaGVjayAoZm9yY2UsIHZlcmJvc2UpCm1hbnVhbF9jaGVja192ZXJzaW9uKCkgewogICAgcHJpbnRfaW5mbyAiQ2hlY2tpbmcgZm9yIHVwZGF0ZXMuLi4iCiAgICBjaGVja19mb3JfdXBkYXRlcyAiZm9yY2UiICJ2ZXJib3NlIgp9CgojIENoZWNrIGZvciB1cGRhdGVzIGFuZCByZXR1cm4gc3RhdHVzIGZvciBzaWdub2ZmIGRpc3BsYXkKY2hlY2tfdmVyc2lvbl9mb3Jfc2lnbm9mZigpIHsKICAgIGxvY2FsIGN1cnJlbnRfdmVyc2lvbj0iIgogICAgbG9jYWwgbGF0ZXN0X3ZlcnNpb249IiIKICAgIAogICAgY3VycmVudF92ZXJzaW9uPSQoZ2V0X2N1cnJlbnRfdmVyc2lvbikKICAgIGlmIFtbIC16ICIkY3VycmVudF92ZXJzaW9uIiBdXTsgdGhlbgogICAgICAgIHJldHVybiAxCiAgICBmaQogICAgCiAgICBsYXRlc3RfdmVyc2lvbj0kKGZldGNoX2xhdGVzdF92ZXJzaW9uKQogICAgaWYgW1sgLXogIiRsYXRlc3RfdmVyc2lvbiIgXV07IHRoZW4KICAgICAgICByZXR1cm4gMQogICAgZmkKICAgIAogICAgIyBDb21wYXJlIHZlcnNpb25zCiAgICBpZiBjb21wYXJlX3ZlcnNpb25zICIkY3VycmVudF92ZXJzaW9uIiAiJGxhdGVzdF92ZXJzaW9uIjsgdGhlbgogICAgICAgICMgVXBkYXRlIGF2YWlsYWJsZSAtIGV4cG9ydCB2YXJpYWJsZXMgZm9yIHNpZ25vZmYKICAgICAgICBleHBvcnQgX01BSUFTU19VUERBVEVfQ1VSUkVOVD0iJGN1cnJlbnRfdmVyc2lvbiIKICAgICAgICBleHBvcnQgX01BSUFTU19VUERBVEVfTEFURVNUPSIkbGF0ZXN0X3ZlcnNpb24iCiAgICAgICAgcmV0dXJuIDIgICMgVXBkYXRlIGF2YWlsYWJsZQogICAgZWxzZQogICAgICAgIHJldHVybiAwICAjIFVwIHRvIGRhdGUKICAgIGZpCn0KCmZpICMgX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV92ZXJzaW9uX2NoZWNrX3NoCiMgLS0tIEVuZCBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi9jb3JlL3ZlcnNpb24tY2hlY2suc2ggLS0tCgojIC0tLSBCZWdpbiBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi9jb3JlL2xvZ2dlci5zaCAtLS0KaWYgW1sgLXogIiR7X19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV9sb2dnZXJfc2g6LX0iIF1dOyB0aGVuIF9fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfbG9nZ2VyX3NoPTEKCmZpICMgX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV9sb2dnZXJfc2gKIyAtLS0gRW5kIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL2NvcmUvbG9nZ2VyLnNoIC0tLQoKIyAtLS0gQmVnaW4gaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvdXRpbHMvaGVscGVycy5zaCAtLS0KaWYgW1sgLXogIiR7X19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfdXRpbHNfaGVscGVyc19zaDotfSIgXV07IHRoZW4gX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfdXRpbHNfaGVscGVyc19zaD0xCgojIENyb3NzLXBsYXRmb3JtIHNlZCAtaSBoZWxwZXIgZnVuY3Rpb24gd2l0aCBmaWxlIGV4aXN0ZW5jZSBjaGVjawojIFVzYWdlOiBzZWRfaW5wbGFjZSAncGF0dGVybicgZmlsZQojIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAxIGlmIGZpbGUgZG9lc24ndCBleGlzdCAobm9uLWZhdGFsKQpzZWRfaW5wbGFjZSgpIHsKICAgIGxvY2FsIHBhdHRlcm49IiQxIgogICAgbG9jYWwgZmlsZT0iJDIiCgogICAgIyBDaGVjayBpZiBmaWxlIGV4aXN0cyAtIHJldHVybiBzaWxlbnRseSBpZiBub3QgKGV4cGVjdGVkIGZvciBkaXZlcnNlIHJlcG9zKQogICAgaWYgWyAhIC1mICIkZmlsZSIgXTsgdGhlbgogICAgICAgIHJldHVybiAxCiAgICBmaQoKICAgIGlmIHNlZCAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgIyBHTlUgc2VkIChMaW51eCkKICAgICAgICBzZWQgLWkgIiRwYXR0ZXJuIiAiJGZpbGUiCiAgICBlbHNlCiAgICAgICAgIyBCU0Qgc2VkIChtYWNPUykKICAgICAgICBzZWQgLWkgJycgIiRwYXR0ZXJuIiAiJGZpbGUiCiAgICBmaQp9CgpvcGVuX3VybCgpIHsKICBsb2NhbCB1cmw9IiQxIgogICMgaWYgTUFJQVNTX0JST1dTRVIgaXMgZW1wdHksIHVzZSB0aGUgZGVmYXVsdCBicm93c2VyCiAgaWYgWyAteiAiJE1BSUFTU19CUk9XU0VSIiBdOyB0aGVuCiAgICBvcGVuICIkdXJsIgogICAgcmV0dXJuCiAgZmkKCiAgIyBTZXQgZGVmYXVsdHMgaWYgdmFyaWFibGVzIGFyZSB1bnNldAogIGxvY2FsIGJyb3dzZXI9IiR7TUFJQVNTX0JST1dTRVI6LUdvb2dsZSBDaHJvbWV9IgogIGxvY2FsIHByb2ZpbGU9IiR7TUFJQVNTX0JST1dTRVJfUFJPRklMRTotRGVmYXVsdH0iCgogICMgTWFwIGtub3duIGJyb3dzZXIgbmFtZXMgdG8gdGhlaXIgYXBwIHBhdGhzIGFuZCBiaW5hcnkgcGF0aHMKICBsb2NhbCBhcHBfcGF0aD0iIgogIGxvY2FsIGJpbmFyeV9wYXRoPSIiCgogIGNhc2UgIiRicm93c2VyIiBpbgogICAgIkJyYXZlIEJyb3dzZXIiIHwgIkJyYXZlIikKICAgICAgYXBwX3BhdGg9Ii9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZS5hcHAiCiAgICAgIGJpbmFyeV9wYXRoPSIkYXBwX3BhdGgvQ29udGVudHMvTWFjT1MvQnJhdmUgQnJvd3NlciIKICAgICAgOzsKICAgICJHb29nbGUgQ2hyb21lIiB8ICJDaHJvbWUiKQogICAgICBhcHBfcGF0aD0iL0FwcGxpY2F0aW9ucy9Hb29nbGUgQ2hyb21lLmFwcCIKICAgICAgYmluYXJ5X3BhdGg9IiRhcHBfcGF0aC9Db250ZW50cy9NYWNPUy9Hb29nbGUgQ2hyb21lIgogICAgICA7OwogICAgIkZpcmVmb3giKQogICAgICBhcHBfcGF0aD0iL0FwcGxpY2F0aW9ucy9GaXJlZm94LmFwcCIKICAgICAgYmluYXJ5X3BhdGg9IiRhcHBfcGF0aC9Db250ZW50cy9NYWNPUy9maXJlZm94IgogICAgICA7OwogICAgIlNjcmliZSIpCiAgICAgIGFwcF9wYXRoPSIvQXBwbGljYXRpb25zL1NjcmliZS5hcHAiCiAgICAgIGJpbmFyeV9wYXRoPSIkYXBwX3BhdGgvQ29udGVudHMvTWFjT1MvU2NyaWJlIgogICAgICA7OwogICAgIlNhZmFyaSIpCiAgICAgIG9wZW4gLWEgIlNhZmFyaSIgIiR1cmwiCiAgICAgIHJldHVybgogICAgICA7OwogICAgKikKICAgICAgZWNobyAiVW5zdXBwb3J0ZWQgYnJvd3NlcjogJGJyb3dzZXIiCiAgICAgIHJldHVybiAxCiAgICAgIDs7CiAgZXNhYwoKICAjIEZvciBicm93c2VycyB0aGF0IHN1cHBvcnQgcHJvZmlsZXMgdmlhIENMSQogIGlmIFtbICIkYnJvd3NlciIgPT0gIkZpcmVmb3giIF1dOyB0aGVuCiAgICAiJGJpbmFyeV9wYXRoIiAtUCAiJHByb2ZpbGUiIC1uby1yZW1vdGUgIiR1cmwiICYKICBlbHNlCiAgICAiJGJpbmFyeV9wYXRoIiAtLXByb2ZpbGUtZGlyZWN0b3J5PSIkcHJvZmlsZSIgIiR1cmwiICYKICBmaQp9CgojIEdlbmVyYXRlIHNpZ24tb2ZmIG1lc3NhZ2Ugd2l0aCBvcHRpb25hbCB0b3AtdXAgVVJMCnByaW50X3NpZ25vZmZfd2l0aF90b3B1cCgpIHsKICBlY2hvICIiCiAgcHJpbnRfaW5mbyAiJHtCR3JlZW594pyFIERvbmUhJHtDb2xvcl9PZmZ9ICR7QXF1YX1Zb3UgYXJlIG9uICR7QldoaXRlfSRicmFuY2hfbmFtZSR7QXF1YX0gYnJhbmNoIiAiYnJpZWYiCiAgIyBSZWFkIHNlc3Npb24gZGF0YSBmcm9tIHRlbXAgZmlsZSBpZiBpdCBleGlzdHMKICBsb2NhbCBjcmVkaXRzX3JlbWFpbmluZyBhaV93YXJuaW5ncwogIGlmIFtbIC1mICIvdG1wL21haWFzc19zZXNzaW9uX2RhdGEudG1wIiBdXTsgdGhlbgogICAgd2hpbGUgSUZTPSc9JyByZWFkIC1yIGtleSB2YWx1ZTsgZG8KICAgICAgY2FzZSAiJGtleSIgaW4KICAgICAgICAiQ1JFRElUU19SRU1BSU5JTkciKSBjcmVkaXRzX3JlbWFpbmluZz0iJHZhbHVlIiA7OwogICAgICBlc2FjCiAgICBkb25lIDwgL3RtcC9tYWlhc3Nfc2Vzc2lvbl9kYXRhLnRtcAogICAgCiAgICAjIFJlYWQgQUkgd2FybmluZ3MgKGhhbmRsZSBtdWx0aWxpbmUpCiAgICBpZiBncmVwIC1xICJBSV9XQVJOSU5HUzw8RU9GIiAvdG1wL21haWFzc19zZXNzaW9uX2RhdGEudG1wOyB0aGVuCiAgICAgIGFpX3dhcm5pbmdzPSQoc2VkIC1uICcvQUlfV0FSTklOR1M8PEVPRi8sL0VPRi9wJyAvdG1wL21haWFzc19zZXNzaW9uX2RhdGEudG1wIHwgc2VkICcxZDskZCcpCiAgICBmaQogIGZpCiAgCiAgIyBEaXNwbGF5IEFJIHdhcm5pbmcgbWVzc2FnZXMgaWYgYW55CiAgaWYgW1sgLW4gIiRhaV93YXJuaW5ncyIgXV07IHRoZW4KICAgIHdoaWxlIElGUz0gcmVhZCAtciB3YXJuaW5nX2xpbmU7IGRvCiAgICAgIGlmIFtbIC1uICIkd2FybmluZ19saW5lIiAmJiAiJHdhcm5pbmdfbGluZSIgIT0gImVtcHR5IiAmJiAiJHdhcm5pbmdfbGluZSIgIT0gIm51bGwiIF1dOyB0aGVuCiAgICAgICAgZWNobyAiICAgJHdhcm5pbmdfbGluZSIKICAgICAgZmkKICAgIGRvbmUgPDw8ICIkYWlfd2FybmluZ3MiCiAgICBlY2hvICIiCiAgZmkKCiAgIyBDaGVjayBmb3IgdmVyc2lvbiB1cGRhdGVzIGFuZCBkaXNwbGF5IGlmIGF2YWlsYWJsZQogIGlmIGNvbW1hbmQgLXYgY2hlY2tfdmVyc2lvbl9mb3Jfc2lnbm9mZiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGNoZWNrX3ZlcnNpb25fZm9yX3NpZ25vZmYKICAgIGxvY2FsIHVwZGF0ZV9zdGF0dXM9JD8KICAgIGlmIFtbICR1cGRhdGVfc3RhdHVzIC1lcSAyIF1dOyB0aGVuCiAgICAgIGVjaG8gIiIKICAgICAgZWNobyAi8J+TpiBVcGRhdGUgQXZhaWxhYmxlISIKICAgICAgZWNobyAiICAgQ3VycmVudDogJHtfTUFJQVNTX1VQREFURV9DVVJSRU5UfSIKICAgICAgZWNobyAiICAgTGF0ZXN0OiAgJHtfTUFJQVNTX1VQREFURV9MQVRFU1R9IgogICAgICBlY2hvICIiCiAgICAgIGVjaG8gIlRvIHVwZGF0ZToiCiAgICAgIGlmIGNvbW1hbmQgLXYgYnJldyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBlY2hvICIgICBicmV3IHVwZGF0ZSAmJiBicmV3IHVwZ3JhZGUgbWFpYXNzIgogICAgICBlbHNlCiAgICAgICAgZWNobyAiICAgY3VybCAtZnNTTCBodHRwczovL21haWFzcy5uZXQvaW5zdGFsbC5zaCB8IGJhc2giCiAgICAgIGZpCiAgICAgIGVjaG8gIiIKICAgIGZpCiAgZmkKCiAgcHJpbnRfZ3JhZGllbnRfbGluZSA0MAogIHByaW50X3RoYW5rcwogIHByaW50X2dyYWRpZW50X2xpbmUgNDAKCiAgIyBDcmVkaXQgYmFsYW5jZSDigJQgc2hvd24gYWZ0ZXIgIlRoYW5rIHlvdSIgc28gaXQncyB0aGUgbGFzdCB0aGluZyB0aGUgdXNlciBzZWVzCiAgaWYgW1sgLW4gIiRjcmVkaXRzX3JlbWFpbmluZyIgXV07IHRoZW4KICAgIHByaW50X2NyZWRpdF9jb2xvciAiJGNyZWRpdHNfcmVtYWluaW5nIiAi8J+SsyBDcmVkaXRzIHJlbWFpbmluZzogJGNyZWRpdHNfcmVtYWluaW5nIgogIGZpCgogICMgVG9wLXVwIGxpbmsKICBpZiBbWyAtbiAiJE1BSUFTU19TVUJTQ1JJUFRJT05fSUQiIF1dOyB0aGVuCiAgICBlY2hvIC1lICIke0JNYWdlbnRhfUNyZWRpdCB0b3AtdXAgbGluazoke0NvbG9yX09mZn0gJHtCQmx1ZX0ke21haWFzc190b3B1cF9lbmRwb2ludH0vJE1BSUFTU19TVUJTQ1JJUFRJT05fSUQke0NvbG9yX09mZn0iCiAgZmkKICAKICAjIERlYnVnOiBDaGVjayB0b3B1cCBVUkwgdmFyaWFibGVzCiAgI3ByaW50X2RlYnVnICJERUJVRyBTSUdOT0ZGOiBtYWlhc3NfdG9wdXBfZW5kcG9pbnQ9JyR7bWFpYXNzX3RvcHVwX2VuZHBvaW50Oi19JyIKICAjcHJpbnRfZGVidWcgIkRFQlVHIFNJR05PRkY6IE1BSUFTU19TVUJTQ1JJUFRJT05fSUQ9JyR7TUFJQVNTX1NVQlNDUklQVElPTl9JRDotfSciCiAgCiAgIyBDbGVhbiB1cCBzZXNzaW9uIGRhdGEgZmlsZQogIGlmIFtbIC1mICIvdG1wL21haWFzc19zZXNzaW9uX2RhdGEudG1wIiBdXTsgdGhlbgogICAgcm0gLWYgL3RtcC9tYWlhc3Nfc2Vzc2lvbl9kYXRhLnRtcAogIGZpCn0KCmdlbmVyYXRlX21hY2hpbmVfZmluZ2VycHJpbnQoKSB7CiAgIyBHZXQgTUFDIGFkZHJlc3MKICBnZXRfbWFjX2FkZHJlc3MoKSB7CiAgICBpZiBjb21tYW5kIC12IGlwICY+L2Rldi9udWxsOyB0aGVuCiAgICAgIGlwIGxpbmsgfCBhd2sgJy9ldGhlci8ge3ByaW50ICQyOyBleGl0fScKICAgIGVsc2UKICAgICAgIyBtYWNPUyBmYWxsYmFjawogICAgICBuZXR3b3Jrc2V0dXAgLWxpc3RhbGxoYXJkd2FyZXBvcnRzIHwgXAogICAgICAgIGF3ayAnL0RldmljZXxFdGhlcm5ldCBBZGRyZXNzLyB7CiAgICAgICAgICBpZiAoJDEgPT0gIkRldmljZToiKSBkZXY9JDI7CiAgICAgICAgICBlbHNlIGlmICgkMSA9PSAiRXRoZXJuZXQiKSB7CiAgICAgICAgICAgIHByaW50ICQzOwogICAgICAgICAgICBleGl0CiAgICAgICAgICB9CiAgICAgICAgfScKICAgIGZpCiAgfQoKICAjIEdldCBDUFUgaW5mbwogIGdldF9jcHVfaW5mbygpIHsKICAgIGlmIFtbICIkT1NUWVBFIiA9PSAiZGFyd2luIiogXV07IHRoZW4KICAgICAgc3lzY3RsIC1uIG1hY2hkZXAuY3B1LmJyYW5kX3N0cmluZwogICAgZWxzZQogICAgICBncmVwIC1tMSAnbW9kZWwgbmFtZScgL3Byb2MvY3B1aW5mbyB8IGN1dCAtZCAnOicgLWYgMiB8IHhhcmdzCiAgICBmaQogIH0KCiAgIyBHZXQgZGlzayBJRCBvciB2b2x1bWUgVVVJRAogIGdldF9kaXNrX2lkZW50aWZpZXIoKSB7CiAgICBpZiBbWyAiJE9TVFlQRSIgPT0gImRhcndpbiIqIF1dOyB0aGVuCiAgICAgIGRpc2t1dGlsIGluZm8gLyB8IGF3ayAtRic6ICcgJy9Wb2x1bWUgVVVJRC8ge3ByaW50ICQyOyBleGl0fScKICAgIGVsc2UKICAgICAgcm9vdF9kaXNrPSQoZGYgLyB8IHRhaWwgLTEgfCBhd2sgJ3twcmludCAkMX0nIHwgc2VkICdzL1swLTldKiQvLycpCiAgICAgIGxzYmxrIC1ubyBTRVJJQUwgIiRyb290X2Rpc2siIDI+L2Rldi9udWxsIHx8IGVjaG8gInVua25vd24tc2VyaWFsIgogICAgZmkKICB9CgogICMgS2VybmVsIGluZm8KICBnZXRfa2VybmVsX2luZm8oKSB7CiAgICB1bmFtZSAtc3JtCiAgfQoKICAjIEhhc2hpbmcgaGVscGVyCiAgaGFzaF9maW5nZXJwcmludCgpIHsKICAgIGlmIGNvbW1hbmQgLXYgc2hhMjU2c3VtICY+L2Rldi9udWxsOyB0aGVuCiAgICAgIHNoYTI1NnN1bQogICAgZWxzZQogICAgICBzaGFzdW0gLWEgMjU2CiAgICBmaQogIH0KCiAgIyBNYWluIGZpbmdlcnByaW50IGdlbmVyYXRpb24KICBtYWM9JChnZXRfbWFjX2FkZHJlc3MpCiAgY3B1PSQoZ2V0X2NwdV9pbmZvKQogIGRpc2s9JChnZXRfZGlza19pZGVudGlmaWVyKQogIGtlcm5lbD0kKGdldF9rZXJuZWxfaW5mbykKCiAgZmluZ2VycHJpbnRfaW5wdXQ9IiR7bWFjfXwke2NwdX18JHtkaXNrfXwke2tlcm5lbH0iCiAgZWNobyAiJGZpbmdlcnByaW50X2lucHV0IiB8IGhhc2hfZmluZ2VycHJpbnQgfCBhd2sgJ3twcmludCAkMX0nCn0KCmZpICMgX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfdXRpbHNfaGVscGVyc19zaAojIC0tLSBFbmQgaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvdXRpbHMvaGVscGVycy5zaCAtLS0KCiMgLS0tIEJlZ2luIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL2NvcmUvZ2l0LnNoIC0tLQppZiBbWyAteiAiJHtfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX2dpdF9zaDotfSIgXV07IHRoZW4gX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV9naXRfc2g9MQoKIyBFcnJvciBoYW5kbGluZyBmb3IgZ2l0IG9wZXJhdGlvbnMKZnVuY3Rpb24gY2hlY2tfZ2l0X3N1Y2Nlc3MoKSB7CiAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KICAgICAgICBwcmludF9lcnJvciAiR2l0IG9wZXJhdGlvbiBmYWlsZWQiCiAgICAgICAgcHJpbnRfZXJyb3IgIlBsZWFzZSBjb21wbGV0ZSB0aGlzIHByb2Nlc3MgbWFudWFsbHkiCiAgICAgICAgaWYgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgICBwcmludF9pbmZvICJZb3UgYXJlIGN1cnJlbnRseSBvbiBicmFuY2g6ICQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCkiCiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludF9pbmZvICJZb3UgYXJlIGN1cnJlbnRseSBvbiBicmFuY2g6ICQoZ2l0IHN5bWJvbGljLXJlZiAtLXNob3J0IEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biIpIgogICAgICAgIGZpCiAgICAgICAgZXhpdCAxCiAgICBmaQp9CgojIEV4ZWN1dGUgZ2l0IGNvbW1hbmQgd2l0aCB2ZXJib3NpdHktY29udHJvbGxlZCBvdXRwdXQKIyBVc2FnZTogcnVuX2dpdF9jb21tYW5kICJnaXQgY29tbWFuZCIgW3Nob3dfb3V0cHV0X2xldmVsXQojIHNob3dfb3V0cHV0X2xldmVsOiBicmllZiwgbm9ybWFsLCBkZWJ1ZyAoZGVmYXVsdDogbm9ybWFsKQpydW5fZ2l0X2NvbW1hbmQoKSB7CiAgICBsb2NhbCBnaXRfY21kPSIkMSIKICAgIGxvY2FsIHNob3dfbGV2ZWw9IiR7Mjotbm9ybWFsfSIKCiAgICAjIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0cmVhdCBkZWJ1Z19tb2RlPXRydWUgYXMgdmVyYm9zaXR5X2xldmVsPWRlYnVnCiAgICBpZiBbWyAiJGRlYnVnX21vZGUiID09ICJ0cnVlIiAmJiAiJHZlcmJvc2l0eV9sZXZlbCIgIT0gImRlYnVnIiBdXTsgdGhlbgogICAgICAgICMgT25seSBsb2cgdGhpcyB3aGVuIG5vdCBhbHJlYWR5IGluIGRlYnVnIHZlcmJvc2l0eSB0byBhdm9pZCBub2lzZQogICAgICAgIGxvZ19tZXNzYWdlICJERVBSRUNBVEVEOiBVc2luZyBkZWJ1Z19tb2RlPXRydWUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBNQUlBU1NfVkVSQk9TSVRZPWRlYnVnIGluc3RlYWQuIgogICAgICAgICMgVHJlYXQgYXMgaWYgdmVyYm9zaXR5X2xldmVsIGlzIGRlYnVnCiAgICAgICAgbG9jYWwgZWZmZWN0aXZlX3ZlcmJvc2l0eT0iZGVidWciCiAgICBlbHNlCiAgICAgICAgbG9jYWwgZWZmZWN0aXZlX3ZlcmJvc2l0eT0iJHZlcmJvc2l0eV9sZXZlbCIKICAgIGZpCgogICAgIyBJZiBoaWRlZ2l0IGlzIGVuYWJsZWQsIGNhcHR1cmUgb3V0cHV0IGZvciBsb2dnaW5nIGJ1dCBkb24ndCBzaG93IHRvIHVzZXIKICAgIGlmIFtbICIkaGlkZWdpdCIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAgICAgbG9jYWwgdGVtcF9vdXRwdXQKICAgICAgICB0ZW1wX291dHB1dD0kKGV2YWwgIiRnaXRfY21kIiAyPiYxKQogICAgICAgIGxvY2FsIGV4aXRfY29kZT0kPwogICAgICAgIAogICAgICAgICMgTG9nIHRoZSBvdXRwdXQgaWYgbG9nZ2luZyBpcyBlbmFibGVkCiAgICAgICAgaWYgW1sgIiRlbmFibGVfbG9nZ2luZyIgPT0gInRydWUiICYmIC1uICIkdGVtcF9vdXRwdXQiIF1dOyB0aGVuCiAgICAgICAgICAgIGxvZ19tZXNzYWdlICJHSVQgT1VUUFVUOiAkZ2l0X2NtZCIKICAgICAgICAgICAgbG9nX21lc3NhZ2UgIiR0ZW1wX291dHB1dCIKICAgICAgICBmaQogICAgICAgIAogICAgICAgIHJldHVybiAkZXhpdF9jb2RlCiAgICBmaQoKICAgICMgQ29udHJvbCBvdXRwdXQgYmFzZWQgb24gdmVyYm9zaXR5IGxldmVsIChvcmlnaW5hbCBiZWhhdmlvciB3aGVuIGhpZGVnaXQ9ZmFsc2UpCiAgICBjYXNlICIkZWZmZWN0aXZlX3ZlcmJvc2l0eSIgaW4KICAgICAgICAiYnJpZWYiKQogICAgICAgICAgICBpZiBbWyAiJHNob3dfbGV2ZWwiID09ICJicmllZiIgXV07IHRoZW4KICAgICAgICAgICAgICAgIGV2YWwgIiRnaXRfY21kIgogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBldmFsICIkZ2l0X2NtZCIgPi9kZXYvbnVsbCAyPiYxCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIDs7CiAgICAgICAgIm5vcm1hbCIpCiAgICAgICAgICAgIGlmIFtbICIkc2hvd19sZXZlbCIgPT0gImRlYnVnIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgZXZhbCAiJGdpdF9jbWQiID4vZGV2L251bGwgMj4mMQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBldmFsICIkZ2l0X2NtZCIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgOzsKICAgICAgICAiZGVidWciKQogICAgICAgICAgICBldmFsICIkZ2l0X2NtZCIKICAgICAgICAgICAgOzsKICAgIGVzYWMKCiAgICByZXR1cm4gJD8KfQoKIyBDaGVjayBhbmQgaGFuZGxlIC5naXRpZ25vcmUgZm9yIGxvZyBmaWxlcwpjaGVja19naXRpZ25vcmVfZm9yX2xvZ3MoKSB7CiAgICBpZiBbWyAiJGVuYWJsZV9sb2dnaW5nIiAhPSAidHJ1ZSIgXV07IHRoZW4KICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICAjIE9ubHkgaGFuZGxlIC5naXRpZ25vcmUgaWYgd2UncmUgaW4gYSBnaXQgcmVwb3NpdG9yeQogICAgaWYgISBnaXQgcmV2LXBhcnNlIC0tZ2l0LWRpciA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICBsb2NhbCBnaXRpZ25vcmVfZmlsZT0iLmdpdGlnbm9yZSIKICAgIGxvY2FsIGxvZ19wYXR0ZXJuX2ZvdW5kPWZhbHNlCgogICAgIyBDaGVjayBpZiAuZ2l0aWdub3JlIGV4aXN0cyBhbmQgY29udGFpbnMgbG9nIGZpbGUgcGF0dGVybnMKICAgIGlmIFtbIC1mICIkZ2l0aWdub3JlX2ZpbGUiIF1dOyB0aGVuCiAgICAgICAgIyBDaGVjayBmb3Igc3BlY2lmaWMgbG9nIGZpbGUgb3IgKi5sb2cgcGF0dGVybgogICAgICAgIGlmIGdyZXAgLXEgIl4ke2xvZ19maWxlfSQiICIkZ2l0aWdub3JlX2ZpbGUiIDI+L2Rldi9udWxsIHx8IFwKICAgICAgICAgICBncmVwIC1xICJeXCoubG9nJCIgIiRnaXRpZ25vcmVfZmlsZSIgMj4vZGV2L251bGwgfHwgXAogICAgICAgICAgIGdyZXAgLXEgIl5cKlwubG9nJCIgIiRnaXRpZ25vcmVfZmlsZSIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgbG9nX3BhdHRlcm5fZm91bmQ9dHJ1ZQogICAgICAgIGZpCiAgICBmaQoKICAgICMgSWYgbG9nIGZpbGUgaXMgbm90IGlnbm9yZWQsIHdhcm4gdXNlciBhbmQgb2ZmZXIgdG8gYWRkIGl0CiAgICBpZiBbWyAiJGxvZ19wYXR0ZXJuX2ZvdW5kIiA9PSAiZmFsc2UiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfd2FybmluZyAiTG9nIGZpbGUgJyRsb2dfZmlsZScgaXMgbm90IGluIC5naXRpZ25vcmUiCiAgICAgICAgZWNobyAtbiAiQWRkICckbG9nX2ZpbGUnIHRvIC5naXRpZ25vcmUgdG8gYXZvaWQgY29tbWl0dGluZyBsb2cgZmlsZXM/IFtZL25dOiAiCiAgICAgICAgcmVhZCAtciBhZGRfdG9fZ2l0aWdub3JlCgogICAgICAgIGlmIFtbICIkYWRkX3RvX2dpdGlnbm9yZSIgPX4gXltObl0kIF1dOyB0aGVuCiAgICAgICAgICAgIHByaW50X2luZm8gIkNvbnRpbnVpbmcgd2l0aG91dCBhZGRpbmcgdG8gLmdpdGlnbm9yZSIgImJyaWVmIgogICAgICAgIGVsc2UKICAgICAgICAgICAgIyBBZGQgbG9nIGZpbGUgdG8gLmdpdGlnbm9yZQogICAgICAgICAgICBpZiBbWyAhIC1mICIkZ2l0aWdub3JlX2ZpbGUiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvICIjIExvZyBmaWxlcyIgPiAiJGdpdGlnbm9yZV9maWxlIgogICAgICAgICAgICAgICAgZWNobyAiJGxvZ19maWxlIiA+PiAiJGdpdGlnbm9yZV9maWxlIgogICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAiQ3JlYXRlZCAuZ2l0aWdub3JlIGFuZCBhZGRlZCAnJGxvZ19maWxlJyIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZWNobyAiIiA+PiAiJGdpdGlnbm9yZV9maWxlIgogICAgICAgICAgICAgICAgZWNobyAiIyBNQUlBU1MgbG9nIGZpbGUiID4+ICIkZ2l0aWdub3JlX2ZpbGUiCiAgICAgICAgICAgICAgICBlY2hvICIkbG9nX2ZpbGUiID4+ICIkZ2l0aWdub3JlX2ZpbGUiCiAgICAgICAgICAgICAgICBwcmludF9zdWNjZXNzICJBZGRlZCAnJGxvZ19maWxlJyB0byAuZ2l0aWdub3JlIgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICBmaQp9CgojIENoZWNrIGFuZCBoYW5kbGUgLmdpdGlnbm9yZSBmb3IgZW52aXJvbm1lbnQgZmlsZXMKY2hlY2tfZ2l0aWdub3JlX2Zvcl9lbnYoKSB7CiAgICAjIE9ubHkgaGFuZGxlIC5naXRpZ25vcmUgaWYgd2UncmUgaW4gYSBnaXQgcmVwb3NpdG9yeQogICAgaWYgISBnaXQgcmV2LXBhcnNlIC0tZ2l0LWRpciA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICBsb2NhbCBnaXRpZ25vcmVfZmlsZT0iLmdpdGlnbm9yZSIKICAgIGxvY2FsIGVudl9wYXR0ZXJuX2ZvdW5kPWZhbHNlCiAgICBsb2NhbCBsb2NhbF9lbnZfZm91bmQ9ZmFsc2UKICAgIGxvY2FsIGJha19lbnZfZm91bmQ9ZmFsc2UKCiAgICAjIENoZWNrIGlmIC5naXRpZ25vcmUgZXhpc3RzIGFuZCBjb250YWlucyBlbnYgZmlsZSBwYXR0ZXJucwogICAgaWYgW1sgLWYgIiRnaXRpZ25vcmVfZmlsZSIgXV07IHRoZW4KICAgICAgICAjIENoZWNrIGZvciAuZW52Lm1haWFzcywgLmVudi5tYWlhc3MqLCAuZW52Kiwgb3IgLmVudi4qIHBhdHRlcm5zCiAgICAgICAgaWYgZ3JlcCAtcSAiXlwuZW52XC5tYWlhc3MkIiAiJGdpdGlnbm9yZV9maWxlIiAyPi9kZXYvbnVsbCB8fCBcCiAgICAgICAgICAgZ3JlcCAtcSAiXlwuZW52XC5tYWlhc3NcKiQiICIkZ2l0aWdub3JlX2ZpbGUiIDI+L2Rldi9udWxsIHx8IFwKICAgICAgICAgICBncmVwIC1xICJeXC5lbnZcKiQiICIkZ2l0aWdub3JlX2ZpbGUiIDI+L2Rldi9udWxsIHx8IFwKICAgICAgICAgICBncmVwIC1xICJeXC5lbnZcLlwqJCIgIiRnaXRpZ25vcmVfZmlsZSIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgZW52X3BhdHRlcm5fZm91bmQ9dHJ1ZQogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgIyBDaGVjayBzcGVjaWZpY2FsbHkgZm9yIC5lbnYubWFpYXNzLmxvY2FsCiAgICAgICAgaWYgZ3JlcCAtcSAiXlwuZW52XC5tYWlhc3NcLmxvY2FsJCIgIiRnaXRpZ25vcmVfZmlsZSIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgbG9jYWxfZW52X2ZvdW5kPXRydWUKICAgICAgICBmaQogICAgICAgIAogICAgICAgICMgQ2hlY2sgc3BlY2lmaWNhbGx5IGZvciAuZW52Lm1haWFzcy5iYWsKICAgICAgICBpZiBncmVwIC1xICJeXC5lbnZcLm1haWFzc1wuYmFrJCIgIiRnaXRpZ25vcmVfZmlsZSIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgYmFrX2Vudl9mb3VuZD10cnVlCiAgICAgICAgZmkKICAgIGZpCgogICAgIyBBbHdheXMgZW5zdXJlIC5lbnYubWFpYXNzLmxvY2FsIGFuZCAuZW52Lm1haWFzcy5iYWsgYXJlIGluIC5naXRpZ25vcmUKICAgIGxvY2FsIG5lZWRzX3VwZGF0ZT1mYWxzZQogICAgaWYgW1sgIiRsb2NhbF9lbnZfZm91bmQiID09ICJmYWxzZSIgXV0gfHwgW1sgIiRiYWtfZW52X2ZvdW5kIiA9PSAiZmFsc2UiIF1dOyB0aGVuCiAgICAgICAgbmVlZHNfdXBkYXRlPXRydWUKICAgIGZpCiAgICAKICAgIGlmIFtbICIkbmVlZHNfdXBkYXRlIiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgICAgICBpZiBbWyAhIC1mICIkZ2l0aWdub3JlX2ZpbGUiIF1dOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiMgTUFJQVNTIGVudmlyb25tZW50IGZpbGVzIiA+ICIkZ2l0aWdub3JlX2ZpbGUiCiAgICAgICAgICAgIGVjaG8gIi5lbnYubWFpYXNzLmxvY2FsIiA+PiAiJGdpdGlnbm9yZV9maWxlIgogICAgICAgICAgICBlY2hvICIuZW52Lm1haWFzcy5iYWsiID4+ICIkZ2l0aWdub3JlX2ZpbGUiCiAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIkNyZWF0ZWQgLmdpdGlnbm9yZSBhbmQgYWRkZWQgJy5lbnYubWFpYXNzLmxvY2FsJyBhbmQgJy5lbnYubWFpYXNzLmJhayciCiAgICAgICAgZWxzZQogICAgICAgICAgICAjIEVuc3VyZSB0aGVyZSdzIGEgbmV3bGluZSBiZWZvcmUgYXBwZW5kaW5nIChiYXNoIDMuMiBjb21wYXRpYmxlKQogICAgICAgICAgICBpZiBbWyAtcyAiJGdpdGlnbm9yZV9maWxlIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgIyBDaGVjayBpZiBmaWxlIGVuZHMgd2l0aCBuZXdsaW5lIHVzaW5nIFBPU0lYLWNvbXBhdGlibGUgbWV0aG9kCiAgICAgICAgICAgICAgICBpZiBbICIkKHRhaWwgLWMxICIkZ2l0aWdub3JlX2ZpbGUiIDI+L2Rldi9udWxsIHwgd2MgLWwpIiAtZXEgMCBdOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgZWNobyAiIiA+PiAiJGdpdGlnbm9yZV9maWxlIgogICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgZmkKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIFtbICIkbG9jYWxfZW52X2ZvdW5kIiA9PSAiZmFsc2UiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvICIuZW52Lm1haWFzcy5sb2NhbCIgPj4gIiRnaXRpZ25vcmVfZmlsZSIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgaWYgW1sgIiRiYWtfZW52X2ZvdW5kIiA9PSAiZmFsc2UiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvICIuZW52Lm1haWFzcy5iYWsiID4+ICIkZ2l0aWdub3JlX2ZpbGUiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBbWyAiJGxvY2FsX2Vudl9mb3VuZCIgPT0gImZhbHNlIiBdXSAmJiBbWyAiJGJha19lbnZfZm91bmQiID09ICJmYWxzZSIgXV07IHRoZW4KICAgICAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIkFkZGVkICcuZW52Lm1haWFzcy5sb2NhbCcgYW5kICcuZW52Lm1haWFzcy5iYWsnIHRvIC5naXRpZ25vcmUiCiAgICAgICAgICAgIGVsaWYgW1sgIiRsb2NhbF9lbnZfZm91bmQiID09ICJmYWxzZSIgXV07IHRoZW4KICAgICAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIkFkZGVkICcuZW52Lm1haWFzcy5sb2NhbCcgdG8gLmdpdGlnbm9yZSIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAiQWRkZWQgJy5lbnYubWFpYXNzLmJhaycgdG8gLmdpdGlnbm9yZSIKICAgICAgICAgICAgZmkKICAgICAgICBmaQogICAgZmkKCiAgICAjIElmIC5lbnYubWFpYXNzIGlzIG5vdCBpZ25vcmVkLCB3YXJuIHVzZXIgYW5kIG9mZmVyIHRvIGFkZCBpdAogICAgIyBTa2lwIGlmIHVzZXIgaGFzIHByZXZpb3VzbHkgZGVjbGluZWQgKE1BSUFTU19HSVRLRUVQPXRydWUpCiAgICBpZiBbWyAiJGVudl9wYXR0ZXJuX2ZvdW5kIiA9PSAiZmFsc2UiICYmIC1mICIuZW52Lm1haWFzcyIgJiYgIiR7TUFJQVNTX0dJVEtFRVA6LWZhbHNlfSIgIT0gInRydWUiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfd2FybmluZyAiRW52aXJvbm1lbnQgZmlsZSAnLmVudi5tYWlhc3MnIGlzIG5vdCBpbiAuZ2l0aWdub3JlIgogICAgICAgIHByaW50X2luZm8gIlJFQ09NTUVOREVEOiBLZWVwIC5lbnYubWFpYXNzIHRyYWNrZWQgKGZvciB0ZWFtL3JlcG8gY29uZmlnKS4iICJicmllZiIKICAgICAgICBwcmludF9pbmZvICJQZXJzb25hbCBzZXR0aW5ncyBnbyBpbiAuZW52Lm1haWFzcy5sb2NhbCAoYWxyZWFkeSBnaXRpZ25vcmVkKS4iICJicmllZiIKICAgICAgICBlY2hvIC1uICJBZGQgJy5lbnYubWFpYXNzJyB0byAuZ2l0aWdub3JlIGFueXdheT8gW3kvTl06ICIKICAgICAgICByZWFkIC1yIGFkZF90b19naXRpZ25vcmUKCiAgICAgICAgaWYgW1sgIiRhZGRfdG9fZ2l0aWdub3JlIiA9fiBeW05uXSQgXV0gfHwgW1sgLXogIiRhZGRfdG9fZ2l0aWdub3JlIiBdXTsgdGhlbgogICAgICAgICAgICBwcmludF9pbmZvICJDb250aW51aW5nIHdpdGhvdXQgYWRkaW5nIHRvIC5naXRpZ25vcmUiICJicmllZiIKICAgICAgICAgICAgIyBBZGQgTUFJQVNTX0dJVEtFRVA9dHJ1ZSB0byAuZW52Lm1haWFzcyB0byBwcmV2ZW50IGZ1dHVyZSBwcm9tcHRzCiAgICAgICAgICAgIGlmICEgZ3JlcCAtcSAiXk1BSUFTU19HSVRLRUVQPSIgIi5lbnYubWFpYXNzIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICAgICAgZWNobyAiIiA+PiAiLmVudi5tYWlhc3MiCiAgICAgICAgICAgICAgICBlY2hvICIjIFByZXZlbnQgcmVwZWF0ZWQgZ2l0aWdub3JlIHByb21wdHMgKHRoaXMgZmlsZSBpcyB0cmFja2VkIGluIGdpdCkiID4+ICIuZW52Lm1haWFzcyIKICAgICAgICAgICAgICAgIGVjaG8gIk1BSUFTU19HSVRLRUVQPXRydWUiID4+ICIuZW52Lm1haWFzcyIKICAgICAgICAgICAgICAgIHByaW50X2luZm8gIkFkZGVkIE1BSUFTU19HSVRLRUVQPXRydWUgdG8gLmVudi5tYWlhc3MgdG8gcHJldmVudCBmdXR1cmUgcHJvbXB0cyIgImJyaWVmIgogICAgICAgICAgICBmaQogICAgICAgIGVsc2UKICAgICAgICAgICAgIyBBZGQgLmVudi5tYWlhc3MgdG8gLmdpdGlnbm9yZQogICAgICAgICAgICBpZiBbWyAhIC1mICIkZ2l0aWdub3JlX2ZpbGUiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvICIjIE1BSUFTUyBlbnZpcm9ubWVudCBmaWxlIiA+ICIkZ2l0aWdub3JlX2ZpbGUiCiAgICAgICAgICAgICAgICBlY2hvICIuZW52Lm1haWFzcyIgPj4gIiRnaXRpZ25vcmVfZmlsZSIKICAgICAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIkNyZWF0ZWQgLmdpdGlnbm9yZSBhbmQgYWRkZWQgJy5lbnYubWFpYXNzJyIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZWNobyAiIiA+PiAiJGdpdGlnbm9yZV9maWxlIgogICAgICAgICAgICAgICAgZWNobyAiIyBNQUlBU1MgZW52aXJvbm1lbnQgZmlsZSIgPj4gIiRnaXRpZ25vcmVfZmlsZSIKICAgICAgICAgICAgICAgIGVjaG8gIi5lbnYubWFpYXNzIiA+PiAiJGdpdGlnbm9yZV9maWxlIgogICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAiQWRkZWQgJy5lbnYubWFpYXNzJyB0byAuZ2l0aWdub3JlIgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICBmaQp9CgojIEdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSBnaXQgdGFncwojIFJldHVybnMgdGhlIGhpZ2hlc3Qgc2VtYW50aWMgdmVyc2lvbiB0YWcsIG9yIGVtcHR5IHN0cmluZyBpZiBubyB0YWdzIGZvdW5kCmdldF9sYXRlc3RfdmVyc2lvbl9mcm9tX3RhZ3MoKSB7CiAgICBsb2NhbCBsYXRlc3RfdGFnCiAgICAjIEdldCBhbGwgdGFncyB0aGF0IG1hdGNoIHNlbWFudGljIHZlcnNpb25pbmcgcGF0dGVybiwgc29ydCB0aGVtLCBhbmQgZ2V0IHRoZSBsYXRlc3QKICAgIGxhdGVzdF90YWc9JChnaXQgdGFnIC1sIHwgZ3JlcCAtRSAnXlswLTldK1wuWzAtOV0rXC5bMC05XSskJyB8IHNvcnQgLVYgfCB0YWlsIC0xKQogICAgZWNobyAiJGxhdGVzdF90YWciCn0KCiMgQ2hlY2sgaWYgYSBnaXQgYnJhbmNoIGV4aXN0cyBsb2NhbGx5CmJyYW5jaF9leGlzdHMoKSB7CiAgICBsb2NhbCBicmFuY2hfbmFtZT0iJDEiCiAgICBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9oZWFkcy8kYnJhbmNoX25hbWUiCn0KCiMgQ2hlY2sgaWYgYSBnaXQgcmVtb3RlIGV4aXN0cwpyZW1vdGVfZXhpc3RzKCkgewogICAgbG9jYWwgcmVtb3RlX25hbWU9IiR7MTotb3JpZ2lufSIKICAgIGdpdCByZW1vdGUgfCBncmVwIC1xICJeJHJlbW90ZV9uYW1lJCIKfQoKIyBDaGVjayBpZiB3ZSBjYW4gcHVzaCB0byBhIHJlbW90ZSAodGVzdHMgY29ubmVjdGl2aXR5KQpjYW5fcHVzaF90b19yZW1vdGUoKSB7CiAgICBsb2NhbCByZW1vdGVfbmFtZT0iJHsxOi1vcmlnaW59IgogICAgaWYgISByZW1vdGVfZXhpc3RzICIkcmVtb3RlX25hbWUiOyB0aGVuCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCiAgICAjIFRlc3QgaWYgd2UgY2FuIHJlYWNoIHRoZSByZW1vdGUgKHRoaXMgaXMgYSBkcnktcnVuKQogICAgZ2l0IGxzLXJlbW90ZSAiJHJlbW90ZV9uYW1lIiA+L2Rldi9udWxsIDI+JjEKfQoKIyBQZXJmb3JtIG1lcmdlIG9wZXJhdGlvbiBiZXR3ZWVuIHR3byBicmFuY2hlcyB3aXRoIHJlbW90ZSBhbmQgUFIgc3VwcG9ydApwZXJmb3JtX21lcmdlX29wZXJhdGlvbigpIHsKICAgIGxvY2FsIHNvdXJjZV9icmFuY2g9IiQxIgogICAgbG9jYWwgdGFyZ2V0X2JyYW5jaD0iJDIiCgogICAgaWYgW1sgLXogIiRzb3VyY2VfYnJhbmNoIiB8fCAteiAiJHRhcmdldF9icmFuY2giIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfZXJyb3IgIlNvdXJjZSBhbmQgdGFyZ2V0IGJyYW5jaGVzIG11c3QgYmUgc3BlY2lmaWVkIgogICAgICAgIHJldHVybiAxCiAgICBmaQoKICAgICMgTm90ZTogVGFncyBhcmUgY3JlYXRlZCBkdXJpbmcgdmVyc2lvbiBidW1wIHdvcmtmbG93LCBub3QgZHVyaW5nIG1lcmdlIG9wZXJhdGlvbnMKCiAgICAjIERldGVybWluZSB3aGljaCBwdWxsIHJlcXVlc3Qgc2V0dGluZyB0byB1c2UgYmFzZWQgb24gdGFyZ2V0IGJyYW5jaAogICAgbG9jYWwgdXNlX3B1bGxyZXF1ZXN0PSJvZmYiCiAgICBpZiBbWyAiJHRhcmdldF9icmFuY2giID09ICIkc3RhZ2luZ2JyYW5jaCIgXV07IHRoZW4KICAgICAgICB1c2VfcHVsbHJlcXVlc3Q9IiRzdGFnaW5nX3B1bGxyZXF1ZXN0cyIKICAgIGVsaWYgW1sgIiR0YXJnZXRfYnJhbmNoIiA9PSAiJG1haW5icmFuY2giIF1dOyB0aGVuCiAgICAgICAgdXNlX3B1bGxyZXF1ZXN0PSIkbWFpbl9wdWxscmVxdWVzdHMiCiAgICBmaQoKICAgICMgSGFuZGxlIHB1bGwgcmVxdWVzdHMgdnMgZGlyZWN0IG1lcmdlCiAgICBpZiBbWyAiJHVzZV9wdWxscmVxdWVzdCIgPT0gIm9uIiBdXSAmJiBjYW5fcHVzaF90b19yZW1vdGUgIm9yaWdpbiI7IHRoZW4KICAgICAgICBwcmludF9pbmZvICJDcmVhdGluZyBwdWxsIHJlcXVlc3QgZm9yIG1lcmdlIgoKICAgICAgICAjIEVuc3VyZSBzb3VyY2UgYnJhbmNoIGlzIHB1c2hlZAogICAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IHB1c2ggLS1zZXQtdXBzdHJlYW0gb3JpZ2luICckc291cmNlX2JyYW5jaCciICJub3JtYWwiIHx8IHJ1bl9naXRfY29tbWFuZCAiZ2l0IHB1c2ggb3JpZ2luICckc291cmNlX2JyYW5jaCciICJub3JtYWwiCiAgICAgICAgY2hlY2tfZ2l0X3N1Y2Nlc3MKCiAgICAgICAgIyBDcmVhdGUgcHVsbCByZXF1ZXN0IFVSTAogICAgICAgIGlmIFtbICIkUkVQT19QUk9WSURFUiIgPT0gImJpdGJ1Y2tldCIgXV07IHRoZW4KICAgICAgICAgICAgb3Blbl91cmwgImh0dHBzOi8vYml0YnVja2V0Lm9yZy8kQklUQlVDS0VUX1dPUktTUEFDRS8kQklUQlVDS0VUX1JFUE9fU0xVRy9wdWxsLXJlcXVlc3RzL25ldz9zb3VyY2U9JHNvdXJjZV9icmFuY2gmZGVzdD0kdGFyZ2V0X2JyYW5jaCZ0aXRsZT1SZWxlYXNlJTIwJHtuZXd2ZXJzaW9uOi1tZXJnZX0iCiAgICAgICAgZWxpZiBbWyAiJFJFUE9fUFJPVklERVIiID09ICJnaXRodWIiIF1dOyB0aGVuCiAgICAgICAgICAgIG9wZW5fdXJsICJodHRwczovL2dpdGh1Yi5jb20vJEdJVEhVQl9PV05FUi8kR0lUSFVCX1JFUE8vY29tcGFyZS8kdGFyZ2V0X2JyYW5jaC4uLiRzb3VyY2VfYnJhbmNoP3F1aWNrX3B1bGw9MSZ0aXRsZT1SZWxlYXNlJTIwJHtuZXd2ZXJzaW9uOi1tZXJnZX0iCiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludF93YXJuaW5nICJVbmtub3duIHJlcG9zaXRvcnkgcHJvdmlkZXIuIENhbm5vdCBjcmVhdGUgcHVsbCByZXF1ZXN0IFVSTC4iCiAgICAgICAgZmkKCiAgICAgICAgbG9ndGhpcyAiQ3JlYXRlZCBwdWxsIHJlcXVlc3QgZm9yICR7bmV3dmVyc2lvbjotbWVyZ2V9IgogICAgZWxzZQogICAgICAgICMgRGlyZWN0IG1lcmdlCiAgICAgICAgcHJpbnRfaW5mbyAiUGVyZm9ybWluZyBkaXJlY3QgbWVyZ2U6ICRzb3VyY2VfYnJhbmNoIOKGkiAkdGFyZ2V0X2JyYW5jaCIKCiAgICAgICAgcnVuX2dpdF9jb21tYW5kICJnaXQgY2hlY2tvdXQgJyR0YXJnZXRfYnJhbmNoJyIgIm5vcm1hbCIKICAgICAgICBjaGVja19naXRfc3VjY2VzcwoKICAgICAgICAjIFB1bGwgbGF0ZXN0IGNoYW5nZXMgaWYgcmVtb3RlIGF2YWlsYWJsZQogICAgICAgIGlmIHJlbW90ZV9leGlzdHMgIm9yaWdpbiI7IHRoZW4KICAgICAgICAgICAgIyBDaGVjayBpZiBjdXJyZW50IGJyYW5jaCBoYXMgdXBzdHJlYW0gdHJhY2tpbmcKICAgICAgICAgICAgaWYgZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgLS1zeW1ib2xpYy1mdWxsLW5hbWUgJ0B7dX0nID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgICAgICAgcnVuX2dpdF9jb21tYW5kICJnaXQgcHVsbCIgIm5vcm1hbCIgfHwgcHJpbnRfd2FybmluZyAiQ291bGQgbm90IHB1bGwgbGF0ZXN0IGNoYW5nZXMgKGNvbnRpbnVpbmcgYW55d2F5KSIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIyBUcnkgdG8gc2V0IHVwIHRyYWNraW5nIGlmIHJlbW90ZSBicmFuY2ggZXhpc3RzCiAgICAgICAgICAgICAgICBpZiBnaXQgbHMtcmVtb3RlIC0taGVhZHMgb3JpZ2luICIkdGFyZ2V0X2JyYW5jaCIgfCBncmVwIC1xICIkdGFyZ2V0X2JyYW5jaCI7IHRoZW4KICAgICAgICAgICAgICAgICAgICBwcmludF9pbmZvICJTZXR0aW5nIHVwIHRyYWNraW5nIGZvciAkdGFyZ2V0X2JyYW5jaCB3aXRoIG9yaWdpbi8kdGFyZ2V0X2JyYW5jaCIKICAgICAgICAgICAgICAgICAgICBydW5fZ2l0X2NvbW1hbmQgImdpdCBicmFuY2ggLS1zZXQtdXBzdHJlYW0tdG89b3JpZ2luLyckdGFyZ2V0X2JyYW5jaCcgJyR0YXJnZXRfYnJhbmNoJyIgIm5vcm1hbCIKICAgICAgICAgICAgICAgICAgICBydW5fZ2l0X2NvbW1hbmQgImdpdCBwdWxsIiAibm9ybWFsIiB8fCBwcmludF93YXJuaW5nICJDb3VsZCBub3QgcHVsbCBsYXRlc3QgY2hhbmdlcyAoY29udGludWluZyBhbnl3YXkpIgogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHByaW50X2luZm8gIlJlbW90ZSBicmFuY2ggb3JpZ2luLyR0YXJnZXRfYnJhbmNoIGRvZXNuJ3QgZXhpc3QgLSBza2lwcGluZyBwdWxsIgogICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgZmkKICAgICAgICBmaQoKICAgICAgICBydW5fZ2l0X2NvbW1hbmQgImdpdCBtZXJnZSAnJHNvdXJjZV9icmFuY2gnIiAiZGVidWciCiAgICAgICAgY2hlY2tfZ2l0X3N1Y2Nlc3MKCiAgICAgICAgIyBQdXNoIHRvIHJlbW90ZSBpZiBhdmFpbGFibGUKICAgICAgICBpZiBjYW5fcHVzaF90b19yZW1vdGUgIm9yaWdpbiI7IHRoZW4KICAgICAgICAgICAgIyBDaGVjayBpZiBjdXJyZW50IGJyYW5jaCBoYXMgdXBzdHJlYW0gdHJhY2tpbmcsIGlmIG5vdCBzZXQgaXQgdXAKICAgICAgICAgICAgaWYgISBnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiAtLXN5bWJvbGljLWZ1bGwtbmFtZSAnQHt1fScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF9pbmZvICJTZXR0aW5nIHVwIHVwc3RyZWFtIHRyYWNraW5nIGZvciAkdGFyZ2V0X2JyYW5jaCIKICAgICAgICAgICAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IHB1c2ggLS1zZXQtdXBzdHJlYW0gb3JpZ2luICckdGFyZ2V0X2JyYW5jaCciICJkZWJ1ZyIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcnVuX2dpdF9jb21tYW5kICJnaXQgcHVzaCIgImRlYnVnIgogICAgICAgICAgICBmaQogICAgICAgICAgICBjaGVja19naXRfc3VjY2VzcwogICAgICAgIGZpCgogICAgICAgIHByaW50X3N1Y2Nlc3MgIk1lcmdlZCAkc291cmNlX2JyYW5jaCBpbnRvICR0YXJnZXRfYnJhbmNoIgogICAgICAgIGxvZ3RoaXMgIk1lcmdlZCAkc291cmNlX2JyYW5jaCBpbnRvICR0YXJnZXRfYnJhbmNoIgogICAgZmkKfQoKZnVuY3Rpb24gZ2V0Qml0YnVja2V0VXJsKCl7CiAgICBwcmludF9zZWN0aW9uICJHZXR0aW5nIEJpdGJ1Y2tldCBVUkwiCiAgICBSRU1PVEVfVVJMPSQoZ2l0IHJlbW90ZSBnZXQtdXJsIG9yaWdpbikKICAgIGlmIFtbICIkUkVNT1RFX1VSTCIgPX4gYml0YnVja2V0Lm9yZ1s6L10oW14vXSspLyhbXi8uXSspIF1dOyB0aGVuCiAgICAgICAgV09SS1NQQUNFPSIke0JBU0hfUkVNQVRDSFsxXX0iCiAgICAgICAgUkVQTz0iJHtCQVNIX1JFTUFUQ0hbMl19IgogICAgZWxzZQogICAgICAgIGVjaG8gIkZhaWxlZCB0byBleHRyYWN0IHdvcmtzcGFjZSBhbmQgcmVwbyBmcm9tIHJlbW90ZSBVUkwiCiAgICAgICAgZXhpdCAxCiAgICBmaQp9CgpmdW5jdGlvbiBicmFuY2hEZXRlY3Rpb24oKSB7CiAgICBwcmludF9kZWJ1ZyAiQnJhbmNoIERldGVjdGlvbiIKICAgIHByaW50X2luZm8gIkN1cnJlbnRseSBvbiBicmFuY2g6ICR7QldoaXRlfSRicmFuY2hfbmFtZSR7Q29sb3JfT2ZmfSIgImJyaWVmIgogICAgCiAgICAjIEluIEFJLW9ubHkgbW9kZSwgc3RpbGwgc2hvdyBicmFuY2ggaW5mbyBhbmQgb2ZmZXIgZGV2ZWxvcCBzd2l0Y2hpbmcgZm9yIGJldHRlciB3b3JrZmxvdwogICAgIyBidXQgc2tpcCB0aGUgY29tcGxleCB2ZXJzaW9uIG1hbmFnZW1lbnQgYnJhbmNoIGxvZ2ljIGxhdGVyCiAgICBpZiBbWyAiJGFpX2NvbW1pdHNfb25seSIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfZGVidWcgIkFJLW9ubHkgbW9kZTogU2ltcGxpZmllZCBicmFuY2ggZGV0ZWN0aW9uIgogICAgICAgICMgU3RpbGwgb2ZmZXIgZGV2ZWxvcCBicmFuY2ggc3dpdGNoaW5nIGlmIG9uIG1haW4vbWFzdGVyIGFuZCBkZXZlbG9wIGV4aXN0cwogICAgICAgIGlmIFtbICIkYnJhbmNoX25hbWUiID09ICIkbWFpbmJyYW5jaCIgfHwgIiRicmFuY2hfbmFtZSIgPT0gIm1hc3RlciIgfHwgIiRicmFuY2hfbmFtZSIgPT0gIm1haW4iIF1dOyB0aGVuCiAgICAgICAgICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL2hlYWRzL2RldmVsb3AiOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF9pbmZvICJZb3UncmUgb24gJGJyYW5jaF9uYW1lIGJyYW5jaCwgYnV0ICdkZXZlbG9wJyBicmFuY2ggZXhpc3RzIgogICAgICAgICAgICAgICAgZWNobyAtbiAtZSAiJHtCWWVsbG93fVN3aXRjaCB0byBkZXZlbG9wIGJyYW5jaCBmb3IgZGV2ZWxvcG1lbnQgd29yaz8gW3kvTl06JHtDb2xvcl9PZmZ9ICIKICAgICAgICAgICAgICAgIHJlYWQgLXIgc3dpdGNoX3RvX2RldgogICAgICAgICAgICAgICAgaWYgW1sgIiRzd2l0Y2hfdG9fZGV2IiA9fiBeW1l5XSQgXV07IHRoZW4KICAgICAgICAgICAgICAgICAgICBpZiBnaXQgY2hlY2tvdXQgZGV2ZWxvcCAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICBicmFuY2hfbmFtZT0iZGV2ZWxvcCIKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAiU3dpdGNoZWQgdG8gZGV2ZWxvcCBicmFuY2giCiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBwcmludF93YXJuaW5nICJDb3VsZCBub3Qgc3dpdGNoIHRvIGRldmVsb3AgYnJhbmNoIgogICAgICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICAgICAgcmV0dXJuIDAKICAgIGZpCiAgICAKICAgICMgaWYgd2UgYXJlIG9uIHRoZSBtYWluIGJyYW5jaCwgYWR2aXNlIHVzZXIgbm90IHRvIHVzZSB0aGlzIHNjcmlwdCBmb3IgaG90IGZpeGVzCiAgICAjIGlmIG9uIG1haW4gb3IgYSByZWxlYXNlIGJyYW5jaCwgYWR2aXNlIHRoZSB1c2VyCiAgICBpZiBbWyAiJGJyYW5jaF9uYW1lIiA9PSAiJG1haW5icmFuY2giIHx8ICIkYnJhbmNoX25hbWUiID09IHJlbGVhc2UvKiB8fCAiJGJyYW5jaF9uYW1lIiA9PSByZWxlYXNlcy8qIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfd2FybmluZyAiWW91IGFyZSBjdXJyZW50bHkgb24gdGhlICRicmFuY2hfbmFtZSBicmFuY2giCiAgICAgICAgcmVhZCAtbiAxIC1zIC1wICIkKGVjaG8gLWUgJHtCWWVsbG93fURvIHlvdSB3YW50IHRvIGNvbnRpbnVlIG9uICRkZXZlbG9wYnJhbmNoPyBbeS9OXSR7Q29sb3JfT2ZmfSApIiBSRVBMWQogICAgICAgIGVjaG8KICAgICAgICBpZiBbWyAhICRSRVBMWSA9fiBeW1l5XSQgXV07IHRoZW4KICAgICAgICAgICAgcHJpbnRfZXJyb3IgIk9wZXJhdGlvbiBjYW5jZWxsZWQgYnkgdXNlciIKICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgZmkKICAgIGZpCiAgICAjIGlmIGJyYW5jaCBzdGFydHMgd2l0aCByZWxlYXNlLyBvciByZWxlYXNlcy8gb2ZmZXIgZG8gc2FtZSBhcyBtYWluYnJhbmNoCgogICAgIyBpZiB3ZSBhcmUgb24gdGhlIG1haW4gb3Igc3RhZ2luZyBicmFuY2gsIHN3aXRjaCB0byBkZXZlbG9wCiAgICBpZiBbICIkYnJhbmNoX25hbWUiID09ICIkbWFpbmJyYW5jaCIgXSB8fCBbICIkYnJhbmNoX25hbWUiID09ICIkc3RhZ2luZ2JyYW5jaCIgXTsgdGhlbgogICAgICAgICMgQ2hlY2sgaWYgZGV2ZWxvcCBicmFuY2ggZXhpc3RzIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHN3aXRjaAogICAgICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL2hlYWRzLyRkZXZlbG9wYnJhbmNoIjsgdGhlbgogICAgICAgICAgICBwcmludF9pbmZvICJTd2l0Y2hpbmcgdG8gJGRldmVsb3BicmFuY2ggYnJhbmNoLi4uIgogICAgICAgICAgICBydW5fZ2l0X2NvbW1hbmQgImdpdCBjaGVja291dCAnJGRldmVsb3BicmFuY2gnIiAibm9ybWFsIgogICAgICAgICAgICBjaGVja19naXRfc3VjY2VzcwogICAgICAgICAgICBicmFuY2hfbmFtZT0iJGRldmVsb3BicmFuY2giCiAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIlN3aXRjaGVkIHRvICRkZXZlbG9wYnJhbmNoIGJyYW5jaCIKICAgICAgICBlbGlmIGdpdCBscy1yZW1vdGUgLS1oZWFkcyBvcmlnaW4gIiRkZXZlbG9wYnJhbmNoIiAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgIiRkZXZlbG9wYnJhbmNoIjsgdGhlbgogICAgICAgICAgICAjIEJyYW5jaCBleGlzdHMgb24gcmVtb3RlIGJ1dCBub3QgbG9jYWxseQogICAgICAgICAgICBwcmludF9pbmZvICJGb3VuZCAnJGRldmVsb3BicmFuY2gnIGJyYW5jaCBvbiByZW1vdGUiCiAgICAgICAgICAgIGVjaG8gLW4gIkNoZWNrIG91dCByZW1vdGUgJyRkZXZlbG9wYnJhbmNoJyBicmFuY2g/IFtZL25dOiAiCiAgICAgICAgICAgIHJlYWQgLXIgY2hlY2tvdXRfcmVtb3RlCiAgICAgICAgICAgIGlmIFtbICEgIiRjaGVja291dF9yZW1vdGUiID1+IF5bTm5dJCBdXTsgdGhlbgogICAgICAgICAgICAgICAgcHJpbnRfaW5mbyAiQ2hlY2tpbmcgb3V0ICRkZXZlbG9wYnJhbmNoIGZyb20gcmVtb3RlLi4uIgogICAgICAgICAgICAgICAgcnVuX2dpdF9jb21tYW5kICJnaXQgY2hlY2tvdXQgLWIgJyRkZXZlbG9wYnJhbmNoJyAnb3JpZ2luLyRkZXZlbG9wYnJhbmNoJyIgIm5vcm1hbCIKICAgICAgICAgICAgICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIGJyYW5jaF9uYW1lPSIkZGV2ZWxvcGJyYW5jaCIKICAgICAgICAgICAgICAgICAgICBwcmludF9zdWNjZXNzICJDaGVja2VkIG91dCAkZGV2ZWxvcGJyYW5jaCBmcm9tIHJlbW90ZSIKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvciAiRmFpbGVkIHRvIGNoZWNrIG91dCByZW1vdGUgYnJhbmNoIgogICAgICAgICAgICAgICAgICAgIHByaW50X2luZm8gIkNvbnRpbnVpbmcgb24gY3VycmVudCBicmFuY2g6ICRicmFuY2hfbmFtZSIKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHByaW50X2luZm8gIkNvbnRpbnVpbmcgb24gY3VycmVudCBicmFuY2g6ICRicmFuY2hfbmFtZSIKICAgICAgICAgICAgZmkKICAgICAgICBlbHNlCiAgICAgICAgICAgICMgTm8gZGV2ZWxvcCBicmFuY2ggZm91bmQgbG9jYWxseSBvciByZW1vdGVseQogICAgICAgICAgICBwcmludF93YXJuaW5nICLimqAgRGV2ZWxvcG1lbnQgYnJhbmNoICckZGV2ZWxvcGJyYW5jaCcgbm90IGZvdW5kIGxvY2FsbHkgb3Igb24gcmVtb3RlIgogICAgICAgICAgICBwcmludF9pbmZvICJcbkZ1bGwgdmVyc2lvbiBtYW5hZ2VtZW50IHJlcXVpcmVzIGEgZGV2ZWxvcG1lbnQgYnJhbmNoIGZvciBHaXQgRmxvdyB3b3JrZmxvdy4iCiAgICAgICAgICAgIGVjaG8gIiIKICAgICAgICAgICAgZWNobyAiV291bGQgeW91IGxpa2UgdG86IgogICAgICAgICAgICBlY2hvICIxKSBDcmVhdGUgJyRkZXZlbG9wYnJhbmNoJyBicmFuY2ggbm93IGFuZCBjb250aW51ZSAocmVjb21tZW5kZWQpIgogICAgICAgICAgICBlY2hvICIyKSBDb250aW51ZSBjb21taXQgKGNvbW1pdC1vbmx5IG1vZGUsIG5vIHZlcnNpb25pbmcpIgogICAgICAgICAgICBlY2hvICIzKSBFeGl0IgogICAgICAgICAgICBlY2hvIC1uICJFbnRlciBjaG9pY2UgWzEtMywgZGVmYXVsdDogMV06ICIKICAgICAgICAgICAgcmVhZCAtciBicmFuY2hfY2hvaWNlCiAgICAgICAgICAgIAogICAgICAgICAgICBjYXNlICIkYnJhbmNoX2Nob2ljZSIgaW4KICAgICAgICAgICAgICAgIDIpCiAgICAgICAgICAgICAgICAgICAgcHJpbnRfaW5mbyAiQ29udGludWluZyBpbiBjb21taXQtb25seSBtb2RlIG9uICRicmFuY2hfbmFtZSIKICAgICAgICAgICAgICAgICAgICBwcmludF9pbmZvICJOb3RlOiBWZXJzaW9uIG1hbmFnZW1lbnQgYW5kIGJyYW5jaCBtZXJnaW5nIHdpbGwgYmUgc2tpcHBlZCIKICAgICAgICAgICAgICAgICAgICAjIFNldCBhIGZsYWcgdG8gaW5kaWNhdGUgY29tbWl0LW9ubHkgbW9kZQogICAgICAgICAgICAgICAgICAgIGV4cG9ydCBNQUlBU1NfQ09NTUlUX09OTFlfTU9ERT0idHJ1ZSIKICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgMykKICAgICAgICAgICAgICAgICAgICBwcmludF9pbmZvICJFeGl0aW5nLiBSdW4gJ21haWFzcyAtLWJvb3RzdHJhcCcgdG8gY29uZmlndXJlIHlvdXIgcHJvamVjdCBwcm9wZXJseSIKICAgICAgICAgICAgICAgICAgICBleGl0IDAKICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgKikKICAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSBkZXZlbG9wIGJyYW5jaCAoZGVmYXVsdCkKICAgICAgICAgICAgICAgICAgICBwcmludF9pbmZvICJDcmVhdGluZyAnJGRldmVsb3BicmFuY2gnIGJyYW5jaC4uLiIKICAgICAgICAgICAgICAgICAgICBydW5fZ2l0X2NvbW1hbmQgImdpdCBjaGVja291dCAtYiAnJGRldmVsb3BicmFuY2gnIiAibm9ybWFsIgogICAgICAgICAgICAgICAgICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICBicmFuY2hfbmFtZT0iJGRldmVsb3BicmFuY2giCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIuKckyBDcmVhdGVkIGFuZCBzd2l0Y2hlZCB0byAnJGRldmVsb3BicmFuY2gnIGJyYW5jaCIKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfaW5mbyAiQ29uc2lkZXIgdXBkYXRpbmcgeW91ciAuZW52Lm1haWFzcyBmaWxlIHRvIHJlZmxlY3QgdGhpcyBjb25maWd1cmF0aW9uIgogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IgIkZhaWxlZCB0byBjcmVhdGUgJyRkZXZlbG9wYnJhbmNoJyBicmFuY2giCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2luZm8gIkZhbGxpbmcgYmFjayB0byBjb21taXQtb25seSBtb2RlIG9uICRicmFuY2hfbmFtZSIKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0IE1BSUFTU19DT01NSVRfT05MWV9NT0RFPSJ0cnVlIgogICAgICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgZXNhYwogICAgICAgIGZpCiAgICBmaQogICMgZ2V0IHRoZSBqaXJhIHRpY2tldCBudW1iZXIgZnJvbSB0aGUgYnJhbmNoCiAgaWYgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgYnJhbmNoX25hbWU9JChnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEKQogIGVsc2UKICAgIGJyYW5jaF9uYW1lPSQoZ2l0IHN5bWJvbGljLXJlZiAtLXNob3J0IEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAibWFpbiIpCiAgZmkKCiAgIyBFeHRyYWN0IHRpY2tldCBmcm9tIGJyYW5jaCBuYW1lIOKAlCBzdXBwb3J0czoKICAjICAgSmlyYTogICAgQUJDLTEyMyAgKGUuZy4gZmVhdHVyZS9BQkMtMTIzLXRoaW5nIG9yIEFCQy0xMjMtdGhpbmcpCiAgIyAgIE51bWVyaWM6ICMxMjMgb3IgMTIzIGZvbGxvd2VkIGJ5IC0gb3IgXyAoZS5nLiBmZWF0dXJlLzEyMy1maXggb3IgIzEyM190aGluZykKICAjICAgICAgICAgICAgUmVxdWlyZXMgZGVsaW1pdGVyIGFmdGVyIG51bWJlciB0byBhdm9pZCBtYXRjaGluZyByZWxlYXNlLzEuMi4zCiAgamlyYV90aWNrZXRfbnVtYmVyPSIiCiAgIyBKaXJhIHBhdHRlcm46IEFCQy0xMjMgYW55d2hlcmUgaW4gYnJhbmNoCiAgaWYgW1sgIiRicmFuY2hfbmFtZSIgPX4gKF58LykoW0EtWl0rLVswLTldKykgXV07IHRoZW4KICAgIGppcmFfdGlja2V0X251bWJlcj0iJHtCQVNIX1JFTUFUQ0hbMl19IgogICMgTnVtZXJpYyBwYXR0ZXJuOiBvcHRpb25hbCAjIHRoZW4gZGlnaXRzIGZvbGxvd2VkIGJ5IC0gb3IgXyAoYWZ0ZXIgc2xhc2ggb3IgYXQgc3RhcnQpCiAgZWxpZiBbWyAiJGJyYW5jaF9uYW1lIiA9fiAoXnwvKSgjP1swLTldKylbLV9dIF1dOyB0aGVuCiAgICBqaXJhX3RpY2tldF9udW1iZXI9IiR7QkFTSF9SRU1BVENIWzJdfSIKICBmaQoKICAjIGdldCB0aGUgcHJvamVjdCBhcyB0aGUgamlyYSB0aWNrZXQgbnVtYmVyIHdpdGhvdXQgdGhlIGRhc2ggYW5kIG51bWJlcgogIHByb2plY3RfbmFtZT0kKGVjaG8gIiRqaXJhX3RpY2tldF9udW1iZXIiIHwgY3V0IC1kJy0nIC1mMSkKICAjIGdldCB0aGUgY2xpZW50IG5hbWUgZnJvbSB0aGUgcmVtb3RlCiAgY2xpZW50X25hbWU9JChnaXQgY29uZmlnIC0tZ2V0IHJlbW90ZS5vcmlnaW4udXJsIHwgZ3JlcCAtb0UgJ1teL10rXC5naXQkJyB8IHNlZCAncy9cLmdpdCQvLycpCiAgZXhwb3J0IGJyYW5jaF9uYW1lIGppcmFfdGlja2V0X251bWJlciBwcm9qZWN0X25hbWUgY2xpZW50X25hbWUKCn0KCmhhc19zdGFnZWRfY2hhbmdlcygpIHsKICBbIC1uICIkKGdpdCBkaWZmIC0tY2FjaGVkKSIgXQp9CgpoYXNfdW5jb21taXR0ZWRfY2hhbmdlcygpIHsKICBbIC1uICIkKGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4pIiBdCn0KCmhhc191bnN0YWdlZF9jaGFuZ2VzKCkgewogIFsgLW4gIiQoZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiB8IGdyZXAgLUUgJ14uW15bOnNwYWNlOl1dJykiIF0KfQoKZnVuY3Rpb24gY2hhbmdlTWFuYWdlbWVudCgpewogIGNoZWNrVW5jb21taXR0ZWRDaGFuZ2VzCn0KCmZ1bmN0aW9uIG1lcmdlRGV2ZWxvcCgpIHsKICBsb2NhbCBoYXNfdmVyc2lvbl9maWxlcz0iJHsxOi10cnVlfSIgICMgRGVmYXVsdCB0byB0cnVlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgc2hpZnQgICMgUmVtb3ZlIHRoZSBmaXJzdCBhcmd1bWVudCBzbyByZW1haW5pbmcgYXJncyBjYW4gYmUgcGFzc2VkIHRvIGdldFZlcnNpb24KCiAgcHJpbnRfZGVidWcgIkdpdCBXb3JrZmxvdyIKCiAgIyBDaGVjayBmb3IgdW5jb21taXR0ZWQgY2hhbmdlcyBmaXJzdAogIGlmIGhhc191bmNvbW1pdHRlZF9jaGFuZ2VzOyB0aGVuCiAgICBwcmludF93YXJuaW5nICJZb3UgaGF2ZSB1bmNvbW1pdHRlZCBjaGFuZ2VzLiIKICAgIHJlYWQgLW4gMSAtcyAtcCAiJChlY2hvIC1lICR7QlllbGxvd31EbyB5b3Ugd2FudCB0byBjb21taXQgdGhlbSBub3c/IFt5L05dJHtDb2xvcl9PZmZ9ICkiIFJFUExZCiAgICBlY2hvCiAgICBpZiBbWyAkUkVQTFkgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgIGhhbmRsZV9zdGFnZWRfY29tbWl0CiAgICAgICMgQ2hlY2sgYWdhaW4gaWYgdGhlcmUgYXJlIHN0aWxsIHVuY29tbWl0dGVkIGNoYW5nZXMKICAgICAgaWYgaGFzX3VuY29tbWl0dGVkX2NoYW5nZXM7IHRoZW4KICAgICAgICBwcmludF9lcnJvciAiU3RpbGwgaGF2ZSB1bmNvbW1pdHRlZCBjaGFuZ2VzLiBQbGVhc2UgY29tbWl0IG9yIHN0YXNoIHRoZW0gZmlyc3QuIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgZWxzZQogICAgICBwcmludF9lcnJvciAiQ2Fubm90IHByb2NlZWQgd2l0aCB1bmNvbW1pdHRlZCBjaGFuZ2VzLiBQbGVhc2UgY29tbWl0IG9yIHN0YXNoIHRoZW0gZmlyc3QuIgogICAgICBleGl0IDEKICAgIGZpCiAgZmkKCiAgIyBHZXQgY3VycmVudCBicmFuY2ggbmFtZQogIGxvY2FsIGN1cnJlbnRfYnJhbmNoCiAgaWYgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY3VycmVudF9icmFuY2g9JChnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEKQogIGVsc2UKICAgIGN1cnJlbnRfYnJhbmNoPSQoZ2l0IHN5bWJvbGljLXJlZiAtLXNob3J0IEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAibWFpbiIpCiAgZmkKCiAgIyBDaGVjayBpZiB3ZSdyZSBhbHJlYWR5IG9uIGRldmVsb3Agb3IgbmVlZCB0byBtZXJnZQogIGlmIFsgIiRjdXJyZW50X2JyYW5jaCIgIT0gIiRkZXZlbG9wYnJhbmNoIiBdOyB0aGVuCiAgICBwcmludF9pbmZvICJOb3Qgb24gJGRldmVsb3BicmFuY2ggYnJhbmNoIChjdXJyZW50bHkgb24gJGN1cnJlbnRfYnJhbmNoKSIKICAgIAogICAgIyBDaGVjayBpZiBhdXRvLW1lcmdlIGlzIGVuYWJsZWQKICAgIGlmIFtbICIkYXV0b19tZXJnZV90b19kZXZlbG9wIiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgICAgcHJpbnRfaW5mbyAiTUFJQVNTX0FVVE9fTUVSR0VfVE9fREVWRUxPUD10cnVlOiBBdXRvbWF0aWNhbGx5IG1lcmdpbmcgJGN1cnJlbnRfYnJhbmNoIGludG8gJGRldmVsb3BicmFuY2giCiAgICAgIFJFUExZPSJ5IgogICAgZWxzZQogICAgICByZWFkIC1uIDEgLXMgLXAgIiQoZWNobyAtZSAke1llbGxvd31EbyB5b3Ugd2FudCB0byBtZXJnZSAke0JHcmVlbn0kY3VycmVudF9icmFuY2gke1llbGxvd30gaW50byAke0JHcmVlbn0kZGV2ZWxvcGJyYW5jaCR7WWVsbG93fT8gW3kvTl0ke0NvbG9yX09mZn0gKSIgUkVQTFkKICAgICAgZWNobwogICAgZmkKICAgIAogICAgaWYgW1sgISAkUkVQTFkgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgIHByaW50X2luZm8gIlVzZXIgY2hvc2Ugbm90IHRvIG1lcmdlIGludG8gJGRldmVsb3BicmFuY2guIFN0YXlpbmcgb24gJGN1cnJlbnRfYnJhbmNoLiIKICAgICAgIyBwcmludF9pbmZvICJBbGwgZG9uZS4gWW91IGFyZSBvbiBicmFuY2g6ICR7QldoaXRlfSRjdXJyZW50X2JyYW5jaCR7Q29sb3JfT2ZmfSIKICAgICAgcHJpbnRfc2lnbm9mZl93aXRoX3RvcHVwCiAgICAgIGV4aXQgMAogICAgZmkKCiAgICAjIENoZWNrb3V0IGRldmVsb3AgYW5kIHVwZGF0ZSBpdAogICAgcnVuX2dpdF9jb21tYW5kICJnaXQgY2hlY2tvdXQgJyRkZXZlbG9wYnJhbmNoJyIgIm5vcm1hbCIKICAgIGNoZWNrX2dpdF9zdWNjZXNzCgogICAgIyBQdWxsIGxhdGVzdCBjaGFuZ2VzCiAgICBpZiByZW1vdGVfZXhpc3RzICJvcmlnaW4iOyB0aGVuCiAgICAgIHByaW50X2luZm8gIlB1bGxpbmcgbGF0ZXN0IGNoYW5nZXMgZnJvbSAkZGV2ZWxvcGJyYW5jaC4uLiIKICAgICAgcnVuX2dpdF9jb21tYW5kICJnaXQgcHVsbCBvcmlnaW4gJyRkZXZlbG9wYnJhbmNoJyIgIm5vcm1hbCIKICAgICAgY2hlY2tfZ2l0X3N1Y2Nlc3MKICAgIGZpCgogICAgIyBNZXJnZSB0aGUgYnJhbmNoCiAgICBydW5fZ2l0X2NvbW1hbmQgImdpdCBtZXJnZSAtLW5vLWZmIC1tICdNZXJnZSAkY3VycmVudF9icmFuY2ggaW50byAkZGV2ZWxvcGJyYW5jaCcgJyRjdXJyZW50X2JyYW5jaCciICJub3JtYWwiCiAgICBjaGVja19naXRfc3VjY2VzcwogICAgbG9ndGhpcyAiTWVyZ2VkICRjdXJyZW50X2JyYW5jaCBpbnRvICRkZXZlbG9wYnJhbmNoIgogIGVsc2UKICAgICMgT24gZGV2ZWxvcCwganVzdCBwdWxsIGxhdGVzdAogICAgaWYgcmVtb3RlX2V4aXN0cyAib3JpZ2luIjsgdGhlbgogICAgICBwcmludF9pbmZvICJQdWxsaW5nIGxhdGVzdCBjaGFuZ2VzIGZyb20gJGRldmVsb3BicmFuY2guLi4iCiAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IHB1bGwgb3JpZ2luICckZGV2ZWxvcGJyYW5jaCciICJub3JtYWwiCiAgICAgIGNoZWNrX2dpdF9zdWNjZXNzCiAgICBmaQogIGZpCgogICMgT25seSBwcm9jZWVkIHdpdGggdmVyc2lvbiBtYW5hZ2VtZW50IGlmIHZlcnNpb24gZmlsZXMgZXhpc3QgYW5kIHdlJ3JlIG9uIGRldmVsb3AKICBsb2NhbCBjdXJyZW50X2JyYW5jaF9jaGVjawogIGlmIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGN1cnJlbnRfYnJhbmNoX2NoZWNrPSQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCkKICBlbHNlCiAgICBjdXJyZW50X2JyYW5jaF9jaGVjaz0kKGdpdCBzeW1ib2xpYy1yZWYgLS1zaG9ydCBIRUFEIDI+L2Rldi9udWxsIHx8IGVjaG8gIm1haW4iKQogIGZpCiAgCiAgaWYgW1sgIiRoYXNfdmVyc2lvbl9maWxlcyIgPT0gInRydWUiICYmICIkY3VycmVudF9icmFuY2hfY2hlY2siID09ICIkZGV2ZWxvcGJyYW5jaCIgXV07IHRoZW4KICAgICMgR2V0IHRoZSB2ZXJzaW9uIGJ1bXAgdHlwZSAobWFqb3IsIG1pbm9yLCBwYXRjaCkKICAgIGxvY2FsIGJ1bXBfdHlwZT0iJHsxOi1wYXRjaH0iICAjIERlZmF1bHQgdG8gcGF0Y2ggaWYgbm90IHNwZWNpZmllZAogICAgc2hpZnQKCiAgICAjIEJ1bXAgdGhlIHZlcnNpb24KICAgIGdldFZlcnNpb24gIiRidW1wX3R5cGUiCgogICAgIyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGNyZWF0ZSBhIHJlbGVhc2UgYnJhbmNoIGFuZCB0YWcKICAgIGxvY2FsIGNyZWF0ZV9yZWxlYXNlPXRydWUKICAgIGlmIFsgIiRidW1wX3R5cGUiID09ICJwYXRjaCIgXTsgdGhlbgogICAgICAjIENoZWNrIE1BSUFTU19QQVRDSF9SRUxFQVNFUyBzZXR0aW5nCiAgICAgIGxvY2FsIHBhdGNoX3JlbGVhc2VzPSIke3BhdGNoX3JlbGVhc2VzOi19IgogICAgICBjYXNlICIkcGF0Y2hfcmVsZWFzZXMiIGluCiAgICAgICAgImFsd2F5cyIpCiAgICAgICAgICBjcmVhdGVfcmVsZWFzZT10cnVlCiAgICAgICAgICBwcmludF9pbmZvICJNQUlBU1NfUEFUQ0hfUkVMRUFTRVM9YWx3YXlzOiBDcmVhdGluZyByZWxlYXNlIGJyYW5jaCBmb3IgcGF0Y2ggdmVyc2lvbiIgIm5vcm1hbCIKICAgICAgICAgIDs7CiAgICAgICAgImFzayIpCiAgICAgICAgICByZWFkIC1uIDEgLXMgLXAgIiQoZWNobyAtZSAke0JZZWxsb3d9VGhpcyBpcyBhIHBhdGNoIHZlcnNpb24uIENyZWF0ZSBhIHJlbGVhc2UgYnJhbmNoIGFuZCB0YWc/IFt5L05dJHtDb2xvcl9PZmZ9ICkiIFJFUExZCiAgICAgICAgICBlY2hvCiAgICAgICAgICBpZiBbWyAkUkVQTFkgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgICAgIGNyZWF0ZV9yZWxlYXNlPXRydWUKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgY3JlYXRlX3JlbGVhc2U9ZmFsc2UKICAgICAgICAgIGZpCiAgICAgICAgICA7OwogICAgICAgICJubyJ8IiJ8KikKICAgICAgICAgIGNyZWF0ZV9yZWxlYXNlPWZhbHNlCiAgICAgICAgICBwcmludF9pbmZvICJNQUlBU1NfUEFUQ0hfUkVMRUFTRVM9JHtwYXRjaF9yZWxlYXNlczotZGVmYXVsdH06IFNraXBwaW5nIHJlbGVhc2UgYnJhbmNoIGZvciBwYXRjaCB2ZXJzaW9uIiAibm9ybWFsIgogICAgICAgICAgOzsKICAgICAgZXNhYwogICAgZmkKCiAgICBpZiBbICIkY3JlYXRlX3JlbGVhc2UiID09IHRydWUgXTsgdGhlbgogICAgICAjIENyZWF0ZSByZWxlYXNlIGJyYW5jaAogICAgICBydW5fZ2l0X2NvbW1hbmQgImdpdCBjaGVja291dCAtYiAncmVsZWFzZS8kbmV3dmVyc2lvbiciICJub3JtYWwiCiAgICAgIGNoZWNrX2dpdF9zdWNjZXNzCgogICAgICAjIFVwZGF0ZSB2ZXJzaW9uIGFuZCBjaGFuZ2Vsb2cKICAgICAgYnVtcFZlcnNpb24KICAgICAgdXBkYXRlQ2hhbmdlbG9nICIkY2hhbmdlbG9nX3BhdGgiICIkbmV3dmVyc2lvbiIKCiAgICAgICMgQ29tbWl0IGNoYW5nZXMKICAgICAgcnVuX2dpdF9jb21tYW5kICJnaXQgYWRkIC1BIiAibm9ybWFsIgogICAgICBydW5fZ2l0X2NvbW1hbmQgImdpdCBjb21taXQgLW0gJ0J1bXBlZCB2ZXJzaW9uIHRvICRuZXd2ZXJzaW9uJyIgIm5vcm1hbCIKICAgICAgY2hlY2tfZ2l0X3N1Y2Nlc3MKCiAgICAgICMgQ3JlYXRlIHRhZwogICAgICBpZiAhIGdpdCB0YWcgLWwgIiRuZXd2ZXJzaW9uIiB8IGdyZXAgLXEgIl4kbmV3dmVyc2lvbiQiOyB0aGVuCiAgICAgICAgcnVuX2dpdF9jb21tYW5kICJnaXQgdGFnIC1hICckbmV3dmVyc2lvbicgLW0gJ1JlbGVhc2UgdmVyc2lvbiAkbmV3dmVyc2lvbiciICJub3JtYWwiCiAgICAgICAgY2hlY2tfZ2l0X3N1Y2Nlc3MKICAgICAgICBwcmludF9zdWNjZXNzICJDcmVhdGVkIHJlbGVhc2UgdGFnICRuZXd2ZXJzaW9uIgogICAgICBlbHNlCiAgICAgICAgcHJpbnRfd2FybmluZyAiVGFnICRuZXd2ZXJzaW9uIGFscmVhZHkgZXhpc3RzIgogICAgICBmaQoKICAgICAgIyBQdXNoIHRoZSByZWxlYXNlIGJyYW5jaCBhbmQgdGFnIGlmIHJlbW90ZSBleGlzdHMKICAgICAgaWYgcmVtb3RlX2V4aXN0cyAib3JpZ2luIjsgdGhlbgogICAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IHB1c2ggLXUgb3JpZ2luICdyZWxlYXNlLyRuZXd2ZXJzaW9uJyIgIm5vcm1hbCIKICAgICAgICBydW5fZ2l0X2NvbW1hbmQgImdpdCBwdXNoIG9yaWdpbiAnJG5ld3ZlcnNpb24nIiAibm9ybWFsIgogICAgICBmaQoKICAgICAgIyBHbyBiYWNrIHRvIGRldmVsb3AKICAgICAgcnVuX2dpdF9jb21tYW5kICJnaXQgY2hlY2tvdXQgJyRkZXZlbG9wYnJhbmNoJyIgIm5vcm1hbCIKICAgICAgY2hlY2tfZ2l0X3N1Y2Nlc3MKCiAgICAgICMgTWVyZ2UgcmVsZWFzZSBicmFuY2ggaW50byBkZXZlbG9wCiAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IG1lcmdlIC0tbm8tZmYgLW0gJ01lcmdlIHJlbGVhc2UvJG5ld3ZlcnNpb24gaW50byAkZGV2ZWxvcGJyYW5jaCcgJ3JlbGVhc2UvJG5ld3ZlcnNpb24nIiAibm9ybWFsIgogICAgICBjaGVja19naXRfc3VjY2VzcwoKICAgICAgcHJpbnRfc3VjY2VzcyAiTWVyZ2VkIHJlbGVhc2UvJG5ld3ZlcnNpb24gaW50byAkZGV2ZWxvcGJyYW5jaCIKICAgICAgIyBQdXNoIGRldmVsb3AKICAgICAgaWYgcmVtb3RlX2V4aXN0cyAib3JpZ2luIjsgdGhlbgogICAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IHB1c2ggb3JpZ2luICckZGV2ZWxvcGJyYW5jaCciICJub3JtYWwiCiAgICAgIGZpCgogICAgICBjaGVja19naXRfc3VjY2VzcwogICAgZWxzZQogICAgICAjIEZvciBwYXRjaCB2ZXJzaW9ucyB3aXRob3V0IHJlbGVhc2UgYnJhbmNoLCB1cGRhdGUgZGlyZWN0bHkgb24gZGV2ZWxvcAogICAgICBwcmludF9pbmZvICJVcGRhdGluZyB2ZXJzaW9uIGFuZCBjaGFuZ2Vsb2cgZGlyZWN0bHkgb24gJGRldmVsb3BicmFuY2guLi4iCiAgICAgIGJ1bXBWZXJzaW9uCiAgICAgIHVwZGF0ZUNoYW5nZWxvZyAiJGNoYW5nZWxvZ19wYXRoIiAiJG5ld3ZlcnNpb24iCgogICAgICAjIENvbW1pdCBjaGFuZ2VzCiAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IGFkZCAtQSIgIm5vcm1hbCIKICAgICAgcnVuX2dpdF9jb21tYW5kICJnaXQgY29tbWl0IC1tICdCdW1wIHZlcnNpb24gdG8gJG5ld3ZlcnNpb24gKG5vIHJlbGVhc2UpJyIgIm5vcm1hbCIKICAgICAgY2hlY2tfZ2l0X3N1Y2Nlc3MKCiAgICAgICMgUHVzaCBjaGFuZ2VzIGlmIHJlbW90ZSBleGlzdHMKICAgICAgaWYgcmVtb3RlX2V4aXN0cyAib3JpZ2luIjsgdGhlbgogICAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IHB1c2ggb3JpZ2luICckZGV2ZWxvcGJyYW5jaCciICJub3JtYWwiCiAgICAgIGZpCgogICAgICBwcmludF9zdWNjZXNzICJWZXJzaW9uIHVwZGF0ZWQgdG8gJG5ld3ZlcnNpb24gb24gJGRldmVsb3BicmFuY2giCiAgICBmaQogIGVsc2UKICAgICMgSnVzdCBkbyB0aGUgZ2l0IHdvcmtmbG93IHdpdGhvdXQgdmVyc2lvbiBtYW5hZ2VtZW50CiAgICBwcmludF9pbmZvICJTa2lwcGluZyB2ZXJzaW9uIGJ1bXAgYW5kIGNoYW5nZWxvZyB1cGRhdGUgKG5vIHZlcnNpb24gZmlsZXMpIgogICAgIyBPbmx5IHNob3cgbWVyZ2Ugc3VjY2VzcyBpZiBkZXZlbG9wIGJyYW5jaCBleGlzdHMKICAgIGlmIGJyYW5jaF9leGlzdHMgIiRkZXZlbG9wYnJhbmNoIjsgdGhlbgogICAgICBwcmludF9zdWNjZXNzICJNZXJnZWQgJGJyYW5jaF9uYW1lIGludG8gJGRldmVsb3BicmFuY2giCiAgICBlbHNlCiAgICAgIHByaW50X2luZm8gIkNvbXBsZXRlZCB3b3JrZmxvdyBvbiBjdXJyZW50IGJyYW5jaCAobm8gZGV2ZWxvcCBicmFuY2gpIgogICAgZmkKICBmaQp9CgojIGZ1bmN0aW9uIHRvIHNob3cgZGVwbG95IG9wdGlvbnMKZnVuY3Rpb24gZGVwbG95T3B0aW9ucygpIHsKICAjIENoZWNrIGlmIGF1dG8tbW9kZSBpcyBlbmFibGVkIC0gaWYgc28sIGF1dG9tYXRpY2FsbHkgZmluaXNoCiAgaWYgW1sgIiR7YXV0b19tb2RlX2VuYWJsZWQ6LWZhbHNlfSIgPT0gInRydWUiIF1dOyB0aGVuCiAgICBwcmludF9pbmZvICJBdXRvLW1vZGUgZW5hYmxlZDogQXV0b21hdGljYWxseSBmaW5pc2hpbmcgd29ya2Zsb3cgKGRvIG5vdGhpbmcpIgogICAgcnVuX2dpdF9jb21tYW5kICJnaXQgY2hlY2tvdXQgJyRicmFuY2hfbmFtZSciICJub3JtYWwiCiAgICBpZiB0eXBlIC10IHByaW50X3NpZ25vZmZfd2l0aF90b3B1cCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcHJpbnRfc2lnbm9mZl93aXRoX3RvcHVwCiAgICBmaQogICAgIyBDbGVhbiB1cAogICAgdW5zZXQgR0lUX01FUkdFX0FVVE9FRElUCiAgICB1bnNldCB0YWdtZXNzYWdlCiAgICByZXR1cm4gMAogIGZpCgogICMgQ2hlY2sgd2hhdCBicmFuY2hlcyBhcmUgYXZhaWxhYmxlIGFuZCBhZGFwdCBvcHRpb25zIGFjY29yZGluZ2x5CiAgbG9jYWwgaGFzX2RldmVsb3AgaGFzX3N0YWdpbmcgaGFzX21haW4gaGFzX3JlbW90ZQogIGhhc19kZXZlbG9wPSQoYnJhbmNoX2V4aXN0cyAiJGRldmVsb3BicmFuY2giICYmIGVjaG8gInRydWUiIHx8IGVjaG8gImZhbHNlIikKICBoYXNfc3RhZ2luZz0kKGJyYW5jaF9leGlzdHMgIiRzdGFnaW5nYnJhbmNoIiAmJiBlY2hvICJ0cnVlIiB8fCBlY2hvICJmYWxzZSIpCiAgaGFzX21haW49JChicmFuY2hfZXhpc3RzICIkbWFpbmJyYW5jaCIgJiYgZWNobyAidHJ1ZSIgfHwgZWNobyAiZmFsc2UiKQogIGhhc19yZW1vdGU9JChyZW1vdGVfZXhpc3RzICJvcmlnaW4iICYmIGVjaG8gInRydWUiIHx8IGVjaG8gImZhbHNlIikKCiAgZWNobyAtZSAiJHtCWWVsbG93fVdoYXQgd291bGQgeW91IGxpa2UgdG8gZG8/JHtTb2Z0UGlua30iCgogICMgQnVpbGQgZHluYW1pYyBtZW51IGJhc2VkIG9uIGF2YWlsYWJsZSBicmFuY2hlcwogIGxvY2FsIG9wdGlvbl9jb3VudD0wCiAgbG9jYWwgb3B0aW9ucz0oKQoKICBpZiBbWyAiJGhhc19kZXZlbG9wIiA9PSAidHJ1ZSIgJiYgIiRoYXNfc3RhZ2luZyIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAoKG9wdGlvbl9jb3VudCsrKSkKICAgIG9wdGlvbnNbIiRvcHRpb25fY291bnQiXT0ibWVyZ2VfZGV2ZWxvcF90b19zdGFnaW5nIgogICAgZWNobyAiJG9wdGlvbl9jb3VudCkgTWVyZ2UgJGRldmVsb3BicmFuY2ggdG8gJHN0YWdpbmdicmFuY2giCiAgZmkKCiAgaWYgW1sgIiRoYXNfc3RhZ2luZyIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAoKG9wdGlvbl9jb3VudCsrKSkKICAgIG9wdGlvbnNbIiRvcHRpb25fY291bnQiXT0ibWVyZ2VfY3VycmVudF90b19zdGFnaW5nIgogICAgZWNobyAiJG9wdGlvbl9jb3VudCkgTWVyZ2UgJGJyYW5jaF9uYW1lIHRvICRzdGFnaW5nYnJhbmNoIgogIGZpCgogICMgT25seSBzaG93IGRpcmVjdCBtZXJnZSB0byBtYWluIGlmIG5vIHN0YWdpbmcgYnJhbmNoIGV4aXN0cyAocHJvcGVyIEdpdCBGbG93KQogIGlmIFtbICIkaGFzX21haW4iID09ICJ0cnVlIiAmJiAiJGhhc19zdGFnaW5nIiA9PSAiZmFsc2UiIF1dOyB0aGVuCiAgICAoKG9wdGlvbl9jb3VudCsrKSkKICAgIG9wdGlvbnNbIiRvcHRpb25fY291bnQiXT0ibWVyZ2VfdG9fbWFpbiIKICAgIGlmIFtbICIkaGFzX2RldmVsb3AiID09ICJ0cnVlIiBdXTsgdGhlbgogICAgICBlY2hvICIkb3B0aW9uX2NvdW50KSBNZXJnZSAkZGV2ZWxvcGJyYW5jaCB0byAkbWFpbmJyYW5jaCIKICAgIGVsc2UKICAgICAgZWNobyAiJG9wdGlvbl9jb3VudCkgTWVyZ2UgJGJyYW5jaF9uYW1lIHRvICRtYWluYnJhbmNoIgogICAgZmkKICBmaQoKICBpZiBbWyAiJGhhc19yZW1vdGUiID09ICJ0cnVlIiBdXTsgdGhlbgogICAgKChvcHRpb25fY291bnQrKykpCiAgICBvcHRpb25zWyIkb3B0aW9uX2NvdW50Il09InB1c2hfY3VycmVudCIKICAgIGVjaG8gIiRvcHRpb25fY291bnQpIFB1c2ggY3VycmVudCBicmFuY2ggdG8gcmVtb3RlIgogIGZpCgogICgob3B0aW9uX2NvdW50KyspKQogIG9wdGlvbnNbIiRvcHRpb25fY291bnQiXT0iZG9fbm90aGluZyIKICBlY2hvICIkb3B0aW9uX2NvdW50KSBEbyBub3RoaW5nIChmaW5pc2ggaGVyZSkiCgogIGlmIFtbICRvcHRpb25fY291bnQgLWVxIDEgXV07IHRoZW4KICAgIHByaW50X3dhcm5pbmcgIkxpbWl0ZWQgb3B0aW9ucyBhdmFpbGFibGUgZHVlIHRvIHJlcG9zaXRvcnkgc3RydWN0dXJlIgogIGZpCgogIHJlYWQgLXAgIiQoZWNobyAtZSAke0JZZWxsb3d9RW50ZXIgY2hvaWNlIFsxLSRvcHRpb25fY291bnQsIEVudGVyIGZvciAkb3B0aW9uX2NvdW50XTogJHtDb2xvcl9PZmZ9KSIgY2hvaWNlCgogICMgRGVmYXVsdCB0byAiZG8gbm90aGluZyIgaWYgdXNlciBqdXN0IGhpdHMgRW50ZXIKICBpZiBbWyAteiAiJGNob2ljZSIgXV07IHRoZW4KICAgIGNob2ljZT0iJG9wdGlvbl9jb3VudCIgICMgImRvIG5vdGhpbmciIGlzIGFsd2F5cyB0aGUgbGFzdCBvcHRpb24KICBmaQoKICAjIEhhbmRsZSB1c2VyIGNob2ljZSBiYXNlZCBvbiBhdmFpbGFibGUgb3B0aW9ucwogIGlmIFtbICIkY2hvaWNlIiA9fiBeWzAtOV0rJCBdXSAmJiBbWyAiJGNob2ljZSIgLWdlIDEgXV0gJiYgW1sgIiRjaG9pY2UiIC1sZSAiJG9wdGlvbl9jb3VudCIgXV07IHRoZW4KICAgIGxvY2FsIHNlbGVjdGVkX2FjdGlvbj0iJHtvcHRpb25zWyRjaG9pY2VdfSIKCiAgICBjYXNlICIkc2VsZWN0ZWRfYWN0aW9uIiBpbgogICAgICAibWVyZ2VfZGV2ZWxvcF90b19zdGFnaW5nIikKICAgICAgICBwcmludF9pbmZvICJNZXJnaW5nICRkZXZlbG9wYnJhbmNoIHRvICRzdGFnaW5nYnJhbmNoIgogICAgICAgIHBlcmZvcm1fbWVyZ2Vfb3BlcmF0aW9uICIkZGV2ZWxvcGJyYW5jaCIgIiRzdGFnaW5nYnJhbmNoIgogICAgICAgIDs7CiAgICAgICJtZXJnZV9jdXJyZW50X3RvX3N0YWdpbmciKQogICAgICAgIHByaW50X2luZm8gIk1lcmdpbmcgJGJyYW5jaF9uYW1lIHRvICRzdGFnaW5nYnJhbmNoIgogICAgICAgIHBlcmZvcm1fbWVyZ2Vfb3BlcmF0aW9uICIkYnJhbmNoX25hbWUiICIkc3RhZ2luZ2JyYW5jaCIKICAgICAgICA7OwogICAgICAibWVyZ2VfdG9fbWFpbiIpCiAgICAgICAgbG9jYWwgc291cmNlX2JyYW5jaAogICAgICAgIGlmIFtbICIkaGFzX2RldmVsb3AiID09ICJ0cnVlIiBdXTsgdGhlbgogICAgICAgICAgc291cmNlX2JyYW5jaD0iJGRldmVsb3BicmFuY2giCiAgICAgICAgZWxzZQogICAgICAgICAgc291cmNlX2JyYW5jaD0iJGJyYW5jaF9uYW1lIgogICAgICAgIGZpCiAgICAgICAgcHJpbnRfaW5mbyAiTWVyZ2luZyAkc291cmNlX2JyYW5jaCB0byAkbWFpbmJyYW5jaCIKICAgICAgICBwZXJmb3JtX21lcmdlX29wZXJhdGlvbiAiJHNvdXJjZV9icmFuY2giICIkbWFpbmJyYW5jaCIKICAgICAgICA7OwogICAgICAicHVzaF9jdXJyZW50IikKICAgICAgICBwcmludF9pbmZvICJQdXNoaW5nIGN1cnJlbnQgYnJhbmNoIHRvIHJlbW90ZSIKICAgICAgICBpZiBjYW5fcHVzaF90b19yZW1vdGUgIm9yaWdpbiI7IHRoZW4KICAgICAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IHB1c2ggLS1zZXQtdXBzdHJlYW0gb3JpZ2luICckYnJhbmNoX25hbWUnIiAibm9ybWFsIiB8fCBydW5fZ2l0X2NvbW1hbmQgImdpdCBwdXNoIG9yaWdpbiAnJGJyYW5jaF9uYW1lJyIgIm5vcm1hbCIKICAgICAgICAgIGNoZWNrX2dpdF9zdWNjZXNzCiAgICAgICAgICBwcmludF9zdWNjZXNzICJQdXNoZWQgJGJyYW5jaF9uYW1lIHRvIHJlbW90ZSIKICAgICAgICBlbHNlCiAgICAgICAgICBwcmludF9lcnJvciAiQ2Fubm90IHB1c2ggdG8gcmVtb3RlIgogICAgICAgIGZpCiAgICAgICAgOzsKICAgICAgImRvX25vdGhpbmciKQogICAgICAgIHByaW50X2luZm8gIk5vIGFjdGlvbiBzZWxlY3RlZCAtIGZpbmlzaGluZyBoZXJlIgogICAgICAgIDs7CiAgICAgICopCiAgICAgICAgcHJpbnRfZXJyb3IgIkludmFsaWQgc2VsZWN0aW9uIgogICAgICAgIDs7CiAgICBlc2FjCiAgZWxzZQogICAgcHJpbnRfZXJyb3IgIkludmFsaWQgY2hvaWNlLiBQbGVhc2Ugc2VsZWN0IGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgJG9wdGlvbl9jb3VudCIKICBmaQoKICBydW5fZ2l0X2NvbW1hbmQgImdpdCBjaGVja291dCAnJGJyYW5jaF9uYW1lJyIgIm5vcm1hbCIKCiAgIyBwcmludF9pbmZvICJBbGwgZG9uZS4gWW91IGFyZSBvbiBicmFuY2g6ICR7QldoaXRlfSRicmFuY2hfbmFtZSR7Q29sb3JfT2ZmfSIKICBpZiB0eXBlIC10IHByaW50X3NpZ25vZmZfd2l0aF90b3B1cCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHByaW50X3NpZ25vZmZfd2l0aF90b3B1cAogIGZpCgogICMgQ2xlYW4gdXAKICB1bnNldCBHSVRfTUVSR0VfQVVUT0VESVQKICB1bnNldCB0YWdtZXNzYWdlCn0KCiMgRnVuY3Rpb24gdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBnaXQgcmVwb3NpdG9yeQpjaGVja19naXRfcmVwb3NpdG9yeSgpIHsKICBpZiAhIGdpdCByZXYtcGFyc2UgLS1naXQtZGlyID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcHJpbnRfZXJyb3IgIlRoaXMgZGlyZWN0b3J5IGlzIG5vdCBhIGdpdCByZXBvc2l0b3J5ISIKICAgIHByaW50X2Vycm9yICJQbGVhc2UgcnVuIHRoaXMgc2NyaXB0IGZyb20gd2l0aGluIGEgZ2l0IHJlcG9zaXRvcnkuIgogICAgZXhpdCAxCiAgZmkKCiAgIyBHZXQgdGhlIHJlcG9zaXRvcnkgcm9vdCBkaXJlY3RvcnkKICBsb2NhbCBnaXRfcm9vdAogIGdpdF9yb290PSQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwgMj4vZGV2L251bGwpCiAgaWYgW1sgLXogIiRnaXRfcm9vdCIgXV07IHRoZW4KICAgIHByaW50X2Vycm9yICJVbmFibGUgdG8gZGV0ZXJtaW5lIGdpdCByZXBvc2l0b3J5IHJvb3QhIgogICAgZXhpdCAxCiAgZmkKCiAgZXhwb3J0IGdpdF9yb290CiAgcHJpbnRfZGVidWcgIkdpdCByZXBvc2l0b3J5IGRldGVjdGVkOiAkZ2l0X3Jvb3QiCgp9CgpmaSAjIF9fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfZ2l0X3NoCiMgLS0tIEVuZCBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi9jb3JlL2dpdC5zaCAtLS0KCiMgLS0tIEJlZ2luIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL2NvcmUvY2hhbmdlbG9nLnNoIC0tLQppZiBbWyAteiAiJHtfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX2NoYW5nZWxvZ19zaDotfSIgXV07IHRoZW4gX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV9jaGFuZ2Vsb2dfc2g9MQoKZnVuY3Rpb24gdXBkYXRlQ2hhbmdlbG9nKCkgewogICAgbG9jYWwgY2hhbmdlbG9ncGF0aD0iJDEiCiAgICBsb2NhbCB2ZXJzaW9uPSIkMiIKICAgIFsgLXogIiRjaGFuZ2Vsb2dwYXRoIiBdICYmIGNoYW5nZWxvZ3BhdGg9Ii4iCiAgICBjaGFuZ2Vsb2dfaW50ZXJuYWxfcGF0aD0iJHtjaGFuZ2Vsb2dfaW50ZXJuYWxfcGF0aDotJGNoYW5nZWxvZ3BhdGh9IgoKICAgICMgRGV0ZXJtaW5lIGNoYW5nZWxvZyByYW5nZSBmcm9tIGxhdGVzdCB2ZXJzaW9uIGVudHJ5IGluIHRoZSBjaGFuZ2Vsb2cKICAgIGlmIFsgLWYgIiRjaGFuZ2Vsb2dwYXRoLyRjaGFuZ2Vsb2dfbmFtZSIgXTsgdGhlbgogICAgICAgIGxhc3RfdmVyc2lvbj0kKGdyZXAgLW0xICdeIyMgJyAiJGNoYW5nZWxvZ3BhdGgvJGNoYW5nZWxvZ19uYW1lIiB8IHNlZCAncy9eIyMgLy8nKQogICAgICAgIGxhc3RfY2hhbmdlbG9nX2NvbW1pdD0kKGdpdCBsb2cgLTEgLS1mb3JtYXQ9IiVIIiAtUyIjIyAkbGFzdF92ZXJzaW9uIiAtLSAiJGNoYW5nZWxvZ3BhdGgvJGNoYW5nZWxvZ19uYW1lIikKICAgIGZpCgogICAgaWYgWyAteiAiJGxhc3RfY2hhbmdlbG9nX2NvbW1pdCIgXTsgdGhlbgogICAgICAgIGlmIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgICAgbGFzdF9jaGFuZ2Vsb2dfY29tbWl0PSQoZ2l0IHJldi1saXN0IC0tbWF4LXBhcmVudHM9MCBIRUFEKQogICAgICAgIGVsc2UKICAgICAgICAgICAgIyBObyBjb21taXRzIHlldCwgc2tpcCBjaGFuZ2Vsb2cgZ2VuZXJhdGlvbgogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGZpCiAgICBmaQoKICAgICMgU2tpcCBjaGFuZ2Vsb2cgaWYgbm8gY29tbWl0cyBleGlzdAogICAgaWYgISBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgcmV0dXJuIDAKICAgIGZpCgogICAgbG9nX3JhbmdlPSIkbGFzdF9jaGFuZ2Vsb2dfY29tbWl0Li5IRUFEIgoKICAgICAgICAjIFJlbW92ZSB0aWNrZXQgcHJlZml4ZXMgZnJvbSBjb21taXQgbWVzc2FnZXMgYmVmb3JlIHByb2Nlc3Npbmcgd2l0aCBhd2suCiAgICAgICAgIyBIYW5kbGVzIEppcmEgKEFCQy0xMjMpLCBoYXNoLW51bWVyaWMgKCMxMjMpLCBhbmQgYmFyZSBudW1lcmljICgxMjMpIGZvcm1hdHMuCiAgICAgICAgY2hhbmdlbG9nPSQoZ2l0IGxvZyAiJGxvZ19yYW5nZSIgLS1wcmV0dHk9Zm9ybWF0OiIlQiIgfAogICAgICAgIGdyZXAgLXZFaSAnXihuY2x8TWVyZ2V8QnVtcHxGaXhpbmcgbWVyZ2UgY29uZmxpY3RzKScgfAogICAgICAgIHNlZCAtRSAncy9eXFs/KFtBLVpdKy1bMC05XSt8Iz9bMC05XSspXF0/W1s6c3BhY2U6XTrigJQtXSsvLycgfAogICAgICAgIGF3ayAnCiAgICAgICAgQkVHSU4geyBjb21taXQgPSAiIiB9CiAgICAgICAgL14kLyB7CiAgICAgICAgICAgIGlmIChjb21taXQgIT0gIiIpIHsKICAgICAgICAgICAgICAgIG4gPSBzcGxpdChjb21taXQsIGxpbmVzLCAiXG4iKQogICAgICAgICAgICAgICAgaWYgKGxpbmVzWzFdICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIi0gIiBsaW5lc1sxXQogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDI7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXSAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlx0IiBsaW5lc1tpXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tbWl0ID0gIiIKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0CiAgICAgICAgfQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGNvbW1pdCA9PSAiIiAmJiAkMCA9PSAiIikgbmV4dAogICAgICAgICAgICBjb21taXQgPSBjb21taXQgKGNvbW1pdCA9PSAiIiA/ICIiIDogIlxuIikgJDAKICAgICAgICB9CiAgICAgICAgRU5EIHsKICAgICAgICAgICAgaWYgKGNvbW1pdCAhPSAiIikgewogICAgICAgICAgICAgICAgbiA9IHNwbGl0KGNvbW1pdCwgbGluZXMsICJcbiIpCiAgICAgICAgICAgICAgICBpZiAobGluZXNbMV0gIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICBwcmludCAiLSAiIGxpbmVzWzFdCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMjsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVzW2ldICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiXHQiIGxpbmVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9JykKICAgICAgICAjIHJlbW92ZSBkb3VibGUgdGFicyBhbmQgZW1wdHkgbGluZXMKICAgICAgICBjaGFuZ2Vsb2c9JChlY2hvICIkY2hhbmdlbG9nIiB8IHNlZCAtZSAncy9cdFx0L1x0L2cnIC1lICcvXltbOnNwYWNlOl1dKiQvZCcpCiAgICAgICAgCiAgICAgICAgIyBSZW1vdmUgSklSQSB0aWNrZXQgbnVtYmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgaWYgc3BlY2lmaWVkCiAgICAgICAgaWYgWyAtbiAiJGppcmFfdGlja2V0X251bWJlciIgXTsgdGhlbgogICAgICAgICAgICBjaGFuZ2Vsb2c9JChlY2hvICIkY2hhbmdlbG9nIiB8IHNlZCAtRSAicy9eJGppcmFfdGlja2V0X251bWJlcltbOnNwYWNlOl1dKi8vZyIpCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICBjaGFuZ2Vsb2dfaW50ZXJuYWw9JChnaXQgbG9nICIkbG9nX3JhbmdlIiAtLXByZXR0eT1mb3JtYXQ6IiVhbiVuJUIiIHwKICAgICAgICBncmVwIC12RWkgJ14obmNsfE1lcmdlfEJ1bXB8Rml4aW5nIG1lcmdlIGNvbmZsaWN0cyknIHwKICAgICAgICBhd2sgJwogICAgICAgIEJFR0lOIHsgY29tbWl0ID0gIiIgfQoKICAgICAgICAjIEJsYW5rIGxpbmUgc2lnbmFscyBlbmQgb2YgYSBjb21taXQKICAgICAgICAvXiQvIHsKICAgICAgICAgICAgcHJvY2Vzc19jb21taXQoKQogICAgICAgICAgICBjb21taXQgPSAiIgogICAgICAgICAgICBuZXh0CiAgICAgICAgfQoKICAgICAgICB7CiAgICAgICAgICAgIGNvbW1pdCA9IGNvbW1pdCAkMCAiXG4iCiAgICAgICAgfQoKICAgICAgICBFTkQgewogICAgICAgICAgICBwcm9jZXNzX2NvbW1pdCgpCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwcm9jZXNzX2NvbW1pdCgpIHsKICAgICAgICAgICAgaWYgKGNvbW1pdCA9PSAiIikgcmV0dXJuCgogICAgICAgICAgICAjIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIG5ld2xpbmVzCiAgICAgICAgICAgIGdzdWIoL15cbit8XG4rJC8sICIiLCBjb21taXQpCgogICAgICAgICAgICAjIFNwbGl0IGludG8gbGluZXMKICAgICAgICAgICAgbiA9IHNwbGl0KGNvbW1pdCwgbGluZXMsICJcbiIpCiAgICAgICAgICAgIGF1dGhvciA9IGxpbmVzWzFdCiAgICAgICAgICAgIHN1YmplY3QgPSAiIgoKICAgICAgICAgICAgIyBGaW5kIHRoZSBmaXJzdCBub24tZW1wdHkgbGluZSBhZnRlciBhdXRob3IKICAgICAgICAgICAgZm9yIChqID0gMjsgaiA8PSBuOyBqKyspIHsKICAgICAgICAgICAgaWYgKGxpbmVzW2pdIH4gL1teWzpzcGFjZTpdXS8pIHsKICAgICAgICAgICAgICAgIHN1YmplY3QgPSBsaW5lc1tqXQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFNraXAgaWYgbm8gbWVhbmluZ2Z1bCBzdWJqZWN0CiAgICAgICAgICAgIGlmIChzdWJqZWN0ID09ICIiKSByZXR1cm4KCiAgICAgICAgICAgIHByaW50ZigiLSAlczogJXNcbiIsIGF1dGhvciwgc3ViamVjdCkKCiAgICAgICAgICAgICMgUHJpbnQgcmVzdCBvZiBib2R5IGxpbmVzIChza2lwIGVtcHR5IG9uZXMgYW5kIHRyaW0gdHJhaWxpbmcgZW1wdHkgbGluZSkKICAgICAgICAgICAgZm9yIChpID0gaiArIDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChsaW5lc1tpXSB+IC9bXls6c3BhY2U6XV0vKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIlx0JXNcbiIsIGxpbmVzW2ldKQogICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9JykKCiAgICAgICAgIyBTZWNvbmRhcnkgcGFzczogc3RyaXAgdGlja2V0IHByZWZpeCBmcm9tIGFueSBsaW5lcyBub3QgY2F1Z2h0IGJ5IHRoZSBzZWQgYWJvdmUuCiAgICAgICAgIyBVc2VzIGRvdWJsZSBxdW90ZXMgc28gJGppcmFfdGlja2V0X251bWJlciBleHBhbmRzIGNvcnJlY3RseS4KICAgICAgICBpZiBbIC1uICIkamlyYV90aWNrZXRfbnVtYmVyIiBdOyB0aGVuCiAgICAgICAgICAgIGNoYW5nZWxvZz0kKGVjaG8gIiRjaGFuZ2Vsb2ciIHwgc2VkIC1FICJzL15cWz8kamlyYV90aWNrZXRfbnVtYmVyXF0/W1s6c3BhY2U6XV0qLy9nIikKICAgICAgICAgICAgY2hhbmdlbG9nX2ludGVybmFsPSQoZWNobyAiJGNoYW5nZWxvZ19pbnRlcm5hbCIgfCBzZWQgLUUgInMvXlxbPyRqaXJhX3RpY2tldF9udW1iZXJcXT9bWzpzcGFjZTpdXSovL2ciKQogICAgICAgIGZpCiAgICAgICAgY2hhbmdlbG9nX2ludGVybmFsPSQoZWNobyAiJGNoYW5nZWxvZ19pbnRlcm5hbCIgfCBzZWQgLWUgJ3MvXHRcdC9cdC9nJyAtZSAnL15bWzpzcGFjZTpdXSokL2QnKQoKICAgIGlmIFsgLXogIiRjaGFuZ2Vsb2ciIF07IHRoZW4KICAgICAgICBwcmludF9pbmZvICJObyBjaGFuZ2Vsb2cgdG8gYWRkIgogICAgZWxzZQogICAgICAgICMgVXNlIHRoZSBwcm92aWRlZCB2ZXJzaW9uIG9yIGZhbGwgYmFjayB0byAkbmV3dmVyc2lvbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIGxvY2FsIHZlcnNpb25fdG9fdXNlPSIke3ZlcnNpb246LSRuZXd2ZXJzaW9ufSIKICAgICAgICAKICAgICAgICBpZiBbIC16ICIkdmVyc2lvbl90b191c2UiIF07IHRoZW4KICAgICAgICAgICAgcHJpbnRfZXJyb3IgIk5vIHZlcnNpb24gc3BlY2lmaWVkIGZvciBjaGFuZ2Vsb2cgdXBkYXRlIgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgaWYgWyAtZiAiJGNoYW5nZWxvZ3BhdGgvJGNoYW5nZWxvZ19uYW1lIiBdOyB0aGVuCiAgICAgICAgICAgIGlmIFsgIiQoaGVhZCAtbiAxICIkY2hhbmdlbG9ncGF0aC8kY2hhbmdlbG9nX25hbWUiIHwgc2VkICdzLyMjIC8vJyB8IGN1dCAtZC4gLWYxLDIpIiA9PSAiJChlY2hvICR2ZXJzaW9uX3RvX3VzZSB8IGN1dCAtZC4gLWYxLDIpIiBdOyB0aGVuCiAgICAgICAgICAgICAgICBpZiBbICIkKHNlZCAtbiAnMnAnICIkY2hhbmdlbG9ncGF0aC8kY2hhbmdlbG9nX25hbWUiKSIgPT0gIiRodW1hbmRhdGUiIF07IHRoZW4KICAgICAgICAgICAgICAgICAgICBzZWRfaW5wbGFjZSAnMSwzZCcgIiRjaGFuZ2Vsb2dwYXRoLyRjaGFuZ2Vsb2dfbmFtZSIKICAgICAgICAgICAgICAgICAgICBlY2hvIC1lICIjIyAkdmVyc2lvbl90b191c2VcbiRodW1hbmRhdGVcblxuJGNoYW5nZWxvZ1xuJChjYXQgIiRjaGFuZ2Vsb2dwYXRoLyRjaGFuZ2Vsb2dfbmFtZSIpIiA+ICIkY2hhbmdlbG9ncGF0aC8kY2hhbmdlbG9nX25hbWUiCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZWNobyAtZSAiIyMgJHZlcnNpb25fdG9fdXNlXG4kaHVtYW5kYXRlXG5cbiRjaGFuZ2Vsb2dcblxuJChjYXQgIiRjaGFuZ2Vsb2dwYXRoLyRjaGFuZ2Vsb2dfbmFtZSIpIiA+ICIkY2hhbmdlbG9ncGF0aC8kY2hhbmdlbG9nX25hbWUiCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBlY2hvIC1lICIjIyAkdmVyc2lvbl90b191c2VcbiRodW1hbmRhdGVcblxuJGNoYW5nZWxvZ1xuXG4kKGNhdCAiJGNoYW5nZWxvZ3BhdGgvJGNoYW5nZWxvZ19uYW1lIikiID4gIiRjaGFuZ2Vsb2dwYXRoLyRjaGFuZ2Vsb2dfbmFtZSIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAiVXBkYXRlZCBjaGFuZ2Vsb2cgaW4gJGNoYW5nZWxvZ3BhdGgvJGNoYW5nZWxvZ19uYW1lIHRvIHZlcnNpb24gJHZlcnNpb25fdG9fdXNlIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAtZSAiIyMgJHZlcnNpb25fdG9fdXNlXG4kaHVtYW5kYXRlXG5cbiRjaGFuZ2Vsb2ciID4gIiRjaGFuZ2Vsb2dwYXRoLyRjaGFuZ2Vsb2dfbmFtZSIKICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAiQ3JlYXRlZCBjaGFuZ2Vsb2cgaW4gJGNoYW5nZWxvZ3BhdGgvJGNoYW5nZWxvZ19uYW1lIHdpdGggdmVyc2lvbiAkdmVyc2lvbl90b191c2UiCiAgICAgICAgZmkKICAgIGZpCgogICAgaWYgWyAteiAiJGNoYW5nZWxvZ19pbnRlcm5hbCIgXTsgdGhlbgogICAgICAgIHByaW50X2luZm8gIk5vIGludGVybmFsIGNoYW5nZWxvZyB0byBhZGQiCiAgICBlbGlmIFsgLWYgIiRjaGFuZ2Vsb2dfaW50ZXJuYWxfcGF0aC8kY2hhbmdlbG9nX2ludGVybmFsX25hbWUiIF07IHRoZW4KICAgICAgICBpZiBbICIkKGhlYWQgLW4gMSAiJGNoYW5nZWxvZ19pbnRlcm5hbF9wYXRoLyRjaGFuZ2Vsb2dfaW50ZXJuYWxfbmFtZSIgfCBzZWQgJ3MvIyMgLy8nIHwgY3V0IC1kLiAtZjEsMikiID09ICIkKGVjaG8gJG5ld3ZlcnNpb24gfCBjdXQgLWQuIC1mMSwyKSIgXTsgdGhlbgogICAgICAgICAgICBpZiBbICIkKHNlZCAtbiAnMnAnICIkY2hhbmdlbG9nX2ludGVybmFsX3BhdGgvJGNoYW5nZWxvZ19pbnRlcm5hbF9uYW1lIikiID09ICIkbG9uZ2h1bWFuZGF0ZSIgXTsgdGhlbgogICAgICAgICAgICAgICAgc2VkX2lucGxhY2UgJzEsM2QnICIkY2hhbmdlbG9nX2ludGVybmFsX3BhdGgvJGNoYW5nZWxvZ19pbnRlcm5hbF9uYW1lIgogICAgICAgICAgICAgICAgZWNobyAtZSAiIyMgJG5ld3ZlcnNpb25cbiRsb25naHVtYW5kYXRlXG5cbiRjaGFuZ2Vsb2dfaW50ZXJuYWxcbiQoY2F0ICIkY2hhbmdlbG9nX2ludGVybmFsX3BhdGgvJGNoYW5nZWxvZ19pbnRlcm5hbF9uYW1lIikiID4gIiRjaGFuZ2Vsb2dfaW50ZXJuYWxfcGF0aC8kY2hhbmdlbG9nX2ludGVybmFsX25hbWUiCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gLWUgIiMjICRuZXd2ZXJzaW9uXG4kbG9uZ2h1bWFuZGF0ZVxuXG4kY2hhbmdlbG9nX2ludGVybmFsXG5cbiQoY2F0ICIkY2hhbmdlbG9nX2ludGVybmFsX3BhdGgvJGNoYW5nZWxvZ19pbnRlcm5hbF9uYW1lIikiID4gIiRjaGFuZ2Vsb2dfaW50ZXJuYWxfcGF0aC8kY2hhbmdlbG9nX2ludGVybmFsX25hbWUiCiAgICAgICAgICAgIGZpCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvIC1lICIjIyAkbmV3dmVyc2lvblxuJGxvbmdodW1hbmRhdGVcblxuJGNoYW5nZWxvZ19pbnRlcm5hbFxuXG4kKGNhdCAiJGNoYW5nZWxvZ19pbnRlcm5hbF9wYXRoLyRjaGFuZ2Vsb2dfaW50ZXJuYWxfbmFtZSIpIiA+ICIkY2hhbmdlbG9nX2ludGVybmFsX3BhdGgvJGNoYW5nZWxvZ19pbnRlcm5hbF9uYW1lIgogICAgICAgIGZpCiAgICAgICAgcHJpbnRfc3VjY2VzcyAiVXBkYXRlZCBjaGFuZ2Vsb2cgaW4gJGNoYW5nZWxvZ19pbnRlcm5hbF9wYXRoLyRjaGFuZ2Vsb2dfaW50ZXJuYWxfbmFtZSIKICAgIGVsc2UKICAgICAgICBwcmludF9pbmZvICJJbnRlcm5hbCBjaGFuZ2Vsb2cgJGNoYW5nZWxvZ19pbnRlcm5hbF9wYXRoLyRjaGFuZ2Vsb2dfaW50ZXJuYWxfbmFtZSBkb2VzIG5vdCBleGlzdCwgc2tpcHBpbmciCiAgICBmaQp9CgpmaSAjIF9fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfY2hhbmdlbG9nX3NoCiMgLS0tIEVuZCBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi9jb3JlL2NoYW5nZWxvZy5zaCAtLS0KCiMgLS0tIEJlZ2luIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL2NvcmUvYm9vdHN0cmFwLnNoIC0tLQppZiBbWyAteiAiJHtfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX2Jvb3RzdHJhcF9zaDotfSIgXV07IHRoZW4gX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV9ib290c3RyYXBfc2g9MQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNQUlBU1MgQm9vdHN0cmFwIE1vZHVsZQojIEludGVyYWN0aXZlIHByb2plY3Qgc2V0dXAgYW5kIGNvbmZpZ3VyYXRpb24KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgTG9hZCBleGlzdGluZyAuZW52Lm1haWFzcyB2YWx1ZXMgdG8gdXNlIGFzIGRlZmF1bHRzCmxvYWRfZXhpc3RpbmdfYm9vdHN0cmFwX3ZhbHVlcygpIHsKICAgIGlmIFtbIC1mICIuZW52Lm1haWFzcyIgXV07IHRoZW4KICAgICAgICBwcmludF9kZWJ1ZyAiTG9hZGluZyBleGlzdGluZyBjb25maWd1cmF0aW9uIHZhbHVlcyBhcyBkZWZhdWx0cyIKCiAgICAgICAgIyBSZWFkIGV4aXN0aW5nIHZhbHVlcyB3aXRob3V0IGV4ZWN1dGluZyB0aGVtIChzZWN1cml0eSkKICAgICAgICB3aGlsZSBJRlM9IHJlYWQgLXIgbGluZSB8fCBbWyAtbiAiJGxpbmUiIF1dOyBkbwogICAgICAgICAgICAjIFNraXAgY29tbWVudHMgYW5kIGVtcHR5IGxpbmVzCiAgICAgICAgICAgIFtbIC16ICIkbGluZSIgfHwgIiRsaW5lIiA9PSBcIyogXV0gJiYgY29udGludWUKCiAgICAgICAgICAgICMgRXh0cmFjdCBrZXk9dmFsdWUgcGFpcnMKICAgICAgICAgICAgaWYgW1sgIiRsaW5lIiA9fiBeKFtBLVpfXSspPSguKikkIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBsb2NhbCBrZXk9IiR7QkFTSF9SRU1BVENIWzFdfSIKICAgICAgICAgICAgICAgIGxvY2FsIHZhbHVlPSIke0JBU0hfUkVNQVRDSFsyXX0iCgogICAgICAgICAgICAgICAgIyBSZW1vdmUgcXVvdGVzIGlmIHByZXNlbnQKICAgICAgICAgICAgICAgIGlmIFtbICIkdmFsdWUiID09IFwiKlwiIHx8ICIkdmFsdWUiID09IFwnKlwnIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgdmFsdWU9JChlY2hvICIkdmFsdWUiIHwgc2VkICdzL15bIidcJyddLy8nIHwgc2VkICdzL1siJ1wnJ10kLy8nKQogICAgICAgICAgICAgICAgZmkKCiAgICAgICAgICAgICAgICAjIE1hcCB0byBib290c3RyYXAgdmFyaWFibGVzCiAgICAgICAgICAgICAgICBjYXNlICIka2V5IiBpbgogICAgICAgICAgICAgICAgICAgICJNQUlBU1NfUkVQT19UWVBFIikKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0IEVYSVNUSU5HX1BST0pFQ1RfVFlQRT0iJHZhbHVlIgogICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICJNQUlBU1NfV1BfRklMRVNfUEFUSCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBFWElTVElOR19XUF9QQVRIPSIkdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgIk1BSUFTU19WRVJTSU9OX1BSSU1BUllfRklMRSIpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBFWElTVElOR19WRVJTSU9OX1NPVVJDRT0iJHZhbHVlIgogICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICJNQUlBU1NfTUFJTkJSQU5DSCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBFWElTVElOR19NQUlOX0JSQU5DSD0iJHZhbHVlIgogICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICJNQUlBU1NfREVWRUxPUEJSQU5DSCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBFWElTVElOR19ERVZFTE9QX0JSQU5DSD0iJHZhbHVlIgogICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICJNQUlBU1NfU1RBR0lOR0JSQU5DSCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBFWElTVElOR19TVEFHSU5HX0JSQU5DSD0iJHZhbHVlIgogICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICJNQUlBU1NfQ0hBTkdFTE9HX1BBVEgiKQogICAgICAgICAgICAgICAgICAgICAgICBleHBvcnQgRVhJU1RJTkdfQ0hBTkdFTE9HX1BBVEg9IiR2YWx1ZSIKICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAiTUFJQVNTX0NIQU5HRUxPR19OQU1FIikKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0IEVYSVNUSU5HX0NIQU5HRUxPR19OQU1FPSIkdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgIk1BSUFTU19DSEFOR0VMT0dfSU5URVJOQUxfRU5BQkxFRCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBFWElTVElOR19JTlRFUk5BTF9DSEFOR0VMT0dfRU5BQkxFRD0iJHZhbHVlIgogICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICJNQUlBU1NfQ0hBTkdFTE9HX0lOVEVSTkFMX1BBVEgiKQogICAgICAgICAgICAgICAgICAgICAgICBleHBvcnQgRVhJU1RJTkdfSU5URVJOQUxfQ0hBTkdFTE9HX1BBVEg9IiR2YWx1ZSIKICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAiTUFJQVNTX0NIQU5HRUxPR19JTlRFUk5BTF9OQU1FIikKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0IEVYSVNUSU5HX0lOVEVSTkFMX0NIQU5HRUxPR19OQU1FPSIkdmFsdWUiCiAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgIk1BSUFTU19NT0RFIikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgW1sgIiR2YWx1ZSIgPT0gImFpX29ubHkiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnQgRVhJU1RJTkdfRkVBVFVSRVM9ImFpX29ubHkiCiAgICAgICAgICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICBlc2FjCiAgICAgICAgICAgIGZpCiAgICAgICAgZG9uZSA8ICIuZW52Lm1haWFzcyIKICAgIGZpCn0KCiMgQ29uZmlndXJlIGNoYW5nZWxvZyBwYXRoIHdoZW4gd29ya2Zsb3cgaW5jbHVkZXMgY2hhbmdlbG9nCiMgU2V0cyBCT09UU1RSQVBfQ0hBTkdFTE9HX1BBVEggYW5kIEJPT1RTVFJBUF9DSEFOR0VMT0dfTkFNRQpjb25maWd1cmVfY2hhbmdlbG9nKCkgewogICAgIyBPbmx5IHJlbGV2YW50IGlmIGNoYW5nZWxvZyBpcyBwYXJ0IG9mIHRoZSBzZWxlY3RlZCBmZWF0dXJlcwogICAgW1sgIiRCT09UU1RSQVBfRkVBVFVSRVMiICE9ICJmdWxsIiBdXSAmJiByZXR1cm4gMAoKICAgIHByaW50X3NlY3Rpb24gIvCfp74gQ2hhbmdlbG9nIENvbmZpZ3VyYXRpb24iCgogICAgIyBQcmVmZXIgcmVwbyByb290OyBmb3IgV1AgdGhlbWUvcGx1Z2luIHJlcG9zLCBwcmVmZXIgdGhhdCBwYXRoIGFzIGEgaGludAogICAgbG9jYWwgcHJlZmVycmVkX2Rpcj0iLiIKICAgIGlmIFtbIC1uICIkQk9PVFNUUkFQX1dQX1BBVEgiICYmICIkQk9PVFNUUkFQX1dQX1BBVEgiICE9ICIuIiBdXTsgdGhlbgogICAgICAgIHByZWZlcnJlZF9kaXI9IiRCT09UU1RSQVBfV1BfUEFUSCIKICAgIGZpCgogICAgIyAwKSBBc2sgYWJvdXQgb3B0aW9uYWwgaW50ZXJuYWwgY2hhbmdlbG9nIChpbmNsdWRlcyBKSVJBIHRpY2tldCBudW1iZXJzIGFuZCBjb21taXQgYXV0aG9ycykKICAgICMgICAgVGhpcyBmaWxlIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seSBhbmQgc2hvdWxkIHVzdWFsbHkgYmUgZXhjbHVkZWQgZnJvbSBkZXBsb3ltZW50cy4KICAgIGxvY2FsIGRlZmF1bHRfaW50ZXJuYWxfbmFtZT0iLkNIQU5HRUxPR19pbnRlcm5hbC5tZCIKICAgIGlmIFtbIC1uICIkRVhJU1RJTkdfSU5URVJOQUxfQ0hBTkdFTE9HX0VOQUJMRUQiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiSW50ZXJuYWwgY2hhbmdlbG9nIChjdXJyZW50KTogJHtFWElTVElOR19JTlRFUk5BTF9DSEFOR0VMT0dfRU5BQkxFRH0iICJhbHdheXMiCiAgICAgICAgaWYgW1sgIiRFWElTVElOR19JTlRFUk5BTF9DSEFOR0VMT0dfRU5BQkxFRCIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAgICAgICAgIHByaW50X2luZm8gIkN1cnJlbnQgcGF0aDogJHtFWElTVElOR19JTlRFUk5BTF9DSEFOR0VMT0dfUEFUSH0vJHtFWElTVElOR19JTlRFUk5BTF9DSEFOR0VMT0dfTkFNRX0iICJhbHdheXMiCiAgICAgICAgZmkKICAgICAgICBwcmludF9wcm9tcHQgIkVuYWJsZSBpbnRlcm5hbCBjaGFuZ2Vsb2c/IFt5L04sIEVudGVyIHRvIGtlZXAgY3VycmVudF06ICIKICAgICAgICByZWFkIC1yIGVuYWJsZV9pbnRlcm5hbAogICAgICAgIGlmIFtbIC16ICIkZW5hYmxlX2ludGVybmFsIiBdXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0lOVEVSTkFMX0NIQU5HRUxPR19FTkFCTEVEPSIke0VYSVNUSU5HX0lOVEVSTkFMX0NIQU5HRUxPR19FTkFCTEVEfSIKICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9JTlRFUk5BTF9DSEFOR0VMT0dfUEFUSD0iJHtFWElTVElOR19JTlRFUk5BTF9DSEFOR0VMT0dfUEFUSH0iCiAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfSU5URVJOQUxfQ0hBTkdFTE9HX05BTUU9IiR7RVhJU1RJTkdfSU5URVJOQUxfQ0hBTkdFTE9HX05BTUU6LSRkZWZhdWx0X2ludGVybmFsX25hbWV9IgogICAgICAgIGVsaWYgW1sgIiRlbmFibGVfaW50ZXJuYWwiID1+IF5bWXldJCBdXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0lOVEVSTkFMX0NIQU5HRUxPR19FTkFCTEVEPSJ0cnVlIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9JTlRFUk5BTF9DSEFOR0VMT0dfRU5BQkxFRD0iZmFsc2UiCiAgICAgICAgZmkKICAgIGVsc2UKICAgICAgICBwcmludF9pbmZvICJJbnRlcm5hbCBjaGFuZ2Vsb2cgY2FuIGluY2x1ZGUgSklSQSB0aWNrZXQgSURzIGFuZCBjb21taXQgYXV0aG9ycy4iICJhbHdheXMiCiAgICAgICAgcHJpbnRfd2FybmluZyAiTm90ZTogVGhpcyBtdXN0IHJlbWFpbiB0cmFja2VkIChzb3VyY2Ugb2YgdHJ1dGggb24gZGV2ZWxvcCkuIEhhbmRsZSBleHBvc3VyZSB2aWEgZGVwbG95bWVudCB0b29saW5nIChlLmcuLCBDSSBydWxlcyksIG5vdCAuZ2l0aWdub3JlLiIgImFsd2F5cyIKICAgICAgICBwcmludF9wcm9tcHQgIkVuYWJsZSBpbnRlcm5hbCBjaGFuZ2Vsb2c/IFt5L05dOiAiCiAgICAgICAgcmVhZCAtciBlbmFibGVfaW50ZXJuYWwKICAgICAgICBpZiBbWyAiJGVuYWJsZV9pbnRlcm5hbCIgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfSU5URVJOQUxfQ0hBTkdFTE9HX0VOQUJMRUQ9InRydWUiCiAgICAgICAgZWxzZQogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0lOVEVSTkFMX0NIQU5HRUxPR19FTkFCTEVEPSJmYWxzZSIKICAgICAgICBmaQogICAgZmkKCiAgICBpZiBbWyAiJEJPT1RTVFJBUF9JTlRFUk5BTF9DSEFOR0VMT0dfRU5BQkxFRCIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAgICAgIyBEZXRlcm1pbmUgaW50ZXJuYWwgY2hhbmdlbG9nIGxvY2F0aW9uCiAgICAgICAgbG9jYWwgaW50ZXJuYWxfcGF0aF9oaW50PSIkcHJlZmVycmVkX2RpciIKICAgICAgICBsb2NhbCBpbnRlcm5hbF9uYW1lX2hpbnQ9IiRkZWZhdWx0X2ludGVybmFsX25hbWUiCiAgICAgICAgIyBSZXNwZWN0IGV4aXN0aW5nIHZhbHVlcyBpZiBwcmVzZW50CiAgICAgICAgaWYgW1sgLW4gIiRFWElTVElOR19JTlRFUk5BTF9DSEFOR0VMT0dfUEFUSCIgXV07IHRoZW4KICAgICAgICAgICAgaW50ZXJuYWxfcGF0aF9oaW50PSIkRVhJU1RJTkdfSU5URVJOQUxfQ0hBTkdFTE9HX1BBVEgiCiAgICAgICAgZmkKICAgICAgICBpZiBbWyAtbiAiJEVYSVNUSU5HX0lOVEVSTkFMX0NIQU5HRUxPR19OQU1FIiBdXTsgdGhlbgogICAgICAgICAgICBpbnRlcm5hbF9uYW1lX2hpbnQ9IiRFWElTVElOR19JTlRFUk5BTF9DSEFOR0VMT0dfTkFNRSIKICAgICAgICBmaQoKICAgICAgICBwcmludF9wcm9tcHQgIkludGVybmFsIGNoYW5nZWxvZyBkaXJlY3RvcnkgW2RlZmF1bHQ6ICRpbnRlcm5hbF9wYXRoX2hpbnRdOiAiCiAgICAgICAgcmVhZCAtciBpY19kaXIKICAgICAgICBpY19kaXI9IiR7aWNfZGlyOi0kaW50ZXJuYWxfcGF0aF9oaW50fSIKICAgICAgICBwcmludF9wcm9tcHQgIkludGVybmFsIGNoYW5nZWxvZyBmaWxlbmFtZSBbZGVmYXVsdDogJGludGVybmFsX25hbWVfaGludF06ICIKICAgICAgICByZWFkIC1yIGljX25hbWUKICAgICAgICBpY19uYW1lPSIke2ljX25hbWU6LSRpbnRlcm5hbF9uYW1lX2hpbnR9IgoKICAgICAgICAjIE5vcm1hbGl6ZSB0byBzdG9yZSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIHNlcGFyYXRlbHkKICAgICAgICBpZiBbWyAtZCAiJGljX2RpciIgXV07IHRoZW4KICAgICAgICAgICAgOgogICAgICAgIGVsc2UKICAgICAgICAgICAgIyBJZiBhIGZpbGUgcGF0aCB3YXMgbWlzdGFrZW5seSBlbnRlcmVkLCBzcGxpdAogICAgICAgICAgICBpZiBbWyAtZiAiJGljX2RpciIgXV07IHRoZW4KICAgICAgICAgICAgICAgIGljX25hbWU9IiQoYmFzZW5hbWUgIiRpY19kaXIiKSIKICAgICAgICAgICAgICAgIGljX2Rpcj0iJChkaXJuYW1lICIkaWNfZGlyIikiCiAgICAgICAgICAgIGZpCiAgICAgICAgZmkKCiAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9JTlRFUk5BTF9DSEFOR0VMT0dfUEFUSD0iJGljX2RpciIKICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0lOVEVSTkFMX0NIQU5HRUxPR19OQU1FPSIkaWNfbmFtZSIKCiAgICAgICAgIyBJbnRlbnRpb25hbGx5IERPIE5PVCBhZGQgdG8gLmdpdGlnbm9yZSDigJQgdGhpcyBtdXN0IHJlbWFpbiB0cmFja2VkIGFzIHNvdXJjZSBvZiB0cnV0aCBvbiBkZXZlbG9wCiAgICAgICAgbG9jYWwgaW50ZXJuYWxfZnVsbD0iJGljX2Rpci8kaWNfbmFtZSIKICAgICAgICBwcmludF9pbmZvICJJbnRlcm5hbCBjaGFuZ2Vsb2cgd2lsbCBiZSB0cmFja2VkOiAkaW50ZXJuYWxfZnVsbCAoZG8gbm90IC5naXRpZ25vcmUgaXQpIiAiYWx3YXlzIgogICAgZmkKCiAgICAjIElmIHJlY29uZmlndXJpbmcgYW5kIGV4aXN0aW5nIHZhbHVlcyBwcmVzZW50LCBvZmZlciBhcyBkZWZhdWx0CiAgICBsb2NhbCBleGlzdGluZ19kaXIgZXhpc3RpbmdfbmFtZSBleGlzdGluZ19mdWxsCiAgICBleGlzdGluZ19kaXI9IiR7RVhJU1RJTkdfQ0hBTkdFTE9HX1BBVEg6LX0iCiAgICBleGlzdGluZ19uYW1lPSIke0VYSVNUSU5HX0NIQU5HRUxPR19OQU1FOi19IgogICAgaWYgW1sgLW4gIiRleGlzdGluZ19kaXIiICYmIC1uICIkZXhpc3RpbmdfbmFtZSIgXV07IHRoZW4KICAgICAgICAjIExlZ2FjeSBoYW5kbGluZzogc29tZSB2ZXJzaW9ucyBzdG9yZWQgUEFUSCBpbmNsdWRpbmcgdGhlIGZpbGVuYW1lLgogICAgICAgICMgSWYgZXhpc3RpbmdfZGlyIHBvaW50cyB0byBhIGZpbGUsIHVzZSBpdCBkaXJlY3RseSBhbmQgbm9ybWFsaXplIGRpci4KICAgICAgICBpZiBbWyAtZiAiJGV4aXN0aW5nX2RpciIgXV07IHRoZW4KICAgICAgICAgICAgZXhpc3RpbmdfZnVsbD0iJGV4aXN0aW5nX2RpciIKICAgICAgICAgICAgZXhpc3RpbmdfZGlyPSIkKGRpcm5hbWUgIiRleGlzdGluZ19kaXIiKSIKICAgICAgICBlbHNlCiAgICAgICAgICAgIGV4aXN0aW5nX2Z1bGw9IiRleGlzdGluZ19kaXIvJGV4aXN0aW5nX25hbWUiCiAgICAgICAgZmkKICAgICAgICBpZiBbWyAtZiAiJGV4aXN0aW5nX2Z1bGwiIF1dOyB0aGVuCiAgICAgICAgICAgIHByaW50X2luZm8gIkV4aXN0aW5nIGNoYW5nZWxvZyBkZXRlY3RlZDogJGV4aXN0aW5nX2Z1bGwiICJhbHdheXMiCiAgICAgICAgICAgIHByaW50X3Byb21wdCAiVXNlICRleGlzdGluZ19mdWxsIGFzIGNoYW5nZWxvZz8gW1kvbl06ICIKICAgICAgICAgICAgcmVhZCAtciB1c2VfZXhpc3RpbmcKICAgICAgICAgICAgaWYgW1sgISAiJHVzZV9leGlzdGluZyIgPX4gXltObl0kIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0NIQU5HRUxPR19QQVRIPSIkKGRpcm5hbWUgIiRleGlzdGluZ19mdWxsIikiCiAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0NIQU5HRUxPR19OQU1FPSIkKGJhc2VuYW1lICIkZXhpc3RpbmdfZnVsbCIpIgogICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyTIFVzaW5nIGV4aXN0aW5nIGNoYW5nZWxvZzogJGV4aXN0aW5nX2Z1bGwiCiAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICBmaQoKICAgICMgVHJ5IGF1dG8tZGlzY292ZXJ5IGluIHJlcG8gcm9vdCBhbmQgcHJlZmVycmVkIGRpcgogICAgbG9jYWwgZGlzY292ZXJlZAogICAgZGlzY292ZXJlZD0iJChmaW5kX2V4aXN0aW5nX2NoYW5nZWxvZyAiLiIgIiRwcmVmZXJyZWRfZGlyIikiIHx8IHRydWUKICAgIGlmIFtbIC1uICIkZGlzY292ZXJlZCIgXV07IHRoZW4KICAgICAgICBwcmludF9pbmZvICJEaXNjb3ZlcmVkIGNoYW5nZWxvZzogJGRpc2NvdmVyZWQiICJhbHdheXMiCiAgICAgICAgcHJpbnRfcHJvbXB0ICJVc2UgJGRpc2NvdmVyZWQgYXMgY2hhbmdlbG9nPyBbWS9uXTogIgogICAgICAgIHJlYWQgLXIgdXNlX2Rpc2NvdmVyZWQKICAgICAgICBpZiBbWyAhICIkdXNlX2Rpc2NvdmVyZWQiID1+IF5bTm5dJCBdXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0NIQU5HRUxPR19QQVRIPSIkKGRpcm5hbWUgIiRkaXNjb3ZlcmVkIikiCiAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfQ0hBTkdFTE9HX05BTUU9IiQoYmFzZW5hbWUgIiRkaXNjb3ZlcmVkIikiCiAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIuKckyBVc2luZyBkaXNjb3ZlcmVkIGNoYW5nZWxvZzogJGRpc2NvdmVyZWQiCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZmkKICAgIGZpCgogICAgIyBNYW51YWwgc2VsZWN0aW9uL2NyZWF0aW9uCiAgICBsb2NhbCBkZWZhdWx0X3BhdGgKICAgIGlmIFtbIC1kICIkcHJlZmVycmVkX2RpciIgXV07IHRoZW4KICAgICAgICBkZWZhdWx0X3BhdGg9IiRwcmVmZXJyZWRfZGlyL0NIQU5HRUxPRy5tZCIKICAgIGVsc2UKICAgICAgICBkZWZhdWx0X3BhdGg9IkNIQU5HRUxPRy5tZCIKICAgIGZpCiAgICBwcmludF9wcm9tcHQgIkVudGVyIHBhdGggdG8gY2hhbmdlbG9nIGZpbGUgW2RlZmF1bHQ6ICRkZWZhdWx0X3BhdGhdOiAiCiAgICBsb2NhbCBlbnRlcmVkX3BhdGgKICAgIHJlYWQgLXIgZW50ZXJlZF9wYXRoCiAgICBsb2NhbCBjaG9zZW5fcGF0aAogICAgY2hvc2VuX3BhdGg9IiR7ZW50ZXJlZF9wYXRoOi0kZGVmYXVsdF9wYXRofSIKCiAgICAjIElmIGEgZGlyZWN0b3J5IHdhcyBlbnRlcmVkLCBhcHBlbmQgZGVmYXVsdCBmaWxlbmFtZQogICAgaWYgW1sgLWQgIiRjaG9zZW5fcGF0aCIgXV07IHRoZW4KICAgICAgICBjaG9zZW5fcGF0aD0iJGNob3Nlbl9wYXRoL0NIQU5HRUxPRy5tZCIKICAgIGZpCgogICAgIyBDcmVhdGUgdGhlIGZpbGUgaWYgaXQgZG9lcyBub3QgZXhpc3QKICAgIGlmIFtbICEgLWYgIiRjaG9zZW5fcGF0aCIgXV07IHRoZW4KICAgICAgICBwcmludF9wcm9tcHQgIkNoYW5nZWxvZyBub3QgZm91bmQgYXQgJGNob3Nlbl9wYXRoLiBDcmVhdGUgaXQ/IFtZL25dOiAiCiAgICAgICAgcmVhZCAtciBjcmVhdGVfY2wKICAgICAgICBpZiBbWyAhICIkY3JlYXRlX2NsIiA9fiBeW05uXSQgXV07IHRoZW4KICAgICAgICAgICAgbWtkaXIgLXAgIiQoZGlybmFtZSAiJGNob3Nlbl9wYXRoIikiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZWNobyAiIyBDaGFuZ2Vsb2ciCiAgICAgICAgICAgICAgICBlY2hvICJcbkFsbCBub3RhYmxlIGNoYW5nZXMgdG8gdGhpcyBwcm9qZWN0IHdpbGwgYmUgZG9jdW1lbnRlZCBpbiB0aGlzIGZpbGUuIgogICAgICAgICAgICB9ID4gIiRjaG9zZW5fcGF0aCIKICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyTIENyZWF0ZWQgJGNob3Nlbl9wYXRoIgogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJpbnRfd2FybmluZyAiUHJvY2VlZGluZyB3aXRob3V0IGNyZWF0aW5nIGNoYW5nZWxvZyBmaWxlLiBZb3UgY2FuIHVwZGF0ZSBpdCBsYXRlci4iICJhbHdheXMiCiAgICAgICAgZmkKICAgIGZpCgogICAgZXhwb3J0IEJPT1RTVFJBUF9DSEFOR0VMT0dfUEFUSD0iJChkaXJuYW1lICIkY2hvc2VuX3BhdGgiKSIKICAgIGV4cG9ydCBCT09UU1RSQVBfQ0hBTkdFTE9HX05BTUU9IiQoYmFzZW5hbWUgIiRjaG9zZW5fcGF0aCIpIgp9CgojIEluZmVyIHRoZSBleGFjdCB2ZXJzaW9uIHByZWZpeCAoaW5jbHVkaW5nIG9yaWdpbmFsIGNhc2luZyBhbmQgd2hpdGVzcGFjZSkKIyBmcm9tIGEgZ2l2ZW4gZmlsZS4gRGV0ZWN0cyBjb21tb24gV29yZFByZXNzIG1hcmtlcnMgbGlrZSAiU3RhYmxlIHRhZzoiIG9yCiMgIlZlcnNpb246IiB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgc3BhY2VzL3RhYnMgYW5kIGFyYml0cmFyeSBjYXNpbmcuCiMgRWNob3MgdGhlIGV4YWN0IHByZWZpeCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBjb2xvbiBhbmQgYW55IGltbWVkaWF0ZSBzcGFjZXMuCmluZmVyX3ZlcnNpb25fcHJlZml4X2Zyb21fZmlsZSgpIHsKICAgIGxvY2FsIGZpbGU9IiQxIgogICAgW1sgISAtZiAiJGZpbGUiIF1dICYmIHJldHVybiAxCgogICAgIyBQcmVmZXIgU3RhYmxlIHRhZyBpbiByZWFkbWUudHh0LCBvdGhlcndpc2UgbG9vayBmb3IgVmVyc2lvbgogICAgIyBVc2UgSUdOT1JFQ0FTRSBmb3IgbWF0Y2hpbmcsIGJ1dCByZXR1cm4gdGhlIG9yaWdpbmFsIHNsaWNlCiAgICBhd2sgJ0JFR0lOe0lHTk9SRUNBU0U9MX0KICAgICAgICB7CiAgICAgICAgICAgIGxpbmU9JDA7CiAgICAgICAgICAgICMgMSkgU3RhYmxlIHRhZyBpbiByZWFkbWUgZmlsZXMgKGFuY2hvcmVkIGF0IGxpbmUgc3RhcnQsIGFsbG93aW5nIGxlYWRpbmcgd2hpdGVzcGFjZSkKICAgICAgICAgICAgaWYgKG1hdGNoKGxpbmUsIC9eWyBcdF0qc3RhYmxlWyBcdF0rdGFnWyBcdF0qOlsgXHRdKi8pKSB7IHByaW50IHN1YnN0cihsaW5lLCBSU1RBUlQsIFJMRU5HVEgpOyBleGl0IH0KCiAgICAgICAgICAgICMgMikgVmVyc2lvbiB3aXRoIG9wdGlvbmFsIGNvbW1lbnQgbGVhZGVycyAoZS5nLiwgIiAqIFZlcnNpb246IiwgIiMgVmVyc2lvbjoiKQogICAgICAgICAgICAjICAgIEFsbG93IGNoYXJhY3RlcnMgbGlrZSAnLycsICcqJywgJyMnLCAnLScsIHRoZW4gc3BhY2VzIGJlZm9yZSB0aGUgd29yZCB2ZXJzaW9uCiAgICAgICAgICAgIGlmIChtYXRjaChsaW5lLCAvXlsgXHRdKltcLyojLV0qWyBcdF0qdmVyc2lvblsgXHRdKjpbIFx0XSovKSkgeyBwcmludCBzdWJzdHIobGluZSwgUlNUQVJULCBSTEVOR1RIKTsgZXhpdCB9CiAgICAgICAgfQogICAgJyAiJGZpbGUiCn0KCiMgRmluZCBhbiBleGlzdGluZyBjaGFuZ2Vsb2cgaW4gcHJvdmlkZWQgZGlyZWN0b3JpZXMgKGNhc2UtaW5zZW5zaXRpdmUpCiMgVXNhZ2U6IGZpbmRfZXhpc3RpbmdfY2hhbmdlbG9nIDxkaXIxPiA8ZGlyMj4KZmluZF9leGlzdGluZ19jaGFuZ2Vsb2coKSB7CiAgICBsb2NhbCBkaXIKICAgIGZvciBkaXIgaW4gIiQxIiAiJDIiOyBkbwogICAgICAgIFtbIC16ICIkZGlyIiB8fCAhIC1kICIkZGlyIiBdXSAmJiBjb250aW51ZQogICAgICAgICMgTWF0Y2ggZmlsZXMgbmFtZWQgbGlrZSBjaGFuZ2Vsb2csIGNhc2UtaW5zZW5zaXRpdmUsIHdpdGggY29tbW9uIGV4dGVuc2lvbnMgb3Igbm9uZQogICAgICAgIGxvY2FsIG1hdGNoCiAgICAgICAgbWF0Y2g9JChmaW5kICIkZGlyIiAtbWF4ZGVwdGggMSAtdHlwZSBmIFwKICAgICAgICAgICAgXCggLWluYW1lICJjaGFuZ2Vsb2ciIC1vIC1pbmFtZSAiY2hhbmdlbG9nLioiIFwpIDI+L2Rldi9udWxsIHwgaGVhZCAtMSkKICAgICAgICBpZiBbWyAtbiAiJG1hdGNoIiBdXTsgdGhlbgogICAgICAgICAgICBlY2hvICIkbWF0Y2giCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZmkKICAgIGRvbmUKICAgIHJldHVybiAxCn0KCiMgTWFpbiBib290c3RyYXAgZnVuY3Rpb24gLSBjYWxsZWQgYWZ0ZXIgZ2l0IHJlcG9zaXRvcnkgZGV0ZWN0aW9uCmJvb3RzdHJhcF9wcm9qZWN0KCkgewogICAgIyAtLXNldHVwLy0tYm9vdHN0cmFwOiBydW4gdGhlIGZ1bGwgaW50ZXJhY3RpdmUgd2l6YXJkIGFuZCBleGl0CiAgICBpZiBbWyAiJHtNQUlBU1NfRk9SQ0VfQk9PVFNUUkFQOi1mYWxzZX0iID09ICJ0cnVlIiBdXTsgdGhlbgogICAgICAgIGxvY2FsIGlzX3JlY29uZmlndXJlPWZhbHNlCiAgICAgICAgW1sgLWYgIi5lbnYubWFpYXNzIiBdXSAmJiBpc19yZWNvbmZpZ3VyZT10cnVlCgogICAgICAgIFtbICIkaXNfcmVjb25maWd1cmUiID09ICJ0cnVlIiBdXSAmJiBsb2FkX2V4aXN0aW5nX2Jvb3RzdHJhcF92YWx1ZXMKCiAgICAgICAgaWYgW1sgIiRpc19yZWNvbmZpZ3VyZSIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAgICAgICAgIHByaW50X2luZm8gIvCflKcgUmVjb25maWd1cmluZyBNQUlBU1MgZm9yIHRoaXMgcHJvamVjdC4iICJhbHdheXMiCiAgICAgICAgICAgIHByaW50X2luZm8gIkN1cnJlbnQgdmFsdWVzIHdpbGwgYmUgc2hvd24gYXMgZGVmYXVsdHMuXG4iICJhbHdheXMiCiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludF9pbmZvICLwn5qAIFNldHRpbmcgdXAgTUFJQVNTIGZvciB0aGlzIHByb2plY3QuIiAiYWx3YXlzIgogICAgICAgICAgICBwcmludF9pbmZvICJUaGlzIGlzIGEgb25lLXRpbWUgc2V0dXAgdGhhdCB3aWxsIG1ha2UgZnV0dXJlIHJ1bnMgc21vb3RoZXIuXG4iICJhbHdheXMiCiAgICAgICAgZmkKCiAgICAgICAgc2V0dXBfZW52X2ZpbGUKICAgICAgICBkZXRlY3RfYW5kX2NvbmZpZ3VyZV9wcm9qZWN0X3R5cGUKICAgICAgICBjb25maWd1cmVfdmVyc2lvbl9zb3VyY2UKICAgICAgICBjaG9vc2VfbWFpYXNzX2ZlYXR1cmVzCiAgICAgICAgY29uZmlndXJlX2NoYW5nZWxvZwogICAgICAgIGNvbmZpZ3VyZV9icmFuY2hfc3RyYXRlZ3kKICAgICAgICBzYXZlX2Jvb3RzdHJhcF9jb25maWcKCiAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyFIFByb2plY3Qgc2V0dXAgY29tcGxldGUhIiAiYWx3YXlzIgogICAgICAgIHByaW50X2luZm8gIllvdSBjYW4gbW9kaWZ5IHRoZXNlIHNldHRpbmdzIGFueXRpbWUgYnkgZWRpdGluZyAuZW52Lm1haWFzcyIgImFsd2F5cyIKICAgICAgICBwcmludF9pbmZvICJSdW4gJ21haWFzcycgYWdhaW4gdG8gc3RhcnQgdXNpbmcgeW91ciBjb25maWd1cmVkIHdvcmtmbG93LlxuIiAiYWx3YXlzIgogICAgICAgIGV4aXQgMAogICAgZmkKCiAgICAjIEFscmVhZHkgY29uZmlndXJlZCDigJQgbm90aGluZyB0byBkbwogICAgaWYgW1sgLWYgIi5lbnYubWFpYXNzIiB8fCAtZiAiLmVudi5tYWlhc3MubG9jYWwiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfZGVidWcgIlByb2plY3QgYWxyZWFkeSBjb25maWd1cmVkIgogICAgICAgIHJldHVybiAwCiAgICBmaQoKICAgICMgRmlyc3QgcnVuOiBjcmVhdGUgLmVudi5tYWlhc3MubG9jYWwgYXMgYSBtYXJrZXIgYW5kIHByb3RlY3QgaXQgaW4gLmdpdGlnbm9yZQogICAgY2F0ID4gLmVudi5tYWlhc3MubG9jYWwgPDwgRU9GCiMgLmVudi5tYWlhc3MubG9jYWwg4oCUIHBlcnNvbmFsL2xvY2FsIE1BSUFTUyBzZXR0aW5ncyAobmV2ZXIgY29tbWl0dGVkKQojIEdlbmVyYXRlZCBvbiBmaXJzdCBydW46ICQoZGF0ZSAtdSArIiVZLSVtLSVkVCVIOiVNOiVTWiIpCiMgVXNlIHRoaXMgZmlsZSBmb3IgcGVyc29uYWwgb3ZlcnJpZGVzLCBlLmcuIE1BSUFTU19BSV9NT0RFPWF1dG9zdWdnZXN0CkVPRgoKICAgICMgQWRkIE1BSUFTUyBlbnRyaWVzIHRvIC5naXRpZ25vcmUgb25seSBpZiBvbmUgYWxyZWFkeSBleGlzdHMKICAgIGlmIFtbIC1mICIuZ2l0aWdub3JlIiBdXTsgdGhlbgogICAgICAgIGxvY2FsIG5lZWRzX2dpdGlnbm9yZT1mYWxzZQogICAgICAgIGdyZXAgLXEgIlwuZW52XC5tYWlhc3NcLmxvY2FsIiAuZ2l0aWdub3JlIHx8IG5lZWRzX2dpdGlnbm9yZT10cnVlCiAgICAgICAgZ3JlcCAtcSAibWFpYXNzXC5sb2ciIC5naXRpZ25vcmUgfHwgbmVlZHNfZ2l0aWdub3JlPXRydWUKICAgICAgICBpZiBbWyAiJG5lZWRzX2dpdGlnbm9yZSIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAgICAgICAgIFtbIC1uICIkKHRhaWwgLWMxIC5naXRpZ25vcmUpIiBdXSAmJiBlY2hvICIiID4+IC5naXRpZ25vcmUKICAgICAgICAgICAgZWNobyAiIiA+PiAuZ2l0aWdub3JlCiAgICAgICAgICAgIGVjaG8gIiMgTUFJQVNTIiA+PiAuZ2l0aWdub3JlCiAgICAgICAgICAgIGdyZXAgLXEgIlwuZW52XC5tYWlhc3NcLmxvY2FsIiAuZ2l0aWdub3JlIHx8IGVjaG8gIi5lbnYubWFpYXNzLmxvY2FsIiA+PiAuZ2l0aWdub3JlCiAgICAgICAgICAgIGdyZXAgLXEgIm1haWFzc1wubG9nIiAuZ2l0aWdub3JlIHx8IGVjaG8gIm1haWFzcy5sb2ciID4+IC5naXRpZ25vcmUKICAgICAgICBmaQogICAgZmkKCiAgICAjIEVuZm9yY2UgYWlfb25seSBtb2RlIGZvciB0aGlzIHNlc3Npb24g4oCUIG5vIHZlcnNpb24gYnVtcGluZywgbm8gbWVyZ2luZwogICAgZXhwb3J0IE1BSUFTU19NT0RFPWFpX29ubHkKCiAgICAjIFNob3cgd2VsY29tZSBtZXNzYWdlIHdpdGggYWN0aXZlIGRlZmF1bHRzCiAgICBsb2NhbCBhaV9tb2RlPSIke01BSUFTU19BSV9NT0RFOi1hc2t9IgogICAgZWNobyAiIgogICAgcHJpbnRfaW5mbyAi8J+RiyBXZWxjb21lIHRvIE1BSUFTUyEiICJhbHdheXMiCiAgICBwcmludF9pbmZvICIgICBSdW5uaW5nIHdpdGggc21hcnQgZGVmYXVsdHM6IiAiYWx3YXlzIgogICAgcHJpbnRfaW5mbyAiICAg4oCiIEFJIGNvbW1pdCBtZXNzYWdlczogJHthaV9tb2RlfSIgImFsd2F5cyIKICAgIHByaW50X2luZm8gIiAgIOKAoiBWZXJzaW9uIG1hbmFnZW1lbnQ6IG9mZiIgImFsd2F5cyIKICAgIHByaW50X2luZm8gIiAgIOKAoiBDaGFuZ2Vsb2dnaW5nOiBvZmYiICJhbHdheXMiCiAgICBwcmludF9pbmZvICIgICBSdW4gbWFpYXNzIC0tc2V0dXAgdG8gY29uZmlndXJlIGZvciB0aGlzIHByb2plY3QuIiAiYWx3YXlzIgogICAgZWNobyAiIgp9CgojIFN0ZXAgMTogQ3JlYXRlIC5lbnYubWFpYXNzIGZpbGUgYW5kIGhhbmRsZSAuZ2l0aWdub3JlCnNldHVwX2Vudl9maWxlKCkgewogICAgcHJpbnRfc2VjdGlvbiAi8J+ThCBDb25maWd1cmF0aW9uIEZpbGUgU2V0dXAiCgogICAgaWYgW1sgIiR7TUFJQVNTX0ZPUkNFX0JPT1RTVFJBUDotZmFsc2V9IiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgICAgICBwcmludF9pbmZvICJVcGRhdGluZyBleGlzdGluZyAuZW52Lm1haWFzcyBmaWxlIHdpdGggbmV3IGNvbmZpZ3VyYXRpb24uIiAiYWx3YXlzIgogICAgICAgIHJldHVybiAwCiAgICBmaQoKICAgIHByaW50X2luZm8gIk1BSUFTUyB1c2VzIGNvbmZpZ3VyYXRpb24gZmlsZXMgdG8gc3RvcmUgcHJvamVjdCBzZXR0aW5nczoiICJhbHdheXMiCiAgICBwcmludF9pbmZvICIgIOKAoiAuZW52Lm1haWFzcyAtIFRlYW0vcmVwbyBjb25maWcgKHRyYWNrZWQgaW4gZ2l0KSIgImFsd2F5cyIKICAgIHByaW50X2luZm8gIiAg4oCiIC5lbnYubWFpYXNzLmxvY2FsIC0gUGVyc29uYWwgc2V0dGluZ3MgKGdpdGlnbm9yZWQpIiAiYWx3YXlzIgogICAgcHJpbnRfcHJvbXB0ICJcbkNyZWF0ZSBjb25maWd1cmF0aW9uIGZpbGVzPyBbWS9uXTogIgogICAgcmVhZCAtciBjcmVhdGVfZW52CgogICAgaWYgW1sgIiRjcmVhdGVfZW52IiA9fiBeW05uXSQgXV07IHRoZW4KICAgICAgICBwcmludF93YXJuaW5nICJDYW5ub3QgcHJvY2VlZCB3aXRob3V0IGNvbmZpZ3VyYXRpb24gZmlsZXMuIEV4aXRpbmcgc2V0dXAuIiAiYWx3YXlzIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICAjIEFsd2F5cyBrZWVwIC5lbnYubWFpYXNzIHRyYWNrZWQgYW5kIHNldCBNQUlBU1NfR0lUS0VFUAogICAgZXhwb3J0IEJPT1RTVFJBUF9TRVRfR0lUS0VFUD0idHJ1ZSIKCiAgICBwcmludF9zdWNjZXNzICLinJMgV2lsbCBjcmVhdGUgY29uZmlndXJhdGlvbiBmaWxlcyIKfQoKIyBTdGVwIDI6IERldGVjdCBwcm9qZWN0IHR5cGUgKFdvcmRQcmVzcywgTm9kZS5qcywgZ2VuZXJpYykKZGV0ZWN0X2FuZF9jb25maWd1cmVfcHJvamVjdF90eXBlKCkgewogICAgcHJpbnRfc2VjdGlvbiAi8J+UjSBQcm9qZWN0IFR5cGUgRGV0ZWN0aW9uIgoKICAgIGxvY2FsIGRldGVjdGVkX3R5cGU9ImdlbmVyaWMiCgogICAgIyBJZiByZWNvbmZpZ3VyaW5nLCBzaG93IGV4aXN0aW5nIHR5cGUgYW5kIGFzayBpZiB1c2VyIHdhbnRzIHRvIGNoYW5nZSBpdAogICAgaWYgW1sgLW4gIiRFWElTVElOR19QUk9KRUNUX1RZUEUiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiQ3VycmVudCBwcm9qZWN0IHR5cGU6ICRFWElTVElOR19QUk9KRUNUX1RZUEUiICJhbHdheXMiCiAgICAgICAgcHJpbnRfcHJvbXB0ICJDaGFuZ2UgcHJvamVjdCB0eXBlIGRldGVjdGlvbj8gW3kvTl06ICIKICAgICAgICByZWFkIC1yIGNoYW5nZV90eXBlCgogICAgICAgIGlmIFtbICEgIiRjaGFuZ2VfdHlwZSIgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgICAgICMgS2VlcCBleGlzdGluZyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfUFJPSkVDVF9UWVBFPSIkRVhJU1RJTkdfUFJPSkVDVF9UWVBFIgogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1dQX1BBVEg9IiR7RVhJU1RJTkdfV1BfUEFUSDotLn0iCiAgICAgICAgICAgIHByaW50X2luZm8gIuKckyBLZWVwaW5nIGV4aXN0aW5nIHByb2plY3QgdHlwZTogJEVYSVNUSU5HX1BST0pFQ1RfVFlQRSIgImFsd2F5cyIKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBmaQogICAgZmkKCiAgICAjIFBlcmZvcm0gZnJlc2ggZGV0ZWN0aW9uCiAgICAjIENoZWNrIGZvciBXb3JkUHJlc3MKICAgIGlmIGRldGVjdF93b3JkcHJlc3NfcHJvamVjdDsgdGhlbgogICAgICAgIGRldGVjdGVkX3R5cGU9IndvcmRwcmVzcyIKICAgICAgICBjb25maWd1cmVfd29yZHByZXNzX3Byb2plY3QKICAgICMgQ2hlY2sgZm9yIE5vZGUuanMKICAgIGVsaWYgW1sgLWYgInBhY2thZ2UuanNvbiIgXV07IHRoZW4KICAgICAgICBkZXRlY3RlZF90eXBlPSJub2RlanMiCiAgICAgICAgcHJpbnRfaW5mbyAi8J+TpiBEZXRlY3RlZCBOb2RlLmpzIHByb2plY3QgKHBhY2thZ2UuanNvbiBmb3VuZCkiICJhbHdheXMiCiAgICBlbHNlCiAgICAgICAgcHJpbnRfaW5mbyAi8J+TgSBHZW5lcmljIHByb2plY3QgZGV0ZWN0ZWQiICJhbHdheXMiCiAgICBmaQoKICAgIGV4cG9ydCBCT09UU1RSQVBfUFJPSkVDVF9UWVBFPSIkZGV0ZWN0ZWRfdHlwZSIKfQoKIyBXb3JkUHJlc3MgcHJvamVjdCBkZXRlY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24KZGV0ZWN0X3dvcmRwcmVzc19wcm9qZWN0KCkgewogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBTdGFydGluZyBXb3JkUHJlc3MgZGV0ZWN0aW9uIgoKICAgICMgTG9vayBmb3IgZGVmaW5pdGl2ZSBXb3JkUHJlc3MgaW5kaWNhdG9ycwogICAgaWYgW1sgLWYgIndwLWNvbmZpZy5waHAiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBGb3VuZCB3cC1jb25maWcucGhwIC0gV29yZFByZXNzIGRldGVjdGVkIgogICAgICAgIHJldHVybiAwCiAgICBmaQoKICAgIGlmIFtbIC1kICJ3cC1jb250ZW50IiBdXTsgdGhlbgogICAgICAgIHByaW50X2RlYnVnICJERUJVRzogRm91bmQgd3AtY29udGVudCBkaXJlY3RvcnkgLSBXb3JkUHJlc3MgZGV0ZWN0ZWQiCiAgICAgICAgcmV0dXJuIDAKICAgIGZpCgogICAgIyBDaGVjayBmb3IgV29yZFByZXNzIHRoZW1lIChib3RoIGZpbGVzIG11c3QgZXhpc3QgaW4gc2FtZSBkaXJlY3RvcnkpCiAgICBpZiBbWyAtZiAic3R5bGUuY3NzIiAmJiAtZiAiZnVuY3Rpb25zLnBocCIgXV07IHRoZW4KICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEZvdW5kIHN0eWxlLmNzcyBBTkQgZnVuY3Rpb25zLnBocCAtIFdvcmRQcmVzcyB0aGVtZSBkZXRlY3RlZCIKICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICAjIENoZWNrIGZvciBXb3JkUHJlc3MgcGx1Z2luIGhlYWRlciAobW9yZSBzcGVjaWZpYyBzZWFyY2gpCiAgICBsb2NhbCBwbHVnaW5fY2hlY2sKICAgIHBsdWdpbl9jaGVjaz0kKGZpbmQgLiAtbWF4ZGVwdGggMiAtbmFtZSAiKi5waHAiIC1leGVjIGdyZXAgLWwgIlBsdWdpbiBOYW1lOiIge30gXDsgMj4vZGV2L251bGwgfCBoZWFkIC0xKQogICAgaWYgW1sgLW4gIiRwbHVnaW5fY2hlY2siIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBGb3VuZCBXb3JkUHJlc3MgcGx1Z2luIGhlYWRlciBpbjogJHBsdWdpbl9jaGVjayIKICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICAjIENoZWNrIGZvciBXb3JkUHJlc3MgdGhlbWUgaGVhZGVyIChtb3JlIHNwZWNpZmljIHNlYXJjaCkKICAgIGxvY2FsIHRoZW1lX2NoZWNrCiAgICB0aGVtZV9jaGVjaz0kKGZpbmQgLiAtbWF4ZGVwdGggMiAtbmFtZSAic3R5bGUuY3NzIiAtZXhlYyBncmVwIC1sICJUaGVtZSBOYW1lOiIge30gXDsgMj4vZGV2L251bGwgfCBoZWFkIC0xKQogICAgaWYgW1sgLW4gIiR0aGVtZV9jaGVjayIgXV07IHRoZW4KICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEZvdW5kIFdvcmRQcmVzcyB0aGVtZSBoZWFkZXIgaW46ICR0aGVtZV9jaGVjayIKICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IE5vIFdvcmRQcmVzcyBpbmRpY2F0b3JzIGZvdW5kIgogICAgcmV0dXJuIDEKfQoKY29uZmlndXJlX3dvcmRwcmVzc19wcm9qZWN0KCkgewogICAgcHJpbnRfaW5mbyAi8J+UjCBXb3JkUHJlc3MgcHJvamVjdCBkZXRlY3RlZCEiICJhbHdheXMiCgogICAgbG9jYWwgd3BfdHlwZT0iIgogICAgIyBEZWZhdWx0IHRvIGN1cnJlbnQgZGlyZWN0b3J5IGZvciB0aGVtZS9wbHVnaW4gcmVwb3MKICAgIGxvY2FsIGxvY2FsX3dwX3BhdGg9Ii4iCgogICAgIyBEZXRlcm1pbmUgV29yZFByZXNzIHByb2plY3QgdHlwZQogICAgaWYgW1sgLWYgIndwLWNvbmZpZy5waHAiIF1dIHx8IFtbIC1kICJ3cC1jb250ZW50IiBdXTsgdGhlbgogICAgICAgIHdwX3R5cGU9InNpdGUiCiAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9SRVBPX0NPTlRFWFQ9InNpdGUiCiAgICAgICAgcHJpbnRfaW5mbyAiRGV0ZWN0ZWQ6IFdvcmRQcmVzcyBzaXRlIHJvb3QiICJhbHdheXMiCiAgICAgICAgY29uZmlndXJlX3dvcmRwcmVzc19zaXRlCiAgICBlbGlmIFtbIC1mICJzdHlsZS5jc3MiICYmIC1mICJmdW5jdGlvbnMucGhwIiBdXTsgdGhlbgogICAgICAgIHdwX3R5cGU9InRoZW1lIgogICAgICAgIGV4cG9ydCBCT09UU1RSQVBfUkVQT19DT05URVhUPSJ0aGVtZSIKICAgICAgICBwcmludF9pbmZvICJEZXRlY3RlZDogV29yZFByZXNzIHRoZW1lIiAiYWx3YXlzIgogICAgICAgIGV4cG9ydCBCT09UU1RSQVBfV1BfUEFUSD0iJGxvY2FsX3dwX3BhdGgiCiAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9XUF9DT01QT05FTlRfVFlQRT0idGhlbWUiCiAgICBlbGlmIGZpbmQgLiAtbWF4ZGVwdGggMSAtbmFtZSAiKi5waHAiIC1leGVjIGdyZXAgLWwgIlBsdWdpbiBOYW1lOiIge30gXDsgMj4vZGV2L251bGwgfCBoZWFkIC0xID4vZGV2L251bGw7IHRoZW4KICAgICAgICB3cF90eXBlPSJwbHVnaW4iCiAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9SRVBPX0NPTlRFWFQ9InBsdWdpbiIKICAgICAgICBwcmludF9pbmZvICJEZXRlY3RlZDogV29yZFByZXNzIHBsdWdpbiIgImFsd2F5cyIKICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1dQX1BBVEg9IiRsb2NhbF93cF9wYXRoIgogICAgICAgIGV4cG9ydCBCT09UU1RSQVBfV1BfQ09NUE9ORU5UX1RZUEU9InBsdWdpbiIKICAgIGVsc2UKICAgICAgICAjIEFzayB1c2VyIHRvIGNsYXJpZnkKICAgICAgICBwcmludF9pbmZvICJXb3JkUHJlc3MgZmlsZXMgZGV0ZWN0ZWQsIGJ1dCB0eXBlIHVuY2xlYXIuIiAiYWx3YXlzIgogICAgICAgIGVjaG8gIldoYXQgdHlwZSBvZiBXb3JkUHJlc3MgcHJvamVjdCBpcyB0aGlzPyIKICAgICAgICBlY2hvICIxKSBUaGVtZSAoaW4gdGhlbWUgZGlyZWN0b3J5KSIKICAgICAgICBlY2hvICIyKSBQbHVnaW4gKGluIHBsdWdpbiBkaXJlY3RvcnkpIgogICAgICAgIGVjaG8gIjMpIEZ1bGwgc2l0ZSAod3AtY29uZmlnLnBocCBpbiByb290KSIKICAgICAgICBwcmludF9wcm9tcHQgIkVudGVyIGNob2ljZSBbMS0zXTogIgogICAgICAgIHJlYWQgLXIgd3BfY2hvaWNlCgogICAgICAgIGNhc2UgIiR3cF9jaG9pY2UiIGluCiAgICAgICAgICAgIDEpIHdwX3R5cGU9InRoZW1lIjsgZXhwb3J0IEJPT1RTVFJBUF9SRVBPX0NPTlRFWFQ9InRoZW1lIjsgZXhwb3J0IEJPT1RTVFJBUF9XUF9DT01QT05FTlRfVFlQRT0idGhlbWUiOyBleHBvcnQgQk9PVFNUUkFQX1dQX1BBVEg9IiRsb2NhbF93cF9wYXRoIiA7OwogICAgICAgICAgICAyKSB3cF90eXBlPSJwbHVnaW4iOyBleHBvcnQgQk9PVFNUUkFQX1JFUE9fQ09OVEVYVD0icGx1Z2luIjsgZXhwb3J0IEJPT1RTVFJBUF9XUF9DT01QT05FTlRfVFlQRT0icGx1Z2luIjsgZXhwb3J0IEJPT1RTVFJBUF9XUF9QQVRIPSIkbG9jYWxfd3BfcGF0aCIgOzsKICAgICAgICAgICAgMykgd3BfdHlwZT0ic2l0ZSI7IGV4cG9ydCBCT09UU1RSQVBfUkVQT19DT05URVhUPSJzaXRlIjsgY29uZmlndXJlX3dvcmRwcmVzc19zaXRlIDs7CiAgICAgICAgICAgICopIHdwX3R5cGU9InRoZW1lIiA7OwogICAgICAgIGVzYWMKICAgIGZpCiAgICAjIElmIGNvbmZpZ3VyZV93b3JkcHJlc3Nfc2l0ZSgpIHNldCBjb21wb25lbnQgdHlwZSAodGhlbWUvcGx1Z2luKSwgZG9uJ3Qgb3ZlcndyaXRlIGl0CiAgICAjIEVuc3VyZSBCT09UU1RSQVBfV1BfUEFUSCBpcyBzZXQgZm9yIG5vbi1zaXRlIGNhc2VzIG9yIGRlZmF1bHRzCiAgICBpZiBbWyAteiAiJEJPT1RTVFJBUF9XUF9QQVRIIiBdXTsgdGhlbgogICAgICAgIGV4cG9ydCBCT09UU1RSQVBfV1BfUEFUSD0iJGxvY2FsX3dwX3BhdGgiCiAgICBmaQp9Cgpjb25maWd1cmVfd29yZHByZXNzX3NpdGUoKSB7CiAgICBwcmludF9pbmZvICJcbkZvciBXb3JkUHJlc3Mgc2l0ZXMsIHRlbGwgTUFJQVNTIHdoYXQgeW91J3JlIHdvcmtpbmcgb24uIiAiYWx3YXlzIgogICAgZWNobyAiQXJlIHlvdSB3b3JraW5nIG9uIGEgdGhlbWUgb3IgYSBwbHVnaW4/IgogICAgZWNobyAiMSkgVGhlbWUiCiAgICBlY2hvICIyKSBQbHVnaW4iCiAgICBwcmludF9wcm9tcHQgIkVudGVyIGNob2ljZSBbMS0yXTogIgogICAgcmVhZCAtciB3cF93b3JrX3R5cGUKCiAgICBsb2NhbCBiYXNlX2Rpcj0iIgogICAgY2FzZSAiJHdwX3dvcmtfdHlwZSIgaW4KICAgICAgICAyKSBiYXNlX2Rpcj0id3AtY29udGVudC9wbHVnaW5zIjsgZXhwb3J0IEJPT1RTVFJBUF9XUF9DT01QT05FTlRfVFlQRT0icGx1Z2luIiA7OwogICAgICAgICopIGJhc2VfZGlyPSJ3cC1jb250ZW50L3RoZW1lcyI7IGV4cG9ydCBCT09UU1RSQVBfV1BfQ09NUE9ORU5UX1RZUEU9InRoZW1lIiA7OwogICAgZXNhYwoKICAgIGxvY2FsIGRlZmF1bHRfbmFtZV9oaW50PSIiCiAgICBpZiBbWyAtbiAiJEVYSVNUSU5HX1dQX1BBVEgiICYmICIkRVhJU1RJTkdfV1BfUEFUSCIgIT0gIi4iIF1dOyB0aGVuCiAgICAgICAgZGVmYXVsdF9uYW1lX2hpbnQ9JChiYXNlbmFtZSAiJEVYSVNUSU5HX1dQX1BBVEgiKQogICAgZmkKCiAgICAjIEJ1aWxkIGEgbGlzdCBvZiBjYW5kaWRhdGUgZm9sZGVycyB0byBjaG9vc2UgZnJvbQogICAgbG9jYWwgaXRlbXM9KCkKICAgIGlmIFtbIC1kICIkYmFzZV9kaXIiIF1dOyB0aGVuCiAgICAgICAgd2hpbGUgSUZTPSByZWFkIC1yIC1kICcnIGQ7IGRvCiAgICAgICAgICAgIGl0ZW1zKz0oIiQoYmFzZW5hbWUgIiRkIikiKQogICAgICAgIGRvbmUgPCA8KGZpbmQgIiRiYXNlX2RpciIgLW1pbmRlcHRoIDEgLW1heGRlcHRoIDEgLXR5cGUgZCAtcHJpbnQwIDI+L2Rldi9udWxsKQogICAgZmkKCiAgICBsb2NhbCB3cF9mb2xkZXJfbmFtZT0iIgogICAgaWYgW1sgJHsjaXRlbXNbQF19IC1ndCAwIF1dOyB0aGVuCiAgICAgICAgZWNobyAiU2VsZWN0ICQoIFtbIFwiJEJPT1RTVFJBUF9XUF9DT01QT05FTlRfVFlQRVwiID09IFwicGx1Z2luXCIgXV0gJiYgZWNobyBwbHVnaW4gfHwgZWNobyB0aGVtZSApIGZvbGRlciBpbiAnJGJhc2VfZGlyJzoiCiAgICAgICAgbG9jYWwgaQogICAgICAgIGZvciBpIGluICIkeyFpdGVtc1tAXX0iOyBkbwogICAgICAgICAgICBlY2hvICIkKChpKzEpKSkgJHtpdGVtc1skaV19IgogICAgICAgIGRvbmUKICAgICAgICBlY2hvICIwKSBFbnRlciBhIGRpZmZlcmVudCBmb2xkZXIgbmFtZSIKICAgICAgICBpZiBbWyAtbiAiJGRlZmF1bHRfbmFtZV9oaW50IiBdXTsgdGhlbgogICAgICAgICAgICBwcmludF9wcm9tcHQgIkVudGVyIGNob2ljZSBbMC0keyNpdGVtc1tAXX0gLCBFbnRlciBmb3IgY3VycmVudDogJGRlZmF1bHRfbmFtZV9oaW50XTogIgogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJpbnRfcHJvbXB0ICJFbnRlciBjaG9pY2UgWzAtJHsjaXRlbXNbQF19XTogIgogICAgICAgIGZpCiAgICAgICAgcmVhZCAtciBjaG9pY2UKCiAgICAgICAgaWYgW1sgLXogIiRjaG9pY2UiICYmIC1uICIkZGVmYXVsdF9uYW1lX2hpbnQiIF1dOyB0aGVuCiAgICAgICAgICAgIHdwX2ZvbGRlcl9uYW1lPSIkZGVmYXVsdF9uYW1lX2hpbnQiCiAgICAgICAgZWxpZiBbWyAiJGNob2ljZSIgPX4gXlswLTldKyQgXV0gJiYgW1sgIiRjaG9pY2UiIC1nZSAxIF1dICYmIFtbICIkY2hvaWNlIiAtbGUgJHsjaXRlbXNbQF19IF1dOyB0aGVuCiAgICAgICAgICAgIHdwX2ZvbGRlcl9uYW1lPSIke2l0ZW1zWyQoKGNob2ljZS0xKSldfSIKICAgICAgICBlbHNlCiAgICAgICAgICAgICMgTWFudWFsIGVudHJ5CiAgICAgICAgICAgIGlmIFtbIC1uICIkZGVmYXVsdF9uYW1lX2hpbnQiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF9wcm9tcHQgIkVudGVyIGZvbGRlciBuYW1lIFtjdXJyZW50OiAkZGVmYXVsdF9uYW1lX2hpbnRdOiAiCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHByaW50X3Byb21wdCAiRW50ZXIgZm9sZGVyIG5hbWU6ICIKICAgICAgICAgICAgZmkKICAgICAgICAgICAgcmVhZCAtciB3cF9mb2xkZXJfbmFtZQogICAgICAgICAgICBpZiBbWyAteiAiJHdwX2ZvbGRlcl9uYW1lIiAmJiAtbiAiJGRlZmF1bHRfbmFtZV9oaW50IiBdXTsgdGhlbgogICAgICAgICAgICAgICAgd3BfZm9sZGVyX25hbWU9IiRkZWZhdWx0X25hbWVfaGludCIKICAgICAgICAgICAgZmkKICAgICAgICBmaQogICAgZWxzZQogICAgICAgICMgTm8gaXRlbXMgZm91bmQsIGZhbGxiYWNrIHRvIG1hbnVhbCBlbnRyeQogICAgICAgIHByaW50X3dhcm5pbmcgIk5vIGZvbGRlcnMgZm91bmQgaW4gJyRiYXNlX2RpciciICJhbHdheXMiCiAgICAgICAgaWYgW1sgLW4gIiRkZWZhdWx0X25hbWVfaGludCIgXV07IHRoZW4KICAgICAgICAgICAgcHJpbnRfcHJvbXB0ICJFbnRlciBmb2xkZXIgbmFtZSBbY3VycmVudDogJGRlZmF1bHRfbmFtZV9oaW50XTogIgogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJpbnRfcHJvbXB0ICJFbnRlciBmb2xkZXIgbmFtZTogIgogICAgICAgIGZpCiAgICAgICAgcmVhZCAtciB3cF9mb2xkZXJfbmFtZQogICAgICAgIGlmIFtbIC16ICIkd3BfZm9sZGVyX25hbWUiICYmIC1uICIkZGVmYXVsdF9uYW1lX2hpbnQiIF1dOyB0aGVuCiAgICAgICAgICAgIHdwX2ZvbGRlcl9uYW1lPSIkZGVmYXVsdF9uYW1lX2hpbnQiCiAgICAgICAgZmkKICAgIGZpCgogICAgbG9jYWwgd3BfdGFyZ2V0X3BhdGg9IiRiYXNlX2Rpci8kd3BfZm9sZGVyX25hbWUiCgogICAgIyBWYWxpZGF0ZSB0aGUgcGF0aCBleGlzdHMKICAgIHdoaWxlIFtbICEgLWQgIiR3cF90YXJnZXRfcGF0aCIgXV07IGRvCiAgICAgICAgcHJpbnRfd2FybmluZyAiRGlyZWN0b3J5ICckd3BfdGFyZ2V0X3BhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgcHJpbnRfcHJvbXB0ICJQbGVhc2UgZW50ZXIgYSB2YWxpZCBmb2xkZXIgbmFtZTogIgogICAgICAgIHJlYWQgLXIgd3BfZm9sZGVyX25hbWUKICAgICAgICB3cF90YXJnZXRfcGF0aD0iJGJhc2VfZGlyLyR3cF9mb2xkZXJfbmFtZSIKICAgIGRvbmUKCiAgICAjIEZpbmFsIGNvbmZpcm1hdGlvbiBiYXNlZCBvbiBjb250ZW50cwogICAgaWYgW1sgIiRCT09UU1RSQVBfV1BfQ09NUE9ORU5UX1RZUEUiID09ICJ0aGVtZSIgXV07IHRoZW4KICAgICAgICBpZiBbWyAtZiAiJHdwX3RhcmdldF9wYXRoL3N0eWxlLmNzcyIgXV07IHRoZW4KICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyTIFdvcmRQcmVzcyB0aGVtZSBjb25maXJtZWQ6ICR3cF90YXJnZXRfcGF0aCIKICAgICAgICBlbHNlCiAgICAgICAgICAgIHByaW50X3dhcm5pbmcgIlRoZW1lIGZvbGRlciAnJHdwX3RhcmdldF9wYXRoJyBkb2VzIG5vdCBjb250YWluIHN0eWxlLmNzczsgY29udGludWluZyBhbnl3YXkuIgogICAgICAgIGZpCiAgICBlbHNlCiAgICAgICAgaWYgZmluZCAiJHdwX3RhcmdldF9wYXRoIiAtbWF4ZGVwdGggMSAtbmFtZSAiKi5waHAiIC1leGVjIGdyZXAgLWwgIlBsdWdpbiBOYW1lOiIge30gXDsgMj4vZGV2L251bGwgfCBoZWFkIC0xID4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyTIFdvcmRQcmVzcyBwbHVnaW4gY29uZmlybWVkOiAkd3BfdGFyZ2V0X3BhdGgiCiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludF93YXJuaW5nICJQbHVnaW4gZm9sZGVyICckd3BfdGFyZ2V0X3BhdGgnIGRvZXMgbm90IGNvbnRhaW4gYSBoZWFkZXI7IGNvbnRpbnVpbmcgYW55d2F5LiIKICAgICAgICBmaQogICAgZmkKCiAgICBleHBvcnQgQk9PVFNUUkFQX1dQX1BBVEg9IiR3cF90YXJnZXRfcGF0aCIKfQoKIyBTdGVwIDM6IENvbmZpZ3VyZSB2ZXJzaW9uIHNvdXJjZQpjb25maWd1cmVfdmVyc2lvbl9zb3VyY2UoKSB7CiAgICBwcmludF9zZWN0aW9uICLwn5OLIFZlcnNpb24gU291cmNlIENvbmZpZ3VyYXRpb24iCgogICAgbG9jYWwgdmVyc2lvbl9zb3VyY2VzPSgpCiAgICBsb2NhbCByZWNvbW1lbmRlZF9zb3VyY2U9IiIKCiAgICAjIENoZWNrIHdoYXQgdmVyc2lvbiBmaWxlcyBleGlzdAogICAgaWYgW1sgLWYgInBhY2thZ2UuanNvbiIgXV07IHRoZW4KICAgICAgICB2ZXJzaW9uX3NvdXJjZXMrPSgicGFja2FnZS5qc29uIikKICAgICAgICByZWNvbW1lbmRlZF9zb3VyY2U9InBhY2thZ2UuanNvbiIKICAgIGZpCgogICAgaWYgW1sgLWYgIlZFUlNJT04iIF1dOyB0aGVuCiAgICAgICAgdmVyc2lvbl9zb3VyY2VzKz0oIlZFUlNJT04iKQogICAgICAgIGlmIFtbIC16ICIkcmVjb21tZW5kZWRfc291cmNlIiBdXTsgdGhlbgogICAgICAgICAgICByZWNvbW1lbmRlZF9zb3VyY2U9IlZFUlNJT04iCiAgICAgICAgZmkKICAgIGZpCgogICAgIyBBbHNvIHN1cHBvcnQgY29udmVudGlvbmFsIGxvd2VyY2FzZSBmaWxlIG5hbWUKICAgIGlmIFtbIC1mICJ2ZXJzaW9uLnR4dCIgXV07IHRoZW4KICAgICAgICB2ZXJzaW9uX3NvdXJjZXMrPSgidmVyc2lvbi50eHQiKQogICAgICAgIGlmIFtbIC16ICIkcmVjb21tZW5kZWRfc291cmNlIiBdXTsgdGhlbgogICAgICAgICAgICByZWNvbW1lbmRlZF9zb3VyY2U9InZlcnNpb24udHh0IgogICAgICAgIGZpCiAgICBmaQoKICAgICMgQ2hlY2sgZm9yIFdvcmRQcmVzcyB2ZXJzaW9uIGZpbGVzIGlmIGFwcGxpY2FibGUKICAgIGlmIFtbICIkQk9PVFNUUkFQX1BST0pFQ1RfVFlQRSIgPT0gIndvcmRwcmVzcyIgXV07IHRoZW4KICAgICAgICBwcmludF9pbmZvICJXUCBjb250ZXh0OiByZXBvPSckQk9PVFNUUkFQX1JFUE9fQ09OVEVYVCcgY29tcG9uZW50PSckQk9PVFNUUkFQX1dQX0NPTVBPTkVOVF9UWVBFJyBwYXRoPSckQk9PVFNUUkFQX1dQX1BBVEgnIiAiYWx3YXlzIgogICAgICAgIGlmIFtbICIkQk9PVFNUUkFQX1dQX0NPTVBPTkVOVF9UWVBFIiA9PSAidGhlbWUiIF1dOyB0aGVuCiAgICAgICAgICAgIHByaW50X2luZm8gIkNoZWNraW5nIGZvciB0aGVtZSBzdHlsZXNoZWV0OiAkQk9PVFNUUkFQX1dQX1BBVEgvc3R5bGUuY3NzIiAiYWx3YXlzIgogICAgICAgICAgICBpZiBbWyAtbiAiJEJPT1RTVFJBUF9XUF9QQVRIIiAmJiAtZiAiJEJPT1RTVFJBUF9XUF9QQVRIL3N0eWxlLmNzcyIgXV07IHRoZW4KICAgICAgICAgICAgICAgIHZlcnNpb25fc291cmNlcys9KCIkQk9PVFNUUkFQX1dQX1BBVEgvc3R5bGUuY3NzIikKICAgICAgICAgICAgICAgIGlmIFtbIC16ICIkcmVjb21tZW5kZWRfc291cmNlIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkX3NvdXJjZT0iJEJPT1RTVFJBUF9XUF9QQVRIL3N0eWxlLmNzcyIKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHByaW50X2luZm8gInN0eWxlLmNzcyBub3QgZm91bmQgYXQgJyRCT09UU1RSQVBfV1BfUEFUSC9zdHlsZS5jc3MnIiAiYWx3YXlzIgogICAgICAgICAgICAgICAgIyBGYWxsYmFjazogcGFja2FnZS5qc29uIHdpdGhpbiB0aGVtZSBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIGlmIFtbIC1mICIkQk9PVFNUUkFQX1dQX1BBVEgvcGFja2FnZS5qc29uIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIHZlcnNpb25fc291cmNlcys9KCIkQk9PVFNUUkFQX1dQX1BBVEgvcGFja2FnZS5qc29uIikKICAgICAgICAgICAgICAgICAgICBpZiBbWyAteiAiJHJlY29tbWVuZGVkX3NvdXJjZSIgXV07IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZWRfc291cmNlPSIkQk9PVFNUUkFQX1dQX1BBVEgvcGFja2FnZS5qc29uIgogICAgICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICBmaQogICAgICAgIGVsaWYgW1sgIiRCT09UU1RSQVBfV1BfQ09NUE9ORU5UX1RZUEUiID09ICJwbHVnaW4iIF1dOyB0aGVuCiAgICAgICAgICAgICMgUHJlZmVyIHJlYWRtZS50eHQgb3IgZm9sZGVyLW1hdGNoaW5nIG1haW4gUEhQIGZpbGUKICAgICAgICAgICAgbG9jYWwgcGx1Z2luX3JlYWRtZT0iJEJPT1RTVFJBUF9XUF9QQVRIL3JlYWRtZS50eHQiCiAgICAgICAgICAgIGxvY2FsIHBsdWdpbl9zbHVnCiAgICAgICAgICAgIHBsdWdpbl9zbHVnPSQoYmFzZW5hbWUgIiRCT09UU1RSQVBfV1BfUEFUSCIpCiAgICAgICAgICAgIGxvY2FsIHBsdWdpbl9zbHVnX3BocD0iJEJPT1RTVFJBUF9XUF9QQVRILyRwbHVnaW5fc2x1Zy5waHAiCgogICAgICAgICAgICBpZiBbWyAtZiAiJHBsdWdpbl9yZWFkbWUiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF9pbmZvICJVc2luZyBwbHVnaW4gcmVhZG1lLnR4dCBhcyB2ZXJzaW9uIHNvdXJjZTogJHBsdWdpbl9yZWFkbWUiICJhbHdheXMiCiAgICAgICAgICAgICAgICB2ZXJzaW9uX3NvdXJjZXMrPSgiJHBsdWdpbl9yZWFkbWUiKQogICAgICAgICAgICAgICAgaWYgW1sgLXogIiRyZWNvbW1lbmRlZF9zb3VyY2UiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZWRfc291cmNlPSIkcGx1Z2luX3JlYWRtZSIKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGVsaWYgW1sgLWYgIiRwbHVnaW5fc2x1Z19waHAiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF9pbmZvICJVc2luZyBwbHVnaW4gbWFpbiBmaWxlIGFzIHZlcnNpb24gc291cmNlOiAkcGx1Z2luX3NsdWdfcGhwIiAiYWx3YXlzIgogICAgICAgICAgICAgICAgdmVyc2lvbl9zb3VyY2VzKz0oIiRwbHVnaW5fc2x1Z19waHAiKQogICAgICAgICAgICAgICAgaWYgW1sgLXogIiRyZWNvbW1lbmRlZF9zb3VyY2UiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZWRfc291cmNlPSIkcGx1Z2luX3NsdWdfcGhwIgogICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIyBGYWxsYmFjazogZmluZCBhbnkgcGx1Z2luIG1haW4gZmlsZSB3aXRoIGhlYWRlcgogICAgICAgICAgICAgICAgbG9jYWwgcGx1Z2luX21haW4KICAgICAgICAgICAgICAgIHBsdWdpbl9tYWluPSQoZmluZCAiJEJPT1RTVFJBUF9XUF9QQVRIIiAtbWF4ZGVwdGggMSAtbmFtZSAiKi5waHAiIC1leGVjIGdyZXAgLWwgIlBsdWdpbiBOYW1lOiIge30gXDsgMj4vZGV2L251bGwgfCBoZWFkIC0xKQogICAgICAgICAgICAgICAgcHJpbnRfaW5mbyAiQ2hlY2tpbmcgZm9yIHBsdWdpbiBtYWluIGZpbGUgaW46ICRCT09UU1RSQVBfV1BfUEFUSCAoZm91bmQ6ICR7cGx1Z2luX21haW46LW5vbmV9KSIgImFsd2F5cyIKICAgICAgICAgICAgICAgIGlmIFtbIC1uICIkcGx1Z2luX21haW4iICYmIC1mICIkcGx1Z2luX21haW4iIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9zb3VyY2VzKz0oIiRwbHVnaW5fbWFpbiIpCiAgICAgICAgICAgICAgICAgICAgaWYgW1sgLXogIiRyZWNvbW1lbmRlZF9zb3VyY2UiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkX3NvdXJjZT0iJHBsdWdpbl9tYWluIgogICAgICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcHJpbnRfaW5mbyAiTm8gcGx1Z2luIHJlYWRtZSBvciBtYWluIGZpbGUgZm91bmQgaW4gJyRCT09UU1RSQVBfV1BfUEFUSCciICJhbHdheXMiCiAgICAgICAgICAgICAgICAgICAgIyBGYWxsYmFjazogcGFja2FnZS5qc29uIHdpdGhpbiBwbHVnaW4gZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgaWYgW1sgLWYgIiRCT09UU1RSQVBfV1BfUEFUSC9wYWNrYWdlLmpzb24iIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fc291cmNlcys9KCIkQk9PVFNUUkFQX1dQX1BBVEgvcGFja2FnZS5qc29uIikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgW1sgLXogIiRyZWNvbW1lbmRlZF9zb3VyY2UiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRlZF9zb3VyY2U9IiRCT09UU1RSQVBfV1BfUEFUSC9wYWNrYWdlLmpzb24iCiAgICAgICAgICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgIGZpCgogICAgaWYgW1sgJHsjdmVyc2lvbl9zb3VyY2VzW0BdfSAtZXEgMCBdXTsgdGhlbgogICAgICAgIHByaW50X2luZm8gIk5vIHZlcnNpb24gZmlsZXMgZm91bmQgaW4gcmVwbyByb290LiBPcHRpb25zOiIgImFsd2F5cyIKICAgICAgICBwcmludF9pbmZvICJHdWlkYW5jZToiICJhbHdheXMiCiAgICAgICAgZWNobyAiICAtIFZFUlNJT046IHNpbmdsZS1saW5lIHNlbWFudGljIHZlcnNpb24gKHZlcnkgc2ltcGxlKSIKICAgICAgICBlY2hvICIgIC0gdmVyc2lvbi50eHQ6IHNhbWUgYXMgVkVSU0lPTiBidXQgYSBtb3JlIGV4cGxpY2l0IG5hbWUiCiAgICAgICAgZWNobyAiICAtIHBhY2thZ2UuanNvbjogYmVzdCBpZiB5b3UgYWxyZWFkeSB1c2UgTm9kZSB0b29saW5nIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICIxKSBDcmVhdGUgYSBWRVJTSU9OIGZpbGUgKHJlY29tbWVuZGVkIGZvciBzaW1wbGUgcHJvamVjdHMpIgogICAgICAgIGVjaG8gIjIpIENyZWF0ZSBhIHZlcnNpb24udHh0IGZpbGUgKHNpbXBsZSwgZXhwbGljaXQpIgogICAgICAgIGVjaG8gIjMpIENyZWF0ZSBhIHBhY2thZ2UuanNvbiBmaWxlIChyZWNvbW1lbmRlZCBmb3IgTm9kZS5qcyBwcm9qZWN0cykiCiAgICAgICAgZWNobyAiNCkgU2tpcCB2ZXJzaW9uaW5nIChBSSBjb21taXRzIG9ubHkpIgogICAgICAgIGVjaG8gIjUpIFNwZWNpZnkgYSBmaWxlIHBhdGggbWFudWFsbHkiCiAgICAgICAgcHJpbnRfcHJvbXB0ICJFbnRlciBjaG9pY2UgWzEtNV06ICIKICAgICAgICByZWFkIC1yIHZlcnNpb25fY2hvaWNlCgogICAgICAgIGNhc2UgIiR2ZXJzaW9uX2Nob2ljZSIgaW4KICAgICAgICAgICAgMSkKICAgICAgICAgICAgICAgIGVjaG8gIjEuMC4wIiA+IFZFUlNJT04KICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkX3NvdXJjZT0iVkVSU0lPTiIKICAgICAgICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIuKckyBDcmVhdGVkIFZFUlNJT04gZmlsZSB3aXRoIGluaXRpYWwgdmVyc2lvbiAxLjAuMCIKICAgICAgICAgICAgICAgICMgU2V0IHR5cGUgaGludHMgZm9yIFZFUlNJT04gZmlsZQogICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX1RZUEU9InR4dCIKICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9MSU5FX1NUQVJUPSIiCiAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICAyKQogICAgICAgICAgICAgICAgZWNobyAiMS4wLjAiID4gdmVyc2lvbi50eHQKICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkX3NvdXJjZT0idmVyc2lvbi50eHQiCiAgICAgICAgICAgICAgICBwcmludF9zdWNjZXNzICLinJMgQ3JlYXRlZCB2ZXJzaW9uLnR4dCB3aXRoIGluaXRpYWwgdmVyc2lvbiAxLjAuMCIKICAgICAgICAgICAgICAgICMgU2V0IHR5cGUgaGludHMgZm9yIHZlcnNpb24udHh0CiAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1ZFUlNJT05fVFlQRT0idHh0IgogICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX0xJTkVfU1RBUlQ9IiIKICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgIDMpCiAgICAgICAgICAgICAgICBjcmVhdGVfYmFzaWNfcGFja2FnZV9qc29uCiAgICAgICAgICAgICAgICByZWNvbW1lbmRlZF9zb3VyY2U9InBhY2thZ2UuanNvbiIKICAgICAgICAgICAgICAgICMgU2V0IHR5cGUgaGludHMgZm9yIHBhY2thZ2UuanNvbgogICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX1RZUEU9Impzb24iCiAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1ZFUlNJT05fTElORV9TVEFSVD0iIgogICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgNCkKICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9TT1VSQ0U9IiIKICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfRkVBVFVSRVM9ImFpX29ubHkiCiAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgNSkKICAgICAgICAgICAgICAgIHByaW50X3Byb21wdCAiRW50ZXIgdGhlIHBhdGggdG8gdGhlIHZlcnNpb24gZmlsZSAocmVsYXRpdmUgdG8gcmVwbyByb290KTogIgogICAgICAgICAgICAgICAgcmVhZCAtciBtYW51YWxfcGF0aAogICAgICAgICAgICAgICAgd2hpbGUgW1sgISAtZiAiJG1hbnVhbF9wYXRoIiBdXTsgZG8KICAgICAgICAgICAgICAgICAgICBwcmludF93YXJuaW5nICJGaWxlICckbWFudWFsX3BhdGgnIG5vdCBmb3VuZC4iCiAgICAgICAgICAgICAgICAgICAgcHJpbnRfcHJvbXB0ICJFbnRlciBhIHZhbGlkIGZpbGUgcGF0aDogIgogICAgICAgICAgICAgICAgICAgIHJlYWQgLXIgbWFudWFsX3BhdGgKICAgICAgICAgICAgICAgIGRvbmUKICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkX3NvdXJjZT0iJG1hbnVhbF9wYXRoIgogICAgICAgICAgICAgICAgIyBCZXN0LWVmZm9ydCB0eXBlIGRldGVjdGlvbiBmb3IgbWFudWFsIGNob2ljZQogICAgICAgICAgICAgICAgaWYgW1sgIiRtYW51YWxfcGF0aCIgPT0gKi5qc29uIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX1RZUEU9Impzb24iCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX0xJTkVfU1RBUlQ9IiIKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1ZFUlNJT05fVFlQRT0idHh0IgogICAgICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9MSU5FX1NUQVJUPSIiCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgOzsKICAgICAgICBlc2FjCiAgICBlbHNlCiAgICAgICAgcHJpbnRfaW5mbyAiRm91bmQgdmVyc2lvbiBmaWxlczogJHt2ZXJzaW9uX3NvdXJjZXNbKl19IiAiYWx3YXlzIgogICAgICAgIGlmIFtbIC1uICIkRVhJU1RJTkdfVkVSU0lPTl9TT1VSQ0UiIF1dOyB0aGVuCiAgICAgICAgICAgIHByaW50X2luZm8gIkN1cnJlbnQ6ICRFWElTVElOR19WRVJTSU9OX1NPVVJDRSIgImFsd2F5cyIKICAgICAgICBmaQogICAgICAgIGlmIFtbIC1uICIkcmVjb21tZW5kZWRfc291cmNlIiBdXTsgdGhlbgogICAgICAgICAgICBwcmludF9pbmZvICJSZWNvbW1lbmRlZDogJHJlY29tbWVuZGVkX3NvdXJjZSIgImFsd2F5cyIKICAgICAgICBmaQoKICAgICAgICAjIEJyaWVmIGFkdmljZSB3aGVuIG11bHRpcGxlIHZlcnNpb24gc291cmNlcyBhcmUgcHJlc2VudAogICAgICAgIGlmIFtbICR7I3ZlcnNpb25fc291cmNlc1tAXX0gLWd0IDEgXV07IHRoZW4KICAgICAgICAgICAgcHJpbnRfaW5mbyAiVGlwOiBQcmVmZXIgYSBzaW5nbGUgc291cmNlIG9mIHRydXRoLiBWRVJTSU9OL3ZlcnNpb24udHh0IGFyZSBzaW1wbGVzdDsgcGFja2FnZS5qc29uIGludGVncmF0ZXMgd2l0aCBOb2RlLiIgImFsd2F5cyIKICAgICAgICBmaQoKICAgICAgICAjIExldCB1c2VyIGNob29zZSAod2l0aCBtYW51YWwgb3B0aW9uKQogICAgICAgIGVjaG8gIlNlbGVjdCB2ZXJzaW9uIHNvdXJjZToiCiAgICAgICAgZm9yIGkgaW4gIiR7IXZlcnNpb25fc291cmNlc1tAXX0iOyBkbwogICAgICAgICAgICBlY2hvICIkKChpKzEpKSkgJHt2ZXJzaW9uX3NvdXJjZXNbaV19IgogICAgICAgIGRvbmUKICAgICAgICBlY2hvICIwKSBFbnRlciBhIGRpZmZlcmVudCBmaWxlIHBhdGgiCiAgICAgICAgaWYgW1sgLW4gIiRFWElTVElOR19WRVJTSU9OX1NPVVJDRSIgXV07IHRoZW4KICAgICAgICAgICAgcHJpbnRfcHJvbXB0ICJFbnRlciBjaG9pY2UgWzAtJHsjdmVyc2lvbl9zb3VyY2VzW0BdfSwgRW50ZXIgdG8ga2VlcCBjdXJyZW50XTogIgogICAgICAgIGVsc2UKICAgICAgICAgICAgaWYgW1sgLW4gIiRyZWNvbW1lbmRlZF9zb3VyY2UiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF9wcm9tcHQgIkVudGVyIGNob2ljZSBbMC0keyN2ZXJzaW9uX3NvdXJjZXNbQF19LCBFbnRlciBmb3IgcmVjb21tZW5kZWQ6ICRyZWNvbW1lbmRlZF9zb3VyY2VdOiAiCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHByaW50X3Byb21wdCAiRW50ZXIgY2hvaWNlIFswLSR7I3ZlcnNpb25fc291cmNlc1tAXX1dOiAiCiAgICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgICAgICByZWFkIC1yIHNvdXJjZV9jaG9pY2UKCiAgICAgICAgaWYgW1sgLXogIiRzb3VyY2VfY2hvaWNlIiAmJiAtbiAiJEVYSVNUSU5HX1ZFUlNJT05fU09VUkNFIiBdXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1ZFUlNJT05fU09VUkNFPSIkRVhJU1RJTkdfVkVSU0lPTl9TT1VSQ0UiCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZWxpZiBbWyAteiAiJHNvdXJjZV9jaG9pY2UiICYmIC1uICIkcmVjb21tZW5kZWRfc291cmNlIiBdXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1ZFUlNJT05fU09VUkNFPSIkcmVjb21tZW5kZWRfc291cmNlIgogICAgICAgIGVsaWYgW1sgIiRzb3VyY2VfY2hvaWNlIiA9PSAiMCIgXV07IHRoZW4KICAgICAgICAgICAgIyBNYW51YWwgZW50cnkgcGF0aAogICAgICAgICAgICBwcmludF9wcm9tcHQgIkVudGVyIHRoZSBwYXRoIHRvIHRoZSB2ZXJzaW9uIGZpbGUgKHJlbGF0aXZlIHRvIHJlcG8gcm9vdCk6ICIKICAgICAgICAgICAgcmVhZCAtciBtYW51YWxfcGF0aAogICAgICAgICAgICB3aGlsZSBbWyAhIC1mICIkbWFudWFsX3BhdGgiIF1dOyBkbwogICAgICAgICAgICAgICAgcHJpbnRfd2FybmluZyAiRmlsZSAnJG1hbnVhbF9wYXRoJyBub3QgZm91bmQuIgogICAgICAgICAgICAgICAgcHJpbnRfcHJvbXB0ICJFbnRlciBhIHZhbGlkIGZpbGUgcGF0aDogIgogICAgICAgICAgICAgICAgcmVhZCAtciBtYW51YWxfcGF0aAogICAgICAgICAgICBkb25lCiAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9TT1VSQ0U9IiRtYW51YWxfcGF0aCIKICAgICAgICAgICAgIyBCZXN0LWVmZm9ydCB0eXBlIGRldGVjdGlvbiBmb3IgbWFudWFsIGNob2ljZQogICAgICAgICAgICBpZiBbWyAiJG1hbnVhbF9wYXRoIiA9PSAqLmpzb24gXV07IHRoZW4KICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9UWVBFPSJqc29uIgogICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX0xJTkVfU1RBUlQ9IiIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX1RZUEU9InR4dCIKICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9MSU5FX1NUQVJUPSIiCiAgICAgICAgICAgIGZpCiAgICAgICAgZWxpZiBbWyAiJHNvdXJjZV9jaG9pY2UiID1+IF5bMC05XSskIF1dICYmIFtbICIkc291cmNlX2Nob2ljZSIgLWdlIDEgXV0gJiYgW1sgIiRzb3VyY2VfY2hvaWNlIiAtbGUgJHsjdmVyc2lvbl9zb3VyY2VzW0BdfSBdXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1ZFUlNJT05fU09VUkNFPSIke3ZlcnNpb25fc291cmNlc1skKChzb3VyY2VfY2hvaWNlLTEpKV19IgogICAgICAgIGVsc2UKICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX1NPVVJDRT0iJHJlY29tbWVuZGVkX3NvdXJjZSIKICAgICAgICBmaQoKICAgICAgICAjIEluZmVyIHR5cGUgYW5kIGxpbmUgc3RhcnQgZm9yIGV4cGxpY2l0IHNlbGVjdGlvbgogICAgICAgIGxvY2FsIGNob3Nlbl9zb3VyY2U9IiRCT09UU1RSQVBfVkVSU0lPTl9TT1VSQ0UiCiAgICAgICAgaWYgW1sgIiRCT09UU1RSQVBfUFJPSkVDVF9UWVBFIiA9PSAid29yZHByZXNzIiBdXTsgdGhlbgogICAgICAgICAgICBpZiBbWyAiJEJPT1RTVFJBUF9XUF9DT01QT05FTlRfVFlQRSIgPT0gInRoZW1lIiAmJiAiJGNob3Nlbl9zb3VyY2UiID09ICIkQk9PVFNUUkFQX1dQX1BBVEgvc3R5bGUuY3NzIiBdXTsgdGhlbgogICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX1RZUEU9InR4dCIKICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9MSU5FX1NUQVJUPSJWZXJzaW9uOiIKICAgICAgICAgICAgZWxpZiBbWyAiJEJPT1RTVFJBUF9XUF9DT01QT05FTlRfVFlQRSIgPT0gInBsdWdpbiIgXV07IHRoZW4KICAgICAgICAgICAgICAgIGlmIFtbICIkY2hvc2VuX3NvdXJjZSIgPT0gIiRCT09UU1RSQVBfV1BfUEFUSC9yZWFkbWUudHh0IiBdXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9UWVBFPSJ0eHQiCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX0xJTkVfU1RBUlQ9IlN0YWJsZSB0YWc6IgogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICMgSWYgYSBQSFAgZmlsZSB3YXMgY2hvc2VuLCB1c2UgcGx1Z2luIGhlYWRlciB2ZXJzaW9uIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICBpZiBbWyAiJGNob3Nlbl9zb3VyY2UiID09ICoucGhwIF1dOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9UWVBFPSJ0eHQiCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9MSU5FX1NUQVJUPSJWZXJzaW9uOiIKICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgZmkKICAgICAgICBmaQogICAgICAgICMgR2VuZXJpYyBmYWxsYmFja3MKICAgICAgICBpZiBbWyAteiAiJEJPT1RTVFJBUF9WRVJTSU9OX1RZUEUiIF1dOyB0aGVuCiAgICAgICAgICAgIGlmIFtbICIkY2hvc2VuX3NvdXJjZSIgPT0gKiJwYWNrYWdlLmpzb24iIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1ZFUlNJT05fVFlQRT0ianNvbiIKICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9MSU5FX1NUQVJUPSIiCiAgICAgICAgICAgIGVsaWYgW1sgIiRjaG9zZW5fc291cmNlIiA9PSAqIlZFUlNJT04iIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1ZFUlNJT05fVFlQRT0idHh0IgogICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX0xJTkVfU1RBUlQ9IiIKICAgICAgICAgICAgZWxpZiBbWyAiJGNob3Nlbl9zb3VyY2UiID09ICoidmVyc2lvbi50eHQiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1ZFUlNJT05fVFlQRT0idHh0IgogICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX0xJTkVfU1RBUlQ9IiIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIyBEZWZhdWx0IHRvIHRleHQgd2l0aCBubyBwcmVmaXggaWYgdW5rbm93bgogICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9WRVJTSU9OX1RZUEU9InR4dCIKICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfVkVSU0lPTl9MSU5FX1NUQVJUPSIiCiAgICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgIGZpCgogICAgcHJpbnRfc3VjY2VzcyAi4pyTIFZlcnNpb24gc291cmNlOiAke0JPT1RTVFJBUF9WRVJTSU9OX1NPVVJDRX0iCiAgICBpZiBbWyAtbiAiJEJPT1RTVFJBUF9WRVJTSU9OX1RZUEUiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiICBUeXBlOiAkQk9PVFNUUkFQX1ZFUlNJT05fVFlQRSIgImFsd2F5cyIKICAgIGZpCiAgICBpZiBbWyAtbiAiJEJPT1RTVFJBUF9WRVJTSU9OX0xJTkVfU1RBUlQiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiICBMaW5lIHN0YXJ0L3BhdHRlcm46ICRCT09UU1RSQVBfVkVSU0lPTl9MSU5FX1NUQVJUIiAiYWx3YXlzIgogICAgZmkKCiAgICAjIElmIHR5cGUgaXMgdGV4dCBhbmQgbm8gZXhwbGljaXQgbGluZSBzdGFydCB3YXMgc2V0LCBpbmZlciBpdCBmcm9tIHRoZSBmaWxlCiAgICBpZiBbWyAiJEJPT1RTVFJBUF9WRVJTSU9OX1RZUEUiID09ICJ0eHQiICYmIC16ICIkQk9PVFNUUkFQX1ZFUlNJT05fTElORV9TVEFSVCIgJiYgLW4gIiRCT09UU1RSQVBfVkVSU0lPTl9TT1VSQ0UiIF1dOyB0aGVuCiAgICAgICAgbG9jYWwgaW5mZXJyZWRfcHJlZml4CiAgICAgICAgaW5mZXJyZWRfcHJlZml4PSIkKGluZmVyX3ZlcnNpb25fcHJlZml4X2Zyb21fZmlsZSAiJEJPT1RTVFJBUF9WRVJTSU9OX1NPVVJDRSIpIgogICAgICAgIGlmIFtbIC1uICIkaW5mZXJyZWRfcHJlZml4IiBdXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1ZFUlNJT05fTElORV9TVEFSVD0iJGluZmVycmVkX3ByZWZpeCIKICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyTIERldGVjdGVkIHZlcnNpb24gcHJlZml4IGZyb20gZmlsZTogJyRCT09UU1RSQVBfVkVSU0lPTl9MSU5FX1NUQVJUJyIKICAgICAgICBmaQogICAgZmkKCiAgICAjIENvbmZpZ3VyZSBjaGFuZ2Vsb2cgbG9jYXRpb24gZGVmYXVsdGluZyB0byB0aGUgdmVyc2lvbiBmaWxlJ3MgZGlyZWN0b3J5LAogICAgIyBidXQgcHJlZmVyIGFueSBleGlzdGluZyBjaGFuZ2Vsb2cgaW4gcm9vdCBvciB0aGF0IGRpcmVjdG9yeSAoY2FzZS1pbnNlbnNpdGl2ZSkKICAgIGxvY2FsIHZlcnNpb25fZGlyCiAgICBpZiBbWyAtbiAiJEJPT1RTVFJBUF9WRVJTSU9OX1NPVVJDRSIgJiYgIiRCT09UU1RSQVBfVkVSU0lPTl9TT1VSQ0UiID09ICovKiBdXTsgdGhlbgogICAgICAgIHZlcnNpb25fZGlyPSIkKGRpcm5hbWUgIiRCT09UU1RSQVBfVkVSU0lPTl9TT1VSQ0UiKSIKICAgIGVsc2UKICAgICAgICB2ZXJzaW9uX2Rpcj0iLiIKICAgIGZpCgogICAgbG9jYWwgZXhpc3RpbmdfY2hhbmdlbG9nCiAgICBleGlzdGluZ19jaGFuZ2Vsb2c9IiQoZmluZF9leGlzdGluZ19jaGFuZ2Vsb2cgIi4iICIkdmVyc2lvbl9kaXIiKSIKICAgIGlmIFtbIC1uICIkZXhpc3RpbmdfY2hhbmdlbG9nIiBdXTsgdGhlbgogICAgICAgIGxvY2FsIGV4aXN0aW5nX2RpciBleGlzdGluZ19uYW1lCiAgICAgICAgZXhpc3RpbmdfZGlyPSIkKGRpcm5hbWUgIiRleGlzdGluZ19jaGFuZ2Vsb2ciKSIKICAgICAgICBleGlzdGluZ19uYW1lPSIkKGJhc2VuYW1lICIkZXhpc3RpbmdfY2hhbmdlbG9nIikiCiAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9DSEFOR0VMT0dfUEFUSD0iJGV4aXN0aW5nX2RpciIKICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0NIQU5HRUxPR19OQU1FPSIkZXhpc3RpbmdfbmFtZSIKICAgICAgICBwcmludF9zdWNjZXNzICLinJMgVXNpbmcgZXhpc3RpbmcgY2hhbmdlbG9nOiAkZXhpc3RpbmdfY2hhbmdlbG9nIgogICAgZWxzZQogICAgICAgIGV4cG9ydCBCT09UU1RSQVBfQ0hBTkdFTE9HX1BBVEg9IiR2ZXJzaW9uX2RpciIKICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0NIQU5HRUxPR19OQU1FPSJDSEFOR0VMT0cubWQiCiAgICAgICAgcHJpbnRfaW5mbyAiRGVmYXVsdGluZyBjaGFuZ2Vsb2cgdG8gJEJPT1RTVFJBUF9DSEFOR0VMT0dfUEFUSC8kQk9PVFNUUkFQX0NIQU5HRUxPR19OQU1FIiAiYWx3YXlzIgogICAgZmkKfQoKY3JlYXRlX2Jhc2ljX3BhY2thZ2VfanNvbigpIHsKICAgIGxvY2FsIHByb2plY3RfbmFtZQogICAgcHJvamVjdF9uYW1lPSQoYmFzZW5hbWUgIiQocHdkKSIpCiAgICBjYXQgPiBwYWNrYWdlLmpzb24gPDwgRU9GCnsKICAibmFtZSI6ICIkcHJvamVjdF9uYW1lIiwKICAidmVyc2lvbiI6ICIxLjAuMCIsCiAgImRlc2NyaXB0aW9uIjogIiIsCiAgIm1haW4iOiAiaW5kZXguanMiLAogICJzY3JpcHRzIjogewogICAgInRlc3QiOiAiZWNobyBcIkVycm9yOiBubyB0ZXN0IHNwZWNpZmllZFwiICYmIGV4aXQgMSIKICB9LAogICJrZXl3b3JkcyI6IFtdLAogICJhdXRob3IiOiAiIiwKICAibGljZW5zZSI6ICJJU0MiCn0KRU9GCiAgICBwcmludF9zdWNjZXNzICLinJMgQ3JlYXRlZCBiYXNpYyBwYWNrYWdlLmpzb24gd2l0aCB2ZXJzaW9uIDEuMC4wIgp9CgojIFN0ZXAgNDogQ2hvb3NlIE1BSUFTUyBmZWF0dXJlcwpjaG9vc2VfbWFpYXNzX2ZlYXR1cmVzKCkgewogICAgcHJpbnRfc2VjdGlvbiAi4pqZ77iPIEZlYXR1cmUgU2VsZWN0aW9uIgoKICAgIGlmIFtbICIkQk9PVFNUUkFQX0ZFQVRVUkVTIiA9PSAiYWlfb25seSIgXV07IHRoZW4KICAgICAgICBwcmludF9pbmZvICJGZWF0dXJlczogQUkgY29tbWl0IG1lc3NhZ2VzIG9ubHkgKG5vIHZlcnNpb24gZmlsZXMpIiAiYWx3YXlzIgogICAgICAgIHJldHVybiAwCiAgICBmaQoKICAgIHByaW50X2luZm8gIldoYXQgTUFJQVNTIGZlYXR1cmVzIHdvdWxkIHlvdSBsaWtlIHRvIHVzZT8iICJhbHdheXMiCiAgICBlY2hvICIxKSBGdWxsIHdvcmtmbG93ICh2ZXJzaW9uaW5nICsgY2hhbmdlbG9nICsgQUkgY29tbWl0cykiCiAgICBlY2hvICIyKSBWZXJzaW9uaW5nIG9ubHkgKHZlcnNpb24gYnVtcGluZyB3aXRob3V0IGNoYW5nZWxvZykiCiAgICBlY2hvICIzKSBBSSBjb21taXQgbWVzc2FnZXMgb25seSIKCiAgICAjIFNob3cgZXhpc3RpbmcgdmFsdWUgaWYgYXZhaWxhYmxlCiAgICBpZiBbWyAiJEVYSVNUSU5HX0ZFQVRVUkVTIiA9PSAiYWlfb25seSIgXV07IHRoZW4KICAgICAgICBwcmludF9wcm9tcHQgIkVudGVyIGNob2ljZSBbMS0zLCBjdXJyZW50OiAzXTogIgogICAgZWxzZQogICAgICAgIHByaW50X3Byb21wdCAiRW50ZXIgY2hvaWNlIFsxLTMsIGRlZmF1bHQ6IDFdOiAiCiAgICBmaQogICAgcmVhZCAtciBmZWF0dXJlX2Nob2ljZQoKICAgICMgVXNlIGV4aXN0aW5nIHZhbHVlIGlmIG5vIGlucHV0IHByb3ZpZGVkCiAgICBpZiBbWyAteiAiJGZlYXR1cmVfY2hvaWNlIiAmJiAiJEVYSVNUSU5HX0ZFQVRVUkVTIiA9PSAiYWlfb25seSIgXV07IHRoZW4KICAgICAgICBmZWF0dXJlX2Nob2ljZT0iMyIKICAgIGZpCgogICAgY2FzZSAiJGZlYXR1cmVfY2hvaWNlIiBpbgogICAgICAgIDIpIGV4cG9ydCBCT09UU1RSQVBfRkVBVFVSRVM9InZlcnNpb25pbmdfb25seSIgOzsKICAgICAgICAzKSBleHBvcnQgQk9PVFNUUkFQX0ZFQVRVUkVTPSJhaV9vbmx5IiA7OwogICAgICAgICopIGV4cG9ydCBCT09UU1RSQVBfRkVBVFVSRVM9ImZ1bGwiIDs7CiAgICBlc2FjCgogICAgbG9jYWwgZmVhdHVyZV9kZXNjCiAgICBjYXNlICIkQk9PVFNUUkFQX0ZFQVRVUkVTIiBpbgogICAgICAgICJ2ZXJzaW9uaW5nX29ubHkiKSBmZWF0dXJlX2Rlc2M9IlZlcnNpb25pbmcgb25seSIgOzsKICAgICAgICAiYWlfb25seSIpIGZlYXR1cmVfZGVzYz0iQUkgY29tbWl0IG1lc3NhZ2VzIG9ubHkiIDs7CiAgICAgICAgKikgZmVhdHVyZV9kZXNjPSJGdWxsIHdvcmtmbG93ICh2ZXJzaW9uaW5nICsgY2hhbmdlbG9nICsgQUkpIiA7OwogICAgZXNhYwoKICAgIHByaW50X3N1Y2Nlc3MgIuKckyBGZWF0dXJlczogJGZlYXR1cmVfZGVzYyIKfQoKIyBTdGVwIDU6IENvbmZpZ3VyZSBicmFuY2ggc3RyYXRlZ3kKY29uZmlndXJlX2JyYW5jaF9zdHJhdGVneSgpIHsKICAgIHByaW50X3NlY3Rpb24gIvCfjL8gQnJhbmNoIFN0cmF0ZWd5IENvbmZpZ3VyYXRpb24iCgogICAgIyBEZXRlY3QgcHJvZHVjdGlvbiBicmFuY2ggKG1haW4gdnMgbWFzdGVyKQogICAgbG9jYWwgcHJvZHVjdGlvbl9icmFuY2g9IiIKICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IHJlZnMvaGVhZHMvbWFpbjsgdGhlbgogICAgICAgIHByb2R1Y3Rpb25fYnJhbmNoPSJtYWluIgogICAgZWxpZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCByZWZzL2hlYWRzL21hc3RlcjsgdGhlbgogICAgICAgIHByb2R1Y3Rpb25fYnJhbmNoPSJtYXN0ZXIiCiAgICBlbGlmIGdpdCBscy1yZW1vdGUgLS1oZWFkcyBvcmlnaW4gbWFpbiAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgbWFpbjsgdGhlbgogICAgICAgIHByb2R1Y3Rpb25fYnJhbmNoPSJtYWluIgogICAgZWxpZiBnaXQgbHMtcmVtb3RlIC0taGVhZHMgb3JpZ2luIG1hc3RlciAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgbWFzdGVyOyB0aGVuCiAgICAgICAgcHJvZHVjdGlvbl9icmFuY2g9Im1hc3RlciIKICAgIGVsc2UKICAgICAgICAjIE5vIG1haW4vbWFzdGVyIGZvdW5kIC0gZGVmYXVsdCB0byBtYWluCiAgICAgICAgcHJvZHVjdGlvbl9icmFuY2g9Im1haW4iCiAgICBmaQoKICAgICMgU2hvdyBleGlzdGluZyB2YWx1ZXMgaWYgYXZhaWxhYmxlCiAgICBpZiBbWyAtbiAiJEVYSVNUSU5HX01BSU5fQlJBTkNIIiBdXTsgdGhlbgogICAgICAgIHByaW50X2luZm8gIkN1cnJlbnQgcHJvZHVjdGlvbiBicmFuY2g6ICRFWElTVElOR19NQUlOX0JSQU5DSCIgImFsd2F5cyIKICAgICAgICBwcmludF9pbmZvICJEZXRlY3RlZCBwcm9kdWN0aW9uIGJyYW5jaDogJHByb2R1Y3Rpb25fYnJhbmNoIiAiYWx3YXlzIgogICAgICAgIGlmIFtbICIkRVhJU1RJTkdfTUFJTl9CUkFOQ0giICE9ICIkcHJvZHVjdGlvbl9icmFuY2giIF1dOyB0aGVuCiAgICAgICAgICAgIHByaW50X3Byb21wdCAiVXBkYXRlIHByb2R1Y3Rpb24gYnJhbmNoIHRvICRwcm9kdWN0aW9uX2JyYW5jaD8gW3kvTl06ICIKICAgICAgICAgICAgcmVhZCAtciB1cGRhdGVfbWFpbgogICAgICAgICAgICBpZiBbWyAiJHVwZGF0ZV9tYWluIiA9fiBeW1l5XSQgXV07IHRoZW4KICAgICAgICAgICAgICAgIHByb2R1Y3Rpb25fYnJhbmNoPSIkcHJvZHVjdGlvbl9icmFuY2giCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHByb2R1Y3Rpb25fYnJhbmNoPSIkRVhJU1RJTkdfTUFJTl9CUkFOQ0giCiAgICAgICAgICAgIGZpCiAgICAgICAgZWxzZQogICAgICAgICAgICBwcm9kdWN0aW9uX2JyYW5jaD0iJEVYSVNUSU5HX01BSU5fQlJBTkNIIgogICAgICAgIGZpCiAgICBlbHNlCiAgICAgICAgcHJpbnRfaW5mbyAiUHJvZHVjdGlvbiBicmFuY2ggKGZvciByZWxlYXNlcyk6ICRwcm9kdWN0aW9uX2JyYW5jaCIgImFsd2F5cyIKICAgIGZpCgogICAgIyBDaGVjayBpZiB2ZXJzaW9uaW5nIGZlYXR1cmVzIGFyZSBlbmFibGVkCiAgICBpZiBbWyAiJEJPT1RTVFJBUF9GRUFUVVJFUyIgPT0gImFpX29ubHkiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiQUktb25seSBtb2RlOiBCcmFuY2ggc3RyYXRlZ3kgaXMgZmxleGlibGUiICJhbHdheXMiCiAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9NQUlOX0JSQU5DSD0iJHByb2R1Y3Rpb25fYnJhbmNoIgogICAgICAgIGV4cG9ydCBCT09UU1RSQVBfREVWRUxPUF9CUkFOQ0g9IiIKICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICBwcmludF9pbmZvICJcbkdpdCBGbG93IHJlcXVpcmVzOiIgImFsd2F5cyIKICAgIHByaW50X2luZm8gIiAg4oCiIFByb2R1Y3Rpb24gYnJhbmNoICgkcHJvZHVjdGlvbl9icmFuY2gpIC0gZm9yIHJlbGVhc2VzL2RlcGxveW1lbnRzIiAiYWx3YXlzIgogICAgcHJpbnRfaW5mbyAiICDigKIgRGV2ZWxvcG1lbnQgYnJhbmNoIChkZXZlbG9wKSAtIHdoZXJlIHZlcnNpb25pbmcgaGFwcGVucyIgImFsd2F5cyIKCiAgICAjIEVuaGFuY2VkIGRldmVsb3AgYnJhbmNoIGRldGVjdGlvbiAtIGNoZWNrIGxvY2FsIGFuZCByZW1vdGUgZm9yIGRldmVsb3AvZGV2CiAgICBsb2NhbCBkZXZlbG9wX2JyYW5jaF9mb3VuZD0iIgogICAgbG9jYWwgZGV2ZWxvcF9sb2NhdGlvbj0iIgoKICAgICMgQ2hlY2sgbG9jYWwgYnJhbmNoZXMgZmlyc3QKICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IHJlZnMvaGVhZHMvZGV2ZWxvcDsgdGhlbgogICAgICAgIGRldmVsb3BfYnJhbmNoX2ZvdW5kPSJkZXZlbG9wIgogICAgICAgIGRldmVsb3BfbG9jYXRpb249ImxvY2FsIgogICAgICAgIHByaW50X2luZm8gIuKckyBGb3VuZCAnZGV2ZWxvcCcgYnJhbmNoIGxvY2FsbHkiICJhbHdheXMiCiAgICBlbGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IHJlZnMvaGVhZHMvZGV2OyB0aGVuCiAgICAgICAgZGV2ZWxvcF9icmFuY2hfZm91bmQ9ImRldiIKICAgICAgICBkZXZlbG9wX2xvY2F0aW9uPSJsb2NhbCIKICAgICAgICBwcmludF9pbmZvICLinJMgRm91bmQgJ2RldicgYnJhbmNoIGxvY2FsbHkiICJhbHdheXMiCiAgICAjIENoZWNrIHJlbW90ZSBicmFuY2hlcyBpZiBubyBsb2NhbCBkZXZlbG9wIGJyYW5jaCBmb3VuZAogICAgZWxpZiBnaXQgbHMtcmVtb3RlIC0taGVhZHMgb3JpZ2luIGRldmVsb3AgMj4vZGV2L251bGwgfCBncmVwIC1xIGRldmVsb3A7IHRoZW4KICAgICAgICBkZXZlbG9wX2JyYW5jaF9mb3VuZD0iZGV2ZWxvcCIKICAgICAgICBkZXZlbG9wX2xvY2F0aW9uPSJyZW1vdGUiCiAgICAgICAgcHJpbnRfaW5mbyAi4pyTIEZvdW5kICdkZXZlbG9wJyBicmFuY2ggb24gcmVtb3RlIiAiYWx3YXlzIgogICAgZWxpZiBnaXQgbHMtcmVtb3RlIC0taGVhZHMgb3JpZ2luIGRldiAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgZGV2OyB0aGVuCiAgICAgICAgZGV2ZWxvcF9icmFuY2hfZm91bmQ9ImRldiIKICAgICAgICBkZXZlbG9wX2xvY2F0aW9uPSJyZW1vdGUiCiAgICAgICAgcHJpbnRfaW5mbyAi4pyTIEZvdW5kICdkZXYnIGJyYW5jaCBvbiByZW1vdGUiICJhbHdheXMiCiAgICBmaQoKICAgICMgU2hvdyBleGlzdGluZyBkZXZlbG9wIGJyYW5jaCBpZiBhdmFpbGFibGUKICAgIGlmIFtbIC1uICIkRVhJU1RJTkdfREVWRUxPUF9CUkFOQ0giIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiQ3VycmVudCBkZXZlbG9wIGJyYW5jaDogJEVYSVNUSU5HX0RFVkVMT1BfQlJBTkNIIiAiYWx3YXlzIgoKICAgICAgICAjIENoZWNrIGlmIGV4aXN0aW5nIGNvbmZpZyBtYXRjaGVzIHdoYXQgd2UgZm91bmQKICAgICAgICBpZiBbWyAtbiAiJGRldmVsb3BfYnJhbmNoX2ZvdW5kIiAmJiAiJEVYSVNUSU5HX0RFVkVMT1BfQlJBTkNIIiA9PSAiJGRldmVsb3BfYnJhbmNoX2ZvdW5kIiBdXTsgdGhlbgogICAgICAgICAgICBpZiBbWyAiJGRldmVsb3BfbG9jYXRpb24iID09ICJyZW1vdGUiIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF9pbmZvICJFeGlzdGluZyBjb25maWcgbWF0Y2hlcyByZW1vdGUgYnJhbmNoICckZGV2ZWxvcF9icmFuY2hfZm91bmQnIiAiYWx3YXlzIgogICAgICAgICAgICAgICAgcHJpbnRfcHJvbXB0ICJDaGVjayBvdXQgcmVtb3RlICckZGV2ZWxvcF9icmFuY2hfZm91bmQnIGJyYW5jaCBsb2NhbGx5PyBbWS9uXTogIgogICAgICAgICAgICAgICAgcmVhZCAtciBjaGVja291dF9yZW1vdGUKICAgICAgICAgICAgICAgIGlmIFtbICEgIiRjaGVja291dF9yZW1vdGUiID1+IF5bTm5dJCBdXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIGlmIGdpdCBjaGVja291dCAtYiAiJGRldmVsb3BfYnJhbmNoX2ZvdW5kIiAib3JpZ2luLyRkZXZlbG9wX2JyYW5jaF9mb3VuZCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyTIENoZWNrZWQgb3V0ICckZGV2ZWxvcF9icmFuY2hfZm91bmQnIGZyb20gcmVtb3RlIgogICAgICAgICAgICAgICAgICAgICAgICBnaXQgY2hlY2tvdXQgLSA+L2Rldi9udWxsIDI+JjEKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3dhcm5pbmcgIkNvdWxkIG5vdCBjaGVjayBvdXQgcmVtb3RlIGJyYW5jaCIKICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgZmkKICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9ERVZFTE9QX0JSQU5DSD0iJEVYSVNUSU5HX0RFVkVMT1BfQlJBTkNIIgogICAgICAgICAgICBwcmludF9pbmZvICLinJMgVXNpbmcgZXhpc3RpbmcgZGV2ZWxvcCBicmFuY2g6ICRFWElTVElOR19ERVZFTE9QX0JSQU5DSCIgImFsd2F5cyIKICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9NQUlOX0JSQU5DSD0iJHByb2R1Y3Rpb25fYnJhbmNoIgogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGVsaWYgW1sgLXogIiRkZXZlbG9wX2JyYW5jaF9mb3VuZCIgXV07IHRoZW4KICAgICAgICAgICAgcHJpbnRfd2FybmluZyAiQ29uZmlndXJhdGlvbiBzaG93cyAnJEVYSVNUSU5HX0RFVkVMT1BfQlJBTkNIJyBicmFuY2ggYnV0IGl0IGRvZXNuJ3QgZXhpc3QgbG9jYWxseSBvciByZW1vdGVseSIgImFsd2F5cyIKICAgICAgICAgICAgcHJpbnRfcHJvbXB0ICJDcmVhdGUgbWlzc2luZyAnJEVYSVNUSU5HX0RFVkVMT1BfQlJBTkNIJyBicmFuY2g/IFtZL25dOiAiCiAgICAgICAgICAgIHJlYWQgLXIgY3JlYXRlX21pc3NpbmcKICAgICAgICAgICAgaWYgW1sgISAiJGNyZWF0ZV9taXNzaW5nIiA9fiBeW05uXSQgXV07IHRoZW4KICAgICAgICAgICAgICAgIGxvY2FsIGN1cnJlbnRfYnJhbmNoCiAgICAgICAgICAgICAgICBjdXJyZW50X2JyYW5jaD0kKGdpdCBzeW1ib2xpYy1yZWYgLS1zaG9ydCBIRUFEIDI+L2Rldi9udWxsIHx8IGVjaG8gIiRwcm9kdWN0aW9uX2JyYW5jaCIpCiAgICAgICAgICAgICAgICBpZiBnaXQgY2hlY2tvdXQgLWIgIiRFWElTVElOR19ERVZFTE9QX0JSQU5DSCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgICAgICBwcmludF9zdWNjZXNzICLinJMgQ3JlYXRlZCAnJEVYSVNUSU5HX0RFVkVMT1BfQlJBTkNIJyBicmFuY2giCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9ERVZFTE9QX0JSQU5DSD0iJEVYSVNUSU5HX0RFVkVMT1BfQlJBTkNIIgogICAgICAgICAgICAgICAgICAgIGdpdCBjaGVja291dCAiJGN1cnJlbnRfYnJhbmNoIiA+L2Rldi9udWxsIDI+JjEKICAgICAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX01BSU5fQlJBTkNIPSIkcHJvZHVjdGlvbl9icmFuY2giCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBwcmludF93YXJuaW5nICJDb3VsZCBub3QgY3JlYXRlICckRVhJU1RJTkdfREVWRUxPUF9CUkFOQ0gnIGJyYW5jaCIKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgIGZpCgogICAgIyBIYW5kbGUgY2FzZSB3aGVyZSB3ZSBmb3VuZCBhIGRldmVsb3AgYnJhbmNoIGJ1dCBubyBleGlzdGluZyBjb25maWcKICAgIGlmIFtbIC1uICIkZGV2ZWxvcF9icmFuY2hfZm91bmQiICYmIC16ICIkRVhJU1RJTkdfREVWRUxPUF9CUkFOQ0giIF1dOyB0aGVuCiAgICAgICAgaWYgW1sgIiRkZXZlbG9wX2xvY2F0aW9uIiA9PSAicmVtb3RlIiBdXTsgdGhlbgogICAgICAgICAgICBwcmludF9pbmZvICJGb3VuZCAnJGRldmVsb3BfYnJhbmNoX2ZvdW5kJyBicmFuY2ggb24gcmVtb3RlIiAiYWx3YXlzIgogICAgICAgICAgICBwcmludF9wcm9tcHQgIkNoZWNrIG91dCBhbmQgdXNlIHJlbW90ZSAnJGRldmVsb3BfYnJhbmNoX2ZvdW5kJyBicmFuY2g/IFtZL25dOiAiCiAgICAgICAgICAgIHJlYWQgLXIgdXNlX3JlbW90ZQogICAgICAgICAgICBpZiBbWyAhICIkdXNlX3JlbW90ZSIgPX4gXltObl0kIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBpZiBnaXQgY2hlY2tvdXQgLWIgIiRkZXZlbG9wX2JyYW5jaF9mb3VuZCIgIm9yaWdpbi8kZGV2ZWxvcF9icmFuY2hfZm91bmQiIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyTIENoZWNrZWQgb3V0ICckZGV2ZWxvcF9icmFuY2hfZm91bmQnIGZyb20gcmVtb3RlIgogICAgICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfREVWRUxPUF9CUkFOQ0g9IiRkZXZlbG9wX2JyYW5jaF9mb3VuZCIKICAgICAgICAgICAgICAgICAgICBnaXQgY2hlY2tvdXQgLSA+L2Rldi9udWxsIDI+JjEKICAgICAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX01BSU5fQlJBTkNIPSIkcHJvZHVjdGlvbl9icmFuY2giCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBwcmludF93YXJuaW5nICJDb3VsZCBub3QgY2hlY2sgb3V0IHJlbW90ZSBicmFuY2giCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICBmaQogICAgICAgIGVsc2UKICAgICAgICAgICAgIyBMb2NhbCBicmFuY2ggZm91bmQKICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9ERVZFTE9QX0JSQU5DSD0iJGRldmVsb3BfYnJhbmNoX2ZvdW5kIgogICAgICAgICAgICBwcmludF9zdWNjZXNzICLinJMgVXNpbmcgZXhpc3RpbmcgbG9jYWwgJyRkZXZlbG9wX2JyYW5jaF9mb3VuZCcgYnJhbmNoIiAiYWx3YXlzIgogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX01BSU5fQlJBTkNIPSIkcHJvZHVjdGlvbl9icmFuY2giCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZmkKICAgIGZpCgogICAgIyBObyBkZXZlbG9wIGJyYW5jaCBmb3VuZCAtIGNyZWF0ZSBpdAogICAgaWYgW1sgLXogIiRkZXZlbG9wX2JyYW5jaF9mb3VuZCIgXV07IHRoZW4KICAgICAgICBwcmludF9pbmZvICJcbk5vIGRldmVsb3BtZW50IGJyYW5jaCBmb3VuZC4iICJhbHdheXMiCiAgICAgICAgcHJpbnRfcHJvbXB0ICJDcmVhdGUgJ2RldmVsb3AnIGJyYW5jaCBmb3IgdmVyc2lvbmluZyB3b3JrZmxvdz8gW1kvbl06ICIKICAgICAgICByZWFkIC1yIGNyZWF0ZV9kZXZlbG9wCgogICAgICAgIGlmIFtbICIkY3JlYXRlX2RldmVsb3AiID1+IF5bTm5dJCBdXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0RFVkVMT1BfQlJBTkNIPSIiCiAgICAgICAgICAgIHByaW50X3dhcm5pbmcgIlNraXBwaW5nIGRldmVsb3BtZW50IGJyYW5jaCAtIHZlcnNpb24gbWFuYWdlbWVudCB3aWxsIGJlIGxpbWl0ZWQiICJhbHdheXMiCiAgICAgICAgZWxzZQogICAgICAgICAgICAjIENyZWF0ZSBkZXZlbG9wIGJyYW5jaAogICAgICAgICAgICBsb2NhbCBjdXJyZW50X2JyYW5jaAogICAgICAgICAgICBjdXJyZW50X2JyYW5jaD0kKGdpdCBzeW1ib2xpYy1yZWYgLS1zaG9ydCBIRUFEIDI+L2Rldi9udWxsIHx8IGVjaG8gIiRwcm9kdWN0aW9uX2JyYW5jaCIpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZiBnaXQgY2hlY2tvdXQgLWIgZGV2ZWxvcCAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyTIENyZWF0ZWQgJ2RldmVsb3AnIGJyYW5jaCIKICAgICAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfREVWRUxPUF9CUkFOQ0g9ImRldmVsb3AiCiAgICAgICAgICAgICAgICAjIFN3aXRjaCBiYWNrIHRvIG9yaWdpbmFsIGJyYW5jaAogICAgICAgICAgICAgICAgZ2l0IGNoZWNrb3V0ICIkY3VycmVudF9icmFuY2giID4vZGV2L251bGwgMj4mMQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwcmludF93YXJuaW5nICJDb3VsZCBub3QgY3JlYXRlICdkZXZlbG9wJyBicmFuY2giCiAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX0RFVkVMT1BfQlJBTkNIPSIiCiAgICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgIGZpCgogICAgZXhwb3J0IEJPT1RTVFJBUF9NQUlOX0JSQU5DSD0iJHByb2R1Y3Rpb25fYnJhbmNoIgoKICAgICMgQXNrIGFib3V0IHN0YWdpbmcgYnJhbmNoIChvcHRpb25hbCkKICAgIGxvY2FsIHN0YWdpbmdfYnJhbmNoPSIiCiAgICBsb2NhbCBzdGFnaW5nX2JyYW5jaF9leGlzdHM9ZmFsc2UKICAgIAogICAgIyBDaGVjayBpZiBzdGFnaW5nIGJyYW5jaCBleGlzdHMKICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IHJlZnMvaGVhZHMvc3RhZ2luZzsgdGhlbgogICAgICAgIHN0YWdpbmdfYnJhbmNoX2V4aXN0cz10cnVlCiAgICAgICAgc3RhZ2luZ19icmFuY2g9InN0YWdpbmciCiAgICBlbGlmIGdpdCBscy1yZW1vdGUgLS1oZWFkcyBvcmlnaW4gc3RhZ2luZyAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgc3RhZ2luZzsgdGhlbgogICAgICAgIHN0YWdpbmdfYnJhbmNoX2V4aXN0cz10cnVlCiAgICAgICAgc3RhZ2luZ19icmFuY2g9InN0YWdpbmciCiAgICBmaQogICAgCiAgICAjIFNob3cgZXhpc3Rpbmcgc3RhZ2luZyBjb25maWcgaWYgYXZhaWxhYmxlCiAgICBpZiBbWyAtbiAiJEVYSVNUSU5HX1NUQUdJTkdfQlJBTkNIIiBdXTsgdGhlbgogICAgICAgIHByaW50X2luZm8gIlxuQ3VycmVudCBzdGFnaW5nIGJyYW5jaDogJEVYSVNUSU5HX1NUQUdJTkdfQlJBTkNIIiAiYWx3YXlzIgogICAgICAgIHByaW50X3Byb21wdCAiS2VlcCBzdGFnaW5nIGJyYW5jaCBjb25maWd1cmF0aW9uPyBbWS9uXTogIgogICAgICAgIHJlYWQgLXIga2VlcF9zdGFnaW5nCiAgICAgICAgaWYgW1sgISAiJGtlZXBfc3RhZ2luZyIgPX4gXltObl0kIF1dOyB0aGVuCiAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfU1RBR0lOR19CUkFOQ0g9IiRFWElTVElOR19TVEFHSU5HX0JSQU5DSCIKICAgICAgICBlbHNlCiAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfU1RBR0lOR19CUkFOQ0g9IiIKICAgICAgICBmaQogICAgZWxpZiBbWyAiJHN0YWdpbmdfYnJhbmNoX2V4aXN0cyIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiXG5Gb3VuZCAnc3RhZ2luZycgYnJhbmNoIiAiYWx3YXlzIgogICAgICAgIHByaW50X3Byb21wdCAiVXNlICdzdGFnaW5nJyBicmFuY2ggZm9yIHByZS1wcm9kdWN0aW9uIHRlc3Rpbmc/IFtZL25dOiAiCiAgICAgICAgcmVhZCAtciB1c2Vfc3RhZ2luZwogICAgICAgIGlmIFtbICEgIiR1c2Vfc3RhZ2luZyIgPX4gXltObl0kIF1dOyB0aGVuCiAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfU1RBR0lOR19CUkFOQ0g9InN0YWdpbmciCiAgICAgICAgZWxzZQogICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1NUQUdJTkdfQlJBTkNIPSIiCiAgICAgICAgZmkKICAgIGVsc2UKICAgICAgICBwcmludF9pbmZvICJcbk9wdGlvbmFsOiBTdGFnaW5nIGJyYW5jaCBmb3IgcHJlLXByb2R1Y3Rpb24gdGVzdGluZyIgImFsd2F5cyIKICAgICAgICBwcmludF9wcm9tcHQgIkRvIHlvdSB1c2UgYSBzdGFnaW5nIGJyYW5jaD8gW3kvTl06ICIKICAgICAgICByZWFkIC1yIHVzZV9zdGFnaW5nCiAgICAgICAgaWYgW1sgIiR1c2Vfc3RhZ2luZyIgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgICAgIHByaW50X3Byb21wdCAiU3RhZ2luZyBicmFuY2ggbmFtZSBbc3RhZ2luZ106ICIKICAgICAgICAgICAgcmVhZCAtciBzdGFnaW5nX25hbWUKICAgICAgICAgICAgc3RhZ2luZ19uYW1lPSIke3N0YWdpbmdfbmFtZTotc3RhZ2luZ30iCiAgICAgICAgICAgIAogICAgICAgICAgICAjIENoZWNrIGlmIGJyYW5jaCBuZWVkcyB0byBiZSBjcmVhdGVkCiAgICAgICAgICAgIGlmICEgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvaGVhZHMvJHN0YWdpbmdfbmFtZSIgJiYgXAogICAgICAgICAgICAgICAhIGdpdCBscy1yZW1vdGUgLS1oZWFkcyBvcmlnaW4gIiRzdGFnaW5nX25hbWUiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSAiJHN0YWdpbmdfbmFtZSI7IHRoZW4KICAgICAgICAgICAgICAgIHByaW50X3Byb21wdCAiQ3JlYXRlICckc3RhZ2luZ19uYW1lJyBicmFuY2g/IFtZL25dOiAiCiAgICAgICAgICAgICAgICByZWFkIC1yIGNyZWF0ZV9zdGFnaW5nCiAgICAgICAgICAgICAgICBpZiBbWyAhICIkY3JlYXRlX3N0YWdpbmciID1+IF5bTm5dJCBdXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIGxvY2FsIGN1cnJlbnRfYnJhbmNoCiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9icmFuY2g9JChnaXQgc3ltYm9saWMtcmVmIC0tc2hvcnQgSEVBRCAyPi9kZXYvbnVsbCB8fCBlY2hvICIkcHJvZHVjdGlvbl9icmFuY2giKQogICAgICAgICAgICAgICAgICAgIGlmIGdpdCBjaGVja291dCAtYiAiJHN0YWdpbmdfbmFtZSIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyTIENyZWF0ZWQgJyRzdGFnaW5nX25hbWUnIGJyYW5jaCIKICAgICAgICAgICAgICAgICAgICAgICAgZ2l0IGNoZWNrb3V0ICIkY3VycmVudF9icmFuY2giID4vZGV2L251bGwgMj4mMQogICAgICAgICAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1NUQUdJTkdfQlJBTkNIPSIkc3RhZ2luZ19uYW1lIgogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfd2FybmluZyAiQ291bGQgbm90IGNyZWF0ZSAnJHN0YWdpbmdfbmFtZScgYnJhbmNoIgogICAgICAgICAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1NUQUdJTkdfQlJBTkNIPSIiCiAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBleHBvcnQgQk9PVFNUUkFQX1NUQUdJTkdfQlJBTkNIPSIkc3RhZ2luZ19uYW1lIgogICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZXhwb3J0IEJPT1RTVFJBUF9TVEFHSU5HX0JSQU5DSD0iJHN0YWdpbmdfbmFtZSIKICAgICAgICAgICAgZmkKICAgICAgICBlbHNlCiAgICAgICAgICAgIGV4cG9ydCBCT09UU1RSQVBfU1RBR0lOR19CUkFOQ0g9IiIKICAgICAgICBmaQogICAgZmkKCiAgICBwcmludF9zdWNjZXNzICLinJMgQnJhbmNoIHN0cmF0ZWd5IGNvbmZpZ3VyZWQiICJhbHdheXMiCiAgICBwcmludF9pbmZvICIgIFByb2R1Y3Rpb246ICRwcm9kdWN0aW9uX2JyYW5jaCAoZm9yIHJlbGVhc2VzKSIgImFsd2F5cyIKICAgIGlmIFtbIC1uICIkQk9PVFNUUkFQX0RFVkVMT1BfQlJBTkNIIiBdXTsgdGhlbgogICAgICAgIHByaW50X2luZm8gIiAgRGV2ZWxvcG1lbnQ6ICRCT09UU1RSQVBfREVWRUxPUF9CUkFOQ0ggKGZvciB2ZXJzaW9uaW5nKSIgImFsd2F5cyIKICAgIGZpCiAgICBpZiBbWyAtbiAiJEJPT1RTVFJBUF9TVEFHSU5HX0JSQU5DSCIgXV07IHRoZW4KICAgICAgICBwcmludF9pbmZvICIgIFN0YWdpbmc6ICRCT09UU1RSQVBfU1RBR0lOR19CUkFOQ0ggKGZvciBwcmUtcHJvZHVjdGlvbiB0ZXN0aW5nKSIgImFsd2F5cyIKICAgIGZpCn0KCiMgU3RlcCA2OiBTYXZlIGFsbCBjb25maWd1cmF0aW9uIHRvIC5lbnYubWFpYXNzCnNhdmVfYm9vdHN0cmFwX2NvbmZpZygpIHsKICAgIHByaW50X3NlY3Rpb24gIvCfkr4gU2F2aW5nIENvbmZpZ3VyYXRpb24iCgogICAgIyBDcmVhdGUgLmVudi5tYWlhc3Mgd2l0aCBhbGwgc2V0dGluZ3MKICAgIGNhdCA+IC5lbnYubWFpYXNzIDw8IEVPRgojIC5lbnYubWFpYXNzIC0gVGVhbS9SZXBvc2l0b3J5IENvbmZpZ3VyYXRpb24KIyBUaGlzIGZpbGUgaXMgdHJhY2tlZCBpbiBnaXQgYW5kIHNoYXJlZCB3aXRoIHlvdXIgdGVhbS4KIyBVc2UgdGhpcyBmb3IgcHJvamVjdC13aWRlIHNldHRpbmdzIHRoYXQgZXZlcnlvbmUgc2hvdWxkIHVzZS4KIwojIEZvciBwZXJzb25hbC9sb2NhbCBzZXR0aW5ncyAoQVBJIGtleXMsIGxvY2FsIG92ZXJyaWRlcyksIHVzZSAuZW52Lm1haWFzcy5sb2NhbAojIHdoaWNoIGlzIGF1dG9tYXRpY2FsbHkgZ2l0aWdub3JlZCBhbmQgbmV2ZXIgY29tbWl0dGVkLgojCiMgR2VuZXJhdGVkIGJ5IGJvb3RzdHJhcCBvbiAkKGRhdGUpCgojIFByb2plY3QgVHlwZQpNQUlBU1NfUkVQT19UWVBFPSR7Qk9PVFNUUkFQX1BST0pFQ1RfVFlQRTotYmVzcG9rZX0KRU9GCgogICAgIyBBZGQgV29yZFByZXNzLXNwZWNpZmljIHNldHRpbmdzCiAgICBpZiBbWyAiJEJPT1RTVFJBUF9QUk9KRUNUX1RZUEUiID09ICJ3b3JkcHJlc3MiIF1dOyB0aGVuCiAgICAgICAgY2F0ID4+IC5lbnYubWFpYXNzIDw8IEVPRgoKIyBXb3JkUHJlc3MgQ29uZmlndXJhdGlvbgpNQUlBU1NfV1BfRklMRVNfUEFUSD0ke0JPT1RTVFJBUF9XUF9QQVRIOi0ufQpFT0YKCiAgICAgICAgaWYgW1sgLW4gIiRCT09UU1RSQVBfV1BfVFlQRSIgXV07IHRoZW4KICAgICAgICAgICAgZWNobyAiIyBXb3JkUHJlc3MgdHlwZTogJEJPT1RTVFJBUF9XUF9UWVBFIiA+PiAuZW52Lm1haWFzcwogICAgICAgIGZpCiAgICBmaQoKICAgICMgQWRkIHZlcnNpb24gY29uZmlndXJhdGlvbgogICAgaWYgW1sgLW4gIiRCT09UU1RSQVBfVkVSU0lPTl9TT1VSQ0UiIF1dOyB0aGVuCiAgICAgICAgY2F0ID4+IC5lbnYubWFpYXNzIDw8IEVPRgoKIyBWZXJzaW9uIE1hbmFnZW1lbnQKTUFJQVNTX1ZFUlNJT05fUFJJTUFSWV9GSUxFPSR7Qk9PVFNUUkFQX1ZFUlNJT05fU09VUkNFfQpFT0YKICAgICAgICAjIFBlcnNpc3QgdHlwZSBpZiBhdmFpbGFibGUKICAgICAgICBpZiBbWyAtbiAiJEJPT1RTVFJBUF9WRVJTSU9OX1RZUEUiIF1dOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIk1BSUFTU19WRVJTSU9OX1BSSU1BUllfVFlQRT0ke0JPT1RTVFJBUF9WRVJTSU9OX1RZUEV9IiA+PiAuZW52Lm1haWFzcwogICAgICAgIGZpCiAgICAgICAgIyBQZXJzaXN0IGxpbmUgc3RhcnQvcGF0dGVybiBpZiBhdmFpbGFibGUKICAgICAgICBpZiBbWyAtbiAiJEJPT1RTVFJBUF9WRVJTSU9OX0xJTkVfU1RBUlQiIF1dOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIk1BSUFTU19WRVJTSU9OX1BSSU1BUllfTElORV9TVEFSVD0ke0JPT1RTVFJBUF9WRVJTSU9OX0xJTkVfU1RBUlR9IiA+PiAuZW52Lm1haWFzcwogICAgICAgIGZpCiAgICBmaQoKICAgICMgQWRkIGNoYW5nZWxvZyBjb25maWd1cmF0aW9uIChkZWZhdWx0cyBiYXNlZCBvbiB2ZXJzaW9uIGZpbGUgZGlyZWN0b3J5IG9yIGV4aXN0aW5nIGZpbGUpCiAgICBpZiBbWyAiJEJPT1RTVFJBUF9GRUFUVVJFUyIgPT0gImZ1bGwiIF1dOyB0aGVuCiAgICAgICAgY2F0ID4+IC5lbnYubWFpYXNzIDw8IEVPRgoKIyBDaGFuZ2Vsb2cgQ29uZmlndXJhdGlvbgpNQUlBU1NfQ0hBTkdFTE9HX1BBVEg9JHtCT09UU1RSQVBfQ0hBTkdFTE9HX1BBVEh9Ck1BSUFTU19DSEFOR0VMT0dfTkFNRT0ke0JPT1RTVFJBUF9DSEFOR0VMT0dfTkFNRX0KRU9GCiAgICBmaQoKICAgICMgSW50ZXJuYWwgY2hhbmdlbG9nIGNvbmZpZ3VyYXRpb24gKG9wdGlvbmFsKQogICAgaWYgW1sgIiRCT09UU1RSQVBfSU5URVJOQUxfQ0hBTkdFTE9HX0VOQUJMRUQiID09ICJ0cnVlIiBdXTsgdGhlbgogICAgICAgIGNhdCA+PiAuZW52Lm1haWFzcyA8PCBFT0YKCiMgSW50ZXJuYWwgQ2hhbmdlbG9nIChmb3IgQ0kvaW50ZXJuYWwgdXNlOyB1c3VhbGx5IGV4Y2x1ZGVkIGZyb20gZGVwbG95bWVudHMpCk1BSUFTU19DSEFOR0VMT0dfSU5URVJOQUxfRU5BQkxFRD10cnVlCk1BSUFTU19DSEFOR0VMT0dfSU5URVJOQUxfUEFUSD0ke0JPT1RTVFJBUF9JTlRFUk5BTF9DSEFOR0VMT0dfUEFUSH0KTUFJQVNTX0NIQU5HRUxPR19JTlRFUk5BTF9OQU1FPSR7Qk9PVFNUUkFQX0lOVEVSTkFMX0NIQU5HRUxPR19OQU1FfQpFT0YKICAgIGVsc2UKICAgICAgICAjIFBlcnNpc3QgZXhwbGljaXQgZGlzYWJsZSBpZiBwcmV2aW91c2x5IGVuYWJsZWQKICAgICAgICBpZiBbWyAtbiAiJEVYSVNUSU5HX0lOVEVSTkFMX0NIQU5HRUxPR19FTkFCTEVEIiBdXTsgdGhlbgogICAgICAgICAgICBjYXQgPj4gLmVudi5tYWlhc3MgPDwgRU9GCgpNQUlBU1NfQ0hBTkdFTE9HX0lOVEVSTkFMX0VOQUJMRUQ9ZmFsc2UKRU9GCiAgICAgICAgZmkKICAgIGZpCgogICAgIyBBZGQgYnJhbmNoIGNvbmZpZ3VyYXRpb24KICAgIGlmIFtbIC1uICIkQk9PVFNUUkFQX01BSU5fQlJBTkNIIiBdXTsgdGhlbgogICAgICAgIGNhdCA+PiAuZW52Lm1haWFzcyA8PCBFT0YKCiMgQnJhbmNoIFN0cmF0ZWd5Ck1BSUFTU19NQUlOQlJBTkNIPSR7Qk9PVFNUUkFQX01BSU5fQlJBTkNIfQpFT0YKICAgIGZpCgogICAgaWYgW1sgLW4gIiRCT09UU1RSQVBfREVWRUxPUF9CUkFOQ0giIF1dOyB0aGVuCiAgICAgICAgZWNobyAiTUFJQVNTX0RFVkVMT1BCUkFOQ0g9JHtCT09UU1RSQVBfREVWRUxPUF9CUkFOQ0h9IiA+PiAuZW52Lm1haWFzcwogICAgZmkKCiAgICBpZiBbWyAtbiAiJEJPT1RTVFJBUF9TVEFHSU5HX0JSQU5DSCIgXV07IHRoZW4KICAgICAgICBlY2hvICJNQUlBU1NfU1RBR0lOR0JSQU5DSD0ke0JPT1RTVFJBUF9TVEFHSU5HX0JSQU5DSH0iID4+IC5lbnYubWFpYXNzCiAgICBmaQoKICAgICMgQWRkIGZlYXR1cmUgY29uZmlndXJhdGlvbgogICAgY2FzZSAiJEJPT1RTVFJBUF9GRUFUVVJFUyIgaW4KICAgICAgICAiYWlfb25seSIpCiAgICAgICAgICAgIGNhdCA+PiAuZW52Lm1haWFzcyA8PCBFT0YKCiMgRmVhdHVyZXM6IEFJIGNvbW1pdHMgb25seQpNQUlBU1NfTU9ERT1haV9vbmx5CkVPRgogICAgICAgICAgICA7OwogICAgICAgICJ2ZXJzaW9uaW5nX29ubHkiKQogICAgICAgICAgICBjYXQgPj4gLmVudi5tYWlhc3MgPDwgRU9GCgojIEZlYXR1cmVzOiBWZXJzaW9uaW5nIHdpdGhvdXQgY2hhbmdlbG9nCiMgKGNoYW5nZWxvZyBnZW5lcmF0aW9uIGRpc2FibGVkKQpFT0YKICAgICAgICAgICAgOzsKICAgICAgICAqKQogICAgICAgICAgICBjYXQgPj4gLmVudi5tYWlhc3MgPDwgRU9GCgojIEZlYXR1cmVzOiBGdWxsIHdvcmtmbG93IChkZWZhdWx0KQojIEluY2x1ZGVzIHZlcnNpb25pbmcsIGNoYW5nZWxvZywgYW5kIEFJIGNvbW1pdHMKRU9GCiAgICAgICAgICAgIDs7CiAgICBlc2FjCgogICAgIyBQZXJzaXN0IGNoYW5nZWxvZyBzZXR0aW5ncyBpZiBzZXQKICAgIGlmIFtbIC1uICIkQk9PVFNUUkFQX0NIQU5HRUxPR19QQVRIIiBdXTsgdGhlbgogICAgICAgIGNhdCA+PiAuZW52Lm1haWFzcyA8PCBFT0YKCiMgQ2hhbmdlbG9nIENvbmZpZ3VyYXRpb24KTUFJQVNTX0NIQU5HRUxPR19QQVRIPSR7Qk9PVFNUUkFQX0NIQU5HRUxPR19QQVRIfQpNQUlBU1NfQ0hBTkdFTE9HX05BTUU9JHtCT09UU1RSQVBfQ0hBTkdFTE9HX05BTUV9CkVPRgogICAgZmkKCiAgICAjIEFkZCBjb21tb24gc2V0dGluZ3MKICAgIGNhdCA+PiAuZW52Lm1haWFzcyA8PCBFT0YKCiMgQUkgQ29uZmlndXJhdGlvbiAob3B0aW9uYWwpCiMgTUFJQVNTX0FJX01PREU9YXNrIChkZWZhdWx0KSwgb2ZmLCBhdXRvc3VnZ2VzdAoKIyBWZXJib3NpdHkgKGJyaWVmLCBub3JtYWwsIGRlYnVnKQpNQUlBU1NfVkVSQk9TSVRZPWJyaWVmCgojIEVuYWJsZSBsb2dnaW5nCk1BSUFTU19MT0dHSU5HPXRydWUKRU9GCgogICAgIyBBbHdheXMgYWRkIE1BSUFTU19HSVRLRUVQIHRvIHByZXZlbnQgZ2l0aWdub3JlIHByb21wdHMKICAgIGNhdCA+PiAuZW52Lm1haWFzcyA8PCBFT0YKCiMgUHJldmVudCByZXBlYXRlZCBnaXRpZ25vcmUgcHJvbXB0cyAodGhpcyBmaWxlIGlzIHRyYWNrZWQgaW4gZ2l0KQpNQUlBU1NfR0lUS0VFUD10cnVlCkVPRgoKICAgIHByaW50X3N1Y2Nlc3MgIuKckyBDb25maWd1cmF0aW9uIHNhdmVkIHRvIC5lbnYubWFpYXNzIgoKICAgICMgQ3JlYXRlIC5lbnYubWFpYXNzLmxvY2FsIHdpdGggaGVscGZ1bCBjb21tZW50cwogICAgaWYgW1sgISAtZiAiLmVudi5tYWlhc3MubG9jYWwiIF1dOyB0aGVuCiAgICAgICAgY2F0ID4gLmVudi5tYWlhc3MubG9jYWwgPDwgJ0VPRicKIyAuZW52Lm1haWFzcy5sb2NhbCAtIFBlcnNvbmFsL0xvY2FsIFNldHRpbmdzCiMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2l0aWdub3JlZCBhbmQgbmV2ZXIgY29tbWl0dGVkLgojIFVzZSB0aGlzIGZpbGUgZm9yOgojICAgLSBQZXJzb25hbCBBUEkga2V5cyBhbmQgdG9rZW5zCiMgICAtIExvY2FsIGRldmVsb3BtZW50IG92ZXJyaWRlcwojICAgLSBNYWNoaW5lLXNwZWNpZmljIHNldHRpbmdzCiMKIyBBbnkgdmFyaWFibGVzIHNldCBoZXJlIHdpbGwgb3ZlcnJpZGUgdGhvc2UgaW4gLmVudi5tYWlhc3MKCiMgRXhhbXBsZTogT3ZlcnJpZGUgQUkgc2V0dGluZ3MgZm9yIGxvY2FsIGRldmVsb3BtZW50CiMgTUFJQVNTX0FJX01PREU9b2ZmCgpFT0YKICAgICAgICBwcmludF9zdWNjZXNzICLinJMgQ3JlYXRlZCAuZW52Lm1haWFzcy5sb2NhbCBmb3IgcGVyc29uYWwgc2V0dGluZ3MiCiAgICBmaQp9CgpmaSAjIF9fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfYm9vdHN0cmFwX3NoCiMgLS0tIEVuZCBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi9jb3JlL2Jvb3RzdHJhcC5zaCAtLS0KCiMgLS0tIEJlZ2luIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL2NvcmUvYWkuc2ggLS0tCmlmIFtbIC16ICIke19fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfYWlfc2g6LX0iIF1dOyB0aGVuIF9fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfYWlfc2g9MQoKZnVuY3Rpb24gZ2V0X2FpX2NvbW1pdF9tZXNzYWdlX3N0eWxlKCkgewoKICAjIERldGVybWluZSB0aGUgQUkgY29tbWl0IG1lc3NhZ2Ugc3R5bGUKICBpZiBbWyAtbiAiJE1BSUFTU19BSV9DT01NSVRfTUVTU0FHRV9TVFlMRSIgXV07IHRoZW4KICAgIGFpX2NvbW1pdF9zdHlsZT0iJE1BSUFTU19BSV9DT01NSVRfTUVTU0FHRV9TVFlMRSIKICAgIHByaW50X2RlYnVnICJVc2luZyBBSSBjb21taXQgc3R5bGU6ICRhaV9jb21taXRfc3R5bGUiID4mMgogIGVsaWYgW1sgLWYgIi5tYWlhc3MucHJvbXB0IiBdXTsgdGhlbgogICAgYWlfY29tbWl0X3N0eWxlPSJjdXN0b20iCiAgICBwcmludF9kZWJ1ZyAiTm8gc3R5bGUgc2V0IGluIC5lbnY7IHVzaW5nIGxvY2FsIHByb21wdCBmaWxlOiAubWFpYXNzLnByb21wdCIgPiYyCiAgZWxpZiBbWyAtZiAiJEhPTUUvLm1haWFzcy5wcm9tcHQiIF1dOyB0aGVuCiAgICBhaV9jb21taXRfc3R5bGU9Imdsb2JhbF9jdXN0b20iCiAgICBwcmludF9kZWJ1ZyAiTm8gc3R5bGUgc2V0IGluIC5lbnYubTsgdXNpbmcgZ2xvYmFsIHByb21wdCBmaWxlOiB+Ly5tYWlhc3MucHJvbXB0IiA+JjIKICBlbHNlCiAgICBhaV9jb21taXRfc3R5bGU9ImJ1bGxldCIKICAgIHByaW50X2RlYnVnICJObyBzdHlsZSBvciBwcm9tcHQgZmlsZXMgZm91bmQ7IGRlZmF1bHRpbmcgdG8gJ2J1bGxldCciID4mMgogIGZpCiAgZXhwb3J0IGFpX2NvbW1pdF9zdHlsZQp9CgojIEZ1bmN0aW9uIHRvIGhhbmRsZSBpbnZhbGlkIEFQSSBrZXkgZXJyb3JzIHdpdGggdXNlciBvcHRpb25zCmZ1bmN0aW9uIGhhbmRsZV9pbnZhbGlkX2FwaV9rZXlfZXJyb3IoKSB7CiAgZWNobyAiIgogIHByaW50X3dhcm5pbmcgIuKdjCBJbnZhbGlkIEFQSSBLZXkiID4mMgogIGVjaG8gIiIKICBwcmludF9pbmZvICJZb3VyIE1BSUFTUyBBSSB0b2tlbiBpcyBpbnZhbGlkIG9yIGhhcyBleHBpcmVkLiIgPiYyCgogICMgQ2hlY2sgaWYgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGFub255bW91cyBzdWJzY3JpcHRpb24KICBpZiBbWyAiJGFpX2ludmFsaWRfdG9rZW5fY2hvaWNlcyIgPT0gImZhbHNlIiBdXTsgdGhlbgogICAgIyBDaGVjayBpZiB3ZSBhbHJlYWR5IHRyaWVkIHRvIGNyZWF0ZSBhbm9ueW1vdXMgc3Vic2NyaXB0aW9uIHRoaXMgc2Vzc2lvbgogICAgaWYgW1sgIiRfTUFJQVNTX0FOT05fQVRURU1QVEVEIiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgICAgcHJpbnRfd2FybmluZyAiQW5vbnltb3VzIHN1YnNjcmlwdGlvbiBhbHJlYWR5IGF0dGVtcHRlZCB0aGlzIHNlc3Npb24uIENvbnRpbnVpbmcgd2l0aG91dCBBSSBhc3Npc3RhbmNlLiIgPiYyCiAgICAgIGV4cG9ydCBhaV9tb2RlPSJvZmYiCiAgICAgIHJldHVybiAxCiAgICBmaQoKICAgIHByaW50X2luZm8gIkF1dG9tYXRpY2FsbHkgY3JlYXRpbmcgYW5vbnltb3VzIHN1YnNjcmlwdGlvbi4uLiIgPiYyCiAgICBleHBvcnQgX01BSUFTU19BTk9OX0FUVEVNUFRFRD0idHJ1ZSIKCiAgICBpZiBjcmVhdGVfYW5vbnltb3VzX3N1YnNjcmlwdGlvbjsgdGhlbgogICAgICBwcmludF9pbmZvICJSZXRyeWluZyBBSSBjb21taXQgbWVzc2FnZSBnZW5lcmF0aW9uLi4uIiA+JjIKICAgICAgZWNobyAiIgogICAgICAjIFJldHVybiBzdWNjZXNzIHRvIGluZGljYXRlIHJldHJ5IHNob3VsZCBoYXBwZW4gaW4gY2FsbGluZyBjb250ZXh0CiAgICAgIHJldHVybiAwCiAgICBlbHNlCiAgICAgIHByaW50X3dhcm5pbmcgIkZhaWxlZCB0byBjcmVhdGUgYW5vbnltb3VzIHN1YnNjcmlwdGlvbi4gQ29udGludWluZyB3aXRob3V0IEFJIGFzc2lzdGFuY2UuIiA+JjIKICAgICAgZXhwb3J0IGFpX21vZGU9Im9mZiIKICAgICAgcmV0dXJuIDEKICAgIGZpCiAgZmkKCiAgcHJpbnRfaW5mbyAiWW91IGhhdmUgdGhlIGZvbGxvd2luZyBvcHRpb25zOiIgPiYyCiAgZWNobyAiIgogIHByaW50X2luZm8gIiAgJHtCQ3lhbn0xLiR7Q29sb3JfT2ZmfSBFbnRlciBhIG5ldyBBSSB0b2tlbiIgPiYyCiAgcHJpbnRfaW5mbyAiICAke0JDeWFufTIuJHtDb2xvcl9PZmZ9IENvbnRpbnVlIHdpdGhvdXQgQUkgYW5kIGVudGVyIGNvbW1pdCBtZXNzYWdlIG1hbnVhbGx5ICR7QlllbGxvd31bRGVmYXVsdF0ke0NvbG9yX09mZn0iID4mMgogIHByaW50X2luZm8gIiAgJHtCQ3lhbn0zLiR7Q29sb3JfT2ZmfSBHZXQgYSBuZXcgYW5vbnltb3VzIHRva2VuIChubyBlbWFpbCByZXF1aXJlZCkiID4mMgogIHByaW50X2luZm8gIiAgJHtCQ3lhbn00LiR7Q29sb3JfT2ZmfSBFeGl0IGFuZCBjb25maWd1cmUgdG9rZW4gbGF0ZXIiID4mMgogIGVjaG8gIiIKICBwcmludF9pbmZvICLwn5KhIFRvIGdldCBhIHRva2VuOiIgPiYyCiAgcHJpbnRfaW5mbyAiICAg4oCiIEVtYWlsIHNpZ251cDogJHtCQmx1ZX1odHRwczovL21haWFzcy5uZXQvc2lnbnVwJHtDb2xvcl9PZmZ9IChmcmVlIHRyaWFsKSIgPiYyCiAgI3ByaW50X2luZm8gIiAgIOKAoiBBbm9ueW1vdXM6IE9wdGlvbiAzIGFib3ZlIChtYWNoaW5lIGZpbmdlcnByaW50LWJhc2VkKSIgPiYyCiAgZWNobyAiIgoKICAjIE9ubHkgcHJvbXB0IGlmIGluIGludGVyYWN0aXZlIG1vZGUKICBpZiBbWyAtdCAwIF1dOyB0aGVuCiAgICBwcmludF9pbmZvICJQbGVhc2UgY2hvb3NlIGFuIG9wdGlvbiAoMS00KSBbMl06ICIgPiYyCiAgICByZWFkIC1yIHVzZXJfY2hvaWNlCgogICAgY2FzZSAiJHt1c2VyX2Nob2ljZTotMn0iIGluCiAgICAgIDEpCiAgICAgICAgZWNobyAiIgogICAgICAgIHByaW50X2luZm8gIlBsZWFzZSBlbnRlciB5b3VyIG5ldyBBSSB0b2tlbiAoaW5wdXQgd2lsbCBiZSBoaWRkZW4pOiAiID4mMgogICAgICAgIGlmIHJlYWQgLXMgbmV3X3Rva2VuOyB0aGVuCiAgICAgICAgICBpZiBbWyAtbiAiJG5ld190b2tlbiIgJiYgIiRuZXdfdG9rZW4iICE9ICJESVNBQkxFRCIgXV07IHRoZW4KICAgICAgICAgICAgIyBTdG9yZSB0aGUgbmV3IHRva2VuIHNlY3VyZWx5CiAgICAgICAgICAgIGxvY2FsIHNlcnZpY2VfbmFtZT0kKGdldF9zZWN1cmVfc2VydmljZV9uYW1lKQogICAgICAgICAgICBpZiBbWyAiJE9TVFlQRSIgPT0gImRhcndpbiIqIF1dOyB0aGVuCiAgICAgICAgICAgICAgc2VjdXJpdHkgYWRkLWdlbmVyaWMtcGFzc3dvcmQgLWEgIk1BSUFTU19BSV9UT0tFTiIgLXMgIiRzZXJ2aWNlX25hbWUiIC13ICIkbmV3X3Rva2VuIiAtVSAyPi9kZXYvbnVsbAogICAgICAgICAgICBlbGlmIGNvbW1hbmQgLXYgc2VjcmV0LXRvb2wgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICAgICAgZWNobyAtbiAiJG5ld190b2tlbiIgfCBzZWNyZXQtdG9vbCBzdG9yZSAtLWxhYmVsPSJNQUlBU1MgQUkgVG9rZW4gKCRzZXJ2aWNlX25hbWUpIiBzZXJ2aWNlICIkc2VydmljZV9uYW1lIiBrZXkgIk1BSUFTU19BSV9UT0tFTiIKICAgICAgICAgICAgZmkKCiAgICAgICAgICAgIGV4cG9ydCBNQUlBU1NfQUlfVE9LRU49IiRuZXdfdG9rZW4iCiAgICAgICAgICAgIGV4cG9ydCBhaV90b2tlbj0iJG5ld190b2tlbiIKICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyFIE5ldyBBSSB0b2tlbiBzdG9yZWQgc3VjY2Vzc2Z1bGx5LiIgPiYyCiAgICAgICAgICAgIHByaW50X2luZm8gIlJldHJ5aW5nIEFJIGNvbW1pdCBtZXNzYWdlIGdlbmVyYXRpb24uLi4iID4mMgogICAgICAgICAgICBlY2hvICIiCgogICAgICAgICAgICAjIFJldHVybiBzdWNjZXNzIHRvIGluZGljYXRlIHJldHJ5IHNob3VsZCBoYXBwZW4gaW4gY2FsbGluZyBjb250ZXh0CiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHByaW50X3dhcm5pbmcgIk5vIHZhbGlkIHRva2VuIHByb3ZpZGVkLiBDb250aW51aW5nIHdpdGhvdXQgQUkgYXNzaXN0YW5jZS4iID4mMgogICAgICAgICAgZmkKICAgICAgICBlbHNlCiAgICAgICAgICBwcmludF93YXJuaW5nICJGYWlsZWQgdG8gcmVhZCB0b2tlbi4gQ29udGludWluZyB3aXRob3V0IEFJIGFzc2lzdGFuY2UuIiA+JjIKICAgICAgICBmaQogICAgICAgIDs7CiAgICAgIDIpCiAgICAgICAgcHJpbnRfaW5mbyAiQ29udGludWluZyB3aXRob3V0IEFJIGFzc2lzdGFuY2UuIFlvdSdsbCBiZSBwcm9tcHRlZCB0byBlbnRlciB5b3VyIGNvbW1pdCBtZXNzYWdlIG1hbnVhbGx5LiIgPiYyCiAgICAgICAgOzsKICAgICAgMykKICAgICAgICBlY2hvICIiCiAgICAgICAgcHJpbnRfaW5mbyAiQ3JlYXRpbmcgYW5vbnltb3VzIHN1YnNjcmlwdGlvbi4uLiIgPiYyCiAgICAgICAgaWYgY3JlYXRlX2Fub255bW91c19zdWJzY3JpcHRpb247IHRoZW4KICAgICAgICAgIHByaW50X2luZm8gIlJldHJ5aW5nIEFJIGNvbW1pdCBtZXNzYWdlIGdlbmVyYXRpb24uLi4iID4mMgogICAgICAgICAgZWNobyAiIgogICAgICAgICAgIyBSZXR1cm4gc3VjY2VzcyB0byBpbmRpY2F0ZSByZXRyeSBzaG91bGQgaGFwcGVuIGluIGNhbGxpbmcgY29udGV4dAogICAgICAgICAgcmV0dXJuIDAKICAgICAgICBlbHNlCiAgICAgICAgICBwcmludF93YXJuaW5nICJGYWlsZWQgdG8gY3JlYXRlIGFub255bW91cyBzdWJzY3JpcHRpb24uIENvbnRpbnVpbmcgd2l0aG91dCBBSSBhc3Npc3RhbmNlLiIgPiYyCiAgICAgICAgZmkKICAgICAgICA7OwogICAgICA0KQogICAgICAgIHByaW50X2luZm8gIkV4aXRpbmcuIENvbmZpZ3VyZSB5b3VyIEFJIHRva2VuIHdpdGg6IGV4cG9ydCBNQUlBU1NfQUlfVE9LRU49XCJ5b3VyX3Rva2VuX2hlcmVcIiIgPiYyCiAgICAgICAgZXhpdCAxCiAgICAgICAgOzsKICAgICAgKikKICAgICAgICBwcmludF93YXJuaW5nICJJbnZhbGlkIG9wdGlvbi4gQ29udGludWluZyB3aXRob3V0IEFJIGFzc2lzdGFuY2UuIiA+JjIKICAgICAgICA7OwogICAgZXNhYwogIGVsc2UKICAgIHByaW50X2luZm8gIk5vbi1pbnRlcmFjdGl2ZSBtb2RlIGRldGVjdGVkLiBDb250aW51aW5nIHdpdGhvdXQgQUkgYXNzaXN0YW5jZS4iID4mMgogIGZpCgogICMgU2V0IEFJIG1vZGUgdG8gb2ZmIGZvciB0aGlzIHNlc3Npb24gdG8gYXZvaWQgcmVwZWF0ZWQgcHJvbXB0cwogIGV4cG9ydCBhaV9tb2RlPSJvZmYiCn0KCiMgRnVuY3Rpb24gdG8gY3JlYXRlIGFuIGFub255bW91cyBzdWJzY3JpcHRpb24gdXNpbmcgbWFjaGluZSBmaW5nZXJwcmludApmdW5jdGlvbiBjcmVhdGVfYW5vbnltb3VzX3N1YnNjcmlwdGlvbigpIHsKICBsb2NhbCBtYWNoaW5lX2ZpbmdlcnByaW50CiAgbG9jYWwgYXBpX3Jlc3BvbnNlCiAgbG9jYWwgbmV3X2FwaV9rZXkKICBsb2NhbCBjcmVkaXRzCiAgbG9jYWwgdG9wX3VwX3VybAoKICAjIEVuc3VyZSByZXF1aXJlZCB2YXJpYWJsZXMgYXJlIHNldAogIGxvY2FsIG1haWFzc19ob3N0PSIke01BSUFTU19BSV9IT1NUOi1odHRwczovL3BvdW5kLm1haWFzcy5uZXR9IgogIGxvY2FsIG1haWFzc190b2tlbnJlcXVlc3Q9IiR7bWFpYXNzX2hvc3R9L3YxL3Rva2VuIgoKICBwcmludF9kZWJ1ZyAiREVCVUc6ID09PT09PT09PT0gQU5PTllNT1VTIFNVQlNDUklQVElPTiBTVEFSVCA9PT09PT09PT09IiA+JjIKICBwcmludF9kZWJ1ZyAiREVCVUc6IFRva2VuIHJlcXVlc3QgZW5kcG9pbnQ6ICRtYWlhc3NfdG9rZW5yZXF1ZXN0IiA+JjIKICBwcmludF9pbmZvICJHZW5lcmF0aW5nIG1hY2hpbmUgZmluZ2VycHJpbnQuLi4iID4mMgoKICAjIEdlbmVyYXRlIG1hY2hpbmUgZmluZ2VycHJpbnQgLSB1c2UgdjIgZmlyc3QgKGhhcmR3YXJlLW9ubHkpLCBmYWxsYmFjayB0byB2MSBmb3IgY29tcGF0aWJpbGl0eQogICMgVGhpcyBNVVNUIG1hdGNoIHRoZSBmaW5nZXJwcmludCBzZW50IGluIEFQSSByZXF1ZXN0cyAoc2VlIGxpbmUgfjU4MykKICBpZiBjb21tYW5kIC12IGdlbmVyYXRlX21hY2hpbmVfZmluZ2VycHJpbnRfdjIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IFVzaW5nIGdlbmVyYXRlX21hY2hpbmVfZmluZ2VycHJpbnRfdjIgZnVuY3Rpb24gKGhhcmR3YXJlLW9ubHkpIiA+JjIKICAgIG1hY2hpbmVfZmluZ2VycHJpbnQ9JChnZW5lcmF0ZV9tYWNoaW5lX2ZpbmdlcnByaW50X3YyKQogIGVsaWYgY29tbWFuZCAtdiBnZW5lcmF0ZV9tYWNoaW5lX2ZpbmdlcnByaW50ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBVc2luZyBnZW5lcmF0ZV9tYWNoaW5lX2ZpbmdlcnByaW50IGZ1bmN0aW9uICh2MSBmYWxsYmFjaykiID4mMgogICAgbWFjaGluZV9maW5nZXJwcmludD0kKGdlbmVyYXRlX21hY2hpbmVfZmluZ2VycHJpbnQpCiAgZWxzZQogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBVc2luZyBmYWxsYmFjayBtYWNoaW5lIGZpbmdlcnByaW50IGdlbmVyYXRpb24iID4mMgogICAgIyBGYWxsYmFjayBmaW5nZXJwcmludCBnZW5lcmF0aW9uCiAgICBtYWNoaW5lX2ZpbmdlcnByaW50PSQoZWNobyAtbiAiJCh1bmFtZSAtYSktJCh3aG9hbWkpLSQoZGF0ZSArJVklbSkiIHwgc2hhc3VtIC1hIDI1NiB8IGN1dCAtZCcgJyAtZjEpCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IFVzaW5nIGZhbGxiYWNrIG1hY2hpbmUgZmluZ2VycHJpbnQ6ICR7bWFjaGluZV9maW5nZXJwcmludDowOjEwfS4uLiIgPiYyCiAgZmkKCiAgaWYgW1sgLXogIiRtYWNoaW5lX2ZpbmdlcnByaW50IiBdXTsgdGhlbgogICAgcHJpbnRfd2FybmluZyAiRmFpbGVkIHRvIGdlbmVyYXRlIG1hY2hpbmUgZmluZ2VycHJpbnQuIiA+JjIKICAgIHJldHVybiAxCiAgZmkKCiAgcHJpbnRfZGVidWcgIkRFQlVHOiBNYWNoaW5lIGZpbmdlcnByaW50OiAke21hY2hpbmVfZmluZ2VycHJpbnQ6MDoxMH0uLi4iID4mMgoKICAjIENyZWF0ZSBKU09OIHBheWxvYWQgZm9yIGFub255bW91cyBzdWJzY3JpcHRpb24KICBsb2NhbCBqc29uX3BheWxvYWQKICBpZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBDcmVhdGluZyBKU09OIHBheWxvYWQgd2l0aCBqcSIgPiYyCiAgICBqc29uX3BheWxvYWQ9JChqcSAtbiAtLWFyZyBmaW5nZXJwcmludCAiJG1hY2hpbmVfZmluZ2VycHJpbnQiICd7CiAgICAgICJtYWNoaW5lX2ZpbmdlcnByaW50IjogJGZpbmdlcnByaW50CiAgICB9JykKICBlbHNlCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IENyZWF0aW5nIEpTT04gcGF5bG9hZCBtYW51YWxseSIgPiYyCiAgICBqc29uX3BheWxvYWQ9IntcIm1hY2hpbmVfZmluZ2VycHJpbnRcIjpcIiRtYWNoaW5lX2ZpbmdlcnByaW50XCJ9IgogIGZpCgogIHByaW50X3RyYWNlICJUUkFDRTogSlNPTiBwYXlsb2FkOiAkanNvbl9wYXlsb2FkIiA+JjIKICBwcmludF9pbmZvICJSZXF1ZXN0aW5nIGFub255bW91cyBzdWJzY3JpcHRpb24uLi4iID4mMgoKICAjIENhbGwgdGhlIGFub255bW91cyBzdWJzY3JpcHRpb24gZW5kcG9pbnQKICBwcmludF9kZWJ1ZyAiREVCVUc6IENhbGxpbmcgJHttYWlhc3NfdG9rZW5yZXF1ZXN0fSIgPiYyCiAgYXBpX3Jlc3BvbnNlPSQoY3VybCAtcyAtbSAzMCAtWCBQT1NUICIke21haWFzc190b2tlbnJlcXVlc3R9IiBcCiAgICAtSCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiBcCiAgICAtSCAiWC1DbGllbnQtTmFtZTogJHtjbGllbnRfbmFtZTotYmFzaG1haWFzc30iIFwKICAgIC1IICJYLUNsaWVudC1WZXJzaW9uOiAke2NsaWVudF92ZXJzaW9uOi0wLjAuMH0iIFwKICAgIC1kICIkanNvbl9wYXlsb2FkIiAyPiYxKQogIAogIGxvY2FsIGN1cmxfZXhpdD0kPwogIHByaW50X2RlYnVnICJERUJVRzogY3VybCBleGl0IGNvZGU6ICRjdXJsX2V4aXQiID4mMgogIHByaW50X2RlYnVnICJERUJVRzogQW5vbnltb3VzIHN1YnNjcmlwdGlvbjogYXBpX2tleT0kKHJlZGFjdF92YWx1ZSAiJChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGdyZXAgLW8gJyJ0b2tlbiI6IlteIl0qIicgfCBoZWFkIC0xIHwgc2VkICdzLyJ0b2tlbiI6Ii8vO3MvIi8vJykiICApIiA+JjIKICBwcmludF90cmFjZSAiVFJBQ0U6IEFub255bW91cyBzdWJzY3JpcHRpb24gcmVzcG9uc2U6ICRhcGlfcmVzcG9uc2UiID4mMgoKICBpZiBbWyAtbiAiJGFwaV9yZXNwb25zZSIgXV07IHRoZW4KICAgICMgQ2hlY2sgZm9yIGVycm9ycwogICAgaWYgZWNobyAiJGFwaV9yZXNwb25zZSIgfCBncmVwIC1xICciZXJyb3IiJzsgdGhlbgogICAgICBsb2NhbCBlcnJvcl9tc2cKICAgICAgZXJyb3JfbXNnPSQoZWNobyAiJGFwaV9yZXNwb25zZSIgfCBncmVwIC1vICciZXJyb3IiOiJbXiJdKiInIHwgc2VkICdzLyJlcnJvciI6Ii8vJyB8IHNlZCAncy8iJC8vJyB8IGhlYWQgLTEpCiAgICAgIHByaW50X3dhcm5pbmcgIkZhaWxlZCB0byBjcmVhdGUgYW5vbnltb3VzIHN1YnNjcmlwdGlvbjogJGVycm9yX21zZyIgPiYyCiAgICAgIHJldHVybiAxCiAgICBmaQoKICAgICMgRXh0cmFjdCB0aGUgQVBJIGtleSBhbmQgb3RoZXIgZGV0YWlscwogICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgbmV3X2FwaV9rZXk9JChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGpxIC1yICcuYXBpS2V5IC8vIC5hcGlfa2V5IC8vIC50b2tlbiAvLyBlbXB0eScgMj4vZGV2L251bGwpCiAgICAgIGxvY2FsIHN1YnNjcmlwdGlvbl9pZD0kKGVjaG8gIiRhcGlfcmVzcG9uc2UiIHwganEgLXIgJy5pZCAvLyAuc3Vic2NyaXB0aW9uX2lkIC8vIGVtcHR5JyAyPi9kZXYvbnVsbCkKICAgICAgY3JlZGl0cz0kKGVjaG8gIiRhcGlfcmVzcG9uc2UiIHwganEgLXIgJy5jcmVkaXRzUmVtYWluaW5nIC8vIC5jcmVkaXRzX3JlbWFpbmluZyAvLyAuY3JlZGl0cyAvLyBlbXB0eScgMj4vZGV2L251bGwpCiAgICAgIHRvcF91cF91cmw9JChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGpxIC1yICcucHVyY2hhc2VVcmwgLy8gLnBheW1lbnRfdXJsIC8vIC50b3BfdXBfdXJsIC8vIGVtcHR5JyAyPi9kZXYvbnVsbCkKICAgIGVsc2UKICAgICAgbmV3X2FwaV9rZXk9JChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGdyZXAgLW8gJyJ0b2tlbiI6IlteIl0qIicgfCBzZWQgJ3MvInRva2VuIjoiLy8nIHwgc2VkICdzLyIkLy8nIHwgaGVhZCAtMSkKICAgICAgaWYgW1sgLXogIiRuZXdfYXBpX2tleSIgXV07IHRoZW4KICAgICAgICBuZXdfYXBpX2tleT0kKGVjaG8gIiRhcGlfcmVzcG9uc2UiIHwgZ3JlcCAtbyAnImFwaV9rZXkiOiJbXiJdKiInIHwgc2VkICdzLyJhcGlfa2V5IjoiLy8nIHwgc2VkICdzLyIkLy8nIHwgaGVhZCAtMSkKICAgICAgZmkKICAgICAgbG9jYWwgc3Vic2NyaXB0aW9uX2lkPSQoZWNobyAiJGFwaV9yZXNwb25zZSIgfCBncmVwIC1vICcic3Vic2NyaXB0aW9uX2lkIjoiW14iXSoiJyB8IHNlZCAncy8ic3Vic2NyaXB0aW9uX2lkIjoiLy8nIHwgc2VkICdzLyIkLy8nIHwgaGVhZCAtMSkKICAgICAgY3JlZGl0cz0kKGVjaG8gIiRhcGlfcmVzcG9uc2UiIHwgZ3JlcCAtbyAnImNyZWRpdHNfcmVtYWluaW5nIjpbMC05XSonIHwgc2VkICdzLyJjcmVkaXRzX3JlbWFpbmluZyI6Ly8nIHwgaGVhZCAtMSkKICAgICAgaWYgW1sgLXogIiRjcmVkaXRzIiBdXTsgdGhlbgogICAgICAgIGNyZWRpdHM9JChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGdyZXAgLW8gJyJjcmVkaXRzIjpbMC05XSonIHwgc2VkICdzLyJjcmVkaXRzIjovLycgfCBoZWFkIC0xKQogICAgICBmaQogICAgICB0b3BfdXBfdXJsPSQoZWNobyAiJGFwaV9yZXNwb25zZSIgfCBncmVwIC1vICcicGF5bWVudF91cmwiOiJbXiJdKiInIHwgc2VkICdzLyJwYXltZW50X3VybCI6Ii8vJyB8IHNlZCAncy8iJC8vJyB8IGhlYWQgLTEpCiAgICAgIGlmIFtbIC16ICIkdG9wX3VwX3VybCIgXV07IHRoZW4KICAgICAgICB0b3BfdXBfdXJsPSQoZWNobyAiJGFwaV9yZXNwb25zZSIgfCBncmVwIC1vICcidG9wX3VwX3VybCI6IlteIl0qIicgfCBzZWQgJ3MvInRvcF91cF91cmwiOiIvLycgfCBzZWQgJ3MvIiQvLycgfCBoZWFkIC0xKQogICAgICBmaQogICAgZmkKCiAgICBpZiBbWyAtbiAiJG5ld19hcGlfa2V5IiAmJiAiJG5ld19hcGlfa2V5IiAhPSAibnVsbCIgXV07IHRoZW4KICAgICAgcHJpbnRfc3VjY2VzcyAi4pyFIEFub255bW91cyBzdWJzY3JpcHRpb24gY3JlYXRlZCBzdWNjZXNzZnVsbHkhIiA+JjIKICAgICAgcHJpbnRfaW5mbyAiICAgQVBJIEtleTogJChtYXNrX2FwaV9rZXkgIiRuZXdfYXBpX2tleSIpIiA+JjIKICAgICAgcHJpbnRfaW5mbyAiICAgQ3JlZGl0czogJHtjcmVkaXRzOi1OL0F9IiA+JjIKCiAgICAgIGlmIFtbIC1uICIkc3Vic2NyaXB0aW9uX2lkIiAmJiAiJHN1YnNjcmlwdGlvbl9pZCIgIT0gIm51bGwiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfaW5mbyAiICAgU3Vic2NyaXB0aW9uIElEOiAke3N1YnNjcmlwdGlvbl9pZDowOjEyfS4uLiIgPiYyCiAgICAgIGZpCgogICAgICBpZiBbWyAteiAiJGNyZWRpdHMiIHx8ICIkY3JlZGl0cyIgPT0gIjAiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfd2FybmluZyAi4pqg77iPICBZb3VyIGFub255bW91cyBBUEkga2V5IGhhcyB6ZXJvIGNyZWRpdHMuIFBsZWFzZSBwdXJjaGFzZSBjcmVkaXRzIHRvIHVzZSBBSSBmZWF0dXJlcy4iID4mMgogICAgICAgIGlmIFtbIC1uICIkdG9wX3VwX3VybCIgJiYgIiR0b3BfdXBfdXJsIiAhPSAibnVsbCIgXV07IHRoZW4KICAgICAgICAgIHByaW50X2luZm8gIiAgIFB1cmNoYXNlIGNyZWRpdHMgaGVyZTogJHRvcF91cF91cmwiID4mMgogICAgICAgIGZpCiAgICAgIGZpCgogICAgICAjIFN0b3JlIHRoZSB0b2tlbiwgc3Vic2NyaXB0aW9uIElELCBhbmQgdG9wLXVwIFVSTCBzZWN1cmVseQogICAgICBsb2NhbCBzZXJ2aWNlX25hbWU9JChnZXRfc2VjdXJlX3NlcnZpY2VfbmFtZSkKICAgICAgaWYgW1sgIiRPU1RZUEUiID09ICJkYXJ3aW4iKiBdXTsgdGhlbgogICAgICAgIHNlY3VyaXR5IGFkZC1nZW5lcmljLXBhc3N3b3JkIC1hICJNQUlBU1NfQUlfVE9LRU4iIC1zICIkc2VydmljZV9uYW1lIiAtdyAiJG5ld19hcGlfa2V5IiAtVSAyPi9kZXYvbnVsbAogICAgICAgIGlmIFtbIC1uICIkc3Vic2NyaXB0aW9uX2lkIiAmJiAiJHN1YnNjcmlwdGlvbl9pZCIgIT0gIm51bGwiIF1dOyB0aGVuCiAgICAgICAgICBzZWN1cml0eSBhZGQtZ2VuZXJpYy1wYXNzd29yZCAtYSAiTUFJQVNTX1NVQlNDUklQVElPTl9JRCIgLXMgIiRzZXJ2aWNlX25hbWUiIC13ICIkc3Vic2NyaXB0aW9uX2lkIiAtVSAyPi9kZXYvbnVsbAogICAgICAgIGZpCiAgICAgIGVsaWYgY29tbWFuZCAtdiBzZWNyZXQtdG9vbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBlY2hvIC1uICIkbmV3X2FwaV9rZXkiIHwgc2VjcmV0LXRvb2wgc3RvcmUgLS1sYWJlbD0iTUFJQVNTIEFJIFRva2VuICgkc2VydmljZV9uYW1lKSIgc2VydmljZSAiJHNlcnZpY2VfbmFtZSIga2V5ICJNQUlBU1NfQUlfVE9LRU4iCiAgICAgICAgaWYgW1sgLW4gIiRzdWJzY3JpcHRpb25faWQiICYmICIkc3Vic2NyaXB0aW9uX2lkIiAhPSAibnVsbCIgXV07IHRoZW4KICAgICAgICAgIGVjaG8gLW4gIiRzdWJzY3JpcHRpb25faWQiIHwgc2VjcmV0LXRvb2wgc3RvcmUgLS1sYWJlbD0iTUFJQVNTIFN1YnNjcmlwdGlvbiBJRCAoJHNlcnZpY2VfbmFtZSkiIHNlcnZpY2UgIiRzZXJ2aWNlX25hbWUiIGtleSAiTUFJQVNTX1NVQlNDUklQVElPTl9JRCIKICAgICAgICBmaQogICAgICBmaQoKICAgICAgZXhwb3J0IE1BSUFTU19BSV9UT0tFTj0iJG5ld19hcGlfa2V5IgogICAgICBleHBvcnQgYWlfdG9rZW49IiRuZXdfYXBpX2tleSIKICAgICAgaWYgW1sgLW4gIiRzdWJzY3JpcHRpb25faWQiICYmICIkc3Vic2NyaXB0aW9uX2lkIiAhPSAibnVsbCIgXV07IHRoZW4KICAgICAgICBleHBvcnQgTUFJQVNTX1NVQlNDUklQVElPTl9JRD0iJHN1YnNjcmlwdGlvbl9pZCIKICAgICAgZmkKCiAgICAgIGVjaG8gIiIKICAgICAgcmV0dXJuIDAKICAgIGVsc2UKICAgICAgcHJpbnRfd2FybmluZyAiRmFpbGVkIHRvIGV4dHJhY3QgQVBJIGtleSBmcm9tIHJlc3BvbnNlLiIgPiYyCiAgICAgIHJldHVybiAxCiAgICBmaQogIGVsc2UKICAgIHByaW50X3dhcm5pbmcgIk5vIHJlc3BvbnNlIGZyb20gYW5vbnltb3VzIHN1YnNjcmlwdGlvbiBzZXJ2aWNlLiIgPiYyCiAgICByZXR1cm4gMQogIGZpCn0KCiMgRnVuY3Rpb24gdG8gaGFuZGxlIHF1b3RhIGV4Y2VlZGVkIGVycm9ycwpmdW5jdGlvbiBoYW5kbGVfcXVvdGFfZXhjZWVkZWRfZXJyb3IoKSB7CiAgbG9jYWwgZXJyb3JfbXNnPSIkMSIKICBsb2NhbCBwYXltZW50X3VybD0iJDIiCiAgbG9jYWwgY3JlZGl0c19yZW1haW5pbmc9IiQzIgoKICBlY2hvICIiCiAgcHJpbnRfd2FybmluZyAi8J+SsyBRdW90YSBFeGNlZWRlZCIgPiYyCiAgZWNobyAiIgogIHByaW50X2luZm8gIiR7UmVkfVlvdXIgQUkgdG9rZW4gcXVvdGEgaGFzIGJlZW4gZXhjZWVkZWQuJHtDb2xvcl9SZXNldH0iID4mMgogIGlmIFtbIC1uICIkZXJyb3JfbXNnIiBdXTsgdGhlbgogICAgcHJpbnRfZGVidWcgIkRldGFpbHM6ICRlcnJvcl9tc2ciID4mMgogIGZpCiAgaWYgW1sgLW4gIiRjcmVkaXRzX3JlbWFpbmluZyIgJiYgIiRjcmVkaXRzX3JlbWFpbmluZyIgIT0gIm51bGwiIF1dOyB0aGVuCiAgICBwcmludF9pbmZvICIkKHByaW50X2NyZWRpdF9jb2xvciAiJGNyZWRpdHNfcmVtYWluaW5nIiAiQ3JlZGl0cyByZW1haW5pbmc6ICRjcmVkaXRzX3JlbWFpbmluZyIpIiA+JjIKICBmaQogIHByaW50X2luZm8gIvCfkqEgVG8gbWFuYWdlIHlvdXIgcXVvdGE6IiA+JjIKCiAgIyBVc2UgcGF5bWVudCBVUkwgZnJvbSBwcm94eSByZXNwb25zZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2Ugc3RvcmVkIHN1YnNjcmlwdGlvbiBJRCBvciBmYWxsYmFjawogIGlmIFtbIC1uICIkcGF5bWVudF91cmwiICYmICIkcGF5bWVudF91cmwiICE9ICJudWxsIiBdXTsgdGhlbgogICAgcHJpbnRfaW5mbyAiQWRkIGNyZWRpdHM6ICR7QkJsdWV9JHBheW1lbnRfdXJsJHtDb2xvcl9PZmZ9IiA+JjIKICBlbGlmIFtbIC1uICIkTUFJQVNTX1NVQlNDUklQVElPTl9JRCIgXV07IHRoZW4KICAgIHByaW50X2luZm8gIkFkZCBjcmVkaXRzOiAke0JCbHVlfWh0dHBzOi8vbWFpYXNzLm5ldC90b3AtdXAvJE1BSUFTU19TVUJTQ1JJUFRJT05fSUQke0NvbG9yX09mZn0iID4mMgogIGVsc2UKICAgIHByaW50X2luZm8gIlZpc2l0OiAke0JCbHVlfWh0dHBzOi8vbWFpYXNzLm5ldC8ke0NvbG9yX09mZn0gZm9yIHN1YnNjcmlwdGlvbiBvcHRpb25zIiA+JjIKICBmaQoKICBwcmludF9pbmZvICIke0JZZWxsb3d9WW91IGhhdmUgdGhlIGZvbGxvd2luZyBvcHRpb25zICgxLTMpOiIgPiYyCiAgZWNobyAiIgogIHByaW50X2luZm8gIiAgJHtCQ3lhbn0xLiR7Q29sb3JfT2ZmfSBDb250aW51ZSB3aXRob3V0IEFJIGFuZCBlbnRlciBjb21taXQgbWVzc2FnZSBtYW51YWxseSAke0JZZWxsb3d9W0RlZmF1bHRdJHtDb2xvcl9PZmZ9IiA+JjIKICBwcmludF9pbmZvICIgICR7QkN5YW59Mi4ke0NvbG9yX09mZn0gRW50ZXIgYSBkaWZmZXJlbnQgQUkgdG9rZW4iID4mMgogIHByaW50X2luZm8gIiAgJHtCQ3lhbn0zLiR7Q29sb3JfT2ZmfSBFeGl0IGFuZCBtYW5hZ2UgeW91ciBzdWJzY3JpcHRpb24iID4mMgogIGVjaG8gIiIKCiAgIyBPbmx5IHByb21wdCBpZiBpbiBpbnRlcmFjdGl2ZSBtb2RlCiAgaWYgW1sgLXQgMCBdXTsgdGhlbgogICAgcmVhZCAtciB1c2VyX2Nob2ljZQoKICAgIGNhc2UgIiR7dXNlcl9jaG9pY2U6LTF9IiBpbgogICAgICAxKQogICAgICAgIHByaW50X2luZm8gIkNvbnRpbnVpbmcgd2l0aG91dCBBSSBhc3Npc3RhbmNlLiBZb3UnbGwgYmUgcHJvbXB0ZWQgdG8gZW50ZXIgeW91ciBjb21taXQgbWVzc2FnZSBtYW51YWxseS4iID4mMgogICAgICAgIGV4aXQgMQogICAgICAgIDs7CiAgICAgICMgMikKICAgICAgIyAgIGVjaG8gIiIKICAgICAgIyAgIHByaW50X2luZm8gIkNyZWF0aW5nIG5ldyBhbm9ueW1vdXMgc3Vic2NyaXB0aW9uLi4uIiA+JjIKICAgICAgIyAgIGlmIGNyZWF0ZV9hbm9ueW1vdXNfc3Vic2NyaXB0aW9uOyB0aGVuCiAgICAgICMgICAgIHByaW50X2luZm8gIlJldHJ5aW5nIEFJIGNvbW1pdCBtZXNzYWdlIGdlbmVyYXRpb24uLi4iID4mMgogICAgICAjICAgICBlY2hvICIiCiAgICAgICMgICAgICMgUmV0dXJuIHN1Y2Nlc3MgdG8gaW5kaWNhdGUgcmV0cnkgc2hvdWxkIGhhcHBlbiBpbiBjYWxsaW5nIGNvbnRleHQKICAgICAgIyAgICAgcmV0dXJuIDAKICAgICAgIyAgIGVsc2UKICAgICAgIyAgICAgcHJpbnRfd2FybmluZyAiRmFpbGVkIHRvIGNyZWF0ZSBhbm9ueW1vdXMgc3Vic2NyaXB0aW9uLiBDb250aW51aW5nIHdpdGhvdXQgQUkgYXNzaXN0YW5jZS4iID4mMgogICAgICAjICAgZmkKICAgICAgIyAgIDs7CiAgICAgIDIpCiAgICAgICAgZWNobyAiIgogICAgICAgIHByaW50X2luZm8gIlBsZWFzZSBlbnRlciB5b3VyIG5ldyBBSSB0b2tlbiAoaW5wdXQgd2lsbCBiZSBoaWRkZW4pOiAiID4mMgogICAgICAgIGlmIHJlYWQgLXMgbmV3X3Rva2VuOyB0aGVuCiAgICAgICAgICBpZiBbWyAtbiAiJG5ld190b2tlbiIgJiYgIiRuZXdfdG9rZW4iICE9ICJESVNBQkxFRCIgXV07IHRoZW4KICAgICAgICAgICAgIyBTdG9yZSB0aGUgbmV3IHRva2VuIHNlY3VyZWx5CiAgICAgICAgICAgIGxvY2FsIHNlcnZpY2VfbmFtZT0kKGdldF9zZWN1cmVfc2VydmljZV9uYW1lKQogICAgICAgICAgICBpZiBbWyAiJE9TVFlQRSIgPT0gImRhcndpbiIqIF1dOyB0aGVuCiAgICAgICAgICAgICAgc2VjdXJpdHkgYWRkLWdlbmVyaWMtcGFzc3dvcmQgLWEgIk1BSUFTU19BSV9UT0tFTiIgLXMgIiRzZXJ2aWNlX25hbWUiIC13ICIkbmV3X3Rva2VuIiAtVSAyPi9kZXYvbnVsbAogICAgICAgICAgICBlbGlmIGNvbW1hbmQgLXYgc2VjcmV0LXRvb2wgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICAgICAgZWNobyAtbiAiJG5ld190b2tlbiIgfCBzZWNyZXQtdG9vbCBzdG9yZSAtLWxhYmVsPSJNQUlBU1MgQUkgVG9rZW4gKCRzZXJ2aWNlX25hbWUpIiBzZXJ2aWNlICIkc2VydmljZV9uYW1lIiBrZXkgIk1BSUFTU19BSV9UT0tFTiIKICAgICAgICAgICAgZmkKCiAgICAgICAgICAgIGV4cG9ydCBNQUlBU1NfQUlfVE9LRU49IiRuZXdfdG9rZW4iCiAgICAgICAgICAgIGV4cG9ydCBhaV90b2tlbj0iJG5ld190b2tlbiIKICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAi4pyFIE5ldyBBSSB0b2tlbiBzdG9yZWQgc3VjY2Vzc2Z1bGx5LiIgPiYyCiAgICAgICAgICAgIHByaW50X2luZm8gIlJldHJ5aW5nIEFJIGNvbW1pdCBtZXNzYWdlIGdlbmVyYXRpb24uLi4iID4mMgogICAgICAgICAgICBlY2hvICIiCgogICAgICAgICAgICAjIFJldHVybiBzdWNjZXNzIHRvIGluZGljYXRlIHJldHJ5IHNob3VsZCBoYXBwZW4gaW4gY2FsbGluZyBjb250ZXh0CiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHByaW50X3dhcm5pbmcgIk5vIHZhbGlkIHRva2VuIHByb3ZpZGVkLiBDb250aW51aW5nIHdpdGhvdXQgQUkgYXNzaXN0YW5jZS4iID4mMgogICAgICAgICAgZmkKICAgICAgICBlbHNlCiAgICAgICAgICBwcmludF93YXJuaW5nICJGYWlsZWQgdG8gcmVhZCB0b2tlbi4gQ29udGludWluZyB3aXRob3V0IEFJIGFzc2lzdGFuY2UuIiA+JjIKICAgICAgICBmaQogICAgICAgIDs7CiAgICAgIDMpCiAgICAgICAgcHJpbnRfaW5mbyAiRXhpdGluZy4gVmlzaXQgaHR0cHM6Ly9tYWlhc3MubmV0IHRvIG1hbmFnZSB5b3VyIHN1YnNjcmlwdGlvbi4iID4mMgogICAgICAgIGtpbGwgLVRFUk0gJCQKICAgICAgICA7OwogICAgICAqKQogICAgICAgIHByaW50X3dhcm5pbmcgIkludmFsaWQgb3B0aW9uLiBDb250aW51aW5nIHdpdGhvdXQgQUkgYXNzaXN0YW5jZS4iID4mMgogICAgICAgIDs7CiAgICBlc2FjCiAgZWxzZQogICAgcHJpbnRfaW5mbyAiTm9uLWludGVyYWN0aXZlIG1vZGUgZGV0ZWN0ZWQuIENvbnRpbnVpbmcgd2l0aG91dCBBSSBhc3Npc3RhbmNlLiIgPiYyCiAgZmkKCiAgIyBTZXQgQUkgbW9kZSB0byBvZmYgZm9yIHRoaXMgc2Vzc2lvbiB0byBhdm9pZCByZXBlYXRlZCBwcm9tcHRzCiAgZXhwb3J0IGFpX21vZGU9Im9mZiIKfQoKIyBGdW5jdGlvbiB0byBnZXQgQUktZ2VuZXJhdGVkIGNvbW1pdCBtZXNzYWdlIHN1Z2dlc3Rpb24KZnVuY3Rpb24gZ2V0X2FpX2NvbW1pdF9zdWdnZXN0aW9uKCkgewogIGxvY2FsIGdpdF9kaWZmCiAgbG9jYWwgYWlfcHJvbXB0CiAgbG9jYWwgYXBpX3Jlc3BvbnNlCiAgbG9jYWwgc3VnZ2VzdGVkX21lc3NhZ2UKICBsb2NhbCByZXRyeV9jb3VudD0wCiAgbG9jYWwgbWF4X3JldHJpZXM9MgoKICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGFub255bW91cyB0b2tlbiAoc2V0IGJ5IGVudmFycy5zaCkKICBpZiBbWyAiJF9NQUlBU1NfTkVFRF9BTk9OX1RPS0VOIiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgIHByaW50X2RlYnVnICJERUJVRzogQW5vbnltb3VzIHRva2VuIGNyZWF0aW9uIHJlcXVlc3RlZCBmcm9tIGVudmlyb25tZW50IGxvYWRpbmciID4mMgoKICAgICMgQ2xlYXIgdGhlIGZsYWcgdG8gcHJldmVudCByZXBlYXRlZCBhdHRlbXB0cwogICAgZXhwb3J0IF9NQUlBU1NfTkVFRF9BTk9OX1RPS0VOPSIiCgogICAgaWYgY3JlYXRlX2Fub255bW91c19zdWJzY3JpcHRpb247IHRoZW4KICAgICAgcHJpbnRfaW5mbyAiQW5vbnltb3VzIHN1YnNjcmlwdGlvbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4gUHJvY2VlZGluZyB3aXRoIEFJIGNvbW1pdCBzdWdnZXN0aW9uLi4uIiA+JjIKICAgICAgIyBUb2tlbiBzaG91bGQgbm93IGJlIHNldCwgY29udGludWUgd2l0aCBub3JtYWwgZmxvdwogICAgZWxzZQogICAgICBwcmludF93YXJuaW5nICJGYWlsZWQgdG8gY3JlYXRlIGFub255bW91cyBzdWJzY3JpcHRpb24uIEFJIGZlYXR1cmVzIHdpbGwgYmUgZGlzYWJsZWQuIiA+JjIKICAgICAgcmV0dXJuIDEKICAgIGZpCiAgZmkKCiAgIyBNYWluIHJldHJ5IGxvb3AgZm9yIGhhbmRsaW5nIGF1dGhlbnRpY2F0aW9uIGVycm9ycwogIHdoaWxlIFtbICRyZXRyeV9jb3VudCAtbHQgJG1heF9yZXRyaWVzIF1dOyBkbwogICAgcmV0cnlfY291bnQ9JCgocmV0cnlfY291bnQgKyAxKSkKICAgIHByaW50X2RlYnVnICJERUJVRzogQUkgc3VnZ2VzdGlvbiBhdHRlbXB0ICRyZXRyeV9jb3VudC8kbWF4X3JldHJpZXMiID4mMgoKICAgICMgUmVzZXQgc3VnZ2VzdGVkX21lc3NhZ2UgZm9yIGVhY2ggYXR0ZW1wdAogICAgc3VnZ2VzdGVkX21lc3NhZ2U9IiIKCiAgICBpZiBfbWFrZV9haV9hcGlfY2FsbDsgdGhlbgogICAgICAjIFN1Y2Nlc3MgLSByZXR1cm4gdGhlIHJlc3VsdAogICAgICByZXR1cm4gMAogICAgZWxzZQogICAgICBsb2NhbCBleGl0X2NvZGU9JD8KICAgICAgaWYgW1sgJGV4aXRfY29kZSAtZXEgMiAmJiAkcmV0cnlfY291bnQgLWx0ICRtYXhfcmV0cmllcyBdXTsgdGhlbgogICAgICAgICMgRXhpdCBjb2RlIDIgaW5kaWNhdGVzIHJldHJ5IHNob3VsZCBoYXBwZW4gKG5ldyBjcmVkZW50aWFscyBhdmFpbGFibGUpCiAgICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBSZXRyeWluZyBBUEkgY2FsbCB3aXRoIG5ldyBjcmVkZW50aWFscy4uLiIgPiYyCiAgICAgICAgY29udGludWUKICAgICAgZWxzZQogICAgICAgICMgUmVhbCBmYWlsdXJlIG9yIG1heCByZXRyaWVzIHJlYWNoZWQKICAgICAgICByZXR1cm4gMQogICAgICBmaQogICAgZmkKICBkb25lCgogICMgSWYgd2UgZ2V0IGhlcmUsIHdlJ3ZlIGV4aGF1c3RlZCByZXRyaWVzCiAgcmV0dXJuIDEKfQoKIyBJbnRlcm5hbCBmdW5jdGlvbiB0byBtYWtlIHRoZSBhY3R1YWwgQVBJIGNhbGwKZnVuY3Rpb24gX21ha2VfYWlfYXBpX2NhbGwoKSB7CiAgbG9jYWwgZ2l0X2RpZmYKICBsb2NhbCBhaV9wcm9tcHQKICBsb2NhbCBhcGlfcmVzcG9uc2UKICBsb2NhbCBzdWdnZXN0ZWRfbWVzc2FnZQoKYnVsbGV0X3Byb21wdD0iQW5hbHl6ZSB0aGUgZm9sbG93aW5nIGdpdCBkaWZmIGFuZCBjcmVhdGUgYSBjb21taXQgbWVzc2FnZSB3aXRoIGJ1bGxldCBwb2ludHMuIEZvcm1hdCBhczoKJ0JyaWVmIHN1bW1hcnkgdGl0bGUKICAtIGZlYXQ6IGFkZCB1c2VyIGF1dGhlbnRpY2F0aW9uCiAgLSBmaXgoYXBpKTogcmVzb2x2ZSBzeW50YXggZXJyb3IKICAtIGRvY3M6IHVwZGF0ZSBSRUFETUUnCgpVc2UgcGFzdCB0ZW5zZSB2ZXJicy4gTm8gYmxhbmsgbGluZSBiZXR3ZWVuIHRpdGxlIGFuZCBidWxsZXRzLiBLZWVwIGNvbmNpc2UuIERvIG5vdCB3cmFwIHRoZSByZXNwb25zZSBpbiBxdW90ZXMuCgpHaXQgZGlmZjoKXCRnaXRfZGlmZiIKCmNvbnZlbnRpb25hbF9wcm9tcHQ9IkFuYWx5emUgdGhlIGZvbGxvd2luZyBnaXQgZGlmZiBhbmQgc3VnZ2VzdCBhIGNvbW1pdCBtZXNzYWdlIHVzaW5nIGNvbnZlbnRpb25hbCBjb21taXQgZm9ybWF0ICh0eXBlKHNjb3BlKTogZGVzY3JpcHRpb24pLiBFeGFtcGxlczogJ2ZlYXQ6IGFkZCB1c2VyIGF1dGhlbnRpY2F0aW9uJywgJ2ZpeChhcGkpOiByZXNvbHZlIG51bGwgcG9pbnRlciBleGNlcHRpb24nLCAnZG9jczogdXBkYXRlIFJFQURNRScuIEtlZXAgaXQgY29uY2lzZS4KCkdpdCBkaWZmOgpcJGdpdF9kaWZmIgoKc2ltcGxlX3Byb21wdD0iQW5hbHl6ZSB0aGUgZm9sbG93aW5nIGdpdCBkaWZmIGFuZCBzdWdnZXN0IGEgY29uY2lzZSwgZGVzY3JpcHRpdmUgY29tbWl0IG1lc3NhZ2UuIEtlZXAgaXQgdW5kZXIgNTAgY2hhcmFjdGVycyBmb3IgdGhlIGZpcnN0IGxpbmUsIHdpdGggYWRkaXRpb25hbCBkZXRhaWxzIG9uIHN1YnNlcXVlbnQgbGluZXMgaWYgbmVlZGVkLgoKR2l0IGRpZmY6ClwkZ2l0X2RpZmYiCgogICMgRGVidWcgdGVzdCAtIHRoaXMgc2hvdWxkIGFsd2F5cyBzaG93IGlmIGRlYnVnIGlzIGVuYWJsZWQKICAjIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0cmVhdCBkZWJ1Z19tb2RlPXRydWUgYXMgdmVyYm9zaXR5X2xldmVsPWRlYnVnCiAgaWYgW1sgIiRkZWJ1Z19tb2RlIiA9PSAidHJ1ZSIgJiYgIiR2ZXJib3NpdHlfbGV2ZWwiICE9ICJkZWJ1ZyIgXV07IHRoZW4KICAgICMgT25seSBsb2cgdGhpcyB3aGVuIG5vdCBhbHJlYWR5IGluIGRlYnVnIHZlcmJvc2l0eSB0byBhdm9pZCBub2lzZQogICAgbG9nX21lc3NhZ2UgIkRFUFJFQ0FURUQ6IFVzaW5nIGRlYnVnX21vZGU9dHJ1ZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIE1BSUFTU19WRVJCT1NJVFk9ZGVidWcgaW5zdGVhZC4iCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEFJIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIGRlYnVnX21vZGU9JGRlYnVnX21vZGUgKGRlcHJlY2F0ZWQsIHVzZSBNQUlBU1NfVkVSQk9TSVRZPWRlYnVnIGluc3RlYWQpIiAiZGVidWciID4mMgogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBNQUlBU1NfREVCVUc9JE1BSUFTU19ERUJVRyIgImRlYnVnIiA+JjIKICBlbGlmIFtbICIkdmVyYm9zaXR5X2xldmVsIiA9PSAiZGVidWciIF1dOyB0aGVuCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEFJIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHZlcmJvc2l0eV9sZXZlbD0kdmVyYm9zaXR5X2xldmVsIiAiZGVidWciID4mMgogIGZpCgogICMgRGVidWc6IFNob3cgY3VycmVudCBBSSBjb25maWd1cmF0aW9uCiAgcHJpbnRfZGVidWcgIkRFQlVHOiA9PT09PT09PT09IEFJIENPTU1JVCBTVUdHRVNUSU9OIFNUQVJUID09PT09PT09PT0iID4mMgogIHByaW50X2RlYnVnICJERUJVRzogYWlfbW9kZT0kYWlfbW9kZSIgPiYyCiAgcHJpbnRfZGVidWcgIkRFQlVHOiBhaV90b2tlbj0kKHJlZGFjdF92YWx1ZSAiJGFpX3Rva2VuIikiID4mMgogIHByaW50X2RlYnVnICJERUJVRzogbWFpYXNzX2hvc3Q9JG1haWFzc19ob3N0IiA+JjIKICBwcmludF9kZWJ1ZyAiREVCVUc6IG1haWFzc19lbmRwb2ludD0kbWFpYXNzX2VuZHBvaW50IiA+JjIKICBwcmludF9kZWJ1ZyAiREVCVUc6IGFpX21vZGVsPSRhaV9tb2RlbCIgPiYyCiAgcHJpbnRfZGVidWcgIkRFQlVHOiBhaV90ZW1wZXJhdHVyZT0kYWlfdGVtcGVyYXR1cmUiID4mMgoKICAjIEdldCBnaXQgZGlmZiBmb3IgY29udGV4dCAoaGFuZGxlIGVtcHR5IHJlcG9zaXRvcnkgY2FzZSkKICBpZiBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBnaXRfZGlmZj0kKGdpdCBkaWZmIC0tY2FjaGVkIC0tbm8tY29sb3IgMj4vZGV2L251bGwgfHwgZ2l0IGRpZmYgLS1uby1jb2xvciAyPi9kZXYvbnVsbCB8fCBlY2hvICJObyBjaGFuZ2VzIGRldGVjdGVkIikKICBlbHNlCiAgICAjIEZvciBlbXB0eSByZXBvc2l0b3J5LCBzaG93IGFsbCBzdGFnZWQgZmlsZXMgYXMgbmV3CiAgICBnaXRfZGlmZj0kKGdpdCBkaWZmIC0tY2FjaGVkIC0tbm8tY29sb3IgMj4vZGV2L251bGwgfHwgZWNobyAiSW5pdGlhbCBjb21taXQgLSBhbGwgZmlsZXMgYXJlIG5ldyIpCiAgZmkKICBnaXRfZGlmZj0kKGVjaG8gIiRnaXRfZGlmZiIgfCB0ciAtY2QgJ1wxMVwxMlwxNVw0MC1cMTc2JykKICBwcmludF9kZWJ1ZyAiREVCVUc6IEdpdCBkaWZmIGxlbmd0aDogJHsjZ2l0X2RpZmZ9IGNoYXJhY3RlcnMiID4mMgoKICAjIFRydW5jYXRlIGRpZmYgaWYgdG9vIGxvbmcgKEFQSSBoYXMgdG9rZW4gbGltaXRzKQogIGlmIFtbICR7I2dpdF9kaWZmfSAtZ3QgJGFpX21heF9jaGFyYWN0ZXJzIF1dOyB0aGVuCiAgICBnaXRfZGlmZj0iJHtnaXRfZGlmZjowOiRhaV9tYXhfY2hhcmFjdGVyc30uLi5bdHJ1bmNhdGVkXSIKICAgIHByaW50X2RlYnVnICJERUJVRzogR2l0IGRpZmYgdHJ1bmNhdGVkIHRvICRhaV9tYXhfY2hhcmFjdGVycyBjaGFyYWN0ZXJzIiA+JjIKICBmaQogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBwcm9tcHQgbW9kZTogJGFpX2NvbW1pdF9zdHlsZSIgPiYyCiAgZ2V0X2FpX2NvbW1pdF9tZXNzYWdlX3N0eWxlCiAgIyBDcmVhdGUgQUkgcHJvbXB0IGJhc2VkIG9uIGNvbW1pdCBzdHlsZQogIGNhc2UgIiRhaV9jb21taXRfc3R5bGUiIGluCiAgImJ1bGxldCIpCiAgICBhaV9wcm9tcHQ9IiR7YnVsbGV0X3Byb21wdC8vXCRnaXRfZGlmZi8kZ2l0X2RpZmZ9IgogICAgOzsKICAiY29udmVudGlvbmFsIikKICAgIGFpX3Byb21wdD0iJHtjb252ZW50aW9uYWxfcHJvbXB0Ly9cJGdpdF9kaWZmLyRnaXRfZGlmZn0iCiAgICA7OwogICJzaW1wbGUiKQogICAgYWlfcHJvbXB0PSIke3NpbXBsZV9wcm9tcHQvL1wkZ2l0X2RpZmYvJGdpdF9kaWZmfSIKICAgIDs7CiAgICAiY3VzdG9tIikKICAgIGlmIFtbIC1mICIubWFpYXNzLnByb21wdCIgXV07IHRoZW4KICAgICAgY3VzdG9tX3Byb21wdD0kKDwubWFpYXNzLnByb21wdCkKICAgICAgaWYgW1sgLW4gIiRjdXN0b21fcHJvbXB0IiAmJiAiJGN1c3RvbV9wcm9tcHQiID09ICoiXCRnaXRfZGlmZiIqIF1dOyB0aGVuCiAgICAgICAgYWlfcHJvbXB0PSIke2N1c3RvbV9wcm9tcHQvL1wkZ2l0X2RpZmYvJGdpdF9kaWZmfSIKICAgICAgZWxzZQogICAgICAgIHByaW50X3dhcm5pbmcgIi5tYWlhc3MucHJvbXB0IGlzIG1pc3Npbmcgb3IgZG9lcyBub3QgaW5jbHVkZSBcJGdpdF9kaWZmLiBVc2luZyBCdWxsZXQgZm9ybWF0LiIgPiYyCiAgICAgICAgYWlfcHJvbXB0PSIke2J1bGxldF9wcm9tcHQvL1wkZ2l0X2RpZmYvJGdpdF9kaWZmfSIKICAgICAgZmkKICAgIGVsc2UKICAgICAgcHJpbnRfd2FybmluZyAiU3R5bGUgJ2N1c3RvbScgc2VsZWN0ZWQgYnV0IC5tYWlhc3MucHJvbXB0IG5vdCBmb3VuZC4gVXNpbmcgQnVsbGV0IGZvcm1hdC4iID4mMgogICAgICBhaV9wcm9tcHQ9IiR7YnVsbGV0X3Byb21wdC8vXCRnaXRfZGlmZi8kZ2l0X2RpZmZ9IgogICAgZmkKICAgIDs7CiAgImdsb2JhbF9jdXN0b20iKQogICAgaWYgW1sgLWYgIiRIT01FLy5tYWlhc3MucHJvbXB0IiBdXTsgdGhlbgogICAgICBjdXN0b21fcHJvbXB0PSQoPCIkSE9NRS8ubWFpYXNzLnByb21wdCIpCiAgICAgIGlmIFtbIC1uICIkY3VzdG9tX3Byb21wdCIgJiYgIiRjdXN0b21fcHJvbXB0IiA9PSAqIlwkZ2l0X2RpZmYiKiBdXTsgdGhlbgogICAgICAgIGFpX3Byb21wdD0iJHtjdXN0b21fcHJvbXB0Ly9cJGdpdF9kaWZmLyRnaXRfZGlmZn0iCiAgICAgIGVsc2UKICAgICAgICBwcmludF93YXJuaW5nICIkSE9NRS8ubWFpYXNzLnByb21wdCBpcyBtaXNzaW5nIG9yIGRvZXMgbm90IGluY2x1ZGUgXCRnaXRfZGlmZi4gVXNpbmcgQnVsbGV0IGZvcm1hdC4iID4mMgogICAgICAgIGFpX3Byb21wdD0iJHtidWxsZXRfcHJvbXB0Ly9cJGdpdF9kaWZmLyRnaXRfZGlmZn0iCiAgICAgIGZpCiAgICBlbHNlCiAgICAgIHByaW50X3dhcm5pbmcgIlN0eWxlICdnbG9iYWxfY3VzdG9tJyBzZWxlY3RlZCBidXQgJEhPTUUvLm1haWFzcy5wcm9tcHQgbm90IGZvdW5kLiBVc2luZyBCdWxsZXQgZm9ybWF0LiIgPiYyCiAgICAgIGFpX3Byb21wdD0iJHtidWxsZXRfcHJvbXB0Ly9cJGdpdF9kaWZmLyRnaXRfZGlmZn0iCiAgICBmaQogICAgOzsKCiAgKikKICAgIHByaW50X3dhcm5pbmcgIlVua25vd24gY29tbWl0IG1lc3NhZ2Ugc3R5bGU6ICckYWlfY29tbWl0X3N0eWxlJy4gU2tpcHBpbmcgQUkgc3VnZ2VzdGlvbi4iID4mMgogICAgYWlfcHJvbXB0PSIke2J1bGxldF9wcm9tcHQvL1wkZ2l0X2RpZmYvJGdpdF9kaWZmfSIKICAgIDs7CmVzYWMKCiAgIyBDYWxsIEFJIEFQSQogIHByaW50X2RlYnVnICJERUJVRzogQ2FsbGluZyBBSSBBUEkgd2l0aCBtb2RlbDogJGFpX21vZGVsIiA+JjIKICBwcmludF9kZWJ1ZyAiREVCVUc6IEFJIHByb21wdCBzdHlsZTogJGFpX2NvbW1pdF9zdHlsZSIgPiYyCiAgcHJpbnRfZGVidWcgIkFJIHRlbXBlcmF0dXJlOiAkYWlfdGVtcGVyYXR1cmUiICA+JjIKCiAgIyBCdWlsZCBKU09OIHBheWxvYWQgdXNpbmcganEgaWYgYXZhaWxhYmxlIChoYW5kbGVzIGVzY2FwaW5nIGF1dG9tYXRpY2FsbHkpCiAgbG9jYWwganNvbl9wYXlsb2FkCiAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICMgRW5zdXJlIHRlbXBlcmF0dXJlIGlzIGEgbnVtYmVyIGZvciBqcQogICAgbG9jYWwgdGVtcF9udW0KICAgIHRlbXBfbnVtPSQoZWNobyAiJGFpX3RlbXBlcmF0dXJlIiB8IGdyZXAgLUUgJ15bMC05XSpcLj9bMC05XSskJyB8fCBlY2hvICIwLjciKQogICAganNvbl9wYXlsb2FkPSQoanEgLW4gLS1hcmcgbW9kZWwgIiRhaV9tb2RlbCIgLS1hcmdqc29uIHRlbXBlcmF0dXJlICIkdGVtcF9udW0iIC0tYXJnIHByb21wdCAiJGFpX3Byb21wdCIgJ3sKICAgICAgIm1vZGVsIjogJG1vZGVsLAogICAgICAibWVzc2FnZXMiOiBbCiAgICAgICAgeyJyb2xlIjogInN5c3RlbSIsICJjb250ZW50IjogIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudCB0aGF0IHdyaXRlcyBjb25jaXNlLCBkZXNjcmlwdGl2ZSBnaXQgY29tbWl0IG1lc3NhZ2VzIGJhc2VkIG9uIGNvZGUgY2hhbmdlcy4ifSwKICAgICAgICB7InJvbGUiOiAidXNlciIsICJjb250ZW50IjogJHByb21wdH0KICAgICAgXSwKICAgICAgIm1heF90b2tlbnMiOiAxNTAsCiAgICAgICJ0ZW1wZXJhdHVyZSI6ICR0ZW1wZXJhdHVyZQogICAgfScpCiAgZWxzZQogICAgIyBTaW1wbGUgZmFsbGJhY2sgLSByZXBsYWNlIHF1b3RlcyBhbmQgbmV3bGluZXMgb25seQogICAgbG9jYWwgc2FmZV9wcm9tcHQKICAgIHNhZmVfcHJvbXB0PSQocHJpbnRmICclcycgIiRhaV9wcm9tcHQiIHwgc2VkICdzLyIvXFwiL2cnIHwgdHIgJ1xuJyAnICcpCiAgICBqc29uX3BheWxvYWQ9J3sibW9kZWwiOiInJGFpX21vZGVsJyIsIm1lc3NhZ2VzIjpbeyJyb2xlIjoic3lzdGVtIiwiY29udGVudCI6IllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudCB0aGF0IHdyaXRlcyBjb25jaXNlLCBkZXNjcmlwdGl2ZSBnaXQgY29tbWl0IG1lc3NhZ2VzIGJhc2VkIG9uIGNvZGUgY2hhbmdlcy4ifSx7InJvbGUiOiJ1c2VyIiwiY29udGVudCI6Iickc2FmZV9wcm9tcHQnIn1dLCJtYXhfdG9rZW5zIjoxNTAsInRlbXBlcmF0dXJlIjonJHthaV90ZW1wZXJhdHVyZTotMC43fSd9JwogIGZpCgogIHByaW50X2RlYnVnICJERUJVRzogSlNPTiBwYXlsb2FkIGxlbmd0aDogJHsjanNvbl9wYXlsb2FkfSBjaGFyYWN0ZXJzIiA+JjIKICBwcmludF9kZWJ1ZyAiREVCVUc6IGVuZHBvaW50OiAke21haWFzc19lbmRwb2ludH0iID4mMgogIHByaW50X2RlYnVnICJERUJVRzogQWJvdXQgdG8gbWFrZSBBUEkgY2FsbC4uLiIgPiYyCgogICMgTWFrZSBBUEkgY2FsbCBhbmQgY2FwdHVyZSBib3RoIHJlc3BvbnNlIGFuZCBIVFRQIHN0YXR1cwogIGxvY2FsIGh0dHBfcmVzcG9uc2UKICBwcmludF9kZWJ1ZyAiREVCVUc6IEV4ZWN1dGluZyBjdXJsIHRvICRtYWlhc3NfZW5kcG9pbnQiID4mMgogIHByaW50X2RlYnVnICJERUJVRzogY3VybCBjb21tYW5kOiBjdXJsIC1zIC13IFwiXFxuJXtodHRwX2NvZGV9XCIgLVggUE9TVCBcIiRtYWlhc3NfZW5kcG9pbnRcIiAtSCBcIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblwiIC1IIFwiQXV0aG9yaXphdGlvbjogQmVhcmVyICR7YWlfdG9rZW46MDoxMH0uLi5cIiAtZCBcIltKU09OX1BBWUxPQURdXCIiID4mMgoKICAjIENoZWNrIGlmIHRoaXMgaXMgYW4gYW5vbnltb3VzIHRva2VuIGFuZCBpbmNsdWRlIG1hY2hpbmUgZmluZ2VycHJpbnQgaGVhZGVyCiAgbG9jYWwgY3VybF9oZWFkZXJzPSgpCiAgY3VybF9oZWFkZXJzKz0oIi1IIiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIikKICBjdXJsX2hlYWRlcnMrPSgiLUgiICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJGFpX3Rva2VuIikKICAjIEFsd2F5cyBzZW5kIGNsaWVudCBpZGVudGl0eS92ZXJzaW9uIGZvciBtaW4tdmVyc2lvbiBlbmZvcmNlbWVudCBhbmQgYW5hbHl0aWNzCiAgY3VybF9oZWFkZXJzKz0oIi1IIiAiWC1DbGllbnQtTmFtZTogJHtjbGllbnRfbmFtZTotYmFzaG1haWFzc30iKQogIGN1cmxfaGVhZGVycys9KCItSCIgIlgtQ2xpZW50LVZlcnNpb246ICR7Y2xpZW50X3ZlcnNpb246LTAuMC4wfSIpCgogIGlmIFtbICIkYWlfdG9rZW4iID09IGFub25fKiBdXTsgdGhlbgogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBBbm9ueW1vdXMgdG9rZW4gZGV0ZWN0ZWQsIGFkZGluZyBtYWNoaW5lIGZpbmdlcnByaW50IGhlYWRlciIgPiYyCiAgICAjIEdlbmVyYXRlIG1hY2hpbmUgZmluZ2VycHJpbnQgLSB0cnkgdjIgZmlyc3QsIGZhbGxiYWNrIHRvIHYxIGZvciBjb21wYXRpYmlsaXR5CiAgICBsb2NhbCBtYWNoaW5lX2ZpbmdlcnByaW50CiAgICBpZiBjb21tYW5kIC12IGdlbmVyYXRlX21hY2hpbmVfZmluZ2VycHJpbnRfdjIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIG1hY2hpbmVfZmluZ2VycHJpbnQ9JChnZW5lcmF0ZV9tYWNoaW5lX2ZpbmdlcnByaW50X3YyKQogICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEFkZGVkIG1hY2hpbmUgZmluZ2VycHJpbnQgdjIgaGVhZGVyOiAke21hY2hpbmVfZmluZ2VycHJpbnQ6MDoxMH0uLi4iID4mMgogICAgZWxpZiBjb21tYW5kIC12IGdlbmVyYXRlX21hY2hpbmVfZmluZ2VycHJpbnQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIG1hY2hpbmVfZmluZ2VycHJpbnQ9JChnZW5lcmF0ZV9tYWNoaW5lX2ZpbmdlcnByaW50KQogICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEFkZGVkIG1hY2hpbmUgZmluZ2VycHJpbnQgdjEgaGVhZGVyOiAke21hY2hpbmVfZmluZ2VycHJpbnQ6MDoxMH0uLi4iID4mMgogICAgZWxzZQogICAgICBtYWNoaW5lX2ZpbmdlcnByaW50PSQoZWNobyAtbiAiJCh1bmFtZSAtYSktJCh3aG9hbWkpLSQoZGF0ZSArJVkpIiB8IHNoYXN1bSAtYSAyNTYgfCBjdXQgLWQnICcgLWYxKQogICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEFkZGVkIG1hY2hpbmUgZmluZ2VycHJpbnQgaGVhZGVyIHVzaW5nIGZhbGxiYWNrOiAke21hY2hpbmVfZmluZ2VycHJpbnQ6MDoxMH0uLi4iID4mMgogICAgZmkKICAgIGN1cmxfaGVhZGVycys9KCItSCIgIlgtTWFjaGluZS1GaW5nZXJwcmludDogJG1hY2hpbmVfZmluZ2VycHJpbnQiKQogICAgCiAgICAjIEFkZCBzdWJzY3JpcHRpb24gSUQgaGVhZGVyIGlmIGF2YWlsYWJsZSBmb3IgYW5vbnltb3VzIHN1YnNjcmlwdGlvbnMKICAgIGlmIFtbIC1uICIkTUFJQVNTX1NVQlNDUklQVElPTl9JRCIgJiYgIiRNQUlBU1NfU1VCU0NSSVBUSU9OX0lEIiAhPSAibnVsbCIgXV07IHRoZW4KICAgICAgY3VybF9oZWFkZXJzKz0oIi1IIiAiWC1TdWJzY3JpcHRpb24tSUQ6ICRNQUlBU1NfU1VCU0NSSVBUSU9OX0lEIikKICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBBZGRlZCBzdWJzY3JpcHRpb24gSUQgaGVhZGVyOiAke01BSUFTU19TVUJTQ1JJUFRJT05fSUQ6MDoxMn0uLi4iID4mMgogICAgZmkKICBmaQoKICAjIFNob3cgc3Bpbm5lciBkdXJpbmcgQVBJIGNhbGwgKHVubGVzcyBpbiBkZWJ1ZyBtb2RlIHdoZXJlIHdlIHdhbnQgdG8gc2VlIHJhdyBvdXRwdXQpCiAgaWYgW1sgIiR2ZXJib3NpdHlfbGV2ZWwiICE9ICJkZWJ1ZyIgJiYgIiRkZWJ1Z19tb2RlIiAhPSAidHJ1ZSIgXV07IHRoZW4KICAgIHN0YXJ0X3NwaW5uZXIgIldhaXRpbmcgZm9yIEFJIHJlc3BvbnNlIgogIGZpCgogICMgU2V0IHRpbWVvdXQgZm9yIEFQSSBjYWxsIChkZWZhdWx0IDMwIHNlY29uZHMpCiAgbG9jYWwgdGltZW91dD0iJHthaV90aW1lb3V0Oi0zMH0iCiAgcHJpbnRfZGVidWcgIkRFQlVHOiBBUEkgdGltZW91dCBzZXQgdG8gJHt0aW1lb3V0fSBzZWNvbmRzIiA+JjIKCiAgaHR0cF9yZXNwb25zZT0kKGN1cmwgLXMgLXcgIlxuJXtodHRwX2NvZGV9IiAtLW1heC10aW1lICIkdGltZW91dCIgLVggUE9TVCAiJG1haWFzc19lbmRwb2ludCIgXAogICAgIiR7Y3VybF9oZWFkZXJzW0BdfSIgXAogICAgLWQgIiRqc29uX3BheWxvYWQiIDI+JjEpCgogIGxvY2FsIGN1cmxfZXhpdF9jb2RlPSQ/CiAgCiAgIyBTdG9wIHNwaW5uZXIgYWZ0ZXIgQVBJIGNhbGwgY29tcGxldGVzCiAgaWYgW1sgIiR2ZXJib3NpdHlfbGV2ZWwiICE9ICJkZWJ1ZyIgJiYgIiRkZWJ1Z19tb2RlIiAhPSAidHJ1ZSIgXV07IHRoZW4KICAgIHN0b3Bfc3Bpbm5lciAkY3VybF9leGl0X2NvZGUKICBmaQogIAogIHByaW50X2RlYnVnICJERUJVRzogY3VybCBleGl0IGNvZGU6ICRjdXJsX2V4aXRfY29kZSIgPiYyCgogIHByaW50X2RlYnVnICJERUJVRzogY3VybCBjb21wbGV0ZWQsIHByb2Nlc3NpbmcgcmVzcG9uc2UuLi4iID4mMgoKICAjIFNwbGl0IHJlc3BvbnNlIGFuZCBzdGF0dXMgY29kZSB1c2luZyBtb3JlIHBvcnRhYmxlIG1ldGhvZAogIGxvY2FsIGh0dHBfc3RhdHVzCiAgaHR0cF9zdGF0dXM9JChlY2hvICIkaHR0cF9yZXNwb25zZSIgfCB0YWlsIC1uIDEpCiAgbG9jYWwgYXBpX3Jlc3BvbnNlCiAgIyBVc2Ugc2VkIHRvIHJlbW92ZSBsYXN0IGxpbmUgaW5zdGVhZCBvZiBoZWFkIC1uIC0xICh3aGljaCBkb2Vzbid0IHdvcmsgb24gbWFjT1MpCiAgYXBpX3Jlc3BvbnNlPSQoZWNobyAiJGh0dHBfcmVzcG9uc2UiIHwgc2VkICckZCcpCgogIHByaW50X2RlYnVnICJERUJVRzogSFRUUCBTdGF0dXM6ICRodHRwX3N0YXR1cyIgPiYyCiAgcHJpbnRfZGVidWcgIkRFQlVHOiBSZXNwb25zZSBsZW5ndGg6ICR7I2FwaV9yZXNwb25zZX0gY2hhcmFjdGVycyIgPiYyCiAgcHJpbnRfdHJhY2UgIlRSQUNFOiBSYXcgQVBJIHJlc3BvbnNlOiAke2FwaV9yZXNwb25zZX0iID4mMgogIHByaW50X3RyYWNlICJUUkFDRTogRnVsbCBjdXJsIHJlc3BvbnNlOiAkaHR0cF9yZXNwb25zZSIgPiYyCgogIHByaW50X2RlYnVnICJERUJVRzogQVBJIHRva2VuOiAkKG1hc2tfYXBpX2tleSAiJHthaV90b2tlbn0iKSAiID4mMgoKICAjIEV4dHJhY3QgdGhlIHN1Z2dlc3RlZCBtZXNzYWdlIGZyb20gQVBJIHJlc3BvbnNlCiAgaWYgW1sgLW4gIiRhcGlfcmVzcG9uc2UiIF1dOyB0aGVuCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IFByb2Nlc3NpbmcgQVBJIHJlc3BvbnNlLi4uIiA+JjIKICBlbHNlCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEVtcHR5IEFQSSByZXNwb25zZSBkZXRlY3RlZCIgPiYyCiAgICBpZiBbWyAiJGN1cmxfZXhpdF9jb2RlIiAtZXEgMjggXV07IHRoZW4KICAgICAgcHJpbnRfZXJyb3IgIkFJIHJlcXVlc3QgdGltZWQgb3V0IGFmdGVyICR7YWlfdGltZW91dDotMzB9IHNlY29uZHMiID4mMgogICAgICBwcmludF9pbmZvICJUaGUgQUkgc2VydmljZSBtaWdodCBiZSBzbG93IG9yIHVucmVzcG9uc2l2ZS4gVHJ5IGFnYWluIG9yIGluY3JlYXNlIE1BSUFTU19BSV9USU1FT1VULiIgPiYyCiAgICAgIHJldHVybiAxCiAgICBlbGlmIFtbICIkY3VybF9leGl0X2NvZGUiIC1uZSAwIF1dOyB0aGVuCiAgICAgIHByaW50X2Vycm9yICJjdXJsIGNvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICRjdXJsX2V4aXRfY29kZSIgPiYyCiAgICAgIHByaW50X2RlYnVnICJERUJVRzogQ2hlY2sgaWYgbWFpYXNzLXByb3h5IGlzIHJ1bm5pbmcgYXQgJG1haWFzc19lbmRwb2ludCIgPiYyCiAgICAgIHJldHVybiAxCiAgICBlbGlmIFtbICIkaHR0cF9zdGF0dXMiID09ICIwMDAiIF1dOyB0aGVuCiAgICAgIHByaW50X2Vycm9yICJDb25uZWN0aW9uIGZhaWxlZCAtIGNoZWNrIGlmIG1haWFzcy1wcm94eSBpcyBydW5uaW5nIGF0ICRtYWlhc3NfZW5kcG9pbnQiID4mMgogICAgICByZXR1cm4gMQogICAgZWxzZQogICAgICBwcmludF93YXJuaW5nICJFbXB0eSByZXNwb25zZSB3aXRoIEhUVFAgc3RhdHVzICRodHRwX3N0YXR1cyIgPiYyCiAgICBmaQogIGZpCgogIGlmIFtbIC1uICIkYXBpX3Jlc3BvbnNlIiBdXTsgdGhlbgogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBQcm9jZXNzaW5nIEFQSSByZXNwb25zZS4uLiIgPiYyCiAgICAjIENoZWNrIEhUVFAgc3RhdHVzIGNvZGUgZmlyc3QKICAgIGNhc2UgIiRodHRwX3N0YXR1cyIgaW4KICAgICAgNDAxKQogICAgICAgIHByaW50X2RlYnVnICJERUJVRzogSFRUUCA0MDEgLSBJbnZhbGlkIEFQSSBrZXkiID4mMgogICAgICAgIGlmIGhhbmRsZV9pbnZhbGlkX2FwaV9rZXlfZXJyb3I7IHRoZW4KICAgICAgICAgICMgRXJyb3IgaGFuZGxlciBpbmRpY2F0ZXMgd2Ugc2hvdWxkIHJldHJ5IHdpdGggbmV3IGNyZWRlbnRpYWxzCiAgICAgICAgICByZXR1cm4gMgogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgICAgICA7OwogICAgICA0MDIpCiAgICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBIVFRQIDQwMiAtIFF1b3RhIGV4Y2VlZGVkIiA+JjIKICAgICAgICAjIEV4dHJhY3QgcGF5bWVudCBVUkwgYW5kIG90aGVyIGRldGFpbHMgZnJvbSA0MDIgcmVzcG9uc2UKICAgICAgICBsb2NhbCBwYXltZW50X3VybD0iIgogICAgICAgIGxvY2FsIGNyZWRpdHNfcmVtYWluaW5nPSIiCiAgICAgICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgIHBheW1lbnRfdXJsPSQoZWNobyAiJGFwaV9yZXNwb25zZSIgfCBqcSAtciAnLmVycm9yLnBheW1lbnRfdXJsIC8vIGVtcHR5JyAyPi9kZXYvbnVsbCkKICAgICAgICAgIGNyZWRpdHNfcmVtYWluaW5nPSQoZWNobyAiJGFwaV9yZXNwb25zZSIgfCBqcSAtciAnLmVycm9yLmNyZWRpdHNfcmVtYWluaW5nIC8vIGVtcHR5JyAyPi9kZXYvbnVsbCkKICAgICAgICBlbHNlCiAgICAgICAgICBwYXltZW50X3VybD0kKGVjaG8gIiRhcGlfcmVzcG9uc2UiIHwgZ3JlcCAtbyAnInBheW1lbnRfdXJsIjoiW14iXSoiJyB8IHNlZCAncy8icGF5bWVudF91cmwiOiIvLycgfCBzZWQgJ3MvIiQvLycgfCBoZWFkIC0xKQogICAgICAgICAgY3JlZGl0c19yZW1haW5pbmc9JChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGdyZXAgLW8gJyJjcmVkaXRzX3JlbWFpbmluZyI6WzAtOV0qJyB8IHNlZCAncy8iY3JlZGl0c19yZW1haW5pbmciOi8vJyB8IGhlYWQgLTEpCiAgICAgICAgZmkKICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEV4dHJhY3RlZCBwYXltZW50X3VybD0kcGF5bWVudF91cmwsIGNyZWRpdHNfcmVtYWluaW5nPSRjcmVkaXRzX3JlbWFpbmluZyIgPiYyCiAgICAgICAgaWYgaGFuZGxlX3F1b3RhX2V4Y2VlZGVkX2Vycm9yICJUb2tlbiBxdW90YSBleGNlZWRlZCAoSFRUUCA0MDIpIiAiJHBheW1lbnRfdXJsIiAiJGNyZWRpdHNfcmVtYWluaW5nIjsgdGhlbgogICAgICAgICAgIyBFcnJvciBoYW5kbGVyIGluZGljYXRlcyB3ZSBzaG91bGQgcmV0cnkgd2l0aCBuZXcgY3JlZGVudGlhbHMKICAgICAgICAgIHJldHVybiAyCiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIDEKICAgICAgICBmaQogICAgICAgIDs7CiAgICAgIDQwMykKICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEhUVFAgNDAzIC0gRm9yYmlkZGVuIiA+JjIKICAgICAgICAjIENoZWNrIGlmIHRoaXMgaXMgYW4gaW52YWxpZCBBUEkga2V5IGVycm9yIGluIGRpc2d1aXNlCiAgICAgICAgaWYgZWNobyAiJGFwaV9yZXNwb25zZSIgfCBncmVwIC1xICciY29kZSI6ImludmFsaWRfYXBpX2tleSInOyB0aGVuCiAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEhUVFAgNDAzIGNvbnRhaW5zIGludmFsaWRfYXBpX2tleSBlcnJvciBjb2RlIiA+JjIKICAgICAgICAgIGlmIGhhbmRsZV9pbnZhbGlkX2FwaV9rZXlfZXJyb3I7IHRoZW4KICAgICAgICAgICAgIyBFcnJvciBoYW5kbGVyIGluZGljYXRlcyB3ZSBzaG91bGQgcmV0cnkgd2l0aCBuZXcgY3JlZGVudGlhbHMKICAgICAgICAgICAgcmV0dXJuIDIKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgIGZpCiAgICAgICAgZWxzZQogICAgICAgICAgcHJpbnRfd2FybmluZyAiQWNjZXNzIGZvcmJpZGRlbi4gQ2hlY2sgeW91ciBBUEkga2V5IHBlcm1pc3Npb25zLiIgPiYyCiAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEhUVFAgNDAzIHJlc3BvbnNlOiAkYXBpX3Jlc3BvbnNlIiA+JjIKICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgICAgICA7OwogICAgICA0MjkpCiAgICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBIVFRQIDQyOSAtIFJhdGUgbGltaXQgZXhjZWVkZWQiID4mMgogICAgICAgIHByaW50X3dhcm5pbmcgIlJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuIiA+JjIKICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEhUVFAgNDI5IHJlc3BvbnNlOiAkYXBpX3Jlc3BvbnNlIiA+JjIKICAgICAgICByZXR1cm4gMQogICAgICAgIDs7CiAgICAgIDUqKQogICAgICAgIHByaW50X2RlYnVnICJERUJVRzogSFRUUCAkaHR0cF9zdGF0dXMgLSBTZXJ2ZXIgZXJyb3IiID4mMgogICAgICAgIHByaW50X3dhcm5pbmcgIkFJIHNlcnZpY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgKEhUVFAgJGh0dHBfc3RhdHVzKS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4iID4mMgogICAgICAgIHByaW50X2RlYnVnICJERUJVRzogSFRUUCAkaHR0cF9zdGF0dXMgcmVzcG9uc2U6ICRhcGlfcmVzcG9uc2UiID4mMgogICAgICAgIHJldHVybiAxCiAgICAgICAgOzsKICAgIGVzYWMKCiAgICAjIENoZWNrIGZvciBBUEkgZXJyb3IgaW4gSlNPTiByZXNwb25zZQogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBDaGVja2luZyBmb3IgSlNPTiBlcnJvcnMgaW4gcmVzcG9uc2UuLi4iID4mMgogICAgaWYgZWNobyAiJGFwaV9yZXNwb25zZSIgfCBncmVwIC1xICciZXJyb3IiJzsgdGhlbgogICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEZvdW5kIGVycm9yIGluIEpTT04gcmVzcG9uc2UiID4mMgogICAgICBlcnJvcl9tc2c9JChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGdyZXAgLW8gJyJtZXNzYWdlIjoiW14iXSoiJyB8IHNlZCAncy8ibWVzc2FnZSI6Ii8vJyB8IHNlZCAncy8iJC8vJyB8IGhlYWQgLTEpCiAgICAgIGVycm9yX2NvZGU9JChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGdyZXAgLW8gJyJjb2RlIjoiW14iXSoiJyB8IHNlZCAncy8iY29kZSI6Ii8vJyB8IHNlZCAncy8iJC8vJyB8IGhlYWQgLTEpCgogICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEpTT04gZXJyb3JfY29kZT0kZXJyb3JfY29kZSwgZXJyb3JfbXNnPSRlcnJvcl9tc2ciID4mMgoKICAgICAgIyBIYW5kbGUgc3BlY2lmaWMgZXJyb3IgdHlwZXMKICAgICAgY2FzZSAiJGVycm9yX2NvZGUiIGluCiAgICAgICAgImludmFsaWRfYXBpX2tleSIpCiAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEpTT04gZXJyb3IgLSBpbnZhbGlkX2FwaV9rZXkiID4mMgogICAgICAgICAgaWYgaGFuZGxlX2ludmFsaWRfYXBpX2tleV9lcnJvcjsgdGhlbgogICAgICAgICAgICAjIEVycm9yIGhhbmRsZXIgaW5kaWNhdGVzIHdlIHNob3VsZCByZXRyeSB3aXRoIG5ldyBjcmVkZW50aWFscwogICAgICAgICAgICByZXR1cm4gMgogICAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgZmkKICAgICAgICAgIDs7CiAgICAgICAgInF1b3RhX2V4Y2VlZGVkInwiaW5zdWZmaWNpZW50X3F1b3RhInwiaW5zdWZmaWNpZW50X2NyZWRpdCIpCiAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEpTT04gZXJyb3IgLSBxdW90YS9jcmVkaXQgaXNzdWUiID4mMgogICAgICAgICAgIyBTa2lwIGhhbmRsaW5nIGhlcmUgc2luY2UgSFRUUCA0MDIgYWxyZWFkeSBoYW5kbGVkIHF1b3RhIGV4Y2VlZGVkCiAgICAgICAgICAjIFRoaXMgcHJldmVudHMgdGhlIGRvdWJsZSBwcm9tcHQgaXNzdWUKICAgICAgICAgIHByaW50X2RlYnVnICJERUJVRzogUXVvdGEgZXJyb3IgYWxyZWFkeSBoYW5kbGVkIGJ5IEhUVFAgc3RhdHVzIGNvZGUsIHNraXBwaW5nIGR1cGxpY2F0ZSBoYW5kbGluZyIgPiYyCiAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgOzsKICAgICAgICAqKQogICAgICAgICAgcHJpbnRfd2FybmluZyAiQVBJIEVycm9yOiAkZXJyb3JfbXNnIiA+JjIKICAgICAgICAgIGlmIFtbIC1uICIkZXJyb3JfY29kZSIgXV07IHRoZW4KICAgICAgICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBFcnJvciBjb2RlOiAkZXJyb3JfY29kZSIgPiYyCiAgICAgICAgICBmaQogICAgICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBGdWxsIGVycm9yIHJlc3BvbnNlOiAkYXBpX3Jlc3BvbnNlIiA+JjIKICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICA7OwogICAgICBlc2FjCiAgICBmaQoKICAgIHByaW50X2RlYnVnICJERUJVRzogQXR0ZW1wdGluZyB0byBwYXJzZSBKU09OIHJlc3BvbnNlIiA+JjIKCiAgICAjIFRyeSBqcSBmaXJzdCBpZiBhdmFpbGFibGUgKG1vc3QgcmVsaWFibGUpCiAgICBpZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IFVzaW5nIGpxIGZvciBKU09OIHBhcnNpbmciID4mMgogICAgICBzdWdnZXN0ZWRfbWVzc2FnZT0kKGVjaG8gIiRhcGlfcmVzcG9uc2UiIHwganEgLXIgJy5jaG9pY2VzWzBdLm1lc3NhZ2UuY29udGVudCAvLyBlbXB0eScgMj4vZGV2L251bGwpCiAgICAgIHByaW50X2RlYnVnICJERUJVRzoganEgcmVzdWx0OiAnJHN1Z2dlc3RlZF9tZXNzYWdlJyIgPiYyCgogICAgICAjIEV4dHJhY3QgY3JlZGl0IHVzYWdlIGluZm9ybWF0aW9uIGZyb20gYmlsbGluZyBzZWN0aW9uIGlmIGF2YWlsYWJsZQogICAgICBsb2NhbCBjcmVkaXRzX3VzZWQgY3JlZGl0c19yZW1haW5pbmcgY29zdCB3YXJuaW5nX21zZ3MKICAgICAgY3JlZGl0c191c2VkPSQoZWNobyAiJGFwaV9yZXNwb25zZSIgfCBqcSAtciAnLmJpbGxpbmcuY3JlZGl0c191c2VkIC8vIGVtcHR5JyAyPi9kZXYvbnVsbCkKICAgICAgY3JlZGl0c19yZW1haW5pbmc9JChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGpxIC1yICcuYmlsbGluZy5jcmVkaXRzX3JlbWFpbmluZyAvLyBlbXB0eScgMj4vZGV2L251bGwpCiAgICAgIGNvc3Q9JChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGpxIC1yICcuYmlsbGluZy5jb3N0IC8vIGVtcHR5JyAyPi9kZXYvbnVsbCkKCiAgICAgICMgRXh0cmFjdCB3YXJuaW5nIG1lc3NhZ2VzIGZyb20gbWVzc2FnZXMgYXJyYXkgLSBnZXQganVzdCB0aGUgdGV4dCBmaWVsZAogICAgICB3YXJuaW5nX21zZ3M9JChlY2hvICIkYXBpX3Jlc3BvbnNlIiB8IGpxIC1yICcubWVzc2FnZXNbXT8udGV4dCAvLyBlbXB0eScgMj4vZGV2L251bGwpCgogICAgICAjIFN0b3JlIGNyZWRpdCBkYXRhIGZvciBlbmQtb2YtcnVuIHN1bW1hcnkgZGlzcGxheQogICAgICBpZiBbWyAtbiAiJGNyZWRpdHNfdXNlZCIgJiYgIiRjcmVkaXRzX3VzZWQiICE9ICJlbXB0eSIgJiYgIiRjcmVkaXRzX3VzZWQiICE9ICJudWxsIiBdXTsgdGhlbgogICAgICAgIGVjaG8gIkNSRURJVFNfVVNFRD0kY3JlZGl0c191c2VkIiA+IC90bXAvbWFpYXNzX3Nlc3Npb25fZGF0YS50bXAKICAgICAgICBlY2hvICJBSV9NT0RFTD0kYWlfbW9kZWwiID4+IC90bXAvbWFpYXNzX3Nlc3Npb25fZGF0YS50bXAKICAgICAgZmkKICAgICAgaWYgW1sgLW4gIiRjcmVkaXRzX3JlbWFpbmluZyIgJiYgIiRjcmVkaXRzX3JlbWFpbmluZyIgIT0gImVtcHR5IiAmJiAiJGNyZWRpdHNfcmVtYWluaW5nIiAhPSAibnVsbCIgXV07IHRoZW4KICAgICAgICBlY2hvICJDUkVESVRTX1JFTUFJTklORz0kY3JlZGl0c19yZW1haW5pbmciID4+IC90bXAvbWFpYXNzX3Nlc3Npb25fZGF0YS50bXAKICAgICAgZmkKCiAgICAgIGlmIFtbIC1uICIkY29zdCIgJiYgIiRjb3N0IiAhPSAiZW1wdHkiICYmICIkY29zdCIgIT0gIm51bGwiIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfZGVidWcgIkNvc3Q6ICQke2Nvc3R9IiA+JjIKICAgICAgZmkKCiAgICAgICMgU3RvcmUgd2FybmluZyBtZXNzYWdlcyBmb3IgbGF0ZXIgZGlzcGxheSAoYWZ0ZXIgY29tbWl0IG1lc3NhZ2Ugc3VnZ2VzdGlvbikKICAgICAgaWYgW1sgLW4gIiR3YXJuaW5nX21zZ3MiICYmICIkd2FybmluZ19tc2dzIiAhPSAiZW1wdHkiICYmICIkd2FybmluZ19tc2dzIiAhPSAibnVsbCIgXV07IHRoZW4KICAgICAgICAjIFN0b3JlIHdhcm5pbmdzIGluIHRlbXAgZmlsZSBmb3IgZGlzcGxheSBpbiBzaWduLW9mZgogICAgICAgIGVjaG8gIkFJX1dBUk5JTkdTPDxFT0YiID4+IC90bXAvbWFpYXNzX3Nlc3Npb25fZGF0YS50bXAKICAgICAgICBlY2hvICIkd2FybmluZ19tc2dzIiA+PiAvdG1wL21haWFzc19zZXNzaW9uX2RhdGEudG1wCiAgICAgICAgZWNobyAiRU9GIiA+PiAvdG1wL21haWFzc19zZXNzaW9uX2RhdGEudG1wCiAgICAgIGZpCiAgICBmaQoKICAgICMgRmFsbGJhY2sgdG8gc2VkIHBhcnNpbmcgaWYganEgbm90IGF2YWlsYWJsZSBvciBmYWlsZWQKICAgIGlmIFtbIC16ICIkc3VnZ2VzdGVkX21lc3NhZ2UiIF1dOyB0aGVuCiAgICAgIHByaW50X2RlYnVnICJERUJVRzoganEgZmFpbGVkLCB0cnlpbmcgc2VkIHBhcnNpbmciID4mMgogICAgICAjIEhhbmRsZSB0aGUgYWN0dWFsIEFJIHJlc3BvbnNlIHN0cnVjdHVyZSB3aXRoIG5lc3RlZCBvYmplY3RzCiAgICAgIHN1Z2dlc3RlZF9tZXNzYWdlPSQoZWNobyAiJGFwaV9yZXNwb25zZSIgfCBzZWQgLW4gJ3MvLioiY29udGVudCI6IlwoW14iXSpcKSIuKi9cMS9wJyB8IHRhaWwgLTEpCiAgICAgIHByaW50X2RlYnVnICJERUJVRzogc2VkIHJlc3VsdDogJyRzdWdnZXN0ZWRfbWVzc2FnZSciCiAgICBmaQoKICAgICMgTGFzdCByZXNvcnQ6IHNpbXBsZSBncmVwIGFwcHJvYWNoCiAgICBpZiBbWyAteiAiJHN1Z2dlc3RlZF9tZXNzYWdlIiBdXTsgdGhlbgogICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IHNlZCBmYWlsZWQsIHRyeWluZyBncmVwIGFwcHJvYWNoIgogICAgICBzdWdnZXN0ZWRfbWVzc2FnZT0kKGVjaG8gIiRhcGlfcmVzcG9uc2UiIHwgZ3JlcCAtbyAnImNvbnRlbnQiOiJbXiJdKiInIHwgc2VkICdzLyJjb250ZW50IjoiLy8nIHwgc2VkICdzLyIkLy8nIHwgdGFpbCAtMSkKICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBncmVwIHJlc3VsdDogJyRzdWdnZXN0ZWRfbWVzc2FnZSciCiAgICBmaQoKICAgICMgU2hvdyByYXcgQVBJIHJlc3BvbnNlIGlmIGRlYnVnIG1vZGUgYW5kIHBhcnNpbmcgZmFpbGVkCiAgICBpZiBbWyAiJGRlYnVnX21vZGUiID09ICJ0cnVlIiAmJiAteiAiJHN1Z2dlc3RlZF9tZXNzYWdlIiBdXTsgdGhlbgogICAgICBwcmludF9kZWJ1ZyAiQWxsIHBhcnNpbmcgbWV0aG9kcyBmYWlsZWQuIFJhdyBBUEkgcmVzcG9uc2U6IgogICAgICBpZiBbWyAkeyNhcGlfcmVzcG9uc2V9IC1sdCAxMDAwIF1dOyB0aGVuCiAgICAgICAgcHJpbnRfZGVidWcgIiRhcGlfcmVzcG9uc2UiCiAgICAgIGVsc2UKICAgICAgICBwcmludF9kZWJ1ZyAiJHthcGlfcmVzcG9uc2U6MDoxMDAwfS4uLlt0cnVuY2F0ZWRdIgogICAgICBmaQogICAgZmkKCiAgICAjIENsZWFuIHVwIGVzY2FwZWQgY2hhcmFjdGVycyBhbmQgbWFya2Rvd24gZm9ybWF0dGluZwogICAgc3VnZ2VzdGVkX21lc3NhZ2U9JChlY2hvICIkc3VnZ2VzdGVkX21lc3NhZ2UiIHwgc2VkICdzL1xcbi9cbi9nJyB8IHNlZCAncy9cXHQvXHQvZycgfCBzZWQgJ3MvXFxcXC9cXC9nJykKCiAgICAjIFJlbW92ZSBtYXJrZG93biBjb2RlIGJsb2NrcyAodHJpcGxlIGJhY2t0aWNrcykKICAgIHN1Z2dlc3RlZF9tZXNzYWdlPSQoZWNobyAiJHN1Z2dlc3RlZF9tZXNzYWdlIiB8IHNlZCAnL15gYGAvZCcpCgogICAgIyBSZW1vdmUgZXh0cmEgcXVvdGVzIHRoYXQgbWlnaHQgd3JhcCB0aGUgZW50aXJlIG1lc3NhZ2UKICAgIHN1Z2dlc3RlZF9tZXNzYWdlPSQoZWNobyAiJHN1Z2dlc3RlZF9tZXNzYWdlIiB8IHNlZCAicy9eJ1xcKC4qXFwpJyQvXFwxLyIgfCBzZWQgJ3MvXiJcXCguKlxcKSIkL1xcMS8nKQoKICAgICMgQ2xlYW4gdXAgdGhlIG1lc3NhZ2UgLSByZW1vdmUgbGVhZGluZyBlbXB0eSBsaW5lcyBhbmQgZm9ybWF0IGJ1bGxldCBwb2ludHMKICAgICMgUmVtb3ZlIGxlYWRpbmcgZW1wdHkgbGluZXMKICAgIHN1Z2dlc3RlZF9tZXNzYWdlPSQocHJpbnRmICclcycgIiRzdWdnZXN0ZWRfbWVzc2FnZSIgfCBzZWQgJy8uLywkIWQnKQoKICAgICMgUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGVhY2ggbGluZSBhbmQgYWRkIHByb3BlciBmb3JtYXR0aW5nCiAgICBzdWdnZXN0ZWRfbWVzc2FnZT0kKHByaW50ZiAnJXMnICIkc3VnZ2VzdGVkX21lc3NhZ2UiIHwgc2VkICdzL15bWzpzcGFjZTpdXSovLycgfCBzZWQgJ3MvW1s6c3BhY2U6XV0qJC8vJykKCiAgICAjIEFkZCB0YWIgYmVmb3JlIGJ1bGxldCBwb2ludHMgZm9yIHByb3BlciBpbmRlbnRhdGlvbgogICAgc3VnZ2VzdGVkX21lc3NhZ2U9JChwcmludGYgJyVzJyAiJHN1Z2dlc3RlZF9tZXNzYWdlIiB8IHNlZCAncy9eW1s6c3BhY2U6XV0qLVtbOnNwYWNlOl1dKi9cdC0gLycpCgogICAgIyByZW1vdmUgYW55IGVtcHR5IGxpbmVzIGF0IHRoZSBiZWdpbm5pbmcgb2Ygc3VnZ2VzdGVkX21lc3NhZ2UKICAgIHN1Z2dlc3RlZF9tZXNzYWdlPSQocHJpbnRmICIlcyIgIiRzdWdnZXN0ZWRfbWVzc2FnZSIgfCBzZWQgJy8uLywkIWQnKQoKICAgIHByaW50X2RlYnVnICJERUJVRzogRmluYWwgY2xlYW5lZCBtZXNzYWdlOiAnJHN1Z2dlc3RlZF9tZXNzYWdlJyIgPiYyCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IE1lc3NhZ2UgbGVuZ3RoOiAkeyNzdWdnZXN0ZWRfbWVzc2FnZX0gY2hhcmFjdGVycyIgPiYyCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEZpcnN0IDEwMCBjaGFycyB3aXRoIHZpc2libGUgbmV3bGluZXM6ICQocHJpbnRmICclcScgIiR7c3VnZ2VzdGVkX21lc3NhZ2U6MDoxMDB9IikiID4mMgogICAgcHJpbnRfZGVidWcgIkRFQlVHOiBNZXNzYWdlIHZhbGlkYXRpb246IG5vbi1lbXB0eT0kKHRlc3QgLW4gIiRzdWdnZXN0ZWRfbWVzc2FnZSIgJiYgZWNobyAidHJ1ZSIgfHwgZWNobyAiZmFsc2UiKSwgbm90LW51bGw9JCh0ZXN0ICIkc3VnZ2VzdGVkX21lc3NhZ2UiICE9ICJudWxsIiAmJiBlY2hvICJ0cnVlIiB8fCBlY2hvICJmYWxzZSIpIiA+JjIKCiAgICBpZiBbWyAtbiAiJHN1Z2dlc3RlZF9tZXNzYWdlIiAmJiAiJHN1Z2dlc3RlZF9tZXNzYWdlIiAhPSAibnVsbCIgXV07IHRoZW4KICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBNZXNzYWdlIHZhbGlkYXRpb24gcGFzc2VkLCByZXR1cm5pbmcgc3VnZ2VzdGlvbiIgPiYyCiAgICAgIGVjaG8gIiRzdWdnZXN0ZWRfbWVzc2FnZSIKICAgICAgcmV0dXJuIDAKICAgIGVsc2UKICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBObyB2YWxpZCBtZXNzYWdlIGV4dHJhY3RlZCAoZW1wdHkgb3IgbnVsbCkiCiAgICBmaQogIGVsc2UKICAgIHByaW50X2RlYnVnICJERUJVRzogRW1wdHkgQVBJIHJlc3BvbnNlIgogIGZpCgogICMgUmV0dXJuIGVtcHR5IGlmIEFJIHN1Z2dlc3Rpb24gZmFpbGVkCiAgcmV0dXJuIDEKfQoKZmkgIyBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX2FpX3NoCiMgLS0tIEVuZCBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi9jb3JlL2FpLnNoIC0tLQoKIyAtLS0gQmVnaW4gaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvY29yZS9jb21taXQuc2ggLS0tCmlmIFtbIC16ICIke19fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfY29tbWl0X3NoOi19IiBdXTsgdGhlbiBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX2NvbW1pdF9zaD0xCgpmdW5jdGlvbiBnZXRfY29tbWl0X21lc3NhZ2UoKSB7CiAgY29tbWl0X21lc3NhZ2U9IiIKICBqaXJhX3RpY2tldF9udW1iZXI9IiIKICBsb2NhbCBhaV9zdWdnZXN0aW9uPSIiCiAgbG9jYWwgdXNlX2FpPWZhbHNlCgogICMgRXh0cmFjdCB0aWNrZXQgbnVtYmVyIGZyb20gYnJhbmNoIG5hbWUg4oCUIHN1cHBvcnRzIEppcmEgKEFCQy0xMjMpLAogICMgbnVtZXJpYyAoIzEyMyBvciAxMjMpLCB3aXRoIG9yIHdpdGhvdXQgYSBsZWFkaW5nIHBhdGggc2VnbWVudC4KICAjIEppcmEgdGFrZXMgcHJpb3JpdHk7IG51bWVyaWMgcmVxdWlyZXMgYSBkYXNoL3VuZGVyc2NvcmUgYWZ0ZXIgdGhlIG51bWJlcgogICMgdG8gYXZvaWQgZmFsc2UgbWF0Y2hlcyBvbiB2ZXJzaW9uIGJyYW5jaGVzIGxpa2UgcmVsZWFzZS8xLjIuMy4KICBpZiBbWyAiJGJyYW5jaF9uYW1lIiA9fiAoXnwvKShbQS1aXSstWzAtOV0rKSBdXTsgdGhlbgogICAgICBqaXJhX3RpY2tldF9udW1iZXI9IiR7QkFTSF9SRU1BVENIWzJdfSIKICAgICAgZXhwb3J0IGppcmFfdGlja2V0X251bWJlcgogICAgICBwcmludF9pbmZvICJUaWNrZXQ6ICR7QldoaXRlfSRqaXJhX3RpY2tldF9udW1iZXIke0NvbG9yX09mZn0iCiAgZWxpZiBbWyAiJGJyYW5jaF9uYW1lIiA9fiAoXnwvKSgjP1swLTldKylbLV9dIF1dOyB0aGVuCiAgICAgIGppcmFfdGlja2V0X251bWJlcj0iJHtCQVNIX1JFTUFUQ0hbMl19IgogICAgICBleHBvcnQgamlyYV90aWNrZXRfbnVtYmVyCiAgICAgIHByaW50X2luZm8gIlRpY2tldDogJHtCV2hpdGV9JGppcmFfdGlja2V0X251bWJlciR7Q29sb3JfT2ZmfSIKICBmaQoKICAjIEhhbmRsZSBBSSBjb21taXQgbWVzc2FnZSBtb2RlcwogIHByaW50X2RlYnVnICJERUJVRzogYWlfbW9kZT0nJGFpX21vZGUnLCBhaV90b2tlbiBsZW5ndGg9JHsjYWlfdG9rZW59IgoKICAjIE9ubHkgYXR0ZW1wdCBhbm9ueW1vdXMgc3Vic2NyaXB0aW9uIHdoZW4gQUkgaXMgYWN0dWFsbHkgZ29pbmcgdG8gYmUgdXNlZC4KICAjIFNraXBwaW5nIHdoZW4gYWlfbW9kZT1vZmYgYXZvaWRzIGNyZWF0aW5nIGdob3N0IGFjY291bnRzIHdpdGggemVybyBBSSB1c2FnZS4KICBpZiBbWyAiJGFpX21vZGUiICE9ICJvZmYiICYmIC16ICIkYWlfdG9rZW4iIF1dOyB0aGVuCiAgICBwcmludF9kZWJ1ZyAiREVCVUc6IE5vIEFJIHRva2VuIGZvdW5kLCBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbm9ueW1vdXMgc3Vic2NyaXB0aW9uLi4uIiAiYWx3YXlzIgogICAgaWYgY3JlYXRlX2Fub255bW91c19zdWJzY3JpcHRpb247IHRoZW4KICAgICAgYWlfdG9rZW49IiRNQUlBU1NfQUlfVE9LRU4iCiAgICAgIHByaW50X2RlYnVnICJERUJVRzogQW5vbnltb3VzIHRva2VuIGNyZWF0ZWQsIGFpX3Rva2VuIGxlbmd0aCBub3cgJHsjYWlfdG9rZW59IgogICAgZWxzZQogICAgICBwcmludF93YXJuaW5nICJGYWlsZWQgdG8gY3JlYXRlIGFub255bW91cyBzdWJzY3JpcHRpb24uIEFJIGZlYXR1cmVzIHdpbGwgYmUgZGlzYWJsZWQuIgogICAgICBleHBvcnQgYWlfbW9kZT0ib2ZmIgogICAgZmkKICBmaQoKICBjYXNlICIkYWlfbW9kZSIgaW4KICAgICJhc2siKQogICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEFJIG1vZGUgaXMgJ2FzayciCiAgICAgIGlmIFtbIC1uICIkYWlfdG9rZW4iIF1dOyB0aGVuCiAgICAgICAgIyBDaGVjayBpZiBhdXRvLWFwcHJvdmUgQUkgc3VnZ2VzdGlvbnMgaXMgZW5hYmxlZCAtIGlmIHNvLCBhdXRvbWF0aWNhbGx5IHVzZSBBSQogICAgICAgIGlmIFtbICIkYXV0b19hcHByb3ZlX2FpX3N1Z2dlc3Rpb25zIiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgICAgICAgIHByaW50X2luZm8gIk1BSUFTU19BVVRPX0FQUFJPVkVfQUlfU1VHR0VTVElPTlM9dHJ1ZTogQXV0b21hdGljYWxseSB1c2luZyBBSSBmb3IgY29tbWl0IG1lc3NhZ2UiCiAgICAgICAgICB1c2VfYWk9dHJ1ZQogICAgICAgIGVsc2UKICAgICAgICAgIHByaW50X2RlYnVnICJERUJVRzogVG9rZW4gYXZhaWxhYmxlLCBzaG93aW5nIEFJIHByb21wdCIKICAgICAgICAgIHJlYWQgLW4gMSAtcyAtcCAiJChlY2hvIC1lICR7QlllbGxvd31Xb3VsZCB5b3UgbGlrZSB0byB1c2UgQUkgdG8gc3VnZ2VzdCBhIGNvbW1pdCBtZXNzYWdlPyBbeS9OXSR7Q29sb3JfT2ZmfSApIiBSRVBMWQogICAgICAgICAgZWNobwogICAgICAgICAgaWYgW1sgJFJFUExZID1+IF5bWXldJCBdXTsgdGhlbgogICAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IFVzZXIgY2hvc2UgdG8gdXNlIEFJIgogICAgICAgICAgICB1c2VfYWk9dHJ1ZQogICAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IFVzZXIgZGVjbGluZWQgQUkgKHJlcGx5PSckUkVQTFknKSIKICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgICAgZWxzZQogICAgICAgICMgSWYgYWlfdG9rZW4gaXMgZW1wdHkgKGxlbmd0aCB6ZXJvKSBhbmQgX01BSUFTU19ORUVEX0FOT05fVE9LRU4gaXMgdHJ1ZSwgdHJ5IHRvIGNyZWF0ZSBhbm9ueW1vdXMgdG9rZW4gbm93CiAgICAgICAgaWYgW1sgLXogIiRhaV90b2tlbiIgJiYgIiRfTUFJQVNTX05FRURfQU5PTl9UT0tFTiIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IGFpX3Rva2VuIGxlbmd0aCBpcyB6ZXJvIGFuZCBfTUFJQVNTX05FRURfQU5PTl9UT0tFTj10cnVlLCBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbm9ueW1vdXMgc3Vic2NyaXB0aW9uLi4uIgogICAgICAgICAgaWYgY3JlYXRlX2Fub255bW91c19zdWJzY3JpcHRpb247IHRoZW4KICAgICAgICAgICAgYWlfdG9rZW49IiRNQUlBU1NfQUlfVE9LRU4iCiAgICAgICAgICAgIHByaW50X2RlYnVnICJERUJVRzogQW5vbnltb3VzIHRva2VuIGNyZWF0ZWQgaW4gZmFsbGJhY2ssIGFpX3Rva2VuIGxlbmd0aCBub3cgJHsjYWlfdG9rZW59IgogICAgICAgICAgICBleHBvcnQgX01BSUFTU19ORUVEX0FOT05fVE9LRU49IiIKICAgICAgICAgICAgIyBOb3cgdGhhdCB3ZSBoYXZlIGEgdG9rZW4sIGNoZWNrIGF1dG8tYXBwcm92ZSBvciBzaG93IEFJIHByb21wdAogICAgICAgICAgICBpZiBbWyAiJGF1dG9fYXBwcm92ZV9haV9zdWdnZXN0aW9ucyIgPT0gInRydWUiIF1dOyB0aGVuCiAgICAgICAgICAgICAgcHJpbnRfaW5mbyAiTUFJQVNTX0FVVE9fQVBQUk9WRV9BSV9TVUdHRVNUSU9OUz10cnVlOiBBdXRvbWF0aWNhbGx5IHVzaW5nIEFJIGZvciBjb21taXQgbWVzc2FnZSIKICAgICAgICAgICAgICB1c2VfYWk9dHJ1ZQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBUb2tlbiBhdmFpbGFibGUgYWZ0ZXIgZmFsbGJhY2ssIHNob3dpbmcgQUkgcHJvbXB0IgogICAgICAgICAgICAgIHJlYWQgLW4gMSAtcyAtcCAiJChlY2hvIC1lICR7QlllbGxvd31Xb3VsZCB5b3UgbGlrZSB0byB1c2UgQUkgdG8gc3VnZ2VzdCBhIGNvbW1pdCBtZXNzYWdlPyBbeS9OXSR7Q29sb3JfT2ZmfSApIiBSRVBMWQogICAgICAgICAgICAgIGVjaG8KICAgICAgICAgICAgICBpZiBbWyAkUkVQTFkgPX4gXltZeV0kIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IFVzZXIgY2hvc2UgdG8gdXNlIEFJIgogICAgICAgICAgICAgICAgdXNlX2FpPXRydWUKICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IFVzZXIgZGVjbGluZWQgQUkgKHJlcGx5PSckUkVQTFknKSIKICAgICAgICAgICAgICBmaQogICAgICAgICAgICBmaQogICAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludF93YXJuaW5nICJGYWlsZWQgdG8gY3JlYXRlIGFub255bW91cyBzdWJzY3JpcHRpb24uIEFJIGZlYXR1cmVzIHdpbGwgYmUgZGlzYWJsZWQuIgogICAgICAgICAgICBleHBvcnQgYWlfbW9kZT0ib2ZmIgogICAgICAgICAgZmkKICAgICAgICBlbHNlCiAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IE5vIHRva2VuIGF2YWlsYWJsZSBmb3IgQUkiCiAgICAgICAgZmkKICAgICAgZmkKICAgICAgOzsKICAgICJhdXRvc3VnZ2VzdCIpCiAgICAgIHByaW50X2RlYnVnICJERUJVRzogQUkgbW9kZSBpcyAnYXV0b3N1Z2dlc3QnIgogICAgICBpZiBbWyAtbiAiJGFpX3Rva2VuIiBdXTsgdGhlbgogICAgICAgIHVzZV9haT10cnVlCiAgICAgIGZpCiAgICAgIDs7CiAgICAib2ZmIikKICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBBSSBtb2RlIGlzICdvZmYnIgogICAgICB1c2VfYWk9ZmFsc2UKICAgICAgOzsKICAgICopCiAgICAgIHByaW50X2RlYnVnICJERUJVRzogVW5rbm93biBBSSBtb2RlICckYWlfbW9kZScsIGRlZmF1bHRpbmcgdG8gJ2FzayciCiAgICAgIGFpX21vZGU9ImFzayIKICAgICAgaWYgW1sgLW4gIiRhaV90b2tlbiIgXV07IHRoZW4KICAgICAgICB1c2VfYWk9dHJ1ZQogICAgICBlbHNlCiAgICAgICAgcHJpbnRfaW5mbyAiQUkgY29tbWl0IG1lc3NhZ2VzIGF2YWlsYWJsZS4gU2V0IE1BSUFTU19BSV9UT0tFTiB0byBlbmFibGUuIiAiYnJpZWYiCiAgICAgICAgdXNlX2FpPWZhbHNlCiAgICAgIGZpCiAgICAgIDs7CiAgZXNhYwoKICBwcmludF9kZWJ1ZyAiREVCVUc6IHVzZV9haT0kdXNlX2FpIgoKICAjIFRyeSB0byBnZXQgQUkgc3VnZ2VzdGlvbiBpZiByZXF1ZXN0ZWQKICBpZiBbWyAiJHVzZV9haSIgPT0gdHJ1ZSBdXTsgdGhlbgogICAgcHJpbnRfZGVidWcgIkdldHRpbmcgQUkgY29tbWl0IG1lc3NhZ2Ugc3VnZ2VzdGlvbi4uLiIKICAgIAogICAgaWYgYWlfc3VnZ2VzdGlvbj0kKGdldF9haV9jb21taXRfc3VnZ2VzdGlvbik7IHRoZW4KICAgICAgIyBTdWNjZXNzIC0gd2UgZ290IGEgdmFsaWQgQUkgc3VnZ2VzdGlvbgogICAgICBwcmludF9pbmZvICIke0JNYWdlbnRhfUNvbW1pdCBtZXNzYWdlIHN1Z2dlc3Rpb24gZnJvbSBNQUlBU1M6IgogICAgICAjIE9ubHkgcmVtb3ZlIGNhcnJpYWdlIHJldHVybnMsIHF1b3RlcyBhcmUgYWxyZWFkeSBoYW5kbGVkIGluIHRoZSBBSSBmdW5jdGlvbgogICAgICBhaV9zdWdnZXN0aW9uPSIkKGVjaG8gIiRhaV9zdWdnZXN0aW9uIiB8IHNlZCAncy9cciQvLycpIgogICAgICBpZiBbWyAtbiAiJHRvdGFsX3Rva2VucyIgJiYgIiR0b3RhbF90b2tlbnMiICE9ICJudWxsIiAmJiAiJHRvdGFsX3Rva2VucyIgIT0gImVtcHR5IiBdXTsgdGhlbgogICAgICAgIHByaW50X2Fsd2F5cyAiVG9rZW4gdXNhZ2U6ICR7dG90YWxfdG9rZW5zfSB0b3RhbCAoJHtwcm9tcHRfdG9rZW5zOi0wfSBwcm9tcHQgKyAke2NvbXBsZXRpb25fdG9rZW5zOi0wfSBjb21wbGV0aW9uKSIKICAgICAgZmkKICAgICAgcHJpbnRfZ3JhZGllbnRfbGluZSA1MAogICAgICBlY2hvIC1lICIke0JvbGR9JHtSZXZlcnNlfSRhaV9zdWdnZXN0aW9uJHtDb2xvcl9PZmZ9IgogICAgICBwcmludF9ncmFkaWVudF9saW5lIDUwCiAgICAgIGVjaG8KCiAgICAgICMgQ2hlY2sgaWYgYXV0by1hcHByb3ZlIEFJIHN1Z2dlc3Rpb25zIGlzIGVuYWJsZWQKICAgICAgaWYgW1sgIiRhdXRvX2FwcHJvdmVfYWlfc3VnZ2VzdGlvbnMiID09ICJ0cnVlIiBdXTsgdGhlbgogICAgICAgIHByaW50X2luZm8gIk1BSUFTU19BVVRPX0FQUFJPVkVfQUlfU1VHR0VTVElPTlM9dHJ1ZTogQXV0b21hdGljYWxseSBhcHByb3ZpbmcgQUkgc3VnZ2VzdGlvbiIKICAgICAgICBSRVBMWT0iWSIKICAgICAgZWxzZQogICAgICAgICMgQXNrIHVzZXIgaWYgdGhleSB3YW50IHRvIHVzZSB0aGUgQUkgc3VnZ2VzdGlvbgogICAgICAgIHJlYWQgLW4gMSAtcyAtcCAiJChlY2hvIC1lICR7QlllbGxvd31Vc2UgdGhpcyBBSSBzdWdnZXN0aW9uPyBbWS9uL2U9ZWRpdF0ke0NvbG9yX09mZn0gKSIgUkVQTFkKICAgICAgICBlY2hvCiAgICAgIGZpCgogICAgICBjYXNlICIkUkVQTFkiIGluCiAgICAgICAgW05uXSkKICAgICAgICAgIHByaW50X2luZm8gIkFJIHN1Z2dlc3Rpb24gZGVjbGluZWQsIGVudGVyaW5nIG1hbnVhbCBtb2RlIiAiYnJpZWYiCiAgICAgICAgICB1c2VfYWk9ZmFsc2UKICAgICAgICAgIDs7CiAgICAgICAgW0VlXSkKICAgICAgICAgIHByaW50X2luZm8gIkVkaXQgbW9kZTogWW91IGNhbiBtb2RpZnkgdGhlIEFJIHN1Z2dlc3Rpb24iICJicmllZiIKICAgICAgICAgIGVjaG8gLWUgIiR7QkN5YW59Q3VycmVudCBBSSBzdWdnZXN0aW9uOiR7Q29sb3JfT2ZmfSIKICAgICAgICAgIGVjaG8gLWUgIiR7QldoaXRlfSRhaV9zdWdnZXN0aW9uJHtDb2xvcl9PZmZ9IgogICAgICAgICAgZWNobwogICAgICAgICAgZWNobyAtZSAiJHtCQ3lhbn1FbnRlciB5b3VyIG1vZGlmaWVkIGNvbW1pdCBtZXNzYWdlIChwcmVzcyBFbnRlciB0aHJlZSB0aW1lcyB3aGVuIGZpbmlzaGVkLCBvciBqdXN0IEVudGVyIHRvIGtlZXAgQUkgc3VnZ2VzdGlvbik6JHtDb2xvcl9PZmZ9IgoKICAgICAgICAgICMgUmVhZCBtdWx0aS1saW5lIGlucHV0CiAgICAgICAgICBjb21taXRfbWVzc2FnZT0iIgogICAgICAgICAgbGluZV9jb3VudD0wCiAgICAgICAgICBlbXB0eV9saW5lX2NvdW50PTAKICAgICAgICAgIHdoaWxlIHRydWU7IGRvCiAgICAgICAgICAgIHJlYWQgLXIgbGluZQogICAgICAgICAgICBpZiBbWyAteiAiJGxpbmUiIF1dOyB0aGVuCiAgICAgICAgICAgICAgZW1wdHlfbGluZV9jb3VudD0kKChlbXB0eV9saW5lX2NvdW50ICsgMSkpCiAgICAgICAgICAgICAgaWYgW1sgJGxpbmVfY291bnQgLWVxIDAgJiYgJGVtcHR5X2xpbmVfY291bnQgLWVxIDEgXV07IHRoZW4KICAgICAgICAgICAgICAgICMgRmlyc3QgZW1wdHkgbGluZSB3aXRoIG5vIGlucHV0IC0gdXNlIEFJIHN1Z2dlc3Rpb24KICAgICAgICAgICAgICAgIGNvbW1pdF9tZXNzYWdlPSIkYWlfc3VnZ2VzdGlvbiIKICAgICAgICAgICAgICAgIHByaW50X2luZm8gIlVzaW5nIG9yaWdpbmFsIEFJIHN1Z2dlc3Rpb24iCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgIGVsaWYgW1sgJGVtcHR5X2xpbmVfY291bnQgLWdlIDIgXV07IHRoZW4KICAgICAgICAgICAgICAgICMgVHdvIGNvbnNlY3V0aXZlIGVtcHR5IGxpbmVzICh0aHJlZSBFbnRlciBwcmVzc2VzKSAtIGZpbmlzaCBpbnB1dAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAjIFJlc2V0IGVtcHR5IGxpbmUgY291bnRlciB3aGVuIHdlIGdldCBub24tZW1wdHkgaW5wdXQKICAgICAgICAgICAgICBlbXB0eV9saW5lX2NvdW50PTAKICAgICAgICAgICAgZmkKICAgICAgICAgICAgaWYgW1sgJGxpbmVfY291bnQgLWd0IDAgXV07IHRoZW4KICAgICAgICAgICAgICBjb21taXRfbWVzc2FnZSs9JCdcbicKICAgICAgICAgICAgZmkKICAgICAgICAgICAgY29tbWl0X21lc3NhZ2UrPSIkbGluZSIKICAgICAgICAgICAgKChsaW5lX2NvdW50KyspKQogICAgICAgICAgZG9uZQogICAgICAgICAgOzsKICAgICAgICAqKQogICAgICAgICAgIyBEZWZhdWx0OiBhY2NlcHQgQUkgc3VnZ2VzdGlvbgogICAgICAgICAgY29tbWl0X21lc3NhZ2U9IiRhaV9zdWdnZXN0aW9uIgogICAgICAgICAgOzsKICAgICAgZXNhYwogICAgZWxzZQogICAgICBwcmludF93YXJuaW5nICJBSSBzdWdnZXN0aW9uIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIG1hbnVhbCBlbnRyeSIKICAgICAgdXNlX2FpPWZhbHNlCiAgICBmaQogIGZpCgogICMgTWFudWFsIGNvbW1pdCBtZXNzYWdlIGVudHJ5IGlmIEFJIG5vdCB1c2VkIG9yIGZhaWxlZAogIGlmIFtbICIkdXNlX2FpIiA9PSBmYWxzZSAmJiAteiAiJGNvbW1pdF9tZXNzYWdlIiBdXTsgdGhlbgogICAgaWYgW1sgLW4gIiRqaXJhX3RpY2tldF9udW1iZXIiIF1dOyB0aGVuCiAgICAgIHByaW50X2luZm8gIkVudGVyIGEgY29tbWl0IG1lc3NhZ2UgJHtCV2hpdGV9KEppcmEgdGlja2V0ICRqaXJhX3RpY2tldF9udW1iZXIgd2lsbCBiZSBwcmVwZW5kZWQpJHtDb2xvcl9PZmZ9IgogICAgZWxzZQogICAgICBwcmludF9pbmZvICJFbnRlciBhIGNvbW1pdCBtZXNzYWdlICR7QldoaXRlfShzdGFydGluZyB3aXRoIEppcmEgVGlja2V0IyB3aGVuIHJlbGV2YW50KSR7Q29sb3JfT2ZmfSIKICAgICAgcHJpbnRfaW5mbyAiUGxlYXNlIGVudGVyIGEgdGlja2V0IG51bWJlciBvciAnZml4Oicgb3IgJ2ZlYXR1cmU6JyBvciAnZGV2b3BzOicgdG8gc3RhcnQgdGhlIGNvbW1pdCBtZXNzYWdlIgogICAgZmkKCiAgICBlY2hvIC1lICIke0JDeWFufUVudGVyICR7QlllbGxvd31tdWx0aXBsZSBsaW5lcyR7QkN5YW59IChwcmVzcyBFbnRlciAke0JZZWxsb3d9dGhyZWUgdGltZXMke0JDeWFufSB0byBmaW5pc2gpJHtDb2xvcl9PZmZ9OiIKCiAgICBjb21taXRfbWVzc2FnZT0iIgogICAgZmlyc3RfbGluZT10cnVlCiAgICBlbXB0eV9saW5lX2NvdW50PTAKICAgIHdoaWxlIHRydWU7IGRvCiAgICAgICAgcmVhZCAtciBsaW5lCiAgICAgICAgIyBDaGVjayBmb3IgZW1wdHkgbGluZQogICAgICAgIGlmIFtbIC16ICIkbGluZSIgXV07IHRoZW4KICAgICAgICAgICAgZW1wdHlfbGluZV9jb3VudD0kKChlbXB0eV9saW5lX2NvdW50ICsgMSkpCiAgICAgICAgICAgICMgTmVlZCB0d28gY29uc2VjdXRpdmUgZW1wdHkgbGluZXMgKHRocmVlIEVudGVyIHByZXNzZXMpIHRvIGZpbmlzaAogICAgICAgICAgICBpZiBbWyAkZW1wdHlfbGluZV9jb3VudCAtZ2UgMiBdXTsgdGhlbgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZmkKICAgICAgICAgICAgY29udGludWUKICAgICAgICBlbHNlCiAgICAgICAgICAgICMgUmVzZXQgZW1wdHkgbGluZSBjb3VudGVyIHdoZW4gd2UgZ2V0IG5vbi1lbXB0eSBpbnB1dAogICAgICAgICAgICBlbXB0eV9saW5lX2NvdW50PTAKICAgICAgICBmaQogICAgICAgIGlmIFtbICIkZmlyc3RfbGluZSIgPT0gdHJ1ZSBdXTsgdGhlbgogICAgICAgICAgICAjIEZpcnN0IGxpbmUgaXMgdGhlIHN1YmplY3QgLSBkbyBOT1QgYXV0by1wcmVwZW5kIGEgYnVsbGV0OyBhZGQgd2l0aCBkb3VibGUgbmV3bGluZSBmb3IgcHJvcGVyIGdpdCBmb3JtYXQKICAgICAgICAgICAgY29tbWl0X21lc3NhZ2UrPSIkbGluZSIkJ1xuXG4nCiAgICAgICAgICAgIGZpcnN0X2xpbmU9ZmFsc2UKICAgICAgICBlbHNlCiAgICAgICAgICAgICMgU3Vic2VxdWVudCBsaW5lczogYXV0by1wcmVwZW5kIGJ1bGxldCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LCB0aGVuIGFkZCB3aXRoIHRhYiBpbmRlbnQgYW5kIHNpbmdsZSBuZXdsaW5lCiAgICAgICAgICAgIGlmIFtbICEgIiRsaW5lIiA9fiBeW1s6c3BhY2U6XV0qLVtbOnNwYWNlOl1dIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBsaW5lPSItICRsaW5lIgogICAgICAgICAgICBmaQogICAgICAgICAgICBjb21taXRfbWVzc2FnZSs9IiAgICAkbGluZSIkJ1xuJwoKICAgICAgICBmaQogICAgZG9uZQogICAgIyBSZW1vdmUgb25lIHRyYWlsaW5nIG5ld2xpbmUgaWYgcHJlc2VudDoKICAgIGNvbW1pdF9tZXNzYWdlPSIke2NvbW1pdF9tZXNzYWdlJSQnXG4nfSIKICBmaQogIGludGVybmFsX2NvbW1pdF9tZXNzYWdlPSJbJChnaXQgY29uZmlnIHVzZXIubmFtZSldICRjb21taXRfbWVzc2FnZSIKICAjIFByZXBlbmQgSmlyYSB0aWNrZXQgbnVtYmVyIGlmIGZvdW5kIGFuZCBub3QgYWxyZWFkeSBwcmVzZW50CiAgaWYgW1sgLW4gIiRqaXJhX3RpY2tldF9udW1iZXIiICYmICEgIiRjb21taXRfbWVzc2FnZSIgPX4gXiRqaXJhX3RpY2tldF9udW1iZXIgXV07IHRoZW4KICAgIGNvbW1pdF9tZXNzYWdlPSIkamlyYV90aWNrZXRfbnVtYmVyICRjb21taXRfbWVzc2FnZSIKICAgIGludGVybmFsX2NvbW1pdF9tZXNzYWdlPSIkamlyYV90aWNrZXRfbnVtYmVyICRpbnRlcm5hbF9jb21taXRfbWVzc2FnZSIKICBmaQogICMgcHJlcGVuZCB3aXRoIGF1dGhvciBvZiBjb21taXQKICAjIEFib3J0IGlmIHRoZSBjb21taXQgbWVzc2FnZSBpcyBzdGlsbCBlbXB0eQogIGlmIFtbIC16ICIkY29tbWl0X21lc3NhZ2UiIF1dOyB0aGVuCiAgICAgIGVjaG8gIkFib3J0aW5nIGNvbW1pdCBkdWUgdG8gZW1wdHkgY29tbWl0IG1lc3NhZ2UuIgogICAgICBleGl0IDEKICBmaQoKICAjIEV4cG9ydCB0aGUgY29tbWl0IG1lc3NhZ2UgYW5kIGppcmEgdGlja2V0IG51bWJlciBmb3IgdXNlIGJ5IGNhbGxpbmcgZnVuY3Rpb24KICBleHBvcnQgaW50ZXJuYWxfY29tbWl0X21lc3NhZ2UKICBleHBvcnQgY29tbWl0X21lc3NhZ2UKICBleHBvcnQgamlyYV90aWNrZXRfbnVtYmVyCn0KCnJ1bl9haV9jb21taXRfb25seSgpIHsKICBlY2hvICJ0aGlzIGZlYXR1cmUgaXMgbm90IHlldCBzdXBwb3J0ZWQiCn0KCmhhbmRsZV9zdGFnZWRfY29tbWl0KCkgewogICAgICAgICAgcHJpbnRfaW5mbyAiU3RhZ2VkIGNoYW5nZXMgZGV0ZWN0ZWQ6IgogICAgICAgICAgZ2l0IGRpZmYgLS1jYWNoZWQgLS1uYW1lLXN0YXR1cwoKICAgICAgICAgIGdldF9jb21taXRfbWVzc2FnZQogICAgICAgICAgIyBVc2UgZ2l0IGNvbW1pdCAtRiAtIHRvIHByb3Blcmx5IGhhbmRsZSBtdWx0aS1saW5lIGNvbW1pdCBtZXNzYWdlcwoKICAgICAgICAgICMgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRyZWF0IGRlYnVnX21vZGU9dHJ1ZSBhcyB2ZXJib3NpdHlfbGV2ZWw9ZGVidWcKICAgICAgICAgIGlmIFtbICIkZGVidWdfbW9kZSIgPT0gInRydWUiICYmICIkdmVyYm9zaXR5X2xldmVsIiAhPSAiZGVidWciIF1dOyB0aGVuCiAgICAgICAgICAgICMgT25seSBsb2cgdGhpcyB3aGVuIG5vdCBhbHJlYWR5IGluIGRlYnVnIHZlcmJvc2l0eSB0byBhdm9pZCBub2lzZQogICAgICAgICAgICBsb2dfbWVzc2FnZSAiREVQUkVDQVRFRDogVXNpbmcgZGVidWdfbW9kZT10cnVlIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgTUFJQVNTX1ZFUkJPU0lUWT1kZWJ1ZyBpbnN0ZWFkLiIKICAgICAgICAgICAgIyBUcmVhdCBhcyBpZiB2ZXJib3NpdHlfbGV2ZWwgaXMgZGVidWcKICAgICAgICAgICAgbG9jYWwgZWZmZWN0aXZlX3ZlcmJvc2l0eT0iZGVidWciCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvY2FsIGVmZmVjdGl2ZV92ZXJib3NpdHk9IiR2ZXJib3NpdHlfbGV2ZWwiCiAgICAgICAgICBmaQoKICAgICAgICAgIGlmIFtbICIkZWZmZWN0aXZlX3ZlcmJvc2l0eSIgPT0gImRlYnVnIiBdXTsgdGhlbgogICAgICAgICAgICAjIGxlYXZlIHRoaXMgZm9yIGZ1dHVyZSBkZWJ1Z2dpbmcKICAgICAgICAgICAgZWNobyAiJGNvbW1pdF9tZXNzYWdlIiB8IGdpdCBjb21taXQgLUYgLSA+L2Rldi9udWxsIDI+JjEKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAiJGNvbW1pdF9tZXNzYWdlIiB8IGdpdCBjb21taXQgLUYgLSA+L2Rldi9udWxsIDI+JjEKICAgICAgICAgIGZpCgogICAgICAgICAgY2hlY2tfZ2l0X3N1Y2Nlc3MKICAgICAgICAgIHRhZ21lc3NhZ2U9JGNvbW1pdF9tZXNzYWdlCiAgICAgICAgICBleHBvcnQgdGFnbWVzc2FnZQogICAgICAgICAgcHJpbnRfc3VjY2VzcyAiQ2hhbmdlcyBjb21taXR0ZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgICAgIyBTYW5pdGl6ZSBjb21taXQgbWVzc2FnZSBmb3IgQ1NWL0dvb2dsZSBTaGVldHMgY29tcGF0aWJpbGl0eQogICAgICAgICAgIyBSZXBsYWNlIGFsbCBuZXdsaW5lcyB3aXRoIHNlbWljb2xvbnMgYW5kIGEgc3BhY2UKICAgICAgICAgIGxvY2FsIGRldmxvZ19tZXNzYWdlPSIke2NvbW1pdF9tZXNzYWdlLy8kJ1xuJy87IH0iCgogICAgICAgICAgIyBFc2NhcGUgZG91YmxlIHF1b3RlcyBpZiBuZWVkZWQKICAgICAgICAgIGRldmxvZ19tZXNzYWdlPSIke2RldmxvZ19tZXNzYWdlLy9cIi9cXFwifSIKICAgICAgICAgIGxvZ3RoaXMgIiR7Y29tbWl0X21lc3NhZ2UvLyQnXG4nLzsgfSIKICAgICAgICAgIGlmIHJlbW90ZV9leGlzdHMgIm9yaWdpbiI7IHRoZW4KICAgICAgICAgICAgIyBDaGVjayBhdXRvLXB1c2ggc2V0dGluZ3MgKG5ldyBhdXRvX3B1c2hfY29tbWl0cyB0YWtlcyBwcmVjZWRlbmNlKQogICAgICAgICAgICBpZiBbWyAiJGF1dG9fcHVzaF9jb21taXRzIiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgICAgICAgICAgICBlY2hvIC1lICIke0JCbHVlfU1BSUFTU19BVVRPX1BVU0hfQ09NTUlUUz10cnVlOiBQdXNoaW5nIGNvbW1pdCBhdXRvbWF0aWNhbGx5Li4uJHtDb2xvcl9PZmZ9IgogICAgICAgICAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IHB1c2ggLS1zZXQtdXBzdHJlYW0gb3JpZ2luICckYnJhbmNoX25hbWUnIiAiZGVidWciCiAgICAgICAgICAgICAgY2hlY2tfZ2l0X3N1Y2Nlc3MKICAgICAgICAgICAgICBlY2hvIC1lICIke0JHcmVlbn1Db21taXQgcHVzaGVkLiR7Q29sb3JfT2ZmfSIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICMgQ2hlY2sgTUFJQVNTX1BVU0hfQUJTVFJBQ1RTX1RPX1JFTU9URSBzZXR0aW5nIChsZWdhY3kpCiAgICAgICAgICAgICAgY2FzZSAiJHB1c2hfYWJzdHJhY3RzX3RvX3JlbW90ZSIgaW4KICAgICAgICAgICAgICAgICJhbHdheXMiKQogICAgICAgICAgICAgICAgICBlY2hvIC1lICIke0JCbHVlfU1BSUFTU19QVVNIX0FCU1RSQUNUU19UT19SRU1PVEU9YWx3YXlzOiBQdXNoaW5nIGNvbW1pdCBhdXRvbWF0aWNhbGx5Li4uJHtDb2xvcl9PZmZ9IgogICAgICAgICAgICAgICAgICBydW5fZ2l0X2NvbW1hbmQgImdpdCBwdXNoIC0tc2V0LXVwc3RyZWFtIG9yaWdpbiAnJGJyYW5jaF9uYW1lJyIgImRlYnVnIgogICAgICAgICAgICAgICAgICBjaGVja19naXRfc3VjY2VzcwogICAgICAgICAgICAgICAgICBlY2hvIC1lICIke0JHcmVlbn1Db21taXQgcHVzaGVkLiR7Q29sb3JfT2ZmfSIKICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICJuZXZlciIpCiAgICAgICAgICAgICAgICAgIGVjaG8gLWUgIiR7QkJsdWV9TUFJQVNTX1BVU0hfQUJTVFJBQ1RTX1RPX1JFTU9URT1uZXZlcjogU2tpcHBpbmcgcHVzaCB0byByZW1vdGUke0NvbG9yX09mZn0iCiAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAqKQogICAgICAgICAgICAgICAgICAjIERlZmF1bHQgYmVoYXZpb3IgKGFzay9ibGFuaykgLSBwcm9tcHQgdXNlcgogICAgICAgICAgICAgICAgICByZWFkIC1uIDEgLXMgLXAgIiQoZWNobyAtZSAke0JZZWxsb3d9RG8geW91IHdhbnQgdG8gcHVzaCB0aGlzIGNvbW1pdCB0byByZW1vdGU/IFt5L05dJHtDb2xvcl9PZmZ9ICkiIFJFUExZCiAgICAgICAgICAgICAgICAgIGVjaG8KICAgICAgICAgICAgICAgICAgaWYgW1sgJFJFUExZID1+IF5bWXldJCBdXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIHJ1bl9naXRfY29tbWFuZCAiZ2l0IHB1c2ggLS1zZXQtdXBzdHJlYW0gb3JpZ2luICckYnJhbmNoX25hbWUnIiAiZGVidWciCiAgICAgICAgICAgICAgICAgICAgY2hlY2tfZ2l0X3N1Y2Nlc3MKICAgICAgICAgICAgICAgICAgICBlY2hvIC1lICIke0JHcmVlbn1Db21taXQgcHVzaGVkLiR7Q29sb3JfT2ZmfSIKICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgICBlc2FjCiAgICAgICAgICAgIGZpCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHByaW50X3dhcm5pbmcgIk5vIHJlbW90ZSBmb3VuZC4iCiAgICAgICAgICBmaQp9CgpvZmZlcl90b19zdGFnZV9jaGFuZ2VzKCkgewogIHByaW50X3dhcm5pbmcgIk5vIHN0YWdlZCBjaGFuZ2VzIGZvdW5kLCBidXQgdGhlcmUgYXJlIHVuY29tbWl0dGVkIGNoYW5nZXMuIgogIAogICMgQ2hlY2sgaWYgYXV0by1zdGFnZSBpcyBlbmFibGVkCiAgaWYgW1sgIiRhdXRvX3N0YWdlX3Vuc3RhZ2VkIiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgIHByaW50X2luZm8gIk1BSUFTU19BVVRPX1NUQUdFX1VOU1RBR0VEPXRydWU6IEF1dG9tYXRpY2FsbHkgc3RhZ2luZyBhbGwgY2hhbmdlcyBhbmQgY29tbWl0dGluZyIKICAgIFJFUExZPSJ5IgogIGVsc2UKICAgIHJlYWQgLW4gMSAtcyAtcCAiJChlY2hvIC1lICR7QlllbGxvd31EbyB5b3Ugd2FudCB0byBzdGFnZSBhbGwgY2hhbmdlcyBhbmQgY29tbWl0PyBbeS9OXSR7Q29sb3JfT2ZmfSApIiBSRVBMWQogICAgZWNobwogIGZpCiAgCiAgaWYgW1sgJFJFUExZID1+IF5bWXldJCBdXTsgdGhlbgogICAgZ2l0IGFkZCAtQQogICAgaGFuZGxlX3N0YWdlZF9jb21taXQKICBlbHNlCiAgICBwcmludF9lcnJvciAiQWJvcnRpbmcuIE5vIHN0YWdlZCBjaGFuZ2VzIHRvIGNvbW1pdC4iCiAgICBleGl0IDEKICBmaQp9CgpjaGVja19naXRfY29tbWl0X3N0YXR1cygpIHsKICBwcmludF9zZWN0aW9uICJDaGVja2luZyBHaXQgU3RhdHVzIgogIGlmIGhhc19zdGFnZWRfY2hhbmdlczsgdGhlbgogICAgaGFuZGxlX3N0YWdlZF9jb21taXQKICBlbGlmIGhhc191bmNvbW1pdHRlZF9jaGFuZ2VzOyB0aGVuCiAgICBvZmZlcl90b19zdGFnZV9jaGFuZ2VzCiAgZWxzZQogICAgZWNobyAtZSAiJHtCR3JlZW59Tm90aGluZyB0byBjb21taXQuIFdvcmtpbmcgZGlyZWN0b3J5IGNsZWFuLiR7Q29sb3JfT2ZmfSIKICAgIGV4aXQgMAogIGZpCn0KIyBDaGVjayBmb3IgdW5jb21taXR0ZWQgY2hhbmdlcyBhbmQgb2ZmZXIgdG8gY29tbWl0IHRoZW0KZnVuY3Rpb24gY2hlY2tVbmNvbW1pdHRlZENoYW5nZXMoKXsKICBwcmludF9kZWJ1ZyAiQ2hlY2tpbmcgZm9yIENoYW5nZXMiCiAgCiAgbG9jYWwgaGFzX3N0YWdlZCBoYXNfdW5zdGFnZWQKICBoYXNfc3RhZ2VkPSQoaGFzX3N0YWdlZF9jaGFuZ2VzICYmIGVjaG8gInRydWUiIHx8IGVjaG8gImZhbHNlIikKICBoYXNfdW5zdGFnZWQ9JChoYXNfdW5zdGFnZWRfY2hhbmdlcyAmJiBlY2hvICJ0cnVlIiB8fCBlY2hvICJmYWxzZSIpCiAgCiAgcHJpbnRfZGVidWcgIkNoYW5nZSBkZXRlY3Rpb246IHN0YWdlZD0kaGFzX3N0YWdlZCwgdW5zdGFnZWQ9JGhhc191bnN0YWdlZCwgYWlfY29tbWl0c19vbmx5PSR7YWlfY29tbWl0c19vbmx5Oi11bnNldH0iCiAgCiAgIyBJZiB0aGVyZSBhcmUgdW5zdGFnZWQgY2hhbmdlcywgd2UgbXVzdCBmb3JjZSBjb21taXRzLW9ubHkgbW9kZQogIGlmIFtbICRoYXNfdW5zdGFnZWQgPT0gInRydWUiIF1dOyB0aGVuCiAgICBwcmludF93YXJuaW5nICJUaGVyZSBhcmUgdW5zdGFnZWQgY2hhbmdlcyBpbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IgogICAgCiAgICAjIENoZWNrIGlmIGF1dG8tc3RhZ2UgaXMgZW5hYmxlZAogICAgaWYgW1sgIiRhdXRvX3N0YWdlX3Vuc3RhZ2VkIiA9PSAidHJ1ZSIgXV07IHRoZW4KICAgICAgcHJpbnRfaW5mbyAiTUFJQVNTX0FVVE9fU1RBR0VfVU5TVEFHRUQ9dHJ1ZTogQXV0b21hdGljYWxseSBzdGFnaW5nIGFuZCBjb21taXR0aW5nIHVuc3RhZ2VkIGNoYW5nZXMiCiAgICAgIFJFUExZPSJ5IgogICAgZWxzZQogICAgICByZWFkIC1uIDEgLXMgLXAgIiQoZWNobyAtZSAke0JZZWxsb3d9RG8geW91IHdhbnQgdG8gJHtCUmVkfXN0YWdlIGFuZCBjb21taXQke0JZZWxsb3d9IHRoZW0/IFt5L05dJHtDb2xvcl9PZmZ9ICkiIFJFUExZCiAgICAgIGVjaG8KICAgIGZpCiAgICAKICAgIGlmIFtbICRSRVBMWSA9fiBeW1l5XSQgXV07IHRoZW4KICAgICAgZ2l0IGFkZCAtQQogICAgICBoYW5kbGVfc3RhZ2VkX2NvbW1pdAogICAgICAKICAgICAgIyBDaGVjayBpZiB3b3JraW5nIGRpcmVjdG9yeSBpcyBub3cgY2xlYW4gYWZ0ZXIgc3RhZ2luZyBhbmQgY29tbWl0dGluZwogICAgICBpZiAhIGhhc191bnN0YWdlZF9jaGFuZ2VzOyB0aGVuCiAgICAgICAgIyBXb3JraW5nIGRpcmVjdG9yeSBpcyBjbGVhbiwgY2hlY2sgaWYgdXNlciB3YW50cyBjb21taXRzLW9ubHkgbW9kZQogICAgICAgIGlmIFtbICRhaV9jb21taXRzX29ubHkgPT0gJ3RydWUnIF1dOyB0aGVuCiAgICAgICAgICBwcmludF9zdWNjZXNzICJDb21taXQgcHJvY2VzcyBjb21wbGV0ZWQgKGNvbW1pdHMtb25seSBtb2RlKS4iCiAgICAgICAgICBwcmludF9zaWdub2ZmX3dpdGhfdG9wdXAKICAgICAgICAgIGV4aXQgMAogICAgICAgIGVsc2UKICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIkNvbW1pdCBwcm9jZXNzIGNvbXBsZXRlZC4gUHJvY2VlZGluZyB3aXRoIG1lcmdlL3JlbGVhc2UgcGlwZWxpbmUuLi4iCiAgICAgICAgICByZXR1cm4gMCAgIyBDb250aW51ZSB0byBtZXJnZS9yZWxlYXNlIHBpcGVsaW5lCiAgICAgICAgZmkKICAgICAgZWxzZQogICAgICAgICMgU3RpbGwgaGF2ZSB1bnN0YWdlZCBjaGFuZ2VzIGFmdGVyIGNvbW1pdAogICAgICAgIHByaW50X3N1Y2Nlc3MgIkNvbW1pdCBwcm9jZXNzIGNvbXBsZXRlZC4iCiAgICAgICAgcHJpbnRfaW5mbyAiQ2Fubm90IHByb2NlZWQgd2l0aCBtZXJnZS9yZWxlYXNlIHBpcGVsaW5lIC0gdW5zdGFnZWQgY2hhbmdlcyByZW1haW4gaW4gd29ya2luZyBkaXJlY3RvcnkiCiAgICAgICAgcHJpbnRfaW5mbyAiVG8gY29udGludWUgd2l0aCBtZXJnZS9yZWxlYXNlIHBpcGVsaW5lLCBjb21taXQgb3Igc3Rhc2ggYWxsIGNoYW5nZXMgZmlyc3QiCiAgICAgICAgcHJpbnRfc2lnbm9mZl93aXRoX3RvcHVwCiAgICAgICAgZXhpdCAwCiAgICAgIGZpCiAgICBlbHNlCiAgICAgICMgVXNlciBjaG9zZSBub3QgdG8gc3RhZ2UgdW5zdGFnZWQgY2hhbmdlcwogICAgICBpZiBbWyAkaGFzX3N0YWdlZCA9PSAidHJ1ZSIgXV07IHRoZW4KICAgICAgICBwcmludF9pbmZvICJDb21taXR0aW5nIHN0YWdlZCBjaGFuZ2VzIG9ubHkgKHVuc3RhZ2VkIGNoYW5nZXMgcmVtYWluKSIKICAgICAgICBoYW5kbGVfc3RhZ2VkX2NvbW1pdAogICAgICBmaQogICAgICAKICAgICAgIyBGb3JjZSBleGl0IHNpbmNlIHVuc3RhZ2VkIGNoYW5nZXMgcmVtYWluCiAgICAgIHByaW50X3N1Y2Nlc3MgIkNvbW1pdCBwcm9jZXNzIGNvbXBsZXRlZC4iCiAgICAgIHByaW50X2luZm8gIkNhbm5vdCBwcm9jZWVkIHdpdGggbWVyZ2UvcmVsZWFzZSBwaXBlbGluZSAtIHVuc3RhZ2VkIGNoYW5nZXMgcmVtYWluIGluIHdvcmtpbmcgZGlyZWN0b3J5IgogICAgICBwcmludF9pbmZvICJUbyBjb250aW51ZSB3aXRoIG1lcmdlL3JlbGVhc2UgcGlwZWxpbmUsIGNvbW1pdCBvciBzdGFzaCBhbGwgY2hhbmdlcyBmaXJzdCIKICAgICAgcHJpbnRfc2lnbm9mZl93aXRoX3RvcHVwCiAgICAgIGV4aXQgMAogICAgZmkKICAgIAogICMgSWYgb25seSBzdGFnZWQgY2hhbmdlcywgcHJvY2VlZCBub3JtYWxseQogIGVsaWYgW1sgJGhhc19zdGFnZWQgPT0gInRydWUiIF1dOyB0aGVuCiAgICBwcmludF9pbmZvICJGb3VuZCBzdGFnZWQgY2hhbmdlcyByZWFkeSBmb3IgY29tbWl0IgogICAgaGFuZGxlX3N0YWdlZF9jb21taXQKICAgIAogICAgIyBDaGVjayBpZiB1c2VyIGhhcyBjb21taXRzLW9ubHkgbW9kZSBlbmFibGVkCiAgICBpZiBbWyAkYWlfY29tbWl0c19vbmx5ID09ICd0cnVlJyBdXTsgdGhlbgogICAgICBwcmludF9zdWNjZXNzICJDb21taXQgcHJvY2VzcyBjb21wbGV0ZWQgKGNvbW1pdHMtb25seSBtb2RlKS4iCiAgICAgIHByaW50X3NpZ25vZmZfd2l0aF90b3B1cAogICAgICBleGl0IDAKICAgIGVsc2UKICAgICAgcHJpbnRfc3VjY2VzcyAiQ29tbWl0IHByb2Nlc3MgY29tcGxldGVkLiBQcm9jZWVkaW5nIHdpdGggbWVyZ2UvcmVsZWFzZSBwaXBlbGluZS4uLiIKICAgIGZpCiAgICAKICAjIE5vIGNoYW5nZXMgYXQgYWxsCiAgZWxzZQogICAgaWYgW1sgJGFpX2NvbW1pdHNfb25seSA9PSAndHJ1ZScgXV07IHRoZW4KICAgICAgcHJpbnRfaW5mbyAiTm8gY2hhbmdlcyBmb3VuZCAoY29tbWl0cy1vbmx5IG1vZGUpLiIKICAgICAgcHJpbnRfc2lnbm9mZl93aXRoX3RvcHVwCiAgICAgIGV4aXQgMAogICAgZWxzZQogICAgICBwcmludF9pbmZvICJObyBjaGFuZ2VzIGZvdW5kLiBQcm9jZWVkaW5nIHdpdGggbWVyZ2UvcmVsZWFzZSBwaXBlbGluZS4uLiIKICAgIGZpCiAgZmkKfQoKZmkgIyBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl9jb3JlX2NvbW1pdF9zaAojIC0tLSBFbmQgaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvY29yZS9jb21taXQuc2ggLS0tCgojIC0tLSBCZWdpbiBpbmxpbmVkOiAvVXNlcnMvc3lzb3Avc3RhdGljL21haWFzcy13aG9sZS9iYXNobWFpYXNzL2xpYi91dGlscy9oZWxwLnNoIC0tLQppZiBbWyAteiAiJHtfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl91dGlsc19oZWxwX3NoOi19IiBdXTsgdGhlbiBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl91dGlsc19oZWxwX3NoPTEKCiMgc2hlbGxjaGVjayBzaGVsbD1iYXNoCgojIERlZmluZSBjb2xvcnMgZm9yIGhlbHAgb3V0cHV0IChzaGFyZWQgYWNyb3NzIGZ1bmN0aW9ucykKQkJsdWU9J1wwMzNbMTszNG0nCkJXaGl0ZT0nXDAzM1sxOzM3bScKQkdyZWVuPSdcMDMzWzE7MzJtJwpCWWVsbG93PSdcMDMzWzE7MzNtJwpCUmVkPSdcMDMzWzE7MzFtJwpCQ3lhbj0nXDAzM1sxOzM2bScKQkFxdWE9J1wwMzNbMTszNm0nCkNvbG9yX09mZj0nXDAzM1swbScKQkxpbWU9J1wwMzNbMTszMm0nCkdyYXk9IlwwMzNbMDszN20iCgojIFNob3cgTUFJQVNTIGxvZ28Kc2hvd19sb2dvKCkgewogIGVjaG8gLWUgIiR7QkJsdWV9IgogIGNhdCA8PC0nRU9GJwogICAgICAgIOKWhOKWhCAgIOKWhOKWhCDiloTiloTiloTiloTiloTiloTiloQg4paE4paE4paEIOKWhOKWhOKWhOKWhOKWhOKWhOKWhCDiloTiloTiloTiloTiloTiloTiloQg4paE4paE4paE4paE4paE4paE4paECiAgICAgICDiloggIOKWiOKWhOKWiCAg4paIICAgICAgIOKWiCAgIOKWiCAgICAgICDiloggICAgICAg4paIICAgICAgIOKWiAogICAgICAg4paIICAgICAgIOKWiCAgIOKWhCAgIOKWiCAgIOKWiCAgIOKWhCAgIOKWiCAg4paE4paE4paE4paE4paE4paIICDiloTiloTiloTiloTiloTilogKICAgICAgIOKWiCAgICAgICDiloggIOKWiOKWhOKWiCAg4paIICAg4paIICDilojiloTiloggIOKWiCDilojiloTiloTiloTiloTiloTilogg4paI4paE4paE4paE4paE4paECiAgICAgICDiloggICAgICAg4paIICAgICAgIOKWiCAgIOKWiCAgICAgICDilojiloTiloTiloTiloTiloQgIOKWiOKWhOKWhOKWhOKWhOKWhCAg4paICiAgICAgICDilogg4paI4paI4paE4paI4paIIOKWiCAgIOKWhCAgIOKWiCAgIOKWiCAgIOKWhCAgIOKWiOKWhOKWhOKWhOKWhOKWhOKWiCDilojiloTiloTiloTiloTiloTilogg4paICiAgICAgICDilojiloTiloggICDilojiloTilojiloTiloTilogg4paI4paE4paE4paI4paE4paE4paE4paI4paE4paE4paIIOKWiOKWhOKWhOKWiOKWhOKWhOKWhOKWhOKWhOKWhOKWhOKWiOKWhOKWhOKWhOKWhOKWhOKWhOKWhOKWiAoKICAgICAgICAgICAgICAgICAgICAgICAg4paE4paE4paE4paE4paEICAgICAg4paE4paE4paE4paE4paE4paECiAgICAgICAgICAgICAg4paE4paE4paEICAgICAgIOKWhOKWhOKWhOKWhOKWhOKWhOKWhOKWhCAgIOKWhOKWhOKWhOKWhOKWhOKWhOKWhOKWhAogICAgICAgICAgICAgIOKWhOKWhOKWhCAgICAgICAg4paE4paE4paE4paE4paE4paE4paE4paEICAg4paE4paE4paE4paE4paE4paE4paE4paE4paECiAgICAgICAgICAgICAg4paE4paE4paEICAgICAgICAgICAgIOKWhOKWhOKWhOKWhOKWhCAgICAgIOKWhOKWhOKWhOKWhOKWhAogICAgICAgICAgICAgIOKWhOKWhOKWhCAgICAgICAgICAgICAg4paE4paE4paE4paEICAgICAgICDiloTiloTiloTiloQKICAgICAgICAgICAgICDiloTiloTiloQgICAgICAgICAgICAgICDiloTiloTiloTiloQgICAgICAg4paE4paE4paE4paECiAgICAgICAgICAgICAg4paE4paE4paEICAgICAgICAgICAgICAg4paE4paE4paE4paEICAgICAgICDiloTiloTiloQKICAgICAgICAgICAgICDiloTiloTiloQgICAgICAgICAgICAgICDiloTiloTiloTiloQgICAgICAg4paE4paE4paE4paECiAgICAgICAgICAgICAg4paE4paE4paEICAgICAgICAgICAgICDiloTiloTiloTiloQgICAgICAgIOKWhOKWhOKWhOKWhAogICAgICAgICAgICAgIOKWhOKWhOKWhCAgICAgICAgICAgICDiloTiloTiloTiloTiloQgICAgICDiloTiloTiloTiloTiloQKICAgICAgICAgICAgICDiloTiloTiloQgICAgICAgIOKWhOKWhOKWhOKWhOKWhOKWhOKWhOKWhCAgIOKWhOKWhOKWhOKWhOKWhOKWhOKWhOKWhOKWhAogICAgICAgICAgICAgIOKWhOKWhOKWhCAgICAgICDiloTiloTiloTiloTiloTiloTiloQgICAg4paE4paE4paE4paE4paE4paE4paE4paECiAgICAgICAgICAgICAgICAgICAgICAgIOKWhOKWhOKWhOKWhCAgICAgICDiloTiloTiloTiloTiloQKCkVPRgogIGVjaG8gLWUgIiR7QkFxdWF9XG4gICAgICAgTW9kdWxhciBBSS1BdWdtZW50ZWQgU2VtYW50aWMgU2NyaWJlXG4ke0JZZWxsb3d9XG4gICAgICAgKiBBSSBDb21taXQgTWVzc2FnZXNcbiR7QkxpbWV9ICAgICAgICogSW50ZWxsaWdlbnQgR2l0IFdvcmtmbG93IEF1dG9tYXRpb24ke0NvbG9yX09mZn1cbiIKfQoKIyBIZWxwIG1lbnUgZm9vdGVyCl9oZWxwX21lbnVfZm9vdGVyKCkgewogIGVjaG8gLWUgIlxuJHtHcmF5fVByZXNzIEVudGVyIHRvIHJldHVybiB0byBtZW51LCBvciAncScgdG8gcXVpdC4uLiR7Q29sb3JfT2ZmfSIKICByZWFkIC1yIHJlc3BvbnNlCiAgaWYgW1sgIiRyZXNwb25zZSIgPX4gXltRcV0kIF1dOyB0aGVuCiAgICByZXR1cm4gMAogIGVsc2UKICAgIHNob3dfaGVscAogIGZpCn0KCiMgTWFpbiBoZWxwIG1lbnUKc2hvd19oZWxwKCkgewogIGNsZWFyCiAgc2hvd19sb2dvCiAgCiAgZWNobyAtZSAiJHtCV2hpdGV9TUFJQVNTIEhlbHAgTWVudSR7Q29sb3JfT2ZmfVxuIgogIGVjaG8gLWUgIlNlbGVjdCBhIHRvcGljIHRvIGxlYXJuIG1vcmU6XG4iCiAgZWNobyAtZSAiICAke0JHcmVlbn0xKSR7Q29sb3JfT2ZmfSBRdWljayBTdGFydCAmIEJhc2ljIFVzYWdlIgogIGVjaG8gLWUgIiAgJHtCR3JlZW59Mikke0NvbG9yX09mZn0gQ29tbWFuZC1MaW5lIE9wdGlvbnMgJiBGbGFncyIKICBlY2hvIC1lICIgICR7QkdyZWVufTMpJHtDb2xvcl9PZmZ9IEFJIENvbW1pdCBXb3JrZmxvdyIKICBlY2hvIC1lICIgICR7QkdyZWVufTQpJHtDb2xvcl9PZmZ9IFZlcnNpb24gJiBDaGFuZ2Vsb2cgV29ya2Zsb3ciCiAgZWNobyAtZSAiICAke0JHcmVlbn01KSR7Q29sb3JfT2ZmfSBDb25maWd1cmF0aW9uIE9wdGlvbnMgKC5lbnYubWFpYXNzKSIKICBlY2hvIC1lICIgICR7QkdyZWVufTYpJHtDb2xvcl9PZmZ9IEF1dG8tTW9kZSAmIE5vbi1JbnRlcmFjdGl2ZSBXb3JrZmxvd3MiCiAgZWNobyAtZSAiICAke0JHcmVlbn03KSR7Q29sb3JfT2ZmfSBGZWF0dXJlcyAmIENvbXBhdGliaWxpdHkiCiAgZWNobyAtZSAiICAke0JHcmVlbn04KSR7Q29sb3JfT2ZmfSBTaG93IEFsbCAoY29tcGxldGUgZG9jdW1lbnRhdGlvbikiCiAgZWNobyAtZSAiICAke0dyYXl9cSkke0NvbG9yX09mZn0gUXVpdFxuIgogIAogIGVjaG8gLW4gIkVudGVyIGNob2ljZSBbMS04LCBxXTogIgogIHJlYWQgLXIgY2hvaWNlCiAgCiAgY2FzZSAiJGNob2ljZSIgaW4KICAgIDEpIHNob3dfaGVscF9xdWlja3N0YXJ0IDs7CiAgICAyKSBzaG93X2hlbHBfb3B0aW9ucyA7OwogICAgMykgc2hvd19oZWxwX2FpX3dvcmtmbG93IDs7CiAgICA0KSBzaG93X2hlbHBfdmVyc2lvbl93b3JrZmxvdyA7OwogICAgNSkgc2hvd19oZWxwX2NvbmZpZ3VyYXRpb24gOzsKICAgIDYpIHNob3dfaGVscF9hdXRvbW9kZSA7OwogICAgNykgc2hvd19oZWxwX2ZlYXR1cmVzIDs7CiAgICA4KSBzaG93X2hlbHBfYWxsIDs7CiAgICBxfFEpIHJldHVybiAwIDs7CiAgICAqKSBlY2hvIC1lICIke0JSZWR9SW52YWxpZCBjaG9pY2Uke0NvbG9yX09mZn0iOyBzbGVlcCAxOyBzaG93X2hlbHAgOzsKICBlc2FjCn0KCiMgMS4gUXVpY2sgU3RhcnQKc2hvd19oZWxwX3F1aWNrc3RhcnQoKSB7CiAgY2xlYXIKICBzaG93X2xvZ28KICAKICBlY2hvIC1lICIke0JXaGl0ZX1RVUlDSyBTVEFSVCAmIEJBU0lDIFVTQUdFJHtDb2xvcl9PZmZ9XG4iCiAgCiAgZWNobyAtZSAiJHtCV2hpdGV9REVTQ1JJUFRJT046JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgQXV0b21hdGVkIHZlcnNpb24gYnVtcGluZyBhbmQgY2hhbmdlbG9nIG1hbmFnZW1lbnQgc2NyaXB0IHRoYXQgbWFpbnRhaW5zIgogIGVjaG8gLWUgIiAgdGhlIGRldmVsb3AgYnJhbmNoIGFzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHZlcnNpb25pbmcuIEludGVncmF0ZXMgd2l0aCIKICBlY2hvIC1lICIgIEFJLXBvd2VyZWQgY29tbWl0IG1lc3NhZ2VzIGFuZCBzdXBwb3J0cyBtdWx0aS1yZXBvc2l0b3J5IHdvcmtmbG93cy5cbiIKCiAgZWNobyAtZSAiJHtCV2hpdGV9VVNBR0U6JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgbWFpYXNzIFtWRVJTSU9OX1RZUEVdIFtPUFRJT05TXVxuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlfVZFUlNJT05fVFlQRToke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiICBtYWpvciAgICAgICAgICBCdW1wIG1ham9yIHZlcnNpb24gKGUuZy4sIDEuMi4zIOKGkiAyLjAuMCkiCiAgZWNobyAtZSAiICBtaW5vciAgICAgICAgICBCdW1wIG1pbm9yIHZlcnNpb24gKGUuZy4sIDEuMi4zIOKGkiAxLjMuMCkiCiAgZWNobyAtZSAiICBwYXRjaCAgICAgICAgICBCdW1wIHBhdGNoIHZlcnNpb24gKGUuZy4sIDEuMi4zIOKGkiAxLjIuNCkgJHtHcmF5fVtkZWZhdWx0XSR7Q29sb3JfT2ZmfVxuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlfVFVSUNLIFNUQVJUOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgICR7QkdyZWVufTEuJHtDb2xvcl9PZmZ9IFJ1biAke0JDeWFufW1haWFzcyAtLWJvb3RzdHJhcCR7Q29sb3JfT2ZmfSB0byBjb25maWd1cmUgeW91ciBwcm9qZWN0IgogIGVjaG8gLWUgIiAgJHtCR3JlZW59Mi4ke0NvbG9yX09mZn0gUnVuICR7QkN5YW59bWFpYXNzJHtDb2xvcl9PZmZ9IHRvIHN0YXJ0IHRoZSB3b3JrZmxvdyIKICBlY2hvIC1lICIgICR7QkdyZWVufTMuJHtDb2xvcl9PZmZ9IEZvbGxvdyB0aGUgaW50ZXJhY3RpdmUgcHJvbXB0c1xuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlfUVYQU1QTEVTOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgIG1haWFzcyAgICAgICAgICAgICAgICAgICAgICAgICAjIEJ1bXAgcGF0Y2ggdmVyc2lvbiB3aXRoIGludGVyYWN0aXZlIHByb21wdHMiCiAgZWNobyAtZSAiICBtYWlhc3MgbWlub3IgICAgICAgICAgICAgICAgICAgIyBCdW1wIG1pbm9yIHZlcnNpb24iCiAgZWNobyAtZSAiICBtYWlhc3MgbWFqb3IgICAgICAgICAgICAgICAgICAgIyBCdW1wIG1ham9yIHZlcnNpb24iCiAgZWNobyAtZSAiICBtYWlhc3MgLS1hdXRvICAgICAgICAgICAgICAgICAgIyBBdXRvLW1vZGU6IG5vIHByb21wdHMsIGFsbCBhY3Rpb25zIGF1dG9tYXRlZCIKICBlY2hvIC1lICIgIG1haWFzcyAtYSBtaW5vciAgICAgICAgICAgICAgICAjIEF1dG8tbW9kZSB3aXRoIG1pbm9yIHZlcnNpb24gYnVtcFxuIgogIAogIGVjaG8gLWUgIiR7QkdyZWVufVJlYWR5IHRvIGdldCBzdGFydGVkPyBKdXN0IHJ1bjoke0NvbG9yX09mZn0gJHtCQ3lhbn1tYWlhc3MgLS1ib290c3RyYXAke0NvbG9yX09mZn1cbiIKICAKICBfaGVscF9tZW51X2Zvb3Rlcgp9CgojIDIuIENvbW1hbmQtTGluZSBPcHRpb25zCnNob3dfaGVscF9vcHRpb25zKCkgewogIGNsZWFyCiAgc2hvd19sb2dvCiAgCiAgZWNobyAtZSAiJHtCV2hpdGV9Q09NTUFORC1MSU5FIE9QVElPTlMgJiBGTEFHUyR7Q29sb3JfT2ZmfVxuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlfVZFUlNJT04gVFlQRVM6JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgbWFqb3IgICAgICAgICAgQnVtcCBtYWpvciB2ZXJzaW9uIChlLmcuLCAxLjIuMyDihpIgMi4wLjApIgogIGVjaG8gLWUgIiAgbWlub3IgICAgICAgICAgQnVtcCBtaW5vciB2ZXJzaW9uIChlLmcuLCAxLjIuMyDihpIgMS4zLjApIgogIGVjaG8gLWUgIiAgcGF0Y2ggICAgICAgICAgQnVtcCBwYXRjaCB2ZXJzaW9uIChlLmcuLCAxLjIuMyDihpIgMS4yLjQpICR7R3JheX1bZGVmYXVsdF0ke0NvbG9yX09mZn1cbiIKICAKICBlY2hvIC1lICIke0JXaGl0ZX1HRU5FUkFMIE9QVElPTlM6JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgLWgsIC0taGVscCAgICAgU2hvdyBoZWxwIG1lbnUiCiAgZWNobyAtZSAiICAtdiwgLS12ZXJzaW9uICBTaG93IHZlcnNpb24gaW5mb3JtYXRpb24iCiAgZWNobyAtZSAiICAtYSwgLS1hdXRvICAgICBFbmFibGUgYXV0by1tb2RlIChubyBwcm9tcHRzLCBhbGwgYXV0b21hdGVkKVxuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlfVNFVFVQICYgQ09ORklHVVJBVElPTjoke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiICAtLWJvb3RzdHJhcCwgLS1zZXR1cCAgICAgICAgICAgUnVuIGludGVyYWN0aXZlIHByb2plY3Qgc2V0dXAiCiAgZWNobyAtZSAiICAtLXVwZGF0ZS10b2tlbiAgICAgICAgICAgICAgICAgVXBkYXRlIHN0b3JlZCBBSSB0b2tlbiIKICBlY2hvIC1lICIgIC0tZGVsZXRlLXRva2VuICAgICAgICAgICAgICAgICBEZWxldGUgc3RvcmVkIEFJIHRva2VuIgogIGVjaG8gLWUgIiAgLS1hY2NvdW50LWluZm8gICAgICAgICAgICAgICAgIFNob3cgYWNjb3VudCBzdGF0dXMgYW5kIGNyZWRpdHNcbiIKICAKICBlY2hvIC1lICIke0JXaGl0ZX1NT0RFIE9QVElPTlM6JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgLWNvLCAtYywgLS1jb21taXRzLW9ubHkgICAgICAgIEFJIGNvbW1pdHMgb25seSAobm8gdmVyc2lvbmluZykiCiAgZWNobyAtZSAiICAtLWFpaGVscCwgLS1jb21taXR0aGlzLWhlbHAgICAgU2hvdyBBSSBjb21taXQgbW9kZSBoZWxwIgogIGVjaG8gLWUgIiAgLS1haWN2LCAtLWNvbW1pdHRoaXMtdmVyc2lvbiAgIFNob3cgQUkgY29tbWl0IG1vZGUgdmVyc2lvblxuIgogIAogIF9oZWxwX21lbnVfZm9vdGVyCn0KCiMgMy4gQUkgQ29tbWl0IFdvcmtmbG93CnNob3dfaGVscF9haV93b3JrZmxvdygpIHsKICBjbGVhcgogIHNob3dfbG9nbwogIAogIGVjaG8gLWUgIiR7QldoaXRlfUFJIENPTU1JVCBXT1JLRkxPVyR7Q29sb3JfT2ZmfVxuIgogIAogIGVjaG8gLWUgIk1BSUFTUyBtYW5hZ2VzIGNvZGUgY2hhbmdlcyB3aXRoIEFJLXBvd2VyZWQgY29tbWl0IG1lc3NhZ2VzOlxuIgogIGVjaG8gLWUgIiAgJHtCR3JlZW59MS4ke0NvbG9yX09mZn0gRGV0ZWN0cyB1bmNvbW1pdHRlZCBjaGFuZ2VzIGluIHlvdXIgcmVwb3NpdG9yeSIKICBlY2hvIC1lICIgICR7QkdyZWVufTIuJHtDb2xvcl9PZmZ9IEFza3MgaWYgeW91J2QgbGlrZSB0byB1c2UgQUkgZm9yIGNvbW1pdCBtZXNzYWdlIHN1Z2dlc3Rpb24iCiAgZWNobyAtZSAiICAke0JHcmVlbn0zLiR7Q29sb3JfT2ZmfSBBSSBhbmFseXplcyB5b3VyIGNoYW5nZXMgYW5kIHN1Z2dlc3RzIGEgY29tbWl0IG1lc3NhZ2UiCiAgZWNobyAtZSAiICAke0JHcmVlbn00LiR7Q29sb3JfT2ZmfSBZb3UgY2FuIGFjY2VwdCwgZWRpdCwgb3IgcmVqZWN0IHRoZSBzdWdnZXN0aW9uIgogIGVjaG8gLWUgIiAgJHtCR3JlZW59NS4ke0NvbG9yX09mZn0gQ29tbWl0cyB5b3VyIGNoYW5nZXMgd2l0aCB0aGUgY2hvc2VuIG1lc3NhZ2UiCiAgZWNobyAtZSAiICAke0JHcmVlbn02LiR7Q29sb3JfT2ZmfSBPZmZlcnMgdG8gY29udGludWUgd2l0aCB2ZXJzaW9uL2NoYW5nZWxvZyB3b3JrZmxvd1xuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlfUFJIE1PREVTOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgICR7QkN5YW59YXNrJHtDb2xvcl9PZmZ9ICAgICAgICAgUHJvbXB0cyBiZWZvcmUgdXNpbmcgQUkgJHtHcmF5fVtkZWZhdWx0XSR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgICR7QkN5YW59YXV0b3N1Z2dlc3Qke0NvbG9yX09mZn0gQWx3YXlzIHVzZXMgQUkgd2l0aG91dCBhc2tpbmciCiAgZWNobyAtZSAiICAke0JDeWFufW9mZiR7Q29sb3JfT2ZmfSAgICAgICAgIERpc2FibGVzIEFJIGNvbW1pdCBzdWdnZXN0aW9uc1xuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlfUNPTkZJR1VSQVRJT04gKC5lbnYubWFpYXNzKToke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiICAke0JDeWFufU1BSUFTU19BSV9NT0RFJHtDb2xvcl9PZmZ9PSR7R3JheX1hc2ske0NvbG9yX09mZn0gICAgICAgICAjIFNldCBBSSBtb2RlIChhc2ssIGF1dG9zdWdnZXN0LCBvZmYpIgogIGVjaG8gLWUgIiAgJHtCQ3lhbn1NQUlBU1NfQUlfTU9ERUwke0NvbG9yX09mZn09JHtHcmF5fWdwdC00JHtDb2xvcl9PZmZ9ICAgICAgIyBBSSBtb2RlbCB0byB1c2VcbiIKICAKICBlY2hvIC1lICIke0JZZWxsb3d9VGlwOiR7Q29sb3JfT2ZmfSBGb3IgQUkgY29tbWl0cyBvbmx5IChubyB2ZXJzaW9uaW5nKSwgdXNlOiAke0JDeWFufW1haWFzcyAtLWNvbW1pdHMtb25seSR7Q29sb3JfT2ZmfVxuIgogIAogIF9oZWxwX21lbnVfZm9vdGVyCn0KCiMgNC4gVmVyc2lvbiAmIENoYW5nZWxvZyBXb3JrZmxvdwpzaG93X2hlbHBfdmVyc2lvbl93b3JrZmxvdygpIHsKICBjbGVhcgogIHNob3dfbG9nbwogIAogIGVjaG8gLWUgIiR7QldoaXRlfVZFUlNJT04gJiBDSEFOR0VMT0cgV09SS0ZMT1cke0NvbG9yX09mZn1cbiIKICAKICBlY2hvIC1lICJNQUlBU1MgYXV0b21hdGVzIHZlcnNpb24gYnVtcGluZyBhbmQgY2hhbmdlbG9nIG1hbmFnZW1lbnQ6XG4iCiAgZWNobyAtZSAiICAke0JHcmVlbn0xLiR7Q29sb3JfT2ZmfSBNZXJnZXMgZmVhdHVyZSBicmFuY2gg4oaSIGRldmVsb3AiCiAgZWNobyAtZSAiICAke0JHcmVlbn0yLiR7Q29sb3JfT2ZmfSBDcmVhdGVzIHJlbGVhc2UveC54LnggYnJhbmNoIChmb3IgbWlub3IvbWFqb3IgYnVtcHMpIgogIGVjaG8gLWUgIiAgJHtCR3JlZW59My4ke0NvbG9yX09mZn0gVXBkYXRlcyB2ZXJzaW9uIGZpbGVzIGFuZCBjaGFuZ2Vsb2ciCiAgZWNobyAtZSAiICAke0JHcmVlbn00LiR7Q29sb3JfT2ZmfSBDb21taXRzIGFuZCBwdXNoZXMgY2hhbmdlcyIKICBlY2hvIC1lICIgICR7QkdyZWVufTUuJHtDb2xvcl9PZmZ9IE1lcmdlcyByZWxlYXNlIGJyYW5jaCBiYWNrIHRvIGRldmVsb3AiCiAgZWNobyAtZSAiICAke0JHcmVlbn02LiR7Q29sb3JfT2ZmfSBSZXR1cm5zIHRvIG9yaWdpbmFsIGZlYXR1cmUgYnJhbmNoXG4iCiAgCiAgZWNobyAtZSAiJHtCV2hpdGV9R2l0IEZsb3cgRGlhZ3JhbToke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiJHtCQXF1YX0gICAgZmVhdHVyZS94eXog4pSA4pSA4pSQIgogIGVjaG8gLWUgIiAgICAgICAgICAgICAgICAgIOKUnOKUgOKGkiBkZXZlbG9wIOKUgOKUgOKGkiByZWxlYXNlLzEuMi4zIOKUgOKUgOKUkCIKICBlY2hvIC1lICIgICAgZmVhdHVyZS9hYmMg4pSA4pSA4pSYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilJzilIDihpIgZGV2ZWxvcCIKICBlY2hvIC1lICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSU4pSA4oaSICh0YWdnZWQpJHtDb2xvcl9PZmZ9XG4iCiAgCiAgZWNobyAtZSAiJHtCV2hpdGV9QlJBTkNIIFNUUkFURUdZOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgICR7QkN5YW59UHJvZHVjdGlvbiR7Q29sb3JfT2ZmfSAgKG1haW4vbWFzdGVyKSAtIEZvciByZWxlYXNlcy9kZXBsb3ltZW50cyIKICBlY2hvIC1lICIgICR7QkN5YW59RGV2ZWxvcG1lbnQke0NvbG9yX09mZn0gKGRldmVsb3ApICAgICAtIFdoZXJlIHZlcnNpb25pbmcgaGFwcGVucyIKICBlY2hvIC1lICIgICR7QkN5YW59U3RhZ2luZyR7Q29sb3JfT2ZmfSAgICAgKHN0YWdpbmcpICAgICAtIFByZS1wcm9kdWN0aW9uIHRlc3RpbmcgJHtHcmF5fVtvcHRpb25hbF0ke0NvbG9yX09mZn1cbiIKICAKICBlY2hvIC1lICIke0JXaGl0ZX1DT05GSUdVUkFUSU9OICguZW52Lm1haWFzcyk6JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgJHtCQ3lhbn1NQUlBU1NfTUFJTkJSQU5DSCR7Q29sb3JfT2ZmfT0ke0dyYXl9bWFpbiR7Q29sb3JfT2ZmfSAgICAgICAgIyBQcm9kdWN0aW9uIGJyYW5jaCBuYW1lIgogIGVjaG8gLWUgIiAgJHtCQ3lhbn1NQUlBU1NfREVWRUxPUEJSQU5DSCR7Q29sb3JfT2ZmfT0ke0dyYXl9ZGV2ZWxvcCR7Q29sb3JfT2ZmfSAgIyBEZXZlbG9wbWVudCBicmFuY2ggbmFtZSIKICBlY2hvIC1lICIgICR7QkN5YW59TUFJQVNTX1NUQUdJTkdCUkFOQ0gke0NvbG9yX09mZn09JHtHcmF5fXN0YWdpbmcke0NvbG9yX09mZn0gICMgU3RhZ2luZyBicmFuY2ggbmFtZSAob3B0aW9uYWwpXG4iCiAgCiAgX2hlbHBfbWVudV9mb290ZXIKfQoKIyA1LiBDb25maWd1cmF0aW9uIE9wdGlvbnMKc2hvd19oZWxwX2NvbmZpZ3VyYXRpb24oKSB7CiAgY2xlYXIKICBzaG93X2xvZ28KICAKICBlY2hvIC1lICIke0JXaGl0ZX1DT05GSUdVUkFUSU9OIE9QVElPTlMke0NvbG9yX09mZn1cbiIKICAKICBlY2hvIC1lICJDb25maWd1cmF0aW9uIGZpbGVzIChpbiBvcmRlciBvZiBwcmVjZWRlbmNlKToiCiAgZWNobyAtZSAiICAke0JDeWFufS5lbnYubWFpYXNzLmxvY2FsJHtDb2xvcl9PZmZ9ICBQZXJzb25hbCBzZXR0aW5ncyAke0dyYXl9KGdpdGlnbm9yZWQpJHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgJHtCQ3lhbn0uZW52Lm1haWFzcyR7Q29sb3JfT2ZmfSAgICAgICAgVGVhbS9yZXBvIGNvbmZpZyAke0dyYXl9KHRyYWNrZWQgaW4gZ2l0KSR7Q29sb3JfT2ZmfVxuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlffCfpJYgQUkgRkVBVFVSRVM6JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgTUFJQVNTX0FJX01PREUgICAgICAgICAgICR7R3JheX0oJ2FzaycpJHtDb2xvcl9PZmZ9ICdvZmYnLCAnYXV0b3N1Z2dlc3QnIgogIGVjaG8gLWUgIiAgTUFJQVNTX0FJX01PREVMICAgICAgICAgICR7R3JheX0oJ2dwdC00Jykke0NvbG9yX09mZn0gQUkgbW9kZWwgdG8gdXNlXG4iCgogIGVjaG8gLWUgIiR7QldoaXRlffCfjL8gR0lUIFdPUktGTE9XOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgIE1BSUFTU19NQUlOQlJBTkNIICAgICAgICAke0dyYXl9KCdtYWluJykke0NvbG9yX09mZn0gUHJvZHVjdGlvbiBicmFuY2ggbmFtZSIKICBlY2hvIC1lICIgIE1BSUFTU19ERVZFTE9QQlJBTkNIICAgICAke0dyYXl9KCdkZXZlbG9wJykke0NvbG9yX09mZn0gRGV2ZWxvcG1lbnQgYnJhbmNoIG5hbWUiCiAgZWNobyAtZSAiICBNQUlBU1NfU1RBR0lOR0JSQU5DSCAgICAgJHtHcmF5fSgnc3RhZ2luZycpJHtDb2xvcl9PZmZ9IFN0YWdpbmcgYnJhbmNoIG5hbWVcbiIKICAKICBlY2hvIC1lICIke0JXaGl0ZX3wn5OKIE9VVFBVVCBDT05UUk9MOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgIE1BSUFTU19WRVJCT1NJVFkgICAgICAgICAke0dyYXl9KCdicmllZicpJHtDb2xvcl9PZmZ9ICdub3JtYWwnLCAnZGVidWcnIgogIGVjaG8gLWUgIiAgTUFJQVNTX0xPR0dJTkcgICAgICAgICAgICR7R3JheX0oJ3RydWUnKSR7Q29sb3JfT2ZmfSBFbmFibGUgbG9nZ2luZyB0byBmaWxlXG4iCiAgCiAgZWNobyAtZSAiJHtCV2hpdGV98J+TgSBWRVJTSU9OIEZJTEVTOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgIE1BSUFTU19WRVJTSU9OX1BSSU1BUllfRklMRSAgICAgICAgUHJpbWFyeSB2ZXJzaW9uIGZpbGUgcGF0aCIKICBlY2hvIC1lICIgIE1BSUFTU19WRVJTSU9OX1BSSU1BUllfVFlQRSAgICAgICAgJHtHcmF5fSgndHh0Jykke0NvbG9yX09mZn0gJ2pzb24nLCAncGhwJywgJ3BhdHRlcm4nIgogIGVjaG8gLWUgIiAgTUFJQVNTX1ZFUlNJT05fU0VDT05EQVJZX0ZJTEVTICAgICBBZGRpdGlvbmFsIGZpbGVzIHRvIHVwZGF0ZSAocGlwZS1zZXBhcmF0ZWQpIgogIGVjaG8gLWUgIiAgTUFJQVNTX0NIQU5HRUxPR19QQVRIICAgICAgICAgICAgICAke0dyYXl9KCcuJykke0NvbG9yX09mZn0gQ2hhbmdlbG9nIGRpcmVjdG9yeVxuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlfVNFQ09OREFSWSBGSUxFUyBGT1JNQVQ6JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgJHtHcmF5fWZpbGU6dHlwZTpwcmVmaXgke0NvbG9yX09mZn0gc2VwYXJhdGVkIGJ5ICR7QkN5YW59fCR7Q29sb3JfT2ZmfSBmb3IgbXVsdGlwbGUgZmlsZXNcbiIKICBlY2hvIC1lICIgICR7QldoaXRlfVR5cGVzOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgICAgJHtCQ3lhbn10eHQke0NvbG9yX09mZn0gICAgICBUZXh0IGZpbGUgd2l0aCBwcmVmaXggKGUuZy4sICdWZXJzaW9uOiAnKSIKICBlY2hvIC1lICIgICAgJHtCQ3lhbn1wYXR0ZXJuJHtDb2xvcl9PZmZ9ICBQYXR0ZXJuIHdpdGgge3ZlcnNpb259IHBsYWNlaG9sZGVyXG4iCiAgZWNobyAtZSAiICAke0JXaGl0ZX1FeGFtcGxlczoke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiICAgICR7R3JheX0jIFNpbmdsZSBmaWxlJHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiR7QkdyZWVufSAgICBNQUlBU1NfVkVSU0lPTl9TRUNPTkRBUllfRklMRVM9XCJSRUFETUUubWQ6dHh0OlZlcnNpb24gXCJcbiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgICAgJHtHcmF5fSMgTXVsdGlwbGUgZmlsZXMke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiJHtCR3JlZW59ICAgIE1BSUFTU19WRVJTSU9OX1NFQ09OREFSWV9GSUxFUz1cIlJFQURNRS5tZDp0eHQ6IyB2fGRvY3MvZ3VpZGUubWQ6dHh0OlZlcnNpb246IFwiXG4ke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiICAgICR7R3JheX0jIFBhdHRlcm4gbWF0Y2hpbmcke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiJHtCR3JlZW59ICAgIE1BSUFTU19WRVJTSU9OX1NFQ09OREFSWV9GSUxFUz1cImZ1bmN0aW9ucy5waHA6cGF0dGVybjpkZWZpbmUoJ1ZFUlNJT04nLCd7dmVyc2lvbn0nKTt8Zm9vLmpzb246anNvbjp2ZXJzaW9uXCJcbiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIke0JHcmVlbn0gICAgTUFJQVNTX1ZFUlNJT05fU0VDT05EQVJZX0ZJTEVTPVwicGF0dGVybi50eHQ6cGF0dGVybjpkZWZpbmUoXFxcIk1ZX1ZFUlNJT05cXFwiLFxcXCJ7dmVyc2lvbn1cXFwiKTt8cGF0dGVybi50eHQ6cGF0dGVybjpNWVZBUiA9IFxcXCJ7dmVyc2lvbn1cXFwifHBhdHRlcm4udHh0OnBhdHRlcm46TVlWQVIgPSAne3ZlcnNpb259J1wiJHtDb2xvcl9PZmZ9IgogIAogIGVjaG8gLWUgIiR7QlllbGxvd31UaXA6JHtDb2xvcl9PZmZ9IFJ1biAke0JDeWFufW1haWFzcyAtLWJvb3RzdHJhcCR7Q29sb3JfT2ZmfSBmb3IgZ3VpZGVkIGNvbmZpZ3VyYXRpb24gc2V0dXBcbiIKICAKICBfaGVscF9tZW51X2Zvb3Rlcgp9CgojIDYuIEF1dG8tTW9kZQpzaG93X2hlbHBfYXV0b21vZGUoKSB7CiAgY2xlYXIKICBzaG93X2xvZ28KICAKICBlY2hvIC1lICIke0JXaGl0ZX1BVVRPLU1PREUgJiBOT04tSU5URVJBQ1RJVkUgV09SS0ZMT1dTJHtDb2xvcl9PZmZ9XG4iCiAgCiAgZWNobyAtZSAiJHtCV2hpdGV9UVVJQ0sgQVVUTy1NT0RFOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgIFVzZSAke0JDeWFufS0tYXV0byR7Q29sb3JfT2ZmfSBvciAke0JDeWFufS1hJHtDb2xvcl9PZmZ9IGZsYWcgdG8gZW5hYmxlIGFsbCBhdXRvLXllcyBzZXR0aW5nczpcbiIKICBlY2hvIC1lICIgICR7QkdyZWVufW1haWFzcyAtLWF1dG8ke0NvbG9yX09mZn0gICAgICAgICAgIyBGdWxsIGF1dG9tYXRpb24iCiAgZWNobyAtZSAiICAke0JHcmVlbn1tYWlhc3MgLWEgbWlub3Ike0NvbG9yX09mZn0gICAgICAgICMgQXV0by1tb2RlIHdpdGggbWlub3IgYnVtcFxuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlfUdSQU5VTEFSIENPTlRST0wgKHZpYSAuZW52Lm1haWFzcyk6JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgTUFJQVNTX0FVVE9fU1RBR0VfVU5TVEFHRUQgICAgICAgICAke0dyYXl9KCdmYWxzZScpJHtDb2xvcl9PZmZ9IEF1dG8tc3RhZ2UgY2hhbmdlcyIKICBlY2hvIC1lICIgIE1BSUFTU19BVVRPX1BVU0hfQ09NTUlUUyAgICAgICAgICAgJHtHcmF5fSgnZmFsc2UnKSR7Q29sb3JfT2ZmfSBBdXRvLXB1c2ggY29tbWl0cyIKICBlY2hvIC1lICIgIE1BSUFTU19BVVRPX01FUkdFX1RPX0RFVkVMT1AgICAgICAgJHtHcmF5fSgnZmFsc2UnKSR7Q29sb3JfT2ZmfSBBdXRvLW1lcmdlIHRvIGRldmVsb3AiCiAgZWNobyAtZSAiICBNQUlBU1NfQVVUT19BUFBST1ZFX0FJX1NVR0dFU1RJT05TICR7R3JheX0oJ2ZhbHNlJykke0NvbG9yX09mZn0gQXV0by1hcHByb3ZlIEFJXG4iCiAgCiAgZWNobyAtZSAiJHtCV2hpdGV9T1RIRVIgQVVUT01BVElPTjoke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiICBNQUlBU1NfUFVTSF9BQlNUUkFDVFNfVE9fUkVNT1RFICAgICR7R3JheX0oJ2FzaycpJHtDb2xvcl9PZmZ9ICdhbHdheXMnLCAnbmV2ZXInIgogIGVjaG8gLWUgIiAgTUFJQVNTX1BBVENIX1JFTEVBU0VTICAgICAgICAgICAgICAke0dyYXl9KHNraXApJHtDb2xvcl9PZmZ9ICdhc2snLCAnYWx3YXlzJywgJ25vJ1xuIgogIAogIGVjaG8gLWUgIiR7QlllbGxvd31Ob3RlOiR7Q29sb3JfT2ZmfSAke0JDeWFufS0tYXV0byR7Q29sb3JfT2ZmfSBmbGFnIG92ZXJyaWRlcyBhbGwgLmVudiBzZXR0aW5ncyBmb3IgY29tcGxldGUgYXV0b21hdGlvblxuIgogIAogIF9oZWxwX21lbnVfZm9vdGVyCn0KCiMgNy4gRmVhdHVyZXMgJiBDb21wYXRpYmlsaXR5CnNob3dfaGVscF9mZWF0dXJlcygpIHsKICBjbGVhcgogIHNob3dfbG9nbwogIAogIGVjaG8gLWUgIiR7QldoaXRlfUZFQVRVUkVTICYgQ09NUEFUSUJJTElUWSR7Q29sb3JfT2ZmfVxuIgogIAogIGVjaG8gLWUgIiR7QldoaXRlfeKcqCBLRVkgRkVBVFVSRVM6JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAg4oCiICR7QkdyZWVufUFJLXBvd2VyZWQgY29tbWl0IG1lc3NhZ2VzJHtDb2xvcl9PZmZ9IHZpYSBBSSBpbnRlZ3JhdGlvbiIKICBlY2hvIC1lICIgIOKAoiAke0JHcmVlbn1BdXRvbWF0aWMgY2hhbmdlbG9nIGdlbmVyYXRpb24ke0NvbG9yX09mZn0gYW5kIG1hbmFnZW1lbnQiCiAgZWNobyAtZSAiICDigKIgJHtCR3JlZW59TXVsdGktcmVwb3NpdG9yeSBzdXBwb3J0JHtDb2xvcl9PZmZ9IChXb3JkUHJlc3MsIENyYWZ0LCBiZXNwb2tlIHByb2plY3RzKSIKICBlY2hvIC1lICIgIOKAoiAke0JHcmVlbn1HaXQgd29ya2Zsb3cgYXV0b21hdGlvbiR7Q29sb3JfT2ZmfSAoY29tbWl0LCB0YWcsIG1lcmdlLCBwdXNoKSIKICBlY2hvIC1lICIgIOKAoiAke0JHcmVlbn1JbnRlbGxpZ2VudCB2ZXJzaW9uIG1hbmFnZW1lbnQke0NvbG9yX09mZn0gZm9yIGRpdmVyc2UgZmlsZSBzdHJ1Y3R1cmVzIgogIGVjaG8gLWUgIiAg4oCiICR7QkdyZWVufUppcmEgdGlja2V0IGRldGVjdGlvbiR7Q29sb3JfT2ZmfSBmcm9tIGJyYW5jaCBuYW1lc1xuIgoKICBlY2hvIC1lICIke0JXaGl0ZX3wn5SEIFJFUE9TSVRPUlkgQ09NUEFUSUJJTElUWToke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiICAke0JZZWxsb3d9QXV0b21hdGljYWxseSBhZGFwdHMgdG8geW91ciByZXBvc2l0b3J5IHN0cnVjdHVyZToke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiICAke0JHcmVlbn3inJMke0NvbG9yX09mZn0gRnVsbCBHaXQgRmxvdyAoZGV2ZWxvcCDihpIgc3RhZ2luZyDihpIgbWFpbikiCiAgZWNobyAtZSAiICAke0JHcmVlbn3inJMke0NvbG9yX09mZn0gU2ltcGxlIHdvcmtmbG93IChmZWF0dXJlIOKGkiBtYWluKSIKICBlY2hvIC1lICIgICR7QkdyZWVufeKckyR7Q29sb3JfT2ZmfSBMb2NhbC1vbmx5IHJlcG9zaXRvcmllcyAobm8gcmVtb3RlIHJlcXVpcmVkKSIKICBlY2hvIC1lICIgICR7QkdyZWVufeKckyR7Q29sb3JfT2ZmfSBTaW5nbGUgYnJhbmNoIHdvcmtmbG93cyIKICBlY2hvIC1lICIgICR7QkdyZWVufeKckyR7Q29sb3JfT2ZmfSBQcm9qZWN0cyB3aXRob3V0IHZlcnNpb24gZmlsZXMgKGdpdC1vbmx5IG1vZGUpXG4iCgogIGVjaG8gLWUgIiR7QldoaXRlfeKame+4jyBTWVNURU0gUkVRVUlSRU1FTlRTOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgICR7QkdyZWVufeKckyR7Q29sb3JfT2ZmfSBVbml4LWxpa2Ugc3lzdGVtIChtYWNPUywgTGludXgsIFdTTCkiCiAgZWNobyAtZSAiICAke0JHcmVlbn3inJMke0NvbG9yX09mZn0gQmFzaCAzLjIrIChtYWNPUyBkZWZhdWx0IHN1cHBvcnRlZCkiCiAgZWNobyAtZSAiICAke0JHcmVlbn3inJMke0NvbG9yX09mZn0gR2l0IGNvbW1hbmQtbGluZSB0b29scyIKICBlY2hvIC1lICIgICR7QlllbGxvd33inJMke0NvbG9yX09mZn0ganEgKEpTT04gcHJvY2Vzc29yKSAke0dyYXl9LSByZXF1aXJlZCR7Q29sb3JfT2ZmfVxuIgoKICBlY2hvIC1lICIgICR7QlllbGxvd31JbnN0YWxsIGpxOiR7Q29sb3JfT2ZmfSAke0dyYXl9YnJldyBpbnN0YWxsIGpxJHtDb2xvcl9PZmZ9IChtYWNPUykgfCAke0dyYXl9c3VkbyBhcHQgaW5zdGFsbCBqcSR7Q29sb3JfT2ZmfSAoVWJ1bnR1KVxuIgoKICBfaGVscF9tZW51X2Zvb3Rlcgp9CgojIDguIFNob3cgQWxsCnNob3dfaGVscF9hbGwoKSB7CiAgY2xlYXIKICBzaG93X2xvZ28KICAKICBlY2hvIC1lICIke0JSZWR94pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBJHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiR7QlJlZH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUExFVEUgRE9DVU1FTlRBVElPTiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIke0JSZWR94pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBJHtDb2xvcl9PZmZ9XG4iCiAgCiAgZWNobyAtZSAiJHtCWWVsbG93fVRoaXMgZGlzcGxheXMgYWxsIGhlbHAgc2VjdGlvbnMuIFVzZSB0aGUgbWVudSAob3B0aW9uIDEtNykgZm9yIHNwZWNpZmljIHRvcGljcy4ke0NvbG9yX09mZn1cbiIKICBlY2hvIC1lICIke0dyYXl9UHJlc3MgRW50ZXIgdG8gY29udGludWUuLi4ke0NvbG9yX09mZn0iCiAgcmVhZCAtcgogIAogICMgU2hvdyBhbGwgc2VjdGlvbnMKICBzaG93X2hlbHBfcXVpY2tzdGFydAogIHNob3dfaGVscF9vcHRpb25zCiAgc2hvd19oZWxwX2FpX3dvcmtmbG93CiAgc2hvd19oZWxwX3ZlcnNpb25fd29ya2Zsb3cKICBzaG93X2hlbHBfY29uZmlndXJhdGlvbgogIHNob3dfaGVscF9hdXRvbW9kZQogIHNob3dfaGVscF9mZWF0dXJlcwp9CgojIEZ1bmN0aW9uIHRvIGRpc3BsYXkgaGVscCBpbmZvcm1hdGlvbiBmb3IgY29tbWl0dGhpcwpzaG93X2hlbHBfY29tbWl0dGhpcygpIHsKICBlY2hvIC1lICIke0JCbHVlfWNvbW1pdHRoaXMgLSBBSS1wb3dlcmVkIEdpdCBjb21taXQgbWVzc2FnZSBnZW5lcmF0b3Ike0NvbG9yX09mZn0iCiAgZWNobwogIGVjaG8gLWUgIiR7QldoaXRlfVVzYWdlOiR7Q29sb3JfT2ZmfSIKICBlY2hvIC1lICIgICR7QkdyZWVufWNvbW1pdHRoaXMke0NvbG9yX09mZn0iCiAgZWNobwogIGVjaG8gLWUgIiR7QldoaXRlfUVudmlyb25tZW50IENvbmZpZ3VyYXRpb246JHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgJHtCQ3lhbn1NQUlBU1NfQUlfVE9LRU4ke0NvbG9yX09mZn0gICAgICBZb3VyIEFJIEFQSSB0b2tlbiAocmVxdWlyZWQpIgogIGVjaG8gLWUgIiAgJHtCQ3lhbn1NQUlBU1NfQUlfTU9ERSR7Q29sb3JfT2ZmfSAgICAgICBDb21taXQgbW9kZToiCiAgZWNobyAtZSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNrIChkZWZhdWx0KSwgYXV0b3N1Z2dlc3QsIG9mZiIKICBlY2hvIC1lICIgICR7QkN5YW59TUFJQVNTX0FJX0NPTU1JVF9NRVNTQUdFX1NUWUxFJHtDb2xvcl9PZmZ9IgogIGVjaG8gLWUgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Ugc3R5bGU6IGJ1bGxldCAoZGVmYXVsdCksIGNvbnZlbnRpb25hbCwgc2ltcGxlIgogIGVjaG8gLWUgIiAgJHtCQ3lhbn1NQUlBU1NfQUlfRU5EUE9JTlQke0NvbG9yX09mZn0gICBDdXN0b20gQUkgZW5kcG9pbnQgKG9wdGlvbmFsKSIKICBlY2hvCiAgZWNobyAtZSAiJHtCV2hpdGV9RmlsZXMgKG9wdGlvbmFsKToke0NvbG9yX09mZn0iCiAgZWNobyAtZSAiICAke0JHcmVlbn0uZW52JHtDb2xvcl9PZmZ9ICAgICAgICAgICAgICAgICAgICAgQ2FuIGRlZmluZSB0aGUgdmFyaWFibGVzIGFib3ZlIgogIGVjaG8gLWUgIiAgJHtCR3JlZW59Lm1haWFzcy5wcm9tcHQke0NvbG9yX09mZn0gICAgICAgICAgIEN1c3RvbSBBSSBwcm9tcHQgb3ZlcnJpZGUiCiAgZWNobwogIGVjaG8gLWUgImNvbW1pdHRoaXMgYW5hbHl6ZXMgeW91ciBzdGFnZWQgY2hhbmdlcyBhbmQgc3VnZ2VzdHMgYW4gaW50ZWxsaWdlbnQgY29tbWl0IG1lc3NhZ2UuIgogIGVjaG8gLWUgIllvdSBjYW4gYWNjZXB0LCByZWplY3QsIG9yIGVkaXQgaXQgYmVmb3JlIGNvbW1pdHRpbmcuIgogIGVjaG8gLWUgIlRoaXMgc2NyaXB0IGRvZXMgbm90IG1hbmFnZSB2ZXJzaW9ucywgY2hhbmdlbG9ncywgb3IgYnJhbmNoZXMuIgp9CgpmaSAjIF9fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX3V0aWxzX2hlbHBfc2gKIyAtLS0gRW5kIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL3V0aWxzL2hlbHAuc2ggLS0tCgpmdW5jdGlvbiBpbml0aWFsaXNlQnVtcCgpIHsKCiAgcHJpbnRfaGVhZGVyICIkaGVhZGVyIgogIHByaW50X2luZm8gIlRoaXMgc2NyaXB0IHdpbGwgaGVscCB5b3UgYnVtcCB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIG1hbmFnZSB5b3VyIGdpdCB3b3JrZmxvdyIgImJyaWVmIgogIHByaW50X2luZm8gIlByZXNzICR7QldoaXRlfWN0cmwrYyR7Q29sb3JfT2ZmfSB0byBhYm9ydCBhdCBhbnkgdGltZVxuIiAiYnJpZWYiCgogICMgTG9hZCBNQUlBU1NfKiB2YXJpYWJsZXMgZnJvbSAuZW52ICh0aGVzZSBvdmVycmlkZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMpCiAgbG9hZF9idW1wc2NyaXB0X2VudgoKICAjIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyBhZnRlciBsb2FkaW5nIGVudgogIHNldHVwX2J1bXBzY3JpcHRfdmFyaWFibGVzCgogICMgQ2hlY2sgYW5kIGhhbmRsZSAuZ2l0aWdub3JlIGZvciBsb2cgZmlsZXMgaWYgbG9nZ2luZyBpcyBlbmFibGVkCiAgY2hlY2tfZ2l0aWdub3JlX2Zvcl9sb2dzCgogICMgQ2hlY2sgYW5kIGhhbmRsZSAuZ2l0aWdub3JlIGZvciBlbnZpcm9ubWVudCBmaWxlcwogIGNoZWNrX2dpdGlnbm9yZV9mb3JfZW52CgogICMgRW5zdXJlIHdlJ3JlIGluIGEgZ2l0IHJlcG9zaXRvcnkKICBjaGVja19naXRfcmVwb3NpdG9yeQoKICAjIEJvb3RzdHJhcCBwcm9qZWN0IGlmIG5lZWRlZCAoaW50ZXJhY3RpdmUgc2V0dXAgZm9yIG5ldyBwcm9qZWN0cykKICBib290c3RyYXBfcHJvamVjdAoKICAjIEF1dG8tY2hlY2sgZm9yIHVwZGF0ZXMgKGRhaWx5IGZyZXF1ZW5jeSBsaW1pdCwgcnVucyBpbiBiYWNrZ3JvdW5kKQogIGF1dG9fY2hlY2tfdmVyc2lvbgoKICBleHBvcnQgR0lUX01FUkdFX0FVVE9FRElUPW5vCgogICMgSGFuZGxlIGVtcHR5IHJlcG9zaXRvcnkgY2FzZSAobm8gY29tbWl0cyB5ZXQpCiAgaWYgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgdGFnbWVzc2FnZT0kKGdpdCBsb2cgLTEgLS1wcmV0dHk9JUIpCiAgICBicmFuY2hfbmFtZT0kKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQpCiAgZWxzZQogICAgdGFnbWVzc2FnZT0iIgogICAgIyBHZXQgYnJhbmNoIG5hbWUgZXZlbiB3aXRob3V0IGNvbW1pdHMKICAgIGJyYW5jaF9uYW1lPSQoZ2l0IHN5bWJvbGljLXJlZiAtLXNob3J0IEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAibWFpbiIpCiAgZmkKCiAgZXhwb3J0IHRhZ21lc3NhZ2UKICBleHBvcnQgYnJhbmNoX25hbWUKICBodW1hbmRhdGU9JChkYXRlICsiJWQgJUIgJVkiKQogIGxvbmdodW1hbmRhdGU9JChkYXRlICsiJWQgJUIgJVkgKCVBKSIpCiAgZXhwb3J0IGh1bWFuZGF0ZQogIGV4cG9ydCBsb25naHVtYW5kYXRlCgogICMgQ2hlY2sgZm9yIGVudiB2YXIgb3ZlcnJpZGUgQkVGT1JFIGJyYW5jaCBkZXRlY3Rpb24KICBpZiBbWyAiJE1BSUFTU19NT0RFIiA9PSAiYWlfb25seSIgXV07IHRoZW4KICAgICAgZXhwb3J0IGFpX2NvbW1pdHNfb25seT10cnVlCiAgZmkKCiAgYnJhbmNoRGV0ZWN0aW9uCgogICMgSW5pdGlhbGl6ZSBwYXRoIHZhcmlhYmxlcyB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciB2ZXJzaW9uIGZpbGUgZGV0ZWN0aW9uCiAgZXhwb3J0IHBhY2thZ2VfanNvbl9wYXRoPSIke01BSUFTU19QQUNLQUdFX1BBVEg6LS59IgogIGV4cG9ydCB2ZXJzaW9uX2ZpbGVfcGF0aD0iJHtNQUlBU1NfVkVSU0lPTl9QQVRIOi0ufSIKCiAgIyBDaGVjayBpZiB2ZXJzaW9uIGZpbGVzIGV4aXN0IGJlZm9yZSBydW5uaW5nIHZlcnNpb24gbWFuYWdlbWVudAogIGxvY2FsIGhhc192ZXJzaW9uX2ZpbGVzPWZhbHNlCgogICMgQ2hlY2sgZm9yIGN1c3RvbSBwcmltYXJ5IHZlcnNpb24gZmlsZSBmaXJzdAogIGlmIFtbIC1uICIkdmVyc2lvbl9wcmltYXJ5X2ZpbGUiICYmIC1mICIkdmVyc2lvbl9wcmltYXJ5X2ZpbGUiIF1dOyB0aGVuCiAgICBoYXNfdmVyc2lvbl9maWxlcz10cnVlCiAgIyBDaGVjayBmb3IgZGVmYXVsdCB2ZXJzaW9uIGZpbGVzCiAgZWxpZiBbWyAtZiAiJHtwYWNrYWdlX2pzb25fcGF0aH0vcGFja2FnZS5qc29uIiBdXSB8fCBbWyAtZiAiJHt2ZXJzaW9uX2ZpbGVfcGF0aH0vVkVSU0lPTiIgXV07IHRoZW4KICAgIGhhc192ZXJzaW9uX2ZpbGVzPXRydWUKICBmaQoKICBwcmludF9kZWJ1ZyAiVmVyaW9uIHByaW1hcnkgZmlsZTogJHtCWWVsbG93fSR7dmVyc2lvbl9wcmltYXJ5X2ZpbGV9JHtDb2xvcl9PZmZ9IgogIGVjaG8KICBwcmludF9kZWJ1ZyAiaGFzIHZlcnNpb24gZmlsZXM6ICR7QlllbGxvd30kaGFzX3ZlcnNpb25fZmlsZXMke0NvbG9yX09mZn0iCgogICMgaWYgJGFpX2NvbW1pdHNfb25seSBleGl0IDAKICBpZiBbWyAiJGFpX2NvbW1pdHNfb25seSIgPT0gInRydWUiIF1dOyB0aGVuCiAgICBjaGVja1VuY29tbWl0dGVkQ2hhbmdlcwogICAgZWNobyAtZSAiJHtCQXF1YX1Nb2RlIGlzIGNvbW1pdHMgb25seS4gXG5XZSBhcmUgZG9uZSBhbmQgb24gJGJyYW5jaF9uYW1lIGJyYW5jaC4ke0NvbG9yX09mZn0iCiAgICBwcmludF9zaWdub2ZmX3dpdGhfdG9wdXAKICAgIGV4aXQgMAogIGZpCgogIGlmIFtbICIkaGFzX3ZlcnNpb25fZmlsZXMiID09ICJ0cnVlIiBdXTsgdGhlbgogICAgY2hhbmdlTWFuYWdlbWVudAogIGVsc2UKICAgIHByaW50X3dhcm5pbmcgIk5vIHZlcnNpb24gZmlsZXMgZm91bmQgKHBhY2thZ2UuanNvbiBvciBWRVJTSU9OKSIKICAgIHByaW50X2luZm8gIlNraXBwaW5nIHZlcnNpb24gYnVtcGluZyBhbmQgY2hhbmdlbG9nIG1hbmFnZW1lbnQiCiAgICBwcmludF9pbmZvICJXaWxsIHByb2NlZWQgd2l0aCBnaXQgd29ya2Zsb3cgb25seVxuIgogICAgIyBTdGlsbCBjaGVjayBmb3IgdW5jb21taXR0ZWQgY2hhbmdlcyBldmVuIHdpdGhvdXQgdmVyc2lvbiBmaWxlcwogICAgY2hlY2tVbmNvbW1pdHRlZENoYW5nZXMKICBmaQoKICBtZXJnZURldmVsb3AgIiRoYXNfdmVyc2lvbl9maWxlcyIgIiR7ZmlsdGVyZWRfYXJnc1tAXX0iCiAgZGVwbG95T3B0aW9ucwp9CgojIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKCiMgVG9rZW4gbWFuYWdlbWVudCBzd2l0Y2hlcwp1cGRhdGVfdG9rZW5fdmFsdWU9IiIKCiMgQXV0by1tb2RlIGZsYWcKYXV0b19tb2RlX2VuYWJsZWQ9ZmFsc2UKCiMgRmlsdGVyZWQgYXJndW1lbnRzIChleGNsdWRpbmcgZmxhZ3MpCmZpbHRlcmVkX2FyZ3M9KCkKCiMgRmlyc3QgcGFzczogbG9vayBmb3IgLS11cGRhdGUtdG9rZW4gd2l0aCBhcmd1bWVudApmb3IgaSBpbiAkKHNlcSAxICQjKTsgZG8KICBpZiBbWyAiJHshaX0iID09ICItLXVwZGF0ZS10b2tlbiIgXV07IHRoZW4KICAgIG5leHRfaT0kKChpICsgMSkpCiAgICBpZiBbWyAkbmV4dF9pIC1sZSAkIyBdXTsgdGhlbgogICAgICBuZXh0X2FyZz0iJHshbmV4dF9pfSIKICAgICAgIyBDaGVjayBpZiBuZXh0IGFyZ3VtZW50IGlzIG5vdCBhbm90aGVyIGZsYWcKICAgICAgaWYgW1sgISAiJG5leHRfYXJnIiA9fiBeLS0gXV07IHRoZW4KICAgICAgICB1cGRhdGVfdG9rZW5fdmFsdWU9IiRuZXh0X2FyZyIKICAgICAgICBicmVhawogICAgICBmaQogICAgZmkKICBmaQpkb25lCgojIE1haW4gYXJndW1lbnQgcHJvY2Vzc2luZwpmb3IgYXJnIGluICIkQCI7IGRvCiAgY2FzZSAkYXJnIGluCiAgICAtaHwtLWhlbHApCiAgICAgIHNob3dfaGVscAogICAgICBleGl0IDAKICAgICAgZXhpdCAwCiAgICAgIDs7CiAgICAtdnwtLXZlcnNpb24pCiAgICAgIHZlcnNpb249IiRNQUlBU1NfQ0xJRU5UX1ZFUlNJT04iCiAgICAgIGVjaG8gIk1BSUFTUyB2JHZlcnNpb24iCiAgICAgIGV4aXQgMAogICAgICA7OwogICAgLS1kZWxldGUtdG9rZW4pCiAgICAgIHByaW50X2luZm8gIkRlbGV0aW5nIHN0b3JlZCBBSSB0b2tlbi4uLiIgImFsd2F5cyIKICAgICAgcmVtb3ZlX3NlY3VyZV92YXJpYWJsZSAiTUFJQVNTX0FJX1RPS0VOIgogICAgICBwcmludF9zdWNjZXNzICJBSSB0b2tlbiBkZWxldGVkIGZyb20gc2VjdXJlIHN0b3JhZ2UgKGlmIGl0IGV4aXN0ZWQpLiIgImFsd2F5cyIKICAgICAgZXhpdCAwCiAgICAgIDs7CiAgICAtLXVwZGF0ZS10b2tlbikKICAgICAgcHJpbnRfaW5mbyAiVXBkYXRpbmcgc3RvcmVkIEFJIHRva2VuLi4uIiAiYWx3YXlzIgogICAgICByZW1vdmVfc2VjdXJlX3ZhcmlhYmxlICJNQUlBU1NfQUlfVE9LRU4iCiAgICAgIAogICAgICBuZXdfdG9rZW49IiIKICAgICAgCiAgICAgICMgQ2hlY2sgaWYgdG9rZW4gd2FzIHByb3ZpZGVkIGFzIGNvbW1hbmQgbGluZSBhcmd1bWVudAogICAgICBpZiBbWyAtbiAiJHVwZGF0ZV90b2tlbl92YWx1ZSIgXV07IHRoZW4KICAgICAgICBuZXdfdG9rZW49IiR1cGRhdGVfdG9rZW5fdmFsdWUiCiAgICAgICAgcHJpbnRfaW5mbyAiVXNpbmcgdG9rZW4gZnJvbSBjb21tYW5kIGxpbmUgYXJndW1lbnQuIiAiYWx3YXlzIgogICAgICBlbHNlCiAgICAgICAgIyBJbnRlcmFjdGl2ZSB0b2tlbiBpbnB1dAogICAgICAgIGVjaG8gIiIKICAgICAgICBwcmludF9pbmZvICJFbnRlciB5b3VyIEFQSSB0b2tlbiAoaW5wdXQgd2lsbCBiZSBoaWRkZW4pOiIgImFsd2F5cyIKICAgICAgICBlY2hvIC1uICJUb2tlbjogIgogICAgICAgIAogICAgICAgICMgVHJ5IG11bHRpcGxlIG1ldGhvZHMgZm9yIHNlY3VyZSBpbnB1dAogICAgICAgIGlmIGNvbW1hbmQgLXYgc3R0eSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgICMgTWV0aG9kIDE6IFVzZSBzdHR5IHRvIGRpc2FibGUgZWNobwogICAgICAgICAgb2xkX3N0dHk9JChzdHR5IC1nKQogICAgICAgICAgc3R0eSAtZWNobwogICAgICAgICAgcmVhZCBuZXdfdG9rZW4KICAgICAgICAgIHN0dHkgIiRvbGRfc3R0eSIKICAgICAgICAgIGVjaG8KICAgICAgICBlbHNlCiAgICAgICAgICAjIE1ldGhvZCAyOiBGYWxsYmFjayB0byByZWFkIC1zCiAgICAgICAgICByZWFkIC1zIG5ld190b2tlbgogICAgICAgICAgZWNobwogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgIyBUcmltIHdoaXRlc3BhY2UKICAgICAgICBuZXdfdG9rZW49JChlY2hvICIkbmV3X3Rva2VuIiB8IHRyIC1kICdbOnNwYWNlOl0nKQogICAgICAgIAogICAgICAgIGlmIFtbIC16ICIkbmV3X3Rva2VuIiBdXTsgdGhlbgogICAgICAgICAgIyBDaGVjayBpZiB0b2tlbiBpcyBpbiBlbnZpcm9ubWVudCBhcyBmYWxsYmFjawogICAgICAgICAgaWYgW1sgLW4gIiRNQUlBU1NfQUlfVE9LRU4iIF1dOyB0aGVuCiAgICAgICAgICAgIG5ld190b2tlbj0iJE1BSUFTU19BSV9UT0tFTiIKICAgICAgICAgICAgcHJpbnRfaW5mbyAiVXNpbmcgdG9rZW4gZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZS4iICJhbHdheXMiCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIiIKICAgICAgICAgICAgcHJpbnRfd2FybmluZyAiTm8gdG9rZW4gZW50ZXJlZC4iICJhbHdheXMiCiAgICAgICAgICAgIGVjaG8gIkFsdGVybmF0aXZlIG1ldGhvZHM6IgogICAgICAgICAgICBlY2hvICIgIGJtYSAtLXVwZGF0ZS10b2tlbiAneW91cl90b2tlbl9oZXJlJyIKICAgICAgICAgICAgc2VydmljZV9uYW1lPSQoZ2V0X3NlY3VyZV9zZXJ2aWNlX25hbWUpCiAgICAgICAgICAgIGVjaG8gIiAgc2VjdXJpdHkgYWRkLWdlbmVyaWMtcGFzc3dvcmQgLVUgLXMgXCIkc2VydmljZV9uYW1lXCIgLWEgXCJNQUlBU1NfQUlfVE9LRU5cIiAtdyBcInlvdXJfdG9rZW5faGVyZVwiIgogICAgICAgICAgICBleGl0IDEKICAgICAgICAgIGZpCiAgICAgICAgZWxzZQogICAgICAgICAgcHJpbnRfaW5mbyAiVG9rZW4gZW50ZXJlZCBzdWNjZXNzZnVsbHkuIiAiYWx3YXlzIgogICAgICAgIGZpCiAgICAgIGZpCiAgICAgIAogICAgICAjIFZhbGlkYXRlIGFuZCBzdG9yZSB0b2tlbgogICAgICBpZiBbWyAtbiAiJG5ld190b2tlbiIgJiYgJHsjbmV3X3Rva2VufSAtZ3QgNSBdXTsgdGhlbgogICAgICAgIGlmIHN0b3JlX3NlY3VyZV92YXJpYWJsZSAiTUFJQVNTX0FJX1RPS0VOIiAiJG5ld190b2tlbiI7IHRoZW4KICAgICAgICAgIHByaW50X3N1Y2Nlc3MgIk5ldyBBSSB0b2tlbiBzdG9yZWQgc2VjdXJlbHkgaW4ga2V5Y2hhaW4uIiAiYWx3YXlzIgogICAgICAgICAgIyBWZXJpZnkgc3RvcmFnZSB3b3JrZWQKICAgICAgICAgIHNlcnZpY2VfbmFtZT0kKGdldF9zZWN1cmVfc2VydmljZV9uYW1lKQogICAgICAgICAgc3RvcmVkX2xlbmd0aD0kKHNlY3VyaXR5IGZpbmQtZ2VuZXJpYy1wYXNzd29yZCAtcyAiJHNlcnZpY2VfbmFtZSIgLWEgIk1BSUFTU19BSV9UT0tFTiIgLXcgMj4vZGV2L251bGwgfCB3YyAtYyB8IHRyIC1kICdbOnNwYWNlOl0nKQogICAgICAgICAgaWYgW1sgIiRzdG9yZWRfbGVuZ3RoIiAtZ3QgMTAgXV07IHRoZW4KICAgICAgICAgICAgcHJpbnRfc3VjY2VzcyAiVG9rZW4gdmVyaWZpY2F0aW9uOiAke3N0b3JlZF9sZW5ndGh9IGNoYXJhY3RlcnMgc3RvcmVkLiIgImFsd2F5cyIKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcHJpbnRfd2FybmluZyAiVG9rZW4gbWF5IG5vdCBoYXZlIGJlZW4gc3RvcmVkIGNvcnJlY3RseS4gTGVuZ3RoOiAke3N0b3JlZF9sZW5ndGh9IiAiYWx3YXlzIgogICAgICAgICAgZmkKICAgICAgICBlbHNlCiAgICAgICAgICBwcmludF93YXJuaW5nICJGYWlsZWQgdG8gc3RvcmUgdG9rZW4gaW4ga2V5Y2hhaW4uIiAiYWx3YXlzIgogICAgICAgIGZpCiAgICAgIGVsc2UKICAgICAgICBwcmludF93YXJuaW5nICJJbnZhbGlkIHRva2VuIChtdXN0IGJlIGxvbmdlciB0aGFuIDUgY2hhcmFjdGVycykuIiAiYWx3YXlzIgogICAgICBmaQogICAgICAKICAgICAgZXhpdCAwCiAgICAgIDs7CiAgICAtLWNoZWNrLXVwZGF0ZXMpCiAgICAgICMgTWFudWFsIHZlcnNpb24gY2hlY2sgKGZvcmNlLCB2ZXJib3NlKQogICAgICBtYW51YWxfY2hlY2tfdmVyc2lvbgogICAgICBleGl0ICQ/CiAgICAgIDs7CiAgICAtLWFjY291bnQtaW5mbykKICAgICAgIyBRdWVyeSBhY2NvdW50IGluZm8gZnJvbSBtYWlhc3MtcHJveHkKICAgICAgIyBFbnN1cmUgc2VjdXJlIHZhcmlhYmxlcyBhcmUgbG9hZGVkIChpbmNsdWRpbmcgdG9rZW4gYWNxdWlzaXRpb24gaWYgbmVlZGVkKQogICAgICBsb2FkX3NlY3VyZV92YXJpYWJsZXMKCiAgICAgICMgR2V0IEFQSSBrZXksIGNyZWF0aW5nIGFub255bW91cyB0b2tlbiBpZiBuZWVkZWQKICAgICAgYXBpX2tleT0iJHtNQUlBU1NfQUlfVE9LRU46LX0iCiAgICAgIGlmIFtbIC16ICIkYXBpX2tleSIgfHwgIiRhcGlfa2V5IiA9PSAiRElTQUJMRUQiIF1dOyB0aGVuCiAgICAgICAgaWYgW1sgIiR7YWlfbW9kZTotYXNrfSIgIT0gIm9mZiIgXV07IHRoZW4KICAgICAgICAgIHByaW50X2RlYnVnICJObyBBSSB0b2tlbiBmb3VuZCwgY3JlYXRpbmcgYW5vbnltb3VzIHN1YnNjcmlwdGlvbiBmb3IgYWNjb3VudC1pbmZvLi4uIiAiYWx3YXlzIgoKIyAtLS0gQmVnaW4gaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvY29yZS9haS5zaCAtLS0KaWYgW1sgLXogIiR7X19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV9haV9zaDotfSIgXV07IHRoZW4gX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfY29yZV9haV9zaD0xCgpmaSAjIF9fU1JDX19Vc2Vyc19zeXNvcF9zdGF0aWNfbWFpYXNzX3dob2xlX2Jhc2htYWlhc3NfbGliX2NvcmVfYWlfc2gKIyAtLS0gRW5kIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL2NvcmUvYWkuc2ggLS0tCgogICAgICAgICAgaWYgY3JlYXRlX2Fub255bW91c19zdWJzY3JpcHRpb247IHRoZW4KICAgICAgICAgICAgcHJpbnRfaW5mbyAiQW5vbnltb3VzIHN1YnNjcmlwdGlvbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4iCiAgICAgICAgICAgICMgUmVsb2FkIHNlY3VyZSB2YXJpYWJsZXMgdG8gZ2V0IHRoZSBuZXcgdG9rZW4KICAgICAgICAgICAgbG9hZF9zZWN1cmVfdmFyaWFibGVzCiAgICAgICAgICAgIGFwaV9rZXk9IiR7TUFJQVNTX0FJX1RPS0VOOi19IgogICAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludF93YXJuaW5nICJGYWlsZWQgdG8gY3JlYXRlIGFub255bW91cyBzdWJzY3JpcHRpb24uIgogICAgICAgICAgICBleGl0IDEKICAgICAgICAgIGZpCiAgICAgICAgZWxzZQogICAgICAgICAgcHJpbnRfd2FybmluZyAiQUkgbW9kZSBpcyBvZmYuIFNraXBwaW5nIEFJIHRva2VuIHNldHVwLiIgImFsd2F5cyIKICAgICAgICAgIGV4aXQgMQogICAgICAgIGZpCiAgICAgIGZpCgogICAgICAjIERldGVybWluZSBjbGllbnQgdmVyc2lvbiBmcm9tIHNjcmlwdCBoZWFkZXIKICAgICAgY2xpZW50X3ZlcnNpb249JChncmVwIC1tMSAnXiMgTUFJQVNTJyAiJHtCQVNIX1NPVVJDRVswXX0iIHwgc2VkIC1FICdzLy4qIHYoWzAtOV0rXC5bMC05XStcLlswLTldKykuKi9cMS8nKQogICAgICBbWyAteiAiJGNsaWVudF92ZXJzaW9uIiBdXSAmJiBjbGllbnRfdmVyc2lvbj0iMC4wLjAiCiAgICAgIGNsaWVudF9uYW1lPSJiYXNobWFpYXNzIgogICAgICAjIFVzZSBuZXcgL2FjY291bnQtaW5mbyBlbmRwb2ludCAoR0VUIHByZWZlcnJlZCkKICAgICAgYmFzZV9ob3N0PSIke01BSUFTU19BSV9IT1NUOi1odHRwczovL3BvdW5kLm1haWFzcy5uZXR9IgogICAgICBlbmRwb2ludD0iJHtiYXNlX2hvc3R9L2FjY291bnQtaW5mbyIKICAgICAgZWNobyAiW0lORk9dIFF1ZXJ5aW5nIGFjY291bnQgaW5mbyBhdDogJGVuZHBvaW50IiA+JjIKICAgICAgCiAgICAgICMgQnVpbGQgaGVhZGVycyBhcnJheQogICAgICBoZWFkZXJzPSgpCiAgICAgIGhlYWRlcnMrPSgiLUgiICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJGFwaV9rZXkiKQogICAgICBoZWFkZXJzKz0oIi1IIiAiWC1DbGllbnQtTmFtZTogJGNsaWVudF9uYW1lIikKICAgICAgaGVhZGVycys9KCItSCIgIlgtQ2xpZW50LVZlcnNpb246ICRjbGllbnRfdmVyc2lvbiIpCiAgICAgIAogICAgICAjIEFkZCBtYWNoaW5lIGZpbmdlcnByaW50IGhlYWRlcnMgZm9yIGFub255bW91cyB0b2tlbnMKICAgICAgaWYgW1sgIiRhcGlfa2V5IiA9PSBhbm9uXyogXV07IHRoZW4KCiMgLS0tIEJlZ2luIGlubGluZWQ6IC9Vc2Vycy9zeXNvcC9zdGF0aWMvbWFpYXNzLXdob2xlL2Jhc2htYWlhc3MvbGliL3V0aWxzL3V0aWxzLnNoIC0tLQppZiBbWyAteiAiJHtfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl91dGlsc191dGlsc19zaDotfSIgXV07IHRoZW4gX19TUkNfX1VzZXJzX3N5c29wX3N0YXRpY19tYWlhc3Nfd2hvbGVfYmFzaG1haWFzc19saWJfdXRpbHNfdXRpbHNfc2g9MQoKZmkgIyBfX1NSQ19fVXNlcnNfc3lzb3Bfc3RhdGljX21haWFzc193aG9sZV9iYXNobWFpYXNzX2xpYl91dGlsc191dGlsc19zaAojIC0tLSBFbmQgaW5saW5lZDogL1VzZXJzL3N5c29wL3N0YXRpYy9tYWlhc3Mtd2hvbGUvYmFzaG1haWFzcy9saWIvdXRpbHMvdXRpbHMuc2ggLS0tCgogICAgICAgIGlmIGNvbW1hbmQgLXYgZ2VuZXJhdGVfbWFjaGluZV9maW5nZXJwcmludF92MiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgIG1hY2hpbmVfZmluZ2VycHJpbnQ9JChnZW5lcmF0ZV9tYWNoaW5lX2ZpbmdlcnByaW50X3YyKQogICAgICAgICAgcHJpbnRfZGVidWcgIkRFQlVHOiBBZGRlZCBtYWNoaW5lIGZpbmdlcnByaW50IHYyIGhlYWRlciBmb3IgYWNjb3VudC1pbmZvOiAke21hY2hpbmVfZmluZ2VycHJpbnQ6MDoxMH0uLi4iID4mMgogICAgICAgIGVsaWYgY29tbWFuZCAtdiBnZW5lcmF0ZV9tYWNoaW5lX2ZpbmdlcnByaW50ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgbWFjaGluZV9maW5nZXJwcmludD0kKGdlbmVyYXRlX21hY2hpbmVfZmluZ2VycHJpbnQpCiAgICAgICAgICBwcmludF9kZWJ1ZyAiREVCVUc6IEFkZGVkIG1hY2hpbmUgZmluZ2VycHJpbnQgdjEgaGVhZGVyIGZvciBhY2NvdW50LWluZm86ICR7bWFjaGluZV9maW5nZXJwcmludDowOjEwfS4uLiIgPiYyCiAgICAgICAgZWxzZQogICAgICAgICAgbWFjaGluZV9maW5nZXJwcmludD0kKGVjaG8gLW4gIiQodW5hbWUgLWEpLSQod2hvYW1pKS0kKGRhdGUgKyVZKSIgfCBzaGFzdW0gLWEgMjU2IHwgY3V0IC1kJyAnIC1mMSkKICAgICAgICAgIHByaW50X2RlYnVnICJERUJVRzogQWRkZWQgZmFsbGJhY2sgbWFjaGluZSBmaW5nZXJwcmludCBoZWFkZXIgZm9yIGFjY291bnQtaW5mbzogJHttYWNoaW5lX2ZpbmdlcnByaW50OjA6MTB9Li4uIiA+JjIKICAgICAgICBmaQogICAgICAgIGhlYWRlcnMrPSgiLUgiICJYLU1hY2hpbmUtRmluZ2VycHJpbnQ6ICRtYWNoaW5lX2ZpbmdlcnByaW50IikKICAgICAgICAKICAgICAgICBpZiBbWyAtbiAiJE1BSUFTU19TVUJTQ1JJUFRJT05fSUQiICYmICIkTUFJQVNTX1NVQlNDUklQVElPTl9JRCIgIT0gIm51bGwiIF1dOyB0aGVuCiAgICAgICAgICBoZWFkZXJzKz0oIi1IIiAiWC1TdWJzY3JpcHRpb24tSUQ6ICRNQUlBU1NfU1VCU0NSSVBUSU9OX0lEIikKICAgICAgICAgIHByaW50X2RlYnVnICJERUJVRzogQWRkZWQgc3Vic2NyaXB0aW9uIElEIGhlYWRlciBmb3IgYWNjb3VudC1pbmZvOiAke01BSUFTU19TVUJTQ1JJUFRJT05fSUQ6MDoxMn0uLi4iID4mMgogICAgICAgIGZpCiAgICAgIGZpCiAgICAgIAogICAgICByZXNwb25zZT0kKGN1cmwgLXMgLXcgIlxuSFRUUF9TVEFUVVM6JXtodHRwX2NvZGV9XG4iIFwKICAgICAgICAiJHtoZWFkZXJzW0BdfSIgXAogICAgICAgICIkZW5kcG9pbnQiKQogICAgICBodHRwX3N0YXR1cz0kKGVjaG8gIiRyZXNwb25zZSIgfCBhd2sgLUYnSFRUUF9TVEFUVVM6JyAnTkY+MXtwcmludCAkMn0nIHwgdGFpbCAtbjEpCiAgICAgIHJlc3BvbnNlX2JvZHk9JChlY2hvICIkcmVzcG9uc2UiIHwgc2VkICcvXkhUVFBfU1RBVFVTOi9kJykKICAgICAgbGFzdF9lbmRwb2ludD0iJGVuZHBvaW50IgogICAgICBsYXN0X3N0YXR1cz0iJGh0dHBfc3RhdHVzIgogICAgICAjIElmIGVycm9yIG9yIG1pc3NpbmcgZmllbGRzLCB0cnkgUE9TVCBmYWxsYmFjawogICAgICBpZiBbWyAteiAiJHJlc3BvbnNlX2JvZHkiIHx8ICIkcmVzcG9uc2VfYm9keSIgPT0gKidlcnJvcicqIHx8ICIkaHR0cF9zdGF0dXMiID09ICI0MDQiIF1dOyB0aGVuCiAgICAgICAgZWNobyAiW0lORk9dIFJldHJ5aW5nIHdpdGggUE9TVCB0byAkZW5kcG9pbnQiID4mMgogICAgICAgICMgVXNlIHNhbWUgaGVhZGVycyBhcnJheSBidXQgYWRkIENvbnRlbnQtVHlwZSBmb3IgUE9TVAogICAgICAgIHBvc3RfaGVhZGVycz0oIiR7aGVhZGVyc1tAXX0iKQogICAgICAgIHBvc3RfaGVhZGVycys9KCItSCIgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiIpCiAgICAgICAgcmVzcG9uc2U9JChjdXJsIC1zIC13ICJcbkhUVFBfU1RBVFVTOiV7aHR0cF9jb2RlfVxuIiAtWCBQT1NUICIkZW5kcG9pbnQiIFwKICAgICAgICAgICIke3Bvc3RfaGVhZGVyc1tAXX0iIFwKICAgICAgICAgIC1kICJ7XCJhcGlfa2V5XCI6XCIkYXBpX2tleVwifSIpCiAgICAgICAgaHR0cF9zdGF0dXM9JChlY2hvICIkcmVzcG9uc2UiIHwgYXdrIC1GJ0hUVFBfU1RBVFVTOicgJ05GPjF7cHJpbnQgJDJ9JyB8IHRhaWwgLW4xKQogICAgICAgIHJlc3BvbnNlX2JvZHk9JChlY2hvICIkcmVzcG9uc2UiIHwgc2VkICcvXkhUVFBfU1RBVFVTOi9kJykKICAgICAgICBsYXN0X2VuZHBvaW50PSIkZW5kcG9pbnQgKFBPU1QpIgogICAgICAgIGxhc3Rfc3RhdHVzPSIkaHR0cF9zdGF0dXMiCiAgICAgIGZpCiAgICAgICMgSWYgc3RpbGwgbm90IEpTT04gb3IgNDA0LCB0cnkgdmVyc2lvbmVkIHBhdGgKICAgICAgaWYgW1sgLXogIiRyZXNwb25zZV9ib2R5IiB8fCAiJHJlc3BvbnNlX2JvZHkiID09IConTm90IEZvdW5kJyogXV07IHRoZW4KICAgICAgICBlbmRwb2ludF92MT0iJHtiYXNlX2hvc3R9L3YxL2FjY291bnQtaW5mbyIKICAgICAgICBlY2hvICJbSU5GT10gRmFsbGJhY2sgdG86ICRlbmRwb2ludF92MSIgPiYyCiAgICAgICAgcmVzcG9uc2U9JChjdXJsIC1zIC13ICJcbkhUVFBfU1RBVFVTOiV7aHR0cF9jb2RlfVxuIiBcCiAgICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRhcGlfa2V5IiBcCiAgICAgICAgICAtSCAiWC1DbGllbnQtTmFtZTogJGNsaWVudF9uYW1lIiBcCiAgICAgICAgICAtSCAiWC1DbGllbnQtVmVyc2lvbjogJGNsaWVudF92ZXJzaW9uIiBcCiAgICAgICAgICAiJGVuZHBvaW50X3YxIikKICAgICAgICBodHRwX3N0YXR1cz0kKGVjaG8gIiRyZXNwb25zZSIgfCBhd2sgLUYnSFRUUF9TVEFUVVM6JyAnTkY+MXtwcmludCAkMn0nIHwgdGFpbCAtbjEpCiAgICAgICAgcmVzcG9uc2VfYm9keT0kKGVjaG8gIiRyZXNwb25zZSIgfCBzZWQgJy9eSFRUUF9TVEFUVVM6L2QnKQogICAgICAgIGxhc3RfZW5kcG9pbnQ9IiRlbmRwb2ludF92MSIKICAgICAgICBsYXN0X3N0YXR1cz0iJGh0dHBfc3RhdHVzIgogICAgICAgIGlmIFtbIC16ICIkcmVzcG9uc2VfYm9keSIgfHwgIiRyZXNwb25zZV9ib2R5IiA9PSAqJ2Vycm9yJyogfHwgIiRodHRwX3N0YXR1cyIgPT0gIjQwNCIgXV07IHRoZW4KICAgICAgICAgIGVjaG8gIltJTkZPXSBSZXRyeWluZyB3aXRoIFBPU1QgdG8gJGVuZHBvaW50X3YxIiA+JjIKICAgICAgICAgIHJlc3BvbnNlPSQoY3VybCAtcyAtdyAiXG5IVFRQX1NUQVRVUzole2h0dHBfY29kZX1cbiIgLVggUE9TVCAiJGVuZHBvaW50X3YxIiBcCiAgICAgICAgICAgIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIFwKICAgICAgICAgICAgLUggIlgtQ2xpZW50LU5hbWU6ICRjbGllbnRfbmFtZSIgXAogICAgICAgICAgICAtSCAiWC1DbGllbnQtVmVyc2lvbjogJGNsaWVudF92ZXJzaW9uIiBcCiAgICAgICAgICAgIC1kICJ7XCJhcGlfa2V5XCI6XCIkYXBpX2tleVwifSIpCiAgICAgICAgICBodHRwX3N0YXR1cz0kKGVjaG8gIiRyZXNwb25zZSIgfCBhd2sgLUYnSFRUUF9TVEFUVVM6JyAnTkY+MXtwcmludCAkMn0nIHwgdGFpbCAtbjEpCiAgICAgICAgICByZXNwb25zZV9ib2R5PSQoZWNobyAiJHJlc3BvbnNlIiB8IHNlZCAnL15IVFRQX1NUQVRVUzovZCcpCiAgICAgICAgICBsYXN0X2VuZHBvaW50PSIkZW5kcG9pbnRfdjEgKFBPU1QpIgogICAgICAgICAgbGFzdF9zdGF0dXM9IiRodHRwX3N0YXR1cyIKICAgICAgICBmaQogICAgICBmaQogICAgICAjIEhlbHBlcjogbWFzayBhIHNlbnNpdGl2ZSB0b2tlbiAoc2hvdyBzdGFydCBhbmQgZW5kIG9ubHkpCiAgICAgIG1hc2tfdG9rZW4oKSB7CiAgICAgICAgbG9jYWwgcz0iJDEiOyBsb2NhbCBuPSR7I3N9CiAgICAgICAgaWYgKCggbiA8PSAxMCApKTsgdGhlbiBlY2hvICIke3M6MDoxfSoqKiR7czogLTF9IjsgZWxzZSBlY2hvICIke3M6MDo2fSoqKiR7czogLTR9IjsgZmkKICAgICAgfQoKICAgICAgIyBJZiBKU09OIHJlcXVlc3RlZCBleHBsaWNpdGx5LCBwcmludCBKU09OICh3aXRob3V0IGV4cG9zaW5nIGZ1bGwgdG9rZW4pCiAgICAgIGlmIFtbICIke01BSUFTU19BQ0NPVU5UX0lORk9fSlNPTjotMH0iID09ICIxIiBdXTsgdGhlbgogICAgICAgIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxICYmIFtbICIkcmVzcG9uc2VfYm9keSIgPX4gXlx7IF1dOyB0aGVuCiAgICAgICAgICBlY2hvICIkcmVzcG9uc2VfYm9keSIgfCBqcSAnewogICAgICAgICAgICB0b2tlbnNfdXNlZDogLnRva2Vuc191c2VkLAogICAgICAgICAgICB0b2tlbnNfcmVtYWluaW5nOiAudG9rZW5zX3JlbWFpbmluZywKICAgICAgICAgICAgcXVvdGE6IC5xdW90YSwKICAgICAgICAgICAgc3Vic2NyaXB0aW9uX3R5cGU6IC5zdWJzY3JpcHRpb25fdHlwZSwKICAgICAgICAgICAgY3VzdG9tZXJfZW1haWw6IC5jdXN0b21lcl9lbWFpbCwKICAgICAgICAgICAgc3RhdHVzOiAuc3RhdHVzCiAgICAgICAgICB9JwogICAgICAgICAgZXhpdCAwCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiW0VSUk9SXSBKU09OIG1vZGUgcmVxdWVzdGVkIGJ1dCByZXNwb25zZSBpcyBub3QgdmFsaWQgSlNPTiAoc3RhdHVzOiAke2xhc3Rfc3RhdHVzOi11bmtub3dufSkuIiA+JjIKICAgICAgICAgIFtbIC1uICIkcmVzcG9uc2VfYm9keSIgXV0gJiYgZWNobyAiJHJlc3BvbnNlX2JvZHkiID4mMgogICAgICAgICAgZXhpdCAyCiAgICAgICAgZmkKICAgICAgZmkKCiAgICAgICMgSHVtYW4tcmVhZGFibGUgc3VtbWFyeSAoZGVmYXVsdCkKICAgICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjEgJiYgW1sgIiRyZXNwb25zZV9ib2R5IiA9fiBeXHsgXV07IHRoZW4KICAgICAgICAjIEV4dHJhY3QgZmllbGRzIHNhZmVseQogICAgICAgIHRva2Vuc191c2VkPSQoZWNobyAiJHJlc3BvbnNlX2JvZHkiIHwganEgLXIgJy50b2tlbnNfdXNlZCAvLyAiLSInKQogICAgICAgIHRva2Vuc19yZW1haW5pbmc9JChlY2hvICIkcmVzcG9uc2VfYm9keSIgfCBqcSAtciAnLnRva2Vuc19yZW1haW5pbmcgLy8gIi0iJykKICAgICAgICBxdW90YT0kKGVjaG8gIiRyZXNwb25zZV9ib2R5IiB8IGpxIC1yICcucXVvdGEgLy8gIi0iJykKICAgICAgICBzdWJfdHlwZT0kKGVjaG8gIiRyZXNwb25zZV9ib2R5IiB8IGpxIC1yICcuc3Vic2NyaXB0aW9uX3R5cGUgLy8gIi0iJykKICAgICAgICBjdXN0X2VtYWlsPSQoZWNobyAiJHJlc3BvbnNlX2JvZHkiIHwganEgLXIgJy5jdXN0b21lcl9lbWFpbCAvLyAiLSInKQogICAgICAgIHN0YXR1c19maWVsZD0kKGVjaG8gIiRyZXNwb25zZV9ib2R5IiB8IGpxIC1yICcuc3RhdHVzIC8vICItIicpCiAgICAgIGVsc2UKICAgICAgICAjIEZhbGxiYWNrIHBhcnNpbmcgd2hlbiBqcSBtaXNzaW5nIG9yIG5vbi1KU09OCiAgICAgICAgdG9rZW5zX3VzZWQ9Ii0iOyB0b2tlbnNfcmVtYWluaW5nPSItIjsgcXVvdGE9Ii0iOyBzdWJfdHlwZT0iLSI7IGN1c3RfZW1haWw9Ii0iOyBzdGF0dXNfZmllbGQ9IiR7bGFzdF9zdGF0dXM6LXVua25vd259IgogICAgICBmaQoKICAgICAgbWFza2VkX2tleT0kKG1hc2tfdG9rZW4gIiRhcGlfa2V5IikKICAgICAgY3JlZGl0PSdOdWfDqXQnCiAgICAgIGVjaG8gIiIKICAgICAgZWNobyAiQWNjb3VudCBJbmZvIgogICAgICBlY2hvICItLS0tLS0tLS0tLS0iCiAgICAgIGVjaG8gIkFQSSBUb2tlbjogICAgICAgICRtYXNrZWRfa2V5IgogICAgICBpZiBbWyAtbiAiJHtNQUlBU1NfU1VCU0NSSVBUSU9OX0lEOi19IiBdXTsgdGhlbgogICAgICAgIGVjaG8gIlN1YnNjcmlwdGlvbiBJRDogICR7TUFJQVNTX1NVQlNDUklQVElPTl9JRH0iCiAgICAgIGZpCiAgICAgIGVjaG8gIlR5cGU6ICAgICAgICAgICAgICR7c3ViX3R5cGV9IgogICAgICBlY2hvICJFbWFpbDogICAgICAgICAgICAke2N1c3RfZW1haWx9IgogICAgICBlY2hvIC1lICIke2NyZWRpdH1zIFVzZWQ6ICAgICAke3Rva2Vuc191c2VkfSIKICAgICAgZWNobyAtZSAiJHtjcmVkaXR9cyBSZW1haW5pbmc6JHt0b2tlbnNfcmVtYWluaW5nfSIKICAgICAgZWNobyAtZSAiUXVvdGE6ICAgICAgICAgICAgJHtxdW90YX0iCiAgICAgICMgRXhwbGFpbiBzdGF0dXMgY29kZXMgY2xlYXJseQogICAgICBpZiBbWyAiJHtsYXN0X3N0YXR1czotfSIgPT0gIjQwMyIgfHwgIiRzdGF0dXNfZmllbGQiID09ICI0MDMiIF1dOyB0aGVuCiAgICAgICAgZWNobyAiU3RhdHVzOiAgICAgICAgICA0MDMgRm9yYmlkZGVuIgogICAgICAgIGVjaG8gIkV4cGxhbmF0aW9uOiAgICAgWW91ciB0b2tlbiB3YXMgcmVqZWN0ZWQuIEVuc3VyZSBpdCBpcyBjb3JyZWN0LCBub3QgZXhwaXJlZCwgYW5kIGFzc29jaWF0ZWQgd2l0aCBhbiBhY3RpdmUgc3Vic2NyaXB0aW9uLiIKICAgICAgZWxpZiBbWyAiJHtsYXN0X3N0YXR1czotfSIgPT0gIjQwMSIgfHwgIiRzdGF0dXNfZmllbGQiID09ICI0MDEiIF1dOyB0aGVuCiAgICAgICAgZWNobyAiU3RhdHVzOiAgICAgICAgICA0MDEgVW5hdXRob3JpemVkIgogICAgICAgIGVjaG8gIkV4cGxhbmF0aW9uOiAgICAgTWlzc2luZyBvciBpbnZhbGlkIGNyZWRlbnRpYWxzLiBUcnkgdXBkYXRpbmcgeW91ciB0b2tlbiB3aXRoICctLXVwZGF0ZS10b2tlbicuIgogICAgICBlbGlmIFtbICIke2xhc3Rfc3RhdHVzOi19IiA9fiBeMiAmJiAiJHtsYXN0X3N0YXR1czotfSIgIT0gIiIgXV07IHRoZW4KICAgICAgICBlY2hvICJTdGF0dXM6ICAgICAgICAgICR7bGFzdF9zdGF0dXN9IE9LIgogICAgICBlbHNlCiAgICAgICAgZWNobyAiU3RhdHVzOiAgICAgICAgICAke2xhc3Rfc3RhdHVzOi11bmtub3dufSIKICAgICAgZmkKICAgICAgZWNobyAiIgogICAgICBleGl0IDAKCiAgICAgIDs7CiAgICAtYWloZWxwfC0tY29tbWl0dGhpcy1oZWxwKQogICAgICBlY2hvICJVc2FnZTogYm1hIFtvcHRpb25zXSIKICAgICAgZWNobyAiQ29tbW9uIG9wdGlvbnM6IgogICAgICBlY2hvICIgIC0tYWNjb3VudC1pbmZvICAgICAgICBTaG93IHlvdXIgYWNjb3VudCBzdGF0dXMgKG1hc2tlZCB0b2tlbikiCiAgICAgIGVjaG8gIiAgLS11cGRhdGUtdG9rZW4gICAgICAgIFByb21wdCB0byB1cGRhdGUgYW5kIHN0b3JlIHlvdXIgQVBJIHRva2VuIgogICAgICBlY2hvICIgIC0tZGVsZXRlLXRva2VuICAgICAgICBSZW1vdmUgc3RvcmVkIEFQSSB0b2tlbiIKICAgICAgZWNobyAiICAtLWNoZWNrLXVwZGF0ZXMgICAgICAgQ2hlY2sgZm9yIGJhc2htYWlhc3MgdXBkYXRlcyIKICAgICAgZWNobyAiICAtdiwgLS12ZXJzaW9uICAgICAgICAgU2hvdyB2ZXJzaW9uIgogICAgICBlY2hvICIgIC1oLCAtLWhlbHAgICAgICAgICAgICBTaG93IGhlbHAiCiAgICAgIGV4aXQgMAogICAgICA7OwogICAgLWFpY3Z8LS1jb21taXR0aGlzLXZlcnNpb24pCiAgICAgIHZlcnNpb249IlVua25vd24iCiAgICAgIHNjcmlwdF9kaXI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKICAgICAgc2NyaXB0X2ZpbGU9IiR7QkFTSF9TT1VSQ0VbMF19IgogICAgICB2ZXJzaW9uPSQoZ3JlcCAtbTEgJ14jIE1BSUFTUycgIiRzY3JpcHRfZmlsZSIgfCBzZWQgLUUgJ3MvLiogdihbMC05XStcLlswLTldK1wuWzAtOV0rKS4qL1wxLycpCiAgICAgIGVjaG8gIkNPTU1JVFRISVMgdiR2ZXJzaW9uIgogICAgICBleGl0IDAKICAgICAgOzsKICAgIC1jb3wtY3wtLWNvbW1pdHMtb25seSkKICAgICAgZXhwb3J0IGFpX2NvbW1pdHNfb25seT10cnVlCiAgICAgIDs7CiAgICAtYWktY29tbWl0cy1vbmx5KQogICAgICBleHBvcnQgYWlfY29tbWl0c19vbmx5PXRydWUKICAgICAgZXhwb3J0IGJyYW5kPSJjb21taXR0aGlzIgogICAgICA7OwogICAgLS1ib290c3RyYXB8LS1zZXR1cCkKICAgICAgIyBGb3JjZSBib290c3RyYXAgbW9kZSAtIHdpbGwgcnVuIHNldHVwIGV2ZW4gaWYgLmVudi5tYWlhc3MgZXhpc3RzCiAgICAgIGV4cG9ydCBNQUlBU1NfRk9SQ0VfQk9PVFNUUkFQPXRydWUKICAgICAgOzsKICAgIC0tYXV0b3wtYSkKICAgICAgIyBFbmFibGUgYXV0by1tb2RlOiBhdXRvbWF0aWNhbGx5IGFuc3dlciB5ZXMgdG8gYWxsIHByb21wdHMKICAgICAgZXhwb3J0IGF1dG9fbW9kZV9lbmFibGVkPXRydWUKICAgICAgOzsKICAgIG1ham9yfG1pbm9yfHBhdGNoKQogICAgICAjIFZlcnNpb24gYnVtcCB0eXBlcyAtIGFkZCB0byBmaWx0ZXJlZCBhcmdzCiAgICAgIGZpbHRlcmVkX2FyZ3MrPSgiJGFyZyIpCiAgICAgIDs7CiAgICBbMC05XSouWzAtOV0qLlswLTldKikKICAgICAgIyBTcGVjaWZpYyB2ZXJzaW9uIG51bWJlcnMgLSBhZGQgdG8gZmlsdGVyZWQgYXJncwogICAgICBmaWx0ZXJlZF9hcmdzKz0oIiRhcmciKQogICAgICA7OwogIGVzYWMKZG9uZQoKIyBSZW1vdmUgZHVwbGljYXRlIC0gYWxyZWFkeSBoYW5kbGVkIGFib3ZlIGJlZm9yZSBicmFuY2hEZXRlY3Rpb24KCltbICIke0JBU0hfU09VUkNFWzBdfSIgPT0gIiR7MH0iIF1dICYmIGluaXRpYWxpc2VCdW1wICIke2ZpbHRlcmVkX2FyZ3NbQF19Igo=
__PAYLOAD__
)"