LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgRXRoZXJuZXQgZHJpdmVyIGZvciBSZWFsdGVrIFJUTDgxMzkgY2hpcHMKICAgICAgICAgICAgICAgIGV4Y2VwdCB0aGUgUlRMODEzOUMrLCBiZWNhdXNlIGl0IGhhcyBhIGRpZmZlcmVudAogICAgICAgICAgICAgICAgVHggZGVzY3JpcHRvciBoYW5kbGluZy4KCiAgTGljZW5zZToKCiAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICAgYXJlIG1ldDoKCiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KCiAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCiAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCiAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCiAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CgogICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCiAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCiAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgICAgICAkUkNTZmlsZTogRWRydjgxMzkuYyx2ICQKCiAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAoKICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwOC8xMS8yMSAwOTowMDozOCAkCgogICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAoKICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgogICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgUmV2aXNpb24gSGlzdG9yeToKCiAgMjAwOC8wMi8wNSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImdsb2JhbC5oIgojaW5jbHVkZSAiRXBsSW5jLmgiCiNpbmNsdWRlICJlZHJ2LmgiCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KI2luY2x1ZGUgPGFzbS9pcnEuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vIEJ1ZmZlciBoYW5kbGluZzoKLy8gQWxsIGJ1ZmZlcnMgYXJlIGNyZWF0ZWQgc3RhdGljYWxseSAoaS5lLiBhdCBjb21waWxlIHRpbWUgcmVzcC4gYXQKLy8gaW5pdGlhbGlzYXRpb24gdmlhIGttYWxsb2MoKSApIGFuZCBub3QgZHluYW1pY2FsbHkgb24gcmVxdWVzdCAoaS5lLiB2aWEKLy8gRWRydkFsbG9jVHhNc2dCdWZmZXIoKS4KLy8gRWRydkFsbG9jVHhNc2dCdWZmZXIoKSBzZWFyY2hlcyBmb3IgYW4gdW51c2VkIGJ1ZmZlciB3aGljaCBpcyBsYXJnZSBlbm91Z2guCi8vIEVkcnZJbml0KCkgbWF5IGFsbG9jYXRlIHNvbWUgYnVmZmVycyB3aXRoIHNpemVzIGxlc3MgdGhhbiBtYXhpbXVtIGZyYW1lCi8vIHNpemUgKGkuZS4gMTUxNCBieXRlcyksIGUuZy4gZm9yIFNvQywgU29BLCBTdGF0dXNSZXNwb25zZSwgSWRlbnRSZXNwb25zZSwKLy8gTk1UIHJlcXVlc3RzIC8gY29tbWFuZHMuIFRoZSBsZXNzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhlIGxlc3MgdGhlCi8vIG51bWJlciBvZiB0aGUgYnVmZmVyLgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gY29uc3QgZGVmaW5lcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI2lmbmRlZiBFRFJWX01BWF9UWF9CVUZGRVJTCiNkZWZpbmUgRURSVl9NQVhfVFhfQlVGRkVSUyAgICAgMjAKI2VuZGlmCgojZGVmaW5lIEVEUlZfTUFYX0ZSQU1FX1NJWkUgICAgIDB4NjAwCgojZGVmaW5lIEVEUlZfUlhfQlVGRkVSX1NJWkUgICAgIDB4ODYxMAkvLyAzMiBrQiArIDE2IEJ5dGUgKyAxLDUga0IgKFdSQVAgaXMgZW5hYmxlZCkKI2RlZmluZSBFRFJWX1JYX0JVRkZFUl9MRU5HVEggICAoRURSVl9SWF9CVUZGRVJfU0laRSAmIDB4RjgwMCkJLy8gYnVmZmVyIHNpemUgY3V0IGRvd24gdG8gMiBrQiBhbGlnbm1lbnQKCiNkZWZpbmUgRURSVl9UWF9CVUZGRVJfU0laRSAgICAgKEVEUlZfTUFYX1RYX0JVRkZFUlMgKiBFRFJWX01BWF9GUkFNRV9TSVpFKQkvLyBuICogKE1UVSArIDE0ICsgNCkKCiNkZWZpbmUgRFJWX05BTUUgICAgICAgICAgICAgICAgImVwbCIKCiNkZWZpbmUgRURSVl9SRUdXX0lOVF9NQVNLICAgICAgMHgzQwkvLyBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHV19JTlRfU1RBVFVTICAgIDB4M0UJLy8gaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHV19JTlRfUk9LICAgICAgIDB4MDAwMQkvLyBSZWNlaXZlIE9LIGludGVycnVwdAojZGVmaW5lIEVEUlZfUkVHV19JTlRfUkVSICAgICAgIDB4MDAwMgkvLyBSZWNlaXZlIGVycm9yIGludGVycnVwdAojZGVmaW5lIEVEUlZfUkVHV19JTlRfVE9LICAgICAgIDB4MDAwNAkvLyBUcmFuc21pdCBPSyBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX1RFUiAgICAgICAweDAwMDgJLy8gVHJhbnNtaXQgZXJyb3IgaW50ZXJydXB0CiNkZWZpbmUgRURSVl9SRUdXX0lOVF9SWE9WVyAgICAgMHgwMDEwCS8vIFJ4IGJ1ZmZlciBvdmVyZmxvdyBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX1BVTiAgICAgICAweDAwMjAJLy8gUGFja2V0IHVuZGVycnVuLyBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX0ZPVlcgICAgICAweDAwNDAJLy8gUnggRklGTyBvdmVyZmxvdyBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX0xFTkNIRyAgICAweDIwMDAJLy8gQ2FibGUgbGVuZ3RoIGNoYW5nZSBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX1RJTUVPVVQgICAweDQwMDAJLy8gVGltZSBvdXQgaW50ZXJydXB0CiNkZWZpbmUgRURSVl9SRUdXX0lOVF9TRVJSICAgICAgMHg4MDAwCS8vIFN5c3RlbSBlcnJvciBpbnRlcnJ1cHQKI2RlZmluZSBFRFJWX1JFR1dfSU5UX01BU0tfREVGICAoRURSVl9SRUdXX0lOVF9ST0sgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfUkVSIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1RPSyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9URVIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfUlhPVlcgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfRk9WVyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9QVU4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfVElNRU9VVCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9TRVJSKQkvLyBkZWZhdWx0IGludGVycnVwdCBtYXNrCgojZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EICAgICAgIDB4MzcJLy8gY29tbWFuZCByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX1JTVCAgIDB4MTAKI2RlZmluZSBFRFJWX1JFR0JfQ09NTUFORF9SRSAgICAweDA4CiNkZWZpbmUgRURSVl9SRUdCX0NPTU1BTkRfVEUgICAgMHgwNAojZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX0JVRkUgIDB4MDEKCiNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDYgICAgICAgMHg1MAkvLyA5M0M0NiBjb21tYW5kIHJlZ2lzdGVyCiNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDZfTE9DSyAgMHgwMAkvLyBsb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCiNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDZfVU5MT0NLIDB4QzAJLy8gdW5sb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCgojZGVmaW5lIEVEUlZfUkVHRFdfUkNSICAgICAgICAgIDB4NDQJLy8gUnggY29uZmlndXJhdGlvbiByZWdpc3RlcgojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX05PX0ZUSCAgIDB4MDAwMEUwMDAJLy8gbm8gcmVjZWl2ZSBGSUZPIHRocmVzaG9sZAojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX1JCTEVOMzJLIDB4MDAwMDEwMDAJLy8gMzIga0IgcmVjZWl2ZSBidWZmZXIKI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9NWERNQVVOTCAweDAwMDAwNzAwCS8vIHVubGltaXRlZCBtYXhpbXVtIERNQSBidXJzdCBzaXplCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfTk9XUkFQICAgMHgwMDAwMDA4MAkvLyBkbyBub3Qgd3JhcCBmcmFtZSBhdCBlbmQgb2YgYnVmZmVyCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQUVSICAgICAgMHgwMDAwMDAyMAkvLyBhY2NlcHQgZXJyb3IgZnJhbWVzIChDUkMsIGFsaWdubWVudCwgY29sbGlkZWQpCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQVIgICAgICAgMHgwMDAwMDAxMAkvLyBhY2NlcHQgcnVudAojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FCICAgICAgIDB4MDAwMDAwMDgJLy8gYWNjZXB0IGJyb2FkY2FzdCBmcmFtZXMKI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BTSAgICAgICAweDAwMDAwMDA0CS8vIGFjY2VwdCBtdWx0aWNhc3QgZnJhbWVzCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQVBNICAgICAgMHgwMDAwMDAwMgkvLyBhY2NlcHQgcGh5c2ljYWwgbWF0Y2ggZnJhbWVzCiNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQUFQICAgICAgMHgwMDAwMDAwMQkvLyBhY2NlcHQgYWxsIGZyYW1lcwojZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0RFRiAgICAgIChFRFJWX1JFR0RXX1JDUl9OT19GVEggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX1JCTEVOMzJLIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9NWERNQVVOTCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfTk9XUkFQIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9BQiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfQU0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX0FQTSkJLy8gZGVmYXVsdCB2YWx1ZQoKI2RlZmluZSBFRFJWX1JFR0RXX1RDUiAgICAgICAgICAweDQwCS8vIFR4IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9WRVJfTUFTSyAweDdDQzAwMDAwCS8vIG1hc2sgZm9yIGhhcmR3YXJlIHZlcnNpb24KI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9WRVJfQyAgICAweDc0MDAwMDAwCS8vIFJUTDgxMzlDCiNkZWZpbmUgRURSVl9SRUdEV19UQ1JfVkVSX0QgICAgMHg3NDQwMDAwMAkvLyBSVEw4MTM5RAojZGVmaW5lIEVEUlZfUkVHRFdfVENSX0lGRzk2ICAgIDB4MDMwMDAwMDAJLy8gZGVmYXVsdCBpbnRlcmZyYW1lIGdhcCAoOTYwIG5zKQojZGVmaW5lIEVEUlZfUkVHRFdfVENSX0NSQyAgICAgIDB4MDAwMTAwMDAJLy8gZGlzYWJsZSBhcHBlbmRpbmcgb2YgQ1JDIGJ5IHRoZSBjb250cm9sbGVyCiNkZWZpbmUgRURSVl9SRUdEV19UQ1JfTVhETUFVTkwgMHgwMDAwMDcwMAkvLyBtYXhpbXVtIERNQSBidXJzdCBzaXplIG9mIDIwNDggYgojZGVmaW5lIEVEUlZfUkVHRFdfVENSX1RYUkVUUlkgIDB4MDAwMDAwMDAJLy8gMTYgcmV0cmllcwojZGVmaW5lIEVEUlZfUkVHRFdfVENSX0RFRiAgICAgIChFRFJWX1JFR0RXX1RDUl9JRkc5NiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19UQ1JfTVhETUFVTkwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfVENSX1RYUkVUUlkpCgojZGVmaW5lIEVEUlZfUkVHV19NVUxJTlQgICAgICAgIDB4NUMJLy8gbXVsdGlwbGUgaW50ZXJydXB0IHNlbGVjdCByZWdpc3RlcgoKI2RlZmluZSBFRFJWX1JFR0RXX01QQyAgICAgICAgICAweDRDCS8vIG1pc3NlZCBwYWNrZXQgY291bnRlciByZWdpc3RlcgoKI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQwICAgICAgICAweDIwCS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAwCiNkZWZpbmUgRURSVl9SRUdEV19UU0FEMSAgICAgICAgMHgyNAkvLyBUcmFuc21pdCBzdGFydCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgMQojZGVmaW5lIEVEUlZfUkVHRFdfVFNBRDIgICAgICAgIDB4MjgJLy8gVHJhbnNtaXQgc3RhcnQgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIDIKI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQzICAgICAgICAweDJDCS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAzCiNkZWZpbmUgRURSVl9SRUdEV19UU0QwICAgICAgICAgMHgxMAkvLyBUcmFuc21pdCBzdGF0dXMgb2YgZGVzY3JpcHRvciAwCiNkZWZpbmUgRURSVl9SRUdEV19UU0RfQ1JTICAgICAgMHg4MDAwMDAwMAkvLyBDYXJyaWVyIHNlbnNlIGxvc3QKI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UQUJUICAgICAweDQwMDAwMDAwCS8vIFRyYW5zbWl0IEFib3J0CiNkZWZpbmUgRURSVl9SRUdEV19UU0RfT1dDICAgICAgMHgyMDAwMDAwMAkvLyBPdXQgb2Ygd2luZG93IGNvbGxpc2lvbgojZGVmaW5lIEVEUlZfUkVHRFdfVFNEX1RYVEhfREVGIDB4MDAwMjAwMDAJLy8gVHJhbnNtaXQgRklGTyB0aHJlc2hvbGQgb2YgNjQgYnl0ZXMKI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UT0sgICAgICAweDAwMDA4MDAwCS8vIFRyYW5zbWl0IE9LCiNkZWZpbmUgRURSVl9SRUdEV19UU0RfVFVOICAgICAgMHgwMDAwNDAwMAkvLyBUcmFuc21pdCBGSUZPIHVuZGVycnVuCiNkZWZpbmUgRURSVl9SRUdEV19UU0RfT1dOICAgICAgMHgwMDAwMjAwMAkvLyBPd25lcgoKI2RlZmluZSBFRFJWX1JFR0RXX1JCU1RBUlQgICAgICAweDMwCS8vIFJlY2VpdmUgYnVmZmVyIHN0YXJ0IGFkZHJlc3MKCiNkZWZpbmUgRURSVl9SRUdXX0NBUFIgICAgICAgICAgMHgzOAkvLyBDdXJyZW50IGFkZHJlc3Mgb2YgcGFja2V0IHJlYWQKCiNkZWZpbmUgRURSVl9SRUdEV19JRFIwICAgICAgICAgMHgwMAkvLyBJRCByZWdpc3RlciAwCiNkZWZpbmUgRURSVl9SRUdEV19JRFI0ICAgICAgICAgMHgwNAkvLyBJRCByZWdpc3RlciA0CgojZGVmaW5lIEVEUlZfUkVHRFdfTUFSMCAgICAgICAgIDB4MDgJLy8gTXVsdGljYXN0IGFkZHJlc3MgcmVnaXN0ZXIgMAojZGVmaW5lIEVEUlZfUkVHRFdfTUFSNCAgICAgICAgIDB4MEMJLy8gTXVsdGljYXN0IGFkZHJlc3MgcmVnaXN0ZXIgNAoKLy8gZGVmaW5lcyBmb3IgdGhlIHN0YXR1cyB3b3JkIGluIHRoZSByZWNlaXZlIGJ1ZmZlcgojZGVmaW5lIEVEUlZfUlhTVEFUX01BUiAgICAgICAgIDB4ODAwMAkvLyBNdWx0aWNhc3QgYWRkcmVzcyByZWNlaXZlZAojZGVmaW5lIEVEUlZfUlhTVEFUX1BBTSAgICAgICAgIDB4NDAwMAkvLyBQaHlzaWNhbCBhZGRyZXNzIG1hdGNoZWQKI2RlZmluZSBFRFJWX1JYU1RBVF9CQVIgICAgICAgICAweDIwMDAJLy8gQnJvYWRjYXN0IGFkZHJlc3MgcmVjZWl2ZWQKI2RlZmluZSBFRFJWX1JYU1RBVF9JU0UgICAgICAgICAweDAwMjAJLy8gSW52YWxpZCBzeW1ib2wgZXJyb3IKI2RlZmluZSBFRFJWX1JYU1RBVF9SVU5UICAgICAgICAweDAwMTAJLy8gUnVudCBwYWNrZXQgcmVjZWl2ZWQKI2RlZmluZSBFRFJWX1JYU1RBVF9MT05HICAgICAgICAweDAwMDgJLy8gTG9uZyBwYWNrZXQKI2RlZmluZSBFRFJWX1JYU1RBVF9DUkMgICAgICAgICAweDAwMDQJLy8gQ1JDIGVycm9yCiNkZWZpbmUgRURSVl9SWFNUQVRfRkFFICAgICAgICAgMHgwMDAyCS8vIEZyYW1lIGFsaWdubWVudCBlcnJvcgojZGVmaW5lIEVEUlZfUlhTVEFUX1JPSyAgICAgICAgIDB4MDAwMQkvLyBSZWNlaXZlIE9LCgojZGVmaW5lIEVEUlZfUkVHRFdfV1JJVEUoZHdSZWcsIGR3VmFsKSAgd3JpdGVsKGR3VmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKI2RlZmluZSBFRFJWX1JFR1dfV1JJVEUoZHdSZWcsIHdWYWwpICAgIHdyaXRldyh3VmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKI2RlZmluZSBFRFJWX1JFR0JfV1JJVEUoZHdSZWcsIGJWYWwpICAgIHdyaXRlYihiVmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKI2RlZmluZSBFRFJWX1JFR0RXX1JFQUQoZHdSZWcpICAgICAgICAgIHJlYWRsKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQojZGVmaW5lIEVEUlZfUkVHV19SRUFEKGR3UmVnKSAgICAgICAgICAgcmVhZHcoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICsgZHdSZWcpCiNkZWZpbmUgRURSVl9SRUdCX1JFQUQoZHdSZWcpICAgICAgICAgICByZWFkYihFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKCi8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCiNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18Kdm9pZCBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHU4IGJUcmFjZVBvaW50TnVtYmVyX3ApOwp2b2lkIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHUzMiBkd1RyYWNlVmFsdWVfcCk7CiNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCiNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpICAgICBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh2KQojZWxzZQojZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCiNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpCiNlbmRpZgoKI2RlZmluZSBFRFJWX0NPVU5UX1NFTkQgICAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIpCiNkZWZpbmUgRURSVl9DT1VOVF9USU1FT1VUICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgzKQojZGVmaW5lIEVEUlZfQ09VTlRfUENJX0VSUiAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNCkKI2RlZmluZSBFRFJWX0NPVU5UX1RYICAgICAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDUpCiNkZWZpbmUgRURSVl9DT1VOVF9SWCAgICAgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCg2KQojZGVmaW5lIEVEUlZfQ09VTlRfTEFURUNPTExJU0lPTiAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTApCiNkZWZpbmUgRURSVl9DT1VOVF9UWF9DT0xfUkwgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMSkKI2RlZmluZSBFRFJWX0NPVU5UX1RYX0ZVTiAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDEyKQojZGVmaW5lIEVEUlZfQ09VTlRfVFhfRVJSICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTMpCiNkZWZpbmUgRURSVl9DT1VOVF9SWF9DUkMgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNCkKI2RlZmluZSBFRFJWX0NPVU5UX1JYX0VSUiAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE1KQojZGVmaW5lIEVEUlZfQ09VTlRfUlhfRk9WVyAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTYpCiNkZWZpbmUgRURSVl9DT1VOVF9SWF9QVU4gICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNykKI2RlZmluZSBFRFJWX0NPVU5UX1JYX0ZBRSAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDE4KQojZGVmaW5lIEVEUlZfQ09VTlRfUlhfT1ZXICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMTkpCgojZGVmaW5lIEVEUlZfVFJBQ0VfQ0FQUih4KSAgICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYpIHwgMHgwNjAwMDAwMCkKI2RlZmluZSBFRFJWX1RSQUNFX1JYX0NSQyh4KSAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGKSB8IDB4MEUwMDAwMDApCiNkZWZpbmUgRURSVl9UUkFDRV9SWF9FUlIoeCkgICAgICAgICAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKCh4KSAmIDB4RkZGRikgfCAweDBGMDAwMDAwKQojZGVmaW5lIEVEUlZfVFJBQ0VfUlhfUFVOKHgpICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYpIHwgMHgxMTAwMDAwMCkKI2RlZmluZSBFRFJWX1RSQUNFKHgpICAgICAgICAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGMDAwMCkgfCAweDAwMDBGRUMwKQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbG9jYWwgdHlwZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLyoKdHlwZWRlZiBzdHJ1Y3QKewogICAgQk9PTCAgICAgICAgICAgIG1fZlVzZWQ7CiAgICB1bnNpZ25lZCBpbnQgICAgbV91aVNpemU7CiAgICBNQ0RfYnVmRGVzY0ZlYyAqbV9wQnVmRGVzY3I7Cgp9IHRFZHJ2VHhCdWZmZXJJbnRlcm47CiovCgovLyBQcml2YXRlIHN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdCB7CglzdHJ1Y3QgcGNpX2RldiAqbV9wUGNpRGV2OwkvLyBwb2ludGVyIHRvIFBDSSBkZXZpY2Ugc3RydWN0dXJlCgl2b2lkICptX3BJb0FkZHI7CS8vIHBvaW50ZXIgdG8gcmVnaXN0ZXIgc3BhY2Ugb2YgRXRoZXJuZXQgY29udHJvbGxlcgoJdTggKm1fcGJSeEJ1ZjsJLy8gcG9pbnRlciB0byBSeCBidWZmZXIKCWRtYV9hZGRyX3QgbV9wUnhCdWZEbWE7Cgl1OCAqbV9wYlR4QnVmOwkvLyBwb2ludGVyIHRvIFR4IGJ1ZmZlcgoJZG1hX2FkZHJfdCBtX3BUeEJ1ZkRtYTsKCUJPT0wgbV9hZlR4QnVmVXNlZFtFRFJWX01BWF9UWF9CVUZGRVJTXTsKCXVuc2lnbmVkIGludCBtX3VpQ3VyVHhEZXNjOwoKCXRFZHJ2SW5pdFBhcmFtIG1fSW5pdFBhcmFtOwoJdEVkcnZUeEJ1ZmZlciAqbV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXI7Cgp9IHRFZHJ2SW5zdGFuY2U7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgaW50IEVkcnZJbml0T25lKHN0cnVjdCBwY2lfZGV2ICpwUGNpRGV2LAoJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcElkKTsKCnN0YXRpYyB2b2lkIEVkcnZSZW1vdmVPbmUoc3RydWN0IHBjaV9kZXYgKnBQY2lEZXYpOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGJ1ZmZlcnMgYW5kIGJ1ZmZlciBkZXNjcmlwdG9ycyBhbmQgcG9pbnRlcnMKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhRWRydlBjaVRibFtdID0gewoJezB4MTBlYywgMHg4MTM5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKCXswLH0KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhRWRydlBjaVRibCk7CgpzdGF0aWMgdEVkcnZJbnN0YW5jZSBFZHJ2SW5zdGFuY2VfbDsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBFZHJ2RHJpdmVyID0gewoJLm5hbWUgPSBEUlZfTkFNRSwKCS5pZF90YWJsZSA9IGFFZHJ2UGNpVGJsLAoJLnByb2JlID0gRWRydkluaXRPbmUsCgkucmVtb3ZlID0gRWRydlJlbW92ZU9uZSwKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgIEMgTCBBIFMgUyAgPGVkcnY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8vCi8vIERlc2NyaXB0aW9uOgovLwovLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGNvbnN0IGRlZmluZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGxvY2FsIHR5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBsb2NhbCB2YXJzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgdTggRWRydkNhbGNIYXNoKHU4ICogcGJNQUNfcCk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydkluaXQKLy8KLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGZvciBpbml0IG9mIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCi8vCi8vIFBhcmFtZXRlcnM6ICBwRWRydkluaXRQYXJhbV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgaW5jbHVkaW5nIHRoZSBpbml0LXBhcmFtZXRlcnMKLy8KLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgICAgICAgICAgPSBrRXBsU3VjY2Vzc2Z1bAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGtFcGxOb1Jlc291cmNlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIEVkcnZJbml0KHRFZHJ2SW5pdFBhcmFtICogcEVkcnZJbml0UGFyYW1fcCkKewoJdEVwbEtlcm5lbCBSZXQ7CglpbnQgaVJlc3VsdDsKCglSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCgkvLyBjbGVhciBpbnN0YW5jZSBzdHJ1Y3R1cmUKCUVQTF9NRU1TRVQoJkVkcnZJbnN0YW5jZV9sLCAwLCBzaXplb2YoRWRydkluc3RhbmNlX2wpKTsKCgkvLyBzYXZlIHRoZSBpbml0IGRhdGEKCUVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtID0gKnBFZHJ2SW5pdFBhcmFtX3A7CgoJLy8gcmVnaXN0ZXIgUENJIGRyaXZlcgoJaVJlc3VsdCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJkVkcnZEcml2ZXIpOwoJaWYgKGlSZXN1bHQgIT0gMCkgewoJCXByaW50aygiJXMgcGNpX3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQgd2l0aCAlZFxuIiwgX19mdW5jX18sCgkJICAgICAgIGlSZXN1bHQpOwoJCVJldCA9IGtFcGxOb1Jlc291cmNlOwoJCWdvdG8gRXhpdDsKCX0KCglpZiAoRWRydkluc3RhbmNlX2wubV9wUGNpRGV2ID09IE5VTEwpIHsKCQlwcmludGsoIiVzIG1fcFBjaURldj1OVUxMXG4iLCBfX2Z1bmNfXyk7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CgkJZ290byBFeGl0OwoJfQoJLy8gcmVhZCBNQUMgYWRkcmVzcyBmcm9tIGNvbnRyb2xsZXIKCXByaW50aygiJXMgbG9jYWwgTUFDID0gIiwgX19mdW5jX18pOwoJZm9yIChpUmVzdWx0ID0gMDsgaVJlc3VsdCA8IDY7IGlSZXN1bHQrKykgewoJCXBFZHJ2SW5pdFBhcmFtX3AtPm1fYWJNeU1hY0FkZHJbaVJlc3VsdF0gPQoJCSAgICBFRFJWX1JFR0JfUkVBRCgoRURSVl9SRUdEV19JRFIwICsgaVJlc3VsdCkpOwoJCXByaW50aygiJTAyWCAiLAoJCSAgICAgICAodW5zaWduZWQgaW50KXBFZHJ2SW5pdFBhcmFtX3AtPm1fYWJNeU1hY0FkZHJbaVJlc3VsdF0pOwoJfQoJcHJpbnRrKCJcbiIpOwoKICAgICAgRXhpdDoKCXJldHVybiBSZXQ7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydlNodXRkb3duCi8vCi8vIERlc2NyaXB0aW9uOiBTaHV0ZG93biB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgovLwovLyBQYXJhbWV0ZXJzOiAgdm9pZAovLwovLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgPSBrRXBsU3VjY2Vzc2Z1bAovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFZHJ2U2h1dGRvd24odm9pZCkKewoKCS8vIHVucmVnaXN0ZXIgUENJIGRyaXZlcgoJcHJpbnRrKCIlcyBjYWxsaW5nIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigpXG4iLCBfX2Z1bmNfXyk7CglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJkVkcnZEcml2ZXIpOwoKCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeQovLwovLyBEZXNjcmlwdGlvbjogU2V0IGEgbXVsdGljYXN0IGVudHJ5IGludG8gdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKLy8KLy8gUGFyYW1ldGVyczogIHBiTWFjQWRkcl9wICAgICA9IHBvaW50ZXIgdG8gbXVsdGljYXN0IGVudHJ5IHRvIHNldAovLwovLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgICAgID0ga0VwbFN1Y2Nlc3NmdWwKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5KHU4ICogcGJNYWNBZGRyX3ApCnsKCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7Cgl1MzIgZHdEYXRhOwoJdTggYkhhc2g7CgoJYkhhc2ggPSBFZHJ2Q2FsY0hhc2gocGJNYWNBZGRyX3ApOwovKgogICAgZHdEYXRhID0gZXRoZXJfY3JjKDYsIHBiTWFjQWRkcl9wKTsKCiAgICBwcmludGsoIkVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeSgnJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgnKSBoYXNoID0gJXUgLyAldSAgZXRoZXJfY3JjID0gMHglMDhsWFxuIiwKICAgICAgICAodTE2KSBwYk1hY0FkZHJfcFswXSwgKHUxNikgcGJNYWNBZGRyX3BbMV0sICh1MTYpIHBiTWFjQWRkcl9wWzJdLAogICAgICAgICh1MTYpIHBiTWFjQWRkcl9wWzNdLCAodTE2KSBwYk1hY0FkZHJfcFs0XSwgKHUxNikgcGJNYWNBZGRyX3BbNV0sCiAgICAgICAgKHUxNikgYkhhc2gsICh1MTYpIChkd0RhdGEgPj4gMjYpLCBkd0RhdGEpOwoqLwoJaWYgKGJIYXNoID4gMzEpIHsKCQlkd0RhdGEgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVI0KTsKCQlkd0RhdGEgfD0gMSA8PCAoYkhhc2ggLSAzMik7CgkJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjQsIGR3RGF0YSk7Cgl9IGVsc2UgewoJCWR3RGF0YSA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX01BUjApOwoJCWR3RGF0YSB8PSAxIDw8IGJIYXNoOwoJCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVIwLCBkd0RhdGEpOwoJfQoKCXJldHVybiBSZXQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeQovLwovLyBEZXNjcmlwdGlvbjogUmVzZXQgYSBtdWx0aWNhc3QgZW50cnkgaW4gdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKLy8KLy8gUGFyYW1ldGVyczogIHBiTWFjQWRkcl9wICAgICA9IHBvaW50ZXIgdG8gbXVsdGljYXN0IGVudHJ5IHRvIHJlc2V0Ci8vCi8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgICAgICAgPSBrRXBsU3VjY2Vzc2Z1bAovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeSh1OCAqIHBiTWFjQWRkcl9wKQp7Cgl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOwoJdTMyIGR3RGF0YTsKCXU4IGJIYXNoOwoKCWJIYXNoID0gRWRydkNhbGNIYXNoKHBiTWFjQWRkcl9wKTsKCglpZiAoYkhhc2ggPiAzMSkgewoJCWR3RGF0YSA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX01BUjQpOwoJCWR3RGF0YSAmPSB+KDEgPDwgKGJIYXNoIC0gMzIpKTsKCQlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSNCwgZHdEYXRhKTsKCX0gZWxzZSB7CgkJZHdEYXRhID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSMCk7CgkJZHdEYXRhICY9IH4oMSA8PCBiSGFzaCk7CgkJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjAsIGR3RGF0YSk7Cgl9CgoJcmV0dXJuIFJldDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZBbGxvY1R4TXNnQnVmZmVyCi8vCi8vIERlc2NyaXB0aW9uOiBSZWdpc3RlciBhIFR4LUJ1ZmZlcgovLwovLyBQYXJhbWV0ZXJzOiAgcEJ1ZmZlcl9wICAgPSBwb2ludGVyIHRvIEJ1ZmZlciBzdHJ1Y3R1cmUKLy8KLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgID0ga0VwbFN1Y2Nlc3NmdWwKLy8gICAgICAgICAgICAgICAgICAgICAgICAgID0ga0VwbEVkcnZOb0ZyZWVCdWZFbnRyeQovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBFZHJ2QWxsb2NUeE1zZ0J1ZmZlcih0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQp7Cgl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOwoJdTMyIGk7CgoJaWYgKHBCdWZmZXJfcC0+bV91aU1heEJ1ZmZlckxlbiA+IEVEUlZfTUFYX0ZSQU1FX1NJWkUpIHsKCQlSZXQgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5OwoJCWdvdG8gRXhpdDsKCX0KCS8vIHNlYXJjaCBhIGZyZWUgVHggYnVmZmVyIHdpdGggYXBwcm9wcmlhdGUgc2l6ZQoJZm9yIChpID0gMDsgaSA8IEVEUlZfTUFYX1RYX0JVRkZFUlM7IGkrKykgewoJCWlmIChFZHJ2SW5zdGFuY2VfbC5tX2FmVHhCdWZVc2VkW2ldID09IEZBTFNFKSB7CgkJCS8vIGZyZWUgY2hhbm5lbCBmb3VuZAoJCQlFZHJ2SW5zdGFuY2VfbC5tX2FmVHhCdWZVc2VkW2ldID0gVFJVRTsKCQkJcEJ1ZmZlcl9wLT5tX3VpQnVmZmVyTnVtYmVyID0gaTsKCQkJcEJ1ZmZlcl9wLT5tX3BiQnVmZmVyID0KCQkJICAgIEVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiArCgkJCSAgICAoaSAqIEVEUlZfTUFYX0ZSQU1FX1NJWkUpOwoJCQlwQnVmZmVyX3AtPm1fdWlNYXhCdWZmZXJMZW4gPSBFRFJWX01BWF9GUkFNRV9TSVpFOwoJCQlicmVhazsKCQl9Cgl9CglpZiAoaSA+PSBFRFJWX01BWF9UWF9CVUZGRVJTKSB7CgkJUmV0ID0ga0VwbEVkcnZOb0ZyZWVCdWZFbnRyeTsKCQlnb3RvIEV4aXQ7Cgl9CgogICAgICBFeGl0OgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFZHJ2UmVsZWFzZVR4TXNnQnVmZmVyCi8vCi8vIERlc2NyaXB0aW9uOiBSZWdpc3RlciBhIFR4LUJ1ZmZlcgovLwovLyBQYXJhbWV0ZXJzOiAgcEJ1ZmZlcl9wICAgPSBwb2ludGVyIHRvIEJ1ZmZlciBzdHJ1Y3R1cmUKLy8KLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgID0ga0VwbFN1Y2Nlc3NmdWwKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydlJlbGVhc2VUeE1zZ0J1ZmZlcih0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQp7Cgl1bnNpZ25lZCBpbnQgdWlCdWZmZXJOdW1iZXI7CgoJdWlCdWZmZXJOdW1iZXIgPSBwQnVmZmVyX3AtPm1fdWlCdWZmZXJOdW1iZXI7CgoJaWYgKHVpQnVmZmVyTnVtYmVyIDwgRURSVl9NQVhfVFhfQlVGRkVSUykgewoJCUVkcnZJbnN0YW5jZV9sLm1fYWZUeEJ1ZlVzZWRbdWlCdWZmZXJOdW1iZXJdID0gRkFMU0U7Cgl9CgoJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZTZW5kVHhNc2cKLy8KLy8gRGVzY3JpcHRpb246IGltbWVkaWF0ZWx5IHN0YXJ0cyB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoZSBidWZmZXIKLy8KLy8gUGFyYW1ldGVyczogIHBCdWZmZXJfcCAgID0gYnVmZmVyIGRlc2NyaXB0b3IgdG8gdHJhbnNtaXQKLy8KLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgID0ga0VwbFN1Y2Nlc3NmdWwKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydlNlbmRUeE1zZyh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQp7Cgl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOwoJdW5zaWduZWQgaW50IHVpQnVmZmVyTnVtYmVyOwoJdTMyIGR3VGVtcDsKCgl1aUJ1ZmZlck51bWJlciA9IHBCdWZmZXJfcC0+bV91aUJ1ZmZlck51bWJlcjsKCglpZiAoKHVpQnVmZmVyTnVtYmVyID49IEVEUlZfTUFYX1RYX0JVRkZFUlMpCgkgICAgfHwgKEVkcnZJbnN0YW5jZV9sLm1fYWZUeEJ1ZlVzZWRbdWlCdWZmZXJOdW1iZXJdID09IEZBTFNFKSkgewoJCVJldCA9IGtFcGxFZHJ2QnVmTm90RXhpc3Rpbmc7CgkJZ290byBFeGl0OwoJfQoKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BMYXN0VHJhbnNtaXR0ZWRUeEJ1ZmZlciAhPSBOVUxMKSB7CS8vIHRyYW5zbWlzc2lvbiBpcyBhbHJlYWR5IGFjdGl2ZQoJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOwoJCWR3VGVtcCA9CgkJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0QwICsKCQkJCSAgICAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKgoJCQkJICAgICAgc2l6ZW9mKHUzMikpKSk7CgkJcHJpbnRrKCIlcyBJbnZPcCBUU0QldSA9IDB4JTA4WCIsIF9fZnVuY19fLAoJCSAgICAgICBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXApOwoJCXByaW50aygiICBDbWQgPSAweCUwMlhcbiIsCgkJICAgICAgICh1MTYpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CgkJZ290byBFeGl0OwoJfQoJLy8gc2F2ZSBwb2ludGVyIHRvIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIFR4SGFuZGxlcgoJRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXIgPSBwQnVmZmVyX3A7CgoJRURSVl9DT1VOVF9TRU5EOwoKCS8vIHBhZCB3aXRoIHplcm9zIGlmIG5lY2Vzc2FyeSwgYmVjYXVzZSBjb250cm9sbGVyIGRvZXMgbm90IGRvIGl0CglpZiAocEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4gPCBNSU5fRVRIX1NJWkUpIHsKCQlFUExfTUVNU0VUKHBCdWZmZXJfcC0+bV9wYkJ1ZmZlciArIHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuLCAwLAoJCQkgICBNSU5fRVRIX1NJWkUgLSBwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbik7CgkJcEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4gPSBNSU5fRVRIX1NJWkU7Cgl9CgkvLyBzZXQgRE1BIGFkZHJlc3Mgb2YgYnVmZmVyCglFRFJWX1JFR0RXX1dSSVRFKChFRFJWX1JFR0RXX1RTQUQwICsKCQkJICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZih1MzIpKSksCgkJCSAoRWRydkluc3RhbmNlX2wubV9wVHhCdWZEbWEgKwoJCQkgICh1aUJ1ZmZlck51bWJlciAqIEVEUlZfTUFYX0ZSQU1FX1NJWkUpKSk7Cglkd1RlbXAgPQoJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0FEMCArCgkJCSAgICAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKiBzaXplb2YodTMyKSkpKTsKLy8gICAgcHJpbnRrKCIlcyBUU0FEJXUgPSAweCUwOGxYIiwgX19mdW5jX18sIEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MsIGR3VGVtcCk7CgoJLy8gc3RhcnQgdHJhbnNtaXNzaW9uCglFRFJWX1JFR0RXX1dSSVRFKChFRFJWX1JFR0RXX1RTRDAgKwoJCQkgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICogc2l6ZW9mKHUzMikpKSwKCQkJIChFRFJWX1JFR0RXX1RTRF9UWFRIX0RFRiB8IHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuKSk7Cglkd1RlbXAgPQoJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0QwICsKCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZih1MzIpKSkpOwovLyAgICBwcmludGsoIiBUU0QldSA9IDB4JTA4bFggLyAweCUwOGxYXG4iLCBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXAsICh1MzIpKEVEUlZfUkVHRFdfVFNEX1RYVEhfREVGIHwgcEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4pKTsKCiAgICAgIEV4aXQ6CglyZXR1cm4gUmV0Owp9CgojaWYgMAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydlR4TXNnUmVhZHkKLy8KLy8gRGVzY3JpcHRpb246IHN0YXJ0cyBjb3B5aW5nIHRoZSBidWZmZXIgdG8gdGhlIGV0aGVybmV0IGNvbnRyb2xsZXIncyBGSUZPCi8vCi8vIFBhcmFtZXRlcnM6ICBwYkJ1ZmZlcl9wIC0gYnVmZmVyZGVzY3JpcHRvciB0byB0cmFuc21pdAovLwovLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlIC0ga0VwbFN1Y2Nlc3NmdWwKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydlR4TXNnUmVhZHkodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKewoJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCXVuc2lnbmVkIGludCB1aUJ1ZmZlck51bWJlcjsKCiAgICAgIEV4aXQ6CglyZXR1cm4gUmV0Owp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydlR4TXNnU3RhcnQKLy8KLy8gRGVzY3JpcHRpb246IHN0YXJ0cyB0cmFuc21pc3Npb24gb2YgdGhlIGV0aGVybmV0IGNvbnRyb2xsZXIncyBGSUZPCi8vCi8vIFBhcmFtZXRlcnM6ICBwYkJ1ZmZlcl9wIC0gYnVmZmVyZGVzY3JpcHRvciB0byB0cmFuc21pdAovLwovLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlIC0ga0VwbFN1Y2Nlc3NmdWwKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgRWRydlR4TXNnU3RhcnQodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKewoJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCglyZXR1cm4gUmV0Owp9CiNlbmRpZgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVkcnZSZWluaXRSeAovLwovLyBEZXNjcmlwdGlvbjogcmVpbml0aWFsaXplIHRoZSBSeCBwcm9jZXNzLCBiZWNhdXNlIG9mIGVycm9yCi8vCi8vIFBhcmFtZXRlcnM6ICB2b2lkCi8vCi8vIFJldHVybnM6ICAgICB2b2lkCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBFZHJ2UmVpbml0Ungodm9pZCkKewoJdTggYkNtZDsKCgkvLyBzaW1wbHkgc3dpdGNoIG9mZiBhbmQgb24gdGhlIHJlY2VpdmVyCgkvLyB0aGlzIHdpbGwgcmVzZXQgdGhlIENBUFIgcmVnaXN0ZXIKCWJDbWQgPSBFRFJWX1JFR0JfUkVBRChFRFJWX1JFR0JfQ09NTUFORCk7CglFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIChiQ21kICYgfkVEUlZfUkVHQl9DT01NQU5EX1JFKSk7CglFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIGJDbWQpOwoKCS8vIHNldCByZWNlaXZlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQ1IsIEVEUlZfUkVHRFdfUkNSX0RFRik7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICAgRWRydkludGVycnVwdEhhbmRsZXIKLy8KLy8gRGVzY3JpcHRpb246ICBpbnRlcnJ1cHQgaGFuZGxlcgovLwovLyBQYXJhbWV0ZXJzOiAgIHZvaWQKLy8KLy8gUmV0dXJuczogICAgICB2b2lkCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojaWYgMAp2b2lkIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKHZvaWQpCnsKfQojZW5kaWYKCnN0YXRpYyBpbnQgVGd0RXRoSXNyKGludCBuSXJxTnVtX3AsIHZvaWQgKnBwRGV2SW5zdERhdGFfcCkKewovLyAgICBFZHJ2SW50ZXJydXB0SGFuZGxlcigpOwoJdEVkcnZSeEJ1ZmZlciBSeEJ1ZmZlcjsKCXRFZHJ2VHhCdWZmZXIgKnBUeEJ1ZmZlcjsKCXUxNiB3U3RhdHVzOwoJdTMyIGR3VHhTdGF0dXM7Cgl1MzIgZHdSeFN0YXR1czsKCXUxNiB3Q3VyUng7Cgl1OCAqcGJSeEJ1ZjsKCXVuc2lnbmVkIGludCB1aUxlbmd0aDsKCWludCBpSGFuZGxlZCA9IElSUV9IQU5ETEVEOwoKLy8gICAgcHJpbnRrKCKkIik7CgoJLy8gcmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cwoJd1N0YXR1cyA9IEVEUlZfUkVHV19SRUFEKEVEUlZfUkVHV19JTlRfU1RBVFVTKTsKCgkvLyBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0cwoJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfU1RBVFVTLCB3U3RhdHVzKTsKCglpZiAod1N0YXR1cyA9PSAwKSB7CgkJaUhhbmRsZWQgPSBJUlFfTk9ORTsKCQlnb3RvIEV4aXQ7Cgl9CgkvLyBwcm9jZXNzIHRhc2tzCglpZiAoKHdTdGF0dXMgJiAoRURSVl9SRUdXX0lOVF9URVIgfCBFRFJWX1JFR1dfSU5UX1RPSykpICE9IDApIHsJLy8gdHJhbnNtaXQgaW50ZXJydXB0CgoJCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPT0gTlVMTCkgewoJCQlwcmludGsoIiVzIFR4IGJ1ZmZlcnMgY3VycmVudGx5IG5vdCBhbGxvY2F0ZWRcbiIsCgkJCSAgICAgICBfX2Z1bmNfXyk7CgkJCWdvdG8gRXhpdDsKCQl9CgkJLy8gcmVhZCB0cmFuc21pdCBzdGF0dXMKCQlkd1R4U3RhdHVzID0KCQkgICAgRURSVl9SRUdEV19SRUFEKChFRFJWX1JFR0RXX1RTRDAgKwoJCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqCgkJCQkgICAgICBzaXplb2YodTMyKSkpKTsKCQlpZiAoKGR3VHhTdGF0dXMgJiAoRURSVl9SRUdEV19UU0RfVE9LIHwgRURSVl9SRUdEV19UU0RfVEFCVCB8IEVEUlZfUkVHRFdfVFNEX1RVTikpICE9IDApIHsJLy8gdHJhbnNtaXQgZmluaXNoZWQKCQkJRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyA9CgkJCSAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyArIDEpICYgMHgwMzsKCQkJcFR4QnVmZmVyID0gRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXI7CgkJCUVkcnZJbnN0YW5jZV9sLm1fcExhc3RUcmFuc21pdHRlZFR4QnVmZmVyID0gTlVMTDsKCgkJCWlmICgoZHdUeFN0YXR1cyAmIEVEUlZfUkVHRFdfVFNEX1RPSykgIT0gMCkgewoJCQkJRURSVl9DT1VOVF9UWDsKCQkJfSBlbHNlIGlmICgoZHdUeFN0YXR1cyAmIEVEUlZfUkVHRFdfVFNEX1RVTikgIT0gMCkgewoJCQkJRURSVl9DT1VOVF9UWF9GVU47CgkJCX0gZWxzZSB7CS8vIGFzc3VtZSBFRFJWX1JFR0RXX1RTRF9UQUJUCgkJCQlFRFJWX0NPVU5UX1RYX0NPTF9STDsKCQkJfQoKLy8gICAgICAgICAgICBwcmludGsoIlQiKTsKCQkJaWYgKHBUeEJ1ZmZlciAhPSBOVUxMKSB7CgkJCQkvLyBjYWxsIFR4IGhhbmRsZXIgb2YgRGF0YSBsaW5rIGxheWVyCgkJCQlFZHJ2SW5zdGFuY2VfbC5tX0luaXRQYXJhbS4KCQkJCSAgICBtX3BmblR4SGFuZGxlcihwVHhCdWZmZXIpOwoJCQl9CgkJfSBlbHNlIHsKCQkJRURSVl9DT1VOVF9UWF9FUlI7CgkJfQoJfQoKCWlmICgod1N0YXR1cyAmIChFRFJWX1JFR1dfSU5UX1JFUiB8IEVEUlZfUkVHV19JTlRfRk9WVyB8IEVEUlZfUkVHV19JTlRfUlhPVlcgfCBFRFJWX1JFR1dfSU5UX1BVTikpICE9IDApIHsJLy8gcmVjZWl2ZSBlcnJvciBpbnRlcnJ1cHQKCgkJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9GT1ZXKSAhPSAwKSB7CgkJCUVEUlZfQ09VTlRfUlhfRk9WVzsKCQl9IGVsc2UgaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9SWE9WVykgIT0gMCkgewoJCQlFRFJWX0NPVU5UX1JYX09WVzsKCQl9IGVsc2UgaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9QVU4pICE9IDApIHsJLy8gUGFja2V0IHVuZGVycnVuCgkJCUVEUlZfVFJBQ0VfUlhfUFVOKHdTdGF0dXMpOwoJCQlFRFJWX0NPVU5UX1JYX1BVTjsKCQl9IGVsc2UgewkvKmlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfUkVSKSAhPSAwKSAqLwoKCQkJRURSVl9UUkFDRV9SWF9FUlIod1N0YXR1cyk7CgkJCUVEUlZfQ09VTlRfUlhfRVJSOwoJCX0KCgkJLy8gcmVpbml0aWFsaXplIFJ4IHByb2Nlc3MKCQlFZHJ2UmVpbml0UngoKTsKCX0KCglpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1JPSykgIT0gMCkgewkvLyByZWNlaXZlIGludGVycnVwdAoKCQlpZiAoRWRydkluc3RhbmNlX2wubV9wYlJ4QnVmID09IE5VTEwpIHsKCQkJcHJpbnRrKCIlcyBSeCBidWZmZXJzIGN1cnJlbnRseSBub3QgYWxsb2NhdGVkXG4iLAoJCQkgICAgICAgX19mdW5jX18pOwoJCQlnb3RvIEV4aXQ7CgkJfQoJCS8vIHJlYWQgY3VycmVudCBvZmZzZXQgaW4gcmVjZWl2ZSBidWZmZXIKCQl3Q3VyUnggPQoJCSAgICAoRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0NBUFIpICsKCQkgICAgIDB4MTApICUgRURSVl9SWF9CVUZGRVJfTEVOR1RIOwoKCQl3aGlsZSAoKEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSAmIEVEUlZfUkVHQl9DT01NQU5EX0JVRkUpID09IDApIHsJLy8gZnJhbWUgYXZhaWxhYmxlCgoJCQkvLyBjYWxjdWxhdGUgcG9pbnRlciB0byBjdXJyZW50IGZyYW1lIGluIHJlY2VpdmUgYnVmZmVyCgkJCXBiUnhCdWYgPSBFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgKyB3Q3VyUng7CgoJCQkvLyByZWFkIHJlY2VpdmUgc3RhdHVzIHUzMgoJCQlkd1J4U3RhdHVzID0gbGUzMl90b19jcHUoKigodTMyICopIHBiUnhCdWYpKTsKCgkJCS8vIGNhbGN1bGF0ZSBsZW5ndGggb2YgcmVjZWl2ZWQgZnJhbWUKCQkJdWlMZW5ndGggPSBkd1J4U3RhdHVzID4+IDE2OwoKCQkJaWYgKHVpTGVuZ3RoID09IDB4RkZGMCkgewkvLyBmcmFtZSBpcyB1bmZpbmlzaGVkIChtYXliZSBlYXJseSBSeCBpbnRlcnJ1cHQgaXMgYWN0aXZlKQoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX1JPSykgPT0gMCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlY2VpdmluZyB0aGlzIGZyYW1lCgkJCQkvLyBpZ25vcmUgaXQKCQkJCWlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX0ZBRSkgIT0gMCkgewoJCQkJCUVEUlZfQ09VTlRfUlhfRkFFOwoJCQkJfSBlbHNlIGlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX0NSQykgIT0gMCkgewoJCQkJCUVEUlZfVFJBQ0VfUlhfQ1JDKGR3UnhTdGF0dXMpOwoJCQkJCUVEUlZfQ09VTlRfUlhfQ1JDOwoJCQkJfSBlbHNlIHsKCQkJCQlFRFJWX1RSQUNFX1JYX0VSUihkd1J4U3RhdHVzKTsKCQkJCQlFRFJWX0NPVU5UX1JYX0VSUjsKCQkJCX0KCgkJCQkvLyByZWluaXRpYWxpemUgUnggcHJvY2VzcwoJCQkJRWRydlJlaW5pdFJ4KCk7CgoJCQkJYnJlYWs7CgkJCX0gZWxzZSB7CS8vIGZyYW1lIGlzIE9LCgkJCQlSeEJ1ZmZlci5tX0J1ZmZlckluRnJhbWUgPQoJCQkJICAgIGtFZHJ2QnVmZmVyTGFzdEluRnJhbWU7CgkJCQlSeEJ1ZmZlci5tX3VpUnhNc2dMZW4gPSB1aUxlbmd0aCAtIEVUSF9DUkNfU0laRTsKCQkJCVJ4QnVmZmVyLm1fcGJCdWZmZXIgPQoJCQkJICAgIHBiUnhCdWYgKyBzaXplb2YoZHdSeFN0YXR1cyk7CgovLyAgICAgICAgICAgICAgICBwcmludGsoIlIiKTsKCQkJCUVEUlZfQ09VTlRfUlg7CgoJCQkJLy8gY2FsbCBSeCBoYW5kbGVyIG9mIERhdGEgbGluayBsYXllcgoJCQkJRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0uCgkJCQkgICAgbV9wZm5SeEhhbmRsZXIoJlJ4QnVmZmVyKTsKCQkJfQoKCQkJLy8gY2FsdWxhdGUgbmV3IG9mZnNldCAodTMyIGFsaWduZWQpCgkJCXdDdXJSeCA9CgkJCSAgICAodTE2KSAoKHdDdXJSeCArIHVpTGVuZ3RoICsgc2l6ZW9mKGR3UnhTdGF0dXMpICsKCQkJCSAgICAgMykgJiB+MHgzKTsKCQkJRURSVl9UUkFDRV9DQVBSKHdDdXJSeCAtIDB4MTApOwoJCQlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0NBUFIsIHdDdXJSeCAtIDB4MTApOwoKCQkJLy8gcmVyZWFkIGN1cnJlbnQgb2Zmc2V0IGluIHJlY2VpdmUgYnVmZmVyCgkJCXdDdXJSeCA9CgkJCSAgICAoRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0NBUFIpICsKCQkJICAgICAweDEwKSAlIEVEUlZfUlhfQlVGRkVSX0xFTkdUSDsKCgkJfQoJfQoKCWlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfU0VSUikgIT0gMCkgewkvLyBQQ0kgZXJyb3IKCQlFRFJWX0NPVU5UX1BDSV9FUlI7Cgl9CgoJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9USU1FT1VUKSAhPSAwKSB7CS8vIFRpbWVvdXQKCQlFRFJWX0NPVU5UX1RJTUVPVVQ7Cgl9CgogICAgICBFeGl0OgoJcmV0dXJuIGlIYW5kbGVkOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydkluaXRPbmUKLy8KLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIG9uZSBQQ0kgZGV2aWNlCi8vCi8vIFBhcmFtZXRlcnM6ICBwUGNpRGV2ICAgICAgICAgICAgID0gcG9pbnRlciB0byBjb3JyZXNwb25kaW5nIFBDSSBkZXZpY2Ugc3RydWN0dXJlCi8vICAgICAgICAgICAgICBwSWQgICAgICAgICAgICAgICAgID0gUENJIGRldmljZSBJRAovLwovLyBSZXR1cm5zOiAgICAgKGludCkgICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgaW50IEVkcnZJbml0T25lKHN0cnVjdCBwY2lfZGV2ICpwUGNpRGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcElkKQp7CglpbnQgaVJlc3VsdCA9IDA7Cgl1MzIgZHdUZW1wOwoKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgIT0gTlVMTCkgewkvLyBFZHJ2IGlzIGFscmVhZHkgY29ubmVjdGVkIHRvIGEgUENJIGRldmljZQoJCXByaW50aygiJXMgZGV2aWNlICVzIGRpc2NhcmRlZFxuIiwgX19mdW5jX18sCgkJICAgICAgIHBjaV9uYW1lKHBQY2lEZXYpKTsKCQlpUmVzdWx0ID0gLUVOT0RFVjsKCQlnb3RvIEV4aXQ7Cgl9CgoJaWYgKHBQY2lEZXYtPnJldmlzaW9uID49IDB4MjApIHsKCQlwcmludGsKCQkgICAgKCIlcyBkZXZpY2UgJXMgaXMgYW4gZW5oYW5jZWQgODEzOUMrIHZlcnNpb24sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCgkJICAgICBfX2Z1bmNfXywgcGNpX25hbWUocFBjaURldikpOwoJCWlSZXN1bHQgPSAtRU5PREVWOwoJCWdvdG8gRXhpdDsKCX0KCglFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgPSBwUGNpRGV2OwoKCS8vIGVuYWJsZSBkZXZpY2UKCXByaW50aygiJXMgZW5hYmxlIGRldmljZVxuIiwgX19mdW5jX18pOwoJaVJlc3VsdCA9IHBjaV9lbmFibGVfZGV2aWNlKHBQY2lEZXYpOwoJaWYgKGlSZXN1bHQgIT0gMCkgewoJCWdvdG8gRXhpdDsKCX0KCglpZiAoKHBjaV9yZXNvdXJjZV9mbGFncyhwUGNpRGV2LCAxKSAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKSB7CgkJaVJlc3VsdCA9IC1FTk9ERVY7CgkJZ290byBFeGl0OwoJfQoKCXByaW50aygiJXMgcmVxdWVzdCByZWdpb25zXG4iLCBfX2Z1bmNfXyk7CglpUmVzdWx0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwUGNpRGV2LCBEUlZfTkFNRSk7CglpZiAoaVJlc3VsdCAhPSAwKSB7CgkJZ290byBFeGl0OwoJfQoKCXByaW50aygiJXMgaW9yZW1hcFxuIiwgX19mdW5jX18pOwoJRWRydkluc3RhbmNlX2wubV9wSW9BZGRyID0KCSAgICBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwUGNpRGV2LCAxKSwKCQkgICAgcGNpX3Jlc291cmNlX2xlbihwUGNpRGV2LCAxKSk7CglpZiAoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyID09IE5VTEwpIHsJLy8gcmVtYXAgb2YgY29udHJvbGxlcidzIHJlZ2lzdGVyIHNwYWNlIGZhaWxlZAoJCWlSZXN1bHQgPSAtRUlPOwoJCWdvdG8gRXhpdDsKCX0KCS8vIGVuYWJsZSBQQ0kgYnVzbWFzdGVyCglwcmludGsoIiVzIGVuYWJsZSBidXNtYXN0ZXJcbiIsIF9fZnVuY19fKTsKCXBjaV9zZXRfbWFzdGVyKHBQY2lEZXYpOwoKCS8vIHJlc2V0IGNvbnRyb2xsZXIKCXByaW50aygiJXMgcmVzZXQgY29udHJvbGxlclxuIiwgX19mdW5jX18pOwoJRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELCBFRFJWX1JFR0JfQ09NTUFORF9SU1QpOwoKCS8vIHdhaXQgdW50aWwgcmVzZXQgaGFzIGZpbmlzaGVkCglmb3IgKGlSZXN1bHQgPSA1MDA7IGlSZXN1bHQgPiAwOyBpUmVzdWx0LS0pIHsKCQlpZiAoKEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSAmIEVEUlZfUkVHQl9DT01NQU5EX1JTVCkKCQkgICAgPT0gMCkgewoJCQlicmVhazsKCQl9CgoJCXNjaGVkdWxlX3RpbWVvdXQoMTApOwoJfQoKCS8vIGNoZWNrIGhhcmR3YXJlIHZlcnNpb24sIGkuZS4gY2hpcCBJRAoJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVENSKTsKCWlmICgoKGR3VGVtcCAmIEVEUlZfUkVHRFdfVENSX1ZFUl9NQVNLKSAhPSBFRFJWX1JFR0RXX1RDUl9WRVJfQykKCSAgICAmJiAoKGR3VGVtcCAmIEVEUlZfUkVHRFdfVENSX1ZFUl9NQVNLKSAhPSBFRFJWX1JFR0RXX1RDUl9WRVJfRCkpIHsJLy8gdW5zdXBwb3J0ZWQgY2hpcAoJCXByaW50aygiJXMgVW5zdXBwb3J0ZWQgY2hpcCEgVENSID0gMHglMDhYXG4iLCBfX2Z1bmNfXywKCQkgICAgICAgZHdUZW1wKTsKCQlpUmVzdWx0ID0gLUVOT0RFVjsKCQlnb3RvIEV4aXQ7Cgl9CgkvLyBkaXNhYmxlIGludGVycnVwdHMKCXByaW50aygiJXMgZGlzYWJsZSBpbnRlcnJ1cHRzXG4iLCBfX2Z1bmNfXyk7CglFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCAwKTsKCS8vIGFja25vd2xlZGdlIGFsbCBwZW5kaW5nIGludGVycnVwdHMKCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX1NUQVRVUywKCQkJRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0lOVF9TVEFUVVMpKTsKCgkvLyBpbnN0YWxsIGludGVycnVwdCBoYW5kbGVyCglwcmludGsoIiVzIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXJcbiIsIF9fZnVuY19fKTsKCWlSZXN1bHQgPQoJICAgIHJlcXVlc3RfaXJxKHBQY2lEZXYtPmlycSwgVGd0RXRoSXNyLCBJUlFGX1NIQVJFRCwKCQkJRFJWX05BTUUgLypwUGNpRGV2LT5kZXYubmFtZSAqLyAsIHBQY2lEZXYpOwoJaWYgKGlSZXN1bHQgIT0gMCkgewoJCWdvdG8gRXhpdDsKCX0KCi8qCiAgICAvLyB1bmxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKICAgIHByaW50aygiJXMgdW5sb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzXG4iLCBfX2Z1bmNfXyk7CiAgICBFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NNRDkzNDYsIEVEUlZfUkVHQl9DTUQ5MzQ2X1VOTE9DSyk7CgogICAgLy8gY2hlY2sgaWYgdXNlciBzcGVjaWZpZWQgYSBNQUMgYWRkcmVzcwogICAgcHJpbnRrKCIlcyBjaGVjayBzcGVjaWZpZWQgTUFDIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKICAgIGZvciAoaVJlc3VsdCA9IDA7IGlSZXN1bHQgPCA2OyBpUmVzdWx0KyspCiAgICB7CiAgICAgICAgaWYgKEVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLm1fYWJNeU1hY0FkZHJbaVJlc3VsdF0gIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50aygiJXMgc2V0IGxvY2FsIE1BQyBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgIC8vIHdyaXRlIHRoaXMgTUFDIGFkZHJlc3MgdG8gY29udHJvbGxlcgogICAgICAgICAgICBFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfSURSMCwKICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KCooKHUzMiopJkVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLm1fYWJNeU1hY0FkZHJbMF0pKSk7CiAgICAgICAgICAgIGR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX0lEUjApOwoKICAgICAgICAgICAgRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX0lEUjQsCiAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdSgqKCh1MzIqKSZFZHJ2SW5zdGFuY2VfbC5tX0luaXRQYXJhbS5tX2FiTXlNYWNBZGRyWzRdKSkpOwogICAgICAgICAgICBkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19JRFI0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgaVJlc3VsdCA9IDA7CgogICAgLy8gbG9jayBjb25maWd1cmF0aW9uIHJlZ2lzdGVycwogICAgRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DTUQ5MzQ2LCBFRFJWX1JFR0JfQ01EOTM0Nl9MT0NLKTsKKi8KCgkvLyBhbGxvY2F0ZSBidWZmZXJzCglwcmludGsoIiVzIGFsbG9jYXRlIGJ1ZmZlcnNcbiIsIF9fZnVuY19fKTsKCUVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiA9CgkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9UWF9CVUZGRVJfU0laRSwKCQkJCSAmRWRydkluc3RhbmNlX2wubV9wVHhCdWZEbWEpOwoJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiA9PSBOVUxMKSB7CgkJaVJlc3VsdCA9IC1FTk9NRU07CgkJZ290byBFeGl0OwoJfQoKCUVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9CgkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9SWF9CVUZGRVJfU0laRSwKCQkJCSAmRWRydkluc3RhbmNlX2wubV9wUnhCdWZEbWEpOwoJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9PSBOVUxMKSB7CgkJaVJlc3VsdCA9IC1FTk9NRU07CgkJZ290byBFeGl0OwoJfQoJLy8gcmVzZXQgcG9pbnRlcnMgZm9yIFR4IGJ1ZmZlcnMKCXByaW50aygiJXMgcmVzZXQgcG9pbnRlcnMgZm8gVHggYnVmZmVyc1xuIiwgX19mdW5jX18pOwoJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQwLCAwKTsKCWR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX1RTQUQwKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMSwgMCk7Cglkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMSk7CglFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfVFNBRDIsIDApOwoJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDIpOwoJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQzLCAwKTsKCWR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX1RTQUQzKTsKCglwcmludGsoIiAgICBDb21tYW5kID0gMHglMDJYXG4iLAoJICAgICAgICh1MTYpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CgoJLy8gc2V0IHBvaW50ZXIgZm9yIHJlY2VpdmUgYnVmZmVyIGluIGNvbnRyb2xsZXIKCXByaW50aygiJXMgc2V0IHBvaW50ZXIgdG8gUnggYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CglFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfUkJTVEFSVCwgRWRydkluc3RhbmNlX2wubV9wUnhCdWZEbWEpOwoKCS8vIGVuYWJsZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIKCXByaW50aygiJXMgZW5hYmxlIFR4IGFuZCBSeCIsIF9fZnVuY19fKTsKCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwKCQkJKEVEUlZfUkVHQl9DT01NQU5EX1JFIHwgRURSVl9SRUdCX0NPTU1BTkRfVEUpKTsKCXByaW50aygiICBDb21tYW5kID0gMHglMDJYXG4iLAoJICAgICAgICh1MTYpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CgoJLy8gY2xlYXIgbWlzc2VkIHBhY2tldCBjb3VudGVyIHRvIGVuYWJsZSBSeC9UeCBwcm9jZXNzCglFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTVBDLCAwKTsKCgkvLyBzZXQgdHJhbnNtaXQgY29uZmlndXJhdGlvbiByZWdpc3RlcgoJcHJpbnRrKCIlcyBzZXQgVHggY29uZiByZWdpc3RlciIsIF9fZnVuY19fKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UQ1IsIEVEUlZfUkVHRFdfVENSX0RFRik7CglwcmludGsoIiA9IDB4JTA4WFxuIiwgRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVENSKSk7CgoJLy8gc2V0IHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcgoJcHJpbnRrKCIlcyBzZXQgUnggY29uZiByZWdpc3RlciIsIF9fZnVuY19fKTsKCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQ1IsIEVEUlZfUkVHRFdfUkNSX0RFRik7CglwcmludGsoIiA9IDB4JTA4WFxuIiwgRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfUkNSKSk7CgoJLy8gcmVzZXQgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZpbHRlcgoJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjAsIDApOwoJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSMCk7CglFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSNCwgMCk7Cglkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVI0KTsKCi8qCiAgICAvLyBlbmFibGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyCiAgICBwcmludGsoIiVzIGVuYWJsZSBUeCBhbmQgUngiLCBfX2Z1bmNfXyk7CiAgICBFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIChFRFJWX1JFR0JfQ09NTUFORF9SRSB8IEVEUlZfUkVHQl9DT01NQU5EX1RFKSk7CiAgICBwcmludGsoIiAgQ29tbWFuZCA9IDB4JTAyWFxuIiwgKHUxNikgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKKi8KCS8vIGRpc2FibGUgZWFybHkgaW50ZXJydXB0cwoJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19NVUxJTlQsIDApOwoKCS8vIGVuYWJsZSBpbnRlcnJ1cHRzCglwcmludGsoIiVzIGVuYWJsZSBpbnRlcnJ1cHRzXG4iLCBfX2Z1bmNfXyk7CglFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCBFRFJWX1JFR1dfSU5UX01BU0tfREVGKTsKCiAgICAgIEV4aXQ6CglwcmludGsoIiVzIGZpbmlzaGVkIHdpdGggJWRcbiIsIF9fZnVuY19fLCBpUmVzdWx0KTsKCXJldHVybiBpUmVzdWx0Owp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydlJlbW92ZU9uZQovLwovLyBEZXNjcmlwdGlvbjogc2h1dHMgZG93biBvbmUgUENJIGRldmljZQovLwovLyBQYXJhbWV0ZXJzOiAgcFBjaURldiAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gY29ycmVzcG9uZGluZyBQQ0kgZGV2aWNlIHN0cnVjdHVyZQovLwovLyBSZXR1cm5zOiAgICAgKHZvaWQpCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIHZvaWQgRWRydlJlbW92ZU9uZShzdHJ1Y3QgcGNpX2RldiAqcFBjaURldikKewoKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgIT0gcFBjaURldikgewkvLyB0cnlpbmcgdG8gcmVtb3ZlIHVua25vd24gZGV2aWNlCgkJQlVHX09OKEVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiAhPSBwUGNpRGV2KTsKCQlnb3RvIEV4aXQ7Cgl9CgkvLyBkaXNhYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlcgoJRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELCAwKTsKCgkvLyBkaXNhYmxlIGludGVycnVwdHMKCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX01BU0ssIDApOwoKCS8vIHJlbW92ZSBpbnRlcnJ1cHQgaGFuZGxlcgoJZnJlZV9pcnEocFBjaURldi0+aXJxLCBwUGNpRGV2KTsKCgkvLyBmcmVlIGJ1ZmZlcnMKCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgIT0gTlVMTCkgewoJCXBjaV9mcmVlX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9UWF9CVUZGRVJfU0laRSwKCQkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYsCgkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wVHhCdWZEbWEpOwoJCUVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiA9IE5VTEw7Cgl9CgoJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiAhPSBOVUxMKSB7CgkJcGNpX2ZyZWVfY29uc2lzdGVudChwUGNpRGV2LCBFRFJWX1JYX0JVRkZFUl9TSVpFLAoJCQkJICAgIEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiwKCQkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BSeEJ1ZkRtYSk7CgkJRWRydkluc3RhbmNlX2wubV9wYlJ4QnVmID0gTlVMTDsKCX0KCS8vIHVubWFwIGNvbnRyb2xsZXIncyByZWdpc3RlciBzcGFjZQoJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciAhPSBOVUxMKSB7CgkJaW91bm1hcChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIpOwoJfQoJLy8gZGlzYWJsZSB0aGUgUENJIGRldmljZQoJcGNpX2Rpc2FibGVfZGV2aWNlKHBQY2lEZXYpOwoKCS8vIHJlbGVhc2UgbWVtb3J5IHJlZ2lvbnMKCXBjaV9yZWxlYXNlX3JlZ2lvbnMocFBjaURldik7CgoJRWRydkluc3RhbmNlX2wubV9wUGNpRGV2ID0gTlVMTDsKCiAgICAgIEV4aXQ6Owp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRWRydkNhbGNIYXNoCi8vCi8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBlbnRyeSBmb3IgdGhlIGhhc2gtdGFibGUgZnJvbSBNQUMKLy8gICAgICAgICAgICAgIGFkZHJlc3MKLy8KLy8gUGFyYW1ldGVyczogIHBiTUFDX3AgLSBwb2ludGVyIHRvIE1BQyBhZGRyZXNzCi8vCi8vIFJldHVybnM6ICAgICBoYXNoIHZhbHVlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojZGVmaW5lIEhBU0hfQklUUyAgICAgICAgICAgICAgNgkvLyB1c2VkIGJpdHMgaW4gaGFzaAojZGVmaW5lIENSQzMyX1BPTFkgICAgMHgwNEMxMURCNgkvLwovLyNkZWZpbmUgQ1JDMzJfUE9MWSAgICAweEVEQjg4MzIwICAvLwovLyBHKHgpID0geDMyICsgeDI2ICsgeDIzICsgeDIyICsgeDE2ICsgeDEyICsgeDExICsgeDEwICsgeDggKyB4NyArIHg1ICsgeDQgKyB4MiArIHggKyAxCgpzdGF0aWMgdTggRWRydkNhbGNIYXNoKHU4ICogcGJNQUNfcCkKewoJdTMyIGR3Qnl0ZUNvdW50ZXI7Cgl1MzIgZHdCaXRDb3VudGVyOwoJdTMyIGR3RGF0YTsKCXUzMiBkd0NyYzsKCXUzMiBkd0NhcnJ5OwoJdTggKnBiRGF0YTsKCXU4IGJIYXNoOwoKCXBiRGF0YSA9IHBiTUFDX3A7CgoJLy8gY2FsY3VsYXRlIGNyYzMyIHZhbHVlIG9mIG1hYyBhZGRyZXNzCglkd0NyYyA9IDB4RkZGRkZGRkY7CgoJZm9yIChkd0J5dGVDb3VudGVyID0gMDsgZHdCeXRlQ291bnRlciA8IDY7IGR3Qnl0ZUNvdW50ZXIrKykgewoJCWR3RGF0YSA9ICpwYkRhdGE7CgkJcGJEYXRhKys7CgkJZm9yIChkd0JpdENvdW50ZXIgPSAwOyBkd0JpdENvdW50ZXIgPCA4OwoJCSAgICAgZHdCaXRDb3VudGVyKyssIGR3RGF0YSA+Pj0gMSkgewoJCQlkd0NhcnJ5ID0gKCgoZHdDcmMgPj4gMzEpIF4gZHdEYXRhKSAmIDEpOwoJCQlkd0NyYyA9IGR3Q3JjIDw8IDE7CgkJCWlmIChkd0NhcnJ5ICE9IDApIHsKCQkJCWR3Q3JjID0gKGR3Q3JjIF4gQ1JDMzJfUE9MWSkgfCBkd0NhcnJ5OwoJCQl9CgkJfQoJfQoKLy8gICAgcHJpbnRrKCJNeUNSQyA9IDB4JTA4bFhcbiIsIGR3Q3JjKTsKCS8vIG9ubHkgdXBwZXIgNiBiaXRzIChIQVNIX0JJVFMpIGFyZSB1c2VkCgkvLyB3aGljaCBwb2ludCB0byBzcGVjaWZpYyBiaXQgaW4gdGhlIGhhc2ggcmVnaXN0ZXJzCgliSGFzaCA9ICh1OCkgKChkd0NyYyA+PiAoMzIgLSBIQVNIX0JJVFMpKSAmIDB4M2YpOwoKCXJldHVybiBiSGFzaDsKfQo=