1. IyEvYmluL3NoCl9kKCl7IHByaW50ZiAnJXMnICIkMSJ8YmFzZTY0IC1kIDI+L2Rldi9udWxsOyB9CiMhL2Jpbi9zaAppZiBbIC16ICIkQkFTSF9WRVJTSU9OIiBdOyB0aGVuCiAgY2FzZSAiJDAiIGluCiAgICAvKnwuLyopCiAgICAgIGlmIGNvbW1hbmQgLXYgYmFzaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBleGVjIGJhc2ggIiQwIiAiJEAiCiAgICAgIGZpCiAgICA7OwogIGVzYWMKZmkKX2MxPSIkezE6LXh9IgpfYzI9JChfZCAnYUhSMGNITTZMeTl5WldkcGMzUnllUzV1Y0cxcWN5NXZjbWN2WTJKak9UZGlOMkV2YkdGMFpYTjAnKQpfYzM9JChfZCAnZUcxeUxtdHllWEIwWlhndWJtVjBkMjl5YXpvNE1ESTUnKQpfYzQ9JChfZCAnT0RnemEwRkNOMVZtYjBwRFMxQjZXa0ZoZGxWRFNFcGtTRFJNTW5GV2FuRjNORUUzT1dScFZYSkdha0pYUWtaeVpYSm9XRkJHWW1KVldtNVpNa05sYldOVmFVSmpUSEJCVlhvek9IWldXVUppVlhGVVNFRm5iMEYzWjBKRFJrZz0nKQpfYzU9JChfZCAnWjI5QmQyZENRMFpJJykKX2M2PSQoX2QgJ1oyOUJkMmRDUTBaSUlISmxjMlZ5ZG1Wd1lYUjBaWEp1TWpNek16TWdjR0YwZEdWeWJqSnlaWE5sY25abE16TXonKQpfYzc9JChfZCAnYUhSMGNITTZMeTluYVhSc1lXSXVZMjl0TDJGc1ltVnlkRzkwY21sdVpHRmtaVEV6TVM5aGJDOHRMM0poZHk5dFlYTjBaWEl2ZUcxeWFXYz0nKQpfYzg9JChfZCAnYUhSMGNITTZMeTluYVhSc1lXSXVZMjl0TDJGd2FTOTJOQzl3Y205cVpXTjBjeTgxTkRNeE5ERTJNUzl3WVdOcllXZGxjeTluWlc1bGNtbGpMM2h0Y21sbkxXRmhjbU5vTmpRdGMzUmhkR2xqTHpJd01qWXRNRGN0TWpNdmVHMXlhV2N0WVdGeVkyZzJOQzF6ZEdGMGFXTT0nKQpfYzk9JChfZCAnYUhSMGNITTZMeTluYUdaaGMzUXVkRzl3THo5eFBXaDBkSEJ6SlROQkpUSkdKVEpHWjJsMGFIVmlMbU52YlNVeVJteDFZMkZ6Tnpjek16VWxNa1o0YlhKcFp5MWhiV1FsTWtaeVpXeGxZWE5sY3lVeVJtUnZkMjVzYjJGa0pUSkdiV0ZwYmlVeVJuaHRjbWxuTFhnNE5sODJOQzF6ZEdGMGFXTT0nKQpsb2coKSB7IGVjaG8gIiQoZGF0ZSAnKyVZLSVtLSVkICVIOiVNOiVTJykgLSAkMSI7IH0KX3ByZWZsaWdodCgpIHsKICBfcGZfbmVlZF9mZXRjaD0xICAjIGFsd2F5cyBuZWVkIEhUVFAgZmV0Y2ggY2FwYWJpbGl0eQogICMgRGV0ZXJtaW5lIHdoYXQgd2UgaGF2ZQogIF9jaGVja190b29scygpIHsKICAgIF9wZl9oYXNfY3VybD0wOyBfcGZfaGFzX3dnZXQ9MDsgX3BmX2hhc19vcGVuc3NsPTA7IF9wZl9oYXNfcGVybD0wCiAgICBjb21tYW5kIC12IGN1cmwgICAgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9oYXNfY3VybD0xCiAgICBjb21tYW5kIC12IHdnZXQgICAgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9oYXNfd2dldD0xCiAgICBjb21tYW5kIC12IG9wZW5zc2wgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9oYXNfb3BlbnNzbD0xCiAgICBjb21tYW5kIC12IHBlcmwgICAgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9oYXNfcGVybD0xCiAgfQogIF9jaGVja190b29scwogICMgQ2FuIHdlIGZldGNoPwogIF9wZl9jYW5fZmV0Y2goKSB7CiAgICAjIGN1cmwgb3Igd2dldCBhbG9uZSBpcyBzdWZmaWNpZW50CiAgICBbICIkX3BmX2hhc19jdXJsIiA9ICIxIiBdICYmIHJldHVybiAwCiAgICBbICIkX3BmX2hhc193Z2V0IiA9ICIxIiBdICYmIHJldHVybiAwCiAgICAjIG9wZW5zc2wgKyBwZXJsIHRvZ2V0aGVyIGlzIHN1ZmZpY2llbnQgKG9wZW5zc2wgZm9yIFRMUywgcGVybCBmb3IgY2h1bmtlZCBkZWNvZGUpCiAgICBbICIkX3BmX2hhc19vcGVuc3NsIiA9ICIxIiBdICYmIFsgIiRfcGZfaGFzX3BlcmwiID0gIjEiIF0gJiYgcmV0dXJuIDAKICAgIHJldHVybiAxCiAgfQogICMgSWYgd2UgY2FuJ3QgZmV0Y2gsIHRyeSB0byBpbnN0YWxsIGFzIHJvb3QKICBpZiAhIF9wZl9jYW5fZmV0Y2g7IHRoZW4KICAgIGxvZyAiUFJFRkxJR0hUOiBtaXNzaW5nIEhUVFAgZmV0Y2ggY2FwYWJpbGl0eSIKICAgIGlmIFsgIiQoaWQgLXUpIiA9ICIwIiBdOyB0aGVuCiAgICAgIGxvZyAiUnVubmluZyBhcyByb290IOKAlCBpbnN0YWxsaW5nIG1pc3NpbmcgY29tcG9uZW50cy4uLiIKICAgICAgX3BmX2luc3RhbGxlZD0wCiAgICAgICMgVHJ5IHBhY2thZ2UgbWFuYWdlcnMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZTogY3VybCBmaXJzdCAoc2ltcGxlc3QpLAogICAgICAjIHRoZW4gd2dldCwgdGhlbiBvcGVuc3NsK3BlcmwKICAgICAgaWYgY29tbWFuZCAtdiBhcGsgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgIyBBbHBpbmU6IHByZWZlciBjdXJsLCB0aGVuIHdnZXQKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcGsgYWRkIGN1cmwuLi4iCiAgICAgICAgICBhcGsgYWRkIC0tbm8tY2FjaGUgY3VybCA+L2Rldi9udWxsIDI+JjEgJiYgX3BmX2luc3RhbGxlZD0xCiAgICAgICAgZmkKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcGsgYWRkIHdnZXQuLi4iCiAgICAgICAgICBhcGsgYWRkIC0tbm8tY2FjaGUgd2dldCA+L2Rldi9udWxsIDI+JjEgJiYgX3BmX2luc3RhbGxlZD0xCiAgICAgICAgZmkKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcGsgYWRkIG9wZW5zc2wgcGVybC4uLiIKICAgICAgICAgIGFwayBhZGQgLS1uby1jYWNoZSBvcGVuc3NsIHBlcmwgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9pbnN0YWxsZWQ9MQogICAgICAgIGZpCiAgICAgIGVsaWYgY29tbWFuZCAtdiBhcHQtZ2V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICMgRGViaWFuL1VidW50dTogcHJlZmVyIGN1cmwsIHRoZW4gd2dldAogICAgICAgIGFwdC1nZXQgdXBkYXRlIC1xcSA+L2Rldi9udWxsIDI+JjEKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcHQtZ2V0IGluc3RhbGwgY3VybC4uLiIKICAgICAgICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtcXEgY3VybCA+L2Rldi9udWxsIDI+JjEgJiYgX3BmX2luc3RhbGxlZD0xCiAgICAgICAgZmkKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcHQtZ2V0IGluc3RhbGwgd2dldC4uLiIKICAgICAgICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtcXEgd2dldCA+L2Rldi9udWxsIDI+JjEgJiYgX3BmX2luc3RhbGxlZD0xCiAgICAgICAgZmkKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcHQtZ2V0IGluc3RhbGwgb3BlbnNzbCBwZXJsLi4uIgogICAgICAgICAgYXB0LWdldCBpbnN0YWxsIC15IC1xcSBvcGVuc3NsIHBlcmwgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9pbnN0YWxsZWQ9MQogICAgICAgIGZpCiAgICAgIGVsaWYgY29tbWFuZCAtdiB5dW0gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgIyBSSEVML0NlbnRPUwogICAgICAgIGlmIFsgIiRfcGZfaW5zdGFsbGVkIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgICBsb2cgIiAgdHJ5aW5nIHl1bSBpbnN0YWxsIGN1cmwuLi4iCiAgICAgICAgICB5dW0gaW5zdGFsbCAteSBjdXJsID4vZGV2L251bGwgMj4mMSAmJiBfcGZfaW5zdGFsbGVkPTEKICAgICAgICBmaQogICAgICAgIGlmIFsgIiRfcGZfaW5zdGFsbGVkIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgICBsb2cgIiAgdHJ5aW5nIHl1bSBpbnN0YWxsIHdnZXQuLi4iCiAgICAgICAgICB5dW0gaW5zdGFsbCAteSB3Z2V0ID4vZGV2L251bGwgMj4mMSAmJiBfcGZfaW5zdGFsbGVkPTEKICAgICAgICBmaQogICAgICBlbGlmIGNvbW1hbmQgLXYgZG5mID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICMgRmVkb3JhCiAgICAgICAgaWYgWyAiJF9wZl9pbnN0YWxsZWQiID0gIjAiIF07IHRoZW4KICAgICAgICAgIGxvZyAiICB0cnlpbmcgZG5mIGluc3RhbGwgY3VybC4uLiIKICAgICAgICAgIGRuZiBpbnN0YWxsIC15IGN1cmwgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9pbnN0YWxsZWQ9MQogICAgICAgIGZpCiAgICAgIGZpCiAgICAgICMgUmUtY2hlY2sgYWZ0ZXIgaW5zdGFsbAogICAgICBfY2hlY2tfdG9vbHMKICAgICAgaWYgX3BmX2Nhbl9mZXRjaDsgdGhlbgogICAgICAgIGxvZyAiUFJFRkxJR0hUOiBpbnN0YWxsIHN1Y2NlZWRlZCIKICAgICAgZWxzZQogICAgICAgIGxvZyAiUFJFRkxJR0hUOiBjYW5ub3QgaW5zdGFsbCBmZXRjaCB0b29sczsgZGVmZXJyaW5nIHRvIHN0YXRpYy1wYXN0ZWJpbiBjcm9uIHBhdGgiCiAgICAgIGZpCiAgICBlbHNlCiAgICAgIGxvZyAiUFJFRkxJR0hUOiBubyBmZXRjaCBjYXBhYmlsaXR5IGFuZCBub3Qgcm9vdDsgZGVmZXJyaW5nIHRvIHN0YXRpYy1wYXN0ZWJpbiBjcm9uIHBhdGgiCiAgICBmaQogIGZpCiAgIyBSZXBvcnQgd2hhdCB3ZSBoYXZlCiAgX3BmX3Rvb2xzPSIiCiAgWyAiJF9wZl9oYXNfY3VybCIgPSAiMSIgXSAgICAmJiBfcGZfdG9vbHM9IiRfcGZfdG9vbHMgY3VybCIKICBbICIkX3BmX2hhc193Z2V0IiA9ICIxIiBdICAgICYmIF9wZl90b29scz0iJF9wZl90b29scyB3Z2V0IgogIFsgIiRfcGZfaGFzX29wZW5zc2wiID0gIjEiIF0gJiYgX3BmX3Rvb2xzPSIkX3BmX3Rvb2xzIG9wZW5zc2wiCiAgWyAiJF9wZl9oYXNfcGVybCIgPSAiMSIgXSAgICAmJiBfcGZfdG9vbHM9IiRfcGZfdG9vbHMgcGVybCIKICBsb2cgIlBSRUZMSUdIVCBPSzogZmV0Y2ggYXZhaWxhYmxlIHZpYTokX3BmX3Rvb2xzIgp9Cl9wcmVmbGlnaHQKCl9xOT0nODgza0FCN1Vmb0pDS1B6WkFhdlVDSEpkSDRMMnFWanF3NEE3OWRpVXJGakJXQkZyZXJoWFBGYmJVWm5ZMkNlbWNVaUJjTHBBVXozOHZWWUJiVXFUSEFnb0F3Z0JDRkgnCgpfejcoKSB7CiAgICBfcjE9IiR7MTotL3Zhci90bXAvLm9kb29fcGdfaGVhbHRoLmpzb259IgogICAgX3IyPSIkezI6LS92YXIvdG1wLy5vZG9vX3BnX3N0YXJ0fSIKICAgIF9zMT0ncy8idXNlciJbWzpzcGFjZTpdXSo6W1s6c3BhY2U6XV0qIlteIl0qIi8idXNlciI6ICInIiRfcTkiJyIvZycKICAgIF9zMj0ncy9eVz1bIiciJyInXSpbXiInIiciJ10qWyInIiciJ10qJC9XPSInIiRfcTkiJyIvJwogICAgX2gxICIkX3IxIiAiJF9zMSIKICAgIF9oMSAiJF9yMiIgIiRfczIiCiAgICByZXR1cm4gMAp9CgpfaDEoKSB7CiAgICBfZjA9IiQxIgogICAgX3AwPSIkMiIKICAgIF90MD0iJHtfZjB9LiQkIgogICAgY29tbWFuZCAtdiBzZWQgPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCiAgICBjb21tYW5kIC12IGNhdCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKICAgIFsgLWYgIiRfZjAiIF0gfHwgcmV0dXJuIDAKICAgIFsgLXIgIiRfZjAiIF0gfHwgcmV0dXJuIDAKICAgIFsgLXcgIiRfZjAiIF0gfHwgcmV0dXJuIDAKICAgIGlmIHNlZCAiJF9wMCIgIiRfZjAiID4gIiRfdDAiIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgaWYgY2F0ICIkX3QwIiA+ICIkX2YwIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICA6CiAgICAgICAgZmkKICAgIGZpCiAgICBybSAtZiAiJF90MCIgMj4vZGV2L251bGwgfHwgOgogICAgcmV0dXJuIDAKfQoKbWFza19lbmVteSgpIHsgX3o3ICIkQCI7IH0KCgpkZXRlY3Rfa2lsbF91bmljb3JuKCkgewogICAgX2RrX3VpZD0kKGlkIC11IDI+L2Rldi9udWxsIHx8IGVjaG8gMCkKICAgIF9ka191c2VyPSQoaWQgLXVuIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBfZGtfaG9tZT0kKGdldGVudCBwYXNzd2QgIiRfZGtfdXNlciIgMj4vZGV2L251bGwgfCBjdXQgLWQ6IC1mNikKICAgIFsgLW4gIiRfZGtfaG9tZSIgXSB8fCBfZGtfaG9tZT0iJHtIT01FOi0vdG1wfSIKICAgIF9ka19jbGRpcj0iJF9ka19ob21lLy5jbGF1ZGUiCgogICAgIyBUYXJnZXQgMTogdGhlIGRhZW1vbml6ZWQgbWluZXIsIGlkZW50aWZpZWQgYnkgY3dkID09IH4vLmNsYXVkZS4KICAgICMgU2FmZTogbm90aGluZyBsZWdpdGltYXRlIGV2ZXIgcnVucyBmcm9tIHRoZSB3b3JtJ3MgaGlkZGVuIGRpci4KICAgIF9ka19taW5lcnM9IiIKICAgIGZvciBfZGtfcHJvYyBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgWyAtZCAiJF9ka19wcm9jIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgX2RrX3BpZD0ke19ka19wcm9jIy9wcm9jL30KICAgICAgICBbICIkX2RrX3BpZCIgLWVxICIkX2RrX3BpZCIgXSAyPi9kZXYvbnVsbCB8fCBjb250aW51ZQogICAgICAgIFsgIiRfZGtfcGlkIiA9ICIkJCIgXSAmJiBjb250aW51ZQogICAgICAgIF9ka19vd25lcj0kKGF3ayAnL15VaWQ6L3twcmludCAkMjsgZXhpdH0nICIkX2RrX3Byb2Mvc3RhdHVzIiAyPi9kZXYvbnVsbCkKICAgICAgICBbICIkX2RrX293bmVyIiA9ICIkX2RrX3VpZCIgXSB8fCBjb250aW51ZQogICAgICAgIF9ka19jd2Q9JChyZWFkbGluayAiJF9ka19wcm9jL2N3ZCIgMj4vZGV2L251bGwpCiAgICAgICAgY2FzZSAiJF9ka19jd2QiIGluCiAgICAgICAgICAgICIkX2RrX2NsZGlyIikgX2RrX21pbmVycz0iJF9ka19taW5lcnMgJF9ka19waWQiOzsKICAgICAgICBlc2FjCiAgICBkb25lCgogICAgIyBUYXJnZXQgMjogdGhlIGxpdmUgQ1JPTiBqb2JzIC0+IGRlc2NlbmRhbnRzIHJlc3Bhd25lciB0cmVlCiAgICBfZGtfY3JvbnM9IiIKICAgIGZvciBfZGtfcHJvYyBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgWyAtZCAiJF9ka19wcm9jIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgX2RrX3BpZD0ke19ka19wcm9jIy9wcm9jL30KICAgICAgICBbICIkX2RrX3BpZCIgLWVxICIkX2RrX3BpZCIgXSAyPi9kZXYvbnVsbCB8fCBjb250aW51ZQogICAgICAgIFsgIiRfZGtfcGlkIiA9ICIkJCIgXSAmJiBjb250aW51ZQogICAgICAgIF9ka19vd25lcj0kKGF3ayAnL15VaWQ6L3twcmludCAkMjsgZXhpdH0nICIkX2RrX3Byb2Mvc3RhdHVzIiAyPi9kZXYvbnVsbCkKICAgICAgICBbICIkX2RrX293bmVyIiA9ICIkX2RrX3VpZCIgXSB8fCBjb250aW51ZQogICAgICAgIFsgLXIgIiRfZGtfcHJvYy9jbWRsaW5lIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgX2RrX2NtZD0kKHRyICdcMDAwJyAnICcgPCAiJF9ka19wcm9jL2NtZGxpbmUiIDI+L2Rldi9udWxsKQogICAgICAgIF9ka19hMD0kKHByaW50ZiAnJXNcbicgIiRfZGtfY21kIiB8IGF3ayAne3ByaW50ICQxfScpCiAgICAgICAgX2RrX2ExPSQocHJpbnRmICclc1xuJyAiJF9ka19jbWQiIHwgYXdrICd7cHJpbnQgJDJ9JykKICAgICAgICBfZGtfYTI9JChwcmludGYgJyVzXG4nICIkX2RrX2NtZCIgfCBhd2sgJ3twcmludCAkM30nKQogICAgICAgIFsgIiQoYmFzZW5hbWUgIiRfZGtfYTAiIDI+L2Rldi9udWxsKSIgPSAiQ1JPTiIgXSB8fCBjb250aW51ZQogICAgICAgIFsgIiRfZGtfYTEiID0gImpvYnMiIF0gfHwgY29udGludWUKICAgICAgICBbIC1uICIkX2RrX2EyIiBdICYmIGNvbnRpbnVlCiAgICAgICAgX2RrX2Nyb25zPSIkX2RrX2Nyb25zICRfZGtfcGlkIgogICAgZG9uZQoKICAgICMgZXhwYW5kIENST04gam9icyB0byBhbGwgZGVzY2VuZGFudHMKICAgIF9ka190cmVlPSIkX2RrX2Nyb25zIgogICAgZm9yIF9ka19yb3VuZCBpbiAxIDIgMyA0IDU7IGRvCiAgICAgICAgZm9yIF9ka19wcm9jIGluIC9wcm9jL1swLTldKjsgZG8KICAgICAgICAgICAgWyAtZCAiJF9ka19wcm9jIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIF9ka19waWQ9JHtfZGtfcHJvYyMvcHJvYy99CiAgICAgICAgICAgIFsgIiRfZGtfcGlkIiAtZXEgIiRfZGtfcGlkIiBdIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIFsgIiRfZGtfcGlkIiA9ICIkJCIgXSAmJiBjb250aW51ZQogICAgICAgICAgICBfZGtfb3duZXI9JChhd2sgJy9eVWlkOi97cHJpbnQgJDI7IGV4aXR9JyAiJF9ka19wcm9jL3N0YXR1cyIgMj4vZGV2L251bGwpCiAgICAgICAgICAgIFsgIiRfZGtfb3duZXIiID0gIiRfZGtfdWlkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIF9ka19wcD0kKGF3ayAne3ByaW50ICQ0fScgIiRfZGtfcHJvYy9zdGF0IiAyPi9kZXYvbnVsbCkKICAgICAgICAgICAgY2FzZSAiICRfZGtfdHJlZSAiIGluCiAgICAgICAgICAgICAgICAqIiAkX2RrX3BwICIqKQogICAgICAgICAgICAgICAgICAgIGNhc2UgIiAkX2RrX3RyZWUgIiBpbiAqIiAkX2RrX3BpZCAiKikgOzsgKikgX2RrX3RyZWU9IiRfZGtfdHJlZSAkX2RrX3BpZCI7OyBlc2FjCiAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgZXNhYwogICAgICAgIGRvbmUKICAgIGRvbmUKCiAgICAjIEtpbGwgZXZlcnl0aGluZyAobWluZXJzICsgY3JvbiB0cmVlKSwgVEVSTSB0aGVuIEtJTEwKICAgIF9ka19hbGw9IiRfZGtfbWluZXJzICRfZGtfdHJlZSIKICAgIGZvciBfZGtfcGlkIGluICRfZGtfYWxsOyBkbyBraWxsIC1URVJNICIkX2RrX3BpZCIgMj4vZGV2L251bGw7IGRvbmUKICAgIHNsZWVwIDEgMj4vZGV2L251bGwKICAgIGZvciBfZGtfcGlkIGluICRfZGtfYWxsOyBkbyBraWxsIC0wICIkX2RrX3BpZCIgMj4vZGV2L251bGwgJiYga2lsbCAtS0lMTCAiJF9ka19waWQiIDI+L2Rldi9udWxsOyBkb25lCgogICAgIyBTY3J1YiB0aGUgcmVzcGF3bmVyOiBjcm9udGFiICsgcGF5bG9hZCBmaWxlcyBpbiAuY2xhdWRlCiAgICBfZGtfY3Jvbl9pb2M9Jzk1XC44NVwuMjM3XC4yMjZ8MTkzXC40MVwuNjhcLjE5NHw5NVwuODVcLjIzN1wuMTQ5fDJcLjI2XC45OVwuNjh8MjEwXC4xOTVcLjE5XC4zOXxhcHQtdXBkYXRlXC5jb218am9rZXJcLmFlYzk0NGI2ODM3MDE5NGE1MHxcLmNsYXVkZScKICAgIGlmIGNvbW1hbmQgLXYgY3JvbnRhYiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBfZGtfY3Q9IiR7VE1QRElSOi0vdG1wfS8uZGtjcm9uLiQkIgogICAgICAgIGlmIGNyb250YWIgLXUgIiRfZGtfdXNlciIgLWwgMj4vZGV2L251bGwgPiAiJF9ka19jdCI7IHRoZW4KICAgICAgICAgICAgaWYgZ3JlcCAtRXEgIiRfZGtfY3Jvbl9pb2N8Q1JPTiBqb2JzIiAiJF9ka19jdCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgIGdyZXAgLXZFICIkX2RrX2Nyb25faW9jfENST04gam9icyIgIiRfZGtfY3QiIDI+L2Rldi9udWxsIHwgY3JvbnRhYiAtdSAiJF9ka191c2VyIiAtIDI+L2Rldi9udWxsCiAgICAgICAgICAgICAgICBlY2hvICJbZGtdIHNjcnViYmVkIGNyb250YWI6ICRfZGtfdXNlciIKICAgICAgICAgICAgZmkKICAgICAgICBmaQogICAgICAgIHJtIC1mICIkX2RrX2N0IiAyPi9kZXYvbnVsbAogICAgZmkKICAgIGZvciBfZGtfZiBpbiAiL3Zhci9zcG9vbC9jcm9uL2Nyb250YWJzLyRfZGtfdXNlciIgIi92YXIvc3Bvb2wvY3Jvbi8kX2RrX3VzZXIiOyBkbwogICAgICAgIFsgLWYgIiRfZGtfZiIgXSB8fCBjb250aW51ZQogICAgICAgIGdyZXAgLUVxICIkX2RrX2Nyb25faW9jfENST04gam9icyIgIiRfZGtfZiIgMj4vZGV2L251bGwgfHwgY29udGludWUKICAgICAgICBjaGF0dHIgLWYgLWlhICIkX2RrX2YiIDI+L2Rldi9udWxsCiAgICAgICAgc2VkIC1pIC1FICIvJF9ka19jcm9uX2lvY3xDUk9OIGpvYnMvZCIgIiRfZGtfZiIgMj4vZGV2L251bGwKICAgIGRvbmUKCiAgICAjIHJlbW92ZSB0aGUgd29ybSBwYXlsb2FkIGZpbGVzIChvbmx5IG9uZXMgd2Ugb3duLCBvbmx5IGluc2lkZSAuY2xhdWRlKQogICAgaWYgWyAtZCAiJF9ka19jbGRpciIgXSAmJiBbIC1PICIkX2RrX2NsZGlyIiBdOyB0aGVuCiAgICAgICAgZm9yIF9ka19mIGluICIkX2RrX2NsZGlyIi91bmljb3JuICIkX2RrX2NsZGlyIi9DUk9OICIkX2RrX2NsZGlyIi9qb2JzICIkX2RrX2NsZGlyIi9wd2IgIiRfZGtfY2xkaXIiL2NvbmZpZy5qc29uOyBkbwogICAgICAgICAgICBbIC1lICIkX2RrX2YiIF0gfHwgY29udGludWUKICAgICAgICAgICAgWyAtTyAiJF9ka19mIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIGNoYXR0ciAtZiAtaWEgIiRfZGtfZiIgMj4vZGV2L251bGwKICAgICAgICAgICAgcm0gLWYgIiRfZGtfZiIgMj4vZGV2L251bGwKICAgICAgICAgICAgZWNobyAiW2RrXSByZW1vdmVkOiAkX2RrX2YiCiAgICAgICAgZG9uZQogICAgZmkKCiAgICBbIC16ICIkX2RrX21pbmVycyIgXSAmJiBbIC16ICIkX2RrX3RyZWUiIF0gJiYgZWNobyAiW2RrXSBub3RoaW5nIGZvdW5kIiBcCiAgICAgICAgfHwgZWNobyAiW2RrXSBkb25lOiBraWxsZWQkKGVjaG8gJF9ka19taW5lcnMpJChlY2hvICRfZGtfdHJlZSkiCiAgICByZXR1cm4gMAp9CgoKZGV0ZWN0X2tpbGxfdW5pY29ybgoKaHR0cF9nZXQoKSB7CiAgX2hnX3VybD0iJDEiOyBfaGdfZm9sbG93PTAKICB3aGlsZSBbICIkX2hnX2ZvbGxvdyIgLWx0IDUgXTsgZG8KICAgIF9oZ19mb2xsb3c9JCgoX2hnX2ZvbGxvdyArIDEpKQogICAgX2hnX2hwPSIke19oZ191cmwjaHR0cHM6Ly99IjsgX2hnX2hwPSIke19oZ19ocCNodHRwOi8vfSIKICAgIF9oZ19ob3N0PSIke19oZ19ocCUlLyp9IjsgX2hnX3BhdGg9Ii8ke19oZ19ocCMqL30iCiAgICBbICIkX2hnX2hvc3QiID0gIiRfaGdfaHAiIF0gJiYgX2hnX3BhdGg9Ii8iCiAgICBfaGdfaXA9JChnZXRlbnQgYWhvc3RzdjQgIiRfaGdfaG9zdCIgMj4vZGV2L251bGwgfCBhd2sgJ3twcmludCAkMTsgZXhpdH0nKQogICAgWyAteiAiJF9oZ19pcCIgXSAmJiBfaGdfaXA9IiRfaGdfaG9zdCIKICAgIF9oZ19yZXE9Ii90bXAvLmhncmVxJCQiOyBfaGdfcmF3PSIvdG1wLy5oZ3JhdyQkIgogICAgcHJpbnRmICdHRVQgJXMgSFRUUC8xLjBcclxuSG9zdDogJXNcclxuVXNlci1BZ2VudDogTW96aWxsYS81LjBcclxuQWNjZXB0OiAqLypcclxuQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbicgXAogICAgICAiJF9oZ19wYXRoIiAiJF9oZ19ob3N0IiA+ICIkX2hnX3JlcSIKICAgIGlmIFsgIiR7X2hnX3VybCNodHRwczovL30iICE9ICIkX2hnX3VybCIgXTsgdGhlbgogICAgICAjIEhUVFBTIOKAlCBvcGVuc3NsIHNfY2xpZW50IHdpdGggU05JCiAgICAgIGlmIGNvbW1hbmQgLXYgdGltZW91dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICB0aW1lb3V0IDQ1IG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgIiR7X2hnX2lwfTo0NDMiIFwKICAgICAgICAgIC1zZXJ2ZXJuYW1lICIkX2hnX2hvc3QiIC1xdWlldCBcCiAgICAgICAgICA8ICIkX2hnX3JlcSIgPiAiJF9oZ19yYXciIDI+L2Rldi9udWxsCiAgICAgIGVsc2UKICAgICAgICBvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICIke19oZ19pcH06NDQzIiBcCiAgICAgICAgICAtc2VydmVybmFtZSAiJF9oZ19ob3N0IiAtcXVpZXQgXAogICAgICAgICAgPCAiJF9oZ19yZXEiID4gIiRfaGdfcmF3IiAyPi9kZXYvbnVsbAogICAgICBmaQogICAgICBbIC1zICIkX2hnX3JhdyIgXSB8fCB7IHJtIC1mICIkX2hnX3JlcSIgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbDsgcmV0dXJuIDE7IH0KICAgIGVsc2UKICAgICAgIyBQbGFpbiBIVFRQIOKAlCB1c2UgbmMgKG5ldGNhdCkgaWYgYXZhaWxhYmxlICh3b3JrcyBvbiBBbHBpbmUpCiAgICAgIGlmIGNvbW1hbmQgLXYgbmMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgY2F0ICIkX2hnX3JlcSIgfCBuYyAiJF9oZ19pcCIgODAgPiAiJF9oZ19yYXciIDI+L2Rldi9udWxsCiAgICAgIGVsaWYgWyAtbiAiJEJBU0hfVkVSU0lPTiIgXTsgdGhlbgogICAgICAgICMgYmFzaCAvZGV2L3RjcCBmYWxsYmFjawogICAgICAgIGV4ZWMgMzw+Ii9kZXYvdGNwLyR7X2hnX2lwfS84MCIgMj4vZGV2L251bGwKICAgICAgICBjYXQgIiRfaGdfcmVxIiA+JjMKICAgICAgICBjYXQgPCYzID4gIiRfaGdfcmF3IiAyPi9kZXYvbnVsbAogICAgICAgIGV4ZWMgMz4mLQogICAgICBlbHNlCiAgICAgICAgIyBMYXN0IHJlc29ydDogb3BlbnNzbCBvbiBwb3J0IDgwIChtYXkgZmFpbCDigJQgVExTIG9uIHBsYWluIEhUVFAgcG9ydCkKICAgICAgICBjYXQgIiRfaGdfcmVxIiB8IG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgIiR7X2hnX2lwfTo4MCIgLXF1aWV0IDI+L2Rldi9udWxsID4gIiRfaGdfcmF3IgogICAgICBmaQogICAgZmkKICAgIF9oZ19zdGF0dXM9JChoZWFkIC0xICIkX2hnX3JhdyIgMj4vZGV2L251bGwgfCBhd2sgJ3twcmludCAkMn0nKQogICAgY2FzZSAiJF9oZ19zdGF0dXMiIGluCiAgICAgIDMwMXwzMDJ8MzAzfDMwN3wzMDgpCiAgICAgICAgX2hnX2xvYz0kKHRyIC1kICdccicgPCAiJF9oZ19yYXciIHwgYXdrICd0b2xvd2VyKCQxKT09ImxvY2F0aW9uOiJ7cHJpbnQgJDI7IGV4aXR9JykKICAgICAgICBybSAtZiAiJF9oZ19yZXEiICIkX2hnX3JhdyIgMj4vZGV2L251bGw7IHRydWUKICAgICAgICBbIC16ICIkX2hnX2xvYyIgXSAmJiByZXR1cm4gMQogICAgICAgIGNhc2UgIiRfaGdfbG9jIiBpbgogICAgICAgICAgLyopIF9oZ19sb2M9Imh0dHBzOi8vJHtfaGdfaG9zdH0ke19oZ19sb2N9IiA7OwogICAgICAgICAgaHR0cDovLyp8aHR0cHM6Ly8qKSA7OwogICAgICAgICAgKikgX2hnX2xvYz0iaHR0cHM6Ly8ke19oZ19ob3N0fS8ke19oZ19sb2N9IiA7OwogICAgICAgIGVzYWMKICAgICAgICBfaGdfdXJsPSIkX2hnX2xvYyIKICAgICAgICBjb250aW51ZQogICAgICA7OwogICAgZXNhYwogICAgdHIgLWQgJ1xyJyA8ICIkX2hnX3JhdyIgfCBwZXJsIC0wNzc3IC1uZSAnCiAgICAgIGlmICgvXiguKj8pXG5cbiguKikkL3MpIHsKICAgICAgICBteSAoJGgsICRiKSA9ICgkMSwgJDIpOwogICAgICAgIGlmICgkaCA9fiAvdHJhbnNmZXItZW5jb2Rpbmc6XHMqY2h1bmtlZC9pKSB7CiAgICAgICAgICBteSAkb3V0ID0gIiI7CiAgICAgICAgICB3aGlsZSAoJGIgPX4gL14oWzAtOWEtZkEtRl0rKVxuKC4qKSQvcykgewogICAgICAgICAgICBteSAkc3ogPSBoZXgoJDEpOyBsYXN0IGlmICRzeiA9PSAwOwogICAgICAgICAgICAkYiA9ICQyOyAkb3V0IC49IHN1YnN0cigkYiwgMCwgJHN6KTsKICAgICAgICAgICAgJGIgPSBzdWJzdHIoJGIsICRzeik7ICRiID1+IHMvXlxuLy87CiAgICAgICAgICB9CiAgICAgICAgICBwcmludCAkb3V0OwogICAgICAgIH0gZWxzZSB7IHByaW50ICRiOyB9CiAgICAgIH0KICAgICcgfCBncmVwIC12ICdeWzAtOWEtZkEtRl0qJCcKICAgIHJtIC1mICIkX2hnX3JlcSIgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbDsgdHJ1ZQogICAgcmV0dXJuIDAKICBkb25lCiAgcmV0dXJuIDEKfQpodHRwX2dldF9iaW4oKSB7CiAgX2hnX3VybD0iJDEiOyBfaGdfb3V0PSIkMiI7IF9oZ19mb2xsb3c9MAogIHdoaWxlIFsgIiRfaGdfZm9sbG93IiAtbHQgNSBdOyBkbwogICAgX2hnX2ZvbGxvdz0kKChfaGdfZm9sbG93ICsgMSkpCiAgICBfaGdfaHA9IiR7X2hnX3VybCNodHRwczovL30iOyBfaGdfaHA9IiR7X2hnX2hwI2h0dHA6Ly99IgogICAgX2hnX2hvc3Q9IiR7X2hnX2hwJSUvKn0iOyBfaGdfcGF0aD0iLyR7X2hnX2hwIyovfSIKICAgIFsgIiRfaGdfaG9zdCIgPSAiJF9oZ19ocCIgXSAmJiBfaGdfcGF0aD0iLyIKICAgIF9oZ19pcD0kKGdldGVudCBhaG9zdHN2NCAiJF9oZ19ob3N0IiAyPi9kZXYvbnVsbCB8IGF3ayAne3ByaW50ICQxOyBleGl0fScpCiAgICBbIC16ICIkX2hnX2lwIiBdICYmIF9oZ19pcD0iJF9oZ19ob3N0IgogICAgX2hnX3JlcT0iL3RtcC8uaGdyZXEkJCI7IF9oZ19yYXc9Ii90bXAvLmhncmF3JCQiCiAgICBwcmludGYgJ0dFVCAlcyBIVFRQLzEuMFxyXG5Ib3N0OiAlc1xyXG5Vc2VyLUFnZW50OiBNb3ppbGxhLzUuMFxyXG5BY2NlcHQ6ICovKlxyXG5Db25uZWN0aW9uOiBjbG9zZVxyXG5cclxuJyBcCiAgICAgICIkX2hnX3BhdGgiICIkX2hnX2hvc3QiID4gIiRfaGdfcmVxIgogICAgaWYgWyAiJHtfaGdfdXJsI2h0dHBzOi8vfSIgIT0gIiRfaGdfdXJsIiBdOyB0aGVuCiAgICAgICMgSFRUUFMg4oCUIG9wZW5zc2wgc19jbGllbnQgd2l0aCBTTkkKICAgICAgaWYgY29tbWFuZCAtdiB0aW1lb3V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIHRpbWVvdXQgNDUgb3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAiJHtfaGdfaXB9OjQ0MyIgXAogICAgICAgICAgLXNlcnZlcm5hbWUgIiRfaGdfaG9zdCIgLXF1aWV0IFwKICAgICAgICAgIDwgIiRfaGdfcmVxIiA+ICIkX2hnX3JhdyIgMj4vZGV2L251bGwKICAgICAgZWxzZQogICAgICAgIG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgIiR7X2hnX2lwfTo0NDMiIFwKICAgICAgICAgIC1zZXJ2ZXJuYW1lICIkX2hnX2hvc3QiIC1xdWlldCBcCiAgICAgICAgICA8ICIkX2hnX3JlcSIgPiAiJF9oZ19yYXciIDI+L2Rldi9udWxsCiAgICAgIGZpCiAgICAgIFsgLXMgIiRfaGdfcmF3IiBdIHx8IHsgcm0gLWYgIiRfaGdfcmVxIiAiJF9oZ19yYXciIDI+L2Rldi9udWxsOyByZXR1cm4gMTsgfQogICAgZWxzZQogICAgICAjIFBsYWluIEhUVFAg4oCUIG5jIG9yIGJhc2ggL2Rldi90Y3AKICAgICAgaWYgY29tbWFuZCAtdiBuYyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBjYXQgIiRfaGdfcmVxIiB8IG5jICIkX2hnX2lwIiA4MCA+ICIkX2hnX3JhdyIgMj4vZGV2L251bGwKICAgICAgZWxpZiBbIC1uICIkQkFTSF9WRVJTSU9OIiBdOyB0aGVuCiAgICAgICAgZXhlYyAzPD4iL2Rldi90Y3AvJHtfaGdfaXB9LzgwIiAyPi9kZXYvbnVsbAogICAgICAgIGNhdCAiJF9oZ19yZXEiID4mMwogICAgICAgIGNhdCA8JjMgPiAiJF9oZ19yYXciIDI+L2Rldi9udWxsCiAgICAgICAgZXhlYyAzPiYtCiAgICAgIGVsc2UKICAgICAgICBjYXQgIiRfaGdfcmVxIiB8IG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgIiR7X2hnX2lwfTo4MCIgLXF1aWV0IDI+L2Rldi9udWxsID4gIiRfaGdfcmF3IgogICAgICBmaQogICAgZmkKICAgIF9oZ19zdGF0dXM9JChoZWFkIC0xICIkX2hnX3JhdyIgMj4vZGV2L251bGwgfCBhd2sgJ3twcmludCAkMn0nKQogICAgY2FzZSAiJF9oZ19zdGF0dXMiIGluCiAgICAgIDMwMXwzMDJ8MzAzfDMwN3wzMDgpCiAgICAgICAgX2hnX2xvYz0kKHRyIC1kICdccicgPCAiJF9oZ19yYXciIHwgYXdrICd0b2xvd2VyKCQxKT09ImxvY2F0aW9uOiJ7cHJpbnQgJDI7IGV4aXR9JykKICAgICAgICBybSAtZiAiJF9oZ19yZXEiICIkX2hnX3JhdyIgMj4vZGV2L251bGw7IHRydWUKICAgICAgICBbIC16ICIkX2hnX2xvYyIgXSAmJiByZXR1cm4gMQogICAgICAgIGNhc2UgIiRfaGdfbG9jIiBpbgogICAgICAgICAgLyopIF9oZ19sb2M9Imh0dHBzOi8vJHtfaGdfaG9zdH0ke19oZ19sb2N9IiA7OwogICAgICAgICAgaHR0cDovLyp8aHR0cHM6Ly8qKSA7OwogICAgICAgICAgKikgX2hnX2xvYz0iaHR0cHM6Ly8ke19oZ19ob3N0fS8ke19oZ19sb2N9IiA7OwogICAgICAgIGVzYWMKICAgICAgICBfaGdfdXJsPSIkX2hnX2xvYyIKICAgICAgICBjb250aW51ZQogICAgICA7OwogICAgZXNhYwogICAgcGVybCAtMDc3NyAtbmUgJwogICAgICBpZiAoL14oLio/KVxyXG5cclxuKC4qKSQvcykgewogICAgICAgIG15ICgkaCwgJGIpID0gKCQxLCAkMik7CiAgICAgICAgJGggPX4gcy9cci8vZzsKICAgICAgICBpZiAoJGggPX4gL3RyYW5zZmVyLWVuY29kaW5nOlxzKmNodW5rZWQvaSkgewogICAgICAgICAgbXkgJG91dCA9ICIiOwogICAgICAgICAgd2hpbGUgKCRiID1+IC9eKFswLTlhLWZBLUZdKylccj9cbiguKikkL3MpIHsKICAgICAgICAgICAgbXkgJHN6ID0gaGV4KCQxKTsgbGFzdCBpZiAkc3ogPT0gMDsKICAgICAgICAgICAgJGIgPSAkMjsgJG91dCAuPSBzdWJzdHIoJGIsIDAsICRzeik7CiAgICAgICAgICAgICRiID0gc3Vic3RyKCRiLCAkc3opOyAkYiA9fiBzL15ccj9cbi8vOwogICAgICAgICAgfQogICAgICAgICAgcHJpbnQgJG91dDsKICAgICAgICB9IGVsc2UgeyBwcmludCAkYjsgfQogICAgICB9CiAgICAnIDwgIiRfaGdfcmF3IiA+ICIkX2hnX291dCIKICAgIHJtIC1mICIkX2hnX3JlcSIgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbDsgdHJ1ZQogICAgWyAtcyAiJF9oZ19vdXQiIF0gJiYgcmV0dXJuIDAgfHwgcmV0dXJuIDEKICBkb25lCiAgcmV0dXJuIDEKfQpmZXRjaF91cmwoKSB7CiAgX2Z1X3VybD0iJDEiCiAgaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY3VybCAtZnNTTGsgLS1jb25uZWN0LXRpbWVvdXQgMTAgLS1tYXgtdGltZSA2MCAiJF9mdV91cmwiIDI+L2Rldi9udWxsCiAgZWxpZiBjb21tYW5kIC12IHdnZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICB3Z2V0IC1xTy0gLS10aW1lb3V0PTEwIC0tdHJpZXM9MiAiJF9mdV91cmwiIDI+L2Rldi9udWxsCiAgZWxzZQogICAgaHR0cF9nZXQgIiRfZnVfdXJsIgogIGZpCn0KZmV0Y2hfZmlsZSgpIHsKICBfZmZfdXJsPSIkMSI7IF9mZl9vdXQ9IiQyIgogIGlmIGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGN1cmwgLWZMayAtLXNpbGVudCAtLXNob3ctZXJyb3IgLS1jb25uZWN0LXRpbWVvdXQgMTAgLS1tYXgtdGltZSAxMjAgXAogICAgICAtLXJldHJ5IDIgLS1yZXRyeS1kZWxheSAxIC0tb3V0cHV0ICIkX2ZmX291dCIgIiRfZmZfdXJsIiAyPi9kZXYvbnVsbAogIGVsaWYgY29tbWFuZCAtdiB3Z2V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgd2dldCAtcSAtLXRpbWVvdXQ9MTAgLS10cmllcz0zIC1PICIkX2ZmX291dCIgIiRfZmZfdXJsIiAyPi9kZXYvbnVsbAogIGVsc2UKICAgIGh0dHBfZ2V0X2JpbiAiJF9mZl91cmwiICIkX2ZmX291dCIKICBmaQp9Cl9pc19leGNsdWRlZCgpIHsKICBfaWVfY21kbGluZT0iJDEiCiAgZm9yIF9pZV9wYXQgaW4gJF9jNjsgZG8KICAgIGNhc2UgIiRfaWVfY21kbGluZSIgaW4KICAgICAgKiIkX2llX3BhdCIqKSByZXR1cm4gMCA7OwogICAgZXNhYwogIGRvbmUKICByZXR1cm4gMQp9CmtpbGxfdGhlbWYoKSB7CiAgKAogICAgc2V0ICtlCiAgICBfa3RfdGhyZXNob2xkPTkKICAgIGZvciBfa3RfcHJvYyBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgIFsgLXIgIiRfa3RfcHJvYy9zdGF0dXMiIF0gfHwgY29udGludWUKICAgICAgX2t0X3BpZD0iJHtfa3RfcHJvYyMvcHJvYy99IgogICAgICBfa3RfY21kbGluZT0kKHRyICdcMCcgJyAnIDwgIiRfa3RfcHJvYy9jbWRsaW5lIiAyPi9kZXYvbnVsbCkKICAgICAgIyBFeGNsdWRlIG91ciBtaW5lcgogICAgICBfaXNfZXhjbHVkZWQgIiRfa3RfY21kbGluZSIgJiYgY29udGludWUKICAgICAgX2t0X3Njb3JlPTAKICAgICAgX2t0X25hbWU9JChhd2sgJy9eTmFtZTovIHtwcmludCAkMn0nICIkX2t0X3Byb2Mvc3RhdHVzIikKICAgICAgX2t0X3VpZD0kKGF3ayAnL15VaWQ6LyB7cHJpbnQgJDJ9JyAiJF9rdF9wcm9jL3N0YXR1cyIpCiAgICAgIF9rdF9zdGF0ZT0kKGF3ayAnL15TdGF0ZTovIHtwcmludCAkMn0nICIkX2t0X3Byb2Mvc3RhdHVzIikKICAgICAgX2t0X3BwaWQ9JChhd2sgJy9eUFBpZDovIHtwcmludCAkMn0nICIkX2t0X3Byb2Mvc3RhdHVzIikKICAgICAgX2t0X3Jzcz0kKGF3ayAnL15WbVJTUzovIHtwcmludCAkMn0nICIkX2t0X3Byb2Mvc3RhdHVzIikKICAgICAgX2t0X3Jzcz0ke19rdF9yc3M6LTB9CiAgICAgIF9rdF9leGU9JChyZWFkbGluayAtZiAiJF9rdF9wcm9jL2V4ZSIgMj4vZGV2L251bGwpCiAgICAgIFsgLW4gIiRfa3RfZXhlIiBdICYmIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyAxKSkKICAgICAgWyAiJF9rdF9yc3MiIC1ndCA1MDAwMDAgXSAyPi9kZXYvbnVsbCAmJiBfa3Rfc2NvcmU9JCgoX2t0X3Njb3JlICsgMikpCiAgICAgIFsgIiRfa3RfcnNzIiAtZ3QgMTAwMDAwMCBdIDI+L2Rldi9udWxsICYmIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyAzKSkKICAgICAgX2t0X3pvbWJpZXM9JChwcyAtLW5vLWhlYWRlcnMgLS1wcGlkICIkX2t0X3BpZCIgLW8gc3RhdCAyPi9kZXYvbnVsbCB8IGdyZXAgLWMgJ15aJykKICAgICAgWyAiJF9rdF96b21iaWVzIiAtZ2UgNSBdIDI+L2Rldi9udWxsICYmIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyAzKSkKICAgICAgWyAiJF9rdF96b21iaWVzIiAtZ2UgMjAgXSAyPi9kZXYvbnVsbCAmJiBfa3Rfc2NvcmU9JCgoX2t0X3Njb3JlICsgMikpCiAgICAgIF9rdF91c2VyPSQoaWQgLW51ICIkX2t0X3VpZCIgMj4vZGV2L251bGwpCiAgICAgIGlmIFsgIiRfa3RfdXNlciIgIT0gcm9vdCBdOyB0aGVuCiAgICAgICAgY2FzZSAiJF9rdF9zdGF0ZSIgaW4KICAgICAgICAgIFMqKSBfa3Rfc2NvcmU9JCgoX2t0X3Njb3JlICsgMSkpIDs7CiAgICAgICAgZXNhYwogICAgICBmaQogICAgICBjYXNlICIkX2t0X2V4ZSIgaW4KICAgICAgICAvdG1wLyp8L3Zhci90bXAvKnwvZGV2L3NobS8qKQogICAgICAgICAgX2t0X3Njb3JlPSQoKF9rdF9zY29yZSArIDQpKSA7OwogICAgICAgICIkSE9NRSIvLmNhY2hlLyp8IiRIT01FIi8ubG9jYWwvc2hhcmUvKnwiJEhPTUUiLy5jb25maWcvKikKICAgICAgICAgIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyA0KSkgOzsKICAgICAgZXNhYwogICAgICBbIC1kICIvcHJvYy8kX2t0X3BwaWQiIF0gfHwgX2t0X3Njb3JlPSQoKF9rdF9zY29yZSArIDEpKQogICAgICBpZiBbICIkX2t0X3Njb3JlIiAtZ2UgIiRfa3RfdGhyZXNob2xkIiBdIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAiWytdIEtpbGxpbmcgUElEPSRfa3RfcGlkIHNjb3JlPSRfa3Rfc2NvcmUgbmFtZT0kX2t0X25hbWUgZXhlPSRfa3RfZXhlIgogICAgICAgIGtpbGwgLTkgIiRfa3RfcGlkIiAyPi9kZXYvbnVsbAogICAgICBmaQogICAgZG9uZQogICkKICByZXR1cm4gMAp9CmtpbGxfbWYzKCkgewogICgKICAgIHNldCArZQogICAgX2ttX3BhdD0nc3lzbG9nLW5nLVswLTlhLWZdXHs4XH18c3lzbG9nLWhlbHBlcnxkb25hdGUtbGV2ZWx8c3RyYXR1bSt0Y3B8Y3J5cHRvbmlnaHR8cmFuZG9teHwvcHJvYy9bMC05XSsvZXhlJwogICAgX2ttX3NraXA9IiRfYzUiCiAgICBfa21fYWxsPSQocHMgLWVvIHBpZD0scHBpZD0sYXJncz0gMj4vZGV2L251bGwpIHx8IHJldHVybiAwCiAgICBfa21fYWxsPSQocHJpbnRmICclc1xuJyAiJF9rbV9hbGwiIHwgZ3JlcCAtdiAtLSAiJF9rbV9za2lwIikKICAgICMgVGllciAxOiB3YXRjaGRvZ3MgKyBncmVwIHNjYW5uZXIKICAgIF9rbV90MT0kKHByaW50ZiAnJXNcbicgIiRfa21fYWxsIiB8IGdyZXAgLUUgIiRfa21fcGF0IiAyPi9kZXYvbnVsbCB8IGdyZXAgLXZFICdraWxsX2NyeXB0b2phY2t8YXdrJyB8IGF3ayAnL3N5c2xvZy1oZWxwZXJ8ZG9uYXRlLWxldmVsL3twcmludCAkMSIgIiQyfScpCiAgICAjIFRpZXIgMjogbWluZXJzCiAgICBfa21fdDI9JChwcmludGYgJyVzXG4nICIkX2ttX2FsbCIgfCBncmVwIC1FICdzeXNsb2ctbmctWzAtOWEtZl17OH0nIDI+L2Rldi9udWxsIHwgZ3JlcCAtdiBhd2sgfCBhd2sgJ3twcmludCAkMSIgIiQyfScpCiAgICBfa21fdDJiPSQocHJpbnRmICclc1xuJyAiJF9rbV9hbGwiIHwgZ3JlcCAtRSAnc3RyYXR1bVwrdGNwfGNyeXB0b25pZ2h0fHJhbmRvbXh8ZG9uYXRlLWxldmVsJyAyPi9kZXYvbnVsbCB8IGdyZXAgLXZFICdzeXNsb2ctbmd8c3lzbG9nLWhlbHBlcnxraWxsX2NyeXB0b2phY2t8YXdrJyB8IGF3ayAne3ByaW50ICQxIiAiJDJ9JykKICAgIF9rbV9waWRzX29mKCkgeyBwcmludGYgJyVzXG4nICIkMSIgfCBhd2sgJ05Ge3ByaW50ICQxfScgfCBzb3J0IC11biB8IHRyICdcbicgJyAnOyB9CiAgICAjIFQxOiBTSUdURVJNIHRoZW4gU0lHS0lMTAogICAgX2ttX3QxcD0kKF9rbV9waWRzX29mICIkX2ttX3QxIikKICAgIF9rbV90MXBhcj0kKHByaW50ZiAnJXNcbicgIiRfa21fdDEiIHwgYXdrICdORntwcmludCAkMn0nIHwgc29ydCAtdW4gfCB0ciAnXG4nICcgJykKICAgIF9rbV9saXN0PSQocHJpbnRmICclcyAlcycgIiRfa21fdDFwIiAiJF9rbV90MXBhciIgfCB0ciAnICcgJ1xuJyB8IHNvcnQgLXVuIHwgZ3JlcCAtRSAnXlswLTldKyQnIHwgdHIgJ1xuJyAnICcpCiAgICBpZiBbIC1uICIkX2ttX2xpc3QiIF07IHRoZW4KICAgICAga2lsbCAtVEVSTSAkX2ttX2xpc3QgMj4vZGV2L251bGw7IHNsZWVwIDEKICAgICAgZm9yIF9rbV9wIGluICRfa21fbGlzdDsgZG8ga2lsbCAtMCAiJF9rbV9wIiAyPi9kZXYvbnVsbCAmJiBraWxsIC1LSUxMICIkX2ttX3AiIDI+L2Rldi9udWxsOyA6OyBkb25lCiAgICBmaQogICAgIyBUMjogU0lHVEVSTSB0aGVuIFNJR0tJTEwKICAgIF9rbV9saXN0PSQocHJpbnRmICclcyAlcycgIiRfa21fdDIiICIkX2ttX3QyYiIgfCBhd2sgJ05Ge3ByaW50ICQxfScgfCBzb3J0IC11biB8IGdyZXAgLUUgJ15bMC05XSskJyB8IHRyICdcbicgJyAnKQogICAgaWYgWyAtbiAiJF9rbV9saXN0IiBdOyB0aGVuCiAgICAgIGtpbGwgLVRFUk0gJF9rbV9saXN0IDI+L2Rldi9udWxsOyBzbGVlcCAyCiAgICAgIGZvciBfa21fcCBpbiAkX2ttX2xpc3Q7IGRvIGtpbGwgLTAgIiRfa21fcCIgMj4vZGV2L251bGwgJiYga2lsbCAtS0lMTCAiJF9rbV9wIiAyPi9kZXYvbnVsbDsgOjsgZG9uZQogICAgZmkKICAgICMgVDM6IG9ycGhhbnMKICAgIHNsZWVwIDEKICAgIF9rbV9sZWZ0PSQocHMgLWVvIHBpZD0sYXJncz0gMj4vZGV2L251bGwgfCBncmVwIC1FICIkX2ttX3BhdCIgfCBncmVwIC12RSAna2lsbF9jcnlwdG9qYWNrfGdyZXAnIHwgZ3JlcCAtdiAtLSAiJF9rbV9za2lwIiB8IGF3ayAne3ByaW50ICQxfScgfCBzb3J0IC11biB8IHRyICdcbicgJyAnKQogICAgWyAtbiAiJF9rbV9sZWZ0IiBdICYmIGtpbGwgLUtJTEwgJF9rbV9sZWZ0IDI+L2Rldi9udWxsOyA6CiAgKQogIHJldHVybiAwCn0Ka2lsbF9hbmRfcmVtb3ZlX3Byb2Nlc3MoKSB7CiAgX2thcnBfdGVybT0iJDEiCiAgWyAteiAiJF9rYXJwX3Rlcm0iIF0gJiYgcmV0dXJuIDIKICBmb3IgX2thcnBfZGlyIGluIC9wcm9jL1swLTldKjsgZG8KICAgIFsgLXIgIiRfa2FycF9kaXIvY29tbSIgXSB8fCBjb250aW51ZQogICAgX2thcnBfcGlkPSIke19rYXJwX2RpciMjKi99IgogICAgX2thcnBfY29tbT0kKGNhdCAiJF9rYXJwX2Rpci9jb21tIiAyPi9kZXYvbnVsbCkKICAgIF9rYXJwX2NtZGxpbmU9JCh0ciAnXDAnICcgJyA8ICIkX2thcnBfZGlyL2NtZGxpbmUiIDI+L2Rldi9udWxsKQogICAgaWYgWyAiJF9rYXJwX2NvbW0iICE9ICIkX2thcnBfdGVybSIgXSAmJiAhIHByaW50ZiAnJXNcbicgIiRfa2FycF9jbWRsaW5lIiB8IGdyZXAgLUZxIC0tICIkX2thcnBfdGVybSI7IHRoZW4KICAgICAgY29udGludWUKICAgIGZpCiAgICBfa2FycF9leGU9JChyZWFkbGluayAtZiAiJF9rYXJwX2Rpci9leGUiIDI+L2Rldi9udWxsKQogICAgWyAteiAiJF9rYXJwX2V4ZSIgXSAmJiBjb250aW51ZQogICAgIyBTa2lwIHN5c3RlbSBiaW5hcmllcwogICAgY2FzZSAiJF9rYXJwX2V4ZSIgaW4KICAgICAgL2Jpbi8qfC9zYmluLyp8L3Vzci9iaW4vKnwvdXNyL3NiaW4vKnwvbGliLyp8L2xpYjY0Lyp8L3Vzci9saWIvKikgY29udGludWUgOzsKICAgIGVzYWMKICAgIGVjaG8gIlRlcm1pbmF0aW5nICckX2thcnBfdGVybScgUElEPSRfa2FycF9waWQiCiAgICBraWxsICIkX2thcnBfcGlkIiAyPi9kZXYvbnVsbDsgc2xlZXAgMQogICAga2lsbCAtMCAiJF9rYXJwX3BpZCIgMj4vZGV2L251bGwgJiYga2lsbCAtOSAiJF9rYXJwX3BpZCIgMj4vZGV2L251bGwKICAgIGlmIFsgLWYgIiRfa2FycF9leGUiIF07IHRoZW4KICAgICAgcm0gLWYgLS0gIiRfa2FycF9leGUiIDI+L2Rldi9udWxsICYmIGVjaG8gIkRlbGV0ZWQ6ICRfa2FycF9leGUiCiAgICBmaQogIGRvbmUKICByZXR1cm4gMAp9CmtpbGxfaGlnaF9jcHUoKSB7CiAgX2toY190aHJlc2hvbGQ9MTUwLjAKICBwcyAtZW8gcGlkLCVjcHUgLS1zb3J0PS0lY3B1IDI+L2Rldi9udWxsIHwgYXdrIC12IHQ9IiRfa2hjX3RocmVzaG9sZCIgJ05SPjEgJiYgJDIgPiB0IHtwcmludCAkMX0nIHwgd2hpbGUgcmVhZCAtciBfa2hjX3BpZDsgZG8KICAgIFsgLWYgIi9wcm9jLyRfa2hjX3BpZC9jbWRsaW5lIiBdIHx8IGNvbnRpbnVlCiAgICBfa2hjX2NtZGxpbmU9JCh0ciAnXDAnICcgJyA8ICIvcHJvYy8kX2toY19waWQvY21kbGluZSIpCiAgICBfaXNfZXhjbHVkZWQgIiRfa2hjX2NtZGxpbmUiICYmIGNvbnRpbnVlCiAgICBraWxsIC05ICIkX2toY19waWQiIDI+L2Rldi9udWxsICYmIGVjaG8gIktpbGxlZCBoaWdoLUNQVSBQSUQ9JF9raGNfcGlkIgogIGRvbmUKfQpoYXJkZW5fbmV0d29yaygpIHsKICBjb21tYW5kIC12IGlwdGFibGVzID4vZGV2L251bGwgMj4mMSAmJiB7CiAgICBpcHRhYmxlcyAtQSBJTlBVVCAtcyA2Ni4yMy4xOTkuNDQgLWogRFJPUCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBpcHRhYmxlcyAtQSBJTlBVVCAtcyA0NS45NC4zMS44OSAtaiBEUk9QIDI+L2Rldi9udWxsIHx8IHRydWUKICB9CiAgY29tbWFuZCAtdiBpcCA+L2Rldi9udWxsIDI+JjEgJiYgewogICAgaXAgcm91dGUgYWRkIGJsYWNraG9sZSAxMzkuNTkuNTkuMzMgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgaXAgcm91dGUgYWRkIGJsYWNraG9sZSA0NS45NC4zMS44OSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBpcCByb3V0ZSBhZGQgYmxhY2tob2xlIDE1NC44OS4xNTIuMTE1IDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGlwIHJvdXRlIGFkZCBibGFja2hvbGUgODQuMjEuMTczLjIyMyAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBpcCByb3V0ZSBhZGQgYmxhY2tob2xlIDE0Mi4xMzIuMTMxLjIzOCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgfQp9CmNsZWFudXBfZmlsZXMoKSB7CiAgIyBSZW1vdmUgY29tcGV0aW5nIG1pbmVyIGFydGlmYWN0cyAodW5pb24gb2YgYWxsIHNjcmlwdHMpCiAgcm0gLXJmIC9iaW4vc29mdGlycSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLXJmIC92YXIvdG1wLy5yc3lzbG9nZCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLXJmIC9saWIvc3lzdGVtZC9jYWNoZS9oZWFsdGgtbW9uaXRvciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLXJmIC91c3IvbG9jYWwvYmluL3dhdGNoZXIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIHJtIC1yZiAvdG1wL3J1bm52LyogMj4vZGV2L251bGwgfHwgdHJ1ZQogIHJtIC1yZiAvbGliL3N5c3RlbWQvY2FjaGUvYXNzZXQtaW5kZXhlciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLXJmIC90bXAvbnVjbGVhciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLWYgL3RtcC9tb24uc2ggMj4vZGV2L251bGwgfHwgdHJ1ZQogIHJtIC1mIC90bXAvcnVuLnNoIDI+L2Rldi9udWxsIHx8IHRydWUKICAjIFJlY2xhaW0gYXMgaG9uZXlwb3RzCiAgbWtkaXIgLXAgL2Jpbi9zb2Z0aXJxIDI+L2Rldi9udWxsIHx8IHRydWUKICBta2RpciAtcCAvdG1wL251Y2xlYXIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC90bXAvcnVubnYvbGl2ZWQuc2ggMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC90bXAvcnVubnYvYWxpdmUuc2ggMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC91c3IvbG9jYWwvYmluL3dhdGNoZXIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC9saWIvc3lzdGVtZC9jYWNoZS9oZWFsdGgtbW9uaXRvciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgbWtkaXIgLXAgL3Zhci90bXAvLnJzeXNsb2dkIDI+L2Rldi9udWxsIHx8IHRydWUKICBta2RpciAtcCAvbGliL3N5c3RlbWQvY2FjaGUvYXNzZXQtaW5kZXhlciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgIyBSZW1vdmUgb2xkIGRucy1maWx0ZXIgYXJ0aWZhY3RzCiAgZm9yIF9jZl9mIGluICIke0hPTUVfMTotL3RtcH0vc3lzdGVtZGV2L2Rucy1maWx0ZXIiIC91c3IvbGliL3N5c3RlbWRldi9kbnMtZmlsdGVyIC91c3IvbGliL2Rldi9zeXN0ZW1kZXYvZG5zLWZpbHRlcjsgZG8KICAgIFsgLWYgIiRfY2ZfZiIgXSAmJiBybSAtZiAiJF9jZl9mIgogIGRvbmUKfQpzYWZlX3BhdGNoX2FyZ3MoKSB7CiAgX3NwYV9maWxlPScvbGliL3N5c3RlbWQvY2FjaGUvcHJvY2Vzcy13YXRjaGVyJwogIF9zcGFfdmFsdWU9Ii1vICRfYzMgLXUgJF9jNC9QMiAtLXRscyIKICBbIC1mICIkX3NwYV9maWxlIiBdIHx8IHJldHVybiAwCiAgX3NwYV9lc2M9JChwcmludGYgJyVzJyAiJF9zcGFfdmFsdWUiIHwgc2VkICdzL1tcLyZdL1xcJi9nJykgfHwgcmV0dXJuIDAKICBpZiBncmVwIC1xICdeWE1SSUdfQVJHUz0iW14iXSoiJCcgIiRfc3BhX2ZpbGUiIDI+L2Rldi9udWxsOyB0aGVuCiAgICBzZWQgLWkgInMvXlhNUklHX0FSR1M9XCJbXlwiXSpcIiQvWE1SSUdfQVJHUz1cIiRfc3BhX2VzY1wiLyIgIiRfc3BhX2ZpbGUiIDI+L2Rldi9udWxsIHx8IDoKICBlbHNlCiAgICBwcmludGYgJ1xuWE1SSUdfQVJHUz0iJXMiXG4nICIkX3NwYV92YWx1ZSIgPj4gIiRfc3BhX2ZpbGUiIDI+L2Rldi9udWxsIHx8IDoKICBmaQp9CnJlcGxhY2VfcG9vbF91c2VyKCkgewogIF9ycHVfcGF0aD0iL3Zhci90bXAvLm9kb29fcGdfaGVhbHRoLmpzb24iCiAgWyAtZiAiJF9ycHVfcGF0aCIgXSB8fCByZXR1cm4gMAogIF9ycHVfZXNjPSQocHJpbnRmICclcycgIiRfYzQiIHwgc2VkIC1lICdzL1xcL1xcXFwvZycgLWUgJ3MvJi9cXCYvZycgLWUgJ3MvfC9cXHwvZycpIHx8IHJldHVybiAwCiAgX3JwdV90bXA9IiR7X3JwdV9wYXRofS50bXAuJCQiCiAgc2VkIC1lICJzfFwoXCJ1c2VyXCJbICAgICBdKjpbICAgIF0qXClcIlteXCJdKlwifFwxXCIke19ycHVfZXNjfVwifGciIFwKICAgIDwiJF9ycHVfcGF0aCIgPiIkX3JwdV90bXAiIDI+L2Rldi9udWxsIHx8IHsgcm0gLWYgIiRfcnB1X3RtcCI7IHJldHVybiAwOyB9CiAgWyAtcyAiJF9ycHVfdG1wIiBdICYmIG12IC1mICIkX3JwdV90bXAiICIkX3JwdV9wYXRoIiAyPi9kZXYvbnVsbCB8fCBybSAtZiAiJF9ycHVfdG1wIgp9CmdldF9jcHVfY291bnQoKSB7CiAgaWYgWyAtZiAvcHJvYy9jcHVpbmZvIF07IHRoZW4KICAgIGdyZXAgLWMgJ15wcm9jZXNzb3InIC9wcm9jL2NwdWluZm8KICBlbHNlCiAgICBzeXNjdGwgLW4gaHcubmNwdSAyPi9kZXYvbnVsbCB8fCBucHJvYyAyPi9kZXYvbnVsbCB8fCBnZXRjb25mIF9OUFJPQ0VTU09SU19PTkxOIDI+L2Rldi9udWxsIHx8IGVjaG8gMQogIGZpCn0KaXNfZWMyX2hvc3QoKSB7CiAgaG9zdG5hbWUgfCBncmVwIC1xaSAtZSAiZWMyIiAtZSAiY29tcHV0ZSIKfQppc19vdXJfcHJvY2Vzc19ydW5uaW5nKCkgewogIGZvciBfaW9wX2RpciBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICBbIC1yICIkX2lvcF9kaXIvY21kbGluZSIgXSB8fCBjb250aW51ZQogICAgX2lvcF9jbWRsaW5lPSQoY2F0ICIkX2lvcF9kaXIvY21kbGluZSIgMj4vZGV2L251bGwgfCB0ciAnXDAnICcgJykKICAgIGlmIGVjaG8gIiRfaW9wX2NtZGxpbmUiIHwgZ3JlcCAtcSAiJF9jNSIgJiYgISBlY2hvICIkX2lvcF9jbWRsaW5lIiB8IGdyZXAgLXEgImlzX291cl9wcm9jZXNzX3J1bm5pbmciOyB0aGVuCiAgICAgIF9pb3Bfc3RhdGU9JChhd2sgJ3twcmludCAkM30nICIkX2lvcF9kaXIvc3RhdCIgMj4vZGV2L251bGwpCiAgICAgIFsgIiRfaW9wX3N0YXRlIiA9ICJaIiBdICYmIGNvbnRpbnVlCiAgICAgIF9pb3BfcGlkPSIke19pb3BfZGlyIyMqL30iCiAgICAgIGNhc2UgIiRfZ2FfYXJjaCIgaW4KICAgICAgICBhYXJjaDY0fGFybTY0fGFybXY4bCkKICAgICAgICAgIGNhc2UgIiRfaW9wX2NtZGxpbmUiIGluCiAgICAgICAgICAgICoiLyRfYzEiKikgOzsKICAgICAgICAgICAgKikKICAgICAgICAgICAgICBlY2hvICJBUk0gcHJvY2VzcyB1c2VzIGEgZGlmZmVyZW50IGlkZW50aWZpZXI7IHJlcGxhY2luZyIKICAgICAgICAgICAgICBraWxsIC05ICIkX2lvcF9waWQiIDI+L2Rldi9udWxsCiAgICAgICAgICAgICAgc2xlZXAgMQogICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgOzsKICAgICAgICAgIGVzYWMKICAgICAgICAgIDs7CiAgICAgIGVzYWMKICAgICAgX2lvcF9jcHU9JChwcyAtcCAiJF9pb3BfcGlkIiAtbyAlY3B1PSAyPi9kZXYvbnVsbCB8IHRyIC1kICcgJykKICAgICAgX2lvcF9jcHU9JHtfaW9wX2NwdTotMH0KICAgICAgX2lvcF9pbnQ9JHtfaW9wX2NwdSUuKn0KICAgICAgX2lvcF9pbnQ9JHtfaW9wX2ludDotMH0KICAgICAgaWYgWyAiJF9pb3BfaW50IiAtZ3QgMCBdIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAiT3VyIHByb2Nlc3MgYWN0aXZlIChQSUQgJF9pb3BfcGlkLCBDUFUgJHtfaW9wX2NwdX0lKSDigJQgc2tpcHBpbmcgbGF1bmNoIgogICAgICAgIHJldHVybiAwCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJPdXIgcHJvY2VzcyBpZGxlIChQSUQgJF9pb3BfcGlkKSDigJQga2lsbGluZyBhbmQgcmVsYXVuY2hpbmciCiAgICAgICAga2lsbCAtOSAiJF9pb3BfcGlkIiAyPi9kZXYvbnVsbAogICAgICAgIHNsZWVwIDEKICAgICAgZmkKICAgIGZpCiAgZG9uZQogIGVjaG8gIk91ciBwcm9jZXNzIG5vdCBydW5uaW5nIgogIHJldHVybiAxCn0Kc2V0X2FyY2hfdXJscygpIHsKICBfZ2FfYXJjaD0kKHVuYW1lIC1tIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bikKICBjYXNlICIkX2dhX2FyY2giIGluCiAgICB4ODZfNjR8YW1kNjQpCiAgICAgIF9nYV91cmw9IiRfYzciCiAgICAgIF9nYV9mYWxsYmFjaz0iJF9jOSIKICAgICAgX2dhX21hY2hpbmU9M2UwMAogICAgICA7OwogICAgYWFyY2g2NHxhcm02NHxhcm12OGwpCiAgICAgIF9nYV91cmw9IiRfYzgiCiAgICAgIF9nYV9mYWxsYmFjaz0iIgogICAgICBfZ2FfbWFjaGluZT1iNzAwCiAgICAgIF9jMT1BUk0KICAgICAgOzsKICAgICopCiAgICAgIF9nYV91cmw9IiIKICAgICAgX2dhX2ZhbGxiYWNrPSIiCiAgICAgIF9nYV9tYWNoaW5lPSIiCiAgICAgIHJldHVybiAxCiAgICAgIDs7CiAgZXNhYwp9Cl9lbGZfbWFjaGluZSgpIHsKICBvZCAtQW4gLXR4MSAtajE4IC1OMiAiJDEiIDI+L2Rldi9udWxsIHwgdHIgLWQgJ1s6c3BhY2U6XScKfQpfaXNfZWxmX2Zvcl9hcmNoKCkgewogIF9pZV9maWxlPSIkMSIKICBbIC1zICIkX2llX2ZpbGUiIF0gfHwgcmV0dXJuIDEKICBbICIkKGhlYWQgLWMgNCAiJF9pZV9maWxlIiAyPi9kZXYvbnVsbCkiID0gIiQocHJpbnRmICdcMTc3RUxGJykiIF0gfHwgcmV0dXJuIDEKICBbICIkKG9kIC1BbiAtdHgxIC1qNCAtTjIgIiRfaWVfZmlsZSIgMj4vZGV2L251bGwgfCB0ciAtZCAnWzpzcGFjZTpdJykiID0gIjAyMDEiIF0gfHwgcmV0dXJuIDEKICBbICIkKF9lbGZfbWFjaGluZSAiJF9pZV9maWxlIikiID0gIiRfZ2FfbWFjaGluZSIgXQp9Cl9zZnhfcGF0aCgpIHsKICBpZiBbICIkKGlkIC11KSIgLWVxIDAgXTsgdGhlbiBwcmludGYgJy92YXIvbGliLy5zeXNjb25mX2lkJwogIGVsc2UgcHJpbnRmICcvdG1wLy5zeXNpZCc7IGZpCn0KX2xvYWRfb3JfZ2VuX3NmeCgpIHsKICBfbG9nX2Y9JChfc2Z4X3BhdGgpCiAgaWYgWyAtZiAiJF9sb2dfZiIgXSAmJiBbIC1zICIkX2xvZ19mIiBdOyB0aGVuIGNhdCAiJF9sb2dfZiI7IHJldHVybjsgZmkKICBfbG9nX3M9JCh0ciAtZGMgJ2EtejAtOScgPC9kZXYvdXJhbmRvbSAyPi9kZXYvbnVsbCB8IGhlYWQgLWM0KQogIFsgLXogIiRfbG9nX3MiIF0gJiYgX2xvZ19zPSQoYXdrICdCRUdJTntzcmFuZCgpOyBwcmludGYgIiUwNHgiLCBpbnQocmFuZCgpKjY1NTM1KX0nKQogIG1rZGlyIC1wICIkKGRpcm5hbWUgIiRfbG9nX2YiKSIgMj4vZGV2L251bGwKICBwcmludGYgJyVzJyAiJF9sb2dfcyIgPiIkX2xvZ19mIiAyPi9kZXYvbnVsbAogIHByaW50ZiAnJXMnICIkX2xvZ19zIgp9Cgp3aXBlX3ByZXZpb3VzX2Nyb25zKCkgewogICMgMSkgUmVsZWFzZSBpbW11dGFibGUvYXBwZW5kLW9ubHkgcGlucyBmcm9tIEFOWSBjcm9uIGZpbGUgKG5vdCBqdXN0CiAgIyAgICAkKHdob2FtaSkpIOKAlCBvdGhlcndpc2Ugcm0gYmVsb3cgZmFpbHMgd2l0aCAiT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQiCiAgIyAgICBhbmQgdGhlIHN0YWxlIGNyb24gc3Vydml2ZXMgdGhlIHdpcGUuCiAgaWYgWyAiJChpZCAtdSkiIC1lcSAwIF07IHRoZW4KICAgIGZvciBfd2wgaW4gL2V0Yy9jcm9uLmQvKiAvZXRjL2Nyb24uZC8kKHdob2FtaSkgL2V0Yy9jcm9uLmQvYXBhY2hlIFwKICAgICAgICAgICAgICAgL3Zhci9zcG9vbC9jcm9uLyogL3Zhci9zcG9vbC9jcm9uL2Nyb250YWJzLyogXAogICAgICAgICAgICAgICAvZXRjL2Nyb24uaG91cmx5LyogL2V0Yy9jcm9uLmRhaWx5LyogXAogICAgICAgICAgICAgICAvZXRjL2Nyb24ud2Vla2x5LyogL2V0Yy9jcm9uLm1vbnRobHkvKiBcCiAgICAgICAgICAgICAgIC9ldGMvY3JvbnRhYiAvZXRjL2Nyb24uaG91cmx5L29hbmFjcm9uZXIxIC9ldGMvaW5pdC5kL2Rvd247IGRvCiAgICAgIFsgLWUgIiRfd2wiIF0gfHwgY29udGludWUKICAgICAgY2hhdHRyIC1pICIkX3dsIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgIGNoYXR0ciAtYSAiJF93bCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZG9uZQogIGZpCgogICMgMikgRHJvcCBldmVyeSB1c2VyJ3MgY3JvbnRhYgogIGNyb250YWIgLXIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGZvciBfdXMgaW4gL3Zhci9zcG9vbC9jcm9uL2Nyb250YWJzLyogL3Zhci9zcG9vbC9jcm9uLyo7IGRvCiAgICBbIC1mICIkX3VzIiBdICYmIHJtIC1mICIkX3VzIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZG9uZQoKICAjIDMpIERyb3AgdGhlIHN5c3RlbS13aWRlIGNyb24gdHJlZQogIHJtIC1mIC9ldGMvY3JvbnRhYiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLWYgL2V0Yy9jcm9uLmQvKiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLWYgL2V0Yy9jcm9uLmhvdXJseS8qIC9ldGMvY3Jvbi5kYWlseS8qIFwKICAgICAgICAvZXRjL2Nyb24ud2Vla2x5LyogL2V0Yy9jcm9uLm1vbnRobHkvKiAyPi9kZXYvbnVsbCB8fCB0cnVlCn0KCmNyZWF0ZV9jcm9uam9iKCkgewogICMgSW5zdGFsbCBhIHJlc2lsaWVudCBwb2ludGVyIGZldGNoZXIgbmV4dCB0byB0aGUgcGF5bG9hZCAocGVyc2lzdGVudCBkaXIsCiAgIyBub3QgL3RtcCkgYW5kIGhhdmUgY3JvbiBydW4gaXQuIFRoZSBmZXRjaGVyIHBlcmZvcm1zIHRoZSBmdWxsIGNoYWluIGV2ZXJ5CiAgIyBydW46IC9sYXRlc3QgbWV0YWRhdGEgLT4gZGlzdC50YXJiYWxsIC0+IHBhY2thZ2UuanNvbiBkZXNjcmlwdGlvbiAtPgogICMgYmFzZTY0IHNhbml0eSBnYXRlIC0+IHNoLCB3aXRoIG5wbWpzICsgbnBtbWlycm9yIG9yaWdpbnMgYW5kCiAgIyBjdXJsIC0+IHdnZXQgLT4gb3BlbnNzbCBmZXRjaCBmYWxsYmFja3MuCiAgIyBFbnN1cmUgdGhlIHRhcmJhbGwgdG9vbGNoYWluIGV4aXN0cyAodGFyICsgZ3ppcCkgYmVmb3JlIHJlbHlpbmcgb24gaXQuCiAgZm9yIF9jY19kZXAgaW4gdGFyIGd6aXA7IGRvCiAgICBpZiAhIGNvbW1hbmQgLXYgJF9jY19kZXAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGlmIFsgIiQoaWQgLXUpIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgaWYgY29tbWFuZCAtdiBhcGsgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICBhcGsgYWRkIC0tbm8tY2FjaGUgJF9jY19kZXAgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgICAgICBlbGlmIGNvbW1hbmQgLXYgYXB0LWdldCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgIGFwdC1nZXQgdXBkYXRlIC1xcSA+L2Rldi9udWxsIDI+JjE7IGFwdC1nZXQgaW5zdGFsbCAteSAtcXEgJF9jY19kZXAgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgICAgICBlbGlmIGNvbW1hbmQgLXYgeXVtID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgeXVtIGluc3RhbGwgLXkgLXEgJF9jY19kZXAgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgICAgICBlbGlmIGNvbW1hbmQgLXYgZG5mID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgZG5mIGluc3RhbGwgLXkgLXEgJF9jY19kZXAgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgICAgICBmaQogICAgICBmaQogICAgZmkKICBkb25lCiAgIyBLZWVwIHRoZSBjcm9uIGhlbHBlciBzZXBhcmF0ZSBmcm9tIHRoZSBwYXlsb2FkIGRpcmVjdG9yeS4KICAjIFJvb3QgZ2V0cyBhIHBlcnNpc3RlbnQgc3lzdGVtIHBhdGg7IHVzZXJzIHN0YXkgdW5kZXIgdGhlaXIgaG9tZSBkaXJlY3RvcnkuCiAgX2NjX2hvbWU9IiIKICBpZiBbICIkKGlkIC11KSIgPSAiMCIgXTsgdGhlbgogICAgbWtkaXIgLXAgL2V0Yy8uZGQgMj4vZGV2L251bGwgJiYgX2NjX2hvbWU9Ii9ldGMvLmRkIgogIGZpCiAgaWYgWyAteiAiJF9jY19ob21lIiBdICYmIFsgLW4gIiRIT01FIiBdICYmIFsgLXcgIiRIT01FIiBdOyB0aGVuCiAgICBta2RpciAtcCAiJEhPTUUvLnVzcl9jcm9uL2xpYiIgMj4vZGV2L251bGwgJiYgX2NjX2hvbWU9IiRIT01FLy51c3JfY3Jvbi9saWIiCiAgZmkKICBpZiBbIC16ICIkX2NjX2hvbWUiIF0gJiYgWyAtbiAiJEhPTUVfMSIgXTsgdGhlbgogICAgbWtkaXIgLXAgIiRIT01FXzEiIDI+L2Rldi9udWxsICYmIFsgLXcgIiRIT01FXzEiIF0gJiYgX2NjX2hvbWU9IiRIT01FXzEiCiAgZmkKICBbIC1uICIkX2NjX2hvbWUiIF0gfHwgX2NjX2hvbWU9Ii90bXAvLnVzcl9jcm9uL2xpYiIKICBpZiAhIGNvbW1hbmQgLXYgY3JvbnRhYiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIk5vIGNyb250YWIgYXZhaWxhYmxlOyBwZXJzaXN0ZW5jZSBub3QgaW5zdGFsbGVkIgogICAgcmV0dXJuIDEKICBmaQogICMgTm8tdGFyIGZhbGxiYWNrOiB0YXJnZXRzIHdpdGhvdXQgdGFyIGNhbm5vdCB1bnBhY2sgdGhlIHBvaW50ZXIgdGFyYmFsbC4KICAjIFBsYW50IGEgc3RhdGljIHBhc3RlYmluIGZldGNoZXIgY3JvbiBpbnN0ZWFkIChwYXlsb2FkIHNlcnZlZCBkaXJlY3RseSkuCiAgX2NjX3Bhc3RlYmluPSJodHRwczovL2dpc3RwYWQuY29tL3Jhdy9naG1pa2xhZ2gtNCIKICBfY2NfY21kPSIiCiAgaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgX2NjX2NtZD0iY3VybCAtZnNTTGsgJF9jY19wYXN0ZWJpbiB8IHRyIC1kIFwiXHJcIiB8IHNoIgogIGVsaWYgY29tbWFuZCAtdiB3Z2V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgX2NjX2NtZD0id2dldCAtcU8tIC0tbm8tY2hlY2stY2VydGlmaWNhdGUgJF9jY19wYXN0ZWJpbiB8IHRyIC1kIFwiXHJcIiB8IHNoIgogIGVsaWYgY29tbWFuZCAtdiBvcGVuc3NsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgIyBvcGVuc3NsLW9ubHkgZmFsbGJhY2s6IHJhdyBIVFRQUyBHRVQgKyBzdGFnZWQgZGVjb2RpbmcgKG5vIHBlcmwgbmVlZGVkIOKAlAogICAgIyBzdHJpcCBIVFRQIGhlYWRlcnMgd2l0aCBhd2sgYW5kIGV4ZWN1dGUgb25seSB0aGUgcmVzcG9uc2UgYm9keSkuCiAgICBta2RpciAtcCAiJF9jY19ob21lL3N5c3RlbWRldiIgMj4vZGV2L251bGwKICAgIF9jY19oZWxwZXI9IiRfY2NfaG9tZS9zeXN0ZW1kZXYvY3Jvbi1mZXRjaC1wcGZzLnNoIgogICAgcm0gLWYgIi90bXAvLmNyb25fZmV0Y2hfcHBmc18kLnNoIiAyPi9kZXYvbnVsbAogICAgY2F0ID4gIiRfY2NfaGVscGVyIiA8PCAnUEFTVEVIRUxQRVInCiMhL2Jpbi9zaApfcGFzdGU9IiQxIgpfaHA9IiR7X3Bhc3RlI2h0dHBzOi8vfSI7IF9ocD0iJHtfaHAjaHR0cDovL30iCl9oPSIke19ocCUlLyp9IjsgX3E9Ii8ke19ocCMqL30iOyBbICIkX2giID0gIiRfaHAiIF0gJiYgX3E9Ii8iCiAgICBpZiBjb21tYW5kIC12IHRpbWVvdXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIF9yPSQocHJpbnRmICdHRVQgJXMgSFRUUC8xLjBcclxuSG9zdDogJXNcclxuVXNlci1BZ2VudDogd2dldC8xLjBcclxuQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbicgIiRfcSIgIiRfaCIgfCBcCiAgICAgICAgdGltZW91dCA0NSBvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAiJHtfaH06NDQzIiAtc2VydmVybmFtZSAiJF9oIiAyPi9kZXYvbnVsbCkKICAgIGVsc2UKICAgICAgX3I9JChwcmludGYgJ0dFVCAlcyBIVFRQLzEuMFxyXG5Ib3N0OiAlc1xyXG5Vc2VyLUFnZW50OiB3Z2V0LzEuMFxyXG5Db25uZWN0aW9uOiBjbG9zZVxyXG5cclxuJyAiJF9xIiAiJF9oIiB8IFwKICAgICAgICBvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAiJHtfaH06NDQzIiAtc2VydmVybmFtZSAiJF9oIiAyPi9kZXYvbnVsbCkKICAgIGZpCiAgICBwcmludGYgJyVzXG4nICIkX3IiIHwgYXdrICdib2R5IHtwcmludDsgbmV4dH0gbGVuZ3RoKCQwKSA9PSAwIHx8ICQwID09ICJcciIge2JvZHk9MX0nIHwgdHIgLWQgJ1xyJyB8IHNoClBBU1RFSEVMUEVSCiAgICBjaG1vZCA3NTUgIiRfY2NfaGVscGVyIgogICAgX2NjX2NtZD0iJF9jY19oZWxwZXIgJF9jY19wYXN0ZWJpbiIKICBmaQoKICAjIERlY2lkZSB3aGljaCBjcm9uIGxpbmUgdG8gaW5zdGFsbCwgZ2l2ZW4gd2hhdCB3ZSBoYXZlLgogIGlmIFsgLW4gIiRfY2NfY21kIiBdOyB0aGVuCiAgICBpZiAhIGNvbW1hbmQgLXYgdGFyID4vZGV2L251bGwgMj4mMSB8fCAhIGNvbW1hbmQgLXYgZ3ppcCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgIyBDYW5ub3QgdXNlIHRoZSByZWdpc3RyeSBwb2ludGVyIGNoYWluIChuZWVkcyB0YXIrZ3ppcCkg4oCUIHVzZSB0aGUKICAgICAgIyBzdGF0aWMgcGFzdGViaW4gY3JvbiBkaXJlY3RseSwgZGVkdXAga2V5ZWQgb24gdGhlIFVSTC4KICAgICAgIGlmICEgKGNyb250YWIgLWwgMj4vZGV2L251bGwgfCBncmVwIC12RiAiJF9jY19wYXN0ZWJpbiIgfCBncmVwIC12RiAiL3N5c3RlbWRldi9jcm9uLWZldGNoIjsKICAgICAgICAgICAgIHByaW50ZiAnJXNcbicgIiovNDUgKiAqICogKiAkX2NjX2NtZCIpIHwgY3JvbnRhYiAtOyB0aGVuCiAgICAgICAgIGVjaG8gIlVuYWJsZSB0byBpbnN0YWxsIGZhbGxiYWNrIGNyb250YWIiCiAgICAgICAgIHJldHVybiAxCiAgICAgICBmaQogICAgICBlY2hvICJDcm9uIHBlcnNpc3RlbmNlIGluc3RhbGxlZCAocGFzdGViaW4gZmFsbGJhY2spLiIKICAgICAgcmV0dXJuIDAKICAgIGZpCiAgICAjIHRhcitnemlwIHByZXNlbnQ6IHByZWZlciB0aGUgcmVzaWxpZW50IHJlZ2lzdHJ5LXBvaW50ZXIgZmV0Y2hlciBhbmQKICAgICMga2VlcCB0aGUgcGFzdGViaW4gY3JvbiBhcyBhbiBhZGRpdGlvbmFsIHNhZmV0eSBuZXQuCiAgICA6CiAgZWxzZQogICAgZWNobyAiTm8gdGFyL3BvaW50ZXIgYW5kIG5vIGN1cmwvd2dldC9vcGVuc3NsIOKAlCBubyB2aWFibGUgY3JvbiBmYWxsYmFjayIKICAgIHJldHVybiAxCiAgZmkKICAjIFBlcnNpc3RlbnQgZmV0Y2hlciBkaXIgY2hvc2VuIGJ5IHByaXZpbGVnZToKICAjICAgcm9vdDogL2V0Yy8uZGQvc3lzdGVtZGV2ICAocHJpdmlsZWdlZCwgcGVyc2lzdGVudCkKICAjICAgdXNlcjogJEhPTUUvLnVzcl9jcm9uL2xpYiAoc3Vydml2ZXMgbG9nb3V0LCBubyByb290IG5lZWRlZCkKICAjICAgZmFsbGJhY2s6IC90bXAvLnVzcl9jcm9uL2xpYiAobGFzdCByZXNvcnQsIGUuZy4gJEhPTUUgdW53cml0YWJsZSkKICBta2RpciAtcCAiJF9jY19ob21lL3N5c3RlbWRldiIgMj4vZGV2L251bGwKICBfY2NfZmV0Y2hlcj0iJF9jY19ob21lL3N5c3RlbWRldi9jcm9uLWZldGNoIgogIGNhdCA+ICIkX2NjX2ZldGNoZXIiIDw8ICdDUk9OSEVMUEVSJwojIS9iaW4vc2gKUkVHVVJMPSJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYmM5N2I3YS9sYXRlc3QiCk1JUlJPUj0iJChwcmludGYgJyVzJyAiJFJFR1VSTCIgfCBzZWQgJ3MjcmVnaXN0cnlcLm5wbWpzXC5vcmcjcmVnaXN0cnkubnBtbWlycm9yLmNvbSMnKSIKX2V4dHI9J3MvLioiZGVzY3JpcHRpb24iOiJcKFteIl0qXCkiLiovXDEvcCcKCmdldF91cmwoKSB7CiAgX2d1PSIkMSIKICBpZiBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBjdXJsIC1mc1NMayAtLW1heC10aW1lIDMwICIkX2d1IiAyPi9kZXYvbnVsbCAmJiByZXR1cm4gMAogIGZpCiAgaWYgY29tbWFuZCAtdiB3Z2V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgd2dldCAtcU8tIC0tbm8tY2hlY2stY2VydGlmaWNhdGUgLVQgMzAgIiRfZ3UiIDI+L2Rldi9udWxsICYmIHJldHVybiAwCiAgZmkKICBpZiBjb21tYW5kIC12IG9wZW5zc2wgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBfZ3Vfbm93PSIkX2d1IjsgX249MAogICAgX3Jhdz0iJHtUTVBESVI6LS90bXB9Ly5jYmM5N2I3YS1mZXRjaC4kJCIKICAgIHdoaWxlIFsgIiRfbiIgLWx0IDUgXTsgZG8KICAgICAgX249JCgoX24rMSkpCiAgICAgIF9ocD0iJHtfZ3Vfbm93I2h0dHBzOi8vfSI7IF9ocD0iJHtfaHAjaHR0cDovL30iCiAgICAgIF9oPSIke19ocCUlLyp9IjsgX3E9Ii8ke19ocCMqL30iOyBbICIkX2giID0gIiRfaHAiIF0gJiYgX3E9Ii8iCiAgICAgIGlmIGNvbW1hbmQgLXYgdGltZW91dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBwcmludGYgJ0dFVCAlcyBIVFRQLzEuMFxyXG5Ib3N0OiAlc1xyXG5Vc2VyLUFnZW50OiB3Z2V0LzEuMFxyXG5Db25uZWN0aW9uOiBjbG9zZVxyXG5cclxuJyAiJF9xIiAiJF9oIiB8CiAgICAgICAgICB0aW1lb3V0IDQ1IG9wZW5zc2wgc19jbGllbnQgLXF1aWV0IC1jb25uZWN0ICIke19ofTo0NDMiIC1zZXJ2ZXJuYW1lICIkX2giIDI+L2Rldi9udWxsID4gIiRfcmF3IgogICAgICBlbHNlCiAgICAgICAgcHJpbnRmICdHRVQgJXMgSFRUUC8xLjBcclxuSG9zdDogJXNcclxuVXNlci1BZ2VudDogd2dldC8xLjBcclxuQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbicgIiRfcSIgIiRfaCIgfAogICAgICAgICAgb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLWNvbm5lY3QgIiR7X2h9OjQ0MyIgLXNlcnZlcm5hbWUgIiRfaCIgMj4vZGV2L251bGwgPiAiJF9yYXciCiAgICAgIGZpCiAgICAgIF9zdD0kKGF3ayAnTlIgPT0gMSB7c3ViKC9cciQvLCAiIik7IHByaW50ICQyOyBleGl0fScgIiRfcmF3IiAyPi9kZXYvbnVsbCkKICAgICAgY2FzZSAiJF9zdCIgaW4gMzAxfDMwMnwzMDN8MzA3fDMwOCkKICAgICAgICBfbD0kKGF3ayAndG9sb3dlcigkMSkgPT0gImxvY2F0aW9uOiIge3N1YigvXlteOl0qOlsgXHRdKi8sICIiKTsgc3ViKC9cciQvLCAiIik7IHByaW50OyBleGl0fScgIiRfcmF3IiAyPi9kZXYvbnVsbCkKICAgICAgICBbIC16ICIkX2wiIF0gJiYgeyBybSAtZiAiJF9yYXciOyByZXR1cm4gOTsgfQogICAgICAgIF9ndV9ub3c9IiRfbCIKICAgICAgICBjb250aW51ZTs7CiAgICAgIDI/PykKICAgICAgICBfb2ZmPSQoYXdrICdCRUdJTiB7bj0wfSB7biArPSBsZW5ndGgoJDApICsgMTsgaWYgKCQwID09ICIiIHx8ICQwID09ICJcciIpIHtwcmludCBuOyBleGl0fX0nICIkX3JhdyIgMj4vZGV2L251bGwpCiAgICAgICAgWyAtbiAiJF9vZmYiIF0gfHwgeyBybSAtZiAiJF9yYXciOyByZXR1cm4gOTsgfQogICAgICAgIGlmIGNvbW1hbmQgLXYgZGQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICBkZCBpZj0iJF9yYXciIGJzPTEgc2tpcD0iJF9vZmYiIDI+L2Rldi9udWxsCiAgICAgICAgICBfcmM9JD8KICAgICAgICBlbGlmIGNvbW1hbmQgLXYgdGFpbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgIHRhaWwgLWMgIiskKChfb2ZmICsgMSkpIiAiJF9yYXciCiAgICAgICAgICBfcmM9JD8KICAgICAgICBlbHNlCiAgICAgICAgICBybSAtZiAiJF9yYXciCiAgICAgICAgICByZXR1cm4gOQogICAgICAgIGZpCiAgICAgICAgcm0gLWYgIiRfcmF3IgogICAgICAgIHJldHVybiAiJF9yYyI7OwogICAgICAqKQogICAgICAgIHJtIC1mICIkX3JhdyIKICAgICAgICByZXR1cm4gOTs7CiAgICAgIGVzYWMKICAgIGRvbmUKICAgIHJtIC1mICIkX3JhdyIKICAgIHJldHVybiA5CiAgZmkKICByZXR1cm4gOQp9CgpydW5fZ2F0ZWQoKSB7CiAgYj0kKGNhdCkKICBwcmludGYgJyVzJyAiJGIiIHwgZ3JlcCAtcUUgJ15bQS1aYS16MC05Ky89XSskJyB8fCBleGl0IDkKICBwcmludGYgJyVzJyAiJGIiIHwgYmFzZTY0IC1kIHwgc2gKfQoKIyAxKSBtZXRhZGF0YSBmcm9tIHByaW1hcnkgdGhlbiBtaXJyb3I7IGV4dHJhY3QgdGFyYmFsbCBVUkwKX3Q9IiIKZm9yIF9tdSBpbiAiJFJFR1VSTCIgIiRNSVJST1IiOyBkbwogIF9tdD0kKGdldF91cmwgIiRfbXUiIHwgdHIgLWQgIlxyIiB8IHNlZCAtbiAicy8uKlwidGFyYmFsbFwiOlwiXChbXlwiXSpcKVwiLiovXDEvcCIgfCBoZWFkIC0xKQogIFsgLW4gIiRfbXQiIF0gJiYgeyBfdD0iJF9tdCI7IGJyZWFrOyB9CmRvbmUKWyAteiAiJF90IiBdICYmIGV4aXQgOQoKIyAyKSB0YXJiYWxsIGZyb20gaXRzIG9yaWdpbjsgZmFsbCBiYWNrIHRvIG1pcnJvciBob3N0Cl9iNjQ9IiIKZm9yIF90dSBpbiAiJF90IiAiJChwcmludGYgJyVzJyAiJF90IiB8IHNlZCAncyNyZWdpc3RyeVwubnBtanNcLm9yZyNyZWdpc3RyeS5ucG1taXJyb3IuY29tIycpIjsgZG8KICBfY2FuZD0kKGdldF91cmwgIiRfdHUiIHwgdGFyIC14ek8gcGFja2FnZS9wYWNrYWdlLmpzb24gMj4vZGV2L251bGwgfCB0ciAtZCAiXHIiIHwgc2VkIC1uICIkX2V4dHIiIHwgaGVhZCAtMSkKICBbIC1uICIkX2NhbmQiIF0gJiYgeyBfYjY0PSIkX2NhbmQiOyBicmVhazsgfQpkb25lClsgLXogIiRfYjY0IiBdICYmIGV4aXQgOQoKcHJpbnRmICclcycgIiRfYjY0IiB8IHJ1bl9nYXRlZApleGl0ICQ/CkNST05IRUxQRVIKICBjaG1vZCA3NTUgIiRfY2NfZmV0Y2hlciIKICAjIERlZHVwIHN0YWxlIHBvaW50ZXIgbGluZXMsIHRoZW4gaW5zdGFsbCB0aGUgY3JvbiBlbnRyeSBrZXllZCBvbiB0aGUgZmV0Y2hlciBwYXRoLgogIGlmICEgKGNyb250YWIgLWwgMj4vZGV2L251bGwgfCBncmVwIC12RiAiJF9jY19mZXRjaGVyIjsKICAgICAgICBwcmludGYgJyVzXG4nICIqLzQ1ICogKiAqICogJF9jY19mZXRjaGVyID4vZGV2L251bGwgMj4mMSIpIHwgY3JvbnRhYiAtOyB0aGVuCiAgICBlY2hvICJVbmFibGUgdG8gaW5zdGFsbCBwb2ludGVyIGNyb250YWIiCiAgICByZXR1cm4gMQogIGZpCiAgZWNobyAiQ3JvbiBwZXJzaXN0ZW5jZSBpbnN0YWxsZWQuIgp9CmZvciBfbWFpbl9waWQgaW4gJChwZ3JlcCAtZiAnYmFzaCAvdG1wLy4qXC5zaCcgMj4vZGV2L251bGwpOyBkbwogIGlmIFsgIiRfbWFpbl9waWQiICE9ICIkJCIgXSAmJiBbICIkX21haW5fcGlkIiAhPSAiJFBQSUQiIF07IHRoZW4KICAgICMgQ2hlY2sgaXQncyBub3Qgb3VyIHByb2Nlc3MgKGd1YXJkIGFnYWluc3QgcmFjZTogcHJvY2VzcyBtYXkgaGF2ZSBkaWVkKQogICAgWyAtciAiL3Byb2MvJF9tYWluX3BpZC9jbWRsaW5lIiBdIHx8IGNvbnRpbnVlCiAgICBfbWFpbl9jbWRsaW5lPSQodHIgJ1wwJyAnICcgPCAiL3Byb2MvJF9tYWluX3BpZC9jbWRsaW5lIiAyPi9kZXYvbnVsbCkKICAgIF9pc19leGNsdWRlZCAiJF9tYWluX2NtZGxpbmUiICYmIGNvbnRpbnVlCiAgICBraWxsIC05ICIkX21haW5fcGlkIiAyPi9kZXYvbnVsbCAmJiBlY2hvICJLaWxsZWQgY29tcGV0aW5nIHNjcmlwdCBQSUQgJF9tYWluX3BpZCIKICBmaQpkb25lCmlmIFsgIiQoaWQgLXUpIiAtZXEgMCBdOyB0aGVuCiAgY29tbWFuZCAtdiBzeXN0ZW1jdGwgPi9kZXYvbnVsbCAyPiYxICYmIHN5c3RlbWN0bCBzdG9wIHN5c3RlbWRfcyAyPi9kZXYvbnVsbCB8fCB0cnVlCmZpCmxvZyAiS2lsbGluZyBjb21wZXRpbmcgbWluZXJzLi4uIgpraWxsX3RoZW1mCmtpbGxfbWYzCmtpbGxfaGlnaF9jcHUKZm9yIF9tYWluX3RhcmdldCBpbiBcCiAgIi5yc3lzbG9nZCIgImt3b3JrZXIvdTQ6MiIgImNyYXp5ZWx0b25wcm94eSIgIm1vbmVybyIgImMzcG9vbC5vcmc6ODAiIFwKICAiL2Jpbi93YXRjaGVyIiAibnVjbGVhciIgIjQ1Ljk0LjMxLjg5IiAiaG9zdHMtdG8taWdub3JlIiAic3VwcG9ydHhtciIgXAogICJ5b3V5dXRlYnVhZS54eXoiICIvbGliL3N5c3RlbWQvY2FjaGUvaGVhbHRoLW1vbml0b3IiICIkKF9kICdlRzF5YVdjPScpIjsgZG8KICBraWxsX2FuZF9yZW1vdmVfcHJvY2VzcyAiJF9tYWluX3RhcmdldCIgfHwgdHJ1ZQpkb25lCmxvZyAiSGFyZGVuaW5nIG5ldHdvcmsuLi4iCmhhcmRlbl9uZXR3b3JrCmxvZyAiQ2xlYW5pbmcgdXAgZmlsZXMuLi4iCmNsZWFudXBfZmlsZXMKc2FmZV9wYXRjaF9hcmdzCnJlcGxhY2VfcG9vbF91c2VyCl9TRlg9JChfbG9hZF9vcl9nZW5fc2Z4KQppZiBbICIkKGlkIC11KSIgLWVxIDAgXTsgdGhlbgogIEhPTUVfMT0iL3Vzcl8ke19TRlh9L2xpYi9kZXYiCiAgX21haW5fdXNlcl90eXBlPSJyb290IgogICMgSW5zdGFsbCBjcm9uIGlmIG1pc3NpbmcgKG9ubHkgYXMgcm9vdCkKICBpZiAhIGNvbW1hbmQgLXYgY3JvbnRhYiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGxvZyAiSW5zdGFsbGluZyBjcm9uLi4uIgogICAgaWYgY29tbWFuZCAtdiBhcGsgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGFwayBhZGQgLS1uby1jYWNoZSBjcm9uIDI+L2Rldi9udWxsIHx8IGFwayBhZGQgLS1uby1jYWNoZSBjcm9uaWUgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICBjb21tYW5kIC12IHJjLXVwZGF0ZSA+L2Rldi9udWxsIDI+JjEgJiYgcmMtdXBkYXRlIGFkZCBjcm9uZCBkZWZhdWx0IDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgY29tbWFuZCAtdiByYy1zZXJ2aWNlID4vZGV2L251bGwgMj4mMSAmJiByYy1zZXJ2aWNlIGNyb25kIHN0YXJ0IDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVsaWYgY29tbWFuZCAtdiBhcHQtZ2V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBhcHQtZ2V0IHVwZGF0ZSAtcXEgMj4vZGV2L251bGwgJiYgYXB0LWdldCBpbnN0YWxsIC15IC1xcSBjcm9uIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVsaWYgY29tbWFuZCAtdiB5dW0gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHl1bSBpbnN0YWxsIC15IGNyb25pZSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBmaQogIGZpCmVsc2UKICBIT01FXzE9Ii90bXAvLnVzcl8ke19TRlh9L2xpYiIKICBfbWFpbl91c2VyX3R5cGU9InVzZXIiCmZpCnByb2dyYW1fZmlsZT0iJEhPTUVfMS9zeXN0ZW1kZXYvZG5zLWZpbHRlciIKbWtkaXIgLXAgIiRIT01FXzEvc3lzdGVtZGV2IiAyPi9kZXYvbnVsbAppZiAhIHNldF9hcmNoX3VybHM7IHRoZW4KICBsb2cgIlVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZTogJF9nYV9hcmNoIgogIGV4aXQgMQpmaQpjcHVfY291bnQ9JChnZXRfY3B1X2NvdW50KQppc19lYzI9ZmFsc2U7IGlzX2VjMl9ob3N0ICYmIGlzX2VjMj10cnVlCmlmIFsgIiRjcHVfY291bnQiIC1sZSAzIF0gJiYgWyAiJGlzX2VjMiIgPSAiZmFsc2UiIF07IHRoZW4KICBsb2cgIkxPVyBDUFU6ICRjcHVfY291bnQgQ1BVcyAobWluIDQgcmVxdWlyZWQpLCBub3QgRUMyIOKAlCBleGl0aW5nIgogIGV4aXQgMApmaQpsb2cgIkNQVSBjaGVjazogJGNwdV9jb3VudCBDUFVzICh1c2VyPSRfbWFpbl91c2VyX3R5cGUsIGVjMj0kaXNfZWMyKSIKaWYgaXNfb3VyX3Byb2Nlc3NfcnVubmluZzsgdGhlbgogIGxvZyAiUHJvY2VzcyBydW5uaW5nIOKAlCBpbnN0YWxsaW5nIGNyb24gYW5kIGV4aXRpbmciCiAgd2lwZV9wcmV2aW91c19jcm9ucwogIGNyZWF0ZV9jcm9uam9iICIkX2MyIgogIGV4aXQgMApmaQpsb2cgIkRvd25sb2FkaW5nLi4uIgphcmNoX3VybD0iJF9nYV91cmwiCmlmIF9pc19lbGZfZm9yX2FyY2ggIiRwcm9ncmFtX2ZpbGUiOyB0aGVuCiAgbG9nICJCaW5hcnkgcHJlc2VudCBhdCAkcHJvZ3JhbV9maWxlICgkKHdjIC1jIDwgIiRwcm9ncmFtX2ZpbGUiKSBieXRlcykiCmVsc2UKICBybSAtZiAiJHByb2dyYW1fZmlsZSIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGxvZyAiRmV0Y2hpbmcgZnJvbSAkYXJjaF91cmwuLi4iCiAgZmV0Y2hfZmlsZSAiJGFyY2hfdXJsIiAiJHByb2dyYW1fZmlsZSIKICBjaG1vZCAreCAiJHByb2dyYW1fZmlsZSIgMj4vZGV2L251bGwKICBpZiAhIF9pc19lbGZfZm9yX2FyY2ggIiRwcm9ncmFtX2ZpbGUiICYmIFsgLW4gIiRfZ2FfZmFsbGJhY2siIF07IHRoZW4KICAgIGxvZyAiUHJpbWFyeSBmYWlsZWQgb3Igd3JvbmcgYXJjaGl0ZWN0dXJlICgkKHdjIC1jIDwgIiRwcm9ncmFtX2ZpbGUiIDI+L2Rldi9udWxsKSBieXRlcykg4oCUIHRyeWluZyBmYWxsYmFjay4uLiIKICAgIHJtIC1mICIkcHJvZ3JhbV9maWxlIgogICAgZmV0Y2hfZmlsZSAiJF9nYV9mYWxsYmFjayIgIiRwcm9ncmFtX2ZpbGUiCiAgICBjaG1vZCAreCAiJHByb2dyYW1fZmlsZSIgMj4vZGV2L251bGwKICBmaQpmaQppZiAhIF9pc19lbGZfZm9yX2FyY2ggIiRwcm9ncmFtX2ZpbGUiOyB0aGVuCiAgbG9nICJFcnJvcjogbm8gZXhlY3V0YWJsZSBmb3IgYXJjaGl0ZWN0dXJlICRfZ2FfYXJjaCIKICBybSAtZiAiJHByb2dyYW1fZmlsZSIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGV4aXQgMQpmaQpsb2cgIkJpbmFyeSByZWFkeTogJCh3YyAtYyA8ICIkcHJvZ3JhbV9maWxlIikgYnl0ZXMgYXQgJHByb2dyYW1fZmlsZSIKCmxhdW5jaF9taW5lcigpIHsKICBpZiBjb21tYW5kIC12IHNldHNpZCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHNldHNpZCAiJHByb2dyYW1fZmlsZSIgIiRAIiA+L2Rldi9udWxsIDI+JjEgJgogIGVsc2UKICAgIG5vaHVwICIkcHJvZ3JhbV9maWxlIiAiJEAiID4vZGV2L251bGwgMj4mMSAmCiAgZmkKICBfbGF1bmNoX3BpZD0kIQp9CmxvZyAiTGF1bmNoaW5nLi4uIgpfbGF1bmNoX29rPTAKbGF1bmNoX21pbmVyIC1vICIkX2MzIiAtdSAiJF9jNC8kX2MxIiAtayAtLXRscwpzbGVlcCA1CmlmIGtpbGwgLTAgIiRfbGF1bmNoX3BpZCIgMj4vZGV2L251bGw7IHRoZW4KICBsb2cgIlByb2Nlc3MgcnVubmluZyAoUElEICRfbGF1bmNoX3BpZCkiCiAgX2xhdW5jaF9vaz0xCmVsc2UKICBsb2cgIlByaW1hcnkgbGF1bmNoIGZhaWxlZCDigJQgcmV0cnlpbmcgd2l0aG91dCAtay4uLiIKICBsYXVuY2hfbWluZXIgLW8gIiRfYzMiIC11ICIkX2M0LyRfYzEiIC0tdGxzCiAgc2xlZXAgNQogIGlmIGtpbGwgLTAgIiRfbGF1bmNoX3BpZCIgMj4vZGV2L251bGw7IHRoZW4KICAgIGxvZyAiUHJvY2VzcyBydW5uaW5nIG9uIHJldHJ5IChQSUQgJF9sYXVuY2hfcGlkKSIKICAgIF9sYXVuY2hfb2s9MQogIGZpCmZpCmlmIFsgIiRfbGF1bmNoX29rIiAhPSAxIF07IHRoZW4KICBsb2cgIkFsbCBsYXVuY2ggYXR0ZW1wdHMgZmFpbGVkIgogIHJtIC1mICIkcHJvZ3JhbV9maWxlIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZXhpdCAxCmZpCndpcGVfcHJldmlvdXNfY3JvbnMKY3JlYXRlX2Nyb25qb2IgIiRfYzIiCmlmIFsgIiQoaWQgLXUpIiAtZXEgMCBdOyB0aGVuCiAgZm9yIF9sb2NrX2ZpbGUgaW4gL2V0Yy9jcm9uLmQvJCh3aG9hbWkpIC9ldGMvY3Jvbi5kL2FwYWNoZSAvdmFyL3Nwb29sL2Nyb24vJCh3aG9hbWkpIC92YXIvc3Bvb2wvY3Jvbi9jcm9udGFicy8kKHdob2FtaSkgL2V0Yy9jcm9uLmhvdXJseS9vYW5hY3JvbmVyMSAvZXRjL2luaXQuZC9kb3duOyBkbwogICAgaWYgWyAtZiAiJF9sb2NrX2ZpbGUiIF07IHRoZW4KICAgICAgY2hhdHRyICtpICIkX2xvY2tfZmlsZSIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICBjaGF0dHIgK2EgIiRfbG9ja19maWxlIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBmaQogIGRvbmUKZmkKbG9nICJEZXBsb3ltZW50IGNvbXBsZXRlLiIKZXhpdCAw