LyoKICBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgogIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KCiAgR1BMIExJQ0VOU0UgU1VNTUFSWQoKICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgoKICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgogIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KCiAgQ29udGFjdCBJbmZvcm1hdGlvbjoKICBodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL2FydGljbGVzL2ludGVsLXZ0dW5lLWFtcGxpZmllci14ZS8KCiAgQlNEIExJQ0VOU0UKCiAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTMgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAgYXJlIG1ldDoKCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCiAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICAgICAgZGlzdHJpYnV0aW9uLgogICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAogICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCiAgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoqLwoKI2lmbmRlZiBfX0pJVFBST0ZJTElOR19IX18KI2RlZmluZSBfX0pJVFBST0ZJTElOR19IX18KCi8qKgogKiBAYnJpZWYgSklUIFByb2ZpbGluZyBBUElzCiAqCiAqIFRoZSBKSVQgUHJvZmlsaW5nIEFQSSBpcyB1c2VkIHRvIHJlcG9ydCBpbmZvcm1hdGlvbiBhYm91dCBqdXN0LWluLXRpbWUKICogZ2VuZXJhdGVkIGNvZGUgdGhhdCBjYW4gYmUgdXNlZCBieSBwZXJmb3JtYW5jZSB0b29scy4gVGhlIHVzZXIgaW5zZXJ0cwogKiBjYWxscyBpbiB0aGUgY29kZSBnZW5lcmF0b3IgdG8gcmVwb3J0IGluZm9ybWF0aW9uIGJlZm9yZSBKSVQtY29tcGlsZWQKICogY29kZSBnb2VzIHRvIGV4ZWN1dGlvbi4gVGhpcyBpbmZvcm1hdGlvbiBpcyBjb2xsZWN0ZWQgYXQgcnVudGltZSBhbmQgdXNlZAogKiBieSB0b29scyBsaWtlIEludGVsKFIpIFZUdW5lKFRNKSBBbXBsaWZpZXIgdG8gZGlzcGxheSBwZXJmb3JtYW5jZSBtZXRyaWNzCiAqIGFzc29jaWF0ZWQgd2l0aCBKSVQtY29tcGlsZWQgY29kZS4KICoKICogVGhlc2UgQVBJcyBjYW4gYmUgdXNlZCB0b1xuCiAqICoqUHJvZmlsZSB0cmFjZS1iYXNlZCBhbmQgbWV0aG9kLWJhc2VkIEpJVC1jb21waWxlZAogKiBjb2RlKiouIFNvbWUgZXhhbXBsZXMgb2YgZW52aXJvbm1lbnRzIHRoYXQgeW91IGNhbiBwcm9maWxlIHdpdGggdGhpcyBBUElzOgogKiBkeW5hbWljIEpJVCBjb21waWxhdGlvbiBvZiBKYXZhU2NyaXB0IGNvZGUgdHJhY2VzLCBPcGVuQ0wgSklUIGV4ZWN1dGlvbiwKICogSmF2YS8uTkVUIG1hbmFnZWQgZXhlY3V0aW9uIGVudmlyb25tZW50cywgYW5kIGN1c3RvbSBJU1YgSklUIGVuZ2luZXMuCiAqCiAqIEBjb2RlCiAqICNpbmNsdWRlIDxqaXRwcm9maWxpbmcuaD4KICoKICogaWYgKGlKSVRfSXNQcm9maWxpbmdBY3RpdmUgIT0gaUpJVF9TQU1QTElOR19PTikgewogKiAgICAgcmV0dXJuOwogKiB9CiAqCiAqIGlKSVRfTWV0aG9kX0xvYWQgam1ldGhvZCA9IHswfTsKICogam1ldGhvZC5tZXRob2RfaWQgPSBpSklUX0dldE5ld01ldGhvZElEKCk7CiAqIGptZXRob2QubWV0aG9kX25hbWUgPSAibWV0aG9kX25hbWUiOwogKiBqbWV0aG9kLmNsYXNzX2ZpbGVfbmFtZSA9ICJjbGFzc19uYW1lIjsKICogam1ldGhvZC5zb3VyY2VfZmlsZV9uYW1lID0gInNvdXJjZV9maWxlX25hbWUiOwogKiBqbWV0aG9kLm1ldGhvZF9sb2FkX2FkZHJlc3MgPSBjb2RlX2FkZHI7CiAqIGptZXRob2QubWV0aG9kX3NpemUgPSBjb2RlX3NpemU7CiAqCiAqIGlKSVRfTm90aWZ5RXZlbnQoaUpWTV9FVkVOVF9UWVBFX01FVEhPRF9MT0FEX0ZJTklTSEVELCAodm9pZCopJmptZXRob2QpOwogKiBpSklUX05vdGlmeUV2ZW50KGlKVk1fRVZFTlRfVFlQRV9TSFVURE9XTiwgTlVMTCk7CiAqIEBlbmRjb2RlCiAqCiAqICAqIEV4cGVjdGVkIGJlaGF2aW91cjoKICogICAgKiBJZiBhbnkgaUpWTV9FVkVOVF9UWVBFX01FVEhPRF9MT0FEX0ZJTklTSEVEIGV2ZW50IG92ZXJ3cml0ZXMKICogICAgICBhbHJlYWR5IHJlcG9ydGVkIG1ldGhvZCwgdGhlbiBzdWNoIGEgbWV0aG9kIGJlY29tZXMgaW52YWxpZCBhbmQgaXRzCiAqICAgICAgbWVtb3J5IHJlZ2lvbiBpcyB0cmVhdGVkIGFzIHVubG9hZGVkLiBWVHVuZSBBbXBsaWZpZXIgZGlzcGxheXMgdGhlIG1ldHJpY3MKICogICAgICBjb2xsZWN0ZWQgYnkgdGhlIG1ldGhvZCB1bnRpbCBpdCBpcyBvdmVyd3JpdHRlbi4KICogICAgKiBJZiBzdXBwbGllZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBjb250YWlucyBtdWx0aXBsZSBzb3VyY2UgbGluZXMgZm9yCiAqICAgICAgdGhlIHNhbWUgYXNzZW1ibHkgaW5zdHJ1Y3Rpb24gKGNvZGUgbG9jYXRpb24pLCB0aGVuIFZUdW5lIEFtcGxpZmllciBwaWNrcyB1cAogKiAgICAgIHRoZSBmaXJzdCBsaW5lIG51bWJlci4KICogICAgKiBEeW5hbWljYWxseSBnZW5lcmF0ZWQgY29kZSBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGEgbW9kdWxlIG5hbWUuCiAqICAgICAgVXNlIHRoZSBpSklUX01ldGhvZF9Mb2FkX1YyIHN0cnVjdHVyZS5cbgogKiAgICAgIENsYXJpZmljYXRpb24gb2Ygc29tZSBjYXNlczpcbgogKiAgICAgICAgKiBJZiB5b3UgcmVnaXN0ZXIgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG1ldGhvZCBJRCBtdWx0aXBsZSB0aW1lcwogKiAgICAgICAgICBzcGVjaWZ5aW5nIGRpZmZlcmVudCBtb2R1bGUgbmFtZXMsIHRoZW4gdGhlIFZUdW5lIEFtcGxpZmllciBwaWNrcyB1cAogKiAgICAgICAgICB0aGUgbW9kdWxlIG5hbWUgcmVnaXN0ZXJlZCBmaXJzdC4gSWYgeW91IHdhbnQgdG8gZGlzdGluZ3Vpc2ggdGhlIHNhbWUKICogICAgICAgICAgZnVuY3Rpb24gYmV0d2VlbiBkaWZmZXJlbnQgSklUIGVuZ2luZXMsIHN1cHBseSBkaWZmZXJlbnQgbWV0aG9kIElEcyBmb3IKICogICAgICAgICAgZWFjaCBmdW5jdGlvbi4gT3RoZXIgc3ltYm9saWMgaW5mb3JtYXRpb24gKGZvciBleGFtcGxlLCBzb3VyY2UgZmlsZSkKICogICAgICAgICAgY2FuIGJlIGlkZW50aWNhbC4KICoKICogKipBbmFseXplIHNwbGl0IGZ1bmN0aW9ucyoqIChtdWx0aXBsZSBqb2ludCBvciBkaXNqb2ludCBjb2RlIHJlZ2lvbnMKICogYmVsb25naW5nIHRvIHRoZSBzYW1lIGZ1bmN0aW9uKSAqKmluY2x1ZGluZyByZS1KSVQqKgogKiB3aXRoIHBvdGVudGlhbCBvdmVybGFwcGluZyBvZiBjb2RlIHJlZ2lvbnMgaW4gdGltZSwgd2hpY2ggaXMgY29tbW9uIGluCiAqIHJlc291cmNlLWxpbWl0ZWQgZW52aXJvbm1lbnRzLgogKiBAY29kZQogKiAjaW5jbHVkZSA8aml0cHJvZmlsaW5nLmg+CiAqCiAqIHVuc2lnbmVkIGludCBtZXRob2RfaWQgPSBpSklUX0dldE5ld01ldGhvZElEKCk7CiAqCiAqIGlKSVRfTWV0aG9kX0xvYWQgYSA9IHswfTsKICogYS5tZXRob2RfaWQgPSBtZXRob2RfaWQ7CiAqIGEubWV0aG9kX2xvYWRfYWRkcmVzcyA9IGFjb2RlX2FkZHI7CiAqIGEubWV0aG9kX3NpemUgPSBhY29kZV9zaXplOwogKgogKiBpSklUX01ldGhvZF9Mb2FkIGIgPSB7MH07CiAqIGIubWV0aG9kX2lkID0gbWV0aG9kX2lkOwogKiBiLm1ldGhvZF9sb2FkX2FkZHJlc3MgPSBiYWRkcl9zZWNvbmQ7CiAqIGIubWV0aG9kX3NpemUgPSBic2l6ZV9zZWNvbmQ7CiAqCiAqIGlKSVRfTm90aWZ5RXZlbnQoaUpWTV9FVkVOVF9UWVBFX01FVEhPRF9MT0FEX0ZJTklTSEVELCAodm9pZCopJmEpOwogKiBpSklUX05vdGlmeUV2ZW50KGlKVk1fRVZFTlRfVFlQRV9NRVRIT0RfTE9BRF9GSU5JU0hFRCwgKHZvaWQqKSZiKTsKICogQGVuZGNvZGUKICoKICogICogRXhwZWN0ZWQgYmVoYXZpb3VyOgogKiAgICAgICogSWYgYSBpSlZNX0VWRU5UX1RZUEVfTUVUSE9EX0xPQURfRklOSVNIRUQgZXZlbnQgb3ZlcndyaXRlcwogKiAgICAgICAgYWxyZWFkeSByZXBvcnRlZCBtZXRob2QsIHRoZW4gc3VjaCBhIG1ldGhvZCBiZWNvbWVzIGludmFsaWQgYW5kCiAqICAgICAgICBpdHMgbWVtb3J5IHJlZ2lvbiBpcyB0cmVhdGVkIGFzIHVubG9hZGVkLgogKiAgICAgICogQWxsIGNvZGUgcmVnaW9ucyByZXBvcnRlZCB3aXRoIHRoZSBzYW1lIG1ldGhvZCBJRCBhcmUgY29uc2lkZXJlZCBhcwogKiAgICAgICAgYmVsb25naW5nIHRvIHRoZSBzYW1lIG1ldGhvZC4gU3ltYm9saWMgaW5mb3JtYXRpb24gKG1ldGhvZCBuYW1lLAogKiAgICAgICAgc291cmNlIGZpbGUgbmFtZSkgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBmaXJzdCBub3RpZmljYXRpb24sIGFsbAogKiAgICAgICAgc3Vic2VxdWVudCBub3RpZmljYXRpb25zIHdpdGggdGhlIHNhbWUgbWV0aG9kIElEIHdpbGwgYmUgcHJvY2Vzc2VkCiAqICAgICAgICBvbmx5IGZvciBsaW5lIG51bWJlciB0YWJsZSBpbmZvcm1hdGlvbi4gU28sIHRoZSBWVHVuZSBBbXBsaWZpZXIgd2lsbCBtYXAKICogICAgICAgIHNhbXBsZXMgdG8gYSBzb3VyY2UgbGluZSB1c2luZyB0aGUgbGluZSBudW1iZXIgdGFibGUgZnJvbSB0aGUgY3VycmVudAogKiAgICAgICAgbm90aWZpY2F0aW9uIHdoaWxlIHRha2luZyBzb3VyY2UgZmlsZSBuYW1lIGZyb20gdGhlIHZlcnkgZmlyc3Qgb25lLlxuCiAqICAgICAgICBDbGFyaWZpY2F0aW9uIG9mIHNvbWUgY2FzZXM6XG4KICogICAgICAgICAgKiBJZiB5b3UgcmVnaXN0ZXIgYSBzZWNvbmQgY29kZSByZWdpb24gd2l0aCBhIGRpZmZlcmVudCBzb3VyY2UgZmlsZQogKiAgICAgICAgICBuYW1lIGFuZCB0aGUgc2FtZSBtZXRob2QgSUQsIHRoZW4gdGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHNhdmVkIGFuZAogKiAgICAgICAgICB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGFzIGFuIGV4dGVuc2lvbiBvZiB0aGUgZmlyc3QgY29kZSByZWdpb24sIGJ1dAogKiAgICAgICAgICBWVHVuZSBBbXBsaWZpZXIgd2lsbCB1c2Ugc291cmNlIGZpbGUgb2YgdGhlIGZpcnN0IGNvZGUgcmVnaW9uIGFuZCBtYXAKICogICAgICAgICAgcGVyZm9ybWFuY2UgbWV0cmljcyBpbmNvcnJlY3RseS4KICogICAgICAgICAgKiBJZiB5b3UgcmVnaXN0ZXIgYSBzZWNvbmQgY29kZSByZWdpb24gd2l0aCB0aGUgc2FtZSBzb3VyY2UgZmlsZSBhcwogKiAgICAgICAgICBmb3IgdGhlIGZpcnN0IHJlZ2lvbiBhbmQgdGhlIHNhbWUgbWV0aG9kIElELCB0aGVuIHNvdXJjZSBmaWxlIHdpbGwgYmUKICogICAgICAgICAgZGlzY2FyZGVkIGJ1dCBWVHVuZSBBbXBsaWZpZXIgd2lsbCBtYXAgbWV0cmljcyB0byB0aGUgc291cmNlIGZpbGUgY29ycmVjdGx5LgogKiAgICAgICAgICAqIElmIHlvdSByZWdpc3RlciBhIHNlY29uZCBjb2RlIHJlZ2lvbiB3aXRoIGEgbnVsbCBzb3VyY2UgZmlsZSBhbmQKICogICAgICAgICAgdGhlIHNhbWUgbWV0aG9kIElELCB0aGVuIHByb3ZpZGVkIGxpbmUgbnVtYmVyIGluZm8gd2lsbCBiZSBhc3NvY2lhdGVkCiAqICAgICAgICAgIHdpdGggdGhlIHNvdXJjZSBmaWxlIG9mIHRoZSBmaXJzdCBjb2RlIHJlZ2lvbi4KICoKICogKipFeHBsb3JlIGlubGluZSBmdW5jdGlvbnMqKiBpbmNsdWRpbmcgbXVsdGktbGV2ZWwgaGllcmFyY2h5IG9mCiAqIG5lc3RlZCBpbmxpbmVzIHRvIHNlZSBob3cgcGVyZm9ybWFuY2UgbWV0cmljcyBhcmUgZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGVtLgogKgogKiBAY29kZQogKiAjaW5jbHVkZSA8aml0cHJvZmlsaW5nLmg+CiAqCiAqICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9pZCAgIHBhcmVudF9pZAogKiAgLy8gICBbLS0gYyAtLV0gICAgICAgICAgICAgICAgICAgICAgICAgIDMwMDAgICAgICAgIDIwMDAKICogIC8vICAgICAgICAgICAgICAgICAgWy0tLS0gZCAtLS0tLV0gICAgICAyMDAxICAgICAgICAxMDAwCiAqICAvLyAgWy0tLS0gYiAtLS0tXSAgICAgICAgICAgICAgICAgICAgICAgMjAwMCAgICAgICAgMTAwMAogKiAgLy8gWy0tLS0tLS0tLS0tLSBhIC0tLS0tLS0tLS0tLS0tLS1dICAgIDEwMDAgICAgICAgICBuL2EKICoKICogaUpJVF9NZXRob2RfTG9hZCBhID0gezB9OwogKiBhLm1ldGhvZF9pZCA9IDEwMDA7CiAqCiAqIGlKSVRfTWV0aG9kX0lubGluZV9Mb2FkIGIgPSB7MH07CiAqIGIubWV0aG9kX2lkID0gMjAwMDsKICogYi5wYXJlbnRfbWV0aG9kX2lkID0gMTAwMDsKICoKICogaUpJVF9NZXRob2RfSW5saW5lX0xvYWQgYyA9IHswfTsKICogYy5tZXRob2RfaWQgPSAzMDAwOwogKiBjLnBhcmVudF9tZXRob2RfaWQgPSAyMDAwOwogKgogKiBpSklUX01ldGhvZF9JbmxpbmVfTG9hZCBkID0gezB9OwogKiBkLm1ldGhvZF9pZCA9IDIwMDE7CiAqIGQucGFyZW50X21ldGhvZF9pZCA9IDEwMDA7CiAqCiAqIGlKSVRfTm90aWZ5RXZlbnQoaUpWTV9FVkVOVF9UWVBFX01FVEhPRF9MT0FEX0ZJTklTSEVELCAodm9pZCopJmEpOwogKiBpSklUX05vdGlmeUV2ZW50KGlKVk1fRVZFTlRfVFlQRV9NRVRIT0RfSU5MSU5FX0xPQURfRklOSVNIRUQsICh2b2lkKikmYik7CiAqIGlKSVRfTm90aWZ5RXZlbnQoaUpWTV9FVkVOVF9UWVBFX01FVEhPRF9JTkxJTkVfTE9BRF9GSU5JU0hFRCwgKHZvaWQqKSZjKTsKICogaUpJVF9Ob3RpZnlFdmVudChpSlZNX0VWRU5UX1RZUEVfTUVUSE9EX0lOTElORV9MT0FEX0ZJTklTSEVELCAodm9pZCopJmQpOwogKiBAZW5kY29kZQogKgogKiAgKiBSZXF1aXJlbWVudHM6CiAqICAgICAgKiBFYWNoIGlubGluZSAoaUpJVF9NZXRob2RfSW5saW5lX0xvYWQpIG1ldGhvZCBzaG91bGQgYmUgYXNzb2NpYXRlZAogKiAgICAgICAgd2l0aCB0d28gbWV0aG9kIElEczogb25lIGZvciBpdHNlbGYsIG9uZSBmb3IgaXRzIGltbWVkaWF0ZSBwYXJlbnQuCiAqICAgICAgKiBBZGRyZXNzIHJlZ2lvbnMgb2YgaW5saW5lIG1ldGhvZHMgb2YgdGhlIHNhbWUgcGFyZW50IG1ldGhvZCBjYW5ub3QKICogICAgICAgIG92ZXJsYXAgZWFjaCBvdGhlci4KICogICAgICAqIEV4ZWN1dGlvbiBvZiB0aGUgcGFyZW50IG1ldGhvZCBtdXN0IG5vdCBiZSBzdGFydGVkIHVudGlsIGl0IGFuZCBhbGwKICogICAgICAgIGl0cyBpbmxpbmVzIGFyZSByZXBvcnRlZC4KICogICogRXhwZWN0ZWQgYmVoYXZpb3VyOgogKiAgICAgICogSW4gY2FzZSBvZiBuZXN0ZWQgaW5saW5lcyBhbiBvcmRlciBvZgogKiAgICAgICAgaUpWTV9FVkVOVF9UWVBFX01FVEhPRF9JTkxJTkVfTE9BRF9GSU5JU0hFRCBldmVudHMgaXMgbm90IGltcG9ydGFudC4KICogICAgICAqIElmIGFueSBldmVudCBvdmVyd3JpdGVzIGVpdGhlciBpbmxpbmUgbWV0aG9kIG9yIHRvcCBwYXJlbnQgbWV0aG9kLAogKiAgICAgICAgdGhlbiB0aGUgcGFyZW50IGluY2x1ZGluZyBpbmxpbmVzIGJlY29tZXMgaW52YWxpZCBhbmQgaXRzIG1lbW9yeQogKiAgICAgICAgcmVnaW9uIGlzIHRyZWF0ZWQgYXMgdW5sb2FkZWQuCiAqCiAqICoqTGlmZSB0aW1lIG9mIGFsbG9jYXRlZCBkYXRhKipcbgogKiBUaGUgY2xpZW50IHNlbmRzIGFuIGV2ZW50IG5vdGlmaWNhdGlvbiB0byB0aGUgYWdlbnQgd2l0aCBldmVudC1zcGVjaWZpYwogKiBkYXRhLCB3aGljaCBpcyBhIHN0cnVjdHVyZS4gVGhlIHBvaW50ZXJzIGluIHRoZSBzdHJ1Y3R1cmUgcmVmZXJzIHRvIG1lbW9yeQogKiBhbGxvY2F0ZWQgYnkgdGhlIGNsaWVudCwgd2hpY2ggcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdC4gVGhlIHBvaW50ZXJzIGFyZQogKiB1c2VkIGJ5IHRoZSBpSklUX05vdGlmeUV2ZW50IG1ldGhvZCB0byBjb3B5IGNsaWVudCdzIGRhdGEgaW4gYSB0cmFjZSBmaWxlCiAqIGFuZCB0aGV5IGFyZSBub3QgdXNlZCBhZnRlciB0aGUgaUpJVF9Ob3RpZnlFdmVudCBtZXRob2QgcmV0dXJucy4KICoKICovCgovKioKICogQGRlZmdyb3VwIGppdGFwaSBKSVQgUHJvZmlsaW5nCiAqIEBpbmdyb3VwIGludGVybmFsCiAqIEB7CiAqLwoKLyoqCiAqIEBlbnVtIGlKSVRfanZtX2V2ZW50CiAqIEBicmllZiBFbnVtZXJhdG9yIGZvciB0aGUgdHlwZXMgb2Ygbm90aWZpY2F0aW9ucwogKi8KdHlwZWRlZiBlbnVtIGlKSVRfanZtX2V2ZW50CnsKICAgIGlKVk1fRVZFTlRfVFlQRV9TSFVURE9XTiA9IDIsICAgICAgICAgICAgICAgLyoqPCBTZW5kIHRvIHNodXRkb3duIHRoZSBhZ2VudC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVXNlIE5VTEwgZm9yIGV2ZW50IGRhdGEuICovCgogICAgaUpWTV9FVkVOVF9UWVBFX01FVEhPRF9MT0FEX0ZJTklTSEVEID0gMTMsICAvKio8IFNlbmQgd2hlbiBhIGR5bmFtaWMgY29kZSBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBKSVQgY29tcGlsZWQgYW5kIGxvYWRlZCBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1lbW9yeSBieSB0aGUgSklUIGVuZ2luZSBidXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVmb3JlIHRoZSBjb2RlIGlzIGV4ZWN1dGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBVc2UgaUpJVF9NZXRob2RfTG9hZCBhcyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkYXRhLiAqLwovKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KICAgIGlKVk1fRVZFTlRfVFlQRV9NRVRIT0RfVU5MT0FEX1NUQVJULCAgICAvKio8IFNlbmQgd2hlbiBhIGNvbXBpbGVkIGR5bmFtaWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb2RlIGlzIGJlaW5nIHVubG9hZGVkIGZyb20gbWVtb3J5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFVzZSBpSklUX01ldGhvZF9Mb2FkIGFzIGV2ZW50IGRhdGEuKi8KLyoqIEBlbmRjb25kICovCgovL1RPRE86IGFkZCBhIG5vdGUgdGhhdCBsaW5lIGluZm8gYXNzdW1lcyBmcm9tIG1ldGhvZCBsb2FkCiAgICBpSlZNX0VWRU5UX1RZUEVfTUVUSE9EX1VQREFURSwgICAvKio8IFNlbmQgdG8gcHJvdmlkZSBhIG5ldyBjb250ZW50IGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW4gZWFybHkgcmVwb3J0ZWQgZHluYW1pYyBjb2RlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlIHByZXZpb3VzIGNvbnRlbnQgd2lsbCBiZSBpbnZhbGlkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGFydGluZyBmcm9tIHRpbWUgb2YgdGhlIG5vdGlmaWNhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFVzZSBpSklUX01ldGhvZF9Mb2FkIGFzIGV2ZW50IGRhdGEgYnV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXF1aXJlZCBmaWVsZHMgYXJlIGZvbGxvd2luZzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0gbWV0aG9kX2lkICAgIGlkZW50aWZ5IHRoZSBjb2RlIHRvIHVwZGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0gbWV0aG9kX2xvYWRfYWRkcmVzcyAgICBzcGVjaWZ5IHN0YXJ0IGFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gaWRlbnRpZmllZCBjb2RlIHJhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdXBkYXRlIHNob3VsZCBiZSBzdGFydGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogLSBtZXRob2Rfc2l6ZSAgICAgICAgICAgIHNwZWNpZnkgbGVuZ3RoIG9mIHVwZGF0ZWQgY29kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLiAqLwoKICAgIGlKVk1fRVZFTlRfVFlQRV9NRVRIT0RfSU5MSU5FX0xPQURfRklOSVNIRUQsIC8qKjwgU2VuZCB3aGVuIGFuIGlubGluZSBkeW5hbWljCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb2RlIGlzIEpJVCBjb21waWxlZCBhbmQgbG9hZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnRvIG1lbW9yeSBieSB0aGUgSklUIGVuZ2luZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnV0IGJlZm9yZSB0aGUgcGFyZW50IGNvZGUgcmVnaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBzdGFydGVkIGV4ZWN1dGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFVzZSBpSklUX01ldGhvZF9JbmxpbmVfTG9hZCBhcyBldmVudCBkYXRhLiovCgovKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KICAgIC8qIExlZ2FjeSBzdHVmZi4gRG8gbm90IHVzZSBpdC4gKi8KICAgIGlKVk1fRVZFTlRfVFlQRV9FTlRFUl9OSURTID0gMTksCiAgICBpSlZNX0VWRU5UX1RZUEVfTEVBVkVfTklEUywKLyoqIEBlbmRjb25kICovCgogICAgaUpWTV9FVkVOVF9UWVBFX01FVEhPRF9MT0FEX0ZJTklTSEVEX1YyICAvKio8IFNlbmQgd2hlbiBhIGR5bmFtaWMgY29kZSBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBKSVQgY29tcGlsZWQgYW5kIGxvYWRlZCBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1lbW9yeSBieSB0aGUgSklUIGVuZ2luZSBidXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVmb3JlIHRoZSBjb2RlIGlzIGV4ZWN1dGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBVc2UgaUpJVF9NZXRob2RfTG9hZF9WMiBhcyBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkYXRhLiAqLwp9IGlKSVRfSlZNX0VWRU5UOwoKLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCi8qIExlZ2FjeSBzdHVmZi4gRG8gbm90IHVzZSBpdC4gKi8KdHlwZWRlZiBlbnVtIF9pSklUX01vZGVGbGFncwp7CiAgICBpSklUX05PX05PVElGSUNBVElPTlMgICAgICAgICAgPSAweDAwMDAsCiAgICBpSklUX0JFX05PVElGWV9PTl9MT0FEICAgICAgICAgPSAweDAwMDEsCiAgICBpSklUX0JFX05PVElGWV9PTl9VTkxPQUQgICAgICAgPSAweDAwMDIsCiAgICBpSklUX0JFX05PVElGWV9PTl9NRVRIT0RfRU5UUlkgPSAweDAwMDQsCiAgICBpSklUX0JFX05PVElGWV9PTl9NRVRIT0RfRVhJVCAgPSAweDAwMDgKCn0gaUpJVF9Nb2RlRmxhZ3M7Ci8qKiBAZW5kY29uZCAqLwoKLyoqCiAqIEBlbnVtIF9pSklUX0lzUHJvZmlsaW5nQWN0aXZlRmxhZ3MKICogQGJyaWVmIEVudW1lcmF0b3IgZm9yIHRoZSBhZ2VudCdzIG1vZGUKICovCnR5cGVkZWYgZW51bSBfaUpJVF9Jc1Byb2ZpbGluZ0FjdGl2ZUZsYWdzCnsKICAgIGlKSVRfTk9USElOR19SVU5OSU5HICAgICAgICAgICA9IDB4MDAwMCwgICAgLyoqPCBUaGUgYWdlbnQgaXMgbm90IHJ1bm5pbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlKSVRfTm90aWZ5RXZlbnQgY2FsbHMgd2lsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3QgYmUgcHJvY2Vzc2VkLiAqLwogICAgaUpJVF9TQU1QTElOR19PTiAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAvKio8IFRoZSBhZ2VudCBpcyBydW5uaW5nIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZWFkeSB0byBwcm9jZXNzIG5vdGlmaWNhdGlvbnMuICovCgovKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KICAgIC8qIExlZ2FjeS4gQ2FsbCBHcmFwaCBpcyBydW5uaW5nICovCiAgICBpSklUX0NBTExHUkFQSF9PTiAgICAgICAgICAgICAgPSAweDAwMDIKLyoqIEBlbmRjb25kICovCgp9IGlKSVRfSXNQcm9maWxpbmdBY3RpdmVGbGFnczsKCi8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwovKiBMZWdhY3kgc3R1ZmYuIERvIG5vdCB1c2UgaXQuICovCnR5cGVkZWYgZW51bSBfaUpERW52aXJvbm1lbnRUeXBlCnsKICAgIGlKREVfSml0dGluZ0FQSSA9IDIKCn0gaUpERW52aXJvbm1lbnRUeXBlOwoKdHlwZWRlZiBzdHJ1Y3QgX2lKSVRfTWV0aG9kX0lkCnsKICAgIHVuc2lnbmVkIGludCBtZXRob2RfaWQ7Cgp9ICpwaUpJVF9NZXRob2RfSWQsIGlKSVRfTWV0aG9kX0lkOwoKdHlwZWRlZiBzdHJ1Y3QgX2lKSVRfTWV0aG9kX05JRFMKewogICAgdW5zaWduZWQgaW50IG1ldGhvZF9pZDsgICAgIC8qKjwgVW5pcXVlIG1ldGhvZCBJRCAqLwogICAgdW5zaWduZWQgaW50IHN0YWNrX2lkOyAgICAgIC8qKjwgTk9URTogbm8gbmVlZCB0byBmaWxsIHRoaXMgZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaXQncyBmaWxsZWQgYnkgVlR1bmUgQW1wbGlmaWVyICovCiAgICBjaGFyKiAgbWV0aG9kX25hbWU7ICAgICAgICAgLyoqPCBNZXRob2QgbmFtZSAoanVzdCB0aGUgbWV0aG9kLCB3aXRob3V0IHRoZSBjbGFzcykgKi8KCn0gKnBpSklUX01ldGhvZF9OSURTLCBpSklUX01ldGhvZF9OSURTOwovKiogQGVuZGNvbmQgKi8KCnR5cGVkZWYgZW51bSBfaUpJVF9Db2RlVHlwZQp7CiAgICBpSklUX0NUX1VOS05PV04gPSAwLAogICAgaUpJVF9DVF9DT0RFLCAgICAgICAgICAgICAvLyBleGVjdXRhYmxlIGNvZGUKICAgIGlKSVRfQ1RfREFUQSwgICAgICAgICAgICAgLy8gdGhpcyBraW5kIG9mIJN1cGRhdGWUIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZnVuY3Rpb26ScyBib2R5LgogICAgaUpJVF9DVF9FT0YKfSBpSklUX0NvZGVUeXBlOwoKdHlwZWRlZiBzdHJ1Y3QgX2lKSVRfTWV0aG9kX1VwZGF0ZQp7CiAgICB1bnNpZ25lZCBpbnQgbWV0aG9kX2lkOwogICAgdm9pZCogbG9hZF9hZGRyZXNzOwogICAgdW5zaWduZWQgaW50IHNpemU7CiAgICBpSklUX0NvZGVUeXBlIHR5cGU7Cgp9ICpwaUpJVF9NZXRob2RfVXBkYXRlLCBpSklUX01ldGhvZF9VcGRhdGU7CgovKioKICogQGRldGFpbHMgRGVzY3JpYmVzIGEgc2luZ2xlIGVudHJ5IGluIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBvZgogKiBhIGNvZGUgcmVnaW9uIHRoYXQgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSByZXBvcnRlZCBjb2RlIHJlZ2lvbgogKiBpcyBtYXBwZWQgdG8gc291cmNlIGZpbGUuCiAqIEludGVsKFIpIFZUdW5lKFRNKSBBbXBsaWZpZXIgdXNlcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB0byBhdHRyaWJ1dGUKICogdGhlIHNhbXBsZXMgKHZpcnR1YWwgYWRkcmVzcykgdG8gYSBsaW5lIG51bWJlci4gXG4KICogSXQgaXMgYWNjZXB0YWJsZSB0byByZXBvcnQgZGlmZmVyZW50IGNvZGUgYWRkcmVzc2VzIGZvciB0aGUgc2FtZSBzb3VyY2UgbGluZToKICogQGNvZGUKICogICBPZmZzZXQgTGluZU51bWJlcgogKiAgICAgIDEgICAgICAgMgogKiAgICAgIDEyICAgICAgNAogKiAgICAgIDE1ICAgICAgMgogKiAgICAgIDE4ICAgICAgMQogKiAgICAgIDIxICAgICAgMzAKICoKICogIFZUdW5lKFRNKSBBbXBsaWZpZXIgWEUgY29udHNydWN0cyB0aGUgZm9sbG93aW5nIHRhYmxlIHVzaW5nIHRoZSBjbGllbnQgZGF0YQogKgogKiAgIENvZGUgc3VicmFuZ2UgIExpbmUgbnVtYmVyCiAqICAgICAgMC0xICAgICAgICAgICAgIDIKICogICAgICAxLTEyICAgICAgICAgICAgNAogKiAgICAgIDEyLTE1ICAgICAgICAgICAyCiAqICAgICAgMTUtMTggICAgICAgICAgIDEKICogICAgICAxOC0yMSAgICAgICAgICAgMzAKICogQGVuZGNvZGUKICovCnR5cGVkZWYgc3RydWN0IF9MaW5lTnVtYmVySW5mbwp7CiAgICB1bnNpZ25lZCBpbnQgT2Zmc2V0OyAgICAgLyoqPCBPZmZzZXQgZnJvbSB0aGUgYmVnaW5pbmcgb2YgdGhlIGNvZGUgcmVnaW9uLiAqLwogICAgdW5zaWduZWQgaW50IExpbmVOdW1iZXI7IC8qKjwgTWF0Y2hpbmcgc291cmNlIGxpbmUgbnVtYmVyIG9mZnNldCAoZnJvbSBiZWdpbm5pbmcgb2Ygc291cmNlIGZpbGUpLiAqLwoKfSAqcExpbmVOdW1iZXJJbmZvLCBMaW5lTnVtYmVySW5mbzsKCi8qKgogKiAgRGVzY3JpcHRpb24gb2YgYSBKSVQtY29tcGlsZWQgbWV0aG9kCiAqLwp0eXBlZGVmIHN0cnVjdCBfaUpJVF9NZXRob2RfTG9hZAp7CiAgICB1bnNpZ25lZCBpbnQgbWV0aG9kX2lkOyAvKio8IFVuaXF1ZSBtZXRob2QgSUQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgTWV0aG9kIElEIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gOTk5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIEVpdGhlciB5b3UgdXNlIHRoZSBBUEkgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBpSklUX0dldE5ld01ldGhvZElEIHRvIGdldCBhIHZhbGlkIGFuZCB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBtZXRob2QgSUQsIG9yIHlvdSB0YWtlIGNhcmUgb2YgSUQgdW5pcXVlbmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGFuZCBjb3JyZWN0IHJhbmdlIGJ5IHlvdXJzZWxmLlxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgWW91IG11c3QgdXNlIHRoZSBzYW1lIG1ldGhvZCBJRCBmb3IgYWxsIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICByZWdpb25zIG9mIHRoZSBzYW1lIG1ldGhvZCwgb3RoZXJ3aXNlIGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIG1ldGhvZCBJRHMgbWVhbiBkaWZmZXJlbnQgbWV0aG9kcy4gKi8KCiAgICBjaGFyKiBtZXRob2RfbmFtZTsgLyoqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuIEl0IGNhbiBiZSBvcHRpb25hbGx5CiAgICAgICAgICAgICAgICAgICAgICAgICogIHByZWZpeGVkIHdpdGggaXRzIGNsYXNzIG5hbWUgYW5kIGFwcGVuZGVkIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgKiAgaXRzIGNvbXBsZXRlIHNpZ25hdHVyZS4gQ2FuJ3QgYmUgIE5VTEwuICovCgogICAgdm9pZCogbWV0aG9kX2xvYWRfYWRkcmVzczsgLyoqIFRoZSBzdGFydCB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIG1ldGhvZCBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgcmVnaW9uLiBJZiBOVUxMIHRoYXQgZGF0YSBwcm92aWRlZCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgZXZlbnQgYXJlIG5vdCBhY2NlcHRlZC4gKi8KCiAgICB1bnNpZ25lZCBpbnQgbWV0aG9kX3NpemU7IC8qKiBUaGUgY29kZSBzaXplIG9mIHRoZSBtZXRob2QgaW4gbWVtb3J5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgSWYgMCwgdGhlbiBkYXRhIHByb3ZpZGVkIHdpdGggdGhlIGV2ZW50IGFyZSBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGFjY2VwdGVkLiAqLwoKICAgIHVuc2lnbmVkIGludCBsaW5lX251bWJlcl9zaXplOyAvKiogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBsaW5lIG51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICB0YWJsZS4wIGlmIG5vbmUuICovCgogICAgcExpbmVOdW1iZXJJbmZvIGxpbmVfbnVtYmVyX3RhYmxlOyAvKiogUG9pbnRlciB0byB0aGUgbGluZSBudW1iZXJzIGluZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGFycmF5LiBDYW4gYmUgTlVMTCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgbGluZV9udW1iZXJfc2l6ZSBpcyAwLiBTZWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIExpbmVOdW1iZXJJbmZvIFN0cnVjdHVyZSBmb3IgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgZGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgZW50cnkgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHRoZSBsaW5lIG51bWJlciBpbmZvIGFycmF5ICovCgogICAgdW5zaWduZWQgaW50IGNsYXNzX2lkOyAvKiogVGhpcyBmaWVsZCBpcyBvYnNvbGV0ZS4gKi8KCiAgICBjaGFyKiBjbGFzc19maWxlX25hbWU7IC8qKiBDbGFzcyBuYW1lLiBDYW4gYmUgTlVMTC4qLwoKICAgIGNoYXIqIHNvdXJjZV9maWxlX25hbWU7IC8qKiBTb3VyY2UgZmlsZSBuYW1lLiBDYW4gYmUgTlVMTC4qLwoKICAgIHZvaWQqIHVzZXJfZGF0YTsgLyoqIFRoaXMgZmllbGQgaXMgb2Jzb2xldGUuICovCgogICAgdW5zaWduZWQgaW50IHVzZXJfZGF0YV9zaXplOyAvKiogVGhpcyBmaWVsZCBpcyBvYnNvbGV0ZS4gKi8KCiAgICBpSkRFbnZpcm9ubWVudFR5cGUgIGVudjsgLyoqIFRoaXMgZmllbGQgaXMgb2Jzb2xldGUuICovCgp9ICpwaUpJVF9NZXRob2RfTG9hZCwgaUpJVF9NZXRob2RfTG9hZDsKCiNwcmFnbWEgcGFjayhwdXNoLCA4KQovKioKICogIERlc2NyaXB0aW9uIG9mIGEgSklULWNvbXBpbGVkIG1ldGhvZAogKgogKiAgV2hlbiB5b3UgdXNlIHRoZSBpSklUX01ldGhvZF9Mb2FkX1YyIHN0cnVjdHVyZSB0byBkZXNjcmliZQogKiAgdGhlIEpJVCBjb21waWxlZCBtZXRob2QsIHVzZSBpSlZNX0VWRU5UX1RZUEVfTUVUSE9EX0xPQURfRklOSVNIRURfVjIKICogIGFzIGFuIGV2ZW50IHR5cGUgdG8gcmVwb3J0IGl0LgogKi8KdHlwZWRlZiBzdHJ1Y3QgX2lKSVRfTWV0aG9kX0xvYWRfVjIKewogICAgdW5zaWduZWQgaW50IG1ldGhvZF9pZDsgLyoqPCBVbmlxdWUgbWV0aG9kIElELgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIE1ldGhvZCBJRCBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDk5OS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBFaXRoZXIgeW91IHVzZSB0aGUgQVBJIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgaUpJVF9HZXROZXdNZXRob2RJRCB0byBnZXQgYSB2YWxpZCBhbmQgdW5pcXVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgbWV0aG9kIElELCBvciB5b3UgdGFrZSBjYXJlIG9mIElEIHVuaXF1ZW5lc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBhbmQgY29ycmVjdCByYW5nZSBieSB5b3Vyc2VsZi5cbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFlvdSBtdXN0IHVzZSB0aGUgc2FtZSBtZXRob2QgSUQgZm9yIGFsbCBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgcmVnaW9ucyBvZiB0aGUgc2FtZSBtZXRob2QsIG90aGVyd2lzZSBkaWZmZXJlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBtZXRob2QgSURzIG1lYW4gZGlmZmVyZW50IG1ldGhvZHMuICovCgogICAgY2hhciogbWV0aG9kX25hbWU7IC8qKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kLiBJdCBjYW4gYmUgb3B0aW9uYWxseQogICAgICAgICAgICAgICAgICAgICAgICAqICBwcmVmaXhlZCB3aXRoIGl0cyBjbGFzcyBuYW1lIGFuZCBhcHBlbmRlZCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICogIGl0cyBjb21wbGV0ZSBzaWduYXR1cmUuIENhbid0IGJlICBOVUxMLiAqLwoKICAgIHZvaWQqIG1ldGhvZF9sb2FkX2FkZHJlc3M7IC8qKiBUaGUgc3RhcnQgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBtZXRob2QgY29kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHJlZ2lvbi4gSWYgTlVMTCB0aGF0IGRhdGEgcHJvdmlkZWQgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGV2ZW50IGFyZSBub3QgYWNjZXB0ZWQuICovCgogICAgdW5zaWduZWQgaW50IG1ldGhvZF9zaXplOyAvKiogVGhlIGNvZGUgc2l6ZSBvZiB0aGUgbWV0aG9kIGluIG1lbW9yeS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIElmIDAsIHRoZW4gZGF0YSBwcm92aWRlZCB3aXRoIHRoZSBldmVudCBhcmUgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBhY2NlcHRlZC4gKi8KCiAgICB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXJfc2l6ZTsgLyoqIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbGluZSBudW1iZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgdGFibGUuMCBpZiBub25lLiAqLwoKICAgIHBMaW5lTnVtYmVySW5mbyBsaW5lX251bWJlcl90YWJsZTsgLyoqIFBvaW50ZXIgdG8gdGhlIGxpbmUgbnVtYmVycyBpbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBhcnJheS4gQ2FuIGJlIE5VTEwgaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGxpbmVfbnVtYmVyX3NpemUgaXMgMC4gU2VlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBMaW5lTnVtYmVySW5mbyBTdHJ1Y3R1cmUgZm9yIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGRlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGVudHJ5IGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICB0aGUgbGluZSBudW1iZXIgaW5mbyBhcnJheSAqLwoKICAgIGNoYXIqIGNsYXNzX2ZpbGVfbmFtZTsgLyoqIENsYXNzIG5hbWUuIENhbiBiZSBOVUxMLiovCgogICAgY2hhciogc291cmNlX2ZpbGVfbmFtZTsgLyoqIFNvdXJjZSBmaWxlIG5hbWUuIENhbiBiZSBOVUxMLiovCgogICAgY2hhciogbW9kdWxlX25hbWU7IC8qKiBNb2R1bGUgbmFtZS4gQ2FuIGJlIE5VTEwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtb2R1bGUgbmFtZSBjYW4gYmUgdXNlZnVsIGZvciBkaXN0aW5ndWlzaGluZyBhbW9uZwogICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgSklUIGVuZ2luZXMuIEludGVsIFZUdW5lIEFtcGxpZmllciB3aWxsIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgbWV0aG9kcyBzcGxpdCBieSBzcGVjaWZpZWQgbW9kdWxlcyAqLwoKfSAqcGlKSVRfTWV0aG9kX0xvYWRfVjIsIGlKSVRfTWV0aG9kX0xvYWRfVjI7CiNwcmFnbWEgcGFjayhwb3ApCgovKioKICogRGVzY3JpcHRpb24gb2YgYW4gaW5saW5lIEpJVC1jb21waWxlZCBtZXRob2QKICovCnR5cGVkZWYgc3RydWN0IF9pSklUX01ldGhvZF9JbmxpbmVfTG9hZAp7CiAgICB1bnNpZ25lZCBpbnQgbWV0aG9kX2lkOyAvKio8IFVuaXF1ZSBtZXRob2QgSUQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgTWV0aG9kIElEIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gOTk5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIEVpdGhlciB5b3UgdXNlIHRoZSBBUEkgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBpSklUX0dldE5ld01ldGhvZElEIHRvIGdldCBhIHZhbGlkIGFuZCB1bmlxdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBtZXRob2QgSUQsIG9yIHlvdSB0YWtlIGNhcmUgb2YgSUQgdW5pcXVlbmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGFuZCBjb3JyZWN0IHJhbmdlIGJ5IHlvdXJzZWxmLiAqLwoKICAgIHVuc2lnbmVkIGludCBwYXJlbnRfbWV0aG9kX2lkOyAvKiogVW5pcXVlIGltbWVkaWF0ZSBwYXJlbnQncyBtZXRob2QgSUQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIE1ldGhvZCBJRCBtYXkgbm90IGJlIHNtYWxsZXIgdGhhbiA5OTkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIEVpdGhlciB5b3UgdXNlIHRoZSBBUEkgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgaUpJVF9HZXROZXdNZXRob2RJRCB0byBnZXQgYSB2YWxpZCBhbmQgdW5pcXVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIG1ldGhvZCBJRCwgb3IgeW91IHRha2UgY2FyZSBvZiBJRCB1bmlxdWVuZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGFuZCBjb3JyZWN0IHJhbmdlIGJ5IHlvdXJzZWxmLiAqLwoKICAgIGNoYXIqIG1ldGhvZF9uYW1lOyAvKiogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4gSXQgY2FuIGJlIG9wdGlvbmFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgKiAgcHJlZml4ZWQgd2l0aCBpdHMgY2xhc3MgbmFtZSBhbmQgYXBwZW5kZWQgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAqICBpdHMgY29tcGxldGUgc2lnbmF0dXJlLiBDYW4ndCBiZSAgTlVMTC4gKi8KCiAgICB2b2lkKiBtZXRob2RfbG9hZF9hZGRyZXNzOyAgLyoqIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb24gd2hpY2ggdGhlIG1ldGhvZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBpbmxpbmVkLiBJZiBOVUxMLCB0aGVuIGRhdGEgcHJvdmlkZWQgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZXZlbnQgYXJlIG5vdCBhY2NlcHRlZC4gKi8KCiAgICB1bnNpZ25lZCBpbnQgbWV0aG9kX3NpemU7IC8qKiBUaGUgY29kZSBzaXplIG9mIHRoZSBtZXRob2QgaW4gbWVtb3J5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgSWYgMCB0aGF0IGRhdGEgcHJvdmlkZWQgd2l0aCBldmVudCBhcmUgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBhY2NlcHRlZC4gKi8KCiAgICB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXJfc2l6ZTsgLyoqIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbGluZSBudW1iZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgdGFibGUuIDAgaWYgbm9uZS4gKi8KCiAgICBwTGluZU51bWJlckluZm8gbGluZV9udW1iZXJfdGFibGU7IC8qKiBQb2ludGVyIHRvIHRoZSBsaW5lIG51bWJlcnMgaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgYXJyYXkuIENhbiBiZSBOVUxMIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBsaW5lX251bWJlcl9zaXplIGlzIDAuIFNlZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgTGluZU51bWJlckluZm8gU3RydWN0dXJlIGZvciBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBkZXNjcmlwdGlvbiBvZiBhIHNpbmdsZSBlbnRyeSBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgdGhlIGxpbmUgbnVtYmVyIGluZm8gYXJyYXkgKi8KCiAgICBjaGFyKiBjbGFzc19maWxlX25hbWU7IC8qKiBDbGFzcyBuYW1lLiBDYW4gYmUgTlVMTC4qLwoKICAgIGNoYXIqIHNvdXJjZV9maWxlX25hbWU7IC8qKiBTb3VyY2UgZmlsZSBuYW1lLiBDYW4gYmUgTlVMTC4qLwoKfSAqcGlKSVRfTWV0aG9kX0lubGluZV9Mb2FkLCBpSklUX01ldGhvZF9JbmxpbmVfTG9hZDsKCi8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwoKI2lmbmRlZiBDREVDTAojICBpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgX1dJTjMyCiMgICAgZGVmaW5lIENERUNMIF9fY2RlY2wKIyAgZWxzZSAvKiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgX1dJTjMyICovCiMgICAgaWYgZGVmaW5lZCBfTV9YNjQgfHwgZGVmaW5lZCBfTV9BTUQ2NCB8fCBkZWZpbmVkIF9feDg2XzY0X18KIyAgICAgIGRlZmluZSBDREVDTCAvKiBub3QgYWN0dWFsIG9uIHg4Nl82NCBwbGF0Zm9ybSAqLwojICAgIGVsc2UgIC8qIF9NX1g2NCB8fCBfTV9BTUQ2NCB8fCBfX3g4Nl82NF9fICovCiMgICAgICBkZWZpbmUgQ0RFQ0wgX19hdHRyaWJ1dGVfXyAoKGNkZWNsKSkKIyAgICBlbmRpZiAvKiBfTV9YNjQgfHwgX01fQU1ENjQgfHwgX194ODZfNjRfXyAqLwojICBlbmRpZiAvKiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgX1dJTjMyICovCiNlbmRpZiAvKiBDREVDTCAqLwoKI2RlZmluZSBKSVRBUEkgQ0RFQ0wKLyoqIEBlbmRjb25kICovCgovKioKICogQGJyaWVmIEdlbmVyYXRlcyBhIG5ldyB1bmlxdWUgbWV0aG9kIElELgogKgogKiBZb3UgbXVzdCB1c2UgdGhpcyBBUEkgdG8gb2J0YWluIHVuaXF1ZSBhbmQgdmFsaWQgbWV0aG9kIElEcyBmb3IgbWV0aG9kcyBvcgogKiB0cmFjZXMgcmVwb3J0ZWQgdG8gdGhlIGFnZW50IGlmIHlvdSBkb24ndCBoYXZlIHlvdSBvd24gbWVjaGFuaXNtIHRvIGdlbmVyYXRlCiAqIHVuaXF1ZSBtZXRob2QgSURzLgogKgogKiBAcmV0dXJuIGEgbmV3IHVuaXF1ZSBtZXRob2QgSUQuIFdoZW4gb3V0IG9mIHVuaXF1ZSBtZXRob2QgSURzLCB0aGlzIEFQSQogKiByZXR1cm5zIDAsIHdoaWNoIGlzIG5vdCBhbiBhY2NlcHRlZCB2YWx1ZS4KICovCnVuc2lnbmVkIGludCBKSVRBUEkgaUpJVF9HZXROZXdNZXRob2RJRCh2b2lkKTsKCi8qKgogKiBAYnJpZWYgUmV0dXJucyB0aGUgY3VycmVudCBtb2RlIG9mIHRoZSBhZ2VudC4KICoKICogQHJldHVybiBpSklUX1NBTVBMSU5HX09OLCBpbmRpY2F0aW5nIHRoYXQgYWdlbnQgaXMgcnVubmluZywgb3IKICogaUpJVF9OT1RISU5HX1JVTk5JTkcgaWYgbm8gYWdlbnQgaXMgcnVubmluZy4KICovCmlKSVRfSXNQcm9maWxpbmdBY3RpdmVGbGFncyBKSVRBUEkgaUpJVF9Jc1Byb2ZpbGluZ0FjdGl2ZSh2b2lkKTsKCi8qKgogKiBAYnJpZWYgUmVwb3J0cyBpbmZvbWF0aW9uIGFib3V0IEpJVC1jb21waWxlZCBjb2RlIHRvIHRoZSBhZ2VudC4KICoKICogVGhlIHJlcG9ydGVkIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYXR0cmlidXRlIHNhbXBsZXMgb2J0YWluZWQgZnJvbSBhbnkKICogSW50ZWwoUikgVlR1bmUoVE0pIEFtcGxpZmllciBjb2xsZWN0b3IuIFRoaXMgQVBJIG5lZWRzIHRvIGJlIGNhbGxlZAogKiBhZnRlciBKSVQgY29tcGlsYXRpb24gYW5kIGJlZm9yZSB0aGUgZmlyc3QgZW50cnkgaW50byB0aGUgSklUIGNvbXBpbGVkCiAqIGNvZGUuCiAqCiAqIEBwYXJhbVtpbl0gZXZlbnRfdHlwZSAtIHR5cGUgb2YgdGhlIGRhdGEgc2VudCB0byB0aGUgYWdlbnQKICogQHBhcmFtW2luXSBFdmVudFNwZWNpZmljRGF0YSAtIHBvaW50ZXIgdG8gZXZlbnQtc3BlY2lmaWMgZGF0YQogKgogKiBAcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSAwLgogKi8KaW50IEpJVEFQSSBpSklUX05vdGlmeUV2ZW50KGlKSVRfSlZNX0VWRU5UIGV2ZW50X3R5cGUsIHZvaWQqIEV2ZW50U3BlY2lmaWNEYXRhKTsKCi8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwovKgogKiBEbyBub3QgdXNlIHRoZXNlIGxlZ2FjeSBBUElzLCB3aGljaCBhcmUgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogKiB3aXRoIEludGVsKFIpIFZUdW5lKFRNKSBQZXJmb3JtYW5jZSBBbmFseXplci4KICovCnR5cGVkZWYgdm9pZCAoKmlKSVRfTW9kZUNoYW5nZWRFeCkodm9pZCogVXNlckRhdGEsIGlKSVRfTW9kZUZsYWdzIEZsYWdzKTsKdm9pZCBKSVRBUEkgaUpJVF9SZWdpc3RlckNhbGxiYWNrRXgodm9pZCogdXNlcmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlKSVRfTW9kZUNoYW5nZWRFeCBOZXdNb2RlQ2FsbEJhY2tGdW5jRXgpOwp2b2lkIEpJVEFQSSBGaW5hbGl6ZVRocmVhZCh2b2lkKTsKdm9pZCBKSVRBUEkgRmluYWxpemVQcm9jZXNzKHZvaWQpOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi8qKiBAZW5kY29uZCAqLwoKLyoqIEB9IGppdGFwaSBncm91cCAqLwoKI2VuZGlmIC8qIF9fSklUUFJPRklMSU5HX0hfXyAqLwo=