LyoKICogbGludXgvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmgKICogU2Ftc3VuZyBvbi1jaGlwIGZ1bGwgc3BlZWQgVVNCIGRldmljZSBjb250cm9sbGVycwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBIZXJiZXJ0IFD2dHpsIC0gQXJuYXVkIFBhdGFyZAogKglBZGRpdGlvbmFsIGNsZWFudXBzIGJ5IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKi8KCiNpZm5kZWYgX1MzQzI0MTBfVURDX0gKI2RlZmluZSBfUzNDMjQxMF9VRENfSAoKc3RydWN0IHMzYzI0MTBfZXAgewoJc3RydWN0IGxpc3RfaGVhZAkJcXVldWU7Cgl1bnNpZ25lZCBsb25nCQkJbGFzdF9pbzsJLyogamlmZmllcyB0aW1lc3RhbXAgKi8KCXN0cnVjdCB1c2JfZ2FkZ2V0CQkqZ2FkZ2V0OwoJc3RydWN0IHMzYzI0MTBfdWRjCQkqZGV2OwoJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjOwoJc3RydWN0IHVzYl9lcAkJCWVwOwoJdTgJCQkJbnVtOwoKCXVuc2lnbmVkIHNob3J0CQkJZmlmb19zaXplOwoJdTgJCQkJYkVuZHBvaW50QWRkcmVzczsKCXU4CQkJCWJtQXR0cmlidXRlczsKCgl1bnNpZ25lZAkJCWhhbHRlZCA6IDE7Cgl1bnNpZ25lZAkJCWFscmVhZHlfc2VlbiA6IDE7Cgl1bnNpZ25lZAkJCXNldHVwX3N0YWdlIDogMTsKfTsKCgovKiBXYXJuaW5nIDogZXAwIGhhcyBhIGZpZm8gb2YgMTYgYnl0ZXMgKi8KLyogRG9uJ3QgdHJ5IHRvIHNldCAzMiBvciA2NCAgICAgICAgICAgICovCi8qIGFsc28gdGVzdHVzYiAxNCBmYWlscyAgd2l0IDE2IGJ1dCBpcyAqLwovKiBmaW5lIHdpdGggOCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBFUDBfRklGT19TSVpFCQkgOAojZGVmaW5lIEVQX0ZJRk9fU0laRQkJNjQKI2RlZmluZSBERUZBVUxUX1BPV0VSX1NUQVRFCTB4MDAKCiNkZWZpbmUgUzNDMjQ0MF9FUF9GSUZPX1NJWkUJMTI4CgpzdGF0aWMgY29uc3QgY2hhciBlcDBuYW1lIFtdID0gImVwMCI7CgpzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZXBfbmFtZVtdID0gewoJZXAwbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV2ZXJ5b25lIGhhcyBlcDAgKi8KCS8qIHMzYzI0MTAgZm91ciBiaWRpcmVjdGlvbmFsIGJ1bGsgZW5kcG9pbnRzICovCgkiZXAxLWJ1bGsiLCAiZXAyLWJ1bGsiLCAiZXAzLWJ1bGsiLCAiZXA0LWJ1bGsiLAp9OwoKI2RlZmluZSBTM0MyNDEwX0VORFBPSU5UUyAgICAgICBBUlJBWV9TSVpFKGVwX25hbWUpCgpzdHJ1Y3QgczNjMjQxMF9yZXF1ZXN0IHsKCXN0cnVjdCBsaXN0X2hlYWQJCXF1ZXVlOwkJLyogZXAncyByZXF1ZXN0cyAqLwoJc3RydWN0IHVzYl9yZXF1ZXN0CQlyZXE7Cn07CgplbnVtIGVwMF9zdGF0ZSB7CiAgICAgICAgRVAwX0lETEUsCiAgICAgICAgRVAwX0lOX0RBVEFfUEhBU0UsCiAgICAgICAgRVAwX09VVF9EQVRBX1BIQVNFLAogICAgICAgIEVQMF9FTkRfWEZFUiwKICAgICAgICBFUDBfU1RBTEwsCn07CgpzdGF0aWMgY29uc3QgY2hhciAqZXAwc3RhdGVzW109IHsKICAgICAgICAiRVAwX0lETEUiLAogICAgICAgICJFUDBfSU5fREFUQV9QSEFTRSIsCiAgICAgICAgIkVQMF9PVVRfREFUQV9QSEFTRSIsCiAgICAgICAgIkVQMF9FTkRfWEZFUiIsCiAgICAgICAgIkVQMF9TVEFMTCIsCn07CgpzdHJ1Y3QgczNjMjQxMF91ZGMgewoJc3BpbmxvY2tfdAkJCWxvY2s7CgoJc3RydWN0IHMzYzI0MTBfZXAJCWVwW1MzQzI0MTBfRU5EUE9JTlRTXTsKCWludAkJCQlhZGRyZXNzOwoJc3RydWN0IHVzYl9nYWRnZXQJCWdhZGdldDsKCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlcgkqZHJpdmVyOwoJc3RydWN0IHMzYzI0MTBfcmVxdWVzdAkJZmlmb19yZXE7Cgl1OAkJCQlmaWZvX2J1ZltFUF9GSUZPX1NJWkVdOwoJdTE2CQkJCWRldnN0YXR1czsKCgl1MzIJCQkJcG9ydF9zdGF0dXM7CglpbnQJCQkJZXAwc3RhdGU7CgoJdW5zaWduZWQJCQlnb3RfaXJxIDogMTsKCgl1bnNpZ25lZAkJCXJlcV9zdGQgOiAxOwoJdW5zaWduZWQJCQlyZXFfY29uZmlnIDogMTsKCXVuc2lnbmVkCQkJcmVxX3BlbmRpbmcgOiAxOwoJdTgJCQkJdmJ1czsKCXN0cnVjdCBkZW50cnkJCQkqcmVnc19pbmZvOwp9OwoKI2VuZGlmCg==