LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiAgSG9zdCBSZXNvdXJjZXMgTUlCIC0gc3lzdGVtIGdyb3VwIGltcGxlbWVudGF0aW9uIC0gaHJfc3lzdGVtLmMKICoKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1mZWF0dXJlcy5oPgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgoKI2luY2x1ZGUgImhvc3QuaCIKI2luY2x1ZGUgImhvc3RfcmVzLmgiCiNpbmNsdWRlICJocl9zeXN0ZW0uaCIKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2F1dG9fbmxpc3QuaD4KCiNpZmRlZiBIQVZFX1NZU19QUk9DX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSAic3lzL3Byb2MuaCIKI2VuZGlmCiNpZm5kZWYgbWluZ3czMgojaWYgSEFWRV9VVE1QWF9ICiNpbmNsdWRlIDx1dG1weC5oPgojZWxzZQojaW5jbHVkZSA8dXRtcC5oPgojZW5kaWYKI2VuZGlmIC8qIG1pbmd3MzIgKi8KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCiNpZmRlZiBXSU4zMgojaW5jbHVkZSA8bG0uaD4KI2VuZGlmCgojaWZkZWYgbGludXgKI2lmZGVmIEhBVkVfTElOVVhfVEFTS1NfSAojaW5jbHVkZSA8bGludXgvdGFza3MuaD4KI2Vsc2UKLyoKICogSWYgdGhpcyBmaWxlIGRvZXNuJ3QgZXhpc3QsIHRoZW4gdGhlcmUgaXMgbm8gaGFyZCBsaW1pdCBvbiB0aGUgbnVtYmVyCiAqIG9mIHByb2Nlc3Nlcywgc28gcmV0dXJuIDAgZm9yIGhyU3lzdGVtTWF4UHJvY2Vzc2VzLiAgCiAqLwojZGVmaW5lIE5SX1RBU0tTCTAKI2VuZGlmCiNlbmRpZgoKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKI2luY2x1ZGUgPHN5cy9wc3RhdC5oPgojZW5kaWYKCiNpZiBkZWZpbmVkKHNvbGFyaXMyKQojaW5jbHVkZSA8a3N0YXQuaD4KI2luY2x1ZGUgPHN5cy92YXIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL29wZW5wcm9taW8uaD4KI2VuZGlmCgojaWZkZWYgSEFWRV9TWVNfU1lTQ1RMX0gKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KI2VuZGlmCgpuZXRzbm1wX2ZlYXR1cmVfcmVxdWlyZShkYXRlX25fdGltZSkKCiNpZiAhZGVmaW5lZChVVE1QX0ZJTEUpICYmIGRlZmluZWQoX1BBVEhfVVRNUCkKI2RlZmluZSBVVE1QX0ZJTEUgX1BBVEhfVVRNUAojZW5kaWYKCiNpZiBkZWZpbmVkKFVUTVBfRklMRSkgJiYgIUhBVkVfVVRNUFhfSAp2b2lkICAgICAgICAgICAgc2V0dXRlbnQodm9pZCk7CnZvaWQgICAgICAgICAgICBlbmR1dGVudCh2b2lkKTsKc3RydWN0IHV0bXAgICAgKmdldHV0ZW50KHZvaWQpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVUTVBfRklMRSAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBLZXJuZWwgJiBpbnRlcmZhY2UgaW5mb3JtYXRpb24sCgkgKiAgIGFuZCBpbnRlcm5hbCBmb3J3YXJkIGRlY2xhcmF0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojaWYgZGVmaW5lZChzb2xhcmlzMikKc3RhdGljIHN0cnVjdCBvcGVucHJvbWlvICogb3BfbWFsbG9jKHNpemVfdCBzaXplKTsKc3RhdGljIHZvaWQgb3BfZnJlZShzdHJ1Y3Qgb3BlbnByb21pbyAqb3ApOwoKI2lmbmRlZiBORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQKc3RhdGljIGludCBzZXRfc29sYXJpc19ib290Y29tbWFuZF9wYXJhbWV0ZXIoaW50IGFjdGlvbiwgdV9jaGFyICogdmFyX3ZhbCwgdV9jaGFyIHZhcl92YWxfdHlwZSwgc2l6ZV90IHZhcl92YWxfbGVuLCB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKTsKI2VuZGlmIC8qICFORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgKi8KCnN0YXRpYyBpbnQgc2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcihjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlLCBzaXplX3QgdmFsdWVfbGVuKTsKc3RhdGljIGludCBnZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKGNvbnN0IGNoYXIgKnBhcmFtZXRlciwgY2hhciAqb3V0cHV0KTsKc3RhdGljIGxvbmcgICAgIGdldF9tYXhfc29sYXJpc19wcm9jZXNzZXModm9pZCk7CiNlbmRpZgoKc3RhdGljIGludCAgICAgIGdldF9sb2FkX2Rldih2b2lkKTsKc3RhdGljIGludCAgICAgIGNvdW50X3VzZXJzKHZvaWQpOwpleHRlcm4gaW50ICAgICAgY291bnRfcHJvY2Vzc2VzKHZvaWQpOwpleHRlcm4gaW50ICAgICAgc3dydW5fY291bnRfcHJvY2Vzc2VzKHZvaWQpOwoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEluaXRpYWxpc2F0aW9uICYgY29tbW9uIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lCUhSU1lTX1VQVElNRQkJMQojZGVmaW5lCUhSU1lTX0RBVEUJCTIKI2RlZmluZQlIUlNZU19MT0FEX0RFVgkJMwojZGVmaW5lCUhSU1lTX0xPQURfUEFSQU0JNAojZGVmaW5lCUhSU1lTX1VTRVJTCQk1CiNkZWZpbmUJSFJTWVNfUFJPQ1MJCTYKI2RlZmluZQlIUlNZU19NQVhQUk9DUwkJNwoKI2lmIGRlZmluZWQoc29sYXJpczIpCiNpZm5kZWYgTkVUU05NUF9OT19XUklURV9TVVBQT1JUCnN0cnVjdCB2YXJpYWJsZTIgaHJzeXN0ZW1fdmFyaWFibGVzW10gPSB7CiAgICB7SFJTWVNfVVBUSU1FLCBBU05fVElNRVRJQ0tTLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHsxfX0sCiAgICB7SFJTWVNfREFURSwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl9ocnN5cywgMSwgezJ9fSwKICAgIHtIUlNZU19MT0FEX0RFViwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezN9fSwKICAgIHtIUlNZU19MT0FEX1BBUkFNLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX2hyc3lzLCAxLCB7NH19LAogICAge0hSU1lTX1VTRVJTLCBBU05fR0FVR0UsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezV9fSwKICAgIHtIUlNZU19QUk9DUywgQVNOX0dBVUdFLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs2fX0sCiAgICB7SFJTWVNfTUFYUFJPQ1MsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs3fX0KfTsKI2Vsc2UgLyogIU5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAqLwpzdHJ1Y3QgdmFyaWFibGUyIGhyc3lzdGVtX3ZhcmlhYmxlc1tdID0gewogICAge0hSU1lTX1VQVElNRSwgQVNOX1RJTUVUSUNLUywgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3lzLCAxLCB7MX19LAogICAge0hSU1lTX0RBVEUsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezJ9fSwKICAgIHtIUlNZU19MT0FEX0RFViwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezN9fSwKICAgIHtIUlNZU19MT0FEX1BBUkFNLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs0fX0sCiAgICB7SFJTWVNfVVNFUlMsIEFTTl9HQVVHRSwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3lzLCAxLCB7NX19LAogICAge0hSU1lTX1BST0NTLCBBU05fR0FVR0UsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezZ9fSwKICAgIHtIUlNZU19NQVhQUk9DUywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezd9fQp9OwojZW5kaWYgLyogIU5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAqLwojZWxzZQpzdHJ1Y3QgdmFyaWFibGUyIGhyc3lzdGVtX3ZhcmlhYmxlc1tdID0gewogICAge0hSU1lTX1VQVElNRSwgQVNOX1RJTUVUSUNLUywgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3lzLCAxLCB7MX19LAogICAge0hSU1lTX0RBVEUsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezJ9fSwKICAgIHtIUlNZU19MT0FEX0RFViwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezN9fSwKICAgIHtIUlNZU19MT0FEX1BBUkFNLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs0fX0sCiAgICB7SFJTWVNfVVNFUlMsIEFTTl9HQVVHRSwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3lzLCAxLCB7NX19LAogICAge0hSU1lTX1BST0NTLCBBU05fR0FVR0UsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezZ9fSwKICAgIHtIUlNZU19NQVhQUk9DUywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezd9fQp9OwojZW5kaWYKCm9pZCAgICAgICAgICAgICBocnN5c3RlbV92YXJpYWJsZXNfb2lkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDI1LCAxIH07CgoKdm9pZAppbml0X2hyX3N5c3RlbSh2b2lkKQp7CiNpZmRlZiBOUFJPQ19TWU1CT0wKICAgIGF1dG9fbmxpc3QoTlBST0NfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCgogICAgUkVHSVNURVJfTUlCKCJob3N0L2hyX3N5c3RlbSIsIGhyc3lzdGVtX3ZhcmlhYmxlcywgdmFyaWFibGUyLAogICAgICAgICAgICAgICAgIGhyc3lzdGVtX3ZhcmlhYmxlc19vaWQpOwp9IC8qIGVuZCBpbml0X2hyX3N5c3RlbSAqLwoKLyoKICogaGVhZGVyX2hyc3lzKC4uLgogKiBBcmd1bWVudHM6CiAqIHZwICAgICBJTiAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSBlbnRyeSB0aGF0IHBvaW50cyBoZXJlCiAqIG5hbWUgICAgSU4vT1VUICAtIElOL25hbWUgcmVxdWVzdGVkLCBPVVQvbmFtZSBmb3VuZAogKiBsZW5ndGggIElOL09VVCAgLSBsZW5ndGggb2YgSU4vT1VUIG9pZCdzIAogKiBleGFjdCAgIElOICAgICAgLSBUUlVFIGlmIGFuIGV4YWN0IG1hdGNoIHdhcyByZXF1ZXN0ZWQKICogdmFyX2xlbiBPVVQgICAgIC0gbGVuZ3RoIG9mIHZhcmlhYmxlIG9yIDAgaWYgZnVuY3Rpb24gcmV0dXJuZWQKICogd3JpdGVfbWV0aG9kCiAqLwoKaW50CmhlYWRlcl9ocnN5cyhzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNkZWZpbmUgSFJTWVNfTkFNRV9MRU5HVEgJOQogICAgb2lkICAgICAgICAgICAgIG5ld25hbWVbTUFYX09JRF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdDsKCiAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zeXN0ZW0iLCAidmFyX2hyc3lzOiAiKSk7CiAgICBERUJVR01TR09JRCgoImhvc3QvaHJfc3lzdGVtIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJob3N0L2hyX3N5c3RlbSIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtY3B5KChjaGFyICopIG5ld25hbWUsIChjaGFyICopIHZwLT5uYW1lLCB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIG5ld25hbWVbSFJTWVNfTkFNRV9MRU5HVEhdID0gMDsKICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwgdnAtPm5hbWVsZW4gKyAxKTsKICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCAhPSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0ID49IDApKSkKICAgICAgICByZXR1cm4gKE1BVENIX0ZBSUxFRCk7CiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAodnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CgogICAgKndyaXRlX21ldGhvZCA9IChXcml0ZU1ldGhvZCopMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmcpOyAgICAvKiBkZWZhdWx0IHRvICdsb25nJyByZXN1bHRzICovCiAgICByZXR1cm4gKE1BVENIX1NVQ0NFRURFRCk7Cn0gLyogZW5kIGhlYWRlcl9ocnN5cyAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBTeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCnVfY2hhciAgICAgICAgICoKdmFyX2hyc3lzKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBzdGF0aWMgY2hhciAgICAgc3RyaW5nWzEyOV07IC8qIHBlciBNSUIsIG1heCBzaXplIGlzIDEyOCAqLwojaWYgZGVmaW5lZChzb2xhcmlzMikKICAgIC8qIG1heCBzaXplIG9mIG52cmFtIHByb3BlcnR5ICovCiAgICBjaGFyIGJvb3RwYXJhbVs4MTkyXTsKI2VuZGlmCiAgICB0aW1lX3QgICAgICAgICAgbm93OwojaWYgIShkZWZpbmVkKE5SX1RBU0tTKSB8fCBkZWZpbmVkKHNvbGFyaXMyKSB8fCBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpKQogICAgaW50ICAgICAgICAgICAgIG5wcm9jID0gMDsKI2VuZGlmCiNpZmRlZiBsaW51eAogICAgRklMRSAgICAgICAgICAgKmZwOwojZW5kaWYKI2lmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgJiYgZGVmaW5lZChDVExfS0VSTikgJiYgZGVmaW5lZChLRVJOX01BWFBST0MpCiAgICBzdGF0aWMgaW50ICAgICAgbWF4cHJvY19taWJbXSA9IHsgQ1RMX0tFUk4sIEtFUk5fTUFYUFJPQyB9OwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9zaXplOwojZW5kaWYKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgIHN0cnVjdCBwc3Rfc3RhdGljIHBzdF9idWY7CiNlbmRpZgoKICAgIGlmIChoZWFkZXJfaHJzeXModnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkgPT0KICAgICAgICBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSFJTWVNfVVBUSU1FOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ2V0X3VwdGltZSgpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIEhSU1lTX0RBVEU6CiNpZiBkZWZpbmVkKEhBVkVfTUtUSU1FKSAmJiBkZWZpbmVkKEhBVkVfU1RJTUUpCiNpZm5kZWYgTkVUU05NUF9OT19XUklURV9TVVBQT1JUIAogICAgICAgICp3cml0ZV9tZXRob2Q9bnNfc2V0X3RpbWU7CiNlbmRpZiAvKiAhTkVUU05NUF9OT19XUklURV9TVVBQT1JUICovCiNlbmRpZgogICAgICAgIHRpbWUoJm5vdyk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZGF0ZV9uX3RpbWUoJm5vdywgdmFyX2xlbik7CiAgICBjYXNlIEhSU1lTX0xPQURfREVWOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ2V0X2xvYWRfZGV2KCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTWVNfTE9BRF9QQVJBTToKI2lmZGVmIGxpbnV4CiAgICAgICAgaWYoKGZwID0gZm9wZW4oIi9wcm9jL2NtZGxpbmUiLCAiciIpKSAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZnZXRzKHN0cmluZywgc2l6ZW9mKHN0cmluZyksIGZwKTsKICAgICAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZm5kZWYgTkVUU05NUF9OT19XUklURV9TVVBQT1JUCiAgICAgICAgKndyaXRlX21ldGhvZD1zZXRfc29sYXJpc19ib290Y29tbWFuZF9wYXJhbWV0ZXI7CiNlbmRpZiAvKiAhTkVUU05NUF9OT19XUklURV9TVVBQT1JUICovCiAgICAgICAgaWYgKCBnZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKCJib290LWNvbW1hbmQiLGJvb3RwYXJhbSkgKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsInVuYWJsZSB0byBsb29rdXAgYm9vdC1jb21tYW5kIGZyb20gZWVwcm9tXG4iKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHN0cmxjcHkoc3RyaW5nLGJvb3RwYXJhbSxzaXplb2Yoc3RyaW5nKSk7CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBzcHJpbnRmKHN0cmluZywgImFzayBEYXZlIik7ICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihzdHJpbmcpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIHN0cmluZzsKICAgIGNhc2UgSFJTWVNfVVNFUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBjb3VudF91c2VycygpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIEhSU1lTX1BST0NTOgojaWYgVVNJTkdfSE9TVF9EQVRBX0FDQ0VTU19TV1JVTl9NT0RVTEUKICAgICAgICBsb25nX3JldHVybiA9IHN3cnVuX2NvdW50X3Byb2Nlc3NlcygpOwojZWxpZiBVU0lOR19IT1NUX0hSX1NXUlVOX01PRFVMRQogICAgICAgIGxvbmdfcmV0dXJuID0gY291bnRfcHJvY2Vzc2VzKCk7CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIEhSU1lTX01BWFBST0NTOgojaWYgZGVmaW5lZChOUl9UQVNLUykKICAgICAgICBsb25nX3JldHVybiA9IE5SX1RBU0tTOyAvKiA8bGludXgvdGFza3MuaD4gKi8KI2VsaWYgTkVUU05NUF9DQU5fVVNFX1NZU0NUTCAmJiBkZWZpbmVkKENUTF9LRVJOKSAmJiBkZWZpbmVkKEtFUk5fTUFYUFJPQykKICAgICAgICBidWZfc2l6ZSA9IHNpemVvZihucHJvYyk7CiAgICAgICAgaWYgKHN5c2N0bChtYXhwcm9jX21pYiwgMiwgJm5wcm9jLCAmYnVmX3NpemUsIE5VTEwsIDApIDwgMCkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBucHJvYzsKI2VsaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgICAgIHBzdGF0X2dldHN0YXRpYygmcHN0X2J1Ziwgc2l6ZW9mKHN0cnVjdCBwc3Rfc3RhdGljKSwgMSwgMCk7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwc3RfYnVmLm1heF9wcm9jOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQogICAgbG9uZ19yZXR1cm49Z2V0X21heF9zb2xhcmlzX3Byb2Nlc3NlcygpOwogICAgaWYobG9uZ19yZXR1cm4gPT0gLTEpIHJldHVybiBOVUxMOwojZWxpZiBkZWZpbmVkKE5QUk9DX1NZTUJPTCkKICAgICAgICBhdXRvX25saXN0KE5QUk9DX1NZTUJPTCwgKGNoYXIgKikgJm5wcm9jLCBzaXplb2YoaW50KSk7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBucHJvYzsKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gMDsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9ocnN5c1xuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9IC8qIGVuZCB2YXJfaHJzeXMgKi8KCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCgojaWYgZGVmaW5lZChzb2xhcmlzMikKCi8qIGZ1bmN0aW9ucyBmb3IgbWFsbG9jIGFuZCBmcmVlaW5nIG9wZW5wcm9taW8gc3RydWN0dXJlICovCnN0YXRpYyBzdHJ1Y3Qgb3BlbnByb21pbyAqIG9wX21hbGxvYyhzaXplX3Qgc2l6ZSkKewogICAgc3RydWN0IG9wZW5wcm9taW8gKm9wOwogICAgb3A9bWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3BlbnByb21pbykgKyBzaXplKTsKICAgIGlmKG9wID09IE5VTEwpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ1bmFibGUgdG8gbWFsbG9jIG1lbW9yeVxuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgbWVtc2V0KG9wLCAwLCBzaXplb2Yoc3RydWN0IG9wZW5wcm9taW8pK3NpemUpOwogICAgb3AtPm9wcm9tX3NpemU9c2l6ZTsKCiAgICByZXR1cm4gb3A7Cn0KCnN0YXRpYyB2b2lkIG9wX2ZyZWUoc3RydWN0IG9wZW5wcm9taW8gKm9wKSB7CiAgICBmcmVlKG9wKTsKfQoKI2lmbmRlZiBORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQKc3RhdGljIGludApzZXRfc29sYXJpc19ib290Y29tbWFuZF9wYXJhbWV0ZXIoaW50IGFjdGlvbiwKICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKSB7CgogICAgc3RhdGljIGNoYXIgb2xkX3ZhbHVlWzEwMjRdLCpwX29sZF92YWx1ZT1vbGRfdmFsdWU7CiAgICBpbnQgc3RhdHVzPTA7CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgICAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgICAgICAvKiBjaGVjayB0eXBlICovCiAgICAgICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwid3JpdGUgdG8gc2V0X3NvbGFyaXNfYm9vdGNvbW1hbmRfcGFyYW1ldGVyIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUkVTRVJWRTI6IHsKICAgICAgICAgICAgLyogY3JlYXRlIGNvcHkgb2Ygb2xkIHZhbHVlICovCiAgICAgICAgICAgIGlmKHN0YXRQKSB7CiAgICAgICAgICAgICAgICBpbnQgb2xkX3ZhbF9sZW49c3RybGVuKHN0YXRQKTsKICAgICAgICAgICAgICAgIGlmKG9sZF92YWxfbGVuID49IHNpemVvZihvbGRfdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgcF9vbGRfdmFsdWU9KGNoYXIgKiltYWxsb2Mob2xkX3ZhbF9sZW4rMSk7CiAgICAgICAgICAgICAgICAgICAgaWYocF9vbGRfdmFsdWU9PU5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwidW5hYmxlIHRvIG1hbGxvYyBtZW1vcnlcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHJsY3B5KHBfb2xkX3ZhbHVlLHN0YXRQLG9sZF92YWxfbGVuKzEpOwogICAgICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgICAgIHBfb2xkX3ZhbHVlPU5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjYXNlIEFDVElPTjogewogICAgICAgICAgICBzdGF0dXM9c2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcigiYm9vdC1jb21tYW5kIiwoY2hhciAqKXZhcl92YWwsdmFyX3ZhbF9sZW4pOwogICAgICAgICAgICBpZihzdGF0dXMhPTApIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgY2FzZSBVTkRPOiB7CiAgICAgICAgICAgIC8qIHJldmVydCB0byBvbGQgdmFsdWUgKi8KICAgICAgICAgICAgaWYocF9vbGRfdmFsdWUpIHsgCiAgICAgICAgICAgICAgICBzdGF0dXM9c2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcigiYm9vdC1jb21tYW5kIiwoY2hhciAqKXBfb2xkX3ZhbHVlLHN0cmxlbihwX29sZF92YWx1ZSkpOwogICAgICAgICAgICAgICAgcF9vbGRfdmFsdWU9b2xkX3ZhbHVlOyAKICAgICAgICAgICAgICAgIGlmKHN0YXR1cyE9MCkgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNhc2UgRlJFRToKICAgICAgICBjYXNlIENPTU1JVDoKICAgICAgICAgICAgLyogZnJlZSBtZW1vcnkgaWYgbmVjZXNzYXJ5ICovCiAgICAgICAgICAgIGlmKHBfb2xkX3ZhbHVlICE9ICBvbGRfdmFsdWUpIHsKICAgICAgICAgICAgICAgIGZyZWUocF9vbGRfdmFsdWUpOwogICAgICAgICAgICAgICAgcF9vbGRfdmFsdWU9b2xkX3ZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KI2VuZGlmIC8qICFORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgKi8KCnN0YXRpYyBpbnQgc2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcihjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuKSB7CgogICAgaW50IHN0YXR1cz0wOwogICAgY2hhciBidWZmZXJbMTAyNF0sKnBidWZmZXI9YnVmZmVyOwogICAgCiAgICBpZiggc3RybGVuKGtleSkrc3RybGVuKHZhbHVlKSsxNiA+IHNpemVvZihidWZmZXIpICkgewogICAgICAgIHBidWZmZXI9KGNoYXIgKiltYWxsb2Moc3RybGVuKGtleSkrc3RybGVuKHZhbHVlKSsxNik7CiAgICB9IAoKICAgIAogICAgc3ByaW50ZihwYnVmZmVyLCAiZWVwcm9tICVzPVwiJS4qc1wiXG4iLCBrZXksIHZhcl92YWxfbGVuLCB2YWx1ZSk7CgogICAgc3RhdHVzPXN5c3RlbShwYnVmZmVyKTsKCiAgICBpZihwYnVmZmVyIT1idWZmZXIpIGZyZWUocGJ1ZmZlcik7CiAgICByZXR1cm4gc3RhdHVzOwp9CgpzdGF0aWMgaW50IGdldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoY29uc3QgY2hhciAqcGFyYW1ldGVyLCBjaGFyICpvdXRidWZmZXIpIHsKCiAgICBpbnQgZmQ9MCxzdGF0dXM9MDsKICAgIHN0cnVjdCBvcGVucHJvbWlvICpvcGVucHJvbWluZm89TlVMTDsKCiAgICBmZD1vcGVuKCIvZGV2L29wZW5wcm9tIixPX1JET05MWSk7CiAgICBpZiAoIGZkID09IC0xICkgewogICAgICAgIHNubXBfbG9nX3BlcnJvcigiL2Rldi9vcGVucHJvbSIpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG9wZW5wcm9taW5mbyA9IG9wX21hbGxvYyg4MTkyKTsKICAgIGlmKCFvcGVucHJvbWluZm8pIHJldHVybiAxOwoKICAgIHN0cmNweShvcGVucHJvbWluZm8tPm9wcm9tX2FycmF5LHBhcmFtZXRlcik7CgogICAgc3RhdHVzPWlvY3RsKGZkLE9QUk9NR0VUT1BULG9wZW5wcm9taW5mbyk7CiAgICBpZiAoIHN0YXR1cyA9PSAtMSApIHsKICAgICAgICBzbm1wX2xvZ19wZXJyb3IoIi9kZXYvb3BlbnByb20iKTsKICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgb3BfZnJlZShvcGVucHJvbWluZm8pOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgc3RyY3B5KG91dGJ1ZmZlcixvcGVucHJvbWluZm8tPm9wcm9tX2FycmF5KTsKCiAgICBvcF9mcmVlKG9wZW5wcm9taW5mbyk7CgogICAgLyogY2xvc2UgZmlsZSAqLwogICAgY2xvc2UoZmQpOwoKICAgIHJldHVybigwKTsKfQoKc3RhdGljIGxvbmcgZ2V0X21heF9zb2xhcmlzX3Byb2Nlc3Nlcyh2b2lkKSB7CgogICAga3N0YXRfY3RsX3QgKmtzYz1OVUxMOwogICAga3N0YXRfdCAqa3M9TlVMTDsKICAgIHN0cnVjdCB2YXIgdjsKICAgIHN0YXRpYyBsb25nIG1heHByb2NzPS0xOwoKICAgIC8qIGFzc3VtZSBvbmx5IG5lY2Vzc2FyeSB0byBjb21wdXRlIG9uY2UsIHNpbmNlIC9ldGMvc3lzdGVtIG11c3QgYmUgbW9kaWZpZWQgKi8KICAgIGlmIChtYXhwcm9jcyA9PSAtMSkgewogICAgICAgIGlmICggKGtzYz1rc3RhdF9vcGVuKCkpICE9IE5VTEwgJiYgCiAgICAgICAgICAgICAoa3M9a3N0YXRfbG9va3VwKGtzYywgInVuaXgiLCAwLCAidmFyIikpICE9IE5VTEwgJiYgCiAgICAgICAgICAgICAoa3N0YXRfcmVhZChrc2MsIGtzLCAmdikgIT0gLTEpKSB7CgogICAgICAgICAgICBtYXhwcm9jcz12LnZfcHJvYzsKICAgICAgICB9CiAgICAgICAgaWYoa3NjKSB7CiAgICAgICAgICAgIGtzdGF0X2Nsb3NlKGtzYyk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBtYXhwcm9jczsKfQoKI2VuZGlmCgojaWYgZGVmaW5lZChIQVZFX01LVElNRSkgJiYgZGVmaW5lZChIQVZFX1NUSU1FKQojaWZuZGVmIE5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVAppbnQKbnNfc2V0X3RpbWUoaW50IGFjdGlvbiwKICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CgogICAgc3RhdGljIHRpbWVfdCBvbGR0aW1lPTA7CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgICAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgICAgICAvKiBjaGVjayB0eXBlICovCiAgICAgICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwid3JpdGUgdG8gbnNfc2V0X3RpbWUgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFyX3ZhbF9sZW4gIT0gOCAmJiB2YXJfdmFsX2xlbiE9MTEpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsIndyaXRlIHRvIG5zX3NldF90aW1lIG5vdCBhIHByb3BlciBsZW5ndGhcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEZSRUU6CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFDVElPTjogewogICAgICAgICAgICBsb25nIHN0YXR1cz0wOwogICAgICAgICAgICB0aW1lX3Qgc2Vjb25kcz0wOwogICAgICAgICAgICBzdHJ1Y3QgdG0gbmV3dGltZXRtOwogICAgICAgICAgICBpbnQgaG91cnNfZnJvbV91dGM9IDA7CiAgICAgICAgICAgIGludCBtaW51dGVzX2Zyb21fdXRjPSAwOwoKICAgICAgICAgICAgaWYgKHZhcl92YWxfbGVuID09IDExKSB7CiAgICAgICAgICAgICAgICAvKiB0aW1lem9uZSBpbmZvcmFtYXRpb24gd2FzIHByZXNlbnQgKi8KICAgICAgICAgICAgICAgIGhvdXJzX2Zyb21fdXRjPShpbnQpdmFyX3ZhbFs5XTsKICAgICAgICAgICAgICAgIG1pbnV0ZXNfZnJvbV91dGM9KGludCl2YXJfdmFsWzEwXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV3dGltZXRtLnRtX3NlYz0oaW50KXZhcl92YWxbNl07OwogICAgICAgICAgICBuZXd0aW1ldG0udG1fbWluPShpbnQpdmFyX3ZhbFs1XTsKICAgICAgICAgICAgbmV3dGltZXRtLnRtX2hvdXI9KGludCl2YXJfdmFsWzRdOwoKICAgICAgICAgICAgbmV3dGltZXRtLnRtX21vbj0oaW50KXZhcl92YWxbMl0tMTsKICAgICAgICAgICAgbmV3dGltZXRtLnRtX3llYXI9MjU2KihpbnQpdmFyX3ZhbFswXSsoaW50KXZhcl92YWxbMV0tMTkwMDsKICAgICAgICAgICAgbmV3dGltZXRtLnRtX21kYXk9KGludCl2YXJfdmFsWzNdOwoKICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGlmIGRheSBsaWdodCBzYXZpbmdzIHRpbWUgaW4gZWZmZWN0IERTVCAqLwogICAgICAgICAgICBpZiAoICggaG91cnNfZnJvbV91dGMqNjAqNjArbWludXRlc19mcm9tX3V0Yyo2MCApID09IGFicyh0aW1lem9uZSkgKSB7CiAgICAgICAgICAgICAgICBuZXd0aW1ldG0udG1faXNkc3Q9MDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5ld3RpbWV0bS50bV9pc2RzdD0xOwogICAgICAgICAgICB9IAoKICAgICAgICAgICAgLyogY3JlYXRlIGNvcHkgb2Ygb2xkIHZhbHVlICovCiAgICAgICAgICAgIG9sZHRpbWU9dGltZShOVUxMKTsKCiAgICAgICAgICAgIHNlY29uZHM9bWt0aW1lKCZuZXd0aW1ldG0pOwogICAgICAgICAgICBpZihzZWNvbmRzID09ICh0aW1lX3QpLTEpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVbmFibGUgdG8gY29udmVydCB0aW1lIHZhbHVlXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdHVzPXN0aW1lKCZzZWNvbmRzKTsKICAgICAgICAgICAgaWYoc3RhdHVzIT0wKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiVW5hYmxlIHRvIHNldCB0aW1lXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgVU5ETzogewogICAgICAgICAgICAvKiByZXZlcnQgdG8gb2xkIHZhbHVlICovCiAgICAgICAgICAgIGludCBzdGF0dXM9MDsKICAgICAgICAgICAgaWYob2xkdGltZSAhPSAwKSB7CiAgICAgICAgICAgICAgICBzdGF0dXM9c3RpbWUoJm9sZHRpbWUpOwogICAgICAgICAgICAgICAgb2xkdGltZT0wOyAgICAKICAgICAgICAgICAgICAgIGlmKHN0YXR1cyE9MCkgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVbmFibGUgdG8gc2V0IHRpbWVcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjYXNlIENPTU1JVDogewogICAgICAgICAgICBvbGR0aW1lPTA7ICAgIAogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQojZW5kaWYgLyogIU5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAqLwojZW5kaWYKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogIFJldHVybiB0aGUgRGV2aWNlSW5kZXggY29ycmVzcG9uZGluZwogICAgICAgICAgICAgICAgICogICB0byB0aGUgYm9vdCBkZXZpY2UKICAgICAgICAgICAgICAgICAqLwpzdGF0aWMgaW50CmdldF9sb2FkX2Rldih2b2lkKQp7CiAgICByZXR1cm4gKEhSREVWX0RJU0sgPDwgSFJERVZfVFlQRV9TSElGVCk7ICAgIC8qIFhYWCAqLwp9IC8qIGVuZCBnZXRfbG9hZF9kZXYgKi8KCnN0YXRpYyBpbnQKY291bnRfdXNlcnModm9pZCkKewogICAgaW50ICAgICAgICAgICAgIHRvdGFsID0gMDsKI2lmbmRlZiBXSU4zMgojaWYgSEFWRV9VVE1QWF9ICiNkZWZpbmUgc2V0dXRlbnQgc2V0dXR4ZW50CiNkZWZpbmUgcHV0dXRsaW5lIHB1dHV0eGxpbmUKI2RlZmluZSBnZXR1dGVudCBnZXR1dHhlbnQKI2RlZmluZSBlbmR1dGVudCBlbmR1dHhlbnQKICAgIHN0cnVjdCB1dG1weCAgICp1dG1wX3A7CiNlbHNlCiAgICBzdHJ1Y3QgdXRtcCAgICAqdXRtcF9wOwojZW5kaWYKCiAgICBzZXR1dGVudCgpOwogICAgd2hpbGUgKCh1dG1wX3AgPSBnZXR1dGVudCgpKSAhPSBOVUxMKSB7CiNpZm5kZWYgVVRNUF9IQVNfTk9fVFlQRQogICAgICAgIGlmICh1dG1wX3AtPnV0X3R5cGUgIT0gVVNFUl9QUk9DRVNTKQogICAgICAgICAgICBjb250aW51ZTsKI2VuZGlmCiNpZm5kZWYgVVRNUF9IQVNfTk9fUElECiAgICAgICAgICAgIC8qIFRoaXMgYmxvY2sgb2YgY29kZSBmaXhlcyB6b21iaWUgdXNlciBQSURzIGluIHRoZQogICAgICAgICAgICAgICB1dG1wL3V0bXB4IGZpbGUgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgY291bnRlZCBhcyBhCiAgICAgICAgICAgICAgIGN1cnJlbnQgdXNlciAqLwogICAgICAgICAgICBpZiAoa2lsbCh1dG1wX3AtPnV0X3BpZCwgMCkgPT0gLTEgJiYgZXJybm8gPT0gRVNSQ0gpIHsKICAgICAgICAgICAgICAgIHV0bXBfcC0+dXRfdHlwZSA9IERFQURfUFJPQ0VTUzsKICAgICAgICAgICAgICAgIHB1dHV0bGluZSh1dG1wX3ApOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgICsrdG90YWw7CiAgICB9CiAgICBlbmR1dGVudCgpOwojZWxzZSAvKiBXSU4zMiAqLwogICAvKiAKICAgICogVE9ETyAtIEVycm9yIGNoZWNraW5nLgogICAgKi8KCUxQV0tTVEFfSU5GT18xMDIgd2tpbmZvOwoJTkVUX0FQSV9TVEFUVVMgbnN0YXR1czsKCQoJbnN0YXR1cyA9IE5ldFdrc3RhR2V0SW5mbyhOVUxMLCAxMDIsIChMUEJZVEUqKSZ3a2luZm8pOwoJaWYgKG5zdGF0dXMgIT0gTkVSUl9TdWNjZXNzKSB7CgkJcmV0dXJuIDA7Cgl9Cgl0b3RhbCA9IChpbnQpd2tpbmZvLT53a2kxMDJfbG9nZ2VkX29uX3VzZXJzOwoKCU5ldEFwaUJ1ZmZlckZyZWUod2tpbmZvKTsJCiNlbmRpZiAvKiBXSU4zMiAqLwogICAgcmV0dXJuIHRvdGFsOwp9CgojaWYgZGVmaW5lZChVVE1QX0ZJTEUpICYmICFIQVZFX1VUTVBYX0gKCnN0YXRpYyBGSUxFICAgICp1dG1wX2ZpbGU7CnN0YXRpYyBzdHJ1Y3QgdXRtcCB1dG1wX3JlYzsKCnZvaWQKc2V0dXRlbnQodm9pZCkKewogICAgaWYgKHV0bXBfZmlsZSkKICAgICAgICBmY2xvc2UodXRtcF9maWxlKTsKICAgIHV0bXBfZmlsZSA9IGZvcGVuKFVUTVBfRklMRSwgInIiKTsKfQoKdm9pZAplbmR1dGVudCh2b2lkKQp7CiAgICBpZiAodXRtcF9maWxlKSB7CiAgICAgICAgZmNsb3NlKHV0bXBfZmlsZSk7CiAgICAgICAgdXRtcF9maWxlID0gTlVMTDsKICAgIH0KfQoKc3RydWN0IHV0bXAgICAgKgpnZXR1dGVudCh2b2lkKQp7CiAgICBpZiAoIXV0bXBfZmlsZSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIHdoaWxlIChmcmVhZCgmdXRtcF9yZWMsIHNpemVvZih1dG1wX3JlYyksIDEsIHV0bXBfZmlsZSkgPT0gMSkKICAgICAgICBpZiAoKnV0bXBfcmVjLnV0X25hbWUgJiYgKnV0bXBfcmVjLnV0X2xpbmUpCiAgICAgICAgICAgIHJldHVybiAmdXRtcF9yZWM7CiAgICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVVE1QX0ZJTEUgKi8K