Ci8qCiAqIGluY2x1ZGUvYW1sX2kyYy5oCiAqCiAqIENvcHlyaWdodCAoQykgMjAxNSBBbWxvZ2ljLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCiAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKi8KCiNpZm5kZWYgX19BTUxfSTJDX0hfXwojZGVmaW5lIF9fQU1MX0kyQ19IX18KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9pMmMuaD4KCiNkZWZpbmUgQU1MX0kyQ19NQVhfVE9LRU5TCQk4CgovKkkyQ19DT05UUk9MX1JFRwkweDIxNDAvMHgyMTQ4Ki8Kc3RydWN0IGFtbF9pMmNfcmVnX2N0cmwgewoJdW5zaWduZWQgaW50IHN0YXJ0OjE7CQkvKlswXSBTZXQgdG8gMSB0byBzdGFydCBsaXN0IHByb2Nlc3NpbmcqLwoJLypTZXR0aW5nIHRoaXMgYml0IHRvIDAgd2hpbGUgdGhlIGxpc3QgcHJvY2Vzc29yIGlzIG9wZXJhdGluZyBjYXVzZXMgdGhlIGxpc3QKCQlwcm9jZXNzb3IgdG8gYWJvcnQgdGhlIGN1cnJlbnQgSTJDIG9wZXJhdGlvbiBhbmQgZ2VuZXJhdGUgYW4gSTJDIFNUT1AKCQljb21tYW5kIG9uIHRoZSBJMkMgYnVzLiAgIE5vcm1hbGx5IHRoaXMgYml0IGlzIHNldCB0byAxIGFuZCBsZWZ0IGhpZ2gKCQl1bnRpbCBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLiAgVG8gcmUtc3RhcnQgdGhlIGxpc3QgcHJvY2Vzc29yIHdpdGggYQoJCW5ldyBsaXN0IChhZnRlciBhIHByZXZpb3VzIGxpc3QgaGFzIGJlZW4gZXhoYXVzdGVkKSwgc2ltcGx5IHNldCB0aGlzCgkJYml0IHRvIHplcm8gdGhlbiB0byBvbmUuKi8KCXVuc2lnbmVkIGludCBhY2tfaWdub3JlOjE7CS8qWzFdIFNldCB0byAxIHRvIGRpc2FibGUgSTJDIEFDSyBkZXRlY3Rpb24uKi8KCS8qVGhlIEkyQyBidXMgdXNlcyBhbiBBQ0sgc2lnbmFsIGFmdGVyIGV2ZXJ5IGJ5dGUgdHJhbnNmZXIgdG8gZGV0ZWN0CgkJcHJvYmxlbXMgZHVyaW5nIHRoZSB0cmFuc2Zlci4gIEN1cnJlbnQgU29mdHdhcmUgaW1wbGVtZW50YXRpb25zIG9mIHRoZQoJCUkyQyBidXMgaWdub3JlIHRoaXMgQUNLLiAgVGhpcyBiaXQgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgY3VycmVudAoJCUFtbG9naWMgc29mdHdhcmUuICAgVGhpcyBiaXQgc2hvdWxkIGJlIHNldCB0byAwIHRvIGFsbG93IE5BQ0sKCQlvcGVyYXRpb25zIHRvIGFib3J0IEkyQyBidXMgdHJhbnNhY3Rpb25zLiAgSWYgYSBOQUNLIG9jY3VycywgdGhlIEVSUk9SCgkJYml0IGFib3ZlIHdpbGwgYmUgc2V0LiAqLwoJdW5zaWduZWQgaW50IHN0YXR1czoxOwkJLypbMl0gdGhlIHN0YXR1cyBvZiB0aGUgTGlzdCBwcm9jZXNzb3IqLwoJI2RlZmluZSAJSTJDX0lETEUJCTAKCSNkZWZpbmUgCUkyQ19SVU5OSU5HCTEKCS8qCTA6CUlETEUKCQkxOiAJUnVubmluZy4gIFRoZSBsaXN0IHByb2Nlc3NvciB3aWxsIGVudGVyIHRoaXMgc3RhdGUgb24gdGhlIGNsb2NrIGN5Y2xlCgkJYWZ0ZXIgdGhlIFNUQVJUIGJpdCBpcyBzZXQuICBUaGUgc29mdHdhcmUgY2FuIHBvbGwgdGhlIHN0YXR1cyByZWdpc3RlciB0bwoJCWRldGVybWluZSB3aGVuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCgkqLwoJdW5zaWduZWQgaW50IGVycm9yOjE7CQkvKlszXSAqLwoJLypUaGlzIHJlYWQgb25seSBiaXQgaXMgc2V0IGlmIHRoZSBJMkMgZGV2aWNlIGdlbmVyYXRlcyBhIE5BQ0sgZHVyaW5nIHdyaXRpbmcuCgkJVGhpcyBiaXQgaXMgY2xlYXJlZCBhdCBvbiB0aGUgY2xvY2sgY3ljbGUgYWZ0ZXIgdGhlIFNUQVJUIGJpdCBpcyBzZXQgdG8gMQoJCWluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3QgcHJvY2Vzc2luZy4gIEVycm9ycyBjYW4gYmUgaWdub3JlZCBieSBzZXR0aW5nCgkJdGhlIEFDS19JR05PUkUgYml0IGJlbG93LiAgRXJyb3JzIHdpbGwgYmUgZ2VuZXJhdGVkIG9uIFdyaXRlcyB0bwoJCWRldmljZXMgdGhhdCByZXR1cm4gTkFDSyBpbnN0ZWFkIG9mIEFDSy4gIEEgTkFDSyBpcyByZXR1cm5lZCBieSBhCgkJZGV2aWNlIGlmIGl0IGlzIHVuYWJsZSB0byBhY2NlcHQgYW55IG1vcmUgZGF0YSAoZm9yIGV4YW1wbGUgYmVjYXVzZSBpdAoJCWlzIHByb2Nlc3Npbmcgc29tZSBvdGhlciByZWFsLXRpbWUgZnVuY3Rpb24pLiAgSW4gdGhlIGV2ZW50IG9mIGFuCgkJRVJST1IsIHRoZSBJMkMgbW9kdWxlIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIFNUT1AgY29uZGl0aW9uCgkJb24gdGhlIGJ1cy4qLwoJdW5zaWduZWQgaW50IGN1cl90b2tlbjo0OwkvKls3OjRdIHRoZSBjdXJyZW50IHRva2VuIGJlaW5nIHByb2Nlc3NlZCovCgl1bnNpZ25lZCBpbnQgcmRfZGF0YV9jbnQ6NDsvKlsxMTo4XSBudW1iZXIgb2YgYnl0ZXMgUkVBRCBvdmVyIHRoZSBJMkMgYnVzKi8KCS8qSWYgdGhpcyB2YWx1ZSBpcyB6ZXJvLCB0aGVuIG5vIGRhdGEgaGFzIGJlZW4gcmVhZC4gIElmIHRoaXMgdmFsdWUgaXMgMSwgdGhlbgoJCWJpdHMgWzc6MF0gaW4gVE9LRU5fUkRBVEFfUkVHMCBjb250YWlucyB2YWxpZCBkYXRhLiAgVGhlIHNvZnR3YXJlIGNhbgoJCXJlYWQgdGhpcyByZWdpc3RlciBhZnRlciBhbiBJMkMgdHJhbnNhY3Rpb24gdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8KCQlyZWFkIGZyb20gdGhlIEkyQyBkZXZpY2UqLwoJdW5zaWduZWQgaW50IGNsa19kZWxheToxMDsJLypbMjE6MTJdIFF1YXJ0ZXIgY2xvY2sgZGVsYXkqLwoJLypUaGlzIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHBlcmlvZCBvZiB0aGUgU0NMIGNsb2NrIGRpdmlkZWQgYnkgNAoJCVF1YXJ0ZXIgQ2xvY2sgRGVsYXkgPSAqIFN5c3RlbSBDbG9jayBGcmVxdWVuY3kKCQlGb3IgZXhhbXBsZSwgaWYgdGhlIHN5c3RlbSBjbG9jayBpcyAxMzNNaHosIGFuZCB0aGUgSTJDIGNsb2NrIHBlcmlvZAoJCWlzIDEwdVMgKDEwMGtoeiksIHRoZW4KCQlRdWFydGVyIENsb2NrIERlbGF5ID0gKiAxMzMgTWh6ID0gMzMyCgkqLwoJdW5zaWduZWQgaW50IG1hbnVhbF9lbjoxOwkvKlsyMl0gZW5hYmxlIG1hbnVhbCBtb2RlLiAqLwoJLypNYW51YWwgSTJDIG1vZGUgaXMgY29udHJvbGxlZCBieSBiaXRzIDEyLDEzLDE0IGFuZCAxNSBhYm92ZS4qLwoJdW5zaWduZWQgaW50IHdyc2NsOjE7CQkvKlsyM10gU2V0cyB0aGUgbGV2ZWwgb2YgdGhlIFNDTCBsaW5lICovCgkvKmlmIG1hbnVhbCBtb2RlIGlzIGVuYWJsZWQuICBJZiB0aGlzIGJpdCBpcyAnMCcsIHRoZW4gdGhlIFNDTCBsaW5lIGlzCgkJcHVsbGVkIGxvdy4gIElmIHRoaXMgYml0IGlzICcxJyB0aGVuIHRoZSBTQ0wgbGluZSBpcyB0cmktc3RhdGVkLiovCgl1bnNpZ25lZCBpbnQgd3JzZGE6MTsgCQkvKlsyNF0gU2V0cyB0aGUgbGV2ZWwgb2YgdGhlIFNEQSBsaW5lICovCgkvKmlmIG1hbnVhbCBtb2RlIGlzIGVuYWJsZWQuICBJZiB0aGlzIGJpdCBpcyAnMCcsIAl0aGVuIHRoZSBTREEgbGluZSBpcwoJCXB1bGxlZCBsb3cuICBJZiB0aGlzIGJpdCBpcyAnMScgdGhlbiB0aGUgU0RBIGxpbmUgaXMgdHJpLXN0YXRlZC4qLwoJdW5zaWduZWQgaW50IHJkc2NsOjE7IAkJLypbMjVdIFJlYWQgYmFjayBsZXZlbCBvZiB0aGUgU0NMIGxpbmUqLwoJdW5zaWduZWQgaW50IHJkc2RhOjE7IAkJLypbMjZdIFJlYWQgYmFjayBsZXZlbCBvZiB0aGUgU0RBIGxpbmUqLwojaWYgMQoJdW5zaWduZWQgaW50IHVudXNlZDoxOyAJLypbMjddKi8KCXVuc2lnbmVkIGludCBjbGtfZGVsYXlfZXh0OjI7IAkvKlsyOToyOF0qLwoJdW5zaWduZWQgaW50IHVudXNlZDI6MjsgCS8qWzMxOjMwXSovCiNlbHNlCgl1bnNpZ25lZCBpbnQgdW51c2VkOjU7IAkvKlszMToyN10qLwojZW5kaWYKfTsKCnN0cnVjdCBhbWxfaTJjX3JlZ19zbGF2ZV9hZGRyIHsKCXVuc2lnbmVkIGludCBzbGF2ZV9hZGRyOjg7CS8qWzc6MF0gU0xBVkUgQUREUkVTUy4qLwoJLypUaGlzIGlzIGEgNy1iaXQgdmFsdWUgZm9yIGEgNy1iaXQgSTJDIGRldmljZSwgb3IgKDB4RjAgfCB7QTksQTh9KSBmb3IgYQoJCTEwIGJpdCBJMkMgZGV2aWNlLiAgQnkgY29udmVudGlvbiwgdGhlIHNsYXZlIGFkZHJlc3MgaXMgdHlwaWNhbGx5CgkJc3RvcmVkIGluIGJ5IGZpcnN0IGxlZnQgc2hpZnRpbmcgaXQgc28gdGhhdCBpdCdzIE1TQiBpcyBENyAoVGhlIEkyQyBidXMKCQlhc3N1bWVzIHRoZSA3LWJpdCBhZGRyZXNzIGlzIGxlZnQgc2hpZnRlZCBvbmUpLiAgQWRkaXRpb25hbGx5LCBzaW5jZQoJCXRoZSBTTEFWRSBhZGRyZXNzIGlzIGFsd2F5cyBhbiA3LWJpdCB2YWx1ZSwgRDAgaXMgYWx3YXlzIDAuCgoJCU5PVEU6ICBUaGUgSTJDIGFsd2F5cyB0cmFuc2ZlcnMgOC1iaXRzIGV2ZW4gZm9yIGFkZHJlc3MuICBUaGUgSTJDCgkJaGFyZHdhcmUgd2lsbCB1c2UgRDAgdG8gZGljdGF0ZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBidXMuICBUaGVyZWZvcmUsCgkJRDAgc2hvdWxkIGFsd2F5cyBiZSAnMCcgd2hlbiB0aGlzIHJlZ2lzdGVyIGlzIHNldC4KCSovCgl1bnNpZ25lZCBpbnQgc2RhX2ZpbHRlcjozOwkvKlsxMDo4XSBTREEgRklMVEVSKi8KCS8qQSBmaWx0ZXIgd2FzIGFkZGVkIGluIHRoZSBTQ0wgaW5wdXQgcGF0aCB0byBhbGxvdyBmb3IgZmlsdGVyaW5nIG9mIHNsb3cKCQlyaXNlIHRpbWVzLiAgMCA9IG5vIGZpbHRlcmluZywgNyA9IG1heCBmaWx0ZXJpbmcqLwoJdW5zaWduZWQgaW50IHNjbF9maWx0ZXI6MzsJLypbMTM6MTFdIFNDTCBGSUxURVIqLwoJLypBIGZpbHRlciB3YXMgYWRkZWQgaW4gdGhlIFNDTCBpbnB1dCBwYXRoIHRvIGFsbG93IGZvciBmaWx0ZXJpbmcgb2Ygc2xvdwoJCXJpc2UgdGltZXMuICAwID0gbm8gZmlsdGVyaW5nLCA3ID0gbWF4IGZpbHRlcmluZyovCiNpZiAxCgl1bnNpZ25lZCBpbnQgdW51c2VkOjI7CS8qWzE1OjE0XSovCgl1bnNpZ25lZCBpbnQgY2xrX2xvd19kZWxheToxMjsJLypbMjc6MTZdKi8KCXVuc2lnbmVkIGludCBjbGtfbG93X2RlbGF5X2VuOjE7CS8qWzI4XSovCgl1bnNpZ25lZCBpbnQgdW51c2VkMjozOwkvKlszMToyOV0qLwojZWxzZQoJdW5zaWduZWQgaW50IHVudXNlZDoxODsJLypbMzE6MTRdKi8KI2VuZGlmCn07CgovKldyaXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBEQVRBIHRva2VuIHNob3VsZCBiZSBwbGFjZWQgaW50byB0aGUKCUkyQ19UT0tFTl9XREFUQV9SRUcwIG9yIEkyQ19UT0tFTl9XREFUQV9SRUcxIHJlZ2lzdGVycy4KCVJlYWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIERBVEEgb3IgREFUQS1MQVNUIHRva2VuIGNhbiBiZSByZWFkIGZyb20KCXRoZSBJMkNfVE9LRU5fUkRBVEFfUkVHMCBvciBJMkNfVE9LRU5fUkRBVEFfUkVHMSByZWdpc3RlcnMqLwoKZW51bSBhbWxfaTJjX3Rva2VuIHsKCVRPS0VOX0VORCwKCVRPS0VOX1NUQVJULAoJVE9LRU5fU0xBVkVfQUREUl9XUklURSwKCVRPS0VOX1NMQVZFX0FERFJfUkVBRCwKCVRPS0VOX0RBVEEsCglUT0tFTl9EQVRBX0xBU1QsCglUT0tFTl9TVE9QCn07CgpzdHJ1Y3QgYW1sX2kyY19yZWdfbWFzdGVyIHsKCXZvbGF0aWxlIHVuc2lnbmVkIGludCBpMmNfY3RybDsKCXZvbGF0aWxlIHVuc2lnbmVkIGludCBpMmNfc2xhdmVfYWRkcjsKCXZvbGF0aWxlIHVuc2lnbmVkIGludCBpMmNfdG9rZW5fbGlzdF8wOwoJdm9sYXRpbGUgdW5zaWduZWQgaW50IGkyY190b2tlbl9saXN0XzE7Cgl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaTJjX3Rva2VuX3dkYXRhXzA7Cgl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaTJjX3Rva2VuX3dkYXRhXzE7Cgl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaTJjX3Rva2VuX3JkYXRhXzA7Cgl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaTJjX3Rva2VuX3JkYXRhXzE7Cn07CgoKc3RydWN0IGFtbF9pMmNfcmVnX3NsYXZlX2N0cmwgewoJdW5zaWduZWQgaW50IHNhbXBfcmF0ZTo3OwkvKls2OjBdIHNhbXBsaW5nIHJhdGUqLwoJLypEZWZpbmVkIGFzIE1QRUcgc3lzdGVtIGNsb2NrIC8gKHZhbHVlICsgMSkuICBUaGUgU0RBIGFuZCBTQ0wgaW5wdXRzIGludG8KCQl0aGUgc2xhdmUgbW9kdWxlIGFyZSBzYW1wbGVkIGFzIGEgd2F5IG9mIGZpbHRlcmluZyB0aGUgaW5wdXRzLiAgIEEKCQlyaXNpbmcgb3IgZmFsbGluZyBlZGdlIGlzIGRldGVybWluZWQgYnkgd2hlbiAzIHN1Y2Nlc3NpdmUgc2FtcGxlcyBhcmUKCQllaXRoZXIgaGlnaCBvciBsb3cgcmVzcGVjdGl2ZWx5Ki8KCXVuc2lnbmVkIGludCBlbmFibGU6MTsJCS8qWzddIEEgJzEnIGVuYWJsZXMgdGhlIEkyQyBzbGF2ZSBzdGF0ZSBtYWNoaW5lKi8KCXVuc2lnbmVkIGludCBob2xkX3RpbWU6ODsJLypbMTU6OF0qLwoJLypEYXRhIGhvbGQgdGltZSBhZnRlciB0aGUgZmFsbGluZyBlZGdlIG9mIFNDTC4KCQlIb2xkIHRpbWUgPSAoTVBFRyBzeXN0ZW0gY2xvY2sgcGVyaW9kKSAqICh2YWx1ZSArIDEpLgoJKi8KCXVuc2lnbmVkIGludCBzbGF2ZV9hZGRyOjg7CS8qWzIzLTE2XSovCgkvKkJpdHMgWzc6MV0gYXJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGRldmljZS4KCQlCaXQgWzBdIGlzIGlnbm9yZWQgc2luY2UgdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgUi9XIGJpdC4qLwoJdW5zaWduZWQgaW50IGFja19hbHdheXM6MTsJLypbMjRdKi8KCS8qVHlwaWNhbGx5IHRoZSBBQ0sgb2YgYSBzbGF2ZSBJMkMgZGV2aWNlIGlzIGRlcGVuZGVudCB1cG9uIHRoZQoJCWF2YWlsYWJpbGl0eSBvZiBkYXRhIChpZiByZWFkaW5nKSBhbmQgcm9vbSB0byBzdG9yZSBkYXRhICh3aGVuIHdlIGFyZQoJCWJlaW5nIHdyaXR0ZW4pLiAgT3VyIEkyQyBtb2R1bGUgaGFzIGEgc3RhdHVzIHJlZ2lzdGVyIHRoYXQgY2FuIGJlIHJlYWQKCQljb250aW51b3VzbHkuICBUaGlzIGJpdCBjYW4gYmUgc2V0IGlmIHRoZSBJMkMgbWFzdGVyIHdhbnRzIHRvCgkJY29udGludWFsbHkgcmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyLiAqLwoJdW5zaWduZWQgaW50IGlycV9lbjoxOwkJLypbMjVdKi8KCS8qSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIGFuIGludGVycnVwdCB3aWxsIGJlIHNlbnQgdG8gdGhlIEFSQyB3aGVuZXZlciA0CgkJYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgb3IgNCBieXRlcyBoYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUgSTJDIHNsYXZlCgkJbW9kdWxlLiovCgl1bnNpZ25lZCBpbnQgYnVzeToxOwkJLypbMjZdICovCgkvKlJlYWQgb25seSBzdGF0dXMgYml0LiAgJzEnIGluZGljYXRlcyB0aGF0IHRoZSBJMkMgc2xhdmUgbW9kdWxlIGlzIHNlbmRpbmcKCQlvciByZWNlaXZpbmcgZGF0YS4qLwoJdW5zaWduZWQgaW50IHJ4X3JkeToxOwkJLypbMjddICovCgkvKlRoaXMgYml0IGlzIHNldCB0byAnMScgYnkgdGhlIEFSQyB0byBpbmRpY2F0ZSB0byB0aGUgc2xhdmUgbWFjaGluZSB0aGF0CgkJdGhlIEkyQyBzbGF2ZSBtb2R1bGUgaXMgcmVhZHkgdG8gcmVjZWl2ZSBkYXRhLiAgVGhpcyBiaXQgaXMgY2xlYXJlZCBieQoJCXRoZSBJMkMgbW9kdWxlIHdoZW4gaXQgaGFzIHJlY2VpdmVkIDQgYnl0ZXMgZnJvbSB0aGUgSTJDIG1hc3Rlci4KCQlUaGlzIGJpdCBpcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyIHRoYXQgY2FuIGJlIHJlYWQgYnkKCQl0aGUgSTJDIG1hc3Rlci4gICBUaGUgSTJDIG1hc3RlciBjYW4gcmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZQoJCXdoZW4gdGhlIEkyQyBzbGF2ZSBtb2R1bGUgaXMgcmVhZHkgdG8gcmVjZWl2ZSBkYXRhLiovCgl1bnNpZ25lZCBpbnQgdHhfcmR5OjE7CQkvKlsyOF0gKi8KCS8qVGhpcyBiaXQgaXMgc2V0IHRvICcxJyBieSB0aGUgQVJDIHRvIGluZGljYXRlIHRvIHRoZSBzbGF2ZSBtYWNoaW5lIHRoYXQKCQl0aGUgSTJDIHNsYXZlIG1vZHVsZSBpcyByZWFkeSB0byBzZW5kIGRhdGEuICBUaGlzIGJpdCBpcyBjbGVhcmVkIGJ5CgkJdGhlIEkyQyBtb2R1bGUgd2hlbiBpdCBoYXMgc2VudCA0IGJ5dGVzIHRvIHRoZSBJMkMgbWFzdGVyLiAgVGhpcyBiaXQKCQlpcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyIHRoYXQgY2FuIGJlIHJlYWQgYnkgdGhlIEkyQwoJCW1hc3Rlci4gICBUaGUgSTJDIG1hc3RlciBjYW4gcmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSB3aGVuIHRoZQoJCUkyQyBzbGF2ZSBtb2R1bGUgaGFzIGRhdGEgdG8gc2VuZC4qLwoJdW5zaWduZWQgaW50IHJlZ19wdHI6MzsJCS8qWzMxOjI5XSAqLwoJLypUaGVyZSBhcmUgNSBpbnRlcm5hbCByZWdpc3RlcnMgaW5zaWRlIHRoZSBJMkMgc2xhdmUgbW9kdWxlLiAgVGhlIEkyQwoJCU1hc3RlciBzZXRzIHRoaXMgdmFsdWUgdXNpbmcgdGhlIGJ5dGUgdGhhdCBmb2xsb3dzIHRoZSBhZGRyZXNzIGJ5dGUKCQlpbiB0aGUgSTJDIGRhdGEgc3RyZWFtLiAgUmVnaXN0ZXIgNCAobnVtYmVyZWQgMCwxLKGtNCkgaXMgdGhlCgkJc3RhdHVzIHJlZ2lzdGVyLiovCn07CgpzdHJ1Y3QgYW1sX2kyY19yZWdfc2xhdmV7Cgl1bnNpZ25lZCBpbnQgaTJjX3NsYXZlX2N0cmw7Cgl1bnNpZ25lZCBpbnQgaTJjX3NsYXZlX3R4X2RhdGE7Cgl1bnNpZ25lZCBpbnQgaTJjX3NsYXZlX3J4X2RhdGE7Cn07CgpzdHJ1Y3QgYW1sX2kyYyB7Cgl1bnNpZ25lZCBpbnQgCQlpMmNfZGVidWc7Cgl1bnNpZ25lZCBpbnQJCWN1cl9zbGF2ZV9hZGRyOwoJdW5zaWduZWQgaW50IAkJd2FpdF9jb3VudDsKCXVuc2lnbmVkIGludCAJCXdhaXRfYWNrX2ludGVydmFsOwoJdW5zaWduZWQgaW50IAkJd2FpdF9yZWFkX2ludGVydmFsOwoJdW5zaWduZWQgaW50IAkJd2FpdF94ZmVyX2ludGVydmFsOwoJdW5zaWduZWQgaW50IAkJbWFzdGVyX25vOy8qbWFzdGVyIGE6MCBtYXN0ZXIgYjoxKi8KCSNkZWZpbmUJCQkJSTJDX01BU1RFUl9BTwkJMAoJI2RlZmluZSAJCQlJMkNfTUFTVEVSX0EJCTEKCSNkZWZpbmUJCQkJSTJDX01BU1RFUl9CCQkyCgkjZGVmaW5lCQkJCUkyQ19NQVNURVJfQwkJMwoJI2RlZmluZQkJCQlJMkNfTUFTVEVSX0QJCTQKCXVuc2lnbmVkIGNoYXIJCXRva2VuX3RhZ1tBTUxfSTJDX01BWF9UT0tFTlNdOwoJdW5zaWduZWQgaW50IAkJbXNnX2ZsYWdzOwoKCXN0cnVjdCBhbWxfaTJjX29wcyogb3BzOwoKCXN0cnVjdCBhbWxfaTJjX3JlZ19tYXN0ZXIgX19pb21lbSogbWFzdGVyX3JlZ3M7CgovLyNpZmRlZiBDT05GSUdfSTJDX0FNTF9TTEFWRQoJc3RydWN0IGFtbF9pMmNfcmVnX3NsYXZlIF9faW9tZW0qIHNsYXZlX3JlZ3M7CgoJc3RydWN0IGFtbF9waW5tdXhfcmVnX2JpdAlzbGF2ZV9waW5tdXg7Cgl1bnNpZ25lZCBpbnQJCXNsYXZlX2Rldl9hZGRyOwovLyNlbmRpZgoKCXZvaWQgX19pb21lbQkJKnJlZ19iYXNlOwoKCXN0cnVjdCBhbWxfcGlubXV4X3JlZ19iaXQJbWFzdGVyX3Bpbm11eDsKCglpbnQJCQlpcnE7Cgl1bnNpZ25lZCBpbnQJCXVzZV9waW87LyowOiBoYXJkd2FyZSBpMmMsIDE6IHBpbyBpMmMqLwoJdW5zaWduZWQgaW50CQltYXN0ZXJfaTJjX3NwZWVkOwp9OwoKc3RydWN0IGFtbF9pMmNfb3BzIHsKICAgICB2b2lkICgqeGZlcl9wcmVwYXJlKShzdHJ1Y3QgYW1sX2kyYyAqaTJjKTsKCSBpbnQgICgqZG9fYWRkcmVzcykoc3RydWN0IGFtbF9pMmMgKmkyYywgdW5zaWduZWQgaW50IGFkZHIpOwoJIHNzaXplX3QgICgqcmVhZCkoc3RydWN0IGFtbF9pMmMgKmkyYywgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKCSBzc2l6ZV90ICAoKndyaXRlKShzdHJ1Y3QgYW1sX2kyYyAqaTJjLCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pOwoJIHZvaWQgKCpzdG9wKShzdHJ1Y3QgYW1sX2kyYyAqaTJjKTsKfTsKCmludCBhbWxfaTJjX2luaXQodm9pZCk7CmludCBhbWxfaTJjX3hmZXIoc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pOwovKkdlbmVyYWwgaTJjIG1hc3RlciB0cmFuc2ZlcixpdCBjYW4gU2VuZCB0byBhIHNwZWNpZmljIG1hc3RlciBjb250cm9sKi8KaW50IGFtbF9pMmNfdHJhbnNmZXIoaW50IGFkYXBfbnVtICwgc3RydWN0IGkyY19tc2cgKm1zZ3MgLCBpbnQgbnVtKTsKCmVudW0gYW1sX2kyY19pZHsKCVNPRlRfSTJDID0gMCwKCUhBUkRfSTJDLAp9OwoKc3RydWN0IGkyY19ib2FyZF9pbmZvIHsKCWNoYXIgdHlwZVs2NF07CglpbnQgaTJjX2lkOwoJdW5zaWduZWQgc2hvcnQJYWRkcjsKCXZvaWQgKCpkZXZpY2VfaW5pdCkodm9pZCk7Cgl2b2lkICgqZGV2aWNlX3VuaW5pdCkodm9pZCk7Cn07CgojZGVmaW5lIEkyQ19CT0FSRF9JTkZPKGRldl90eXBlLCBkZXZfYWRkcikgXAoJLnR5cGUgPSBkZXZfdHlwZSwgLmFkZHIgPSAoZGV2X2FkZHIpCgpzdHJ1Y3QgYW1sX2kyY19kZXZpY2UgewoJc3RydWN0IGkyY19ib3JhZF9pbmZvICphbWxfaTJjX2JvYXJkczsKCXVuc2lnbmVkIGRldl9udW07Cn07CgojaWZkZWYgQU1MX01FU09OX0JPQVJEXzg3MjZNXzIwMTBfMTFfMThfVjExCi8vUGxlYXNlIHJlZmVyIGJvYXJkIHNjaGVtYXRpYyBmb3IgZGV0YWlsIHBpbiBjb25uZWN0aW9uCi8vQEFNTDg3MjYtTV9BUk1fREVWX0JPQVJEXzJERFJfVjFSMS5wZGYKLy9wb3J0MjctPiBSZWQJICgweDdGKQovL3BvcnQyNi0+IEdyZWVuICgweEJGKQovL3BvcnQyNS0+IEJsdWUgICAgKDB4REYpCiNkZWZpbmUgSTJDX0xFRF9SRUQgICAgICAgKDB4N0YpCiNkZWZpbmUgSTJDX0xFRF9HUkVFTiAgICAgKDB4QkYpCiNkZWZpbmUgSTJDX0xFRF9CTFVFICAgICAgKDB4REYpCgovL1RvIHNldCBvbmJvYXJkIExFRHMgIG9uL29mZgp2b2lkIGJvYXJkX2kyY19sZWRfc2V0KHVuc2lnbmVkIGNoYXIgYnlMRUQsIHVuc2lnbmVkIGNoYXIgYnlPbik7CgojZW5kaWYgLy9BTUxfTUVTT05fQk9BUkRfODcyNk1fMjAxMF8xMV8xOF9WMTEKCiNlbmRpZiAvL19fQU1MX0kyQ19IX18K