LyoKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwogKgogKiBDb3B5cmlnaHQgqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIGV0MTMxMF9lZXByb20uYyAtIENvZGUgdXNlZCB0byBhY2Nlc3MgdGhlIGRldmljZSdzIEVFUFJPTQogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDb3B5cmlnaHQgqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqLwoKI2luY2x1ZGUgImV0MTMxeF92ZXJzaW9uLmgiCiNpbmNsdWRlICJldDEzMXhfZGVidWcuaCIKI2luY2x1ZGUgImV0MTMxeF9kZWZzLmgiCgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KCiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC90aW1lci5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbi5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgoKI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KCiNpbmNsdWRlICJldDEzMTBfcGh5LmgiCiNpbmNsdWRlICJldDEzMTBfcG0uaCIKI2luY2x1ZGUgImV0MTMxMF9qYWdjb3JlLmgiCiNpbmNsdWRlICJldDEzMTBfZWVwcm9tLmgiCgojaW5jbHVkZSAiZXQxMzF4X2FkYXB0ZXIuaCIKI2luY2x1ZGUgImV0MTMxeF9pbml0cGNpLmgiCiNpbmNsdWRlICJldDEzMXhfaXNyLmgiCgojaW5jbHVkZSAiZXQxMzEwX3R4LmgiCgoKLyoKICogRUVQUk9NIERlZmluZXMKICovCgovKiBMQkNJRiBSZWdpc3RlciBHcm91cHMgKGFkZHJlc3NlZCB2aWEgMzItYml0IG9mZnNldHMpICovCiNkZWZpbmUgTEJDSUZfRFdPUkQwX0dST1VQX09GRlNFVCAgICAgICAweEFDCiNkZWZpbmUgTEJDSUZfRFdPUkQxX0dST1VQX09GRlNFVCAgICAgICAweEIwCgovKiBMQkNJRiBSZWdpc3RlcnMgKGFkZHJlc3NlZCB2aWEgOC1iaXQgb2Zmc2V0cykgKi8KI2RlZmluZSBMQkNJRl9BRERSRVNTX1JFR0lTVEVSX09GRlNFVCAgIDB4QUMKI2RlZmluZSBMQkNJRl9EQVRBX1JFR0lTVEVSX09GRlNFVCAgICAgIDB4QjAKI2RlZmluZSBMQkNJRl9DT05UUk9MX1JFR0lTVEVSX09GRlNFVCAgIDB4QjEKI2RlZmluZSBMQkNJRl9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUICAgIDB4QjIKCi8qIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXIgQml0cyAqLwojZGVmaW5lIExCQ0lGX0NPTlRST0xfU0VRVUVOVElBTF9SRUFEICAgMHgwMQojZGVmaW5lIExCQ0lGX0NPTlRST0xfUEFHRV9XUklURSAgICAgICAgMHgwMgojZGVmaW5lIExCQ0lGX0NPTlRST0xfVU5VU0VEMSAgICAgICAgICAgMHgwNAojZGVmaW5lIExCQ0lGX0NPTlRST0xfRUVQUk9NX1JFTE9BRCAgICAgMHgwOAojZGVmaW5lIExCQ0lGX0NPTlRST0xfVU5VU0VEMiAgICAgICAgICAgMHgxMAojZGVmaW5lIExCQ0lGX0NPTlRST0xfVFdPX0JZVEVfQUREUiAgICAgMHgyMAojZGVmaW5lIExCQ0lGX0NPTlRST0xfSTJDX1dSSVRFICAgICAgICAgMHg0MAojZGVmaW5lIExCQ0lGX0NPTlRST0xfTEJDSUZfRU5BQkxFICAgICAgMHg4MAoKLyogTEJDSUYgU3RhdHVzIFJlZ2lzdGVyIEJpdHMgKi8KI2RlZmluZSBMQkNJRl9TVEFUVVNfUEhZX1FVRVVFX0FWQUlMICAgIDB4MDEKI2RlZmluZSBMQkNJRl9TVEFUVVNfSTJDX0lETEUgICAgICAgICAgIDB4MDIKI2RlZmluZSBMQkNJRl9TVEFUVVNfQUNLX0VSUk9SICAgICAgICAgIDB4MDQKI2RlZmluZSBMQkNJRl9TVEFUVVNfR0VORVJBTF9FUlJPUiAgICAgIDB4MDgKI2RlZmluZSBMQkNJRl9TVEFUVVNfVU5VU0VEICAgICAgICAgICAgIDB4MzAKI2RlZmluZSBMQkNJRl9TVEFUVVNfQ0hFQ0tTVU1fRVJST1IgICAgIDB4NDAKI2RlZmluZSBMQkNJRl9TVEFUVVNfRUVQUk9NX1BSRVNFTlQgICAgIDB4ODAKCi8qIE1pc2NlbGxhbmVvdXMgQ29uc3RyYWludHMgKi8KI2RlZmluZSBNQVhfTlVNX1JFR0lTVEVSX1BPTExTICAgICAgICAgIDEwMDAKI2RlZmluZSBNQVhfTlVNX1dSSVRFX1JFVFJJRVMgICAgICAgICAgIDIKCi8qCiAqIERlZmluZSBtYWNyb3MgdGhhdCBhbGxvdyBpbmRpdmlkdWFsIHJlZ2lzdGVyIHZhbHVlcyB0byBiZSBleHRyYWN0ZWQgZnJvbSBhCiAqIERXT1JEMSByZWdpc3RlciBncm91cGluZwogKi8KI2RlZmluZSBFWFRSQUNUX0RBVEFfUkVHSVNURVIoeCkgICAgKHVpbnQ4X3QpKHggJiAweEZGKQojZGVmaW5lIEVYVFJBQ1RfU1RBVFVTX1JFR0lTVEVSKHgpICAodWludDhfdCkoKHggPj4gMTYpICYgMHhGRikKI2RlZmluZSBFWFRSQUNUX0NPTlRST0xfUkVHKHgpICAgICAgKHVpbnQ4X3QpKCh4ID4+IDgpICYgMHhGRikKCi8qKgogKiBFZXByb21Xcml0ZUJ5dGUgLSBXcml0ZSBhIGJ5dGUgdG8gdGhlIEVUMTMxMCdzIEVFUFJPTQogKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICogQHVuQWRkcmVzczogdGhlIGFkZHJlc3MgdG8gd3JpdGUKICogQGJEYXRhOiB0aGUgdmFsdWUgdG8gd3JpdGUKICogQHVuRWVwcm9uSWQ6IHRoZSBJRCBvZiB0aGUgRUVQUk9NCiAqIEB1bkFkZHJlc3NpbmdNb2RlOiBob3cgdGhlIEVFUFJPTSBpcyB0byBiZSBhY2Nlc3NlZAogKgogKiBSZXR1cm5zIFNVQ0NFU1Mgb3IgRkFJTFVSRQogKi8KaW50MzJfdCBFZXByb21Xcml0ZUJ5dGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlciwgdWludDMyX3QgdW5BZGRyZXNzLAoJCQl1aW50OF90IGJEYXRhLCB1aW50MzJfdCB1bkVlcHJvbUlkLAoJCQl1aW50MzJfdCB1bkFkZHJlc3NpbmdNb2RlKQp7CiAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwQWRhcHRlci0+cGRldjsKCWludDMyX3QgbkluZGV4OwoJaW50MzJfdCBuUmV0cmllczsKCWludDMyX3QgbkVycm9yID0gZmFsc2U7CglpbnQzMl90IG5JMkNXcml0ZUFjdGl2ZSA9IDA7CglpbnQzMl90IG5Xcml0ZVN1Y2Nlc3NmdWwgPSAwOwoJdWludDhfdCBiQ29udHJvbDsKCXVpbnQ4X3QgYlN0YXR1cyA9IDA7Cgl1aW50MzJfdCB1bkR3b3JkMSA9IDA7Cgl1aW50MzJfdCB1bkRhdGEgPSAwOwoKCS8qCgkgKiBUaGUgZm9sbG93aW5nIGV4Y2VycHQgaXMgZnJvbSAiU2VyaWFsIEVFUFJPTSBIVyBEZXNpZ24KCSAqIFNwZWNpZmljYXRpb24iIFZlcnNpb24gMC45MiAoOS8yMC8yMDA0KToKCSAqCgkgKiBTaW5nbGUgQnl0ZSBXcml0ZXMKCSAqCgkgKiBGb3IgYW4gRUVQUk9NLCBhbiBJMkMgc2luZ2xlIGJ5dGUgd3JpdGUgaXMgZGVmaW5lZCBhcyBhIFNUQVJUCgkgKiBjb25kaXRpb24gZm9sbG93ZWQgYnkgdGhlIGRldmljZSBhZGRyZXNzLCBFRVBST00gYWRkcmVzcywgb25lIGJ5dGUKCSAqIG9mIGRhdGEgYW5kIGEgU1RPUCBjb25kaXRpb24uICBUaGUgU1RPUCBjb25kaXRpb24gd2lsbCB0cmlnZ2VyIHRoZQoJICogRUVQUk9NJ3MgaW50ZXJuYWxseSB0aW1lZCB3cml0ZSBjeWNsZSB0byB0aGUgbm9udm9sYXRpbGUgbWVtb3J5LgoJICogQWxsIGlucHV0cyBhcmUgZGlzYWJsZWQgZHVyaW5nIHRoaXMgd3JpdGUgY3ljbGUgYW5kIHRoZSBFRVBST00gd2lsbAoJICogbm90IHJlc3BvbmQgdG8gYW55IGFjY2VzcyB1bnRpbCB0aGUgaW50ZXJuYWwgd3JpdGUgaXMgY29tcGxldGUuCgkgKiBUaGUgc3RlcHMgdG8gZXhlY3V0ZSBhIHNpbmdsZSBieXRlIHdyaXRlIGFyZSBhcyBmb2xsb3dzOgoJICoKCSAqIDEuIENoZWNrIExCQ0lGIFN0YXR1cyBSZWdpc3RlciBmb3IgYml0cyA2ICYgMzoyIGFsbCBlcXVhbCB0byAwIGFuZAoJICogICAgYml0cyA3LDE6MCBib3RoIGVxdWFsIHRvIDEsIGF0IGxlYXN0IG9uY2UgYWZ0ZXIgcmVzZXQuCgkgKiAgICBTdWJzZXF1ZW50IG9wZXJhdGlvbnMgbmVlZCBvbmx5IHRvIGNoZWNrIHRoYXQgYml0cyAxOjAgYXJlCgkgKiAgICBlcXVhbCB0byAxIHByaW9yIHRvIHN0YXJ0aW5nIGEgc2luZ2xlIGJ5dGUgd3JpdGUuCgkgKgoJICogMi4gV3JpdGUgdG8gdGhlIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXI6ICBiaXQgNz0xLCBiaXQgNj0xLCBiaXQgMz0wLAoJICogICAgYW5kIGJpdHMgMTowIGJvdGggPTAuICBCaXQgNSBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byB0aGUKCSAqICAgIHR5cGUgb2YgRUVQUk9NIGJlaW5nIGFjY2Vzc2VkICgxPXR3byBieXRlIGFkZHJlc3NpbmcsIDA9b25lCgkgKiAgICBieXRlIGFkZHJlc3NpbmcpLgoJICoKCSAqIDMuIFdyaXRlIHRoZSBhZGRyZXNzIHRvIHRoZSBMQkNJRiBBZGRyZXNzIFJlZ2lzdGVyLgoJICoKCSAqIDQuIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBMQkNJRiBEYXRhIFJlZ2lzdGVyICh0aGUgSTJDIHdyaXRlIHdpbGwKCSAqICAgIGJlZ2luKS4KCSAqCgkgKiA1LiBNb25pdG9yIGJpdCAxOjAgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIFdoZW4gYml0cyAxOjAgYXJlCgkgKiAgICBib3RoIGVxdWFsIHRvIDEsIHRoZSBJMkMgd3JpdGUgaGFzIGNvbXBsZXRlZCBhbmQgdGhlIGludGVybmFsCgkgKiAgICB3cml0ZSBjeWNsZSBvZiB0aGUgRUVQUk9NIGlzIGFib3V0IHRvIHN0YXJ0LiAoYml0cyAxOjAgPSAwMSBpcwoJICogICAgYSBsZWdhbCBzdGF0ZSB3aGlsZSB3YWl0aW5nIGZyb20gYm90aCBlcXVhbCB0byAxLCBidXQgYml0cwoJICogICAgMTowID0gMTAgaXMgaW52YWxpZCBhbmQgaW1wbGllcyB0aGF0IHNvbWV0aGluZyBpcyBicm9rZW4pLgoJICoKCSAqIDYuIENoZWNrIGJpdCAzIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiAgZXF1YWwgdG8gMSwgYW4KCSAqICAgIGVycm9yIGhhcyBvY2N1cnJlZC4KCSAqCgkgKiA3LiBDaGVjayBiaXQgMiBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgSWYgZXF1YWwgdG8gMSBhbiBBQ0sKCSAqICAgIGVycm9yIGhhcyBvY2N1cnJlZCBvbiB0aGUgYWRkcmVzcyBwaGFzZSBvZiB0aGUgd3JpdGUuICBUaGlzCgkgKiAgICBjb3VsZCBiZSBkdWUgdG8gYW4gYWN0dWFsIGhhcmR3YXJlIGZhaWx1cmUgb3IgdGhlIEVFUFJPTSBtYXkKCSAqICAgIHN0aWxsIGJlIGluIGl0cyBpbnRlcm5hbCB3cml0ZSBjeWNsZSBmcm9tIGEgcHJldmlvdXMgd3JpdGUuCgkgKiAgICBUaGlzIHdyaXRlIG9wZXJhdGlvbiB3YXMgaWdub3JlZCBhbmQgbXVzdCBiZSByZXBlYXRlZCBsYXRlci4KCSAqCgkgKiA4LiBTZXQgYml0IDYgb2YgdGhlIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXIgPSAwLiBJZiBhbm90aGVyIHdyaXRlIGlzCgkgKiAgICByZXF1aXJlZCwgZ28gdG8gc3RlcCAxLgoJICovCgoJLyogU3RlcCAxOiAqLwoJZm9yIChuSW5kZXggPSAwOyBuSW5kZXggPCBNQVhfTlVNX1JFR0lTVEVSX1BPTExTOyBuSW5kZXgrKykgewoJCS8qIFJlYWQgcmVnaXN0ZXJzIGdyb3VwZWQgaW4gRFdPUkQxICovCgkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9EV09SRDFfR1JPVVBfT0ZGU0VULAoJCQkJCSAgJnVuRHdvcmQxKSkgewoJCQluRXJyb3IgPSAxOwoJCQlicmVhazsKCQl9CgoJCWJTdGF0dXMgPSBFWFRSQUNUX1NUQVRVU19SRUdJU1RFUih1bkR3b3JkMSk7CgoJCWlmIChiU3RhdHVzICYgTEJDSUZfU1RBVFVTX1BIWV9RVUVVRV9BVkFJTCAmJgoJCSAgICBiU3RhdHVzICYgTEJDSUZfU1RBVFVTX0kyQ19JRExFKSB7CgkJICAgIAkvKiBiaXRzIDE6MCBhcmUgZXF1YWwgdG8gMSAqLwoJCQlicmVhazsKCQl9Cgl9CgoJaWYgKG5FcnJvciB8fCAobkluZGV4ID49IE1BWF9OVU1fUkVHSVNURVJfUE9MTFMpKSB7CgkJcmV0dXJuIEZBSUxVUkU7Cgl9CgoJLyogU3RlcCAyOiAqLwoJYkNvbnRyb2wgPSAwOwoJYkNvbnRyb2wgfD0gTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUgfCBMQkNJRl9DT05UUk9MX0kyQ19XUklURTsKCglpZiAodW5BZGRyZXNzaW5nTW9kZSA9PSBEVUFMX0JZVEUpIHsKCQliQ29udHJvbCB8PSBMQkNJRl9DT05UUk9MX1RXT19CWVRFX0FERFI7Cgl9CgoJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9DT05UUk9MX1JFR0lTVEVSX09GRlNFVCwKCQkJCSAgYkNvbnRyb2wpKSB7CgkJcmV0dXJuIEZBSUxVUkU7Cgl9CgoJbkkyQ1dyaXRlQWN0aXZlID0gMTsKCgkvKiBQcmVwYXJlIEVFUFJPTSBhZGRyZXNzIGZvciBTdGVwIDMgKi8KCXVuQWRkcmVzcyB8PSAodW5BZGRyZXNzaW5nTW9kZSA9PSBEVUFMX0JZVEUpID8KCSAgICAodW5FZXByb21JZCA8PCAxNikgOiAodW5FZXByb21JZCA8PCA4KTsKCglmb3IgKG5SZXRyaWVzID0gMDsgblJldHJpZXMgPCBNQVhfTlVNX1dSSVRFX1JFVFJJRVM7IG5SZXRyaWVzKyspIHsKCQkvKiBTdGVwIDM6Ki8KCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9BRERSRVNTX1JFR0lTVEVSX09GRlNFVCwKCQkJCQkgICB1bkFkZHJlc3MpKSB7CgkJCWJyZWFrOwoJCX0KCgkJLyogU3RlcCA0OiAqLwoJCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfREFUQV9SRUdJU1RFUl9PRkZTRVQsCgkJCQkJICBiRGF0YSkpIHsKCQkJYnJlYWs7CgkJfQoKCQkvKiBTdGVwIDU6ICovCgkJZm9yIChuSW5kZXggPSAwOyBuSW5kZXggPCBNQVhfTlVNX1JFR0lTVEVSX1BPTExTOyBuSW5kZXgrKykgewoJCQkvKiBSZWFkIHJlZ2lzdGVycyBncm91cGVkIGluIERXT1JEMSAqLwoJCQlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsCgkJCQkJCSAgTEJDSUZfRFdPUkQxX0dST1VQX09GRlNFVCwKCQkJCQkJICAmdW5Ed29yZDEpKSB7CgkJCQluRXJyb3IgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWJTdGF0dXMgPSBFWFRSQUNUX1NUQVRVU19SRUdJU1RFUih1bkR3b3JkMSk7CgoJCQlpZiAoYlN0YXR1cyAmIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwgJiYKCQkJICAgIGJTdGF0dXMgJiBMQkNJRl9TVEFUVVNfSTJDX0lETEUpIHsKCQkJICAgIAkvKiBJMkMgd3JpdGUgY29tcGxldGUgKi8KCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQlpZiAobkVycm9yIHx8IChuSW5kZXggPj0gTUFYX05VTV9SRUdJU1RFUl9QT0xMUykpIHsKCQkJYnJlYWs7CgkJfQoKCQkvKgoJCSAqIFN0ZXAgNjogRG9uJ3QgYnJlYWsgaGVyZSBpZiB3ZSBhcmUgcmV2aXNpb24gMSwgdGhpcyBpcwoJCSAqCSAgIHNvIHdlIGRvIGEgYmxpbmQgd3JpdGUgZm9yIGxvYWQgYnVnLgoJICAgICAgICAgKi8KCQlpZiAoYlN0YXR1cyAmIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SCgkJICAgICYmIHBBZGFwdGVyLT5SZXZpc2lvbklEID09IDApIHsKCQkJYnJlYWs7CgkJfQoKCQkvKiBTdGVwIDcgKi8KCQlpZiAoYlN0YXR1cyAmIExCQ0lGX1NUQVRVU19BQ0tfRVJST1IpIHsKCQkJLyoKCQkJICogVGhpcyBjb3VsZCBiZSBkdWUgdG8gYW4gYWN0dWFsIGhhcmR3YXJlIGZhaWx1cmUKCQkJICogb3IgdGhlIEVFUFJPTSBtYXkgc3RpbGwgYmUgaW4gaXRzIGludGVybmFsIHdyaXRlCgkJCSAqIGN5Y2xlIGZyb20gYSBwcmV2aW91cyB3cml0ZS4gVGhpcyB3cml0ZSBvcGVyYXRpb24KCQkJICogd2FzIGlnbm9yZWQgYW5kIG11c3QgYmUgcmVwZWF0ZWQgbGF0ZXIuCgkJCSAqLwoJCQl1ZGVsYXkoMTApOwoJCQljb250aW51ZTsKCQl9CgoJCW5Xcml0ZVN1Y2Nlc3NmdWwgPSAxOwoJCWJyZWFrOwoJfQoKCS8qIFN0ZXAgODogKi8KCXVkZWxheSgxMCk7CgluSW5kZXggPSAwOwoJd2hpbGUgKG5JMkNXcml0ZUFjdGl2ZSkgewoJCWJDb250cm9sICY9IH5MQkNJRl9DT05UUk9MX0kyQ19XUklURTsKCgkJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9DT05UUk9MX1JFR0lTVEVSX09GRlNFVCwKCQkJCQkgIGJDb250cm9sKSkgewoJCQluV3JpdGVTdWNjZXNzZnVsID0gMDsKCQl9CgoJCS8qIERvIHJlYWQgdW50aWwgaW50ZXJuYWwgQUNLX0VSUk9SIGdvZXMgYXdheSBtZWFuaW5nIHdyaXRlCgkJICogY29tcGxldGVkCgkJICovCgkJZG8gewoJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsCgkJCQkJICAgICAgIExCQ0lGX0FERFJFU1NfUkVHSVNURVJfT0ZGU0VULAoJCQkJCSAgICAgICB1bkFkZHJlc3MpOwoJCQlkbyB7CgkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKCQkJCQlMQkNJRl9EQVRBX1JFR0lTVEVSX09GRlNFVCwgJnVuRGF0YSk7CgkJCX0gd2hpbGUgKCh1bkRhdGEgJiAweDAwMDEwMDAwKSA9PSAwKTsKCQl9IHdoaWxlICh1bkRhdGEgJiAweDAwMDQwMDAwKTsKCgkJYkNvbnRyb2wgPSBFWFRSQUNUX0NPTlRST0xfUkVHKHVuRGF0YSk7CgoJCWlmIChiQ29udHJvbCAhPSAweEMwIHx8IG5JbmRleCA9PSAxMDAwMCkgewoJCQlicmVhazsKCQl9CgoJCW5JbmRleCsrOwoJfQoKCXJldHVybiBuV3JpdGVTdWNjZXNzZnVsID8gU1VDQ0VTUyA6IEZBSUxVUkU7Cn0KCi8qKgogKiBFZXByb21SZWFkQnl0ZSAtIFJlYWQgYSBieXRlIGZyb20gdGhlIEVUMTMxMCdzIEVFUFJPTQogKiBAcEFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICogQHVuQWRkcmVzczogdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0byByZWFkCiAqIEBwYkRhdGE6IGEgcG9pbnRlciB0byBhIGJ5dGUgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSByZWFkCiAqIEB1bkVlcHJvbklkOiB0aGUgSUQgb2YgdGhlIEVFUFJPTQogKiBAdW5BZGRyZXNzaW5nTW9kZTogaG93IHRoZSBFRVBST00gaXMgdG8gYmUgYWNjZXNzZWQKICoKICogUmV0dXJucyBTVUNDRVNTIG9yIEZBSUxVUkUKICovCmludDMyX3QgRWVwcm9tUmVhZEJ5dGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlciwgdWludDMyX3QgdW5BZGRyZXNzLAoJCSAgICAgICB1aW50OF90ICpwYkRhdGEsIHVpbnQzMl90IHVuRWVwcm9tSWQsCgkJICAgICAgIHVpbnQzMl90IHVuQWRkcmVzc2luZ01vZGUpCnsKICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHBBZGFwdGVyLT5wZGV2OwoJaW50MzJfdCBuSW5kZXg7CglpbnQzMl90IG5FcnJvciA9IDA7Cgl1aW50OF90IGJDb250cm9sOwoJdWludDhfdCBiU3RhdHVzID0gMDsKCXVpbnQzMl90IHVuRHdvcmQxID0gMDsKCgkvKgoJICogVGhlIGZvbGxvd2luZyBleGNlcnB0IGlzIGZyb20gIlNlcmlhbCBFRVBST00gSFcgRGVzaWduCgkgKiBTcGVjaWZpY2F0aW9uIiBWZXJzaW9uIDAuOTIgKDkvMjAvMjAwNCk6CgkgKgoJICogU2luZ2xlIEJ5dGUgUmVhZHMKCSAqCgkgKiBBIHNpbmdsZSBieXRlIHJlYWQgaXMgc2ltaWxhciB0byB0aGUgc2luZ2xlIGJ5dGUgd3JpdGUsIHdpdGggdGhlCgkgKiBleGNlcHRpb24gb2YgdGhlIGRhdGEgZmxvdzoKCSAqCgkgKiAxLiBDaGVjayBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIgZm9yIGJpdHMgNiAmIDM6MiBhbGwgZXF1YWwgdG8gMCBhbmQKCSAqICAgIGJpdHMgNywxOjAgYm90aCBlcXVhbCB0byAxLCBhdCBsZWFzdCBvbmNlIGFmdGVyIHJlc2V0LgoJICogICAgU3Vic2VxdWVudCBvcGVyYXRpb25zIG5lZWQgb25seSB0byBjaGVjayB0aGF0IGJpdHMgMTowIGFyZSBlcXVhbAoJICogICAgdG8gMSBwcmlvciB0byBzdGFydGluZyBhIHNpbmdsZSBieXRlIHJlYWQuCgkgKgoJICogMi4gV3JpdGUgdG8gdGhlIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXI6ICBiaXQgNz0xLCBiaXQgNj0wLCBiaXQgMz0wLAoJICogICAgYW5kIGJpdHMgMTowIGJvdGggPTAuICBCaXQgNSBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byB0aGUgdHlwZQoJICogICAgb2YgRUVQUk9NIGJlaW5nIGFjY2Vzc2VkICgxPXR3byBieXRlIGFkZHJlc3NpbmcsIDA9b25lIGJ5dGUKCSAqICAgIGFkZHJlc3NpbmcpLgoJICoKCSAqIDMuIFdyaXRlIHRoZSBhZGRyZXNzIHRvIHRoZSBMQkNJRiBBZGRyZXNzIFJlZ2lzdGVyIChJMkMgcmVhZCB3aWxsCgkgKiAgICBiZWdpbikuCgkgKgoJICogNC4gTW9uaXRvciBiaXQgMCBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgV2hlbiA9MSwgSTJDIHJlYWQKCSAqICAgIGlzIGNvbXBsZXRlLiAoaWYgYml0IDEgPTEgYW5kIGJpdCAwIHN0YXlzID0wLCBhIGhhcmR3YXJlIGZhaWx1cmUKCSAqICAgIGhhcyBvY2N1cnJlZCkuCgkgKgoJICogNS4gQ2hlY2sgYml0IDIgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmID0xLCB0aGVuIGFuIGVycm9yCgkgKiAgICBoYXMgb2NjdXJyZWQuICBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJldHVybmVkIGZyb20gdGhlIFBIWSBtYXkKCSAqICAgIGJlIGludmFsaWQuCgkgKgoJICogNi4gUmVnYXJkbGVzcyBvZiBlcnJvciBzdGF0dXMsIHJlYWQgZGF0YSBieXRlIGZyb20gTEJDSUYgRGF0YQoJICogICAgUmVnaXN0ZXIuICBJZiBhbm90aGVyIGJ5dGUgaXMgcmVxdWlyZWQsIGdvIHRvIHN0ZXAgMS4KCSAqLwoKCS8qIFN0ZXAgMTogKi8KCWZvciAobkluZGV4ID0gMDsgbkluZGV4IDwgTUFYX05VTV9SRUdJU1RFUl9QT0xMUzsgbkluZGV4KyspIHsKCQkvKiBSZWFkIHJlZ2lzdGVycyBncm91cGVkIGluIERXT1JEMSAqLwoJCWlmIChwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgTEJDSUZfRFdPUkQxX0dST1VQX09GRlNFVCwKCQkJCQkgICZ1bkR3b3JkMSkpIHsKCQkJbkVycm9yID0gMTsKCQkJYnJlYWs7CgkJfQoKCQliU3RhdHVzID0gRVhUUkFDVF9TVEFUVVNfUkVHSVNURVIodW5Ed29yZDEpOwoKCQlpZiAoYlN0YXR1cyAmIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwgJiYKCQkgICAgYlN0YXR1cyAmIExCQ0lGX1NUQVRVU19JMkNfSURMRSkgewoJCQkvKiBiaXRzIDE6MCBhcmUgZXF1YWwgdG8gMSAqLwoJCQlicmVhazsKCQl9Cgl9CgoJaWYgKG5FcnJvciB8fCAobkluZGV4ID49IE1BWF9OVU1fUkVHSVNURVJfUE9MTFMpKSB7CgkJcmV0dXJuIEZBSUxVUkU7Cgl9CgoJLyogU3RlcCAyOiAqLwoJYkNvbnRyb2wgPSAwOwoJYkNvbnRyb2wgfD0gTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEU7CgoJaWYgKHVuQWRkcmVzc2luZ01vZGUgPT0gRFVBTF9CWVRFKSB7CgkJYkNvbnRyb2wgfD0gTEJDSUZfQ09OVFJPTF9UV09fQllURV9BRERSOwoJfQoKCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUl9PRkZTRVQsCgkJCQkgIGJDb250cm9sKSkgewoJCXJldHVybiBGQUlMVVJFOwoJfQoKCS8qIFN0ZXAgMzogKi8KCXVuQWRkcmVzcyB8PSAodW5BZGRyZXNzaW5nTW9kZSA9PSBEVUFMX0JZVEUpID8KCSAgICAodW5FZXByb21JZCA8PCAxNikgOiAodW5FZXByb21JZCA8PCA4KTsKCglpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9BRERSRVNTX1JFR0lTVEVSX09GRlNFVCwKCQkJCSAgIHVuQWRkcmVzcykpIHsKCQlyZXR1cm4gRkFJTFVSRTsKCX0KCgkvKiBTdGVwIDQ6ICovCglmb3IgKG5JbmRleCA9IDA7IG5JbmRleCA8IE1BWF9OVU1fUkVHSVNURVJfUE9MTFM7IG5JbmRleCsrKSB7CgkJLyogUmVhZCByZWdpc3RlcnMgZ3JvdXBlZCBpbiBEV09SRDEgKi8KCQlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIExCQ0lGX0RXT1JEMV9HUk9VUF9PRkZTRVQsCgkJCQkJICAmdW5Ed29yZDEpKSB7CgkJCW5FcnJvciA9IDE7CgkJCWJyZWFrOwoJCX0KCgkJYlN0YXR1cyA9IEVYVFJBQ1RfU1RBVFVTX1JFR0lTVEVSKHVuRHdvcmQxKTsKCgkJaWYgKGJTdGF0dXMgJiBMQkNJRl9TVEFUVVNfUEhZX1FVRVVFX0FWQUlMCgkJICAgICYmIGJTdGF0dXMgJiBMQkNJRl9TVEFUVVNfSTJDX0lETEUpIHsKCQkJLyogSTJDIHJlYWQgY29tcGxldGUgKi8KCQkJYnJlYWs7CgkJfQoJfQoKCWlmIChuRXJyb3IgfHwgKG5JbmRleCA+PSBNQVhfTlVNX1JFR0lTVEVSX1BPTExTKSkgewoJCXJldHVybiBGQUlMVVJFOwoJfQoKCS8qIFN0ZXAgNjogKi8KCSpwYkRhdGEgPSBFWFRSQUNUX0RBVEFfUkVHSVNURVIodW5Ed29yZDEpOwoKCXJldHVybiAoYlN0YXR1cyAmIExCQ0lGX1NUQVRVU19BQ0tfRVJST1IpID8gRkFJTFVSRSA6IFNVQ0NFU1M7Cn0K