Ly8gICB2aW06dHc9MTEwOnRzPTQ6Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEZJTEUgICA6CUhDRi5DCioKKiBEQVRFICAgIDoJJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS4xMCAkCiogT3JpZ2luYWw6CTIwMDQvMDYvMDIgMTA6MjI6MjIgICAgUmV2aXNpb246IDEuODUgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCiogT3JpZ2luYWw6CTIwMDQvMDQvMTUgMDk6MjQ6NDEgICAgUmV2aXNpb246IDEuNjMgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKiBPcmlnaW5hbDoJMjAwNC8wNC8xMyAxNDoyMjo0NCAgICBSZXZpc2lvbjogMS42MiAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKKiBPcmlnaW5hbDoJMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS41OSAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKiBPcmlnaW5hbDoJMjAwNC8wMy8xMCAxNTozOToyNyAgICBSZXZpc2lvbjogMS41NSAgICAgIFRhZzogdDIwMDQwMzEwXzAxCiogT3JpZ2luYWw6CTIwMDQvMDMvMDQgMTE6MDM6MzcgICAgUmV2aXNpb246IDEuNTMgICAgICBUYWc6IHQyMDA0MDMwNF8wMQoqIE9yaWdpbmFsOgkyMDA0LzAzLzAyIDE0OjUxOjIxICAgIFJldmlzaW9uOiAxLjUwICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKiBPcmlnaW5hbDoJMjAwNC8wMi8yNCAxMzowMDoyNyAgICBSZXZpc2lvbjogMS40MyAgICAgIFRhZzogdDIwMDQwMjI0XzAxCiogT3JpZ2luYWw6CTIwMDQvMDIvMTkgMTA6NTc6MjUgICAgUmV2aXNpb246IDEuMzkgICAgICBUYWc6IHQyMDA0MDIxOV8wMQoqCiogQVVUSE9SIDoJTmljbyBWYWxzdGVyCioKKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLgoqCiogREVTQ1JJUFRJT04gOglIQ0YgUm91dGluZXMgZm9yIEhlcm1lcy1JSSAoY2FsbGFibGUgdmlhIHRoZSBXaXJlbGVzcyBDb25uZWN0aW9uIEkvRiBvciBXQ0kpCioJCQkJTG9jYWwgU3VwcG9ydCBSb3V0aW5lcyBmb3IgYWJvdmUgcHJvY2VkdXJlcwoqCioJCQlDdXN0b21pemFibGUgdmlhIEhDRkNGRy5ILCB3aGljaCBpcyBpbmNsdWRlZCBieSBIQ0YuSAoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqCiogU09GVFdBUkUgTElDRU5TRQoqCiogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCiogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwoqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCioKKiBDT1BZUklHSFQgqSAxOTk0IC0gMTk5NQlieSBBVCZULgkJCQlBbGwgUmlnaHRzIFJlc2VydmVkCiogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAoqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCiogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKgoqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoqCiogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwoqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQoqICAgIGRpc3RyaWJ1dGlvbi4KKgoqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAoqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKgoqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCiogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCioKKiBEaXNjbGFpbWVyCioKKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQoqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCiogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQoqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwoqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAoqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAoqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKiBEQU1BR0UuCioKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKgoqKiBJbXBsZW1lbnRhdGlvbiBOb3RlcwoqKgoqIC0JYSBsZWFkaW5nIG1hcmtlciBvZiAvLyEgaXMgdXNlZC4gVGhlIHB1cnBvc2Ugb2Ygc3VjaCBhIHNlcXVlbmNlIGlzIHRvIGhlbHAgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdwoqCUFuIGV4YW1wbGUgaXM6CS8vIXJjID0gSENGX1NVQ0NFU1M7CioJaWYgdGhpcyBpcyBzdXBlcmZsdW91cyBiZWNhdXNlIHJjIGlzIGFscmVhZHkgZ3VhcmFudGVlZCB0byBiZSAwIGJ1dCBpdCBzaG93cyB0byB0aGUgKG1haW50ZW5hbmNlKQoqCXByb2dyYW1tZXIgaXQgaXMgYW4gaW50ZW50aW9uYWwgb21pc3Npb24gYXQgdGhlIHBsYWNlIHdoZXJlIHNvbWVvbmUgY291bGQgY29uc2lkZXIgaXQgbW9zdCBhcHByb3ByaWF0ZSBhdAoqCWZpcnN0IGdsYW5jZQoqIC0JdXNpbmcgbmVhciBwb2ludGVycyBpbiBhIG1vZGVsIHdoZXJlIHNzIT1kcyBpcyBhbiBpbnZpdGF0aW9uIGZvciBkaXNhc3Rlciwgc28gYmUgYXdhcmUgb2YgaG93IHlvdSBzcGVjaWZ5CioJeW91ciBtb2RlbCBhbmQgaG93IHlvdSBkZWZpbmUgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIGF0IGludGVycnVwdCB0aW1lCiogLQlyZW1lbWJlciB0aGF0IHNpZ24gZXh0ZW5zaW9uIG9uIDMyIGJpdCBwbGF0Zm9ybXMgbWF5IGNhdXNlIHByb2JsZW1zIHVubGVzcyBjb2RlIGlzIGNhcmVmdWxseSBjb25zdHJ1Y3RlZCwKKgllLmcuIHVzZSAiKGhjZl8xNil+Zm9vIiByYXRoZXIgdGhhbiAifmZvbyIKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiaGNmLmgiCQkJCS8vIEhDRiBhbmQgTVNGIGNvbW1vbiBpbmNsdWRlIGZpbGUKI2luY2x1ZGUgImhjZmRlZi5oIgkJCQkvLyBIQ0Ygc3BlY2lmaWMgaW5jbHVkZSBmaWxlCiNpbmNsdWRlICJtbWQuaCIJCQkJLy8gTW9yZU1vZHVsYXJEcml2ZXIgY29tbW9uIGluY2x1ZGUgZmlsZQoKI2lmICEgZGVmaW5lZCBvZmZzZXRvZgojZGVmaW5lIG9mZnNldG9mKHMsbSkgICAoKHVuc2lnbmVkIGludCkmKCgocyAqKTApLT5tKSkKI2VuZGlmIC8vIG9mZnNldG9mCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBQUk9UT1RZUEVTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQJCQljbWRfZXhlKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWRfY29kZSwgaGNmXzE2IHBhcl8wICk7CkhDRl9TVEFUSUMgaW50CQkJaW5pdCggSUZCUCBpZmJwICk7CkhDRl9TVEFUSUMgaW50CQkJcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICk7CiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCkhDRl9TVEFUSUMgaW50CQkJcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApOwojZW5kaWYgLy8gSENGX0VYVF9NQgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQpIQ0ZfU1RBVElDIHZvaWQJCQljYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgTSApOwp2b2lkIAkJCQkJY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICk7CnZvaWQgCQkJCQljYWxjX21pY190eF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKTsKSENGX1NUQVRJQyBpbnQJCQljaGVja19taWMoIElGQlAgaWZicCApOwojZW5kaWYgLy8gSENGX1RZUEVfV1BBCgpIQ0ZfU1RBVElDIHZvaWQJCQljYWxpYnJhdGUoIElGQlAgaWZicCApOwpIQ0ZfU1RBVElDIGludAkJCWNtZF9jbXBsKCBJRkJQIGlmYnAgKTsKSENGX1NUQVRJQyBoY2ZfMTYJCWdldF9maWQoIElGQlAgaWZicCApOwpIQ0ZfU1RBVElDIHZvaWQJCQlpc3JfaW5mbyggSUZCUCBpZmJwICk7CiNpZiBIQ0ZfRE1BCkhDRl9TVEFUSUMgREVTQ19TVFJDVCoJZ2V0X2ZyYW1lX2xzdChJRkJQIGlmYnAsIGludCB0eF9yeF9mbGFnKTsKI2VuZGlmIC8vIEhDRl9ETUEKSENGX1NUQVRJQyB2b2lkCQkJZ2V0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICk7CS8vY2hhciosIGJ5dGUgY291bnQgKHVzdWFsbHkgZXZlbikKI2lmIEhDRl9ETUEKSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaW50IHR4X3J4X2ZsYWcgKTsKI2VuZGlmIC8vIEhDRl9ETUEKSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICk7CkhDRl9TVEFUSUMgdm9pZAkJCXB1dF9mcmFnX2ZpbmFsaXplKCBJRkJQIGlmYnAgKTsKSENGX1NUQVRJQyBpbnQJCQlzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKTsKI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCnN0YXRpYyBpbnQgZndfcHJpbnRmKElGQlAgaWZicCwgQ0ZHX0ZXX1BSSU5URl9TVFJDVCBGQVIgKmx0dnApOwojZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKCkhDRl9TVEFUSUMgaW50CQkJZG93bmxvYWQoIElGQlAgaWZicCwgQ0ZHX1BST0dfU1RSQ1QgRkFSICpsdHZwICk7CiNpZiAoSENGX0VOQ0FQKSAmIEhDRl9FTkMKSENGX1NUQVRJQyBoY2ZfOAkJaGNmX2VuY2FwKCB3Y2lfYnVmcCB0eXBlICk7CiNlbmRpZiAvLyBIQ0ZfRU5DQVAKSENGX1NUQVRJQyBoY2ZfOAkJbnVsbF9hZGRyWzRdID0geyAwLCAwLCAwLCAwIH07CiNpZiAhIGRlZmluZWQgSU5fUE9SVF9XT1JECQkJLy9yZXBsYWNlIEkvTyBNYWNyb3Mgd2l0aCBsb2dnaW5nIGZhY2lsaXR5CmV4dGVybiBGSUxFICpsb2dfZmlsZTsKCiNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJaW5fcG9ydF93b3JkKCAoaGNmX2lvKShwb3J0KSApCgpzdGF0aWMgaGNmXzE2IGluX3BvcnRfd29yZCggaGNmX2lvIHBvcnQgKSB7CmhjZl8xNiBpID0gKGhjZl8xNilfaW5wdyggcG9ydCApOwoJaWYgKCBsb2dfZmlsZSApIHsKCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuUiAlMi4yeCAlNC40eCIsIChwb3J0KSYweEZGLCBpKTsKCX0KCXJldHVybiBpOwp9IC8vIGluX3BvcnRfd29yZAoKI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQlvdXRfcG9ydF93b3JkKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkKCnN0YXRpYyB2b2lkIG91dF9wb3J0X3dvcmQoIGhjZl9pbyBwb3J0LCBoY2ZfMTYgdmFsdWUgKSB7Cglfb3V0cHcoIHBvcnQsIHZhbHVlICk7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG5XICUyLjAyeCAlNC4wNHgiLCAocG9ydCkmMHhGRiwgdmFsdWUgKTsKCX0KfQoKdm9pZCBJTl9QT1JUX1NUUklOR18zMiggaGNmX2lvIHBydCwgaGNmXzMyIEZBUiAqIGRzdCwgaW50IG4pCXsKCWludCBpID0gMDsKCWhjZl8xNiBGQVIgKiBwOwoJaWYgKCBsb2dfZmlsZSApIHsKCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxucmVhZCBzdHJpbmdfMzIgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IHRvIGFkZHIgJWxwIiwKCQkJCSAoaGNmXzE2KW4sIChoY2ZfMTYpbiwgKGhjZl8xNikocHJ0KSYweEZGLCBkc3QpOwoJfQoJd2hpbGUgKCBuLS0gKSB7CgkJcCA9IChoY2ZfMTYgRkFSICopZHN0OwoJCSpwKysgPSAoaGNmXzE2KV9pbnB3KCBwcnQgKTsKCQkqcCAgID0gKGhjZl8xNilfaW5wdyggcHJ0ICk7CgkJaWYgKCBsb2dfZmlsZSApIHsKCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlcyUwOGx4ICIsIGkrKyAlIDB4MDggPyAiICIgOiAiXG4iLCAqZHN0KTsKCQl9CgkJZHN0Kys7Cgl9Cn0gLy8gSU5fUE9SVF9TVFJJTkdfMzIKCnZvaWQgSU5fUE9SVF9TVFJJTkdfOF8xNiggaGNmX2lvIHBydCwgaGNmXzggRkFSICogZHN0LCBpbnQgbikgewkvL2Fsc28gaGFuZGxlcyBieXRlIGFsaWdubWVudCBwcm9ibGVtcwoJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKWRzdDsJCQkJCQkJLy90aGlzIG5lZWRzIG1vcmUgZWxhYm9yYXRlIGNvZGUgaW4gbm9uLXg4NiBwbGF0Zm9ybXMKCWludCBpID0gMDsKCWlmICggbG9nX2ZpbGUgKSB7CgkJZnByaW50ZiggbG9nX2ZpbGUsICJcbnJlYWQgc3RyaW5nXzE2IGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCB0byBhZGRyICVscCIsCgkJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRiwgZHN0ICk7Cgl9Cgl3aGlsZSAoIG4tLSApIHsKCQkqcCA9KGhjZl8xNilfaW5wdyggcHJ0KTsKCQlpZiAoIGxvZ19maWxlICkgewoJCQlpZiAoIGkrKyAlIDB4MTAgKSB7CgkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiUwNHggIiwgKnApOwoJCQl9IGVsc2UgewoJCQkJZnByaW50ZiggbG9nX2ZpbGUsICJcbiUwNHggIiwgKnApOwoJCQl9CgkJfQoJCXArKzsKCX0KfSAvLyBJTl9QT1JUX1NUUklOR184XzE2Cgp2b2lkIE9VVF9QT1JUX1NUUklOR18zMiggaGNmX2lvIHBydCwgaGNmXzMyIEZBUiAqIHNyYywgaW50IG4pCXsKCWludCBpID0gMDsKCWhjZl8xNiBGQVIgKiBwOwoJaWYgKCBsb2dfZmlsZSApIHsKCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxud3JpdGUgc3RyaW5nXzMyIGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCIsCgkJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRik7Cgl9Cgl3aGlsZSAoIG4tLSApIHsKCQlwID0gKGhjZl8xNiBGQVIgKilzcmM7CgkJX291dHB3KCBwcnQsICpwKysgKTsKCQlfb3V0cHcoIHBydCwgKnAgICApOwoJCWlmICggbG9nX2ZpbGUgKSB7CgkJCWZwcmludGYoIGxvZ19maWxlLCAiJXMlMDhseCAiLCBpKysgJSAweDA4ID8gIiAiIDogIlxuIiwgKnNyYyk7CgkJfQoJCXNyYysrOwoJfQp9IC8vIE9VVF9QT1JUX1NUUklOR18zMgoKdm9pZCBPVVRfUE9SVF9TVFJJTkdfOF8xNiggaGNmX2lvIHBydCwgaGNmXzggRkFSICogc3JjLCBpbnQgbikJewkvL2Fsc28gaGFuZGxlcyBieXRlIGFsaWdubWVudCBwcm9ibGVtcwoJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKXNyYzsJCQkJCQkJCS8vdGhpcyBuZWVkcyBtb3JlIGVsYWJvcmF0ZSBjb2RlIGluIG5vbi14ODYgcGxhdGZvcm1zCglpbnQgaSA9IDA7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG53cml0ZSBzdHJpbmdfMTYgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTA0eCIsIG4sIG4sIChoY2ZfMTYpcHJ0KTsKCX0KCXdoaWxlICggbi0tICkgewoJCSh2b2lkKV9vdXRwdyggcHJ0LCAqcCk7CgkJaWYgKCBsb2dfZmlsZSApIHsKCQkJaWYgKCBpKysgJSAweDEwICkgewoJCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlMDR4ICIsICpwKTsKCQkJfSBlbHNlIHsKCQkJCWZwcmludGYoIGxvZ19maWxlLCAiXG4lMDR4ICIsICpwKTsKCQkJfQoJCX0KCQlwKys7Cgl9Cn0gLy8gT1VUX1BPUlRfU1RSSU5HXzhfMTYKCiNlbmRpZiAvLyBJTl9QT1JUX1dPUkQKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEIEEgVCBBICAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWYgSENGX0FTU0VSVApJRkJQIEJBU0VEIGFzc2VydF9pZmJwID0gTlVMTDsJCQkvL3RvIG1ha2UgYXNzZXJ0cyBlYXNpbHkgd29yayB1bmRlciBNTUQgYW5kIERIRgojZW5kaWYgLy8gSENGX0FTU0VSVAoKI2lmIEhDRl9FTkNBUAovKiBTTkFQIGhlYWRlciB0byBiZSBpbnNlcnRlZCBpbiBFdGhlcm5ldC1JSSBmcmFtZXMgKi8KSENGX1NUQVRJQyAgaGNmXzggQkFTRUQgc25hcF9oZWFkZXJbXSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwJLy81IGJ5dGVzIHNpZ25hdHVyZSArCgkJCQkJCQkJCQkgIDAgfTsJCQkJCQkJLy8xIGJ5dGUgcHJvdG9jb2wgaWRlbnRpZmllcgojZW5kaWYgLy8gSENGX0VOQ0FQCgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQpIQ0ZfU1RBVElDIGhjZl84IEJBU0VEIG1pY19wYWRbOF0gPSB7IDB4NUEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsJCS8vTUlDIHBhZGRpbmcgb2YgbWVzc2FnZQojZW5kaWYgLy8gSENGX1RZUEVfV1BBCgojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECkNGR19JREVOVElUWV9TVFJDVCBCQVNFRCBjZmdfZHJ2X2lkZW50aXR5ID0gewoJc2l6ZW9mKGNmZ19kcnZfaWRlbnRpdHkpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECglDRkdfRFJWX0lERU5USVRZLAkJCS8vICgweDA4MjYpCglNU0ZfQ09NUE9ORU5UX0lELAoJTVNGX0NPTVBPTkVOVF9WQVIsCglNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUiwKCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCn0gOwoKQ0ZHX1JBTkdFU19TVFJDVCBCQVNFRCBjZmdfZHJ2X3N1cF9yYW5nZSA9IHsKCXNpemVvZihjZmdfZHJ2X3N1cF9yYW5nZSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfU1VQX1JBTkdFLAkJCS8vICgweDA4MjcpCgoJQ09NUF9ST0xFX1NVUEwsCglDT01QX0lEX0RVSSwKCXt7CURVSV9DT01QQVRfVkFSLAoJCURVSV9DT01QQVRfQk9ULAoJCURVSV9DT01QQVRfVE9QCgl9fQp9IDsKCnN0cnVjdCBDRkdfUkFOR0UzX1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19wcmkgPSB7CglzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfQUNUX1JBTkdFU19QUkksCQkvLyAoMHgwODI4KQoKCUNPTVBfUk9MRV9BQ1QsCglDT01QX0lEX1BSSSwKCXsKCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9QUklfVkFSXzEgbm90IHN1cHBvcnRlZCBieSBIQ0YgNwoJIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX1BSSV9WQVJfMiBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CgkgewkzLAkJCQkJCQkJCS8vdmFyX3JlY1syXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9Cgl9Cn0gOwoKCnN0cnVjdCBDRkdfUkFOR0U0X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19zdGEgPSB7CglzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfQUNUX1JBTkdFU19TVEEsCQkvLyAoMHgwODI5KQoKCUNPTVBfUk9MRV9BQ1QsCglDT01QX0lEX1NUQSwKCXsKI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfMQoJIHsJMSwJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMV9CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzFfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzEKI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfMgoJIHsJMiwJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzIKLy8gRm9yIE5hdGl2ZV9VU0IgKE5vdCB1c2VkISkKI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfMwoJIHsJMywJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfM19CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzNfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzMKLy8gV2FycAojaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl80Cgkgewk0LAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfQojZWxzZQoJIHsgMCwgMCwgMCB9CiNlbmRpZiAvLyBIQ0ZfU1RBX1ZBUl80Cgl9Cn0gOwoKCnN0cnVjdCBDRkdfUkFOR0U2X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19oc2kgPSB7CglzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfQUNUX1JBTkdFU19IU0ksCQkvLyAoMHgwODJBKQoJQ09NUF9ST0xFX0FDVCwKCUNPTVBfSURfSFNJLAoJewojaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl8wCQkJCQkvLyBDb250cm9sbGVkIGRlcGxveW1lbnQKCSB7CTAsCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV8wX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV8wX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9IU0lfVkFSXzAKCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9IU0lfVkFSXzEgbm90IHN1cHBvcnRlZCBieSBIQ0YgNwoJIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX0hTSV9WQVJfMiBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CgkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfSFNJX1ZBUl8zIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKI2lmIGRlZmluZWQgSENGX0hTSV9WQVJfNAkJCQkJLy8gSGVybWVzLUlJIGFsbCB0eXBlcwoJIHsJNCwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0hTSV9WQVJfNAojaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl81CQkJCQkvLyBXQVJQIEhlcm1lcy0yLjUKCSB7CTUsCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfQojZWxzZQoJIHsgMCwgMCwgMCB9CiNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl81Cgl9Cn0gOwoKCkNGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRiwJCS8vICgweDA4MkIpCgoJQ09NUF9ST0xFX0FDVCwKCUNPTVBfSURfQVBGLAoJewojaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8xCQkJCS8vKEZha2UpIEhlcm1lcy1JCgkgewkxLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzEKI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfMgkJCQkvL0hlcm1lcy1JSQoJIHsJMiwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0FQRl9WQVJfMgojaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8zCQkJCQkJLy8gTmF0aXZlX1VTQgoJIHsJMywJCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CSEhISEhc2VlIG5vdGUgYmVsb3chISEhISEhCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzMKI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfNAkJCQkJCS8vIFdBUlAgSGVybWVzIDIuNQoJIHsJNCwJCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CSEhISEhc2VlIG5vdGUgYmVsb3chISEhISEhCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfQojZWxzZQoJIHsgMCwgMCwgMCB9CiNlbmRpZiAvLyBIQ0ZfQVBGX1ZBUl80Cgl9Cn0gOwojZGVmaW5lIEhDRl9WRVJTSU9OICBURVhUKCAiSENGJFJldmlzaW9uOiAxLjEwICQiICkKCnN0YXRpYyBzdHJ1Y3QgLypDRkdfSENGX09QVF9TVFJDVCovIHsKCWhjZl8xNglsZW47CQkJCQkvL2xlbmd0aCBvZiBjZmdfaGNmX29wdCBzdHJ1Y3QKCWhjZl8xNgl0eXA7CQkJCQkvL3R5cGUgMHgwODJDCgloY2ZfMTYJIHYwOwkJCQkJCS8vb2Zmc2V0IEhDRl9WRVJTSU9OCgloY2ZfMTYJIHYxOwkJCQkJCS8vIE1TRl9DT01QT05FTlRfSUQKCWhjZl8xNgkgdjI7CQkJCQkJLy8gSENGX0FMSUdOCgloY2ZfMTYJIHYzOwkJCQkJCS8vIEhDRl9BU1NFUlQKCWhjZl8xNgkgdjQ7CQkJCQkJLy8gSENGX0JJR19FTkRJQU4KCWhjZl8xNgkgdjU7CQkJCQkJLy8gLyogSENGX0RMViB8IEhDRl9ETE5WICovCgloY2ZfMTYJIHY2OwkJCQkJCS8vIEhDRl9ETUEKCWhjZl8xNgkgdjc7CQkJCQkJLy8gSENGX0VOQ0FQCgloY2ZfMTYJIHY4OwkJCQkJCS8vIEhDRl9FWFQKCWhjZl8xNgkgdjk7CQkJCQkJLy8gSENGX0lOVF9PTgoJaGNmXzE2CXYxMDsJCQkJCQkvLyBIQ0ZfSU8KCWhjZl8xNgl2MTE7CQkJCQkJLy8gSENGX0xFR0FDWQoJaGNmXzE2CXYxMjsJCQkJCQkvLyBIQ0ZfTUFYX0xUVgoJaGNmXzE2CXYxMzsJCQkJCQkvLyBIQ0ZfUFJPVF9USU1FCgloY2ZfMTYJdjE0OwkJCQkJCS8vIEhDRl9TTEVFUAoJaGNmXzE2CXYxNTsJCQkJCQkvLyBIQ0ZfVEFMTElFUwoJaGNmXzE2CXYxNjsJCQkJCQkvLyBIQ0ZfVFlQRQoJaGNmXzE2CXYxNzsJCQkJCQkvLyBIQ0ZfTklDX1RBTF9DTlQKCWhjZl8xNgl2MTg7CQkJCQkJLy8gSENGX0hDRl9UQUxfQ05UCgloY2ZfMTYJdjE5OwkJCQkJCS8vIG9mZnNldCB0YWxsaWVzCglUQ0hBUgl2YWxbc2l6ZW9mKEhDRl9WRVJTSU9OKV07Cn0gQkFTRUQgY2ZnX2hjZl9vcHQgPSB7CglzaXplb2YoY2ZnX2hjZl9vcHQpL3NpemVvZihoY2ZfMTYpIC0xLAoJQ0ZHX0hDRl9PUFQsCQkJCS8vICgweDA4MkMpCgkoIHNpemVvZihjZmdfaGNmX29wdCkgLSBzaXplb2YoSENGX1ZFUlNJT04pIC0gNCApL3NpemVvZihoY2ZfMTYpLAojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECglNU0ZfQ09NUE9ORU5UX0lELAojZWxzZQoJMCwKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKCUhDRl9BTElHTiwKCUhDRl9BU1NFUlQsCglIQ0ZfQklHX0VORElBTiwKCTAsCQkJCQkJCQkJLy8gLyogSENGX0RMViB8IEhDRl9ETE5WKi8sCglIQ0ZfRE1BLAoJSENGX0VOQ0FQLAoJSENGX0VYVCwKCUhDRl9JTlRfT04sCglIQ0ZfSU8sCglIQ0ZfTEVHQUNZLAoJSENGX01BWF9MVFYsCglIQ0ZfUFJPVF9USU1FLAoJSENGX1NMRUVQLAoJSENGX1RBTExJRVMsCglIQ0ZfVFlQRSwKI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCglIQ0ZfTklDX1RBTF9DTlQsCglIQ0ZfSENGX1RBTF9DTlQsCglvZmZzZXRvZihJRkJfU1RSQ1QsIElGQl9UYWxseUxlbiApLAojZWxzZQoJMCwgMCwgMCwKI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQyAvIEhDRl9UQUxMSUVTX0hDRgoJSENGX1ZFUlNJT04KfTsgLy8gY2ZnX2hjZl9vcHQKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKCiNpZiBkZWZpbmVkIEhDRl9UQUxMSUVTX0VYVFJBCglyZXBsYWNlZCBieSBIQ0ZfRVhUX1RBTExJRVNfRlcgOwojZW5kaWYgLy8gSENGX1RBTExJRVNfRVhUUkEKCiNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgfHwgKEhDRl9FWFQpICYgSENGX0VYVF9NQgojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgpIQ0ZfU1RBVElDIExUVl9TVFJDVCBCQVNFRCBjZmdfbnVsbCA9IHsgMSwgQ0ZHX05VTEwsIHswfSB9OwojZW5kaWYgLy8gSENGX0VYVF9NQgpIQ0ZfU1RBVElDIGhjZl8xNiogQkFTRUQgeHh4eFsgXSA9IHsKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKCSZjZmdfbnVsbC5sZW4sCQkJCQkJCS8vQ0ZHX05VTEwJCQkJCQkweDA4MjAKI2VuZGlmIC8vIEhDRl9FWFRfTUIKI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAoJJmNmZ19kcnZfaWRlbnRpdHkubGVuLAkJCQkJLy9DRkdfRFJWX0lERU5USVRZICAgICAgICAgICAgICAweDA4MjYKCSZjZmdfZHJ2X3N1cF9yYW5nZS5sZW4sCQkJCQkvL0NGR19EUlZfU1VQX1JBTkdFICAgICAgICAgICAgIDB4MDgyNwoJJmNmZ19kcnZfYWN0X3Jhbmdlc19wcmkubGVuLAkJCS8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSAgICAgICAgMHgwODI4CgkmY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YS5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfU1RBCQkweDA4MjkKCSZjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpLmxlbiwJCQkvL0NGR19EUlZfQUNUX1JBTkdFU19IU0kJCTB4MDgyQQoJJmNmZ19kcnZfYWN0X3Jhbmdlc19hcGYubGVuLAkJCS8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRgkJMHgwODJCCgkmY2ZnX2hjZl9vcHQubGVuLAkJCQkJCS8vQ0ZHX0hDRl9PUFQJCQkJCTB4MDgyQwoJTlVMTCwJCQkJCQkJCQkvL0lGQl9QUklJZGVudGl0eSBwbGFjZWhvbGRlcgkweEZEMDIKCU5VTEwsCQkJCQkJCQkJLy9JRkJfUFJJU3VwIHBsYWNlaG9sZGVyCQkweEZEMDMKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKCU5VTEwJCQkJCQkJCQkvL2VuZHNlbnRpbmVsCiAgfTsKI2RlZmluZSB4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQJKHNpemVvZih4eHh4KS9zaXplb2YoeHh4eFswXSkgLSAzKQoKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQgLyBIQ0ZfRVhUX01CCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKiBUIE8gUCAgIEwgRSBWIEUgTCAgIEggQyBGICAgUiBPIFUgVCBJIE4gRSBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX2FjdGlvbiggSUZCUCBpZmJwLCBoY2ZfMTYgYWN0aW9uICkKKi5QVVJQT1NFCQlDaGFuZ2VzIHRoZSBydW4tdGltZSBDYXJkIGJlaGF2aW9yLgoqCQkJCVBlcmZvcm1zIE1pc2NlbGxhbnVvdXMgYWN0aW9ucy4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCQkJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWFjdGlvbgkJCQkJbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIGNoYW5nZQoqCSAtIEhDRl9BQ1RfQ0NYX09GRgkJZGlzYWJsZSBDS0lQCioJIC0gSENGX0FDVF9DQ1hfT04JCWVuYWJsZSBDS0lQCioJIC0gSENGX0FDVF9JTlRfRk9SQ0VfT04JZW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGJ5IFdhdmVMQU4gTklDCioJIC0gSENGX0FDVF9JTlRfT0ZGCQlkaXNhYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGJ5IFdhdmVMQU4gTklDCioJIC0gSENGX0FDVF9JTlRfT04JCWNvbXBlbnNhdGUgMSBIQ0ZfQUNUX0lOVF9PRkYsIGVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpZiBiYWxhbmNlIHJlYWNoZWQKKgkgLSBIQ0ZfQUNUX1BSU19TQ0FOCQlIZXJtZXMgUHJvYmUgUmVzcG9ucyBTY2FuIChGMTAyKSBjb21tYW5kCioJIC0gSENGX0FDVF9SWF9BQ0sJCWFja25vd2xlZGdlIG5vbi1ETUEgcmVjZWl2ZXIgdG8gSGVybWVzCioJIC0gSENGX0FDVF9TQ0FOCQkJSGVybWVzIElucXVpcmUgU2NhbiAoRjEwMSkgY29tbWFuZCAobm9uLVdBUlAgb25seSkKKgkgLSBIQ0ZfQUNUX1NMRUVQCQlERFMgU2xlZXAgcmVxdWVzdAoqCSAtIEhDRl9BQ1RfVEFMTElFUwkJSGVybWVzIElucXVpcmUgVGFsbGllcyAoRjEwMCkgY29tbWFuZAoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCQkJCWFsbCAoaW5jbHVkaW5nIGludmFsaWQpCioJSENGX0lOVF9QRU5ESU5HCQkJSENGX0FDVF9JTlRfT0ZGLCBpbnRlcnJ1cHQgcGVuZGluZwoqCUhDRl9FUlJfTk9fTklDCQkJSENGX0FDVF9JTlRfT0ZGLCBOSUMgcHJlc2VuY2UgY2hlY2sgZmFpbHMKKgoqLkNPTkRJVElPTlMKKiBFeGNlcHQgZm9yIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiBvciBIQ0ZfQUNUX0lOVF9PRkYgYXMgcGFyYW1ldGVyIG9yIGhjZl9jb25uZWN0IHdpdGggYW4gSS9PCiogYWRkcmVzcyAoaS5lLiBub3QgSENGX0RJU0NPTk5FQ1QpLCBhbGwgaGNmLWZ1bmN0aW9uIGNhbGxzIE1VU1QgYmUgcHJlY2VlZGVkIGJ5IGEgY2FsbCBvZiBoY2ZfYWN0aW9uIHdpdGgKKiBIQ0ZfQUNUX0lOVF9PRkYgYXMgcGFyYW1ldGVyLgoqIE5vdGUgdGhhdCBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKKiB3YXMgY2FsbGVkLgoqCiouREVTQ1JJUFRJT04KKiBoY2ZfYWN0aW9uIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbW9kZSBjaGFuZ2luZyBhY3Rpb24tY29kZSBwYWlycyB0aGF0IGFyZSBhbnRvbnltcwoqCSAtIEhDRl9BQ1RfQ0NYX09GRiAvIEhDRl9BQ1RfQ0NYX09OCioJIC0gSENGX0FDVF9JTlRfW0ZPUkNFX11PTiAvIEhDRl9BQ1RfSU5UX09GRgoqCiogQWRkaXRpb25hbGx5IGhjZl9hY3Rpb24gY2FuIHN0YXJ0IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpbiB0aGUgTklDOgoqCSAtIEhDRl9BQ1RfUFJTX1NDQU4KKgkgLSBIQ0ZfQUNUX1JYX0FDSwoqCSAtIEhDRl9BQ1RfU0NBTgoqCSAtIEhDRl9BQ1RfU0xFRVAKKgkgLSBIQ0ZfQUNUX1RBTExJRVMKKgoqIG8gSENGX0FDVF9JTlRfT0ZGOiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRGlzYWJsZWQuCiogVGhpcyBjb21tYW5kLCBhbmQgdGhlIGFzc29jaWF0ZWQgW0ZvcmNlXSBFbmFibGUgTklDIGludGVycnVwdHMgY29tbWFuZCwgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHRoZSBIQ0ZfSU5UX09OCiogY29tcGlsZSB0aW1lIG9wdGlvbiBpcyBub3Qgc2V0IGF0IDB4MDAwMC4KKgoqIG8gSENGX0FDVF9JTlRfT046IFNldHMgTklDIEludGVycnVwdHMgbW9kZSBFbmFibGVkLgoqIEVuYWJsZSBOSUMgSW50ZXJydXB0cywgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIERpc2FibGUgTklDIEludGVycnVwdCBjYWxscy4KKgoqIG8gSENGX0FDVF9JTlRfRk9SQ0VfT046IEZvcmNlIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZC4KKiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZCwgcmVnYXJkbGVzcyBvZmYgdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgRGlzYWJsZSBOSUMgSW50ZXJydXB0IGNhbGxzLgoqCiogVGhlIGRpc2FibGluZyBhbmQgZW5hYmxpbmcgb2YgaW50ZXJydXB0cyBhcmUgYW50b255bXMuCiogVGhlc2UgYWN0aW9ucyBtdXN0IGJlIGJhbGFuY2VkLgoqIEZvciBlYWNoICJkaXNhYmxlIGludGVycnVwdHMiIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZyAiZW5hYmxlIGludGVycnVwdHMiLgoqIFRoZSBkaXNhYmxlIGludGVycnVwdHMgbWF5IGJlIGV4ZWN1dGVkIG11bHRpcGxlIHRpbWVzIGluIGEgcm93IHdpdGhvdXQgaW50ZXJ2ZW5pbmcgZW5hYmxlIGludGVycnVwdHMsIGluCiogb3RoZXIgd29yZHMsIHRoZSBkaXNhYmxlIGludGVycnVwdHMgbWF5IGJlIG5lc3RlZC4KKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIGRpc2FibGVkIGF0IHRoZSBmaXJzdCBjYWxsIHdpdGggSENGX0FDVF9JTlRfT0ZGLgoqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaXMgcmUtZW5hYmxlZCB3aGVuIHRoZSBudW1iZXIgb2YgY2FsbHMgd2l0aCBIQ0ZfQUNUX0lOVF9PTiBtYXRjaGVzIHRoZQoqIG51bWJlciBvZiBjYWxscyB3aXRoIElOVF9PRkYuCioKKiBJdCBpcyBub3QgYWxsb3dlZCB0byBoYXZlIG1vcmUgRW5hYmxlIE5JQyBJbnRlcnJ1cHRzIGNhbGxzIHRoYW4gRGlzYWJsZSBOSUMgSW50ZXJydXB0cyBjYWxscy4KKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIGluaXRpYWxseSAoaS5lLiBhZnRlciBoY2ZfY29ubmVjdCkgZGlzYWJsZWQuCiogQW4gTVNGIGJhc2VkIG9uIGEgaW50ZXJydXB0IHN0cmF0ZWd5IG11c3QgY2FsbCBoY2ZfYWN0aW9uIHdpdGggSU5UX09OIGluIGl0cyBpbml0aWFsaXphdGlvbiBsb2dpYy4KKgoqIQlUaGUgSU5UX09GRi9JTlRfT04gaG91c2VrZWVwaW5nIGlzIGluaXRpYWxpemVkIGF0IDB4MDAwMCBieSBoY2ZfY29ubmVjdCwgY2F1c2luZyB0aGUgaW50ZXJydXB0IGdlbmVyYXRpb24KKgltZWNoYW5pc20gdG8gYmUgZGlzYWJsZWQgYXQgZmlyc3QuIFRoaXMgc3VpdHMgTVNGIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgcG9sbGluZyBzdHJhdGVneS4KKgoqIG8gSENGX0FDVF9DQ1hfT0ZGIC8gSENGX0FDVF9DQ1hfT04KKiEhIFRoaXMgY2FuIHVzZSBzb21lIG1vcmUgZXhwbGFuYXRpb247PwoqIERpc2FibGVzIGFuZCBFbmFibGVzIHN1cHBvcnQgaW4gdGhlIEhDRiBydW50aW1lIGNvZGUgZm9yIHRoZSBDQ1ggZmVhdHVyZS4gRWFjaCB0aW1lIG9uZSBvZiB0aGVzZSBhY3Rpb24KKiBjb2RlcyBpcyB1c2VkLCB0aGUgZWZmZWN0cyBvZiB0aGUgcHJlY2VkaW5nIHVzZSBjZWFzZS4KKgoqIG8gSENGX0FDVF9TTEVFUDogSW5pdGlhdGVzIHRoZSBEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIHByb2Nlc3MKKiBUaGlzIGNvbW1hbmQgaXMgb25seSBhdmFpbGFibGUgaWYgdGhlIEhDRl9ERFMgY29tcGlsZSB0aW1lIG9wdGlvbiBpcyBzZXQuIEl0IHRyaWdnZXJzIHRoZSBGL1cgdG8gc3RhcnQgdGhlCiogc2xlZXAgaGFuZHNoYWtpbmcuIFJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgSG9zdCBpbml0aWF0ZXMgYSBEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIChERFMpIG9yIHRoZSBGL1cgaW5pdGlhdGVzCiogYSBDb25uZWN0ZWQgRGVlcFNsZWVwIChDRFMpLCB0aGUgSG9zdC1GL1cgc2xlZXAgaGFuZHNoYWtpbmcgaXMgY29tcGxldGVkIHdoZW4gdGhlIE5JQyBJbnRlcnJ1cHRzIG1vZGUgaXMKKiBlbmFibGVkIChieSBtZWFucyBvZiB0aGUgYmFsYW5jaW5nIEhDRl9BQ1RfSU5UX09OKSwgaS5lLiBhdCB0aGF0IG1vbWVudCB0aGUgRi9XIHJlYWxseSBnb2VzIGludG8gc2xlZXAgbW9kZS4KKiBUaGUgRi9XIGlzIHdva2VudXAgYnkgdGhlIEhDRiB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGFyZSBkaXNhYmxlZCwgaS5lLiBhdCB0aGUgZmlyc3QgSENGX0FDVF9JTlRfT0ZGCiogYWZ0ZXIgZ29pbmcgaW50byBzbGVlcC4KKgoqIFRoZSBmb2xsb3dpbmcgTWlzY2VsbGFudW91cyBhY3Rpb25zIGFyZSBkZWZpbmVkOgoqCiogbyBIQ0ZfQUNUX1JYX0FDSzogUmVjZWl2ZXIgQWNrbm93bGVkZ2VtZW50IChub24tRE1BLCBub24tVVNCIG1vZGUgb25seSkKKiBBY2tpbmcgdGhlIHJlY2VpdmVyLCBmcmVlcyB0aGUgTklDIG1lbW9yeSB1c2VkIHRvIGhvbGQgdGhlIFJ4IGZyYW1lIGFuZCBhbGxvd3MgdGhlIEYvVyB0bwoqIHJlcG9ydCB0aGUgZXhpc3RlbmNlIG9mIHRoZSBuZXh0IFJ4IGZyYW1lLgoqIElmIHRoZSBNU0YgZG9lcyBub3QgbmVlZCBhY2Nlc3MgKGFueSBsb25nZXIpIHRvIHRoZSBjdXJyZW50IGZyYW1lLCBlLmcuIGJlY2F1c2UgaXQgaXMgcmVqZWN0ZWQgYmFzZWQgb24gdGhlCiogbG9vayBhaGVhZCBvciBjb3BpZWQgdG8gYW5vdGhlciBidWZmZXIsIHRoZSByZWNlaXZlciBtYXkgYmUgYWNrZWQuIEFja2luZyBlYXJsaWVyIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUKKiBwb3RlbnRpYWwgb2YgaW1wcm92aW5nIHRoZSBwZXJmb3JtYW5jZS4KKiBJZiB0aGUgTVNGIGRvZXMgbm90IGV4cGxpdGx5IGFjayB0ZSByZWNlaXZlciwgdGhlIGFja2luZyBpcyBkb25lIGltcGxpY2l0bHkgaWY6CiogLSB0aGUgcmVjZWl2ZWQgZnJhbWUgZml0cyBpbiB0aGUgbG9vayBhaGVhZCBidWZmZXIsIGJ5IHRoZSBoY2Zfc2VydmljZV9uaWMgY2FsbCB0aGF0IHJlcG9ydGVkIHRoZSBSeCBmcmFtZQoqIC0gaWYgbm90IGluIHRoZSBhYm92ZSBzdGVwLCBieSBoY2ZfcmN2X21zZyAoYXNzdW1pbmcgaGNmX3Jjdl9tc2cgaXMgY2FsbGVkKQoqIC0gaWYgbmVpdGhlciBvZiB0aGUgYWJvdmUgaW1wbGljaXQgYWNrcyBub3IgYW4gZXhwbGljaXQgYWNrIGJ5IHRoZSBNU0YsIGJ5IHRoZSBmaXJzdCBoY2Zfc2VydmljZV9uaWMgYWZ0ZXIKKgl0aGUgaGNmX3NlcnZpY2VfbmljIHRoYXQgcmVwb3J0ZWQgdGhlIFJ4IGZyYW1lLgoqIE5vdGU6IElmIGFuIFJ4IGZyYW1lIGlzIGFscmVhZHkgYWNrZWQsIGFuIGV4cGxpY2l0IEFDSyBieSB0aGUgTVNGIGFjdHMgYXMgYSBOb09wZXJhdGlvbi4KKgoqIG8gSENGX0FDVF9UQUxMSUVTOiBJbnF1aXJlIFRhbGxpZXMgY29tbWFuZAoqIFRoaXMgY29tbWFuZCBpcyBvbmx5IG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KKiBUaGUgSW5xdWlyZSBUYWxsaWVzIGNvbW1hbmQgcmVxdWVzdHMgdGhlIEYvVyB0byBwcm92aWRlIGl0cyBjdXJyZW50IHNldCBvZiB0YWxsaWVzLgoqIFNlZSBhbHNvIGhjZl9nZXRfaW5mbyB3aXRoIENGR19UQUxMSUVTIGFzIHBhcmFtZXRlci4KKgoqIG8gSENGX0FDVF9QUlNfU0NBTjogSW5xdWlyZSBQcm9iZSBSZXNwb25zIFNjYW4gY29tbWFuZAoqIFRoaXMgY29tbWFuZCBpcyBvbmx5IG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KKiBUaGUgUHJvYmUgUmVzcG9ucyBTY2FuIGNvbW1hbmQgc3RhcnRzIGEgc2NhbiBzZXF1ZW5jZS4KKiBUaGUgSENGIHB1dHMgdGhlIHJlc3VsdCBvZiB0aGlzIGFjdGlvbiBpbiBhbiBNU0YgZGVmaW5lZCBidWZmZXIgKHNlZSBDRkdfUklEX0xPR19TVFJDVCkuCioKKiBvIEhDRl9BQ1RfU0NBTjogSW5xdWlyZSBTY2FuIGNvbW1hbmQKKiBUaGlzIGNvbW1hbmQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEhJSSBGL1cgKGkuZS4gcHJlLVdBUlApIGFuZCBpdCBpcyBvcGVyYXRpb25hbCBpZiB0aGUgRi9XIGlzIGVuYWJsZWQuCiogVGhlIElucXVpcmUgU2NhbiBjb21tYW5kIHN0YXJ0cyBhIHNjYW4gc2VxdWVuY2UuCiogVGhlIEhDRiBwdXRzIHRoZSByZXN1bHQgb2YgdGhpcyBhY3Rpb24gaW4gYW4gTVNGIGRlZmluZWQgYnVmZmVyIChzZWUgQ0ZHX1JJRF9MT0dfU1RSQ1QpLgoqCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiogLSBOSUMgaW50ZXJydXB0cyBhcmUgbm90IGRpc2FibGVkIHdoaWxlIHJlcXVpcmVkIGJ5IHBhcmFtZXRlciBhY3Rpb24uCiogLSBhbiBpbnZhbGlkIGNvZGUgaXMgc3BlY2lmaWVkIGluIHBhcmFtZXRlciBhY3Rpb24uCiogLSBIQ0ZfQUNUX0lOVF9PTiBjb21tYW5kcyBvdXRudW1iZXIgdGhlIEhDRl9BQ1RfSU5UX09GRiBjb21tYW5kcy4KKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24gYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvcgoqCW11bHRpLXRocmVhZGluZwoqCiogLSBTaW5jZSB0aGUgSENGIGRvZXMgbm90IG1haW50YWluIHN0YXR1cyBpbmZvcm1hdGlvbiByZWxhdGl2ZSB0byB0aGUgRi9XIGVuYWJsZWQgc3RhdGUsIGl0IGlzIG5vdCBhc3NlcnRlZAoqCXdoZXRoZXIgSENGX0FDVF9TQ0FOLCBIQ0ZfQUNUX1BSU19TQ0FOIG9yIEhDRl9BQ1RfVEFMTElFUyBhcmUgb25seSB1c2VkIHdoaWxlIEYvVyBpcyBlbmFibGVkLgoqCiouRElBR1JBTQoqIDA6IFRoZSBhc3NlcnQgZW1iZWRkZWQgaW4gSENGTE9HRU5UUlkgY2hlY2tzIGFnYWluc3QgcmUtZW50cmFuY3kuIFJlLWVudHJhbmN5IGNvdWxkIGJlIGNhdXNlZCBieSBhIE1TRiBsb2dpYwoqCWF0IHRhc2stbGV2ZWwgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgc2hpZWxkaW5nIHdpdGggSENGX0FDVF9PTi9fT0ZGLiBIb3dldmVyIHRoZSBIQ0ZfQUNUX0lOVF9PRkYKKglhY3Rpb24gaXRzZWxmIGNhbiBwZXIgZGVmaW5pdGlvbiBub3QgYmUgcHJvdGVjdGVkIHRoaXMgd2F5LiBCYXNlZCBvbiBjb2RlIGluc3BlY3Rpb24sIGl0IGNhbiBiZSBjb25jbHVkZWQsCioJdGhhdCB0aGVyZSBpcyBubyByZS1lbnRyYW5jeSBQUk9CTEVNIGluIHRoaXMgcGFydGljdWxhciBmbG93LiBJdCBkb2VzIG5vdCBzZWVtIHdvcnRoIHRoZSB0cm91YmxlIHRvCioJZXhwbGljaXRseSBjaGVjayBmb3IgdGhpcyBjb25kaXRpb24gKGFsdGhvdWdoIHRoZXJlIHdhcyBhIHJlcG9ydCBvZiBhbiBNU0Ygd2hpY2ggcmFuIGludG8gdGhpcyBhc3NlcnQuCiogMjpJRkJfSW50T2ZmQ250IGlzIHVzZWQgdG8gYmFsYW5jZSB0aGUgSU5UX09GRiBhbmQgSU5UX09OIGNhbGxzLiAgRGlzYWJsaW5nIG9mIHRoZSBpbnRlcnJ1cHRzIGlzIGFjaGlldmVkIGJ5CioJd3JpdGluZyBhIHplcm8gdG8gdGhlIEhlcm1lcyBJbnRFbiByZWdpc3Rlci4gIEluIGEgc2hhcmVkIGludGVycnVwdCBlbnZpcm9ubWVudCAoZS5nLiB0aGUgbWluaS1QQ0kgTkRJUwoqCWRyaXZlcikgaXQgaXMgY29uc2lkZXJlZCBtb3JlIGNvcnJlY3QgdG8gcmV0dXJuIHRoZSBzdGF0dXMgSENGX0lOVF9QRU5ESU5HIGlmIGFuZCBvbmx5IGlmLCB0aGUgY3VycmVudAoqCWludm9jYXRpb24gb2YgaGNmX3NlcnZpY2VfbmljIGlzIChhcHBhcmVudGx5KSBjYWxsZWQgaW4gdGhlIElTUiB3aGVuIHRoZSBJU1Igd2FzIGFjdGl2YXRlZCBhcyByZXN1bHQgb2YgYQoqCWNoYW5nZSBpbiBIUkVHX0VWX1NUQVQgbWF0Y2hpbmcgYSBiaXQgaW4gSFJFR19JTlRfRU4sIGkuZS4gbm90IGlmIGludm9rZWQgYXMgcmVzdWx0IG9mIGFub3RoZXIgZGV2aWNlCioJZ2VuZXJhdGluZyBhbiBpbnRlcnJ1cHQgb24gdGhlIHNoYXJlZCBpbnRlcnJ1cHQgbGluZS4KKglOb3RlIDE6IGl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgdW5kZXIgY2VydGFpbiBhZHZlcnNlIGNvbmRpdGlvbnMgb24gY2VydGFpbiBwbGF0Zm9ybXMgdGhlIHdyaXRpbmcgb2YKKglIUkVHX0lOVF9FTiBjYW4gYXBwYXJlbnRseSBmYWlsLCB0aGVyZWZvciBpdCBpcyBwYXJhbW91bnQgdGhhdCBIUkVHX0lOVF9FTiBpcyB3cml0dGVuIGFnYWluIHdpdGggMCBmb3IKKgllYWNoIGFuZCBldmVyeSBjYWxsIHRvIEhDRl9BQ1RfSU5UX09GRi4KKglOb3RlIDI6IGl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgdW5kZXIgY2VydGFpbiBIL1cgJiBTL1cgYXJjaGl0ZWN0dXJlcyB0aGlzIGxvZ2ljIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzCioJbm8gTklDIGF0IGFsbC4gVG8gY2F0ZXIgZm9yIHRoaXMsIHRoZSB2YWx1ZSBvZiBIUkVHX0lOVF9FTiBpcyB2YWxpZGF0ZWQuIElmIHRoZSB1bnVzZWQgYml0IDB4MDEwMCBpcyBzZXQsCioJaXQgaXMgYXNzdW1lZCB0aGVyZSBpcyBubyBOSUMuCioJTm90ZSAzOiBEdXJpbmcgdGhlIGRvd25sb2FkIHByb2Nlc3MsIHNvbWUgdmVyc2lvbnMgb2YgdGhlIEYvVyByZXNldCBIUkVHX1NXXzAsIGhlbmNlIGNoZWNraW5nIHRoaXMKKglyZWdpc3RlciBmb3IgSENGX01BR0lDICh0aGUgY2xhc3NpY2FsIE5JQyBwcmVzZW5jZSB0ZXN0KSB3aGVuIEhDRl9BQ1RfSU5UX09GRiBpcyBjYWxsZWQgZHVlIHRvIGFub3RoZXIKKgljYXJkIGludGVycnVwdGluZyB2aWEgYSBzaGFyZWQgSVJRIGR1cmluZyBhIGRvd25sb2FkLCBmYWlscy4KKjQ6CVRoZSBjb25zdHJ1Y3Rpb24gImlmICggaWZicC0+SUZCX0ludE9mZkNudC0tID09IDAgKSIgaXMgb3B0aW1hbCAoaW4gdGhlIHNlbnNlIG9mIHNob3J0ZXN0L3F1aWNrZXN0CioJcGF0aCBpbiBlcnJvciBmcmVlIGZsb3dzKSBidXQgTk9UIGZhaWwgc2FmZSBpbiBjYXNlIG9mIHRvbyBtYW55IElOVF9PTiBpbnZvY2F0aW9ucyBjb21wYXJlZCB0byBJTlRfT0ZGKS4KKglFbmFibGluZyBvZiB0aGUgaW50ZXJydXB0cyBpcyBhY2hpZXZlZCBieSB3cml0aW5nIHRoZSBIZXJtZXMgSW50RW4gcmVnaXN0ZXIuCioJIC0gSWYgdGhlIEhDRiBpcyBpbiBEZWZ1bmN0IG1vZGUsIHRoZSBpbnRlcnJ1cHRzIHN0YXkgZGlzYWJsZWQuCioJIC0gVW5kZXIgIm5vcm1hbCIgY29uZGl0aW9ucywgdGhlIEhDRiBpcyBvbmx5IGludGVyZXN0ZWQgaW4gSW5mbyBFdmVudHMsIFJ4IEV2ZW50cyBhbmQgTm90aWZ5IEV2ZW50cy4KKgkgLSBXaGVuIHRoZSBIQ0YgaXMgb3V0IG9mIFR4L05vdGlmeSByZXNvdXJjZXMsIHRoZSBIQ0YgaXMgYWxzbyBpbnRlcmVzdGVkIGluIEFsbG9jIEV2ZW50cy4KKgkgLSB2aWEgSENGX0VYVCwgdGhlIE1TRiBwcm9ncmFtbWVyIGNhbiBhbHNvIHJlcXVlc3QgSFJFR19FVl9USUNLIGFuZC9vciBIUkVHX0VWX1RYX0VYQyBpbnRlcnJ1cHRzLgoqCUZvciBETUEgb3BlcmF0aW9uLCB0aGUgRE1BIGhhcmR3YXJlIGhhbmRsZXMgdGhlIGFsbG9jIGV2ZW50cy4gVGhlIERNQSBlbmdpbmUgd2lsbCBnZW5lcmF0ZSBhICdUeERtYURvbmUnCioJZXZlbnQgYXMgc29vbiBhcyBpdCBoYXMgcHVtcGVkIGEgZnJhbWUgZnJvbSBob3N0IHJhbSBpbnRvIE5JQy1SQU0gKG5vdGUgdGhhdCB0aGUgZnJhbWUgZG9lcyBub3QgaGF2ZSB0byBiZQoqCXRyYW5zbWl0dGVkIHRoZW4pLCBhbmQgYSAnUnhEbWFEb25lJyBldmVudCBhcyBzb29uIGFzIGEgcmVjZWl2ZWQgZnJhbWUgaGFzIGJlZW4gcHVtcGVkIGZyb20gTklDLVJBTSBpbnRvCioJaG9zdCByYW0uICBOb3RlIHRoYXQgdGhlICdhbGxvYycgZXZlbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBldmVudC1tYXNrLCBiZWNhdXNlIHRoZSBETUEgZW5naW5lIHdpbGwKKglyZWFjdCB0byBhbmQgYWNrbm93bGVkZ2UgdGhpcyBldmVudC4KKjY6CWFjayB0aGUgIm9sZCIgUngtZXZlbnQuIFNlZSAiUnggQnVmZmVyIGZyZWUgc3RyYXRlZ3kiIGluIGhjZl9zZXJ2aWNlX25pYyBhYm92ZSBmb3IgbW9yZSBleHBsYW5hdGlvbi4KKglJRkJfUnhGSUQgYW5kIElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgdG8gYnJpbmcgYm90aCB0aGUgaW50ZXJuYWwgSENGIGhvdXNlIGtlZXBpbmcgYW5kIHRoZSBpbmZvcm1hdGlvbgoqCXN1cHBsaWVkIHRvIHRoZSBNU0YgaW4gdGhlIHN0YXRlICJubyBmcmFtZSByZWNlaXZlZCIuCio4OglUaGUgSENGX0FDVF9TQ0FOLCBIQ0ZfQUNUX1BSU19TQ0FOIGFuZCBIQ0ZfQUNUX1RBTExJRVMgYWN0aXZpdHkgYXJlIG1lcmdlZCBieSAiY2xldmVyIiBhbGdlYnJhaWMKKgltYW5pcHVsYXRpb25zIG9mIHRoZSBSSUQtdmFsdWVzIGFuZCBhY3Rpb24gY29kZXMsIHNvIGZvcmVnb2luZyByb2J1c3RuZXNzIGFnYWluc3QgbWlncmF0aW9uIHByb2JsZW1zIGZvcgoqCWVhc2Ugb2YgaW1wbGVtZW50YXRpb24uIFRoZSBhc3N1bXB0aW9ucyBhYm91dCBudW1lcmljYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIENGR19UQUxMSUVTIGV0YyBhbmQKKglIQ0ZfQUNUX1RBTExJRVMgZXRjIGFyZSBjaGVja2VkIGJ5IHRoZSAiI2lmIiBzdGF0ZW1lbnRzIGp1c3QgcHJpb3IgdG8gdGhlIGJvZHkgb2YgdGhpcyByb3V0aW5lLCByZXN1bHRpbmcKKglpbjogZXJyICJtYWludGVuYW5jZSIgZHVyaW5nIGNvbXBpbGF0aW9uIGlmIHRoZSBhc3N1bXB0aW9ucyBhcmUgbm8gbG9uZ2VyIG1ldC4gVGhlIHdyaXRpbmcgb2YgSFJFR19QQVJBTV8xCioJd2l0aCAweDNGRkYgaW4gY2FzZSBvZiBhbiBQUlMgc2NhbiwgaXMgYSBrbHVkZ2UgdG8gZ2V0IGFyb3VuZCBsYWNrIG9mIHNwZWNpZmljYXRpb24sIGhlbmNlIGRpZmZlcmVudAoqCWltcGxlbWVudGF0aW9uIGluIEYvVyBhbmQgSG9zdC4KKglXaGVuIHRoZXJlIGlzIG5vIE5JQyBSQU0gYXZhaWxhYmxlLCBzb21lIHZlcnNpb25zIG9mIHRoZSBIZXJtZXMgRi9XIGRvIHJlcG9ydCAweDdGMDAgYXMgZXJyb3IgaW4gdGhlCioJUmVzdWx0IGZpZWxkIG9mIHRoZSBTdGF0dXMgcmVnaXN0ZXIgYW5kIHNvbWUgRi9XIHZlcnNpb25zIGRvbid0LiBUbyBtYXNrIHRoaXMgZGlmZmVyZW5jZSB0byB0aGUgTVNGIGFsbAoqCXJldHVybiBjb2RlcyBvZiB0aGUgSGVybWVzIGFyZSBpZ25vcmVkICgiYmVzdCIgYW5kICJtb3N0IHNpbXBsZSIgc29sdXRpb24gdG8gdGhlc2UgdHlwZXMgb2YgYW5hbG9taWVzIHdpdGgKKglhbiBhY2NlcHRhYmxlIGxvc3MgZHVlIHRvIGlnbm9yaW5nIGFsbCBlcnJvciBzaXR1YXRpb25zIGFzIHdlbGwpLgoqCVRoZSAiTm8gaW5xdWlyZSBzcGFjZSIgaXMgcmVwb3J0ZWQgdmlhIHRoZSBIZXJtZXMgdGFsbGllcy4KKjMwOiBkbyBub3QgSENGQVNTRVJUKCByYywgcmMgKSBzaW5jZSByYyA9PSBIQ0ZfSU5UX1BFTkRJTkcgaXMgbm8gZXJyb3IKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCiNpZiBDRkdfU0NBTiAhPSBDRkdfVEFMTElFUyAtIEhDRl9BQ1RfVEFMTElFUyArIEhDRl9BQ1RfU0NBTgplcnI6ICJtYWludGVuYW5jZSIgYXBwYXJlbnRseSBpbnZpb2xhdGVkIHRoZSB1bmRlcmx5aW5nIGFzc3VtcHRpb24gYWJvdXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlc2UgbWFjcm9zCiNlbmRpZgojZW5kaWYgLy8gSENGX1RZUEVfSElJNQojaWYgQ0ZHX1BSU19TQ0FOICE9IENGR19UQUxMSUVTIC0gSENGX0FDVF9UQUxMSUVTICsgSENGX0FDVF9QUlNfU0NBTgplcnI6ICJtYWludGVuYW5jZSIgYXBwYXJlbnRseSBpbnZpb2xhdGVkIHRoZSB1bmRlcmx5aW5nIGFzc3VtcHRpb24gYWJvdXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlc2UgbWFjcm9zCiNlbmRpZgppbnQKaGNmX2FjdGlvbiggSUZCUCBpZmJwLCBoY2ZfMTYgYWN0aW9uICkKewppbnQJcmMgPSBIQ0ZfU1VDQ0VTUzsKCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCiNpZiBIQ0ZfSU5UX09OCglIQ0ZMT0dFTlRSWSggYWN0aW9uID09IEhDRl9BQ1RfSU5UX0ZPUkNFX09OID8gSENGX1RSQUNFX0FDVElPTl9LTFVER0UgOiBIQ0ZfVFJBQ0VfQUNUSU9OLCBhY3Rpb24gKQkJCQkJCQkJCQkJCQkJLyogMCAqLwojaWYgKEhDRl9TTEVFUCkKCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUgfHwgYWN0aW9uID09IEhDRl9BQ1RfSU5UX09GRiwKCQkJICAgTUVSR0VfMiggYWN0aW9uLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkgKQojZWxzZQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSwgYWN0aW9uICkKI2VuZGlmIC8vIEhDRl9TTEVFUAoJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRiB8fAoJCQkgICBhY3Rpb24gPT0gSENGX0FDVF9JTlRfT0ZGIHx8IGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiwgIGFjdGlvbiApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgPD0gMTYgfHwgaWZicC0+SUZCX0ludE9mZkNudCA+PSAweEZGRkUsCgkJCSAgIE1FUkdFXzIoIGFjdGlvbiwgaWZicC0+SUZCX0ludE9mZkNudCApICkJLy9uZXN0aW5nIG1vcmUgdGhhbiAxNiBkZWVwIHNlZW1zIHVucmVhc29uYWJsZQojZW5kaWYgLy8gSENGX0lOVF9PTgoKCXN3aXRjaCAoYWN0aW9uKSB7CiNpZiBIQ0ZfSU5UX09OCmhjZl8xNglpOwoJICBjYXNlIEhDRl9BQ1RfSU5UX09GRjoJCQkJCQkvLyBEaXNhYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCiNpZiBIQ0ZfU0xFRVAKCQlpZiAoIGlmYnAtPklGQl9JbnRPZmZDbnQgPT0gMHhGRkZFICkgewkvLyBXYWtlVXAgdGVzdAk7P3RpZSB0aGlzIHRvIHRoZSAibmV3IiBzdXBlci1MaW5rU3RhdAoJCQlpZmJwLT5JRkJfSW50T2ZmQ250Kys7CQkJCQkJLy8gcmVzdG9yZSBjb252ZW50aW9uYWwgSS9GCgkJCU9QVyhIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOwkJLy8gc2V0IHdha2V1cCBiaXQKCQkJT1BXKEhSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7CQkvLyBzZXQgd2FrZXVwIGJpdCB0byBjb3VudGVyYWN0IHRoZSBjbGVhcmluZyBieSBGL1cKCQkJLy8gODAwIHVzIGxhdGVuY3kgYmVmb3JlIEZXIHN3aXRjaGVzIHRvIGhpZ2ggcG93ZXIKCQkJTVNGX1dBSVQoODAwKTsJCQkJCQkJCS8vIE1TRi1kZWZpbmVkIGZ1bmN0aW9uIHRvIHdhaXQgbiBtaWNyb3NlY29uZHMuCi8vT09SCQlpZiAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9EU19PT1IgKSB7IC8vIE91dE9mUmFuZ2UKLy8JCQkJcHJpbnRrKCAiPDU+QUNUX0lOVF9PRkY6IERlZXBzbGVlcCBwaGFzZSB0ZXJtaW5hdGVkLCBlbmFibGUgYW5kIGdvIHRvIEF3YWl0Q29ubmVjdGlvblxuIiApOwkJLy87P3JlbW92ZSBtZSAxIGRheQovLwkJCQloY2ZfY250bCggaWZicCwgSENGX0NOVExfRU5BQkxFICk7Ci8vCQkJfQovLwkJCWlmYnAtPklGQl9EU0xpbmtTdGF0ICY9IH4oIENGR19MSU5LX1NUQVRfRFNfSVIgfCBDRkdfTElOS19TVEFUX0RTX09PUik7CS8vY2xlYXIgSVIvT09SIHN0YXRlCgkJfQojZW5kaWYgLy8gSENGX1NMRUVQCi8qMiovCWlmYnAtPklGQl9JbnRPZmZDbnQrKzsKLy8hICAgICByYyA9IDA7CgkJaSA9IElQVyggSFJFR19JTlRfRU4gKTsKCQlPUFcoIEhSRUdfSU5UX0VOLCAwICk7CgkJaWYgKCBpICYgMHgxMDAwICkgewoJCQlyYyA9IEhDRl9FUlJfTk9fTklDOwoJCX0gZWxzZSB7CgkJCWlmICggaSAmIElQVyggSFJFR19FVl9TVEFUICkgKSB7CgkJCQlyYyA9IEhDRl9JTlRfUEVORElORzsKCQkJfQoJCX0KCQlicmVhazsKCgkgIGNhc2UgSENGX0FDVF9JTlRfRk9SQ0VfT046CQkJCS8vIEVuZm9yY2UgRW5hYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCgkJaWZicC0+SUZCX0ludE9mZkNudCA9IDA7CgkJLy9GYWxsIHRocm91Z2ggaW4gSENGX0FDVF9JTlRfT04KCgkgIGNhc2UgSENGX0FDVF9JTlRfT046CQkJCQkJLy8gRW5hYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCi8qNCovCWlmICggaWZicC0+SUZCX0ludE9mZkNudC0tID09IDAgJiYgaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgKSB7CgkJCQkJCQkJCQkJCS8vZGV0ZXJtaW5lIEludGVycnVwdCBFdmVudCBtYXNrCiNpZiBIQ0ZfRE1BCgkJCWlmICggaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BICkgewoJCQkJaSA9IEhSRUdfRVZfSU5GTyB8IEhSRUdfRVZfUkRNQUQgfCBIUkVHX0VWX1RETUFEIHwgSFJFR19FVl9UWF9FWFQ7CS8vbWFzayB3aGVuIERNQSBhY3RpdmUKCQkJfSBlbHNlCiNlbmRpZiAvLyBIQ0ZfRE1BCgkJCXsKCQkJCWkgPSBIUkVHX0VWX0lORk8gfCBIUkVHX0VWX1JYIHwgSFJFR19FVl9UWF9FWFQ7CQkJCQkJLy9tYXNrIHdoZW4gRE1BIG5vdCBhY3RpdmUKCQkJCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAwICkgewoJCQkJCWkgfD0gSFJFR19FVl9BTExPQzsJCQkJCQkJCQkJCQkvL21hc2sgd2hlbiBubyBUeEZJRCBhdmFpbGFibGUKCQkJCX0KCQkJfQojaWYgSENGX1NMRUVQCgkJCWlmICggKCBJUFcoSFJFR19FVl9TVEFUKSAmICggaSB8IEhSRUdfRVZfU0xFRVBfUkVRICkgKSA9PSBIUkVHX0VWX1NMRUVQX1JFUSApIHsKCQkJCS8vIGZpcm13YXJlIGluZGljYXRlcyBpdCB3b3VsZCBsaWtlIHRvIGdvIGludG8gc2xlZXAgbW9kdXMKCQkJCS8vIG9ubHkgYWNrbm93bGVkZ2UgdGhpcyByZXF1ZXN0IGlmIG5vIG90aGVyIGV2ZW50cyB0aGF0IGNhbiBjYXVzZSBhbiBpbnRlcnJ1cHQgYXJlIHBlbmRpbmcKCQkJCWlmYnAtPklGQl9JbnRPZmZDbnQtLTsJCQkvL2JlY29tZXMgMHhGRkZFCiAgICAgICAgICAgIAlPUFcoIEhSRUdfSU5UX0VOLCBpIHwgSFJFR19FVl9USUNLICk7CgkJCQlPUFcoIEhSRUdfRVZfQUNLLCBIUkVHX0VWX1NMRUVQX1JFUSB8IEhSRUdfRVZfVElDSyB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSApOwoJCQl9IGVsc2UKI2VuZGlmIC8vIEhDRl9TTEVFUAoJCQl7CiAgICAgICAgICAgIAlPUFcoIEhSRUdfSU5UX0VOLCBpIHwgSFJFR19FVl9TTEVFUF9SRVEgKTsKCQkJfQoJCX0KCQlicmVhazsKI2VuZGlmIC8vIEhDRl9JTlRfT04KCiNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKCSAgY2FzZSBIQ0ZfQUNUX1NMRUVQOgkJCQkJCS8vIEREUyBTbGVlcCByZXF1ZXN0CgkJaGNmX2NudGwoIGlmYnAsIEhDRl9DTlRMX0RJU0FCTEUgKTsKCQljbWRfZXhlKCBpZmJwLCBIQ01EX1NMRUVQLCAwICk7CgkJYnJlYWs7Ci8vIAkgIGNhc2UgSENGX0FDVF9XQUtFVVA6CQkJCQkJLy8gRERTIFdha2V1cCByZXF1ZXN0Ci8vIAkJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ID09IDB4RkZGRSwgaWZicC0+SUZCX0ludE9mZkNudCApCi8vIAkJaWZicC0+SUZCX0ludE9mZkNudCsrOwkJCQkJLy8gcmVzdG9yZSBjb252ZW50aW9uYWwgSS9GCi8vIAkJT1BXKCBIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOwovLyAJCU1TRl9XQUlUKDgwMCk7CQkJCQkJCS8vIE1TRi1kZWZpbmVkIGZ1bmN0aW9uIHRvIHdhaXQgbiBtaWNyb3NlY29uZHMuCi8vIAkJcmMgPSBoY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX0lOVF9PRkYgKTsJLypib2d1cywgSUZCX0ludE9mZkNudCA9PSAweEZGRkYsIHNvIGlmIHlvdSBjYXJlZnVsbHkgbG9vawovLyAJCQkJCQkJCQkJCQkJICphdCB0aGUgI2lmIEhDRl9ERFMgc3RhdGVtZW50cywgSENGX0FDVF9JTlRfT0ZGIGlzIGVtcHR5Ci8vIAkJCQkJCQkJCQkJCQkgKmZvciBERFMuICJNdWNoIiBiZXR0ZXIgd291bGQgYmUgdG8gbWVyZ2UgdGhlIGZsb3dzIGZvcgovLyAJCQkJCQkJCQkJCQkJICpERFMgYW5kIERFRVBfU0xFRVAKLy8gCQkJCQkJCQkJCQkJCSAqLwovLyAJCWJyZWFrOwojZW5kaWYgLy8gSENGX0REUwoKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKCSAgY2FzZSBIQ0ZfQUNUX0NDWF9PTjoJCQkJCQkvLyBlbmFibGUgQ0tJUAoJICBjYXNlIEhDRl9BQ1RfQ0NYX09GRjoJCQkJCQkvLyBkaXNhYmxlIENLSVAKCQlpZmJwLT5JRkJfQ0tJUFN0YXQgPSBhY3Rpb247CgkJYnJlYWs7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKCgkgIGNhc2UgSENGX0FDVF9SWF9BQ0s6CQkJCQkJLy9SZWNlaXZlciBBQ0sKLyo2Ki8JaWYgKCBpZmJwLT5JRkJfUnhGSUQgKSB7CgkJCURBV0FfQUNLKCBIUkVHX0VWX1JYICk7CgkJfQoJCWlmYnAtPklGQl9SeEZJRCA9IGlmYnAtPklGQl9SeExlbiA9IDA7CgkJYnJlYWs7CgovKjgqLyBjYXNlCUhDRl9BQ1RfUFJTX1NDQU46CQkJCQkvLyBIZXJtZXMgUFJTIFNjYW4gKEYxMDIpCgkJT1BXKCBIUkVHX1BBUkFNXzEsIDB4M0ZGRiApOwoJCQkvL0ZhbGwgdGhyb3VnaCBpbiBIQ0ZfQUNUX1RBTExJRVMKCSAgY2FzZSBIQ0ZfQUNUX1RBTExJRVM6CQkJCQkJLy8gSGVybWVzIElucXVpcmUgVGFsbGllcyAoRjEwMCkKI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCgkgIGNhc2UgSENGX0FDVF9TQ0FOOgkJCQkJCS8vIEhlcm1lcyBJbnF1aXJlIFNjYW4gKEYxMDEpCiNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CgkJLyohISB0aGUgYXNzdW1wdGlvbnMgYWJvdXQgbnVtZXJpY2FsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBDRkdfVEFMTElFUyBldGMgYW5kIEhDRl9BQ1RfVEFMTElFUyBldGMKCQkgKiAgIGFyZSBjaGVja2VkIGJ5ICNpZiBzdGF0ZW1lbnRzIGp1c3QgcHJpb3IgdG8gdGhpcyByb3V0aW5lIHJlc3VsdGluZyBpbjogZXJyICJtYWludGVuYW5jZSIJKi8KCQljbWRfZXhlKCBpZmJwLCBIQ01EX0lOUVVJUkUsIGFjdGlvbiAtIEhDRl9BQ1RfVEFMTElFUyArIENGR19UQUxMSUVTICk7CgkJYnJlYWs7CgoJICBkZWZhdWx0OgoJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBhY3Rpb24gKQoJCWJyZWFrOwoJfQoJLy8hIGRvIG5vdCBIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCQkJCQkJCQkJCQkJCQkvKiAzMCovCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQUNUSU9OICkKCXJldHVybiByYzsKfSAvLyBoY2ZfYWN0aW9uCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJaW50IGhjZl9jbnRsKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWQgKQoqLlBVUlBPU0UJCUNvbm5lY3Qgb3IgZGlzY29ubmVjdCBhIHNwZWNpZmljIHBvcnQgdG8gYSBzcGVjaWZpYyBuZXR3b3JrLgoqISEgIDs/Pz8/Pz8/Pz8/Pz8/Pz8/IGNvbnRpbnVlIG5lZWRzIG1vcmUgZXhwbGFuYXRpb24KKgkJCQlyZWNvdmVycyBieSBtZWFucyBvZiAiY29udGludWUiIHdoZW4gdGhlIGNvbm5lY3QgcHJvY2VzIGluIENDWCBtb2RlIGZhaWxzCioJCQkJRW5hYmxlcyBvciBkaXNhYmxlcyBkYXRhIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uIGZvciB0aGUgTklDLgoqCQkJCUFjdGl2YXRlcyBzdGF0aWMgTklDIGNvbmZpZ3VyYXRpb24gZm9yIGEgc3BlY2lmaWMgcG9ydCBhdCBjb25uZWN0LgoqCQkJCUFjdGl2YXRlcyBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgYWxsIHBvcnRzIGF0IGVuYWJsZS4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWNtZAkJCTB4MDAxRjoJSGVybWVzIGNvbW1hbmQgKGRpc2FibGUsIGVuYWJsZSwgY29ubmVjdCwgZGlzY29ubmVjdCwgY29udGludWUpCioJCQkJCUhDRl9DTlRMX0VOQUJMRQkJRW5hYmxlCioJCQkJCUhDRl9DTlRMX0RJU0FCTEUgICAgRGlzYWJsZQoqCQkJCQlIQ0ZfQ05UTF9DT05USU5VRQlDb250aW51ZQoqCQkJCQlIQ0ZfQ05UTF9DT05ORUNUICAgIENvbm5lY3QKKgkJCQkJSENGX0NOVExfRElTQ09OTkVDVCBEaXNjb25uZWN0CioJCQkJMHgwMTAwOiBjb21tYW5kIHF1YWxpZmllciAoY29udGludWUpCioJCQkJCUhDTURfUkVUUlkJCQlyZXRyeSBmbGFnCioJCQkJMHgwNzAwOiAgcG9ydCBudW1iZXIgKGNvbm5lY3QvZGlzY29ubmVjdCkKKgkJCQkJSENGX1BPUlRfMCAgICAgICAgICBNQUMgUG9ydCAwCioJCQkJCUhDRl9QT1JUXzEgICAgICAgICAgTUFDIFBvcnQgMQoqCQkJCQlIQ0ZfUE9SVF8yICAgICAgICAgIE1BQyBQb3J0IDIKKgkJCQkJSENGX1BPUlRfMyAgICAgICAgICBNQUMgUG9ydCAzCioJCQkJCUhDRl9QT1JUXzQgICAgICAgICAgTUFDIFBvcnQgNAoqCQkJCQlIQ0ZfUE9SVF81ICAgICAgICAgIE1BQyBQb3J0IDUKKgkJCQkJSENGX1BPUlRfNiAgICAgICAgICBNQUMgUG9ydCA2CioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MKKiEhCXZpYSBjbWRfZXhlCioJSENGX0VSUl9OT19OSUMKKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCioJSENGX0VSUl9USU1FX09VVAoqCiouREVTQ1JJUFRJT04KKiBUaGUgcGFyYW1ldGVyIGNtZCBjb250YWlucyBhIG51bWJlciBvZiBzdWJmaWVsZHMuCiogVGhlIGFjdHVhbCB2YWx1ZSBmb3IgY21kIGlzIGNyZWF0ZWQgYnkgbG9naWNhbCBvci1pbmcgdGhlIGFwcHJvcHJpYXRlIG1uZW1vbmljcyBmb3IgdGhlIHN1YmZpZWxkcy4KKiBUaGUgZmllbGQgMHgwMDFGIGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvZGUKKiAgLSBIQ0ZfQ05UTF9FTkFCTEUKKiAgLSBIQ0ZfQ05UTF9ESVNBQkxFCiogIC0gSENGX0NOVExfQ09OTkVDVAoqICAtIEhDRl9DTlRMX0RJU0NPTk5FQ1QKKiAgLSBIQ0ZfQ05UTF9DT05USU5VRQoqCiogRm9yIEhDRl9DTlRMX0NPTlRJTlVFLCB0aGUgZmllbGQgMHgwMTAwIGNvbnRhaW5zIHRoZSByZXRyeSBmbGFnIEhDTURfUkVUUlkuCiogRm9yIEhDRl9DTlRMX0NPTk5FQ1QgYW5kIEhDRl9DTlRMX0RJU0NPTk5FQ1QsIHRoZSBmaWVsZCAweDA3MDAgY29udGFpbnMgdGhlIHBvcnQgbnVtYmVyIGFzIEhDRl9QT1JUXyMuCiogRm9yIFN0YXRpb24gYXMgd2VsbCBhcyBBY2Nlc3NQb2ludCBGL1csIE1BQyBQb3J0IDAgaXMgdGhlICJub3JtYWwiIGNvbW11bmljYXRpb24gY2hhbm5lbC4KKiBGb3IgQWNjZXNzUG9pbnQgRi9XLCBNQUMgUG9ydCAxIHRocm91Z2ggNiBjb250cm9sIHRoZSBXRFMgbGlua3MuCioKKiBOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgbmFtZXMgSENGX0NOVExfRElTQUJMRSBhbmQgSENGX0NOVExfRU5BQkxFLCBoY2ZfY250bCBkb2VzIG5vdCBpbmZsdWVuY2UgdGhlIE5JQwoqIEludGVycnVwdHMgbW9kZS4KKgoqIFRoZSBDb25uZWN0IGlzIHVzZWQgYnkgdGhlIE1TRiB0byBicmluZyBhIHBhcnRpY3VsYXIgcG9ydCBpbiBhbiBpbmFjdGl2ZSBzdGF0ZSBhcyBmYXIgYXMgZGF0YSB0cmFuc21pc3Npb24KKiBhbmQgcmVjZXB0aW9uIGFyZSBjb25jZXJuZWQuCiogV2hlbiBhIHBhcnRpY3VsYXIgcG9ydCBpcyBkaXNjb25uZWN0ZWQ6CiogLSB0aGUgRi9XIGRpc2FibGVzIHRoZSByZWNlaXZlciBmb3IgdGhhdCBwb3J0LgoqIC0gdGhlIEYvVyBpZ25vcmVzIHNlbmQgY29tbWFuZHMgZm9yIHRoYXQgcG9ydC4KKiAtIGFsbCBmcmFtZXMgKFJlY2VpdmUgYXMgd2VsbCBhcyBwZW5kaW5nIFRyYW5zbWl0KSBmb3IgdGhhdCBwb3J0IG9uIHRoZSBOSUMgYXJlIGRpc2NhcmRlZC4KKgoqIFdoZW4gdGhlIE5JQyBpcyBkaXNhYmxlZCwgYWJvdmUgbGlzdCBhcHBsaWVzIHRvIGFsbCBwb3J0cywgaS5lLiB0aGUgcmVzdWx0IGlzIGxpa2UgYWxsIHBvcnRzIGFyZQoqIGRpc2Nvbm5lY3RlZC4KKgoqIFdoZW4gYSBwYXJ0aWN1bGFyIHBvcnQgaXMgY29ubmVjdGVkOgoqIC0gdGhlIEYvVyBlZmZlY3R1YXRlcyB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcG9ydC4KKiAtIGVuYWJsZXMgdGhlIHJlY2VpdmVyIGZvciB0aGF0IHBvcnQuCiogLSBhY2NlcHRzIHNlbmQgY29tbWFuZHMgZm9yIHRoYXQgcG9ydC4KKgoqIEVuYWJsaW5nIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6CiogLSB0aGUgRi9XIGVmZmVjdHVhdGVzIHRoZSBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgYWxsIHBvcnRzLgoqCVRoZSBGL1cgb25seSB1cGRhdGVzIGl0cyBzdGF0aWMgY29uZmlndXJhdGlvbiBhdCBhIHRyYW5zaXRpb24gZnJvbSBkaXNhYmxlZCB0byBlbmFibGVkIG9yIGZyb20KKglkaXNjb25uZWN0ZWQgdG8gY29ubmVjdGVkLgoqCUluIG9yZGVyIHRvIGVuZm9yY2UgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uLCB0aGUgTVNGIG11c3QgYXNzdXJlIHRoYXQgc3VjaCBhIHRyYW5zaXRpb24gdGFrZXMgcGxhY2UuCioJRHVlIHRvIHN1Y2ggYSBkaXNhYmxlL2VuYWJsZSBvciBkaXNjb25uZWN0L2Nvbm5lY3Qgc2VxdWVuY2UsIFJ4L1R4IGZyYW1lcyBtYXkgYmUgbG9zdCwgaW4gb3RoZXIgd29yZHMsCioJY29uZmlndXJhdGlvbiBtYXkgaW1wYWN0IGNvbW11bmljYXRpb24uCiogLSBUaGUgRE1BIEVuZ2luZSAoaWYgYXBwbGljYWJsZSkgaXMgZW5hYmxlZC4KKiBOb3RlIHRoYXQgdGhlIEVuYWJsZSBGdW5jdGlvbiBieSBpdHNlbGYgb25seSBlbmFibGVzIGRhdGEgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24sIGl0CiogZG9lcyBub3QgZW5hYmxlIHRoZSBJbnRlcnJ1cHQgR2VuZXJhdGlvbiBtZWNoYW5pc20uIFRoaXMgaXMgZG9uZSBieSBoY2ZfYWN0aW9uLgoqCiogRGlzYWJsaW5nIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6CiohISAgOz8/Pz8/aXMgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgcmVhbGx5IHRydWUKKiAtIGl0IGFjdHMgYXMgYSBkaXNjb25uZWN0IG9uIGFsbCBwb3J0cy4KKiAtIFRoZSBETUEgRW5naW5lIChpZiBhcHBsaWNhYmxlKSBpcyBkaXNhYmxlZC4KKgoqIEZvciBpbXBhY3Qgb2YgdGhlIGRpc2FibGUgY29tbWFuZCBvbiB0aGUgYmVoYXZpb3Igb2YgaGNmX2RtYV90eC9yeF9nZXQgc2VlIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9ucy4KKgoqIEFsdGhvdWdoIHRoZSBFbmFibGUvRGlzYWJsZSBhbmQgQ29ubmVjdC9EaXNjb25uZWN0IGFyZSBhbnRvbnltcywgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gdGhlaXIgc2VxdWVuY2luZywKKiBpbiBvdGhlciB3b3JkcywgdGhleSBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIGFyYml0cmFyeSBzZXF1ZW5jZSB3aXRob3V0IGJlaW5nIHBhaXJlZCBvciBiYWxhbmNlZC4KKiBFYWNoIHRpbWUgb25lIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBjYWxsZWQsIHRoZSBlZmZlY3RzIG9mIHRoZSBwcmVjZWRpbmcgY2FsbHMgY2Vhc2UuCioKKiBBc3NlcnQgZmFpbHMgaWYKKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQuCiogLSBBIGNvbW1hbmQgb3RoZXIgdGhhbiBDb250aW51ZSwgRW5hYmxlLCBEaXNhYmxlLCBDb25uZWN0IG9yIERpc2Nvbm5lY3QgaXMgZ2l2ZW4uCiogLSBBbiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWJmaWVsZHMgaXMgZ2l2ZW4gb3IgYSBiaXQgb3V0c2lkZSB0aGUgc3ViZmllbGRzIGlzIGdpdmVuLgoqIC0gYW55IHJldHVybiBjb2RlIGJlc2lkZXMgSENGX1NVQ0NFU1MuCiogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGEgaGNmX2Z1bmN0aW9uIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yCioJbXVsdGktdGhyZWFkaW5nCioKKi5ESUFHUkFNCioJaGNmX2NudGwgdGFrZXMgc3VjY2Vzc2l2ZWx5IHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKjI6CUlmIHRoZSBIQ0YgaXMgaW4gRGVmdW5jdCBtb2RlIG9yIGluY29tcGF0aWJsZSB3aXRoIHRoZSBQcmltYXJ5IG9yIFN0YXRpb24gU3VwcGxpZXIgaW4gdGhlIEhlcm1lcywKKgloY2ZfY250bCgpIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBIQ0ZfRVJSX05PX05JQzs/IGFzIHN0YXR1cy4KKjg6CXdoZW4gdGhlIHBvcnQgaXMgZGlzYWJsZWQsIHRoZSBETUEgZW5naW5lIG5lZWRzIHRvIGJlIGRlLWFjdGl2YXRlZCwgc28gdGhlIGhvc3QgY2FuIHNhZmVseSByZWNsYWltIHR4CioJcGFja2V0cyBmcm9tIHRoZSB0eCBkZXNjcmlwdG9yIGNoYWluLgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX2NudGwoIElGQlAgaWZicCwgaGNmXzE2IGNtZCApCnsKaW50CXJjID0gSENGX0VSUl9JTkNPTVBfRlc7CiNpZiBIQ0ZfQVNTRVJUCnsJaW50IHggPSBjbWQgJiBIQ01EX0NNRF9DT0RFOwoJaWYgKCB4ID09IEhDRl9DTlRMX0NPTlRJTlVFICkgeCAmPSB+SENNRF9SRVRSWTsKCWVsc2UgaWYgKCAoeCA9PSBIQ01EX0RJU0FCTEUgfHwgeCA9PSBIQ01EX0VOQUJMRSkgJiYgaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9PSBDT01QX0lEX0ZXX0FQICkgewoJCXggJj0gfkhGU19UWF9DTlRMX1BPUlQ7Cgl9CglIQ0ZBU1NFUlQoIHg9PUhDRl9DTlRMX0VOQUJMRSAgfHwgeD09SENGX0NOVExfRElTQUJMRSAgICB8fCBIQ0ZfQ05UTF9DT05USU5VRSB8fAoJCQkgICB4PT1IQ0ZfQ05UTF9DT05ORUNUIHx8IHg9PUhDRl9DTlRMX0RJU0NPTk5FQ1QsIGNtZCApCn0KI2VuZGlmIC8vIEhDRl9BU1NFUlQKLy8gI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUwovLyAJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSwgY21kICkKLy8gI2VuZGlmIC8vIEhDRl9ERFMKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfQ05UTCwgY21kICkKCWlmICggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgKSB7CQkJCQkJCQkJCQkJCQkJCSAvKjIqLwovKjYqLwlyYyA9IGNtZF9leGUoIGlmYnAsIGNtZCwgMCApOwojaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCgkJaWZicC0+SUZCX1RpY2tDbnQgPSAwOwkJCQkvL3N0YXJ0IDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkKI2VuZGlmIC8vIEhDRl9ERFMKCX0KI2lmIEhDRl9ETUEKCS8vIXJsYXYgOiBub3RlIHRoYXQgdGhpcyBwaWVjZSBvZiBjb2RlIGlzIGFsd2F5cyBleGVjdXRlZCwgcmVnYXJkbGVzcyBvZiB0aGUgREVGVU5DVCBiaXQgaW4gSUZCX0NhcmRTdGF0LgoJLy8gVGhlIHJlYXNvbiBiZWhpbmQgdGhpcyBpcyB0aGF0IHRoZSBNU0Ygc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCBpdHMgRE1BIHJlc291cmNlcyBiYWNrIGZyb20gdGhlIEhDRiwKCS8vIGV2ZW4gaWYgdGhlIGhhcmR3YXJlIGlzIGRpc2Z1bmN0aW9uYWwuIFByYWN0aWNhbCBleGFtcGxlIHVuZGVyIFdpbmRvd3MgOiBzdXJwcmlzZSByZW1vdmFsLgoJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSB7CgkJaGNmX2lvIGlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlOwoJCURFU0NfU1RSQ1QgKnA7CgkJaWYgKCBjbWQgPT0gSENGX0NOVExfRElTQUJMRSB8fCBjbWQgPT0gSENGX0NOVExfRU5BQkxFICkgewoJCQlPVVRfUE9SVF9EV09SRCggKGlvX3BvcnQgKyBIUkVHX0RNQV9DVFJMKSwgRE1BX0NUUkxTVEFUX1JFU0VUKTsJCQkJCQkvKjgqLwoJCQlpZmJwLT5JRkJfQ250bE9wdCAmPSB+RE1BX0VOQUJMRUQ7CgkJfQoJCWlmICggY21kID09IEhDRl9DTlRMX0VOQUJMRSApIHsKCQkJT1VUX1BPUlRfRFdPUkQoIChpb19wb3J0ICsgSFJFR19ETUFfQ1RSTCksIERNQV9DVFJMU1RBVF9HTyk7CgkJCS8qIDs/IGJ5IHJld3JpdGluZyBoY2ZfZG1hX3J4X3B1dCB5b3UgY2FuIHByb2JhYmx5IGp1c3QgY2FsbCBoY2ZfZG1hX3J4X3B1dCggaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdICkKCQkJICogYXMgYWRkaXRpb25hbCBiZW5lZmljaWFyeSBzaWRlIGVmZmVjdCwgdGhlIFNPUCBhbmQgRU9QIGJpdHMgd2lsbCBhbHNvIGJlIGNsZWFyZWQKCQkJICovCgkJCWlmYnAtPklGQl9DbnRsT3B0IHw9IERNQV9FTkFCTEVEOwoJCQlIQ0ZBU1NFUlQoIE5UX0FTU0VSVCwgTkVWRVJfVEVTVEVEICkKCQkJLy8gbWFrZSB0aGUgZW50aXJlIHJ4IGRlc2NyaXB0b3IgY2hhaW4gRE1BLW93bmVkLCBzbyB0aGUgRE1BIGVuZ2luZSBjYW4gKHJlLSl1c2UgaXQuCgkJCXAgPSBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF07CgkJCWlmIChwICE9IE5VTEwpIHsgICAvLzs/IFRoaW5rIHRoaXMgb3ZlciBhZ2FpbiBpbiB0aGUgbGlnaHQgb2YgdGhlIG5ldyBjaGFpbmluZyBzdHJhdGVneQoJCQkJaWYgKCAxICkgCXsgLy9iZWdpbiBhbHRlcm5hdGl2ZQoJCQkJCUhDRkFTU0VSVCggTlRfQVNTRVJULCBORVZFUl9URVNURUQgKQoJCQkJCXB1dF9mcmFtZV9sc3QoIGlmYnAsIGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXSwgRE1BX1JYICk7CgkJCQkJaWYgKCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKSB7CgkJCQkJCXB1dF9mcmFtZV9sc3QoIGlmYnAsIGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXS0+bmV4dF9kZXNjX2FkZHIsIERNQV9SWCApOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJd2hpbGUgKCBwICkgewoJCQkJCQkvL3AtPmJ1Zl9jbnRsLmNudGxfc3RhdCB8PSBERVNDX0RNQV9PV05FRDsKCQkJCQkJcC0+QlVGX0NOVCB8PSBERVNDX0RNQV9PV05FRDsKCQkJCQkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwoJCQkJCX0KCQkJCQkvLyBhIHJ4IGNoYWluIGlzIGF2YWlsYWJsZSBzbyBoYW5kIGl0IG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKCQkJCQlwID0gaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdOwoJCQkJCU9VVF9QT1JUX0RXT1JEKCAoaW9fcG9ydCArIEhSRUdfUlhETUFfUFRSMzIpLCBwLT5kZXNjX3BoeXNfYWRkcik7CgkJCQl9ICAvL2VuZCBhbHRlcm5hdGl2ZQoJCQl9CgkJfQoJfQojZW5kaWYgLy8gSENGX0RNQQoJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQoJSENGTE9HRVhJVCggSENGX1RSQUNFX0NOVEwgKQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9jbnRsCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX2Nvbm5lY3QoIElGQlAgaWZicCwgaGNmX2lvIGlvX2Jhc2UgKQoqLlBVUlBPU0UJCUdyYW50cyBhY2Nlc3MgcmlnaHQgZm9yIHRoZSBIQ0YgdG8gdGhlIElGQi4KKgkJCQlJbml0aWFsaXplcyBDYXJkIGFuZCBIQ0YgaG91c2VrZWVwaW5nLgoqCiouQVJHVU1FTlRTCioJaWZicAkJKG5lYXIpIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWlvX2Jhc2UJCW5vbi1VU0I6IEkvTyBCYXNlIGFkZHJlc3Mgb2YgdGhlIE5JQyAoY29ubmVjdCkKKgkJCQlub24tVVNCOiBIQ0ZfRElTQ09OTkVDVAoqCQkJCVVTQjoJIEhDRl9DT05ORUNULCBIQ0ZfRElTQ09OTkVDVAoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCioJSENGX0VSUl9JTkNPTVBfUFJJCioJSENGX0VSUl9JTkNPTVBfRlcKKglIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUQoqISEJSENGX0VSUl9OT19OSUMgcmVhbGx5IHJldHVybmVkIDs/CioJSENGX0VSUl9OT19OSUMKKglIQ0ZfRVJSX1RJTUVfT1VUCioKKglNU0YtYWNjZXNzaWJsZSBmaWVsZHMgb2YgUmVzdWx0IEJsb2NrOgoqCUlGQl9JT0Jhc2UJCQkJZW50cnkgcGFyYW1ldGVyIGlvX2Jhc2UKKglJRkJfSU9SYW5nZQkJCQlIUkVHX0lPX1JBTkdFICgweDQwLzB4ODApCioJSUZCX1ZlcnNpb24JCQkJdmVyc2lvbiBvZiB0aGUgSUZCIGxheW91dAoqCUlGQl9GV0lkZW50aXR5CQkJQ0ZHX0ZXX0lERU5USVRZX1NUUkNULCBzcGVjaWZpZXMgdGhlIGlkZW50aXR5IG9mIHRoZQoqCQkJCQkJCSJydW5uaW5nIiBGL1csIGkuZS4gdGVydGlhcnkgRi9XIHVuZGVyIG5vcm1hbCBjb25kaXRpb25zCioJSUZCX0ZXU3VwCQkJCUNGR19TVVBfUkFOR0VfU1RSQ1QsIHNwZWNpZmllcyB0aGUgc3VwcGxpZXIgcmFuZ2Ugb2YKKgkJCQkJCQl0aGUgInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKglJRkJfSFNJU3VwCQkJCUNGR19TVVBfUkFOR0VfU1RSQ1QsIHNwZWNpZmllcyB0aGUgSFcvU1cgSS9GIHJhbmdlIG9mIHRoZSBOSUMKKglJRkJfUFJJSWRlbnRpdHkJCQlDRkdfUFJJX0lERU5USVRZX1NUUkNULCBzcGVjaWZpZXMgdGhlIElkZW50aXR5IG9mIHRoZSBQcmltYXJ5IEYvVwoqCUlGQl9QUklTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZiB0aGUgUHJpbWFyeSBGL1cKKglhbGwgb3RoZXIJCQkJYWxsIE1TRiBhY2Nlc3NpYmxlIGZpZWxkcywgd2hpY2ggYXJlIG5vdCBzcGVjaWZpZWQgYWJvdmUsIGFyZSB6ZXJvLWZpbGxlZAoqCiouQ09ORElUSU9OUwoqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIGFzc3VyZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIEkvTyBCYXNlIGFkZHJlc3MuCioKKiBOb3RlOiBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKKiB3YXMgY2FsbGVkLgoqCiouREVTQ1JJUFRJT04KKiBoY2ZfY29ubmVjdCBwYXNzZXMgdGhlIE1TRi1kZWZpbmVkIGxvY2F0aW9uIG9mIHRoZSBJRkIgdG8gdGhlIEhDRiBhbmQgZ3JhbnRzIG9yIHJldm9rZXMgYWNjZXNzIHJpZ2h0IGZvciB0aGUKKiBIQ0YgdG8gdGhlIElGQi4gUmV2b2tpbmcgaXMgZG9uZSBieSBzcGVjaWZ5aW5nIEhDRl9ESVNDT05ORUNUIHJhdGhlciB0aGFuIGFuIEkvTyBhZGRyZXNzIGZvciB0aGUgcGFyYW1ldGVyCiogaW9fYmFzZS4gIEV2ZXJ5IGNhbGwgb2YgaGNmX2Nvbm5lY3QgaW4gImNvbm5lY3QiIG1vZGUsIG11c3QgZXZlbnR1YWxseSBiZSBmb2xsb3dlZCBieSBhIGNhbGwgb2YgaGNmX2Nvbm5lY3QKKiBpbiAiZGlzY29ubmVjdCIgbW9kZS4gQ2xhbGxpbmcgaGNmX2Nvbm5lY3QgaW4gImNvbm5lY3QiLyJkaXNjb25uZWN0IiBtb2RlIGNhbiBub3QgYmUgbmVzdGVkLgoqIFRoZSBJRkIgYWRkcmVzcyBtdXN0IGJlIHVzZWQgYXMgYSBoYW5kbGUgd2l0aCBhbGwgc3Vic2VxdWVudCBIQ0YtZnVuY3Rpb24gY2FsbHMgYW5kIHRoZSBIQ0YgdXNlcyB0aGUgSUZCCiogYWRkcmVzcyBhcyBhIGhhbmRsZSB3aGVuIGl0IHBlcmZvcm1zIGEgY2FsbChiYWNrKSBvZiBhbiBNU0YtZnVuY3Rpb24gKGkuZS4gbXNmX2Fzc2VydCkuCioKKiBOb3RlIHRoYXQgbm90IG9ubHkgdGhlIE1TRiBhY2Nlc3NpYmxlIGZpZWxkcyBhcmUgY2xlYXJlZCwgYnV0IGFsc28gYWxsIGludGVybmFsIGhvdXNla2VlcGluZwoqIGluZm9ybWF0aW9uIGlzIHJlLWluaXRpYWxpemVkLgoqIFRoaXMgaW1wbGllcyB0aGF0IGFsbCBzZXR0aW5ncyB3aGljaCBhcmUgZG9uZSB2aWEgaGNmX2FjdGlvbiBhbmQgaGNmX3B1dF9pbmZvIChlLmcuIENGR19NQl9BU1NFUlQsIENGR19SRUdfTUIsCiogQ0ZHX1JFR19JTkZPX0xPRykgbXVzdCBiZSBkb25lIGFnYWluLiBUaGUgb25seSBmaWVsZCB3aGljaCBpcyBub3QgY2xlYXJlZCwgaXMgSUZCX01TRlN1cC4KKgoqIElmIEhDRl9JTlRfT04gaXMgc2VsZWN0ZWQgYXMgY29tcGlsZSBvcHRpb24sIE5JQyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBpcyBub3QgcHJvcGVybHkgYWxpZ25lZCAoIHJlZiBjaGFwdGVyIEhDRl9BTElHTiBpbiA0LjEuMSkKKiAtIEkvTyBCYXNlIEFkZHJlc3MgaXMgbm90IGEgbXVsdGlwbGUgb2YgMHg0MCAobm90ZTogMHgwMDAwIGlzIGV4cGxpY2l0bHkgYWxsb3dlZCkuCioKKi5ESUFHUkFNCioKKjA6CVRocm91Z2hvdXQgaGNmX2Nvbm5lY3QgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIGNvbm5lY3QgZnJvbSB0aGUgZGlzY29ubmVjdCBjYXNlLCB3aGljaCByZXF1aXJlcwoqCXNvbWUgYXR0ZW50aW9uIGFib3V0IHdoYXQgdG8gdXNlIGFzICJJL08iIGFkZHJlc3Mgd2hlbiBmb3Igd2hpY2ggcHVycG9zZS4KKjI6CioyYTogUmVzZXQgSC1JSSBieSB0b2dnbGluZyByZXNldCBiaXQgaW4gSU8tcmVnaXN0ZXIgb24gYW5kIG9mZi4KKglUaGUgSENGX1RZUEVfUFJFTE9BREVEIGNhdGVycyBmb3IgdGhlIERPUyBlbnZpcm9ubWVudCB3aGVyZSBILUlJIGlzIGxvYWRlZCBieSBhIHNlcGFyYXRlIHByb2dyYW0gdG8KKglvdmVyY29tZSB0aGUgNjRrIHNpemUgbGltaXQgcG9zZWQgb24gRE9TIGRyaXZlcnMuCioJVGhlIG1hY3JvIE9QVyBpcyBub3QgeWV0IHVzZWFibGUgYmVjYXVzZSB0aGUgSUZCX0lPQmFzZSBmaWVsZCBpcyBub3Qgc2V0LgoqCU5vdGUgMTogaG9wZWZ1bGx5IHRoZSBjbGVhcmluZyBhbmQgaW5pdGlhbGl6aW5nIG9mIHRoZSBJRkIgKHNlZSBiZWxvdykgYWN0cyBhcyBhIGRlbGF5IHdoaWNoIG1lZXRzIHRoZQoqCXNwZWNpZmljYXRpb24gZm9yIFMvVyByZXNldAoqCU5vdGUgMjogaXQgdHVybnMgb3V0IHRoYXQgb24gc29tZSBIL1cgY29uc3RlbGxhdGlvbnMsIHRoZSBjbG9jayB0byBhY2Nlc3MgdGhlIEVFUHJvbSBpcyBub3QgbG93ZXJlZAoqCXRvIGFuIGFwcHJvcHJpYXRlIGZyZXF1ZW5jeSBieSBIUkVHX0lPX1NSRVNFVC4gQnkgZ2l2aW5nIGFuIEhDTURfSU5JIGZpcnN0LCB0aGlzIHByb2JsZW0gaXMgd29ya2VkIGFyb3VuZC4KKjJiOiBFeHBlcmltZW50YWxseSBpdCBpcyBkZXRlcm1pbmVkIG92ZXIgYSB3aWRlIHJhbmdlIG9mIEYvVyB2ZXJzaW9ucyB0aGF0IHdhaXRpbmcgZm9yIHRoZSBmb3IgQ21kIGJpdCBpbgoqCUV2IHJlZ2lzdGVyIGdpdmVzIGEgd29ya2FibGUgc3RyYXRlZ3kuIFRoZSBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBnaXZlIG11Y2ggY2x1ZXMuCio0OgljbGVhciBhbmQgaW5pdGlhbGl6ZSB0aGUgSUZCCioJVGhlIEhDRiBob3VzZSBrZWVwaW5nIGluZm8gaXMgZGVzaWduZWQgc3VjaCB0aGF0IHplcm8gaXMgdGhlIGFwcHJvcHJpYXRlIGluaXRpYWwgdmFsdWUgZm9yIGFzIG11Y2ggYXMKKglmZWFzaWJsZSBJRkItaXRlbXMuCioJVGhlIHJlYWRhYmxlIGZpZWxkcyBtZW50aW9uZWQgaW4gdGhlIGRlc2NyaXB0aW9uIHNlY3Rpb24gYW5kIHNvbWUgSENGIHNwZWNpZmljIGZpZWxkcyBhcmUgZ2l2ZW4gdGhlaXIKKglhY3R1YWwgdmFsdWUuCioJSUZCX1RpY2tJbmkgaXMgaW5pdGlhbGl6ZWQgYXQgYmVzdCBndWVzcyBiZWZvcmUgY2FsaWJyYXRpb24KKglIY2ZfY29ubmVjdCBkZWZhdWx0cyB0byAibm8gaW50ZXJydXB0IGdlbmVyYXRpb24iIChpbXBsaWNpdGx5IGFjaGlldmVkIGJ5IHRoZSB6ZXJvLWZpbGxpbmcpLgoqNjoJUmVnaXN0ZXIgY29tcGlsZS10aW1lIGxpbmtlZCBNU0YgUm91dGluZSBhbmQgc2V0IGRlZmF1bHQgZmlsdGVyIGxldmVsCioJY2FzdCBuZWVkZWQgdG8gZ2V0IGFyb3VuZCB0aGUgIm5lYXIiIHByb2JsZW0gaW4gRE9TIENPTSBtb2RlbAoqCWVyIEMyNDQ2OiBubyBjb252ZXJzaW9uIGZyb20gdm9pZCAoX19uZWFyIF9fY2RlY2wgKikodW5zaWduZWQgY2hhciBfX2ZhciAqLHVuc2lnbmVkIGludCx1bnNpZ25lZCBzaG9ydCxpbnQpCioJCQkJCQkJdG8gICB2b2lkIChfX2ZhciAgX19jZGVjbCAqKSh1bnNpZ25lZCBjaGFyIF9fZmFyICosdW5zaWduZWQgaW50LHVuc2lnbmVkIHNob3J0LGludCkKKjg6CUlmIGEgY29tbWFuZCBpcyBhcHBhcmVudGx5IHN0aWxsIGFjdGl2ZSAoYXMgaW5kaWNhdGVkIGJ5IHRoZSBCdXN5IGJpdCBpbiBDbWQgcmVnaXN0ZXIpIHRoaXMgbWF5IGluZGljYXRlIGEKKglibG9ja2VkIGNtZCBwaXBlIGxpbmUuICBUbyB1bmJsb2NrIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgZG9uZToKKgkgLSBBY2sgZXZlcnl0aGluZwoqCSAtIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgoqCSAtIFdhaXQgZm9yIENtZCAgYml0IHJhaXNlIGluIEV2ICByZWdpc3RlcgoqCVRoZSB0d28gd2FpdHMgYXJlIGNvbWJpbmVkIGluIGEgc2luZ2xlIEhDRl9XQUlUX1dISUxFIHRvIG9wdGltaXplIG1lbW9yeSBzaXplLiBJZiBlaXRoZXIgb2YgdGhlc2Ugd2FpdHMKKglmYWlsIChwcm90X2NudCBiZWNvbWVzIDApLCB0aGVuIHNvbWV0aGluZyBpcyBzZXJpb3VzIHdyb25nLiBSYXRoZXIgdGhhbiBQQU5JQ0ssIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlCioJbmV4dCBjbWRfZXhlIHdpbGwgZmFpbCwgY2F1c2luZyB0aGUgSENGIHRvIGdvIGludG8gREVGVU5DVCBtb2RlCioxMDoJQWNrIGV2ZXJ5dGhpbmcgdG8gdW5ibG9jayBhIChwb3NzaWJseSBibG9ja2VkKSBjbWQgcGlwZSBsaW5lCioJTm90ZSAxOiBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFuIEFsbG9jIGV2ZW50IGlzIHBlbmRpbmcgYW5kIHZlcnkgd2VsbCBwb3NzaWJsZSB0aGF0IGEgKFNlbmQpIENtZCBldmVudCBpcwoqCXBlbmRpbmcgb24gbm9uLWluaXRpYWwgY2FsbHMKKglOb3RlIDI6IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHN0cmF0ZWd5IHRha2VzIGF3YXkgdGhlIG5lZWQgdG8gYWNrIGV2ZXJ5IGNvbmNlaXZhYmxlIGV2ZW50IGFmdGVyIGFuCioJSGVybWVzIEluaXRpYWxpemUKKjEyOglPbmx5IEgtSUkgTkVFRFMgdGhlIEhlcm1lcyBJbml0aWFsaXplIGNvbW1hbmQuIER1ZSB0byB0aGUgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgSC1JIGFuZCBILUlJCioJSW5pdGlhbGl6ZSBjb21tYW5kLCBpbml0KCkgZG9lcyBub3QgKGFuZCBjYW4gbm90LCBzaW5jZSBpdCBpcyBjYWxsZWQgZS5nLiBhZnRlciBhIGRvd25sb2FkKSBleGVjdXRlIHRoZQoqCUhlcm1lcyBJbml0aWFsaXplIGNvbW1hbmQuIEV4ZWN1dGluZyB0aGUgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZCBmb3IgSC1JIHdvdWxkIG5vdCBoYXJtIGJ1dCBub3QgZG8KKglhbnl0aGluZyB1c2VmdWwgZWl0aGVyLCBzbyBpdCBpcyBza2lwcGVkLgoqCVRoZSByZXR1cm4gc3RhdHVzIG9mIGNtZF9leGUgaXMgaWdub3JlZC4gSXQgaXMgYXNzdW1lZCB0aGF0IGlmIGNtZF9leGUgZmFpbHMsIGluaXQgZmFpbHMgdG9vCioxNDoJdXNlIGlvX2Jhc2UgYXMgYSBmbGFnIHRvIG1lcmdlIGhjZl9jb25uZWN0IGFuZCBoY2ZfZGlzY29ubmVjdCBpbnRvIDEgcm91dGluZQoqCXRoZSBjYWxsIHRvIGluaXQgYW5kIGl0cyBzdWJzZXF1ZW50IGNhbGwgb2YgY21kX2V4ZSB3aWxsIHJldHVybiBIQ0ZfRVJSX05PX05JQyBpZiBhcHByb3ByaWF0ZS4gVGhpcyBzdGF0dXMKKglpcyAoYmFkbHkpIG5lZWRlZCBieSBzb21lIGxlZ2FjeSBjb21iaW5hdGlvbiBvZiBOVDQgYW5kIGNhcmQgc2VydmljZXMgd2hpY2ggZG8gbm90IHlpZWxkIGFuIEkvTyBhZGRyZXNzIGluCioJdGltZS4KKgoqLk5PVElDRQoqCU9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgTlVMTC1wb2ludGVyIGlzIG5vdCBhIGJpdC1wYXR0ZXJuIG9mIGFsbCB6ZXJvcywgdGhlIHplcm8tZmlsbGluZyBvZiB0aGUgSUZCIHJlc3VsdHMKKglpbiBhbiBpbmNvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgcG9pbnRlcnMuCioJVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNYWlsQm94IG1hbmlwdWxhdGlvbiBpbiBwdXRfbWJfaW5mbyBwcm90ZWN0cyBhZ2FpbnN0IHRoZSBhYnNlbmNlIG9mIGEgTWFpbEJveAoqCWJhc2VkIG9uIElGQl9NQlNpemUsIElGQl9NQldwIGFuZCBpZmJwLT5JRkJfTUJScC4gVGhpcyBoYXMgcmFtaWZpY2F0aW9ucyBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCioJTWFpbEJveCB2aWEgaGNmX3B1dF9pbmZvIHdpdGggdGhlIENGR19SRUdfTUIgdHlwZSwgYnV0IGl0IHByZXZlbnRzIGRlcGVuZGVuY3kgb24gdGhlICJOVUxMLSJuZXNzIG9mCioJSUZCX01CcC4KKgoqLk5PVElDRQoqCVRoZXJlIGFyZSBhIG51bWJlciBvZiBwcm9ibGVtcyB3aGVuIGFzc2VydGluZyBhbmQgbG9nZ2luZyBoY2ZfY29ubmVjdCwgZS5nLgoqCSAtIEFzc2VydGluZyBvbiByZS1lbnRyYW5jeSBvZiBoY2ZfY29ubmVjdCBieSBtZWFucyBvZgoqCSAiSENGQVNTRVJUKCAoaWZicC0+SUZCX0Fzc2VydFRyYWNlICYgSENGX0FTU0VSVF9DT05ORUNUKSA9PSAwLCAwICkiIGlzIG5vdCB1c2VmdWwgYmVjYXVzZSBJRkIgY29udGVudHMKKgkgYXJlIHVuZGVmaW5lZAoqCSAtIEFzc2VydGluZyBiZWZvcmUgdGhlIElGQiBpcyBjbGVhcmVkIHdpbGwgY2F1c2UgbWRkX2Fzc2VydCgpIHRvIGludGVycHJldCB0aGUgZ2FyYmFnZSBpbiBJRkJfQXNzZXJ0UnRuCioJIGFzIGEgcm91dGluZSBhZGRyZXNzCioJVGhlcmVmb3JlIEhDRlRSQUNFIG5vciBIQ0ZMT0dFTlRSWSBpcyBjYWxsZWQgYnkgaGNmX2Nvbm5lY3QuCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX2Nvbm5lY3QoIElGQlAgaWZicCwgaGNmX2lvIGlvX2Jhc2UgKQp7CmludAkJCXJjID0gSENGX1NVQ0NFU1M7CmhjZl9pbwkJaW9fYWRkcjsKaGNmXzMyCQlwcm90X2NudDsKaGNmXzgJCSpxOwpMVFZfU1RSQ1QJeDsKI2lmIEhDRl9BU1NFUlQKCWhjZl8xNiB4YSA9IGlmYnAtPklGQl9GV0lkZW50aXR5LnR5cDsKCS8qIGlzIGFzc3VtZWQgdG8gY2F1c2UgYW4gYXNzZXJ0IGxhdGVyIG9uIGlmIGhjZl9jb25uZWN0IGlzIGNhbGxlZCB3aXRob3V0IGludGVydmVuaW5nIGhjZl9kaXNjb25uZWN0LgoJICogeGEgPT0gQ0ZHX0ZXX0lERU5USVRZIGluIHN1YnNlcXVlbnQgY2FsbHMgd2l0aG91dCBwcmVjZWRpbmcgaGNmX2Rpc2Nvbm5lY3QsCgkgKiB4YSA9PSAwIGluIHN1YnNlcXVlbnQgY2FsbHMgd2l0aCBwcmVjZWRpbmcgaGNmX2Rpc2Nvbm5lY3QsCgkgKiB4YSA9PSAiZ2FyYmFnZSIgKGFueSB2YWx1ZSBleGNlcHQgQ0ZHX0ZXX0lERU5USVRZIGlzIGFjY2VwdGFibGUpIGluIHRoZSBpbml0aWFsIGNhbGwKCSAqLwojZW5kaWYgLy8gSENGX0FTU0VSVAoKCWlmICggaW9fYmFzZSA9PSBIQ0ZfRElTQ09OTkVDVCApIHsJCQkJCS8vZGlzY29ubmVjdAoJCWlvX2FkZHIgPSBpZmJwLT5JRkJfSU9CYXNlOwoJCU9QVyggSFJFR19JTlRfRU4sIDAgKTsJCS8vOz93b3JrYXJvdW5kIGFnYWluc3QgZHlpbmcgRi9XIG9uIHN1YnNlcXVlbnQgaGNmX2Nvbm5lY3QgY2FsbHMKCX0gZWxzZSB7CQkJCQkJCQkJCQkvL2Nvbm5lY3QJCQkJCQkJCS8qIDAgKi8KCQlpb19hZGRyID0gaW9fYmFzZTsKCX0KCiNpZiAwIC8vOz8gaWYgYSBzdWJzZXF1ZW50IGhjZl9jb25uZWN0IGlzIHByZWNlZWRlZCBieSBhbiBoY2ZfZGlzY29ubmVjdCB0aGUgd2FrZXVwIGlzIG5vdCBuZWVkZWQgISEKI2lmIEhDRl9TTEVFUAogICAgT1VUX1BPUlRfV09SRCggLi4uLi4rSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsgCSAgICAvL09QVyBub3QgeWV0IHVzZWFibGUKCU1TRl9XQUlUKDgwMCk7CQkJCQkJCQkvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgoJbm90ZSB0aGF0IE1TRl9XQUlUIHVzZXMgbm90IHlldCBkZWZpbmVkISEhISBJRkJfSU9CYXNlIGFuZCBJRkJfVGlja0luaSAodmlhIFBST1RfQ05UX0lOSSkKCXNvIGJlIGNhcmVmdWxsIGlmIHRoaXMgY29kZSBpcyByZXN0b3JlZAojZW5kaWYgLy8gSENGX1NMRUVQCiNlbmRpZiAvLyAwCgojaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAkvL3N3aXRjaCBjbG9jayBiYWNrIGZvciBTRUVQUk9NIGFjY2VzcyAgISEhCglPVVRfUE9SVF9XT1JEKCBpb19hZGRyICsgSFJFR19DTUQsIEhDTURfSU5JICk7ICAJICAgIC8vT1BXIG5vdCB5ZXQgdXNlYWJsZQoJcHJvdF9jbnQgPSBJTklfVElDS19JTkk7CglIQ0ZfV0FJVF9XSElMRSggKElOX1BPUlRfV09SRCggaW9fYWRkciArICBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKCU9VVF9QT1JUX1dPUkQoIChpb19hZGRyICsgSFJFR19JTyksIEhSRUdfSU9fU1JFU0VUICk7CS8vT1BXIG5vdCB5ZXQgdXNlYWJsZQkJCQkJLyogMmEqLwojZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECglmb3IgKCBxID0gKGhjZl84KikoJmlmYnAtPklGQl9NYWdpYyk7IHEgPiAoaGNmXzgqKWlmYnA7ICotLXEgPSAwICkgLypOT1AqLzsJCQkJCQkvKiA0ICovCglpZmJwLT5JRkJfTWFnaWMJCT0gSENGX01BR0lDOwoJaWZicC0+SUZCX1ZlcnNpb24JPSBJRkJfVkVSU0lPTjsKI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRCAvL2EgbmV3IElGQiBkZW1vbnN0cmF0ZXMgaG93IGRpcnR5IHRoZSBzb2x1dGlvbiBpcwoJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVRdID0gTlVMTDsJCS8vSUZCX1BSSUlkZW50aXR5IHBsYWNlaG9sZGVyCTB4RkQwMgoJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQrMV0gPSBOVUxMOwkvL0lGQl9QUklTdXAgcGxhY2Vob2xkZXIJCTB4RkQwMwojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAojaWYgKEhDRl9UQUxMSUVTKSAmICggSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfSENGICkKCWlmYnAtPklGQl9UYWxseUxlbiA9IDEgKyAyICogKEhDRl9OSUNfVEFMX0NOVCArIEhDRl9IQ0ZfVEFMX0NOVCk7CS8vY29udmVydCAjIG9mIFRhbGxpZXMgdG8gTCB2YWx1ZSBmb3IgTFRWCglpZmJwLT5JRkJfVGFsbHlUeXAgPSBDRkdfVEFMTElFUzsJCQkvL0lGQl9UYWxseVR5cDogc2V0IFQgdmFsdWUKI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQyAvIEhDRl9UQUxMSUVTX0hDRgoJaWZicC0+SUZCX0lPQmFzZQk9IGlvX2FkZHI7CQkJCS8vc2V0IElPX0Jhc2UgYXNhcCwgc28gYXNzZXJ0cyB2aWEgSFJFR19TV18yIGRvbid0IGhhcm0KCWlmYnAtPklGQl9JT1JhbmdlCT0gSFJFR19JT19SQU5HRTsKCWlmYnAtPklGQl9DbnRsT3B0CT0gVVNFXzE2QklUOwojaWYgSENGX0FTU0VSVAoJYXNzZXJ0X2lmYnAgPSBpZmJwOwoJaWZicC0+SUZCX0Fzc2VydEx2bCA9IDE7CiNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCglpZiAoIGlvX2Jhc2UgIT0gSENGX0RJU0NPTk5FQ1QgKSB7CgkJaWZicC0+SUZCX0Fzc2VydFJ0biA9IChNU0ZfQVNTRVJUX1JUTlApbXNmX2Fzc2VydDsJCQkJCQkJCQkJCS8qIDYgKi8KCX0KI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTUIJCQkJLy9idWlsZCB0aGUgc3RydWN0dXJlIHRvIHBhc3MgdGhlIGFzc2VydCBpbmZvIHRvIGhjZl9wdXRfaW5mbwoJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmxlbiA9IHNpemVvZihpZmJwLT5JRkJfQXNzZXJ0U3RyY3QpL3NpemVvZihoY2ZfMTYpIC0gMTsKCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC50eXAgPSBDRkdfTUJfSU5GTzsKCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5iYXNlX3R5cCA9IENGR19NQl9BU1NFUlQ7CglpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuZnJhZ19jbnQgPSAxOwoJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmZyYWdfYnVmWzBdLmZyYWdfbGVuID0KCQkoIG9mZnNldG9mKElGQl9TVFJDVCwgSUZCX0Fzc2VydEx2bCkgLSBvZmZzZXRvZihJRkJfU1RSQ1QsIElGQl9Bc3NlcnRMaW5lKSApIC8gc2l6ZW9mKGhjZl8xNik7CglpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuZnJhZ19idWZbMF0uZnJhZ19hZGRyID0gJmlmYnAtPklGQl9Bc3NlcnRMaW5lOwojZW5kaWYgLy8gSENGX0FTU0VSVF9NQgojZW5kaWYgLy8gSENGX0FTU0VSVAoJSUZfUFJPVF9USU1FKCBwcm90X2NudCA9IGlmYnAtPklGQl9UaWNrSW5pID0gSU5JX1RJQ0tfSU5JOyApCiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCgkvLyEhIE5vIGFzc2VydHMgYmVmb3JlIFJlc2V0LWJpdCBpbiBIUkVHX0lPIGlzIGNsZWFyZWQKCU9QVyggSFJFR19JTywgMHgwMDAwICk7CQkJCQkJLy9PUFcgdXNlYWJsZQkJCQkJCQkJCQkvKiAyYiovCglIQ0ZfV0FJVF9XSElMRSggKElQVyggSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQ01EKSA9PSAwICk7CglJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUKSApICkKCUlGX1BST1RfVElNRSggaWYgKCBwcm90X2NudCApIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmk7ICkKI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAoJLy8hISBObyBhc3NlcnRzIGJlZm9yZSBSZXNldC1iaXQgaW4gSFJFR19JTyBpcyBjbGVhcmVkCglIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggSENGX0FTU0VSVCwgMHhDQUYwICkJKSAvL2p1c3QgdG8gcHJvb2YgdGhhdCB0aGUgY29tcGxldGUgYXNzZXJ0IG1hY2hpbmVyeSBpcyB3b3JraW5nCglIQ0ZBU1NFUlQoIHhhICE9IENGR19GV19JREVOVElUWSwgMCApCQkvLyBhc3NlcnQgaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCglIQ0ZBU1NFUlQoICgoaGNmXzMyKSh2b2lkKilpZmJwICYgKEhDRl9BTElHTi0xKSApID09IDAsIChoY2ZfMzIpKHZvaWQqKWlmYnAgKQoJSENGQVNTRVJUKCAoaW9fYWRkciAmIDB4MDAzRikgPT0gMCwgaW9fYWRkciApCgkJCQkJCQkJCQkJCS8vaWYgQnVzeSBiaXQgaW4gQ21kIHJlZ2lzdGVyCglpZiAoSVBXKCBIUkVHX0NNRCApICYgSENNRF9CVVNZICkgewkJCQkJCQkJCQkJCQkJCQkvKiA4ICovCgkJCQkJCQkJCQkJCS8vLiAgQWNrIGFsbCB0byB1bmJsb2NrIGEgKHBvc3NpYmx5KSBibG9ja2VkIGNtZCBwaXBlIGxpbmUKCQlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKCQkJCQkJCQkJCQkJLy8uICBXYWl0IGZvciBCdXN5IGJpdCBkcm9wICBpbiBDbWQgcmVnaXN0ZXIKCQkJCQkJCQkJCQkJLy8uICBXYWl0IGZvciBDbWQgIGJpdCByYWlzZSBpbiBFdiAgcmVnaXN0ZXIKCQlIQ0ZfV0FJVF9XSElMRSggKCBJUFcoIEhSRUdfQ01EICkgJiBIQ01EX0JVU1kgKSAmJiAoSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKCQlJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUKSApICkgLyogaWYgcHJvdF9jbnQgPT0gMCwgY21kX2V4ZSB3aWxsIGZhaWwsIGNhdXNpbmcgREVGVU5DVCAqLwoJfQoJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7CiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCQkJCQkJCQkJCQkJCQkvKjEyKi8KCSh2b2lkKWNtZF9leGUoIGlmYnAsIEhDTURfSU5JLCAwICk7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKaWYgKCBpb19iYXNlICE9IEhDRl9ESVNDT05ORUNUICkgewoJCXJjID0gaW5pdCggaWZicCApOwkJCQkJCQkJCQkJCQkJCQkJCQkvKjE0Ki8KCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewoJCQl4LmxlbiA9IDI7CgkJCXgudHlwID0gQ0ZHX05JQ19CVVNfVFlQRTsKCQkJKHZvaWQpaGNmX2dldF9pbmZvKCBpZmJwLCAmeCApOwoJCQlpZmJwLT5JRkJfQnVzVHlwZSA9IHgudmFsWzBdOwoJCQkvL0NGR19OSUNfQlVTX1RZUEUgbm90IHN1cHBvcnRlZCAtPiBkZWZhdWx0IDMyIGJpdHMvRE1BLCBNU0YgaGFzIHRvIG92ZXJydWxlIHZpYSBDRkdfQ05UTF9PUFQKCQkJaWYgKCB4LmxlbiA9PSAwIHx8IHgudmFsWzBdID09IDB4MDAwMiB8fCB4LnZhbFswXSA9PSAweDAwMDMgKSB7CiNpZiAoSENGX0lPKSAmIEhDRl9JT18zMkJJVFMKCQkJCWlmYnAtPklGQl9DbnRsT3B0ICY9IH5VU0VfMTZCSVQ7CQkJLy9yZXNldCBVU0VfMTZCSVQKI2VuZGlmIC8vIEhDRl9JT18zMkJJVFMKI2lmIEhDRl9ETUEKCQkJCWlmYnAtPklGQl9DbnRsT3B0IHw9IFVTRV9ETUE7CQkJCS8vU0VUIERNQQojZWxzZQoJCQkJaWZicC0+SUZCX0lPUmFuZ2UgPSAweDQwIC8qaS5zLm8uIEhSRUdfSU9fUkFOR0UqLzsKI2VuZGlmIC8vIEhDRl9ETUEKCQkJfQoJCX0KCX0gZWxzZSBIQ0ZBU1NFUlQoICAoIGlmYnAtPklGQl9NYWdpYyBePSBIQ0ZfTUFHSUMgKSA9PSAwLCBpZmJwLT5JRkJfTWFnaWMgKSAvKk5PUCovOwoJLyogb2YgYWJvdmUgSENGQVNTRVJUIG9ubHkgdGhlIHNpZGUgZWZmZWN0IGlzIG5lZWRlZCwgTk9QIGluIGNhc2UgSENGQVNTRVJUIGlzIGR1bW15ICovCglpZmJwLT5JRkJfSU9CYXNlID0gaW9fYmFzZTsJCQkJCQkJCQkJCQkJCQkJCQkvKiAwKi8KCXJldHVybiByYzsKfSAvLyBoY2ZfY29ubmVjdAoKI2lmIEhDRl9ETUEKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEZ1bmN0aW9uIGdldF9mcmFtZV9sc3QKKiAgLSByZXNvbHZlIHRoZSAibGFzdCBob3N0LW93bmVkIGRlc2NyaXB0b3IiIHByb2JsZW1zIHdoZW4gYSBkZXNjcmlwdG9yIGxpc3QgaXMgcmVjbGFpbWVkIGJ5IHRoZSBNU0YuCioKKiBUaGUgRnJhbWVMaXN0IHRvIGJlIHJlY2xhaW1lZCBhcyB3ZWxsIGFzIHRoZSBEZXNjcmlwdG9yTGlzdCBhbHdheXMgc3RhcnQgaW4gSUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXQoqIGFuZCB0aGlzIGlzIGFsd2F5cyB0aGUgImN1cnJlbnQiIERFTFdBIERlc2NyaXB0b3IuCioKKiBJZiBhIEZyYW1lTGlzdCBpcyBhdmFpbGFibGUsIHRoZSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCB0byB0dXJuZWQgaW50byBhIG5ldyBERUxXQSBEZXNjcmlwdG9yOgoqICAtIGEgY29weSBpcyBtYWRlIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCBpbnRvIHRoZSBjdXJyZW50CioJIERFTFdBIERlc2NyaXB0b3IKKiAgLSB0aGUgcmVtYWluZGVyIG9mIHRoZSBEZXNjcmlwdG9yTGlzdCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBjb3B5IGJ5IHNldHRpbmcgdGhlIG5leHRfZGVzY19hZGRyIGF0IE5VTEwKKiAgLSB0aGUgRE1BIGNvbnRyb2wgYml0cyBvZiB0aGUgY29weSBhcmUgY2xlYXJlZCB0byBkbyBub3QgY29uZnVzZSB0aGUgTVNGCiogIC0gdGhlIGNvcHkgb2YgdGhlIGxhc3QgZGVzY3JpcHRvciAoaS5lLiB0aGUgIm9sZCIgREVMV0EgRGVzY3JpcHRvcikgaXMgY2hhaW5lZCB0byB0aGUgcHJldiBEZXNjcmlwdG9yCioJIG9mIHRoZSBGcmFtZUxpc3QsIHRodXMgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBsYXN0IERlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdC4KKiAgLSBJRkJfRmlyc3REZXNjIGlzIGNoYW5nZWQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhhdCByZXBsYWNlZCAob3JpZ2luYWwpIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0LAoqCSBpLmUuIHRoZSAibmV3IiBERUxXQSBEZXNjcmlwdG9yLgoqCiogVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGNvcHkgb2YgdGhhdCBsYXN0IGhvc3Qtb3duZWQgZGVzY3JpcHRvciwgc28gdGhlIE1TRiB3aWxsIGdldCBhIGNvcHkgb2YgdGhlIGRlc2NyaXB0b3IuCiogT24gdG9wIG9mIHRoYXQsIGl0IGFkanVzdHMgRE1BIHJlbGF0ZWQgZmllbGRzIGluIHRoZSBJRkIgc3RydWN0dXJlLgoJLy8gcGVyZm9ybSBhIGNvcHlpbmctc2NoZW1lIHRvIGNpcmN1bXZlbnQgdGhlICdsYXN0IGhvc3Qgb3duZWQgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmVjbGFpbWVkJyBsaW1pdGF0aW9uIGltcG9zZWQgYnkgSDIuNSdzIERNQSBoYXJkd2FyZSBkZXNpZ24KCS8vIGEgJ3JlY2xhaW0gZGVzY3JpcHRvcicgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgSENGOgoqCiogUmV0dXJuczogYWRkcmVzcyBvZiB0aGUgZmlyc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0CioKIDg6IEJlIGNhcmVmdWwgb25jZSB5b3Ugc3RhcnQgcmUtb3JkZXJpbmcgdGhlIHN0ZXBzIGluIHRoZSBjb3B5IHByb2Nlc3MsIHRoYXQgaXQgc3RpbGwgd29ya3MgZm9yIGNhc2VzCiogCW9mIEZyYW1lTGlzdHMgb2YgMSwgMiBhbmQgbW9yZSB0aGFuIDIgZGVzY3JpcHRvcnMKKgoqIElucHV0IHBhcmFtZXRlcnM6CiogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIERFU0NfU1RSQ1QqCmdldF9mcmFtZV9sc3QoIElGQlAgaWZicCwgaW50IHR4X3J4X2ZsYWcgKQp7CgpERVNDX1NUUkNUICpoZWFkID0gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXTsKREVTQ19TVFJDVCAqY29weSwgKnAsICpwcmV2OwoKCUhDRkFTU0VSVCggdHhfcnhfZmxhZyA9PSBETUFfUlggfHwgdHhfcnhfZmxhZyA9PSBETUFfVFgsIHR4X3J4X2ZsYWcgKQoJCQkJCQkJCS8vaWYgRnJhbWVMaXN0CglpZiAoIGhlYWQgKSB7CgkJCQkJCQkJLy8uICBzZWFyY2ggZm9yIGxhc3QgZGVzY3JpcHRvciBvZiBmaXJzdCBGcmFtZUxpc3QKCQlwID0gcHJldiA9IGhlYWQ7CgkJd2hpbGUgKCAoIHAtPkJVRl9TSVpFICYgREVTQ19FT1AgKSA9PSAwICYmIHAtPm5leHRfZGVzY19hZGRyICkgewoJCQlpZiAoICggaWZicC0+SUZCX0NudGxPcHQgJiBETUFfRU5BQkxFRCApID09IDAgKSB7CS8vY2xlYXIgY29udHJvbCBiaXRzIHdoZW4gZGlzYWJsZWQKCQkJCXAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsKCQkJfQoJCQlwcmV2ID0gcDsKCQkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwoJCX0KCQkJCQkJCQkvLy4gIGlmIERNQSBlbmFibGVkCgkJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIERNQV9FTkFCTEVEICkgewoJCQkJCQkJCS8vLiAgLiAgaWYgbGFzdCBkZXNjcmlwdG9yIG9mIEZyYW1lTGlzdCBpcyBETUEgb3duZWQKCQkJCQkJCQkvLy4gIC4gIG9yIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yCgkJCWlmICggcC0+QlVGX0NOVCAmIERFU0NfRE1BX09XTkVEIHx8IGhlYWQtPm5leHRfZGVzY19hZGRyID09IE5VTEwgKSB7CgkJCQkJCQkJLy8uICAuICAuICByZWZ1c2UgdG8gcmV0dXJuIEZyYW1lTGlzdCB0byBjYWxsZXIKCQkJCWhlYWQgPSBOVUxMOwoJCQl9CgkJfQoJfQoJCQkJCQkJCS8vaWYgcmV0dXJuYWJsZSBGcmFtZUxpc3QgZm91bmQKCWlmICggaGVhZCApIHsKCQkJCQkJCQkvLy4gIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yIChpbXBsaWVzIERNQSBkaXNhYmxlZCkKIAkJaWYgKCBoZWFkLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMICkgewoJCQkJCQkJCS8vLiAgLiAgY2xlYXIgRGVzY3JpcHRvckxpc3QKCQkJLyo7P2lmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9Ki8gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IE5VTEw7CgkJCQkJCQkJLy8uICBlbHNlCgkJfSBlbHNlIHsKCQkJCQkJCQkvLy4gIC4gIHN0cmlwIGhhcmR3YXJlLXJlbGF0ZWQgYml0cyBmcm9tIGxhc3QgZGVzY3JpcHRvcgoJCQkJCQkJCS8vLiAgLiAgcmVtb3ZlIERFTFdBIERlc2NyaXB0b3IgZnJvbSBoZWFkIG9mIERlc2NyaXB0b3JMaXN0CgkJCWNvcHkgPSBoZWFkOwoJIAkJaGVhZCA9IGhlYWQtPm5leHRfZGVzY19hZGRyOwoJCQkJCQkJCS8vLiAgIC4gIGV4Y2hhbmdlIGZpcnN0IChDb25maW5lZCkgYW5kIGxhc3QgKHBvc3NpYmx5IGltcHJpc29uZWQpIERlc2NyaXB0b3IKCQkJY29weS0+YnVmX3BoeXNfYWRkciA9IHAtPmJ1Zl9waHlzX2FkZHI7CgkJCWNvcHktPmJ1Zl9hZGRyID0gcC0+YnVmX2FkZHI7CgkJCWNvcHktPkJVRl9TSVpFID0gcC0+QlVGX1NJWkUgJj0gREVTQ19DTlRfTUFTSzsJLy9nZXQgcmlkIG9mIERFU0NfRU9QIGFuZCBwb3NzaWJseSBERVNDX1NPUAoJCQljb3B5LT5CVUZfQ05UID0gcC0+QlVGX0NOVCAmPSBERVNDX0NOVF9NQVNLOwkvL2dldCByaWQgb2YgREVTQ19ETUFfT1dORUQKI2lmIChIQ0ZfRVhUKSAmIEhDRl9ERVNDX1NUUkNUX0VYVAoJCQljb3B5LT5ERVNDX01TRlN1cCA9IHAtPkRFU0NfTVNGU3VwOwojZW5kaWYgLy8gSENGX0RFU0NfU1RSQ1RfRVhUCgkJCQkJCQkJLy8uICAuICB0dXJuIGludG8gYSBERUxXQSBEZXNjcmlwdG9yCgkJCXAtPmJ1Zl9hZGRyID0gTlVMTDsKCQkJCQkJCQkvLy4gIC4gIGNoYWluIGNvcHkgdG8gcHJldgkJCQkJCQkJCQkJLyogOCovCgkJCXByZXYtPm5leHRfZGVzY19hZGRyID0gY29weTsKCQkJCQkJCQkvLy4gIC4gIGRldGFjaCByZW1haW5kZXIgb2YgdGhlIERlc2NyaXB0b3JMaXN0IGZyb20gRnJhbWVMaXN0CgkJCWNvcHktPm5leHRfZGVzY19hZGRyID0gTlVMTDsKCQkJY29weS0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IDB4REVBRDAwMDA7IC8vISBqdXN0IHRvIGJlIG5pY2UsIG5vdCByZWFsbHkgbmVlZGVkCgkJCQkJCQkJLy8uICAuICBzYXZlIHRoZSBuZXcgc3RhcnQgKGkuZS4gREVMV0EgRGVzY3JpcHRvcikgaW4gSUZCX0ZpcnN0RGVzYwoJCQlpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gcDsKCQl9CgkJCQkJCQkJLy8uICBzdHJpcCBERVNDX1NPUCBmcm9tIGZpcnN0IGRlc2NyaXB0b3IKCQloZWFkLT5CVUZfU0laRSAmPSBERVNDX0NOVF9NQVNLOwoJCS8vaGVhZC0+QlVGX0NOVCAmPSBERVNDX0NOVF9NQVNLOyAgZ2V0IHJpZCBvZiBERVNDX0RNQV9PV05FRAoJCWhlYWQtPm5leHRfZGVzY19waHlzX2FkZHIgPSAweERFQUQwMDAwOyAvLyEganVzdCB0byBiZSBuaWNlLCBub3QgcmVhbGx5IG5lZWRlZAoJfQoJCQkJCQkJCS8vcmV0dXJuIHRoZSBqdXN0IGRldGFjaGVkIEZyYW1lTGlzdCAoaWYgYW55KQoJcmV0dXJuIGhlYWQ7Cn0gLy8gZ2V0X2ZyYW1lX2xzdAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGdW5jdGlvbiBwdXRfZnJhbWVfbHN0CioKKiBUaGlzIGZ1bmN0aW9uCioKKiBSZXR1cm5zOiBhZGRyZXNzIG9mIHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QKKgoqIElucHV0IHBhcmFtZXRlcnM6CiogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCioKKiBUaGUgZm9sbG93aW5nIGxpc3Qgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIGhjZl9kbWFfdHgvcnhfcHV0LCBpbiBvcmRlciB0byBnZXQgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQoqIEFzc2VydCBmYWlscyBpZgoqIC0JRE1BIGlzIG5vdCBlbmFibGVkCiogLQlkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAoqIC0JYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKiAtCWEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgoqIC0JdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCiogLQl0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKiAtCWEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAoqIC0JUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQoKKi5OT1RJQ0UKKiBUaGUgYXNzZXJ0cyBtYXJrZWQgd2l0aCAqc2MqIGFyZSByZWFsbHkgc2FuaXR5IGNoZWNrcyBmb3IgdGhlIEhDRiwgdGhleSBjYW4gKHN1cHBvc2VkbHkpIG5vdCBiZSBpbmZsdWVuY2VkCiogYnkgaW5jb3JyZWN0IE1TRiBiZWhhdmlvcgoKCQkvLyBUaGUgTVNGIGlzIHJlcXVpcmVkIHRvIHN1cHBseSB0aGUgSENGIHdpdGggYSBzaW5nbGUgZGVzY3JpcHRvciBmb3IgTVNGIHR4IHJlY2xhaW0gcHVycG9zZXMuCgkJLy8gVGhpcyAncmVjbGFpbSBkZXNjcmlwdG9yJyBjYW4gYmUgcmVjb2duaXplZCBieSB0aGUgZmFjdCB0aGF0IGl0cyBidWZfYWRkciBmaWVsZCBpcyB6ZXJvLgoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkqIEFsdGhvdWdoIG5vdCByZXF1aXJlZCBmcm9tIGEgaGFyZHdhcmUgcGVyc3BlY3RpdmU6CgkqIC0gbWFrZSBlYWNoIGRlc2NyaXB0b3IgaW4gdGhpcyByeC1jaGFpbiBETUEtb3duZWQuCgkqIC0gQWxzbyBzZXQgdGhlIGNvdW50IHRvIHplcm8uIEVPUCBhbmQgU09QIGJpdHMgYXJlIGFsc28gY2xlYXJlZC4KCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCnB1dF9mcmFtZV9sc3QoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGludCB0eF9yeF9mbGFnICkKewoJREVTQ19TVFJDVAkqcCA9IGRlc2NwOwoJaGNmXzE2IHBvcnQ7CgoJSENGQVNTRVJUKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEsIGlmYnAtPklGQl9DbnRsT3B0KSAvL29ubHkgaGNmX2RtYV90eF9wdXQgbXVzdCBhbHNvIGJlIERNQV9FTkFCTEVECglIQ0ZBU1NFUlQoIHR4X3J4X2ZsYWcgPT0gRE1BX1JYIHx8IHR4X3J4X2ZsYWcgPT0gRE1BX1RYLCB0eF9yeF9mbGFnICkKCUhDRkFTU0VSVCggcCAsIDAgKQoKCXdoaWxlICggcCApIHsKCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKXAgJiAzICkgPT0gMCwgKGhjZl8zMilwICkKCQlIQ0ZBU1NFUlQoIChwLT5CVUZfQ05UICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9DTlQgKQoJCUhDRkFTU0VSVCggKHAtPkJVRl9TSVpFICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9TSVpFICkKCQlwLT5CVUZfU0laRSAmPSBERVNDX0NOVF9NQVNLOwkJCQkJLy8hIXRoaXMgU0hPVUxEIGJlIHN1cGVyZmx1b3VzIGluIGNhc2Ugb2YgY29ycmVjdCBNU0YKCQlwLT5CVUZfQ05UICY9IHR4X3J4X2ZsYWcgPT0gRE1BX1JYID8gMCA6IERFU0NfQ05UX01BU0s7CS8vISF0aGlzIFNIT1VMRCBiZSBzdXBlcmZsdW91cyBpbiBjYXNlIG9mIGNvcnJlY3QgTVNGCgkJcC0+QlVGX0NOVCB8PSBERVNDX0RNQV9PV05FRDsKCQlpZiAoIHAtPm5leHRfZGVzY19hZGRyICkgewovLwkJCUhDRkFTU0VSVCggcC0+YnVmX2FkZHIgJiYgcC0+YnVmX3BoeXNfYWRkciAgJiYgcC0+QlVGX1NJWkUgJiYgKy8tIHAtPkJVRl9TSVpFLCAuLi4gKQoJCQlIQ0ZBU1NFUlQoIHAtPm5leHRfZGVzY19hZGRyLT5kZXNjX3BoeXNfYWRkciwgKGhjZl8zMilwLT5uZXh0X2Rlc2NfYWRkciApCgkJCXAtPm5leHRfZGVzY19waHlzX2FkZHIgPSBwLT5uZXh0X2Rlc2NfYWRkci0+ZGVzY19waHlzX2FkZHI7CgkJfSBlbHNlIHsJCQkJCQkJCQkvLwoJCQlwLT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gMDsKCQkJaWYgKCBwLT5idWZfYWRkciA9PSBOVUxMICkgewkJCS8vIERFTFdBIERlc2NyaXB0b3IKCQkJCUhDRkFTU0VSVCggZGVzY3AgPT0gcCwgKGhjZl8zMilkZXNjcCApCS8vc2luZ2xldG9uIERlc2NyaXB0b3JMaXN0CgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPT0gTlVMTCwgKGhjZl8zMilpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddKQoJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPT0gTlVMTCwgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10pCgkJCQlkZXNjcC0+QlVGX0NOVCA9IDA7IC8vJj0gfkRFU0NfRE1BX09XTkVEOwoJCQkJaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IGRlc2NwOwovLyBwYXJ0IG9mIGFsdGVybmF0aXZlIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9IGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBkZXNjcDsKCQkJCQkJCQkJCQkJCS8vIGlmICJyZWN5Y2xpbmciIGEgRnJhbWVMaXN0CgkJCQkJCQkJCQkJCQkvLyAoZS5nLiBjYWxsZWQgZnJvbSBoY2ZfY250bCggSENGX0NOVExfRU5BQkxFICkKCQkJCQkJCQkJCQkJCS8vIC4gIHByZXBhcmUgZm9yIGFjdGl2YXRpb24gRE1BIGNvbnRyb2xsZXIKLy8gcGFydCBvZiBhbHRlcm5hdGl2ZSBkZXNjcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsKCQkJfSBlbHNlIHsJCQkJCQkJCS8vYSAicmVhbCIgRnJhbWVMaXN0LCBoYW5kIGl0IG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApCgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApCgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIgPT0gTlVMTCwKCQkJCQkJICAgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyKQovLwkJCQlwLT5idWZfY250bC5jbnRsX3N0YXQgfD0gREVTQ19ETUFfT1dORUQ7CgkJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyID0gZGVzY3A7CgkJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19waHlzX2FkZHIgPSBkZXNjcC0+ZGVzY19waHlzX2FkZHI7CgkJCQlwb3J0ID0gSFJFR19SWERNQV9QVFIzMjsKCQkJCWlmICggdHhfcnhfZmxhZyApIHsKCQkJCQlwLT5CVUZfU0laRSB8PSBERVNDX0VPUDsJLy8gcCBwb2ludHMgYXQgdGhlIGxhc3QgZGVzY3JpcHRvciBpbiB0aGUgY2FsbGVyLXN1cHBsaWVkIGRlc2NyaXB0b3IgY2hhaW4KCQkJCQlkZXNjcC0+QlVGX1NJWkUgfD0gREVTQ19TT1A7CgkJCQkJcG9ydCA9IEhSRUdfVFhETUFfUFRSMzI7CgkJCQl9CgkJCQlPVVRfUE9SVF9EV09SRCggKGlmYnAtPklGQl9JT0Jhc2UgKyBwb3J0KSwgZGVzY3AtPmRlc2NfcGh5c19hZGRyICk7CgkJCX0KCQkJaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0gcDsKCQl9CgkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwoJfQp9IC8vIHB1dF9mcmFtZV9sc3QKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCURFU0NfU1RSQ1QqIGhjZl9kbWFfcnhfZ2V0KCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCWRlY2Fwc3VsYXRlIGEgbWVzc2FnZSBhbmQgcHJvdmlkZXMgdGhhdCBtZXNzYWdlIHRvIHRoZSBNU0YuCioJCQkJcmVjbGFpbSBhbGwgZGVzY3JpcHRvcnMgaW4gdGhlIHJ4IGRlc2NyaXB0b3IgY2hhaW4uCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMKKglwb2ludGVyIHRvIGEgRnJhbWVMaXN0CioKKi5ERVNDUklQVElPTgoqIGhjZl9kbWFfcnhfZ2V0IGlzIGludGVuZGVkIHRvICByZXR1cm4gYSByZWNlaXZlZCBmcmFtZSB3aGVuIHN1Y2ggYSBmcmFtZSBpcyBkZXBvc2l0ZWQgaW4gSG9zdCBtZW1vcnkgYnkgdGhlCiogRE1BIGVuZ2luZS4gSW4gYWRkaXRpb24gaGNmX2RtYV9yeF9nZXQgY2FuIGJlIHVzZWQgdG8gcmVjbGFpbSBhbGwgZGVzY3JpcHRvcnMgaW4gdGhlIHJ4IGRlc2NyaXB0b3IgY2hhaW4KKiB3aGVuIHRoZSBETUEgRW5naW5lIGlzIGRpc2FibGVkLCBlLmcuIGFzIHBhcnQgb2YgYSBkcml2ZXIgdW5sb2FkaW5nIHN0cmF0ZWd5LgoqIGhjZl9kbWFfcnhfZ2V0IG11c3QgYmUgY2FsbGVkIHJlcGVhdGVkbHkgYnkgdGhlIE1TRiB3aGVuIGhjZl9zZXJ2aWNlX25pYyBzaWduYWxzIGF2YWlsYWJpbGl0eSBvZiBhIHJ4IGZyYW1lCiogdGhyb3VnaCB0aGUgSFJFR19FVl9SRE1BRCBmbGFnIG9mIElGQl9EbWFQYWNrZXRzLiBUaGUgY2FsbGluZyBtdXN0IHN0b3Agd2hlbiBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZCwgYXQKKiB3aGljaCB0aW1lIHRoZSBIUkVHX0VWX1JETUFEIGZsYWcgaXMgYWxzbyBjbGVhcmVkIGJ5IHRoZSBIQ0YgdG8gYXJtIHRoZSBtZWNoYW5pc20gZm9yIHRoZSBuZXh0IGZyYW1lCiogcmVjZXB0aW9uLgoqIFJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgRE1BIEVuZ2luZSBpcyBjdXJyZW50bHkgZW5hYmxlZCAoYXMgY29udHJvbGxlZCB2aWEgaGNmX2NudGwpLCBpZiB0aGUgRE1BIGNvbnRyb2xsZXIKKiBkZXBvc2l0ZWQgYW4gUngtZnJhbWUgaW4gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGlzIGZyYW1lIGlzIGRldGFjaGVkIGZyb20gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LAoqIHRyYW5zZm9ybWVkIGludG8gYSBGcmFtZUxpc3QgKGkuZS4gIHVwZGF0aW5nIHRoZSBob3VzZWtlZXBpbmcgZmllbGRzIGluIHRoZSBkZXNjcmlwdG9ycykgYW5kIHJldHVybmVkIHRvIHRoZQoqIGNhbGxlci4KKiBJZiBubyBzdWNoIFJ4LWZyYW1lIGlzIGF2YWlsYWJsZSBpbiB0aGUgUngtRGVzY3JpcHRvckxpc3QsIHRoZSBiZWhhdmlvciBvZiBoY2ZfZG1hX3J4X2dldCBkZXBlbmRzIG9uIHRoZQoqIHN0YXR1cyBvZiB0aGUgRE1BIEVuZ2luZS4KKiBJZiB0aGUgRE1BIEVuZ2luZSBpcyBlbmFibGVkLCBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KKiBJZiB0aGUgRE1BIEVuZ2luZSBpcyBkaXNhYmxlZCwgdGhlIGZvbGxvd2luZyBzdHJhdGVneSBpcyB1c2VkOgoqIC0gdGhlIGNvbXBsZXRlIFJ4LURlc2NyaXB0b3JMaXN0IGlzIHJldHVybmVkLiBUaGUgREVMV0EgRGVzY3JpcHRvciBpcyBub3QgcGFydCBvZiB0aGUgUngtRGVzY3JpcHRvckxpc3QuCiogLSBJZiB0aGVyZSBpcyBubyBSeC1EZXNjcmlwdG9yTGlzdCwgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgcmV0dXJuZWQuCiogLSBJZiB0aGVyZSBpcyBubyBERUxXQSBEZXNjcmlwdG9yLCBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KKgoqIElmIHRoZSBNU0YgcGVyZm9ybXMgYW4gZGlzYWJsZS9lbmFibGUgc2VxdWVuY2Ugd2l0aG91dCBleGhhdXN0aW5nIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCBhcyBkZXNjcmliZWQgYWJvdmUsCiogdGhlIGVuYWJsZSBjb21tYW5kIHdpbGwgcmVzZXQgYWxsIGhvdXNlIGtlZXBpbmcgaW5mb3JtYXRpb24sIGkuZS4gYWxyZWFkeSByZWNlaXZlZCBidXQgbm90IHlldCBieSB0aGUgTVNGCiogcmV0cmlldmVkIGZyYW1lcyBhcmUgbG9zdCBhbmQgdGhlIG5leHQgZnJhbWUgd2lsbCBiZSByZWNlaXZlZCBzdGFydGluZyB3aXRoIHRoZSBvbGRlc3QgZGVzY3JpcHRvci4KKgoqIFRoZSBIQ0YgY2FuIGJlIHVzZWQgaW4gMiBmYXNoaW9uczogd2l0aCBhbmQgd2l0aG91dCBkZWNhcHN1bGF0aW9uIGZvciBkYXRhIHRyYW5zZmVyLgoqIFRoaXMgaXMgY29udHJvbGxlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIEhDRl9FTkMgYml0IG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LgoqIElmIGFwcHJvcHJpYXRlLCBkZWNhcHN1bGF0aW9uIGlzIGRvbmUgYnkgbW92aW5nIHNvbWUgZGF0YSBpbnNpZGUgdGhlIGJ1ZmZlcnMgYW5kIHVwZGF0aW5nIHRoZSBkZXNjcmlwdG9ycwoqIGFjY29yZGluZ2x5LgoqISEgOz8/Pz8/d2hlcmUgZGlkIEkgZGVzY3JpYmUgd2h5IGEgc2ltcGxlIG1hbmlwdWxhdGlvbiB3aXRoIHRoZSBjb3VudCB2YWx1ZXMgZG9lcyBub3Qgc3VmZmljZT8KKgoqLkRJQUdSQU0KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkRFU0NfU1RSQ1QqCmhjZl9kbWFfcnhfZ2V0IChJRkJQIGlmYnApCnsKREVTQ19TVFJDVCAqZGVzY3A7CS8vIHBvaW50ZXIgdG8gc3RhcnQgb2YgRnJhbWVMaXN0CgoJZGVzY3AgPSBnZXRfZnJhbWVfbHN0KCBpZmJwLCBETUFfUlggKTsKCWlmICggZGVzY3AgJiYgZGVzY3AtPmJ1Zl9hZGRyICkgIC8vIWJlIGF3YXJlIG9mIHRoZSBtaXNzaW5nIGN1cmx5IGJyYWNrZXQKCgkJCQkJCQkJCQkJLy9za2lwIGRlY2Fwc3VsYXRpb24gYXQgY29uZmluZWQgZGVzY3JpcHRvcgojaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAoJaWYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkKI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAogICAgewppbnQgaTsKREVTQ19TVFJDVCAqcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsJLy9wb2ludGVyIHRvIDJuZCBkZXNjcmlwdG9yIG9mIGZyYW1lCgkJSENGQVNTRVJUKHAsIDApCgkJLy8gVGhlIDJuZCBkZXNjcmlwdG9yIGNvbnRhaW5zIChtYXliZSkgYSBTTkFQIGhlYWRlciBwbHVzIHBhcnQgb3Igd2hvbGUgb2YgdGhlIHBheWxvYWQuCgkJLy9kZXRlcm1pbmUgZGVjYXBzdWxhdGlvbiBzdWItZmxhZyBpbiBSeEZTCgkJaSA9ICood2NpX3JlY29yZHApJmRlc2NwLT5idWZfYWRkcltIRlNfU1RBVF0gJiAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICk7CgkJaWYgKCBpID09IEhGU19TVEFUX1RVTk5FTCB8fAoJCQkgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgIT0gRU5DX1RVTk5FTCApKSB7CgkJCS8vIFRoZSAybmQgZGVzY3JpcHRvciBjb250YWlucyBhIFNOQVAgaGVhZGVyIHBsdXMgcGFydCBvciB3aG9sZSBvZiB0aGUgcGF5bG9hZC4KCQkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID09IChwLT5idWZfYWRkcls1XSArIChwLT5idWZfYWRkcls0XTw8OCkgKyAyKjYgKyAyIC0gOCksIHAtPkJVRl9DTlQgKQoJCQkvLyBwZXJmb3JtIGRlY2Fwc3VsYXRpb24KCQkJSENGQVNTRVJUKHAtPkJVRl9TSVpFID49OCwgcC0+QlVGX1NJWkUpCgkJCS8vIG1vdmUgU0FbMjo1XSBpbiB0aGUgc2Vjb25kIGJ1ZmZlciB0byByZXBsYWNlIHBhcnQgb2YgdGhlIFNOQVAgaGVhZGVyCgkJCWZvciAoIGk9MzsgaSA+PSAwOyBpLS0pIHAtPmJ1Zl9hZGRyW2krOF0gPSBwLT5idWZfYWRkcltpXTsKCQkJLy8gY29weSBEQVswOjVdLCBTQVswOjFdIGZyb20gZmlyc3QgYnVmZmVyIHRvIHNlY29uZCBidWZmZXIKCQkJZm9yICggaT0wOyBpPDg7IGkrKykgcC0+YnVmX2FkZHJbaV0gPSBkZXNjcC0+YnVmX2FkZHJbSEZTX0FERFJfREVTVCArIGldOwoJCQkvLyBtYWtlIGZpcnN0IGJ1ZmZlciBzaG9ydGVyIGluIGNvdW50CgkJCWRlc2NwLT5CVUZfQ05UID0gSEZTX0FERFJfREVTVDsKCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfRU5DCglpZiAoIGRlc2NwID09IE5VTEwgKSBpZmJwLT5JRkJfRG1hUGFja2V0cyAmPSAoaGNmXzE2KX5IUkVHX0VWX1JETUFEOyAgLy87P2NvdWxkIGJlIGludGVncmF0ZWQgaW50byBnZXRfZnJhbWVfbHN0CglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1JYX0dFVCApCglyZXR1cm4gZGVzY3A7Cn0gLy8gaGNmX2RtYV9yeF9nZXQKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCXZvaWQgaGNmX2RtYV9yeF9wdXQoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AgKQoqLlBVUlBPU0UJCXN1cHBseSBidWZmZXJzIGZvciByZWNlaXZlIHB1cnBvc2VzLgoqCQkJCXN1cHBseSB0aGUgUngtREVMV0EgZGVzY3JpcHRvci4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWRlc2NwCQlhZGRyZXNzIG9mIGEgRGVzY3JpcHRvckxpc3QKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIE1TRiB0byBzdXBwbHkgdGhlIEhDRiB3aXRoIG5ldy9tb3JlIGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCiogVGhlIEhDRiBjYW4gYmUgdXNlZCBpbiAyIGZhc2hpb25zOiB3aXRoIGFuZCB3aXRob3V0IGVuY2Fwc3VsYXRpb24gZm9yIGRhdGEgdHJhbnNmZXIuCiogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCiogQXMgYSBjb25zZXF1ZW5jZSwgc29tZSBhZGRpdGlvbmFsIGNvbnN0YWludHMgYXBwbHkgdG8gdGhlIG51bWJlciBvZiBkZXNjcmlwdG9yIGFuZCB0aGUgYnVmZmVycyBhc3NvY2lhdGVkCiogd2l0aCB0aGUgZmlyc3QgMiBkZXNjcmlwdG9ycy4gSW5kZXBlbmRlbnQgb2YgdGhlIGVuY2Fwc3VsYXRpb24gZmVhdHVyZSwgdGhlIENPVU5UIGZpZWxkcyBhcmUgaWdub3JlZC4KKiBBIHNwZWNpYWwgY2FzZSBpcyB0aGUgc3VwcGx5aW5nIG9mIHRoZSBERUxXQSBkZXNjcmlwdG9yLCB3aGljaCBtdXN0IGJlIHN1cHBsaWVkIGFzIHRoZSBmaXJzdCBkZXNjcmlwdG9yLgoqCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiogLSBOSUMgaW50ZXJydXB0cyBhcmUgbm90IGRpc2FibGVkIHdoaWxlIHJlcXVpcmVkIGJ5IHBhcmFtZXRlciBhY3Rpb24uCiogLSBpbiBjYXNlIGRlY2Fwc3VsYXRpb24gYnkgdGhlIEhDRiBpcyBzZWxlY3RlZDoKKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSB0aGUgZXhhY3Qgc2l6ZSBjb3JyZXNwb25kaW5nIHdpdGggdGhlIFJ4RlMgdXAgdG8gdGhlIDgwMi4zIERlc3RBZGRyCioJCWZpZWxkICg9PSAyOSB3b3JkcykuCioJICAtCVRoZSBGcmFtZUxpc3QgZG9lcyBub3QgY29uc2lzdHMgb2YgYXQgbGVhc3QgMiBEZXNjcmlwdG9ycy4KKgkgIC0JVGhlIHNlY29uZCBkYXRhYnVmZmVyIGRvZXMgbm90IGhhdmUgdGhlIG1pbmltdW0gc2l6ZSBvZiA4IGJ5dGVzLgoqISEgVGhlIDJuZCBwYXJ0IG9mIHRoZSBsaXN0IG9mIGFzc2VydHMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHB1dF9mcmFtZV9sc3QsIGluIG9yZGVyIHRvIGdldAoqISEgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQoqIC0gRE1BIGlzIG5vdCBlbmFibGVkCiogLSBkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAoqIC0gYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKiAtIGEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgoqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCiogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKiAtIGEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAoqISEgLSBQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCioKKi5ESUFHUkFNCioKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApoY2ZfZG1hX3J4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCApCnsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0RNQV9SWF9QVVQsIDB4REEwMSApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCglIQ0ZBU1NFUlRfSU5UCgoJcHV0X2ZyYW1lX2xzdCggaWZicCwgZGVzY3AsIERNQV9SWCApOwojaWYgSENGX0FTU0VSVCAmJiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCglpZiAoIGRlc2NwLT5idWZfYWRkciApIHsKCQlIQ0ZBU1NFUlQoIGRlc2NwLT5CVUZfU0laRSA9PSBIQ0ZfRE1BX1JYX0JVRjFfU0laRSwgZGVzY3AtPkJVRl9TSVpFICkKCQlIQ0ZBU1NFUlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciwgMCApIC8vIGZpcnN0IGRlc2NyaXB0b3Igc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVzY3JpcHRvcgoJCS8vIFRoZSBzZWNvbmQgREIgaXMgZm9yIFNOQVAgYW5kIHBheWxvYWQgcHVycG9zZXMuIEl0IHNob3VsZCBiZSBhIG1pbmltdW0gb2YgMTIgYnl0ZXMgaW4gc2l6ZS4KCQlIQ0ZBU1NFUlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX1NJWkUgPj0gMTIsIGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX1NJWkUgKQoJfQojZW5kaWYgLy8gSENGQVNTRVJUIC8gSENGX0VOQwoJSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9SWF9QVVQgKQp9IC8vIGhjZl9kbWFfcnhfcHV0CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlERVNDX1NUUkNUKiBoY2ZfZG1hX3R4X2dldCggSUZCUCBpZmJwICkKKi5QVVJQT1NFCQlETUEgbW9kZTogcmVjbGFpbXMgYW5kIGRlY2Fwc3VsYXRlcyBwYWNrZXRzIGluIHRoZSB0eCBkZXNjcmlwdG9yIGNoYWluIGlmOgoqCQkJCSAtIEEgVHggcGFja2V0IGhhcyBiZWVuIGNvcGllZCBmcm9tIGhvc3QtUkFNIGludG8gTklDLVJBTSBieSB0aGUgRE1BIGVuZ2luZQoqCQkJCSAtIFRoZSBIZXJtZXMvRE1BZW5naW5lIGhhdmUgYmVlbiBkaXNhYmxlZAoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioKKi5SRVRVUk5TCioJcG9pbnRlciB0byBhIHJlY2xhaW1lZCBUeCBwYWNrZXQuCioKKi5ERVNDUklQVElPTgoqIGltcGFjdCBvZiB0aGUgZGlzYWJsZSBjb21tYW5kOgoqIFdoZW4gYSBub24tZW1wdHkgcG9vbCBvZiBUeCBkZXNjcmlwdG9ycyBleGlzdHMgKGNyZWF0ZWQgYnkgbWVhbnMgb2YgaGNmX2RtYV9wdXRfdHgpLCB0aGUgTVNGCiogaXMgc3VwcG9zZWQgdG8gZW1wdHkgdGhhdCBwb29sIGJ5IG1lYW5zIG9mIGhjZl9kbWFfdHhfZ2V0IGNhbGxzIGFmdGVyIHRoZSBkaXNhYmxlIGluIGFuCiogZGlzYWJsZS9lbmFibGUgc2VxdWVuY2UuCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KREVTQ19TVFJDVCoKaGNmX2RtYV90eF9nZXQoIElGQlAgaWZicCApCnsKREVTQ19TVFJDVCAqZGVzY3A7CS8vIHBvaW50ZXIgdG8gc3RhcnQgb2YgRnJhbWVMaXN0CgoJZGVzY3AgPSBnZXRfZnJhbWVfbHN0KCBpZmJwLCBETUFfVFggKTsKCWlmICggZGVzY3AgJiYgZGVzY3AtPmJ1Zl9hZGRyICkgIC8vIWJlIGF3YXJlIG9mIHRoZSBtaXNzaW5nIGN1cmx5IGJyYWNrZXQKCQkJCQkJCQkJCQkvL3NraXAgZGVjYXBzdWxhdGlvbiBhdCBjb25maW5lZCBkZXNjcmlwdG9yCiNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCgkJaWYgKCAoIGRlc2NwLT5CVUZfQ05UID09IEhGU19UWVBFICkKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKCQkJIHx8ICggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX0RBVCApCiNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKCQkpIHsgLy8gcGVyZm9ybSBkZWNhcHN1bGF0aW9uIGlmIG5lZWRlZAoJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIgLT0gSENGX0RBU0FfU0laRTsKCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfQ05UIAkJICs9IEhDRl9EQVNBX1NJWkU7CgkJfQojZW5kaWYgLy8gSENGX0VOQwoJaWYgKCBkZXNjcCA9PSBOVUxMICkgeyAgLy87P2NvdWxkIGJlIGludGVncmF0ZWQgaW50byBnZXRfZnJhbWVfbHN0CgkJaWZicC0+SUZCX0RtYVBhY2tldHMgJj0gKGhjZl8xNil+SFJFR19FVl9URE1BRDsKCX0KCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfVFhfR0VUICkKCXJldHVybiBkZXNjcDsKfSAvLyBoY2ZfZG1hX3R4X2dldAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJdm9pZCBoY2ZfZG1hX3R4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQoqLlBVUlBPU0UJCXB1dHMgYSBwYWNrZXQgaW4gdGhlIFR4IERNQSBxdWV1ZSBpbiBob3N0IHJhbSBhbmQga2lja3Mgb2ZmIHRoZSBUeERtYSBlbmdpbmUuCioJCQkJc3VwcGx5IHRoZSBUeC1ERUxXQSBkZXNjcmlwdG9yLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJZGVzY3AJCWFkZHJlc3Mgb2YgVHggRGVzY3JpcHRvciBDaGFpbiAoaS5lLiBhIHNpbmdsZSBUeCBmcmFtZSkKKgl0eF9jbnRsCQlpbmRpY2F0ZXMgTUFDLXBvcnQgYW5kIChIZXJtZXMpIG9wdGlvbnMKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogVGhlIEhDRiBjYW4gYmUgdXNlZCBpbiAyIGZhc2hpb25zOiB3aXRoIGFuZCB3aXRob3V0IGVuY2Fwc3VsYXRpb24gZm9yIGRhdGEgdHJhbnNmZXIuCiogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCioKKiBSZWdhcmRsZXNzIG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LCB0aGUgZGVzY3JpcHRvciBsaXN0IGNyZWF0ZWQgdG8gZGVzY3JpYmUgdGhlIGZyYW1lIHRvIGJlCiogdHJhbnNtaXR0ZWQsIG11c3Qgc3VwcGx5IHNwYWNlIHRvIGNvbnRhaW4gdGhlIDgwMi4xMSBoZWFkZXIsIHByZWNlZGluZyB0aGUgYWN0dWFsIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLgoqIEJhc2ljYWxseSwgdGhpcyBvbmx5IHN1cHBsaWVzIHdvcmtpbmcgc3RvcmFnZSB0byB0aGUgSENGIHdoaWNoIHBhc3NlcyB0aGlzIG9uIHRvIHRoZSBETUEgZW5naW5lLgoqIEFzIGEgY29uc2VxdWVuY2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3BhY2UgZG8gbm90IG1hdHRlci4KKiBOZXZlcnRoZWxlc3MgQlVGX0NOVCBtdXN0IHRha2UgaW4gYWNjb3VudCB0aGlzIHN0b3JhZ2UuCiogVGhpcyB3b3JraW5nIHNwYWNlIHRvIGNvbnRhaW4gdGhlIDgwMi4xMSBoZWFkZXIgbWF5IG5vdCBiZSBmcmFnbWVudGVkLCB0aGUgZmlyc3QgYnVmZmVyIG11c3QgYmUKKiBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gY29udGFpbiBhdCBsZWFzdCB0aGUgODAyLjExIGhlYWRlciwgaS5lLiBIRlNfQUREUl9ERVNUICgyOSB3b3JkcyBvciAweDNBIGJ5dGVzKS4KKiBUaGlzIHdheSwgdGhlIEhDRiBjYW4gc2ltcGx5LCByZWdhcmRsZXNzIHdoZXRoZXIgb3Igbm90IHRoZSBIQ0YgZW5jYXBzdWxhdGVzIHRoZSBmcmFtZSwgd3JpdGUgdGhlIHBhcmFtZXRlcgoqIHR4X2NudGwgYXQgb2Zmc2V0IDB4MzYgKEhGU19UWF9DTlRMKSBpbiB0aGUgZmlyc3QgYnVmZmVyLgoqIE5vdGUgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgcGFydCBvciBhbGwgb2YgdGhlIGFjdHVhbCBmcmFtZSByZXByZXNlbnRlZCBieSB0aGUgZmlyc3QgZGVzY3JpcHRvciBhcyBsb25nCiogYXMgdGhlIHJlcXVpcmVtZW50IGZvciBzdG9yYWdlIGZvciB0aGUgODAyLjExIGhlYWRlciBpcyBtZXQsIGkuZS4gdGhlIDgwMi4zIGZyYW1lIHN0YXJ0cyBhdCBvZmZzZXQKKiBIRlNfQUREUl9ERVNULgoqIEV4Y2VwdCBmb3IgdGhlIEFzc2VydCBvbiB0aGUgMXN0IGJ1ZmZlciBpbiBjYXNlIG9mIEVuY2Fwc3VhbHRpb24sIHRoZSBTSVpFIGZpZWxkcyBhcmUgaWdub3JlZC4KKgoqIEluIGNhc2UgdGhlIGVuY2Fwc3VsYXRpb24gZmVhdHVyZSBpcyBjb21waWxlZCBpbiwgdGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCByZXF1aXJlbWVudHMuCiogbyBUaGUgQlVGX0NOVCBvZiB0aGUgZmlyc3QgYnVmZmVyIGNoYW5nZXMgZnJvbSBhIG1pbmltdW0gb2YgMHgzQSBieXRlcyB0byBleGFjdGx5IDB4M0EsIGkuZS4gdGhlIHdvcmtzcGFjZQoqCXRvIHN0b3JlIHRoZSA4MDIuMTEgaGVhZGVyCiogbyBUaGUgQlVGX1NJWkUgb2YgdGhlIGZpcnN0IGJ1ZmZlciBpcyBhdCBsZWFzdCB0aGUgc3BhY2UgbmVlZGVkIHRvIHN0b3JlIHRoZQoqCS0gODAyLjExIGhlYWRlciAoMjkgd29yZHMpCioJLSA4MDIuMyBoZWFkZXIsIGkuZS4gMTIgYnl0ZXMgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgMiBieXRlcyBsZW5ndGggZmllbGQKKgktIDYgYnl0ZXMgU05BUC1oZWFkZXIKKiAgIFRoaXMgcmVzdWx0cyBpbiAzOSB3b3JkcyBvciAweDRFIGJ5dGVzIG9yIEhGU19UWVBFLgoqICAgTm90ZSB0aGF0IGlmIHRoZSBCVUZfU0laRSBpcyBsYXJnZXIgdGhhbiAweDRFLCB0aGlzIHN1cnBsdXMgaXMgbm90IHVzZWQuCiogbyBUaGUgYWN0dWFsIGZyYW1lIGJlZ2lucyBpbiB0aGUgMm5kIGRlc2NyaXB0b3IgKHdoaWNoIGlzIGFscmVhZHkgaW1wbGllZCBieSB0aGUgQlVGX0NOVCA9PSAweDNBIHJlcXVpcmVtZW50KSBhbmQgdGhlIGFzc29jaWF0ZWQgYnVmZmVyIGNvbnRhaW5zIGF0IGxlYXN0IHRoZSA4MDIuMyBoZWFkZXIsIGkuZS4gdGhlIDE0IGJ5dGVzIHJlcHJlc2VudGluZyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIGFuZCBsZW5ndGgvdHlwZSBmaWVsZAoqCiogICBXaGVuIHRoZSBIQ0YgZG9lcyBub3QgZW5jYXBzdWxhdGVzIChpLmUuIGxlbmd0aC90eXBlIGZpZWxkIDw9IDE1MDApLCAgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byBkZXNjcmlwdG9ycwoqICAgb3IgYnVmZmVycy4KKgoqICAgV2hlbiB0aGUgSENGIGFjdHVhbGx5IGVuY2Fwc3VsYXRlcyAoaS5lLiBsZW5ndGgvdHlwZSBmaWVsZCA+IDE1MDApLCBpdCBzdWNjZXNzaXZlbHkgd3JpdGVzLCBzdGFydGluZyBhdAoqICAgb2Zmc2V0IEhGU19BRERSX0RFU1QgKDB4M0EpIGluIHRoZSBmaXJzdCBidWZmZXI6CiogICAgIC0gdGhlIDgwMi4zIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24sIGNvcGllZCBmcm9tIHRoZSBiZWdpbiBvZiB0aGUgc2Vjb25kIGJ1ZmZlcgoqICAgICAtIHRoZSBmcmFtZSBsZW5ndGgsIGRlcml2ZWQgZnJvbSB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbmRpdmlkdWFsIGZyYWdtZW50cywgY29ycmVjdGVkIGZvciB0aGUgU05BUAoqICAgCWhlYWRlciBsZW5ndGggYW5kIFR5cGUgZmllbGQgYW5kIGlnbm9yaW5nIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzLCBTb3VyY2UgQWRkcmVzcyBhbmQgTGVuZ3RoIGZpZWxkCiogCSAgLSB0aGUgYXBwcm9wcmlhdGUgc25hcCBoZWFkZXIgKFR1bm5lbCBvciAxMDQyLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSB0eXBlIGZpZWxkKS4KKgoqIAkgVGhlIGluZm9ybWF0aW9uIGluIHRoZSBmaXJzdCB0d28gZGVzY3JpcHRvcnMgaXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHk6CiogCSAgLSB0aGUgZmlyc3QgZGVzY3JpcHRvciBjb3VudCBpcyBjaGFuZ2VkIGZyb20gMHgzQSB0byAweDRFIChIRlNfVFlQRSksIHdoaWNoIG1hdGNoZXMgMHgzQSArIDEyICsgMiArIDYKKiAJICAtIHRoZSBzZWNvbmQgZGVzY3JpcHRvciBjb3VudCBpcyBkZWNyZWFzZWQgYnkgMTIsIGJlaW5nIHRoZSBtb3ZlZCBhZGRyZXNzaW5nIGluZm9ybWF0aW9uCiogCSAgLSB0aGUgc2Vjb25kIGRlc2NyaXB0b3IgKHBoeXNpY2FsKSBidWZmZXIgYWRkcmVzcyBpcyBpbmNyZWFzZWQgYnkgMTIuCioKKiBXaGVuIHRoZSBkZXNjcmlwdG9ycyBhcmUgcmV0dXJuZWQgYnkgaGNmX2RtYV90eF9nZXQsIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzCiogdW5kb25lLgoqCiogVW5kZXIgYW55IG9mIHRoZSBhYm92ZSBzY2VuYXJpb3MsIHRoZSBhc3NlcnQgQlVGX0NOVCA8PSBCVUZfU0laRSBtdXN0IGJlIHRydWUgZm9yIGFsbCBkZXNjcmlwdG9ycwoqIEluIGNhc2Ugb2YgZW5jYXBzdWxhdGlvbiwgQlVGX1NJWkUgb2YgdGhlIDFzdCBkZXNjcmlwdG9yIGlzIGFzc2VydGVkIHRvIGJlIGF0IGxlYXN0IEhGU19UWVBFICgweDRFKSwgc28gaXQgaXMgTk9UIHRlc3RlZC4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gdHhfY250bCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgoqIC0gaW4gY2FzZSBlbmNhcHN1bGF0aW9uIGJ5IHRoZSBIQ0YgaXMgc2VsZWN0ZWQ6CioJICAtCVRoZSBGcmFtZUxpc3QgZG9lcyBub3QgY29uc2lzdHMgb2YgYXQgbGVhc3QgMiBEZXNjcmlwdG9ycy4KKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgY29udGFpbiBleGFjdGx5IHRoZSAoc3BhY2UgZm9yKSB0aGUgODAyLjExIGhlYWRlciAoPT0gMjggd29yZHMpCioJICAtCVRoZSBmaXJzdCBkYXRhYnVmZmVyIGRvZXMgbm90IGhhdmUgYSBzaXplIHRvIGFkZGl0aW9uYWxseSBhY2NvbW9kYXRlIHRoZSA4MDIuMyBoZWFkZXIgYW5kIHRoZQoqCQlTTkFQIGhlYWRlciBvZiB0aGUgZnJhbWUgYWZ0ZXIgZW5jYXBzdWxhdGlvbiAoPT0gMzkgd29yZHMpLgoqCSAgLQlUaGUgc2Vjb25kIGRhdGFidWZmZXIgZG9lcyBub3QgY29udGFpbiBhdCBsZWFzdCBEQSwgU0EgYW5kICd0eXBlL2xlbmd0aCcgKD09MTQgYnl0ZXMgb3IgNyB3b3JkcykKKiEhIFRoZSAybmQgcGFydCBvZiB0aGUgbGlzdCBvZiBhc3NlcnRzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBwdXRfZnJhbWVfbHN0LCBpbiBvcmRlciB0byBnZXQKKiEhIHRoZW0gaW4gdGhlIFdDSS1zcGVjICEhISEKKiAtIERNQSBpcyBub3QgZW5hYmxlZAoqIC0gZGVzY3JpcHRvciBsaXN0IGlzIE5VTEwKKiAtIGEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCiogLSBhIGNvdW50IG9mIHNpemUgZmllbGQgb2YgYSBkZXNjcmlwdG9yIGNvbnRhaW5zIGNvbnRyb2wgYml0cywgaS5lLiBiaXRzIGluIHRoZSBoaWdoIG9yZGVyIG5pYmJsZS4KKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCBhICJzaW5nbGV0b24iIERlc2NyaXB0b3JMaXN0LgoqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCiogLSBhIG5vbl9ETUEgZGVzY3JpcHRvciBpcyBzdXBwbGllZCBiZWZvcmUgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgc3VwcGxpZWQKKiEhIC0gUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQoqLkRJQUdSQU0KKgoqLk5PVElDRQoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKgoqMToJV3JpdGUgdHhfY250bCBwYXJhbWV0ZXIgdG8gSEZTX1RYX0NOVEwgZmllbGQgaW50byB0aGUgSGVybWVzLXNwZWNpZmljIGhlYWRlciBpbiBidWZmZXIgMQoqNDoJZGV0ZXJtaW5lIHdoZXRoZXIgZW5jYXBzdWxhdGlvbiBpcyBuZWVkZWQgYW5kIHdyaXRlIHRoZSB0eXBlICh0dW5uZWwgb3IgMTA0MikgYWxyZWFkeSBhdCB0aGUgYXBwcm9wcmlhdGUKKglvZmZzZXQgaW4gdGhlIDFzdCBidWZmZXIKKjY6CUJ1aWxkIHRoZSBlbmNhcHN1YWx0aW9uIGVudmVsb3BwZSBpbiB0aGUgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSAxc3QgYnVmZmVyCioJLSBDb3B5IERBL1NBIGZpZWxkcyBmcm9tIHRoZSAybmQgYnVmZmVyCiogICAtIENhbGN1bGF0ZSB0b3RhbCBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgKHNuYXAtaGVhZGVyICsgdHlwZS1maWVsZCArIHRoZSBsZW5ndGggb2YgYWxsIGJ1ZmZlciBmcmFnbWVudHMKKiAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSA4MDIuMyBmcmFtZSAoaS5lIGFsbCBkZXNjcmlwdG9ycyBleGNlcHQgdGhlIGZpcnN0KSwgYnV0IG5vdCB0aGUgRGVzdGluYXRpb25BZGRyZXNzLAoqICAgICBTb3VyY2VBZGRyZXNzIGFuZCBsZW5naHQtZmllbGQpCiogICAgIEFzc2VydCB0aGUgbWVzc2FnZSBsZW5ndGgKKgkgIFdyaXRlIGxlbmd0aC4gTm90ZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGluIEJFIGZvcm1hdCwgaGVuY2Ugb24gTEUgcGxhdGZvcm1zIHRoZSBsZW5ndGggbXVzdCBiZSBjb252ZXJ0ZWQKKgkgIDs/IFRISVMgSVMgTk9UIFdIQVQgQ1VSUkVOVExZIElTIElNUExFTUVOVEVECioJLSBXcml0ZSBzbmFwIGhlYWRlci4gTm90ZSB0aGF0IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHNuYXAgaGVhZGVyIGlzIE5PVCBjb3BpZWQsIHRoYXQgYnl0ZSBpcyBhbHJlYWR5IGluCioJICBwbGFjZSBhcyByZXN1bHQgb2YgdGhlIGNhbGwgdG8gaGNmX2VuY2FwLgoqCU5vdGUgdGhhdCB0aGVyZSBhcmUgbWFueSB3YXlzIHRvIHNraW4gYSBjYXQuIFRvIGV4cHJlc3MgdGhlIG9mZnNldHMgaW4gdGhlIDFzdCBidWZmZXIgd2hpbGUgd3JpdGluZwoqCXRoZSBzbmFwIGhlYWRlciwgSEZTX1RZUEUgaXMgY2hvb3NlbiBhcyBhIHJlZmVyZW5jZSBwb2ludCB0byBtYWtlIGl0IGVhc2llciB0byBncmFzcCB0aGF0IHRoZSBzbmFwIGhlYWRlcgoqCWFuZCBlbmNhcHN1YWx0aW9uIHR5cGUgYXJlIGF0IGxlYXN0IHJlbGF0aXZlIGluIHRoZSByaWdodC4KKjg6CW1vZGlmeSAxc3QgZGVzY3JpcHRvciB0byByZWZsZWN0IG1vdmVkIHBhcnQgb2YgdGhlIDgwMi4zIGhlYWRlciArIFNuYXAtaGVhZGVyCioJbW9kaWZ5IDJuZCBkZXNjcmlwdG9yIHRvIHNraXAgdGhlIG1vdmVkIHBhcnQgb2YgdGhlIDgwMi4zIGhlYWRlciAoREEvU0EKKjEwOiBzZXQgZWFjaCBkZXNjcmlwdG9yIHRvICdETUEgb3duZWQnLCAgY2xlYXIgYWxsIG90aGVyIGNvbnRyb2wgYml0cy4KKglTZXQgU09QIGJpdCBvbiBmaXJzdCBkZXNjcmlwdG9yLiBTZXQgRU9QIGJpdCBvbiBsYXN0IGRlc2NyaXB0b3IuCioxMjogRWl0aGVyIGFwcGVuZCB0aGUgY3VycmVudCBmcmFtZSB0byBhbiBleGlzdGluZyBkZXNjcmlwdG9yIGxpc3Qgb3IKKjE0OiBjcmVhdGUgYSBsaXN0IGJlZ2lubmluZyB3aXRoIHRoZSBjdXJyZW50IGZyYW1lCioxNjogcmVtZW1iZXIgdGhlIG5ldyBlbmQgb2YgdGhlIGxpc3QKKjIwOiBoYW5kIHRoZSBmcmFtZSBvdmVyIHRvIHRoZSBETUEgZW5naW5lCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApoY2ZfZG1hX3R4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQp7CkRFU0NfU1RSQ1QJKnAgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHI7CmludAkJCWk7CgojaWYgSENGX0FTU0VSVAoJaW50IHggPSBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID09IENPTVBfSURfRldfQVAgPyB0eF9jbnRsICYgfkhGU19UWF9DTlRMX1BPUlQgOiB0eF9jbnRsOwoJSENGQVNTRVJUKCAoeCAmIH5IQ0ZfVFhfQ05UTF9NQVNLICkgPT0gMCwgdHhfY250bCApCiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0RNQV9UWF9QVVQsIDB4REEwMyApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCglIQ0ZBU1NFUlRfSU5UCglIQ0ZBU1NFUlQoICggaWZicC0+SUZCX0NudGxPcHQgJiAoVVNFX0RNQXxETUFfRU5BQkxFRCkgKSA9PSAoVVNFX0RNQXxETUFfRU5BQkxFRCksIGlmYnAtPklGQl9DbnRsT3B0KQoKCWlmICggZGVzY3AtPmJ1Zl9hZGRyICkgewoJCSooaGNmXzE2KikoZGVzY3AtPmJ1Zl9hZGRyICsgSEZTX1RYX0NOVEwpID0gdHhfY250bDsJCQkJCQkJCQkJCS8qMSovCiNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCgkJSENGQVNTRVJUKCBkZXNjcC0+bmV4dF9kZXNjX2FkZHIsIDAgKQkJCQkJCQkJCS8vYXQgbGVhc3QgMiBkZXNjcmlwb3JzCgkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX0NOVCA9PSBIRlNfQUREUl9ERVNULCBkZXNjcC0+QlVGX0NOVCApCS8vZXhhY3QgbGVuZ3RoIHJlcXVpcmVkIGZvciAxc3QgYnVmZmVyCgkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX1NJWkUgPj0gSENGX0RNQV9UWF9CVUYxX1NJWkUsIGRlc2NwLT5CVUZfU0laRSApCS8vbWluaW1hbCBzdG9yYWdlIGZvciBlbmNhcHN1bGF0aW9uCgkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID49IDE0LCBwLT5CVUZfQ05UICk7CQkJCQkvL2F0IGxlYXN0IERBLCBTQSBhbmQgJ3R5cGUnIGluIDJuZCBidWZmZXIKCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCgkJLyogaWYgd2UgYXJlIGRvaW5nIFBQSyArLy0gQ01JQywgb3Igd2UgYXJlIHNlbmRpbmcgYSBERFAgZnJhbWUgKi8KCQlpZiAoICggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09OICkgfHwKCQkJICggKCBwLT5CVUZfQ05UID49IDIwICkJCSAmJiAoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PRkYgKSAmJgoJCQkgKCBwLT5idWZfYWRkclsxMl0gPT0gMHhBQSApICYmICggcC0+YnVmX2FkZHJbMTNdID09IDB4QUEgKSAmJgoJCQkgKCBwLT5idWZfYWRkclsxNF0gPT0gMHgwMyApICYmICggcC0+YnVmX2FkZHJbMTVdID09IDB4MDAgKSAmJgoJCQkgKCBwLT5idWZfYWRkclsxNl0gPT0gMHg0MCApICYmICggcC0+YnVmX2FkZHJbMTddID09IDB4OTYgKSAmJgoJCQkgKCBwLT5idWZfYWRkclsxOF0gPT0gMHgwMCApICYmICggcC0+YnVmX2FkZHJbMTldID09IDB4MDAgKSkpCgkJewoJCQkvKiBjb3B5IHRoZSBEQS9TQSB0byB0aGUgZmlyc3QgYnVmZmVyICovCgkJCWZvciAoIGkgPSAwOyBpIDwgSENGX0RBU0FfU0laRTsgaSsrICkgewoJCQkJZGVzY3AtPmJ1Zl9hZGRyW2kgKyBIRlNfQUREUl9ERVNUXSA9IHAtPmJ1Zl9hZGRyW2ldOwoJCQl9CgkJCS8qIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmQgZnJhZ21lbnQgb25seSAqLwoJCQlpID0gMDsKCQkJZG8geyBpICs9IHAtPkJVRl9DTlQ7IH0gd2hpbGUoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApOwoJCQlpIC09IEhDRl9EQVNBX1NJWkUgOwoJCQkvKiBjb252ZXJ0IHRoZSBsZW5ndGggZmllbGQgdG8gYmlnIGVuZGlhbiwgdXNpbmcgdGhlIGVuZGlhbiBmcmllbmRseSBtYWNyb3MgKi8KCQkJaSA9IENOVl9TSE9SVF9UT19CSUcoaSk7CQkvLyEhIHRoaXMgY29udmVydHMgT05MWSBvbiBMRSBwbGF0Zm9ybXMsIGhvdyBkb2VzIHRoYXQgcmVsYXRlIHRvIHRoZSBub24tQ0NYIGNvZGUKCQkJKihoY2ZfMTYqKSgmZGVzY3AtPmJ1Zl9hZGRyW0hGU19MRU5dKSA9IChoY2ZfMTYpaTsKCQkJZGVzY3AtPkJVRl9DTlQgPSBIRlNfREFUOwoJCQkvLyBtb2RpZnkgMm5kIGRlc2NyaXB0b3IgdG8gc2tpcCB0aGUgJ0RhL1NhJyBmaWVsZHMKCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfcGh5c19hZGRyICs9IEhDRl9EQVNBX1NJWkU7CgkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX0NOVAkJIC09IEhDRl9EQVNBX1NJWkU7CgkJfQoJCWVsc2UKI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAoJCXsKCQkJZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFLTFdID0gaGNmX2VuY2FwKCZkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdKTsJCS8qNCovCgkJCWlmICggZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFLTFdICE9IEVOQ19OT05FICkgewoJCQkJZm9yICggaT0wOyBpIDwgSENGX0RBU0FfU0laRTsgaSsrICkgewkJCQkJCQkJCQkJCQkJLyo2Ki8KCQkJCQlkZXNjcC0+YnVmX2FkZHJbaSArIEhGU19BRERSX0RFU1RdID0gZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkcltpXTsKCQkJCX0KCQkJCWkgPSBzaXplb2Yoc25hcF9oZWFkZXIpICsgMiAtICggMio2ICsgMiApOwoJCQkJZG8geyBpICs9IHAtPkJVRl9DTlQ7IH0gd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKTsKCQkJCSooaGNmXzE2KikoJmRlc2NwLT5idWZfYWRkcltIRlNfTEVOXSkgPSBDTlZfRU5EX1NIT1JUKGkpOwkvLyEhIHRoaXMgY29udmVydHMgb24gQUxMIHBsYXRmb3JtcywgaG93IGRvZXMgdGhhdCByZWxhdGUgdG8gdGhlIENDWCBjb2RlCgkJCQlmb3IgKCBpPTA7IGkgPCBzaXplb2Yoc25hcF9oZWFkZXIpIC0gMTsgaSsrKSB7CgkJCQkJZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFIC0gc2l6ZW9mKHNuYXBfaGVhZGVyKSArIGldID0gc25hcF9oZWFkZXJbaV07CgkJCQl9CgkJCQlkZXNjcC0+QlVGX0NOVCA9IEhGU19UWVBFOwkJCQkJCQkJCQkJCQkJCQkJLyo4Ki8KCQkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX3BoeXNfYWRkcgkrPSBIQ0ZfREFTQV9TSVpFOwoJCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfQ05UCQkJLT0gSENGX0RBU0FfU0laRTsKCQkJfQoJCX0KI2VuZGlmIC8vIEhDRl9FTkMKICAgIH0KCXB1dF9mcmFtZV9sc3QoIGlmYnAsIGRlc2NwLCBETUFfVFggKTsKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfVFhfUFVUICkKfSAvLyBoY2ZfZG1hX3R4X3B1dAoKI2VuZGlmIC8vIEhDRl9ETUEKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQloY2ZfOCBoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKQoqLlBVUlBPU0UJCXRlc3Qgd2hldGhlciBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBpcyBuZWVkZWQuCioKKi5BUkdVTUVOVFMKKgl0eXBlCQkoRmFyKSBwb2ludGVyIHRvIHRoZSAoQmlnIEVuZGlhbikgVHlwZS9MZW5ndGggZmllbGQgaW4gdGhlIG1lc3NhZ2UKKgoqLlJFVFVSTlMKKglFTkNfTk9ORQkJbGVuL3R5cGUgaXMgImxlbiIgKCAoQklHX0VORElBTil0eXBlIDw9IDE1MDAgKQoqCUVOQ19UVU5ORUwJCWxlbi90eXBlIGlzICJ0eXBlIiBhbmQgMHg4MEYzIG9yIDB4ODEzNwoqCUVOQ18xMDQyCQlsZW4vdHlwZSBpcyAidHlwZSIgYnV0IG5vdCAweDgwRjMgb3IgMHg4MTM3CioKKi5DT05ESVRJT05TCioJTklDIEludGVycnVwdHMJZC5jCioKKi5ERVNDUklQVElPTgoqIFR5cGUgbXVzdCBwb2ludCB0byB0aGUgTGVuL1R5cGUgZmllbGQgb2YgdGhlIG1lc3NhZ2UsIHRoaXMgaXMgdGhlIDItYnl0ZSBmaWVsZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgNiBieXRlCiogRGVzdGluYXRpb24gQWRkcmVzcyBhbmQgNiBieXRlIFNvdXJjZSBBZGRyZXNzLiAgVGhlIDIgc3VjY2Vzc2l2ZSBieXRlcyBhZGRyZXNzZWQgYnkgdHlwZSBhcmUgaW50ZXJwcmV0ZWQgYXMKKiBhIEJpZyBFbmRpYW4gdmFsdWUuICBJZiB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNTAwLCB0aGUgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIGluIDgwMi4zCiogZm9ybWF0LiAgT3RoZXJ3aXNlIHRoZSBtZXNzYWdlIGlzIGFzc3VtZWQgdG8gYmUgaW4gRXRoZXJuZXQtSUkgZm9ybWF0LiAgRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBMZW4vVHlwLAoqIEJyaWRnZSBUdW5uZWwgb3IgUkZDMTA0MiBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZC4KKgoqLkRJQUdSQU0KKgoqICAxOglwcmVzdW1lIDgwMi4zLCBoZW5jZSBwcmVzZXQgcmV0dXJuIHZhbHVlIGF0IEVOQ19OT05FCiogIDI6CWNvbnZlcnQgdHlwZSBmcm9tICJuZXR3b3JrIiBFbmRpYW4gZm9ybWF0IHRvIG5hdGl2ZSBFbmRpYW4KKiAgNDoJdGhlIGxpdG11cyB0ZXN0IHRvIGRpc3Rpbmd1aXNoIHR5cGUgYW5kIGxlbi4KKglUaGUgaGFyZCBjb2RlICJtYWdpYyIgdmFsdWUgb2YgMTUwMCBpcyBpbnRlbnRpb25hbCBhbmQgc2hvdWxkIE5PVCBiZSByZXBsYWNlZCBieSBhIG1uZW1vbmljIGJlY2F1c2UgaXQgaXMKKglub3QgcmVsYXRlZCBhdCBhbGwgdG8gdGhlIG1heGltdW0gZnJhbWUgc2l6ZSBzdXBwb3J0ZWQgIGJ5IHRoZSBIZXJtZXMuCiogIDY6CWNoZWNrIHR5cGUgYWdhaW5zdDoKKgkJMHg4MEYzCS8vQXBwbGVUYWxrIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbCAoQUFSUCkKKgkJMHg4MTM3CS8vSVBYCioJdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGVuY2Fwc3VsYXRpb24KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIEhDRl9FTkNBUAkvL2kuZSBIQ0ZfRU5DIG9yIEhDRl9FTkNfU1VQCiNpZiAhICggKEhDRl9FTkNBUCkgJiBIQ0ZfRU5DX1NVUCApCkhDRl9TVEFUSUMKI2VuZGlmIC8vIEhDRl9FTkNBUApoY2ZfOApoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKQp7CgpoY2ZfOAlyYyA9IEVOQ19OT05FOwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDEgKi8KaGNmXzE2CXQgPSAoaGNmXzE2KSgqdHlwZTw8OCkgKyAqKHR5cGUrMSk7CQkJCQkJCQkJCQkJCQkJCS8qIDIgKi8KCglpZiAoIHQgPiAxNTAwICkgewkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDQgKi8KCQlpZiAoIHQgPT0gMHg4MTM3IHx8IHQgPT0gMHg4MEYzICkgewoJCQlyYyA9IEVOQ19UVU5ORUw7CQkJCQkJCQkJCQkJCQkJCQkJCS8qIDYgKi8KCQl9IGVsc2UgewoJCQlyYyA9IEVOQ18xMDQyOwoJCX0KCX0KCXJldHVybiByYzsKfSAvLyBoY2ZfZW5jYXAKI2VuZGlmIC8vIEhDRl9FTkNBUAojZW5kaWYgLy8gSENGX0RMX09OTFkKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2ZfZ2V0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKKi5QVVJQT1NFCQlPYnRhaW5zIHRyYW5zaWVudCBhbmQgcGVyc2lzdGVudCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIENhcmQgYW5kIGZyb20gdGhlIEhDRi4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWx0dnAJCWFkZHJlc3Mgb2YgTGVuZ3RoVHlwZVZhbHVlIHN0cnVjdHVyZSBzcGVjaWZ5aW5nIHRoZSAid2hhdCIgYW5kIHRoZSAiaG93IG11Y2giIG9mIHRoZQoqCQkJCWluZm9ybWF0aW9uIHRvIGJlIGNvbGxlY3RlZCBmcm9tIHRoZSBIQ0Ygb3IgZnJvbSB0aGUgSGVybWVzCioKKi5SRVRVUk5TCioJSENGX0VSUl9MRU4JCQlUaGUgcHJvdmlkZWQgYnVmZmVyIHdhcyB0b28gc21hbGwKKglIQ0ZfU1VDQ0VTUwkJCVN1Y2Nlc3MKKiEhCXZpYSBjbWRfZXhlICggdHlwZSA+PSBDRkdfUklEX0ZXX01JTiApCioJSENGX0VSUl9OT19OSUMJCU5JQyByZW1vdmVkIGR1cmluZyByZXRyaWV2YWwKKglIQ0ZfRVJSX1RJTUVfT1VUCUV4cGVjdGVkIEhlcm1lcyBldmVudCBkaWQgbm90IG9jY3VyZSBpbiBleHBlY3RlZCB0aW1lCiohIQl2aWEgY21kX2V4ZSBhbmQgc2V0dXBfYmFwICh0eXBlID49IENGR19SSURfRldfTUlOICkKKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCUhDRiBpcyBpbiBkZWZ1bmN0IG1vZGUgKGJpdHMgMHg3RiByZWZsZWN0IGNhdXNlKQoqCiouREVTQ1JJUFRJT04KKiBUaGUgVC1maWVsZCBvZiB0aGUgTFRWLXJlY29yZCAocHJvdmlkZWQgYnkgdGhlIE1TRiBpbiBwYXJhbWV0ZXIgbHR2cCkgc3BlY2lmaWVzIHRoZSBSSUQgd2FudGVkLiBUaGUgUklECiogaW5mb3JtYXRpb24gaWRlbnRpZmllZCBieSB0aGUgVC1maWVsZCBpcyBjb3BpZWQgaW50byB0aGUgVi1maWVsZC4KKiBPbiBlbnRyeSwgdGhlIEwtZmllbGQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGFsc28gY2FsbGVkIHRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIi4gVGhlIEwtdmFsdWUKKiBpbmNsdWRlcyB0aGUgc2l6ZSBvZiB0aGUgVC1maWVsZCwgYnV0IG5vdCB0aGUgc2l6ZSBvZiB0aGUgTC1maWVsZCBpdHNlbGYuCiogT24gcmV0dXJuLCB0aGUgTC1maWVsZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB3b3JkcyBhY3R1YWxseSBjb250YWluZWQgYnkgdGhlIFR5cGUgYW5kIFZhbHVlIGZpZWxkcy4KKiBBcyB0aGUgc2l6ZSBvZiB0aGUgVHlwZSBmaWVsZCBpbiB0aGUgTFRWLXJlY29yZCBpcyBpbmNsdWRlZCBpbiB0aGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgb2YgdGhlIHJlY29yZCwgdGhlCiogVi1maWVsZCBjYW4gY29udGFpbiBhdCBtb3N0ICJJbml0aWFsIERhdGFMZW5ndGgiIC0gMSB3b3JkcyBvZiBkYXRhLgoqIENvcHlpbmcgc3RvcHMgaWYgZWl0aGVyIHRoZSBjb21wbGV0ZSBJbmZvcm1hdGlvbiBpcyBjb3BpZWQgb3IgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpbmRpY2F0ZWQgYnkgdGhlCiogIkluaXRpYWwgRGF0YUxlbmd0aCIgd2VyZSBjb3BpZWQuICBUaGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgYWN0cyBhcyBhIHNhZmUgZ3VhcmQgYWdhaW5zdCBDb25maWd1cmF0aW9uCiogSW5mb3JtYXRpb24gYmxvY2tzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgZm9yIGRpZmZlcmVudCBGL1cgdmVyc2lvbnMsIGUuZy4gd2hlbiBsYXRlciB2ZXJzaW9ucyBzdXBwb3J0CiogbW9yZSB0YWxsaWVzIHRoYW4gZWFybGllciB2ZXJzaW9ucy4KKiBJZiB0aGUgc2l6ZSBvZiBWYWx1ZSBmaWVsZCBvZiB0aGUgUklEIGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlICJJbml0aWFsIERhdGFMZW5ndGgiIC0xLCBhcyBtdWNoIGRhdGEKKiBhcyBmaXRzIGlzIGNvcGllZCwgYW5kIGFuIGVycm9yIHN0YXR1cyBvZiBIQ0ZfRVJSX0xFTiBpcyByZXR1cm5lZC4KKgoqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIGRldGVjdCBjYXJkIHJlbW92YWwgYW5kIHJlLWluc2VydGlvbiBhbmQgbm90IGNhbGwgdGhlIEhDRiB3aGVuIHRoZQoqIE5JQyBpcyBhYnNlbnQuIFRoZSBNU0YgY2Fubm90LCBob3dldmVyLCB0aW1lbHkgZGV0ZWN0IGEgQ2FyZCByZW1vdmFsIGlmIHRoZSBDYXJkIGlzIHJlbW92ZWQgd2hpbGUKKiBoY2ZfZ2V0X2luZm8gaXMgaW4gcHJvZ3Jlc3MuICBUaGVyZWZvcmUsIHRoZSBIQ0YgcGVyZm9ybXMgaXRzIG93biBjaGVjayBvbiBDYXJkIHByZXNlbmNlIGFmdGVyIHRoZSByZWFkCiogb3BlcmF0aW9uIG9mIHRoZSBOSUMgZGF0YS4gIElmIHRoZSBDYXJkIGlzIG5vdCBwcmVzZW50IG9yIHJlbW92ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgaGNmX2dldF9pbmZvLAoqIEhDRl9FUlJfTk9fTklDIGlzIHJldHVybmVkIGFuZCB0aGUgY29udGVudCBvZiB0aGUgRGF0YSBCdWZmZXIgaXMgdW5wcmVkaWN0YWJsZS4gVGhpcyBjaGVjayBpcyBub3QgcGVyZm9ybWVkCiogaW4gY2FzZSBvZiB0aGUgIkhDRiBlbWJlZGRlZCIgcHNldWRvIFJJRHMgbGlrZSBDRkdfVEFMTElFUy4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgoqCWFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgoqIC0gbHR2cCBpcyBhIE5VTEwgcG9pbnRlci4KKiAtIGxlbmd0aCBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBhdCBlbnRyeSBpcyAwIG9yIDEgb3IgaGFzIGFuIGV4Y2Vzc2l2ZSB2YWx1ZSAoaS5lLiBleGNlZWRzIEhDRl9NQVhfTFRWKS4KKiAtIHR5cGUgZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgaXMgaW52YWxpZC4KKgoqLkRJQUdSQU0KKglIY2ZfZ2V0X21iX2luZm8gY29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgb2xkZXN0IE1haWxCb3ggSW5mbyBibG9jayBpbiB0aGUgTWFpbEJveCB0byBQQyBSQU0uIElmIGxlbiBpcwoqCWxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgTWFpbEJveCBJbmZvIGJsb2NrLCBvbmx5IGFzIG11Y2ggYXMgZml0cyBpbiB0aGUgUEMgUkFNIGJ1ZmZlciBpcyBjb3BpZWQuIEFmdGVyCioJdGhlIGNvcHlpbmcgdGhlIE1haWxCb3ggUmVhZCBwb2ludGVyIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5leHQgTWFpbEJveCBJbmZvIGJsb2NrLCBoZW5jZSB0aGUKKglyZW1haW5kZXIgb2YgYW4gIm92ZXJzaXplZCIgTWFpbEJveCBJbmZvIGJsb2NrIGlzIGxvc3QuIFRoZSB0cnVuY2F0aW9uIG9mIHRoZSBNYWlsQm94IEluZm8gYmxvY2sgaXMgTk9UCioJcmVmbGVjdGVkIGluIHRoZSByZXR1cm4gc3RhdHVzLiBOb3RlIHRoYXQgaGNmX2dldF9pbmZvIGd1YXJhbnRlZXMgdGhlIGxlbmd0aCBvZiB0aGUgUEMgUkFNIGJ1ZmZlciBtZWV0cwoqCXRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBvZiBhdCBsZWFzdCAyLCBzbyBubyBQQyBSQU0gYnVmZmVyIG92ZXJydW4uCioKKglDYWxsaW5nIGhjZl9nZXRfbWJfaW5mbyB3aGVuIHRoZWlyIGlzIG5vIE1haWxCb3ggSW5mbyBibG9jayBhdmFpbGFibGUgb3Igd2hlbiB0aGVyZSBpcyBubyBNYWlsQm94IGF0IGFsbCwKKglyZXN1bHRzIGluIGEgIk5VTEwiIE1haWxCb3ggSW5mbyBibG9jay4KKgoqMTI6CXNlZSBOT1RJQ0UKKjE3OiBUaGUgcmV0dXJuIHN0YXR1cyBvZiBjbWRfd2FpdCBhbmQgdGhlIGZpcnN0IGhjZmlvX2luX3N0cmluZyBjYW4gYmUgaWdub3JlZCwgYmVjYXVzZSB3aGVuIG9uZSBmYWlscywgdGhlCioJb3RoZXIgZmFpbHMgdmlhIHRoZSBJRkJfRGVmdW5jdFN0YXQgbWVjaGFuaXNtCioyMDogIkhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkiIGlzIG5vdCBzdWl0YWJsZSBiZWNhdXNlIHRoaXMgd2lsbCBhbHdheXMgdHJpZ2dlciBhcyBzaWRlIGVmZmVjdCBvZgoqCXRoZSBIQ0ZBU1NFUlQgaW4gaGNmX3B1dF9pbmZvIHdoaWNoIGNhbGxzIGhjZl9nZXRfaW5mbyB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIFJJRCBleGlzdHMgYXQgYWxsLgoKKi5OT1RJQ0UKKgoqCSJIQ0YgZW1iZWRkZWQiIHBzZXVkbyBSSURzOgoqCUNGR19NQl9JTkZPLCBDRkdfVEFMTElFUywgQ0ZHX0RSVl9JREVOVElUWSwgQ0ZHX0RSVl9TVVBfUkFOR0UsIENGR19EUlZfQUNUX1JBTkdFU19QUkksCioJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQSwgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSQoqCU5vdGUgdGhlIEhDRl9FUlJfTEVOIGlzIE5PVCBhZGVxdWF0ZWx5IHNldCwgd2hlbiBMID49IDIgYnV0IGxlc3MgdGhhbiBuZWVkZWQKKgoqCVJlbWFya3M6IFRyYW5zZmVycyBvcGVyYXRpb24gaW5mb3JtYXRpb24gYW5kIHRyYW5zaWVudCBhbmQgcGVyc2lzdGVudCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlCioJQ2FyZCBhbmQgZnJvbSB0aGUgSENGIHRvIHRoZSBNU0YuCioJVGhlIGV4YWN0IGxheW91dCBvZiB0aGUgcHJvdmlkZWQgZGF0YSBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgYWN0aW9uIGNvZGUuIENvcHlpbmcgc3RvcHMgaWYgZWl0aGVyIHRoZQoqCWNvbXBsZXRlIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gaXMgY29waWVkIG9yIGlmIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW5kaWNhdGVkIGJ5IGxlbiBpcyBjb3BpZWQuICBMZW4KKglhY3RzIGFzIGEgc2FmZSBndWFyZCBhZ2FpbnN0IENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gYmxvY2tzIHdoaWNoIGhhdmUgZGlmZmVyZW50IHNpemVzIGZvciBkaWZmZXJlbnQKKglIZXJtZXMgdmVyc2lvbnMsIGUuZy4gd2hlbiBsYXRlciB2ZXJzaW9ucyBzdXBwb3J0IG1vcmUgdGFsbGllcyB0aGFuIGVhcmxpZXIgdmVyc2lvbnMuIEl0IGlzIGEgY29uc2Npb3VzCioJZGVjaXNpb24gdGhhdCB1bnVzZWQgcGFydHMgb2YgdGhlIFBDIFJBTSBidWZmZXIgYXJlIG5vdCBjbGVhcmVkLgoqCioJUmVtYXJrczogVGhlIG9ubHkgZXJyb3IgYWdhaW5zdCB3aGljaCBpcyBwcm90ZWN0ZWQgaXMgdGhlICJSZWFkIGVycm9yIiBhcyByZXN1bHQgb2YgQ2FyZCByZW1vdmFsLiBPbmx5IHRoZQoqCWxhc3QgaGNmX2lvX3N0cmluZyBuZWVkIHRvIGJlIHByb3RlY3RlZCBiZWNhdXNlIGlmIHRoZSBmaXJzdCBmYWlscyB0aGUgc2Vjb25kIHdpbGwgZmFpbCBhcyB3ZWxsLiBDaGVja2luZwoqCWZvciBjbWRfZXhlIGVycm9ycyBpcyBzdXBwb3NlZCBzdXBlcmZsdW91cyBiZWNhdXNlIHByb2JsZW1zIGluIGNtZF9leGUgYXJlIGFscmVhZHkgY2F1Z2h0IG9yIHdpbGwgYmUKKgljYXVnaHQgYnkgaGNmX2VuYWJsZS4KKgoqCUNGR19NQl9JTkZPOiBjb3B5IHRoZSBvbGRlc3QgTWFpbEJveCBJbmZvIEJsb2NrIG9yIHRoZSAibnVsbCIgYmxvY2sgaWYgbm9uZSBhdmFpbGFibGUuCioKKglUaGUgbWVjaGFuaXNtIHRvIEhDRl9BU1NFUlQgb24gaW52YWxpZCB0eXAtY29kZXMgaW4gdGhlIExUViByZWNvcmQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzdHJhdGVneToKKgkgIC0gZHVyaW5nIHRoZSBwc2V1ZG8tYXN5bmNocm9ub3VzIEhlcm1lcyBjb21tYW5kcyAoZGlhZ25vc2UsIGRvd25sb2FkKQlvbmx5IENGR19NQl9JTkZPIGlzIGFjY2VwdGFibGUKKgkgIC0Jc29tZSBjb2RlcyAoZS5nLiBDRkdfVEFMTElFUykgYXJlIGV4cGxpY2l0bHkgaGFuZGxlZCBieSB0aGUgSENGIHdoaWNoIGltcGxpZXMgdGhhdCB0aGVzZSBjb2RlcwoqCQlhcmUgdmFsaWQKKgkgIC0gYWxsIG90aGVyIGNvZGVzIGluIHRoZSByYW5nZSAweEZDMDAgdGhyb3VnaCAweEZGRkYgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiAgVGhlIEhlcm1lcyByZXR1cm5zIGFuCioJCUxUViByZWNvcmQgd2l0aCBhIHplcm8gdmFsdWUgaW4gdGhlIEwtZmllbGQgZm9yIGFsbCBUeXAtY29kZXMgaXQgZG9lcyBub3QgcmVjb2duaXplLiBUaGlzIGlzCioJCWRlZmluZWQgYW5kIGludGVuZGVkIGJlaGF2aW9yLCBzbyBIQ0ZfQVNTRVJUIGRvZXMgbm90IGNhdGNoIG9uIHRoaXMgcGhlbm9tZW5hLgoqCSAgLQlhbGwgcmVtYWluaW5nIGNvZGVzIGFyZSBpbnZhbGlkIGFuZCBjYXVzZSBhbiBBU1NFUlQuCioKKi5DT05ESVRJT05TCiogSW4gY2FzZSBvZiBVU0IsIEhDRl9NQVhfTVNHIDs/VVNFRDs/IHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdmlhIGhjZl9nZXRfaW5mby4KKgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX2dldF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCnsKCmludAkJCXJjID0gSENGX1NVQ0NFU1M7CmhjZl8xNgkJbGVuID0gbHR2cC0+bGVuOwpoY2ZfMTYJCXR5cGUgPSBsdHZwLT50eXA7CndjaV9yZWNvcmRwCXAgPSAmbHR2cC0+bGVuOwkJLy9kZXN0aW5hdGlvbiB3b3JkIHBvaW50ZXIgKGluIExUViByZWNvcmQpCmhjZl8xNgkJKnEgPSBOVUxMOwkJCQkvKiBzb3VyY2Ugd29yZCBwb2ludGVyICBOb3RlISEgRE9TIENPTSBjYW4ndCBjb3BlIHdpdGggRkFSCgkJCQkJCQkJCSAqIGFzIGEgY29uc2VxdWVuY2UgTWFpbEJveCBtdXN0IGJlIG5lYXIgd2hpY2ggaXMgdXN1YWxseSB0cnVlIGFueXdheQoJCQkJCQkJCQkgKi8KaW50CQkJaTsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0dFVF9JTkZPLCBsdHZwLT50eXAgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQoJSENGQVNTRVJUX0lOVAoJSENGQVNTRVJUKCBsdHZwLCAwICkKCUhDRkFTU0VSVCggMSA8IGx0dnAtPmxlbiAmJiBsdHZwLT5sZW4gPD0gSENGX01BWF9MVFYgKyAxLCBNRVJHRV8yKCBsdHZwLT50eXAsIGx0dnAtPmxlbiApICkKCglsdHZwLT5sZW4gPSAwOwkJCQkJCQkJLy9kZWZhdWx0IHRvOiBObyBJbmZvIEF2YWlsYWJsZQojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lEIHx8IChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIgLy9maWx0ZXIgb3V0IGFsbCBzcGVjaWFscwoJZm9yICggaSA9IDA7ICggcSA9IHh4eHhbaV0gKSAhPSBOVUxMICYmIHFbMV0gIT0gdHlwZTsgaSsrICkgLypOT1AqLzsKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQgLyBIQ0ZfRVhUX01CCiNpZiBIQ0ZfVEFMTElFUwoJaWYgKCB0eXBlID09IENGR19UQUxMSUVTICkgewkJCQkJCQkJCQkJCQkvKjMqLwoJCSh2b2lkKWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfVEFMTElFUyApOwoJCXEgPSAoaGNmXzE2KikmaWZicC0+SUZCX1RhbGx5TGVuOwoJfQojZW5kaWYgLy8gSENGX1RBTExJRVMKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKCWlmICggdHlwZSA9PSBDRkdfTUJfSU5GTyApIHsKCQlpZiAoIGlmYnAtPklGQl9NQkluZm9MZW4gKSB7CgkJCWlmICggaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF0gPT0gMHhGRkZGICkgewoJCQkJaWZicC0+SUZCX01CUnAgPSAwOyAvLzs/UHJvYmFibHkgc3VwZXJmbHVvdXMKCQkJfQoJCQlxID0gJmlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOwoJCQlpZmJwLT5JRkJfTUJScCArPSAqcSArIDE7CS8vdXBkYXRlIHJlYWQgcG9pbnRlcgoJCQlpZiAoIGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdID09IDB4RkZGRiApIHsKCQkJCWlmYnAtPklGQl9NQlJwID0gMDsKCQkJfQoJCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF07CgkJfQoJfQojZW5kaWYgLy8gSENGX0VYVF9NQgoJaWYgKCBxICE9IE5VTEwgKSB7CQkJCQkJLy9hIHNwZWNpYWwgb3IgQ0ZHX1RBTExJRVMgb3IgQ0ZHX01CX0lORk8KCQlpID0gbWluKCBsZW4sICpxICkgKyAxOwkJCQkvL3RvdGFsIHNpemUgb2YgZGVzdGluYXRpb24gKGluY2x1ZGluZyBULWZpZWxkKQoJCXdoaWxlICggaS0tICkgewoJCQkqcCsrID0gKnE7CiNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfUkVTRVQKCQkJaWYgKCBxID4gJmlmYnAtPklGQl9UYWxseVR5cCAmJiB0eXBlID09IENGR19UQUxMSUVTICkgewoJCQkJKnEgPSAwOwoJCQl9CiNlbmRpZiAvLyBIQ0ZfVEFMTElFU19SRVNFVAoJCQlxKys7CgkJfQoJfSBlbHNlIHsJCQkJCQkJCS8vIG5vdCBhIHNwZWNpYWwgbm9yIENGR19UQUxMSUVTIG5vciBDRkdfTUJfSU5GTwoJCWlmICggdHlwZSA9PSBDRkdfQ05UTF9PUFQgKSB7CQkJCQkJCQkJCS8vcmVhZCBiYWNrIGVmZmVjdGl2ZSBvcHRpb25zCgkJCWx0dnAtPmxlbiA9IDI7CgkJCWx0dnAtPnZhbFswXSA9IGlmYnAtPklGQl9DbnRsT3B0OwojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9OSUNfQUNDRVNTCgkJfSBlbHNlIGlmICggdHlwZSA9PSBDRkdfUFJPRF9EQVRBICkgeyAgLy9vbmx5IG5lZWRlZCBmb3Igc29tZSB0ZXN0IHRvb2wgb24gdG9wIG9mIEgtSUkgTkRJUyBkcml2ZXIKaGNmX2lvCQlpb19wb3J0Owp3Y2lfYnVmcAlwdDsJCQkJCS8vcG9pbnRlciB3aXRoIHRoZSAicmlnaHQiIHR5cGUsIGp1c3QgdG8gaGVscCBlYXNlIHdyaXRpbmcgbWFjcm9zIHdpdGggZW1iZWRkZWQgYXNzZW1ibHkKCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUID4+IDcpICk7CgkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUICYgMHg3RSkgKTsKCQkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0FVWF9EQVRBOwkJLy90byBwcmV2ZW50IHNpZGUgZWZmZWN0cyBvZiB0aGUgTVNGLWRlZmluZWQgbWFjcm8KCQkJcCA9IGx0dnAtPnZhbDsJCQkJCS8vZGVzdGluYXRpb24gY2hhciBwb2ludGVyIChpbiBMVFYgcmVjb3JkKQoJCQlpID0gbGVuIC0gMTsKCQkJaWYgKGkgPiAwICkgewoJCQkJcHQgPSAod2NpX2J1ZnApcDsJLy9qdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CgkJCQlJTl9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBwdCwgaSApOyAvL3NwYWNlIHVzZWQgYnkgVDogLTEKCQkJfQoJCX0gZWxzZSBpZiAoIHR5cGUgPT0gQ0ZHX0NNRF9IQ0YgKSB7CiNkZWZpbmUgUCAoKENGR19DTURfSENGX1NUUkNUIEZBUiAqKWx0dnApCgkJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApCQkvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKCQkJaWYgKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUyApIHsKCQkJCUhDRkFTU0VSVCggUC0+bW9kZSA8IGlmYnAtPklGQl9JT0Jhc2UsIFAtPm1vZGUgKQkJLy9DaGVjayBSZWdpc3RlciBzcGFjZQoJCQkJbHR2cC0+bGVuID0gbWluKCBsZW4sIDQgKTsJCQkJCQkJCS8vUkVTVE9SRSBsdHYgbGVuZ3RoCgkJCQlQLT5hZGRfaW5mbyA9IElQVyggUC0+bW9kZSApOwoJCQl9CiN1bmRlZiBQCiNlbmRpZiAvLyBIQ0ZfRVhUX05JQ19BQ0NFU1MKI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENGR19GV19QUklOVEYpIHsKICAgICAgICAgICByYyA9IGZ3X3ByaW50ZihpZmJwLCAoQ0ZHX0ZXX1BSSU5URl9TVFJDVCopbHR2cCk7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgoJCX0gZWxzZSBpZiAoIHR5cGUgPj0gQ0ZHX1JJRF9GV19NSU4gKSB7Ci8vOz8gYnkgdXNpbmcgSENNRF9CVVNZIG9wdGlvbiB3aGVuIGNhbGxpbmcgY21kX2V4ZSwgdXNpbmcgYSBnZXRfZnJhZyB3aXRoIGxlbmd0aCAwIGp1c3QgdG8gc2V0IHVwIHRoZQovLzs/IEJBUCBhbmQgY2FsbGluZyBjbWRfY21wbCwgeW91IGNvdWxkIG1lcmdlIHRoZSAyIEJ1c3kgd2FpdHMuIFdoZXRoZXIgdGhpcyByZWFsbHkgaGVscHMgKGFuZCB3aGF0Ci8vOz8gd291bGQgYmUgdGhlIG9wdGltYWwgc2VxdWVuY2UgaW4gY21kX2V4ZSBhbmQgZ2V0X2ZyYWcpIHdvdWxkIGhhdmUgdG8gYmUgTUVBU1VSRUQKLyoxNyovCQlpZiAoICggcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0FDQ0VTUywgdHlwZSApICkgPT0gSENGX1NVQ0NFU1MgJiYKCQkJCSAoIHJjID0gc2V0dXBfYmFwKCBpZmJwLCB0eXBlLCAwLCBJT19JTiApICkgPT0gSENGX1NVQ0NFU1MgKSB7CgkJCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZsdHZwLT5sZW4sIDIqbGVuKzIgQkVfUEFSKDIpICk7CgkJCQlpZiAoIElQVyggSFJFR19TVEFUICkgPT0gMHhGRkZGICkgewkJCQkJLy9OSUMgcmVtb3ZhbCB0ZXN0CgkJCQkJbHR2cC0+bGVuID0gMDsKCQkJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgdHlwZSApCgkJCQl9CgkJCX0KLyoxMiovCX0gZWxzZSBIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgdHlwZSApIC8qTk9QKi87IC8vTk9QIGluIGNhc2UgSENGQVNTRVJUIGlzIGR1bW15Cgl9CglpZiAoIGxlbiA8IGx0dnAtPmxlbiApIHsKCQlsdHZwLT5sZW4gPSBsZW47CgkJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJcmMgPSBIQ0ZfRVJSX0xFTjsKCQl9Cgl9CglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTIHx8ICggcmMgPT0gSENGX0VSUl9MRU4gJiYgaWZicC0+SUZCX0Fzc2VydFRyYWNlICYgMTw8SENGX1RSQUNFX1BVVF9JTkZPICksCgkJCSAgIE1FUkdFXzIoIHR5cGUsIHJjICkgKQkJCQkJCQkJCQkJCQkJCQkvKjIwKi8KCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9HRVRfSU5GTyApCglyZXR1cm4gcmM7Cn0gLy8gaGNmX2dldF9pbmZvCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCiouUFVSUE9TRQkJVHJhbnNmZXJzIG9wZXJhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUgQ2FyZCBhbmQgdG8gdGhlIEhDRi4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWx0dnAJCXNwZWNpZmllcyB0aGUgUklEIChhcyBkZWZpbmVkIGJ5IEhlcm1lcyBJL0YpIG9yIHBzZXVkby1SSUQgKGFzIGRlZmluZWQgYnkgV0NJKQoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCiohIQl2aWEgY21kX2V4ZQoqCUhDRl9FUlJfTk9fTklDIAkJTklDIHJlbW92ZWQgZHVyaW5nIGRhdGEgcmV0cmlldmFsCioJSENGX0VSUl9USU1FX09VVAlFeHBlY3RlZCBGL1cgZXZlbnQgZGlkIG5vdCBvY2N1ciBpbiB0aW1lCioJSENGX0VSUl9ERUZVTkNUXy4uLgoqISEJdmlhIGRvd25sb2FkCQkJCUNGR19ETE5WX1NUQVJUIDw9IHR5cGUgPD0gQ0ZHX0RMX1NUT1AKKiEhCXZpYSBwdXRfaW5mbwkJCQlDRkdfUklEX0NGR19NSU4gPD0gdHlwZSA8PSBDRkdfUklEX0NGR19NQVgKKiEhCXZpYSBwdXRfZnJhZwoqCiouREVTQ1JJUFRJT04KKiBUaGUgTC1maWVsZCBvZiB0aGUgTFRWLXJlY29yZCAocHJvdmlkZWQgYnkgdGhlIE1TRiBpbiBwYXJhbWV0ZXIgbHR2cCkgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuCiogVGhlIEwtdmFsdWUgaW5jbHVkZXMgdGhlIHNpemUgb2YgdGhlIFQtZmllbGQsIGJ1dCBub3QgdGhlIHNpemUgb2YgdGhlIEwtZmllbGQuCiogVGhlIFQtIGZpZWxkIHNwZWNpZmllcyB0aGUgUklEIHBsYWNlZCBpbiB0aGUgVi1maWVsZCBieSB0aGUgTVNGLgoqCiogTm90IGFsbCBDRkctY29kZXMgY2FuIGJlIHVzZWQgZm9yIGhjZl9wdXRfaW5mby4gIFRoZSBmb2xsb3dpbmcgQ0ZHLWNvZGVzIGFyZSB2YWxpZCBmb3IgaGNmX3B1dF9pbmZvOgoqIG8gT25lIG9mIHRoZSBDRkctY29kZXMgaW4gdGhlIGdyb3VwICJOZXR3b3JrIFBhcmFtZXRlcnMsIFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzIgoqIENoYW5nZXMgbWFkZSBieSBoY2ZfcHV0X2luZm8gdG8gQ0ZHX2NvZGVzIGluIHRoaXMgZ3JvdXAgd2lsbCBub3QgYWZmZWN0IHRoZSBGL1cKKiBhbmQgSENGIGJlaGF2aW9yIHVudGlsIGhjZl9jbnRsX3BvcnQoIEhDRl9QT1JUX0VOQUJMRSkgaXMgY2FsbGVkLgoqIG8gT25lIG9mIHRoZSBDRkctY29kZXMgaW4gdGhlIGdyb3VwICJOZXR3b3JrIFBhcmFtZXRlcnMsIER5bmFtaWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcyIKKiBDaGFuZ2VzIG1hZGUgYnkgaGNmX3B1dF9pbmZvIHRvIENGR19jb2RlcyB3aWxsIGFmZmVjdCB0aGUgRi9XIGFuZCBIQ0YgYmVoYXZpb3IgaW1tZWRpYXRlbHkuCiogbyBDRkdfUFJPRy4KKiBUaGlzIGNvZGUgaXMgdXNlZCB0byBpbml0aWF0ZSBhbmQgdGVybWluYXRlIHRoZSBwcm9jZXNzIHRvIGRvd25sb2FkIGRhdGEgZWl0aGVyIHRvCiogdm9sYXRpbGUgb3IgdG8gbm9uLXZvbGF0aWxlIFJBTSBvbiB0aGUgTklDIGFzIHdlbGwgYXMgZm9yIHRoZSBhY3R1YWwgZG93bmxvYWQuCiogbyBDRkctY29kZXMgcmVsYXRlZCB0byB0aGUgSENGIGJlaGF2aW9yLgoqIFRoZSByZWxhdGVkIENGRy1jb2RlcyBhcmU6CiogIC0gQ0ZHX1JFR19NQgoqICAtIENGR19SRUdfQVNTRVJUX1JUTlAKKiAgLSBDRkdfUkVHX0lORk9fTE9HCiogIC0gQ0ZHX0NNRF9OSUMKKiAgLSBDRkdfQ01EX0RPTkdMRQoqICAtIENGR19DTURfSENGCiogIC0gQ0ZHX05PVElGWQoqCiogQWxsIExUVi1yZWNvcmRzICJ1bmtub3duIiB0byB0aGUgSENGIGFyZSBmb3J3YXJkZWQgdG8gdGhlIEYvVy4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gbHR2cCBpcyBhIE5VTEwgcG9pbnRlci4KKiAtIGhjZl9wdXRfaW5mbyB3YXMgY2FsbGVkIHdpdGhvdXQgcHJpb3IgY2FsbCB0byBoY2ZfY29ubmVjdAoqIC0gdHlwZSBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBpcyBpbnZhbGlkLCBpLmUuIG5laXRoZXIgSENGIG5vciBGL1cgY2FuIGhhbmRsZSB0aGUgdmFsdWUuCiogLSBsZW5ndGggZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgYXQgZW50cnkgaXMgbGVzcyB0aGFuIDEgb3IgZXhjZWVkcyBNQVhfTFRWX1NJWkUuCiogLSByZWdpc3RlcmluZyBhIE1haWxCb3ggd2l0aCBzaXplIGxlc3MgdGhhbiA2MCBvciBhIG5vbi1hbGlnbmVkIGJ1ZmZlciBhZGRyZXNzIGlzIHVzZWQuCiogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uIGFnYWluc3QKKglOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKglSZW1hcmtzOiAgSW4gY2FzZSBvZiBIZXJtZXMgQ29uZmlndXJhdGlvbiBMVFZzLCB0aGUgY29kZXMgZm9yIHRoZSB0eXBlIGFyZSAiY2xldmVybHkiIGNob3NlbiB0byBiZQoqCWlkZW50aWNhbCB0byB0aGUgUklELiBIZXJtZXMgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBjb3BpZWQgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YSBzdHJ1Y3R1cmUgaW50byB0aGUKKglDYXJkLgoqCUluIGNhc2Ugb2YgSENGIENvbmZpZ3VyYXRpb24gTFRWcywgdGhlIHR5cGUgdmFsdWVzIGFyZSBjaG9zZW4gaW4gYSByYW5nZSB3aGljaCBkb2VzIG5vdCBvdmVybGFwIHRoZQoqCVJJRC1yYW5nZS4KKgoqMjA6CioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgppbnQKaGNmX3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCnsKaW50IHJjID0gSENGX1NVQ0NFU1M7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9QVVRfSU5GTywgbHR2cC0+dHlwICkKCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKCUhDRkFTU0VSVF9JTlQKCUhDRkFTU0VSVCggbHR2cCwgMCApCglIQ0ZBU1NFUlQoIDEgPCBsdHZwLT5sZW4gJiYgbHR2cC0+bGVuIDw9IEhDRl9NQVhfTFRWICsgMSwgbHR2cC0+bGVuICkKCgkJCQkJCQkJCQkJLy9hbGwgY29kZXMgYmV0d2VlbiAweEZBMDAgYW5kIDB4RkNGRiBhcmUgcGFzc2VkIHRvIEhlcm1lcwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQogewloY2ZfMTYgaTsKCWhjZl8zMiBGQVIgKiBrZXlfcDsKCglpZiAoIGx0dnAtPnR5cCA9PSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgfHwgbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9NQVBQRURfS0VZICkgewoJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfTUFQUEVEX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dHhfbWljX2tleTsKCQlpID0gVFhfS0VZOwkJLy9pLmUuIFR4S2V5SW5kaWNhdG9yID09IDEsIEtleUlEID09IDAKCQlpZiAoIGx0dnAtPnR5cCA9PSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgKSB7CgkJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCktPnR4X21pY19rZXk7CgkJCWkgPSBDTlZfTElUVExFX1RPX1NIT1JUKCgoQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZX1NUUkNUIEZBUiAqKWx0dnApLT50a2lwX2tleV9pZF9pbmZvKTsKCQl9CgkJaWYgKCBpICYgVFhfS0VZICkgewkvKiBUeEtleUluZGljYXRvciA9PSAxCgkJCQkJCQkgICAoZWl0aGVyIHJlYWxseSBzZXQgYnkgTVNGIGluIGNhc2Ugb2YgREVGQVVMVCBvciBmYWtlZCBieSBIQ0YgaW4gY2FzZSBvZiBNQVBQRUQgKSAqLwoJCQlpZmJwLT5JRkJfTUlDVHhDbnRsID0gKGhjZl8xNikoIEhGU19UWF9DTlRMX01JQyB8IChpICYgS0VZX0lEICk8PDggKTsKCQkJaWZicC0+SUZCX01JQ1R4S2V5WzBdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSgga2V5X3AgKTsKCQkJaWZicC0+SUZCX01JQ1R4S2V5WzFdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzEpICk7CgkJfQoJCWkgPSAoIGkgJiBLRVlfSUQgKSAqIDI7CgkJaWZicC0+SUZCX01JQ1J4S2V5W2ldICAgPSBDTlZfTE9OR1BfVE9fTElUVExFKCAoa2V5X3ArMikgKTsKCQlpZmJwLT5JRkJfTUlDUnhLZXlbaSsxXSA9IENOVl9MT05HUF9UT19MSVRUTEUoIChrZXlfcCszKSApOwoJfQojZGVmaW5lIFAgKChDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCkKCWlmICggKCBsdHZwLT50eXAgPT0gQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVkgKQl8fAoJCSAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVkgJiYKCQkgICAoIChpZmJwLT5JRkJfTUlDVHhDbnRsID4+IDgpICYgS0VZX0lEICkgPT0gQ05WX1NIT1JUX1RPX0xJVFRMRShQLT50a2lwX2tleV9pZCApCgkJICkKCQkpIHsgaWZicC0+SUZCX01JQ1R4Q250bCA9IDA7IH0JCS8vZGlzYWJsZSBNSUMtZW5naW5lCiN1bmRlZiBQCiB9CiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCglpZiAoIGx0dnAtPnR5cCA9PSBDRkdfUFJPRyApIHsKCQlyYyA9IGRvd25sb2FkKCBpZmJwLCAoQ0ZHX1BST0dfU1RSQ1QgRkFSICopbHR2cCApOwoJfSBlbHNlIHN3aXRjaCAobHR2cC0+dHlwKSB7CiNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4KCSAgY2FzZSBDRkdfUkVHX0FTU0VSVF9SVE5QOgkJCQkJCQkJCQkJLy9SZWdpc3RlciBNU0YgUm91dGluZXMKI2RlZmluZSBQICgoQ0ZHX1JFR19BU1NFUlRfUlROUF9TVFJDVCBGQVIgKilsdHZwKQoJCWlmYnAtPklGQl9Bc3NlcnRSdG4gPSBQLT5ydG5wOwovLwkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IFAtPmx2bDsJCS8vVE9ETyBub3QgeWV0IHN1cHBvcnRlZCBzbyBkZWZhdWx0IGlzIHNldCBpbiBoY2ZfY29ubmVjdAoJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjEgKSApCS8vanVzdCB0byBwcm9vZiB0aGF0IHRoZSBjb21wbGV0ZSBhc3NlcnQgbWFjaGluZXJ5IGlzIHdvcmtpbmcKI3VuZGVmIFAKCQlicmVhazsKI2VuZGlmIC8vIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRwoJICBjYXNlIENGR19SRUdfSU5GT19MT0c6CQkJCQkJCQkJCQkvL1JlZ2lzdGVyIExvZyBmaWx0ZXIKCQlpZmJwLT5JRkJfUklETG9ncCA9ICgoQ0ZHX1JJRF9MT0dfU1RSQ1QgRkFSKilsdHZwKS0+cmVjb3JkcDsKCQlicmVhazsKI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKCSAgY2FzZSBDRkdfQ05UTF9PUFQ6CQkJCQkJCQkJCQkJLy9vdmVycnVsZSBvcHRpb24KCQlIQ0ZBU1NFUlQoICggbHR2cC0+dmFsWzBdICYgfihVU0VfRE1BIHwgVVNFXzE2QklUKSApID09IDAsIGx0dnAtPnZhbFswXSApCgkJaWYgKCAoIGx0dnAtPnZhbFswXSAmIFVTRV9ETUEgKSA9PSAwICkgaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV9ETUE7CgkJaWZicC0+SUZCX0NudGxPcHQgfD0gIGx0dnAtPnZhbFswXSAmIFVTRV8xNkJJVDsKCQlicmVhazsKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKCSAgY2FzZSBDRkdfUkVHX01COgkJCQkJCQkJCQkJCQkvL1JlZ2lzdGVyIE1haWxCb3gKI2RlZmluZSBQICgoQ0ZHX1JFR19NQl9TVFJDVCBGQVIgKilsdHZwKQoJCUhDRkFTU0VSVCggKCAoaGNmXzMyKVAtPm1iX2FkZHIgJiAweDAwMDEgKSA9PSAwLCAoaGNmXzMyKVAtPm1iX2FkZHIgKQoJCUhDRkFTU0VSVCggKFApLT5tYl9zaXplID49IDYwLCAoUCktPm1iX3NpemUgKQoJCWlmYnAtPklGQl9NQnAgPSBQLT5tYl9hZGRyOwoJCS8qIGlmIG5vIE1CIHByZXNlbnQsIHNpemUgbXVzdCBiZSAwIGZvciA7P3RoZSBvbGQ7PyBwdXRfaW5mb19tYiB0byB3b3JrIGNvcnJlY3RseSAqLwoJCWlmYnAtPklGQl9NQlNpemUgPSBpZmJwLT5JRkJfTUJwID09IE5VTEwgPyAwIDogUC0+bWJfc2l6ZTsKCQlpZmJwLT5JRkJfTUJXcCA9IGlmYnAtPklGQl9NQlJwCT0gMDsKCQlpZmJwLT5JRkJfTUJwWzBdID0gMDsJCQkJCQkJCQkJCS8vZmxhZyB0aGUgTWFpbEJveCBhcyBlbXB0eQoJCWlmYnAtPklGQl9NQkluZm9MZW4gPSAwOwoJCUhDRkFTU0VSVCggaWZicC0+SUZCX01CU2l6ZSA+PSA2MCB8fCBpZmJwLT5JRkJfTUJwID09IE5VTEwsIGlmYnAtPklGQl9NQlNpemUgKQojdW5kZWYgUAoJCWJyZWFrOwoJICBjYXNlIENGR19NQl9JTkZPOgkJCQkJCQkJCQkJCQkvL3N0b3JlIE1haWxCb3hJbmZvQmxvY2sKCQlyYyA9IHB1dF9pbmZvX21iKCBpZmJwLCAoQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICopbHR2cCApOwoJCWJyZWFrOwojZW5kaWYgLy8gSENGX0VYVF9NQgoKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTklDX0FDQ0VTUwoJICBjYXNlIENGR19DTURfTklDOgojZGVmaW5lIFAgKChDRkdfQ01EX05JQ19TVFJDVCBGQVIgKilsdHZwKQoJCU9QVyggSFJFR19QQVJBTV8yLCBQLT5wYXJtMiApOwoJCU9QVyggSFJFR19QQVJBTV8xLCBQLT5wYXJtMSApOwoJCXJjID0gY21kX2V4ZSggaWZicCwgUC0+Y21kLCBQLT5wYXJtMCApOwoJCVAtPmhjZl9zdGF0ID0gKGhjZl8xNilyYzsKCQlQLT5zdGF0ID0gSVBXKCBIUkVHX1NUQVQgKTsKCQlQLT5yZXNwMCA9IElQVyggSFJFR19SRVNQXzAgKTsKCQlQLT5yZXNwMSA9IElQVyggSFJFR19SRVNQXzEgKTsKCQlQLT5yZXNwMiA9IElQVyggSFJFR19SRVNQXzIgKTsKCQlQLT5pZmJfZXJyX2NtZCA9IGlmYnAtPklGQl9FcnJDbWQ7CgkJUC0+aWZiX2Vycl9xdWFsaWZpZXIgPSBpZmJwLT5JRkJfRXJyUXVhbGlmaWVyOwojdW5kZWYgUAoJCWJyZWFrOwoJICBjYXNlIENGR19DTURfSENGOgojZGVmaW5lIFAgKChDRkdfQ01EX0hDRl9TVFJDVCBGQVIgKilsdHZwKQoJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApCQkvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKCQlpZiAoIFAtPmNtZCA9PSBDRkdfQ01EX0hDRl9SRUdfQUNDRVNTICkgewoJCQlIQ0ZBU1NFUlQoIFAtPm1vZGUgPCBpZmJwLT5JRkJfSU9CYXNlLCBQLT5tb2RlICkJCS8vQ2hlY2sgUmVnaXN0ZXIgc3BhY2UKCQkJT1BXKCBQLT5tb2RlLCBQLT5hZGRfaW5mbyk7CgkJfQojdW5kZWYgUAoJCWJyZWFrOwojZW5kaWYgLy8gSENGX0VYVF9OSUNfQUNDRVNTCgojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKICAgICAgY2FzZSBDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTjoKICAgICAgICBpZmJwLT5JRkJfRndQZkJ1ZmYgPSAqKENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUKilsdHZwOwogICAgICAgIGJyZWFrOwojZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKCgkgIGRlZmF1bHQ6CQkJCQkJLy9wYXNzIGV2ZXJ5dGhpbmcgdW5rbm93biBhYm92ZSB0aGUgIkZJRCIgcmFuZ2UgdG8gdGhlIEhlcm1lcyBvciBEb25nbGUKCQlyYyA9IHB1dF9pbmZvKCBpZmJwLCBsdHZwICk7Cgl9CgkvL0RPIE5PVCAhISEgSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQkJCQkJCQkJCQkJCS8qIDIwICovCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfUFVUX0lORk8gKQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9wdXRfaW5mbwoKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX3Jjdl9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIHVuc2lnbmVkIGludCBvZmZzZXQgKQoqLlBVUlBPU0UJCUFsbDogZGVjYXBzdWxhdGUgYSBtZXNzYWdlLgoqCQkJCXByZS1IZXJtZXNJSS41OiB2ZXJpZnkgTUlDLgoqCQkJCW5vbi1VU0IsIG5vbi1ETUEgbW9kZTogVHJhbnNmZXIgYSBtZXNzYWdlIGZyb20gdGhlIE5JQyB0byB0aGUgSG9zdCBhbmQgYWNrbm93bGVkZ2UgcmVjZXB0aW9uLgoqCQkJCVVTQjogVHJhbnNmb3JtIGEgbWVzc2FnZSBmcm9tIHByb3ByaWV0YXJ5IFVTQiBmb3JtYXQgdG8gODAyLjMgZm9ybWF0CioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglkZXNjcAkJUG9pbnRlciB0byB0aGUgRGVzY3JpcHRvciBMaXN0IGxvY2F0aW9uLgoqCW9mZnNldAkJVVNCOiBub3QgdXNlZAoqCQkJCW5vbi1VU0I6IHNwZWNpZmllcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIHRvIGJlIG9idGFpbmVkICgwIGNvcnJlc3BvbmRzIHdpdGggRGVzdEFkZHIgZmllbGQKKgkJCQlvZiBmcmFtZSkuCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MJCQlObyBTU04gZXJyb3IgKCBvciBIQ0ZfRVJSX01JQyBhbHJlYWR5IHJlcG9ydGVkIGJ5IGhjZl9zZXJ2aWNlX25pYykKKglIQ0ZfRVJSX01JQwkJCW1lc3NhZ2UgY29udGFpbnMgYW4gZXJyb25lb3VzIE1JQyAoIEhDRl9TVUNDRVNTIGlzIHJlcG9ydGVkIGlmIEhDRl9FUlJfTUlDIGlzIGFscmVhZHkKKgkJCQkJCXJlcG9ydGVkIGJ5IGhjZl9zZXJ2aWNlX25pYykKKiAJSENGX0VSUl9OT19OSUMJCU5JQyByZW1vdmVkIGR1cmluZyBkYXRhIHJldHJpZXZhbAoqIAlIQ0ZfRVJSX0RFRlVOQ1QuLi4KKgoqLkRFU0NSSVBUSU9OCiogVGhlIFJlY2VpdmUgTWVzc2FnZSBGdW5jdGlvbiBjYW4gYmUgZXhlY3V0ZWQgYnkgdGhlIE1TRiB0byBvYnRhaW4gdGhlIERhdGEgSW5mbyBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgdGhhdAoqIGlzIHJlcG9ydGVkIHRvIGJlIGF2YWlsYWJsZSBieSB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24uCioKKiBUaGUgUmVjZWl2ZSBNZXNzYWdlIEZ1bmN0aW9uIGNvcGllcyB0aGUgbWVzc2FnZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgQ2FyZCBtZW1vcnkgaW50byBhIGJ1ZmZlciBzdHJ1Y3R1cmUKKiBwcm92aWRlZCBieSB0aGUgTVNGLgoqIE9ubHkgZGF0YSBvZiB0aGUgbWVzc2FnZSBpbmRpY2F0ZWQgYnkgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIGNhbiBiZSBvYnRhaW5lZC4KKiBFeGVjdXRpb24gb2YgdGhlIFNlcnZpY2UgTklDIGZ1bmN0aW9uIG1heSByZXN1bHQgaW4gdGhlIGF2YWlsYWJpbGl0eSBvZiBhIG5ldyBtZXNzYWdlLCBidXQgaXQgZGVmaW5pdGVseQoqIG1ha2VzIHRoZSBtZXNzYWdlIHJlcG9ydGVkIGJ5IHRoZSBwcmVjZWRpbmcgU2VydmljZSBOSUMgZnVuY3Rpb24sIHVuYXZhaWxhYmxlLgoqCiogaW4gbm9uLVVTQi9ub24tRE1BIG1vZGUsIGhjZl9yY3ZfbXNnIHN0YXJ0cyB0aGUgY29weSBwcm9jZXNzIGF0IHRoZSAobm9uLW5lZ2F0aXZlKSBvZmZzZXQgcmVxdWVzdGVkIGJ5IHRoZQoqIHBhcmFtZXRlciBvZmZzZXQsIHJlbGF0aXZlIHRvIEhGU19BRERSX0RFU1QsIGUuZyBvZmZzZXQgMCBzdGFydHMgY29weWluZyBmcm9tIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzLCB0aGUKKiB2ZXJ5IGJlZ2luIG9mIHRoZSA4MDIuMyBmcmFtZSBtZXNzYWdlLiBPZmZzZXQgbXVzdCBlaXRoZXIgbGF5IHdpdGhpbiB0aGUgcGFydCBvZiB0aGUgODAyLjMgZnJhbWUgYXMgc3RvcmVkCiogYnkgaGNmX3NlcnZpY2VfbmljIGluIHRoZSBsb29rYWhlYWQgYnVmZmVyIG9yIGJlIGp1c3QgYmVoaW5kIGl0LCBpLmUuIHRoZSBmaXJzdCBieXRlIG5vdCB5ZXQgcmVhZC4KKiBXaGVuIG9mZnNldCBpcyB3aXRoaW4gbG9va2FoZWFkLCBkYXRhIGlzIGNvcGllZCBmcm9tIGxvb2thaGVhZC4KKiBXaGVuIG9mZnNldCBpcyBiZXlvbmQgbG9va2FoZWFkLCBkYXRhIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSBSeEZTIGluIE5JQyB3aXRoIGRpc3JlZ2FyZCBvZiB0aGUgYWN0dWFsIHZhbHVlCiogb2Ygb2Zmc2V0CioKKi5OT1RJQ0U6CiogbyBhdCBlbnRyeTogbG9vayBhaGVhZCBidWZmZXIgYXMgcGFzc2VkIHdpdGggaGNmX3NlcnZpY2VfbmljIGlzIHN0aWxsIGFjY2Vzc2libGUgYW5kIHVuY2hhbmdlZAoqIG8gYXQgZXhpdDogUmVjZWl2ZSBGcmFtZSBpbiBOSUMgbWVtb3J5IGlzIHJlbGVhc2VkCioKKiBEZXNjcmlwdGlvbjoKKiBTdGFydGluZyBhdCB0aGUgYnl0ZSBpbmRpY2F0ZWQgYnkgdGhlIE9mZnNldCB2YWx1ZSwgdGhlIGJ5dGVzIGFyZSBjb3BpZWQgZnJvbSB0aGUgRGF0YSBJbmZvCiogUGFydCBvZiB0aGUgY3VycmVudCBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSB0byB0aGUgSG9zdCBtZW1vcnkgZGF0YSBidWZmZXIgc3RydWN0dXJlCiogaWRlbnRpZmllZCBieSBkZXNjcC4KKiBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgT2Zmc2V0IGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBvZiB0aGUgODAyLjMgZnJhbWUgcmVhZCBpbnRvIHRoZQoqIGxvb2sgYWhlYWQgYnVmZmVyIGJ5IGhjZl9zZXJ2aWNlX25pYyAoaS5lLiB0aGUgbG9vayBhaGVhZCBidWZmZXIgc2l6ZSBtaW51cwoqIENvbnRyb2wgYW5kIDgwMi4xMSBmaWVsZHMpCiogSWYgT2Zmc2V0IGlzIGxlc3MgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSwgY29weWluZyBzdGFydHMgZnJvbSB0aGUgbG9vayBhaGVhZCBidWZmZXIgdGlsbCB0aGUKKiBlbmQgb2YgdGhhdCBidWZmZXIgaXMgcmVhY2hlZAoqIFRoZW4gKG9yIGlmIHRoZSBtYXhpbXVtIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgT2Zmc2V0KSwgdGhlCiogbWVzc2FnZSBpcyBkaXJlY3RseSBjb3BpZWQgZnJvbSBOSUMgbWVtb3J5IHRvIEhvc3QgbWVtb3J5LgoqIElmIGFuIGludmFsaWQgKGkuZS4gdG9vIGxhcmdlKSBvZmZzZXQgaXMgc3BlY2lmaWVkLCBhbiBhc3NlcnQgY2F0Y2hlcyBidXQgdGhlIGJ1ZmZlciBjb250ZW50cyBhcmUKKiB1bmRlZmluZWQuCiogQ29weWluZyBzdG9wcyBpZiBlaXRoZXI6CiogbyB0aGUgZW5kIG9mIHRoZSA4MDIuMyBmcmFtZSBpcyByZWFjaGVkCiogbyB0aGUgRGVzY3JpcHRvciB3aXRoIGEgTlVMTCBwb2ludGVyIGluIHRoZSBuZXh0X2Rlc2NfYWRkciBmaWVsZCBpcyByZWFjaGVkCioKKiBXaGVuIHRoZSBjb3B5aW5nIHN0b3BzLCB0aGUgcmVjZWl2ZXIgaXMgYWNrJ2VkLCB0aHVzIGZyZWVpbmcgdGhlIE5JQyBtZW1vcnkgd2hlcmUgdGhlIGZyYW1lIGlzIHN0b3JlZAoqIEFzIGEgY29uc2VxdWVuY2UsIGhjZl9yY3ZfbXNnIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvciBhbnkgcGFydGljdWxhciBSeCBmcmFtZS4KKgoqIEZvciB0aGUgdGltZSBiZWluZyAoUENJIEJ1cyBtYXN0ZXJpbmcgbm90IHlldCBzdXBwb3J0ZWQpLCBvbmx5IHRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIGVhY2gKKiBvZiB0aGUgZGVzY3JpcHRvcnMgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBtdXN0IGJlIHNldCBieSB0aGUgTVNGOgoqIG8gYnVmX2NudGwuYnVmX2RpbVsxXQoqIG8gKm5leHRfZGVzY19hZGRyCiogbyAqYnVmX2FkZHIKKiBBdCByZXR1cm4gZnJvbSBoY2ZfcmN2X21zZywgdGhlIGZpZWxkIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gb2YgdGhlIHVzZWQgRGVzY3JpcHRvcnMgcmVmbGVjdHMKKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBEZXNjcmlwdG9yLgoqIE9uIHRoZSBsYXN0IHVzZWQgRGVzY3JpcHRvciwgYnVmX2NudGwuYnVmX2RpbVswXSBpcyBsZXNzIG9yIGVxdWFsIHRvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMV0uCiogT24gYWxsIHByZWNlZGluZyBEZXNjcmlwdG9ycyBidWZfY250bC5idWZfZGltWzBdIGlzIGVxdWFsIHRvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMV0uCiogT24gYWxsIHN1Y2NlZWRpbmcgKHVudXNlZCkgRGVzY3JpcHRvcnMsIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgemVyby4KKiBOb3RlOiB0aGlzIEkvRiBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbnMgaG93IHRoZSBJL0YgbmVlZGVkIGZvciBQQ0kgQnVzIG1hc3RlcmluZyB3aWxsCiogYmUsIHNvIGl0IG1heSBjaGFuZ2UuCioKKiBUaGUgbW9zdCBsaWtlbHkgaGFuZGxpbmcgb2YgSENGX0VSUl9OT19OSUMgYnkgdGhlIE1TRiBpcyB0byBkcm9wIHRoZSBhbHJlYWR5IGNvcGllZAoqIGRhdGEgYXMgZWxlZ2FudGx5IGFzIHBvc3NpYmxlIHVuZGVyIHRoZSBjb25zdHJhaW50cyBhbmQgcmVxdWlyZW1lbnRzIHBvc2VkIGJ5IHRoZSAoTilPUy4KKiBJZiBubyByZWNlaXZlZCBGcmFtZSBTdHJ1Y3R1cmUgaXMgcGVuZGluZywgIlN1Y2Nlc3MiIHJhdGhlciB0aGFuICJSZWFkIGVycm9yIiBpcyByZXR1cm5lZC4KKiBUaGlzIGVycm9yIGNvbnN0aXR1dGVzIGEgbG9naWMgZmxhdyBpbiB0aGUgTVNGCiogVGhlIEhDRiBjYW4gb25seSBjYXRjaCBhIG1pbm9yaXR5IG9mIHRoaXMKKiB0eXBlIG9mIGVycm9ycwoqIEJhc2VkIG9uIGNvbnNpc3RlbmN5IGlkZWFzLCB0aGUgSENGIGNhdGNoZXMgbm9uZSBvZiB0aGVzZSBlcnJvcnMuCioKKiBBc3NlcnQgZmFpbHMgaWYKKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZQoqIC0gdGhlcmUgaXMgbm8gdW5hY2tub3dsZWRnZWQgUngtbWVzc2FnZSBhdmFpbGFibGUKKiAtIG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UgKG91dHNpZGUgbG9vayBhaGVhZCBidWZmZXIpCiogLSBkZXNjcCBpcyBhIE5VTEwgcG9pbnRlcgoqIC0gYW55IG9mIHRoZSBkZXNjcmlwdG9ycyBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAoqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgoqIAlhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKiAtIEludGVycnVwdHMgYXJlIGVuYWJsZWQuCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKiAtIGJ5IHVzaW5nIHVuc2lnbmVkIGludCBhcyB0eXBlIGZvciBvZmZzZXQsIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgbmVnYXRpdmUgb2Zmc2V0cwoqIC0gQXNzZXJ0aW5nIG9uIGJlaW5nIGVuYWJsZWQvcHJlc2VudCBpcyBzdXBlcmZsdW91cywgc2luY2UgYSBub24temVybyBJRkJfbGFsIGltcGxpZXMgdGhhdCBoY2Zfc2VydmljZV9uaWMKKiAgIHdhcyBjYWxsZWQgYW5kIGRldGVjdGVkIGEgUngtbWVzc2FnZS4gQSB6ZXJvIElGQl9sYWwgd2lsbCBzZXQgdGhlIEJVRl9DTlQgZmllbGQgb2YgYXQgbGVhc3QgdGhlIGZpcnN0CiogICBkZXNjcmlwdG9yIHRvIHplcm8uCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2ZfcmN2X21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgdW5zaWduZWQgaW50IG9mZnNldCApCnsKaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKd2NpX2J1ZnAJY3A7CQkJCQkJCQkJCS8vY2hhciBvcmllbnRlZCB3b3JraW5nIHBvaW50ZXIKaGNmXzE2CQlpOwppbnQJCQl0b3RfbGVuID0gaWZicC0+SUZCX1J4TGVuIC0gb2Zmc2V0OwkJLy90b3RhbCBsZW5ndGgKd2NpX2J1ZnAJbGFwID0gaWZicC0+SUZCX2xhcCArIG9mZnNldDsJCQkvL3N0YXJ0IGFkZHJlc3MgaW4gTG9va0FoZWFkIEJ1ZmZlcgpoY2ZfMTYJCWxhbCA9IGlmYnAtPklGQl9sYWwgLSBvZmZzZXQ7CQkJLy9hdmFpbGFibGUgZGF0YSB3aXRoaW4gTG9va0FoZWFkIEJ1ZmZlcgpoY2ZfMTYJCWo7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9SQ1ZfTVNHLCBvZmZzZXQgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQoJSENGQVNTRVJUX0lOVAoJSENGQVNTRVJUKCBkZXNjcCwgSENGX1RSQUNFX1JDVl9NU0cgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnhMZW4sIEhDRl9UUkFDRV9SQ1ZfTVNHICkKCUhDRkFTU0VSVCggaWZicC0+SUZCX1J4TGVuID49IG9mZnNldCwgTUVSR0VfMiggb2Zmc2V0LCBpZmJwLT5JRkJfUnhMZW4gKSApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9sYWwgPj0gb2Zmc2V0LCBvZmZzZXQgKQoJSENGQVNTRVJUKCAoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSA9PSAwLCAweERBREEgKQoKCWlmICggdG90X2xlbiA8IDAgKSB7CgkJbGFsID0gMDsgdG90X2xlbiA9IDA7CQkJCS8vc3VwcHJlc3MgYWxsIGNvcHlpbmcgYWN0aXZpdHkgaW4gdGhlIGRvLS13aGlsZSBsb29wCgl9CglkbyB7CQkJCQkJCQkJLy9sb29wIG92ZXIgYWxsIGF2YWlsYWJsZSBmcmFnbWVudHMKCQkvLyBvYm5veGlvdXMgaGNmLmMoMTQ4MCkgOiB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIKCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKWRlc2NwICYgMyApID09IDAsIChoY2ZfMzIpZGVzY3AgKQoJCWNwID0gZGVzY3AtPmJ1Zl9hZGRyOwoJCWogPSBtaW4oIChoY2ZfMTYpdG90X2xlbiwgZGVzY3AtPkJVRl9TSVpFICk7CS8vbWluaW11bSBvZiAid2hhdCdzYCBhdmFpbGFibGUiIGFuZCBmcmFnbWVudCBzaXplCgkJZGVzY3AtPkJVRl9DTlQgPSBqOwoJCXRvdF9sZW4gLT0gajsJCQkJCQkvL2FkanVzdCBsZW5ndGggc3RpbGwgdG8gZ28KCQlpZiAoIGxhbCApIHsJCQkJCQkvL2lmIGxvb2thaGVhZCBCdWZmZXIgbm90IHlldCBjb21wbGV0ZWx5IGNvcGllZAoJCQlpID0gbWluKCBsYWwsIGogKTsJCQkJLy9taW5pbXVtIG9mICJ3aGF0J3MgYXZhaWxhYmxlIiBpbiBMb29rQWhlYWQgYW5kIGZyYWdtZW50IHNpemUKCQkJbGFsIC09IGk7CQkJCQkJLy9hZGp1c3QgbGVuZ3RoIHN0aWxsIGF2YWlsYWJsZSBpbiBMb29rQWhlYWQKCQkJaiAtPSBpOwkJCQkJCQkvL2FkanVzdCBsZW5ndGggc3RpbGwgYXZhaWxhYmxlIGluIGN1cnJlbnQgZnJhZ21lbnQKCQkJLyo7PyB3aGlsZSBsb29wIGNvdWxkIGJlIGltcHJvdmVkIGJ5IG1vdmluZyB3b3JkcyBidXQgdGhhdCBpcyBjb21wbGljYXRlZCBvbiBwbGF0Zm9ybXMgd2l0aAoJCQkgKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzKi8KCQkJd2hpbGUgKCBpLS0gKSAqY3ArKyA9ICpsYXArKzsKCQl9CgkJaWYgKCBqICkgewkvL2lmIExvb2tBaGVhZCBCdWZmZXIgZXhoYXVzdGVkIGJ1dCBzdGlsbCBzcGFjZSBpbiBmcmFnbWVudCwgY29weSBkaXJlY3RseSBmcm9tIE5JQyBSQU0KCQkJZ2V0X2ZyYWcoIGlmYnAsIGNwLCBqIEJFX1BBUigwKSApOwoJCQlDQUxDX1JYX01JQyggY3AsIGogKTsKCQl9Cgl9IHdoaWxlICggKCBkZXNjcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKTsKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKCWlmICggaWZicC0+SUZCX1J4RklEICkgewoJCXJjID0gY2hlY2tfbWljKCBpZmJwICk7CQkJCS8vcHJldmVudHMgTUlDIGVycm9yIHJlcG9ydCBpZiBoY2Zfc2VydmljZV9uaWMgYWxyZWFkeSBjb25zdW1lZCBhbGwKCX0KI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoJKHZvaWQpaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9SWF9BQ0sgKTsJCS8vb25seSAxIHNob3QgdG8gZ2V0IHRoZSBkYXRhLCBzbyBmcmVlIHRoZSByZXNvdXJjZXMgaW4gdGhlIE5JQwoJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQoJSENGTE9HRVhJVCggSENGX1RSQUNFX1JDVl9NU0cgKQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9yY3ZfbXNnCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX3NlbmRfbXNnKCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCiouUFVSUE9TRQkJRW5jYXBzdWxhdGUgYSBtZXNzYWdlIGFuZCBhcHBlbmQgcGFkZGluZyBhbmQgTUlDLgoqCQkJCW5vbi1VU0I6IFRyYW5zZmVycyB0aGUgcmVzdWx0aW5nIG1lc3NhZ2UgZnJvbSBIb3N0IHRvIE5JQyBhbmQgaW5pdGlhdGVzIHRyYW5zbWlzc2lvbi4KKgkJCQlVU0I6IFRyYW5zZmVyIHJlc3VsdGluZyBtZXNzYWdlIGludG8gYSBmbGF0IGJ1ZmZlci4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWRlc2NwCQlwb2ludGVyIHRvIHRoZSBEZXNjcmlwdG9yTGlzdCBvciBOVUxMCioJdHhfY250bAkJaW5kaWNhdGVzIE1BQy1wb3J0IGFuZCAoSGVybWVzKSBvcHRpb25zCioJCQkJCUhGU19UWF9DTlRMX1NQRUNUUkFMSU5LCioJCQkJCUhGU19UWF9DTlRMX1BSSU8KKgkJCQkJSEZTX1RYX0NOVExfVFhfT0sKKgkJCQkJSEZTX1RYX0NOVExfVFhfRVgKKgkJCQkJSEZTX1RYX0NOVExfVFhfREVMQVkKKgkJCQkJSEZTX1RYX0NOVExfVFhfQ09OVAoqCQkJCQlIQ0ZfUE9SVF8wCQkJCSBNQUMgUG9ydCAwIChkZWZhdWx0KQoqCQkJCQlIQ0ZfUE9SVF8xIChBUCBvbmx5KQkgTUFDIFBvcnQgMQoqCQkJCQlIQ0ZfUE9SVF8yIChBUCBvbmx5KQkgTUFDIFBvcnQgMgoqCQkJCQlIQ0ZfUE9SVF8zIChBUCBvbmx5KQkgTUFDIFBvcnQgMwoqCQkJCQlIQ0ZfUE9SVF80IChBUCBvbmx5KQkgTUFDIFBvcnQgNAoqCQkJCQlIQ0ZfUE9SVF81IChBUCBvbmx5KQkgTUFDIFBvcnQgNQoqCQkJCQlIQ0ZfUE9SVF82IChBUCBvbmx5KQkgTUFDIFBvcnQgNgoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCioJSENGX0VSUl9ERUZVTkNUXy4uCioJSENGX0VSUl9USU1FX09VVAoqCiouREVTQ1JJUFRJT046CiogVGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBlbWJvZGllcyAyIGZ1bmN0aW9uczoKKiBvIHRyYW5zZmVycyBhIG1lc3NhZ2UgKGluY2x1ZGluZyBNQUMgaGVhZGVyKSBmcm9tIHRoZSBwcm92aWRlZCBidWZmZXIgc3RydWN0dXJlIGluIEhvc3QgbWVtb3J5IHRvIHRoZSBUcmFuc21pdAoqIEZyYW1lIFN0cnVjdHVyZSAoVHhGUykgaW4gTklDIG1lbW9yeS4KKiBvIElzc3VlIGEgc2VuZCBjb21tYW5kIHRvIHRoZSBGL1cgdG8gYWN0dWFsbHkgdHJhbnNtaXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBUeEZTLgoqCiogQ29udHJvbCBpcyBiYXNlZCBvbiB0aGUgUmVzb3VyY2UgSW5kaWNhdG9yIElGQl9Sc2NJbmQuCiogVGhlIFJlc291cmNlIEluZGljYXRvciBpcyBtYWludGFpbmVkIGJ5IHRoZSBIQ0YgYW5kIHNob3VsZCBvbmx5IGJlIGludGVycHJldGVkIGJ1dCBub3QgY2hhbmdlZCBieSB0aGUgTVNGLgoqIFRoZSBNU0YgbXVzdCBjaGVjayBJRkJfUnNjSW5kIHRvIGJlIG5vbi16ZXJvIGJlZm9yZSBleGVjdXRpbmcgdGhlIGNhbGwgdG8gdGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbi4KKiBXaGVuIG5vIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLCB0aGUgTVNGIG11c3QgaGFuZGxlIHRoZSBxdWV1aW5nIG9mIHRoZSBUcmFuc21pdCBmcmFtZSBhbmQgY2hlY2sgdGhlCiogUmVzb3VyY2UgSW5kaWNhdG9yIHBlcmlvZGljYWxseSBhZnRlciBjYWxsaW5nIGhjZl9zZXJ2aWNlX25pYy4KKgoqIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb25zIHRyYW5zZmVycyBhIG1lc3NhZ2UgdG8gTklDIG1lbW9yeSB3aGVuIGl0IGlzIGNhbGxlZCB3aXRoIGEgbm9uLU5VTEwgZGVzY3AuCiogQmVmb3JlIHRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gaXMgaW52b2tlZCB0aGlzIHdheSwgdGhlIFJlc291cmNlIEluZGljYXRvciAoSUZCX1JzY0luZCkgbXVzdCBiZSBjaGVja2VkLgoqIElmIHRoZSBSZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlLCBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gZXhlY3V0aW9uIG11c3QgYmUgcG9zdHBvbmVkIHVudGlsIGFmdGVyIHByb2Nlc3Npbmcgb2YKKiBhIG5leHQgaGNmX3NlcnZpY2VfbmljIGl0IGFwcGVhcnMgdGhhdCB0aGUgUmVzb3VyY2UgaGFzIGJlY29tZSBhdmFpbGFibGUuCiogVGhlIG1lc3NhZ2UgaXMgY29waWVkIGZyb20gdGhlIGJ1ZmZlciBzdHJ1Y3R1cmUgaWRlbnRpZmllZCBieSBkZXNjcCB0byB0aGUgTklDLgoqIENvcHlpbmcgc3RvcHMgaWYgYSBOVUxMIHBvaW50ZXIgaW4gdGhlIG5leHRfZGVzY19hZGRyIGZpZWxkIGlzIHJlYWNoZWQuCiogSGNmX3NlbmRfbXNnIGRvZXMgbm90IGNoZWNrIGZvciB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3csIGJlY2F1c2UgdGhlIEYvVyBkb2VzIHRoaXMgcHJvdGVjdGlvbi4KKiBJbiBjYXNlIG9mIGEgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93LCB0aGUgc3VycGx1cyB3aGljaCBkb2VzIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlciBpcyBzaW1wbHkgZHJvcHBlZC4KKgoqIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gYWN0aXZhdGVzIHRoZSBGL1cgdG8gYWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgbWVkaXVtIHdoZW4gdGhlCiogSEZTX1RYX0NOVExfVFhfREVMQVkgYml0IG9mIHRoZSB0eF9jbnRsIHBhcmFtZXRlciBpcyBub3Qgc2V0LgoqIElmIHRoZSBkZXNjcCBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgY2FsbCBpcyBub24tTlVMTCwgdGhlIG1lc3NhZ2UgYXMgcmVwcmVzZW50ZWQgYnkgZGVzY3AgaXMgc2VuZC4KKiBJZiB0aGUgZGVzY3AgcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGNhbGwgaXMgTlVMTCwgYW5kIGlmIHRoZSBwcmVjZWRpbmcgY2FsbCBvZiB0aGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGhhZAoqIGEgbm9uLU5VTEwgZGVzY3AgYW5kIHRoZSBwcmVjZWRpbmcgY2FsbCBoYWQgdGhlIEhGU19UWF9DTlRMX1RYX0RFTEFZIGJpdCBvZiB0eF9jbnRsIHNldCwgdGhlbiB0aGUgbWVzc2FnZSBhcwoqIHJlcHJlc2VudGVkIGJ5IHRoZSBkZXNjcCBvZiB0aGUgcHJlY2VkaW5nIGNhbGwgaXMgc2VuZC4KKgoqIEhjZl9zZW5kX21zZyBzdXBwb3J0cyBlbmNhcHN1bGF0aW9uIChzZWUgSENGX0VOQ0FQKSBvZiBFdGhlcm5ldC1JSSBmcmFtZXMuCiogQW4gRXRoZXJuZXQtSUkgZnJhbWUgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIFRyYW5zbWl0IEZyYW1lIHN0cnVjdHVyZSBhcyBhbiA4MDIuMyBmcmFtZS4KKiBIY2Zfc2VuZF9tc2cgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFuIDgwMi4zIGFuZCBhbiBFdGhlcm5ldC1JSSBmcmFtZSBieSBsb29raW5nIGF0IHRoZSBkYXRhIGxlbmd0aC90eXBlIGZpZWxkCiogb2YgdGhlIGZyYW1lLiBJZiB0aGlzIGZpZWxkIGNvbnRhaW5zIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMTUxNCwgdGhlIGZyYW1lIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gRXRoZXJuZXQtSUkKKiBmcmFtZSwgb3RoZXJ3aXNlIGl0IGlzIHRyZWF0ZWQgYXMgYW4gODAyLjMgZnJhbWUuCiogVG8gZWFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSENGLCB0aGlzIHR5cGUvdHlwZSBmaWVsZCBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IGRlc2NyaXB0b3Igc3RydWN0dXJlLAoqIGkuZS4gdGhlIDFzdCBmcmFnbWVudCBtdXN0IGhhdmUgYSBzaXplIG9mIGF0IGxlYXN0IDE0ICh0byBjb250YWluIERlc3RBZGRyLCBTcmNBZGRyIGFuZCBMZW4vVHlwZSBmaWVsZCkuCiogQW4gRXRoZXJuZXQtSUkgZnJhbWUgaXMgZW5jYXBzdWxhdGVkIGJ5IGluc2VydGluZyBhIFNOQVAgaGVhZGVyIGJldHdlZW4gdGhlIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gYW5kIHRoZQoqIHR5cGUgZmllbGQuICBUaGlzIGluc2VydGlvbiBpcyB0cmFuc3BhcmVudCBmb3IgdGhlIE1TRi4KKiBUaGUgSENGIGNvbnRhaW5zIGEgZml4ZWQgdGFibGUgdGhhdCBzdG9yZXMgYSBudW1iZXIgb2YgdHlwZXMuIElmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIHR5cGUvdHlwZSBmaWVsZAoqIG9jY3VycyBpbiB0aGlzIHRhYmxlLCBCcmlkZ2UgVHVubmVsIEVuY2Fwc3VsYXRpb24gaXMgdXNlZCwgb3RoZXJ3aXNlIFJGQzEwNDIgZW5jYXBzdWxhdGlvbiBpcyB1c2VkLgoqIEJyaWRnZSBUdW5uZWwgdXNlcwlBQSBBQSAwMyAwMCAwMCBGOCBhcyBTTkFQIGhlYWRlciwKKiBSRkMxMDQyIHVzZXMJQUEgQUEgMDMgMDAgMDAgMDAgYXMgU05BUCBoZWFkZXIuCiogVGhlIHRhYmxlIGN1cnJlbnRseSBjb250YWluczoKKiAwIDB4ODBGMwlBcHBsZVRhbGsgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIChBQVJQKQoqIDAgMHg4MTM3CUlQWAoqCiogVGhlIGFsZ29yaXRobSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDgwMi4zIGFuZCBFdGhlcm5ldC1JSSBmcmFtZXMgbGltaXRzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZnJhbWVzIG9mCiogODAyLjMgZnJhbWVzIHRvIDE1MTQgYnl0ZXMuCiogRW5jYXBzdWxhdGlvbiBjYW4gYmUgc3VwcHJlc3NlZCBieSBtZWFucyBvZiB0aGUgc3lzdGVtIGNvbnN0YW50IEhDRl9FTkNBUCwgZS5nLiB0byBzdXBwb3J0IHByb3ByaWV0YXJ5CiogcHJvdG9jb2xzIHdpdGggODAyLjMgbGlrZSBmcmFtZXMgd2l0aCBhIHNpemUgbGFyZ2VyIHRoYW4gMTUxNCBieXRlcy4KKgoqIEluIGNhc2UgdGhlIEhDRiBlbmNhcHN1bGF0ZXMgdGhlIGZyYW1lLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUKKiBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcy4KKiBJbiBjYXNlIHRoZSBIQ0YgZG9lcyBub3QgZW5jYXBzdWxhdGUgdGhlIGZyYW1lLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgaXMgbm90CiogZGV0ZXJtaW5lZCBieSB0aGUgY3VtdWxhdGl2ZSB2YWx1ZSBvZiB0aGUgYnVmX2NudGwuYnVmX2RpbVtERVNDX0NOVExfQ05UXSBmaWVsZHMgb2YgdGhlIGRlc2Nfc3RyY3QncyBidXQgYnkKKiB0aGUgTGVuZ3RoIGZpZWxkIG9mIHRoZSA4MDIuMyBmcmFtZS4KKiBJZiB0aGVyZSBpcyBhIGNvbmZsaWN0IGJldHdlZW4gdGhlIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gZmllbGRzIGFuZCB0aGUKKiA4MDIuMyBMZW5ndGggZmllbGQgdGhlIDgwMi4zIExlbmd0aCBmaWVsZCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgYnkgdGhlIE5JQyB3aGlsZQoqIHRoZSBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcyBkZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgTUlDLCBoZW5jZSBhIG1pc21hdGNoCiogd2lsbCByZXN1bHQgaW4gTUlDIGVycm9ycyBvbiB0aGUgUmVjZWl2aW5nIHNpZGUuCiogQ3VycmVudGx5IHRoaXMgcHJvYmxlbSBpcyBmbGFnZ2VkIG9uIHRoZSBUcmFuc21pdCBzaWRlIGJ5IGFuIEFzc2VydC4KKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBvZiBlYWNoIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IG11c3QgYmUgc2V0IGJ5IHRoZSBNU0Y6CiogbyBidWZfY250bC5idWZfZGltWzBdCiogbyAqbmV4dF9kZXNjX2FkZHIKKiBvICpidWZfYWRkcgoqCiogQWxsIGJpdHMgb2YgdGhlIHR4X2NudGwgcGFyYW1ldGVyIGV4Y2VwdCBIRlNfVFhfQ05UTF9UWF9ERUxBWSBhbmQgdGhlIEhDRl9QT1JUIyBiaXRzIGFyZSBwYXNzZWQgdG8gdGhlIEYvVyB2aWEKKiB0aGUgSEZTX1RYX0NOVEwgZmllbGQgb2YgdGhlIFR4RlMuCioKKiBOb3RlIHRoYXQgaGNmX3NlbmRfbXNnIGRvZXMgbm90IGRldGVjdCBOSUMgYWJzZW5jZS4gIFRoZSBNU0YgaXMgc3VwcG9zZWQgdG8gaGF2ZSBpdHMgb3duIC1wbGF0Zm9ybSBkZXBlbmRlbnQtCiogd2F5IHRvIHJlY29nbml6ZSBjYXJkIHJlbW92YWwvaW5zZXJ0aW9uLgoqIFRoZSB0b3RhbCBzeXN0ZW0gbXVzdCBiZSByb2J1c3QgYWdhaW5zdCBjYXJkIHJlbW92YWwgYW5kIHRoZXJlIGlzIG5vIHByaW5jaXBhbCBkaWZmZXJlbmNlIGJldHdlZW4gY2FyZCByZW1vdmFsCioganVzdCBhZnRlciBoY2Zfc2VuZF9tc2cgcmV0dXJucyBidXQgYmVmb3JlIHRoZSBhY3R1YWwgdHJhbnNtaXNzaW9uIHRvb2sgcGxhY2Ugb3Igc29tZXRpbWUgZWFybGllci4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlCiogLSBkZXNjcCBpcyBhIE5VTEwgcG9pbnRlcgoqIC0gbm8gcmVzb3VyY2VzIGZvciBQSUYgYXZhaWxhYmxlLgoqIC0gSW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24KKglhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKgoqLkRJQUdSQU0KKjQ6CWZvciB0aGUgbm9ybWFsIGNhc2UgKGkuZS4gbm8gSEZTX1RYX0NOVExfVFhfREVMQVkgb3B0aW9uIGFjdGl2ZSksIGEgZmlkIGlzIGFjcXVpcmVkIHZpYSB0aGUKKglyb3V0aW5lIGdldF9maWQuICBJZiBubyBGSUQgaXMgYWNxdWlyZWQsIHRoZSByZW1haW5kZXIgaXMgc2tpcHBlZCB3aXRob3V0IGFuIGVycm9yIG5vdGlmaWNhdGlvbi4gIEFmdGVyCioJYWxsLCB0aGUgTVNGIGlzIG5vdCBzdXBwb3NlZCB0byBjYWxsIGhjZl9zZW5kX21zZyB3aGVuIG5vIFJlc291cmNlIGlzIGF2YWlsYWJsZS4KKjc6CVRoZSBDb250cm9sRmllbGQgb2YgdGhlIFR4RlMgaXMgd3JpdHRlbi4gIFNpbmNlIHB1dF9mcmFnIGNhbiBvbmx5IHJldHVybiB0aGUgZmF0YWwgRGVmdW5jdCBvciAiTm8gTklDIiwgdGhlCioJcmV0dXJuIHN0YXR1cyBjYW4gYmUgaWdub3JlZCBiZWNhdXNlIHdoZW4gaXQgZmFpbHMsIGNtZF93YWl0IHdpbGwgZmFpbCBhcyB3ZWxsLiAgKHNlZSBhbHNvIHRoZSBub3RlIG9uIHRoZQoqCW5lZWQgZm9yIGEgcmV0dXJuIGNvZGUgYmVsb3cpLgoqCU5vdGUgdGhhdCBIRlNfVFhfQ05UTCBoYXMgZGlmZmVyZW50IHZhbHVlcyBmb3IgSC1JLCBILUkvU1NOIGFuZCBILUlJIGFuZCBIRlNfQUREUl9ERVNUIGhhcyBkaWZmZXJlbnQKKgl2YWx1ZXMgZm9yIEgtSSAocmVnYXJkbGVzcyBvZiBTU04pIGFuZCBILUlJLgoqCUJ5IHdyaXRpbmcgMTcsIDEgb3IgMiAoIGltcGx5aW5nIDE2LCAwIG9yIDEgZ2FyYmFnZSB3b3JkIGFmdGVyIEhGU19UWF9DTlRMKSB0aGUgQkFQIGp1c3QgZ2V0cyB0bwoqCUhGU19BRERSX0RFU1QgZm9yIEgtSSwgSC1JL1NTTiBhbmQgSC1JSSByZXNwZWN0aXZlbHkuCioxMDogaWYgbmVpdGhlciBlbmNhcHN1bGF0aW9uIG5vciBNSUMgY2FsY3VsYXRpb24gaXMgbmVlZGVkLCBzcGxpdHRpbmcgdGhlIGZpcnN0IGZyYWdtZW50IGluIHR3byBkb2VzIG5vdAoqCXJlYWxseSBoZWxwIGJ1dCBpdCBtYWtlcyB0aGUgZmxvdyBlYXNpZXIgdG8gZm9sbG93IHRvIGRvIG5vdCBvcHRpbWl6ZSBvbiB0aGlzIGRpZmZlcmVuY2UKKgoqCWhjZl9zZW5kX21zZyBjaGVja3Mgd2hldGhlciB0aGUgZnJhbWUgaXMgYW4gRXRoZXJuZXQtSUkgcmF0aGVyIHRoYW4gYW4gIm9mZmljaWFsIiA4MDIuMyBmcmFtZS4KKglUaGUgRS1JSSBjaGVjayBpcyBiYXNlZCBvbiB0aGUgbGVuZ3RoL3R5cGUgZmllbGQgaW4gdGhlIE1BQyBoZWFkZXIuIElmIHRoaXMgZmllbGQgaGFzIGEgdmFsdWUgbGFyZ2VyIHRoYW4KKgkxNTAwLCBFLUlJIGlzIGFzc3VtZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHRlc3QgZmFpbHMgaWYgdGhlIGxlbmd0aC90eXBlIGZpZWxkIGlzIG5vdCBpbiB0aGUgZmlyc3QKKglkZXNjcmlwdG9yLiAgSWYgRS1JSSBpcyByZWNvZ25pemVkLCBhIFNOQVAgaGVhZGVyIGlzIGluc2VydGVkLiBUaGlzIFNOQVAgaGVhZGVyIHJlcHJlc2VudHMgZWl0aGVyIFJGQzEwNDIKKglvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgcmV0dXJuIHN0YXR1cyBvZiB0aGUgc3VwcG9ydCByb3V0aW5lIGhjZl9lbmNhcC4KKgoqLk5PVElDRQoqCWhjZl9zZW5kX21zZyBsZWF2ZXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIG9ubHkgc2VuZCBtZXNzYWdlcyBvbiBlbmFibGVkIHBvcnRzIGF0IHRoZSBNU0YgbGV2ZWwuCioJVGhpcyBpcyBjb25zaWRlcmVkIHRoZSBzdHJhdGVneSB3aGljaCBpcyBzdWZmaWNpZW50bHkgYWRlcXVhdGUgZm9yIGFsbCAicm9idXN0IiBNU0ZzLCBoYXZlIHRoZSBsZWFzdAoqCXByb2Nlc3NvciB1dGlsaXphdGlvbiBhbmQgYmVpbmcgc3RpbGwgYWNjZXB0YWJsZSByb2J1c3QgYXQgdGhlIFdDSSAhISEhIQoqCioJaGNmX3NlbmRfbXNnIGRvZXMgbm90IE5FRUQgYSByZXR1cm4gdmFsdWUgdG8gcmVwb3J0IE5JQyBhYnNlbmNlIG9yIHJlbW92YWwgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YKKgloY2Zfc2VuZF9tc2coKSwgYmVjYXVzZSB0aGUgTVNGIGFuZCBoaWdoZXIgbGF5ZXJzIG11c3QgYmUgYWJsZSB0byBjb3BlIGFueXdheSB3aXRoIHRoZSBOSUMgYmVpbmcgcmVtb3ZlZAoqCWFmdGVyIGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGhjZl9zZW5kX21zZygpIGJ1dCBiZWZvcmUgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gdG9vayBwbGFjZS4KKglUbyBhY2NvbW1vZGF0ZSB1c2VyIGV4cGVjdGF0aW9ucyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIHJlcG9ydCBOSUMgYWJzZW5jZS4KKglEZWZ1bmN0IGJsb2NrcyBhbGwgTklDIGFjY2VzcyBhbmQgd2lsbCAoYWxzbykgYmUgcmVwb3J0ZWQgb24gYSBudW1iZXIgb2Ygb3RoZXIgY2FsbHMuCioKKgloY2Zfc2VuZF9tc2cgZG9lcyBub3QgY2hlY2sgZm9yIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdyBiZWNhdXNlIHRoZSBIZXJtZXMgZG9lcyB0aGlzIHByb3RlY3Rpb24uCioJSW4gY2FzZSBvZiBhIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdywgdGhlIHN1cnBsdXMgd2hpY2ggZG9lcyBub3QgZml0IGluIHRoZSBidWZmZXIgaXMgc2ltcGx5IGRyb3BwZWQuCioJTm90ZSB0aGF0IHRoaXMgcG9zc2libHkgcmVzdWx0cyBpbiB0aGUgdHJhbnNtaXNzaW9uIG9mIGluY29tcGxldGUgZnJhbWVzLgoqCioJQWZ0ZXIgc29tZSBkZWxpYmVyYXRpb24gd2l0aCBGL1cgdGVhbSwgaXQgaXMgZGVjaWRlZCB0aGF0IC0gYmVpbmcgaW4gdGhlIHR3aWxpZ2h0IHpvbmUgb2Ygbm90IGtub3dpbmcKKgl3aGV0aGVyIHRoZSBwcm9ibGVtIGF0IGhhbmQgaXMgYW4gTVNGIGJ1ZywgSENGIGJ1ZiwgRi9XIGJ1ZywgSC9XIG1hbGZ1bmN0aW9uIG9yIGV2ZW4gc29tZXRoaW5nIGVsc2UgLSB0aGVyZQoqCWlzIG5vICJiZXN0IHRoaW5nIHRvIGRvIiBpbiBjYXNlIG9mIGEgZmFpbGluZyBzZW5kLCBoZW5jZSB0aGUgSENGIGNvbnNpZGVycyB0aGUgVHhGSUQgb3duZXJzaGlwIHRvIGJlIHRha2VuCioJb3ZlciBieSB0aGUgRi9XIGFuZCBob3BlcyBmb3IgYW4gQWxsb2NhdGUgZXZlbnQgaW4gZHVlIHRpbWUKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CmhjZl9zZW5kX21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQp7CmludAkJCXJjID0gSENGX1NVQ0NFU1M7CkRFU0NfU1RSQ1QJKnAgLyogPSBkZXNjcCovOwkJLy93b3JraW5nIHBvaW50ZXIKaGNmXzE2CQlsZW47CQkJCQkvLyB0b3RhbCBieXRlIGNvdW50CmhjZl8xNgkJaTsKCmhjZl8xNgkJZmlkID0gMDsKCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9Sc2NJbmQgfHwgZGVzY3AgPT0gTlVMTCwgaWZicC0+SUZCX1JzY0luZCApCglIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpID09IDAsIDB4REFEQiApCgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9TRU5EX01TRywgdHhfY250bCApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCglIQ0ZBU1NFUlRfSU5UCgkvKiBvYm5veGlvdXMgYzovaGNmL2hjZi5jKDE0ODApIDogd2FybmluZyBDNDc2OTogY29udmVyc2lvbiBvZiBuZWFyIHBvaW50ZXIgdG8gbG9uZyBpbnRlZ2VyLAoJICogc28gc2tpcCAqLwoJSENGQVNTRVJUKCAoKGhjZl8zMilkZXNjcCAmIDMgKSA9PSAwLCAoaGNmXzMyKWRlc2NwICkKI2lmIEhDRl9BU1NFUlQKewlpbnQgeCA9IGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPT0gQ09NUF9JRF9GV19BUCA/IHR4X2NudGwgJiB+SEZTX1RYX0NOVExfUE9SVCA6IHR4X2NudGw7CglIQ0ZBU1NFUlQoICh4ICYgfkhDRl9UWF9DTlRMX01BU0sgKSA9PSAwLCB0eF9jbnRsICkKfQojZW5kaWYgLy8gSENGX0FTU0VSVAoKCWlmICggZGVzY3AgKSBpZmJwLT5JRkJfVHhGSUQgPSAwOwkJCQkvL2NhbmNlbCBhIHByZS1wdXQgbWVzc2FnZQoKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfVFhfQ09OVAkJCQkvLyBDb250aW51b3VzIHRyYW5zbWl0IHRlc3QKCWlmICggdHhfY250bCA9PSBIRlNfVFhfQ05UTF9UWF9DT05UICkgewoJIAlmaWQgPSBnZXRfZmlkKGlmYnApOwoJIAlpZiAoZmlkICE9IDAgKSB7CgkJCQkJCQkJCQkJLy9zZXR1cCBCQVAgdG8gYmVnaW4gb2YgVHhGUwoJCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgMCwgSU9fT1VUICk7CgkJCQkJCQkJCQkJLy9jb3B5IGFsbCB0aGUgZnJhZ21lbnRzIGluIGEgdHJhbnNwYXJlbnQgZmFzaGlvbgoJCSAJZm9yICggcCA9IGRlc2NwOyBwOyBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSB7CgkJCS8qIG9ibm94aW91cyB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIgKi8KCQkJCUhDRkFTU0VSVCggKChoY2ZfMzIpcCAmIDMgKSA9PSAwLCAoaGNmXzMyKXAgKQoJCQkJcHV0X2ZyYWcoIGlmYnAsIHAtPmJ1Zl9hZGRyLCBwLT5CVUZfQ05UIEJFX1BBUigwKSApOwoJCQl9CgkJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9USEVTRVVTIHwgSENNRF9CVVNZIHwgSENNRF9TVEFSVFBSRUFNQkxFLCBmaWQgKTsKCQkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7CgkJCQlpZmJwLT5JRkJfUnNjSW5kID0gZ2V0X2ZpZCggaWZicCApOwoJCQl9CgkJfQoJCQkJCQkJCQkJCS8vIGVlbiBzbGVjaHQgdm9vcmJlZWxkIGRvZXQgZ29lZCB2b2xnZW4gOz8KCQlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfU0VORF9NU0cgKQoJCXJldHVybiByYzsKCX0KI2VuZGlmIC8vIEhDRl9FWFRfVFhfQ09OVAoJCQkJCQkJCQkvKiB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIGNvZGUgaXMgcmVkdW5kYW50IGZvciBhIHByZS1wdXQgbWVzc2FnZQoJCQkJCQkJCQkgKiBidXQgbW92aW5nIGl0IGluc2lkZSB0aGUgImlmIGZpZCIgbG9naWMgbWFrZXMgdGhlIG1lcmdpbmcgd2l0aCB0aGUKCQkJCQkJCQkJICogVVNCIGZsb3cgYXdrd2FyZAoJCQkJCQkJCQkgKi8KI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKCXR4X2NudGwgfD0gaWZicC0+SUZCX01JQ1R4Q250bDsKI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoJZmlkID0gaWZicC0+SUZCX1R4RklEOwoJaWYgKGZpZCA9PSAwICYmICggZmlkID0gZ2V0X2ZpZCggaWZicCApICkgIT0gMCApIAkJLyogNCAqLwoJCQkvKiBza2lwIHRoZSBuZXh0IGNvbXBvdW5kIHN0YXRlbWVudCBpZjoKCQkJICAgLSBwcmUtcHV0IG1lc3NhZ2Ugb3IKCQkJICAgLSBubyBmaWQgYXZhaWxhYmxlICh3aGljaCBzaG91bGQgbmV2ZXIgb2NjdXIgaWYgdGhlIE1TRiBhZGhlcmVzIHRvIHRoZSBXQ0kpCgkJCSAqLwoJewkJLy8gdG8gbWF0Y2ggdGhlIGNsb3NpbmcgY3VybHkgYnJhY2tldCBvZiBhYm92ZSAiaWYiIGluIGNhc2Ugb2YgSENGX1RZUEVfVVNCCgkJCQkJCQkJCQkJLy9jYWxjdWxhdGUgdG90YWwgbGVuZ3RoIDs/IHN1cGVyZmx1b3VzIHVubGVzcyBDQ1ggb3IgRW5jYXBzdWxhdGlvbgoJCWxlbiA9IDA7CgkJcCA9IGRlc2NwOwoJCWRvIGxlbiArPSBwLT5CVUZfQ05UOyB3aGlsZSAoICggcCA9IHAtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApOwoJCXAgPSBkZXNjcDsKLy87PwlIQ0ZBU1NFUlQoIGxlbiA8PSBIQ0ZfTUFYX01TRywgbGVuICkKLyo3Ki8JKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIEhGU19UWF9DTlRMLCBJT19PVVQgKTsKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9UWF9ERUxBWQoJCUhDRkFTU0VSVCggKCBkZXNjcCAhPSBOVUxMICkgXiAoIHR4X2NudGwgJiBIRlNfVFhfQ05UTF9UWF9ERUxBWSApLCB0eF9jbnRsICkKCQlpZiAoIHR4X2NudGwgJiBIRlNfVFhfQ05UTF9UWF9ERUxBWSApIHsKCQkJdHhfY250bCAmPSB+SEZTX1RYX0NOVExfVFhfREVMQVk7CQkvLyEhSEZTX1RYX0NOVExfVFhfREVMQVkgbm8gbG9uZ2VyIGF2YWlsYWJsZQoJCQlpZmJwLT5JRkJfVHhGSUQgPSBmaWQ7CgkJCWZpZCA9IDA7CQkJCQkJCQkvLyEhZmlkIG5vIGxvbmdlciBhdmFpbGFibGUsIGJlIGNhcmVmdWwgd2hlbiBtb2RpZnlpbmcgY29kZQoJCX0KI2VuZGlmIC8vIEhDRl9UWVBFX1RYX0RFTEFZCgkJT1BXKCBIUkVHX0RBVEFfMSwgdHhfY250bCApIDsKCQlPUFcoIEhSRUdfREFUQV8xLCAwICk7CiNpZiAhICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWCApCgkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID49IDE0LCBwLT5CVUZfQ05UICkKCQkJCQkJCQkJCQkvKiBhc3N1bWUgRGVzdEFkZHIvU3JjQWRkci9MZW4vVHlwZSBBTFdBWVMgY29udGFpbmVkIGluIDFzdCBmcmFnbWVudAoJCQkJCQkJCQkJCSAqIG90aGVyd2lzZSBsaWZlIGdldHMgdG9vIGN1bWJlcnNvbWUgZm9yIE1JQyBhbmQgRW5jYXBzdWxhdGlvbiAhISEhISEhIQoJCWlmICggcC0+QlVGX0NOVCA+PSAxNCApIHsJYWx0ZXJuYXRpdmVseTogYWRkIGEgc2FmZXR5IGVzY2FwZSAhISEhISEhISEhISEgfQkqLwojZW5kaWYgLy8gSENGX1RZUEVfQ0NYCgkJQ0FMQ19UWF9NSUMoIE5VTEwsIC0xICk7CQkvL2luaXRpYWxpemUgTUlDCi8qMTAqLwlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgQkVfUEFSKDApICk7CS8vd3JpdGUgREEsIFNBIHdpdGggTUlDIGNhbGN1bGF0aW9uCgkJQ0FMQ19UWF9NSUMoIHAtPmJ1Zl9hZGRyLCBIQ0ZfREFTQV9TSVpFICk7CQkvL01JQyBvdmVyIERBLCBTQQoJCUNBTENfVFhfTUlDKCBudWxsX2FkZHIsIDQgKTsJCS8vTUlDIG92ZXIgKHZpcnR1YWwpIHByaW9yaXR5IGZpZWxkCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCgkJLy8hIWJlIGNhcmVmdWwgZG8gbm90IHVzZSBwb3NpdGl2ZSB0ZXN0IG9uIEhDRl9BQ1RfQ0NYX09GRiwgYmVjYXVzZSBJRkJfQ0tJUFN0YXQgaXMgaW5pdGlhbGx5IDAKCQlpZigoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PTiApIHx8CiAgICAgICAgICAgKChHRVRfQlVGX0NOVChwKSA+PSAyMCApICAgJiYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkgJiYKICAgICAgICAgICAgKHAtPmJ1Zl9hZGRyWzEyXSA9PSAweEFBKSAmJiAocC0+YnVmX2FkZHJbMTNdID09IDB4QUEpICYmCiAgICAgICAgICAgIChwLT5idWZfYWRkclsxNF0gPT0gMHgwMykgJiYgKHAtPmJ1Zl9hZGRyWzE1XSA9PSAweDAwKSAmJgogICAgICAgICAgICAocC0+YnVmX2FkZHJbMTZdID09IDB4NDApICYmIChwLT5idWZfYWRkclsxN10gPT0gMHg5NikgJiYKICAgICAgICAgICAgKHAtPmJ1Zl9hZGRyWzE4XSA9PSAweDAwKSAmJiAocC0+YnVmX2FkZHJbMTldID09IDB4MDApKSkKICAgICAgICB7CiAgICAgICAgICAgIGkgPSBIQ0ZfREFTQV9TSVpFOwoKICAgICAgICAgICAgT1BXKCBIUkVHX0RBVEFfMSwgQ05WX1NIT1JUX1RPX0JJRyggbGVuIC0gaSApKTsKCiAgICAgICAgICAgIC8qIG5lZWQgdG8gc2VuZCBvdXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgZnJhZ21lbnQgKi8KCQkJcHV0X2ZyYWcoIGlmYnAsICZwLT5idWZfYWRkcltpXSwgR0VUX0JVRl9DTlQocCkgLSBpIEJFX1BBUigwKSApOwogICAgICAgIH0KICAgICAgICBlbHNlCiNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKCQl7CgkJCQkJCQkJCQkJLy9pZiBlbmNhcHN1bGF0aW9uIG5lZWRlZAojaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwoJCQkJCQkJCQkJCS8vd3JpdGUgbGVuZ3RoICh3aXRoIFNOQVAtaGVhZGVyLFR5cGUsIHdpdGhvdXQgLy9EQSxTQSxMZW5ndGggKSBubyBNSUMgY2FsYy4KCQkJaWYgKCAoIHNuYXBfaGVhZGVyW3NpemVvZihzbmFwX2hlYWRlciktMV0gPSBoY2ZfZW5jYXAoICZwLT5idWZfYWRkcltIQ0ZfREFTQV9TSVpFXSApICkgIT0gRU5DX05PTkUgKSB7CgkJCQlPUFcoIEhSRUdfREFUQV8xLCBDTlZfRU5EX1NIT1JUKCBsZW4gKyAoc2l6ZW9mKHNuYXBfaGVhZGVyKSArIDIpIC0gKCAyKjYgKyAyICkgKSApOwoJCQkJCQkJCQkJCS8vd3JpdGUgc3BsaWNlIHdpdGggTUlDIGNhbGN1bGF0aW9uCgkJCQlwdXRfZnJhZyggaWZicCwgc25hcF9oZWFkZXIsIHNpemVvZihzbmFwX2hlYWRlcikgQkVfUEFSKDApICk7CgkJCQlDQUxDX1RYX01JQyggc25hcF9oZWFkZXIsIHNpemVvZihzbmFwX2hlYWRlcikgKTsJLy9NSUMgb3ZlciA2IGJ5dGUgU05BUAoJCQkJaSA9IEhDRl9EQVNBX1NJWkU7CgkJCX0gZWxzZQojZW5kaWYgLy8gSENGX0VOQwoJCQl7CgkJCQlPUFcoIEhSRUdfREFUQV8xLCAqKHdjaV9yZWNvcmRwKSZwLT5idWZfYWRkcltIQ0ZfREFTQV9TSVpFXSApOwoJCQkJaSA9IDE0OwoJCQl9CgkJCQkJCQkJCQkJLy9jb21wbGV0ZSAxc3QgZnJhZ21lbnQgc3RhcnRpbmcgd2l0aCBUeXBlIHdpdGggTUlDIGNhbGN1bGF0aW9uCgkJCXB1dF9mcmFnKCBpZmJwLCAmcC0+YnVmX2FkZHJbaV0sIHAtPkJVRl9DTlQgLSBpIEJFX1BBUigwKSApOwoJCQlDQUxDX1RYX01JQyggJnAtPmJ1Zl9hZGRyW2ldLCBwLT5CVUZfQ05UIC0gaSApOwoJCX0KCQkJCQkJCQkJCQkvL2RvIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzIHdpdGggTUlDIGNhbGN1bGF0aW9uCgkJd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKSB7CgkJCS8qIG9ibm94aW91cyBjOi9oY2YvaGNmLmMoMTQ4MCkgOiB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIsCgkJCSAqIHNvIHNraXAgKi8KCQkJSENGQVNTRVJUKCAoKGhjZl8zMilwICYgMyApID09IDAsIChoY2ZfMzIpcCApCgkJCXB1dF9mcmFnKCBpZmJwLCBwLT5idWZfYWRkciwgcC0+QlVGX0NOVCBCRV9QQVIoMCkgKTsKCQkJQ0FMQ19UWF9NSUMoIHAtPmJ1Zl9hZGRyLCBwLT5CVUZfQ05UICk7CgkJfQoJCQkJCQkJCQkJCS8vcGFkIG1lc3NhZ2UsIGZpbmFsaXplIE1JQyBjYWxjdWxhdGlvbiBhbmQgd3JpdGUgTUlDIHRvIE5JQwoJCXB1dF9mcmFnX2ZpbmFsaXplKCBpZmJwICk7Cgl9CglpZiAoIGZpZCApIHsKLyoxNiovCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9CVVNZIHwgSENNRF9UWCB8IEhDTURfUkVDTCwgZmlkICk7CgkJaWZicC0+SUZCX1R4RklEID0gMDsKCQkJLyogcHJvYmFibHkgdGhpcyAoaS5lLiBubyBSc2NJbmQgQU5EICJIUkVHX0VWX0FMTE9DIikgYXQgdGhpcyBwb2ludCBpbiB0aW1lIG9jY3VycyBzbyBpbmZyZXF1ZW50LAoJCQkgKiB0aGF0IGl0IG1pZ2h0IGp1c3QgYXMgd2VsbCBiZSBhY2NlcHRhYmxlIHRvIHNraXAgdGhpcwoJCQkgKiAib3B0aW1pemF0aW9uIiBjb2RlIGFuZCBoYW5kbGUgdGhhdCBhZGRpdGlvbmFsIGludGVycnVwdCBvbmNlIGluIGEgd2hpbGUKCQkJICovCi8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1Ci8qMjAqLwlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMCApIHsKCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKCQl9Ci8vICNlbmRpZiAvLyBBTExPQ18xNQoJfQovLwlIQ0ZBU1NFUlQoIGxldmVsOjppZmJwLT5JRkJfUnNjSW5kLCBpZmJwLT5JRkJfUnNjSW5kICkKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9TRU5EX01TRyApCglyZXR1cm4gcmM7Cn0gLy8gaGNmX3NlbmRfbXNnCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX3NlcnZpY2VfbmljKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIHVuc2lnbmVkIGludCBsZW4gKQoqLlBVUlBPU0UJCVNlcnZpY2VzIChtb3N0KSBOSUMgZXZlbnRzLgoqCQkJCVByb3ZpZGVzIHJlY2VpdmVkIG1lc3NhZ2UKKgkJCQlQcm92aWRlcyBzdGF0dXMgaW5mb3JtYXRpb24uCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKiAgSW4gbm9uLURNQSBtb2RlOgoqCWJ1ZnAJCWFkZHJlc3Mgb2YgY2hhciBidWZmZXIsIHN1ZmZpY2llbnRseSBsYXJnZSB0byBob2xkIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBSeEZTIHVwIHRocm91Z2ggSEZTX1RZUEUKKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCioJCQkJdmFsdWUgYmV0d2VlbiBIRlNfVFlQRSArIDIgYW5kIEhGU19BRERSX0RFU1QgKyBIQ0ZfTUFYX01TRwoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCioJSENGX0VSUl9NSUMJbWVzc2FnZSBjb250YWlucyBhbiBlcnJvbmVvdXMgTUlDIChvbmx5IGlmIGZyYW1lIGZpdHMgY29tcGxldGVseSBpbiBidWZwKQoqCiouREVTQ1JJUFRJT04KKgoqIE1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2sKKiAtIElGQl9SeExlbgkJCTAgb3IgRnJhbWUgc2l6ZS4KKiAtIElGQl9NQkluZm9MZW4JCTAgb3IgdGhlIEwtZmllbGQgb2YgdGhlIG9sZGVzdCBNQklCLgoqIC0gSUZCX1JzY0luZAoqIC0gSUZCX0hDRl9UYWxsaWVzCQl1cGRhdGVkIGlmIGEgY29ycmVzcG9uZGluZyBldmVudCBvY2N1cnJlZC4KKiAtIElGQl9OSUNfVGFsbGllcwkJdXBkYXRlZCBpZiBhIFRhbGx5IEluZm8gZnJhbWUgcmVjZWl2ZWQgZnJvbSB0aGUgTklDLgoqIC0gSUZCX0RtYVBhY2tldHMKKiAtIElGQl9UeEZzU3RhdAoqIC0gSUZCX1R4RnNTd1N1cAoqIC0gSUZCX0xpbmtTdGF0CQlyZWZsZWN0cyBuZXcgbGluayBzdGF0dXMgb3IgMHgwMDAwIGlmIG5vIGNoYW5nZSByZWxhdGl2ZSB0byBwcmV2aW91cyBoY2Zfc2VydmljZV9uaWMgY2FsbC4Kb3IKKiAtIElGQl9MaW5rU3RhdAkJbGluayBzdGF0dXMsIDB4ODAwMCByZWZsZWN0cyBjaGFuZ2UgcmVsYXRpdmUgdG8gcHJldmlvdXMgaGNmX3NlcnZpY2VfbmljIGNhbGwuCioKKiBXaGVuIElGQl9NQkluZm9MZW4gaXMgbm9uLXplcm8sIGF0IGxlYXN0IG9uZSBNQklCIGlzIGF2YWlsYWJsZS4KKgoqIElGQl9SeExlbglyZWZsZWN0cyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzIGluIDgwMi4zIHZpZXcgKEluY2x1ZGluZyBEZXN0QWRkciwgU3JjQWRkciBhbmQgTGVuZ3RoLAoqIGV4Y2x1ZGluZyBNSUMtcGFkZGluZywgTUlDIGFuZCBzdW0gY2hlY2spIG9mIGFjdGl2ZSBSeCBGcmFtZSBTdHJ1Y3R1cmUuIElmIG5vIFJ4IERhdGEgcyBhdmFpbGFibGUsIElGQl9SeExlbgoqIGVxdWFscyAweDAwMDAuCiogUmVwZWF0ZWQgZXhlY3V0aW9uIGNhdXNlcyB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBzdWJzZXF1ZW50bHkgcmVjZWl2ZWQKKiBtZXNzYWdlcywgaXJyZXNwZWN0aXZlIHdoZXRoZXIgYSBoY2ZfcmN2X21zZyBvciBoY2ZfYWN0aW9uKEhDRl9BQ1RfUlgpIGlzIHBlcmZvcm1lZCBpbiBiZXR3ZWVuLgoqCiogV2hlbiBJRkJfUnhMZW4gaXMgbm9uLXplcm8sIGEgUmVjZWl2ZWQgRnJhbWUgU3RydWN0dXJlIGlzIGF2YWlsYWJsZSB0byBiZSByb3V0ZWQgdG8gdGhlIHByb3RvY29sIHN0YWNrLgoqIFdoZW4gTW9uaXRvciBNb2RlIGlzIG5vdCBhY3RpdmUsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSBhbiBlcnJvci1mcmVlIG5vbi1XTVAgZnJhbWUuCiogSW4gY2FzZSBvZiBNb25pdG9yIE1vZGUsIGl0IG1heSBhbHNvIGJlIGEgZnJhbWUgd2l0aCBhbiBlcnJvciBvciBhIFdNUCBmcmFtZS4KKiBFcnJvbmVvdXMgZnJhbWVzIGhhdmUgYSBub24temVybyBlcnJvci1zdWIgZmllbGQgaW4gdGhlIEhGU19TVEFUIGZpZWxkIGluIHRoZSBsb29rIGFoZWFkIGJ1ZmZlci4KKgoqIElmIGEgUmVjZWl2ZSBtZXNzYWdlIGlzIGF2YWlsYWJsZSBpbiBOSUMgUkFNLCB0aGUgUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgaXMgKHBhcnRseSkgY29waWVkIGZyb20gdGhlIE5JQyB0bwoqIHRoZSBidWZmZXIgaWRlbnRpZmllZCBieSBidWZwLgoqIENvcHlpbmcgc3RvcHMgZWl0aGVyIGFmdGVyIGxlbiBieXRlcyBvciB3aGVuIHRoZSBjb21wbGV0ZSA4MDIuMyBmcmFtZSBpcyBjb3BpZWQuCiogRHVyaW5nIHRoZSBjb3B5aW5nIHRoZSBtZXNzYWdlIGlzIGRlY2Fwc3VsYXRlZCAoaWYgYXBwcm9wcmlhdGUpLgoqIElmIHRoZSBmcmFtZSBpcyByZWFkIGNvbXBsZXRlbHkgYnkgaGNmX3NlcnZpY2VfbmljIChpLmUuIHRoZSBmcmFtZSBmaXRzIGNvbXBsZXRlbHkgaW4gdGhlIGxvb2thaGVhZCBidWZmZXIpLAoqIHRoZSBmcmFtZSBpcyBhdXRvbWF0aWNhbGx5IEFDSydlZCB0byB0aGUgRi9XIGFuZCBzdGlsbCBhdmFpbGFibGUgdmlhIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciBhbmQgaGNmX3Jjdl9tc2cuCiogT25seSBpZiB0aGUgZnJhbWUgaXMgcmVhZCBjb21wbGV0ZWx5IGJ5IGhjZl9zZXJ2aWNlX25pYywgaGNmX3NlcnZpY2VfbmljIGNoZWNrcyB0aGUgTUlDIGFuZCBzZXRzIHRoZSByZXR1cm4KKiBzdGF0dXMgYWNjb3JkaW5nbHkuICBJbiB0aGlzIGNhc2UsIGhjZl9yY3ZfbXNnIGRvZXMgbm90IGNoZWNrIHRoZSBNSUMuCioKKiBUaGUgTUlDIGNhbGN1bGF0aW9uIGFsZ29yaXRobSB3b3JrcyBtb3JlIGVmZmljaWVudCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciBpcwoqIHN1Y2ggdGhhdCBpdCBmaXRzIGV4YWN0bHkgNCBuIGJ5dGVzIG9mIHRoZSA4MDIuMyBmcmFtZSwgaS5lLiBsZW4gPT0gSEZTX0FERFJfREVTVCArIDQqbi4KKgoqIFRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBzdXBwb3J0cyB0aGUgTklDIGV2ZW50IHNlcnZpY2UgaGFuZGxpbmcgcHJvY2Vzcy4KKiBJdCBwZXJmb3JtcyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9ucyB0byBzZXJ2aWNlIHRoZSBOSUMsIHN1Y2ggdGhhdCB0aGUgZXZlbnQgY2F1c2UgaXMgZWxpbWluYXRlZCBhbmQgcmVsYXRlZAoqIGluZm9ybWF0aW9uIGlzIHNhdmVkLgoqIFRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBpcyBleGVjdXRlZCBieSB0aGUgTVNGIElTUiBvciBwb2xsaW5nIHJvdXRpbmUgYXMgZmlyc3Qgc3RlcCB0byBkZXRlcm1pbmUgdGhlIGV2ZW50CiogY2F1c2UocykuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIE1TRiB0byBwZXJmb3JtIGFsbCBub3QgZGlyZWN0bHkgTklDIHJlbGF0ZWQgaW50ZXJydXB0IHNlcnZpY2UKKiBhY3Rpb25zLCBlLmcuIGluIGEgUEMgZW52aXJvbm1lbnQgdGhpcyBpbmNsdWRlcyBzZXJ2aWNpbmcgdGhlIFBJQywgYW5kIG1hbmFnaW5nIHRoZSBQcm9jZXNzb3IgSW50ZXJydXB0CiogRW5hYmxpbmcvRGlzYWJsaW5nLgoqIEluIGNhc2Ugb2YgYSBwb2xsZWQgYmFzZWQgc3lzdGVtLCB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gbXVzdCBiZSBleGVjdXRlZCAiZnJlcXVlbnRseSIuCiogVGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIG1heSBoYXZlIHNpZGUgZWZmZWN0cyByZWxhdGVkIHRvIHRoZSBNYWlsYm94IGFuZCBSZXNvdXJjZSBJbmRpY2F0b3IgKElGQl9Sc2NJbmQpLgoqCiogaGNmX3NlcnZpY2VfbmljIHJldHVybnM6CiogLSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBhdmFpbGFibGUgTUJJQiAoSUZCX01CSW5mb0xlbikKKiAtIENoYW5nZXMgaW4gdGhlIGxpbmsgc3RhdHVzIChJRkJfTGlua1N0YXQpCiogLSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBhdmFpbGFibGUgUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgKElGQl9SeExlbikKKiAtIHVwZGF0ZWQgSUZCX1JzY0luZAoqIC0gVXBkYXRlZCBUYWxsaWVzCioKKiBoY2Zfc2VydmljZV9uaWMgaXMgcHJlc3VtZWQgdG8gbmVpdGhlciBpbnRlcnJ1cHQgb3RoZXIgSENGLXRhc2tzIG5vciB0byBiZSBpbnRlcnJ1cHRlZCBieSBvdGhlciBIQ0YtdGFza3MuCiogQSB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIHByZWNlZGUgaGNmX3NlcnZpY2VfbmljIGFzIHdlbGwgYXMgYWxsIG90aGVyIEhDRi10YXNrcyB3aXRoIGEgY2FsbCB0bwoqIGhjZl9hY3Rpb24gdG8gZGlzYWJsZSB0aGUgY2FyZCBpbnRlcnJ1cHRzIGFuZCwgYWZ0ZXIgYWxsIHdvcmsgaXMgY29tcGxldGVkLCB3aXRoIGEgY2FsbCB0byBoY2ZfYWN0aW9uIHRvCiogcmVzdG9yZSAod2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIGVuYWJsaW5nKSB0aGUgY2FyZCBpbnRlcnJ1cHRzLgoqIEluIGNhc2Ugb2YgYSBwb2xsZWQgZW52aXJvbm1lbnQsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgTVNGIHByb2dyYW1tZXIgaXMgc3VmZmljaWVudGx5IGZhbWlsaWFyIHdpdGggdGhlCiogc3BlY2lmaWMgcmVxdWlyZW1lbnRzIG9mIHRoYXQgZW52aXJvbm1lbnQgdG8gdHJhbnNsYXRlIHRoZSBpbnRlcnJ1cHQgc3RyYXRlZ3kgdG8gYSBwb2xsZWQgc3RyYXRlZ3kuCioKKiBoY2Zfc2VydmljZV9uaWMgc2VydmljZXMgdGhlIGZvbGxvd2luZyBIZXJtZXMgZXZlbnRzOgoqIC0gSFJFR19FVl9JTkZPCQlBc3luY2hyb25vdXMgSW5mb3JtYXRpb24gRnJhbWUKKiAtIEhSRUdfRVZfSU5GT19EUk9QCVdNQUMgZGlkIG5vdCBoYXZlIHN1ZmZpY2llbnQgUkFNIHRvIGJ1aWxkIFVuc29saWNpdGVkIEluZm9ybWF0aW9uIEZyYW1lCiogLSBIUkVHX0VWX1RYX0VYQwkJKGlmIGFwcGxpY2FibGUsIGkuZS4gc2VsZWN0ZWQgdmlhIEhDRl9FWFRfSU5UX1RYX0VYIGJpdCBvZiBIQ0ZfRVhUKQoqIC0gSFJFR19FVl9TTEVFUF9SRVEJKGlmIGFwcGxpY2FibGUsIGkuZS4gc2VsZWN0ZWQgdmlhIEhDRl9ERFMvSENGX0NEUyBiaXQgb2YgSENGX1NMRUVQKQoqICoqIGluIG5vbl9ETUEgbW9kZQoqIC0gSFJFR19FVl9BTExPQwkJQXN5bmNocm9ub3VzIHBhcnQgb2YgQWxsb2NhdGlvbi9SZWNsYWltIGNvbXBsZXRlZCB3aGlsZSBvdXQgb2YgcmVzb3VyY2VzIGF0CiogCQkJCQkJY29tcGxldGlvbiBvZiBoY2Zfc2VuZF9tc2cvbm90aWZ5CiogLSBIUkVHX0VWX1JYCQkJdGhlIGRldGVjdGlvbiBvZiB0aGUgYXZhaWxhYmlsaXR5IG9mIHJlY2VpdmVkIG1lc3NhZ2VzCiogCQkJCQkJaW5jbHVkaW5nIFdhdmVMQU4gTWFuYWdlbWVudCBQcm90b2NvbCAoV01QKSBtZXNzYWdlIHByb2Nlc3NpbmcKKiAqKiBpbiBETUEgbW9kZQoqIC0gSFJFR19FVl9SRE1BRAoqIC0gSFJFR19FVl9URE1BRAoqISEgaGNmX3NlcnZpY2VfbmljIGRvZXMgbm90IHNlcnZpY2UgdGhlIGZvbGxvd2luZyBIZXJtZXMgZXZlbnRzOgoqISEgCUhSRUdfRVZfVFggCQkJKHRoZSAiT0siIFR4IEV2ZW50KSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IHRoZSBXQ0ksIGlmIGl0IG9jY3VycyBpdCBpcyB1bmNsZWFyCiohISAJCQkJCQl3aGF0IHRoZSBjYXVzZSBpcywgc28gbm8gbWVhbmluZ2Z1bCBzdHJhdGVneSBpcyBhdmFpbGFibGUuIE5vdCBhY2tpbmcgdGhlIGJpdCBpcwoqISEgCQkJCQkJcHJvYmFibHkgdGhlIGJlc3QgaGVscCB0aGF0IGNhbiBiZSBnaXZlbiB0byB0aGUgZGVidWdnZXIuCiohISAJSFJFR19FVl9DTUQJCQloYW5kbGVkIGluIGNtZF93YWl0LgoqISEgCUhSRUdfRVZfRldfRE1BIAkJKGkuZS4gSFJFR19FVl9SWERNQSwgSFJFR19FVl9UWERNQSBhbmRfRVZfTFBFU0MpIGFyZSBlaXRoZXIgbm90IHVzZWQgb3IgdXNlZAoqISEgCQkJCQkJYmV0d2VlbiB0aGUgRi9XIGFuZCB0aGUgRE1BIGVuZ2luZS4KKiEhIAlIUkVHX0VWX0FDS19SRUdfUkVBRFkgaXMgb25seSBhcHBsaWNhYmxlIGZvciBILUlJIChpLmUuIG5vdCBISUkuNSBhbmQgdXAsIHNlZSBEQVdBKQoqCioJSWYsIGluIG5vbi1ETUEgbW9kZSwgYSBSeCBtZXNzYWdlIGlzIGF2YWlsYWJsZSwgaXRzIGxlbmd0aCBpcyByZWZsZWN0ZWQgYnkgdGhlIElGQl9SeExlbiBmaWVsZCBvZiB0aGUgSUZCLgoqCVRoaXMgbGVuZ3RoIHJlZmxlY3RzIHRoZSBkYXRhIGl0c2VsZiBhbmQgdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MsIFNvdXJjZSBBZGRyZXNzIGFuZCBEYXRhTGVuZ3RoL1R5cGUgZmllbGQKKglidXQgbm90IHRoZSBTTkFQLWhlYWRlciBpbiBjYXNlIG9mIGRlY2Fwc3VsYXRpb24gYnkgdGhlIEhDRi4gIElmIG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLCBJRkJfUnhMZW4gaXMKKgl6ZXJvLiAgRm9ybWVyIHZlcnNpb25zIG9mIHRoZSBIQ0YgaGFuZGxlZCBXTVAgbWVzc2FnZXMgYW5kIHN1cHBvcnRlZCBhICJtb25pdG9yIiBtb2RlIGluIGhjZl9zZXJ2aWNlX25pYywKKgl3aGljaCBkZXBvc2l0ZWQgY2VydGFpbiBvciBhbGwgUnggbWVzc2FnZXMgaW4gdGhlIE1haWxCb3guIFRoZSByZXNwb25zaWJpbGl0eSB0byBoYW5kbGUgdGhlc2UgZnJhbWVzIGlzCioJbW92ZWQgdG8gdGhlIE1TRi4gVGhlIEhDRiBvZmZlcnMgYXMgc3VwcG9ydHMgaGNmX3B1dF9pbmZvIHdpdGggQ0ZHX01CX0lORk8gYXMgcGFyYW1ldGVyIHRvIGVtdWxhdGUgdGhlIG9sZAoqIAlpbXBsZW1lbnRhdGlvbiB1bmRlciBjb250cm9sIG9mIHRoZSBNU0YuCioKKiAqKlJ4IEJ1ZmZlciBmcmVlIHN0cmF0ZWd5CioJV2hlbiBoY2Zfc2VydmljZV9uaWMgcmVwb3J0cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgbm9uLURNQSBtZXNzYWdlLCB0aGUgTVNGIGNhbiBhY2Nlc3MgdGhhdCBtZXNzYWdlIGJ5CioJbWVhbnMgb2YgaGNmX3Jjdl9tc2cuIEl0IG11c3QgYmUgcHJldmVudGVkIHRoYXQgdGhlIExBTiBDb250cm9sbGVyIHdyaXRlcyBuZXcgZGF0YSBpbiB0aGUgTklDIGJ1ZmZlcgoqCWJlZm9yZSB0aGUgTVNGIGlzIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnQgbWVzc2FnZS4gVGhlIE5JQyBidWZmZXIgaXMgcmV0dXJuZWQgdG8gdGhlIExBTiBDb250cm9sbGVyCioJd2hlbjoKKgkgLSB0aGUgY29tcGxldGUgZnJhbWUgZml0cyBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlciBvcgoqCSAtIGhjZl9yY3ZfbXNnIGlzIGNhbGxlZCBvcgoqCSAtIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX1JYIGlzIGNhbGxlZCBvcgoqCSAtIGhjZl9zZXJ2aWNlX25pYyBpcyBjYWxsZWQgYWdhaW4KKglJdCBjYW4gYmUgcmVhc29uZWQgdGhhdCBoY2ZfYWN0aW9uKCBJTlRfT04gKSBzaG91bGQgbm90IGJlIGdpdmVuIGJlZm9yZSB0aGUgTVNGIGhhcyBjb21wbGV0ZWx5IHByb2Nlc3NlZAoqCWEgcmVwb3J0ZWQgUngtZnJhbWUuIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgSU5UX09OIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGNhdXNlIGEgKFJ4LSlpbnRlcnJ1cHQgKHRoZQoqCU1TRiBpcyBwcm9jZXNzaW5nIGEgUngtZnJhbWUsIGhlbmNlIHRoZSBSeC1ldmVudCBiaXQgaW4gdGhlIEhlcm1lcyByZWdpc3RlciBtdXN0IGJlIGFjdGl2ZSkuIFRoaXMKKglpbnRlcnJ1cHQgd2lsbCBjYXVzZSBoY2Zfc2VydmljZV9uaWMgdG8gYmUgY2FsbGVkLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBhY2staW5nIG9mIHRoZSAibGFzdCIgUngtZXZlbnQKKgl0byB0aGUgSGVybWVzLCBjYXVzaW5nIHRoZSBIZXJtZXMgdG8gZGlzY2FyZCB0aGUgYXNzb2NpYXRlZCBOSUMgUkFNIGJ1ZmZlci4KKiBBc3NlcnQgZmFpbHMgaWYKKiAtIGlmYnAgaXMgemVybyBvciBvdGhlciByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gaGNmX3NlcnZpY2VfbmljIGlzIGNhbGxlZCB3aXRob3V0IGEgcHJpb3IgY2FsbCB0byBoY2ZfY29ubmVjdC4KKiAtIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCiogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCioJYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCioKKgoqLkRJQUdSQU0KKjE6CUlGQl9MaW5rU3RhdCBpcyBjbGVhcmVkLCBpZiBhIExpbmtTdGF0dXMgZnJhbWUgaXMgcmVjZWl2ZWQsIElGQl9MaW5rU3RhdCB3aWxsIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkKKglieSBpc3JfaW5mby4Kb3IKKjE6CUlGQl9MaW5rU3RhdCBjaGFuZ2UgaW5kaWNhdGlvbiBpcyBjbGVhcmVkLiBJZiBhIExpbmtTdGF0dXMgZnJhbWUgaXMgcmVjZWl2ZWQsIElGQl9MaW5rU3RhdCB3aWxsIGJlIHVwZGF0ZWQKKglhY2NvcmRpbmdseSBieSBpc3JfaW5mby4KKjI6IElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHRoZSBOSUMgcHJlc2VuY2UgY2hlY2sgb3RoZXJ3aXNlOgoqCSAtCXRoaXMgdmFsdWUgbWF5IHN0YXkgbm9uLXplcm8gaWYgdGhlIE5JQyBpcyBwdWxsZWQgb3V0IGF0IGFuIGluY29udmVuaWVudCBtb21lbnQuCioJIC0JdGhlIFJ4QWNrIG9uIGEgemVyby1GSUQgbmVlZHMgYSB6ZXJvLXZhbHVlIGZvciBJRkJfUnhMZW4gdG8gd29yawoqCSBOb3RlIHRoYXQgYXMgc2lkZS1lZmZlY3Qgb2YgdGhlIGhjZl9hY3Rpb24gY2FsbCwgdGhlIHJlbWFpbmRlciBvZiBSeCByZWxhdGVkIGluZm8gaXMgcmUtaW5pdGlhbGl6ZWQgYXMKKgkgd2VsbC4KKjQ6CUluIGNhc2Ugb2YgRGVmdW5jdCBtb2RlLCB0aGUgaW5mb3JtYXRpb24gc3VwcGxpZWQgYnkgSGVybWVzIGlzIHVucmVsaWFibGUsIHNvIHRoZSBib2R5IG9mCioJaGNmX3NlcnZpY2VfbmljIGlzIHNraXBwZWQuIFNpbmNlIGhjZl9jbnRsIHR1cm5zIGludG8gYSBOT1AgaWYgUHJpbWFyeSBvciBTdGF0aW9uIEYvVyBpcyBpbmNvbXBhdGlibGUsCioJaGNmX3NlcnZpY2VfbmljIGlzIGFsc28gc2tpcHBlZCBpbiB0aG9zZSBjYXNlcy4KKglUbyBwcmV2ZW50IHRoYXQgaGNmX3NlcnZpY2VfbmljIHJlcG9ydHMgYm9ndXMgaW5mb3JtYXRpb24gdG8gdGhlIE1TRiB3aXRoIGFsbCAtIHBvc3NpYmx5IGRpZmZpY3VsdCB0bwoqCWRlYnVnIC0gdW5kZXNpcmFibGUgc2lkZSBlZmZlY3RzLCBpdCBpcyBwYXJhbW91bnQgdG8gY2hlY2sgdGhlIE5JQyBwcmVzZW5jZS4gSW4gZm9ybWVyIGRheXMgdGhlIHByZXNlbmNlCioJdGVzdCB3YXMgYmFzZWQgb24gdGhlIEhlcm1lcyByZWdpc3RlciBIUkVHX1NXXzAuIFNpbmNlIGluIEhDRl9BQ1RfSU5UX09GRiBpcyBjaG9vc2VuIGZvciBzdHJhdGVneSBiYXNlZCBvbgoqCUhSRUdfRVZfU1RBVCwgdGhpcyBpcyBub3cgYWxzbyB1c2VkIGluIGhjZl9zZXJ2aWNlX25pYy4gVGhlIG1vdGl2YXRpb24gdG8gY2hhbmdlIHN0cmF0ZWd5IGlzIHBhcnRseQoqCWR1ZSB0byBpbmNvbnNpc3RlbnQgRi9XIGltcGxlbWVudGF0aW9ucyB3aXRoIHJlc3BlY3QgdG8gSFJFR19TV18wIG1hbmlwdWxhdGlvbiBhcm91bmQgcmVzZXQgYW5kIGRvd25sb2FkLgoqCU5vdGUgdGhhdCBpbiBwb2xsZWQgZW52aXJvbm1lbnRzIENhcmQgUmVtb3ZhbCBpcyBub3QgZGV0ZWN0ZWQgYnkgSU5UX09GRiB3aGljaCBtYWtlcyB0aGUgY2hlY2sgaW4KKgloY2Zfc2VydmljZV9uaWMgZXZlbiBtb3JlIGltcG9ydGFudC4KKjg6CVRoZSBldmVudCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGhlIEhlcm1lcyBpcyBzYW1wbGVkCioJVGhlIGFzc2VydCBjaGVja3MgZm9yIHVuZXhwZWN0ZWQgZXZlbnRzIDs/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/LgoqCSAtIEhSRUdfRVZfSU5GT19EUk9QIGlzIGV4cGxpY2l0bHkgZXhjbHVkZWQgZnJvbSB0aGUgYWNjZXB0YWJsZSBIUkVHX0VWX1NUQVQgYml0cyBiZWNhdXNlIGl0IGluZGljYXRlcwoqCSAgIGEgdG9vIGhlYXZpbHkgbG9hZGVkIHN5c3RlbS4KKgkgLSBIUkVHX0VWX0FDS19SRUdfUkVBRFkgaXMgMHgwMDAwIGZvciBILUkgKGFuZCBob3BlZnVsbHkgSC1JSS41KQoqCioKKglIUkVHX0VWX1RYX0VYQyBpcyBhY2NlcHRlZCAodmlhIEhSRUdfRVZfVFhfRVhUKSBpZiBhbmQgb25seSBpZiBIQ0ZfRVhUX0lOVF9UWF9FWCBzZXQgaW4gdGhlIEhDRl9FWFQKKglkZWZpbml0aW9uIGF0IGNvbXBpbGUgdGltZS4KKglUaGUgZm9sbG93aW5nIGFjdGl2aXRpZXMgYXJlIGhhbmRsZWQ6CioJIC0JQWxsb2MgZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IGhjZl9zZW5kX21zZyAoYW5kIG5vdGlmeSkuIE9ubHkgaWYgdGhlcmUgaXMgbm8gInNwYXJlIiByZXNvdXJjZSwgdGhlCioJCWFsbG9jIGV2ZW50IGlzIHN1cGVyZmljaWFsbHkgc2VydmljZWQgYnkgaGNmX3NlcnZpY2VfbmljIHRvIGNyZWF0ZSBhIHBzZXVkby1yZXNvdXJjZSB3aXRoIHZhbHVlCioJCTB4MDAxLiBUaGlzIHZhbHVlIGlzIHJlY29nbml6ZWQgYnkgZ2V0X2ZpZCAoY2FsbGVkIGJ5IGhjZl9zZW5kX21zZyBhbmQgbm90aWZ5KSB3aGVyZSB0aGUgcmVhbAoqCQlUeEZpZCBpcyByZXRyaWV2ZWQgYW5kIHRoZSBIZXJtZXMgaXMgYWNrZWQgYW5kIC0gaG9wZWZ1bGx5IC0gdGhlICJub3JtYWwiIGNhc2Ugd2l0aCBhIHNwYXJlIFR4RmlkCioJCWluIElGQl9Sc2NJbmQgaXMgcmVzdG9yZWQuCioJIC0JSW5mbyBkcm9wIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBpbmNyZW1lbnRpbmcgYSB0YWxseQoqCSAtCUxpbmtFdmVudCAoaW5jbHVkaW5nIHNvbGljaXRlZCBhbmQgdW5zb2xpY2l0ZWQgdGFsbGllcykgYXJlIGhhbmRsZWQgYnkgcHJvY2VkdXJlIGlzcl9pbmZvLgoqCS0JVHhFeCAoaWYgc2VsZWN0ZWQgYXQgY29tcGlsZSB0aW1lKSBpcyBoYW5kbGVkIGJ5IGNvcHlpbmcgdGhlIHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIFR4RlMKKgkJaW50byB0aGUgSUZCIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgdGhlIE1TRi4KKgkJTm90ZSB0aGUgY29tcGxpY2F0aW9uIG9mIHRoZSB6ZXJvLUZJRCBwcm90ZWN0aW9uIHN1Yi1zY2hlbWUgaW4gREFXQS4KKglOb3RlLCB0aGUgQWNrIG9mIGFsbCBvZiBhYm92ZSBldmVudHMgaXMgaGFuZGxlZCBhdCB0aGUgZW5kIG9mIGhjZl9zZXJ2aWNlX25pYwoqMTY6IEluIGNhc2Ugb2YgIG5vbi1ETUEgKCBlaXRoZXIgbm90IGNvbXBpbGVkIGluIG9yIGR1ZSB0byBhIHJ1bi10aW1lIGNob2ljZSk6CioJSWYgYW4gUngtZnJhbWUgaXMgYXZhaWxhYmxlLCBmaXJzdCB0aGUgRklEIG9mIHRoYXQgZnJhbWUgaXMgcmVhZCwgaW5jbHVkaW5nIHRoZSBjb21wbGljYXRpb24gb2YgdGhlCioJemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuIE5vdGUgdGhhdCBzdWNoIGEgemVyby1GSUQgaXMgYWNrbm93bGVkZ2VkIGF0IHRoZSBlbmQgb2YKKgloY2Zfc2VydmljZV9uaWMgYW5kIHRoYXQgdGhpcyBkZXBlbmRzIG9uIHRoZSBJRkJfUnhMZW4gaW5pdGlhbGl6YXRpb24gaW4gdGhlIGJlZ2luIG9mIGhjZl9zZXJ2aWNlX25pYy4KKglUaGUgQXNzZXJ0IHZhbGlkYXRlcyB0aGUgSENGIGFzc3VtcHRpb24gYWJvdXQgSGVybWVzIGltcGxlbWVudGF0aW9uIHVwb24gd2hpY2ggdGhlIHJhbmdlIG9mCioJUHNldWRvLVJJRHMgaXMgYmFzZWQuCioJVGhlbiB0aGUgY29udHJvbCBmaWVsZHMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSA4MDIuMyBmcmFtZSBhcmUgcmVhZCBmcm9tIHRoZSBOSUMgaW50byB0aGUgbG9va2FoZWFkIGJ1ZmZlci4KKglUaGUgc3RhdHVzIGZpZWxkIGlzIGNvbnZlcnRlZCB0byBuYXRpdmUgRW5kaWFuZXNzLgoqCVRoZSBsZW5ndGggaXMsIGFmdGVyIGltcGxpY2l0IEVuZGlhbmVzcyBjb252ZXJzaW9uIGlmIG5lZWRlZCwgYW5kIGFkanVzdG1lbnQgZm9yIHRoZSAxNCBieXRlcyBvZiB0aGUKKgk4MDIuMyBNQUMgaGVhZGVyLCBzdG9yZWQgaW4gSUZCX1J4TGVuLgoqCUluIE1BQyBNb25pdG9yIG1vZGUsIDgwMi4xMSBjb250cm9sIGZyYW1lcyB3aXRoIGEgVE9UQUwgbGVuZ3RoIG9mIDE0IGFyZSByZWNlaXZlZCwgc28gd2l0aG91dCB0aGlzCioJbGVuZ3RoIGFkanVzdG1lbnQsIElGQl9SeExlbiBjb3VsZCBub3QgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVzZSBmcmFtZXMgZnJvbSAibm8gZnJhbWUiLgoqCU5vIE1JQyBjYWxjdWxhdGlvbiBwcm9jZXNzZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVhZGluZyBvZiB0aGVzZSBDb250cm9sIGZpZWxkcy4KKjI2OiBUaGlzIGxlbmd0aCB0ZXN0IGZlZWxzIGxpa2Ugc3VwZXJmbHVvdXMgcm9idXN0bmVzcyBhZ2FpbnN0IG1hbGZvcm1lZCBmcmFtZXMsIGJ1dCBpdCB0dXJuZWQgb3V0IHRvIGJlCioJbmVlZGVkIGluIHRoZSByZWFsIChob3N0aWxlKSB3b3JsZC4KKglUaGUgZGVjYXBzdWxhdGlvbiBjaGVjayBuZWVkcyBzdWZmaWNpZW50IGRhdGEgdG8gcmVwcmVzZW50IERBLCBTQSwgTCwgU05BUCBhbmQgVHlwZSB3aGljaCBhbW91bnRzIHRvCioJMjIgYnl0ZXMuIEluIE1BQyBNb25pdG9yIG1vZGUsIDgwMi4xMSBjb250cm9sIGZyYW1lcyB3aXRoIGEgc21hbGxlciBsZW5ndGggYXJlIHJlY2VpdmVkLiBUbyBwcmV2ZW50CioJdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gZ29lcyBoYXl3aXJlLCBhIGNoZWNrIG9uIHRoZSBsZW5ndGggaXMgbmVlZGVkLgoqCVRoZSBhY3R1YWwgZGVjYXBzdWxhdGlvbiB0YWtlcyBwbGFjZSBvbiB0aGUgZmx5IGluIHRoZSBjb3B5aW5nIHByb2Nlc3MgYnkgb3ZlcndyaXRpbmcgdGhlIFNOQVAgaGVhZGVyLgoqCU5vdGUgdGhhdCBpbiBjYXNlIG9mIGRlY2Fwc3VsYXRpb24gdGhlIFNOQVAgaGVhZGVyIGlzIG5vdCBwYXNzZWQgdG8gdGhlIE1TRiwgaGVuY2UgSUZCX1J4TGVuIG11c3QgYmUKKgljb21wZW5zYXRlZCBmb3IgdGhlIFNOQVAgaGVhZGVyIGxlbmd0aC4KKglUaGUgMjIgYnl0ZXMgbmVlZGVkIGZvciBkZWNhcHN1bGF0aW9uIGFyZSAobW9yZSB0aGFuKSBzdWZmaWNpZW50IGZvciB0aGUgZXhjZXB0aW9uYWwgaGFuZGxpbmcgb2YgdGhlCioJTUlDIGFsZ29yaXRobSBvZiB0aGUgTC1maWVsZCAocmVwbGFjaW5nIHRoZSAyIGJ5dGUgTC1maWVsZCB3aXRoIDQgMHgwMCBieXRlcykuCiozMDogVGhlIDEyIGluIHRoZSBuby1TU04gYnJhbmNoIGNvcnJlc3BvbmRzIHdpdGggdGhlIGdldF9mcmFnLCB0aGUgMiB3aXRoIHRoZSBJUFcgb2YgdGhlIFNTTiBicmFuY2gKKjMyOiBJZiBIZXJtZXMgcmVwb3J0ZWQgTUlDLXByZXNlbmNlLCB0aGFuIHRoZSBNSUMgZW5naW5lIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIG5vbi1kdW1teSBNSUMgY2FsY3VsYXRpb24KKglyb3V0aW5lIGFkZHJlc3MgYW5kIGFwcHJvcHJpYXRlIGtleS4KKjM0OiBUaGUgOCBieXRlcyBhZnRlciB0aGUgREEsIFNBLCBMIGFyZSByZWFkIGFuZCBpdCBpcyBjaGVja2VkIHdoZXRoZXIgZGVjYXBzdWxhdGlvbiBpcyBuZWVkZWQgaS5lLjoKKgkgIC0gdGhlIEhlcm1lcyByZXBvcnRlZCBUdW5uZWwgZW5jYXBzdWxhdGlvbiBvcgoqCSAgLSB0aGUgSGVybWVzIHJlcG9ydGVkIDEwNDIgRW5jYXBzdWxhdGlvbiBhbmQgaGNmX2VuY2FwIHJlcG9ydHMgdGhhdCB0aGUgSENGIHdvdWxkIG5vdCBoYXZlIHVzZWQKKgkJMTA0MiBhcyB0aGUgZW5jYXBzdWxhdGlvbiBtZWNoYW5pc20KKglOb3RlIHRoYXQgdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSBSeEZTIGluIGJ1ZnAgaGFzIE5hdGl2ZSBFbmRpYW5lc3MgZHVlIHRvIHRoZSBjb252ZXJzaW9uIGRvbmUgYnkgdGhlCioJQkVfUEFSIGluIGdldF9mcmFnLgoqMzY6IFRoZSBUeXBlIGZpZWxkIGlzIHRoZSBvbmx5IHdvcmQga2VwdCAoYWZ0ZXIgbW92aW5nKSBvZiB0aGUganVzdCByZWFkIDggYnl0ZXMsIGl0IGlzIG1vdmVkIHRvIHRoZQoqCUwtZmllbGQuICBUaGUgb3JpZ2luYWwgTC1maWVsZCBhbmQgNiBieXRlIFNOQVAgaGVhZGVyIGFyZSBkaXNjYXJkZWQsIHNvIElGQl9SeExlbiBhbmQgYnVmX2FkZHIgbXVzdAoqCWJlIGFkanVzdGVkIGJ5IDguCio0MDogRGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRoZSBmcmFtZSAoc3RhcnRpbmcgd2l0aCBEQSkgZml0cyBpbiB0aGUgTG9va2FoZWFkIGJ1ZmZlciwgdGhlbiByZWFkIHRoZSBub3QteWV0CioJcmVhZCBkYXRhIGludG8gdGhlIGxvb2thaGVhZCBidWZmZXIuCioJSWYgdGhlIGxvb2thaGVhZCBidWZmZXIgY29udGFpbnMgdGhlIGNvbXBsZXRlIG1lc3NhZ2UsIGNoZWNrIHRoZSBNSUMuIFRoZSBtYWpvcml0eSBjb25zaWRlcmVkIHRoaXMKKglJL0YgbW9yZSBhcHByb3ByaWF0ZSB0aGVuIGhhdmUgdGhlIE1TRiBjYWxsIGhjZl9nZXRfZGF0YSBvbmx5IHRvIGNoZWNrIHRoZSBNSUMuCio0NDogU2luY2UgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgaXMgY29waWVkIGZyb20gTklDIFJBTSB0byBQQyBSQU0sIHRoZSBSeCBjYW4gYmUgYWNrbm93bGVkZ2VkIHRvIHRoZSBIZXJtZXMKKgl0byBvcHRpbWl6ZSB0aGUgZmxvdyAoIGEgYmV0dGVyIGNoYW5jZSB0byBnZXQgbmV3IFJ4IGRhdGEgaW4gdGhlIG5leHQgcGFzcyB0aHJvdWdoIGhjZl9zZXJ2aWNlX25pYyApLgoqCVRoaXMgYWNrbm93bGVkZ2VtZW50IGNhbiBub3QgYmUgZG9uZSB2aWEgaGNmX2FjdGlvbiggSENGX0FDVF9SWF9BQ0sgKSBiZWNhdXNlIHRoaXMgYWxzbyBjbGVhcnMKKglJRkJfUnhMRU4gdGh1cyBjb3JydXB0aW5nIHRoZSBJL0YgdG8gdGhlIE1TRi4KKjs/OiBJbiBjYXNlIG9mIERNQSAoY29tcGlsZWQgaW4gYW5kIGFjdGl2YXRlZCk6CgoKKjU0OiBMaW1pdGluZyB0aGUgbnVtYmVyIG9mIHBsYWNlcyB3aGVyZSB0aGUgRi9XIGlzIGFja2VkIChlLmcuIHRoZSBtZXJnaW5nIG9mIHRoZSBSeC1BQ0sgd2l0aCB0aGUgb3RoZXIKKglBQ0tzKSwgaXMgc3VwcG9zZWQgdG8gZGltaW5pc2ggdGhlIHBvdGVudGlhbCBvZiByYWNlIGNvbmRpdGlvbnMgaW4gdGhlIEYvVy4KKglOb3RlIDE6IFRoZSBDTUQgZXZlbnQgaXMgYWNrbm93bGVkZ2VkIGluIGNtZF9jbXBsCioJTm90ZSAyOiBIUkVHX0VWX0FDS19SRUdfUkVBRFkgaXMgMHgwMDAwIGZvciBILUkgKGFuZCBob3BlZnVsbHkgSC1JSS41KQoqCU5vdGUgMzogVGhlIEFMTE9DIGV2ZW50IGlzIGFja25vd2xlZGdlZCBpbiBnZXRfZmlkIChleGNlcHQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmbG93KQoqCiouTk9USUNFCiogVGhlIE5vbi1ETUEgSFJFR19FVl9SWCBpcyBoYW5kbGVkIGRpZmZlcmVudCBjb21wYXJlZCB3aXRoIHRoZSBvdGhlciBGL1cgZXZlbnRzLgoqIFRoZSBIUkVHX0VWX1JYIGV2ZW50IGlzIGFja25vd2xlZGdlZCBieSB0aGUgZmlyc3QgaGNmX3NlcnZpY2VfbmljIGNhbGwgYWZ0ZXIgdGhlCiogaGNmX3NlcnZpY2VfbmljIGNhbGwgdGhhdCByZXBvcnRlZCB0aGUgb2NjdXJyZW5jZSBvZiB0aGlzIGV2ZW50LgoqIFRoaXMgYWNrbm93bGVkZ21lbnQKKiBtYWtlcyB0aGUgbmV4dCBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSAoaWYgYW55KSBhdmFpbGFibGUuCiogQW4gdXBkYXRlZCBJRkJfUnhMZW4KKiBmaWVsZCByZWZsZWN0cyB0aGlzIGF2YWlsYWJpbGl0eS4KKgoqLk5PVElDRQoqIFRoZSBtaW5pbXVtIHNpemUgZm9yIExlbiBtdXN0IHN1cHBseSBzcGFjZSBmb3I6CiogLQlhbiBGL1cgZGVwZW5kZW50IG51bWJlciBvZiBieXRlcyBvZiBDb250cm9sIEluZm8gZmllbGQgaW5jbHVkaW5nIHRoZSA4MDIuMTEgSGVhZGVyIGZpZWxkCiogLQlEZXN0aW5hdGlvbiBBZGRyZXNzCiogLQlTb3VyY2UgQWRkcmVzcwoqIC0JTGVuZ3RoIGZpZWxkCiogLQlbIFNOQVAgSGVhZGVyXQoqIC0JWyBFdGhlcm5ldC1JSSBUeXBlXQoqIFRoaXMgcmVzdWx0cyBpbiA2OCBmb3IgSGVybWVzLUkgYW5kIDgwIGZvciBIZXJtZXMtSUkKKiBUaGlzIHdheSB0aGUgbWluaW11bSBhbW91bnQgb2YgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIG5lZWRlZCBieSB0aGUgSENGIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBmcmFtZQoqIG11c3QgYmUgZGVjYXBzdWxhdGVkLgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CmhjZl9zZXJ2aWNlX25pYyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCB1bnNpZ25lZCBpbnQgbGVuICkKewoKaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKaGNmXzE2CQlzdGF0Owp3Y2lfYnVmcAlidWZfYWRkcjsKaGNmXzE2IAkJaTsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1NFUlZJQ0VfTklDLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkKCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKCUhDRkFTU0VSVF9JTlQKCglpZmJwLT5JRkJfTGlua1N0YXQgPSAwOyAvLyA7PyB0byBiZSBvYnNvbGV0ZWQgQVNBUAkJCQkJCQkJCQkJCS8qIDEqLwoJaWZicC0+SUZCX0RTTGlua1N0YXQgJj0gfkNGR19MSU5LX1NUQVRfQ0hBTkdFOwkJCQkJCQkJCQkJCQkvKiAxKi8KCSh2b2lkKWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfUlhfQUNLICk7CQkJCQkJCQkJCQkJCQkvKiAyKi8KCWlmICggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgJiYgKCBzdGF0ID0gSVBXKCBIUkVHX0VWX1NUQVQgKSApICE9IDB4RkZGRiApIHsJCQkJCS8qIDQqLwovKgkJSUZfTk9UX0RNQSggSENGQVNTRVJUKCAhKCBzdGF0ICYgfkhSRUdfRVZfQkFTSUNfTUFTSywgc3RhdCApICkKICoJCUlGX05PVF9VU0VfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+SFJFR19FVl9CQVNJQ19NQVNLLCBzdGF0ICkgKQogKgkJSUZfVVNFX0RNQSggSENGQVNTRVJUKCAhKCBzdGF0ICYgfiggSFJFR19FVl9CQVNJQ19NQVNLIF4gKCBIUkVHX0VWXy4uLkRNQS4uLi4gKSwgc3RhdCApICkKICovCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA4Ki8KCQlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMCAmJiBzdGF0ICYgSFJFR19FVl9BTExPQyApIHsgLy9Ob3RlOiBJRkJfUnNjSW5kIGlzIEFMV0FZUyAxIGZvciBETUEKCQkJaWZicC0+SUZCX1JzY0luZCA9IDE7CgkJfQoJCUlGX1RBTExZKCBpZiAoIHN0YXQgJiBIUkVHX0VWX0lORk9fRFJPUCApIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5Ob0J1ZkluZm8rKzsgKQojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTlRfVElDSwoJCWlmICggc3RhdCAmIEhSRUdfRVZfVElDSyApIHsKCQkJaWZicC0+SUZCX1RpY2tDbnQrKzsKCQl9CiNpZiAwIC8vIChIQ0ZfU0xFRVApICYgSENGX0REUwoJCWlmICggaWZicC0+SUZCX1RpY2tDbnQgPT0gMyAmJiAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9DT05ORUNURUQgKSA9PSAwICkgewpDRkdfRERTX1RJQ0tfVElNRV9TVFJDVCBsdHY7CgkJCS8vIDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkgaW4gbm90LWNvbm5lY3RlZCBtb2RlIC0tPmdvIGludG8gRFNfT09SCgkJCWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfU0xFRVAgKTsKCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgfD0gQ0ZHX0xJTktfU1RBVF9EU19PT1I7IC8vc2V0IE91dE9mUmFuZ2UKCQkJbHR2LmxlbiA9IDI7CgkJCWx0di50eXAgPSBDRkdfRERTX1RJQ0tfVElNRTsKCQkJbHR2LnRpY2tfdGltZSA9ICggKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfVElNRVIgKSArIDB4MTAgKSAqNjQ7IC8vNzggaXMgbW9yZSByaWdodAoJCQloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZsdHYgKTsKCQkJcHJpbnRrKCAiPDU+UHJlcGFyaW5nIGZvciBzbGVlcCwgbGlua19zdGF0dXM6ICUwNFgsIHRpbWVyIDogJWRcbiIsCgkJCQkJaWZicC0+SUZCX0RTTGlua1N0YXQsIGx0di50aWNrX3RpbWUgKTsvLzs/cmVtb3ZlIG1lIDEgZGF5CgkJCWlmYnAtPklGQl9UaWNrQ250Kys7IC8vOz9qdXN0IHRvIG1ha2Ugc3VyZSB3ZSBkbyBub3Qga2VlcCBvbiBwcmludGluZyBhYm92ZSBtZXNzYWdlCgkJCWlmICggbHR2LnRpY2tfdGltZSA8IDMwMCAqIDEyNSApIGlmYnAtPklGQl9EU0xpbmtTdGF0ICs9IDB4MDAxMDsKCgkJfQojZW5kaWYgLy8gSENGX0REUwojZW5kaWYgLy8gSENGX0VYVF9JTlRfVElDSwoJCWlmICggc3RhdCAmIEhSRUdfRVZfSU5GTyApIHsKCQkJaXNyX2luZm8oIGlmYnAgKTsKCQl9CiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lOVF9UWF9FWAoJCWlmICggc3RhdCAmIEhSRUdfRVZfVFhfRVhUICYmICggaSA9IElQVyggSFJFR19UWF9DT01QTF9GSUQgKSApICE9IDAgLypEQVdBKi8gKSB7CgkJCURBV0FfWkVST19GSUQoIEhSRUdfVFhfQ09NUExfRklEICkKCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBpLCAwLCBJT19JTiApOwoJCQlnZXRfZnJhZyggaWZicCwgJmlmYnAtPklGQl9UeEZzU3RhdCwgSEZTX1NXU1VQIEJFX1BBUigxKSApOwoJCX0KI2VuZGlmIC8vIEhDRl9FWFRfSU5UX1RYX0VYCi8vIXJsYXYgRE1BIGVuZ2luZSB3aWxsIGhhbmRsZSB0aGUgcnggZXZlbnQsIG5vdCB0aGUgZHJpdmVyCiNpZiBIQ0ZfRE1BCgkJaWYgKCAhKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSApIC8vISEgYmUgYXdhcmUgb2YgdGhlIGxvZ2ljYWwgaW5kZW50YXRpb25zCiNlbmRpZiAvLyBIQ0ZfRE1BCi8qMTYqLwkgIGlmICggc3RhdCAmIEhSRUdfRVZfUlggJiYgKCBpZmJwLT5JRkJfUnhGSUQgPSBJUFcoIEhSRUdfUlhfRklEICkgKSAhPSAwICkgeyAvL2lmIDAgdGhlbiBEQVdBX0FDSwoJCQlIQ0ZBU1NFUlQoIGJ1ZnAsIGxlbiApCgkJCUhDRkFTU0VSVCggbGVuID49IEhGU19EQVQgKyAyLCBsZW4gKQoJCQlEQVdBX1pFUk9fRklEKCBIUkVHX1JYX0ZJRCApCgkJCUhDRkFTU0VSVCggaWZicC0+SUZCX1J4RklEIDwgQ0ZHX1BST0RfREFUQSwgaWZicC0+SUZCX1J4RklEKQoJCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGlmYnAtPklGQl9SeEZJRCwgMCwgSU9fSU4gKTsKCQkJZ2V0X2ZyYWcoIGlmYnAsIGJ1ZnAsIEhGU19BRERSX0RFU1QgQkVfUEFSKDEpICk7CgkJCWlmYnAtPklGQl9sYXAgPSBidWZfYWRkciA9IGJ1ZnAgKyBIRlNfQUREUl9ERVNUOwoJCQlpZmJwLT5JRkJfUnhMZW4gPSAoaGNmXzE2KShidWZwW0hGU19EQVRfTEVOXSArIChidWZwW0hGU19EQVRfTEVOKzFdPDw4KSArIDIqNiArIDIpOwovKjI2Ki8JCWlmICggaWZicC0+SUZCX1J4TGVuID49IDIyICkgewkJLy8gY29udmVuaWVudCBmb3IgTUlDIGNhbGN1bGF0aW9uICg1IERXcyArIDEgInNraXBwZWQiIFcpCgkJCQkJCQkJCQkJCS8vLiAgZ2V0IERBLFNBLExlbi9UeXBlIGFuZCAoU05BUCxUeXBlIG9yIDggZGF0YSBieXRlcykKLyozMCovCQkJZ2V0X2ZyYWcoIGlmYnAsIGJ1Zl9hZGRyLCAyMiBCRV9QQVIoMCkgKTsKLyozMiovCQkJQ0FMQ19SWF9NSUMoIGJ1ZnAsIC0xICk7CQkvLy4gIGluaXRpYWxpemUgTUlDCgkJCQlDQUxDX1JYX01JQyggYnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgKTsJLy8uICBNSUMgb3ZlciBEQSwgU0EKCQkJCUNBTENfUlhfTUlDKCBudWxsX2FkZHIsIDQgKTsJLy8uICBNSUMgb3ZlciAodmlydHVhbCkgcHJpb3JpdHkgZmllbGQKCQkJCUNBTENfUlhfTUlDKCBidWZfYWRkcisxNCwgOCApOwkvLy4gIHNraXAgTGVuLCBNSUMgb3ZlciBTTkFQLFR5cGUgb3IgOCBkYXRhIGJ5dGVzKQoJCQkJYnVmX2FkZHIgKz0gMjI7CiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCi8vISFiZSBjYXJlZnVsIGRvIG5vdCB1c2UgcG9zaXRpdmUgdGVzdCBvbiBIQ0ZfQUNUX0NDWF9PRkYsIGJlY2F1c2UgSUZCX0NLSVBTdGF0IGlzIGluaXRpYWxseSAwCgkJCQlpZiggaWZicC0+SUZCX0NLSVBTdGF0ICE9IEhDRl9BQ1RfQ0NYX09OICApCiNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKCQkJCXsKI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKCQkJCQlIQ0ZBU1NFUlQoIGxlbiA+PSBIRlNfREFUICsgMiArIHNpemVvZihzbmFwX2hlYWRlciksIGxlbiApCi8qMzQqLyAJCQkJaSA9ICood2NpX3JlY29yZHApJmJ1ZnBbSEZTX1NUQVRdICYgKCBIRlNfU1RBVF9NU0dfVFlQRSB8IEhGU19TVEFUX0VSUiApOwoJCQkJCWlmICggaSA9PSBIRlNfU1RBVF9UVU5ORUwgfHwKCQkJCQkJICggaSA9PSBIRlNfU1RBVF8xMDQyICYmIGhjZl9lbmNhcCggKHdjaV9idWZwKSZidWZwW0hGU19UWVBFXSApICE9IEVOQ19UVU5ORUwgKSApIHsKCQkJCQkJCQkJCQkJLy8uICBjb3B5IEUtSUkgVHlwZSB0byA4MDIuMyBMRU4gZmllbGQKLyozNiovCQkJCQlidWZwW0hGU19MRU4gIF0gPSBidWZwW0hGU19UWVBFICBdOwoJCQkJCQlidWZwW0hGU19MRU4rMV0gPSBidWZwW0hGU19UWVBFKzFdOwoJCQkJCQkJCQkJCQkvLy4gIGRpc2NhcmQgU25hcCBieSBvdmVyd3JpdGluZyB3aXRoIGRhdGEKCQkJCQkJaWZicC0+SUZCX1J4TGVuIC09IChIRlNfVFlQRSAtIEhGU19MRU4pOwoJCQkJCQlidWZfYWRkciAtPSAoIEhGU19UWVBFIC0gSEZTX0xFTiApOyAvLyB0aGlzIGhhcHBlbnMgdG8gYnJpbmcgdXMgYXQgYSBEVyBib3VuZGFyeSBvZiAzNgoJCQkJCX0KI2VuZGlmIC8vIEhDRl9FTkMKCQkJCX0KCQkJfQovKjQwKi8JCWlmYnAtPklGQl9sYWwgPSBtaW4oIChoY2ZfMTYpKGxlbiAtIEhGU19BRERSX0RFU1QpLCBpZmJwLT5JRkJfUnhMZW4gKTsKCQkJaSA9IGlmYnAtPklGQl9sYWwgLSAoIGJ1Zl9hZGRyIC0gKCBidWZwICsgSEZTX0FERFJfREVTVCApICk7CgkJCWdldF9mcmFnKCBpZmJwLCBidWZfYWRkciwgaSBCRV9QQVIoMCkgKTsKCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyLCBpICk7CiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCgkJCWlmICggaWZicC0+SUZCX2xhbCA9PSBpZmJwLT5JRkJfUnhMZW4gKSB7CgkJCQlyYyA9IGNoZWNrX21pYyggaWZicCApOwoJCQl9CiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKLyo0NCovCQlpZiAoIGxlbiAtIEhGU19BRERSX0RFU1QgPj0gaWZicC0+SUZCX1J4TGVuICkgewoJCQkJaWZicC0+SUZCX1J4RklEID0gMDsKCQkJfSBlbHNlIHsgLyogSUZCX1J4RklEIGlzIGNsZWFyZWQsIHNvICB5b3UgZG8gbm90IGdldCBhbm90aGVyIFJ4X0FjayBhdCBuZXh0IGVudHJ5IG9mIGhjZl9zZXJ2aWNlX25pYyAqLwoJCQkJc3RhdCAmPSAoaGNmXzE2KX5IUkVHX0VWX1JYOwkvL2Rvbid0IGFjayBSeCBpZiBwcm9jZXNzaW5nIG5vdCB5ZXQgY29tcGxldGVkCgkJCX0KCQl9CgkJLy8gaW4gY2FzZSBvZiBETUE6IHNpZ25hbCBhdmFpbGFiaWxpdHkgb2YgcnggYW5kL29yIHR4IHBhY2tldHMgdG8gTVNGCgkJSUZfVVNFX0RNQSggaWZicC0+SUZCX0RtYVBhY2tldHMgfD0gc3RhdCAmICggSFJFR19FVl9SRE1BRCB8IEhSRUdfRVZfVERNQUQgKTsgKQoJCS8vIHJsYXYgOiBwZW5kaW5nIEhSRUdfRVZfUkRNQUQgb3IgSFJFR19FVl9URE1BRCBldmVudHMgZ2V0IGFja25vd2xlZGdlZCBoZXJlLgovKjU0Ki8Jc3RhdCAmPSAoaGNmXzE2KX4oIEhSRUdfRVZfU0xFRVBfUkVRIHwgSFJFR19FVl9DTUQgfCBIUkVHX0VWX0FDS19SRUdfUkVBRFkgfCBIUkVHX0VWX0FMTE9DIHwgSFJFR19FVl9GV19ETUEgKTsKLy9hIHBvc2l0aXZlIG1hc2sgd291bGQgYmUgZWFzaWVyIHRvIHVuZGVyc3RhbmQgLyo1NCovCXN0YXQgJj0gKGhjZl8xNil+KCBIUkVHX0VWX1NMRUVQX1JFUSB8IEhSRUdfRVZfQ01EIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZIHwgSFJFR19FVl9BTExPQyB8IEhSRUdfRVZfRldfRE1BICk7CgkJSUZfVVNFX0RNQSggc3RhdCAmPSAoaGNmXzE2KX5IUkVHX0VWX1JYOyApCgkJaWYgKCBzdGF0ICkgewoJCQlEQVdBX0FDSyggc3RhdCApOwkvKkRBV0EqLwoJCX0KCX0KCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9TRVJWSUNFX05JQyApCglyZXR1cm4gcmM7Cn0gLy8gaGNmX3NlcnZpY2VfbmljCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioqKioqKioqKioqKioqKioqKioqKioqKiogSCBDIEYgICBTIFUgUCBQIE8gUiBUICAgUiBPIFUgVCBJIE4gRSBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQl2b2lkIGNhbGNfbWljKCBoY2ZfMzIqIHAsIGhjZl8zMiBtICkKKi5QVVJQT1NFCQljYWxjdWxhdGUgTUlDIG9uIGEgcXVhZCBieXRlLgoqCiouQVJHVU1FTlRTCioJcAkJCWFkZHJlc3Mgb2YgdGhlIE1JQwoqCW0JCQkzMiBiaXQgdmFsdWUgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBNSUMgY2FsY3VsYXRpb24gZW5naW5lCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqIGNhbGNfbWljIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUlDIGFsZ29yaXRobS4gSXQgaXMgYSBtb25rZXktc2VlIG1vbmtleS1kbyBjb3B5IG9mCiogTWljaGFlbDo6YXBwZW5kQnl0ZSgpCiogb2YgQXBwZW5kaXggQyBvZiAuLi4uLi4uLi4uCioKKgoqLkRJQUdSQU0KKgoqLk5PVElDRQoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCgojZGVmaW5lIFJPTDMyKCBBLCBuICkgKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCgojZGVmaW5lIEwJKnAKI2RlZmluZSBSCSoocCsxKQoKdm9pZApjYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgbSApCnsKI2lmIEhDRl9CSUdfRU5ESUFOCgltID0gKG0gPj4gMTYpIHwgKG0gPDwgMTYpOwojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KCUwgXj0gbTsKCVIgXj0gUk9MMzIoIEwsIDE3ICk7CglMICs9IFI7CglSIF49ICgoTCAmIDB4ZmYwMGZmMDApID4+IDgpIHwgKChMICYgMHgwMGZmMDBmZikgPDwgOCk7CglMICs9IFI7CglSIF49IFJPTDMyKCBMLCAzICk7CglMICs9IFI7CglSIF49IFJPUjMyKCBMLCAyICk7CglMICs9IFI7Cn0gLy8gY2FsY19taWMKI3VuZGVmIFIKI3VuZGVmIEwKI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoKCgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKKi5QVVJQT1NFCQljYWxjdWxhdGUgTUlDIG9uIGEgc2luZ2xlIGZyYWdtZW50LgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJYnVmcAkJKGJ5dGUpIGFkZHJlc3Mgb2YgYnVmZmVyCioJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKiBjYWxjX21pY19yeF9mcmFnIC4uLi4uLi4uCioKKiBUaGUgTUlDIGlzIGxvY2F0ZWQgaW4gdGhlIElGQi4KKiBUaGUgTUlDIGlzIHNlcGFyYXRlIGZvciBUeCBhbmQgUngsIHRodXMgYWxsb3dpbmcgaGNmX3NlbmRfbXNnIHRvIG9jY3VyIGJldHdlZW4gaGNmX3NlcnZpY2VfbmljIGFuZAoqIGhjZl9yY3ZfbXNnLgoqCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKewpzdGF0aWMgdW5pb24geyBoY2ZfMzIgeDMyOyBoY2ZfMTYgeDE2WzJdOyBoY2ZfOCB4OFs0XTsgfSB4OwkvLyogYXJlYSB0byBhY2N1bXVsYXRlIDQgYnl0ZXMgaW5wdXQgZm9yIE1JQyBlbmdpbmUKaW50IGk7CgoJaWYgKCBsZW4gPT0gLTEgKSB7CQkJCQkJCQkvL2luaXRpYWxpemUgTUlDIGhvdXNla2VlcGluZwoJCWkgPSAqKHdjaV9yZWNvcmRwKSZwW0hGU19TVEFUXTsKCQkvKiBpID0gQ05WX1NIT1JUUF9UT19MSVRUTEUoJnBbSEZTX1NUQVRdKTsgc2hvdWxkIG5vdCBiZSBuZWVkZSB0byBwcmV2ZW50IGFsaWdubWVudCBwb3JvYmxlbXMKCQkgKiBzaW5jZSBsZW4gPT0gLTEgaWYgYW5kIG9ubHkgaWYgcCBpcyBsb29rYWhhZWFkIGJ1ZmZlciB3aGljaCBNVVNUIGJlIHdvcmQgYWxpZ25lZAoJCSAqIHRvIGJlIHJlLWludmVzdGlnYXRlZCBieSBOdlIKCQkgKi8KCgkJaWYgKCAoIGkgJiBIRlNfU1RBVF9NSUMgKSA9PSAwICkgewoJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IDB4RkZGRjsJCQkvL3N1cHByZXNzIE1JQyBjYWxjdWxhdGlvbgoJCX0gZWxzZSB7CgkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gMDsKLy8qCU5vdGUgdGhhdCAiY29pbmNpZGVudGFsbHkiIHRoZSBiaXQgcG9zaXRpb25zIHVzZWQgaW4gSEZTX1NUQVQKLy8qCWNvcnJlc3BvbmQgd2l0aCB0aGUgb2Zmc2V0IG9mIHRoZSBrZXkgaW4gSUZCX01JQ0tleQoJCQlpID0gKCBpICYgSEZTX1NUQVRfTUlDX0tFWV9JRCApID4+IDEwOwkvKiBjb2luY2lkZW50YWxseSBubyBzaGlmdCBuZWVkZWQgZm9yIGkgaXRzZWxmICovCgkJCWlmYnAtPklGQl9NSUNSeFswXSA9IENOVl9MT05HX1RPX0xJVFRMRShpZmJwLT5JRkJfTUlDUnhLZXlbaSAgXSk7CgkJCWlmYnAtPklGQl9NSUNSeFsxXSA9IENOVl9MT05HX1RPX0xJVFRMRShpZmJwLT5JRkJfTUlDUnhLZXlbaSsxXSk7CgkJfQoJfSBlbHNlIHsKCQlpZiAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ID09IDAgKSB7CgkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKCQkJcCArPSA0OwoJCQlpZiAoIGxlbiA8IDQgKSB7CgkJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IChoY2ZfMTYpbGVuOwoJCQl9IGVsc2UgewoJCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSA0OwoJCQkJbGVuIC09IDQ7CgkJCX0KCQl9IGVsc2Ugd2hpbGUgKCBpZmJwLT5JRkJfTUlDUnhDYXJyeSA8IDQgJiYgbGVuICkgewkJLy9ub3RlIGZvciBoY2ZfMTYgYXBwbGllczogMHhGRkZGID4gNAoJCQl4Lng4W2lmYnAtPklGQl9NSUNSeENhcnJ5KytdID0gKnArKzsKCQkJbGVuLS07CgkJfQoJCXdoaWxlICggaWZicC0+SUZCX01JQ1J4Q2FycnkgPT0gNCApIHsJLy9jb250cml2ZWQgc28gd2UgaGF2ZSBvbmx5IDEgY2FsbCB0byBjYWxjX21pYyBzbyB3ZSBjb3VsZCBicmluZyBpdCBpbi1saW5lCgkJCWNhbGNfbWljKCBpZmJwLT5JRkJfTUlDUngsIHgueDMyICk7CgkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKCQkJcCArPSA0OwoJCQlpZiAoIGxlbiA8IDQgKSB7CgkJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IChoY2ZfMTYpbGVuOwoJCQl9CgkJCWxlbiAtPSA0OwoJCX0KCX0KfSAvLyBjYWxjX21pY19yeF9mcmFnCiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWNfdHhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKKi5QVVJQT1NFCQljYWxjdWxhdGUgTUlDIG9uIGEgc2luZ2xlIGZyYWdtZW50LgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJYnVmcAkJKGJ5dGUpIGFkZHJlc3Mgb2YgYnVmZmVyCioJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKiBjYWxjX21pY190eF9mcmFnIC4uLi4uLi4uCioKKiBUaGUgTUlDIGlzIGxvY2F0ZWQgaW4gdGhlIElGQi4KKiBUaGUgTUlDIGlzIHNlcGFyYXRlIGZvciBUeCBhbmQgUngsIHRodXMgYWxsb3dpbmcgaGNmX3NlbmRfbXNnIHRvIG9jY3VyIGJldHdlZW4gaGNmX3NlcnZpY2VfbmljIGFuZAoqIGhjZl9yY3ZfbXNnLgoqCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKY2FsY19taWNfdHhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKewpzdGF0aWMgdW5pb24geyBoY2ZfMzIgeDMyOyBoY2ZfMTYgeDE2WzJdOyBoY2ZfOCB4OFs0XTsgfSB4OwkvLyogYXJlYSB0byBhY2N1bXVsYXRlIDQgYnl0ZXMgaW5wdXQgZm9yIE1JQyBlbmdpbmUKCgkJCQkJCQkJCQkJCQkJLy9pZiBpbml0aWFsaXphdGlvbiByZXF1ZXN0CglpZiAoIGxlbiA9PSAtMSApIHsKCQkJCQkJCQkJCQkJCQkvLy4gIHByZXN1bWUgTUlDIGNhbGN1bGF0aW9uIGRpc2FibGVkCgkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSAweEZGRkY7CgkJCQkJCQkJCQkJCQkJLy8uICBpZiBNSUMgY2FsY3VsYXRpb24gZW5hYmxlZAoJCWlmICggaWZicC0+SUZCX01JQ1R4Q250bCApIHsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGNsZWFyIE1JQyBjYXJyeQoJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IDA7CgkJCQkJCQkJCQkJCQkJLy8uICAuICBpbml0aWFsaXplIE1JQy1lbmdpbmUKCQkJaWZicC0+SUZCX01JQ1R4WzBdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNUeEtleVswXSk7CS8qVHggYWx3YXlzIHVzZXMgS2V5IDAgKi8KCQkJaWZicC0+SUZCX01JQ1R4WzFdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNUeEtleVsxXSk7CgkJfQoJCQkJCQkJCQkJCQkJCS8vZWxzZQoJfSBlbHNlIHsKCQkJCQkJCQkJCQkJCQkvLy4gIGlmIE1JQyBlbmFibGVkIChUeCkgLyBpZiBNSUMgcHJlc2VudCAoUngpCgkJCQkJCQkJCQkJCQkJLy8uICBhbmQgbm8gY2FycnkgZnJvbSBwcmV2aW91cyBjYWxjX21pY19mcmFnCgkJaWYgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSA9PSAwICkgewoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgcHJlc2V0IGFjY3Ugd2l0aCA0IGJ5dGVzIGZyb20gYnVmZmVyCgkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCBwb2ludGVyIGFjY29yZGluZ2x5CgkJCXAgKz0gNDsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGlmIGJ1ZmZlciBjb250YWluZWQgbGVzcyB0aGVuIDQgYnl0ZXMKCQkJaWYgKCBsZW4gPCA0ICkgewoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgcHJvbW90ZSB2YWxpZCBieXRlcyBpbiBhY2N1IHRvIGNhcnJ5CgkJCQkJCQkJCQkJCQkJLy8uICAuICAuICBmbGFnIGFjY3UgdG8gY29udGFpbiBpbmNvbXBsZXRlIGRvdWJsZSB3b3JkCgkJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IChoY2ZfMTYpbGVuOwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgZWxzZQoJCQl9IGVsc2UgewoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgZmxhZyBhY2N1IHRvIGNvbnRhaW4gY29tcGxldGUgZG91YmxlIHdvcmQKCQkJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gNDsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCByZW1haW5pbmcgYnVmZmVyIGxlbmd0aAoJCQkJbGVuIC09IDQ7CgkJCX0KCQkJCQkJCQkJCQkJCQkvLy4gIGVsc2UgaWYgTUlDIGVuYWJsZWQKCQkJCQkJCQkJCQkJCQkvLy4gIGFuZCBpZiBjYXJyeSBieXRlcyBmcm9tIHByZXZpb3VzIGNhbGNfbWljX3R4X2ZyYWcKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIG1vdmUgKDEtMykgYnl0ZXMgZnJvbSBjYXJyeSBpbnRvIGFjY3UKCQl9IGVsc2Ugd2hpbGUgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSA8IDQgJiYgbGVuICkgewkJLyogbm90ZSBmb3IgaGNmXzE2IGFwcGxpZXM6IDB4RkZGRiA+IDQgKi8KCQkJeC54OFtpZmJwLT5JRkJfTUlDVHhDYXJyeSsrXSA9ICpwKys7CgkJCWxlbi0tOwoJCX0KCQkJCQkJCQkJCQkJCQkvLy4gIHdoaWxlIGFjY3UgY29udGFpbnMgY29tcGxldGUgZG91YmxlIHdvcmQKCQkJCQkJCQkJCQkJCQkvLy4gIGFuZCBNSUMgZW5hYmxlZAoJCXdoaWxlICggaWZicC0+SUZCX01JQ1R4Q2FycnkgPT0gNCApIHsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIHBhc3MgYWNjdSB0byBNSUMgZW5naW5lCgkJCWNhbGNfbWljKCBpZmJwLT5JRkJfTUlDVHgsIHgueDMyICk7CgkJCQkJCQkJCQkJCQkJLy8uICAuICBjb3B5IG5leHQgNCBieXRlcyBmcm9tIGJ1ZmZlciB0byBhY2N1CgkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCBidWZmZXIgcG9pbnRlcgoJCQlwICs9IDQ7CgkJCQkJCQkJCQkJCQkJLy8uICAuICBpZiBidWZmZXIgY29udGFpbmVkIGxlc3MgdGhlbiA0IGJ5dGVzCgkJCQkJCQkJCQkJCQkJLy8uICAuICAuICBwcm9tb3RlIHZhbGlkIGJ5dGVzIGluIGFjY3UgdG8gY2FycnkKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGZsYWcgYWNjdSB0byBjb250YWluIGluY29tcGxldGUgZG91YmxlIHdvcmQKCQkJaWYgKCBsZW4gPCA0ICkgewoJCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSAoaGNmXzE2KWxlbjsKCQkJfQoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IHJlbWFpbmluZyBidWZmZXIgbGVuZ3RoCgkJCWxlbiAtPSA0OwoJCX0KCX0KfSAvLyBjYWxjX21pY190eF9mcmFnCiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCgojaWYgSENGX1BST1RfVElNRQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgY2FsaWJyYXRlKCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCWNhbGlicmF0ZXMgdGhlIFMvVyBwcm90ZWN0aW9uIGNvdW50ZXIgYWdhaW5zdCB0aGUgSGVybWVzIFRpbWVyIHRpY2suCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogY2FsaWJyYXRlcyB0aGUgUy9XIHByb3RlY3Rpb24gY291bnRlciBhZ2FpbnN0IHRoZSBIZXJtZXMgVGltZXIgdGljawoqIElGQl9UaWNrSW5pIGlzIHRoZSB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFMvVyBwcm90ZWN0aW9uIGNvdW50ZXIgc3VjaCB0aGF0IHRoZSBleHBpcmF0aW9uIHBlcmlvZAoqIG1vcmUgb3IgbGVzcyBpbmRlcGVuZGVudCBvZiB0aGUgcHJvY2Vzc29yIHNwZWVkLiBJZiBJRkJfVGlja0luaSBpcyBub3QgeWV0IGNhbGlicmF0ZWQsIGl0IGlzIGRvbmUgbm93LgoqIFRoaXMgY2FsaWJyYXRpb24gaXMgInJlYXNvbmFibHkiIGFjY3VyYXRlIGJlY2F1c2UgdGhlIEhlcm1lcyBpcyBpbiBhIHF1aWV0IHN0YXRlIGFzIGEgcmVzdWx0IG9mIHRoZQoqIEluaXRpYWxpemUgY29tbWFuZC4KKgoqCiouRElBR1JBTQoqCioxOglJRkJfVGlja0luaSBpcyBpbml0aWFsaXplZCBhdCBJTklfVElDS19JTkkgYnkgaGNmX2Nvbm5lY3QuIElmIGNhbGlicmF0ZSBzdWNjZWVkcywgSUZCX1RpY2tJbmkgaXMKKglndWFyYW50ZWVkIHRvIGJlIGNoYW5nZWQuIEFzIGEgY29uc2VxdWVuY2UgdGhlcmUgd2lsbCBiZSBvbmx5IDEgc2hvdCBhdCBjYWxpYnJhdGlvbiAocmVnYXJkbGVzcyBvZiB0aGUKKgludW1iZXIgb2YgaW5pdCBjYWxscykgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMuCioyOglDYWxpYnJhdGlvbiBpcyBkb25lIEhDRl9QUk9UX1RJTUVfQ05UIHRpbWVzLiBUaGlzIGRpbWluaXNoIHRoZSBlZmZlY3RzIG9mIGppdHRlciBhbmQgaW50ZXJmZXJlbmNlLAoqCWVzcGVjaWFsbHkgaW4gYSBwcmUtZW1wdGl2ZSBlbnZpcm9ubWVudC4gSENGX1BST1RfVElNRV9DTlQgaXMgaW4gdGhlIHJhbmdlIG9mIDE2IHRocm91Z2ggMzIgYW5kIGRlcml2ZWQKKglmcm9tIHRoZSBIQ0ZfUFJPVF9USU1FIHNwZWNpZmllZCBieSB0aGUgTVNGIHByb2dyYW1tZXIuIFRoZSBkaXZpc29yIG5lZWRlZCB0byBzY2FsZSBIQ0ZfUFJPVF9USU1FIGludG8gdGhlCioJMTYtMzIgcmFuZ2UsIGlzIHVzZWQgYXMgYSBtdWx0aXBsaWNhdG9yIGFmdGVyIHRoZSBjYWxpYnJhdGlvbiwgdG8gc2NhbGUgdGhlIGZvdW5kIHZhbHVlIGJhY2sgdG8gdGhlCioJcmVxdWVzdGVkIHJhbmdlLiBUaGlzIHdheSBhIGNvbXByb21pc2UgaXMgYWNoaWV2ZWQgYmV0d2VlbiBhY2N1cmFjeSBhbmQgZHVyYXRpb24gb2YgdGhlIGNhbGlicmF0aW9uCioJcHJvY2Vzcy4KKjM6CUFja25vd2xlZGdlIHRoZSBUaW1lciBUaWNrIEV2ZW50LgoqCUVhY2ggY3ljbGUgaXMgbGltaXRlZCB0byBhdCBtb3N0IElOSV9USUNLX0lOSSBzYW1wbGVzIG9mIHRoZSBUaW1lclRpY2sgc3RhdHVzIG9mIHRoZSBIZXJtZXMuCioJU2luY2UgdGhlIHN0YXJ0IG9mIGNhbGlicmF0ZSBpcyB1bnJlbGF0ZWQgdG8gdGhlIEhlcm1lcyBJbnRlcm5hbCBUaW1lciwgdGhlIGZpcnN0IGludGVydmFsIG1heSBsYXN0IGZyb20gMAoqCXRvIHRoZSBub3JtYWwgaW50ZXJ2YWwsIGFsbCBzdWJzZXF1ZW50IGludGVydmFscyBzaG91bGQgYmUgdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSBIZXJtZXMgVGljayBpbnRlcnZhbC4KKglUaGUgSGVybWVzIFRpbWVyIFRpY2sgaXMgbm90IHJlcHJvZ3JhbW1lZCBieSB0aGUgSENGLCBoZW5jZSBpdCBpcyBydW5uaW5nIGF0IHRoZSBkZWZhdWx0IG9mIDEwIGsKKgltaWNyb3NlY29uZHMuCio0OglJZiB0aGUgVGltZXIgVGljayBFdmVudCBpcyBjb250aW51b3VzbHkgdXAgKHByb3RfY250IHN0aWxsIGhhcyB0aGUgdmFsdWUgSU5JX1RJQ0tfSU5JKSBvciBubyBUaW1lciBUaWNrCioJRXZlbnQgb2NjdXJyZWQgYmVmb3JlIHRoZSBwcm90ZWN0aW9uIGNvdW50ZXIgZXhwaXJlZCwgcmVzZXQgSUZCX1RpY2tJbmkgdG8gSU5JX1RJQ0tfSU5JLAoqCXNldCB0aGUgZGVmdW5jdCBiaXQgb2YgSUZCX0NhcmRTdGF0ICh0aHVzIHJlbmRlcmluZyB0aGUgSGVybWVzIGlub3BlcmFibGUpIGFuZCBleGl0IHRoZSBjYWxpYnJhdGUgcm91dGluZS4KKjg6CWlmYnAtPklGQl9UaWNrSW5pIGlzIG11bHRpcGxpZWQgdG8gc2NhbGUgdGhlIGZvdW5kIHZhbHVlIGJhY2sgdG8gdGhlIHJlcXVlc3RlZCByYW5nZSBhcyBleHBsYWluZWQgdW5kZXIgMi4KKgoqLk5PVElDRQoqIG8gQWx0aG91Z2ggdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHZpZXdwb2ludHMgcG9zc2libGUsIGNhbGlicmF0ZSgpIHVzZXMgYXMgZXJyb3Igc3RyYXRlZ3kgdGhhdCBhIHNpbmdsZQoqCWZhaWx1cmUgb2YgdGhlIEhlcm1lcyBUaW1lclRpY2sgaXMgY29uc2lkZXJlZCBmYXRhbC4KKiBvIFRoZXJlIGlzIG5vIGhhcmQgYW5kIGNvbmNyZXRlIHRpbWUtb3V0IHZhbHVlIGRlZmluZWQgZm9yIEhlcm1lcyBhY3Rpdml0aWVzLiBUaGUgZGVmYXVsdCAxIHNlY29uZHMgaXMKKgliZWxpZXZlZCB0byBiZSBzdWZmaWNpZW50bHkgInJlbGF4ZWQiIGZvciByZWFsIGxpZmUgYW5kIHRvIGJlIHN1ZmZpY2llbnRseSBzaG9ydCB0byBiZSBzdGlsbCB1c2VmdWwgaW4gYW4KKgllbnZpcm9ubWVudCB3aXRoIGh1bWFucy4KKiBvIE5vdGUgdGhhdCB2aWEgSUZCX0RlZnVuY3RTdGF0IHRpbWUgb3V0cyBpbiBjbWRfd2FpdCBhbmQgaW4gaGNmaW9fc3RyaW5nIGJsb2NrIGFsbCBIZXJtZXMgYWNjZXNzIHRpbGwgdGhlCioJbmV4dCBpbml0IHNvIGZ1bmN0aW9ucyB3aGljaCBjYWxsIGEgbWl4IG9mIGNtZF93YWl0IGFuZCBoY2Zpb19zdHJpbmcgb25seSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gc3RhdHVzCioJb2YgdGhlIGxhc3QgY2FsbAoqIG8gVGhlIHJldHVybiBjb2RlIGlzIHByZXNldCBhdCBUaW1lIG91dC4KKglUaGUgYWRkaXRpb25hbCBjb21wbGljYXRpb24gdGhhdCBubyBjYWxpYnJhdGVkIHZhbHVlIGZvciB0aGUgcHJvdGVjdGlvbiBjb3VudCBjYW4gYmUgYXNzdW1lZCBzaW5jZQoqCWNhbGlicmF0ZSgpIGRvZXMgbm90IHlldCBoYXZlIGRldGVybWluZWQgYSBjYWxpYnJhdGVkIHZhbHVlIChhIGNhdGNoIDIyKSwgaXMgaGFuZGxlZCBieSBzZXR0aW5nIHRoZQoqCWluaXRpYWwgdmFsdWUgYXQgSU5JX1RJQ0tfSU5JIChieSBoY2ZfY29ubmVjdCkuIFRoaXMgYXBwcm9hY2ggaXMgY29uc2lkZXJlZCBzYWZlLCBiZWNhdXNlOgoqCSAgLSB0aGUgSENGIGRvZXMgbm90IHVzZSB0aGUgcGlwZWxpbmUgbWVjaGFuaXNtIG9mIEhlcm1lcyBjb21tYW5kcy4KKgkgIC0gdGhlIGxpa2VsaWhvb2Qgb2YgZmFpbHVyZSAodGhlIG9ubHkgdGltZSB3aGVuIHByb3RlY3Rpb24gY291bnQgaXMgcmVsZXZhbnQpIGlzIHNtYWxsLgoqCSAgLSB0aGUgdGltZSB3aWxsIGJlIHN1ZmZpY2llbnRseSBsYXJnZSBvbiBhIGZhc3QgbWFjaGluZSAoYnVzeSBiaXQgZHJvcHMgb24gZ29vZCBOSUMgYmVmb3JlIGNvdW50ZXIKKgkJZXhwaXJlcykKKgkgIC0gdGhlIHRpbWUgd2lsbCBiZSBzdWZmaWNpZW50bHkgc21hbGwgb24gYSBzbG93IG1hY2hpbmUgKGNvdW50ZXIgZXhwaXJlcyBvbiBiYWQgTklDIGJlZm9yZSB0aGUgZW5kIHVzZXIKKgkgIAlzd2l0Y2hlcyB0aGUgcG93ZXIgb2ZmIGluIGRlc3BhaXIKKglUaGUgdGltZSBuZWVkZWQgdG8gd3JhcCBhIDMyIGJpdCBjb3VudGVyIGFyb3VuZCBpcyBsb25nZXIgdGhhbiBtYW55IGh1bWFucyB3YW50IHRvIHdhaXQsIGhlbmNlIHRoZSBtb3JlIG9yCioJbGVzcyBhcmJpdHJhcnkgdmFsdWUgb2YgMHg0MDAwMEwgaXMgY2hvc2VuLCBhc3N1bWluZyBpdCBkb2VzIG5vdCB0YWtlIHRvbyBsb25nIG9uIGFuIFhUIGFuZCBpcyBub3QgdG9vCioJc2hvcnQgb24gYSBzY3JlYW0tbWFjaGluZS4KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCmNhbGlicmF0ZSggSUZCUCBpZmJwICkKewppbnQJCWNudCA9IEhDRl9QUk9UX1RJTUVfQ05UOwpoY2ZfMzIJcHJvdF9jbnQ7CgoJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9DQUxJQlJBVEUgKTsKCWlmICggaWZicC0+SUZCX1RpY2tJbmkgPT0gSU5JX1RJQ0tfSU5JICkgewkJCQkJCQkJCQkJCQkvKjEqLwoJCWlmYnAtPklGQl9UaWNrSW5pID0gMDsJCQkJCQkJCQkJCQkJCQkJCS8qMiovCgkJCXdoaWxlICggY250LS0gKSB7CgkJCQlwcm90X2NudCA9IElOSV9USUNLX0lOSTsKCQkJCU9QVyggSFJFR19FVl9BQ0ssIEhSRUdfRVZfVElDSyApOwkJCQkJCQkJCQkJCS8qMyovCgkJCQl3aGlsZSAoIChJUFcoIEhSRUdfRVZfU1RBVCApICYgSFJFR19FVl9USUNLKSA9PSAwICYmIC0tcHJvdF9jbnQgKSB7CgkJCQkJaWZicC0+SUZCX1RpY2tJbmkrKzsKCQkJCX0KCQkJCWlmICggcHJvdF9jbnQgPT0gMCB8fCBwcm90X2NudCA9PSBJTklfVElDS19JTkkgKSB7CQkJCQkJCQkvKjQqLwoJCQkJCWlmYnAtPklGQl9UaWNrSW5pID0gSU5JX1RJQ0tfSU5JOwoJCQkJCWlmYnAtPklGQl9EZWZ1bmN0U3RhdCA9IEhDRl9FUlJfREVGVU5DVF9USU1FUjsKCQkJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CgkJCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIHByb3RfY250ICkKCQkJCX0KCQkJfQoJCWlmYnAtPklGQl9UaWNrSW5pIDw8PSBIQ0ZfUFJPVF9USU1FX1NIRlQ7CQkJCQkJCQkJCQkJLyo4Ki8KCX0KCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfQ0FMSUJSQVRFIHwgSENGX1RSQUNFX0VYSVQgKTsKfSAvLyBjYWxpYnJhdGUKI2VuZGlmIC8vIEhDRl9QUk9UX1RJTUUKCgojaWYgKEhDRl9ETF9PTkxZKSA9PSAwCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJaW50IGNoZWNrX21pYyggSUZCUCBpZmJwICkKKi5QVVJQT1NFCQl2ZXJpZmllcyB0aGUgTUlDIG9mIGEgcmVjZWl2ZWQgbm9uLVVTQiBmcmFtZS4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCioJSENGX0VSUl9NSUMKKgoqLkRFU0NSSVBUSU9OCioKKgoqLkRJQUdSQU0KKgoqNDoJdGVzdCB3aGV0aGVyIG9yIG5vdCBhIE1JQyBpcyByZXBvcnRlZCBieSB0aGUgSGVybWVzCioxNDogdGhlIGNhbGN1bGF0ZWQgTUlDIGFuZCB0aGUgcmVjZWl2ZWQgTUlDIGFyZSBjb21wYXJlZCwgdGhlIHJldHVybiBzdGF0dXMgaXMgc2V0IHdoZW4gdGhlcmUgaXMgYSBtaXNtYXRjaAoqCiouTk9USUNFCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKY2hlY2tfbWljKCBJRkJQIGlmYnAgKQp7CmludAkJcmMgPSBIQ0ZfU1VDQ0VTUzsKaGNmXzMyIHgzMlsyXTsJCQkJLy8qIGFyZWEgdG8gc2F2ZSByY3ZkIDggYnl0ZXMgTUlDCgoJCQkJCQkJCQkJCQkJLy9pZiBNSUMgcHJlc2VudCBpbiBSeEZTCglpZiAoICood2NpX3JlY29yZHApJmlmYnAtPklGQl9sYXBbLUhGU19BRERSX0RFU1RdICYgSEZTX1NUQVRfTUlDICkgewoJLy9vciBpZiAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ICE9IDB4RkZGRiApCgkJQ0FMQ19SWF9NSUMoIG1pY19wYWQsIDggKTsJCQkJCS8vLiAgcHJvY2VzcyB1cCB0byAzIHJlbWFpbmluZyBieXRlcyBvZiBkYXRhIGFuZCBhcHBlbmQgNSB0byA4IGJ5dGVzIG9mIHBhZGRpbmcgdG8gTUlDIGNhbGN1bGF0aW9uCgkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCl4MzIsIDggQkVfUEFSKDApKTsvLy4gIGdldCA4IGJ5dGUgTUlDIGZyb20gTklDCgkJCQkJCQkJCQkJCQkvLy4gIGlmIGNhbGN1bGF0ZWQgYW5kIHJlY2VpdmVkIE1JQyBkbyBub3QgbWF0Y2gKCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2V0IHN0YXR1cyBhdCBIQ0ZfRVJSX01JQwovKjE0Ki8gIGlmICggeDMyWzBdICE9IENOVl9MSVRUTEVfVE9fTE9ORyhpZmJwLT5JRkJfTUlDUnhbMF0pIHx8CiAgICAgICAgCSB4MzJbMV0gIT0gQ05WX0xJVFRMRV9UT19MT05HKGlmYnAtPklGQl9NSUNSeFsxXSkJICApIHsKCQkJcmMgPSBIQ0ZfRVJSX01JQzsKCQl9Cgl9CgkJCQkJCQkJCQkJCQkvL3JldHVybiBzdGF0dXMKCXJldHVybiByYzsKfSAvLyBjaGVja19taWMKI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQojZW5kaWYgLy8gSENGX0RMX09OTFkKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCWludCBjbWRfY21wbCggSUZCUCBpZmJwICkKKi5QVVJQT1NFCQl3YWl0cyBmb3IgSGVybWVzIENvbW1hbmQgQ29tcGxldGlvbi4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCiouUkVUVVJOUwoqCUlGQl9EZWZ1bmN0U3RhdAoqCUhDRl9FUlJfVElNRV9PVVQKKglIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUQoqCUhDRl9TVUNDRVNTCioKKi5ERVNDUklQVElPTgoqCioKKi5ESUFHUkFNCioKKjI6CU9uY2UgY21kX2NtcGwgaXMgY2FsbGVkLCB0aGUgQnVzeSBvcHRpb24gYml0IGluIElGQl9DbWQgbXVzdCBiZSBjbGVhcmVkCio0OglJZiBTdGF0dXMgcmVnaXN0ZXIgYW5kIGNvbW1hbmQgY29kZSBkb24ndCBtYXRjaCBlaXRoZXI6CioJIC0gdGhlIEhlcm1lcyBhbmQgSG9zdCBhcmUgb3V0IG9mIHN5bmMgKCBhIGZhdGFsIGVycm9yKQoqCSAtIGVycm9yIGJpdHMgYXJlIHJlcG9ydGVkIHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyLgoqCU91dCBvZiBzeW5jIGlzIGNvbnNpZGVyZWQgZmF0YWwgYW5kIGJyaW5ncyB0aGUgSENGIGluIERlZnVuY3QgbW9kZQoqCUVycm9ycyByZXBvcnRlZCB2aWEgdGhlIFN0YXR1cyBSZWdpc3RlciBzaG91bGQgYmUgY2F1c2VkIGJ5IHNlcXVlbmNlIHZpb2xhdGlvbnMgaW4gSGVybWVzIGNvbW1hbmQKKglzZXF1ZW5jZXMgYW5kIGhlbmNlIHRoZXNlIGJ1Z3Mgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZCBkdXJpbmcgZW5naW5lZXJpbmcgdGVzdGluZy4gU2luY2UgdGhlcmUgaXMgbm8KKglzdHJhdGVneSB0byBjb3BlIHdpdGggdGhpcyBwcm9ibGVtLCBpdCBtaWdodCBhcyB3ZWxsIGJlIGlnbm9yZWQgYXQgcnVuIHRpbWUuIE5vdGUgdGhhdCBmb3IgYW55IHBhcnRpY3VsYXIKKglzaXR1YXRpb24gd2hlcmUgYSBzdHJhdGVneSBpcyBmb3JtdWxhdGVkIHRvIGhhbmRsZSB0aGUgY29uc2VxdWVuY2VzIG9mIGEgcGFydGljdWxhciBidWcgY2F1c2luZyBhCioJcGFydGljdWxhciBFcnJvciBzaXR1YXRpb24gcmVwb3J0ZWQgdmlhIHRoZSBTdGF0dXMgUmVnaXN0ZXIsIHRoZSBidWcgc2hvdWxkIGJlIHJlbW92ZWQgcmF0aGVyIHRoYW4gYWRkaW5nCioJbG9naWMgdG8gY29wZSB3aXRoIHRoZSBjb25zZXF1ZW5jZXMgb2YgdGhlIGJ1Zy4KKglUaGVyZSBoYXZlIGJlZW4gSENGIHZlcnNpb25zIHdoZXJlIGFuIGVycm9yIHJlcG9ydCB2aWEgdGhlIFN0YXR1cyBSZWdpc3RlciBldmVuIGJyb3VnaHQgdGhlIEhDRiBpbiBkZWZ1bmN0CioJbW9kZSAoYWx0aG91Z2ggaXQgd2FzIG5vdCB5ZXQgbmFtZWQgbGlrZSB0aGF0IGF0IHRoYXQgdGltZSkuIFRoaXMgaXMgcGFydGljdWxhciB1bmRlc2lyYWJsZSBiZWhhdmlvciBmb3IgYQoqCWdlbmVyYWwgbGlicmFyeS4KKglTaW1wbHkgcmVwb3J0aW5nIHRoZSBlcnJvciAoYXMgImludGVyZXN0aW5nIikgaXMgZGViYXRhYmxlLiBUaGVyZSBhbHNvIGhhdmUgYmVlbiBIQ0YgdmVyc2lvbnMgd2l0aCB0aGlzCioJc3RyYXRlZ3kgdXNpbmcgdGhlICJ2YWd1ZSIgSENGX0ZBSUxVUkUgY29kZS4KKglUaGUgZXJyb3IgaXMgcmVwb3J0ZWQgdmlhOgoqCSAtIE1pc2NFcnIgdGFsbHkgb2YgdGhlIEhDRiBUYWxseSBzZXQKKgkgLSB0aGUgKGluZm9ybWF0aXZlKSBmaWVsZHMgSUZCX0VyckNtZCBhbmQgSUZCX0VyclF1YWxpZmllcgoqCSAtIHRoZSBhc3NlcnQgbWVjaGFuaXNtCio4OglIZXJlIHRoZSBEZWZ1bmN0IGNhc2UgYW5kIHRoZSBTdGF0dXMgZXJyb3IgYXJlIHNlcGFyYXRlbHkgdHJlYXRlZAoqCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaW50CmNtZF9jbXBsKCBJRkJQIGlmYnAgKQp7CgpQUk9UX0NOVF9JTkkKaW50CQlyYyA9IEhDRl9TVUNDRVNTOwpoY2ZfMTYJc3RhdDsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0NNRF9DUEwsIGlmYnAtPklGQl9DbWQgKQoJaWZicC0+SUZCX0NtZCAmPSB+SENNRF9CVVNZOwkJCQkJCQkJCQkJCS8qIDIgKi8KCUhDRl9XQUlUX1dISUxFKCAoSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsJCQkJCS8qIDQgKi8KCXN0YXQgPSBJUFcoIEhSRUdfU1RBVCApOwojaWYgSENGX1BST1RfVElNRQoJaWYgKCBwcm90X2NudCA9PSAwICkgewoJCUlGX1RBTExZKCBpZmJwLT5JRkJfSENGX1RhbGxpZXMuTWlzY0VycisrOyApCgkJcmMgPSBIQ0ZfRVJSX1RJTUVfT1VUOwoJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBpZmJwLT5JRkJfQ21kICkKCX0gZWxzZQojZW5kaWYgLy8gSENGX1BST1RfVElNRQoJewoJCURBV0FfQUNLKCBIUkVHX0VWX0NNRCApOwovKjQqLwlpZiAoIHN0YXQgIT0gKGlmYnAtPklGQl9DbWQgJiBIQ01EX0NNRF9DT0RFKSApIHsKLyo4Ki8JCWlmICggKCAoc3RhdCBeIGlmYnAtPklGQl9DbWQgKSAmIEhDTURfQ01EX0NPREUpICE9IDAgKSB7CgkJCQlyYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdCA9IEhDRl9FUlJfREVGVU5DVF9DTURfU0VROwoJCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9ERUZVTkNUOwoJCQl9CgkJCUlGX1RBTExZKCBpZmJwLT5JRkJfSENGX1RhbGxpZXMuTWlzY0VycisrOyApCgkJCWlmYnAtPklGQl9FcnJDbWQgPSBzdGF0OwoJCQlpZmJwLT5JRkJfRXJyUXVhbGlmaWVyID0gSVBXKCBIUkVHX1JFU1BfMCApOwoJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggSVBXKCBIUkVHX1BBUkFNXzAgKSwgaWZicC0+SUZCX0NtZCApICkKCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIGlmYnAtPklGQl9FcnJRdWFsaWZpZXIsIGlmYnAtPklGQl9FcnJDbWQgKSApCgkJfQoJfQoJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMpCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ01EX0NQTCApCglyZXR1cm4gcmM7Cn0gLy8gY21kX2NtcGwKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCWludCBjbWRfZXhlKCBJRkJQIGlmYnAsIGludCBjbWRfY29kZSwgaW50IHBhcl8wICkKKi5QVVJQT1NFCQlFeGVjdXRlcyBzeW5jaHJvbm91cyBwYXJ0IG9mIEhlcm1lcyBDb21tYW5kIGFuZCAtIG9wdGlvbmFsbHkgLSB3YWl0cyBmb3IgQ29tbWFuZCBDb21wbGV0aW9uLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJY21kX2NvZGUKKglwYXJfMAoqCiouUkVUVVJOUwoqCUlGQl9EZWZ1bmN0U3RhdAoqCUhDRl9FUlJfREVGVU5DVF9DTURfU0VRCioJSENGX1NVQ0NFU1MKKglIQ0ZfRVJSX1RPX0JFX0FEREVECTw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8CioKKi5ERVNDUklQVElPTgoqIEV4ZWN1dGVzIHN5bmNocm9ub3VzIEhlcm1lcyBDb21tYW5kIGFuZCB3YWl0cyBmb3IgQ29tbWFuZCBDb21wbGV0aW9uCioKKiBUaGUgZ2VuZXJhbCBIQ0Ygc3RyYXRlZ3kgaXMgdG8gd2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uLiBBcyBhIGNvbnNlcXVlbmNlOgoqIC0gdGhlIHJlYWQgb2YgdGhlIGJ1c3kgYml0IGJlZm9yZSB3cml0aW5nIHRoZSBjb21tYW5kIHJlZ2lzdGVyIGlzIHN1cGVyZmx1b3VzCiogLSB0aGUgSGVybWVzIHJlcXVpcmVtZW50IHRoYXQgbm8gSW5xdWlyeSBjb21tYW5kIG1heSBiZSBleGVjdXRlZCBpZiB0aGVyZSBpcyBzdGlsbCBhbiB1bmFja25vd2xlZGdlZAoqCUlucXVpcnkgY29tbWFuZCBvdXRzdGFuZGluZywgaXMgYXV0b21hdGljYWxseSBtZXQuCiogVGhlIFR4IGNvbW1hbmQgdXNlcyB0aGUgIkJ1c3kiIGJpdCBpbiB0aGUgY21kX2NvZGUgcGFyYW1ldGVyIHRvIGRldmlhdGUgZnJvbSB0aGlzIGdlbmVyYWwgSENGIHN0cmF0ZWd5LgoqIFRoZSBpZGVhIGlzIHRoYXQgYnkgbm90IGJ1c3ktd2FpdGluZyBvbiBjb21wbGV0aW9uIG9mIHRoaXMgZnJlcXVlbnRseSB1c2VkIGNvbW1hbmQgdGhlIHByb2Nlc3NvcgoqIHV0aWxpemF0aW9uIGlzIGRpbWluaXNoZWQgd2hpbGUgdXNpbmcgdGhlIGJ1c3ktd2FpdCBvbiBhbGwgb3RoZXIgc2VsZG9tIHVzZWQgY29tbWFuZHMgdGhlIGZsb3cgaXMga2VwdAoqIHNpbXBsZS4KKgoqCioKKi5ESUFHUkFNCioKKjE6CXNraXAgdGhlIGJvZHkgb2YgY21kX2V4ZSB3aGVuIGluIGRlZnVuY3QgbW9kZSBvciB3aGVuIC0gYmFzZWQgb24gdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyIHdyaXRlIGFuZAoqCXJlYWQgYmFjayB0ZXN0IC0gdGhlcmUgaXMgYXBwYXJlbnRseSBubyBOSUMuCioJTm90ZTogd2UgZ2F2ZSB1cCBvbiB0aGUgIm9sZCIgc3RyYXRlZ3kgdG8gd3JpdGUgdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyIGF0IG1hZ2ljIG9ubHkgd2hlbiBuZWVkZWQuIER1ZSB0bwoqCXRoZSBpbnRyaWNhdGVuZXNzIG9mIEhlcm1lcyBGL1cgdmFyaWV0aWVzICggd2hpY2ggYmVoYXZlIGRpZmZlcmVudGx5IGFzIGZhciBhcyBjb3JydXB0aW9uIG9mIHRoZSBTL1cKKglTdXBwb3J0IHJlZ2lzdGVyIGlzIGludm9sdmVkKSwgdGhlIGluY3JlYXNpbmcgbnVtYmVyIG9mIEhlcm1lcyBjb21tYW5kcyB3aGljaCBkbyBhbiBpbXBsaWNpdCBpbml0aWFsaXplCioJKHRodXMgbW9kaWZ5aW5nIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlcikgYW5kIHRoZSB3b3JrYXJvdW5kcyBvZiBzb21lIE9TL1N1cHBvcnQgUy9XIGluZHVjZWQgYXNwZWN0cyAoZS5nLgoqCXRoZSBTeXN0ZW0gU29mdCBsaWJyYXJ5IGF0IFdpbk5UIHdoaWNoIHBvc3Rwb25lcyB0aGUgYWN0dWFsIG1hcHBpbmcgb2YgSS9PIHNwYWNlIHVwIHRvIDMwIHNlY29uZHMgYWZ0ZXIKKglnaXZpbmcgdGhlIGdvLWFoZWFkKSwgdGhlICJtYWdpYyIgc3RyYXRlZ3kgaXMgbm93IHJlZHVjZWQgdG8gYSBzaW1wbGUgd3JpdGUgYW5kIHJlYWQgYmFjay4gVGhpcyBtZWFucyB0aGF0CioJcHJvYmxlbXMgbGlrZSBhIGJ1ZyB0cmFtcGluZyBvdmVyIHRoZSBtZW1vcnkgbWFwcGVkIEhlcm1lcyByZWdpc3RlcnMgd2lsbCBubyBsb25nZXIgYmUgbm90aWNlZCBhcyBzaWRlCioJZWZmZWN0IG9mIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlciBjaGVjay4KKjI6CWNoZWNrIHdoZXRoZXIgdGhlIHByZWNlZGluZyBjb21tYW5kIHNraXBwZWQgdGhlIGJ1c3kgd2FpdCBhbmQgaWYgc28sIGNoZWNrIGZvciBjb21tYW5kIGNvbXBsZXRpb24KKgoqLk5PVElDRQoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkhDRl9TVEFUSUMgaW50CmNtZF9leGUoIElGQlAgaWZicCwgaGNmXzE2IGNtZF9jb2RlLCBoY2ZfMTYgcGFyXzAgKQkvL2lmIEhDTURfQlVTWSBvZiBjbWRfY29kZSBzZXQsIHRoZW4gZG8gTk9UIHdhaXQgZm9yIGNvbXBsZXRpb24KewppbnQgcmM7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9DTURfRVhFLCBjbWRfY29kZSApCglIQ0ZBU1NFUlQoIChjbWRfY29kZSAmIEhDTURfQ01EX0NPREUpICE9IEhDTURfVFggfHwgY21kX2NvZGUgJiBIQ01EX0JVU1ksIGNtZF9jb2RlICkgLy9UeCBtdXN0IGhhdmUgQnVzeSBiaXQgc2V0CglPUFcoIEhSRUdfU1dfMCwgSENGX01BR0lDICk7CglpZiAoIElQVyggSFJFR19TV18wICkgPT0gSENGX01BR0lDICkgewkJCQkJCQkJCQkJCQkJLyogMSAqLwoJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0OwoJfQoJZWxzZSByYyA9IEhDRl9FUlJfTk9fTklDOwoJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkvLzs/aXMgdGhpcyBhIGhvdCBpZGVhLCBiZXR0ZXIgTUVBU1VSRSBwZXJmb3JtYW5jZSBpbXBhY3QKLyoyKi8JaWYgKCBpZmJwLT5JRkJfQ21kICYgSENNRF9CVVNZICkgewoJCQlyYyA9IGNtZF9jbXBsKCBpZmJwICk7CgkJfQoJCU9QVyggSFJFR19QQVJBTV8wLCBwYXJfMCApOwoJCU9QVyggSFJFR19DTUQsIGNtZF9jb2RlICZ+SENNRF9CVVNZICk7CgkJaWZicC0+SUZCX0NtZCA9IGNtZF9jb2RlOwoJCWlmICggKGNtZF9jb2RlICYgSENNRF9CVVNZKSA9PSAwICkgewkvLzs/aXMgdGhpcyBhIGhvdCBpZGVhLCBiZXR0ZXIgTUVBU1VSRSBwZXJmb3JtYW5jZSBpbXBhY3QKCQkJcmMgPSBjbWRfY21wbCggaWZicCApOwoJCX0KCX0KCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIE1FUkdFXzIoIHJjLCBjbWRfY29kZSApICkKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9DTURfRVhFICkKCXJldHVybiByYzsKfSAvLyBjbWRfZXhlCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQlpbnQgZG93bmxvYWQoIElGQlAgaWZicCwgQ0ZHX1BST0dfU1RSQ1QgRkFSICpsdHZwICkKKi5QVVJQT1NFCQlkb3dubG9hZHMgRi9XIGltYWdlIGludG8gTklDIGFuZCBpbml0aWF0ZXMgZXhlY3V0aW9uIG9mIHRoZSBkb3dubG9hZGVkIEYvVy4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWx0dnAJCXNwZWNpZmllcyB0aGUgcHNldWRvLVJJRCAoYXMgZGVmaW5lZCBieSBXQ0kpCioKKi5SRVRVUk5TCioKKi5ERVNDUklQVElPTgoqCioKKi5ESUFHUkFNCioxOglGaXJzdCwgQWNrIGV2ZXJ5dGhpbmcgdG8gdW5ibG9jayBhIChwb3NzaWJseSkgYmxvY2tlZCBjbWQgcGlwZSBsaW5lCioJTm90ZSAxOiBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFuIEFsbG9jIGV2ZW50IGlzIHBlbmRpbmcgYW5kIHZlcnkgd2VsbCBwb3NzaWJsZSB0aGF0IGEgKFNlbmQpIENtZCBldmVudCBpcwoqCXBlbmRpbmcKKglOb3RlIDI6IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHN0cmF0ZWd5IHRha2VzIGF3YXkgdGhlIG5lZWQgdG8gYWNrIGV2ZXJ5IGNvbmNlaXZhYmxlIGV2ZW50IGFmdGVyIGFuCioJSGVybWVzIEluaXRpYWxpemUKKgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGludApkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKQkJCQkJCS8vSGVybWVzLUlJIGRvd25sb2FkICh2b2xhdGlsZSBvbmx5KQp7CmhjZl8xNgkJCQlpOwppbnQJCQkJCXJjID0gSENGX1NVQ0NFU1M7CndjaV9idWZwCQkJY3A7CmhjZl9pbwkJCQlpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZSArIEhSRUdfQVVYX0RBVEE7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9ETCwgbHR2cC0+dHlwICkKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQKCUhDRkFTU0VSVCggRE9fQVNTRVJULCBsdHZwLT5tb2RlICkKI2Vsc2UKCQkJCQkJCQkJCQkJCS8vaWYgaW5pdGlhbCAicHJvZ3JhbSIgTFRWCglpZiAoIGlmYnAtPklGQl9ETE1vZGUgPT0gQ0ZHX1BST0dfU1RPUCAmJiBsdHZwLT5tb2RlID09IENGR19QUk9HX1ZPTEFUSUxFKSB7CgkJCQkJCQkJCQkJCQkvLy4gIHN3aXRjaCBIZXJtZXMgdG8gaW5pdGlhbCBtb2RlCi8qMSovCU9QVyggSFJFR19FVl9BQ0ssIH5IUkVHX0VWX1NMRUVQX1JFUSApOwoJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9JTkksIDAgKTsJLyogSENNRF9JTkkgY2FuIG5vdCBiZSBwYXJ0IG9mIGluaXQoKSBiZWNhdXNlIHRoYXQgaXMgY2FsbGVkIG9uCgkJCQkJCQkJCQkJICogb3RoZXIgb2NjYXNpb25zIGFzIHdlbGwgKi8KCQlyYyA9IGluaXQoIGlmYnAgKTsKCX0KCQkJCQkJCQkJCQkJCS8vaWYgZmluYWwgInByb2dyYW0iIExUVgoJaWYgKCBsdHZwLT5tb2RlID09IENGR19QUk9HX1NUT1AgJiYgaWZicC0+SUZCX0RMTW9kZSA9PSBDRkdfUFJPR19WT0xBVElMRSkgewoJCQkJCQkJCQkJCQkJLy8uICBzdGFydCB0ZXJ0aWFyeSAob3Igc2Vjb25kYXJ5KQoJCU9QVyggSFJFR19QQVJBTV8xLCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciA+PiAxNikgKTsKCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfRVhFQ1VURSwgKGhjZl8xNikgbHR2cC0+bmljX2FkZHIgKTsKCQlpZiAocmMgPT0gSENGX1NVQ0NFU1MpIHsKCQkJcmMgPSBpbml0KCBpZmJwICk7CS8qOz8gZG8gd2UgcmVhbGx5IHdhbnQgdG8gc2tpcCBpbml0IGlmIGNtZF9leGUgZmFpbGVkLCBpLmUuCgkJCQkJCQkJICoJIElGQl9GV19Db21wX0lkIGlzIHRoYW4gcG9zc2libHkgaW5jb3JyZWN0ICovCgkgIAl9CgkJCQkJCQkJCQkJCQkvL2Vsc2UgKG5vbi1maW5hbCkKCX0gZWxzZSB7CgkJCQkJCQkJCQkJCQkvLy4gIGlmIG1vZGUgPT0gUmVhZGJhY2sgU0VFUFJPTQojaWYgMAkvLzs/IGFzIGxvbmcgYXMgdGhlIG5leHQgaWYgY29udGFpbnMgYSBoYXJkIGNvZGVkIDAsIG1pZ2h0IGFzIHdlbGwgbGVhdmUgaXQgb3V0IGV2ZW4gbW9yZSBvYnZpb3VzCgkJaWYgKCAwIC8qbGVuIGlzIGRlZmluaXRlbHkgbm90IHdhbnQgd2Ugd2FudDs/Ki8gJiYgbHR2cC0+bW9kZSA9PSBDRkdfUFJPR19TRUVQUk9NX1JFQURCQUNLICkgewoJCQlPUFcoIEhSRUdfUEFSQU1fMSwgKGhjZl8xNikobHR2cC0+bmljX2FkZHIgPj4gMTYpICk7CgkJCU9QVyggSFJFR19QQVJBTV8yLCBNVUxfQllfMihsdHZwLT5sZW4gLSA0KSk7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIHBlcmZvcm0gSGVybWVzIHByb2cgY21kIHdpdGggYXBwcm9wcmlhdGUgbW9kZSBiaXRzCgkJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9QUk9HUkFNIHwgbHR2cC0+bW9kZSwgKGhjZl8xNilsdHZwLT5uaWNfYWRkciApOwoJCQkJCQkJCQkJCQkJLy8uICAuICBzZXQgdXAgTklDIFJBTSBhZGRyZXNzYWJpbGl0eSBhY2NvcmRpbmcgUmVzcDAtMQoJCQlPUFcoIEhSRUdfQVVYX1BBR0UsICAgSVBXKCBIUkVHX1JFU1BfMSkgKTsKCQkJT1BXKCBIUkVHX0FVWF9PRkZTRVQsIElQVyggSFJFR19SRVNQXzApICk7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIHNldCB1cCBMLWZpZWxkIG9mIExUViBhY2NvcmRpbmcgUmVzcDIKCQkJaSA9ICggSVBXKCBIUkVHX1JFU1BfMiApICsgMSApIC8gMjsgIC8vIGkgY29udGFpbnMgbWF4IGJ1ZmZlciBzaXplIGluIHdvcmRzLCBhIHByb2JhYmx5IG5vdCB2ZXJ5IHVzZWZ1bCBwaWVjZSBvZiBpbmZvcm1hdGlvbiA7PwovKk5pY28ncyBjb2RlIGJhc2VkIG9uIGkgaXMgdGhlICJyZWFsIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSIKCQkJaWYgKCBsdHZwLT5sZW4gLSA0IDwgaSApIHJjID0gSENGX0VSUl9MRU47CgkJCWVsc2UgbHR2cC0+bGVuID0gaSArIDQ7CiovCi8qIFJvbGFuZHMgY29kZSBiYXNlZCBvbiB0aGUgaWRlYSB0aGF0IGEgTVNGIHNob3VsZCBub3QgYXNrIGZvciBtb3JlIHRoYW4gaXMgYXZhaWxhYmxlCgkJCS8vIGNoZWNrIGlmIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQgZXhjZWVkcyBtYXggYnVmZmVyIHNpemUKCQkJaWYgKCBsdHZwLT5sZW4gLSA0ID4gaSApIHsKCQkJCXJjID0gSENGX0VSUl9MRU47CgkJCQlsdHZwLT5sZW4gPSBpICsgNDsKCQkJfQoqLwoJCQkJCQkJCQkJCQkJLy8uICAuICBjb3B5IGRhdGEgZnJvbSBOSUMgdmlhIEFVWCBwb3J0IHRvIExUVgoJCQljcCA9ICh3Y2lfYnVmcClsdHZwLT5ob3N0X2FkZHI7CQkJCQkJLypJTl9QT1JUX1NUUklOR184XzE2IG1hY3JvIG1heSBtb2RpZnkgaXRzIHBhcmFtZXRlcnMqLwoJCQlpID0gbHR2cC0+bGVuIC0gNDsKCQkJSU5fUE9SVF9TVFJJTkdfOF8xNiggaW9fcG9ydCwgY3AsIGkgKTsJCS8vISEhV09SRCBsZW5ndGgsIGNwIE1VU1QgYmUgYSBjaGFyIHBvaW50ZXIJLy8gJCQgY2hhcgoJCQkJCQkJCQkJCQkJLy8uICBlbHNlIChub24tZmluYWwgcHJvZ3JhbW1pbmcpCgkJfSBlbHNlCiNlbmRpZiAvLzs/IGFzIGxvbmcgYXMgdGhlIGFib3ZlIGlmIGNvbnRhaW5zIGEgaGFyZCBjb2RlZCAwLCBtaWdodCBhcyB3ZWxsIGxlYXZlIGl0IG91dCBldmVuIG1vcmUgb2J2aW91cwoJCXsJCQkJCQkJCQkJCS8vLiAgLiAgZ2V0IG51bWJlciBvZiB3b3JkcyB0byBwcm9ncmFtCgkJCUhDRkFTU0VSVCggbHR2cC0+c2VnbWVudF9zaXplLCAqbHR2cC0+aG9zdF9hZGRyICkKCQkJaSA9IGx0dnAtPnNlZ21lbnRfc2l6ZS8yOwoJCQkJCQkJCQkJCQkJLy8uICAuICBjb3B5IGRhdGEgKHdvcmRzKSBmcm9tIExUViB2aWEgQVVYIHBvcnQgdG8gTklDCgkJCWNwID0gKHdjaV9idWZwKWx0dnAtPmhvc3RfYWRkcjsJCQkJCQkvL09VVF9QT1JUX1NUUklOR184XzE2IG1hY3JvIG1heSBtb2RpZnkgaXRzIHBhcmFtZXRlcnMKCQkJCQkJCQkJCQkJCS8vLiAgLiAgaWYgbW9kZSA9PSB2b2xhdGlsZSBwcm9ncmFtbWluZwoJCQlpZiAoIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfVk9MQVRJTEUgKSB7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHNldCB1cCBOSUMgUkFNIGFkZHJlc3NhYmlsaXR5IHZpYSBBVVggcG9ydAoJCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciA+PiAxNiA8PCA5IHwgKGx0dnAtPm5pY19hZGRyICYgMHhGRkZGKSA+PiA3ICkgKTsKCQkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciAmIDB4MDA3RSkgKTsKCQkJCU9VVF9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBjcCwgaSApOwkJLy8hISFXT1JEIGxlbmd0aCwgY3AgTVVTVCBiZSBhIGNoYXIgcG9pbnRlcgoJCQl9CgkJfQoJfQoJaWZicC0+SUZCX0RMTW9kZSA9IGx0dnAtPm1vZGU7CQkJCQkvL3NhdmUgc3RhdGUgaW4gSUZCX0RMTW9kZQojZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfREwgKQoJcmV0dXJuIHJjOwp9IC8vIGRvd25sb2FkCgoKI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENlcnRhaW4gSGVybWVzLUlJIGZpcm13YXJlIHZlcnNpb25zIGNhbiBnZW5lcmF0ZQoqIGRlYnVnIGluZm9ybWF0aW9uLiBUaGlzIGRlYnVnIGluZm9ybWF0aW9uIGlzCiogY29udGFpbmVkIGluIGEgYnVmZmVyIGluIG5pYy1SQU0sIGFuZCBjYW4gYmUgcmVhZAoqIHZpYSB0aGUgYXV4IHBvcnQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGludApmd19wcmludGYoSUZCUCBpZmJwLCBDRkdfRldfUFJJTlRGX1NUUkNUIEZBUiAqbHR2cCkKewogICAgaW50IHJjID0gSENGX1NVQ0NFU1M7CiAgICBoY2ZfMTYgZndfY250OwovLyAgICBoY2ZfMzIgRGJNc2dCdWZmZXIgPSAweDI5RDIsIERiTXNnQ291bnQ9IDB4MDAwMDI5RDA7Ci8vICAgIGhjZl8xNiBEYk1zZ1NpemU9MHgwMDAwMDA4MDsKICAgIGhjZl8zMiBEYk1zZ0J1ZmZlcjsKICAgIENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUICpwID0gJmlmYnAtPklGQl9Gd1BmQnVmZjsKICAgIGx0dnAtPmxlbiA9IDE7CiAgICBpZiAoIHAtPkRiTXNnU2l6ZSAhPSAwICkgewogICAgICAgIC8vIGZpcnN0LCBjaGVjayB0aGUgY291bnRlciBpbiBuaWMtUkFNIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBsYXRlc3QgY291bnRlciB2YWx1ZSBvZiB0aGUgSENGCiAgICAgICAgT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShwLT5EYk1zZ0NvdW50ID4+IDcpICk7CiAgICAgICAgT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKHAtPkRiTXNnQ291bnQgJiAweDdFKSApOwogICAgICAgIGZ3X2NudCA9ICgoSVBXKCBIUkVHX0FVWF9EQVRBKSA+PjEgKSAmICgoaGNmXzE2KXAtPkRiTXNnU2l6ZSAtIDEpKTsKICAgICAgICBpZiAoIGZ3X2NudCAhPSBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCApIHsKLy8gICAgRGJnUHJpbnQoImZ3X2NudD0lZCBJRkJfRGJnUHJpbnRGX0NudD0lZFxuIiwgZndfY250LCBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCk7CiAgICAgICAgICAgIERiTXNnQnVmZmVyID0gcC0+RGJNc2dCdWZmZXIgKyBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCAqIDY7IC8vIGVhY2ggZW50cnkgaXMgMyB3b3JkcwogICAgICAgICAgICBPUFcoIEhSRUdfQVVYX1BBR0UsIChoY2ZfMTYpKERiTXNnQnVmZmVyID4+IDcpICk7CiAgICAgICAgICAgIE9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShEYk1zZ0J1ZmZlciAmIDB4N0UpICk7CiAgICAgICAgICAgIGx0dnAtPm1zZ19pZCAgICAgPSBJUFcoSFJFR19BVVhfREFUQSk7CiAgICAgICAgICAgIGx0dnAtPm1zZ19wYXIgICAgPSBJUFcoSFJFR19BVVhfREFUQSk7CiAgICAgICAgICAgIGx0dnAtPm1zZ190c3RhbXAgPSBJUFcoSFJFR19BVVhfREFUQSk7CiAgICAgICAgICAgIGx0dnAtPmxlbiA9IDQ7CiAgICAgICAgICAgIGlmYnAtPklGQl9EYmdQcmludEZfQ250Kys7CiAgICAgICAgICAgIGlmYnAtPklGQl9EYmdQcmludEZfQ250ICY9IChwLT5EYk1zZ1NpemUgLSAxKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmM7Cn07CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgoKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQloY2ZfMTYgZ2V0X2ZpZCggSUZCUCBpZmJwICkKKi5QVVJQT1NFCQlnZXQgYWxsb2NhdGVkIEZJRCBmb3IgZWl0aGVyIHRyYW5zbWl0IG9yIG5vdGlmeS4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCiouUkVUVVJOUwoqCTAJbm8gRklEIGF2YWlsYWJsZQoqCTw+MAlGSUQgbnVtYmVyCioKKi5ERVNDUklQVElPTgoqCioKKi5ESUFHUkFNCioJVGhlIHByZWZlcmVuY2UgaXMgdG8gdXNlIGEgInBlbmRpbmciIGFsbG9jLiBJZiBubyBhbGxvYyBpcyBwZW5kaW5nLCB0aGVuIC0gaWYgYXZhaWxhYmxlIC0gdGhlICJzcGFyZSIgRklECioJaXMgdXNlZC4KKglJZiB0aGUgc3BhcmUgRklEIGlzIHVzZWQsIElGQl9Sc2NJbmQgKHJlcHJlc2VudGluZyB0aGUgc3BhcmUgRklEKSBtdXN0IGJlIGNsZWFyZWQKKglJZiB0aGUgcGVuZGluZyBhbGxvYyBpcyB1c2VkLCB0aGUgYWxsb2MgZXZlbnQgbXVzdCBiZSBhY2tub3dsZWRnZWQgdG8gdGhlIEhlcm1lcy4KKglJbiBjYXNlIHRoZSBzcGFyZSBGSUQgd2FzIGRlcGxldGVkIGFuZCB0aGUgSUZCX1JzY0luZCBoYXMgYmVlbiAiZmFrZWQiIGFzIHBzZXVkbyByZXNvdXJjZSB3aXRoIGEgMHgwMDAxCioJdmFsdWUgYnkgaGNmX3NlcnZpY2VfbmljLCBJRkJfUnNjSW5kIGhhcyB0byBiZSAiY29ycmVjdGVkIiBhZ2FpbiB0byBpdHMgMHgwMDAwIHZhbHVlLgoqCioJTm90ZSB0aGF0IGR1ZSB0byB0aGUgSGVybWVzLUlJIEgvVyBwcm9ibGVtcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgd29ya2VkIGFyb3VuZCBieSBEQVdBLCB0aGUgQWxsb2MgYml0CioJaW4gdGhlIEV2ZW50IHJlZ2lzdGVyIGlzIG5vIGxvbmdlciBhIHJlbGlhYmxlIGluZGljYXRpb24gb2YgdGhlIHByZXNlbmNlL2Fic2VuY2Ugb2YgYSBGSUQuIFRoZSAiQ2xlYXIgRklEIgoqCXBhcnQgb2YgdGhlIERBV0EgbG9naWMsIHRvZ2V0aGVyIHdpdGggdGhlIGNob2ljZSBvZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcmV0dXJuIGluZm9ybWF0aW9uIGZyb20gZ2V0X2ZpZCwKKgloYW5kbGUgdGhpcyBhdXRvbWF0aWNhbGx5LCBpLmUuIHdpdGhvdXQgYWRkaXRpb25hbCBjb2RlIGluIGdldF9maWQuCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGhjZl8xNgpnZXRfZmlkKCBJRkJQIGlmYnAgKQp7CgpoY2ZfMTYgZmlkID0gMDsKI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwClBST1RfQ05UX0lOSQojZW5kaWYgLy8gSENGX1RZUEVfSElJNQoKCUlGX0RNQSggSENGQVNTRVJUKCEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSwgaWZicC0+SUZCX0NudGxPcHQpICkKCglpZiAoIElQVyggSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQUxMT0MpIHsKCQlmaWQgPSBJUFcoIEhSRUdfQUxMT0NfRklEICk7CgkJSENGQVNTRVJUKCBmaWQsIGlmYnAtPklGQl9Sc2NJbmQgKQoJCURBV0FfWkVST19GSUQoIEhSRUdfQUxMT0NfRklEICkKI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCgkJSENGX1dBSVRfV0hJTEUoICggSVBXKCBIUkVHX0VWX1NUQVQgKSAmIEhSRUdfRVZfQUNLX1JFR19SRUFEWSApID09IDAgKTsKCQlIQ0ZBU1NFUlQoIHByb3RfY250LCBJUFcoIEhSRUdfRVZfU1RBVCApICkKI2VuZGlmIC8vIEhDRl9UWVBFX0hJSTUKCQlEQVdBX0FDSyggSFJFR19FVl9BTExPQyApOwkJCS8vISFub3RlIHRoYXQgSFJFR19FVl9BTExPQyBpcyB3cml0dGVuIG9ubHkgb25jZQovLyAxODAgZGVncmVlIGVycm9yIGluIGxvZ2ljIDs/ICNpZiBBTExPQ18xNQoJCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAxICkgewoJCQlpZmJwLT5JRkJfUnNjSW5kID0gMDsKCQl9Ci8vI2VuZGlmIC8vIEFMTE9DXzE1Cgl9IGVsc2UgewovLyAxODAgZGVncmVlIGVycm9yIGluIGxvZ2ljIDs/ICNpZiBBTExPQ18xNQoJCWZpZCA9IGlmYnAtPklGQl9Sc2NJbmQ7Ci8vI2VuZGlmIC8vIEFMTE9DXzE1CgkJaWZicC0+SUZCX1JzY0luZCA9IDA7Cgl9CglyZXR1cm4gZmlkOwp9IC8vIGdldF9maWQKI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQl2b2lkIGdldF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCiouUFVSUE9TRQkJcmVhZHMgd2l0aCAxNi8zMiBiaXQgSS9PIHZpYSBCQVAxIHBvcnQgZnJvbSBOSUMgUkFNIHRvIEhvc3QgbWVtb3J5LgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJYnVmcAkJKGJ5dGUpIGFkZHJlc3Mgb2YgYnVmZmVyCioJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAoqCXdvcmRfbGVuCUJpZyBFbmRpYW4gb25seTogbnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgdG8gc3dhcCBpbiBwYWlycwoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKiBwcm9jZXNzIHRoZSBzaW5nbGUgYnl0ZSAoaWYgYXBwbGljYWJsZSkgcmVhZCBieSB0aGUgcHJldmlvdXMgZ2V0X2ZyYWcgYW5kIGNvcHkgbGVuIChvciBsZW4tMSkgYnl0ZXMgZnJvbQoqIE5JQyB0byBidWZwLgoqIE9uIGEgQmlnIEVuZGlhbiBwbGF0Zm9ybSwgdGhlIHBhcmFtZXRlciB3b3JkX2xlbiBjb250cm9scyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgd2hvc2UgZW5kaWFuZXNzIGlzCiogY29udmVydGVkIChpLmUuIGJ5dGUgc3dhcHBlZCkKKgoqCiouRElBR1JBTQoqMTA6IFRoZSBQQ01DSUEgY2FyZCBjYW4gYmUgcmVtb3ZlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0cmFuc2Zlci4gQnkgZGVwb3NpdGluZyBhICJtYWdpYyBudW1iZXIiIGluIHRoZQoqCUhSRUdfU1dfMCByZWdpc3RlciBvZiB0aGUgSGVybWVzIGF0IGluaXRpYWxpemF0aW9uIHRpbWUgYW5kIGJ5IHZlcmlmeWluZyB0aGlzIHJlZ2lzdGVyLCBpdCBjYW4gYmUKKglkZXRlcm1pbmVkIHdoZXRoZXIgdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudC4gVGhlIHJldHVybiBzdGF0dXMgaXMgc2V0IGFjY29yZGluZ2x5LgoqCUNsZWFyaW5nIHRoZSBidWZmZXIgaXMgYSAocmVsYXRpdmUpIGNoZWFwIHdheSB0byBwcmV2ZW50IHRoYXQgZmFpbGluZyBJL08gcmVzdWx0cyBpbiBydW4tYXdheSBiZWhhdmlvcgoqCWJlY2F1c2UgdGhlIGdhcmJhZ2UgaW4gdGhlIGJ1ZmZlciBpcyBpbnRlcnByZXRlZCBieSB0aGUgY2FsbGVyIGlycmVzcGVjdGl2ZSBvZiB0aGUgcmV0dXJuIHN0YXR1cyAoZS5nLgoqCWhjZl9zZXJ2aWNlX25pYyBoYXMgdGhpcyBiZWhhdmlvcikuCioKKi5OT1RJQ0UKKglJdCB0dXJucyBvdXQgRE9TIE9ESSB1c2VzIHplcm8gbGVuZ3RoIGZyYWdtZW50cy4gVGhlIEhDRiBjb2RlIGNhbiBjb3BlIHdpdGggaXQsIGJ1dCBhcyBhIGNvbnNlcXVlbmNlLCBubwoqCUFzc2VydCBvbiBsZW4gaXMgcG9zc2libGUKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCmdldF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCnsKaGNmX2lvCQlpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZSArIEhSRUdfREFUQV8xOwkvL0JBUCBkYXRhIHJlZ2lzdGVyCndjaV9idWZwCXAgPSBidWZwOwkJCQkJCQkJCS8vd29ya2luZyBwb2ludGVyCmludAkJCWk7CQkJCQkJCQkJCQkvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KaW50CQkJajsKCglIQ0ZBU1NFUlQoICgoaGNmXzMyKWJ1ZnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMilidWZwICkKCi8qMToJaGVyZSByZWNvdmVyeSBsb2dpYyBmb3IgaW50ZXJ2ZW5pbmcgQkFQIGFjY2VzcyBiZXR3ZWVuIGhjZl9zZXJ2aWNlX25pYyBhbmQgaGNmX3Jjdl9tc2cgQ09VTEQgYmUgYWRkZWQKICogCWlmIGN1cnJlbnQgYWNjZXNzIGlzIFJ4SW5pdGlhbAogKiAJLiAgcGVyc2lzdGVudF9vZmZzZXQgKz0gbGVuCiAqLwoKCWkgPSBsZW47CgkJCQkJCQkJCQkJCQkvL2lmIGJ1ZmZlciBsZW5ndGggPiAwIGFuZCBjYXJyeSBmcm9tIHByZXZpb3VzIGdldF9mcmFnCglpZiAoIGkgJiYgaWZicC0+SUZCX0NhcnJ5SW4gKSB7CgkJCQkJCQkJCQkJCQkvLy4gIG1vdmUgY2FycnkgdG8gYnVmZmVyCgkJCQkJCQkJCQkJCQkvLy4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CgkJKnArKyA9IChoY2ZfOCkoaWZicC0+SUZCX0NhcnJ5SW4+PjgpOwoJCWktLTsKCQkJCQkJCQkJCQkJCS8vLiAgY2xlYXIgY2FycnkgZmxhZwoJCWlmYnAtPklGQl9DYXJyeUluID0gMDsKCX0KI2lmIChIQ0ZfSU8pICYgSENGX0lPXzMyQklUUwoJLy9za2lwIHplcm8tbGVuZ3RoIEkvTywgc2luZ2xlIGJ5dGUgSS9PIGFuZCBJL08gbm90IHdvcnRod2hpbGUgKGkuZS4gbGVzcyB0aGFuIDYgYnl0ZXMpZm9yIERXIGxvZ2ljCgkJCQkJCQkJCQkJCQkvL2lmIGJ1ZmZlciBsZW5ndGggPj0gNiBhbmQgMzIgYml0cyBJL08gc3VwcG9ydAoJaWYgKCAhKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFXzE2QklUKSAmJiBpID49IDYgKSB7CmhjZl8zMiBGQVIJKnA0OyAvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KCQlpZiAoICggKGhjZl8zMilwICYgMHgxICkgPT0gMCApIHsJCQkvLy4gIGlmIGJ1ZmZlciBhdCBsZWFzdCB3b3JkIGFsaWduZWQKCQkJaWYgKCAoaGNmXzMyKXAgJiAweDIgKSB7CQkJCS8vLiAgLiAgaWYgYnVmZmVyIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCgkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHJlYWQgc2luZ2xlIHdvcmQgdG8gZ2V0IGRvdWJsZSB3b3JkIGFsaWduZWQKCQkJCSood2NpX3JlY29yZHApcCA9IElOX1BPUlRfV09SRCggaW9fcG9ydCApOwoJCQkJCQkJCQkJCQkJLy8uICAuICAuICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQoJCQkJcCArPSAyOwoJCQkJaSAtPSAyOwoJCQl9CgkJCQkJCQkJCQkJCQkvLy4gIC4gIHJlYWQgYXMgbWFueSBkb3VibGUgd29yZCBhcyBwb3NzaWJsZQoJCQlwNCA9IChoY2ZfMzIgRkFSICopcDsKCQkJaiA9IGkvNDsKCQkJSU5fUE9SVF9TVFJJTkdfMzIoIGlvX3BvcnQsIHA0LCBqICk7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CgkJCXAgKz0gaSAmIH4weDAwMDM7CgkJCWkgJj0gMHgwMDAzOwoJCX0KCX0KI2VuZGlmIC8vIEhDRl9JT18zMkJJVFMKCQkJCQkJCQkJCQkJCS8vaWYgbm8gMzItYml0IHN1cHBvcnQgT1IgYnl0ZSBhbGlnbmVkIE9SIDEtMyBieXRlcyBsZWZ0CglpZiAoIGkgKSB7CgkJCQkJCQkJCQkJCQkvLy4gIHJlYWQgYXMgbWFueSB3b3JkIGFzIHBvc3NpYmxlIGluICJhbGlnbm1lbnQgc2FmZSIgd2F5CgkJaiA9IGkvMjsKCQlJTl9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBwLCBqICk7CgkJCQkJCQkJCQkJCQkvLy4gIGlmIDEgYnl0ZSBsZWZ0CgkJaWYgKCBpICYgMHgwMDAxICkgewoJCQkJCQkJCQkJCQkJLy8uICAuICByZWFkIDEgd29yZAoJCQlpZmJwLT5JRkJfQ2FycnlJbiA9IElOX1BPUlRfV09SRCggaW9fcG9ydCApOwoJCQkJCQkJCQkJCQkJLy8uICAuICBzdG9yZSBMU0IgaW4gbGFzdCBjaGFyIG9mIGJ1ZmZlcgoJCQlidWZwW2xlbi0xXSA9IChoY2ZfOClpZmJwLT5JRkJfQ2FycnlJbjsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2F2ZSBNU0IgaW4gY2FycnksIHNldCBjYXJyeSBmbGFnCgkJCWlmYnAtPklGQl9DYXJyeUluIHw9IDB4MTsKCQl9Cgl9CiNpZiBIQ0ZfQklHX0VORElBTgoJSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8IHdvcmRfbGVuID09IDIgfHwgd29yZF9sZW4gPT0gNCwgd29yZF9sZW4gKQoJSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8ICgoaGNmXzMyKWJ1ZnAgJiAxICkgPT0gMCwgKGhjZl8zMilidWZwICkKCUhDRkFTU0VSVCggd29yZF9sZW4gPD0gbGVuLCBNRVJHRTIoIHdvcmRfbGVuLCBsZW4gKSApCgkvL3NlZSBwdXRfZnJhZyBmb3IgYW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24sIGJ1dCBiZSBjYXJlZnVsbCBhYm91dCB3aGF0IGFyZSBpbnQncyBhbmQgd2hhdCBhcmUKCS8vaGNmXzE2J3MKCWlmICggd29yZF9sZW4gKSB7CQkJCQkJCQkvLy4gIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGNvbnZlcnQKaGNmXzggYzsKCQljID0gYnVmcFsxXTsJCQkJCQkJCS8vLiAgLiAgY29udmVydCB0aGUgMXN0IGhjZl8xNgoJCWJ1ZnBbMV0gPSBidWZwWzBdOwoJCWJ1ZnBbMF0gPSBjOwoJCWlmICggd29yZF9sZW4gPiAxICkgewkJCQkJCS8vLiAgLiAgaWYgdGhlcmUgaXMgdG8gY29udmVydCBtb3JlIHRoYW4gMSB3b3JkICggaS5lIDIgKQoJCQljID0gYnVmcFszXTsJCQkJCQkJLy8uICAuICAuICBjb252ZXJ0IHRoZSAybmQgaGNmXzE2CgkJCWJ1ZnBbM10gPSBidWZwWzJdOwoJCQlidWZwWzJdID0gYzsKCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgp9IC8vIGdldF9mcmFnCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCWludCBpbml0KCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCUhhbmRsZXMgY29tbW9uIGluaXRpYWxpemF0aW9uIGFzcGVjdHMgKEgtSSBpbml0LCBjYWxpYnJhdGlvbiwgY29uZmlnLm1uZ210LCBhbGxvY2F0aW9uKS4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCiouUkVUVVJOUwoqCUhDRl9FUlJfSU5DT01QX1BSSQoqCUhDRl9FUlJfSU5DT01QX0ZXCioJSENGX0VSUl9USU1FX09VVAoqCT4+aGNmX2dldF9pbmZvCioJCUhDRl9FUlJfTk9fTklDCioJCUhDRl9FUlJfTEVOCioKKi5ERVNDUklQVElPTgoqIGluaXQgd2lsbCBzdWNjZXNzaXZlbHk6CiogLSBpbiBjYXNlIG9mIGEgKG5vbi1wcmVsb2FkZWQpIEgtSSwgaW5pdGlhbGl6ZSB0aGUgTklDCiogLSBjYWxpYnJhdGUgdGhlIFMvVyBwcm90ZWN0aW9uIHRpbWVyIGFnYWluc3QgdGhlIEhlcm1lcyBUaW1lcgoqIC0gY29sbGVjdCBIU0ksICJhY3RpdmUiIEYvVyBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24KKiAtIGluIGNhc2UgYWN0aXZlIEYvVyBpcyBQcmltYXJ5IEYvVzogY29sbGVjdCBQcmltYXJ5IEYvVyBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24KKiAtIGNoZWNrIEhTSSBhbmQgUHJpbWFyeSBGL1cgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIQ0YKKiAtIGluIGNhc2UgYWN0aXZlIEYvVyBpcyBTdGF0aW9uIG9yIEFQIEYvVzogY2hlY2sgU3RhdGlvbiBvciBBUCBGL1cgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIQ0YKKiAtIGluIGNhc2UgYWN0aXZlIEYvVyBpcyBub3QgUHJpbWFyeSBGL1c6IGFsbG9jYXRlIEZJRHMgdG8gYmUgdXNlZCBpbiB0cmFuc21pdC9ub3RpZnkgcHJvY2VzcwoqCioKKi5ESUFHUkFNCioyOglkcm9wIGFsbCBlcnJvciBzdGF0dXMgYml0cyBpbiBJRkJfQ2FyZFN0YXQgc2luY2UgdGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgcmUtZXZhbHVhdGVkLgoqNDoJQWNrIGV2ZXJ5dGhpbmcgZXhjZXB0IEhSRUdfRVZfU0xFRVBfUkVRLiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFuIEFsbG9jIGV2ZW50IGlzIHBlbmRpbmcgYW5kCioJdmVyeSB3ZWxsIHBvc3NpYmxlIHRoYXQgYSBTZW5kIENtZCBldmVudCBpcyBwZW5kaW5nLiBBY2tpbmcgSFJFR19FVl9TTEVFUF9SRVEgaXMgaGFuZGxlZCBieSBoY2ZfYWN0aW9uKAoqCUhDRl9BQ1RfSU5UX09OICkgISEhCioxMDogQ2FsaWJyYXRlIHRoZSBTL1cgdGltZS1vdXQgcHJvdGVjdGlvbiBtZWNoYW5pc20gYnkgY2FsbGluZyBjYWxpYnJhdGUoKS4gTm90ZSB0aGF0IHBvc3NpYmxlIGVycm9ycwoqCWluIHRoZSBjYWxpYnJhdGlvbiBwcm9jZXNzIGFyZSBub3IgcmVwb3J0ZWQgYnkgaW5pdCBidXQgd2lsbCBzaG93IHVwIHZpYSB0aGUgZGVmdW5jdCBtZWNoYW5pc20gaW4KKglzdWJzZXF1ZW50IGhjZi1jYWxscy4KKjE0OiB1c2JfY2hlY2tfY29tcCgpIGlzIGNhbGxlZCB0byBoYXZlIHRoZSBtaW5pbWFsIHZpc3VhbCBjbHV0dGVyIGZvciB0aGUgbGVnYWN5IEgtSSBVU0IgZG9uZ2xlCioJY29tcGF0aWJpbGl0eSBjaGVjay4KKjE2OiBUaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCByZWxhdGVkIGluZm9ybWF0aW9uIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBOSUM6CioJIC0gSFNJIHN1cHBsaWVyCioJIC0gRi9XIElkZW50aXR5CioJIC0gRi9XIHN1cHBsaWVyCioJIGlmIGFwcHJvcHJpYXRlOgoqCSAtIFBSSSBJZGVudGl0eQoqCSAtIFBSSSBzdXBwbGllcgoqCSBhcHByb3ByaWF0ZSBtZWFucyBvbiBILUk6IGFsd2F5cwoqCSBhbmQgb24gSC1JSSBpZiBGL1cgc3VwcGxpZXIgcmVmbGVjdHMgYSBwcmltYXJ5IChpLmUuIG9ubHkgYWZ0ZXIgYW4gSGVybWVzIFJlc2V0IG9yIEluaXQKKgkgY29tbWFuZCkuCioJIFFVRVNUSU9OIDs/ICEhISEhISBzaG91bGQsIEZvciBlYWNoIG9mIHRoZSBhYm92ZSBSSURzIHRoZSBFbmRpYW5lc3MgaXMgY29udmVydGVkIHRvIG5hdGl2ZSBFbmRpYW5lc3MuCioJIE9ubHkgdGhlIHJldHVybiBjb2RlIG9mIHRoZSBmaXJzdCBoY2ZfZ2V0X2luZm8gaXMgdXNlZC4gQWxsIGhjZl9nZXRfaW5mbyBjYWxscyBhcmUgbWFkZSwgcmVnYXJkbGVzcyBvZgoqCSB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSAxc3QgaGNmX2dldF9pbmZvLiBUaGUgYXNzdW1wdGlvbnMgYXJlOgoqCSAgLSBpZiBhbnkgY2FsbCBmYWlscywgdGhleSBhbGwgZmFpbCwgc28gcmVtZW1iZXJpbmcgdGhlIHJlc3VsdCBvZiB0aGUgMXN0IGNhbGwgaXMgYWRlcXVhdGUKKgkgIC0gYSBmYWlsaW5nIGNhbGwgd2lsbCBvdmVyd3JpdGUgdGhlIEwtZmllbGQgd2l0aCBhIDB4MDAwMCB2YWx1ZSwgd2hpY2ggc2VydmljZXMgYm90aCBhcyBhbgoqCQllcnJvciBpbmRpY2F0aW9uIGZvciB0aGUgdmFsdWVzIGNhY2hlZCBpbiB0aGUgSUZCIGFzIG1ha2luZyBtbWRfY2hlY2tfY29tcCBmYWlsLgoqCSBJbiBjYXNlIG9mIEgtSSwgd2hlbiBnZXR0aW5nIHRoZSBGL1cgaWRlbnRpdHkgZmFpbHMsIHRoZSBGL1cgaXMgYXNzdW1lZCB0byBiZSBILUkgQVAgRi9XIHByZS1kYXRpbmcKKgkgdmVyc2lvbiA5LjAgYW5kIHRoZSBGL1cgSWRlbnRpdHkgYW5kIFN1cHBsaWVyIGFyZSBmYWtlZCBhY2NvcmRpbmdseS4KKgkgSW4gY2FzZSBvZiBILUlJLCB0aGUgUHJpbWFyeSwgU3RhdGlvbiBhbmQgQVAgSWRlbnRpdHkgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIEYvVyBJZGVudGl0eS4KKgkgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgU3VwcGxpZXIgaW5mb3JtYXRpb24uIEFzIGEgY29uc2VxdWVuY2UgdGhlIFBSSSBpbmZvcm1hdGlvbiBjYW4gbm8gbG9uZ2VyIGJlCioJIHJldHJpZXZlZCB3aGVuIGEgVGVydGlhcnkgcnVucy4gVG8gYWNjb21tb2RhdGUgTVNGcyBhbmQgVXRpbGl0aWVzIHdobyBkZXBlbmQgb24gUFJJIGluZm9ybWF0aW9uIGJlaW5nCioJIGF2YWlsYWJsZSBhdCBhbnkgdGltZSwgdGhpcyBpbmZvcm1hdGlvbiBpcyBjYWNoZWQgaW4gdGhlIElGQi4gSW4gdGhpcyBjYWNoZSB0aGUgZ2VuZXJpYyAiRi9XIiB2YWx1ZSBvZgoqCSB0aGUgdHlwLWZpZWxkcyBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBzcGVjaWZpYyAobGVnYWN5KSAiUFJJIiB2YWx1ZXMuIFRvIGFjdHVhbGx5IHJlLXJvdXRlIHRoZSAobGVnYWN5KQoqCSBQUkkgcmVxdWVzdCB2aWEgaGNmX2dldF9pbmZvLCB0aGUgeHh4eC10YWJsZSBtdXN0IGJlIHNldC4gIEluIGNhc2Ugb2YgSC1JLCB0aGlzIGNhY2hpbmcsIG1vZGlmeWluZyBhbmQKKgkgcmUtcm91dGluZyBpcyBub3QgbmVlZGVkIGJlY2F1c2UgUFJJIGluZm9ybWF0aW9uIGlzIGFsd2F5cyBhdmFpbGFibGUgZGlyZWN0bHkgZnJvbSB0aGUgTklDLiBGb3IKKgkgY29uc2lzdGVuY3kgdGhlIGNhY2hpbmcgZmllbGRzIGluIHRoZSBJRkIgYXJlIGZpbGxlZCB3aXRoIHRoZSBQUkkgaW5mb3JtYXRpb24gYW55d2F5LgoqMTg6IG1kZF9jaGVja19jb21wKCkgaXMgY2FsbGVkIHRvIGNoZWNrIHRoZSBTdXBwbGllciBWYXJpYW50IGFuZCBSYW5nZSBvZiB0aGUgSG9zdC1TL1cgSS9GIChIU0kpIGFuZCB0aGUKKglQcmltYXJ5IEZpcm13YXJlIFZhcmlhbnQgYW5kIFJhbmdlIGFnYWluc3QgdGhlIFRvcCBhbmQgQm90dG9tIGxldmVsIHN1cHBvcnRlZCBieSB0aGlzIEhDRi4gIElmIGVpdGhlciBvZgoqCXRoZXNlIHRlc3RzIGZhaWxzLCB0aGUgQ0FSRF9TVEFUX0lOQ09NUF9QUkkgYml0IG9mIElGQl9DYXJkU3RhdCBpcyBzZXQKKglOb3RlOiBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIGEgcHJpbWFyeSBleGNlcHQgZHVyaW5nIHByb2R1Y3Rpb24sIHNvIHRoaXMgbWFrZXMgdGhlIEhDRiBpbiBpdHMgY3VycmVudCBmb3JtCioJdW5zdWl0YWJsZSBmb3IgbWFudWZhY3R1cmluZyB0ZXN0IHN5c3RlbXMgbGlrZSB0aGUgRlRTLiBUaGlzIGNhbiBiZSByZW1lZGllZCBieSBhbiBhZGRpbmcgYSB0ZXN0IGxpa2UKKglpZmJwLT5JRkJfUFJJU3VwLmlkID09IENPTVBfSURfUFJJCioyMDogSW4gY2FzZSB0aGVyZSBpcyBUZXJ0aWFyeSBGL1cgYW5kIHRoaXMgRi9XIGlzIFN0YXRpb24gRi9XLCB0aGUgU3VwcGxpZXIgVmFyaWFudCBhbmQgUmFuZ2Ugb2YgdGhlIFN0YXRpb24KKglGaXJtd2FyZSBmdW5jdGlvbiBhcyByZXRyaWV2ZWQgZnJvbSB0aGUgSGVybWVzIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgVG9wIGFuZCBCb3R0b20gbGV2ZWwgc3VwcG9ydGVkIGJ5CioJdGhpcyBIQ0YuCioJTm90ZTogOz8gdGhlIHRlcnRpYXJ5IEYvVyBjb21wYXRpYmlsaXR5IGNoZWNrcyBjb3VsZCBiZSBtb3ZlZCB0byB0aGUgREhGLCB3aGljaCBhbHJlYWR5IGhhcyBjaGVja2VkIHRoZQoqCUNGSSBhbmQgTUZJIGNvbXBhdGliaWxpdHkgb2YgdGhlIGltYWdlIHdpdGggdGhlIE5JQyBiZWZvcmUgdGhlIGltYWdlIHdhcyBkb3dubG9hZGVkLgoqMjg6IEluIGNhc2Ugb2Ygbm9uLVByaW1hcnkgRi9XOiBhbGxvY2F0ZXMgYW5kIGFja25vd2xlZGdlIGEgKFRYIG9yIE5vdGlmeSkgRklEIGFuZCBhbGxvY2F0ZXMgd2l0aG91dAoqCWFja25vd2xlZGdlIGFub3RoZXIgKFRYIG9yIE5vdGlmeSkgRklEICh0aGUgc28tY2FsbGVkIDEuNSBhbGxvYyBzY2hlbWUpIHdpdGggdGhlIGZvbGxvd2luZyBzdGVwczoKKgktIGV4ZWN1dGUgdGhlIGFsbG9jYXRlIGNvbW1hbmQgYnkgY2FsbGluZyBjbWRfZXhlCioJLSB3YWl0IHRpbGwgZWl0aGVyIHRoZSBhbGxvYyBldmVudCBvciBhIHRpbWUtb3V0IG9jY3VycwoqCS0gcmVnYXJkbGVzcyB3aGV0aGVyIHRoZSBhbGxvYyBldmVudCBvY2N1cnMsIGNhbGwgZ2V0X2ZpZCB0bwoqCSAgLSByZWFkIHRoZSBGSUQgYW5kIHNhdmUgaXQgaW4gSUZCX1JzY0luZCB0byBiZSB1c2VkIGFzICJzcGFyZSBGSUQiCioJICAtIGFja25vd2xlZGdlIHRoZSBhbGxvYyBldmVudAoqCSAgLSBkbyBhbm90aGVyICJoYWxmIiBhbGxvY2F0ZSB0byBjb21wbGV0ZSB0aGUgIjEuNSBBbGxvYyBzY2hlbWUiCioJICBOb3RlIHRoYXQgYWJvdmUgMyBzdGVwcyBkbyBub3QgaGFybSBhbmQgdGh1cyBnaXZlIHRoZSAiY2hlYXBlc3QiIGFjY2VwdGFibGUgc3RyYXRlZ3kuCioJICBJZiBhIHRpbWUtb3V0IG9jY3VycmVkLCB0aGVuIHJlcG9ydCB0aW1lIG91dCBzdGF0dXMgKGFmdGVyIGFsbCkKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQKaW5pdCggSUZCUCBpZmJwICkKewoKaW50CXJjID0gSENGX1NVQ0NFU1M7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9JTklULCAwICkKCglpZmJwLT5JRkJfQ2FyZFN0YXQgPSAwOwkJCQkJCQkJCQkJCQkJCQkJCQkvKiAyKi8KCU9QVyggSFJFR19FVl9BQ0ssIH5IUkVHX0VWX1NMRUVQX1JFUSApOyAJCQkJCQkJCQkJCS8qIDQqLwoJSUZfUFJPVF9USU1FKCBjYWxpYnJhdGUoIGlmYnAgKTsgKSAJCQkJCQkJCQkJCQkJLyoxMCovCiNpZiAwIC8vIE9PUgoJaWZicC0+SUZCX0ZXSWRlbnRpdHkubGVuID0gMjsJCQkJCQkJLy9taXN1c2UgdGhlIElGQiBzcGFjZSBmb3IgYSBwdXQKCWlmYnAtPklGQl9GV0lkZW50aXR5LnR5cCA9IENGR19USUNLX1RJTUU7CglpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID0gKDEwMDAqMTAwMCkvMTAyNCArIDE7CS8vcm91Z2hseSAxIHNlY29uZAoJaGNmX3B1dF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0ZXSWRlbnRpdHkubGVuICk7CiNlbmRpZiAvLyBPT1IKCWlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiA9IHNpemVvZihDRkdfRldfSURFTlRJVFlfU1RSQ1QpL3NpemVvZihoY2ZfMTYpIC0gMTsKCWlmYnAtPklGQl9GV0lkZW50aXR5LnR5cCA9IENGR19GV19JREVOVElUWTsKCXJjID0gaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0ZXSWRlbnRpdHkubGVuICk7Ci8qIDs/IGNvbnZlcnNpb24gc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yIG1tZF9jaGVja19jb21wICovCiNpZiBIQ0ZfQklHX0VORElBTgoJaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCAgICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKTsKCWlmYnAtPklGQl9GV0lkZW50aXR5LnZhcmlhbnQgICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS52YXJpYW50ICk7CglpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21ham9yID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9tYWpvciApOwoJaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9taW5vciA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWlub3IgKTsKI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCiNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQJCQkJCQkJCQkJCQkJCQkJCQkvKjE0Ki8KCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CQkJCQkJCQkJCQkJCQkJCQkJLyoxNiovCgkJaWZicC0+SUZCX0hTSVN1cC5sZW4gPSBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxOwoJCWlmYnAtPklGQl9IU0lTdXAudHlwID0gQ0ZHX05JQ19IU0lfU1VQX1JBTkdFOwoJCXJjID0gaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0hTSVN1cC5sZW4gKTsKLyogOz8gY29udmVyc2lvbiBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgbW1kX2NoZWNrX2NvbXAgLCBCVVQgYWNjb3JkaW5nIHRvIGEgcmVwb3J0IG9mIGEgQkUtdXNlciBpdCBpcwogKiBzaG91bGQgYmUgcmVzb2x2ZWQgaW4gdGhlIFdBUlAgcmVsZWFzZQogKiBzaW5jZSBzb21lIGNvbXBpbGVycyBtYWtlIHVnbHkgYnV0IHVubmVjZXNzYXJ5IGNvZGUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIGV2ZW4gZm9yIExFLAogKiBpdCBpcyBjb25kaXRpb25hbGx5IGNvbXBpbGVkICovCiNpZiBIQ0ZfQklHX0VORElBTgoJCWlmYnAtPklGQl9IU0lTdXAucm9sZSAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAucm9sZSApOwoJCWlmYnAtPklGQl9IU0lTdXAuaWQgICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAuaWQgKTsKCQlpZmJwLT5JRkJfSFNJU3VwLnZhcmlhbnQgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLnZhcmlhbnQgKTsKCQlpZmJwLT5JRkJfSFNJU3VwLmJvdHRvbSAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLmJvdHRvbSApOwoJCWlmYnAtPklGQl9IU0lTdXAudG9wICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAudG9wICk7CiNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgoJCWlmYnAtPklGQl9GV1N1cC5sZW4gPSBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxOwoJCWlmYnAtPklGQl9GV1N1cC50eXAgPSBDRkdfRldfU1VQX1JBTkdFOwoJCSh2b2lkKWhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9GV1N1cC5sZW4gKTsKLyogOz8gY29udmVyc2lvbiBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgbW1kX2NoZWNrX2NvbXAgKi8KI2lmIEhDRl9CSUdfRU5ESUFOCgkJaWZicC0+SUZCX0ZXU3VwLnJvbGUgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAucm9sZSApOwoJCWlmYnAtPklGQl9GV1N1cC5pZCAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLmlkICk7CgkJaWZicC0+SUZCX0ZXU3VwLnZhcmlhbnQgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAudmFyaWFudCApOwoJCWlmYnAtPklGQl9GV1N1cC5ib3R0b20gID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLmJvdHRvbSApOwoJCWlmYnAtPklGQl9GV1N1cC50b3AgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLnRvcCApOwojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KCgkJaWYgKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9QUkkgKSB7CQkJCQkJCQkJCQkJLyogMjAqLwppbnQgaSA9IHNpemVvZiggQ0ZHX0ZXX0lERU5USVRZX1NUUkNUKSArIHNpemVvZihDRkdfU1VQX1JBTkdFX1NUUkNUICk7CgkJCXdoaWxlICggaS0tICkgKChoY2ZfOCopKCZpZmJwLT5JRkJfUFJJSWRlbnRpdHkpKVtpXSA9ICgoaGNmXzgqKSgmaWZicC0+SUZCX0ZXSWRlbnRpdHkpKVtpXTsKCQkJaWZicC0+SUZCX1BSSUlkZW50aXR5LnR5cCA9IENGR19QUklfSURFTlRJVFk7CgkJCWlmYnAtPklGQl9QUklTdXAudHlwID0gQ0ZHX1BSSV9TVVBfUkFOR0U7CgkJCXh4eHhbeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUXSA9ICZpZmJwLT5JRkJfUFJJSWRlbnRpdHkubGVuOwoJCQl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVCsxXSA9ICZpZmJwLT5JRkJfUFJJU3VwLmxlbjsKCQl9CgkJaWYgKCAhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSwgJmlmYnAtPklGQl9IU0lTdXApCQkJCSAvKiAyMiovCiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCi8vOz8gdGhlIFBSSSBjb21wYXRpYmlsaXR5IGNoZWNrIGlzIG9ubHkgcmVsZXZhbnQgZm9yIERIRgoJCQkgfHwgIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19wcmksICZpZmJwLT5JRkJfUFJJU3VwKQojZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECgkJICAgKSB7CgkJCWlmYnAtPklGQl9DYXJkU3RhdCA9IENBUkRfU1RBVF9JTkNPTVBfUFJJOwoJCQlyYyA9IEhDRl9FUlJfSU5DT01QX1BSSTsKCQl9CgkJaWYgKCAoIGlmYnAtPklGQl9GV1N1cC5pZCA9PSBDT01QX0lEX1NUQSAmJgkhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YSwgJmlmYnAtPklGQl9GV1N1cCkgKSB8fAoJCQkgKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9BUEYgJiYgIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19hcGYsICZpZmJwLT5JRkJfRldTdXApICkKCQkgICApIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiAyNCAqLwoJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0lOQ09NUF9GVzsKCQkJcmMgPSBIQ0ZfRVJSX0lOQ09NUF9GVzsKCQl9Cgl9CiNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lECiNpZiAoSENGX0RMX09OTFkpID09IDAJCQkJCQkJCQkJCQkJCQkJCQkJLyogMjggKi8KCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgJiYgaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA+PSBDT01QX0lEX0ZXX1NUQSApIHsKUFJPVF9DTlRfSU5JCgkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkJKiBybGF2OiB0aGUgRE1BIGVuZ2luZSBuZWVkcyB0aGUgaG9zdCB0byBjYXVzZSBhICdoYW5naW5nIGFsbG9jIGV2ZW50JyBmb3IgaXQgdG8gY29uc3VtZS4KCQkqIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHNwb3QgaW4gdGhlIEhDRiwgdGhpbmtpbmcgYWJvdXQgaGNmX2VuYWJsZS4uLgoJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9BTExPQywgMCApOwovLyAxODAgZGVncmVlIGVycm9yIGluIGxvZ2ljIDs/ICNpZiBBTExPQ18xNQovLwkJaWZicC0+SUZCX1JzY0luZCA9IDE7CS8vbGV0J3MgaG9wZSB0aGF0IGJ5IHRoZSB0aW1lIGhjZl9zZW5kX21zZyBpc2EgY2FsbGVkLCB0aGVyZSB3aWxsIGJlIGEgRklECi8vI2Vsc2UKCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewoJCQlIQ0ZfV0FJVF9XSElMRSggKElQVyggSFJFR19FVl9TVEFUICkgJiBIUkVHX0VWX0FMTE9DKSA9PSAwICk7CgkJCUlGX1BST1RfVElNRSggSENGQVNTRVJUKHByb3RfY250LCBJUFcoIEhSRUdfRVZfU1RBVCApICkgLypOT1AqLzspCiNpZiBIQ0ZfRE1BCgkJCWlmICggISAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApICkKI2VuZGlmIC8vIEhDRl9ETUEKCQkJewoJCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX1JzY0luZCwgMCApCgkJCQljbWRfZXhlKCBpZmJwLCBIQ01EX0FMTE9DLCAwICk7CgkJCQlJRl9QUk9UX1RJTUUoIGlmICggcHJvdF9jbnQgPT0gMCApIHJjID0gSENGX0VSUl9USU1FX09VVDsgKQoJCQl9CgkJfQovLyNlbmRpZiAvLyBBTExPQ18xNQoJfQojZW5kaWYgLy8gSENGX0RMX09OTFkKCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9JTklUICkKCXJldHVybiByYzsKfSAvLyBpbml0CgojaWYgKEhDRl9ETF9PTkxZKSA9PSAwCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJdm9pZCBpc3JfaW5mbyggSUZCUCBpZmJwICkKKi5QVVJQT1NFCQloYW5kbGVzIGxpbmsgZXZlbnRzLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqCioKKi5ESUFHUkFNCioxOglGaXJzdCB0aGUgRklEIG51bWJlciBjb3JyZXNwb25kaW5nIHdpdGggdGhlIEluZm9FdmVudCBpcyBkZXRlcm1pbmVkLgoqCU5vdGUgdGhlIGNvbXBsaWNhdGlvbiBvZiB0aGUgemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuCioJTmV4dCB0aGUgTC1maWVsZCBhbmQgdGhlIFQtZmllbGQgYXJlIGZldGNoZWQgaW50byBzY3JhdGNoIGJ1ZmZlciBpbmZvLgoqMjoJSW4gY2FzZSBvZiB0YWxsaWVzLCB0aGUgMTYgYml0cyBIZXJtZXMgdmFsdWVzIGFyZSBhY2N1bXVsYXRlZCBpbiB0aGUgSUZCIGludG8gMzIgYml0cyB2YWx1ZXMuIEluZm9bMF0KKglpcyAoZXhwZWN0ZWQgdG8gYmUpIEhDRl9OSUNfVEFMX0NOVCArIDEuIFRoZSBjb250cmFwdGlvbiAid2hpbGUgKCBpbmZvWzBdLS0gPjEgKSIgcmF0aGVyIHRoYW4KKgkid2hpbGUgKCAtLWluZm9bMF0gKSIgaXMgdXNlZCBiZWNhdXNlIGl0IGlzIGRhbmdlcm91cyB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgVmFsdWUgZmllbGQgYnkKKglkZWNyZW1lbnRpbmcgaW5mb1swXS4gQXMgYSByZXN1bHQgb2YgYSBidWcgaW4gc29tZSB2ZXJzaW9uIG9mIHRoZSBGL1csIGluZm9bMF0gbWF5IGJlIDAsIHJlc3VsdGluZwoqCWluIGEgdmVyeSBsb25nIGxvb3AgaW4gdGhlIHByZS1kZWNyZW1lbnQgbG9naWMuCio0OglJbiBjYXNlIG9mIGEgbGluayBzdGF0dXMgZnJhbWUsIHRoZSBpbmZvcm1hdGlvbiBpcyBjb3BpZWQgdG8gdGhlIElGQiBmaWVsZCBJRkJfbGlua1N0YXQKKjY6CUFsbCBvdGhlciB0aGFuIFRhbGxpZXMgKGluY2x1ZGluZyAidW5rbm93biIgb25lcykgYXJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgc2VsZWN0aW9uIHNldCBieSB0aGUgTVNGCioJdmlhIENGR19SSURfTE9HLiBJZiBhIG1hdGNoIGlzIGZvdW5kIG9yIHRoZSBzZWxlY3Rpb24gc2V0IGhhcyB0aGUgd2lsZC1jYXJkIHR5cGUgKGkuZSBub24tTlVMTCBidWZmZXIKKglwb2ludGVyIGF0IHRoZSB0ZXJtaW5hdGluZyB6ZXJvLXR5cGUpLCB0aGUgZnJhbWUgaXMgY29waWVkIHRvIHRoZSAodHlwZS1zcGVjaWZpYykgbG9nIGJ1ZmZlci4KKglOb3RlIHRoYXQgdG8gYWNjdW11bGF0ZSB0YWxsaWVzIGludG8gSUZCIEFORCB0byBsb2cgdGhlbSBvciB0byBsb2cgYSBmcmFtZSB3aGVuIGEgc3BlY2lmaWMgbWF0Y2ggb2NjdXJlcwoqCUFORCBiYXNlZCBvbiB0aGUgd2lsZC1jYXJkIHNlbGVjdGlvbiwgeW91IGhhdmUgdG8gY2FsbCBzZXR1cF9iYXAgYWdhaW4gYWZ0ZXIgdGhlIDFzdCBjb3B5LgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIHZvaWQKaXNyX2luZm8oIElGQlAgaWZicCApCnsKaGNmXzE2CWluZm9bMl0sIGZpZDsKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKUklEX0xPR1AJcmlkcCA9IGlmYnAtPklGQl9SSURMb2dwOwkvL05VTEwgb3IgcG9pbnRlciB0byBhcnJheSBvZiBSSURfTE9HIHN0cnVjdHVyZXMgKHRlcm1pbmF0ZWQgYnkgemVybyB0eXApCiNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCgoJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9JU1JfSU5GTyApOwkJCQkJCQkJCQkJCQkJCQkvKiAxICovCglmaWQgPSBJUFcoIEhSRUdfSU5GT19GSUQgKTsKCURBV0FfWkVST19GSUQoIEhSRUdfSU5GT19GSUQgKQoJaWYgKCBmaWQgKSB7CgkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIDAsIElPX0lOICk7CgkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcClpbmZvLCA0IEJFX1BBUigyKSApOwoJCUhDRkFTU0VSVCggaW5mb1swXSA8PSBIQ0ZfTUFYX0xUViArIDEsIE1FUkdFXzIoIGluZm9bMV0sIGluZm9bMF0gKSApICAvLzs/IGEgc21hbGxlciB2YWx1ZSBtYWtlcyBtb3JlIHNlbnNlCiNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfTklDCQkvL0hlcm1lcyB0YWxseSBzdXBwb3J0CgkJaWYgKCBpbmZvWzFdID09IENGR19UQUxMSUVTICkgewpoY2ZfMzIJKnA7Ci8qMiovCQlpZiAoIGluZm9bMF0gPiBIQ0ZfTklDX1RBTF9DTlQgKSB7CgkJCQlpbmZvWzBdID0gSENGX05JQ19UQUxfQ05UICsgMTsKCQkJfQoJCQlwID0gKGhjZl8zMiopJmlmYnAtPklGQl9OSUNfVGFsbGllczsKCQkJd2hpbGUgKCBpbmZvWzBdLS0gPjEgKSAqcCsrICs9IElQVyggSFJFR19EQVRBXzEgKTsJLy9yZXF1ZXN0IG1heSByZXR1cm4gemVybyBsZW5ndGgKCQl9CgkJZWxzZQojZW5kaWYgLy8gSENGX1RBTExJRVNfTklDCgkJewovKjQqLwkJaWYgKCBpbmZvWzFdID09IENGR19MSU5LX1NUQVQgKSB7CgkJCQlpZmJwLT5JRkJfTGlua1N0YXQgPSBJUFcoIEhSRUdfREFUQV8xICk7CgkJCX0KI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKLyo2Ki8JCXdoaWxlICggMSApIHsKCQkJCWlmICggcmlkcC0+dHlwID09IDAgfHwgcmlkcC0+dHlwID09IGluZm9bMV0gKSB7CgkJCQkJaWYgKCByaWRwLT5idWZwICkgewoJCQkJCQlIQ0ZBU1NFUlQoIHJpZHAtPmxlbiA+PSAyLCByaWRwLT50eXAgKQoJCQkJCQlyaWRwLT5idWZwWzBdID0gbWluKChoY2ZfMTYpKHJpZHAtPmxlbiAtIDEpLCBpbmZvWzBdICk7IAkvL3NhdmUgTAoJCQkJCQlyaWRwLT5idWZwWzFdID0gaW5mb1sxXTsJCQkJCQkvL3NhdmUgVAoJCQkJCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZyaWRwLT5idWZwWzJdLCAocmlkcC0+YnVmcFswXSAtIDEpKjIgQkVfUEFSKDApICk7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJcmlkcCsrOwoJCQl9CiNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCgkJfQoJCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfSVNSX0lORk8gfCBIQ0ZfVFJBQ0VfRVhJVCApOwoJfQoJcmV0dXJuOwp9IC8vIGlzcl9pbmZvCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKLy8KLy8KLy8gI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQwovLyAvKjQqLwlpZiAoIGluZm9bMV0gPT0gQ0ZHX0xJTktfU1RBVCApIHsKLy8gCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgPSBJUFcoIEhSRUdfREFUQV8xICkgfCBDRkdfTElOS19TVEFUX0NIQU5HRTsJLy9jb3JydXB0cyBCQVAgISEgOz8KLy8gCQkJaWZicC0+SUZCX0xpbmtTdGF0ID0gaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0ZXOyAvLzs/IHRvIGJlIG9ic29sZXRlZAovLyAJCQlwcmludGsoICI8ND5saW5rc3RhdHVzOiAlMDR4XG4iLCBpZmJwLT5JRkJfRFNMaW5rU3RhdCApOwkJLy87P3JlbW92ZSBtZSAxIGRheQovLyAjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCi8vIAkJCWlmICggKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfQ09OTkVDVEVEICkgPT0gMCApIHsgCS8vZXZlbiB2YWx1ZXMgYXJlIGRpc2Nvbm5lY3RlZCBldGMuCi8vIAkJCQlpZmJwLT5JRkJfVGlja0NudCA9IDA7CQkJCS8vc3RhcnQgMiBzZWNvbmQgcGVyaW9kICh3aXRoIDEgdGljayB1bmNlcnRhbnR5KQovLyAJCQkJcHJpbnRrKCAiPDU+aXNyX2luZm86IEF3YWl0Q29ubmVjdGlvbiBwaGFzZSBzdGFydGVkLCBJRkJfVGlja0NudCA9IDBcbiIgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKLy8gCQkJfQovLyAjZW5kaWYgLy8gSENGX0REUwovLyAJCX0KLy8gI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKLy8gLyo2Ki8Jd2hpbGUgKCAxICkgewovLyAJCQlpZiAoIHJpZHAtPnR5cCA9PSAwIHx8IHJpZHAtPnR5cCA9PSBpbmZvWzFdICkgewovLyAJCQkJaWYgKCByaWRwLT5idWZwICkgewovLyAJCQkJCUhDRkFTU0VSVCggcmlkcC0+bGVuID49IDIsIHJpZHAtPnR5cCApCi8vIAkJCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIDIsIElPX0lOICk7CQkJLy9yZXN0b3JlIEJBUCBmb3IgdGFsbGllcywgbGlua3N0YXQgYW5kIHNwZWNpZmljIHR5cGUgZm9sbG93ZWQgYnkgd2lsZCBjYXJkCi8vIAkJCQkJcmlkcC0+YnVmcFswXSA9IG1pbiggcmlkcC0+bGVuIC0gMSwgaW5mb1swXSApOyAJLy9zYXZlIEwKLy8gCQkJCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZyaWRwLT5idWZwWzFdLCByaWRwLT5idWZwWzBdKjIgQkVfUEFSKDApICk7Ci8vIAkJCQl9Ci8vIAkJCQlicmVhazsgLy87P3RoaXMgYnJlYWsgaXMgbm8gbG9uZ2VyIG5lZWRlZCBkdWUgdG8gc2V0dXBfYmFwIGJ1dCBsZXRzIGNvbmNlbnRyYXRlIG9uIEREUyBmaXJzdAovLyAJCQl9Ci8vIAkJCXJpZHArKzsKLy8gCQl9Ci8vICNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCi8vIAl9Ci8vIAlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0lTUl9JTkZPIHwgSENGX1RSQUNFX0VYSVQgKTsKLy8KLy8KLy8KLy8KLy8JcmV0dXJuOwovL30gLy8gaXNyX2luZm8KLy8jZW5kaWYgLy8gSENGX0RMX09OTFkKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgbWRkX2Fzc2VydCggSUZCUCBpZmJwLCB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXIsIGhjZl8zMiBxICkKKi5QVVJQT1NFCQlmaWx0ZXJzIGFzc2VydCBvbiBsZXZlbCBhbmQgaW50ZXJmYWNlcyB0byB0aGUgTVNGIHN1cHBsaWVkIG1zZl9hc3NlcnQgcm91dGluZS4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWxpbmVfbnVtYmVyCWxpbmUgbnVtYmVyIG9mIHRoZSBsaW5lIHdoaWNoIGNhdXNlZCB0aGUgYXNzZXJ0CioJcQkJCXF1YWxpZmllciwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aGljaCBtYXkgZ2l2ZSBhIGNsdWUgYWJvdXQgdGhlIHByb2JsZW0KKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCioKKgoqLkRJQUdSQU0KKgoqLk5PVElDRQoqIG1kZF9hc3NlcnQgaGFzIGJlZW4gdGhyb3VnaCBhIHR1cm1vaWwsIHJlbmFtaW5nIGhjZl9hc3NlcnQgdG8gYXNzZXJ0IGFuZCBoY2ZfYXNzZXJ0IGFnYWluIGFuZCBzdXBwb3J0aW5nIG9mZgoqIGFuZCBvbiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgTVNGIGxldmVsIGFuZCBvdGhlciAoIGltbWF0dXJlICkgTW9kdWxhckRyaXZlckRldmVsb3BtZW50IG1vZHVsZXMgbGlrZSBESEYgYW5kCiogTU1ELgogKiAhISEhIFRoZSBhc3NlcnQgcm91dGluZSBpcyBub3QgYW4gaGNmXy4uLi4uIHJvdXRpbmUgaW4gdGhlIHNlbnNlIHRoYXQgaXQgbWF5IGJlIGNhbGxlZCBieSB0aGUgTVNGLAogKgkJaG93ZXZlciBpdCBpcyBjYWxsZWQgZnJvbSBtbWQuYyBhbmQgZGhmLmMsIHNvIGl0IG11c3QgYmUgZXh0ZXJuYWwuCiAqCQlUbyBwcmV2ZW50IG5hbWVzcGFjZSBwb2xsdXRpb24gaXQgbmVlZHMgYSBwcmVmaXgsIHRvIHByZXZlbnQgdGhhdCBNU0YgcHJvZ3JhbW1lcnMgdGhpbmsgdGhhdAogKgkJdGhleSBhcmUgYWxsb3dlZCB0byBjYWxsIHRoZSBhc3NlcnQgbG9naWMsIHRoZSBwcmVmaXggSENGIGNhbid0IGJlIHVzZWQsIHNvIE1ERCBpcyBzZWxlY3RlZCEhISEKICoKKiBXaGVuIGNhbGxlZCBmcm9tIHRoZSBESEYgbW9kdWxlIHRoZSBsaW5lIG51bWJlciBpcyBpbmNyZW1lbnRlZCBieSBESEZfRklMRV9OQU1FX09GRlNFVCBhbmQgd2hlbiBjYWxsZWQgZnJvbQoqIHRoZSBNTUQgbW9kdWxlIGJ5IE1NRF9GSUxFX05BTUVfT0ZGU0VULgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWYgSENGX0FTU0VSVAp2b2lkCm1kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCnsKaGNmXzE2CXJ1bl90aW1lX2ZsYWcgPSBpZmJwLT5JRkJfQXNzZXJ0THZsOwoKCWlmICggcnVuX3RpbWVfZmxhZyAvKiA+IDs/Pz8/Pz8gKi8gKSB7IC8vcHJldmVudCByZWN1cnNpdmUgYmVoYXZpb3IsIGxhdGVyIHRvIGJlIGV4dGVuZGVkIHRvIGxldmVsIGZpbHRlcmluZwoJCWlmYnAtPklGQl9Bc3NlcnRRdWFsaWZpZXIgPSBxOwoJCWlmYnAtPklGQl9Bc3NlcnRMaW5lID0gKGhjZl8xNilsaW5lX251bWJlcjsKI2lmIChIQ0ZfQVNTRVJUKSAmICggSENGX0FTU0VSVF9MTktfTVNGX1JUTiB8IEhDRl9BU1NFUlRfUlRfTVNGX1JUTiApCgkJaWYgKCBpZmJwLT5JRkJfQXNzZXJ0UnRuICkgewoJCQlpZmJwLT5JRkJfQXNzZXJ0UnRuKCBsaW5lX251bWJlciwgaWZicC0+SUZCX0Fzc2VydFRyYWNlLCBxICk7CgkJfQojZW5kaWYgLy8gSENGX0FTU0VSVF9MTktfTVNGX1JUTiAvIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9TV19TVVAKCQlPUFcoIEhSRUdfU1dfMiwgbGluZV9udW1iZXIgKTsKCQlPUFcoIEhSRUdfU1dfMiwgaWZicC0+SUZCX0Fzc2VydFRyYWNlICk7CgkJT1BXKCBIUkVHX1NXXzIsIChoY2ZfMTYpcSApOwoJCU9QVyggSFJFR19TV18yLCAoaGNmXzE2KShxID4+IDE2ICkgKTsKI2VuZGlmIC8vIEhDRl9BU1NFUlRfU1dfU1VQCgojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQiAmJiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX01CCgkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IDA7CQkJCQkJCQkJLy8gcHJldmVudCByZWN1cnNpdmUgYmVoYXZpb3IKCQloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfQXNzZXJ0U3RyY3QgKTsKCQlpZmJwLT5JRkJfQXNzZXJ0THZsID0gcnVuX3RpbWVfZmxhZzsJCQkJCQkvLyByZXN0b3JlIGFwcHJvcHJpYXRlIGZpbHRlciBsZXZlbAojZW5kaWYgLy8gSENGX0VYVF9NQiAvIEhDRl9BU1NFUlRfTUIKCX0KfSAvLyBtZGRfYXNzZXJ0CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQl2b2lkIHB1dF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCiouUFVSUE9TRQkJd3JpdGVzIHdpdGggMTYvMzIgYml0IEkvTyB2aWEgQkFQMSBwb3J0IGZyb20gSG9zdCBtZW1vcnkgdG8gTklDIFJBTS4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWJ1ZnAJCShieXRlKSBhZGRyZXNzIG9mIGJ1ZmZlcgoqCWxlbgkJCWxlbmd0aCBpbiBieXRlcyBvZiBidWZmZXIgc3BlY2lmaWVkIGJ5IGJ1ZnAKKgl3b3JkX2xlbglCaWcgRW5kaWFuIG9ubHk6IG51bWJlciBvZiBsZWFkaW5nIGJ5dGVzIHRvIHN3YXAgaW4gcGFpcnMKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogcHJvY2VzcyB0aGUgc2luZ2xlIGJ5dGUgKGlmIGFwcGxpY2FibGUpIG5vdCB5ZXQgd3JpdHRlbiBieSB0aGUgcHJldmlvdXMgcHV0X2ZyYWcgYW5kIGNvcHkgbGVuCiogKG9yIGxlbi0xKSBieXRlcyBmcm9tIGJ1ZnAgdG8gTklDLgoqCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKglJdCB0dXJucyBvdXQgRE9TIE9ESSB1c2VzIHplcm8gbGVuZ3RoIGZyYWdtZW50cy4gVGhlIEhDRiBjb2RlIGNhbiBjb3BlIHdpdGggaXQsIGJ1dCBhcyBhIGNvbnNlcXVlbmNlLCBubwoqCUFzc2VydCBvbiBsZW4gaXMgcG9zc2libGUKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCnB1dF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCnsKaGNmX2lvCQlpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZSArIEhSRUdfREFUQV8xOwkvL0JBUCBkYXRhIHJlZ2lzdGVyCmludAkJCWk7CQkJCQkJCQkJCQkvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KaGNmXzE2CQlqOwoJSENGQVNTRVJUKCAoKGhjZl8zMilidWZwICYgKEhDRl9BTElHTi0xKSApID09IDAsIChoY2ZfMzIpYnVmcCApCiNpZiBIQ0ZfQklHX0VORElBTgoJSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8IHdvcmRfbGVuID09IDIgfHwgd29yZF9sZW4gPT0gNCwgd29yZF9sZW4gKQoJSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8ICgoaGNmXzMyKWJ1ZnAgJiAxICkgPT0gMCwgKGhjZl8zMilidWZwICkKCUhDRkFTU0VSVCggd29yZF9sZW4gPD0gbGVuLCBNRVJHRV8yKCB3b3JkX2xlbiwgbGVuICkgKQoKCWlmICggd29yZF9sZW4gKSB7CQkJCQkJCQkJLy9pZiB0aGVyZSBpcyBhbnl0aGluZyB0byBjb252ZXJ0CiAJCQkJCQkJCQkJCQkJCS8vLiAgY29udmVydCBhbmQgd3JpdGUgdGhlIDFzdCBoY2ZfMTYKCQlqID0gYnVmcFsxXSB8IGJ1ZnBbMF08PDg7CgkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOwoJCQkJCQkJCQkJCQkJCS8vLiAgdXBkYXRlIHBvaW50ZXIgYW5kIGNvdW50ZXIgYWNjb3JkaW5nbHkKCQlsZW4gLT0gMjsKCQlidWZwICs9IDI7CgkJaWYgKCB3b3JkX2xlbiA+IDEgKSB7CQkJCQkJCS8vLiAgaWYgdGhlcmUgaXMgdG8gY29udmVydCBtb3JlIHRoYW4gMSB3b3JkICggaS5lIDIgKQogCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvbnZlcnQgYW5kIHdyaXRlIHRoZSAybmQgaGNmXzE2CgkJCWogPSBidWZwWzFdIHwgYnVmcFswXTw8ODsJLypidWZwIGlzIGFscmVhZHkgaW5jcmVtZW50ZWQgYnkgMiovCgkJCU9VVF9QT1JUX1dPUkQoIGlvX3BvcnQsIGogKTsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIHVwZGF0ZSBwb2ludGVyIGFuZCBjb3VudGVyIGFjY29yZGluZ2x5CgkJCWxlbiAtPSAyOwoJCQlidWZwICs9IDI7CgkJfQoJfQojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KCWkgPSBsZW47CglpZiAoIGkgJiYgaWZicC0+SUZCX0NhcnJ5T3V0ICkgewkJCQkJLy9za2lwIHplcm8tbGVuZ3RoCgkJaiA9ICgoKmJ1ZnApPDw4KSArICggaWZicC0+SUZCX0NhcnJ5T3V0ICYgMHhGRiApOwoJCU9VVF9QT1JUX1dPUkQoIGlvX3BvcnQsIGogKTsKCQlidWZwKys7IGktLTsKCQlpZmJwLT5JRkJfQ2FycnlPdXQgPSAwOwoJfQojaWYgKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTCgkvL3NraXAgemVyby1sZW5ndGggSS9PLCBzaW5nbGUgYnl0ZSBJL08gYW5kIEkvTyBub3Qgd29ydGh3aGlsZSAoaS5lLiBsZXNzIHRoYW4gNiBieXRlcylmb3IgRFcgbG9naWMKCQkJCQkJCQkJCQkJCS8vaWYgYnVmZmVyIGxlbmd0aCA+PSA2IGFuZCAzMiBiaXRzIEkvTyBzdXBwb3J0CglpZiAoICEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfMTZCSVQpICYmIGkgPj0gNiApIHsKaGNmXzMyIEZBUgkqcDQ7IC8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybwoJCWlmICggKCAoaGNmXzMyKWJ1ZnAgJiAweDEgKSA9PSAwICkgewkJCS8vLiAgaWYgYnVmZmVyIGF0IGxlYXN0IHdvcmQgYWxpZ25lZAoJCQlpZiAoIChoY2ZfMzIpYnVmcCAmIDB4MiApIHsJCQkJLy8uICAuICBpZiBidWZmZXIgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvLy4gIC4gIC4gIHdyaXRlIGEgc2luZ2xlIHdvcmQgdG8gZ2V0IGRvdWJsZSB3b3JkIGFsaWduZWQKCQkJCWogPSAqKHdjaV9yZWNvcmRwKWJ1ZnA7CQkvL2p1c3QgdG8gaGVscCBlYXNlIHdyaXRpbmcgbWFjcm9zIHdpdGggZW1iZWRkZWQgYXNzZW1ibHkKCQkJCU9VVF9QT1JUX1dPUkQoIGlvX3BvcnQsIGogKTsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKCQkJCWJ1ZnAgKz0gMjsgaSAtPSAyOwoJCQl9CgkJCQkJCQkJCQkJCQkvLy4gIC4gIHdyaXRlIGFzIG1hbnkgZG91YmxlIHdvcmQgYXMgcG9zc2libGUKCQkJcDQgPSAoaGNmXzMyIEZBUiAqKWJ1ZnA7CgkJCWogPSAoaGNmXzE2KWkvNDsKCQkJT1VUX1BPUlRfU1RSSU5HXzMyKCBpb19wb3J0LCBwNCwgaiApOwoJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQoJCQlidWZwICs9IGkgJiB+MHgwMDAzOwoJCQlpICY9IDB4MDAwMzsKCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfSU9fMzJCSVRTCgkJCQkJCQkJCQkJCQkvL2lmIG5vIDMyLWJpdCBzdXBwb3J0IE9SIGJ5dGUgYWxpZ25lZCBPUiAxIHdvcmQgbGVmdAoJaWYgKCBpICkgewoJCQkJCQkJCQkJCQkJLy8uICBpZiBvZGQgbnVtYmVyIG9mIGJ5dGVzIGxlZnQKCQlpZiAoIGkgJiAweDAwMDEgKSB7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIHNhdmUgbGVmdCBvdmVyIGJ5dGUgKGJlZm9yZSBidWZwIGlzIGNvcnJ1cHRlZCkgaW4gY2FycnksIHNldCBjYXJyeSBmbGFnCgkJCWlmYnAtPklGQl9DYXJyeU91dCA9IChoY2ZfMTYpYnVmcFtpLTFdIHwgMHgwMTAwOwkvL25vdGUgdGhhdCBpIGFuZCBidWZwIGFyZSBhbHdheXMgc2ltdWx0YW5lb3VzbHkgbW9kaWZpZWQsICZidWZwW2ktMV0gaXMgaW52YXJpYW50CgkJfQoJCQkJCQkJCQkJCQkJLy8uICB3cml0ZSBhcyBtYW55IHdvcmQgYXMgcG9zc2libGUgaW4gImFsaWdubWVudCBzYWZlIiB3YXkKCQlqID0gKGhjZl8xNilpLzI7CgkJT1VUX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIGJ1ZnAsIGogKTsKCX0KfSAvLyBwdXRfZnJhZwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJdm9pZCBwdXRfZnJhZ19maW5hbGl6ZSggSUZCUCBpZmJwICkKKi5QVVJQT1NFCQljbGVhbnVwIGFmdGVyIHB1dF9mcmFnIGZvciB0cmFpbGluZyBvZGQgYnl0ZSBhbmQgTUlDIHRyYW5zZmVyIHRvIE5JQy4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKiBmaW5hbGl6ZSB0aGUgTUlDIGNhbGN1bGF0aW9uIHdpdGggdGhlIHBhZGRpbmcgcGF0dGVybiwgb3V0cHV0IHRoZSBsYXN0IGJ5dGUgKGlmIGFwcGxpY2FibGUpCiogb2YgdGhlIG1lc3NhZ2UgYW5kIHRoZSBNSUMgdG8gdGhlIFR4RlMKKgoqCiouRElBR1JBTQoqMjoJMSBieXRlIG9mIHRoZSBsYXN0IHB1dF9mcmFnIG1heSBiZSBzdGlsbCBpbiBJRkJfQ2FycnlPdXQgKCB0aGUgcHV0X2ZyYWcgY2FycnkgaG9sZGVyICksIHNvIC4uLi4uLi4uCioJMSAtIDMgYnl0ZXMgb2YgdGhlIGxhc3QgcHV0X2ZyYWcgbWF5IGJlIHN0aWxsIGluIElGQl90eF8zMiAoIHRoZSBNSUMgZW5naW5lIGNhcnJ5IGhvbGRlciApLCBzbyAuLi4uLi4uLgoqCVRoZSBjYWxsIHRvIHRoZSBNSUMgY2FsY3VsYXRpb24gcm91dGluZSBmZWVkcyB0aGVzZSByZW1haW5pbmcgYnl0ZXMgKGlmIGFueSkgb2YgcHV0X2ZyYWcgYW5kIHRoZQoqCWp1c3QgYXMgbWFueSBieXRlcyBvZiB0aGUgcGFkZGluZyBhcyBuZWVkZWQgdG8gdGhlIE1JQyBjYWxjdWxhdGlvbiBlbmdpbmUuIE5vdGUgdGhhdCB0aGUgInVubmVlZGVkIiBwYWQKKglieXRlcyBzaW1wbHkgZW5kIHVwIGluIHRoZSBNSUMgZW5naW5lIGNhcnJ5IGhvbGRlciBhbmQgYXJlIG5ldmVyIHVzZWQuCio4Ogl3cml0ZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBNSUMgYW5kIHBvc3NpYmxlIHNvbWUgZ2FyYmFnZSB0byBOSUMgUkFNCioJTm90ZTogaSBpcyBhbHdheXMgNCAoYSBsb29wLWludmFyaWFudCBvZiB0aGUgd2hpbGUgaW4gcG9pbnQgMikKKgoqLk5PVElDRQoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIHZvaWQKcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApCnsKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKCWlmICggaWZicC0+SUZCX01JQ1R4Q2FycnkgIT0gMHhGRkZGKSB7CQkvL2lmIE1JQyBjYWxjdWxhdGlvbiBhY3RpdmUKCQlDQUxDX1RYX01JQyggbWljX3BhZCwgOCk7CQkJCS8vLiAgZmVlZCAodXAgdG8gOCBieXRlcyBvZikgdmlydHVhbCBwYWRkaW5nIHRvIE1JQyBlbmdpbmUKCQkJCQkJCQkJCQkJLy8uICB3cml0ZSAocG9zc2libHkpIHRyYWlsaW5nIGJ5dGUgKyAobW9zdCBvZikgTUlDCgkJcHV0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcClpZmJwLT5JRkJfTUlDVHgsIDggQkVfUEFSKDApICk7Cgl9CiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCXB1dF9mcmFnKCBpZmJwLCBudWxsX2FkZHIsIDEgQkVfUEFSKDApICk7CS8vd3JpdGUgKHBvc3NpYmx5KSB0cmFpbGluZyBkYXRhIG9yIE1JQyBieXRlCn0gLy8gcHV0X2ZyYWdfZmluYWxpemUKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCWludCBwdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKQoqLlBVUlBPU0UJCXN1cHBvcnQgcm91dGluZSB0byBoYW5kbGUgdGhlICJiYXNpYyIgdGFzayBvZiBoY2ZfcHV0X2luZm8gdG8gcGFzcyBSSURzIHRvIHRoZSBOSUMuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglsdHZwCQlhZGRyZXNzIGluIE5JQyBSQU0gd2hlcmUgTFZULXJlY29yZHMgYXJlIGxvY2F0ZWQKKgoqLlJFVFVSTlMKKglIQ0ZfU1VDQ0VTUwoqCT4+cHV0X2ZyYWcKKgk+PmNtZF93YWl0CioKKi5ERVNDUklQVElPTgoqCioKKi5ESUFHUkFNCioyMDogZG8gbm90IHdyaXRlIFJJRHMgdG8gTklDcyB3aGljaCBoYXZlIGluY29tcGF0aWJsZSBGaXJtd2FyZQoqMjQ6IElmIHRoZSBSSUQgZG9lcyBub3QgZXhpc3QsIHRoZSBMLWZpZWxkIGlzIHNldCB0byB6ZXJvLgoqCU5vdGUgdGhhdCBzb21lIFJJRHMgY2FuIG5vdCBiZSByZWFkLCBlLmcuIHRoZSBwc2V1ZG8gUklEcyBmb3IgZGlyZWN0IEhlcm1lcyBjb21tYW5kcyBhbmQgQ0ZHX0RFRkFVTFRfS0VZUwoqMjg6IElmIHRoZSBSSUQgaXMgd3JpdHRlbiBzdWNjZXNzZnVsLCBwYXNzIGl0IHRvIHRoZSBOSUMgYnkgbWVhbnMgb2YgYW4gQWNjZXNzIFdyaXRlIGNvbW1hbmQKKgoqLk5PVElDRQoqCVRoZSBtZWNoYW5pc20gdG8gSENGX0FTU0VSVCBvbiBpbnZhbGlkIHR5cC1jb2RlcyBpbiB0aGUgTFRWIHJlY29yZCBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5OgoqCSAgLQlzb21lIGNvZGVzIChlLmcuIENGR19SRUdfTUIpIGFyZSBleHBsaWNpdGx5IGhhbmRsZWQgYnkgdGhlIEhDRiB3aGljaCBpbXBsaWVzIHRoYXQgdGhlc2UgY29kZXMKKgkJYXJlIHZhbGlkLiBUaGVzZSBjb2RlcyBhcmUgYWxyZWFkeSBjb25zdW1lZCBieSBoY2ZfcHV0X2luZm8uCioJICAtIGFsbCBvdGhlciBjb2RlcyBhcmUgcGFzc2VkIHRvIHRoZSBIZXJtZXMuIEJlZm9yZSB0aGUgcHV0IGFjdGlvbiBpcyBleGVjdXRlZCwgaGNmX2dldF9pbmZvIGlzIGNhbGxlZAoqCQl3aXRoIGFuIExUViByZWNvcmQgd2l0aCBhIHZhbHVlIG9mIDEgaW4JdGhlIEwtZmllbGQgYW5kIHRoZSBpbnRlbmRlZCBwdXQgYWN0aW9uIHR5cGUgaW4gdGhlIFR5cC1jb2RlCioJCWZpZWxkLiBJZiB0aGUgcHV0IGFjdGlvbiB0eXBlIGlzIHZhbGlkLCBpdCBpcyBhbHNvIHZhbGlkIGFzIGEgZ2V0IGFjdGlvbiB0eXBlIGNvZGUgLSBleGNlcHQKKgkJZm9yIENGR19ERUZBVUxUX0tFWVMgYW5kIENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSAtIHNvIHRoZSBIQ0ZfQVNTRVJUIGxvZ2ljIG9mIGhjZl9nZXRfaW5mbyBzaG91bGQKKgkJbm90IGNhdGNoLgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGludApwdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAJKQp7CgppbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwLCBNRVJHRV8yKCBsdHZwLT50eXAsIGlmYnAtPklGQl9DYXJkU3RhdCApICkKCUhDRkFTU0VSVCggQ0ZHX1JJRF9DRkdfTUlOIDw9IGx0dnAtPnR5cCAmJiBsdHZwLT50eXAgPD0gQ0ZHX1JJRF9DRkdfTUFYLCBsdHZwLT50eXAgKQoKCWlmICggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgJiYJCQkJCQkJCQkJCQkJCQkJLyogMjAqLwoJCSAoICggQ0ZHX1JJRF9DRkdfTUlOIDw9IGx0dnAtPnR5cCAgICAmJiBsdHZwLT50eXAgPD0gQ0ZHX1JJRF9DRkdfTUFYICkgfHwKCQkgICAoIENGR19SSURfRU5HX01JTiA8PSBsdHZwLT50eXAgLyogJiYgbHR2cC0+dHlwIDw9IDB4RkZGRiAqLyAgICAgICApICAgICApICkgewojaWYgSENGX0FTU0VSVCAvL0ZDQzgsIEZDQjAsIEZDQjQsIEZDQjYsIEZDQjcsIEZDQjgsIEZDQzAsIEZDQzQsIEZDQkMsIEZDQkQsIEZDQkUsIEZDQkYKIHsKIGhjZl8xNgkJdCA9IGx0dnAtPnR5cDsKIExUVl9TVFJDVCAJeCA9IHsgMiwgdCwgezB9IH07CQkJCQkJCQkJCQkJCQkJLyoyNCovCgloY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZ4ICk7CglpZiAoIHgubGVuID09IDAgJiYKCQkgKCB0ICE9IENGR19ERUZBVUxUX0tFWVMgJiYgdCAhPSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgJiYgdCAhPSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVkgJiYKCQkgICB0ICE9IENGR19BRERfVEtJUF9NQVBQRURfS0VZICYmIHQgIT0gQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVkgJiYKCQkgICB0ICE9IENGR19IQU5ET1ZFUl9BRERSICYmIHQgIT0gQ0ZHX0RJU0FTU09DSUFURV9BRERSICYmCgkJICAgdCAhPSBDRkdfRkNCQyAmJiB0ICE9IENGR19GQ0JEICYmIHQgIT0gQ0ZHX0ZDQkUgJiYgdCAhPSBDRkdfRkNCRiAmJgoJCSAgIHQgIT0gQ0ZHX0RFQVVUSEVOVElDQVRFX0FERFIKCQkgKQoJCSkgewoJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBsdHZwLT50eXAgKQoJCX0KIH0KI2VuZGlmIC8vIEhDRl9BU1NFUlQKCgkJcmMgPSBzZXR1cF9iYXAoIGlmYnAsIGx0dnAtPnR5cCwgMCwgSU9fT1VUICk7CgkJcHV0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcClsdHZwLCAyKmx0dnAtPmxlbiArIDIgQkVfUEFSKDIpICk7Ci8qMjgqLwlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewoJCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQUNDRVNTICsgSENNRF9BQ0NFU1NfV1JJVEUsIGx0dnAtPnR5cCApOwoJCX0KCX0KCXJldHVybiByYzsKfSAvLyBwdXRfaW5mbwoKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQlpbnQgcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApCiouUFVSUE9TRQkgCWFjY3VtdWxhdGVzIGEgKCBzZXJpZXMgb2YpIGJ1ZmZlcnMgaW50byBhIHNpbmdsZSBJbmZvIGJsb2NrIGludG8gdGhlIE1haWxCb3guCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglsdHZwCQlhZGRyZXNzIG9mIHN0cnVjdHVyZSBzcGVjaWZ5aW5nIHRoZSAidHlwZSIgYW5kIHRoZSBmcmFnbWVudHMgb2YgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHN5bnRoZXNpemVkCioJCQkJYXMgYW4gTFRWIGludG8gdGhlIE1haWxCb3gKKgoqLlJFVFVSTlMKKgoqLkRFU0NSSVBUSU9OCiogSWYgdGhlIGRhdGEgZG9lcyBub3QgZml0IChpbmNsdWRpbmcgbm8gTWFpbEJveCBpcyBhdmFpbGFibGUpLCB0aGUgSUZCX01CVGFsbHkgaXMgaW5jcmVtZW50ZWQgYW5kIGFuCiogZXJyb3Igc3RhdHVzIGlzIHJldHVybmVkLgoqIEhDRl9BU1NFUlQgZG9lcyBub3QgY2F0Y2guCiogQ2FsbGluZyBwdXRfaW5mb19tYiB3aGVuIHRoZWlyIGlzIG5vIE1haWxCb3ggYXZhaWxhYmxlLCBpcyBjb25zaWRlcmVkIGEgZGVzaWduIGVycm9yIGluIHRoZSBNU0YuCioKKiBOb3RlIHRoYXQgdGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IDEgd29yZCBvZiB1bnVzZWQgc3BhY2UgaW4gdGhlIG1haWwgYm94LgoqIEFzIGEgY29uc2VxdWVuY2U6CiogLSBubyBwcm9ibGVtIGluIHBvaW50ZXIgYXJpdGhtZXRpYyAoTUJfUlAgPT0gTUJfV1AgbWVhbnMgdW5hbWJpZ3VvdXNseSBtYWlsIGJveCBpcyBjb21wbGV0ZWx5IGVtcHR5CiogLSBUaGVyZSBpcyBhbHdheXMgZnJlZSBzcGFjZSB0byB3cml0ZSBhbiBMIGZpZWxkIHdpdGggYSB2YWx1ZSBvZiB6ZXJvIGFmdGVyIGVhY2ggTUJfSW5mbyBibG9jay4gIFRoaXMKKiAgIGFsbG93cyBmb3IgYW4gZWFzeSBzY2FuIG1lY2hhbmlzbSBpbiB0aGUgImdldCBNQl9JbmZvIGJsb2NrIiBsb2dpYy4KKgoqCiouRElBR1JBTQoqMToJQ2FsY3VsYXRlIEwgZmllbGQgb2YgdGhlIE1CSUIsIGkuZS4gMSBmb3IgdGhlIFQtZmllbGQgKyB0aGUgY3VtdWxhdGl2ZSBsZW5ndGggb2YgdGhlIGZyYWdtZW50cy4KKjI6CVRoZSBmcmVlIHNwYWNlIGluIHRoZSBNYWlsQm94IGlzIGNhbGN1bGF0ZWQgKDJhOiBmcmVlIHBhcnQgZnJvbSBXcml0ZSBQdHIgdG8gUmVhZCBQdHIsIDJiOiBmcmVlIHBhcnQKKgl0dXJucyBvdXQgdG8gd3JhcCBhcm91bmQpIC4gSWYgdGhpcyBzcGFjZSBzdWZmaWNlcyB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHJlZmxlY3RlZCBieSBsZW4gKFQtZmllbGQKKgkrIFZhbHVlLWZpZWxkKSBwbHVzIHRoZSBhZGRpdGlvbmFsIE1haWxCb3ggSW5mbyBMLWZpZWxkICsgYSB0cmFpbGluZyAwIHRvIGFjdCBhcyB0aGUgTC1maWVsZCBvZiBhIHRyYWlsaW5nCioJZHVtbXkgb3IgZW1wdHkgTFRWIHJlY29yZCwgdGhlbiBhIE1haWxCb3ggSW5mbyBibG9jayBpcyBidWlsZCBpbiB0aGUgTWFpbEJveCBjb25zaXN0aW5nIG9mCioJICAtIHRoZSB2YWx1ZSBsZW4gaW4gdGhlIGZpcnN0IHdvcmQKKgkgIC0gdHlwZSBpbiB0aGUgc2Vjb25kIHdvcmQKKgkgIC0gYSBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZnJhZ21lbnRzIGluIHRoZSBzZWNvbmQgYW5kIGhpZ2hlciB3b3JkCioKKjQ6CVNpbmNlIHB1dF9pbmZvX21iKCkgY2FuIG1vcmUgb3IgbGVzcyBkaXJlY3RseSBiZSBjYWxsZWQgZnJvbSB0aGUgTVNGIGxldmVsLCB0aGUgSS9GIG11c3QgYmUgcm9idXN0CioJYWdhaW5zdCBvdXQtb2YtcmFuZ2UgdmFyaWFibGVzLiBBcyBmYWlsc2FmZSBjb2RpbmcsIHRoZSBNQiB1cGRhdGUgaXMgc2tpcHBlZCBieSBjaGFuZ2luZyB0bGVuIHRvIDAgaWYKKglsZW4gPT0gMDsgVGhpcyB3aWxsIGluZGlyZWN0bHkgY2F1c2UgYW4gYXNzZXJ0IGFzIHJlc3VsdCBvZiB0aGUgdmlvbGF0aW9uIG9mIHRoZSBuZXh0IGlmIGNsYXVzZS4KKjY6CUNoZWNrIHdoZXRoZXIgdGhlIGZyZWUgc3BhY2UgaW4gTWFpbEJveCBzdWZmaWNlcyAodGhpcyBjb3ZlcnMgdGhlIGNvbXBsZXRlIGFic2VuY2Ugb2YgdGhlIE1haWxCb3gpLgoqCU5vdGUgdGhhdCBsZW4gaXMgdW5zaWduZWQsIHNvIGV2ZW4gTVNGIEkvRiB2aW9sYXRpb24gd29ya3Mgb3V0IE8uSy4KKglUaGUgJzInIGluIHRoZSBleHByZXNzaW9uICJsZW4rMiIgaXMgdXNlZCBiZWNhdXNlIDEgd29yZCBpcyBuZWVkZWQgZm9yIEwgaXRzZWxmIGFuZCAxIHdvcmQgaXMgbmVlZGVkCioJZm9yIHRoZSB6ZXJvLXNlbnRpbmVsCio4Ogl1cGRhdGUgTWFpbEJveCBJbmZvIGxlbmd0aCByZXBvcnQgdG8gTVNGIHdpdGggIm9sZGVzdCIgTUIgSW5mbyBCbG9jayBzaXplLiBCZSBjYXJlZnVsbCBoZXJlLCBpZiB5b3UgZ2V0CioJaGVyZSBiZWZvcmUgdGhlIE1haWxCb3ggaXMgcmVnaXN0ZXJlZCwgeW91IGNhbid0IHJlYWQgZnJvbSB0aGUgYnVmZmVyIGFkZHJlc3NlZCBieSBJRkJfTUJwIChpdCBpcyB0aGUKKglOdWxsIGJ1ZmZlcikgc28gZG9uJ3QgbW92ZSB0aGlzIGNvZGUgdGlsbCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZSBidXQga2VlcCBpdCB3aGVyZSB0aGVyZSBpcyBnYXJ1YW50ZWVkCioJYSBidWZmZXIuCioKKi5OT1RJQ0UKKglib3VuZGFyeSB0ZXN0aW5nIGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCBJRkJfTUJTaXplIGlzIGd1YXJhbnRlZWQgdG8gYmUgemVybyBpZiBubyBNYWlsQm94IGlzIHByZXNlbnQsCioJYW5kIHRvIGEgbGVzc2VyIGRlZ3JlZSwgdGhhdCBJRkJfTUJXcCA9IElGQl9NQlJwID0gMAoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgoKSENGX1NUQVRJQyBpbnQKcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApCnsKCmludAkJCXJjID0gSENGX1NVQ0NFU1M7CmhjZl8xNgkJaTsJCQkJCQkvL3dvcmsgY291bnRlcgpoY2ZfMTYJCSpkcDsJCQkJCS8vZGVzdGluYXRpb24gcG9pbnRlciAoaW4gTWFpbEJveCkKd2NpX3JlY29yZHAJc3A7CQkJCQkJLy9zb3VyY2UgcG9pbnRlcgpoY2ZfMTYJCWxlbjsJCQkJCS8vdG90YWwgbGVuZ3RoIHRvIGNvcHkgdG8gTWFpbEJveApoY2ZfMTYJCXRsZW47CQkJCQkvL2ZyZWUgbGVuZ3RoL3dvcmtpbmcgbGVuZ3RoL29mZnNldCBpbiBXTVAgZnJhbWUKCglpZiAoIGlmYnAtPklGQl9NQnAgPT0gTlVMTCApIHJldHVybiByYzsgIC8vOz9ub3Qgc3VmZmljaWVudAoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJwICE9IE5VTEwsIDAgKQkJCQkJLy8hISFiZSBjYXJlZnVsLCBkb24ndCBnZXQgaW50byBhbiBlbmRsZXNzIHJlY3Vyc2lvbgoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJTaXplLCAwICkKCglsZW4gPSAxOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogMSAqLwoJZm9yICggaSA9IDA7IGkgPCBsdHZwLT5mcmFnX2NudDsgaSsrICkgewoJCWxlbiArPSBsdHZwLT5mcmFnX2J1ZltpXS5mcmFnX2xlbjsKCX0KCWlmICggaWZicC0+SUZCX01CUnAgPiBpZmJwLT5JRkJfTUJXcCApIHsKCQl0bGVuID0gaWZicC0+SUZCX01CUnAgLSBpZmJwLT5JRkJfTUJXcDsJCQkJCQkJCQkJCQkJCQkvKiAyYSovCgl9IGVsc2UgewoJCWlmICggaWZicC0+SUZCX01CUnAgPT0gaWZicC0+SUZCX01CV3AgKSB7CgkJCWlmYnAtPklGQl9NQlJwID0gaWZicC0+SUZCX01CV3AgPSAwOwkvLyBvcHRpbWl6ZSBXcmFwcGluZwoJCX0KCQl0bGVuID0gaWZicC0+SUZCX01CU2l6ZSAtIGlmYnAtPklGQl9NQldwOwkJCQkJCQkJCQkJCQkJLyogMmIqLwoJCWlmICggKCB0bGVuIDw9IGxlbiArIDIgKSAmJiAoIGxlbiArIDIgPCBpZmJwLT5JRkJfTUJScCApICkgewkvL2lmIHRyYWlsaW5nIHNwYWNlIGlzIHRvbyBzbWFsbCBidXQKCQkJCQkJCQkJCQkJCQkJCQkvLwkgbGVhZGluZyBzcGFjZSBpcyBzdWZmaWNpZW50bHkgbGFyZ2UKCQkJaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF0gPSAweEZGRkY7CQkJCQkvL2ZsYWcgZHVtbXkgTFRWIHRvIGZpbGwgdGhlIHRyYWlsaW5nIHNwYWNlCgkJCWlmYnAtPklGQl9NQldwID0gMDsJCQkJCQkJCQkJLy9yZXNldCBXcml0ZVBvaW50ZXIgdG8gYmVnaW4gb2YgTWFpbEJveAoJCQl0bGVuID0gaWZicC0+SUZCX01CUnA7CQkJCQkJCQkJLy9nZXQgbmV3IGF2YWlsYWJsZSBzcGFjZSBzaXplCgkJfQoJfQoJZHAgPSAmaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF07CglpZiAoIGxlbiA9PSAwICkgewoJCXRsZW4gPSAwOyAvLzs/IHdoYXQgaXMgdGhpcyBnb29kIGZvcgoJfQoJaWYgKCBsZW4gKyAyID49IHRsZW4gKXsJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDYgKi8KCQkvL0RvIE5vdCBBU1NFUlQsIHRoaXMgaXMgYSBub3JtYWwgY29uZGl0aW9uCgkJSUZfVEFMTFkoIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5Ob0J1Zk1CKys7ICkgLypOT1AgdG8gY292ZXIgYWdhaW5zdCBhbmFsb21pZXMgd2l0aCBlbXB0eSBjb21wb3VuZCovOwoJCXJjID0gSENGX0VSUl9MRU47Cgl9IGVsc2UgewoJCSpkcCsrID0gbGVuOwkJCQkJCQkJCS8vd3JpdGUgTGVuICg9IHNpemUgb2YgVCtWIGluIHdvcmRzIHRvIE1CX0luZm8gYmxvY2sKCQkqZHArKyA9IGx0dnAtPmJhc2VfdHlwOwkJCQkJCQkvL3dyaXRlIFR5cGUgdG8gTUJfSW5mbyBibG9jawoJCWlmYnAtPklGQl9NQldwICs9IGxlbiArIDE7CQkJCQkJLy91cGRhdGUgV3JpdGVQb2ludGVyIG9mIE1haWxCb3gKCQlmb3IgKCBpID0gMDsgaSA8IGx0dnAtPmZyYWdfY250OyBpKysgKSB7CQkJCS8vIHByb2Nlc3MgZWFjaCBvZiB0aGUgZnJhZ21lbnRzCgkJCXNwID0gbHR2cC0+ZnJhZ19idWZbaV0uZnJhZ19hZGRyOwoJCQlsZW4gPSBsdHZwLT5mcmFnX2J1ZltpXS5mcmFnX2xlbjsKCQkJd2hpbGUgKCBsZW4tLSApICpkcCsrID0gKnNwKys7CgkJfQoJCWlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CV3BdID0gMDsJCQkJLy90byBhc3N1cmUgZ2V0X2luZm8gZm9yIENGR19NQl9JTkZPIHN0b3BzCgkJaWZicC0+SUZCX01CSW5mb0xlbiA9IGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOwkJCQkJCQkJCQkJLyogOCAqLwoJfQoJcmV0dXJuIHJjOwp9IC8vIHB1dF9pbmZvX21iCgojZW5kaWYgLy8gSENGX0VYVF9NQgojZW5kaWYgLy8gSENGX0RMX09OTFkKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCWludCBzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKQoqLlBVUlBPU0UJCXNldCB1cCBkYXRhIGFjY2VzcyB0byBOSUMgUkFNIHZpYSBCQVBfMS4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCQlhZGRyZXNzIG9mIEkvRiBCbG9jawoqCWZpZAkJCQlGSUQvUklECioJb2Zmc2V0CQkJISFldmVuISEgb2Zmc2V0IGluIEZJRC9SSUQKKgl0eXBlCQkJSU9fSU4sIElPX09VVAoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCQkJCQlPLksKKglIQ0ZfRVJSX05PX05JQwkJCQljYXJkIGlzIHJlbW92ZWQKKglIQ0ZfRVJSX0RFRlVOQ1RfVElNRV9PVVQJRmF0YWwgbWFsZnVuY3Rpb24gZGV0ZWN0ZWQKKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uLi4JCWlmIGFuZCBvbmx5IGlmIElGQl9EZWZ1bmN0U3RhdCA8PiAwCioKKi5ERVNDUklQVElPTgoqCiogQSBub24temVybyByZXR1cm4gc3RhdHVzIGluZGljYXRlczoKKiAtIHRoZSBOSUMgaXMgY29uc2lkZXJlZCBub25vcGVyYXRpb25hbCwgZS5nLiBkdWUgdG8gYSB0aW1lLW91dCBvZiBzb21lIEhlcm1lcyBhY3Rpdml0eSBpbiB0aGUgcGFzdAoqIC0gQkFQXzEgY291bGQgbm90IHByb3Blcmx5IGJlIGluaXRpYWxpemVkCiogLSB0aGUgY2FyZCBpcyByZW1vdmVkIGJlZm9yZSBjb21wbGV0aW9uIG9mIHRoZSBkYXRhIHRyYW5zZmVyCiogSW4gYWxsIG90aGVyIGNhc2VzLCBhIHplcm8gaXMgcmV0dXJuZWQuCiogQkFQIEluaXRpYWxpemF0aW9uIGZhaWx1cmUgaW5kaWNhdGVzIGFuIEgvVyBlcnJvciB3aGljaCBpcyB2ZXJ5IGxpa2VseSB0byBzaWduYWwgY29tcGxldGUgSC9XIGZhaWx1cmUuCiogT25jZSBhIEJBUCBJbml0aWFsaXphdGlvbiBmYWlsdXJlIGhhcyBvY2N1cnJlZCBhbGwgc3Vic2VxdWVudCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgSGVybWVzIHdpbGwgcmV0dXJuIGEKKiAiZGVmdW5jdCIgc3RhdHVzIHRpbGwgdGhlIEhlcm1lcyBpcyByZS1pbml0aWFsaXplZCBieSBtZWFucyBvZiBhbiBoY2ZfY29ubmVjdC4KKgoqIEEgQkFQIGlzIGEgc2V0IG9mIHJlZ2lzdGVycyAoT2Zmc2V0LCBTZWxlY3QgYW5kIERhdGEpIG9mZmVyaW5nIHJlYWQvd3JpdGUgYWNjZXNzIHRvIGEgcGFydGljdWxhciBGSUQgb3IKKiBSSUQuIFRoaXMgYWNjZXNzIGlzIGJhc2VkIG9uIGEgYXV0by1pbmNyZW1lbnQgZmVhdHVyZS4KKiBUaGVyZSBhcmUgdHdvIEJBUHMgYnV0IHRoZXNlIGRheXMgdGhlIEhDRiB1c2VzIG9ubHkgQkFQXzEgYW5kIGxlYXZlcyBCQVBfMCB0byB0aGUgUENJIEJ1c21hc3RlcmluZyBIL1cuCioKKiBUaGUgQkFQLW1lY2hhbmlzbSBpcyBiYXNlZCBvbiB0aGUgQnVzeSBiaXQgaW4gdGhlIE9mZnNldCByZWdpc3RlciAoc2VlIHRoZSBIZXJtZXMgZGVmaW5pdGlvbikuIFRoZSB3YWl0aW5nCiogZm9yIEJ1c3kgbXVzdCBvY2N1ciBiZXR3ZWVuIHdyaXRpbmcgdGhlIE9mZnNldCByZWdpc3RlciBhbmQgYWNjZXNzaW5nIHRoZSBEYXRhIHJlZ2lzdGVyLiBUaGUKKiBpbXBsZW1lbnRhdGlvbiB0byB3YWl0IGZvciB0aGUgQnVzeSBiaXQgZHJvcCBhZnRlciBlYWNoIHdyaXRlIHRvIHRoZSBPZmZzZXQgcmVnaXN0ZXIsIGltcGxpZXMgdGhhdCB0aGUKKiByZXF1aXJlbWVudCB0aGF0IHRoZSBCdXN5IGJpdCBpcyBsb3cgIGJlZm9yZSB0aGUgU2VsZWN0IHJlZ2lzdGVyIGlzIHdyaXR0ZW4sIGlzIGF1dG9tYXRpY2FsbHkgbWV0LgoqIEJBUC1zZXR1cCBtYXkgYmUgdGltZSBjb25zdW1pbmcgKGUuZy4gMzgwIHVzZWMgZm9yIGxhcmdlIG9mZnNldHMgb2NjdXJzIGZyZXF1ZW50bHkpLiBUaGUgd2FpdCBmb3IgQnVzeSBiaXQKKiBkcm9wIGlzIHByb3RlY3RlZCBieSBhIGxvb3AgY291bnRlciwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgd2l0aCBJRkJfVGlja0luaSwgd2hpY2ggaXMgY2FsaWJyYXRlZCBpbiBpbml0LgoqCiogVGhlIE5JQyBJL0YgaXMgb3B0aW1pemVkIGZvciB3b3JkIHRyYW5zZmVyIGFuZCBjYW4gb25seSBoYW5kbGUgd29yZCB0cmFuc2ZlciBhdCBhIHdvcmQgYm91bmRhcnkgaW4gTklDCiogUkFNLiBUaGUgaW50ZW5kZWQgc29sdXRpb24gZm9yIHRyYW5zZmVyIG9mIGEgc2luZ2xlIGJ5dGUgaGFzIG11bHRpcGxlIEgvVyBmbGF3cy4gVGhlcmUgaGF2ZSBiZWVuIGRpZmZlcmVudAoqIFMvVyBXb3JrYXJvdW5kIHN0cmF0ZWdpZXMuIFJJRCBhY2Nlc3MgaXMgaGNmXzE2IGJhc2VkIGJ5ICJuYXR1cmUiLCBzbyBubyBieXRlIGFjY2VzcyBwcm9ibGVtcy4gIEZvciBUeC9SeAoqIEZJRCBhY2Nlc3MsICB0aGUgYnl0ZSBsb2dpYyBiZWNhbWUgb2Jzb2xldGUgYnkgYWJzb3JiaW5nIGl0IGluIHRoZSBkb3VibGUgd29yZCBvcmllbnRlZCBuYXR1cmUgb2YgdGhlIE1JQwoqIGZlYXR1cmUuCioKKgoqLkRJQUdSQU0KKgoqMjoJdGhlIHRlc3Qgb24gcmMgY2hlY2tzIHdoZXRoZXIgdGhlIEhDRiB3ZW50IGludG8gImRlZnVuY3QiIG1vZGUgKCBlLmcuIEJBUCBpbml0aWFsaXphdGlvbiBvciBhIGNhbGwgdG8KKgljbWRfd2FpdCBkaWQgZXZlciBmYWlsKS4KKjQ6CXRoZSBzZWxlY3QgcmVnaXN0ZXIgYW5kIG9mZnNldCByZWdpc3RlciBhcmUgc2V0CioJdGhlIG9mZnNldCByZWdpc3RlciBpcyBtb25pdG9yZWQgdGlsbCBhIHN1Y2Nlc3NmdWwgY29uZGl0aW9uIChubyBidXN5IGJpdCkgaXMgZGV0ZWN0ZWQgb3IgdGlsbCB0aGUKKgkoY2FsaWJyYXRlZCkgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZXMKKglJZiB0aGUgY291bnRlciBleHBpcmVzLCB0aGlzIGlzIHJlZmxlY3RlZCBpbiBJRkJfRGVmdW5jdFN0YXQsIHNvIGFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIHNldHVwX2JhcCBmYWlsCioJaW1tZWRpYXRlbHkgKCBzZWUgMikKKjY6CWluaXRpYWxpemF0aW9uIG9mIHRoZSBjYXJyeSBhcyB1c2VkIGJ5IHBldC9nZXRfZnJhZwoqODoJSFJFR19PRkZTRVRfRVJSIGlzIGlnbm9yZWQgYXMgZXJyb3IgYmVjYXVzZToKKgkgYTogdGhlIEhlcm1lcyBpcyByb2J1c3QgYWdhaW5zdCBpdAoqCSBiOiBpdCBpcyBub3Qga25vd24gd2hhdCBjYXVzZXMgaXQgKHByb2JhYmx5IGEgYnVnKSwgaGVuY2Ugbm8gc3RyYXRlZ3kgY2FuIGJlIHNwZWNpZmllZCB3aGljaCBsZXZlbCBpcwoqCQl0byBoYW5kbGUgdGhpcyBlcnJvciBpbiB3aGljaCB3YXkuIEluIHRoZSBwYXN0LCBpdCBjb3VsZCBiZSBpbmR1Y2VkIGJ5IHRoZSBNU0YgbGV2ZWwsIGUuZy4gYnkgY2FsbGluZwoqCQloY2ZfcmN2X21zZyB3aGlsZSB0aGVyZSB3YXMgbm8gUngtRklEIGF2YWlsYWJsZS4gU2luY2UgdGhpcyBpcyBhbiBNU0YtZXJyb3Igd2hpY2ggaXMgY2F1Z2h0IGJ5IEFTU0VSVCwKKgkJdGhlcmUgaXMgbm8gcnVuLXRpbWUgYWN0aW9uIHJlcXVpcmVkIGJ5IHRoZSBIQ0YuCioJTHVtcGluZyB0aGUgT2Zmc2V0IGVycm9yIGluIHdpdGggdGhlIEJ1c3kgYml0IGVycm9yLCBhcyBoYXMgYmVlbiBkb25lIGluIHRoZSBwYXN0IHR1cm5zIG91dCB0byBiZSBhCioJZGlzYXN0ZXIgb3IgYSBsaWZlIHNhdmVyLCBqdXN0IGRlcGVuZGluZyBvbiB3aGF0IHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMuIFNpbmNlIG5vIHByZWRpY3Rpb24gY2FuIGJlCioJZG9uZSBhYm91dCB0aGUgZnV0dXJlLCBpdCBpcyAiZmVsdCIgdG8gYmUgdGhlIGJlc3Qgc3RyYXRlZ3kgdG8gaWdub3JlIHRoaXMgZXJyb3IuIE9uZSBkYXkgdGhlIGNvZGUgd2FzCioJYWNjb21wYW5pZWQgYnkgdGhlIGZvbGxvd2luZyBjb21tZW50OgoqCS8vCWlnbm9yZSBIUkVHX09GRlNFVF9FUlIsIHNvbWVvbmUsIHN1cHBvc2VkbHkgdGhlIE1TRiBwcm9ncmFtbWVyIDspIG1hZGUgYSBidWcuIFNpbmNlIHdlIGRvbid0IGtub3cKKgkvLwl3aGF0IGlzIGdvaW5nIG9uLCB3ZSBtaWdodCBhcyB3ZWxsIGdvIG9uIC0gdW5kZXIgbWFuYWdlbWVudCBwcmVzc3VyZSAtIGJ5IGlnbm9yaW5nIGl0CioKKi5FTkRET0MgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGludApzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKQp7ClBST1RfQ05UX0lOSQppbnQJcmM7CgoJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9TVFJJTyApOwoJcmMgPSBpZmJwLT5JRkJfRGVmdW5jdFN0YXQ7CglpZiAocmMgPT0gSENGX1NVQ0NFU1MpIHsJCQkJCQkJCQkJLyoyKi8KCQlPUFcoIEhSRUdfU0VMRUNUXzEsIGZpZCApOwkJCQkJCQkJCQkJCQkJCQkvKjQqLwoJCU9QVyggSFJFR19PRkZTRVRfMSwgb2Zmc2V0ICk7CgkJaWYgKCB0eXBlID09IElPX0lOICkgewoJCQlpZmJwLT5JRkJfQ2FycnlJbiA9IDA7CgkJfQoJCWVsc2UgaWZicC0+SUZCX0NhcnJ5T3V0ID0gMDsKCQlIQ0ZfV0FJVF9XSElMRSggSVBXKCBIUkVHX09GRlNFVF8xKSAmIEhDTURfQlVTWSApOwoJCUhDRkFTU0VSVCggISggSVBXKCBIUkVHX09GRlNFVF8xKSAmIEhSRUdfT0ZGU0VUX0VSUiApLCBNRVJHRV8yKCBmaWQsIG9mZnNldCApICkJCQkvKjgqLwoJCWlmICggcHJvdF9jbnQgPT0gMCApIHsKCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIGZpZCwgb2Zmc2V0ICkgKQoJCQlyYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdCA9IEhDRl9FUlJfREVGVU5DVF9USU1FX09VVDsKCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9ERUZVTkNUOwoJCX0KCX0KCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfU1RSSU8gfCBIQ0ZfVFJBQ0VfRVhJVCApOwoJcmV0dXJuIHJjOwp9IC8vIHNldHVwX2JhcAoK