LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2lmbmRlZiBfRkNQUklWQVRFX0hfCiNkZWZpbmUgX0ZDUFJJVkFURV9IXwoKLyoKICogSSB0cmllZCB0aGlzIHdpdGggZnVuY3Rpb25zIHRoYXQgdG9vayB2YV9saXN0KiBhcmd1bWVudHMKICogYnV0IHBvcnRhYmlsaXR5IGNvbmNlcm5zIG1hZGUgbWUgY2hhbmdlIHRoZXNlIGZ1bmN0aW9ucwogKiBpbnRvIG1hY3JvcyAoc2lnaCkuCiAqLwoKI2RlZmluZSBGY1BhdHRlcm5WYXBCdWlsZChyZXN1bHQsIG9yaWcsIHZhKQkJCSAgICBcCnsJCQkJCQkJCSAgICBcCiAgICBGY1BhdHRlcm4JKl9fcF9fID0gKG9yaWcpOwkJCQkgICAgXAogICAgY29uc3QgY2hhcgkqX19vX187CQkJCQkJICAgIFwKICAgIEZjVmFsdWUJX192X187CQkJCQkJICAgIFwKCQkJCQkJCQkgICAgXAogICAgaWYgKCFfX3BfXykJCQkJCQkJICAgIFwKICAgIHsJCQkJCQkJCSAgICBcCglfX3BfXyA9IEZjUGF0dGVybkNyZWF0ZSAoKTsJCQkJICAgIFwKCWlmICghX19wX18pCQkgICAgCQkJCSAgICBcCgkgICAgZ290byBfRmNQYXR0ZXJuVmFwQnVpbGRfYmFpbDA7CQkJICAgIFwKICAgIH0JCQkJICAgIAkJCQkgICAgXAogICAgZm9yICg7OykJCQkgICAgCQkJCSAgICBcCiAgICB7CQkJCSAgICAJCQkJICAgIFwKCV9fb19fID0gdmFfYXJnICh2YSwgY29uc3QgY2hhciAqKTsJCQkgICAgXAoJaWYgKCFfX29fXykJCSAgICAJCQkJICAgIFwKCSAgICBicmVhazsJCSAgICAJCQkJICAgIFwKCV9fdl9fLnR5cGUgPSB2YV9hcmcgKHZhLCBGY1R5cGUpOwkJCSAgICBcCglzd2l0Y2ggKF9fdl9fLnR5cGUpIHsJICAgIAkJCQkgICAgXAoJY2FzZSBGY1R5cGVWb2lkOgkJCQkJICAgIFwKCSAgICBnb3RvIF9GY1BhdHRlcm5WYXBCdWlsZF9iYWlsMTsgICAgICAgCQkgICAgXAoJY2FzZSBGY1R5cGVJbnRlZ2VyOgkgICAgCQkJCSAgICBcCgkgICAgX192X18udS5pID0gdmFfYXJnICh2YSwgaW50KTsJCQkgICAgXAoJICAgIGJyZWFrOwkJCQkJCSAgICBcCgljYXNlIEZjVHlwZURvdWJsZToJCQkJCSAgICBcCgkgICAgX192X18udS5kID0gdmFfYXJnICh2YSwgZG91YmxlKTsJCQkgICAgXAoJICAgIGJyZWFrOwkJCQkJCSAgICBcCgljYXNlIEZjVHlwZVN0cmluZzoJCQkJCSAgICBcCgkgICAgX192X18udS5zID0gdmFfYXJnICh2YSwgY2hhciAqKTsJCQkgICAgXAoJICAgIGJyZWFrOwkJCQkJCSAgICBcCgljYXNlIEZjVHlwZUJvb2w6CQkJCQkgICAgXAoJICAgIF9fdl9fLnUuYiA9IHZhX2FyZyAodmEsIEZjQm9vbCk7CQkJICAgIFwKCSAgICBicmVhazsJCQkJCQkgICAgXAoJY2FzZSBGY1R5cGVNYXRyaXg6CQkJCQkgICAgXAoJICAgIF9fdl9fLnUubSA9IHZhX2FyZyAodmEsIEZjTWF0cml4ICopOwkJICAgIFwKCSAgICBicmVhazsJCQkJCQkgICAgXAoJY2FzZSBGY1R5cGVDaGFyU2V0OgkJCQkJICAgIFwKCSAgICBfX3ZfXy51LmMgPSB2YV9hcmcgKHZhLCBGY0NoYXJTZXQgKik7CQkgICAgXAoJICAgIGJyZWFrOwkJCQkJCSAgICBcCgl9CQkJCQkJCSAgICBcCglpZiAoIUZjUGF0dGVybkFkZCAoX19wX18sIF9fb19fLCBfX3ZfXywgRmNUcnVlKSkJICAgIFwKCSAgICBnb3RvIF9GY1BhdHRlcm5WYXBCdWlsZF9iYWlsMTsJCQkgICAgXAogICAgfQkJCQkJCQkJICAgIFwKICAgIHJlc3VsdCA9IF9fcF9fOwkJCQkJCSAgICBcCiAgICBnb3RvIF9GY1BhdHRlcm5WYXBCdWlsZF9yZXR1cm47CQkJCSAgICBcCgkJCQkJCQkJICAgIFwKX0ZjUGF0dGVyblZhcEJ1aWxkX2JhaWwxOgkJCQkJICAgIFwKICAgIGlmICghb3JpZykJCQkJCQkJICAgIFwKCUZjUGF0dGVybkRlc3Ryb3kgKF9fcF9fKTsJCQkJICAgIFwKX0ZjUGF0dGVyblZhcEJ1aWxkX2JhaWwwOgkJCQkJICAgIFwKICAgIHJlc3VsdCA9IDA7CQkJCQkJCSAgICBcCgkJCQkJCQkJICAgIFwKX0ZjUGF0dGVyblZhcEJ1aWxkX3JldHVybjoJCQkJCSAgICBcCiAgICA7CQkJCQkJCQkgICAgXAp9CgoKI2RlZmluZSBGY09iamVjdFNldFZhcEJ1aWxkKF9fcmV0X18sIF9fZmlyc3RfXywgX192YV9fKSAJCVwKewkJCQkJCQkJCVwKICAgIEZjT2JqZWN0U2V0ICAgICpfX29zX187CQkJCQkJXAogICAgY29uc3QgY2hhcgkgICAgKl9fb2JfXzsJCQkJCQlcCgkJCQkJCQkJCVwKICAgIF9fcmV0X18gPSAwOwkJCQkJCSAgICAJXAogICAgX19vc19fID0gRmNPYmplY3RTZXRDcmVhdGUgKCk7CQkJCQlcCiAgICBpZiAoIV9fb3NfXykJCQkJCQkJXAoJZ290byBfRmNPYmplY3RTZXRWYXBCdWlsZF9iYWlsMDsJCQkJXAogICAgX19vYl9fID0gX19maXJzdF9fOwkJCQkJCQlcCiAgICB3aGlsZSAoX19vYl9fKQkJCQkJCQlcCiAgICB7CQkJCQkJCQkJXAoJaWYgKCFGY09iamVjdFNldEFkZCAoX19vc19fLCBfX29iX18pKQkJCQlcCgkgICAgZ290byBfRmNPYmplY3RTZXRWYXBCdWlsZF9iYWlsMTsJCQkJXAoJX19vYl9fID0gdmFfYXJnIChfX3ZhX18sIGNvbnN0IGNoYXIgKik7CQkJCVwKICAgIH0JCQkJCQkJCQlcCiAgICBfX3JldF9fID0gX19vc19fOwkJCQkJCQlcCgkJCQkJCQkJCVwKX0ZjT2JqZWN0U2V0VmFwQnVpbGRfYmFpbDE6CQkJCQkJXAogICAgaWYgKCFfX3JldF9fICYmIF9fb3NfXykJCQkJCSAgICAJXAoJRmNPYmplY3RTZXREZXN0cm95IChfX29zX18pOwkJCQkJXApfRmNPYmplY3RTZXRWYXBCdWlsZF9iYWlsMDoJCQkJCQlcCiAgICA7CQkJCQkJCQkJXAp9CgojZW5kaWYgLyogX0ZDUFJJVkFURV9IXyAqLwoK