LyoKICogRE9TIChNWikgbG9hZGVyCiAqCiAqIENvcHlyaWdodCAxOTk4IE92ZSBL5XZlbgogKgogKiBUaGlzIGNvZGUgaGFzbid0IGJlZW4gY29tcGxldGVseSBjbGVhbmVkIHVwIHlldC4KICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5lL3dpbmJhc2UxNi5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIm1vZHVsZS5oIgojaW5jbHVkZSAicGVleGUuaCIKI2luY2x1ZGUgIm5lZXhlLmgiCiNpbmNsdWRlICJ0YXNrLmgiCiNpbmNsdWRlICJzZWxlY3RvcnMuaCIKI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgImxkdC5oIgojaW5jbHVkZSAicHJvY2Vzcy5oIgojaW5jbHVkZSAibWlzY2VtdS5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgojaW5jbHVkZSAiZG9zZXhlLmgiCiNpbmNsdWRlICJkb3Ntb2QuaCIKI2luY2x1ZGUgIm9wdGlvbnMuaCIKI2luY2x1ZGUgInNlcnZlci5oIgojaW5jbHVkZSAidmdhLmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwobW9kdWxlKQoKI2lmZGVmIE1aX1NVUFBPUlRFRAoKI2lmZGVmIEhBVkVfU1lTX01NQU5fSAojIGluY2x1ZGUgPHN5cy9tbWFuLmg+CiNlbmRpZgoKLyogZGVmaW5lIHRoaXMgdG8gdHJ5IG1hcHBpbmcgdGhyb3VnaCAvcHJvYy9waWQvbWVtIGluc3RlYWQgb2YgYSB0ZW1wIGZpbGUsCiAgIGJ1dCBMaW51cyBkb2Vzbid0IGxpa2UgbW1hcHBpbmcgL3Byb2MvcGlkL21lbSwgc28gaXQgZG9lc24ndCB3b3JrIGZvciBtZSAqLwojdW5kZWYgTVpfTUFQU0VMRgoKI2RlZmluZSBCSU9TX0RBVEFfU0VHTUVOVCAweDQwCiNkZWZpbmUgU1RBUlRfT0ZGU0VUIDAKI2RlZmluZSBQU1BfU0laRSAweDEwCgojZGVmaW5lIFNFRzE2KHB0cixzZWcpICgoTFBWT0lEKSgoQllURSopcHRyKygoRFdPUkQpKHNlZyk8PDQpKSkKI2RlZmluZSBTRUdQVFIxNihwdHIsc2VncHRyKSAoKExQVk9JRCkoKEJZVEUqKXB0cisoKERXT1JEKVNFTEVDVE9ST0Yoc2VncHRyKTw8NCkrT0ZGU0VUT0Yoc2VncHRyKSkpCgpzdGF0aWMgdm9pZCBNWl9Jbml0UFNQKCBMUFZPSUQgbHBQU1AsIExQQ1NUUiBjbWRsaW5lLCBXT1JEIGVudiApCnsKIFBEQjE2KnBzcD1scFBTUDsKIGNvbnN0IGNoYXIqY21kPWNtZGxpbmU/c3RyY2hyKGNtZGxpbmUsJyAnKTpOVUxMOwoKIHBzcC0+aW50MjA9MHgyMENEOyAvKiBpbnQgMjAgKi8KIC8qIHNvbWUgcHJvZ3JhbXMgdXNlIHRoaXMgdG8gY2FsY3VsYXRlIGhvdyBtdWNoIG1lbW9yeSB0aGV5IG5lZWQgKi8KIHBzcC0+bmV4dFBhcmFncmFwaD0weDlGRkY7CiBwc3AtPmVudmlyb25tZW50PWVudjsKIC8qIGNvcHkgcGFyYW1ldGVycyAqLwogaWYgKGNtZCkgewojaWYgMAogIC8qIGNvbW1hbmQuY29tIGRvZXNuJ3QgZG8gdGhpcyAqLwogIHdoaWxlICgqY21kID09ICcgJykgY21kKys7CiNlbmRpZgogIHBzcC0+Y21kTGluZVswXT1zdHJsZW4oY21kKTsKICBzdHJjcHkocHNwLT5jbWRMaW5lKzEsY21kKTsKICBwc3AtPmNtZExpbmVbcHNwLT5jbWRMaW5lWzBdKzFdPSdccic7CiB9IGVsc2UgcHNwLT5jbWRMaW5lWzFdPSdccic7CiAvKiBGSVhNRTogaW50ZWdyYXRlIHRoZSBtZW1vcnkgc3R1ZmYgZnJvbSBXaW5lIChtc2Rvcy9kb3NtZW0uYykgKi8KIC8qIEZJWE1FOiBpbnRlZ3JhdGUgdGhlIFBEQiBzdHVmZiBmcm9tIFdpbmUgKGxvYWRlci90YXNrLmMpICovCn0KCi8qIGRlZmF1bHQgSU5UIDA4IGhhbmRsZXI6IGluY3JlYXNlcyB0aW1lciB0aWNrIGNvdW50ZXIgYnV0IG5vdCBtdWNoIG1vcmUgKi8Kc3RhdGljIGNoYXIgaW50MDhbXT17CiAweENELDB4MUMsICAgICAgICAgICAvKiBpbnQgJDB4MWMgKi8KIDB4NTAsICAgICAgICAgICAgICAgIC8qIHB1c2h3ICVheCAqLwogMHgxRSwgICAgICAgICAgICAgICAgLyogcHVzaHcgJWRzICovCiAweEI4LDB4NDAsMHgwMCwgICAgICAvKiBtb3Z3ICQweDQwLCVheCAqLwogMHg4RSwweEQ4LCAgICAgICAgICAgLyogbW92dyAlYXgsJWRzICovCiNpZiAwCiAweDgzLDB4MDYsMHg2QywweDAwLDB4MDEsIC8qIGFkZHcgJDEsKDB4NmMpICovCiAweDgzLDB4MTYsMHg2RSwweDAwLDB4MDAsIC8qIGFkY3cgJDAsKDB4NmUpICovCiNlbHNlCiAweDY2LDB4RkYsMHgwNiwweDZDLDB4MDAsIC8qIGluY2wgKDB4NmMpICovCiNlbmRpZgogMHhCMCwweDIwLCAgICAgICAgICAgLyogbW92YiAkMHgyMCwlYWwgKi8KIDB4RTYsMHgyMCwgICAgICAgICAgIC8qIG91dGIgJWFsLCQweDIwICovCiAweDFGLCAgICAgICAgICAgICAgICAvKiBwb3B3ICVheCAqLwogMHg1OCwgICAgICAgICAgICAgICAgLyogcG9wdyAlYXggKi8KIDB4Q0YgICAgICAgICAgICAgICAgIC8qIGlyZXQgKi8KfTsKCnN0YXRpYyB2b2lkIE1aX0luaXRIYW5kbGVycyggTFBET1NUQVNLIGxwRG9zVGFzayApCnsKIFdPUkQgc2VnOwogTFBCWVRFIHN0YXJ0PURPU01FTV9HZXRCbG9jayhscERvc1Rhc2stPmhNb2R1bGUsc2l6ZW9mKGludDA4KSwmc2VnKTsKIG1lbWNweShzdGFydCxpbnQwOCxzaXplb2YoaW50MDgpKTsKLyogSU5UIDA4OiBwb2ludCBpdCBhdCBvdXIgdGljay1pbmNyZW1lbnRpbmcgaGFuZGxlciAqLwogKChTRUdQVFIqKShscERvc1Rhc2stPmltZykpWzB4MDhdPVBUUl9TRUdfT0ZGX1RPX1NFR1BUUihzZWcsMCk7Ci8qIElOVCAxQzoganVzdCBwb2ludCBpdCB0byBJUkVULCB3ZSBkb24ndCB3YW50IHRvIGhhbmRsZSBpdCBvdXJzZWx2ZXMgKi8KICgoU0VHUFRSKikobHBEb3NUYXNrLT5pbWcpKVsweDFDXT1QVFJfU0VHX09GRl9UT19TRUdQVFIoc2VnLHNpemVvZihpbnQwOCktMSk7Cn0KCnN0YXRpYyBjaGFyIGVudGVyX3htc1tdPXsKLyogWE1TIGhvb2thYmxlIGVudHJ5IHBvaW50ICovCiAweEVCLDB4MDMsICAgICAgICAgICAvKiBqbXAgZW50cnkgKi8KIDB4OTAsMHg5MCwweDkwLCAgICAgIC8qIG5vcDtub3A7bm9wICovCiAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeTogKi8KLyogcmVhbCBlbnRyeSBwb2ludCAqLwovKiBmb3Igc2ltcGxpY2l0eSwgd2UnbGwganVzdCB1c2UgdGhlIHNhbWUgaG9vayBhcyBEUE1JIGJlbG93ICovCiAweENELDB4MzEsICAgICAgICAgICAvKiBpbnQgJDB4MzEgKi8KIDB4Q0IgICAgICAgICAgICAgICAgIC8qIGxyZXQgKi8KfTsKCnN0YXRpYyB2b2lkIE1aX0luaXRYTVMoIExQRE9TVEFTSyBscERvc1Rhc2sgKQp7CiBMUEJZVEUgc3RhcnQ9RE9TTUVNX0dldEJsb2NrKGxwRG9zVGFzay0+aE1vZHVsZSxzaXplb2YoZW50ZXJfeG1zKSwmKGxwRG9zVGFzay0+eG1zX3NlZykpOwogbWVtY3B5KHN0YXJ0LGVudGVyX3htcyxzaXplb2YoZW50ZXJfeG1zKSk7Cn0KCnN0YXRpYyBjaGFyIGVudGVyX3BtW109ewogMHg1MCwgICAgICAgICAgICAgICAgLyogcHVzaHcgJWF4ICovCiAweDUyLCAgICAgICAgICAgICAgICAvKiBwdXNodyAlZHggKi8KIDB4NTUsICAgICAgICAgICAgICAgIC8qIHB1c2h3ICVicCAqLwogMHg4OSwweEU1LCAgICAgICAgICAgLyogbW92dyAlc3AsJWJwICovCi8qIGdldCByZXR1cm4gQ1MgKi8KIDB4OEIsMHg1NiwweDA4LCAgICAgIC8qIG1vdncgOCglYnApLCVkeCAqLwovKiBqdXN0IGNhbGwgaW50IDMxIGhlcmUgdG8gZ2V0IGludG8gcHJvdGVjdGVkIG1vZGUuLi4gKi8KLyogaXQnbGwgY2hlY2sgd2hldGhlciBpdCB3YXMgY2FsbGVkIGZyb20gZHBtaV9zZWcuLi4gKi8KIDB4Q0QsMHgzMSwgICAgICAgICAgIC8qIGludCAkMHgzMSAqLwovKiB3ZSBhcmUgbm93IGluIHRoZSBjb250ZXh0IG9mIGEgMTYtYml0IHJlbGF5IGNhbGwgKi8KLyogbmVlZCB0byBmaXh1cCBvdXIgc3RhY2s7CiAqIDE2LWJpdCByZWxheSByZXR1cm4gYWRkcmVzcyB3aWxsIGJlIGxvc3QsIGJ1dCB3ZSB3b24ndCB3b3JyeSBxdWl0ZSB5ZXQgKi8KIDB4OEUsMHhEMCwgICAgICAgICAgIC8qIG1vdncgJWF4LCVzcyAqLwogMHg2NiwweDBGLDB4QjcsMHhFNSwgLyogbW92endsICVicCwlZXNwICovCi8qIHNldCByZXR1cm4gQ1MgKi8KIDB4ODksMHg1NiwweDA4LCAgICAgIC8qIG1vdncgJWR4LDgoJWJwKSAqLwogMHg1RCwgICAgICAgICAgICAgICAgLyogcG9wdyAlYnAgKi8KIDB4NUEsICAgICAgICAgICAgICAgIC8qIHBvcHcgJWR4ICovCiAweDU4LCAgICAgICAgICAgICAgICAvKiBwb3B3ICVheCAqLwogMHhDQiAgICAgICAgICAgICAgICAgLyogbHJldCAqLwp9OwoKc3RhdGljIHZvaWQgTVpfSW5pdERQTUkoIExQRE9TVEFTSyBscERvc1Rhc2sgKQp7CiB1bnNpZ25lZCBzaXplPXNpemVvZihlbnRlcl9wbSk7CiBMUEJZVEUgc3RhcnQ9RE9TTUVNX0dldEJsb2NrKGxwRG9zVGFzay0+aE1vZHVsZSxzaXplLCYobHBEb3NUYXNrLT5kcG1pX3NlZykpOwogCiBscERvc1Rhc2stPmRwbWlfc2VsID0gU0VMRUNUT1JfQWxsb2NCbG9jayggc3RhcnQsIHNpemUsIFNFR01FTlRfQ09ERSwgRkFMU0UsIEZBTFNFICk7CgogbWVtY3B5KHN0YXJ0LGVudGVyX3BtLHNpemVvZihlbnRlcl9wbSkpOwp9CgpzdGF0aWMgV09SRCBNWl9Jbml0RW52aXJvbm1lbnQoIExQRE9TVEFTSyBscERvc1Rhc2ssIExQQ1NUUiBlbnYsIExQQ1NUUiBuYW1lICkKewogdW5zaWduZWQgc3o9MDsKIFdPUkQgc2VnOwogTFBTVFIgZW52YmxrOwoKIGlmIChlbnYpIHsKICAvKiBnZXQgc2l6ZSBvZiBlbnZpcm9ubWVudCBibG9jayAqLwogIHdoaWxlIChlbnZbc3orK10pIHN6Kz1zdHJsZW4oZW52K3N6KSsxOwogfSBlbHNlIHN6Kys7CiAvKiBhbGxvY2F0ZSBpdCAqLwogZW52YmxrPURPU01FTV9HZXRCbG9jayhscERvc1Rhc2stPmhNb2R1bGUsc3orc2l6ZW9mKFdPUkQpK3N0cmxlbihuYW1lKSsxLCZzZWcpOwogLyogZmlsbCBpdCAqLwogaWYgKGVudikgewogIG1lbWNweShlbnZibGssZW52LHN6KTsKIH0gZWxzZSBlbnZibGtbMF09MDsKIC8qIERPUyAzLng6IHRoZSBibG9jayBjb250YWlucyAxIGFkZGl0aW9uYWwgc3RyaW5nICovCiAqKFdPUkQqKShlbnZibGsrc3opPTE7CiAvKiBiZWluZyB0aGUgcHJvZ3JhbSBuYW1lIGl0c2VsZiAqLwogc3RyY3B5KGVudmJsaytzeitzaXplb2YoV09SRCksbmFtZSk7CiByZXR1cm4gc2VnOwp9CgpzdGF0aWMgQk9PTCBNWl9Jbml0TWVtb3J5KCBMUERPU1RBU0sgbHBEb3NUYXNrLCBORV9NT0RVTEUgKnBNb2R1bGUgKQp7CiBpbnQgeDsKCiBpZiAobHBEb3NUYXNrLT5pbWcpIHJldHVybiBUUlVFOyAvKiBhbHJlYWR5IGFsbG9jYXRlZCAqLwoKIC8qIGFsbG9jYXRlIDFNQis2NEsgc2hhcmVkIG1lbW9yeSAqLwogbHBEb3NUYXNrLT5pbWdfb2ZzPVNUQVJUX09GRlNFVDsKI2lmZGVmIE1aX01BUFNFTEYKIGxwRG9zVGFzay0+aW1nPVZpcnR1YWxBbGxvYyhOVUxMLDB4MTEwMDAwLE1FTV9DT01NSVQsUEFHRV9SRUFEV1JJVEUpOwogLyogbWFrZSBzdXJlIG1tYXAgYWNjZXB0cyBpdCAqLwogKChjaGFyKilscERvc1Rhc2stPmltZylbMHgxMEZGRkZdPTA7CiNlbHNlCiB0bXBuYW0obHBEb3NUYXNrLT5tbV9uYW1lKTsKLyogc3RyY3B5KGxwRG9zVGFzay0+bW1fbmFtZSwiL3RtcC9teWRvc2ltYWdlIik7ICovCiBscERvc1Rhc2stPm1tX2ZkPW9wZW4obHBEb3NUYXNrLT5tbV9uYW1lLE9fUkRXUnxPX0NSRUFUIC8qIHxPX1RSVU5DICovLFNfSVJVU1J8U19JV1VTUik7CiBpZiAobHBEb3NUYXNrLT5tbV9mZDwwKSBFUlIoImZpbGUgJXMgY291bGQgbm90IGJlIG9wZW5lZFxuIixscERvc1Rhc2stPm1tX25hbWUpOwogLyogZXhwYW5kIGZpbGUgdG8gMU1CKzY0SyAqLwogbHNlZWsobHBEb3NUYXNrLT5tbV9mZCwweDExMDAwMC0xLFNFRUtfU0VUKTsKIHg9MDsgd3JpdGUobHBEb3NUYXNrLT5tbV9mZCwmeCwxKTsKIC8qIG1hcCBpdCBpbiAqLwogbHBEb3NUYXNrLT5pbWc9bW1hcChOVUxMLDB4MTEwMDAwLVNUQVJUX09GRlNFVCxQUk9UX1JFQUR8UFJPVF9XUklURSxNQVBfU0hBUkVELGxwRG9zVGFzay0+bW1fZmQsMCk7CiNlbmRpZgogaWYgKGxwRG9zVGFzay0+aW1nPT0oTFBWT0lEKS0xKSB7CiAgRVJSKCJjb3VsZCBub3QgbWFwIHNoYXJlZCBtZW1vcnksIGVycm9yPSVzXG4iLHN0cmVycm9yKGVycm5vKSk7CiAgcmV0dXJuIEZBTFNFOwogfQogVFJBQ0UoIkRPUyBWTTg2IGltYWdlIG1hcHBlZCBhdCAlMDhseFxuIiwoRFdPUkQpbHBEb3NUYXNrLT5pbWcpOwogcE1vZHVsZS0+ZG9zX2ltYWdlPWxwRG9zVGFzay0+aW1nOwoKIC8qIGluaXRpYWxpemUgdGhlIG1lbW9yeSAqLwogVFJBQ0UoIkluaXRpYWxpemluZyBET1MgbWVtb3J5IHN0cnVjdHVyZXNcbiIpOwogRE9TTUVNX0luaXQobHBEb3NUYXNrLT5oTW9kdWxlKTsKIE1aX0luaXRIYW5kbGVycyhscERvc1Rhc2spOwogTVpfSW5pdFhNUyhscERvc1Rhc2spOwogTVpfSW5pdERQTUkobHBEb3NUYXNrKTsKIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBNWl9Mb2FkSW1hZ2UoIEhBTkRMRSBoRmlsZSwgTFBDU1RSIGZpbGVuYW1lLCBMUENTVFIgY21kbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZW52LCBMUERPU1RBU0sgbHBEb3NUYXNrLCBORV9NT0RVTEUgKnBNb2R1bGUgKQp7CiBJTUFHRV9ET1NfSEVBREVSIG16X2hlYWRlcjsKIERXT1JEIGltYWdlX3N0YXJ0LGltYWdlX3NpemUsbWluX3NpemUsbWF4X3NpemUsYXZhaWw7CiBCWVRFKnBzcF9zdGFydCwqbG9hZF9zdGFydDsKIGludCB4LG9sZF9jb209MDsKIFNFR1BUUiByZWxvYzsKIFdPUkQgZW52X3NlZzsKIERXT1JEIGxlbjsKCiBTZXRGaWxlUG9pbnRlcihoRmlsZSwwLE5VTEwsRklMRV9CRUdJTik7CiBpZiAoICAgIVJlYWRGaWxlKGhGaWxlLCZtel9oZWFkZXIsc2l6ZW9mKG16X2hlYWRlciksJmxlbixOVUxMKQogICAgIHx8IGxlbiAhPSBzaXplb2YobXpfaGVhZGVyKSAKICAgICB8fCBtel9oZWFkZXIuZV9tYWdpYyAhPSBJTUFHRV9ET1NfU0lHTkFUVVJFKSB7CiAgb2xkX2NvbT0xOyAvKiBhc3N1bWUgLkNPTSBmaWxlICovCiAgaW1hZ2Vfc3RhcnQ9MDsKICBpbWFnZV9zaXplPUdldEZpbGVTaXplKGhGaWxlLE5VTEwpOwogIG1pbl9zaXplPTB4MTAwMDA7IG1heF9zaXplPTB4MTAwMDAwOwogIG16X2hlYWRlci5lX2NybGM9MDsKICBtel9oZWFkZXIuZV9zcz0wOyBtel9oZWFkZXIuZV9zcD0weEZGRkU7CiAgbXpfaGVhZGVyLmVfY3M9MDsgbXpfaGVhZGVyLmVfaXA9MHgxMDA7CiB9IGVsc2UgewogIC8qIGNhbGN1bGF0ZSBsb2FkIHNpemUgKi8KICBpbWFnZV9zdGFydD1tel9oZWFkZXIuZV9jcGFyaGRyPDw0OwogIGltYWdlX3NpemU9bXpfaGVhZGVyLmVfY3A8PDk7IC8qIHBhZ2VzIGFyZSA1MTIgYnl0ZXMgKi8KICBpZiAoKG16X2hlYWRlci5lX2NibHAhPTApJiYobXpfaGVhZGVyLmVfY2JscCE9NCkpIGltYWdlX3NpemUtPTUxMi1tel9oZWFkZXIuZV9jYmxwOwogIGltYWdlX3NpemUtPWltYWdlX3N0YXJ0OwogIG1pbl9zaXplPWltYWdlX3NpemUrKChEV09SRCltel9oZWFkZXIuZV9taW5hbGxvYzw8NCkrKFBTUF9TSVpFPDw0KTsKICBtYXhfc2l6ZT1pbWFnZV9zaXplKygoRFdPUkQpbXpfaGVhZGVyLmVfbWF4YWxsb2M8PDQpKyhQU1BfU0laRTw8NCk7CiB9CgogTVpfSW5pdE1lbW9yeShscERvc1Rhc2sscE1vZHVsZSk7CgogLyogYWxsb2NhdGUgZW52aXJvbm1lbnQgYmxvY2sgKi8KIGVudl9zZWc9TVpfSW5pdEVudmlyb25tZW50KGxwRG9zVGFzayxlbnYsZmlsZW5hbWUpOwoKIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGV4ZWN1dGFibGUgKi8KIFRSQUNFKCJBbGxvY2F0aW5nIERPUyBtZW1vcnkgKG1pbj0lbGQsIG1heD0lbGQpXG4iLG1pbl9zaXplLG1heF9zaXplKTsKIGF2YWlsPURPU01FTV9BdmFpbGFibGUobHBEb3NUYXNrLT5oTW9kdWxlKTsKIGlmIChhdmFpbDxtaW5fc2l6ZSkgewogIEVSUigiaW5zdWZmaWNpZW50IERPUyBtZW1vcnlcbiIpOwogIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgcmV0dXJuIEZBTFNFOwogfQogaWYgKGF2YWlsPm1heF9zaXplKSBhdmFpbD1tYXhfc2l6ZTsKIHBzcF9zdGFydD1ET1NNRU1fR2V0QmxvY2sobHBEb3NUYXNrLT5oTW9kdWxlLGF2YWlsLCZscERvc1Rhc2stPnBzcF9zZWcpOwogaWYgKCFwc3Bfc3RhcnQpIHsKICBFUlIoImVycm9yIGFsbG9jYXRpbmcgRE9TIG1lbW9yeVxuIik7CiAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICByZXR1cm4gRkFMU0U7CiB9CiBscERvc1Rhc2stPmxvYWRfc2VnPWxwRG9zVGFzay0+cHNwX3NlZysob2xkX2NvbT8wOlBTUF9TSVpFKTsKIGxvYWRfc3RhcnQ9cHNwX3N0YXJ0KyhQU1BfU0laRTw8NCk7CiBNWl9Jbml0UFNQKHBzcF9zdGFydCwgY21kbGluZSwgZW52X3NlZyk7CgogLyogbG9hZCBleGVjdXRhYmxlIGltYWdlICovCiBUUkFDRSgibG9hZGluZyBET1MgJXMgaW1hZ2UsICUwOGx4IGJ5dGVzXG4iLG9sZF9jb20/IkNPTSI6IkVYRSIsaW1hZ2Vfc2l6ZSk7CiBTZXRGaWxlUG9pbnRlcihoRmlsZSxpbWFnZV9zdGFydCxOVUxMLEZJTEVfQkVHSU4pOwogaWYgKCFSZWFkRmlsZShoRmlsZSxsb2FkX3N0YXJ0LGltYWdlX3NpemUsJmxlbixOVUxMKSB8fCBsZW4gIT0gaW1hZ2Vfc2l6ZSkgewogIFNldExhc3RFcnJvcihFUlJPUl9CQURfRk9STUFUKTsKICByZXR1cm4gRkFMU0U7CiB9CgogaWYgKG16X2hlYWRlci5lX2NybGMpIHsKICAvKiBsb2FkIHJlbG9jYXRpb24gdGFibGUgKi8KICBUUkFDRSgibG9hZGluZyBET1MgRVhFIHJlbG9jYXRpb24gdGFibGUsICVkIGVudHJpZXNcbiIsbXpfaGVhZGVyLmVfY3JsYyk7CiAgLyogRklYTUU6IGlzIHRoaXMgdG9vIHNsb3cgd2l0aG91dCByZWFkIGJ1ZmZlcmluZz8gKi8KICBTZXRGaWxlUG9pbnRlcihoRmlsZSxtel9oZWFkZXIuZV9sZmFybGMsTlVMTCxGSUxFX0JFR0lOKTsKICBmb3IgKHg9MDsgeDxtel9oZWFkZXIuZV9jcmxjOyB4KyspIHsKICAgaWYgKCFSZWFkRmlsZShoRmlsZSwmcmVsb2Msc2l6ZW9mKHJlbG9jKSwmbGVuLE5VTEwpIHx8IGxlbiAhPSBzaXplb2YocmVsb2MpKSB7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfQkFEX0ZPUk1BVCk7CiAgICByZXR1cm4gRkFMU0U7CiAgIH0KICAgKihXT1JEKilTRUdQVFIxNihsb2FkX3N0YXJ0LHJlbG9jKSs9bHBEb3NUYXNrLT5sb2FkX3NlZzsKICB9CiB9CgogbHBEb3NUYXNrLT5pbml0X2NzPWxwRG9zVGFzay0+bG9hZF9zZWcrbXpfaGVhZGVyLmVfY3M7CiBscERvc1Rhc2stPmluaXRfaXA9bXpfaGVhZGVyLmVfaXA7CiBscERvc1Rhc2stPmluaXRfc3M9bHBEb3NUYXNrLT5sb2FkX3NlZyttel9oZWFkZXIuZV9zczsKIGxwRG9zVGFzay0+aW5pdF9zcD1tel9oZWFkZXIuZV9zcDsKCiBUUkFDRSgiZW50cnkgcG9pbnQ6ICUwNHg6JTA0eFxuIixscERvc1Rhc2stPmluaXRfY3MsbHBEb3NUYXNrLT5pbml0X2lwKTsKIHJldHVybiBUUlVFOwp9CgpMUERPU1RBU0sgTVpfQWxsb2NEUE1JVGFzayggSE1PRFVMRTE2IGhNb2R1bGUgKQp7CiBMUERPU1RBU0sgbHBEb3NUYXNrID0gY2FsbG9jKDEsIHNpemVvZihET1NUQVNLKSk7CiBORV9NT0RVTEUgKnBNb2R1bGU7CgogaWYgKGxwRG9zVGFzaykgewogIGxwRG9zVGFzay0+aE1vZHVsZSA9IGhNb2R1bGU7CgogIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jazE2KGhNb2R1bGUpOwogIHBNb2R1bGUtPmxwRG9zVGFzayA9IGxwRG9zVGFzazsKIAogIGxwRG9zVGFzay0+aW1nPU5VTEw7IGxwRG9zVGFzay0+bW1fbmFtZVswXT0wOyBscERvc1Rhc2stPm1tX2ZkPS0xOwoKICBNWl9Jbml0TWVtb3J5KGxwRG9zVGFzaywgcE1vZHVsZSk7CgogIEdsb2JhbFVubG9jazE2KGhNb2R1bGUpOwogfQogcmV0dXJuIGxwRG9zVGFzazsKfQoKc3RhdGljIHZvaWQgTVpfSW5pdFRpbWVyKCBMUERPU1RBU0sgbHBEb3NUYXNrLCBpbnQgdmVyICkKewogaWYgKHZlcjwxKSB7CiAgLyogY2FuJ3QgbWFrZSB0aW1lciB0aWNrcyAqLwogfSBlbHNlIHsKICBpbnQgZnVuYzsKICBzdHJ1Y3QgdGltZXZhbCB0aW07CgogIC8qIHN0YXJ0IGRvc21vZCB0aW1lciBhdCA1NW1zICgxOC4ySHopICovCiAgZnVuYz1ET1NNT0RfU0VUX1RJTUVSOwogIHRpbS50dl9zZWM9MDsgdGltLnR2X3VzZWM9NTQ5MjU7CiAgd3JpdGUobHBEb3NUYXNrLT53cml0ZV9waXBlLCZmdW5jLHNpemVvZihmdW5jKSk7CiAgd3JpdGUobHBEb3NUYXNrLT53cml0ZV9waXBlLCZ0aW0sc2l6ZW9mKHRpbSkpOwogfQp9CgpCT09MIE1aX0luaXRUYXNrKCBMUERPU1RBU0sgbHBEb3NUYXNrICkKewogIGludCB3cml0ZV9mZFsyXSx4X2ZkOwogIHBpZF90IGNoaWxkOwogIGNoYXIgKmZuYW1lLCpmYXJnLGFyZ1sxNl0sZnByb2NbNjRdLHBhdGhbMjU2XSwqZnBhdGg7CiAgU0VDVVJJVFlfQVRUUklCVVRFUyBhdHRyPXtzaXplb2YoYXR0ciksTlVMTCxUUlVFfTsKICBzdHJ1Y3QgZ2V0X3JlYWRfZmRfcmVxdWVzdCAqcl9yZXEgPSBnZXRfcmVxX2J1ZmZlcigpOwogIHN0cnVjdCBnZXRfd3JpdGVfZmRfcmVxdWVzdCAqd19yZXEgPSBnZXRfcmVxX2J1ZmZlcigpOwoKICBpZiAoIWxwRG9zVGFzaykgcmV0dXJuIEZBTFNFOwogIC8qIGNyZWF0ZSBwaXBlcyAqLwogIC8qIHRoaXMgaGFwcGVucyBpbiB0aGUgd3JvbmcgcHJvY2VzcyBjb250ZXh0LCBzbyB3ZSBoYXZlIHRvIGxldCB0aGUgbmV3IHByb2Nlc3MKICAgICBpbmhlcml0IGl0Li4uIChGSVhNRTogY2FsbCBNWl9Jbml0VGFzayBpbiB0aGUgcmlnaHQgcHJvY2VzcyBjb250ZXh0KSAqLwogIGlmICghQ3JlYXRlUGlwZSgmKGxwRG9zVGFzay0+aFJlYWRQaXBlKSwmKGxwRG9zVGFzay0+aFhQaXBlKSwmYXR0ciwwKSkgcmV0dXJuIEZBTFNFOwogIGlmIChwaXBlKHdyaXRlX2ZkKTwwKSB7CiAgICBDbG9zZUhhbmRsZShscERvc1Rhc2stPmhSZWFkUGlwZSk7CiAgICBDbG9zZUhhbmRsZShscERvc1Rhc2stPmhYUGlwZSk7CiAgICByZXR1cm4gRkFMU0U7CiAgfQogIHJfcmVxLT5oYW5kbGUgPSBscERvc1Rhc2stPmhSZWFkUGlwZTsKICBzZXJ2ZXJfY2FsbF9mZCggUkVRX0dFVF9SRUFEX0ZELCAtMSwgJmxwRG9zVGFzay0+cmVhZF9waXBlICk7CiAgd19yZXEtPmhhbmRsZSA9IGxwRG9zVGFzay0+aFhQaXBlOwogIHNlcnZlcl9jYWxsX2ZkKCBSRVFfR0VUX1dSSVRFX0ZELCAtMSwgJnhfZmQgKTsKCiAgVFJBQ0UoIndpbjMyIHBpcGU6IHJlYWQ9JWQsIHdyaXRlPSVkLCB1bml4IHBpcGU6IHJlYWQ9JWQsIHdyaXRlPSVkXG4iLAoJICAgICAgIGxwRG9zVGFzay0+aFJlYWRQaXBlLGxwRG9zVGFzay0+aFhQaXBlLGxwRG9zVGFzay0+cmVhZF9waXBlLHhfZmQpOwogIFRSQUNFKCJvdXRib3VuZCB1bml4IHBpcGU6IHJlYWQ9JWQsIHdyaXRlPSVkLCBwaWQ9JWRcbiIsd3JpdGVfZmRbMF0sd3JpdGVfZmRbMV0sZ2V0cGlkKCkpOwoKICBscERvc1Rhc2stPndyaXRlX3BpcGU9d3JpdGVfZmRbMV07CgogIGxwRG9zVGFzay0+aENvbklucHV0PUdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKICBscERvc1Rhc2stPmhDb25PdXRwdXQ9R2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKCiAgLyogaWYgd2UgaGF2ZSBhIG1hcHBpbmcgZmlsZSwgdXNlIGl0ICovCiAgZm5hbWU9bHBEb3NUYXNrLT5tbV9uYW1lOyBmYXJnPU5VTEw7CiAgaWYgKCFmbmFtZVswXSkgewogICAgLyogb3RoZXJ3aXNlLCBtYXAgb3VyIG93biBtZW1vcnkgaW1hZ2UgKi8KICAgIHNwcmludGYoZnByb2MsIi9wcm9jLyVkL21lbSIsZ2V0cGlkKCkpOwogICAgc3ByaW50ZihhcmcsIiVsZCIsKHVuc2lnbmVkIGxvbmcpbHBEb3NUYXNrLT5pbWcpOwogICAgZm5hbWU9ZnByb2M7IGZhcmc9YXJnOwogIH0KCiAgVFJBQ0UoIkxvYWRpbmcgRE9TIFZNIHN1cHBvcnQgbW9kdWxlIChobW9kdWxlPSUwNHgpXG4iLGxwRG9zVGFzay0+aE1vZHVsZSk7CiAgaWYgKChjaGlsZD1mb3JrKCkpPDApIHsKICAgIGNsb3NlKHdyaXRlX2ZkWzBdKTsKICAgIGNsb3NlKGxwRG9zVGFzay0+cmVhZF9waXBlKTsKICAgIGNsb3NlKGxwRG9zVGFzay0+d3JpdGVfcGlwZSk7CiAgICBjbG9zZSh4X2ZkKTsKICAgIENsb3NlSGFuZGxlKGxwRG9zVGFzay0+aFJlYWRQaXBlKTsKICAgIENsb3NlSGFuZGxlKGxwRG9zVGFzay0+aFhQaXBlKTsKICAgIHJldHVybiBGQUxTRTsKICB9CiBpZiAoY2hpbGQhPTApIHsKICAvKiBwYXJlbnQgcHJvY2VzcyAqLwogIGludCByZXQ7CgogIGNsb3NlKHdyaXRlX2ZkWzBdKTsKICBjbG9zZSh4X2ZkKTsKICBscERvc1Rhc2stPnRhc2s9Y2hpbGQ7CiAgLyogd2FpdCBmb3IgY2hpbGQgcHJvY2VzcyB0byBzaWduYWwgcmVhZGluZXNzICovCiAgd2hpbGUgKDEpIHsKICAgIGlmIChyZWFkKGxwRG9zVGFzay0+cmVhZF9waXBlLCZyZXQsc2l6ZW9mKHJldCkpPT1zaXplb2YocmV0KSkgYnJlYWs7CiAgICBpZiAoKGVycm5vPT1FSU5UUil8fChlcnJubz09RUFHQUlOKSkgY29udGludWU7CiAgICAvKiBmYWlsdXJlICovCiAgICBFUlIoImRvc21vZCBoYXMgZmFpbGVkIHRvIGluaXRpYWxpemVcbiIpOwogICAgaWYgKGxwRG9zVGFzay0+bW1fbmFtZVswXSE9MCkgdW5saW5rKGxwRG9zVGFzay0+bW1fbmFtZSk7CiAgICByZXR1cm4gRkFMU0U7CiAgfQogIC8qIHRoZSBjaGlsZCBoYXMgbm93IG1tYXBlZCB0aGUgdGVtcCBmaWxlLCBpdCdzIG5vdyBzYWZlIHRvIHVubGluay4KICAgKiBkbyBpdCBoZXJlIHRvIGF2b2lkIGxlYXZpbmcgYSBtZXNzIGluIC90bXAgaWYvd2hlbiBXaW5lIGNyYXNoZXMuLi4gKi8KICBpZiAobHBEb3NUYXNrLT5tbV9uYW1lWzBdIT0wKSB1bmxpbmsobHBEb3NUYXNrLT5tbV9uYW1lKTsKICAvKiBzdGFydCBzaW11bGF0ZWQgc3lzdGVtIHRpbWVyICovCiAgTVpfSW5pdFRpbWVyKGxwRG9zVGFzayxyZXQpOwogIGlmIChyZXQ8MikgewogICAgRVJSKCJkb3Ntb2QgdmVyc2lvbiB0b28gb2xkISBQbGVhc2UgaW5zdGFsbCBuZXdlciBkb3Ntb2QgcHJvcGVybHlcbiIpOwogICAgRVJSKCJJZiB5b3UgZG9uJ3QsIHRoZSBuZXcgZG9zbW9kIGV2ZW50IGhhbmRsaW5nIHN5c3RlbSB3aWxsIG5vdCB3b3JrXG4iKTsKICB9CiAgLyogYWxsIHN5c3RlbXMgYXJlIG5vdyBnbyAqLwogfSBlbHNlIHsKICAvKiBjaGlsZCBwcm9jZXNzICovCiAgY2xvc2UobHBEb3NUYXNrLT5yZWFkX3BpcGUpOwogIGNsb3NlKGxwRG9zVGFzay0+d3JpdGVfcGlwZSk7CiAgLyogcHV0IG91ciBwaXBlcyBzb21ld2hlcmUgZG9zbW9kIGNhbiBmaW5kIHRoZW0gKi8KICBkdXAyKHdyaXRlX2ZkWzBdLDApOyAvKiBzdGRpbiAqLwogIGR1cDIoeF9mZCwxKTsgICAgICAgIC8qIHN0ZG91dCAqLwogIC8qIG5vdyBsb2FkIGRvc21vZCAqLwogIC8qIGNoZWNrIGFyZ3ZbMF0tZGVyaXZlZCBwYXRocyBmaXJzdCwgc2luY2UgdGhlIG5ld2VzdCBkb3Ntb2QgaXMgbW9zdCBsaWtlbHkgdGhlcmUKICAgKiAoYXQgbGVhc3QgaXQgd2FzIG9uY2UgZm9yIEFuZHJlYXMgTW9ociwgc28gSSBkZWNpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIGZvciBoaW0pICovCiAgZnBhdGg9c3RycmNocihzdHJjcHkocGF0aCxhcmd2MCksJy8nKTsKICBpZiAoZnBhdGgpIHsKICAgc3RyY3B5KGZwYXRoLCIvZG9zbW9kIik7CiAgIGV4ZWNsKHBhdGgsZm5hbWUsZmFyZyxOVUxMKTsKICAgc3RyY3B5KGZwYXRoLCIvbG9hZGVyL2Rvcy9kb3Ntb2QiKTsKICAgZXhlY2wocGF0aCxmbmFtZSxmYXJnLE5VTEwpOwogIH0KICAvKiBva2F5LCBpdCB3YXNuJ3QgdGhlcmUsIHRyeSBpbiB0aGUgcGF0aCAqLwogIGV4ZWNscCgiZG9zbW9kIixmbmFtZSxmYXJnLE5VTEwpOwogIC8qIGxhc3QgZGVzcGVyYXRlIGF0dGVtcHRzOiBjdXJyZW50IGRpcmVjdG9yeSAqLwogIGV4ZWNsKCJkb3Ntb2QiLGZuYW1lLGZhcmcsTlVMTCk7CiAgLyogYW5kLCBqdXN0IGZvciBjb21wbGV0ZW5lc3MuLi4gKi8KICBleGVjbCgibG9hZGVyL2Rvcy9kb3Ntb2QiLGZuYW1lLGZhcmcsTlVMTCk7CiAgLyogaWYgZmFpbHVyZSwgZXhpdCAqLwogIEVSUigiRmFpbGVkIHRvIHNwYXduIGRvc21vZCwgZXJyb3I9JXNcbiIsc3RyZXJyb3IoZXJybm8pKTsKICBleGl0KDEpOwogfQogcmV0dXJuIFRSVUU7Cn0KCkJPT0wgTVpfQ3JlYXRlUHJvY2VzcyggSEFORExFIGhGaWxlLCBMUENTVFIgZmlsZW5hbWUsIExQQ1NUUiBjbWRsaW5lLCBMUENTVFIgZW52LCAKICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcHNhLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgdHNhLAogICAgICAgICAgICAgICAgICAgICAgIEJPT0wgaW5oZXJpdCwgRFdPUkQgZmxhZ3MsIExQU1RBUlRVUElORk9BIHN0YXJ0dXAsIAogICAgICAgICAgICAgICAgICAgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBpbmZvICkKewogTFBET1NUQVNLIGxwRG9zVGFzayA9IE5VTEw7IC8qIGtlZXAgZ2NjIGZyb20gY29tcGxhaW5pbmcgKi8KIEhNT0RVTEUxNiBoTW9kdWxlOwogUERCICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKIFREQiAqcFRhc2sgPSAoVERCKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKIE5FX01PRFVMRSAqcE1vZHVsZSA9IHBUYXNrID8gTkVfR2V0UHRyKCBwVGFzay0+aE1vZHVsZSApIDogTlVMTDsKIGludCBhbGxvYyA9ICEocE1vZHVsZSAmJiBwTW9kdWxlLT5kb3NfaW1hZ2UpOwoKIGlmIChhbGxvYyAmJiAobHBEb3NUYXNrID0gY2FsbG9jKDEsIHNpemVvZihET1NUQVNLKSkpID09IE5VTEwpIHsKICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogIHJldHVybiBGQUxTRTsKIH0KCiBpZiAoKCFlbnYpJiZwZGIpIGVudiA9IHBkYi0+ZW52X2RiLT5lbnZpcm9uOwogaWYgKGFsbG9jKSB7CiAgaWYgKChoTW9kdWxlID0gTU9EVUxFX0NyZWF0ZUR1bW15TW9kdWxlKGZpbGVuYW1lLCAwKSkgPCAzMikgewogICBTZXRMYXN0RXJyb3IoaE1vZHVsZSk7CiAgIHJldHVybiBGQUxTRTsKICB9CiAgbHBEb3NUYXNrLT5oTW9kdWxlID0gaE1vZHVsZTsKCiAgcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrMTYoaE1vZHVsZSk7CiAgcE1vZHVsZS0+bHBEb3NUYXNrID0gbHBEb3NUYXNrOwogCiAgbHBEb3NUYXNrLT5pbWc9TlVMTDsgbHBEb3NUYXNrLT5tbV9uYW1lWzBdPTA7IGxwRG9zVGFzay0+bW1fZmQ9LTE7CiB9IGVsc2UgbHBEb3NUYXNrPXBNb2R1bGUtPmxwRG9zVGFzazsKIGlmICghTVpfTG9hZEltYWdlKCBoRmlsZSwgZmlsZW5hbWUsIGNtZGxpbmUsIGVudiwgbHBEb3NUYXNrLCBwTW9kdWxlICkpIHsKICBpZiAoYWxsb2MpIHsKICAgaWYgKGxwRG9zVGFzay0+bW1fbmFtZVswXSE9MCkgewogICAgaWYgKGxwRG9zVGFzay0+aW1nIT1OVUxMKSBtdW5tYXAobHBEb3NUYXNrLT5pbWcsMHgxMTAwMDAtU1RBUlRfT0ZGU0VUKTsKICAgIGlmIChscERvc1Rhc2stPm1tX2ZkPj0wKSBjbG9zZShscERvc1Rhc2stPm1tX2ZkKTsKICAgIHVubGluayhscERvc1Rhc2stPm1tX25hbWUpOwogICB9IGVsc2UKICAgIGlmIChscERvc1Rhc2stPmltZyE9TlVMTCkgVmlydHVhbEZyZWUobHBEb3NUYXNrLT5pbWcsMHgxMTAwMDAsTUVNX1JFTEVBU0UpOwogIH0KICByZXR1cm4gRkFMU0U7CiB9CiBpZiAoYWxsb2MpIHsKICBwTW9kdWxlLT5kb3NfaW1hZ2UgPSBscERvc1Rhc2stPmltZzsKICBpZiAoIU1aX0luaXRUYXNrKCBscERvc1Rhc2sgKSkgewogICBNWl9LaWxsTW9kdWxlKCBscERvc1Rhc2sgKTsKICAgLyogRklYTUU6IGNsZWFudXAgaE1vZHVsZSAqLwogICBTZXRMYXN0RXJyb3IoRVJST1JfR0VOX0ZBSUxVUkUpOwogICByZXR1cm4gRkFMU0U7CiAgfQogIGluaGVyaXQgPSBUUlVFOyAvKiBiYWQgaGFjayBmb3IgaW5oZXJpdGluZyB0aGUgQ3JlYXRlUGlwZS4uLiAqLwogIGlmICghUFJPQ0VTU19DcmVhdGUoIHBNb2R1bGUsIGhGaWxlLCBjbWRsaW5lLCBlbnYsIAogICAgICAgICAgICAgICAgICAgICAgIHBzYSwgdHNhLCBpbmhlcml0LCBmbGFncywgc3RhcnR1cCwgaW5mbyApKQogICByZXR1cm4gRkFMU0U7CiB9CiByZXR1cm4gVFJVRTsKfQoKdm9pZCBNWl9LaWxsTW9kdWxlKCBMUERPU1RBU0sgbHBEb3NUYXNrICkKewogIERPU0VWRU5UICpldmVudCwqcF9ldmVudDsKICBET1NTWVNURU0gKnN5cywqcF9zeXM7CgogIFRSQUNFKCJraWxsaW5nIERPUyB0YXNrXG4iKTsKICBWR0FfQ2xlYW4oKTsKICBpZiAobHBEb3NUYXNrLT5tbV9uYW1lWzBdIT0wKSB7CiAgICBtdW5tYXAobHBEb3NUYXNrLT5pbWcsMHgxMTAwMDAtU1RBUlRfT0ZGU0VUKTsKICAgIGNsb3NlKGxwRG9zVGFzay0+bW1fZmQpOwogIH0gZWxzZSBWaXJ0dWFsRnJlZShscERvc1Rhc2stPmltZywweDExMDAwMCxNRU1fUkVMRUFTRSk7CiAgY2xvc2UobHBEb3NUYXNrLT5yZWFkX3BpcGUpOwogIGNsb3NlKGxwRG9zVGFzay0+d3JpdGVfcGlwZSk7CiAgQ2xvc2VIYW5kbGUobHBEb3NUYXNrLT5oUmVhZFBpcGUpOwogIENsb3NlSGFuZGxlKGxwRG9zVGFzay0+aFhQaXBlKTsKICBraWxsKGxwRG9zVGFzay0+dGFzayxTSUdURVJNKTsKLyogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBldmVudHMgYW5kIHN5c3RlbXMgKi8KI2RlZmluZSBERlJFRSh2YXIscHZhcixzdmFyKSBcCiAgdmFyID0gbHBEb3NUYXNrLT5zdmFyOyBcCiAgd2hpbGUgKHZhcikgeyBcCiAgICBpZiAodmFyLT5kYXRhKSBmcmVlKHZhci0+ZGF0YSk7IFwKICAgIHB2YXIgPSB2YXItPm5leHQ7IGZyZWUodmFyKTsgdmFyID0gcHZhcjsgXAogIH0KCiAgREZSRUUoZXZlbnQscF9ldmVudCxwZW5kaW5nKQogIERGUkVFKGV2ZW50LHBfZXZlbnQsY3VycmVudCkKICBERlJFRShzeXMscF9zeXMsc3lzKQoKI3VuZGVmIERGUkVFCgojaWYgMAogIC8qIEZJWE1FOiB0aGlzIHNlZW1zIHRvIGNyYXNoICovCiAgaWYgKGxwRG9zVGFzay0+ZHBtaV9zZWwpCiAgICBTRUxFQ1RPUl9GcmVlQmxvY2sobHBEb3NUYXNrLT5kcG1pX3NlbCwgMSk7CiNlbmRpZgp9CgpMUERPU1RBU0sgTVpfQ3VycmVudCggdm9pZCApCnsKICBUREIgKnBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggR2V0Q3VycmVudFRhc2soKSApOwogIE5FX01PRFVMRSAqcE1vZHVsZSA9IHBUYXNrID8gTkVfR2V0UHRyKCBwVGFzay0+aE1vZHVsZSApIDogTlVMTDsKCiAgR2xvYmFsVW5sb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKCiAgaWYgKHBNb2R1bGUpCiAgICByZXR1cm4gcE1vZHVsZS0+bHBEb3NUYXNrOwoKICByZXR1cm4gTlVMTDsKfQoKI2Vsc2UgLyogIU1aX1NVUFBPUlRFRCAqLwoKQk9PTCBNWl9DcmVhdGVQcm9jZXNzKCBIQU5ETEUgaEZpbGUsIExQQ1NUUiBmaWxlbmFtZSwgTFBDU1RSIGNtZGxpbmUsIExQQ1NUUiBlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIHBzYSwgTFBTRUNVUklUWV9BVFRSSUJVVEVTIHRzYSwKICAgICAgICAgICAgICAgICAgICAgICBCT09MIGluaGVyaXQsIERXT1JEIGZsYWdzLCBMUFNUQVJUVVBJTkZPQSBzdGFydHVwLAogICAgICAgICAgICAgICAgICAgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBpbmZvICkKewogV0FSTigiRE9TIGV4ZWN1dGFibGVzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmVcbiIpOwogU2V0TGFzdEVycm9yKEVSUk9SX0JBRF9GT1JNQVQpOwogcmV0dXJuIEZBTFNFOwp9CgpMUERPU1RBU0sgTVpfQ3VycmVudCggdm9pZCApCnsKICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmCg==