LyogY3l0dW5lLmMgLS0gVHVuZSBDeWNsYWRlcyBkcml2ZXIKICoKICogQ29weXJpZ2h0IDE5OTUgTmljayBTaW1pY2ljaCAobmpzQHNjaWZpLmVtaS5uZXQpCiAqCiAqIE1vZGlmaWNhdGlvbnMgYnkgUmlrIEZhaXRoIChmYWl0aEBjcy51bmMuZWR1KQogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgogKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE5pY2sgU2ltaWNpY2gKICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgTmljayBTaW1pY2ljaCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIE5JQ0sgU0lNSUNJQ0ggQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIE5JQ0sgU0lNSUNJQ0ggT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKgogKi8KCiAvKgogICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAgKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAgKiBTdW4gTWFyIDIxIDE5OTkgLSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KICAqIC0gZml4ZWQgc3RyZXJyKGVycm5vKSBpbiBnZXR0ZXh0IGNhbGxzCiAgKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8dGVybWlvcy5oPgoKI2luY2x1ZGUgImN5Y2xhZGVzLmgiCgojaWYgMAojaWZuZGVmIFhNSVQKIyBpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiMgaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gNjYwNTYKIyAgZGVmaW5lIFhNSVQKIyBlbmRpZgojZW5kaWYKI2VuZGlmCgojaW5jbHVkZSAibmxzLmgiCgkJCQkvKiBVbnRpbCBpdCBnZXRzIHB1dCBpbiB0aGUga2VybmVsLAoJCQkJICAgdG9nZ2xlIGJ5IGhhbmQuICovCiN1bmRlZiBYTUlUCgpzdHJ1Y3QgY3ljbGFkZXNfY29udHJvbCB7CiAgc3RydWN0IGN5Y2xhZGVzX21vbml0b3IgYzsKICBpbnQgY2ZpbGU7CiAgaW50IG1heG1heDsKICBkb3VibGUgbWF4dHJhbjsKICBkb3VibGUgbWF4eG1pdDsKICB1bnNpZ25lZCBsb25nIHRocmVzaG9sZF92YWx1ZTsKICB1bnNpZ25lZCBsb25nIHRpbWVvdXRfdmFsdWU7Cn07CnN0cnVjdCBjeWNsYWRlc19jb250cm9sICpjbW9uOwppbnQgY21vbl9pbmRleDsKCiNkZWZpbmUgbXZ0aW1lKHR2cHRvLCB0dnBmcm9tKSAgKCgodHZwdG8pLT50dl9zZWMgPSAodHZwZnJvbSktPnR2X3NlYyksKHR2cHRvKS0+dHZfdXNlYyA9ICh0dnBmcm9tKS0+dHZfdXNlYykKCgpzdGF0aWMgaW5saW5lIGRvdWJsZQpkdGltZShzdHJ1Y3QgdGltZXZhbCAqIHR2cG5ldywgc3RydWN0IHRpbWV2YWwgKiB0dnBvbGQpIHsKICBkb3VibGUgZGlmZjsKICBkaWZmID0gKGRvdWJsZSl0dnBuZXctPnR2X3NlYyAtIChkb3VibGUpdHZwb2xkLT50dl9zZWM7CiAgZGlmZiArPSAoKGRvdWJsZSl0dnBuZXctPnR2X3VzZWMgLSAoZG91YmxlKXR2cG9sZC0+dHZfdXNlYykvMTAwMDAwMDsKICByZXR1cm4gZGlmZjsKfQoKc3RhdGljIGludCBnbG9iYWxfYXJnYywgZ2xvYmFsX29wdGluZDsKc3RhdGljIGNoYXIgKioqZ2xvYmFsX2FyZ3Y7CgpzdGF0aWMgdm9pZApzdW1tYXJ5KGludCBzaWcpIHsKICBzdHJ1Y3QgY3ljbGFkZXNfY29udHJvbCAqY2M7CgogIGludCBhcmdjLCBsb2NhbF9vcHRpbmQ7CiAgY2hhciAqKmFyZ3Y7CgogIGludCBpLGo7CgogIGFyZ2MgPSBnbG9iYWxfYXJnYzsKICBhcmd2ID0gKmdsb2JhbF9hcmd2OwogIGxvY2FsX29wdGluZCA9IGdsb2JhbF9vcHRpbmQ7CgogIGlmIChzaWcgPiAwKSB7CiAgICBmb3IoaSA9IGxvY2FsX29wdGluZDsgaSA8IGFyZ2M7IGkgKyspIHsKICAgICAgaiA9IGkgLSBsb2NhbF9vcHRpbmQ7CiAgICAgIGNjID0gJmNtb25bY21vbl9pbmRleF07CiAgICAgIGZwcmludGYoc3RkZXJyLCBfKCJGaWxlICVzLCBGb3IgdGhyZXNob2xkIHZhbHVlICVsdSwgTWF4aW11bSBjaGFyYWN0ZXJzIGluIGZpZm8gd2VyZSAlZCxcbmFuZCB0aGUgbWF4aW11bSB0cmFuc2ZlciByYXRlIGluIGNoYXJhY3RlcnMvc2Vjb25kIHdhcyAlZlxuIiksIAoJICAgICAgYXJndltpXSwKCSAgICAgIGNjLT50aHJlc2hvbGRfdmFsdWUsCgkgICAgICBjYy0+bWF4bWF4LAoJICAgICAgY2MtPm1heHRyYW4pOwogICAgfQogICAgCiAgICBleGl0KDApOwogIH0KICBjYyA9ICZjbW9uW2Ntb25faW5kZXhdOwogIGlmIChjYy0+dGhyZXNob2xkX3ZhbHVlID4gMCAmJiBzaWcgIT0gLTEpIHsKICAgIGZwcmludGYoc3RkZXJyLCBfKCJGaWxlICVzLCBGb3IgdGhyZXNob2xkIHZhbHVlICVsdSBhbmQgdGltcm91dCB2YWx1ZSAlbHUsIE1heGltdW0gY2hhcmFjdGVycyBpbiBmaWZvIHdlcmUgJWQsXG5hbmQgdGhlIG1heGltdW0gdHJhbnNmZXIgcmF0ZSBpbiBjaGFyYWN0ZXJzL3NlY29uZCB3YXMgJWZcbiIpLAoJICAgIGFyZ3ZbY21vbl9pbmRleCtsb2NhbF9vcHRpbmRdLAoJICAgIGNjLT50aHJlc2hvbGRfdmFsdWUsCgkgICAgY2MtPnRpbWVvdXRfdmFsdWUsCgkgICAgY2MtPm1heG1heCwKCSAgICBjYy0+bWF4dHJhbik7CiAgfQogIGNjLT5tYXhtYXggPSAwOwogIGNjLT5tYXh0cmFuID0gMC4wOwogIGNjLT50aHJlc2hvbGRfdmFsdWUgPSAwOwogIGNjLT50aW1lb3V0X3ZhbHVlID0gMDsKfQoKc3RhdGljIGludCBxdWVyeSAgID0gMDsKc3RhdGljIGludCBpbnRlcnZhbCA9IDE7CgpzdGF0aWMgaW50IHNldCAgICAgPSAwOwpzdGF0aWMgaW50IHNldF92YWwgPSAtMTsKc3RhdGljIGludCBnZXQgICAgID0gMDsKCnN0YXRpYyBpbnQgc2V0X2RlZiAgICAgPSAwOwpzdGF0aWMgaW50IHNldF9kZWZfdmFsID0gLTE7CnN0YXRpYyBpbnQgZ2V0X2RlZiAgICAgPSAwOwoKc3RhdGljIGludCBzZXRfdGltZSA9IDA7CnN0YXRpYyBpbnQgc2V0X3RpbWVfdmFsID0gLTE7CgpzdGF0aWMgaW50IHNldF9kZWZfdGltZSA9IDA7CnN0YXRpYyBpbnQgc2V0X2RlZl90aW1lX3ZhbCA9IC0xOwoKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKCiAgc3RydWN0IHRpbWV2YWwgbGFzdHRpbWUsIHRoaXN0aW1lOwogIHN0cnVjdCB0aW1lem9uZSB0eiA9IHswLDB9OwogIGRvdWJsZSBkaWZmOwogIGludCBlcnJmbGcgPSAwOwogIGludCBmaWxlOwogIGludCBudW1maWxlczsKICBzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvciBjeXdvcms7CiAgCiAgaW50IGk7CiAgdW5zaWduZWQgbG9uZyB0aHJlc2hvbGRfdmFsdWU7CiAgdW5zaWduZWQgbG9uZyB0aW1lb3V0X3ZhbHVlOwogIGRvdWJsZSB4ZmVyX3JhdGU7CiNpZmRlZiBYTUlUCiAgZG91YmxlIHhtaXRfcmF0ZTsKI2VuZGlmCiAgCiAgZ2xvYmFsX2FyZ2MgPSBhcmdjOwkJLyogRm9yIHNpZ25hbCByb3V0aW5lLiAqLwogIGdsb2JhbF9hcmd2ID0gJmFyZ3Y7CQkvKiBGb3Igc2lnbmFsIHJvdXRpbmUuICovCgogIHNldGxvY2FsZShMQ19BTEwsICIiKTsKICBiaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwogIHRleHRkb21haW4oUEFDS0FHRSk7CgogIHdoaWxlICgoaSA9IGdldG9wdChhcmdjLCBhcmd2LCAicXM6Uzp0OlQ6Z0dpOiIpKSAhPSAtMSkgewogICAgc3dpdGNoIChpKSB7CiAgICBjYXNlICdxJzoKICAgICAgcXVlcnkgPSAxOwogICAgICBicmVhazsKICAgIGNhc2UgJ2knOgogICAgICBpbnRlcnZhbCA9IGF0b2kob3B0YXJnKTsKICAgICAgaWYoaW50ZXJ2YWwgPD0gMCkgewoJZnByaW50ZihzdGRlcnIsIF8oIkludmFsaWQgaW50ZXJ2YWwgdmFsdWU6ICVzXG4iKSxvcHRhcmcpOwoJZXJyZmxnICsrOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAncyc6CiAgICAgICsrc2V0OwogICAgICBzZXRfdmFsID0gYXRvaShvcHRhcmcpOwogICAgICBpZihzZXRfdmFsIDw9IDAgfHwgc2V0X3ZhbCA+IDEyKSB7CglmcHJpbnRmKHN0ZGVyciwgXygiSW52YWxpZCBzZXQgdmFsdWU6ICVzXG4iKSxvcHRhcmcpOwoJZXJyZmxnICsrOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAnUyc6CiAgICAgICArK3NldF9kZWY7CiAgICAgIHNldF9kZWZfdmFsID0gYXRvaShvcHRhcmcpOwogICAgICBpZihzZXRfZGVmX3ZhbCA8IDAgfHwgc2V0X2RlZl92YWwgPiAxMikgewoJZnByaW50ZihzdGRlcnIsIF8oIkludmFsaWQgZGVmYXVsdCB2YWx1ZTogJXNcbiIpLG9wdGFyZyk7CgllcnJmbGcgKys7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICd0JzoKICAgICAgKytzZXRfdGltZTsKICAgICAgc2V0X3RpbWVfdmFsID0gYXRvaShvcHRhcmcpOwogICAgICBpZihzZXRfdGltZV92YWwgPD0gMCB8fCBzZXRfdGltZV92YWwgPiAyNTUpIHsKCWZwcmludGYoc3RkZXJyLCBfKCJJbnZhbGlkIHNldCB0aW1lIHZhbHVlOiAlc1xuIiksb3B0YXJnKTsKCWVycmZsZyArKzsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgJ1QnOgogICAgICAgKytzZXRfZGVmX3RpbWU7CiAgICAgIHNldF9kZWZfdGltZV92YWwgPSBhdG9pKG9wdGFyZyk7CiAgICAgIGlmKHNldF9kZWZfdGltZV92YWwgPCAwIHx8IHNldF9kZWZfdGltZV92YWwgPiAyNTUpIHsKCWZwcmludGYoc3RkZXJyLCBfKCJJbnZhbGlkIGRlZmF1bHQgdGltZSB2YWx1ZTogJXNcbiIpLG9wdGFyZyk7CgllcnJmbGcgKys7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICdnJzogKytnZXQ7ICAgICBicmVhazsKICAgIGNhc2UgJ0cnOiArK2dldF9kZWY7IGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZXJyZmxnICsrOwogICAgfQogIH0KICBudW1maWxlcyA9IGFyZ2MgLSBvcHRpbmQ7CiAgaWYoZXJyZmxnIHx8IChudW1maWxlcyA9PSAwKQogICAgIHx8ICghcXVlcnkgJiYgIXNldCAmJiAhc2V0X2RlZiAmJiAKCSAhZ2V0ICYmICFnZXRfZGVmICYmICFzZXRfdGltZSAmJiAhc2V0X2RlZl90aW1lKSB8fCAKICAgICAoc2V0ICYmIHNldF9kZWYpIHx8IChzZXRfdGltZSAmJiBzZXRfZGVmX3RpbWUpIHx8IAogICAgIChnZXQgJiYgZ2V0X2RlZikpIHsKICAgIGZwcmludGYoc3RkZXJyLCAKCSAgICBfKCJVc2FnZTogJXMgWy1xIFstaSBpbnRlcnZhbF1dIChbLXMgdmFsdWVdfFstUyB2YWx1ZV0pIChbLXQgdmFsdWVdfFstVCB2YWx1ZV0pIFstZ3wtR10gZmlsZSBbZmlsZS4uLl1cbiIpLAoJICAgIGFyZ3ZbMF0pOwogICAgZXhpdCgxKTsKICB9CgogIGdsb2JhbF9vcHRpbmQgPSBvcHRpbmQ7CS8qIEZvciBzaWduYWwgcm91dGluZS4gKi8KCiAgaWYgKHNldCB8fCBzZXRfZGVmKSB7CiAgICBmb3IoaSA9IG9wdGluZDsgaSA8IGFyZ2M7IGkrKykgewogICAgICBmaWxlID0gb3Blbihhcmd2W2ldLE9fUkRPTkxZKTsKICAgICAgaWYoZmlsZSA9PSAtMSkgewogICAgICAgIGludCBlcnJzdiA9IGVycm5vOwoJZnByaW50ZihzdGRlcnIsIF8oIkNhbid0IG9wZW4gJXM6ICVzXG4iKSxhcmd2W2ldLHN0cmVycm9yKGVycnN2KSk7CglleGl0KDEpOwogICAgICB9CiAgICAgIGlmKGlvY3RsKGZpbGUsCgkgICAgICAgc2V0ID8gQ1lTRVRUSFJFU0ggOiBDWVNFVERFRlRIUkVTSCwKCSAgICAgICBzZXQgPyBzZXRfdmFsIDogc2V0X2RlZl92YWwpKSB7CglpbnQgZXJyc3YgPSBlcnJubzsKCWZwcmludGYoc3RkZXJyLCBfKCJDYW4ndCBzZXQgJXMgdG8gdGhyZXNob2xkICVkOiAlc1xuIiksCgkJYXJndltpXSxzZXQ/c2V0X3ZhbDpzZXRfZGVmX3ZhbCxzdHJlcnJvcihlcnJzdikpOwoJZXhpdCgxKTsKICAgICAgfQogICAgICBjbG9zZShmaWxlKTsKICAgIH0KICB9CiAgaWYgKHNldF90aW1lIHx8IHNldF9kZWZfdGltZSkgewogICAgZm9yKGkgPSBvcHRpbmQ7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgZmlsZSA9IG9wZW4oYXJndltpXSxPX1JET05MWSk7CiAgICAgIGlmKGZpbGUgPT0gLTEpIHsKICAgICAgICBpbnQgZXJyc3YgPSBlcnJubzsKCWZwcmludGYoc3RkZXJyLCBfKCJDYW4ndCBvcGVuICVzOiAlc1xuIiksYXJndltpXSxzdHJlcnJvcihlcnJzdikpOwoJZXhpdCgxKTsKICAgICAgfQogICAgICBpZihpb2N0bChmaWxlLAoJICAgICAgIHNldF90aW1lID8gQ1lTRVRUSU1FT1VUIDogQ1lTRVRERUZUSU1FT1VULAoJICAgICAgIHNldF90aW1lID8gc2V0X3RpbWVfdmFsIDogc2V0X2RlZl90aW1lX3ZhbCkpIHsKCWludCBlcnJzdiA9IGVycm5vOwoJZnByaW50ZihzdGRlcnIsIF8oIkNhbid0IHNldCAlcyB0byB0aW1lIHRocmVzaG9sZCAlZDogJXNcbiIpLAoJCWFyZ3ZbaV0sc2V0X3RpbWU/c2V0X3RpbWVfdmFsOnNldF9kZWZfdGltZV92YWwsc3RyZXJyb3IoZXJyc3YpKTsKCWV4aXQoMSk7CiAgICAgIH0KICAgICAgY2xvc2UoZmlsZSk7CiAgICB9CiAgfQoKICBpZiAoZ2V0IHx8IGdldF9kZWYpIHsKICAgIGZvcihpID0gb3B0aW5kOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgIGZpbGUgPSBvcGVuKGFyZ3ZbaV0sT19SRE9OTFkpOwogICAgICBpZihmaWxlID09IC0xKSB7CiAgICAgICAgaW50IGVycnN2ID0gZXJybm87CglmcHJpbnRmKHN0ZGVyciwgXygiQ2FuJ3Qgb3BlbiAlczogJXNcbiIpLGFyZ3ZbaV0sc3RyZXJyb3IoZXJyc3YpKTsKCWV4aXQoMSk7CiAgICAgIH0KICAgICAgaWYoaW9jdGwoZmlsZSwgZ2V0ID8gQ1lHRVRUSFJFU0ggOiBDWUdFVERFRlRIUkVTSCwgJnRocmVzaG9sZF92YWx1ZSkpIHsKICAgICAgICBpbnQgZXJyc3YgPSBlcnJubzsKCWZwcmludGYoc3RkZXJyLCBfKCJDYW4ndCBnZXQgdGhyZXNob2xkIGZvciAlczogJXNcbiIpLAoJCWFyZ3ZbaV0sc3RyZXJyb3IoZXJyc3YpKTsKCWV4aXQoMSk7CiAgICAgIH0KICAgICAgaWYoaW9jdGwoZmlsZSwgZ2V0ID8gQ1lHRVRUSU1FT1VUIDogQ1lHRVRERUZUSU1FT1VULCAmdGltZW91dF92YWx1ZSkpIHsKICAgICAgCWludCBlcnJzdiA9IGVycm5vOwoJZnByaW50ZihzdGRlcnIsIF8oIkNhbid0IGdldCB0aW1lb3V0IGZvciAlczogJXNcbiIpLAoJCWFyZ3ZbaV0sc3RyZXJyb3IoZXJyc3YpKTsKCWV4aXQoMSk7CiAgICAgIH0KICAgICAgY2xvc2UoZmlsZSk7CiAgICAgIGlmIChnZXQpCgkgICAgICBwcmludGYoXygiJXM6ICVsZCBjdXJyZW50IHRocmVzaG9sZCBhbmQgJWxkIGN1cnJlbnQgdGltZW91dFxuIiksCgkJICAgICBhcmd2W2ldLCB0aHJlc2hvbGRfdmFsdWUsIHRpbWVvdXRfdmFsdWUpOwogICAgICBlbHNlCgkgICAgICBwcmludGYoXygiJXM6ICVsZCBkZWZhdWx0IHRocmVzaG9sZCBhbmQgJWxkIGRlZmF1bHQgdGltZW91dFxuIiksCgkJICAgICBhcmd2W2ldLCB0aHJlc2hvbGRfdmFsdWUsIHRpbWVvdXRfdmFsdWUpOwogICAgfQogIH0KCiAgaWYoIXF1ZXJ5KSByZXR1cm4gMDsJCS8qIG11c3QgaGF2ZSBiZWVuIHNvbWV0aGluZyBlYXJsaWVyICovCgogIC8qIHF1ZXJ5IHN0dWZmIGFmdGVyIHRoaXMgbGluZSAqLwogIAogIGNtb24gPSAoc3RydWN0IGN5Y2xhZGVzX2NvbnRyb2wgKikgbWFsbG9jKHNpemVvZiAoc3RydWN0IGN5Y2xhZGVzX2NvbnRyb2wpCgkJCQkJICAgICogbnVtZmlsZXMpOwogIGlmKCFjbW9uKSB7CiAgICBwZXJyb3IoXygibWFsbG9jIGZhaWxlZCIpKTsKICAgIGV4aXQoMSk7CiAgfQogIGlmKHNpZ25hbChTSUdJTlQsIHN1bW1hcnkpfHwKICAgICBzaWduYWwoU0lHUVVJVCwgc3VtbWFyeSl8fAogICAgIHNpZ25hbChTSUdURVJNLCBzdW1tYXJ5KSkgewogICAgcGVycm9yKF8oIkNhbid0IHNldCBzaWduYWwgaGFuZGxlciIpKTsKICAgIGV4aXQoMSk7CiAgfQogIGlmKGdldHRpbWVvZmRheSgmbGFzdHRpbWUsJnR6KSkgewogICAgcGVycm9yKF8oImdldHRpbWVvZmRheSBmYWlsZWQiKSk7CiAgICBleGl0KDEpOwogIH0KICBmb3IoaSA9IG9wdGluZDsgaSA8IGFyZ2M7IGkgKyspIHsKICAgIGNtb25faW5kZXggPSBpIC0gb3B0aW5kOwogICAgY21vbltjbW9uX2luZGV4XS5jZmlsZSA9IG9wZW4oYXJndltpXSwgT19SRE9OTFkpOwogICAgaWYoLTEgPT0gY21vbltjbW9uX2luZGV4XS5jZmlsZSkgewogICAgICBpbnQgZXJyc3YgPSBlcnJubzsKICAgICAgZnByaW50ZihzdGRlcnIsIF8oIkNhbid0IG9wZW4gJXM6ICVzXG4iKSxhcmd2W2ldLHN0cmVycm9yKGVycnN2KSk7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBpZihpb2N0bChjbW9uW2Ntb25faW5kZXhdLmNmaWxlLCBDWUdFVE1PTiwgJmNtb25bY21vbl9pbmRleF0uYykpIHsKICAgICAgaW50IGVycnN2ID0gZXJybm87CiAgICAgIGZwcmludGYoc3RkZXJyLCBfKCJDYW4ndCBpc3N1ZSBDWUdFVE1PTiBvbiAlczogJXNcbiIpLAoJICAgICAgYXJndltpXSxzdHJlcnJvcihlcnJzdikpOwogICAgICBleGl0KDEpOwogICAgfQogICAgc3VtbWFyeSgtMSk7CiAgICBpZihpb2N0bChjbW9uW2Ntb25faW5kZXhdLmNmaWxlLCBDWUdFVFRIUkVTSCwgJnRocmVzaG9sZF92YWx1ZSkpIHsKICAgICAgaW50IGVycnN2ID0gZXJybm87CiAgICAgIGZwcmludGYoc3RkZXJyLCBfKCJDYW4ndCBnZXQgdGhyZXNob2xkIGZvciAlczogJXNcbiIpLAoJICAgICAgYXJndltpXSxzdHJlcnJvcihlcnJzdikpOwogICAgICBleGl0KDEpOwogICAgfQogICAgaWYoaW9jdGwoY21vbltjbW9uX2luZGV4XS5jZmlsZSwgQ1lHRVRUSU1FT1VULCAmdGltZW91dF92YWx1ZSkpIHsKICAgICAgaW50IGVycnN2ID0gZXJybm87CiAgICAgIGZwcmludGYoc3RkZXJyLCBfKCJDYW4ndCBnZXQgdGltZW91dCBmb3IgJXM6ICVzXG4iKSwKCSAgICAgIGFyZ3ZbaV0sc3RyZXJyb3IoZXJyc3YpKTsKICAgICAgZXhpdCgxKTsKICAgIH0KICB9CiAgd2hpbGUoMSkgewogICAgc2xlZXAoaW50ZXJ2YWwpOwogICAgCiAgICBpZihnZXR0aW1lb2ZkYXkoJnRoaXN0aW1lLCZ0eikpIHsKICAgICAgcGVycm9yKF8oImdldHRpbWVvZmRheSBmYWlsZWQiKSk7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBkaWZmID0gZHRpbWUoJnRoaXN0aW1lLCAmbGFzdHRpbWUpOwogICAgbXZ0aW1lKCZsYXN0dGltZSwgJnRoaXN0aW1lKTsKCiAgICBmb3IoaSA9IG9wdGluZDsgaSA8IGFyZ2M7IGkgKyspIHsKICAgICAgY21vbl9pbmRleCA9IGkgLSBvcHRpbmQ7CiAgICAgIGlmKGlvY3RsKGNtb25bY21vbl9pbmRleF0uY2ZpbGUsIENZR0VUTU9OLCAmY3l3b3JrKSkgewogICAgICAgIGludCBlcnJzdiA9IGVycm5vOwoJZnByaW50ZihzdGRlcnIsIF8oIkNhbid0IGlzc3VlIENZR0VUTU9OIG9uICVzOiAlc1xuIiksCgkJYXJndltpXSxzdHJlcnJvcihlcnJzdikpOwoJZXhpdCgxKTsKICAgICAgfQogICAgICBpZihpb2N0bChjbW9uW2Ntb25faW5kZXhdLmNmaWxlLCBDWUdFVFRIUkVTSCwgJnRocmVzaG9sZF92YWx1ZSkpIHsKICAgICAgICBpbnQgZXJyc3YgPSBlcnJubzsKCWZwcmludGYoc3RkZXJyLCBfKCJDYW4ndCBnZXQgdGhyZXNob2xkIGZvciAlczogJXNcbiIpLAoJCWFyZ3ZbaV0sc3RyZXJyb3IoZXJyc3YpKTsKCWV4aXQoMSk7CiAgICAgIH0KICAgICAgaWYoaW9jdGwoY21vbltjbW9uX2luZGV4XS5jZmlsZSwgQ1lHRVRUSU1FT1VULCAmdGltZW91dF92YWx1ZSkpIHsKICAgICAgICBpbnQgZXJyc3YgPSBlcnJubzsKCWZwcmludGYoc3RkZXJyLCBfKCJDYW4ndCBnZXQgdGltZW91dCBmb3IgJXM6ICVzXG4iKSwKCQlhcmd2W2ldLHN0cmVycm9yKGVycnN2KSk7CglleGl0KDEpOwogICAgICB9CgogICAgICB4ZmVyX3JhdGUgPSBjeXdvcmsuY2hhcl9jb3VudC9kaWZmOwojaWZkZWYgWE1JVAogICAgICB4bWl0X3JhdGUgPSBjeXdvcmsuc2VuZF9jb3VudC9kaWZmOwojZW5kaWYKCiAgICAgIGlmKHRocmVzaG9sZF92YWx1ZSAhPSBjbW9uW2Ntb25faW5kZXhdLnRocmVzaG9sZF92YWx1ZSB8fAoJIHRpbWVvdXRfdmFsdWUgIT0gY21vbltjbW9uX2luZGV4XS50aW1lb3V0X3ZhbHVlKSB7CglzdW1tYXJ5KC0yKTsKCS8qIE5vdGUgdGhhdCB0aGUgc3VtbWFyeSBtdXN0IGNvbWUgYmVmb3JlIHRoZSBzZXR0aW5nIG9mICovCgkvKiB0aHJlc2hvbGRfdmFsdWUgKi8KCWNtb25bY21vbl9pbmRleF0udGhyZXNob2xkX3ZhbHVlID0gdGhyZXNob2xkX3ZhbHVlOwkgCgljbW9uW2Ntb25faW5kZXhdLnRpbWVvdXRfdmFsdWUgPSB0aW1lb3V0X3ZhbHVlOwkgCiAgICAgIH0gZWxzZSB7CgkvKiBEb24ndCByZWNvcmQgdGhpcyBmaXJzdCBjeWNsZSBhZnRlciBjaGFuZ2UgKi8KCWlmKHhmZXJfcmF0ZSA+IGNtb25bY21vbl9pbmRleF0ubWF4dHJhbikgCgkgIGNtb25bY21vbl9pbmRleF0ubWF4dHJhbiA9IHhmZXJfcmF0ZTsKI2lmZGVmIFhNSVQKCWlmKHhtaXRfcmF0ZSA+IGNtb25bY21vbl9pbmRleF0ubWF4eG1pdCkKICAgICAgICAgIGNtb25bY21vbl9pbmRleF0ubWF4eG1pdCA9IHhtaXRfcmF0ZTsKI2VuZGlmCglpZihjeXdvcmsuY2hhcl9tYXggPiBjbW9uW2Ntb25faW5kZXhdLm1heG1heCkgCgkgIGNtb25bY21vbl9pbmRleF0ubWF4bWF4ID0gY3l3b3JrLmNoYXJfbWF4OwogICAgICB9CgojaWZkZWYgWE1JVAogICAgICBwcmludGYoXygiJXM6ICVsdSBpbnRzLCAlbHUvJWx1IGNoYXJzOyBmaWZvOiAlbHUgdGhyZXNoLCAlbHUgdG1vdXQsICIKCSAgICAgICAiJWx1IG1heCwgJWx1IG5vd1xuIiksCgkgICAgIGFyZ3ZbaV0sCgkgICAgIGN5d29yay5pbnRfY291bnQsY3l3b3JrLmNoYXJfY291bnQsY3l3b3JrLnNlbmRfY291bnQsCgkgICAgIHRocmVzaG9sZF92YWx1ZSx0aW1lb3V0X3ZhbHVlLAoJICAgICBjeXdvcmsuY2hhcl9tYXgsY3l3b3JrLmNoYXJfbGFzdCk7CiAgICAgIHByaW50ZihfKCIgICAlZiBpbnQvc2VjOyAlZiByZWMsICVmIHNlbmQgKGNoYXIvc2VjKVxuIiksCgkgICAgIGN5d29yay5pbnRfY291bnQvZGlmZiwKCSAgICAgeGZlcl9yYXRlLAoJICAgICB4bWl0X3JhdGUpOwojZWxzZQogICAgICBwcmludGYoXygiJXM6ICVsdSBpbnRzLCAlbHUgY2hhcnM7IGZpZm86ICVsdSB0aHJlc2gsICVsdSB0bW91dCwgIgoJICAgICAgICIlbHUgbWF4LCAlbHUgbm93XG4iKSwKCSAgICAgYXJndltpXSwKCSAgICAgY3l3b3JrLmludF9jb3VudCxjeXdvcmsuY2hhcl9jb3VudCwKCSAgICAgdGhyZXNob2xkX3ZhbHVlLHRpbWVvdXRfdmFsdWUsCgkgICAgIGN5d29yay5jaGFyX21heCxjeXdvcmsuY2hhcl9sYXN0KTsKICAgICAgcHJpbnRmKF8oIiAgICVmIGludC9zZWM7ICVmIHJlYyAoY2hhci9zZWMpXG4iKSwKCSAgICAgY3l3b3JrLmludF9jb3VudC9kaWZmLAoJICAgICB4ZmVyX3JhdGUpOwojZW5kaWYKICAgICAgbWVtY3B5KCZjbW9uW2Ntb25faW5kZXhdLmMsICZjeXdvcmssIHNpemVvZiAoc3RydWN0IGN5Y2xhZGVzX21vbml0b3IpKTsKICAgIH0KICB9CgogIHJldHVybiAwOwp9Cg==