LyoKICogIHdpbmJvbmQtY2lyLmMgLSBEcml2ZXIgZm9yIHRoZSBDb25zdW1lciBJUiBmdW5jdGlvbmFsaXR5IG9mIFdpbmJvbmQKICogICAgICAgICAgICAgICAgICBTdXBlckkvTyBjaGlwcy4KICoKICogIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgV2luYm9uZCBXUENEMzc2aSBjaGlwIChQTlAgaWQgV0VDMTAyMiksIGJ1dAogKiAgY291bGQgcHJvYmFibHkgc3VwcG9ydCBvdGhlcnMgKFdpbmJvbmQgV0VDMTAyWCwgTmF0U2VtaSwgZXRjKQogKiAgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zLgogKgogKiAgT3JpZ2luYWwgQXV0aG9yOiBEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+CiAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDEwIERhdmlkIEjkcmRlbWFuIDxkYXZpZEBoYXJkZW1hbi5udT4KICoKICogIERlZGljYXRlZCB0byBteSBkYXVnaHRlciBNYXRpbGRhLCB3aXRob3V0IHdob3NlIGxvdmluZyBhdHRlbnRpb24gdGhpcwogKiAgZHJpdmVyIHdvdWxkIGhhdmUgYmVlbiBmaW5pc2hlZCBpbiBoYWxmIHRoZSB0aW1lIGFuZCB3aXRoIGEgZnJhY3Rpb24KICogIG9mIHRoZSBidWdzLgogKgogKiAgV3JpdHRlbiB1c2luZzoKICogICAgbyBXaW5ib25kIFdQQ0QzNzZJIGRhdGFzaGVldCBoZWxwZnVsbHkgcHJvdmlkZWQgYnkgSmVzc2UgQmFybmVzIGF0IEludGVsCiAqICAgIG8gTmF0U2VtaSBQQzg3MzM4L1BDOTczMzggZGF0YXNoZWV0IChmb3IgdGhlIHNlcmlhbCBwb3J0IHN0dWZmKQogKiAgICBvIERTRFQgZHVtcHMKICoKICogIFN1cHBvcnRlZCBmZWF0dXJlczoKICogICAgbyBXYWtlLU9uLUNJUiBmdW5jdGlvbmFsaXR5CiAqCiAqICBUbyBkbzoKICogICAgbyBMZWFybmluZwogKiAgICBvIElSIFRyYW5zbWl0CiAqCiAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvcG5wLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgojaW5jbHVkZSA8bGludXgvaW8uaD4KI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bWVkaWEvcmMtY29yZS5oPgoKI2RlZmluZSBEUlZOQU1FICJ3aW5ib25kLWNpciIKCi8qIENFSVIgV2FrZS1VcCBSZWdpc3RlcnMsIHJlbGF0aXZlIHRvIGRhdGEtPndiYXNlICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NUTAkweDAzIC8qIENFSVIgUmVjZWl2ZXIgQ29udHJvbAkJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfU1RTCTB4MDQgLyogQ0VJUiBSZWNlaXZlciBTdGF0dXMJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0VWX0VOCTB4MDUgLyogQ0VJUiBSZWNlaXZlciBFdmVudCBFbmFibGUJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfQ05UTAkweDA2IC8qIENFSVIgUmVjZWl2ZXIgQ291bnRlciBMb3cJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfQ05USAkweDA3IC8qIENFSVIgUmVjZWl2ZXIgQ291bnRlciBIaWdoCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0lOREVYCTB4MDggLyogQ0VJUiBSZWNlaXZlciBJbmRleAkJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfREFUQQkweDA5IC8qIENFSVIgUmVjZWl2ZXIgRGF0YQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfQ1NMCTB4MEEgLyogQ0VJUiBSZS4gQ29tcGFyZSBTdHJsZW4JCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NGRzEJMHgwQiAvKiBDRUlSIFJlLiBDb25maWd1cmF0aW9uIDEJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfQ0ZHMgkweDBDIC8qIENFSVIgUmUuIENvbmZpZ3VyYXRpb24gMgkqLwoKLyogQ0VJUiBFbmhhbmNlZCBGdW5jdGlvbmFsaXR5IFJlZ2lzdGVycywgcmVsYXRpdmUgdG8gZGF0YS0+ZWJhc2UgICAgICAgKi8KI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfQ1RTCTB4MDAgLyogRW5oYW5jZWQgSVIgQ29udHJvbCBTdGF0dXMJKi8KI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfQ0NUTAkweDAxIC8qIEluZnJhcmVkIENvdW50ZXIgQ29udHJvbAkqLwojZGVmaW5lIFdCQ0lSX1JFR19FQ0VJUl9DTlRfTE8JMHgwMiAvKiBJbmZyYXJlZCBDb3VudGVyIExTQgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfQ05UX0hJCTB4MDMgLyogSW5mcmFyZWQgQ291bnRlciBNU0IJCSovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0lSRU0JMHgwNCAvKiBJbmZyYXJlZCBFbWl0dGVyIFN0YXR1cwkJKi8KCi8qIFNQMyBCYW5rZWQgUmVnaXN0ZXJzLCByZWxhdGl2ZSB0byBkYXRhLT5zYmFzZSAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19CU1IJMHgwMyAvKiBCYW5rIFNlbGVjdCwgYWxsIGJhbmtzCQkqLwoJCQkJICAgICAgLyogQmFuayAwCQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19SWERBVEEJMHgwMCAvKiBGSUZPIFJYIGRhdGEgKHIpCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfVFhEQVRBCTB4MDAgLyogRklGTyBUWCBkYXRhICh3KQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lFUgkweDAxIC8qIEludGVycnVwdCBFbmFibGUJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19FSVIJMHgwMiAvKiBFdmVudCBJZGVudGlmaWNhdGlvbiAocikJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0ZDUgkweDAyIC8qIEZJRk8gQ29udHJvbCAodykJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19NQ1IJMHgwNCAvKiBNb2RlIENvbnRyb2wJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfTFNSCTB4MDUgLyogTGluayBTdGF0dXMJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfTVNSCTB4MDYgLyogTW9kZW0gU3RhdHVzCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0FTQ1IJMHgwNyAvKiBBdXggU3RhdHVzIGFuZCBDb250cm9sCQkqLwoJCQkJICAgICAgLyogQmFuayAyCQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19CR0RMCTB4MDAgLyogQmF1ZCBEaXZpc29yIExTQgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0JHREgJMHgwMSAvKiBCYXVkIERpdmlzb3IgTVNCCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfRVhDUjEJMHgwMiAvKiBFeHRlbmRlZCBDb250cm9sIDEJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19FWENSMgkweDA0IC8qIEV4dGVuZGVkIENvbnRyb2wgMgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1RYRkxWCTB4MDYgLyogVFggRklGTyBMZXZlbAkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19SWEZMVgkweDA3IC8qIFJYIEZJRk8gTGV2ZWwJCQkqLwoJCQkJICAgICAgLyogQmFuayAzCQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19NUklECTB4MDAgLyogTW9kdWxlIElkZW50aWZpY2F0aW9uCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfU0hfTENSCTB4MDEgLyogTENSIFNoYWRvdwkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19TSF9GQ1IJMHgwMiAvKiBGQ1IgU2hhZG93CQkJKi8KCQkJCSAgICAgIC8qIEJhbmsgNAkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDUjEJMHgwMiAvKiBJbmZyYXJlZCBDb250cm9sIDEJCSovCgkJCQkgICAgICAvKiBCYW5rIDUJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ1IyCTB4MDQgLyogSW5mcmFyZWQgQ29udHJvbCAyCQkqLwoJCQkJICAgICAgLyogQmFuayA2CQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNSMwkweDAwIC8qIEluZnJhcmVkIENvbnRyb2wgMwkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1NJUl9QVwkweDAyIC8qIFNJUiBQdWxzZSBXaWR0aAkJCSovCgkJCQkgICAgICAvKiBCYW5rIDcJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSUlhEQwkweDAwIC8qIElSIFJYIERlbW9kIENvbnRyb2wJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUlRYTUMJMHgwMSAvKiBJUiBUWCBNb2QgQ29udHJvbAkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1JDQ0ZHCTB4MDIgLyogQ0VJUiBDb25maWcJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDRkcxCTB4MDQgLyogSW5mcmFyZWQgQ29uZmlnIDEJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNGRzQJMHgwNyAvKiBJbmZyYXJlZCBDb25maWcgNAkJKi8KCi8qCiAqIE1hZ2ljIHZhbHVlcyBmb2xsb3cKICovCgovKiBObyBpbnRlcnJ1cHRzIGZvciBXQkNJUl9SRUdfU1AzX0lFUiBhbmQgV0JDSVJfUkVHX1NQM19FSVIgKi8KI2RlZmluZSBXQkNJUl9JUlFfTk9ORQkJMHgwMAovKiBSWCBkYXRhIGJpdCBmb3IgV0JDSVJfUkVHX1NQM19JRVIgYW5kIFdCQ0lSX1JFR19TUDNfRUlSICovCiNkZWZpbmUgV0JDSVJfSVJRX1JYCQkweDAxCi8qIE92ZXIvVW5kZXItZmxvdyBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLwojZGVmaW5lIFdCQ0lSX0lSUV9FUlIJCTB4MDQKLyogTGVkIGVuYWJsZS9kaXNhYmxlIGJpdCBmb3IgV0JDSVJfUkVHX0VDRUlSX0NUUyAqLwojZGVmaW5lIFdCQ0lSX0xFRF9FTkFCTEUJMHg4MAovKiBSWCBkYXRhIGF2YWlsYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfTFNSICovCiNkZWZpbmUgV0JDSVJfUlhfQVZBSUwJCTB4MDEKLyogUlggZGlzYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfQVNDUiAqLwojZGVmaW5lIFdCQ0lSX1JYX0RJU0FCTEUJMHgyMAovKiBFeHRlbmRlZCBtb2RlIGVuYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfRVhDUjEgKi8KI2RlZmluZSBXQkNJUl9FWFRfRU5BQkxFCTB4MDEKLyogU2VsZWN0IGNvbXBhcmUgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLwojZGVmaW5lIFdCQ0lSX1JFR1NFTF9DT01QQVJFCTB4MTAKLyogU2VsZWN0IG1hc2sgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLwojZGVmaW5lIFdCQ0lSX1JFR1NFTF9NQVNLCTB4MjAKLyogU3RhcnRpbmcgYWRkcmVzcyBvZiBzZWxlY3RlZCByZWdpc3RlciBpbiBXQkNJUl9SRUdfV0NFSVJfSU5ERVggKi8KI2RlZmluZSBXQkNJUl9SRUdfQUREUjAJCTB4MDAKCi8qIFZhbGlkIGJhbmtzIGZvciB0aGUgU1AzIFVBUlQgKi8KZW51bSB3YmNpcl9iYW5rIHsKCVdCQ0lSX0JBTktfMCAgICAgICAgICA9IDB4MDAsCglXQkNJUl9CQU5LXzEgICAgICAgICAgPSAweDgwLAoJV0JDSVJfQkFOS18yICAgICAgICAgID0gMHhFMCwKCVdCQ0lSX0JBTktfMyAgICAgICAgICA9IDB4RTQsCglXQkNJUl9CQU5LXzQgICAgICAgICAgPSAweEU4LAoJV0JDSVJfQkFOS181ICAgICAgICAgID0gMHhFQywKCVdCQ0lSX0JBTktfNiAgICAgICAgICA9IDB4RjAsCglXQkNJUl9CQU5LXzcgICAgICAgICAgPSAweEY0LAp9OwoKLyogU3VwcG9ydGVkIHBvd2VyLW9uIElSIFByb3RvY29scyAqLwplbnVtIHdiY2lyX3Byb3RvY29sIHsKCUlSX1BST1RPQ09MX1JDNSAgICAgICAgICA9IDB4MCwKCUlSX1BST1RPQ09MX05FQyAgICAgICAgICA9IDB4MSwKCUlSX1BST1RPQ09MX1JDNiAgICAgICAgICA9IDB4MiwKfTsKCi8qIE1pc2MgKi8KI2RlZmluZSBXQkNJUl9OQU1FCSJXaW5ib25kIENJUiIKI2RlZmluZSBXQkNJUl9JRF9GQU1JTFkgICAgICAgICAgMHhGMSAvKiBGYW1pbHkgSUQgZm9yIHRoZSBXUENEMzc2SQkqLwojZGVmaW5lCVdCQ0lSX0lEX0NISVAgICAgICAgICAgICAweDA0IC8qIENoaXAgSUQgZm9yIHRoZSBXUENEMzc2SQkqLwojZGVmaW5lIElOVkFMSURfU0NBTkNPREUgICAweDdGRkZGRkZGIC8qIEludmFsaWQgd2l0aCBhbGwgcHJvdG9zCSovCiNkZWZpbmUgV0FLRVVQX0lPTUVNX0xFTiAgICAgICAgIDB4MTAgLyogV2FrZS1VcCBJL08gUmVnIExlbgkJKi8KI2RlZmluZSBFSEZVTkNfSU9NRU1fTEVOICAgICAgICAgMHgxMCAvKiBFbmhhbmNlZCBGdW5jIEkvTyBSZWcgTGVuCSovCiNkZWZpbmUgU1BfSU9NRU1fTEVOICAgICAgICAgICAgIDB4MDggLyogU2VyaWFsIFBvcnQgMyAoSVIpIFJlZyBMZW4JKi8KCi8qIFBlci1kZXZpY2UgZGF0YSAqLwpzdHJ1Y3Qgd2JjaXJfZGF0YSB7CglzcGlubG9ja190IHNwaW5sb2NrOwoKCXVuc2lnbmVkIGxvbmcgd2Jhc2U7ICAgICAgICAvKiBXYWtlLVVwIEJhc2VhZGRyCQkqLwoJdW5zaWduZWQgbG9uZyBlYmFzZTsgICAgICAgIC8qIEVuaGFuY2VkIEZ1bmMuIEJhc2VhZGRyCSovCgl1bnNpZ25lZCBsb25nIHNiYXNlOyAgICAgICAgLyogU2VyaWFsIFBvcnQgQmFzZWFkZHIJKi8KCXVuc2lnbmVkIGludCAgaXJxOyAgICAgICAgICAvKiBTZXJpYWwgUG9ydCBJUlEJCSovCgoJc3RydWN0IHJjX2RldiAqZGV2OwoKCXN0cnVjdCBsZWRfdHJpZ2dlciAqcnh0cmlnZ2VyOwoJc3RydWN0IGxlZF90cmlnZ2VyICp0eHRyaWdnZXI7CglzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxlZDsKCgkvKiBSWCBpcmRhdGEgc3RhdGUgKi8KCWJvb2wgaXJkYXRhX2FjdGl2ZTsKCWJvb2wgaXJkYXRhX2Vycm9yOwoJc3RydWN0IGlyX3Jhd19ldmVudCBldjsKfTsKCnN0YXRpYyBlbnVtIHdiY2lyX3Byb3RvY29sIHByb3RvY29sID0gSVJfUFJPVE9DT0xfUkM2Owptb2R1bGVfcGFyYW0ocHJvdG9jb2wsIHVpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHByb3RvY29sLCAiSVIgcHJvdG9jb2wgdG8gdXNlIGZvciB0aGUgcG93ZXItb24gY29tbWFuZCAiCgkJICIoMCA9IFJDNSwgMSA9IE5FQywgMiA9IFJDNkEsIGRlZmF1bHQpIik7CgpzdGF0aWMgaW50IGludmVydDsgLyogZGVmYXVsdCA9IDAgKi8KbW9kdWxlX3BhcmFtKGludmVydCwgYm9vbCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaW52ZXJ0LCAiSW52ZXJ0IHRoZSBzaWduYWwgZnJvbSB0aGUgSVIgcmVjZWl2ZXIiKTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgd2FrZV9zYyA9IDB4ODAwRjA0MEM7Cm1vZHVsZV9wYXJhbSh3YWtlX3NjLCB1aW50LCAwNjQ0KTsKTU9EVUxFX1BBUk1fREVTQyh3YWtlX3NjLCAiU2NhbmNvZGUgb2YgdGhlIHBvd2VyLW9uIElSIGNvbW1hbmQiKTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgd2FrZV9yYzZtb2RlID0gNjsKbW9kdWxlX3BhcmFtKHdha2VfcmM2bW9kZSwgdWludCwgMDY0NCk7Ck1PRFVMRV9QQVJNX0RFU0Mod2FrZV9yYzZtb2RlLCAiUkM2IG1vZGUgZm9yIHRoZSBwb3dlci1vbiBjb21tYW5kICIKCQkgIigwID0gMCwgNiA9IDZBLCBkZWZhdWx0KSIpOwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogVVRJTElUWSBGVU5DVElPTlMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogQ2FsbGVyIG5lZWRzIHRvIGhvbGQgd2JjaXJfbG9jayAqLwpzdGF0aWMgdm9pZAp3YmNpcl9zZXRfYml0cyh1bnNpZ25lZCBsb25nIGFkZHIsIHU4IGJpdHMsIHU4IG1hc2spCnsKCXU4IHZhbDsKCgl2YWwgPSBpbmIoYWRkcik7Cgl2YWwgPSAoKHZhbCAmIH5tYXNrKSB8IChiaXRzICYgbWFzaykpOwoJb3V0Yih2YWwsIGFkZHIpOwp9CgovKiBTZWxlY3RzIHRoZSByZWdpc3RlciBiYW5rIGZvciB0aGUgc2VyaWFsIHBvcnQgKi8Kc3RhdGljIGlubGluZSB2b2lkCndiY2lyX3NlbGVjdF9iYW5rKHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhLCBlbnVtIHdiY2lyX2JhbmsgYmFuaykKewoJb3V0YihiYW5rLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQlNSKTsKfQoKc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MKd2JjaXJfbGVkX2JyaWdodG5lc3NfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQp7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IGNvbnRhaW5lcl9vZihsZWRfY2RldiwKCQkJCQkgICAgICAgc3RydWN0IHdiY2lyX2RhdGEsCgkJCQkJICAgICAgIGxlZCk7CgoJaWYgKGluYihkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DVFMpICYgV0JDSVJfTEVEX0VOQUJMRSkKCQlyZXR1cm4gTEVEX0ZVTEw7CgllbHNlCgkJcmV0dXJuIExFRF9PRkY7Cn0KCnN0YXRpYyB2b2lkCndiY2lyX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKCQkJIGVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzcykKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YobGVkX2NkZXYsCgkJCQkJICAgICAgIHN0cnVjdCB3YmNpcl9kYXRhLAoJCQkJCSAgICAgICBsZWQpOwoKCXdiY2lyX3NldF9iaXRzKGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUywKCQkgICAgICAgYnJpZ2h0bmVzcyA9PSBMRURfT0ZGID8gMHgwMCA6IFdCQ0lSX0xFRF9FTkFCTEUsCgkJICAgICAgIFdCQ0lSX0xFRF9FTkFCTEUpOwp9CgovKiBNYW5jaGVzdGVyIGVuY29kZXMgYml0cyB0byBSQzYgbWVzc2FnZSBjZWxscyAoc2VlIHdiY2lyX3NodXRkb3duKSAqLwpzdGF0aWMgdTgKd2JjaXJfdG9fcmM2Y2VsbHModTggdmFsKQp7Cgl1OCBjb2RlZCA9IDB4MDA7CglpbnQgaTsKCgl2YWwgJj0gMHgwRjsKCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCQlpZiAodmFsICYgMHgwMSkKCQkJY29kZWQgfD0gMHgwMiA8PCAoaSAqIDIpOwoJCWVsc2UKCQkJY29kZWQgfD0gMHgwMSA8PCAoaSAqIDIpOwoJCXZhbCA+Pj0gMTsKCX0KCglyZXR1cm4gY29kZWQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBJTlRFUlJVUFQgRlVOQ1RJT05TCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpcnFyZXR1cm5fdAp3YmNpcl9pcnFfaGFuZGxlcihpbnQgaXJxbm8sIHZvaWQgKmNvb2tpZSkKewoJc3RydWN0IHBucF9kZXYgKmRldmljZSA9IGNvb2tpZTsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTggaXJkYXRhWzhdOwoJdTggZGlzYWJsZSA9IHRydWU7Cgl1OCBzdGF0dXM7CglpbnQgaTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoKCXN0YXR1cyA9IGluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRUlSKTsKCglpZiAoIShzdGF0dXMgJiAoV0JDSVJfSVJRX1JYIHwgV0JDSVJfSVJRX0VSUikpKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gSVJRX05PTkU7Cgl9CgoJLyogQ2hlY2sgZm9yIGUuZy4gYnVmZmVyIG92ZXJmbG93ICovCglpZiAoc3RhdHVzICYgV0JDSVJfSVJRX0VSUikgewoJCWRhdGEtPmlyZGF0YV9lcnJvciA9IHRydWU7CgkJaXJfcmF3X2V2ZW50X3Jlc2V0KGRhdGEtPmRldik7Cgl9CgoJaWYgKCEoc3RhdHVzICYgV0JDSVJfSVJRX1JYKSkKCQlnb3RvIG91dDsKCglpZiAoIWRhdGEtPmlyZGF0YV9hY3RpdmUpIHsKCQlkYXRhLT5pcmRhdGFfYWN0aXZlID0gdHJ1ZTsKCQlsZWRfdHJpZ2dlcl9ldmVudChkYXRhLT5yeHRyaWdnZXIsIExFRF9GVUxMKTsKCX0KCgkvKiBTaW5jZSBSWEhETEVWIGlzIHNldCwgYXQgbGVhc3QgOCBieXRlcyBhcmUgaW4gdGhlIEZJRk8gKi8KCWluc2IoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JYREFUQSwgJmlyZGF0YVswXSwgOCk7CgoJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewoJCXU4IHB1bHNlOwoJCXUzMiBkdXJhdGlvbjsKCgkJaWYgKGlyZGF0YVtpXSAhPSAweEZGICYmIGlyZGF0YVtpXSAhPSAweDAwKQoJCQlkaXNhYmxlID0gZmFsc2U7CgoJCWlmIChkYXRhLT5pcmRhdGFfZXJyb3IpCgkJCWNvbnRpbnVlOwoKCQlwdWxzZSA9IGlyZGF0YVtpXSAmIDB4ODAgPyBmYWxzZSA6IHRydWU7CgkJZHVyYXRpb24gPSAoaXJkYXRhW2ldICYgMHg3RikgKiAxMDAwMDsgLyogbnMgKi8KCgkJaWYgKGRhdGEtPmV2LnB1bHNlICE9IHB1bHNlKSB7CgkJCWlmIChkYXRhLT5ldi5kdXJhdGlvbiAhPSAwKSB7CgkJCQlpcl9yYXdfZXZlbnRfc3RvcmUoZGF0YS0+ZGV2LCAmZGF0YS0+ZXYpOwoJCQkJZGF0YS0+ZXYuZHVyYXRpb24gPSAwOwoJCQl9CgoJCQlkYXRhLT5ldi5wdWxzZSA9IHB1bHNlOwoJCX0KCgkJZGF0YS0+ZXYuZHVyYXRpb24gKz0gZHVyYXRpb247Cgl9CgoJaWYgKGRpc2FibGUpIHsKCQlpZiAoZGF0YS0+ZXYuZHVyYXRpb24gIT0gMCAmJiAhZGF0YS0+aXJkYXRhX2Vycm9yKSB7CgkJCWlyX3Jhd19ldmVudF9zdG9yZShkYXRhLT5kZXYsICZkYXRhLT5ldik7CgkJCWRhdGEtPmV2LmR1cmF0aW9uID0gMDsKCQl9CgoJCS8qIFNldCBSWElOQUNUSVZFICovCgkJb3V0YihXQkNJUl9SWF9ESVNBQkxFLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQVNDUik7CgoJCS8qIERyYWluIHRoZSBGSUZPICovCgkJd2hpbGUgKGluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTFNSKSAmIFdCQ0lSX1JYX0FWQUlMKQoJCQlpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JYREFUQSk7CgoJCWlyX3Jhd19ldmVudF9yZXNldChkYXRhLT5kZXYpOwoJCWRhdGEtPmlyZGF0YV9lcnJvciA9IGZhbHNlOwoJCWRhdGEtPmlyZGF0YV9hY3RpdmUgPSBmYWxzZTsKCQlsZWRfdHJpZ2dlcl9ldmVudChkYXRhLT5yeHRyaWdnZXIsIExFRF9PRkYpOwoJfQoKCWlyX3Jhd19ldmVudF9oYW5kbGUoZGF0YS0+ZGV2KTsKCm91dDoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIFNFVFVQL0lOSVQvU1VTUEVORC9SRVNVTUUgRlVOQ1RJT05TCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCndiY2lyX3NodXRkb3duKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCnsKCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkZXZpY2UtPmRldjsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7CglpbnQgZG9fd2FrZSA9IDE7Cgl1OCBtYXRjaFsxMV07Cgl1OCBtYXNrWzExXTsKCXU4IHJjNl9jc2wgPSAwOwoJaW50IGk7CgoJbWVtc2V0KG1hdGNoLCAwLCBzaXplb2YobWF0Y2gpKTsKCW1lbXNldChtYXNrLCAwLCBzaXplb2YobWFzaykpOwoKCWlmICh3YWtlX3NjID09IElOVkFMSURfU0NBTkNPREUgfHwgIWRldmljZV9tYXlfd2FrZXVwKGRldikpIHsKCQlkb193YWtlID0gMDsKCQlnb3RvIGZpbmlzaDsKCX0KCglzd2l0Y2ggKHByb3RvY29sKSB7CgljYXNlIElSX1BST1RPQ09MX1JDNToKCQlpZiAod2FrZV9zYyA+IDB4RkZGKSB7CgkJCWRvX3dha2UgPSAwOwoJCQlkZXZfZXJyKGRldiwgIlJDNSAtIEludmFsaWQgd2FrZSBzY2FuY29kZVxuIik7CgkJCWJyZWFrOwoJCX0KCgkJLyogTWFzayA9IDEzIGJpdHMsIGV4IHRvZ2dsZSAqLwoJCW1hc2tbMF0gPSAweEZGOwoJCW1hc2tbMV0gPSAweDE3OwoKCQltYXRjaFswXSAgPSAod2FrZV9zYyAmIDB4MDAzRik7ICAgICAgLyogNiBjb21tYW5kIGJpdHMgKi8KCQltYXRjaFswXSB8PSAod2FrZV9zYyAmIDB4MDE4MCkgPj4gMTsgLyogMiBhZGRyZXNzIGJpdHMgKi8KCQltYXRjaFsxXSAgPSAod2FrZV9zYyAmIDB4MEUwMCkgPj4gOTsgLyogMyBhZGRyZXNzIGJpdHMgKi8KCQlpZiAoISh3YWtlX3NjICYgMHgwMDQwKSkgICAgICAgICAgICAgLyogMm5kIHN0YXJ0IGJpdCAgKi8KCQkJbWF0Y2hbMV0gfD0gMHgxMDsKCgkJYnJlYWs7CgoJY2FzZSBJUl9QUk9UT0NPTF9ORUM6CgkJaWYgKHdha2Vfc2MgPiAweEZGRkZGRikgewoJCQlkb193YWtlID0gMDsKCQkJZGV2X2VycihkZXYsICJORUMgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOwoJCQlicmVhazsKCQl9CgoJCW1hc2tbMF0gPSBtYXNrWzFdID0gbWFza1syXSA9IG1hc2tbM10gPSAweEZGOwoKCQltYXRjaFsxXSA9IGJpdHJldjgoKHdha2Vfc2MgJiAweEZGKSk7CgkJbWF0Y2hbMF0gPSB+bWF0Y2hbMV07CgoJCW1hdGNoWzNdID0gYml0cmV2OCgod2FrZV9zYyAmIDB4RkYwMCkgPj4gOCk7CgkJaWYgKHdha2Vfc2MgPiAweEZGRkYpCgkJCW1hdGNoWzJdID0gYml0cmV2OCgod2FrZV9zYyAmIDB4RkYwMDAwKSA+PiAxNik7CgkJZWxzZQoJCQltYXRjaFsyXSA9IH5tYXRjaFszXTsKCgkJYnJlYWs7CgoJY2FzZSBJUl9QUk9UT0NPTF9SQzY6CgoJCWlmICh3YWtlX3JjNm1vZGUgPT0gMCkgewoJCQlpZiAod2FrZV9zYyA+IDB4RkZGRikgewoJCQkJZG9fd2FrZSA9IDA7CgkJCQlkZXZfZXJyKGRldiwgIlJDNiAtIEludmFsaWQgd2FrZSBzY2FuY29kZVxuIik7CgkJCQlicmVhazsKCQkJfQoKCQkJLyogQ29tbWFuZCAqLwoJCQltYXRjaFswXSA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDApOwoJCQltYXNrWzBdICA9IDB4RkY7CgkJCW1hdGNoWzFdID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgNCk7CgkJCW1hc2tbMV0gID0gMHhGRjsKCgkJCS8qIEFkZHJlc3MgKi8KCQkJbWF0Y2hbMl0gPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA4KTsKCQkJbWFza1syXSAgPSAweEZGOwoJCQltYXRjaFszXSA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMTIpOwoJCQltYXNrWzNdICA9IDB4RkY7CgoJCQkvKiBIZWFkZXIgKi8KCQkJbWF0Y2hbNF0gPSAweDUwOyAvKiBtb2RlMSA9IG1vZGUwID0gMCwgaWdub3JlIHRvZ2dsZSAqLwoJCQltYXNrWzRdICA9IDB4RjA7CgkJCW1hdGNoWzVdID0gMHgwOTsgLyogc3RhcnQgYml0ID0gMSwgbW9kZTIgPSAwICovCgkJCW1hc2tbNV0gID0gMHgwRjsKCgkJCXJjNl9jc2wgPSA0NDsKCgkJfSBlbHNlIGlmICh3YWtlX3JjNm1vZGUgPT0gNikgewoJCQlpID0gMDsKCgkJCS8qIENvbW1hbmQgKi8KCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgMCk7CgkJCW1hc2tbaSsrXSA9IDB4RkY7CgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDQpOwoJCQltYXNrW2krK10gPSAweEZGOwoKCQkJLyogQWRkcmVzcyArIFRvZ2dsZSAqLwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA4KTsKCQkJbWFza1tpKytdID0gMHhGRjsKCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAxMik7CgkJCW1hc2tbaSsrXSA9IDB4M0Y7CgoJCQkvKiBDdXN0b21lciBiaXRzIDcgLSAwICovCgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMTYpOwoJCQltYXNrW2krK10gPSAweEZGOwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDIwKTsKCQkJbWFza1tpKytdID0gMHhGRjsKCgkJCWlmICh3YWtlX3NjICYgMHg4MDAwMDAwMCkgewoJCQkJLyogQ3VzdG9tZXIgcmFuZ2UgYml0IGFuZCBiaXRzIDE1IC0gOCAqLwoJCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAyNCk7CgkJCQltYXNrW2krK10gPSAweEZGOwoJCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAyOCk7CgkJCQltYXNrW2krK10gPSAweEZGOwoJCQkJcmM2X2NzbCA9IDc2OwoJCQl9IGVsc2UgaWYgKHdha2Vfc2MgPD0gMHgwMDdGRkZGRikgewoJCQkJcmM2X2NzbCA9IDYwOwoJCQl9IGVsc2UgewoJCQkJZG9fd2FrZSA9IDA7CgkJCQlkZXZfZXJyKGRldiwgIlJDNiAtIEludmFsaWQgd2FrZSBzY2FuY29kZVxuIik7CgkJCQlicmVhazsKCQkJfQoKCQkJLyogSGVhZGVyICovCgkJCW1hdGNoW2ldICA9IDB4OTM7IC8qIG1vZGUxID0gbW9kZTAgPSAxLCBzdWJtb2RlID0gMCAqLwoJCQltYXNrW2krK10gPSAweEZGOwoJCQltYXRjaFtpXSAgPSAweDBBOyAvKiBzdGFydCBiaXQgPSAxLCBtb2RlMiA9IDEgKi8KCQkJbWFza1tpKytdID0gMHgwRjsKCgkJfSBlbHNlIHsKCQkJZG9fd2FrZSA9IDA7CgkJCWRldl9lcnIoZGV2LCAiUkM2IC0gSW52YWxpZCB3YWtlIG1vZGVcbiIpOwoJCX0KCgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlkb193YWtlID0gMDsKCQlicmVhazsKCX0KCmZpbmlzaDoKCWlmIChkb193YWtlKSB7CgkJLyogU2V0IGNvbXBhcmUgYW5kIGNvbXBhcmUgbWFzayAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0lOREVYLAoJCQkgICAgICAgV0JDSVJfUkVHU0VMX0NPTVBBUkUgfCBXQkNJUl9SRUdfQUREUjAsCgkJCSAgICAgICAweDNGKTsKCQlvdXRzYihkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9EQVRBLCBtYXRjaCwgMTEpOwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0lOREVYLAoJCQkgICAgICAgV0JDSVJfUkVHU0VMX01BU0sgfCBXQkNJUl9SRUdfQUREUjAsCgkJCSAgICAgICAweDNGKTsKCQlvdXRzYihkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9EQVRBLCBtYXNrLCAxMSk7CgoJCS8qIFJDNiBDb21wYXJlIFN0cmluZyBMZW4gKi8KCQlvdXRiKHJjNl9jc2wsIGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NTTCk7CgoJCS8qIENsZWFyIHN0YXR1cyBiaXRzIE5FQ19SRVAsIEJVRkYsIE1TR19FTkQsIE1BVENIICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfU1RTLCAweDE3LCAweDE3KTsKCgkJLyogQ2xlYXIgQlVGRl9FTiwgQ2xlYXIgRU5EX0VOLCBTZXQgTUFUQ0hfRU4gKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTiwgMHgwMSwgMHgwNyk7CgoJCS8qIFNldCBDRUlSX0VOICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1RMLCAweDAxLCAweDAxKTsKCgl9IGVsc2UgewoJCS8qIENsZWFyIEJVRkZfRU4sIENsZWFyIEVORF9FTiwgQ2xlYXIgTUFUQ0hfRU4gKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTiwgMHgwMCwgMHgwNyk7CgoJCS8qIENsZWFyIENFSVJfRU4gKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DVEwsIDB4MDAsIDB4MDEpOwoJfQoKCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18wKTsKCW91dGIoV0JDSVJfSVJRX05PTkUsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JRVIpOwoKCS8qIERpc2FibGUgTEVEICovCglkYXRhLT5pcmRhdGFfYWN0aXZlID0gZmFsc2U7CglsZWRfdHJpZ2dlcl9ldmVudChkYXRhLT5yeHRyaWdnZXIsIExFRF9PRkYpOwoKCS8qCgkgKiBBQ1BJIHdpbGwgc2V0IHRoZSBIVyBkaXNhYmxlIGJpdCBmb3IgU1AzIHdoaWNoIG1lYW5zIHRoYXQgdGhlCgkgKiBvdXRwdXQgc2lnbmFscyBhcmUgbGVmdCBpbiBhbiB1bmRlZmluZWQgc3RhdGUgd2hpY2ggbWF5IGNhdXNlCgkgKiBzcHVyaW91cyBpbnRlcnJ1cHRzIHdoaWNoIHdlIG5lZWQgdG8gaWdub3JlIHVudGlsIHRoZSBoYXJkd2FyZQoJICogaXMgcmVpbml0aWFsaXplZC4KCSAqLwoJZGlzYWJsZV9pcnEoZGF0YS0+aXJxKTsKfQoKc3RhdGljIGludAp3YmNpcl9zdXNwZW5kKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKewoJd2JjaXJfc2h1dGRvd24oZGV2aWNlKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZAp3YmNpcl9pbml0X2h3KHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhKQp7Cgl1OCB0bXA7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoJb3V0YihXQkNJUl9JUlFfTk9ORSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7CgoJLyogU2V0IFBST1RfU0VMLCBSWF9JTlYsIENsZWFyIENFSVJfRU4gKG5lZWRlZCBmb3IgdGhlIGxlZCkgKi8KCXRtcCA9IHByb3RvY29sIDw8IDQ7CglpZiAoaW52ZXJ0KQoJCXRtcCB8PSAweDA4OwoJb3V0Yih0bXAsIGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCk7CgoJLyogQ2xlYXIgc3RhdHVzIGJpdHMgTkVDX1JFUCwgQlVGRiwgTVNHX0VORCwgTUFUQ0ggKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX1NUUywgMHgxNywgMHgxNyk7CgoJLyogQ2xlYXIgQlVGRl9FTiwgQ2xlYXIgRU5EX0VOLCBDbGVhciBNQVRDSF9FTiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDAsIDB4MDcpOwoKCS8qIFNldCBSQzUgY2VsbCB0aW1lIHRvIGNvcnJlc3BvbmQgdG8gMzYga0h6ICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DRkcxLCAweDRBLCAweDdGKTsKCgkvKiBTZXQgSVJUWF9JTlYgKi8KCWlmIChpbnZlcnQpCgkJb3V0YigweDA0LCBkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DQ1RMKTsKCWVsc2UKCQlvdXRiKDB4MDAsIGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NDVEwpOwoKCS8qCgkgKiBDbGVhciBJUiBMRUQsIHNldCBTUDMgY2xvY2sgdG8gMjRNaHoKCSAqIHNldCBTUDNfSVJSWF9TVyB0byBiaW5hcnkgMDEsIGhlbHBmdWxseSBub3QgZG9jdW1lbnRlZAoJICovCglvdXRiKDB4MTAsIGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUyk7CgoJLyogRW5hYmxlIGV4dGVuZGVkIG1vZGUgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMik7CglvdXRiKFdCQ0lSX0VYVF9FTkFCTEUsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19FWENSMSk7CgoJLyoKCSAqIENvbmZpZ3VyZSBiYXVkIGdlbmVyYXRvciwgSVIgZGF0YSB3aWxsIGJlIHNhbXBsZWQgYXQKCSAqIGEgYml0cmF0ZSBvZjogKDI0TWh6ICogcHJlc2NhbGVyKSAvIChkaXZpc29yICogMTYpLgoJICoKCSAqIFRoZSBFQ0lSIHJlZ2lzdGVycyBpbmNsdWRlIGEgZmxhZyB0byBjaGFuZ2UgdGhlCgkgKiAyNE1oeiBjbG9jayBmcmVxIHRvIDQ4TWh6LgoJICoKCSAqIEl0J3Mgbm90IGRvY3VtZW50ZWQgaW4gdGhlIHNwZWNzLCBidXQgZmlmbyBsZXZlbHMKCSAqIG90aGVyIHRoYW4gMTYgc2VlbXMgdG8gYmUgdW5zdXBwb3J0ZWQuCgkgKi8KCgkvKiBwcmVzY2FsZXIgMS4wLCB0eC9yeCBmaWZvIGx2bCAxNiAqLwoJb3V0YigweDMwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRVhDUjIpOwoKCS8qIFNldCBiYXVkIGRpdmlzb3IgdG8gZ2VuZXJhdGUgb25lIGJ5dGUgcGVyIGJpdC9jZWxsICovCglzd2l0Y2ggKHByb3RvY29sKSB7CgljYXNlIElSX1BST1RPQ09MX1JDNToKCQlvdXRiKDB4QTcsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RMKTsKCQlicmVhazsKCWNhc2UgSVJfUFJPVE9DT0xfUkM2OgoJCW91dGIoMHg1MywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOwoJCWJyZWFrOwoJY2FzZSBJUl9QUk9UT0NPTF9ORUM6CgkJb3V0YigweDY5LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdETCk7CgkJYnJlYWs7Cgl9CglvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RIKTsKCgkvKiBTZXQgQ0VJUiBtb2RlICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoJb3V0YigweEMwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTUNSKTsKCWluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTFNSKTsgLyogQ2xlYXIgTFNSICovCglpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX01TUik7IC8qIENsZWFyIE1TUiAqLwoKCS8qIERpc2FibGUgUlggZGVtb2QsIHJ1bi1sZW5ndGggZW5jb2RpbmcvZGVjb2RpbmcsIHNldCBmcmVxIHNwYW4gKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNyk7CglvdXRiKDB4MTAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19SQ0NGRyk7CgoJLyogRGlzYWJsZSB0aW1lciAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS180KTsKCW91dGIoMHgwMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSQ1IxKTsKCgkvKiBFbmFibGUgTVNSIGludGVycnVwdCwgQ2xlYXIgQVVYX0lSWCAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS181KTsKCW91dGIoMHgwMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSQ1IyKTsKCgkvKiBEaXNhYmxlIENSQyAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS182KTsKCW91dGIoMHgyMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSQ1IzKTsKCgkvKiBTZXQgUlgvVFggKGRlKW1vZHVsYXRpb24gZnJlcSwgbm90IHJlYWxseSB1c2VkICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzcpOwoJb3V0YigweEYyLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJSWERDKTsKCW91dGIoMHg2OSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSVFhNQyk7CgoJLyogU2V0IGludmVydCBhbmQgcGluIGRpcmVjdGlvbiAqLwoJaWYgKGludmVydCkKCQlvdXRiKDB4MTAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNGRzQpOwoJZWxzZQoJCW91dGIoMHgwMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSQ0ZHNCk7CgoJLyogU2V0IEZJRk8gdGhyZXNob2xkcyAoUlggPSA4LCBUWCA9IDMpLCByZXNldCBSWC9UWCAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18wKTsKCW91dGIoMHg5NywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0ZDUik7CgoJLyogQ2xlYXIgQVVYIHN0YXR1cyBiaXRzICovCglvdXRiKDB4RTAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19BU0NSKTsKCgkvKiBDbGVhciBJUiBkZWNvZGluZyBzdGF0ZSAqLwoJZGF0YS0+aXJkYXRhX2FjdGl2ZSA9IGZhbHNlOwoJbGVkX3RyaWdnZXJfZXZlbnQoZGF0YS0+cnh0cmlnZ2VyLCBMRURfT0ZGKTsKCWRhdGEtPmlyZGF0YV9lcnJvciA9IGZhbHNlOwoJZGF0YS0+ZXYuZHVyYXRpb24gPSAwOwoJaXJfcmF3X2V2ZW50X3Jlc2V0KGRhdGEtPmRldik7Cglpcl9yYXdfZXZlbnRfaGFuZGxlKGRhdGEtPmRldik7CgoJLyogRW5hYmxlIGludGVycnVwdHMgKi8KCW91dGIoV0JDSVJfSVJRX1JYIHwgV0JDSVJfSVJRX0VSUiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7Cn0KCnN0YXRpYyBpbnQKd2JjaXJfcmVzdW1lKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7CgoJd2JjaXJfaW5pdF9odyhkYXRhKTsKCWVuYWJsZV9pcnEoZGF0YS0+aXJxKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQKd2JjaXJfcHJvYmUoc3RydWN0IHBucF9kZXYgKmRldmljZSwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCkKewoJc3RydWN0IGRldmljZSAqZGV2ID0gJmRldmljZS0+ZGV2OwoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGE7CglpbnQgZXJyOwoKCWlmICghKHBucF9wb3J0X2xlbihkZXZpY2UsIDApID09IEVIRlVOQ19JT01FTV9MRU4gJiYKCSAgICAgIHBucF9wb3J0X2xlbihkZXZpY2UsIDEpID09IFdBS0VVUF9JT01FTV9MRU4gJiYKCSAgICAgIHBucF9wb3J0X2xlbihkZXZpY2UsIDIpID09IFNQX0lPTUVNX0xFTikpIHsKCQlkZXZfZXJyKGRldiwgIkludmFsaWQgcmVzb3VyY2VzXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKCWlmICghZGF0YSkgewoJCWVyciA9IC1FTk9NRU07CgkJZ290byBleGl0OwoJfQoKCXBucF9zZXRfZHJ2ZGF0YShkZXZpY2UsIGRhdGEpOwoKCXNwaW5fbG9ja19pbml0KCZkYXRhLT5zcGlubG9jayk7CglkYXRhLT5lYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldmljZSwgMCk7CglkYXRhLT53YmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldmljZSwgMSk7CglkYXRhLT5zYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldmljZSwgMik7CglkYXRhLT5pcnEgPSBwbnBfaXJxKGRldmljZSwgMCk7CgoJaWYgKGRhdGEtPndiYXNlID09IDAgfHwgZGF0YS0+ZWJhc2UgPT0gMCB8fAoJICAgIGRhdGEtPnNiYXNlID09IDAgfHwgZGF0YS0+aXJxID09IDApIHsKCQllcnIgPSAtRU5PREVWOwoJCWRldl9lcnIoZGV2LCAiSW52YWxpZCByZXNvdXJjZXNcbiIpOwoJCWdvdG8gZXhpdF9mcmVlX2RhdGE7Cgl9CgoJZGV2X2RiZygmZGV2aWNlLT5kZXYsICJGb3VuZCBkZXZpY2UgIgoJCSIodzogMHglbFgsIGU6IDB4JWxYLCBzOiAweCVsWCwgaTogJXUpXG4iLAoJCWRhdGEtPndiYXNlLCBkYXRhLT5lYmFzZSwgZGF0YS0+c2Jhc2UsIGRhdGEtPmlycSk7CgoJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkYXRhLT53YmFzZSwgV0FLRVVQX0lPTUVNX0xFTiwgRFJWTkFNRSkpIHsKCQlkZXZfZXJyKGRldiwgIlJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5IGluIHVzZSFcbiIsCgkJCWRhdGEtPndiYXNlLCBkYXRhLT53YmFzZSArIFdBS0VVUF9JT01FTV9MRU4gLSAxKTsKCQllcnIgPSAtRUJVU1k7CgkJZ290byBleGl0X2ZyZWVfZGF0YTsKCX0KCglpZiAoIXJlcXVlc3RfcmVnaW9uKGRhdGEtPmViYXNlLCBFSEZVTkNfSU9NRU1fTEVOLCBEUlZOQU1FKSkgewoJCWRldl9lcnIoZGV2LCAiUmVnaW9uIDB4JWx4LTB4JWx4IGFscmVhZHkgaW4gdXNlIVxuIiwKCQkJZGF0YS0+ZWJhc2UsIGRhdGEtPmViYXNlICsgRUhGVU5DX0lPTUVNX0xFTiAtIDEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfcmVsZWFzZV93YmFzZTsKCX0KCglpZiAoIXJlcXVlc3RfcmVnaW9uKGRhdGEtPnNiYXNlLCBTUF9JT01FTV9MRU4sIERSVk5BTUUpKSB7CgkJZGV2X2VycihkZXYsICJSZWdpb24gMHglbHgtMHglbHggYWxyZWFkeSBpbiB1c2UhXG4iLAoJCQlkYXRhLT5zYmFzZSwgZGF0YS0+c2Jhc2UgKyBTUF9JT01FTV9MRU4gLSAxKTsKCQllcnIgPSAtRUJVU1k7CgkJZ290byBleGl0X3JlbGVhc2VfZWJhc2U7Cgl9CgoJZXJyID0gcmVxdWVzdF9pcnEoZGF0YS0+aXJxLCB3YmNpcl9pcnFfaGFuZGxlciwKCQkJICBJUlFGX0RJU0FCTEVELCBEUlZOQU1FLCBkZXZpY2UpOwoJaWYgKGVycikgewoJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNsYWltIElSUSAldVxuIiwgZGF0YS0+aXJxKTsKCQllcnIgPSAtRUJVU1k7CgkJZ290byBleGl0X3JlbGVhc2Vfc2Jhc2U7Cgl9CgoJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKCJjaXItdHgiLCAmZGF0YS0+dHh0cmlnZ2VyKTsKCWlmICghZGF0YS0+dHh0cmlnZ2VyKSB7CgkJZXJyID0gLUVOT01FTTsKCQlnb3RvIGV4aXRfZnJlZV9pcnE7Cgl9CgoJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKCJjaXItcngiLCAmZGF0YS0+cnh0cmlnZ2VyKTsKCWlmICghZGF0YS0+cnh0cmlnZ2VyKSB7CgkJZXJyID0gLUVOT01FTTsKCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl90eHRyaWdnZXI7Cgl9CgoJZGF0YS0+bGVkLm5hbWUgPSAiY2lyOjphY3Rpdml0eSI7CglkYXRhLT5sZWQuZGVmYXVsdF90cmlnZ2VyID0gImNpci1yeCI7CglkYXRhLT5sZWQuYnJpZ2h0bmVzc19zZXQgPSB3YmNpcl9sZWRfYnJpZ2h0bmVzc19zZXQ7CglkYXRhLT5sZWQuYnJpZ2h0bmVzc19nZXQgPSB3YmNpcl9sZWRfYnJpZ2h0bmVzc19nZXQ7CgllcnIgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJmRldmljZS0+ZGV2LCAmZGF0YS0+bGVkKTsKCWlmIChlcnIpCgkJZ290byBleGl0X3VucmVnaXN0ZXJfcnh0cmlnZ2VyOwoKCWRhdGEtPmRldiA9IHJjX2FsbG9jYXRlX2RldmljZSgpOwoJaWYgKCFkYXRhLT5kZXYpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX2xlZDsKCX0KCglkYXRhLT5kZXYtPmRyaXZlcl9uYW1lID0gV0JDSVJfTkFNRTsKCWRhdGEtPmRldi0+aW5wdXRfbmFtZSA9IFdCQ0lSX05BTUU7CglkYXRhLT5kZXYtPmlucHV0X3BoeXMgPSAid2JjaXIvY2lyMCI7CglkYXRhLT5kZXYtPmlucHV0X2lkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKCWRhdGEtPmRldi0+aW5wdXRfaWQudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9XSU5CT05EOwoJZGF0YS0+ZGV2LT5pbnB1dF9pZC5wcm9kdWN0ID0gV0JDSVJfSURfRkFNSUxZOwoJZGF0YS0+ZGV2LT5pbnB1dF9pZC52ZXJzaW9uID0gV0JDSVJfSURfQ0hJUDsKCWRhdGEtPmRldi0+cHJpdiA9IGRhdGE7CglkYXRhLT5kZXYtPmRldi5wYXJlbnQgPSAmZGV2aWNlLT5kZXY7CgoJZXJyID0gcmNfcmVnaXN0ZXJfZGV2aWNlKGRhdGEtPmRldik7CglpZiAoZXJyKQoJCWdvdG8gZXhpdF9mcmVlX3JjOwoKCWRldmljZV9pbml0X3dha2V1cCgmZGV2aWNlLT5kZXYsIDEpOwoKCXdiY2lyX2luaXRfaHcoZGF0YSk7CgoJcmV0dXJuIDA7CgpleGl0X2ZyZWVfcmM6CglyY19mcmVlX2RldmljZShkYXRhLT5kZXYpOwpleGl0X3VucmVnaXN0ZXJfbGVkOgoJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmRhdGEtPmxlZCk7CmV4aXRfdW5yZWdpc3Rlcl9yeHRyaWdnZXI6CglsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShkYXRhLT5yeHRyaWdnZXIpOwpleGl0X3VucmVnaXN0ZXJfdHh0cmlnZ2VyOgoJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoZGF0YS0+dHh0cmlnZ2VyKTsKZXhpdF9mcmVlX2lycToKCWZyZWVfaXJxKGRhdGEtPmlycSwgZGV2aWNlKTsKZXhpdF9yZWxlYXNlX3NiYXNlOgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+c2Jhc2UsIFNQX0lPTUVNX0xFTik7CmV4aXRfcmVsZWFzZV9lYmFzZToKCXJlbGVhc2VfcmVnaW9uKGRhdGEtPmViYXNlLCBFSEZVTkNfSU9NRU1fTEVOKTsKZXhpdF9yZWxlYXNlX3diYXNlOgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+d2Jhc2UsIFdBS0VVUF9JT01FTV9MRU4pOwpleGl0X2ZyZWVfZGF0YToKCWtmcmVlKGRhdGEpOwoJcG5wX3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7CmV4aXQ6CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgdm9pZCBfX2RldmV4aXQKd2JjaXJfcmVtb3ZlKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoJb3V0YihXQkNJUl9JUlFfTk9ORSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7CgoJZnJlZV9pcnEoZGF0YS0+aXJxLCBkZXZpY2UpOwoKCS8qIENsZWFyIHN0YXR1cyBiaXRzIE5FQ19SRVAsIEJVRkYsIE1TR19FTkQsIE1BVENIICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9TVFMsIDB4MTcsIDB4MTcpOwoKCS8qIENsZWFyIENFSVJfRU4gKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCwgMHgwMCwgMHgwMSk7CgoJLyogQ2xlYXIgQlVGRl9FTiwgRU5EX0VOLCBNQVRDSF9FTiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDAsIDB4MDcpOwoKCXJjX3VucmVnaXN0ZXJfZGV2aWNlKGRhdGEtPmRldik7CgoJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoZGF0YS0+cnh0cmlnZ2VyKTsKCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGRhdGEtPnR4dHJpZ2dlcik7CglsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGF0YS0+bGVkKTsKCgkvKiBUaGlzIGlzIG9rIHNpbmNlICZkYXRhLT5sZWQgaXNuJ3QgYWN0dWFsbHkgdXNlZCAqLwoJd2JjaXJfbGVkX2JyaWdodG5lc3Nfc2V0KCZkYXRhLT5sZWQsIExFRF9PRkYpOwoKCXJlbGVhc2VfcmVnaW9uKGRhdGEtPndiYXNlLCBXQUtFVVBfSU9NRU1fTEVOKTsKCXJlbGVhc2VfcmVnaW9uKGRhdGEtPmViYXNlLCBFSEZVTkNfSU9NRU1fTEVOKTsKCXJlbGVhc2VfcmVnaW9uKGRhdGEtPnNiYXNlLCBTUF9JT01FTV9MRU4pOwoKCWtmcmVlKGRhdGEpOwoKCXBucF9zZXRfZHJ2ZGF0YShkZXZpY2UsIE5VTEwpOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgd2JjaXJfaWRzW10gPSB7Cgl7ICJXRUMxMDIyIiwgMCB9LAoJeyAiIiwgMCB9Cn07Ck1PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCB3YmNpcl9pZHMpOwoKc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIHdiY2lyX2RyaXZlciA9IHsKCS5uYW1lICAgICA9IFdCQ0lSX05BTUUsCgkuaWRfdGFibGUgPSB3YmNpcl9pZHMsCgkucHJvYmUgICAgPSB3YmNpcl9wcm9iZSwKCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKHdiY2lyX3JlbW92ZSksCgkuc3VzcGVuZCAgPSB3YmNpcl9zdXNwZW5kLAoJLnJlc3VtZSAgID0gd2JjaXJfcmVzdW1lLAoJLnNodXRkb3duID0gd2JjaXJfc2h1dGRvd24KfTsKCnN0YXRpYyBpbnQgX19pbml0CndiY2lyX2luaXQodm9pZCkKewoJaW50IHJldDsKCglzd2l0Y2ggKHByb3RvY29sKSB7CgljYXNlIElSX1BST1RPQ09MX1JDNToKCWNhc2UgSVJfUFJPVE9DT0xfTkVDOgoJY2FzZSBJUl9QUk9UT0NPTF9SQzY6CgkJYnJlYWs7CglkZWZhdWx0OgoJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IEludmFsaWQgcG93ZXItb24gcHJvdG9jb2xcbiIpOwoJfQoKCXJldCA9IHBucF9yZWdpc3Rlcl9kcml2ZXIoJndiY2lyX2RyaXZlcik7CglpZiAocmV0KQoJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IFVuYWJsZSB0byByZWdpc3RlciBkcml2ZXJcbiIpOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdAp3YmNpcl9leGl0KHZvaWQpCnsKCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmd2JjaXJfZHJpdmVyKTsKfQoKbW9kdWxlX2luaXQod2JjaXJfaW5pdCk7Cm1vZHVsZV9leGl0KHdiY2lyX2V4aXQpOwoKTU9EVUxFX0FVVEhPUigiRGF2aWQgSORyZGVtYW4gPGRhdmlkQGhhcmRlbWFuLm51PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIldpbmJvbmQgU3VwZXJJL08gQ29uc3VtZXIgSVIgRHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK