LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiAgSG9zdCBSZXNvdXJjZXMgTUlCIC0gc3lzdGVtIGdyb3VwIGltcGxlbWVudGF0aW9uIC0gaHJfc3lzdGVtLmMKICoKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CgojaW5jbHVkZSAiaG9zdC5oIgojaW5jbHVkZSAiaG9zdF9yZXMuaCIKI2luY2x1ZGUgImhyX3N5c3RlbS5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgoKI2lmZGVmIEhBVkVfU1lTX1BST0NfSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlICJzeXMvcHJvYy5oIgojZW5kaWYKI2lmbmRlZiBtaW5ndzMyCiNpZiBIQVZFX1VUTVBYX0gKI2luY2x1ZGUgPHV0bXB4Lmg+CiNlbHNlCiNpbmNsdWRlIDx1dG1wLmg+CiNlbmRpZgojZW5kaWYgLyogbWluZ3czMiAqLwojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxlcnJuby5oPgoKI2lmZGVmIFdJTjMyCiNpbmNsdWRlIDxsbS5oPgojZW5kaWYKCiNpZmRlZiBsaW51eAojaWZkZWYgSEFWRV9MSU5VWF9UQVNLU19ICiNpbmNsdWRlIDxsaW51eC90YXNrcy5oPgojZWxzZQovKgogKiBJZiB0aGlzIGZpbGUgZG9lc24ndCBleGlzdCwgdGhlbiB0aGVyZSBpcyBubyBoYXJkIGxpbWl0IG9uIHRoZSBudW1iZXIKICogb2YgcHJvY2Vzc2VzLCBzbyByZXR1cm4gMCBmb3IgaHJTeXN0ZW1NYXhQcm9jZXNzZXMuICAKICovCiNkZWZpbmUgTlJfVEFTS1MJMAojZW5kaWYKI2VuZGlmCgojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQojaW5jbHVkZSA8c3lzL3BzdGF0Lmg+CiNlbmRpZgoKI2lmIGRlZmluZWQoc29sYXJpczIpCiNpbmNsdWRlIDxrc3RhdC5oPgojaW5jbHVkZSA8c3lzL3Zhci5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvb3BlbnByb21pby5oPgojZW5kaWYKCiNpZmRlZiBIQVZFX1NZU19TWVNDVExfSAojaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgojZW5kaWYKCiNpZiAhZGVmaW5lZChVVE1QX0ZJTEUpICYmIGRlZmluZWQoX1BBVEhfVVRNUCkKI2RlZmluZSBVVE1QX0ZJTEUgX1BBVEhfVVRNUAojZW5kaWYKCiNpZiBkZWZpbmVkKFVUTVBfRklMRSkgJiYgIUhBVkVfVVRNUFhfSAp2b2lkICAgICAgICAgICAgc2V0dXRlbnQodm9pZCk7CnZvaWQgICAgICAgICAgICBlbmR1dGVudCh2b2lkKTsKc3RydWN0IHV0bXAgICAgKmdldHV0ZW50KHZvaWQpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVUTVBfRklMRSAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBLZXJuZWwgJiBpbnRlcmZhY2UgaW5mb3JtYXRpb24sCgkgKiAgIGFuZCBpbnRlcm5hbCBmb3J3YXJkIGRlY2xhcmF0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojaWYgZGVmaW5lZChzb2xhcmlzMikKc3RhdGljIHN0cnVjdCBvcGVucHJvbWlvICogb3BfbWFsbG9jKHNpemVfdCBzaXplKTsKc3RhdGljIHZvaWQgb3BfZnJlZShzdHJ1Y3Qgb3BlbnByb21pbyAqb3ApOwpzdGF0aWMgaW50IHNldF9zb2xhcmlzX2Jvb3Rjb21tYW5kX3BhcmFtZXRlcihpbnQgYWN0aW9uLCB1X2NoYXIgKiB2YXJfdmFsLCB1X2NoYXIgdmFyX3ZhbF90eXBlLCBzaXplX3QgdmFyX3ZhbF9sZW4sIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pOwpzdGF0aWMgaW50IHNldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IHZhbHVlX2xlbik7CnN0YXRpYyBpbnQgZ2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcihjb25zdCBjaGFyICpwYXJhbWV0ZXIsIGNoYXIgKm91dHB1dCk7CnN0YXRpYyBsb25nICAgICBnZXRfbWF4X3NvbGFyaXNfcHJvY2Vzc2VzKHZvaWQpOwojZW5kaWYKc3RhdGljIGludCAgICAgIGdldF9sb2FkX2Rldih2b2lkKTsKc3RhdGljIGludCAgICAgIGNvdW50X3VzZXJzKHZvaWQpOwpleHRlcm4gaW50ICAgICAgY291bnRfcHJvY2Vzc2VzKHZvaWQpOwpleHRlcm4gaW50ICAgICAgc3dydW5fY291bnRfcHJvY2Vzc2VzKHZvaWQpOwoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEluaXRpYWxpc2F0aW9uICYgY29tbW9uIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lCUhSU1lTX1VQVElNRQkJMQojZGVmaW5lCUhSU1lTX0RBVEUJCTIKI2RlZmluZQlIUlNZU19MT0FEX0RFVgkJMwojZGVmaW5lCUhSU1lTX0xPQURfUEFSQU0JNAojZGVmaW5lCUhSU1lTX1VTRVJTCQk1CiNkZWZpbmUJSFJTWVNfUFJPQ1MJCTYKI2RlZmluZQlIUlNZU19NQVhQUk9DUwkJNwoKI2lmIGRlZmluZWQoc29sYXJpczIpCnN0cnVjdCB2YXJpYWJsZTIgaHJzeXN0ZW1fdmFyaWFibGVzW10gPSB7CiAgICB7SFJTWVNfVVBUSU1FLCBBU05fVElNRVRJQ0tTLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHsxfX0sCiAgICB7SFJTWVNfREFURSwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl9ocnN5cywgMSwgezJ9fSwKICAgIHtIUlNZU19MT0FEX0RFViwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezN9fSwKICAgIHtIUlNZU19MT0FEX1BBUkFNLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX2hyc3lzLCAxLCB7NH19LAogICAge0hSU1lTX1VTRVJTLCBBU05fR0FVR0UsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezV9fSwKICAgIHtIUlNZU19QUk9DUywgQVNOX0dBVUdFLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs2fX0sCiAgICB7SFJTWVNfTUFYUFJPQ1MsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs3fX0KfTsKI2Vsc2UKc3RydWN0IHZhcmlhYmxlMiBocnN5c3RlbV92YXJpYWJsZXNbXSA9IHsKICAgIHtIUlNZU19VUFRJTUUsIEFTTl9USU1FVElDS1MsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezF9fSwKICAgIHtIUlNZU19EQVRFLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHsyfX0sCiAgICB7SFJTWVNfTE9BRF9ERVYsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHszfX0sCiAgICB7SFJTWVNfTE9BRF9QQVJBTSwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3lzLCAxLCB7NH19LAogICAge0hSU1lTX1VTRVJTLCBBU05fR0FVR0UsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezV9fSwKICAgIHtIUlNZU19QUk9DUywgQVNOX0dBVUdFLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs2fX0sCiAgICB7SFJTWVNfTUFYUFJPQ1MsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs3fX0KfTsKI2VuZGlmCm9pZCAgICAgICAgICAgICBocnN5c3RlbV92YXJpYWJsZXNfb2lkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDI1LCAxIH07CgoKdm9pZAppbml0X2hyX3N5c3RlbSh2b2lkKQp7CiNpZmRlZiBOUFJPQ19TWU1CT0wKICAgIGF1dG9fbmxpc3QoTlBST0NfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCgogICAgUkVHSVNURVJfTUlCKCJob3N0L2hyX3N5c3RlbSIsIGhyc3lzdGVtX3ZhcmlhYmxlcywgdmFyaWFibGUyLAogICAgICAgICAgICAgICAgIGhyc3lzdGVtX3ZhcmlhYmxlc19vaWQpOwp9IC8qIGVuZCBpbml0X2hyX3N5c3RlbSAqLwoKLyoKICogaGVhZGVyX2hyc3lzKC4uLgogKiBBcmd1bWVudHM6CiAqIHZwICAgICBJTiAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSBlbnRyeSB0aGF0IHBvaW50cyBoZXJlCiAqIG5hbWUgICAgSU4vT1VUICAtIElOL25hbWUgcmVxdWVzdGVkLCBPVVQvbmFtZSBmb3VuZAogKiBsZW5ndGggIElOL09VVCAgLSBsZW5ndGggb2YgSU4vT1VUIG9pZCdzIAogKiBleGFjdCAgIElOICAgICAgLSBUUlVFIGlmIGFuIGV4YWN0IG1hdGNoIHdhcyByZXF1ZXN0ZWQKICogdmFyX2xlbiBPVVQgICAgIC0gbGVuZ3RoIG9mIHZhcmlhYmxlIG9yIDAgaWYgZnVuY3Rpb24gcmV0dXJuZWQKICogd3JpdGVfbWV0aG9kCiAqLwoKaW50CmhlYWRlcl9ocnN5cyhzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNkZWZpbmUgSFJTWVNfTkFNRV9MRU5HVEgJOQogICAgb2lkICAgICAgICAgICAgIG5ld25hbWVbTUFYX09JRF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdDsKCiAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zeXN0ZW0iLCAidmFyX2hyc3lzOiAiKSk7CiAgICBERUJVR01TR09JRCgoImhvc3QvaHJfc3lzdGVtIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJob3N0L2hyX3N5c3RlbSIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtY3B5KChjaGFyICopIG5ld25hbWUsIChjaGFyICopIHZwLT5uYW1lLCB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIG5ld25hbWVbSFJTWVNfTkFNRV9MRU5HVEhdID0gMDsKICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwgdnAtPm5hbWVsZW4gKyAxKTsKICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCAhPSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0ID49IDApKSkKICAgICAgICByZXR1cm4gKE1BVENIX0ZBSUxFRCk7CiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAodnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CgogICAgKndyaXRlX21ldGhvZCA9IChXcml0ZU1ldGhvZCopMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmcpOyAgICAvKiBkZWZhdWx0IHRvICdsb25nJyByZXN1bHRzICovCiAgICByZXR1cm4gKE1BVENIX1NVQ0NFRURFRCk7Cn0gLyogZW5kIGhlYWRlcl9ocnN5cyAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBTeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCnVfY2hhciAgICAgICAgICoKdmFyX2hyc3lzKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBzdGF0aWMgY2hhciAgICAgc3RyaW5nWzEyOV07IC8qIHBlciBNSUIsIG1heCBzaXplIGlzIDEyOCAqLwojaWYgZGVmaW5lZChzb2xhcmlzMikKICAgIC8qIG1heCBzaXplIG9mIG52cmFtIHByb3BlcnR5ICovCiAgICBjaGFyIGJvb3RwYXJhbVs4MTkyXTsKI2VuZGlmCiAgICB0aW1lX3QgICAgICAgICAgbm93OwojaWYgIShkZWZpbmVkKE5SX1RBU0tTKSB8fCBkZWZpbmVkKHNvbGFyaXMyKSB8fCBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpKQogICAgaW50ICAgICAgICAgICAgIG5wcm9jID0gMDsKI2VuZGlmCiNpZmRlZiBsaW51eAogICAgRklMRSAgICAgICAgICAgKmZwOwojZW5kaWYKI2lmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgJiYgZGVmaW5lZChDVExfS0VSTikgJiYgZGVmaW5lZChLRVJOX01BWFBST0MpCiAgICBzdGF0aWMgaW50ICAgICAgbWF4cHJvY19taWJbXSA9IHsgQ1RMX0tFUk4sIEtFUk5fTUFYUFJPQyB9OwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9zaXplOwojZW5kaWYKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgIHN0cnVjdCBwc3Rfc3RhdGljIHBzdF9idWY7CiNlbmRpZgoKICAgIGlmIChoZWFkZXJfaHJzeXModnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkgPT0KICAgICAgICBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSFJTWVNfVVBUSU1FOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ2V0X3VwdGltZSgpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIEhSU1lTX0RBVEU6CiNpZiBkZWZpbmVkKEhBVkVfTUtUSU1FKSAmJiBkZWZpbmVkKEhBVkVfU1RJTUUpCiAgICAgICAgKndyaXRlX21ldGhvZD1uc19zZXRfdGltZTsKI2VuZGlmCiAgICAgICAgdGltZSgmbm93KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBkYXRlX25fdGltZSgmbm93LCB2YXJfbGVuKTsKICAgIGNhc2UgSFJTWVNfTE9BRF9ERVY6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBnZXRfbG9hZF9kZXYoKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUlNZU19MT0FEX1BBUkFNOgojaWZkZWYgbGludXgKICAgICAgICBpZigoZnAgPSBmb3BlbigiL3Byb2MvY21kbGluZSIsICJyIikpICE9IE5VTEwpIHsKICAgICAgICAgICAgZmdldHMoc3RyaW5nLCBzaXplb2Yoc3RyaW5nKSwgZnApOwogICAgICAgICAgICBmY2xvc2UoZnApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKICAgICAgICAqd3JpdGVfbWV0aG9kPXNldF9zb2xhcmlzX2Jvb3Rjb21tYW5kX3BhcmFtZXRlcjsKICAgICAgICBpZiAoIGdldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoImJvb3QtY29tbWFuZCIsYm9vdHBhcmFtKSApIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwidW5hYmxlIHRvIGxvb2t1cCBib290LWNvbW1hbmQgZnJvbSBlZXByb21cbiIpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgc3RybGNweShzdHJpbmcsYm9vdHBhcmFtLHNpemVvZihzdHJpbmcpKTsKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIHNwcmludGYoc3RyaW5nLCAiYXNrIERhdmUiKTsgICAgLyogWFhYICovCiNlbmRpZgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKHN0cmluZyk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgc3RyaW5nOwogICAgY2FzZSBIUlNZU19VU0VSUzoKICAgICAgICBsb25nX3JldHVybiA9IGNvdW50X3VzZXJzKCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTWVNfUFJPQ1M6CiNpZiBVU0lOR19IT1NUX0RBVEFfQUNDRVNTX1NXUlVOX01PRFVMRQogICAgICAgIGxvbmdfcmV0dXJuID0gc3dydW5fY291bnRfcHJvY2Vzc2VzKCk7CiNlbGlmIFVTSU5HX0hPU1RfSFJfU1dSVU5fTU9EVUxFCiAgICAgICAgbG9uZ19yZXR1cm4gPSBjb3VudF9wcm9jZXNzZXMoKTsKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gMDsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTWVNfTUFYUFJPQ1M6CiNpZiBkZWZpbmVkKE5SX1RBU0tTKQogICAgICAgIGxvbmdfcmV0dXJuID0gTlJfVEFTS1M7IC8qIDxsaW51eC90YXNrcy5oPiAqLwojZWxpZiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICYmIGRlZmluZWQoQ1RMX0tFUk4pICYmIGRlZmluZWQoS0VSTl9NQVhQUk9DKQogICAgICAgIGJ1Zl9zaXplID0gc2l6ZW9mKG5wcm9jKTsKICAgICAgICBpZiAoc3lzY3RsKG1heHByb2NfbWliLCAyLCAmbnByb2MsICZidWZfc2l6ZSwgTlVMTCwgMCkgPCAwKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICBsb25nX3JldHVybiA9IG5wcm9jOwojZWxpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCiAgICAgICAgcHN0YXRfZ2V0c3RhdGljKCZwc3RfYnVmLCBzaXplb2Yoc3RydWN0IHBzdF9zdGF0aWMpLCAxLCAwKTsKICAgICAgICBsb25nX3JldHVybiA9IHBzdF9idWYubWF4X3Byb2M7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiAgICBsb25nX3JldHVybj1nZXRfbWF4X3NvbGFyaXNfcHJvY2Vzc2VzKCk7CiAgICBpZihsb25nX3JldHVybiA9PSAtMSkgcmV0dXJuIE5VTEw7CiNlbGlmIGRlZmluZWQoTlBST0NfU1lNQk9MKQogICAgICAgIGF1dG9fbmxpc3QoTlBST0NfU1lNQk9MLCAoY2hhciAqKSAmbnByb2MsIHNpemVvZihpbnQpKTsKICAgICAgICBsb25nX3JldHVybiA9IG5wcm9jOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2hyc3lzXG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0gLyogZW5kIHZhcl9ocnN5cyAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKCiNpZiBkZWZpbmVkKHNvbGFyaXMyKQoKLyogZnVuY3Rpb25zIGZvciBtYWxsb2MgYW5kIGZyZWVpbmcgb3BlbnByb21pbyBzdHJ1Y3R1cmUgKi8Kc3RhdGljIHN0cnVjdCBvcGVucHJvbWlvICogb3BfbWFsbG9jKHNpemVfdCBzaXplKQp7CiAgICBzdHJ1Y3Qgb3BlbnByb21pbyAqb3A7CiAgICBvcD1tYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcGVucHJvbWlvKSArIHNpemUpOwogICAgaWYob3AgPT0gTlVMTCkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsInVuYWJsZSB0byBtYWxsb2MgbWVtb3J5XG4iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBtZW1zZXQob3AsIDAsIHNpemVvZihzdHJ1Y3Qgb3BlbnByb21pbykrc2l6ZSk7CiAgICBvcC0+b3Byb21fc2l6ZT1zaXplOwoKICAgIHJldHVybiBvcDsKfQoKc3RhdGljIHZvaWQgb3BfZnJlZShzdHJ1Y3Qgb3BlbnByb21pbyAqb3ApIHsKICAgIGZyZWUob3ApOwp9CgpzdGF0aWMgaW50CnNldF9zb2xhcmlzX2Jvb3Rjb21tYW5kX3BhcmFtZXRlcihpbnQgYWN0aW9uLAogICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pIHsKCiAgICBzdGF0aWMgY2hhciBvbGRfdmFsdWVbMTAyNF0sKnBfb2xkX3ZhbHVlPW9sZF92YWx1ZTsKICAgIGludCBzdGF0dXM9MDsKCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgICAgIC8qIGNoZWNrIHR5cGUgKi8KICAgICAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ3cml0ZSB0byBzZXRfc29sYXJpc19ib290Y29tbWFuZF9wYXJhbWV0ZXIgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBSRVNFUlZFMjogewogICAgICAgICAgICAvKiBjcmVhdGUgY29weSBvZiBvbGQgdmFsdWUgKi8KICAgICAgICAgICAgaWYoc3RhdFApIHsKICAgICAgICAgICAgICAgIGludCBvbGRfdmFsX2xlbj1zdHJsZW4oc3RhdFApOwogICAgICAgICAgICAgICAgaWYob2xkX3ZhbF9sZW4gPj0gc2l6ZW9mKG9sZF92YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBwX29sZF92YWx1ZT0oY2hhciAqKW1hbGxvYyhvbGRfdmFsX2xlbisxKTsKICAgICAgICAgICAgICAgICAgICBpZihwX29sZF92YWx1ZT09TlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ1bmFibGUgdG8gbWFsbG9jIG1lbW9yeVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0cmxjcHkocF9vbGRfdmFsdWUsc3RhdFAsb2xkX3ZhbF9sZW4rMSk7CiAgICAgICAgICAgIH0gZWxzZSB7IAogICAgICAgICAgICAgICAgcF9vbGRfdmFsdWU9TlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNhc2UgQUNUSU9OOiB7CiAgICAgICAgICAgIHN0YXR1cz1zZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKCJib290LWNvbW1hbmQiLChjaGFyICopdmFyX3ZhbCx2YXJfdmFsX2xlbik7CiAgICAgICAgICAgIGlmKHN0YXR1cyE9MCkgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjYXNlIFVORE86IHsKICAgICAgICAgICAgLyogcmV2ZXJ0IHRvIG9sZCB2YWx1ZSAqLwogICAgICAgICAgICBpZihwX29sZF92YWx1ZSkgeyAKICAgICAgICAgICAgICAgIHN0YXR1cz1zZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKCJib290LWNvbW1hbmQiLChjaGFyICopcF9vbGRfdmFsdWUsc3RybGVuKHBfb2xkX3ZhbHVlKSk7CiAgICAgICAgICAgICAgICBwX29sZF92YWx1ZT1vbGRfdmFsdWU7IAogICAgICAgICAgICAgICAgaWYoc3RhdHVzIT0wKSByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgY2FzZSBGUkVFOgogICAgICAgIGNhc2UgQ09NTUlUOgogICAgICAgICAgICAvKiBmcmVlIG1lbW9yeSBpZiBuZWNlc3NhcnkgKi8KICAgICAgICAgICAgaWYocF9vbGRfdmFsdWUgIT0gIG9sZF92YWx1ZSkgewogICAgICAgICAgICAgICAgZnJlZShwX29sZF92YWx1ZSk7CiAgICAgICAgICAgICAgICBwX29sZF92YWx1ZT1vbGRfdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKc3RhdGljIGludCBzZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4pIHsKCiAgICBpbnQgc3RhdHVzPTA7CiAgICBjaGFyIGJ1ZmZlclsxMDI0XSwqcGJ1ZmZlcj1idWZmZXI7CiAgICAKICAgIGlmKCBzdHJsZW4oa2V5KStzdHJsZW4odmFsdWUpKzE2ID4gc2l6ZW9mKGJ1ZmZlcikgKSB7CiAgICAgICAgcGJ1ZmZlcj0oY2hhciAqKW1hbGxvYyhzdHJsZW4oa2V5KStzdHJsZW4odmFsdWUpKzE2KTsKICAgIH0gCgogICAgCiAgICBzcHJpbnRmKHBidWZmZXIsICJlZXByb20gJXM9XCIlLipzXCJcbiIsIGtleSwgdmFyX3ZhbF9sZW4sIHZhbHVlKTsKCiAgICBzdGF0dXM9c3lzdGVtKHBidWZmZXIpOwoKICAgIGlmKHBidWZmZXIhPWJ1ZmZlcikgZnJlZShwYnVmZmVyKTsKICAgIHJldHVybiBzdGF0dXM7Cn0KCnN0YXRpYyBpbnQgZ2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcihjb25zdCBjaGFyICpwYXJhbWV0ZXIsIGNoYXIgKm91dGJ1ZmZlcikgewoKICAgIGludCBmZD0wLHN0YXR1cz0wOwogICAgc3RydWN0IG9wZW5wcm9taW8gKm9wZW5wcm9taW5mbz1OVUxMOwoKICAgIGZkPW9wZW4oIi9kZXYvb3BlbnByb20iLE9fUkRPTkxZKTsKICAgIGlmICggZmQgPT0gLTEgKSB7CiAgICAgICAgc25tcF9sb2dfcGVycm9yKCIvZGV2L29wZW5wcm9tIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgb3BlbnByb21pbmZvID0gb3BfbWFsbG9jKDgxOTIpOwogICAgaWYoIW9wZW5wcm9taW5mbykgcmV0dXJuIDE7CgogICAgc3RyY3B5KG9wZW5wcm9taW5mby0+b3Byb21fYXJyYXkscGFyYW1ldGVyKTsKCiAgICBzdGF0dXM9aW9jdGwoZmQsT1BST01HRVRPUFQsb3BlbnByb21pbmZvKTsKICAgIGlmICggc3RhdHVzID09IC0xICkgewogICAgICAgIHNubXBfbG9nX3BlcnJvcigiL2Rldi9vcGVucHJvbSIpOwogICAgICAgIGNsb3NlKGZkKTsKICAgICAgICBvcF9mcmVlKG9wZW5wcm9taW5mbyk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBzdHJjcHkob3V0YnVmZmVyLG9wZW5wcm9taW5mby0+b3Byb21fYXJyYXkpOwoKICAgIG9wX2ZyZWUob3BlbnByb21pbmZvKTsKCiAgICAvKiBjbG9zZSBmaWxlICovCiAgICBjbG9zZShmZCk7CgogICAgcmV0dXJuKDApOwp9CgpzdGF0aWMgbG9uZyBnZXRfbWF4X3NvbGFyaXNfcHJvY2Vzc2VzKHZvaWQpIHsKCiAgICBrc3RhdF9jdGxfdCAqa3NjPU5VTEw7CiAgICBrc3RhdF90ICprcz1OVUxMOwogICAgc3RydWN0IHZhciB2OwogICAgc3RhdGljIGxvbmcgbWF4cHJvY3M9LTE7CgogICAgLyogYXNzdW1lIG9ubHkgbmVjZXNzYXJ5IHRvIGNvbXB1dGUgb25jZSwgc2luY2UgL2V0Yy9zeXN0ZW0gbXVzdCBiZSBtb2RpZmllZCAqLwogICAgaWYgKG1heHByb2NzID09IC0xKSB7CiAgICAgICAgaWYgKCAoa3NjPWtzdGF0X29wZW4oKSkgIT0gTlVMTCAmJiAKICAgICAgICAgICAgIChrcz1rc3RhdF9sb29rdXAoa3NjLCAidW5peCIsIDAsICJ2YXIiKSkgIT0gTlVMTCAmJiAKICAgICAgICAgICAgIChrc3RhdF9yZWFkKGtzYywga3MsICZ2KSAhPSAtMSkpIHsKCiAgICAgICAgICAgIG1heHByb2NzPXYudl9wcm9jOwogICAgICAgIH0KICAgICAgICBpZihrc2MpIHsKICAgICAgICAgICAga3N0YXRfY2xvc2Uoa3NjKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIG1heHByb2NzOwp9CgojZW5kaWYKCiNpZiBkZWZpbmVkKEhBVkVfTUtUSU1FKSAmJiBkZWZpbmVkKEhBVkVfU1RJTUUpCmludApuc19zZXRfdGltZShpbnQgYWN0aW9uLAogICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKCiAgICBzdGF0aWMgdGltZV90IG9sZHRpbWU9MDsKCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgICAgIC8qIGNoZWNrIHR5cGUgKi8KICAgICAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ3cml0ZSB0byBuc19zZXRfdGltZSBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2YXJfdmFsX2xlbiAhPSA4ICYmIHZhcl92YWxfbGVuIT0xMSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwid3JpdGUgdG8gbnNfc2V0X3RpbWUgbm90IGEgcHJvcGVyIGxlbmd0aFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRlJFRToKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQUNUSU9OOiB7CiAgICAgICAgICAgIGxvbmcgc3RhdHVzPTA7CiAgICAgICAgICAgIHRpbWVfdCBzZWNvbmRzPTA7CiAgICAgICAgICAgIHN0cnVjdCB0bSBuZXd0aW1ldG07CiAgICAgICAgICAgIGludCBob3Vyc19mcm9tX3V0Yz0gMDsKICAgICAgICAgICAgaW50IG1pbnV0ZXNfZnJvbV91dGM9IDA7CgogICAgICAgICAgICBpZiAodmFyX3ZhbF9sZW4gPT0gMTEpIHsKICAgICAgICAgICAgICAgIC8qIHRpbWV6b25lIGluZm9yYW1hdGlvbiB3YXMgcHJlc2VudCAqLwogICAgICAgICAgICAgICAgaG91cnNfZnJvbV91dGM9KGludCl2YXJfdmFsWzldOwogICAgICAgICAgICAgICAgbWludXRlc19mcm9tX3V0Yz0oaW50KXZhcl92YWxbMTBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXd0aW1ldG0udG1fc2VjPShpbnQpdmFyX3ZhbFs2XTs7CiAgICAgICAgICAgIG5ld3RpbWV0bS50bV9taW49KGludCl2YXJfdmFsWzVdOwogICAgICAgICAgICBuZXd0aW1ldG0udG1faG91cj0oaW50KXZhcl92YWxbNF07CgogICAgICAgICAgICBuZXd0aW1ldG0udG1fbW9uPShpbnQpdmFyX3ZhbFsyXS0xOwogICAgICAgICAgICBuZXd0aW1ldG0udG1feWVhcj0yNTYqKGludCl2YXJfdmFsWzBdKyhpbnQpdmFyX3ZhbFsxXS0xOTAwOwogICAgICAgICAgICBuZXd0aW1ldG0udG1fbWRheT0oaW50KXZhcl92YWxbM107CgogICAgICAgICAgICAvKiBkZXRlcm1pbmUgaWYgZGF5IGxpZ2h0IHNhdmluZ3MgdGltZSBpbiBlZmZlY3QgRFNUICovCiAgICAgICAgICAgIGlmICggKCBob3Vyc19mcm9tX3V0Yyo2MCo2MCttaW51dGVzX2Zyb21fdXRjKjYwICkgPT0gYWJzKHRpbWV6b25lKSApIHsKICAgICAgICAgICAgICAgIG5ld3RpbWV0bS50bV9pc2RzdD0wOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmV3dGltZXRtLnRtX2lzZHN0PTE7CiAgICAgICAgICAgIH0gCgogICAgICAgICAgICAvKiBjcmVhdGUgY29weSBvZiBvbGQgdmFsdWUgKi8KICAgICAgICAgICAgb2xkdGltZT10aW1lKE5VTEwpOwoKICAgICAgICAgICAgc2Vjb25kcz1ta3RpbWUoJm5ld3RpbWV0bSk7CiAgICAgICAgICAgIGlmKHNlY29uZHMgPT0gKHRpbWVfdCktMSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVuYWJsZSB0byBjb252ZXJ0IHRpbWUgdmFsdWVcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0dXM9c3RpbWUoJnNlY29uZHMpOwogICAgICAgICAgICBpZihzdGF0dXMhPTApIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVbmFibGUgdG8gc2V0IHRpbWVcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSBVTkRPOiB7CiAgICAgICAgICAgIC8qIHJldmVydCB0byBvbGQgdmFsdWUgKi8KICAgICAgICAgICAgaW50IHN0YXR1cz0wOwogICAgICAgICAgICBpZihvbGR0aW1lICE9IDApIHsKICAgICAgICAgICAgICAgIHN0YXR1cz1zdGltZSgmb2xkdGltZSk7CiAgICAgICAgICAgICAgICBvbGR0aW1lPTA7ICAgIAogICAgICAgICAgICAgICAgaWYoc3RhdHVzIT0wKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVuYWJsZSB0byBzZXQgdGltZVxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNhc2UgQ09NTUlUOiB7CiAgICAgICAgICAgIG9sZHRpbWU9MDsgICAgCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CiNlbmRpZgoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAgUmV0dXJuIHRoZSBEZXZpY2VJbmRleCBjb3JyZXNwb25kaW5nCiAgICAgICAgICAgICAgICAgKiAgIHRvIHRoZSBib290IGRldmljZQogICAgICAgICAgICAgICAgICovCnN0YXRpYyBpbnQKZ2V0X2xvYWRfZGV2KHZvaWQpCnsKICAgIHJldHVybiAoSFJERVZfRElTSyA8PCBIUkRFVl9UWVBFX1NISUZUKTsgICAgLyogWFhYICovCn0gLyogZW5kIGdldF9sb2FkX2RldiAqLwoKc3RhdGljIGludApjb3VudF91c2Vycyh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgdG90YWwgPSAwOwojaWZuZGVmIFdJTjMyCiNpZiBIQVZFX1VUTVBYX0gKI2RlZmluZSBzZXR1dGVudCBzZXR1dHhlbnQKI2RlZmluZSBwdXR1dGxpbmUgcHV0dXR4bGluZQojZGVmaW5lIGdldHV0ZW50IGdldHV0eGVudAojZGVmaW5lIGVuZHV0ZW50IGVuZHV0eGVudAogICAgc3RydWN0IHV0bXB4ICAgKnV0bXBfcDsKI2Vsc2UKICAgIHN0cnVjdCB1dG1wICAgICp1dG1wX3A7CiNlbmRpZgoKICAgIHNldHV0ZW50KCk7CiAgICB3aGlsZSAoKHV0bXBfcCA9IGdldHV0ZW50KCkpICE9IE5VTEwpIHsKI2lmbmRlZiBVVE1QX0hBU19OT19UWVBFCiAgICAgICAgaWYgKHV0bXBfcC0+dXRfdHlwZSAhPSBVU0VSX1BST0NFU1MpCiAgICAgICAgICAgIGNvbnRpbnVlOwojZW5kaWYKI2lmbmRlZiBVVE1QX0hBU19OT19QSUQKICAgICAgICAgICAgLyogVGhpcyBibG9jayBvZiBjb2RlIGZpeGVzIHpvbWJpZSB1c2VyIFBJRHMgaW4gdGhlCiAgICAgICAgICAgICAgIHV0bXAvdXRtcHggZmlsZSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBjb3VudGVkIGFzIGEKICAgICAgICAgICAgICAgY3VycmVudCB1c2VyICovCiAgICAgICAgICAgIGlmIChraWxsKHV0bXBfcC0+dXRfcGlkLCAwKSA9PSAtMSAmJiBlcnJubyA9PSBFU1JDSCkgewogICAgICAgICAgICAgICAgdXRtcF9wLT51dF90eXBlID0gREVBRF9QUk9DRVNTOwogICAgICAgICAgICAgICAgcHV0dXRsaW5lKHV0bXBfcCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgKyt0b3RhbDsKICAgIH0KICAgIGVuZHV0ZW50KCk7CiNlbHNlIC8qIFdJTjMyICovCiAgIC8qIAogICAgKiBUT0RPIC0gRXJyb3IgY2hlY2tpbmcuCiAgICAqLwoJTFBXS1NUQV9JTkZPXzEwMiB3a2luZm87CglORVRfQVBJX1NUQVRVUyBuc3RhdHVzOwoJCgluc3RhdHVzID0gTmV0V2tzdGFHZXRJbmZvKE5VTEwsIDEwMiwgKExQQllURSopJndraW5mbyk7CglpZiAobnN0YXR1cyAhPSBORVJSX1N1Y2Nlc3MpIHsKCQlyZXR1cm4gMDsKCX0KCXRvdGFsID0gKGludCl3a2luZm8tPndraTEwMl9sb2dnZWRfb25fdXNlcnM7CgoJTmV0QXBpQnVmZmVyRnJlZSh3a2luZm8pOwkKI2VuZGlmIC8qIFdJTjMyICovCiAgICByZXR1cm4gdG90YWw7Cn0KCiNpZiBkZWZpbmVkKFVUTVBfRklMRSkgJiYgIUhBVkVfVVRNUFhfSAoKc3RhdGljIEZJTEUgICAgKnV0bXBfZmlsZTsKc3RhdGljIHN0cnVjdCB1dG1wIHV0bXBfcmVjOwoKdm9pZApzZXR1dGVudCh2b2lkKQp7CiAgICBpZiAodXRtcF9maWxlKQogICAgICAgIGZjbG9zZSh1dG1wX2ZpbGUpOwogICAgdXRtcF9maWxlID0gZm9wZW4oVVRNUF9GSUxFLCAiciIpOwp9Cgp2b2lkCmVuZHV0ZW50KHZvaWQpCnsKICAgIGlmICh1dG1wX2ZpbGUpIHsKICAgICAgICBmY2xvc2UodXRtcF9maWxlKTsKICAgICAgICB1dG1wX2ZpbGUgPSBOVUxMOwogICAgfQp9CgpzdHJ1Y3QgdXRtcCAgICAqCmdldHV0ZW50KHZvaWQpCnsKICAgIGlmICghdXRtcF9maWxlKQogICAgICAgIHJldHVybiBOVUxMOwogICAgd2hpbGUgKGZyZWFkKCZ1dG1wX3JlYywgc2l6ZW9mKHV0bXBfcmVjKSwgMSwgdXRtcF9maWxlKSA9PSAxKQogICAgICAgIGlmICgqdXRtcF9yZWMudXRfbmFtZSAmJiAqdXRtcF9yZWMudXRfbGluZSkKICAgICAgICAgICAgcmV0dXJuICZ1dG1wX3JlYzsKICAgIHJldHVybiBOVUxMOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVUTVBfRklMRSAqLwo=