LyoKICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgogICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCgogICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKICAgIFNhbSBMYW50aW5nYQogICAgc2xvdWtlbkBsaWJzZGwub3JnCiovCgovKgoJQXVkaW8gaW50ZXJydXB0cwoKCVBhdHJpY2UgTWFuZGluLCBEaWRpZXIgTelxdWlnbm9uCiAqLwoKCS50ZXh0CgoJLmdsb2JsCV9TRExfTWludEF1ZGlvX0NhbGxiYWNrCgoJLmdsb2JsCV9TRExfTWludEF1ZGlvX1hiaW9zSW50ZXJydXB0CgkuZ2xvYmwJX1NETF9NaW50QXVkaW9fWGJpb3NJbnRlcnJ1cHRNZWFzdXJlQ2xvY2sKCS5nbG9ibAlfU0RMX01pbnRBdWRpb19EbWE4SW50ZXJydXB0CgkuZ2xvYmwJX1NETF9NaW50QXVkaW9fU3RmYUludGVycnVwdAoKCS5nbG9ibAlfU0RMX01pbnRBdWRpb19tdXRleAoJLmdsb2JsCV9TRExfTWludEF1ZGlvX2F1ZGlvYnVmCgkuZ2xvYmwJX1NETF9NaW50QXVkaW9fbnVtYnVmCgkuZ2xvYmwJX1NETF9NaW50QXVkaW9fYXVkaW9zaXplCgkuZ2xvYmwJX1NETF9NaW50QXVkaW9fY2xvY2t0aWNzCgkuZ2xvYmwJX1NETF9NaW50QXVkaW9faGFzZnB1CgoJLmdsb2JsCV9TRExfTWludEF1ZGlvX3N0ZmEKCi8qCglIb3cgaXQgd29ya3M6CgktIEF1ZGlvIGlzIHBsYXlpbmcgYnVmZmVyICMwIChyZXNwLiAjMSkKCS0gV2UgbXVzdCBjYWxjdWxhdGUgYSBzYW1wbGUgaW4gYnVmZmVyICMxIChyZXNwLiAjMCkKCSAgc28gd2UgZmlyc3QgY2FsbCB0aGUgY2FsbGJhY2sgdG8gZG8gaXQKCS0gVGhlbiB3ZSBzd2FwIHRoZSBidWZmZXJzCiovCgojZGVmaW5lCXNhdnB0cgkweDRhMgojZGVmaW5lCXNhdmFtdAkweDQ2CgovKi0tLSBTYXZlL3Jlc3RvcmUgRlBVIGNvbnRleHQgLS0tKi8KCiNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCgojZGVmaW5lIFNBVkVfRlBVX0NPTlRFWFQgXAoJbGVhCQlzcEAoLTIxNiksc3A7CVwKCWZzYXZlCQlzcEA7CVwKCWZtb3ZlbAkJZnBpYXIsc3BALTsJXAoJbGVhCQlzcEAoLTY0KSxzcDsJXAoJZm1vdmVtZAlmcDAtZnA3LHNwQAoKI2RlZmluZSBSRVNUT1JFX0ZQVV9DT05URVhUCVwKCWZtb3ZlbWQJCXNwQCxmcDAtZnA3OwlcCglsZWEJCXNwQCg2NCksc3A7CVwKCWZtb3ZlbAkJc3BAKyxmcGlhcjsJXAoJZnJlc3RvcmUJc3BAOwlcCglsZWEJCXNwQCgyMTYpLHNwCgojZWxzZQoKI2RlZmluZSBTQVZFX0ZQVV9DT05URVhUCVwKCS5jaGlwCTY4ay82ODg4MTsJXAoJZnNhdmUJc3BALTsJXAoJZm1vdmVtbCBmcGNyL2Zwc3IvZnBpYXIsc3BALTsJXAoJZm1vdmVteAlmcDAtZnA3LHNwQC07CVwKCS5jaGlwCTY4awoKI2RlZmluZSBSRVNUT1JFX0ZQVV9DT05URVhUCVwKCS5jaGlwCTY4ay82ODg4MTsJXAoJZm1vdmVteAlzcEArLGZwMC1mcDc7CVwKCWZtb3ZlbWwJc3BAKyxmcGNyL2Zwc3IvZnBpYXI7CVwKCWZyZXN0b3JlCXNwQCs7CVwKCS5jaGlwCTY4awoKI2VuZGlmCgovKi0tLSBYYmlvcyBpbnRlcnJ1cHQgdmVjdG9yIHRvIG1lYXN1cmUgRmFsY29uIGV4dGVybmFsIGNsb2NrIC0tLSovCgpfU0RMX01pbnRBdWRpb19YYmlvc0ludGVycnVwdE1lYXN1cmVDbG9jazogICAgICAgICAgLyogMSBtUyAqLwojaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQoJbW92ZWwJZDAsc3BALQoJCgltb3ZlcWwJIzAsZDAKCWJ0c3QJZDAsMHhGRkZGODkwMTp3CS8qIHN0YXRlIERNQSBzb3VuZCAqLwojZWxzZQoJYnRzdAkjMCwweEZGRkY4OTAxOncJLyogc3RhdGUgRE1BIHNvdW5kICovCiNlbmRpZgoJYmVxcwlTRExfTWludEF1ZGlvX0VuZEludE1lYXN1cmUKCWFkZHFsCSMxLF9TRExfTWludEF1ZGlvX2Nsb2NrdGljcwpTRExfTWludEF1ZGlvX0VuZEludE1lYXN1cmU6CiNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCgltb3ZlcWwJIzUsZDAKCWJjbHIJZDAsMHhGRkZGRkEwRjp3CS8qIENsZWFyIHNlcnZpY2UgYml0ICovCgoJbW92ZWwJc3BAKyxkMAojZWxzZQoJYmNscgkjNSwweEZGRkZGQTBGOncJLyogQ2xlYXIgc2VydmljZSBiaXQgKi8KI2VuZGlmCglydGUKCi8qLS0tIFhiaW9zIGludGVycnVwdCB2ZWN0b3IgLS0tKi8KCl9TRExfTWludEF1ZGlvX1hiaW9zSW50ZXJydXB0OgojaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQoJbGVhCXNwQCgtNjApLHNwCgltb3ZlbWwJZDAtZDcvYTAtYTYsc3BACiNlbHNlCgltb3ZlbWwJZDAtZDcvYTAtYTYsc3BALQojZW5kaWYKCgkvKiBSZWVuYWJsZSBpbnRlcnJ1cHRzLCBzbyBvdGhlciBpbnRlcnJ1cHRzIGNhbiB3b3JrICovCgltb3ZldwkjMHgyMzAwLHNyCgoJLyogQ2xlYXIgc2VydmljZSBiaXQsIHNvIG90aGVyIE1GUCBpbnRlcnJ1cHRzIGNhbiB3b3JrICovCiNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCgltb3ZlcWwJIzUsZDAKCWJjbHIJZDAsMHhmZmZmZmEwZjp3CiNlbHNlCgliY2xyCSM1LDB4ZmZmZmZhMGY6dwojZW5kaWYKCgkvKiBDaGVjayBpZiB3ZSBhcmUgbm90IGFscmVhZHkgcnVubmluZyAqLwoJdHN0dwlfU0RMX01pbnRBdWRpb19tdXRleAoJYm5lCVNETF9NaW50QXVkaW9fWGJpb3NFbmQKCiNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCgltb3ZldwlfU0RMX01pbnRBdWRpb19tdXRleCxkMAoJbm90bAlkMAoJbW92ZXcJZDAsX1NETF9NaW50QXVkaW9fbXV0ZXgKCgltb3ZldwlfU0RMX01pbnRBdWRpb19udW1idWYsZDEKCWVvcmwJIzEsZDEKCW1vdmV3CWQxLF9TRExfTWludEF1ZGlvX251bWJ1ZgojZWxzZQoJbm90dwlfU0RMX01pbnRBdWRpb19tdXRleAoKCS8qIFN3YXAgYnVmZmVycyAqLwoJZW9ydwkjMSxfU0RMX01pbnRBdWRpb19udW1idWYKI2VuZGlmCgkKCS8qIFNhdmUgRlBVIGlmIG5lZWRlZCAqLwoJdHN0dwlfU0RMX01pbnRBdWRpb19oYXNmcHUKCWJlcXMJU0RMX01pbnRBdWRpb19YYmlvc19ub2ZwdTEKCVNBVkVfRlBVX0NPTlRFWFQKU0RMX01pbnRBdWRpb19YYmlvc19ub2ZwdTE6CgoJLyogQ2FsbGJhY2sgKi8KCWpzcglfU0RMX01pbnRBdWRpb19DYWxsYmFjawoKCS8qIFJlc3RvcmUgRlBVIGlmIG5lZWRlZCAqLwoJdHN0dwlfU0RMX01pbnRBdWRpb19oYXNmcHUKCWJlcXMJU0RMX01pbnRBdWRpb19YYmlvc19ub2ZwdTIKCVJFU1RPUkVfRlBVX0NPTlRFWFQKU0RMX01pbnRBdWRpb19YYmlvc19ub2ZwdTI6CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgcmVnaXN0ZXJzICovCiNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCgltb3ZlbAkjc2F2YW10LGQwCglzdWJsCWQwLHNhdnB0cgojZWxzZQoJc3VibAkjc2F2YW10LHNhdnB0cgojZW5kaWYKCgkvKiBTZXQgbmV3IGJ1ZmZlciAqLwoKCW1vdmVxCSMwLGQwCgltb3ZlbAlfU0RMX01pbnRBdWRpb19hdWRpb3NpemUsZDEKCgltb3ZldwlfU0RMX01pbnRBdWRpb19udW1idWYsZDAKCWxzbGwJIzIsZDAKCWxlYQlfU0RMX01pbnRBdWRpb19hdWRpb2J1ZixhMAoJbW92ZWwJYTBAKGQwOmwpLGExCgoJbGVhCWExQChkMTpsKSxhMgoKCW1vdmVsCWEyLHNwQC0KCW1vdmVsCWExLHNwQC0KCWNscncJc3BALQoJbW92ZXcJIzEzMSxzcEAtCgl0cmFwCSMxNAoJbGVhCXNwQCgxMiksc3AKCgkvKiBSZXN0b3JlIHJlZ2lzdGVycyBzcGFjZSAqLwojaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQoJbW92ZWwJI3NhdmFtdCxkMAoJYWRkbAlkMCxzYXZwdHIKI2Vsc2UKCWFkZGwJI3NhdmFtdCxzYXZwdHIKI2VuZGlmCgoJY2xydwlfU0RMX01pbnRBdWRpb19tdXRleApTRExfTWludEF1ZGlvX1hiaW9zRW5kOgojaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQoJbW92ZW1sCXNwQCxkMC1kNy9hMC1hNgoJbGVhCXNwQCg2MCksc3AKI2Vsc2UKCW1vdmVtbAlzcEArLGQwLWQ3L2EwLWE2CiNlbmRpZgoJcnRlCgovKi0tLSBETUEgOCBiaXRzIGludGVycnVwdCB2ZWN0b3IgLS0tKi8KCl9TRExfTWludEF1ZGlvX0RtYThJbnRlcnJ1cHQ6CiNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCglsZWEJc3BAKC0xNiksc3AKCW1vdmVtbAlkMC1kMS9hMC1hMSxzcEAKI2Vsc2UKCW1vdmVtbAlkMC1kMS9hMC1hMSxzcEAtCiNlbmRpZgoKCS8qIFJlZW5hYmxlIGludGVycnVwdHMsIHNvIG90aGVyIGludGVycnVwdHMgY2FuIHdvcmsgKi8KCW1vdmV3CSMweDIzMDAsc3IKCgkvKiBDbGVhciBzZXJ2aWNlIGJpdCwgc28gb3RoZXIgTUZQIGludGVycnVwdHMgY2FuIHdvcmsgKi8KI2lmIGRlZmluZWQoX19tY29sZGZpcmVfXykKCW1vdmVxbAkjNSxkMAoJYmNscglkMCwweGZmZmZmYTBmOncKI2Vsc2UKCWJjbHIJIzUsMHhmZmZmZmEwZjp3CiNlbmRpZgoJLyogQ2hlY2sgaWYgd2UgYXJlIG5vdCBhbHJlYWR5IHJ1bm5pbmcgKi8KCXRzdHcJX1NETF9NaW50QXVkaW9fbXV0ZXgKCWJuZQlTRExfTWludEF1ZGlvX0RtYThFbmQKCiNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCgltb3ZldwlfU0RMX01pbnRBdWRpb19tdXRleCxkMAoJbm90bAlkMAoJbW92ZXcJZDAsX1NETF9NaW50QXVkaW9fbXV0ZXgKCgltb3ZldwlfU0RMX01pbnRBdWRpb19udW1idWYsZDEKCWVvcmwJIzEsZDEKCW1vdmV3CWQxLF9TRExfTWludEF1ZGlvX251bWJ1ZgojZWxzZQoJbm90dwlfU0RMX01pbnRBdWRpb19tdXRleAoKCS8qIFN3YXAgYnVmZmVycyAqLwoJZW9ydwkjMSxfU0RMX01pbnRBdWRpb19udW1idWYKI2VuZGlmCgoJLyogU2F2ZSBGUFUgaWYgbmVlZGVkICovCgl0c3R3CV9TRExfTWludEF1ZGlvX2hhc2ZwdQoJYmVxcwlTRExfTWludEF1ZGlvX0RtYThfbm9mcHUxCglTQVZFX0ZQVV9DT05URVhUClNETF9NaW50QXVkaW9fRG1hOF9ub2ZwdTE6CgoJLyogQ2FsbGJhY2sgKi8KCWpzcglfU0RMX01pbnRBdWRpb19DYWxsYmFjawoKCS8qIFJlc3RvcmUgRlBVIGlmIG5lZWRlZCAqLwoJdHN0dwlfU0RMX01pbnRBdWRpb19oYXNmcHUKCWJlcXMJU0RMX01pbnRBdWRpb19EbWE4X25vZnB1MgoJUkVTVE9SRV9GUFVfQ09OVEVYVApTRExfTWludEF1ZGlvX0RtYThfbm9mcHUyOgoKCS8qIFNldCBuZXcgYnVmZmVyICovCgoJbW92ZXEJIzAsZDAKCgltb3ZldwlfU0RMX01pbnRBdWRpb19udW1idWYsZDAKCWxzbGwJIzIsZDAKCWxlYQlfU0RMX01pbnRBdWRpb19hdWRpb2J1ZixhMAoJbW92ZWwJYTBAKGQwOmwpLGQxCgoJLyogTW9kaWZ5IERNQSBhZGRyZXNzZXMgKi8KCWxlYQkweGZmZmY4OTAwOncsYTAKCgltb3ZlbAlkMSxkMAoKCW1vdmViCWQwLGEwQCgweDA3KQkvKiBTdGFydCBhZGRyZXNzICovCglsc3JsCSM4LGQwCgltb3ZlYglkMCxhMEAoMHgwNSkKCWxzcmwJIzgsZDAKCW1vdmViCWQwLGEwQCgweDAzKQoKCWFkZGwJX1NETF9NaW50QXVkaW9fYXVkaW9zaXplLGQxCgoJbW92ZWwJZDEsZDAKCgltb3ZlYglkMCxhMEAoMHgxMykJLyogRW5kIGFkZHJlc3MgKi8KCWxzcmwJIzgsZDAKCW1vdmViCWQwLGEwQCgweDExKQoJbHNybAkjOCxkMAoJbW92ZWIJZDAsYTBAKDB4MGYpCgoJY2xydwlfU0RMX01pbnRBdWRpb19tdXRleApTRExfTWludEF1ZGlvX0RtYThFbmQ6CiNpZiBkZWZpbmVkKF9fbWNvbGRmaXJlX18pCgltb3ZlbWwJc3BALGQwLWQxL2EwLWExCglsZWEJc3BAKDE2KSxzcAojZWxzZQoJbW92ZW1sCXNwQCssZDAtZDEvYTAtYTEKI2VuZGlmCglydGUKCi8qLS0tIFNURkEgaW50ZXJydXB0IHZlY3RvciAtLS0qLwoKU1RGQV9TT1VORF9TVEFSVAk9CTYKU1RGQV9TT1VORF9FTkQJCT0JU1RGQV9TT1VORF9TVEFSVCs4CgpfU0RMX01pbnRBdWRpb19TdGZhSW50ZXJydXB0OgoJLyogUmVlbmFibGUgaW50ZXJydXB0cywgc28gb3RoZXIgaW50ZXJydXB0cyBjYW4gd29yayAqLwoJbW92ZXcJIzB4MjMwMCxzcgoKCS8qIENoZWNrIGlmIHdlIGFyZSBub3QgYWxyZWFkeSBydW5uaW5nICovCgl0c3R3CV9TRExfTWludEF1ZGlvX211dGV4CgojaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQoJYm5lCVNETF9NaW50QXVkaW9fU3RmYUVuZAoKCWxlYQlzcEAoLTYwKSxzcAoJbW92ZW1sCWQwLWQ3L2EwLWE2LHNwQAoKCW1vdmV3CV9TRExfTWludEF1ZGlvX211dGV4LGQwCglub3RsCWQwCgltb3ZldwlkMCxfU0RMX01pbnRBdWRpb19tdXRleAoKCW1vdmV3CV9TRExfTWludEF1ZGlvX251bWJ1ZixkMQoJZW9ybAkjMSxkMQoJbW92ZXcJZDEsX1NETF9NaW50QXVkaW9fbnVtYnVmCiNlbHNlCglibmVzCVNETF9NaW50QXVkaW9fU3RmYUVuZAoKCW1vdmVtbAlkMC1kNy9hMC1hNixzcEAtCgoJbm90dwlfU0RMX01pbnRBdWRpb19tdXRleAoKCS8qIFN3YXAgYnVmZmVycyAqLwoJZW9ydwkjMSxfU0RMX01pbnRBdWRpb19udW1idWYKI2VuZGlmCgkKCS8qIFNhdmUgRlBVIGlmIG5lZWRlZCAqLwoJdHN0dwlfU0RMX01pbnRBdWRpb19oYXNmcHUKCWJlcXMJU0RMX01pbnRBdWRpb19TdGZhX25vZnB1MQoJU0FWRV9GUFVfQ09OVEVYVApTRExfTWludEF1ZGlvX1N0ZmFfbm9mcHUxOgoKCS8qIENhbGxiYWNrICovCglqc3IJX1NETF9NaW50QXVkaW9fQ2FsbGJhY2sKCgkvKiBSZXN0b3JlIEZQVSBpZiBuZWVkZWQgKi8KCXRzdHcJX1NETF9NaW50QXVkaW9faGFzZnB1CgliZXFzCVNETF9NaW50QXVkaW9fU3RmYV9ub2ZwdTIKCVJFU1RPUkVfRlBVX0NPTlRFWFQKU0RMX01pbnRBdWRpb19TdGZhX25vZnB1MjoKCgkvKiBTZXQgbmV3IGJ1ZmZlciAqLwoKCW1vdmVxCSMwLGQwCgltb3ZlbAlfU0RMX01pbnRBdWRpb19zdGZhLGExCgoJbW92ZXcJX1NETF9NaW50QXVkaW9fbnVtYnVmLGQwCglsc2xsCSMyLGQwCglsZWEJX1NETF9NaW50QXVkaW9fYXVkaW9idWYsYTAKCW1vdmVsCWEwQChkMDpsKSxkMQoKCS8qIE1vZGlmeSBTVEZBIHJlcGxheSBidWZmZXJzICovCgltb3ZlbAlkMSxhMUAoU1RGQV9TT1VORF9TVEFSVCkKCWFkZGwJX1NETF9NaW50QXVkaW9fYXVkaW9zaXplLGQxCgltb3ZlbAlkMSxhMUAoU1RGQV9TT1VORF9FTkQpCgojaWYgZGVmaW5lZChfX21jb2xkZmlyZV9fKQoJbW92ZW1sCXNwQCxkMC1kNy9hMC1hNgoJbGVhCXNwQCg2MCksc3AKI2Vsc2UKCW1vdmVtbAlzcEArLGQwLWQ3L2EwLWE2CiNlbmRpZgoJY2xydwlfU0RMX01pbnRBdWRpb19tdXRleApTRExfTWludEF1ZGlvX1N0ZmFFbmQ6CglydGUK