LyoKICogIFUtYm9vdCAtIHg4NiBTdGFydHVwIENvZGUKICoKICogKEMpIENvcHlyaWdodCAyMDA4LTIwMTEKICogR3JhZW1lIFJ1c3MsIDxncmFlbWUucnVzc0BnbWFpbC5jb20+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMiwyMDAzCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCA8ZGFuaWVsQG9taWNyb24uc2U+CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGFzbS9nbG9iYWxfZGF0YS5oPgojaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgoKI2RlZmluZSBCT09UX1NFRwkweGZmZmYwMDAwCS8qIGxpbmVhciBzZWdtZW50IG9mIGJvb3QgY29kZSAqLwojZGVmaW5lIGEzMgkJLmJ5dGUgMHg2NzsKI2RlZmluZSBvMzIJCS5ieXRlIDB4NjY7Cgouc2VjdGlvbiAuc3RhcnQxNiwgImF4IgouY29kZTE2Ci5nbG9ibCBzdGFydDE2CnN0YXJ0MTY6CgkvKiBTZXQgdGhlIENvbGQgQm9vdCAvIEhhcmQgUmVzZXQgZmxhZyAqLwoJbW92bAkkR0RfRkxHX0NPTERfQk9PVCwgJWVieAoKCS8qCgkgKiBGaXJzdCB3ZSBsZXQgdGhlIEJTUCBkbyBzb21lIGVhcmx5IGluaXRpYWxpemF0aW9uCgkgKiB0aGlzIGNvZGUgaGF2ZSB0byBtYXAgdGhlIGZsYXNoIHRvIGl0cyBmaW5hbCBwb3NpdGlvbgoJICovCglqbXAJYm9hcmRfaW5pdDE2Ci5nbG9ibCBib2FyZF9pbml0MTZfcmV0CmJvYXJkX2luaXQxNl9yZXQ6CgoJLyogVHVybiBvZiBjYWNoZSAodGhpcyBtaWdodCByZXF1aXJlIGEgNDg2LWNsYXNzIENQVSkgKi8KCW1vdmwJJWNyMCwgJWVheAoJb3JsCSQoWDg2X0NSMF9OVyAmIFg4Nl9DUjBfQ0QpLCAlZWF4Cgltb3ZsCSVlYXgsICVjcjAKCXdiaW52ZAoKCS8qIGxvYWQgdGhlIHRlbXBvcmFyeSBHbG9iYWwgRGVzY3JpcHRvciBUYWJsZSAqLwpvMzIgY3MJbGlkdAlpZHRfcHRyCm8zMiBjcwlsZ2R0CWdkdF9wdHIKCgkvKiBOb3csIHdlIGVudGVyIHByb3RlY3RlZCBtb2RlICovCgltb3ZsCSVjcjAsICVlYXgKCW9ybAkkWDg2X0NSMF9QRSwgJWVheAoJbW92bAklZWF4LCAlY3IwCgoJLyogRmx1c2ggdGhlIHByZWZldGNoIHF1ZXVlICovCglqbXAJZmYKZmY6CgkvKiBGaW5hbGx5IGp1bXAgdG8gdGhlIDMyYml0IGluaXRpYWxpemF0aW9uIGNvZGUgKi8KCW1vdncJJGNvZGUzMnN0YXJ0LCAlYXgKCW1vdncJJWF4LCAlYnAKbzMyIGNzCWxqbXAJKiglYnApCgoJLyogNDgtYml0IGZhciBwb2ludGVyICovCmNvZGUzMnN0YXJ0OgoJLmxvbmcJX3N0YXJ0CQkvKiBvZmZzZXQgKi8KCS53b3JkCTB4MTAJCS8qIHNlZ21lbnQgKi8KCmlkdF9wdHI6Cgkud29yZAkwCQkvKiBsaW1pdCAqLwoJLmxvbmcJMAkJLyogYmFzZSAqLwoKLyoKICogVGhlIGZvbGxvd2luZyBHbG9iYWwgRGVzY3JpcHRvciBUYWJsZSBpcyBqdXN0IGVub3VnaCB0byBnZXQgdXMgaW50bwogKiAnRmxhdCBQcm90ZWN0ZWQgTW9kZScgLSBJdCB3aWxsIGJlIGRpc2NhcmRlZCBhcyBzb29uIGFzIHRoZSBmaW5hbAogKiBHRFQgaXMgc2V0dXAgaW4gYSBzYWZlIGxvY2F0aW9uIGluIFJBTQogKi8KZ2R0X3B0cjoKCS53b3JkCTB4MjAJCS8qIGxpbWl0ICgzMiBieXRlcyA9IDQgR0RUIGVudHJpZXMpICovCgkubG9uZwlCT09UX1NFRyArIGdkdAkvKiBiYXNlICovCgoJLyogVGhlIEdEVCB0YWJsZSAuLi4KCSAqCgkgKgkgU2VsZWN0b3IJVHlwZQoJICoJIDB4MDAJCU5VTEwKCSAqCSAweDA4CQlVbnVzZWQKCSAqCSAweDEwCQkzMmJpdCBjb2RlCgkgKgkgMHgxOAkJMzJiaXQgZGF0YS9zdGFjawoJICovCgpnZHQ6Cgkud29yZAkwLCAwLCAwLCAwCS8qIE5VTEwgICovCgkud29yZAkwLCAwLCAwLCAwCS8qIHVudXNlZCAqLwoKCS53b3JkCTB4RkZGRgkJLyogNEdiIC0gKDB4MTAwMDAwKjB4MTAwMCA9IDRHYikgKi8KCS53b3JkCTAJCS8qIGJhc2UgYWRkcmVzcyA9IDAgKi8KCS53b3JkCTB4OUIwMAkJLyogY29kZSByZWFkL2V4ZWMgKi8KCS53b3JkCTB4MDBDRgkJLyogZ3JhbnVsYXJpdHkgPSA0MDk2LCAzODYgKCs1dGggbmliYmxlIG9mIGxpbWl0KSAqLwoKCS53b3JkCTB4RkZGRgkJLyogNEdiIC0gKDB4MTAwMDAwKjB4MTAwMCA9IDRHYikgKi8KCS53b3JkCTB4MAkJLyogYmFzZSBhZGRyZXNzID0gMCAqLwoJLndvcmQJMHg5MzAwCQkvKiBkYXRhIHJlYWQvd3JpdGUgKi8KCS53b3JkCTB4MDBDRgkJLyogZ3JhbnVsYXJpdHkgPSA0MDk2LCAzODYgKCs1dGggbmliYmxlIG9mIGxpbWl0KSAqLwo=