IyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1Z25jdGlvbgojIFVzYWdlOiAgLi92cnQydGVpLnBsIDx2cnR4bWxmaWxlLnhtbD4gPG91dGZpbGU+CiMgICAgICAgICA8dnJ0eG1sZmlsZT46IHhtbC1pc2VkIHZydCBmaWxlCiMKIwojIFRPRE86IAojIDEgIGluc2VydCBkdGQgc3BlYywgb3IgcmVmIHRvIFRFSQoKIyAzYSBVUExPQUQgaW4gR0lUSFVCCiMgM2IgYWRkIEBoZWFkIGFuZCBAZGVwcmVsIHRvIEk1IHNvd2llIGF1Y2ggQG1zZAojIDNjIGJlYXJiZWl0dW5nIHZvbiBAaGVhZCB1bmQgQGRlcHJlbCBpbiB0ZWkya29yYXB4bWwgZHVyY2ggTmlscz8KIyAzZCBidWlsZCAzMCBiaWxsaW9uIGNvcnB1cwoKIyA0YSB0YWtlIGNhcmUgb2YgSURzCiMgNGIgc2VlIHRvIHRoZSB2YWx1ZXMgb2YgQHhtbDpsYW5nCiMgNSBhYmZhbmdlbiB2b24gdW5lcndhcnRldGVuIGVsZW1lbnRlbiBkaCBhbmRlcmUgYWxzIDxzZW50ZW5jZT4gdW5kIDxwYXJhZ3JhcGg+CiMgNWEgd29ydCByZWloZW5mb2xnZSBub2NobWFsIGNoZWNrZW4KIyA2IGNoZWNrcyBhbmQgYmFsYW5jZXMKIyA2YSBvdXRwdXQgbmFjaCBzdGRvdXQgbWFjaGVuCiMgNyAgSG93IHRvIGVuY29kZSBLaWVsaXBhbmtraSBhbmQgTmF0aW9uYWwgTGlicmFyeSBvZiBGaW5sYW5kPyBpbiB0ZWlDb3JwdXMgSGVhZGVyCiMgOCAgY29uc3RydWN0IDxpZHNEb2M+cyBmb3IgdGhlIG1vbnRocyAob3IgZ28gZm9yIFRFSSkKIyA5ICBwYXJhbGxlbGlzYXRpb24gaW4gYmFzaCBhbmQgYXBwbGljYXRpb24gb24gc3ViIGNvcnBvcmEgb2YgS0xLCiMgMTAgIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBnYXdrIGNvZGUgaW4gdGhlIHBlcmwgc2NyaXB0CiMgMTIgIHJlLWltcGxlbWVudCBjcmVhdGlvbiBvZiB0ZXh0IGhlYWRlciBmcm9tIHhtbCBmaWxlIGluIGFub3RoZXIgdHdpZyAvIHBhcmFtZXRyaXplIFRFSSB2cyBJNQoKCgojcmVtZW1iZXIKI2Zvcm1hdHRlZC54bWw6MTA1NjEzOiBlbGVtZW50IHc6IHZhbGlkaXR5IGVycm9yIDogTm8gZGVjbGFyYXRpb24gZm9yIGF0dHJpYnV0ZSBkZXByZWwgb2YgZWxlbWVudCB3CiNmb3JtYXR0ZWQueG1sOjEwNTYxMzogZWxlbWVudCB3OiB2YWxpZGl0eSBlcnJvciA6IE5vIGRlY2xhcmF0aW9uIGZvciBhdHRyaWJ1dGUgaGVhZCBvZiBlbGVtZW50IHcKCgojCiMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIFhNTDo6VHdpZzsgCnVzZSBYTUw6OkdlbmVyYXRvciAnOnByZXR0eSc7ICAjIGFwcGFyZW50bHkgbm8gZWZmZWN0IHdoZW4gdXNpbmcgZmx1c2goKTsKCiAKdXNlIGxvY2FsZTsgICAgICAgICAgICAgICAgICMgZGllc2UgZHJlaSBaZWlsZW4sIGRhbWl0IFxiIGltIHJlZ2V4IG5pY2h0IFVtbGF1dGUgdW5kIN8gbWF0Y2h0Lgp1c2UgUE9TSVggcXcobG9jYWxlX2gpOyAgICAgIyB0byBiZSBhYmxlIHRvIHVzZSBzZXRsb2NhbGUoKQojc2V0bG9jYWxlKExDX0FMTCwnZGVfREUnKTsgIApzZXRsb2NhbGUoTENfQUxMLCAiZmlfRkkiKTsgIAp1c2UgdXRmODsKdXNlIG9wZW4gcXcoIDpzdGQgOmVuY29kaW5nKFVURi04KSApOwoKdXNlIFRpbWU6OlBpZWNlOwp1c2UgVGllOjpJeEhhc2g7CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGNoZWNrIGZpbGUgYXJndW1lbnRzOgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBhcmcwIGluZmlsZTogICB2cnQteG1sCiMgYXJnMSBvdXRmaWxlOiAgdGVpCgp1bmxlc3MoJEFSR1ZbMV0pIHsmdXNhZ2VfbWVzc2FnZSgpfTsgIyBtaW4gYXJnMCB1bmQgYXJnMQppZiAoJEFSR1ZbMl0pIHsmdXNhZ2VfbWVzc2FnZSgpfTsgICAgIyBtYXggYXJnMQoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBHTE9CQUwgVkFSSUFCTEVTIAojIyMjIyMjIyMjIyMjIyMjIyMjIwoKbXkgJGVuY29kaW5nID0gIlVURi04IjsgICAgICAgICAgICAgICAKI215ICRlbmNvZGluZyA9ICJpc28tODg1OS0xIjsgICAgICAgICAgICAgIyBkaWVzZXMgJGVuY29kaW5nIGlzdCBOVVIgZnVlciBkYXMgb3V0cHV0IHMudS4gdHdpZyBmdW5rdGlvbgpteSAkdGV4dGNvdW50ZXIgPSAwOwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICBNIEEgSSBOICAKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKIyBvcGVuIHJlc3VsdCBmaWxlIGFuZCBpbml0aWFsaXNlIGZpbGVoYW5kbGUKb3BlbihteSAkT1VULCAiPiAkQVJHVlsxXSIpIHx8IGRpZSgiY2Fubm90IG9wZW4gZmlsZTogJEFSR1ZbMV0iKTsgCgoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHN0YXJ0IHR3aWcgYW5kIGNhbGwgc3RhcnQgdGFnIGhhbmRsZXIgZm9yIHJvb3QgYW5kIHR3aWcgaGFuZGxlciBmb3IgZWFjaCA8dGV4dD4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkdHdpZz0iIjsgICAKCiR0d2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsICAgICAgICAgICAjIGRhZHVyY2ggYXVjaCB3aGl0ZXNwYWNlcyBhbiBlaGVtZWxpZ2VuIGVsZW1lbnRncmVuemVuIGltIG91dHB1dAogICAga2VlcF9hdHRzX29yZGVyID0+IDEsICAgICAgICMgcmVxdWlyZXMgVGllOjpJeEhhc2gKICAgIHByZXR0eV9wcmludCA9PiAnaW5kZW50ZWQnLAogICAgc3RhcnRfdGFnX2hhbmRsZXJzID0+IHsKICAgIAl0ZXh0cyA9PiBcJnJvb3QKICAgIH0sCiAgICB0d2lnX2hhbmRsZXJzID0+ICB7Cgl0ZXh0ID0+IFwmdGV4dAogICAgfSwKICAgICMgZHRkX2hhbmRsZXJzID0+ICAgeyAgICAgICAjIFRvRG8gZm9yIEk1CiAgICAjCVwmc2V0X2R0ZDsKICAgICMgfQogICAgb3V0cHV0X2VuY29kaW5nID0+ICRlbmNvZGluZywKICAgICk7CgokdHdpZy0+cGFyc2VmaWxlKCRBUkdWWzBdKTsKCmNsb3NlKCRPVVQpOwoKCiMjIyMjIyMjIyMjCiMgRU5EIE1BSU4KIyMjIyMjIyMjIyMKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgUyBVIEIgUiBPIFUgVCBJIE4gRSBTCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBzdWIgc2V0X2R0ZCBbCiMgICAgbXkgJHR3aWcsICRkdGQgPSBAXzsKIyAgICBteSAkaW50ZXJuYWwgPSBxcXxcblBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iXG4iRFREL3hodG1sMS1zdHJpY3QuZHRkInw7CiMKIyAgICAkdHdpZy0+dHdpZ19kb2N0eXBlKCdodG1sJywgdW5kZWYsIHVuZGVmLCAkaW50ZXJuYWwpOwojICAgIH0KCgoKc3ViIHJvb3QgewogICAgbXkgKCR0d2lnLCAkcm9vdCkgPUBfOwoKICAgICRyb290LT5zZXRfZ2koJ3RlaUNvcnB1cycpOwogICAgJHJvb3QtPnNldF9hdHQoInhtbG5zIiwgJ2h0dHA6Ly93d3cudGVpLWMub3JnL25zLzEuMCcpOwoKICAgICZpbnNlcnRDb3JwdXNIZWFkZXIoJHJvb3QpOyAgICAKfQoKCnN1YiBpbnNlcnRDb3JwdXNIZWFkZXJ7CiAgICBteSAoJHJvb3QpID1AXzsKCiAgICBteSBAYXJyYXkgPSBzcGxpdCgvXC8vLCAkQVJHVlswXSk7CiAgICBteSAkbCA9IHNjYWxhcihAYXJyYXkpOwogICAgbXkgJHNvdXJjZSA9ICRhcnJheVskbC0xXTsKICAgICRzb3VyY2UgPX4gcy9cLnhtbC8vOwogICAgJHNvdXJjZSA9ICRzb3VyY2UgLiAiIGZyb20ga2xrLWZpLXYyLXZydCI7ICAgICAgICMgZm9yIHRoZSB0aW1lIGJlaW5nOyBUT0RPCiAgICAKICAgIG15ICR0ZWlIZWFkZXIgICAgICAgID0gJHJvb3QgICAgICAgICAgIC0+aW5zZXJ0X25ld19lbHQoImZpcnN0X2NoaWxkIiwgJ3RlaUhlYWRlcicpOyAgICAKICAgIG15ICRmaWxlRGVzYyAgICAgICAgID0gJHRlaUhlYWRlciAgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnZmlsZURlc2MnKTsKICAgIG15ICRwcm9maWxlRGVzYyAgICAgID0gJHRlaUhlYWRlciAgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncHJvZmlsZURlc2MnKTsKICAgIAogICAgbXkgJHRpdGxlU3RtdCAgICAgICAgPSAkZmlsZURlc2MgICAgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICd0aXRsZVN0bXQnKTsKICAgIG15ICR0aXRsZSAgICAgICAgICAgID0gJHRpdGxlU3RtdCAgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGl0bGUnKTsKICAgICR0aXRsZSAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJHNvdXJjZSAuICIgZnJvbSBLTEstZmktMjAyMSBmb3IgRXVSZUNvIik7CiAgICAKICAgIG15ICRwdWJsaWNhdGlvblN0bXQgID0gJGZpbGVEZXNjICAgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncHVibGljYXRpb25TdG10Jyk7CiAgICBteSAkZGlzdHJpYnV0b3IgICAgICA9ICRwdWJsaWNhdGlvblN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2Rpc3RyaWJ1dG9yJyk7CiAgICAkZGlzdHJpYnV0b3IgICAgICAgICAtPnNldF90ZXh0KCJOT1QgRk9SIERJU1RSSUJVVElPTiAtIHRvIGJlIHVzZWQgbG9jYWxseSBpbiBFdVJlQ28iKTsKCiAgICBteSAkc291cmNlRGVzYyAgICAgICA9ICRmaWxlRGVzYyAgICAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3NvdXJjZURlc2MnKTsKICAgIG15ICRiaWJsICAgICAgICAgICAgID0gJHNvdXJjZURlc2MgICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYmlibCcpOwogICAgJGJpYmwgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkc291cmNlKTsKCiAgICBteSAkbGFuZ1VzYWdlICAgICAgICA9ICRwcm9maWxlRGVzYyAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2xhbmdVc2FnZScpOwogICAgbXkgJGxhbmd1YWdlICAgICAgICAgPSAkbGFuZ1VzYWdlICAgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdsYW5ndWFnZScpOwogICAgJGxhbmd1YWdlICAgICAgICAgICAgLT5zZXRfYXR0KCJpZGVudCIsJ2ZpJyk7CiAgICAkbGFuZ3VhZ2UgICAgICAgICAgICAtPnNldF90ZXh0KCJGaW5uaXNoIik7Cn0KICAgIAogICAgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgaGFuZGxlciAmdGV4dCBmb3IgPHRleHQ+CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdWIgdGV4dCB7CiAgICBteSAoJHR3aWcsICR0ZXh0KSA9IEBfOwoKICAgICR0ZXh0Y291bnRlcisrOyAgICAgICAgICAgICAgICMgZ2xvYmFsIHZhcmlhYmxlCgogICAgIyBUb0RvOiBjYXRjaCBhbGwgb3RoZXIsIHVuZXhwZWN0ZWQgY2hpbGRyZW4gb2Ygcm9vdAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBHZXQgdGV4dCBtZXRhZGF0YSAoYXR0cmlidXRlcyBvZiA8dGV4dD4pIGFuZCBjcmVhdGUgdGVpSGVhZGVyIGZvciA8dGV4dD4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSAkdGV4dGF0dHNyZWYgPSAkdGV4dC0+YXR0cygpOyAgICAgICAgICAgICAgICMgJHRleHRhdHRzcmVmIGlzIG5vdyBhIHJlZmVyZW5jZSB0byBhIGhhc2ggYW5kIHNob3VsZCBiZSB1c2VkIHdpdGggJy0+JwoKICAgICZjcmVhdGVUZXh0SGVhZGVyKCR0ZXh0LCAkdGV4dGF0dHNyZWYpOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgPFRFST4gZnJvbSA8dGV4dD4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAjIHNldCB2cnQgPHRleHQ+IHRvIDxURUk+IGFuZCBkZWxldGUgYWxsIGF0dHJpYnV0ZXMgYWZ0ZXIgdGhleSB3ZXJlIHdlcmUgc2F2ZWQgYWJvdmUKICAgICR0ZXh0LT5kZWxfYXR0czsKICAgICR0ZXh0LT5zZXRfZ2koIlRFSSIpOwogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSB0aGUgPHRlaTp0ZXh0PiwgPGJvZHk+LCA8ZGl2PiBlbGVtZW50cyBpbnNpZGUgPFRFST4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgJHR0ZXh0X2VsZW1lbnQgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCd0ZXh0Jyk7CiAgICBteSAkYm9keV9lbGVtZW50ICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2JvZHknKTsKICAgIG15ICRkaXZfZWxlbWVudCAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnZGl2Jyk7CgogICAgIyBzZXQgYXR0cwogICAgJGRpdl9lbGVtZW50ICAtPnNldF9hdHQoInR5cGUiLCAicGFnZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb0RvOiB0aGlzIGlzIHNwZWNpZmljIHRvIEtMSwogICAgJHR0ZXh0X2VsZW1lbnQtPnNldF9hdHQoInhtbDpsYW5nIiwgJ2ZpJyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgaW4gSUNDLU5PUgoKICAgICMgcGFzdGUKICAgICR0dGV4dF9lbGVtZW50LT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkdGV4dCk7CiAgICAkYm9keV9lbGVtZW50IC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJHR0ZXh0X2VsZW1lbnQpOwogICAgJGRpdl9lbGVtZW50ICAtPnBhc3RlKCdsYXN0X2NoaWxkJywgICRib2R5X2VsZW1lbnQpOwoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIDxwPiBmcm9tIDxwYXJhZ3JhcGg+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSBAcGFyYWdyYXBocyA9ICR0ZXh0LT5jaGlsZHJlbiggJ3BhcmFncmFwaCcpOwoKICAgIGZvcmVhY2ggbXkgJHBhcmFncmFwaCAoQHBhcmFncmFwaHMpIHsKCQoJJnNldFAoJHBhcmFncmFwaCk7CgoJJHBhcmFncmFwaC0+bW92ZSgnbGFzdF9jaGlsZCcsICRkaXZfZWxlbWVudCk7CgkKCQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJIyBjcmVhdGUgPHM+IGZyb20gPHNlbnRlbmNlPgoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCglteSBAc2VudGVuY2VzID0gJHBhcmFncmFwaC0+Y2hpbGRyZW4oJ3NlbnRlbmNlJyk7Cglmb3JlYWNoIG15ICRzZW50ZW5jZSAoQHNlbnRlbmNlcykgewoKCSAgICAmc2V0Uygkc2VudGVuY2UpOwoKCgkgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICAgIyBjcmVhdGUgPHc+ICh3b3JkKSBmcm9tIGVhY2ggJGxpbmUKCSAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgICAKCSAgICBteSBAbGluZXMgPSBzcGxpdCgvXG4rLywgJHNlbnRlbmNlLT54bWxfdGV4dCk7CgkgICAgJHNlbnRlbmNlLT5zZXRfdGV4dCgiXG4iKTsKCgkgICAgZm9yIG15ICRsaW5lIChAbGluZXMpeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVG9kbzogUmVpaGVuZm9sZ2UgY2hlY2tlbgoJCWlmKCRsaW5lIG5lICIiICl7CgkJICAgIG15ICR3X2VsZW1lbnQgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCd3Jyk7CgkJICAgICZjcmVhdGVXKCR3X2VsZW1lbnQsICRsaW5lKTsKCQkgICAgJHdfZWxlbWVudC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAkc2VudGVuY2UpOwoJCX0KCSAgICB9ICMgZW5kIHdvcmRzCgl9ICMgZW5kIHNlbnRlbmNlcwogICAgfSAjIGVuZCBwYXJhZ3JhcGhzCgogICAgJHR3aWctPmZsdXNoKCRPVVQpOwp9ICAgIyBlbmQgdGV4dHMKCgpzdWIgY3JlYXRlVGV4dEhlYWRlcnsKICAgIG15ICgkdGV4dCwgJHRleHRhdHRzcmVmKSA9IEBfOwogICAgCiAgICAjIFVTRSAwMSBiaW5kaW5nX2lkPSIyMjQ2MDI1IgogICAgIyBVU0UgMDIgZGF0ZT0iMjAyMS0wMS0xNSIKICAgICMgICAgIDAzIGRhdGVmcm9tPSIyMDIxMDExNSIKICAgICMgICAgIDA0IGRhdGV0bz0iMjAyMTAxMTUiCiAgICAjICAgICAwNSBlbGVjX2RhdGU9Il8iCiAgICAjICAgICAwNiBmaWxlPSIiCiAgICAjIFVTRSAwNyBmaWxlbmFtZV9tZXRhZGF0YT0iZmluY2xhcmluX3NpaXJ0b19rMjAyMS8wMDM5LTU1NTIvMjAyMS9hbHRvLzIyNDYwMjVfMDAzOS01NTUyXzIwMjEtMDEtMTVfU0swMjIxX21ldHMueG1sIgogICAgIyBVU0UgMDggZmlsZW5hbWVfb3JpZyAgICA9ImZpbmNsYXJpbl9zaWlydG9fazIwMjEvMDAzOS01NTUyLzIwMjEvYWx0by8yMjQ2MDI1XzAwMzktNTU1Ml8yMDIxLTAxLTE1X1NLMDIyMV9wYWdlLTIwMjEwMTE1MDIyMTAwMzAzMDEueG1sCiAgICAjIFVTRSAwOSBpZD0idC1iY2QwZjNmYS1iYmQzZGFjNCIKICAgICMgICAgIDEwIGltZ191cmw9IiIKICAgICMgVVNFIDExIGlzc3VlX2RhdGU9IjE1LjAxLjIwMjEiCiAgICAjIFVTRSAxMiBpc3N1ZV9ubz0iU0swMjIxIgogICAgIyBVU0UgMTMgaXNzdWVfdGl0bGU9IlN1b21lbiBLdXZhbGVodGkiCiAgICAjIFVTRSAxNCBsYWJlbD0iU3VvbWVuIEt1dmFsZWh0aSBuby4gU0swMjIxIDE1LjAxLjIwMjEiCiAgICAjIFVTRSAxNiBsYW5ndWFnZT0iZmkiCiAgICAjIFVTRSAxNyBwYWdlX2lkPSJwMSIKICAgICMgVVNFIDE4IHBhZ2Vfbm89Ik5vbmUiCiAgICAjICAgICAxOSBwYXJ0X25hbWU9Il8iCiAgICAjICAgICAyMCBwdWJsX2lkPSIwMDM5LTU1NTIiCiAgICAjICAgICAyMSBwdWJsX3BhcnQ9IiIKICAgICMgVVNFIDIyIHB1YmxfdGl0bGU9IlN1b21lbiBLdXZhbGVodGkiIAogICAgIyBVU0UgMjMgcHVibF90eXBlPSJhaWtha2F1c2kiCiAgICAjIFVTRSAyNCBzZW50Y291bnQ9IjcwIgogICAgIyBVU0UgMjUgc3VtX2xhbmc9Inx4eHg6NDR8ZmluOjIzfGVuZzozfCIKICAgICMgICAgIDI2IHRpbWVmcm9tPSIwMDAwMDAiCiAgICAjICAgICAyNyB0aW1ldG89IjIzNTk1OSIKICAgICMgVVNFIDI4IHRva2VuY291bnQ9IjMwNCIKICAgICMgICAgIDI5IHZlcnNpb25fYWRkZWQ9IktMSy1maS0yMDIxIj4KCgogICAgbXkgJEJJRCAgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydiaW5kaW5nX2lkJ307CiAgICBteSAkREFURSAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2RhdGUnfTsKICAgIG15ICRNRVRBRklMRU5BTUUgPSAkdGV4dGF0dHNyZWYtPnsnZmlsZW5hbWVfbWV0YWRhdGEnfTsgICAgCiAgICBteSAkT1JJR0ZJTEVOQU1FID0gJHRleHRhdHRzcmVmLT57J2ZpbGVuYW1lX29yaWcnfTsKICAgIG15ICRJRCAgICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnaWQnfTsKICAgIG15ICRJU1NVRURBVEUgICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfZGF0ZSd9OwogICAgbXkgJElTU1VFTk8gICAgICA9ICR0ZXh0YXR0c3JlZi0+eydpc3N1ZV9ubyd9OwogICAgbXkgJElTU1VFVElUTEUgICA9ICR0ZXh0YXR0c3JlZi0+eydpc3N1ZV90aXRsZSd9OwogICAgbXkgJExBQkVMICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydsYWJlbCd9OwogICAgbXkgJExBTkdVQUdFICAgICA9ICR0ZXh0YXR0c3JlZi0+eydsYW5ndWFnZSd9OwogICAgbXkgJFBBR0VJRCAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwYWdlX2lkJ307CiAgICBteSAkUEFHRU5PICAgICAgID0gJHRleHRhdHRzcmVmLT57J3BhZ2Vfbm8nfTsKICAgIG15ICRQVUJMVElUTEUgICAgPSAkdGV4dGF0dHNyZWYtPnsncHVibF90aXRsZSd9OwogICAgbXkgJFBVQkxUWVBFICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwdWJsX3R5cGUnfTsKICAgIG15ICRTRU5UQ09VTlQgICAgPSAkdGV4dGF0dHNyZWYtPnsnc2VudGNvdW50J307CiAgICBteSAkU1VNTEFORyAgICAgID0gJHRleHRhdHRzcmVmLT57J3N1bV9sYW5nJ307CiAgICBteSAkVE9LRU5DT1VOVCAgID0gJHRleHRhdHRzcmVmLT57J3Rva2VuY291bnQnfTsKCiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBEZXJpdmVkIE1ldGFkYXRhIHZhcmlhYmxlcwogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgbXkgQGRhdGVhcnJheSA9IHNwbGl0KCItIiwgJERBVEUpOwogICAgbXkgQGxhbmdhcnJheSA9IHNwbGl0KCJ8IiwgJFNVTUxBTkcpOwogICAgbXkgQG5hbWVhcnJheSA9IHNwbGl0KC9bXC5cL10vLCAkT1JJR0ZJTEVOQU1FKTsgICMgdXNlICRuYW1lYXJyYXlbNF0gYXMgSUQgZm9yIHRoZSBwYWdlCiAgICAKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgQ1JFQVRFIHRleHQtdGVpSGVhZGVyIEFDQ09SRElORyBUTyBUSEUgU0tFTEVUT04gaW4ga2xrLWhlYWRlci50ZWkueG1sCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAjIGNyZWF0ZSA8dGVpSGVhZGVyPiBpbnNpZGUgPFRFST4KICAgIG15ICR0ZWlIZWFkZXIgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCd0ZWlIZWFkZXInKTsKICAgICR0ZWlIZWFkZXItPnBhc3RlKCdmaXJzdF9jaGlsZCcsICR0ZXh0KTsKCiAgICAjIyBpbnNlcnRfbmV3X2VsdCBpcyBhIGNvbWJvIG9mIG5ldyBhbmQgcGFzdGUsIGNmLiB4bWw6OnR3aWcgZG9jdToKICAgICMjIGluc2VydF9uZXdfZWx0ICgkb3B0X3Bvc2l0aW9uLCAkZ2ksICRvcHRfYXR0c19oYXNocmVmLCBAb3B0X2NvbnRlbnQpCiAgICAKICAgIG15ICRmaWxlRGVzYyAgICAgPSAkdGVpSGVhZGVyLT5pbnNlcnRfbmV3X2VsdCgnZmlsZURlc2MnICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4ge24gPT4gIkV1UmVDb19LTEstZmlfIiAuICRuYW1lYXJyYXlbNF19KTsKICAgIG15ICRlbmNvZGluZ0Rlc2MgPSAkdGVpSGVhZGVyLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdlbmNvZGluZ0Rlc2MnKTsKICAgIG15ICRwcm9maWxlRGVzYyAgPSAkdGVpSGVhZGVyLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwcm9maWxlRGVzYycpOwogICAgbXkgJHJldmlzaW9uRGVzYyA9ICR0ZWlIZWFkZXItPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3JldmlzaW9uRGVzYycpOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgZmlsZURlc2MvdGl0bGVTdG10CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBteSAkdGl0bGVTdG10ID0gJGZpbGVEZXNjIC0+aW5zZXJ0X25ld19lbHQoJ3RpdGxlU3RtdCcpOwogICAgbXkgJHRpdGxlICAgICA9ICR0aXRsZVN0bXQtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RpdGxlJyk7CiAgICBteSAkcmVzcFN0bXQgID0gJHRpdGxlU3RtdC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncmVzcFN0bXQnKTsKICAgIG15ICRyZXNwICAgICAgPSAkcmVzcFN0bXQgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdyZXNwJyk7CiAgICBteSAkbmFtZSAgICAgID0gJHJlc3BTdG10IC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbmFtZScpOwoKICAgICMgc2V0IHRleHRzIGZvciB0aXRsZVN0bXQKICAgICMgJHRpdGxlLT5zZXRfdGV4dCgkTEFCRUwgLiAiLCBwYWdlICIgLiAkUEFHRU5PKTsgICAgICAgICAgICMgQWNodHVuZyAtIFBBR0VOTyBzY2hlaW50IG1laXN0ICJOb25lIiB6dSBzZWluCiAgICAkdGl0bGUtPnNldF90ZXh0KCRMQUJFTCAuICIsIFRleHQgIyIgLiAkdGV4dGNvdW50ZXIpOyAgICAjIGF0IGxlYXN0IGZvciBTdW9tZW4gS3V2YWxlaHRpCiAgICAkcmVzcCAtPnNldF90ZXh0KCJjb21waWxlZCBieSBFdVJlQ28iKTsKICAgICRuYW1lIC0+c2V0X3RleHQoIkV1UmVDbzogSEwiKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgZmlsZURlc2MvcHVibGljYXRpb25TdG10CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG15ICRwdWJsaWNhdGlvblN0bXQgPSAkZmlsZURlc2MgICAgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdwdWJsaWNhdGlvblN0bXQnKTsKICAgIG15ICRkaXN0cmlidXRvciAgICAgPSAkcHVibGljYXRpb25TdG10LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdkaXN0cmlidXRvcicpOwogICAgbXkgJG5vdGUgICAgICAgICAgICA9ICRkaXN0cmlidXRvciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ25vdGUnKTsKICAgIG15ICRhdmFpbGFiaWxpdHkgICAgPSAkcHVibGljYXRpb25TdG10LT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdhdmFpbGFiaWxpdHknKTsgCiAgICBteSAkbGljZW5jZSAgICAgICAgID0gJGF2YWlsYWJpbGl0eSAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbGljZW5jZScpOwoKICAgICMgc2V0IHRleHRzIGZvciBwdWJsaWNhdGlvblN0bXQKICAgICRub3RlICAgLT5zZXRfdGV4dCgiTk9UIEZPUiBESVNUUklCVVRJT04gLSB0byBiZSB1c2VkIGxvY2FsbHkgaW4gRXVSZUNvIik7CiAgICAkbGljZW5jZS0+c2V0X3RleHQoIkNMQVJJTi1SRVMiKTsgICMgVE9ETzogQXVzZnVoZXJsaWNoZXJlIExpY2VuY2UgaW5mbyBpbiBLTEsgTWV0YWRhdGEgUmVjb3JkCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBmaWxlRGVzYy9zb3VyY2VEZXNjL2JpYmxTdHJ1Y3QKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIG15ICRzb3VyY2VEZXNjID0gJGZpbGVEZXNjICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3NvdXJjZURlc2MnKTsKICAgIG15ICRiaWJsU3RydWN0ICAgPSAkc291cmNlRGVzYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYmlibFN0cnVjdCcpOwoKICAgICMgZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0L2FuYWx5dGljCiAgICBteSAkYW5hbHl0aWMgICAgICAgICAgICAgICAgPSAkYmlibFN0cnVjdC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYW5hbHl0aWMnKTsKICAgIG15ICRhbmFseXRpY190aXRsZSAgICAgICAgICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGl0bGUnICAgICAgICA9PiB7dHlwZSA9PiAibWFpbiJ9ICk7CiMgICAgbXkgJGFuYWx5dGljX2RhdGUgICAgICAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdkYXRlJyk7CiAgICBteSAkYW5hbHl0aWNfZGF0ZV95ZWFyICAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2RhdGUnICAgICAgICAgPT4ge3R5cGUgPT4gInllYXIifSk7CiAgICBteSAkYW5hbHl0aWNfZGF0ZV9tb250aCAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2RhdGUnICAgICAgICAgPT4ge3R5cGUgPT4gIm1vbnRoIn0pOwogICAgbXkgJGFuYWx5dGljX2RhdGVfZGF5ICAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdkYXRlJyAgICAgICAgID0+IHt0eXBlID0+ICJkYXkifSk7CiAgICBteSAkYW5hbHl0aWNfaWRub19wYWdlaWQgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2lkbm8nICAgICAgICAgPT4ge3R5cGUgPT4gIlBBR0VJRCJ9KTsKICAgIG15ICRhbmFseXRpY19pZG5vX2JpbmRpbmdpZCA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnaWRubycgICAgICAgICA9PiB7dHlwZSA9PiAiQklORElOR0lEIn0pOwogICAgbXkgJGFuYWx5dGljX2lkbm9faWQgICAgICAgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpZG5vJyAgICAgICAgID0+IHt0eXBlID0+ICJJRCJ9KTsKICAgIG15ICRhbmFseXRpY19pZG5vX21ldGFmaWxlICA9ICRhbmFseXRpYy0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnaWRubycgICAgICAgICA9PiB7dHlwZSA9PiAiS0lFTElQQU5LS0lfTUVUQUZJTEVOQU1FIn0pOwogICAgbXkgJGFuYWx5dGljX2lkbm9fb3JpZ2ZpbGUgID0gJGFuYWx5dGljLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpZG5vJyAgICAgICAgID0+IHt0eXBlID0+ICJLSUVMSVBBTktLSV9PUklHRklMRU5BTUUifSk7CiAgICBteSAkYW5hbHl0aWNfdGV4dGxhbmcgICAgICAgPSAkYW5hbHl0aWMtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RleHRMYW5nJyk7CgogICAgIyBzZXQgdGV4dHMgZm9yIGFuYWx5dGljCiMgICAgJGFuYWx5dGljX3RpdGxlICAgICAgICAgLT5zZXRfdGV4dCgkTEFCRUwgLiAiLCBwYWdlICIgLiAkUEFHRU5PKTsgICMgQWNodHVuZyAkUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUgenUgc2VpbiIKICAgICRhbmFseXRpY190aXRsZSAgICAgICAgIC0+c2V0X3RleHQoJExBQkVMIC4gIiwgVGV4dCAjIiAuICR0ZXh0Y291bnRlcik7ICAjIEFjaHR1bmcgJFBBR0VOTyBzY2hlaW50IG1laXN0ICJOb25lIHp1IHNlaW4iCiMgICAgJGFuYWx5dGljX2RhdGUgICAgICAgICAtPnNldF90ZXh0KCREQVRFKTsKICAgICRhbmFseXRpY19kYXRlX3llYXIgICAgIC0+c2V0X3RleHQoJGRhdGVhcnJheVswXSk7CiAgICAkYW5hbHl0aWNfZGF0ZV9tb250aCAgICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMV0pOwogICAgJGFuYWx5dGljX2RhdGVfZGF5ICAgICAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzJdKTsKICAgICRhbmFseXRpY19pZG5vX3BhZ2VpZCAgIC0+c2V0X3RleHQoJFBBR0VJRCk7CiAgICAkYW5hbHl0aWNfaWRub19iaW5kaW5naWQtPnNldF90ZXh0KCRCSUQpOwogICAgJGFuYWx5dGljX2lkbm9faWQgICAgICAgLT5zZXRfdGV4dCgkSUQpOwogICAgJGFuYWx5dGljX2lkbm9fbWV0YWZpbGUgLT5zZXRfdGV4dCgkTUVUQUZJTEVOQU1FKTsKICAgICRhbmFseXRpY19pZG5vX29yaWdmaWxlIC0+c2V0X3RleHQoJE9SSUdGSUxFTkFNRSk7CiAgICAkYW5hbHl0aWNfdGV4dGxhbmcgICAgICAtPnNldF90ZXh0KCRMQU5HVUFHRSk7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCiAgICAjIGZpbGVEZXNjL3NvdXJjZURlc2MvYmlibFN0cnVjdC9tb25vZ3IKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBteSAkbW9ub2dyICAgICAgICAgICAgICAgPSAkYmlibFN0cnVjdC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbW9ub2dyJyk7CiAgICBteSAkbW9ub2dyX3RpdGxlICAgICAgICAgPSAkbW9ub2dyICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAndGl0bGUnKTsKICAgIG15ICRpbXByaW50ICAgICAgICAgICAgICA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdpbXByaW50Jyk7ICAgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdmFsaWRpZHR5CiAgICBteSAkcHViUGxhY2UgICAgICAgICAgICAgPSAkaW1wcmludCAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncHViUGxhY2UnKTsgICMgaW1wcmludCBpcyBuZWVkZWQgZm9yIHZhbGlkaXR5CiAgICBteSAkcHVibGlzaGVyICAgICAgICAgICAgPSAkaW1wcmludCAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAncHVibGlzaGVyJyk7ICMgaW1wcmludCBpcyBuZWVkZWQgZm9yIHZhbGlkaXR5CiAgICBteSAkYmlibFNjb3BlX2lzc3VldGl0bGUgPSAkbW9ub2dyICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnYmlibFNjb3BlJyAgID0+IHt1bml0ID0+ICdJU1NVRVRJVExFJ30gKTsKICAgIG15ICRiaWJsU2NvcGVfaXNzdWVubyAgICA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdiaWJsU2NvcGUnICAgPT4ge3VuaXQgPT4gJ0lTU1VFTk8nfSApOwogICAgbXkgJGJpYmxTY29wZV9pc3N1ZWRhdGUgID0gJG1vbm9nciAgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2JpYmxTY29wZScgICA9PiB7dW5pdCA9PiAnSVNTVUVEQVRFJ30gKTsKICAgIG15ICRiaWJsU2NvcGVfcHAgICAgICAgICA9ICRtb25vZ3IgICAgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdiaWJsU2NvcGUnICAgPT4ge3VuaXQgPT4gJ1BBR0VOTyd9ICk7ICAgICAgIyBBY2h0dW5nIFBBR0VOTyBpc3QgbWVpc3QgIk5vbmUiID8KCiAgICAjIHNldCB0ZXh0cyBmb3IgbW9ub2dyCiAgICAkbW9ub2dyX3RpdGxlICAgICAgICAtPnNldF90ZXh0KCRQVUJMVElUTEUpOwogICAgJHB1YlBsYWNlICAgICAgICAgICAgLT5zZXRfdGV4dCgiVE9ETyIpOwogICAgJHB1YlBsYWNlICAgICAgICAgICAgLT5zZXRfYXR0KCJrZXkiLCdGSScpOwogICAgJHB1Ymxpc2hlciAgICAgICAgICAgLT5zZXRfdGV4dCgiVE9ETyIpOwogICAgJGJpYmxTY29wZV9pc3N1ZXRpdGxlLT5zZXRfdGV4dCgkSVNTVUVUSVRMRSk7CiAgICAkYmlibFNjb3BlX2lzc3Vlbm8gICAtPnNldF90ZXh0KCRJU1NVRU5PKTsKICAgICRiaWJsU2NvcGVfaXNzdWVkYXRlIC0+c2V0X3RleHQoJElTU1VFREFURSk7CiAgICAkYmlibFNjb3BlX3BwICAgICAgICAtPnNldF90ZXh0KCRQQUdFTk8pOwogCiAgICAjLS0tLS0tLS0tLS0tLS0tCiAgICAjIGVuY29kaW5nRGVzYwogICAgIy0tLS0tLS0tLS0tLS0tLQogICAgbXkgJHRhZ3NEZWNsICAgICA9ICRlbmNvZGluZ0Rlc2MtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RhZ3NEZWNsJyk7CiAgICBteSAkbmFtZXNwYWNlICAgID0gJHRhZ3NEZWNsICAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnbmFtZXNwYWNlJyAgICA9PiB7bmFtZSA9PiAnaHR0cDovL3d3dy50ZWktYy5vcmcvbnMvMS4wJ30pOwogICAgbXkgJHRhZ1VzYWdlX3MgICA9ICRuYW1lc3BhY2UgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RhZ1VzYWdlJyAgICAgPT4ge2dpICAgPT4gJ3MnLCBvY2N1cnMgPT4gJFNFTlRDT1VOVH0pOwogICAgbXkgJHRhZ1VzYWdlX3cgICA9ICRuYW1lc3BhY2UgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RhZ1VzYWdlJyAgICAgPT4ge2dpICAgPT4gJ3cnLCBvY2N1cnMgPT4gJFRPS0VOQ09VTlR9KTsKICAgIAogICAgIy0tLS0tLS0tLS0tLS0KICAgICMgcHJvZmlsZURlc2MKICAgICMtLS0tLS0tLS0tLS0tCiAgICBteSAkbGFuZ1VzYWdlICAgPSAkcHJvZmlsZURlc2MgLT5pbnNlcnRfbmV3X2VsdCgibGFzdF9jaGlsZCIsICdsYW5nVXNhZ2UnKTsKICAgIG15ICRsYW5ndWFnZSAgICA9ICRsYW5nVXNhZ2UgICAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ2xhbmd1YWdlJyAgICAgID0+IHtpZGVudCA9PiAkTEFOR1VBR0UsIHVzYWdlID0+ICRTVU1MQU5HfSk7CiAgICAjIEFjaHR1bmcgaW4gQHVzYWdlIG11c3MgZWlndC4gZWluIGludGVnZXI7IGFtIGJlc3RlbiBpbmhhbHQgdm9uIFNVTUxBTkcgYXVmZHJvZXNlbG4gdW5kIG1laHJlcmUgPGxhbmd1YWdlPiBtYWNoZW4KICAgIG15ICR0ZXh0Q2xhc3MgICA9ICRwcm9maWxlRGVzYyAtPmluc2VydF9uZXdfZWx0KCJsYXN0X2NoaWxkIiwgJ3RleHRDbGFzcycpOwogICAgbXkgJGNsYXNzQ29kZV9maSAgID0gJHRleHRDbGFzcyAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnY2xhc3NDb2RlJyA9PiB7c2NoZW1lICAgICAgID0+ICJLTEtfUFVCTFRZUEUifSk7CiMgICAgbXkgJGNsYXNzQ29kZV9lbiAgID0gJHRleHRDbGFzcyAgIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnY2xhc3NDb2RlJyA9PiB7c2NoZW1lICAgICAgPT4gIktMS19QVUJMVFlQRV9NQVBQRUQifSk7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBzZXQgdGV4dHMgZm9yIHByb2ZpbGVEZXNjCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAkY2xhc3NDb2RlX2ZpIC0+c2V0X3RleHQoJFBVQkxUWVBFKTsKIyAgICAkY2xhc3NDb2RlX2VuLT5zZXRfdGV4dCgkUFVCTFRZUEVUUkFOU0wpOwoKICAgICMtLS0tLS0tLS0tLS0tLS0KICAgICMgcmV2aXNpb25EZXNjCiAgICAjLS0tLS0tLS0tLS0tLS0tCiAgICBteSAkY2hhbmdlICAgICAgPSAkcmV2aXNpb25EZXNjIC0+aW5zZXJ0X25ld19lbHQoImxhc3RfY2hpbGQiLCAnY2hhbmdlJyAgICAgICA9PiB7d2hlbiA9PiBsb2NhbHRpbWUtPnltZCgnLScpLCB3aG8gPT4gJ0hMJyAgfSk7CgogICAgIyBzZXQgdGV4dHMgZm9yIHJldmlzaW9uRGVzYwogICAgJGNoYW5nZS0+c2V0X3RleHQoIlRFSSB2ZXJzaW9uIGZvciBFdVJlQ28iKTsKCgogICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICMgRU5EIE9GIENSRUFUSU5HIFRFSUhFQURFUgogICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIAp9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApzdWIgc2V0UCB7CiAgICBteSAoJHBhcmFncmFwaCkgPSBAXzsKICAgIAogICAgJHBhcmFncmFwaC0+c2V0X2dpKCdwJyk7CiAgICAKICAgICMgPHBhcmFncmFwaCBpZD0icC1iY2QwZjNmYS1iYmQzZGFjNC04MTVlYWQ3YSIgc3VtX2xhbmc9InxmaW46MXwiPgogICAgIyBhdHRzIG9mIDxwYXJhZ3JhcGg+OgogICAgIyAgICBAaWQgICAgICAgIFVTRQogICAgIyAgICBAc3VtX2xhbmcgIFVTRTogcHV0IGluIHhtbDpsYW5nIGFuZCBwcmVmaXggdGhlIHZhbHVlIHdpdGggIngtIiBmb3IgcHJpdmF0ZSB2YWx1ZQogICAgCiAgICAkcGFyYWdyYXBoLT5zZXRfYXR0KCJ4bWw6bGFuZyIsICJ4LSIgLiAkcGFyYWdyYXBoLT5hdHQoInN1bV9sYW5nIikpOwogICAgJHBhcmFncmFwaC0+ZGVsX2F0dCgic3VtX2xhbmciKTsKICAgICRwYXJhZ3JhcGgtPmNoYW5nZV9hdHRfbmFtZSgnaWQnLCAneG1sOmlkJyk7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKc3ViIHNldFMgewogICAgbXkgKCRzZW50ZW5jZSkgPSBAXzsKICAgIAogICAgJHNlbnRlbmNlLT5zZXRfZ2koJ3MnKTsKCSAgICAKICAgICMgdGhlIGF0dHMgb2YgPHNlbnRlbmNlPjoKICAgICMgICAgVVNFICAgMSBAaWQ9InMtYmNkMGYzZmEtYmJkM2RhYzQtZjc0MjkwOTAiCiAgICAjICAgIFVTRSAgIDIgQGxhbmc9ImZpbiIgLT4geG1sOmxhbmcgCiAgICAjICAgID8gICAgIDMgQGxhbmdfY29uZj0iMC42NzM0ODUzIj4gLT4gVG9EbyBAY2VydCA/CSAgICAKICAgIAogICAgIyBzZXQgYXR0cnMgb2YgPHM+CiAgICAkc2VudGVuY2UtPnNldF9hdHQoInhtbDpsYW5nIiwgJHNlbnRlbmNlLT5hdHQoImxhbmciKSk7ICAjIFRvRG86IGNvbnZlcnQgdGhlIHZhbHVlIC8gaW50cm9kdWNlIGEgaGFzaCBmb3IgbG9va3VwIChpbnB1dCB2YWx1ZXM6ICJmaW4iLCAieHh4IiwgLi4uLikKICAgICMgJHNlbnRlbmNlLT5jaGFuZ2VfYXR0X25hbWUoJ2lkJywgJ3htbDppZCcpOyAgICAgICAgICAgICMgbmljaHQgZWluZGV1dGlnCiAgICAkc2VudGVuY2UtPmRlbF9hdHQoJ2lkJyk7CiAgICAkc2VudGVuY2UtPmRlbF9hdHQoImxhbmciKTsgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBsYWNlZCBieSB4bWw6bGFuZwogICAgJHNlbnRlbmNlLT5kZWxfYXR0KCJsYW5nX2NvbmYiKTsgICAgICAgICAgICAgICAgICAgICMgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAKfQoKc3ViIGNyZWF0ZVcgewogICAgbXkgKCR3X2VsZW1lbnQsICRsaW5lKSA9IEBfOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgR2V0IHRoZSB0YWdzICg9Y29sdW1ucykKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgQHRhZ3MgPSBzcGxpdCgvXHQvLCAkbGluZSk7CiAgICAKICAgICMgc2V0IGNvbnRlbnQgb2YgPHc+IGkuZS4gdGhlIHRva2VuCiAgICAkd19lbGVtZW50LT5zZXRfdGV4dCgkdGFnc1swXSk7CiAgICAKICAgICMgdnJ0IHBvc2l0aW9uYWwtYXR0cmlidXRlcyBpbiBjb3JwdXMgS0xLOgogICAgIyAgVVNFIFswXSB3b3JkCiAgICAjICBVU0UgWzFdIHJlZiAgKGlkIGZvciByZWZlcmVuY2Ugb2YgZGVwaGVhZCkKICAgICMgIFVTRSBbMl0gbGVtbWEKICAgICMgID8gICBbM10gbGVtbWFjb21wICAgKGxlbW1hIHdpdGggY29tcG91bmQgaW5mbyAtIGNvdWxkIGdvIGluIEBub3JtLCBhcyB0YWcgYWJ1c2U/KQogICAgIyAgVVNFIFs0XSBwb3MgCiAgICAjICBVU0UgWzVdIG1zZCAKICAgICMgIFVTRSBbNl0gZGVwaGVhZAogICAgIyAgVVNFIFs3XSBkZXByZWwgCiAgICAjICAgICAgWzhdIGNvbnRlbnQgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICAgWzldIHZwb3MgICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTBdIG9jciAgICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTFdIGNjICAgICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTJdIGh5cGggICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTNdIHN0eWxlICAgICAob2NyLXByb2Nlc3MpCiAgICAjICAgICBbMTRdIGxleCAgICAgICAoa29ycCBzZW1hbnRpYyBkaXNhbWJpZ3VhdGlvbiBmcm9tIEcib3RlYm9yZykKICAgIAogICAgIyBzZXQgdGhlIGF0dHJpYnV0ZXMgb2YgPHc+OgogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibiIsICAgICAgJHRhZ3NbMV0pOwogICAgIyAkd19lbGVtZW50LT5zZXRfYXR0KCJpZCIsICAgICAid18iIC4gJG5hbWVhcnJheVs0XSAuICRzZW50ZW5jZS0+YXR0KCJ4bWw6aWQiKSAuICJfIiAuICR0YWdzWzFdKTsKICAgICMgc28genVzYW1tZW5nZWJhdXRlIElEIGlzdCBhdWNoIG5pY2h0IGVpbmRldXRpZy4uLgogICAgJHdfZWxlbWVudC0+ZGVsX2F0dCgiaWQiKTsKICAgICR3X2VsZW1lbnQtPnNldF9hdHQoImxlbW1hIiwgICR0YWdzWzJdKTsKICAgICMgJHdfZWxlbWVudC0+c2V0X2F0dCgibm9ybSIsICAgJHRhZ3NbM10pOyAgIyB0YWcgYWJ1c2Ugb2YgQG5vcm0KICAgICR3X2VsZW1lbnQtPnNldF9hdHQoInBvcyIsICAgICR0YWdzWzRdKTsKICAgICR3X2VsZW1lbnQtPnNldF9hdHQoIm1zZCIsICAgICR0YWdzWzVdKTsKI1RNUCAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJoZWFkIiwgICAkdGFnc1s2XSk7CiNUTVAgICAgJHdfZWxlbWVudC0+c2V0X2F0dCgiZGVwcmVsIiwgJHRhZ3NbN10pOwogICAgCn0KICAgIAojIyMjIyMjIyMjIyMjIyMjIwojIyB1c2FnZV9tZXNzYWdlCiMjIyMjIyMjIyMjIyMjIyMjCgoKc3ViIHVzYWdlX21lc3NhZ2UgewogICAgcHJpbnQgIiAgIFVzYWdlOiAgLi92cnQydGVpLnBsIDxmaWxlLnZydC54bWw+IDxvdXRmaWxlPlxuIjsKICAgIHByaW50ICIgICA8ZmlsZS52cnQueG1sPiBpcyBhIFZSVCBmaWxlIGNvbnZlcnRlZCB0byBwcm9wZXIgWE1MXG4iOwogICAgZXhpdDsKfQoKCg==