LyoKICogRE9TIGludGVycnVwdCAzM2ggaGFuZGxlcgogKgogKiBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAiZG9zZXhlLmgiCiNpbmNsdWRlICJ2Z2EuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGludCk7CgpzdGF0aWMgc3RydWN0CnsKICAgIFdPUkQgeCwgeSwgYnV0OwogICAgV09SRCBsYmNvdW50LCByYmNvdW50LCBybGFzdHgsIHJsYXN0eSwgbGxhc3R4LCBsbGFzdHk7CiAgICBGQVJQUk9DMTYgY2FsbGJhY2s7CiAgICBXT1JEIGNhbGxtYXNrOwogICAgV09SRCBWTVByYXRpbywgSE1QcmF0aW8sIG9sZHgsIG9sZHk7CiAgICBXT1JEIGhpZGVfY291bnQ7Cn0gbW91c2VfaW5mbzsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICBJTlQzM19SZXNldE1vdXNlCiAqCiAqIEhhbmRsZXIgZm9yOgogKiAtIHN1YmZ1bmN0aW9uIDB4MDAgKHJlc2V0IG1vdXNlKQogKiAtIHN1YmZ1bmN0aW9uIDB4MjEgKHNvZnR3YXJlIHJlc2V0KQogKi8Kc3RhdGljIHZvaWQgSU5UMzNfUmVzZXRNb3VzZSggQ09OVEVYVDg2ICpjb250ZXh0ICkKewogICAgbWVtc2V0KCAmbW91c2VfaW5mbywgMCwgc2l6ZW9mKG1vdXNlX2luZm8pICk7CiAgICAKICAgIC8qIFNldCB0aGUgZGVmYXVsdCBtaWNrZXkvcGl4ZWwgcmF0aW8gKi8KICAgIG1vdXNlX2luZm8uSE1QcmF0aW8gPSA4OwogICAgbW91c2VfaW5mby5WTVByYXRpbyA9IDE2OwoKICAgIC8qIEhpZGUgdGhlIG1vdXNlIGN1cnNvciAqLwogICAgbW91c2VfaW5mby5oaWRlX2NvdW50ID0gMTsKICAgIFZHQV9TaG93TW91c2UoIEZBTFNFICk7ICAgIAoKICAgIGlmIChjb250ZXh0KQogICAgewogICAgICAgIFNFVF9BWCggY29udGV4dCwgMHhGRkZGICk7IC8qIGRyaXZlciBpbnN0YWxsZWQgKi8KICAgICAgICBTRVRfQlgoIGNvbnRleHQsIDMgKTsgICAgICAvKiBudW1iZXIgb2YgYnV0dG9ucyAqLwogICAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJICAgIERPU1ZNX0ludDMzSGFuZGxlciAoV0lORURPUzE2LjE1MSkKICoKICogSGFuZGxlciBmb3IgaW50IDMzaCAoTVMgTU9VU0UpLgogKi8Kdm9pZCBXSU5BUEkgRE9TVk1fSW50MzNIYW5kbGVyKCBDT05URVhUODYgKmNvbnRleHQgKQp7CiAgICBzd2l0Y2ggKEFYX3JlZyhjb250ZXh0KSkKICAgIHsKICAgIGNhc2UgMHgwMDAwOgogICAgICAgIFRSQUNFKCJSZXNldCBtb3VzZSBkcml2ZXIgYW5kIHJlcXVlc3Qgc3RhdHVzXG4iKTsKICAgICAgICBJTlQzM19SZXNldE1vdXNlKCBjb250ZXh0ICk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAwMDE6CiAgICAgICAgVFJBQ0UoIlNob3cgbW91c2UgY3Vyc29yLCBvbGQgaGlkZSBjb3VudDogJWRcbiIsCiAgICAgICAgICAgICAgbW91c2VfaW5mby5oaWRlX2NvdW50KTsKICAgICAgICBpZiAobW91c2VfaW5mby5oaWRlX2NvdW50ID49IDEpCiAgICAgICAgICAgIG1vdXNlX2luZm8uaGlkZV9jb3VudC0tOwogICAgICAgIGlmICghbW91c2VfaW5mby5oaWRlX2NvdW50KQogICAgICAgICAgICBWR0FfU2hvd01vdXNlKCBUUlVFICk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAwMDI6CiAgICAgICAgVFJBQ0UoIkhpZGUgbW91c2UgY3Vyc29yLCBvbGQgaGlkZSBjb3VudDogJWRcbiIsCiAgICAgICAgICAgICAgbW91c2VfaW5mby5oaWRlX2NvdW50KTsKICAgICAgICBpZighbW91c2VfaW5mby5oaWRlX2NvdW50KQogICAgICAgICAgICBWR0FfU2hvd01vdXNlKCBGQUxTRSApOyAgICAgICAgICAgIAogICAgICAgIG1vdXNlX2luZm8uaGlkZV9jb3VudCsrOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMDAzOgogICAgICAgIFRSQUNFKCJSZXR1cm4gbW91c2UgcG9zaXRpb24gYW5kIGJ1dHRvbiBzdGF0dXM6ICglZCwlZCkgYW5kICVkXG4iLAogICAgICAgICAgICAgIG1vdXNlX2luZm8ueCwgbW91c2VfaW5mby55LCBtb3VzZV9pbmZvLmJ1dCk7CiAgICAgICAgU0VUX0JYKCBjb250ZXh0LCBtb3VzZV9pbmZvLmJ1dCApOwogICAgICAgIFNFVF9DWCggY29udGV4dCwgbW91c2VfaW5mby54ICk7CiAgICAgICAgU0VUX0RYKCBjb250ZXh0LCBtb3VzZV9pbmZvLnkgKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDAwNDoKICAgICAgICBGSVhNRSgiUG9zaXRpb24gbW91c2UgY3Vyc29yXG4iKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDAwNToKICAgICAgICBUUkFDRSgiUmV0dXJuIE1vdXNlIGJ1dHRvbiBwcmVzcyBJbmZvcm1hdGlvbiBmb3IgJXMgbW91c2UgYnV0dG9uXG4iLAogICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSA/ICJyaWdodCIgOiAibGVmdCIpOwogICAgICAgIGlmIChCWF9yZWcoY29udGV4dCkpIAogICAgICAgIHsKICAgICAgICAgICAgU0VUX0JYKCBjb250ZXh0LCBtb3VzZV9pbmZvLnJiY291bnQgKTsKICAgICAgICAgICAgbW91c2VfaW5mby5yYmNvdW50ID0gMDsKICAgICAgICAgICAgU0VUX0NYKCBjb250ZXh0LCBtb3VzZV9pbmZvLnJsYXN0eCApOwogICAgICAgICAgICBTRVRfRFgoIGNvbnRleHQsIG1vdXNlX2luZm8ucmxhc3R5ICk7CiAgICAgICAgfSAKICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgU0VUX0JYKCBjb250ZXh0LCBtb3VzZV9pbmZvLmxiY291bnQgKTsKICAgICAgICAgICAgbW91c2VfaW5mby5sYmNvdW50ID0gMDsKICAgICAgICAgICAgU0VUX0NYKCBjb250ZXh0LCBtb3VzZV9pbmZvLmxsYXN0eCApOwogICAgICAgICAgICBTRVRfRFgoIGNvbnRleHQsIG1vdXNlX2luZm8ubGxhc3R5ICk7CiAgICAgICAgfQogICAgICAgIFNFVF9BWCggY29udGV4dCwgbW91c2VfaW5mby5idXQgKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDAwNzoKICAgICAgICBGSVhNRSgiRGVmaW5lIGhvcml6b250YWwgbW91c2UgY3Vyc29yIHJhbmdlICVkLi4lZFxuIiwKICAgICAgICAgICAgICBDWF9yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAwMDg6CiAgICAgICAgRklYTUUoIkRlZmluZSB2ZXJ0aWNhbCBtb3VzZSBjdXJzb3IgcmFuZ2UgJWQuLiVkXG4iLAogICAgICAgICAgICAgIENYX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDAwOToKICAgICAgICBGSVhNRSgiRGVmaW5lIGdyYXBoaWNzIG1vdXNlIGN1cnNvclxuIik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAwMEE6CiAgICAgICAgRklYTUUoIkRlZmluZSB0ZXh0IG1vdXNlIGN1cnNvclxuIik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAwMEI6CiAgICAgICAgVFJBQ0UoIlJlYWQgTW91c2UgbW90aW9uIGNvdW50ZXJzXG4iKTsKICAgICAgICB7CiAgICAgICAgICAgIGludCBkeCA9ICgoaW50KW1vdXNlX2luZm8ueCAtIChpbnQpbW91c2VfaW5mby5vbGR4KQogICAgICAgICAgICAgICAgKiAobW91c2VfaW5mby5ITVByYXRpbyAvIDgpOwogICAgICAgICAgICBpbnQgZHkgPSAoKGludCltb3VzZV9pbmZvLnkgLSAoaW50KW1vdXNlX2luZm8ub2xkeSkKICAgICAgICAgICAgICAgICogKG1vdXNlX2luZm8uVk1QcmF0aW8gLyA4KTsKCiAgICAgICAgICAgIFNFVF9DWCggY29udGV4dCwgKFdPUkQpZHggKTsKICAgICAgICAgICAgU0VUX0RYKCBjb250ZXh0LCAoV09SRClkeSApOwoKICAgICAgICAgICAgbW91c2VfaW5mby5vbGR4ID0gbW91c2VfaW5mby54OwogICAgICAgICAgICBtb3VzZV9pbmZvLm9sZHkgPSBtb3VzZV9pbmZvLnk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMDBDOgogICAgICAgIFRSQUNFKCJEZWZpbmUgbW91c2UgaW50ZXJydXB0IHN1YnJvdXRpbmVcbiIpOwogICAgICAgIG1vdXNlX2luZm8uY2FsbG1hc2sgPSBDWF9yZWcoY29udGV4dCk7CiAgICAgICAgbW91c2VfaW5mby5jYWxsYmFjayA9IChGQVJQUk9DMTYpTUFLRVNFR1BUUihjb250ZXh0LT5TZWdFcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMDBGOgogICAgICAgIFRSQUNFKCJTZXQgbWlja2V5L3BpeGVsIHJhdGlvXG4iKTsKICAgICAgICBtb3VzZV9pbmZvLkhNUHJhdGlvID0gQ1hfcmVnKGNvbnRleHQpOwogICAgICAgIG1vdXNlX2luZm8uVk1QcmF0aW8gPSBEWF9yZWcoY29udGV4dCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAwMTA6CiAgICAgICAgRklYTUUoIkRlZmluZSBzY3JlZW4gcmVnaW9uIGZvciB1cGRhdGVcbiIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMDIxOgogICAgICAgIFRSQUNFKCJTb2Z0d2FyZSByZXNldFxuIik7CiAgICAgICAgSU5UMzNfUmVzZXRNb3VzZSggY29udGV4dCApOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgSU5UX0JBUkYoY29udGV4dCwweDMzKTsKICAgIH0KfQoKdHlwZWRlZiBzdHJ1Y3QgewogIEZBUlBST0MxNiBwcm9jOwogIFdPUkQgbWFzayxidXQseCx5LG14LG15Owp9IE1DQUxMREFUQTsKCnN0YXRpYyB2b2lkIE1vdXNlUmVsYXkoQ09OVEVYVDg2ICpjb250ZXh0LHZvaWQgKm1kYXRhKQp7CiAgTUNBTExEQVRBICpkYXRhID0gKE1DQUxMREFUQSAqKW1kYXRhOwogIENPTlRFWFQ4NiBjdHggPSAqY29udGV4dDsKCiAgaWYgKCFJU1Y4NigmY3R4KSkKICB7CiAgICAgIGN0eC5FRmxhZ3MgfD0gVjg2X0ZMQUc7CiAgICAgIGN0eC5TZWdTcyA9IDA7IC8qIEFsbG9jYXRlIG5ldyBzdGFjay4gKi8KICB9CgogIGN0eC5FYXggICA9IGRhdGEtPm1hc2s7CiAgY3R4LkVieCAgID0gZGF0YS0+YnV0OwogIGN0eC5FY3ggICA9IGRhdGEtPng7CiAgY3R4LkVkeCAgID0gZGF0YS0+eTsKICBjdHguRXNpICAgPSBkYXRhLT5teDsKICBjdHguRWRpICAgPSBkYXRhLT5teTsKICBjdHguU2VnQ3MgPSBTRUxFQ1RPUk9GKGRhdGEtPnByb2MpOwogIGN0eC5FaXAgICA9IE9GRlNFVE9GKGRhdGEtPnByb2MpOwogIGZyZWUoZGF0YSk7CiAgRFBNSV9DYWxsUk1Qcm9jKCZjdHgsIE5VTEwsIDAsIDApOwp9CgpzdGF0aWMgdm9pZCBRdWV1ZU1vdXNlUmVsYXkoRFdPUkQgbXgsIERXT1JEIG15LCBXT1JEIG1hc2spCnsKICBtb3VzZV9pbmZvLnggPSBteDsKICBtb3VzZV9pbmZvLnkgPSBteTsKCiAgLyogTGVmdCBidXR0b24gZG93biAqLwogIGlmKG1hc2sgJiAweDAyKSB7CiAgICBtb3VzZV9pbmZvLmJ1dCB8PSAweDAxOwogICAgbW91c2VfaW5mby5sbGFzdHggPSBteDsKICAgIG1vdXNlX2luZm8ubGxhc3R5ID0gbXk7CiAgICBtb3VzZV9pbmZvLmxiY291bnQrKzsKICB9CgogIC8qIExlZnQgYnV0dG9uIHVwICovCiAgaWYobWFzayAmIDB4MDQpIHsKICAgIG1vdXNlX2luZm8uYnV0ICY9IH4weDAxOwogIH0KCiAgLyogUmlnaHQgYnV0dG9uIGRvd24gKi8KICBpZihtYXNrICYgMHgwOCkgewogICAgbW91c2VfaW5mby5idXQgfD0gMHgwMjsKICAgIG1vdXNlX2luZm8ucmxhc3R4ID0gbXg7CiAgICBtb3VzZV9pbmZvLnJsYXN0eSA9IG15OwogICAgbW91c2VfaW5mby5yYmNvdW50Kys7CiAgfQoKICAvKiBSaWdodCBidXR0b24gdXAgKi8KICBpZihtYXNrICYgMHgxMCkgewogICAgbW91c2VfaW5mby5idXQgJj0gfjB4MDI7CiAgfQoKICAvKiBNaWRkbGUgYnV0dG9uIGRvd24gKi8KICBpZihtYXNrICYgMHgyMCkgewogICAgbW91c2VfaW5mby5idXQgfD0gMHgwNDsKICB9CgogIC8qIE1pZGRsZSBidXR0b24gdXAgKi8KICBpZihtYXNrICYgMHg0MCkgewogICAgbW91c2VfaW5mby5idXQgJj0gfjB4MDQ7CiAgfQoKICBpZiAoKG1hc2sgJiBtb3VzZV9pbmZvLmNhbGxtYXNrKSAmJiBtb3VzZV9pbmZvLmNhbGxiYWNrKSB7CiAgICBNQ0FMTERBVEEgKmRhdGEgPSBjYWxsb2MoMSxzaXplb2YoTUNBTExEQVRBKSk7CiAgICBkYXRhLT5wcm9jID0gbW91c2VfaW5mby5jYWxsYmFjazsKICAgIGRhdGEtPm1hc2sgPSBtYXNrICYgbW91c2VfaW5mby5jYWxsbWFzazsKICAgIGRhdGEtPmJ1dCA9IG1vdXNlX2luZm8uYnV0OwogICAgZGF0YS0+eCA9IG1vdXNlX2luZm8ueDsKICAgIGRhdGEtPnkgPSBtb3VzZV9pbmZvLnk7CgogICAgLyoKICAgICAqIEZha2UgbWlja2V5cy4gCiAgICAgKgogICAgICogRklYTUU6IFRoaXMgaXMgbm90IGVudGlyZWx5IGNvcnJlY3QuIElmIG1vdXNlIGlmIG1vdmVkIHRvIHRoZSBlZGdlCiAgICAgKiAgICAgICAgb2YgdGhlIHNjcmVlbiwgbW91c2Ugd2lsbCBzdG9wIG1vdmluZyBhbmQgbWlja2V5cyB3b24ndAogICAgICogICAgICAgIGJlIHVwZGF0ZWQgZXZlbiB0aG91Z2ggdGhleSBzaG91bGQgYmUuCiAgICAgKi8KICAgIGRhdGEtPm14ID0gbW91c2VfaW5mby54ICogKG1vdXNlX2luZm8uSE1QcmF0aW8gLyA4KTsKICAgIGRhdGEtPm15ID0gbW91c2VfaW5mby55ICogKG1vdXNlX2luZm8uVk1QcmF0aW8gLyA4KTsKCiAgICBET1NWTV9RdWV1ZUV2ZW50KC0xLCBET1NfUFJJT1JJVFlfTU9VU0UsIE1vdXNlUmVsYXksIGRhdGEpOwogIH0KfQoKdm9pZCBXSU5BUEkgRE9TVk1fSW50MzNNZXNzYWdlKFVJTlQgbWVzc2FnZSxXUEFSQU0gd1BhcmFtLExQQVJBTSBsUGFyYW0pCnsKICBXT1JEIG1hc2sgPSAwOwogIHVuc2lnbmVkIEhlaWdodCwgV2lkdGgsIFNYPTEsIFNZPTE7CgogIGlmICghVkdBX0dldE1vZGUoJkhlaWdodCwmV2lkdGgsTlVMTCkpIHsKICAgIC8qIG1heSBuZWVkIHRvIGRvIHNvbWUgY29vcmRpbmF0ZSBzY2FsaW5nICovCiAgICBpZiAoV2lkdGgpCiAgICAgIFNYID0gNjQwL1dpZHRoOwogICAgaWYgKCFTWCkgU1g9MTsKICB9CgogIHN3aXRjaCAobWVzc2FnZSkgewogIGNhc2UgV01fTU9VU0VNT1ZFOgogICAgbWFzayB8PSAweDAxOwogICAgYnJlYWs7CiAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKICBjYXNlIFdNX0xCVVRUT05EQkxDTEs6CiAgICBtYXNrIHw9IDB4MDI7CiAgICBicmVhazsKICBjYXNlIFdNX0xCVVRUT05VUDoKICAgIG1hc2sgfD0gMHgwNDsKICAgIGJyZWFrOwogIGNhc2UgV01fUkJVVFRPTkRPV046CiAgY2FzZSBXTV9SQlVUVE9OREJMQ0xLOgogICAgbWFzayB8PSAweDA4OwogICAgYnJlYWs7CiAgY2FzZSBXTV9SQlVUVE9OVVA6CiAgICBtYXNrIHw9IDB4MTA7CiAgICBicmVhazsKICBjYXNlIFdNX01CVVRUT05ET1dOOgogIGNhc2UgV01fTUJVVFRPTkRCTENMSzoKICAgIG1hc2sgfD0gMHgyMDsKICAgIGJyZWFrOwogIGNhc2UgV01fTUJVVFRPTlVQOgogICAgbWFzayB8PSAweDQwOwogICAgYnJlYWs7CiAgfQoKICBRdWV1ZU1vdXNlUmVsYXkoTE9XT1JEKGxQYXJhbSkgKiBTWCwKICAgICAgICAgICAgICAgICBISVdPUkQobFBhcmFtKSAqIFNZLAogICAgICAgICAgICAgICAgIG1hc2spOwp9Cgp2b2lkIFdJTkFQSSBET1NWTV9JbnQzM0NvbnNvbGUoTU9VU0VfRVZFTlRfUkVDT1JEICpyZWNvcmQpCnsKICB1bnNpZ25lZCBIZWlnaHQsIFdpZHRoOwogIFdPUkQgbWFzayA9IDA7CiAgQk9PTCBuZXdMZWZ0QnV0dG9uID0gcmVjb3JkLT5kd0J1dHRvblN0YXRlICYgRlJPTV9MRUZUXzFTVF9CVVRUT05fUFJFU1NFRDsKICBCT09MIG9sZExlZnRCdXR0b24gPSBtb3VzZV9pbmZvLmJ1dCAmIDB4MDE7CiAgQk9PTCBuZXdSaWdodEJ1dHRvbiA9IHJlY29yZC0+ZHdCdXR0b25TdGF0ZSAmIFJJR0hUTU9TVF9CVVRUT05fUFJFU1NFRDsKICBCT09MIG9sZFJpZ2h0QnV0dG9uID0gbW91c2VfaW5mby5idXQgJiAweDAyOwogIEJPT0wgbmV3TWlkZGxlQnV0dG9uID0gcmVjb3JkLT5kd0J1dHRvblN0YXRlICYgRlJPTV9MRUZUXzJORF9CVVRUT05fUFJFU1NFRDsKICBCT09MIG9sZE1pZGRsZUJ1dHRvbiA9IG1vdXNlX2luZm8uYnV0ICYgMHgwNDsKCiAgaWYobmV3TGVmdEJ1dHRvbiAmJiAhb2xkTGVmdEJ1dHRvbikKICAgIG1hc2sgfD0gMHgwMjsKICBlbHNlIGlmKCFuZXdMZWZ0QnV0dG9uICYmIG9sZExlZnRCdXR0b24pCiAgICBtYXNrIHw9IDB4MDQ7CgogIGlmKG5ld1JpZ2h0QnV0dG9uICYmICFvbGRSaWdodEJ1dHRvbikKICAgIG1hc2sgfD0gMHgwODsKICBlbHNlIGlmKCFuZXdSaWdodEJ1dHRvbiAmJiBvbGRSaWdodEJ1dHRvbikKICAgIG1hc2sgfD0gMHgxMDsKCiAgaWYobmV3TWlkZGxlQnV0dG9uICYmICFvbGRNaWRkbGVCdXR0b24pCiAgICBtYXNrIHw9IDB4MjA7CiAgZWxzZSBpZighbmV3TWlkZGxlQnV0dG9uICYmIG9sZE1pZGRsZUJ1dHRvbikKICAgIG1hc2sgfD0gMHg0MDsKICAKICBpZiAoVkdBX0dldEFscGhhTW9kZSgmV2lkdGgsICZIZWlnaHQpKQogICAgUXVldWVNb3VzZVJlbGF5KCA2NDAgLyBXaWR0aCAqIHJlY29yZC0+ZHdNb3VzZVBvc2l0aW9uLlgsCiAgICAgICAgICAgICAgICAgICAgIDIwMCAvIEhlaWdodCAqIHJlY29yZC0+ZHdNb3VzZVBvc2l0aW9uLlksCiAgICAgICAgICAgICAgICAgICAgIG1hc2sgKTsKfQo=