LyoKICogIGFybWJvb3QgLSBTdGFydHVwIENvZGUgZm9yIEFSTTcyMCBDUFUtY29yZQogKgogKiAgQ29weXJpZ2h0IChjKSAyMDAxCU1hcml1cyBHcvZnZXIgPG1hZ0BzeXNnby5kZT4KICogIENvcHlyaWdodCAoYykgMjAwMglBbGV4IFr8cGtlIDxhenVAc3lzZ28uZGU+CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKCiNpbmNsdWRlIDxjb25maWcuaD4KI2luY2x1ZGUgPHZlcnNpb24uaD4KI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgoKLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogSnVtcCB2ZWN0b3IgdGFibGUgYXMgaW4gdGFibGUgMy4xIGluIFsxXQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCgouZ2xvYmwgX3N0YXJ0Cl9zdGFydDogYglyZXNldAoJbGRyCXBjLCBfdW5kZWZpbmVkX2luc3RydWN0aW9uCglsZHIJcGMsIF9zb2Z0d2FyZV9pbnRlcnJ1cHQKCWxkcglwYywgX3ByZWZldGNoX2Fib3J0CglsZHIJcGMsIF9kYXRhX2Fib3J0CglsZHIJcGMsIF9ub3RfdXNlZAoJbGRyCXBjLCBfaXJxCglsZHIJcGMsIF9maXEKCl91bmRlZmluZWRfaW5zdHJ1Y3Rpb246IC53b3JkIHVuZGVmaW5lZF9pbnN0cnVjdGlvbgpfc29mdHdhcmVfaW50ZXJydXB0Ogkud29yZCBzb2Z0d2FyZV9pbnRlcnJ1cHQKX3ByZWZldGNoX2Fib3J0Ogkud29yZCBwcmVmZXRjaF9hYm9ydApfZGF0YV9hYm9ydDoJCS53b3JkIGRhdGFfYWJvcnQKX25vdF91c2VkOgkJLndvcmQgbm90X3VzZWQKX2lycToJCQkud29yZCBpcnEKX2ZpcToJCQkud29yZCBmaXEKCgkuYmFsaWdubCAxNiwweGRlYWRiZWVmCgoKLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogU3RhcnR1cCBDb2RlIChyZXNldCB2ZWN0b3IpCiAqCiAqIGRvIGltcG9ydGFudCBpbml0IG9ubHkgaWYgd2UgZG9uJ3Qgc3RhcnQgZnJvbSBSQU0hCiAqIHJlbG9jYXRlIGFybWJvb3QgdG8gcmFtCiAqIHNldHVwIHN0YWNrCiAqIGp1bXAgdG8gc2Vjb25kIHN0YWdlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKX1RFWFRfQkFTRToKCS53b3JkCVRFWFRfQkFTRQoKLmdsb2JsIF9hcm1ib290X3N0YXJ0Cl9hcm1ib290X3N0YXJ0OgoJLndvcmQgX3N0YXJ0CgovKgogKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdC4KICovCi5nbG9ibCBfYnNzX3N0YXJ0Cl9ic3Nfc3RhcnQ6Cgkud29yZCBfX2Jzc19zdGFydAoKLmdsb2JsIF9ic3NfZW5kCl9ic3NfZW5kOgoJLndvcmQgX2VuZAoKI2lmZGVmIENPTkZJR19VU0VfSVJRCi8qIElSUSBzdGFjayBtZW1vcnkgKGNhbGN1bGF0ZWQgYXQgcnVuLXRpbWUpICovCi5nbG9ibCBJUlFfU1RBQ0tfU1RBUlQKSVJRX1NUQUNLX1NUQVJUOgoJLndvcmQJMHgwYmFkYzBkZQoKLyogSVJRIHN0YWNrIG1lbW9yeSAoY2FsY3VsYXRlZCBhdCBydW4tdGltZSkgKi8KLmdsb2JsIEZJUV9TVEFDS19TVEFSVApGSVFfU1RBQ0tfU1RBUlQ6Cgkud29yZCAweDBiYWRjMGRlCiNlbmRpZgoKCi8qCiAqIHRoZSBhY3R1YWwgcmVzZXQgY29kZQogKi8KCnJlc2V0OgoJLyoKCSAqIHNldCB0aGUgY3B1IHRvIFNWQzMyIG1vZGUKCSAqLwoJbXJzCXIwLGNwc3IKCWJpYwlyMCxyMCwjMHgxZgoJb3JyCXIwLHIwLCMweDEzCgltc3IJY3BzcixyMAoKCS8qCgkgKiB3ZSBkbyBzeXMtY3JpdGljYWwgaW5pdHMgb25seSBhdCByZWJvb3QsCgkgKiBub3Qgd2hlbiBib290aW5nIGZyb20gcmFtIQoJICovCiNpZm5kZWYgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAoJYmwJY3B1X2luaXRfY3JpdAojZW5kaWYKCiNpZm5kZWYgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QKcmVsb2NhdGU6CQkJCS8qIHJlbG9jYXRlIFUtQm9vdCB0byBSQU0JICAgICovCglhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KCWNtcAlyMCwgcjEJCQkvKiBkb24ndCByZWxvYyBkdXJpbmcgZGVidWcJICAgICovCgliZXEJc3RhY2tfc2V0dXAKCiNpZiBURVhUX0JBU0UKCWxkcglyMiwgPTB4MAkJLyogUmVsb2NhdGUgdGhlIGV4Y2VwdGlvbiB2ZWN0b3JzICAgKi8KCWNtcAlyMSwgcjIJCQkvKiBhbmQgYXNzb2NpYXRlZCBkYXRhIHRvIGFkZHJlc3MgICAqLwoJbGRtbmVpYSByMCEsIHtyMy1yMTB9CQkvKiAweDAuIERvIG5vdGhpbmcgaWYgVEVYVF9CQVNFIGlzICAqLwoJc3RtbmVpYSByMiEsIHtyMy1yMTB9CQkvKiAweDAuIENvcHkgdGhlIGZpcnN0IDE1IHdvcmRzLiAgICAqLwoJbGRtbmVpYSByMCwge3IzLXI5fQoJc3RtbmVpYSByMiwge3IzLXI5fQoJYWRybmUJcjAsIF9zdGFydAkJLyogcmVzdG9yZSByMAkJCSAgICAqLwojZW5kaWYKCglsZHIJcjIsIF9hcm1ib290X3N0YXJ0CglsZHIJcjMsIF9ic3Nfc3RhcnQKCXN1YglyMiwgcjMsIHIyCQkvKiByMiA8LSBzaXplIG9mIGFybWJvb3QJICAgICovCglhZGQJcjIsIHIwLCByMgkJLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzCSAgICAqLwoKY29weV9sb29wOgoJbGRtaWEJcjAhLCB7cjMtcjEwfQkJLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KCXN0bWlhCXIxISwge3IzLXIxMH0JCS8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCgljbXAJcjAsIHIyCQkJLyogdW50aWwgc291cmNlIGVuZCBhZGRyZWVlIFtyMl0gICAgKi8KCWJsZQljb3B5X2xvb3AKCiNlbmRpZgkvKiBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVCAqLwoKCS8qIFNldCB1cCB0aGUgc3RhY2sJCQkJCQkgICAgKi8Kc3RhY2tfc2V0dXA6CglsZHIJcjAsIF9URVhUX0JBU0UJCS8qIHVwcGVyIDEyOCBLaUI6IHJlbG9jYXRlZCB1Ym9vdCAgICovCglzdWIJcjAsIHIwLCAjQ0ZHX01BTExPQ19MRU4gLyogbWFsbG9jIGFyZWEJCQkgICAgKi8KCXN1YglyMCwgcjAsICNDRkdfR0JMX0RBVEFfU0laRSAvKiBiZGluZm8JCQkgICAgKi8KI2lmZGVmIENPTkZJR19VU0VfSVJRCglzdWIJcjAsIHIwLCAjKENPTkZJR19TVEFDS1NJWkVfSVJRK0NPTkZJR19TVEFDS1NJWkVfRklRKQojZW5kaWYKCXN1YglzcCwgcjAsICMxMgkJLyogbGVhdmUgMyB3b3JkcyBmb3IgYWJvcnQtc3RhY2sgICAgKi8KCmNsZWFyX2JzczoKCWxkcglyMCwgX2Jzc19zdGFydAkJLyogZmluZCBzdGFydCBvZiBic3Mgc2VnbWVudAkgICAgKi8KCWxkcglyMSwgX2Jzc19lbmQJCS8qIHN0b3AgaGVyZQkJCSAgICAqLwoJbW92CXIyLCAjMHgwMDAwMDAwMAkJLyogY2xlYXIJCQkgICAgKi8KCmNsYnNzX2w6c3RyCXIyLCBbcjBdCQkvKiBjbGVhciBsb29wLi4uCQkgICAgKi8KCWFkZAlyMCwgcjAsICM0CgljbXAJcjAsIHIxCglibGUJY2xic3NfbAoKCWxkcglwYywgX3N0YXJ0X2FybWJvb3QKCl9zdGFydF9hcm1ib290OiAud29yZCBzdGFydF9hcm1ib290CgovKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMKICoKICogc2V0dXAgaW1wb3J0YW50IHJlZ2lzdGVycwogKiBzZXR1cCBtZW1vcnkgdGltaW5nCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKI2lmIGRlZmluZWQoQ09ORklHX0lNUEE3KSB8fCBkZWZpbmVkKENPTkZJR19FUDczMTIpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFESUxMTykKCi8qIEludGVydXB0LUNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzZXMgKi8KSU5UTVIxOgkJLndvcmQJMHg4MDAwMDI4MCBAIDMyIGJpdCBzaXplCklOVE1SMjoJCS53b3JkCTB4ODAwMDEyODAgQCAxNiBiaXQgc2l6ZQpJTlRNUjM6CQkud29yZAkweDgwMDAyMjgwIEAgIDggYml0IHNpemUKCi8qIFNZU0NPTnMgKi8KU1lTQ09OMToJLndvcmQJMHg4MDAwMDEwMApTWVNDT04yOgkud29yZAkweDgwMDAxMTAwClNZU0NPTjM6CS53b3JkCTB4ODAwMDIyMDAKCiNkZWZpbmUgQ0xLQ1RMCSAgICAgICAweDYgIC8qIG1hc2sgKi8KI2RlZmluZSBDTEtDVExfMTggICAgICAweDAgIC8qIDE4LjQzMiBNSHogKi8KI2RlZmluZSBDTEtDVExfMzYgICAgICAweDIgIC8qIDM2Ljg2NCBNSHogKi8KI2RlZmluZSBDTEtDVExfNDkgICAgICAweDQgIC8qIDQ5LjE1MiBNSHogKi8KI2RlZmluZSBDTEtDVExfNzMgICAgICAweDYgIC8qIDczLjcyOCBNSHogKi8KCiNlbmRpZgoKY3B1X2luaXRfY3JpdDoKI2lmIGRlZmluZWQoQ09ORklHX0lNUEE3KSB8fCBkZWZpbmVkKENPTkZJR19FUDczMTIpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFESUxMTykKCgkvKgoJICogbWFzayBhbGwgSVJRcyBieSBjbGVhcmluZyBhbGwgYml0cyBpbiB0aGUgSU5UTVJzCgkgKi8KCW1vdglyMSwgIzB4MDAKCWxkcglyMCwgSU5UTVIxCglzdHIJcjEsIFtyMF0KCWxkcglyMCwgSU5UTVIyCglzdHIJcjEsIFtyMF0KCWxkcglyMCwgSU5UTVIzCglzdHIJcjEsIFtyMF0KCgkvKgoJICogZmx1c2ggdjQgSS9EIGNhY2hlcwoJICovCgltb3YJcjAsICMwCgltY3IJcDE1LCAwLCByMCwgYzcsIGM3LCAwCS8qIGZsdXNoIHYzL3Y0IGNhY2hlICovCgltY3IJcDE1LCAwLCByMCwgYzgsIGM3LCAwCS8qIGZsdXNoIHY0IFRMQiAqLwoKCS8qCgkgKiBkaXNhYmxlIE1NVSBzdHVmZiBhbmQgY2FjaGVzCgkgKi8KCW1yYwlwMTUsMCxyMCxjMSxjMAoJYmljCXIwLCByMCwgIzB4MDAwMDIzMDAJQCBjbGVhciBiaXRzIDEzLCA5OjggKC0tVi0gLS1SUykKCWJpYwlyMCwgcjAsICMweDAwMDAwMDhmCUAgY2xlYXIgYml0cyA3LCAzOjAgKEItLS0gV0NBTSkKCW9ycglyMCwgcjAsICMweDAwMDAwMDAyCUAgc2V0IGJpdCAyIChBKSBBbGlnbgoJbWNyCXAxNSwwLHIwLGMxLGMwCiNlbGlmIGRlZmluZWQoQ09ORklHX05FVEFSTSkKCS8qCgkgKiBwcmlvciB0byBzb2Z0d2FyZSByZXNldCA6IG5lZWQgdG8gc2V0IHBpbiBQT1JUQzQgdG8gYmUgKkhSRVNFVAoJICovCglsZHIJcjAsID1ORVRBUk1fR0VOX01PRFVMRV9CQVNFCglsZHIJcjEsID0oTkVUQVJNX0dFTl9QT1JUX01PREUoMHgxMCkgfCBcCgkJCU5FVEFSTV9HRU5fUE9SVF9ESVIoMHgxMCkpCglzdHIJcjEsIFtyMCwgIytORVRBUk1fR0VOX1BPUlRDXQoJLyoKCSAqIHNvZnR3YXJlIHJlc2V0IDogc2VlIEhXIFJlZi4gR3VpZGUgOC4yLjQgOiBTb2Z0d2FyZSBTZXJ2aWNlIHJlZ2lzdGVyCgkgKgkJICAgIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIHByb2Nlc3MKCSAqLwoJbGRyCXIwLCA9TkVUQVJNX0dFTl9NT0RVTEVfQkFTRQoJbGRyCXIxLCA9TkVUQVJNX0dFTl9TV19TVkNfUkVTRVRBCglzdHIJcjEsIFtyMCwgIytORVRBUk1fR0VOX1NPRlRXQVJFX1NFUlZJQ0VdCglsZHIJcjEsID1ORVRBUk1fR0VOX1NXX1NWQ19SRVNFVEIKCXN0cglyMSwgW3IwLCAjK05FVEFSTV9HRU5fU09GVFdBUkVfU0VSVklDRV0KCWxkcglyMSwgPU5FVEFSTV9HRU5fU1dfU1ZDX1JFU0VUQQoJc3RyCXIxLCBbcjAsICMrTkVUQVJNX0dFTl9TT0ZUV0FSRV9TRVJWSUNFXQoJbGRyCXIxLCA9TkVUQVJNX0dFTl9TV19TVkNfUkVTRVRCCglzdHIJcjEsIFtyMCwgIytORVRBUk1fR0VOX1NPRlRXQVJFX1NFUlZJQ0VdCgkvKgoJICogc2V0dXAgUExMIGFuZCBTeXN0ZW0gQ29uZmlnCgkgKi8KCWxkcglyMCwgPU5FVEFSTV9HRU5fTU9EVUxFX0JBU0UKCglsZHIJcjEsID0oCU5FVEFSTV9HRU5fU1lTX0NGR19MRU5ESUFOIHwgXAoJCQlORVRBUk1fR0VOX1NZU19DRkdfQlVTRlVMTCB8IFwKCQkJTkVUQVJNX0dFTl9TWVNfQ0ZHX1VTRVJfRU4gfCBcCgkJCU5FVEFSTV9HRU5fU1lTX0NGR19BTElHTl9BQk9SVCB8IFwKCQkJTkVUQVJNX0dFTl9TWVNfQ0ZHX0JVU0FSQl9JTlQgfCBcCgkJCU5FVEFSTV9HRU5fU1lTX0NGR19CVVNNT05fRU4gKQoKCXN0cglyMSwgW3IwLCAjK05FVEFSTV9HRU5fU1lTVEVNX0NPTlRST0xdCgojaWZuZGVmIENPTkZJR19ORVRBUk1fUExMX0JZUEFTUwoJbGRyCXIxLCA9KAlORVRBUk1fR0VOX1BMTF9DVExfUExMQ05UKE5FVEFSTV9QTExfQ09VTlRfVkFMKSB8IFwKCQkJTkVUQVJNX0dFTl9QTExfQ1RMX1BPTFRTVF9ERUYgfCBcCgkJCU5FVEFSTV9HRU5fUExMX0NUTF9JTkRJVigxKSB8IFwKCQkJTkVUQVJNX0dFTl9QTExfQ1RMX0lDUF9ERUYgfCBcCgkJCU5FVEFSTV9HRU5fUExMX0NUTF9PVVRESVYoMikgKQoJc3RyCXIxLCBbcjAsICMrTkVUQVJNX0dFTl9QTExfQ09OVFJPTF0KI2VuZGlmCgoJLyoKCSAqIG1hc2sgYWxsIElSUXMgYnkgY2xlYXJpbmcgYWxsIGJpdHMgaW4gdGhlIElOVE1ScwoJICovCgltb3YJcjEsICMwCglsZHIJcjAsID1ORVRBUk1fR0VOX01PRFVMRV9CQVNFCglzdHIJcjEsIFtyMCwgIytORVRBUk1fR0VOX0lOVFJfRU5BQkxFXQoKI2VsaWYgZGVmaW5lZChDT05GSUdfUzNDNDUxMEIpCgoJLyoKCSAqIE1hc2sgb2ZmIGFsbCBJUlEgc291cmNlcwoJICovCglsZHIJcjEsID1SRUdfSU5UTUFTSwoJbGRyCXIwLCA9MHgzRkZGRkYKCXN0cglyMCwgW3IxXQoKCS8qCgkgKiBEaXNhYmxlIENhY2hlCgkgKi8KCWxkciByMCwgPVJFR19TWVNDRkcKCWxkciByMSwgPTB4ODNmZmZmYTAJLyogY2FjaGUtZGlzYWJsZWQgICovCglzdHIgcjEsIFtyMF0KCiNlbGlmIGRlZmluZWQoQ09ORklHX0lOVEVHUkFUT1IpICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfSU5URUdSQVRPUikKCS8qIE5vIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uIGZvciBJbnRlZ3JhdG9yQVAvQ003MjBUIGFzIHlldCAqLwojZWxzZQojZXJyb3IgTm8gY3B1X2luaXRfY3JpdCgpIGRlZmluZWQgZm9yIGN1cnJlbnQgQ1BVIHR5cGUKI2VuZGlmCgojaWZkZWYgQ09ORklHX0FSTTdfUkVWRAoJLyogc2V0IGNsb2NrIHNwZWVkICovCgkvKiAhISEgd2UgcnVuIEAgMzYgTUh6IGR1ZSB0byBhIGhhcmR3YXJlIGZsYXcgaW4gUmV2LiBEIHByb2Nlc3NvcnMgKi8KCS8qICEhISBub3QgZG9pbmcgRFJBTSByZWZyZXNoIHByb3Blcmx5ISAqLwoJbGRyCXIwLCBTWVNDT04zCglsZHIJcjEsIFtyMF0KCWJpYwlyMSwgcjEsICNDTEtDVEwKCW9ycglyMSwgcjEsICNDTEtDVExfMzYKCXN0cglyMSwgW3IwXQojZW5kaWYKCgltb3YJaXAsIGxyCgkvKgoJICogYmVmb3JlIHJlbG9jYXRpbmcsIHdlIGhhdmUgdG8gc2V0dXAgUkFNIHRpbWluZwoJICogYmVjYXVzZSBtZW1vcnkgdGltaW5nIGlzIGJvYXJkLWRlcGVuZGVudCwgeW91IHdpbGwKCSAqIGZpbmQgYSBsb3dsZXZlbF9pbml0LlMgaW4geW91ciBib2FyZCBkaXJlY3RvcnkuCgkgKi8KCWJsCWxvd2xldmVsX2luaXQKCW1vdglsciwgaXAKCgltb3YJcGMsIGxyCgoKLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogSW50ZXJydXB0IGhhbmRsaW5nCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKQApAIElSUSBzdGFjayBmcmFtZS4KQAojZGVmaW5lIFNfRlJBTUVfU0laRQk3MgoKI2RlZmluZSBTX09MRF9SMAk2OAojZGVmaW5lIFNfUFNSCQk2NAojZGVmaW5lIFNfUEMJCTYwCiNkZWZpbmUgU19MUgkJNTYKI2RlZmluZSBTX1NQCQk1MgoKI2RlZmluZSBTX0lQCQk0OAojZGVmaW5lIFNfRlAJCTQ0CiNkZWZpbmUgU19SMTAJCTQwCiNkZWZpbmUgU19SOQkJMzYKI2RlZmluZSBTX1I4CQkzMgojZGVmaW5lIFNfUjcJCTI4CiNkZWZpbmUgU19SNgkJMjQKI2RlZmluZSBTX1I1CQkyMAojZGVmaW5lIFNfUjQJCTE2CiNkZWZpbmUgU19SMwkJMTIKI2RlZmluZSBTX1IyCQk4CiNkZWZpbmUgU19SMQkJNAojZGVmaW5lIFNfUjAJCTAKCiNkZWZpbmUgTU9ERV9TVkMgMHgxMwojZGVmaW5lIElfQklUCSAweDgwCgovKgogKiB1c2UgYmFkX3NhdmVfdXNlcl9yZWdzIGZvciBhYm9ydC9wcmVmZXRjaC91bmRlZi9zd2kgLi4uCiAqIHVzZSBpcnFfc2F2ZV91c2VyX3JlZ3MgLyBpcnFfcmVzdG9yZV91c2VyX3JlZ3MgZm9yIElSUS9GSVEgaGFuZGxpbmcKICovCgoJLm1hY3JvCWJhZF9zYXZlX3VzZXJfcmVncwoJc3ViCXNwLCBzcCwgI1NfRlJBTUVfU0laRQoJc3RtaWEJc3AsIHtyMCAtIHIxMn0JCQlAIENhbGxpbmcgcjAtcjEyCglhZGQJcjgsIHNwLCAjU19QQwoKCWxkcglyMiwgX2FybWJvb3Rfc3RhcnQKCXN1YglyMiwgcjIsICMoQ09ORklHX1NUQUNLU0laRStDRkdfTUFMTE9DX0xFTikKCXN1YglyMiwgcjIsICMoQ0ZHX0dCTF9EQVRBX1NJWkUrOCkJQCBzZXQgYmFzZSAyIHdvcmRzIGludG8gYWJvcnQgc3RhY2sKCWxkbWlhCXIyLCB7cjIgLSByNH0JCQlAIGdldCBwYywgY3Bzciwgb2xkX3IwCglhZGQJcjAsIHNwLCAjU19GUkFNRV9TSVpFCQlAIHJlc3RvcmUgc3BfU1ZDCgoJYWRkCXI1LCBzcCwgI1NfU1AKCW1vdglyMSwgbHIKCXN0bWlhCXI1LCB7cjAgLSByNH0JCQlAIHNhdmUgc3BfU1ZDLCBscl9TVkMsIHBjLCBjcHNyLCBvbGRfcgoJbW92CXIwLCBzcAoJLmVuZG0KCgkubWFjcm8JaXJxX3NhdmVfdXNlcl9yZWdzCglzdWIJc3AsIHNwLCAjU19GUkFNRV9TSVpFCglzdG1pYQlzcCwge3IwIC0gcjEyfQkJCUAgQ2FsbGluZyByMC1yMTIKCWFkZAlyOCwgc3AsICNTX1BDCglzdG1kYglyOCwge3NwLCBscn1eCQkJQCBDYWxsaW5nIFNQLCBMUgoJc3RyCWxyLCBbcjgsICMwXQkJCUAgU2F2ZSBjYWxsaW5nIFBDCgltcnMJcjYsIHNwc3IKCXN0cglyNiwgW3I4LCAjNF0JCQlAIFNhdmUgQ1BTUgoJc3RyCXIwLCBbcjgsICM4XQkJCUAgU2F2ZSBPTERfUjAKCW1vdglyMCwgc3AKCS5lbmRtCgoJLm1hY3JvCWlycV9yZXN0b3JlX3VzZXJfcmVncwoJbGRtaWEJc3AsIHtyMCAtIGxyfV4JCQlAIENhbGxpbmcgcjAgLSBscgoJbW92CXIwLCByMAoJbGRyCWxyLCBbc3AsICNTX1BDXQkJCUAgR2V0IFBDCglhZGQJc3AsIHNwLCAjU19GUkFNRV9TSVpFCglzdWJzCXBjLCBsciwgIzQJCQlAIHJldHVybiAmIG1vdmUgc3Bzcl9zdmMgaW50byBjcHNyCgkuZW5kbQoKCS5tYWNybyBnZXRfYmFkX3N0YWNrCglsZHIJcjEzLCBfYXJtYm9vdF9zdGFydAkJQCBzZXR1cCBvdXIgbW9kZSBzdGFjawoJc3ViCXIxMywgcjEzLCAjKENPTkZJR19TVEFDS1NJWkUrQ0ZHX01BTExPQ19MRU4pCglzdWIJcjEzLCByMTMsICMoQ0ZHX0dCTF9EQVRBX1NJWkUrOCkgQCByZXNlcnZlZCBhIGNvdXBsZSBzcG90cyBpbiBhYm9ydCBzdGFjawoKCXN0cglsciwgW3IxM10JCQlAIHNhdmUgY2FsbGVyIGxyIC8gc3BzcgoJbXJzCWxyLCBzcHNyCglzdHIJbHIsIFtyMTMsICM0XQoKCW1vdglyMTMsICNNT0RFX1NWQwkJCUAgcHJlcGFyZSBTVkMtTW9kZQoJbXNyCXNwc3JfYywgcjEzCgltb3YJbHIsIHBjCgltb3ZzCXBjLCBscgoJLmVuZG0KCgkubWFjcm8gZ2V0X2lycV9zdGFjawkJCUAgc2V0dXAgSVJRIHN0YWNrCglsZHIJc3AsIElSUV9TVEFDS19TVEFSVAoJLmVuZG0KCgkubWFjcm8gZ2V0X2ZpcV9zdGFjawkJCUAgc2V0dXAgRklRIHN0YWNrCglsZHIJc3AsIEZJUV9TVEFDS19TVEFSVAoJLmVuZG0KCi8qCiAqIGV4Y2VwdGlvbiBoYW5kbGVycwogKi8KCS5hbGlnbgk1CnVuZGVmaW5lZF9pbnN0cnVjdGlvbjoKCWdldF9iYWRfc3RhY2sKCWJhZF9zYXZlX3VzZXJfcmVncwoJYmwJZG9fdW5kZWZpbmVkX2luc3RydWN0aW9uCgoJLmFsaWduCTUKc29mdHdhcmVfaW50ZXJydXB0OgoJZ2V0X2JhZF9zdGFjawoJYmFkX3NhdmVfdXNlcl9yZWdzCglibAlkb19zb2Z0d2FyZV9pbnRlcnJ1cHQKCgkuYWxpZ24JNQpwcmVmZXRjaF9hYm9ydDoKCWdldF9iYWRfc3RhY2sKCWJhZF9zYXZlX3VzZXJfcmVncwoJYmwJZG9fcHJlZmV0Y2hfYWJvcnQKCgkuYWxpZ24JNQpkYXRhX2Fib3J0OgoJZ2V0X2JhZF9zdGFjawoJYmFkX3NhdmVfdXNlcl9yZWdzCglibAlkb19kYXRhX2Fib3J0CgoJLmFsaWduCTUKbm90X3VzZWQ6CglnZXRfYmFkX3N0YWNrCgliYWRfc2F2ZV91c2VyX3JlZ3MKCWJsCWRvX25vdF91c2VkCgojaWZkZWYgQ09ORklHX1VTRV9JUlEKCgkuYWxpZ24JNQppcnE6CglnZXRfaXJxX3N0YWNrCglpcnFfc2F2ZV91c2VyX3JlZ3MKCWJsCWRvX2lycQoJaXJxX3Jlc3RvcmVfdXNlcl9yZWdzCgoJLmFsaWduCTUKZmlxOgoJZ2V0X2ZpcV9zdGFjawoJLyogc29tZW9uZSBvdWdodCB0byB3cml0ZSBhIG1vcmUgZWZmaWN0aW9uIGZpcV9zYXZlX3VzZXJfcmVncyAqLwoJaXJxX3NhdmVfdXNlcl9yZWdzCglibAlkb19maXEKCWlycV9yZXN0b3JlX3VzZXJfcmVncwoKI2Vsc2UKCgkuYWxpZ24JNQppcnE6CglnZXRfYmFkX3N0YWNrCgliYWRfc2F2ZV91c2VyX3JlZ3MKCWJsCWRvX2lycQoKCS5hbGlnbgk1CmZpcToKCWdldF9iYWRfc3RhY2sKCWJhZF9zYXZlX3VzZXJfcmVncwoJYmwJZG9fZmlxCgojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19JTVBBNykgfHwgZGVmaW5lZChDT05GSUdfRVA3MzEyKSB8fCBkZWZpbmVkKENPTkZJR19BUk1BRElMTE8pCgkuYWxpZ24JNQouZ2xvYmwgcmVzZXRfY3B1CnJlc2V0X2NwdToKCW1vdglpcCwgIzAKCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJCUAgaW52YWxpZGF0ZSBjYWNoZQoJbWNyCXAxNSwgMCwgaXAsIGM4LCBjNywgMAkJQCBmbHVzaCBUTEIgKHY0KQoJbXJjCXAxNSwgMCwgaXAsIGMxLCBjMCwgMAkJQCBnZXQgY3RybCByZWdpc3RlcgoJYmljCWlwLCBpcCwgIzB4MDAwZgkJCUAgLi4uLi4uLi4uLi4ud2NhbQoJYmljCWlwLCBpcCwgIzB4MjEwMAkJCUAgLi52Li4uLnMuLi4uLi4uLgoJbWNyCXAxNSwgMCwgaXAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCgltb3YJcGMsIHIwCiNlbGlmIGRlZmluZWQoQ09ORklHX05FVEFSTSkKCS5hbGlnbgk1Ci5nbG9ibCByZXNldF9jcHUKcmVzZXRfY3B1OgoJbGRyCXIxLCA9TkVUQVJNX01FTV9NT0RVTEVfQkFTRQoJbGRyCXIwLCBbcjEsICMrTkVUQVJNX01FTV9DUzBfQkFTRV9BRERSXQoJbGRyCXIxLCA9MHhGRkZGRjAwMAoJYW5kCXIwLCByMSwgcjAKCWxkcglyMSwgPShyZWxvY2F0ZS1URVhUX0JBU0UpCglhZGQJcjAsIHIxLCByMAoJbGRyCXI0LCA9TkVUQVJNX0dFTl9NT0RVTEVfQkFTRQoJbGRyCXIxLCA9TkVUQVJNX0dFTl9TV19TVkNfUkVTRVRBCglzdHIJcjEsIFtyNCwgIytORVRBUk1fR0VOX1NPRlRXQVJFX1NFUlZJQ0VdCglsZHIJcjEsID1ORVRBUk1fR0VOX1NXX1NWQ19SRVNFVEIKCXN0cglyMSwgW3I0LCAjK05FVEFSTV9HRU5fU09GVFdBUkVfU0VSVklDRV0KCWxkcglyMSwgPU5FVEFSTV9HRU5fU1dfU1ZDX1JFU0VUQQoJc3RyCXIxLCBbcjQsICMrTkVUQVJNX0dFTl9TT0ZUV0FSRV9TRVJWSUNFXQoJbGRyCXIxLCA9TkVUQVJNX0dFTl9TV19TVkNfUkVTRVRCCglzdHIJcjEsIFtyNCwgIytORVRBUk1fR0VOX1NPRlRXQVJFX1NFUlZJQ0VdCgltb3YJcGMsIHIwCiNlbGlmIGRlZmluZWQoQ09ORklHX1MzQzQ1MTBCKQovKiBOb3RoaW5nIGRvbmUgaGVyZSBhcyByZXNldGluZyB0aGUgQ1BVIGlzIGJvYXJkIHNwZWNpZmljLCBkZXBlbmRpbmcKICogb24gZXh0ZXJuYWwgcGVyaXBoZXJhbHMgc3VjaCBhcyB3YXRjaGRvZyB0aW1lcnMsIGV0Yy4gKi8KI2VsaWYgZGVmaW5lZChDT05GSUdfSU5URUdSQVRPUikgJiYgZGVmaW5lZChDT05GSUdfQVJDSF9JTlRFR1JBVE9SKQoJLyogTm8gc3BlY2lmaWMgcmVzZXQgYWN0aW9ucyBmb3IgSW50ZWdyYXRvckFQL0NNNzIwVCBhcyB5ZXQgKi8KI2Vsc2UKI2Vycm9yIE5vIHJlc2V0X2NwdSgpIGRlZmluZWQgZm9yIGN1cnJlbnQgQ1BVIHR5cGUKI2VuZGlmCg==