LyoKICogc3lzY3RsLmMgLSBDb2RlIGZvciBzeXNjdGwgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLiBQYXJ0IG9mCiAqCSAgICAgIHRoZSBMaW51eC1OVEZTIHByb2plY3QuIEFkYXB0ZWQgZnJvbSB0aGUgb2xkIE5URlMgZHJpdmVyLAogKgkgICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgTWFydGluIHZvbiBM9ndpcywgUulnaXMgRHVjaGVzbmUKICoKICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAqCiAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAogKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQogKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CiAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUwogKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2lmZGVmIERFQlVHCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaWZkZWYgQ09ORklHX1NZU0NUTAoKI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgoKI2luY2x1ZGUgInN5c2N0bC5oIgojaW5jbHVkZSAiZGVidWcuaCIKCi8qIERlZmluaXRpb24gb2YgdGhlIG50ZnMgc3lzY3RsLiAqLwpzdGF0aWMgY3RsX3RhYmxlIG50ZnNfc3lzY3Rsc1tdID0gewoJewoJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAkvKiBCaW5hcnkgYW5kIHRleHQgSURzLiAqLwoJCS5wcm9jbmFtZQk9ICJudGZzLWRlYnVnIiwKCQkuZGF0YQkJPSAmZGVidWdfbXNncywJCS8qIERhdGEgcG9pbnRlciBhbmQgc2l6ZS4gKi8KCQkubWF4bGVuCQk9IHNpemVvZihkZWJ1Z19tc2dzKSwKCQkubW9kZQkJPSAwNjQ0LAkJCS8qIE1vZGUsIHByb2MgaGFuZGxlci4gKi8KCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKCX0sCgl7fQp9OwoKLyogRGVmaW5lIHRoZSBwYXJlbnQgZGlyZWN0b3J5IC9wcm9jL3N5cy9mcy4gKi8Kc3RhdGljIGN0bF90YWJsZSBzeXNjdGxzX3Jvb3RbXSA9IHsKCXsKCQkuY3RsX25hbWUJPSBDVExfRlMsCgkJLnByb2NuYW1lCT0gImZzIiwKCQkubW9kZQkJPSAwNTU1LAoJCS5jaGlsZAkJPSBudGZzX3N5c2N0bHMKCX0sCgl7fQp9OwoKLyogU3RvcmFnZSBmb3IgdGhlIHN5c2N0bHMgaGVhZGVyLiAqLwpzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnN5c2N0bHNfcm9vdF90YWJsZSA9IE5VTEw7CgovKioKICogbnRmc19zeXNjdGwgLSBhZGQgb3IgcmVtb3ZlIHRoZSBkZWJ1ZyBzeXNjdGwKICogQGFkZDoJYWRkICgxKSBvciByZW1vdmUgKDApIHRoZSBzeXNjdGwKICoKICogQWRkIG9yIHJlbW92ZSB0aGUgZGVidWcgc3lzY3RsLiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KICovCmludCBudGZzX3N5c2N0bChpbnQgYWRkKQp7CglpZiAoYWRkKSB7CgkJQlVHX09OKHN5c2N0bHNfcm9vdF90YWJsZSk7CgkJc3lzY3Rsc19yb290X3RhYmxlID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bHNfcm9vdCk7CgkJaWYgKCFzeXNjdGxzX3Jvb3RfdGFibGUpCgkJCXJldHVybiAtRU5PTUVNOwoJfSBlbHNlIHsKCQlCVUdfT04oIXN5c2N0bHNfcm9vdF90YWJsZSk7CgkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzY3Rsc19yb290X3RhYmxlKTsKCQlzeXNjdGxzX3Jvb3RfdGFibGUgPSBOVUxMOwoJfQoJcmV0dXJuIDA7Cn0KCiNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiNlbmRpZiAvKiBERUJVRyAqLwo=