LyoKICogKEMpIENvcHlyaWdodCAyMDA5CiAqIEdyYWVtZSBSdXNzLCA8Z3JhZW1lLnJ1c3NAZ21haWwuY29tPgogKgogKiAoQykgQ29weXJpZ2h0IDIwMDcKICogRGFuaWVsIEhlbGxzdHJvbSwgR2Fpc2xlciBSZXNlYXJjaCwgPGRhbmllbEBnYWlzbGVyLmNvbT4KICoKICogKEMpIENvcHlyaWdodCAyMDA2CiAqIERldGxldiBadW5kZWwsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxkenVAZGVueC5kZT4KICoKICogKEMpIENvcHlyaWdodCAtMjAwMwogKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8d2RAZGVueC5kZT4KICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCA8ZGFuaWVsQG9taWNyb24uc2U+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMQogKiBKb3NoIEh1YmVyLCBNaXNzaW9uIENyaXRpY2FsIExpbnV4LCBJbmMsIDxodWJlckBtY2x4LmNvbT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGhpZ2gtbGV2ZWwgQVBJIGZvciB0aGUgaW50ZXJydXB0IHN1Yi1zeXN0ZW0KICogb2YgdGhlIHg4NiBwb3J0IG9mIFUtQm9vdC4gTW9zdCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbgogKiBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSB0aGUgbGVvbjIgLyBsZW9uMyBwb3J0cyBvZiBVLUJvb3QuCiAqIERhbmllbCBIZWxsc3Ryb20sIERldGxldiBadW5kZWwsIFdvbGZnYW5nIERlbmsgYW5kIEpvc2ggSHViZXIgYXJlCiAqIGNyZWRpdGVkIGZvciB0aGUgY29ycmVzcG9uZGluZyB3b3JrIG9uIHRob3NlIHBvcnRzLiBUaGUgb3JpZ2luYWwKICogaW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmVzIGZvciB0aGUgeDg2IHBvcnQgd2VyZSB3cml0dGVuIGJ5CiAqIERhbmllbCBFbmdzdHL2bQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pbnRlcnJ1cHQuaD4KCnN0cnVjdCBpcnFfYWN0aW9uIHsKCWludGVycnVwdF9oYW5kbGVyX3QgKmhhbmRsZXI7Cgl2b2lkICphcmc7Cgl1bnNpZ25lZCBpbnQgY291bnQ7Cn07CgpzdGF0aWMgc3RydWN0IGlycV9hY3Rpb24gaXJxX2hhbmRsZXJzW0NPTkZJR19TWVNfTlVNX0lSUVNdID0geyB7MH0gfTsKc3RhdGljIGludCBzcHVyaW91c19pcnFfY250ID0gMDsKc3RhdGljIGludCBzcHVyaW91c19pcnEgPSAwOwoKdm9pZCBpcnFfaW5zdGFsbF9oYW5kbGVyKGludCBpcnEsIGludGVycnVwdF9oYW5kbGVyX3QgKmhhbmRsZXIsIHZvaWQgKmFyZykKewoJaW50IHN0YXR1czsKCglpZiAoaXJxIDwgMCB8fCBpcnEgPj0gQ09ORklHX1NZU19OVU1fSVJRUykgewoJCXByaW50ZigiaXJxX2luc3RhbGxfaGFuZGxlcjogYmFkIGlycSBudW1iZXIgJWRcbiIsIGlycSk7CgkJcmV0dXJuOwoJfQoKCWlmIChpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyICE9IE5VTEwpCgkJcHJpbnRmKCJpcnFfaW5zdGFsbF9oYW5kbGVyOiAweCUwOGx4IHJlcGxhY2luZyAweCUwOGx4XG4iLAoJCSAgICAgICAodWxvbmcpIGhhbmRsZXIsCgkJICAgICAgICh1bG9uZykgaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlcik7CgoJc3RhdHVzID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOwoKCWlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIgPSBoYW5kbGVyOwoJaXJxX2hhbmRsZXJzW2lycV0uYXJnID0gYXJnOwoJaXJxX2hhbmRsZXJzW2lycV0uY291bnQgPSAwOwoKCXVubWFza19pcnEoaXJxKTsKCglpZiAoc3RhdHVzKQoJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CgoJcmV0dXJuOwp9Cgp2b2lkIGlycV9mcmVlX2hhbmRsZXIoaW50IGlycSkKewoJaW50IHN0YXR1czsKCglpZiAoaXJxIDwgMCB8fCBpcnEgPj0gQ09ORklHX1NZU19OVU1fSVJRUykgewoJCXByaW50ZigiaXJxX2ZyZWVfaGFuZGxlcjogYmFkIGlycSBudW1iZXIgJWRcbiIsIGlycSk7CgkJcmV0dXJuOwoJfQoKCXN0YXR1cyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKCgltYXNrX2lycShpcnEpOwoKCWlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIgPSBOVUxMOwoJaXJxX2hhbmRsZXJzW2lycV0uYXJnID0gTlVMTDsKCglpZiAoc3RhdHVzKQoJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CgoJcmV0dXJuOwp9Cgp2b2lkIGRvX2lycShpbnQgaHdfaXJxKQp7CglpbnQgaXJxID0gaHdfaXJxIC0gMHgyMDsKCglpZiAoaXJxIDwgMCB8fCBpcnEgPj0gQ09ORklHX1NZU19OVU1fSVJRUykgewoJCXByaW50ZigiZG9faXJxOiBiYWQgaXJxIG51bWJlciAlZFxuIiwgaXJxKTsKCQlyZXR1cm47Cgl9CgoJaWYgKGlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIpIHsKCQltYXNrX2lycShpcnEpOwoKCQlpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyKGlycV9oYW5kbGVyc1tpcnFdLmFyZyk7CgkJaXJxX2hhbmRsZXJzW2lycV0uY291bnQrKzsKCgkJdW5tYXNrX2lycShpcnEpOwoJCXNwZWNpZmljX2VvaShpcnEpOwoKCX0gZWxzZSB7CgkJaWYgKChpcnEgJiA3KSAhPSA3KSB7CgkJCXNwdXJpb3VzX2lycV9jbnQrKzsKCQkJc3B1cmlvdXNfaXJxID0gaXJxOwoJCX0KCX0KfQoKI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCmludCBkb19pcnFpbmZvKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJaW50IGlycTsKCglwcmludGYoIlNwdXJpb3VzIElSUTogJXUsIGxhc3QgdW5rbm93biBJUlE6ICVkXG4iLAoJICAgICAgIHNwdXJpb3VzX2lycV9jbnQsIHNwdXJpb3VzX2lycSk7CgoJcHJpbnRmICgiSW50ZXJydXB0LUluZm9ybWF0aW9uOlxuIik7CglwcmludGYgKCJOciAgUm91dGluZSAgIEFyZyAgICAgICBDb3VudFxuIik7CgoJZm9yIChpcnEgPSAwOyBpcnEgPD0gQ09ORklHX1NZU19OVU1fSVJRUzsgaXJxKyspIHsKCQlpZiAoaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlciAhPSBOVUxMKSB7CgkJCXByaW50ZiAoIiUwMmQgICUwOGx4ICAlMDhseCAgJWRcbiIsCgkJCQkJaXJxLAoJCQkJCSh1bG9uZylpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyLAoJCQkJCSh1bG9uZylpcnFfaGFuZGxlcnNbaXJxXS5hcmcsCgkJCQkJaXJxX2hhbmRsZXJzW2lycV0uY291bnQpOwoJCX0KCX0KCglyZXR1cm4gMDsKfQojZW5kaWYK