LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgovKgogKiBuZWVkZWQgYnkgdXRpbF9mdW5jcy5oIAogKi8KI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgoKI2luY2x1ZGUgPG1hdGguaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2FnZW50X2NhbGxiYWNrcy5oPgoKI2luY2x1ZGUgInV0aWxfZnVuY3MvaGVhZGVyX3NpbXBsZV90YWJsZS5oIgoKLyoKICogaW5jbHVkZSBvdXIgLmggZmlsZSAKICovCiNpbmNsdWRlICJkaXNraW8uaCIKCiNkZWZpbmUgQ0FDSEVfVElNRU9VVCAxCnN0YXRpYyB0aW1lX3QgICBjYWNoZV90aW1lID0gMDsKCiNpZmRlZiBzb2xhcmlzMgojaW5jbHVkZSA8a3N0YXQuaD4KCiNkZWZpbmUgTUFYX0RJU0tTIDEyOAoKc3RhdGljIGtzdGF0X2N0bF90ICprYzsKc3RhdGljIGtzdGF0X3QgKmtzcDsKc3RhdGljIGtzdGF0X2lvX3Qga2lvOwpzdGF0aWMgaW50ICAgICAgY2FjaGVfZGlza25yID0gLTE7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCi8qCiAqIGhhbmRsZSBkaXNrIHN0YXRpc3RpY3MgdmlhIGxpYnBlcmZzdGF0CiAqLwojaWZkZWYgSEFWRV9TWVNfUFJPVE9TV19ICiNpbmNsdWRlIDxzeXMvcHJvdG9zdy5oPgojZW5kaWYKI2luY2x1ZGUgPGxpYnBlcmZzdGF0Lmg+CnN0YXRpYyBwZXJmc3RhdF9kaXNrX3QgKnBzX2Rpc2s7CS8qIHN0b3JhZ2UgZm9yIGFsbCBkaXNrIHZhbHVlcyAqLwpzdGF0aWMgaW50IHBzX251bWRpc2tzOwkJCS8qIG51bWJlciBvZiBkaXNrcyBpbiBzeXN0ZW0sIG1heSBjaGFuZ2Ugd2hpbGUgcnVubmluZyAqLwojZW5kaWYKCiNpZiBkZWZpbmVkKGJzZGkzKSB8fCBkZWZpbmVkKGJzZGk0KSB8fCBkZWZpbmVkKG9wZW5ic2Q0KQojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KI2lmZGVmIG9wZW5ic2Q0CiNpbmNsdWRlIDxzeXMvZGlzay5oPgojZWxzZQojaW5jbHVkZSA8c3lzL2Rpc2tzdGF0cy5oPgojZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBic2RpICovCgojaWYgZGVmaW5lZChIQVZFX0dFVERFVlMpIHx8IGRlZmluZWQoSEFWRV9ERVZTVEFUX0dFVERFVlMpCiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2lmIEhBVkVfREVWU1RBVF9HRVRERVZTCiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4gICAgICAgLyogZm9yIENQVVNUQVRFUyBpbiBkZXZzdGF0LmggKi8KI2VsaWYgSEFWRV9TWVNfREtTVEFUX0gKI2luY2x1ZGUgPHN5cy9ka3N0YXQuaD4KI2VuZGlmCiNpbmNsdWRlIDxkZXZzdGF0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC91dGlsaXRpZXMuaD4KCiNpbmNsdWRlIDxtYXRoLmg+Ci8qIHNhbXBsaW5nIGludGVydmFsLCBpbiBzZWNvbmRzICovCiNkZWZpbmUgRElTS0lPX1NBTVBMRV9JTlRFUlZBTCA1CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWVic2QgKi8KCiNpZiBIQVZFX0RFVlNUQVRfR0VUREVWUwogICNkZWZpbmUgR0VUREVWUyh4KSBkZXZzdGF0X2dldGRldnMoTlVMTCwgKHgpKQojZWxzZQogICNkZWZpbmUgR0VUREVWUyh4KSBnZXRkZXZzKCh4KSkKI2VuZGlmCgojaWYgZGVmaW5lZCAobGludXgpCiNkZWZpbmUgRElTS0lPX1NBTVBMRV9JTlRFUlZBTCA1CnZvaWQgZGV2bGFfZ2V0c3RhdHModW5zaWduZWQgaW50IHJlZ25vLCB2b2lkICogZHVtbXkpOwojZW5kaWYgLyogbGludXggKi8KCiNpZiBkZWZpbmVkIChkYXJ3aW4pCiNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgojaW5jbHVkZSA8SU9LaXQvSU9LaXRMaWIuaD4KI2luY2x1ZGUgPElPS2l0L3N0b3JhZ2UvSU9CbG9ja1N0b3JhZ2VEcml2ZXIuaD4KI2luY2x1ZGUgPElPS2l0L3N0b3JhZ2UvSU9NZWRpYS5oPgojaW5jbHVkZSA8SU9LaXQvSU9CU0QuaD4KCnN0YXRpYyBtYWNoX3BvcnRfdCBtYXN0ZXJQb3J0OwkJLyogdG8gY29tbXVuaWNhdGUgd2l0aCBJL08gS2l0CSovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGFyd2luICovCgojaWZuZGVmIHNvbGFyaXMyCnN0YXRpYyBpbnQgICAgICBnZXRzdGF0cyh2b2lkKTsKI2VuZGlmCgojaWYgZGVmaW5lZCAoSEFWRV9HRVRERVZTKSB8fCBkZWZpbmVkKEhBVkVfREVWU1RBVF9HRVRERVZTKQp2b2lkCQlkZXZsYV9nZXRzdGF0cyh1bnNpZ25lZCBpbnQgcmVnbm8sIHZvaWQgKmR1bW15KTsKI2VuZGlmCgpGSUxFICAgICAgICAgICAqZmlsZTsKCiNpZmRlZiBsaW51eApzdGF0aWMgaW50CWRpc2tpb19mcmVlX2NvbmZpZyhpbnQsIGludCwgdm9pZCAqLCB2b2lkICopOwojZW5kaWYKCiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgSW5pdGlhbGlzYXRpb24gJiBjb21tb24gaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCgovKgogKiB0aGlzIGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgdGltZSB0aGUgYWdlbnQgc3RhcnRzIHVwCiAqIHRvIGRvIGFueSBpbml0aWxpemF0aW9ucyB5b3UgbWlnaHQgcmVxdWlyZS4gIFlvdSBkb24ndCBoYXZlIHRvCiAqIGNyZWF0ZSBpdCwgYXMgaXQgaXMgb3B0aW9uYWwuIAogKi8KCi8qCiAqIElNUE9SVEFOVDogSWYgeW91IGFkZCBvciByZW1vdmUgdGhpcyBmdW5jdGlvbiwgeW91ICptdXN0KiByZS1ydW4KICogdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYXMgaXQgY2hlY2tzIGZvciBpdHMgZXhpc3RhbmNlLiAKICovCgp2b2lkCmluaXRfZGlza2lvKHZvaWQpCnsKICAgIC8qCiAgICAgKiBEZWZpbmUgYSAndmFyaWFibGUnIHN0cnVjdHVyZSB0aGF0IGlzIGEgcmVwcmVzZW50YXRpb24gb2Ygb3VyIG1pYi4gCiAgICAgKi8KCiAgICAvKgogICAgICogZmlyc3QsIHdlIGhhdmUgdG8gcGljayB0aGUgdmFyaWFibGUgdHlwZS4gIFRoZXkgYXJlIGFsbCBkZWZpbmVkIGluCiAgICAgKiB0aGUgdmFyX3N0cnVjdC5oIGZpbGUgaW4gdGhlIGFnZW50IHN1YmRpcmVjdG9yeS4gIEknbSBwaWNraW5nIHRoZQogICAgICogdmFyaWFibGUyIHN0cnVjdHVyZSBzaW5jZSB0aGUgbG9uZ2VzdCBzdWItY29tcG9uZW50IG9mIHRoZSBvaWQgSQogICAgICogd2FudCB0byBsb2FkIGlzIC4yLjEgYW5kIC4yLjIgc28gSSBuZWVkIGF0IG1vc3QgMiBzcGFjZXMgaW4gdGhlCiAgICAgKiBsYXN0IGVudHJ5LiAKICAgICAqLwoKICAgIHN0cnVjdCB2YXJpYWJsZTIgZGlza2lvX3ZhcmlhYmxlc1tdID0gewogICAgICAgIHtESVNLSU9fSU5ERVgsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2Rpc2tpbywgMSwgezF9fSwKICAgICAgICB7RElTS0lPX0RFVklDRSwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9kaXNraW8sIDEsIHsyfX0sCiAgICAgICAge0RJU0tJT19OUkVBRCwgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfZGlza2lvLCAxLCB7M319LAogICAgICAgIHtESVNLSU9fTldSSVRURU4sIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2Rpc2tpbywgMSwgezR9fSwKICAgICAgICB7RElTS0lPX1JFQURTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9kaXNraW8sIDEsIHs1fX0sCiAgICAgICAge0RJU0tJT19XUklURVMsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2Rpc2tpbywgMSwgezZ9fSwKI2lmIGRlZmluZWQoSEFWRV9HRVRERVZTKSB8fCBkZWZpbmVkKEhBVkVfREVWU1RBVF9HRVRERVZTKSB8fCBkZWZpbmVkKGxpbnV4KQogICAgICAgIHtESVNLSU9fTEExLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9kaXNraW8sIDEsIHs5fX0sCiAgICAgICAge0RJU0tJT19MQTUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2Rpc2tpbywgMSwgezEwfX0sCiAgICAgICAge0RJU0tJT19MQTE1LCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9kaXNraW8sIDEsIHsxMX19LAojZW5kaWYKICAgICAgICB7RElTS0lPX05SRUFEWCwgQVNOX0NPVU5URVI2NCwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9kaXNraW8sIDEsIHsxMn19LAogICAgICAgIHtESVNLSU9fTldSSVRURU5YLCBBU05fQ09VTlRFUjY0LCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2Rpc2tpbywgMSwgezEzfX0sCiAgICB9OwoKICAgIC8qCiAgICAgKiBEZWZpbmUgdGhlIE9JRCBwb2ludGVyIHRvIHRoZSB0b3Agb2YgdGhlIG1pYiB0cmVlIHRoYXQgd2UncmUKICAgICAqIHJlZ2lzdGVyaW5nIHVuZGVybmVhdGguIAogICAgICovCiAgICBvaWQgICAgICAgICAgICAgZGlza2lvX3ZhcmlhYmxlc19vaWRbXSA9CiAgICAgICAgeyAxLCAzLCA2LCAxLCA0LCAxLCAyMDIxLCAxMywgMTUsIDEsIDEgfTsKCiAgICAvKgogICAgICogcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGFnZW50IHRvIGhhbmRsZSBvdXIgbWliIHRyZWUKICAgICAqIAogICAgICogVGhpcyBpcyBhIG1hY3JvIGRlZmluZWQgaW4gLi4vLi4vc25tcF92YXJzLmguICBUaGUgYXJndW1lbnRzIGFyZToKICAgICAqIAogICAgICogZGVzY3I6ICAgQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgbWliIGdyb3VwIGJlaW5nIGxvYWRlZC4KICAgICAqIHZhcjogICAgIFRoZSB2YXJpYWJsZSBzdHJ1Y3R1cmUgdG8gbG9hZC4KICAgICAqIHZhcnR5cGU6IFRoZSB2YXJpYWJsZSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgaXQgKHZhcmlhYmxlMiwgdmFyaWFibGU0LCAuLi4pCiAgICAgKiB0aGVvaWQ6ICBBICppbml0aWFsaXplZCogKmV4YWN0IGxlbmd0aCogb2lkIHBvaW50ZXIuCiAgICAgKiAoc2l6ZW9mKHRoZW9pZCkgKm11c3QqIHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzISkgIAogICAgICovCiAgICBSRUdJU1RFUl9NSUIoImRpc2tpbyIsIGRpc2tpb192YXJpYWJsZXMsIHZhcmlhYmxlMiwKICAgICAgICAgICAgICAgICBkaXNraW9fdmFyaWFibGVzX29pZCk7CgojaWZkZWYgc29sYXJpczIKICAgIGtjID0ga3N0YXRfb3BlbigpOwoKICAgIGlmIChrYyA9PSBOVUxMKQogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJkaXNraW86IENvdWxkbid0IG9wZW4ga3N0YXRcbiIpOwojZW5kaWYKCiNpZmRlZiBkYXJ3aW4KICAgIC8qCiAgICAgKiBHZXQgdGhlIEkvTyBLaXQgY29tbXVuaWNhdGlvbiBoYW5kbGUuCiAgICAgKi8KICAgIElPTWFzdGVyUG9ydChib290c3RyYXBfcG9ydCwgJm1hc3RlclBvcnQpOwojZW5kaWYKCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAvKgogICAgICogaW5pdGlhbGl6ZSB2YWx1ZXMgdG8gZ2F0aGVyIGluZm9ybWF0aW9uIG9uIGZpcnN0IHJlcXVlc3QKICAgICAqLwogICAgcHNfbnVtZGlza3MgPSAwOwogICAgcHNfZGlzayA9IE5VTEw7CiNlbmRpZgoKI2lmIGRlZmluZWQgKEhBVkVfR0VUREVWUykgfHwgZGVmaW5lZChIQVZFX0RFVlNUQVRfR0VUREVWUykgfHwgZGVmaW5lZChsaW51eCkKICAgIGRldmxhX2dldHN0YXRzKDAsIE5VTEwpOwogICAgLyogY29sbGVjdCBMQSBkYXRhIHJlZ3VsYXJseSAqLwogICAgc25tcF9hbGFybV9yZWdpc3RlcihESVNLSU9fU0FNUExFX0lOVEVSVkFMLCBTQV9SRVBFQVQsIGRldmxhX2dldHN0YXRzLCBOVUxMKTsKI2VuZGlmCgoKI2lmZGVmIGxpbnV4CiAgICBjaGFyICphcHAgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9jb25maWcoQVNOX0JPT0xFQU4sIGFwcCwgImRpc2tpb19leGNsdWRlX2ZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX0RJU0tJT19OT19GRCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX2NvbmZpZyhBU05fQk9PTEVBTiwgYXBwLCAiZGlza2lvX2V4Y2x1ZGVfbG9vcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9ESVNLSU9fTk9fTE9PUCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX2NvbmZpZyhBU05fQk9PTEVBTiwgYXBwLCAiZGlza2lvX2V4Y2x1ZGVfcmFtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX0RJU0tJT19OT19SQU0pOwoKICAgICAgICAvKiBvciBwb3NzaWJsZSBhbiBleGNsdXNpb24gcGF0dGVybj8gKi8KCiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfQVBQTElDQVRJT04sCgkgICAgICAgICAgICAgICAgICAgU05NUERfQ0FMTEJBQ0tfUFJFX1VQREFURV9DT05GSUcsCgkgICAgICAgICAgICAgICAgICAgZGlza2lvX2ZyZWVfY29uZmlnLCBOVUxMKTsKCiNlbmRpZgp9CgojaWZkZWYgbGludXgKLyogdG8gZG86IG1ha2Ugc3VyZSBkaXNraW9fZnJlZV9jb25maWcoKSBnZXRzIGludm9rZWQgdXBvbiBTSUdIVVAuICovCnN0YXRpYyBpbnQKZGlza2lvX2ZyZWVfY29uZmlnKGludCBtYWpvciwgaW50IG1pbm9yLCB2b2lkICpzZXJ2ZXJhcmcsIHZvaWQgKmNsaWVudGFyZykKewogICAgREVCVUdNU0dUTCgoImRpc2tpbyIsICJmcmVlIGNvbmZpZyAlZFxuIiwKCQluZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCgkJCQkgICAgICAgTkVUU05NUF9EU19BR0VOVF9ESVNLSU9fTk9fUkFNKSkpOwogICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJICAgTkVUU05NUF9EU19BR0VOVF9ESVNLSU9fTk9fRkQsICAgMCk7CiAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICBORVRTTk1QX0RTX0FHRU5UX0RJU0tJT19OT19MT09QLCAwKTsKICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfRElTS0lPX05PX1JBTSwgIDApOwogICAgcmV0dXJuIDA7Cn0KI2VuZGlmCgoKI2lmZGVmIHNvbGFyaXMyCmludApnZXRfZGlzayhpbnQgZGlza25yKQp7CiAgICB0aW1lX3QgICAgICAgICAgbm93OwogICAgaW50ICAgICAgICAgICAgIGkgPSAwOwogICAga3N0YXRfdCAqdGtzcDsKCiAgICBub3cgPSB0aW1lKE5VTEwpOwogICAgaWYgKGRpc2tuciA9PSBjYWNoZV9kaXNrbnIgJiYgY2FjaGVfdGltZSArIENBQ0hFX1RJTUVPVVQgPiBub3cpIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvKgogICAgICogY291bGQgYmUgb3B0aW1pY2VkIGJ5IGNoZWNraW5nIGlmIGNhY2hlX2Rpc2tucjw9ZGlza25yCiAgICAgKiBpZiBzbywganVzdCByZXJlYWQgdGhlIGRhdGEgLSBub3QgZ29pbmcgdGhyb3VnaCB0aGUgd2hvbGUgY2hhaW4KICAgICAqIGZyb20ga2MtPmtjX2NoYWluIAogICAgICovCgogICAgZm9yICh0a3NwID0ga2MtPmtjX2NoYWluOyB0a3NwICE9IE5VTEw7IHRrc3AgPSB0a3NwLT5rc19uZXh0KSB7CiAgICAgICAgaWYgKHRrc3AtPmtzX3R5cGUgPT0gS1NUQVRfVFlQRV9JTwogICAgICAgICAgICAmJiAhc3RyY21wKHRrc3AtPmtzX2NsYXNzLCAiZGlzayIpKSB7CiAgICAgICAgICAgIGlmIChpID09IGRpc2tucikgewogICAgICAgICAgICAgICAgaWYgKGtzdGF0X3JlYWQoa2MsIHRrc3AsICZraW8pID09IC0xKQogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJkaXNraW86IGtzdGF0X3JlYWQgZmFpbGVkXG4iKTsKCQlrc3AgPSB0a3NwOwogICAgICAgICAgICAgICAgY2FjaGVfdGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIGNhY2hlX2Rpc2tuciA9IGRpc2tucjsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0KCgp1X2NoYXIgICAgICAgICAqCnZhcl9kaXNraW8oc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIC8qCiAgICAgKiBkZWZpbmUgYW55IHZhcmlhYmxlcyB3ZSBtaWdodCByZXR1cm4gYXMgc3RhdGljISAKICAgICAqLwogICAgc3RhdGljIGxvbmcgICAgIGxvbmdfcmV0OwogICAgc3RhdGljIHN0cnVjdCBjb3VudGVyNjQgYzY0X3JldDsKCiAgICBpZiAoaGVhZGVyX3NpbXBsZV90YWJsZQogICAgICAgICh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kLCBNQVhfRElTS1MpKQogICAgICAgIHJldHVybiBOVUxMOwoKCiAgICBpZiAoZ2V0X2Rpc2sobmFtZVsqbGVuZ3RoIC0gMV0gLSAxKSA9PSAwKQogICAgICAgIHJldHVybiBOVUxMOwoKCiAgICAvKgogICAgICogV2UgY2FuIG5vdyBzaW1wbHkgdGVzdCBvbiB2cCdzIG1hZ2ljIG51bWJlciwgZGVmaW5lZCBpbiBkaXNraW8uaCAKICAgICAqLwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgRElTS0lPX0lOREVYOgogICAgICAgIGxvbmdfcmV0ID0gKGxvbmcpIG5hbWVbKmxlbmd0aCAtIDFdOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19ERVZJQ0U6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oa3NwLT5rc19uYW1lKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBrc3AtPmtzX25hbWU7CiAgICBjYXNlIERJU0tJT19OUkVBRDoKICAgICAgICBsb25nX3JldCA9ICh1aW50MzJfdCkga2lvLm5yZWFkOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19OV1JJVFRFTjoKICAgICAgICBsb25nX3JldCA9ICh1aW50MzJfdCkga2lvLm53cml0dGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19OUkVBRFg6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2Yoc3RydWN0IGNvdW50ZXI2NCk7CiAgICAgICAgYzY0X3JldC5sb3cgPSBraW8ubnJlYWQgJiAweGZmZmZmZmZmOzsKICAgICAgICBjNjRfcmV0LmhpZ2ggPSBraW8ubnJlYWQgPj4gMzI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBjNjRfcmV0OwogICAgY2FzZSBESVNLSU9fTldSSVRURU5YOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBjb3VudGVyNjQpOwogICAgICAgIGM2NF9yZXQubG93ID0ga2lvLm53cml0dGVuICYgMHhmZmZmZmZmZjs7CiAgICAgICAgYzY0X3JldC5oaWdoID0ga2lvLm53cml0dGVuID4+IDMyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYzY0X3JldDsKICAgIGNhc2UgRElTS0lPX1JFQURTOgogICAgICAgIGxvbmdfcmV0ID0gKHVpbnQzMl90KSBraW8ucmVhZHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKICAgIGNhc2UgRElTS0lPX1dSSVRFUzoKICAgICAgICBsb25nX3JldCA9ICh1aW50MzJfdCkga2lvLndyaXRlczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRVJST1JfTVNHKCJkaXNraW8uYzogZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoaXMgcmVxdWVzdC4iKTsKICAgIH0KICAgIC8qCiAgICAgKiBpZiB3ZSBmYWxsIHRvIGhlcmUsIGZhaWwgYnkgcmV0dXJuaW5nIE5VTEwgCiAgICAgKi8KICAgIHJldHVybiBOVUxMOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCiNpZiBkZWZpbmVkKGJzZGkzKSB8fCBkZWZpbmVkKGJzZGk0KQpzdGF0aWMgaW50ICAgICAgbmRpc2s7CnN0YXRpYyBzdHJ1Y3QgZGlza3N0YXRzICpkazsKc3RhdGljIGNoYXIgICAqKmRrbmFtZTsKCnN0YXRpYyBpbnQKZ2V0c3RhdHModm9pZCkKewogICAgdGltZV90ICAgICAgICAgIG5vdzsKICAgIGludCAgICAgICAgICAgICBtaWJbMl07CiAgICBjaGFyICAgICAgICAgICAqdCwgKnRwOwogICAgc2l6ZV90ICAgICAgICAgIHNpemUsIGRrbl9zaXplOwogICAgaW50ICAgICAgICAgICAgIGk7CgogICAgbm93ID0gdGltZShOVUxMKTsKICAgIGlmIChjYWNoZV90aW1lICsgQ0FDSEVfVElNRU9VVCA+IG5vdykgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgbWliWzBdID0gQ1RMX0hXOwogICAgbWliWzFdID0gSFdfRElTS1NUQVRTOwogICAgc2l6ZSA9IDA7CiAgICBpZiAoc3lzY3RsKG1pYiwgMiwgTlVMTCwgJnNpemUsIE5VTEwsIDApIDwgMCkgewogICAgICAgIHBlcnJvcigiQ2FuJ3QgZ2V0IHNpemUgb2YgSFdfRElTS1NUQVRTIG1pYiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKG5kaXNrICE9IHNpemUgLyBzaXplb2YoKmRrKSkgewogICAgICAgIGlmIChkaykKICAgICAgICAgICAgZnJlZShkayk7CiAgICAgICAgaWYgKGRrbmFtZSkgewogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmRpc2s7IGkrKykKICAgICAgICAgICAgICAgIGlmIChka25hbWVbaV0pCiAgICAgICAgICAgICAgICAgICAgZnJlZShka25hbWVbaV0pOwogICAgICAgICAgICBmcmVlKGRrbmFtZSk7CiAgICAgICAgfQogICAgICAgIG5kaXNrID0gc2l6ZSAvIHNpemVvZigqZGspOwogICAgICAgIGlmIChuZGlzayA9PSAwKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBka25hbWUgPSBtYWxsb2MobmRpc2sgKiBzaXplb2YoY2hhciAqKSk7CiAgICAgICAgbWliWzBdID0gQ1RMX0hXOwogICAgICAgIG1pYlsxXSA9IEhXX0RJU0tOQU1FUzsKICAgICAgICBpZiAoc3lzY3RsKG1pYiwgMiwgTlVMTCwgJmRrbl9zaXplLCBOVUxMLCAwKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJDYW4ndCBnZXQgc2l6ZSBvZiBIV19ESVNLTkFNRVMgbWliIik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICB0cCA9IHQgPSBtYWxsb2MoZGtuX3NpemUpOwogICAgICAgIGlmIChzeXNjdGwobWliLCAyLCB0LCAmZGtuX3NpemUsIE5VTEwsIDApIDwgMCkgewogICAgICAgICAgICBwZXJyb3IoIkNhbid0IGdldCBzaXplIG9mIEhXX0RJU0tOQU1FUyBtaWIiKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZGlzazsgaSsrKSB7CiAgICAgICAgICAgIGRrbmFtZVtpXSA9IHN0cmR1cCh0cCk7CiAgICAgICAgICAgIHRwICs9IHN0cmxlbih0cCkgKyAxOwogICAgICAgIH0KICAgICAgICBmcmVlKHQpOwogICAgICAgIGRrID0gbWFsbG9jKG5kaXNrICogc2l6ZW9mKCpkaykpOwogICAgfQogICAgbWliWzBdID0gQ1RMX0hXOwogICAgbWliWzFdID0gSFdfRElTS1NUQVRTOwogICAgaWYgKHN5c2N0bChtaWIsIDIsIGRrLCAmc2l6ZSwgTlVMTCwgMCkgPCAwKSB7CiAgICAgICAgcGVycm9yKCJDYW4ndCBnZXQgSFdfRElTS1NUQVRTIG1pYiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgY2FjaGVfdGltZSA9IG5vdzsKICAgIHJldHVybiAxOwp9Cgp1X2NoYXIgICAgICAgICAqCnZhcl9kaXNraW8oc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIHVuc2lnbmVkIGludCAgICBpbmR4OwoKICAgIGlmIChnZXRzdGF0cygpID09IDApCiAgICAgICAgcmV0dXJuIDA7CgogICAgaWYgKGhlYWRlcl9zaW1wbGVfdGFibGUKICAgICAgICAodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCwgbmRpc2spKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGluZHggPSAodW5zaWduZWQgaW50KSAobmFtZVsqbGVuZ3RoIC0gMV0gLSAxKTsKICAgIGlmIChpbmR4ID49IG5kaXNrKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIERJU0tJT19JTkRFWDoKICAgICAgICBsb25nX3JldCA9IChsb25nKSBpbmR4ICsgMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fREVWSUNFOgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKGRrbmFtZVtpbmR4XSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZGtuYW1lW2luZHhdOwogICAgY2FzZSBESVNLSU9fTlJFQUQ6CiAgICAgICAgbG9uZ19yZXQgPQogICAgICAgICAgICAoc2lnbmVkIGxvbmcpIChka1tpbmR4XS5ka19zZWN0b3JzICogZGtbaW5keF0uZGtfc2Vjc2l6ZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKICAgIGNhc2UgRElTS0lPX05XUklUVEVOOgogICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgIC8qIFNpZ2guLi4gQlNEIGRvZXNuJ3Qga2VlcCBzZXBlcmF0ZSB0cmFjayAqLwogICAgY2FzZSBESVNLSU9fUkVBRFM6CiAgICAgICAgbG9uZ19yZXQgPSAoc2lnbmVkIGxvbmcpIGRrW2luZHhdLmRrX3hmZXJzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19XUklURVM6CiAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgLyogU2lnaC4uLiBCU0QgZG9lc24ndCBrZWVwIHNlcGVyYXRlIHRyYWNrICovCgogICAgZGVmYXVsdDoKICAgICAgICBFUlJPUl9NU0coImRpc2tpby5jOiBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhpcyByZXF1ZXN0LiIpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBic2RpICovCgojaWYgZGVmaW5lZChvcGVuYnNkNCkKc3RhdGljIGludCAgICAgIG5kaXNrOwpzdGF0aWMgc3RydWN0IGRpc2tzdGF0cyAqZGs7CnN0YXRpYyBjaGFyICAgKipka25hbWU7CgpzdGF0aWMgaW50CmdldHN0YXRzKHZvaWQpCnsKICAgIHRpbWVfdCAgICAgICAgICBub3c7CiAgICBpbnQgICAgICAgICAgICAgbWliWzJdOwogICAgY2hhciAgICAgICAgICAgKnQsICp0cCwqdGU7CiAgICBzaXplX3QgICAgICAgICAgc2l6ZSwgZGtuX3NpemU7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICBub3cgPSB0aW1lKE5VTEwpOwogICAgaWYgKGNhY2hlX3RpbWUgKyBDQUNIRV9USU1FT1VUID4gbm93KSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBtaWJbMF0gPSBDVExfSFc7CiAgICBtaWJbMV0gPSBIV19ESVNLU1RBVFM7CiAgICBzaXplID0gMDsKICAgIGlmIChzeXNjdGwobWliLCAyLCBOVUxMLCAmc2l6ZSwgTlVMTCwgMCkgPCAwKSB7CiAgICAgICAgcGVycm9yKCJDYW4ndCBnZXQgc2l6ZSBvZiBIV19ESVNLU1RBVFMgbWliIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAobmRpc2sgIT0gc2l6ZSAvIHNpemVvZigqZGspKSB7CiAgICAgICAgaWYgKGRrKQogICAgICAgICAgICBmcmVlKGRrKTsKICAgICAgICBpZiAoZGtuYW1lKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZGlzazsgaSsrKQogICAgICAgICAgICAgICAgaWYgKGRrbmFtZVtpXSkKICAgICAgICAgICAgICAgICAgICBmcmVlKGRrbmFtZVtpXSk7CiAgICAgICAgICAgIGZyZWUoZGtuYW1lKTsKICAgICAgICB9CiAgICAgICAgbmRpc2sgPSBzaXplIC8gc2l6ZW9mKCpkayk7CiAgICAgICAgaWYgKG5kaXNrID09IDApCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGRrbmFtZSA9IG1hbGxvYyhuZGlzayAqIHNpemVvZihjaGFyICopKTsKICAgICAgICBtaWJbMF0gPSBDVExfSFc7CiAgICAgICAgbWliWzFdID0gSFdfRElTS05BTUVTOwogICAgICAgIGlmIChzeXNjdGwobWliLCAyLCBOVUxMLCAmZGtuX3NpemUsIE5VTEwsIDApIDwgMCkgewogICAgICAgICAgICBwZXJyb3IoIkNhbid0IGdldCBzaXplIG9mIEhXX0RJU0tOQU1FUyBtaWIiKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHRlID0gdHAgPSB0ID0gbWFsbG9jKGRrbl9zaXplKTsKICAgICAgICBpZiAoc3lzY3RsKG1pYiwgMiwgdCwgJmRrbl9zaXplLCBOVUxMLCAwKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJDYW4ndCBnZXQgc2l6ZSBvZiBIV19ESVNLTkFNRVMgbWliIik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmRpc2s7IGkrKykgewoJICAgIHdoaWxlICh0ZS10IDwgZGtuX3NpemUgJiYgKnRlICE9ICcsJykgdGUrKzsKCSAgICAqdGUrKyA9ICdcMCc7CiAgICAgICAgICAgIGRrbmFtZVtpXSA9IHN0cmR1cCh0cCk7CiAgICAgICAgICAgIHRwID0gdGU7CiAgICAgICAgfQogICAgICAgIGZyZWUodCk7CiAgICAgICAgZGsgPSBtYWxsb2MobmRpc2sgKiBzaXplb2YoKmRrKSk7CiAgICB9CiAgICBtaWJbMF0gPSBDVExfSFc7CiAgICBtaWJbMV0gPSBIV19ESVNLU1RBVFM7CiAgICBpZiAoc3lzY3RsKG1pYiwgMiwgZGssICZzaXplLCBOVUxMLCAwKSA8IDApIHsKICAgICAgICBwZXJyb3IoIkNhbid0IGdldCBIV19ESVNLU1RBVFMgbWliIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBjYWNoZV90aW1lID0gbm93OwogICAgcmV0dXJuIDE7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX2Rpc2tpbyhzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgc3RhdGljIGxvbmcgICAgIGxvbmdfcmV0OwogICAgc3RhdGljIHN0cnVjdCBjb3VudGVyNjQgYzY0X3JldDsKICAgIHVuc2lnbmVkIGludCAgICBpbmR4OwoKICAgIGlmIChnZXRzdGF0cygpID09IDApCiAgICAgICAgcmV0dXJuIDA7CgogICAgaWYgKGhlYWRlcl9zaW1wbGVfdGFibGUKICAgICAgICAodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCwgbmRpc2spKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGluZHggPSAodW5zaWduZWQgaW50KSAobmFtZVsqbGVuZ3RoIC0gMV0gLSAxKTsKICAgIGlmIChpbmR4ID49IG5kaXNrKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIERJU0tJT19JTkRFWDoKICAgICAgICBsb25nX3JldCA9IChsb25nKSBpbmR4ICsgMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fREVWSUNFOgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKGRrbmFtZVtpbmR4XSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZGtuYW1lW2luZHhdOwogICAgY2FzZSBESVNLSU9fTlJFQUQ6CiAgICAgICAgbG9uZ19yZXQgPSAodW5zaWduZWQgbG9uZykgKGRrW2luZHhdLmRzX3JieXRlcykgJiAweGZmZmZmZmZmOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19OV1JJVFRFTjoKICAgICAgICBsb25nX3JldCA9ICh1bnNpZ25lZCBsb25nKSAoZGtbaW5keF0uZHNfd2J5dGVzKSAmIDB4ZmZmZmZmZmY7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKICAgIGNhc2UgRElTS0lPX1JFQURTOgogICAgICAgIGxvbmdfcmV0ID0gKHVuc2lnbmVkIGxvbmcpIGRrW2luZHhdLmRzX3J4ZmVyICYgMHhmZmZmZmZmZjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fV1JJVEVTOgogICAgICAgIGxvbmdfcmV0ID0gKHVuc2lnbmVkIGxvbmcpIGRrW2luZHhdLmRzX3d4ZmVyICYgMHhmZmZmZmZmZjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fTlJFQURYOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBjb3VudGVyNjQpOwogICAgICAgIGM2NF9yZXQubG93ID0gZGtbaW5keF0uZHNfcmJ5dGVzICYgMHhmZmZmZmZmZjsKICAgICAgICBjNjRfcmV0LmhpZ2ggPSBka1tpbmR4XS5kc19yYnl0ZXMgPj4gMzI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBjNjRfcmV0OwogICAgY2FzZSBESVNLSU9fTldSSVRURU5YOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBjb3VudGVyNjQpOwogICAgICAgIGM2NF9yZXQubG93ID0gZGtbaW5keF0uZHNfcmJ5dGVzICYgMHhmZmZmZmZmZjsKICAgICAgICBjNjRfcmV0LmhpZ2ggPSBka1tpbmR4XS5kc19yYnl0ZXMgPj4gMzI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBjNjRfcmV0OwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRVJST1JfTVNHKCJkaXNraW8uYzogZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoaXMgcmVxdWVzdC4iKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BlbmJzZCAqLwoKI2lmZGVmIF9fTmV0QlNEX18KI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4Kc3RhdGljIGludCAgICAgIG5kaXNrOwojaWZkZWYgSFdfSU9TVEFUTkFNRVMKc3RhdGljIGludCBubWliWzJdID0ge0NUTF9IVywgSFdfSU9TVEFUTkFNRVN9OwojZWxzZQpzdGF0aWMgaW50IG5taWJbMl0gPSB7Q1RMX0hXLCBIV19ESVNLTkFNRVN9OwojZW5kaWYKI2lmZGVmIEhXX0RJU0tTVEFUUwojaW5jbHVkZSA8c3lzL2Rpc2suaD4Kc3RhdGljIGludCBkbWliWzNdID0ge0NUTF9IVywgSFdfRElTS1NUQVRTLCBzaXplb2Yoc3RydWN0IGRpc2tfc3lzY3RsKX07CnN0YXRpYyBzdHJ1Y3QgZGlza19zeXNjdGwgKmRrOwojZW5kaWYKI2lmZGVmIEhXX0lPU1RBVFMKI2luY2x1ZGUgPHN5cy9pb3N0YXQuaD4Kc3RhdGljIGludCBkbWliWzNdID0ge0NUTF9IVywgSFdfSU9TVEFUUywgc2l6ZW9mKHN0cnVjdCBpb19zeXNjdGwpfTsKc3RhdGljIHN0cnVjdCBpb19zeXNjdGwgKmRrOwojZW5kaWYKc3RhdGljIGNoYXIgICAqKmRrbmFtZTsKCnN0YXRpYyBpbnQKZ2V0c3RhdHModm9pZCkKewogICAgdGltZV90ICAgICAgICAgIG5vdzsKICAgIGNoYXIgICAgICAgICAgICp0LCAqdHA7CiAgICBzaXplX3QgICAgICAgICAgc2l6ZSwgZGtuX3NpemU7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICBub3cgPSB0aW1lKE5VTEwpOwogICAgaWYgKGNhY2hlX3RpbWUgKyBDQUNIRV9USU1FT1VUID4gbm93KSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBzaXplID0gMDsKICAgIGlmIChzeXNjdGwoZG1pYiwgMywgTlVMTCwgJnNpemUsIE5VTEwsIDApIDwgMCkgewogICAgICAgIHBlcnJvcigiQ2FuJ3QgZ2V0IHNpemUgb2YgSFdfRElTS1NUQVRTL0hXX0lPU1RBVFMgbWliIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAobmRpc2sgIT0gc2l6ZSAvIGRtaWJbMl0pIHsKICAgICAgICBpZiAoZGspCiAgICAgICAgICAgIGZyZWUoZGspOwogICAgICAgIGlmIChka25hbWUpIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5kaXNrOyBpKyspCiAgICAgICAgICAgICAgICBpZiAoZGtuYW1lW2ldKQogICAgICAgICAgICAgICAgICAgIGZyZWUoZGtuYW1lW2ldKTsKICAgICAgICAgICAgZnJlZShka25hbWUpOwogICAgICAgIH0KICAgICAgICBuZGlzayA9IHNpemUgLyBkbWliWzJdOwogICAgICAgIGlmIChuZGlzayA9PSAwKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBka25hbWUgPSBtYWxsb2MobmRpc2sgKiBzaXplb2YoY2hhciAqKSk7CiAgICAgICAgZGtuX3NpemUgPSAwOwogICAgICAgIGlmIChzeXNjdGwobm1pYiwgMiwgTlVMTCwgJmRrbl9zaXplLCBOVUxMLCAwKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJDYW4ndCBnZXQgc2l6ZSBvZiBIV19ESVNLTkFNRVMgbWliIik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICB0ID0gbWFsbG9jKGRrbl9zaXplKTsKICAgICAgICBpZiAoc3lzY3RsKG5taWIsIDIsIHQsICZka25fc2l6ZSwgTlVMTCwgMCkgPCAwKSB7CiAgICAgICAgICAgIHBlcnJvcigiQ2FuJ3QgZ2V0IHNpemUgb2YgSFdfRElTS05BTUVTIG1pYiIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMCwgdHAgPSBzdHJ0b2sodCwgIiAiKTsgdHAgJiYgaSA8IG5kaXNrOyBpKyssCgkgICAgdHAgPSBzdHJ0b2soTlVMTCwgIiAiKSkgewogICAgICAgICAgICBka25hbWVbaV0gPSBzdHJkdXAodHApOwogICAgICAgIH0KICAgICAgICBmcmVlKHQpOwogICAgICAgIGRrID0gbWFsbG9jKG5kaXNrICogc2l6ZW9mKCpkaykpOwogICAgfQogICAgaWYgKHN5c2N0bChkbWliLCAzLCBkaywgJnNpemUsIE5VTEwsIDApIDwgMCkgewogICAgICAgIHBlcnJvcigiQ2FuJ3QgZ2V0IEhXX0RJU0tTVEFUUy9IV19JT1NUQVRTIG1pYiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgY2FjaGVfdGltZSA9IG5vdzsKICAgIHJldHVybiAxOwp9Cgp1X2NoYXIgKgp2YXJfZGlza2lvKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBzdGF0aWMgbG9uZyAgICAgbG9uZ19yZXQ7CiAgICB1bnNpZ25lZCBpbnQgICAgaW5keDsKCiAgICBpZiAoZ2V0c3RhdHMoKSA9PSAwKQogICAgICAgIHJldHVybiAwOwoKICAgIGlmIChoZWFkZXJfc2ltcGxlX3RhYmxlCiAgICAgICAgKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QsIG5kaXNrKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgKG5hbWVbKmxlbmd0aCAtIDFdIC0gMSk7CiAgICBpZiAoaW5keCA+PSBuZGlzaykKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBESVNLSU9fSU5ERVg6CiAgICAgICAgbG9uZ19yZXQgPSAobG9uZykgaW5keCArIDE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIERJU0tJT19ERVZJQ0U6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oZGtuYW1lW2luZHhdKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBka25hbWVbaW5keF07CgogICAgY2FzZSBESVNLSU9fTlJFQUQ6CiNpZmRlZiBIV19ESVNLU1RBVFMKICAgICAJbG9uZ19yZXQgPSBka1tpbmR4XS5ka19yYnl0ZXM7CiNlbmRpZgojaWZkZWYgSFdfSU9TVEFUUwoJaWYgKGRrW2luZHhdLnR5cGUgPT0gSU9TVEFUX0RJU0spCgkgICAgbG9uZ19yZXQgPSBka1tpbmR4XS5yYnl0ZXM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBESVNLSU9fTldSSVRURU46CiNpZmRlZiBIV19ESVNLU1RBVFMKICAgICAJbG9uZ19yZXQgPSBka1tpbmR4XS5ka193Ynl0ZXM7CiNlbmRpZgojaWZkZWYgSFdfSU9TVEFUUwoJaWYgKGRrW2luZHhdLnR5cGUgPT0gSU9TVEFUX0RJU0spCgkgICAgbG9uZ19yZXQgPSBka1tpbmR4XS53Ynl0ZXM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBESVNLSU9fUkVBRFM6CiNpZmRlZiBIV19ESVNLU1RBVFMKICAgICAJbG9uZ19yZXQgPSBka1tpbmR4XS5ka19yeGZlcjsKI2VuZGlmCiNpZmRlZiBIV19JT1NUQVRTCglpZiAoZGtbaW5keF0udHlwZSA9PSBJT1NUQVRfRElTSykKCSAgICBsb25nX3JldCA9IGRrW2luZHhdLnJ4ZmVyOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgRElTS0lPX1dSSVRFUzoKI2lmZGVmIEhXX0RJU0tTVEFUUwogICAgIAlsb25nX3JldCA9IGRrW2luZHhdLmRrX3d4ZmVyOwojZW5kaWYKI2lmZGVmIEhXX0lPU1RBVFMKCWlmIChka1tpbmR4XS50eXBlID09IElPU1RBVF9ESVNLKQoJICAgIGxvbmdfcmV0ID0gZGtbaW5keF0ud3hmZXI7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgZGVmYXVsdDoKICAgICAgICBFUlJPUl9NU0coImRpc2tpby5jOiBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhpcyByZXF1ZXN0LiIpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KI2VuZGlmIC8qIF9fTmV0QlNEX18gKi8KCiNpZiBkZWZpbmVkKEhBVkVfR0VUREVWUykgfHwgZGVmaW5lZChIQVZFX0RFVlNUQVRfR0VUREVWUykKCi8qIGRpc2sgbG9hZCBhdmVyYWdlIHBhdGNoIGJ5IFJvamVyICovCgpzdHJ1Y3QgZGV2X2xhIHsKI2lmIEhBVkVfREVWU1RBVF9HRVRERVZTCiAgICAgICAgc3RydWN0IGJpbnRpbWUgcHJldjsKI2Vsc2UKICAgICAgICBzdHJ1Y3QgdGltZXZhbCBwcmV2OwojZW5kaWYKICAgICAgICBkb3VibGUgbGExLGxhNSxsYTE1OwogICAgICAgIGNoYXIgbmFtZVtERVZTVEFUX05BTUVfTEVOKzVdOwogICAgICAgIH07CgpzdGF0aWMgc3RydWN0IGRldl9sYSAqZGV2bG9hZHMgPSBOVUxMOwpzdGF0aWMgaW50IG5kZXZzID0gMDsKCiNpZiAhIEhBVkVfREVWU1RBVF9HRVRERVZTCmRvdWJsZSBkZXZsYV90aW1ldmFsX2RpZmYoc3RydWN0IHRpbWV2YWwgKnQxLCBzdHJ1Y3QgdGltZXZhbCAqdDIpIHsKCiAgICAgICAgZG91YmxlIGR0MSA9IChkb3VibGUpIHQxLT50dl9zZWMgKyAoZG91YmxlKSB0MS0+dHZfdXNlYyAqIDAuMDAwMDAxOwogICAgICAgIGRvdWJsZSBkdDIgPSAoZG91YmxlKSB0Mi0+dHZfc2VjICsgKGRvdWJsZSkgdDItPnR2X3VzZWMgKiAwLjAwMDAwMTsKCiAgICAgICAgcmV0dXJuIGR0Mi1kdDE7CgogICAgICAgIH0KI2VuZGlmCgp2b2lkIGRldmxhX2dldHN0YXRzKHVuc2lnbmVkIGludCByZWdubywgdm9pZCAqZHVtbXkpIHsKCiAgICAgICAgc3RhdGljIHN0cnVjdCBzdGF0aW5mbyAqbGFzdGF0ID0gTlVMTDsKICAgICAgICBpbnQgaTsKICAgICAgICBkb3VibGUgYnVzeV90aW1lLCBidXN5X3BlcmNlbnQ7CiAgICAgICAgc3RhdGljIGRvdWJsZSBleHBvbjEsIGV4cG9uNSwgZXhwb24xNTsKICAgICAgICBjaGFyIGN1cnJlbnRfbmFtZVtERVZTVEFUX05BTUVfTEVOKzVdOwoKCWlmIChsYXN0YXQgPT0gTlVMTCkgewoJICAgIGxhc3RhdCA9IChzdHJ1Y3Qgc3RhdGluZm8gKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RhdGluZm8pKTsKCSAgICBpZiAobGFzdGF0ICE9IE5VTEwpCgkJbGFzdGF0LT5kaW5mbyA9IChzdHJ1Y3QgZGV2aW5mbyAqKSBjYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpbmZvKSwgMSk7CgkgICAgaWYgKGxhc3RhdCA9PSBOVUxMIHx8IGxhc3RhdC0+ZGluZm8gPT0gTlVMTCkgewoJCSAgICBTTk1QX0ZSRUUobGFzdGF0KTsKCQkgICAgRVJST1JfTVNHKCJNZW1vcnkgYWxsb2MgZmFpbHVyZSAtIGRldmxhX2dldHN0YXRzKClcbiIpOwoJCSAgICByZXR1cm47CgkgICAgfQoJfQoKICAgICAgICBpZiAoKEdFVERFVlMobGFzdGF0KSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIEVSUk9SX01TRygiY2FuJ3QgZG8gZ2V0ZGV2cygpXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgaWYgKG5kZXZzICE9IDApIHsKICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgbmRldnM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihjdXJyZW50X25hbWUsIHNpemVvZihjdXJyZW50X25hbWUpLCAiJXMlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGF0LT5kaW5mby0+ZGV2aWNlc1tpXS5kZXZpY2VfbmFtZSwgbGFzdGF0LT5kaW5mby0+ZGV2aWNlc1tpXS51bml0X251bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoY3VycmVudF9uYW1lLCBkZXZsb2Fkc1tpXS5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kZXZzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGRldmxvYWRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgaWYgKG5kZXZzID09IDApIHsKICAgICAgICAgICAgICAgIG5kZXZzID0gbGFzdGF0LT5kaW5mby0+bnVtZGV2czsKICAgICAgICAgICAgICAgIGRldmxvYWRzID0gKHN0cnVjdCBkZXZfbGEgKikgbWFsbG9jKG5kZXZzICogc2l6ZW9mKHN0cnVjdCBkZXZfbGEpKTsKICAgICAgICAgICAgICAgIG1lbXNldChkZXZsb2FkcywgJ1wwJywgbmRldnMgKiBzaXplb2Yoc3RydWN0IGRldl9sYSkpOwogICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBuZGV2czsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRldmxvYWRzW2ldLmxhMSA9IGRldmxvYWRzW2ldLmxhNSA9IGRldmxvYWRzW2ldLmxhMTUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJmRldmxvYWRzW2ldLnByZXYsICZsYXN0YXQtPmRpbmZvLT5kZXZpY2VzW2ldLmJ1c3lfdGltZSwgc2l6ZW9mKGRldmxvYWRzW2ldLnByZXYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZGV2bG9hZHNbaV0ubmFtZSwgc2l6ZW9mKGRldmxvYWRzW2ldLm5hbWUpLCAiJXMlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGF0LT5kaW5mby0+ZGV2aWNlc1tpXS5kZXZpY2VfbmFtZSwgbGFzdGF0LT5kaW5mby0+ZGV2aWNlc1tpXS51bml0X251bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGV4cG9uMSAgPSBleHAoLSgoKGRvdWJsZSlESVNLSU9fU0FNUExFX0lOVEVSVkFMKSAvICgoZG91YmxlKTYwKSkpOwogICAgICAgICAgICAgICAgZXhwb241ICA9IGV4cCgtKCgoZG91YmxlKURJU0tJT19TQU1QTEVfSU5URVJWQUwpIC8gKChkb3VibGUpMzAwKSkpOwogICAgICAgICAgICAgICAgZXhwb24xNSA9IGV4cCgtKCgoZG91YmxlKURJU0tJT19TQU1QTEVfSU5URVJWQUwpIC8gKChkb3VibGUpOTAwKSkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICBmb3IgKGk9MDsgaTxuZGV2czsgaSsrKSB7CiNpZiBIQVZFX0RFVlNUQVRfR0VUREVWUwogICAgICAgICAgICAgICAgYnVzeV90aW1lID0gZGV2c3RhdF9jb21wdXRlX2V0aW1lKCZsYXN0YXQtPmRpbmZvLT5kZXZpY2VzW2ldLmJ1c3lfdGltZSwgJmRldmxvYWRzW2ldLnByZXYpOwojZWxzZQogICAgICAgICAgICAgICAgYnVzeV90aW1lID0gZGV2bGFfdGltZXZhbF9kaWZmKCZkZXZsb2Fkc1tpXS5wcmV2LCAmbGFzdGF0LT5kaW5mby0+ZGV2aWNlc1tpXS5idXN5X3RpbWUpOwojZW5kaWYKICAgICAgICAgICAgICAgIGlmICggYnVzeV90aW1lIDwgMCApCiAgICAgICAgICAgICAgICAgICAgYnVzeV90aW1lID0gMDsgICAvKiBBY2NvdW50IGZvciBwb3NzaWJsZSBGUCBsb3NzIG9mIHByZWNpc2lvbiBuZWFyIHplcm8gKi8KICAgICAgICAgICAgICAgIGJ1c3lfcGVyY2VudCA9IGJ1c3lfdGltZSAqIDEwMCAvIERJU0tJT19TQU1QTEVfSU5URVJWQUw7CiAgICAgICAgICAgICAgICBkZXZsb2Fkc1tpXS5sYTEgPSBkZXZsb2Fkc1tpXS5sYTEgKiBleHBvbjEgKyBidXN5X3BlcmNlbnQgKiAoMSAtIGV4cG9uMSk7Ci8qCQlmcHJpbnRmKHN0ZGVyciwgIiglZCkgJXM6IHVwZGF0ZSBsYTE9JS4ybGYlJVxuIiwgaSwgZGV2bG9hZHNbaV0ubmFtZSwgZXhwb24xKTsgKi8KICAgICAgICAgICAgICAgIGRldmxvYWRzW2ldLmxhNSA9IGRldmxvYWRzW2ldLmxhNSAqIGV4cG9uNSArIGJ1c3lfcGVyY2VudCAqICgxIC0gZXhwb241KTsKICAgICAgICAgICAgICAgIGRldmxvYWRzW2ldLmxhMTUgPSBkZXZsb2Fkc1tpXS5sYTE1ICogZXhwb24xNSArIGJ1c3lfcGVyY2VudCAqICgxIC0gZXhwb24xNSk7CiAgICAgICAgICAgICAgICBtZW1jcHkoJmRldmxvYWRzW2ldLnByZXYsICZsYXN0YXQtPmRpbmZvLT5kZXZpY2VzW2ldLmJ1c3lfdGltZSwgc2l6ZW9mKGRldmxvYWRzW2ldLnByZXYpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgfQoKLyogZW5kIG9mIGRpc2sgTEEgcGF0Y2ggKi8KCnN0YXRpYyBpbnQgICAgICBuZGlzazsKc3RhdGljIHN0cnVjdCBzdGF0aW5mbyAqc3RhdDsKRklMRSAgICAgICAgICAgKmZpbGU7CgpzdGF0aWMgaW50CmdldHN0YXRzKHZvaWQpCnsKICAgIHRpbWVfdCAgICAgICAgICBub3c7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICBub3cgPSB0aW1lKE5VTEwpOwogICAgaWYgKGNhY2hlX3RpbWUgKyBDQUNIRV9USU1FT1VUID4gbm93KSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoc3RhdCA9PSBOVUxMKSB7CiAgICAgICAgc3RhdCA9IChzdHJ1Y3Qgc3RhdGluZm8gKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RhdGluZm8pKTsKICAgICAgICBpZiAoc3RhdCAhPSBOVUxMKQogICAgICAgICAgICBzdGF0LT5kaW5mbyA9IChzdHJ1Y3QgZGV2aW5mbyAqKSBjYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpbmZvKSwgMSk7CiAgICAgICAgaWYgKHN0YXQgPT0gTlVMTCB8fCBzdGF0LT5kaW5mbyA9PSBOVUxMKSB7CgkJU05NUF9GUkVFKHN0YXQpOwogICAgICAgIAlFUlJPUl9NU0coIk1lbW9yeSBhbGxvYyBmYWlsdXJlIC0gZ2V0c3RhdHNcbiIpOwoJCXJldHVybiAxOwoJfQogICAgfQoKICAgIGlmIChHRVRERVZTKHN0YXQpID09IC0xKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBnZXQgZGV2aWNlczolc1xuIiwgZGV2c3RhdF9lcnJidWYpOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgbmRpc2sgPSBzdGF0LT5kaW5mby0+bnVtZGV2czsKICAgIC8qIEdyb3NzIGhhY2sgdG8gaW5jbHVkZSBkZXZpY2UgbnVtYmVycyBpbiB0aGUgZGV2aWNlIG5hbWUgYXJyYXkgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBuZGlzazsgaSsrKSB7CiAgICAgIGNoYXIgKmNwID0gc3RhdC0+ZGluZm8tPmRldmljZXNbaV0uZGV2aWNlX25hbWU7CiAgICAgIGludCBsZW4gPSBzdHJsZW4oY3ApOwogICAgICBpZiAobGVuID4gREVWU1RBVF9OQU1FX0xFTiAtIDMpCiAgICAgICAgbGVuIC09IDM7CiAgICAgIGNwICs9IGxlbjsKICAgICAgc3ByaW50ZihjcCwgIiVkIiwgc3RhdC0+ZGluZm8tPmRldmljZXNbaV0udW5pdF9udW1iZXIpOwogICAgfQogICAgY2FjaGVfdGltZSA9IG5vdzsKICAgIHJldHVybiAwOwp9Cgp1X2NoYXIgICAgICAgICAqCnZhcl9kaXNraW8oc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIHN0YXRpYyBzdHJ1Y3QgICBjb3VudGVyNjQgYzY0X3JldDsKICAgIGxvbmcgbG9uZyAgICAgICBsb25nbG9uZ19yZXQ7CiAgICB1bnNpZ25lZCBpbnQgICAgaW5keDsKCiAgICBpZiAoZ2V0c3RhdHMoKSA9PSAxKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgoKICAgIGlmIChoZWFkZXJfc2ltcGxlX3RhYmxlCiAgICAgICAgKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QsIG5kaXNrKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGluZHggPSAodW5zaWduZWQgaW50KSAobmFtZVsqbGVuZ3RoIC0gMV0gLSAxKTsKCiAgICBpZiAoaW5keCA+PSBuZGlzaykKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBESVNLSU9fSU5ERVg6CiAgICAgICAgbG9uZ19yZXQgPSAobG9uZykgaW5keCArIDE7OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19ERVZJQ0U6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oc3RhdC0+ZGluZm8tPmRldmljZXNbaW5keF0uZGV2aWNlX25hbWUpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIHN0YXQtPmRpbmZvLT5kZXZpY2VzW2luZHhdLmRldmljZV9uYW1lOwogICAgY2FzZSBESVNLSU9fTlJFQUQ6CiNpZiBIQVZFX0RFVlNUQVRfR0VUREVWUwogICAgICAgIGxvbmdfcmV0ID0gKHNpZ25lZCBsb25nKSBzdGF0LT5kaW5mby0+ZGV2aWNlc1tpbmR4XS5ieXRlc1tERVZTVEFUX1JFQURdOwojZWxzZQogICAgICAgIGxvbmdfcmV0ID0gKHNpZ25lZCBsb25nKSBzdGF0LT5kaW5mby0+ZGV2aWNlc1tpbmR4XS5ieXRlc19yZWFkOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fTldSSVRURU46CiNpZiBIQVZFX0RFVlNUQVRfR0VUREVWUwogICAgICAgIGxvbmdfcmV0ID0gKHNpZ25lZCBsb25nKSBzdGF0LT5kaW5mby0+ZGV2aWNlc1tpbmR4XS5ieXRlc1tERVZTVEFUX1dSSVRFXTsKI2Vsc2UKICAgICAgICBsb25nX3JldCA9IChzaWduZWQgbG9uZykgc3RhdC0+ZGluZm8tPmRldmljZXNbaW5keF0uYnl0ZXNfd3JpdHRlbjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKICAgIGNhc2UgRElTS0lPX05SRUFEWDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihzdHJ1Y3QgY291bnRlcjY0KTsKI2lmIEhBVkVfREVWU1RBVF9HRVRERVZTCiAgICAgICAgbG9uZ2xvbmdfcmV0ID0gc3RhdC0+ZGluZm8tPmRldmljZXNbaW5keF0uYnl0ZXNbREVWU1RBVF9SRUFEXTsKI2Vsc2UKICAgICAgICBsb25nbG9uZ19yZXQgPSBzdGF0LT5kaW5mby0+ZGV2aWNlc1tpbmR4XS5ieXRlc19yZWFkOwojZW5kaWYKICAgICAgICBjNjRfcmV0LmxvdyA9IGxvbmdsb25nX3JldCAmIDB4ZmZmZmZmZmY7CiAgICAgICAgYzY0X3JldC5oaWdoID0gbG9uZ2xvbmdfcmV0ID4+IDMyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYzY0X3JldDsKICAgIGNhc2UgRElTS0lPX05XUklUVEVOWDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihzdHJ1Y3QgY291bnRlcjY0KTsKI2lmIEhBVkVfREVWU1RBVF9HRVRERVZTCiAgICAgICAgbG9uZ2xvbmdfcmV0ID0gc3RhdC0+ZGluZm8tPmRldmljZXNbaW5keF0uYnl0ZXNbREVWU1RBVF9XUklURV07CiNlbHNlCiAgICAgICAgbG9uZ2xvbmdfcmV0ID0gc3RhdC0+ZGluZm8tPmRldmljZXNbaW5keF0uYnl0ZXNfd3JpdHRlbjsKI2VuZGlmCiAgICAgICAgYzY0X3JldC5sb3cgPSBsb25nbG9uZ19yZXQgJiAweGZmZmZmZmZmOwogICAgICAgIGM2NF9yZXQuaGlnaCA9IGxvbmdsb25nX3JldCA+PiAzMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGM2NF9yZXQ7CiAgICBjYXNlIERJU0tJT19SRUFEUzoKI2lmIEhBVkVfREVWU1RBVF9HRVRERVZTCiAgICAgICAgbG9uZ19yZXQgPSAoc2lnbmVkIGxvbmcpIHN0YXQtPmRpbmZvLT5kZXZpY2VzW2luZHhdLm9wZXJhdGlvbnNbREVWU1RBVF9SRUFEXTsKI2Vsc2UKICAgICAgICBsb25nX3JldCA9IChzaWduZWQgbG9uZykgc3RhdC0+ZGluZm8tPmRldmljZXNbaW5keF0ubnVtX3JlYWRzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fV1JJVEVTOgojaWYgSEFWRV9ERVZTVEFUX0dFVERFVlMKICAgICAgICBsb25nX3JldCA9IChzaWduZWQgbG9uZykgc3RhdC0+ZGluZm8tPmRldmljZXNbaW5keF0ub3BlcmF0aW9uc1tERVZTVEFUX1dSSVRFXTsKI2Vsc2UKICAgICAgICBsb25nX3JldCA9IChzaWduZWQgbG9uZykgc3RhdC0+ZGluZm8tPmRldmljZXNbaW5keF0ubnVtX3dyaXRlczsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKICAgIGNhc2UgRElTS0lPX0xBMToKCWxvbmdfcmV0ID0gZGV2bG9hZHNbaW5keF0ubGExOwoJcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKICAgIGNhc2UgRElTS0lPX0xBNToKICAgICAgICBsb25nX3JldCA9IGRldmxvYWRzW2luZHhdLmxhNTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fTEExNToKICAgICAgICBsb25nX3JldCA9IGRldmxvYWRzW2luZHhdLmxhMTU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBkZWZhdWx0OgogICAgICAgIEVSUk9SX01TRygiZGlza2lvLmM6IGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzIHJlcXVlc3QuIik7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWVic2Q0ICovCgoKI2lmZGVmIGxpbnV4CgojZGVmaW5lIERJU0tfSU5DUiAyCgp0eXBlZGVmIHN0cnVjdCBsaW51eF9kaXNraW8KewogICAgaW50IG1ham9yOwogICAgaW50ICBtaW5vcjsKICAgIHVuc2lnbmVkIGxvbmcgIGJsb2NrczsKICAgIGNoYXIgbmFtZVsyNTZdOwogICAgdW5zaWduZWQgbG9uZyAgcmlvOwogICAgdW5zaWduZWQgbG9uZyAgcm1lcmdlOwogICAgdW5zaWduZWQgbG9uZyAgcnNlY3Q7CiAgICB1bnNpZ25lZCBsb25nICBydXNlOwogICAgdW5zaWduZWQgbG9uZyAgd2lvOwogICAgdW5zaWduZWQgbG9uZyAgd21lcmdlOwogICAgdW5zaWduZWQgbG9uZyAgd3NlY3Q7CiAgICB1bnNpZ25lZCBsb25nICB3dXNlOwogICAgdW5zaWduZWQgbG9uZyAgcnVubmluZzsKICAgIHVuc2lnbmVkIGxvbmcgIHVzZTsKICAgIHVuc2lnbmVkIGxvbmcgIGF2ZXE7Cn0gbGludXhfZGlza2lvOwoKLyogZGlzayBsb2FkIGF2ZXJhZ2VzICovCnR5cGVkZWYgc3RydWN0IGxpbnV4X2Rpc2tpb19sYQp7CiAgICB1bnNpZ25lZCBsb25nIHVzZV9wcmV2OwogICAgZG91YmxlIGxhMSwgbGE1LCBsYTE1Owp9IGxpbnV4X2Rpc2tpb19sYTsKCnR5cGVkZWYgc3RydWN0IGxpbnV4X2Rpc2tpb19oZWFkZXIKewogICAgbGludXhfZGlza2lvKiBpbmRpY2VzOwogICAgaW50IGxlbmd0aDsKICAgIGludCBhbGxvYzsKfSBsaW51eF9kaXNraW9faGVhZGVyOwoKdHlwZWRlZiBzdHJ1Y3QgbGludXhfZGlza2lvX2xhX2hlYWRlcgp7CiAgICBsaW51eF9kaXNraW9fbGEgKiBpbmRpY2VzOyAgIAogICAgaW50IGxlbmd0aDsKfSBsaW51eF9kaXNraW9fbGFfaGVhZGVyOwoKc3RhdGljIGxpbnV4X2Rpc2tpb19oZWFkZXIgaGVhZDsKc3RhdGljIGxpbnV4X2Rpc2tpb19sYV9oZWFkZXIgbGFfaGVhZDsKCnZvaWQgZGV2bGFfZ2V0c3RhdHModW5zaWduZWQgaW50IHJlZ25vLCB2b2lkICogZHVtbXkpIHsKCiAgICBzdGF0aWMgZG91YmxlIGV4cG9uMSwgZXhwb241LCBleHBvbjE1OwogICAgZG91YmxlIGJ1c3lfdGltZSwgYnVzeV9wZXJjZW50OwogICAgaW50IGlkeDsKCiAgICBpZiAoZ2V0c3RhdHMoKSA9PSAxKSB7CiAgICAgICAgRVJST1JfTVNHKCJjYW4ndCBkbyBkaXNraW8gZ2V0c3RhdHMoKVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghbGFfaGVhZC5sZW5ndGgpIHsKICAgICAgICBsYV9oZWFkLmluZGljZXMgPSAobGludXhfZGlza2lvX2xhICopIG1hbGxvYyhoZWFkLmxlbmd0aCAqIHNpemVvZihsaW51eF9kaXNraW9fbGEpKTsKICAgICAgICBmb3IgKGlkeD0wOyBpZHg8aGVhZC5sZW5ndGg7IGlkeCsrKSB7CiAgICAgICAgICAgIGxhX2hlYWQuaW5kaWNlc1tpZHhdLmxhMSA9IGxhX2hlYWQuaW5kaWNlc1tpZHhdLmxhNSA9IGxhX2hlYWQuaW5kaWNlc1tpZHhdLmxhMTUgPSAwLjsgCiAgICAgICAgICAgIGxhX2hlYWQuaW5kaWNlc1tpZHhdLnVzZV9wcmV2ID0gaGVhZC5pbmRpY2VzW2lkeF0udXNlOwogICAgICAgIH0KICAgICAgICBsYV9oZWFkLmxlbmd0aCA9IGhlYWQubGVuZ3RoOwogICAgICAgIGV4cG9uMSA9IGV4cCgtKCgoZG91YmxlKURJU0tJT19TQU1QTEVfSU5URVJWQUwpIC8gKChkb3VibGUpNjApKSk7CiAgICAgICAgZXhwb241ID0gZXhwKC0oKChkb3VibGUpRElTS0lPX1NBTVBMRV9JTlRFUlZBTCkgLyAoKGRvdWJsZSkzMDApKSk7CiAgICAgICAgZXhwb24xNSA9IGV4cCgtKCgoZG91YmxlKURJU0tJT19TQU1QTEVfSU5URVJWQUwpIC8gKChkb3VibGUpOTAwKSkpOwogICAgfQogICAgZWxzZSBpZiAoaGVhZC5sZW5ndGggLSBsYV9oZWFkLmxlbmd0aCkgewogICAgICAgIGxhX2hlYWQuaW5kaWNlcyA9IChsaW51eF9kaXNraW9fbGEgKikgcmVhbGxvYyhsYV9oZWFkLmluZGljZXMsIGhlYWQubGVuZ3RoICogc2l6ZW9mKGxpbnV4X2Rpc2tpb19sYSkpOwogICAgICAgIGZvciAoaWR4PWxhX2hlYWQubGVuZ3RoOyBpZHg8aGVhZC5sZW5ndGg7IGlkeCsrKSB7CiAgICAgICAgICAgIGxhX2hlYWQuaW5kaWNlc1tpZHhdLmxhMSA9IGxhX2hlYWQuaW5kaWNlc1tpZHhdLmxhNSA9IGxhX2hlYWQuaW5kaWNlc1tpZHhdLmxhMTUgPSAwLjsgCiAgICAgICAgICAgIGxhX2hlYWQuaW5kaWNlc1tpZHhdLnVzZV9wcmV2ID0gaGVhZC5pbmRpY2VzW2lkeF0udXNlOwogICAgICAgIH0KICAgICAgICBsYV9oZWFkLmxlbmd0aCA9IGhlYWQubGVuZ3RoOwogICAgfQoKICAgIGZvciAoaWR4PTA7IGlkeDxoZWFkLmxlbmd0aDsgaWR4KyspIHsKICAgICAgICBidXN5X3RpbWUgPSBoZWFkLmluZGljZXNbaWR4XS51c2UgLSBsYV9oZWFkLmluZGljZXNbaWR4XS51c2VfcHJldjsKICAgICAgICBidXN5X3BlcmNlbnQgPSBidXN5X3RpbWUgKiAxMDAuIC8gKChkb3VibGUpIERJU0tJT19TQU1QTEVfSU5URVJWQUwpIC8gMTAwMC47CiAgICAgICAgbGFfaGVhZC5pbmRpY2VzW2lkeF0ubGExID0gbGFfaGVhZC5pbmRpY2VzW2lkeF0ubGExICogZXhwb24xICsgYnVzeV9wZXJjZW50ICogKDEuIC0gZXhwb24xKTsKICAgICAgICBsYV9oZWFkLmluZGljZXNbaWR4XS5sYTUgPSBsYV9oZWFkLmluZGljZXNbaWR4XS5sYTUgKiBleHBvbjUgKyBidXN5X3BlcmNlbnQgKiAoMS4gLSBleHBvbjUpOwogICAgICAgIGxhX2hlYWQuaW5kaWNlc1tpZHhdLmxhMTUgPSBsYV9oZWFkLmluZGljZXNbaWR4XS5sYTE1ICogZXhwb24xNSArIGJ1c3lfcGVyY2VudCAqICgxLiAtIGV4cG9uMTUpOwogICAgICAgIC8qCiAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiglZCkgdXBkYXRlIGxhMT0lZiBsYTU9JWYgbGExNT0lZlxuIiwKICAgICAgICAgIGlkeCwgbGFfaGVhZC5pbmRpY2VzW2lkeF0ubGExLCBsYV9oZWFkLmluZGljZXNbaWR4XS5sYTUsIGxhX2hlYWQuaW5kaWNlc1tpZHhdLmxhMTUpOyAgIAogICAgICAgICovCiAgICAgICAgbGFfaGVhZC5pbmRpY2VzW2lkeF0udXNlX3ByZXYgPSBoZWFkLmluZGljZXNbaWR4XS51c2U7CiAgICB9Cn0KCmludCBpc19leGNsdWRlZChjb25zdCBjaGFyICpuYW1lKQp7CiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9ESVNLSU9fTk9fRkQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICEoc3RybmNtcChuYW1lLCAiZmQiLCAyKSkpCiAgICAgICAgcmV0dXJuIDE7CiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9ESVNLSU9fTk9fTE9PUCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShzdHJuY21wKG5hbWUsICJsb29wIiwgNCkpKQogICAgICAgIHJldHVybiAxOwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfRElTS0lPX05PX1JBTSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShzdHJuY21wKG5hbWUsICJyYW0iLCAzKSkpCiAgICAgICAgcmV0dXJuIDE7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludApnZXRzdGF0cyh2b2lkKQp7CiAgICBGSUxFKiBwYXJ0czsKICAgIHRpbWVfdCBub3c7CiAgICAKICAgIG5vdyA9IHRpbWUoTlVMTCk7CiAgICBpZiAoY2FjaGVfdGltZSArIENBQ0hFX1RJTUVPVVQgPiBub3cpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoIWhlYWQuaW5kaWNlcykgewoJaGVhZC5hbGxvYyA9IERJU0tfSU5DUjsKCWhlYWQuaW5kaWNlcyA9IChsaW51eF9kaXNraW8gKiltYWxsb2MoaGVhZC5hbGxvYypzaXplb2YobGludXhfZGlza2lvKSk7CiAgICB9CiAgICBoZWFkLmxlbmd0aCAgPSAwOwoKICAgIG1lbXNldChoZWFkLmluZGljZXMsIDAsIGhlYWQuYWxsb2Mqc2l6ZW9mKGxpbnV4X2Rpc2tpbykpOwoKICAgIC8qIElzIHRoaXMgYSAyLjYga2VybmVsPyAqLwogICAgcGFydHMgPSBmb3BlbigiL3Byb2MvZGlza3N0YXRzIiwgInIiKTsKICAgIGlmIChwYXJ0cykgewoJY2hhciBidWZmZXJbMTAyNF07Cgl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgcGFydHMpKSB7CgkgICAgbGludXhfZGlza2lvKiBwVGVtcDsKCSAgICBpZiAoaGVhZC5sZW5ndGggPT0gaGVhZC5hbGxvYykgewoJCWhlYWQuYWxsb2MgKz0gRElTS19JTkNSOwoJCWhlYWQuaW5kaWNlcyA9IChsaW51eF9kaXNraW8gKilyZWFsbG9jKGhlYWQuaW5kaWNlcywgaGVhZC5hbGxvYypzaXplb2YobGludXhfZGlza2lvKSk7CgkgICAgfQoJICAgIHBUZW1wID0gJmhlYWQuaW5kaWNlc1toZWFkLmxlbmd0aF07CgkgICAgc3NjYW5mIChidWZmZXIsICIlZCAlZCIsICZwVGVtcC0+bWFqb3IsICZwVGVtcC0+bWlub3IpOwogCSAgICBpZiAoc3NjYW5mIChidWZmZXIsICIlZCAlZCAlcyAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1XG4iLAoJCSAgICAmcFRlbXAtPm1ham9yLCAmcFRlbXAtPm1pbm9yLCBwVGVtcC0+bmFtZSwKCQkgICAgJnBUZW1wLT5yaW8sICZwVGVtcC0+cm1lcmdlLCAmcFRlbXAtPnJzZWN0LCAmcFRlbXAtPnJ1c2UsCgkJICAgICZwVGVtcC0+d2lvLCAmcFRlbXAtPndtZXJnZSwgJnBUZW1wLT53c2VjdCwgJnBUZW1wLT53dXNlLAogCQkgICAgJnBUZW1wLT5ydW5uaW5nLCAmcFRlbXAtPnVzZSwgJnBUZW1wLT5hdmVxKSAhPSAxNCkKCQlzc2NhbmYgKGJ1ZmZlciwgIiVkICVkICVzICVsdSAlbHUgJWx1ICVsdVxuIiwKCQkgICAgJnBUZW1wLT5tYWpvciwgJnBUZW1wLT5taW5vciwgcFRlbXAtPm5hbWUsCgkJICAgICZwVGVtcC0+cmlvLCAmcFRlbXAtPnJzZWN0LAoJCSAgICAmcFRlbXAtPndpbywgJnBUZW1wLT53c2VjdCk7CiAgICAgICAgICAgIGlmICghaXNfZXhjbHVkZWQocFRlbXAtPm5hbWUpKQoJICAgICAgICBoZWFkLmxlbmd0aCsrOwoJfQogICAgfQogICAgZWxzZSB7CgkvKiBTZWUgaWYgYSAyLjQga2VybmVsICovCgljaGFyIGJ1ZmZlclsxMDI0XTsKCWludCByYzsKCXBhcnRzID0gZm9wZW4oIi9wcm9jL3BhcnRpdGlvbnMiLCAiciIpOwoJaWYgKCFwYXJ0cykgewoJICAgIHNubXBfbG9nX3BlcnJvcigiL3Byb2MvcGFydGl0aW9ucyIpOwoJICAgIHJldHVybiAxOwoJfQoKCS8qCgkgKiBmaXJzdCBmZXcgZnNjYW5mcyBhcmUgZ2FyYmFnZSB3ZSBkb24ndCBjYXJlIGFib3V0LiBza2lwIGl0LgoJICovCglmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBwYXJ0cyk7CglmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBwYXJ0cyk7CgoJd2hpbGUgKCEgZmVvZihwYXJ0cykpIHsKCSAgICBsaW51eF9kaXNraW8qIHBUZW1wOwoKCSAgICBpZiAoaGVhZC5sZW5ndGggPT0gaGVhZC5hbGxvYykgewoJCWhlYWQuYWxsb2MgKz0gRElTS19JTkNSOwoJCWhlYWQuaW5kaWNlcyA9IChsaW51eF9kaXNraW8gKilyZWFsbG9jKGhlYWQuaW5kaWNlcywgaGVhZC5hbGxvYypzaXplb2YobGludXhfZGlza2lvKSk7CgkgICAgfQoJICAgIHBUZW1wID0gJmhlYWQuaW5kaWNlc1toZWFkLmxlbmd0aF07CgoJICAgIHJjID0gZnNjYW5mIChwYXJ0cywgIiVkICVkICVsdSAlcyAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1XG4iLAoJCSAgICAmcFRlbXAtPm1ham9yLCAmcFRlbXAtPm1pbm9yLCAmcFRlbXAtPmJsb2NrcywgcFRlbXAtPm5hbWUsCgkJICAgICZwVGVtcC0+cmlvLCAmcFRlbXAtPnJtZXJnZSwgJnBUZW1wLT5yc2VjdCwgJnBUZW1wLT5ydXNlLAoJCSAgICAmcFRlbXAtPndpbywgJnBUZW1wLT53bWVyZ2UsICZwVGVtcC0+d3NlY3QsICZwVGVtcC0+d3VzZSwKCQkgICAgJnBUZW1wLT5ydW5uaW5nLCAmcFRlbXAtPnVzZSwgJnBUZW1wLT5hdmVxKTsKICAgICAgICAgICAgaWYgKHJjICE9IDE1KSB7CiAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJkaXNraW8uYzogY2Fubm90IGZpbmQgc3RhdGlzdGljcyBpbiAvcHJvYy9wYXJ0aXRpb25zXG4iKTsKICAgICAgICAgICAgICAgZmNsb3NlKHBhcnRzKTsKICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpc19leGNsdWRlZChwVGVtcC0+bmFtZSkpCgkgICAgICAgIGhlYWQubGVuZ3RoKys7Cgl9CiAgICB9CgogICAgZmNsb3NlKHBhcnRzKTsKICAgIGNhY2hlX3RpbWUgPSBub3c7CiAgICByZXR1cm4gMDsKfQoKdV9jaGFyICoKdmFyX2Rpc2tpbyhzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKCSAgIG9pZCAqIG5hbWUsCgkgICBzaXplX3QgKiBsZW5ndGgsCgkgICBpbnQgZXhhY3QsCgkgICBzaXplX3QgKiB2YXJfbGVuLAoJICAgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICB1bnNpZ25lZCBpbnQgaW5keDsKICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmdfcmV0OwogICAgc3RhdGljIHN0cnVjdCBjb3VudGVyNjQgYzY0X3JldDsKCiAgICBpZiAoZ2V0c3RhdHMoKSA9PSAxKSB7CglyZXR1cm4gTlVMTDsKICAgIH0KCiBpZiAoaGVhZGVyX3NpbXBsZV90YWJsZSh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kLCBoZWFkLmxlbmd0aCkpCiAgICB7CglyZXR1cm4gTlVMTDsKICAgIH0KCiAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIChuYW1lWypsZW5ndGggLSAxXSAtIDEpOwoKICBpZiAoaW5keCA+PSBoZWFkLmxlbmd0aCkKICAgIHJldHVybiBOVUxMOwoKICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBESVNLSU9fSU5ERVg6CiAgICAgIGxvbmdfcmV0ID0gaW5keCsxOwogICAgICByZXR1cm4gKHVfY2hhciAqKSAmbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19ERVZJQ0U6CiAgICAgICp2YXJfbGVuID0gc3RybGVuKGhlYWQuaW5kaWNlc1tpbmR4XS5uYW1lKTsKICAgICAgcmV0dXJuICh1X2NoYXIgKikgaGVhZC5pbmRpY2VzW2luZHhdLm5hbWU7CiAgICBjYXNlIERJU0tJT19OUkVBRDoKICAgICAgbG9uZ19yZXQgPSAoaGVhZC5pbmRpY2VzW2luZHhdLnJzZWN0KjUxMikgJiAweGZmZmZmZmZmOwogICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fTldSSVRURU46CiAgICAgIGxvbmdfcmV0ID0gKGhlYWQuaW5kaWNlc1tpbmR4XS53c2VjdCo1MTIpICYgMHhmZmZmZmZmZjsKICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKICAgIGNhc2UgRElTS0lPX1JFQURTOgogICAgICBsb25nX3JldCA9IGhlYWQuaW5kaWNlc1tpbmR4XS5yaW8gJiAweGZmZmZmZmZmOwogICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fV1JJVEVTOgogICAgICBsb25nX3JldCA9IGhlYWQuaW5kaWNlc1tpbmR4XS53aW8gJiAweGZmZmZmZmZmOwogICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fTEExOgogICAgICBsb25nX3JldCA9IGxhX2hlYWQuaW5kaWNlc1tpbmR4XS5sYTE7CiAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19MQTU6CiAgICAgIGxvbmdfcmV0ID0gbGFfaGVhZC5pbmRpY2VzW2luZHhdLmxhNTsKICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKICAgIGNhc2UgRElTS0lPX0xBMTU6CiAgICAgIGxvbmdfcmV0ID0gbGFfaGVhZC5pbmRpY2VzW2luZHhdLmxhMTU7CiAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19OUkVBRFg6CiAgICAgICp2YXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBjb3VudGVyNjQpOwogICAgICBjNjRfcmV0LmxvdyA9IGhlYWQuaW5kaWNlc1tpbmR4XS5yc2VjdCAqIDUxMiAmIDB4ZmZmZmZmZmY7CiAgICAgIGM2NF9yZXQuaGlnaCA9IGhlYWQuaW5kaWNlc1tpbmR4XS5yc2VjdCA+PiAoMzIgLSA5KTsKICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBjNjRfcmV0OwogICAgY2FzZSBESVNLSU9fTldSSVRURU5YOgogICAgICAqdmFyX2xlbiA9IHNpemVvZihzdHJ1Y3QgY291bnRlcjY0KTsKICAgICAgYzY0X3JldC5sb3cgPSBoZWFkLmluZGljZXNbaW5keF0ud3NlY3QgKiA1MTIgJiAweGZmZmZmZmZmOwogICAgICBjNjRfcmV0LmhpZ2ggPSBoZWFkLmluZGljZXNbaW5keF0ud3NlY3QgPj4gKDMyIC0gOSk7CiAgICAgIHJldHVybiAodV9jaGFyICopICYgYzY0X3JldDsKICAgIGRlZmF1bHQ6Cglzbm1wX2xvZyhMT0dfRVJSLCAiZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICVkIHJlcXVlc3RcbiIsIHZwLT5tYWdpYyk7CiAgfQogIHJldHVybiBOVUxMOwp9CiNlbmRpZiAgLyogbGludXggKi8KCiNpZiBkZWZpbmVkKGRhcndpbikKCiNkZWZpbmUgTUFYRFJJVkVTCTE2CS8qIG1vc3QgZHJpdmVzIHdlIHdpbGwgcmVjb3JkICovCiNkZWZpbmUgTUFYRFJJVkVOQU1FCTMxCS8qIGxhcmdlc3QgZHJpdmUgbmFtZSB3ZSBhbGxvdyAqLwoKI2RlZmluZSBrSURYQnl0ZXNSZWFkCQkwCS8qIHVzZWQgYXMgaW5kZXggaW50byB0aGUgc3RhdHMgYXJyYXkgaW4gYSBkcml2ZXN0YXRzIHN0cnVjdCAqLwojZGVmaW5lIGtJRFhCeXRlc1dyaXR0ZW4JMQojZGVmaW5lIGtJRFhOdW1SZWFkcwkJMgojZGVmaW5lIGtJRFhOdW1Xcml0ZXMJCTMKI2RlZmluZSBrSURYQnl0ZXNSZWFkWGhpCTQKI2RlZmluZSBrSURYQnl0ZXNSZWFkWGxvCTUKI2RlZmluZSBrSURYQnl0ZXNXcml0dGVuWGhpCTYKI2RlZmluZSBrSURYQnl0ZXNXcml0dGVuWGxvCTcKI2RlZmluZSBrSURYTGFzdAkJNwoKc3RydWN0IGRyaXZlc3RhdHMgewogICAgY2hhciBuYW1lW01BWERSSVZFTkFNRSArIDFdOwogICAgbG9uZyBic2RfdW5pdF9udW1iZXI7CiAgICBsb25nIHN0YXRzW2tJRFhMYXN0KzFdOwp9OwoKc3RhdGljIHN0cnVjdCBkcml2ZXN0YXRzIGRyaXZlc3RhdFtNQVhEUklWRVNdOwoKc3RhdGljIG1hY2hfcG9ydF90IG1hc3RlclBvcnQ7CQkvKiB0byBjb21tdW5pY2F0ZSB3aXRoIEkvTyBLaXQJKi8KCnN0YXRpYyBpbnQgbnVtX2RyaXZlczsJCQkvKiBudW1iZXIgb2YgZHJpdmVzIGRldGVjdGVkCSovCgpzdGF0aWMgaW50CmNvbGxlY3RfZHJpdmVfc3RhdHMoaW9fcmVnaXN0cnlfZW50cnlfdCBkcml2ZXIsIGxvbmcgKnN0YXRzKQp7CiAgICBDRk51bWJlclJlZiAgICAgbnVtYmVyOwogICAgQ0ZEaWN0aW9uYXJ5UmVmIHByb3BlcnRpZXM7CiAgICBDRkRpY3Rpb25hcnlSZWYgc3RhdGlzdGljczsKICAgIGxvbmcgICAgICAgICAgICB2YWx1ZTsKICAgIFNJbnQ2NCAgICAgICAgICB2YWx1ZTY0OwogICAga2Vybl9yZXR1cm5fdCAgIHN0YXR1czsKICAgIGludCAgICAgICAgICAgICBpOwoKCiAgICAvKgogICAgICogSWYgdGhlIGRyaXZlIGdvZXMgYXdheSwgd2UgbWF5IG5vdCBnZXQgYW55IHByb3BlcnRpZXMKICAgICAqIGZvciBpdC4gIFNvIHRha2Ugc29tZSBkZWZhdWx0cy4gTmI6IHVzZSBtZW1zZXQgPz8KICAgICAqLwogICAgZm9yIChpID0gMDsgaSA8IGtJRFhMYXN0OyBpKyspIHsKCXN0YXRzW2ldID0gMDsKICAgIH0KCiAgICAvKiByZXRyaWV2ZSB0aGUgcHJvcGVydGllcyAqLwogICAgc3RhdHVzID0gSU9SZWdpc3RyeUVudHJ5Q3JlYXRlQ0ZQcm9wZXJ0aWVzKGRyaXZlciwgKENGTXV0YWJsZURpY3Rpb25hcnlSZWYgKikmcHJvcGVydGllcywKCQkJCQkgICAgICAga0NGQWxsb2NhdG9yRGVmYXVsdCwga05pbE9wdGlvbnMpOwogICAgaWYgKHN0YXR1cyAhPSBLRVJOX1NVQ0NFU1MpIHsKCXNubXBfbG9nKExPR19FUlIsICJkaXNraW86IGRldmljZSBoYXMgbm8gcHJvcGVydGllc1xuIik7Ci8qCWZwcmludGYoc3RkZXJyLCAiZGV2aWNlIGhhcyBubyBwcm9wZXJ0aWVzXG4iKTsgKi8KCXJldHVybiAoMSk7CiAgICB9CgogICAgLyogcmV0cmlldmUgc3RhdGlzdGljcyBmcm9tIHByb3BlcnRpZXMgKi8KICAgIHN0YXRpc3RpY3MgPSAoQ0ZEaWN0aW9uYXJ5UmVmKUNGRGljdGlvbmFyeUdldFZhbHVlKHByb3BlcnRpZXMsCgkJCQkJCSAgICAgICBDRlNUUihrSU9CbG9ja1N0b3JhZ2VEcml2ZXJTdGF0aXN0aWNzS2V5KSk7CiAgICBpZiAoc3RhdGlzdGljcykgewoKCS8qIE5vdyBoYW5kIG1lIHRoZSBjcnlzdGFscy4gKi8KCWlmICgobnVtYmVyID0gKENGTnVtYmVyUmVmKUNGRGljdGlvbmFyeUdldFZhbHVlKHN0YXRpc3RpY3MsCgkJCQkJCSBDRlNUUihrSU9CbG9ja1N0b3JhZ2VEcml2ZXJTdGF0aXN0aWNzQnl0ZXNSZWFkS2V5KSkpKSB7CgkgICAgQ0ZOdW1iZXJHZXRWYWx1ZShudW1iZXIsIGtDRk51bWJlclNJbnQzMlR5cGUsICZ2YWx1ZSk7CgkgICAgc3RhdHNba0lEWEJ5dGVzUmVhZF0gPSB2YWx1ZTsKCX0KCglpZiAoKG51bWJlciA9IChDRk51bWJlclJlZilDRkRpY3Rpb25hcnlHZXRWYWx1ZShzdGF0aXN0aWNzLAoJCQkJCQkgQ0ZTVFIoa0lPQmxvY2tTdG9yYWdlRHJpdmVyU3RhdGlzdGljc0J5dGVzV3JpdHRlbktleSkpKSkgewoJICAgIENGTnVtYmVyR2V0VmFsdWUobnVtYmVyLCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmdmFsdWUpOwoJICAgIHN0YXRzW2tJRFhCeXRlc1dyaXR0ZW5dID0gdmFsdWU7Cgl9CgoJaWYgKChudW1iZXIgPSAoQ0ZOdW1iZXJSZWYpQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUoc3RhdGlzdGljcywKCQkJCQkJIENGU1RSKGtJT0Jsb2NrU3RvcmFnZURyaXZlclN0YXRpc3RpY3NSZWFkc0tleSkpKSkgewoJICAgIENGTnVtYmVyR2V0VmFsdWUobnVtYmVyLCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmdmFsdWUpOwoJICAgIHN0YXRzW2tJRFhOdW1SZWFkc10gPSB2YWx1ZTsKCX0KCWlmICgobnVtYmVyID0gKENGTnVtYmVyUmVmKUNGRGljdGlvbmFyeUdldFZhbHVlKHN0YXRpc3RpY3MsCgkJCQkJCSBDRlNUUihrSU9CbG9ja1N0b3JhZ2VEcml2ZXJTdGF0aXN0aWNzV3JpdGVzS2V5KSkpKSB7CgkgICAgQ0ZOdW1iZXJHZXRWYWx1ZShudW1iZXIsIGtDRk51bWJlclNJbnQzMlR5cGUsICZ2YWx1ZSk7CgkgICAgc3RhdHNba0lEWE51bVdyaXRlc10gPSB2YWx1ZTsKCX0KCS8qIGdyYWIgdGhlIDY0IGJpdCB2ZXJzaW9ucyBvZiB0aGUgYnl0ZXMgcmVhZCAqLwoJaWYgKChudW1iZXIgPSAoQ0ZOdW1iZXJSZWYpQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUoc3RhdGlzdGljcywKCQkJCQkJIENGU1RSKGtJT0Jsb2NrU3RvcmFnZURyaXZlclN0YXRpc3RpY3NCeXRlc1JlYWRLZXkpKSkpIHsKCSAgICBDRk51bWJlckdldFZhbHVlKG51bWJlciwga0NGTnVtYmVyU0ludDY0VHlwZSwgJnZhbHVlNjQpOwoJICAgIHN0YXRzW2tJRFhCeXRlc1JlYWRYaGldID0gKGxvbmcpKHZhbHVlNjQgPj4gMzIpOwoJICAgIHN0YXRzW2tJRFhCeXRlc1JlYWRYbG9dID0gKGxvbmcpKHZhbHVlNjQgJiAweGZmZmZmZmZmKTsJCgl9CgkJCgkvKiBncmFiIHRoZSA2NCBiaXQgdmVyc2lvbnMgb2YgdGhlIGJ5dGVzIHdyaXR0ZW4gKi8KCWlmICgobnVtYmVyID0gKENGTnVtYmVyUmVmKUNGRGljdGlvbmFyeUdldFZhbHVlKHN0YXRpc3RpY3MsCgkJCQkJCSBDRlNUUihrSU9CbG9ja1N0b3JhZ2VEcml2ZXJTdGF0aXN0aWNzQnl0ZXNXcml0dGVuS2V5KSkpKSB7CgkgICAgQ0ZOdW1iZXJHZXRWYWx1ZShudW1iZXIsIGtDRk51bWJlclNJbnQ2NFR5cGUsICZ2YWx1ZTY0KTsKCSAgICBzdGF0c1trSURYQnl0ZXNXcml0dGVuWGhpXSA9IChsb25nKSh2YWx1ZTY0ID4+IDMyKTsKCSAgICBzdGF0c1trSURYQnl0ZXNXcml0dGVuWGxvXSA9IChsb25nKSh2YWx1ZTY0ICYgMHhmZmZmZmZmZik7CQoJfQogICAgfQogICAgLyogd2UncmUgZG9uZSB3aXRoIHRoZSBwcm9wZXJ0aWVzLCByZWxlYXNlIHRoZW0gKi8KICAgIENGUmVsZWFzZShwcm9wZXJ0aWVzKTsKICAgIHJldHVybiAoMCk7Cn0KCi8qCiAqIENoZWNrIHdoZXRoZXIgYW4gSU9SZWdpc3RyeUVudHJ5IHJlZmVycyB0byBhIHZhbGlkCiAqIEkvTyBkZXZpY2UsIGFuZCBpZiBzbywgY29sbGVjdCB0aGUgaW5mb3JtYXRpb24uCiAqLwpzdGF0aWMgaW50CmhhbmRsZV9kcml2ZShpb19yZWdpc3RyeV9lbnRyeV90IGRyaXZlLCBzdHJ1Y3QgZHJpdmVzdGF0cyAqIGRzdGF0KQp7CiAgICBpb19yZWdpc3RyeV9lbnRyeV90IHBhcmVudDsKICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgICAgIHByb3BlcnRpZXM7CiAgICBDRlN0cmluZ1JlZiAgICAgICAgIG5hbWU7CiAgICBDRk51bWJlclJlZiAgICAgICAgIG51bWJlcjsKICAgIGtlcm5fcmV0dXJuX3QgICAgICAgc3RhdHVzOwoKICAgIC8qIGdldCBkcml2ZSdzIHBhcmVudCAqLwogICAgc3RhdHVzID0gSU9SZWdpc3RyeUVudHJ5R2V0UGFyZW50RW50cnkoZHJpdmUsIGtJT1NlcnZpY2VQbGFuZSwgJnBhcmVudCk7CiAgICBpZiAoc3RhdHVzICE9IEtFUk5fU1VDQ0VTUykgewoJc25tcF9sb2coTE9HX0VSUiwgImRpc2tpbzogZGV2aWNlIGhhcyBubyBwYXJlbnRcbiIpOwovKglmcHJpbnRmKHN0ZGVyciwgImRldmljZSBoYXMgbm8gcGFyZW50XG4iKTsgKi8KCXJldHVybigxKTsKICAgIH0KCiAgICBpZiAoSU9PYmplY3RDb25mb3Jtc1RvKHBhcmVudCwgIklPQmxvY2tTdG9yYWdlRHJpdmVyIikpIHsKCgkvKiBnZXQgZHJpdmUgcHJvcGVydGllcyAqLwoJc3RhdHVzID0gSU9SZWdpc3RyeUVudHJ5Q3JlYXRlQ0ZQcm9wZXJ0aWVzKGRyaXZlLCAmcHJvcGVydGllcywKCQkJCQkgICAga0NGQWxsb2NhdG9yRGVmYXVsdCwga05pbE9wdGlvbnMpOwoJaWYgKHN0YXR1cyAhPSBLRVJOX1NVQ0NFU1MpIHsKCSAgICBzbm1wX2xvZyhMT0dfRVJSLCAiZGlza2lvOiBkZXZpY2UgaGFzIG5vIHByb3BlcnRpZXNcbiIpOwovKgkgICAgZnByaW50ZihzdGRlcnIsICJkZXZpY2UgaGFzIG5vIHByb3BlcnRpZXNcbiIpOyAqLwoJICAgIHJldHVybigxKTsKCX0KCgkvKiBnZXQgQlNEIG5hbWUgYW5kIHVuaXRudW1iZXIgZnJvbSBwcm9wZXJ0aWVzICovCgluYW1lID0gKENGU3RyaW5nUmVmKUNGRGljdGlvbmFyeUdldFZhbHVlKHByb3BlcnRpZXMsCgkJCQkJICBDRlNUUihrSU9CU0ROYW1lS2V5KSk7CgludW1iZXIgPSAoQ0ZOdW1iZXJSZWYpQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJvcGVydGllcywKCQkJCQkgICAgQ0ZTVFIoa0lPQlNEVW5pdEtleSkpOwoKCS8qIENvbGxlY3Qgc3RhdHMgYW5kIGlmIHN1Y2Nlc2Z1bCBzdG9yZSB0aGVtIHdpdGggdGhlIG5hbWUgYW5kIHVuaXRudW1iZXIgKi8KCWlmIChuYW1lICYmIG51bWJlciAmJiAhY29sbGVjdF9kcml2ZV9zdGF0cyhwYXJlbnQsIGRzdGF0LT5zdGF0cykpIHsKCgkgICAgQ0ZTdHJpbmdHZXRDU3RyaW5nKG5hbWUsIGRzdGF0LT5uYW1lLCBNQVhEUklWRU5BTUUsIENGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmcoKSk7CgkgICAgQ0ZOdW1iZXJHZXRWYWx1ZShudW1iZXIsIGtDRk51bWJlclNJbnQzMlR5cGUsICZkc3RhdC0+YnNkX3VuaXRfbnVtYmVyKTsKCSAgICBudW1fZHJpdmVzKys7Cgl9CgoJLyogY2xlYW4gdXAsIHJldHVybiBzdWNjZXNzICovCglDRlJlbGVhc2UocHJvcGVydGllcyk7CglyZXR1cm4oMCk7CiAgICB9CgogICAgLyogZmFpbGVkLCBkb24ndCBrZWVwIHBhcmVudCAqLwogICAgSU9PYmplY3RSZWxlYXNlKHBhcmVudCk7CiAgICByZXR1cm4oMSk7Cn0KCnN0YXRpYyBpbnQKZ2V0c3RhdHModm9pZCkKewogICAgdGltZV90ICAgICAgICAgICAgICAgICBub3c7CiAgICBpb19pdGVyYXRvcl90ICAgICAgICAgIGRyaXZlbGlzdDsKICAgIGlvX3JlZ2lzdHJ5X2VudHJ5X3QgICAgZHJpdmU7CiAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIG1hdGNoOwogICAga2Vybl9yZXR1cm5fdCAgICAgICAgICBzdGF0dXM7CgogICAgbm93ID0gdGltZShOVUxMKTsJLyogcmVnaXN0ZXIgY3VycmVudCB0aW1lIGFuZCBjaGVjayB3ZXRoZXIgY2FjaGUgY2FuIGJlIHVzZWQgKi8KICAgIGlmIChjYWNoZV90aW1lICsgQ0FDSEVfVElNRU9VVCA+IG5vdykgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qICBSZXRyaWV2ZSBhIGxpc3Qgb2YgZHJpdmVzLiAqLwogICAgbWF0Y2ggPSBJT1NlcnZpY2VNYXRjaGluZygiSU9NZWRpYSIpOwogICAgQ0ZEaWN0aW9uYXJ5QWRkVmFsdWUobWF0Y2gsIENGU1RSKGtJT01lZGlhV2hvbGVLZXkpLCBrQ0ZCb29sZWFuVHJ1ZSk7CiAgICBzdGF0dXMgPSBJT1NlcnZpY2VHZXRNYXRjaGluZ1NlcnZpY2VzKG1hc3RlclBvcnQsIG1hdGNoLCAmZHJpdmVsaXN0KTsKICAgIGlmIChzdGF0dXMgIT0gS0VSTl9TVUNDRVNTKSB7Cglzbm1wX2xvZyhMT0dfRVJSLCAiZGlza2lvOiBjb3VsZG4ndCBtYXRjaCB3aG9sZSBJT01lZGlhIGRldmljZXNcbiIpOwovKglmcHJpbnRmKHN0ZGVyciwiQ291bGRuJ3QgbWF0Y2ggd2hvbGUgSU9NZWRpYSBkZXZpY2VzXG4iKTsgKi8KCXJldHVybiAtMTsKICAgIH0KCiAgICBudW1fZHJpdmVzID0gMDsgIC8qIE5COiBJbmNyZW1lbnRlZCBieSBoYW5kbGVfZHJpdmUgKi8KICAgIHdoaWxlICgoZHJpdmUgPSBJT0l0ZXJhdG9yTmV4dChkcml2ZWxpc3QpKSAmJiAobnVtX2RyaXZlcyA8IE1BWERSSVZFUykpIHsKCWhhbmRsZV9kcml2ZShkcml2ZSwgJmRyaXZlc3RhdFtudW1fZHJpdmVzXSk7CglJT09iamVjdFJlbGVhc2UoZHJpdmUpOwogICAgfQogICAgSU9PYmplY3RSZWxlYXNlKGRyaXZlbGlzdCk7CgogICAgY2FjaGVfdGltZSA9IG5vdzsKICAgIHJldHVybiAwOwp9Cgp1X2NoYXIgICAgICAgICAqCnZhcl9kaXNraW8oc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIHN0YXRpYyBzdHJ1Y3QgICBjb3VudGVyNjQgYzY0X3JldDsKICAgIHVuc2lnbmVkIGludCAgICBpbmR4OwoKICAgIGlmIChnZXRzdGF0cygpID09IDEpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCgogICAgaWYgKGhlYWRlcl9zaW1wbGVfdGFibGUKICAgICAgICAodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCwgbnVtX2RyaXZlcykpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgKG5hbWVbKmxlbmd0aCAtIDFdIC0gMSk7CgogICAgaWYgKGluZHggPj0gbnVtX2RyaXZlcykKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewoJY2FzZSBESVNLSU9fSU5ERVg6CgkgICAgbG9uZ19yZXQgPSAobG9uZykgZHJpdmVzdGF0W2luZHhdLmJzZF91bml0X251bWJlcjsKCSAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoJY2FzZSBESVNLSU9fREVWSUNFOgoJICAgICp2YXJfbGVuID0gc3RybGVuKGRyaXZlc3RhdFtpbmR4XS5uYW1lKTsKCSAgICByZXR1cm4gKHVfY2hhciAqKSBkcml2ZXN0YXRbaW5keF0ubmFtZTsKCWNhc2UgRElTS0lPX05SRUFEOgoJICAgIGxvbmdfcmV0ID0gKHNpZ25lZCBsb25nKSBkcml2ZXN0YXRbaW5keF0uc3RhdHNba0lEWEJ5dGVzUmVhZF07CgkgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCWNhc2UgRElTS0lPX05XUklUVEVOOgoJICAgIGxvbmdfcmV0ID0gKHNpZ25lZCBsb25nKSBkcml2ZXN0YXRbaW5keF0uc3RhdHNba0lEWEJ5dGVzV3JpdHRlbl07CgkgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCWNhc2UgRElTS0lPX1JFQURTOgoJICAgIGxvbmdfcmV0ID0gKHNpZ25lZCBsb25nKSBkcml2ZXN0YXRbaW5keF0uc3RhdHNba0lEWE51bVJlYWRzXTsKCSAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoJY2FzZSBESVNLSU9fV1JJVEVTOgoJICAgIGxvbmdfcmV0ID0gKHNpZ25lZCBsb25nKSBkcml2ZXN0YXRbaW5keF0uc3RhdHNba0lEWE51bVdyaXRlc107CgkgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCWNhc2UgRElTS0lPX05SRUFEWDoKCSAgICAqdmFyX2xlbiA9IDg7CgkgICAgYzY0X3JldC5sb3cgPSAoc2lnbmVkIGxvbmcpIGRyaXZlc3RhdFtpbmR4XS5zdGF0c1trSURYQnl0ZXNSZWFkWGxvXTsKCSAgICBjNjRfcmV0LmhpZ2ggPSAoc2lnbmVkIGxvbmcpIGRyaXZlc3RhdFtpbmR4XS5zdGF0c1trSURYQnl0ZXNSZWFkWGhpXTsKCSAgICByZXR1cm4gKHVfY2hhciAqKSAmIGM2NF9yZXQ7CgljYXNlIERJU0tJT19OV1JJVFRFTlg6CgkgICAgKnZhcl9sZW4gPSA4OwoJICAgIGM2NF9yZXQubG93ID0gKHNpZ25lZCBsb25nKSBkcml2ZXN0YXRbaW5keF0uc3RhdHNba0lEWEJ5dGVzV3JpdHRlblhsb107CgkgICAgYzY0X3JldC5oaWdoID0gKHNpZ25lZCBsb25nKSBkcml2ZXN0YXRbaW5keF0uc3RhdHNba0lEWEJ5dGVzV3JpdHRlblhoaV07CgkgICAgcmV0dXJuICh1X2NoYXIgKikgJiBjNjRfcmV0OwoJZGVmYXVsdDoKCSAgICBFUlJPUl9NU0coImRpc2tpby5jOiBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhpcyByZXF1ZXN0LiIpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkYXJ3aW4gKi8KCgojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQovKgogKiBjb2xsZWN0IHN0YXRpc3RpY3MgZm9yIGFsbCBkaXNrcwogKi8KaW50CmNvbGxlY3RfZGlza3Modm9pZCkKewogICAgdGltZV90ICAgICAgICAgIG5vdzsKICAgIGludCAgICAgICAgICAgICBpOwogICAgcGVyZnN0YXRfaWRfdCAgIGZpcnN0OwoKICAgIC8qIGNhY2hlIHZhbGlkPyBpZiB5ZXMsIGp1c3QgcmV0dXJuICovCiAgICBub3cgPSB0aW1lKE5VTEwpOwogICAgaWYgKHBzX2Rpc2sgIT0gTlVMTCAmJiBjYWNoZV90aW1lICsgQ0FDSEVfVElNRU9VVCA+IG5vdykgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIGdldCBudW1iZXIgb2YgZGlza3Mgd2UgaGF2ZSAqLwogICAgaSA9IHBlcmZzdGF0X2Rpc2soTlVMTCwgTlVMTCwgc2l6ZW9mKHBlcmZzdGF0X2Rpc2tfdCksIDApOwogICAgaWYoaSA8PSAwKSByZXR1cm4gMTsKCiAgICAvKiBpZiBudW1iZXIgb2YgZGlza3MgZGlmZmVycyBvciBzdHJ1Y3R1cmVzIGFyZSB1bmluaXRpYWxpemVkLCBpbml0IHRoZW0gKi8KICAgIGlmKGkgIT0gcHNfbnVtZGlza3MgfHwgcHNfZGlzayA9PSBOVUxMKSB7CiAgICAgICAgaWYocHNfZGlzayAhPSBOVUxMKSBmcmVlKHBzX2Rpc2spOwogICAgICAgIHBzX251bWRpc2tzID0gaTsKICAgICAgICBwc19kaXNrID0gbWFsbG9jKHNpemVvZihwZXJmc3RhdF9kaXNrX3QpICogcHNfbnVtZGlza3MpOwogICAgICAgIGlmKHBzX2Rpc2sgPT0gTlVMTCkgcmV0dXJuIDE7CiAgICB9CgogICAgLyogZ2F0aGVyIHN0YXRpc3RpY3MgYWJvdXQgYWxsIGRpc2tzIHdlIGhhdmUgKi8KICAgIHN0cmNweShmaXJzdC5uYW1lLCAiIik7CiAgICBpID0gcGVyZnN0YXRfZGlzaygmZmlyc3QsIHBzX2Rpc2ssIHNpemVvZihwZXJmc3RhdF9kaXNrX3QpLCBwc19udW1kaXNrcyk7CiAgICBpZihpICE9IHBzX251bWRpc2tzKSByZXR1cm4gMTsKCiAgICBjYWNoZV90aW1lID0gbm93OwogICAgcmV0dXJuIDA7Cn0KCgp1X2NoYXIgICAgICAgICAqCnZhcl9kaXNraW8oc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIHN0YXRpYyBsb25nICAgICBsb25nX3JldDsKICAgIHN0YXRpYyBzdHJ1Y3QgY291bnRlcjY0IGM2NF9yZXQ7CiAgICB1bnNpZ25lZCBpbnQgICAgaW5keDsKCiAgICAvKiBnZXQgZGlzayBzdGF0aXN0aWNzICovCiAgICBpZiAoY29sbGVjdF9kaXNrcygpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmIChoZWFkZXJfc2ltcGxlX3RhYmxlCiAgICAgICAgKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QsIHBzX251bWRpc2tzKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgKG5hbWVbKmxlbmd0aCAtIDFdIC0gMSk7CiAgICBpZiAoaW5keCA+PSBwc19udW1kaXNrcykKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKiBkZWxpdmVyIHJlcXVlc3RlZCBkYXRhIG9uIHJlcXVlc3RlZCBkaXNrICovCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBESVNLSU9fSU5ERVg6CiAgICAgICAgbG9uZ19yZXQgPSAobG9uZykgaW5keDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwogICAgY2FzZSBESVNLSU9fREVWSUNFOgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKHBzX2Rpc2tbaW5keF0ubmFtZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgcHNfZGlza1tpbmR4XS5uYW1lOwogICAgY2FzZSBESVNLSU9fTlJFQUQ6CiAgICAgICAgbG9uZ19yZXQgPSAoc2lnbmVkIGxvbmcpIHBzX2Rpc2tbaW5keF0ucmJsa3MgKiBwc19kaXNrW2luZHhdLmJzaXplOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19OV1JJVFRFTjoKICAgICAgICBsb25nX3JldCA9IChzaWduZWQgbG9uZykgcHNfZGlza1tpbmR4XS53YmxrcyAqIHBzX2Rpc2tbaW5keF0uYnNpemU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKICAgIGNhc2UgRElTS0lPX1JFQURTOgogICAgICAgIGxvbmdfcmV0ID0gKHNpZ25lZCBsb25nKSBwc19kaXNrW2luZHhdLnhmZXJzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CiAgICBjYXNlIERJU0tJT19XUklURVM6CiAgICAgICAgbG9uZ19yZXQgPSAoc2lnbmVkIGxvbmcpIDA7CS8qIEFJWCBoYXMganVzdCBvbmUgdmFsdWUgZm9yIHJlYWQvd3JpdGUgdHJhbnNmZXJzICovCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKICAgIGNhc2UgRElTS0lPX05SRUFEWDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihzdHJ1Y3QgY291bnRlcjY0KTsKICAgICAgICBjNjRfcmV0LmxvdyA9IChwc19kaXNrW2luZHhdLnJibGtzICogcHNfZGlza1tpbmR4XS5ic2l6ZSkgJiAweGZmZmZmZmZmOzsKICAgICAgICBjNjRfcmV0LmhpZ2ggPSAocHNfZGlza1tpbmR4XS5yYmxrcyAqIHBzX2Rpc2tbaW5keF0uYnNpemUpID4+IDMyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYzY0X3JldDsKICAgIGNhc2UgRElTS0lPX05XUklUVEVOWDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihzdHJ1Y3QgY291bnRlcjY0KTsKICAgICAgICBjNjRfcmV0LmxvdyA9IChwc19kaXNrW2luZHhdLndibGtzICogcHNfZGlza1tpbmR4XS5ic2l6ZSkgJiAweGZmZmZmZmZmOzsKICAgICAgICBjNjRfcmV0LmhpZ2ggPSAocHNfZGlza1tpbmR4XS53YmxrcyAqIHBzX2Rpc2tbaW5keF0uYnNpemUpID4+IDMyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYzY0X3JldDsKCiAgICBkZWZhdWx0OgogICAgICAgIEVSUk9SX01TRygiZGlza2lvLmM6IGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzIHJlcXVlc3QuIik7CiAgICB9CgogICAgLyogcmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBlcnJvciAqLwogICAgcmV0dXJuIE5VTEw7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhaXggNC81ICovCg==