LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICoKICogVGhpcyBjb2RlIGhhc24ndCBiZWVuIGNvbXBsZXRlbHkgY2xlYW5lZCB1cCB5ZXQuCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KCiNpbmNsdWRlICJ3aW5lL3dpbmJhc2UxNi5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5udC5oIgojaW5jbHVkZSAid2luY29uLmgiCgojaW5jbHVkZSAiY2FsbGJhY2suaCIKI2luY2x1ZGUgIm1zZG9zLmgiCiNpbmNsdWRlICJmaWxlLmgiCiNpbmNsdWRlICJtaXNjZW11LmgiCiNpbmNsdWRlICJkb3NleGUuaCIKI2luY2x1ZGUgImRvc21vZC5oIgojaW5jbHVkZSAic3RhY2tmcmFtZS5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKREVDTEFSRV9ERUJVR19DSEFOTkVMKGludCk7CkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChtb2R1bGUpOwpERUNMQVJFX0RFQlVHX0NIQU5ORUwocmVsYXkpOwoKI2lmZGVmIE1aX1NVUFBPUlRFRAoKI2lmZGVmIEhBVkVfU1lTX1ZNODZfSAojIGluY2x1ZGUgPHN5cy92bTg2Lmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfTU1BTl9ICiMgaW5jbHVkZSA8c3lzL21tYW4uaD4KI2VuZGlmCgojZGVmaW5lIElGX0NMUihjdHgpICAgICAoKGN0eCktPkVGbGFncyAmPSB+VklGX01BU0spCiNkZWZpbmUgSUZfU0VUKGN0eCkgICAgICgoY3R4KS0+RUZsYWdzIHw9IFZJRl9NQVNLKQojZGVmaW5lIElGX0VOQUJMRUQoY3R4KSAoKGN0eCktPkVGbGFncyAmIFZJRl9NQVNLKQojZGVmaW5lIFNFVF9QRU5EKGN0eCkgICAoKGN0eCktPkVGbGFncyB8PSBWSVBfTUFTSykKI2RlZmluZSBDTFJfUEVORChjdHgpICAgKChjdHgpLT5FRmxhZ3MgJj0gflZJUF9NQVNLKQojZGVmaW5lIElTX1BFTkQoY3R4KSAgICAoKGN0eCktPkVGbGFncyAmIFZJUF9NQVNLKQoKI3VuZGVmIFRSWV9QSUNSRVRVUk4KCnR5cGVkZWYgc3RydWN0IF9ET1NFVkVOVCB7CiAgaW50IGlycSxwcmlvcml0eTsKICB2b2lkICgqcmVsYXkpKENPTlRFWFQ4Niosdm9pZCopOwogIHZvaWQgKmRhdGE7CiAgc3RydWN0IF9ET1NFVkVOVCAqbmV4dDsKfSBET1NFVkVOVCwgKkxQRE9TRVZFTlQ7CgpzdGF0aWMgc3RydWN0IF9ET1NFVkVOVCAqcGVuZGluZ19ldmVudCwgKmN1cnJlbnRfZXZlbnQ7CnN0YXRpYyBpbnQgc2lnX3NlbnQsIGVudGVyZWQ7CgovKiBmcm9tIG1vZHVsZS5jICovCmV4dGVybiBpbnQgcmVhZF9waXBlLCB3cml0ZV9waXBlOwpleHRlcm4gSEFORExFIGhSZWFkUGlwZTsKZXh0ZXJuIHBpZF90IGRvc21vZF9waWQ7CgpzdGF0aWMgdm9pZCBkb19leGNlcHRpb24oIGludCBzaWduYWwsIENPTlRFWFQ4NiAqY29udGV4dCApCnsKICAgIEVYQ0VQVElPTl9SRUNPUkQgcmVjOwogICAgaWYgKChzaWduYWwgPT0gU0lHVFJBUCkgfHwgKHNpZ25hbCA9PSBTSUdIVVApKQogICAgewogICAgICAgIHJlYy5FeGNlcHRpb25Db2RlICA9IEVYQ0VQVElPTl9CUkVBS1BPSU5UOwogICAgICAgIHJlYy5FeGNlcHRpb25GbGFncyA9IEVYQ0VQVElPTl9DT05USU5VQUJMRTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZWMuRXhjZXB0aW9uQ29kZSAgPSBFWENFUFRJT05fSUxMRUdBTF9JTlNUUlVDVElPTjsgIC8qIGdlbmVyaWMgZXJyb3IgKi8KICAgICAgICByZWMuRXhjZXB0aW9uRmxhZ3MgPSBFSF9OT05DT05USU5VQUJMRTsKICAgIH0KICAgIHJlYy5FeGNlcHRpb25SZWNvcmQgID0gTlVMTDsKICAgIHJlYy5FeGNlcHRpb25BZGRyZXNzID0gKExQVk9JRCljb250ZXh0LT5FaXA7CiAgICByZWMuTnVtYmVyUGFyYW1ldGVycyA9IDA7CiAgICBFWENfUnRsUmFpc2VFeGNlcHRpb24oICZyZWMsIGNvbnRleHQgKTsKfQoKc3RhdGljIHZvaWQgRE9TVk1fRHVtcCggaW50IGZuLCBpbnQgc2lnLCBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0KlZNODYgKQp7CiBCWVRFKmluc3Q7CiBpbnQgeDsKCiBzd2l0Y2ggKFZNODZfVFlQRShmbikpIHsKICBjYXNlIFZNODZfU0lHTkFMOgogICBwcmludGYoIlRyYXBwZWQgc2lnbmFsICVkXG4iLHNpZyk7IGJyZWFrOwogIGNhc2UgVk04Nl9VTktOT1dOOgogICBwcmludGYoIlRyYXBwZWQgdW5oYW5kbGVkIEdQRlxuIik7IGJyZWFrOwogIGNhc2UgVk04Nl9JTlR4OgogICBwcmludGYoIlRyYXBwZWQgSU5UICUwMnhcbiIsVk04Nl9BUkcoZm4pKTsgYnJlYWs7CiAgY2FzZSBWTTg2X1NUSToKICAgcHJpbnRmKCJUcmFwcGVkIFNUSVxuIik7IGJyZWFrOwogIGNhc2UgVk04Nl9QSUNSRVRVUk46CiAgIHByaW50ZigiVHJhcHBlZCBkdWUgdG8gcGVuZGluZyBQSUMgcmVxdWVzdFxuIik7IGJyZWFrOwogIGNhc2UgVk04Nl9UUkFQOgogICBwcmludGYoIlRyYXBwZWQgZGVidWcgcmVxdWVzdFxuIik7IGJyZWFrOwogIGRlZmF1bHQ6CiAgIHByaW50ZigiVHJhcHBlZCB1bmtub3duIFZNODYgdHlwZSAlZCBhcmcgJWRcbiIsVk04Nl9UWVBFKGZuKSxWTTg2X0FSRyhmbikpOyBicmVhazsKIH0KI2RlZmluZSBSRUdTIFZNODYtPnJlZ3MKIGZwcmludGYoc3RkZXJyLCJBWD0lMDRsWCBDWD0lMDRsWCBEWD0lMDRsWCBCWD0lMDRsWFxuIixSRUdTLmVheCxSRUdTLmVjeCxSRUdTLmVkeCxSRUdTLmVieCk7CiBmcHJpbnRmKHN0ZGVyciwiU0k9JTA0bFggREk9JTA0bFggU1A9JTA0bFggQlA9JTA0bFhcbiIsUkVHUy5lc2ksUkVHUy5lZGksUkVHUy5lc3AsUkVHUy5lYnApOwogZnByaW50ZihzdGRlcnIsIkNTPSUwNFggRFM9JTA0WCBFUz0lMDRYIFNTPSUwNFhcbiIsUkVHUy5jcyxSRUdTLmRzLFJFR1MuZXMsUkVHUy5zcyk7CiBmcHJpbnRmKHN0ZGVyciwiSVA9JTA0bFggRUZMQUdTPSUwOGxYXG4iLFJFR1MuZWlwLFJFR1MuZWZsYWdzKTsKCiBpbnN0ID0gUFRSX1JFQUxfVE9fTElOKCBSRUdTLmNzLCBSRUdTLmVpcCApOwojdW5kZWYgUkVHUwogcHJpbnRmKCJPcGNvZGVzOiIpOwogZm9yICh4PTA7IHg8ODsgeCsrKSBwcmludGYoIiAlMDJ4IixpbnN0W3hdKTsKIHByaW50ZigiXG4iKTsKfQoKc3RhdGljIGludCBET1NWTV9TaW11bGF0ZUludCggaW50IHZlY3QsIENPTlRFWFQ4NiAqY29udGV4dCwgQk9PTCBpbndpbmUgKQp7CiAgRkFSUFJPQzE2IGhhbmRsZXI9SU5UX0dldFJNSGFuZGxlcih2ZWN0KTsKCiAgLyogY2hlY2sgZm9yIG91ciByZWFsLW1vZGUgaG9va3MgKi8KICBpZiAodmVjdD09MHgzMSkgewogICAgaWYgKGNvbnRleHQtPlNlZ0NzPT1ET1NNRU1fd3JhcF9zZWcpIHsKICAgICAgLyogZXhpdCBmcm9tIHJlYWwtbW9kZSB3cmFwcGVyICovCiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIC8qIHdlIGNvdWxkIHByb2JhYmx5IG1vdmUgc29tZSBvdGhlciBkb2RneSBzdHVmZiBoZXJlIHRvbyBmcm9tIGRwbWkuYyAqLwogIH0KICAvKiBjaGVjayBpZiB0aGUgY2FsbCBpcyBmcm9tIG91ciBmYWtlIEJJT1MgaW50ZXJydXB0IHN0dWJzICovCiAgaWYgKChjb250ZXh0LT5TZWdDcz09MHhmMDAwKSAmJiAhaW53aW5lKSB7CiAgICBpZiAodmVjdCAhPSAoY29udGV4dC0+RWlwLzQpKSB7CiAgICAgIFRSQUNFXyhpbnQpKCJzb21ldGhpbmcgZmlzaHkgZ29pbmcgb24gaGVyZSAoaW50ZXJydXB0IHN0dWIgaXMgJTAybHgpXG4iLCBjb250ZXh0LT5FaXAvNCk7CiAgICB9CiAgICBUUkFDRV8oaW50KSgiYnVpbHRpbiBpbnRlcnJ1cHQgJTAyeCBoYXMgYmVlbiBicmFuY2hlZCB0b1xuIiwgdmVjdCk7CiAgICBJTlRfUmVhbE1vZGVJbnRlcnJ1cHQodmVjdCwgY29udGV4dCk7CiAgfQogIC8qIGNoZWNrIGlmIHRoZSBjYWxsIGdvZXMgdG8gYW4gdW5ob29rZWQgaW50ZXJydXB0ICovCiAgZWxzZSBpZiAoU0VMRUNUT1JPRihoYW5kbGVyKT09MHhmMDAwKSB7CiAgICAvKiBpZiBzbywgY2FsbCBpdCBkaXJlY3RseSAqLwogICAgVFJBQ0VfKGludCkoImJ1aWx0aW4gaW50ZXJydXB0ICUwMnggaGFzIGJlZW4gaW52b2tlZCAodGhyb3VnaCB2ZWN0b3IgJTAyeClcbiIsIE9GRlNFVE9GKGhhbmRsZXIpLzQsIHZlY3QpOwogICAgSU5UX1JlYWxNb2RlSW50ZXJydXB0KE9GRlNFVE9GKGhhbmRsZXIpLzQsIGNvbnRleHQpOwogIH0KICAvKiB0aGUgaW50ZXJydXB0IGlzIGhvb2tlZCwgc2ltdWxhdGUgaW50ZXJydXB0IGluIERPUyBzcGFjZSAqLwogIGVsc2UgewogICAgV09SRCpzdGFjaz0gUFRSX1JFQUxfVE9fTElOKCBjb250ZXh0LT5TZWdTcywgY29udGV4dC0+RXNwICk7CiAgICBXT1JEIGZsYWc9TE9XT1JEKGNvbnRleHQtPkVGbGFncyk7CgogICAgaWYgKElGX0VOQUJMRUQoY29udGV4dCkpIGZsYWd8PUlGX01BU0s7CiAgICBlbHNlIGZsYWcmPX5JRl9NQVNLOwoKICAgICooLS1zdGFjayk9ZmxhZzsKICAgICooLS1zdGFjayk9Y29udGV4dC0+U2VnQ3M7CiAgICAqKC0tc3RhY2spPUxPV09SRChjb250ZXh0LT5FaXApOwogICAgY29udGV4dC0+RXNwLT02OwogICAgY29udGV4dC0+U2VnQ3M9U0VMRUNUT1JPRihoYW5kbGVyKTsKICAgIGNvbnRleHQtPkVpcD1PRkZTRVRPRihoYW5kbGVyKTsKICAgIElGX0NMUihjb250ZXh0KTsKICB9CiAgcmV0dXJuIDA7Cn0KCiNkZWZpbmUgU0hPVUxEX1BFTkQoeCkgXAogICh4ICYmICgoIWN1cnJlbnRfZXZlbnQpIHx8ICh4LT5wcmlvcml0eSA8IGN1cnJlbnRfZXZlbnQtPnByaW9yaXR5KSkpCgpzdGF0aWMgdm9pZCBET1NWTV9TZW5kUXVldWVkRXZlbnQoQ09OVEVYVDg2ICpjb250ZXh0KQp7CiAgTFBET1NFVkVOVCBldmVudCA9IHBlbmRpbmdfZXZlbnQ7CgogIGlmIChTSE9VTERfUEVORChldmVudCkpIHsKICAgIC8qIHJlbW92ZSBmcm9tICJwZW5kaW5nIiBsaXN0ICovCiAgICBwZW5kaW5nX2V2ZW50ID0gZXZlbnQtPm5leHQ7CiAgICAvKiBwcm9jZXNzIGV2ZW50ICovCiAgICBpZiAoZXZlbnQtPmlycT49MCkgewogICAgICAvKiBpdCdzIGFuIElSUSwgbW92ZSBpdCB0byAiY3VycmVudCIgbGlzdCAqLwogICAgICBldmVudC0+bmV4dCA9IGN1cnJlbnRfZXZlbnQ7CiAgICAgIGN1cnJlbnRfZXZlbnQgPSBldmVudDsKICAgICAgVFJBQ0VfKGludCkoImRpc3BhdGNoaW5nIElSUSAlZFxuIixldmVudC0+aXJxKTsKICAgICAgLyogbm90ZSB0aGF0IGlmIERPU1ZNX1NpbXVsYXRlSW50IGNhbGxzIGFuIGludGVybmFsIGludGVycnVwdCBkaXJlY3RseSwKICAgICAgICogY3VycmVudF9ldmVudCBtaWdodCBiZSBjbGVhcmVkIChhbmQgZXZlbnQgZnJlZWQpIGluIHRoaXMgdmVyeSBjYWxsISAqLwogICAgICBET1NWTV9TaW11bGF0ZUludCgoZXZlbnQtPmlycTw4KT8oZXZlbnQtPmlycSs4KTooZXZlbnQtPmlycS04KzB4NzApLGNvbnRleHQsVFJVRSk7CiAgICB9IGVsc2UgewogICAgICAvKiBjYWxsYmFjayBldmVudCAqLwogICAgICBUUkFDRV8oaW50KSgiZGlzcGF0Y2hpbmcgY2FsbGJhY2sgZXZlbnRcbiIpOwogICAgICAoKmV2ZW50LT5yZWxheSkoY29udGV4dCxldmVudC0+ZGF0YSk7CiAgICAgIGZyZWUoZXZlbnQpOwogICAgfQogIH0KICBpZiAoIVNIT1VMRF9QRU5EKHBlbmRpbmdfZXZlbnQpKSB7CiAgICBUUkFDRV8oaW50KSgiY2xlYXJpbmcgUGVuZGluZyBmbGFnXG4iKTsKICAgIENMUl9QRU5EKGNvbnRleHQpOwogIH0KfQoKc3RhdGljIHZvaWQgRE9TVk1fU2VuZFF1ZXVlZEV2ZW50cyhDT05URVhUODYgKmNvbnRleHQpCnsKICAvKiB3ZSB3aWxsIHNlbmQgYWxsIHF1ZXVlZCBldmVudHMgYXMgbG9uZyBhcyBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLAogICAqIGJ1dCBJUlEgZXZlbnRzIHdpbGwgZGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluICovCiAgd2hpbGUgKElTX1BFTkQoY29udGV4dCkgJiYgSUZfRU5BQkxFRChjb250ZXh0KSkKICAgIERPU1ZNX1NlbmRRdWV1ZWRFdmVudChjb250ZXh0KTsKfQoKdm9pZCBET1NWTV9RdWV1ZUV2ZW50KCBpbnQgaXJxLCBpbnQgcHJpb3JpdHksIHZvaWQgKCpyZWxheSkoQ09OVEVYVDg2Kix2b2lkKiksIHZvaWQgKmRhdGEpCnsKICBMUERPU0VWRU5UIGV2ZW50LCBjdXIsIHByZXY7CgogIGlmIChlbnRlcmVkKSB7CiAgICBldmVudCA9IG1hbGxvYyhzaXplb2YoRE9TRVZFTlQpKTsKICAgIGlmICghZXZlbnQpIHsKICAgICAgRVJSXyhpbnQpKCJvdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgZXZlbnQgZW50cnlcbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBldmVudC0+aXJxID0gaXJxOyBldmVudC0+cHJpb3JpdHkgPSBwcmlvcml0eTsKICAgIGV2ZW50LT5yZWxheSA9IHJlbGF5OyBldmVudC0+ZGF0YSA9IGRhdGE7CgogICAgLyogaW5zZXJ0IGV2ZW50IGludG8gbGlua2VkIGxpc3QsIGluIG9yZGVyICphZnRlcioKICAgICAqIGFsbCBlYXJsaWVyIGV2ZW50cyBvZiBoaWdoZXIgb3IgZXF1YWwgcHJpb3JpdHkgKi8KICAgIGN1ciA9IHBlbmRpbmdfZXZlbnQ7IHByZXYgPSBOVUxMOwogICAgd2hpbGUgKGN1ciAmJiBjdXItPnByaW9yaXR5PD1wcmlvcml0eSkgewogICAgICBwcmV2ID0gY3VyOwogICAgICBjdXIgPSBjdXItPm5leHQ7CiAgICB9CiAgICBldmVudC0+bmV4dCA9IGN1cjsKICAgIGlmIChwcmV2KSBwcmV2LT5uZXh0ID0gZXZlbnQ7CiAgICBlbHNlIHBlbmRpbmdfZXZlbnQgPSBldmVudDsKICAgIAogICAgLyogZ2V0IGRvc21vZCdzIGF0dGVudGlvbiB0byB0aGUgbmV3IGV2ZW50LCBpZiBuZWNlc3NhcnkgKi8KICAgIGlmICghc2lnX3NlbnQpIHsKICAgICAgVFJBQ0VfKGludCkoIm5ldyBldmVudCBxdWV1ZWQsIHNpZ25hbGxpbmcgZG9zbW9kXG4iKTsKICAgICAga2lsbChkb3Ntb2RfcGlkLFNJR1VTUjIpOwogICAgICBzaWdfc2VudCsrOwogICAgfSBlbHNlIHsKICAgICAgVFJBQ0VfKGludCkoIm5ldyBldmVudCBxdWV1ZWRcbiIpOwogICAgfQogIH0gZWxzZSB7CiAgICAvKiBET1Mgc3Vic3lzdGVtIG5vdCBydW5uaW5nICovCiAgICAvKiAodGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHdlJ3JlIHJ1bm5pbmcgYSB3aW4xNiBhcHAKICAgICAqICB3aGljaCB1c2VzIERQTUkgdG8gdGh1bmsgZG93biB0byBET1Mgc2VydmljZXMpICovCiAgICBpZiAoaXJxPDApIHsKICAgICAgLyogY2FsbGJhY2sgZXZlbnQsIHBlcmZvcm0gaXQgd2l0aCBkdW1teSBjb250ZXh0ICovCiAgICAgIENPTlRFWFQ4NiBjb250ZXh0OwogICAgICBtZW1zZXQoJmNvbnRleHQsMCxzaXplb2YoY29udGV4dCkpOwogICAgICAoKnJlbGF5KSgmY29udGV4dCxkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIEVSUl8oaW50KSgiSVJRIHdpdGhvdXQgRE9TIHRhc2s6IHNob3VsZCBub3QgaGFwcGVuIik7CiAgICB9CiAgfQp9CgojZGVmaW5lIENWIGRvIHsgQ1AoZWF4LEVheCk7IENQKGVjeCxFY3gpOyBDUChlZHgsRWR4KTsgQ1AoZWJ4LEVieCk7IFwKICAgICAgICAgICBDUChlc2ksRXNpKTsgQ1AoZWRpLEVkaSk7IENQKGVzcCxFc3ApOyBDUChlYnAsRWJwKTsgXAogICAgICAgICAgIENQKGNzLFNlZ0NzKTsgQ1AoZHMsU2VnRHMpOyBDUChlcyxTZWdFcyk7IFwKICAgICAgICAgICBDUChzcyxTZWdTcyk7IENQKGZzLFNlZ0ZzKTsgQ1AoZ3MsU2VnR3MpOyBcCiAgICAgICAgICAgQ1AoZWlwLEVpcCk7IENQKGVmbGFncyxFRmxhZ3MpOyB9IHdoaWxlKDApCgpzdGF0aWMgaW50IERPU1ZNX1Byb2Nlc3MoIGludCBmbiwgaW50IHNpZywgc3RydWN0IHZtODZwbHVzX3N0cnVjdCpWTTg2ICkKewogQ09OVEVYVDg2IGNvbnRleHQ7CiBpbnQgcmV0PTA7CgojZGVmaW5lIENQKHgseSkgY29udGV4dC55ID0gVk04Ni0+cmVncy54CiAgQ1Y7CiN1bmRlZiBDUAogaWYgKFZNODZfVFlQRShmbik9PVZNODZfVU5LTk9XTikgewogIHJldD1JTlNUUl9FbXVsYXRlSW5zdHJ1Y3Rpb24oJmNvbnRleHQpOwojZGVmaW5lIENQKHgseSkgVk04Ni0+cmVncy54ID0gY29udGV4dC55CiAgQ1Y7CiN1bmRlZiBDUAogIGlmIChyZXQpIHJldHVybiAwOwogIHJldD0wOwogfQojaWZkZWYgVFJZX1BJQ1JFVFVSTgogaWYgKFZNODYtPnZtODZwbHVzLmZvcmNlX3JldHVybl9mb3JfcGljKSB7CiAgIFNFVF9QRU5EKCZjb250ZXh0KTsKIH0KI2Vsc2UKIC8qIGxpbnV4IGRvZXNuJ3QgcHJlc2VydmUgcGVuZGluZyBmbGFnIG9uIHJldHVybiAqLwogaWYgKFNIT1VMRF9QRU5EKHBlbmRpbmdfZXZlbnQpKSB7CiAgIFNFVF9QRU5EKCZjb250ZXh0KTsKIH0KI2VuZGlmCgogc3dpdGNoIChWTTg2X1RZUEUoZm4pKSB7CiAgY2FzZSBWTTg2X1NJR05BTDoKICAgVFJBQ0VfKGludCkoIkRPUyBtb2R1bGUgY2F1Z2h0IHNpZ25hbCAlZFxuIixzaWcpOwogICBpZiAoKHNpZz09U0lHQUxSTSkgfHwgKHNpZz09U0lHVVNSMikpIHsKICAgICBpZiAoc2lnPT1TSUdBTFJNKSB7CiAgICAgICBzaWdfc2VudCsrOwogICAgICAgRE9TVk1fUXVldWVFdmVudCgwLERPU19QUklPUklUWV9SRUFMVElNRSxOVUxMLE5VTEwpOwogICAgIH0KICAgICBpZiAocGVuZGluZ19ldmVudCkgewogICAgICAgVFJBQ0VfKGludCkoInNldHRpbmcgUGVuZGluZyBmbGFnLCBpbnRlcnJ1cHRzIGFyZSBjdXJyZW50bHkgJXNcbiIsCiAgICAgICAgICAgICAgICAgSUZfRU5BQkxFRCgmY29udGV4dCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKICAgICAgIFNFVF9QRU5EKCZjb250ZXh0KTsKICAgICAgIERPU1ZNX1NlbmRRdWV1ZWRFdmVudHMoJmNvbnRleHQpOwogICAgIH0gZWxzZSB7CiAgICAgICBUUkFDRV8oaW50KSgibm8gZXZlbnRzIGFyZSBwZW5kaW5nLCBjbGVhcmluZyBQZW5kaW5nIGZsYWdcbiIpOwogICAgICAgQ0xSX1BFTkQoJmNvbnRleHQpOwogICAgIH0KICAgICBzaWdfc2VudC0tOwogICB9CiAgIGVsc2UgaWYgKChzaWc9PVNJR0hVUCkgfHwgKHNpZz09U0lHSUxMKSB8fCAoc2lnPT1TSUdTRUdWKSkgewogICAgICAgZG9fZXhjZXB0aW9uKCBzaWcsICZjb250ZXh0ICk7CiAgIH0gZWxzZSB7CiAgICBET1NWTV9EdW1wKGZuLHNpZyxWTTg2KTsKICAgIHJldD0tMTsKICAgfQogICBicmVhazsKICBjYXNlIFZNODZfVU5LTk9XTjogLyogdW5oYW5kbGVkIEdQRiAqLwogICBET1NWTV9EdW1wKGZuLHNpZyxWTTg2KTsKICAgZG9fZXhjZXB0aW9uKCBTSUdTRUdWLCAmY29udGV4dCApOwogICBicmVhazsKICBjYXNlIFZNODZfSU5UeDoKICAgaWYgKFRSQUNFX09OKHJlbGF5KSkKICAgIERQUklOVEYoIkNhbGwgRE9TIGludCAweCUwMnggKEVBWD0lMDhseCkgcmV0PSUwNGx4OiUwNGx4XG4iLFZNODZfQVJHKGZuKSxjb250ZXh0LkVheCxjb250ZXh0LlNlZ0NzLGNvbnRleHQuRWlwKTsKICAgcmV0PURPU1ZNX1NpbXVsYXRlSW50KFZNODZfQVJHKGZuKSwmY29udGV4dCxGQUxTRSk7CiAgIGlmIChUUkFDRV9PTihyZWxheSkpCiAgICBEUFJJTlRGKCJSZXQgIERPUyBpbnQgMHglMDJ4IChFQVg9JTA4bHgpIHJldD0lMDRseDolMDRseFxuIixWTTg2X0FSRyhmbiksY29udGV4dC5FYXgsY29udGV4dC5TZWdDcyxjb250ZXh0LkVpcCk7CiAgIGJyZWFrOwogIGNhc2UgVk04Nl9TVEk6CiAgICBJRl9TRVQoJmNvbnRleHQpOwogIC8qIGNhc2UgVk04Nl9QSUNSRVRVUk46ICovCiAgICBUUkFDRV8oaW50KSgiRE9TIHRhc2sgZW5hYmxlZCBpbnRlcnJ1cHRzICVzIGV2ZW50cyBwZW5kaW5nLCBzZW5kaW5nIGV2ZW50c1xuIiwgSVNfUEVORCgmY29udGV4dCk/IndpdGgiOiJ3aXRob3V0Iik7CiAgICBET1NWTV9TZW5kUXVldWVkRXZlbnRzKCZjb250ZXh0KTsKICAgIGJyZWFrOwogIGNhc2UgVk04Nl9UUkFQOgogICBkb19leGNlcHRpb24oIFNJR1RSQVAsICZjb250ZXh0ICk7CiAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgIERPU1ZNX0R1bXAoZm4sc2lnLFZNODYpOwogICByZXQ9LTE7CiB9CgojZGVmaW5lIENQKHgseSkgVk04Ni0+cmVncy54ID0gY29udGV4dC55CiBDVjsKI3VuZGVmIENQCiNpZmRlZiBUUllfUElDUkVUVVJOCiBWTTg2LT52bTg2cGx1cy5mb3JjZV9yZXR1cm5fZm9yX3BpYyA9IElTX1BFTkQoJmNvbnRleHQpID8gMSA6IDA7CiBDTFJfUEVORCgmY29udGV4dCk7CiNlbmRpZgogcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgRE9TVk1fUHJvY2Vzc0NvbnNvbGUodm9pZCkKewogIElOUFVUX1JFQ09SRCBtc2c7CiAgRFdPUkQgcmVzOwogIEJZVEUgc2NhbjsKCiAgaWYgKFJlYWRDb25zb2xlSW5wdXRBKEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKSwmbXNnLDEsJnJlcykpIHsKICAgIHN3aXRjaCAobXNnLkV2ZW50VHlwZSkgewogICAgY2FzZSBLRVlfRVZFTlQ6CiAgICAgIHNjYW4gPSBtc2cuRXZlbnQuS2V5RXZlbnQud1ZpcnR1YWxTY2FuQ29kZTsKICAgICAgaWYgKCFtc2cuRXZlbnQuS2V5RXZlbnQuYktleURvd24pIHNjYW4gfD0gMHg4MDsKCiAgICAgIC8qIGNoZWNrIHdoZXRoZXIgZXh0ZW5kZWQgYml0IGlzIHNldCwKICAgICAgICogYW5kIGlmIHNvLCBxdWV1ZSB0aGUgZXh0ZW5zaW9uIHByZWZpeCAqLwogICAgICBpZiAobXNnLkV2ZW50LktleUV2ZW50LmR3Q29udHJvbEtleVN0YXRlICYgRU5IQU5DRURfS0VZKSB7CiAgICAgICAgSU5UX0ludDA5U2VuZFNjYW4oMHhFMCwwKTsKICAgICAgfQogICAgICBJTlRfSW50MDlTZW5kU2NhbihzY2FuLG1zZy5FdmVudC5LZXlFdmVudC51Q2hhci5Bc2NpaUNoYXIpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIEZJWE1FXyhpbnQpKCJ1bmhhbmRsZWQgY29uc29sZSBldmVudDogJWRcbiIsIG1zZy5FdmVudFR5cGUpOwogICAgfQogIH0KfQoKc3RhdGljIHZvaWQgRE9TVk1fUHJvY2Vzc01lc3NhZ2UoTVNHICptc2cpCnsKICBCWVRFIHNjYW4gPSAwOwoKICBUUkFDRV8oaW50KSgiZ290IG1lc3NhZ2UgJTA0eCwgd3BhcmFtPSUwOHgsIGxwYXJhbT0lMDhseFxuIixtc2ctPm1lc3NhZ2UsbXNnLT53UGFyYW0sbXNnLT5sUGFyYW0pOwogIGlmICgobXNnLT5tZXNzYWdlPj1XTV9NT1VTRUZJUlNUKSYmCiAgICAgIChtc2ctPm1lc3NhZ2U8PVdNX01PVVNFTEFTVCkpIHsKICAgIElOVF9JbnQzM01lc3NhZ2UobXNnLT5tZXNzYWdlLG1zZy0+d1BhcmFtLG1zZy0+bFBhcmFtKTsKICB9IGVsc2UgewogICAgc3dpdGNoIChtc2ctPm1lc3NhZ2UpIHsKICAgIGNhc2UgV01fS0VZVVA6CiAgICAgIHNjYW4gPSAweDgwOwogICAgY2FzZSBXTV9LRVlET1dOOgogICAgICBzY2FuIHw9IChtc2ctPmxQYXJhbSA+PiAxNikgJiAweDdmOwoKICAgICAgLyogY2hlY2sgd2hldGhlciBleHRlbmRlZCBiaXQgaXMgc2V0LAogICAgICAgKiBhbmQgaWYgc28sIHF1ZXVlIHRoZSBleHRlbnNpb24gcHJlZml4ICovCiAgICAgIGlmIChtc2ctPmxQYXJhbSAmIDB4MTAwMDAwMCkgewoJLyogRklYTUU6IHNvbWUga2V5cyAoZnVuY3Rpb24ga2V5cykgaGF2ZQoJICogZXh0ZW5kZWQgYml0IHNldCBldmVuIHdoZW4gdGhleSBzaG91bGRuJ3QsCgkgKiBzaG91bGQgY2hlY2sgZm9yIHRoZW0gKi8KCUlOVF9JbnQwOVNlbmRTY2FuKDB4RTAsMCk7CiAgICAgIH0KICAgICAgSU5UX0ludDA5U2VuZFNjYW4oc2NhbiwwKTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQp9Cgp2b2lkIERPU1ZNX1dhaXQoIGludCByZWFkX3BpcGUsIEhBTkRMRSBoT2JqZWN0ICkKewogIE1TRyBtc2c7CiAgRFdPUkQgd2FpdHJldDsKICBIQU5ETEUgb2Jqc1syXTsKICBpbnQgb2JqYzsKICBCT09MIGdvdF9tc2cgPSBGQUxTRTsKCiAgb2Jqc1swXT1HZXRTdGRIYW5kbGUoU1REX0lOUFVUX0hBTkRMRSk7CiAgb2Jqc1sxXT1oT2JqZWN0OwogIG9iamM9aE9iamVjdD8yOjE7CiAgZG8gewogICAgLyogY2hlY2sgZm9yIG1lc3NhZ2VzICh3YXN0ZSB0aW1lIGJlZm9yZSB0aGUgcmVzcG9uc2UgY2hlY2sgYmVsb3cpICovCiAgICBpZiAoQ2FsbG91dC5QZWVrTWVzc2FnZUEpCiAgICB7CiAgICAgICAgd2hpbGUgKENhbGxvdXQuUGVla01lc3NhZ2VBKCZtc2csMCwwLDAsUE1fUkVNT1ZFfFBNX05PWUlFTEQpKSB7CiAgICAgICAgICAgIC8qIGdvdCBhIG1lc3NhZ2UgKi8KICAgICAgICAgICAgRE9TVk1fUHJvY2Vzc01lc3NhZ2UoJm1zZyk7CiAgICAgICAgICAgIC8qIHdlIGRvbid0IG5lZWQgYSBUcmFuc2xhdGVNZXNzYWdlIGhlcmUgKi8KICAgICAgICAgICAgQ2FsbG91dC5EaXNwYXRjaE1lc3NhZ2VBKCZtc2cpOwogICAgICAgICAgICBnb3RfbXNnID0gVFJVRTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWdvdF9tc2cpIHsKICAgICAgLyogY2hlY2sgZm9yIGNvbnNvbGUgaW5wdXQgKi8KICAgICAgSU5QVVRfUkVDT1JEIG1zZzsKICAgICAgRFdPUkQgbnVtOwogICAgICBpZiAoUGVla0NvbnNvbGVJbnB1dEEob2Jqc1swXSwmbXNnLDEsJm51bSkgJiYgbnVtKSB7CiAgICAgICAgRE9TVk1fUHJvY2Vzc0NvbnNvbGUoKTsKICAgICAgICBnb3RfbXNnID0gVFJVRTsKICAgICAgfQogICAgfQogICAgaWYgKHJlYWRfcGlwZSA9PSAtMSkgewogICAgICBpZiAoZ290X21zZykgYnJlYWs7CiAgICB9IGVsc2UgewogICAgICBmZF9zZXQgcmVhZGZkczsKICAgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dD17MCwwfTsKICAgICAgLyogcXVpY2sgY2hlY2sgZm9yIHJlc3BvbnNlIGZyb20gZG9zbW9kCiAgICAgICAqIChmYXN0ZXIgdGhhbiBkb2luZyB0aGUgZnVsbCBibG9ja2luZyB3YWl0LCBpZiBkYXRhIGFscmVhZHkgYXZhaWxhYmxlKSAqLwogICAgICBGRF9aRVJPKCZyZWFkZmRzKTsgRkRfU0VUKHJlYWRfcGlwZSwmcmVhZGZkcyk7CiAgICAgIGlmIChzZWxlY3QocmVhZF9waXBlKzEsJnJlYWRmZHMsTlVMTCxOVUxMLCZ0aW1lb3V0KT4wKQoJYnJlYWs7CiAgICB9CiAgICAvKiBub3RoaW5nIHlldCwgYmxvY2sgd2hpbGUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGRvICovCiAgICBpZiAoQ2FsbG91dC5Nc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKQogICAgICAgIHdhaXRyZXQgPSBDYWxsb3V0Lk1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMob2JqYyxvYmpzLEZBTFNFLElORklOSVRFLFFTX0FMTElOUFVUKTsKICAgIGVsc2UKICAgICAgICB3YWl0cmV0ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyhvYmpjLG9ianMsRkFMU0UsSU5GSU5JVEUpOwoKICAgIGlmICh3YWl0cmV0PT0oRFdPUkQpLTEpIHsKICAgICAgRVJSXyhtb2R1bGUpKCJkb3N2bSB3YWl0IGVycm9yPSVsZFxuIixHZXRMYXN0RXJyb3IoKSk7CiAgICB9CiAgICBpZiAoKHJlYWRfcGlwZSAhPSAtMSkgJiYgaE9iamVjdCkgewogICAgICBpZiAod2FpdHJldD09KFdBSVRfT0JKRUNUXzArMSkpIGJyZWFrOwogICAgfQogICAgaWYgKHdhaXRyZXQ9PVdBSVRfT0JKRUNUXzApIHsKICAgICAgRE9TVk1fUHJvY2Vzc0NvbnNvbGUoKTsKICAgIH0KICB9IHdoaWxlIChUUlVFKTsKfQoKaW50IERPU1ZNX0VudGVyKCBDT05URVhUODYgKmNvbnRleHQgKQp7CiBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0IFZNODY7CiBpbnQgc3RhdCxsZW4sc2lnOwoKIG1lbXNldCgmVk04NiwgMCwgc2l6ZW9mKFZNODYpKTsKI2RlZmluZSBDUCh4LHkpIFZNODYucmVncy54ID0gY29udGV4dC0+eQogIENWOwojdW5kZWYgQ1AKICBpZiAoVk04Ni5yZWdzLmVmbGFncyAmIElGX01BU0spCiAgICBWTTg2LnJlZ3MuZWZsYWdzIHw9IFZJRl9NQVNLOwoKIC8qIG1haW4gZXhjaGFuZ2UgbG9vcCAqLwogZW50ZXJlZCsrOwogZG8gewogIFRSQUNFXyhtb2R1bGUpKCJ0aHJlYWQgaXM6ICVseFxuIixHZXRDdXJyZW50VGhyZWFkSWQoKSk7CiAgc3RhdCA9IFZNODZfRU5URVI7CiAgZXJybm8gPSAwOwogIC8qIHRyYW5zbWl0IFZNODYgc3RydWN0dXJlIHRvIGRvc21vZCB0YXNrICovCiAgaWYgKHdyaXRlKHdyaXRlX3BpcGUsJnN0YXQsc2l6ZW9mKHN0YXQpKSE9c2l6ZW9mKHN0YXQpKSB7CiAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCwgZXJybm89JWQsIGZkPSVkLCBwaWQ9JWRcbiIsZXJybm8sd3JpdGVfcGlwZSxnZXRwaWQoKSk7CiAgIHJldHVybiAtMTsKICB9CiAgaWYgKHdyaXRlKHdyaXRlX3BpcGUsJlZNODYsc2l6ZW9mKFZNODYpKSE9c2l6ZW9mKFZNODYpKSB7CiAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCwgZXJybm89JWRcbiIsZXJybm8pOwogICByZXR1cm4gLTE7CiAgfQogIC8qIHdhaXQgZm9yIHJlc3BvbnNlLCBkb2luZyBvdGhlciB0aGluZ3MgaW4gdGhlIG1lYW50aW1lICovCiAgRE9TVk1fV2FpdChyZWFkX3BpcGUsIGhSZWFkUGlwZSk7CiAgLyogcmVhZCByZXNwb25zZSAqLwogIHdoaWxlICgxKSB7CiAgICBpZiAoKGxlbj1yZWFkKHJlYWRfcGlwZSwmc3RhdCxzaXplb2Yoc3RhdCkpKT09c2l6ZW9mKHN0YXQpKSBicmVhazsKICAgIGlmICgoKGVycm5vPT1FSU5UUil8fChlcnJubz09RUFHQUlOKSkmJihsZW48PTApKSB7CiAgICAgV0FSTl8obW9kdWxlKSgicmVyZWFkaW5nIGRvc21vZCByZXR1cm4gY29kZSBkdWUgdG8gZXJybm89JWQsIHJlc3VsdD0lZFxuIixlcnJubyxsZW4pOwogICAgIGNvbnRpbnVlOwogICAgfQogICAgRVJSXyhtb2R1bGUpKCJkb3Ntb2Qgc3luYyBsb3N0IHJlYWRpbmcgcmV0dXJuIGNvZGUsIGVycm5vPSVkLCByZXN1bHQ9JWRcbiIsZXJybm8sbGVuKTsKICAgIHJldHVybiAtMTsKICB9CiAgVFJBQ0VfKG1vZHVsZSkoImRvc21vZCByZXR1cm4gY29kZT0lZFxuIixzdGF0KTsKICBpZiAoc3RhdD09RE9TTU9EX0xFRlRJRExFKSB7CiAgICBjb250aW51ZTsKICB9CiAgd2hpbGUgKDEpIHsKICAgIGlmICgobGVuPXJlYWQocmVhZF9waXBlLCZWTTg2LHNpemVvZihWTTg2KSkpPT1zaXplb2YoVk04NikpIGJyZWFrOwogICAgaWYgKCgoZXJybm89PUVJTlRSKXx8KGVycm5vPT1FQUdBSU4pKSYmKGxlbjw9MCkpIHsKICAgICBXQVJOXyhtb2R1bGUpKCJyZXJlYWRpbmcgZG9zbW9kIFZNODYgc3RydWN0dXJlIGR1ZSB0byBlcnJubz0lZCwgcmVzdWx0PSVkXG4iLGVycm5vLGxlbik7CiAgICAgY29udGludWU7CiAgICB9CiAgICBFUlJfKG1vZHVsZSkoImRvc21vZCBzeW5jIGxvc3QgcmVhZGluZyBWTTg2IHN0cnVjdHVyZSwgZXJybm89JWQsIHJlc3VsdD0lZFxuIixlcnJubyxsZW4pOwogICAgcmV0dXJuIC0xOwogIH0KICBpZiAoKHN0YXQmMHhmZik9PURPU01PRF9TSUdOQUwpIHsKICAgIHdoaWxlICgxKSB7CiAgICAgIGlmICgobGVuPXJlYWQocmVhZF9waXBlLCZzaWcsc2l6ZW9mKHNpZykpKT09c2l6ZW9mKHNpZykpIGJyZWFrOwogICAgICBpZiAoKChlcnJubz09RUlOVFIpfHwoZXJybm89PUVBR0FJTikpJiYobGVuPD0wKSkgewoJV0FSTl8obW9kdWxlKSgicmVyZWFkaW5nIGRvc21vZCBzaWduYWwgZHVlIHRvIGVycm5vPSVkLCByZXN1bHQ9JWRcbiIsZXJybm8sbGVuKTsKCWNvbnRpbnVlOwogICAgICB9CiAgICAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCByZWFkaW5nIHNpZ25hbCwgZXJybm89JWQsIHJlc3VsdD0lZFxuIixlcnJubyxsZW4pOwogICAgICByZXR1cm4gLTE7CiAgICB9IHdoaWxlICgwKTsKICB9IGVsc2Ugc2lnPTA7CiAgLyogZ290IHJlc3BvbnNlICovCiB9IHdoaWxlIChET1NWTV9Qcm9jZXNzKHN0YXQsc2lnLCZWTTg2KT49MCk7CiBlbnRlcmVkLS07CgojZGVmaW5lIENQKHgseSkgY29udGV4dC0+eSA9IFZNODYucmVncy54CiAgQ1Y7CiN1bmRlZiBDUAogcmV0dXJuIDA7Cn0KCnZvaWQgRE9TVk1fUElDX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwpCnsKICAgIExQRE9TRVZFTlQgZXZlbnQ7CgogICAgaWYgKChwb3J0PT0weDIwKSAmJiAodmFsPT0weDIwKSkgewogICAgICBpZiAoY3VycmVudF9ldmVudCkgewoJLyogRU9JIChFbmQgT2YgSW50ZXJydXB0KSAqLwoJVFJBQ0VfKGludCkoInJlY2VpdmVkIEVPSSBmb3IgY3VycmVudCBJUlEsIGNsZWFyaW5nXG4iKTsKCWV2ZW50ID0gY3VycmVudF9ldmVudDsKCWN1cnJlbnRfZXZlbnQgPSBldmVudC0+bmV4dDsKCWlmIChldmVudC0+cmVsYXkpCgkoKmV2ZW50LT5yZWxheSkoTlVMTCxldmVudC0+ZGF0YSk7CglmcmVlKGV2ZW50KTsKCglpZiAocGVuZGluZ19ldmVudCAmJgoJICAgICFzaWdfc2VudCkgewoJICAvKiBhbm90aGVyIGV2ZW50IGlzIHBlbmRpbmcsIHdoaWNoIHdlIHNob3VsZCBwcm9iYWJseQoJICAgKiBiZSBhYmxlIHRvIHByb2Nlc3Mgbm93LCBzbyB0ZWxsIGRvc21vZCBhYm91dCBpdCAqLwoJICBUUkFDRV8oaW50KSgiYW5vdGhlciBldmVudCBwZW5kaW5nLCBzaWduYWxsaW5nIGRvc21vZFxuIik7CgkgIGtpbGwoZG9zbW9kX3BpZCxTSUdVU1IyKTsKCSAgc2lnX3NlbnQrKzsKCX0KICAgICAgfSBlbHNlIHsKCVdBUk5fKGludCkoIkVPSSB3aXRob3V0IGFjdGl2ZSBJUlFcbiIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBGSVhNRV8oaW50KSgidW5yZWNvZ25pemVkIFBJQyBjb21tYW5kICUwMnhcbiIsdmFsKTsKICAgIH0KfQoKdm9pZCBET1NWTV9TZXRUaW1lciggdW5zaWduZWQgdGlja3MgKQp7CiAgaW50IHN0YXQ9RE9TTU9EX1NFVF9USU1FUjsKICBzdHJ1Y3QgdGltZXZhbCB0aW07CgogIGlmIChNWl9DdXJyZW50KCkpIHsKICAgIC8qIHRoZSBQQyBjbG9ja3MgdGlja3MgYXQgMTE5MzE4MCBIeiAqLwogICAgdGltLnR2X3NlYz0wOwogICAgdGltLnR2X3VzZWM9TXVsRGl2KHRpY2tzLDEwMDAwMDAsMTE5MzE4MCk7CiAgICAvKiBzYW5pdHkgY2hlY2sgKi8KICAgIGlmICghdGltLnR2X3VzZWMpIHRpbS50dl91c2VjPTE7CgogICAgaWYgKHdyaXRlKHdyaXRlX3BpcGUsJnN0YXQsc2l6ZW9mKHN0YXQpKSE9c2l6ZW9mKHN0YXQpKSB7CiAgICAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCwgZXJybm89JWRcbiIsZXJybm8pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAod3JpdGUod3JpdGVfcGlwZSwmdGltLHNpemVvZih0aW0pKSE9c2l6ZW9mKHRpbSkpIHsKICAgICAgRVJSXyhtb2R1bGUpKCJkb3Ntb2Qgc3luYyBsb3N0LCBlcnJubz0lZFxuIixlcnJubyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8qIHRoZXJlJ3Mgbm8gcmV0dXJuICovCiAgfQp9Cgp1bnNpZ25lZCBET1NWTV9HZXRUaW1lciggdm9pZCApCnsKICBpbnQgc3RhdD1ET1NNT0RfR0VUX1RJTUVSOwogIHN0cnVjdCB0aW1ldmFsIHRpbTsKCiAgaWYgKE1aX0N1cnJlbnQoKSkgewogICAgaWYgKHdyaXRlKHdyaXRlX3BpcGUsJnN0YXQsc2l6ZW9mKHN0YXQpKSE9c2l6ZW9mKHN0YXQpKSB7CiAgICAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCwgZXJybm89JWRcbiIsZXJybm8pOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIC8qIHJlYWQgcmVzcG9uc2UgKi8KICAgIHdoaWxlICgxKSB7CiAgICAgIGlmIChyZWFkKHJlYWRfcGlwZSwmdGltLHNpemVvZih0aW0pKT09c2l6ZW9mKHRpbSkpIGJyZWFrOwogICAgICBpZiAoKGVycm5vPT1FSU5UUil8fChlcnJubz09RUFHQUlOKSkgY29udGludWU7CiAgICAgIEVSUl8obW9kdWxlKSgiZG9zbW9kIHN5bmMgbG9zdCwgZXJybm89JWRcbiIsZXJybm8pOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiBNdWxEaXYodGltLnR2X3VzZWMsMTE5MzE4MCwxMDAwMDAwKTsKICB9CiAgcmV0dXJuIDA7Cn0KCiNlbHNlIC8qICFNWl9TVVBQT1JURUQgKi8KCmludCBET1NWTV9FbnRlciggQ09OVEVYVDg2ICpjb250ZXh0ICkKewogRVJSXyhtb2R1bGUpKCJET1MgcmVhbG1vZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZSFcbiIpOwogcmV0dXJuIC0xOwp9Cgp2b2lkIERPU1ZNX1dhaXQoIGludCByZWFkX3BpcGUsIEhBTkRMRSBoT2JqZWN0KSB7fQp2b2lkIERPU1ZNX1BJQ19pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsKSB7fQp2b2lkIERPU1ZNX1NldFRpbWVyKCB1bnNpZ25lZCB0aWNrcyApIHt9CnVuc2lnbmVkIERPU1ZNX0dldFRpbWVyKCB2b2lkICkgeyByZXR1cm4gMDsgfQp2b2lkIERPU1ZNX1F1ZXVlRXZlbnQoIGludCBpcnEsIGludCBwcmlvcml0eSwgdm9pZCAoKnJlbGF5KShDT05URVhUODYqLHZvaWQqKSwgdm9pZCAqZGF0YSkKewogIGlmIChpcnE8MCkgewogICAgLyogY2FsbGJhY2sgZXZlbnQsIHBlcmZvcm0gaXQgd2l0aCBkdW1teSBjb250ZXh0ICovCiAgICBDT05URVhUODYgY29udGV4dDsKICAgIG1lbXNldCgmY29udGV4dCwwLHNpemVvZihjb250ZXh0KSk7CiAgICAoKnJlbGF5KSgmY29udGV4dCxkYXRhKTsKICB9IGVsc2UgewogICAgRVJSXyhpbnQpKCJJUlEgd2l0aG91dCBET1MgdGFzazogc2hvdWxkIG5vdCBoYXBwZW4iKTsKICB9Cn0KCiNlbmRpZgo=