LyoKICoJdzgzNjk3aGYvaGcgV0RUIGRyaXZlcgogKgogKgkoYykgQ29weXJpZ2h0IDIwMDYgTWFyY3VzIEp1bmtlciA8anVua2VyQGFuZHVyYXMuZGU+CiAqCiAqCUJhc2VkIG9uIHc4MzYyN2hmX3dkdC5jIHdoaWNoIGlzIGJhc2VkIG9uIGFkdmFudGVjaHdkdC5jCiAqCXdoaWNoIGlzIGJhc2VkIG9uIHdkdC5jLgogKglPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CiAqCiAqCShjKSBDb3B5cmlnaHQgMjAwMyBQ4WRyYWlnIEJyYWR5IDxQQGRyYWlnQnJhZHkuY29tPgogKgogKgkoYykgQ29weXJpZ2h0IDIwMDAtMjAwMSBNYXJlayBNaWNoYWxraWV3aWN6IDxtYXJla21AbGludXgub3JnLnBsPgogKgogKgkoYykgQ29weXJpZ2h0IDE5OTYgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCQkJCWh0dHA6Ly93d3cucmVkaGF0LmNvbQogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKglOZWl0aGVyIE1hcmN1cyBKdW5rZXIgbm9yIEFORFVSQVMgQUcgYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCiAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZAogKgkiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgojaW5jbHVkZSA8bGludXgvZnMuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KCiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CgojZGVmaW5lIFdBVENIRE9HX05BTUUgInc4MzY5N2hmL2hnIFdEVCIKI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCiNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCA2MAkJLyogNjAgc2VjIGRlZmF1bHQgdGltZW91dCAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CnN0YXRpYyBjaGFyIGV4cGVjdF9jbG9zZTsKc3RhdGljIHNwaW5sb2NrX3QgaW9fbG9jazsKCi8qIFlvdSBtdXN0IHNldCB0aGlzIC0gdGhlcmUgaXMgbm8gc2FuZSB3YXkgdG8gcHJvYmUgZm9yIHRoaXMgYm9hcmQuICovCnN0YXRpYyBpbnQgd2R0X2lvID0gMHgyZTsKbW9kdWxlX3BhcmFtKHdkdF9pbywgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh3ZHRfaW8sICJ3ODM2OTdoZi9oZyBXRFQgaW8gcG9ydCAoZGVmYXVsdCAweDJlLCAwID0gYXV0b2RldGVjdCkiKTsKCnN0YXRpYyBpbnQgdGltZW91dCA9IFdBVENIRE9HX1RJTUVPVVQ7CS8qIGluIHNlY29uZHMgKi8KbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gMTw9IHRpbWVvdXQgPD0yNTUsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfVElNRU9VVCkgIi4iKTsKCnN0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKCi8qCiAqCUtlcm5lbCBtZXRob2RzLgogKi8KCiNkZWZpbmUgVzgzNjk3SEZfRUZFUiAod2R0X2lvKzApCS8qIEV4dGVuZGVkIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAqLwojZGVmaW5lIFc4MzY5N0hGX0VGSVIgKHdkdF9pbyswKQkvKiBFeHRlbmRlZCBGdW5jdGlvbiBJbmRleCBSZWdpc3RlciAoc2FtZSBhcyBFRkVSKSAqLwojZGVmaW5lIFc4MzY5N0hGX0VGRFIgKHdkdF9pbysxKQkvKiBFeHRlbmRlZCBGdW5jdGlvbiBEYXRhIFJlZ2lzdGVyICovCgpzdGF0aWMgaW5saW5lIHZvaWQKdzgzNjk3aGZfdW5sb2NrKHZvaWQpCnsKCW91dGJfcCgweDg3LCBXODM2OTdIRl9FRkVSKTsJLyogRW50ZXIgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLwoJb3V0Yl9wKDB4ODcsIFc4MzY5N0hGX0VGRVIpOwkvKiBBZ2FpbiBhY2NvcmRpbmcgdG8gbWFudWFsICovCn0KCnN0YXRpYyBpbmxpbmUgdm9pZAp3ODM2OTdoZl9sb2NrKHZvaWQpCnsKCW91dGJfcCgweEFBLCBXODM2OTdIRl9FRkVSKTsJLyogTGVhdmUgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLwp9CgovKgogKglUaGUgdHdvIGZ1bmN0aW9ucyB3ODM2OTdoZl9nZXRfcmVnKCkgYW5kIHc4MzY5N2hmX3NldF9yZWcoKQogKgltdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBkZXZpY2UgdW5sb2NrZWQuCiAqLwoKc3RhdGljIHVuc2lnbmVkIGNoYXIKdzgzNjk3aGZfZ2V0X3JlZyh1bnNpZ25lZCBjaGFyIHJlZykKewoJb3V0Yl9wKHJlZywgVzgzNjk3SEZfRUZJUik7CglyZXR1cm4gaW5iX3AoVzgzNjk3SEZfRUZEUik7Cn0KCnN0YXRpYyB2b2lkCnc4MzY5N2hmX3NldF9yZWcodW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgZGF0YSkKewoJb3V0Yl9wKHJlZywgVzgzNjk3SEZfRUZJUik7CglvdXRiX3AoZGF0YSwgVzgzNjk3SEZfRUZEUik7Cn0KCnN0YXRpYyB2b2lkCnc4MzY5N2hmX3NlbGVjdF93ZHQodm9pZCkKewoJdzgzNjk3aGZfdW5sb2NrKCk7Cgl3ODM2OTdoZl9zZXRfcmVnKDB4MDcsIDB4MDgpOwkvKiBTd2l0Y2ggdG8gbG9naWMgZGV2aWNlIDggKEdQSU8yKSAqLwp9CgpzdGF0aWMgaW5saW5lIHZvaWQKdzgzNjk3aGZfZGVzZWxlY3Rfd2R0KHZvaWQpCnsKCXc4MzY5N2hmX2xvY2soKTsKfQoKc3RhdGljIHZvaWQKdzgzNjk3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKHZvaWQpCnsKCXc4MzY5N2hmX3VubG9jaygpOwoKCXc4MzY5N2hmX3NldF9yZWcoMHgyOSwgMHgyMCk7CS8qIFNldCBwaW4gMTE5IHRvIFdEVE8jIG1vZGUgKD0gQ1IyOSwgV0RUMCkgKi8KCgl3ODM2OTdoZl9zZXRfcmVnKDB4MDcsIDB4MDgpOwkvKiBTd2l0Y2ggdG8gbG9naWMgZGV2aWNlIDggKEdQSU8yKSAqLwoJdzgzNjk3aGZfc2V0X3JlZygweDMwLCAweDAxKTsJLyogRW5hYmxlIHRpbWVyL2FjdGl2YXRlIEdQSU8yIHZpYSBiaXQgMCAqLwp9CgpzdGF0aWMgdm9pZAp3ODM2OTdoZl91bnNlbGVjdF93ZF9yZWdpc3Rlcih2b2lkKQp7Cgl3ODM2OTdoZl9sb2NrKCk7Cn0KCnN0YXRpYyB2b2lkCnc4MzY5N2hmX2luaXQodm9pZCkKewoJdW5zaWduZWQgY2hhciB0OwoKCXc4MzY5N2hmX3NlbGVjdF93ZF9yZWdpc3RlcigpOwoKCXQgPSB3ODM2OTdoZl9nZXRfcmVnKDB4RjMpOwkvKiBSZWFkIENSRjMgKi8KCWlmICh0ICE9IDApIHsKCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIGFscmVhZHkgcnVubmluZy4gUmVzZXR0aW5nIHRpbWVvdXQgdG8gJWQgc2VjXG4iLCB0aW1lb3V0KTsKCQl3ODM2OTdoZl9zZXRfcmVnKDB4RjMsIHRpbWVvdXQpOwkvKiBXcml0ZSBuZXcgdGltZW91dCAqLwoJfQoJdCA9IHc4MzY5N2hmX2dldF9yZWcoMHhGNCk7CS8qIFJlYWQgQ1JGNCAqLwoJdCY9fjB4MEM7CQkJLyogc2V0IHNlY29uZCBtb2RlICYgZGlzYWJsZSBrZXlib2FyZCB0dXJuaW5nIG9mZiB3YXRjaGRvZyAqLwoJdzgzNjk3aGZfc2V0X3JlZygweEY0LCB0KTsJLyogV3JpdGUgYmFjayB0byBDUkY0ICovCgoJdzgzNjk3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKfQoKc3RhdGljIHZvaWQKd2R0X2N0cmwoaW50IHRpbWVvdXQpCnsKCXNwaW5fbG9jaygmaW9fbG9jayk7CgoJdzgzNjk3aGZfc2VsZWN0X3dkdCgpOwoKCXc4MzY5N2hmX3NldF9yZWcoMHhGNCwgdGltZW91dCk7CS8qIFdyaXRlIFRpbWVvdXQgY291bnRlciB0byBDUkY0ICovCgoJdzgzNjk3aGZfZGVzZWxlY3Rfd2R0KCk7CgoJc3Bpbl91bmxvY2soJmlvX2xvY2spOwp9CgpzdGF0aWMgaW50CndkdF9waW5nKHZvaWQpCnsKCXdkdF9jdHJsKHRpbWVvdXQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKd2R0X2Rpc2FibGUodm9pZCkKewoJd2R0X2N0cmwoMCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludAp3ZHRfc2V0X2hlYXJ0YmVhdChpbnQgdCkKewoJaWYgKCh0IDwgMSkgfHwgKHQgPiAyNTUpKQoJCXJldHVybiAtRUlOVkFMOwoKCXRpbWVvdXQgPSB0OwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzc2l6ZV90CndkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCnsKCWlmIChjb3VudCkgewoJCWlmICghbm93YXlvdXQpIHsKCQkJc2l6ZV90IGk7CgoJCQlleHBlY3RfY2xvc2UgPSAwOwoKCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CgkJCQljaGFyIGM7CgkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmK2kpKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJaWYgKGMgPT0gJ1YnKQoJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOwoJCQl9CgkJfQoJCXdkdF9waW5nKCk7Cgl9CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBpbnQKd2R0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAoJICB1bnNpZ25lZCBsb25nIGFyZykKewoJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CglpbnQgX191c2VyICpwID0gYXJncDsKCWludCBuZXdfdGltZW91dDsKCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfTUFHSUNDTE9TRSwKCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCgkJLmlkZW50aXR5ID0gIlc4MzY5N0hGIFdEVCIsCgl9OwoKCXN3aXRjaCAoY21kKSB7CgljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlicmVhazsKCgljYXNlIFdESU9DX0dFVFNUQVRVUzoKCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CgoJY2FzZSBXRElPQ19LRUVQQUxJVkU6CgkJd2R0X3BpbmcoKTsKCQlicmVhazsKCgljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CgkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCBwKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KG5ld190aW1lb3V0KSkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJd2R0X3BpbmcoKTsKCQkvKiBGYWxsICovCgoJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgoJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCBwKTsKCgljYXNlIFdESU9DX1NFVE9QVElPTlM6Cgl7CgkJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CgoJCWlmIChnZXRfdXNlcihvcHRpb25zLCBwKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgoJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKCQkJd2R0X2Rpc2FibGUoKTsKCQkJcmV0dmFsID0gMDsKCQl9CgoJCWlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgewoJCQl3ZHRfcGluZygpOwoJCQlyZXR2YWwgPSAwOwoJCX0KCgkJcmV0dXJuIHJldHZhbDsKCX0KCglkZWZhdWx0OgoJCXJldHVybiAtRU5PVFRZOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfb3BlbikpCgkJcmV0dXJuIC1FQlVTWTsKCS8qCgkgKglBY3RpdmF0ZQoJICovCgoJd2R0X3BpbmcoKTsKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludAp3ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKCQl3ZHRfZGlzYWJsZSgpOwoJfSBlbHNlIHsKCQlwcmludGsgKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOwoJCXdkdF9waW5nKCk7Cgl9CglleHBlY3RfY2xvc2UgPSAwOwoJY2xlYXJfYml0KDAsICZ3ZHRfaXNfb3Blbik7CglyZXR1cm4gMDsKfQoKLyoKICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCiAqLwoKc3RhdGljIGludAp3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKCXZvaWQgKnVudXNlZCkKewoJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkgewoJCS8qIFR1cm4gdGhlIFdEVCBvZmYgKi8KCQl3ZHRfZGlzYWJsZSgpOwoJfQoJcmV0dXJuIE5PVElGWV9ET05FOwp9CgovKgogKglLZXJuZWwgSW50ZXJmYWNlcwogKi8KCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmxsc2VlawkJPSBub19sbHNlZWssCgkud3JpdGUJCT0gd2R0X3dyaXRlLAoJLmlvY3RsCQk9IHdkdF9pb2N0bCwKCS5vcGVuCQk9IHdkdF9vcGVuLAoJLnJlbGVhc2UJPSB3ZHRfY2xvc2UsCn07CgpzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0X21pc2NkZXYgPSB7CgkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKCS5uYW1lID0gIndhdGNoZG9nIiwKCS5mb3BzID0gJndkdF9mb3BzLAp9OwoKLyoKICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bwogKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgogKi8KCnN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyID0gewoJLm5vdGlmaWVyX2NhbGwgPSB3ZHRfbm90aWZ5X3N5cywKfTsKCnN0YXRpYyBpbnQKdzgzNjk3aGZfY2hlY2tfd2R0KHZvaWQpCnsKCWlmICghcmVxdWVzdF9yZWdpb24od2R0X2lvLCAyLCBXQVRDSERPR19OQU1FKSkgewoJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCV4IGFscmVhZHkgaW4gdXNlXG4iLCB3ZHRfaW8pOwoJCXJldHVybiAtRUlPOwoJfQoKCXByaW50ayAoS0VSTl9ERUJVRyBQRlggIkxvb2tpbmcgZm9yIHdhdGNoZG9nIGF0IGFkZHJlc3MgMHgleFxuIiwgd2R0X2lvKTsKCXc4MzY5N2hmX3VubG9jaygpOwoJaWYgKHc4MzY5N2hmX2dldF9yZWcoMHgyMCkgPT0gMHg2MCkgewoJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAid2F0Y2hkb2cgZm91bmQgYXQgYWRkcmVzcyAweCV4XG4iLCB3ZHRfaW8pOwoJCXc4MzY5N2hmX2xvY2soKTsKCQlyZXR1cm4gMDsKCX0KCXc4MzY5N2hmX2xvY2soKTsJLyogUmVwcm90ZWN0IGluIGNhc2UgaXQgd2FzIGEgY29tcGF0aWJsZSBkZXZpY2UgKi8KCglwcmludGsgKEtFUk5fSU5GTyBQRlggIndhdGNoZG9nIG5vdCBmb3VuZCBhdCBhZGRyZXNzIDB4JXhcbiIsIHdkdF9pbyk7CglyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sIDIpOwoJcmV0dXJuIC1FSU87Cn0KCnN0YXRpYyBpbnQgX19pbml0CndkdF9pbml0KHZvaWQpCnsKCWludCByZXQsIGF1dG9kZXRlY3Q7CgoJc3Bpbl9sb2NrX2luaXQoJmlvX2xvY2spOwoKCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiV0RUIGRyaXZlciBmb3IgVzgzNjk3SEYvSEcgaW5pdGlhbGl6aW5nXG4iKTsKCglhdXRvZGV0ZWN0ID0gd2R0X2lvID09IDA7CglpZiAoYXV0b2RldGVjdCkKCQl3ZHRfaW8gPSAweDJlOwoKCWlmICghdzgzNjk3aGZfY2hlY2tfd2R0KCkpCgkJZ290byBmb3VuZDsKCglpZiAoYXV0b2RldGVjdCkgewoJCXdkdF9pbyA9IDB4NGU7CgkJaWYgKCF3ODM2OTdoZl9jaGVja193ZHQoKSkKCQkJZ290byBmb3VuZDsKCX0KCglwcmludGsgKEtFUk5fRVJSIFBGWCAiTm8gVzgzNjk3SEYvSEcgY291bGQgYmUgZm91bmRcbiIpOwoJcmV0ID0gLUVJTzsKCWdvdG8gb3V0OwoKZm91bmQ6CgoJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CgkJd2R0X3NldF9oZWFydGJlYXQoV0FUQ0hET0dfVElNRU9VVCk7CgkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJ0aW1lb3V0IHZhbHVlIG11c3QgYmUgMTw9dGltZW91dDw9MjU1LCB1c2luZyAlZFxuIiwKCQkJV0FUQ0hET0dfVElNRU9VVCk7Cgl9CgoJdzgzNjk3aGZfaW5pdCgpOwoKCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKCWlmIChyZXQgIT0gMCkgewoJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLAoJCQlyZXQpOwoJCWdvdG8gdW5yZWdfcmVnaW9uczsKCX0KCglyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CglpZiAocmV0ICE9IDApIHsKCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCgkJCVdBVENIRE9HX01JTk9SLCByZXQpOwoJCWdvdG8gdW5yZWdfcmVib290OwoJfQoKCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgc2VjIChub3dheW91dD0lZClcbiIsCgkJdGltZW91dCwgbm93YXlvdXQpOwoKb3V0OgoJcmV0dXJuIHJldDsKdW5yZWdfcmVib290OgoJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CnVucmVnX3JlZ2lvbnM6CglyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sIDIpOwoJZ290byBvdXQ7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdAp3ZHRfZXhpdCh2b2lkKQp7CgltaXNjX2RlcmVnaXN0ZXIoJndkdF9taXNjZGV2KTsKCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOwoJcmVsZWFzZV9yZWdpb24od2R0X2lvLCAyKTsKfQoKbW9kdWxlX2luaXQod2R0X2luaXQpOwptb2R1bGVfZXhpdCh3ZHRfZXhpdCk7CgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BVVRIT1IoIk1hcmN1cyBKdW5rZXIgPGp1bmtlckBhbmR1cmFzLmRlPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oInc4MzY5N2hmL2hnIFdEVCBkcml2ZXIiKTsKTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwo=