IyBTcGFtQXNzYXNzaW4gcnVsZXMgZmlsZTogcmF6b3IyIHRlc3RzCiMKIyBQbGVhc2UgZG9uJ3QgbW9kaWZ5IHRoaXMgZmlsZSBhcyB5b3VyIGNoYW5nZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoCiMgdGhlIG5leHQgdXBkYXRlLiBVc2UgQEBMT0NBTF9SVUxFU19ESVJAQC9sb2NhbC5jZiBpbnN0ZWFkLgojIFNlZSAncGVybGRvYyBNYWlsOjpTcGFtQXNzYXNzaW46OkNvbmYnIGZvciBkZXRhaWxzLgojCiMgPEBMSUNFTlNFPgojIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQojIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAojIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAojICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiMgCiMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojIAojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIyA8L0BMSUNFTlNFPgojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyMKIyMgU3BhbUFzc2Fzc2luIDQuMC4wIG5vdGU6CiMjICAgUkFaT1IgcnVsZSBwcmlvcml0aWVzIGFyZSBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIHRvIC0xMDAgd2hlbiByYXpvcl9mb3JrCiMjICAgb3B0aW9uIGlzIGVuYWJsZWQgKGFzeW5jIGxvb2t1cCkKIyMKCmlmcGx1Z2luIE1haWw6OlNwYW1Bc3Nhc3Npbjo6UGx1Z2luOjpSYXpvcjIKCmZ1bGwgUkFaT1IyX0NIRUNLCWV2YWw6Y2hlY2tfcmF6b3IyKCkKZGVzY3JpYmUgUkFaT1IyX0NIRUNLCUxpc3RlZCBpbiBSYXpvcjIgKGh0dHA6Ly9yYXpvci5zZi5uZXQvKQp0ZmxhZ3MgUkFaT1IyX0NIRUNLCW5ldApwcmlvcml0eSBSQVpPUjJfQ0hFQ0sJMjAKcmV1c2UgIFJBWk9SMl9DSEVDSwoKbGFuZyBkZSBkZXNjcmliZSBSQVpPUjJfQ0hFQ0sJR2VsaXN0ZXQgaW0gIlJhem9yMiItU3lzdGVtIChodHRwOi8vcmF6b3Iuc2YubmV0LykKbGFuZyBubCBkZXNjcmliZSBSQVpPUjJfQ0hFQ0sJR2V2b25kZW4gaW4gUmF6b3IyIChodHRwOi8vcmF6b3Iuc2YubmV0LykKbGFuZyBmciBkZXNjcmliZSBSQVpPUjJfQ0hFQ0sJTWVzc2FnZSBsaXN06SBwYXIgUmF6b3IyLCB2b2lyIGh0dHA6Ly9yYXpvci5zb3VyY2Vmb3JnZS5uZXQKbGFuZyBwbCBkZXNjcmliZSBSQVpPUjJfQ0hFQ0sJTmEgbGm2Y2llIFJhem9yMiAoaHR0cDovL3Jhem9yLnNmLm5ldC8pCgojIGNmIChjb25maWRlbmNlIGxldmVsKSBpcyBob3cgbGlrZWx5IHRoZSBtZXNzYWdlIGlzIHNwYW0uICBSQVpPUjJfQ0hFQ0sKIyByZXR1cm5zIHRydWUgaWYgY2Y+PW1pbl9jZiAoYXMgZGVmaW5lZCBieSB1c2VyL2NvbmZpZykuICBUaGVzZSByZXR1cm4KIyB0cnVlIGRlcGVuZGluZyBvbiB3aGF0IGNmIHZhbHVlIHRoZSBtZXNzYWdlIGhhcy4gIFRoZSBhbGdvcml0aG0gZ29lczoKIyBjaGVjayB0aGUgbWVzc2FnZSB2aWEgcmF6b3IsIHRoZW4gZ28gdGhyb3VnaCBlYWNoIG1pbWUgcGFydCBhbmQgY2hlY2sKIyBob3cgcmF6b3Igc2NvcmVkIGl0LiAgSWYgdGhlIHBhcnQgaXMgY29udGVzdGVkIChpZTogaXQncyBiZWVuIHJlcG9ydGVkCiMgYXMgYm90aCBoYW0gYW5kIHNwYW0pIGl0J3MgaWdub3JlZC4gIFNBIHRha2VzIHRoZSBoaWdoZXN0IG5vbi1jb250ZXN0ZWQKIyBwYXJ0IGNmIHNjb3JlIGFuZCByZXR1cm5zIGl0IGZvciB0aGUgcmFuZ2UgcnVsZXMuICBpZTogVGhpcyBpcyBlc3NlbnRpYWxseQojIFJhem9yIDIncyBsb2dpY19tZXRob2QgNC4KIwojIE5vdGU6IERpc2FibGluZyBSQVpPUjJfQ0hFQ0sgKHNjb3JlIFJBWk9SMl9DSEVDSyAwKSB3aWxsIGFsc28gZGlzYWJsZQojIHRoZXNlIGNoZWNrcy4KIwojIE5vdGU6IFRoZSBzY29yZXMgYXJlIHNldCB0byAwIG9uIHRoZXNlIHRlc3RzIHJpZ2h0IG5vdyB1bnRpbCB0aGV5IGdldAojIGJldHRlciBpbnRlZ3JhdGVkIHdpdGggU0Egb3ZlcmFsbC4KIwoKZnVsbCAgICBSQVpPUjJfQ0ZfUkFOR0VfNTFfMTAwICBldmFsOmNoZWNrX3Jhem9yMl9yYW5nZSgnJywnNTEnLCcxMDAnKQp0ZmxhZ3MgIFJBWk9SMl9DRl9SQU5HRV81MV8xMDAJbmV0CnByaW9yaXR5IFJBWk9SMl9DRl9SQU5HRV81MV8xMDAgMjAKcmV1c2UgCVJBWk9SMl9DRl9SQU5HRV81MV8xMDAKZGVzY3JpYmUgUkFaT1IyX0NGX1JBTkdFXzUxXzEwMAlSYXpvcjIgZ2l2ZXMgY29uZmlkZW5jZSBsZXZlbCBhYm92ZSA1MCUKCmxhbmcgZGUgZGVzY3JpYmUgUkFaT1IyX0NGX1JBTkdFXzUxXzEwMAlSYXpvcjIgU3BhbS1CZXdlcnR1bmcgbGllZ3Qgendpc2NoZW4gNTEgdW5kIDEwMApsYW5nIGZyIGRlc2NyaWJlIFJBWk9SMl9DRl9SQU5HRV81MV8xMDAJUmF6b3IyIGRvbm5lIHVuIGluZGljZSBkZSBjb25maWFuY2UgZW50cmUgNTEgZXQgMTAwCmxhbmcgbmwgZGVzY3JpYmUgUkFaT1IyX0NGX1JBTkdFXzUxXzEwMAlSYXpvcjIgZ2VlZnQgZWVuIHpla2VyaGVpZCB0dXNzZW4gNTEgZW4gMTAwCmxhbmcgcGwgZGVzY3JpYmUgUkFaT1IyX0NGX1JBTkdFXzUxXzEwMAlSYXpvcjIgc3R3aWVyZHppsyBwZXdub7bmIHBvbWnqZHp5IDUxIGkgMTAwCgplbmRpZgo=