LyoKICogIHNldHB3bmFtLmMgLS0KICogIGVkaXQgYW4gZW50cnkgaW4gYSBwYXNzd29yZCBkYXRhYmFzZS4KICoKICogIChjKSAxOTk0IFNhbHZhdG9yZSBWYWxlbnRlIDxzdmFsZW50ZUBtaXQuZWR1PgogKiAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCiAqICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgRWRpdGVkIDExLzEwLzk2IChERC9NTS9ZWSA7LSkgYnkgTmljb2xhaSBMYW5nZmVsZHQgKGphbmxAbWF0aC51aW8ubm8pCiAqICB0byByZWFkIC9ldGMvcGFzc3dkIGRpcmVjdGx5IHNvIHRoYXQgcGFzc3dkLCBjaHNoIGFuZCBjaGZuIGNhbiB3b3JrCiAqICBvbiBtYWNoaW5lcyB0aGF0IHJ1biBOSVMgKG7pIFlQKS4gIENoYW5nZXMgd2lsbCBub3QgYmUgbWFkZSB0bwogKiAgdXNlcm5hbWVzIHN0YXJ0aW5nIHdpdGggKy4KICogIAogKiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHdpdGggbm8gd2FycmFudHkuCiAqCiAqICBVc2FnZToKICogIDEpIGdldCBhIHN0cnVjdCBwYXNzd2QgKiBmcm9tIGdldHB3bmFtKCkuCiAqICAgICBZb3Ugc2hvdWxkIGFzc3VtZSBhIHN0cnVjdCBwYXNzd2QgaGFzIGFuIGluZmluaXRlIG51bWJlciBvZiBmaWVsZHMsCiAqICAgICBzbyB5b3Ugc2hvdWxkIG5vdCB0cnkgdG8gY3JlYXRlIG9uZSBmcm9tIHNjcmF0Y2guCiAqICAyKSBlZGl0IHRoZSBmaWVsZHMgeW91IHdhbnQgdG8gZWRpdC4KICogIDMpIGNhbGwgc2V0cHduYW0oKSB3aXRoIHRoZSBlZGl0ZWQgc3RydWN0IHBhc3N3ZC4KICoKICogIEEgX25vcm1hbCB1c2VyXyBwcm9ncmFtIHNob3VsZCBuZXZlciBkaXJlY3RseSBtYW5pcHVsYXRlCiAqICAvZXRjL3Bhc3N3ZCBidXQgdXNlIGdldHB3bmFtKCkgYW5kIChmYW1pbHksIGFzIHdlbGwgYXMpCiAqICBzZXRwd25hbSgpLgogKgogKiAgQnV0LCBzZXRwd25hbSB3YXMgbWFkZSB0byBfZWRpdF8gdGhlIHBhc3N3b3JkIGZpbGUuICBGb3IgdXNlIGJ5CiAqICBjaGZuLCBjaHNoIGFuZCBwYXNzd2QuICBfSV8gX0hBVkVfIHRvIHJlYWQgYW5kIHdyaXRlIC9ldGMvcGFzc3dkCiAqICBkaXJlY3RseS4gIExldCB0aG9zZSB3aG8gc2F5IG5heSBiZSBmb3JldmVyIHNpbGVudCBhbmQgdGhpbmsgYWJvdXQKICogIGhvdyBnZXRwd25hbSAoYW5kIGZhbWlseSkgd29ya3Mgb24gYSBtYWNoaW5lIHJ1bm5pbmcgWVAuCiAqCiAqICBBZGRlZCBjaGVja3MgZm9yIGZhaWx1cmUgb2YgbWFsbG9jKCkgYW5kIHJlbW92ZWQgZXJyb3IgcmVwb3J0aW5nCiAqICB0byBzdGRlcnIsIHRoaXMgaXMgYSBsaWJyYXJ5IGZ1bmN0aW9uIGFuZCBzaG91bGQgbm90IHByaW50IG9uIHRoZQogKiAgc2NyZWVuLCBidXQgcmV0dXJuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGVzLgogKiAgMjctSmFuLTk3ICAtIHBvZUBkYWltaS5hYXUuZGsKICoKICogIFRoYW5rcyB0byAidHdvIGd1eXMgbmFtZWQgSWFuIi4KICoKICogICAkQXV0aG9yOiBwb2VyICQKICogICAkUmV2aXNpb246IDEuMTMgJAogKiAgICREYXRlOiAxOTk3LzA2LzIzIDA4OjI2OjI5ICQKICoKICovCgojdW5kZWYgREVCVUcKCi8qICBiZWNhdXNlIEkgdXNlIGdldHB3ZW50KCksIHB1dHB3ZW50KCksIGV0Yy4uLiAqLwojZGVmaW5lIF9TVklEX1NPVVJDRQoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxwd2QuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHBhdGhzLmg+CgojaW5jbHVkZSAic2V0cHduYW0uaCIKCiNkZWZpbmUgZmFsc2UgMAojZGVmaW5lIHRydWUgMQoKdHlwZWRlZiBpbnQgYm9vbGVhbjsKCnN0YXRpYyB2b2lkIHB3X2luaXQodm9pZCk7CgovKgogKiAgc2V0cHduYW0gKCkgLS0KICoJdGFrZXMgYSBzdHJ1Y3QgcGFzc3dkIGluIHdoaWNoIGV2ZXJ5IGZpZWxkIGlzIGZpbGxlZCBpbiBhbmQgdmFsaWQuCiAqCUlmIHRoZSBnaXZlbiB1c2VybmFtZSBleGlzdHMgaW4gdGhlIHBhc3N3ZCBmaWxlLCB0aGUgZW50cnkgaXMKICoJcmVwbGFjZWQgd2l0aCB0aGUgZ2l2ZW4gZW50cnkuCiAqLwppbnQgCnNldHB3bmFtIChzdHJ1Y3QgcGFzc3dkICpwd2QpCnsKICAgIEZJTEUgKmZwID0gTlVMTCwgKnB3ZiA9IE5VTEw7CiAgICBpbnQgeCwgc2F2ZV9lcnJubywgZmQsIHJldDsKICAgIGJvb2xlYW4gZm91bmQ7CiAgICBpbnQgb2xkdW1hc2s7CiAgICBpbnQgbmFtZWxlbjsKICAgIGludCBidWZsZW4gPSAyNTY7CiAgICBpbnQgY29udGxlbjsKICAgIGNoYXIgKmxpbmVidWYgPSBtYWxsb2MoYnVmbGVuKTsKCiAgICBpZiAoIWxpbmVidWYpIHJldHVybiAtMTsKCiAgICBvbGR1bWFzayA9IHVtYXNrKDApOyAgIC8qIENyZWF0ZSB3aXRoIGV4YWN0IHBlcm1pc3Npb25zICovCgogICAgcHdfaW5pdCgpOwoKICAgIC8qIHNhbml0eSBjaGVjayAqLwogICAgZm9yICh4ID0gMDsgeCA8IDM7IHgrKykgewoJaWYgKHggPiAwKSBzbGVlcCgxKTsKCWZkID0gb3BlbihQVE1QVE1QX0ZJTEUsIE9fV1JPTkxZfE9fQ1JFQVR8T19FWENMLCAwNjQ0KTsKCWlmIChmZCA9PSAtMSkgewoJICAgIHVtYXNrKG9sZHVtYXNrKTsKCSAgICByZXR1cm4gLTE7Cgl9CglyZXQgPSBsaW5rKFBUTVBUTVBfRklMRSwgUFRNUF9GSUxFKTsKCXVubGluayhQVE1QVE1QX0ZJTEUpOwoJaWYgKHJldCA9PSAtMSkKCSAgICBjbG9zZShmZCk7CgllbHNlCgkgICAgYnJlYWs7CiAgICB9CiAgICB1bWFzayhvbGR1bWFzayk7CiAgICBpZiAocmV0ID09IC0xKSByZXR1cm4gLTE7CgogICAgLyogcHRtcCBzaG91bGQgYmUgb3duZWQgYnkgcm9vdC5yb290IG9yIHJvb3Qud2hlZWwgKi8KICAgIGlmIChjaG93bihQVE1QX0ZJTEUsICh1aWRfdCkgMCwgKGdpZF90KSAwKSA8IDApIHJldHVybiAtMTsKCiAgICAvKiBvcGVuIHB0bXAgZm9yIHdyaXRpbmcgYW5kIHBhc3N3ZCBmb3IgcmVhZGluZyAqLwogICAgZnAgPSBmZG9wZW4oZmQsICJ3Iik7CiAgICBpZiAoIWZwKSBnb3RvIGZhaWw7CgogICAgcHdmID0gZm9wZW4oUEFTU1dEX0ZJTEUsICJyIik7CiAgICBpZiAoIXB3ZikgZ290byBmYWlsOwoKICAgIG5hbWVsZW4gPSBzdHJsZW4ocHdkLT5wd19uYW1lKTsKCiAgICAvKiBwYXJzZSB0aGUgcGFzc3dkIGZpbGUgKi8KICAgIGZvdW5kID0gZmFsc2U7CiAgICAvKiBEbyB5b3Ugd29uZGVyIHdoeSBJIGRvbid0IHVzZSBnZXRwd2VudD8gUmVhZCBjb21tZW50cyBhdCB0b3Agb2YgZmlsZSAqLwogICAgd2hpbGUgKGZnZXRzKGxpbmVidWYsIGJ1ZmxlbiwgcHdmKSAhPSBOVUxMKSB7Cgljb250bGVuID0gc3RybGVuKGxpbmVidWYpOwoJd2hpbGUgKGxpbmVidWZbY29udGxlbi0xXSAhPSAnXG4nICYmICFmZW9mKHB3ZikpIHsKCSAgICAvKiBFeHRlbmQgaW5wdXQgYnVmZmVyIGlmIGl0IGZhaWxlZCBnZXR0aW5nIHRoZSB3aG9sZSBsaW5lICovCgoJICAgIC8qIFNvIG5vdyB3ZSBkb3VibGUgdGhlIGJ1ZmZlciBzaXplICovCgkgICAgYnVmbGVuICo9IDI7CgoJICAgIGxpbmVidWYgPSByZWFsbG9jKGxpbmVidWYsIGJ1Zmxlbik7CgkgICAgaWYgKGxpbmVidWYgPT0gTlVMTCkgZ290byBmYWlsOwoKCSAgICAvKiBBbmQgZmlsbCB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyICovCgkgICAgaWYgKGZnZXRzKCZsaW5lYnVmW2NvbnRsZW5dLCBidWZsZW4vMiwgcHdmKSA9PSBOVUxMKSBicmVhazsKCSAgICBjb250bGVuID0gc3RybGVuKGxpbmVidWYpOwogICAgICAKCSAgICAvKiBUaGF0IHdhcyBhIGxvdCBvZiB3b3JrIGZvciBub3RoaW5nLiAgR2ltbWUgcGVybCEgKi8KCX0KCgkvKiBJcyB0aGlzIHRoZSB1c2VybmFtZSB3ZSB3ZXJlIHNlbnQgdG8gY2hhbmdlPyAqLwoJaWYgKCFmb3VuZCAmJiBsaW5lYnVmW25hbWVsZW5dID09ICc6JyAmJgoJICAgICFzdHJuY21wKGxpbmVidWYsIHB3ZC0+cHdfbmFtZSwgbmFtZWxlbikpIHsKCSAgICAvKiBZZXMhIFNvIGdvIGZvcnRoIGluIHRoZSBuYW1lIG9mIHRoZSBMb3JkIGFuZCBjaGFuZ2UgaXQhICovCgkgICAgaWYgKHB1dHB3ZW50KHB3ZCwgZnApIDwgMCkgZ290byBmYWlsOwoJICAgIGZvdW5kID0gdHJ1ZTsKCSAgICBjb250aW51ZTsKCX0KCS8qIE5vdGhpbmcgaW4gcGFydGljdWxhciBoYXBwZW5lZCwgY29weSBpbnB1dCB0byBvdXRwdXQgKi8KCWZwdXRzKGxpbmVidWYsIGZwKTsKICAgIH0KCiAgICBpZiAoZmNsb3NlKGZwKSA8IDApIGdvdG8gZmFpbDsKICAgIGZwID0gTlVMTDsKICAgIGNsb3NlIChmZCk7CiAgICBmZCA9IC0xOwogICAgZmNsb3NlIChwd2YpOyAvKiBJIGRvbid0IHRoaW5rIEkgd2FudCB0byBrbm93IGlmIHRoaXMgZmFpbGVkICovCiAgICBwd2YgPSBOVUxMOwoKICAgIGlmICghZm91bmQpIHsKCWVycm5vID0gRU5PRU5UOyAvKiBnaXZlIG1lIHNvbWV0aGluZyBiZXR0ZXIgKi8KCWdvdG8gZmFpbDsKICAgIH0KCiAgICAvKiB3ZSBkb24ndCBjYXJlIGlmIHdlIGNhbid0IHJlbW92ZSB0aGUgYmFja3VwIGZpbGUgKi8KICAgIHVubGluayhQQVNTV0RfRklMRSIuT0xEIik7CiAgICAvKiB3ZSBkb24ndCBjYXJlIGlmIHdlIGNhbid0IGNyZWF0ZSB0aGUgYmFja3VwIGZpbGUgKi8KICAgIGxpbmsoUEFTU1dEX0ZJTEUsIFBBU1NXRF9GSUxFIi5PTEQiKTsKICAgIC8qIHdlIERPIGNhcmUgaWYgd2UgY2FuJ3QgcmVuYW1lIHRvIHRoZSBwYXNzd2QgZmlsZSAqLwogICAgaWYocmVuYW1lKFBUTVBfRklMRSwgUEFTU1dEX0ZJTEUpIDwgMCkKCWdvdG8gZmFpbDsKICAgIC8qIGZpbmFsbHk6ICBzdWNjZXNzICovCiAgICByZXR1cm4gMDsKCmZhaWw6CiAgICBzYXZlX2Vycm5vID0gZXJybm87CiAgICBpZiAoZnAgIT0gTlVMTCkgZmNsb3NlIChmcCk7CiAgICBpZiAocHdmICE9IE5VTEwpIGZjbG9zZShwd2YpOwogICAgaWYgKGZkID49IDApIGNsb3NlIChmZCk7CiAgICBmcmVlKGxpbmVidWYpOwogICAgdW5saW5rKFBUTVBfRklMRSk7CiAgICBlcnJubyA9IHNhdmVfZXJybm87CiAgICByZXR1cm4gLTE7Cn0KCi8qIFNldCB1cCB0aGUgbGltaXRzIHNvIHRoYXQgd2UncmUgbm90IGZvaWxlZCAqLwoKc3RhdGljIHZvaWQgCnB3X2luaXQoKQp7CiAgICBzdHJ1Y3QgcmxpbWl0IHJsaW07CgogICAgLyogVW5saW1pdGVkIHJlc291cmNlIGxpbWl0cy4gKi8KICAgIHJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4ID0gUkxJTV9JTkZJTklUWTsKICAgIHNldHJsaW1pdChSTElNSVRfQ1BVLCAmcmxpbSk7CiAgICBzZXRybGltaXQoUkxJTUlUX0ZTSVpFLCAmcmxpbSk7CiAgICBzZXRybGltaXQoUkxJTUlUX1NUQUNLLCAmcmxpbSk7CiAgICBzZXRybGltaXQoUkxJTUlUX0RBVEEsICZybGltKTsKICAgIHNldHJsaW1pdChSTElNSVRfUlNTLCAmcmxpbSk7CgojaWZuZGVmIERFQlVHCiAgICAvKiBEb24ndCBkcm9wIGNvcmUgKG5vdCByZWFsbHkgbmVjZXNzYXJ5LCBidXQgR1AncykuICovCiAgICBybGltLnJsaW1fY3VyID0gcmxpbS5ybGltX21heCA9IDA7CiAgICBzZXRybGltaXQoUkxJTUlUX0NPUkUsICZybGltKTsKI2VuZGlmCgogICAgLyogVHVybiBvZmYgc2lnbmFscy4gKi8KICAgIHNpZ25hbChTSUdBTFJNLCBTSUdfSUdOKTsKICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOwogICAgc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CiAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CiAgICBzaWduYWwoU0lHUVVJVCwgU0lHX0lHTik7CiAgICBzaWduYWwoU0lHVEVSTSwgU0lHX0lHTik7CiAgICBzaWduYWwoU0lHVFNUUCwgU0lHX0lHTik7CiAgICBzaWduYWwoU0lHVFRPVSwgU0lHX0lHTik7CgogICAgLyogQ3JlYXRlIHdpdGggZXhhY3QgcGVybWlzc2lvbnMuICovCiAgICB1bWFzaygwKTsKfQo=