LyoKICogIFUtYm9vdCAtIGkzODYgU3RhcnR1cCBDb2RlCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgT21pY3JvbiBDZXRpIEFCLCBEYW5pZWwgRW5nc3Ry9m0gPGRlbmFpZWxAb21pY3Jvbi5zZT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgoKI2RlZmluZSBCT09UX1NFRwkweGZmZmYwMDAwCS8qIGxpbmVhciBzZWdtZW50IG9mIGJvb3QgY29kZSAqLwojZGVmaW5lIGEzMgkJLmJ5dGUgMHg2NzsKI2RlZmluZSBvMzIJCS5ieXRlIDB4NjY7Cgouc2VjdGlvbiAuc3RhcnQxNiwgImF4IgouY29kZTE2Ci5nbG9ibCBzdGFydDE2CnN0YXJ0MTY6CgkvKiBGaXJzdCB3ZSBsZXQgdGhlIEJTUCBkbyBzb21lIGVhcmx5IGluaXRpYWxpemF0aW9uCgkgKiB0aGlzIGNvZGUgaGF2ZSB0byBtYXAgdGhlIGZsYXNoIHRvIGl0cyBmaW5hbCBwb3NpdGlvbgoJICovCgltb3YJJGJvYXJkX2luaXQxNl9yZXQsICVicAoJam1wCWJvYXJkX2luaXQxNgpib2FyZF9pbml0MTZfcmV0OgoKCS8qIFR1cm4gb2YgY2FjaGUgKHRoaXMgbWlnaHQgcmVxdWlyZSBhIDQ4Ni1jbGFzcyBDUFUpICovCgltb3ZsICAgICVjcjAsICVlYXgKCW9ybCAgICAgJDB4NjAwMDAwMDAsJWVheAoJbW92bCAgICAlZWF4LCAlY3IwCgl3YmludmQKCgkvKiBsb2FkIHRoZSBkZXNjcmlwdG9yIHRhYmxlcyAqLwpvMzIgY3MJbGlkdAlpZHRfcHRyCm8zMiBjcwlsZ2R0ICAgIGdkdF9wdHIKCgoJLyogTm93LCB3ZSBlbnRlciBwcm90ZWN0ZWQgbW9kZSAqLwoJbW92bCAgICAlY3IwLCAlZWF4CglvcmwgICAgICQxLCVlYXgKCW1vdmwgICAgJWVheCwgJWNyMAoKCS8qIEZsdXNoIHRoZSBwcmVmZXRjaCBxdWV1ZSAqLwoJam1wICAgICBmZgpmZjoKCgkvKiBGaW5hbGx5IGp1bXAgdG8gdGhlIDMyYml0IGluaXRpYWxpemF0aW9uIGNvZGUgKi8KCW1vdncJJGNvZGUzMnN0YXJ0LCAlYXgKCW1vdncgICAgJWF4LCVicApvMzIgY3MJbGptcAkqKCVicCkKCgkvKiA0OC1iaXQgZmFyIHBvaW50ZXIgKi8KY29kZTMyc3RhcnQ6CgkubG9uZwlfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCAqLwoJLndvcmQJMHgxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWdtZW50ICovCgppZHRfcHRyOgoJLndvcmQJMAkJCQkvKiBsaW1pdCAqLwoJLmxvbmcJMAkJICAgICAgIAkJLyogYmFzZSAqLwoKZ2R0X3B0cjoKCS53b3JkCTB4MzAJCQkgICAgICAgIC8qIGxpbWl0ICg0OCBieXRlcyA9IDYgR0RUIGVudHJpZXMpICovCgkubG9uZwlCT09UX1NFRyArIGdkdAkgICAgICAgIAkvKiBiYXNlICovCgoJLyogVGhlIEdEVCB0YWJsZSAuLi4KCSAqCgkgKiAgICAgICBTZWxlY3RvcglUeXBlCgkgKiAJIDB4MDAJCU5VTEwKCSAqIAkgMHgwOAkJVW51c2VkCgkgKgkgMHgxMAkJMzJiaXQgY29kZQoJICoJIDB4MTgJCTMyYml0IGRhdGEvc3RhY2sKCSAqCSAweDIwCQkxNmJpdCBjb2RlCgkgKgkgMHgyOAkgCTE2Yml0IGRhdGEvc3RhY2sKCSAqLwoKZ2R0OgoJLndvcmQJMCwgMCwgMCwgMAkJCS8qIE5VTEwgICovCgkud29yZAkwLCAwLCAwLCAwCQkJLyogdW51c2VkICovCgoJLndvcmQJMHhGRkZGCQkJCS8qIDRHYiAtICgweDEwMDAwMCoweDEwMDAgPSA0R2IpICovCgkud29yZAkwCQkJCS8qIGJhc2UgYWRkcmVzcyA9IDAgKi8KCS53b3JkCTB4OUIwMAkJCQkvKiBjb2RlIHJlYWQvZXhlYyAqLwoJLndvcmQJMHgwMENGCQkJCS8qIGdyYW51bGFyaXR5ID0gNDA5NiwgMzg2ICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkgKi8KCgkud29yZAkweEZGRkYJCQkJLyogNEdiIC0gKDB4MTAwMDAwKjB4MTAwMCA9IDRHYikgKi8KCS53b3JkCTB4MAkJCQkvKiBiYXNlIGFkZHJlc3MgPSAwICovCgkud29yZAkweDkzMDAJCQkJLyogZGF0YSByZWFkL3dyaXRlICovCgkud29yZAkweDAwQ0YJCQkJLyogZ3JhbnVsYXJpdHkgPSA0MDk2LCAzODYgKCs1dGggbmliYmxlIG9mIGxpbWl0KSAqLwoKCS53b3JkCTB4RkZGRgkJCQkvKiA2NGtiICovCgkud29yZAkwCQkJCS8qIGJhc2UgYWRkcmVzcyA9IDAgKi8KCS53b3JkCTB4OWIwMAkJCQkvKiBkYXRhIHJlYWQvd3JpdGUgKi8KCS53b3JkCTB4MDAxMAkJCQkvKiBncmFudWxhcml0eSA9IDEgICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkgKi8KCgkud29yZAkweEZGRkYJCQkJLyogNjRrYiAqLwoJLndvcmQJMAkJCQkvKiBiYXNlIGFkZHJlc3MgPSAwICovCgkud29yZAkweDkzMDAJCQkJLyogZGF0YSByZWFkL3dyaXRlICovCgkud29yZAkweDAwMTAJCQkJLyogZ3JhbnVsYXJpdHkgPSAxICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkgKi8K