LyoKICogIHdpbmJvbmQtY2lyLmMgLSBEcml2ZXIgZm9yIHRoZSBDb25zdW1lciBJUiBmdW5jdGlvbmFsaXR5IG9mIFdpbmJvbmQKICogICAgICAgICAgICAgICAgICBTdXBlckkvTyBjaGlwcy4KICoKICogIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgV2luYm9uZCBXUENEMzc2aSBjaGlwIChQTlAgaWQgV0VDMTAyMiksIGJ1dAogKiAgY291bGQgcHJvYmFibHkgc3VwcG9ydCBvdGhlcnMgKFdpbmJvbmQgV0VDMTAyWCwgTmF0U2VtaSwgZXRjKQogKiAgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zLgogKgogKiAgT3JpZ2luYWwgQXV0aG9yOiBEYXZpZCBIw6RyZGVtYW4gPGRhdmlkQGhhcmRlbWFuLm51PgogKiAgICAgQ29weXJpZ2h0IChDKSAyMDA5IC0gMjAxMSBEYXZpZCBIw6RyZGVtYW4gPGRhdmlkQGhhcmRlbWFuLm51PgogKgogKiAgRGVkaWNhdGVkIHRvIG15IGRhdWdodGVyIE1hdGlsZGEsIHdpdGhvdXQgd2hvc2UgbG92aW5nIGF0dGVudGlvbiB0aGlzCiAqICBkcml2ZXIgd291bGQgaGF2ZSBiZWVuIGZpbmlzaGVkIGluIGhhbGYgdGhlIHRpbWUgYW5kIHdpdGggYSBmcmFjdGlvbgogKiAgb2YgdGhlIGJ1Z3MuCiAqCiAqICBXcml0dGVuIHVzaW5nOgogKiAgICBvIFdpbmJvbmQgV1BDRDM3NkkgZGF0YXNoZWV0IGhlbHBmdWxseSBwcm92aWRlZCBieSBKZXNzZSBCYXJuZXMgYXQgSW50ZWwKICogICAgbyBOYXRTZW1pIFBDODczMzgvUEM5NzMzOCBkYXRhc2hlZXQgKGZvciB0aGUgc2VyaWFsIHBvcnQgc3R1ZmYpCiAqICAgIG8gRFNEVCBkdW1wcwogKgogKiAgU3VwcG9ydGVkIGZlYXR1cmVzOgogKiAgICBvIElSIFJlY2VpdmUKICogICAgbyBJUiBUcmFuc21pdAogKiAgICBvIFdha2UtT24tQ0lSIGZ1bmN0aW9uYWxpdHkKICoKICogIFRvIGRvOgogKiAgICBvIExlYXJuaW5nCiAqCiAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwoKI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvcG5wLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgojaW5jbHVkZSA8bGludXgvaW8uaD4KI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvd2FpdC5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPG1lZGlhL3JjLWNvcmUuaD4KCiNkZWZpbmUgRFJWTkFNRSAid2luYm9uZC1jaXIiCgovKiBDRUlSIFdha2UtVXAgUmVnaXN0ZXJzLCByZWxhdGl2ZSB0byBkYXRhLT53YmFzZSAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DVEwJMHgwMyAvKiBDRUlSIFJlY2VpdmVyIENvbnRyb2wJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX1NUUwkweDA0IC8qIENFSVIgUmVjZWl2ZXIgU3RhdHVzCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTgkweDA1IC8qIENFSVIgUmVjZWl2ZXIgRXZlbnQgRW5hYmxlCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NOVEwJMHgwNiAvKiBDRUlSIFJlY2VpdmVyIENvdW50ZXIgTG93CSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NOVEgJMHgwNyAvKiBDRUlSIFJlY2VpdmVyIENvdW50ZXIgSGlnaAkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWAkweDA4IC8qIENFSVIgUmVjZWl2ZXIgSW5kZXgJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0RBVEEJMHgwOSAvKiBDRUlSIFJlY2VpdmVyIERhdGEJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NTTAkweDBBIC8qIENFSVIgUmUuIENvbXBhcmUgU3RybGVuCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DRkcxCTB4MEIgLyogQ0VJUiBSZS4gQ29uZmlndXJhdGlvbiAxCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NGRzIJMHgwQyAvKiBDRUlSIFJlLiBDb25maWd1cmF0aW9uIDIJKi8KCi8qIENFSVIgRW5oYW5jZWQgRnVuY3Rpb25hbGl0eSBSZWdpc3RlcnMsIHJlbGF0aXZlIHRvIGRhdGEtPmViYXNlICAgICAgICovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NUUwkweDAwIC8qIEVuaGFuY2VkIElSIENvbnRyb2wgU3RhdHVzCSovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NDVEwJMHgwMSAvKiBJbmZyYXJlZCBDb3VudGVyIENvbnRyb2wJKi8KI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfQ05UX0xPCTB4MDIgLyogSW5mcmFyZWQgQ291bnRlciBMU0IJCSovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NOVF9ISQkweDAzIC8qIEluZnJhcmVkIENvdW50ZXIgTVNCCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19FQ0VJUl9JUkVNCTB4MDQgLyogSW5mcmFyZWQgRW1pdHRlciBTdGF0dXMJCSovCgovKiBTUDMgQmFua2VkIFJlZ2lzdGVycywgcmVsYXRpdmUgdG8gZGF0YS0+c2Jhc2UgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfQlNSCTB4MDMgLyogQmFuayBTZWxlY3QsIGFsbCBiYW5rcwkJKi8KCQkJCSAgICAgIC8qIEJhbmsgMAkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfUlhEQVRBCTB4MDAgLyogRklGTyBSWCBkYXRhIChyKQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1RYREFUQQkweDAwIC8qIEZJRk8gVFggZGF0YSAodykJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JRVIJMHgwMSAvKiBJbnRlcnJ1cHQgRW5hYmxlCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfRUlSCTB4MDIgLyogRXZlbnQgSWRlbnRpZmljYXRpb24gKHIpCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19GQ1IJMHgwMiAvKiBGSUZPIENvbnRyb2wgKHcpCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfTUNSCTB4MDQgLyogTW9kZSBDb250cm9sCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0xTUgkweDA1IC8qIExpbmsgU3RhdHVzCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX01TUgkweDA2IC8qIE1vZGVtIFN0YXR1cwkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19BU0NSCTB4MDcgLyogQXV4IFN0YXR1cyBhbmQgQ29udHJvbAkJKi8KCQkJCSAgICAgIC8qIEJhbmsgMgkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfQkdETAkweDAwIC8qIEJhdWQgRGl2aXNvciBMU0IJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19CR0RICTB4MDEgLyogQmF1ZCBEaXZpc29yIE1TQgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0VYQ1IxCTB4MDIgLyogRXh0ZW5kZWQgQ29udHJvbCAxCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfRVhDUjIJMHgwNCAvKiBFeHRlbmRlZCBDb250cm9sIDIJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19UWEZMVgkweDA2IC8qIFRYIEZJRk8gTGV2ZWwJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfUlhGTFYJMHgwNyAvKiBSWCBGSUZPIExldmVsCQkJKi8KCQkJCSAgICAgIC8qIEJhbmsgMwkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfTVJJRAkweDAwIC8qIE1vZHVsZSBJZGVudGlmaWNhdGlvbgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1NIX0xDUgkweDAxIC8qIExDUiBTaGFkb3cJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfU0hfRkNSCTB4MDIgLyogRkNSIFNoYWRvdwkJCSovCgkJCQkgICAgICAvKiBCYW5rIDQJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ1IxCTB4MDIgLyogSW5mcmFyZWQgQ29udHJvbCAxCQkqLwoJCQkJICAgICAgLyogQmFuayA1CQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNSMgkweDA0IC8qIEluZnJhcmVkIENvbnRyb2wgMgkJKi8KCQkJCSAgICAgIC8qIEJhbmsgNgkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDUjMJMHgwMCAvKiBJbmZyYXJlZCBDb250cm9sIDMJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19TSVJfUFcJMHgwMiAvKiBTSVIgUHVsc2UgV2lkdGgJCQkqLwoJCQkJICAgICAgLyogQmFuayA3CQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUlJYREMJMHgwMCAvKiBJUiBSWCBEZW1vZCBDb250cm9sCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJUWE1DCTB4MDEgLyogSVIgVFggTW9kIENvbnRyb2wJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19SQ0NGRwkweDAyIC8qIENFSVIgQ29uZmlnCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ0ZHMQkweDA0IC8qIEluZnJhcmVkIENvbmZpZyAxCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDRkc0CTB4MDcgLyogSW5mcmFyZWQgQ29uZmlnIDQJCSovCgovKgogKiBNYWdpYyB2YWx1ZXMgZm9sbG93CiAqLwoKLyogTm8gaW50ZXJydXB0cyBmb3IgV0JDSVJfUkVHX1NQM19JRVIgYW5kIFdCQ0lSX1JFR19TUDNfRUlSICovCiNkZWZpbmUgV0JDSVJfSVJRX05PTkUJCTB4MDAKLyogUlggZGF0YSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLwojZGVmaW5lIFdCQ0lSX0lSUV9SWAkJMHgwMQovKiBUWCBkYXRhIGxvdyBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLwojZGVmaW5lIFdCQ0lSX0lSUV9UWF9MT1cJMHgwMgovKiBPdmVyL1VuZGVyLWZsb3cgYml0IGZvciBXQkNJUl9SRUdfU1AzX0lFUiBhbmQgV0JDSVJfUkVHX1NQM19FSVIgKi8KI2RlZmluZSBXQkNJUl9JUlFfRVJSCQkweDA0Ci8qIFRYIGRhdGEgZW1wdHkgYml0IGZvciBXQkNFSVJfUkVHX1NQM19JRVIgYW5kIFdCQ0lSX1JFR19TUDNfRUlSICovCiNkZWZpbmUgV0JDSVJfSVJRX1RYX0VNUFRZCTB4MjAKLyogTGVkIGVuYWJsZS9kaXNhYmxlIGJpdCBmb3IgV0JDSVJfUkVHX0VDRUlSX0NUUyAqLwojZGVmaW5lIFdCQ0lSX0xFRF9FTkFCTEUJMHg4MAovKiBSWCBkYXRhIGF2YWlsYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfTFNSICovCiNkZWZpbmUgV0JDSVJfUlhfQVZBSUwJCTB4MDEKLyogUlggZGF0YSBvdmVycnVuIGVycm9yIGJpdCBmb3IgV0JDSVJfUkVHX1NQM19MU1IgKi8KI2RlZmluZSBXQkNJUl9SWF9PVkVSUlVOCTB4MDIKLyogVFggRW5kLU9mLVRyYW5zbWlzc2lvbiBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfQVNDUiAqLwojZGVmaW5lIFdCQ0lSX1RYX0VPVAkJMHgwNAovKiBSWCBkaXNhYmxlIGJpdCBmb3IgV0JDSVJfUkVHX1NQM19BU0NSICovCiNkZWZpbmUgV0JDSVJfUlhfRElTQUJMRQkweDIwCi8qIFRYIGRhdGEgdW5kZXJydW4gZXJyb3IgYml0IGZvciBXQkNJUl9SRUdfU1AzX0FTQ1IgKi8KI2RlZmluZSBXQkNJUl9UWF9VTkRFUlJVTgkweDQwCi8qIEV4dGVuZGVkIG1vZGUgZW5hYmxlIGJpdCBmb3IgV0JDSVJfUkVHX1NQM19FWENSMSAqLwojZGVmaW5lIFdCQ0lSX0VYVF9FTkFCTEUJMHgwMQovKiBTZWxlY3QgY29tcGFyZSByZWdpc3RlciBpbiBXQkNJUl9SRUdfV0NFSVJfSU5ERVggKGJpdHMgNSAmIDYpICovCiNkZWZpbmUgV0JDSVJfUkVHU0VMX0NPTVBBUkUJMHgxMAovKiBTZWxlY3QgbWFzayByZWdpc3RlciBpbiBXQkNJUl9SRUdfV0NFSVJfSU5ERVggKGJpdHMgNSAmIDYpICovCiNkZWZpbmUgV0JDSVJfUkVHU0VMX01BU0sJMHgyMAovKiBTdGFydGluZyBhZGRyZXNzIG9mIHNlbGVjdGVkIHJlZ2lzdGVyIGluIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWCAqLwojZGVmaW5lIFdCQ0lSX1JFR19BRERSMAkJMHgwMAoKLyogVmFsaWQgYmFua3MgZm9yIHRoZSBTUDMgVUFSVCAqLwplbnVtIHdiY2lyX2JhbmsgewoJV0JDSVJfQkFOS18wICAgICAgICAgID0gMHgwMCwKCVdCQ0lSX0JBTktfMSAgICAgICAgICA9IDB4ODAsCglXQkNJUl9CQU5LXzIgICAgICAgICAgPSAweEUwLAoJV0JDSVJfQkFOS18zICAgICAgICAgID0gMHhFNCwKCVdCQ0lSX0JBTktfNCAgICAgICAgICA9IDB4RTgsCglXQkNJUl9CQU5LXzUgICAgICAgICAgPSAweEVDLAoJV0JDSVJfQkFOS182ICAgICAgICAgID0gMHhGMCwKCVdCQ0lSX0JBTktfNyAgICAgICAgICA9IDB4RjQsCn07CgovKiBTdXBwb3J0ZWQgcG93ZXItb24gSVIgUHJvdG9jb2xzICovCmVudW0gd2JjaXJfcHJvdG9jb2wgewoJSVJfUFJPVE9DT0xfUkM1ICAgICAgICAgID0gMHgwLAoJSVJfUFJPVE9DT0xfTkVDICAgICAgICAgID0gMHgxLAoJSVJfUFJPVE9DT0xfUkM2ICAgICAgICAgID0gMHgyLAp9OwoKLyogUG9zc2libGUgc3RhdGVzIGZvciBJUiByZWNlcHRpb24gKi8KZW51bSB3YmNpcl9yeHN0YXRlIHsKCVdCQ0lSX1JYU1RBVEVfSU5BQ1RJVkUgPSAwLAoJV0JDSVJfUlhTVEFURV9BQ1RJVkUsCglXQkNJUl9SWFNUQVRFX0VSUk9SCn07CgovKiBQb3NzaWJsZSBzdGF0ZXMgZm9yIElSIHRyYW5zbWlzc2lvbiAqLwplbnVtIHdiY2lyX3R4c3RhdGUgewoJV0JDSVJfVFhTVEFURV9JTkFDVElWRSA9IDAsCglXQkNJUl9UWFNUQVRFX0FDVElWRSwKCVdCQ0lSX1RYU1RBVEVfRE9ORSwKCVdCQ0lSX1RYU1RBVEVfRVJST1IKfTsKCi8qIE1pc2MgKi8KI2RlZmluZSBXQkNJUl9OQU1FCSJXaW5ib25kIENJUiIKI2RlZmluZSBXQkNJUl9JRF9GQU1JTFkgICAgICAgICAgMHhGMSAvKiBGYW1pbHkgSUQgZm9yIHRoZSBXUENEMzc2SQkqLwojZGVmaW5lCVdCQ0lSX0lEX0NISVAgICAgICAgICAgICAweDA0IC8qIENoaXAgSUQgZm9yIHRoZSBXUENEMzc2SQkqLwojZGVmaW5lIElOVkFMSURfU0NBTkNPREUgICAweDdGRkZGRkZGIC8qIEludmFsaWQgd2l0aCBhbGwgcHJvdG9zCSovCiNkZWZpbmUgV0FLRVVQX0lPTUVNX0xFTiAgICAgICAgIDB4MTAgLyogV2FrZS1VcCBJL08gUmVnIExlbgkJKi8KI2RlZmluZSBFSEZVTkNfSU9NRU1fTEVOICAgICAgICAgMHgxMCAvKiBFbmhhbmNlZCBGdW5jIEkvTyBSZWcgTGVuCSovCiNkZWZpbmUgU1BfSU9NRU1fTEVOICAgICAgICAgICAgIDB4MDggLyogU2VyaWFsIFBvcnQgMyAoSVIpIFJlZyBMZW4JKi8KCi8qIFBlci1kZXZpY2UgZGF0YSAqLwpzdHJ1Y3Qgd2JjaXJfZGF0YSB7CglzcGlubG9ja190IHNwaW5sb2NrOwoJc3RydWN0IHJjX2RldiAqZGV2OwoJc3RydWN0IGxlZF9jbGFzc2RldiBsZWQ7CgoJdW5zaWduZWQgbG9uZyB3YmFzZTsgICAgICAgIC8qIFdha2UtVXAgQmFzZWFkZHIJCSovCgl1bnNpZ25lZCBsb25nIGViYXNlOyAgICAgICAgLyogRW5oYW5jZWQgRnVuYy4gQmFzZWFkZHIJKi8KCXVuc2lnbmVkIGxvbmcgc2Jhc2U7ICAgICAgICAvKiBTZXJpYWwgUG9ydCBCYXNlYWRkcgkqLwoJdW5zaWduZWQgaW50ICBpcnE7ICAgICAgICAgIC8qIFNlcmlhbCBQb3J0IElSUQkJKi8KCXU4IGlycW1hc2s7CgoJLyogUlggc3RhdGUgKi8KCWVudW0gd2JjaXJfcnhzdGF0ZSByeHN0YXRlOwoJc3RydWN0IGxlZF90cmlnZ2VyICpyeHRyaWdnZXI7CglzdHJ1Y3QgaXJfcmF3X2V2ZW50IHJ4ZXY7CgoJLyogVFggc3RhdGUgKi8KCWVudW0gd2JjaXJfdHhzdGF0ZSB0eHN0YXRlOwoJc3RydWN0IGxlZF90cmlnZ2VyICp0eHRyaWdnZXI7Cgl1MzIgdHhsZW47Cgl1MzIgdHhvZmY7Cgl1MzIgKnR4YnVmOwoJd2FpdF9xdWV1ZV9oZWFkX3QgdHh3YWl0cTsKCXU4IHR4bWFzazsKCXUzMiB0eGNhcnJpZXI7Cn07CgpzdGF0aWMgZW51bSB3YmNpcl9wcm90b2NvbCBwcm90b2NvbCA9IElSX1BST1RPQ09MX1JDNjsKbW9kdWxlX3BhcmFtKHByb3RvY29sLCB1aW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhwcm90b2NvbCwgIklSIHByb3RvY29sIHRvIHVzZSBmb3IgdGhlIHBvd2VyLW9uIGNvbW1hbmQgIgoJCSAiKDAgPSBSQzUsIDEgPSBORUMsIDIgPSBSQzZBLCBkZWZhdWx0KSIpOwoKc3RhdGljIGludCBpbnZlcnQ7IC8qIGRlZmF1bHQgPSAwICovCm1vZHVsZV9wYXJhbShpbnZlcnQsIGJvb2wsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGludmVydCwgIkludmVydCB0aGUgc2lnbmFsIGZyb20gdGhlIElSIHJlY2VpdmVyIik7CgpzdGF0aWMgaW50IHR4YW5kcng7IC8qIGRlZmF1bHQgPSAwICovCm1vZHVsZV9wYXJhbSh0eGFuZHJ4LCBib29sLCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhpbnZlcnQsICJBbGxvdyBzaW11bHRhbmVvdXMgVFggYW5kIFJYIik7CgpzdGF0aWMgdW5zaWduZWQgaW50IHdha2Vfc2MgPSAweDgwMEYwNDBDOwptb2R1bGVfcGFyYW0od2FrZV9zYywgdWludCwgMDY0NCk7Ck1PRFVMRV9QQVJNX0RFU0Mod2FrZV9zYywgIlNjYW5jb2RlIG9mIHRoZSBwb3dlci1vbiBJUiBjb21tYW5kIik7CgpzdGF0aWMgdW5zaWduZWQgaW50IHdha2VfcmM2bW9kZSA9IDY7Cm1vZHVsZV9wYXJhbSh3YWtlX3JjNm1vZGUsIHVpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHdha2VfcmM2bW9kZSwgIlJDNiBtb2RlIGZvciB0aGUgcG93ZXItb24gY29tbWFuZCAiCgkJICIoMCA9IDAsIDYgPSA2QSwgZGVmYXVsdCkiKTsKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIFVUSUxJVFkgRlVOQ1RJT05TCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIENhbGxlciBuZWVkcyB0byBob2xkIHdiY2lyX2xvY2sgKi8Kc3RhdGljIHZvaWQKd2JjaXJfc2V0X2JpdHModW5zaWduZWQgbG9uZyBhZGRyLCB1OCBiaXRzLCB1OCBtYXNrKQp7Cgl1OCB2YWw7CgoJdmFsID0gaW5iKGFkZHIpOwoJdmFsID0gKCh2YWwgJiB+bWFzaykgfCAoYml0cyAmIG1hc2spKTsKCW91dGIodmFsLCBhZGRyKTsKfQoKLyogU2VsZWN0cyB0aGUgcmVnaXN0ZXIgYmFuayBmb3IgdGhlIHNlcmlhbCBwb3J0ICovCnN0YXRpYyBpbmxpbmUgdm9pZAp3YmNpcl9zZWxlY3RfYmFuayhzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSwgZW51bSB3YmNpcl9iYW5rIGJhbmspCnsKCW91dGIoYmFuaywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JTUik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZAp3YmNpcl9zZXRfaXJxbWFzayhzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSwgdTggaXJxbWFzaykKewoJaWYgKGRhdGEtPmlycW1hc2sgPT0gaXJxbWFzaykKCQlyZXR1cm47CgoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18wKTsKCW91dGIoaXJxbWFzaywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7CglkYXRhLT5pcnFtYXNrID0gaXJxbWFzazsKfQoKc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MKd2JjaXJfbGVkX2JyaWdodG5lc3NfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQp7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IGNvbnRhaW5lcl9vZihsZWRfY2RldiwKCQkJCQkgICAgICAgc3RydWN0IHdiY2lyX2RhdGEsCgkJCQkJICAgICAgIGxlZCk7CgoJaWYgKGluYihkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DVFMpICYgV0JDSVJfTEVEX0VOQUJMRSkKCQlyZXR1cm4gTEVEX0ZVTEw7CgllbHNlCgkJcmV0dXJuIExFRF9PRkY7Cn0KCnN0YXRpYyB2b2lkCndiY2lyX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKCQkJIGVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzcykKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YobGVkX2NkZXYsCgkJCQkJICAgICAgIHN0cnVjdCB3YmNpcl9kYXRhLAoJCQkJCSAgICAgICBsZWQpOwoKCXdiY2lyX3NldF9iaXRzKGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUywKCQkgICAgICAgYnJpZ2h0bmVzcyA9PSBMRURfT0ZGID8gMHgwMCA6IFdCQ0lSX0xFRF9FTkFCTEUsCgkJICAgICAgIFdCQ0lSX0xFRF9FTkFCTEUpOwp9CgovKiBNYW5jaGVzdGVyIGVuY29kZXMgYml0cyB0byBSQzYgbWVzc2FnZSBjZWxscyAoc2VlIHdiY2lyX3NodXRkb3duKSAqLwpzdGF0aWMgdTgKd2JjaXJfdG9fcmM2Y2VsbHModTggdmFsKQp7Cgl1OCBjb2RlZCA9IDB4MDA7CglpbnQgaTsKCgl2YWwgJj0gMHgwRjsKCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCQlpZiAodmFsICYgMHgwMSkKCQkJY29kZWQgfD0gMHgwMiA8PCAoaSAqIDIpOwoJCWVsc2UKCQkJY29kZWQgfD0gMHgwMSA8PCAoaSAqIDIpOwoJCXZhbCA+Pj0gMTsKCX0KCglyZXR1cm4gY29kZWQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBJTlRFUlJVUFQgRlVOQ1RJT05TCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCndiY2lyX2lkbGVfcngoc3RydWN0IHJjX2RldiAqZGV2LCBib29sIGlkbGUpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gZGV2LT5wcml2OwoKCWlmICghaWRsZSAmJiBkYXRhLT5yeHN0YXRlID09IFdCQ0lSX1JYU1RBVEVfSU5BQ1RJVkUpIHsKCQlkYXRhLT5yeHN0YXRlID0gV0JDSVJfUlhTVEFURV9BQ1RJVkU7CgkJbGVkX3RyaWdnZXJfZXZlbnQoZGF0YS0+cnh0cmlnZ2VyLCBMRURfRlVMTCk7Cgl9CgoJaWYgKGlkbGUgJiYgZGF0YS0+cnhzdGF0ZSAhPSBXQkNJUl9SWFNUQVRFX0lOQUNUSVZFKQoJCS8qIFRlbGwgaGFyZHdhcmUgdG8gZ28gaWRsZSBieSBzZXR0aW5nIFJYSU5BQ1RJVkUgKi8KCQlvdXRiKFdCQ0lSX1JYX0RJU0FCTEUsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19BU0NSKTsKfQoKc3RhdGljIHZvaWQKd2JjaXJfaXJxX3J4KHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhLCBzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlKQp7Cgl1OCBpcmRhdGE7CglERUZJTkVfSVJfUkFXX0VWRU5UKHJhd2lyKTsKCgkvKiBTaW5jZSBSWEhETEVWIGlzIHNldCwgYXQgbGVhc3QgOCBieXRlcyBhcmUgaW4gdGhlIEZJRk8gKi8KCXdoaWxlIChpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0xTUikgJiBXQkNJUl9SWF9BVkFJTCkgewoJCWlyZGF0YSA9IGluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfUlhEQVRBKTsKCQlpZiAoZGF0YS0+cnhzdGF0ZSA9PSBXQkNJUl9SWFNUQVRFX0VSUk9SKQoJCQljb250aW51ZTsKCQlyYXdpci5wdWxzZSA9IGlyZGF0YSAmIDB4ODAgPyBmYWxzZSA6IHRydWU7CgkJcmF3aXIuZHVyYXRpb24gPSBVU19UT19OUygoaXJkYXRhICYgMHg3RikgKiAxMCk7CgkJaXJfcmF3X2V2ZW50X3N0b3JlX3dpdGhfZmlsdGVyKGRhdGEtPmRldiwgJnJhd2lyKTsKCX0KCgkvKiBDaGVjayBpZiB3ZSBzaG91bGQgZ28gaWRsZSAqLwoJaWYgKGRhdGEtPmRldi0+aWRsZSkgewoJCWxlZF90cmlnZ2VyX2V2ZW50KGRhdGEtPnJ4dHJpZ2dlciwgTEVEX09GRik7CgkJZGF0YS0+cnhzdGF0ZSA9IFdCQ0lSX1JYU1RBVEVfSU5BQ1RJVkU7Cgl9CgoJaXJfcmF3X2V2ZW50X2hhbmRsZShkYXRhLT5kZXYpOwp9CgpzdGF0aWMgdm9pZAp3YmNpcl9pcnFfdHgoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEpCnsKCXVuc2lnbmVkIGludCBzcGFjZTsKCXVuc2lnbmVkIGludCB1c2VkOwoJdTggYnl0ZXNbMTZdOwoJdTggYnl0ZTsKCglpZiAoIWRhdGEtPnR4YnVmKQoJCXJldHVybjsKCglzd2l0Y2ggKGRhdGEtPnR4c3RhdGUpIHsKCWNhc2UgV0JDSVJfVFhTVEFURV9JTkFDVElWRToKCQkvKiBUWCBGSUZPIGVtcHR5ICovCgkJc3BhY2UgPSAxNjsKCQlsZWRfdHJpZ2dlcl9ldmVudChkYXRhLT50eHRyaWdnZXIsIExFRF9GVUxMKTsKCQlicmVhazsKCWNhc2UgV0JDSVJfVFhTVEFURV9BQ1RJVkU6CgkJLyogVFggRklGTyBsb3cgKDMgYnl0ZXMgb3IgbGVzcykgKi8KCQlzcGFjZSA9IDEzOwoJCWJyZWFrOwoJY2FzZSBXQkNJUl9UWFNUQVRFX0VSUk9SOgoJCXNwYWNlID0gMDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuOwoJfQoKCS8qCgkgKiBUWCBkYXRhIGlzIHJ1bi1sZW5ndGggY29kZWQgaW4gYnl0ZXM6IFlYWFhYWFhYCgkgKiBZID0gc3BhY2UgKDEpIG9yIHB1bHNlICgwKQoJICogWCA9IGR1cmF0aW9uLCBlbmNvZGVkIGFzIChYICsgMSkgKiAxMHVzIChpLmUgMTAgdG8gMTI4MCB1cykKCSAqLwoJZm9yICh1c2VkID0gMDsgdXNlZCA8IHNwYWNlICYmIGRhdGEtPnR4b2ZmICE9IGRhdGEtPnR4bGVuOyB1c2VkKyspIHsKCQlpZiAoZGF0YS0+dHhidWZbZGF0YS0+dHhvZmZdID09IDApIHsKCQkJZGF0YS0+dHhvZmYrKzsKCQkJY29udGludWU7CgkJfQoJCWJ5dGUgPSBtaW4oKHUzMikweDgwLCBkYXRhLT50eGJ1ZltkYXRhLT50eG9mZl0pOwoJCWRhdGEtPnR4YnVmW2RhdGEtPnR4b2ZmXSAtPSBieXRlOwoJCWJ5dGUtLTsKCQlieXRlIHw9IChkYXRhLT50eG9mZiAlIDIgPyAweDgwIDogMHgwMCk7IC8qIHB1bHNlL3NwYWNlICovCgkJYnl0ZXNbdXNlZF0gPSBieXRlOwoJfQoKCXdoaWxlIChkYXRhLT50eGJ1ZltkYXRhLT50eG9mZl0gPT0gMCAmJiBkYXRhLT50eG9mZiAhPSBkYXRhLT50eGxlbikKCQlkYXRhLT50eG9mZisrOwoKCWlmICh1c2VkID09IDApIHsKCQkvKiBGaW5pc2hlZCAqLwoJCWlmIChkYXRhLT50eHN0YXRlID09IFdCQ0lSX1RYU1RBVEVfRVJST1IpCgkJCS8qIENsZWFyIFRYIHVuZGVycnVuIGJpdCAqLwoJCQlvdXRiKFdCQ0lSX1RYX1VOREVSUlVOLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQVNDUik7CgkJZWxzZQoJCQlkYXRhLT50eHN0YXRlID0gV0JDSVJfVFhTVEFURV9ET05FOwoJCXdiY2lyX3NldF9pcnFtYXNrKGRhdGEsIFdCQ0lSX0lSUV9SWCB8IFdCQ0lSX0lSUV9FUlIpOwoJCWxlZF90cmlnZ2VyX2V2ZW50KGRhdGEtPnR4dHJpZ2dlciwgTEVEX09GRik7CgkJd2FrZV91cCgmZGF0YS0+dHh3YWl0cSk7Cgl9IGVsc2UgaWYgKGRhdGEtPnR4b2ZmID09IGRhdGEtPnR4bGVuKSB7CgkJLyogQXQgdGhlIGVuZCBvZiB0cmFuc21pc3Npb24sIHRlbGwgdGhlIGh3IGJlZm9yZSBsYXN0IGJ5dGUgKi8KCQlvdXRzYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfVFhEQVRBLCBieXRlcywgdXNlZCAtIDEpOwoJCW91dGIoV0JDSVJfVFhfRU9ULCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQVNDUik7CgkJb3V0YihieXRlc1t1c2VkIC0gMV0sIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19UWERBVEEpOwoJCXdiY2lyX3NldF9pcnFtYXNrKGRhdGEsIFdCQ0lSX0lSUV9SWCB8IFdCQ0lSX0lSUV9FUlIgfAoJCQkJICBXQkNJUl9JUlFfVFhfRU1QVFkpOwoJfSBlbHNlIHsKCQkvKiBNb3JlIGRhdGEgdG8gZm9sbG93Li4uICovCgkJb3V0c2IoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JYREFUQSwgYnl0ZXMsIHVzZWQpOwoJCWlmIChkYXRhLT50eHN0YXRlID09IFdCQ0lSX1RYU1RBVEVfSU5BQ1RJVkUpIHsKCQkJd2JjaXJfc2V0X2lycW1hc2soZGF0YSwgV0JDSVJfSVJRX1JYIHwgV0JDSVJfSVJRX0VSUiB8CgkJCQkJICBXQkNJUl9JUlFfVFhfTE9XKTsKCQkJZGF0YS0+dHhzdGF0ZSA9IFdCQ0lSX1RYU1RBVEVfQUNUSVZFOwoJCX0KCX0KfQoKc3RhdGljIGlycXJldHVybl90CndiY2lyX2lycV9oYW5kbGVyKGludCBpcnFubywgdm9pZCAqY29va2llKQp7CglzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlID0gY29va2llOwoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBwbnBfZ2V0X2RydmRhdGEoZGV2aWNlKTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1OCBzdGF0dXM7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7Cgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoJc3RhdHVzID0gaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19FSVIpOwoJc3RhdHVzICY9IGRhdGEtPmlycW1hc2s7CgoJaWYgKCFzdGF0dXMpIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwoJCXJldHVybiBJUlFfTk9ORTsKCX0KCglpZiAoc3RhdHVzICYgV0JDSVJfSVJRX0VSUikgewoJCS8qIFJYIG92ZXJmbG93PyAocmVhZCBjbGVhcnMgYml0KSAqLwoJCWlmIChpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0xTUikgJiBXQkNJUl9SWF9PVkVSUlVOKSB7CgkJCWRhdGEtPnJ4c3RhdGUgPSBXQkNJUl9SWFNUQVRFX0VSUk9SOwoJCQlpcl9yYXdfZXZlbnRfcmVzZXQoZGF0YS0+ZGV2KTsKCQl9CgoJCS8qIFRYIHVuZGVyZmxvdz8gKi8KCQlpZiAoaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19BU0NSKSAmIFdCQ0lSX1RYX1VOREVSUlVOKQoJCQlkYXRhLT50eHN0YXRlID0gV0JDSVJfVFhTVEFURV9FUlJPUjsKCX0KCglpZiAoc3RhdHVzICYgV0JDSVJfSVJRX1JYKQoJCXdiY2lyX2lycV9yeChkYXRhLCBkZXZpY2UpOwoKCWlmIChzdGF0dXMgJiAoV0JDSVJfSVJRX1RYX0xPVyB8IFdCQ0lSX0lSUV9UWF9FTVBUWSkpCgkJd2JjaXJfaXJxX3R4KGRhdGEpOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBSQy1DT1JFIElOVEVSRkFDRSBGVU5DVElPTlMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludAp3YmNpcl90eGNhcnJpZXIoc3RydWN0IHJjX2RldiAqZGV2LCB1MzIgY2FycmllcikKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBkZXYtPnByaXY7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTggdmFsOwoJdTMyIGZyZXE7CgoJZnJlcSA9IERJVl9ST1VORF9DTE9TRVNUKGNhcnJpZXIsIDEwMDApOwoJaWYgKGZyZXEgPCAzMCB8fCBmcmVxID4gNjApCgkJcmV0dXJuIC1FSU5WQUw7CgoJc3dpdGNoIChmcmVxKSB7CgljYXNlIDU4OgoJY2FzZSA1OToKCWNhc2UgNjA6CgkJdmFsID0gZnJlcSAtIDU4OwoJCWZyZXEgKj0gMTAwMDsKCQlicmVhazsKCWNhc2UgNTc6CgkJdmFsID0gZnJlcSAtIDI3OwoJCWZyZXEgPSA1NjkwMDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJdmFsID0gZnJlcSAtIDI3OwoJCWZyZXEgKj0gMTAwMDsKCQlicmVhazsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCWlmIChkYXRhLT50eHN0YXRlICE9IFdCQ0lSX1RYU1RBVEVfSU5BQ1RJVkUpIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJaWYgKGRhdGEtPnR4Y2FycmllciAhPSBmcmVxKSB7CgkJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS183KTsKCQl3YmNpcl9zZXRfYml0cyhkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJUWE1DLCB2YWwsIDB4MUYpOwoJCWRhdGEtPnR4Y2FycmllciA9IGZyZXE7Cgl9CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CndiY2lyX3R4bWFzayhzdHJ1Y3QgcmNfZGV2ICpkZXYsIHUzMiBtYXNrKQp7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IGRldi0+cHJpdjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1OCB2YWw7CgoJLyogRm91ciBvdXRwdXRzLCBvbmx5IG9uZSBvdXRwdXQgY2FuIGJlIGVuYWJsZWQgYXQgYSB0aW1lICovCglzd2l0Y2ggKG1hc2spIHsKCWNhc2UgMHgxOgoJCXZhbCA9IDB4MDsKCQlicmVhazsKCWNhc2UgMHgyOgoJCXZhbCA9IDB4MTsKCQlicmVhazsKCWNhc2UgMHg0OgoJCXZhbCA9IDB4MjsKCQlicmVhazsKCWNhc2UgMHg4OgoJCXZhbCA9IDB4MzsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CglpZiAoZGF0YS0+dHhzdGF0ZSAhPSBXQkNJUl9UWFNUQVRFX0lOQUNUSVZFKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLUVCVVNZOwoJfQoKCWlmIChkYXRhLT50eG1hc2sgIT0gbWFzaykgewoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUywgdmFsLCAweDBjKTsKCQlkYXRhLT50eG1hc2sgPSBtYXNrOwoJfQoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludAp3YmNpcl90eChzdHJ1Y3QgcmNfZGV2ICpkZXYsIHVuc2lnbmVkICpidWYsIHVuc2lnbmVkIGNvdW50KQp7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IGRldi0+cHJpdjsKCXVuc2lnbmVkIGk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCS8qIE5vdCBzdXJlIGlmIHRoaXMgaXMgcG9zc2libGUsIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5ICovCglzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCWlmIChkYXRhLT50eHN0YXRlICE9IFdCQ0lSX1RYU1RBVEVfSU5BQ1RJVkUpIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJLyogQ29udmVydCB2YWx1ZXMgdG8gbXVsdGlwbGVzIG9mIDEwdXMgKi8KCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQoJCWJ1ZltpXSA9IERJVl9ST1VORF9DTE9TRVNUKGJ1ZltpXSwgMTApOwoKCS8qIEZpbGwgdGhlIFRYIGZpZm8gb25jZSwgdGhlIGlycSBoYW5kbGVyIHdpbGwgZG8gdGhlIHJlc3QgKi8KCWRhdGEtPnR4YnVmID0gYnVmOwoJZGF0YS0+dHhsZW4gPSBjb3VudDsKCWRhdGEtPnR4b2ZmID0gMDsKCXdiY2lyX2lycV90eChkYXRhKTsKCgkvKiBXYWl0IGZvciB0aGUgVFggdG8gY29tcGxldGUgKi8KCXdoaWxlIChkYXRhLT50eHN0YXRlID09IFdCQ0lSX1RYU1RBVEVfQUNUSVZFKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCQl3YWl0X2V2ZW50KGRhdGEtPnR4d2FpdHEsIGRhdGEtPnR4c3RhdGUgIT0gV0JDSVJfVFhTVEFURV9BQ1RJVkUpOwoJCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwoJfQoKCS8qIFdlJ3JlIGRvbmUgKi8KCWlmIChkYXRhLT50eHN0YXRlID09IFdCQ0lSX1RYU1RBVEVfRVJST1IpCgkJY291bnQgPSAtRUFHQUlOOwoJZGF0YS0+dHhzdGF0ZSA9IFdCQ0lSX1RYU1RBVEVfSU5BQ1RJVkU7CglkYXRhLT50eGJ1ZiA9IE5VTEw7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwoKCXJldHVybiBjb3VudDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIFNFVFVQL0lOSVQvU1VTUEVORC9SRVNVTUUgRlVOQ1RJT05TCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCndiY2lyX3NodXRkb3duKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCnsKCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkZXZpY2UtPmRldjsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7Cglib29sIGRvX3dha2UgPSB0cnVlOwoJdTggbWF0Y2hbMTFdOwoJdTggbWFza1sxMV07Cgl1OCByYzZfY3NsID0gMDsKCWludCBpOwoKCW1lbXNldChtYXRjaCwgMCwgc2l6ZW9mKG1hdGNoKSk7CgltZW1zZXQobWFzaywgMCwgc2l6ZW9mKG1hc2spKTsKCglpZiAod2FrZV9zYyA9PSBJTlZBTElEX1NDQU5DT0RFIHx8ICFkZXZpY2VfbWF5X3dha2V1cChkZXYpKSB7CgkJZG9fd2FrZSA9IGZhbHNlOwoJCWdvdG8gZmluaXNoOwoJfQoKCXN3aXRjaCAocHJvdG9jb2wpIHsKCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgoJCWlmICh3YWtlX3NjID4gMHhGRkYpIHsKCQkJZG9fd2FrZSA9IGZhbHNlOwoJCQlkZXZfZXJyKGRldiwgIlJDNSAtIEludmFsaWQgd2FrZSBzY2FuY29kZVxuIik7CgkJCWJyZWFrOwoJCX0KCgkJLyogTWFzayA9IDEzIGJpdHMsIGV4IHRvZ2dsZSAqLwoJCW1hc2tbMF0gPSAweEZGOwoJCW1hc2tbMV0gPSAweDE3OwoKCQltYXRjaFswXSAgPSAod2FrZV9zYyAmIDB4MDAzRik7ICAgICAgLyogNiBjb21tYW5kIGJpdHMgKi8KCQltYXRjaFswXSB8PSAod2FrZV9zYyAmIDB4MDE4MCkgPj4gMTsgLyogMiBhZGRyZXNzIGJpdHMgKi8KCQltYXRjaFsxXSAgPSAod2FrZV9zYyAmIDB4MEUwMCkgPj4gOTsgLyogMyBhZGRyZXNzIGJpdHMgKi8KCQlpZiAoISh3YWtlX3NjICYgMHgwMDQwKSkgICAgICAgICAgICAgLyogMm5kIHN0YXJ0IGJpdCAgKi8KCQkJbWF0Y2hbMV0gfD0gMHgxMDsKCgkJYnJlYWs7CgoJY2FzZSBJUl9QUk9UT0NPTF9ORUM6CgkJaWYgKHdha2Vfc2MgPiAweEZGRkZGRikgewoJCQlkb193YWtlID0gZmFsc2U7CgkJCWRldl9lcnIoZGV2LCAiTkVDIC0gSW52YWxpZCB3YWtlIHNjYW5jb2RlXG4iKTsKCQkJYnJlYWs7CgkJfQoKCQltYXNrWzBdID0gbWFza1sxXSA9IG1hc2tbMl0gPSBtYXNrWzNdID0gMHhGRjsKCgkJbWF0Y2hbMV0gPSBiaXRyZXY4KCh3YWtlX3NjICYgMHhGRikpOwoJCW1hdGNoWzBdID0gfm1hdGNoWzFdOwoKCQltYXRjaFszXSA9IGJpdHJldjgoKHdha2Vfc2MgJiAweEZGMDApID4+IDgpOwoJCWlmICh3YWtlX3NjID4gMHhGRkZGKQoJCQltYXRjaFsyXSA9IGJpdHJldjgoKHdha2Vfc2MgJiAweEZGMDAwMCkgPj4gMTYpOwoJCWVsc2UKCQkJbWF0Y2hbMl0gPSB+bWF0Y2hbM107CgoJCWJyZWFrOwoKCWNhc2UgSVJfUFJPVE9DT0xfUkM2OgoKCQlpZiAod2FrZV9yYzZtb2RlID09IDApIHsKCQkJaWYgKHdha2Vfc2MgPiAweEZGRkYpIHsKCQkJCWRvX3dha2UgPSBmYWxzZTsKCQkJCWRldl9lcnIoZGV2LCAiUkM2IC0gSW52YWxpZCB3YWtlIHNjYW5jb2RlXG4iKTsKCQkJCWJyZWFrOwoJCQl9CgoJCQkvKiBDb21tYW5kICovCgkJCW1hdGNoWzBdID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgMCk7CgkJCW1hc2tbMF0gID0gMHhGRjsKCQkJbWF0Y2hbMV0gPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA0KTsKCQkJbWFza1sxXSAgPSAweEZGOwoKCQkJLyogQWRkcmVzcyAqLwoJCQltYXRjaFsyXSA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDgpOwoJCQltYXNrWzJdICA9IDB4RkY7CgkJCW1hdGNoWzNdID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAxMik7CgkJCW1hc2tbM10gID0gMHhGRjsKCgkJCS8qIEhlYWRlciAqLwoJCQltYXRjaFs0XSA9IDB4NTA7IC8qIG1vZGUxID0gbW9kZTAgPSAwLCBpZ25vcmUgdG9nZ2xlICovCgkJCW1hc2tbNF0gID0gMHhGMDsKCQkJbWF0Y2hbNV0gPSAweDA5OyAvKiBzdGFydCBiaXQgPSAxLCBtb2RlMiA9IDAgKi8KCQkJbWFza1s1XSAgPSAweDBGOwoKCQkJcmM2X2NzbCA9IDQ0OwoKCQl9IGVsc2UgaWYgKHdha2VfcmM2bW9kZSA9PSA2KSB7CgkJCWkgPSAwOwoKCQkJLyogQ29tbWFuZCAqLwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICAwKTsKCQkJbWFza1tpKytdID0gMHhGRjsKCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgNCk7CgkJCW1hc2tbaSsrXSA9IDB4RkY7CgoJCQkvKiBBZGRyZXNzICsgVG9nZ2xlICovCgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDgpOwoJCQltYXNrW2krK10gPSAweEZGOwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDEyKTsKCQkJbWFza1tpKytdID0gMHgzRjsKCgkJCS8qIEN1c3RvbWVyIGJpdHMgNyAtIDAgKi8KCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAxNik7CgkJCW1hc2tbaSsrXSA9IDB4RkY7CgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMjApOwoJCQltYXNrW2krK10gPSAweEZGOwoKCQkJaWYgKHdha2Vfc2MgJiAweDgwMDAwMDAwKSB7CgkJCQkvKiBDdXN0b21lciByYW5nZSBiaXQgYW5kIGJpdHMgMTUgLSA4ICovCgkJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDI0KTsKCQkJCW1hc2tbaSsrXSA9IDB4RkY7CgkJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDI4KTsKCQkJCW1hc2tbaSsrXSA9IDB4RkY7CgkJCQlyYzZfY3NsID0gNzY7CgkJCX0gZWxzZSBpZiAod2FrZV9zYyA8PSAweDAwN0ZGRkZGKSB7CgkJCQlyYzZfY3NsID0gNjA7CgkJCX0gZWxzZSB7CgkJCQlkb193YWtlID0gZmFsc2U7CgkJCQlkZXZfZXJyKGRldiwgIlJDNiAtIEludmFsaWQgd2FrZSBzY2FuY29kZVxuIik7CgkJCQlicmVhazsKCQkJfQoKCQkJLyogSGVhZGVyICovCgkJCW1hdGNoW2ldICA9IDB4OTM7IC8qIG1vZGUxID0gbW9kZTAgPSAxLCBzdWJtb2RlID0gMCAqLwoJCQltYXNrW2krK10gPSAweEZGOwoJCQltYXRjaFtpXSAgPSAweDBBOyAvKiBzdGFydCBiaXQgPSAxLCBtb2RlMiA9IDEgKi8KCQkJbWFza1tpKytdID0gMHgwRjsKCgkJfSBlbHNlIHsKCQkJZG9fd2FrZSA9IGZhbHNlOwoJCQlkZXZfZXJyKGRldiwgIlJDNiAtIEludmFsaWQgd2FrZSBtb2RlXG4iKTsKCQl9CgoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJZG9fd2FrZSA9IGZhbHNlOwoJCWJyZWFrOwoJfQoKZmluaXNoOgoJaWYgKGRvX3dha2UpIHsKCQkvKiBTZXQgY29tcGFyZSBhbmQgY29tcGFyZSBtYXNrICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfSU5ERVgsCgkJCSAgICAgICBXQkNJUl9SRUdTRUxfQ09NUEFSRSB8IFdCQ0lSX1JFR19BRERSMCwKCQkJICAgICAgIDB4M0YpOwoJCW91dHNiKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0RBVEEsIG1hdGNoLCAxMSk7CgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfSU5ERVgsCgkJCSAgICAgICBXQkNJUl9SRUdTRUxfTUFTSyB8IFdCQ0lSX1JFR19BRERSMCwKCQkJICAgICAgIDB4M0YpOwoJCW91dHNiKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0RBVEEsIG1hc2ssIDExKTsKCgkJLyogUkM2IENvbXBhcmUgU3RyaW5nIExlbiAqLwoJCW91dGIocmM2X2NzbCwgZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1NMKTsKCgkJLyogQ2xlYXIgc3RhdHVzIGJpdHMgTkVDX1JFUCwgQlVGRiwgTVNHX0VORCwgTUFUQ0ggKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9TVFMsIDB4MTcsIDB4MTcpOwoKCQkvKiBDbGVhciBCVUZGX0VOLCBDbGVhciBFTkRfRU4sIFNldCBNQVRDSF9FTiAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0VWX0VOLCAweDAxLCAweDA3KTsKCgkJLyogU2V0IENFSVJfRU4gKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DVEwsIDB4MDEsIDB4MDEpOwoKCX0gZWxzZSB7CgkJLyogQ2xlYXIgQlVGRl9FTiwgQ2xlYXIgRU5EX0VOLCBDbGVhciBNQVRDSF9FTiAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0VWX0VOLCAweDAwLCAweDA3KTsKCgkJLyogQ2xlYXIgQ0VJUl9FTiAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCwgMHgwMCwgMHgwMSk7Cgl9CgoJLyoKCSAqIEFDUEkgd2lsbCBzZXQgdGhlIEhXIGRpc2FibGUgYml0IGZvciBTUDMgd2hpY2ggbWVhbnMgdGhhdCB0aGUKCSAqIG91dHB1dCBzaWduYWxzIGFyZSBsZWZ0IGluIGFuIHVuZGVmaW5lZCBzdGF0ZSB3aGljaCBtYXkgY2F1c2UKCSAqIHNwdXJpb3VzIGludGVycnVwdHMgd2hpY2ggd2UgbmVlZCB0byBpZ25vcmUgdW50aWwgdGhlIGhhcmR3YXJlCgkgKiBpcyByZWluaXRpYWxpemVkLgoJICovCgl3YmNpcl9zZXRfaXJxbWFzayhkYXRhLCBXQkNJUl9JUlFfTk9ORSk7CglkaXNhYmxlX2lycShkYXRhLT5pcnEpOwoKCS8qIERpc2FibGUgTEVEICovCglsZWRfdHJpZ2dlcl9ldmVudChkYXRhLT5yeHRyaWdnZXIsIExFRF9PRkYpOwoJbGVkX3RyaWdnZXJfZXZlbnQoZGF0YS0+dHh0cmlnZ2VyLCBMRURfT0ZGKTsKfQoKc3RhdGljIGludAp3YmNpcl9zdXNwZW5kKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKewoJd2JjaXJfc2h1dGRvd24oZGV2aWNlKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZAp3YmNpcl9pbml0X2h3KHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhKQp7Cgl1OCB0bXA7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCgl3YmNpcl9zZXRfaXJxbWFzayhkYXRhLCBXQkNJUl9JUlFfTk9ORSk7CgoJLyogU2V0IFBST1RfU0VMLCBSWF9JTlYsIENsZWFyIENFSVJfRU4gKG5lZWRlZCBmb3IgdGhlIGxlZCkgKi8KCXRtcCA9IHByb3RvY29sIDw8IDQ7CglpZiAoaW52ZXJ0KQoJCXRtcCB8PSAweDA4OwoJb3V0Yih0bXAsIGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCk7CgoJLyogQ2xlYXIgc3RhdHVzIGJpdHMgTkVDX1JFUCwgQlVGRiwgTVNHX0VORCwgTUFUQ0ggKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX1NUUywgMHgxNywgMHgxNyk7CgoJLyogQ2xlYXIgQlVGRl9FTiwgQ2xlYXIgRU5EX0VOLCBDbGVhciBNQVRDSF9FTiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDAsIDB4MDcpOwoKCS8qIFNldCBSQzUgY2VsbCB0aW1lIHRvIGNvcnJlc3BvbmQgdG8gMzYga0h6ICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DRkcxLCAweDRBLCAweDdGKTsKCgkvKiBTZXQgSVJUWF9JTlYgKi8KCWlmIChpbnZlcnQpCgkJb3V0YigweDA0LCBkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DQ1RMKTsKCWVsc2UKCQlvdXRiKDB4MDAsIGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NDVEwpOwoKCS8qCgkgKiBDbGVhciBJUiBMRUQsIHNldCBTUDMgY2xvY2sgdG8gMjRNaHosIHNldCBUWCBtYXNrIHRvIElSVFgxLAoJICogc2V0IFNQM19JUlJYX1NXIHRvIGJpbmFyeSAwMSwgaGVscGZ1bGx5IG5vdCBkb2N1bWVudGVkCgkgKi8KCW91dGIoMHgxMCwgZGF0YS0+ZWJhc2UgKyBXQkNJUl9SRUdfRUNFSVJfQ1RTKTsKCWRhdGEtPnR4bWFzayA9IDB4MTsKCgkvKiBFbmFibGUgZXh0ZW5kZWQgbW9kZSAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18yKTsKCW91dGIoV0JDSVJfRVhUX0VOQUJMRSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0VYQ1IxKTsKCgkvKgoJICogQ29uZmlndXJlIGJhdWQgZ2VuZXJhdG9yLCBJUiBkYXRhIHdpbGwgYmUgc2FtcGxlZCBhdAoJICogYSBiaXRyYXRlIG9mOiAoMjRNaHogKiBwcmVzY2FsZXIpIC8gKGRpdmlzb3IgKiAxNikuCgkgKgoJICogVGhlIEVDSVIgcmVnaXN0ZXJzIGluY2x1ZGUgYSBmbGFnIHRvIGNoYW5nZSB0aGUKCSAqIDI0TWh6IGNsb2NrIGZyZXEgdG8gNDhNaHouCgkgKgoJICogSXQncyBub3QgZG9jdW1lbnRlZCBpbiB0aGUgc3BlY3MsIGJ1dCBmaWZvIGxldmVscwoJICogb3RoZXIgdGhhbiAxNiBzZWVtcyB0byBiZSB1bnN1cHBvcnRlZC4KCSAqLwoKCS8qIHByZXNjYWxlciAxLjAsIHR4L3J4IGZpZm8gbHZsIDE2ICovCglvdXRiKDB4MzAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19FWENSMik7CgoJLyogU2V0IGJhdWQgZGl2aXNvciB0byBzYW1wbGUgZXZlcnkgMTAgdXMgKi8KCW91dGIoMHgwRiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOwoJb3V0YigweDAwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdESCk7CgoJLyogU2V0IENFSVIgbW9kZSAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18wKTsKCW91dGIoMHhDMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX01DUik7CglpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0xTUik7IC8qIENsZWFyIExTUiAqLwoJaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19NU1IpOyAvKiBDbGVhciBNU1IgKi8KCgkvKiBEaXNhYmxlIFJYIGRlbW9kLCBlbmFibGUgcnVuLWxlbmd0aCBlbmMvZGVjLCBzZXQgZnJlcSBzcGFuICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzcpOwoJb3V0YigweDkwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfUkNDRkcpOwoKCS8qIERpc2FibGUgdGltZXIgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNCk7CglvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNSMSk7CgoJLyogRGlzYWJsZSBNU1IgaW50ZXJydXB0LCBjbGVhciBBVVhfSVJYLCBtYXNrIFJYIGR1cmluZyBUWD8gKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNSk7CglvdXRiKHR4YW5kcnggPyAweDAzIDogMHgwMiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSQ1IyKTsKCgkvKiBEaXNhYmxlIENSQyAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS182KTsKCW91dGIoMHgyMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSQ1IzKTsKCgkvKiBTZXQgUlggZGVtb2R1bGF0aW9uIGZyZXEsIG5vdCByZWFsbHkgdXNlZCAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS183KTsKCW91dGIoMHhGMiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSUlhEQyk7CgoJLyogU2V0IFRYIG1vZHVsYXRpb24sIDM2a0h6LCA3dXMgcHVsc2Ugd2lkdGggKi8KCW91dGIoMHg2OSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSVFhNQyk7CglkYXRhLT50eGNhcnJpZXIgPSAzNjAwMDsKCgkvKiBTZXQgaW52ZXJ0IGFuZCBwaW4gZGlyZWN0aW9uICovCglpZiAoaW52ZXJ0KQoJCW91dGIoMHgxMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSQ0ZHNCk7CgllbHNlCgkJb3V0YigweDAwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDRkc0KTsKCgkvKiBTZXQgRklGTyB0aHJlc2hvbGRzIChSWCA9IDgsIFRYID0gMyksIHJlc2V0IFJYL1RYICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoJb3V0YigweDk3LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRkNSKTsKCgkvKiBDbGVhciBBVVggc3RhdHVzIGJpdHMgKi8KCW91dGIoMHhFMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0FTQ1IpOwoKCS8qIENsZWFyIFJYIHN0YXRlICovCglkYXRhLT5yeHN0YXRlID0gV0JDSVJfUlhTVEFURV9JTkFDVElWRTsKCWRhdGEtPnJ4ZXYuZHVyYXRpb24gPSAwOwoJaXJfcmF3X2V2ZW50X3Jlc2V0KGRhdGEtPmRldik7Cglpcl9yYXdfZXZlbnRfaGFuZGxlKGRhdGEtPmRldik7CgoJLyoKCSAqIENoZWNrIFRYIHN0YXRlLCBpZiB3ZSBkaWQgYSBzdXNwZW5kL3Jlc3VtZSBjeWNsZSB3aGlsZSBUWCB3YXMKCSAqIGFjdGl2ZSwgd2Ugd2lsbCBoYXZlIGEgcHJvY2VzcyB3YWl0aW5nIGluIHR4d2FpdHEuCgkgKi8KCWlmIChkYXRhLT50eHN0YXRlID09IFdCQ0lSX1RYU1RBVEVfQUNUSVZFKSB7CgkJZGF0YS0+dHhzdGF0ZSA9IFdCQ0lSX1RYU1RBVEVfRVJST1I7CgkJd2FrZV91cCgmZGF0YS0+dHh3YWl0cSk7Cgl9CgoJLyogRW5hYmxlIGludGVycnVwdHMgKi8KCXdiY2lyX3NldF9pcnFtYXNrKGRhdGEsIFdCQ0lSX0lSUV9SWCB8IFdCQ0lSX0lSUV9FUlIpOwp9CgpzdGF0aWMgaW50CndiY2lyX3Jlc3VtZShzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlKQp7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IHBucF9nZXRfZHJ2ZGF0YShkZXZpY2UpOwoKCXdiY2lyX2luaXRfaHcoZGF0YSk7CgllbmFibGVfaXJxKGRhdGEtPmlycSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgX19kZXZpbml0CndiY2lyX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCnsKCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkZXZpY2UtPmRldjsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhOwoJaW50IGVycjsKCglpZiAoIShwbnBfcG9ydF9sZW4oZGV2aWNlLCAwKSA9PSBFSEZVTkNfSU9NRU1fTEVOICYmCgkgICAgICBwbnBfcG9ydF9sZW4oZGV2aWNlLCAxKSA9PSBXQUtFVVBfSU9NRU1fTEVOICYmCgkgICAgICBwbnBfcG9ydF9sZW4oZGV2aWNlLCAyKSA9PSBTUF9JT01FTV9MRU4pKSB7CgkJZGV2X2VycihkZXYsICJJbnZhbGlkIHJlc291cmNlc1xuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CglpZiAoIWRhdGEpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdDsKCX0KCglwbnBfc2V0X2RydmRhdGEoZGV2aWNlLCBkYXRhKTsKCglzcGluX2xvY2tfaW5pdCgmZGF0YS0+c3BpbmxvY2spOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmZGF0YS0+dHh3YWl0cSk7CglkYXRhLT5lYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldmljZSwgMCk7CglkYXRhLT53YmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldmljZSwgMSk7CglkYXRhLT5zYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldmljZSwgMik7CglkYXRhLT5pcnEgPSBwbnBfaXJxKGRldmljZSwgMCk7CgoJaWYgKGRhdGEtPndiYXNlID09IDAgfHwgZGF0YS0+ZWJhc2UgPT0gMCB8fAoJICAgIGRhdGEtPnNiYXNlID09IDAgfHwgZGF0YS0+aXJxID09IDApIHsKCQllcnIgPSAtRU5PREVWOwoJCWRldl9lcnIoZGV2LCAiSW52YWxpZCByZXNvdXJjZXNcbiIpOwoJCWdvdG8gZXhpdF9mcmVlX2RhdGE7Cgl9CgoJZGV2X2RiZygmZGV2aWNlLT5kZXYsICJGb3VuZCBkZXZpY2UgIgoJCSIodzogMHglbFgsIGU6IDB4JWxYLCBzOiAweCVsWCwgaTogJXUpXG4iLAoJCWRhdGEtPndiYXNlLCBkYXRhLT5lYmFzZSwgZGF0YS0+c2Jhc2UsIGRhdGEtPmlycSk7CgoJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKCJjaXItdHgiLCAmZGF0YS0+dHh0cmlnZ2VyKTsKCWlmICghZGF0YS0+dHh0cmlnZ2VyKSB7CgkJZXJyID0gLUVOT01FTTsKCQlnb3RvIGV4aXRfZnJlZV9kYXRhOwoJfQoKCWxlZF90cmlnZ2VyX3JlZ2lzdGVyX3NpbXBsZSgiY2lyLXJ4IiwgJmRhdGEtPnJ4dHJpZ2dlcik7CglpZiAoIWRhdGEtPnJ4dHJpZ2dlcikgewoJCWVyciA9IC1FTk9NRU07CgkJZ290byBleGl0X3VucmVnaXN0ZXJfdHh0cmlnZ2VyOwoJfQoKCWRhdGEtPmxlZC5uYW1lID0gImNpcjo6YWN0aXZpdHkiOwoJZGF0YS0+bGVkLmRlZmF1bHRfdHJpZ2dlciA9ICJjaXItcngiOwoJZGF0YS0+bGVkLmJyaWdodG5lc3Nfc2V0ID0gd2JjaXJfbGVkX2JyaWdodG5lc3Nfc2V0OwoJZGF0YS0+bGVkLmJyaWdodG5lc3NfZ2V0ID0gd2JjaXJfbGVkX2JyaWdodG5lc3NfZ2V0OwoJZXJyID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZkZXZpY2UtPmRldiwgJmRhdGEtPmxlZCk7CglpZiAoZXJyKQoJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3J4dHJpZ2dlcjsKCglkYXRhLT5kZXYgPSByY19hbGxvY2F0ZV9kZXZpY2UoKTsKCWlmICghZGF0YS0+ZGV2KSB7CgkJZXJyID0gLUVOT01FTTsKCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9sZWQ7Cgl9CgoJZGF0YS0+ZGV2LT5kcml2ZXJfdHlwZSA9IFJDX0RSSVZFUl9JUl9SQVc7CglkYXRhLT5kZXYtPmRyaXZlcl9uYW1lID0gV0JDSVJfTkFNRTsKCWRhdGEtPmRldi0+aW5wdXRfbmFtZSA9IFdCQ0lSX05BTUU7CglkYXRhLT5kZXYtPmlucHV0X3BoeXMgPSAid2JjaXIvY2lyMCI7CglkYXRhLT5kZXYtPmlucHV0X2lkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKCWRhdGEtPmRldi0+aW5wdXRfaWQudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9XSU5CT05EOwoJZGF0YS0+ZGV2LT5pbnB1dF9pZC5wcm9kdWN0ID0gV0JDSVJfSURfRkFNSUxZOwoJZGF0YS0+ZGV2LT5pbnB1dF9pZC52ZXJzaW9uID0gV0JDSVJfSURfQ0hJUDsKCWRhdGEtPmRldi0+bWFwX25hbWUgPSBSQ19NQVBfUkM2X01DRTsKCWRhdGEtPmRldi0+c19pZGxlID0gd2JjaXJfaWRsZV9yeDsKCWRhdGEtPmRldi0+c190eF9tYXNrID0gd2JjaXJfdHhtYXNrOwoJZGF0YS0+ZGV2LT5zX3R4X2NhcnJpZXIgPSB3YmNpcl90eGNhcnJpZXI7CglkYXRhLT5kZXYtPnR4X2lyID0gd2JjaXJfdHg7CglkYXRhLT5kZXYtPnByaXYgPSBkYXRhOwoJZGF0YS0+ZGV2LT5kZXYucGFyZW50ID0gJmRldmljZS0+ZGV2OwoKCWlmICghcmVxdWVzdF9yZWdpb24oZGF0YS0+d2Jhc2UsIFdBS0VVUF9JT01FTV9MRU4sIERSVk5BTUUpKSB7CgkJZGV2X2VycihkZXYsICJSZWdpb24gMHglbHgtMHglbHggYWxyZWFkeSBpbiB1c2UhXG4iLAoJCQlkYXRhLT53YmFzZSwgZGF0YS0+d2Jhc2UgKyBXQUtFVVBfSU9NRU1fTEVOIC0gMSk7CgkJZXJyID0gLUVCVVNZOwoJCWdvdG8gZXhpdF9mcmVlX3JjOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24oZGF0YS0+ZWJhc2UsIEVIRlVOQ19JT01FTV9MRU4sIERSVk5BTUUpKSB7CgkJZGV2X2VycihkZXYsICJSZWdpb24gMHglbHgtMHglbHggYWxyZWFkeSBpbiB1c2UhXG4iLAoJCQlkYXRhLT5lYmFzZSwgZGF0YS0+ZWJhc2UgKyBFSEZVTkNfSU9NRU1fTEVOIC0gMSk7CgkJZXJyID0gLUVCVVNZOwoJCWdvdG8gZXhpdF9yZWxlYXNlX3diYXNlOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24oZGF0YS0+c2Jhc2UsIFNQX0lPTUVNX0xFTiwgRFJWTkFNRSkpIHsKCQlkZXZfZXJyKGRldiwgIlJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5IGluIHVzZSFcbiIsCgkJCWRhdGEtPnNiYXNlLCBkYXRhLT5zYmFzZSArIFNQX0lPTUVNX0xFTiAtIDEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfcmVsZWFzZV9lYmFzZTsKCX0KCgllcnIgPSByZXF1ZXN0X2lycShkYXRhLT5pcnEsIHdiY2lyX2lycV9oYW5kbGVyLAoJCQkgIElSUUZfRElTQUJMRUQsIERSVk5BTUUsIGRldmljZSk7CglpZiAoZXJyKSB7CgkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY2xhaW0gSVJRICV1XG4iLCBkYXRhLT5pcnEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfcmVsZWFzZV9zYmFzZTsKCX0KCgllcnIgPSByY19yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+ZGV2KTsKCWlmIChlcnIpCgkJZ290byBleGl0X2ZyZWVfaXJxOwoKCWRldmljZV9pbml0X3dha2V1cCgmZGV2aWNlLT5kZXYsIDEpOwoKCXdiY2lyX2luaXRfaHcoZGF0YSk7CgoJcmV0dXJuIDA7CgpleGl0X2ZyZWVfaXJxOgoJZnJlZV9pcnEoZGF0YS0+aXJxLCBkZXZpY2UpOwpleGl0X3JlbGVhc2Vfc2Jhc2U6CglyZWxlYXNlX3JlZ2lvbihkYXRhLT5zYmFzZSwgU1BfSU9NRU1fTEVOKTsKZXhpdF9yZWxlYXNlX2ViYXNlOgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+ZWJhc2UsIEVIRlVOQ19JT01FTV9MRU4pOwpleGl0X3JlbGVhc2Vfd2Jhc2U6CglyZWxlYXNlX3JlZ2lvbihkYXRhLT53YmFzZSwgV0FLRVVQX0lPTUVNX0xFTik7CmV4aXRfZnJlZV9yYzoKCXJjX2ZyZWVfZGV2aWNlKGRhdGEtPmRldik7CmV4aXRfdW5yZWdpc3Rlcl9sZWQ6CglsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGF0YS0+bGVkKTsKZXhpdF91bnJlZ2lzdGVyX3J4dHJpZ2dlcjoKCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGRhdGEtPnJ4dHJpZ2dlcik7CmV4aXRfdW5yZWdpc3Rlcl90eHRyaWdnZXI6CglsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShkYXRhLT50eHRyaWdnZXIpOwpleGl0X2ZyZWVfZGF0YToKCWtmcmVlKGRhdGEpOwoJcG5wX3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7CmV4aXQ6CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgdm9pZCBfX2RldmV4aXQKd2JjaXJfcmVtb3ZlKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCgl3YmNpcl9zZXRfaXJxbWFzayhkYXRhLCBXQkNJUl9JUlFfTk9ORSk7CglmcmVlX2lycShkYXRhLT5pcnEsIGRldmljZSk7CgoJLyogQ2xlYXIgc3RhdHVzIGJpdHMgTkVDX1JFUCwgQlVGRiwgTVNHX0VORCwgTUFUQ0ggKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX1NUUywgMHgxNywgMHgxNyk7CgoJLyogQ2xlYXIgQ0VJUl9FTiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1RMLCAweDAwLCAweDAxKTsKCgkvKiBDbGVhciBCVUZGX0VOLCBFTkRfRU4sIE1BVENIX0VOICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTiwgMHgwMCwgMHgwNyk7CgoJcmNfdW5yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+ZGV2KTsKCglsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShkYXRhLT5yeHRyaWdnZXIpOwoJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoZGF0YS0+dHh0cmlnZ2VyKTsKCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZkYXRhLT5sZWQpOwoKCS8qIFRoaXMgaXMgb2sgc2luY2UgJmRhdGEtPmxlZCBpc24ndCBhY3R1YWxseSB1c2VkICovCgl3YmNpcl9sZWRfYnJpZ2h0bmVzc19zZXQoJmRhdGEtPmxlZCwgTEVEX09GRik7CgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+d2Jhc2UsIFdBS0VVUF9JT01FTV9MRU4pOwoJcmVsZWFzZV9yZWdpb24oZGF0YS0+ZWJhc2UsIEVIRlVOQ19JT01FTV9MRU4pOwoJcmVsZWFzZV9yZWdpb24oZGF0YS0+c2Jhc2UsIFNQX0lPTUVNX0xFTik7CgoJa2ZyZWUoZGF0YSk7CgoJcG5wX3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCB3YmNpcl9pZHNbXSA9IHsKCXsgIldFQzEwMjIiLCAwIH0sCgl7ICIiLCAwIH0KfTsKTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHdiY2lyX2lkcyk7CgpzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgd2JjaXJfZHJpdmVyID0gewoJLm5hbWUgICAgID0gV0JDSVJfTkFNRSwKCS5pZF90YWJsZSA9IHdiY2lyX2lkcywKCS5wcm9iZSAgICA9IHdiY2lyX3Byb2JlLAoJLnJlbW92ZSAgID0gX19kZXZleGl0X3Aod2JjaXJfcmVtb3ZlKSwKCS5zdXNwZW5kICA9IHdiY2lyX3N1c3BlbmQsCgkucmVzdW1lICAgPSB3YmNpcl9yZXN1bWUsCgkuc2h1dGRvd24gPSB3YmNpcl9zaHV0ZG93bgp9OwoKc3RhdGljIGludCBfX2luaXQKd2JjaXJfaW5pdCh2b2lkKQp7CglpbnQgcmV0OwoKCXN3aXRjaCAocHJvdG9jb2wpIHsKCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgoJY2FzZSBJUl9QUk9UT0NPTF9ORUM6CgljYXNlIElSX1BST1RPQ09MX1JDNjoKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJfZXJyKCJJbnZhbGlkIHBvd2VyLW9uIHByb3RvY29sXG4iKTsKCX0KCglyZXQgPSBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZ3YmNpcl9kcml2ZXIpOwoJaWYgKHJldCkKCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciBkcml2ZXJcbiIpOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdAp3YmNpcl9leGl0KHZvaWQpCnsKCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmd2JjaXJfZHJpdmVyKTsKfQoKbW9kdWxlX2luaXQod2JjaXJfaW5pdCk7Cm1vZHVsZV9leGl0KHdiY2lyX2V4aXQpOwoKTU9EVUxFX0FVVEhPUigiRGF2aWQgSORyZGVtYW4gPGRhdmlkQGhhcmRlbWFuLm51PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIldpbmJvbmQgU3VwZXJJL08gQ29uc3VtZXIgSVIgRHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK