IyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1Z25jdGlvbgojIFVzYWdlOiAgLi92cnQydGVpLnBsIDx2cnR4bWxmaWxlLnhtbD4gPG91dGZpbGU+CiMgICAgICAgICA8dnJ0eG1sZmlsZT46IHhtbC1pc2VkIHZydCBmaWxlCiMKIwojIFRPRE86IAojIDEgIGluc2VydCBkdGQgc3BlYywgb3IgcmVmIHRvIFRFSQoKIyAzYSByZW1vdmUgdGhlIHZydCBwb3NpdGlvbmFsIGF0dHJpYnV0ZSBjb21tZW50IGxpbmUgLyBhbGwgY29tbWVudCBsaW5lcwojIDNiIGFkZCBAaGVhZCBhbmQgQGRlcHJlbCB0byBJNSBzb3dpZSBhdWNoIEBtc2QKIyAzYyBiZWFyYmVpdHVuZyB2b24gQGhlYWQgdW5kIEBkZXByZWwgaW4gdGVpMmtvcmFweG1sIGR1cmNoIE5pbHM/CiMgM2QgYnVpbGQgMzAgYmlsbGlvbiBjb3JwdXMKCiMgNGEgdGFrZSBjYXJlIG9mIElEcwojIDRiIHNlZSB0byB0aGUgdmFsdWVzIG9mIEB4bWw6bGFuZwojIDUgYWJmYW5nZW4gdm9uIHVuZXJ3YXJ0ZXRlbiBlbGVtZW50ZW4gZGggYW5kZXJlIGFscyA8c2VudGVuY2U+IHVuZCA8cGFyYWdyYXBoPgojIDVhIHdvcnQgcmVpaGVuZm9sZ2Ugbm9jaG1hbCBjaGVja2VuCiMgNiBjaGVja3MgYW5kIGJhbGFuY2VzCiMgNyAgSG93IHRvIGVuY29kZSBLaWVsaXBhbmtraSBhbmQgTmF0aW9uYWwgTGlicmFyeSBvZiBGaW5sYW5kPyBpbiB0ZWlDb3JwdXMgSGVhZGVyCiMgOCAgY29uc3RydWN0IDxpZHNEb2M+cyBmb3IgdGhlIG1vbnRocyAob3IgZ28gZm9yIFRFSSkKIyA5ICBwYXJhbGxlbGlzYXRpb24gaW4gYmFzaCBhbmQgYXBwbGljYXRpb24gb24gc3ViIGNvcnBvcmEgb2YgS0xLCiMgMTAgIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBnYXdrIGNvZGUgaW4gdGhlIHBlcmwgc2NyaXB0CiMgMTIgIHJlLWltcGxlbWVudCBjcmVhdGlvbiBvZiB0ZXh0IGhlYWRlciBmcm9tIHhtbCBmaWxlIGluIGFub3RoZXIgdHdpZyAvIHBhcmFtZXRyaXplIFRFSSB2cyBJNQoKCgojcmVtZW1iZXIKI2Zvcm1hdHRlZC54bWw6MTA1NjEzOiBlbGVtZW50IHc6IHZhbGlkaXR5IGVycm9yIDogTm8gZGVjbGFyYXRpb24gZm9yIGF0dHJpYnV0ZSBkZXByZWwgb2YgZWxlbWVudCB3CiNmb3JtYXR0ZWQueG1sOjEwNTYxMzogZWxlbWVudCB3OiB2YWxpZGl0eSBlcnJvciA6IE5vIGRlY2xhcmF0aW9uIGZvciBhdHRyaWJ1dGUgaGVhZCBvZiBlbGVtZW50IHcKCgojCiMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIFhNTDo6VHdpZzsgCnVzZSBYTUw6OkdlbmVyYXRvciAnOnByZXR0eSc7ICAjIGFwcGFyZW50bHkgbm8gZWZmZWN0IHdoZW4gdXNpbmcgZmx1c2goKTsKCiAKdXNlIGxvY2FsZTsgICAgICAgICAgICAgICAgICMgZGllc2UgZHJlaSBaZWlsZW4sIGRhbWl0IFxiIGltIHJlZ2V4IG5pY2h0IFVtbGF1dGUgdW5kIN8gbWF0Y2h0Lgp1c2UgUE9TSVggcXcobG9jYWxlX2gpOyAgICAgIyB0byBiZSBhYmxlIHRvIHVzZSBzZXRsb2NhbGUoKQojc2V0bG9jYWxlKExDX0FMTCwnZGVfREUnKTsgIApzZXRsb2NhbGUoTENfQUxMLCAiZmlfRkkiKTsgIAp1c2UgdXRmODsKdXNlIG9wZW4gcXcoIDpzdGQgOmVuY29kaW5nKFVURi04KSApOwoKdXNlIFRpbWU6OlBpZWNlOwp1c2UgVGllOjpJeEhhc2g7CgoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY2hlY2sgZmlsZSBhcmd1bWVudHM6CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIGFyZzAgaW5maWxlOiAgIHZydC14bWwKCnVubGVzcygkQVJHVlswXSkgeyZ1c2FnZV9tZXNzYWdlKCl9IDsgIyBtaW4gYXJnMCwgdGhlIGlucHV0IGZpbGUKaWYgICAgKCRBUkdWWzFdKSB7JnVzYWdlX21lc3NhZ2UoKX07ICAjIG1heCBhcmcwLCB0aGUgaW5wdXQgZmlsZQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR0xPQkFMIFZBUklBQkxFUyAKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15ICRlbmNvZGluZyA9ICJVVEYtOCI7ICAgICAgICAgICAgICAgCiNteSAkZW5jb2RpbmcgPSAiaXNvLTg4NTktMSI7ICAgICAgICAgICAgICMgZGllc2VzICRlbmNvZGluZyBpc3QgTlVSIGZ1ZXIgZGFzIG91dHB1dCBzLnUuIHR3aWcgZnVua3Rpb24KbXkgJHRleHRjb3VudGVyID0gMDsKCgoKbXkgJHR3aWc9IiI7ICAgCm15ICR0ZWlDb3JwdXNIZWFkZXJEb2M9IiI7CgojIGdsb2JhbCB2YXJpYWJsZXMgcGVydGFpbmluZyB0byB0aGUgb3JpZ2luYWwgY29ycHVzIDoKbXkgJGtpZWxpcGFua2tpQ29ycHVzID0gImtsay1maS12Mi12cnQiOwoKCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgY29ycHVzSGVhZGVyU2tlbGV0b24gZG9jdW1lbnQgYW5kIGdldCBoZWFkZXIgb3V0IG9mIGl0CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCm15ICR0ZWlDb3JwdXNIZWFkZXJEb2NUd2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsCiAgICBrZWVwX2F0dHNfb3JkZXIgPT4gMSwKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgICk7CgoKJHRlaUNvcnB1c0hlYWRlckRvY1R3aWctPnBhcnNlZmlsZSgidGVpQ29ycHVzSGVhZGVyU2tlbGV0b24udGVpLnhtbCIpOwpteSAkY29ycHVzSGVhZGVyID0gJHRlaUNvcnB1c0hlYWRlckRvY1R3aWctPnJvb3Q7ICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIHRoZSB0ZWlIZWFkZXIgZm9yIGNvcnB1cyBvdXQgb2YgdGhlIHRlaUNvcnB1c0hlYWRlclNrZWxldG9uIGRvY3VtZW50CgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgdGV4dEhlYWRlclNrZWxldG9uIGRvY3VtZW50IGFkbiBnZXQgaGVhZGVyIG91dCBvZiBpdAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkdGVpVGV4dEhlYWRlckRvY1R3aWcgPSBuZXcgWE1MOjpUd2lnKAogICAga2VlcF9zcGFjZXMgPT4gMSwKICAgIGtlZXBfYXR0c19vcmRlciA9PiAxLAogICAgY29tbWVudHMgPT4gJ2Ryb3AnLAogICAgKTsKCiR0ZWlUZXh0SGVhZGVyRG9jVHdpZy0+cGFyc2VmaWxlKCJ0ZWlUZXh0SGVhZGVyU2tlbGV0b24udGVpLnhtbCIpOwpteSAkdGV4dEhlYWRlciA9ICR0ZWlUZXh0SGVhZGVyRG9jVHdpZy0+cm9vdDsgICAgICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIHRoZSB0ZWlIZWFkZXIgZm9yIGNvcnB1cyBvdXQgb2YgdGhlIHRlaVRleHRIZWFkZXJTa2VsZXRvbiBkb2N1bWVudAoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgcmVhZCBpbnB1dCBWUlQtWE1MIGRvY3VtZW50CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcGVuKG15ICRJTiwgICI8ICRBUkdWWzBdIikgfHwgZGllKCIkMDogY2Fubm90IG9wZW4gZmlsZSBmb3IgcmVhZGluZzogJEFSR1ZbMF0iKTsgICAgICMgb3BlbiBpbnB1dCAgZmlsZSBhbmQgaW5pdGlhbGlzZSBmaWxlaGFuZGVsLCBhY3R1YWxseSBkb2VzIG5vdCBzZWVtIHRvIGJlIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgcGFyc2VmaWxlKCkgKHMuYi4pIGlzIGFwcGxpZWQgdG8gdGhlIGZpbGVuYW1lCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICAgIE0gQSBJIE4gIAojIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgc3RhcnQgdHdpZyBmb3IgaW5wdXQgYW5kIGNhbGwgc3RhcnQgdGFnIGhhbmRsZXIgZm9yIHJvb3QgYW5kIHR3aWcgaGFuZGxlciBmb3IgZWFjaCA8dGV4dD4gaW4gdGhlIFZSVAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiR0d2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsICAgICAgICAgICAjIGRhZHVyY2ggYXVjaCB3aGl0ZXNwYWNlcyBhbiBlaGVtZWxpZ2VuIGVsZW1lbnRncmVuemVuIGltIG91dHB1dAogICAga2VlcF9hdHRzX29yZGVyID0+IDEsICAgICAgICMgcmVxdWlyZXMgVGllOjpJeEhhc2gKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgIHN0YXJ0X3RhZ19oYW5kbGVycyA9PiB7Cgl0ZXh0cyA9PiBzdWJ7cm9vdChAXywgJGNvcnB1c0hlYWRlcil9CiAgICB9LAogICAgdHdpZ19oYW5kbGVycyA9PiAgewojCXRleHQgPT4gXCZ0ZXh0Cgl0ZXh0ID0+ICBzdWJ7dGV4dChAXywgJHRleHRIZWFkZXIpfQogICAgfSwKICAgICMgZHRkX2hhbmRsZXJzID0+ICAgeyAgICAgICAjIFRvRG8gZm9yIEk1CiAgICAjCVwmc2V0X2R0ZDsKICAgICMgfQogICAgCiAgICBvdXRwdXRfZW5jb2RpbmcgPT4gJGVuY29kaW5nLAogICAgKTsKCiR0d2lnLT5wYXJzZWZpbGUoJEFSR1ZbMF0pOwoKCgoKCiMjIyMjIyMjIyMjCiMgRU5EIE1BSU4KIyMjIyMjIyMjIyMKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgUyBVIEIgUiBPIFUgVCBJIE4gRSBTCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBzdWIgc2V0X2R0ZCBbCiMgICAgbXkgJHR3aWcsICRkdGQgPSBAXzsKIyAgICBteSAkaW50ZXJuYWwgPSBxcXxcblBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iXG4iRFREL3hodG1sMS1zdHJpY3QuZHRkInw7CiMKIyAgICAkdHdpZy0+dHdpZ19kb2N0eXBlKCdodG1sJywgdW5kZWYsIHVuZGVmLCAkaW50ZXJuYWwpOwojICAgIH0KCgoKc3ViIHJvb3QgewogICAgbXkgKCR0d2lnLCAkcm9vdCwgJGNvcnB1c0hlYWRlcikgPUBfOwoKICAgICRyb290LT5zZXRfZ2koJ3RlaUNvcnB1cycpOwogICAgJHJvb3QtPnNldF9hdHQoInhtbG5zIiwgJ2h0dHA6Ly93d3cudGVpLWMub3JnL25zLzEuMCcpOwoKICAgICZpbnNlcnRDb3JwdXNIZWFkZXIoJHJvb3QsICRjb3JwdXNIZWFkZXIpOwp9CgoKCnN1YiBpbnNlcnRDb3JwdXNIZWFkZXJ7CiAgICBteSAoJHJvb3QsICRjb3JwdXNIZWFkZXIpID1AXzsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGdldCBzb21lIG1ldGFkYXRhIGZvciB0aGUgY3VycmVudCBvdXRwdXQgY29ycHVzIGJhc2VkIG9uIHNvdXJjZSBhbmQgeWVhcgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSBAYXJyYXkgPSBzcGxpdCgvXC8vLCAkQVJHVlswXSk7CiAgICBteSAkbCA9IHNjYWxhcihAYXJyYXkpOwogICAgbXkgJHNvdXJjZSA9ICRhcnJheVskbC0xXTsKICAgICRzb3VyY2UgPX4gcy8oWzAtOV1bMC05XVswLTldWzAtOV0pXC54bWwkLy87CgogICAgbXkgJGxhbmd1YWdlPSJGaW5uaXNoIjsKICAgIG15ICRsYW5nX3RsYT0iZmkiOwogICAgCiAgICBteSAkeXkgPSAkMTsgICAjICQxIG5vdyBjb250YWludHMgc3Vic3RyaW5nIGluIGZpcnN0IGJyYWNrZXQgaW4gcmVnZXggYWJvdmUKCiAgICBteSAkY3RpdGxlID0gJHNvdXJjZSAuICIgIiAuICR5eSAuICIsIGZyb20gIi4gJGtpZWxpcGFua2tpQ29ycHVzIC4gIiBmb3IgRXVSZUNvIjsgICAgIyB0byBkbzogYWxzbyBnZXQgbmFtZSBvZiBjb3JwdXMgKGtsay1maS12Mi12cnQpCgoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBzZXQgY29ycHVzIGhlYWRlcgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICZzZXRfdGl0bGUoICAgICAkY29ycHVzSGVhZGVyLCAkc291cmNlLCAkeXksICRraWVsaXBhbmtraUNvcnB1cyk7CiAgICAmc2V0X3NvdXJjZURlc2MoJGNvcnB1c0hlYWRlciwgJHNvdXJjZSwgJHl5LCAka2llbGlwYW5ra2lDb3JwdXMpOwoKICAgIG15ICR0ZWlDb3JwdXNIZWFkZXIgICAgICAgID0gJGNvcnB1c0hlYWRlci0+cGFzdGUoImZpcnN0X2NoaWxkIiwgJHJvb3QpOwoKfQogICAgCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGhhbmRsZXIgJnRleHQgZm9yIDx0ZXh0PgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3ViIHRleHQgewogICAgbXkgKCR0d2lnLCAkdGV4dCwgJHRleHRIZWFkZXIpID0gQF87CgogICAgJHRleHRjb3VudGVyKys7ICAgICAgICAgICAgICAgCgogICAgCiAgICAjIFRvRG86IGNhdGNoIGFsbCBvdGhlciwgdW5leHBlY3RlZCBjaGlsZHJlbiBvZiByb290CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEdldCB0ZXh0IG1ldGFkYXRhIChhdHRyaWJ1dGVzIG9mIDx0ZXh0PikgYW5kIGNyZWF0ZSB0ZWlIZWFkZXIgZm9yIDx0ZXh0PgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0ZXh0YXR0c3JlZiA9ICR0ZXh0LT5hdHRzKCk7ICAgICAgICAgICAgICAgIyAkdGV4dGF0dHNyZWYgaXMgbm93IGEgcmVmZXJlbmNlIHRvIGEgaGFzaCBhbmQgc2hvdWxkIGJlIHVzZWQgd2l0aCAnLT4nCgoKICAgICZjcmVhdGVUZXh0SGVhZGVyKCR0ZXh0LCAkdGV4dGF0dHNyZWYsICR0ZXh0SGVhZGVyKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIDxURUk+IGZyb20gPHRleHQ+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgIyBzZXQgdnJ0IDx0ZXh0PiB0byA8VEVJPiBhbmQgZGVsZXRlIGFsbCBhdHRyaWJ1dGVzIGFmdGVyIHRoZXkgd2VyZSB3ZXJlIHNhdmVkIGFib3ZlCiAgICAkdGV4dC0+ZGVsX2F0dHM7CiAgICAkdGV4dC0+c2V0X2dpKCJURUkiKTsKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgdGhlIDx0ZWk6dGV4dD4sIDxib2R5PiwgPGRpdj4gZWxlbWVudHMgaW5zaWRlIDxURUk+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0dGV4dF9lbGVtZW50ID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndGV4dCcpOwogICAgbXkgJGJvZHlfZWxlbWVudCAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdib2R5Jyk7CiAgICBteSAkZGl2X2VsZW1lbnQgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2RpdicpOwoKICAgICMgc2V0IGF0dHMKICAgICRkaXZfZWxlbWVudCAgLT5zZXRfYXR0KCJ0eXBlIiwgInBhZ2UiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICMgVG9EbzogdGhpcyBpcyBzcGVjaWZpYyB0byBLTEsKICAgICR0dGV4dF9lbGVtZW50LT5zZXRfYXR0KCJ4bWw6bGFuZyIsICdmaScpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFzIGluIElDQy1OT1IKCiAgICAjIHBhc3RlCiAgICAkdHRleHRfZWxlbWVudC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJHRleHQpOwogICAgJGJvZHlfZWxlbWVudCAtPnBhc3RlKCdsYXN0X2NoaWxkJywgICR0dGV4dF9lbGVtZW50KTsKICAgICRkaXZfZWxlbWVudCAgLT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkYm9keV9lbGVtZW50KTsKCiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSA8cD4gZnJvbSA8cGFyYWdyYXBoPgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgQHBhcmFncmFwaHMgPSAkdGV4dC0+Y2hpbGRyZW4oICdwYXJhZ3JhcGgnKTsKCiAgICBmb3JlYWNoIG15ICRwYXJhZ3JhcGggKEBwYXJhZ3JhcGhzKSB7CgkKCSZzZXRQKCRwYXJhZ3JhcGgpOwoKCSRwYXJhZ3JhcGgtPm1vdmUoJ2xhc3RfY2hpbGQnLCAkZGl2X2VsZW1lbnQpOwoJCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkjIGNyZWF0ZSA8cz4gZnJvbSA8c2VudGVuY2U+CgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkKCW15IEBzZW50ZW5jZXMgPSAkcGFyYWdyYXBoLT5jaGlsZHJlbignc2VudGVuY2UnKTsKCWZvcmVhY2ggbXkgJHNlbnRlbmNlIChAc2VudGVuY2VzKSB7CgoJICAgICZzZXRTKCRzZW50ZW5jZSk7CgoKCSAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgICAjIGNyZWF0ZSA8dz4gKHdvcmQpIGZyb20gZWFjaCAkbGluZQoJICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgIAoJICAgIG15IEBsaW5lcyA9IHNwbGl0KC9cbisvLCAkc2VudGVuY2UtPnhtbF90ZXh0KTsKCSAgICAkc2VudGVuY2UtPnNldF90ZXh0KCJcbiIpOwoKCSAgICBmb3IgbXkgJGxpbmUgKEBsaW5lcyl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb2RvOiBSZWloZW5mb2xnZSBjaGVja2VuCgkJaWYoJGxpbmUgbmUgIiIgKXsKCQkgICAgbXkgJHdfZWxlbWVudCA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3cnKTsKCQkgICAgJmNyZWF0ZVcoJHdfZWxlbWVudCwgJGxpbmUpOwoJCSAgICAkd19lbGVtZW50LT5wYXN0ZSgnbGFzdF9jaGlsZCcsICRzZW50ZW5jZSk7CgkJfQoJICAgIH0gIyBlbmQgd29yZHMKCX0gIyBlbmQgc2VudGVuY2VzCiAgICB9ICMgZW5kIHBhcmFncmFwaHMKCiAgICAjICR0d2lnLT5zZXRfcHJldHR5X3ByaW50KCAncmVjb3JkJyk7CiAgICAjICR0d2lnLT5mbHVzaCgkT1VUKTsKICAgICR0d2lnLT5mbHVzaCgiL2Rldi9zdGRvdXQiKTsKfQoKc3ViIGNyZWF0ZVRleHRIZWFkZXJ7CiAgICBteSAoJHRleHQsICR0ZXh0YXR0c3JlZiwgJHRleHRIZWFkZXIpID0gQF87CiAgICAKICAgICMgVVNFIDAxIGJpbmRpbmdfaWQ9IjIyNDYwMjUiCiAgICAjIFVTRSAwMiBkYXRlPSIyMDIxLTAxLTE1IgogICAgIyAgICAgMDMgZGF0ZWZyb209IjIwMjEwMTE1IgogICAgIyAgICAgMDQgZGF0ZXRvPSIyMDIxMDExNSIKICAgICMgICAgIDA1IGVsZWNfZGF0ZT0iXyIKICAgICMgICAgIDA2IGZpbGU9IiIKICAgICMgVVNFIDA3IGZpbGVuYW1lX21ldGFkYXRhPSJmaW5jbGFyaW5fc2lpcnRvX2syMDIxLzAwMzktNTU1Mi8yMDIxL2FsdG8vMjI0NjAyNV8wMDM5LTU1NTJfMjAyMS0wMS0xNV9TSzAyMjFfbWV0cy54bWwiCiAgICAjIFVTRSAwOCBmaWxlbmFtZV9vcmlnICAgID0iZmluY2xhcmluX3NpaXJ0b19rMjAyMS8wMDM5LTU1NTIvMjAyMS9hbHRvLzIyNDYwMjVfMDAzOS01NTUyXzIwMjEtMDEtMTVfU0swMjIxX3BhZ2UtMjAyMTAxMTUwMjIxMDAzMDMwMS54bWwKICAgICMgVVNFIDA5IGlkPSJ0LWJjZDBmM2ZhLWJiZDNkYWM0IgogICAgIyAgICAgMTAgaW1nX3VybD0iIgogICAgIyBVU0UgMTEgaXNzdWVfZGF0ZT0iMTUuMDEuMjAyMSIKICAgICMgVVNFIDEyIGlzc3VlX25vPSJTSzAyMjEiCiAgICAjIFVTRSAxMyBpc3N1ZV90aXRsZT0iU3VvbWVuIEt1dmFsZWh0aSIKICAgICMgVVNFIDE0IGxhYmVsPSJTdW9tZW4gS3V2YWxlaHRpIG5vLiBTSzAyMjEgMTUuMDEuMjAyMSIKICAgICMgVVNFIDE2IGxhbmd1YWdlPSJmaSIKICAgICMgVVNFIDE3IHBhZ2VfaWQ9InAxIgogICAgIyBVU0UgMTggcGFnZV9ubz0iTm9uZSIKICAgICMgICAgIDE5IHBhcnRfbmFtZT0iXyIKICAgICMgICAgIDIwIHB1YmxfaWQ9IjAwMzktNTU1MiIKICAgICMgICAgIDIxIHB1YmxfcGFydD0iIgogICAgIyBVU0UgMjIgcHVibF90aXRsZT0iU3VvbWVuIEt1dmFsZWh0aSIgCiAgICAjIFVTRSAyMyBwdWJsX3R5cGU9ImFpa2FrYXVzaSIKICAgICMgVVNFIDI0IHNlbnRjb3VudD0iNzAiCiAgICAjIFVTRSAyNSBzdW1fbGFuZz0ifHh4eDo0NHxmaW46MjN8ZW5nOjN8IgogICAgIyAgICAgMjYgdGltZWZyb209IjAwMDAwMCIKICAgICMgICAgIDI3IHRpbWV0bz0iMjM1OTU5IgogICAgIyBVU0UgMjggdG9rZW5jb3VudD0iMzA0IgogICAgIyAgICAgMjkgdmVyc2lvbl9hZGRlZD0iS0xLLWZpLTIwMjEiPgoKCiAgICBteSAkQklEICAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2JpbmRpbmdfaWQnfTsKICAgIG15ICREQVRFICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnZGF0ZSd9OwogICAgbXkgJE1FVEFGSUxFTkFNRSA9ICR0ZXh0YXR0c3JlZi0+eydmaWxlbmFtZV9tZXRhZGF0YSd9OyAgICAKICAgIG15ICRPUklHRklMRU5BTUUgPSAkdGV4dGF0dHNyZWYtPnsnZmlsZW5hbWVfb3JpZyd9OwogICAgbXkgJElEICAgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydpZCd9OwogICAgbXkgJElTU1VFREFURSAgICA9ICR0ZXh0YXR0c3JlZi0+eydpc3N1ZV9kYXRlJ307CiAgICBteSAkSVNTVUVOTyAgICAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX25vJ307CiAgICBteSAkSVNTVUVUSVRMRSAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX3RpdGxlJ307CiAgICBteSAkTEFCRUwgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2xhYmVsJ307CiAgICBteSAkTEFOR1VBR0UgICAgID0gJHRleHRhdHRzcmVmLT57J2xhbmd1YWdlJ307CiAgICBteSAkUEFHRUlEICAgICAgID0gJHRleHRhdHRzcmVmLT57J3BhZ2VfaWQnfTsKICAgIG15ICRQQUdFTk8gICAgICAgPSAkdGV4dGF0dHNyZWYtPnsncGFnZV9ubyd9OwogICAgbXkgJFBVQkxUSVRMRSAgICA9ICR0ZXh0YXR0c3JlZi0+eydwdWJsX3RpdGxlJ307CiAgICBteSAkUFVCTFRZUEUgICAgID0gJHRleHRhdHRzcmVmLT57J3B1YmxfdHlwZSd9OwogICAgbXkgJFNFTlRDT1VOVCAgICA9ICR0ZXh0YXR0c3JlZi0+eydzZW50Y291bnQnfTsKICAgIG15ICRTVU1MQU5HICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnc3VtX2xhbmcnfTsKICAgIG15ICRUT0tFTkNPVU5UICAgPSAkdGV4dGF0dHNyZWYtPnsndG9rZW5jb3VudCd9OwoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIERlcml2ZWQgTWV0YWRhdGEgdmFyaWFibGVzCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBteSBAZGF0ZWFycmF5ID0gc3BsaXQoIi0iLCAkREFURSk7CiAgICBteSBAbGFuZ2FycmF5ID0gc3BsaXQoInwiLCAkU1VNTEFORyk7CiAgICBteSBAbmFtZWFycmF5ID0gc3BsaXQoL1tcLlwvXS8sICRPUklHRklMRU5BTUUpOyAgIyB1c2UgJG5hbWVhcnJheVs0XSBhcyBJRCBmb3IgdGhlIHBhZ2UKICAgIAoKCiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBDUkVBVEUgdGV4dC10ZWlIZWFkZXIgQUNDT1JESU5HIFRPIFRIRSBTS0VMRVRPTiBpbiAkdGV4dEhlYWRlcgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKICAgICR0ZXh0SGVhZGVyLT5wYXN0ZSgnZmlyc3RfY2hpbGQnLCAkdGV4dCk7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIDx0ZWlIZWFkZXI+CiAgICAjICAgPGZpbGVEZXNjIG49IkV1UmVDby1LTEstRklOX1skSURdIj4KICAgICMgICAgIDx0aXRsZVN0bXQ+CiAgICAjICAgICAgIDx0aXRsZT5bJExBQkVMLCBwYWdlICRQQUdFTk9dPC90aXRsZT4JCgogICAgJHRleHRIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpICAgLT4gIHNldF9hdHQoJ24nLCAiRXVSZUNvLSIuICRraWVsaXBhbmtraUNvcnB1cyAuICRJRCk7CiAgICAKICAgICR0ZXh0SGVhZGVyLT5maXJzdF9jaGlsZCgiZmlsZURlc2MiKSAgICAtPiBmaXJzdF9jaGlsZCgidGl0bGVTdG10IiktPmZpcnN0X2NoaWxkKCJ0aXRsZSIpCgktPnNldF90ZXh0KCRMQUJFTCAuICIsIFRleHQgIyIgLiAkdGV4dGNvdW50ZXIpOyAgICAjIENhc2UgS0xLOyAgUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUiIHp1IHNlaW4KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgPGZpbGVEZXNjPgogICAgIyAgPHNvdXJjZURlc2M+CiAgICAjICAgPGJpYmxTdHJ1Y3Q+CiAgICAjICAgICAgPGFuYWx5dGljPgogICAgIyAgICAgICAgIDx0aXRsZSB0eXBlPSJtYWluIj5bJExBQkVMLCBwYWdlICRQQUdFTk9dPC90aXRsZT4KICAgICMgICAgICAgICA8ZGF0ZT5bJERBVEVdPC9kYXRlPgogICAgIyAgICAgICAgIDxkYXRlIHR5cGU9InllYXIiPlRPRE88L2RhdGU+CiAgICAjICAgICAgICAgPGRhdGUgdHlwZT0ibW9udGgiPlRPRE88L2RhdGU+CiAgICAjICAgICAgICAgPGRhdGUgdHlwZT0iZGF5Ij5UT0RPPC9kYXRlPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IlBBR0VJRCI+JFBBR0VJRDwvaWRubz4KICAgICMgICAgICAgICA8aWRubyB0eXBlPSJCSU5ESU5HSUQiPiRCSUQ8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iSUQiPiRJRDwvaWRubz4KICAgICMgICAgICAgICA8aWRubyB0eXBlPSJLSUVMSVBBTktLSV9NRVRBRklMRU5BTUUiPiRNRVRBRklMRU5BTUU8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iS0lFTElQQU5LS0lfT1JJR0ZJTEVOQU1FIj4kT1JJR0ZJTEVOQU1FPC9pZG5vPgogICAgIyAgICAgICAgIDx0ZXh0TGFuZz4kTEFOR1VBR0U8L3RleHRMYW5nPgoKICAgIG15ICRhbmFseXRpYyAgPSAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCIuL2ZpbGVEZXNjL3NvdXJjZURlc2MvYmlibFN0cnVjdC9hbmFseXRpYyIsIDApOwoKICAgICRhbmFseXRpYy0+Zmlyc3RfY2hpbGQoInRpdGxlIikgICAgICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJExBQkVMIC4gIiwgVGV4dCAjIiAuICR0ZXh0Y291bnRlcik7ICAgIyBDYXNlIEtMSzsgUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUiIHp1IHNlaW4KICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2RhdGVbQHR5cGU9ImRhdGUiXScsICAgMCkgIC0+c2V0X3RleHQoJERBVEUpOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vZGF0ZVtAdHlwZT0ieWVhciJdJywgICAwKSAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzBdKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2RhdGVbQHR5cGU9Im1vbnRoIl0nLCAgMCkgIC0+c2V0X3RleHQoJGRhdGVhcnJheVsxXSk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9kYXRlW0B0eXBlPSJkYXkiXScsICAgIDApICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMl0pOyAgICAKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IlBBR0VJRCJdJywgICAgICAgMCkgICAgIC0+c2V0X3RleHQoJFBBR0VJRCk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJCSU5ESU5HSUQiXScsICAgIDApICAgICAtPnNldF90ZXh0KCRCSUQpOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iSUQiXScsICAgICAgICAgICAwKSAgICAgLT5zZXRfdGV4dCgkSUQpOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iS0lFTElQQU5LS0lfTUVUQUZJTEVOQU1FIl0nLCAwKSAgICAgLT5zZXRfdGV4dCgkTUVUQUZJTEVOQU1FKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IktJRUxJUEFOS0tJX09SSUdGSUxFTkFNRSJdJywgMCkgICAgIC0+c2V0X3RleHQoJE9SSUdGSUxFTkFNRSk7CiAgICAkYW5hbHl0aWMtPmZpcnN0X2NoaWxkKCd0ZXh0TGFuZycpICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkTEFOR1VBR0UpOwogICAgCiAgICAjICA8bW9ub2dyPgogICAgIyAgICA8dGl0bGU+JFBVQkxUSVRMRTwvdGl0bGU+CiAgICAjICAgIDxpbXByaW50PgogICAgIyAgICAgIDxwdWJQbGFjZT5UT0RPPC9wdWJQbGFjZT4KICAgICMgICAgICA8cHVibGlzaGVyPlRPRE88L3B1Ymxpc2hlcj4KICAgICMgICAgPC9pbXByaW50PgogICAgIyAgICA8YmlibFNjb3BlIHVuaXQ9IklTU1VFVElUTEUiLz4KICAgICMgICAgPGJpYmxTY29wZSB1bml0PSJJU1NVRU5PIi8+CiAgICAjICAgIDxiaWJsU2NvcGUgdW5pdD0iSVNTVUVEQVRFIi8+CiAgICAjICAgIDxiaWJsU2NvcGUgdW5pdD0icHAiPiRQQUdFTk88L2JpYmxTY29wZT4KCiAgICBteSAkbW9ub2dyICA9ICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoIi4vZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0L21vbm9nciIsIDApOwoKICAgICRtb25vZ3ItPmZpcnN0X2NoaWxkKCJ0aXRsZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRQVUJMVElUTEUpOwogICAgJG1vbm9nci0+Zmlyc3RfY2hpbGQoImltcHJpbnQiKS0+Zmlyc3RfY2hpbGQoInB1YlBsYWNlIikgICAgICAgIC0+c2V0X3RleHQoIlRvRG8iKTsgICAgICAgICAjIGltcHJpbnQgaXMgbmVlZGVkIGZvciB0ZWkgdmFsaWRpdHkKICAgICRtb25vZ3ItPmZpcnN0X2NoaWxkKCJpbXByaW50IiktPmZpcnN0X2NoaWxkKCJwdWJsaXNoZXIiKSAgICAgICAtPnNldF90ZXh0KCJUb0RvIik7ICAgICAgICAgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdGVpIHZhbGlkaXR5CiAgICAkbW9ub2dyLT5nZXRfeHBhdGgoJy4vYmlibFNjb3BlW0B1bml0PSJJU1NVRVRJVExFIl0nLCAwKSAgICAgICAgLT5zZXRfdGV4dCgkSVNTVUVUSVRMRSk7CiAgICAkbW9ub2dyLT5nZXRfeHBhdGgoJy4vYmlibFNjb3BlW0B1bml0PSJJU1NVRU5PIl0nLCAwKSAgICAgICAgICAgLT5zZXRfdGV4dCgkSVNTVUVOTyk7CiAgICAkbW9ub2dyLT5nZXRfeHBhdGgoJy4vYmlibFNjb3BlW0B1bml0PSJJU1NVRURBVEUiXScsIDApICAgICAgICAgLT5zZXRfdGV4dCgkSVNTVUVEQVRFKTsKICAgICRtb25vZ3ItPmdldF94cGF0aCgnLi9iaWJsU2NvcGVbQHVuaXQ9InBwIl0nLCAwKSAgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRQQUdFTk8pOyAgICAgICAgIyBBY2h0dW5nIC0gUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUiIHp1IHNlaW4KCiAgICAjICA8ZW5jb2RpbmdEZXNjPgogICAgIyAgICA8dGFnc0RlY2w+CiAgICAjICAgICAgPG5hbWVzcGFjZSBuYW1lPSJodHRwOi8vd3d3LnRlaS1jLm9yZy9ucy8xLjAiPgogICAgIyAgICAgICAgPHRhZ1VzYWdlIGdpPSJzIiBvY2N1cnM9IlNFTlRDT1VOVCIvPgogICAgIyAgICAgICAgPHRhZ1VzYWdlIGdpPSJ3IiBvY2N1cnM9IlRPS0VOQ09VTlQiLz4KCiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL2VuY29kaW5nRGVzYy90YWdzRGVjbC9uYW1lc3BhY2UvdGFnVXNhZ2VbQGdpPSJzIl0nLCAwKSAgICAgIC0+IHNldF9hdHQoJ29jY3VycycsICRTRU5UQ09VTlQpOwogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9lbmNvZGluZ0Rlc2MvdGFnc0RlY2wvbmFtZXNwYWNlL3RhZ1VzYWdlW0BnaT0idyJdJywgMCkgICAgICAtPiBzZXRfYXR0KCdvY2N1cnMnLCAkVE9LRU5DT1VOVCk7CgkKICAgICMgIDxwcm9maWxlRGVzYz4KICAgICMgICAgPGxhbmdVc2FnZT4KICAgICMgICAgIDxsYW5ndWFnZSBpZGVudD0iZmkiIHVzYWdlPSJ8eHh4OjQ0fGZpbjoyM3xlbmc6M3wiLz4KICAgICMgICA8L2xhbmdVc2FnZT4KICAgICMgICAgPHRleHRDbGFzcz4KICAgICMgICAgICA8Y2xhc3NDb2RlIHNjaGVtZT0ia2llbGlwYW5ra2lfa2xrIj4kUFVCTFRZUEU8L2NsYXNzQ29kZT4KICAgICMgICAgICA8Y2xhc3NDb2RlIHNjaGVtZT0ia2llbGlwYW5ra2lfa2xrX21hcHBlZCI+VE9ETzwvY2xhc3NDb2RlPgoKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vcHJvZmlsZURlc2MvbGFuZ1VzYWdlL2xhbmd1YWdlJywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X2F0dCgnaWRlbnQnLCAkTEFOR1VBR0UpOwogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy9sYW5nVXNhZ2UvbGFuZ3VhZ2UnLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfYXR0KCd1c2FnZScsICRTVU1MQU5HKTsKICAgICMgaW4gQHVzYWdlIG11c3MgZWlndC4gZWluIGludGVnZXI7IGFtIGJlc3RlbiBpbmhhbHQgdm9uIFNVTUxBTkcgYXVmZHJvZXNlbG4gdW5kIG1laHJlcmUgPGxhbmd1YWdlPiBtYWNoZW4KCiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3Byb2ZpbGVEZXNjL3RleHRDbGFzcy9jbGFzc0NvZGVbQHNjaGVtZT0ia2llbGlwYW5ra2lfa2xrIl0nLCAwKSAgICAgICAtPnNldF90ZXh0KCRQVUJMVFlQRSk7CiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3Byb2ZpbGVEZXNjL3RleHRDbGFzcy9jbGFzc0NvZGVbQHNjaGVtZT0ia2llbGlwYW5ra2lfa2xrX21hcHBlZCJdJywgMCktPnNldF90ZXh0KCJUb0RvIik7CgogICAgIyAgPHJldmlzaW9uRGVzYz4KICAgICMgICAgPGNoYW5nZSB3aGVuPSJUT0RPIiB3aG89IkhMIj5URUkgdmVyc2lvbiBmb3IgRXVSZUNvPC9jaGFuZ2U+CgogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9yZXZpc2lvbkRlc2MvY2hhbmdlJywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNldF9hdHQoJ3doZW4nLCBsb2NhbHRpbWUtPnltZCgnLScpKTsKICAgIAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBFTkQgT0YgQ1JFQVRJTkcgVEVJSEVBREVSCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAp9CgpzdWIgc2V0UCB7CiAgICBteSAoJHBhcmFncmFwaCkgPSBAXzsKICAgIAogICAgJHBhcmFncmFwaC0+c2V0X2dpKCdwJyk7CiAgICAKICAgICMgPHBhcmFncmFwaCBpZD0icC1iY2QwZjNmYS1iYmQzZGFjNC04MTVlYWQ3YSIgc3VtX2xhbmc9InxmaW46MXwiPgogICAgIyBhdHRzIG9mIDxwYXJhZ3JhcGg+OgogICAgIyAgICBAaWQgICAgICAgIFVTRQogICAgIyAgICBAc3VtX2xhbmcgIFVTRTogcHV0IGluIHhtbDpsYW5nIGFuZCBwcmVmaXggdGhlIHZhbHVlIHdpdGggIngtIiBmb3IgcHJpdmF0ZSB2YWx1ZQogICAgCiAgICAkcGFyYWdyYXBoLT5zZXRfYXR0KCJ4bWw6bGFuZyIsICJ4LSIgLiAkcGFyYWdyYXBoLT5hdHQoInN1bV9sYW5nIikpOwogICAgJHBhcmFncmFwaC0+ZGVsX2F0dCgic3VtX2xhbmciKTsKICAgICMgJHBhcmFncmFwaC0+Y2hhbmdlX2F0dF9uYW1lKCdpZCcsICd4bWw6aWQnKTsKICAgICRwYXJhZ3JhcGgtPmRlbF9hdHQoImlkIik7ICAgICAgICAgICAgICAjIGRpZXNlIGlkIGlzdCBhdWNoIG5pY2h0IGVpbmRldXRpZyEhCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKc3ViIHNldFMgewogICAgbXkgKCRzZW50ZW5jZSkgPSBAXzsKICAgIAogICAgJHNlbnRlbmNlLT5zZXRfZ2koJ3MnKTsKCSAgICAKICAgICMgdGhlIGF0dHMgb2YgPHNlbnRlbmNlPjoKICAgICMgICAgVVNFICAgMSBAaWQ9InMtYmNkMGYzZmEtYmJkM2RhYzQtZjc0MjkwOTAiCiAgICAjICAgIFVTRSAgIDIgQGxhbmc9ImZpbiIgLT4geG1sOmxhbmcgCiAgICAjICAgID8gICAgIDMgQGxhbmdfY29uZj0iMC42NzM0ODUzIj4gLT4gVG9EbyBAY2VydCA/CSAgICAKICAgIAogICAgIyBzZXQgYXR0cnMgb2YgPHM+CiAgICAkc2VudGVuY2UtPnNldF9hdHQoInhtbDpsYW5nIiwgJHNlbnRlbmNlLT5hdHQoImxhbmciKSk7ICAjIFRvRG86IGNvbnZlcnQgdGhlIHZhbHVlIC8gaW50cm9kdWNlIGEgaGFzaCBmb3IgbG9va3VwIChpbnB1dCB2YWx1ZXM6ICJmaW4iLCAieHh4IiwgLi4uLikKICAgICMgJHNlbnRlbmNlLT5jaGFuZ2VfYXR0X25hbWUoJ2lkJywgJ3htbDppZCcpOyAgICAgICAgICAgICMgbmljaHQgZWluZGV1dGlnCiAgICAkc2VudGVuY2UtPmRlbF9hdHQoJ2lkJyk7CiAgICAkc2VudGVuY2UtPmRlbF9hdHQoImxhbmciKTsgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBsYWNlZCBieSB4bWw6bGFuZwogICAgJHNlbnRlbmNlLT5kZWxfYXR0KCJsYW5nX2NvbmYiKTsgICAgICAgICAgICAgICAgICAgICMgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAKfQoKc3ViIGNyZWF0ZVcgewogICAgbXkgKCR3X2VsZW1lbnQsICRsaW5lKSA9IEBfOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgR2V0IHRoZSB0YWdzICg9Y29sdW1ucykKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgQHRhZ3MgPSBzcGxpdCgvXHQvLCAkbGluZSk7CiAgICAKICAgICMgc2V0IGNvbnRlbnQgb2YgPHc+IGkuZS4gdGhlIHRva2VuCiAgICAkd19lbGVtZW50LT5zZXRfdGV4dCgkdGFnc1swXSk7CiAgICAKICAgICMgdnJ0IHBvc2l0aW9uYWwtYXR0cmlidXRlcyBpbiBjb3JwdXMgS0xLOgogICAgIyAgVVNFIFswXSB3b3JkCiAgICAjICBVU0UgWzFdIHJlZiAgKGlkIGZvciByZWZlcmVuY2Ugb2YgZGVwaGVhZCkKICAgICMgIFVTRSBbMl0gbGVtbWEKICAgICMgID8gICBbM10gbGVtbWFjb21wICAgKGxlbW1hIHdpdGggY29tcG91bmQgaW5mbyAtIGNvdWxkIGdvIGluIEBub3JtLCBhcyB0YWcgYWJ1c2U/KQogICAgIyAgVVNFIFs0XSBwb3MgCiAgICAjICBVU0UgWzVdIG1zZCAKICAgICMgIFVTRSBbNl0gZGVwaGVhZAogICAgIyAgVVNFIFs3XSBkZXByZWwgCiAgICAjICAgICAgWzhdIGNvbnRlbnQgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICAgWzldIHZwb3MgICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTBdIG9jciAgICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTFdIGNjICAgICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTJdIGh5cGggICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTNdIHN0eWxlICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTRdIGxleCAgICAgICAoa29ycCBzZW1hbnRpYyBkaXNhbWJpZ3VhdGlvbiBmcm9tIEcib3RlYm9yZykKICAgIAogICAgIyBzZXQgdGhlIGF0dHJpYnV0ZXMgb2YgPHc+OgogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibiIsICAgICAgJHRhZ3NbMV0pOwogICAgIyAkd19lbGVtZW50LT5zZXRfYXR0KCJpZCIsICAgICAid18iIC4gJG5hbWVhcnJheVs0XSAuICRzZW50ZW5jZS0+YXR0KCJ4bWw6aWQiKSAuICJfIiAuICR0YWdzWzFdKTsKICAgICMgc28genVzYW1tZW5nZWJhdXRlIElEIGlzdCBhdWNoIG5pY2h0IGVpbmRldXRpZy4uLgogICAgJHdfZWxlbWVudC0+ZGVsX2F0dCgiaWQiKTsKICAgICR3X2VsZW1lbnQtPnNldF9hdHQoImxlbW1hIiwgICR0YWdzWzJdKTsKICAgICMgJHdfZWxlbWVudC0+c2V0X2F0dCgibm9ybSIsICAgJHRhZ3NbM10pOyAgIyB0YWcgYWJ1c2Ugb2YgQG5vcm0KICAgICR3X2VsZW1lbnQtPnNldF9hdHQoInBvcyIsICAgICR0YWdzWzRdKTsKICAgICR3X2VsZW1lbnQtPnNldF9hdHQoIm1zZCIsICAgICR0YWdzWzVdKTsKI1RNUCAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJoZWFkIiwgICAkdGFnc1s2XSk7CiNUTVAgICAgJHdfZWxlbWVudC0+c2V0X2F0dCgiZGVwcmVsIiwgJHRhZ3NbN10pOwogICAgCn0KICAgIAoKc3ViIHNldF90aXRsZXsKICAgIG15ICgkY29ycHVzSGVhZGVyLCAkc291cmNlLCAkeXksICRraWVsaXBhbmtraUNvcnB1cykgPSBAXzsKCiAgICBteSAkY1RpdGxlU3RyaW5nID0gJHNvdXJjZSAuICIgIiAuICR5eSAuICIsIGZyb20gIi4gJGtpZWxpcGFua2tpQ29ycHVzIC4gIiBmb3IgRXVSZUNvIjsgICAgCgogICAgIzx0ZWlIZWFkZXI+CiAgICAjICA8ZmlsZURlc2M+CiAgICAjICAgIDx0aXRsZVN0bXQ+CiAgICAjICAgICAgPHRpdGxlPltBYW11bGVodGkyMDIxXSBmcm9tIFtrbGstZmktdjItdnJ0IGZvcl0gRXVSZUNvPC90aXRsZT4KICAgICMgICAgPC90aXRsZVN0bXQ+CiAgICAjICAgIDwhLS0gLi4uIC0tPgogICAgIyAgPC9maWxlRGVzYz4KICAgICM8L3RlaUhlYWRlcj4KCiAgICBteSAkY1RpdGxlTm9kZSA9ICRjb3JwdXNIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpLT5maXJzdF9jaGlsZCgidGl0bGVTdG10IiktPmZpcnN0X2NoaWxkKCJ0aXRsZSIpOwoKICAgICRjVGl0bGVOb2RlLT5zZXRfdGV4dCgkY1RpdGxlU3RyaW5nKTsKICAgIAp9CgpzdWIgc2V0X3NvdXJjZURlc2N7CiAgICBteSAoJGNvcnB1c0hlYWRlciwgJHNvdXJjZSwgJHl5LCAka2llbGlwYW5ra2lDb3JwdXMpID0gQF87CgogICAgbXkgJGNCaWJsU3RyaW5nID0gJHNvdXJjZSAuICIgIiAuICR5eSAuICIsIGZyb20gIi4gJGtpZWxpcGFua2tpQ29ycHVzIC4gIiBmb3IgRXVSZUNvIjsgICAgCgogICAgIzx0ZWlIZWFkZXI+CiAgICAjICA8ZmlsZURlc2M+CiAgICAjICAgIDwhLS0gLi4uIC0tPgogICAgIyAgICA8c291cmNlRGVzYz4KICAgICMgICAgICA8YmlibD5bQWFtdWxlaHRpMjAyMV0gZnJvbSBba2xrLWZpLXYyLXZydF08L2JpYmw+CiAgICAjICAgIDwvc291cmNlRGVzYz4KICAgICMgICAgPCEtLSAuLi4gLS0+CiAgICAjICA8L2ZpbGVEZXNjPgogICAgIzwvdGVpSGVhZGVyPgoKICAgIG15ICRjQmlibE5vZGUgPSAkY29ycHVzSGVhZGVyLT5maXJzdF9jaGlsZCgiZmlsZURlc2MiKS0+Zmlyc3RfY2hpbGQoInNvdXJjZURlc2MiKS0+Zmlyc3RfY2hpbGQoImJpYmwiKTsKCiAgICAkY0JpYmxOb2RlLT5zZXRfdGV4dCgkY0JpYmxTdHJpbmcpOyAgICAKfQoKCgoKCgoKIyMjIyMjIyMjIyMjIyMjIyMKIyMgdXNhZ2VfbWVzc2FnZQojIyMjIyMjIyMjIyMjIyMjIwoKCnN1YiB1c2FnZV9tZXNzYWdlIHsKICAgIHByaW50ICIgICBVc2FnZTogIC4vdnJ0MnRlaS5wbCA8ZmlsZS52cnQueG1sPiA8b3V0ZmlsZT5cbiI7CiAgICBwcmludCAiICAgPGZpbGUudnJ0LnhtbD4gaXMgYSBWUlQgZmlsZSBjb252ZXJ0ZWQgdG8gcHJvcGVyIFhNTFxuIjsKICAgIGV4aXQ7Cn0KCgo=