IyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1bmN0aW9uCiMgVXNhZ2U6ICAuL3htbDJpNS5wbCA8dnJ0eG1sZmlsZS54bWw+IDxvdXRmaWxlPgojICAgICAgICAgPHZydHhtbGZpbGU+OiB4bWwtaXNlZCB2cnQgZmlsZQojCiMKIyBUT0RPOiAKIyAxICBpbnNlcnQgZHRkIHNwZWMsIG9yIHJlZiB0byBURUkKCiMgM2EgVVBMT0FEIGluIEdJVEhVQgojIDNiIGFkZCBAaGVhZCBhbmQgQGRlcHJlbCB0byBJNSBzb3dpZSBhdWNoIEBtc2QKIyAzYyBiZWFyYmVpdHVuZyB2b24gQGhlYWQgdW5kIEBkZXByZWwgaW4gdGVpMmtvcmFweG1sIGR1cmNoIE5pbHM/CiMgM2QgYnVpbGQgMzAgYmlsbGlvbiBjb3JwdXMKCiMgNGEgdGFrZSBjYXJlIG9mIElEcwojIDRiIHNlZSB0byB0aGUgdmFsdWVzIG9mIEB4bWw6bGFuZwojIDUgYWJmYW5nZW4gdm9uIHVuZXJ3YXJ0ZXRlbiBlbGVtZW50ZW4gZGggYW5kZXJlIGFscyA8c2VudGVuY2U+IHVuZCA8cGFyYWdyYXBoPgojIDVhIHdvcnQgcmVpaGVuZm9sZ2Ugbm9jaG1hbCBjaGVja2VuCiMgNiBjaGVja3MgYW5kIGJhbGFuY2VzCiMgNmEgb3V0cHV0IG5hY2ggc3Rkb3V0IG1hY2hlbgojIDcgIEhvdyB0byBlbmNvZGUgS2llbGlwYW5ra2kgYW5kIE5hdGlvbmFsIExpYnJhcnkgb2YgRmlubGFuZD8gaW4gdGVpQ29ycHVzIEhlYWRlcgojIDggIGNvbnN0cnVjdCA8aWRzRG9jPnMgZm9yIHRoZSBtb250aHMgKG9yIGdvIGZvciBURUkpCiMgOSAgcGFyYWxsZWxpc2F0aW9uIGluIGJhc2ggYW5kIGFwcGxpY2F0aW9uIG9uIHN1YiBjb3Jwb3JhIG9mIEtMSwojIDEwICByZS1pbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2F3ayBjb2RlIGluIHRoZSBwZXJsIHNjcmlwdAojIDEyICByZS1pbXBsZW1lbnQgY3JlYXRpb24gb2YgdGV4dCBoZWFkZXIgZnJvbSB4bWwgZmlsZSBpbiBhbm90aGVyIHR3aWcgLyBwYXJhbWV0cml6ZSBURUkgdnMgSTUKCgoKI3JlbWVtYmVyCiNmb3JtYXR0ZWQueG1sOjEwNTYxMzogZWxlbWVudCB3OiB2YWxpZGl0eSBlcnJvciA6IE5vIGRlY2xhcmF0aW9uIGZvciBhdHRyaWJ1dGUgZGVwcmVsIG9mIGVsZW1lbnQgdwojZm9ybWF0dGVkLnhtbDoxMDU2MTM6IGVsZW1lbnQgdzogdmFsaWRpdHkgZXJyb3IgOiBObyBkZWNsYXJhdGlvbiBmb3IgYXR0cmlidXRlIGhlYWQgb2YgZWxlbWVudCB3CgoKIwojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBYTUw6OlR3aWc7IAp1c2UgWE1MOjpHZW5lcmF0b3IgJzpwcmV0dHknOyAgIyBhcHBhcmVudGx5IG5vIGVmZmVjdCB3aGVuIHVzaW5nIGZsdXNoKCk7CgogCnVzZSBsb2NhbGU7ICAgICAgICAgICAgICAgICAjIGRpZXNlIGRyZWkgWmVpbGVuLCBkYW1pdCBcYiBpbSByZWdleCBuaWNodCBVbWxhdXRlIHVuZCDfIG1hdGNodC4KdXNlIFBPU0lYIHF3KGxvY2FsZV9oKTsgICAgICMgdG8gYmUgYWJsZSB0byB1c2Ugc2V0bG9jYWxlKCkKI3NldGxvY2FsZShMQ19BTEwsJ2RlX0RFJyk7ICAKc2V0bG9jYWxlKExDX0FMTCwgImZpX0ZJIik7ICAKdXNlIHV0Zjg7CnVzZSBvcGVuIHF3KCA6c3RkIDplbmNvZGluZyhVVEYtOCkgKTsKCnVzZSBUaW1lOjpQaWVjZTsKdXNlIFRpZTo6SXhIYXNoOwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBjaGVjayBmaWxlIGFyZ3VtZW50czoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgYXJnMCBpbmZpbGU6ICAgdnJ0LXhtbAojIGFyZzEgb3V0ZmlsZTogIHRlaQoKdW5sZXNzKCRBUkdWWzFdKSB7JnVzYWdlX21lc3NhZ2UoKX07ICMgbWluIGFyZzAgdW5kIGFyZzEKaWYgKCRBUkdWWzJdKSB7JnVzYWdlX21lc3NhZ2UoKX07ICAgICMgbWF4IGFyZzEKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR0xPQkFMIFZBUklBQkxFUyAKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15ICRlbmNvZGluZyA9ICJVVEYtOCI7ICAgICAgICAgICAgICAgCiNteSAkZW5jb2RpbmcgPSAiaXNvLTg4NTktMSI7ICAgICAgICAgICAgICMgZGllc2VzICRlbmNvZGluZyBpc3QgTlVSIGZ1ZXIgZGFzIG91dHB1dCBzLnUuIHR3aWcgZnVua3Rpb24KCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICAgIE0gQSBJIE4gIAojIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgojIG9wZW4gcmVzdWx0IGZpbGUgYW5kIGluaXRpYWxpc2UgZmlsZWhhbmRsZQpvcGVuKG15ICRPVVQsICI+PiAkQVJHVlsxXSIpIHx8IGRpZSgiY2Fubm90IG9wZW4gZmlsZTogJEFSR1ZbMV0iKTsgCgoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHN0YXJ0IHR3aWcgYW5kIGNhbGwgc3RhcnQgdGFnIGhhbmRsZXIgZm9yIHJvb3QgYW5kIHR3aWcgaGFuZGxlciBmb3IgZWFjaCA8dGV4dD4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkdHdpZz0iIjsgICAKCiR0d2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsICAgICAgICAgICAjIGRhZHVyY2ggYXVjaCB3aGl0ZXNwYWNlcyBhbiBlaGVtZWxpZ2VuIGVsZW1lbnRncmVuemVuIGltIG91dHB1dAogICAga2VlcF9hdHRzX29yZGVyID0+IDEsICAgICAgICMgcmVxdWlyZXMgVGllOjpJeEhhc2gKICAgIHByZXR0eV9wcmludCA9PiAnaW5kZW50ZWQnLAogICAgc3RhcnRfdGFnX2hhbmRsZXJzID0+IHsKICAgIAl0ZXh0cyA9PiBcJnJvb3QKICAgIH0sCiAgICB0d2lnX2hhbmRsZXJzID0+ICB7Cgl0ZXh0ID0+IFwmdGV4dAogICAgfSwKICAgICMgZHRkX2hhbmRsZXJzID0+ICAgeyAgICAgICAjIFRvRG8gZm9yIEk1CiAgICAjCVwmc2V0X2R0ZDsKICAgICMgfQogICAgb3V0cHV0X2VuY29kaW5nID0+ICRlbmNvZGluZywKICAgICk7CgokdHdpZy0+cGFyc2VmaWxlKCRBUkdWWzBdKTsKCmNsb3NlKCRPVVQpOwoKCiMjIyMjIyMjIyMjCiMgRU5EIE1BSU4KIyMjIyMjIyMjIyMKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgUyBVIEIgUiBPIFUgVCBJIE4gRSBTCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBzdWIgc2V0X2R0ZCBbCiMgICAgbXkgJHR3aWcsICRkdGQgPSBAXzsKIyAgICBteSAkaW50ZXJuYWwgPSBxcXxcblBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iXG4iRFREL3hodG1sMS1zdHJpY3QuZHRkInw7CiMKIyAgICAkdHdpZy0+dHdpZ19kb2N0eXBlKCdodG1sJywgdW5kZWYsIHVuZGVmLCAkaW50ZXJuYWwpOwojICAgIH0KCgoKc3ViIHJvb3QgewogICAgbXkgKCR0d2lnLCAkcm9vdCkgPUBfOwoKICAgICRyb290LT5zZXRfZ2koJ3RlaUNvcnB1cycpOwogICAgJHJvb3QtPnNldF9hdHQoInhtbG5zIiwgJ2h0dHA6Ly93d3cudGVpLWMub3JnL25zLzEuMCcpOwoKICAgICZpbnNlcnRDb3JwdXNIZWFkZXIoJHJvb3QpOyAgICAKfQoKCnN1YiBpbnNlcnRDb3JwdXNIZWFkZXJ7CiAgICBteSAoJHJvb3QpID1AXzsKCiAgICBteSAkdGVpSGVhZGVyICAgICAgICA9ICRyb290ICAgICAgICAgICAtPmluc2VydF9uZXdfZWx0KCJmaXJzdF9jaGlsZCIsICd0ZWlIZWFkZXInKTsgICAgCiAgICBteSAkZmlsZURlc2MgICAgICAgICA9ICR0ZWlIZWFkZXIgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2ZpbGVEZXNjJyk7CgogICAgbXkgJHRpdGxlU3RtdCAgICAgICAgPSAkZmlsZURlc2MgICAgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZVN0bXQnKTsKICAgIG15ICR0aXRsZSAgICAgICAgICAgID0gJHRpdGxlU3RtdCAgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGl0bGUnKTsKICAgICR0aXRsZSAgICAgICAgICAgICAgIC0+c2V0X3RleHQoIiBLTEstZmktMjAyMSBmb3IgRXVSZUNvIik7CiAgICAKICAgIG15ICRwdWJsaWNhdGlvblN0bXQgID0gJGZpbGVEZXNjICAgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncHVibGljYXRpb25TdG10Jyk7CiAgICBteSAkZGlzdHJpYnV0b3IgICAgICA9ICRwdWJsaWNhdGlvblN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2Rpc3RyaWJ1dG9yJyk7CiAgICAkZGlzdHJpYnV0b3IgICAgICAgICAtPnNldF90ZXh0KCJOT1QgRk9SIERJU1RSSUJVVElPTiAtIHRvIGJlIHVzZWQgbG9jYWxseSBpbiBFdVJlQ28iKTsKCiAgICBteSAkc291cmNlRGVzYyAgICAgICA9ICRmaWxlRGVzYyAgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3NvdXJjZURlc2MnKTsKICAgIG15ICRiaWJsICAgICAgICAgICAgID0gJHNvdXJjZURlc2MgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYmlibCcpOwogICAgJGJpYmwgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgiVG9EbyIpOwoKfQogICAgCiAgICAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBoYW5kbGVyICZ0ZXh0IGZvciA8dGV4dD4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN1YiB0ZXh0IHsKCiAgICBteSAoJHR3aWcsICR0ZXh0KSA9IEBfOwoKICAgICMgVG9EbzogY2F0Y2ggYWxsIG90aGVyLCB1bmV4cGVjdGVkIGNoaWxkcmVuCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEdldCB0ZXh0IG1ldGFkYXRhIChhdHRyaWJ1dGVzIG9mIDx0ZXh0PikgYW5kIGNyZWF0ZSB0ZWlIZWFkZXIgZm9yIDx0ZXh0PgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0ZXh0YXR0c3JlZiA9ICR0ZXh0LT5hdHRzKCk7ICAgICAgICAgICAgICAgIyAkdGV4dGF0dHNyZWYgaXMgbm93IGEgcmVmZXJlbmNlIHRvIGEgaGFzaCBhbmQgc2hvdWxkIGJlIHVzZWQgd2l0aCAnLT4nCgogICAgJmNyZWF0ZVRleHRIZWFkZXIoJHRleHQsICR0ZXh0YXR0c3JlZik7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSA8VEVJPiBmcm9tIDx0ZXh0PgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICMgc2V0IHZydCA8dGV4dD4gdG8gPFRFST4gYW5kIGRlbGV0ZSBhbGwgYXR0cmlidXRlcyBhZnRlciB0aGV5IHdlcmUgd2VyZSBzYXZlZCBhYm92ZQogICAgJHRleHQtPmRlbF9hdHRzOwogICAgJHRleHQtPnNldF9naSgiVEVJIik7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgdGhlIDx0ZWk6dGV4dD4sIDxib2R5PiwgPGRpdj4gZWxlbWVudHMgaW5zaWRlIDxURUk+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0dGV4dF9lbGVtZW50ID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndGV4dCcpOwogICAgbXkgJGJvZHlfZWxlbWVudCAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdib2R5Jyk7CiAgICBteSAkZGl2X2VsZW1lbnQgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2RpdicpOwoKICAgICMgc2V0IGF0dHMKICAgICRkaXZfZWxlbWVudC0+c2V0X2F0dCgidHlwZSIsICJwYWdlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvRG86IHRoaXMgaXMgc3BlY2lmaWMgdG8gS0xLCgogICAgIyBwYXN0ZQogICAgJHR0ZXh0X2VsZW1lbnQtPnBhc3RlKCdsYXN0X2NoaWxkJywgICR0ZXh0KTsKICAgICRib2R5X2VsZW1lbnQgLT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkdHRleHRfZWxlbWVudCk7CiAgICAkZGl2X2VsZW1lbnQgIC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJGJvZHlfZWxlbWVudCk7CgogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgPHA+IGZyb20gPHBhcmFncmFwaD4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15IEBwYXJhZ3JhcGhzID0gJHRleHQtPmNoaWxkcmVuKCAncGFyYWdyYXBoJyk7CgogICAgZm9yZWFjaCBteSAkcGFyYWdyYXBoIChAcGFyYWdyYXBocykgewoJCgkmc2V0UCgkcGFyYWdyYXBoKTsKCgkkcGFyYWdyYXBoLT5tb3ZlKCdsYXN0X2NoaWxkJywgJGRpdl9lbGVtZW50KTsKCQoJCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkjIGNyZWF0ZSA8cz4gZnJvbSA8c2VudGVuY2U+CgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkKCW15IEBzZW50ZW5jZXMgPSAkcGFyYWdyYXBoLT5jaGlsZHJlbignc2VudGVuY2UnKTsKCWZvcmVhY2ggbXkgJHNlbnRlbmNlIChAc2VudGVuY2VzKSB7CgoJICAgICZzZXRTKCRzZW50ZW5jZSk7CgoKCSAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgICAjIGNyZWF0ZSA8dz4gKHdvcmQpIGZyb20gZWFjaCAkbGluZQoJICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgIAoJICAgIG15IEBsaW5lcyA9IHNwbGl0KC9cbisvLCAkc2VudGVuY2UtPnhtbF90ZXh0KTsKCSAgICAkc2VudGVuY2UtPnNldF90ZXh0KCJcbiIpOwoKCSAgICBmb3IgbXkgJGxpbmUgKEBsaW5lcyl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb2RvOiBSZWloZW5mb2xnZSBjaGVja2VuCgkJaWYoJGxpbmUgbmUgIiIgKXsKCQkgICAgbXkgJHdfZWxlbWVudCA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3cnKTsKCQkgICAgJmNyZWF0ZVcoJHdfZWxlbWVudCwgJGxpbmUpOwoJCSAgICAkd19lbGVtZW50LT5wYXN0ZSgnbGFzdF9jaGlsZCcsICRzZW50ZW5jZSk7CgkJfQoJICAgIH0KCX0KICAgIH0KCiAgICAkdHdpZy0+Zmx1c2goJE9VVCk7ICAgIAp9CgoKc3ViIGNyZWF0ZVRleHRIZWFkZXJ7CiAgICBteSAoJHRleHQsICR0ZXh0YXR0c3JlZikgPSBAXzsKICAgIAogICAgIyBVU0UgMDEgYmluZGluZ19pZD0iMjI0NjAyNSIKICAgICMgVVNFIDAyIGRhdGU9IjIwMjEtMDEtMTUiCiAgICAjICAgICAwMyBkYXRlZnJvbT0iMjAyMTAxMTUiCiAgICAjICAgICAwNCBkYXRldG89IjIwMjEwMTE1IgogICAgIyAgICAgMDUgZWxlY19kYXRlPSJfIgogICAgIyAgICAgMDYgZmlsZT0iIgogICAgIyBVU0UgMDcgZmlsZW5hbWVfbWV0YWRhdGE9ImZpbmNsYXJpbl9zaWlydG9fazIwMjEvMDAzOS01NTUyLzIwMjEvYWx0by8yMjQ2MDI1XzAwMzktNTU1Ml8yMDIxLTAxLTE1X1NLMDIyMV9tZXRzLnhtbCIKICAgICMgVVNFIDA4IGZpbGVuYW1lX29yaWcgICAgPSJmaW5jbGFyaW5fc2lpcnRvX2syMDIxLzAwMzktNTU1Mi8yMDIxL2FsdG8vMjI0NjAyNV8wMDM5LTU1NTJfMjAyMS0wMS0xNV9TSzAyMjFfcGFnZS0yMDIxMDExNTAyMjEwMDMwMzAxLnhtbAogICAgIyBVU0UgMDkgaWQ9InQtYmNkMGYzZmEtYmJkM2RhYzQiCiAgICAjICAgICAxMCBpbWdfdXJsPSIiCiAgICAjIFVTRSAxMSBpc3N1ZV9kYXRlPSIxNS4wMS4yMDIxIgogICAgIyBVU0UgMTIgaXNzdWVfbm89IlNLMDIyMSIKICAgICMgVVNFIDEzIGlzc3VlX3RpdGxlPSJTdW9tZW4gS3V2YWxlaHRpIgogICAgIyBVU0UgMTQgbGFiZWw9IlN1b21lbiBLdXZhbGVodGkgbm8uIFNLMDIyMSAxNS4wMS4yMDIxIgogICAgIyBVU0UgMTYgbGFuZ3VhZ2U9ImZpIgogICAgIyBVU0UgMTcgcGFnZV9pZD0icDEiCiAgICAjIFVTRSAxOCBwYWdlX25vPSJOb25lIgogICAgIyAgICAgMTkgcGFydF9uYW1lPSJfIgogICAgIyAgICAgMjAgcHVibF9pZD0iMDAzOS01NTUyIgogICAgIyAgICAgMjEgcHVibF9wYXJ0PSIiCiAgICAjIFVTRSAyMiBwdWJsX3RpdGxlPSJTdW9tZW4gS3V2YWxlaHRpIiAKICAgICMgVVNFIDIzIHB1YmxfdHlwZT0iYWlrYWthdXNpIgogICAgIyBVU0UgMjQgc2VudGNvdW50PSI3MCIKICAgICMgVVNFIDI1IHN1bV9sYW5nPSJ8eHh4OjQ0fGZpbjoyM3xlbmc6M3wiCiAgICAjICAgICAyNiB0aW1lZnJvbT0iMDAwMDAwIgogICAgIyAgICAgMjcgdGltZXRvPSIyMzU5NTkiCiAgICAjIFVTRSAyOCB0b2tlbmNvdW50PSIzMDQiCiAgICAjICAgICAyOSB2ZXJzaW9uX2FkZGVkPSJLTEstZmktMjAyMSI+CgoKICAgIG15ICRCSUQgICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnYmluZGluZ19pZCd9OwogICAgbXkgJERBVEUgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydkYXRlJ307CiAgICBteSAkTUVUQUZJTEVOQU1FID0gJHRleHRhdHRzcmVmLT57J2ZpbGVuYW1lX21ldGFkYXRhJ307ICAgIAogICAgbXkgJE9SSUdGSUxFTkFNRSA9ICR0ZXh0YXR0c3JlZi0+eydmaWxlbmFtZV9vcmlnJ307CiAgICBteSAkSUQgICAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2lkJ307CiAgICBteSAkSVNTVUVEQVRFICAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX2RhdGUnfTsKICAgIG15ICRJU1NVRU5PICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfbm8nfTsKICAgIG15ICRJU1NVRVRJVExFICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfdGl0bGUnfTsKICAgIG15ICRMQUJFTCAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnbGFiZWwnfTsKICAgIG15ICRMQU5HVUFHRSAgICAgPSAkdGV4dGF0dHNyZWYtPnsnbGFuZ3VhZ2UnfTsKICAgIG15ICRQQUdFSUQgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsncGFnZV9pZCd9OwogICAgbXkgJFBBR0VOTyAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwYWdlX25vJ307CiAgICBteSAkUFVCTFRJVExFICAgID0gJHRleHRhdHRzcmVmLT57J3B1YmxfdGl0bGUnfTsKICAgIG15ICRQVUJMVFlQRSAgICAgPSAkdGV4dGF0dHNyZWYtPnsncHVibF90eXBlJ307CiAgICBteSAkU0VOVENPVU5UICAgID0gJHRleHRhdHRzcmVmLT57J3NlbnRjb3VudCd9OwogICAgbXkgJFNVTUxBTkcgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydzdW1fbGFuZyd9OwogICAgbXkgJFRPS0VOQ09VTlQgICA9ICR0ZXh0YXR0c3JlZi0+eyd0b2tlbmNvdW50J307CgogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgRGVyaXZlZCBNZXRhZGF0YSB2YXJpYWJsZXMKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIG15IEBkYXRlYXJyYXkgPSBzcGxpdCgiLSIsICREQVRFKTsKICAgIG15IEBsYW5nYXJyYXkgPSBzcGxpdCgifCIsICRTVU1MQU5HKTsKICAgIG15IEBuYW1lYXJyYXkgPSBzcGxpdCgvW1wuXC9dLywgJE9SSUdGSUxFTkFNRSk7ICAjIHVzZSAkbmFtZWFycmF5WzRdIGFzIElEIGZvciB0aGUgcGFnZQogICAgCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIENSRUFURSB0ZXh0LXRlaUhlYWRlciBBQ0NPUkRJTkcgVE8gVEhFIFNLRUxFVE9OIGluIGtsay1oZWFkZXIudGVpLnhtbAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgIyBjcmVhdGUgPHRlaUhlYWRlcj4gaW5zaWRlIDxURUk+CiAgICBteSAkdGVpSGVhZGVyID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndGVpSGVhZGVyJyk7CiAgICAkdGVpSGVhZGVyLT5wYXN0ZSgnZmlyc3RfY2hpbGQnLCAkdGV4dCk7CgogICAgIyMgaW5zZXJ0X25ld19lbHQgaXMgYSBjb21ibyBvZiBuZXcgYW5kIHBhc3RlLCBjZi4geG1sOjp0d2lnIGRvY3U6CiAgICAjIyBpbnNlcnRfbmV3X2VsdCAoJG9wdF9wb3NpdGlvbiwgJGdpLCAkb3B0X2F0dHNfaGFzaHJlZiwgQG9wdF9jb250ZW50KQogICAgCiAgICBteSAkZmlsZURlc2MgICAgID0gJHRlaUhlYWRlci0+aW5zZXJ0X25ld19lbHQoJ2ZpbGVEZXNjJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IHtuID0+ICJFdVJlQ29fS0xLLWZpXyIgLiAkbmFtZWFycmF5WzRdfSk7CiAgICBteSAkZW5jb2RpbmdEZXNjID0gJHRlaUhlYWRlci0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZW5jb2RpbmdEZXNjJyk7CiAgICBteSAkcHJvZmlsZURlc2MgID0gJHRlaUhlYWRlci0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncHJvZmlsZURlc2MnKTsKICAgIG15ICRyZXZpc2lvbkRlc2MgPSAkdGVpSGVhZGVyLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdyZXZpc2lvbkRlc2MnKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGZpbGVEZXNjL3RpdGxlU3RtdAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbXkgJHRpdGxlU3RtdCA9ICRmaWxlRGVzYyAtPmluc2VydF9uZXdfZWx0KCd0aXRsZVN0bXQnKTsKICAgIG15ICR0aXRsZSAgICAgPSAkdGl0bGVTdG10LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZScpOwogICAgbXkgJHJlc3BTdG10ICA9ICR0aXRsZVN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3Jlc3BTdG10Jyk7CiAgICBteSAkcmVzcCAgICAgID0gJHJlc3BTdG10IC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncmVzcCcpOwogICAgbXkgJG5hbWUgICAgICA9ICRyZXNwU3RtdCAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ25hbWUnKTsKCiAgICAjIHNldCB0ZXh0cyBmb3IgdGl0bGVTdG10CiAgICAkdGl0bGUtPnNldF90ZXh0KCRMQUJFTCAuICIsIHBhZ2UgIiAuICRQQUdFTk8pOyAgICAjIEFjaHR1bmcgLSBQQUdFTk8gc2NoZWludCBtZWlzdCAiTm9uZSIgenUgc2VpbgogICAgJHJlc3AgLT5zZXRfdGV4dCgiY29tcGlsZWQgYnkgRXVSZUNvIik7CiAgICAkbmFtZSAtPnNldF90ZXh0KCJFdVJlQ286IEhMIik7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGZpbGVEZXNjL3B1YmxpY2F0aW9uU3RtdAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBteSAkcHVibGljYXRpb25TdG10ID0gJGZpbGVEZXNjICAgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncHVibGljYXRpb25TdG10Jyk7CiAgICBteSAkZGlzdHJpYnV0b3IgICAgID0gJHB1YmxpY2F0aW9uU3RtdC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZGlzdHJpYnV0b3InKTsKICAgIG15ICRub3RlICAgICAgICAgICAgPSAkZGlzdHJpYnV0b3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdub3RlJyk7CiAgICBteSAkYXZhaWxhYmlsaXR5ICAgID0gJHB1YmxpY2F0aW9uU3RtdC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYXZhaWxhYmlsaXR5Jyk7IAogICAgbXkgJGxpY2VuY2UgICAgICAgICA9ICRhdmFpbGFiaWxpdHkgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2xpY2VuY2UnKTsKCiAgICAjIHNldCB0ZXh0cyBmb3IgcHVibGljYXRpb25TdG10CiAgICAkbm90ZSAgIC0+c2V0X3RleHQoIk5PVCBGT1IgRElTVFJJQlVUSU9OIC0gdG8gYmUgdXNlZCBsb2NhbGx5IGluIEV1UmVDbyIpOwogICAgJGxpY2VuY2UtPnNldF90ZXh0KCJDTEFSSU4tUkVTIik7ICAjIFRPRE86IEF1c2Z1aGVybGljaGVyZSBMaWNlbmNlIGluZm8gaW4gS0xLIE1ldGFkYXRhIFJlY29yZAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBteSAkc291cmNlRGVzYyA9ICRmaWxlRGVzYyAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdzb3VyY2VEZXNjJyk7CiAgICBteSAkYmlibFN0cnVjdCAgID0gJHNvdXJjZURlc2MtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2JpYmxTdHJ1Y3QnKTsKCiAgICAjIGZpbGVEZXNjL3NvdXJjZURlc2MvYmlibFN0cnVjdC9hbmFseXRpYwogICAgbXkgJGFuYWx5dGljICAgICAgICAgICAgICAgID0gJGJpYmxTdHJ1Y3QtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2FuYWx5dGljJyk7CiAgICBteSAkYW5hbHl0aWNfdGl0bGUgICAgICAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RpdGxlJyAgICAgICAgPT4ge3R5cGUgPT4gIm1haW4ifSApOwojICAgIG15ICRhbmFseXRpY19kYXRlICAgICAgICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZGF0ZScpOwogICAgbXkgJGFuYWx5dGljX2RhdGVfeWVhciAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdkYXRlJyAgICAgICAgID0+IHt0eXBlID0+ICJ5ZWFyIn0pOwogICAgbXkgJGFuYWx5dGljX2RhdGVfbW9udGggICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdkYXRlJyAgICAgICAgID0+IHt0eXBlID0+ICJtb250aCJ9KTsKICAgIG15ICRhbmFseXRpY19kYXRlX2RheSAgICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZGF0ZScgICAgICAgICA9PiB7dHlwZSA9PiAiZGF5In0pOwogICAgbXkgJGFuYWx5dGljX2lkbm9fcGFnZWlkICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpZG5vJyAgICAgICAgID0+IHt0eXBlID0+ICJQQUdFSUQifSk7CiAgICBteSAkYW5hbHl0aWNfaWRub19iaW5kaW5naWQgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2lkbm8nICAgICAgICAgPT4ge3R5cGUgPT4gIkJJTkRJTkdJRCJ9KTsKICAgIG15ICRhbmFseXRpY19pZG5vX2lkICAgICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnaWRubycgICAgICAgICA9PiB7dHlwZSA9PiAiSUQifSk7CiAgICBteSAkYW5hbHl0aWNfaWRub19tZXRhZmlsZSAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2lkbm8nICAgICAgICAgPT4ge3R5cGUgPT4gIktJRUxJUEFOS0tJX01FVEFGSUxFTkFNRSJ9KTsKICAgIG15ICRhbmFseXRpY19pZG5vX29yaWdmaWxlICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnaWRubycgICAgICAgICA9PiB7dHlwZSA9PiAiS0lFTElQQU5LS0lfT1JJR0ZJTEVOQU1FIn0pOwogICAgbXkgJGFuYWx5dGljX3RleHRsYW5nICAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0ZXh0TGFuZycpOwoKICAgICMgc2V0IHRleHRzIGZvciBhbmFseXRpYwogICAgJGFuYWx5dGljX3RpdGxlICAgICAgICAgLT5zZXRfdGV4dCgkTEFCRUwgLiAiLCBwYWdlICIgLiAkUEFHRU5PKTsgICMgQWNodHVuZyAkUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUgenUgc2VpbiIKIyAgICAkYW5hbHl0aWNfZGF0ZSAgICAgICAgIC0+c2V0X3RleHQoJERBVEUpOwogICAgJGFuYWx5dGljX2RhdGVfeWVhciAgICAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzBdKTsKICAgICRhbmFseXRpY19kYXRlX21vbnRoICAgIC0+c2V0X3RleHQoJGRhdGVhcnJheVsxXSk7CiAgICAkYW5hbHl0aWNfZGF0ZV9kYXkgICAgICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMl0pOwogICAgJGFuYWx5dGljX2lkbm9fcGFnZWlkICAgLT5zZXRfdGV4dCgkUEFHRUlEKTsKICAgICRhbmFseXRpY19pZG5vX2JpbmRpbmdpZC0+c2V0X3RleHQoJEJJRCk7CiAgICAkYW5hbHl0aWNfaWRub19pZCAgICAgICAtPnNldF90ZXh0KCRJRCk7CiAgICAkYW5hbHl0aWNfaWRub19tZXRhZmlsZSAtPnNldF90ZXh0KCRNRVRBRklMRU5BTUUpOwogICAgJGFuYWx5dGljX2lkbm9fb3JpZ2ZpbGUgLT5zZXRfdGV4dCgkT1JJR0ZJTEVOQU1FKTsKICAgICRhbmFseXRpY190ZXh0bGFuZyAgICAgIC0+c2V0X3RleHQoJExBTkdVQUdFKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKICAgICMgZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0L21vbm9ncgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG15ICRtb25vZ3IgICAgICAgICAgICAgICA9ICRiaWJsU3RydWN0LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdtb25vZ3InKTsKICAgIG15ICRtb25vZ3JfdGl0bGUgICAgICAgICA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZScpOwogICAgbXkgJGltcHJpbnQgICAgICAgICAgICAgID0gJG1vbm9nciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2ltcHJpbnQnKTsgICAjIGltcHJpbnQgaXMgbmVlZGVkIGZvciB2YWxpZGlkdHkKICAgIG15ICRwdWJQbGFjZSAgICAgICAgICAgICA9ICRpbXByaW50ICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwdWJQbGFjZScpOyAgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdmFsaWRpdHkKICAgIG15ICRwdWJsaXNoZXIgICAgICAgICAgICA9ICRpbXByaW50ICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwdWJsaXNoZXInKTsgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdmFsaWRpdHkKICAgIG15ICRiaWJsU2NvcGVfaXNzdWV0aXRsZSA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdiaWJsU2NvcGUnICAgPT4ge3VuaXQgPT4gJ0lTU1VFVElUTEUnfSApOwogICAgbXkgJGJpYmxTY29wZV9pc3N1ZW5vICAgID0gJG1vbm9nciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2JpYmxTY29wZScgICA9PiB7dW5pdCA9PiAnSVNTVUVOTyd9ICk7CiAgICBteSAkYmlibFNjb3BlX2lzc3VlZGF0ZSAgPSAkbW9ub2dyICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYmlibFNjb3BlJyAgID0+IHt1bml0ID0+ICdJU1NVRURBVEUnfSApOwogICAgbXkgJGJpYmxTY29wZV9wcCAgICAgICAgID0gJG1vbm9nciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2JpYmxTY29wZScgICA9PiB7dW5pdCA9PiAnUEFHRU5PJ30gKTsgICAgICAjIEFjaHR1bmcgUEFHRU5PIGlzdCBtZWlzdCAiTm9uZSIgPwoKICAgICMgc2V0IHRleHRzIGZvciBtb25vZ3IKICAgICRtb25vZ3JfdGl0bGUgICAgICAgIC0+c2V0X3RleHQoJFBVQkxUSVRMRSk7CiAgICAkcHViUGxhY2UgICAgICAgICAgICAtPnNldF90ZXh0KCJUT0RPIik7CiAgICAkcHVibGlzaGVyICAgICAgICAgICAtPnNldF90ZXh0KCJUT0RPIik7CiAgICAkYmlibFNjb3BlX2lzc3VldGl0bGUtPnNldF90ZXh0KCRJU1NVRVRJVExFKTsKICAgICRiaWJsU2NvcGVfaXNzdWVubyAgIC0+c2V0X3RleHQoJElTU1VFTk8pOwogICAgJGJpYmxTY29wZV9pc3N1ZWRhdGUgLT5zZXRfdGV4dCgkSVNTVUVEQVRFKTsKICAgICRiaWJsU2NvcGVfcHAgICAgICAgIC0+c2V0X3RleHQoJFBBR0VOTyk7CiAKICAgICMtLS0tLS0tLS0tLS0tLS0KICAgICMgZW5jb2RpbmdEZXNjCiAgICAjLS0tLS0tLS0tLS0tLS0tCiAgICBteSAkdGFnc0RlY2wgICAgID0gJGVuY29kaW5nRGVzYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGFnc0RlY2wnKTsKICAgIG15ICRuYW1lc3BhY2UgICAgPSAkdGFnc0RlY2wgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICduYW1lc3BhY2UnICAgID0+IHtuYW1lID0+ICdodHRwOi8vd3d3LnRlaS1jLm9yZy9ucy8xLjAnfSk7CiAgICBteSAkdGFnVXNhZ2VfcyAgID0gJG5hbWVzcGFjZSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGFnVXNhZ2UnICAgICA9PiB7Z2kgICA9PiAncycsIG9jY3VycyA9PiAkU0VOVENPVU5UfSk7CiAgICBteSAkdGFnVXNhZ2VfdyAgID0gJG5hbWVzcGFjZSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGFnVXNhZ2UnICAgICA9PiB7Z2kgICA9PiAndycsIG9jY3VycyA9PiAkVE9LRU5DT1VOVH0pOwogICAgCiAgICAjLS0tLS0tLS0tLS0tLQogICAgIyBwcm9maWxlRGVzYwogICAgIy0tLS0tLS0tLS0tLS0KICAgIG15ICRsYW5nVXNhZ2UgICA9ICRwcm9maWxlRGVzYyAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2xhbmdVc2FnZScpOwogICAgbXkgJGxhbmd1YWdlICAgID0gJGxhbmdVc2FnZSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbGFuZ3VhZ2UnICAgICAgPT4ge2lkZW50ID0+ICRMQU5HVUFHRSwgdXNhZ2UgPT4gJFNVTUxBTkd9KTsKICAgICMgQWNodHVuZyBpbiBAdXNhZ2UgbXVzcyBlaWd0LiBlaW4gaW50ZWdlcjsgYW0gYmVzdGVuIGluaGFsdCB2b24gU1VNTEFORyBhdWZkcm9lc2VsbiB1bmQgbWVocmVyZSA8bGFuZ3VhZ2U+IG1hY2hlbgogICAgbXkgJHRleHRDbGFzcyAgID0gJHByb2ZpbGVEZXNjIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGV4dENsYXNzJyk7CiAgICBteSAkY2xhc3NDb2RlX2ZpICAgPSAkdGV4dENsYXNzICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdjbGFzc0NvZGUnID0+IHtzY2hlbWUgICAgICAgPT4gIktMS19QVUJMVFlQRSJ9KTsKIyAgICBteSAkY2xhc3NDb2RlX2VuICAgPSAkdGV4dENsYXNzICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdjbGFzc0NvZGUnID0+IHtzY2hlbWUgICAgICA9PiAiS0xLX1BVQkxUWVBFX01BUFBFRCJ9KTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHNldCB0ZXh0cyBmb3IgcHJvZmlsZURlc2MKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICRjbGFzc0NvZGVfZmkgLT5zZXRfdGV4dCgkUFVCTFRZUEUpOwojICAgICRjbGFzc0NvZGVfZW4tPnNldF90ZXh0KCRQVUJMVFlQRVRSQU5TTCk7CgogICAgIy0tLS0tLS0tLS0tLS0tLQogICAgIyByZXZpc2lvbkRlc2MKICAgICMtLS0tLS0tLS0tLS0tLS0KICAgIG15ICRjaGFuZ2UgICAgICA9ICRyZXZpc2lvbkRlc2MgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdjaGFuZ2UnICAgICAgID0+IHt3aGVuID0+IGxvY2FsdGltZS0+eW1kKCctJyksIHdobyA9PiAnSEwnICB9KTsKCiAgICAjIHNldCB0ZXh0cyBmb3IgcmV2aXNpb25EZXNjCiAgICAkY2hhbmdlLT5zZXRfdGV4dCgiVEVJIHZlcnNpb24gZm9yIEV1UmVDbyIpOwoKCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgIyBFTkQgT0YgQ1JFQVRJTkcgVEVJSEVBREVSCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgCn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCnN1YiBzZXRQIHsKICAgIG15ICgkcGFyYWdyYXBoKSA9IEBfOwogICAgCiAgICAkcGFyYWdyYXBoLT5zZXRfZ2koJ3AnKTsKICAgIAogICAgIyA8cGFyYWdyYXBoIGlkPSJwLWJjZDBmM2ZhLWJiZDNkYWM0LTgxNWVhZDdhIiBzdW1fbGFuZz0ifGZpbjoxfCI+CiAgICAjIGF0dHMgb2YgPHBhcmFncmFwaD46CiAgICAjICAgIEBpZCAgICAgICAgVVNFCiAgICAjICAgIEBzdW1fbGFuZyAgVVNFOiBwdXQgaW4geG1sOmxhbmcgYW5kIHByZWZpeCB0aGUgdmFsdWUgd2l0aCAieC0iIGZvciBwcml2YXRlIHZhbHVlCiAgICAKICAgICRwYXJhZ3JhcGgtPnNldF9hdHQoInhtbDpsYW5nIiwgIngtIiAuICRwYXJhZ3JhcGgtPmF0dCgic3VtX2xhbmciKSk7CiAgICAkcGFyYWdyYXBoLT5kZWxfYXR0KCJzdW1fbGFuZyIpOwogICAgJHBhcmFncmFwaC0+Y2hhbmdlX2F0dF9uYW1lKCdpZCcsICd4bWw6aWQnKTsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApzdWIgc2V0UyB7CiAgICBteSAoJHNlbnRlbmNlKSA9IEBfOwogICAgCiAgICAkc2VudGVuY2UtPnNldF9naSgncycpOwoJICAgIAogICAgIyB0aGUgYXR0cyBvZiA8c2VudGVuY2U+OgogICAgIyAgICBVU0UgICAxIEBpZD0icy1iY2QwZjNmYS1iYmQzZGFjNC1mNzQyOTA5MCIKICAgICMgICAgVVNFICAgMiBAbGFuZz0iZmluIiAtPiB4bWw6bGFuZyAKICAgICMgICAgPyAgICAgMyBAbGFuZ19jb25mPSIwLjY3MzQ4NTMiPiAtPiBUb0RvIEBjZXJ0ID8JICAgIAogICAgCiAgICAjIHNldCBhdHRycyBvZiA8cz4KICAgICRzZW50ZW5jZS0+c2V0X2F0dCgieG1sOmxhbmciLCAkc2VudGVuY2UtPmF0dCgibGFuZyIpKTsgICMgVG9EbzogY29udmVydCB0aGUgdmFsdWUgLyBpbnRyb2R1Y2UgYSBoYXNoIGZvciBsb29rdXAgKGlucHV0IHZhbHVlczogImZpbiIsICJ4eHgiLCAuLi4uKQogICAgJHNlbnRlbmNlLT5jaGFuZ2VfYXR0X25hbWUoJ2lkJywgJ3htbDppZCcpOwogICAgJHNlbnRlbmNlLT5kZWxfYXR0KCJsYW5nIik7ICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZWQgYnkgeG1sOmxhbmcKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgibGFuZ19jb25mIik7ICAgICAgICAgICAgICAgICAgICAjIGZvciB0aGUgdGltZSBiZWluZwogICAgCn0KCnN1YiBjcmVhdGVXIHsKICAgIG15ICgkd19lbGVtZW50LCAkbGluZSkgPSBAXzsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEdldCB0aGUgdGFncyAoPWNvbHVtbnMpCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15IEB0YWdzID0gc3BsaXQoL1x0LywgJGxpbmUpOwogICAgCiAgICAjIHNldCBjb250ZW50IG9mIDx3PiBpLmUuIHRoZSB0b2tlbgogICAgJHdfZWxlbWVudC0+c2V0X3RleHQoJHRhZ3NbMF0pOwogICAgCiAgICAjIHZydCBwb3NpdGlvbmFsLWF0dHJpYnV0ZXMgaW4gY29ycHVzIEtMSzoKICAgICMgIFVTRSBbMF0gd29yZAogICAgIyAgVVNFIFsxXSByZWYgIChpZCBmb3IgcmVmZXJlbmNlIG9mIGRlcGhlYWQpCiAgICAjICBVU0UgWzJdIGxlbW1hCiAgICAjICA/ICAgWzNdIGxlbW1hY29tcCAgIChsZW1tYSB3aXRoIGNvbXBvdW5kIGluZm8gLSBjb3VsZCBnbyBpbiBAbm9ybSwgYXMgdGFnIGFidXNlPykKICAgICMgIFVTRSBbNF0gcG9zIAogICAgIyAgVVNFIFs1XSBtc2QgCiAgICAjICBVU0UgWzZdIGRlcGhlYWQKICAgICMgIFVTRSBbN10gZGVwcmVsIAogICAgIyAgICAgIFs4XSBjb250ZW50ICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgIFs5XSB2cG9zICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEwXSBvY3IgICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzExXSBjYyAgICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEyXSBoeXBoICAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzEzXSBzdHlsZSAgICAgKG9jci1wcm9jZXNzKQogICAgIyAgICAgWzE0XSBsZXggICAgICAgKGtvcnAgc2VtYW50aWMgZGlzYW1iaWd1YXRpb24gZnJvbSBHIm90ZWJvcmcpCiAgICAKICAgICMgc2V0IHRoZSBhdHRyaWJ1dGVzIG9mIDx3PjoKICAgICR3X2VsZW1lbnQtPnNldF9hdHQoIm4iLCAgICAgICR0YWdzWzFdKTsKICAgICMgJHdfZWxlbWVudC0+c2V0X2F0dCgiaWQiLCAgICAgIndfIiAuICRuYW1lYXJyYXlbNF0gLiAkc2VudGVuY2UtPmF0dCgieG1sOmlkIikgLiAiXyIgLiAkdGFnc1sxXSk7CiAgICAjIHNvIHp1c2FtbWVuZ2ViYXV0ZSBJRCBpc3QgYXVjaCBuaWNodCBlaW5kZXV0aWcuLi4KICAgICR3X2VsZW1lbnQtPmNoYW5nZV9hdHRfbmFtZSgnaWQnLCAneG1sOmlkJyk7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJsZW1tYSIsICAkdGFnc1syXSk7CiAgICAjICR3X2VsZW1lbnQtPnNldF9hdHQoIm5vcm0iLCAgICR0YWdzWzNdKTsgICMgdGFnIGFidXNlIG9mIEBub3JtCiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJwb3MiLCAgICAkdGFnc1s0XSk7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJtc2QiLCAgICAkdGFnc1s1XSk7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJoZWFkIiwgICAkdGFnc1s2XSk7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJkZXByZWwiLCAkdGFnc1s3XSk7CiAgICAKfQogICAgCiMjIyMjIyMjIyMjIyMjIyMjCiMjIHVzYWdlX21lc3NhZ2UKIyMjIyMjIyMjIyMjIyMjIyMKCgpzdWIgdXNhZ2VfbWVzc2FnZSB7CiAgICBwcmludCAiICAgVXNhZ2U6ICAuL3htbDJpNS5wbCA8ZmlsZS52cnQueG1sPiA8b3V0ZmlsZT5cbiI7CiAgICBwcmludCAiICAgPGZpbGUudnJ0LnhtbD4gaXMgYSBWUlQgZmlsZSBjb252ZXJ0ZWQgdG8gcHJvcGVyIFhNTFxuIjsKICAgIGV4aXQ7Cn0KCgo=