ZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovYWN0aXZlc29jay5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9hY3RpdmVzb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwMDRlZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovYWN0aXZlc29jay5jCkBAIC0wLDAgKzEsOTUyIEBACisvKiAkSWQ6IGFjdGl2ZXNvY2suYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9hY3RpdmVzb2NrLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3NvY2tldC5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL3NvY2suaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworI2lmIGRlZmluZWQoUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCkgJiYgXAorICAgIFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQhPTAKKyMgICBpbmNsdWRlIDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+CisKKyAgICBzdGF0aWMgcGpfYm9vbF90IGlvc19iZ19zdXBwb3J0ID0gUEpfVFJVRTsKKyNlbmRpZgorCisjZGVmaW5lIFBKX0FDVElWRVNPQ0tfTUFYX0xPT1AJICAgIDUwCisKKworZW51bSByZWFkX3R5cGUKK3sKKyAgICBUWVBFX05PTkUsCisgICAgVFlQRV9SRUNWLAorICAgIFRZUEVfUkVDVl9GUk9NCit9OworCitlbnVtIHNodXRkb3duX2RpcgoreworICAgIFNIVVRfTk9ORSA9IDAsCisgICAgU0hVVF9SWCA9IDEsCisgICAgU0hVVF9UWCA9IDIKK307CisKK3N0cnVjdCByZWFkX29wCit7CisgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdAkgb3Bfa2V5OworICAgIHBqX3VpbnQ4X3QJCSpwa3Q7CisgICAgdW5zaWduZWQJCSBtYXhfc2l6ZTsKKyAgICBwal9zaXplX3QJCSBzaXplOworICAgIHBqX3NvY2thZGRyCQkgc3JjX2FkZHI7CisgICAgaW50CQkJIHNyY19hZGRyX2xlbjsKK307CisKK3N0cnVjdCBhY2NlcHRfb3AKK3sKKyAgICBwal9pb3F1ZXVlX29wX2tleV90CSBvcF9rZXk7CisgICAgcGpfc29ja190CQkgbmV3X3NvY2s7CisgICAgcGpfc29ja2FkZHIJCSByZW1fYWRkcjsKKyAgICBpbnQJCQkgcmVtX2FkZHJfbGVuOworfTsKKworc3RydWN0IHNlbmRfZGF0YQoreworICAgIHBqX3VpbnQ4X3QJCSpkYXRhOworICAgIHBqX3NzaXplX3QJCSBsZW47CisgICAgcGpfc3NpemVfdAkJIHNlbnQ7CisgICAgdW5zaWduZWQJCSBmbGFnczsKK307CisKK3N0cnVjdCBwal9hY3RpdmVzb2NrX3QKK3sKKyAgICBwal9pb3F1ZXVlX2tleV90CSprZXk7CisgICAgcGpfYm9vbF90CQkgc3RyZWFtX29yaWVudGVkOworICAgIHBqX2Jvb2xfdAkJIHdob2xlX2RhdGE7CisgICAgcGpfaW9xdWV1ZV90CSppb3F1ZXVlOworICAgIHZvaWQJCSp1c2VyX2RhdGE7CisgICAgdW5zaWduZWQJCSBhc3luY19jb3VudDsKKyAgICB1bnNpZ25lZAkgCSBzaHV0ZG93bjsKKyAgICB1bnNpZ25lZAkJIG1heF9sb29wOworICAgIHBqX2FjdGl2ZXNvY2tfY2IJIGNiOworI2lmIGRlZmluZWQoUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCkgJiYgXAorICAgIFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQhPTAKKyAgICBpbnQJCQkgYmdfc2V0dGluZzsKKyAgICBwal9zb2NrX3QJCSBzb2NrOworICAgIENGUmVhZFN0cmVhbVJlZgkgcmVhZFN0cmVhbTsKKyNlbmRpZgorICAgIAorICAgIHVuc2lnbmVkCQkgZXJyX2NvdW50ZXI7CisgICAgcGpfc3RhdHVzX3QJCSBsYXN0X2VycjsKKworICAgIHN0cnVjdCBzZW5kX2RhdGEJIHNlbmRfZGF0YTsKKworICAgIHN0cnVjdCByZWFkX29wCSpyZWFkX29wOworICAgIHBqX3VpbnQzMl90CQkgcmVhZF9mbGFnczsKKyAgICBlbnVtIHJlYWRfdHlwZQkgcmVhZF90eXBlOworCisgICAgc3RydWN0IGFjY2VwdF9vcAkqYWNjZXB0X29wOworfTsKKworCitzdGF0aWMgdm9pZCBpb3F1ZXVlX29uX3JlYWRfY29tcGxldGUocGpfaW9xdWV1ZV9rZXlfdCAqa2V5LCAKKwkJCQkgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwgCisJCQkJICAgICBwal9zc2l6ZV90IGJ5dGVzX3JlYWQpOworc3RhdGljIHZvaWQgaW9xdWV1ZV9vbl93cml0ZV9jb21wbGV0ZShwal9pb3F1ZXVlX2tleV90ICprZXksIAorCQkJCSAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCQkgICAgICBwal9zc2l6ZV90IGJ5dGVzX3NlbnQpOworI2lmIFBKX0hBU19UQ1AKK3N0YXRpYyB2b2lkIGlvcXVldWVfb25fYWNjZXB0X2NvbXBsZXRlKHBqX2lvcXVldWVfa2V5X3QgKmtleSwgCisJCQkJICAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCQkgICAgICAgcGpfc29ja190IHNvY2ssIAorCQkJCSAgICAgICBwal9zdGF0dXNfdCBzdGF0dXMpOworc3RhdGljIHZvaWQgaW9xdWV1ZV9vbl9jb25uZWN0X2NvbXBsZXRlKHBqX2lvcXVldWVfa2V5X3QgKmtleSwgCisJCQkJCXBqX3N0YXR1c190IHN0YXR1cyk7CisjZW5kaWYKKworUEpfREVGKHZvaWQpIHBqX2FjdGl2ZXNvY2tfY2ZnX2RlZmF1bHQocGpfYWN0aXZlc29ja19jZmcgKmNmZykKK3sKKyAgICBwal9iemVybyhjZmcsIHNpemVvZigqY2ZnKSk7CisgICAgY2ZnLT5hc3luY19jbnQgPSAxOworICAgIGNmZy0+Y29uY3VycmVuY3kgPSAtMTsKKyAgICBjZmctPndob2xlX2RhdGEgPSBQSl9UUlVFOworfQorCisjaWYgZGVmaW5lZChQSl9JUEhPTkVfT1NfSEFTX01VTFRJVEFTS0lOR19TVVBQT1JUKSAmJiBcCisgICAgUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCE9MAorc3RhdGljIHZvaWQgYWN0aXZlc29ja19kZXN0cm95X2lwaG9uZV9vc19zdHJlYW0ocGpfYWN0aXZlc29ja190ICphc29jaykKK3sKKyAgICBpZiAoYXNvY2stPnJlYWRTdHJlYW0pIHsKKwlDRlJlYWRTdHJlYW1DbG9zZShhc29jay0+cmVhZFN0cmVhbSk7CisJQ0ZSZWxlYXNlKGFzb2NrLT5yZWFkU3RyZWFtKTsKKwlhc29jay0+cmVhZFN0cmVhbSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhY3RpdmVzb2NrX2NyZWF0ZV9pcGhvbmVfb3Nfc3RyZWFtKHBqX2FjdGl2ZXNvY2tfdCAqYXNvY2spCit7CisgICAgaWYgKGlvc19iZ19zdXBwb3J0ICYmIGFzb2NrLT5iZ19zZXR0aW5nICYmIGFzb2NrLT5zdHJlYW1fb3JpZW50ZWQpIHsKKwlhY3RpdmVzb2NrX2Rlc3Ryb3lfaXBob25lX29zX3N0cmVhbShhc29jayk7CisKKwlDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0KGtDRkFsbG9jYXRvckRlZmF1bHQsIGFzb2NrLT5zb2NrLAorCQkJCSAgICAgJmFzb2NrLT5yZWFkU3RyZWFtLCBOVUxMKTsKKworCWlmICghYXNvY2stPnJlYWRTdHJlYW0gfHwKKwkgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoYXNvY2stPnJlYWRTdHJlYW0sCisJCQkJICAgIGtDRlN0cmVhbU5ldHdvcmtTZXJ2aWNlVHlwZSwKKwkJCQkgICAga0NGU3RyZWFtTmV0d29ya1NlcnZpY2VUeXBlVm9JUCkKKwkgICAgIT0gVFJVRSB8fAorCSAgICBDRlJlYWRTdHJlYW1PcGVuKGFzb2NrLT5yZWFkU3RyZWFtKSAhPSBUUlVFKQorCXsKKwkgICAgUEpfTE9HKDIsKCIiLCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBUQ1AgdHJhbnNwb3J0IGZvciBWb0lQICIKKwkJICAgICAgInVzYWdlLiBCYWNrZ3JvdW5kIG1vZGUgd2lsbCBub3QgYmUgc3VwcG9ydGVkLiIpKTsKKwkgICAgCisJICAgIGFjdGl2ZXNvY2tfZGVzdHJveV9pcGhvbmVfb3Nfc3RyZWFtKGFzb2NrKTsKKwl9CisgICAgfQorfQorCisKK1BKX0RFRih2b2lkKSBwal9hY3RpdmVzb2NrX3NldF9pcGhvbmVfb3NfYmcocGpfYWN0aXZlc29ja190ICphc29jaywKKwkJCQkJICAgIGludCB2YWwpCit7CisgICAgYXNvY2stPmJnX3NldHRpbmcgPSB2YWw7CisgICAgaWYgKGFzb2NrLT5iZ19zZXR0aW5nKQorCWFjdGl2ZXNvY2tfY3JlYXRlX2lwaG9uZV9vc19zdHJlYW0oYXNvY2spOworICAgIGVsc2UKKwlhY3RpdmVzb2NrX2Rlc3Ryb3lfaXBob25lX29zX3N0cmVhbShhc29jayk7Cit9CisKK1BKX0RFRih2b2lkKSBwal9hY3RpdmVzb2NrX2VuYWJsZV9pcGhvbmVfb3NfYmcocGpfYm9vbF90IHZhbCkKK3sKKyAgICBpb3NfYmdfc3VwcG9ydCA9IHZhbDsKK30KKyNlbmRpZgorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2FjdGl2ZXNvY2tfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgcGpfc29ja190IHNvY2ssCisJCQkJCSAgaW50IHNvY2tfdHlwZSwKKwkJCQkJICBjb25zdCBwal9hY3RpdmVzb2NrX2NmZyAqb3B0LAorCQkJCQkgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSwKKwkJCQkJICBjb25zdCBwal9hY3RpdmVzb2NrX2NiICpjYiwKKwkJCQkJICB2b2lkICp1c2VyX2RhdGEsCisJCQkJCSAgcGpfYWN0aXZlc29ja190ICoqcF9hc29jaykKK3sKKyAgICBwal9hY3RpdmVzb2NrX3QgKmFzb2NrOworICAgIHBqX2lvcXVldWVfY2FsbGJhY2sgaW9xX2NiOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBpb3F1ZXVlICYmIGNiICYmIHBfYXNvY2ssIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzb2NrIT0wICYmIHNvY2shPVBKX0lOVkFMSURfU09DS0VULCBQSl9FSU5WQUwpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc29ja190eXBlPT1wal9TT0NLX1NUUkVBTSgpIHx8CisJCSAgICAgc29ja190eXBlPT1wal9TT0NLX0RHUkFNKCksIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTighb3B0IHx8IG9wdC0+YXN5bmNfY250ID49IDEsIFBKX0VJTlZBTCk7CisKKyAgICBhc29jayA9IFBKX1BPT0xfWkFMTE9DX1QocG9vbCwgcGpfYWN0aXZlc29ja190KTsKKyAgICBhc29jay0+aW9xdWV1ZSA9IGlvcXVldWU7CisgICAgYXNvY2stPnN0cmVhbV9vcmllbnRlZCA9IChzb2NrX3R5cGUgPT0gcGpfU09DS19TVFJFQU0oKSk7CisgICAgYXNvY2stPmFzeW5jX2NvdW50ID0gKG9wdD8gb3B0LT5hc3luY19jbnQgOiAxKTsKKyAgICBhc29jay0+d2hvbGVfZGF0YSA9IChvcHQ/IG9wdC0+d2hvbGVfZGF0YSA6IDEpOworICAgIGFzb2NrLT5tYXhfbG9vcCA9IFBKX0FDVElWRVNPQ0tfTUFYX0xPT1A7CisgICAgYXNvY2stPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgICBwal9tZW1jcHkoJmFzb2NrLT5jYiwgY2IsIHNpemVvZigqY2IpKTsKKworICAgIHBqX2J6ZXJvKCZpb3FfY2IsIHNpemVvZihpb3FfY2IpKTsKKyAgICBpb3FfY2Iub25fcmVhZF9jb21wbGV0ZSA9ICZpb3F1ZXVlX29uX3JlYWRfY29tcGxldGU7CisgICAgaW9xX2NiLm9uX3dyaXRlX2NvbXBsZXRlID0gJmlvcXVldWVfb25fd3JpdGVfY29tcGxldGU7CisjaWYgUEpfSEFTX1RDUAorICAgIGlvcV9jYi5vbl9jb25uZWN0X2NvbXBsZXRlID0gJmlvcXVldWVfb25fY29ubmVjdF9jb21wbGV0ZTsKKyAgICBpb3FfY2Iub25fYWNjZXB0X2NvbXBsZXRlID0gJmlvcXVldWVfb25fYWNjZXB0X2NvbXBsZXRlOworI2VuZGlmCisKKyAgICBzdGF0dXMgPSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2syKHBvb2wsIGlvcXVldWUsIHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0PyBvcHQtPmdycF9sb2NrIDogTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc29jaywgJmlvcV9jYiwgJmFzb2NrLT5rZXkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqX2FjdGl2ZXNvY2tfY2xvc2UoYXNvY2spOworCXJldHVybiBzdGF0dXM7CisgICAgfQorICAgIAorICAgIGlmIChhc29jay0+d2hvbGVfZGF0YSkgeworCS8qIE11c3QgZGlzYWJsZSBjb25jdXJyZW5jeSBvdGhlcndpc2UgdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiAqLworCXBqX2lvcXVldWVfc2V0X2NvbmN1cnJlbmN5KGFzb2NrLT5rZXksIDApOworICAgIH0gZWxzZSBpZiAob3B0ICYmIG9wdC0+Y29uY3VycmVuY3kgPj0gMCkgeworCXBqX2lvcXVldWVfc2V0X2NvbmN1cnJlbmN5KGFzb2NrLT5rZXksIG9wdC0+Y29uY3VycmVuY3kpOworICAgIH0KKworI2lmIGRlZmluZWQoUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCkgJiYgXAorICAgIFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQhPTAKKyAgICBhc29jay0+c29jayA9IHNvY2s7CisgICAgYXNvY2stPmJnX3NldHRpbmcgPSBQSl9BQ1RJVkVTT0NLX1RDUF9JUEhPTkVfT1NfQkc7CisjZW5kaWYKKworICAgICpwX2Fzb2NrID0gYXNvY2s7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9hY3RpdmVzb2NrX2NyZWF0ZV91ZHAoIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICAgY29uc3QgcGpfc29ja2FkZHIgKmFkZHIsCisJCQkJCSAgICAgIGNvbnN0IHBqX2FjdGl2ZXNvY2tfY2ZnICpvcHQsCisJCQkJCSAgICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSwKKwkJCQkJICAgICAgY29uc3QgcGpfYWN0aXZlc29ja19jYiAqY2IsCisJCQkJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJICAgICAgcGpfYWN0aXZlc29ja190ICoqcF9hc29jaywKKwkJCQkJICAgICAgcGpfc29ja2FkZHIgKmJvdW5kX2FkZHIpCit7CisgICAgcGpfc29ja190IHNvY2tfZmQ7CisgICAgcGpfc29ja2FkZHIgZGVmYXVsdF9hZGRyOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChhZGRyID09IE5VTEwpIHsKKwlwal9zb2NrYWRkcl9pbml0KHBqX0FGX0lORVQoKSwgJmRlZmF1bHRfYWRkciwgTlVMTCwgMCk7CisJYWRkciA9ICZkZWZhdWx0X2FkZHI7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfc29ja19zb2NrZXQoYWRkci0+YWRkci5zYV9mYW1pbHksIHBqX1NPQ0tfREdSQU0oKSwgMCwgCisJCQkgICAgJnNvY2tfZmQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfc29ja19iaW5kKHNvY2tfZmQsIGFkZHIsIHBqX3NvY2thZGRyX2dldF9sZW4oYWRkcikpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqX3NvY2tfY2xvc2Uoc29ja19mZCk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9hY3RpdmVzb2NrX2NyZWF0ZShwb29sLCBzb2NrX2ZkLCBwal9TT0NLX0RHUkFNKCksIG9wdCwKKwkJCQkgIGlvcXVldWUsIGNiLCB1c2VyX2RhdGEsIHBfYXNvY2spOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqX3NvY2tfY2xvc2Uoc29ja19mZCk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoYm91bmRfYWRkcikgeworCWludCBhZGRyX2xlbiA9IHNpemVvZigqYm91bmRfYWRkcik7CisJc3RhdHVzID0gcGpfc29ja19nZXRzb2NrbmFtZShzb2NrX2ZkLCBib3VuZF9hZGRyLCAmYWRkcl9sZW4pOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBwal9hY3RpdmVzb2NrX2Nsb3NlKCpwX2Fzb2NrKTsKKwkgICAgcmV0dXJuIHN0YXR1czsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfYWN0aXZlc29ja19jbG9zZShwal9hY3RpdmVzb2NrX3QgKmFzb2NrKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oYXNvY2ssIFBKX0VJTlZBTCk7CisgICAgYXNvY2stPnNodXRkb3duID0gU0hVVF9SWCB8IFNIVVRfVFg7CisgICAgaWYgKGFzb2NrLT5rZXkpIHsKKyNpZiBkZWZpbmVkKFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQpICYmIFwKKyAgICBQSl9JUEhPTkVfT1NfSEFTX01VTFRJVEFTS0lOR19TVVBQT1JUIT0wCisJYWN0aXZlc29ja19kZXN0cm95X2lwaG9uZV9vc19zdHJlYW0oYXNvY2spOworI2VuZGlmCQorCQorCXBqX2lvcXVldWVfdW5yZWdpc3Rlcihhc29jay0+a2V5KTsKKwlhc29jay0+a2V5ID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9hY3RpdmVzb2NrX3NldF91c2VyX2RhdGEoIHBqX2FjdGl2ZXNvY2tfdCAqYXNvY2ssCisJCQkJCQkgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oYXNvY2ssIFBKX0VJTlZBTCk7CisgICAgYXNvY2stPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitQSl9ERUYodm9pZCopIHBqX2FjdGl2ZXNvY2tfZ2V0X3VzZXJfZGF0YShwal9hY3RpdmVzb2NrX3QgKmFzb2NrKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oYXNvY2ssIE5VTEwpOworICAgIHJldHVybiBhc29jay0+dXNlcl9kYXRhOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfYWN0aXZlc29ja19zdGFydF9yZWFkKHBqX2FjdGl2ZXNvY2tfdCAqYXNvY2ssCisJCQkJCSAgICAgcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgIHVuc2lnbmVkIGJ1ZmZfc2l6ZSwKKwkJCQkJICAgICBwal91aW50MzJfdCBmbGFncykKK3sKKyAgICB2b2lkICoqcmVhZGJ1ZjsKKyAgICB1bnNpZ25lZCBpOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihhc29jayAmJiBwb29sICYmIGJ1ZmZfc2l6ZSwgUEpfRUlOVkFMKTsKKworICAgIHJlYWRidWYgPSAodm9pZCoqKSBwal9wb29sX2NhbGxvYyhwb29sLCBhc29jay0+YXN5bmNfY291bnQsIAorCQkJCSAgICAgIHNpemVvZih2b2lkKikpOworCisgICAgZm9yIChpPTA7IGk8YXNvY2stPmFzeW5jX2NvdW50OyArK2kpIHsKKwlyZWFkYnVmW2ldID0gcGpfcG9vbF9hbGxvYyhwb29sLCBidWZmX3NpemUpOworICAgIH0KKworICAgIHJldHVybiBwal9hY3RpdmVzb2NrX3N0YXJ0X3JlYWQyKGFzb2NrLCBwb29sLCBidWZmX3NpemUsIHJlYWRidWYsIGZsYWdzKTsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2FjdGl2ZXNvY2tfc3RhcnRfcmVhZDIoIHBqX2FjdGl2ZXNvY2tfdCAqYXNvY2ssCisJCQkJCSAgICAgICBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgICB1bnNpZ25lZCBidWZmX3NpemUsCisJCQkJCSAgICAgICB2b2lkICpyZWFkYnVmW10sCisJCQkJCSAgICAgICBwal91aW50MzJfdCBmbGFncykKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oYXNvY2sgJiYgcG9vbCAmJiBidWZmX3NpemUsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihhc29jay0+cmVhZF90eXBlID09IFRZUEVfTk9ORSwgUEpfRUlOVkFMSURPUCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihhc29jay0+cmVhZF9vcCA9PSBOVUxMLCBQSl9FSU5WQUxJRE9QKTsKKworICAgIGFzb2NrLT5yZWFkX29wID0gKHN0cnVjdCByZWFkX29wKikKKwkJICAgICBwal9wb29sX2NhbGxvYyhwb29sLCBhc29jay0+YXN5bmNfY291bnQsIAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJlYWRfb3ApKTsKKyAgICBhc29jay0+cmVhZF90eXBlID0gVFlQRV9SRUNWOworICAgIGFzb2NrLT5yZWFkX2ZsYWdzID0gZmxhZ3M7CisKKyAgICBmb3IgKGk9MDsgaTxhc29jay0+YXN5bmNfY291bnQ7ICsraSkgeworCXN0cnVjdCByZWFkX29wICpyID0gJmFzb2NrLT5yZWFkX29wW2ldOworCXBqX3NzaXplX3Qgc2l6ZV90b19yZWFkOworCisJci0+cGt0ID0gKHBqX3VpbnQ4X3QqKXJlYWRidWZbaV07CisJc2l6ZV90b19yZWFkID0gci0+bWF4X3NpemUgPSBidWZmX3NpemU7CisKKwlzdGF0dXMgPSBwal9pb3F1ZXVlX3JlY3YoYXNvY2stPmtleSwgJnItPm9wX2tleSwgci0+cGt0LCAmc2l6ZV90b19yZWFkLAorCQkJCSBQSl9JT1FVRVVFX0FMV0FZU19BU1lOQyB8IGZsYWdzKTsKKwlQSl9BU1NFUlRfUkVUVVJOKHN0YXR1cyAhPSBQSl9TVUNDRVNTLCBQSl9FQlVHKTsKKworCWlmIChzdGF0dXMgIT0gUEpfRVBFTkRJTkcpCisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9hY3RpdmVzb2NrX3N0YXJ0X3JlY3Zmcm9tKHBqX2FjdGl2ZXNvY2tfdCAqYXNvY2ssCisJCQkJCQkgcGpfcG9vbF90ICpwb29sLAorCQkJCQkJIHVuc2lnbmVkIGJ1ZmZfc2l6ZSwKKwkJCQkJCSBwal91aW50MzJfdCBmbGFncykKK3sKKyAgICB2b2lkICoqcmVhZGJ1ZjsKKyAgICB1bnNpZ25lZCBpOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihhc29jayAmJiBwb29sICYmIGJ1ZmZfc2l6ZSwgUEpfRUlOVkFMKTsKKworICAgIHJlYWRidWYgPSAodm9pZCoqKSBwal9wb29sX2NhbGxvYyhwb29sLCBhc29jay0+YXN5bmNfY291bnQsIAorCQkJCSAgICAgIHNpemVvZih2b2lkKikpOworCisgICAgZm9yIChpPTA7IGk8YXNvY2stPmFzeW5jX2NvdW50OyArK2kpIHsKKwlyZWFkYnVmW2ldID0gcGpfcG9vbF9hbGxvYyhwb29sLCBidWZmX3NpemUpOworICAgIH0KKworICAgIHJldHVybiBwal9hY3RpdmVzb2NrX3N0YXJ0X3JlY3Zmcm9tMihhc29jaywgcG9vbCwgYnVmZl9zaXplLCAKKwkJCQkJIHJlYWRidWYsIGZsYWdzKTsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2FjdGl2ZXNvY2tfc3RhcnRfcmVjdmZyb20yKCBwal9hY3RpdmVzb2NrX3QgKmFzb2NrLAorCQkJCQkJICAgcGpfcG9vbF90ICpwb29sLAorCQkJCQkJICAgdW5zaWduZWQgYnVmZl9zaXplLAorCQkJCQkJICAgdm9pZCAqcmVhZGJ1ZltdLAorCQkJCQkJICAgcGpfdWludDMyX3QgZmxhZ3MpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFzb2NrICYmIHBvb2wgJiYgYnVmZl9zaXplLCBQSl9FSU5WQUwpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oYXNvY2stPnJlYWRfdHlwZSA9PSBUWVBFX05PTkUsIFBKX0VJTlZBTElET1ApOworCisgICAgYXNvY2stPnJlYWRfb3AgPSAoc3RydWN0IHJlYWRfb3AqKQorCQkgICAgIHBqX3Bvb2xfY2FsbG9jKHBvb2wsIGFzb2NrLT5hc3luY19jb3VudCwgCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcmVhZF9vcCkpOworICAgIGFzb2NrLT5yZWFkX3R5cGUgPSBUWVBFX1JFQ1ZfRlJPTTsKKyAgICBhc29jay0+cmVhZF9mbGFncyA9IGZsYWdzOworCisgICAgZm9yIChpPTA7IGk8YXNvY2stPmFzeW5jX2NvdW50OyArK2kpIHsKKwlzdHJ1Y3QgcmVhZF9vcCAqciA9ICZhc29jay0+cmVhZF9vcFtpXTsKKwlwal9zc2l6ZV90IHNpemVfdG9fcmVhZDsKKworCXItPnBrdCA9IChwal91aW50OF90KikgcmVhZGJ1ZltpXTsKKwlzaXplX3RvX3JlYWQgPSByLT5tYXhfc2l6ZSA9IGJ1ZmZfc2l6ZTsKKwlyLT5zcmNfYWRkcl9sZW4gPSBzaXplb2Yoci0+c3JjX2FkZHIpOworCisJc3RhdHVzID0gcGpfaW9xdWV1ZV9yZWN2ZnJvbShhc29jay0+a2V5LCAmci0+b3Bfa2V5LCByLT5wa3QsCisJCQkJICAgICAmc2l6ZV90b19yZWFkLCAKKwkJCQkgICAgIFBKX0lPUVVFVUVfQUxXQVlTX0FTWU5DIHwgZmxhZ3MsCisJCQkJICAgICAmci0+c3JjX2FkZHIsICZyLT5zcmNfYWRkcl9sZW4pOworCVBKX0FTU0VSVF9SRVRVUk4oc3RhdHVzICE9IFBKX1NVQ0NFU1MsIFBKX0VCVUcpOworCisJaWYgKHN0YXR1cyAhPSBQSl9FUEVORElORykKKwkgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgdm9pZCBpb3F1ZXVlX29uX3JlYWRfY29tcGxldGUocGpfaW9xdWV1ZV9rZXlfdCAqa2V5LCAKKwkJCQkgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwgCisJCQkJICAgICBwal9zc2l6ZV90IGJ5dGVzX3JlYWQpCit7CisgICAgcGpfYWN0aXZlc29ja190ICphc29jazsKKyAgICBzdHJ1Y3QgcmVhZF9vcCAqciA9IChzdHJ1Y3QgcmVhZF9vcCopb3Bfa2V5OworICAgIHVuc2lnbmVkIGxvb3AgPSAwOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGFzb2NrID0gKHBqX2FjdGl2ZXNvY2tfdCopIHBqX2lvcXVldWVfZ2V0X3VzZXJfZGF0YShrZXkpOworCisgICAgLyogSWdub3JlIGlmIHdlJ3ZlIGJlZW4gc2h1dGRvd24gKi8KKyAgICBpZiAoYXNvY2stPnNodXRkb3duICYgU0hVVF9SWCkKKwlyZXR1cm47CisKKyAgICBkbyB7CisJdW5zaWduZWQgZmxhZ3M7CisKKwlpZiAoYnl0ZXNfcmVhZCA+IDApIHsKKwkgICAgLyoKKwkgICAgICogV2UndmUgZ290IG5ldyBkYXRhLgorCSAgICAgKi8KKwkgICAgcGpfc2l6ZV90IHJlbWFpbmRlcjsKKwkgICAgcGpfYm9vbF90IHJldDsKKworCSAgICAvKiBBcHBlbmQgdGhpcyBuZXcgZGF0YSB0byBleGlzdGluZyBkYXRhLiBJZiBzb2NrZXQgaXMgc3RyZWFtIAorCSAgICAgKiBvcmllbnRlZCwgdXNlciBtaWdodCBoYXZlIGxlZnQgc29tZSBkYXRhIGluIHRoZSBidWZmZXIuIAorCSAgICAgKiBPdGhlcndpc2UgaWYgc29ja2V0IGlzIGRhdGFncmFtIHRoZXJlIHdpbGwgYmUgbm90aGluZyBpbiAKKwkgICAgICogZXhpc3RpbmcgcGFja2V0IGhlbmNlIHRoZSBwYWNrZXQgd2lsbCBjb250YWluIG9ubHkgdGhlIG5ldworCSAgICAgKiBwYWNrZXQuCisJICAgICAqLworCSAgICByLT5zaXplICs9IGJ5dGVzX3JlYWQ7CisKKwkgICAgLyogU2V0IGRlZmF1bHQgcmVtYWluZGVyIHRvIHplcm8gKi8KKwkgICAgcmVtYWluZGVyID0gMDsKKworCSAgICAvKiBBbmQgcmV0dXJuIHZhbHVlIHRvIFRSVUUgKi8KKwkgICAgcmV0ID0gUEpfVFJVRTsKKworCSAgICAvKiBOb3RpZnkgY2FsbGJhY2sgKi8KKwkgICAgaWYgKGFzb2NrLT5yZWFkX3R5cGUgPT0gVFlQRV9SRUNWICYmIGFzb2NrLT5jYi5vbl9kYXRhX3JlYWQpIHsKKwkJcmV0ID0gKCphc29jay0+Y2Iub25fZGF0YV9yZWFkKShhc29jaywgci0+cGt0LCByLT5zaXplLAorCQkJCQkJUEpfU1VDQ0VTUywgJnJlbWFpbmRlcik7CisJICAgIH0gZWxzZSBpZiAoYXNvY2stPnJlYWRfdHlwZSA9PSBUWVBFX1JFQ1ZfRlJPTSAmJiAKKwkJICAgICAgIGFzb2NrLT5jYi5vbl9kYXRhX3JlY3Zmcm9tKSAKKwkgICAgeworCQlyZXQgPSAoKmFzb2NrLT5jYi5vbl9kYXRhX3JlY3Zmcm9tKShhc29jaywgci0+cGt0LCByLT5zaXplLAorCQkJCQkJICAgICZyLT5zcmNfYWRkciwgCisJCQkJCQkgICAgci0+c3JjX2FkZHJfbGVuLAorCQkJCQkJICAgIFBKX1NVQ0NFU1MpOworCSAgICB9CisKKwkgICAgLyogSWYgY2FsbGJhY2sgcmV0dXJucyBmYWxzZSwgd2UgaGF2ZSBiZWVuIGRlc3Ryb3llZCEgKi8KKwkgICAgaWYgKCFyZXQpCisJCXJldHVybjsKKworCSAgICAvKiBPbmx5IHN0cmVhbSBvcmllbnRlZCBzb2NrZXQgbWF5IGxlYXZlIGRhdGEgaW4gdGhlIHBhY2tldCAqLworCSAgICBpZiAoYXNvY2stPnN0cmVhbV9vcmllbnRlZCkgeworCQlyLT5zaXplID0gcmVtYWluZGVyOworCSAgICB9IGVsc2UgeworCQlyLT5zaXplID0gMDsKKwkgICAgfQorCisJfSBlbHNlIGlmIChieXRlc19yZWFkIDw9IDAgJiYKKwkJICAgLWJ5dGVzX3JlYWQgIT0gUEpfU1RBVFVTX0ZST01fT1MoT1NFUlJfRVdPVUxEQkxPQ0spICYmCisJCSAgIC1ieXRlc19yZWFkICE9IFBKX1NUQVRVU19GUk9NX09TKE9TRVJSX0VJTlBST0dSRVNTKSAmJiAKKwkJICAgKGFzb2NrLT5zdHJlYW1fb3JpZW50ZWQgfHwKKwkJICAgIC1ieXRlc19yZWFkICE9IFBKX1NUQVRVU19GUk9NX09TKE9TRVJSX0VDT05OUkVTRVQpKSkgCisJeworCSAgICBwal9zaXplX3QgcmVtYWluZGVyOworCSAgICBwal9ib29sX3QgcmV0OworCisJICAgIGlmIChieXRlc19yZWFkID09IDApIHsKKwkJLyogRm9yIHN0cmVhbS9jb25uZWN0aW9uIG9yaWVudGVkIHNvY2tldCwgdGhpcyBtZWFucyB0aGUgCisJCSAqIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLiBGb3IgZGF0YWdyYW0gc29ja2V0cywgaXQgbWVhbnMKKwkJICogd2UndmUgcmVjZWl2ZWQgZGF0YWdyYW0gd2l0aCB6ZXJvIGxlbmd0aC4KKwkJICovCisJCWlmIChhc29jay0+c3RyZWFtX29yaWVudGVkKQorCQkgICAgc3RhdHVzID0gUEpfRUVPRjsKKwkJZWxzZQorCQkgICAgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKwkgICAgfSBlbHNlIHsKKwkJLyogVGhpcyBtZWFucyB3ZSd2ZSBnb3QgYW4gZXJyb3IuIElmIHRoaXMgaXMgc3RyZWFtL2Nvbm5lY3Rpb24KKwkJICogb3JpZW50ZWQsIGl0IG1lYW5zIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLiBGb3IgZGF0YWdyYW0KKwkJICogc29ja2V0cywgaXQgbWVhbnMgd2UndmUgZ290IHNvbWUgZXJyb3IgKGUuZy4gRVdPVUxEQkxPQ0spLgorCQkgKi8KKwkJc3RhdHVzID0gKHBqX3N0YXR1c190KS1ieXRlc19yZWFkOworCSAgICB9CisKKwkgICAgLyogU2V0IGRlZmF1bHQgcmVtYWluZGVyIHRvIHplcm8gKi8KKwkgICAgcmVtYWluZGVyID0gMDsKKworCSAgICAvKiBBbmQgcmV0dXJuIHZhbHVlIHRvIFRSVUUgKi8KKwkgICAgcmV0ID0gUEpfVFJVRTsKKworCSAgICAvKiBOb3RpZnkgY2FsbGJhY2sgKi8KKwkgICAgaWYgKGFzb2NrLT5yZWFkX3R5cGUgPT0gVFlQRV9SRUNWICYmIGFzb2NrLT5jYi5vbl9kYXRhX3JlYWQpIHsKKwkJLyogRm9yIGNvbm5lY3Rpb24gb3JpZW50ZWQgc29ja2V0LCB3ZSBzdGlsbCBuZWVkIHRvIHJlcG9ydCAKKwkJICogdGhlIHJlbWFpbmRlciBkYXRhIChpZiBhbnkpIHRvIHRoZSB1c2VyIHRvIGxldCB1c2VyIGRvIAorCQkgKiBwcm9jZXNzaW5nIHdpdGggdGhlIHJlbWFpbmRlciBkYXRhIGJlZm9yZSBpdCBjbG9zZXMgdGhlCisJCSAqIGNvbm5lY3Rpb24uCisJCSAqIElmIHRoZXJlIGlzIG5vIHJlbWFpbmRlciBkYXRhLCBzZXQgdGhlIHBhY2tldCB0byBOVUxMLgorCQkgKi8KKworCQkvKiBTaG91bGRuJ3Qgc2V0IHRoZSBwYWNrZXQgdG8gTlVMTCwgYXMgdGhlcmUgbWF5IGJlIGFjdGl2ZSAKKwkJICogc29ja2V0IHVzZXIsIHN1Y2ggYXMgU1NMIHNvY2tldCwgdGhhdCBuZWVkcyB0byBoYXZlIGFjY2VzcworCQkgKiB0byB0aGUgcmVhZCBidWZmZXIgcGFja2V0LgorCQkgKi8KKwkJLy9yZXQgPSAoKmFzb2NrLT5jYi5vbl9kYXRhX3JlYWQpKGFzb2NrLCAoci0+c2l6ZT8gci0+cGt0Ok5VTEwpLAorCQkvLwkJCQlyLT5zaXplLCBzdGF0dXMsICZyZW1haW5kZXIpOworCQlyZXQgPSAoKmFzb2NrLT5jYi5vbl9kYXRhX3JlYWQpKGFzb2NrLCByLT5wa3QsIHItPnNpemUsCisJCQkJCQlzdGF0dXMsICZyZW1haW5kZXIpOworCisJICAgIH0gZWxzZSBpZiAoYXNvY2stPnJlYWRfdHlwZSA9PSBUWVBFX1JFQ1ZfRlJPTSAmJiAKKwkJICAgICAgIGFzb2NrLT5jYi5vbl9kYXRhX3JlY3Zmcm9tKSAKKwkgICAgeworCQkvKiBUaGlzIHdvdWxkIGFsd2F5cyBiZSBkYXRhZ3JhbSBvcmllbnRlZCBoZW5jZSB0aGVyZSdzIAorCQkgKiBub3RoaW5nIGluIHRoZSBwYWNrZXQuIFdlIGNhbid0IGJlIHN1cmUgaWYgdGhlcmUgd2lsbCBiZQorCQkgKiBhbnl0aGluZyB1c2VmdWwgaW4gdGhlIHNvdXJjZV9hZGRyLCBzbyBqdXN0IHB1dCBOVUxMCisJCSAqIHRoZXJlIHRvby4KKwkJICovCisJCS8qIEluIHNvbWUgc2NlbmFyaW9zLCBzdGF0dXMgbWF5IGJlIFBKX1NVQ0NFU1MuIFRoZSB1cHBlciAKKwkJICogbGF5ZXIgYXBwbGljYXRpb24gbWF5IG5vdCBleHBlY3QgdGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZAorCQkgKiB3aXRoIHN1Y2Nlc3NmdWwgc3RhdHVzIGFuZCBOVUxMIGRhdGEsIHNvIGxldHMgbm90IGNhbGwgdGhlCisJCSAqIGNhbGxiYWNrIGlmIHRoZSBzdGF0dXMgaXMgUEpfU1VDQ0VTUy4KKwkJICovCisJCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyApIHsKKwkJICAgIHJldCA9ICgqYXNvY2stPmNiLm9uX2RhdGFfcmVjdmZyb20pKGFzb2NrLCBOVUxMLCAwLAorCQkJCQkJCU5VTEwsIDAsIHN0YXR1cyk7CisJCX0KKwkgICAgfQorCisJICAgIC8qIElmIGNhbGxiYWNrIHJldHVybnMgZmFsc2UsIHdlIGhhdmUgYmVlbiBkZXN0cm95ZWQhICovCisJICAgIGlmICghcmV0KQorCQlyZXR1cm47CisKKwkgICAgLyogQWxzbyBzdG9wIGZ1cnRoZXIgcmVhZCBpZiB3ZSd2ZSBiZWVuIHNodXRkb3duICovCisJICAgIGlmIChhc29jay0+c2h1dGRvd24gJiBTSFVUX1JYKQorCQlyZXR1cm47CisKKwkgICAgLyogT25seSBzdHJlYW0gb3JpZW50ZWQgc29ja2V0IG1heSBsZWF2ZSBkYXRhIGluIHRoZSBwYWNrZXQgKi8KKwkgICAgaWYgKGFzb2NrLT5zdHJlYW1fb3JpZW50ZWQpIHsKKwkJci0+c2l6ZSA9IHJlbWFpbmRlcjsKKwkgICAgfSBlbHNlIHsKKwkJci0+c2l6ZSA9IDA7CisJICAgIH0KKwl9CisKKwkvKiBSZWFkIG5leHQgZGF0YS4gV2UgbGltaXQgb3Vyc2VsdmVzIHRvIHByb2Nlc3NpbmcgbWF4X2xvb3AgaW1tZWRpYXRlCisJICogZGF0YSwgc28gd2hlbiB0aGUgbG9vcCBjb3VudGVyIGhhcyBleGNlZWRlZCB0aGlzIHZhbHVlLCBmb3JjZSB0aGUKKwkgKiByZWFkKCkvcmVjdmZyb20oKSB0byByZXR1cm4gcGVuZGluZyBvcGVyYXRpb24gdG8gYWxsb3cgdGhlIHByb2dyYW0KKwkgKiB0byBkbyBvdGhlciBqb2JzLgorCSAqLworCWJ5dGVzX3JlYWQgPSByLT5tYXhfc2l6ZSAtIHItPnNpemU7CisJZmxhZ3MgPSBhc29jay0+cmVhZF9mbGFnczsKKwlpZiAoKytsb29wID49IGFzb2NrLT5tYXhfbG9vcCkKKwkgICAgZmxhZ3MgfD0gUEpfSU9RVUVVRV9BTFdBWVNfQVNZTkM7CisKKwlpZiAoYXNvY2stPnJlYWRfdHlwZSA9PSBUWVBFX1JFQ1YpIHsKKwkgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9yZWN2KGtleSwgb3Bfa2V5LCByLT5wa3QgKyByLT5zaXplLCAKKwkJCQkgICAgICZieXRlc19yZWFkLCBmbGFncyk7CisJfSBlbHNlIHsKKwkgICAgci0+c3JjX2FkZHJfbGVuID0gc2l6ZW9mKHItPnNyY19hZGRyKTsKKwkgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9yZWN2ZnJvbShrZXksIG9wX2tleSwgci0+cGt0ICsgci0+c2l6ZSwKKwkJCQkgICAgICAgICAmYnl0ZXNfcmVhZCwgZmxhZ3MsCisJCQkJCSAmci0+c3JjX2FkZHIsICZyLT5zcmNfYWRkcl9sZW4pOworCX0KKworCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCSAgICAvKiBJbW1lZGlhdGUgZGF0YSAqLworCSAgICA7CisJfSBlbHNlIGlmIChzdGF0dXMgIT0gUEpfRVBFTkRJTkcgJiYgc3RhdHVzICE9IFBKX0VDQU5DRUxMRUQpIHsKKwkgICAgLyogRXJyb3IgKi8KKwkgICAgYnl0ZXNfcmVhZCA9IC1zdGF0dXM7CisJfSBlbHNlIHsKKwkgICAgYnJlYWs7CisJfQorICAgIH0gd2hpbGUgKDEpOworCit9CisKKworc3RhdGljIHBqX3N0YXR1c190IHNlbmRfcmVtYWluaW5nKHBqX2FjdGl2ZXNvY2tfdCAqYXNvY2ssIAorCQkJCSAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqc2VuZF9rZXkpCit7CisgICAgc3RydWN0IHNlbmRfZGF0YSAqc2QgPSAoc3RydWN0IHNlbmRfZGF0YSopc2VuZF9rZXktPmFjdGl2ZXNvY2tfZGF0YTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBkbyB7CisJcGpfc3NpemVfdCBzaXplOworCisJc2l6ZSA9IHNkLT5sZW4gLSBzZC0+c2VudDsKKwlzdGF0dXMgPSBwal9pb3F1ZXVlX3NlbmQoYXNvY2stPmtleSwgc2VuZF9rZXksIAorCQkJCSBzZC0+ZGF0YStzZC0+c2VudCwgJnNpemUsIHNkLT5mbGFncyk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIC8qIFBlbmRpbmcgb3IgZXJyb3IgKi8KKwkgICAgYnJlYWs7CisJfQorCisJc2QtPnNlbnQgKz0gc2l6ZTsKKwlpZiAoc2QtPnNlbnQgPT0gc2QtPmxlbikgeworCSAgICAvKiBUaGUgd2hvbGUgZGF0YSBoYXMgYmVlbiBzZW50LiAqLworCSAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKwl9CisKKyAgICB9IHdoaWxlIChzZC0+c2VudCA8IHNkLT5sZW4pOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2FjdGl2ZXNvY2tfc2VuZCggcGpfYWN0aXZlc29ja190ICphc29jaywKKwkJCQkJcGpfaW9xdWV1ZV9vcF9rZXlfdCAqc2VuZF9rZXksCisJCQkJCWNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCXBqX3NzaXplX3QgKnNpemUsCisJCQkJCXVuc2lnbmVkIGZsYWdzKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oYXNvY2sgJiYgc2VuZF9rZXkgJiYgZGF0YSAmJiBzaXplLCBQSl9FSU5WQUwpOworCisgICAgaWYgKGFzb2NrLT5zaHV0ZG93biAmIFNIVVRfVFgpCisJcmV0dXJuIFBKX0VJTlZBTElET1A7CisKKyAgICBzZW5kX2tleS0+YWN0aXZlc29ja19kYXRhID0gTlVMTDsKKworICAgIGlmIChhc29jay0+d2hvbGVfZGF0YSkgeworCXBqX3NzaXplX3Qgd2hvbGU7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJd2hvbGUgPSAqc2l6ZTsKKworCXN0YXR1cyA9IHBqX2lvcXVldWVfc2VuZChhc29jay0+a2V5LCBzZW5kX2tleSwgZGF0YSwgc2l6ZSwgZmxhZ3MpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICAvKiBQZW5kaW5nIG9yIGVycm9yICovCisJICAgIHJldHVybiBzdGF0dXM7CisJfQorCisJaWYgKCpzaXplID09IHdob2xlKSB7CisJICAgIC8qIFRoZSB3aG9sZSBkYXRhIGhhcyBiZWVuIHNlbnQuICovCisJICAgIHJldHVybiBQSl9TVUNDRVNTOworCX0KKworCS8qIERhdGEgd2FzIHBhcnRpYWxseSBzZW50ICovCisJYXNvY2stPnNlbmRfZGF0YS5kYXRhID0gKHBqX3VpbnQ4X3QqKWRhdGE7CisJYXNvY2stPnNlbmRfZGF0YS5sZW4gPSB3aG9sZTsKKwlhc29jay0+c2VuZF9kYXRhLnNlbnQgPSAqc2l6ZTsKKwlhc29jay0+c2VuZF9kYXRhLmZsYWdzID0gZmxhZ3M7CisJc2VuZF9rZXktPmFjdGl2ZXNvY2tfZGF0YSA9ICZhc29jay0+c2VuZF9kYXRhOworCisJLyogVHJ5IGFnYWluICovCisJc3RhdHVzID0gc2VuZF9yZW1haW5pbmcoYXNvY2ssIHNlbmRfa2V5KTsKKwlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwkgICAgKnNpemUgPSB3aG9sZTsKKwl9CisJcmV0dXJuIHN0YXR1czsKKworICAgIH0gZWxzZSB7CisJcmV0dXJuIHBqX2lvcXVldWVfc2VuZChhc29jay0+a2V5LCBzZW5kX2tleSwgZGF0YSwgc2l6ZSwgZmxhZ3MpOworICAgIH0KK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2FjdGl2ZXNvY2tfc2VuZHRvKCBwal9hY3RpdmVzb2NrX3QgKmFzb2NrLAorCQkJCQkgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKnNlbmRfa2V5LAorCQkJCQkgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgcGpfc3NpemVfdCAqc2l6ZSwKKwkJCQkJICB1bnNpZ25lZCBmbGFncywKKwkJCQkJICBjb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCQkgIGludCBhZGRyX2xlbikKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFzb2NrICYmIHNlbmRfa2V5ICYmIGRhdGEgJiYgc2l6ZSAmJiBhZGRyICYmIGFkZHJfbGVuLCAKKwkJICAgICBQSl9FSU5WQUwpOworCisgICAgaWYgKGFzb2NrLT5zaHV0ZG93biAmIFNIVVRfVFgpCisJcmV0dXJuIFBKX0VJTlZBTElET1A7CisKKyAgICByZXR1cm4gcGpfaW9xdWV1ZV9zZW5kdG8oYXNvY2stPmtleSwgc2VuZF9rZXksIGRhdGEsIHNpemUsIGZsYWdzLAorCQkJICAgICBhZGRyLCBhZGRyX2xlbik7Cit9CisKKworc3RhdGljIHZvaWQgaW9xdWV1ZV9vbl93cml0ZV9jb21wbGV0ZShwal9pb3F1ZXVlX2tleV90ICprZXksIAorCQkJCSAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCQkgICAgICBwal9zc2l6ZV90IGJ5dGVzX3NlbnQpCit7CisgICAgcGpfYWN0aXZlc29ja190ICphc29jazsKKworICAgIGFzb2NrID0gKHBqX2FjdGl2ZXNvY2tfdCopIHBqX2lvcXVldWVfZ2V0X3VzZXJfZGF0YShrZXkpOworCisgICAgLyogSWdub3JlIGlmIHdlJ3ZlIGJlZW4gc2h1dGRvd24uIFRoaXMgbWF5IGNhdXNlIGRhdGEgdG8gYmUgcGFydGlhbGx5CisgICAgICogc2VudCBldmVuIHdoZW4gJ3dob2xlZGF0YScgd2FzIHJlcXVlc3RlZCBpZiB0aGUgT1Mgb25seSBzZW50IHBhcnRpYWwKKyAgICAgKiBidWZmZXIuCisgICAgICovCisgICAgaWYgKGFzb2NrLT5zaHV0ZG93biAmIFNIVVRfVFgpCisJcmV0dXJuOworCisgICAgaWYgKGJ5dGVzX3NlbnQgPiAwICYmIG9wX2tleS0+YWN0aXZlc29ja19kYXRhKSB7CisJLyogd2hvbGVfZGF0YSBpcyByZXF1ZXN0ZWQuIE1ha2Ugc3VyZSB3ZSBzZW5kIGFsbCB0aGUgZGF0YSAqLworCXN0cnVjdCBzZW5kX2RhdGEgKnNkID0gKHN0cnVjdCBzZW5kX2RhdGEqKW9wX2tleS0+YWN0aXZlc29ja19kYXRhOworCisJc2QtPnNlbnQgKz0gYnl0ZXNfc2VudDsKKwlpZiAoc2QtPnNlbnQgPT0gc2QtPmxlbikgeworCSAgICAvKiBhbGwgaGFzIGJlZW4gc2VudCAqLworCSAgICBieXRlc19zZW50ID0gc2QtPnNlbnQ7CisJICAgIG9wX2tleS0+YWN0aXZlc29ja19kYXRhID0gTlVMTDsKKwl9IGVsc2UgeworCSAgICAvKiBzZW5kIHJlbWFpbmluZyBkYXRhICovCisJICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworCSAgICBzdGF0dXMgPSBzZW5kX3JlbWFpbmluZyhhc29jaywgb3Bfa2V5KTsKKwkgICAgaWYgKHN0YXR1cyA9PSBQSl9FUEVORElORykKKwkJcmV0dXJuOworCSAgICBlbHNlIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwkJYnl0ZXNfc2VudCA9IHNkLT5zZW50OworCSAgICBlbHNlCisJCWJ5dGVzX3NlbnQgPSAtc3RhdHVzOworCisJICAgIG9wX2tleS0+YWN0aXZlc29ja19kYXRhID0gTlVMTDsKKwl9CisgICAgfSAKKworICAgIGlmIChhc29jay0+Y2Iub25fZGF0YV9zZW50KSB7CisJcGpfYm9vbF90IHJldDsKKworCXJldCA9ICgqYXNvY2stPmNiLm9uX2RhdGFfc2VudCkoYXNvY2ssIG9wX2tleSwgYnl0ZXNfc2VudCk7CisKKwkvKiBJZiBjYWxsYmFjayByZXR1cm5zIGZhbHNlLCB3ZSBoYXZlIGJlZW4gZGVzdHJveWVkISAqLworCWlmICghcmV0KQorCSAgICByZXR1cm47CisgICAgfQorfQorCisjaWYgUEpfSEFTX1RDUAorUEpfREVGKHBqX3N0YXR1c190KSBwal9hY3RpdmVzb2NrX3N0YXJ0X2FjY2VwdChwal9hY3RpdmVzb2NrX3QgKmFzb2NrLAorCQkJCQkgICAgICAgcGpfcG9vbF90ICpwb29sKQoreworICAgIHVuc2lnbmVkIGk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFzb2NrLCBQSl9FSU5WQUwpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oYXNvY2stPmFjY2VwdF9vcD09TlVMTCwgUEpfRUlOVkFMSURPUCk7CisKKyAgICAvKiBJZ25vcmUgaWYgd2UndmUgYmVlbiBzaHV0ZG93biAqLworICAgIGlmIChhc29jay0+c2h1dGRvd24pCisJcmV0dXJuIFBKX0VJTlZBTElET1A7CisKKyAgICBhc29jay0+YWNjZXB0X29wID0gKHN0cnVjdCBhY2NlcHRfb3AqKQorCQkgICAgICAgcGpfcG9vbF9jYWxsb2MocG9vbCwgYXNvY2stPmFzeW5jX2NvdW50LAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYWNjZXB0X29wKSk7CisgICAgZm9yIChpPTA7IGk8YXNvY2stPmFzeW5jX2NvdW50OyArK2kpIHsKKwlzdHJ1Y3QgYWNjZXB0X29wICphID0gJmFzb2NrLT5hY2NlcHRfb3BbaV07CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJZG8geworCSAgICBhLT5uZXdfc29jayA9IFBKX0lOVkFMSURfU09DS0VUOworCSAgICBhLT5yZW1fYWRkcl9sZW4gPSBzaXplb2YoYS0+cmVtX2FkZHIpOworCisJICAgIHN0YXR1cyA9IHBqX2lvcXVldWVfYWNjZXB0KGFzb2NrLT5rZXksICZhLT5vcF9rZXksICZhLT5uZXdfc29jaywKKwkJCQkgICAgICAgTlVMTCwgJmEtPnJlbV9hZGRyLCAmYS0+cmVtX2FkZHJfbGVuKTsKKwkgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJCS8qIFdlJ3ZlIGdvdCBpbW1lZGlhdGUgY29ubmVjdGlvbi4gTm90IHN1cmUgaWYgaXQncyBhIGdvb2QKKwkJICogaWRlYSB0byBjYWxsIHRoZSBjYWxsYmFjayBub3cgKHByb2JhYmx5IGFwcGxpY2F0aW9uIHdpbGwKKwkJICogbm90IGJlIHByZXBhcmVkIHRvIHByb2Nlc3MgaXQpLCBzbyBsZXRzIGp1c3Qgc2lsZW50bHkKKwkJICogY2xvc2UgdGhlIHNvY2tldC4KKwkJICovCisJCXBqX3NvY2tfY2xvc2UoYS0+bmV3X3NvY2spOworCSAgICB9CisJfSB3aGlsZSAoc3RhdHVzID09IFBKX1NVQ0NFU1MpOworCisJaWYgKHN0YXR1cyAhPSBQSl9FUEVORElORykgeworCSAgICByZXR1cm4gc3RhdHVzOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgdm9pZCBpb3F1ZXVlX29uX2FjY2VwdF9jb21wbGV0ZShwal9pb3F1ZXVlX2tleV90ICprZXksIAorCQkJCSAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisJCQkJICAgICAgIHBqX3NvY2tfdCBuZXdfc29jaywgCisJCQkJICAgICAgIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBwal9hY3RpdmVzb2NrX3QgKmFzb2NrID0gKHBqX2FjdGl2ZXNvY2tfdCopIHBqX2lvcXVldWVfZ2V0X3VzZXJfZGF0YShrZXkpOworICAgIHN0cnVjdCBhY2NlcHRfb3AgKmFjY2VwdF9vcCA9IChzdHJ1Y3QgYWNjZXB0X29wKikgb3Bfa2V5OworCisgICAgUEpfVU5VU0VEX0FSRyhuZXdfc29jayk7CisKKyAgICAvKiBJZ25vcmUgaWYgd2UndmUgYmVlbiBzaHV0ZG93biAqLworICAgIGlmIChhc29jay0+c2h1dGRvd24pCisJcmV0dXJuOworCisgICAgZG8geworCWlmIChzdGF0dXMgPT0gYXNvY2stPmxhc3RfZXJyICYmIHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFzb2NrLT5lcnJfY291bnRlcisrOworCSAgICBpZiAoYXNvY2stPmVycl9jb3VudGVyID49IFBKX0FDVElWRVNPQ0tfTUFYX0NPTlNFQ1VUSVZFX0FDQ0VQVF9FUlJPUikgeworCQlQSl9MT0coMywgKCIiLCAiUmVjZWl2ZWQgJWQgY29uc2VjdXRpdmUgZXJyb3JzOiAlZCBmb3IgdGhlIGFjY2VwdCgpIgorCQkJICAgICAgICIgb3BlcmF0aW9uLCBzdG9wcGluZyBmdXJ0aGVyIGlvcXVldWUgYWNjZXB0cy4iLAorCQkJICAgICAgIGFzb2NrLT5lcnJfY291bnRlciwgYXNvY2stPmxhc3RfZXJyKSk7CisJCQorCQlpZiAoKHN0YXR1cyA9PSBQSl9TVEFUVVNfRlJPTV9PUyhPU0VSUl9FV09VTERCTE9DSykpICYmIAorCQkgICAgKGFzb2NrLT5jYi5vbl9hY2NlcHRfY29tcGxldGUyKSkgCisJCXsKKwkJICAgICgqYXNvY2stPmNiLm9uX2FjY2VwdF9jb21wbGV0ZTIpKGFzb2NrLCAKKwkJCQkJCSAgICAgYWNjZXB0X29wLT5uZXdfc29jaywKKwkJCQkJCSAgICAgJmFjY2VwdF9vcC0+cmVtX2FkZHIsCisJCQkJCQkgICAgIGFjY2VwdF9vcC0+cmVtX2FkZHJfbGVuLAorCQkJCQkJICAgICBQSl9FU09DS0VUU1RPUCk7CisJCX0KKwkJcmV0dXJuOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgYXNvY2stPmVycl9jb3VudGVyID0gMDsKKwkgICAgYXNvY2stPmxhc3RfZXJyID0gc3RhdHVzOworCX0KKworCWlmIChzdGF0dXM9PVBKX1NVQ0NFU1MgJiYgKGFzb2NrLT5jYi5vbl9hY2NlcHRfY29tcGxldGUyIHx8IAorCQkJCSAgIGFzb2NrLT5jYi5vbl9hY2NlcHRfY29tcGxldGUpKSB7CisJICAgIHBqX2Jvb2xfdCByZXQ7CisKKwkgICAgLyogTm90aWZ5IGNhbGxiYWNrICovCisJICAgIGlmIChhc29jay0+Y2Iub25fYWNjZXB0X2NvbXBsZXRlMikgeworCQlyZXQgPSAoKmFzb2NrLT5jYi5vbl9hY2NlcHRfY29tcGxldGUyKShhc29jaywgCisJCQkJCQkgICAgICAgYWNjZXB0X29wLT5uZXdfc29jaywKKwkJCQkJCSAgICAgICAmYWNjZXB0X29wLT5yZW1fYWRkciwKKwkJCQkJCSAgICAgICBhY2NlcHRfb3AtPnJlbV9hZGRyX2xlbiwKKwkJCQkJCSAgICAgICBzdGF0dXMpOworCSAgICB9IGVsc2UgeworCQlyZXQgPSAoKmFzb2NrLT5jYi5vbl9hY2NlcHRfY29tcGxldGUpKGFzb2NrLCAKKwkJCQkJCSAgICAgIGFjY2VwdF9vcC0+bmV3X3NvY2ssCisJCQkJCQkgICAgICAmYWNjZXB0X29wLT5yZW1fYWRkciwKKwkJCQkJCSAgICAgIGFjY2VwdF9vcC0+cmVtX2FkZHJfbGVuKTsJICAgIAorCSAgICB9CisKKwkgICAgLyogSWYgY2FsbGJhY2sgcmV0dXJucyBmYWxzZSwgd2UgaGF2ZSBiZWVuIGRlc3Ryb3llZCEgKi8KKwkgICAgaWYgKCFyZXQpCisJCXJldHVybjsKKworI2lmIGRlZmluZWQoUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCkgJiYgXAorICAgIFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQhPTAKKwkgICAgYWN0aXZlc29ja19jcmVhdGVfaXBob25lX29zX3N0cmVhbShhc29jayk7CisjZW5kaWYKKwl9IGVsc2UgaWYgKHN0YXR1cz09UEpfU1VDQ0VTUykgeworCSAgICAvKiBBcHBsaWNhdGlvbiBkb2Vzbid0IGhhbmRsZSB0aGUgbmV3IHNvY2tldCwgd2UgbmVlZCB0byAKKwkgICAgICogY2xvc2UgaXQgdG8gYXZvaWQgcmVzb3VyY2UgbGVhay4KKwkgICAgICovCisJICAgIHBqX3NvY2tfY2xvc2UoYWNjZXB0X29wLT5uZXdfc29jayk7CisJfQorCisJLyogRG9uJ3Qgc3RhcnQgYW5vdGhlciBhY2NlcHQoKSBpZiB3ZSd2ZSBiZWVuIHNodXRkb3duICovCisJaWYgKGFzb2NrLT5zaHV0ZG93bikKKwkgICAgcmV0dXJuOworCisJLyogUHJlcGFyZSBuZXh0IGFjY2VwdCgpICovCisJYWNjZXB0X29wLT5uZXdfc29jayA9IFBKX0lOVkFMSURfU09DS0VUOworCWFjY2VwdF9vcC0+cmVtX2FkZHJfbGVuID0gc2l6ZW9mKGFjY2VwdF9vcC0+cmVtX2FkZHIpOworCisJc3RhdHVzID0gcGpfaW9xdWV1ZV9hY2NlcHQoYXNvY2stPmtleSwgb3Bfa2V5LCAmYWNjZXB0X29wLT5uZXdfc29jaywKKwkJCQkgICBOVUxMLCAmYWNjZXB0X29wLT5yZW1fYWRkciwgCisJCQkJICAgJmFjY2VwdF9vcC0+cmVtX2FkZHJfbGVuKTsKKworICAgIH0gd2hpbGUgKHN0YXR1cyAhPSBQSl9FUEVORElORyAmJiBzdGF0dXMgIT0gUEpfRUNBTkNFTExFRCk7Cit9CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9hY3RpdmVzb2NrX3N0YXJ0X2Nvbm5lY3QoIHBqX2FjdGl2ZXNvY2tfdCAqYXNvY2ssCisJCQkJCQkgcGpfcG9vbF90ICpwb29sLAorCQkJCQkJIGNvbnN0IHBqX3NvY2thZGRyX3QgKnJlbWFkZHIsCisJCQkJCQkgaW50IGFkZHJfbGVuKQoreworICAgIFBKX1VOVVNFRF9BUkcocG9vbCk7CisKKyAgICBpZiAoYXNvY2stPnNodXRkb3duKQorCXJldHVybiBQSl9FSU5WQUxJRE9QOworCisgICAgcmV0dXJuIHBqX2lvcXVldWVfY29ubmVjdChhc29jay0+a2V5LCByZW1hZGRyLCBhZGRyX2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIGlvcXVldWVfb25fY29ubmVjdF9jb21wbGV0ZShwal9pb3F1ZXVlX2tleV90ICprZXksIAorCQkJCQlwal9zdGF0dXNfdCBzdGF0dXMpCit7CisgICAgcGpfYWN0aXZlc29ja190ICphc29jayA9IChwal9hY3RpdmVzb2NrX3QqKSBwal9pb3F1ZXVlX2dldF91c2VyX2RhdGEoa2V5KTsKKworICAgIC8qIElnbm9yZSBpZiB3ZSd2ZSBiZWVuIHNodXRkb3duICovCisgICAgaWYgKGFzb2NrLT5zaHV0ZG93bikKKwlyZXR1cm47CisKKyAgICBpZiAoYXNvY2stPmNiLm9uX2Nvbm5lY3RfY29tcGxldGUpIHsKKwlwal9ib29sX3QgcmV0OworCisJcmV0ID0gKCphc29jay0+Y2Iub25fY29ubmVjdF9jb21wbGV0ZSkoYXNvY2ssIHN0YXR1cyk7CisKKwlpZiAoIXJldCkgeworCSAgICAvKiBXZSd2ZSBiZWVuIGRlc3Ryb3llZCAqLworCSAgICByZXR1cm47CisJfQorCQorI2lmIGRlZmluZWQoUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCkgJiYgXAorICAgIFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQhPTAKKwlhY3RpdmVzb2NrX2NyZWF0ZV9pcGhvbmVfb3Nfc3RyZWFtKGFzb2NrKTsKKyNlbmRpZgorCQorICAgIH0KK30KKyNlbmRpZgkvKiBQSl9IQVNfVENQICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovYWRkcl9yZXNvbHZfbGludXhfa2VybmVsLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2FkZHJfcmVzb2x2X2xpbnV4X2tlcm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGU2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2FkZHJfcmVzb2x2X2xpbnV4X2tlcm5lbC5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qICRJZDogYWRkcl9yZXNvbHZfbGludXhfa2VybmVsLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9hZGRyX3Jlc29sdi5oPgorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldGhvc3RieW5hbWUoY29uc3QgcGpfc3RyX3QgKmhvc3RuYW1lLCBwal9ob3N0ZW50ICpwaGUpCit7CisgICAgcmV0dXJuIC0xOworfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2FkZHJfcmVzb2x2X3NvY2suYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovYWRkcl9yZXNvbHZfc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjdlZDgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2FkZHJfcmVzb2x2X3NvY2suYwpAQCAtMCwwICsxLDI4MiBAQAorLyogJElkOiBhZGRyX3Jlc29sdl9zb2NrLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9hZGRyX3Jlc29sdi5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovaXBfaGVscGVyLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3NvY2tldC5oPgorCisjaWYgZGVmaW5lZChQSl9HRVRBRERSSU5GT19VU0VfQ0ZIT1NUKSAmJiBQSl9HRVRBRERSSU5GT19VU0VfQ0ZIT1NUIT0wCisjICAgaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZTdHJpbmcuaD4KKyMgICBpbmNsdWRlIDxDRk5ldHdvcmsvQ0ZIb3N0Lmg+CisjZW5kaWYKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRob3N0YnluYW1lKGNvbnN0IHBqX3N0cl90ICpob3N0bmFtZSwgcGpfaG9zdGVudCAqcGhlKQoreworICAgIHN0cnVjdCBob3N0ZW50ICpoZTsKKyAgICBjaGFyIGNvcHlbUEpfTUFYX0hPU1ROQU1FXTsKKworICAgIHBqX2Fzc2VydChob3N0bmFtZSAmJiBob3N0bmFtZSAtPnNsZW4gPCBQSl9NQVhfSE9TVE5BTUUpOworICAgIAorICAgIGlmIChob3N0bmFtZS0+c2xlbiA+PSBQSl9NQVhfSE9TVE5BTUUpCisJcmV0dXJuIFBKX0VOQU1FVE9PTE9ORzsKKworICAgIHBqX21lbWNweShjb3B5LCBob3N0bmFtZS0+cHRyLCBob3N0bmFtZS0+c2xlbik7CisgICAgY29weVsgaG9zdG5hbWUtPnNsZW4gXSA9ICdcMCc7CisKKyAgICBoZSA9IGdldGhvc3RieW5hbWUoY29weSk7CisgICAgaWYgKCFoZSkgeworCXJldHVybiBQSl9FUkVTT0xWRTsKKwkvKiBETyBOT1QgdXNlIHBqX2dldF9uZXRvc19lcnJvcigpIHNpbmNlIGhvc3QgcmVzb2x1dGlvbiBlcnJvcgorCSAqIGlzIHJlcG9ydGVkIGluIGhfZXJybm8gaW5zdGVhZCBvZiBlcnJubyEKKwlyZXR1cm4gcGpfZ2V0X25ldG9zX2Vycm9yKCk7CisJICovCisgICAgfQorCisgICAgcGhlLT5oX25hbWUgPSBoZS0+aF9uYW1lOworICAgIHBoZS0+aF9hbGlhc2VzID0gaGUtPmhfYWxpYXNlczsKKyAgICBwaGUtPmhfYWRkcnR5cGUgPSBoZS0+aF9hZGRydHlwZTsKKyAgICBwaGUtPmhfbGVuZ3RoID0gaGUtPmhfbGVuZ3RoOworICAgIHBoZS0+aF9hZGRyX2xpc3QgPSBoZS0+aF9hZGRyX2xpc3Q7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogUmVzb2x2ZSBJUHY0L0lQdjYgYWRkcmVzcyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRhZGRyaW5mbyhpbnQgYWYsIGNvbnN0IHBqX3N0cl90ICpub2RlbmFtZSwKKwkJCQkgICB1bnNpZ25lZCAqY291bnQsIHBqX2FkZHJpbmZvIGFpW10pCit7CisjaWYgZGVmaW5lZChQSl9TT0NLX0hBU19HRVRBRERSSU5GTykgJiYgUEpfU09DS19IQVNfR0VUQUREUklORk8hPTAKKyAgICBjaGFyIG5vZGVjb3B5W1BKX01BWF9IT1NUTkFNRV07CisgICAgcGpfYm9vbF90IGhhc19hZGRyID0gUEpfRkFMU0U7CisgICAgdW5zaWduZWQgaTsKKyNpZiBkZWZpbmVkKFBKX0dFVEFERFJJTkZPX1VTRV9DRkhPU1QpICYmIFBKX0dFVEFERFJJTkZPX1VTRV9DRkhPU1QhPTAKKyAgICBDRlN0cmluZ1JlZiBob3N0bmFtZTsKKyAgICBDRkhvc3RSZWYgaG9zdFJlZjsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXMgPSBQSl9TVUNDRVNTOworI2Vsc2UKKyAgICBpbnQgcmM7CisgICAgc3RydWN0IGFkZHJpbmZvIGhpbnQsICpyZXMsICpvcmlnX3JlczsKKyNlbmRpZgorCisgICAgUEpfQVNTRVJUX1JFVFVSTihub2RlbmFtZSAmJiBjb3VudCAmJiAqY291bnQgJiYgYWksIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihub2RlbmFtZS0+cHRyICYmIG5vZGVuYW1lLT5zbGVuLCBQSl9FSU5WQUwpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oYWY9PVBKX0FGX0lORVQgfHwgYWY9PVBKX0FGX0lORVQ2IHx8CisJCSAgICAgYWY9PVBKX0FGX1VOU1BFQywgUEpfRUlOVkFMKTsKKworICAgIC8qIENoZWNrIGlmIG5vZGVuYW1lIGlzIElQIGFkZHJlc3MgKi8KKyAgICBwal9iemVybygmYWlbMF0sIHNpemVvZihhaVswXSkpOworICAgIGlmICgoYWY9PVBKX0FGX0lORVQgfHwgYWY9PVBKX0FGX1VOU1BFQykgJiYKKwlwal9pbmV0X3B0b24oUEpfQUZfSU5FVCwgbm9kZW5hbWUsCisJCSAgICAgJmFpWzBdLmFpX2FkZHIuaXB2NC5zaW5fYWRkcikgPT0gUEpfU1VDQ0VTUykKKyAgICB7CisJYWYgPSBQSl9BRl9JTkVUOworCWhhc19hZGRyID0gUEpfVFJVRTsKKyAgICB9IGVsc2UgaWYgKChhZj09UEpfQUZfSU5FVDYgfHwgYWY9PVBKX0FGX1VOU1BFQykgJiYKKwkgICAgICAgcGpfaW5ldF9wdG9uKFBKX0FGX0lORVQ2LCBub2RlbmFtZSwKKwkgICAgICAgICAgICAgICAgICAgICZhaVswXS5haV9hZGRyLmlwdjYuc2luNl9hZGRyKSA9PSBQSl9TVUNDRVNTKQorICAgIHsKKwlhZiA9IFBKX0FGX0lORVQ2OworCWhhc19hZGRyID0gUEpfVFJVRTsKKyAgICB9CisKKyAgICBpZiAoaGFzX2FkZHIpIHsKKwlwal9zdHJfdCB0bXA7CisKKwl0bXAucHRyID0gYWlbMF0uYWlfY2Fub25uYW1lOworCXBqX3N0cm5jcHlfd2l0aF9udWxsKCZ0bXAsIG5vZGVuYW1lLCBQSl9NQVhfSE9TVE5BTUUpOworCWFpWzBdLmFpX2FkZHIuYWRkci5zYV9mYW1pbHkgPSAocGpfdWludDE2X3QpYWY7CisJKmNvdW50ID0gMTsKKworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKworICAgIC8qIENvcHkgbm9kZSBuYW1lIHRvIG51bGwgdGVybWluYXRlZCBzdHJpbmcuICovCisgICAgaWYgKG5vZGVuYW1lLT5zbGVuID49IFBKX01BWF9IT1NUTkFNRSkKKwlyZXR1cm4gUEpfRU5BTUVUT09MT05HOworICAgIHBqX21lbWNweShub2RlY29weSwgbm9kZW5hbWUtPnB0ciwgbm9kZW5hbWUtPnNsZW4pOworICAgIG5vZGVjb3B5W25vZGVuYW1lLT5zbGVuXSA9ICdcMCc7CisKKyNpZiBkZWZpbmVkKFBKX0dFVEFERFJJTkZPX1VTRV9DRkhPU1QpICYmIFBKX0dFVEFERFJJTkZPX1VTRV9DRkhPU1QhPTAKKyAgICBob3N0bmFtZSA9ICBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIG5vZGVjb3B5LAorCQkJCQkJa0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwKKwkJCQkJCWtDRkFsbG9jYXRvck51bGwpOworICAgIGhvc3RSZWYgPSBDRkhvc3RDcmVhdGVXaXRoTmFtZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBob3N0bmFtZSk7CisgICAgaWYgKENGSG9zdFN0YXJ0SW5mb1Jlc29sdXRpb24oaG9zdFJlZiwga0NGSG9zdEFkZHJlc3NlcywgbmlsKSkgeworCUNGQXJyYXlSZWYgYWRkclJlZiA9IENGSG9zdEdldEFkZHJlc3NpbmcoaG9zdFJlZiwgbmlsKTsKKwlpID0gMDsKKwlpZiAoYWRkclJlZiAhPSBuaWwpIHsKKwkgICAgQ0ZJbmRleCBpZHgsIG5hZGRyOworCSAgICAKKwkgICAgbmFkZHIgPSBDRkFycmF5R2V0Q291bnQoYWRkclJlZik7CisJICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbmFkZHIgJiYgaSA8ICpjb3VudDsgaWR4KyspIHsKKwkJc3RydWN0IHNvY2thZGRyICphZGRyOworCQkKKwkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikKKwkJICAgICAgIENGRGF0YUdldEJ5dGVQdHIoQ0ZBcnJheUdldFZhbHVlQXRJbmRleChhZGRyUmVmLCBpZHgpKTsKKwkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gKi8KKwkJcGpfYXNzZXJ0KGFkZHIpOworCQkKKwkJLyogSWdub3JlIHVud2FudGVkIGFkZHJlc3MgZmFtaWxpZXMgKi8KKwkJaWYgKGFmIT1QSl9BRl9VTlNQRUMgJiYgYWRkci0+c2FfZmFtaWx5ICE9IGFmKQorCQkgICAgY29udGludWU7CisKKwkJLyogU3RvcmUgY2Fub25pY2FsIG5hbWUgKi8KKwkJcGpfYW5zaV9zdHJjcHkoYWlbaV0uYWlfY2Fub25uYW1lLCBub2RlY29weSk7CisJCQorCQkvKiBTdG9yZSBhZGRyZXNzICovCisJCVBKX0FTU0VSVF9PTl9GQUlMKHNpemVvZigqYWRkcikgPD0gc2l6ZW9mKHBqX3NvY2thZGRyKSwKKwkJCQkgIGNvbnRpbnVlKTsKKwkJcGpfbWVtY3B5KCZhaVtpXS5haV9hZGRyLCBhZGRyLCBzaXplb2YoKmFkZHIpKTsKKwkJUEpfU09DS0FERFJfUkVTRVRfTEVOKCZhaVtpXS5haV9hZGRyKTsKKwkJCisJCWkrKzsKKwkgICAgfQorCX0KKwkKKwkqY291bnQgPSBpOworICAgIH0gZWxzZSB7CisJc3RhdHVzID0gUEpfRVJFU09MVkU7CisgICAgfQorICAgIAorICAgIENGUmVsZWFzZShob3N0UmVmKTsKKyAgICBDRlJlbGVhc2UoaG9zdG5hbWUpOworICAgIAorICAgIHJldHVybiBzdGF0dXM7CisjZWxzZQorICAgIC8qIENhbGwgZ2V0YWRkcmluZm8oKSAqLworICAgIHBqX2J6ZXJvKCZoaW50LCBzaXplb2YoaGludCkpOworICAgIGhpbnQuYWlfZmFtaWx5ID0gYWY7CisKKyAgICByYyA9IGdldGFkZHJpbmZvKG5vZGVjb3B5LCBOVUxMLCAmaGludCwgJnJlcyk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIFBKX0VSRVNPTFZFOworCisgICAgb3JpZ19yZXMgPSByZXM7CisKKyAgICAvKiBFbnVtZXJhdGUgZWFjaCBpdGVtIGluIHRoZSByZXN1bHQgKi8KKyAgICBmb3IgKGk9MDsgaTwqY291bnQgJiYgcmVzOyByZXM9cmVzLT5haV9uZXh0KSB7CisJLyogSWdub3JlIHVud2FudGVkIGFkZHJlc3MgZmFtaWxpZXMgKi8KKwlpZiAoYWYhPVBKX0FGX1VOU1BFQyAmJiByZXMtPmFpX2ZhbWlseSAhPSBhZikKKwkgICAgY29udGludWU7CisKKwkvKiBTdG9yZSBjYW5vbmljYWwgbmFtZSAocG9zc2libHkgdHJ1bmNhdGluZyB0aGUgbmFtZSkgKi8KKwlpZiAocmVzLT5haV9jYW5vbm5hbWUpIHsKKwkgICAgcGpfYW5zaV9zdHJuY3B5KGFpW2ldLmFpX2Nhbm9ubmFtZSwgcmVzLT5haV9jYW5vbm5hbWUsCisJCQkgICAgc2l6ZW9mKGFpW2ldLmFpX2Nhbm9ubmFtZSkpOworCSAgICBhaVtpXS5haV9jYW5vbm5hbWVbc2l6ZW9mKGFpW2ldLmFpX2Nhbm9ubmFtZSktMV0gPSAnXDAnOworCX0gZWxzZSB7CisJICAgIHBqX2Fuc2lfc3RyY3B5KGFpW2ldLmFpX2Nhbm9ubmFtZSwgbm9kZWNvcHkpOworCX0KKworCS8qIFN0b3JlIGFkZHJlc3MgKi8KKwlQSl9BU1NFUlRfT05fRkFJTChyZXMtPmFpX2FkZHJsZW4gPD0gc2l6ZW9mKHBqX3NvY2thZGRyKSwgY29udGludWUpOworCXBqX21lbWNweSgmYWlbaV0uYWlfYWRkciwgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4pOworCVBKX1NPQ0tBRERSX1JFU0VUX0xFTigmYWlbaV0uYWlfYWRkcik7CisKKwkvKiBOZXh0IHNsb3QgKi8KKwkrK2k7CisgICAgfQorCisgICAgKmNvdW50ID0gaTsKKworICAgIGZyZWVhZGRyaW5mbyhvcmlnX3Jlcyk7CisKKyAgICAvKiBEb25lICovCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZW5kaWYKKworI2Vsc2UJLyogUEpfU09DS19IQVNfR0VUQUREUklORk8gKi8KKyAgICBwal9ib29sX3QgaGFzX2FkZHIgPSBQSl9GQUxTRTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oY291bnQgJiYgKmNvdW50LCBQSl9FSU5WQUwpOworCisgICAgLyogQ2hlY2sgaWYgbm9kZW5hbWUgaXMgSVAgYWRkcmVzcyAqLworICAgIHBqX2J6ZXJvKCZhaVswXSwgc2l6ZW9mKGFpWzBdKSk7CisgICAgaWYgKChhZj09UEpfQUZfSU5FVCB8fCBhZj09UEpfQUZfVU5TUEVDKSAmJgorCXBqX2luZXRfcHRvbihQSl9BRl9JTkVULCBub2RlbmFtZSwKKwkJICAgICAmYWlbMF0uYWlfYWRkci5pcHY0LnNpbl9hZGRyKSA9PSBQSl9TVUNDRVNTKQorICAgIHsKKwlhZiA9IFBKX0FGX0lORVQ7CisJaGFzX2FkZHIgPSBQSl9UUlVFOworICAgIH0KKyAgICBlbHNlIGlmICgoYWY9PVBKX0FGX0lORVQ2IHx8IGFmPT1QSl9BRl9VTlNQRUMpICYmCisJICAgICBwal9pbmV0X3B0b24oUEpfQUZfSU5FVDYsIG5vZGVuYW1lLAorCQkJICAmYWlbMF0uYWlfYWRkci5pcHY2LnNpbjZfYWRkcikgPT0gUEpfU1VDQ0VTUykKKyAgICB7CisJYWYgPSBQSl9BRl9JTkVUNjsKKwloYXNfYWRkciA9IFBKX1RSVUU7CisgICAgfQorCisgICAgaWYgKGhhc19hZGRyKSB7CisJcGpfc3RyX3QgdG1wOworCisJdG1wLnB0ciA9IGFpWzBdLmFpX2Nhbm9ubmFtZTsKKwlwal9zdHJuY3B5X3dpdGhfbnVsbCgmdG1wLCBub2RlbmFtZSwgUEpfTUFYX0hPU1ROQU1FKTsKKwlhaVswXS5haV9hZGRyLmFkZHIuc2FfZmFtaWx5ID0gKHBqX3VpbnQxNl90KWFmOworCSpjb3VudCA9IDE7CisKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoYWYgPT0gUEpfQUZfSU5FVCB8fCBhZiA9PSBQSl9BRl9VTlNQRUMpIHsKKwlwal9ob3N0ZW50IGhlOworCXVuc2lnbmVkIGksIG1heF9jb3VudDsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisJCisJLyogVkM2IGNvbXBsYWlucyB0aGF0ICJoZSIgaXMgdW5pbml0aWFsaXplZCAqLworCSNpZmRlZiBfTVNDX1ZFUgorCXBqX2J6ZXJvKCZoZSwgc2l6ZW9mKGhlKSk7CisJI2VuZGlmCisKKwlzdGF0dXMgPSBwal9nZXRob3N0YnluYW1lKG5vZGVuYW1lLCAmaGUpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIHN0YXR1czsKKworCW1heF9jb3VudCA9ICpjb3VudDsKKwkqY291bnQgPSAwOworCisJcGpfYnplcm8oYWksIG1heF9jb3VudCAqIHNpemVvZihwal9hZGRyaW5mbykpOworCisJZm9yIChpPTA7IGhlLmhfYWRkcl9saXN0W2ldICYmICpjb3VudDxtYXhfY291bnQ7ICsraSkgeworCSAgICBwal9hbnNpX3N0cm5jcHkoYWlbKmNvdW50XS5haV9jYW5vbm5hbWUsIGhlLmhfbmFtZSwKKwkJCSAgICBzaXplb2YoYWlbKmNvdW50XS5haV9jYW5vbm5hbWUpKTsKKwkgICAgYWlbKmNvdW50XS5haV9jYW5vbm5hbWVbc2l6ZW9mKGFpWypjb3VudF0uYWlfY2Fub25uYW1lKS0xXSA9ICdcMCc7CisKKwkgICAgYWlbKmNvdW50XS5haV9hZGRyLmlwdjQuc2luX2ZhbWlseSA9IFBKX0FGX0lORVQ7CisJICAgIHBqX21lbWNweSgmYWlbKmNvdW50XS5haV9hZGRyLmlwdjQuc2luX2FkZHIsCisJCSAgICAgIGhlLmhfYWRkcl9saXN0W2ldLCBoZS5oX2xlbmd0aCk7CisJICAgIFBKX1NPQ0tBRERSX1JFU0VUX0xFTigmYWlbKmNvdW50XS5haV9hZGRyKTsKKworCSAgICAoKmNvdW50KSsrOworCX0KKworCXJldHVybiBQSl9TVUNDRVNTOworCisgICAgfSBlbHNlIHsKKwkvKiBJUHY2IGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwkqY291bnQgPSAwOworCisJcmV0dXJuIFBKX0VJUFY2Tk9UU1VQOworICAgIH0KKyNlbmRpZgkvKiBQSl9TT0NLX0hBU19HRVRBRERSSU5GTyAqLworfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2FkZHJfcmVzb2x2X3N5bWJpYW4uY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9hZGRyX3Jlc29sdl9zeW1iaWFuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTI5MDU3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9hZGRyX3Jlc29sdl9zeW1iaWFuLmNwcApAQCAtMCwwICsxLDIwMSBAQAorLyogJElkOiBhZGRyX3Jlc29sdl9zeW1iaWFuLmNwcCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2FkZHJfcmVzb2x2Lmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9pcF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9zb2NrLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovdW5pY29kZS5oPgorCisjaW5jbHVkZSAib3Nfc3ltYmlhbi5oIgorIAorI2RlZmluZSBUSElTX0ZJTEUgCSJhZGRyX3Jlc29sdl9zeW1iaWFuLmNwcCIKKyNkZWZpbmUgVFJBQ0VfTUUJMAorCisKKy8vIFBKTElCIEFQSTogcmVzb2x2ZSBob3N0bmFtZQorUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRob3N0YnluYW1lKGNvbnN0IHBqX3N0cl90ICpuYW1lLCBwal9ob3N0ZW50ICpoZSkKK3sKKyAgICBzdGF0aWMgcGpfYWRkcmluZm8gYWk7CisgICAgc3RhdGljIGNoYXIgKmFsaWFzZXNbMl07CisgICAgc3RhdGljIGNoYXIgKmFkZHJsaXN0WzJdOworICAgIHVuc2lnbmVkIGNvdW50ID0gMTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCisgICAgc3RhdHVzID0gcGpfZ2V0YWRkcmluZm8oUEpfQUZfSU5FVCwgbmFtZSwgJmNvdW50LCAmYWkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAJcmV0dXJuIHN0YXR1czsKKyAgICAKKyAgICBhbGlhc2VzWzBdID0gYWkuYWlfY2Fub25uYW1lOworICAgIGFsaWFzZXNbMV0gPSBOVUxMOworICAgIAorICAgIGFkZHJsaXN0WzBdID0gKGNoYXIqKSAmYWkuYWlfYWRkci5pcHY0LnNpbl9hZGRyOworICAgIGFkZHJsaXN0WzFdID0gTlVMTDsKKyAgICAKKyAgICBwal9iemVybyhoZSwgc2l6ZW9mKCpoZSkpOworICAgIGhlLT5oX25hbWUgPSBhbGlhc2VzWzBdOworICAgIGhlLT5oX2FsaWFzZXMgPSBhbGlhc2VzOworICAgIGhlLT5oX2FkZHJ0eXBlID0gUEpfQUZfSU5FVDsKKyAgICBoZS0+aF9sZW5ndGggPSA0OworICAgIGhlLT5oX2FkZHJfbGlzdCA9IGFkZHJsaXN0OworICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8vIFJlc29sdmUgZm9yIHNwZWNpZmljIGFkZHJlc3MgZmFtaWx5CitzdGF0aWMgcGpfc3RhdHVzX3QgZ2V0YWRkcmluZm9fYnlfYWYoaW50IGFmLCBjb25zdCBwal9zdHJfdCAqbmFtZSwKKwkJCQkgICAgIHVuc2lnbmVkICpjb3VudCwgcGpfYWRkcmluZm8gYWlbXSkgCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCisgICAgUEpfQVNTRVJUX1JFVFVSTihuYW1lICYmIGNvdW50ICYmIGFpLCBQSl9FSU5WQUwpOworCisjaWYgIWRlZmluZWQoUEpfSEFTX0lQVjYpIHx8ICFQSl9IQVNfSVBWNgorICAgIGlmIChhZiA9PSBQSl9BRl9JTkVUNikKKyAgICAJcmV0dXJuIFBKX0VJUFY2Tk9UU1VQOworI2VuZGlmCisJCisgICAgLy8gUmV0dXJuIGZhaWx1cmUgaWYgYWNjZXNzIHBvaW50IGlzIG1hcmtlZCBhcyBkb3duIGJ5IGFwcC4KKyAgICBQSl9TWU1CSUFOX0NIRUNLX0NPTk5FQ1RJT04oKTsKKworICAgIC8vIEdldCByZXNvbHZlciBmb3IgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGZhbWlseQorICAgIFJIb3N0UmVzb2x2ZXIgJnJlc3YgPSBQalN5bWJpYW5PUzo6SW5zdGFuY2UoKS0+R2V0UmVzb2x2ZXIoYWYpOworCisgICAgLy8gQ29udmVydCBuYW1lIHRvIFVuaWNvZGUKKyAgICB3Y2hhcl90IG5hbWUxNltQSl9NQVhfSE9TVE5BTUVdOworICAgIHBqX2Fuc2lfdG9fdW5pY29kZShuYW1lLT5wdHIsIG5hbWUtPnNsZW4sIG5hbWUxNiwgUEpfQVJSQVlfU0laRShuYW1lMTYpKTsKKyAgICBUUHRyQzE2IGRhdGEoKGNvbnN0IFRVaW50MTYqKW5hbWUxNik7CisKKyAgICAvLyBSZXNvbHZlIQorICAgIFROYW1lRW50cnkgbmFtZUVudHJ5OworICAgIFRSZXF1ZXN0U3RhdHVzIHJlcVN0YXR1czsKKyAgICAKKyAgICByZXN2LkdldEJ5TmFtZShkYXRhLCBuYW1lRW50cnksIHJlcVN0YXR1cyk7CisgICAgVXNlcjo6V2FpdEZvclJlcXVlc3QocmVxU3RhdHVzKTsKKyAgICAKKyAgICAvLyBJdGVyYXRlIGVhY2ggcmVzdWx0CisgICAgaSA9IDA7CisgICAgd2hpbGUgKHJlcVN0YXR1cyA9PSBLRXJyTm9uZSAmJiBpIDwgKmNvdW50KSB7CisgICAgCQorCQkvLyBHZXQgdGhlIHJlc29sdmVkIFRJbmV0QWRkcgorCQlUSW5ldEFkZHIgaW5ldEFkZHIobmFtZUVudHJ5KCkuaUFkZHIpOworCQlpbnQgYWRkcmxlbjsKKworI2lmIFRSQUNFX01FCisJCWlmICgxKSB7CisJCQlwal9zb2NrYWRkciBhOworCQkJY2hhciBpcGFkZHJbUEpfSU5FVDZfQUREUlNUUkxFTisyXTsKKwkJCWludCBuYW1lbGVuOworCQkJCisJCQluYW1lbGVuID0gc2l6ZW9mKHBqX3NvY2thZGRyKTsKKwkJCWlmIChQalN5bWJpYW5PUzo6QWRkcjJwaihpbmV0QWRkciwgYSwgJm5hbWVsZW4sIAorCQkJCQkJCQkJIFBKX0ZBTFNFKSA9PSBQSl9TVUNDRVNTKSAKKwkJCXsKKwkJCQlQSl9MT0coNSwoVEhJU19GSUxFLCAicmVzb2x2ZSAlLipzOiAlcyIsIAorCQkJCQkJKGludCluYW1lLT5zbGVuLCBuYW1lLT5wdHIsCisJCQkJCQlwal9zb2NrYWRkcl9wcmludCgmYSwgaXBhZGRyLCBzaXplb2YoaXBhZGRyKSwgMikpKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCQorCQkvLyBJZ25vcmUgaWYgdGhpcyBpcyBub3QgdGhlIHNhbWUgYWRkcmVzcyBmYW1pbHkKKwkJLy8gTm90IGEgZ29vZCBpZGVhLCBhcyBTeW1iaWFuIG1hcHBzIElQdjQgdG8gSVB2Ni4KKwkJLy9mYW0gPSBpbmV0QWRkci5GYW1pbHkoKTsKKwkJLy9pZiAoZmFtICE9IGFmKSB7CisJCS8vICAgIHJlc3YuTmV4dChuYW1lRW50cnksIHJlcVN0YXR1cyk7CisJCS8vICAgIFVzZXI6OldhaXRGb3JSZXF1ZXN0KHJlcVN0YXR1cyk7CisJCS8vICAgIGNvbnRpbnVlOworCQkvL30KKwkJCisJCS8vIENvbnZlcnQgSVAgYWRkcmVzcyBmaXJzdCB0byBnZXQgSVB2NCBtYXBwZWQgYWRkcmVzcworCQlhZGRybGVuID0gc2l6ZW9mKGFpW2ldLmFpX2FkZHIpOworCQlzdGF0dXMgPSBQalN5bWJpYW5PUzo6QWRkcjJwaihpbmV0QWRkciwgYWlbaV0uYWlfYWRkciwgCisJCQkJCQkJCQkgICZhZGRybGVuLCBQSl9UUlVFKTsKKwkJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCQkgICAgcmV0dXJuIHN0YXR1czsKKwkJCisJCS8vIElnbm9yZSBpZiBhZGRyZXNzIGZhbWlseSBkb2Vzbid0IG1hdGNoCisJCWlmIChhaVtpXS5haV9hZGRyLmFkZHIuc2FfZmFtaWx5ICE9IGFmKSB7CisJCSAgICByZXN2Lk5leHQobmFtZUVudHJ5LCByZXFTdGF0dXMpOworCQkgICAgVXNlcjo6V2FpdEZvclJlcXVlc3QocmVxU3RhdHVzKTsKKwkJICAgIGNvbnRpbnVlOworCQl9CisKKwkJLy8gQ29udmVydCB0aGUgb2ZmaWNpYWwgYWRkcmVzcyB0byBBTlNJLgorCQlwal91bmljb2RlX3RvX2Fuc2koKGNvbnN0IHdjaGFyX3QqKW5hbWVFbnRyeSgpLmlOYW1lLlB0cigpLCAKKwkJCQkgICBuYW1lRW50cnkoKS5pTmFtZS5MZW5ndGgoKSwKKwkJCSAgICAgICAJICAgYWlbaV0uYWlfY2Fub25uYW1lLCBzaXplb2YoYWlbaV0uYWlfY2Fub25uYW1lKSk7CisJCisJCS8vIE5leHQKKwkJKytpOworCQlyZXN2Lk5leHQobmFtZUVudHJ5LCByZXFTdGF0dXMpOworCQlVc2VyOjpXYWl0Rm9yUmVxdWVzdChyZXFTdGF0dXMpOworICAgIH0KKworICAgICpjb3VudCA9IGk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIFJlc29sdmUgSVB2NC9JUHY2IGFkZHJlc3MgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0YWRkcmluZm8oaW50IGFmLCBjb25zdCBwal9zdHJfdCAqbm9kZW5hbWUsCisJCQkJICAgdW5zaWduZWQgKmNvdW50LCBwal9hZGRyaW5mbyBhaVtdKSAKK3sKKyAgICB1bnNpZ25lZCBzdGFydDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXMgPSBQSl9FQUZOT1RTVVA7CisgICAgCisgICAgUEpfQVNTRVJUX1JFVFVSTihhZj09UEpfQUZfSU5FVCB8fCBhZj09UEpfQUZfSU5FVDYgfHwgYWY9PVBKX0FGX1VOU1BFQywKKyAgICAJCSAgICAgUEpfRUFGTk9UU1VQKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG5vZGVuYW1lICYmIGNvdW50ICYmICpjb3VudCAmJiBhaSwgUEpfRUlOVkFMKTsKKyAgICAKKyAgICBzdGFydCA9IDA7CisgICAgCisgICAgaWYgKGFmPT1QSl9BRl9JTkVUNiB8fCBhZj09UEpfQUZfVU5TUEVDKSB7CisgICAgICAgIHVuc2lnbmVkIG1heCA9ICpjb3VudDsKKyAgICAJc3RhdHVzID0gZ2V0YWRkcmluZm9fYnlfYWYoUEpfQUZfSU5FVDYsIG5vZGVuYW1lLCAKKyAgICAJCQkJICAgJm1heCwgJmFpW3N0YXJ0XSk7CisgICAgCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworICAgIAkgICAgKCpjb3VudCkgLT0gbWF4OworICAgIAkgICAgc3RhcnQgKz0gbWF4OworICAgIAl9CisgICAgfQorICAgIAorICAgIGlmIChhZj09UEpfQUZfSU5FVCB8fCBhZj09UEpfQUZfVU5TUEVDKSB7CisgICAgICAgIHVuc2lnbmVkIG1heCA9ICpjb3VudDsKKyAgICAJc3RhdHVzID0gZ2V0YWRkcmluZm9fYnlfYWYoUEpfQUZfSU5FVCwgbm9kZW5hbWUsIAorICAgIAkJCQkgICAmbWF4LCAmYWlbc3RhcnRdKTsKKyAgICAJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisgICAgCSAgICAoKmNvdW50KSAtPSBtYXg7CisgICAgCSAgICBzdGFydCArPSBtYXg7CisgICAgCX0KKyAgICB9CisgICAgCisgICAgKmNvdW50ID0gc3RhcnQ7CisgICAgCisgICAgaWYgKCpjb3VudCkgeworICAgIAlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9IGVsc2UgeworICAgIAlyZXR1cm4gc3RhdHVzIT1QSl9TVUNDRVNTID8gc3RhdHVzIDogUEpfRU5PVEZPVU5EOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9hcnJheS5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9hcnJheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMzlkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2FycmF5LmMKQEAgLTAsMCArMSw3MSBAQAorLyogJElkOiBhcnJheS5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovYXJyYXkuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorCitQSl9ERUYodm9pZCkgcGpfYXJyYXlfaW5zZXJ0KCB2b2lkICphcnJheSwKKwkJCSAgICAgIHVuc2lnbmVkIGVsZW1fc2l6ZSwKKwkJCSAgICAgIHVuc2lnbmVkIGNvdW50LAorCQkJICAgICAgdW5zaWduZWQgcG9zLAorCQkJICAgICAgY29uc3Qgdm9pZCAqdmFsdWUpCit7CisgICAgaWYgKGNvdW50ICYmIHBvcyA8IGNvdW50KSB7CisJcGpfbWVtbW92ZSggKGNoYXIqKWFycmF5ICsgKHBvcysxKSplbGVtX3NpemUsCisJCSAgICAoY2hhciopYXJyYXkgKyBwb3MqZWxlbV9zaXplLAorCQkgICAgKGNvdW50LXBvcykqZWxlbV9zaXplKTsKKyAgICB9CisgICAgcGpfbWVtbW92ZSgoY2hhciopYXJyYXkgKyBwb3MqZWxlbV9zaXplLCB2YWx1ZSwgZWxlbV9zaXplKTsKK30KKworUEpfREVGKHZvaWQpIHBqX2FycmF5X2VyYXNlKCB2b2lkICphcnJheSwKKwkJCSAgICAgdW5zaWduZWQgZWxlbV9zaXplLAorCQkJICAgICB1bnNpZ25lZCBjb3VudCwKKwkJCSAgICAgdW5zaWduZWQgcG9zKQoreworICAgIHBqX2Fzc2VydChjb3VudCAhPSAwKTsKKyAgICBpZiAocG9zIDwgY291bnQtMSkgeworCXBqX21lbW1vdmUoIChjaGFyKilhcnJheSArIHBvcyplbGVtX3NpemUsCisJCSAgICAoY2hhciopYXJyYXkgKyAocG9zKzEpKmVsZW1fc2l6ZSwKKwkJICAgIChjb3VudC1wb3MtMSkqZWxlbV9zaXplKTsKKyAgICB9Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfYXJyYXlfZmluZCggY29uc3Qgdm9pZCAqYXJyYXksIAorCQkJCSAgIHVuc2lnbmVkIGVsZW1fc2l6ZSwgCisJCQkJICAgdW5zaWduZWQgY291bnQsIAorCQkJCSAgIHBqX3N0YXR1c190ICgqbWF0Y2hpbmcpKGNvbnN0IHZvaWQgKnZhbHVlKSwKKwkJCQkgICB2b2lkICoqcmVzdWx0KQoreworICAgIHVuc2lnbmVkIGk7CisgICAgY29uc3QgY2hhciAqY2hhcl9hcnJheSA9IChjb25zdCBjaGFyKilhcnJheTsKKyAgICBmb3IgKGk9MDsgaTxjb3VudDsgKytpKSB7CisJaWYgKCAoKm1hdGNoaW5nKShjaGFyX2FycmF5KSA9PSBQSl9TVUNDRVNTKSB7CisJICAgIGlmIChyZXN1bHQpIHsKKwkJKnJlc3VsdCA9ICh2b2lkKiljaGFyX2FycmF5OworCSAgICB9CisJICAgIHJldHVybiBQSl9TVUNDRVNTOworCX0KKwljaGFyX2FycmF5ICs9IGVsZW1fc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIFBKX0VOT1RGT1VORDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jb21wYXQvbG9uZ2ptcF9pMzg2LlMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2NvbXBhdC9sb25nam1wX2kzODYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTNkN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jb21wYXQvbG9uZ2ptcF9pMzg2LlMKQEAgLTAsMCArMSw0MiBAQAorLyogbG9uZ2ptcCBmb3IgaTM4Ni4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBfQVNNCisjZGVmaW5lIF9TRVRKTVBfSAorI2RlZmluZSBQSl9MSU5VWF9LRVJORUwJICAgIDEKKyNpbmNsdWRlIDxwai9jb21wYXQvc2V0am1wLmg+CisKKy5nbG9iYWwgX19sb25nam1wCisudHlwZSAgIF9fbG9uZ2ptcCwlZnVuY3Rpb24KKy5hbGlnbiA0CitfX2xvbmdqbXA6CisJbW92bCA0KCVlc3ApLCAlZWN4CS8qIFVzZXIncyBqbXBfYnVmIGluICVlY3guICAqLworCW1vdmwgOCglZXNwKSwgJWVheAkvKiBTZWNvbmQgYXJndW1lbnQgaXMgcmV0dXJuIHZhbHVlLiAgKi8KKwkvKiBTYXZlIHRoZSByZXR1cm4gYWRkcmVzcyBub3cuICAqLworCW1vdmwgKEpCX1BDKjQpKCVlY3gpLCAlZWR4CisJLyogUmVzdG9yZSByZWdpc3RlcnMuICAqLworCW1vdmwgKEpCX0JYKjQpKCVlY3gpLCAlZWJ4CisJbW92bCAoSkJfU0kqNCkoJWVjeCksICVlc2kKKwltb3ZsIChKQl9ESSo0KSglZWN4KSwgJWVkaQorCW1vdmwgKEpCX0JQKjQpKCVlY3gpLCAlZWJwCisJbW92bCAoSkJfU1AqNCkoJWVjeCksICVlc3AKKwkvKiBKdW1wIHRvIHNhdmVkIFBDLiAgKi8KKwlqbXAgKiVlZHgKKy5zaXplIF9fbG9uZ2ptcCwuLV9fbG9uZ2ptcAorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2NvbXBhdC9zZXRqbXBfaTM4Ni5TIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jb21wYXQvc2V0am1wX2kzODYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2RhYWZmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jb21wYXQvc2V0am1wX2kzODYuUwpAQCAtMCwwICsxLDYxIEBACisvKiBzZXRqbXAgZm9yIGkzODYsIEVMRiB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjZGVmaW5lIF9BU00KKyNkZWZpbmUgX1NFVEpNUF9ICisjZGVmaW5lIFBKX0xJTlVYX0tFUk5FTAkgICAgMQorI2luY2x1ZGUgPHBqL2NvbXBhdC9zZXRqbXAuaD4KKworCisuZ2xvYmFsIF9fc2lnc2V0am1wCisudHlwZSAgIF9fc2lnc2V0am1wLCVmdW5jdGlvbgorLmFsaWduIDQKKworX19zaWdzZXRqbXA6CisgICAgICAgIG1vdmwgNCAgICglZXNwKSwgJWVheAorICAgICAJLyogU2F2ZSByZWdpc3RlcnMuICAqLworICAgICAgICBtb3ZsICVlYngsICgwICo0KSglZWF4KQorICAgICAgICBtb3ZsICVlc2ksICgxICo0KSglZWF4KQorICAgICAgICBtb3ZsICVlZGksICgyICo0KSglZWF4KQorCS8qIFNhdmUgU1AgYXMgaXQgd2lsbCBiZSBhZnRlciB3ZSByZXR1cm4uICAqLworICAgICAgICBsZWFsIDQoJWVzcCksICVlY3ggICAgICAgCisgICAgICAgIG1vdmwgJWVjeCwgKDQgKjQpKCVlYXgpCisJLyogU2F2ZSBQQyB3ZSBhcmUgcmV0dXJuaW5nIHRvIG5vdy4gICovCisgICAgICAgIG1vdmwgMCglZXNwKSwgJWVjeCAgICAgICAKKyAgICAgICAgbW92bCAlZWN4LCAoNSAqNCkoJWVheCkKKwkvKiBTYXZlIGNhbGxlcidzIGZyYW1lIHBvaW50ZXIuICAqLworICAgICAgICBtb3ZsICVlYnAsICgzICo0KSglZWF4KSAgCisKKwkvKiBNYWtlIGEgdGFpbCBjYWxsIHRvIF9fc2lnam1wX3NhdmU7IGl0IHRha2VzIHRoZSBzYW1lIGFyZ3MuICAqLworI2lmZGVmCV9fUElDX18KKwkvKiBXZSBjYW5ub3QgdXNlIHRoZSBQTFQsIGJlY2F1c2UgaXQgcmVxdWlyZXMgdGhhdCAlZWJ4IGJlIHNldCwgYnV0CisgICAgICAgICAgIHdlIGNhbid0IHNhdmUgYW5kIHJlc3RvcmUgb3VyIGNhbGxlcidzIHZhbHVlLiAgSW5zdGVhZCwgd2UgZG8gYW4KKyAgICAgICAgICAgaW5kaXJlY3QganVtcCB0aHJvdWdoIHRoZSBHT1QsIHVzaW5nIGZvciB0aGUgdGVtcG9yYXJ5IHJlZ2lzdGVyCisgICAgICAgICAgICVlY3gsIHdoaWNoIGlzIGNhbGwtY2xvYmJlcmVkLiAgKi8KKwljYWxsIC5MaGVyZQorLkxoZXJlOgorCXBvcGwgJWVjeAorCWFkZGwgJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0gLkxoZXJlICBdLCAlZWN4CisJbW92bCAgICBfX3NpZ2ptcF9zYXZlICAgIEBHT1QgICglZWN4KSwgJWVjeAorCWptcCAqJWVjeAorI2Vsc2UKKwlqbXAgICBfX3NpZ2ptcF9zYXZlCisjZW5kaWYKKy5zaXplIF9fc2lnc2V0am1wLC4tX19zaWdzZXRqbXAKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jb21wYXQvc2lnam1wLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2NvbXBhdC9zaWdqbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTI3NjNiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jb21wYXQvc2lnam1wLmMKQEAgLTAsMCArMSw0MCBAQAorLyogJElkOiBzaWdqbXAuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2NvbmZpZy5oPgorI2luY2x1ZGUgPHBqL2NvbXBhdC9zZXRqbXAuaD4KKworaW50IF9fc2lnam1wX3NhdmUoc2lnam1wX2J1ZiBlbnYsIGludCBzYXZlbWFzaykKK3sKKyAgICByZXR1cm4gMDsKK30KKworZXh0ZXJuIGludCBfX3NpZ3NldGptcChwal9qbXBfYnVmIGVudiwgaW50IHNhdmVtYXNrKTsKK2V4dGVybiB2b2lkIF9fbG9uZ2ptcChwal9qbXBfYnVmIGVudiwgaW50IHZhbCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworUEpfREVGKGludCkgcGpfc2V0am1wKHBqX2ptcF9idWYgZW52KQoreworICAgIHJldHVybiBfX3NpZ3NldGptcChlbnYsIDApOworfQorCitQSl9ERUYodm9pZCkgcGpfbG9uZ2ptcChwal9qbXBfYnVmIGVudiwgaW50IHZhbCkKK3sKKyAgICBfX2xvbmdqbXAoZW52LCB2YWwpOworfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2NvbXBhdC9zdHJpbmcuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovY29tcGF0L3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMmY3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2NvbXBhdC9zdHJpbmcuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAkSWQ6IHN0cmluZy5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovdHlwZXMuaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovY3R5cGUuaD4KKworUEpfREVGKGludCkgc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisgICAgd2hpbGUgKCgqczE9PSpzMikgfHwgKHBqX3RvbG93ZXIoKnMxKT09cGpfdG9sb3dlcigqczIpKSkgeworCWlmICghKnMxKyspCisJICAgIHJldHVybiAwOworCSsrczI7CisgICAgfQorICAgIHJldHVybiAocGpfdG9sb3dlcigqczEpIDwgcGpfdG9sb3dlcigqczIpKSA/IC0xIDogMTsKK30KKworUEpfREVGKGludCkgc3RybmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBpbnQgbGVuKQoreworICAgIGlmICghbGVuKSByZXR1cm4gMDsKKworICAgIHdoaWxlICgoKnMxPT0qczIpIHx8IChwal90b2xvd2VyKCpzMSk9PXBqX3RvbG93ZXIoKnMyKSkpIHsKKwlpZiAoISpzMSsrIHx8IC0tbGVuIDw9IDApCisJICAgIHJldHVybiAwOworCSsrczI7CisgICAgfQorICAgIHJldHVybiAocGpfdG9sb3dlcigqczEpIDwgcGpfdG9sb3dlcigqczIpKSA/IC0xIDogMTsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jb21wYXQvc3RyaW5nX2NvbXBhdC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jb21wYXQvc3RyaW5nX2NvbXBhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzcwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2NvbXBhdC9zdHJpbmdfY29tcGF0LmMKQEAgLTAsMCArMSw4MyBAQAorLyogJElkOiBzdHJpbmdfY29tcGF0LmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai90eXBlcy5oPgorI2luY2x1ZGUgPHBqL2NvbXBhdC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9jdHlwZS5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorCisKKyNpZiBkZWZpbmVkKFBKX0hBU19TVFJJTkdfSCkgJiYgUEpfSEFTX1NUUklOR19IICE9IDAKKy8qIE5vdGhpbmcgdG8gZG8gKi8KKyNlbHNlCitQSl9ERUYoaW50KSBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sKKyAgICB3aGlsZSAoKCpzMT09KnMyKSB8fCAocGpfdG9sb3dlcigqczEpPT1wal90b2xvd2VyKCpzMikpKSB7CisJaWYgKCEqczErKykKKwkgICAgcmV0dXJuIDA7CisJKytzMjsKKyAgICB9CisgICAgcmV0dXJuIChwal90b2xvd2VyKCpzMSkgPCBwal90b2xvd2VyKCpzMikpID8gLTEgOiAxOworfQorCitQSl9ERUYoaW50KSBzdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGludCBsZW4pCit7CisgICAgaWYgKCFsZW4pIHJldHVybiAwOworCisgICAgd2hpbGUgKCgqczE9PSpzMikgfHwgKHBqX3RvbG93ZXIoKnMxKT09cGpfdG9sb3dlcigqczIpKSkgeworCWlmICghKnMxKysgfHwgLS1sZW4gPD0gMCkKKwkgICAgcmV0dXJuIDA7CisJKytzMjsKKyAgICB9CisgICAgcmV0dXJuIChwal90b2xvd2VyKCpzMSkgPCBwal90b2xvd2VyKCpzMikpID8gLTEgOiAxOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBKX0hBU19OT19TTlBSSU5URikgJiYgUEpfSEFTX05PX1NOUFJJTlRGICE9IDAKKworUEpfREVGKGludCkgc25wcmludGYoY2hhciAqczEsIHBqX3NpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnMyLCAuLi4pCit7CisgICAgaW50IHJldDsKKyAgICB2YV9saXN0IGFyZzsKKworICAgIFBKX1VOVVNFRF9BUkcobGVuKTsKKworICAgIHZhX3N0YXJ0KGFyZywgczIpOworICAgIHJldCA9IHZzcHJpbnRmKHMxLCBzMiwgYXJnKTsKKyAgICB2YV9lbmQoYXJnKTsKKyAgICAKKyAgICByZXR1cm4gcmV0OworfQorCitQSl9ERUYoaW50KSB2c25wcmludGYoY2hhciAqczEsIHBqX3NpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnMyLCB2YV9saXN0IGFyZykKK3sKKyNkZWZpbmUgTUFSS19DSEFSICAgKChjaGFyKTI1NSkKKyAgICBpbnQgcmM7CisKKyAgICBzMVtsZW4tMV0gPSBNQVJLX0NIQVI7CisKKyAgICByYyA9IHZzcHJpbnRmKHMxLHMyLGFyZyk7CisKKyAgICBwal9hc3NlcnQoczFbbGVuLTFdID09IE1BUktfQ0hBUiB8fCBzMVtsZW4tMV0gPT0gJ1wwJyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2NvbmZpZy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDlhZjUzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jb25maWcuYwpAQCAtMCwwICsxLDg5IEBACisvKiAkSWQ6IGNvbmZpZy5jIDQxMTIgMjAxMi0wNC0yNyAwOTo0NzoyMFogYmVubnlscCAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2NvbmZpZy5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL2lvcXVldWUuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKmlkID0gImNvbmZpZy5jIjsKKworI2RlZmluZSBQSl9NQUtFX1ZFUlNJT04zXzEoYSxiLGQpIAkjYSAiLiIgI2IgZAorI2RlZmluZSBQSl9NQUtFX1ZFUlNJT04zXzIoYSxiLGQpCVBKX01BS0VfVkVSU0lPTjNfMShhLGIsZCkKKworI2RlZmluZSBQSl9NQUtFX1ZFUlNJT040XzEoYSxiLGMsZCkgCSNhICIuIiAjYiAiLiIgI2MgZAorI2RlZmluZSBQSl9NQUtFX1ZFUlNJT040XzIoYSxiLGMsZCkJUEpfTUFLRV9WRVJTSU9ONF8xKGEsYixjLGQpCisKKyNpZiBQSl9WRVJTSU9OX05VTV9SRVYKK1BKX0RFRl9EQVRBKGNvbnN0IGNoYXIqKSBQSl9WRVJTSU9OID0gUEpfTUFLRV9WRVJTSU9ONF8yKFBKX1ZFUlNJT05fTlVNX01BSk9SLAorCQkJCQkJICAgICAgICAgUEpfVkVSU0lPTl9OVU1fTUlOT1IsCisJCQkJCQkgICAgICAgICBQSl9WRVJTSU9OX05VTV9SRVYsCisJCQkJCQkgICAgICAgICBQSl9WRVJTSU9OX05VTV9FWFRSQSk7CisjZWxzZQorUEpfREVGX0RBVEEoY29uc3QgY2hhciopIFBKX1ZFUlNJT04gPSBQSl9NQUtFX1ZFUlNJT04zXzIoUEpfVkVSU0lPTl9OVU1fTUFKT1IsCisJCQkJCQkgICAgICAgICBQSl9WRVJTSU9OX05VTV9NSU5PUiwKKwkJCQkJCSAgICAgICAgIFBKX1ZFUlNJT05fTlVNX0VYVFJBKTsKKyNlbmRpZgorCisvKgorICogR2V0IFBKTElCIHZlcnNpb24gc3RyaW5nLgorICovCitQSl9ERUYoY29uc3QgY2hhciopIHBqX2dldF92ZXJzaW9uKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX1ZFUlNJT047Cit9CisKK1BKX0RFRih2b2lkKSBwal9kdW1wX2NvbmZpZyh2b2lkKQoreworICAgIFBKX0xPRygzLCAoaWQsICJQSkxJQiAoYykyMDA4LTIwMDkgVGVsdXUgSW5jLiIpKTsKKyAgICBQSl9MT0coMywgKGlkLCAiRHVtcGluZyBjb25maWd1cmF0aW9uczoiKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9WRVJTSU9OICAgICAgICAgICAgICAgIDogJXMiLCBQSl9WRVJTSU9OKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9NX05BTUUgICAgICAgICAgICAgICAgIDogJXMiLCBQSl9NX05BTUUpKTsKKyAgICBQSl9MT0coMywgKGlkLCAiIFBKX0hBU19QRU5USVVNICAgICAgICAgICAgOiAlZCIsIFBKX0hBU19QRU5USVVNKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9PU19OQU1FICAgICAgICAgICAgICAgIDogJXMiLCBQSl9PU19OQU1FKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9DQ19OQU1FL1ZFUl8oMSwyLDMpICAgIDogJXMtJWQuJWQuJWQiLCBQSl9DQ19OQU1FLAorCSAgICAgICBQSl9DQ19WRVJfMSwgUEpfQ0NfVkVSXzIsIFBKX0NDX1ZFUl8zKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9JU18oQklHL0xJVFRMRSlfRU5ESUFOIDogJXMiLCAKKwkgICAgICAgKFBKX0lTX0JJR19FTkRJQU4/ImJpZy1lbmRpYW4iOiJsaXR0bGUtZW5kaWFuIikpKTsKKyAgICBQSl9MT0coMywgKGlkLCAiIFBKX0hBU19JTlQ2NCAgICAgICAgICAgICAgOiAlZCIsIFBKX0hBU19JTlQ2NCkpOworICAgIFBKX0xPRygzLCAoaWQsICIgUEpfSEFTX0ZMT0FUSU5HX1BPSU5UICAgICA6ICVkIiwgUEpfSEFTX0ZMT0FUSU5HX1BPSU5UKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9ERUJVRyAgICAgICAgICAgICAgICAgIDogJWQiLCBQSl9ERUJVRykpOworICAgIFBKX0xPRygzLCAoaWQsICIgUEpfRlVOQ1RJT05TX0FSRV9JTkxJTkVEICA6ICVkIiwgUEpfRlVOQ1RJT05TX0FSRV9JTkxJTkVEKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9MT0dfTUFYX0xFVkVMICAgICAgICAgIDogJWQiLCBQSl9MT0dfTUFYX0xFVkVMKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9MT0dfTUFYX1NJWkUgICAgICAgICAgIDogJWQiLCBQSl9MT0dfTUFYX1NJWkUpKTsKKyAgICBQSl9MT0coMywgKGlkLCAiIFBKX0xPR19VU0VfU1RBQ0tfQlVGRkVSICAgOiAlZCIsIFBKX0xPR19VU0VfU1RBQ0tfQlVGRkVSKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9QT09MX0RFQlVHICAgICAgICAgICAgIDogJWQiLCBQSl9QT09MX0RFQlVHKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9IQVNfUE9PTF9BTFRfQVBJICAgICAgIDogJWQiLCBQSl9IQVNfUE9PTF9BTFRfQVBJKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9IQVNfVENQICAgICAgICAgICAgICAgIDogJWQiLCBQSl9IQVNfVENQKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9NQVhfSE9TVE5BTUUgICAgICAgICAgIDogJWQiLCBQSl9NQVhfSE9TVE5BTUUpKTsKKyAgICBQSl9MT0coMywgKGlkLCAiIGlvcXVldWUgdHlwZSAgICAgICAgICAgICAgOiAlcyIsIHBqX2lvcXVldWVfbmFtZSgpKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9JT1FVRVVFX01BWF9IQU5ETEVTICAgIDogJWQiLCBQSl9JT1FVRVVFX01BWF9IQU5ETEVTKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHIDogJWQiLCBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHKSk7CisgICAgUEpfTE9HKDMsIChpZCwgIiBQSl9IQVNfVEhSRUFEUyAgICAgICAgICAgIDogJWQiLCBQSl9IQVNfVEhSRUFEUykpOworICAgIFBKX0xPRygzLCAoaWQsICIgUEpfTE9HX1VTRV9TVEFDS19CVUZGRVIgICA6ICVkIiwgUEpfTE9HX1VTRV9TVEFDS19CVUZGRVIpKTsKKyAgICBQSl9MT0coMywgKGlkLCAiIFBKX0hBU19TRU1BUEhPUkUgICAgICAgICAgOiAlZCIsIFBKX0hBU19TRU1BUEhPUkUpKTsKKyAgICBQSl9MT0coMywgKGlkLCAiIFBKX0hBU19FVkVOVF9PQkogICAgICAgICAgOiAlZCIsIFBKX0hBU19FVkVOVF9PQkopKTsKKyAgICBQSl9MT0coMywgKGlkLCAiIFBKX0VOQUJMRV9FWFRSQV9DSEVDSyAgICAgOiAlZCIsIFBKX0VOQUJMRV9FWFRSQV9DSEVDSykpOworICAgIFBKX0xPRygzLCAoaWQsICIgUEpfSEFTX0VYQ0VQVElPTl9OQU1FUyAgICA6ICVkIiwgUEpfSEFTX0VYQ0VQVElPTl9OQU1FUykpOworICAgIFBKX0xPRygzLCAoaWQsICIgUEpfTUFYX0VYQ0VQVElPTl9JRCAgICAgICA6ICVkIiwgUEpfTUFYX0VYQ0VQVElPTl9JRCkpOworICAgIFBKX0xPRygzLCAoaWQsICIgUEpfRVhDRVBUSU9OX1VTRV9XSU4zMl9TRUg6ICVkIiwgUEpfRVhDRVBUSU9OX1VTRV9XSU4zMl9TRUgpKTsKKyAgICBQSl9MT0coMywgKGlkLCAiIFBKX1RJTUVTVEFNUF9VU0VfUkRUU0M6ICAgOiAlZCIsIFBKX1RJTUVTVEFNUF9VU0VfUkRUU0MpKTsKKyAgICBQSl9MT0coMywgKGlkLCAiIFBKX09TX0hBU19DSEVDS19TVEFDSyAgICAgOiAlZCIsIFBKX09TX0hBU19DSEVDS19TVEFDSykpOworICAgIFBKX0xPRygzLCAoaWQsICIgUEpfSEFTX0hJR0hfUkVTX1RJTUVSICAgICA6ICVkIiwgUEpfSEFTX0hJR0hfUkVTX1RJTUVSKSk7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovY3R5cGUuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovY3R5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjA0MzQyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9jdHlwZS5jCkBAIC0wLDAgKzEsMjggQEAKKy8qICRJZDogY3R5cGUuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2N0eXBlLmg+CisKKy8qCitjaGFyIHBqX2hleF9kaWdpdHNbXSA9IHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKKwkJCSc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnIH07CisqLworCitpbnQgcGpsaWJfY3R5cGVfY19kdW1teV9zeW1ib2w7CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZXJybm8uYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZXJybm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTIwYTk1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9lcnJuby5jCkBAIC0wLDAgKzEsMzIyIEBACisvKiAkSWQ6IGVycm5vLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3N0ZGFyZy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorCisvKiBQcm90b3R5cGUgZm9yIHBsYXRmb3JtIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UsIHdoaWNoIHdpbGwgYmUgZGVmaW5lZCAKKyAqIGluIHNlcGFyYXRlIGZpbGUuCisgKi8KK1BKX0JFR0lOX0RFQ0wKKworICAgIFBKX0RFQ0woaW50KSBwbGF0Zm9ybV9zdHJlcnJvcihwal9vc19lcnJfdHlwZSBjb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICBjaGFyICpidWYsIHBqX3NpemVfdCBidWZzaXplICk7CitQSl9FTkRfREVDTAorCisjaWZuZGVmIFBKTElCX01BWF9FUlJfTVNHX0hBTkRMRVIKKyMJZGVmaW5lIFBKTElCX01BWF9FUlJfTVNHX0hBTkRMRVIgICAxMAorI2VuZGlmCisKKy8qIEVycm9yIG1lc3NhZ2UgaGFuZGxlci4gKi8KK3N0YXRpYyB1bnNpZ25lZCBlcnJfbXNnX2huZF9jbnQ7CitzdGF0aWMgc3RydWN0IGVycl9tc2dfaG5kCit7CisgICAgcGpfc3RhdHVzX3QJICAgIGJlZ2luOworICAgIHBqX3N0YXR1c190CSAgICBlbmQ7CisgICAgcGpfc3RyX3QJICAoKnN0cmVycm9yKShwal9zdGF0dXNfdCwgY2hhciosIHBqX3NpemVfdCk7CisKK30gZXJyX21zZ19obmRbUEpMSUJfTUFYX0VSUl9NU0dfSEFORExFUl07CisKKy8qIFBKTElCJ3Mgb3duIGVycm9yIGNvZGVzL21lc3NhZ2VzICovCisjaWYgZGVmaW5lZChQSl9IQVNfRVJST1JfU1RSSU5HKSAmJiBQSl9IQVNfRVJST1JfU1RSSU5HIT0wCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgCit7CisgICAgaW50IGNvZGU7CisgICAgY29uc3QgY2hhciAqbXNnOworfSBlcnJfc3RyW10gPSAKK3sKKyAgICBQSl9CVUlMRF9FUlIoUEpfRVVOS05PV04sICAgICAgIlVua25vd24gRXJyb3IiICksCisgICAgUEpfQlVJTERfRVJSKFBKX0VQRU5ESU5HLCAgICAgICJQZW5kaW5nIG9wZXJhdGlvbiIgKSwKKyAgICBQSl9CVUlMRF9FUlIoUEpfRVRPT01BTllDT05OLCAgIlRvbyBtYW55IGNvbm5lY3Rpbmcgc29ja2V0cyIgKSwKKyAgICBQSl9CVUlMRF9FUlIoUEpfRUlOVkFMLCAgICAgICAgIkludmFsaWQgdmFsdWUgb3IgYXJndW1lbnQiICksCisgICAgUEpfQlVJTERfRVJSKFBKX0VOQU1FVE9PTE9ORywgICJOYW1lIHRvbyBsb25nIiApLAorICAgIFBKX0JVSUxEX0VSUihQSl9FTk9URk9VTkQsICAgICAiTm90IGZvdW5kIiApLAorICAgIFBKX0JVSUxEX0VSUihQSl9FTk9NRU0sICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkiICksCisgICAgUEpfQlVJTERfRVJSKFBKX0VCVUcsICAgICAgICAgICJCVUcgREVURUNURUQhIiApLAorICAgIFBKX0JVSUxEX0VSUihQSl9FVElNRURPVVQsICAgICAiT3BlcmF0aW9uIHRpbWVkIG91dCIgKSwKKyAgICBQSl9CVUlMRF9FUlIoUEpfRVRPT01BTlksICAgICAgIlRvbyBtYW55IG9iamVjdHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIiksCisgICAgUEpfQlVJTERfRVJSKFBKX0VCVVNZLCAgICAgICAgICJPYmplY3QgaXMgYnVzeSIpLAorICAgIFBKX0JVSUxEX0VSUihQSl9FTk9UU1VQLAkgICAiT3B0aW9uL29wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIiksCisgICAgUEpfQlVJTERfRVJSKFBKX0VJTlZBTElET1AsCSAgICJJbnZhbGlkIG9wZXJhdGlvbiIpLAorICAgIFBKX0JVSUxEX0VSUihQSl9FQ0FOQ0VMTEVELCAgICAiT3BlcmF0aW9uIGNhbmNlbGxlZCIpLAorICAgIFBKX0JVSUxEX0VSUihQSl9FRVhJU1RTLCAgICAgICAiT2JqZWN0IGFscmVhZHkgZXhpc3RzIiApLAorICAgIFBKX0JVSUxEX0VSUihQSl9FRU9GLAkgICAiRW5kIG9mIGZpbGUiICksCisgICAgUEpfQlVJTERfRVJSKFBKX0VUT09CSUcsCSAgICJTaXplIGlzIHRvbyBiaWciKSwKKyAgICBQSl9CVUlMRF9FUlIoUEpfRVJFU09MVkUsCSAgICJnZXRob3N0YnluYW1lKCkgaGFzIHJldHVybmVkIGVycm9yIiksCisgICAgUEpfQlVJTERfRVJSKFBKX0VUT09TTUFMTCwJICAgIlNpemUgaXMgdG9vIHNob3J0IiksCisgICAgUEpfQlVJTERfRVJSKFBKX0VJR05PUkVELAkgICAiSWdub3JlZCIpLAorICAgIFBKX0JVSUxEX0VSUihQSl9FSVBWNk5PVFNVUCwgICAiSVB2NiBpcyBub3Qgc3VwcG9ydGVkIiksCisgICAgUEpfQlVJTERfRVJSKFBKX0VBRk5PVFNVUCwJICAgIlVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5IiksCisgICAgUEpfQlVJTERfRVJSKFBKX0VHT05FLAkgICAiT2JqZWN0IG5vIGxvbmdlciBleGlzdHMiKSwKKyAgICBQSl9CVUlMRF9FUlIoUEpfRVNPQ0tFVFNUT1AsICAgIlNvY2tldCBpcyBpbiBiYWQgc3RhdGUiKQorfTsKKyNlbmRpZgkvKiBQSl9IQVNfRVJST1JfU1RSSU5HICovCisKKworLyoKKyAqIHBqbGliX2Vycm9yKCkKKyAqCisgKiBSZXRyaWV2ZSBtZXNzYWdlIHN0cmluZyBmb3IgUEpMSUIncyBvd24gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBwamxpYl9lcnJvcihwal9zdGF0dXNfdCBjb2RlLCBjaGFyICpidWYsIHBqX3NpemVfdCBzaXplKQoreworI2lmIGRlZmluZWQoUEpfSEFTX0VSUk9SX1NUUklORykgJiYgUEpfSEFTX0VSUk9SX1NUUklORyE9MAorICAgIHVuc2lnbmVkIGk7CisKKyAgICBmb3IgKGk9MDsgaTxzaXplb2YoZXJyX3N0cikvc2l6ZW9mKGVycl9zdHJbMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKGVycl9zdHJbaV0uY29kZSA9PSBjb2RlKSB7CisgICAgICAgICAgICBwal9zaXplX3QgbGVuID0gc3RybGVuKGVycl9zdHJbaV0ubXNnKTsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gc2l6ZSkgbGVuID0gc2l6ZS0xOworICAgICAgICAgICAgcGpfbWVtY3B5KGJ1ZiwgZXJyX3N0cltpXS5tc2csIGxlbik7CisgICAgICAgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICByZXR1cm4gKGludClsZW47CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBwal9hbnNpX3NucHJpbnRmKCBidWYsIHNpemUsICJVbmtub3duIHBqbGliIGVycm9yICVkIiwgY29kZSk7Cit9CisKKyNkZWZpbmUgSU5fUkFOR0UodmFsLHN0YXJ0LGVuZCkJICAgICgodmFsKT49KHN0YXJ0KSAmJiAodmFsKTwoZW5kKSkKKworLyogUmVnaXN0ZXIgc3RyZXJyb3IgaGFuZGxlLiAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9yZWdpc3Rlcl9zdHJlcnJvciggcGpfc3RhdHVzX3Qgc3RhcnQsCisJCQkJCSAgcGpfc3RhdHVzX3Qgc3BhY2UsCisJCQkJCSAgcGpfZXJyb3JfY2FsbGJhY2sgZikKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgLyogQ2hlY2sgYXJndW1lbnRzLiAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhcnQgJiYgc3BhY2UgJiYgZiwgUEpfRUlOVkFMKTsKKworICAgIC8qIENoZWNrIGlmIHRoZXJlIGFyZW4ndCB0b28gbWFueSBoYW5kbGVycyByZWdpc3RlcmVkLiAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oZXJyX21zZ19obmRfY250IDwgUEpfQVJSQVlfU0laRShlcnJfbXNnX2huZCksCisJCSAgICAgUEpfRVRPT01BTlkpOworCisgICAgLyogU3RhcnQgZXJyb3IgbXVzdCBiZSBncmVhdGVyIHRoYW4gUEpfRVJSTk9fU1RBUlRfVVNFUiAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3RhcnQgPj0gUEpfRVJSTk9fU1RBUlRfVVNFUiwgUEpfRUVYSVNUUyk7CisKKyAgICAvKiBDaGVjayB0aGF0IG5vIGV4aXN0aW5nIGhhbmRsZXIgaGFzIGNvdmVyZWQgdGhlIHNwZWNpZmllZCByYW5nZS4gKi8KKyAgICBmb3IgKGk9MDsgaTxlcnJfbXNnX2huZF9jbnQ7ICsraSkgeworCWlmIChJTl9SQU5HRShzdGFydCwgZXJyX21zZ19obmRbaV0uYmVnaW4sIGVycl9tc2dfaG5kW2ldLmVuZCkgfHwKKwkgICAgSU5fUkFOR0Uoc3RhcnQrc3BhY2UtMSwgZXJyX21zZ19obmRbaV0uYmVnaW4sIGVycl9tc2dfaG5kW2ldLmVuZCkpCisJeworCSAgICBpZiAoZXJyX21zZ19obmRbaV0uYmVnaW4gPT0gc3RhcnQgJiYgCisJCWVycl9tc2dfaG5kW2ldLmVuZCA9PSAoc3RhcnQrc3BhY2UpICYmCisJCWVycl9tc2dfaG5kW2ldLnN0cmVycm9yID09IGYpCisJICAgIHsKKwkJLyogVGhlIHNhbWUgcmFuZ2UgYW5kIGhhbmRsZXIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICovCisJCXJldHVybiBQSl9TVUNDRVNTOworCSAgICB9CisKKwkgICAgcmV0dXJuIFBKX0VFWElTVFM7CisJfQorICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIHRoZSBoYW5kbGVyLiAqLworICAgIGVycl9tc2dfaG5kW2Vycl9tc2dfaG5kX2NudF0uYmVnaW4gPSBzdGFydDsKKyAgICBlcnJfbXNnX2huZFtlcnJfbXNnX2huZF9jbnRdLmVuZCA9IHN0YXJ0ICsgc3BhY2U7CisgICAgZXJyX21zZ19obmRbZXJyX21zZ19obmRfY250XS5zdHJlcnJvciA9IGY7CisKKyAgICArK2Vycl9tc2dfaG5kX2NudDsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBJbnRlcm5hbCBQSkxJQiBmdW5jdGlvbiBjYWxsZWQgYnkgcGpfc2h1dGRvd24oKSB0byBjbGVhciBlcnJvciBoYW5kbGVycyAqLwordm9pZCBwal9lcnJub19jbGVhcl9oYW5kbGVycyh2b2lkKQoreworICAgIGVycl9tc2dfaG5kX2NudCA9IDA7CisgICAgcGpfYnplcm8oZXJyX21zZ19obmQsIHNpemVvZihlcnJfbXNnX2huZCkpOworfQorCisKKy8qCisgKiBwal9zdHJlcnJvcigpCisgKi8KK1BKX0RFRihwal9zdHJfdCkgcGpfc3RyZXJyb3IoIHBqX3N0YXR1c190IHN0YXRjb2RlLCAKKwkJCSAgICAgIGNoYXIgKmJ1ZiwgcGpfc2l6ZV90IGJ1ZnNpemUgKQoreworICAgIGludCBsZW4gPSAtMTsKKyAgICBwal9zdHJfdCBlcnJzdHI7CisKKyAgICBwal9hc3NlcnQoYnVmICYmIGJ1ZnNpemUpOworCisgICAgaWYgKHN0YXRjb2RlID09IFBKX1NVQ0NFU1MpIHsKKwlsZW4gPSBwal9hbnNpX3NucHJpbnRmKCBidWYsIGJ1ZnNpemUsICJTdWNjZXNzIik7CisKKyAgICB9IGVsc2UgaWYgKHN0YXRjb2RlIDwgUEpfRVJSTk9fU1RBUlQgKyBQSl9FUlJOT19TUEFDRV9TSVpFKSB7CisgICAgICAgIGxlbiA9IHBqX2Fuc2lfc25wcmludGYoIGJ1ZiwgYnVmc2l6ZSwgIlVua25vd24gZXJyb3IgJWQiLCBzdGF0Y29kZSk7CisKKyAgICB9IGVsc2UgaWYgKHN0YXRjb2RlIDwgUEpfRVJSTk9fU1RBUlRfU1RBVFVTICsgUEpfRVJSTk9fU1BBQ0VfU0laRSkgeworICAgICAgICBsZW4gPSBwamxpYl9lcnJvcihzdGF0Y29kZSwgYnVmLCBidWZzaXplKTsKKworICAgIH0gZWxzZSBpZiAoc3RhdGNvZGUgPCBQSl9FUlJOT19TVEFSVF9TWVMgKyBQSl9FUlJOT19TUEFDRV9TSVpFKSB7CisgICAgICAgIGxlbiA9IHBsYXRmb3JtX3N0cmVycm9yKFBKX1NUQVRVU19UT19PUyhzdGF0Y29kZSksIGJ1ZiwgYnVmc2l6ZSk7CisKKyAgICB9IGVsc2UgeworCXVuc2lnbmVkIGk7CisKKwkvKiBGaW5kIHVzZXIgaGFuZGxlciB0byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UuICovCisJZm9yIChpPTA7IGk8ZXJyX21zZ19obmRfY250OyArK2kpIHsKKwkgICAgaWYgKElOX1JBTkdFKHN0YXRjb2RlLCBlcnJfbXNnX2huZFtpXS5iZWdpbiwgZXJyX21zZ19obmRbaV0uZW5kKSkgeworCQlyZXR1cm4gKCplcnJfbXNnX2huZFtpXS5zdHJlcnJvcikoc3RhdGNvZGUsIGJ1ZiwgYnVmc2l6ZSk7CisJICAgIH0KKwl9CisKKwkvKiBIYW5kbGVyIG5vdCBmb3VuZCEgKi8KKwlsZW4gPSBwal9hbnNpX3NucHJpbnRmKCBidWYsIGJ1ZnNpemUsICJVbmtub3duIGVycm9yICVkIiwgc3RhdGNvZGUpOworICAgIH0KKworICAgIGlmIChsZW4gPCAxKSB7CisgICAgICAgICpidWYgPSAnXDAnOworICAgICAgICBsZW4gPSAwOworICAgIH0KKworICAgIGVycnN0ci5wdHIgPSBidWY7CisgICAgZXJyc3RyLnNsZW4gPSBsZW47CisKKyAgICByZXR1cm4gZXJyc3RyOworfQorCisjaWYgUEpfTE9HX01BWF9MRVZFTCA+PSAxCitzdGF0aWMgdm9pZCBpbnZva2VfbG9nKGNvbnN0IGNoYXIgKnNlbmRlciwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZzsKKyAgICB2YV9zdGFydChhcmcsIGZvcm1hdCk7CisgICAgcGpfbG9nKHNlbmRlciwgbGV2ZWwsIGZvcm1hdCwgYXJnKTsKKyAgICB2YV9lbmQoYXJnKTsKK30KKworc3RhdGljIHZvaWQgcGpfcGVycm9yX2ltcChpbnQgbG9nX2xldmVsLCBjb25zdCBjaGFyICpzZW5kZXIsIAorCQkJICBwal9zdGF0dXNfdCBzdGF0dXMsCisJCSAgICAgICAgICBjb25zdCBjaGFyICp0aXRsZV9mbXQsIHZhX2xpc3QgbWFya2VyKQoreworICAgIGNoYXIgdGl0bGVidWZbUEpfUEVSUk9SX1RJVExFX0JVRl9TSVpFXTsKKyAgICBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworICAgIGludCBsZW47CisKKyAgICAvKiBCdWlsZCB0aGUgdGl0bGUgKi8KKyAgICBsZW4gPSBwal9hbnNpX3ZzbnByaW50Zih0aXRsZWJ1Ziwgc2l6ZW9mKHRpdGxlYnVmKSwgdGl0bGVfZm10LCBtYXJrZXIpOworICAgIGlmIChsZW4gPCAwIHx8IGxlbiA+PSAoaW50KXNpemVvZih0aXRsZWJ1ZikpCisJcGpfYW5zaV9zdHJjcHkodGl0bGVidWYsICJFcnJvciIpOworCisgICAgLyogR2V0IHRoZSBlcnJvciAqLworICAgIHBqX3N0cmVycm9yKHN0YXR1cywgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CisKKyAgICAvKiBTZW5kIHRvIGxvZyAqLworICAgIGludm9rZV9sb2coc2VuZGVyLCBsb2dfbGV2ZWwsICIlczogJXMiLCB0aXRsZWJ1ZiwgZXJybXNnKTsKK30KKworUEpfREVGKHZvaWQpIHBqX3BlcnJvcihpbnQgbG9nX2xldmVsLCBjb25zdCBjaGFyICpzZW5kZXIsIHBqX3N0YXR1c190IHN0YXR1cywKKwkJICAgICAgIGNvbnN0IGNoYXIgKnRpdGxlX2ZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgbWFya2VyOworICAgIHZhX3N0YXJ0KG1hcmtlciwgdGl0bGVfZm10KTsKKyAgICBwal9wZXJyb3JfaW1wKGxvZ19sZXZlbCwgc2VuZGVyLCBzdGF0dXMsIHRpdGxlX2ZtdCwgbWFya2VyKTsKKyAgICB2YV9lbmQobWFya2VyKTsKK30KKworUEpfREVGKHZvaWQpIHBqX3BlcnJvcl8xKGNvbnN0IGNoYXIgKnNlbmRlciwgcGpfc3RhdHVzX3Qgc3RhdHVzLAorCQkJIGNvbnN0IGNoYXIgKnRpdGxlX2ZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgbWFya2VyOworICAgIHZhX3N0YXJ0KG1hcmtlciwgdGl0bGVfZm10KTsKKyAgICBwal9wZXJyb3JfaW1wKDEsIHNlbmRlciwgc3RhdHVzLCB0aXRsZV9mbXQsIG1hcmtlcik7CisgICAgdmFfZW5kKG1hcmtlcik7Cit9CisKKyNlbHNlIC8qICNpZiBQSl9MT0dfTUFYX0xFVkVMID49IDEgKi8KK1BKX0RFRih2b2lkKSBwal9wZXJyb3IoaW50IGxvZ19sZXZlbCwgY29uc3QgY2hhciAqc2VuZGVyLCBwal9zdGF0dXNfdCBzdGF0dXMsCisJCSAgICAgICBjb25zdCBjaGFyICp0aXRsZV9mbXQsIC4uLikKK3sKK30KKyNlbmRpZgkvKiAjaWYgUEpfTE9HX01BWF9MRVZFTCA+PSAxICovCisKKworI2lmIFBKX0xPR19NQVhfTEVWRUwgPj0gMgorUEpfREVGKHZvaWQpIHBqX3BlcnJvcl8yKGNvbnN0IGNoYXIgKnNlbmRlciwgcGpfc3RhdHVzX3Qgc3RhdHVzLAorCQkJIGNvbnN0IGNoYXIgKnRpdGxlX2ZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgbWFya2VyOworICAgIHZhX3N0YXJ0KG1hcmtlciwgdGl0bGVfZm10KTsKKyAgICBwal9wZXJyb3JfaW1wKDIsIHNlbmRlciwgc3RhdHVzLCB0aXRsZV9mbXQsIG1hcmtlcik7CisgICAgdmFfZW5kKG1hcmtlcik7Cit9CisjZW5kaWYKKworI2lmIFBKX0xPR19NQVhfTEVWRUwgPj0gMworUEpfREVGKHZvaWQpIHBqX3BlcnJvcl8zKGNvbnN0IGNoYXIgKnNlbmRlciwgcGpfc3RhdHVzX3Qgc3RhdHVzLAorCQkJIGNvbnN0IGNoYXIgKnRpdGxlX2ZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgbWFya2VyOworICAgIHZhX3N0YXJ0KG1hcmtlciwgdGl0bGVfZm10KTsKKyAgICBwal9wZXJyb3JfaW1wKDMsIHNlbmRlciwgc3RhdHVzLCB0aXRsZV9mbXQsIG1hcmtlcik7CisgICAgdmFfZW5kKG1hcmtlcik7Cit9CisjZW5kaWYKKworI2lmIFBKX0xPR19NQVhfTEVWRUwgPj0gNAorUEpfREVGKHZvaWQpIHBqX3BlcnJvcl80KGNvbnN0IGNoYXIgKnNlbmRlciwgcGpfc3RhdHVzX3Qgc3RhdHVzLAorCQkJIGNvbnN0IGNoYXIgKnRpdGxlX2ZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgbWFya2VyOworICAgIHZhX3N0YXJ0KG1hcmtlciwgdGl0bGVfZm10KTsKKyAgICBwal9wZXJyb3JfaW1wKDQsIHNlbmRlciwgc3RhdHVzLCB0aXRsZV9mbXQsIG1hcmtlcik7CisgICAgdmFfZW5kKG1hcmtlcik7Cit9CisjZW5kaWYKKworI2lmIFBKX0xPR19NQVhfTEVWRUwgPj0gNQorUEpfREVGKHZvaWQpIHBqX3BlcnJvcl81KGNvbnN0IGNoYXIgKnNlbmRlciwgcGpfc3RhdHVzX3Qgc3RhdHVzLAorCQkJIGNvbnN0IGNoYXIgKnRpdGxlX2ZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgbWFya2VyOworICAgIHZhX3N0YXJ0KG1hcmtlciwgdGl0bGVfZm10KTsKKyAgICBwal9wZXJyb3JfaW1wKDUsIHNlbmRlciwgc3RhdHVzLCB0aXRsZV9mbXQsIG1hcmtlcik7CisgICAgdmFfZW5kKG1hcmtlcik7Cit9CisjZW5kaWYKKworI2lmIFBKX0xPR19NQVhfTEVWRUwgPj0gNgorUEpfREVGKHZvaWQpIHBqX3BlcnJvcl82KGNvbnN0IGNoYXIgKnNlbmRlciwgcGpfc3RhdHVzX3Qgc3RhdHVzLAorCQkJIGNvbnN0IGNoYXIgKnRpdGxlX2ZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgbWFya2VyOworICAgIHZhX3N0YXJ0KG1hcmtlciwgdGl0bGVfZm10KTsKKyAgICBwal9wZXJyb3JfaW1wKDYsIHNlbmRlciwgc3RhdHVzLCB0aXRsZV9mbXQsIG1hcmtlcik7CisgICAgdmFfZW5kKG1hcmtlcik7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9leGNlcHQuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZXhjZXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5ODRkZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZXhjZXB0LmMKQEAgLTAsMCArMSwxODUgQEAKKy8qICRJZDogZXhjZXB0LmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9leGNlcHQuaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisKK3N0YXRpYyBsb25nIHRocmVhZF9sb2NhbF9pZCA9IC0xOworCisjaWYgZGVmaW5lZChQSl9IQVNfRVhDRVBUSU9OX05BTUVTKSAmJiBQSl9IQVNfRVhDRVBUSU9OX05BTUVTICE9IDAKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZXhjZXB0aW9uX2lkX25hbWVzW1BKX01BWF9FWENFUFRJT05fSURdOworI2Vsc2UKKyAgICAvKgorICAgICAqIFN0YXJ0IGZyb20gMSAobm90IDApISEhCisgICAgICogRXhjZXB0aW9uIDAgaXMgcmVzZXJ2ZWQgZm9yIG5vcm1hbCBwYXRoIG9mIHNldGptcCgpISEhCisgICAgICovCisgICAgc3RhdGljIGludCBsYXN0X2V4Y2VwdGlvbl9pZCA9IDE7CisjZW5kaWYgIC8qIFBKX0hBU19FWENFUFRJT05fTkFNRVMgKi8KKworCisjaWYgIWRlZmluZWQoUEpfRVhDRVBUSU9OX1VTRV9XSU4zMl9TRUgpIHx8IFBKX0VYQ0VQVElPTl9VU0VfV0lOMzJfU0VIPT0wCitQSl9ERUYodm9pZCkgcGpfdGhyb3dfZXhjZXB0aW9uXyhpbnQgZXhjZXB0aW9uX2lkKQoreworICAgIHN0cnVjdCBwal9leGNlcHRpb25fc3RhdGVfdCAqaGFuZGxlcjsKKworICAgIGhhbmRsZXIgPSAoc3RydWN0IHBqX2V4Y2VwdGlvbl9zdGF0ZV90KikgCisJICAgICAgcGpfdGhyZWFkX2xvY2FsX2dldCh0aHJlYWRfbG9jYWxfaWQpOworICAgIGlmIChoYW5kbGVyID09IE5VTEwpIHsKKyAgICAgICAgUEpfTE9HKDEsKCJleGNlcHQuYyIsICIhISFGQVRBTDogdW5oYW5kbGVkIGV4Y2VwdGlvbiAlcyFcbiIsIAorCQkgICBwal9leGNlcHRpb25faWRfbmFtZShleGNlcHRpb25faWQpKSk7CisgICAgICAgIHBqX2Fzc2VydChoYW5kbGVyICE9IE5VTEwpOworICAgICAgICAvKiBUaGlzIHdpbGwgY3Jhc2ggdGhlIHN5c3RlbSEgKi8KKyAgICB9CisgICAgcGpfcG9wX2V4Y2VwdGlvbl9oYW5kbGVyXyhoYW5kbGVyKTsKKyAgICBwal9sb25nam1wKGhhbmRsZXItPnN0YXRlLCBleGNlcHRpb25faWQpOworfQorCitzdGF0aWMgdm9pZCBleGNlcHRpb25fY2xlYW51cCh2b2lkKQoreworICAgIGlmICh0aHJlYWRfbG9jYWxfaWQgIT0gLTEpIHsKKwlwal90aHJlYWRfbG9jYWxfZnJlZSh0aHJlYWRfbG9jYWxfaWQpOworCXRocmVhZF9sb2NhbF9pZCA9IC0xOworICAgIH0KKworI2lmIGRlZmluZWQoUEpfSEFTX0VYQ0VQVElPTl9OQU1FUykgJiYgUEpfSEFTX0VYQ0VQVElPTl9OQU1FUyAhPSAwCisgICAgeworCXVuc2lnbmVkIGk7CisJZm9yIChpPTA7IGk8UEpfTUFYX0VYQ0VQVElPTl9JRDsgKytpKQorCSAgICBleGNlcHRpb25faWRfbmFtZXNbaV0gPSBOVUxMOworICAgIH0KKyNlbHNlCisgICAgbGFzdF9leGNlcHRpb25faWQgPSAxOworI2VuZGlmCit9CisKK1BKX0RFRih2b2lkKSBwal9wdXNoX2V4Y2VwdGlvbl9oYW5kbGVyXyhzdHJ1Y3QgcGpfZXhjZXB0aW9uX3N0YXRlX3QgKnJlYykKK3sKKyAgICBzdHJ1Y3QgcGpfZXhjZXB0aW9uX3N0YXRlX3QgKnBhcmVudF9oYW5kbGVyID0gTlVMTDsKKworICAgIGlmICh0aHJlYWRfbG9jYWxfaWQgPT0gLTEpIHsKKwlwal90aHJlYWRfbG9jYWxfYWxsb2MoJnRocmVhZF9sb2NhbF9pZCk7CisJcGpfYXNzZXJ0KHRocmVhZF9sb2NhbF9pZCAhPSAtMSk7CisJcGpfYXRleGl0KCZleGNlcHRpb25fY2xlYW51cCk7CisgICAgfQorICAgIHBhcmVudF9oYW5kbGVyID0gKHN0cnVjdCBwal9leGNlcHRpb25fc3RhdGVfdCAqKQorCQkgICAgICBwal90aHJlYWRfbG9jYWxfZ2V0KHRocmVhZF9sb2NhbF9pZCk7CisgICAgcmVjLT5wcmV2ID0gcGFyZW50X2hhbmRsZXI7CisgICAgcGpfdGhyZWFkX2xvY2FsX3NldCh0aHJlYWRfbG9jYWxfaWQsIHJlYyk7Cit9CisKK1BKX0RFRih2b2lkKSBwal9wb3BfZXhjZXB0aW9uX2hhbmRsZXJfKHN0cnVjdCBwal9leGNlcHRpb25fc3RhdGVfdCAqcmVjKQoreworICAgIHN0cnVjdCBwal9leGNlcHRpb25fc3RhdGVfdCAqaGFuZGxlcjsKKworICAgIGhhbmRsZXIgPSAoc3RydWN0IHBqX2V4Y2VwdGlvbl9zdGF0ZV90ICopCisJICAgICAgcGpfdGhyZWFkX2xvY2FsX2dldCh0aHJlYWRfbG9jYWxfaWQpOworICAgIGlmIChoYW5kbGVyICYmIGhhbmRsZXI9PXJlYykgeworCXBqX3RocmVhZF9sb2NhbF9zZXQodGhyZWFkX2xvY2FsX2lkLCBoYW5kbGVyLT5wcmV2KTsKKyAgICB9Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUEpfSEFTX0VYQ0VQVElPTl9OQU1FUykgJiYgUEpfSEFTX0VYQ0VQVElPTl9OQU1FUyAhPSAwCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2V4Y2VwdGlvbl9pZF9hbGxvYyggY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9leGNlcHRpb25faWRfdCAqaWQpCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIHBqX2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qCisgICAgICogU3RhcnQgZnJvbSAxIChub3QgMCkhISEKKyAgICAgKiBFeGNlcHRpb24gMCBpcyByZXNlcnZlZCBmb3Igbm9ybWFsIHBhdGggb2Ygc2V0am1wKCkhISEKKyAgICAgKi8KKyAgICBmb3IgKGk9MTsgaTxQSl9NQVhfRVhDRVBUSU9OX0lEOyArK2kpIHsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbl9pZF9uYW1lc1tpXSA9PSBOVUxMKSB7CisgICAgICAgICAgICBleGNlcHRpb25faWRfbmFtZXNbaV0gPSBuYW1lOworICAgICAgICAgICAgKmlkID0gaTsKKyAgICAgICAgICAgIHBqX2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICAgICAgICAgIHJldHVybiBQSl9TVUNDRVNTOworICAgICAgICB9CisgICAgfQorCisgICAgcGpfbGVhdmVfY3JpdGljYWxfc2VjdGlvbigpOworICAgIHJldHVybiBQSl9FVE9PTUFOWTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9leGNlcHRpb25faWRfZnJlZSggcGpfZXhjZXB0aW9uX2lkX3QgaWQgKQoreworICAgIC8qCisgICAgICogU3RhcnQgZnJvbSAxIChub3QgMCkhISEKKyAgICAgKiBFeGNlcHRpb24gMCBpcyByZXNlcnZlZCBmb3Igbm9ybWFsIHBhdGggb2Ygc2V0am1wKCkhISEKKyAgICAgKi8KKyAgICBQSl9BU1NFUlRfUkVUVVJOKGlkPjAgJiYgaWQ8UEpfTUFYX0VYQ0VQVElPTl9JRCwgUEpfRUlOVkFMKTsKKyAgICAKKyAgICBwal9lbnRlcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgZXhjZXB0aW9uX2lkX25hbWVzW2lkXSA9IE5VTEw7CisgICAgcGpfbGVhdmVfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisKK30KKworUEpfREVGKGNvbnN0IGNoYXIqKSBwal9leGNlcHRpb25faWRfbmFtZShwal9leGNlcHRpb25faWRfdCBpZCkKK3sKKyAgICBzdGF0aWMgY2hhciB1bmtub3duX25hbWVbMzJdOworCisgICAgLyoKKyAgICAgKiBTdGFydCBmcm9tIDEgKG5vdCAwKSEhIQorICAgICAqIEV4Y2VwdGlvbiAwIGlzIHJlc2VydmVkIGZvciBub3JtYWwgcGF0aCBvZiBzZXRqbXAoKSEhIQorICAgICAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oaWQ+MCAmJiBpZDxQSl9NQVhfRVhDRVBUSU9OX0lELCAiPEludmFsaWQgSUQ+Iik7CisKKyAgICBpZiAoZXhjZXB0aW9uX2lkX25hbWVzW2lkXSA9PSBOVUxMKSB7CisgICAgICAgIHBqX2Fuc2lfc25wcmludGYodW5rbm93bl9uYW1lLCBzaXplb2YodW5rbm93bl9uYW1lKSwgCisJCQkgImV4Y2VwdGlvbiAlZCIsIGlkKTsKKwlyZXR1cm4gdW5rbm93bl9uYW1lOworICAgIH0KKworICAgIHJldHVybiBleGNlcHRpb25faWRfbmFtZXNbaWRdOworfQorCisjZWxzZSAgIC8qIFBKX0hBU19FWENFUFRJT05fTkFNRVMgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZXhjZXB0aW9uX2lkX2FsbG9jKCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2V4Y2VwdGlvbl9pZF90ICppZCkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGxhc3RfZXhjZXB0aW9uX2lkIDwgUEpfTUFYX0VYQ0VQVElPTl9JRC0xLCBQSl9FVE9PTUFOWSk7CisKKyAgICAqaWQgPSBsYXN0X2V4Y2VwdGlvbl9pZCsrOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2V4Y2VwdGlvbl9pZF9mcmVlKCBwal9leGNlcHRpb25faWRfdCBpZCApCit7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihjb25zdCBjaGFyKikgcGpfZXhjZXB0aW9uX2lkX25hbWUocGpfZXhjZXB0aW9uX2lkX3QgaWQpCit7CisgICAgcmV0dXJuICIiOworfQorCisjZW5kaWYgIC8qIFBKX0hBU19FWENFUFRJT05fTkFNRVMgKi8KKworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZXhjZXB0aW9uX3N5bWJpYW4uY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9leGNlcHRpb25fc3ltYmlhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkYWU0YwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZXhjZXB0aW9uX3N5bWJpYW4uY3BwCkBAIC0wLDAgKzEsMTE2IEBACisvKiAkSWQ6IGV4Y2VwdGlvbl9zeW1iaWFuLmNwcCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2V4Y2VwdC5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKworCisjaWYgZGVmaW5lZChQSl9IQVNfRVhDRVBUSU9OX05BTUVTKSAmJiBQSl9IQVNfRVhDRVBUSU9OX05BTUVTICE9IDAKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZXhjZXB0aW9uX2lkX25hbWVzW1BKX01BWF9FWENFUFRJT05fSURdOworI2Vsc2UKKyAgICAvKgorICAgICAqIFN0YXJ0IGZyb20gMSAobm90IDApISEhCisgICAgICogRXhjZXB0aW9uIDAgaXMgcmVzZXJ2ZWQgZm9yIG5vcm1hbCBwYXRoIG9mIHNldGptcCgpISEhCisgICAgICovCisgICAgc3RhdGljIGludCBsYXN0X2V4Y2VwdGlvbl9pZCA9IDE7CisjZW5kaWYgIC8qIFBKX0hBU19FWENFUFRJT05fTkFNRVMgKi8KKworCisjaWYgZGVmaW5lZChQSl9IQVNfRVhDRVBUSU9OX05BTUVTKSAmJiBQSl9IQVNfRVhDRVBUSU9OX05BTUVTICE9IDAKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZXhjZXB0aW9uX2lkX2FsbG9jKCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2V4Y2VwdGlvbl9pZF90ICppZCkKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgcGpfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyoKKyAgICAgKiBTdGFydCBmcm9tIDEgKG5vdCAwKSEhIQorICAgICAqIEV4Y2VwdGlvbiAwIGlzIHJlc2VydmVkIGZvciBub3JtYWwgcGF0aCBvZiBzZXRqbXAoKSEhIQorICAgICAqLworICAgIGZvciAoaT0xOyBpPFBKX01BWF9FWENFUFRJT05fSUQ7ICsraSkgeworICAgICAgICBpZiAoZXhjZXB0aW9uX2lkX25hbWVzW2ldID09IE5VTEwpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbl9pZF9uYW1lc1tpXSA9IG5hbWU7CisgICAgICAgICAgICAqaWQgPSBpOworICAgICAgICAgICAgcGpfbGVhdmVfY3JpdGljYWxfc2VjdGlvbigpOworICAgICAgICAgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwal9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgcmV0dXJuIFBKX0VUT09NQU5ZOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2V4Y2VwdGlvbl9pZF9mcmVlKCBwal9leGNlcHRpb25faWRfdCBpZCApCit7CisgICAgLyoKKyAgICAgKiBTdGFydCBmcm9tIDEgKG5vdCAwKSEhIQorICAgICAqIEV4Y2VwdGlvbiAwIGlzIHJlc2VydmVkIGZvciBub3JtYWwgcGF0aCBvZiBzZXRqbXAoKSEhIQorICAgICAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oaWQ+MCAmJiBpZDxQSl9NQVhfRVhDRVBUSU9OX0lELCBQSl9FSU5WQUwpOworICAgIAorICAgIHBqX2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICBleGNlcHRpb25faWRfbmFtZXNbaWRdID0gTlVMTDsKKyAgICBwal9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKworfQorCitQSl9ERUYoY29uc3QgY2hhciopIHBqX2V4Y2VwdGlvbl9pZF9uYW1lKHBqX2V4Y2VwdGlvbl9pZF90IGlkKQoreworICAgIC8qCisgICAgICogU3RhcnQgZnJvbSAxIChub3QgMCkhISEKKyAgICAgKiBFeGNlcHRpb24gMCBpcyByZXNlcnZlZCBmb3Igbm9ybWFsIHBhdGggb2Ygc2V0am1wKCkhISEKKyAgICAgKi8KKyAgICBQSl9BU1NFUlRfUkVUVVJOKGlkPjAgJiYgaWQ8UEpfTUFYX0VYQ0VQVElPTl9JRCwgIjxJbnZhbGlkIElEPiIpOworCisgICAgaWYgKGV4Y2VwdGlvbl9pZF9uYW1lc1tpZF0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICI8VW5hbGxvY2F0ZWQgSUQ+IjsKKworICAgIHJldHVybiBleGNlcHRpb25faWRfbmFtZXNbaWRdOworfQorCisjZWxzZSAgIC8qIFBKX0hBU19FWENFUFRJT05fTkFNRVMgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZXhjZXB0aW9uX2lkX2FsbG9jKCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2V4Y2VwdGlvbl9pZF90ICppZCkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGxhc3RfZXhjZXB0aW9uX2lkIDwgUEpfTUFYX0VYQ0VQVElPTl9JRC0xLCBQSl9FVE9PTUFOWSk7CisKKyAgICAqaWQgPSBsYXN0X2V4Y2VwdGlvbl9pZCsrOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2V4Y2VwdGlvbl9pZF9mcmVlKCBwal9leGNlcHRpb25faWRfdCBpZCApCit7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihjb25zdCBjaGFyKikgcGpfZXhjZXB0aW9uX2lkX25hbWUocGpfZXhjZXB0aW9uX2lkX3QgaWQpCit7CisgICAgcmV0dXJuICIiOworfQorCisjZW5kaWYgIC8qIFBKX0hBU19FWENFUFRJT05fTkFNRVMgKi8KKworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZXh0cmEtZXhwb3J0cy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9leHRyYS1leHBvcnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkNWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZXh0cmEtZXhwb3J0cy5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qICRJZDogZXh0cmEtZXhwb3J0cy5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKworRVhQT1JUX1NZTUJPTChzeXNfc2VsZWN0KTsKKworRVhQT1JUX1NZTUJPTChzeXNfZXBvbGxfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woc3lzX2Vwb2xsX2N0bCk7CitFWFBPUlRfU1lNQk9MKHN5c19lcG9sbF93YWl0KTsKKworRVhQT1JUX1NZTUJPTChzeXNfc29ja2V0KTsKK0VYUE9SVF9TWU1CT0woc3lzX2JpbmQpOworRVhQT1JUX1NZTUJPTChzeXNfZ2V0cGVlcm5hbWUpOworRVhQT1JUX1NZTUJPTChzeXNfZ2V0c29ja25hbWUpOworRVhQT1JUX1NZTUJPTChzeXNfc2VuZHRvKTsKK0VYUE9SVF9TWU1CT0woc3lzX3JlY3Zmcm9tKTsKK0VYUE9SVF9TWU1CT0woc3lzX2dldHNvY2tvcHQpOworRVhQT1JUX1NZTUJPTChzeXNfc2V0c29ja29wdCk7CitFWFBPUlRfU1lNQk9MKHN5c19saXN0ZW4pOworRVhQT1JUX1NZTUJPTChzeXNfc2h1dGRvd24pOworRVhQT1JUX1NZTUJPTChzeXNfY29ubmVjdCk7CitFWFBPUlRfU1lNQk9MKHN5c19hY2NlcHQpOworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2ZpZm9idWYuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZmlmb2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjY2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2ZpZm9idWYuYwpAQCAtMCwwICsxLDE4OSBAQAorLyogJElkOiBmaWZvYnVmLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovZmlmb2J1Zi5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisKKyNkZWZpbmUgVEhJU19GSUxFICAgImZpZm9idWYiCisKKyNkZWZpbmUgU1ogIHNpemVvZih1bnNpZ25lZCkKKworUEpfREVGKHZvaWQpIHBqX2ZpZm9idWZfaW5pdCAocGpfZmlmb2J1Zl90ICpmaWZvYnVmLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIFBKX0xPRyg2LCAoVEhJU19GSUxFLCAKKwkgICAgICAgImZpZm9idWZfaW5pdCBmaWZvYnVmPSVwIGJ1ZmZlcj0lcCwgc2l6ZT0lZCIsIAorCSAgICAgICBmaWZvYnVmLCBidWZmZXIsIHNpemUpKTsKKworICAgIGZpZm9idWYtPmZpcnN0ID0gKGNoYXIqKWJ1ZmZlcjsKKyAgICBmaWZvYnVmLT5sYXN0ID0gZmlmb2J1Zi0+Zmlyc3QgKyBzaXplOworICAgIGZpZm9idWYtPnViZWdpbiA9IGZpZm9idWYtPnVlbmQgPSBmaWZvYnVmLT5maXJzdDsKKyAgICBmaWZvYnVmLT5mdWxsID0gMDsKK30KKworUEpfREVGKHVuc2lnbmVkKSBwal9maWZvYnVmX21heF9zaXplIChwal9maWZvYnVmX3QgKmZpZm9idWYpCit7CisgICAgdW5zaWduZWQgczEsIHMyOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIGlmIChmaWZvYnVmLT51ZW5kID49IGZpZm9idWYtPnViZWdpbikgeworCXMxID0gKHVuc2lnbmVkKShmaWZvYnVmLT5sYXN0IC0gZmlmb2J1Zi0+dWVuZCk7CisJczIgPSAodW5zaWduZWQpKGZpZm9idWYtPnViZWdpbiAtIGZpZm9idWYtPmZpcnN0KTsKKyAgICB9IGVsc2UgeworCXMxID0gczIgPSAodW5zaWduZWQpKGZpZm9idWYtPnViZWdpbiAtIGZpZm9idWYtPnVlbmQpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gczE8czIgPyBzMiA6IHMxOworfQorCitQSl9ERUYodm9pZCopIHBqX2ZpZm9idWZfYWxsb2MgKHBqX2ZpZm9idWZfdCAqZmlmb2J1ZiwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBhdmFpbGFibGU7CisgICAgY2hhciAqc3RhcnQ7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgaWYgKGZpZm9idWYtPmZ1bGwpIHsKKwlQSl9MT0coNiwgKFRISVNfRklMRSwgCisJCSAgICJmaWZvYnVmX2FsbG9jIGZpZm9idWY9JXAsIHNpemU9JWQ6IGZ1bGwhIiwgCisJCSAgIGZpZm9idWYsIHNpemUpKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiB0cnkgdG8gYWxsb2NhdGUgZnJvbSB0aGUgZW5kIHBhcnQgb2YgdGhlIGZpZm8gKi8KKyAgICBpZiAoZmlmb2J1Zi0+dWVuZCA+PSBmaWZvYnVmLT51YmVnaW4pIHsKKwlhdmFpbGFibGUgPSAodW5zaWduZWQpKGZpZm9idWYtPmxhc3QgLSBmaWZvYnVmLT51ZW5kKTsKKwlpZiAoYXZhaWxhYmxlID49IHNpemUrU1opIHsKKwkgICAgY2hhciAqcHRyID0gZmlmb2J1Zi0+dWVuZDsKKwkgICAgZmlmb2J1Zi0+dWVuZCArPSAoc2l6ZStTWik7CisJICAgIGlmIChmaWZvYnVmLT51ZW5kID09IGZpZm9idWYtPmxhc3QpCisJCWZpZm9idWYtPnVlbmQgPSBmaWZvYnVmLT5maXJzdDsKKwkgICAgaWYgKGZpZm9idWYtPnVlbmQgPT0gZmlmb2J1Zi0+dWJlZ2luKQorCQlmaWZvYnVmLT5mdWxsID0gMTsKKwkgICAgKih1bnNpZ25lZCopcHRyID0gc2l6ZStTWjsKKwkgICAgcHRyICs9IFNaOworCisJICAgIFBKX0xPRyg2LCAoVEhJU19GSUxFLCAKKwkJICAgICAgICJmaWZvYnVmX2FsbG9jIGZpZm9idWY9JXAsIHNpemU9JWQ6IHJldHVybmluZyAlcCwgcDE9JXAsIHAyPSVwIiwgCisJCSAgICAgICBmaWZvYnVmLCBzaXplLCBwdHIsIGZpZm9idWYtPnViZWdpbiwgZmlmb2J1Zi0+dWVuZCkpOworCSAgICByZXR1cm4gcHRyOworCX0KKyAgICB9CisKKyAgICAvKiB0cnkgdG8gYWxsb2NhdGUgZnJvbSB0aGUgc3RhcnQgcGFydCBvZiB0aGUgZmlmbyAqLworICAgIHN0YXJ0ID0gKGZpZm9idWYtPnVlbmQgPD0gZmlmb2J1Zi0+dWJlZ2luKSA/IGZpZm9idWYtPnVlbmQgOiBmaWZvYnVmLT5maXJzdDsKKyAgICBhdmFpbGFibGUgPSAodW5zaWduZWQpKGZpZm9idWYtPnViZWdpbiAtIHN0YXJ0KTsKKyAgICBpZiAoYXZhaWxhYmxlID49IHNpemUrU1opIHsKKwljaGFyICpwdHIgPSBzdGFydDsKKwlmaWZvYnVmLT51ZW5kID0gc3RhcnQgKyBzaXplICsgU1o7CisJaWYgKGZpZm9idWYtPnVlbmQgPT0gZmlmb2J1Zi0+dWJlZ2luKQorCSAgICBmaWZvYnVmLT5mdWxsID0gMTsKKwkqKHVuc2lnbmVkKilwdHIgPSBzaXplK1NaOworCXB0ciArPSBTWjsKKworCVBKX0xPRyg2LCAoVEhJU19GSUxFLCAKKwkJICAgImZpZm9idWZfYWxsb2MgZmlmb2J1Zj0lcCwgc2l6ZT0lZDogcmV0dXJuaW5nICVwLCBwMT0lcCwgcDI9JXAiLCAKKwkJICAgZmlmb2J1Ziwgc2l6ZSwgcHRyLCBmaWZvYnVmLT51YmVnaW4sIGZpZm9idWYtPnVlbmQpKTsKKwlyZXR1cm4gcHRyOworICAgIH0KKworICAgIFBKX0xPRyg2LCAoVEhJU19GSUxFLCAKKwkgICAgICAgImZpZm9idWZfYWxsb2MgZmlmb2J1Zj0lcCwgc2l6ZT0lZDogbm8gc3BhY2UgbGVmdCEgcDE9JXAsIHAyPSVwIiwgCisJICAgICAgIGZpZm9idWYsIHNpemUsIGZpZm9idWYtPnViZWdpbiwgZmlmb2J1Zi0+dWVuZCkpOworICAgIHJldHVybiBOVUxMOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2ZpZm9idWZfdW5hbGxvYyAocGpfZmlmb2J1Zl90ICpmaWZvYnVmLCB2b2lkICpidWYpCit7CisgICAgY2hhciAqcHRyID0gKGNoYXIqKWJ1ZjsKKyAgICBjaGFyICplbmRwdHI7CisgICAgdW5zaWduZWQgc3o7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgcHRyIC09IFNaOworICAgIHN6ID0gKih1bnNpZ25lZCopcHRyOworCisgICAgZW5kcHRyID0gZmlmb2J1Zi0+dWVuZDsKKyAgICBpZiAoZW5kcHRyID09IGZpZm9idWYtPmZpcnN0KQorCWVuZHB0ciA9IGZpZm9idWYtPmxhc3Q7CisKKyAgICBpZiAocHRyK3N6ICE9IGVuZHB0cikgeworCXBqX2Fzc2VydCghIkludmFsaWQgcG9pbnRlciB0byB1bmRvIGFsbG9jIik7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIGZpZm9idWYtPnVlbmQgPSBwdHI7CisgICAgZmlmb2J1Zi0+ZnVsbCA9IDA7CisKKyAgICBQSl9MT0coNiwgKFRISVNfRklMRSwgCisJICAgICAgICJmaWZvYnVmX3VuYWxsb2MgZmlmb2J1Zj0lcCwgcHRyPSVwLCBzaXplPSVkLCBwMT0lcCwgcDI9JXAiLCAKKwkgICAgICAgZmlmb2J1ZiwgYnVmLCBzeiwgZmlmb2J1Zi0+dWJlZ2luLCBmaWZvYnVmLT51ZW5kKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9maWZvYnVmX2ZyZWUgKHBqX2ZpZm9idWZfdCAqZmlmb2J1Ziwgdm9pZCAqYnVmKQoreworICAgIGNoYXIgKnB0ciA9IChjaGFyKilidWY7CisgICAgY2hhciAqZW5kOworICAgIHVuc2lnbmVkIHN6OworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHB0ciAtPSBTWjsKKyAgICBpZiAocHRyIDwgZmlmb2J1Zi0+Zmlyc3QgfHwgcHRyID49IGZpZm9idWYtPmxhc3QpIHsKKwlwal9hc3NlcnQoISJJbnZhbGlkIHBvaW50ZXIgdG8gZnJlZSIpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocHRyICE9IGZpZm9idWYtPnViZWdpbiAmJiBwdHIgIT0gZmlmb2J1Zi0+Zmlyc3QpIHsKKwlwal9hc3NlcnQoISJJbnZhbGlkIGZyZWUoKSBzZXF1ZW5jZSEiKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgZW5kID0gKGZpZm9idWYtPnVlbmQgPiBmaWZvYnVmLT51YmVnaW4pID8gZmlmb2J1Zi0+dWVuZCA6IGZpZm9idWYtPmxhc3Q7CisgICAgc3ogPSAqKHVuc2lnbmVkKilwdHI7CisgICAgaWYgKHB0citzeiA+IGVuZCkgeworCXBqX2Fzc2VydCghIkludmFsaWQgc2l6ZSEiKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgZmlmb2J1Zi0+dWJlZ2luID0gcHRyICsgc3o7CisKKyAgICAvKiBSb2xsb3ZlciAqLworICAgIGlmIChmaWZvYnVmLT51YmVnaW4gPT0gZmlmb2J1Zi0+bGFzdCkKKwlmaWZvYnVmLT51YmVnaW4gPSBmaWZvYnVmLT5maXJzdDsKKworICAgIC8qIFJlc2V0IGlmIGZpZm9idWYgaXMgZW1wdHkgKi8KKyAgICBpZiAoZmlmb2J1Zi0+dWJlZ2luID09IGZpZm9idWYtPnVlbmQpCisJZmlmb2J1Zi0+dWJlZ2luID0gZmlmb2J1Zi0+dWVuZCA9IGZpZm9idWYtPmZpcnN0OworCisgICAgZmlmb2J1Zi0+ZnVsbCA9IDA7CisKKyAgICBQSl9MT0coNiwgKFRISVNfRklMRSwgCisJICAgICAgICJmaWZvYnVmX2ZyZWUgZmlmb2J1Zj0lcCwgcHRyPSVwLCBzaXplPSVkLCBwMT0lcCwgcDI9JXAiLCAKKwkgICAgICAgZmlmb2J1ZiwgYnVmLCBzeiwgZmlmb2J1Zi0+dWJlZ2luLCBmaWZvYnVmLT51ZW5kKSk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZmlsZV9hY2Nlc3NfdW5pc3RkLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2ZpbGVfYWNjZXNzX3VuaXN0ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OGEzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2ZpbGVfYWNjZXNzX3VuaXN0ZC5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiAkSWQ6IGZpbGVfYWNjZXNzX3VuaXN0ZC5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovZmlsZV9hY2Nlc3MuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgkvKiByZW5hbWUoKSAqLworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qCisgKiBwal9maWxlX2V4aXN0cygpCisgKi8KK1BKX0RFRihwal9ib29sX3QpIHBqX2ZpbGVfZXhpc3RzKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oZmlsZW5hbWUsIDApOworCisgICAgaWYgKHN0YXQoZmlsZW5hbWUsICZidWYpICE9IDApCisJcmV0dXJuIDA7CisKKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworCisvKgorICogcGpfZmlsZV9zaXplKCkKKyAqLworUEpfREVGKHBqX29mZl90KSBwal9maWxlX3NpemUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgc3RydWN0IHN0YXQgYnVmOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihmaWxlbmFtZSwgLTEpOworCisgICAgaWYgKHN0YXQoZmlsZW5hbWUsICZidWYpICE9IDApCisJcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGJ1Zi5zdF9zaXplOworfQorCisKKy8qCisgKiBwal9maWxlX2RlbGV0ZSgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZmlsZV9kZWxldGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihmaWxlbmFtZSwgUEpfRUlOVkFMKTsKKworICAgIGlmICh1bmxpbmsoZmlsZW5hbWUpIT0wKSB7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihlcnJubyk7CisgICAgfQorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBwal9maWxlX21vdmUoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2ZpbGVfbW92ZSggY29uc3QgY2hhciAqb2xkbmFtZSwgY29uc3QgY2hhciAqbmV3bmFtZSkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG9sZG5hbWUgJiYgbmV3bmFtZSwgUEpfRUlOVkFMKTsKKworICAgIGlmIChyZW5hbWUob2xkbmFtZSwgbmV3bmFtZSkgIT0gMCkgeworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZXJybm8pOworICAgIH0KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKgorICogcGpfZmlsZV9nZXRzdGF0KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9maWxlX2dldHN0YXQoY29uc3QgY2hhciAqZmlsZW5hbWUsIAorCQkJCSAgICBwal9maWxlX3N0YXQgKnN0YXRidWYpCit7CisgICAgc3RydWN0IHN0YXQgYnVmOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihmaWxlbmFtZSAmJiBzdGF0YnVmLCBQSl9FSU5WQUwpOworCisgICAgaWYgKHN0YXQoZmlsZW5hbWUsICZidWYpICE9IDApIHsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKGVycm5vKTsKKyAgICB9CisKKyAgICBzdGF0YnVmLT5zaXplID0gYnVmLnN0X3NpemU7CisgICAgc3RhdGJ1Zi0+Y3RpbWUuc2VjID0gYnVmLnN0X2N0aW1lOworICAgIHN0YXRidWYtPmN0aW1lLm1zZWMgPSAwOworICAgIHN0YXRidWYtPm10aW1lLnNlYyA9IGJ1Zi5zdF9tdGltZTsKKyAgICBzdGF0YnVmLT5tdGltZS5tc2VjID0gMDsKKyAgICBzdGF0YnVmLT5hdGltZS5zZWMgPSBidWYuc3RfYXRpbWU7CisgICAgc3RhdGJ1Zi0+YXRpbWUubXNlYyA9IDA7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9maWxlX2FjY2Vzc193aW4zMi5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9maWxlX2FjY2Vzc193aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzdmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2ZpbGVfYWNjZXNzX3dpbjMyLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qICRJZDogZmlsZV9hY2Nlc3Nfd2luMzIuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2ZpbGVfYWNjZXNzLmg+CisjaW5jbHVkZSA8cGovdW5pY29kZS5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWYgZGVmaW5lZChQSl9XSU4zMl9XSU5DRSkgJiYgUEpfV0lOMzJfV0lOQ0UhPTAKKyAgICAvKiBXaW5DRSBsYWNrcyBSRUFEX0NPTlRST0wgc28gd2UgbXVzdCB1c2UgR0VORVJJQ19SRUFEICovCisjICAgZGVmaW5lIENPTlRST0xfQUNDRVNTICAgR0VORVJJQ19SRUFECisjZWxzZQorIyAgIGRlZmluZSBDT05UUk9MX0FDQ0VTUyAgIFJFQURfQ09OVFJPTAorI2VuZGlmCisKKworLyoKKyAqIHBqX2ZpbGVfZXhpc3RzKCkKKyAqLworUEpfREVGKHBqX2Jvb2xfdCkgcGpfZmlsZV9leGlzdHMoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgUEpfREVDTF9VTklDT0RFX1RFTVBfQlVGKHdmaWxlbmFtZSwyNTYpCisgICAgSEFORExFIGhGaWxlOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihmaWxlbmFtZSAhPSBOVUxMLCAwKTsKKworICAgIGhGaWxlID0gQ3JlYXRlRmlsZShQSl9TVFJJTkdfVE9fTkFUSVZFKGZpbGVuYW1lLHdmaWxlbmFtZSxzaXplb2Yod2ZpbGVuYW1lKSksIAorCQkgICAgICAgQ09OVFJPTF9BQ0NFU1MsIAorCQkgICAgICAgRklMRV9TSEFSRV9SRUFELCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICAgIGlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBDbG9zZUhhbmRsZShoRmlsZSk7CisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKKworLyoKKyAqIHBqX2ZpbGVfc2l6ZSgpCisgKi8KK1BKX0RFRihwal9vZmZfdCkgcGpfZmlsZV9zaXplKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIFBKX0RFQ0xfVU5JQ09ERV9URU1QX0JVRih3ZmlsZW5hbWUsMjU2KQorICAgIEhBTkRMRSBoRmlsZTsKKyAgICBEV09SRCBzaXplTG8sIHNpemVIaTsKKyAgICBwal9vZmZfdCBzaXplOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihmaWxlbmFtZSAhPSBOVUxMLCAtMSk7CisKKyAgICBoRmlsZSA9IENyZWF0ZUZpbGUoUEpfU1RSSU5HX1RPX05BVElWRShmaWxlbmFtZSwgd2ZpbGVuYW1lLHNpemVvZih3ZmlsZW5hbWUpKSwgCisJCSAgICAgICBDT05UUk9MX0FDQ0VTUywgCisgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIE9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CisgICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzaXplTG8gPSBHZXRGaWxlU2l6ZShoRmlsZSwgJnNpemVIaSk7CisgICAgaWYgKHNpemVMbyA9PSBJTlZBTElEX0ZJTEVfU0laRSkgeworICAgICAgICBEV09SRCBkd1N0YXR1cyA9IEdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZHdTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemUgPSBzaXplSGk7CisgICAgc2l6ZSA9IChzaXplIDw8IDMyKSArIHNpemVMbzsKKworICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworCisvKgorICogcGpfZmlsZV9kZWxldGUoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2ZpbGVfZGVsZXRlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIFBKX0RFQ0xfVU5JQ09ERV9URU1QX0JVRih3ZmlsZW5hbWUsMjU2KQorCisgICAgUEpfQVNTRVJUX1JFVFVSTihmaWxlbmFtZSAhPSBOVUxMLCBQSl9FSU5WQUwpOworCisgICAgaWYgKERlbGV0ZUZpbGUoUEpfU1RSSU5HX1RPX05BVElWRShmaWxlbmFtZSx3ZmlsZW5hbWUsc2l6ZW9mKHdmaWxlbmFtZSkpKSA9PSBGQUxTRSkKKyAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihHZXRMYXN0RXJyb3IoKSk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKgorICogcGpfZmlsZV9tb3ZlKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9maWxlX21vdmUoIGNvbnN0IGNoYXIgKm9sZG5hbWUsIGNvbnN0IGNoYXIgKm5ld25hbWUpCit7CisgICAgUEpfREVDTF9VTklDT0RFX1RFTVBfQlVGKHdvbGRuYW1lLDI1NikKKyAgICBQSl9ERUNMX1VOSUNPREVfVEVNUF9CVUYod25ld25hbWUsMjU2KQorICAgIEJPT0wgcmM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG9sZG5hbWUhPU5VTEwgJiYgbmV3bmFtZSE9TlVMTCwgUEpfRUlOVkFMKTsKKworI2lmIFBKX1dJTjMyX1dJTk5UID49IDB4MDQwMAorICAgIHJjID0gTW92ZUZpbGVFeChQSl9TVFJJTkdfVE9fTkFUSVZFKG9sZG5hbWUsd29sZG5hbWUsc2l6ZW9mKHdvbGRuYW1lKSksIAorCQkgICAgUEpfU1RSSU5HX1RPX05BVElWRShuZXduYW1lLHduZXduYW1lLHNpemVvZih3bmV3bmFtZSkpLCAKKyAgICAgICAgICAgICAgICAgICAgTU9WRUZJTEVfQ09QWV9BTExPV0VEfE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcpOworI2Vsc2UKKyAgICByYyA9IE1vdmVGaWxlKFBKX1NUUklOR19UT19OQVRJVkUob2xkbmFtZSx3b2xkbmFtZSxzaXplb2Yod29sZG5hbWUpKSwgCisJCSAgUEpfU1RSSU5HX1RPX05BVElWRShuZXduYW1lLHduZXduYW1lLHNpemVvZih3bmV3bmFtZSkpKTsKKyNlbmRpZgorCisgICAgaWYgKCFyYykKKyAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihHZXRMYXN0RXJyb3IoKSk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgcGpfc3RhdHVzX3QgZmlsZV90aW1lX3RvX3RpbWVfdmFsKGNvbnN0IEZJTEVUSU1FICpmaWxlX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3RpbWVfdmFsICp0aW1lX3ZhbCkKK3sKKyAgICBGSUxFVElNRSBsb2NhbF9maWxlX3RpbWU7CisgICAgU1lTVEVNVElNRSBsb2NhbFRpbWU7CisgICAgcGpfcGFyc2VkX3RpbWUgcHQ7CisKKyAgICBpZiAoIUZpbGVUaW1lVG9Mb2NhbEZpbGVUaW1lKGZpbGVfdGltZSwgJmxvY2FsX2ZpbGVfdGltZSkpCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihHZXRMYXN0RXJyb3IoKSk7CisKKyAgICBpZiAoIUZpbGVUaW1lVG9TeXN0ZW1UaW1lKGZpbGVfdGltZSwgJmxvY2FsVGltZSkpCisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgLy9pZiAoIVN5c3RlbVRpbWVUb1R6U3BlY2lmaWNMb2NhbFRpbWUoTlVMTCwgJnN5c3RlbVRpbWUsICZsb2NhbFRpbWUpKQorICAgIC8vICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgcGpfYnplcm8oJnB0LCBzaXplb2YocHQpKTsKKyAgICBwdC55ZWFyID0gbG9jYWxUaW1lLndZZWFyOworICAgIHB0Lm1vbiA9IGxvY2FsVGltZS53TW9udGgtMTsKKyAgICBwdC5kYXkgPSBsb2NhbFRpbWUud0RheTsKKyAgICBwdC53ZGF5ID0gbG9jYWxUaW1lLndEYXlPZldlZWs7CisKKyAgICBwdC5ob3VyID0gbG9jYWxUaW1lLndIb3VyOworICAgIHB0Lm1pbiA9IGxvY2FsVGltZS53TWludXRlOworICAgIHB0LnNlYyA9IGxvY2FsVGltZS53U2Vjb25kOworICAgIHB0Lm1zZWMgPSBsb2NhbFRpbWUud01pbGxpc2Vjb25kczsKKworICAgIHJldHVybiBwal90aW1lX2VuY29kZSgmcHQsIHRpbWVfdmFsKTsKK30KKworLyoKKyAqIHBqX2ZpbGVfZ2V0c3RhdCgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZmlsZV9nZXRzdGF0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBwal9maWxlX3N0YXQgKnN0YXQpCit7CisgICAgUEpfREVDTF9VTklDT0RFX1RFTVBfQlVGKHdmaWxlbmFtZSwyNTYpCisgICAgSEFORExFIGhGaWxlOworICAgIERXT1JEIHNpemVMbywgc2l6ZUhpOworICAgIEZJTEVUSU1FIGNyZWF0aW9uVGltZSwgYWNjZXNzVGltZSwgd3JpdGVUaW1lOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihmaWxlbmFtZSE9TlVMTCAmJiBzdGF0IT1OVUxMLCBQSl9FSU5WQUwpOworCisgICAgaEZpbGUgPSBDcmVhdGVGaWxlKFBKX1NUUklOR19UT19OQVRJVkUoZmlsZW5hbWUsd2ZpbGVuYW1lLHNpemVvZih3ZmlsZW5hbWUpKSwgCisJCSAgICAgICBDT05UUk9MX0FDQ0VTUywgCisJCSAgICAgICBGSUxFX1NIQVJFX1JFQUQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIE9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CisgICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKKworICAgIHNpemVMbyA9IEdldEZpbGVTaXplKGhGaWxlLCAmc2l6ZUhpKTsKKyAgICBpZiAoc2l6ZUxvID09IElOVkFMSURfRklMRV9TSVpFKSB7CisgICAgICAgIERXT1JEIGR3U3RhdHVzID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChkd1N0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOworICAgICAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihkd1N0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0LT5zaXplID0gc2l6ZUhpOworICAgIHN0YXQtPnNpemUgPSAoc3RhdC0+c2l6ZSA8PCAzMikgKyBzaXplTG87CisKKyAgICBpZiAoR2V0RmlsZVRpbWUoaEZpbGUsICZjcmVhdGlvblRpbWUsICZhY2Nlc3NUaW1lLCAmd3JpdGVUaW1lKT09RkFMU0UpIHsKKyAgICAgICAgRFdPUkQgZHdTdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOworICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKGR3U3RhdHVzKTsKKyAgICB9CisKKyAgICBDbG9zZUhhbmRsZShoRmlsZSk7CisKKyAgICBpZiAoZmlsZV90aW1lX3RvX3RpbWVfdmFsKCZjcmVhdGlvblRpbWUsICZzdGF0LT5jdGltZSkgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihHZXRMYXN0RXJyb3IoKSk7CisKKyAgICBmaWxlX3RpbWVfdG9fdGltZV92YWwoJmFjY2Vzc1RpbWUsICZzdGF0LT5hdGltZSk7CisgICAgZmlsZV90aW1lX3RvX3RpbWVfdmFsKCZ3cml0ZVRpbWUsICZzdGF0LT5tdGltZSk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9maWxlX2lvX2Fuc2kuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZmlsZV9pb19hbnNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3ZDQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZmlsZV9pb19hbnNpLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qICRJZDogZmlsZV9pb19hbnNpLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9maWxlX2lvLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZmlsZV9vcGVuKCBwal9wb29sX3QgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX29zaGFuZGxlX3QgKmZkKQoreworICAgIGNoYXIgbW9kZVs4XTsKKyAgICBjaGFyICpwID0gbW9kZTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocGF0aG5hbWUgJiYgZmQsIFBKX0VJTlZBTCk7CisgICAgUEpfVU5VU0VEX0FSRyhwb29sKTsKKworICAgIGlmICgoZmxhZ3MgJiBQSl9PX0FQUEVORCkgPT0gUEpfT19BUFBFTkQpIHsKKyAgICAgICAgaWYgKChmbGFncyAmIFBKX09fV1JPTkxZKSA9PSBQSl9PX1dST05MWSkgeworICAgICAgICAgICAgKnArKyA9ICdhJzsKKyAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQSl9PX1JET05MWSkgPT0gUEpfT19SRE9OTFkpCisgICAgICAgICAgICAgICAgKnArKyA9ICcrJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgaW52YWxpZC4KKyAgICAgICAgICAgICAqIENhbiBub3Qgc3BlY2lmeSBQSl9PX1JET05MWSB3aXRoIFBKX09fQVBQRU5EISAKKyAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChmbGFncyAmIFBKX09fUkRPTkxZKSA9PSBQSl9PX1JET05MWSkgeworICAgICAgICAgICAgKnArKyA9ICdyJzsKKyAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQSl9PX1dST05MWSkgPT0gUEpfT19XUk9OTFkpCisgICAgICAgICAgICAgICAgKnArKyA9ICcrJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwKysgPSAndyc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocD09bW9kZSkKKyAgICAgICAgcmV0dXJuIFBKX0VJTlZBTDsKKworICAgICpwKysgPSAnYic7CisgICAgKnArKyA9ICdcMCc7CisKKyAgICAqZmQgPSBmb3BlbihwYXRobmFtZSwgbW9kZSk7CisgICAgaWYgKCpmZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKGVycm5vKTsKKyAgICAKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9maWxlX2Nsb3NlKHBqX29zaGFuZGxlX3QgZmQpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihmZCwgUEpfRUlOVkFMKTsKKyAgICBpZiAoZmNsb3NlKChGSUxFKilmZCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihlcnJubyk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9maWxlX3dyaXRlKCBwal9vc2hhbmRsZV90IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zc2l6ZV90ICpzaXplKQoreworICAgIHNpemVfdCB3cml0dGVuOworCisgICAgY2xlYXJlcnIoKEZJTEUqKWZkKTsKKyAgICB3cml0dGVuID0gZndyaXRlKGRhdGEsIDEsICpzaXplLCAoRklMRSopZmQpOworICAgIGlmIChmZXJyb3IoKEZJTEUqKWZkKSkgeworICAgICAgICAqc2l6ZSA9IC0xOworICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKGVycm5vKTsKKyAgICB9CisKKyAgICAqc2l6ZSA9IHdyaXR0ZW47CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZmlsZV9yZWFkKCBwal9vc2hhbmRsZV90IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc3NpemVfdCAqc2l6ZSkKK3sKKyAgICBzaXplX3QgYnl0ZXM7CisKKyAgICBjbGVhcmVycigoRklMRSopZmQpOworICAgIGJ5dGVzID0gZnJlYWQoZGF0YSwgMSwgKnNpemUsIChGSUxFKilmZCk7CisgICAgaWYgKGZlcnJvcigoRklMRSopZmQpKSB7CisgICAgICAgICpzaXplID0gLTE7CisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZXJybm8pOworICAgIH0KKworICAgICpzaXplID0gYnl0ZXM7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCitQSl9ERUYocGpfYm9vbF90KSBwal9maWxlX2VvZihwal9vc2hhbmRsZV90IGZkLCBlbnVtIHBqX2ZpbGVfYWNjZXNzIGFjY2VzcykKK3sKKyAgICBQSl9VTlVTRURfQVJHKGFjY2Vzcyk7CisgICAgcmV0dXJuIGZlb2YoKEZJTEUqKWZkKSA/IFBKX1RSVUUgOiAwOworfQorKi8KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9maWxlX3NldHBvcyggcGpfb3NoYW5kbGVfdCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX29mZl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcGpfZmlsZV9zZWVrX3R5cGUgd2hlbmNlKQoreworICAgIGludCBtb2RlOworCisgICAgc3dpdGNoICh3aGVuY2UpIHsKKyAgICBjYXNlIFBKX1NFRUtfU0VUOgorICAgICAgICBtb2RlID0gU0VFS19TRVQ7IGJyZWFrOworICAgIGNhc2UgUEpfU0VFS19DVVI6CisgICAgICAgIG1vZGUgPSBTRUVLX0NVUjsgYnJlYWs7CisgICAgY2FzZSBQSl9TRUVLX0VORDoKKyAgICAgICAgbW9kZSA9IFNFRUtfRU5EOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwal9hc3NlcnQoISJJbnZhbGlkIHdoZW5jZSBpbiBmaWxlX3NldHBvcyIpOworICAgICAgICByZXR1cm4gUEpfRUlOVkFMOworICAgIH0KKworICAgIGlmIChmc2VlaygoRklMRSopZmQsIChsb25nKW9mZnNldCwgbW9kZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihlcnJubyk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9maWxlX2dldHBvcyggcGpfb3NoYW5kbGVfdCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX29mZl90ICpwb3MpCit7CisgICAgbG9uZyBvZmZzZXQ7CisKKyAgICBvZmZzZXQgPSBmdGVsbCgoRklMRSopZmQpOworICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICAgICAgKnBvcyA9IC0xOworICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKGVycm5vKTsKKyAgICB9CisKKyAgICAqcG9zID0gb2Zmc2V0OworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2ZpbGVfZmx1c2gocGpfb3NoYW5kbGVfdCBmZCkKK3sKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IGZmbHVzaCgoRklMRSopZmQpOworICAgIGlmIChyYyA9PSBFT0YpIHsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKGVycm5vKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZmlsZV9pb193aW4zMi5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9maWxlX2lvX3dpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3MmU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZmlsZV9pb193aW4zMi5jCkBAIC0wLDAgKzEsMjQwIEBACisvKiAkSWQ6IGZpbGVfaW9fd2luMzIuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9maWxlX2lvLmg+CisjaW5jbHVkZSA8cGovdW5pY29kZS5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpZm5kZWYgSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSCisjICAgZGVmaW5lIElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUiAgICAgKChEV09SRCktMSkKKyNlbmRpZgorCisvKioKKyAqIENoZWNrIGZvciBlbmQtb2YtZmlsZSBjb25kaXRpb24gb24gdGhlIHNwZWNpZmllZCBkZXNjcmlwdG9yLgorICoKKyAqIEBwYXJhbSBmZCAgICAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKiBAcGFyYW0gYWNjZXNzICAgICAgICBUaGUgZGVzaXJlZCBhY2Nlc3MuCisgKgorICogQHJldHVybiAgICAgICAgICAgICAgTm9uLXplcm8gaWYgZmlsZSBpcyBFT0YuCisgKi8KK1BKX0RFQ0wocGpfYm9vbF90KSBwal9maWxlX2VvZihwal9vc2hhbmRsZV90IGZkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHBqX2ZpbGVfYWNjZXNzIGFjY2Vzcyk7CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9maWxlX29wZW4oIHBqX3Bvb2xfdCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfb3NoYW5kbGVfdCAqZmQpCit7CisgICAgUEpfREVDTF9VTklDT0RFX1RFTVBfQlVGKHdwYXRobmFtZSwyNTYpCisgICAgSEFORExFIGhGaWxlOworICAgIERXT1JEIGR3RGVzaXJlZEFjY2VzcyA9IDA7CisgICAgRFdPUkQgZHdTaGFyZU1vZGUgPSAwOworICAgIERXT1JEIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IDA7CisgICAgRFdPUkQgZHdGbGFnc0FuZEF0dHJpYnV0ZXMgPSAwOworCisgICAgUEpfVU5VU0VEX0FSRyhwb29sKTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocGF0aG5hbWUhPU5VTEwsIFBKX0VJTlZBTCk7CisKKyAgICBpZiAoKGZsYWdzICYgUEpfT19XUk9OTFkpID09IFBKX09fV1JPTkxZKSB7CisgICAgICAgIGR3RGVzaXJlZEFjY2VzcyB8PSBHRU5FUklDX1dSSVRFOworICAgICAgICBpZiAoKGZsYWdzICYgUEpfT19BUFBFTkQpID09IFBKX09fQVBQRU5EKSB7CisjaWYgIWRlZmluZWQoUEpfV0lOMzJfV0lOQ0UpIHx8ICFQSl9XSU4zMl9XSU5DRQorCSAgICAvKiBGSUxFX0FQUEVORF9EQVRBIGlzIGludmFsaWQgb24gV00yMDAzIGFuZCBXTTUsIGJ1dCBpdCBzZWVtcworCSAgICAgKiB0byBiZSB3b3JraW5nIG9uIFdNNi4gQWxsIGFyZSB0ZXN0ZWQgb24gZW11bGF0b3IgdGhvdWdoLgorCSAgICAgKiBSZW1vdmluZyB0aGlzIGFsc28gc2VlbSB0byB3b3JrIChpLmUuIGRhdGEgaXMgYXBwZW5kZWQpLCBzbworCSAgICAgKiBJIGd1ZXNzIHRoaXMgZmxhZyBpcyAib3B0aW9uYWwiLgorCSAgICAgKiBTZWUgaHR0cDovL3RyYWMucGpzaXAub3JnL3JlcG9zL3RpY2tldC84MjUKKwkgICAgICovCisgICAgICAgICAgICBkd0Rlc2lyZWRBY2Nlc3MgfD0gRklMRV9BUFBFTkRfREFUQTsKKyNlbmRpZgorCSAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24gfD0gT1BFTl9BTFdBWVM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkd0Rlc2lyZWRBY2Nlc3MgJj0gfihGSUxFX0FQUEVORF9EQVRBKTsKKyAgICAgICAgICAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiB8PSBDUkVBVEVfQUxXQVlTOworICAgICAgICB9CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiBQSl9PX1JET05MWSkgPT0gUEpfT19SRE9OTFkpIHsKKyAgICAgICAgZHdEZXNpcmVkQWNjZXNzIHw9IEdFTkVSSUNfUkVBRDsKKyAgICAgICAgaWYgKGZsYWdzID09IFBKX09fUkRPTkxZKQorICAgICAgICAgICAgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uIHw9IE9QRU5fRVhJU1RJTkc7CisgICAgfQorCisgICAgaWYgKGR3RGVzaXJlZEFjY2VzcyA9PSAwKSB7CisgICAgICAgIHBqX2Fzc2VydCghIkludmFsaWQgZmlsZSBvcGVuIGZsYWdzIik7CisgICAgICAgIHJldHVybiBQSl9FSU5WQUw7CisgICAgfQorCisgICAgZHdTaGFyZU1vZGUgPSBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFOworICAgIGR3RmxhZ3NBbmRBdHRyaWJ1dGVzID0gRklMRV9BVFRSSUJVVEVfTk9STUFMOworCisgICAgaEZpbGUgPSBDcmVhdGVGaWxlKFBKX1NUUklOR19UT19OQVRJVkUocGF0aG5hbWUsd3BhdGhuYW1lLHNpemVvZih3cGF0aG5hbWUpKSwgCisJCSAgICAgICBkd0Rlc2lyZWRBY2Nlc3MsIGR3U2hhcmVNb2RlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24sIGR3RmxhZ3NBbmRBdHRyaWJ1dGVzLCBOVUxMKTsKKyAgICBpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgKmZkID0gMDsKKyAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihHZXRMYXN0RXJyb3IoKSk7CisgICAgfQorCisgICAgaWYgKChmbGFncyAmIFBKX09fQVBQRU5EKSA9PSBQSl9PX0FQUEVORCkgeworCXBqX3N0YXR1c190IHN0YXR1czsKKworCXN0YXR1cyA9IHBqX2ZpbGVfc2V0cG9zKGhGaWxlLCAwLCBQSl9TRUVLX0VORCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHBqX2ZpbGVfY2xvc2UoaEZpbGUpOworCSAgICByZXR1cm4gc3RhdHVzOworCX0KKyAgICB9CisKKyAgICAqZmQgPSBoRmlsZTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9maWxlX2Nsb3NlKHBqX29zaGFuZGxlX3QgZmQpCit7CisgICAgaWYgKENsb3NlSGFuZGxlKGZkKT09MCkKKyAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihHZXRMYXN0RXJyb3IoKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZmlsZV93cml0ZSggcGpfb3NoYW5kbGVfdCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc3NpemVfdCAqc2l6ZSkKK3sKKyAgICBCT09MIHJjOworICAgIERXT1JEIGJ5dGVzV3JpdHRlbjsKKworICAgIHJjID0gV3JpdGVGaWxlKGZkLCBkYXRhLCAoRFdPUkQpKnNpemUsICZieXRlc1dyaXR0ZW4sIE5VTEwpOworICAgIGlmICghcmMpIHsKKyAgICAgICAgKnNpemUgPSAtMTsKKyAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihHZXRMYXN0RXJyb3IoKSk7CisgICAgfQorCisgICAgKnNpemUgPSBieXRlc1dyaXR0ZW47CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZmlsZV9yZWFkKCBwal9vc2hhbmRsZV90IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc3NpemVfdCAqc2l6ZSkKK3sKKyAgICBCT09MIHJjOworICAgIERXT1JEIGJ5dGVzUmVhZDsKKworICAgIHJjID0gUmVhZEZpbGUoZmQsIGRhdGEsIChEV09SRCkqc2l6ZSwgJmJ5dGVzUmVhZCwgTlVMTCk7CisgICAgaWYgKCFyYykgeworICAgICAgICAqc2l6ZSA9IC0xOworICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKKyAgICB9CisKKyAgICAqc2l6ZSA9IGJ5dGVzUmVhZDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKK1BKX0RFRihwal9ib29sX3QpIHBqX2ZpbGVfZW9mKHBqX29zaGFuZGxlX3QgZmQsIGVudW0gcGpfZmlsZV9hY2Nlc3MgYWNjZXNzKQoreworICAgIEJPT0wgcmM7CisgICAgRFdPUkQgZHVtbXkgPSAwLCBieXRlczsKKyAgICBEV09SRCBkd1N0YXR1czsKKworICAgIGlmICgoYWNjZXNzICYgUEpfT19SRE9OTFkpID09IFBKX09fUkRPTkxZKSB7CisgICAgICAgIHJjID0gUmVhZEZpbGUoZmQsICZkdW1teSwgMCwgJmJ5dGVzLCBOVUxMKTsKKyAgICB9IGVsc2UgaWYgKChhY2Nlc3MgJiBQSl9PX1dST05MWSkgPT0gUEpfT19XUk9OTFkpIHsKKyAgICAgICAgcmMgPSBXcml0ZUZpbGUoZmQsICZkdW1teSwgMCwgJmJ5dGVzLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwal9hc3NlcnQoISJJbnZhbGlkIGFjY2VzcyIpOworICAgICAgICByZXR1cm4gUEpfVFJVRTsKKyAgICB9CisKKyAgICBkd1N0YXR1cyA9IEdldExhc3RFcnJvcigpOworICAgIGlmIChkd1N0YXR1cz09RVJST1JfSEFORExFX0VPRikKKyAgICAgICAgcmV0dXJuIFBKX1RSVUU7CisKKyAgICByZXR1cm4gMDsKK30KKyovCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZmlsZV9zZXRwb3MoIHBqX29zaGFuZGxlX3QgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9vZmZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHBqX2ZpbGVfc2Vla190eXBlIHdoZW5jZSkKK3sKKyAgICBEV09SRCBkd01vdmVNZXRob2Q7CisgICAgRFdPUkQgZHdOZXdQb3M7CisgICAgTE9ORyAgaGkzMjsKKworICAgIGlmICh3aGVuY2UgPT0gUEpfU0VFS19TRVQpCisgICAgICAgIGR3TW92ZU1ldGhvZCA9IEZJTEVfQkVHSU47CisgICAgZWxzZSBpZiAod2hlbmNlID09IFBKX1NFRUtfQ1VSKQorICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0NVUlJFTlQ7CisgICAgZWxzZSBpZiAod2hlbmNlID09IFBKX1NFRUtfRU5EKQorICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0VORDsKKyAgICBlbHNlIHsKKyAgICAgICAgcGpfYXNzZXJ0KCEiSW52YWxpZCB3aGVuY2UgaW4gZmlsZV9zZXRwb3MiKTsKKyAgICAgICAgcmV0dXJuIFBKX0VJTlZBTDsKKyAgICB9CisKKyAgICBoaTMyID0gKExPTkcpKG9mZnNldCA+PiAzMik7CisgICAgZHdOZXdQb3MgPSBTZXRGaWxlUG9pbnRlcihmZCwgKGxvbmcpb2Zmc2V0LCAmaGkzMiwgZHdNb3ZlTWV0aG9kKTsKKyAgICBpZiAoZHdOZXdQb3MgPT0gKERXT1JEKUlOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUikgeworICAgICAgICBEV09SRCBkd1N0YXR1cyA9IEdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZHdTdGF0dXMgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZHdTdGF0dXMpOworICAgICAgICAvKiBkd05ld1BvcyBhY3R1YWxseSBpcyBub3QgYW4gZXJyb3IuICovCisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZmlsZV9nZXRwb3MoIHBqX29zaGFuZGxlX3QgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9vZmZfdCAqcG9zKQoreworICAgIExPTkcgaGkzMiA9IDA7CisgICAgRFdPUkQgbG8zMjsKKworICAgIGxvMzIgPSBTZXRGaWxlUG9pbnRlcihmZCwgMCwgJmhpMzIsIEZJTEVfQ1VSUkVOVCk7CisgICAgaWYgKGxvMzIgPT0gKERXT1JEKUlOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUikgeworICAgICAgICBEV09SRCBkd1N0YXR1cyA9IEdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZHdTdGF0dXMgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZHdTdGF0dXMpOworICAgIH0KKworICAgICpwb3MgPSBoaTMyOworICAgICpwb3MgPSAoKnBvcyA8PCAzMikgKyBsbzMyOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2ZpbGVfZmx1c2gocGpfb3NoYW5kbGVfdCBmZCkKK3sKKyAgICBCT09MIHJjOworCisgICAgcmMgPSBGbHVzaEZpbGVCdWZmZXJzKGZkKTsKKworICAgIGlmICghcmMpIHsKKwlEV09SRCBkd1N0YXR1cyA9IEdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZHdTdGF0dXMgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZHdTdGF0dXMpOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9ndWlkLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2d1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI2YzM3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9ndWlkLmMKQEAgLTAsMCArMSw0OCBAQAorLyogJElkOiBndWlkLmMgNDIwOCAyMDEyLTA3LTE4IDA3OjUyOjMzWiBtaW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovY3R5cGUuaD4KKyNpbmNsdWRlIDxwai9ndWlkLmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorCitQSl9ERUYocGpfc3RyX3QqKSBwal9nZW5lcmF0ZV91bmlxdWVfc3RyaW5nX2xvd2VyKHBqX3N0cl90ICpzdHIpCit7CisgICAgaW50IGk7CisKKyAgICBwal9nZW5lcmF0ZV91bmlxdWVfc3RyaW5nKHN0cik7CisgICAgZm9yIChpID0gMDsgaSA8IHN0ci0+c2xlbjsgaSsrKQorCXN0ci0+cHRyW2ldID0gKGNoYXIpcGpfdG9sb3dlcihzdHItPnB0cltpXSk7CisKKyAgICByZXR1cm4gc3RyOworfQorCitQSl9ERUYodm9pZCkgcGpfY3JlYXRlX3VuaXF1ZV9zdHJpbmcocGpfcG9vbF90ICpwb29sLCBwal9zdHJfdCAqc3RyKQoreworICAgIHN0ci0+cHRyID0gKGNoYXIqKXBqX3Bvb2xfYWxsb2MocG9vbCwgUEpfR1VJRF9TVFJJTkdfTEVOR1RIKTsKKyAgICBwal9nZW5lcmF0ZV91bmlxdWVfc3RyaW5nKHN0cik7Cit9CisKK1BKX0RFRih2b2lkKSBwal9jcmVhdGVfdW5pcXVlX3N0cmluZ19sb3dlcihwal9wb29sX3QgKnBvb2wsIHBqX3N0cl90ICpzdHIpCit7CisgICAgaW50IGk7CisKKyAgICBwal9jcmVhdGVfdW5pcXVlX3N0cmluZyhwb29sLCBzdHIpOworICAgIGZvciAoaSA9IDA7IGkgPCBzdHItPnNsZW47IGkrKykKKwlzdHItPnB0cltpXSA9IChjaGFyKXBqX3RvbG93ZXIoc3RyLT5wdHJbaV0pOworfQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9ndWlkX3NpbXBsZS5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9ndWlkX3NpbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZjhhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2d1aWRfc2ltcGxlLmMKQEAgLTAsMCArMSw4MSBAQAorLyogJElkOiBndWlkX3NpbXBsZS5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovZ3VpZC5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL3JhbmQuaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorCitQSl9ERUZfREFUQShjb25zdCB1bnNpZ25lZCkgUEpfR1VJRF9TVFJJTkdfTEVOR1RIPTMyOworCitzdGF0aWMgY2hhciBndWlkX2NoYXJzWzY0XTsKKworUEpfREVGKHVuc2lnbmVkKSBwal9HVUlEX1NUUklOR19MRU5HVEgoKQoreworICAgIHJldHVybiBQSl9HVUlEX1NUUklOR19MRU5HVEg7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfZ3VpZF9jaGFycyh2b2lkKQoreworICAgIGNoYXIgKnAgPSBndWlkX2NoYXJzOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBmb3IgKGk9MDsgaTwxMDsgKytpKQorCSpwKysgPSAnMCcraTsKKworICAgIGZvciAoaT0wOyBpPDI2OyArK2kpIHsKKwkqcCsrID0gJ2EnK2k7CisJKnArKyA9ICdBJytpOworICAgIH0KKworICAgICpwKysgPSAnLSc7CisgICAgKnArKyA9ICcuJzsKK30KKworUEpfREVGKHBqX3N0cl90KikgcGpfZ2VuZXJhdGVfdW5pcXVlX3N0cmluZyhwal9zdHJfdCAqc3RyKQoreworICAgIGNoYXIgKnAsICplbmQ7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgaWYgKGd1aWRfY2hhcnNbMF0gPT0gJ1wwJykgeworCXBqX2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oKTsKKwlpZiAoZ3VpZF9jaGFyc1swXSA9PSAnXDAnKSB7CisJICAgIGluaXRfZ3VpZF9jaGFycygpOworCX0KKwlwal9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgfQorCisgICAgLyogVGhpcyB3b3VsZCBvbmx5IHdvcmsgaWYgUEpfR1VJRF9TVFJJTkdfTEVOR1RIIGlzIG11bHRpcGxlIG9mIDIgYnl0ZXMgKi8KKyAgICBwal9hc3NlcnQoUEpfR1VJRF9TVFJJTkdfTEVOR1RIICUgMiA9PSAwKTsKKworICAgIGZvciAocD1zdHItPnB0ciwgZW5kPXArUEpfR1VJRF9TVFJJTkdfTEVOR1RIOyBwPGVuZDsgKSB7CisJcGpfdWludDMyX3QgcmFuZF92YWwgPSBwal9yYW5kKCk7CisJcGpfdWludDMyX3QgcmFuZF9pZHggPSBSQU5EX01BWDsKKworCWZvciAoIDsgcmFuZF9pZHg+MCAmJiBwPGVuZDsgcmFuZF9pZHg+Pj04LCByYW5kX3ZhbD4+PTgsIHArKykgeworCSAgICAqcCA9IGd1aWRfY2hhcnNbKHJhbmRfdmFsICYgMHhGRikgJiA2M107CisJfQorICAgIH0KKworICAgIHN0ci0+c2xlbiA9IFBKX0dVSURfU1RSSU5HX0xFTkdUSDsKKyAgICByZXR1cm4gc3RyOworfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2d1aWRfdXVpZC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9ndWlkX3V1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODUwYmVkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9ndWlkX3V1aWQuYwpAQCAtMCwwICsxLDUzIEBACisvKiAkSWQ6IGd1aWRfdXVpZC5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovZ3VpZC5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworI2luY2x1ZGUgPHV1aWQvdXVpZC5oPgorCitQSl9ERUZfREFUQShjb25zdCB1bnNpZ25lZCkgUEpfR1VJRF9TVFJJTkdfTEVOR1RIPTM2OworCitQSl9ERUYodW5zaWduZWQpIHBqX0dVSURfU1RSSU5HX0xFTkdUSCgpCit7CisgICAgcmV0dXJuIFBKX0dVSURfU1RSSU5HX0xFTkdUSDsKK30KKworUEpfREVGKHBqX3N0cl90KikgcGpfZ2VuZXJhdGVfdW5pcXVlX3N0cmluZyhwal9zdHJfdCAqc3RyKQoreworICAgIGVudW0ge0dVSURfTEVOID0gMzZ9OworICAgIGNoYXIgc2d1aWRbR1VJRF9MRU4gKyAxXTsKKyAgICB1dWlkX3QgdXVpZCA9IHswfTsKKyAgICAKKyAgICBQSl9BU1NFUlRfUkVUVVJOKEdVSURfTEVOIDw9IFBKX0dVSURfU1RSSU5HX0xFTkdUSCwgTlVMTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdHItPnB0ciAhPSBOVUxMLCBOVUxMKTsKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIAorICAgIHV1aWRfZ2VuZXJhdGUodXVpZCk7CisgICAgdXVpZF91bnBhcnNlKHV1aWQsIHNndWlkKTsKKyAgICAKKyAgICBwal9tZW1jcHkoc3RyLT5wdHIsIHNndWlkLCBHVUlEX0xFTik7CisgICAgc3RyLT5zbGVuID0gR1VJRF9MRU47CisKKyAgICByZXR1cm4gc3RyOworfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2d1aWRfd2luMzIuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovZ3VpZF93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGZjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2d1aWRfd2luMzIuYwpAQCAtMCwwICsxLDcyIEBACisvKiAkSWQ6IGd1aWRfd2luMzIuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2d1aWQuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9zb2NrLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG9iamJhc2UuaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorCisKK1BKX0RFRl9EQVRBKGNvbnN0IHVuc2lnbmVkKSBQSl9HVUlEX1NUUklOR19MRU5HVEg9MzI7CisKK1BKX0RFRih1bnNpZ25lZCkgcGpfR1VJRF9TVFJJTkdfTEVOR1RIKCkKK3sKKyAgICByZXR1cm4gUEpfR1VJRF9TVFJJTkdfTEVOR1RIOworfQorCitQSl9JTkxJTkUodm9pZCkgaGV4MmRpZ2l0KHVuc2lnbmVkIHZhbHVlLCBjaGFyICpwKQoreworICAgIHN0YXRpYyBjaGFyIGhleFtdID0geycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLAorCQkJICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnIH07CisgICAgKnArKyA9IGhleFsgKHZhbHVlICYgMHhGMCkgPj4gNCBdOworICAgICpwKysgPSBoZXhbICh2YWx1ZSAmIDB4MEYpIF07Cit9CisKK3N0YXRpYyB2b2lkIGd1aWRfdG9fc3RyKCBHVUlEICpndWlkLCBwal9zdHJfdCAqc3RyICkKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilndWlkOworICAgIGNoYXIgKmRzdCA9IHN0ci0+cHRyOworCisgICAgZ3VpZC0+RGF0YTEgPSBwal9udG9obChndWlkLT5EYXRhMSk7CisgICAgZ3VpZC0+RGF0YTIgPSBwal9udG9ocyhndWlkLT5EYXRhMik7CisgICAgZ3VpZC0+RGF0YTMgPSBwal9udG9ocyhndWlkLT5EYXRhMyk7CisKKyAgICBmb3IgKGk9MDsgaTwxNjsgKytpKSB7CisJaGV4MmRpZ2l0KCAqc3JjLCBkc3QgKTsKKwlkc3QgKz0gMjsKKwkrK3NyYzsKKyAgICB9CisgICAgc3RyLT5zbGVuID0gMzI7Cit9CisKKworUEpfREVGKHBqX3N0cl90KikgcGpfZ2VuZXJhdGVfdW5pcXVlX3N0cmluZyhwal9zdHJfdCAqc3RyKQoreworICAgIEdVSUQgZ3VpZDsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBDb0NyZWF0ZUd1aWQoJmd1aWQpOworICAgIGd1aWRfdG9fc3RyKCAmZ3VpZCwgc3RyICk7CisgICAgcmV0dXJuIHN0cjsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9oYXNoLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjU4ZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9oYXNoLmMKQEAgLTAsMCArMSwzNzggQEAKKy8qICRJZDogaGFzaC5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2hhc2guaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9jdHlwZS5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorCisvKioKKyAqIFRoZSBoYXNoIG11bHRpcGxpZXIgdXNlZCB0byBjYWxjdWxhdGUgaGFzaCB2YWx1ZS4KKyAqLworI2RlZmluZSBQSl9IQVNIX01VTFRJUExJRVIJMzMKKworCitzdHJ1Y3QgcGpfaGFzaF9lbnRyeQoreworICAgIHN0cnVjdCBwal9oYXNoX2VudHJ5ICpuZXh0OworICAgIHZvaWQgKmtleTsKKyAgICBwal91aW50MzJfdCBoYXNoOworICAgIHBqX3VpbnQzMl90IGtleWxlbjsKKyAgICB2b2lkICp2YWx1ZTsKK307CisKKworc3RydWN0IHBqX2hhc2hfdGFibGVfdAoreworICAgIHBqX2hhc2hfZW50cnkgICAgICoqdGFibGU7CisgICAgdW5zaWduZWQJCWNvdW50LCByb3dzOworICAgIHBqX2hhc2hfaXRlcmF0b3JfdAlpdGVyYXRvcjsKK307CisKKworCitQSl9ERUYocGpfdWludDMyX3QpIHBqX2hhc2hfY2FsYyhwal91aW50MzJfdCBoYXNoLCBjb25zdCB2b2lkICprZXksIAorCQkJCSB1bnNpZ25lZCBrZXlsZW4pCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIGlmIChrZXlsZW49PVBKX0hBU0hfS0VZX1NUUklORykgeworCWNvbnN0IHBqX3VpbnQ4X3QgKnAgPSAoY29uc3QgcGpfdWludDhfdCopa2V5OworCWZvciAoIDsgKnA7ICsrcCApIHsKKwkgICAgaGFzaCA9IChoYXNoICogUEpfSEFTSF9NVUxUSVBMSUVSKSArICpwOworCX0KKyAgICB9IGVsc2UgeworCWNvbnN0IHBqX3VpbnQ4X3QgKnAgPSAoY29uc3QgcGpfdWludDhfdCopa2V5LAorCQkJICAgICAgKmVuZCA9IHAgKyBrZXlsZW47CisJZm9yICggOyBwIT1lbmQ7ICsrcCkgeworCSAgICBoYXNoID0gKGhhc2ggKiBQSl9IQVNIX01VTFRJUExJRVIpICsgKnA7CisJfQorICAgIH0KKyAgICByZXR1cm4gaGFzaDsKK30KKworUEpfREVGKHBqX3VpbnQzMl90KSBwal9oYXNoX2NhbGNfdG9sb3dlciggcGpfdWludDMyX3QgaHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX3N0cl90ICprZXkpCit7CisgICAgbG9uZyBpOworCisjaWYgZGVmaW5lZChQSl9IQVNIX1VTRV9PV05fVE9MT1dFUikgJiYgUEpfSEFTSF9VU0VfT1dOX1RPTE9XRVIgIT0gMAorICAgIGZvciAoaT0wOyBpPGtleS0+c2xlbjsgKytpKSB7CisJcGpfdWludDhfdCBjID0ga2V5LT5wdHJbaV07CisgICAgICAgIGNoYXIgbG93ZXI7CisJaWYgKGMgJiA2NCkKKwkgICAgbG93ZXIgPSAoY2hhcikoYyB8IDMyKTsKKwllbHNlCisJICAgIGxvd2VyID0gKGNoYXIpYzsKKwlpZiAocmVzdWx0KQorICAgICAgICAgICAgcmVzdWx0W2ldID0gbG93ZXI7CisJaHZhbCA9IGh2YWwgKiBQSl9IQVNIX01VTFRJUExJRVIgKyBsb3dlcjsKKyAgICB9CisjZWxzZQorICAgIGZvciAoaT0wOyBpPGtleS0+c2xlbjsgKytpKSB7CisgICAgICAgIGNoYXIgbG93ZXIgPSAoY2hhcilwal90b2xvd2VyKGtleS0+cHRyW2ldKTsKKwlpZiAocmVzdWx0KQorICAgICAgICAgICAgcmVzdWx0W2ldID0gbG93ZXI7CisJaHZhbCA9IGh2YWwgKiBQSl9IQVNIX01VTFRJUExJRVIgKyBsb3dlcjsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBodmFsOworfQorCisKK1BKX0RFRihwal9oYXNoX3RhYmxlX3QqKSBwal9oYXNoX2NyZWF0ZShwal9wb29sX3QgKnBvb2wsIHVuc2lnbmVkIHNpemUpCit7CisgICAgcGpfaGFzaF90YWJsZV90ICpoOworICAgIHVuc2lnbmVkIHRhYmxlX3NpemU7CisgICAgCisgICAgLyogQ2hlY2sgdGhhdCBQSl9IQVNIX0VOVFJZX0JVRl9TSVpFIGlzIGNvcnJlY3QuICovCisgICAgUEpfQVNTRVJUX1JFVFVSTihzaXplb2YocGpfaGFzaF9lbnRyeSk8PVBKX0hBU0hfRU5UUllfQlVGX1NJWkUsIE5VTEwpOworCisgICAgaCA9IFBKX1BPT0xfQUxMT0NfVChwb29sLCBwal9oYXNoX3RhYmxlX3QpOworICAgIGgtPmNvdW50ID0gMDsKKworICAgIFBKX0xPRyggNiwgKCJoYXNodGJsIiwgImhhc2ggdGFibGUgJXAgY3JlYXRlZCBmcm9tIHBvb2wgJXMiLCBoLCBwal9wb29sX2dldG9iam5hbWUocG9vbCkpKTsKKworICAgIC8qIHNpemUgbXVzdCBiZSAyXm4gLSAxLgorICAgICAgIHJvdW5kLXVwIHRoZSBzaXplIHRvIHRoaXMgcnVsZSwgZXhjZXB0IHdoZW4gc2l6ZSBpcyAyXm4sIHRoZW4gc2l6ZQorICAgICAgIHdpbGwgYmUgcm91bmQtZG93biB0byAyXm4tMS4KKyAgICAgKi8KKyAgICB0YWJsZV9zaXplID0gODsKKyAgICBkbyB7CisJdGFibGVfc2l6ZSA8PD0gMTsgICAgCisgICAgfSB3aGlsZSAodGFibGVfc2l6ZSA8IHNpemUpOworICAgIHRhYmxlX3NpemUgLT0gMTsKKyAgICAKKyAgICBoLT5yb3dzID0gdGFibGVfc2l6ZTsKKyAgICBoLT50YWJsZSA9IChwal9oYXNoX2VudHJ5KiopCisgICAgCSAgICAgICBwal9wb29sX2NhbGxvYyhwb29sLCB0YWJsZV9zaXplKzEsIHNpemVvZihwal9oYXNoX2VudHJ5KikpOworICAgIHJldHVybiBoOworfQorCitzdGF0aWMgcGpfaGFzaF9lbnRyeSAqKmZpbmRfZW50cnkoIHBqX3Bvb2xfdCAqcG9vbCwgcGpfaGFzaF90YWJsZV90ICpodCwgCisJCQkJICAgY29uc3Qgdm9pZCAqa2V5LCB1bnNpZ25lZCBrZXlsZW4sCisJCQkJICAgdm9pZCAqdmFsLCBwal91aW50MzJfdCAqaHZhbCwKKwkJCQkgICB2b2lkICplbnRyeV9idWYsIHBqX2Jvb2xfdCBsb3dlcikKK3sKKyAgICBwal91aW50MzJfdCBoYXNoOworICAgIHBqX2hhc2hfZW50cnkgKipwX2VudHJ5LCAqZW50cnk7CisKKyAgICBpZiAoaHZhbCAmJiAqaHZhbCAhPSAwKSB7CisJaGFzaCA9ICpodmFsOworCWlmIChrZXlsZW49PVBKX0hBU0hfS0VZX1NUUklORykgeworCSAgICBrZXlsZW4gPSAodW5zaWduZWQpcGpfYW5zaV9zdHJsZW4oKGNvbnN0IGNoYXIqKWtleSk7CisJfQorICAgIH0gZWxzZSB7CisJLyogVGhpcyBzbGlnaHRseSBkaWZmZXJzIHdpdGggcGpfaGFzaF9jYWxjKCkgYmVjYXVzZSB3ZSBuZWVkIAorCSAqIHRvIGdldCB0aGUga2V5bGVuIHdoZW4ga2V5bGVuIGlzIFBKX0hBU0hfS0VZX1NUUklORy4KKwkgKi8KKwloYXNoPTA7CisJaWYgKGtleWxlbj09UEpfSEFTSF9LRVlfU1RSSU5HKSB7CisJICAgIGNvbnN0IHBqX3VpbnQ4X3QgKnAgPSAoY29uc3QgcGpfdWludDhfdCopa2V5OworCSAgICBmb3IgKCA7ICpwOyArK3AgKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvd2VyKQorICAgICAgICAgICAgICAgICAgICBoYXNoID0gaGFzaCAqIFBKX0hBU0hfTVVMVElQTElFUiArIHBqX3RvbG93ZXIoKnApOworICAgICAgICAgICAgICAgIGVsc2UgCisJCSAgICBoYXNoID0gaGFzaCAqIFBKX0hBU0hfTVVMVElQTElFUiArICpwOworCSAgICB9CisJICAgIGtleWxlbiA9ICh1bnNpZ25lZCkocCAtIChjb25zdCB1bnNpZ25lZCBjaGFyKilrZXkpOworCX0gZWxzZSB7CisJICAgIGNvbnN0IHBqX3VpbnQ4X3QgKnAgPSAoY29uc3QgcGpfdWludDhfdCopa2V5LAorCQkJCSAgKmVuZCA9IHAgKyBrZXlsZW47CisJICAgIGZvciAoIDsgcCE9ZW5kOyArK3ApIHsKKwkJaWYgKGxvd2VyKQorICAgICAgICAgICAgICAgICAgICBoYXNoID0gaGFzaCAqIFBKX0hBU0hfTVVMVElQTElFUiArIHBqX3RvbG93ZXIoKnApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiBQSl9IQVNIX01VTFRJUExJRVIgKyAqcDsKKwkgICAgfQorCX0KKworCS8qIFJlcG9ydCBiYWNrIHRoZSBjb21wdXRlZCBoYXNoLiAqLworCWlmIChodmFsKQorCSAgICAqaHZhbCA9IGhhc2g7CisgICAgfQorCisgICAgLyogc2NhbiB0aGUgbGlua2VkIGxpc3QgKi8KKyAgICBmb3IgKHBfZW50cnkgPSAmaHQtPnRhYmxlW2hhc2ggJiBodC0+cm93c10sIGVudHJ5PSpwX2VudHJ5OyAKKwkgZW50cnk7IAorCSBwX2VudHJ5ID0gJmVudHJ5LT5uZXh0LCBlbnRyeSA9ICpwX2VudHJ5KQorICAgIHsKKwlpZiAoZW50cnktPmhhc2g9PWhhc2ggJiYgZW50cnktPmtleWxlbj09a2V5bGVuICYmCisgICAgICAgICAgICAoKGxvd2VyICYmIHBqX2Fuc2lfc3RybmljbXAoKGNvbnN0IGNoYXIqKWVudHJ5LT5rZXksCisgICAgICAgIAkJCSAgICAgICAgKGNvbnN0IGNoYXIqKWtleSwga2V5bGVuKT09MCkgfHwKKwkgICAgICghbG93ZXIgJiYgcGpfbWVtY21wKGVudHJ5LT5rZXksIGtleSwga2V5bGVuKT09MCkpKQorCXsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGlmIChlbnRyeSB8fCB2YWw9PU5VTEwpCisJcmV0dXJuIHBfZW50cnk7CisKKyAgICAvKiBFbnRyeSBub3QgZm91bmQsIGNyZWF0ZSBhIG5ldyBvbmUuIAorICAgICAqIElmIGVudHJ5X2J1ZiBpcyBzcGVjaWZpZWQsIHVzZSBpdC4gT3RoZXJ3aXNlIGFsbG9jYXRlIGZyb20gcG9vbC4KKyAgICAgKi8KKyAgICBpZiAoZW50cnlfYnVmKSB7CisJZW50cnkgPSAocGpfaGFzaF9lbnRyeSopZW50cnlfYnVmOworICAgIH0gZWxzZSB7CisJLyogUG9vbCBtdXN0IGJlIHNwZWNpZmllZCEgKi8KKwlQSl9BU1NFUlRfUkVUVVJOKHBvb2wgIT0gTlVMTCwgTlVMTCk7CisKKwllbnRyeSA9IFBKX1BPT0xfQUxMT0NfVChwb29sLCBwal9oYXNoX2VudHJ5KTsKKwlQSl9MT0coNiwgKCJoYXNodGJsIiwgCisJCSAgICIlcDogTmV3IHBfZW50cnkgJXAgY3JlYXRlZCwgcG9vbCB1c2VkPSV1LCBjYXA9JXUiLCAKKwkJICAgaHQsIGVudHJ5LCAgcGpfcG9vbF9nZXRfdXNlZF9zaXplKHBvb2wpLCAKKwkJICAgcGpfcG9vbF9nZXRfY2FwYWNpdHkocG9vbCkpKTsKKyAgICB9CisgICAgZW50cnktPm5leHQgPSBOVUxMOworICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKKyAgICBpZiAocG9vbCkgeworCWVudHJ5LT5rZXkgPSBwal9wb29sX2FsbG9jKHBvb2wsIGtleWxlbik7CisJcGpfbWVtY3B5KGVudHJ5LT5rZXksIGtleSwga2V5bGVuKTsKKyAgICB9IGVsc2UgeworCWVudHJ5LT5rZXkgPSAodm9pZCopa2V5OworICAgIH0KKyAgICBlbnRyeS0+a2V5bGVuID0ga2V5bGVuOworICAgIGVudHJ5LT52YWx1ZSA9IHZhbDsKKyAgICAqcF9lbnRyeSA9IGVudHJ5OworICAgIAorICAgICsraHQtPmNvdW50OworICAgIAorICAgIHJldHVybiBwX2VudHJ5OworfQorCitQSl9ERUYodm9pZCAqKSBwal9oYXNoX2dldCggcGpfaGFzaF90YWJsZV90ICpodCwKKwkJCSAgICBjb25zdCB2b2lkICprZXksIHVuc2lnbmVkIGtleWxlbiwKKwkJCSAgICBwal91aW50MzJfdCAqaHZhbCkKK3sKKyAgICBwal9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICBlbnRyeSA9ICpmaW5kX2VudHJ5KCBOVUxMLCBodCwga2V5LCBrZXlsZW4sIE5VTEwsIGh2YWwsIE5VTEwsIFBKX0ZBTFNFKTsKKyAgICByZXR1cm4gZW50cnkgPyBlbnRyeS0+dmFsdWUgOiBOVUxMOworfQorCitQSl9ERUYodm9pZCAqKSBwal9oYXNoX2dldF9sb3dlciggcGpfaGFzaF90YWJsZV90ICpodCwKKwkJCSAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVuc2lnbmVkIGtleWxlbiwKKwkJCSAgICAgICAgICBwal91aW50MzJfdCAqaHZhbCkKK3sKKyAgICBwal9oYXNoX2VudHJ5ICplbnRyeTsKKyAgICBlbnRyeSA9ICpmaW5kX2VudHJ5KCBOVUxMLCBodCwga2V5LCBrZXlsZW4sIE5VTEwsIGh2YWwsIE5VTEwsIFBKX1RSVUUpOworICAgIHJldHVybiBlbnRyeSA/IGVudHJ5LT52YWx1ZSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGhhc2hfc2V0KCBwal9wb29sX3QgKnBvb2wsIHBqX2hhc2hfdGFibGVfdCAqaHQsCisJICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVuc2lnbmVkIGtleWxlbiwgcGpfdWludDMyX3QgaHZhbCwKKwkJICAgICAgdm9pZCAqdmFsdWUsIHZvaWQgKmVudHJ5X2J1ZiwgcGpfYm9vbF90IGxvd2VyICkKK3sKKyAgICBwal9oYXNoX2VudHJ5ICoqcF9lbnRyeTsKKworICAgIHBfZW50cnkgPSBmaW5kX2VudHJ5KCBwb29sLCBodCwga2V5LCBrZXlsZW4sIHZhbHVlLCAmaHZhbCwgZW50cnlfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcik7CisgICAgaWYgKCpwX2VudHJ5KSB7CisJaWYgKHZhbHVlID09IE5VTEwpIHsKKwkgICAgLyogZGVsZXRlIGVudHJ5ICovCisJICAgIFBKX0xPRyg2LCAoImhhc2h0YmwiLCAiJXA6IHBfZW50cnkgJXAgZGVsZXRlZCIsIGh0LCAqcF9lbnRyeSkpOworCSAgICAqcF9lbnRyeSA9ICgqcF9lbnRyeSktPm5leHQ7CisJICAgIC0taHQtPmNvdW50OworCSAgICAKKwl9IGVsc2UgeworCSAgICAvKiBvdmVyd3JpdGUgKi8KKwkgICAgKCpwX2VudHJ5KS0+dmFsdWUgPSB2YWx1ZTsKKwkgICAgUEpfTE9HKDYsICgiaGFzaHRibCIsICIlcDogcF9lbnRyeSAlcCB2YWx1ZSBzZXQgdG8gJXAiLCBodCwgCisJCSAgICAgICAqcF9lbnRyeSwgdmFsdWUpKTsKKwl9CisgICAgfQorfQorCitQSl9ERUYodm9pZCkgcGpfaGFzaF9zZXQoIHBqX3Bvb2xfdCAqcG9vbCwgcGpfaGFzaF90YWJsZV90ICpodCwKKwkJCSAgY29uc3Qgdm9pZCAqa2V5LCB1bnNpZ25lZCBrZXlsZW4sIHBqX3VpbnQzMl90IGh2YWwsCisJCQkgIHZvaWQgKnZhbHVlICkKK3sKKyAgICBoYXNoX3NldChwb29sLCBodCwga2V5LCBrZXlsZW4sIGh2YWwsIHZhbHVlLCBOVUxMLCBQSl9GQUxTRSk7Cit9CisKK1BKX0RFRih2b2lkKSBwal9oYXNoX3NldF9sb3dlciggcGpfcG9vbF90ICpwb29sLCBwal9oYXNoX3RhYmxlX3QgKmh0LAorCQkJICAgICAgICBjb25zdCB2b2lkICprZXksIHVuc2lnbmVkIGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdWludDMyX3QgaHZhbCwgdm9pZCAqdmFsdWUgKQoreworICAgIGhhc2hfc2V0KHBvb2wsIGh0LCBrZXksIGtleWxlbiwgaHZhbCwgdmFsdWUsIE5VTEwsIFBKX1RSVUUpOworfQorCitQSl9ERUYodm9pZCkgcGpfaGFzaF9zZXRfbnAoIHBqX2hhc2hfdGFibGVfdCAqaHQsCisJCQkgICAgIGNvbnN0IHZvaWQgKmtleSwgdW5zaWduZWQga2V5bGVuLCAKKwkJCSAgICAgcGpfdWludDMyX3QgaHZhbCwgcGpfaGFzaF9lbnRyeV9idWYgZW50cnlfYnVmLCAKKwkJCSAgICAgdm9pZCAqdmFsdWUpCit7CisgICAgaGFzaF9zZXQoTlVMTCwgaHQsIGtleSwga2V5bGVuLCBodmFsLCB2YWx1ZSwgKHZvaWQgKillbnRyeV9idWYsIFBKX0ZBTFNFKTsKK30KKworUEpfREVGKHZvaWQpIHBqX2hhc2hfc2V0X25wX2xvd2VyKCBwal9oYXNoX3RhYmxlX3QgKmh0LAorCQkJICAgICAgICAgICBjb25zdCB2b2lkICprZXksIHVuc2lnbmVkIGtleWxlbiwKKwkJCSAgICAgICAgICAgcGpfdWludDMyX3QgaHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaGFzaF9lbnRyeV9idWYgZW50cnlfYnVmLAorCQkJICAgICAgICAgICB2b2lkICp2YWx1ZSkKK3sKKyAgICBoYXNoX3NldChOVUxMLCBodCwga2V5LCBrZXlsZW4sIGh2YWwsIHZhbHVlLCAodm9pZCAqKWVudHJ5X2J1ZiwgUEpfVFJVRSk7Cit9CisKK1BKX0RFRih1bnNpZ25lZCkgcGpfaGFzaF9jb3VudCggcGpfaGFzaF90YWJsZV90ICpodCApCit7CisgICAgcmV0dXJuIGh0LT5jb3VudDsKK30KKworUEpfREVGKHBqX2hhc2hfaXRlcmF0b3JfdCopIHBqX2hhc2hfZmlyc3QoIHBqX2hhc2hfdGFibGVfdCAqaHQsCisJCQkJCSAgIHBqX2hhc2hfaXRlcmF0b3JfdCAqaXQgKQoreworICAgIGl0LT5pbmRleCA9IDA7CisgICAgaXQtPmVudHJ5ID0gTlVMTDsKKworICAgIGZvciAoOyBpdC0+aW5kZXggPD0gaHQtPnJvd3M7ICsraXQtPmluZGV4KSB7CisJaXQtPmVudHJ5ID0gaHQtPnRhYmxlW2l0LT5pbmRleF07CisJaWYgKGl0LT5lbnRyeSkgeworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIGl0LT5lbnRyeSA/IGl0IDogTlVMTDsKK30KKworUEpfREVGKHBqX2hhc2hfaXRlcmF0b3JfdCopIHBqX2hhc2hfbmV4dCggcGpfaGFzaF90YWJsZV90ICpodCwgCisJCQkJCSAgcGpfaGFzaF9pdGVyYXRvcl90ICppdCApCit7CisgICAgaXQtPmVudHJ5ID0gaXQtPmVudHJ5LT5uZXh0OworICAgIGlmIChpdC0+ZW50cnkpIHsKKwlyZXR1cm4gaXQ7CisgICAgfQorCisgICAgZm9yICgrK2l0LT5pbmRleDsgaXQtPmluZGV4IDw9IGh0LT5yb3dzOyArK2l0LT5pbmRleCkgeworCWl0LT5lbnRyeSA9IGh0LT50YWJsZVtpdC0+aW5kZXhdOworCWlmIChpdC0+ZW50cnkpIHsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHJldHVybiBpdC0+ZW50cnkgPyBpdCA6IE5VTEw7Cit9CisKK1BKX0RFRih2b2lkKikgcGpfaGFzaF90aGlzKCBwal9oYXNoX3RhYmxlX3QgKmh0LCBwal9oYXNoX2l0ZXJhdG9yX3QgKml0ICkKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX1VOVVNFRF9BUkcoaHQpOworICAgIHJldHVybiBpdC0+ZW50cnktPnZhbHVlOworfQorCisjaWYgMAordm9pZCBwal9oYXNoX2R1bXBfY29sbGlzaW9uKCBwal9oYXNoX3RhYmxlX3QgKmh0ICkKK3sKKyAgICB1bnNpZ25lZCBtaW49MHhGRkZGRkZGRiwgbWF4PTA7CisgICAgdW5zaWduZWQgaTsKKyAgICBjaGFyIGxpbmVbMTIwXTsKKyAgICBpbnQgbGVuLCB0b3RsZW4gPSAwOworCisgICAgZm9yIChpPTA7IGk8PWh0LT5yb3dzOyArK2kpIHsKKwl1bnNpZ25lZCBjb3VudCA9IDA7ICAgIAorCXBqX2hhc2hfZW50cnkgKmVudHJ5ID0gaHQtPnRhYmxlW2ldOworCXdoaWxlIChlbnRyeSkgeworCSAgICArK2NvdW50OworCSAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworCX0KKwlpZiAoY291bnQgPCBtaW4pCisJICAgIG1pbiA9IGNvdW50OworCWlmIChjb3VudCA+IG1heCkKKwkgICAgbWF4ID0gY291bnQ7CisJbGVuID0gcGpfc25wcmludGYoIGxpbmUrdG90bGVuLCBzaXplb2YobGluZSktdG90bGVuLCAiJTNkOiUzZCAiLCBpLCBjb3VudCk7CisJaWYgKGxlbiA8IDEpCisJICAgIGJyZWFrOworCXRvdGxlbiArPSBsZW47CisKKwlpZiAoKGkrMSkgJSAxMCA9PSAwKSB7CisJICAgIGxpbmVbdG90bGVuXSA9ICdcMCc7CisJICAgIFBKX0xPRyg0LChfX0ZJTEVfXywgbGluZSkpOworCX0KKyAgICB9CisKKyAgICBQSl9MT0coNCwoX19GSUxFX18sIkNvdW50OiAlZCwgbWluOiAlZCwgbWF4OiAlZFxuIiwgaHQtPmNvdW50LCBtaW4sIG1heCkpOworfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pb3F1ZXVlX2NvbW1vbl9hYnMuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaW9xdWV1ZV9jb21tb25fYWJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxOWY1MwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaW9xdWV1ZV9jb21tb25fYWJzLmMKQEAgLTAsMCArMSwxMzM2IEBACisvKiAkSWQ6IGlvcXVldWVfY29tbW9uX2Ficy5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisvKgorICogaW9xdWV1ZV9jb21tb25fYWJzLmMKKyAqCisgKiBUaGlzIGNvbnRhaW5zIGNvbW1vbiBmdW5jdGlvbmFsaXRpZXMgdG8gZW11bGF0ZSBwcm9hY3RvciBwYXR0ZXJuIHdpdGgKKyAqIHZhcmlvdXMgZXZlbnQgZGlzcGF0Y2hpbmcgbWVjaGFuaXNtcyAoZS5nLiBzZWxlY3QsIGVwb2xsKS4KKyAqCisgKiBUaGlzIGZpbGUgd2lsbCBiZSBpbmNsdWRlZCBieSB0aGUgYXBwcm9wcmlhdGUgaW9xdWV1ZSBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoaXMgZmlsZSBpcyBOT1Qgc3VwcG9zZWQgdG8gYmUgY29tcGlsZWQgYXMgc3RhbmQtYWxvbmUgc291cmNlLgorICovCisKKyNkZWZpbmUgUEVORElOR19SRVRSWQkyCisKK3N0YXRpYyB2b2lkIGlvcXVldWVfaW5pdCggcGpfaW9xdWV1ZV90ICppb3F1ZXVlICkKK3sKKyAgICBpb3F1ZXVlLT5sb2NrID0gTlVMTDsKKyAgICBpb3F1ZXVlLT5hdXRvX2RlbGV0ZV9sb2NrID0gMDsKKyAgICBpb3F1ZXVlLT5kZWZhdWx0X2NvbmN1cnJlbmN5ID0gUEpfSU9RVUVVRV9ERUZBVUxUX0FMTE9XX0NPTkNVUlJFTkNZOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgaW9xdWV1ZV9kZXN0cm95KHBqX2lvcXVldWVfdCAqaW9xdWV1ZSkKK3sKKyAgICBpZiAoaW9xdWV1ZS0+YXV0b19kZWxldGVfbG9jayAmJiBpb3F1ZXVlLT5sb2NrICkgeworCXBqX2xvY2tfcmVsZWFzZShpb3F1ZXVlLT5sb2NrKTsKKyAgICAgICAgcmV0dXJuIHBqX2xvY2tfZGVzdHJveShpb3F1ZXVlLT5sb2NrKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal9pb3F1ZXVlX3NldF9sb2NrKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3NldF9sb2NrKCBwal9pb3F1ZXVlX3QgKmlvcXVldWUsIAorCQkJCQkgcGpfbG9ja190ICpsb2NrLAorCQkJCQkgcGpfYm9vbF90IGF1dG9fZGVsZXRlICkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGlvcXVldWUgJiYgbG9jaywgUEpfRUlOVkFMKTsKKworICAgIGlmIChpb3F1ZXVlLT5hdXRvX2RlbGV0ZV9sb2NrICYmIGlvcXVldWUtPmxvY2spIHsKKyAgICAgICAgcGpfbG9ja19kZXN0cm95KGlvcXVldWUtPmxvY2spOworICAgIH0KKworICAgIGlvcXVldWUtPmxvY2sgPSBsb2NrOworICAgIGlvcXVldWUtPmF1dG9fZGVsZXRlX2xvY2sgPSBhdXRvX2RlbGV0ZTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgaW9xdWV1ZV9pbml0X2tleSggcGpfcG9vbF90ICpwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX2tleV90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc29ja190IHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfZ3JwX2xvY2tfdCAqZ3JwX2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX2lvcXVldWVfY2FsbGJhY2sgKmNiKQoreworICAgIHBqX3N0YXR1c190IHJjOworICAgIGludCBvcHRsZW47CisKKyAgICBQSl9VTlVTRURfQVJHKHBvb2wpOworCisgICAga2V5LT5pb3F1ZXVlID0gaW9xdWV1ZTsKKyAgICBrZXktPmZkID0gc29jazsKKyAgICBrZXktPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgICBwal9saXN0X2luaXQoJmtleS0+cmVhZF9saXN0KTsKKyAgICBwal9saXN0X2luaXQoJmtleS0+d3JpdGVfbGlzdCk7CisjaWYgUEpfSEFTX1RDUAorICAgIHBqX2xpc3RfaW5pdCgma2V5LT5hY2NlcHRfbGlzdCk7CisgICAga2V5LT5jb25uZWN0aW5nID0gMDsKKyNlbmRpZgorCisgICAgLyogU2F2ZSBjYWxsYmFjay4gKi8KKyAgICBwal9tZW1jcHkoJmtleS0+Y2IsIGNiLCBzaXplb2YocGpfaW9xdWV1ZV9jYWxsYmFjaykpOworCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworICAgIC8qIFNldCBpbml0aWFsIHJlZmVyZW5jZSBjb3VudCB0byAxICovCisgICAgcGpfYXNzZXJ0KGtleS0+cmVmX2NvdW50ID09IDApOworICAgICsra2V5LT5yZWZfY291bnQ7CisKKyAgICBrZXktPmNsb3NpbmcgPSAwOworI2VuZGlmCisKKyAgICByYyA9IHBqX2lvcXVldWVfc2V0X2NvbmN1cnJlbmN5KGtleSwgaW9xdWV1ZS0+ZGVmYXVsdF9jb25jdXJyZW5jeSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHJjOworCisgICAgLyogR2V0IHNvY2tldCB0eXBlLiBXaGVuIHNvY2tldCB0eXBlIGlzIGRhdGFncmFtLCBzb21lIG9wdGltaXphdGlvbgorICAgICAqIHdpbGwgYmUgcGVyZm9ybWVkIGR1cmluZyBzZW5kIHRvIGFsbG93IHBhcmFsbGVsIHNlbmQgb3BlcmF0aW9ucy4KKyAgICAgKi8KKyAgICBvcHRsZW4gPSBzaXplb2Yoa2V5LT5mZF90eXBlKTsKKyAgICByYyA9IHBqX3NvY2tfZ2V0c29ja29wdChzb2NrLCBwal9TT0xfU09DS0VUKCksIHBqX1NPX1RZUEUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LT5mZF90eXBlLCAmb3B0bGVuKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAga2V5LT5mZF90eXBlID0gcGpfU09DS19TVFJFQU0oKTsKKworICAgIC8qIENyZWF0ZSBtdXRleCBmb3IgdGhlIGtleS4gKi8KKyNpZiAhUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworICAgIHJjID0gcGpfbG9ja19jcmVhdGVfc2ltcGxlX211dGV4KHBvbGwsIE5VTEwsICZrZXktPmxvY2spOworI2VuZGlmCisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHJjOworCisgICAgLyogR3JvdXAgbG9jayAqLworICAgIGtleS0+Z3JwX2xvY2sgPSBncnBfbG9jazsKKyAgICBpZiAoa2V5LT5ncnBfbG9jaykgeworCXBqX2dycF9sb2NrX2FkZF9yZWZfZGJnKGtleS0+Z3JwX2xvY2ssICJpb3F1ZXVlIiwgMCk7CisgICAgfQorICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogcGpfaW9xdWV1ZV9nZXRfdXNlcl9kYXRhKCkKKyAqCisgKiBPYnRhaW4gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEga2V5LgorICovCitQSl9ERUYodm9pZCopIHBqX2lvcXVldWVfZ2V0X3VzZXJfZGF0YSggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5ICkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGtleSAhPSBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4ga2V5LT51c2VyX2RhdGE7Cit9CisKKy8qCisgKiBwal9pb3F1ZXVlX3NldF91c2VyX2RhdGEoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfc2V0X3VzZXJfZGF0YSggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2xkX2RhdGEpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihrZXksIFBKX0VJTlZBTCk7CisKKyAgICBpZiAob2xkX2RhdGEpCisgICAgICAgICpvbGRfZGF0YSA9IGtleS0+dXNlcl9kYXRhOworICAgIGtleS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0lOTElORShpbnQpIGtleV9oYXNfcGVuZGluZ193cml0ZShwal9pb3F1ZXVlX2tleV90ICprZXkpCit7CisgICAgcmV0dXJuICFwal9saXN0X2VtcHR5KCZrZXktPndyaXRlX2xpc3QpOworfQorCitQSl9JTkxJTkUoaW50KSBrZXlfaGFzX3BlbmRpbmdfcmVhZChwal9pb3F1ZXVlX2tleV90ICprZXkpCit7CisgICAgcmV0dXJuICFwal9saXN0X2VtcHR5KCZrZXktPnJlYWRfbGlzdCk7Cit9CisKK1BKX0lOTElORShpbnQpIGtleV9oYXNfcGVuZGluZ19hY2NlcHQocGpfaW9xdWV1ZV9rZXlfdCAqa2V5KQoreworI2lmIFBKX0hBU19UQ1AKKyAgICByZXR1cm4gIXBqX2xpc3RfZW1wdHkoJmtleS0+YWNjZXB0X2xpc3QpOworI2Vsc2UKKyAgICBQSl9VTlVTRURfQVJHKGtleSk7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworUEpfSU5MSU5FKGludCkga2V5X2hhc19wZW5kaW5nX2Nvbm5lY3QocGpfaW9xdWV1ZV9rZXlfdCAqa2V5KQoreworICAgIHJldHVybiBrZXktPmNvbm5lY3Rpbmc7Cit9CisKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKyMgICBkZWZpbmUgSVNfQ0xPU0lORyhrZXkpICAoa2V5LT5jbG9zaW5nKQorI2Vsc2UKKyMgICBkZWZpbmUgSVNfQ0xPU0lORyhrZXkpICAoMCkKKyNlbmRpZgorCisKKy8qCisgKiBpb3F1ZXVlX2Rpc3BhdGNoX2V2ZW50KCkKKyAqCisgKiBSZXBvcnQgb2NjdXJlbmNlIG9mIGFuIGV2ZW50IGluIHRoZSBrZXkgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZQorICogZnJhbWV3b3JrLgorICovCit2b2lkIGlvcXVldWVfZGlzcGF0Y2hfd3JpdGVfZXZlbnQocGpfaW9xdWV1ZV90ICppb3F1ZXVlLCBwal9pb3F1ZXVlX2tleV90ICpoKQoreworICAgIC8qIExvY2sgdGhlIGtleS4gKi8KKyAgICBwal9pb3F1ZXVlX2xvY2tfa2V5KGgpOworCisgICAgaWYgKElTX0NMT1NJTkcoaCkpIHsKKwlwal9pb3F1ZXVlX3VubG9ja19rZXkoaCk7CisJcmV0dXJuOworICAgIH0KKworI2lmIGRlZmluZWQoUEpfSEFTX1RDUCkgJiYgUEpfSEFTX1RDUCE9MAorICAgIGlmIChoLT5jb25uZWN0aW5nKSB7CisJLyogQ29tcGxldGlvbiBvZiBjb25uZWN0KCkgb3BlcmF0aW9uICovCisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCXBqX2Jvb2xfdCBoYXNfbG9jazsKKworCS8qIENsZWFyIG9wZXJhdGlvbi4gKi8KKwloLT5jb25uZWN0aW5nID0gMDsKKworICAgICAgICBpb3F1ZXVlX3JlbW92ZV9mcm9tX3NldChpb3F1ZXVlLCBoLCBXUklURUFCTEVfRVZFTlQpOworICAgICAgICBpb3F1ZXVlX3JlbW92ZV9mcm9tX3NldChpb3F1ZXVlLCBoLCBFWENFUFRJT05fRVZFTlQpOworCisKKyNpZiAoZGVmaW5lZChQSl9IQVNfU09fRVJST1IpICYmIFBKX0hBU19TT19FUlJPUiE9MCkKKwkvKiBmcm9tIGNvbm5lY3QoMik6IAorCSAqIE9uIExpbnV4LCB1c2UgZ2V0c29ja29wdCB0byByZWFkIHRoZSBTT19FUlJPUiBvcHRpb24gYXQKKwkgKiBsZXZlbCBTT0xfU09DS0VUIHRvIGRldGVybWluZSB3aGV0aGVyIGNvbm5lY3QoKSBjb21wbGV0ZWQKKwkgKiBzdWNjZXNzZnVsbHkgKGlmIFNPX0VSUk9SIGlzIHplcm8pLgorCSAqLworCXsKKwkgIGludCB2YWx1ZTsKKwkgIGludCB2YWxsZW4gPSBzaXplb2YodmFsdWUpOworCSAgaW50IGdzX3JjID0gcGpfc29ja19nZXRzb2Nrb3B0KGgtPmZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgCisJCQkJCSAmdmFsdWUsICZ2YWxsZW4pOworCSAgaWYgKGdzX3JjICE9IDApIHsKKwkgICAgLyogQXJnaCEhIFdoYXQgdG8gZG8gbm93Pz8/IAorCSAgICAgKiBKdXN0IGluZGljYXRlIHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuIFRoZQorCSAgICAgKiBhcHBsaWNhdGlvbiB3aWxsIGdldCBlcnJvciBhcyBzb29uIGFzIGl0IHRyaWVzIHRvIHVzZQorCSAgICAgKiB0aGUgc29ja2V0IHRvIHNlbmQvcmVjZWl2ZS4KKwkgICAgICovCisJICAgICAgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKwkgIH0gZWxzZSB7CisJICAgICAgc3RhdHVzID0gUEpfU1RBVFVTX0ZST01fT1ModmFsdWUpOworCSAgfQorIAl9CisjZWxpZiAoZGVmaW5lZChQSl9XSU4zMikgJiYgUEpfV0lOMzIhPTApIHx8IChkZWZpbmVkKFBKX1dJTjY0KSAmJiBQSl9XSU42NCE9MCkgCisJc3RhdHVzID0gUEpfU1VDQ0VTUzsgLyogc3VjY2VzcyAqLworI2Vsc2UKKwkvKiBFeGNlbGxlbnQgaW5mb3JtYXRpb24gaW4gRC5KLiBCZXJuc3RlaW4gcGFnZToKKwkgKiBodHRwOi8vY3IueXAudG8vZG9jcy9jb25uZWN0Lmh0bWwKKwkgKgorCSAqIFNlZW1zIGxpa2UgdGhlIG1vc3QgcG9ydGFibGUgd2F5IG9mIGRldGVjdGluZyBjb25uZWN0KCkKKwkgKiBmYWlsdXJlIGlzIHRvIGNhbGwgZ2V0cGVlcm5hbWUoKS4gSWYgc29ja2V0IGlzIGNvbm5lY3RlZCwKKwkgKiBnZXRwZWVybmFtZSgpIHdpbGwgcmV0dXJuIDAuIElmIHRoZSBzb2NrZXQgaXMgbm90IGNvbm5lY3RlZCwKKwkgKiBpdCB3aWxsIHJldHVybiBFTk9UQ09OTiwgYW5kIHJlYWQoZmQsICZjaCwgMSkgd2lsbCBwcm9kdWNlCisJICogdGhlIHJpZ2h0IGVycm5vIHRocm91Z2ggZXJyb3Igc2xpcHBhZ2UuIFRoaXMgaXMgYSBjb21iaW5hdGlvbgorCSAqIG9mIHN1Z2dlc3Rpb25zIGZyb20gRG91Z2xhcyBDLiBTY2htaWR0IGFuZCBLZW4gS2V5cy4KKwkgKi8KKwl7CisJICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCSAgICBpbnQgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKKworCSAgICBzdGF0dXMgPSBwal9zb2NrX2dldHBlZXJuYW1lKGgtPmZkLCAoc3RydWN0IHNvY2thZGRyKikmYWRkciwKKwkJCQkgICAgICAgICAmYWRkcmxlbik7CisJfQorI2VuZGlmCisKKyAgICAgICAgLyogVW5sb2NrOyBmcm9tIHRoaXMgcG9pbnQgd2UgZG9uJ3QgbmVlZCB0byBob2xkIGtleSdzIG11dGV4CisJICogKHVubGVzcyBjb25jdXJyZW5jeSBpcyBkaXNhYmxlZCwgd2hpY2ggaW4gdGhpcyBjYXNlIHdlIHNob3VsZAorCSAqIGhvbGQgdGhlIG11dGV4IHdoaWxlIGNhbGxpbmcgdGhlIGNhbGxiYWNrKSAqLworCWlmIChoLT5hbGxvd19jb25jdXJyZW50KSB7CisJICAgIC8qIGNvbmN1cnJlbmN5IG1heSBiZSBjaGFuZ2VkIHdoaWxlIHdlJ3JlIGluIHRoZSBjYWxsYmFjaywgc28KKwkgICAgICogc2F2ZSBpdCB0byBhIGZsYWcuCisJICAgICAqLworCSAgICBoYXNfbG9jayA9IFBKX0ZBTFNFOworCSAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoaCk7CisJfSBlbHNlIHsKKwkgICAgaGFzX2xvY2sgPSBQSl9UUlVFOworCX0KKworCS8qIENhbGwgY2FsbGJhY2suICovCisgICAgICAgIGlmIChoLT5jYi5vbl9jb25uZWN0X2NvbXBsZXRlICYmICFJU19DTE9TSU5HKGgpKQorCSAgICAoKmgtPmNiLm9uX2Nvbm5lY3RfY29tcGxldGUpKGgsIHN0YXR1cyk7CisKKwkvKiBVbmxvY2sgaWYgd2Ugc3RpbGwgaG9sZCB0aGUgbG9jayAqLworCWlmIChoYXNfbG9jaykgeworCSAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoaCk7CisJfQorCisgICAgICAgIC8qIERvbmUuICovCisKKyAgICB9IGVsc2UgCisjZW5kaWYgLyogUEpfSEFTX1RDUCAqLworICAgIGlmIChrZXlfaGFzX3BlbmRpbmdfd3JpdGUoaCkpIHsKKwkvKiBTb2NrZXQgaXMgd3JpdGFibGUuICovCisgICAgICAgIHN0cnVjdCB3cml0ZV9vcGVyYXRpb24gKndyaXRlX29wOworICAgICAgICBwal9zc2l6ZV90IHNlbnQ7CisgICAgICAgIHBqX3N0YXR1c190IHNlbmRfcmMgPSBQSl9TVUNDRVNTOworCisgICAgICAgIC8qIEdldCB0aGUgZmlyc3QgaW4gdGhlIHF1ZXVlLiAqLworICAgICAgICB3cml0ZV9vcCA9IGgtPndyaXRlX2xpc3QubmV4dDsKKworICAgICAgICAvKiBGb3IgZGF0YWdyYW1zLCB3ZSBjYW4gcmVtb3ZlIHRoZSB3cml0ZV9vcCBmcm9tIHRoZSBsaXN0CisgICAgICAgICAqIHNvIHRoYXQgc2VuZCgpIGNhbiB3b3JrIGluIHBhcmFsbGVsLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGgtPmZkX3R5cGUgPT0gcGpfU09DS19ER1JBTSgpKSB7CisgICAgICAgICAgICBwal9saXN0X2VyYXNlKHdyaXRlX29wKTsKKworICAgICAgICAgICAgaWYgKHBqX2xpc3RfZW1wdHkoJmgtPndyaXRlX2xpc3QpKQorICAgICAgICAgICAgICAgIGlvcXVldWVfcmVtb3ZlX2Zyb21fc2V0KGlvcXVldWUsIGgsIFdSSVRFQUJMRV9FVkVOVCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNlbmQgdGhlIGRhdGEuIAorICAgICAgICAgKiBVbmZvcnR1bmF0ZWx5IHdlIG11c3QgZG8gdGhpcyB3aGlsZSBob2xkaW5nIGtleSdzIG11dGV4LCB0aHVzCisgICAgICAgICAqIHByZXZlbnRpbmcgcGFyYWxsZWwgd3JpdGUgb24gYSBzaW5nbGUga2V5Li4gOi0oKAorICAgICAgICAgKi8KKyAgICAgICAgc2VudCA9IHdyaXRlX29wLT5zaXplIC0gd3JpdGVfb3AtPndyaXR0ZW47CisgICAgICAgIGlmICh3cml0ZV9vcC0+b3AgPT0gUEpfSU9RVUVVRV9PUF9TRU5EKSB7CisgICAgICAgICAgICBzZW5kX3JjID0gcGpfc29ja19zZW5kKGgtPmZkLCB3cml0ZV9vcC0+YnVmK3dyaXRlX29wLT53cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VudCwgd3JpdGVfb3AtPmZsYWdzKTsKKwkgICAgLyogQ2FuJ3QgZG8gdGhpcy4gV2Ugb25seSBjbGVhciAib3AiIGFmdGVyIHdlJ3JlIGZpbmlzaGVkIHNlbmRpbmcKKwkgICAgICogdGhlIHdob2xlIGJ1ZmZlci4KKwkgICAgICovCisJICAgIC8vd3JpdGVfb3AtPm9wID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh3cml0ZV9vcC0+b3AgPT0gUEpfSU9RVUVVRV9PUF9TRU5EX1RPKSB7CisJICAgIGludCByZXRyeSA9IDI7CisJICAgIHdoaWxlICgtLXJldHJ5ID49IDApIHsKKwkJc2VuZF9yYyA9IHBqX3NvY2tfc2VuZHRvKGgtPmZkLCAKKwkJCQkJIHdyaXRlX29wLT5idWYrd3JpdGVfb3AtPndyaXR0ZW4sCisJCQkJCSAmc2VudCwgd3JpdGVfb3AtPmZsYWdzLAorCQkJCQkgJndyaXRlX29wLT5ybXRfYWRkciwgCisJCQkJCSB3cml0ZV9vcC0+cm10X2FkZHJsZW4pOworI2lmIGRlZmluZWQoUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCkgJiYgXAorCSAgICBQSl9JUEhPTkVfT1NfSEFTX01VTFRJVEFTS0lOR19TVVBQT1JUIT0wCisJCS8qIFNwZWNpYWwgdHJlYXRtZW50IGZvciBkZWFkIFVEUCBzb2NrZXRzIGhlcmUsIHNlZSB0aWNrZXQgIzExMDcgKi8KKwkJaWYgKHNlbmRfcmM9PVBKX1NUQVRVU19GUk9NX09TKEVQSVBFKSAmJiAhSVNfQ0xPU0lORyhoKSAmJgorCQkgICAgaC0+ZmRfdHlwZT09cGpfU09DS19ER1JBTSgpKQorCQl7CisJCSAgICBQSl9QRVJST1IoNCwoVEhJU19GSUxFLCBzZW5kX3JjLAorCQkJCSAiU2VuZCBlcnJvciBmb3Igc29ja2V0ICVkLCByZXRyeWluZyIsCisJCQkJIGgtPmZkKSk7CisJCSAgICByZXBsYWNlX3VkcF9zb2NrKGgpOworCQkgICAgY29udGludWU7CisJCX0KKyNlbmRpZgorCQlicmVhazsKKwkgICAgfQorCisJICAgIC8qIENhbid0IGRvIHRoaXMuIFdlIG9ubHkgY2xlYXIgIm9wIiBhZnRlciB3ZSdyZSBmaW5pc2hlZCBzZW5kaW5nCisJICAgICAqIHRoZSB3aG9sZSBidWZmZXIuCisJICAgICAqLworCSAgICAvL3dyaXRlX29wLT5vcCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwal9hc3NlcnQoISJJbnZhbGlkIG9wZXJhdGlvbiB0eXBlISIpOworCSAgICB3cml0ZV9vcC0+b3AgPSBQSl9JT1FVRVVFX09QX05PTkU7CisgICAgICAgICAgICBzZW5kX3JjID0gUEpfRUJVRzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZW5kX3JjID09IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHdyaXRlX29wLT53cml0dGVuICs9IHNlbnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwal9hc3NlcnQoc2VuZF9yYyA+IDApOworICAgICAgICAgICAgd3JpdGVfb3AtPndyaXR0ZW4gPSAtc2VuZF9yYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFyZSB3ZSBmaW5pc2hlZCB3aXRoIHRoaXMgYnVmZmVyPyAqLworICAgICAgICBpZiAoc2VuZF9yYyE9UEpfU1VDQ0VTUyB8fCAKKyAgICAgICAgICAgIHdyaXRlX29wLT53cml0dGVuID09IChwal9zc2l6ZV90KXdyaXRlX29wLT5zaXplIHx8CisgICAgICAgICAgICBoLT5mZF90eXBlID09IHBqX1NPQ0tfREdSQU0oKSkgCisgICAgICAgIHsKKwkgICAgcGpfYm9vbF90IGhhc19sb2NrOworCisJICAgIHdyaXRlX29wLT5vcCA9IFBKX0lPUVVFVUVfT1BfTk9ORTsKKworICAgICAgICAgICAgaWYgKGgtPmZkX3R5cGUgIT0gcGpfU09DS19ER1JBTSgpKSB7CisgICAgICAgICAgICAgICAgLyogV3JpdGUgY29tcGxldGlvbiBvZiB0aGUgd2hvbGUgc3RyZWFtLiAqLworICAgICAgICAgICAgICAgIHBqX2xpc3RfZXJhc2Uod3JpdGVfb3ApOworCisgICAgICAgICAgICAgICAgLyogQ2xlYXIgb3BlcmF0aW9uIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhIHRvIHNlbmQuICovCisgICAgICAgICAgICAgICAgaWYgKHBqX2xpc3RfZW1wdHkoJmgtPndyaXRlX2xpc3QpKQorICAgICAgICAgICAgICAgICAgICBpb3F1ZXVlX3JlbW92ZV9mcm9tX3NldChpb3F1ZXVlLCBoLCBXUklURUFCTEVfRVZFTlQpOworCisgICAgICAgICAgICB9CisKKwkgICAgLyogVW5sb2NrOyBmcm9tIHRoaXMgcG9pbnQgd2UgZG9uJ3QgbmVlZCB0byBob2xkIGtleSdzIG11dGV4CisJICAgICAqICh1bmxlc3MgY29uY3VycmVuY3kgaXMgZGlzYWJsZWQsIHdoaWNoIGluIHRoaXMgY2FzZSB3ZSBzaG91bGQKKwkgICAgICogaG9sZCB0aGUgbXV0ZXggd2hpbGUgY2FsbGluZyB0aGUgY2FsbGJhY2spICovCisJICAgIGlmIChoLT5hbGxvd19jb25jdXJyZW50KSB7CisJCS8qIGNvbmN1cnJlbmN5IG1heSBiZSBjaGFuZ2VkIHdoaWxlIHdlJ3JlIGluIHRoZSBjYWxsYmFjaywgc28KKwkJICogc2F2ZSBpdCB0byBhIGZsYWcuCisJCSAqLworCQloYXNfbG9jayA9IFBKX0ZBTFNFOworCQlwal9pb3F1ZXVlX3VubG9ja19rZXkoaCk7CisJCVBKX1JBQ0VfTUUoNSk7CisJICAgIH0gZWxzZSB7CisJCWhhc19sb2NrID0gUEpfVFJVRTsKKwkgICAgfQorCisJICAgIC8qIENhbGwgY2FsbGJhY2suICovCisgICAgICAgICAgICBpZiAoaC0+Y2Iub25fd3JpdGVfY29tcGxldGUgJiYgIUlTX0NMT1NJTkcoaCkpIHsKKwkgICAgICAgICgqaC0+Y2Iub25fd3JpdGVfY29tcGxldGUpKGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwal9pb3F1ZXVlX29wX2tleV90Kil3cml0ZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9vcC0+d3JpdHRlbik7CisgICAgICAgICAgICB9CisKKwkgICAgaWYgKGhhc19sb2NrKSB7CisJCXBqX2lvcXVldWVfdW5sb2NrX2tleShoKTsKKwkgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoaCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBEb25lLiAqLworICAgIH0gZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgaXMgbm9ybWFsOyBleGVjdXRpb24gbWF5IGZhbGwgaGVyZSB3aGVuIG11bHRpcGxlIHRocmVhZHMKKyAgICAgICAgICogYXJlIHNpZ25hbGxlZCBmb3IgdGhlIHNhbWUgZXZlbnQsIGJ1dCBvbmx5IG9uZSB0aHJlYWQgZXZlbnR1YWxseQorICAgICAgICAgKiBhYmxlIHRvIHByb2Nlc3MgdGhlIGV2ZW50LgorICAgICAgICAgKi8KKwlwal9pb3F1ZXVlX3VubG9ja19rZXkoaCk7CisgICAgfQorfQorCit2b2lkIGlvcXVldWVfZGlzcGF0Y2hfcmVhZF9ldmVudCggcGpfaW9xdWV1ZV90ICppb3F1ZXVlLCBwal9pb3F1ZXVlX2tleV90ICpoICkKK3sKKyAgICBwal9zdGF0dXNfdCByYzsKKworICAgIC8qIExvY2sgdGhlIGtleS4gKi8KKyAgICBwal9pb3F1ZXVlX2xvY2tfa2V5KGgpOworCisgICAgaWYgKElTX0NMT1NJTkcoaCkpIHsKKwlwal9pb3F1ZXVlX3VubG9ja19rZXkoaCk7CisJcmV0dXJuOworICAgIH0KKworIyAgIGlmIFBKX0hBU19UQ1AKKyAgICBpZiAoIXBqX2xpc3RfZW1wdHkoJmgtPmFjY2VwdF9saXN0KSkgeworCisgICAgICAgIHN0cnVjdCBhY2NlcHRfb3BlcmF0aW9uICphY2NlcHRfb3A7CisJcGpfYm9vbF90IGhhc19sb2NrOworCQorICAgICAgICAvKiBHZXQgb25lIGFjY2VwdCBvcGVyYXRpb24gZnJvbSB0aGUgbGlzdC4gKi8KKwlhY2NlcHRfb3AgPSBoLT5hY2NlcHRfbGlzdC5uZXh0OworICAgICAgICBwal9saXN0X2VyYXNlKGFjY2VwdF9vcCk7CisgICAgICAgIGFjY2VwdF9vcC0+b3AgPSBQSl9JT1FVRVVFX09QX05PTkU7CisKKwkvKiBDbGVhciBiaXQgaW4gZmRzZXQgaWYgdGhlcmUgaXMgbm8gbW9yZSBwZW5kaW5nIGFjY2VwdCAqLworICAgICAgICBpZiAocGpfbGlzdF9lbXB0eSgmaC0+YWNjZXB0X2xpc3QpKQorICAgICAgICAgICAgaW9xdWV1ZV9yZW1vdmVfZnJvbV9zZXQoaW9xdWV1ZSwgaCwgUkVBREFCTEVfRVZFTlQpOworCisJcmM9cGpfc29ja19hY2NlcHQoaC0+ZmQsIGFjY2VwdF9vcC0+YWNjZXB0X2ZkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0X29wLT5ybXRfYWRkciwgYWNjZXB0X29wLT5hZGRybGVuKTsKKwlpZiAocmM9PVBKX1NVQ0NFU1MgJiYgYWNjZXB0X29wLT5sb2NhbF9hZGRyKSB7CisJICAgIHJjID0gcGpfc29ja19nZXRzb2NrbmFtZSgqYWNjZXB0X29wLT5hY2NlcHRfZmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdF9vcC0+bG9jYWxfYWRkciwKKwkJCQkgICAgIGFjY2VwdF9vcC0+YWRkcmxlbik7CisJfQorCisJLyogVW5sb2NrOyBmcm9tIHRoaXMgcG9pbnQgd2UgZG9uJ3QgbmVlZCB0byBob2xkIGtleSdzIG11dGV4CisJICogKHVubGVzcyBjb25jdXJyZW5jeSBpcyBkaXNhYmxlZCwgd2hpY2ggaW4gdGhpcyBjYXNlIHdlIHNob3VsZAorCSAqIGhvbGQgdGhlIG11dGV4IHdoaWxlIGNhbGxpbmcgdGhlIGNhbGxiYWNrKSAqLworCWlmIChoLT5hbGxvd19jb25jdXJyZW50KSB7CisJICAgIC8qIGNvbmN1cnJlbmN5IG1heSBiZSBjaGFuZ2VkIHdoaWxlIHdlJ3JlIGluIHRoZSBjYWxsYmFjaywgc28KKwkgICAgICogc2F2ZSBpdCB0byBhIGZsYWcuCisJICAgICAqLworCSAgICBoYXNfbG9jayA9IFBKX0ZBTFNFOworCSAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoaCk7CisJICAgIFBKX1JBQ0VfTUUoNSk7CisJfSBlbHNlIHsKKwkgICAgaGFzX2xvY2sgPSBQSl9UUlVFOworCX0KKworCS8qIENhbGwgY2FsbGJhY2suICovCisgICAgICAgIGlmIChoLT5jYi5vbl9hY2NlcHRfY29tcGxldGUgJiYgIUlTX0NMT1NJTkcoaCkpIHsKKwkgICAgKCpoLT5jYi5vbl9hY2NlcHRfY29tcGxldGUpKGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwal9pb3F1ZXVlX29wX2tleV90KilhY2NlcHRfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFjY2VwdF9vcC0+YWNjZXB0X2ZkLCByYyk7CisJfQorCisJaWYgKGhhc19sb2NrKSB7CisJICAgIHBqX2lvcXVldWVfdW5sb2NrX2tleShoKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyMgICBlbmRpZgorICAgIGlmIChrZXlfaGFzX3BlbmRpbmdfcmVhZChoKSkgeworICAgICAgICBzdHJ1Y3QgcmVhZF9vcGVyYXRpb24gKnJlYWRfb3A7CisgICAgICAgIHBqX3NzaXplX3QgYnl0ZXNfcmVhZDsKKwlwal9ib29sX3QgaGFzX2xvY2s7CisKKyAgICAgICAgLyogR2V0IG9uZSBwZW5kaW5nIHJlYWQgb3BlcmF0aW9uIGZyb20gdGhlIGxpc3QuICovCisgICAgICAgIHJlYWRfb3AgPSBoLT5yZWFkX2xpc3QubmV4dDsKKyAgICAgICAgcGpfbGlzdF9lcmFzZShyZWFkX29wKTsKKworICAgICAgICAvKiBDbGVhciBmZHNldCBpZiB0aGVyZSBpcyBubyBwZW5kaW5nIHJlYWQuICovCisgICAgICAgIGlmIChwal9saXN0X2VtcHR5KCZoLT5yZWFkX2xpc3QpKQorICAgICAgICAgICAgaW9xdWV1ZV9yZW1vdmVfZnJvbV9zZXQoaW9xdWV1ZSwgaCwgUkVBREFCTEVfRVZFTlQpOworCisgICAgICAgIGJ5dGVzX3JlYWQgPSByZWFkX29wLT5zaXplOworCisJaWYgKChyZWFkX29wLT5vcCA9PSBQSl9JT1FVRVVFX09QX1JFQ1ZfRlJPTSkpIHsKKwkgICAgcmVhZF9vcC0+b3AgPSBQSl9JT1FVRVVFX09QX05PTkU7CisJICAgIHJjID0gcGpfc29ja19yZWN2ZnJvbShoLT5mZCwgcmVhZF9vcC0+YnVmLCAmYnl0ZXNfcmVhZCwgCisJCQkJICByZWFkX29wLT5mbGFncywKKwkJCQkgIHJlYWRfb3AtPnJtdF9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX29wLT5ybXRfYWRkcmxlbik7CisJfSBlbHNlIGlmICgocmVhZF9vcC0+b3AgPT0gUEpfSU9RVUVVRV9PUF9SRUNWKSkgeworCSAgICByZWFkX29wLT5vcCA9IFBKX0lPUVVFVUVfT1BfTk9ORTsKKwkgICAgcmMgPSBwal9zb2NrX3JlY3YoaC0+ZmQsIHJlYWRfb3AtPmJ1ZiwgJmJ5dGVzX3JlYWQsIAorCQkJICAgICAgcmVhZF9vcC0+ZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGpfYXNzZXJ0KHJlYWRfb3AtPm9wID09IFBKX0lPUVVFVUVfT1BfUkVBRCk7CisJICAgIHJlYWRfb3AtPm9wID0gUEpfSU9RVUVVRV9PUF9OT05FOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVzZXIgaGFzIHNwZWNpZmllZCBwal9pb3F1ZXVlX3JlYWQoKS4KKyAgICAgICAgICAgICAqIE9uIFdpbjMyLCB3ZSBzaG91bGQgZG8gUmVhZEZpbGUoKS4gQnV0IGJlY2F1c2Ugd2UgZ290CisgICAgICAgICAgICAgKiBoZXJlIGJlY2F1c2Ugb2Ygc2VsZWN0KCkgYW55d2F5LCB1c2VyIG11c3QgaGF2ZSBwdXQgYQorICAgICAgICAgICAgICogc29ja2V0IGRlc2NyaXB0b3Igb24gaC0+ZmQsIHdoaWNoIGluIHRoaXMgY2FzZSB3ZSBjYW4KKyAgICAgICAgICAgICAqIGp1c3QgY2FsbCBwal9zb2NrX3JlY3YoKSBpbnN0ZWFkIG9mIFJlYWRGaWxlKCkuCisgICAgICAgICAgICAgKiBPbiBVbml4LCB1c2VyIG1heSBwdXQgYSBmaWxlIGluIGgtPmZkLCBzbyB3ZSdsbCBoYXZlCisgICAgICAgICAgICAgKiB0byBjYWxsIHJlYWQoKSBoZXJlLgorICAgICAgICAgICAgICogVGhpcyBtYXkgbm90IGNvbXBpbGUgb24gc3lzdGVtcyB3aGljaCBkb2Vzbid0IGhhdmUgCisgICAgICAgICAgICAgKiByZWFkKCkuIFRoYXQncyB3aHkgd2Ugb25seSBzcGVjaWZ5IFBKX0xJTlVYIGhlcmUgc28KKyAgICAgICAgICAgICAqIHRoYXQgZXJyb3IgaXMgZWFzaWVyIHRvIGNhdGNoLgorICAgICAgICAgICAgICovCisjCSAgICBpZiBkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMiAhPSAwIHx8IFwKKwkgICAgICAgZGVmaW5lZChQSl9XSU42NCkgJiYgUEpfV0lONjQgIT0gMCB8fCBcCisJICAgICAgIGRlZmluZWQoUEpfV0lOMzJfV0lOQ0UpICYmIFBKX1dJTjMyX1dJTkNFICE9IDAKKyAgICAgICAgICAgICAgICByYyA9IHBqX3NvY2tfcmVjdihoLT5mZCwgcmVhZF9vcC0+YnVmLCAmYnl0ZXNfcmVhZCwgCisJCQkJICByZWFkX29wLT5mbGFncyk7CisgICAgICAgICAgICAgICAgLy9yYyA9IFJlYWRGaWxlKChIQU5ETEUpaC0+ZmQsIHJlYWRfb3AtPmJ1ZiwgcmVhZF9vcC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgJmJ5dGVzX3JlYWQsIE5VTEwpOworIyAgICAgICAgICAgZWxpZiAoZGVmaW5lZChQSl9IQVNfVU5JU1REX0gpICYmIFBKX0hBU19VTklTVERfSCAhPSAwKQorICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSByZWFkKGgtPmZkLCByZWFkX29wLT5idWYsIGJ5dGVzX3JlYWQpOworICAgICAgICAgICAgICAgIHJjID0gKGJ5dGVzX3JlYWQgPj0gMCkgPyBQSl9TVUNDRVNTIDogcGpfZ2V0X29zX2Vycm9yKCk7CisjCSAgICBlbGlmIGRlZmluZWQoUEpfTElOVVhfS0VSTkVMKSAmJiBQSl9MSU5VWF9LRVJORUwgIT0gMAorICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSBzeXNfcmVhZChoLT5mZCwgcmVhZF9vcC0+YnVmLCBieXRlc19yZWFkKTsKKyAgICAgICAgICAgICAgICByYyA9IChieXRlc19yZWFkID49IDApID8gUEpfU1VDQ0VTUyA6IC1ieXRlc19yZWFkOworIyAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgIGVycm9yICJJbXBsZW1lbnQgcmVhZCgpIGZvciB0aGlzIHBsYXRmb3JtISIKKyMgICAgICAgICAgIGVuZGlmCisgICAgICAgIH0KKwkKKwlpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworIwkgICAgaWYgKGRlZmluZWQoUEpfV0lOMzIpICYmIFBKX1dJTjMyICE9IDApIHx8IFwKKwkgICAgICAgKGRlZmluZWQoUEpfV0lONjQpICYmIFBKX1dJTjY0ICE9IDApIAorCSAgICAvKiBPbiBXaW4zMiwgZm9yIFVEUCwgV1NBRUNPTk5SRVNFVCBvbiB0aGUgcmVjZWl2ZSBzaWRlIAorCSAgICAgKiBpbmRpY2F0ZXMgdGhhdCBwcmV2aW91cyBzZW5kaW5nIGhhcyB0cmlnZ2VyZWQgSUNNUCBQb3J0IAorCSAgICAgKiBVbnJlYWNoYWJsZSBtZXNzYWdlLgorCSAgICAgKiBCdXQgd2Ugd291bGRuJ3Qga25vdyBhdCB0aGlzIHBvaW50IHdoaWNoIG9uZSBvZiBwcmV2aW91cyAKKwkgICAgICoga2V5IHRoYXQgaGFzIHRyaWdnZXJlZCB0aGUgZXJyb3IsIHNpbmNlIFVEUCBzb2NrZXQgY2FuCisJICAgICAqIGJlIHNoYXJlZCEKKwkgICAgICogU28gd2UnbGwganVzdCBpZ25vcmUgaXQhCisJICAgICAqLworCisJICAgIGlmIChyYyA9PSBQSl9TVEFUVVNfRlJPTV9PUyhXU0FFQ09OTlJFU0VUKSkgeworCQkvL1BKX0xPRyg0LChUSElTX0ZJTEUsIAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICJJZ25vcmVkIElDTVAgcG9ydCB1bnJlYWNoLiBvbiBrZXk9JXAiLCBoKSk7CisJICAgIH0KKyMJICAgIGVuZGlmCisKKyAgICAgICAgICAgIC8qIEluIGFueSBjYXNlIHdlIHdvdWxkIHJlcG9ydCB0aGlzIHRvIGNhbGxlci4gKi8KKyAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSAtcmM7CisKKyNpZiBkZWZpbmVkKFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQpICYmIFwKKyAgICBQSl9JUEhPTkVfT1NfSEFTX01VTFRJVEFTS0lOR19TVVBQT1JUIT0wCisJICAgIC8qIFNwZWNpYWwgdHJlYXRtZW50IGZvciBkZWFkIFVEUCBzb2NrZXRzIGhlcmUsIHNlZSB0aWNrZXQgIzExMDcgKi8KKwkgICAgaWYgKHJjID09IFBKX1NUQVRVU19GUk9NX09TKEVOT1RDT05OKSAmJiAhSVNfQ0xPU0lORyhoKSAmJgorCQloLT5mZF90eXBlPT1wal9TT0NLX0RHUkFNKCkpCisJICAgIHsKKwkJcmVwbGFjZV91ZHBfc29jayhoKTsKKwkgICAgfQorI2VuZGlmCisJfQorCisJLyogVW5sb2NrOyBmcm9tIHRoaXMgcG9pbnQgd2UgZG9uJ3QgbmVlZCB0byBob2xkIGtleSdzIG11dGV4CisJICogKHVubGVzcyBjb25jdXJyZW5jeSBpcyBkaXNhYmxlZCwgd2hpY2ggaW4gdGhpcyBjYXNlIHdlIHNob3VsZAorCSAqIGhvbGQgdGhlIG11dGV4IHdoaWxlIGNhbGxpbmcgdGhlIGNhbGxiYWNrKSAqLworCWlmIChoLT5hbGxvd19jb25jdXJyZW50KSB7CisJICAgIC8qIGNvbmN1cnJlbmN5IG1heSBiZSBjaGFuZ2VkIHdoaWxlIHdlJ3JlIGluIHRoZSBjYWxsYmFjaywgc28KKwkgICAgICogc2F2ZSBpdCB0byBhIGZsYWcuCisJICAgICAqLworCSAgICBoYXNfbG9jayA9IFBKX0ZBTFNFOworCSAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoaCk7CisJICAgIFBKX1JBQ0VfTUUoNSk7CisJfSBlbHNlIHsKKwkgICAgaGFzX2xvY2sgPSBQSl9UUlVFOworCX0KKworCS8qIENhbGwgY2FsbGJhY2suICovCisgICAgICAgIGlmIChoLT5jYi5vbl9yZWFkX2NvbXBsZXRlICYmICFJU19DTE9TSU5HKGgpKSB7CisJICAgICgqaC0+Y2Iub25fcmVhZF9jb21wbGV0ZSkoaCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwal9pb3F1ZXVlX29wX2tleV90KilyZWFkX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19yZWFkKTsKKyAgICAgICAgfQorCisJaWYgKGhhc19sb2NrKSB7CisJICAgIHBqX2lvcXVldWVfdW5sb2NrX2tleShoKTsKKwl9CisKKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGlzIGlzIG5vcm1hbDsgZXhlY3V0aW9uIG1heSBmYWxsIGhlcmUgd2hlbiBtdWx0aXBsZSB0aHJlYWRzCisgICAgICAgICAqIGFyZSBzaWduYWxsZWQgZm9yIHRoZSBzYW1lIGV2ZW50LCBidXQgb25seSBvbmUgdGhyZWFkIGV2ZW50dWFsbHkKKyAgICAgICAgICogYWJsZSB0byBwcm9jZXNzIHRoZSBldmVudC4KKyAgICAgICAgICovCisJcGpfaW9xdWV1ZV91bmxvY2tfa2V5KGgpOworICAgIH0KK30KKworCit2b2lkIGlvcXVldWVfZGlzcGF0Y2hfZXhjZXB0aW9uX2V2ZW50KCBwal9pb3F1ZXVlX3QgKmlvcXVldWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqaCApCit7CisgICAgcGpfYm9vbF90IGhhc19sb2NrOworCisgICAgcGpfaW9xdWV1ZV9sb2NrX2tleShoKTsKKworICAgIGlmICghaC0+Y29ubmVjdGluZykgeworICAgICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IG1vcmUgdGhhbiBvbmUgdGhyZWFkIHdhcyB3b2tlbiB1cCwgdGh1cworICAgICAgICAgKiB0aGUgcmVtYWluaW5nIHRocmVhZCB3aWxsIHNlZSBoLT5jb25uZWN0aW5nIGFzIHplcm8gYmVjYXVzZQorICAgICAgICAgKiBpdCBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgb3RoZXIgdGhyZWFkLgorICAgICAgICAgKi8KKwlwal9pb3F1ZXVlX3VubG9ja19rZXkoaCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoSVNfQ0xPU0lORyhoKSkgeworCXBqX2lvcXVldWVfdW5sb2NrX2tleShoKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogQ2xlYXIgb3BlcmF0aW9uLiAqLworICAgIGgtPmNvbm5lY3RpbmcgPSAwOworCisgICAgaW9xdWV1ZV9yZW1vdmVfZnJvbV9zZXQoaW9xdWV1ZSwgaCwgV1JJVEVBQkxFX0VWRU5UKTsKKyAgICBpb3F1ZXVlX3JlbW92ZV9mcm9tX3NldChpb3F1ZXVlLCBoLCBFWENFUFRJT05fRVZFTlQpOworCisgICAgLyogVW5sb2NrOyBmcm9tIHRoaXMgcG9pbnQgd2UgZG9uJ3QgbmVlZCB0byBob2xkIGtleSdzIG11dGV4CisgICAgICogKHVubGVzcyBjb25jdXJyZW5jeSBpcyBkaXNhYmxlZCwgd2hpY2ggaW4gdGhpcyBjYXNlIHdlIHNob3VsZAorICAgICAqIGhvbGQgdGhlIG11dGV4IHdoaWxlIGNhbGxpbmcgdGhlIGNhbGxiYWNrKSAqLworICAgIGlmIChoLT5hbGxvd19jb25jdXJyZW50KSB7CisJLyogY29uY3VycmVuY3kgbWF5IGJlIGNoYW5nZWQgd2hpbGUgd2UncmUgaW4gdGhlIGNhbGxiYWNrLCBzbworCSAqIHNhdmUgaXQgdG8gYSBmbGFnLgorCSAqLworCWhhc19sb2NrID0gUEpfRkFMU0U7CisJcGpfaW9xdWV1ZV91bmxvY2tfa2V5KGgpOworCVBKX1JBQ0VfTUUoNSk7CisgICAgfSBlbHNlIHsKKwloYXNfbG9jayA9IFBKX1RSVUU7CisgICAgfQorCisgICAgLyogQ2FsbCBjYWxsYmFjay4gKi8KKyAgICBpZiAoaC0+Y2Iub25fY29ubmVjdF9jb21wbGV0ZSAmJiAhSVNfQ0xPU0lORyhoKSkgeworCXBqX3N0YXR1c190IHN0YXR1cyA9IC0xOworI2lmIChkZWZpbmVkKFBKX0hBU19TT19FUlJPUikgJiYgUEpfSEFTX1NPX0VSUk9SIT0wKQorCWludCB2YWx1ZTsKKwlpbnQgdmFsbGVuID0gc2l6ZW9mKHZhbHVlKTsKKwlpbnQgZ3NfcmMgPSBwal9zb2NrX2dldHNvY2tvcHQoaC0+ZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAKKwkJCQkgICAgICAgJnZhbHVlLCAmdmFsbGVuKTsKKwlpZiAoZ3NfcmMgPT0gMCkgeworCSAgICBzdGF0dXMgPSBQSl9SRVRVUk5fT1NfRVJST1IodmFsdWUpOworCX0KKyNlbmRpZgorCisJKCpoLT5jYi5vbl9jb25uZWN0X2NvbXBsZXRlKShoLCBzdGF0dXMpOworICAgIH0KKworICAgIGlmIChoYXNfbG9jaykgeworCXBqX2lvcXVldWVfdW5sb2NrX2tleShoKTsKKyAgICB9Cit9CisKKy8qCisgKiBwal9pb3F1ZXVlX3JlY3YoKQorICoKKyAqIFN0YXJ0IGFzeW5jaHJvbm91cyByZWN2KCkgZnJvbSB0aGUgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfcmVjdiggIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorCQkJCSAgICAgIHZvaWQgKmJ1ZmZlciwKKwkJCQkgICAgICBwal9zc2l6ZV90ICpsZW5ndGgsCisJCQkJICAgICAgdW5zaWduZWQgZmxhZ3MgKQoreworICAgIHN0cnVjdCByZWFkX29wZXJhdGlvbiAqcmVhZF9vcDsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oa2V5ICYmIG9wX2tleSAmJiBidWZmZXIgJiYgbGVuZ3RoLCBQSl9FSU5WQUwpOworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICAvKiBDaGVjayBpZiBrZXkgaXMgY2xvc2luZyAobmVlZCB0byBkbyB0aGlzIGZpcnN0IGJlZm9yZSBhY2Nlc3NpbmcKKyAgICAgKiBvdGhlciB2YXJpYWJsZXMsIHNpbmNlIHRoZXkgbWlnaHQgaGF2ZSBiZWVuIGRlc3Ryb3llZC4gU2VlIHRpY2tldAorICAgICAqICM0NjkpLgorICAgICAqLworICAgIGlmIChJU19DTE9TSU5HKGtleSkpCisJcmV0dXJuIFBKX0VDQU5DRUxMRUQ7CisKKyAgICByZWFkX29wID0gKHN0cnVjdCByZWFkX29wZXJhdGlvbiopb3Bfa2V5OworICAgIHJlYWRfb3AtPm9wID0gUEpfSU9RVUVVRV9PUF9OT05FOworCisgICAgLyogVHJ5IHRvIHNlZSBpZiB0aGVyZSdzIGRhdGEgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLiAKKyAgICAgKi8KKyAgICBpZiAoKGZsYWdzICYgUEpfSU9RVUVVRV9BTFdBWVNfQVNZTkMpID09IDApIHsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisJcGpfc3NpemVfdCBzaXplOworCisJc2l6ZSA9ICpsZW5ndGg7CisJc3RhdHVzID0gcGpfc29ja19yZWN2KGtleS0+ZmQsIGJ1ZmZlciwgJnNpemUsIGZsYWdzKTsKKwlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwkgICAgLyogWWVzISBEYXRhIGlzIGF2YWlsYWJsZSEgKi8KKwkgICAgKmxlbmd0aCA9IHNpemU7CisJICAgIHJldHVybiBQSl9TVUNDRVNTOworCX0gZWxzZSB7CisJICAgIC8qIElmIGVycm9yIGlzIG5vdCBFV09VTERCTE9DSyAob3IgRUFHQUlOIG9uIExpbnV4KSwgcmVwb3J0CisJICAgICAqIHRoZSBlcnJvciB0byBjYWxsZXIuCisJICAgICAqLworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NUQVRVU19GUk9NX09TKFBKX0JMT0NLSU5HX0VSUk9SX1ZBTCkpCisJCXJldHVybiBzdGF0dXM7CisJfQorICAgIH0KKworICAgIGZsYWdzICY9IH4oUEpfSU9RVUVVRV9BTFdBWVNfQVNZTkMpOworCisgICAgLyoKKyAgICAgKiBObyBkYXRhIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKyAgICAgKiBNdXN0IHNjaGVkdWxlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gdGhlIGlvcXVldWUuCisgICAgICovCisgICAgcmVhZF9vcC0+b3AgPSBQSl9JT1FVRVVFX09QX1JFQ1Y7CisgICAgcmVhZF9vcC0+YnVmID0gYnVmZmVyOworICAgIHJlYWRfb3AtPnNpemUgPSAqbGVuZ3RoOworICAgIHJlYWRfb3AtPmZsYWdzID0gZmxhZ3M7CisKKyAgICBwal9pb3F1ZXVlX2xvY2tfa2V5KGtleSk7CisgICAgLyogQ2hlY2sgYWdhaW4uIEhhbmRsZSBtYXkgaGF2ZSBiZWVuIGNsb3NlZCBhZnRlciB0aGUgcHJldmlvdXMgY2hlY2sKKyAgICAgKiBpbiBtdWx0aXRocmVhZGVkIGFwcC4gSWYgd2UgYWRkIGJhZCBoYW5kbGUgdG8gdGhlIHNldCBpdCB3aWxsCisgICAgICogY29ycnVwdCB0aGUgaW9xdWV1ZSBzZXQuIFNlZSAjOTEzCisgICAgICovCisgICAgaWYgKElTX0NMT1NJTkcoa2V5KSkgeworCXBqX2lvcXVldWVfdW5sb2NrX2tleShrZXkpOworCXJldHVybiBQSl9FQ0FOQ0VMTEVEOworICAgIH0KKyAgICBwal9saXN0X2luc2VydF9iZWZvcmUoJmtleS0+cmVhZF9saXN0LCByZWFkX29wKTsKKyAgICBpb3F1ZXVlX2FkZF90b19zZXQoa2V5LT5pb3F1ZXVlLCBrZXksIFJFQURBQkxFX0VWRU5UKTsKKyAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKworICAgIHJldHVybiBQSl9FUEVORElORzsKK30KKworLyoKKyAqIHBqX2lvcXVldWVfcmVjdmZyb20oKQorICoKKyAqIFN0YXJ0IGFzeW5jaHJvbm91cyByZWN2ZnJvbSgpIGZyb20gdGhlIHNvY2tldC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3JlY3Zmcm9tKCBwal9pb3F1ZXVlX2tleV90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCQkgICAgICAgICB2b2lkICpidWZmZXIsCisJCQkJICAgICAgICAgcGpfc3NpemVfdCAqbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncywKKwkJCQkgICAgICAgICBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCSAgICAgICAgIGludCAqYWRkcmxlbikKK3sKKyAgICBzdHJ1Y3QgcmVhZF9vcGVyYXRpb24gKnJlYWRfb3A7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGtleSAmJiBvcF9rZXkgJiYgYnVmZmVyICYmIGxlbmd0aCwgUEpfRUlOVkFMKTsKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgLyogQ2hlY2sgaWYga2V5IGlzIGNsb3NpbmcuICovCisgICAgaWYgKElTX0NMT1NJTkcoa2V5KSkKKwlyZXR1cm4gUEpfRUNBTkNFTExFRDsKKworICAgIHJlYWRfb3AgPSAoc3RydWN0IHJlYWRfb3BlcmF0aW9uKilvcF9rZXk7CisgICAgcmVhZF9vcC0+b3AgPSBQSl9JT1FVRVVFX09QX05PTkU7CisKKyAgICAvKiBUcnkgdG8gc2VlIGlmIHRoZXJlJ3MgZGF0YSBpbW1lZGlhdGVseSBhdmFpbGFibGUuIAorICAgICAqLworICAgIGlmICgoZmxhZ3MgJiBQSl9JT1FVRVVFX0FMV0FZU19BU1lOQykgPT0gMCkgeworCXBqX3N0YXR1c190IHN0YXR1czsKKwlwal9zc2l6ZV90IHNpemU7CisKKwlzaXplID0gKmxlbmd0aDsKKwlzdGF0dXMgPSBwal9zb2NrX3JlY3Zmcm9tKGtleS0+ZmQsIGJ1ZmZlciwgJnNpemUsIGZsYWdzLAorCQkJCSAgYWRkciwgYWRkcmxlbik7CisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJICAgIC8qIFllcyEgRGF0YSBpcyBhdmFpbGFibGUhICovCisJICAgICpsZW5ndGggPSBzaXplOworCSAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKwl9IGVsc2UgeworCSAgICAvKiBJZiBlcnJvciBpcyBub3QgRVdPVUxEQkxPQ0sgKG9yIEVBR0FJTiBvbiBMaW51eCksIHJlcG9ydAorCSAgICAgKiB0aGUgZXJyb3IgdG8gY2FsbGVyLgorCSAgICAgKi8KKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVEFUVVNfRlJPTV9PUyhQSl9CTE9DS0lOR19FUlJPUl9WQUwpKQorCQlyZXR1cm4gc3RhdHVzOworCX0KKyAgICB9CisKKyAgICBmbGFncyAmPSB+KFBKX0lPUVVFVUVfQUxXQVlTX0FTWU5DKTsKKworICAgIC8qCisgICAgICogTm8gZGF0YSBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUuCisgICAgICogTXVzdCBzY2hlZHVsZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHRoZSBpb3F1ZXVlLgorICAgICAqLworICAgIHJlYWRfb3AtPm9wID0gUEpfSU9RVUVVRV9PUF9SRUNWX0ZST007CisgICAgcmVhZF9vcC0+YnVmID0gYnVmZmVyOworICAgIHJlYWRfb3AtPnNpemUgPSAqbGVuZ3RoOworICAgIHJlYWRfb3AtPmZsYWdzID0gZmxhZ3M7CisgICAgcmVhZF9vcC0+cm10X2FkZHIgPSBhZGRyOworICAgIHJlYWRfb3AtPnJtdF9hZGRybGVuID0gYWRkcmxlbjsKKworICAgIHBqX2lvcXVldWVfbG9ja19rZXkoa2V5KTsKKyAgICAvKiBDaGVjayBhZ2Fpbi4gSGFuZGxlIG1heSBoYXZlIGJlZW4gY2xvc2VkIGFmdGVyIHRoZSBwcmV2aW91cyBjaGVjaworICAgICAqIGluIG11bHRpdGhyZWFkZWQgYXBwLiBJZiB3ZSBhZGQgYmFkIGhhbmRsZSB0byB0aGUgc2V0IGl0IHdpbGwKKyAgICAgKiBjb3JydXB0IHRoZSBpb3F1ZXVlIHNldC4gU2VlICM5MTMKKyAgICAgKi8KKyAgICBpZiAoSVNfQ0xPU0lORyhrZXkpKSB7CisJcGpfaW9xdWV1ZV91bmxvY2tfa2V5KGtleSk7CisJcmV0dXJuIFBKX0VDQU5DRUxMRUQ7CisgICAgfQorICAgIHBqX2xpc3RfaW5zZXJ0X2JlZm9yZSgma2V5LT5yZWFkX2xpc3QsIHJlYWRfb3ApOworICAgIGlvcXVldWVfYWRkX3RvX3NldChrZXktPmlvcXVldWUsIGtleSwgUkVBREFCTEVfRVZFTlQpOworICAgIHBqX2lvcXVldWVfdW5sb2NrX2tleShrZXkpOworCisgICAgcmV0dXJuIFBKX0VQRU5ESU5HOworfQorCisvKgorICogcGpfaW9xdWV1ZV9zZW5kKCkKKyAqCisgKiBTdGFydCBhc3luY2hyb25vdXMgc2VuZCgpIHRvIHRoZSBkZXNjcmlwdG9yLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfc2VuZCggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCSAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICAgICAgICAgIHBqX3NzaXplX3QgKmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICBzdHJ1Y3Qgd3JpdGVfb3BlcmF0aW9uICp3cml0ZV9vcDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgdW5zaWduZWQgcmV0cnk7CisgICAgcGpfc3NpemVfdCBzZW50OworCisgICAgUEpfQVNTRVJUX1JFVFVSTihrZXkgJiYgb3Bfa2V5ICYmIGRhdGEgJiYgbGVuZ3RoLCBQSl9FSU5WQUwpOworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICAvKiBDaGVjayBpZiBrZXkgaXMgY2xvc2luZy4gKi8KKyAgICBpZiAoSVNfQ0xPU0lORyhrZXkpKQorCXJldHVybiBQSl9FQ0FOQ0VMTEVEOworCisgICAgLyogV2UgY2FuIG5vdCB1c2UgUEpfSU9RVUVVRV9BTFdBWVNfQVNZTkMgZm9yIHNvY2tldCB3cml0ZS4gKi8KKyAgICBmbGFncyAmPSB+KFBKX0lPUVVFVUVfQUxXQVlTX0FTWU5DKTsKKworICAgIC8qIEZhc3QgdHJhY2s6CisgICAgICogICBUcnkgdG8gc2VuZCBkYXRhIGltbWVkaWF0ZWx5LCBvbmx5IGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyB3cml0ZSEKKyAgICAgKiBOb3RlOgorICAgICAqICBXZSBhcmUgc3BlY3VsYXRpbmcgdGhhdCB0aGUgbGlzdCBpcyBlbXB0eSBoZXJlIHdpdGhvdXQgcHJvcGVybHkKKyAgICAgKiAgYWNxdWlyaW5nIGlvcXVldWUncyBtdXRleCBmaXJzdC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgdG8gbWF4aW1pemUKKyAgICAgKiAgcGVyZm9ybWFuY2UgdmlhIHBhcmFsbGVsaXNtLgorICAgICAqCisgICAgICogIFRoaXMgc2hvdWxkIGJlIHNhZmUsIGJlY2F1c2U6CisgICAgICogICAgICAtIGJ5IGNvbnZlbnRpb24sIHdlIHJlcXVpcmUgY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgICAqICAgICAgICBrZXkgaXMgbm90IHVucmVnaXN0ZXJlZCB3aGlsZSBvdGhlciB0aHJlYWRzIGFyZSBpbnZva2luZworICAgICAqICAgICAgICBhbiBvcGVyYXRpb24gb24gdGhlIHNhbWUga2V5LgorICAgICAqICAgICAgLSBwal9saXN0X2VtcHR5KCkgaXMgc2FmZSB0byBiZSBpbnZva2VkIGJ5IG11bHRpcGxlIHRocmVhZHMsCisgICAgICogICAgICAgIGV2ZW4gd2hlbiBvdGhlciB0aHJlYWRzIGFyZSBtb2RpZnlpbmcgdGhlIGxpc3QuCisgICAgICovCisgICAgaWYgKHBqX2xpc3RfZW1wdHkoJmtleS0+d3JpdGVfbGlzdCkpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VlIGlmIGRhdGEgY2FuIGJlIHNlbnQgaW1tZWRpYXRlbHkuCisgICAgICAgICAqLworICAgICAgICBzZW50ID0gKmxlbmd0aDsKKyAgICAgICAgc3RhdHVzID0gcGpfc29ja19zZW5kKGtleS0+ZmQsIGRhdGEsICZzZW50LCBmbGFncyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgLyogU3VjY2VzcyEgKi8KKyAgICAgICAgICAgICpsZW5ndGggPSBzZW50OworICAgICAgICAgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBJZiBlcnJvciBpcyBub3QgRVdPVUxEQkxPQ0sgKG9yIEVBR0FJTiBvbiBMaW51eCksIHJlcG9ydAorICAgICAgICAgICAgICogdGhlIGVycm9yIHRvIGNhbGxlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVEFUVVNfRlJPTV9PUyhQSl9CTE9DS0lOR19FUlJPUl9WQUwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2NoZWR1bGUgYXN5bmNocm9ub3VzIHNlbmQuCisgICAgICovCisgICAgd3JpdGVfb3AgPSAoc3RydWN0IHdyaXRlX29wZXJhdGlvbiopb3Bfa2V5OworCisgICAgLyogU3BpbiBpZiB3cml0ZV9vcCBoYXMgcGVuZGluZyBvcGVyYXRpb24gKi8KKyAgICBmb3IgKHJldHJ5PTA7IHdyaXRlX29wLT5vcCAhPSAwICYmIHJldHJ5PFBFTkRJTkdfUkVUUlk7ICsrcmV0cnkpCisJcGpfdGhyZWFkX3NsZWVwKDApOworCisgICAgLyogTGFzdCBjaGFuY2UgKi8KKyAgICBpZiAod3JpdGVfb3AtPm9wKSB7CisJLyogVW5hYmxlIHRvIHNlbmQgcGFja2V0IGJlY2F1c2UgdGhlcmUgaXMgYWxyZWFkeSBwZW5kaW5nIHdyaXRlIGluIHRoZQorCSAqIHdyaXRlX29wLiBXZSBjb3VsZCBub3QgcHV0IHRoZSBvcGVyYXRpb24gaW50byB0aGUgd3JpdGVfb3AKKwkgKiBiZWNhdXNlIHdyaXRlX29wIGFscmVhZHkgY29udGFpbnMgYSBwZW5kaW5nIG9wZXJhdGlvbiEgQW5kCisJICogd2UgY291bGQgbm90IHNlbmQgdGhlIHBhY2tldCBkaXJlY3RseSB3aXRoIHNlbmQoKSBlaXRoZXIsCisJICogYmVjYXVzZSB0aGF0IHdpbGwgYnJlYWsgdGhlIG9yZGVyIG9mIHRoZSBwYWNrZXQuIFNvIHdlIGNhbgorCSAqIG9ubHkgcmV0dXJuIGVycm9yIGhlcmUuCisJICoKKwkgKiBUaGlzIGNvdWxkIGhhcHBlbiBmb3IgZXhhbXBsZSBpbiBtdWx0aXRocmVhZHMgcHJvZ3JhbSwKKwkgKiB3aGVyZSBwb2xsaW5nIGlzIGRvbmUgYnkgb25lIHRocmVhZCwgd2hpbGUgb3RoZXIgdGhyZWFkcyBhcmUgZG9pbmcKKwkgKiB0aGUgc2VuZGluZyBvbmx5LiBJZiB0aGUgcG9sbGluZyB0aHJlYWQgcnVucyBvbiBsb3dlciBwcmlvcml0eQorCSAqIHRoYW4gdGhlIHNlbmRpbmcgdGhyZWFkLCB0aGVuIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgcGVuZGluZworCSAqIHdyaXRlIGZsYWcgaXMgbm90IGNsZWFyZWQgaW4tdGltZSBiZWNhdXNlIGNsZWFyaW5nIGlzIG9ubHkgZG9uZQorCSAqIGR1cmluZyBwb2xsaW5nLiAKKwkgKgorCSAqIEFwbGljYXRpb24gc2hvdWxkIHNwZWNpZnkgbXVsdGlwbGUgd3JpdGUgb3BlcmF0aW9uIGtleXMgb24KKwkgKiBzaXR1YXRpb24gbGlrZSB0aGlzLgorCSAqLworCS8vcGpfYXNzZXJ0KCEiaW9xdWV1ZTogdGhlcmUgaXMgcGVuZGluZyBvcGVyYXRpb24gb24gdGhpcyBrZXkhIik7CisJcmV0dXJuIFBKX0VCVVNZOworICAgIH0KKworICAgIHdyaXRlX29wLT5vcCA9IFBKX0lPUVVFVUVfT1BfU0VORDsKKyAgICB3cml0ZV9vcC0+YnVmID0gKGNoYXIqKWRhdGE7CisgICAgd3JpdGVfb3AtPnNpemUgPSAqbGVuZ3RoOworICAgIHdyaXRlX29wLT53cml0dGVuID0gMDsKKyAgICB3cml0ZV9vcC0+ZmxhZ3MgPSBmbGFnczsKKyAgICAKKyAgICBwal9pb3F1ZXVlX2xvY2tfa2V5KGtleSk7CisgICAgLyogQ2hlY2sgYWdhaW4uIEhhbmRsZSBtYXkgaGF2ZSBiZWVuIGNsb3NlZCBhZnRlciB0aGUgcHJldmlvdXMgY2hlY2sKKyAgICAgKiBpbiBtdWx0aXRocmVhZGVkIGFwcC4gSWYgd2UgYWRkIGJhZCBoYW5kbGUgdG8gdGhlIHNldCBpdCB3aWxsCisgICAgICogY29ycnVwdCB0aGUgaW9xdWV1ZSBzZXQuIFNlZSAjOTEzCisgICAgICovCisgICAgaWYgKElTX0NMT1NJTkcoa2V5KSkgeworCXBqX2lvcXVldWVfdW5sb2NrX2tleShrZXkpOworCXJldHVybiBQSl9FQ0FOQ0VMTEVEOworICAgIH0KKyAgICBwal9saXN0X2luc2VydF9iZWZvcmUoJmtleS0+d3JpdGVfbGlzdCwgd3JpdGVfb3ApOworICAgIGlvcXVldWVfYWRkX3RvX3NldChrZXktPmlvcXVldWUsIGtleSwgV1JJVEVBQkxFX0VWRU5UKTsKKyAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKworICAgIHJldHVybiBQSl9FUEVORElORzsKK30KKworCisvKgorICogcGpfaW9xdWV1ZV9zZW5kdG8oKQorICoKKyAqIFN0YXJ0IGFzeW5jaHJvbm91cyB3cml0ZSgpIHRvIHRoZSBkZXNjcmlwdG9yLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfc2VuZHRvKCBwal9pb3F1ZXVlX2tleV90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisJCQkgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICAgICAgICAgICAgcGpfc3NpemVfdCAqbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdWludDMyX3QgZmxhZ3MsCisJCQkgICAgICAgICAgICAgICBjb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJICAgICAgICAgICAgICAgaW50IGFkZHJsZW4pCit7CisgICAgc3RydWN0IHdyaXRlX29wZXJhdGlvbiAqd3JpdGVfb3A7CisgICAgdW5zaWduZWQgcmV0cnk7CisgICAgcGpfYm9vbF90IHJlc3RhcnRfcmV0cnkgPSBQSl9GQUxTRTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgcGpfc3NpemVfdCBzZW50OworCisgICAgUEpfQVNTRVJUX1JFVFVSTihrZXkgJiYgb3Bfa2V5ICYmIGRhdGEgJiYgbGVuZ3RoLCBQSl9FSU5WQUwpOworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyNpZiBkZWZpbmVkKFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQpICYmIFwKKwkgICAgUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCE9MAorcmV0cnlfb25fcmVzdGFydDoKKyNlbHNlCisgICAgUEpfVU5VU0VEX0FSRyhyZXN0YXJ0X3JldHJ5KTsKKyNlbmRpZgorICAgIC8qIENoZWNrIGlmIGtleSBpcyBjbG9zaW5nLiAqLworICAgIGlmIChJU19DTE9TSU5HKGtleSkpCisJcmV0dXJuIFBKX0VDQU5DRUxMRUQ7CisKKyAgICAvKiBXZSBjYW4gbm90IHVzZSBQSl9JT1FVRVVFX0FMV0FZU19BU1lOQyBmb3Igc29ja2V0IHdyaXRlICovCisgICAgZmxhZ3MgJj0gfihQSl9JT1FVRVVFX0FMV0FZU19BU1lOQyk7CisKKyAgICAvKiBGYXN0IHRyYWNrOgorICAgICAqICAgVHJ5IHRvIHNlbmQgZGF0YSBpbW1lZGlhdGVseSwgb25seSBpZiB0aGVyZSdzIG5vIHBlbmRpbmcgd3JpdGUhCisgICAgICogTm90ZToKKyAgICAgKiAgV2UgYXJlIHNwZWN1bGF0aW5nIHRoYXQgdGhlIGxpc3QgaXMgZW1wdHkgaGVyZSB3aXRob3V0IHByb3Blcmx5CisgICAgICogIGFjcXVpcmluZyBpb3F1ZXVlJ3MgbXV0ZXggZmlyc3QuIFRoaXMgaXMgaW50ZW50aW9uYWwsIHRvIG1heGltaXplCisgICAgICogIHBlcmZvcm1hbmNlIHZpYSBwYXJhbGxlbGlzbS4KKyAgICAgKgorICAgICAqICBUaGlzIHNob3VsZCBiZSBzYWZlLCBiZWNhdXNlOgorICAgICAqICAgICAgLSBieSBjb252ZW50aW9uLCB3ZSByZXF1aXJlIGNhbGxlciB0byBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgICAgKiAgICAgICAga2V5IGlzIG5vdCB1bnJlZ2lzdGVyZWQgd2hpbGUgb3RoZXIgdGhyZWFkcyBhcmUgaW52b2tpbmcKKyAgICAgKiAgICAgICAgYW4gb3BlcmF0aW9uIG9uIHRoZSBzYW1lIGtleS4KKyAgICAgKiAgICAgIC0gcGpfbGlzdF9lbXB0eSgpIGlzIHNhZmUgdG8gYmUgaW52b2tlZCBieSBtdWx0aXBsZSB0aHJlYWRzLAorICAgICAqICAgICAgICBldmVuIHdoZW4gb3RoZXIgdGhyZWFkcyBhcmUgbW9kaWZ5aW5nIHRoZSBsaXN0LgorICAgICAqLworICAgIGlmIChwal9saXN0X2VtcHR5KCZrZXktPndyaXRlX2xpc3QpKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNlZSBpZiBkYXRhIGNhbiBiZSBzZW50IGltbWVkaWF0ZWx5LgorICAgICAgICAgKi8KKyAgICAgICAgc2VudCA9ICpsZW5ndGg7CisgICAgICAgIHN0YXR1cyA9IHBqX3NvY2tfc2VuZHRvKGtleS0+ZmQsIGRhdGEsICZzZW50LCBmbGFncywgYWRkciwgYWRkcmxlbik7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgLyogU3VjY2VzcyEgKi8KKyAgICAgICAgICAgICpsZW5ndGggPSBzZW50OworICAgICAgICAgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBJZiBlcnJvciBpcyBub3QgRVdPVUxEQkxPQ0sgKG9yIEVBR0FJTiBvbiBMaW51eCksIHJlcG9ydAorICAgICAgICAgICAgICogdGhlIGVycm9yIHRvIGNhbGxlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVEFUVVNfRlJPTV9PUyhQSl9CTE9DS0lOR19FUlJPUl9WQUwpKSB7CisjaWYgZGVmaW5lZChQSl9JUEhPTkVfT1NfSEFTX01VTFRJVEFTS0lOR19TVVBQT1JUKSAmJiBcCisJICAgIFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQhPTAKKwkJLyogU3BlY2lhbCB0cmVhdG1lbnQgZm9yIGRlYWQgVURQIHNvY2tldHMgaGVyZSwgc2VlIHRpY2tldCAjMTEwNyAqLworCQlpZiAoc3RhdHVzPT1QSl9TVEFUVVNfRlJPTV9PUyhFUElQRSkgJiYgIUlTX0NMT1NJTkcoa2V5KSAmJgorCQkgICAga2V5LT5mZF90eXBlPT1wal9TT0NLX0RHUkFNKCkgJiYgIXJlc3RhcnRfcmV0cnkpCisJCXsKKwkJICAgIFBKX1BFUlJPUig0LChUSElTX0ZJTEUsIHN0YXR1cywKKwkJCQkgIlNlbmQgZXJyb3IgZm9yIHNvY2tldCAlZCwgcmV0cnlpbmciLAorCQkJCSBrZXktPmZkKSk7CisJCSAgICByZXBsYWNlX3VkcF9zb2NrKGtleSk7CisJCSAgICByZXN0YXJ0X3JldHJ5ID0gUEpfVFJVRTsKKwkJICAgIGdvdG8gcmV0cnlfb25fcmVzdGFydDsKKwkJfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCSAgICBzdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoYXQgYWRkcmVzcyBzdG9yYWdlIGNhbiBob2xkIHRoZSBhZGRyZXNzIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFkZHJsZW4gPD0gKGludClzaXplb2YocGpfc29ja2FkZHJfaW4pLCBQSl9FQlVHKTsKKworICAgIC8qCisgICAgICogU2NoZWR1bGUgYXN5bmNocm9ub3VzIHNlbmQuCisgICAgICovCisgICAgd3JpdGVfb3AgPSAoc3RydWN0IHdyaXRlX29wZXJhdGlvbiopb3Bfa2V5OworICAgIAorICAgIC8qIFNwaW4gaWYgd3JpdGVfb3AgaGFzIHBlbmRpbmcgb3BlcmF0aW9uICovCisgICAgZm9yIChyZXRyeT0wOyB3cml0ZV9vcC0+b3AgIT0gMCAmJiByZXRyeTxQRU5ESU5HX1JFVFJZOyArK3JldHJ5KQorCXBqX3RocmVhZF9zbGVlcCgwKTsKKworICAgIC8qIExhc3QgY2hhbmNlICovCisgICAgaWYgKHdyaXRlX29wLT5vcCkgeworCS8qIFVuYWJsZSB0byBzZW5kIHBhY2tldCBiZWNhdXNlIHRoZXJlIGlzIGFscmVhZHkgcGVuZGluZyB3cml0ZSBvbiB0aGUKKwkgKiB3cml0ZV9vcC4gV2UgY291bGQgbm90IHB1dCB0aGUgb3BlcmF0aW9uIGludG8gdGhlIHdyaXRlX29wCisJICogYmVjYXVzZSB3cml0ZV9vcCBhbHJlYWR5IGNvbnRhaW5zIGEgcGVuZGluZyBvcGVyYXRpb24hIEFuZAorCSAqIHdlIGNvdWxkIG5vdCBzZW5kIHRoZSBwYWNrZXQgZGlyZWN0bHkgd2l0aCBzZW5kdG8oKSBlaXRoZXIsCisJICogYmVjYXVzZSB0aGF0IHdpbGwgYnJlYWsgdGhlIG9yZGVyIG9mIHRoZSBwYWNrZXQuIFNvIHdlIGNhbgorCSAqIG9ubHkgcmV0dXJuIGVycm9yIGhlcmUuCisJICoKKwkgKiBUaGlzIGNvdWxkIGhhcHBlbiBmb3IgZXhhbXBsZSBpbiBtdWx0aXRocmVhZHMgcHJvZ3JhbSwKKwkgKiB3aGVyZSBwb2xsaW5nIGlzIGRvbmUgYnkgb25lIHRocmVhZCwgd2hpbGUgb3RoZXIgdGhyZWFkcyBhcmUgZG9pbmcKKwkgKiB0aGUgc2VuZGluZyBvbmx5LiBJZiB0aGUgcG9sbGluZyB0aHJlYWQgcnVucyBvbiBsb3dlciBwcmlvcml0eQorCSAqIHRoYW4gdGhlIHNlbmRpbmcgdGhyZWFkLCB0aGVuIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgcGVuZGluZworCSAqIHdyaXRlIGZsYWcgaXMgbm90IGNsZWFyZWQgaW4tdGltZSBiZWNhdXNlIGNsZWFyaW5nIGlzIG9ubHkgZG9uZQorCSAqIGR1cmluZyBwb2xsaW5nLiAKKwkgKgorCSAqIEFwbGljYXRpb24gc2hvdWxkIHNwZWNpZnkgbXVsdGlwbGUgd3JpdGUgb3BlcmF0aW9uIGtleXMgb24KKwkgKiBzaXR1YXRpb24gbGlrZSB0aGlzLgorCSAqLworCS8vcGpfYXNzZXJ0KCEiaW9xdWV1ZTogdGhlcmUgaXMgcGVuZGluZyBvcGVyYXRpb24gb24gdGhpcyBrZXkhIik7CisJcmV0dXJuIFBKX0VCVVNZOworICAgIH0KKworICAgIHdyaXRlX29wLT5vcCA9IFBKX0lPUVVFVUVfT1BfU0VORF9UTzsKKyAgICB3cml0ZV9vcC0+YnVmID0gKGNoYXIqKWRhdGE7CisgICAgd3JpdGVfb3AtPnNpemUgPSAqbGVuZ3RoOworICAgIHdyaXRlX29wLT53cml0dGVuID0gMDsKKyAgICB3cml0ZV9vcC0+ZmxhZ3MgPSBmbGFnczsKKyAgICBwal9tZW1jcHkoJndyaXRlX29wLT5ybXRfYWRkciwgYWRkciwgYWRkcmxlbik7CisgICAgd3JpdGVfb3AtPnJtdF9hZGRybGVuID0gYWRkcmxlbjsKKyAgICAKKyAgICBwal9pb3F1ZXVlX2xvY2tfa2V5KGtleSk7CisgICAgLyogQ2hlY2sgYWdhaW4uIEhhbmRsZSBtYXkgaGF2ZSBiZWVuIGNsb3NlZCBhZnRlciB0aGUgcHJldmlvdXMgY2hlY2sKKyAgICAgKiBpbiBtdWx0aXRocmVhZGVkIGFwcC4gSWYgd2UgYWRkIGJhZCBoYW5kbGUgdG8gdGhlIHNldCBpdCB3aWxsCisgICAgICogY29ycnVwdCB0aGUgaW9xdWV1ZSBzZXQuIFNlZSAjOTEzCisgICAgICovCisgICAgaWYgKElTX0NMT1NJTkcoa2V5KSkgeworCXBqX2lvcXVldWVfdW5sb2NrX2tleShrZXkpOworCXJldHVybiBQSl9FQ0FOQ0VMTEVEOworICAgIH0KKyAgICBwal9saXN0X2luc2VydF9iZWZvcmUoJmtleS0+d3JpdGVfbGlzdCwgd3JpdGVfb3ApOworICAgIGlvcXVldWVfYWRkX3RvX3NldChrZXktPmlvcXVldWUsIGtleSwgV1JJVEVBQkxFX0VWRU5UKTsKKyAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKworICAgIHJldHVybiBQSl9FUEVORElORzsKK30KKworI2lmIFBKX0hBU19UQ1AKKy8qCisgKiBJbml0aWF0ZSBvdmVybGFwcGVkIGFjY2VwdCgpIG9wZXJhdGlvbi4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX2FjY2VwdCggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorCQkJICAgICAgICAgICAgICAgcGpfc29ja190ICpuZXdfc29jaywKKwkJCSAgICAgICAgICAgICAgIHBqX3NvY2thZGRyX3QgKmxvY2FsLAorCQkJICAgICAgICAgICAgICAgcGpfc29ja2FkZHJfdCAqcmVtb3RlLAorCQkJICAgICAgICAgICAgICAgaW50ICphZGRybGVuKQoreworICAgIHN0cnVjdCBhY2NlcHRfb3BlcmF0aW9uICphY2NlcHRfb3A7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogY2hlY2sgcGFyYW1ldGVycy4gQWxsIG11c3QgYmUgc3BlY2lmaWVkISAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oa2V5ICYmIG9wX2tleSAmJiBuZXdfc29jaywgUEpfRUlOVkFMKTsKKworICAgIC8qIENoZWNrIGlmIGtleSBpcyBjbG9zaW5nLiAqLworICAgIGlmIChJU19DTE9TSU5HKGtleSkpCisJcmV0dXJuIFBKX0VDQU5DRUxMRUQ7CisKKyAgICBhY2NlcHRfb3AgPSAoc3RydWN0IGFjY2VwdF9vcGVyYXRpb24qKW9wX2tleTsKKyAgICBhY2NlcHRfb3AtPm9wID0gUEpfSU9RVUVVRV9PUF9OT05FOworCisgICAgLyogRmFzdCB0cmFjazoKKyAgICAgKiAgU2VlIGlmIHRoZXJlJ3MgbmV3IGNvbm5lY3Rpb24gYXZhaWxhYmxlIGltbWVkaWF0ZWx5LgorICAgICAqLworICAgIGlmIChwal9saXN0X2VtcHR5KCZrZXktPmFjY2VwdF9saXN0KSkgeworICAgICAgICBzdGF0dXMgPSBwal9zb2NrX2FjY2VwdChrZXktPmZkLCBuZXdfc29jaywgcmVtb3RlLCBhZGRybGVuKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICAvKiBZZXMhIE5ldyBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZSEgKi8KKyAgICAgICAgICAgIGlmIChsb2NhbCAmJiBhZGRybGVuKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGpfc29ja19nZXRzb2NrbmFtZSgqbmV3X3NvY2ssIGxvY2FsLCBhZGRybGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgcGpfc29ja19jbG9zZSgqbmV3X3NvY2spOworICAgICAgICAgICAgICAgICAgICAqbmV3X3NvY2sgPSBQSl9JTlZBTElEX1NPQ0tFVDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIElmIGVycm9yIGlzIG5vdCBFV09VTERCTE9DSyAob3IgRUFHQUlOIG9uIExpbnV4KSwgcmVwb3J0CisgICAgICAgICAgICAgKiB0aGUgZXJyb3IgdG8gY2FsbGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NUQVRVU19GUk9NX09TKFBKX0JMT0NLSU5HX0VSUk9SX1ZBTCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBObyBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseS4KKyAgICAgKiBTY2hlZHVsZSBhY2NlcHQoKSBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkIHdoZW4gdGhlcmUgaXMgaW5jb21pbmcKKyAgICAgKiBjb25uZWN0aW9uIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBhY2NlcHRfb3AtPm9wID0gUEpfSU9RVUVVRV9PUF9BQ0NFUFQ7CisgICAgYWNjZXB0X29wLT5hY2NlcHRfZmQgPSBuZXdfc29jazsKKyAgICBhY2NlcHRfb3AtPnJtdF9hZGRyID0gcmVtb3RlOworICAgIGFjY2VwdF9vcC0+YWRkcmxlbj0gYWRkcmxlbjsKKyAgICBhY2NlcHRfb3AtPmxvY2FsX2FkZHIgPSBsb2NhbDsKKworICAgIHBqX2lvcXVldWVfbG9ja19rZXkoa2V5KTsKKyAgICAvKiBDaGVjayBhZ2Fpbi4gSGFuZGxlIG1heSBoYXZlIGJlZW4gY2xvc2VkIGFmdGVyIHRoZSBwcmV2aW91cyBjaGVjaworICAgICAqIGluIG11bHRpdGhyZWFkZWQgYXBwLiBJZiB3ZSBhZGQgYmFkIGhhbmRsZSB0byB0aGUgc2V0IGl0IHdpbGwKKyAgICAgKiBjb3JydXB0IHRoZSBpb3F1ZXVlIHNldC4gU2VlICM5MTMKKyAgICAgKi8KKyAgICBpZiAoSVNfQ0xPU0lORyhrZXkpKSB7CisJcGpfaW9xdWV1ZV91bmxvY2tfa2V5KGtleSk7CisJcmV0dXJuIFBKX0VDQU5DRUxMRUQ7CisgICAgfQorICAgIHBqX2xpc3RfaW5zZXJ0X2JlZm9yZSgma2V5LT5hY2NlcHRfbGlzdCwgYWNjZXB0X29wKTsKKyAgICBpb3F1ZXVlX2FkZF90b19zZXQoa2V5LT5pb3F1ZXVlLCBrZXksIFJFQURBQkxFX0VWRU5UKTsKKyAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKworICAgIHJldHVybiBQSl9FUEVORElORzsKK30KKworLyoKKyAqIEluaXRpYXRlIG92ZXJsYXBwZWQgY29ubmVjdCgpIG9wZXJhdGlvbiAod2VsbCwgaXQncyBub24tYmxvY2tpbmcgYWN0dWFsbHksCisgKiBzaW5jZSB0aGVyZSdzIG5vIG92ZXJsYXBwZWQgdmVyc2lvbiBvZiBjb25uZWN0KCkpLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfY29ubmVjdCggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorCQkJCQljb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCQlpbnQgYWRkcmxlbiApCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIC8qIGNoZWNrIHBhcmFtZXRlcnMuIEFsbCBtdXN0IGJlIHNwZWNpZmllZCEgKi8KKyAgICBQSl9BU1NFUlRfUkVUVVJOKGtleSAmJiBhZGRyICYmIGFkZHJsZW4sIFBKX0VJTlZBTCk7CisKKyAgICAvKiBDaGVjayBpZiBrZXkgaXMgY2xvc2luZy4gKi8KKyAgICBpZiAoSVNfQ0xPU0lORyhrZXkpKQorCXJldHVybiBQSl9FQ0FOQ0VMTEVEOworCisgICAgLyogQ2hlY2sgaWYgc29ja2V0IGhhcyBub3QgYmVlbiBtYXJrZWQgZm9yIGNvbm5lY3RpbmcgKi8KKyAgICBpZiAoa2V5LT5jb25uZWN0aW5nICE9IDApCisgICAgICAgIHJldHVybiBQSl9FUEVORElORzsKKyAgICAKKyAgICBzdGF0dXMgPSBwal9zb2NrX2Nvbm5lY3Qoa2V5LT5mZCwgYWRkciwgYWRkcmxlbik7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJLyogQ29ubmVjdGVkISAqLworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0gZWxzZSB7CisJaWYgKHN0YXR1cyA9PSBQSl9TVEFUVVNfRlJPTV9PUyhQSl9CTE9DS0lOR19DT05ORUNUX0VSUk9SX1ZBTCkpIHsKKwkgICAgLyogUGVuZGluZyEgKi8KKwkgICAgcGpfaW9xdWV1ZV9sb2NrX2tleShrZXkpOworCSAgICAvKiBDaGVjayBhZ2Fpbi4gSGFuZGxlIG1heSBoYXZlIGJlZW4gY2xvc2VkIGFmdGVyIHRoZSBwcmV2aW91cyAKKwkgICAgICogY2hlY2sgaW4gbXVsdGl0aHJlYWRlZCBhcHAuIFNlZSAjOTEzCisJICAgICAqLworCSAgICBpZiAoSVNfQ0xPU0lORyhrZXkpKSB7CisJCXBqX2lvcXVldWVfdW5sb2NrX2tleShrZXkpOworCQlyZXR1cm4gUEpfRUNBTkNFTExFRDsKKwkgICAgfQorCSAgICBrZXktPmNvbm5lY3RpbmcgPSBQSl9UUlVFOworICAgICAgICAgICAgaW9xdWV1ZV9hZGRfdG9fc2V0KGtleS0+aW9xdWV1ZSwga2V5LCBXUklURUFCTEVfRVZFTlQpOworICAgICAgICAgICAgaW9xdWV1ZV9hZGRfdG9fc2V0KGtleS0+aW9xdWV1ZSwga2V5LCBFWENFUFRJT05fRVZFTlQpOworICAgICAgICAgICAgcGpfaW9xdWV1ZV91bmxvY2tfa2V5KGtleSk7CisJICAgIHJldHVybiBQSl9FUEVORElORzsKKwl9IGVsc2UgeworCSAgICAvKiBFcnJvciEgKi8KKwkgICAgcmV0dXJuIHN0YXR1czsKKwl9CisgICAgfQorfQorI2VuZGlmCS8qIFBKX0hBU19UQ1AgKi8KKworCitQSl9ERUYodm9pZCkgcGpfaW9xdWV1ZV9vcF9rZXlfaW5pdCggcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorCQkJCSAgICAgcGpfc2l6ZV90IHNpemUgKQoreworICAgIHBqX2J6ZXJvKG9wX2tleSwgc2l6ZSk7Cit9CisKKworLyoKKyAqIHBqX2lvcXVldWVfaXNfcGVuZGluZygpCisgKi8KK1BKX0RFRihwal9ib29sX3QpIHBqX2lvcXVldWVfaXNfcGVuZGluZyggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXkgKQoreworICAgIHN0cnVjdCBnZW5lcmljX29wZXJhdGlvbiAqb3BfcmVjOworCisgICAgUEpfVU5VU0VEX0FSRyhrZXkpOworCisgICAgb3BfcmVjID0gKHN0cnVjdCBnZW5lcmljX29wZXJhdGlvbiopb3Bfa2V5OworICAgIHJldHVybiBvcF9yZWMtPm9wICE9IDA7Cit9CisKKworLyoKKyAqIHBqX2lvcXVldWVfcG9zdF9jb21wbGV0aW9uKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3Bvc3RfY29tcGxldGlvbiggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc3NpemVfdCBieXRlc19zdGF0dXMgKQoreworICAgIHN0cnVjdCBnZW5lcmljX29wZXJhdGlvbiAqb3BfcmVjOworCisgICAgLyoKKyAgICAgKiBGaW5kIHRoZSBvcGVyYXRpb24ga2V5IGluIGFsbCBwZW5kaW5nIG9wZXJhdGlvbiBsaXN0IHRvCisgICAgICogcmVhbGx5IG1ha2Ugc3VyZSB0aGF0IGl0J3Mgc3RpbGwgdGhlcmU7IHRoZW4gY2FsbCB0aGUgY2FsbGJhY2suCisgICAgICovCisgICAgcGpfaW9xdWV1ZV9sb2NrX2tleShrZXkpOworCisgICAgLyogRmluZCB0aGUgb3BlcmF0aW9uIGluIHRoZSBwZW5kaW5nIHJlYWQgbGlzdC4gKi8KKyAgICBvcF9yZWMgPSAoc3RydWN0IGdlbmVyaWNfb3BlcmF0aW9uKilrZXktPnJlYWRfbGlzdC5uZXh0OworICAgIHdoaWxlIChvcF9yZWMgIT0gKHZvaWQqKSZrZXktPnJlYWRfbGlzdCkgeworICAgICAgICBpZiAob3BfcmVjID09ICh2b2lkKilvcF9rZXkpIHsKKyAgICAgICAgICAgIHBqX2xpc3RfZXJhc2Uob3BfcmVjKTsKKyAgICAgICAgICAgIG9wX3JlYy0+b3AgPSBQSl9JT1FVRVVFX09QX05PTkU7CisgICAgICAgICAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKworICAgICAgICAgICAgKCprZXktPmNiLm9uX3JlYWRfY29tcGxldGUpKGtleSwgb3Bfa2V5LCBieXRlc19zdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgb3BfcmVjID0gb3BfcmVjLT5uZXh0OworICAgIH0KKworICAgIC8qIEZpbmQgdGhlIG9wZXJhdGlvbiBpbiB0aGUgcGVuZGluZyB3cml0ZSBsaXN0LiAqLworICAgIG9wX3JlYyA9IChzdHJ1Y3QgZ2VuZXJpY19vcGVyYXRpb24qKWtleS0+d3JpdGVfbGlzdC5uZXh0OworICAgIHdoaWxlIChvcF9yZWMgIT0gKHZvaWQqKSZrZXktPndyaXRlX2xpc3QpIHsKKyAgICAgICAgaWYgKG9wX3JlYyA9PSAodm9pZCopb3Bfa2V5KSB7CisgICAgICAgICAgICBwal9saXN0X2VyYXNlKG9wX3JlYyk7CisgICAgICAgICAgICBvcF9yZWMtPm9wID0gUEpfSU9RVUVVRV9PUF9OT05FOworICAgICAgICAgICAgcGpfaW9xdWV1ZV91bmxvY2tfa2V5KGtleSk7CisKKyAgICAgICAgICAgICgqa2V5LT5jYi5vbl93cml0ZV9jb21wbGV0ZSkoa2V5LCBvcF9rZXksIGJ5dGVzX3N0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBvcF9yZWMgPSBvcF9yZWMtPm5leHQ7CisgICAgfQorCisgICAgLyogRmluZCB0aGUgb3BlcmF0aW9uIGluIHRoZSBwZW5kaW5nIGFjY2VwdCBsaXN0LiAqLworICAgIG9wX3JlYyA9IChzdHJ1Y3QgZ2VuZXJpY19vcGVyYXRpb24qKWtleS0+YWNjZXB0X2xpc3QubmV4dDsKKyAgICB3aGlsZSAob3BfcmVjICE9ICh2b2lkKikma2V5LT5hY2NlcHRfbGlzdCkgeworICAgICAgICBpZiAob3BfcmVjID09ICh2b2lkKilvcF9rZXkpIHsKKyAgICAgICAgICAgIHBqX2xpc3RfZXJhc2Uob3BfcmVjKTsKKyAgICAgICAgICAgIG9wX3JlYy0+b3AgPSBQSl9JT1FVRVVFX09QX05PTkU7CisgICAgICAgICAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKworICAgICAgICAgICAgKCprZXktPmNiLm9uX2FjY2VwdF9jb21wbGV0ZSkoa2V5LCBvcF9rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfSU5WQUxJRF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGpfc3RhdHVzX3QpYnl0ZXNfc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBQSl9TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIG9wX3JlYyA9IG9wX3JlYy0+bmV4dDsKKyAgICB9CisKKyAgICBwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKyAgICAKKyAgICByZXR1cm4gUEpfRUlOVkFMSURPUDsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3NldF9kZWZhdWx0X2NvbmN1cnJlbmN5KCBwal9pb3F1ZXVlX3QgKmlvcXVldWUsCisJCQkJCQkJcGpfYm9vbF90IGFsbG93KQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oaW9xdWV1ZSAhPSBOVUxMLCBQSl9FSU5WQUwpOworICAgIGlvcXVldWUtPmRlZmF1bHRfY29uY3VycmVuY3kgPSBhbGxvdzsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfc2V0X2NvbmN1cnJlbmN5KHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKwkJCQkJICAgICAgIHBqX2Jvb2xfdCBhbGxvdykKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGtleSwgUEpfRUlOVkFMKTsKKworICAgIC8qIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcgbXVzdCBiZSBlbmFibGVkIGlmIGNvbmN1cnJlbmN5IGlzCisgICAgICogZGlzYWJsZWQuCisgICAgICovCisgICAgUEpfQVNTRVJUX1JFVFVSTihhbGxvdyB8fCBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHLCBQSl9FSU5WQUwpOworCisgICAga2V5LT5hbGxvd19jb25jdXJyZW50ID0gYWxsb3c7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9sb2NrX2tleShwal9pb3F1ZXVlX2tleV90ICprZXkpCit7CisgICAgaWYgKGtleS0+Z3JwX2xvY2spCisJcmV0dXJuIHBqX2dycF9sb2NrX2FjcXVpcmUoa2V5LT5ncnBfbG9jayk7CisgICAgZWxzZQorCXJldHVybiBwal9sb2NrX2FjcXVpcmUoa2V5LT5sb2NrKTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3VubG9ja19rZXkocGpfaW9xdWV1ZV9rZXlfdCAqa2V5KQoreworICAgIGlmIChrZXktPmdycF9sb2NrKQorCXJldHVybiBwal9ncnBfbG9ja19yZWxlYXNlKGtleS0+Z3JwX2xvY2spOworICAgIGVsc2UKKwlyZXR1cm4gcGpfbG9ja19yZWxlYXNlKGtleS0+bG9jayk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pb3F1ZXVlX2NvbW1vbl9hYnMuaCBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaW9xdWV1ZV9jb21tb25fYWJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkYmI1MgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaW9xdWV1ZV9jb21tb25fYWJzLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qICRJZCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworLyogaW9xdWV1ZV9jb21tb25fYWJzLmgKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIGFic3RyYWN0aW5nIHZhcmlvdXMgCisgKiBldmVudCBwb2xsaW5nL2Rpc3BhdGNoaW5nIG1lY2hhbmlzbXMgKGUuZy4gc2VsZWN0LCBwb2xsLCBlcG9sbCkgCisgKiB0byB0aGUgaW9xdWV1ZS4gCisgKi8KKworI2luY2x1ZGUgPHBqL2xpc3QuaD4KKworLyoKKyAqIFRoZSBzZWxlY3QgaW9xdWV1ZSByZWxpZXMgb24gc29ja2V0IGZ1bmN0aW9ucyAocGpfc29ja194eHgoKSkgdG8gcmV0dXJuCisgKiB0aGUgY29ycmVjdCBlcnJvciBjb2RlLgorICovCisjaWYgUEpfUkVUVVJOX09TX0VSUk9SKDEwMCkgIT0gUEpfU1RBVFVTX0ZST01fT1MoMTAwKQorIyAgIGVycm9yICJQcm9wZXIgZXJyb3IgcmVwb3J0aW5nIG11c3QgYmUgZW5hYmxlZCBmb3IgaW9xdWV1ZSB0byB3b3JrISIKKyNlbmRpZgorCisKK3N0cnVjdCBnZW5lcmljX29wZXJhdGlvbgoreworICAgIFBKX0RFQ0xfTElTVF9NRU1CRVIoc3RydWN0IGdlbmVyaWNfb3BlcmF0aW9uKTsKKyAgICBwal9pb3F1ZXVlX29wZXJhdGlvbl9lICBvcDsKK307CisKK3N0cnVjdCByZWFkX29wZXJhdGlvbgoreworICAgIFBKX0RFQ0xfTElTVF9NRU1CRVIoc3RydWN0IHJlYWRfb3BlcmF0aW9uKTsKKyAgICBwal9pb3F1ZXVlX29wZXJhdGlvbl9lICBvcDsKKworICAgIHZvaWQJCSAgICpidWY7CisgICAgcGpfc2l6ZV90CQkgICAgc2l6ZTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICBmbGFnczsKKyAgICBwal9zb2NrYWRkcl90CSAgICpybXRfYWRkcjsKKyAgICBpbnQJCQkgICAqcm10X2FkZHJsZW47Cit9OworCitzdHJ1Y3Qgd3JpdGVfb3BlcmF0aW9uCit7CisgICAgUEpfREVDTF9MSVNUX01FTUJFUihzdHJ1Y3Qgd3JpdGVfb3BlcmF0aW9uKTsKKyAgICBwal9pb3F1ZXVlX29wZXJhdGlvbl9lICBvcDsKKworICAgIGNoYXIJCSAgICpidWY7CisgICAgcGpfc2l6ZV90CQkgICAgc2l6ZTsKKyAgICBwal9zc2l6ZV90ICAgICAgICAgICAgICB3cml0dGVuOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgIGZsYWdzOworICAgIHBqX3NvY2thZGRyX2luCSAgICBybXRfYWRkcjsKKyAgICBpbnQJCQkgICAgcm10X2FkZHJsZW47Cit9OworCitzdHJ1Y3QgYWNjZXB0X29wZXJhdGlvbgoreworICAgIFBKX0RFQ0xfTElTVF9NRU1CRVIoc3RydWN0IGFjY2VwdF9vcGVyYXRpb24pOworICAgIHBqX2lvcXVldWVfb3BlcmF0aW9uX2UgIG9wOworCisgICAgcGpfc29ja190ICAgICAgICAgICAgICAqYWNjZXB0X2ZkOworICAgIHBqX3NvY2thZGRyX3QJICAgKmxvY2FsX2FkZHI7CisgICAgcGpfc29ja2FkZHJfdAkgICAqcm10X2FkZHI7CisgICAgaW50CQkJICAgKmFkZHJsZW47Cit9OworCit1bmlvbiBvcGVyYXRpb25fa2V5Cit7CisgICAgc3RydWN0IGdlbmVyaWNfb3BlcmF0aW9uIGdlbmVyaWM7CisgICAgc3RydWN0IHJlYWRfb3BlcmF0aW9uICAgIHJlYWQ7CisgICAgc3RydWN0IHdyaXRlX29wZXJhdGlvbiAgIHdyaXRlOworI2lmIFBKX0hBU19UQ1AKKyAgICBzdHJ1Y3QgYWNjZXB0X29wZXJhdGlvbiAgYWNjZXB0OworI2VuZGlmCit9OworCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworIyAgIGRlZmluZSBVTlJFR19GSUVMRFMJCQlcCisJdW5zaWduZWQJICAgIHJlZl9jb3VudDsJXAorCXBqX2Jvb2xfdAkgICAgY2xvc2luZzsJXAorCXBqX3RpbWVfdmFsCSAgICBmcmVlX3RpbWU7CVwKKwkKKyNlbHNlCisjICAgZGVmaW5lIFVOUkVHX0ZJRUxEUworI2VuZGlmCisKKyNkZWZpbmUgREVDTEFSRV9DT01NT05fS0VZICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUEpfREVDTF9MSVNUX01FTUJFUihzdHJ1Y3QgcGpfaW9xdWV1ZV9rZXlfdCk7ICAgXAorICAgIHBqX2lvcXVldWVfdCAgICAgICAgICAgKmlvcXVldWU7ICAgICAgICAgICAgICAgIFwKKyAgICBwal9ncnBfbG9ja190IAkgICAqZ3JwX2xvY2s7CQkgICAgXAorICAgIHBqX2xvY2tfdCAgICAgICAgICAgICAgKmxvY2s7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBwal9ib29sX3QJCSAgICBpbnNpZGVfY2FsbGJhY2s7CSAgICBcCisgICAgcGpfYm9vbF90CQkgICAgZGVzdHJveV9yZXF1ZXN0ZWQ7CSAgICBcCisgICAgcGpfYm9vbF90CQkgICAgYWxsb3dfY29uY3VycmVudDsJICAgIFwKKyAgICBwal9zb2NrX3QJCSAgICBmZDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZmRfdHlwZTsgICAgICAgICAgICAgICAgXAorICAgIHZvaWQJCSAgICp1c2VyX2RhdGE7ICAgICAgICAgICAgICBcCisgICAgcGpfaW9xdWV1ZV9jYWxsYmFjawkgICAgY2I7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpbmc7ICAgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgcmVhZF9vcGVyYXRpb24gICByZWFkX2xpc3Q7ICAgICAgICAgICAgICBcCisgICAgc3RydWN0IHdyaXRlX29wZXJhdGlvbiAgd3JpdGVfbGlzdDsgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBhY2NlcHRfb3BlcmF0aW9uIGFjY2VwdF9saXN0OwkgICAgXAorICAgIFVOUkVHX0ZJRUxEUworCisKKyNkZWZpbmUgREVDTEFSRV9DT01NT05fSU9RVUVVRSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGpfbG9ja190ICAgICAgICAgICpsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBqX2Jvb2xfdCAgICAgICAgICAgYXV0b19kZWxldGVfbG9jazsJICAgIFwKKyAgICBwal9ib29sX3QJCWRlZmF1bHRfY29uY3VycmVuY3k7CisKKworZW51bSBpb3F1ZXVlX2V2ZW50X3R5cGUKK3sKKyAgICBOT19FVkVOVCwKKyAgICBSRUFEQUJMRV9FVkVOVCwKKyAgICBXUklURUFCTEVfRVZFTlQsCisgICAgRVhDRVBUSU9OX0VWRU5ULAorfTsKKworc3RhdGljIHZvaWQgaW9xdWV1ZV9hZGRfdG9fc2V0KCBwal9pb3F1ZXVlX3QgKmlvcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpb3F1ZXVlX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSApOworc3RhdGljIHZvaWQgaW9xdWV1ZV9yZW1vdmVfZnJvbV9zZXQoIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX2tleV90ICprZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW9xdWV1ZV9ldmVudF90eXBlIGV2ZW50X3R5cGUpOworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2lvcXVldWVfZHVtbXkuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaW9xdWV1ZV9kdW1teS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTViYjcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2lvcXVldWVfZHVtbXkuYwpAQCAtMCwwICsxLDE5NCBAQAorLyogJElkOiBpb3F1ZXVlX2R1bW15LmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9pb3F1ZXVlLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9saXN0Lmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL3NvY2suaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorCisjZGVmaW5lIFRISVNfRklMRSAgICJpb3F1ZXVlIgorCisjZGVmaW5lIFBKX0lPUVVFVUVfSVNfUkVBRF9PUChvcCkgICBcCisJKChvcCAmIFBKX0lPUVVFVUVfT1BfUkVBRCkgIHx8IChvcCAmIFBKX0lPUVVFVUVfT1BfUkVDVl9GUk9NKSkKKyNkZWZpbmUgUEpfSU9RVUVVRV9JU19XUklURV9PUChvcCkgIFwKKwkoKG9wICYgUEpfSU9RVUVVRV9PUF9XUklURSkgfHwgKG9wICYgUEpfSU9RVUVVRV9PUF9TRU5EX1RPKSkKKworCisjaWYgUEpfSEFTX1RDUAorIyAgZGVmaW5lIFBKX0lPUVVFVUVfSVNfQUNDRVBUX09QKG9wKQkob3AgJiBQSl9JT1FVRVVFX09QX0FDQ0VQVCkKKyMgIGRlZmluZSBQSl9JT1FVRVVFX0lTX0NPTk5FQ1RfT1Aob3ApCShvcCAmIFBKX0lPUVVFVUVfT1BfQ09OTkVDVCkKKyNlbHNlCisjICBkZWZpbmUgUEpfSU9RVUVVRV9JU19BQ0NFUFRfT1Aob3ApCTAKKyMgIGRlZmluZSBQSl9JT1FVRVVFX0lTX0NPTk5FQ1RfT1Aob3ApCTAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQSl9ERUJVRykgJiYgUEpfREVCVUcgIT0gMAorIyAgZGVmaW5lIFZBTElEQVRFX0ZEX1NFVAkJMQorI2Vsc2UKKyMgIGRlZmluZSBWQUxJREFURV9GRF9TRVQJCTAKKyNlbmRpZgorCitzdHJ1Y3QgcGpfaW9xdWV1ZV9rZXlfdAoreworICAgIFBKX0RFQ0xfTElTVF9NRU1CRVIoc3RydWN0IHBqX2lvcXVldWVfa2V5X3QpCisgICAgcGpfc29ja190CQkgICAgZmQ7CisgICAgcGpfaW9xdWV1ZV9vcGVyYXRpb25fZSAgb3A7CisgICAgdm9pZAkJICAgKnVzZXJfZGF0YTsKKyAgICBwal9pb3F1ZXVlX2NhbGxiYWNrCSAgICBjYjsKK307CisKK3N0cnVjdCBwal9pb3F1ZXVlX3QKK3sKK307CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9jcmVhdGUoIHBqX3Bvb2xfdCAqcG9vbCwgCisJCQkJICAgICAgIHBqX3NpemVfdCBtYXhfZmQsCisJCQkJICAgICAgIGludCBtYXhfdGhyZWFkcywKKwkJCQkgICAgICAgcGpfaW9xdWV1ZV90ICoqcHRyX2lvcXVldWUpCit7CisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9kZXN0cm95KHBqX2lvcXVldWVfdCAqaW9xdWUpCit7CisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9zZXRfbG9jayggcGpfaW9xdWV1ZV90ICppb3F1ZSwgCisJCQkJCSBwal9sb2NrX3QgKmxvY2ssCisJCQkJCSBwal9ib29sX3QgYXV0b19kZWxldGUgKQoreworICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICBwal9pb3F1ZXVlX3QgKmlvcXVlLAorCQkJCQkgICAgICBwal9zb2NrX3Qgc29jaywKKwkJCQkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkJCQkgICAgICBjb25zdCBwal9pb3F1ZXVlX2NhbGxiYWNrICpjYiwKKwkJCQkJICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqKnB0cl9rZXkpCit7CisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV91bnJlZ2lzdGVyKCBwal9pb3F1ZXVlX3QgKmlvcXVlLAorCQkJCQkgICBwal9pb3F1ZXVlX2tleV90ICprZXkpCit7CisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKK1BKX0RFRih2b2lkKikgcGpfaW9xdWV1ZV9nZXRfdXNlcl9kYXRhKCBwal9pb3F1ZXVlX2tleV90ICprZXkgKQoreworICAgIHJldHVybiBOVUxMOworfQorCisKK1BKX0RFRihpbnQpIHBqX2lvcXVldWVfcG9sbCggcGpfaW9xdWV1ZV90ICppb3F1ZSwgY29uc3QgcGpfdGltZV92YWwgKnRpbWVvdXQpCit7CisgICAgcmV0dXJuIC0xOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfcmVhZCggcGpfaW9xdWV1ZV90ICppb3F1ZSwKKwkJCQkgICAgIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKwkJCQkgICAgIHZvaWQgKmJ1ZmZlciwKKwkJCQkgICAgIHBqX3NpemVfdCBidWZsZW4pCit7CisgICAgcmV0dXJuIC0xOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfcmVjdiggcGpfaW9xdWV1ZV90ICppb3F1ZSwKKwkJCQkgICAgIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKwkJCQkgICAgIHZvaWQgKmJ1ZmZlciwKKwkJCQkgICAgIHBqX3NpemVfdCBidWZsZW4sCisJCQkJICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9yZWN2ZnJvbSggcGpfaW9xdWV1ZV90ICppb3F1ZSwKKwkJCQkJIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKwkJCQkJIHZvaWQgKmJ1ZmZlciwKKwkJCQkJIHBqX3NpemVfdCBidWZsZW4sCisJCQkJCSB1bnNpZ25lZCBmbGFncywKKwkJCQkJIHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJCSBpbnQgKmFkZHJsZW4pCit7CisgICAgcmV0dXJuIC0xOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfd3JpdGUoIHBqX2lvcXVldWVfdCAqaW9xdWUsCisJCQkJICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorCQkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICAgcGpfc2l6ZV90IGRhdGFsZW4pCit7CisgICAgcmV0dXJuIC0xOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfc2VuZCggcGpfaW9xdWV1ZV90ICppb3F1ZSwKKwkJCQkgICAgIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKwkJCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICBwal9zaXplX3QgZGF0YWxlbiwKKwkJCQkgICAgIHVuc2lnbmVkIGZsYWdzKQoreworICAgIHJldHVybiAtMTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3NlbmR0byggcGpfaW9xdWV1ZV90ICppb3F1ZSwKKwkJCQkgICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorCQkJCSAgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgICBwal9zaXplX3QgZGF0YWxlbiwKKwkJCQkgICAgICAgdW5zaWduZWQgZmxhZ3MsCisJCQkJICAgICAgIGNvbnN0IHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJICAgICAgIGludCBhZGRybGVuKQoreworICAgIHJldHVybiAtMTsKK30KKworI2lmIFBKX0hBU19UQ1AKKy8qCisgKiBJbml0aWF0ZSBvdmVybGFwcGVkIGFjY2VwdCgpIG9wZXJhdGlvbi4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX2FjY2VwdCggcGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJCSAgICAgICBwal9pb3F1ZXVlX2tleV90ICprZXksCisJCQkJICAgICAgIHBqX3NvY2tfdCAqbmV3X3NvY2ssCisJCQkJICAgICAgIHBqX3NvY2thZGRyX3QgKmxvY2FsLAorCQkJCSAgICAgICBwal9zb2NrYWRkcl90ICpyZW1vdGUsCisJCQkJICAgICAgaW50ICphZGRybGVuKQoreworICAgIHJldHVybiAtMTsKK30KKworLyoKKyAqIEluaXRpYXRlIG92ZXJsYXBwZWQgY29ubmVjdCgpIG9wZXJhdGlvbiAod2VsbCwgaXQncyBub24tYmxvY2tpbmcgYWN0dWFsbHksCisgKiBzaW5jZSB0aGVyZSdzIG5vIG92ZXJsYXBwZWQgdmVyc2lvbiBvZiBjb25uZWN0KCkpLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfY29ubmVjdCggcGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJCQlwal9pb3F1ZXVlX2tleV90ICprZXksCisJCQkJCWNvbnN0IHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJCWludCBhZGRybGVuICkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisjZW5kaWYJLyogUEpfSEFTX1RDUCAqLworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2lvcXVldWVfZXBvbGwuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaW9xdWV1ZV9lcG9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTU3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2lvcXVldWVfZXBvbGwuYwpAQCAtMCwwICsxLDgyNSBAQAorLyogJElkOiBpb3F1ZXVlX2Vwb2xsLmMgNDUyOCAyMDEzLTA1LTMwIDA3OjAxOjExWiBtaW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisvKgorICogaW9xdWV1ZV9lcG9sbC5jCisgKgorICogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgSU9RdWV1ZSBmcmFtZXdvcmsgdXNpbmcgL2Rldi9lcG9sbAorICogQVBJIGluIF9ib3RoXyBMaW51eCB1c2VyLW1vZGUgYW5kIGtlcm5lbC1tb2RlLgorICovCisKKyNpbmNsdWRlIDxwai9pb3F1ZXVlLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9sb2NrLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovbGlzdC5oPgorI2luY2x1ZGUgPHBqL3Bvb2wuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL3NvY2suaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc29ja2V0Lmg+CisjaW5jbHVkZSA8cGovcmFuZC5oPgorCisjaWYgIWRlZmluZWQoUEpfTElOVVhfS0VSTkVMKSB8fCBQSl9MSU5VWF9LRVJORUw9PTAKKyAgICAvKgorICAgICAqIExpbnV4IHVzZXIgbW9kZQorICAgICAqLworIyAgIGluY2x1ZGUgPHN5cy9lcG9sbC5oPgorIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjICAgaW5jbHVkZSA8dW5pc3RkLmg+CisKKyMgICBkZWZpbmUgZXBvbGxfZGF0YQkJZGF0YS5wdHIKKyMgICBkZWZpbmUgZXBvbGxfZGF0YV90eXBlCXZvaWQqCisjICAgZGVmaW5lIGlvY3RsX3ZhbF90eXBlCXVuc2lnbmVkIGxvbmcKKyMgICBkZWZpbmUgZ2V0c29ja29wdF92YWxfcHRyCWludCoKKyMgICBkZWZpbmUgb3NfZ2V0c29ja29wdAlnZXRzb2Nrb3B0CisjICAgZGVmaW5lIG9zX2lvY3RsCQlpb2N0bAorIyAgIGRlZmluZSBvc19yZWFkCQlyZWFkCisjICAgZGVmaW5lIG9zX2Nsb3NlCQljbG9zZQorIyAgIGRlZmluZSBvc19lcG9sbF9jcmVhdGUJZXBvbGxfY3JlYXRlCisjICAgZGVmaW5lIG9zX2Vwb2xsX2N0bAkJZXBvbGxfY3RsCisjICAgZGVmaW5lIG9zX2Vwb2xsX3dhaXQJZXBvbGxfd2FpdAorI2Vsc2UKKyAgICAvKgorICAgICAqIExpbnV4IGtlcm5lbCBtb2RlLgorICAgICAqLworIyAgIGluY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorIyAgIGluY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyMgICBpZiBkZWZpbmVkKE1PRFZFUlNJT05TKQorIwlpbmNsdWRlIDxsaW51eC9tb2R2ZXJzaW9ucy5oPgorIyAgIGVuZGlmCisjICAgaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjICAgaW5jbHVkZSA8bGludXgvcG9sbC5oPgorIyAgIGluY2x1ZGUgPGxpbnV4L2V2ZW50cG9sbC5oPgorIyAgIGluY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjICAgaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyMgICBpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyMgICBpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisgICAgZW51bSBFUE9MTF9FVkVOVFMKKyAgICB7CisJRVBPTExJTiA9IDB4MDAxLAorCUVQT0xMT1VUID0gMHgwMDQsCisJRVBPTExFUlIgPSAweDAwOCwKKyAgICB9OworIyAgIGRlZmluZSBvc19lcG9sbF9jcmVhdGUJCXN5c19lcG9sbF9jcmVhdGUKKyAgICBzdGF0aWMgaW50IG9zX2Vwb2xsX2N0bChpbnQgZXBmZCwgaW50IG9wLCBpbnQgZmQsIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnQpCisgICAgeworCWxvbmcgcmM7CisJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJcmMgPSBzeXNfZXBvbGxfY3RsKGVwZmQsIG9wLCBmZCwgZXZlbnQpOworCXNldF9mcyhvbGRmcyk7CisJaWYgKHJjKSB7CisJICAgIGVycm5vID0gLXJjOworCSAgICByZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgICBzdGF0aWMgaW50IG9zX2Vwb2xsX3dhaXQoaW50IGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnRzLAorCQkJICBpbnQgbWF4ZXZlbnRzLCBpbnQgdGltZW91dCkKKyAgICB7CisJaW50IGNvdW50OworCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCWNvdW50ID0gc3lzX2Vwb2xsX3dhaXQoZXBmZCwgZXZlbnRzLCBtYXhldmVudHMsIHRpbWVvdXQpOworCXNldF9mcyhvbGRmcyk7CisJcmV0dXJuIGNvdW50OworICAgIH0KKyMgICBkZWZpbmUgb3NfY2xvc2UJCXN5c19jbG9zZQorIyAgIGRlZmluZSBvc19nZXRzb2Nrb3B0CXBqX3NvY2tfZ2V0c29ja29wdAorICAgIHN0YXRpYyBpbnQgb3NfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKKyAgICB7CisJbG9uZyByYzsKKwltbV9zZWdtZW50X3Qgb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlyYyA9IHN5c19yZWFkKGZkLCBidWYsIGxlbik7CisJc2V0X2ZzKG9sZGZzKTsKKwlpZiAocmMpIHsKKwkgICAgZXJybm8gPSAtcmM7CisJICAgIHJldHVybiAtMTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorIyAgIGRlZmluZSBzb2NrbGVuX3QJCXVuc2lnbmVkCisjICAgZGVmaW5lIGlvY3RsX3ZhbF90eXBlCXVuc2lnbmVkIGxvbmcKKyAgICBpbnQgaW9jdGwoaW50IGZkLCBpbnQgb3B0LCBpb2N0bF92YWxfdHlwZSB2YWx1ZSk7CisgICAgc3RhdGljIGludCBvc19pb2N0bChpbnQgZmQsIGludCBvcHQsIGlvY3RsX3ZhbF90eXBlIHZhbHVlKQorICAgIHsKKwlpbnQgcmM7CisgICAgICAgIG1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCXJjID0gaW9jdGwoZmQsIG9wdCwgdmFsdWUpOworCXNldF9mcyhvbGRmcyk7CisJaWYgKHJjIDwgMCkgeworCSAgICBlcnJubyA9IC1yYzsKKwkgICAgcmV0dXJuIHJjOworCX0gZWxzZQorCSAgICByZXR1cm4gcmM7CisgICAgfQorIyAgIGRlZmluZSBnZXRzb2Nrb3B0X3ZhbF9wdHIJY2hhcioKKworIyAgIGRlZmluZSBlcG9sbF9kYXRhCQlkYXRhCisjICAgZGVmaW5lIGVwb2xsX2RhdGFfdHlwZQlfX3UzMgorI2VuZGlmCisKKyNkZWZpbmUgVEhJU19GSUxFICAgImlvcV9lcG9sbCIKKworLy8jZGVmaW5lIFRSQUNFXyhleHByKSBQSl9MT0coMyxleHByKQorI2RlZmluZSBUUkFDRV8oZXhwcikKKworLyoKKyAqIEluY2x1ZGUgY29tbW9uIGlvcXVldWUgYWJzdHJhY3Rpb24uCisgKi8KKyNpbmNsdWRlICJpb3F1ZXVlX2NvbW1vbl9hYnMuaCIKKworLyoKKyAqIFRoaXMgZGVzY3JpYmVzIGVhY2gga2V5LgorICovCitzdHJ1Y3QgcGpfaW9xdWV1ZV9rZXlfdAoreworICAgIERFQ0xBUkVfQ09NTU9OX0tFWQorfTsKKworc3RydWN0IHF1ZXVlCit7CisgICAgcGpfaW9xdWV1ZV9rZXlfdAkgICAgKmtleTsKKyAgICBlbnVtIGlvcXVldWVfZXZlbnRfdHlwZSAgZXZlbnRfdHlwZTsKK307CisKKy8qCisgKiBUaGlzIGRlc2NyaWJlcyB0aGUgSS9PIHF1ZXVlLgorICovCitzdHJ1Y3QgcGpfaW9xdWV1ZV90Cit7CisgICAgREVDTEFSRV9DT01NT05fSU9RVUVVRQorCisgICAgdW5zaWduZWQJCW1heCwgY291bnQ7CisgICAgLy9wal9pb3F1ZXVlX2tleV90CWhsaXN0OworICAgIHBqX2lvcXVldWVfa2V5X3QJYWN0aXZlX2xpc3Q7ICAgIAorICAgIGludAkJCWVwZmQ7CisgICAgLy9zdHJ1Y3QgZXBvbGxfZXZlbnQgKmV2ZW50czsKKyAgICAvL3N0cnVjdCBxdWV1ZSAgICAgICAqcXVldWU7CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgcGpfbXV0ZXhfdAkgICAgICAgKnJlZl9jbnRfbXV0ZXg7CisgICAgcGpfaW9xdWV1ZV9rZXlfdAljbG9zaW5nX2xpc3Q7CisgICAgcGpfaW9xdWV1ZV9rZXlfdAlmcmVlX2xpc3Q7CisjZW5kaWYKK307CisKKy8qIEluY2x1ZGUgaW1wbGVtZW50YXRpb24gZm9yIGNvbW1vbiBhYnN0cmFjdGlvbiBhZnRlciB3ZSBkZWNsYXJlCisgKiBwal9pb3F1ZXVlX2tleV90IGFuZCBwal9pb3F1ZXVlX3QuCisgKi8KKyNpbmNsdWRlICJpb3F1ZXVlX2NvbW1vbl9hYnMuYyIKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKy8qIFNjYW4gY2xvc2luZyBrZXlzIHRvIGJlIHB1dCB0byBmcmVlIGxpc3QgYWdhaW4gKi8KK3N0YXRpYyB2b2lkIHNjYW5fY2xvc2luZ19rZXlzKHBqX2lvcXVldWVfdCAqaW9xdWV1ZSk7CisjZW5kaWYKKworLyoKKyAqIHBqX2lvcXVldWVfbmFtZSgpCisgKi8KK1BKX0RFRihjb25zdCBjaGFyKikgcGpfaW9xdWV1ZV9uYW1lKHZvaWQpCit7CisjaWYgZGVmaW5lZChQSl9MSU5VWF9LRVJORUwpICYmIFBKX0xJTlVYX0tFUk5FTCE9MAorCXJldHVybiAiZXBvbGwta2VybmVsIjsKKyNlbHNlCisJcmV0dXJuICJlcG9sbCI7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX2lvcXVldWVfY3JlYXRlKCkKKyAqCisgKiBDcmVhdGUgc2VsZWN0IGlvcXVldWUuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9jcmVhdGUoIHBqX3Bvb2xfdCAqcG9vbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zaXplX3QgbWF4X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV90ICoqcF9pb3F1ZXVlKQoreworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZTsKKyAgICBwal9zdGF0dXNfdCByYzsKKyAgICBwal9sb2NrX3QgKmxvY2s7CisgICAgaW50IGk7CisKKyAgICAvKiBDaGVjayB0aGF0IGFyZ3VtZW50cyBhcmUgdmFsaWQuICovCisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICE9IE5VTEwgJiYgcF9pb3F1ZXVlICE9IE5VTEwgJiYgCisgICAgICAgICAgICAgICAgICAgICBtYXhfZmQgPiAwLCBQSl9FSU5WQUwpOworCisgICAgLyogQ2hlY2sgdGhhdCBzaXplIG9mIHBqX2lvcXVldWVfb3Bfa2V5X3QgaXMgc3VmZmljaWVudCAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2l6ZW9mKHBqX2lvcXVldWVfb3Bfa2V5X3QpLXNpemVvZih2b2lkKikgPj0KKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bmlvbiBvcGVyYXRpb25fa2V5KSwgUEpfRUJVRyk7CisKKyAgICBpb3F1ZXVlID0gcGpfcG9vbF9hbGxvYyhwb29sLCBzaXplb2YocGpfaW9xdWV1ZV90KSk7CisKKyAgICBpb3F1ZXVlX2luaXQoaW9xdWV1ZSk7CisKKyAgICBpb3F1ZXVlLT5tYXggPSBtYXhfZmQ7CisgICAgaW9xdWV1ZS0+Y291bnQgPSAwOworICAgIHBqX2xpc3RfaW5pdCgmaW9xdWV1ZS0+YWN0aXZlX2xpc3QpOworCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworICAgIC8qIFdoZW4gc2FmZSB1bnJlZ2lzdHJhdGlvbiBpcyB1c2VkICh0aGUgZGVmYXVsdCksIHdlIHByZS1jcmVhdGUKKyAgICAgKiBhbGwga2V5cyBhbmQgcHV0IHRoZW0gaW4gdGhlIGZyZWUgbGlzdC4KKyAgICAgKi8KKworICAgIC8qIE11dGV4IHRvIHByb3RlY3Qga2V5J3MgcmVmZXJlbmNlIGNvdW50ZXIgCisgICAgICogV2UgZG9uJ3Qgd2FudCB0byB1c2Uga2V5J3MgbXV0ZXggb3IgaW9xdWV1ZSdzIG11dGV4IGJlY2F1c2UKKyAgICAgKiB0aGF0IHdvdWxkIGNyZWF0ZSBkZWFkbG9jayBzaXR1YXRpb24gaW4gc29tZSBjYXNlcy4KKyAgICAgKi8KKyAgICByYyA9IHBqX211dGV4X2NyZWF0ZV9zaW1wbGUocG9vbCwgTlVMTCwgJmlvcXVldWUtPnJlZl9jbnRfbXV0ZXgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiByYzsKKworCisgICAgLyogSW5pdCBrZXkgbGlzdCAqLworICAgIHBqX2xpc3RfaW5pdCgmaW9xdWV1ZS0+ZnJlZV9saXN0KTsKKyAgICBwal9saXN0X2luaXQoJmlvcXVldWUtPmNsb3NpbmdfbGlzdCk7CisKKworICAgIC8qIFByZS1jcmVhdGUgYWxsIGtleXMgYWNjb3JkaW5nIHRvIG1heF9mZCAqLworICAgIGZvciAoIGk9MDsgaTxtYXhfZmQ7ICsraSkgeworCXBqX2lvcXVldWVfa2V5X3QgKmtleTsKKworCWtleSA9IFBKX1BPT0xfQUxMT0NfVChwb29sLCBwal9pb3F1ZXVlX2tleV90KTsKKwlrZXktPnJlZl9jb3VudCA9IDA7CisJcmMgPSBwal9sb2NrX2NyZWF0ZV9yZWN1cnNpdmVfbXV0ZXgocG9vbCwgTlVMTCwgJmtleS0+bG9jayk7CisJaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAga2V5ID0gaW9xdWV1ZS0+ZnJlZV9saXN0Lm5leHQ7CisJICAgIHdoaWxlIChrZXkgIT0gJmlvcXVldWUtPmZyZWVfbGlzdCkgeworCQlwal9sb2NrX2Rlc3Ryb3koa2V5LT5sb2NrKTsKKwkJa2V5ID0ga2V5LT5uZXh0OworCSAgICB9CisJICAgIHBqX211dGV4X2Rlc3Ryb3koaW9xdWV1ZS0+cmVmX2NudF9tdXRleCk7CisJICAgIHJldHVybiByYzsKKwl9CisKKwlwal9saXN0X3B1c2hfYmFjaygmaW9xdWV1ZS0+ZnJlZV9saXN0LCBrZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgcmMgPSBwal9sb2NrX2NyZWF0ZV9zaW1wbGVfbXV0ZXgocG9vbCwgImlvcSVwIiwgJmxvY2spOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiByYzsKKworICAgIHJjID0gcGpfaW9xdWV1ZV9zZXRfbG9jayhpb3F1ZXVlLCBsb2NrLCBQSl9UUlVFKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgaW9xdWV1ZS0+ZXBmZCA9IG9zX2Vwb2xsX2NyZWF0ZShtYXhfZmQpOworICAgIGlmIChpb3F1ZXVlLT5lcGZkIDwgMCkgeworCWlvcXVldWVfZGVzdHJveShpb3F1ZXVlKTsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfb3NfZXJyb3IoKSk7CisgICAgfQorICAgIAorICAgIC8qaW9xdWV1ZS0+ZXZlbnRzID0gcGpfcG9vbF9jYWxsb2MocG9vbCwgbWF4X2ZkLCBzaXplb2Yoc3RydWN0IGVwb2xsX2V2ZW50KSk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihpb3F1ZXVlLT5ldmVudHMgIT0gTlVMTCwgUEpfRU5PTUVNKTsKKworICAgIGlvcXVldWUtPnF1ZXVlID0gcGpfcG9vbF9jYWxsb2MocG9vbCwgbWF4X2ZkLCBzaXplb2Yoc3RydWN0IHF1ZXVlKSk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihpb3F1ZXVlLT5xdWV1ZSAhPSBOVUxMLCBQSl9FTk9NRU0pOworICAgKi8KKyAgICBQSl9MT0coNCwgKCJwamxpYiIsICJlcG9sbCBJL08gUXVldWUgY3JlYXRlZCAoJXApIiwgaW9xdWV1ZSkpOworCisgICAgKnBfaW9xdWV1ZSA9IGlvcXVldWU7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal9pb3F1ZXVlX2Rlc3Ryb3koKQorICoKKyAqIERlc3Ryb3kgaW9xdWV1ZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX2Rlc3Ryb3kocGpfaW9xdWV1ZV90ICppb3F1ZXVlKQoreworICAgIHBqX2lvcXVldWVfa2V5X3QgKmtleTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oaW9xdWV1ZSwgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGlvcXVldWUtPmVwZmQgPiAwLCBQSl9FSU5WQUxJRE9QKTsKKworICAgIHBqX2xvY2tfYWNxdWlyZShpb3F1ZXVlLT5sb2NrKTsKKyAgICBvc19jbG9zZShpb3F1ZXVlLT5lcGZkKTsKKyAgICBpb3F1ZXVlLT5lcGZkID0gMDsKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKyAgICAvKiBEZXN0cm95IHJlZmVyZW5jZSBjb3VudGVycyAqLworICAgIGtleSA9IGlvcXVldWUtPmFjdGl2ZV9saXN0Lm5leHQ7CisgICAgd2hpbGUgKGtleSAhPSAmaW9xdWV1ZS0+YWN0aXZlX2xpc3QpIHsKKwlwal9sb2NrX2Rlc3Ryb3koa2V5LT5sb2NrKTsKKwlrZXkgPSBrZXktPm5leHQ7CisgICAgfQorCisgICAga2V5ID0gaW9xdWV1ZS0+Y2xvc2luZ19saXN0Lm5leHQ7CisgICAgd2hpbGUgKGtleSAhPSAmaW9xdWV1ZS0+Y2xvc2luZ19saXN0KSB7CisJcGpfbG9ja19kZXN0cm95KGtleS0+bG9jayk7CisJa2V5ID0ga2V5LT5uZXh0OworICAgIH0KKworICAgIGtleSA9IGlvcXVldWUtPmZyZWVfbGlzdC5uZXh0OworICAgIHdoaWxlIChrZXkgIT0gJmlvcXVldWUtPmZyZWVfbGlzdCkgeworCXBqX2xvY2tfZGVzdHJveShrZXktPmxvY2spOworCWtleSA9IGtleS0+bmV4dDsKKyAgICB9CisKKyAgICBwal9tdXRleF9kZXN0cm95KGlvcXVldWUtPnJlZl9jbnRfbXV0ZXgpOworI2VuZGlmCisgICAgcmV0dXJuIGlvcXVldWVfZGVzdHJveShpb3F1ZXVlKTsKK30KKworLyoKKyAqIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jaygpCisgKgorICogUmVnaXN0ZXIgYSBzb2NrZXQgdG8gaW9xdWV1ZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2syKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJCQkgICAgICBwal9zb2NrX3Qgc29jaywKKwkJCQkJICAgICAgcGpfZ3JwX2xvY2tfdCAqZ3JwX2xvY2ssCisJCQkJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJICAgICAgY29uc3QgcGpfaW9xdWV1ZV9jYWxsYmFjayAqY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqKnBfa2V5KQoreworICAgIHBqX2lvcXVldWVfa2V5X3QgKmtleSA9IE5VTEw7CisgICAgcGpfdWludDMyX3QgdmFsdWU7CisgICAgc3RydWN0IGVwb2xsX2V2ZW50IGV2OworICAgIGludCBzdGF0dXM7CisgICAgcGpfc3RhdHVzX3QgcmMgPSBQSl9TVUNDRVNTOworICAgIAorICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBpb3F1ZXVlICYmIHNvY2sgIT0gUEpfSU5WQUxJRF9TT0NLRVQgJiYKKyAgICAgICAgICAgICAgICAgICAgIGNiICYmIHBfa2V5LCBQSl9FSU5WQUwpOworCisgICAgcGpfbG9ja19hY3F1aXJlKGlvcXVldWUtPmxvY2spOworCisgICAgaWYgKGlvcXVldWUtPmNvdW50ID49IGlvcXVldWUtPm1heCkgeworICAgICAgICByYyA9IFBKX0VUT09NQU5ZOworCVRSQUNFXygoVEhJU19GSUxFLCAicGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrIGVycm9yOiB0b28gbWFueSBmaWxlcyIpKTsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBTZXQgc29ja2V0IHRvIG5vbmJsb2NraW5nLiAqLworICAgIHZhbHVlID0gMTsKKyAgICBpZiAoKHJjPW9zX2lvY3RsKHNvY2ssIEZJT05CSU8sIChpb2N0bF92YWxfdHlwZSkmdmFsdWUpKSkgeworCVRSQUNFXygoVEhJU19GSUxFLCAicGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrIGVycm9yOiBpb2N0bCByYz0lZCIsIAorICAgICAgICAgICAgICAgIHJjKSk7CisgICAgICAgIHJjID0gcGpfZ2V0X25ldG9zX2Vycm9yKCk7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogSWYgc2FmZSB1bnJlZ2lzdHJhdGlvbiAoUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRykgaXMgdXNlZCwgZ2V0CisgICAgICogdGhlIGtleSBmcm9tIHRoZSBmcmVlIGxpc3QuIE90aGVyd2lzZSBhbGxvY2F0ZSBhIG5ldyBvbmUuIAorICAgICAqLworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKworICAgIC8qIFNjYW4gY2xvc2luZ19rZXlzIGZpcnN0IHRvIGxldCB0aGVtIGNvbWUgYmFjayB0byBmcmVlX2xpc3QgKi8KKyAgICBzY2FuX2Nsb3Npbmdfa2V5cyhpb3F1ZXVlKTsKKworICAgIHBqX2Fzc2VydCghcGpfbGlzdF9lbXB0eSgmaW9xdWV1ZS0+ZnJlZV9saXN0KSk7CisgICAgaWYgKHBqX2xpc3RfZW1wdHkoJmlvcXVldWUtPmZyZWVfbGlzdCkpIHsKKwlyYyA9IFBKX0VUT09NQU5ZOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIGtleSA9IGlvcXVldWUtPmZyZWVfbGlzdC5uZXh0OworICAgIHBqX2xpc3RfZXJhc2Uoa2V5KTsKKyNlbHNlCisgICAgLyogQ3JlYXRlIGtleS4gKi8KKyAgICBrZXkgPSAocGpfaW9xdWV1ZV9rZXlfdCopcGpfcG9vbF96YWxsb2MocG9vbCwgc2l6ZW9mKHBqX2lvcXVldWVfa2V5X3QpKTsKKyNlbmRpZgorCisgICAgcmMgPSBpb3F1ZXVlX2luaXRfa2V5KHBvb2wsIGlvcXVldWUsIGtleSwgc29jaywgZ3JwX2xvY2ssIHVzZXJfZGF0YSwgY2IpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJa2V5ID0gTlVMTDsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUga2V5J3MgbXV0ZXggKi8KKyAvKiAgIHJjID0gcGpfbXV0ZXhfY3JlYXRlX3JlY3Vyc2l2ZShwb29sLCBOVUxMLCAma2V5LT5tdXRleCk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwlrZXkgPSBOVUxMOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKyovCisgICAgLyogb3NfZXBvbGxfY3RsLiAqLworICAgIGV2LmV2ZW50cyA9IEVQT0xMSU4gfCBFUE9MTEVSUjsKKyAgICBldi5lcG9sbF9kYXRhID0gKGVwb2xsX2RhdGFfdHlwZSlrZXk7CisgICAgc3RhdHVzID0gb3NfZXBvbGxfY3RsKGlvcXVldWUtPmVwZmQsIEVQT0xMX0NUTF9BREQsIHNvY2ssICZldik7CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKwlyYyA9IHBqX2dldF9vc19lcnJvcigpOworCXBqX2xvY2tfZGVzdHJveShrZXktPmxvY2spOworCWtleSA9IE5VTEw7CisJVFJBQ0VfKChUSElTX0ZJTEUsIAorICAgICAgICAgICAgICAgICJwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2sgZXJyb3I6IG9zX2Vwb2xsX2N0bCByYz0lZCIsIAorICAgICAgICAgICAgICAgIHN0YXR1cykpOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvKiBSZWdpc3RlciAqLworICAgIHBqX2xpc3RfaW5zZXJ0X2JlZm9yZSgmaW9xdWV1ZS0+YWN0aXZlX2xpc3QsIGtleSk7CisgICAgKytpb3F1ZXVlLT5jb3VudDsKKworICAgIC8vVFJBQ0VfKChUSElTX0ZJTEUsICJzb2NrZXQgcmVnaXN0ZXJlZCwgY291bnQ9JWQiLCBpb3F1ZXVlLT5jb3VudCkpOworCitvbl9yZXR1cm46CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwlpZiAoa2V5ICYmIGtleS0+Z3JwX2xvY2spCisJICAgIHBqX2dycF9sb2NrX2RlY19yZWZfZGJnKGtleS0+Z3JwX2xvY2ssICJpb3F1ZXVlIiwgMCk7CisgICAgfQorICAgICpwX2tleSA9IGtleTsKKyAgICBwal9sb2NrX3JlbGVhc2UoaW9xdWV1ZS0+bG9jayk7CisgICAgCisgICAgcmV0dXJuIHJjOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICBwal9pb3F1ZXVlX3QgKmlvcXVldWUsCisJCQkJCSAgICAgIHBqX3NvY2tfdCBzb2NrLAorCQkJCQkgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCQkJCSAgICAgIGNvbnN0IHBqX2lvcXVldWVfY2FsbGJhY2sgKmNiLAorCQkJCQkgICAgICBwal9pb3F1ZXVlX2tleV90ICoqcF9rZXkpCit7CisgICAgcmV0dXJuIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jazIocG9vbCwgaW9xdWV1ZSwgc29jaywgTlVMTCwgdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLCBwX2tleSk7Cit9CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisvKiBJbmNyZW1lbnQga2V5J3MgcmVmZXJlbmNlIGNvdW50ZXIgKi8KK3N0YXRpYyB2b2lkIGluY3JlbWVudF9jb3VudGVyKHBqX2lvcXVldWVfa2V5X3QgKmtleSkKK3sKKyAgICBwal9tdXRleF9sb2NrKGtleS0+aW9xdWV1ZS0+cmVmX2NudF9tdXRleCk7CisgICAgKytrZXktPnJlZl9jb3VudDsKKyAgICBwal9tdXRleF91bmxvY2soa2V5LT5pb3F1ZXVlLT5yZWZfY250X211dGV4KTsKK30KKworLyogRGVjcmVtZW50IHRoZSBrZXkncyByZWZlcmVuY2UgY291bnRlciwgYW5kIHdoZW4gdGhlIGNvdW50ZXIgcmVhY2ggemVybywKKyAqIGRlc3Ryb3kgdGhlIGtleS4KKyAqCisgKiBOb3RlOiBNVVNUIE5PVCBDQUxMIFRISVMgRlVOQ1RJT04gV0hJTEUgSE9MRElORyBpb3F1ZXVlJ3MgTE9DSy4KKyAqLworc3RhdGljIHZvaWQgZGVjcmVtZW50X2NvdW50ZXIocGpfaW9xdWV1ZV9rZXlfdCAqa2V5KQoreworICAgIHBqX2xvY2tfYWNxdWlyZShrZXktPmlvcXVldWUtPmxvY2spOworICAgIHBqX211dGV4X2xvY2soa2V5LT5pb3F1ZXVlLT5yZWZfY250X211dGV4KTsKKyAgICAtLWtleS0+cmVmX2NvdW50OworICAgIGlmIChrZXktPnJlZl9jb3VudCA9PSAwKSB7CisKKwlwal9hc3NlcnQoa2V5LT5jbG9zaW5nID09IDEpOworCXBqX2dldHRpY2tjb3VudCgma2V5LT5mcmVlX3RpbWUpOworCWtleS0+ZnJlZV90aW1lLm1zZWMgKz0gUEpfSU9RVUVVRV9LRVlfRlJFRV9ERUxBWTsKKwlwal90aW1lX3ZhbF9ub3JtYWxpemUoJmtleS0+ZnJlZV90aW1lKTsKKworCXBqX2xpc3RfZXJhc2Uoa2V5KTsKKwlwal9saXN0X3B1c2hfYmFjaygma2V5LT5pb3F1ZXVlLT5jbG9zaW5nX2xpc3QsIGtleSk7CisKKyAgICB9CisgICAgcGpfbXV0ZXhfdW5sb2NrKGtleS0+aW9xdWV1ZS0+cmVmX2NudF9tdXRleCk7CisgICAgcGpfbG9ja19yZWxlYXNlKGtleS0+aW9xdWV1ZS0+bG9jayk7Cit9CisjZW5kaWYKKworLyoKKyAqIHBqX2lvcXVldWVfdW5yZWdpc3RlcigpCisgKgorICogVW5yZWdpc3RlciBoYW5kbGUgZnJvbSBpb3F1ZXVlLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfdW5yZWdpc3RlciggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5KQoreworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZTsKKyAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXY7CisgICAgaW50IHN0YXR1czsKKyAgICAKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGtleSAhPSBOVUxMLCBQSl9FSU5WQUwpOworCisgICAgaW9xdWV1ZSA9IGtleS0+aW9xdWV1ZTsKKworICAgIC8qIExvY2sgdGhlIGtleSB0byBtYWtlIHN1cmUgbm8gY2FsbGJhY2sgaXMgc2ltdWx0YW5lb3VzbHkgbW9kaWZ5aW5nCisgICAgICogdGhlIGtleS4gV2UgbmVlZCB0byBsb2NrIHRoZSBrZXkgYmVmb3JlIGlvcXVldWUgaGVyZSB0byBwcmV2ZW50CisgICAgICogZGVhZGxvY2suCisgICAgICovCisgICAgcGpfaW9xdWV1ZV9sb2NrX2tleShrZXkpOworCisgICAgLyogQWxzbyBsb2NrIGlvcXVldWUgKi8KKyAgICBwal9sb2NrX2FjcXVpcmUoaW9xdWV1ZS0+bG9jayk7CisKKyAgICBwal9hc3NlcnQoaW9xdWV1ZS0+Y291bnQgPiAwKTsKKyAgICAtLWlvcXVldWUtPmNvdW50OworI2lmICFQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgcGpfbGlzdF9lcmFzZShrZXkpOworI2VuZGlmCisKKyAgICBldi5ldmVudHMgPSAwOworICAgIGV2LmVwb2xsX2RhdGEgPSAoZXBvbGxfZGF0YV90eXBlKWtleTsKKyAgICBzdGF0dXMgPSBvc19lcG9sbF9jdGwoIGlvcXVldWUtPmVwZmQsIEVQT0xMX0NUTF9ERUwsIGtleS0+ZmQsICZldik7CisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisJcGpfc3RhdHVzX3QgcmMgPSBwal9nZXRfb3NfZXJyb3IoKTsKKwlwal9sb2NrX3JlbGVhc2UoaW9xdWV1ZS0+bG9jayk7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qIERlc3Ryb3kgdGhlIGtleS4gKi8KKyAgICBwal9zb2NrX2Nsb3NlKGtleS0+ZmQpOworCisgICAgcGpfbG9ja19yZWxlYXNlKGlvcXVldWUtPmxvY2spOworCisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgLyogTWFyayBrZXkgaXMgY2xvc2luZy4gKi8KKyAgICBrZXktPmNsb3NpbmcgPSAxOworCisgICAgLyogRGVjcmVtZW50IGNvdW50ZXIuICovCisgICAgZGVjcmVtZW50X2NvdW50ZXIoa2V5KTsKKworICAgIC8qIERvbmUuICovCisgICAgaWYgKGtleS0+Z3JwX2xvY2spIHsKKwkvKiBqdXN0IGRlY19yZWYgYW5kIHVubG9jay4gd2Ugd2lsbCBzZXQgZ3JwX2xvY2sgdG8gTlVMTAorCSAqIGVsc2V3aGVyZSAqLworCXBqX2dycF9sb2NrX3QgKmdycF9sb2NrID0ga2V5LT5ncnBfbG9jazsKKwkvLyBEb24ndCBzZXQgZ3JwX2xvY2sgdG8gTlVMTCBvdGhlcndpc2UgdGhlIG90aGVyIHRocmVhZAorCS8vIHdpbGwgY3Jhc2guIEp1c3QgbGVhdmUgaXQgYXMgZGFuZ2xpbmcgcG9pbnRlciwgYnV0IHRoaXMKKwkvLyBzaG91bGQgYmUgc2FmZQorCS8va2V5LT5ncnBfbG9jayA9IE5VTEw7CisJcGpfZ3JwX2xvY2tfZGVjX3JlZl9kYmcoZ3JwX2xvY2ssICJpb3F1ZXVlIiwgMCk7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShncnBfbG9jayk7CisgICAgfSBlbHNlIHsKKwlwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKyAgICB9CisjZWxzZQorICAgIGlmIChrZXktPmdycF9sb2NrKSB7CisJLyogc2V0IGdycF9sb2NrIHRvIE5VTEwgYW5kIHVubG9jayAqLworCXBqX2dycF9sb2NrX3QgKmdycF9sb2NrID0ga2V5LT5ncnBfbG9jazsKKwkvLyBEb24ndCBzZXQgZ3JwX2xvY2sgdG8gTlVMTCBvdGhlcndpc2UgdGhlIG90aGVyIHRocmVhZAorCS8vIHdpbGwgY3Jhc2guIEp1c3QgbGVhdmUgaXQgYXMgZGFuZ2xpbmcgcG9pbnRlciwgYnV0IHRoaXMKKwkvLyBzaG91bGQgYmUgc2FmZQorCS8va2V5LT5ncnBfbG9jayA9IE5VTEw7CisJcGpfZ3JwX2xvY2tfZGVjX3JlZl9kYmcoZ3JwX2xvY2ssICJpb3F1ZXVlIiwgMCk7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShncnBfbG9jayk7CisgICAgfSBlbHNlIHsKKwlwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKyAgICB9CisKKyAgICBwal9sb2NrX2Rlc3Ryb3koa2V5LT5sb2NrKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIGlvcXVldWVfcmVtb3ZlX2Zyb21fc2V0KCkKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gaW9xdWV1ZV9kaXNwYXRjaF9ldmVudCgpIHRvIGluc3RydWN0CisgKiB0aGUgaW9xdWV1ZSB0byByZW1vdmUgdGhlIHNwZWNpZmllZCBkZXNjcmlwdG9yIGZyb20gaW9xdWV1ZSdzIGRlc2NyaXB0b3IKKyAqIHNldCBmb3IgdGhlIHNwZWNpZmllZCBldmVudC4KKyAqLworc3RhdGljIHZvaWQgaW9xdWV1ZV9yZW1vdmVfZnJvbV9zZXQoIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX2tleV90ICprZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW9xdWV1ZV9ldmVudF90eXBlIGV2ZW50X3R5cGUpCit7CisgICAgaWYgKGV2ZW50X3R5cGUgPT0gV1JJVEVBQkxFX0VWRU5UKSB7CisJc3RydWN0IGVwb2xsX2V2ZW50IGV2OworCisJZXYuZXZlbnRzID0gRVBPTExJTiB8IEVQT0xMRVJSOworCWV2LmVwb2xsX2RhdGEgPSAoZXBvbGxfZGF0YV90eXBlKWtleTsKKwlvc19lcG9sbF9jdGwoIGlvcXVldWUtPmVwZmQsIEVQT0xMX0NUTF9NT0QsIGtleS0+ZmQsICZldik7CisgICAgfQkKK30KKworLyoKKyAqIGlvcXVldWVfYWRkX3RvX3NldCgpCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHBqX2lvcXVldWVfcmVjdigpLCBwal9pb3F1ZXVlX3NlbmQoKSBldGMKKyAqIHRvIGluc3RydWN0IHRoZSBpb3F1ZXVlIHRvIGFkZCB0aGUgc3BlY2lmaWVkIGhhbmRsZSB0byBpb3F1ZXVlJ3MgZGVzY3JpcHRvcgorICogc2V0IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LgorICovCitzdGF0aWMgdm9pZCBpb3F1ZXVlX2FkZF90b19zZXQoIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGlvcXVldWVfZXZlbnRfdHlwZSBldmVudF90eXBlICkKK3sKKyAgICBpZiAoZXZlbnRfdHlwZSA9PSBXUklURUFCTEVfRVZFTlQpIHsKKwlzdHJ1Y3QgZXBvbGxfZXZlbnQgZXY7CisKKwlldi5ldmVudHMgPSBFUE9MTElOIHwgRVBPTExPVVQgfCBFUE9MTEVSUjsKKwlldi5lcG9sbF9kYXRhID0gKGVwb2xsX2RhdGFfdHlwZSlrZXk7CisJb3NfZXBvbGxfY3RsKCBpb3F1ZXVlLT5lcGZkLCBFUE9MTF9DVExfTU9ELCBrZXktPmZkLCAmZXYpOworICAgIH0JCit9CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisvKiBTY2FuIGNsb3Npbmcga2V5cyB0byBiZSBwdXQgdG8gZnJlZSBsaXN0IGFnYWluICovCitzdGF0aWMgdm9pZCBzY2FuX2Nsb3Npbmdfa2V5cyhwal9pb3F1ZXVlX3QgKmlvcXVldWUpCit7CisgICAgcGpfdGltZV92YWwgbm93OworICAgIHBqX2lvcXVldWVfa2V5X3QgKmg7CisKKyAgICBwal9nZXR0aWNrY291bnQoJm5vdyk7CisgICAgaCA9IGlvcXVldWUtPmNsb3NpbmdfbGlzdC5uZXh0OworICAgIHdoaWxlIChoICE9ICZpb3F1ZXVlLT5jbG9zaW5nX2xpc3QpIHsKKwlwal9pb3F1ZXVlX2tleV90ICpuZXh0ID0gaC0+bmV4dDsKKworCXBqX2Fzc2VydChoLT5jbG9zaW5nICE9IDApOworCisJaWYgKFBKX1RJTUVfVkFMX0dURShub3csIGgtPmZyZWVfdGltZSkpIHsKKwkgICAgcGpfbGlzdF9lcmFzZShoKTsKKwkgICAgLy8gRG9uJ3Qgc2V0IGdycF9sb2NrIHRvIE5VTEwgb3RoZXJ3aXNlIHRoZSBvdGhlciB0aHJlYWQKKwkgICAgLy8gd2lsbCBjcmFzaC4gSnVzdCBsZWF2ZSBpdCBhcyBkYW5nbGluZyBwb2ludGVyLCBidXQgdGhpcworCSAgICAvLyBzaG91bGQgYmUgc2FmZQorCSAgICAvL2gtPmdycF9sb2NrID0gTlVMTDsKKwkgICAgcGpfbGlzdF9wdXNoX2JhY2soJmlvcXVldWUtPmZyZWVfbGlzdCwgaCk7CisJfQorCWggPSBuZXh0OworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogcGpfaW9xdWV1ZV9wb2xsKCkKKyAqCisgKi8KK1BKX0RFRihpbnQpIHBqX2lvcXVldWVfcG9sbCggcGpfaW9xdWV1ZV90ICppb3F1ZXVlLCBjb25zdCBwal90aW1lX3ZhbCAqdGltZW91dCkKK3sKKyAgICBpbnQgaSwgY291bnQsIHByb2Nlc3NlZDsKKyAgICBpbnQgbXNlYzsKKyAgICAvL3N0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnRzID0gaW9xdWV1ZS0+ZXZlbnRzOworICAgIC8vc3RydWN0IHF1ZXVlICpxdWV1ZSA9IGlvcXVldWUtPnF1ZXVlOworICAgIHN0cnVjdCBlcG9sbF9ldmVudCBldmVudHNbUEpfSU9RVUVVRV9NQVhfRVZFTlRTX0lOX1NJTkdMRV9QT0xMXTsKKyAgICBzdHJ1Y3QgcXVldWUgcXVldWVbUEpfSU9RVUVVRV9NQVhfRVZFTlRTX0lOX1NJTkdMRV9QT0xMXTsKKyAgICBwal90aW1lc3RhbXAgdDEsIHQyOworICAgIAorICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBtc2VjID0gdGltZW91dCA/IFBKX1RJTUVfVkFMX01TRUMoKnRpbWVvdXQpIDogOTAwMDsKKworICAgIFRSQUNFXygoVEhJU19GSUxFLCAic3RhcnQgb3NfZXBvbGxfd2FpdCwgbXNlYz0lZCIsIG1zZWMpKTsKKyAgICBwal9nZXRfdGltZXN0YW1wKCZ0MSk7CisgCisgICAgLy9jb3VudCA9IG9zX2Vwb2xsX3dhaXQoIGlvcXVldWUtPmVwZmQsIGV2ZW50cywgaW9xdWV1ZS0+bWF4LCBtc2VjKTsKKyAgICBjb3VudCA9IG9zX2Vwb2xsX3dhaXQoIGlvcXVldWUtPmVwZmQsIGV2ZW50cywgUEpfSU9RVUVVRV9NQVhfRVZFTlRTX0lOX1NJTkdMRV9QT0xMLCBtc2VjKTsKKyAgICBpZiAoY291bnQgPT0gMCkgeworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKyAgICAvKiBDaGVjayB0aGUgY2xvc2luZyBrZXlzIG9ubHkgd2hlbiB0aGVyZSdzIG5vIGFjdGl2aXR5IGFuZCB3aGVuIHRoZXJlIGFyZQorICAgICAqIHBlbmRpbmcgY2xvc2luZyBrZXlzLgorICAgICAqLworICAgIGlmIChjb3VudCA9PSAwICYmICFwal9saXN0X2VtcHR5KCZpb3F1ZXVlLT5jbG9zaW5nX2xpc3QpKSB7CisJcGpfbG9ja19hY3F1aXJlKGlvcXVldWUtPmxvY2spOworCXNjYW5fY2xvc2luZ19rZXlzKGlvcXVldWUpOworCXBqX2xvY2tfcmVsZWFzZShpb3F1ZXVlLT5sb2NrKTsKKyAgICB9CisjZW5kaWYKKwlUUkFDRV8oKFRISVNfRklMRSwgIm9zX2Vwb2xsX3dhaXQgdGltZWQgb3V0IikpOworCXJldHVybiBjb3VudDsKKyAgICB9CisgICAgZWxzZSBpZiAoY291bnQgPCAwKSB7CisJVFJBQ0VfKChUSElTX0ZJTEUsICJvc19lcG9sbF93YWl0IGVycm9yIikpOworCXJldHVybiAtcGpfZ2V0X25ldG9zX2Vycm9yKCk7CisgICAgfQorCisgICAgcGpfZ2V0X3RpbWVzdGFtcCgmdDIpOworICAgIFRSQUNFXygoVEhJU19GSUxFLCAib3NfZXBvbGxfd2FpdCByZXR1cm5zICVkLCB0aW1lPSVkIHVzZWMiLAorCQkgICAgICAgY291bnQsIHBqX2VsYXBzZWRfdXNlYygmdDEsICZ0MikpKTsKKworICAgIC8qIExvY2sgaW9xdWV1ZS4gKi8KKyAgICBwal9sb2NrX2FjcXVpcmUoaW9xdWV1ZS0+bG9jayk7CisKKyAgICBmb3IgKHByb2Nlc3NlZD0wLCBpPTA7IGk8Y291bnQ7ICsraSkgeworCXBqX2lvcXVldWVfa2V5X3QgKmggPSAocGpfaW9xdWV1ZV9rZXlfdCopKGVwb2xsX2RhdGFfdHlwZSkKKwkJCQlldmVudHNbaV0uZXBvbGxfZGF0YTsKKworCVRSQUNFXygoVEhJU19GSUxFLCAiZXZlbnQgJWQ6IGV2ZW50cz0lZCIsIGksIGV2ZW50c1tpXS5ldmVudHMpKTsKKworCS8qCisJICogQ2hlY2sgcmVhZGFiaWxpdHkuCisJICovCisJaWYgKChldmVudHNbaV0uZXZlbnRzICYgRVBPTExJTikgJiYgCisJICAgIChrZXlfaGFzX3BlbmRpbmdfcmVhZChoKSB8fCBrZXlfaGFzX3BlbmRpbmdfYWNjZXB0KGgpKSAmJiAhSVNfQ0xPU0lORyhoKSApIHsKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKwkgICAgaW5jcmVtZW50X2NvdW50ZXIoaCk7CisjZW5kaWYKKwkgICAgcXVldWVbcHJvY2Vzc2VkXS5rZXkgPSBoOworCSAgICBxdWV1ZVtwcm9jZXNzZWRdLmV2ZW50X3R5cGUgPSBSRUFEQUJMRV9FVkVOVDsKKwkgICAgKytwcm9jZXNzZWQ7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIHdyaXRlYWJpbGl0eS4KKwkgKi8KKwlpZiAoKGV2ZW50c1tpXS5ldmVudHMgJiBFUE9MTE9VVCkgJiYga2V5X2hhc19wZW5kaW5nX3dyaXRlKGgpICYmICFJU19DTE9TSU5HKGgpKSB7CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisJICAgIGluY3JlbWVudF9jb3VudGVyKGgpOworI2VuZGlmCisJICAgIHF1ZXVlW3Byb2Nlc3NlZF0ua2V5ID0gaDsKKwkgICAgcXVldWVbcHJvY2Vzc2VkXS5ldmVudF90eXBlID0gV1JJVEVBQkxFX0VWRU5UOworCSAgICArK3Byb2Nlc3NlZDsKKwkgICAgY29udGludWU7CisJfQorCisjaWYgUEpfSEFTX1RDUAorCS8qCisJICogQ2hlY2sgZm9yIGNvbXBsZXRpb24gb2YgY29ubmVjdCgpIG9wZXJhdGlvbi4KKwkgKi8KKwlpZiAoKGV2ZW50c1tpXS5ldmVudHMgJiBFUE9MTE9VVCkgJiYgKGgtPmNvbm5lY3RpbmcpICYmICFJU19DTE9TSU5HKGgpKSB7CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisJICAgIGluY3JlbWVudF9jb3VudGVyKGgpOworI2VuZGlmCisJICAgIHF1ZXVlW3Byb2Nlc3NlZF0ua2V5ID0gaDsKKwkgICAgcXVldWVbcHJvY2Vzc2VkXS5ldmVudF90eXBlID0gV1JJVEVBQkxFX0VWRU5UOworCSAgICArK3Byb2Nlc3NlZDsKKwkgICAgY29udGludWU7CisJfQorI2VuZGlmIC8qIFBKX0hBU19UQ1AgKi8KKworCS8qCisJICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbi4KKwkgKi8KKwlpZiAoKGV2ZW50c1tpXS5ldmVudHMgJiBFUE9MTEVSUikgJiYgIUlTX0NMT1NJTkcoaCkpIHsKKwkgICAgLyoKKwkgICAgICogV2UgbmVlZCB0byBoYW5kbGUgdGhpcyBleGNlcHRpb24gZXZlbnQuICBJZiBpdCdzIHJlbGF0ZWQgdG8gdXMKKwkgICAgICogY29ubmVjdGluZywgcmVwb3J0IGl0IGFzIHN1Y2guICBJZiBub3QsIGp1c3QgcmVwb3J0IGl0IGFzIGEKKwkgICAgICogcmVhZCBldmVudCBhbmQgdGhlIGhpZ2hlciBsYXllcnMgd2lsbCBoYW5kbGUgaXQuCisJICAgICAqLworCSAgICBpZiAoaC0+Y29ubmVjdGluZykgeworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKwkJaW5jcmVtZW50X2NvdW50ZXIoaCk7CisjZW5kaWYKKwkJcXVldWVbcHJvY2Vzc2VkXS5rZXkgPSBoOworCQlxdWV1ZVtwcm9jZXNzZWRdLmV2ZW50X3R5cGUgPSBFWENFUFRJT05fRVZFTlQ7CisJCSsrcHJvY2Vzc2VkOworCSAgICB9IGVsc2UgaWYgKGtleV9oYXNfcGVuZGluZ19yZWFkKGgpIHx8IGtleV9oYXNfcGVuZGluZ19hY2NlcHQoaCkpIHsKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisJCWluY3JlbWVudF9jb3VudGVyKGgpOworI2VuZGlmCisJCXF1ZXVlW3Byb2Nlc3NlZF0ua2V5ID0gaDsKKwkJcXVldWVbcHJvY2Vzc2VkXS5ldmVudF90eXBlID0gUkVBREFCTEVfRVZFTlQ7CisJCSsrcHJvY2Vzc2VkOworCSAgICB9CisJICAgIGNvbnRpbnVlOworCX0KKyAgICB9CisgICAgZm9yIChpPTA7IGk8cHJvY2Vzc2VkOyArK2kpIHsKKwlpZiAocXVldWVbaV0ua2V5LT5ncnBfbG9jaykKKwkgICAgcGpfZ3JwX2xvY2tfYWRkX3JlZl9kYmcocXVldWVbaV0ua2V5LT5ncnBfbG9jaywgImlvcXVldWUiLCAwKTsKKyAgICB9CisKKyAgICBQSl9SQUNFX01FKDUpOworCisgICAgcGpfbG9ja19yZWxlYXNlKGlvcXVldWUtPmxvY2spOworCisgICAgUEpfUkFDRV9NRSg1KTsKKworICAgIC8qIE5vdyBwcm9jZXNzIHRoZSBldmVudHMuICovCisgICAgZm9yIChpPTA7IGk8cHJvY2Vzc2VkOyArK2kpIHsKKwlzd2l0Y2ggKHF1ZXVlW2ldLmV2ZW50X3R5cGUpIHsKKyAgICAgICAgY2FzZSBSRUFEQUJMRV9FVkVOVDoKKyAgICAgICAgICAgIGlvcXVldWVfZGlzcGF0Y2hfcmVhZF9ldmVudChpb3F1ZXVlLCBxdWV1ZVtpXS5rZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV1JJVEVBQkxFX0VWRU5UOgorICAgICAgICAgICAgaW9xdWV1ZV9kaXNwYXRjaF93cml0ZV9ldmVudChpb3F1ZXVlLCBxdWV1ZVtpXS5rZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX0VWRU5UOgorICAgICAgICAgICAgaW9xdWV1ZV9kaXNwYXRjaF9leGNlcHRpb25fZXZlbnQoaW9xdWV1ZSwgcXVldWVbaV0ua2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5PX0VWRU5UOgorICAgICAgICAgICAgcGpfYXNzZXJ0KCEiSW52YWxpZCBldmVudCEiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisJZGVjcmVtZW50X2NvdW50ZXIocXVldWVbaV0ua2V5KTsKKyNlbmRpZgorCisJaWYgKHF1ZXVlW2ldLmtleS0+Z3JwX2xvY2spCisJICAgIHBqX2dycF9sb2NrX2RlY19yZWZfZGJnKHF1ZXVlW2ldLmtleS0+Z3JwX2xvY2ssCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpb3F1ZXVlIiwgMCk7CisgICAgfQorCisgICAgLyogU3BlY2lhbCBjYXNlOgorICAgICAqIFdoZW4gZXBvbGwgcmV0dXJucyA+IDAgYnV0IG5vIGRlc2NyaXB0b3JzIGFyZSBhY3R1YWxseSBzZXQhCisgICAgICovCisgICAgaWYgKGNvdW50ID4gMCAmJiAhcHJvY2Vzc2VkICYmIG1zZWMgPiAwKSB7CisJcGpfdGhyZWFkX3NsZWVwKG1zZWMpOworICAgIH0KKworICAgIHBqX2dldF90aW1lc3RhbXAoJnQxKTsKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgImlvcXVldWVfcG9sbCgpIHJldHVybnMgJWQsIHRpbWU9JWQgdXNlYyIsCisJCSAgICAgICBwcm9jZXNzZWQsIHBqX2VsYXBzZWRfdXNlYygmdDIsICZ0MSkpKTsKKworICAgIHJldHVybiBwcm9jZXNzZWQ7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaW9xdWV1ZV9saW51eF9rZXJuZWwuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaW9xdWV1ZV9saW51eF9rZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZkYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pb3F1ZXVlX2xpbnV4X2tlcm5lbC5jCkBAIC0wLDAgKzEsMTYyIEBACisvKiAkSWQ6IGlvcXVldWVfbGludXhfa2VybmVsLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9pb3F1ZXVlLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9saXN0Lmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL3NvY2suaD4KKworI2RlZmluZSBUSElTX0ZJTEUgICAiaW9xdWV1ZSIKKworI2RlZmluZSBQSl9JT1FVRVVFX0lTX1JFQURfT1Aob3ApICAgXAorCSgob3AgJiBQSl9JT1FVRVVFX09QX1JFQUQpICB8fCAob3AgJiBQSl9JT1FVRVVFX09QX1JFQ1ZfRlJPTSkpCisjZGVmaW5lIFBKX0lPUVVFVUVfSVNfV1JJVEVfT1Aob3ApICBcCisJKChvcCAmIFBKX0lPUVVFVUVfT1BfV1JJVEUpIHx8IChvcCAmIFBKX0lPUVVFVUVfT1BfU0VORF9UTykpCisKKworI2lmIFBKX0hBU19UQ1AKKyMgIGRlZmluZSBQSl9JT1FVRVVFX0lTX0FDQ0VQVF9PUChvcCkJKG9wICYgUEpfSU9RVUVVRV9PUF9BQ0NFUFQpCisjICBkZWZpbmUgUEpfSU9RVUVVRV9JU19DT05ORUNUX09QKG9wKQkob3AgJiBQSl9JT1FVRVVFX09QX0NPTk5FQ1QpCisjZWxzZQorIyAgZGVmaW5lIFBKX0lPUVVFVUVfSVNfQUNDRVBUX09QKG9wKQkwCisjICBkZWZpbmUgUEpfSU9RVUVVRV9JU19DT05ORUNUX09QKG9wKQkwCisjZW5kaWYKKworI2lmIGRlZmluZWQoUEpfREVCVUcpICYmIFBKX0RFQlVHICE9IDAKKyMgIGRlZmluZSBWQUxJREFURV9GRF9TRVQJCTEKKyNlbHNlCisjICBkZWZpbmUgVkFMSURBVEVfRkRfU0VUCQkwCisjZW5kaWYKKworc3RydWN0IHBqX2lvcXVldWVfa2V5X3QKK3sKKyAgICBQSl9ERUNMX0xJU1RfTUVNQkVSKHN0cnVjdCBwal9pb3F1ZXVlX2tleV90KQorICAgIHBqX3NvY2tfdAkJICAgIGZkOworICAgIHBqX2lvcXVldWVfb3BlcmF0aW9uX2UgIG9wOworICAgIHZvaWQJCSAgICp1c2VyX2RhdGE7CisgICAgcGpfaW9xdWV1ZV9jYWxsYmFjawkgICAgY2I7Cit9OworCitzdHJ1Y3QgcGpfaW9xdWV1ZV90Cit7Cit9OworCitQSl9ERUYocGpfaW9xdWV1ZV90KikgcGpfaW9xdWV1ZV9jcmVhdGUocGpfcG9vbF90ICpwb29sLCBwal9zaXplX3QgbWF4X2ZkKQoreworICAgIHJldHVybiBOVUxMOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfZGVzdHJveShwal9pb3F1ZXVlX3QgKmlvcXVlKQoreworICAgIHJldHVybiAwOworfQorCitQSl9ERUYocGpfaW9xdWV1ZV9rZXlfdCopIHBqX2lvcXVldWVfcmVnaXN0ZXIoIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICAgIHBqX2lvcXVldWVfdCAqaW9xdWUsCisJCQkJCSAgICAgICBwal9vc2hhbmRsZV90IHNvY2ssCisJCQkJCSAgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCQkJCSAgICAgICBjb25zdCBwal9pb3F1ZXVlX2NhbGxiYWNrICpjYikKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3VucmVnaXN0ZXIoIHBqX2lvcXVldWVfdCAqaW9xdWUsCisJCQkJCSAgIHBqX2lvcXVldWVfa2V5X3QgKmtleSkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK1BKX0RFRih2b2lkKikgcGpfaW9xdWV1ZV9nZXRfdXNlcl9kYXRhKCBwal9pb3F1ZXVlX2tleV90ICprZXkgKQoreworICAgIHJldHVybiBOVUxMOworfQorCisKK1BKX0RFRihpbnQpIHBqX2lvcXVldWVfcG9sbCggcGpfaW9xdWV1ZV90ICppb3F1ZSwgY29uc3QgcGpfdGltZV92YWwgKnRpbWVvdXQpCit7CisgICAgcmV0dXJuIC0xOworfQorCitQSl9ERUYoaW50KSBwal9pb3F1ZXVlX3JlYWQoIHBqX2lvcXVldWVfdCAqaW9xdWUsCisJCQkgICAgIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKwkJCSAgICAgdm9pZCAqYnVmZmVyLAorCQkJICAgICBwal9zaXplX3QgYnVmbGVuKQoreworICAgIHJldHVybiAtMTsKK30KKworUEpfREVGKGludCkgcGpfaW9xdWV1ZV9yZWN2ZnJvbSggcGpfaW9xdWV1ZV90ICppb3F1ZSwKKwkJCQkgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorCQkJCSB2b2lkICpidWZmZXIsCisJCQkJIHBqX3NpemVfdCBidWZsZW4sCisJCQkJIHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJIGludCAqYWRkcmxlbikKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK1BKX0RFRihpbnQpIHBqX2lvcXVldWVfd3JpdGUoIHBqX2lvcXVldWVfdCAqaW9xdWUsCisJCQkgICAgICBwal9pb3F1ZXVlX2tleV90ICprZXksCisJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICAgcGpfc2l6ZV90IGRhdGFsZW4pCit7CisgICAgcmV0dXJuIC0xOworfQorCitQSl9ERUYoaW50KSBwal9pb3F1ZXVlX3NlbmR0byggcGpfaW9xdWV1ZV90ICppb3F1ZSwKKwkJCSAgICAgICBwal9pb3F1ZXVlX2tleV90ICprZXksCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgICBwal9zaXplX3QgZGF0YWxlbiwKKwkJCSAgICAgICBjb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJICAgICAgIGludCBhZGRybGVuKQoreworICAgIHJldHVybiAtMTsKK30KKworI2lmIFBKX0hBU19UQ1AKKy8qCisgKiBJbml0aWF0ZSBvdmVybGFwcGVkIGFjY2VwdCgpIG9wZXJhdGlvbi4KKyAqLworUEpfREVGKGludCkgcGpfaW9xdWV1ZV9hY2NlcHQoIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSwKKwkJCSAgICAgICBwal9pb3F1ZXVlX2tleV90ICprZXksCisJCQkgICAgICAgcGpfc29ja190ICpuZXdfc29jaywKKwkJCSAgICAgICBwal9zb2NrYWRkcl90ICpsb2NhbCwKKwkJCSAgICAgICBwal9zb2NrYWRkcl90ICpyZW1vdGUsCisJCQkgICAgICAgaW50ICphZGRybGVuKQoreworICAgIHJldHVybiAtMTsKK30KKworLyoKKyAqIEluaXRpYXRlIG92ZXJsYXBwZWQgY29ubmVjdCgpIG9wZXJhdGlvbiAod2VsbCwgaXQncyBub24tYmxvY2tpbmcgYWN0dWFsbHksCisgKiBzaW5jZSB0aGVyZSdzIG5vIG92ZXJsYXBwZWQgdmVyc2lvbiBvZiBjb25uZWN0KCkpLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfY29ubmVjdCggcGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJCQlwal9pb3F1ZXVlX2tleV90ICprZXksCisJCQkJCWNvbnN0IHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJCWludCBhZGRybGVuICkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisjZW5kaWYJLyogUEpfSEFTX1RDUCAqLworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2lvcXVldWVfc2VsZWN0LmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2lvcXVldWVfc2VsZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlNDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaW9xdWV1ZV9zZWxlY3QuYwpAQCAtMCwwICsxLDk4OCBAQAorLyogJElkOiBpb3F1ZXVlX3NlbGVjdC5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisvKgorICogc29ja19zZWxlY3QuYworICoKKyAqIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIElPUXVldWUgdXNpbmcgcGpfc29ja19zZWxlY3QoKS4KKyAqIEl0IHJ1bnMgYW55d2hlcmUgd2hlcmUgcGpfc29ja19zZWxlY3QoKSBpcyBhdmFpbGFibGUgKGN1cnJlbnRseQorICogV2luMzIsIExpbnV4LCBMaW51eCBrZXJuZWwsIGV0Yy4pLgorICovCisKKyNpbmNsdWRlIDxwai9pb3F1ZXVlLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9sb2NrLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovbGlzdC5oPgorI2luY2x1ZGUgPHBqL3Bvb2wuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9zb2NrLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3NvY2tldC5oPgorI2luY2x1ZGUgPHBqL3NvY2tfc2VsZWN0Lmg+CisjaW5jbHVkZSA8cGovc29ja19xb3MuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL3JhbmQuaD4KKworLyogTm93IHRoYXQgd2UgaGF2ZSBhY2Nlc3MgdG8gT1MnZXMgPHN5cy9zZWxlY3Q+LCBsZXRzIGNoZWNrIGFnYWluIHRoYXQKKyAqIFBKX0lPUVVFVUVfTUFYX0hBTkRMRVMgaXMgbm90IGdyZWF0ZXIgdGhhbiBGRF9TRVRTSVpFCisgKi8KKyNpZiBQSl9JT1FVRVVFX01BWF9IQU5ETEVTID4gRkRfU0VUU0laRQorIyAgIGVycm9yICJQSl9JT1FVRVVFX01BWF9IQU5ETEVTIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gRkRfU0VUU0laRSIKKyNlbmRpZgorCisKKy8qCisgKiBJbmNsdWRlIGRlY2xhcmF0aW9uIGZyb20gY29tbW9uIGFic3RyYWN0aW9uLgorICovCisjaW5jbHVkZSAiaW9xdWV1ZV9jb21tb25fYWJzLmgiCisKKy8qCisgKiBJU1NVRVMgd2l0aCBpb3F1ZXVlX3NlbGVjdCgpCisgKgorICogRUFHQUlOL0VXT1VMREJMT0NLIGVycm9yIGluIHJlY3YoKToKKyAqICAtIHdoZW4gbXVsdGlwbGUgdGhyZWFkcyBhcmUgd29ya2luZyB3aXRoIHRoZSBpb3F1ZXVlLCBhcHBsaWNhdGlvbgorICogICAgbWF5IHJlY2VpdmUgRUFHQUlOIG9yIEVXT1VMREJMT0NLIGluIHRoZSByZWNlaXZlIGNhbGxiYWNrLgorICogICAgVGhpcyBlcnJvciBoYXBwZW5zIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSB0aHJlYWQgaXMgd2F0Y2hpbmcgZm9yCisgKiAgICB0aGUgc2FtZSBkZXNjcmlwdG9yIHNldCwgc28gd2hlbiBhbGwgb2YgdGhlbSBjYWxsIHJlY3YoKSBvciByZWN2ZnJvbSgpCisgKiAgICBzaW11bHRhbmVvdXNseSwgb25seSBvbmUgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGdldCB0aGUgZXJyb3IuCisgKgorICovCisjZGVmaW5lIFRISVNfRklMRSAgICJpb3Ffc2VsZWN0IgorCisvKgorICogVGhlIHNlbGVjdCBpb3F1ZXVlIHJlbGllcyBvbiBzb2NrZXQgZnVuY3Rpb25zIChwal9zb2NrX3h4eCgpKSB0byByZXR1cm4KKyAqIHRoZSBjb3JyZWN0IGVycm9yIGNvZGUuCisgKi8KKyNpZiBQSl9SRVRVUk5fT1NfRVJST1IoMTAwKSAhPSBQSl9TVEFUVVNfRlJPTV9PUygxMDApCisjICAgZXJyb3IgIkVycm9yIHJlcG9ydGluZyBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoaXMgZnVuY3Rpb24gdG8gd29yayEiCisjZW5kaWYKKworLyoKKyAqIER1cmluZyBkZWJ1Z2dpbmcgYnVpbGQsIFZBTElEQVRFX0ZEX1NFVCBpcyBzZXQuCisgKiBUaGlzIHdpbGwgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBmZF9zZXRzLgorICovCisvKgorI2lmIGRlZmluZWQoUEpfREVCVUcpICYmIFBKX0RFQlVHICE9IDAKKyMgIGRlZmluZSBWQUxJREFURV9GRF9TRVQJCTEKKyNlbHNlCisjICBkZWZpbmUgVkFMSURBVEVfRkRfU0VUCQkwCisjZW5kaWYKKyovCisjZGVmaW5lIFZBTElEQVRFX0ZEX1NFVCAgICAgMAorCisjaWYgMAorIyAgZGVmaW5lIFRSQUNFX18oYXJncykJUEpfTE9HKDMsYXJncykKKyNlbHNlCisjICBkZWZpbmUgVFJBQ0VfXyhhcmdzKQorI2VuZGlmCisKKy8qCisgKiBUaGlzIGRlc2NyaWJlcyBlYWNoIGtleS4KKyAqLworc3RydWN0IHBqX2lvcXVldWVfa2V5X3QKK3sKKyAgICBERUNMQVJFX0NPTU1PTl9LRVkKK307CisKKy8qCisgKiBUaGlzIGRlc2NyaWJlcyB0aGUgSS9PIHF1ZXVlIGl0c2VsZi4KKyAqLworc3RydWN0IHBqX2lvcXVldWVfdAoreworICAgIERFQ0xBUkVfQ09NTU9OX0lPUVVFVUUKKworICAgIHVuc2lnbmVkCQltYXgsIGNvdW50OwkvKiBNYXggYW5kIGN1cnJlbnQga2V5IGNvdW50CSAgICAqLworICAgIGludAkJCW5mZHM7CQkvKiBUaGUgbGFyZ2VzdCBmZCB2YWx1ZSAoZm9yIHNlbGVjdCkqLworICAgIHBqX2lvcXVldWVfa2V5X3QJYWN0aXZlX2xpc3Q7CS8qIExpc3Qgb2YgYWN0aXZlIGtleXMuCQkgICAgKi8KKyAgICBwal9mZF9zZXRfdAkJcmZkc2V0OworICAgIHBqX2ZkX3NldF90CQl3ZmRzZXQ7CisjaWYgUEpfSEFTX1RDUAorICAgIHBqX2ZkX3NldF90CQl4ZmRzZXQ7CisjZW5kaWYKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKyAgICBwal9tdXRleF90CSAgICAgICAqcmVmX2NudF9tdXRleDsKKyAgICBwal9pb3F1ZXVlX2tleV90CWNsb3NpbmdfbGlzdDsKKyAgICBwal9pb3F1ZXVlX2tleV90CWZyZWVfbGlzdDsKKyNlbmRpZgorfTsKKworLyogUHJvdG8gKi8KKyNpZiBkZWZpbmVkKFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQpICYmIFwKKwkgICAgUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCE9MAorc3RhdGljIHBqX3N0YXR1c190IHJlcGxhY2VfdWRwX3NvY2socGpfaW9xdWV1ZV9rZXlfdCAqaCk7CisjZW5kaWYKKworLyogSW5jbHVkZSBpbXBsZW1lbnRhdGlvbiBmb3IgY29tbW9uIGFic3RyYWN0aW9uIGFmdGVyIHdlIGRlY2xhcmUKKyAqIHBqX2lvcXVldWVfa2V5X3QgYW5kIHBqX2lvcXVldWVfdC4KKyAqLworI2luY2x1ZGUgImlvcXVldWVfY29tbW9uX2Ficy5jIgorCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworLyogU2NhbiBjbG9zaW5nIGtleXMgdG8gYmUgcHV0IHRvIGZyZWUgbGlzdCBhZ2FpbiAqLworc3RhdGljIHZvaWQgc2Nhbl9jbG9zaW5nX2tleXMocGpfaW9xdWV1ZV90ICppb3F1ZXVlKTsKKyNlbmRpZgorCisvKgorICogcGpfaW9xdWV1ZV9uYW1lKCkKKyAqLworUEpfREVGKGNvbnN0IGNoYXIqKSBwal9pb3F1ZXVlX25hbWUodm9pZCkKK3sKKyAgICByZXR1cm4gInNlbGVjdCI7Cit9CisKKy8qIAorICogU2NhbiB0aGUgc29ja2V0IGRlc2NyaXB0b3Igc2V0cyBmb3IgdGhlIGxhcmdlc3QgZGVzY3JpcHRvci4KKyAqIFRoaXMgdmFsdWUgaXMgbmVlZGVkIGJ5IHNlbGVjdCgpLgorICovCisjaWYgZGVmaW5lZChQSl9TRUxFQ1RfTkVFRFNfTkZEUykgJiYgUEpfU0VMRUNUX05FRURTX05GRFMhPTAKK3N0YXRpYyB2b2lkIHJlc2Nhbl9mZHNldChwal9pb3F1ZXVlX3QgKmlvcXVldWUpCit7CisgICAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5ID0gaW9xdWV1ZS0+YWN0aXZlX2xpc3QubmV4dDsKKyAgICBpbnQgbWF4ID0gMDsKKworICAgIHdoaWxlIChrZXkgIT0gJmlvcXVldWUtPmFjdGl2ZV9saXN0KSB7CisJaWYgKGtleS0+ZmQgPiBtYXgpCisJICAgIG1heCA9IGtleS0+ZmQ7CisJa2V5ID0ga2V5LT5uZXh0OworICAgIH0KKworICAgIGlvcXVldWUtPm5mZHMgPSBtYXg7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgcmVzY2FuX2Zkc2V0KHBqX2lvcXVldWVfdCAqaW9xdWV1ZSkKK3sKKyAgICBpb3F1ZXVlLT5uZmRzID0gRkRfU0VUU0laRS0xOworfQorI2VuZGlmCisKKworLyoKKyAqIHBqX2lvcXVldWVfY3JlYXRlKCkKKyAqCisgKiBDcmVhdGUgc2VsZWN0IGlvcXVldWUuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9jcmVhdGUoIHBqX3Bvb2xfdCAqcG9vbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zaXplX3QgbWF4X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV90ICoqcF9pb3F1ZXVlKQoreworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZTsKKyAgICBwal9sb2NrX3QgKmxvY2s7CisgICAgdW5zaWduZWQgaTsKKyAgICBwal9zdGF0dXNfdCByYzsKKworICAgIC8qIENoZWNrIHRoYXQgYXJndW1lbnRzIGFyZSB2YWxpZC4gKi8KKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBvb2wgIT0gTlVMTCAmJiBwX2lvcXVldWUgIT0gTlVMTCAmJiAKKyAgICAgICAgICAgICAgICAgICAgIG1heF9mZCA+IDAgJiYgbWF4X2ZkIDw9IFBKX0lPUVVFVUVfTUFYX0hBTkRMRVMsIAorICAgICAgICAgICAgICAgICAgICAgUEpfRUlOVkFMKTsKKworICAgIC8qIENoZWNrIHRoYXQgc2l6ZSBvZiBwal9pb3F1ZXVlX29wX2tleV90IGlzIHN1ZmZpY2llbnQgKi8KKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNpemVvZihwal9pb3F1ZXVlX29wX2tleV90KS1zaXplb2Yodm9pZCopID49CisgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5pb24gb3BlcmF0aW9uX2tleSksIFBKX0VCVUcpOworCisgICAgLyogQ3JlYXRlIGFuZCBpbml0IGNvbW1vbiBpb3F1ZXVlIHN0dWZmcyAqLworICAgIGlvcXVldWUgPSBQSl9QT09MX0FMTE9DX1QocG9vbCwgcGpfaW9xdWV1ZV90KTsKKyAgICBpb3F1ZXVlX2luaXQoaW9xdWV1ZSk7CisKKyAgICBpb3F1ZXVlLT5tYXggPSAodW5zaWduZWQpbWF4X2ZkOworICAgIGlvcXVldWUtPmNvdW50ID0gMDsKKyAgICBQSl9GRF9aRVJPKCZpb3F1ZXVlLT5yZmRzZXQpOworICAgIFBKX0ZEX1pFUk8oJmlvcXVldWUtPndmZHNldCk7CisjaWYgUEpfSEFTX1RDUAorICAgIFBKX0ZEX1pFUk8oJmlvcXVldWUtPnhmZHNldCk7CisjZW5kaWYKKyAgICBwal9saXN0X2luaXQoJmlvcXVldWUtPmFjdGl2ZV9saXN0KTsKKworICAgIHJlc2Nhbl9mZHNldChpb3F1ZXVlKTsKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKyAgICAvKiBXaGVuIHNhZmUgdW5yZWdpc3RyYXRpb24gaXMgdXNlZCAodGhlIGRlZmF1bHQpLCB3ZSBwcmUtY3JlYXRlCisgICAgICogYWxsIGtleXMgYW5kIHB1dCB0aGVtIGluIHRoZSBmcmVlIGxpc3QuCisgICAgICovCisKKyAgICAvKiBNdXRleCB0byBwcm90ZWN0IGtleSdzIHJlZmVyZW5jZSBjb3VudGVyIAorICAgICAqIFdlIGRvbid0IHdhbnQgdG8gdXNlIGtleSdzIG11dGV4IG9yIGlvcXVldWUncyBtdXRleCBiZWNhdXNlCisgICAgICogdGhhdCB3b3VsZCBjcmVhdGUgZGVhZGxvY2sgc2l0dWF0aW9uIGluIHNvbWUgY2FzZXMuCisgICAgICovCisgICAgcmMgPSBwal9tdXRleF9jcmVhdGVfc2ltcGxlKHBvb2wsIE5VTEwsICZpb3F1ZXVlLT5yZWZfY250X211dGV4KTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gcmM7CisKKworICAgIC8qIEluaXQga2V5IGxpc3QgKi8KKyAgICBwal9saXN0X2luaXQoJmlvcXVldWUtPmZyZWVfbGlzdCk7CisgICAgcGpfbGlzdF9pbml0KCZpb3F1ZXVlLT5jbG9zaW5nX2xpc3QpOworCisKKyAgICAvKiBQcmUtY3JlYXRlIGFsbCBrZXlzIGFjY29yZGluZyB0byBtYXhfZmQgKi8KKyAgICBmb3IgKGk9MDsgaTxtYXhfZmQ7ICsraSkgeworCXBqX2lvcXVldWVfa2V5X3QgKmtleTsKKworCWtleSA9IFBKX1BPT0xfQUxMT0NfVChwb29sLCBwal9pb3F1ZXVlX2tleV90KTsKKwlrZXktPnJlZl9jb3VudCA9IDA7CisJcmMgPSBwal9sb2NrX2NyZWF0ZV9yZWN1cnNpdmVfbXV0ZXgocG9vbCwgTlVMTCwgJmtleS0+bG9jayk7CisJaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAga2V5ID0gaW9xdWV1ZS0+ZnJlZV9saXN0Lm5leHQ7CisJICAgIHdoaWxlIChrZXkgIT0gJmlvcXVldWUtPmZyZWVfbGlzdCkgeworCQlwal9sb2NrX2Rlc3Ryb3koa2V5LT5sb2NrKTsKKwkJa2V5ID0ga2V5LT5uZXh0OworCSAgICB9CisJICAgIHBqX211dGV4X2Rlc3Ryb3koaW9xdWV1ZS0+cmVmX2NudF9tdXRleCk7CisJICAgIHJldHVybiByYzsKKwl9CisKKwlwal9saXN0X3B1c2hfYmFjaygmaW9xdWV1ZS0+ZnJlZV9saXN0LCBrZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogQ3JlYXRlIGFuZCBpbml0IGlvcXVldWUgbXV0ZXggKi8KKyAgICByYyA9IHBqX2xvY2tfY3JlYXRlX3NpbXBsZV9tdXRleChwb29sLCAiaW9xJXAiLCAmbG9jayk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHJjOworCisgICAgcmMgPSBwal9pb3F1ZXVlX3NldF9sb2NrKGlvcXVldWUsIGxvY2ssIFBKX1RSVUUpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBQSl9MT0coNCwgKCJwamxpYiIsICJzZWxlY3QoKSBJL08gUXVldWUgY3JlYXRlZCAoJXApIiwgaW9xdWV1ZSkpOworCisgICAgKnBfaW9xdWV1ZSA9IGlvcXVldWU7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal9pb3F1ZXVlX2Rlc3Ryb3koKQorICoKKyAqIERlc3Ryb3kgaW9xdWV1ZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX2Rlc3Ryb3kocGpfaW9xdWV1ZV90ICppb3F1ZXVlKQoreworICAgIHBqX2lvcXVldWVfa2V5X3QgKmtleTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oaW9xdWV1ZSwgUEpfRUlOVkFMKTsKKworICAgIHBqX2xvY2tfYWNxdWlyZShpb3F1ZXVlLT5sb2NrKTsKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKyAgICAvKiBEZXN0cm95IHJlZmVyZW5jZSBjb3VudGVycyAqLworICAgIGtleSA9IGlvcXVldWUtPmFjdGl2ZV9saXN0Lm5leHQ7CisgICAgd2hpbGUgKGtleSAhPSAmaW9xdWV1ZS0+YWN0aXZlX2xpc3QpIHsKKwlwal9sb2NrX2Rlc3Ryb3koa2V5LT5sb2NrKTsKKwlrZXkgPSBrZXktPm5leHQ7CisgICAgfQorCisgICAga2V5ID0gaW9xdWV1ZS0+Y2xvc2luZ19saXN0Lm5leHQ7CisgICAgd2hpbGUgKGtleSAhPSAmaW9xdWV1ZS0+Y2xvc2luZ19saXN0KSB7CisJcGpfbG9ja19kZXN0cm95KGtleS0+bG9jayk7CisJa2V5ID0ga2V5LT5uZXh0OworICAgIH0KKworICAgIGtleSA9IGlvcXVldWUtPmZyZWVfbGlzdC5uZXh0OworICAgIHdoaWxlIChrZXkgIT0gJmlvcXVldWUtPmZyZWVfbGlzdCkgeworCXBqX2xvY2tfZGVzdHJveShrZXktPmxvY2spOworCWtleSA9IGtleS0+bmV4dDsKKyAgICB9CisKKyAgICBwal9tdXRleF9kZXN0cm95KGlvcXVldWUtPnJlZl9jbnRfbXV0ZXgpOworI2VuZGlmCisKKyAgICByZXR1cm4gaW9xdWV1ZV9kZXN0cm95KGlvcXVldWUpOworfQorCisKKy8qCisgKiBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2soKQorICoKKyAqIFJlZ2lzdGVyIHNvY2tldCBoYW5kbGUgdG8gaW9xdWV1ZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2syKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJCQkgICAgICBwal9zb2NrX3Qgc29jaywKKwkJCQkJICAgICAgcGpfZ3JwX2xvY2tfdCAqZ3JwX2xvY2ssCisJCQkJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJICAgICAgY29uc3QgcGpfaW9xdWV1ZV9jYWxsYmFjayAqY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqKnBfa2V5KQoreworICAgIHBqX2lvcXVldWVfa2V5X3QgKmtleSA9IE5VTEw7CisjaWYgZGVmaW5lZChQSl9XSU4zMikgJiYgUEpfV0lOMzIhPTAgfHwgXAorICAgIGRlZmluZWQoUEpfV0lONjQpICYmIFBKX1dJTjY0ICE9IDAgfHwgXAorICAgIGRlZmluZWQoUEpfV0lOMzJfV0lOQ0UpICYmIFBKX1dJTjMyX1dJTkNFIT0wCisgICAgdV9sb25nIHZhbHVlOworI2Vsc2UKKyAgICBwal91aW50MzJfdCB2YWx1ZTsKKyNlbmRpZgorICAgIHBqX3N0YXR1c190IHJjID0gUEpfU1VDQ0VTUzsKKyAgICAKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBvb2wgJiYgaW9xdWV1ZSAmJiBzb2NrICE9IFBKX0lOVkFMSURfU09DS0VUICYmCisgICAgICAgICAgICAgICAgICAgICBjYiAmJiBwX2tleSwgUEpfRUlOVkFMKTsKKworICAgIHBqX2xvY2tfYWNxdWlyZShpb3F1ZXVlLT5sb2NrKTsKKworICAgIGlmIChpb3F1ZXVlLT5jb3VudCA+PSBpb3F1ZXVlLT5tYXgpIHsKKyAgICAgICAgcmMgPSBQSl9FVE9PTUFOWTsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBJZiBzYWZlIHVucmVnaXN0cmF0aW9uIChQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHKSBpcyB1c2VkLCBnZXQKKyAgICAgKiB0aGUga2V5IGZyb20gdGhlIGZyZWUgbGlzdC4gT3RoZXJ3aXNlIGFsbG9jYXRlIGEgbmV3IG9uZS4gCisgICAgICovCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworCisgICAgLyogU2NhbiBjbG9zaW5nX2tleXMgZmlyc3QgdG8gbGV0IHRoZW0gY29tZSBiYWNrIHRvIGZyZWVfbGlzdCAqLworICAgIHNjYW5fY2xvc2luZ19rZXlzKGlvcXVldWUpOworCisgICAgcGpfYXNzZXJ0KCFwal9saXN0X2VtcHR5KCZpb3F1ZXVlLT5mcmVlX2xpc3QpKTsKKyAgICBpZiAocGpfbGlzdF9lbXB0eSgmaW9xdWV1ZS0+ZnJlZV9saXN0KSkgeworCXJjID0gUEpfRVRPT01BTlk7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAga2V5ID0gaW9xdWV1ZS0+ZnJlZV9saXN0Lm5leHQ7CisgICAgcGpfbGlzdF9lcmFzZShrZXkpOworI2Vsc2UKKyAgICBrZXkgPSAocGpfaW9xdWV1ZV9rZXlfdCopcGpfcG9vbF96YWxsb2MocG9vbCwgc2l6ZW9mKHBqX2lvcXVldWVfa2V5X3QpKTsKKyNlbmRpZgorCisgICAgcmMgPSBpb3F1ZXVlX2luaXRfa2V5KHBvb2wsIGlvcXVldWUsIGtleSwgc29jaywgZ3JwX2xvY2ssIHVzZXJfZGF0YSwgY2IpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJa2V5ID0gTlVMTDsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBTZXQgc29ja2V0IHRvIG5vbmJsb2NraW5nLiAqLworICAgIHZhbHVlID0gMTsKKyNpZiBkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMiE9MCB8fCBcCisgICAgZGVmaW5lZChQSl9XSU42NCkgJiYgUEpfV0lONjQgIT0gMCB8fCBcCisgICAgZGVmaW5lZChQSl9XSU4zMl9XSU5DRSkgJiYgUEpfV0lOMzJfV0lOQ0UhPTAKKyAgICBpZiAoaW9jdGxzb2NrZXQoc29jaywgRklPTkJJTywgJnZhbHVlKSkgeworI2Vsc2UKKyAgICBpZiAoaW9jdGwoc29jaywgRklPTkJJTywgJnZhbHVlKSkgeworI2VuZGlmCisgICAgICAgIHJjID0gcGpfZ2V0X25ldG9zX2Vycm9yKCk7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisKKyAgICAvKiBQdXQgaW4gYWN0aXZlIGxpc3QuICovCisgICAgcGpfbGlzdF9pbnNlcnRfYmVmb3JlKCZpb3F1ZXVlLT5hY3RpdmVfbGlzdCwga2V5KTsKKyAgICArK2lvcXVldWUtPmNvdW50OworCisgICAgLyogUmVzY2FuIGZkc2V0IHRvIGdldCBtYXggZGVzY3JpcHRvciAqLworICAgIHJlc2Nhbl9mZHNldChpb3F1ZXVlKTsKKworb25fcmV0dXJuOgorICAgIC8qIE9uIGVycm9yLCBzb2NrZXQgbWF5IGJlIGxlZnQgaW4gbm9uLWJsb2NraW5nIG1vZGUuICovCisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwlpZiAoa2V5ICYmIGtleS0+Z3JwX2xvY2spCisJICAgIHBqX2dycF9sb2NrX2RlY19yZWZfZGJnKGtleS0+Z3JwX2xvY2ssICJpb3F1ZXVlIiwgMCk7CisgICAgfQorICAgICpwX2tleSA9IGtleTsKKyAgICBwal9sb2NrX3JlbGVhc2UoaW9xdWV1ZS0+bG9jayk7CisgICAgCisgICAgcmV0dXJuIHJjOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICBwal9pb3F1ZXVlX3QgKmlvcXVldWUsCisJCQkJCSAgICAgIHBqX3NvY2tfdCBzb2NrLAorCQkJCQkgICAgICB2b2lkICp1c2VyX2RhdGEsCisJCQkJCSAgICAgIGNvbnN0IHBqX2lvcXVldWVfY2FsbGJhY2sgKmNiLAorCQkJCQkgICAgICBwal9pb3F1ZXVlX2tleV90ICoqcF9rZXkpCit7CisgICAgcmV0dXJuIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jazIocG9vbCwgaW9xdWV1ZSwgc29jaywgTlVMTCwgdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLCBwX2tleSk7Cit9CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisvKiBJbmNyZW1lbnQga2V5J3MgcmVmZXJlbmNlIGNvdW50ZXIgKi8KK3N0YXRpYyB2b2lkIGluY3JlbWVudF9jb3VudGVyKHBqX2lvcXVldWVfa2V5X3QgKmtleSkKK3sKKyAgICBwal9tdXRleF9sb2NrKGtleS0+aW9xdWV1ZS0+cmVmX2NudF9tdXRleCk7CisgICAgKytrZXktPnJlZl9jb3VudDsKKyAgICBwal9tdXRleF91bmxvY2soa2V5LT5pb3F1ZXVlLT5yZWZfY250X211dGV4KTsKK30KKworLyogRGVjcmVtZW50IHRoZSBrZXkncyByZWZlcmVuY2UgY291bnRlciwgYW5kIHdoZW4gdGhlIGNvdW50ZXIgcmVhY2ggemVybywKKyAqIGRlc3Ryb3kgdGhlIGtleS4KKyAqCisgKiBOb3RlOiBNVVNUIE5PVCBDQUxMIFRISVMgRlVOQ1RJT04gV0hJTEUgSE9MRElORyBpb3F1ZXVlJ3MgTE9DSy4KKyAqLworc3RhdGljIHZvaWQgZGVjcmVtZW50X2NvdW50ZXIocGpfaW9xdWV1ZV9rZXlfdCAqa2V5KQoreworICAgIHBqX2xvY2tfYWNxdWlyZShrZXktPmlvcXVldWUtPmxvY2spOworICAgIHBqX211dGV4X2xvY2soa2V5LT5pb3F1ZXVlLT5yZWZfY250X211dGV4KTsKKyAgICAtLWtleS0+cmVmX2NvdW50OworICAgIGlmIChrZXktPnJlZl9jb3VudCA9PSAwKSB7CisKKwlwal9hc3NlcnQoa2V5LT5jbG9zaW5nID09IDEpOworCXBqX2dldHRpY2tjb3VudCgma2V5LT5mcmVlX3RpbWUpOworCWtleS0+ZnJlZV90aW1lLm1zZWMgKz0gUEpfSU9RVUVVRV9LRVlfRlJFRV9ERUxBWTsKKwlwal90aW1lX3ZhbF9ub3JtYWxpemUoJmtleS0+ZnJlZV90aW1lKTsKKworCXBqX2xpc3RfZXJhc2Uoa2V5KTsKKwlwal9saXN0X3B1c2hfYmFjaygma2V5LT5pb3F1ZXVlLT5jbG9zaW5nX2xpc3QsIGtleSk7CisJLyogUmVzY2FuIGZkc2V0IHRvIGdldCBtYXggZGVzY3JpcHRvciAqLworCXJlc2Nhbl9mZHNldChrZXktPmlvcXVldWUpOworICAgIH0KKyAgICBwal9tdXRleF91bmxvY2soa2V5LT5pb3F1ZXVlLT5yZWZfY250X211dGV4KTsKKyAgICBwal9sb2NrX3JlbGVhc2Uoa2V5LT5pb3F1ZXVlLT5sb2NrKTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBwal9pb3F1ZXVlX3VucmVnaXN0ZXIoKQorICoKKyAqIFVucmVnaXN0ZXIgaGFuZGxlIGZyb20gaW9xdWV1ZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3VucmVnaXN0ZXIoIHBqX2lvcXVldWVfa2V5X3QgKmtleSkKK3sKKyAgICBwal9pb3F1ZXVlX3QgKmlvcXVldWU7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGtleSwgUEpfRUlOVkFMKTsKKworICAgIGlvcXVldWUgPSBrZXktPmlvcXVldWU7CisKKyAgICAvKiBMb2NrIHRoZSBrZXkgdG8gbWFrZSBzdXJlIG5vIGNhbGxiYWNrIGlzIHNpbXVsdGFuZW91c2x5IG1vZGlmeWluZworICAgICAqIHRoZSBrZXkuIFdlIG5lZWQgdG8gbG9jayB0aGUga2V5IGJlZm9yZSBpb3F1ZXVlIGhlcmUgdG8gcHJldmVudAorICAgICAqIGRlYWRsb2NrLgorICAgICAqLworICAgIHBqX2lvcXVldWVfbG9ja19rZXkoa2V5KTsKKworICAgIC8qIEFsc28gbG9jayBpb3F1ZXVlICovCisgICAgcGpfbG9ja19hY3F1aXJlKGlvcXVldWUtPmxvY2spOworCisgICAgcGpfYXNzZXJ0KGlvcXVldWUtPmNvdW50ID4gMCk7CisgICAgLS1pb3F1ZXVlLT5jb3VudDsKKyNpZiAhUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworICAgIC8qIFRpY2tldCAjNTIwLCBrZXkgd2lsbCBiZSBlcmFzZWQgbW9yZSB0aGFuIG9uY2UgKi8KKyAgICBwal9saXN0X2VyYXNlKGtleSk7CisjZW5kaWYKKyAgICBQSl9GRF9DTFIoa2V5LT5mZCwgJmlvcXVldWUtPnJmZHNldCk7CisgICAgUEpfRkRfQ0xSKGtleS0+ZmQsICZpb3F1ZXVlLT53ZmRzZXQpOworI2lmIFBKX0hBU19UQ1AKKyAgICBQSl9GRF9DTFIoa2V5LT5mZCwgJmlvcXVldWUtPnhmZHNldCk7CisjZW5kaWYKKworICAgIC8qIENsb3NlIHNvY2tldC4gKi8KKyAgICBwal9zb2NrX2Nsb3NlKGtleS0+ZmQpOworCisgICAgLyogQ2xlYXIgY2FsbGJhY2sgKi8KKyAgICBrZXktPmNiLm9uX2FjY2VwdF9jb21wbGV0ZSA9IE5VTEw7CisgICAga2V5LT5jYi5vbl9jb25uZWN0X2NvbXBsZXRlID0gTlVMTDsKKyAgICBrZXktPmNiLm9uX3JlYWRfY29tcGxldGUgPSBOVUxMOworICAgIGtleS0+Y2Iub25fd3JpdGVfY29tcGxldGUgPSBOVUxMOworCisgICAgLyogTXVzdCByZWxlYXNlIGlvcXVldWUgbG9jayBmaXJzdCBiZWZvcmUgZGVjcmVtZW50aW5nIGNvdW50ZXIsIHRvCisgICAgICogcHJldmVudCBkZWFkbG9jay4KKyAgICAgKi8KKyAgICBwal9sb2NrX3JlbGVhc2UoaW9xdWV1ZS0+bG9jayk7CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgLyogTWFyayBrZXkgaXMgY2xvc2luZy4gKi8KKyAgICBrZXktPmNsb3NpbmcgPSAxOworCisgICAgLyogRGVjcmVtZW50IGNvdW50ZXIuICovCisgICAgZGVjcmVtZW50X2NvdW50ZXIoa2V5KTsKKworICAgIC8qIERvbmUuICovCisgICAgaWYgKGtleS0+Z3JwX2xvY2spIHsKKwkvKiBqdXN0IGRlY19yZWYgYW5kIHVubG9jay4gd2Ugd2lsbCBzZXQgZ3JwX2xvY2sgdG8gTlVMTAorCSAqIGVsc2V3aGVyZSAqLworCXBqX2dycF9sb2NrX3QgKmdycF9sb2NrID0ga2V5LT5ncnBfbG9jazsKKwkvLyBEb24ndCBzZXQgZ3JwX2xvY2sgdG8gTlVMTCBvdGhlcndpc2UgdGhlIG90aGVyIHRocmVhZAorCS8vIHdpbGwgY3Jhc2guIEp1c3QgbGVhdmUgaXQgYXMgZGFuZ2xpbmcgcG9pbnRlciwgYnV0IHRoaXMKKwkvLyBzaG91bGQgYmUgc2FmZQorCS8va2V5LT5ncnBfbG9jayA9IE5VTEw7CisJcGpfZ3JwX2xvY2tfZGVjX3JlZl9kYmcoZ3JwX2xvY2ssICJpb3F1ZXVlIiwgMCk7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShncnBfbG9jayk7CisgICAgfSBlbHNlIHsKKwlwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKyAgICB9CisjZWxzZQorICAgIGlmIChrZXktPmdycF9sb2NrKSB7CisJLyogc2V0IGdycF9sb2NrIHRvIE5VTEwgYW5kIHVubG9jayAqLworCXBqX2dycF9sb2NrX3QgKmdycF9sb2NrID0ga2V5LT5ncnBfbG9jazsKKwkvLyBEb24ndCBzZXQgZ3JwX2xvY2sgdG8gTlVMTCBvdGhlcndpc2UgdGhlIG90aGVyIHRocmVhZAorCS8vIHdpbGwgY3Jhc2guIEp1c3QgbGVhdmUgaXQgYXMgZGFuZ2xpbmcgcG9pbnRlciwgYnV0IHRoaXMKKwkvLyBzaG91bGQgYmUgc2FmZQorCS8va2V5LT5ncnBfbG9jayA9IE5VTEw7CisJcGpfZ3JwX2xvY2tfZGVjX3JlZl9kYmcoZ3JwX2xvY2ssICJpb3F1ZXVlIiwgMCk7CisJcGpfZ3JwX2xvY2tfcmVsZWFzZShncnBfbG9jayk7CisgICAgfSBlbHNlIHsKKwlwal9pb3F1ZXVlX3VubG9ja19rZXkoa2V5KTsKKyAgICB9CisKKyAgICBwal9sb2NrX2Rlc3Ryb3koa2V5LT5sb2NrKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyogVGhpcyBzdXBwb3NlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBmZF9zZXQgdmFsdWVzIGFyZSBjb25zaXN0ZW50CisgKiB3aXRoIHRoZSBvcGVyYXRpb24gY3VycmVudGx5IHNldCBpbiBlYWNoIGtleS4KKyAqLworI2lmIFZBTElEQVRFX0ZEX1NFVAorc3RhdGljIHZvaWQgdmFsaWRhdGVfc2V0cyhjb25zdCBwal9pb3F1ZXVlX3QgKmlvcXVldWUsCisJCQkgIGNvbnN0IHBqX2ZkX3NldF90ICpyZmRzZXQsCisJCQkgIGNvbnN0IHBqX2ZkX3NldF90ICp3ZmRzZXQsCisJCQkgIGNvbnN0IHBqX2ZkX3NldF90ICp4ZmRzZXQpCit7CisgICAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5OworCisgICAgLyoKKyAgICAgKiBUaGlzIGJhc2ljbHkgd291bGQgbm90IHdvcmsgYW55bW9yZS4KKyAgICAgKiBXZSBuZWVkIHRvIGxvY2sga2V5IGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBjaGVjaywgYnV0IHdlIGNhbid0IGRvCisgICAgICogc28gYmVjYXVzZSB3ZSdyZSBob2xkaW5nIGlvcXVldWUgbXV0ZXguIElmIHdlIGFjcXVpcmUga2V5J3MgbXV0ZXgKKyAgICAgKiBub3csIHRoZSB3aWxsIGNhdXNlIGRlYWRsb2NrLgorICAgICAqLworICAgIHBqX2Fzc2VydCgwKTsKKworICAgIGtleSA9IGlvcXVldWUtPmFjdGl2ZV9saXN0Lm5leHQ7CisgICAgd2hpbGUgKGtleSAhPSAmaW9xdWV1ZS0+YWN0aXZlX2xpc3QpIHsKKwlpZiAoIXBqX2xpc3RfZW1wdHkoJmtleS0+cmVhZF9saXN0KQorI2lmIGRlZmluZWQoUEpfSEFTX1RDUCkgJiYgUEpfSEFTX1RDUCAhPSAwCisJICAgIHx8ICFwal9saXN0X2VtcHR5KCZrZXktPmFjY2VwdF9saXN0KQorI2VuZGlmCisJICAgICkgCisJeworCSAgICBwal9hc3NlcnQoUEpfRkRfSVNTRVQoa2V5LT5mZCwgcmZkc2V0KSk7CisJfSAKKwllbHNlIHsKKwkgICAgcGpfYXNzZXJ0KFBKX0ZEX0lTU0VUKGtleS0+ZmQsIHJmZHNldCkgPT0gMCk7CisJfQorCWlmICghcGpfbGlzdF9lbXB0eSgma2V5LT53cml0ZV9saXN0KQorI2lmIGRlZmluZWQoUEpfSEFTX1RDUCkgJiYgUEpfSEFTX1RDUCAhPSAwCisJICAgIHx8IGtleS0+Y29ubmVjdGluZworI2VuZGlmCisJICAgKQorCXsKKwkgICAgcGpfYXNzZXJ0KFBKX0ZEX0lTU0VUKGtleS0+ZmQsIHdmZHNldCkpOworCX0KKwllbHNlIHsKKwkgICAgcGpfYXNzZXJ0KFBKX0ZEX0lTU0VUKGtleS0+ZmQsIHdmZHNldCkgPT0gMCk7CisJfQorI2lmIGRlZmluZWQoUEpfSEFTX1RDUCkgJiYgUEpfSEFTX1RDUCAhPSAwCisJaWYgKGtleS0+Y29ubmVjdGluZykKKwl7CisJICAgIHBqX2Fzc2VydChQSl9GRF9JU1NFVChrZXktPmZkLCB4ZmRzZXQpKTsKKwl9CisJZWxzZSB7CisJICAgIHBqX2Fzc2VydChQSl9GRF9JU1NFVChrZXktPmZkLCB4ZmRzZXQpID09IDApOworCX0KKyNlbmRpZiAvKiBQSl9IQVNfVENQICovCisKKwlrZXkgPSBrZXktPm5leHQ7CisgICAgfQorfQorI2VuZGlmCS8qIFZBTElEQVRFX0ZEX1NFVCAqLworCisKKy8qIGlvcXVldWVfcmVtb3ZlX2Zyb21fc2V0KCkKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gaW9xdWV1ZV9kaXNwYXRjaF9ldmVudCgpIHRvIGluc3RydWN0CisgKiB0aGUgaW9xdWV1ZSB0byByZW1vdmUgdGhlIHNwZWNpZmllZCBkZXNjcmlwdG9yIGZyb20gaW9xdWV1ZSdzIGRlc2NyaXB0b3IKKyAqIHNldCBmb3IgdGhlIHNwZWNpZmllZCBldmVudC4KKyAqLworc3RhdGljIHZvaWQgaW9xdWV1ZV9yZW1vdmVfZnJvbV9zZXQoIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX2tleV90ICprZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gaW9xdWV1ZV9ldmVudF90eXBlIGV2ZW50X3R5cGUpCit7CisgICAgcGpfbG9ja19hY3F1aXJlKGlvcXVldWUtPmxvY2spOworCisgICAgaWYgKGV2ZW50X3R5cGUgPT0gUkVBREFCTEVfRVZFTlQpCisgICAgICAgIFBKX0ZEX0NMUigocGpfc29ja190KWtleS0+ZmQsICZpb3F1ZXVlLT5yZmRzZXQpOworICAgIGVsc2UgaWYgKGV2ZW50X3R5cGUgPT0gV1JJVEVBQkxFX0VWRU5UKQorICAgICAgICBQSl9GRF9DTFIoKHBqX3NvY2tfdClrZXktPmZkLCAmaW9xdWV1ZS0+d2Zkc2V0KTsKKyNpZiBkZWZpbmVkKFBKX0hBU19UQ1ApICYmIFBKX0hBU19UQ1AhPTAKKyAgICBlbHNlIGlmIChldmVudF90eXBlID09IEVYQ0VQVElPTl9FVkVOVCkKKyAgICAgICAgUEpfRkRfQ0xSKChwal9zb2NrX3Qpa2V5LT5mZCwgJmlvcXVldWUtPnhmZHNldCk7CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgIHBqX2Fzc2VydCgwKTsKKworICAgIHBqX2xvY2tfcmVsZWFzZShpb3F1ZXVlLT5sb2NrKTsKK30KKworLyoKKyAqIGlvcXVldWVfYWRkX3RvX3NldCgpCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHBqX2lvcXVldWVfcmVjdigpLCBwal9pb3F1ZXVlX3NlbmQoKSBldGMKKyAqIHRvIGluc3RydWN0IHRoZSBpb3F1ZXVlIHRvIGFkZCB0aGUgc3BlY2lmaWVkIGhhbmRsZSB0byBpb3F1ZXVlJ3MgZGVzY3JpcHRvcgorICogc2V0IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LgorICovCitzdGF0aWMgdm9pZCBpb3F1ZXVlX2FkZF90b19zZXQoIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGlvcXVldWVfZXZlbnRfdHlwZSBldmVudF90eXBlICkKK3sKKyAgICBwal9sb2NrX2FjcXVpcmUoaW9xdWV1ZS0+bG9jayk7CisKKyAgICBpZiAoZXZlbnRfdHlwZSA9PSBSRUFEQUJMRV9FVkVOVCkKKyAgICAgICAgUEpfRkRfU0VUKChwal9zb2NrX3Qpa2V5LT5mZCwgJmlvcXVldWUtPnJmZHNldCk7CisgICAgZWxzZSBpZiAoZXZlbnRfdHlwZSA9PSBXUklURUFCTEVfRVZFTlQpCisgICAgICAgIFBKX0ZEX1NFVCgocGpfc29ja190KWtleS0+ZmQsICZpb3F1ZXVlLT53ZmRzZXQpOworI2lmIGRlZmluZWQoUEpfSEFTX1RDUCkgJiYgUEpfSEFTX1RDUCE9MAorICAgIGVsc2UgaWYgKGV2ZW50X3R5cGUgPT0gRVhDRVBUSU9OX0VWRU5UKQorICAgICAgICBQSl9GRF9TRVQoKHBqX3NvY2tfdClrZXktPmZkLCAmaW9xdWV1ZS0+eGZkc2V0KTsKKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgcGpfYXNzZXJ0KDApOworCisgICAgcGpfbG9ja19yZWxlYXNlKGlvcXVldWUtPmxvY2spOworfQorCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworLyogU2NhbiBjbG9zaW5nIGtleXMgdG8gYmUgcHV0IHRvIGZyZWUgbGlzdCBhZ2FpbiAqLworc3RhdGljIHZvaWQgc2Nhbl9jbG9zaW5nX2tleXMocGpfaW9xdWV1ZV90ICppb3F1ZXVlKQoreworICAgIHBqX3RpbWVfdmFsIG5vdzsKKyAgICBwal9pb3F1ZXVlX2tleV90ICpoOworCisgICAgcGpfZ2V0dGlja2NvdW50KCZub3cpOworICAgIGggPSBpb3F1ZXVlLT5jbG9zaW5nX2xpc3QubmV4dDsKKyAgICB3aGlsZSAoaCAhPSAmaW9xdWV1ZS0+Y2xvc2luZ19saXN0KSB7CisJcGpfaW9xdWV1ZV9rZXlfdCAqbmV4dCA9IGgtPm5leHQ7CisKKwlwal9hc3NlcnQoaC0+Y2xvc2luZyAhPSAwKTsKKworCWlmIChQSl9USU1FX1ZBTF9HVEUobm93LCBoLT5mcmVlX3RpbWUpKSB7CisJICAgIHBqX2xpc3RfZXJhc2UoaCk7CisJICAgIC8vIERvbid0IHNldCBncnBfbG9jayB0byBOVUxMIG90aGVyd2lzZSB0aGUgb3RoZXIgdGhyZWFkCisJICAgIC8vIHdpbGwgY3Jhc2guIEp1c3QgbGVhdmUgaXQgYXMgZGFuZ2xpbmcgcG9pbnRlciwgYnV0IHRoaXMKKwkgICAgLy8gc2hvdWxkIGJlIHNhZmUKKwkgICAgLy9oLT5ncnBfbG9jayA9IE5VTEw7CisJICAgIHBqX2xpc3RfcHVzaF9iYWNrKCZpb3F1ZXVlLT5mcmVlX2xpc3QsIGgpOworCX0KKwloID0gbmV4dDsKKyAgICB9Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCkgJiYgXAorICAgIFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQhPTAKK3N0YXRpYyBwal9zdGF0dXNfdCByZXBsYWNlX3VkcF9zb2NrKHBqX2lvcXVldWVfa2V5X3QgKmgpCit7CisgICAgZW51bSBmbGFncyB7CisJSEFTX1BFRVJfQUREUiA9IDEsCisJSEFTX1FPUyA9IDIKKyAgICB9OworICAgIHBqX3NvY2tfdCBvbGRfc29jaywgbmV3X3NvY2sgPSBQSl9JTlZBTElEX1NPQ0tFVDsKKyAgICBwal9zb2NrYWRkciBsb2NhbF9hZGRyLCByZW1fYWRkcjsKKyAgICBpbnQgdmFsLCBhZGRyX2xlbjsKKyAgICBwal9mZF9zZXRfdCAqZmRzWzNdOworICAgIHVuc2lnbmVkIGksIGZkc19jbnQsIGZsYWdzPTA7CisgICAgcGpfcW9zX3BhcmFtcyBxb3NfcGFyYW1zOworICAgIHVuc2lnbmVkIG1zZWM7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgcGpfbG9ja19hY3F1aXJlKGgtPmlvcXVldWUtPmxvY2spOworCisgICAgb2xkX3NvY2sgPSBoLT5mZDsKKworICAgIC8qIENhbiBvbmx5IHJlcGxhY2UgVURQIHNvY2tldCAqLworICAgIHBqX2Fzc2VydChoLT5mZF90eXBlID09IHBqX1NPQ0tfREdSQU0oKSk7CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAiQXR0ZW1wdGluZyB0byByZXBsYWNlIFVEUCBzb2NrZXQgJWQiLCBvbGRfc29jaykpOworCisgICAgLyogSW52ZXN0aWdhdGUgdGhlIG9sZCBzb2NrZXQgKi8KKyAgICBhZGRyX2xlbiA9IHNpemVvZihsb2NhbF9hZGRyKTsKKyAgICBzdGF0dXMgPSBwal9zb2NrX2dldHNvY2tuYW1lKG9sZF9zb2NrLCAmbG9jYWxfYWRkciwgJmFkZHJfbGVuKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9lcnJvcjsKKyAgICAKKyAgICBhZGRyX2xlbiA9IHNpemVvZihyZW1fYWRkcik7CisgICAgc3RhdHVzID0gcGpfc29ja19nZXRwZWVybmFtZShvbGRfc29jaywgJnJlbV9hZGRyLCAmYWRkcl9sZW4pOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwlmbGFncyB8PSBIQVNfUEVFUl9BRERSOworCisgICAgc3RhdHVzID0gcGpfc29ja19nZXRfcW9zX3BhcmFtcyhvbGRfc29jaywgJnFvc19wYXJhbXMpOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwlmbGFncyB8PSBIQVNfUU9TOworCisgICAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBvbGQgc29ja2V0LCBjbG9zZSBpdCBvdGhlcndpc2Ugd2UnbGwgZ2V0CisgICAgICogZXJyb3IgaW4gYmluZCgpCisgICAgICovCisgICAgcGpfc29ja19jbG9zZShvbGRfc29jayk7CisKKyAgICAvKiBQcmVwYXJlIHRoZSBuZXcgc29ja2V0ICovCisgICAgc3RhdHVzID0gcGpfc29ja19zb2NrZXQobG9jYWxfYWRkci5hZGRyLnNhX2ZhbWlseSwgUEpfU09DS19ER1JBTSwgMCwKKwkJCSAgICAmbmV3X3NvY2spOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX2Vycm9yOworCisgICAgLyogRXZlbiBhZnRlciB0aGUgc29ja2V0IGlzIGNsb3NlZCwgd2UnbGwgc3RpbGwgZ2V0ICJBZGRyZXNzIGluIHVzZSIKKyAgICAgKiBlcnJvcnMsIHNvIGZvcmNlIGl0IHdpdGggU09fUkVVU0VBRERSCisgICAgICovCisgICAgdmFsID0gMTsKKyAgICBzdGF0dXMgPSBwal9zb2NrX3NldHNvY2tvcHQobmV3X3NvY2ssIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwKKwkJCQkmdmFsLCBzaXplb2YodmFsKSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBUaGUgbG9vcCBpcyBzaWxseSwgYnV0IHdoYXQgZWxzZSBjYW4gd2UgZG8/ICovCisgICAgYWRkcl9sZW4gPSBwal9zb2NrYWRkcl9nZXRfbGVuKCZsb2NhbF9hZGRyKTsKKyAgICBmb3IgKG1zZWM9MjA7IDsgbXNlYzwxMDAwPyBtc2VjPW1zZWMqMiA6IDEwMDApIHsKKwlzdGF0dXMgPSBwal9zb2NrX2JpbmQobmV3X3NvY2ssICZsb2NhbF9hZGRyLCBhZGRyX2xlbik7CisJaWYgKHN0YXR1cyAhPSBQSl9TVEFUVVNfRlJPTV9PUyhFQUREUklOVVNFKSkKKwkgICAgYnJlYWs7CisJUEpfTE9HKDQsKFRISVNfRklMRSwgIkFkZHJlc3MgaXMgc3RpbGwgaW4gdXNlLCByZXRyeWluZy4uIikpOworCXBqX3RocmVhZF9zbGVlcChtc2VjKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9lcnJvcjsKKworICAgIGlmIChmbGFncyAmIEhBU19RT1MpIHsKKwlzdGF0dXMgPSBwal9zb2NrX3NldF9xb3NfcGFyYW1zKG5ld19zb2NrLCAmcW9zX3BhcmFtcyk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICBnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIGlmIChmbGFncyAmIEhBU19QRUVSX0FERFIpIHsKKwlzdGF0dXMgPSBwal9zb2NrX2Nvbm5lY3QobmV3X3NvY2ssICZyZW1fYWRkciwgYWRkcl9sZW4pOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvKiBTZXQgc29ja2V0IHRvIG5vbmJsb2NraW5nLiAqLworICAgIHZhbCA9IDE7CisjaWYgZGVmaW5lZChQSl9XSU4zMikgJiYgUEpfV0lOMzIhPTAgfHwgXAorICAgIGRlZmluZWQoUEpfV0lONjQpICYmIFBKX1dJTjY0ICE9IDAgfHwgXAorICAgIGRlZmluZWQoUEpfV0lOMzJfV0lOQ0UpICYmIFBKX1dJTjMyX1dJTkNFIT0wCisgICAgaWYgKGlvY3Rsc29ja2V0KG5ld19zb2NrLCBGSU9OQklPLCAmdmFsKSkgeworI2Vsc2UKKyAgICBpZiAoaW9jdGwobmV3X3NvY2ssIEZJT05CSU8sICZ2YWwpKSB7CisjZW5kaWYKKyAgICAgICAgc3RhdHVzID0gcGpfZ2V0X25ldG9zX2Vycm9yKCk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvKiBSZXBsYWNlIHRoZSBvY2N1cnJlbmNlIG9mIG9sZCBzb2NrZXQgd2l0aCBuZXcgc29ja2V0IGluIHRoZQorICAgICAqIGZkIHNldHMuCisgICAgICovCisgICAgZmRzX2NudCA9IDA7CisgICAgZmRzW2Zkc19jbnQrK10gPSAmaC0+aW9xdWV1ZS0+cmZkc2V0OworICAgIGZkc1tmZHNfY250KytdID0gJmgtPmlvcXVldWUtPndmZHNldDsKKyNpZiBQSl9IQVNfVENQCisgICAgZmRzW2Zkc19jbnQrK10gPSAmaC0+aW9xdWV1ZS0+eGZkc2V0OworI2VuZGlmCisKKyAgICBmb3IgKGk9MDsgaTxmZHNfY250OyArK2kpIHsKKwlpZiAoUEpfRkRfSVNTRVQob2xkX3NvY2ssIGZkc1tpXSkpIHsKKwkgICAgUEpfRkRfQ0xSKG9sZF9zb2NrLCBmZHNbaV0pOworCSAgICBQSl9GRF9TRVQobmV3X3NvY2ssIGZkc1tpXSk7CisJfQorICAgIH0KKworICAgIC8qIEFuZCBmaW5hbGx5IHJlcGxhY2UgdGhlIGZkIGluIHRoZSBrZXkgKi8KKyAgICBoLT5mZCA9IG5ld19zb2NrOworCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgIlVEUCBoYXMgYmVlbiByZXBsYWNlZCBzdWNjZXNzZnVsbHkhIikpOworCisgICAgcGpfbG9ja19yZWxlYXNlKGgtPmlvcXVldWUtPmxvY2spOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisKK29uX2Vycm9yOgorICAgIGlmIChuZXdfc29jayAhPSBQSl9JTlZBTElEX1NPQ0tFVCkKKwlwal9zb2NrX2Nsb3NlKG5ld19zb2NrKTsKKyAgICBQSl9QRVJST1IoMSwoVEhJU19GSUxFLCBzdGF0dXMsICJFcnJvciByZXBsYWNpbmcgc29ja2V0IikpOworICAgIHBqX2xvY2tfcmVsZWFzZShoLT5pb3F1ZXVlLT5sb2NrKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKKworLyoKKyAqIHBqX2lvcXVldWVfcG9sbCgpCisgKgorICogRmV3IHRoaW5ncyB3b3J0aCB3cml0dGVuOgorICoKKyAqICAtIHdlIHVzZWQgdG8gZG8gb25seSBvbmUgY2FsbGJhY2sgY2FsbGVkIHBlciBwb2xsLCBidXQgaXQgZGlkbid0IGdvCisgKiAgICB2ZXJ5IHdlbGwuIFRoZSByZWFzb24gaXMgYmVjYXVzZSBvbiBzb21lIHNpdHVhdGlvbiwgdGhlIHdyaXRlIAorICogICAgY2FsbGJhY2sgZ2V0cyBjYWxsZWQgYWxsIHRoZSB0aW1lLCB0aHVzIGRvZXNuJ3QgZ2l2ZSB0aGUgcmVhZAorICogICAgY2FsbGJhY2sgdG8gZ2V0IGNhbGxlZC4gVGhpcyBoYXBwZW5zLCBmb3IgZXhhbXBsZSwgd2hlbiB1c2VyCisgKiAgICBzdWJtaXQgd3JpdGUgb3BlcmF0aW9uIGluc2lkZSB0aGUgd3JpdGUgY2FsbGJhY2suCisgKiAgICBBcyB0aGUgcmVzdWx0LCB3ZSBjaGFuZ2VkIHRoZSBiZWhhdmlvdXIgc28gdGhhdCBub3cgbXVsdGlwbGUKKyAqICAgIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGluIGEgc2luZ2xlIHBvbGwuIEl0IHNob3VsZCBiZSBmYXN0IHRvbywKKyAqICAgIGp1c3QgdGhhdCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWxsIHdpdGggdGhlIGlvcXVldWUgZGF0YSBzdHJ1Y3RzLgorICoKKyAqICAtIHRvIGd1YXJhbnRlZSBwcmVlbXB0aXZlbmVzcyBldGMsIHRoZSBwb2xsIGZ1bmN0aW9uIG11c3Qgc3RyaWN0bHkKKyAqICAgIHdvcmsgb24gZmRfc2V0IGNvcHkgb2YgdGhlIGlvcXVldWUgKG5vdCB0aGUgb3JpZ2luYWwgb25lKS4KKyAqLworUEpfREVGKGludCkgcGpfaW9xdWV1ZV9wb2xsKCBwal9pb3F1ZXVlX3QgKmlvcXVldWUsIGNvbnN0IHBqX3RpbWVfdmFsICp0aW1lb3V0KQoreworICAgIHBqX2ZkX3NldF90IHJmZHNldCwgd2Zkc2V0LCB4ZmRzZXQ7CisgICAgaW50IGNvdW50LCBpLCBjb3VudGVyOworICAgIHBqX2lvcXVldWVfa2V5X3QgKmg7CisgICAgc3RydWN0IGV2ZW50CisgICAgeworICAgICAgICBwal9pb3F1ZXVlX2tleV90CSprZXk7CisgICAgICAgIGVudW0gaW9xdWV1ZV9ldmVudF90eXBlICBldmVudF90eXBlOworICAgIH0gZXZlbnRbUEpfSU9RVUVVRV9NQVhfRVZFTlRTX0lOX1NJTkdMRV9QT0xMXTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oaW9xdWV1ZSwgLVBKX0VJTlZBTCk7CisKKyAgICAvKiBMb2NrIGlvcXVldWUgYmVmb3JlIG1ha2luZyBmZF9zZXQgY29waWVzICovCisgICAgcGpfbG9ja19hY3F1aXJlKGlvcXVldWUtPmxvY2spOworCisgICAgLyogV2Ugd2lsbCBvbmx5IGRvIHNlbGVjdCgpIHdoZW4gdGhlcmUgYXJlIHNvY2tldHMgdG8gYmUgcG9sbGVkLgorICAgICAqIE90aGVyd2lzZSBzZWxlY3QoKSB3aWxsIHJldHVybiBlcnJvci4KKyAgICAgKi8KKyAgICBpZiAoUEpfRkRfQ09VTlQoJmlvcXVldWUtPnJmZHNldCk9PTAgJiYKKyAgICAgICAgUEpfRkRfQ09VTlQoJmlvcXVldWUtPndmZHNldCk9PTAgCisjaWYgZGVmaW5lZChQSl9IQVNfVENQKSAmJiBQSl9IQVNfVENQIT0wCisgICAgICAgICYmIFBKX0ZEX0NPVU5UKCZpb3F1ZXVlLT54ZmRzZXQpPT0wCisjZW5kaWYKKwkpCisgICAgeworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKwlzY2FuX2Nsb3Npbmdfa2V5cyhpb3F1ZXVlKTsKKyNlbmRpZgorCXBqX2xvY2tfcmVsZWFzZShpb3F1ZXVlLT5sb2NrKTsKKwlUUkFDRV9fKChUSElTX0ZJTEUsICIgICAgIHBvbGw6IG5vIGZkIGlzIHNldCIpKTsKKyAgICAgICAgaWYgKHRpbWVvdXQpCisgICAgICAgICAgICBwal90aHJlYWRfc2xlZXAoUEpfVElNRV9WQUxfTVNFQygqdGltZW91dCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBDb3B5IGlvcXVldWUncyBwal9mZF9zZXRfdCB0byBsb2NhbCB2YXJpYWJsZXMuICovCisgICAgcGpfbWVtY3B5KCZyZmRzZXQsICZpb3F1ZXVlLT5yZmRzZXQsIHNpemVvZihwal9mZF9zZXRfdCkpOworICAgIHBqX21lbWNweSgmd2Zkc2V0LCAmaW9xdWV1ZS0+d2Zkc2V0LCBzaXplb2YocGpfZmRfc2V0X3QpKTsKKyNpZiBQSl9IQVNfVENQCisgICAgcGpfbWVtY3B5KCZ4ZmRzZXQsICZpb3F1ZXVlLT54ZmRzZXQsIHNpemVvZihwal9mZF9zZXRfdCkpOworI2Vsc2UKKyAgICBQSl9GRF9aRVJPKCZ4ZmRzZXQpOworI2VuZGlmCisKKyNpZiBWQUxJREFURV9GRF9TRVQKKyAgICB2YWxpZGF0ZV9zZXRzKGlvcXVldWUsICZyZmRzZXQsICZ3ZmRzZXQsICZ4ZmRzZXQpOworI2VuZGlmCisKKyAgICAvKiBVbmxvY2sgaW9xdWV1ZSBiZWZvcmUgc2VsZWN0KCkuICovCisgICAgcGpfbG9ja19yZWxlYXNlKGlvcXVldWUtPmxvY2spOworCisgICAgY291bnQgPSBwal9zb2NrX3NlbGVjdChpb3F1ZXVlLT5uZmRzKzEsICZyZmRzZXQsICZ3ZmRzZXQsICZ4ZmRzZXQsIAorCQkJICAgdGltZW91dCk7CisgICAgCisgICAgaWYgKGNvdW50ID09IDApCisJcmV0dXJuIDA7CisgICAgZWxzZSBpZiAoY291bnQgPCAwKQorCXJldHVybiAtcGpfZ2V0X25ldG9zX2Vycm9yKCk7CisgICAgZWxzZSBpZiAoY291bnQgPiBQSl9JT1FVRVVFX01BWF9FVkVOVFNfSU5fU0lOR0xFX1BPTEwpCisgICAgICAgIGNvdW50ID0gUEpfSU9RVUVVRV9NQVhfRVZFTlRTX0lOX1NJTkdMRV9QT0xMOworCisgICAgLyogU2NhbiBkZXNjcmlwdG9yIHNldHMgZm9yIGV2ZW50IGFuZCBhZGQgdGhlIGV2ZW50cyBpbiB0aGUgZXZlbnQKKyAgICAgKiBhcnJheSB0byBiZSBwcm9jZXNzZWQgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbi4gV2UgZG8gdGhpcyBzbyB0aGF0CisgICAgICogZXZlbnRzIGNhbiBiZSBwcm9jZXNzZWQgaW4gcGFyYWxsZWwgd2l0aG91dCBob2xkaW5nIGlvcXVldWUgbG9jay4KKyAgICAgKi8KKyAgICBwal9sb2NrX2FjcXVpcmUoaW9xdWV1ZS0+bG9jayk7CisKKyAgICBjb3VudGVyID0gMDsKKworICAgIC8qIFNjYW4gZm9yIHdyaXRhYmxlIHNvY2tldHMgZmlyc3QgdG8gaGFuZGxlIHBpZ2d5LWJhY2sgZGF0YQorICAgICAqIGNvbWluZyB3aXRoIGFjY2VwdCgpLgorICAgICAqLworICAgIGggPSBpb3F1ZXVlLT5hY3RpdmVfbGlzdC5uZXh0OworICAgIGZvciAoIDsgaCE9JmlvcXVldWUtPmFjdGl2ZV9saXN0ICYmIGNvdW50ZXI8Y291bnQ7IGggPSBoLT5uZXh0KSB7CisKKwlpZiAoIChrZXlfaGFzX3BlbmRpbmdfd3JpdGUoaCkgfHwga2V5X2hhc19wZW5kaW5nX2Nvbm5lY3QoaCkpCisJICAgICAmJiBQSl9GRF9JU1NFVChoLT5mZCwgJndmZHNldCkgJiYgIUlTX0NMT1NJTkcoaCkpCisgICAgICAgIHsKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisJICAgIGluY3JlbWVudF9jb3VudGVyKGgpOworI2VuZGlmCisgICAgICAgICAgICBldmVudFtjb3VudGVyXS5rZXkgPSBoOworICAgICAgICAgICAgZXZlbnRbY291bnRlcl0uZXZlbnRfdHlwZSA9IFdSSVRFQUJMRV9FVkVOVDsKKyAgICAgICAgICAgICsrY291bnRlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNjYW4gZm9yIHJlYWRhYmxlIHNvY2tldC4gKi8KKwlpZiAoKGtleV9oYXNfcGVuZGluZ19yZWFkKGgpIHx8IGtleV9oYXNfcGVuZGluZ19hY2NlcHQoaCkpCisgICAgICAgICAgICAmJiBQSl9GRF9JU1NFVChoLT5mZCwgJnJmZHNldCkgJiYgIUlTX0NMT1NJTkcoaCkgJiYKKwkgICAgY291bnRlcjxjb3VudCkKKyAgICAgICAgeworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKwkgICAgaW5jcmVtZW50X2NvdW50ZXIoaCk7CisjZW5kaWYKKyAgICAgICAgICAgIGV2ZW50W2NvdW50ZXJdLmtleSA9IGg7CisgICAgICAgICAgICBldmVudFtjb3VudGVyXS5ldmVudF90eXBlID0gUkVBREFCTEVfRVZFTlQ7CisgICAgICAgICAgICArK2NvdW50ZXI7CisJfQorCisjaWYgUEpfSEFTX1RDUAorICAgICAgICBpZiAoa2V5X2hhc19wZW5kaW5nX2Nvbm5lY3QoaCkgJiYgUEpfRkRfSVNTRVQoaC0+ZmQsICZ4ZmRzZXQpICYmCisJICAgICFJU19DTE9TSU5HKGgpICYmIGNvdW50ZXI8Y291bnQpIAorCXsKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisJICAgIGluY3JlbWVudF9jb3VudGVyKGgpOworI2VuZGlmCisgICAgICAgICAgICBldmVudFtjb3VudGVyXS5rZXkgPSBoOworICAgICAgICAgICAgZXZlbnRbY291bnRlcl0uZXZlbnRfdHlwZSA9IEVYQ0VQVElPTl9FVkVOVDsKKyAgICAgICAgICAgICsrY291bnRlcjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgZm9yIChpPTA7IGk8Y291bnRlcjsgKytpKSB7CisJaWYgKGV2ZW50W2ldLmtleS0+Z3JwX2xvY2spCisJICAgIHBqX2dycF9sb2NrX2FkZF9yZWZfZGJnKGV2ZW50W2ldLmtleS0+Z3JwX2xvY2ssICJpb3F1ZXVlIiwgMCk7CisgICAgfQorCisgICAgUEpfUkFDRV9NRSg1KTsKKworICAgIHBqX2xvY2tfcmVsZWFzZShpb3F1ZXVlLT5sb2NrKTsKKworICAgIFBKX1JBQ0VfTUUoNSk7CisKKyAgICBjb3VudCA9IGNvdW50ZXI7CisKKyAgICAvKiBOb3cgcHJvY2VzcyBhbGwgZXZlbnRzLiBUaGUgZGlzcGF0Y2ggZnVuY3Rpb25zIHdpbGwgdGFrZSBjYXJlCisgICAgICogb2YgbG9ja2luZyBpbiBlYWNoIG9mIHRoZSBrZXkKKyAgICAgKi8KKyAgICBmb3IgKGNvdW50ZXI9MDsgY291bnRlcjxjb3VudDsgKytjb3VudGVyKSB7CisgICAgICAgIHN3aXRjaCAoZXZlbnRbY291bnRlcl0uZXZlbnRfdHlwZSkgeworICAgICAgICBjYXNlIFJFQURBQkxFX0VWRU5UOgorICAgICAgICAgICAgaW9xdWV1ZV9kaXNwYXRjaF9yZWFkX2V2ZW50KGlvcXVldWUsIGV2ZW50W2NvdW50ZXJdLmtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXUklURUFCTEVfRVZFTlQ6CisgICAgICAgICAgICBpb3F1ZXVlX2Rpc3BhdGNoX3dyaXRlX2V2ZW50KGlvcXVldWUsIGV2ZW50W2NvdW50ZXJdLmtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFWENFUFRJT05fRVZFTlQ6CisgICAgICAgICAgICBpb3F1ZXVlX2Rpc3BhdGNoX2V4Y2VwdGlvbl9ldmVudChpb3F1ZXVlLCBldmVudFtjb3VudGVyXS5rZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTk9fRVZFTlQ6CisgICAgICAgICAgICBwal9hc3NlcnQoISJJbnZhbGlkIGV2ZW50ISIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKwlkZWNyZW1lbnRfY291bnRlcihldmVudFtjb3VudGVyXS5rZXkpOworI2VuZGlmCisKKwlpZiAoZXZlbnRbY291bnRlcl0ua2V5LT5ncnBfbG9jaykKKwkgICAgcGpfZ3JwX2xvY2tfZGVjX3JlZl9kYmcoZXZlbnRbY291bnRlcl0ua2V5LT5ncnBfbG9jaywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlvcXVldWUiLCAwKTsKKyAgICB9CisKKworICAgIHJldHVybiBjb3VudDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pb3F1ZXVlX3N5bWJpYW4uY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pb3F1ZXVlX3N5bWJpYW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzEwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2lvcXVldWVfc3ltYmlhbi5jcHAKQEAgLTAsMCArMSw4NjYgQEAKKy8qICRJZDogaW9xdWV1ZV9zeW1iaWFuLmNwcCA0Mzc0IDIwMTMtMDItMjcgMDc6MTU6NTdaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9pb3F1ZXVlLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9saXN0Lmg+CisjaW5jbHVkZSA8cGovbG9jay5oPgorI2luY2x1ZGUgPHBqL3Bvb2wuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworI2luY2x1ZGUgIm9zX3N5bWJpYW4uaCIKKworY2xhc3MgQ0lvcXVldWVDYWxsYmFjazsKKworLyoKKyAqIElPIFF1ZXVlIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHBqX2lvcXVldWVfdAoreworICAgIGludAkJICAgICBldmVudENvdW50OworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xhc3MgdG8gZW5jYXBzdWxhdGUgYXN5bmNocm9ub3VzIHNvY2tldCBvcGVyYXRpb24uCisvLworY2xhc3MgQ0lvcXVldWVDYWxsYmFjayA6IHB1YmxpYyBDQWN0aXZlCit7CitwdWJsaWM6CisgICAgc3RhdGljIENJb3F1ZXVlQ2FsbGJhY2sqIE5ld0wocGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJCSAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LCAKKwkJCQkgIHBqX3NvY2tfdCBzb2NrLCAKKwkJCQkgIGNvbnN0IHBqX2lvcXVldWVfY2FsbGJhY2sgKmNiLCAKKwkJCQkgIHZvaWQgKnVzZXJfZGF0YSk7CisKKyAgICAvLworICAgIC8vIFN0YXJ0IGFzeW5jaHJvbm91cyByZWN2KCkgb3BlcmF0aW9uCisgICAgLy8KKyAgICBwal9zdGF0dXNfdCBTdGFydFJlYWQocGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LCAKKwkJCSAgdm9pZCAqYnVmLCBwal9zc2l6ZV90ICpzaXplLCB1bnNpZ25lZCBmbGFncywKKwkJCSAgcGpfc29ja2FkZHJfdCAqYWRkciwgaW50ICphZGRybGVuKTsKKworICAgIC8vCisgICAgLy8gU3RhcnQgYXN5bmNocm9ub3VzIGFjY2VwdCgpIG9wZXJhdGlvbi4KKyAgICAvLworICAgIHBqX3N0YXR1c190IFN0YXJ0QWNjZXB0KHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCSAgICBwal9zb2NrX3QgKm5ld19zb2NrLAorCQkJICAgIHBqX3NvY2thZGRyX3QgKmxvY2FsLAorCQkJICAgIHBqX3NvY2thZGRyX3QgKnJlbW90ZSwKKwkJCSAgICBpbnQgKmFkZHJsZW4gKTsKKworICAgIC8vCisgICAgLy8gQ29tcGxldGlvbiBjYWxsYmFjay4KKyAgICAvLworICAgIHZvaWQgUnVuTCgpOworCisgICAgLy8KKyAgICAvLyBDQWN0aXZlJ3MgRG9DYW5jZWwoKQorICAgIC8vCisgICAgdm9pZCBEb0NhbmNlbCgpOworCisgICAgLy8KKyAgICAvLyBDYW5jZWwgb3BlcmF0aW9uIGFuZCBjYWxsIGNhbGxiYWNrLgorICAgIC8vCisgICAgdm9pZCBDYW5jZWxPcGVyYXRpb24ocGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LCAKKwkJCSBwal9zc2l6ZV90IGJ5dGVzX3N0YXR1cyk7CisKKyAgICAvLworICAgIC8vIEFjY2Vzc29ycworICAgIC8vCisgICAgdm9pZCogZ2V0X3VzZXJfZGF0YSgpIGNvbnN0CisgICAgeworCXJldHVybiB1c2VyX2RhdGFfOworICAgIH0KKyAgICB2b2lkIHNldF91c2VyX2RhdGEodm9pZCAqdXNlcl9kYXRhKQorICAgIHsKKwl1c2VyX2RhdGFfID0gdXNlcl9kYXRhOworICAgIH0KKyAgICBwal9pb3F1ZXVlX29wX2tleV90ICpnZXRfb3Bfa2V5KCkgY29uc3QKKyAgICB7CisJcmV0dXJuIHBlbmRpbmdfZGF0YV8uY29tbW9uXy5vcF9rZXlfOworICAgIH0KKyAgICBDUGpTb2NrZXQqIGdldF9wal9zb2NrZXQoKQorICAgIHsKKwlyZXR1cm4gc29ja187CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIFR5cGUgb2YgcGVuZGluZyBvcGVyYXRpb24uCisgICAgZW51bSBUeXBlIHsKKwlUWVBFX05PTkUsCisJVFlQRV9SRUFELAorCVRZUEVfQUNDRVBULAorICAgIH07CisKKyAgICAvLyBTdGF0aWMgZGF0YS4KKyAgICBwal9pb3F1ZXVlX3QJCSppb3F1ZXVlXzsKKyAgICBwal9pb3F1ZXVlX2tleV90CQkqa2V5XzsKKyAgICBDUGpTb2NrZXQJCQkqc29ja187CisgICAgcGpfaW9xdWV1ZV9jYWxsYmFjawkJIGNiXzsKKyAgICB2b2lkCQkJKnVzZXJfZGF0YV87CisKKyAgICAvLyBTeW1iaWFuIGRhdGEuCisgICAgVFB0cjgJCQkgYUJ1ZmZlclB0cl87CisgICAgVEluZXRBZGRyCQkJIGFBZGRyZXNzXzsKKworICAgIC8vIEFwcGxpY2F0aW9uIGRhdGEuCisgICAgVHlwZQkJCSB0eXBlXzsKKworICAgIHVuaW9uIFBlbmRpbmdfRGF0YQorICAgIHsKKwlzdHJ1Y3QgQ29tbW9uCisJeworCSAgICBwal9pb3F1ZXVlX29wX2tleV90CSpvcF9rZXlfOworCX0gY29tbW9uXzsKKworCXN0cnVjdCBQZW5kaW5nX1JlYWQKKwl7CisJICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QJKm9wX2tleV87CisJICAgIHBqX3NvY2thZGRyX3QJKmFkZHJfOworCSAgICBpbnQJCQkqYWRkcmxlbl87CisJfSByZWFkXzsKKworCXN0cnVjdCBQZW5kaW5nX0FjY2VwdAorCXsKKwkgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5XzsKKwkgICAgcGpfc29ja190CQkqbmV3X3NvY2tfOworCSAgICBwal9zb2NrYWRkcl90CSpsb2NhbF87CisJICAgIHBqX3NvY2thZGRyX3QJKnJlbW90ZV87CisJICAgIGludAkJCSphZGRybGVuXzsKKwl9IGFjY2VwdF87CisgICAgfTsKKworICAgIHVuaW9uIFBlbmRpbmdfRGF0YQkJIHBlbmRpbmdfZGF0YV87CisgICAgUlNvY2tldAkJCWJsYW5rX3NvY2tfOworCisgICAgQ0lvcXVldWVDYWxsYmFjayhwal9pb3F1ZXVlX3QgKmlvcXVldWUsCisJCSAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LCBwal9zb2NrX3Qgc29jaywgCisJCSAgICAgY29uc3QgcGpfaW9xdWV1ZV9jYWxsYmFjayAqY2IsIHZvaWQgKnVzZXJfZGF0YSkKKyAgICA6IENBY3RpdmUoQ0FjdGl2ZTo6RVByaW9yaXR5U3RhbmRhcmQpLAorCSAgaW9xdWV1ZV8oaW9xdWV1ZSksIGtleV8oa2V5KSwgc29ja18oKENQalNvY2tldCopc29jayksIAorCSAgdXNlcl9kYXRhXyh1c2VyX2RhdGEpLCBhQnVmZmVyUHRyXyhOVUxMLCAwKSwgdHlwZV8oVFlQRV9OT05FKQorICAgIHsKKyAgICAJcGpfbWVtY3B5KCZjYl8sIGNiLCBzaXplb2YoKmNiKSk7CisgICAgfQorCisKKyAgICB2b2lkIENvbnN0cnVjdEwoKQorICAgIHsKKwlDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZvaWQgSGFuZGxlUmVhZENvbXBsZXRpb24oKTsKKyAgICBDUGpTb2NrZXQgKkhhbmRsZUFjY2VwdENvbXBsZXRpb24oKTsKK307CisKKworQ0lvcXVldWVDYWxsYmFjayogQ0lvcXVldWVDYWxsYmFjazo6TmV3TChwal9pb3F1ZXVlX3QgKmlvcXVldWUsCisJCQkJCSBwal9pb3F1ZXVlX2tleV90ICprZXksIAorCQkJCQkgcGpfc29ja190IHNvY2ssIAorCQkJCQkgY29uc3QgcGpfaW9xdWV1ZV9jYWxsYmFjayAqY2IsIAorCQkJCQkgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIENJb3F1ZXVlQ2FsbGJhY2sgKnNlbGYgPSBuZXcgQ0lvcXVldWVDYWxsYmFjayhpb3F1ZXVlLCBrZXksIHNvY2ssIAorCQkJCQkJICBjYiwgdXNlcl9kYXRhKTsKKyAgICBDbGVhbnVwU3RhY2s6OlB1c2hMKHNlbGYpOworICAgIHNlbGYtPkNvbnN0cnVjdEwoKTsKKyAgICBDbGVhbnVwU3RhY2s6OlBvcChzZWxmKTsKKworICAgIHJldHVybiBzZWxmOworfQorCisKKy8vCisvLyBTdGFydCBhc3luY2hyb25vdXMgcmVjdigpIG9wZXJhdGlvbgorLy8KK3BqX3N0YXR1c190IENJb3F1ZXVlQ2FsbGJhY2s6OlN0YXJ0UmVhZChwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksIAorCQkJCQl2b2lkICpidWYsIHBqX3NzaXplX3QgKnNpemUsIAorCQkJCQl1bnNpZ25lZCBmbGFncywKKwkJCQkJcGpfc29ja2FkZHJfdCAqYWRkciwgaW50ICphZGRybGVuKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oSXNBY3RpdmUoKT09ZmFsc2UsIFBKX0VCVVNZKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBlbmRpbmdfZGF0YV8uY29tbW9uXy5vcF9rZXlfPT1OVUxMLCBQSl9FQlVTWSk7CisKKyAgICBmbGFncyAmPSB+UEpfSU9RVUVVRV9BTFdBWVNfQVNZTkM7CisKKyAgICBwZW5kaW5nX2RhdGFfLnJlYWRfLm9wX2tleV8gPSBvcF9rZXk7CisgICAgcGVuZGluZ19kYXRhXy5yZWFkXy5hZGRyXyA9IGFkZHI7CisgICAgcGVuZGluZ19kYXRhXy5yZWFkXy5hZGRybGVuXyA9IGFkZHJsZW47CisKKyAgICBhQnVmZmVyUHRyXy5TZXQoKFRVaW50OCopYnVmLCAwLCAoVEludCkqc2l6ZSk7CisKKyAgICB0eXBlXyA9IFRZUEVfUkVBRDsKKyAgICBpZiAoYWRkciAmJiBhZGRybGVuKSB7CisJc29ja18tPlNvY2tldCgpLlJlY3ZGcm9tKGFCdWZmZXJQdHJfLCBhQWRkcmVzc18sIGZsYWdzLCBpU3RhdHVzKTsKKyAgICB9IGVsc2UgeworCWFBZGRyZXNzXy5TZXRBZGRyZXNzKDApOworCWFBZGRyZXNzXy5TZXRQb3J0KDApOworCisJaWYgKHNvY2tfLT5Jc0RhdGFncmFtKCkpIHsKKwkgICAgc29ja18tPlNvY2tldCgpLlJlY3YoYUJ1ZmZlclB0cl8sIGZsYWdzLCBpU3RhdHVzKTsKKwl9IGVsc2UgeworCSAgICAvLyBVc2luZyBzdGF0aWMgbGlrZSB0aGlzIGlzIG5vdCBwcmV0dHksIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIHVzZQorCSAgICAvLyB0aGUgdmFsdWUgYW55d2F5LCBoZW5jZSBkb2luZyBpdCBsaWtlIHRoaXMgaXMgcHJvYmFibHkgbW9zdAorCSAgICAvLyBvcHRpbWFsLgorCSAgICBzdGF0aWMgVFNvY2tYZnJMZW5ndGggbGVuOworCSAgICBzb2NrXy0+U29ja2V0KCkuUmVjdk9uZU9yTW9yZShhQnVmZmVyUHRyXywgZmxhZ3MsIGlTdGF0dXMsIGxlbik7CisJfQorICAgIH0KKworICAgIFNldEFjdGl2ZSgpOworICAgIHJldHVybiBQSl9FUEVORElORzsKK30KKworCisvLworLy8gU3RhcnQgYXN5bmNocm9ub3VzIGFjY2VwdCgpIG9wZXJhdGlvbi4KKy8vCitwal9zdGF0dXNfdCBDSW9xdWV1ZUNhbGxiYWNrOjpTdGFydEFjY2VwdChwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisJCQkJCSAgcGpfc29ja190ICpuZXdfc29jaywKKwkJCQkJICBwal9zb2NrYWRkcl90ICpsb2NhbCwKKwkJCQkJICBwal9zb2NrYWRkcl90ICpyZW1vdGUsCisJCQkJCSAgaW50ICphZGRybGVuICkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKElzQWN0aXZlKCk9PWZhbHNlLCBQSl9FQlVTWSk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihwZW5kaW5nX2RhdGFfLmNvbW1vbl8ub3Bfa2V5Xz09TlVMTCwgUEpfRUJVU1kpOworCisgICAgLy8gYWRkcmxlbiBtdXN0IGJlIHNwZWNpZmllZCBpZiBsb2NhbCBvciByZW1vdGUgaXMgc3BlY2lmaWVkCisgICAgUEpfQVNTRVJUX1JFVFVSTigoIWxvY2FsICYmICFyZW1vdGUpIHx8CisgICAgCQkgICAgIChhZGRybGVuICYmICphZGRybGVuKSwgUEpfRUlOVkFMKTsKKyAgICAKKyAgICBwZW5kaW5nX2RhdGFfLmFjY2VwdF8ub3Bfa2V5XyA9IG9wX2tleTsKKyAgICBwZW5kaW5nX2RhdGFfLmFjY2VwdF8ubmV3X3NvY2tfID0gbmV3X3NvY2s7CisgICAgcGVuZGluZ19kYXRhXy5hY2NlcHRfLmxvY2FsXyA9IGxvY2FsOworICAgIHBlbmRpbmdfZGF0YV8uYWNjZXB0Xy5yZW1vdGVfID0gcmVtb3RlOworICAgIHBlbmRpbmdfZGF0YV8uYWNjZXB0Xy5hZGRybGVuXyA9IGFkZHJsZW47CisKKyAgICAvLyBDcmVhdGUgYmxhbmsgc29ja2V0CisgICAgYmxhbmtfc29ja18uT3BlbihQalN5bWJpYW5PUzo6SW5zdGFuY2UoKS0+U29ja2V0U2VydigpKTsKKworICAgIHR5cGVfID0gVFlQRV9BQ0NFUFQ7CisgICAgc29ja18tPlNvY2tldCgpLkFjY2VwdChibGFua19zb2NrXywgaVN0YXR1cyk7CisKKyAgICBTZXRBY3RpdmUoKTsKKyAgICByZXR1cm4gUEpfRVBFTkRJTkc7Cit9CisKKworLy8KKy8vIEhhbmRsZSBhc3luY2hyb25vdXMgUmVjdkZyb20oKSBjb21wbGV0aW9uCisvLwordm9pZCBDSW9xdWV1ZUNhbGxiYWNrOjpIYW5kbGVSZWFkQ29tcGxldGlvbigpIAoreworICAgIGlmIChwZW5kaW5nX2RhdGFfLnJlYWRfLmFkZHJfICYmIHBlbmRpbmdfZGF0YV8ucmVhZF8uYWRkcmxlbl8pIHsKKwlQalN5bWJpYW5PUzo6QWRkcjJwaihhQWRkcmVzc18sIAorCQkJICAgICAqKHBqX3NvY2thZGRyKilwZW5kaW5nX2RhdGFfLnJlYWRfLmFkZHJfLAorCQkJICAgICBwZW5kaW5nX2RhdGFfLnJlYWRfLmFkZHJsZW5fKTsKKwlwZW5kaW5nX2RhdGFfLnJlYWRfLmFkZHJfID0gTlVMTDsKKwlwZW5kaW5nX2RhdGFfLnJlYWRfLmFkZHJsZW5fID0gTlVMTDsKKyAgICB9CisJCisgICAgcGVuZGluZ19kYXRhXy5yZWFkXy5vcF9rZXlfID0gTlVMTDsKK30KKworCisvLworLy8gSGFuZGxlIGFzeW5jaHJvbm91cyBBY2NlcHQoKSBjb21wbGV0aW9uLgorLy8KK0NQalNvY2tldCAqQ0lvcXVldWVDYWxsYmFjazo6SGFuZGxlQWNjZXB0Q29tcGxldGlvbigpIAoreworCUNQalNvY2tldCAqcGpOZXdTb2NrID0gbmV3IENQalNvY2tldChnZXRfcGpfc29ja2V0KCktPkdldEFmKCksIAorCQkJCQkgICAgIGdldF9wal9zb2NrZXQoKS0+R2V0U29ja1R5cGUoKSwKKwkJCQkJICAgICBibGFua19zb2NrXyk7CisJaW50IGFkZHJsZW4gPSAwOworCQorCWlmIChwZW5kaW5nX2RhdGFfLmFjY2VwdF8ubmV3X3NvY2tfKSB7CisJICAgICpwZW5kaW5nX2RhdGFfLmFjY2VwdF8ubmV3X3NvY2tfID0gKHBqX3NvY2tfdClwak5ld1NvY2s7CisJICAgIHBlbmRpbmdfZGF0YV8uYWNjZXB0Xy5uZXdfc29ja18gPSBOVUxMOworCX0KKworCWlmIChwZW5kaW5nX2RhdGFfLmFjY2VwdF8ubG9jYWxfKSB7CisJICAgIFRJbmV0QWRkciBhQWRkcjsKKwkgICAgcGpfc29ja2FkZHIgKnB0cl9zb2NrYWRkcjsKKwkgICAgCisJICAgIGJsYW5rX3NvY2tfLkxvY2FsTmFtZShhQWRkcik7CisJICAgIHB0cl9zb2NrYWRkciA9IChwal9zb2NrYWRkciopcGVuZGluZ19kYXRhXy5hY2NlcHRfLmxvY2FsXzsKKwkgICAgYWRkcmxlbiA9ICpwZW5kaW5nX2RhdGFfLmFjY2VwdF8uYWRkcmxlbl87CisJICAgIFBqU3ltYmlhbk9TOjpBZGRyMnBqKGFBZGRyLCAqcHRyX3NvY2thZGRyLCAmYWRkcmxlbik7CisJICAgIHBlbmRpbmdfZGF0YV8uYWNjZXB0Xy5sb2NhbF8gPSBOVUxMOworCX0KKworCWlmIChwZW5kaW5nX2RhdGFfLmFjY2VwdF8ucmVtb3RlXykgeworCSAgICBUSW5ldEFkZHIgYUFkZHI7CisJICAgIHBqX3NvY2thZGRyICpwdHJfc29ja2FkZHI7CisKKwkgICAgYmxhbmtfc29ja18uUmVtb3RlTmFtZShhQWRkcik7CisJICAgIHB0cl9zb2NrYWRkciA9IChwal9zb2NrYWRkciopcGVuZGluZ19kYXRhXy5hY2NlcHRfLnJlbW90ZV87CisJICAgIGFkZHJsZW4gPSAqcGVuZGluZ19kYXRhXy5hY2NlcHRfLmFkZHJsZW5fOworCSAgICBQalN5bWJpYW5PUzo6QWRkcjJwaihhQWRkciwgKnB0cl9zb2NrYWRkciwgJmFkZHJsZW4pOworCSAgICBwZW5kaW5nX2RhdGFfLmFjY2VwdF8ucmVtb3RlXyA9IE5VTEw7CisJfQorCisJaWYgKHBlbmRpbmdfZGF0YV8uYWNjZXB0Xy5hZGRybGVuXykgeworCSAgICBpZiAoYWRkcmxlbiA9PSAwKSB7CisJICAgIAlpZiAocGpOZXdTb2NrLT5HZXRBZigpID09IFBKX0FGX0lORVQpCisJICAgIAkgICAgYWRkcmxlbiA9IHNpemVvZihwal9zb2NrYWRkcl9pbik7CisJICAgIAllbHNlIGlmIChwak5ld1NvY2stPkdldEFmKCkgPT0gUEpfQUZfSU5FVDYpCisJICAgIAkgICAgYWRkcmxlbiA9IHNpemVvZihwal9zb2NrYWRkcl9pbjYpOworCSAgICAJZWxzZSB7CisJICAgIAkgICAgcGpfYXNzZXJ0KCEiVW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkiKTsKKwkgICAgCX0KKwkgICAgfQorCSAgICAqcGVuZGluZ19kYXRhXy5hY2NlcHRfLmFkZHJsZW5fID0gYWRkcmxlbjsKKwkgICAgcGVuZGluZ19kYXRhXy5hY2NlcHRfLmFkZHJsZW5fID0gTlVMTDsKKwl9CisJCisJcmV0dXJuIHBqTmV3U29jazsKK30KKworCisvLworLy8gQ29tcGxldGlvbiBjYWxsYmFjay4KKy8vCit2b2lkIENJb3F1ZXVlQ2FsbGJhY2s6OlJ1bkwoKQoreworICAgIHBqX2lvcXVldWVfdCAqaW9xID0gaW9xdWV1ZV87CisgICAgVHlwZSBjdXJfdHlwZSA9IHR5cGVfOworCisgICAgdHlwZV8gPSBUWVBFX05PTkU7CisKKyAgICBpZiAoY3VyX3R5cGUgPT0gVFlQRV9SRUFEKSB7CisJLy8KKwkvLyBDb21wbGV0aW9uIG9mIGFzeW5jaHJvbm91cyBSZWN2RnJvbSgpCisJLy8KKworCS8qIENsZWFyIG9wX2tleSAoc2F2ZSBpdCB0byB0ZW1wIHZhcmlhYmxlIGZpcnN0ISkgKi8KKwlwal9pb3F1ZXVlX29wX2tleV90CSpvcF9rZXkgPSBwZW5kaW5nX2RhdGFfLnJlYWRfLm9wX2tleV87CisJcGVuZGluZ19kYXRhXy5yZWFkXy5vcF9rZXlfID0gTlVMTDsKKworCS8vIEhhbmRsZSBmYWlsdXJlIGNvbmRpdGlvbgorCWlmIChpU3RhdHVzICE9IEtFcnJOb25lKSB7CisJICAgIGlmIChjYl8ub25fcmVhZF9jb21wbGV0ZSkgeworCSAgICAJY2JfLm9uX3JlYWRfY29tcGxldGUoIGtleV8sIG9wX2tleSwgCisJCQkJICAgICAgLVBKX1JFVFVSTl9PU19FUlJPUihpU3RhdHVzLkludCgpKSk7CisJICAgIH0KKwkgICAgcmV0dXJuOworCX0KKworCUhhbmRsZVJlYWRDb21wbGV0aW9uKCk7CisKKwkvKiBDYWxsIGNhbGxiYWNrICovCisJaWYgKGNiXy5vbl9yZWFkX2NvbXBsZXRlKSB7CisJICAgIGNiXy5vbl9yZWFkX2NvbXBsZXRlKGtleV8sIG9wX2tleSwgYUJ1ZmZlclB0cl8uTGVuZ3RoKCkpOworCX0KKworICAgIH0gZWxzZSBpZiAoY3VyX3R5cGUgPT0gVFlQRV9BQ0NFUFQpIHsKKwkvLworCS8vIENvbXBsZXRpb24gb2YgYXN5bmNocm9ub3VzIEFjY2VwdCgpCisJLy8KKwkKKwkvKiBDbGVhciBvcF9rZXkgKHNhdmUgaXQgdG8gdGVtcCB2YXJpYWJsZSBmaXJzdCEpICovCisJcGpfaW9xdWV1ZV9vcF9rZXlfdAkqb3Bfa2V5ID0gcGVuZGluZ19kYXRhXy5yZWFkXy5vcF9rZXlfOworCXBlbmRpbmdfZGF0YV8ucmVhZF8ub3Bfa2V5XyA9IE5VTEw7CisKKwkvLyBIYW5kbGUgZmFpbHVyZSBjb25kaXRpb24KKwlpZiAoaVN0YXR1cyAhPSBLRXJyTm9uZSkgeworCSAgICBpZiAocGVuZGluZ19kYXRhXy5hY2NlcHRfLm5ld19zb2NrXykKKwkJKnBlbmRpbmdfZGF0YV8uYWNjZXB0Xy5uZXdfc29ja18gPSBQSl9JTlZBTElEX1NPQ0tFVDsKKwkgICAgCisJICAgIGlmIChjYl8ub25fYWNjZXB0X2NvbXBsZXRlKSB7CisJICAgIAljYl8ub25fYWNjZXB0X2NvbXBsZXRlKCBrZXlfLCBvcF9rZXksIFBKX0lOVkFMSURfU09DS0VULAorCQkJCSAgICAgICAgLVBKX1JFVFVSTl9PU19FUlJPUihpU3RhdHVzLkludCgpKSk7CisJICAgIH0KKwkgICAgcmV0dXJuOworCX0KKworCUNQalNvY2tldCAqcGpOZXdTb2NrID0gSGFuZGxlQWNjZXB0Q29tcGxldGlvbigpOworCQorCS8vIENhbGwgY2FsbGJhY2suCisJaWYgKGNiXy5vbl9hY2NlcHRfY29tcGxldGUpIHsKKwkgICAgY2JfLm9uX2FjY2VwdF9jb21wbGV0ZSgga2V5Xywgb3Bfa2V5LCAocGpfc29ja190KXBqTmV3U29jaywgCisJCQkJICAgIFBKX1NVQ0NFU1MpOworCX0KKyAgICB9CisKKyAgICBpb3EtPmV2ZW50Q291bnQrKzsKK30KKworLy8KKy8vIENBY3RpdmUncyBEb0NhbmNlbCgpCisvLwordm9pZCBDSW9xdWV1ZUNhbGxiYWNrOjpEb0NhbmNlbCgpCit7CisgICAgaWYgKHR5cGVfID09IFRZUEVfUkVBRCkKKwlzb2NrXy0+U29ja2V0KCkuQ2FuY2VsUmVjdigpOworICAgIGVsc2UgaWYgKHR5cGVfID09IFRZUEVfQUNDRVBUKQorCXNvY2tfLT5Tb2NrZXQoKS5DYW5jZWxBY2NlcHQoKTsKKworICAgIHR5cGVfID0gVFlQRV9OT05FOworICAgIHBlbmRpbmdfZGF0YV8uY29tbW9uXy5vcF9rZXlfID0gTlVMTDsKK30KKworLy8KKy8vIENhbmNlbCBvcGVyYXRpb24gYW5kIGNhbGwgY2FsbGJhY2suCisvLwordm9pZCBDSW9xdWV1ZUNhbGxiYWNrOjpDYW5jZWxPcGVyYXRpb24ocGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LCAKKwkJCQkgICAgICAgcGpfc3NpemVfdCBieXRlc19zdGF0dXMpCit7CisgICAgVHlwZSBjdXJfdHlwZSA9IHR5cGVfOworCisgICAgcGpfYXNzZXJ0KG9wX2tleSA9PSBwZW5kaW5nX2RhdGFfLmNvbW1vbl8ub3Bfa2V5Xyk7CisKKyAgICBDYW5jZWwoKTsKKworICAgIGlmIChjdXJfdHlwZSA9PSBUWVBFX1JFQUQpIHsKKyAgICAJaWYgKGNiXy5vbl9yZWFkX2NvbXBsZXRlKQorICAgIAkgICAgY2JfLm9uX3JlYWRfY29tcGxldGUoa2V5Xywgb3Bfa2V5LCBieXRlc19zdGF0dXMpOworICAgIH0gZWxzZSBpZiAoY3VyX3R5cGUgPT0gVFlQRV9BQ0NFUFQpCisJOyAgICAKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIElPIFF1ZXVlIGtleSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBwal9pb3F1ZXVlX2tleV90Cit7CisgICAgQ0lvcXVldWVDYWxsYmFjawkqY2JPYmo7Cit9OworCisKKy8qCisgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGlvcXVldWUgaW1wbGVtZW50YXRpb24uCisgKi8KK1BKX0RFRihjb25zdCBjaGFyKikgcGpfaW9xdWV1ZV9uYW1lKHZvaWQpCit7CisgICAgcmV0dXJuICJpb3F1ZXVlLXN5bWJpYW4iOworfQorCisKKy8qCisgKiBDcmVhdGUgYSBuZXcgSS9PIFF1ZXVlIGZyYW1ld29yay4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX2NyZWF0ZSgJcGpfcG9vbF90ICpwb29sLCAKKwkJCQkJcGpfc2l6ZV90IG1heF9mZCwKKwkJCQkJcGpfaW9xdWV1ZV90ICoqcF9pb3F1ZXVlKQoreworICAgIHBqX2lvcXVldWVfdCAqaW9xOworCisgICAgUEpfVU5VU0VEX0FSRyhtYXhfZmQpOworCisgICAgaW9xID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBwal9pb3F1ZXVlX3QpOworICAgICpwX2lvcXVldWUgPSBpb3E7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIERlc3Ryb3kgdGhlIEkvTyBxdWV1ZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX2Rlc3Ryb3koIHBqX2lvcXVldWVfdCAqaW9xICkKK3sKKyAgICBQSl9VTlVTRURfQVJHKGlvcSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIFNldCB0aGUgbG9jayBvYmplY3QgdG8gYmUgdXNlZCBieSB0aGUgSS9PIFF1ZXVlLiAKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3NldF9sb2NrKCBwal9pb3F1ZXVlX3QgKmlvcSwgCisJCQkJCSBwal9sb2NrX3QgKmxvY2ssCisJCQkJCSBwal9ib29sX3QgYXV0b19kZWxldGUgKQoreworICAgIC8qIERvbid0IHJlYWxseSBuZWVkIGxvY2sgZm9yIG5vdyAqLworICAgIFBKX1VOVVNFRF9BUkcoaW9xKTsKKyAgICAKKyAgICBpZiAoYXV0b19kZWxldGUpIHsKKwlwal9sb2NrX2Rlc3Ryb3kobG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9zZXRfZGVmYXVsdF9jb25jdXJyZW5jeShwal9pb3F1ZXVlX3QgKmlvcXVldWUsCisJCQkJCQkJCQkJCQkJICAgcGpfYm9vbF90IGFsbG93KQoreworCS8qIE5vdCBzdXBwb3J0ZWQsIGp1c3QgcmV0dXJuIFBKX1NVQ0NFU1Mgc2lsZW50bHkgKi8KKwlQSl9VTlVTRURfQVJHKGlvcXVldWUpOworCVBKX1VOVVNFRF9BUkcoYWxsb3cpOworCXJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogUmVnaXN0ZXIgYSBzb2NrZXQgdG8gdGhlIEkvTyBxdWV1ZSBmcmFtZXdvcmsuIAorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICBwal9pb3F1ZXVlX3QgKmlvcSwKKwkJCQkJICAgICAgcGpfc29ja190IHNvY2ssCisJCQkJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJICAgICAgY29uc3QgcGpfaW9xdWV1ZV9jYWxsYmFjayAqY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqKnBfa2V5ICkKK3sKKyAgICBwal9pb3F1ZXVlX2tleV90ICprZXk7CisKKyAgICBrZXkgPSBQSl9QT09MX1pBTExPQ19UKHBvb2wsIHBqX2lvcXVldWVfa2V5X3QpOworICAgIGtleS0+Y2JPYmogPSBDSW9xdWV1ZUNhbGxiYWNrOjpOZXdMKGlvcSwga2V5LCBzb2NrLCBjYiwgdXNlcl9kYXRhKTsKKworICAgICpwX2tleSA9IGtleTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2syKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJCQkgICAgICBwal9zb2NrX3Qgc29jaywKKwkJCQkJICAgICAgcGpfZ3JwX2xvY2tfdCAqZ3JwX2xvY2ssCisJCQkJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKwkJCQkJICAgICAgY29uc3QgcGpfaW9xdWV1ZV9jYWxsYmFjayAqY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqKnBfa2V5KQoreworICAgIFBKX1VOVVNFRF9BUkcoZ3JwX2xvY2spOworCisgICAgcmV0dXJuIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayhwb29sLCBpb3F1ZXVlLCBzb2NrLCB1c2VyX2RhdGEsIGNiLCBwX2tleSk7Cit9CisKKy8qCisgKiBVbnJlZ2lzdGVyIGZyb20gdGhlIEkvTyBRdWV1ZSBmcmFtZXdvcmsuIAorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfdW5yZWdpc3RlciggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5ICkKK3sKKyAgICBpZiAoa2V5ID09IE5VTEwgfHwga2V5LT5jYk9iaiA9PSBOVUxMKQorCXJldHVybiBQSl9TVUNDRVNTOworCisgICAgLy8gQ2FuY2VsIHBlbmRpbmcgYXN5bmMgb2JqZWN0CisgICAgaWYgKGtleS0+Y2JPYmopIHsKKwlrZXktPmNiT2JqLT5DYW5jZWwoKTsKKyAgICB9CisKKyAgICAvLyBDbG9zZSBzb2NrZXQuCisgICAga2V5LT5jYk9iai0+Z2V0X3BqX3NvY2tldCgpLT5Tb2NrZXQoKS5DbG9zZSgpOworICAgIGRlbGV0ZSBrZXktPmNiT2JqLT5nZXRfcGpfc29ja2V0KCk7CisKKyAgICAvLyBEZWxldGUgYXN5bmMgb2JqZWN0LgorICAgIGlmIChrZXktPmNiT2JqKSB7CisJZGVsZXRlIGtleS0+Y2JPYmo7CisJa2V5LT5jYk9iaiA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIEdldCB1c2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGlvcXVldWUga2V5LgorICovCitQSl9ERUYodm9pZCopIHBqX2lvcXVldWVfZ2V0X3VzZXJfZGF0YSggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5ICkKK3sKKyAgICByZXR1cm4ga2V5LT5jYk9iai0+Z2V0X3VzZXJfZGF0YSgpOworfQorCisKKy8qCisgKiBTZXQgb3IgY2hhbmdlIHRoZSB1c2VyIGRhdGEgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3Igb3IKKyAqIGhhbmRsZSBvciBzb2NrZXQgZGVzY3JpcHRvci4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3NldF91c2VyX2RhdGEoIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9sZF9kYXRhKQoreworICAgIGlmIChvbGRfZGF0YSkKKwkqb2xkX2RhdGEgPSBrZXktPmNiT2JqLT5nZXRfdXNlcl9kYXRhKCk7CisgICAga2V5LT5jYk9iai0+c2V0X3VzZXJfZGF0YSh1c2VyX2RhdGEpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgb3BlcmF0aW9uIGtleS4KKyAqLworUEpfREVGKHZvaWQpIHBqX2lvcXVldWVfb3Bfa2V5X2luaXQoIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCQkgICAgIHBqX3NpemVfdCBzaXplICkKK3sKKyAgICBwal9iemVybyhvcF9rZXksIHNpemUpOworfQorCisKKy8qCisgKiBDaGVjayBpZiBvcGVyYXRpb24gaXMgcGVuZGluZyBvbiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBrZXkuCisgKi8KK1BKX0RFRihwal9ib29sX3QpIHBqX2lvcXVldWVfaXNfcGVuZGluZyggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXkgKQoreworICAgIHJldHVybiBrZXktPmNiT2JqLT5nZXRfb3Bfa2V5KCk9PW9wX2tleSAmJgorCSAgIGtleS0+Y2JPYmotPklzQWN0aXZlKCk7Cit9CisKKworLyoKKyAqIFBvc3QgY29tcGxldGlvbiBzdGF0dXMgdG8gdGhlIHNwZWNpZmllZCBvcGVyYXRpb24ga2V5IGFuZCBjYWxsIHRoZQorICogYXBwcm9wcmlhdGUgY2FsbGJhY2suIAorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfcG9zdF9jb21wbGV0aW9uKCBwal9pb3F1ZXVlX2tleV90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zc2l6ZV90IGJ5dGVzX3N0YXR1cyApCit7CisgICAgaWYgKHBqX2lvcXVldWVfaXNfcGVuZGluZyhrZXksIG9wX2tleSkpIHsKKwlrZXktPmNiT2JqLT5DYW5jZWxPcGVyYXRpb24ob3Bfa2V5LCBieXRlc19zdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisjaWYgZGVmaW5lZChQSl9IQVNfVENQKSAmJiBQSl9IQVNfVENQICE9IDAKKy8qKgorICogSW5zdHJ1Y3QgSS9PIFF1ZXVlIHRvIGFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9uIG9uIHRoZSBzcGVjaWZpZWQgCisgKiBsaXN0ZW5pbmcgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfYWNjZXB0KCBwal9pb3F1ZXVlX2tleV90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisJCQkJICAgICAgIHBqX3NvY2tfdCAqbmV3X3NvY2ssCisJCQkJICAgICAgIHBqX3NvY2thZGRyX3QgKmxvY2FsLAorCQkJCSAgICAgICBwal9zb2NrYWRkcl90ICpyZW1vdGUsCisJCQkJICAgICAgIGludCAqYWRkcmxlbiApCit7CisgICAgCisgICAgcmV0dXJuIGtleS0+Y2JPYmotPlN0YXJ0QWNjZXB0KG9wX2tleSwgbmV3X3NvY2ssIGxvY2FsLCByZW1vdGUsIGFkZHJsZW4pOworfQorCisKKy8qCisgKiBJbml0aWF0ZSBub24tYmxvY2tpbmcgc29ja2V0IGNvbm5lY3QuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9jb25uZWN0KCBwal9pb3F1ZXVlX2tleV90ICprZXksCisJCQkJCWNvbnN0IHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJCWludCBhZGRybGVuICkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCisgICAgUlNvY2tldCAmclNvY2sgPSBrZXktPmNiT2JqLT5nZXRfcGpfc29ja2V0KCktPlNvY2tldCgpOworICAgIFRJbmV0QWRkciBpbmV0QWRkcjsKKyAgICBUUmVxdWVzdFN0YXR1cyByZXFTdGF0dXM7CisKKyAgICAvLyBSZXR1cm4gZmFpbHVyZSBpZiBhY2Nlc3MgcG9pbnQgaXMgbWFya2VkIGFzIGRvd24gYnkgYXBwLgorICAgIFBKX1NZTUJJQU5fQ0hFQ0tfQ09OTkVDVElPTigpOworICAgIAorICAgIC8vIENvbnZlcnQgYWRkcmVzcworICAgIHN0YXR1cyA9IFBqU3ltYmlhbk9TOjpwajJBZGRyKCooY29uc3QgcGpfc29ja2FkZHIqKWFkZHIsIGFkZHJsZW4sIAorICAgIAkJCQkgIGluZXRBZGRyKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgCXJldHVybiBzdGF0dXM7CisgICAgCisgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBhc3luYyBjb25uZWN0IGZvciBub3cuCisgICAgUEpfVE9ETyhJT1FVRVVFX1NVUFBPUlRfQVNZTkNfQ09OTkVDVCk7CisKKyAgICByU29jay5Db25uZWN0KGluZXRBZGRyLCByZXFTdGF0dXMpOworICAgIFVzZXI6OldhaXRGb3JSZXF1ZXN0KHJlcVN0YXR1cyk7CisKKyAgICBpZiAocmVxU3RhdHVzID09IEtFcnJOb25lKQorCXJldHVybiBQSl9TVUNDRVNTOworCisgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyZXFTdGF0dXMuSW50KCkpOworfQorCisKKyNlbmRpZgkvKiBQSl9IQVNfVENQICovCisKKy8qCisgKiBQb2xsIHRoZSBJL08gUXVldWUgZm9yIGNvbXBsZXRlZCBldmVudHMuCisgKi8KK1BKX0RFRihpbnQpIHBqX2lvcXVldWVfcG9sbCggcGpfaW9xdWV1ZV90ICppb3EsCisJCQkgICAgIGNvbnN0IHBqX3RpbWVfdmFsICp0aW1lb3V0KQoreworICAgIC8qIFBvbGxpbmcgaXMgbm90IG5lY2Vzc2FyeSBvbiBTeW1iaWFuLCBzaW5jZSBhbGwgYXN5bmMgYWN0aXZpdGllcworICAgICAqIGFyZSByZWdpc3RlcmVkIHRvIGFjdGl2ZSBzY2hlZHVsZXIuCisgICAgICovCisgICAgUEpfVU5VU0VEX0FSRyhpb3EpOworICAgIFBKX1VOVVNFRF9BUkcodGltZW91dCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEluc3RydWN0IHRoZSBJL08gUXVldWUgdG8gcmVhZCBmcm9tIHRoZSBzcGVjaWZpZWQgaGFuZGxlLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfcmVjdiggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCQkgICAgIHZvaWQgKmJ1ZmZlciwKKwkJCQkgICAgIHBqX3NzaXplX3QgKmxlbmd0aCwKKwkJCQkgICAgIHBqX3VpbnQzMl90IGZsYWdzICkKK3sKKyAgICAvLyBJZiBzb2NrZXQgaGFzIHJlYWRlciwgZGVsZXRlIGl0LgorICAgIGlmIChrZXktPmNiT2JqLT5nZXRfcGpfc29ja2V0KCktPlJlYWRlcigpKQorICAgIAlrZXktPmNiT2JqLT5nZXRfcGpfc29ja2V0KCktPkRlc3Ryb3lSZWFkZXIoKTsKKyAgICAKKyAgICAvLyBDbGVhciBmbGFnCisgICAgZmxhZ3MgJj0gflBKX0lPUVVFVUVfQUxXQVlTX0FTWU5DOworICAgIHJldHVybiBrZXktPmNiT2JqLT5TdGFydFJlYWQob3Bfa2V5LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MsIE5VTEwsIE5VTEwpOworfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgc2ltaWxhcmx5IGFzICNwal9pb3F1ZXVlX3JlY3YoKSwgZXhjZXB0IHRoYXQgaXQgaXMKKyAqIG5vcm1hbGx5IGNhbGxlZCBmb3Igc29ja2V0LCBhbmQgdGhlIHJlbW90ZSBhZGRyZXNzIHdpbGwgYWxzbyBiZSByZXR1cm5lZAorICogYWxvbmcgd2l0aCB0aGUgZGF0YS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3JlY3Zmcm9tKCBwal9pb3F1ZXVlX2tleV90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCQkJIHZvaWQgKmJ1ZmZlciwKKwkJCQkJIHBqX3NzaXplX3QgKmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdWludDMyX3QgZmxhZ3MsCisJCQkJCSBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCQkgaW50ICphZGRybGVuKQoreworICAgIENQalNvY2tldCAqc29jayA9IGtleS0+Y2JPYmotPmdldF9wal9zb2NrZXQoKTsKKyAgICAKKyAgICAvLyBJZiBhZGRyZXNzIGlzIHNwZWNpZmllZCwgY2hlY2sgdGhhdCB0aGUgbGVuZ3RoIG1hdGNoIHRoZQorICAgIC8vIGFkZHJlc3MgZmFtaWx5CisgICAgaWYgKGFkZHIgfHwgYWRkcmxlbikgeworICAgIAlQSl9BU1NFUlRfUkVUVVJOKGFkZHIgJiYgYWRkcmxlbiAmJiAqYWRkcmxlbiwgUEpfRUlOVkFMKTsKKyAgICAJaWYgKHNvY2stPkdldEFmKCkgPT0gUEpfQUZfSU5FVCkgeworICAgIAkgICAgUEpfQVNTRVJUX1JFVFVSTigqYWRkcmxlbj49KGludClzaXplb2YocGpfc29ja2FkZHJfaW4pLCBQSl9FSU5WQUwpOworICAgIAl9IGVsc2UgaWYgKHNvY2stPkdldEFmKCkgPT0gUEpfQUZfSU5FVDYpIHsKKyAgICAJICAgIFBKX0FTU0VSVF9SRVRVUk4oKmFkZHJsZW4+PShpbnQpc2l6ZW9mKHBqX3NvY2thZGRyX2luNiksIFBKX0VJTlZBTCk7CisgICAgCX0KKyAgICB9CisgICAgCisgICAgLy8gSWYgc29ja2V0IGhhcyByZWFkZXIsIGRlbGV0ZSBpdC4KKyAgICBpZiAoc29jay0+UmVhZGVyKCkpCisgICAgCXNvY2stPkRlc3Ryb3lSZWFkZXIoKTsKKyAgICAKKyAgICBpZiAoa2V5LT5jYk9iai0+SXNBY3RpdmUoKSkKKwlyZXR1cm4gUEpfRUJVU1k7CisKKyAgICAvLyBDbGVhciBmbGFnCisgICAgZmxhZ3MgJj0gflBKX0lPUVVFVUVfQUxXQVlTX0FTWU5DOworICAgIHJldHVybiBrZXktPmNiT2JqLT5TdGFydFJlYWQob3Bfa2V5LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MsIGFkZHIsIGFkZHJsZW4pOworfQorCisKKy8qCisgKiBJbnN0cnVjdCB0aGUgSS9PIFF1ZXVlIHRvIHdyaXRlIHRvIHRoZSBoYW5kbGUuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9zZW5kKCBwal9pb3F1ZXVlX2tleV90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorCQkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgIHBqX3NzaXplX3QgKmxlbmd0aCwKKwkJCQkgICAgIHBqX3VpbnQzMl90IGZsYWdzICkKK3sKKyAgICBUUmVxdWVzdFN0YXR1cyByZXFTdGF0dXM7CisgICAgVFB0ckM4IGFCdWZmZXIoKGNvbnN0IFRVaW50OCopZGF0YSwgKFRJbnQpKmxlbmd0aCk7CisgICAgVFNvY2tYZnJMZW5ndGggYUxlbjsKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKG9wX2tleSk7CisKKyAgICAvLyBGb3JjaW5nIHBlbmRpbmcgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgUEpfQVNTRVJUX1JFVFVSTigoZmxhZ3MgJiBQSl9JT1FVRVVFX0FMV0FZU19BU1lOQyk9PTAsIFBKX0VJTlZBTCk7CisKKyAgICAvLyBSZXR1cm4gZmFpbHVyZSBpZiBhY2Nlc3MgcG9pbnQgaXMgbWFya2VkIGFzIGRvd24gYnkgYXBwLgorICAgIFBKX1NZTUJJQU5fQ0hFQ0tfQ09OTkVDVElPTigpOworCisgICAgLy8gQ2xlYXIgZmxhZworICAgIGZsYWdzICY9IH5QSl9JT1FVRVVFX0FMV0FZU19BU1lOQzsKKworICAgIGtleS0+Y2JPYmotPmdldF9wal9zb2NrZXQoKS0+U29ja2V0KCkuU2VuZChhQnVmZmVyLCBmbGFncywgcmVxU3RhdHVzLCBhTGVuKTsKKyAgICBVc2VyOjpXYWl0Rm9yUmVxdWVzdChyZXFTdGF0dXMpOworCisgICAgaWYgKHJlcVN0YXR1cy5JbnQoKSAhPSBLRXJyTm9uZSkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHJlcVN0YXR1cy5JbnQoKSk7CisKKyAgICAvL0F0IGxlYXN0IGluIFVJUSBFbXVsYXRvciwgYUxlbi5MZW5ndGgoKSByZXBvcnRzIGluY29ycmVjdCBsZW5ndGgKKyAgICAvL2ZvciBVRFAgKHNvbWUgbmV3bGMuY29tIHVzZXJzIHNlZW0gdG8gaGF2ZSByZXBvcnRlZCB0aGlzIHRvbykuCisgICAgLy8qbGVuZ3RoID0gYUxlbi5MZW5ndGgoKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKgorICogSW5zdHJ1Y3QgdGhlIEkvTyBRdWV1ZSB0byB3cml0ZSB0byB0aGUgaGFuZGxlLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfc2VuZHRvKCBwal9pb3F1ZXVlX2tleV90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICAgIHBqX3NzaXplX3QgKmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3VpbnQzMl90IGZsYWdzLAorCQkJCSAgICAgICBjb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCSAgICAgICBpbnQgYWRkcmxlbikKK3sKKyAgICBUUmVxdWVzdFN0YXR1cyByZXFTdGF0dXM7CisgICAgVFB0ckM4IGFCdWZmZXI7CisgICAgVEluZXRBZGRyIGluZXRBZGRyOworICAgIFRTb2NrWGZyTGVuZ3RoIGFMZW47CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIFBKX1VOVVNFRF9BUkcob3Bfa2V5KTsKKworICAgIC8vIEZvcmNpbmcgcGVuZGluZyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAgICBQSl9BU1NFUlRfUkVUVVJOKChmbGFncyAmIFBKX0lPUVVFVUVfQUxXQVlTX0FTWU5DKT09MCwgUEpfRUlOVkFMKTsKKworICAgIC8vIFJldHVybiBmYWlsdXJlIGlmIGFjY2VzcyBwb2ludCBpcyBtYXJrZWQgYXMgZG93biBieSBhcHAuCisgICAgUEpfU1lNQklBTl9DSEVDS19DT05ORUNUSU9OKCk7CisKKyAgICAvLyBDb252ZXJ0IGFkZHJlc3MKKyAgICBzdGF0dXMgPSBQalN5bWJpYW5PUzo6cGoyQWRkcigqKGNvbnN0IHBqX3NvY2thZGRyKilhZGRyLCBhZGRybGVuLCAKKyAgICAJCQkJICBpbmV0QWRkcik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgIAlyZXR1cm4gc3RhdHVzOworICAgIAorICAgIC8vIENsZWFyIGZsYWcKKyAgICBmbGFncyAmPSB+UEpfSU9RVUVVRV9BTFdBWVNfQVNZTkM7CisKKyAgICBhQnVmZmVyLlNldCgoY29uc3QgVFVpbnQ4KilkYXRhLCAoVEludCkqbGVuZ3RoKTsKKyAgICBDUGpTb2NrZXQgKnBqU29jayA9IGtleS0+Y2JPYmotPmdldF9wal9zb2NrZXQoKTsKKworICAgIHBqU29jay0+U29ja2V0KCkuU2VuZFRvKGFCdWZmZXIsIGluZXRBZGRyLCBmbGFncywgcmVxU3RhdHVzLCBhTGVuKTsKKyAgICBVc2VyOjpXYWl0Rm9yUmVxdWVzdChyZXFTdGF0dXMpOworCisgICAgaWYgKHJlcVN0YXR1cy5JbnQoKSAhPSBLRXJyTm9uZSkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHJlcVN0YXR1cy5JbnQoKSk7CisKKyAgICAvL0F0IGxlYXN0IGluIFVJUSBFbXVsYXRvciwgYUxlbi5MZW5ndGgoKSByZXBvcnRzIGluY29ycmVjdCBsZW5ndGgKKyAgICAvL2ZvciBVRFAgKHNvbWUgbmV3bGMuY29tIHVzZXJzIHNlZW0gdG8gaGF2ZSByZXBvcnRlZCB0aGlzIHRvbykuCisgICAgLy8qbGVuZ3RoID0gYUxlbi5MZW5ndGgoKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3NldF9jb25jdXJyZW5jeShwal9pb3F1ZXVlX2tleV90ICprZXksCisJCQkJCQkJCQkJCSAgIHBqX2Jvb2xfdCBhbGxvdykKK3sKKwkvKiBOb3Qgc3VwcG9ydGVkLCBqdXN0IHJldHVybiBQSl9TVUNDRVNTIHNpbGVudGx5ICovCisJUEpfVU5VU0VEX0FSRyhrZXkpOworCVBKX1VOVVNFRF9BUkcoYWxsb3cpOworCXJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfbG9ja19rZXkocGpfaW9xdWV1ZV9rZXlfdCAqa2V5KQoreworCS8qIE5vdCBzdXBwb3J0ZWQsIGp1c3QgcmV0dXJuIFBKX1NVQ0NFU1Mgc2lsZW50bHkgKi8KKwlQSl9VTlVTRURfQVJHKGtleSk7CisJcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV91bmxvY2tfa2V5KHBqX2lvcXVldWVfa2V5X3QgKmtleSkKK3sKKwkvKiBOb3Qgc3VwcG9ydGVkLCBqdXN0IHJldHVybiBQSl9TVUNDRVNTIHNpbGVudGx5ICovCisJUEpfVU5VU0VEX0FSRyhrZXkpOworCXJldHVybiBQSl9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pb3F1ZXVlX3dpbm50LmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2lvcXVldWVfd2lubnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU4YWI4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pb3F1ZXVlX3dpbm50LmMKQEAgLTAsMCArMSwxNDQzIEBACisvKiAkSWQ6IGlvcXVldWVfd2lubnQuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2lvcXVldWUuaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL2xvY2suaD4KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovc29jay5oPgorI2luY2x1ZGUgPHBqL2FycmF5Lmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc29ja2V0Lmg+CisKKworI2lmIGRlZmluZWQoUEpfSEFTX1dJTlNPQ0syX0gpICYmIFBKX0hBU19XSU5TT0NLMl9IICE9IDAKKyMgIGluY2x1ZGUgPHdpbnNvY2syLmg+CisjZWxpZiBkZWZpbmVkKFBKX0hBU19XSU5TT0NLX0gpICYmIFBKX0hBU19XSU5TT0NLX0ggIT0gMAorIyAgaW5jbHVkZSA8d2luc29jay5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBKX0hBU19NU1dTT0NLX0gpICYmIFBKX0hBU19NU1dTT0NLX0ggIT0gMAorIyAgaW5jbHVkZSA8bXN3c29jay5oPgorI2VuZGlmCisKKworLyogVGhlIGFkZHJlc3Mgc3BlY2lmaWVkIGluIEFjY2VwdEV4KCkgbXVzdCBiZSAxNiBtb3JlIHRoYW4gdGhlIHNpemUgb2YKKyAqIFNPQ0tBRERSIChzb3VyY2U6IE1TRE4pLgorICovCisjZGVmaW5lIEFDQ0VQVF9BRERSX0xFTgkgICAgKHNpemVvZihwal9zb2NrYWRkcl9pbikrMTYpCisKK3R5cGVkZWYgc3RydWN0IGdlbmVyaWNfb3ZlcmxhcHBlZAoreworICAgIFdTQU9WRVJMQVBQRUQJICAgb3ZlcmxhcHBlZDsKKyAgICBwal9pb3F1ZXVlX29wZXJhdGlvbl9lIG9wZXJhdGlvbjsKK30gZ2VuZXJpY19vdmVybGFwcGVkOworCisvKgorICogT1ZFUkxBUFBQRUQgc3RydWN0dXJlIGZvciBzZW5kIGFuZCByZWNlaXZlLgorICovCit0eXBlZGVmIHN0cnVjdCBpb3F1ZXVlX292ZXJsYXBwZWQKK3sKKyAgICBXU0FPVkVSTEFQUEVECSAgIG92ZXJsYXBwZWQ7CisgICAgcGpfaW9xdWV1ZV9vcGVyYXRpb25fZSBvcGVyYXRpb247CisgICAgV1NBQlVGCQkgICB3c2FidWY7CisgICAgcGpfc29ja2FkZHJfaW4gICAgICAgICBkdW1teV9hZGRyOworICAgIGludCAgICAgICAgICAgICAgICAgICAgZHVtbXlfYWRkcmxlbjsKK30gaW9xdWV1ZV9vdmVybGFwcGVkOworCisjaWYgUEpfSEFTX1RDUAorLyoKKyAqIE9WRVJMQVAgc3RydWN0dXJlIGZvciBhY2NlcHQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGlvcXVldWVfYWNjZXB0X3JlYworeworICAgIFdTQU9WRVJMQVBQRUQJICAgIG92ZXJsYXBwZWQ7CisgICAgcGpfaW9xdWV1ZV9vcGVyYXRpb25fZSAgb3BlcmF0aW9uOworICAgIHBqX3NvY2tfdAkJICAgIG5ld3NvY2s7CisgICAgcGpfc29ja190CQkgICAqbmV3c29ja19wdHI7CisgICAgaW50CQkJICAgKmFkZHJsZW47CisgICAgdm9pZAkJICAgKnJlbW90ZTsKKyAgICB2b2lkCQkgICAqbG9jYWw7CisgICAgY2hhcgkJICAgIGFjY2VwdF9idWZbMiAqIEFDQ0VQVF9BRERSX0xFTl07Cit9IGlvcXVldWVfYWNjZXB0X3JlYzsKKyNlbmRpZgorCisvKgorICogU3RydWN0dXJlIHRvIGhvbGQgcGVuZGluZyBvcGVyYXRpb24ga2V5LgorICovCit1bmlvbiBvcGVyYXRpb25fa2V5Cit7CisgICAgZ2VuZXJpY19vdmVybGFwcGVkICAgICAgZ2VuZXJpYzsKKyAgICBpb3F1ZXVlX292ZXJsYXBwZWQgICAgICBvdmVybGFwcGVkOworI2lmIFBKX0hBU19UQ1AKKyAgICBpb3F1ZXVlX2FjY2VwdF9yZWMgICAgICBhY2NlcHQ7CisjZW5kaWYKK307CisKKy8qIFR5cGUgb2YgaGFuZGxlIGluIHRoZSBrZXkuICovCitlbnVtIGhhbmRsZV90eXBlCit7CisgICAgSE5EX0lTX1VOS05PV04sCisgICAgSE5EX0lTX0ZJTEUsCisgICAgSE5EX0lTX1NPQ0tFVCwKK307CisKK2VudW0geyBQT1NUX1FVSVRfTEVOID0gMHhGRkZGREVBRFVMIH07CisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIGluZGl2aWR1YWwgc29ja2V0LgorICovCitzdHJ1Y3QgcGpfaW9xdWV1ZV9rZXlfdAoreworICAgIFBKX0RFQ0xfTElTVF9NRU1CRVIoc3RydWN0IHBqX2lvcXVldWVfa2V5X3QpOworCisgICAgcGpfaW9xdWV1ZV90ICAgICAgICppb3F1ZXVlOworICAgIEhBTkRMRQkJaG5kOworICAgIHZvaWQJICAgICAgICp1c2VyX2RhdGE7CisgICAgZW51bSBoYW5kbGVfdHlwZSAgICBobmRfdHlwZTsKKyAgICBwal9pb3F1ZXVlX2NhbGxiYWNrCWNiOworICAgIHBqX2Jvb2xfdAkJYWxsb3dfY29uY3VycmVudDsKKworI2lmIFBKX0hBU19UQ1AKKyAgICBpbnQJCQljb25uZWN0aW5nOworI2VuZGlmCisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgcGpfYXRvbWljX3QJICAgICAgICpyZWZfY291bnQ7CisgICAgcGpfYm9vbF90CQljbG9zaW5nOworICAgIHBqX3RpbWVfdmFsCQlmcmVlX3RpbWU7CisgICAgcGpfbXV0ZXhfdAkgICAgICAgKm11dGV4OworI2VuZGlmCisKK307CisKKy8qCisgKiBJTyBRdWV1ZSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBwal9pb3F1ZXVlX3QKK3sKKyAgICBIQU5ETEUJICAgICAgaW9jcDsKKyAgICBwal9sb2NrX3QgICAgICAgICpsb2NrOworICAgIHBqX2Jvb2xfdCAgICAgICAgIGF1dG9fZGVsZXRlX2xvY2s7CisgICAgcGpfYm9vbF90CSAgICAgIGRlZmF1bHRfY29uY3VycmVuY3k7CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgcGpfaW9xdWV1ZV9rZXlfdCAgYWN0aXZlX2xpc3Q7CisgICAgcGpfaW9xdWV1ZV9rZXlfdCAgZnJlZV9saXN0OworICAgIHBqX2lvcXVldWVfa2V5X3QgIGNsb3NpbmdfbGlzdDsKKyNlbmRpZgorCisgICAgLyogVGhlc2UgYXJlIHRvIGtlZXAgdHJhY2sgb2YgY29ubmVjdGluZyBzb2NrZXRzICovCisjaWYgUEpfSEFTX1RDUAorICAgIHVuc2lnbmVkCSAgICAgIGV2ZW50X2NvdW50OworICAgIEhBTkRMRQkgICAgICBldmVudF9wb29sW01BWElNVU1fV0FJVF9PQkpFQ1RTKzFdOworICAgIHVuc2lnbmVkCSAgICAgIGNvbm5lY3RpbmdfY291bnQ7CisgICAgSEFORExFCSAgICAgIGNvbm5lY3RpbmdfaGFuZGxlc1tNQVhJTVVNX1dBSVRfT0JKRUNUUysxXTsKKyAgICBwal9pb3F1ZXVlX2tleV90ICpjb25uZWN0aW5nX2tleXNbTUFYSU1VTV9XQUlUX09CSkVDVFMrMV07CisjZW5kaWYKK307CisKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKy8qIFByb3RvdHlwZSAqLworc3RhdGljIHZvaWQgc2Nhbl9jbG9zaW5nX2tleXMocGpfaW9xdWV1ZV90ICppb3F1ZXVlKTsKKyNlbmRpZgorCisKKyNpZiBQSl9IQVNfVENQCisvKgorICogUHJvY2VzcyB0aGUgc29ja2V0IHdoZW4gdGhlIG92ZXJsYXBwZWQgYWNjZXB0KCkgY29tcGxldGVkLgorICovCitzdGF0aWMgdm9pZCBpb3F1ZXVlX29uX2FjY2VwdF9jb21wbGV0ZShwal9pb3F1ZXVlX2tleV90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3F1ZXVlX2FjY2VwdF9yZWMgKmFjY2VwdF9vdmVybGFwcGVkKQoreworICAgIHN0cnVjdCBzb2NrYWRkciAqbG9jYWw7CisgICAgc3RydWN0IHNvY2thZGRyICpyZW1vdGU7CisgICAgaW50IGxvY2FsbGVuLCByZW1vdGVsZW47CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIC8qIE9uIFdpblhQIG9yIGxhdGVyLCB1c2UgU09fVVBEQVRFX0FDQ0VQVF9DT05URVhUIHNvIHRoYXQgc29ja2V0IAorICAgICAqIGFkZHJlc3NlcyBjYW4gYmUgb2J0YWluZWQgd2l0aCBnZXRzb2NrbmFtZSgpIGFuZCBnZXRwZWVybmFtZSgpLgorICAgICAqLworICAgIHN0YXR1cyA9IHNldHNvY2tvcHQoYWNjZXB0X292ZXJsYXBwZWQtPm5ld3NvY2ssIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBTT19VUERBVEVfQUNDRVBUX0NPTlRFWFQsIAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSZrZXktPmhuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU09DS0VUKSk7CisgICAgLyogU09fVVBEQVRFX0FDQ0VQVF9DT05URVhUIGlzIGZvciBXaW5YUCBvciBsYXRlci4KKyAgICAgKiBTbyBpZ25vcmUgdGhlIGVycm9yIHN0YXR1cy4KKyAgICAgKi8KKworICAgIC8qIE9wZXJhdGlvbiBjb21wbGV0ZSBpbW1lZGlhdGVseS4gKi8KKyAgICBpZiAoYWNjZXB0X292ZXJsYXBwZWQtPmFkZHJsZW4pIHsKKwlHZXRBY2NlcHRFeFNvY2thZGRycyggYWNjZXB0X292ZXJsYXBwZWQtPmFjY2VwdF9idWYsCisJCQkgICAgICAwLCAKKwkJCSAgICAgIEFDQ0VQVF9BRERSX0xFTiwKKwkJCSAgICAgIEFDQ0VQVF9BRERSX0xFTiwKKwkJCSAgICAgICZsb2NhbCwKKwkJCSAgICAgICZsb2NhbGxlbiwKKwkJCSAgICAgICZyZW1vdGUsCisJCQkgICAgICAmcmVtb3RlbGVuKTsKKwlpZiAoKmFjY2VwdF9vdmVybGFwcGVkLT5hZGRybGVuID49IGxvY2FsbGVuKSB7CisJICAgIGlmIChhY2NlcHRfb3ZlcmxhcHBlZC0+bG9jYWwpCisJCXBqX21lbWNweShhY2NlcHRfb3ZlcmxhcHBlZC0+bG9jYWwsIGxvY2FsLCBsb2NhbGxlbik7CisJICAgIGlmIChhY2NlcHRfb3ZlcmxhcHBlZC0+cmVtb3RlKQorCQlwal9tZW1jcHkoYWNjZXB0X292ZXJsYXBwZWQtPnJlbW90ZSwgcmVtb3RlLCBsb2NhbGxlbik7CisJfSBlbHNlIHsKKwkgICAgaWYgKGFjY2VwdF9vdmVybGFwcGVkLT5sb2NhbCkKKwkJcGpfYnplcm8oYWNjZXB0X292ZXJsYXBwZWQtPmxvY2FsLCAKKwkJCSAqYWNjZXB0X292ZXJsYXBwZWQtPmFkZHJsZW4pOworCSAgICBpZiAoYWNjZXB0X292ZXJsYXBwZWQtPnJlbW90ZSkKKwkJcGpfYnplcm8oYWNjZXB0X292ZXJsYXBwZWQtPnJlbW90ZSwgCisJCQkgKmFjY2VwdF9vdmVybGFwcGVkLT5hZGRybGVuKTsKKwl9CisKKwkqYWNjZXB0X292ZXJsYXBwZWQtPmFkZHJsZW4gPSBsb2NhbGxlbjsKKyAgICB9CisgICAgaWYgKGFjY2VwdF9vdmVybGFwcGVkLT5uZXdzb2NrX3B0cikKKyAgICAgICAgKmFjY2VwdF9vdmVybGFwcGVkLT5uZXdzb2NrX3B0ciA9IGFjY2VwdF9vdmVybGFwcGVkLT5uZXdzb2NrOworICAgIGFjY2VwdF9vdmVybGFwcGVkLT5vcGVyYXRpb24gPSAwOworfQorCitzdGF0aWMgdm9pZCBlcmFzZV9jb25uZWN0aW5nX3NvY2tldCggcGpfaW9xdWV1ZV90ICppb3F1ZXVlLCB1bnNpZ25lZCBwb3MpCit7CisgICAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5ID0gaW9xdWV1ZS0+Y29ubmVjdGluZ19rZXlzW3Bvc107CisgICAgSEFORExFIGhFdmVudCA9IGlvcXVldWUtPmNvbm5lY3RpbmdfaGFuZGxlc1twb3NdOworCisgICAgLyogUmVtb3ZlIGtleSBmcm9tIGFycmF5IG9mIGNvbm5lY3RpbmcgaGFuZGxlcy4gKi8KKyAgICBwal9hcnJheV9lcmFzZShpb3F1ZXVlLT5jb25uZWN0aW5nX2tleXMsIHNpemVvZihrZXkpLAorCQkgICBpb3F1ZXVlLT5jb25uZWN0aW5nX2NvdW50LCBwb3MpOworICAgIHBqX2FycmF5X2VyYXNlKGlvcXVldWUtPmNvbm5lY3RpbmdfaGFuZGxlcywgc2l6ZW9mKEhBTkRMRSksCisJCSAgIGlvcXVldWUtPmNvbm5lY3RpbmdfY291bnQsIHBvcyk7CisgICAgLS1pb3F1ZXVlLT5jb25uZWN0aW5nX2NvdW50OworCisgICAgLyogRGlzYXNzb2NpYXRlIHRoZSBzb2NrZXQgZnJvbSB0aGUgZXZlbnQuICovCisgICAgV1NBRXZlbnRTZWxlY3QoKHBqX3NvY2tfdClrZXktPmhuZCwgaEV2ZW50LCAwKTsKKworICAgIC8qIFB1dCBldmVudCBvYmplY3QgdG8gcG9vbC4gKi8KKyAgICBpZiAoaW9xdWV1ZS0+ZXZlbnRfY291bnQgPCBNQVhJTVVNX1dBSVRfT0JKRUNUUykgeworCWlvcXVldWUtPmV2ZW50X3Bvb2xbaW9xdWV1ZS0+ZXZlbnRfY291bnQrK10gPSBoRXZlbnQ7CisgICAgfSBlbHNlIHsKKwkvKiBTaG91bGRuJ3QgaGFwcGVuLiBUaGVyZSBzaG91bGQgYmUgbm8gbW9yZSBwZW5kaW5nIGNvbm5lY3Rpb25zCisJICogdGhhbiBtYXguIAorCSAqLworCXBqX2Fzc2VydCgwKTsKKwlDbG9zZUhhbmRsZShoRXZlbnQpOworICAgIH0KKworfQorCisvKgorICogUG9sbCBmb3IgdGhlIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIGNvbm5lY3QoKS4KKyAqIElmIHRoZXJlJ3MgYSBjb21wbGV0aW9uLCB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSBrZXkgb2YgdGhlIGNvbXBsZXRlZAorICogc29ja2V0LCBhbmQgJ3Jlc3VsdCcgYXJndW1lbnQgY29udGFpbnMgdGhlIGNvbm5lY3QoKSByZXN1bHQuIElmIGNvbm5lY3QoKQorICogc3VjY2VlZGVkLCAncmVzdWx0JyB3aWxsIGhhdmUgdmFsdWUgemVybywgb3RoZXJ3aXNlIHdpbGwgaGF2ZSB0aGUgZXJyb3IKKyAqIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfY29ubmVjdGluZyggcGpfaW9xdWV1ZV90ICppb3F1ZXVlICkKK3sKKyAgICBpZiAoaW9xdWV1ZS0+Y29ubmVjdGluZ19jb3VudCkgeworCWludCBpLCBjb3VudDsKKwlzdHJ1Y3QgCisJeworCSAgICBwal9pb3F1ZXVlX2tleV90ICprZXk7CisJICAgIHBqX3N0YXR1c190CSAgICAgIHN0YXR1czsKKwl9IGV2ZW50c1tQSl9JT1FVRVVFX01BWF9FVkVOVFNfSU5fU0lOR0xFX1BPTEwtMV07CisKKwlwal9sb2NrX2FjcXVpcmUoaW9xdWV1ZS0+bG9jayk7CisJZm9yIChjb3VudD0wOyBjb3VudDxQSl9JT1FVRVVFX01BWF9FVkVOVFNfSU5fU0lOR0xFX1BPTEwtMTsgKytjb3VudCkgeworCSAgICBEV09SRCByZXN1bHQ7CisKKwkgICAgcmVzdWx0ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyhpb3F1ZXVlLT5jb25uZWN0aW5nX2NvdW50LAorCQkJCQkgICAgaW9xdWV1ZS0+Y29ubmVjdGluZ19oYW5kbGVzLAorCQkJCQkgICAgRkFMU0UsIDApOworCSAgICBpZiAocmVzdWx0ID49IFdBSVRfT0JKRUNUXzAgJiYgCisJCXJlc3VsdCA8IFdBSVRfT0JKRUNUXzAraW9xdWV1ZS0+Y29ubmVjdGluZ19jb3VudCkgCisJICAgIHsKKwkJV1NBTkVUV09SS0VWRU5UUyBuZXRfZXZlbnRzOworCisJCS8qIEdvdCBjb21wbGV0ZWQgY29ubmVjdCgpLiAqLworCQl1bnNpZ25lZCBwb3MgPSByZXN1bHQgLSBXQUlUX09CSkVDVF8wOworCQlldmVudHNbY291bnRdLmtleSA9IGlvcXVldWUtPmNvbm5lY3Rpbmdfa2V5c1twb3NdOworCisJCS8qIFNlZSB3aGV0aGVyIGNvbm5lY3QgaGFzIHN1Y2NlZWRlZC4gKi8KKwkJV1NBRW51bU5ldHdvcmtFdmVudHMoKHBqX3NvY2tfdClldmVudHNbY291bnRdLmtleS0+aG5kLCAKKwkJCQkgICAgIGlvcXVldWUtPmNvbm5lY3RpbmdfaGFuZGxlc1twb3NdLCAKKwkJCQkgICAgICZuZXRfZXZlbnRzKTsKKwkJZXZlbnRzW2NvdW50XS5zdGF0dXMgPSAKKwkJICAgIFBKX1NUQVRVU19GUk9NX09TKG5ldF9ldmVudHMuaUVycm9yQ29kZVtGRF9DT05ORUNUX0JJVF0pOworCisJCS8qIEVyYXNlIHNvY2tldCBmcm9tIHBlbmRpbmcgY29ubmVjdC4gKi8KKwkJZXJhc2VfY29ubmVjdGluZ19zb2NrZXQoaW9xdWV1ZSwgcG9zKTsKKwkgICAgfSBlbHNlIHsKKwkJLyogTm8gbW9yZSBldmVudHMgKi8KKwkJYnJlYWs7CisJICAgIH0KKwl9CisJcGpfbG9ja19yZWxlYXNlKGlvcXVldWUtPmxvY2spOworCisJLyogQ2FsbCBjYWxsYmFja3MuICovCisJZm9yIChpPTA7IGk8Y291bnQ7ICsraSkgeworCSAgICBpZiAoZXZlbnRzW2ldLmtleS0+Y2Iub25fY29ubmVjdF9jb21wbGV0ZSkgeworCQlldmVudHNbaV0ua2V5LT5jYi5vbl9jb25uZWN0X2NvbXBsZXRlKGV2ZW50c1tpXS5rZXksIAorCQkJCQkJICAgICAgZXZlbnRzW2ldLnN0YXR1cyk7CisJICAgIH0KKwl9CisKKwlyZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisgICAgCit9CisjZW5kaWYKKworLyoKKyAqIHBqX2lvcXVldWVfbmFtZSgpCisgKi8KK1BKX0RFRihjb25zdCBjaGFyKikgcGpfaW9xdWV1ZV9uYW1lKHZvaWQpCit7CisgICAgcmV0dXJuICJpb2NwIjsKK30KKworLyoKKyAqIHBqX2lvcXVldWVfY3JlYXRlKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLCAKKwkJCQkgICAgICAgcGpfc2l6ZV90IG1heF9mZCwKKwkJCQkgICAgICAgcGpfaW9xdWV1ZV90ICoqcF9pb3F1ZXVlKQoreworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZTsKKyAgICB1bnNpZ25lZCBpOworICAgIHBqX3N0YXR1c190IHJjOworCisgICAgUEpfVU5VU0VEX0FSRyhtYXhfZmQpOworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBwX2lvcXVldWUsIFBKX0VJTlZBTCk7CisKKyAgICByYyA9IHNpemVvZih1bmlvbiBvcGVyYXRpb25fa2V5KTsKKworICAgIC8qIENoZWNrIHRoYXQgc2l6ZW9mKHBqX2lvcXVldWVfb3Bfa2V5X3QpIG1ha2VzIHNlbnNlLiAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2l6ZW9mKHBqX2lvcXVldWVfb3Bfa2V5X3QpLXNpemVvZih2b2lkKikgPj0gCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5pb24gb3BlcmF0aW9uX2tleSksIFBKX0VCVUcpOworCisgICAgLyogQ3JlYXRlIElPQ1AgKi8KKyAgICBpb3F1ZXVlID0gcGpfcG9vbF96YWxsb2MocG9vbCwgc2l6ZW9mKCppb3F1ZXVlKSk7CisgICAgaW9xdWV1ZS0+aW9jcCA9IENyZWF0ZUlvQ29tcGxldGlvblBvcnQoSU5WQUxJRF9IQU5ETEVfVkFMVUUsIE5VTEwsIDAsIDApOworICAgIGlmIChpb3F1ZXVlLT5pb2NwID09IE5VTEwpCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihHZXRMYXN0RXJyb3IoKSk7CisKKyAgICAvKiBDcmVhdGUgSU9DUCBtdXRleCAqLworICAgIHJjID0gcGpfbG9ja19jcmVhdGVfcmVjdXJzaXZlX211dGV4KHBvb2wsIE5VTEwsICZpb3F1ZXVlLT5sb2NrKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCUNsb3NlSGFuZGxlKGlvcXVldWUtPmlvY3ApOworCXJldHVybiByYzsKKyAgICB9CisKKyAgICBpb3F1ZXVlLT5hdXRvX2RlbGV0ZV9sb2NrID0gUEpfVFJVRTsKKyAgICBpb3F1ZXVlLT5kZWZhdWx0X2NvbmN1cnJlbmN5ID0gUEpfSU9RVUVVRV9ERUZBVUxUX0FMTE9XX0NPTkNVUlJFTkNZOworCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworICAgIC8qCisgICAgICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGtleSBwb29scy4KKyAgICAgKi8KKyAgICBwal9saXN0X2luaXQoJmlvcXVldWUtPmFjdGl2ZV9saXN0KTsKKyAgICBwal9saXN0X2luaXQoJmlvcXVldWUtPmZyZWVfbGlzdCk7CisgICAgcGpfbGlzdF9pbml0KCZpb3F1ZXVlLT5jbG9zaW5nX2xpc3QpOworCisgICAgLyogUHJlYWxsb2NhdGUga2V5cyBhY2NvcmRpbmcgdG8gbWF4X2ZkIHNldHRpbmcsIGFuZCBwdXQgdGhlbQorICAgICAqIGluIGZyZWVfbGlzdC4KKyAgICAgKi8KKyAgICBmb3IgKGk9MDsgaTxtYXhfZmQ7ICsraSkgeworCXBqX2lvcXVldWVfa2V5X3QgKmtleTsKKworCWtleSA9IHBqX3Bvb2xfYWxsb2MocG9vbCwgc2l6ZW9mKHBqX2lvcXVldWVfa2V5X3QpKTsKKworCXJjID0gcGpfYXRvbWljX2NyZWF0ZShwb29sLCAwLCAma2V5LT5yZWZfY291bnQpOworCWlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGtleSA9IGlvcXVldWUtPmZyZWVfbGlzdC5uZXh0OworCSAgICB3aGlsZSAoa2V5ICE9ICZpb3F1ZXVlLT5mcmVlX2xpc3QpIHsKKwkJcGpfYXRvbWljX2Rlc3Ryb3koa2V5LT5yZWZfY291bnQpOworCQlwal9tdXRleF9kZXN0cm95KGtleS0+bXV0ZXgpOworCQlrZXkgPSBrZXktPm5leHQ7CisJICAgIH0KKwkgICAgQ2xvc2VIYW5kbGUoaW9xdWV1ZS0+aW9jcCk7CisJICAgIHJldHVybiByYzsKKwl9CisKKwlyYyA9IHBqX211dGV4X2NyZWF0ZV9yZWN1cnNpdmUocG9vbCwgImlvcWtleSIsICZrZXktPm11dGV4KTsKKwlpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBwal9hdG9taWNfZGVzdHJveShrZXktPnJlZl9jb3VudCk7CisJICAgIGtleSA9IGlvcXVldWUtPmZyZWVfbGlzdC5uZXh0OworCSAgICB3aGlsZSAoa2V5ICE9ICZpb3F1ZXVlLT5mcmVlX2xpc3QpIHsKKwkJcGpfYXRvbWljX2Rlc3Ryb3koa2V5LT5yZWZfY291bnQpOworCQlwal9tdXRleF9kZXN0cm95KGtleS0+bXV0ZXgpOworCQlrZXkgPSBrZXktPm5leHQ7CisJICAgIH0KKwkgICAgQ2xvc2VIYW5kbGUoaW9xdWV1ZS0+aW9jcCk7CisJICAgIHJldHVybiByYzsKKwl9CisKKwlwal9saXN0X3B1c2hfYmFjaygmaW9xdWV1ZS0+ZnJlZV9saXN0LCBrZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgKnBfaW9xdWV1ZSA9IGlvcXVldWU7CisKKyAgICBQSl9MT0coNCwgKCJwamxpYiIsICJXaW5OVCBJT0NQIEkvTyBRdWV1ZSBjcmVhdGVkICglcCkiLCBpb3F1ZXVlKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal9pb3F1ZXVlX2Rlc3Ryb3koKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfZGVzdHJveSggcGpfaW9xdWV1ZV90ICppb3F1ZXVlICkKK3sKKyNpZiBQSl9IQVNfVENQCisgICAgdW5zaWduZWQgaTsKKyNlbmRpZgorICAgIHBqX2lvcXVldWVfa2V5X3QgKmtleTsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihpb3F1ZXVlLCBQSl9FSU5WQUwpOworCisgICAgcGpfbG9ja19hY3F1aXJlKGlvcXVldWUtPmxvY2spOworCisjaWYgUEpfSEFTX1RDUAorICAgIC8qIERlc3Ryb3kgZXZlbnRzIGluIHRoZSBwb29sICovCisgICAgZm9yIChpPTA7IGk8aW9xdWV1ZS0+ZXZlbnRfY291bnQ7ICsraSkgeworCUNsb3NlSGFuZGxlKGlvcXVldWUtPmV2ZW50X3Bvb2xbaV0pOworICAgIH0KKyAgICBpb3F1ZXVlLT5ldmVudF9jb3VudCA9IDA7CisjZW5kaWYKKworICAgIGlmIChDbG9zZUhhbmRsZShpb3F1ZXVlLT5pb2NwKSAhPSBUUlVFKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworICAgIC8qIERlc3Ryb3kgcmVmZXJlbmNlIGNvdW50ZXJzICovCisgICAga2V5ID0gaW9xdWV1ZS0+YWN0aXZlX2xpc3QubmV4dDsKKyAgICB3aGlsZSAoa2V5ICE9ICZpb3F1ZXVlLT5hY3RpdmVfbGlzdCkgeworCXBqX2F0b21pY19kZXN0cm95KGtleS0+cmVmX2NvdW50KTsKKwlwal9tdXRleF9kZXN0cm95KGtleS0+bXV0ZXgpOworCWtleSA9IGtleS0+bmV4dDsKKyAgICB9CisKKyAgICBrZXkgPSBpb3F1ZXVlLT5jbG9zaW5nX2xpc3QubmV4dDsKKyAgICB3aGlsZSAoa2V5ICE9ICZpb3F1ZXVlLT5jbG9zaW5nX2xpc3QpIHsKKwlwal9hdG9taWNfZGVzdHJveShrZXktPnJlZl9jb3VudCk7CisJcGpfbXV0ZXhfZGVzdHJveShrZXktPm11dGV4KTsKKwlrZXkgPSBrZXktPm5leHQ7CisgICAgfQorCisgICAga2V5ID0gaW9xdWV1ZS0+ZnJlZV9saXN0Lm5leHQ7CisgICAgd2hpbGUgKGtleSAhPSAmaW9xdWV1ZS0+ZnJlZV9saXN0KSB7CisJcGpfYXRvbWljX2Rlc3Ryb3koa2V5LT5yZWZfY291bnQpOworCXBqX211dGV4X2Rlc3Ryb3koa2V5LT5tdXRleCk7CisJa2V5ID0ga2V5LT5uZXh0OworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGlvcXVldWUtPmF1dG9fZGVsZXRlX2xvY2spCisgICAgICAgIHBqX2xvY2tfZGVzdHJveShpb3F1ZXVlLT5sb2NrKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9zZXRfZGVmYXVsdF9jb25jdXJyZW5jeShwal9pb3F1ZXVlX3QgKmlvcXVldWUsCisJCQkJCQkgICAgICAgcGpfYm9vbF90IGFsbG93KQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oaW9xdWV1ZSAhPSBOVUxMLCBQSl9FSU5WQUwpOworICAgIGlvcXVldWUtPmRlZmF1bHRfY29uY3VycmVuY3kgPSBhbGxvdzsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIHBqX2lvcXVldWVfc2V0X2xvY2soKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfc2V0X2xvY2soIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSwgCisJCQkJCSBwal9sb2NrX3QgKmxvY2ssCisJCQkJCSBwal9ib29sX3QgYXV0b19kZWxldGUgKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oaW9xdWV1ZSAmJiBsb2NrLCBQSl9FSU5WQUwpOworCisgICAgaWYgKGlvcXVldWUtPmF1dG9fZGVsZXRlX2xvY2spIHsKKyAgICAgICAgcGpfbG9ja19kZXN0cm95KGlvcXVldWUtPmxvY2spOworICAgIH0KKworICAgIGlvcXVldWUtPmxvY2sgPSBsb2NrOworICAgIGlvcXVldWUtPmF1dG9fZGVsZXRlX2xvY2sgPSBhdXRvX2RlbGV0ZTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2soIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJCQkgICAgICBwal9zb2NrX3Qgc29jaywKKwkJCQkJICAgICAgdm9pZCAqdXNlcl9kYXRhLAorCQkJCQkgICAgICBjb25zdCBwal9pb3F1ZXVlX2NhbGxiYWNrICpjYiwKKwkJCQkJICAgICAgcGpfaW9xdWV1ZV9rZXlfdCAqKmtleSApCit7CisgICAgSEFORExFIGhpb3E7CisgICAgcGpfaW9xdWV1ZV9rZXlfdCAqcmVjOworICAgIHVfbG9uZyB2YWx1ZTsKKyAgICBpbnQgcmM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBvb2wgJiYgaW9xdWV1ZSAmJiBjYiAmJiBrZXksIFBKX0VJTlZBTCk7CisKKyAgICBwal9sb2NrX2FjcXVpcmUoaW9xdWV1ZS0+bG9jayk7CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgLyogU2NhbiBjbG9zaW5nIGxpc3QgZmlyc3QgdG8gcmVsZWFzZSB1bnVzZWQga2V5cy4KKyAgICAgKiBNdXN0IGRvIHRoaXMgd2l0aCBsb2NrIGFjcXVpcmVkLgorICAgICAqLworICAgIHNjYW5fY2xvc2luZ19rZXlzKGlvcXVldWUpOworCisgICAgLyogSWYgc2FmZSB1bnJlZ2lzdHJhdGlvbiBpcyB1c2VkLCB0aGVuIGdldCB0aGUga2V5IHJlY29yZCBmcm9tCisgICAgICogdGhlIGZyZWUgbGlzdC4KKyAgICAgKi8KKyAgICBpZiAocGpfbGlzdF9lbXB0eSgmaW9xdWV1ZS0+ZnJlZV9saXN0KSkgeworCXBqX2xvY2tfcmVsZWFzZShpb3F1ZXVlLT5sb2NrKTsKKwlyZXR1cm4gUEpfRVRPT01BTlk7CisgICAgfQorCisgICAgcmVjID0gaW9xdWV1ZS0+ZnJlZV9saXN0Lm5leHQ7CisgICAgcGpfbGlzdF9lcmFzZShyZWMpOworCisgICAgLyogU2V0IGluaXRpYWwgcmVmZXJlbmNlIGNvdW50IHRvIDEgKi8KKyAgICBwal9hc3NlcnQocGpfYXRvbWljX2dldChyZWMtPnJlZl9jb3VudCkgPT0gMCk7CisgICAgcGpfYXRvbWljX2luYyhyZWMtPnJlZl9jb3VudCk7CisKKyAgICByZWMtPmNsb3NpbmcgPSAwOworCisjZWxzZQorICAgIHJlYyA9IHBqX3Bvb2xfemFsbG9jKHBvb2wsIHNpemVvZihwal9pb3F1ZXVlX2tleV90KSk7CisjZW5kaWYKKworICAgIC8qIEJ1aWxkIHRoZSBrZXkgZm9yIHRoaXMgc29ja2V0LiAqLworICAgIHJlYy0+aW9xdWV1ZSA9IGlvcXVldWU7CisgICAgcmVjLT5obmQgPSAoSEFORExFKXNvY2s7CisgICAgcmVjLT5obmRfdHlwZSA9IEhORF9JU19TT0NLRVQ7CisgICAgcmVjLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgICAgcGpfbWVtY3B5KCZyZWMtPmNiLCBjYiwgc2l6ZW9mKHBqX2lvcXVldWVfY2FsbGJhY2spKTsKKworICAgIC8qIFNldCBjb25jdXJyZW5jeSBmb3IgdGhpcyBoYW5kbGUgKi8KKyAgICByYyA9IHBqX2lvcXVldWVfc2V0X2NvbmN1cnJlbmN5KHJlYywgaW9xdWV1ZS0+ZGVmYXVsdF9jb25jdXJyZW5jeSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwlwal9sb2NrX3JlbGVhc2UoaW9xdWV1ZS0+bG9jayk7CisJcmV0dXJuIHJjOworICAgIH0KKworI2lmIFBKX0hBU19UQ1AKKyAgICByZWMtPmNvbm5lY3RpbmcgPSAwOworI2VuZGlmCisKKyAgICAvKiBTZXQgc29ja2V0IHRvIG5vbmJsb2NraW5nLiAqLworICAgIHZhbHVlID0gMTsKKyAgICByYyA9IGlvY3Rsc29ja2V0KHNvY2ssIEZJT05CSU8sICZ2YWx1ZSk7CisgICAgaWYgKHJjICE9IDApIHsKKwlwal9sb2NrX3JlbGVhc2UoaW9xdWV1ZS0+bG9jayk7CisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoV1NBR2V0TGFzdEVycm9yKCkpOworICAgIH0KKworICAgIC8qIEFzc29jaWF0ZSB3aXRoIElPQ1AgKi8KKyAgICBoaW9xID0gQ3JlYXRlSW9Db21wbGV0aW9uUG9ydCgoSEFORExFKXNvY2ssIGlvcXVldWUtPmlvY3AsIChEV09SRClyZWMsIDApOworICAgIGlmICghaGlvcSkgeworCXBqX2xvY2tfcmVsZWFzZShpb3F1ZXVlLT5sb2NrKTsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKKyAgICB9CisKKyAgICAqa2V5ID0gcmVjOworCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworICAgIHBqX2xpc3RfcHVzaF9iYWNrKCZpb3F1ZXVlLT5hY3RpdmVfbGlzdCwgcmVjKTsKKyNlbmRpZgorCisgICAgcGpfbG9ja19yZWxlYXNlKGlvcXVldWUtPmxvY2spOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIHBqX2lvcXVldWVfZ2V0X3VzZXJfZGF0YSgpCisgKi8KK1BKX0RFRih2b2lkKikgcGpfaW9xdWV1ZV9nZXRfdXNlcl9kYXRhKCBwal9pb3F1ZXVlX2tleV90ICprZXkgKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oa2V5LCBOVUxMKTsKKyAgICByZXR1cm4ga2V5LT51c2VyX2RhdGE7Cit9CisKKy8qCisgKiBwal9pb3F1ZXVlX3NldF91c2VyX2RhdGEoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfc2V0X3VzZXJfZGF0YSggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2xkX2RhdGEgKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oa2V5LCBQSl9FSU5WQUwpOworICAgIAorICAgIGlmIChvbGRfZGF0YSkKKyAgICAgICAgKm9sZF9kYXRhID0ga2V5LT51c2VyX2RhdGE7CisKKyAgICBrZXktPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworLyogRGVjcmVtZW50IHRoZSBrZXkncyByZWZlcmVuY2UgY291bnRlciwgYW5kIHdoZW4gdGhlIGNvdW50ZXIgcmVhY2ggemVybywKKyAqIGRlc3Ryb3kgdGhlIGtleS4KKyAqLworc3RhdGljIHZvaWQgZGVjcmVtZW50X2NvdW50ZXIocGpfaW9xdWV1ZV9rZXlfdCAqa2V5KQoreworICAgIGlmIChwal9hdG9taWNfZGVjX2FuZF9nZXQoa2V5LT5yZWZfY291bnQpID09IDApIHsKKworCXBqX2xvY2tfYWNxdWlyZShrZXktPmlvcXVldWUtPmxvY2spOworCisJcGpfYXNzZXJ0KGtleS0+Y2xvc2luZyA9PSAxKTsKKwlwal9nZXR0aWNrY291bnQoJmtleS0+ZnJlZV90aW1lKTsKKwlrZXktPmZyZWVfdGltZS5tc2VjICs9IFBKX0lPUVVFVUVfS0VZX0ZSRUVfREVMQVk7CisJcGpfdGltZV92YWxfbm9ybWFsaXplKCZrZXktPmZyZWVfdGltZSk7CisKKwlwal9saXN0X2VyYXNlKGtleSk7CisJcGpfbGlzdF9wdXNoX2JhY2soJmtleS0+aW9xdWV1ZS0+Y2xvc2luZ19saXN0LCBrZXkpOworCisJcGpfbG9ja19yZWxlYXNlKGtleS0+aW9xdWV1ZS0+bG9jayk7CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBQb2xsIHRoZSBJL08gQ29tcGxldGlvbiBQb3J0LCBleGVjdXRlIGNhbGxiYWNrLCAKKyAqIGFuZCByZXR1cm4gdGhlIGtleSBhbmQgYnl0ZXMgdHJhbnNmZXJlZCBvZiB0aGUgbGFzdCBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBwal9ib29sX3QgcG9sbF9pb2NwKCBIQU5ETEUgaElvY3AsIERXT1JEIGR3VGltZW91dCwgCisJCQkgICAgcGpfc3NpemVfdCAqcF9ieXRlcywgcGpfaW9xdWV1ZV9rZXlfdCAqKnBfa2V5ICkKK3sKKyAgICBEV09SRCBkd0J5dGVzVHJhbnNmZXJlZCwgZHdLZXk7CisgICAgZ2VuZXJpY19vdmVybGFwcGVkICpwT3Y7CisgICAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5OworICAgIHBqX3NzaXplX3Qgc2l6ZV9zdGF0dXMgPSAtMTsKKyAgICBCT09MIHJjR2V0UXVldWVkOworCisgICAgLyogUG9sbCBmb3IgY29tcGxldGlvbiBzdGF0dXMuICovCisgICAgcmNHZXRRdWV1ZWQgPSBHZXRRdWV1ZWRDb21wbGV0aW9uU3RhdHVzKGhJb2NwLCAmZHdCeXRlc1RyYW5zZmVyZWQsCisJCQkJCSAgICAmZHdLZXksIChPVkVSTEFQUEVEKiopJnBPdiwgCisJCQkJCSAgICBkd1RpbWVvdXQpOworCisgICAgLyogVGhlIHJldHVybiB2YWx1ZSBpczoKKyAgICAgKiAtIG5vbnplcm8gaWYgZXZlbnQgd2FzIGRlcXVldWVkLgorICAgICAqIC0gemVybyBhbmQgcE92PT1OVUxMIGlmIG5vIGV2ZW50IHdhcyBkZXF1ZXVlZC4KKyAgICAgKiAtIHplcm8gYW5kIHBPdiE9TlVMTCBpZiBldmVudCBmb3IgZmFpbGVkIEkvTyB3YXMgZGVxdWV1ZWQuCisgICAgICovCisgICAgaWYgKHBPdikgeworCXBqX2Jvb2xfdCBoYXNfbG9jazsKKworCS8qIEV2ZW50IHdhcyBkZXF1ZXVlZCBmb3IgZWl0aGVyIHN1Y2Nlc3NmdWxsIG9yIGZhaWxlZCBJL08gKi8KKwlrZXkgPSAocGpfaW9xdWV1ZV9rZXlfdCopZHdLZXk7CisJc2l6ZV9zdGF0dXMgPSBkd0J5dGVzVHJhbnNmZXJlZDsKKworCS8qIFJlcG9ydCB0byBjYWxsZXIgcmVnYXJkbGVzcyAqLworCWlmIChwX2J5dGVzKQorCSAgICAqcF9ieXRlcyA9IHNpemVfc3RhdHVzOworCWlmIChwX2tleSkKKwkgICAgKnBfa2V5ID0ga2V5OworCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworCS8qIFdlIHNob3VsZG4ndCBjYWxsIGNhbGxiYWNrcyBpZiBrZXkgaXMgcXVpdHRpbmcuICovCisJaWYgKGtleS0+Y2xvc2luZykKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisKKwkvKiBJZiBjb25jdXJyZW5jeSBpcyBkaXNhYmxlZCwgbG9jayB0aGUga2V5IAorCSAqIChhbmQgc2F2ZSB0aGUgbG9jayBzdGF0dXMgdG8gbG9jYWwgdmFyIHNpbmNlIGFwcCBtYXkgY2hhbmdlCisJICogY29uY3VycmVuY3kgc2V0dGluZyB3aGlsZSBpbiB0aGUgY2FsbGJhY2spICovCisJaWYgKGtleS0+YWxsb3dfY29uY3VycmVudCA9PSBQSl9GQUxTRSkgeworCSAgICBwal9tdXRleF9sb2NrKGtleS0+bXV0ZXgpOworCSAgICBoYXNfbG9jayA9IFBKX1RSVUU7CisJfSBlbHNlIHsKKwkgICAgaGFzX2xvY2sgPSBQSl9GQUxTRTsKKwl9CisKKwkvKiBOb3cgdGhhdCB3ZSBnZXQgdGhlIGxvY2ssIGNoZWNrIGFnYWluIHRoYXQga2V5IGlzIG5vdCBjbG9zaW5nICovCisJaWYgKGtleS0+Y2xvc2luZykgeworCSAgICBpZiAoaGFzX2xvY2spIHsKKwkJcGpfbXV0ZXhfdW5sb2NrKGtleS0+bXV0ZXgpOworCSAgICB9CisJICAgIHJldHVybiBQSl9UUlVFOworCX0KKworCS8qIEluY3JlbWVudCByZWZlcmVuY2UgY291bnRlciB0byBwcmV2ZW50IHRoaXMga2V5IGZyb20gYmVpbmcKKwkgKiBkZWxldGVkCisJICovCisJcGpfYXRvbWljX2luYyhrZXktPnJlZl9jb3VudCk7CisjZWxzZQorCVBKX1VOVVNFRF9BUkcoaGFzX2xvY2spOworI2VuZGlmCisKKwkvKiBDYXJyeSBvdXQgdGhlIGNhbGxiYWNrICovCisJc3dpdGNoIChwT3YtPm9wZXJhdGlvbikgeworCWNhc2UgUEpfSU9RVUVVRV9PUF9SRUFEOgorCWNhc2UgUEpfSU9RVUVVRV9PUF9SRUNWOgorCWNhc2UgUEpfSU9RVUVVRV9PUF9SRUNWX0ZST006CisgICAgICAgICAgICBwT3YtPm9wZXJhdGlvbiA9IDA7CisgICAgICAgICAgICBpZiAoa2V5LT5jYi5vbl9yZWFkX2NvbXBsZXRlKQorCSAgICAgICAga2V5LT5jYi5vbl9yZWFkX2NvbXBsZXRlKGtleSwgKHBqX2lvcXVldWVfb3Bfa2V5X3QqKXBPdiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfc3RhdHVzKTsKKwkgICAgYnJlYWs7CisJY2FzZSBQSl9JT1FVRVVFX09QX1dSSVRFOgorCWNhc2UgUEpfSU9RVUVVRV9PUF9TRU5EOgorCWNhc2UgUEpfSU9RVUVVRV9PUF9TRU5EX1RPOgorICAgICAgICAgICAgcE92LT5vcGVyYXRpb24gPSAwOworICAgICAgICAgICAgaWYgKGtleS0+Y2Iub25fd3JpdGVfY29tcGxldGUpCisJICAgICAgICBrZXktPmNiLm9uX3dyaXRlX2NvbXBsZXRlKGtleSwgKHBqX2lvcXVldWVfb3Bfa2V5X3QqKXBPdiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3N0YXR1cyk7CisJICAgIGJyZWFrOworI2lmIFBKX0hBU19UQ1AKKwljYXNlIFBKX0lPUVVFVUVfT1BfQUNDRVBUOgorCSAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGFjY2VwdC4gKi8KKwkgICAgaW9xdWV1ZV9vbl9hY2NlcHRfY29tcGxldGUoa2V5LCAoaW9xdWV1ZV9hY2NlcHRfcmVjKilwT3YpOworICAgICAgICAgICAgaWYgKGtleS0+Y2Iub25fYWNjZXB0X2NvbXBsZXRlKSB7CisgICAgICAgICAgICAgICAgaW9xdWV1ZV9hY2NlcHRfcmVjICphY2NlcHRfcmVjID0gKGlvcXVldWVfYWNjZXB0X3JlYyopcE92OworCQlwal9zdGF0dXNfdCBzdGF0dXMgPSBQSl9TVUNDRVNTOworCQlwal9zb2NrX3QgbmV3c29jazsKKworCQluZXdzb2NrID0gYWNjZXB0X3JlYy0+bmV3c29jazsKKwkJYWNjZXB0X3JlYy0+bmV3c29jayA9IFBKX0lOVkFMSURfU09DS0VUOworCisJCWlmIChuZXdzb2NrID09IFBKX0lOVkFMSURfU09DS0VUKSB7CisJCSAgICBpbnQgZHdFcnJvciA9IFdTQUdldExhc3RFcnJvcigpOworCQkgICAgaWYgKGR3RXJyb3IgPT0gMCkgZHdFcnJvciA9IE9TRVJSX0VOT1RDT05OOworCQkgICAgc3RhdHVzID0gUEpfUkVUVVJOX09TX0VSUk9SKGR3RXJyb3IpOworCQl9CisKKwkgICAgICAgIGtleS0+Y2Iub25fYWNjZXB0X2NvbXBsZXRlKGtleSwgKHBqX2lvcXVldWVfb3Bfa2V5X3QqKXBPdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzb2NrLCBzdGF0dXMpOworCQkKKyAgICAgICAgICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBQSl9JT1FVRVVFX09QX0NPTk5FQ1Q6CisjZW5kaWYKKwljYXNlIFBKX0lPUVVFVUVfT1BfTk9ORToKKwkgICAgcGpfYXNzZXJ0KDApOworCSAgICBicmVhazsKKwl9CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisJZGVjcmVtZW50X2NvdW50ZXIoa2V5KTsKKwlpZiAoaGFzX2xvY2spCisJICAgIHBqX211dGV4X3VubG9jayhrZXktPm11dGV4KTsKKyNlbmRpZgorCisJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorCisgICAgLyogTm8gZXZlbnQgd2FzIHF1ZXVlZC4gKi8KKyAgICByZXR1cm4gUEpfRkFMU0U7Cit9CisKKy8qCisgKiBwal9pb3F1ZXVlX3VucmVnaXN0ZXIoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfdW5yZWdpc3RlciggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5ICkKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIHBqX2Jvb2xfdCBoYXNfbG9jazsKKyAgICBlbnVtIHsgUkVUUlkgPSAxMCB9OworCisgICAgUEpfQVNTRVJUX1JFVFVSTihrZXksIFBKX0VJTlZBTCk7CisKKyNpZiBQSl9IQVNfVENQCisgICAgaWYgKGtleS0+Y29ubmVjdGluZykgeworCXVuc2lnbmVkIHBvczsKKyAgICAgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlOworCisgICAgICAgIGlvcXVldWUgPSBrZXktPmlvcXVldWU7CisKKwkvKiBFcmFzZSBmcm9tIGNvbm5lY3RpbmdfaGFuZGxlcyAqLworCXBqX2xvY2tfYWNxdWlyZShpb3F1ZXVlLT5sb2NrKTsKKwlmb3IgKHBvcz0wOyBwb3MgPCBpb3F1ZXVlLT5jb25uZWN0aW5nX2NvdW50OyArK3BvcykgeworCSAgICBpZiAoaW9xdWV1ZS0+Y29ubmVjdGluZ19rZXlzW3Bvc10gPT0ga2V5KSB7CisJCWVyYXNlX2Nvbm5lY3Rpbmdfc29ja2V0KGlvcXVldWUsIHBvcyk7CisJCWJyZWFrOworCSAgICB9CisJfQorCWtleS0+Y29ubmVjdGluZyA9IDA7CisJcGpfbG9ja19yZWxlYXNlKGlvcXVldWUtPmxvY2spOworICAgIH0KKyNlbmRpZgorCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworICAgIC8qIE1hcmsga2V5IGFzIGNsb3NpbmcgYmVmb3JlIGNsb3NpbmcgaGFuZGxlLiAqLworICAgIGtleS0+Y2xvc2luZyA9IDE7CisKKyAgICAvKiBJZiBjb25jdXJyZW5jeSBpcyBkaXNhYmxlZCwgd2FpdCB1bnRpbCB0aGUga2V5IGhhcyBmaW5pc2hlZAorICAgICAqIHByb2Nlc3NpbmcgdGhlIGNhbGxiYWNrCisgICAgICovCisgICAgaWYgKGtleS0+YWxsb3dfY29uY3VycmVudCA9PSBQSl9GQUxTRSkgeworCXBqX211dGV4X2xvY2soa2V5LT5tdXRleCk7CisJaGFzX2xvY2sgPSBQSl9UUlVFOworICAgIH0gZWxzZSB7CisJaGFzX2xvY2sgPSBQSl9GQUxTRTsKKyAgICB9CisjZWxzZQorICAgIFBKX1VOVVNFRF9BUkcoaGFzX2xvY2spOworI2VuZGlmCisgICAgCisgICAgLyogQ2xvc2UgaGFuZGxlICh0aGUgb25seSB3YXkgdG8gZGlzYXNzb2NpYXRlIGhhbmRsZSBmcm9tIElPQ1ApLiAKKyAgICAgKiBXZSBhbHNvIG5lZWQgdG8gY2xvc2UgaGFuZGxlIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIGZ1cnRoZXIgZXZlbnRzCisgICAgICogd2lsbCBjb21lIHRvIHRoZSBoYW5kbGUuCisgICAgICovCisgICAgLyogVXBkYXRlIDIwMDgvMDcvMTggKGh0dHA6Ly90cmFjLnBqc2lwLm9yZy9yZXBvcy90aWNrZXQvNTc1KToKKyAgICAgKiAgLSBJdCBzZWVtcyB0aGF0IENsb3NlSGFuZGxlKCkgaW4gaXRzZWxmIGRvZXMgbm90IGFjdHVhbGx5IGNsb3NlCisgICAgICogICAgdGhlIHNvY2tldCAoaS5lLiBpdCB3aWxsIHN0aWxsIGFwcGVhciBpbiAibmV0c3RhdCIgb3V0cHV0KS4gQWxzbworICAgICAqICAgIGlmIHdlIG9ubHkgdXNlIENsb3NlSGFuZGxlKCksIGFuICJJbnZhbGlkIEhhbmRsZSIgZXhjZXB0aW9uIHdpbGwKKyAgICAgKiAgICBiZSByYWlzZWQgaW4gV1NBQ2xlYW51cCgpLgorICAgICAqICAtIE1TRE4gZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgQ2xvc2VIYW5kbGUoKSBtdXN0IGJlIGNhbGxlZCBhZnRlciAKKyAgICAgKiAgICBjbG9zZXNvY2tldCgpIGNhbGwgKHNlZQorICAgICAqICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczcyNDIxMShWUy44NSkuYXNweCkuCisgICAgICogICAgQnV0IHR1cm5zIG91dCB0aGF0IHRoaXMgd2lsbCByYWlzZSAiSW52YWxpZCBIYW5kbGUiIGV4Y2VwdGlvbgorICAgICAqICAgIGluIGRlYnVnIG1vZGUuCisgICAgICogIFNvIGJlY2F1c2Ugb2YgdGhpcywgd2UgcmVwbGFjZWQgQ2xvc2VIYW5kbGUoKSB3aXRoIGNsb3Nlc29ja2V0KCkKKyAgICAgKiAgaW5zdGVhZC4gVGhlc2Ugd2FzIHRlc3RlZCBvbiBXaW5YUCBTUDIuCisgICAgICovCisgICAgLy9DbG9zZUhhbmRsZShrZXktPmhuZCk7CisgICAgcGpfc29ja19jbG9zZSgocGpfc29ja190KWtleS0+aG5kKTsKKworICAgIC8qIFJlc2V0IGNhbGxiYWNrcyAqLworICAgIGtleS0+Y2Iub25fYWNjZXB0X2NvbXBsZXRlID0gTlVMTDsKKyAgICBrZXktPmNiLm9uX2Nvbm5lY3RfY29tcGxldGUgPSBOVUxMOworICAgIGtleS0+Y2Iub25fcmVhZF9jb21wbGV0ZSA9IE5VTEw7CisgICAga2V5LT5jYi5vbl93cml0ZV9jb21wbGV0ZSA9IE5VTEw7CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgLyogRXZlbiBhZnRlciBoYW5kbGUgaXMgY2xvc2VkLCBJIHN1c3BlY3QgdGhhdCBJT0NQIG1heSBzdGlsbCB0cnkgdG8KKyAgICAgKiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgaGFuZGxlLCBjYXVzaW5nIG1lbW9yeSBjb3JydXB0aW9uIHdoZW4gcG9vbAorICAgICAqIGRlYnVnZ2luZyBpcyBlbmFibGVkLgorICAgICAqCisgICAgICogRm9yY2luZyBjb250ZXh0IHN3aXRjaCBzZWVtcyB0byBoYXZlIGZpeGVkIHRoYXQsIGJ1dCB0aGlzIGlzIHF1aXRlCisgICAgICogYW4gdWdseSBzb2x1dGlvbi4uCisgICAgICoKKyAgICAgKiBVcGRhdGUgMjAwOC8wMi8xMzoKKyAgICAgKglUaGlzIHNob3VsZCBub3QgaGFwcGVuIGlmIGNvbmN1cnJlbmN5IGlzIGRpc2FsbG93ZWQgZm9yIHRoZSBrZXkuCisgICAgICogIFNvIGF0IGxlYXN0IGFwcGxpY2F0aW9uIGhhcyBhIHNvbHV0aW9uIGZvciB0aGlzIChpLmUuIGJ5IGRpc2FsbG93aW5nCisgICAgICogIGNvbmN1cnJlbmN5IGluIHRoZSBrZXkpLgorICAgICAqLworICAgIC8vVGhpcyB3aWxsIGxvb3AgZm9yZXZlciBpZiB1bnJlZ2lzdHJhdGlvbiBpcyBkb25lIG9uIHRoZSBjYWxsYmFjay4KKyAgICAvL0RvaW5nIHRoaXMgd2l0aCBSRVRSWSBJIHRoaW5rIHNob3VsZCBzb2x2ZSB0aGUgSU9DUCBzZXR0aW5nIHRoZSAKKyAgICAvL3NvY2tldCBzaWduYWxsZWQsIHdpdGhvdXQgY2F1c2luZyB0aGUgZGVhZGxvY2suCisgICAgLy93aGlsZSAocGpfYXRvbWljX2dldChrZXktPnJlZl9jb3VudCkgIT0gMSkKKyAgICAvLwlwal90aHJlYWRfc2xlZXAoMCk7CisgICAgZm9yIChpPTA7IHBqX2F0b21pY19nZXQoa2V5LT5yZWZfY291bnQpICE9IDEgJiYgaTxSRVRSWTsgKytpKQorCXBqX3RocmVhZF9zbGVlcCgwKTsKKworICAgIC8qIERlY3JlbWVudCByZWZlcmVuY2UgY291bnRlciB0byBkZXN0cm95IHRoZSBrZXkuICovCisgICAgZGVjcmVtZW50X2NvdW50ZXIoa2V5KTsKKworICAgIGlmIChoYXNfbG9jaykKKwlwal9tdXRleF91bmxvY2soa2V5LT5tdXRleCk7CisjZW5kaWYKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworLyogU2NhbiB0aGUgY2xvc2luZyBsaXN0LCBhbmQgcHV0IHBlbmRpbmcgY2xvc2luZyBrZXlzIHRvIGZyZWUgbGlzdC4KKyAqIE11c3QgZG8gdGhpcyB3aXRoIGlvcXVldWUgbXV0ZXggaGVsZC4KKyAqLworc3RhdGljIHZvaWQgc2Nhbl9jbG9zaW5nX2tleXMocGpfaW9xdWV1ZV90ICppb3F1ZXVlKQoreworICAgIGlmICghcGpfbGlzdF9lbXB0eSgmaW9xdWV1ZS0+Y2xvc2luZ19saXN0KSkgeworCXBqX3RpbWVfdmFsIG5vdzsKKwlwal9pb3F1ZXVlX2tleV90ICprZXk7CisKKwlwal9nZXR0aWNrY291bnQoJm5vdyk7CisJCisJLyogTW92ZSBjbG9zaW5nIGtleXMgdG8gZnJlZSBsaXN0IHdoZW4gdGhleSd2ZSBmaW5pc2hlZCB0aGUgY2xvc2luZworCSAqIGlkbGUgdGltZS4KKwkgKi8KKwlrZXkgPSBpb3F1ZXVlLT5jbG9zaW5nX2xpc3QubmV4dDsKKwl3aGlsZSAoa2V5ICE9ICZpb3F1ZXVlLT5jbG9zaW5nX2xpc3QpIHsKKwkgICAgcGpfaW9xdWV1ZV9rZXlfdCAqbmV4dCA9IGtleS0+bmV4dDsKKworCSAgICBwal9hc3NlcnQoa2V5LT5jbG9zaW5nICE9IDApOworCisJICAgIGlmIChQSl9USU1FX1ZBTF9HVEUobm93LCBrZXktPmZyZWVfdGltZSkpIHsKKwkJcGpfbGlzdF9lcmFzZShrZXkpOworCQlwal9saXN0X3B1c2hfYmFjaygmaW9xdWV1ZS0+ZnJlZV9saXN0LCBrZXkpOworCSAgICB9CisJICAgIGtleSA9IG5leHQ7CisJfQorICAgIH0KK30KKyNlbmRpZgorCisvKgorICogcGpfaW9xdWV1ZV9wb2xsKCkKKyAqCisgKiBQb2xsIGZvciBldmVudHMuCisgKi8KK1BKX0RFRihpbnQpIHBqX2lvcXVldWVfcG9sbCggcGpfaW9xdWV1ZV90ICppb3F1ZXVlLCBjb25zdCBwal90aW1lX3ZhbCAqdGltZW91dCkKK3sKKyAgICBEV09SRCBkd01zZWM7CisjaWYgUEpfSEFTX1RDUAorICAgIGludCBjb25uZWN0X2NvdW50ID0gMDsKKyNlbmRpZgorICAgIGludCBldmVudF9jb3VudCA9IDA7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGlvcXVldWUsIC1QSl9FSU5WQUwpOworCisgICAgLyogQ2FsY3VsYXRlIG1pbGlzZWNvbmRzIHRpbWVvdXQgZm9yIEdldFF1ZXVlZENvbXBsZXRpb25TdGF0dXMgKi8KKyAgICBkd01zZWMgPSB0aW1lb3V0ID8gdGltZW91dC0+c2VjKjEwMDAgKyB0aW1lb3V0LT5tc2VjIDogSU5GSU5JVEU7CisKKyAgICAvKiBQb2xsIGZvciBjb21wbGV0aW9uIHN0YXR1cy4gKi8KKyAgICBldmVudF9jb3VudCA9IHBvbGxfaW9jcChpb3F1ZXVlLT5pb2NwLCBkd01zZWMsIE5VTEwsIE5VTEwpOworCisjaWYgUEpfSEFTX1RDUAorICAgIC8qIENoZWNrIHRoZSBjb25uZWN0aW5nIGFycmF5LCBvbmx5IHdoZW4gdGhlcmUncyBubyBhY3Rpdml0eS4gKi8KKyAgICBpZiAoZXZlbnRfY291bnQgPT0gMCkgeworCWNvbm5lY3RfY291bnQgPSBjaGVja19jb25uZWN0aW5nKGlvcXVldWUpOworCWlmIChjb25uZWN0X2NvdW50ID4gMCkKKwkgICAgZXZlbnRfY291bnQgKz0gY29ubmVjdF9jb3VudDsKKyAgICB9CisjZW5kaWYKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKyAgICAvKiBDaGVjayB0aGUgY2xvc2luZyBrZXlzIG9ubHkgd2hlbiB0aGVyZSdzIG5vIGFjdGl2aXR5IGFuZCB3aGVuIHRoZXJlIGFyZQorICAgICAqIHBlbmRpbmcgY2xvc2luZyBrZXlzLgorICAgICAqLworICAgIGlmIChldmVudF9jb3VudCA9PSAwICYmICFwal9saXN0X2VtcHR5KCZpb3F1ZXVlLT5jbG9zaW5nX2xpc3QpKSB7CisJcGpfbG9ja19hY3F1aXJlKGlvcXVldWUtPmxvY2spOworCXNjYW5fY2xvc2luZ19rZXlzKGlvcXVldWUpOworCXBqX2xvY2tfcmVsZWFzZShpb3F1ZXVlLT5sb2NrKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFJldHVybiBudW1iZXIgb2YgZXZlbnRzLiAqLworICAgIHJldHVybiBldmVudF9jb3VudDsKK30KKworLyoKKyAqIHBqX2lvcXVldWVfcmVjdigpCisgKgorICogSW5pdGlhdGUgb3ZlcmxhcHBlZCBXU0FSZWN2KCkgb3BlcmF0aW9uLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfcmVjdiggIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorCQkJCSAgICAgIHZvaWQgKmJ1ZmZlciwKKwkJCQkgICAgICBwal9zc2l6ZV90ICpsZW5ndGgsCisJCQkJICAgICAgcGpfdWludDMyX3QgZmxhZ3MgKQoreworICAgIC8qCisgICAgICogSWRlYWxseSB3ZSBzaG91bGQganVzdCBjYWxsIHBqX2lvcXVldWVfcmVjdmZyb20oKSB3aXRoIE5VTEwgYWRkciBhbmQKKyAgICAgKiBhZGRybGVuIGhlcmUuIEJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGdlbmVyYXRlcyBFSU5WQUwuLi4gOi0oCisgICAgICogIC1iZW5ueWxwCisgICAgICovCisgICAgaW50IHJjOworICAgIERXT1JEIGJ5dGVzUmVhZDsKKyAgICBEV09SRCBkd0ZsYWdzID0gMDsKKyAgICB1bmlvbiBvcGVyYXRpb25fa2V5ICpvcF9rZXlfcmVjOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGtleSAmJiBvcF9rZXkgJiYgYnVmZmVyICYmIGxlbmd0aCwgUEpfRUlOVkFMKTsKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKyAgICAvKiBDaGVjayBrZXkgaXMgbm90IGNsb3NpbmcgKi8KKyAgICBpZiAoa2V5LT5jbG9zaW5nKQorCXJldHVybiBQSl9FQ0FOQ0VMTEVEOworI2VuZGlmCisKKyAgICBvcF9rZXlfcmVjID0gKHVuaW9uIG9wZXJhdGlvbl9rZXkqKW9wX2tleS0+aW50ZXJuYWxfXzsKKyAgICBvcF9rZXlfcmVjLT5vdmVybGFwcGVkLndzYWJ1Zi5idWYgPSBidWZmZXI7CisgICAgb3Bfa2V5X3JlYy0+b3ZlcmxhcHBlZC53c2FidWYubGVuID0gKmxlbmd0aDsKKworICAgIGR3RmxhZ3MgPSBmbGFnczsKKyAgICAKKyAgICAvKiBUcnkgbm9uLW92ZXJsYXBwZWQgcmVjZWl2ZWQgZmlyc3QgdG8gc2VlIGlmIGRhdGEgaXMKKyAgICAgKiBpbW1lZGlhdGVseSBhdmFpbGFibGUuCisgICAgICovCisgICAgaWYgKChmbGFncyAmIFBKX0lPUVVFVUVfQUxXQVlTX0FTWU5DKSA9PSAwKSB7CisJcmMgPSBXU0FSZWN2KChTT0NLRVQpa2V5LT5obmQsICZvcF9rZXlfcmVjLT5vdmVybGFwcGVkLndzYWJ1ZiwgMSwKKwkJICAgICAmYnl0ZXNSZWFkLCAmZHdGbGFncywgTlVMTCwgTlVMTCk7CisJaWYgKHJjID09IDApIHsKKwkgICAgKmxlbmd0aCA9IGJ5dGVzUmVhZDsKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkgICAgRFdPUkQgZHdFcnJvciA9IFdTQUdldExhc3RFcnJvcigpOworCSAgICBpZiAoZHdFcnJvciAhPSBXU0FFV09VTERCTE9DSykgeworCQkqbGVuZ3RoID0gLTE7CisJCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZHdFcnJvcik7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgZHdGbGFncyAmPSB+KFBKX0lPUVVFVUVfQUxXQVlTX0FTWU5DKTsKKworICAgIC8qCisgICAgICogTm8gaW1tZWRpYXRlIGRhdGEgYXZhaWxhYmxlLgorICAgICAqIFJlZ2lzdGVyIG92ZXJsYXBwZWQgUmVjdigpIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwal9iemVybyggJm9wX2tleV9yZWMtPm92ZXJsYXBwZWQub3ZlcmxhcHBlZCwgCisgICAgICAgICAgICAgIHNpemVvZihvcF9rZXlfcmVjLT5vdmVybGFwcGVkLm92ZXJsYXBwZWQpKTsKKyAgICBvcF9rZXlfcmVjLT5vdmVybGFwcGVkLm9wZXJhdGlvbiA9IFBKX0lPUVVFVUVfT1BfUkVDVjsKKworICAgIHJjID0gV1NBUmVjdigoU09DS0VUKWtleS0+aG5kLCAmb3Bfa2V5X3JlYy0+b3ZlcmxhcHBlZC53c2FidWYsIDEsIAorICAgICAgICAgICAgICAgICAgJmJ5dGVzUmVhZCwgJmR3RmxhZ3MsIAorCQkgICZvcF9rZXlfcmVjLT5vdmVybGFwcGVkLm92ZXJsYXBwZWQsIE5VTEwpOworICAgIGlmIChyYyA9PSBTT0NLRVRfRVJST1IpIHsKKwlEV09SRCBkd1N0YXR1cyA9IFdTQUdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZHdTdGF0dXMhPVdTQV9JT19QRU5ESU5HKSB7CisgICAgICAgICAgICAqbGVuZ3RoID0gLTE7CisgICAgICAgICAgICByZXR1cm4gUEpfU1RBVFVTX0ZST01fT1MoZHdTdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUGVuZGluZyBvcGVyYXRpb24gaGFzIGJlZW4gc2NoZWR1bGVkLiAqLworICAgIHJldHVybiBQSl9FUEVORElORzsKK30KKworLyoKKyAqIHBqX2lvcXVldWVfcmVjdmZyb20oKQorICoKKyAqIEluaXRpYXRlIG92ZXJsYXBwZWQgUmVjdkZyb20oKSBvcGVyYXRpb24uCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9yZWN2ZnJvbSggcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisJCQkJCSB2b2lkICpidWZmZXIsCisJCQkJCSBwal9zc2l6ZV90ICpsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3VpbnQzMl90IGZsYWdzLAorCQkJCQkgcGpfc29ja2FkZHJfdCAqYWRkciwKKwkJCQkJIGludCAqYWRkcmxlbikKK3sKKyAgICBpbnQgcmM7CisgICAgRFdPUkQgYnl0ZXNSZWFkOworICAgIERXT1JEIGR3RmxhZ3MgPSAwOworICAgIHVuaW9uIG9wZXJhdGlvbl9rZXkgKm9wX2tleV9yZWM7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oa2V5ICYmIG9wX2tleSAmJiBidWZmZXIsIFBKX0VJTlZBTCk7CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgLyogQ2hlY2sga2V5IGlzIG5vdCBjbG9zaW5nICovCisgICAgaWYgKGtleS0+Y2xvc2luZykKKwlyZXR1cm4gUEpfRUNBTkNFTExFRDsKKyNlbmRpZgorCisgICAgb3Bfa2V5X3JlYyA9ICh1bmlvbiBvcGVyYXRpb25fa2V5KilvcF9rZXktPmludGVybmFsX187CisgICAgb3Bfa2V5X3JlYy0+b3ZlcmxhcHBlZC53c2FidWYuYnVmID0gYnVmZmVyOworICAgIG9wX2tleV9yZWMtPm92ZXJsYXBwZWQud3NhYnVmLmxlbiA9ICpsZW5ndGg7CisKKyAgICBkd0ZsYWdzID0gZmxhZ3M7CisgICAgCisgICAgLyogVHJ5IG5vbi1vdmVybGFwcGVkIHJlY2VpdmVkIGZpcnN0IHRvIHNlZSBpZiBkYXRhIGlzCisgICAgICogaW1tZWRpYXRlbHkgYXZhaWxhYmxlLgorICAgICAqLworICAgIGlmICgoZmxhZ3MgJiBQSl9JT1FVRVVFX0FMV0FZU19BU1lOQykgPT0gMCkgeworCXJjID0gV1NBUmVjdkZyb20oKFNPQ0tFVClrZXktPmhuZCwgJm9wX2tleV9yZWMtPm92ZXJsYXBwZWQud3NhYnVmLCAxLAorCQkJICZieXRlc1JlYWQsICZkd0ZsYWdzLCBhZGRyLCBhZGRybGVuLCBOVUxMLCBOVUxMKTsKKwlpZiAocmMgPT0gMCkgeworCSAgICAqbGVuZ3RoID0gYnl0ZXNSZWFkOworCSAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKwl9IGVsc2UgeworCSAgICBEV09SRCBkd0Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7CisJICAgIGlmIChkd0Vycm9yICE9IFdTQUVXT1VMREJMT0NLKSB7CisJCSpsZW5ndGggPSAtMTsKKwkJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihkd0Vycm9yKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBkd0ZsYWdzICY9IH4oUEpfSU9RVUVVRV9BTFdBWVNfQVNZTkMpOworCisgICAgLyoKKyAgICAgKiBObyBpbW1lZGlhdGUgZGF0YSBhdmFpbGFibGUuCisgICAgICogUmVnaXN0ZXIgb3ZlcmxhcHBlZCBSZWN2KCkgb3BlcmF0aW9uLgorICAgICAqLworICAgIHBqX2J6ZXJvKCAmb3Bfa2V5X3JlYy0+b3ZlcmxhcHBlZC5vdmVybGFwcGVkLCAKKyAgICAgICAgICAgICAgc2l6ZW9mKG9wX2tleV9yZWMtPm92ZXJsYXBwZWQub3ZlcmxhcHBlZCkpOworICAgIG9wX2tleV9yZWMtPm92ZXJsYXBwZWQub3BlcmF0aW9uID0gUEpfSU9RVUVVRV9PUF9SRUNWOworCisgICAgcmMgPSBXU0FSZWN2RnJvbSgoU09DS0VUKWtleS0+aG5kLCAmb3Bfa2V5X3JlYy0+b3ZlcmxhcHBlZC53c2FidWYsIDEsIAorICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUmVhZCwgJmR3RmxhZ3MsIGFkZHIsIGFkZHJsZW4sCisJCSAgICAgJm9wX2tleV9yZWMtPm92ZXJsYXBwZWQub3ZlcmxhcHBlZCwgTlVMTCk7CisgICAgaWYgKHJjID09IFNPQ0tFVF9FUlJPUikgeworCURXT1JEIGR3U3RhdHVzID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChkd1N0YXR1cyE9V1NBX0lPX1BFTkRJTkcpIHsKKyAgICAgICAgICAgICpsZW5ndGggPSAtMTsKKyAgICAgICAgICAgIHJldHVybiBQSl9TVEFUVVNfRlJPTV9PUyhkd1N0YXR1cyk7CisgICAgICAgIH0KKyAgICB9IAorICAgIAorICAgIC8qIFBlbmRpbmcgb3BlcmF0aW9uIGhhcyBiZWVuIHNjaGVkdWxlZC4gKi8KKyAgICByZXR1cm4gUEpfRVBFTkRJTkc7Cit9CisKKy8qCisgKiBwal9pb3F1ZXVlX3NlbmQoKQorICoKKyAqIEluaXRpYXRlIG92ZXJsYXBwZWQgU2VuZCBvcGVyYXRpb24uCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9zZW5kKCAgcGpfaW9xdWV1ZV9rZXlfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisJCQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgICBwal9zc2l6ZV90ICpsZW5ndGgsCisJCQkJICAgICAgcGpfdWludDMyX3QgZmxhZ3MgKQoreworICAgIHJldHVybiBwal9pb3F1ZXVlX3NlbmR0byhrZXksIG9wX2tleSwgZGF0YSwgbGVuZ3RoLCBmbGFncywgTlVMTCwgMCk7Cit9CisKKworLyoKKyAqIHBqX2lvcXVldWVfc2VuZHRvKCkKKyAqCisgKiBJbml0aWF0ZSBvdmVybGFwcGVkIFNlbmRUbyBvcGVyYXRpb24uCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9zZW5kdG8oIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICAgICAgcGpfc3NpemVfdCAqbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdWludDMyX3QgZmxhZ3MsCisJCQkJICAgICAgIGNvbnN0IHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJICAgICAgIGludCBhZGRybGVuKQoreworICAgIGludCByYzsKKyAgICBEV09SRCBieXRlc1dyaXR0ZW47CisgICAgRFdPUkQgZHdGbGFnczsKKyAgICB1bmlvbiBvcGVyYXRpb25fa2V5ICpvcF9rZXlfcmVjOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGtleSAmJiBvcF9rZXkgJiYgZGF0YSwgUEpfRUlOVkFMKTsKKworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKyAgICAvKiBDaGVjayBrZXkgaXMgbm90IGNsb3NpbmcgKi8KKyAgICBpZiAoa2V5LT5jbG9zaW5nKQorCXJldHVybiBQSl9FQ0FOQ0VMTEVEOworI2VuZGlmCisKKyAgICBvcF9rZXlfcmVjID0gKHVuaW9uIG9wZXJhdGlvbl9rZXkqKW9wX2tleS0+aW50ZXJuYWxfXzsKKworICAgIC8qCisgICAgICogRmlyc3QgdHJ5IGJsb2NraW5nIHdyaXRlLgorICAgICAqLworICAgIG9wX2tleV9yZWMtPm92ZXJsYXBwZWQud3NhYnVmLmJ1ZiA9ICh2b2lkKilkYXRhOworICAgIG9wX2tleV9yZWMtPm92ZXJsYXBwZWQud3NhYnVmLmxlbiA9ICpsZW5ndGg7CisKKyAgICBkd0ZsYWdzID0gZmxhZ3M7CisKKyAgICBpZiAoKGZsYWdzICYgUEpfSU9RVUVVRV9BTFdBWVNfQVNZTkMpID09IDApIHsKKwlyYyA9IFdTQVNlbmRUbygoU09DS0VUKWtleS0+aG5kLCAmb3Bfa2V5X3JlYy0+b3ZlcmxhcHBlZC53c2FidWYsIDEsCisJCSAgICAgICAmYnl0ZXNXcml0dGVuLCBkd0ZsYWdzLCBhZGRyLCBhZGRybGVuLAorCQkgICAgICAgTlVMTCwgTlVMTCk7CisJaWYgKHJjID09IDApIHsKKwkgICAgKmxlbmd0aCA9IGJ5dGVzV3JpdHRlbjsKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkgICAgRFdPUkQgZHdTdGF0dXMgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKwkgICAgaWYgKGR3U3RhdHVzICE9IFdTQUVXT1VMREJMT0NLKSB7CisJCSpsZW5ndGggPSAtMTsKKwkJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihkd1N0YXR1cyk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgZHdGbGFncyAmPSB+KFBKX0lPUVVFVUVfQUxXQVlTX0FTWU5DKTsKKworICAgIC8qCisgICAgICogRGF0YSBjYW4ndCBiZSBzZW50IGltbWVkaWF0ZWx5LgorICAgICAqIFNjaGVkdWxlIGFzeW5jaHJvbm91cyBXU0FTZW5kKCkuCisgICAgICovCisgICAgcGpfYnplcm8oICZvcF9rZXlfcmVjLT5vdmVybGFwcGVkLm92ZXJsYXBwZWQsIAorICAgICAgICAgICAgICBzaXplb2Yob3Bfa2V5X3JlYy0+b3ZlcmxhcHBlZC5vdmVybGFwcGVkKSk7CisgICAgb3Bfa2V5X3JlYy0+b3ZlcmxhcHBlZC5vcGVyYXRpb24gPSBQSl9JT1FVRVVFX09QX1NFTkQ7CisKKyAgICByYyA9IFdTQVNlbmRUbygoU09DS0VUKWtleS0+aG5kLCAmb3Bfa2V5X3JlYy0+b3ZlcmxhcHBlZC53c2FidWYsIDEsCisgICAgICAgICAgICAgICAgICAgJmJ5dGVzV3JpdHRlbiwgIGR3RmxhZ3MsIGFkZHIsIGFkZHJsZW4sCisJCSAgICZvcF9rZXlfcmVjLT5vdmVybGFwcGVkLm92ZXJsYXBwZWQsIE5VTEwpOworICAgIGlmIChyYyA9PSBTT0NLRVRfRVJST1IpIHsKKwlEV09SRCBkd1N0YXR1cyA9IFdTQUdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZHdTdGF0dXMhPVdTQV9JT19QRU5ESU5HKQorICAgICAgICAgICAgcmV0dXJuIFBKX1NUQVRVU19GUk9NX09TKGR3U3RhdHVzKTsKKyAgICB9CisKKyAgICAvKiBBc3luY2hyb25vdXMgb3BlcmF0aW9uIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQuICovCisgICAgcmV0dXJuIFBKX0VQRU5ESU5HOworfQorCisjaWYgUEpfSEFTX1RDUAorCisvKgorICogcGpfaW9xdWV1ZV9hY2NlcHQoKQorICoKKyAqIEluaXRpYXRlIG92ZXJsYXBwZWQgYWNjZXB0KCkgb3BlcmF0aW9uLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfYWNjZXB0KCBwal9pb3F1ZXVlX2tleV90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisJCQkgICAgICAgICAgICAgICBwal9zb2NrX3QgKm5ld19zb2NrLAorCQkJICAgICAgICAgICAgICAgcGpfc29ja2FkZHJfdCAqbG9jYWwsCisJCQkgICAgICAgICAgICAgICBwal9zb2NrYWRkcl90ICpyZW1vdGUsCisJCQkgICAgICAgICAgICAgICBpbnQgKmFkZHJsZW4pCit7CisgICAgQk9PTCByYzsKKyAgICBEV09SRCBieXRlc1JlY2VpdmVkOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICB1bmlvbiBvcGVyYXRpb25fa2V5ICpvcF9rZXlfcmVjOworICAgIFNPQ0tFVCBzb2NrOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGtleSAmJiBvcF9rZXkgJiYgbmV3X3NvY2ssIFBKX0VJTlZBTCk7CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgLyogQ2hlY2sga2V5IGlzIG5vdCBjbG9zaW5nICovCisgICAgaWYgKGtleS0+Y2xvc2luZykKKwlyZXR1cm4gUEpfRUNBTkNFTExFRDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBTZWUgaWYgdGhlcmUgaXMgYSBuZXcgY29ubmVjdGlvbiBpbW1lZGlhdGVseSBhdmFpbGFibGUuCisgICAgICovCisgICAgc29jayA9IFdTQUFjY2VwdCgoU09DS0VUKWtleS0+aG5kLCByZW1vdGUsIGFkZHJsZW4sIE5VTEwsIDApOworICAgIGlmIChzb2NrICE9IElOVkFMSURfU09DS0VUKSB7CisgICAgICAgIC8qIFllcyEgTmV3IHNvY2tldCBpcyBhdmFpbGFibGUhICovCisJaWYgKGxvY2FsICYmIGFkZHJsZW4pIHsKKwkgICAgaW50IHN0YXR1czsKKworCSAgICAvKiBPbiBXaW5YUCBvciBsYXRlciwgdXNlIFNPX1VQREFURV9BQ0NFUFRfQ09OVEVYVCBzbyB0aGF0IHNvY2tldCAKKwkgICAgICogYWRkcmVzc2VzIGNhbiBiZSBvYnRhaW5lZCB3aXRoIGdldHNvY2tuYW1lKCkgYW5kIGdldHBlZXJuYW1lKCkuCisJICAgICAqLworCSAgICBzdGF0dXMgPSBzZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1VQREFURV9BQ0NFUFRfQ09OVEVYVCwKKwkJCQkoY2hhciopJmtleS0+aG5kLCBzaXplb2YoU09DS0VUKSk7CisJICAgIC8qIFNPX1VQREFURV9BQ0NFUFRfQ09OVEVYVCBpcyBmb3IgV2luWFAgb3IgbGF0ZXIuCisJICAgICAqIFNvIGlnbm9yZSB0aGUgZXJyb3Igc3RhdHVzLgorCSAgICAgKi8KKworCSAgICBzdGF0dXMgPSBnZXRzb2NrbmFtZShzb2NrLCBsb2NhbCwgYWRkcmxlbik7CisJICAgIGlmIChzdGF0dXMgIT0gMCkgeworCQlEV09SRCBkd0Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7CisJCWNsb3Nlc29ja2V0KHNvY2spOworCQlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKGR3RXJyb3IpOworCSAgICB9CisJfQorCisgICAgICAgICpuZXdfc29jayA9IHNvY2s7CisgICAgICAgIHJldHVybiBQSl9TVUNDRVNTOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgRFdPUkQgZHdFcnJvciA9IFdTQUdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZHdFcnJvciAhPSBXU0FFV09VTERCTE9DSykgeworICAgICAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihkd0Vycm9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTm8gY29ubmVjdGlvbiBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUuCisgICAgICogTXVzdCBzY2hlZHVsZSBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgorICAgICAqLworICAgIG9wX2tleV9yZWMgPSAodW5pb24gb3BlcmF0aW9uX2tleSopb3Bfa2V5LT5pbnRlcm5hbF9fOworICAgIAorICAgIHN0YXR1cyA9IHBqX3NvY2tfc29ja2V0KHBqX0FGX0lORVQoKSwgcGpfU09DS19TVFJFQU0oKSwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wX2tleV9yZWMtPmFjY2VwdC5uZXdzb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgIG9wX2tleV9yZWMtPmFjY2VwdC5vcGVyYXRpb24gPSBQSl9JT1FVRVVFX09QX0FDQ0VQVDsKKyAgICBvcF9rZXlfcmVjLT5hY2NlcHQuYWRkcmxlbiA9IGFkZHJsZW47CisgICAgb3Bfa2V5X3JlYy0+YWNjZXB0LmxvY2FsID0gbG9jYWw7CisgICAgb3Bfa2V5X3JlYy0+YWNjZXB0LnJlbW90ZSA9IHJlbW90ZTsKKyAgICBvcF9rZXlfcmVjLT5hY2NlcHQubmV3c29ja19wdHIgPSBuZXdfc29jazsKKyAgICBwal9iemVybyggJm9wX2tleV9yZWMtPmFjY2VwdC5vdmVybGFwcGVkLCAKKwkgICAgICBzaXplb2Yob3Bfa2V5X3JlYy0+YWNjZXB0Lm92ZXJsYXBwZWQpKTsKKworICAgIHJjID0gQWNjZXB0RXgoIChTT0NLRVQpa2V5LT5obmQsIChTT0NLRVQpb3Bfa2V5X3JlYy0+YWNjZXB0Lm5ld3NvY2ssCisJCSAgIG9wX2tleV9yZWMtPmFjY2VwdC5hY2NlcHRfYnVmLAorCQkgICAwLCBBQ0NFUFRfQUREUl9MRU4sIEFDQ0VQVF9BRERSX0xFTiwKKwkJICAgJmJ5dGVzUmVjZWl2ZWQsCisJCSAgICZvcF9rZXlfcmVjLT5hY2NlcHQub3ZlcmxhcHBlZCApOworCisgICAgaWYgKHJjID09IFRSVUUpIHsKKwlpb3F1ZXVlX29uX2FjY2VwdF9jb21wbGV0ZShrZXksICZvcF9rZXlfcmVjLT5hY2NlcHQpOworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0gZWxzZSB7CisJRFdPUkQgZHdTdGF0dXMgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKwlpZiAoZHdTdGF0dXMhPVdTQV9JT19QRU5ESU5HKQorICAgICAgICAgICAgcmV0dXJuIFBKX1NUQVRVU19GUk9NX09TKGR3U3RhdHVzKTsKKyAgICB9CisKKyAgICAvKiBBc3luY2hyb25vdXMgQWNjZXB0KCkgaGFzIGJlZW4gc3VibWl0dGVkLiAqLworICAgIHJldHVybiBQSl9FUEVORElORzsKK30KKworCisvKgorICogcGpfaW9xdWV1ZV9jb25uZWN0KCkKKyAqCisgKiBJbml0aWF0ZSBvdmVybGFwcGVkIGNvbm5lY3QoKSBvcGVyYXRpb24gKHdlbGwsIGl0J3Mgbm9uLWJsb2NraW5nIGFjdHVhbGx5LAorICogc2luY2UgdGhlcmUncyBubyBvdmVybGFwcGVkIHZlcnNpb24gb2YgY29ubmVjdCgpKS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX2Nvbm5lY3QoIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKwkJCQkJY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkciwKKwkJCQkJaW50IGFkZHJsZW4gKQoreworICAgIEhBTkRMRSBoRXZlbnQ7CisgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGtleSAmJiBhZGRyICYmIGFkZHJsZW4sIFBKX0VJTlZBTCk7CisKKyNpZiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHCisgICAgLyogQ2hlY2sga2V5IGlzIG5vdCBjbG9zaW5nICovCisgICAgaWYgKGtleS0+Y2xvc2luZykKKwlyZXR1cm4gUEpfRUNBTkNFTExFRDsKKyNlbmRpZgorCisgICAgLyogSW5pdGlhdGUgY29ubmVjdCgpICovCisgICAgaWYgKGNvbm5lY3QoKHBqX3NvY2tfdClrZXktPmhuZCwgYWRkciwgYWRkcmxlbikgIT0gMCkgeworCURXT1JEIGR3U3RhdHVzOworCWR3U3RhdHVzID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChkd1N0YXR1cyAhPSBXU0FFV09VTERCTE9DSykgeworCSAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKGR3U3RhdHVzKTsKKwl9CisgICAgfSBlbHNlIHsKKwkvKiBDb25uZWN0IGhhcyBjb21wbGV0ZWQgaW1tZWRpYXRlbHkhICovCisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisgICAgaW9xdWV1ZSA9IGtleS0+aW9xdWV1ZTsKKworICAgIC8qIEFkZCB0byB0aGUgYXJyYXkgb2YgY29ubmVjdGluZyBzb2NrZXQgdG8gYmUgcG9sbGVkICovCisgICAgcGpfbG9ja19hY3F1aXJlKGlvcXVldWUtPmxvY2spOworCisgICAgaWYgKGlvcXVldWUtPmNvbm5lY3RpbmdfY291bnQgPj0gTUFYSU1VTV9XQUlUX09CSkVDVFMpIHsKKwlwal9sb2NrX3JlbGVhc2UoaW9xdWV1ZS0+bG9jayk7CisJcmV0dXJuIFBKX0VUT09NQU5ZQ09OTjsKKyAgICB9CisKKyAgICAvKiBHZXQgb3IgY3JlYXRlIGV2ZW50IG9iamVjdC4gKi8KKyAgICBpZiAoaW9xdWV1ZS0+ZXZlbnRfY291bnQpIHsKKwloRXZlbnQgPSBpb3F1ZXVlLT5ldmVudF9wb29sW2lvcXVldWUtPmV2ZW50X2NvdW50IC0gMV07CisJLS1pb3F1ZXVlLT5ldmVudF9jb3VudDsKKyAgICB9IGVsc2UgeworCWhFdmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKKwlpZiAoaEV2ZW50ID09IE5VTEwpIHsKKwkgICAgRFdPUkQgZHdTdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKKwkgICAgcGpfbG9ja19yZWxlYXNlKGlvcXVldWUtPmxvY2spOworCSAgICByZXR1cm4gUEpfU1RBVFVTX0ZST01fT1MoZHdTdGF0dXMpOworCX0KKyAgICB9CisKKyAgICAvKiBNYXJrIGtleSBhcyBjb25uZWN0aW5nLgorICAgICAqIFdlIGNhbid0IHVzZSBhcnJheSBpbmRleCBzaW5jZSBrZXkgY2FuIGJlIHJlbW92ZWQgZHluYW1pY2FsbHkuIAorICAgICAqLworICAgIGtleS0+Y29ubmVjdGluZyA9IDE7CisKKyAgICAvKiBBc3NvY2lhdGUgc29ja2V0IGV2ZW50cyB0byB0aGUgZXZlbnQgb2JqZWN0LiAqLworICAgIGlmIChXU0FFdmVudFNlbGVjdCgocGpfc29ja190KWtleS0+aG5kLCBoRXZlbnQsIEZEX0NPTk5FQ1QpICE9IDApIHsKKwlDbG9zZUhhbmRsZShoRXZlbnQpOworCXBqX2xvY2tfcmVsZWFzZShpb3F1ZXVlLT5sb2NrKTsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKFdTQUdldExhc3RFcnJvcigpKTsKKyAgICB9CisKKyAgICAvKiBBZGQgdG8gYXJyYXkuICovCisgICAgaW9xdWV1ZS0+Y29ubmVjdGluZ19rZXlzWyBpb3F1ZXVlLT5jb25uZWN0aW5nX2NvdW50IF0gPSBrZXk7CisgICAgaW9xdWV1ZS0+Y29ubmVjdGluZ19oYW5kbGVzWyBpb3F1ZXVlLT5jb25uZWN0aW5nX2NvdW50IF0gPSBoRXZlbnQ7CisgICAgaW9xdWV1ZS0+Y29ubmVjdGluZ19jb3VudCsrOworCisgICAgcGpfbG9ja19yZWxlYXNlKGlvcXVldWUtPmxvY2spOworCisgICAgcmV0dXJuIFBKX0VQRU5ESU5HOworfQorI2VuZGlmCS8qICNpZiBQSl9IQVNfVENQICovCisKKworUEpfREVGKHZvaWQpIHBqX2lvcXVldWVfb3Bfa2V5X2luaXQoIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCQkgICAgIHBqX3NpemVfdCBzaXplICkKK3sKKyAgICBwal9iemVybyhvcF9rZXksIHNpemUpOworfQorCitQSl9ERUYocGpfYm9vbF90KSBwal9pb3F1ZXVlX2lzX3BlbmRpbmcoIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5ICkKK3sKKyAgICBCT09MIHJjOworICAgIERXT1JEIGJ5dGVzVHJhbnNmZXJlZDsKKworICAgIHJjID0gR2V0T3ZlcmxhcHBlZFJlc3VsdCgga2V5LT5obmQsIChMUE9WRVJMQVBQRUQpb3Bfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzVHJhbnNmZXJlZCwgRkFMU0UgKTsKKworICAgIGlmIChyYyA9PSBGQUxTRSkgeworICAgICAgICByZXR1cm4gR2V0TGFzdEVycm9yKCk9PUVSUk9SX0lPX0lOQ09NUExFVEU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW9xdWV1ZV9wb3N0X2NvbXBsZXRpb24oIHBqX2lvcXVldWVfa2V5X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3NzaXplX3QgYnl0ZXNfc3RhdHVzICkKK3sKKyAgICBCT09MIHJjOworCisgICAgcmMgPSBQb3N0UXVldWVkQ29tcGxldGlvblN0YXR1cyhrZXktPmlvcXVldWUtPmlvY3AsIGJ5dGVzX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKWtleSwgKE9WRVJMQVBQRUQqKW9wX2tleSApOworICAgIGlmIChyYyA9PSBGQUxTRSkgeworICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9pb3F1ZXVlX3NldF9jb25jdXJyZW5jeShwal9pb3F1ZXVlX2tleV90ICprZXksCisJCQkJCSAgICAgICBwal9ib29sX3QgYWxsb3cpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihrZXksIFBKX0VJTlZBTCk7CisKKyAgICAvKiBQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHIG11c3QgYmUgZW5hYmxlZCBpZiBjb25jdXJyZW5jeSBpcworICAgICAqIGRpc2FibGVkLgorICAgICAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oYWxsb3cgfHwgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRywgUEpfRUlOVkFMKTsKKworICAgIGtleS0+YWxsb3dfY29uY3VycmVudCA9IGFsbG93OworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfbG9ja19rZXkocGpfaW9xdWV1ZV9rZXlfdCAqa2V5KQoreworI2lmIFBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcKKyAgICByZXR1cm4gcGpfbXV0ZXhfbG9jayhrZXktPm11dGV4KTsKKyNlbHNlCisgICAgUEpfQVNTRVJUX1JFVFVSTighIlBKX0lPUVVFVUVfSEFTX1NBRkVfVU5SRUcgaXMgZGlzYWJsZWQiLCBQSl9FSU5WQUxJRE9QKTsKKyNlbmRpZgorfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2lvcXVldWVfdW5sb2NrX2tleShwal9pb3F1ZXVlX2tleV90ICprZXkpCit7CisjaWYgUEpfSU9RVUVVRV9IQVNfU0FGRV9VTlJFRworICAgIHJldHVybiBwal9tdXRleF91bmxvY2soa2V5LT5tdXRleCk7CisjZWxzZQorICAgIFBKX0FTU0VSVF9SRVRVUk4oISJQSl9JT1FVRVVFX0hBU19TQUZFX1VOUkVHIGlzIGRpc2FibGVkIiwgUEpfRUlOVkFMSURPUCk7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pcF9oZWxwZXJfZ2VuZXJpYy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pcF9oZWxwZXJfZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDVhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2lwX2hlbHBlcl9nZW5lcmljLmMKQEAgLTAsMCArMSw0MDkgQEAKKy8qICRJZDogaXBfaGVscGVyX2dlbmVyaWMuYyA0MzU1IDIwMTMtMDItMTkgMTY6Mjc6MzdaIGJlbm55bHAgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9pcF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxwai9hZGRyX3Jlc29sdi5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3NvY2tldC5oPgorI2luY2x1ZGUgPHBqL3NvY2suaD4KKworLyogU2V0IHRvIDEgdG8gZW5hYmxlIHRyYWNpbmcgKi8KKyNpZiAwCisjICAgaW5jbHVkZSA8cGovbG9nLmg+CisjICAgZGVmaW5lIFRISVNfRklMRQkiaXBfaGVscGVyX2dlbmVyaWMuYyIKKyMgICBkZWZpbmUgVFJBQ0VfKGV4cCkJUEpfTE9HKDUsZXhwKQorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRfb3NfZXJybXNnKHZvaWQpCisgICAgeworCXN0YXRpYyBjaGFyIGVycm1zZ1tQSl9FUlJfTVNHX1NJWkVdOworCXBqX3N0cmVycm9yKHBqX2dldF9vc19lcnJvcigpLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKwlyZXR1cm4gZXJybXNnOworICAgIH0KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2FkZHIodm9pZCAqYWRkcikKKyAgICB7CisJc3RhdGljIGNoYXIgdHh0W1BKX0lORVQ2X0FERFJTVFJMRU5dOworCXN0cnVjdCBzb2NrYWRkciAqYWQgPSAoc3RydWN0IHNvY2thZGRyKilhZGRyOworCWlmIChhZC0+c2FfZmFtaWx5ICE9IFBKX0FGX0lORVQgJiYgYWQtPnNhX2ZhbWlseSAhPSBQSl9BRl9JTkVUNikKKwkgICAgcmV0dXJuICI/IjsKKwlyZXR1cm4gcGpfaW5ldF9udG9wMihhZC0+c2FfZmFtaWx5LCBwal9zb2NrYWRkcl9nZXRfYWRkcihhZCksIAorCQkJICAgICB0eHQsIHNpemVvZih0eHQpKTsKKyAgICB9CisjZWxzZQorIyAgIGRlZmluZSBUUkFDRV8oZXhwKQorI2VuZGlmCisKKworI2lmIDAKKyAgICAvKiBkdW1teSAqLworCisjZWxpZiBkZWZpbmVkKFBKX0hBU19JRkFERFJTX0gpICYmIFBKX0hBU19JRkFERFJTX0ggIT0gMCAmJiBcCisgICAgICBkZWZpbmVkKFBKX0hBU19ORVRfSUZfSCkgJiYgUEpfSEFTX05FVF9JRl9IICE9IDAKKy8qIFVzaW5nIGdldGlmYWRkcnMoKSBpcyBwcmVmZXJyZWQgc2luY2UgaXQgY2FuIHdvcmsgd2l0aCBib3RoIElQdjQgYW5kIElQdjYgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBpZl9lbnVtX2J5X2FmKGludCBhZiwKKwkJCQkgdW5zaWduZWQgKnBfY250LAorCQkJCSBwal9zb2NrYWRkciBpZnNbXSkKK3sKKyAgICBzdHJ1Y3QgaWZhZGRycyAqaWZhcCA9IE5VTEwsICppdDsKKyAgICB1bnNpZ25lZCBtYXg7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFmPT1QSl9BRl9JTkVUIHx8IGFmPT1QSl9BRl9JTkVUNiwgUEpfRUlOVkFMKTsKKyAgICAKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgIlN0YXJ0aW5nIGludGVyZmFjZSBlbnVtIHdpdGggZ2V0aWZhZGRycygpIGZvciBhZj0lZCIsCisJICAgIGFmKSk7CisKKyAgICBpZiAoZ2V0aWZhZGRycygmaWZhcCkgIT0gMCkgeworCVRSQUNFXygoVEhJU19GSUxFLCAiIGdldGlmYXJyZHMoKSBmYWlsZWQ6ICVzIiwgZ2V0X29zX2Vycm1zZygpKSk7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmV0b3NfZXJyb3IoKSk7CisgICAgfQorCisgICAgaXQgPSBpZmFwOworICAgIG1heCA9ICpwX2NudDsKKyAgICAqcF9jbnQgPSAwOworICAgIGZvciAoOyBpdCE9TlVMTCAmJiAqcF9jbnQgPCBtYXg7IGl0ID0gaXQtPmlmYV9uZXh0KSB7CisJc3RydWN0IHNvY2thZGRyICphZCA9IGl0LT5pZmFfYWRkcjsKKworCVRSQUNFXygoVEhJU19GSUxFLCAiIGNoZWNraW5nICVzIiwgaXQtPmlmYV9uYW1lKSk7CisKKwlpZiAoKGl0LT5pZmFfZmxhZ3MgJiBJRkZfVVApPT0wKSB7CisJICAgIFRSQUNFXygoVEhJU19GSUxFLCAiICBpbnRlcmZhY2UgaXMgZG93biIpKTsKKwkgICAgY29udGludWU7IC8qIFNraXAgd2hlbiBpbnRlcmZhY2UgaXMgZG93biAqLworCX0KKworI2lmIFBKX0lQX0hFTFBFUl9JR05PUkVfTE9PUEJBQ0tfSUYKKwlpZiAoaXQtPmlmYV9mbGFncyAmIElGRl9MT09QQkFDSykgeworCSAgICBUUkFDRV8oKFRISVNfRklMRSwgIiAgbG9vcGJhY2sgaW50ZXJmYWNlIikpOworCSAgICBjb250aW51ZTsgLyogU2tpcCBsb29wYmFjayBpbnRlcmZhY2UgKi8KKwl9CisjZW5kaWYKKworCWlmIChhZD09TlVMTCkgeworCSAgICBUUkFDRV8oKFRISVNfRklMRSwgIiAgTlVMTCBhZGRyZXNzIGlnbm9yZWQiKSk7CisJICAgIGNvbnRpbnVlOyAvKiByZXBvcnRlZCB0byBoYXBwZW4gb24gTGludXggMi42LjI1LjkgCisJCQkgd2l0aCBwcHAgaW50ZXJmYWNlICovCisJfQorCisJaWYgKGFkLT5zYV9mYW1pbHkgIT0gYWYpIHsKKwkgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIgIGFkZHJlc3MgJXMgaWdub3JlZCAoYWY9JWQpIiwgCisJCSAgICBnZXRfYWRkcihhZCksIGFkLT5zYV9mYW1pbHkpKTsKKwkgICAgY29udGludWU7IC8qIFNraXAgd2hlbiBpbnRlcmZhY2UgaXMgZG93biAqLworCX0KKworCS8qIElnbm9yZSAwLjAuMC4wLzggYWRkcmVzcy4gVGhpcyBpcyBhIHNwZWNpYWwgYWRkcmVzcworCSAqIHdoaWNoIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIHByYWN0aWNhbCB1c2UuCisJICovCisJaWYgKGFmPT1wal9BRl9JTkVUKCkgJiYKKwkgICAgKHBqX250b2hsKCgocGpfc29ja2FkZHJfaW4qKWFkKS0+c2luX2FkZHIuc19hZGRyKSA+PiAyNCkgPT0gMCkKKwl7CisJICAgIFRSQUNFXygoVEhJU19GSUxFLCAiICBhZGRyZXNzICVzIGlnbm9yZWQgKDAuMC4wLjAvOCBjbGFzcykiLCAKKwkJICAgIGdldF9hZGRyKGFkKSwgYWQtPnNhX2ZhbWlseSkpOworCSAgICBjb250aW51ZTsKKwl9CisKKwlUUkFDRV8oKFRISVNfRklMRSwgIiAgYWRkcmVzcyAlcyAoYWY9JWQpIGFkZGVkIGF0IGluZGV4ICVkIiwgCisJCWdldF9hZGRyKGFkKSwgYWQtPnNhX2ZhbWlseSwgKnBfY250KSk7CisKKwlwal9iemVybygmaWZzWypwX2NudF0sIHNpemVvZihpZnNbMF0pKTsKKwlwal9tZW1jcHkoJmlmc1sqcF9jbnRdLCBhZCwgcGpfc29ja2FkZHJfZ2V0X2xlbihhZCkpOworCVBKX1NPQ0tBRERSX1JFU0VUX0xFTigmaWZzWypwX2NudF0pOworCSgqcF9jbnQpKys7CisgICAgfQorCisgICAgZnJlZWlmYWRkcnMoaWZhcCk7CisgICAgVFJBQ0VfKChUSElTX0ZJTEUsICJkb25lLCBmb3VuZCAlZCBhZGRyZXNzKGVzKSIsICpwX2NudCkpOworICAgIHJldHVybiAoKnBfY250ICE9IDApID8gUEpfU1VDQ0VTUyA6IFBKX0VOT1RGT1VORDsKK30KKworI2VsaWYgZGVmaW5lZChTSU9DR0lGQ09ORikgJiYgXAorICAgICAgZGVmaW5lZChQSl9IQVNfTkVUX0lGX0gpICYmIFBKX0hBU19ORVRfSUZfSCAhPSAwCisKKy8qIE5vdGU6IHRoaXMgZG9lcyBub3Qgd29yayB3aXRoIElQdjYgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBpZl9lbnVtX2J5X2FmKGludCBhZiwKKwkJCQkgdW5zaWduZWQgKnBfY250LAorCQkJCSBwal9zb2NrYWRkciBpZnNbXSkKK3sKKyAgICBwal9zb2NrX3Qgc29jazsKKyAgICBjaGFyIGJ1Zls1MTJdOworICAgIHN0cnVjdCBpZmNvbmYgaWZjOworICAgIHN0cnVjdCBpZnJlcSAqaWZyOworICAgIGludCBpLCBjb3VudDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFmPT1QSl9BRl9JTkVUIHx8IGFmPT1QSl9BRl9JTkVUNiwgUEpfRUlOVkFMKTsKKyAgICAKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgIlN0YXJ0aW5nIGludGVyZmFjZSBlbnVtIHdpdGggU0lPQ0dJRkNPTkYgZm9yIGFmPSVkIiwKKwkgICAgYWYpKTsKKworICAgIHN0YXR1cyA9IHBqX3NvY2tfc29ja2V0KGFmLCBQSl9TT0NLX0RHUkFNLCAwLCAmc29jayk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICAvKiBRdWVyeSBhdmFpbGFibGUgaW50ZXJmYWNlcyAqLworICAgIGlmYy5pZmNfbGVuID0gc2l6ZW9mKGJ1Zik7CisgICAgaWZjLmlmY19idWYgPSBidWY7CisKKyAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkNPTkYsICZpZmMpIDwgMCkgeworCWludCBvc2VyciA9IHBqX2dldF9uZXRvc19lcnJvcigpOworCVRSQUNFXygoVEhJU19GSUxFLCAiIGlvY3RsKFNJT0NHSUZDT05GKSBmYWlsZWQ6ICVzIiwgZ2V0X29zX2Vycm1zZygpKSk7CisJcGpfc29ja19jbG9zZShzb2NrKTsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKG9zZXJyKTsKKyAgICB9CisKKyAgICAvKiBJbnRlcmZhY2UgaW50ZXJmYWNlcyAqLworICAgIGlmciA9IChzdHJ1Y3QgaWZyZXEqKSBpZmMuaWZjX3JlcTsKKyAgICBjb3VudCA9IGlmYy5pZmNfbGVuIC8gc2l6ZW9mKHN0cnVjdCBpZnJlcSk7CisgICAgaWYgKGNvdW50ID4gKnBfY250KQorCWNvdW50ID0gKnBfY250OworCisgICAgKnBfY250ID0gMDsKKyAgICBmb3IgKGk9MDsgaTxjb3VudDsgKytpKSB7CisJc3RydWN0IGlmcmVxICppdGYgPSAmaWZyW2ldOworICAgICAgICBzdHJ1Y3QgaWZyZXEgaWZmID0gKml0ZjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkID0gJml0Zi0+aWZyX2FkZHI7CisJCisJVFJBQ0VfKChUSElTX0ZJTEUsICIgY2hlY2tpbmcgaW50ZXJmYWNlICVzIiwgaXRmLT5pZnJfbmFtZSkpOworCisJLyogU2tpcCBhZGRyZXNzIHdpdGggZGlmZmVyZW50IGZhbWlseSAqLworCWlmIChhZC0+c2FfZmFtaWx5ICE9IGFmKSB7CisJICAgIFRSQUNFXygoVEhJU19GSUxFLCAiICBhZGRyZXNzICVzIChhZj0lZCkgaWdub3JlZCIsCisJCSAgICBnZXRfYWRkcihhZCksIChpbnQpYWQtPnNhX2ZhbWlseSkpOworCSAgICBjb250aW51ZTsKKwl9CisKKyAgICAgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZGTEFHUywgJmlmZikgIT0gMCkgeworCSAgICBUUkFDRV8oKFRISVNfRklMRSwgIiAgaW9jdGwoU0lPQ0dJRkZMQUdTKSBmYWlsZWQ6ICVzIiwKKwkJICAgIGdldF9vc19lcnJtc2coKSkpOworCSAgICBjb250aW51ZTsJLyogRmFpbGVkIHRvIGdldCBmbGFncywgY29udGludWUgKi8KKwl9CisKKwlpZiAoKGlmZi5pZnJfZmxhZ3MgJiBJRkZfVVApPT0wKSB7CisJICAgIFRSQUNFXygoVEhJU19GSUxFLCAiICBpbnRlcmZhY2UgaXMgZG93biIpKTsKKwkgICAgY29udGludWU7IC8qIFNraXAgd2hlbiBpbnRlcmZhY2UgaXMgZG93biAqLworCX0KKworI2lmIFBKX0lQX0hFTFBFUl9JR05PUkVfTE9PUEJBQ0tfSUYKKwlpZiAoaWZmLmlmcl9mbGFncyAmIElGRl9MT09QQkFDSykgeworCSAgICBUUkFDRV8oKFRISVNfRklMRSwgIiAgbG9vcGJhY2sgaW50ZXJmYWNlIikpOworCSAgICBjb250aW51ZTsgLyogU2tpcCBsb29wYmFjayBpbnRlcmZhY2UgKi8KKwl9CisjZW5kaWYKKworCS8qIElnbm9yZSAwLjAuMC4wLzggYWRkcmVzcy4gVGhpcyBpcyBhIHNwZWNpYWwgYWRkcmVzcworCSAqIHdoaWNoIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIHByYWN0aWNhbCB1c2UuCisJICovCisJaWYgKGFmPT1wal9BRl9JTkVUKCkgJiYKKwkgICAgKHBqX250b2hsKCgocGpfc29ja2FkZHJfaW4qKWFkKS0+c2luX2FkZHIuc19hZGRyKSA+PiAyNCkgPT0gMCkKKwl7CisJICAgIFRSQUNFXygoVEhJU19GSUxFLCAiICBhZGRyZXNzICVzIGlnbm9yZWQgKDAuMC4wLjAvOCBjbGFzcykiLCAKKwkJICAgIGdldF9hZGRyKGFkKSwgYWQtPnNhX2ZhbWlseSkpOworCSAgICBjb250aW51ZTsKKwl9CisKKwlUUkFDRV8oKFRISVNfRklMRSwgIiAgYWRkcmVzcyAlcyAoYWY9JWQpIGFkZGVkIGF0IGluZGV4ICVkIiwgCisJCWdldF9hZGRyKGFkKSwgYWQtPnNhX2ZhbWlseSwgKnBfY250KSk7CisKKwlwal9iemVybygmaWZzWypwX2NudF0sIHNpemVvZihpZnNbMF0pKTsKKwlwal9tZW1jcHkoJmlmc1sqcF9jbnRdLCBhZCwgcGpfc29ja2FkZHJfZ2V0X2xlbihhZCkpOworCVBKX1NPQ0tBRERSX1JFU0VUX0xFTigmaWZzWypwX2NudF0pOworCSgqcF9jbnQpKys7CisgICAgfQorCisgICAgLyogRG9uZSB3aXRoIHNvY2tldCAqLworICAgIHBqX3NvY2tfY2xvc2Uoc29jayk7CisKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgImRvbmUsIGZvdW5kICVkIGFkZHJlc3MoZXMpIiwgKnBfY250KSk7CisgICAgcmV0dXJuICgqcF9jbnQgIT0gMCkgPyBQSl9TVUNDRVNTIDogUEpfRU5PVEZPVU5EOworfQorCisKKyNlbGlmIGRlZmluZWQoUEpfSEFTX05FVF9JRl9IKSAmJiBQSl9IQVNfTkVUX0lGX0ggIT0gMAorLyogTm90ZTogdGhpcyBkb2VzIG5vdCB3b3JrIHdpdGggSVB2NiAqLworc3RhdGljIHBqX3N0YXR1c190IGlmX2VudW1fYnlfYWYoaW50IGFmLCB1bnNpZ25lZCAqcF9jbnQsIHBqX3NvY2thZGRyIGlmc1tdKQoreworICAgIHN0cnVjdCBpZl9uYW1laW5kZXggKmlmX2xpc3Q7CisgICAgc3RydWN0IGlmcmVxIGlmcmVxOworICAgIHBqX3NvY2tfdCBzb2NrOworICAgIHVuc2lnbmVkIGksIG1heF9jb3VudDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFmPT1QSl9BRl9JTkVUIHx8IGFmPT1QSl9BRl9JTkVUNiwgUEpfRUlOVkFMKTsKKworICAgIFRSQUNFXygoVEhJU19GSUxFLCAiU3RhcnRpbmcgaWZfbmFtZWluZGV4KCkgZm9yIGFmPSVkIiwgYWYpKTsKKworICAgIHN0YXR1cyA9IHBqX3NvY2tfc29ja2V0KGFmLCBQSl9TT0NLX0RHUkFNLCAwLCAmc29jayk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICBpZl9saXN0ID0gaWZfbmFtZWluZGV4KCk7CisgICAgaWYgKGlmX2xpc3QgPT0gTlVMTCkKKwlyZXR1cm4gUEpfRU5PVEZPVU5EOworCisgICAgbWF4X2NvdW50ID0gKnBfY250OworICAgICpwX2NudCA9IDA7CisgICAgZm9yIChpPTA7IGlmX2xpc3RbaV0uaWZfaW5kZXggJiYgKnBfY250PG1heF9jb3VudDsgKytpKSB7CisJc3RydWN0IHNvY2thZGRyICphZDsKKwlpbnQgcmM7CisKKwlzdHJuY3B5KGlmcmVxLmlmcl9uYW1lLCBpZl9saXN0W2ldLmlmX25hbWUsIElGTkFNU0laKTsKKworCVRSQUNFXygoVEhJU19GSUxFLCAiIGNoZWNraW5nIGludGVyZmFjZSAlcyIsIGlmcmVxLmlmcl9uYW1lKSk7CisKKwlpZiAoKHJjPWlvY3RsKHNvY2ssIFNJT0NHSUZGTEFHUywgJmlmcmVxKSkgIT0gMCkgeworCSAgICBUUkFDRV8oKFRISVNfRklMRSwgIiAgaW9jdGwoU0lPQ0dJRkZMQUdTKSBmYWlsZWQ6ICVzIiwKKwkJICAgIGdldF9vc19lcnJtc2coKSkpOworCSAgICBjb250aW51ZTsJLyogRmFpbGVkIHRvIGdldCBmbGFncywgY29udGludWUgKi8KKwl9CisKKwlpZiAoKGlmcmVxLmlmcl9mbGFncyAmIElGRl9VUCk9PTApIHsKKwkgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIgIGludGVyZmFjZSBpcyBkb3duIikpOworCSAgICBjb250aW51ZTsgLyogU2tpcCB3aGVuIGludGVyZmFjZSBpcyBkb3duICovCisJfQorCisjaWYgUEpfSVBfSEVMUEVSX0lHTk9SRV9MT09QQkFDS19JRgorCWlmIChpZnJlcS5pZnJfZmxhZ3MgJiBJRkZfTE9PUEJBQ0spIHsKKwkgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIgIGxvb3BiYWNrIGludGVyZmFjZSIpKTsKKwkgICAgY29udGludWU7IC8qIFNraXAgbG9vcGJhY2sgaW50ZXJmYWNlICovCisJfQorI2VuZGlmCisKKwkvKiBOb3RlOiBTSU9DR0lGQUREUiBkb2VzIG5vdCB3b3JrIGZvciBJUHY2ISAqLworCWlmICgocmM9aW9jdGwoc29jaywgU0lPQ0dJRkFERFIsICZpZnJlcSkpICE9IDApIHsKKwkgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIgIGlvY3RsKFNJT0NHSUZBRERSKSBmYWlsZWQ6ICVzIiwKKwkJICAgIGdldF9vc19lcnJtc2coKSkpOworCSAgICBjb250aW51ZTsJLyogRmFpbGVkIHRvIGdldCBhZGRyZXNzLCBjb250aW51ZSAqLworCX0KKworCWFkID0gKHN0cnVjdCBzb2NrYWRkciopICZpZnJlcS5pZnJfYWRkcjsKKworCWlmIChhZC0+c2FfZmFtaWx5ICE9IGFmKSB7CisJICAgIFRSQUNFXygoVEhJU19GSUxFLCAiICBhZGRyZXNzICVzIGZhbWlseSAlZCBpZ25vcmVkIiwgCisJCQkgICAgICAgZ2V0X2FkZHIoJmlmcmVxLmlmcl9hZGRyKSwKKwkJCSAgICAgICBpZnJlcS5pZnJfYWRkci5zYV9mYW1pbHkpKTsKKwkgICAgY29udGludWU7CS8qIE5vdCBhZGRyZXNzIGZhbWlseSB0aGF0IHdlIHdhbnQsIGNvbnRpbnVlICovCisJfQorCisJLyogSWdub3JlIDAuMC4wLjAvOCBhZGRyZXNzLiBUaGlzIGlzIGEgc3BlY2lhbCBhZGRyZXNzCisJICogd2hpY2ggZG9lc24ndCBzZWVtIHRvIGhhdmUgcHJhY3RpY2FsIHVzZS4KKwkgKi8KKwlpZiAoYWY9PXBqX0FGX0lORVQoKSAmJgorCSAgICAocGpfbnRvaGwoKChwal9zb2NrYWRkcl9pbiopYWQpLT5zaW5fYWRkci5zX2FkZHIpID4+IDI0KSA9PSAwKQorCXsKKwkgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIgIGFkZHJlc3MgJXMgaWdub3JlZCAoMC4wLjAuMC84IGNsYXNzKSIsIAorCQkgICAgZ2V0X2FkZHIoYWQpLCBhZC0+c2FfZmFtaWx5KSk7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qIEdvdCBhbiBhZGRyZXNzICEgKi8KKwlUUkFDRV8oKFRISVNfRklMRSwgIiAgYWRkcmVzcyAlcyAoYWY9JWQpIGFkZGVkIGF0IGluZGV4ICVkIiwgCisJCWdldF9hZGRyKGFkKSwgYWQtPnNhX2ZhbWlseSwgKnBfY250KSk7CisKKwlwal9iemVybygmaWZzWypwX2NudF0sIHNpemVvZihpZnNbMF0pKTsKKwlwal9tZW1jcHkoJmlmc1sqcF9jbnRdLCBhZCwgcGpfc29ja2FkZHJfZ2V0X2xlbihhZCkpOworCVBKX1NPQ0tBRERSX1JFU0VUX0xFTigmaWZzWypwX2NudF0pOworCSgqcF9jbnQpKys7CisgICAgfQorCisgICAgaWZfZnJlZW5hbWVpbmRleChpZl9saXN0KTsKKyAgICBwal9zb2NrX2Nsb3NlKHNvY2spOworCisgICAgVFJBQ0VfKChUSElTX0ZJTEUsICJkb25lLCBmb3VuZCAlZCBhZGRyZXNzKGVzKSIsICpwX2NudCkpOworICAgIHJldHVybiAoKnBfY250ICE9IDApID8gUEpfU1VDQ0VTUyA6IFBKX0VOT1RGT1VORDsKK30KKworI2Vsc2UKK3N0YXRpYyBwal9zdGF0dXNfdCBpZl9lbnVtX2J5X2FmKGludCBhZiwKKwkJCQkgdW5zaWduZWQgKnBfY250LAorCQkJCSBwal9zb2NrYWRkciBpZnNbXSkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBfY250ICYmICpwX2NudCA+IDAgJiYgaWZzLCBQSl9FSU5WQUwpOworCisgICAgcGpfYnplcm8oaWZzLCBzaXplb2YoaWZzWzBdKSAqICgqcF9jbnQpKTsKKworICAgIC8qIEp1c3QgZ2V0IG9uZSBkZWZhdWx0IHJvdXRlICovCisgICAgc3RhdHVzID0gcGpfZ2V0ZGVmYXVsdGlwaW50ZXJmYWNlKGFmLCAmaWZzWzBdKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgICpwX2NudCA9IDE7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisjZW5kaWYgLyogU0lPQ0dJRkNPTkYgKi8KKworLyoKKyAqIEVudW1lcmF0ZSB0aGUgbG9jYWwgSVAgaW50ZXJmYWNlIGN1cnJlbnRseSBhY3RpdmUgaW4gdGhlIGhvc3QuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZW51bV9pcF9pbnRlcmZhY2UoaW50IGFmLAorCQkJCQkgdW5zaWduZWQgKnBfY250LAorCQkJCQkgcGpfc29ja2FkZHIgaWZzW10pCit7CisgICAgdW5zaWduZWQgc3RhcnQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhcnQgPSAwOworICAgIGlmIChhZj09UEpfQUZfSU5FVDYgfHwgYWY9PVBKX0FGX1VOU1BFQykgeworCXVuc2lnbmVkIG1heCA9ICpwX2NudDsKKwlzdGF0dXMgPSBpZl9lbnVtX2J5X2FmKFBKX0FGX0lORVQ2LCAmbWF4LCAmaWZzW3N0YXJ0XSk7CisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJICAgIHN0YXJ0ICs9IG1heDsKKwkgICAgKCpwX2NudCkgLT0gbWF4OworCX0KKyAgICB9CisKKyAgICBpZiAoYWY9PVBKX0FGX0lORVQgfHwgYWY9PVBKX0FGX1VOU1BFQykgeworCXVuc2lnbmVkIG1heCA9ICpwX2NudDsKKwlzdGF0dXMgPSBpZl9lbnVtX2J5X2FmKFBKX0FGX0lORVQsICZtYXgsICZpZnNbc3RhcnRdKTsKKwlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwkgICAgc3RhcnQgKz0gbWF4OworCSAgICAoKnBfY250KSAtPSBtYXg7CisJfQorICAgIH0KKworICAgICpwX2NudCA9IHN0YXJ0OworCisgICAgcmV0dXJuICgqcF9jbnQgIT0gMCkgPyBQSl9TVUNDRVNTIDogUEpfRU5PVEZPVU5EOworfQorCisvKgorICogRW51bWVyYXRlIHRoZSBJUCByb3V0aW5nIHRhYmxlIGZvciB0aGlzIGhvc3QuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZW51bV9pcF9yb3V0ZSh1bnNpZ25lZCAqcF9jbnQsCisJCQkJICAgICBwal9pcF9yb3V0ZV9lbnRyeSByb3V0ZXNbXSkKK3sKKyAgICBwal9zb2NrYWRkciBpdGY7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihwX2NudCAmJiAqcF9jbnQgPiAwICYmIHJvdXRlcywgUEpfRUlOVkFMKTsKKworICAgIHBqX2J6ZXJvKHJvdXRlcywgc2l6ZW9mKHJvdXRlc1swXSkgKiAoKnBfY250KSk7CisKKyAgICAvKiBKdXN0IGdldCBvbmUgZGVmYXVsdCByb3V0ZSAqLworICAgIHN0YXR1cyA9IHBqX2dldGRlZmF1bHRpcGludGVyZmFjZShQSl9BRl9JTkVULCAmaXRmKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKyAgICAKKyAgICByb3V0ZXNbMF0uaXB2NC5pZl9hZGRyLnNfYWRkciA9IGl0Zi5pcHY0LnNpbl9hZGRyLnNfYWRkcjsKKyAgICByb3V0ZXNbMF0uaXB2NC5kc3RfYWRkci5zX2FkZHIgPSAwOworICAgIHJvdXRlc1swXS5pcHY0Lm1hc2suc19hZGRyID0gMDsKKyAgICAqcF9jbnQgPSAxOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaXBfaGVscGVyX3N5bWJpYW4uY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pcF9oZWxwZXJfc3ltYmlhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3NTFhZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaXBfaGVscGVyX3N5bWJpYW4uY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKiAkSWQ6IGlwX2hlbHBlcl9zeW1iaWFuLmNwcCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2lwX2hlbHBlci5oPgorI2luY2x1ZGUgPHBqL2FkZHJfcmVzb2x2Lmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc29ja2V0Lmg+CisKKworI2luY2x1ZGUgIm9zX3N5bWJpYW4uaCIKKworI2RlZmluZSBUSElTX0ZJTEUJImlwX2hlbHBlcl9zeW1iaWFuLmNwcCIKKyNkZWZpbmUgVFJBQ0VfTUUJMAorCitzdGF0aWMgcGpfc3RhdHVzX3QgcnNvY2tfZW51bV9pbnRlcmZhY2UoaW50IGFmLAorCQkJCQl1bnNpZ25lZCAqcF9jbnQsCisJCQkJCXBqX3NvY2thZGRyIGlmc1tdKSAKK3sKKyAgICBUSW50IHJjOworICAgIFJTb2NrZXQgclNvY2s7CisgICAgVFBja2dCdWY8VFNvSW5ldEludGVyZmFjZUluZm8+IGluZm87CisgICAgdW5zaWduZWQgaTsKKyAgICAKKyAgICBpZiAoUGpTeW1iaWFuT1M6Okluc3RhbmNlKCktPkNvbm5lY3Rpb24oKSkgeworICAgIAkKKyAgICAJcmMgPSByU29jay5PcGVuKFBqU3ltYmlhbk9TOjpJbnN0YW5jZSgpLT5Tb2NrZXRTZXJ2KCksIAorICAgIAkJCWFmLCBQSl9TT0NLX0RHUkFNLCBLUHJvdG9jb2xJbmV0VWRwLAorICAgIAkJCSpQalN5bWJpYW5PUzo6SW5zdGFuY2UoKS0+Q29ubmVjdGlvbigpKTsKKyAgICB9IGVsc2UgeworICAgIAkKKyAgICAJcmMgPSByU29jay5PcGVuKFBqU3ltYmlhbk9TOjpJbnN0YW5jZSgpLT5Tb2NrZXRTZXJ2KCksIAorICAgIAkJCWFmLCBQSl9TT0NLX0RHUkFNLCBLUHJvdG9jb2xJbmV0VWRwKTsKKyAgICAJCQkKKyAgICB9CisgICAgICAgIAorICAgIGlmIChyYyAhPSBLRXJyTm9uZSkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHJjKTsKKyAgICAKKyAgICByU29jay5TZXRPcHQoS1NvSW5ldEVudW1JbnRlcmZhY2VzLCBLU29sSW5ldElmQ3RybCk7CisgICAgCisgICAgZm9yIChpPTA7IGk8KnBfY250ICYmCisgICAgCQlyU29jay5HZXRPcHQoS1NvSW5ldE5leHRJbnRlcmZhY2UsIEtTb2xJbmV0SWZDdHJsLCAKKyAgICAJCSAgICAgICAgICAgICBpbmZvKSA9PSBLRXJyTm9uZTsgKSAKKyAgICB7CisgICAgCVRJbmV0QWRkciAmaUFkZHJlc3MgPSBpbmZvKCkuaUFkZHJlc3M7CisgICAgCWludCBuYW1lbGVuOworCisjaWYgVFJBQ0VfTUUKKwkJaWYgKDEpIHsKKwkJCXBqX3NvY2thZGRyIGE7CisJCQljaGFyIGlwYWRkcltQSl9JTkVUNl9BRERSU1RSTEVOKzJdOworCQkJCisJCQluYW1lbGVuID0gc2l6ZW9mKHBqX3NvY2thZGRyKTsKKwkJCWlmIChQalN5bWJpYW5PUzo6QWRkcjJwaihpQWRkcmVzcywgYSwgJm5hbWVsZW4sIAorCQkJCQkJCQkJIFBKX0ZBTFNFKSA9PSBQSl9TVUNDRVNTKSAKKwkJCXsKKwkJCQlQSl9MT0coNSwoVEhJU19GSUxFLCAiRW51bTogZm91bmQgYWRkcmVzcyAlcyIsIAorCQkJCQkJcGpfc29ja2FkZHJfcHJpbnQoJmEsIGlwYWRkciwgc2l6ZW9mKGlwYWRkciksIDIpKSk7CisJCQl9CisJCX0KKyNlbmRpZgorICAgIAkKKyAgICAJbmFtZWxlbiA9IHNpemVvZihpZnNbaV0pOworICAgIAlpZiAoUGpTeW1iaWFuT1M6OkFkZHIycGooaUFkZHJlc3MsIGlmc1tpXSwgJm5hbWVsZW4sIAorICAgIAkJCQkJCQkgUEpfVFJVRSkgIT0gUEpfU1VDQ0VTUykKKyAgICAJeworICAgIAkgICAgY29udGludWU7CisgICAgCX0KKworICAgIAlpZiAoaWZzW2ldLmFkZHIuc2FfZmFtaWx5ICE9IGFmKQorCQkgICAgY29udGludWU7CisgICAgCQorICAgIAkrK2k7CisgICAgfQorICAgIAorICAgIHJTb2NrLkNsb3NlKCk7CisgICAgCisgICAgLy8gRG9uZQorICAgICpwX2NudCA9IGk7CisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisJCQkJCQorLyoKKyAqIEVudW1lcmF0ZSB0aGUgbG9jYWwgSVAgaW50ZXJmYWNlIGN1cnJlbnRseSBhY3RpdmUgaW4gdGhlIGhvc3QuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZW51bV9pcF9pbnRlcmZhY2UoaW50IGFmLAorCQkJCQkgdW5zaWduZWQgKnBfY250LAorCQkJCQkgcGpfc29ja2FkZHIgaWZzW10pCit7CisgICAgdW5zaWduZWQgc3RhcnQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworICAgIHN0YXJ0ID0gMDsKKyAgICAJICAgIAorICAgIC8qIEdldCBJUHY2IGludGVyZmFjZSBmaXJzdC4gKi8KKyAgICBpZiAoYWY9PVBKX0FGX0lORVQ2IHx8IGFmPT1QSl9BRl9VTlNQRUMpIHsKKyAgICAJdW5zaWduZWQgbWF4ID0gKnBfY250OworICAgIAlzdGF0dXMgPSByc29ja19lbnVtX2ludGVyZmFjZShQSl9BRl9JTkVUNiwgJm1heCwgJmlmc1tzdGFydF0pOworICAgIAlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKyAgICAJICAgICgqcF9jbnQpIC09IG1heDsKKyAgICAJICAgIHN0YXJ0ICs9IG1heDsKKyAgICAJfQorICAgIH0KKyAgICAKKyAgICAvKiBHZXQgSVB2NCBpbnRlcmZhY2UuICovCisgICAgaWYgKGFmPT1QSl9BRl9JTkVUIHx8IGFmPT1QSl9BRl9VTlNQRUMpIHsKKyAgICAJdW5zaWduZWQgbWF4ID0gKnBfY250OworICAgIAlzdGF0dXMgPSByc29ja19lbnVtX2ludGVyZmFjZShQSl9BRl9JTkVULCAmbWF4LCAmaWZzW3N0YXJ0XSk7CisgICAgCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworICAgIAkgICAgKCpwX2NudCkgLT0gbWF4OworICAgIAkgICAgc3RhcnQgKz0gbWF4OworICAgIAl9CisgICAgfQorICAgIAorICAgICpwX2NudCA9IHN0YXJ0OworICAgIAorICAgIHJldHVybiBzdGFydCA/IFBKX1NVQ0NFU1MgOiBQSl9FTk9URk9VTkQ7Cit9CisKKy8qCisgKiBFbnVtZXJhdGUgdGhlIElQIHJvdXRpbmcgdGFibGUgZm9yIHRoaXMgaG9zdC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9lbnVtX2lwX3JvdXRlKHVuc2lnbmVkICpwX2NudCwKKwkJCQkgICAgIHBqX2lwX3JvdXRlX2VudHJ5IHJvdXRlc1tdKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4ocF9jbnQgJiYgKnBfY250ID4gMCAmJiByb3V0ZXMsIFBKX0VJTlZBTCk7CisgICAgKnBfY250ID0gMDsKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9pcF9oZWxwZXJfd2luMzIuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaXBfaGVscGVyX3dpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyNDYwNgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovaXBfaGVscGVyX3dpbjMyLmMKQEAgLTAsMCArMSw0NDEgQEAKKy8qICRJZDogaXBfaGVscGVyX3dpbjMyLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9jb25maWcuaD4KKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisvKiBQTUlCX0lDTVBfRVggaXMgbm90IGRlY2xhcmVkIGluIFZDNiwgY2F1c2luZyBlcnJvci4KKyAqIEJ1dCBFVkM0LCB3aGljaCBhbHNvIGNsYWltcyB0byBiZSBWQzYsIGRvZXMgaGF2ZSBpdCEgCisgKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUj09MTIwMCAmJiAhZGVmaW5lZChQSl9XSU4zMl9XSU5DRSkKKyMgICBkZWZpbmUgUE1JQl9JQ01QX0VYIHZvaWQqCisjZW5kaWYKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorCisvKiBJZiB5b3UgZW5jb3VudGVyIGVycm9yICJDYW5ub3Qgb3BlbiBpbmNsdWRlIGZpbGU6ICdJcGhscGFwaS5oJyBoZXJlLAorICogeW91IG5lZWQgdG8gaW5zdGFsbCBuZXdlciBQbGF0Zm9ybSBTREsuIFByZXN1bWFibHkgeW91J3JlIHVzaW5nCisgKiBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyA2PworICovCisjaW5jbHVkZSA8SXBobHBhcGkuaD4KKworI2luY2x1ZGUgPHBqL2lwX2hlbHBlci5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisKKy8qIERlYWxpbmcgd2l0aCBVbmljb2RlIHF1aXJrczoKKworIFRoZXJlIHNlZW1zIHRvIGJlIGEgZGlmZmVyZW5jZSB3aXRoIEdldFByb2NBZGRyZXNzKCkgQVBJIHNpZ25hdHVyZSBiZXR3ZWVuCisgV2luZG93cyAoaS5lLiBXaW4zMikgYW5kIFdpbmRvd3MgQ0UgKGUuZy4gV2luZG93cyBNb2JpbGUpLiBPbiBXaW5kb3dzLCB0aGUKKyBBUEkgaXMgZGVjbGFyZWQgYXM6CisKKyAgIEZBUlBST0MgR2V0UHJvY0FkZHJlc3MoCisgICAgIEhNT0RVTEUgaE1vZHVsZSwKKyAgICAgTFBDU1RSIGxwUHJvY05hbWUpOworIAorIHdoaWxlIG9uIFdpbmRvd3MgQ0U6CisKKyAgIEZBUlBST0MgR2V0UHJvY0FkZHJlc3MoCisgICAgIEhNT0RVTEUgaE1vZHVsZSwKKyAgICAgTFBDV1NUUiBscFByb2NOYW1lKTsKKworIE5vdGljZSB0aGUgZGlmZmVyZW5jZSB3aXRoIGxwUHJvY05hbWUgYXJndW1lbnQgdHlwZS4gVGhpcyBtZWFucyB0aGF0IG9uIAorIFdpbmRvd3MsIGV2ZW4gb24gVW5pY29kZSBXaW5kb3dzLCB0aGUgbHBQcm9jTmFtZSBhbHdheXMgdGFrZXMgQU5TSSBmb3JtYXQsIAorIHdoaWxlIG9uIFdpbmRvd3MgQ0UsIHRoZSBhcmd1bWVudCBmb2xsb3dzIHRoZSBVTklDT0RFIHNldHRpbmcuCisKKyBCZWNhdXNlIG9mIHRoaXMsIHdlIHVzZSBhIGRpZmZlcmVudCBVbmljb2RlIHRyZWF0bWVudCBoZXJlIHRoYW4gdGhlIHVzdWFsCisgUEpfTkFUSVZFX1NUUklOR19JU19VTklDT0RFIFBKTElCIHNldHRpbmcgKDxwai91bmljb2RlLmg+KToKKyAgIC0gR1BBX1RFWFQgbWFjcm86IGNvbnZlcnQgbGl0ZXJhbCBzdHJpbmcgdG8gcGxhdGZvcm0ncyBuYXRpdmUgbGl0ZXJhbCAKKyAgICAgICAgIHN0cmluZworICAgLSBncGFfY2hhcjogdGhlIHBsYXRmb3JtIG5hdGl2ZSBjaGFyYWN0ZXIgdHlwZQorCisgTm90ZSB0aGF0ICJHUEEiIGFuZCAiZ3BhIiBhcmUgYWJicmV2aWF0aW9ucyBmb3IgR2V0UHJvY0FkZHJlc3MuCisqLworI2lmIGRlZmluZWQoUEpfV0lOMzJfV0lOQ0UpICYmIFBKX1dJTjMyX1dJTkNFIT0wCisgICAgLyogb24gQ0UsIGZvbGxvdyB0aGUgUEpMSUIgVW5pY29kZSBzZXR0aW5nICovCisjICAgZGVmaW5lIEdQQV9URVhUKHgpCVBKX1QoeCkKKyMgICBkZWZpbmUgZ3BhX2NoYXIJcGpfY2hhcl90CisjZWxzZQorICAgIC8qIG9uIG5vbi1DRSwgYWx3YXlzIHVzZSBBTlNJIGZvcm1hdCAqLworIyAgIGRlZmluZSBHUEFfVEVYVCh4KQl4CisjICAgZGVmaW5lIGdwYV9jaGFyCWNoYXIKKyNlbmRpZgorCisKK3R5cGVkZWYgRFdPUkQgKFdJTkFQSSAqUEZOX0dldElwQWRkclRhYmxlKShQTUlCX0lQQUREUlRBQkxFIHBJcEFkZHJUYWJsZSwgCisJCQkJCSAgIFBVTE9ORyBwZHdTaXplLCAKKwkJCQkJICAgQk9PTCBiT3JkZXIpOwordHlwZWRlZiBEV09SRCAoV0lOQVBJICpQRk5fR2V0QWRhcHRlckFkZHJlc3NlcykoVUxPTkcgRmFtaWx5LAorCQkJCQkgICAgICAgIFVMT05HIEZsYWdzLAorCQkJCQkgICAgICAgIFBWT0lEIFJlc2VydmVkLAorCQkJCQkgICAgICAgIFBJUF9BREFQVEVSX0FERFJFU1NFUyBBZGFwdGVyQWRkcmVzc2VzLAorCQkJCQkgICAgICAgIFBVTE9ORyBTaXplUG9pbnRlcik7Cit0eXBlZGVmIERXT1JEIChXSU5BUEkgKlBGTl9HZXRJcEZvcndhcmRUYWJsZSkoUE1JQl9JUEZPUldBUkRUQUJMRSBwSXBGb3J3YXJkVGFibGUsCisJCQkJCSAgICAgIFBVTE9ORyBwZHdTaXplLCAKKwkJCQkJICAgICAgQk9PTCBiT3JkZXIpOwordHlwZWRlZiBEV09SRCAoV0lOQVBJICpQRk5fR2V0SWZFbnRyeSkoUE1JQl9JRlJPVyBwSWZSb3cpOworCitzdGF0aWMgSEFORExFIHNfaERMTDsKK3N0YXRpYyBQRk5fR2V0SXBBZGRyVGFibGUgc19wZm5HZXRJcEFkZHJUYWJsZTsKK3N0YXRpYyBQRk5fR2V0QWRhcHRlckFkZHJlc3NlcyBzX3BmbkdldEFkYXB0ZXJBZGRyZXNzZXM7CitzdGF0aWMgUEZOX0dldElwRm9yd2FyZFRhYmxlIHNfcGZuR2V0SXBGb3J3YXJkVGFibGU7CitzdGF0aWMgUEZOX0dldElmRW50cnkgc19wZm5HZXRJZkVudHJ5OworCisKK3N0YXRpYyB2b2lkIHVubG9hZF9pcGhscF9tb2R1bGUodm9pZCkKK3sKKyAgICBGcmVlTGlicmFyeShzX2hETEwpOworICAgIHNfaERMTCA9IE5VTEw7CisgICAgc19wZm5HZXRJcEFkZHJUYWJsZSA9IE5VTEw7CisgICAgc19wZm5HZXRJcEZvcndhcmRUYWJsZSA9IE5VTEw7CisgICAgc19wZm5HZXRJZkVudHJ5ID0gTlVMTDsKKyAgICBzX3BmbkdldEFkYXB0ZXJBZGRyZXNzZXMgPSBOVUxMOworfQorCitzdGF0aWMgRkFSUFJPQyBHZXRJcEhscEFwaVByb2MoZ3BhX2NoYXIgKmxwUHJvY05hbWUpCit7CisgICAgaWYoTlVMTCA9PSBzX2hETEwpIHsKKwlzX2hETEwgPSBMb2FkTGlicmFyeShQSl9UKCJJcEhscEFwaSIpKTsKKwlpZihOVUxMICE9IHNfaERMTCkgeworCSAgICBwal9hdGV4aXQoJnVubG9hZF9pcGhscF9tb2R1bGUpOworCX0KKyAgICB9CisJCisgICAgaWYoTlVMTCAhPSBzX2hETEwpCisJcmV0dXJuIEdldFByb2NBZGRyZXNzKHNfaERMTCwgbHBQcm9jTmFtZSk7CisgICAgCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBEV09SRCBNeUdldElwQWRkclRhYmxlKFBNSUJfSVBBRERSVEFCTEUgcElwQWRkclRhYmxlLCAKKwkJCSAgICAgIFBVTE9ORyBwZHdTaXplLCAKKwkJCSAgICAgIEJPT0wgYk9yZGVyKQoreworICAgIGlmKE5VTEwgPT0gc19wZm5HZXRJcEFkZHJUYWJsZSkgeworCXNfcGZuR2V0SXBBZGRyVGFibGUgPSAoUEZOX0dldElwQWRkclRhYmxlKSAKKwkgICAgR2V0SXBIbHBBcGlQcm9jKEdQQV9URVhUKCJHZXRJcEFkZHJUYWJsZSIpKTsKKyAgICB9CisgICAgCisgICAgaWYoTlVMTCAhPSBzX3BmbkdldElwQWRkclRhYmxlKSB7CisJcmV0dXJuIHNfcGZuR2V0SXBBZGRyVGFibGUocElwQWRkclRhYmxlLCBwZHdTaXplLCBiT3JkZXIpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gRVJST1JfTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIERXT1JEIE15R2V0QWRhcHRlckFkZHJlc3NlcyhVTE9ORyBGYW1pbHksCisJCQkJICAgVUxPTkcgRmxhZ3MsCisJCQkJICAgUFZPSUQgUmVzZXJ2ZWQsCisJCQkJICAgUElQX0FEQVBURVJfQUREUkVTU0VTIEFkYXB0ZXJBZGRyZXNzZXMsCisJCQkJICAgUFVMT05HIFNpemVQb2ludGVyKQoreworICAgIGlmKE5VTEwgPT0gc19wZm5HZXRBZGFwdGVyQWRkcmVzc2VzKSB7CisJc19wZm5HZXRBZGFwdGVyQWRkcmVzc2VzID0gKFBGTl9HZXRBZGFwdGVyQWRkcmVzc2VzKSAKKwkgICAgR2V0SXBIbHBBcGlQcm9jKEdQQV9URVhUKCJHZXRBZGFwdGVyc0FkZHJlc3NlcyIpKTsKKyAgICB9CisgICAgCisgICAgaWYoTlVMTCAhPSBzX3BmbkdldEFkYXB0ZXJBZGRyZXNzZXMpIHsKKwlyZXR1cm4gc19wZm5HZXRBZGFwdGVyQWRkcmVzc2VzKEZhbWlseSwgRmxhZ3MsIFJlc2VydmVkLAorCQkJCQlBZGFwdGVyQWRkcmVzc2VzLCBTaXplUG9pbnRlcik7CisgICAgfQorICAgIAorICAgIHJldHVybiBFUlJPUl9OT1RfU1VQUE9SVEVEOworfQorCisjaWYgUEpfSVBfSEVMUEVSX0lHTk9SRV9MT09QQkFDS19JRgorc3RhdGljIERXT1JEIE15R2V0SWZFbnRyeShNSUJfSUZST1cgKnBJZlJvdykKK3sKKyAgICBpZihOVUxMID09IHNfcGZuR2V0SWZFbnRyeSkgeworCXNfcGZuR2V0SWZFbnRyeSA9IChQRk5fR2V0SWZFbnRyeSkgCisJICAgIEdldElwSGxwQXBpUHJvYyhHUEFfVEVYVCgiR2V0SWZFbnRyeSIpKTsKKyAgICB9CisgICAgCisgICAgaWYoTlVMTCAhPSBzX3BmbkdldElmRW50cnkpIHsKKwlyZXR1cm4gc19wZm5HZXRJZkVudHJ5KHBJZlJvdyk7CisgICAgfQorICAgIAorICAgIHJldHVybiBFUlJPUl9OT1RfU1VQUE9SVEVEOworfQorI2VuZGlmCisKKworc3RhdGljIERXT1JEIE15R2V0SXBGb3J3YXJkVGFibGUoUE1JQl9JUEZPUldBUkRUQUJMRSBwSXBGb3J3YXJkVGFibGUsIAorCQkJCSBQVUxPTkcgcGR3U2l6ZSwgCisJCQkJIEJPT0wgYk9yZGVyKQoreworICAgIGlmKE5VTEwgPT0gc19wZm5HZXRJcEZvcndhcmRUYWJsZSkgeworCXNfcGZuR2V0SXBGb3J3YXJkVGFibGUgPSAoUEZOX0dldElwRm9yd2FyZFRhYmxlKSAKKwkgICAgR2V0SXBIbHBBcGlQcm9jKEdQQV9URVhUKCJHZXRJcEZvcndhcmRUYWJsZSIpKTsKKyAgICB9CisgICAgCisgICAgaWYoTlVMTCAhPSBzX3BmbkdldElwRm9yd2FyZFRhYmxlKSB7CisJcmV0dXJuIHNfcGZuR2V0SXBGb3J3YXJkVGFibGUocElwRm9yd2FyZFRhYmxlLCBwZHdTaXplLCBiT3JkZXIpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gRVJST1JfTk9UX1NVUFBPUlRFRDsKK30KKworLyogRW51bWVyYXRlIGxvY2FsIElQIGludGVyZmFjZSB1c2luZyBHZXRJcEFkZHJUYWJsZSgpCisgKiBmb3IgSVB2NCBhZGRyZXNzZXMgb25seS4KKyAqLworc3RhdGljIHBqX3N0YXR1c190IGVudW1faXB2NF9pbnRlcmZhY2UodW5zaWduZWQgKnBfY250LAorCQkJCSAgICAgICBwal9zb2NrYWRkciBpZnNbXSkKK3sKKyAgICBjaGFyIGlwVGFiQnVmZls1MTJdOworICAgIE1JQl9JUEFERFJUQUJMRSAqcFRhYiA9IChNSUJfSVBBRERSVEFCTEUqKWlwVGFiQnVmZjsKKyAgICBVTE9ORyB0YWJTaXplID0gc2l6ZW9mKGlwVGFiQnVmZik7CisgICAgdW5zaWduZWQgaSwgY291bnQ7CisgICAgRFdPUkQgcmMgPSBOT19FUlJPUjsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocF9jbnQgJiYgaWZzLCBQSl9FSU5WQUwpOworCisgICAgLyogR2V0IElQIGFkZHJlc3MgdGFibGUgKi8KKyAgICByYyA9IE15R2V0SXBBZGRyVGFibGUocFRhYiwgJnRhYlNpemUsIEZBTFNFKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKwlpZiAocmMgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikgeworCSAgICAvKiBSZXRyeSB3aXRoIGxhcmdlciBidWZmZXIgKi8KKwkgICAgcFRhYiA9IChNSUJfSVBBRERSVEFCTEUqKW1hbGxvYyh0YWJTaXplKTsKKwkgICAgaWYgKHBUYWIpCisJCXJjID0gTXlHZXRJcEFkZHJUYWJsZShwVGFiLCAmdGFiU2l6ZSwgRkFMU0UpOworCX0KKworCWlmIChyYyAhPSBOT19FUlJPUikgeworCSAgICBpZiAocFRhYiAhPSAoTUlCX0lQQUREUlRBQkxFKilpcFRhYkJ1ZmYpCisJCWZyZWUocFRhYik7CisJICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocmMpOworCX0KKyAgICB9CisKKyAgICAvKiBSZXNldCByZXN1bHQgKi8KKyAgICBwal9iemVybyhpZnMsIHNpemVvZihpZnNbMF0pICogKCpwX2NudCkpOworCisgICAgLyogTm93IGZpbGwgb3V0IHRoZSBlbnRyaWVzICovCisgICAgY291bnQgPSAocFRhYi0+ZHdOdW1FbnRyaWVzIDwgKnBfY250KSA/IHBUYWItPmR3TnVtRW50cmllcyA6ICpwX2NudDsKKyAgICAqcF9jbnQgPSAwOworICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpIHsKKwlNSUJfSUZST1cgaWZSb3c7CisKKwkvKiBJZ25vcmUgMC4wLjAuMCBhZGRyZXNzIChpbnRlcmZhY2UgaXMgZG93bj8pICovCisJaWYgKHBUYWItPnRhYmxlW2ldLmR3QWRkciA9PSAwKQorCSAgICBjb250aW51ZTsKKworCS8qIElnbm9yZSAwLjAuMC4wLzggYWRkcmVzcy4gVGhpcyBpcyBhIHNwZWNpYWwgYWRkcmVzcworCSAqIHdoaWNoIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIHByYWN0aWNhbCB1c2UuCisJICovCisJaWYgKChwal9udG9obChwVGFiLT50YWJsZVtpXS5kd0FkZHIpID4+IDI0KSA9PSAwKQorCSAgICBjb250aW51ZTsKKworI2lmIFBKX0lQX0hFTFBFUl9JR05PUkVfTE9PUEJBQ0tfSUYKKwkvKiBJbnZlc3RpZ2F0ZSB0aGUgdHlwZSBvZiB0aGlzIGludGVyZmFjZSAqLworCXBqX2J6ZXJvKCZpZlJvdywgc2l6ZW9mKGlmUm93KSk7CisJaWZSb3cuZHdJbmRleCA9IHBUYWItPnRhYmxlW2ldLmR3SW5kZXg7CisJaWYgKE15R2V0SWZFbnRyeSgmaWZSb3cpICE9IDApCisJICAgIGNvbnRpbnVlOworCisJaWYgKGlmUm93LmR3VHlwZSA9PSBNSUJfSUZfVFlQRV9MT09QQkFDSykKKwkgICAgY29udGludWU7CisjZW5kaWYKKworCWlmc1sqcF9jbnRdLmlwdjQuc2luX2ZhbWlseSA9IFBKX0FGX0lORVQ7CisJaWZzWypwX2NudF0uaXB2NC5zaW5fYWRkci5zX2FkZHIgPSBwVGFiLT50YWJsZVtpXS5kd0FkZHI7CisJKCpwX2NudCkrKzsKKyAgICB9CisKKyAgICBpZiAocFRhYiAhPSAoTUlCX0lQQUREUlRBQkxFKilpcFRhYkJ1ZmYpCisJZnJlZShwVGFiKTsKKworICAgIHJldHVybiAoKnBfY250KSA/IFBKX1NVQ0NFU1MgOiBQSl9FTk9URk9VTkQ7Cit9CisKKy8qIEVudW1lcmF0ZSBsb2NhbCBJUCBpbnRlcmZhY2UgdXNpbmcgR2V0QWRhcHRlckFkZHJlc3NlcygpLAorICogd2hpY2ggd29ya3MgZm9yIGJvdGggSVB2NCBhbmQgSVB2Ni4KKyAqLworc3RhdGljIHBqX3N0YXR1c190IGVudW1faXB2NF9pcHY2X2ludGVyZmFjZShpbnQgYWYsCisJCQkJCSAgICB1bnNpZ25lZCAqcF9jbnQsCisJCQkJCSAgICBwal9zb2NrYWRkciBpZnNbXSkKK3sKKyAgICBwal91aW50OF90IGJ1ZmZlcls2MDBdOworICAgIElQX0FEQVBURVJfQUREUkVTU0VTICphZGFwdGVyID0gKElQX0FEQVBURVJfQUREUkVTU0VTKilidWZmZXI7CisgICAgdm9pZCAqYWRhcHRlckJ1ZiA9IE5VTEw7CisgICAgVUxPTkcgc2l6ZSA9IHNpemVvZihidWZmZXIpOworICAgIFVMT05HIGZsYWdzOworICAgIHVuc2lnbmVkIGk7CisgICAgRFdPUkQgcmM7CisKKyAgICBmbGFncyA9IEdBQV9GTEFHX1NLSVBfRlJJRU5ETFlfTkFNRSB8CisJICAgIEdBQV9GTEFHX1NLSVBfRE5TX1NFUlZFUiB8CisJICAgIEdBQV9GTEFHX1NLSVBfTVVMVElDQVNUOworCisgICAgcmMgPSBNeUdldEFkYXB0ZXJBZGRyZXNzZXMoYWYsIGZsYWdzLCBOVUxMLCBhZGFwdGVyLCAmc2l6ZSk7CisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpIHsKKwlpZiAocmMgPT0gRVJST1JfQlVGRkVSX09WRVJGTE9XKSB7CisJICAgIC8qIFJldHJ5IHdpdGggbGFyZ2VyIG1lbW9yeSBzaXplICovCisJICAgIGFkYXB0ZXJCdWYgPSBtYWxsb2Moc2l6ZSk7CisJICAgIGFkYXB0ZXIgPSAoSVBfQURBUFRFUl9BRERSRVNTRVMqKSBhZGFwdGVyQnVmOworCSAgICBpZiAoYWRhcHRlciAhPSBOVUxMKQorCQlyYyA9IE15R2V0QWRhcHRlckFkZHJlc3NlcyhhZiwgZmxhZ3MsIE5VTEwsIGFkYXB0ZXIsICZzaXplKTsKKwl9IAorCisJaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpIHsKKwkgICAgaWYgKGFkYXB0ZXJCdWYpCisJCWZyZWUoYWRhcHRlckJ1Zik7CisJICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocmMpOworCX0KKyAgICB9CisKKyAgICAvKiBSZXNldCByZXN1bHQgKi8KKyAgICBwal9iemVybyhpZnMsIHNpemVvZihpZnNbMF0pICogKCpwX2NudCkpOworCisgICAgLyogRW51bWVyYXRlIGludGVyZmFjZSAqLworICAgIGZvciAoaT0wOyBpPCpwX2NudCAmJiBhZGFwdGVyOyBhZGFwdGVyID0gYWRhcHRlci0+TmV4dCkgeworCWlmIChhZGFwdGVyLT5GaXJzdFVuaWNhc3RBZGRyZXNzKSB7CisJICAgIFNPQ0tFVF9BRERSRVNTICpwQWRkciA9ICZhZGFwdGVyLT5GaXJzdFVuaWNhc3RBZGRyZXNzLT5BZGRyZXNzOworCisJICAgIC8qIElnbm9yZSBhZGRyZXNzIGZhbWlseSB3aGljaCB3ZSBkaWRuJ3QgcmVxdWVzdCwganVzdCBpbiBjYXNlICovCisJICAgIGlmIChwQWRkci0+bHBTb2NrYWRkci0+c2FfZmFtaWx5ICE9IFBKX0FGX0lORVQgJiYKKwkJcEFkZHItPmxwU29ja2FkZHItPnNhX2ZhbWlseSAhPSBQSl9BRl9JTkVUNikKKwkgICAgeworCQljb250aW51ZTsKKwkgICAgfQorCisJICAgIC8qIEFwcGx5IHNvbWUgZmlsdGVyaW5nIHRvIGtub3duIElQdjQgdW51c2FibGUgYWRkcmVzc2VzICovCisJICAgIGlmIChwQWRkci0+bHBTb2NrYWRkci0+c2FfZmFtaWx5ID09IFBKX0FGX0lORVQpIHsKKwkJY29uc3QgcGpfc29ja2FkZHJfaW4gKmFkZHJfaW4gPSAKKwkJICAgIChjb25zdCBwal9zb2NrYWRkcl9pbiopcEFkZHItPmxwU29ja2FkZHI7CisKKwkJLyogSWdub3JlIDAuMC4wLjAgYWRkcmVzcyAoaW50ZXJmYWNlIGlzIGRvd24/KSAqLworCQlpZiAoYWRkcl9pbi0+c2luX2FkZHIuc19hZGRyID09IDApCisJCSAgICBjb250aW51ZTsKKworCQkvKiBJZ25vcmUgMC4wLjAuMC84IGFkZHJlc3MuIFRoaXMgaXMgYSBzcGVjaWFsIGFkZHJlc3MKKwkJICogd2hpY2ggZG9lc24ndCBzZWVtIHRvIGhhdmUgcHJhY3RpY2FsIHVzZS4KKwkJICovCisJCWlmICgocGpfbnRvaGwoYWRkcl9pbi0+c2luX2FkZHIuc19hZGRyKSA+PiAyNCkgPT0gMCkKKwkJICAgIGNvbnRpbnVlOworCSAgICB9CisKKyNpZiBQSl9JUF9IRUxQRVJfSUdOT1JFX0xPT1BCQUNLX0lGCisJICAgIC8qIElnbm9yZSBsb29wYmFjayBpbnRlcmZhY2VzICovCisJICAgIC8qIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBJRl9UWVBFX1NPRlRXQVJFX0xPT1BCQUNLIGFjY29yZGluZyB0bworCSAgICAgKiBNU0ROLCBhbmQgdGhpcyBtYWNybyBzaG91bGQgaGF2ZSBiZWVuIGRlY2xhcmVkIGluIElwaWZjb25zLmgsIAorCSAgICAgKiBidXQgc29tZSBTREsgdmVyc2lvbnMgZG9uJ3QgaGF2ZSBpdC4KKwkgICAgICovCisJICAgIGlmIChhZGFwdGVyLT5JZlR5cGUgPT0gTUlCX0lGX1RZUEVfTE9PUEJBQ0spCisJCWNvbnRpbnVlOworI2VuZGlmCisKKwkgICAgLyogSWdub3JlIGRvd24gaW50ZXJmYWNlICovCisJICAgIGlmIChhZGFwdGVyLT5PcGVyU3RhdHVzICE9IElmT3BlclN0YXR1c1VwKQorCQljb250aW51ZTsKKworCSAgICBpZnNbaV0uYWRkci5zYV9mYW1pbHkgPSBwQWRkci0+bHBTb2NrYWRkci0+c2FfZmFtaWx5OworCSAgICBwal9tZW1jcHkoJmlmc1tpXSwgcEFkZHItPmxwU29ja2FkZHIsIHBBZGRyLT5pU29ja2FkZHJMZW5ndGgpOworCSAgICArK2k7CisJfQorICAgIH0KKworICAgIGlmIChhZGFwdGVyQnVmKQorCWZyZWUoYWRhcHRlckJ1Zik7CisKKyAgICAqcF9jbnQgPSBpOworICAgIHJldHVybiAoKnBfY250KSA/IFBKX1NVQ0NFU1MgOiBQSl9FTk9URk9VTkQ7Cit9CisKKworLyoKKyAqIEVudW1lcmF0ZSB0aGUgbG9jYWwgSVAgaW50ZXJmYWNlIGN1cnJlbnRseSBhY3RpdmUgaW4gdGhlIGhvc3QuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZW51bV9pcF9pbnRlcmZhY2UoaW50IGFmLAorCQkJCQkgdW5zaWduZWQgKnBfY250LAorCQkJCQkgcGpfc29ja2FkZHIgaWZzW10pCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gLTE7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBfY250ICYmIGlmcywgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFmPT1QSl9BRl9VTlNQRUMgfHwgYWY9PVBKX0FGX0lORVQgfHwgYWY9PVBKX0FGX0lORVQ2LAorCQkgICAgIFBKX0VBRk5PVFNVUCk7CisKKyAgICBzdGF0dXMgPSBlbnVtX2lwdjRfaXB2Nl9pbnRlcmZhY2UoYWYsIHBfY250LCBpZnMpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyAmJiAoYWY9PVBKX0FGX0lORVQgfHwgYWY9PVBKX0FGX1VOU1BFQykpCisJc3RhdHVzID0gZW51bV9pcHY0X2ludGVyZmFjZShwX2NudCwgaWZzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW51bWVyYXRlIHRoZSBJUCByb3V0aW5nIHRhYmxlIGZvciB0aGlzIGhvc3QuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZW51bV9pcF9yb3V0ZSh1bnNpZ25lZCAqcF9jbnQsCisJCQkJICAgICBwal9pcF9yb3V0ZV9lbnRyeSByb3V0ZXNbXSkKK3sKKyAgICBjaGFyIGlwVGFiQnVmZlsxMDI0XTsKKyAgICBNSUJfSVBBRERSVEFCTEUgKnBJcFRhYjsKKyAgICBjaGFyIHJ0YWJCdWZmWzEwMjRdOworICAgIE1JQl9JUEZPUldBUkRUQUJMRSAqcHJUYWI7CisgICAgVUxPTkcgdGFiU2l6ZTsKKyAgICB1bnNpZ25lZCBpLCBjb3VudDsKKyAgICBEV09SRCByYyA9IE5PX0VSUk9SOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihwX2NudCAmJiByb3V0ZXMsIFBKX0VJTlZBTCk7CisKKyAgICBwSXBUYWIgPSAoTUlCX0lQQUREUlRBQkxFICopaXBUYWJCdWZmOworICAgIHByVGFiID0gKE1JQl9JUEZPUldBUkRUQUJMRSAqKXJ0YWJCdWZmOworCisgICAgLyogRmlyc3QgZ2V0IElQIGFkZHJlc3MgdGFibGUgKi8KKyAgICB0YWJTaXplID0gc2l6ZW9mKGlwVGFiQnVmZik7CisgICAgcmMgPSBNeUdldElwQWRkclRhYmxlKHBJcFRhYiwgJnRhYlNpemUsIEZBTFNFKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyYyk7CisKKyAgICAvKiBOZXh0IGdldCBJUCByb3V0ZSB0YWJsZSAqLworICAgIHRhYlNpemUgPSBzaXplb2YocnRhYkJ1ZmYpOworCisgICAgcmMgPSBNeUdldElwRm9yd2FyZFRhYmxlKHByVGFiLCAmdGFiU2l6ZSwgMSk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocmMpOworCisgICAgLyogUmVzZXQgcm91dGVzICovCisgICAgcGpfYnplcm8ocm91dGVzLCBzaXplb2Yocm91dGVzWzBdKSAqICgqcF9jbnQpKTsKKworICAgIC8qIE5vdyBmaWxsIG91dCB0aGUgcm91dGUgZW50cmllcyAqLworICAgIGNvdW50ID0gKHByVGFiLT5kd051bUVudHJpZXMgPCAqcF9jbnQpID8gcHJUYWItPmR3TnVtRW50cmllcyA6ICpwX2NudDsKKyAgICAqcF9jbnQgPSAwOworICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpIHsKKwl1bnNpZ25lZCBqOworCisJLyogRmluZCBpbnRlcmZhY2UgZW50cnkgKi8KKwlmb3IgKGo9MDsgajxwSXBUYWItPmR3TnVtRW50cmllczsgKytqKSB7CisJICAgIGlmIChwSXBUYWItPnRhYmxlW2pdLmR3SW5kZXggPT0gcHJUYWItPnRhYmxlW2ldLmR3Rm9yd2FyZElmSW5kZXgpCisJCWJyZWFrOworCX0KKworCWlmIChqPT1wSXBUYWItPmR3TnVtRW50cmllcykKKwkgICAgY29udGludWU7CS8qIEludGVyZmFjZSBub3QgZm91bmQgKi8KKworCXJvdXRlc1sqcF9jbnRdLmlwdjQuaWZfYWRkci5zX2FkZHIgPSBwSXBUYWItPnRhYmxlW2pdLmR3QWRkcjsKKwlyb3V0ZXNbKnBfY250XS5pcHY0LmRzdF9hZGRyLnNfYWRkciA9IHByVGFiLT50YWJsZVtpXS5kd0ZvcndhcmREZXN0OworCXJvdXRlc1sqcF9jbnRdLmlwdjQubWFzay5zX2FkZHIgPSBwclRhYi0+dGFibGVbaV0uZHdGb3J3YXJkTWFzazsKKworCSgqcF9jbnQpKys7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovbGlzdC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmOGQyMAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovbGlzdC5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qICRJZDogbGlzdC5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovbGlzdC5oPgorCisjaWYgIVBKX0ZVTkNUSU9OU19BUkVfSU5MSU5FRAorIyAgaW5jbHVkZSA8cGovbGlzdF9pLmg+CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2xvY2suYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTJkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2xvY2suYwpAQCAtMCwwICsxLDcxNSBAQAorLyogJElkOiBsb2NrLmMgNDQxMiAyMDEzLTAzLTA1IDAzOjEyOjMyWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovbG9jay5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisKKyNkZWZpbmUgVEhJU19GSUxFCSJsb2NrLmMiCisKK3R5cGVkZWYgdm9pZCBMT0NLX09CSjsKKworLyoKKyAqIExvY2sgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgcGpfbG9ja190Cit7CisgICAgTE9DS19PQkogKmxvY2tfb2JqZWN0OworCisgICAgcGpfc3RhdHVzX3QJKCphY3F1aXJlKQkoTE9DS19PQkoqKTsKKyAgICBwal9zdGF0dXNfdAkoKnRyeWFjcXVpcmUpCShMT0NLX09CSiopOworICAgIHBqX3N0YXR1c190CSgqcmVsZWFzZSkJKExPQ0tfT0JKKik7CisgICAgcGpfc3RhdHVzX3QJKCpkZXN0cm95KQkoTE9DS19PQkoqKTsKK307CisKK3R5cGVkZWYgcGpfc3RhdHVzX3QgKCpGUFRSKShMT0NLX09CSiopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBsb2NrIG9iamVjdCB3aXRoIG11dGV4LgorICovCitzdGF0aWMgcGpfbG9ja190IG11dGV4X2xvY2tfdGVtcGxhdGUgPSAKK3sKKyAgICBOVUxMLAorICAgIChGUFRSKSAmcGpfbXV0ZXhfbG9jaywKKyAgICAoRlBUUikgJnBqX211dGV4X3RyeWxvY2ssCisgICAgKEZQVFIpICZwal9tdXRleF91bmxvY2ssCisgICAgKEZQVFIpICZwal9tdXRleF9kZXN0cm95Cit9OworCitzdGF0aWMgcGpfc3RhdHVzX3QgY3JlYXRlX211dGV4X2xvY2soIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgIGludCB0eXBlLAorCQkJCSAgICAgIHBqX2xvY2tfdCAqKmxvY2sgKQoreworICAgIHBqX2xvY2tfdCAqcF9sb2NrOworICAgIHBqX211dGV4X3QgKm11dGV4OworICAgIHBqX3N0YXR1c190IHJjOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIGxvY2ssIFBKX0VJTlZBTCk7CisKKyAgICBwX2xvY2sgPSBQSl9QT09MX0FMTE9DX1QocG9vbCwgcGpfbG9ja190KTsKKyAgICBpZiAoIXBfbG9jaykKKwlyZXR1cm4gUEpfRU5PTUVNOworCisgICAgcGpfbWVtY3B5KHBfbG9jaywgJm11dGV4X2xvY2tfdGVtcGxhdGUsIHNpemVvZihwal9sb2NrX3QpKTsKKyAgICByYyA9IHBqX211dGV4X2NyZWF0ZShwb29sLCBuYW1lLCB0eXBlLCAmbXV0ZXgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiByYzsKKworICAgIHBfbG9jay0+bG9ja19vYmplY3QgPSBtdXRleDsKKyAgICAqbG9jayA9IHBfbG9jazsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2xvY2tfY3JlYXRlX3NpbXBsZV9tdXRleCggcGpfcG9vbF90ICpwb29sLAorCQkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkgcGpfbG9ja190ICoqbG9jayApCit7CisgICAgcmV0dXJuIGNyZWF0ZV9tdXRleF9sb2NrKHBvb2wsIG5hbWUsIFBKX01VVEVYX1NJTVBMRSwgbG9jayk7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfbG9ja19jcmVhdGVfcmVjdXJzaXZlX211dGV4KCBwal9wb29sX3QgKnBvb2wsCisJCQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCSAgICBwal9sb2NrX3QgKipsb2NrICkKK3sKKyAgICByZXR1cm4gY3JlYXRlX211dGV4X2xvY2socG9vbCwgbmFtZSwgUEpfTVVURVhfUkVDVVJTRSwgbG9jayk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW1wbGVtZW50YXRpb24gb2YgTlVMTCBsb2NrIG9iamVjdC4KKyAqLworc3RhdGljIHBqX3N0YXR1c190IG51bGxfb3Aodm9pZCAqYXJnKQoreworICAgIFBKX1VOVVNFRF9BUkcoYXJnKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHBqX2xvY2tfdCBudWxsX2xvY2tfdGVtcGxhdGUgPSAKK3sKKyAgICBOVUxMLAorICAgICZudWxsX29wLAorICAgICZudWxsX29wLAorICAgICZudWxsX29wLAorICAgICZudWxsX29wCit9OworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2xvY2tfY3JlYXRlX251bGxfbXV0ZXgoIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgICBwal9sb2NrX3QgKipsb2NrICkKK3sKKyAgICBQSl9VTlVTRURfQVJHKG5hbWUpOworICAgIFBKX1VOVVNFRF9BUkcocG9vbCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGxvY2ssIFBKX0VJTlZBTCk7CisKKyAgICAqbG9jayA9ICZudWxsX2xvY2tfdGVtcGxhdGU7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW1wbGVtZW50YXRpb24gb2Ygc2VtYXBob3JlIGxvY2sgb2JqZWN0LgorICovCisjaWYgZGVmaW5lZChQSl9IQVNfU0VNQVBIT1JFKSAmJiBQSl9IQVNfU0VNQVBIT1JFICE9IDAKKworc3RhdGljIHBqX2xvY2tfdCBzZW1fbG9ja190ZW1wbGF0ZSA9IAoreworICAgIE5VTEwsCisgICAgKEZQVFIpICZwal9zZW1fd2FpdCwKKyAgICAoRlBUUikgJnBqX3NlbV90cnl3YWl0LAorICAgIChGUFRSKSAmcGpfc2VtX3Bvc3QsCisgICAgKEZQVFIpICZwal9zZW1fZGVzdHJveQorfTsKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9sb2NrX2NyZWF0ZV9zZW1hcGhvcmUoICBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW5pdGlhbCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIG1heCwKKwkJCQkJICAgICAgIHBqX2xvY2tfdCAqKmxvY2sgKQoreworICAgIHBqX2xvY2tfdCAqcF9sb2NrOworICAgIHBqX3NlbV90ICpzZW07CisgICAgcGpfc3RhdHVzX3QgcmM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBvb2wgJiYgbG9jaywgUEpfRUlOVkFMKTsKKworICAgIHBfbG9jayA9IFBKX1BPT0xfQUxMT0NfVChwb29sLCBwal9sb2NrX3QpOworICAgIGlmICghcF9sb2NrKQorCXJldHVybiBQSl9FTk9NRU07CisKKyAgICBwal9tZW1jcHkocF9sb2NrLCAmc2VtX2xvY2tfdGVtcGxhdGUsIHNpemVvZihwal9sb2NrX3QpKTsKKyAgICByYyA9IHBqX3NlbV9jcmVhdGUoIHBvb2wsIG5hbWUsIGluaXRpYWwsIG1heCwgJnNlbSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiByYzsKKworICAgIHBfbG9jay0+bG9ja19vYmplY3QgPSBzZW07CisgICAgKmxvY2sgPSBwX2xvY2s7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisjZW5kaWYJLyogUEpfSEFTX1NFTUFQSE9SRSAqLworCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfbG9ja19hY3F1aXJlKCBwal9sb2NrX3QgKmxvY2sgKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4obG9jayAhPSBOVUxMLCBQSl9FSU5WQUwpOworICAgIHJldHVybiAoKmxvY2stPmFjcXVpcmUpKGxvY2stPmxvY2tfb2JqZWN0KTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9sb2NrX3RyeWFjcXVpcmUoIHBqX2xvY2tfdCAqbG9jayApCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihsb2NrICE9IE5VTEwsIFBKX0VJTlZBTCk7CisgICAgcmV0dXJuICgqbG9jay0+dHJ5YWNxdWlyZSkobG9jay0+bG9ja19vYmplY3QpOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2xvY2tfcmVsZWFzZSggcGpfbG9ja190ICpsb2NrICkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGxvY2sgIT0gTlVMTCwgUEpfRUlOVkFMKTsKKyAgICByZXR1cm4gKCpsb2NrLT5yZWxlYXNlKShsb2NrLT5sb2NrX29iamVjdCk7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfbG9ja19kZXN0cm95KCBwal9sb2NrX3QgKmxvY2sgKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4obG9jayAhPSBOVUxMLCBQSl9FSU5WQUwpOworICAgIHJldHVybiAoKmxvY2stPmRlc3Ryb3kpKGxvY2stPmxvY2tfb2JqZWN0KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHcm91cCBsb2NrCisgKi8KKworLyogSW5kaXZpZHVhbCBsb2NrIGluIHRoZSBncm91cCBsb2NrICovCit0eXBlZGVmIHN0cnVjdCBncnBfbG9ja19pdGVtCit7CisgICAgUEpfREVDTF9MSVNUX01FTUJFUihzdHJ1Y3QgZ3JwX2xvY2tfaXRlbSk7CisgICAgaW50CQkgcHJpbzsKKyAgICBwal9sb2NrX3QJKmxvY2s7CisKK30gZ3JwX2xvY2tfaXRlbTsKKworLyogRGVzdHJveSBjYWxsYmFja3MgKi8KK3R5cGVkZWYgc3RydWN0IGdycF9kZXN0cm95X2NhbGxiYWNrCit7CisgICAgUEpfREVDTF9MSVNUX01FTUJFUihzdHJ1Y3QgZ3JwX2Rlc3Ryb3lfY2FsbGJhY2spOworICAgIHZvaWQJKmNvbXA7CisgICAgdm9pZAkoKmhhbmRsZXIpKHZvaWQqKTsKK30gZ3JwX2Rlc3Ryb3lfY2FsbGJhY2s7CisKKyNpZiBQSl9HUlBfTE9DS19ERUJVRworLyogU3RvcmUgZWFjaCBhZGRfcmVmIGNhbGxlciAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JwX2xvY2tfcmVmCit7CisgICAgUEpfREVDTF9MSVNUX01FTUJFUihzdHJ1Y3QgZ3JwX2xvY2tfcmVmKTsKKyAgICBjb25zdCBjaGFyCSpmaWxlOworICAgIGludAkJIGxpbmU7Cit9IGdycF9sb2NrX3JlZjsKKyNlbmRpZgorCisvKiBUaGUgZ3JvdXAgbG9jayAqLworc3RydWN0IHBqX2dycF9sb2NrX3QKK3sKKyAgICBwal9sb2NrX3QJIAkgYmFzZTsKKworICAgIHBqX3Bvb2xfdAkJKnBvb2w7CisgICAgcGpfYXRvbWljX3QJCSpyZWZfY250OworICAgIHBqX2xvY2tfdAkJKm93bl9sb2NrOworCisgICAgcGpfdGhyZWFkX3QJCSpvd25lcjsKKyAgICBpbnQJCQkgb3duZXJfY250OworCisgICAgZ3JwX2xvY2tfaXRlbQkgbG9ja19saXN0OworICAgIGdycF9kZXN0cm95X2NhbGxiYWNrIGRlc3Ryb3lfbGlzdDsKKworI2lmIFBKX0dSUF9MT0NLX0RFQlVHCisgICAgZ3JwX2xvY2tfcmVmCSByZWZfbGlzdDsKKyAgICBncnBfbG9ja19yZWYJIHJlZl9mcmVlX2xpc3Q7CisjZW5kaWYKK307CisKKworUEpfREVGKHZvaWQpIHBqX2dycF9sb2NrX2NvbmZpZ19kZWZhdWx0KHBqX2dycF9sb2NrX2NvbmZpZyAqY2ZnKQoreworICAgIHBqX2J6ZXJvKGNmZywgc2l6ZW9mKCpjZmcpKTsKK30KKworc3RhdGljIHZvaWQgZ3JwX2xvY2tfc2V0X293bmVyX3RocmVhZChwal9ncnBfbG9ja190ICpnbG9jaykKK3sKKyAgICBpZiAoIWdsb2NrLT5vd25lcikgeworCWdsb2NrLT5vd25lciA9IHBqX3RocmVhZF90aGlzKCk7CisJZ2xvY2stPm93bmVyX2NudCA9IDE7CisgICAgfSBlbHNlIHsKKwlwal9hc3NlcnQoZ2xvY2stPm93bmVyID09IHBqX3RocmVhZF90aGlzKCkpOworCWdsb2NrLT5vd25lcl9jbnQrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdycF9sb2NrX3Vuc2V0X293bmVyX3RocmVhZChwal9ncnBfbG9ja190ICpnbG9jaykKK3sKKyAgICBwal9hc3NlcnQoZ2xvY2stPm93bmVyID09IHBqX3RocmVhZF90aGlzKCkpOworICAgIHBqX2Fzc2VydChnbG9jay0+b3duZXJfY250ID4gMCk7CisgICAgaWYgKC0tZ2xvY2stPm93bmVyX2NudCA8PSAwKSB7CisJZ2xvY2stPm93bmVyID0gTlVMTDsKKwlnbG9jay0+b3duZXJfY250ID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBncnBfbG9ja19hY3F1aXJlKExPQ0tfT0JKICpwKQoreworICAgIHBqX2dycF9sb2NrX3QgKmdsb2NrID0gKHBqX2dycF9sb2NrX3QqKXA7CisgICAgZ3JwX2xvY2tfaXRlbSAqbGNrOworCisgICAgcGpfYXNzZXJ0KHBqX2F0b21pY19nZXQoZ2xvY2stPnJlZl9jbnQpID4gMCk7CisKKyAgICBsY2sgPSBnbG9jay0+bG9ja19saXN0Lm5leHQ7CisgICAgd2hpbGUgKGxjayAhPSAmZ2xvY2stPmxvY2tfbGlzdCkgeworCXBqX2xvY2tfYWNxdWlyZShsY2stPmxvY2spOworCWxjayA9IGxjay0+bmV4dDsKKyAgICB9CisgICAgZ3JwX2xvY2tfc2V0X293bmVyX3RocmVhZChnbG9jayk7CisgICAgcGpfZ3JwX2xvY2tfYWRkX3JlZihnbG9jayk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBncnBfbG9ja190cnlhY3F1aXJlKExPQ0tfT0JKICpwKQoreworICAgIHBqX2dycF9sb2NrX3QgKmdsb2NrID0gKHBqX2dycF9sb2NrX3QqKXA7CisgICAgZ3JwX2xvY2tfaXRlbSAqbGNrOworCisgICAgcGpfYXNzZXJ0KHBqX2F0b21pY19nZXQoZ2xvY2stPnJlZl9jbnQpID4gMCk7CisKKyAgICBsY2sgPSBnbG9jay0+bG9ja19saXN0Lm5leHQ7CisgICAgd2hpbGUgKGxjayAhPSAmZ2xvY2stPmxvY2tfbGlzdCkgeworCXBqX3N0YXR1c190IHN0YXR1cyA9IHBqX2xvY2tfdHJ5YWNxdWlyZShsY2stPmxvY2spOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBsY2sgPSBsY2stPnByZXY7CisJICAgIHdoaWxlIChsY2sgIT0gJmdsb2NrLT5sb2NrX2xpc3QpIHsKKwkJcGpfbG9ja19yZWxlYXNlKGxjay0+bG9jayk7CisJCWxjayA9IGxjay0+cHJldjsKKwkgICAgfQorCSAgICByZXR1cm4gc3RhdHVzOworCX0KKwlsY2sgPSBsY2stPm5leHQ7CisgICAgfQorICAgIGdycF9sb2NrX3NldF9vd25lcl90aHJlYWQoZ2xvY2spOworICAgIHBqX2dycF9sb2NrX2FkZF9yZWYoZ2xvY2spOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgZ3JwX2xvY2tfcmVsZWFzZShMT0NLX09CSiAqcCkKK3sKKyAgICBwal9ncnBfbG9ja190ICpnbG9jayA9IChwal9ncnBfbG9ja190KilwOworICAgIGdycF9sb2NrX2l0ZW0gKmxjazsKKworICAgIGdycF9sb2NrX3Vuc2V0X293bmVyX3RocmVhZChnbG9jayk7CisKKyAgICBsY2sgPSBnbG9jay0+bG9ja19saXN0LnByZXY7CisgICAgd2hpbGUgKGxjayAhPSAmZ2xvY2stPmxvY2tfbGlzdCkgeworCXBqX2xvY2tfcmVsZWFzZShsY2stPmxvY2spOworCWxjayA9IGxjay0+cHJldjsKKyAgICB9CisgICAgcmV0dXJuIHBqX2dycF9sb2NrX2RlY19yZWYoZ2xvY2spOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgZ3JwX2xvY2tfZGVzdHJveShMT0NLX09CSiAqcCkKK3sKKyAgICBwal9ncnBfbG9ja190ICpnbG9jayA9IChwal9ncnBfbG9ja190KilwOworICAgIHBqX3Bvb2xfdCAqcG9vbCA9IGdsb2NrLT5wb29sOworICAgIGdycF9sb2NrX2l0ZW0gKmxjazsKKyAgICBncnBfZGVzdHJveV9jYWxsYmFjayAqY2I7CisKKyAgICBpZiAoIWdsb2NrLT5wb29sKSB7CisJLyogYWxyZWFkeSBkZXN0cm95ZWQ/ISAqLworCXJldHVybiBQSl9FSU5WQUw7CisgICAgfQorCisgICAgLyogUmVsZWFzZSBhbGwgY2hhaW5lZCBsb2NrcyAqLworICAgIGxjayA9IGdsb2NrLT5sb2NrX2xpc3QubmV4dDsKKyAgICB3aGlsZSAobGNrICE9ICZnbG9jay0+bG9ja19saXN0KSB7CisJaWYgKGxjay0+bG9jayAhPSBnbG9jay0+b3duX2xvY2spIHsKKwkgICAgaW50IGk7CisJICAgIGZvciAoaT0wOyBpPGdsb2NrLT5vd25lcl9jbnQ7ICsraSkKKwkJcGpfbG9ja19yZWxlYXNlKGxjay0+bG9jayk7CisJfQorCWxjayA9IGxjay0+bmV4dDsKKyAgICB9CisKKyAgICAvKiBDYWxsIGNhbGxiYWNrcyAqLworICAgIGNiID0gZ2xvY2stPmRlc3Ryb3lfbGlzdC5uZXh0OworICAgIHdoaWxlIChjYiAhPSAmZ2xvY2stPmRlc3Ryb3lfbGlzdCkgeworCWdycF9kZXN0cm95X2NhbGxiYWNrICpuZXh0ID0gY2ItPm5leHQ7CisJY2ItPmhhbmRsZXIoY2ItPmNvbXApOworCWNiID0gbmV4dDsKKyAgICB9CisKKyAgICBwal9sb2NrX2Rlc3Ryb3koZ2xvY2stPm93bl9sb2NrKTsKKyAgICBwal9hdG9taWNfZGVzdHJveShnbG9jay0+cmVmX2NudCk7CisgICAgZ2xvY2stPnBvb2wgPSBOVUxMOworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ3JwX2xvY2tfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfZ3JwX2xvY2tfY29uZmlnICpjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfZ3JwX2xvY2tfdCAqKnBfZ3JwX2xvY2spCit7CisgICAgcGpfZ3JwX2xvY2tfdCAqZ2xvY2s7CisgICAgZ3JwX2xvY2tfaXRlbSAqb3duX2xvY2s7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIHBfZ3JwX2xvY2ssIFBKX0VJTlZBTCk7CisKKyAgICBQSl9VTlVTRURfQVJHKGNmZyk7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUocG9vbC0+ZmFjdG9yeSwgImdsY2slcCIsIDUxMiwgNTEyLCBOVUxMKTsKKyAgICBpZiAoIXBvb2wpCisJcmV0dXJuIFBKX0VOT01FTTsKKworICAgIGdsb2NrID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBwal9ncnBfbG9ja190KTsKKyAgICBnbG9jay0+YmFzZS5sb2NrX29iamVjdCA9IGdsb2NrOworICAgIGdsb2NrLT5iYXNlLmFjcXVpcmUgPSAmZ3JwX2xvY2tfYWNxdWlyZTsKKyAgICBnbG9jay0+YmFzZS50cnlhY3F1aXJlID0gJmdycF9sb2NrX3RyeWFjcXVpcmU7CisgICAgZ2xvY2stPmJhc2UucmVsZWFzZSA9ICZncnBfbG9ja19yZWxlYXNlOworICAgIGdsb2NrLT5iYXNlLmRlc3Ryb3kgPSAmZ3JwX2xvY2tfZGVzdHJveTsKKworICAgIGdsb2NrLT5wb29sID0gcG9vbDsKKyAgICBwal9saXN0X2luaXQoJmdsb2NrLT5sb2NrX2xpc3QpOworICAgIHBqX2xpc3RfaW5pdCgmZ2xvY2stPmRlc3Ryb3lfbGlzdCk7CisjaWYgUEpfR1JQX0xPQ0tfREVCVUcKKyAgICBwal9saXN0X2luaXQoJmdsb2NrLT5yZWZfbGlzdCk7CisgICAgcGpfbGlzdF9pbml0KCZnbG9jay0+cmVmX2ZyZWVfbGlzdCk7CisjZW5kaWYKKworICAgIHN0YXR1cyA9IHBqX2F0b21pY19jcmVhdGUocG9vbCwgMCwgJmdsb2NrLT5yZWZfY250KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9lcnJvcjsKKworICAgIHN0YXR1cyA9IHBqX2xvY2tfY3JlYXRlX3JlY3Vyc2l2ZV9tdXRleChwb29sLCBwb29sLT5vYmpfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2NrLT5vd25fbG9jayk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICBvd25fbG9jayA9IFBKX1BPT0xfWkFMTE9DX1QocG9vbCwgZ3JwX2xvY2tfaXRlbSk7CisgICAgb3duX2xvY2stPmxvY2sgPSBnbG9jay0+b3duX2xvY2s7CisgICAgcGpfbGlzdF9wdXNoX2JhY2soJmdsb2NrLT5sb2NrX2xpc3QsIG93bl9sb2NrKTsKKworICAgICpwX2dycF9sb2NrID0gZ2xvY2s7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisKK29uX2Vycm9yOgorICAgIGdycF9sb2NrX2Rlc3Ryb3koZ2xvY2spOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ3JwX2xvY2tfZGVzdHJveSggcGpfZ3JwX2xvY2tfdCAqZ3JwX2xvY2spCit7CisgICAgcmV0dXJuIGdycF9sb2NrX2Rlc3Ryb3koZ3JwX2xvY2spOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dycF9sb2NrX2FjcXVpcmUoIHBqX2dycF9sb2NrX3QgKmdycF9sb2NrKQoreworICAgIHJldHVybiBncnBfbG9ja19hY3F1aXJlKGdycF9sb2NrKTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9ncnBfbG9ja190cnlhY3F1aXJlKCBwal9ncnBfbG9ja190ICpncnBfbG9jaykKK3sKKyAgICByZXR1cm4gZ3JwX2xvY2tfdHJ5YWNxdWlyZShncnBfbG9jayk7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ3JwX2xvY2tfcmVsZWFzZSggcGpfZ3JwX2xvY2tfdCAqZ3JwX2xvY2spCit7CisgICAgcmV0dXJuIGdycF9sb2NrX3JlbGVhc2UoZ3JwX2xvY2spOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dycF9sb2NrX3JlcGxhY2UoIHBqX2dycF9sb2NrX3QgKm9sZF9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9ncnBfbG9ja190ICpuZXdfbG9jaykKK3sKKyAgICBncnBfZGVzdHJveV9jYWxsYmFjayAqb2NiOworCisgICAgLyogTW92ZSBoYW5kbGVycyBmcm9tIG9sZCB0byBuZXcgKi8KKyAgICBvY2IgPSBvbGRfbG9jay0+ZGVzdHJveV9saXN0Lm5leHQ7CisgICAgd2hpbGUgKG9jYiAhPSAmb2xkX2xvY2stPmRlc3Ryb3lfbGlzdCkgeworCWdycF9kZXN0cm95X2NhbGxiYWNrICpuY2I7CisKKwluY2IgPSBQSl9QT09MX0FMTE9DX1QobmV3X2xvY2stPnBvb2wsIGdycF9kZXN0cm95X2NhbGxiYWNrKTsKKwluY2ItPmNvbXAgPSBvY2ItPmNvbXA7CisJbmNiLT5oYW5kbGVyID0gb2NiLT5oYW5kbGVyOworCXBqX2xpc3RfcHVzaF9iYWNrKCZuZXdfbG9jay0+ZGVzdHJveV9saXN0LCBuY2IpOworCisJb2NiID0gb2NiLT5uZXh0OworICAgIH0KKworICAgIHBqX2xpc3RfaW5pdCgmb2xkX2xvY2stPmRlc3Ryb3lfbGlzdCk7CisKKyAgICBncnBfbG9ja19kZXN0cm95KG9sZF9sb2NrKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9ncnBfbG9ja19hZGRfaGFuZGxlciggcGpfZ3JwX2xvY2tfdCAqZ2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9wb29sX3QgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRlc3Ryb3kpKHZvaWQgKmNvbXApKQoreworICAgIGdycF9kZXN0cm95X2NhbGxiYWNrICpjYjsKKworICAgIGdycF9sb2NrX2FjcXVpcmUoZ2xvY2spOworCisgICAgaWYgKHBvb2wgPT0gTlVMTCkKKwlwb29sID0gZ2xvY2stPnBvb2w7CisKKyAgICBjYiA9IFBKX1BPT0xfWkFMTE9DX1QocG9vbCwgZ3JwX2Rlc3Ryb3lfY2FsbGJhY2spOworICAgIGNiLT5jb21wID0gY29tcDsKKyAgICBjYi0+aGFuZGxlciA9IGRlc3Ryb3k7CisgICAgcGpfbGlzdF9wdXNoX2JhY2soJmdsb2NrLT5kZXN0cm95X2xpc3QsIGNiKTsKKworICAgIGdycF9sb2NrX3JlbGVhc2UoZ2xvY2spOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dycF9sb2NrX2RlbF9oYW5kbGVyKCBwal9ncnBfbG9ja190ICpnbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZGVzdHJveSkodm9pZCAqY29tcCkpCit7CisgICAgZ3JwX2Rlc3Ryb3lfY2FsbGJhY2sgKmNiOworCisgICAgZ3JwX2xvY2tfYWNxdWlyZShnbG9jayk7CisKKyAgICBjYiA9IGdsb2NrLT5kZXN0cm95X2xpc3QubmV4dDsKKyAgICB3aGlsZSAoY2IgIT0gJmdsb2NrLT5kZXN0cm95X2xpc3QpIHsKKwlpZiAoY2ItPmNvbXAgPT0gY29tcCAmJiBjYi0+aGFuZGxlciA9PSBkZXN0cm95KQorCSAgICBicmVhazsKKwljYiA9IGNiLT5uZXh0OworICAgIH0KKworICAgIGlmIChjYiAhPSAmZ2xvY2stPmRlc3Ryb3lfbGlzdCkKKwlwal9saXN0X2VyYXNlKGNiKTsKKworICAgIGdycF9sb2NrX3JlbGVhc2UoZ2xvY2spOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgZ3JwX2xvY2tfYWRkX3JlZihwal9ncnBfbG9ja190ICpnbG9jaykKK3sKKyAgICBwal9hdG9taWNfaW5jKGdsb2NrLT5yZWZfY250KTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHBqX3N0YXR1c190IGdycF9sb2NrX2RlY19yZWYocGpfZ3JwX2xvY2tfdCAqZ2xvY2spCit7CisgICAgaW50IGNudDsgLyogZm9yIGRlYnVnZ2luZyAqLworICAgIGlmICgoY250PXBqX2F0b21pY19kZWNfYW5kX2dldChnbG9jay0+cmVmX2NudCkpID09IDApIHsKKwlncnBfbG9ja19kZXN0cm95KGdsb2NrKTsKKwlyZXR1cm4gUEpfRUdPTkU7CisgICAgfQorICAgIHBqX2Fzc2VydChjbnQgPiAwKTsKKyAgICBwal9ncnBfbG9ja19kdW1wKGdsb2NrKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworI2lmIFBKX0dSUF9MT0NLX0RFQlVHCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dycF9sb2NrX2FkZF9yZWZfZGJnKHBqX2dycF9sb2NrX3QgKmdsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkKK3sKKyAgICBncnBfbG9ja19yZWYgKnJlZjsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBwal9lbnRlcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgaWYgKCFwal9saXN0X2VtcHR5KCZnbG9jay0+cmVmX2ZyZWVfbGlzdCkpIHsKKwlyZWYgPSBnbG9jay0+cmVmX2ZyZWVfbGlzdC5uZXh0OworCXBqX2xpc3RfZXJhc2UocmVmKTsKKyAgICB9IGVsc2UgeworCXJlZiA9IFBKX1BPT0xfQUxMT0NfVChnbG9jay0+cG9vbCwgZ3JwX2xvY2tfcmVmKTsKKyAgICB9CisKKyAgICByZWYtPmZpbGUgPSBmaWxlOworICAgIHJlZi0+bGluZSA9IGxpbmU7CisgICAgcGpfbGlzdF9wdXNoX2JhY2soJmdsb2NrLT5yZWZfbGlzdCwgcmVmKTsKKworICAgIHBqX2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHN0YXR1cyA9IGdycF9sb2NrX2FkZF9yZWYoZ2xvY2spOworCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigpOworCXBqX2xpc3RfZXJhc2UocmVmKTsKKwlwal9saXN0X3B1c2hfYmFjaygmZ2xvY2stPnJlZl9mcmVlX2xpc3QsIHJlZik7CisJcGpfbGVhdmVfY3JpdGljYWxfc2VjdGlvbigpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ3JwX2xvY2tfZGVjX3JlZl9kYmcocGpfZ3JwX2xvY2tfdCAqZ2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKQoreworICAgIGdycF9sb2NrX3JlZiAqcmVmOworCisgICAgcGpfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8qIEZpbmQgdGhlIHNhbWUgc291cmNlIGZpbGUgKi8KKyAgICByZWYgPSBnbG9jay0+cmVmX2xpc3QubmV4dDsKKyAgICB3aGlsZSAocmVmICE9ICZnbG9jay0+cmVmX2xpc3QpIHsKKwlpZiAoc3RyY21wKHJlZi0+ZmlsZSwgZmlsZSkgPT0gMCkgeworCSAgICBwal9saXN0X2VyYXNlKHJlZik7CisJICAgIHBqX2xpc3RfcHVzaF9iYWNrKCZnbG9jay0+cmVmX2ZyZWVfbGlzdCwgcmVmKTsKKwkgICAgYnJlYWs7CisJfQorCXJlZiA9IHJlZi0+bmV4dDsKKyAgICB9CisgICAgcGpfbGVhdmVfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKHJlZiA9PSAmZ2xvY2stPnJlZl9saXN0KSB7CisJUEpfTE9HKDIsKFRISVNfRklMRSwgInBqX2dycF9sb2NrX2RlY19yZWZfZGJnKCkgY291bGQgbm90IGZpbmQgIgorCQkJICAgICAgIm1hdGNoaW5nIHJlZiBmb3IgJXMiLCBmaWxlKSk7CisgICAgfQorCisgICAgcmV0dXJuIGdycF9sb2NrX2RlY19yZWYoZ2xvY2spOworfQorI2Vsc2UKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ3JwX2xvY2tfYWRkX3JlZihwal9ncnBfbG9ja190ICpnbG9jaykKK3sKKyAgICByZXR1cm4gZ3JwX2xvY2tfYWRkX3JlZihnbG9jayk7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ3JwX2xvY2tfZGVjX3JlZihwal9ncnBfbG9ja190ICpnbG9jaykKK3sKKyAgICByZXR1cm4gZ3JwX2xvY2tfZGVjX3JlZihnbG9jayk7Cit9CisjZW5kaWYKKworUEpfREVGKGludCkgcGpfZ3JwX2xvY2tfZ2V0X3JlZihwal9ncnBfbG9ja190ICpnbG9jaykKK3sKKyAgICByZXR1cm4gcGpfYXRvbWljX2dldChnbG9jay0+cmVmX2NudCk7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ3JwX2xvY2tfY2hhaW5fbG9jayggcGpfZ3JwX2xvY2tfdCAqZ2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2xvY2tfdCAqbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcykKK3sKKyAgICBncnBfbG9ja19pdGVtICpsY2ssICpuZXdfbGNrOworICAgIGludCBpOworCisgICAgZ3JwX2xvY2tfYWNxdWlyZShnbG9jayk7CisKKyAgICBmb3IgKGk9MDsgaTxnbG9jay0+b3duZXJfY250OyArK2kpCisJcGpfbG9ja19hY3F1aXJlKGxvY2spOworCisgICAgbGNrID0gZ2xvY2stPmxvY2tfbGlzdC5uZXh0OworICAgIHdoaWxlIChsY2sgIT0gJmdsb2NrLT5sb2NrX2xpc3QpIHsKKwlpZiAobGNrLT5wcmlvID49IHBvcykKKwkgICAgYnJlYWs7CisJbGNrID0gbGNrLT5uZXh0OworICAgIH0KKworICAgIG5ld19sY2sgPSBQSl9QT09MX1pBTExPQ19UKGdsb2NrLT5wb29sLCBncnBfbG9ja19pdGVtKTsKKyAgICBuZXdfbGNrLT5wcmlvID0gcG9zOworICAgIG5ld19sY2stPmxvY2sgPSBsb2NrOworICAgIHBqX2xpc3RfaW5zZXJ0X2JlZm9yZShsY2ssIG5ld19sY2spOworCisgICAgLyogdGhpcyB3aWxsIGFsc28gcmVsZWFzZSB0aGUgbmV3IGxvY2sgKi8KKyAgICBncnBfbG9ja19yZWxlYXNlKGdsb2NrKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9ncnBfbG9ja191bmNoYWluX2xvY2soIHBqX2dycF9sb2NrX3QgKmdsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2xvY2tfdCAqbG9jaykKK3sKKyAgICBncnBfbG9ja19pdGVtICpsY2s7CisKKyAgICBncnBfbG9ja19hY3F1aXJlKGdsb2NrKTsKKworICAgIGxjayA9IGdsb2NrLT5sb2NrX2xpc3QubmV4dDsKKyAgICB3aGlsZSAobGNrICE9ICZnbG9jay0+bG9ja19saXN0KSB7CisJaWYgKGxjay0+bG9jayA9PSBsb2NrKQorCSAgICBicmVhazsKKwlsY2sgPSBsY2stPm5leHQ7CisgICAgfQorCisgICAgaWYgKGxjayAhPSAmZ2xvY2stPmxvY2tfbGlzdCkgeworCWludCBpOworCisJcGpfbGlzdF9lcmFzZShsY2spOworCWZvciAoaT0wOyBpPGdsb2NrLT5vd25lcl9jbnQ7ICsraSkKKwkgICAgcGpfbG9ja19yZWxlYXNlKGxjay0+bG9jayk7CisgICAgfQorCisgICAgZ3JwX2xvY2tfcmVsZWFzZShnbG9jayk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRih2b2lkKSBwal9ncnBfbG9ja19kdW1wKHBqX2dycF9sb2NrX3QgKmdycF9sb2NrKQoreworI2lmIFBKX0dSUF9MT0NLX0RFQlVHCisgICAgZ3JwX2xvY2tfcmVmICpyZWYgPSBncnBfbG9jay0+cmVmX2xpc3QubmV4dDsKKyAgICBjaGFyIGluZm9fYnVmWzEwMDBdOworICAgIHBqX3N0cl90IGluZm87CisKKyAgICBpbmZvLnB0ciA9IGluZm9fYnVmOworICAgIGluZm8uc2xlbiA9IDA7CisKKyAgICBwal9ncnBfbG9ja19hY3F1aXJlKGdycF9sb2NrKTsKKyAgICBwal9lbnRlcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB3aGlsZSAocmVmICE9ICZncnBfbG9jay0+cmVmX2xpc3QgJiYgaW5mby5zbGVuIDwgc2l6ZW9mKGluZm9fYnVmKSkgeworCWNoYXIgKnN0YXJ0ID0gaW5mby5wdHIgKyBpbmZvLnNsZW47CisJaW50IG1heF9sZW4gPSBzaXplb2YoaW5mb19idWYpIC0gaW5mby5zbGVuOworCWludCBsZW47CisKKwlsZW4gPSBwal9hbnNpX3NucHJpbnRmKHN0YXJ0LCBtYXhfbGVuLCAiJXM6JWQgIiwgcmVmLT5maWxlLCByZWYtPmxpbmUpOworCWlmIChsZW4gPCAxIHx8IGxlbiA+IG1heF9sZW4pIHsKKwkgICAgbGVuID0gc3RybGVuKHJlZi0+ZmlsZSk7CisJICAgIGlmIChsZW4gPiBtYXhfbGVuIC0gMSkKKwkJbGVuID0gbWF4X2xlbiAtIDE7CisKKwkgICAgbWVtY3B5KHN0YXJ0LCByZWYtPmZpbGUsIGxlbik7CisJICAgIHN0YXJ0W2xlbisrXSA9ICcgJzsKKwl9CisKKwlpbmZvLnNsZW4gKz0gbGVuOworCisJcmVmID0gcmVmLT5uZXh0OworICAgIH0KKworICAgIGlmIChyZWYgIT0gJmdycF9sb2NrLT5yZWZfbGlzdCkgeworCWludCBpOworCWZvciAoaT0wOyBpPDQ7ICsraSkKKwkgICAgaW5mb19idWZbc2l6ZW9mKGluZm9fYnVmKS1pLTFdID0gJy4nOworICAgIH0KKyAgICBpbmZvLnB0cltpbmZvLnNsZW4tMV0gPSAnXDAnOworCisgICAgcGpfbGVhdmVfY3JpdGljYWxfc2VjdGlvbigpOworICAgIHBqX2dycF9sb2NrX3JlbGVhc2UoZ3JwX2xvY2spOworCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgIkdyb3VwIGxvY2sgJXAsIHJlZl9jbnQ9JWQuIFJlZmVyZW5jZSBob2xkZXJzOiAlcyIsCisJICAgICAgIGdycF9sb2NrLCBwal9ncnBfbG9ja19nZXRfcmVmKGdycF9sb2NrKSwgaW5mby5wdHIpKTsKKyNlbHNlCisgICAgUEpfVU5VU0VEX0FSRyhncnBfbG9jayk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovbG9nLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODg5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2xvZy5jCkBAIC0wLDAgKzEsNTQ1IEBACisvKiAkSWQ6IGxvZy5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3R5cGVzLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc3RkYXJnLmg+CisKKyNpZiBQSl9MT0dfTUFYX0xFVkVMID49IDEKKworI2lmIDAKK1BKX0RFRl9EQVRBKGludCkgcGpfbG9nX21heF9sZXZlbCA9IFBKX0xPR19NQVhfTEVWRUw7CisjZWxzZQorc3RhdGljIGludCBwal9sb2dfbWF4X2xldmVsID0gUEpfTE9HX01BWF9MRVZFTDsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCAqZ19sYXN0X3RocmVhZDsKKworI2lmIFBKX0hBU19USFJFQURTCitzdGF0aWMgbG9uZyB0aHJlYWRfc3VzcGVuZGVkX3Rsc19pZCA9IC0xOworIyAgaWYgUEpfTE9HX0VOQUJMRV9JTkRFTlQKK3N0YXRpYyBsb25nIHRocmVhZF9pbmRlbnRfdGxzX2lkID0gLTE7CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhUEpfTE9HX0VOQUJMRV9JTkRFTlQgfHwgIVBKX0hBU19USFJFQURTCitzdGF0aWMgaW50IGxvZ19pbmRlbnQ7CisjZW5kaWYKKworc3RhdGljIHBqX2xvZ19mdW5jICpsb2dfd3JpdGVyID0gJnBqX2xvZ193cml0ZTsKK3N0YXRpYyB1bnNpZ25lZCBsb2dfZGVjb3IgPSBQSl9MT0dfSEFTX1RJTUUgfCBQSl9MT0dfSEFTX01JQ1JPX1NFQyB8CisJCQkgICAgUEpfTE9HX0hBU19TRU5ERVIgfCBQSl9MT0dfSEFTX05FV0xJTkUgfAorCQkJICAgIFBKX0xPR19IQVNfU1BBQ0UgfCBQSl9MT0dfSEFTX1RIUkVBRF9TV0MgfAorCQkJICAgIFBKX0xPR19IQVNfSU5ERU5UCisjaWYgKGRlZmluZWQoUEpfV0lOMzIpICYmIFBKX1dJTjMyIT0wKSB8fCBcCisgICAgKGRlZmluZWQoUEpfV0lONjQpICYmIFBKX1dJTjY0IT0wKQorCQkJICAgIHwgUEpfTE9HX0hBU19DT0xPUgorI2VuZGlmCisJCQkgICAgOworCitzdGF0aWMgcGpfY29sb3JfdCBQSl9MT0dfQ09MT1JfMCA9IFBKX1RFUk1fQ09MT1JfQlJJR0hUIHwgUEpfVEVSTV9DT0xPUl9SOworc3RhdGljIHBqX2NvbG9yX3QgUEpfTE9HX0NPTE9SXzEgPSBQSl9URVJNX0NPTE9SX0JSSUdIVCB8IFBKX1RFUk1fQ09MT1JfUjsKK3N0YXRpYyBwal9jb2xvcl90IFBKX0xPR19DT0xPUl8yID0gUEpfVEVSTV9DT0xPUl9CUklHSFQgfCAKKwkJCQkgICBQSl9URVJNX0NPTE9SX1IgfCAKKwkJCQkgICBQSl9URVJNX0NPTE9SX0c7CitzdGF0aWMgcGpfY29sb3JfdCBQSl9MT0dfQ09MT1JfMyA9IFBKX1RFUk1fQ09MT1JfQlJJR0hUIHwgCisJCQkJICAgUEpfVEVSTV9DT0xPUl9SIHwgCisJCQkJICAgUEpfVEVSTV9DT0xPUl9HIHwgCisJCQkJICAgUEpfVEVSTV9DT0xPUl9COworc3RhdGljIHBqX2NvbG9yX3QgUEpfTE9HX0NPTE9SXzQgPSBQSl9URVJNX0NPTE9SX1IgfCAKKwkJCQkgICBQSl9URVJNX0NPTE9SX0cgfCAKKwkJCQkgICBQSl9URVJNX0NPTE9SX0I7CitzdGF0aWMgcGpfY29sb3JfdCBQSl9MT0dfQ09MT1JfNSA9IFBKX1RFUk1fQ09MT1JfUiB8IAorCQkJCSAgIFBKX1RFUk1fQ09MT1JfRyB8IAorCQkJCSAgIFBKX1RFUk1fQ09MT1JfQjsKK3N0YXRpYyBwal9jb2xvcl90IFBKX0xPR19DT0xPUl82ID0gUEpfVEVSTV9DT0xPUl9SIHwgCisJCQkJICAgUEpfVEVSTV9DT0xPUl9HIHwgCisJCQkJICAgUEpfVEVSTV9DT0xPUl9COworLyogRGVmYXVsdCB0ZXJtaW5hbCBjb2xvciAqLworc3RhdGljIHBqX2NvbG9yX3QgUEpfTE9HX0NPTE9SXzc3ID0gUEpfVEVSTV9DT0xPUl9SIHwgCisJCQkJICAgIFBKX1RFUk1fQ09MT1JfRyB8IAorCQkJCSAgICBQSl9URVJNX0NPTE9SX0I7CisKKyNpZiBQSl9MT0dfVVNFX1NUQUNLX0JVRkZFUj09MAorc3RhdGljIGNoYXIgbG9nX2J1ZmZlcltQSl9MT0dfTUFYX1NJWkVdOworI2VuZGlmCisKKyNkZWZpbmUgTE9HX01BWF9JTkRFTlQJCTgwCisKKyNpZiBQSl9IQVNfVEhSRUFEUworc3RhdGljIHZvaWQgbG9nZ2luZ19zaHV0ZG93bih2b2lkKQoreworICAgIGlmICh0aHJlYWRfc3VzcGVuZGVkX3Rsc19pZCAhPSAtMSkgeworCXBqX3RocmVhZF9sb2NhbF9mcmVlKHRocmVhZF9zdXNwZW5kZWRfdGxzX2lkKTsKKwl0aHJlYWRfc3VzcGVuZGVkX3Rsc19pZCA9IC0xOworICAgIH0KKyMgIGlmIFBKX0xPR19FTkFCTEVfSU5ERU5UCisgICAgaWYgKHRocmVhZF9pbmRlbnRfdGxzX2lkICE9IC0xKSB7CisJcGpfdGhyZWFkX2xvY2FsX2ZyZWUodGhyZWFkX2luZGVudF90bHNfaWQpOworCXRocmVhZF9pbmRlbnRfdGxzX2lkID0gLTE7CisgICAgfQorIyAgZW5kaWYKK30KKyNlbmRpZgkvKiBQSl9IQVNfVEhSRUFEUyAqLworCisjaWYgUEpfTE9HX0VOQUJMRV9JTkRFTlQgJiYgUEpfSEFTX1RIUkVBRFMKK3N0YXRpYyB2b2lkIGxvZ19zZXRfaW5kZW50KGludCBpbmRlbnQpCit7CisgICAgaWYgKGluZGVudCA8IDApIGluZGVudCA9IDA7CisgICAgcGpfdGhyZWFkX2xvY2FsX3NldCh0aHJlYWRfaW5kZW50X3Rsc19pZCwgKHZvaWQqKShwal9zc2l6ZV90KWluZGVudCk7Cit9CisKK3N0YXRpYyBpbnQgbG9nX2dldF9yYXdfaW5kZW50KCkKK3sKKyAgICByZXR1cm4gKGxvbmcpKHBqX3NzaXplX3QpcGpfdGhyZWFkX2xvY2FsX2dldCh0aHJlYWRfaW5kZW50X3Rsc19pZCk7Cit9CisKKyNlbHNlCitzdGF0aWMgdm9pZCBsb2dfc2V0X2luZGVudChpbnQgaW5kZW50KQoreworICAgIGxvZ19pbmRlbnQgPSBpbmRlbnQ7CisgICAgaWYgKGxvZ19pbmRlbnQgPCAwKSBsb2dfaW5kZW50ID0gMDsKK30KKworc3RhdGljIGludCBsb2dfZ2V0X3Jhd19pbmRlbnQoKQoreworICAgIHJldHVybiBsb2dfaW5kZW50OworfQorI2VuZGlmCS8qIFBKX0xPR19FTkFCTEVfSU5ERU5UICYmIFBKX0hBU19USFJFQURTICovCisKK3N0YXRpYyBpbnQgbG9nX2dldF9pbmRlbnQoKQoreworICAgIGludCBpbmRlbnQgPSBsb2dfZ2V0X3Jhd19pbmRlbnQoKTsKKyAgICByZXR1cm4gaW5kZW50ID4gTE9HX01BWF9JTkRFTlQgPyBMT0dfTUFYX0lOREVOVCA6IGluZGVudDsKK30KKworUEpfREVGKHZvaWQpIHBqX2xvZ19hZGRfaW5kZW50KGludCBpbmRlbnQpCit7CisgICAgbG9nX3NldF9pbmRlbnQobG9nX2dldF9yYXdfaW5kZW50KCkgKyBpbmRlbnQpOworfQorCitQSl9ERUYodm9pZCkgcGpfbG9nX3B1c2hfaW5kZW50KHZvaWQpCit7CisgICAgcGpfbG9nX2FkZF9pbmRlbnQoUEpfTE9HX0lOREVOVF9TSVpFKTsKK30KKworUEpfREVGKHZvaWQpIHBqX2xvZ19wb3BfaW5kZW50KHZvaWQpCit7CisgICAgcGpfbG9nX2FkZF9pbmRlbnQoLVBKX0xPR19JTkRFTlRfU0laRSk7Cit9CisKK3BqX3N0YXR1c190IHBqX2xvZ19pbml0KHZvaWQpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBpZiAodGhyZWFkX3N1c3BlbmRlZF90bHNfaWQgPT0gLTEpIHsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisJc3RhdHVzID0gcGpfdGhyZWFkX2xvY2FsX2FsbG9jKCZ0aHJlYWRfc3VzcGVuZGVkX3Rsc19pZCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gc3RhdHVzOworCisjICBpZiBQSl9MT0dfRU5BQkxFX0lOREVOVAorCXN0YXR1cyA9IHBqX3RocmVhZF9sb2NhbF9hbGxvYygmdGhyZWFkX2luZGVudF90bHNfaWQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBwal90aHJlYWRfbG9jYWxfZnJlZSh0aHJlYWRfc3VzcGVuZGVkX3Rsc19pZCk7CisJICAgIHRocmVhZF9zdXNwZW5kZWRfdGxzX2lkID0gLTE7CisJICAgIHJldHVybiBzdGF0dXM7CisJfQorIyAgZW5kaWYKKwlwal9hdGV4aXQoJmxvZ2dpbmdfc2h1dGRvd24pOworICAgIH0KKyNlbmRpZgorICAgIGdfbGFzdF90aHJlYWQgPSBOVUxMOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYodm9pZCkgcGpfbG9nX3NldF9kZWNvcih1bnNpZ25lZCBkZWNvcikKK3sKKyAgICBsb2dfZGVjb3IgPSBkZWNvcjsKK30KKworUEpfREVGKHVuc2lnbmVkKSBwal9sb2dfZ2V0X2RlY29yKHZvaWQpCit7CisgICAgcmV0dXJuIGxvZ19kZWNvcjsKK30KKworUEpfREVGKHZvaWQpIHBqX2xvZ19zZXRfY29sb3IoaW50IGxldmVsLCBwal9jb2xvcl90IGNvbG9yKQoreworICAgIHN3aXRjaCAobGV2ZWwpIAorICAgIHsKKwljYXNlIDA6IFBKX0xPR19DT0xPUl8wID0gY29sb3I7IAorCSAgICBicmVhazsKKwljYXNlIDE6IFBKX0xPR19DT0xPUl8xID0gY29sb3I7IAorCSAgICBicmVhazsKKwljYXNlIDI6IFBKX0xPR19DT0xPUl8yID0gY29sb3I7IAorCSAgICBicmVhazsKKwljYXNlIDM6IFBKX0xPR19DT0xPUl8zID0gY29sb3I7IAorCSAgICBicmVhazsKKwljYXNlIDQ6IFBKX0xPR19DT0xPUl80ID0gY29sb3I7IAorCSAgICBicmVhazsKKwljYXNlIDU6IFBKX0xPR19DT0xPUl81ID0gY29sb3I7IAorCSAgICBicmVhazsKKwljYXNlIDY6IFBKX0xPR19DT0xPUl82ID0gY29sb3I7IAorCSAgICBicmVhazsKKwkvKiBEZWZhdWx0IHRlcm1pbmFsIGNvbG9yICovCisJY2FzZSA3NzogUEpfTE9HX0NPTE9SXzc3ID0gY29sb3I7IAorCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICAvKiBEbyBub3RoaW5nICovCisJICAgIGJyZWFrOworICAgIH0KK30KKworUEpfREVGKHBqX2NvbG9yX3QpIHBqX2xvZ19nZXRfY29sb3IoaW50IGxldmVsKQoreworICAgIHN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIDA6CisJICAgIHJldHVybiBQSl9MT0dfQ09MT1JfMDsKKwljYXNlIDE6CisJICAgIHJldHVybiBQSl9MT0dfQ09MT1JfMTsKKwljYXNlIDI6CisJICAgIHJldHVybiBQSl9MT0dfQ09MT1JfMjsKKwljYXNlIDM6CisJICAgIHJldHVybiBQSl9MT0dfQ09MT1JfMzsKKwljYXNlIDQ6CisJICAgIHJldHVybiBQSl9MT0dfQ09MT1JfNDsKKwljYXNlIDU6CisJICAgIHJldHVybiBQSl9MT0dfQ09MT1JfNTsKKwljYXNlIDY6CisJICAgIHJldHVybiBQSl9MT0dfQ09MT1JfNjsKKwlkZWZhdWx0OgorCSAgICAvKiBSZXR1cm4gZGVmYXVsdCB0ZXJtaW5hbCBjb2xvciAqLworCSAgICByZXR1cm4gUEpfTE9HX0NPTE9SXzc3OworICAgIH0KK30KKworUEpfREVGKHZvaWQpIHBqX2xvZ19zZXRfbGV2ZWwoaW50IGxldmVsKQoreworICAgIHBqX2xvZ19tYXhfbGV2ZWwgPSBsZXZlbDsKK30KKworI2lmIDEKK1BKX0RFRihpbnQpIHBqX2xvZ19nZXRfbGV2ZWwodm9pZCkKK3sKKyAgICByZXR1cm4gcGpfbG9nX21heF9sZXZlbDsKK30KKyNlbmRpZgorCitQSl9ERUYodm9pZCkgcGpfbG9nX3NldF9sb2dfZnVuYyggcGpfbG9nX2Z1bmMgKmZ1bmMgKQoreworICAgIGxvZ193cml0ZXIgPSBmdW5jOworfQorCitQSl9ERUYocGpfbG9nX2Z1bmMqKSBwal9sb2dfZ2V0X2xvZ19mdW5jKHZvaWQpCit7CisgICAgcmV0dXJuIGxvZ193cml0ZXI7Cit9CisKKy8qIFRlbXBvcmFyaWx5IHN1c3BlbmQgbG9nZ2luZyBmYWNpbGl0eSBmb3IgdGhpcyB0aHJlYWQuCisgKiBJZiB0aHJlYWQgbG9jYWwgc3RvcmFnZS92YXJpYWJsZSBpcyBub3QgdXNlZCBvciBub3QgaW5pdGlhbGl6ZWQsIHRoZW4KKyAqIHdlIGNhbiBvbmx5IHN1c3BlbmQgdGhlIGxvZ2dpbmcgZ2xvYmFsbHkgYWNyb3NzIGFsbCB0aHJlYWRzLiBUaGlzIG1heQorICogaGFwcGVuIGUuZy4gd2hlbiBsb2cgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBQSkxJQiBpcyBmdWxseSBpbml0aWFsaXplZAorICogb3IgYWZ0ZXIgUEpMSUIgaXMgc2h1dGRvd24uCisgKi8KK3N0YXRpYyB2b2lkIHN1c3BlbmRfbG9nZ2luZyhpbnQgKnNhdmVkX2xldmVsKQoreworCS8qIFNhdmUgdGhlIGxldmVsIHJlZ2FyZGxlc3MsIGp1c3QgaW4gY2FzZSBQSkxJQiBpcyBzaHV0ZG93bgorCSAqIGJldHdlZW4gc3VzcGVuZCBhbmQgcmVzdW1lLgorCSAqLworCSpzYXZlZF9sZXZlbCA9IHBqX2xvZ19tYXhfbGV2ZWw7CisKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIGlmICh0aHJlYWRfc3VzcGVuZGVkX3Rsc19pZCAhPSAtMSkgCisgICAgeworCXBqX3RocmVhZF9sb2NhbF9zZXQodGhyZWFkX3N1c3BlbmRlZF90bHNfaWQsIAorCQkJICAgICh2b2lkKikocGpfc3NpemVfdClQSl9UUlVFKTsKKyAgICB9IAorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwlwal9sb2dfbWF4X2xldmVsID0gMDsKKyAgICB9Cit9CisKKy8qIFJlc3VtZSBsb2dnaW5nIGZhY2lsaXR5IGZvciB0aGlzIHRocmVhZCAqLworc3RhdGljIHZvaWQgcmVzdW1lX2xvZ2dpbmcoaW50ICpzYXZlZF9sZXZlbCkKK3sKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIGlmICh0aHJlYWRfc3VzcGVuZGVkX3Rsc19pZCAhPSAtMSkgCisgICAgeworCXBqX3RocmVhZF9sb2NhbF9zZXQodGhyZWFkX3N1c3BlbmRlZF90bHNfaWQsICh2b2lkKilQSl9GQUxTRSk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKwkvKiBPbmx5IHJldmVydCB0aGUgbGV2ZWwgaWYgYXBwbGljYXRpb24gZG9lc24ndCBjaGFuZ2UgdGhlCisJICogbG9nZ2luZyBsZXZlbCBiZXR3ZWVuIHN1c3BlbmQgYW5kIHJlc3VtZS4KKwkgKi8KKwlpZiAocGpfbG9nX21heF9sZXZlbD09MCAmJiAqc2F2ZWRfbGV2ZWwpCisJICAgIHBqX2xvZ19tYXhfbGV2ZWwgPSAqc2F2ZWRfbGV2ZWw7CisgICAgfQorfQorCisvKiBJcyBsb2dnaW5nIGZhY2lsaXR5IHN1c3BlbmRlZCBmb3IgdGhpcyB0aHJlYWQ/ICovCitzdGF0aWMgcGpfYm9vbF90IGlzX2xvZ2dpbmdfc3VzcGVuZGVkKHZvaWQpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBpZiAodGhyZWFkX3N1c3BlbmRlZF90bHNfaWQgIT0gLTEpIAorICAgIHsKKwlyZXR1cm4gcGpfdGhyZWFkX2xvY2FsX2dldCh0aHJlYWRfc3VzcGVuZGVkX3Rsc19pZCkgIT0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworCXJldHVybiBwal9sb2dfbWF4X2xldmVsID09IDA7CisgICAgfQorfQorCitQSl9ERUYodm9pZCkgcGpfbG9nKCBjb25zdCBjaGFyICpzZW5kZXIsIGludCBsZXZlbCwgCisJCSAgICAgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IG1hcmtlcikKK3sKKyAgICBwal90aW1lX3ZhbCBub3c7CisgICAgcGpfcGFyc2VkX3RpbWUgcHRpbWU7CisgICAgY2hhciAqcHJlOworI2lmIFBKX0xPR19VU0VfU1RBQ0tfQlVGRkVSCisgICAgY2hhciBsb2dfYnVmZmVyW1BKX0xPR19NQVhfU0laRV07CisjZW5kaWYKKyAgICBpbnQgc2F2ZWRfbGV2ZWwsIGxlbiwgcHJpbnRfbGVuLCBpbmRlbnQ7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgaWYgKGxldmVsID4gcGpfbG9nX21heF9sZXZlbCkKKwlyZXR1cm47CisKKyAgICBpZiAoaXNfbG9nZ2luZ19zdXNwZW5kZWQoKSkKKwlyZXR1cm47CisKKyAgICAvKiBUZW1wb3JhcmlseSBkaXNhYmxlIGxvZ2dpbmcgZm9yIHRoaXMgdGhyZWFkLiBTb21lIG9mIFBKTElCIEFQSXMgdGhhdAorICAgICAqIHRoaXMgZnVuY3Rpb24gY2FsbHMgYmVsb3cgd2lsbCByZWN1cnNpdmVseSBjYWxsIHRoZSBsb2dnaW5nIGZ1bmN0aW9uIAorICAgICAqIGJhY2ssIGhlbmNlIGl0IHdpbGwgY2F1c2UgaW5maW5pdGUgcmVjdXJzaXZlIGNhbGxzIGlmIHdlIGFsbG93IHRoYXQuCisgICAgICovCisgICAgc3VzcGVuZF9sb2dnaW5nKCZzYXZlZF9sZXZlbCk7CisKKyAgICAvKiBHZXQgY3VycmVudCBkYXRlL3RpbWUuICovCisgICAgcGpfZ2V0dGltZW9mZGF5KCZub3cpOworICAgIHBqX3RpbWVfZGVjb2RlKCZub3csICZwdGltZSk7CisKKyAgICBwcmUgPSBsb2dfYnVmZmVyOworICAgIGlmIChsb2dfZGVjb3IgJiBQSl9MT0dfSEFTX0xFVkVMX1RFWFQpIHsKKwlzdGF0aWMgY29uc3QgY2hhciAqbHRleHRzW10gPSB7ICJGQVRBTDoiLCAiRVJST1I6IiwgIiBXQVJOOiIsIAorCQkJICAgICAgIiBJTkZPOiIsICJERUJVRzoiLCAiVFJBQ0U6IiwgIkRFVFJDOiJ9OworCXBqX2Fuc2lfc3RyY3B5KHByZSwgbHRleHRzW2xldmVsXSk7CisJcHJlICs9IDY7CisgICAgfQorICAgIGlmIChsb2dfZGVjb3IgJiBQSl9MT0dfSEFTX0RBWV9OQU1FKSB7CisJc3RhdGljIGNvbnN0IGNoYXIgKndkYXlzW10gPSB7ICJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLAorCQkJCSAgICAgICAiVGh1IiwgIkZyaSIsICJTYXQifTsKKwlwal9hbnNpX3N0cmNweShwcmUsIHdkYXlzW3B0aW1lLndkYXldKTsKKwlwcmUgKz0gMzsKKyAgICB9CisgICAgaWYgKGxvZ19kZWNvciAmIFBKX0xPR19IQVNfWUVBUikgeworCWlmIChwcmUhPWxvZ19idWZmZXIpICpwcmUrKyA9ICcgJzsKKwlwcmUgKz0gcGpfdXRvYShwdGltZS55ZWFyLCBwcmUpOworICAgIH0KKyAgICBpZiAobG9nX2RlY29yICYgUEpfTE9HX0hBU19NT05USCkgeworCSpwcmUrKyA9ICctJzsKKwlwcmUgKz0gcGpfdXRvYV9wYWQocHRpbWUubW9uKzEsIHByZSwgMiwgJzAnKTsKKyAgICB9CisgICAgaWYgKGxvZ19kZWNvciAmIFBKX0xPR19IQVNfREFZX09GX01PTikgeworCSpwcmUrKyA9ICctJzsKKwlwcmUgKz0gcGpfdXRvYV9wYWQocHRpbWUuZGF5LCBwcmUsIDIsICcwJyk7CisgICAgfQorICAgIGlmIChsb2dfZGVjb3IgJiBQSl9MT0dfSEFTX1RJTUUpIHsKKwlpZiAocHJlIT1sb2dfYnVmZmVyKSAqcHJlKysgPSAnICc7CisJcHJlICs9IHBqX3V0b2FfcGFkKHB0aW1lLmhvdXIsIHByZSwgMiwgJzAnKTsKKwkqcHJlKysgPSAnOic7CisJcHJlICs9IHBqX3V0b2FfcGFkKHB0aW1lLm1pbiwgcHJlLCAyLCAnMCcpOworCSpwcmUrKyA9ICc6JzsKKwlwcmUgKz0gcGpfdXRvYV9wYWQocHRpbWUuc2VjLCBwcmUsIDIsICcwJyk7CisgICAgfQorICAgIGlmIChsb2dfZGVjb3IgJiBQSl9MT0dfSEFTX01JQ1JPX1NFQykgeworCSpwcmUrKyA9ICcuJzsKKwlwcmUgKz0gcGpfdXRvYV9wYWQocHRpbWUubXNlYywgcHJlLCAzLCAnMCcpOworICAgIH0KKyAgICBpZiAobG9nX2RlY29yICYgUEpfTE9HX0hBU19TRU5ERVIpIHsKKwllbnVtIHsgU0VOREVSX1dJRFRIID0gMTQgfTsKKwlwal9zaXplX3Qgc2VuZGVyX2xlbiA9IHN0cmxlbihzZW5kZXIpOworCWlmIChwcmUhPWxvZ19idWZmZXIpICpwcmUrKyA9ICcgJzsKKwlpZiAoc2VuZGVyX2xlbiA8PSBTRU5ERVJfV0lEVEgpIHsKKwkgICAgd2hpbGUgKHNlbmRlcl9sZW4gPCBTRU5ERVJfV0lEVEgpCisJCSpwcmUrKyA9ICcgJywgKytzZW5kZXJfbGVuOworCSAgICB3aGlsZSAoKnNlbmRlcikKKwkJKnByZSsrID0gKnNlbmRlcisrOworCX0gZWxzZSB7CisJICAgIGludCBpOworCSAgICBmb3IgKGk9MDsgaTxTRU5ERVJfV0lEVEg7ICsraSkKKwkJKnByZSsrID0gKnNlbmRlcisrOworCX0KKyAgICB9CisgICAgaWYgKGxvZ19kZWNvciAmIFBKX0xPR19IQVNfVEhSRUFEX0lEKSB7CisJZW51bSB7IFRIUkVBRF9XSURUSCA9IDEyIH07CisJY29uc3QgY2hhciAqdGhyZWFkX25hbWUgPSBwal90aHJlYWRfZ2V0X25hbWUocGpfdGhyZWFkX3RoaXMoKSk7CisJcGpfc2l6ZV90IHRocmVhZF9sZW4gPSBzdHJsZW4odGhyZWFkX25hbWUpOworCSpwcmUrKyA9ICcgJzsKKwlpZiAodGhyZWFkX2xlbiA8PSBUSFJFQURfV0lEVEgpIHsKKwkgICAgd2hpbGUgKHRocmVhZF9sZW4gPCBUSFJFQURfV0lEVEgpCisJCSpwcmUrKyA9ICcgJywgKyt0aHJlYWRfbGVuOworCSAgICB3aGlsZSAoKnRocmVhZF9uYW1lKQorCQkqcHJlKysgPSAqdGhyZWFkX25hbWUrKzsKKwl9IGVsc2UgeworCSAgICBpbnQgaTsKKwkgICAgZm9yIChpPTA7IGk8VEhSRUFEX1dJRFRIOyArK2kpCisJCSpwcmUrKyA9ICp0aHJlYWRfbmFtZSsrOworCX0KKyAgICB9CisKKyAgICBpZiAobG9nX2RlY29yICE9IDAgJiYgbG9nX2RlY29yICE9IFBKX0xPR19IQVNfTkVXTElORSkKKwkqcHJlKysgPSAnICc7CisKKyAgICBpZiAobG9nX2RlY29yICYgUEpfTE9HX0hBU19USFJFQURfU1dDKSB7CisJdm9pZCAqY3VycmVudF90aHJlYWQgPSAodm9pZCopcGpfdGhyZWFkX3RoaXMoKTsKKwlpZiAoY3VycmVudF90aHJlYWQgIT0gZ19sYXN0X3RocmVhZCkgeworCSAgICAqcHJlKysgPSAnISc7CisJICAgIGdfbGFzdF90aHJlYWQgPSBjdXJyZW50X3RocmVhZDsKKwl9IGVsc2UgeworCSAgICAqcHJlKysgPSAnICc7CisJfQorICAgIH0gZWxzZSBpZiAobG9nX2RlY29yICYgUEpfTE9HX0hBU19TUEFDRSkgeworCSpwcmUrKyA9ICcgJzsKKyAgICB9CisKKyNpZiBQSl9MT0dfRU5BQkxFX0lOREVOVAorICAgIGlmIChsb2dfZGVjb3IgJiBQSl9MT0dfSEFTX0lOREVOVCkgeworCWluZGVudCA9IGxvZ19nZXRfaW5kZW50KCk7CisJaWYgKGluZGVudCA+IDApIHsKKwkgICAgcGpfbWVtc2V0KHByZSwgUEpfTE9HX0lOREVOVF9DSEFSLCBpbmRlbnQpOworCSAgICBwcmUgKz0gaW5kZW50OworCX0KKyAgICB9CisjZW5kaWYKKworICAgIGxlbiA9IChpbnQpKHByZSAtIGxvZ19idWZmZXIpOworCisgICAgLyogUHJpbnQgdGhlIHdob2xlIG1lc3NhZ2UgdG8gdGhlIHN0cmluZyBsb2dfYnVmZmVyLiAqLworICAgIHByaW50X2xlbiA9IHBqX2Fuc2lfdnNucHJpbnRmKHByZSwgc2l6ZW9mKGxvZ19idWZmZXIpLWxlbiwgZm9ybWF0LCAKKwkJCQkgIG1hcmtlcik7CisgICAgaWYgKHByaW50X2xlbiA8IDApIHsKKwlsZXZlbCA9IDE7CisJcHJpbnRfbGVuID0gcGpfYW5zaV9zbnByaW50ZihwcmUsIHNpemVvZihsb2dfYnVmZmVyKS1sZW4sIAorCQkJCSAgICAgIjxsb2dnaW5nIGVycm9yOiBtc2cgdG9vIGxvbmc+Iik7CisgICAgfQorICAgIGxlbiA9IGxlbiArIHByaW50X2xlbjsKKyAgICBpZiAobGVuID4gMCAmJiBsZW4gPCAoaW50KXNpemVvZihsb2dfYnVmZmVyKS0yKSB7CisJaWYgKGxvZ19kZWNvciAmIFBKX0xPR19IQVNfQ1IpIHsKKwkgICAgbG9nX2J1ZmZlcltsZW4rK10gPSAnXHInOworCX0KKwlpZiAobG9nX2RlY29yICYgUEpfTE9HX0hBU19ORVdMSU5FKSB7CisJICAgIGxvZ19idWZmZXJbbGVuKytdID0gJ1xuJzsKKwl9CisJbG9nX2J1ZmZlcltsZW5dID0gJ1wwJzsKKyAgICB9IGVsc2UgeworCWxlbiA9IHNpemVvZihsb2dfYnVmZmVyKS0xOworCWlmIChsb2dfZGVjb3IgJiBQSl9MT0dfSEFTX0NSKSB7CisJICAgIGxvZ19idWZmZXJbc2l6ZW9mKGxvZ19idWZmZXIpLTNdID0gJ1xyJzsKKwl9CisJaWYgKGxvZ19kZWNvciAmIFBKX0xPR19IQVNfTkVXTElORSkgeworCSAgICBsb2dfYnVmZmVyW3NpemVvZihsb2dfYnVmZmVyKS0yXSA9ICdcbic7CisJfQorCWxvZ19idWZmZXJbc2l6ZW9mKGxvZ19idWZmZXIpLTFdID0gJ1wwJzsKKyAgICB9CisKKyAgICAvKiBJdCBzaG91bGQgYmUgc2FmZSB0byByZXN1bWUgbG9nZ2luZyBhdCB0aGlzIHBvaW50LiBBcHBsaWNhdGlvbiBjYW4KKyAgICAgKiByZWN1cnNpdmVseSBjYWxsIHRoZSBsb2dnaW5nIGZ1bmN0aW9uIGluc2lkZSB0aGUgY2FsbGJhY2suCisgICAgICovCisgICAgcmVzdW1lX2xvZ2dpbmcoJnNhdmVkX2xldmVsKTsKKworICAgIGlmIChsb2dfd3JpdGVyKQorCSgqbG9nX3dyaXRlcikobGV2ZWwsIGxvZ19idWZmZXIsIGxlbik7Cit9CisKKy8qCitQSl9ERUYodm9pZCkgcGpfbG9nXzAoY29uc3QgY2hhciAqb2JqLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZzsKKyAgICB2YV9zdGFydChhcmcsIGZvcm1hdCk7CisgICAgcGpfbG9nKG9iaiwgMCwgZm9ybWF0LCBhcmcpOworICAgIHZhX2VuZChhcmcpOworfQorKi8KKworUEpfREVGKHZvaWQpIHBqX2xvZ18xKGNvbnN0IGNoYXIgKm9iaiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmc7CisgICAgdmFfc3RhcnQoYXJnLCBmb3JtYXQpOworICAgIHBqX2xvZyhvYmosIDEsIGZvcm1hdCwgYXJnKTsKKyAgICB2YV9lbmQoYXJnKTsKK30KKyNlbmRpZgkvKiBQSl9MT0dfTUFYX0xFVkVMID49IDEgKi8KKworI2lmIFBKX0xPR19NQVhfTEVWRUwgPj0gMgorUEpfREVGKHZvaWQpIHBqX2xvZ18yKGNvbnN0IGNoYXIgKm9iaiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmc7CisgICAgdmFfc3RhcnQoYXJnLCBmb3JtYXQpOworICAgIHBqX2xvZyhvYmosIDIsIGZvcm1hdCwgYXJnKTsKKyAgICB2YV9lbmQoYXJnKTsKK30KKyNlbmRpZgorCisjaWYgUEpfTE9HX01BWF9MRVZFTCA+PSAzCitQSl9ERUYodm9pZCkgcGpfbG9nXzMoY29uc3QgY2hhciAqb2JqLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZzsKKyAgICB2YV9zdGFydChhcmcsIGZvcm1hdCk7CisgICAgcGpfbG9nKG9iaiwgMywgZm9ybWF0LCBhcmcpOworICAgIHZhX2VuZChhcmcpOworfQorI2VuZGlmCisKKyNpZiBQSl9MT0dfTUFYX0xFVkVMID49IDQKK1BKX0RFRih2b2lkKSBwal9sb2dfNChjb25zdCBjaGFyICpvYmosIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnOworICAgIHZhX3N0YXJ0KGFyZywgZm9ybWF0KTsKKyAgICBwal9sb2cob2JqLCA0LCBmb3JtYXQsIGFyZyk7CisgICAgdmFfZW5kKGFyZyk7Cit9CisjZW5kaWYKKworI2lmIFBKX0xPR19NQVhfTEVWRUwgPj0gNQorUEpfREVGKHZvaWQpIHBqX2xvZ181KGNvbnN0IGNoYXIgKm9iaiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmc7CisgICAgdmFfc3RhcnQoYXJnLCBmb3JtYXQpOworICAgIHBqX2xvZyhvYmosIDUsIGZvcm1hdCwgYXJnKTsKKyAgICB2YV9lbmQoYXJnKTsKK30KKyNlbmRpZgorCisjaWYgUEpfTE9HX01BWF9MRVZFTCA+PSA2CitQSl9ERUYodm9pZCkgcGpfbG9nXzYoY29uc3QgY2hhciAqb2JqLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZzsKKyAgICB2YV9zdGFydChhcmcsIGZvcm1hdCk7CisgICAgcGpfbG9nKG9iaiwgNiwgZm9ybWF0LCBhcmcpOworICAgIHZhX2VuZChhcmcpOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovbG9nX3dyaXRlcl9wcmludGsuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovbG9nX3dyaXRlcl9wcmludGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzVmYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9sb2dfd3JpdGVyX3ByaW50ay5jCkBAIC0wLDAgKzEsMjggQEAKKy8qICRJZDogbG9nX3dyaXRlcl9wcmludGsuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisKK1BKX0RFRih2b2lkKSBwal9sb2dfd3JpdGUoaW50IGxldmVsLCBjb25zdCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBwcmludGsoS0VSTl9JTkZPICIlcyIsIGJ1ZmZlcik7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovbG9nX3dyaXRlcl9zdGRvdXQuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovbG9nX3dyaXRlcl9zdGRvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWU1NDgyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9sb2dfd3JpdGVyX3N0ZG91dC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qICRJZDogbG9nX3dyaXRlcl9zdGRvdXQuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3N0ZGZpbGVpby5oPgorCisKK3N0YXRpYyB2b2lkIHRlcm1fc2V0X2NvbG9yKGludCBsZXZlbCkKK3sKKyNpZiBkZWZpbmVkKFBKX1RFUk1fSEFTX0NPTE9SKSAmJiBQSl9URVJNX0hBU19DT0xPUiAhPSAwCisgICAgcGpfdGVybV9zZXRfY29sb3IocGpfbG9nX2dldF9jb2xvcihsZXZlbCkpOworI2Vsc2UKKyAgICBQSl9VTlVTRURfQVJHKGxldmVsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB0ZXJtX3Jlc3RvcmVfY29sb3Iodm9pZCkKK3sKKyNpZiBkZWZpbmVkKFBKX1RFUk1fSEFTX0NPTE9SKSAmJiBQSl9URVJNX0hBU19DT0xPUiAhPSAwCisgICAgLyogU2V0IHRlcm1pbmFsIHRvIGl0cyBkZWZhdWx0IGNvbG9yICovCisgICAgcGpfdGVybV9zZXRfY29sb3IocGpfbG9nX2dldF9jb2xvcig3NykpOworI2VuZGlmCit9CisKKworUEpfREVGKHZvaWQpIHBqX2xvZ193cml0ZShpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX1VOVVNFRF9BUkcobGVuKTsKKworICAgIC8qIENvcHkgdG8gdGVybWluYWwvZmlsZS4gKi8KKyAgICBpZiAocGpfbG9nX2dldF9kZWNvcigpICYgUEpfTE9HX0hBU19DT0xPUikgeworCXRlcm1fc2V0X2NvbG9yKGxldmVsKTsKKwlwcmludGYoIiVzIiwgYnVmZmVyKTsKKwl0ZXJtX3Jlc3RvcmVfY29sb3IoKTsKKyAgICB9IGVsc2UgeworCXByaW50ZigiJXMiLCBidWZmZXIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9sb2dfd3JpdGVyX3N5bWJpYW5fY29uc29sZS5jcHAgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL2xvZ193cml0ZXJfc3ltYmlhbl9jb25zb2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjUzOTRlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9sb2dfd3JpdGVyX3N5bWJpYW5fY29uc29sZS5jcHAKQEAgLTAsMCArMSw0NCBAQAorLyogJElkOiBsb2dfd3JpdGVyX3N5bWJpYW5fY29uc29sZS5jcHAgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL3VuaWNvZGUuaD4KKworI2luY2x1ZGUgIm9zX3N5bWJpYW4uaCIKKyNpbmNsdWRlIDxlMzJjb25zLmg+CisKK1BKX0RFRih2b2lkKSBwal9sb2dfd3JpdGUoaW50IGxldmVsLCBjb25zdCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisjaWYgMAorICAgIHdjaGFyX3Qgd2J1ZmZlcltQSl9MT0dfTUFYX1NJWkVdOworICAgIENDb25zb2xlQmFzZSAqY29ucyA9IFBqU3ltYmlhbk9TOjpJbnN0YW5jZS0+Q29uc29sZSgpOworCisgICAgcGpfYW5zaV90b191bmljb2RlKGJ1ZmZlciwgbGVuLCB3YnVmZmVyLCBQSl9BUlJBWV9TSVpFKHdidWZmZXIpKTsKKworICAgIAorICAgIFRQdHJDMTYgYVB0cigoVFVpbnQxNiopd2J1ZmZlciwgbGVuKTsKKyAgICBjb25zb2xlLT5Xcml0ZShhUHRyKTsKKyNlbHNlCisgICAgUEpfVU5VU0VEX0FSRyhsZXZlbCk7CisgICAgUEpfVU5VU0VEX0FSRyhidWZmZXIpOworICAgIFBKX1VOVVNFRF9BUkcobGVuKTsKKyNlbmRpZgorfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2NvcmVfZGFyd2luLm0gYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2NvcmVfZGFyd2luLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzZjQyNQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfY29yZV9kYXJ3aW4ubQpAQCAtMCwwICsxLDEwMCBAQAorLyogJElkOiBvc19jb3JlX2Rhcndpbi5tIDM2NzAgMjAxMS0wNy0yMCAwMzowMDo0OFogbWluZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgIlRhcmdldENvbmRpdGlvbmFscy5oIgorCisjaWYgVEFSR0VUX09TX0lQSE9ORQorCitQSl9ERUYoaW50KSBwal9ydW5fYXBwKHBqX21haW5fZnVuY19wdHIgbWFpbl9mdW5jLCBpbnQgYXJnYywgY2hhciAqYXJndltdLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICByZXR1cm4gKCptYWluX2Z1bmMpKGFyZ2MsIGFyZ3YpOworfQorCisjZWxzZQorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPEFwcEtpdC9BcHBLaXQuaD4KKyNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRlJ1bkxvb3AuaD4KKyNpbmNsdWRlIDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2RlZmluZSBUSElTX0ZJTEUgICAib3NfY29yZV9kYXJ3aW4ubSIKKwordHlwZWRlZiBzdHJ1Y3QgcnVuX2FwcF90IHsKKyAgICBwal9tYWluX2Z1bmNfcHRyICBtYWluX2Z1bmM7CisgICAgaW50ICAgICAgICAgICAgICAgYXJnYzsKKyAgICBjaGFyICAgICAgICAgICAgKiphcmd2OworICAgIGludCAgICAgICAgICAgICAgIHJldHZhbDsKK30gcnVuX2FwcF90OworCitAaW50ZXJmYWNlIERlYWRUaHJlYWQ6IE5TT2JqZWN0IHsgOzsgfQorKyAodm9pZCllbnRlck11bHRpVGhyZWFkZWRNb2RlOworKyAodm9pZCllbXB0eVRocmVhZE1ldGhvZDooaWQpb2JqOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gRGVhZFRocmVhZAorKyAodm9pZCllbnRlck11bHRpVGhyZWFkZWRNb2RlCit7CisgICAgW05TVGhyZWFkIGRldGFjaE5ld1RocmVhZFNlbGVjdG9yOkBzZWxlY3RvcihlbXB0eVRocmVhZE1ldGhvZDopCisgICAgICAgICAgICAgIHRvVGFyZ2V0OltEZWFkVGhyZWFkIGNsYXNzXSB3aXRoT2JqZWN0Om5pbF07Cit9CisKKysgKHZvaWQpZW1wdHlUaHJlYWRNZXRob2Q6KGlkKW9iaiB7IDsgfQorQGVuZAorCitzdGF0aWMgdm9pZCogbWFpbl90aHJlYWQodm9pZCAqZGF0YSkKK3sKKyAgICBydW5fYXBwX3QgKnBhcmFtID0gKHJ1bl9hcHBfdCAqKWRhdGE7CisgICAgCisgICAgcGFyYW0tPnJldHZhbCA9ICgqcGFyYW0tPm1haW5fZnVuYykocGFyYW0tPmFyZ2MsIHBhcmFtLT5hcmd2KTsKKyAgICBDRlJ1bkxvb3BTdG9wKENGUnVuTG9vcEdldE1haW4oKSk7CisgICAgCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBwal9ydW5fYXBwKCkKKyAqIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4gVGhlIHB1cnBvc2Ugb2YKKyAqIHRoaXMgZnVuY3Rpb24gaXMgdG8gaW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb24ncyBtZW1vcnkgcG9vbCwgZXZlbnQKKyAqIGxvb3AgbWFuYWdlbWVudCwgYW5kIG11bHRpLXRocmVhZGluZyBlbnZpcm9ubWVudC4KKyAqLworUEpfREVGKGludCkgcGpfcnVuX2FwcChwal9tYWluX2Z1bmNfcHRyIG1haW5fZnVuYywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgcHRocmVhZF90IHRocmVhZDsKKyAgICBydW5fYXBwX3QgcGFyYW07CisgICAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2w7CisgICAgCisgICAgcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworICAgIFtOU0FwcGxpY2F0aW9uIHNoYXJlZEFwcGxpY2F0aW9uXTsKKyAgICBbRGVhZFRocmVhZCBlbnRlck11bHRpVGhyZWFkZWRNb2RlXTsKKworICAgIHBhcmFtLmFyZ2MgPSBhcmdjOworICAgIHBhcmFtLmFyZ3YgPSAoY2hhciAqKilhcmd2OworICAgIHBhcmFtLm1haW5fZnVuYyA9IG1haW5fZnVuYzsKKyAgICBpZiAocHRocmVhZF9jcmVhdGUoJnRocmVhZCwgTlVMTCwgJm1haW5fdGhyZWFkLCAmcGFyYW0pID09IDApIHsKKyAgICAgICAgQ0ZSdW5Mb29wUnVuKCk7CisgICAgfQorICAgIAorICAgIFBKX1VOVVNFRF9BUkcocG9vbCk7CisgICAgCisgICAgcmV0dXJuIHBhcmFtLnJldHZhbDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2NvcmVfbGludXhfa2VybmVsLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2NvcmVfbGludXhfa2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4NjVlZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfY29yZV9saW51eF9rZXJuZWwuYwpAQCAtMCwwICsxLDY5OCBAQAorLyogJElkOiBvc19jb3JlX2xpbnV4X2tlcm5lbC5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovZXhjZXB0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvaGlnaF9wcmVjaXNpb24uaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc3ByaW50Zi5oPgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIGRlZmluZWQoTU9EVkVSU0lPTlMpCisjaW5jbHVkZSA8bGludXgvbW9kdmVyc2lvbnMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisvLyNpbmNsdWRlIDxsaW51eC90cXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2RlZmluZSBUSElTX0ZJTEUgICAib3NsaW51eGtlcm4iCisKK3N0cnVjdCBwal90aHJlYWRfdAoreworICAgIC8qKiBUaHJlYWQncyBuYW1lLiAqLworICAgIGNoYXIgb2JqX25hbWVbUEpfTUFYX09CSl9OQU1FXTsKKworICAgIC8qKiBMaW51eCB0YXNrIHN0cnVjdHVyZSBmb3IgdGhyZWFkLiAqLworICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGhyZWFkOwkKKworICAgIC8qKiBGbGFncyAoc3BlY2lmaWVkIGluIHBqX3RocmVhZF9jcmVhdGUpICovCisgICAgdW5zaWduZWQgZmxhZ3M7CisKKyAgICAvKiogVGFzayBxdWV1ZSBuZWVkZWQgdG8gbGF1bmNoIHRocmVhZC4gKi8KKyAgICAvL3N0cnVjdCB0cV9zdHJ1Y3QJdHE7CQorCisgICAgLyoqIFNlbWFwaG9yZSBuZWVkZWQgdG8gY29udHJvbCB0aHJlYWQgc3RhcnR1cC4gKi8KKyAgICBzdHJ1Y3Qgc2VtYXBob3JlCXN0YXJ0c3RvcF9zZW07CisKKyAgICAvKiogU2VtYXBob3JlIHRvIHN1c3BlbmQgdGhyZWFkIGR1cmluZyBzdGFydHVwLiAqLworICAgIHN0cnVjdCBzZW1hcGhvcmUJc3VzcGVuZF9zZW07CisKKyAgICAvKiogUXVldWUgdGhyZWFkIGlzIHdhaXRpbmcgb24uIEdldHMgaW5pdGlhbGl6ZWQgYnkKKyAgICAgICAgdGhyZWFkX2luaXRpYWxpemUsIGNhbiBiZSB1c2VkIGJ5IHRocmVhZCBpdHNlbGYuCisgICAgICovCisgICAgd2FpdF9xdWV1ZV9oZWFkX3QJcXVldWU7CisKKyAgICAvKiogRmxhZyB0byB0ZWxsIHRocmVhZCB3aGV0aGVyIHRvIGRpZSBvciBub3QuCisgICAgICAgIFdoZW4gdGhlIHRocmVhZCByZWNlaXZlcyBhIHNpZ25hbCwgaXQgbXVzdCBjaGVjaworICAgICAgICB0aGUgdmFsdWUgb2YgdGVybWluYXRlIGFuZCBjYWxsIHRocmVhZF9kZWluaXRpYWxpemUgYW5kIHRlcm1pbmF0ZQorICAgICAgICBpZiBzZXQuCisgICAgICovCisgICAgaW50IHRlcm1pbmF0ZTsgICAgCisKKyAgICAvKiogVGhyZWFkJ3MgZW50cnkuICovCisgICAgcGpfdGhyZWFkX3Byb2MgKmZ1bmM7CisKKyAgICAvKiogQXJndW1lbnQuICovCisgICAgdm9pZCAqYXJnOworfTsKKworc3RydWN0IHBqX2F0b21pY190Cit7CisgICAgYXRvbWljX3QgYXRvbTsKK307CisKK3N0cnVjdCBwal9tdXRleF90Cit7CisgICAgc3RydWN0IHNlbWFwaG9yZSBzZW07CisgICAgcGpfYm9vbF90CSAgICAgcmVjdXJzaXZlOworICAgIHBqX3RocmVhZF90CSAgICAqb3duZXI7CisgICAgaW50CQkgICAgIG93bl9jb3VudDsKK307CisKK3N0cnVjdCBwal9zZW1fdAoreworICAgIHN0cnVjdCBzZW1hcGhvcmUgc2VtOworfTsKKworLyoKKyAqIFN0YXRpYyBnbG9iYWwgdmFyaWFibGVzLgorICovCisjZGVmaW5lIE1BWF9UTFNfSUQgIDMyCitzdGF0aWMgdm9pZCAqdGxzX3ZhbHVlc1tNQVhfVExTX0lEXTsKK3N0YXRpYyBpbnQgdGxzX2lkOworc3RhdGljIGxvbmcgdGhyZWFkX3Rsc19pZDsKK3N0YXRpYyBzcGlubG9ja190IGNyaXRpY2FsX3NlY3Rpb24gPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzcGlubG9ja19mbGFnczsKK3N0YXRpYyBwal90aHJlYWRfdCBtYWluX3RocmVhZDsKKworLyogcHJpdmF0ZSBmdW5jdGlvbnMgKi8KKy8vI2RlZmluZSBUUkFDRV8oZXhwcikJUEpfTE9HKDMsZXhwcikKKyNkZWZpbmUgVFJBQ0VfKHgpCisKKworLyogVGhpcyBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbmV3IHRocmVhZC4gKi8KK3N0YXRpYyB2b2lkIHRocmVhZF9pbml0aWFsaXplKCBwal90aHJlYWRfdCAqdGhyZWFkICkKK3sKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgIi0tLW5ldyB0aHJlYWQgaW5pdGlhbGl6aW5nLi4uIikpOworCisgICAgLyogU2V0IFRMUyAqLworICAgIHBqX3RocmVhZF9sb2NhbF9zZXQodGhyZWFkX3Rsc19pZCwgdGhyZWFkKTsKKworICAgIC8qIGZpbGwgaW4gdGhyZWFkIHN0cnVjdHVyZSAqLworICAgIHRocmVhZC0+dGhyZWFkID0gY3VycmVudDsKKyAgICBwal9hc3NlcnQodGhyZWFkLT50aHJlYWQgIT0gTlVMTCk7CisKKyAgICAvKiBzZXQgc2lnbmFsIG1hc2sgdG8gd2hhdCB3ZSB3YW50IHRvIHJlc3BvbmQgKi8KKyAgICBzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCAKKwkJICBzaWdtYXNrKFNJR0tJTEwpfHNpZ21hc2soU0lHSU5UKXxzaWdtYXNrKFNJR1RFUk0pKTsKKworICAgIC8qIGluaXRpYWxpc2Ugd2FpdCBxdWV1ZSAqLworICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnRocmVhZC0+cXVldWUpOworCisgICAgLyogaW5pdGlhbGlzZSB0ZXJtaW5hdGlvbiBmbGFnICovCisgICAgdGhyZWFkLT50ZXJtaW5hdGUgPSAwOworCisgICAgLyogc2V0IG5hbWUgb2YgdGhpcyBwcm9jZXNzIChtYWtpbmcgc3VyZSBvYmpfbmFtZSBpcyBudWxsIAorICAgICAqIHRlcm1pbmF0ZWQgZmlyc3QpIAorICAgICAqLworICAgIHRocmVhZC0+b2JqX25hbWVbUEpfTUFYX09CSl9OQU1FLTFdID0gJ1wwJzsKKyAgICBzcHJpbnRmKGN1cnJlbnQtPmNvbW0sIHRocmVhZC0+b2JqX25hbWUpOworICAgICAgICAKKyAgICAvKiB0ZWxsIHRoZSBjcmVhdG9yIHRoYXQgd2UgYXJlIHJlYWR5IGFuZCBsZXQgaGltIGNvbnRpbnVlICovCisgICAgdXAoJnRocmVhZC0+c3RhcnRzdG9wX3NlbSk7CQorfQorCisvKiBjbGVhbnVwIG9mIHRocmVhZC4gQ2FsbGVkIGJ5IHRoZSBleGl0aW5nIHRocmVhZC4gKi8KK3N0YXRpYyB2b2lkIHRocmVhZF9kZWluaXRpYWxpemUocGpfdGhyZWFkX3QgKnRocmVhZCkKK3sKKyAgICAvKiB3ZSBhcmUgdGVybWluYXRpbmcgKi8KKworICAgIC8qIGxvY2sgdGhlIGtlcm5lbCwgdGhlIGV4aXQgd2lsbCB1bmxvY2sgaXQgKi8KKyAgICB0aHJlYWQtPnRocmVhZCA9IE5VTEw7CisgICAgbWIoKTsKKworICAgIC8qIG5vdGlmeSB0aGUgc3RvcF9rdGhyZWFkKCkgcm91dGluZSB0aGF0IHdlIGFyZSB0ZXJtaW5hdGluZy4gKi8KKyAgICB1cCgmdGhyZWFkLT5zdGFydHN0b3Bfc2VtKTsKKworICAgIC8qIHRoZSBrZXJuZWxfdGhyZWFkIHRoYXQgY2FsbGVkIGNsb25lKCkgZG9lcyBhIGRvX2V4aXQgaGVyZS4gKi8KKworICAgIC8qIHRoZXJlIGlzIG5vIHJhY2UgaGVyZSBiZXR3ZWVuIGV4ZWN1dGlvbiBvZiB0aGUgImtpbGxlciIgYW5kIAorICAgICAgIHJlYWwgdGVybWluYXRpb24gb2YgdGhlIHRocmVhZCAocmFjZSB3aW5kb3cgYmV0d2VlbiB1cCBhbmQgZG9fZXhpdCksIAorICAgICAgIHNpbmNlIGJvdGggdGhlIHRocmVhZCBhbmQgdGhlICJraWxsZXIiIGZ1bmN0aW9uIGFyZSBydW5uaW5nIHdpdGggCisgICAgICAgdGhlIGtlcm5lbCBsb2NrIGhlbGQuCisgICAgICAgVGhlIGtlcm5lbCBsb2NrIHdpbGwgYmUgZnJlZWQgYWZ0ZXIgdGhlIHRocmVhZCBleGl0ZWQsIHNvIHRoZSBjb2RlCisgICAgICAgaXMgcmVhbGx5IG5vdCBleGVjdXRlZCBhbnltb3JlIGFzIHNvb24gYXMgdGhlIHVubG9hZCBmdW5jdGlvbnMgZ2V0cworICAgICAgIHRoZSBrZXJuZWwgbG9jayBiYWNrLgorICAgICAgIFRoZSBpbml0IHByb2Nlc3MgbWF5IG5vdCBoYXZlIG1hZGUgdGhlIGNsZWFudXAgb2YgdGhlIHByb2Nlc3MgaGVyZSwKKyAgICAgICBidXQgdGhlIGNsZWFudXAgY2FuIGJlIGRvbmUgc2FmZWx5IHdpdGggdGhlIG1vZHVsZSB1bmxvYWRlZC4KKyAgICAqLworCit9CisKK3N0YXRpYyBpbnQgdGhyZWFkX3Byb2Modm9pZCAqYXJnKQoreworICAgIHBqX3RocmVhZF90ICp0aHJlYWQgPSBhcmc7CisKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgIi0tLW5ldyB0aHJlYWQgc3RhcnRpbmchIikpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aHJlYWQuICovCisgICAgdGhyZWFkX2luaXRpYWxpemUoIHRocmVhZCApOworCisgICAgLyogV2FpdCBpZiBjcmVhdGVkIHN1c3BlbmRlZC4gKi8KKyAgICBpZiAodGhyZWFkLT5mbGFncyAmIFBKX1RIUkVBRF9TVVNQRU5ERUQpIHsKKwlUUkFDRV8oKFRISVNfRklMRSwgIi0tLW5ldyB0aHJlYWQgc3VzcGVuZGVkLi4uIikpOworCWRvd24oJnRocmVhZC0+c3VzcGVuZF9zZW0pOworICAgIH0KKworICAgIFRSQUNFXygoVEhJU19GSUxFLCAiLS0tbmV3IHRocmVhZCBydW5uaW5nLi4uIikpOworCisgICAgcGpfYXNzZXJ0KHRocmVhZC0+ZnVuYyAhPSBOVUxMKTsKKworICAgIC8qIENhbGwgdGhyZWFkJ3MgZW50cnkuICovCisgICAgKCp0aHJlYWQtPmZ1bmMpKHRocmVhZC0+YXJnKTsKKworICAgIFRSQUNFXygoVEhJU19GSUxFLCAiLS0tdGhyZWFkIGV4aXRpbmcuLi4iKSk7CisKKyAgICAvKiBDbGVhbnVwIHRocmVhZC4gKi8KKyAgICB0aHJlYWRfZGVpbml0aWFsaXplKHRocmVhZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogVGhlIHZlcnkgdGFzayBlbnRyeS4gKi8KK3N0YXRpYyB2b2lkIGt0aHJlYWRfbGF1bmNoZXIodm9pZCAqYXJnKQoreworICAgIFRSQUNFXygoVEhJU19GSUxFLCAiLi4ubGF1bmNoaW5nIHRocmVhZCEuLi4iKSk7CisgICAga2VybmVsX3RocmVhZCgmdGhyZWFkX3Byb2MsIGFyZywgMCk7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW5pdCh2b2lkKQoreworICAgIHBqX3N0YXR1c190IHJjOworCisgICAgUEpfTE9HKDUsICgicGpfaW5pdCIsICJJbml0aWFsaXppbmcgUEogTGlicmFyeS4uIikpOworCisgICAgcmMgPSBwal90aHJlYWRfaW5pdCgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiByYzsKKworICAgIC8qIEluaXRpYWxpemUgZXhjZXB0aW9uIElEIGZvciB0aGUgcG9vbC4gCisgICAgICogTXVzdCBkbyBzbyBhZnRlciBjcml0aWNhbCBzZWN0aW9uIGlzIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcmMgPSBwal9leGNlcHRpb25faWRfYWxsb2MoIlBKTElCL05vIG1lbW9yeSIsICZQSl9OT19NRU1PUllfRVhDRVBUSU9OKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal91aW50MzJfdCkgcGpfZ2V0cGlkKHZvaWQpCit7CisgICAgcmV0dXJuIDE7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGhyZWFkX3JlZ2lzdGVyICggY29uc3QgY2hhciAqY3N0cl90aHJlYWRfbmFtZSwKKwkJCQkJIHBqX3RocmVhZF9kZXNjIGRlc2MsCisJCQkJCSBwal90aHJlYWRfdCAqKnB0cl90aHJlYWQpCit7CisgICAgY2hhciBzdGFja19wdHI7CisgICAgcGpfdGhyZWFkX3QgKnRocmVhZCA9IChwal90aHJlYWRfdCAqKWRlc2M7CisgICAgcGpfc3RyX3QgdGhyZWFkX25hbWUgPSBwal9zdHIoKGNoYXIqKWNzdHJfdGhyZWFkX25hbWUpOworCisgICAgLyogU2l6ZSBzYW5pdHkgY2hlY2suICovCisgICAgaWYgKHNpemVvZihwal90aHJlYWRfZGVzYykgPCBzaXplb2YocGpfdGhyZWFkX3QpKSB7CisJcGpfYXNzZXJ0KCEiTm90IGVub3VnaCBwal90aHJlYWRfZGVzYyBzaXplISIpOworCXJldHVybiBQSl9FQlVHOworICAgIH0KKworICAgIC8qIElmIGEgdGhyZWFkIGRlc2NyaXB0b3IgaGFzIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUsIGp1c3QgcmV0dXJuIGl0LiAqLworICAgIGlmIChwal90aHJlYWRfbG9jYWxfZ2V0ICh0aHJlYWRfdGxzX2lkKSAhPSAwKSB7CisJLy8gMjAwNi0wMi0yNiBiZW5ueWxwOgorCS8vICBUaGlzIHdvdWxkbid0IHdvcmsgaW4gYWxsIGNhc2VzIS4KKwkvLyAgSWYgdGhyZWFkIGlzIGNyZWF0ZWQgYnkgZXh0ZXJuYWwgbW9kdWxlIChlLmcuIHNvdW5kIHRocmVhZCksCisJLy8gIHRocmVhZCBtYXkgYmUgcmV1c2VkIHdoaWxlIHRoZSBwb29sIHVzZWQgZm9yIHRoZSB0aHJlYWQgZGVzY3JpcHRvcgorCS8vICBoYXMgYmVlbiBkZWxldGVkIGJ5IGFwcGxpY2F0aW9uLgorCS8vKnRocmVhZF9wdHIgPSAocGpfdGhyZWFkX3QqKXBqX3RocmVhZF9sb2NhbF9nZXQgKHRocmVhZF90bHNfaWQpOworICAgICAgICAvL3JldHVybiBQSl9TVUNDRVNTOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgYW5kIHNldCB0aGUgdGhyZWFkIGVudHJ5LiAqLworICAgIHBqX2J6ZXJvKGRlc2MsIHNpemVvZihzdHJ1Y3QgcGpfdGhyZWFkX3QpKTsKKworICAgIGlmKGNzdHJfdGhyZWFkX25hbWUgJiYgcGpfc3RybGVuKCZ0aHJlYWRfbmFtZSkgPCBzaXplb2YodGhyZWFkLT5vYmpfbmFtZSktMSkKKwlwal9zcHJpbnRmKHRocmVhZC0+b2JqX25hbWUsIGNzdHJfdGhyZWFkX25hbWUsIHRocmVhZC0+dGhyZWFkKTsKKyAgICBlbHNlCisJcGpfc25wcmludGYodGhyZWFkLT5vYmpfbmFtZSwgc2l6ZW9mKHRocmVhZC0+b2JqX25hbWUpLCAKKwkJICAgICJ0aHIlcCIsICh2b2lkKil0aHJlYWQtPnRocmVhZCk7CisgICAgCisgICAgLyogSW5pdGlhbGl6ZS4gKi8KKyAgICB0aHJlYWRfaW5pdGlhbGl6ZSh0aHJlYWQpOworCisgICAgLyogRWF0IHNlbWFwaG9yZS4gKi8KKyAgICBkb3duKCZ0aHJlYWQtPnN0YXJ0c3RvcF9zZW0pOworCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyE9MAorICAgIHRocmVhZC0+c3RrX3N0YXJ0ID0gJnN0YWNrX3B0cjsKKyAgICB0aHJlYWQtPnN0a19zaXplID0gMHhGRkZGRkZGRlVMOworICAgIHRocmVhZC0+c3RrX21heF91c2FnZSA9IDA7CisjZWxzZQorICAgIHN0YWNrX3B0ciA9ICdcMCc7CisjZW5kaWYKKworICAgICpwdHJfdGhyZWFkID0gdGhyZWFkOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKK3BqX3N0YXR1c190IHBqX3RocmVhZF9pbml0KHZvaWQpCit7CisgICAgcGpfc3RhdHVzX3QgcmM7CisgICAgcGpfdGhyZWFkX3QgKmR1bW15OworICAgIAorICAgIHJjID0gcGpfdGhyZWFkX2xvY2FsX2FsbG9jKCZ0aHJlYWRfdGxzX2lkKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gcmM7CisKKyAgICByZXR1cm4gcGpfdGhyZWFkX3JlZ2lzdGVyKCJwamxpYi1tYWluIiwgKGxvbmcqKSZtYWluX3RocmVhZCwgJmR1bW15KTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsIGNvbnN0IGNoYXIgKnRocmVhZF9uYW1lLAorCQkJCSAgICAgIHBqX3RocmVhZF9wcm9jICpwcm9jLCB2b2lkICphcmcsCisJCQkJICAgICAgcGpfc2l6ZV90IHN0YWNrX3NpemUsIHVuc2lnbmVkIGZsYWdzLAorCQkJCSAgICAgIHBqX3RocmVhZF90ICoqcHRyX3RocmVhZCkKK3sKKyAgICBwal90aHJlYWRfdCAqdGhyZWFkOworCisgICAgVFJBQ0VfKChUSElTX0ZJTEUsICJwal90aHJlYWRfY3JlYXRlKCkiKSk7CisgICAgCisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIHByb2MgJiYgcHRyX3RocmVhZCwgUEpfRUlOVkFMKTsKKworICAgIHRocmVhZCA9IHBqX3Bvb2xfemFsbG9jKHBvb2wsIHNpemVvZihwal90aHJlYWRfdCkpOworICAgIGlmICghdGhyZWFkKQorCXJldHVybiBQSl9FTk9NRU07CisKKyAgICBQSl9VTlVTRURfQVJHKHN0YWNrX3NpemUpOworCisgICAgLyogVGhyZWFkIG5hbWUuICovCisgICAgaWYgKCF0aHJlYWRfbmFtZSkgCisJdGhyZWFkX25hbWUgPSAidGhyJXAiOworICAgIAorICAgIGlmIChzdHJjaHIodGhyZWFkX25hbWUsICclJykpIHsKKwlwal9zbnByaW50Zih0aHJlYWQtPm9ial9uYW1lLCBQSl9NQVhfT0JKX05BTUUsIHRocmVhZF9uYW1lLCB0aHJlYWQpOworICAgIH0gZWxzZSB7CisJc3RybmNweSh0aHJlYWQtPm9ial9uYW1lLCB0aHJlYWRfbmFtZSwgUEpfTUFYX09CSl9OQU1FKTsKKwl0aHJlYWQtPm9ial9uYW1lW1BKX01BWF9PQkpfTkFNRS0xXSA9ICdcMCc7CisgICAgfQorICAgIAorICAgIC8qIEluaXQgdGhyZWFkJ3Mgc2VtYXBob3JlLiAqLworICAgIFRSQUNFXygoVEhJU19GSUxFLCAiLi4uaW5pdCBzZW1hcGhvcmVzLi4uIikpOworICAgIGluaXRfTVVURVhfTE9DS0VEKCZ0aHJlYWQtPnN0YXJ0c3RvcF9zZW0pOworICAgIGluaXRfTVVURVhfTE9DS0VEKCZ0aHJlYWQtPnN1c3BlbmRfc2VtKTsKKworICAgIHRocmVhZC0+ZmxhZ3MgPSBmbGFnczsKKworICAgIGlmICgoZmxhZ3MgJiBQSl9USFJFQURfU1VTUEVOREVEKSA9PSAwKSB7CisJdXAoJnRocmVhZC0+c3VzcGVuZF9zZW0pOworICAgIH0KKworICAgIC8qIFN0b3JlIHRoZSBmdW5jdGlvbnMgYW5kIGFyZ3VtZW50LiAqLworICAgIHRocmVhZC0+ZnVuYyA9IHByb2M7CisgICAgdGhyZWFkLT5hcmcgPSBhcmc7CisgICAgCisgICAgLyogU2F2ZSByZXR1cm4gdmFsdWUuICovCisgICAgKnB0cl90aHJlYWQgPSB0aHJlYWQ7CisgICAgCisgICAgLyogQ3JlYXRlIHRoZSBuZXcgdGhyZWFkIGJ5IHJ1bm5pbmcgYSB0YXNrIHRocm91Z2gga2V2ZW50ZC4gKi8KKworI2lmIDAKKyAgICAvKiBJbml0aWFsaXplIHRoZSB0YXNrIHF1ZXVlIHN0cnVjdC4gKi8KKyAgICB0aHJlYWQtPnRxLnN5bmMgPSAwOworICAgIElOSVRfTElTVF9IRUFEKCZ0aHJlYWQtPnRxLmxpc3QpOworICAgIHRocmVhZC0+dHEucm91dGluZSA9IGt0aHJlYWRfbGF1bmNoZXI7CisgICAgdGhyZWFkLT50cS5kYXRhID0gdGhyZWFkOworCisgICAgLyogYW5kIHNjaGVkdWxlIGl0IGZvciBleGVjdXRpb24uICovCisgICAgc2NoZWR1bGVfdGFzaygmdGhyZWFkLT50cSk7CisjZW5kaWYKKyAgICBrdGhyZWFkX2xhdW5jaGVyKHRocmVhZCk7CisKKyAgICAvKiBXYWl0IHVudGlsIHRocmVhZCBoYXMgcmVhY2hlZCB0aGUgc2V0dXBfdGhyZWFkIHJvdXRpbmUuICovCisgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIuLi53YWl0IGZvciB0aGUgbmV3IHRocmVhZC4uLiIpKTsKKyAgICBkb3duKCZ0aHJlYWQtPnN0YXJ0c3RvcF9zZW0pOworCisgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIuLi5tYWluIHRocmVhZCByZXN1bWVkLi4uIikpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYoY29uc3QgY2hhciopIHBqX3RocmVhZF9nZXRfbmFtZShwal90aHJlYWRfdCAqdGhyZWFkKQoreworICAgIHJldHVybiB0aHJlYWQtPm9ial9uYW1lOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9yZXN1bWUocGpfdGhyZWFkX3QgKnRocmVhZCkKK3sKKyAgICB1cCgmdGhyZWFkLT5zdXNwZW5kX3NlbSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal90aHJlYWRfdCopIHBqX3RocmVhZF90aGlzKHZvaWQpCit7CisgICAgcmV0dXJuIChwal90aHJlYWRfdCopcGpfdGhyZWFkX2xvY2FsX2dldCh0aHJlYWRfdGxzX2lkKTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfam9pbihwal90aHJlYWRfdCAqcCkKK3sKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgInBqX3RocmVhZF9qb2luKCkiKSk7CisgICAgZG93bigmcC0+c3RhcnRzdG9wX3NlbSk7CisgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIgIGpvaW5lZCEiKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGhyZWFkX2Rlc3Ryb3kocGpfdGhyZWFkX3QgKnRocmVhZCkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHRocmVhZCAhPSBOVUxMLCBQSl9FSU5WQUxJRE9QKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfc2xlZXAodW5zaWduZWQgbXNlYykKK3sKKyAgICBwal9oaWdocHJlY190IHRpY2tzOworICAgIHBqX3RocmVhZF90ICp0aHJlYWQgPSBwal90aHJlYWRfdGhpcygpOworCisgICAgUEpfQVNTRVJUX1JFVFVSTih0aHJlYWQgIT0gTlVMTCwgUEpfRUJVRyk7CisgICAgCisgICAgLyogVXNlIGhpZ2ggcHJlY2lzaW9uIGNhbGN1bGF0aW9uIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAorICAgICAqIGNyb3AgdmFsdWVzOgorICAgICAqCisgICAgICoJdGlja3MgPSBIWiAqIG1zZWMgLyAxMDAwCisgICAgICovCisgICAgdGlja3MgPSBIWjsKKyAgICBwal9oaWdocHJlY19tdWwodGlja3MsIG1zZWMpOworICAgIHBqX2hpZ2hwcmVjX2Rpdih0aWNrcywgMTAwMCk7CisKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgInRoaXMgdGhyZWFkIHdpbGwgc2xlZXAgZm9yICV1IHRpY2tzIiwgdGlja3MpKTsKKyAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoICZ0aHJlYWQtPnF1ZXVlLCB0aWNrcyk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUEpfREVGKHBqX3N0YXR1c190KSBwal9hdG9taWNfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsIAorCQkJCSAgICAgIHBqX2F0b21pY192YWx1ZV90IHZhbHVlLAorCQkJCSAgICAgIHBqX2F0b21pY190ICoqcHRyX3ZhcikKK3sKKyAgICBwal9hdG9taWNfdCAqdCA9IHBqX3Bvb2xfY2FsbG9jKHBvb2wsIDEsIHNpemVvZihwal9hdG9taWNfdCkpOworICAgIGlmICghdCkgcmV0dXJuIFBKX0VOT01FTTsKKworICAgIGF0b21pY19zZXQoJnQtPmF0b20sIHZhbHVlKTsKKyAgICAqcHRyX3ZhciA9IHQ7CisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfYXRvbWljX2Rlc3Ryb3koIHBqX2F0b21pY190ICp2YXIgKQoreworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYodm9pZCkgcGpfYXRvbWljX3NldChwal9hdG9taWNfdCAqdmFyLCBwal9hdG9taWNfdmFsdWVfdCB2YWx1ZSkKK3sKKyAgICBhdG9taWNfc2V0KCZ2YXItPmF0b20sIHZhbHVlKTsKK30KKworUEpfREVGKHBqX2F0b21pY192YWx1ZV90KSBwal9hdG9taWNfZ2V0KHBqX2F0b21pY190ICp2YXIpCit7CisgICAgcmV0dXJuIGF0b21pY19yZWFkKCZ2YXItPmF0b20pOworfQorCitQSl9ERUYodm9pZCkgcGpfYXRvbWljX2luYyhwal9hdG9taWNfdCAqdmFyKQoreworICAgIGF0b21pY19pbmMoJnZhci0+YXRvbSk7Cit9CisKK1BKX0RFRih2b2lkKSBwal9hdG9taWNfZGVjKHBqX2F0b21pY190ICp2YXIpCit7CisgICAgYXRvbWljX2RlYygmdmFyLT5hdG9tKTsKK30KKworUEpfREVGKHZvaWQpIHBqX2F0b21pY19hZGQoIHBqX2F0b21pY190ICp2YXIsIHBqX2F0b21pY192YWx1ZV90IHZhbHVlICkKK3sKKyAgICBhdG9taWNfYWRkKHZhbHVlLCAmdmFyLT5hdG9tKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9sb2NhbF9hbGxvYyhsb25nICppbmRleCkKK3sKKyAgICBpZiAodGxzX2lkID49IE1BWF9UTFNfSUQpCisJcmV0dXJuIFBKX0VUT09NQU5ZOworICAgIAorICAgICppbmRleCA9IHRsc19pZCsrOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRih2b2lkKSBwal90aHJlYWRfbG9jYWxfZnJlZShsb25nIGluZGV4KQoreworICAgIHBqX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgTUFYX1RMU19JRCk7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGhyZWFkX2xvY2FsX3NldChsb25nIGluZGV4LCB2b2lkICp2YWx1ZSkKK3sKKyAgICBwal9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IE1BWF9UTFNfSUQpOworICAgIHRsc192YWx1ZXNbaW5kZXhdID0gdmFsdWU7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRih2b2lkKikgcGpfdGhyZWFkX2xvY2FsX2dldChsb25nIGluZGV4KQoreworICAgIHBqX2Fzc2VydChpbmRleCA+PSAwICYmIGluZGV4IDwgTUFYX1RMU19JRCk7CisgICAgcmV0dXJuIHRsc192YWx1ZXNbaW5kZXhdOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1BKX0RFRih2b2lkKSBwal9lbnRlcl9jcml0aWNhbF9zZWN0aW9uKHZvaWQpCit7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNyaXRpY2FsX3NlY3Rpb24sIHNwaW5sb2NrX2ZsYWdzKTsKK30KKworUEpfREVGKHZvaWQpIHBqX2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24odm9pZCkKK3sKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcml0aWNhbF9zZWN0aW9uLCBzcGlubG9ja19mbGFncyk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUEpfREVGKHBqX3N0YXR1c190KSBwal9tdXRleF9jcmVhdGUoIHBqX3Bvb2xfdCAqcG9vbCwgCisJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCAKKwkJCQkgICAgIGludCB0eXBlLAorCQkJCSAgICAgcGpfbXV0ZXhfdCAqKnB0cl9tdXRleCkKK3sKKyAgICBwal9tdXRleF90ICptdXRleDsKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKG5hbWUpOworCisgICAgbXV0ZXggPSBwal9wb29sX2FsbG9jKHBvb2wsIHNpemVvZihwal9tdXRleF90KSk7CisgICAgaWYgKCFtdXRleCkKKwlyZXR1cm4gUEpfRU5PTUVNOworCisgICAgaW5pdF9NVVRFWCgmbXV0ZXgtPnNlbSk7CisKKyAgICBtdXRleC0+cmVjdXJzaXZlID0gKHR5cGUgPT0gUEpfTVVURVhfUkVDVVJTRSk7CisgICAgbXV0ZXgtPm93bmVyID0gTlVMTDsKKyAgICBtdXRleC0+b3duX2NvdW50ID0gMDsKKyAgICAKKyAgICAvKiBEb25lLiAqLworICAgICpwdHJfbXV0ZXggPSBtdXRleDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9tdXRleF9jcmVhdGVfc2ltcGxlKCBwal9wb29sX3QgKnBvb2wsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICBwal9tdXRleF90ICoqbXV0ZXggKQoreworICAgIHJldHVybiBwal9tdXRleF9jcmVhdGUocG9vbCwgbmFtZSwgUEpfTVVURVhfU0lNUExFLCBtdXRleCk7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfbXV0ZXhfY3JlYXRlX3JlY3Vyc2l2ZSggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgICAgIHBqX211dGV4X3QgKiptdXRleCApCit7CisgICAgcmV0dXJuIHBqX211dGV4X2NyZWF0ZSggcG9vbCwgbmFtZSwgUEpfTVVURVhfUkVDVVJTRSwgbXV0ZXgpOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X2xvY2socGpfbXV0ZXhfdCAqbXV0ZXgpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihtdXRleCwgUEpfRUlOVkFMKTsKKworICAgIGlmIChtdXRleC0+cmVjdXJzaXZlKSB7CisJcGpfdGhyZWFkX3QgKnRoaXNfdGhyZWFkID0gcGpfdGhyZWFkX3RoaXMoKTsKKwlpZiAobXV0ZXgtPm93bmVyID09IHRoaXNfdGhyZWFkKSB7CisJICAgICsrbXV0ZXgtPm93bl9jb3VudDsKKwl9IGVsc2UgeworCSAgICBkb3duKCZtdXRleC0+c2VtKTsKKwkgICAgcGpfYXNzZXJ0KG11dGV4LT5vd25fY291bnQgPT0gMCk7CisJICAgIG11dGV4LT5vd25lciA9IHRoaXNfdGhyZWFkOworCSAgICBtdXRleC0+b3duX2NvdW50ID0gMTsKKwl9CisgICAgfSBlbHNlIHsKKwlkb3duKCZtdXRleC0+c2VtKTsKKyAgICB9CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfbXV0ZXhfdHJ5bG9jayhwal9tdXRleF90ICptdXRleCkKK3sKKyAgICBsb25nIHJjOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihtdXRleCwgUEpfRUlOVkFMKTsKKworICAgIGlmIChtdXRleC0+cmVjdXJzaXZlKSB7CisJcGpfdGhyZWFkX3QgKnRoaXNfdGhyZWFkID0gcGpfdGhyZWFkX3RoaXMoKTsKKwlpZiAobXV0ZXgtPm93bmVyID09IHRoaXNfdGhyZWFkKSB7CisJICAgICsrbXV0ZXgtPm93bl9jb3VudDsKKwl9IGVsc2UgeworCSAgICByYyA9IGRvd25faW50ZXJydXB0aWJsZSgmbXV0ZXgtPnNlbSk7CisJICAgIGlmIChyYyAhPSAwKQorCQlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKC1yYyk7CisJICAgIHBqX2Fzc2VydChtdXRleC0+b3duX2NvdW50ID09IDApOworCSAgICBtdXRleC0+b3duZXIgPSB0aGlzX3RocmVhZDsKKwkgICAgbXV0ZXgtPm93bl9jb3VudCA9IDE7CisJfQorICAgIH0gZWxzZSB7CisJaW50IHJjID0gZG93bl90cnlsb2NrKCZtdXRleC0+c2VtKTsKKwlpZiAocmMgIT0gMCkKKwkgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUigtcmMpOworICAgIH0KKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9tdXRleF91bmxvY2socGpfbXV0ZXhfdCAqbXV0ZXgpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihtdXRleCwgUEpfRUlOVkFMKTsKKworICAgIGlmIChtdXRleC0+cmVjdXJzaXZlKSB7CisJcGpfdGhyZWFkX3QgKnRoaXNfdGhyZWFkID0gcGpfdGhyZWFkX3RoaXMoKTsKKwlpZiAobXV0ZXgtPm93bmVyID09IHRoaXNfdGhyZWFkKSB7CisJICAgIHBqX2Fzc2VydChtdXRleC0+b3duX2NvdW50ID4gMCk7CisJICAgIC0tbXV0ZXgtPm93bl9jb3VudDsKKwkgICAgaWYgKG11dGV4LT5vd25fY291bnQgPT0gMCkgeworCQltdXRleC0+b3duZXIgPSBOVUxMOworCQl1cCgmbXV0ZXgtPnNlbSk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBwal9hc3NlcnQoISJOb3Qgb3duZXIhIik7CisJICAgIHJldHVybiBQSl9FSU5WQUxJRE9QOworCX0KKyAgICB9IGVsc2UgeworCXVwKCZtdXRleC0+c2VtKTsKKyAgICB9CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfbXV0ZXhfZGVzdHJveShwal9tdXRleF90ICptdXRleCkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG11dGV4ICE9IE5VTEwsIFBKX0VJTlZBTCk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworI2lmIGRlZmluZWQoUEpfREVCVUcpICYmIFBKX0RFQlVHICE9IDAKK1BKX0RFRihwal9ib29sX3QpIHBqX211dGV4X2lzX2xvY2tlZChwal9tdXRleF90ICptdXRleCkKK3sKKyAgICBpZiAobXV0ZXgtPnJlY3Vyc2l2ZSkKKwlyZXR1cm4gbXV0ZXgtPm93bmVyID09IHBqX3RocmVhZF90aGlzKCk7CisgICAgZWxzZQorCXJldHVybiAxOworfQorI2VuZGlmCS8qIFBKX0RFQlVHICovCisKKworI2lmIGRlZmluZWQoUEpfSEFTX1NFTUFQSE9SRSkgJiYgUEpfSEFTX1NFTUFQSE9SRSAhPSAwCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc2VtX2NyZWF0ZSggIHBqX3Bvb2xfdCAqcG9vbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICB1bnNpZ25lZCBpbml0aWFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1heCwKKwkJCQkgICAgcGpfc2VtX3QgKipzZW0pCit7CisgICAgcGpfc2VtX3QgKnNlbTsKKworICAgIFBKX1VOVVNFRF9BUkcobWF4KTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBzZW0sIFBKX0VJTlZBTCk7CisgICAgCisgICAgc2VtID0gcGpfcG9vbF9hbGxvYyhwb29sLCBzaXplb2YocGpfc2VtX3QpKTsKKyAgICBzZW1hX2luaXQoJnNlbS0+c2VtLCBpbml0aWFsKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zZW1fd2FpdChwal9zZW1fdCAqc2VtKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBzZW0sIFBKX0VJTlZBTCk7CisKKyAgICBkb3duKCZzZW0tPnNlbSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc2VtX3RyeXdhaXQocGpfc2VtX3QgKnNlbSkKK3sKKyAgICBpbnQgcmM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBvb2wgJiYgc2VtLCBQSl9FSU5WQUwpOworCisgICAgcmMgPSBkb3duX3RyeWxvY2soJnNlbS0+c2VtKTsKKyAgICBpZiAocmMgIT0gMCkgeworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoLXJjKTsKKyAgICB9IGVsc2UgeworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zZW1fcG9zdChwal9zZW1fdCAqc2VtKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBzZW0sIFBKX0VJTlZBTCk7CisKKyAgICB1cCgmc2VtLT5zZW0pOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NlbV9kZXN0cm95KHBqX3NlbV90ICpzZW0pCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIHNlbSwgUEpfRUlOVkFMKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisjZW5kaWYJLyogUEpfSEFTX1NFTUFQSE9SRSAqLworCisKKworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2NvcmVfc3ltYmlhbi5jcHAgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2NvcmVfc3ltYmlhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmNWQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfY29yZV9zeW1iaWFuLmNwcApAQCAtMCwwICsxLDEwNjMgQEAKKy8qICRJZDogb3NfY29yZV9zeW1iaWFuLmNwcCAzOTk5IDIwMTItMDMtMzAgMDc6MTA6MTNaIGJlbm55bHAgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL3JhbmQuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9ndWlkLmg+CisjaW5jbHVkZSA8cGovZXhjZXB0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKworI2luY2x1ZGUgIm9zX3N5bWJpYW4uaCIKKworCisjZGVmaW5lIFBKX01BWF9UTFMJICAgIDMyCisjZGVmaW5lIERVTU1ZX01VVEVYCSAgICAoKHBqX211dGV4X3QqKTEwMSkKKyNkZWZpbmUgRFVNTVlfU0VNQVBIT1JFCSAgICAoKHBqX3NlbV90KikxMDIpCisjZGVmaW5lIFRISVNfRklMRQkgICAgIm9zX2NvcmVfc3ltYmlhbi5jIgorCisvKiBEZWZhdWx0IG1lc3NhZ2Ugc2xvdCBudW1iZXIgZm9yIFJTb2NrZXRTZXJ2OjpDb25uZWN0KCkuCisgKiBJbmNyZWFzZSBpdCB0byAzMiBmcm9tIHRoZSBkZWZhdWx0IDggKEtFU29ja0RlZmF1bHRNZXNzYWdlU2xvdHMpCisgKi8KKyNpZm5kZWYgUEpfU1lNQklBTl9TT0NLX01TR19TTE9UUworIyAgZGVmaW5lIFBKX1NZTUJJQU5fU09DS19NU0dfU0xPVFMgIDMyCisjZW5kaWYKKworLyoKKyAqIE5vdGU6CisgKgorICogVGhlIFN5bWJpYW4gaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aHJlYWRpbmchCisgKi8gCisKK3N0cnVjdCBwal90aHJlYWRfdAoreworICAgIGNoYXIJICAgIG9ial9uYW1lW1BKX01BWF9PQkpfTkFNRV07CisgICAgdm9pZAkgICAqdGxzX3ZhbHVlc1tQSl9NQVhfVExTXTsKKworI2lmIGRlZmluZWQoUEpfT1NfSEFTX0NIRUNLX1NUQUNLKSAmJiBQSl9PU19IQVNfQ0hFQ0tfU1RBQ0shPTAKKyAgICBwal91aW50MzJfdAkgICAgc3RrX3NpemU7CisgICAgcGpfdWludDMyX3QJICAgIHN0a19tYXhfdXNhZ2U7CisgICAgY2hhcgkgICAqc3RrX3N0YXJ0OworICAgIGNvbnN0IGNoYXIJICAgKmNhbGxlcl9maWxlOworICAgIGludAkJICAgIGNhbGxlcl9saW5lOworI2VuZGlmCisKK30gbWFpbl90aHJlYWQ7CisKK3N0cnVjdCBwal9hdG9taWNfdAoreworICAgIHBqX2F0b21pY192YWx1ZV90CXZhbHVlOworfTsKKworc3RydWN0IHBqX3NlbV90Cit7CisgICAgaW50IHZhbHVlOworICAgIGludCBtYXg7Cit9OworCisvKiBGbGFnIGFuZCByZWZlcmVuY2UgY291bnRlciBmb3IgUEpMSUIgaW5zdGFuY2UgKi8KK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisKKy8qIEZsYWdzIHRvIGluZGljYXRlIHdoaWNoIFRMUyB2YXJpYWJsZXMgaGF2ZSBiZWVuIHVzZWQgKi8KK3N0YXRpYyBpbnQgdGxzX3ZhcnNbUEpfTUFYX1RMU107CisKKy8qIGF0ZXhpdCBoYW5kbGVycyAqLworc3RhdGljIHVuc2lnbmVkIGF0ZXhpdF9jb3VudDsKK3N0YXRpYyB2b2lkICgqYXRleGl0X2Z1bmNbMzJdKSh2b2lkKTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIENQalRpbWVvdXRUaW1lciBpbXBsZW1lbnRhdGlvbgorLy8KKworQ1BqVGltZW91dFRpbWVyOjpDUGpUaW1lb3V0VGltZXIoKQorOiBDQWN0aXZlKFBKX1NZTUJJQU5fVElNRVJfUFJJT1JJVFkpLCBoYXNUaW1lZE91dF8oUEpfRkFMU0UpCit7Cit9CisKK0NQalRpbWVvdXRUaW1lcjo6fkNQalRpbWVvdXRUaW1lcigpCit7CisgICAgQ2FuY2VsKCk7CisgICAgdGltZXJfLkNsb3NlKCk7Cit9CisKK3ZvaWQgQ1BqVGltZW91dFRpbWVyOjpDb25zdHJ1Y3RMKCkKK3sKKyAgICBoYXNUaW1lZE91dF8gPSBQSl9GQUxTRTsKKyAgICB0aW1lcl8uQ3JlYXRlTG9jYWwoKTsKKyAgICBDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7Cit9CisKK0NQalRpbWVvdXRUaW1lciAqQ1BqVGltZW91dFRpbWVyOjpOZXdMKCkKK3sKKyAgICBDUGpUaW1lb3V0VGltZXIgKnNlbGYgPSBuZXcgQ1BqVGltZW91dFRpbWVyOworICAgIENsZWFudXBTdGFjazo6UHVzaEwoc2VsZik7CisKKyAgICBzZWxmLT5Db25zdHJ1Y3RMKCk7CisKKyAgICBDbGVhbnVwU3RhY2s6OlBvcChzZWxmKTsKKyAgICByZXR1cm4gc2VsZjsKKworfQorCit2b2lkIENQalRpbWVvdXRUaW1lcjo6U3RhcnRUaW1lcihUVWludCBtaWxpU2Vjb25kcykKK3sKKyAgICBDYW5jZWwoKTsKKworICAgIGhhc1RpbWVkT3V0XyA9IFBKX0ZBTFNFOworICAgIHRpbWVyXy5BZnRlcihpU3RhdHVzLCBtaWxpU2Vjb25kcyAqIDEwMDApOworICAgIFNldEFjdGl2ZSgpOworfQorCitib29sIENQalRpbWVvdXRUaW1lcjo6SGFzVGltZWRPdXQoKSBjb25zdAoreworICAgIHJldHVybiBoYXNUaW1lZE91dF8gIT0gMDsKK30KKwordm9pZCBDUGpUaW1lb3V0VGltZXI6OlJ1bkwoKQoreworICAgIGhhc1RpbWVkT3V0XyA9IFBKX1RSVUU7Cit9CisKK3ZvaWQgQ1BqVGltZW91dFRpbWVyOjpEb0NhbmNlbCgpCit7CisgICAgdGltZXJfLkNhbmNlbCgpOworfQorCitUSW50IENQalRpbWVvdXRUaW1lcjo6UnVuRXJyb3IoVEludCBhRXJyb3IpCit7CisgICAgUEpfVU5VU0VEX0FSRyhhRXJyb3IpOworICAgIHJldHVybiBLRXJyTm9uZTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gUGpTeW1iaWFuT1MgaW1wbGVtZW50YXRpb24KKy8vCisKK1BqU3ltYmlhbk9TOjpQalN5bWJpYW5PUygpCis6IGlzQ29ubmVjdGlvblVwXyhmYWxzZSksCisgIGlzU29ja2V0U2VydkluaXRpYWxpemVkXyhmYWxzZSksIGlzUmVzb2x2ZXJJbml0aWFsaXplZF8oZmFsc2UpLAorICBjb25zb2xlXyhOVUxMKSwgc2VsZWN0VGltZW91dFRpbWVyXyhOVUxMKSwKKyAgYXBwU29ja2V0U2Vydl8oTlVMTCksIGFwcENvbm5lY3Rpb25fKE5VTEwpLCBhcHBIb3N0UmVzb2x2ZXJfKE5VTEwpLAorICBhcHBIb3N0UmVzb2x2ZXI2XyhOVUxMKQoreworfQorCisvLyBTZXQgcGFyYW1ldGVycwordm9pZCBQalN5bWJpYW5PUzo6U2V0UGFyYW1ldGVycyhwal9zeW1iaWFub3NfcGFyYW1zICpwYXJhbXMpIAoreworICAgIGFwcFNvY2tldFNlcnZfID0gKFJTb2NrZXRTZXJ2KikgcGFyYW1zLT5yc29ja2V0c2VydjsKKyAgICBhcHBDb25uZWN0aW9uXyA9IChSQ29ubmVjdGlvbiopIHBhcmFtcy0+cmNvbm5lY3Rpb247CisgICAgYXBwSG9zdFJlc29sdmVyXyA9IChSSG9zdFJlc29sdmVyKikgcGFyYW1zLT5yaG9zdHJlc29sdmVyOworICAgIGFwcEhvc3RSZXNvbHZlcjZfID0gKFJIb3N0UmVzb2x2ZXIqKSBwYXJhbXMtPnJob3N0cmVzb2x2ZXI2OworfQorCisvLyBHZXQgUGpTeW1iaWFuT1MgaW5zdGFuY2UKK1BqU3ltYmlhbk9TICpQalN5bWJpYW5PUzo6SW5zdGFuY2UoKQoreworICAgIHN0YXRpYyBQalN5bWJpYW5PUyBpbnN0YW5jZV87CisgICAgcmV0dXJuICZpbnN0YW5jZV87Cit9CisKKworLy8gSW5pdGlhbGl6ZQorVEludCBQalN5bWJpYW5PUzo6SW5pdGlhbGl6ZSgpCit7CisgICAgVEludCBlcnI7CisKKyAgICBzZWxlY3RUaW1lb3V0VGltZXJfID0gQ1BqVGltZW91dFRpbWVyOjpOZXdMKCk7CisKKyNpZiAwCisgICAgcGpfYXNzZXJ0KGNvbnNvbGVfID09IE5VTEwpOworICAgIFRSQVBEKGVyciwgY29uc29sZV8gPSBDb25zb2xlOjpOZXdMKF9MKCJQSkxJQiIpLCAKKwkJCQkgICAgICAgIFRTaXplKEtDb25zRnVsbFNjcmVlbixLQ29uc0Z1bGxTY3JlZW4pKSk7CisgICAgcmV0dXJuIGVycjsKKyNlbmRpZgorCisgICAgLyogT25seSBjcmVhdGUgUlNvY2tldFNlcnYgaWYgYXBwbGljYXRpb24gZG9lc24ndCBzcGVjaWZ5IGl0CisgICAgICogaW4gdGhlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBpZiAoIWlzU29ja2V0U2VydkluaXRpYWxpemVkXyAmJiBhcHBTb2NrZXRTZXJ2XyA9PSBOVUxMKSB7CisJZXJyID0gc29ja2V0U2Vydl8uQ29ubmVjdChQSl9TWU1CSUFOX1NPQ0tfTVNHX1NMT1RTKTsKKwlpZiAoZXJyICE9IEtFcnJOb25lKQorCSAgICBnb3RvIG9uX2Vycm9yOworCisJaXNTb2NrZXRTZXJ2SW5pdGlhbGl6ZWRfID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWlzUmVzb2x2ZXJJbml0aWFsaXplZF8pIHsKKyAgICAJaWYgKGFwcEhvc3RSZXNvbHZlcl8gPT0gTlVMTCkgeworICAgIAkgICAgaWYgKENvbm5lY3Rpb24oKSkKKyAgICAJICAgIAllcnIgPSBob3N0UmVzb2x2ZXJfLk9wZW4oU29ja2V0U2VydigpLCBLQWZJbmV0LCBLU29ja1N0cmVhbSwKKyAgICAJICAgIAkJCSAgICAgCSAqQ29ubmVjdGlvbigpKTsKKyAgICAJICAgIGVsc2UKKwkgICAgCWVyciA9IGhvc3RSZXNvbHZlcl8uT3BlbihTb2NrZXRTZXJ2KCksIEtBZkluZXQsIEtTb2NrU3RyZWFtKTsKKyAgICAJCisJICAgIGlmIChlcnIgIT0gS0Vyck5vbmUpCisJICAgIAlnb3RvIG9uX2Vycm9yOworICAgIAl9CisgICAgCQorI2lmIGRlZmluZWQoUEpfSEFTX0lQVjYpICYmIFBKX0hBU19JUFY2IT0wCisgICAgCWlmIChhcHBIb3N0UmVzb2x2ZXI2XyA9PSBOVUxMKSB7CisgICAgCSAgICBpZiAoQ29ubmVjdGlvbigpKQorICAgIAkgICAgCWVyciA9IGhvc3RSZXNvbHZlcjZfLk9wZW4oU29ja2V0U2VydigpLCBLQWZJbmV0NiwgS1NvY2tTdHJlYW0sCisgICAgCSAgICAJCQkgICAgIAkgICpDb25uZWN0aW9uKCkpOworICAgIAkgICAgZWxzZQorCSAgICAJZXJyID0gaG9zdFJlc29sdmVyNl8uT3BlbihTb2NrZXRTZXJ2KCksIEtBZkluZXQ2LCBLU29ja1N0cmVhbSk7CisgICAgCQorCSAgICBpZiAoZXJyICE9IEtFcnJOb25lKQorCSAgICAJZ290byBvbl9lcnJvcjsKKyAgICAJfQorI2VuZGlmCisgICAgCQorICAgIAkKKwlpc1Jlc29sdmVySW5pdGlhbGl6ZWRfID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpc0Nvbm5lY3Rpb25VcF8gPSB0cnVlOworICAgIAorICAgIHJldHVybiBLRXJyTm9uZTsKKworb25fZXJyb3I6CisgICAgU2h1dGRvd24oKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvLyBTaHV0ZG93bgordm9pZCBQalN5bWJpYW5PUzo6U2h1dGRvd24oKQoreworICAgIGlzQ29ubmVjdGlvblVwXyA9IGZhbHNlOworICAgIAorICAgIGlmIChpc1Jlc29sdmVySW5pdGlhbGl6ZWRfKSB7CisJCWhvc3RSZXNvbHZlcl8uQ2xvc2UoKTsKKyNpZiBkZWZpbmVkKFBKX0hBU19JUFY2KSAmJiBQSl9IQVNfSVBWNiE9MAorICAgIAlob3N0UmVzb2x2ZXI2Xy5DbG9zZSgpOworI2VuZGlmCisgICAgCWlzUmVzb2x2ZXJJbml0aWFsaXplZF8gPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaXNTb2NrZXRTZXJ2SW5pdGlhbGl6ZWRfKSB7CisJc29ja2V0U2Vydl8uQ2xvc2UoKTsKKwlpc1NvY2tldFNlcnZJbml0aWFsaXplZF8gPSBmYWxzZTsKKyAgICB9CisKKyAgICBkZWxldGUgY29uc29sZV87CisgICAgY29uc29sZV8gPSBOVUxMOworCisgICAgZGVsZXRlIHNlbGVjdFRpbWVvdXRUaW1lcl87CisgICAgc2VsZWN0VGltZW91dFRpbWVyXyA9IE5VTEw7CisgICAgCisgICAgYXBwU29ja2V0U2Vydl8gPSBOVUxMOworICAgIGFwcENvbm5lY3Rpb25fID0gTlVMTDsKKyAgICBhcHBIb3N0UmVzb2x2ZXJfID0gTlVMTDsKKyAgICBhcHBIb3N0UmVzb2x2ZXI2XyA9IE5VTEw7Cit9CisKKy8vIENvbnZlcnQgdG8gVW5pY29kZQorVEludCBQalN5bWJpYW5PUzo6Q29udmVydFRvVW5pY29kZShURGVzMTYgJmFVbmljb2RlLCBjb25zdCBURGVzQzggJmFGb3JlaWduKQoreworI2lmIDAKKyAgICBwal9hc3NlcnQoY29udl8gIT0gTlVMTCk7CisgICAgcmV0dXJuIGNvbnZfLT5Db252ZXJ0VG9Vbmljb2RlKGFVbmljb2RlLCBhRm9yZWlnbiwgY29udlRvVW5pY29kZVN0YXRlXyk7CisjZWxzZQorICAgIHJldHVybiBDbnZVdGZDb252ZXJ0ZXI6OkNvbnZlcnRUb1VuaWNvZGVGcm9tVXRmOChhVW5pY29kZSwgYUZvcmVpZ24pOworI2VuZGlmCit9CisKKy8vIENvbnZlcnQgZnJvbSBVbmljb2RlCitUSW50IFBqU3ltYmlhbk9TOjpDb252ZXJ0RnJvbVVuaWNvZGUoVERlczggJmFGb3JlaWduLCBjb25zdCBURGVzQzE2ICZhVW5pY29kZSkKK3sKKyNpZiAwCisgICAgcGpfYXNzZXJ0KGNvbnZfICE9IE5VTEwpOworICAgIHJldHVybiBjb252Xy0+Q29udmVydEZyb21Vbmljb2RlKGFGb3JlaWduLCBhVW5pY29kZSwgY29udlRvQW5zaVN0YXRlXyk7CisjZWxzZQorICAgIHJldHVybiBDbnZVdGZDb252ZXJ0ZXI6OkNvbnZlcnRGcm9tVW5pY29kZVRvVXRmOChhRm9yZWlnbiwgYVVuaWNvZGUpOworI2VuZGlmCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBQSkxJQiBvcy5oIGltcGxlbWVudGF0aW9uCisvLworCitQSl9ERUYocGpfdWludDMyX3QpIHBqX2dldHBpZCh2b2lkKQoreworICAgIHJldHVybiAwOworfQorCisKKy8qIFNldCBTeW1iaWFuIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3ltYmlhbm9zX3NldF9wYXJhbXMocGpfc3ltYmlhbm9zX3BhcmFtcyAqcHJtKSAKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBybSAhPSBOVUxMLCBQSl9FSU5WQUwpOworICAgIFBqU3ltYmlhbk9TOjpJbnN0YW5jZSgpLT5TZXRQYXJhbWV0ZXJzKHBybSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyogU2V0IGNvbm5lY3Rpb24gc3RhdHVzICovCitQSl9ERUYodm9pZCkgcGpfc3ltYmlhbm9zX3NldF9jb25uZWN0aW9uX3N0YXR1cyhwal9ib29sX3QgdXApCit7CisgICAgUGpTeW1iaWFuT1M6Okluc3RhbmNlKCktPlNldENvbm5lY3Rpb25TdGF0dXModXAgIT0gMCk7Cit9CisKKworLyoKKyAqIHBqX2luaXQodm9pZCkuCisgKiBJbml0IFBKTElCIQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2luaXQodm9pZCkKK3sKKwljaGFyIHN0YWNrX3B0cjsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCisgICAgLyogQ2hlY2sgaWYgUEpMSUIgaGF2ZSBiZWVuIGluaXRpYWxpemVkICovCisgICAgaWYgKGluaXRpYWxpemVkKSB7CisJKytpbml0aWFsaXplZDsKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBwal9hbnNpX3N0cmNweShtYWluX3RocmVhZC5vYmpfbmFtZSwgInBqdGhyZWFkIik7CisKKyAgICAvLyBJbml0IG1haW4gdGhyZWFkCisgICAgcGpfbWVtc2V0KCZtYWluX3RocmVhZCwgMCwgc2l6ZW9mKG1haW5fdGhyZWFkKSk7CisKKyAgICAvLyBJbml0aWFsaXplIFBqU3ltYmlhbk9TIGluc3RhbmNlCisgICAgUGpTeW1iaWFuT1MgKm9zID0gUGpTeW1iaWFuT1M6Okluc3RhbmNlKCk7CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAiSW5pdGlhbGl6aW5nIFBKTElCIGZvciBTeW1iaWFuIE9TLi4iKSk7CisKKyAgICBUSW50IGVycjsgCisgICAgZXJyID0gb3MtPkluaXRpYWxpemUoKTsKKyAgICBpZiAoZXJyICE9IEtFcnJOb25lKQorICAgIAlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKGVycik7CisKKyAgICAvKiBJbml0IGxvZ2dpbmcgKi8KKyAgICBwal9sb2dfaW5pdCgpOworCisgICAgLyogSW5pdGlhbGl6ZSBleGNlcHRpb24gSUQgZm9yIHRoZSBwb29sLiAKKyAgICAgKiBNdXN0IGRvIHNvIGFmdGVyIGNyaXRpY2FsIHNlY3Rpb24gaXMgY29uZmlndXJlZC4KKyAgICAgKi8gCisgICAgc3RhdHVzID0gcGpfZXhjZXB0aW9uX2lkX2FsbG9jKCJQSkxJQi9ObyBtZW1vcnkiLCAmUEpfTk9fTUVNT1JZX0VYQ0VQVElPTik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorICAgICAgICBnb3RvIG9uX2Vycm9yOworCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyE9MAorICAgIG1haW5fdGhyZWFkLnN0a19zdGFydCA9ICZzdGFja19wdHI7CisgICAgbWFpbl90aHJlYWQuc3RrX3NpemUgPSAweEZGRkZGRkZGVUw7CisgICAgbWFpbl90aHJlYWQuc3RrX21heF91c2FnZSA9IDA7CisjZWxzZQorICAgIHN0YWNrX3B0ciA9ICdcMCc7CisjZW5kaWYKKworICAgIC8qIEZsYWcgUEpMSUIgYXMgaW5pdGlhbGl6ZWQgKi8KKyAgICArK2luaXRpYWxpemVkOworICAgIHBqX2Fzc2VydChpbml0aWFsaXplZCA9PSAxKTsKKworICAgIFBKX0xPRyg1LChUSElTX0ZJTEUsICJQSkxJQiBpbml0aWFsaXplZC4iKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisKK29uX2Vycm9yOgorICAgIHBqX3NodXRkb3duKCk7CisgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihlcnIpOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfYXRleGl0KHBqX2V4aXRfY2FsbGJhY2sgZnVuYykKK3sKKyAgICBpZiAoYXRleGl0X2NvdW50ID49IFBKX0FSUkFZX1NJWkUoYXRleGl0X2Z1bmMpKQorCXJldHVybiBQSl9FVE9PTUFOWTsKKworICAgIGF0ZXhpdF9mdW5jW2F0ZXhpdF9jb3VudCsrXSA9IGZ1bmM7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworCitQSl9ERUYodm9pZCkgcGpfc2h1dGRvd24odm9pZCkKK3sKKyAgICAvKiBPbmx5IHBlcmZvcm0gc2h1dGRvd24gb3BlcmF0aW9uIHdoZW4gJ2luaXRpYWxpemVkJyByZWFjaGVzIHplcm8gKi8KKyAgICBwal9hc3NlcnQoaW5pdGlhbGl6ZWQgPiAwKTsKKyAgICBpZiAoLS1pbml0aWFsaXplZCAhPSAwKQorCXJldHVybjsKKworICAgIC8qIENhbGwgYXRleGl0KCkgZnVuY3Rpb25zICovCisgICAgd2hpbGUgKGF0ZXhpdF9jb3VudCA+IDApIHsKKwkoKmF0ZXhpdF9mdW5jW2F0ZXhpdF9jb3VudC0xXSkoKTsKKwktLWF0ZXhpdF9jb3VudDsKKyAgICB9CisKKyAgICAvKiBGcmVlIGV4Y2VwdGlvbiBJRCAqLworICAgIGlmIChQSl9OT19NRU1PUllfRVhDRVBUSU9OICE9IC0xKSB7CisJcGpfZXhjZXB0aW9uX2lkX2ZyZWUoUEpfTk9fTUVNT1JZX0VYQ0VQVElPTik7CisJUEpfTk9fTUVNT1JZX0VYQ0VQVElPTiA9IC0xOworICAgIH0KKworICAgIC8qIENsZWFyIHN0YXRpYyB2YXJpYWJsZXMgKi8KKyAgICBwal9lcnJub19jbGVhcl9oYW5kbGVycygpOworCisgICAgUGpTeW1iaWFuT1MgKm9zID0gUGpTeW1iaWFuT1M6Okluc3RhbmNlKCk7CisgICAgb3MtPlNodXRkb3duKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIENQb2xsVGltZW91dFRpbWVyIDogcHVibGljIENBY3RpdmUgCit7CitwdWJsaWM6CisgICAgc3RhdGljIENQb2xsVGltZW91dFRpbWVyKiBOZXdMKGludCBtc2VjLCBUSW50IHByaW8pOworICAgIH5DUG9sbFRpbWVvdXRUaW1lcigpOworICAgIAorICAgIHZpcnR1YWwgdm9pZCBSdW5MKCk7CisgICAgdmlydHVhbCB2b2lkIERvQ2FuY2VsKCk7CisKK3ByaXZhdGU6CQorICAgIFJUaW1lcgkgICAgIHJ0aW1lcl87CisgICAgCisgICAgZXhwbGljaXQgQ1BvbGxUaW1lb3V0VGltZXIoVEludCBwcmlvKTsKKyAgICB2b2lkIENvbnN0cnVjdEwoaW50IG1zZWMpOworfTsKKworQ1BvbGxUaW1lb3V0VGltZXI6OkNQb2xsVGltZW91dFRpbWVyKFRJbnQgcHJpbykKKzogQ0FjdGl2ZShwcmlvKQoreworfQorCisKK0NQb2xsVGltZW91dFRpbWVyOjp+Q1BvbGxUaW1lb3V0VGltZXIoKSAKK3sKKyAgICBydGltZXJfLkNsb3NlKCk7Cit9CisKK3ZvaWQgQ1BvbGxUaW1lb3V0VGltZXI6OkNvbnN0cnVjdEwoaW50IG1zZWMpIAoreworICAgIHJ0aW1lcl8uQ3JlYXRlTG9jYWwoKTsKKyAgICBDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7CisgICAgcnRpbWVyXy5BZnRlcihpU3RhdHVzLCBtc2VjKjEwMDApOworICAgIFNldEFjdGl2ZSgpOworfQorCitDUG9sbFRpbWVvdXRUaW1lciogQ1BvbGxUaW1lb3V0VGltZXI6Ok5ld0woaW50IG1zZWMsIFRJbnQgcHJpbykgCit7CisgICAgQ1BvbGxUaW1lb3V0VGltZXIgKnNlbGYgPSBuZXcgQ1BvbGxUaW1lb3V0VGltZXIocHJpbyk7CisgICAgQ2xlYW51cFN0YWNrOjpQdXNoTChzZWxmKTsKKyAgICBzZWxmLT5Db25zdHJ1Y3RMKG1zZWMpOyAgICAKKyAgICBDbGVhbnVwU3RhY2s6OlBvcChzZWxmKTsKKworICAgIHJldHVybiBzZWxmOworfQorCit2b2lkIENQb2xsVGltZW91dFRpbWVyOjpSdW5MKCkgCit7Cit9CisKK3ZvaWQgQ1BvbGxUaW1lb3V0VGltZXI6OkRvQ2FuY2VsKCkgCit7CisgICAgIHJ0aW1lcl8uQ2FuY2VsKCk7Cit9CisKKworLyoKKyAqIFdhaXQgdGhlIGNvbXBsZXRpb24gb2YgYW55IFN5bWJpYW4gYWN0aXZlIG9iamVjdHMuIAorICovCitQSl9ERUYocGpfYm9vbF90KSBwal9zeW1iaWFub3NfcG9sbChpbnQgcHJpb3JpdHksIGludCBtc190aW1lb3V0KQoreworICAgIENQb2xsVGltZW91dFRpbWVyICp0aW1lciA9IE5VTEw7CisgICAgCisgICAgaWYgKHByaW9yaXR5PT0tMSkKKyAgICAJcHJpb3JpdHkgPSBFUHJpb3JpdHlOdWxsOworICAgIAorICAgIGlmIChtc190aW1lb3V0ID49IDApIHsKKyAgICAJdGltZXIgPSBDUG9sbFRpbWVvdXRUaW1lcjo6TmV3TChtc190aW1lb3V0LCBwcmlvcml0eSk7CisgICAgfQorICAgIAorICAgIFBqU3ltYmlhbk9TOjpJbnN0YW5jZSgpLT5XYWl0Rm9yQWN0aXZlT2JqZWN0cyhwcmlvcml0eSk7CisgICAgCisgICAgaWYgKHRpbWVyKSB7CisgICAgICAgIGJvb2wgdGltZXJfaXNfYWN0aXZlID0gdGltZXItPklzQWN0aXZlKCk7CisgICAgCisJdGltZXItPkNhbmNlbCgpOworICAgICAgICAKKyAgICAgICAgZGVsZXRlIHRpbWVyOworICAgICAgICAKKyAgICAJcmV0dXJuIHRpbWVyX2lzX2FjdGl2ZSA/IFBKX1RSVUUgOiBQSl9GQUxTRTsKKyAgICAJCisgICAgfSBlbHNlIHsKKyAgICAJcmV0dXJuIFBKX1RSVUU7CisgICAgfQorfQorCisKKy8qCisgKiBwal90aHJlYWRfaXNfcmVnaXN0ZXJlZCgpCisgKi8KK1BKX0RFRihwal9ib29sX3QpIHBqX3RocmVhZF9pc19yZWdpc3RlcmVkKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX0ZBTFNFOworfQorCisKKy8qCisgKiBHZXQgdGhyZWFkIHByaW9yaXR5IHZhbHVlIGZvciB0aGUgdGhyZWFkLgorICovCitQSl9ERUYoaW50KSBwal90aHJlYWRfZ2V0X3ByaW8ocGpfdGhyZWFkX3QgKnRocmVhZCkKK3sKKyAgICBQSl9VTlVTRURfQVJHKHRocmVhZCk7CisgICAgcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIFNldCB0aGUgdGhyZWFkIHByaW9yaXR5LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9zZXRfcHJpbyhwal90aHJlYWRfdCAqdGhyZWFkLCAgaW50IHByaW8pCit7CisgICAgUEpfVU5VU0VEX0FSRyh0aHJlYWQpOworICAgIFBKX1VOVVNFRF9BUkcocHJpbyk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIEdldCB0aGUgbG93ZXN0IHByaW9yaXR5IHZhbHVlIGF2YWlsYWJsZSBvbiB0aGlzIHN5c3RlbS4KKyAqLworUEpfREVGKGludCkgcGpfdGhyZWFkX2dldF9wcmlvX21pbihwal90aHJlYWRfdCAqdGhyZWFkKQoreworICAgIFBKX1VOVVNFRF9BUkcodGhyZWFkKTsKKyAgICByZXR1cm4gMTsKK30KKworCisvKgorICogR2V0IHRoZSBoaWdoZXN0IHByaW9yaXR5IHZhbHVlIGF2YWlsYWJsZSBvbiB0aGlzIHN5c3RlbS4KKyAqLworUEpfREVGKGludCkgcGpfdGhyZWFkX2dldF9wcmlvX21heChwal90aHJlYWRfdCAqdGhyZWFkKQoreworICAgIFBKX1VOVVNFRF9BUkcodGhyZWFkKTsKKyAgICByZXR1cm4gMTsKK30KKworCisvKgorICogcGpfdGhyZWFkX2dldF9vc19oYW5kbGUoKQorICovCitQSl9ERUYodm9pZCopIHBqX3RocmVhZF9nZXRfb3NfaGFuZGxlKHBqX3RocmVhZF90ICp0aHJlYWQpIAoreworICAgIFBKX1VOVVNFRF9BUkcodGhyZWFkKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIHBqX3RocmVhZF9yZWdpc3RlciguLikKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfcmVnaXN0ZXIgKCBjb25zdCBjaGFyICpjc3RyX3RocmVhZF9uYW1lLAorCQkJCQkgcGpfdGhyZWFkX2Rlc2MgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdGhyZWFkX3QgKip0aHJlYWRfcHRyKQoreworICAgIFBKX1VOVVNFRF9BUkcoY3N0cl90aHJlYWRfbmFtZSk7CisgICAgUEpfVU5VU0VEX0FSRyhkZXNjKTsKKyAgICBQSl9VTlVTRURfQVJHKHRocmVhZF9wdHIpOworICAgIHJldHVybiBQSl9FSU5WQUxJRE9QOworfQorCisKKy8qCisgKiBwal90aHJlYWRfY3JlYXRlKC4uLikKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsIAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKnRocmVhZF9uYW1lLAorCQkJCSAgICAgIHBqX3RocmVhZF9wcm9jICpwcm9jLCAKKwkJCQkgICAgICB2b2lkICphcmcsCisJCQkJICAgICAgcGpfc2l6ZV90IHN0YWNrX3NpemUsIAorCQkJCSAgICAgIHVuc2lnbmVkIGZsYWdzLAorCQkJCSAgICAgIHBqX3RocmVhZF90ICoqcHRyX3RocmVhZCkKK3sKKyAgICBQSl9VTlVTRURfQVJHKHBvb2wpOworICAgIFBKX1VOVVNFRF9BUkcodGhyZWFkX25hbWUpOworICAgIFBKX1VOVVNFRF9BUkcocHJvYyk7CisgICAgUEpfVU5VU0VEX0FSRyhhcmcpOworICAgIFBKX1VOVVNFRF9BUkcoc3RhY2tfc2l6ZSk7CisgICAgUEpfVU5VU0VEX0FSRyhmbGFncyk7CisgICAgUEpfVU5VU0VEX0FSRyhwdHJfdGhyZWFkKTsKKworICAgIC8qIFNvcnJ5IG1hdGUsIHdlIGRvbid0IHN1cHBvcnQgdGhyZWFkaW5nICovCisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKKy8qCisgKiBwal90aHJlYWQtZ2V0X25hbWUoKQorICovCitQSl9ERUYoY29uc3QgY2hhciopIHBqX3RocmVhZF9nZXRfbmFtZShwal90aHJlYWRfdCAqcCkKK3sKKyAgICBwal9hc3NlcnQocCA9PSAmbWFpbl90aHJlYWQpOworICAgIHJldHVybiBwLT5vYmpfbmFtZTsKK30KKworLyoKKyAqIHBqX3RocmVhZF9yZXN1bWUoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9yZXN1bWUocGpfdGhyZWFkX3QgKnApCit7CisgICAgUEpfVU5VU0VEX0FSRyhwKTsKKyAgICByZXR1cm4gUEpfRUlOVkFMSURPUDsKK30KKworLyoKKyAqIHBqX3RocmVhZF90aGlzKCkKKyAqLworUEpfREVGKHBqX3RocmVhZF90KikgcGpfdGhyZWFkX3RoaXModm9pZCkKK3sKKyAgICByZXR1cm4gJm1haW5fdGhyZWFkOworfQorCisvKgorICogcGpfdGhyZWFkX2pvaW4oKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9qb2luKHBqX3RocmVhZF90ICpyZWMpCit7CisgICAgUEpfVU5VU0VEX0FSRyhyZWMpOworICAgIHJldHVybiBQSl9FSU5WQUxJRE9QOworfQorCisvKgorICogcGpfdGhyZWFkX2Rlc3Ryb3koKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9kZXN0cm95KHBqX3RocmVhZF90ICpyZWMpCit7CisgICAgUEpfVU5VU0VEX0FSRyhyZWMpOworICAgIHJldHVybiBQSl9FSU5WQUxJRE9QOworfQorCisvKgorICogcGpfdGhyZWFkX3NsZWVwKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfc2xlZXAodW5zaWduZWQgbXNlYykKK3sKKyAgICBVc2VyOjpBZnRlcihtc2VjKjEwMDApOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIHBqX3RocmVhZF9sb2NhbF9hbGxvYygpCisgKi8KKworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfbG9jYWxfYWxsb2MobG9uZyAqaW5kZXgpCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIC8qIEZpbmQgdW51c2VkIFRMUyB2YXJpYWJsZSAqLworICAgIGZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUodGxzX3ZhcnMpOyArK2kpIHsKKwlpZiAodGxzX3ZhcnNbaV0gPT0gMCkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGkgPT0gUEpfQVJSQVlfU0laRSh0bHNfdmFycykpCisJcmV0dXJuIFBKX0VUT09NQU5ZOworCisgICAgdGxzX3ZhcnNbaV0gPSAxOworICAgICppbmRleCA9IGk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIHBqX3RocmVhZF9sb2NhbF9mcmVlKCkKKyAqLworUEpfREVGKHZvaWQpIHBqX3RocmVhZF9sb2NhbF9mcmVlKGxvbmcgaW5kZXgpCit7CisgICAgUEpfQVNTRVJUX09OX0ZBSUwoaW5kZXggPj0gMCAmJiBpbmRleCA8IChpbnQpUEpfQVJSQVlfU0laRSh0bHNfdmFycykgJiYKKwkJICAgICB0bHNfdmFyc1tpbmRleF0gIT0gMCwgcmV0dXJuKTsKKworICAgIHRsc192YXJzW2luZGV4XSA9IDA7Cit9CisKKworLyoKKyAqIHBqX3RocmVhZF9sb2NhbF9zZXQoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9sb2NhbF9zZXQobG9uZyBpbmRleCwgdm9pZCAqdmFsdWUpCit7CisgICAgcGpfdGhyZWFkX3QgKnJlYyA9IHBqX3RocmVhZF90aGlzKCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGluZGV4ID49IDAgJiYgaW5kZXggPCAoaW50KVBKX0FSUkFZX1NJWkUodGxzX3ZhcnMpICYmCisJCSAgICAgdGxzX3ZhcnNbaW5kZXhdICE9IDAsIFBKX0VJTlZBTCk7CisKKyAgICByZWMtPnRsc192YWx1ZXNbaW5kZXhdID0gdmFsdWU7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal90aHJlYWRfbG9jYWxfZ2V0KCkKKyAqLworUEpfREVGKHZvaWQqKSBwal90aHJlYWRfbG9jYWxfZ2V0KGxvbmcgaW5kZXgpCit7CisgICAgcGpfdGhyZWFkX3QgKnJlYyA9IHBqX3RocmVhZF90aGlzKCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGluZGV4ID49IDAgJiYgaW5kZXggPCAoaW50KVBKX0FSUkFZX1NJWkUodGxzX3ZhcnMpICYmCisJCSAgICAgdGxzX3ZhcnNbaW5kZXhdICE9IDAsIE5VTEwpOworCisgICAgcmV0dXJuIHJlYy0+dGxzX3ZhbHVlc1tpbmRleF07Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIENyZWF0ZSBhdG9taWMgdmFyaWFibGUuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfYXRvbWljX2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLCAKKwkJCQkgICAgICBwal9hdG9taWNfdmFsdWVfdCBpbml0aWFsLAorCQkJCSAgICAgIHBqX2F0b21pY190ICoqYXRvbWljICkKK3sKKyAgICAqYXRvbWljID0gKHBqX2F0b21pY190Kilwal9wb29sX2FsbG9jKHBvb2wsIHNpemVvZihzdHJ1Y3QgcGpfYXRvbWljX3QpKTsKKyAgICAoKmF0b21pYyktPnZhbHVlID0gaW5pdGlhbDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKgorICogRGVzdHJveSBhdG9taWMgdmFyaWFibGUuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfYXRvbWljX2Rlc3Ryb3koIHBqX2F0b21pY190ICphdG9taWNfdmFyICkKK3sKKyAgICBQSl9VTlVTRURfQVJHKGF0b21pY192YXIpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBTZXQgdGhlIHZhbHVlIG9mIGFuIGF0b21pYyB0eXBlLCBhbmQgcmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KKyAqLworUEpfREVGKHZvaWQpIHBqX2F0b21pY19zZXQoIHBqX2F0b21pY190ICphdG9taWNfdmFyLCAKKwkJCSAgICBwal9hdG9taWNfdmFsdWVfdCB2YWx1ZSkKK3sKKyAgICBhdG9taWNfdmFyLT52YWx1ZSA9IHZhbHVlOworfQorCisKKy8qCisgKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGF0b21pYyB0eXBlLgorICovCitQSl9ERUYocGpfYXRvbWljX3ZhbHVlX3QpIHBqX2F0b21pY19nZXQocGpfYXRvbWljX3QgKmF0b21pY192YXIpCit7CisgICAgcmV0dXJuIGF0b21pY192YXItPnZhbHVlOworfQorCisKKy8qCisgKiBJbmNyZW1lbnQgdGhlIHZhbHVlIG9mIGFuIGF0b21pYyB0eXBlLgorICovCitQSl9ERUYodm9pZCkgcGpfYXRvbWljX2luYyhwal9hdG9taWNfdCAqYXRvbWljX3ZhcikKK3sKKyAgICArK2F0b21pY192YXItPnZhbHVlOworfQorCisKKy8qCisgKiBJbmNyZW1lbnQgdGhlIHZhbHVlIG9mIGFuIGF0b21pYyB0eXBlIGFuZCBnZXQgdGhlIHJlc3VsdC4KKyAqLworUEpfREVGKHBqX2F0b21pY192YWx1ZV90KSBwal9hdG9taWNfaW5jX2FuZF9nZXQocGpfYXRvbWljX3QgKmF0b21pY192YXIpCit7CisgICAgcmV0dXJuICsrYXRvbWljX3Zhci0+dmFsdWU7Cit9CisKKworLyoKKyAqIERlY3JlbWVudCB0aGUgdmFsdWUgb2YgYW4gYXRvbWljIHR5cGUuCisgKi8KK1BKX0RFRih2b2lkKSBwal9hdG9taWNfZGVjKHBqX2F0b21pY190ICphdG9taWNfdmFyKQoreworICAgIC0tYXRvbWljX3Zhci0+dmFsdWU7Cit9CQorCisKKy8qCisgKiBEZWNyZW1lbnQgdGhlIHZhbHVlIG9mIGFuIGF0b21pYyB0eXBlIGFuZCBnZXQgdGhlIHJlc3VsdC4KKyAqLworUEpfREVGKHBqX2F0b21pY192YWx1ZV90KSBwal9hdG9taWNfZGVjX2FuZF9nZXQocGpfYXRvbWljX3QgKmF0b21pY192YXIpCit7CisgICAgcmV0dXJuIC0tYXRvbWljX3Zhci0+dmFsdWU7Cit9CisKKworLyoKKyAqIEFkZCBhIHZhbHVlIHRvIGFuIGF0b21pYyB0eXBlLgorICovCitQSl9ERUYodm9pZCkgcGpfYXRvbWljX2FkZCggcGpfYXRvbWljX3QgKmF0b21pY192YXIsCisJCQkgICAgcGpfYXRvbWljX3ZhbHVlX3QgdmFsdWUpCit7CisgICAgYXRvbWljX3Zhci0+dmFsdWUgKz0gdmFsdWU7Cit9CisKKworLyoKKyAqIEFkZCBhIHZhbHVlIHRvIGFuIGF0b21pYyB0eXBlIGFuZCBnZXQgdGhlIHJlc3VsdC4KKyAqLworUEpfREVGKHBqX2F0b21pY192YWx1ZV90KSBwal9hdG9taWNfYWRkX2FuZF9nZXQoIHBqX2F0b21pY190ICphdG9taWNfdmFyLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2F0b21pY192YWx1ZV90IHZhbHVlKQoreworICAgIGF0b21pY192YXItPnZhbHVlICs9IHZhbHVlOworICAgIHJldHVybiBhdG9taWNfdmFyLT52YWx1ZTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfbXV0ZXhfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICBpbnQgdHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfbXV0ZXhfdCAqKm11dGV4KQoreworICAgIFBKX1VOVVNFRF9BUkcocG9vbCk7CisgICAgUEpfVU5VU0VEX0FSRyhuYW1lKTsKKyAgICBQSl9VTlVTRURfQVJHKHR5cGUpOworCisgICAgKm11dGV4ID0gRFVNTVlfTVVURVg7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal9tdXRleF9jcmVhdGVfc2ltcGxlKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9tdXRleF9jcmVhdGVfc2ltcGxlKCBwal9wb29sX3QgKnBvb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICAgcGpfbXV0ZXhfdCAqKm11dGV4ICkKK3sKKyAgICByZXR1cm4gcGpfbXV0ZXhfY3JlYXRlKHBvb2wsIG5hbWUsIFBKX01VVEVYX1NJTVBMRSwgbXV0ZXgpOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfbXV0ZXhfY3JlYXRlX3JlY3Vyc2l2ZSggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgICAgIHBqX211dGV4X3QgKiptdXRleCApCit7CisgICAgcmV0dXJuIHBqX211dGV4X2NyZWF0ZShwb29sLCBuYW1lLCBQSl9NVVRFWF9SRUNVUlNFLCBtdXRleCk7Cit9CisKKworLyoKKyAqIHBqX211dGV4X2xvY2soKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X2xvY2socGpfbXV0ZXhfdCAqbXV0ZXgpCit7CisgICAgcGpfYXNzZXJ0KG11dGV4ID09IERVTU1ZX01VVEVYKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIHBqX211dGV4X3RyeWxvY2soKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X3RyeWxvY2socGpfbXV0ZXhfdCAqbXV0ZXgpCit7CisgICAgcGpfYXNzZXJ0KG11dGV4ID09IERVTU1ZX01VVEVYKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIHBqX211dGV4X3VubG9jaygpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfbXV0ZXhfdW5sb2NrKHBqX211dGV4X3QgKm11dGV4KQoreworICAgIHBqX2Fzc2VydChtdXRleCA9PSBEVU1NWV9NVVRFWCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal9tdXRleF9kZXN0cm95KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9tdXRleF9kZXN0cm95KHBqX211dGV4X3QgKm11dGV4KQoreworICAgIHBqX2Fzc2VydChtdXRleCA9PSBEVU1NWV9NVVRFWCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBSVyBNdXRleAorICovCisjaW5jbHVkZSAib3NfcndtdXRleC5jIgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qCisgKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uLgorICovCitQSl9ERUYodm9pZCkgcGpfZW50ZXJfY3JpdGljYWxfc2VjdGlvbih2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworCisvKgorICogTGVhdmUgY3JpdGljYWwgc2VjdGlvbi4KKyAqLworUEpfREVGKHZvaWQpIHBqX2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24odm9pZCkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoKKyAqIENyZWF0ZSBzZW1hcGhvcmUuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc2VtX2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICB1bnNpZ25lZCBpbml0aWFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWF4LAorCQkJCSAgIHBqX3NlbV90ICoqcF9zZW0pCit7CisgICAgcGpfc2VtX3QgKnNlbTsKKyAKKyAgICBQSl9VTlVTRURfQVJHKG5hbWUpOworCisgICAgc2VtID0gKHBqX3NlbV90KikgcGpfcG9vbF96YWxsb2MocG9vbCwgc2l6ZW9mKHBqX3NlbV90KSk7CisgICAgc2VtLT52YWx1ZSA9IGluaXRpYWw7CisgICAgc2VtLT5tYXggPSBtYXg7CisKKyAgICAqcF9zZW0gPSBzZW07CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKgorICogV2FpdCBmb3Igc2VtYXBob3JlLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NlbV93YWl0KHBqX3NlbV90ICpzZW0pCit7CisgICAgaWYgKHNlbS0+dmFsdWUgPiAwKSB7CisJc2VtLT52YWx1ZS0tOworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0gZWxzZSB7CisJcGpfYXNzZXJ0KCEiVW5leHBlY3RlZCEiKTsKKwlyZXR1cm4gUEpfRUlOVkFMSURPUDsKKyAgICB9Cit9CisKKworLyoKKyAqIFRyeSB3YWl0IGZvciBzZW1hcGhvcmUuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc2VtX3RyeXdhaXQocGpfc2VtX3QgKnNlbSkKK3sKKyAgICBpZiAoc2VtLT52YWx1ZSA+IDApIHsKKwlzZW0tPnZhbHVlLS07CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfSBlbHNlIHsKKwlwal9hc3NlcnQoISJVbmV4cGVjdGVkISIpOworCXJldHVybiBQSl9FSU5WQUxJRE9QOworICAgIH0KK30KKworCisvKgorICogUmVsZWFzZSBzZW1hcGhvcmUuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc2VtX3Bvc3QocGpfc2VtX3QgKnNlbSkKK3sKKyAgICBzZW0tPnZhbHVlKys7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIERlc3Ryb3kgc2VtYXBob3JlLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NlbV9kZXN0cm95KHBqX3NlbV90ICpzZW0pCit7CisgICAgUEpfVU5VU0VEX0FSRyhzZW0pOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKyNpZiBkZWZpbmVkKFBKX09TX0hBU19DSEVDS19TVEFDSykgJiYgUEpfT1NfSEFTX0NIRUNLX1NUQUNLICE9IDAKKy8qCisgKiBUaGUgaW1wbGVtZW50YXRpb24gb2Ygc3RhY2sgY2hlY2tpbmcuIAorICovCitQSl9ERUYodm9pZCkgcGpfdGhyZWFkX2NoZWNrX3N0YWNrKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICAgIGNoYXIgc3RrX3B0cjsKKyAgICBwal91aW50MzJfdCB1c2FnZTsKKyAgICBwal90aHJlYWRfdCAqdGhyZWFkID0gcGpfdGhyZWFkX3RoaXMoKTsKKworICAgIHBqX2Fzc2VydCh0aHJlYWQpOworCisgICAgLyogQ2FsY3VsYXRlIGN1cnJlbnQgdXNhZ2UuICovCisgICAgdXNhZ2UgPSAoJnN0a19wdHIgPiB0aHJlYWQtPnN0a19zdGFydCkgPyAmc3RrX3B0ciAtIHRocmVhZC0+c3RrX3N0YXJ0IDoKKwkJdGhyZWFkLT5zdGtfc3RhcnQgLSAmc3RrX3B0cjsKKworICAgIC8qIEFzc2VydCBpZiBzdGFjayB1c2FnZSBpcyBkYW5nZXJvdXNseSBoaWdoLiAqLworICAgIHBqX2Fzc2VydCgiU1RBQ0sgT1ZFUkZMT1chISAiICYmICh1c2FnZSA8PSB0aHJlYWQtPnN0a19zaXplIC0gMTI4KSk7CisKKyAgICAvKiBLZWVwIHN0YXRpc3RpYy4gKi8KKyAgICBpZiAodXNhZ2UgPiB0aHJlYWQtPnN0a19tYXhfdXNhZ2UpIHsKKwl0aHJlYWQtPnN0a19tYXhfdXNhZ2UgPSB1c2FnZTsKKwl0aHJlYWQtPmNhbGxlcl9maWxlID0gZmlsZTsKKwl0aHJlYWQtPmNhbGxlcl9saW5lID0gbGluZTsKKyAgICB9Cit9CisKKy8qCisgKiBHZXQgbWF4aW11bSBzdGFjayB1c2FnZSBzdGF0aXN0aWMuIAorICovCitQSl9ERUYocGpfdWludDMyX3QpIHBqX3RocmVhZF9nZXRfc3RhY2tfbWF4X3VzYWdlKHBqX3RocmVhZF90ICp0aHJlYWQpCit7CisgICAgcmV0dXJuIHRocmVhZC0+c3RrX21heF91c2FnZTsKK30KKworLyoKKyAqIER1bXAgdGhyZWFkIHN0YWNrIHN0YXR1cy4gCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGhyZWFkX2dldF9zdGFja19pbmZvKHBqX3RocmVhZF90ICp0aHJlYWQsCisJCQkJCSAgICAgY29uc3QgY2hhciAqKmZpbGUsCisJCQkJCSAgICAgaW50ICpsaW5lKQoreworICAgIHBqX2Fzc2VydCh0aHJlYWQpOworCisgICAgKmZpbGUgPSB0aHJlYWQtPmNhbGxlcl9maWxlOworICAgICpsaW5lID0gdGhyZWFkLT5jYWxsZXJfbGluZTsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIFBKX09TX0hBU19DSEVDS19TVEFDSyAqLworCisvKgorICogcGpfcnVuX2FwcCgpCisgKi8KK1BKX0RFRihpbnQpIHBqX3J1bl9hcHAocGpfbWFpbl9mdW5jX3B0ciBtYWluX2Z1bmMsIGludCBhcmdjLCBjaGFyICphcmd2W10sCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKQoreworICAgIHJldHVybiAoKm1haW5fZnVuYykoYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2NvcmVfdW5peC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19jb3JlX3VuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhiYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19jb3JlX3VuaXguYwpAQCAtMCwwICsxLDE5MzIgQEAKKy8qICRJZDogb3NfY29yZV91bml4LmMgNDM1OSAyMDEzLTAyLTIxIDExOjE4OjM2WiBiZW5ueWxwICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisvKgorICogQ29udHJpYnV0b3JzOgorICogLSBUaGFua3MgZm9yIFpldHJvbiwgSW5jLiAoUGhpbCBUb3JyZSwgcHRvcnJlQHpldHJvbi5jb20pIGZvciBkb25hdGluZworICogICB0aGUgUlRFTVMgcG9ydC4KKyAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyAgIGRlZmluZSBfR05VX1NPVVJDRQorI2VuZGlmCisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovcmFuZC5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL2d1aWQuaD4KKyNpbmNsdWRlIDxwai9leGNlcHQuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorCisjaWYgZGVmaW5lZChQSl9IQVNfU0VNQVBIT1JFX0gpICYmIFBKX0hBU19TRU1BUEhPUkVfSCAhPSAwCisjICBpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CSAgICAvLyBnZXRwaWQoKQorI2luY2x1ZGUgPGVycm5vLmg+CSAgICAvLyBlcnJubworCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjZGVmaW5lIFRISVNfRklMRSAgICJvc19jb3JlX3VuaXguYyIKKworI2RlZmluZSBTSUdOQVRVUkUxICAweERFQUZCRUVGCisjZGVmaW5lIFNJR05BVFVSRTIgIDB4REVBREMwREUKKworc3RydWN0IHBqX3RocmVhZF90Cit7CisgICAgY2hhcgkgICAgb2JqX25hbWVbUEpfTUFYX09CSl9OQU1FXTsKKyAgICBwdGhyZWFkX3QJICAgIHRocmVhZDsKKyAgICBwal90aHJlYWRfcHJvYyAqcHJvYzsKKyAgICB2b2lkCSAgICphcmc7CisgICAgcGpfdWludDMyX3QJICAgIHNpZ25hdHVyZTE7CisgICAgcGpfdWludDMyX3QJICAgIHNpZ25hdHVyZTI7CisKKyAgICBwal9tdXRleF90CSAgICpzdXNwZW5kZWRfbXV0ZXg7CisKKyNpZiBkZWZpbmVkKFBKX09TX0hBU19DSEVDS19TVEFDSykgJiYgUEpfT1NfSEFTX0NIRUNLX1NUQUNLIT0wCisgICAgcGpfdWludDMyX3QJICAgIHN0a19zaXplOworICAgIHBqX3VpbnQzMl90CSAgICBzdGtfbWF4X3VzYWdlOworICAgIGNoYXIJICAgKnN0a19zdGFydDsKKyAgICBjb25zdCBjaGFyCSAgICpjYWxsZXJfZmlsZTsKKyAgICBpbnQJCSAgICBjYWxsZXJfbGluZTsKKyNlbmRpZgorfTsKKworc3RydWN0IHBqX2F0b21pY190Cit7CisgICAgcGpfbXV0ZXhfdAkgICAgICAgKm11dGV4OworICAgIHBqX2F0b21pY192YWx1ZV90CXZhbHVlOworfTsKKworc3RydWN0IHBqX211dGV4X3QKK3sKKyAgICBwdGhyZWFkX211dGV4X3QgICAgIG11dGV4OworICAgIGNoYXIJCW9ial9uYW1lW1BKX01BWF9PQkpfTkFNRV07CisjaWYgUEpfREVCVUcKKyAgICBpbnQJCSAgICAgICAgbmVzdGluZ19sZXZlbDsKKyAgICBwal90aHJlYWRfdAkgICAgICAgKm93bmVyOworICAgIGNoYXIJCW93bmVyX25hbWVbUEpfTUFYX09CSl9OQU1FXTsKKyNlbmRpZgorfTsKKworI2lmIGRlZmluZWQoUEpfSEFTX1NFTUFQSE9SRSkgJiYgUEpfSEFTX1NFTUFQSE9SRSAhPSAwCitzdHJ1Y3QgcGpfc2VtX3QKK3sKKyAgICBzZW1fdAkgICAgICAgKnNlbTsKKyAgICBjaGFyCQlvYmpfbmFtZVtQSl9NQVhfT0JKX05BTUVdOworfTsKKyNlbmRpZiAvKiBQSl9IQVNfU0VNQVBIT1JFICovCisKKyNpZiBkZWZpbmVkKFBKX0hBU19FVkVOVF9PQkopICYmIFBKX0hBU19FVkVOVF9PQkogIT0gMAorc3RydWN0IHBqX2V2ZW50X3QKK3sKKyAgICBlbnVtIGV2ZW50X3N0YXRlIHsKKwlFVl9TVEFURV9PRkYsCisJRVZfU1RBVEVfU0VULAorCUVWX1NUQVRFX1BVTFNFRAorICAgIH0gc3RhdGU7CisKKyAgICBwal9tdXRleF90CQltdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdAljb25kOworCisgICAgcGpfYm9vbF90CQlhdXRvX3Jlc2V0OworICAgIHVuc2lnbmVkCQl0aHJlYWRzX3dhaXRpbmc7CisgICAgdW5zaWduZWQJCXRocmVhZHNfdG9fcmVsZWFzZTsKK307CisjZW5kaWYJLyogUEpfSEFTX0VWRU5UX09CSiAqLworCisKKy8qCisgKiBGbGFnIGFuZCByZWZlcmVuY2UgY291bnRlciBmb3IgUEpMSUIgaW5zdGFuY2UuCisgKi8KK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIHN0YXRpYyBwal90aHJlYWRfdCBtYWluX3RocmVhZDsKKyAgICBzdGF0aWMgbG9uZyB0aHJlYWRfdGxzX2lkOworICAgIHN0YXRpYyBwal9tdXRleF90IGNyaXRpY2FsX3NlY3Rpb247CisjZWxzZQorIyAgIGRlZmluZSBNQVhfVEhSRUFEUyAzMgorICAgIHN0YXRpYyBpbnQgdGxzX2ZsYWdbTUFYX1RIUkVBRFNdOworICAgIHN0YXRpYyB2b2lkICp0bHNbTUFYX1RIUkVBRFNdOworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBhdGV4aXRfY291bnQ7CitzdGF0aWMgdm9pZCAoKmF0ZXhpdF9mdW5jWzMyXSkodm9pZCk7CisKK3N0YXRpYyBwal9zdGF0dXNfdCBpbml0X211dGV4KHBqX211dGV4X3QgKm11dGV4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgdHlwZSk7CisKKy8qCisgKiBwal9pbml0KHZvaWQpLgorICogSW5pdCBQSkxJQiEKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pbml0KHZvaWQpCit7CisgICAgY2hhciBkdW1teV9ndWlkW1BKX0dVSURfTUFYX0xFTkdUSF07CisgICAgcGpfc3RyX3QgZ3VpZDsKKyAgICBwal9zdGF0dXNfdCByYzsKKworICAgIC8qIENoZWNrIGlmIFBKTElCIGhhdmUgYmVlbiBpbml0aWFsaXplZCAqLworICAgIGlmIChpbml0aWFsaXplZCkgeworCSsraW5pdGlhbGl6ZWQ7CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICAvKiBJbml0IHRoaXMgdGhyZWFkJ3MgVExTLiAqLworICAgIGlmICgocmM9cGpfdGhyZWFkX2luaXQoKSkgIT0gMCkgeworCXJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBDcml0aWNhbCBzZWN0aW9uLiAqLworICAgIGlmICgocmM9aW5pdF9tdXRleCgmY3JpdGljYWxfc2VjdGlvbiwgImNyaXRzZWMiLCBQSl9NVVRFWF9SRUNVUlNFKSkgIT0gMCkKKwlyZXR1cm4gcmM7CisKKyNlbmRpZgorCisgICAgLyogSW5pdCBsb2dnaW5nICovCisgICAgcGpfbG9nX2luaXQoKTsKKworICAgIC8qIEluaXRpYWxpemUgZXhjZXB0aW9uIElEIGZvciB0aGUgcG9vbC4gCisgICAgICogTXVzdCBkbyBzbyBhZnRlciBjcml0aWNhbCBzZWN0aW9uIGlzIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcmMgPSBwal9leGNlcHRpb25faWRfYWxsb2MoIlBKTElCL05vIG1lbW9yeSIsICZQSl9OT19NRU1PUllfRVhDRVBUSU9OKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJjOworICAgIAorICAgIC8qIEluaXQgcmFuZG9tIHNlZWQuICovCisgICAgLyogT3IgcHJvYmFibHkgbm90LiBMZXQgYXBwbGljYXRpb24gaW4gY2hhcmdlIG9mIHRoaXMgKi8KKyAgICAvKiBwal9zcmFuZCggY2xvY2soKSApOyAqLworCisgICAgLyogU3RhcnR1cCBHVUlELiAqLworICAgIGd1aWQucHRyID0gZHVtbXlfZ3VpZDsKKyAgICBwal9nZW5lcmF0ZV91bmlxdWVfc3RyaW5nKCAmZ3VpZCApOworCisgICAgLyogU3RhcnR1cCB0aW1lc3RhbXAgKi8KKyNpZiBkZWZpbmVkKFBKX0hBU19ISUdIX1JFU19USU1FUikgJiYgUEpfSEFTX0hJR0hfUkVTX1RJTUVSICE9IDAKKyAgICB7CisJcGpfdGltZXN0YW1wIGR1bW15X3RzOworCWlmICgocmM9cGpfZ2V0X3RpbWVzdGFtcCgmZHVtbXlfdHMpKSAhPSAwKSB7CisJICAgIHJldHVybiByYzsKKwl9CisgICAgfQorI2VuZGlmICAgCisKKyAgICAvKiBGbGFnIFBKTElCIGFzIGluaXRpYWxpemVkICovCisgICAgKytpbml0aWFsaXplZDsKKyAgICBwal9hc3NlcnQoaW5pdGlhbGl6ZWQgPT0gMSk7CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAicGpsaWIgJXMgZm9yIFBPU0lYIGluaXRpYWxpemVkIiwKKwkgICAgICBQSl9WRVJTSU9OKSk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIHBqX2F0ZXhpdCgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfYXRleGl0KHZvaWQgKCpmdW5jKSh2b2lkKSkKK3sKKyAgICBpZiAoYXRleGl0X2NvdW50ID49IFBKX0FSUkFZX1NJWkUoYXRleGl0X2Z1bmMpKQorCXJldHVybiBQSl9FVE9PTUFOWTsKKworICAgIGF0ZXhpdF9mdW5jW2F0ZXhpdF9jb3VudCsrXSA9IGZ1bmM7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal9zaHV0ZG93bih2b2lkKQorICovCitQSl9ERUYodm9pZCkgcGpfc2h1dGRvd24oKQoreworICAgIGludCBpOworCisgICAgLyogT25seSBwZXJmb3JtIHNodXRkb3duIG9wZXJhdGlvbiB3aGVuICdpbml0aWFsaXplZCcgcmVhY2hlcyB6ZXJvICovCisgICAgcGpfYXNzZXJ0KGluaXRpYWxpemVkID4gMCk7CisgICAgaWYgKC0taW5pdGlhbGl6ZWQgIT0gMCkKKwlyZXR1cm47CisKKyAgICAvKiBDYWxsIGF0ZXhpdCgpIGZ1bmN0aW9ucyAqLworICAgIGZvciAoaT1hdGV4aXRfY291bnQtMTsgaT49MDsgLS1pKSB7CisJKCphdGV4aXRfZnVuY1tpXSkoKTsKKyAgICB9CisgICAgYXRleGl0X2NvdW50ID0gMDsKKworICAgIC8qIEZyZWUgZXhjZXB0aW9uIElEICovCisgICAgaWYgKFBKX05PX01FTU9SWV9FWENFUFRJT04gIT0gLTEpIHsKKwlwal9leGNlcHRpb25faWRfZnJlZShQSl9OT19NRU1PUllfRVhDRVBUSU9OKTsKKwlQSl9OT19NRU1PUllfRVhDRVBUSU9OID0gLTE7CisgICAgfQorCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICAvKiBEZXN0cm95IFBKTElCIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICBwal9tdXRleF9kZXN0cm95KCZjcml0aWNhbF9zZWN0aW9uKTsKKworICAgIC8qIEZyZWUgUEpMSUIgVExTICovCisgICAgaWYgKHRocmVhZF90bHNfaWQgIT0gLTEpIHsKKwlwal90aHJlYWRfbG9jYWxfZnJlZSh0aHJlYWRfdGxzX2lkKTsKKwl0aHJlYWRfdGxzX2lkID0gLTE7CisgICAgfQorCisgICAgLyogVGlja2V0ICMxMTMyOiBBc3NlcnRpb24gd2hlbiAocmUpc3RhcnRpbmcgUEpMSUIgb24gZGlmZmVyZW50IHRocmVhZCAqLworICAgIHBqX2J6ZXJvKCZtYWluX3RocmVhZCwgc2l6ZW9mKG1haW5fdGhyZWFkKSk7CisjZW5kaWYKKworICAgIC8qIENsZWFyIHN0YXRpYyB2YXJpYWJsZXMgKi8KKyAgICBwal9lcnJub19jbGVhcl9oYW5kbGVycygpOworfQorCisKKy8qCisgKiBwal9nZXRwaWQodm9pZCkKKyAqLworUEpfREVGKHBqX3VpbnQzMl90KSBwal9nZXRwaWQodm9pZCkKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIHJldHVybiBnZXRwaWQoKTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoaXMgdGhyZWFkIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdG8gUEpMSUIuCisgKi8KK1BKX0RFRihwal9ib29sX3QpIHBqX3RocmVhZF9pc19yZWdpc3RlcmVkKHZvaWQpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICByZXR1cm4gcGpfdGhyZWFkX2xvY2FsX2dldCh0aHJlYWRfdGxzX2lkKSAhPSAwOworI2Vsc2UKKyAgICBwal9hc3NlcnQoInBqX3RocmVhZF9pc19yZWdpc3RlcmVkKCkgY2FsbGVkIGluIG5vbi10aHJlYWRpbmcgbW9kZSEiKTsKKyAgICByZXR1cm4gUEpfVFJVRTsKKyNlbmRpZgorfQorCisKKy8qCisgKiBHZXQgdGhyZWFkIHByaW9yaXR5IHZhbHVlIGZvciB0aGUgdGhyZWFkLgorICovCitQSl9ERUYoaW50KSBwal90aHJlYWRfZ2V0X3ByaW8ocGpfdGhyZWFkX3QgKnRocmVhZCkKK3sKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKyAgICBpbnQgcG9saWN5OworICAgIGludCByYzsKKworICAgIHJjID0gcHRocmVhZF9nZXRzY2hlZHBhcmFtICh0aHJlYWQtPnRocmVhZCwgJnBvbGljeSwgJnBhcmFtKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gLTE7CisKKyAgICByZXR1cm4gcGFyYW0uc2NoZWRfcHJpb3JpdHk7CisjZWxzZQorICAgIFBKX1VOVVNFRF9BUkcodGhyZWFkKTsKKyAgICByZXR1cm4gMTsKKyNlbmRpZgorfQorCisKKy8qCisgKiBTZXQgdGhlIHRocmVhZCBwcmlvcml0eS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfc2V0X3ByaW8ocGpfdGhyZWFkX3QgKnRocmVhZCwgIGludCBwcmlvKQoreworI2lmIFBKX0hBU19USFJFQURTCisgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOworICAgIGludCBwb2xpY3k7CisgICAgaW50IHJjOworCisgICAgcmMgPSBwdGhyZWFkX2dldHNjaGVkcGFyYW0gKHRocmVhZC0+dGhyZWFkLCAmcG9saWN5LCAmcGFyYW0pOworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocmMpOworCisgICAgcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwcmlvOworCisgICAgcmMgPSBwdGhyZWFkX3NldHNjaGVkcGFyYW0odGhyZWFkLT50aHJlYWQsIHBvbGljeSwgJnBhcmFtKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHJjKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworI2Vsc2UKKyAgICBQSl9VTlVTRURfQVJHKHRocmVhZCk7CisgICAgUEpfVU5VU0VEX0FSRyhwcmlvKTsKKyAgICBwal9hc3NlcnQoInBqX3RocmVhZF9zZXRfcHJpbygpIGNhbGxlZCBpbiBub24tdGhyZWFkaW5nIG1vZGUhIik7CisgICAgcmV0dXJuIDE7CisjZW5kaWYKK30KKworCisvKgorICogR2V0IHRoZSBsb3dlc3QgcHJpb3JpdHkgdmFsdWUgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtLgorICovCitQSl9ERUYoaW50KSBwal90aHJlYWRfZ2V0X3ByaW9fbWluKHBqX3RocmVhZF90ICp0aHJlYWQpCit7CisgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOworICAgIGludCBwb2xpY3k7CisgICAgaW50IHJjOworCisgICAgcmMgPSBwdGhyZWFkX2dldHNjaGVkcGFyYW0odGhyZWFkLT50aHJlYWQsICZwb2xpY3ksICZwYXJhbSk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIC0xOworCisjaWYgZGVmaW5lZChfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORykKKyAgICByZXR1cm4gc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihwb2xpY3kpOworI2VsaWYgZGVmaW5lZCBfX09wZW5CU0RfXworICAgIC8qIFRocmVhZCBwcmlvIG1pbi9tYXggYXJlIGRlY2xhcmVkIGluIE9wZW5CU0QgcHJpdmF0ZSBoZHIgKi8KKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgcGpfYXNzZXJ0KCJwal90aHJlYWRfZ2V0X3ByaW9fbWluKCkgbm90IHN1cHBvcnRlZCEiKTsKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisKKy8qCisgKiBHZXQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdmFsdWUgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtLgorICovCitQSl9ERUYoaW50KSBwal90aHJlYWRfZ2V0X3ByaW9fbWF4KHBqX3RocmVhZF90ICp0aHJlYWQpCit7CisgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOworICAgIGludCBwb2xpY3k7CisgICAgaW50IHJjOworCisgICAgcmMgPSBwdGhyZWFkX2dldHNjaGVkcGFyYW0odGhyZWFkLT50aHJlYWQsICZwb2xpY3ksICZwYXJhbSk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIC0xOworCisjaWYgZGVmaW5lZChfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORykKKyAgICByZXR1cm4gc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwb2xpY3kpOworI2VsaWYgZGVmaW5lZCBfX09wZW5CU0RfXworICAgIC8qIFRocmVhZCBwcmlvIG1pbi9tYXggYXJlIGRlY2xhcmVkIGluIE9wZW5CU0QgcHJpdmF0ZSBoZHIgKi8KKyAgICByZXR1cm4gMzE7CisjZWxzZQorICAgIHBqX2Fzc2VydCgicGpfdGhyZWFkX2dldF9wcmlvX21heCgpIG5vdCBzdXBwb3J0ZWQhIik7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworCisvKgorICogR2V0IG5hdGl2ZSB0aHJlYWQgaGFuZGxlCisgKi8KK1BKX0RFRih2b2lkKikgcGpfdGhyZWFkX2dldF9vc19oYW5kbGUocGpfdGhyZWFkX3QgKnRocmVhZCkgCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTih0aHJlYWQsIE5VTEwpOworCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICByZXR1cm4gJnRocmVhZC0+dGhyZWFkOworI2Vsc2UKKyAgICBwal9hc3NlcnQoInBqX3RocmVhZF9pc19yZWdpc3RlcmVkKCkgY2FsbGVkIGluIG5vbi10aHJlYWRpbmcgbW9kZSEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCisvKgorICogcGpfdGhyZWFkX3JlZ2lzdGVyKC4uKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9yZWdpc3RlciAoIGNvbnN0IGNoYXIgKmNzdHJfdGhyZWFkX25hbWUsCisJCQkJCSBwal90aHJlYWRfZGVzYyBkZXNjLAorCQkJCQkgcGpfdGhyZWFkX3QgKipwdHJfdGhyZWFkKQoreworI2lmIFBKX0hBU19USFJFQURTCisgICAgY2hhciBzdGFja19wdHI7CisgICAgcGpfc3RhdHVzX3QgcmM7CisgICAgcGpfdGhyZWFkX3QgKnRocmVhZCA9IChwal90aHJlYWRfdCAqKWRlc2M7CisgICAgcGpfc3RyX3QgdGhyZWFkX25hbWUgPSBwal9zdHIoKGNoYXIqKWNzdHJfdGhyZWFkX25hbWUpOworCisgICAgLyogU2l6ZSBzYW5pdHkgY2hlY2suICovCisgICAgaWYgKHNpemVvZihwal90aHJlYWRfZGVzYykgPCBzaXplb2YocGpfdGhyZWFkX3QpKSB7CisJcGpfYXNzZXJ0KCEiTm90IGVub3VnaCBwal90aHJlYWRfZGVzYyBzaXplISIpOworCXJldHVybiBQSl9FQlVHOworICAgIH0KKworICAgIC8qIFdhcm4gaWYgdGhpcyB0aHJlYWQgaGFzIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgKi8KKyAgICBpZiAocGpfdGhyZWFkX2xvY2FsX2dldCAodGhyZWFkX3Rsc19pZCkgIT0gMCkgeworCS8vIDIwMDYtMDItMjYgYmVubnlscDoKKwkvLyAgVGhpcyB3b3VsZG4ndCB3b3JrIGluIGFsbCBjYXNlcyEuCisJLy8gIElmIHRocmVhZCBpcyBjcmVhdGVkIGJ5IGV4dGVybmFsIG1vZHVsZSAoZS5nLiBzb3VuZCB0aHJlYWQpLAorCS8vICB0aHJlYWQgbWF5IGJlIHJldXNlZCB3aGlsZSB0aGUgcG9vbCB1c2VkIGZvciB0aGUgdGhyZWFkIGRlc2NyaXB0b3IKKwkvLyAgaGFzIGJlZW4gZGVsZXRlZCBieSBhcHBsaWNhdGlvbi4KKwkvLyp0aHJlYWRfcHRyID0gKHBqX3RocmVhZF90Kilwal90aHJlYWRfbG9jYWxfZ2V0ICh0aHJlYWRfdGxzX2lkKTsKKyAgICAgICAgLy9yZXR1cm4gUEpfU1VDQ0VTUzsKKwlQSl9MT0coNCwoVEhJU19GSUxFLCAiSW5mbzogcG9zc2libHkgcmUtcmVnaXN0ZXJpbmcgZXhpc3RpbmcgIgorCQkJICAgICAidGhyZWFkIikpOworICAgIH0KKworICAgIC8qIE9uIHRoZSBvdGhlciBoYW5kLCBhbHNvIHdhcm4gaWYgdGhlIHRocmVhZCBkZXNjcmlwdG9yIGJ1ZmZlciBzZWVtIHRvCisgICAgICogaGF2ZSBiZWVuIHVzZWQgdG8gcmVnaXN0ZXIgb3RoZXIgdGhyZWFkcy4KKyAgICAgKi8KKyAgICBwal9hc3NlcnQodGhyZWFkLT5zaWduYXR1cmUxICE9IFNJR05BVFVSRTEgfHwKKwkgICAgICB0aHJlYWQtPnNpZ25hdHVyZTIgIT0gU0lHTkFUVVJFMiB8fAorCSAgICAgICh0aHJlYWQtPnRocmVhZCA9PSBwdGhyZWFkX3NlbGYoKSkpOworCisgICAgLyogSW5pdGlhbGl6ZSBhbmQgc2V0IHRoZSB0aHJlYWQgZW50cnkuICovCisgICAgcGpfYnplcm8oZGVzYywgc2l6ZW9mKHN0cnVjdCBwal90aHJlYWRfdCkpOworICAgIHRocmVhZC0+dGhyZWFkID0gcHRocmVhZF9zZWxmKCk7CisgICAgdGhyZWFkLT5zaWduYXR1cmUxID0gU0lHTkFUVVJFMTsKKyAgICB0aHJlYWQtPnNpZ25hdHVyZTIgPSBTSUdOQVRVUkUyOworCisgICAgaWYoY3N0cl90aHJlYWRfbmFtZSAmJiBwal9zdHJsZW4oJnRocmVhZF9uYW1lKSA8IHNpemVvZih0aHJlYWQtPm9ial9uYW1lKS0xKQorCXBqX2Fuc2lfc25wcmludGYodGhyZWFkLT5vYmpfbmFtZSwgc2l6ZW9mKHRocmVhZC0+b2JqX25hbWUpLCAKKwkJCSBjc3RyX3RocmVhZF9uYW1lLCB0aHJlYWQtPnRocmVhZCk7CisgICAgZWxzZQorCXBqX2Fuc2lfc25wcmludGYodGhyZWFkLT5vYmpfbmFtZSwgc2l6ZW9mKHRocmVhZC0+b2JqX25hbWUpLCAKKwkJCSAidGhyJXAiLCAodm9pZCopdGhyZWFkLT50aHJlYWQpOworICAgIAorICAgIHJjID0gcGpfdGhyZWFkX2xvY2FsX3NldCh0aHJlYWRfdGxzX2lkLCB0aHJlYWQpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfYnplcm8oZGVzYywgc2l6ZW9mKHN0cnVjdCBwal90aHJlYWRfdCkpOworCXJldHVybiByYzsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFBKX09TX0hBU19DSEVDS19TVEFDSykgJiYgUEpfT1NfSEFTX0NIRUNLX1NUQUNLIT0wCisgICAgdGhyZWFkLT5zdGtfc3RhcnQgPSAmc3RhY2tfcHRyOworICAgIHRocmVhZC0+c3RrX3NpemUgPSAweEZGRkZGRkZGVUw7CisgICAgdGhyZWFkLT5zdGtfbWF4X3VzYWdlID0gMDsKKyNlbHNlCisgICAgc3RhY2tfcHRyID0gJ1wwJzsKKyNlbmRpZgorCisgICAgKnB0cl90aHJlYWQgPSB0aHJlYWQ7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZWxzZQorICAgIHBqX3RocmVhZF90ICp0aHJlYWQgPSAocGpfdGhyZWFkX3QqKWRlc2M7CisgICAgKnB0cl90aHJlYWQgPSB0aHJlYWQ7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX3RocmVhZF9pbml0KHZvaWQpCisgKi8KK3BqX3N0YXR1c190IHBqX3RocmVhZF9pbml0KHZvaWQpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal9zdGF0dXNfdCByYzsKKyAgICBwal90aHJlYWRfdCAqZHVtbXk7CisKKyAgICByYyA9IHBqX3RocmVhZF9sb2NhbF9hbGxvYygmdGhyZWFkX3Rsc19pZCApOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJcmV0dXJuIHJjOworICAgIH0KKyAgICByZXR1cm4gcGpfdGhyZWFkX3JlZ2lzdGVyKCJ0aHIlcCIsIChsb25nKikmbWFpbl90aHJlYWQsICZkdW1teSk7CisjZWxzZQorICAgIFBKX0xPRygyLChUSElTX0ZJTEUsICJUaHJlYWQgaW5pdCBlcnJvci4gVGhyZWFkaW5nIGlzIG5vdCBlbmFibGVkISIpKTsKKyAgICByZXR1cm4gUEpfRUlOVkFMSURPUDsKKyNlbmRpZgorfQorCisjaWYgUEpfSEFTX1RIUkVBRFMKKy8qCisgKiB0aHJlYWRfbWFpbigpCisgKgorICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBmb3IgYWxsIHRocmVhZHMuCisgKi8KK3N0YXRpYyB2b2lkICp0aHJlYWRfbWFpbih2b2lkICpwYXJhbSkKK3sKKyAgICBwal90aHJlYWRfdCAqcmVjID0gKHBqX3RocmVhZF90KilwYXJhbTsKKyAgICB2b2lkICpyZXN1bHQ7CisgICAgcGpfc3RhdHVzX3QgcmM7CisKKyNpZiBkZWZpbmVkKFBKX09TX0hBU19DSEVDS19TVEFDSykgJiYgUEpfT1NfSEFTX0NIRUNLX1NUQUNLIT0wCisgICAgcmVjLT5zdGtfc3RhcnQgPSAoY2hhciopJnJlYzsKKyNlbmRpZgorCisgICAgLyogU2V0IGN1cnJlbnQgdGhyZWFkIGlkLiAqLworICAgIHJjID0gcGpfdGhyZWFkX2xvY2FsX3NldCh0aHJlYWRfdGxzX2lkLCByZWMpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfYXNzZXJ0KCEiVGhyZWFkIFRMUyBJRCBpcyBub3Qgc2V0IChwal9pbml0KCkgZXJyb3I/KSIpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHN1c3BlbnNpb24gaXMgcmVxdWlyZWQuICovCisgICAgaWYgKHJlYy0+c3VzcGVuZGVkX211dGV4KSB7CisJcGpfbXV0ZXhfbG9jayhyZWMtPnN1c3BlbmRlZF9tdXRleCk7CisJcGpfbXV0ZXhfdW5sb2NrKHJlYy0+c3VzcGVuZGVkX211dGV4KTsKKyAgICB9CisKKyAgICBQSl9MT0coNiwocmVjLT5vYmpfbmFtZSwgIlRocmVhZCBzdGFydGVkIikpOworCisgICAgLyogQ2FsbCB1c2VyJ3MgZW50cnkhICovCisgICAgcmVzdWx0ID0gKHZvaWQqKShsb25nKSgqcmVjLT5wcm9jKShyZWMtPmFyZyk7CisKKyAgICAvKiBEb25lLiAqLworICAgIFBKX0xPRyg2LChyZWMtPm9ial9uYW1lLCAiVGhyZWFkIHF1aXR0aW5nIikpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCisvKgorICogcGpfdGhyZWFkX2NyZWF0ZSguLi4pCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGhyZWFkX2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLCAKKwkJCQkgICAgICBjb25zdCBjaGFyICp0aHJlYWRfbmFtZSwKKwkJCQkgICAgICBwal90aHJlYWRfcHJvYyAqcHJvYywgCisJCQkJICAgICAgdm9pZCAqYXJnLAorCQkJCSAgICAgIHBqX3NpemVfdCBzdGFja19zaXplLCAKKwkJCQkgICAgICB1bnNpZ25lZCBmbGFncywKKwkJCQkgICAgICBwal90aHJlYWRfdCAqKnB0cl90aHJlYWQpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal90aHJlYWRfdCAqcmVjOworICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOworICAgIHZvaWQgKnN0YWNrX2FkZHI7CisgICAgaW50IHJjOworCisgICAgUEpfVU5VU0VEX0FSRyhzdGFja19hZGRyKTsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIHByb2MgJiYgcHRyX3RocmVhZCwgUEpfRUlOVkFMKTsKKworICAgIC8qIENyZWF0ZSB0aHJlYWQgcmVjb3JkIGFuZCBhc3NpZ24gbmFtZSBmb3IgdGhlIHRocmVhZCAqLworICAgIHJlYyA9IChzdHJ1Y3QgcGpfdGhyZWFkX3QqKSBwal9wb29sX3phbGxvYyhwb29sLCBzaXplb2YocGpfdGhyZWFkX3QpKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHJlYywgUEpfRU5PTUVNKTsKKyAgICAKKyAgICAvKiBTZXQgbmFtZS4gKi8KKyAgICBpZiAoIXRocmVhZF9uYW1lKSAKKwl0aHJlYWRfbmFtZSA9ICJ0aHIlcCI7CisgICAgCisgICAgaWYgKHN0cmNocih0aHJlYWRfbmFtZSwgJyUnKSkgeworCXBqX2Fuc2lfc25wcmludGYocmVjLT5vYmpfbmFtZSwgUEpfTUFYX09CSl9OQU1FLCB0aHJlYWRfbmFtZSwgcmVjKTsKKyAgICB9IGVsc2UgeworCXN0cm5jcHkocmVjLT5vYmpfbmFtZSwgdGhyZWFkX25hbWUsIFBKX01BWF9PQkpfTkFNRSk7CisJcmVjLT5vYmpfbmFtZVtQSl9NQVhfT0JKX05BTUUtMV0gPSAnXDAnOworICAgIH0KKworICAgIC8qIFNldCBkZWZhdWx0IHN0YWNrIHNpemUgKi8KKyAgICBpZiAoc3RhY2tfc2l6ZSA9PSAwKQorCXN0YWNrX3NpemUgPSBQSl9USFJFQURfREVGQVVMVF9TVEFDS19TSVpFOworCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyE9MAorICAgIHJlYy0+c3RrX3NpemUgPSBzdGFja19zaXplOworICAgIHJlYy0+c3RrX21heF91c2FnZSA9IDA7CisjZW5kaWYKKworICAgIC8qIEVtdWxhdGUgc3VzcGVuZGVkIHRocmVhZCB3aXRoIG11dGV4LiAqLworICAgIGlmIChmbGFncyAmIFBKX1RIUkVBRF9TVVNQRU5ERUQpIHsKKwlyYyA9IHBqX211dGV4X2NyZWF0ZV9zaW1wbGUocG9vbCwgTlVMTCwgJnJlYy0+c3VzcGVuZGVkX211dGV4KTsKKwlpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCSAgICByZXR1cm4gcmM7CisJfQorCisJcGpfbXV0ZXhfbG9jayhyZWMtPnN1c3BlbmRlZF9tdXRleCk7CisgICAgfSBlbHNlIHsKKwlwal9hc3NlcnQocmVjLT5zdXNwZW5kZWRfbXV0ZXggPT0gTlVMTCk7CisgICAgfQorICAgIAorCisgICAgLyogSW5pdCB0aHJlYWQgYXR0cmlidXRlcyAqLworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZ0aHJlYWRfYXR0cik7CisKKyNpZiBkZWZpbmVkKFBKX1RIUkVBRF9TRVRfU1RBQ0tfU0laRSkgJiYgUEpfVEhSRUFEX1NFVF9TVEFDS19TSVpFIT0wCisgICAgLyogU2V0IHRocmVhZCdzIHN0YWNrIHNpemUgKi8KKyAgICByYyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJnRocmVhZF9hdHRyLCBzdGFja19zaXplKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHJjKTsKKyNlbmRpZgkvKiBQSl9USFJFQURfU0VUX1NUQUNLX1NJWkUgKi8KKworCisjaWYgZGVmaW5lZChQSl9USFJFQURfQUxMT0NBVEVfU1RBQ0spICYmIFBKX1RIUkVBRF9BTExPQ0FURV9TVEFDSyE9MAorICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN0YWNrICovCisgICAgc3RhY2tfYWRkciA9IHBqX3Bvb2xfYWxsb2MocG9vbCwgc3RhY2tfc2l6ZSk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGFja19hZGRyLCBQSl9FTk9NRU0pOworCisgICAgcmMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2thZGRyKCZ0aHJlYWRfYXR0ciwgc3RhY2tfYWRkcik7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyYyk7CisjZW5kaWYJLyogUEpfVEhSRUFEX0FMTE9DQVRFX1NUQUNLICovCisKKworICAgIC8qIENyZWF0ZSB0aGUgdGhyZWFkLiAqLworICAgIHJlYy0+cHJvYyA9IHByb2M7CisgICAgcmVjLT5hcmcgPSBhcmc7CisgICAgcmMgPSBwdGhyZWFkX2NyZWF0ZSggJnJlYy0+dGhyZWFkLCAmdGhyZWFkX2F0dHIsICZ0aHJlYWRfbWFpbiwgcmVjKTsKKyAgICBpZiAocmMgIT0gMCkgeworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocmMpOworICAgIH0KKworICAgICpwdHJfdGhyZWFkID0gcmVjOworCisgICAgUEpfTE9HKDYsIChyZWMtPm9ial9uYW1lLCAiVGhyZWFkIGNyZWF0ZWQiKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZWxzZQorICAgIHBqX2Fzc2VydCghIlRocmVhZGluZyBpcyBkaXNhYmxlZCEiKTsKKyAgICByZXR1cm4gUEpfRUlOVkFMSURPUDsKKyNlbmRpZgorfQorCisvKgorICogcGpfdGhyZWFkLWdldF9uYW1lKCkKKyAqLworUEpfREVGKGNvbnN0IGNoYXIqKSBwal90aHJlYWRfZ2V0X25hbWUocGpfdGhyZWFkX3QgKnApCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal90aHJlYWRfdCAqcmVjID0gKHBqX3RocmVhZF90KilwOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHAsICIiKTsKKworICAgIHJldHVybiByZWMtPm9ial9uYW1lOworI2Vsc2UKKyAgICByZXR1cm4gIiI7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX3RocmVhZF9yZXN1bWUoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9yZXN1bWUocGpfdGhyZWFkX3QgKnApCit7CisgICAgcGpfc3RhdHVzX3QgcmM7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX0FTU0VSVF9SRVRVUk4ocCwgUEpfRUlOVkFMKTsKKworICAgIHJjID0gcGpfbXV0ZXhfdW5sb2NrKHAtPnN1c3BlbmRlZF9tdXRleCk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qCisgKiBwal90aHJlYWRfdGhpcygpCisgKi8KK1BKX0RFRihwal90aHJlYWRfdCopIHBqX3RocmVhZF90aGlzKHZvaWQpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal90aHJlYWRfdCAqcmVjID0gKHBqX3RocmVhZF90Kilwal90aHJlYWRfbG9jYWxfZ2V0KHRocmVhZF90bHNfaWQpOworICAgIAorICAgIGlmIChyZWMgPT0gTlVMTCkgeworCXBqX2Fzc2VydCghIkNhbGxpbmcgcGpsaWIgZnJvbSB1bmtub3duL2V4dGVybmFsIHRocmVhZC4gWW91IG11c3QgIgorCQkgICAicmVnaXN0ZXIgZXh0ZXJuYWwgdGhyZWFkcyB3aXRoIHBqX3RocmVhZF9yZWdpc3RlcigpICIKKwkJICAgImJlZm9yZSBjYWxsaW5nIGFueSBwamxpYiBmdW5jdGlvbnMuIik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNVVNUIE5PVCBjaGVjayBzdGFjayBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgICAgICogYnkgUEpfQ0hFQ0tfU1RBQ0soKSBpdHNlbGYhISEKKyAgICAgKgorICAgICAqLworCisgICAgcmV0dXJuIHJlYzsKKyNlbHNlCisgICAgcGpfYXNzZXJ0KCEiVGhyZWFkaW5nIGlzIG5vdCBlbmFibGVkISIpOworICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKKy8qCisgKiBwal90aHJlYWRfam9pbigpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGhyZWFkX2pvaW4ocGpfdGhyZWFkX3QgKnApCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal90aHJlYWRfdCAqcmVjID0gKHBqX3RocmVhZF90ICopcDsKKyAgICB2b2lkICpyZXQ7CisgICAgaW50IHJlc3VsdDsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBQSl9MT0coNiwgKHBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lLCAiSm9pbmluZyB0aHJlYWQgJXMiLCBwLT5vYmpfbmFtZSkpOworICAgIHJlc3VsdCA9IHB0aHJlYWRfam9pbiggcmVjLT50aHJlYWQsICZyZXQpOworCisgICAgaWYgKHJlc3VsdCA9PSAwKQorCXJldHVybiBQSl9TVUNDRVNTOworICAgIGVsc2UgeworCS8qIENhbGxpbmcgcHRocmVhZF9qb2luKCkgb24gYSB0aHJlYWQgdGhhdCBubyBsb25nZXIgZXhpc3RzIGFuZCAKKwkgKiBnZXR0aW5nIGJhY2sgRVNSQ0ggaXNuJ3QgYW4gZXJyb3IgKGluIHRoaXMgY29udGV4dCkuIAorCSAqIFRoYW5rcyBQaGlsIFRvcnJlIDxwdG9ycmVAemV0cm9uLmNvbT4uCisJICovCisJcmV0dXJuIHJlc3VsdD09RVNSQ0ggPyBQSl9TVUNDRVNTIDogUEpfUkVUVVJOX09TX0VSUk9SKHJlc3VsdCk7CisgICAgfQorI2Vsc2UKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIHBqX2Fzc2VydCghIk5vIG11bHRpdGhyZWFkaW5nIHN1cHBvcnQhIik7CisgICAgcmV0dXJuIFBKX0VJTlZBTElET1A7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX3RocmVhZF9kZXN0cm95KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfZGVzdHJveShwal90aHJlYWRfdCAqcCkKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgLyogRGVzdHJveSBtdXRleCB1c2VkIHRvIHN1c3BlbmQgdGhyZWFkICovCisgICAgaWYgKHAtPnN1c3BlbmRlZF9tdXRleCkgeworCXBqX211dGV4X2Rlc3Ryb3kocC0+c3VzcGVuZGVkX211dGV4KTsKKwlwLT5zdXNwZW5kZWRfbXV0ZXggPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogcGpfdGhyZWFkX3NsZWVwKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfc2xlZXAodW5zaWduZWQgbXNlYykKK3sKKy8qIFRPRE86IHNob3VsZCBjaGFuZ2UgdGhpcyB0byBzb21ldGhpbmcgbGlrZSBQSl9PU19IQVNfTkFOT1NMRUVQICovCisjaWYgZGVmaW5lZChQSl9SVEVNUykgJiYgUEpfUlRFTVMhPTAKKyAgICBlbnVtIHsgTkFOT1NFQ19QRVJfTVNFQyA9IDEwMDAwMDAgfTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgcmVxOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICByZXEudHZfc2VjID0gbXNlYyAvIDEwMDA7CisgICAgcmVxLnR2X25zZWMgPSAobXNlYyAlIDEwMDApICogTkFOT1NFQ19QRVJfTVNFQzsKKworICAgIGlmIChuYW5vc2xlZXAoJnJlcSwgTlVMTCkgPT0gMCkKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKworICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocGpfZ2V0X25hdGl2ZV9vc19lcnJvcigpKTsKKyNlbHNlCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHBqX3NldF9vc19lcnJvcigwKTsKKworICAgIHVzbGVlcChtc2VjICogMTAwMCk7CisKKyAgICAvKiBNYWNPUyBYIChyZXBvcnRlZCBvbiAxMC41KSBzZWVtcyB0byBhbHdheXMgc2V0IGVycm5vIHRvIEVUSU1FRE9VVC4KKyAgICAgKiBJdCBkb2VzIHNvIGJlY2F1c2UgdXNsZWVwKCkgaXMgZGVjbGFyZWQgdG8gcmV0dXJuIGludCwgYW5kIHdlJ3JlCisgICAgICogc3VwcG9zZWQgdG8gY2hlY2sgZm9yIGVycm5vIG9ubHkgd2hlbiB1c2xlZXAoKSByZXR1cm5zIG5vbi16ZXJvLiAKKyAgICAgKiBVbmZvcnR1bmF0ZWx5LCB1c2xlZXAoKSBpcyBkZWNsYXJlZCB0byByZXR1cm4gdm9pZCBpbiBvdGhlciBwbGF0Zm9ybXMKKyAgICAgKiBzbyBpdCdzIG5vdCBwb3NzaWJsZSB0byBhbHdheXMgY2hlY2sgZm9yIHRoZSByZXR1cm4gdmFsdWUgKHVubGVzcyAKKyAgICAgKiB3ZSBhZGQgYSBkZXRlY3Rpb24gcm91dGluZSBpbiBhdXRvY29uZikuCisgICAgICoKKyAgICAgKiBBcyBhIHdvcmthcm91bmQsIGhlcmUgd2UgY2hlY2sgaWYgRVRJTUVET1VUIGlzIHJldHVybmVkIGFuZAorICAgICAqIHJldHVybiBzdWNjZXNzZnVsbHkgaWYgaXQgaXMuCisgICAgICovCisgICAgaWYgKHBqX2dldF9uYXRpdmVfb3NfZXJyb3IoKSA9PSBFVElNRURPVVQpCisJcmV0dXJuIFBKX1NVQ0NFU1M7CisKKyAgICByZXR1cm4gcGpfZ2V0X29zX2Vycm9yKCk7CisKKyNlbmRpZgkvKiBQSl9SVEVNUyAqLworfQorCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyE9MAorLyoKKyAqIHBqX3RocmVhZF9jaGVja19zdGFjaygpCisgKiBJbXBsZW1lbnRhdGlvbiBmb3IgUEpfQ0hFQ0tfU1RBQ0soKQorICovCitQSl9ERUYodm9pZCkgcGpfdGhyZWFkX2NoZWNrX3N0YWNrKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICAgIGNoYXIgc3RrX3B0cjsKKyAgICBwal91aW50MzJfdCB1c2FnZTsKKyAgICBwal90aHJlYWRfdCAqdGhyZWFkID0gcGpfdGhyZWFkX3RoaXMoKTsKKworICAgIC8qIENhbGN1bGF0ZSBjdXJyZW50IHVzYWdlLiAqLworICAgIHVzYWdlID0gKCZzdGtfcHRyID4gdGhyZWFkLT5zdGtfc3RhcnQpID8gJnN0a19wdHIgLSB0aHJlYWQtPnN0a19zdGFydCA6CisJCXRocmVhZC0+c3RrX3N0YXJ0IC0gJnN0a19wdHI7CisKKyAgICAvKiBBc3NlcnQgaWYgc3RhY2sgdXNhZ2UgaXMgZGFuZ2Vyb3VzbHkgaGlnaC4gKi8KKyAgICBwal9hc3NlcnQoIlNUQUNLIE9WRVJGTE9XISEgIiAmJiAodXNhZ2UgPD0gdGhyZWFkLT5zdGtfc2l6ZSAtIDEyOCkpOworCisgICAgLyogS2VlcCBzdGF0aXN0aWMuICovCisgICAgaWYgKHVzYWdlID4gdGhyZWFkLT5zdGtfbWF4X3VzYWdlKSB7CisJdGhyZWFkLT5zdGtfbWF4X3VzYWdlID0gdXNhZ2U7CisJdGhyZWFkLT5jYWxsZXJfZmlsZSA9IGZpbGU7CisJdGhyZWFkLT5jYWxsZXJfbGluZSA9IGxpbmU7CisgICAgfQorfQorCisvKgorICogcGpfdGhyZWFkX2dldF9zdGFja19tYXhfdXNhZ2UoKQorICovCitQSl9ERUYocGpfdWludDMyX3QpIHBqX3RocmVhZF9nZXRfc3RhY2tfbWF4X3VzYWdlKHBqX3RocmVhZF90ICp0aHJlYWQpCit7CisgICAgcmV0dXJuIHRocmVhZC0+c3RrX21heF91c2FnZTsKK30KKworLyoKKyAqIHBqX3RocmVhZF9nZXRfc3RhY2tfaW5mbygpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGhyZWFkX2dldF9zdGFja19pbmZvKCBwal90aHJlYWRfdCAqdGhyZWFkLAorCQkJCQkgICAgICBjb25zdCBjaGFyICoqZmlsZSwKKwkJCQkJICAgICAgaW50ICpsaW5lICkKK3sKKyAgICBwal9hc3NlcnQodGhyZWFkKTsKKworICAgICpmaWxlID0gdGhyZWFkLT5jYWxsZXJfZmlsZTsKKyAgICAqbGluZSA9IHRocmVhZC0+Y2FsbGVyX2xpbmU7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiBQSl9PU19IQVNfQ0hFQ0tfU1RBQ0sgKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIHBqX2F0b21pY19jcmVhdGUoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2F0b21pY19jcmVhdGUoIHBqX3Bvb2xfdCAqcG9vbCwgCisJCQkJICAgICAgcGpfYXRvbWljX3ZhbHVlX3QgaW5pdGlhbCwKKwkJCQkgICAgICBwal9hdG9taWNfdCAqKnB0cl9hdG9taWMpCit7CisgICAgcGpfc3RhdHVzX3QgcmM7CisgICAgcGpfYXRvbWljX3QgKmF0b21pY192YXI7CisKKyAgICBhdG9taWNfdmFyID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBwal9hdG9taWNfdCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGF0b21pY192YXIsIFBKX0VOT01FTSk7CisgICAgCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICByYyA9IHBqX211dGV4X2NyZWF0ZShwb29sLCAiYXRtJXAiLCBQSl9NVVRFWF9TSU1QTEUsICZhdG9taWNfdmFyLT5tdXRleCk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHJjOworI2VuZGlmCisgICAgYXRvbWljX3Zhci0+dmFsdWUgPSBpbml0aWFsOworCisgICAgKnB0cl9hdG9taWMgPSBhdG9taWNfdmFyOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogcGpfYXRvbWljX2Rlc3Ryb3koKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2F0b21pY19kZXN0cm95KCBwal9hdG9taWNfdCAqYXRvbWljX3ZhciApCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihhdG9taWNfdmFyLCBQSl9FSU5WQUwpOworI2lmIFBKX0hBU19USFJFQURTCisgICAgcmV0dXJuIHBqX211dGV4X2Rlc3Ryb3koIGF0b21pY192YXItPm11dGV4ICk7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCit9CisKKy8qCisgKiBwal9hdG9taWNfc2V0KCkKKyAqLworUEpfREVGKHZvaWQpIHBqX2F0b21pY19zZXQocGpfYXRvbWljX3QgKmF0b21pY192YXIsIHBqX2F0b21pY192YWx1ZV90IHZhbHVlKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIHBqX211dGV4X2xvY2soIGF0b21pY192YXItPm11dGV4ICk7CisjZW5kaWYKKyAgICBhdG9taWNfdmFyLT52YWx1ZSA9IHZhbHVlOworI2lmIFBKX0hBU19USFJFQURTCisgICAgcGpfbXV0ZXhfdW5sb2NrKCBhdG9taWNfdmFyLT5tdXRleCk7CisjZW5kaWYgCit9CisKKy8qCisgKiBwal9hdG9taWNfZ2V0KCkKKyAqLworUEpfREVGKHBqX2F0b21pY192YWx1ZV90KSBwal9hdG9taWNfZ2V0KHBqX2F0b21pY190ICphdG9taWNfdmFyKQoreworICAgIHBqX2F0b21pY192YWx1ZV90IG9sZHZhbDsKKyAgICAKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal9tdXRleF9sb2NrKCBhdG9taWNfdmFyLT5tdXRleCApOworI2VuZGlmCisgICAgb2xkdmFsID0gYXRvbWljX3Zhci0+dmFsdWU7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal9tdXRleF91bmxvY2soIGF0b21pY192YXItPm11dGV4KTsKKyNlbmRpZgorICAgIHJldHVybiBvbGR2YWw7Cit9CisKKy8qCisgKiBwal9hdG9taWNfaW5jX2FuZF9nZXQoKQorICovCitQSl9ERUYocGpfYXRvbWljX3ZhbHVlX3QpIHBqX2F0b21pY19pbmNfYW5kX2dldChwal9hdG9taWNfdCAqYXRvbWljX3ZhcikKK3sKKyAgICBwal9hdG9taWNfdmFsdWVfdCBuZXdfdmFsdWU7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal9tdXRleF9sb2NrKCBhdG9taWNfdmFyLT5tdXRleCApOworI2VuZGlmCisgICAgbmV3X3ZhbHVlID0gKythdG9taWNfdmFyLT52YWx1ZTsKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIHBqX211dGV4X3VubG9jayggYXRvbWljX3Zhci0+bXV0ZXgpOworI2VuZGlmCisKKyAgICByZXR1cm4gbmV3X3ZhbHVlOworfQorLyoKKyAqIHBqX2F0b21pY19pbmMoKQorICovCitQSl9ERUYodm9pZCkgcGpfYXRvbWljX2luYyhwal9hdG9taWNfdCAqYXRvbWljX3ZhcikKK3sKKyAgICBwal9hdG9taWNfaW5jX2FuZF9nZXQoYXRvbWljX3Zhcik7Cit9CisKKy8qCisgKiBwal9hdG9taWNfZGVjX2FuZF9nZXQoKQorICovCitQSl9ERUYocGpfYXRvbWljX3ZhbHVlX3QpIHBqX2F0b21pY19kZWNfYW5kX2dldChwal9hdG9taWNfdCAqYXRvbWljX3ZhcikKK3sKKyAgICBwal9hdG9taWNfdmFsdWVfdCBuZXdfdmFsdWU7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal9tdXRleF9sb2NrKCBhdG9taWNfdmFyLT5tdXRleCApOworI2VuZGlmCisgICAgbmV3X3ZhbHVlID0gLS1hdG9taWNfdmFyLT52YWx1ZTsKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIHBqX211dGV4X3VubG9jayggYXRvbWljX3Zhci0+bXV0ZXgpOworI2VuZGlmCisKKyAgICByZXR1cm4gbmV3X3ZhbHVlOworfQorCisvKgorICogcGpfYXRvbWljX2RlYygpCisgKi8KK1BKX0RFRih2b2lkKSBwal9hdG9taWNfZGVjKHBqX2F0b21pY190ICphdG9taWNfdmFyKQoreworICAgIHBqX2F0b21pY19kZWNfYW5kX2dldChhdG9taWNfdmFyKTsKK30KKworLyoKKyAqIHBqX2F0b21pY19hZGRfYW5kX2dldCgpCisgKi8gCitQSl9ERUYocGpfYXRvbWljX3ZhbHVlX3QpIHBqX2F0b21pY19hZGRfYW5kX2dldCggcGpfYXRvbWljX3QgKmF0b21pY192YXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2F0b21pY192YWx1ZV90IHZhbHVlICkKK3sKKyAgICBwal9hdG9taWNfdmFsdWVfdCBuZXdfdmFsdWU7CisKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIHBqX211dGV4X2xvY2soYXRvbWljX3Zhci0+bXV0ZXgpOworI2VuZGlmCisgICAgCisgICAgYXRvbWljX3Zhci0+dmFsdWUgKz0gdmFsdWU7CisgICAgbmV3X3ZhbHVlID0gYXRvbWljX3Zhci0+dmFsdWU7CisKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIHBqX211dGV4X3VubG9jayhhdG9taWNfdmFyLT5tdXRleCk7CisjZW5kaWYKKworICAgIHJldHVybiBuZXdfdmFsdWU7Cit9CisKKy8qCisgKiBwal9hdG9taWNfYWRkKCkKKyAqLyAKK1BKX0RFRih2b2lkKSBwal9hdG9taWNfYWRkKCBwal9hdG9taWNfdCAqYXRvbWljX3ZhciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfYXRvbWljX3ZhbHVlX3QgdmFsdWUgKQoreworICAgIHBqX2F0b21pY19hZGRfYW5kX2dldChhdG9taWNfdmFyLCB2YWx1ZSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBwal90aHJlYWRfbG9jYWxfYWxsb2MoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9sb2NhbF9hbGxvYyhsb25nICpwX2luZGV4KQoreworI2lmIFBKX0hBU19USFJFQURTCisgICAgcHRocmVhZF9rZXlfdCBrZXk7CisgICAgaW50IHJjOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihwX2luZGV4ICE9IE5VTEwsIFBKX0VJTlZBTCk7CisKKyAgICBwal9hc3NlcnQoIHNpemVvZihwdGhyZWFkX2tleV90KSA8PSBzaXplb2YobG9uZykpOworICAgIGlmICgocmM9cHRocmVhZF9rZXlfY3JlYXRlKCZrZXksIE5VTEwpKSAhPSAwKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocmMpOworCisgICAgKnBfaW5kZXggPSBrZXk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZWxzZQorICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPE1BWF9USFJFQURTOyArK2kpIHsKKwlpZiAodGxzX2ZsYWdbaV0gPT0gMCkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IE1BWF9USFJFQURTKSAKKwlyZXR1cm4gUEpfRVRPT01BTlk7CisgICAgCisgICAgdGxzX2ZsYWdbaV0gPSAxOworICAgIHRsc1tpXSA9IE5VTEw7CisKKyAgICAqcF9pbmRleCA9IGk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX3RocmVhZF9sb2NhbF9mcmVlKCkKKyAqLworUEpfREVGKHZvaWQpIHBqX3RocmVhZF9sb2NhbF9mcmVlKGxvbmcgaW5kZXgpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIHB0aHJlYWRfa2V5X2RlbGV0ZShpbmRleCk7CisjZWxzZQorICAgIHRsc19mbGFnW2luZGV4XSA9IDA7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX3RocmVhZF9sb2NhbF9zZXQoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9sb2NhbF9zZXQobG9uZyBpbmRleCwgdm9pZCAqdmFsdWUpCit7CisgICAgLy9DYW4ndCBjaGVjayBzdGFjayBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZQorICAgIC8vYmVnaW5uaW5nIGJlZm9yZSBtYWluIHRocmVhZCBpcyBpbml0aWFsaXplZC4KKyAgICAvL1BKX0NIRUNLX1NUQUNLKCk7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBpbnQgcmM9cHRocmVhZF9zZXRzcGVjaWZpYyhpbmRleCwgdmFsdWUpOworICAgIHJldHVybiByYz09MCA/IFBKX1NVQ0NFU1MgOiBQSl9SRVRVUk5fT1NfRVJST1IocmMpOworI2Vsc2UKKyAgICBwal9hc3NlcnQoaW5kZXggPj0gMCAmJiBpbmRleCA8IE1BWF9USFJFQURTKTsKKyAgICB0bHNbaW5kZXhdID0gdmFsdWU7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZW5kaWYKK30KKworUEpfREVGKHZvaWQqKSBwal90aHJlYWRfbG9jYWxfZ2V0KGxvbmcgaW5kZXgpCit7CisgICAgLy9DYW4ndCBjaGVjayBzdGFjayBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgICAgLy9ieSBQSl9DSEVDS19TVEFDSygpIGl0c2VsZiEhIQorICAgIC8vUEpfQ0hFQ0tfU1RBQ0soKTsKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIHJldHVybiBwdGhyZWFkX2dldHNwZWNpZmljKGluZGV4KTsKKyNlbHNlCisgICAgcGpfYXNzZXJ0KGluZGV4ID49IDAgJiYgaW5kZXggPCBNQVhfVEhSRUFEUyk7CisgICAgcmV0dXJuIHRsc1tpbmRleF07CisjZW5kaWYKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUEpfREVGKHZvaWQpIHBqX2VudGVyX2NyaXRpY2FsX3NlY3Rpb24odm9pZCkKK3sKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIHBqX211dGV4X2xvY2soJmNyaXRpY2FsX3NlY3Rpb24pOworI2VuZGlmCit9CisKK1BKX0RFRih2b2lkKSBwal9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKHZvaWQpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal9tdXRleF91bmxvY2soJmNyaXRpY2FsX3NlY3Rpb24pOworI2VuZGlmCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2lmIGRlZmluZWQoUEpfTElOVVgpICYmIFBKX0xJTlVYIT0wCitQSl9CRUdJTl9ERUNMCitQSl9ERUNMKGludCkgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90KixpbnQpOworUEpfRU5EX0RFQ0wKKyNlbmRpZgorCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9tdXRleChwal9tdXRleF90ICptdXRleCwgY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHI7CisgICAgaW50IHJjOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHJjID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmYXR0cik7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyYyk7CisKKyAgICBpZiAodHlwZSA9PSBQSl9NVVRFWF9TSU1QTEUpIHsKKyNpZiAoZGVmaW5lZChQSl9MSU5VWCkgJiYgUEpfTElOVVghPTApIHx8IFwKKyAgICBkZWZpbmVkKFBKX0hBU19QVEhSRUFEX01VVEVYQVRUUl9TRVRUWVBFKQorCXJjID0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmYXR0ciwgUFRIUkVBRF9NVVRFWF9GQVNUX05QKTsKKyNlbGlmIChkZWZpbmVkKFBKX1JURU1TKSAmJiBQSl9SVEVNUyE9MCkgfHwgXAorICAgICAgIGRlZmluZWQoUEpfUFRIUkVBRF9NVVRFWEFUVFJfVF9IQVNfUkVDVVJTSVZFKQorCS8qIE5vdGhpbmcgdG8gZG8sIGRlZmF1bHQgaXMgc2ltcGxlICovCisjZWxzZQorCXJjID0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmYXR0ciwgUFRIUkVBRF9NVVRFWF9OT1JNQUwpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyNpZiAoZGVmaW5lZChQSl9MSU5VWCkgJiYgUEpfTElOVVghPTApIHx8IFwKKyAgICAgZGVmaW5lZChQSl9IQVNfUFRIUkVBRF9NVVRFWEFUVFJfU0VUVFlQRSkKKwlyYyA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJmF0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsKKyNlbGlmIChkZWZpbmVkKFBKX1JURU1TKSAmJiBQSl9SVEVNUyE9MCkgfHwgXAorICAgICAgIGRlZmluZWQoUEpfUFRIUkVBRF9NVVRFWEFUVFJfVF9IQVNfUkVDVVJTSVZFKQorCS8vIFBoaWwgVG9ycmUgPHB0b3JyZUB6ZXRyb24uY29tPjoKKwkvLyBUaGUgUlRFTVMgaW1wbGVtZW50YXRpb24gb2YgUE9TSVggbXV0ZXhlcyBkb2Vzbid0IGluY2x1ZGUgCisJLy8gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgpLCBzbyB3aGF0IGZvbGxvd3MgaXMgYSBoYWNrCisJLy8gdW50aWwgSSBnZXQgUlRFTVMgcGF0Y2hlZCB0byBzdXBwb3J0IHRoZSBzZXQvZ2V0IGZ1bmN0aW9ucy4KKwkvLworCS8vIE1vcmUgaW5mbzoKKwkvLyAgIG5ld2xpYidzIHB0aHJlYWQgYWxzbyBsYWNrcyBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCksCisJLy8gICBidXQgaXQgc2VlbXMgdG8gaGF2ZSBtdXRleGF0dHIucmVjdXJzaXZlLgorCVBKX1RPRE8oRklYX1JURU1TX1JFQ1VSU0lWRV9NVVRFWF9UWVBFKQorCWF0dHIucmVjdXJzaXZlID0gMTsKKyNlbHNlCisJcmMgPSBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZhdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisjZW5kaWYKKyAgICB9CisgICAgCisgICAgaWYgKHJjICE9IDApIHsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHJjKTsKKyAgICB9CisKKyAgICByYyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXgtPm11dGV4LCAmYXR0cik7CisgICAgaWYgKHJjICE9IDApIHsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHJjKTsKKyAgICB9CisgICAgCisgICAgcmMgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgICBpZiAocmMgIT0gMCkgeworCXBqX3N0YXR1c190IHN0YXR1cyA9IFBKX1JFVFVSTl9PU19FUlJPUihyYyk7CisJcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleC0+bXV0ZXgpOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisjaWYgUEpfREVCVUcKKyAgICAvKiBTZXQgb3duZXIuICovCisgICAgbXV0ZXgtPm5lc3RpbmdfbGV2ZWwgPSAwOworICAgIG11dGV4LT5vd25lciA9IE5VTEw7CisjZW5kaWYKKworICAgIC8qIFNldCBuYW1lLiAqLworICAgIGlmICghbmFtZSkgeworCW5hbWUgPSAibXR4JXAiOworICAgIH0KKyAgICBpZiAoc3RyY2hyKG5hbWUsICclJykpIHsKKwlwal9hbnNpX3NucHJpbnRmKG11dGV4LT5vYmpfbmFtZSwgUEpfTUFYX09CSl9OQU1FLCBuYW1lLCBtdXRleCk7CisgICAgfSBlbHNlIHsKKwlzdHJuY3B5KG11dGV4LT5vYmpfbmFtZSwgbmFtZSwgUEpfTUFYX09CSl9OQU1FKTsKKwltdXRleC0+b2JqX25hbWVbUEpfTUFYX09CSl9OQU1FLTFdID0gJ1wwJzsKKyAgICB9CisKKyAgICBQSl9MT0coNiwgKG11dGV4LT5vYmpfbmFtZSwgIk11dGV4IGNyZWF0ZWQiKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZWxzZSAvKiBQSl9IQVNfVEhSRUFEUyAqLworICAgIHJldHVybiBQSl9TVUNDRVNTOworI2VuZGlmCit9CisKKy8qCisgKiBwal9tdXRleF9jcmVhdGUoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X2NyZWF0ZShwal9wb29sX3QgKnBvb2wsIAorCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLCAKKwkJCQkgICAgaW50IHR5cGUsCisJCQkJICAgIHBqX211dGV4X3QgKipwdHJfbXV0ZXgpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal9zdGF0dXNfdCByYzsKKyAgICBwal9tdXRleF90ICptdXRleDsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBwdHJfbXV0ZXgsIFBKX0VJTlZBTCk7CisKKyAgICBtdXRleCA9IFBKX1BPT0xfQUxMT0NfVChwb29sLCBwal9tdXRleF90KTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG11dGV4LCBQSl9FTk9NRU0pOworCisgICAgaWYgKChyYz1pbml0X211dGV4KG11dGV4LCBuYW1lLCB0eXBlKSkgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gcmM7CisgICAgCisgICAgKnB0cl9tdXRleCA9IG11dGV4OworICAgIHJldHVybiBQSl9TVUNDRVNTOworI2Vsc2UgLyogUEpfSEFTX1RIUkVBRFMgKi8KKyAgICAqcHRyX211dGV4ID0gKHBqX211dGV4X3QqKTE7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX211dGV4X2NyZWF0ZV9zaW1wbGUoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X2NyZWF0ZV9zaW1wbGUoIHBqX3Bvb2xfdCAqcG9vbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICBwal9tdXRleF90ICoqbXV0ZXggKQoreworICAgIHJldHVybiBwal9tdXRleF9jcmVhdGUocG9vbCwgbmFtZSwgUEpfTVVURVhfU0lNUExFLCBtdXRleCk7Cit9CisKKy8qCisgKiBwal9tdXRleF9jcmVhdGVfcmVjdXJzaXZlKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9tdXRleF9jcmVhdGVfcmVjdXJzaXZlKCBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICAgICAgcGpfbXV0ZXhfdCAqKm11dGV4ICkKK3sKKyAgICByZXR1cm4gcGpfbXV0ZXhfY3JlYXRlKHBvb2wsIG5hbWUsIFBKX01VVEVYX1JFQ1VSU0UsIG11dGV4KTsKK30KKworLyoKKyAqIHBqX211dGV4X2xvY2soKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X2xvY2socGpfbXV0ZXhfdCAqbXV0ZXgpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX0FTU0VSVF9SRVRVUk4obXV0ZXgsIFBKX0VJTlZBTCk7CisKKyNpZiBQSl9ERUJVRworICAgIFBKX0xPRyg2LChtdXRleC0+b2JqX25hbWUsICJNdXRleDogdGhyZWFkICVzIGlzIHdhaXRpbmcgKG11dGV4IG93bmVyPSVzKSIsIAorCQkJCXBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lLAorCQkJCW11dGV4LT5vd25lcl9uYW1lKSk7CisjZWxzZQorICAgIFBKX0xPRyg2LChtdXRleC0+b2JqX25hbWUsICJNdXRleDogdGhyZWFkICVzIGlzIHdhaXRpbmciLCAKKwkJCQlwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSkpOworI2VuZGlmCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZtdXRleC0+bXV0ZXggKTsKKworCisjaWYgUEpfREVCVUcKKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwltdXRleC0+b3duZXIgPSBwal90aHJlYWRfdGhpcygpOworCXBqX2Fuc2lfc3RyY3B5KG11dGV4LT5vd25lcl9uYW1lLCBtdXRleC0+b3duZXItPm9ial9uYW1lKTsKKwkrK211dGV4LT5uZXN0aW5nX2xldmVsOworICAgIH0KKworICAgIFBKX0xPRyg2LChtdXRleC0+b2JqX25hbWUsIAorCSAgICAgIChzdGF0dXM9PTAgPyAKKwkJIk11dGV4IGFjcXVpcmVkIGJ5IHRocmVhZCAlcyAobGV2ZWw9JWQpIiA6IAorCQkiTXV0ZXggYWNxdWlzaXRpb24gRkFJTEVEIGJ5ICVzIChsZXZlbD0lZCkiKSwKKwkgICAgICBwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSwKKwkgICAgICBtdXRleC0+bmVzdGluZ19sZXZlbCkpOworI2Vsc2UKKyAgICBQSl9MT0coNiwobXV0ZXgtPm9ial9uYW1lLCAKKwkgICAgICAoc3RhdHVzPT0wID8gIk11dGV4IGFjcXVpcmVkIGJ5IHRocmVhZCAlcyIgOiAiRkFJTEVEIGJ5ICVzIiksCisJICAgICAgcGpfdGhyZWFkX3RoaXMoKS0+b2JqX25hbWUpKTsKKyNlbmRpZgorCisgICAgaWYgKHN0YXR1cyA9PSAwKQorCXJldHVybiBQSl9TVUNDRVNTOworICAgIGVsc2UKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHN0YXR1cyk7CisjZWxzZQkvKiBQSl9IQVNfVEhSRUFEUyAqLworICAgIHBqX2Fzc2VydCggbXV0ZXggPT0gKHBqX211dGV4X3QqKTEgKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyNlbmRpZgorfQorCisvKgorICogcGpfbXV0ZXhfdW5sb2NrKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9tdXRleF91bmxvY2socGpfbXV0ZXhfdCAqbXV0ZXgpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX0FTU0VSVF9SRVRVUk4obXV0ZXgsIFBKX0VJTlZBTCk7CisKKyNpZiBQSl9ERUJVRworICAgIHBqX2Fzc2VydChtdXRleC0+b3duZXIgPT0gcGpfdGhyZWFkX3RoaXMoKSk7CisgICAgaWYgKC0tbXV0ZXgtPm5lc3RpbmdfbGV2ZWwgPT0gMCkgeworCW11dGV4LT5vd25lciA9IE5VTEw7CisJbXV0ZXgtPm93bmVyX25hbWVbMF0gPSAnXDAnOworICAgIH0KKworICAgIFBKX0xPRyg2LChtdXRleC0+b2JqX25hbWUsICJNdXRleCByZWxlYXNlZCBieSB0aHJlYWQgJXMgKGxldmVsPSVkKSIsIAorCQkJCXBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lLCAKKwkJCQltdXRleC0+bmVzdGluZ19sZXZlbCkpOworI2Vsc2UKKyAgICBQSl9MT0coNiwobXV0ZXgtPm9ial9uYW1lLCAiTXV0ZXggcmVsZWFzZWQgYnkgdGhyZWFkICVzIiwgCisJCQkJcGpfdGhyZWFkX3RoaXMoKS0+b2JqX25hbWUpKTsKKyNlbmRpZgorCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZtdXRleC0+bXV0ZXggKTsKKyAgICBpZiAoc3RhdHVzID09IDApCisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgZWxzZQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1Ioc3RhdHVzKTsKKworI2Vsc2UgLyogUEpfSEFTX1RIUkVBRFMgKi8KKyAgICBwal9hc3NlcnQoIG11dGV4ID09IChwal9tdXRleF90KikxICk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX211dGV4X3RyeWxvY2soKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X3RyeWxvY2socGpfbXV0ZXhfdCAqbXV0ZXgpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBpbnQgc3RhdHVzOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG11dGV4LCBQSl9FSU5WQUwpOworCisgICAgUEpfTE9HKDYsKG11dGV4LT5vYmpfbmFtZSwgIk11dGV4OiB0aHJlYWQgJXMgaXMgdHJ5aW5nIiwgCisJCQkJcGpfdGhyZWFkX3RoaXMoKS0+b2JqX25hbWUpKTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayggJm11dGV4LT5tdXRleCApOworCisgICAgaWYgKHN0YXR1cz09MCkgeworI2lmIFBKX0RFQlVHCisJbXV0ZXgtPm93bmVyID0gcGpfdGhyZWFkX3RoaXMoKTsKKwlwal9hbnNpX3N0cmNweShtdXRleC0+b3duZXJfbmFtZSwgbXV0ZXgtPm93bmVyLT5vYmpfbmFtZSk7CisJKyttdXRleC0+bmVzdGluZ19sZXZlbDsKKworCVBKX0xPRyg2LChtdXRleC0+b2JqX25hbWUsICJNdXRleCBhY3F1aXJlZCBieSB0aHJlYWQgJXMgKGxldmVsPSVkKSIsIAorCQkJCSAgIHBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lLAorCQkJCSAgIG11dGV4LT5uZXN0aW5nX2xldmVsKSk7CisjZWxzZQorCVBKX0xPRyg2LChtdXRleC0+b2JqX25hbWUsICJNdXRleCBhY3F1aXJlZCBieSB0aHJlYWQgJXMiLCAKKwkJCQkgIHBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lKSk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworCVBKX0xPRyg2LChtdXRleC0+b2JqX25hbWUsICJNdXRleDogdGhyZWFkICVzJ3MgdHJ5bG9jaygpIGZhaWxlZCIsIAorCQkJCSAgICBwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSkpOworICAgIH0KKyAgICAKKyAgICBpZiAoc3RhdHVzPT0wKQorCXJldHVybiBQSl9TVUNDRVNTOworICAgIGVsc2UKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHN0YXR1cyk7CisjZWxzZQkvKiBQSl9IQVNfVEhSRUFEUyAqLworICAgIHBqX2Fzc2VydCggbXV0ZXggPT0gKHBqX211dGV4X3QqKTEpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworI2VuZGlmCit9CisKKy8qCisgKiBwal9tdXRleF9kZXN0cm95KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9tdXRleF9kZXN0cm95KHBqX211dGV4X3QgKm11dGV4KQoreworICAgIGVudW0geyBSRVRSWSA9IDQgfTsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICB1bnNpZ25lZCByZXRyeTsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihtdXRleCwgUEpfRUlOVkFMKTsKKworI2lmIFBKX0hBU19USFJFQURTCisgICAgUEpfTE9HKDYsKG11dGV4LT5vYmpfbmFtZSwgIk11dGV4IGRlc3Ryb3llZCBieSB0aHJlYWQgJXMiLAorCQkJICAgICAgIHBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lKSk7CisKKyAgICBmb3IgKHJldHJ5PTA7IHJldHJ5PFJFVFJZOyArK3JldHJ5KSB7CisJc3RhdHVzID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCAmbXV0ZXgtPm11dGV4ICk7CisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorCSAgICBicmVhazsKKwllbHNlIGlmIChyZXRyeTxSRVRSWS0xICYmIHN0YXR1cyA9PSBFQlVTWSkKKwkgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4LT5tdXRleCk7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSAwKQorCXJldHVybiBQSl9TVUNDRVNTOworICAgIGVsc2UgeworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1Ioc3RhdHVzKTsKKyAgICB9CisjZWxzZQorICAgIHBqX2Fzc2VydCggbXV0ZXggPT0gKHBqX211dGV4X3QqKTEgKTsKKyAgICBzdGF0dXMgPSBQSl9TVUNDRVNTOworICAgIHJldHVybiBzdGF0dXM7CisjZW5kaWYKK30KKworI2lmIFBKX0RFQlVHCitQSl9ERUYocGpfYm9vbF90KSBwal9tdXRleF9pc19sb2NrZWQocGpfbXV0ZXhfdCAqbXV0ZXgpCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICByZXR1cm4gbXV0ZXgtPm93bmVyID09IHBqX3RocmVhZF90aGlzKCk7CisjZWxzZQorICAgIHJldHVybiAxOworI2VuZGlmCit9CisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIEluY2x1ZGUgUmVhZC9Xcml0ZSBtdXRleCBlbXVsYXRpb24gZm9yIFBPU0lYIHBsYXRmb3JtcyB0aGF0IGxhY2sgaXQgKGUuZy4KKyAqIFJURU1TKS4gT3RoZXJ3aXNlIHVzZSBQT1NJWCByd2xvY2suCisgKi8KKyNpZiBkZWZpbmVkKFBKX0VNVUxBVEVfUldNVVRFWCkgJiYgUEpfRU1VTEFURV9SV01VVEVYIT0wCisgICAgLyogV2UgbmVlZCBzZW1hcGhvcmUgZnVuY3Rpb25hbGl0eSB0byBlbXVsYXRlIHJ3bXV0ZXggKi8KKyMgICBpZiAhZGVmaW5lZChQSl9IQVNfU0VNQVBIT1JFKSB8fCBQSl9IQVNfU0VNQVBIT1JFPT0wCisjCWVycm9yICJTZW1hcGhvcmUgc3VwcG9ydCBuZWVkcyB0byBiZSBlbmFibGVkIHRvIGVtdWxhdGUgcndtdXRleCIKKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgIm9zX3J3bXV0ZXguYyIKKyNlbHNlCitzdHJ1Y3QgcGpfcndtdXRleF90Cit7CisgICAgcHRocmVhZF9yd2xvY2tfdCByd2xvY2s7Cit9OworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3J3bXV0ZXhfY3JlYXRlKHBqX3Bvb2xfdCAqcG9vbCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICBwal9yd211dGV4X3QgKipwX211dGV4KQoreworICAgIHBqX3J3bXV0ZXhfdCAqcndtOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX1VOVVNFRF9BUkcobmFtZSk7CisgICAgCisgICAgcndtID0gUEpfUE9PTF9BTExPQ19UKHBvb2wsIHBqX3J3bXV0ZXhfdCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihyd20sIFBKX0VOT01FTSk7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX3J3bG9ja19pbml0KCZyd20tPnJ3bG9jaywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSAwKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1Ioc3RhdHVzKTsKKworICAgICpwX211dGV4ID0gcndtOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogTG9jayB0aGUgbXV0ZXggZm9yIHJlYWRpbmcuCisgKgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3J3bXV0ZXhfbG9ja19yZWFkKHBqX3J3bXV0ZXhfdCAqbXV0ZXgpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZtdXRleC0+cndsb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IDApCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihzdGF0dXMpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBMb2NrIHRoZSBtdXRleCBmb3Igd3JpdGluZy4KKyAqCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfcndtdXRleF9sb2NrX3dyaXRlKHBqX3J3bXV0ZXhfdCAqbXV0ZXgpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZtdXRleC0+cndsb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IDApCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihzdGF0dXMpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBSZWxlYXNlIHJlYWQgbG9jay4KKyAqCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfcndtdXRleF91bmxvY2tfcmVhZChwal9yd211dGV4X3QgKm11dGV4KQoreworICAgIHJldHVybiBwal9yd211dGV4X3VubG9ja193cml0ZShtdXRleCk7Cit9CisKKy8qCisgKiBSZWxlYXNlIHdyaXRlIGxvY2suCisgKgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3J3bXV0ZXhfdW5sb2NrX3dyaXRlKHBqX3J3bXV0ZXhfdCAqbXV0ZXgpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZtdXRleC0+cndsb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IDApCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihzdGF0dXMpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBEZXN0cm95IHJlYWRlci93cml0ZXIgbXV0ZXguCisgKgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3J3bXV0ZXhfZGVzdHJveShwal9yd211dGV4X3QgKm11dGV4KQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3koJm11dGV4LT5yd2xvY2spOworICAgIGlmIChzdGF0dXMgIT0gMCkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHN0YXR1cyk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworI2VuZGlmCS8qIFBKX0VNVUxBVEVfUldNVVRFWCAqLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNpZiBkZWZpbmVkKFBKX0hBU19TRU1BUEhPUkUpICYmIFBKX0hBU19TRU1BUEhPUkUgIT0gMAorCisvKgorICogcGpfc2VtX2NyZWF0ZSgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc2VtX2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLCAKKwkJCQkgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgIHVuc2lnbmVkIGluaXRpYWwsIAorCQkJCSAgIHVuc2lnbmVkIG1heCwKKwkJCQkgICBwal9zZW1fdCAqKnB0cl9zZW0pCit7CisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICBwal9zZW1fdCAqc2VtOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBvb2wgIT0gTlVMTCAmJiBwdHJfc2VtICE9IE5VTEwsIFBKX0VJTlZBTCk7CisKKyAgICBzZW0gPSBQSl9QT09MX0FMTE9DX1QocG9vbCwgcGpfc2VtX3QpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2VtLCBQSl9FTk9NRU0pOworCisjaWYgZGVmaW5lZChQSl9EQVJXSU5PUykgJiYgUEpfREFSV0lOT1MhPTAKKyAgICAvKiBNYWNPUyBYIGRvZXNuJ3Qgc3VwcG9ydCBhbm9ueW1vdXMgc2VtYXBob3JlICovCisgICAgeworCWNoYXIgc2VtX25hbWVbUEpfR1VJRF9NQVhfTEVOR1RIKzFdOworCXBqX3N0cl90IG5hbTsKKworCS8qIFdlIHNob3VsZCB1c2UgU0VNX05BTUVfTEVOLCBidXQgdGhpcyBkb2Vzbid0IHNlZW0gdG8gYmUgCisJICogZGVjbGFyZWQgYW55d2hlcmU/IFRoZSB2YWx1ZSBoZXJlIGlzIGp1c3QgZnJvbSB0cmlhbCBhbmQgZXJyb3IKKwkgKiB0byBnZXQgdGhlIGxvbmdlc3QgbmFtZSBzdXBwb3J0ZWQuCisJICovCisjCWRlZmluZSBNQVhfU0VNX05BTUVfTEVOCTIzCisKKwkvKiBDcmVhdGUgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlbWFwaG9yZS4gKi8KKwlpZiAoUEpfR1VJRF9TVFJJTkdfTEVOR1RIIDw9IE1BWF9TRU1fTkFNRV9MRU4pIHsKKwkgICAgbmFtLnB0ciA9IHNlbV9uYW1lOworCSAgICBwal9nZW5lcmF0ZV91bmlxdWVfc3RyaW5nKCZuYW0pOworCSAgICBzZW1fbmFtZVtuYW0uc2xlbl0gPSAnXDAnOworCX0gZWxzZSB7CisJICAgIHBqX2NyZWF0ZV9yYW5kb21fc3RyaW5nKHNlbV9uYW1lLCBNQVhfU0VNX05BTUVfTEVOKTsKKwkgICAgc2VtX25hbWVbTUFYX1NFTV9OQU1FX0xFTl0gPSAnXDAnOworCX0KKworCS8qIENyZWF0ZSBzZW1hcGhvcmUgKi8KKwlzZW0tPnNlbSA9IHNlbV9vcGVuKHNlbV9uYW1lLCBPX0NSRUFUfE9fRVhDTCwgU19JUlVTUnxTX0lXVVNSLCAKKwkJCSAgICBpbml0aWFsKTsKKwlpZiAoc2VtLT5zZW0gPT0gU0VNX0ZBSUxFRCkKKwkgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmF0aXZlX29zX2Vycm9yKCkpOworCisJLyogQW5kIGltbWVkaWF0ZWx5IHJlbGVhc2UgdGhlIG5hbWUgYXMgd2UgZG9uJ3QgbmVlZCBpdCAqLworCXNlbV91bmxpbmsoc2VtX25hbWUpOworICAgIH0KKyNlbHNlCisgICAgc2VtLT5zZW0gPSBQSl9QT09MX0FMTE9DX1QocG9vbCwgc2VtX3QpOworICAgIGlmIChzZW1faW5pdCggc2VtLT5zZW0sIDAsIGluaXRpYWwpICE9IDApIAorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocGpfZ2V0X25hdGl2ZV9vc19lcnJvcigpKTsKKyNlbmRpZgorICAgIAorICAgIC8qIFNldCBuYW1lLiAqLworICAgIGlmICghbmFtZSkgeworCW5hbWUgPSAic2VtJXAiOworICAgIH0KKyAgICBpZiAoc3RyY2hyKG5hbWUsICclJykpIHsKKwlwal9hbnNpX3NucHJpbnRmKHNlbS0+b2JqX25hbWUsIFBKX01BWF9PQkpfTkFNRSwgbmFtZSwgc2VtKTsKKyAgICB9IGVsc2UgeworCXN0cm5jcHkoc2VtLT5vYmpfbmFtZSwgbmFtZSwgUEpfTUFYX09CSl9OQU1FKTsKKwlzZW0tPm9ial9uYW1lW1BKX01BWF9PQkpfTkFNRS0xXSA9ICdcMCc7CisgICAgfQorCisgICAgUEpfTE9HKDYsIChzZW0tPm9ial9uYW1lLCAiU2VtYXBob3JlIGNyZWF0ZWQiKSk7CisKKyAgICAqcHRyX3NlbSA9IHNlbTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyNlbHNlCisgICAgKnB0cl9zZW0gPSAocGpfc2VtX3QqKTE7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX3NlbV93YWl0KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zZW1fd2FpdChwal9zZW1fdCAqc2VtKQoreworI2lmIFBKX0hBU19USFJFQURTCisgICAgaW50IHJlc3VsdDsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzZW0sIFBKX0VJTlZBTCk7CisKKyAgICBQSl9MT0coNiwgKHNlbS0+b2JqX25hbWUsICJTZW1hcGhvcmU6IHRocmVhZCAlcyBpcyB3YWl0aW5nIiwgCisJCQkgICAgICBwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSkpOworCisgICAgcmVzdWx0ID0gc2VtX3dhaXQoIHNlbS0+c2VtICk7CisgICAgCisgICAgaWYgKHJlc3VsdCA9PSAwKSB7CisJUEpfTE9HKDYsIChzZW0tPm9ial9uYW1lLCAiU2VtYXBob3JlIGFjcXVpcmVkIGJ5IHRocmVhZCAlcyIsIAorCQkJCSAgcGpfdGhyZWFkX3RoaXMoKS0+b2JqX25hbWUpKTsKKyAgICB9IGVsc2UgeworCVBKX0xPRyg2LCAoc2VtLT5vYmpfbmFtZSwgIlNlbWFwaG9yZTogdGhyZWFkICVzIEZBSUxFRCB0byBhY3F1aXJlIiwgCisJCQkJICBwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSkpOworICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gMCkKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICBlbHNlCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmF0aXZlX29zX2Vycm9yKCkpOworI2Vsc2UKKyAgICBwal9hc3NlcnQoIHNlbSA9PSAocGpfc2VtX3QqKSAxICk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX3NlbV90cnl3YWl0KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zZW1fdHJ5d2FpdChwal9zZW1fdCAqc2VtKQoreworI2lmIFBKX0hBU19USFJFQURTCisgICAgaW50IHJlc3VsdDsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzZW0sIFBKX0VJTlZBTCk7CisKKyAgICByZXN1bHQgPSBzZW1fdHJ5d2FpdCggc2VtLT5zZW0gKTsKKyAgICAKKyAgICBpZiAocmVzdWx0ID09IDApIHsKKwlQSl9MT0coNiwgKHNlbS0+b2JqX25hbWUsICJTZW1hcGhvcmUgYWNxdWlyZWQgYnkgdGhyZWFkICVzIiwgCisJCQkJICBwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSkpOworICAgIH0gCisgICAgaWYgKHJlc3VsdCA9PSAwKQorCXJldHVybiBQSl9TVUNDRVNTOworICAgIGVsc2UKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfb3NfZXJyb3IoKSk7CisjZWxzZQorICAgIHBqX2Fzc2VydCggc2VtID09IChwal9zZW1fdCopMSApOworICAgIHJldHVybiBQSl9TVUNDRVNTOworI2VuZGlmCit9CisKKy8qCisgKiBwal9zZW1fcG9zdCgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc2VtX3Bvc3QocGpfc2VtX3QgKnNlbSkKK3sKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIGludCByZXN1bHQ7CisgICAgUEpfTE9HKDYsIChzZW0tPm9ial9uYW1lLCAiU2VtYXBob3JlIHJlbGVhc2VkIGJ5IHRocmVhZCAlcyIsCisJCQkgICAgICBwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSkpOworICAgIHJlc3VsdCA9IHNlbV9wb3N0KCBzZW0tPnNlbSApOworCisgICAgaWYgKHJlc3VsdCA9PSAwKQorCXJldHVybiBQSl9TVUNDRVNTOworICAgIGVsc2UKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfb3NfZXJyb3IoKSk7CisjZWxzZQorICAgIHBqX2Fzc2VydCggc2VtID09IChwal9zZW1fdCopIDEpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworI2VuZGlmCit9CisKKy8qCisgKiBwal9zZW1fZGVzdHJveSgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc2VtX2Rlc3Ryb3kocGpfc2VtX3QgKnNlbSkKK3sKKyNpZiBQSl9IQVNfVEhSRUFEUworICAgIGludCByZXN1bHQ7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2VtLCBQSl9FSU5WQUwpOworCisgICAgUEpfTE9HKDYsIChzZW0tPm9ial9uYW1lLCAiU2VtYXBob3JlIGRlc3Ryb3llZCBieSB0aHJlYWQgJXMiLAorCQkJICAgICAgcGpfdGhyZWFkX3RoaXMoKS0+b2JqX25hbWUpKTsKKyNpZiBkZWZpbmVkKFBKX0RBUldJTk9TKSAmJiBQSl9EQVJXSU5PUyE9MAorICAgIHJlc3VsdCA9IHNlbV9jbG9zZSggc2VtLT5zZW0gKTsKKyNlbHNlCisgICAgcmVzdWx0ID0gc2VtX2Rlc3Ryb3koIHNlbS0+c2VtICk7CisjZW5kaWYKKworICAgIGlmIChyZXN1bHQgPT0gMCkKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICBlbHNlCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmF0aXZlX29zX2Vycm9yKCkpOworI2Vsc2UKKyAgICBwal9hc3NlcnQoIHNlbSA9PSAocGpfc2VtX3QqKSAxICk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZW5kaWYKK30KKworI2VuZGlmCS8qIFBKX0hBU19TRU1BUEhPUkUgKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2lmIGRlZmluZWQoUEpfSEFTX0VWRU5UX09CSikgJiYgUEpfSEFTX0VWRU5UX09CSiAhPSAwCisKKy8qCisgKiBwal9ldmVudF9jcmVhdGUoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2V2ZW50X2NyZWF0ZShwal9wb29sX3QgKnBvb2wsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgIHBqX2Jvb2xfdCBtYW51YWxfcmVzZXQsIHBqX2Jvb2xfdCBpbml0aWFsLAorCQkJCSAgICBwal9ldmVudF90ICoqcHRyX2V2ZW50KQoreworICAgIHBqX2V2ZW50X3QgKmV2ZW50OworCisgICAgZXZlbnQgPSBQSl9QT09MX0FMTE9DX1QocG9vbCwgcGpfZXZlbnRfdCk7CisKKyAgICBpbml0X211dGV4KCZldmVudC0+bXV0ZXgsIG5hbWUsIFBKX01VVEVYX1NJTVBMRSk7CisgICAgcHRocmVhZF9jb25kX2luaXQoJmV2ZW50LT5jb25kLCAwKTsKKyAgICBldmVudC0+YXV0b19yZXNldCA9ICFtYW51YWxfcmVzZXQ7CisgICAgZXZlbnQtPnRocmVhZHNfd2FpdGluZyA9IDA7CisKKyAgICBpZiAoaW5pdGlhbCkgeworCWV2ZW50LT5zdGF0ZSA9IEVWX1NUQVRFX1NFVDsKKwlldmVudC0+dGhyZWFkc190b19yZWxlYXNlID0gMTsKKyAgICB9IGVsc2UgeworCWV2ZW50LT5zdGF0ZSA9IEVWX1NUQVRFX09GRjsKKwlldmVudC0+dGhyZWFkc190b19yZWxlYXNlID0gMDsKKyAgICB9CisKKyAgICAqcHRyX2V2ZW50ID0gZXZlbnQ7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50X29uX29uZV9yZWxlYXNlKHBqX2V2ZW50X3QgKmV2ZW50KQoreworICAgIGlmIChldmVudC0+c3RhdGUgPT0gRVZfU1RBVEVfU0VUKSB7CisJaWYgKGV2ZW50LT5hdXRvX3Jlc2V0KSB7CisJICAgIGV2ZW50LT50aHJlYWRzX3RvX3JlbGVhc2UgPSAwOworCSAgICBldmVudC0+c3RhdGUgPSBFVl9TVEFURV9PRkY7CisJfSBlbHNlIHsKKwkgICAgLyogTWFudWFsIHJlc2V0IHJlbWFpbnMgb24gKi8KKwl9CisgICAgfSBlbHNlIHsKKwlpZiAoZXZlbnQtPmF1dG9fcmVzZXQpIHsKKwkgICAgLyogT25seSByZWxlYXNlIG9uZSAqLworCSAgICBldmVudC0+dGhyZWFkc190b19yZWxlYXNlID0gMDsKKwkgICAgZXZlbnQtPnN0YXRlID0gRVZfU1RBVEVfT0ZGOworCX0gZWxzZSB7CisJICAgIGV2ZW50LT50aHJlYWRzX3RvX3JlbGVhc2UtLTsKKwkgICAgcGpfYXNzZXJ0KGV2ZW50LT50aHJlYWRzX3RvX3JlbGVhc2UgPj0gMCk7CisJICAgIGlmIChldmVudC0+dGhyZWFkc190b19yZWxlYXNlPT0wKQorCQlldmVudC0+c3RhdGUgPSBFVl9TVEFURV9PRkY7CisJfQorICAgIH0KK30KKworLyoKKyAqIHBqX2V2ZW50X3dhaXQoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2V2ZW50X3dhaXQocGpfZXZlbnRfdCAqZXZlbnQpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZldmVudC0+bXV0ZXgubXV0ZXgpOworICAgIGV2ZW50LT50aHJlYWRzX3dhaXRpbmcrKzsKKyAgICB3aGlsZSAoZXZlbnQtPnN0YXRlID09IEVWX1NUQVRFX09GRikKKwlwdGhyZWFkX2NvbmRfd2FpdCgmZXZlbnQtPmNvbmQsICZldmVudC0+bXV0ZXgubXV0ZXgpOworICAgIGV2ZW50LT50aHJlYWRzX3dhaXRpbmctLTsKKyAgICBldmVudF9vbl9vbmVfcmVsZWFzZShldmVudCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmV2ZW50LT5tdXRleC5tdXRleCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal9ldmVudF90cnl3YWl0KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9ldmVudF90cnl3YWl0KHBqX2V2ZW50X3QgKmV2ZW50KQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZXZlbnQtPm11dGV4Lm11dGV4KTsKKyAgICBzdGF0dXMgPSBldmVudC0+c3RhdGUgIT0gRVZfU1RBVEVfT0ZGID8gUEpfU1VDQ0VTUyA6IC0xOworICAgIGlmIChzdGF0dXM9PVBKX1NVQ0NFU1MpIHsKKwlldmVudF9vbl9vbmVfcmVsZWFzZShldmVudCk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZldmVudC0+bXV0ZXgubXV0ZXgpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIHBqX2V2ZW50X3NldCgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZXZlbnRfc2V0KHBqX2V2ZW50X3QgKmV2ZW50KQoreworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZXZlbnQtPm11dGV4Lm11dGV4KTsKKyAgICBldmVudC0+dGhyZWFkc190b19yZWxlYXNlID0gMTsKKyAgICBldmVudC0+c3RhdGUgPSBFVl9TVEFURV9TRVQ7CisgICAgaWYgKGV2ZW50LT5hdXRvX3Jlc2V0KQorCXB0aHJlYWRfY29uZF9zaWduYWwoJmV2ZW50LT5jb25kKTsKKyAgICBlbHNlCisJcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmZXZlbnQtPmNvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZldmVudC0+bXV0ZXgubXV0ZXgpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogcGpfZXZlbnRfcHVsc2UoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2V2ZW50X3B1bHNlKHBqX2V2ZW50X3QgKmV2ZW50KQoreworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZXZlbnQtPm11dGV4Lm11dGV4KTsKKyAgICBpZiAoZXZlbnQtPnRocmVhZHNfd2FpdGluZykgeworCWV2ZW50LT50aHJlYWRzX3RvX3JlbGVhc2UgPSBldmVudC0+YXV0b19yZXNldCA/IDEgOgorCQkJCQlldmVudC0+dGhyZWFkc193YWl0aW5nOworCWV2ZW50LT5zdGF0ZSA9IEVWX1NUQVRFX1BVTFNFRDsKKwlpZiAoZXZlbnQtPnRocmVhZHNfdG9fcmVsZWFzZT09MSkKKwkgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmZXZlbnQtPmNvbmQpOworCWVsc2UKKwkgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmZXZlbnQtPmNvbmQpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZXZlbnQtPm11dGV4Lm11dGV4KTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIHBqX2V2ZW50X3Jlc2V0KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9ldmVudF9yZXNldChwal9ldmVudF90ICpldmVudCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmV2ZW50LT5tdXRleC5tdXRleCk7CisgICAgZXZlbnQtPnN0YXRlID0gRVZfU1RBVEVfT0ZGOworICAgIGV2ZW50LT50aHJlYWRzX3RvX3JlbGVhc2UgPSAwOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZldmVudC0+bXV0ZXgubXV0ZXgpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogcGpfZXZlbnRfZGVzdHJveSgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZXZlbnRfZGVzdHJveShwal9ldmVudF90ICpldmVudCkKK3sKKyAgICBwal9tdXRleF9kZXN0cm95KCZldmVudC0+bXV0ZXgpOworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZldmVudC0+Y29uZCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKyNlbmRpZgkvKiBQSl9IQVNfRVZFTlRfT0JKICovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNpZiBkZWZpbmVkKFBKX1RFUk1fSEFTX0NPTE9SKSAmJiBQSl9URVJNX0hBU19DT0xPUiAhPSAwCisvKgorICogVGVybWluYWwKKyAqLworCisvKioKKyAqIFNldCB0ZXJtaW5hbCBjb2xvci4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90ZXJtX3NldF9jb2xvcihwal9jb2xvcl90IGNvbG9yKQoreworICAgIC8qIHB1dCBicmlnaHQgcHJlZml4IHRvIGFuc2lfY29sb3IgKi8KKyAgICBjaGFyIGFuc2lfY29sb3JbMTJdID0gIlwwMzNbMDE7MyI7CisKKyAgICBpZiAoY29sb3IgJiBQSl9URVJNX0NPTE9SX0JSSUdIVCkgeworCWNvbG9yIF49IFBKX1RFUk1fQ09MT1JfQlJJR0hUOworICAgIH0gZWxzZSB7CisJc3RyY3B5KGFuc2lfY29sb3IsICJcMDMzWzAwOzMiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvbG9yKSB7CisgICAgY2FzZSAwOgorCS8qIGJsYWNrIGNvbG9yICovCisJc3RyY2F0KGFuc2lfY29sb3IsICIwbSIpOworCWJyZWFrOworICAgIGNhc2UgUEpfVEVSTV9DT0xPUl9SOgorCS8qIHJlZCBjb2xvciAqLworCXN0cmNhdChhbnNpX2NvbG9yLCAiMW0iKTsKKwlicmVhazsKKyAgICBjYXNlIFBKX1RFUk1fQ09MT1JfRzoKKwkvKiBncmVlbiBjb2xvciAqLworCXN0cmNhdChhbnNpX2NvbG9yLCAiMm0iKTsKKwlicmVhazsKKyAgICBjYXNlIFBKX1RFUk1fQ09MT1JfQjoKKwkvKiBibHVlIGNvbG9yICovCisJc3RyY2F0KGFuc2lfY29sb3IsICI0bSIpOworCWJyZWFrOworICAgIGNhc2UgUEpfVEVSTV9DT0xPUl9SIHwgUEpfVEVSTV9DT0xPUl9HOgorCS8qIHllbGxvdyBjb2xvciAqLworCXN0cmNhdChhbnNpX2NvbG9yLCAiM20iKTsKKwlicmVhazsKKyAgICBjYXNlIFBKX1RFUk1fQ09MT1JfUiB8IFBKX1RFUk1fQ09MT1JfQjoKKwkvKiBtYWdlbnRhIGNvbG9yICovCisJc3RyY2F0KGFuc2lfY29sb3IsICI1bSIpOworCWJyZWFrOworICAgIGNhc2UgUEpfVEVSTV9DT0xPUl9HIHwgUEpfVEVSTV9DT0xPUl9COgorCS8qIGN5YW4gY29sb3IgKi8KKwlzdHJjYXQoYW5zaV9jb2xvciwgIjZtIik7CisJYnJlYWs7CisgICAgY2FzZSBQSl9URVJNX0NPTE9SX1IgfCBQSl9URVJNX0NPTE9SX0cgfCBQSl9URVJNX0NPTE9SX0I6CisJLyogd2hpdGUgY29sb3IgKi8KKwlzdHJjYXQoYW5zaV9jb2xvciwgIjdtIik7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwkvKiBkZWZhdWx0IGNvbnNvbGUgY29sb3IgKi8KKwlzdHJjcHkoYW5zaV9jb2xvciwgIlwwMzNbMDBtIik7CisJYnJlYWs7CisgICAgfQorCisgICAgZnB1dHMoYW5zaV9jb2xvciwgc3Rkb3V0KTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKioKKyAqIEdldCBjdXJyZW50IHRlcm1pbmFsIGZvcmVncm91bmQgY29sb3IuCisgKi8KK1BKX0RFRihwal9jb2xvcl90KSBwal90ZXJtX2dldF9jb2xvcih2b2lkKQoreworICAgIHJldHVybiAwOworfQorCisjZW5kaWYJLyogUEpfVEVSTV9IQVNfQ09MT1IgKi8KKworI2lmICFkZWZpbmVkKFBKX0RBUldJTk9TKSB8fCBQSl9EQVJXSU5PUyA9PSAwCisvKgorICogcGpfcnVuX2FwcCgpCisgKi8KK1BKX0RFRihpbnQpIHBqX3J1bl9hcHAocGpfbWFpbl9mdW5jX3B0ciBtYWluX2Z1bmMsIGludCBhcmdjLCBjaGFyICphcmd2W10sCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKQoreworICAgIHJldHVybiAoKm1haW5fZnVuYykoYXJnYywgYXJndik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfY29yZV93aW4zMi5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19jb3JlX3dpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3ZDc4OQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfY29yZV93aW4zMi5jCkBAIC0wLDAgKzEsMTQ1NyBAQAorLyogJElkOiBvc19jb3JlX3dpbjMyLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovZ3VpZC5oPgorI2luY2x1ZGUgPHBqL3JhbmQuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL2V4Y2VwdC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBkZWZpbmVkKFBKX0hBU19XSU5TT0NLX0gpICYmIFBKX0hBU19XSU5TT0NLX0ggIT0gMAorIyAgaW5jbHVkZSA8d2luc29jay5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBKX0hBU19XSU5TT0NLMl9IKSAmJiBQSl9IQVNfV0lOU09DSzJfSCAhPSAwCisjICBpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2VuZGlmCisKKy8qIEFjdGl2YXRlIG11dGV4IHJlbGF0ZWQgbG9nZ2luZyBpZiBQSl9ERUJVR19NVVRFWCBpcyBzZXQsIG90aGVyd2lzZQorICogdXNlIGRlZmF1bHQgbGV2ZWwgNiBsb2dnaW5nLgorICovCisjaWYgZGVmaW5lZChQSl9ERUJVR19NVVRFWCkgJiYgUEpfREVCVUdfTVVURVgKKyMgICB1bmRlZiBQSl9ERUJVRworIyAgIGRlZmluZSBQSl9ERUJVRwkgICAgMQorIyAgIGRlZmluZSBMT0dfTVVURVgoZXhwcikgIFBKX0xPRyg1LGV4cHIpCisjZWxzZQorIyAgIGRlZmluZSBMT0dfTVVURVgoZXhwcikgIFBKX0xPRyg2LGV4cHIpCisjZW5kaWYKKworI2RlZmluZSBUSElTX0ZJTEUJIm9zX2NvcmVfd2luMzIuYyIKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHBqX3RocmVhZF90LgorICovCitzdHJ1Y3QgcGpfdGhyZWFkX3QKK3sKKyAgICBjaGFyCSAgICBvYmpfbmFtZVtQSl9NQVhfT0JKX05BTUVdOworICAgIEhBTkRMRQkgICAgaHRocmVhZDsKKyAgICBEV09SRAkgICAgaWR0aHJlYWQ7CisgICAgcGpfdGhyZWFkX3Byb2MgKnByb2M7CisgICAgdm9pZAkgICAqYXJnOworCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyE9MAorICAgIHBqX3VpbnQzMl90CSAgICBzdGtfc2l6ZTsKKyAgICBwal91aW50MzJfdAkgICAgc3RrX21heF91c2FnZTsKKyAgICBjaGFyCSAgICpzdGtfc3RhcnQ7CisgICAgY29uc3QgY2hhcgkgICAqY2FsbGVyX2ZpbGU7CisgICAgaW50CQkgICAgY2FsbGVyX2xpbmU7CisjZW5kaWYKK307CisKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHBqX211dGV4X3QuCisgKi8KK3N0cnVjdCBwal9tdXRleF90Cit7CisjaWYgUEpfV0lOMzJfV0lOTlQgPj0gMHgwNDAwCisgICAgQ1JJVElDQUxfU0VDVElPTgljcml0OworI2Vsc2UKKyAgICBIQU5ETEUJCWhNdXRleDsKKyNlbmRpZgorICAgIGNoYXIJCW9ial9uYW1lW1BKX01BWF9PQkpfTkFNRV07CisjaWYgUEpfREVCVUcKKyAgICBpbnQJCSAgICAgICAgbmVzdGluZ19sZXZlbDsKKyAgICBwal90aHJlYWRfdAkgICAgICAgKm93bmVyOworI2VuZGlmCit9OworCisvKgorICogSW1wbGVtZW50YXRpb24gb2YgcGpfc2VtX3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBqX3NlbV90Cit7CisgICAgSEFORExFCQloU2VtYXBob3JlOworICAgIGNoYXIJCW9ial9uYW1lW1BKX01BWF9PQkpfTkFNRV07Cit9IHBqX21lbV90OworCisKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBwal9ldmVudF90LgorICovCitzdHJ1Y3QgcGpfZXZlbnRfdAoreworICAgIEhBTkRMRQkJaEV2ZW50OworICAgIGNoYXIJCW9ial9uYW1lW1BKX01BWF9PQkpfTkFNRV07Cit9OworCisvKgorICogSW1wbGVtZW50YXRpb24gb2YgcGpfYXRvbWljX3QuCisgKi8KK3N0cnVjdCBwal9hdG9taWNfdAoreworICAgIGxvbmcgdmFsdWU7Cit9OworCisvKgorICogRmxhZyBhbmQgcmVmZXJlbmNlIGNvdW50ZXIgZm9yIFBKTElCIGluc3RhbmNlLgorICovCitzdGF0aWMgaW50IGluaXRpYWxpemVkOworCisvKgorICogU3RhdGljIGdsb2JhbCB2YXJpYWJsZXMuCisgKi8KK3N0YXRpYyBwal90aHJlYWRfZGVzYyBtYWluX3RocmVhZDsKK3N0YXRpYyBsb25nIHRocmVhZF90bHNfaWQgPSAtMTsKK3N0YXRpYyBwal9tdXRleF90IGNyaXRpY2FsX3NlY3Rpb25fbXV0ZXg7CitzdGF0aWMgdW5zaWduZWQgYXRleGl0X2NvdW50Oworc3RhdGljIHZvaWQgKCphdGV4aXRfZnVuY1szMl0pKHZvaWQpOworCisvKgorICogU29tZSBzdGF0aWMgcHJvdG90eXBlcy4KKyAqLworc3RhdGljIHBqX3N0YXR1c190IGluaXRfbXV0ZXgocGpfbXV0ZXhfdCAqbXV0ZXgsIGNvbnN0IGNoYXIgKm5hbWUpOworCisKKy8qCisgKiBwal9pbml0KHZvaWQpLgorICogSW5pdCBQSkxJQiEKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pbml0KHZvaWQpCit7CisgICAgV1NBREFUQSB3c2E7CisgICAgY2hhciBkdW1teV9ndWlkWzMyXTsgLyogdXNlIG1heGltdW0gR1VJRCBsZW5ndGggKi8KKyAgICBwal9zdHJfdCBndWlkOworICAgIHBqX3N0YXR1c190IHJjOworCisgICAgLyogQ2hlY2sgaWYgUEpMSUIgaGF2ZSBiZWVuIGluaXRpYWxpemVkICovCisgICAgaWYgKGluaXRpYWxpemVkKSB7CisJKytpbml0aWFsaXplZDsKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvKiBJbml0IFdpbnNvY2suLiAqLworICAgIGlmIChXU0FTdGFydHVwKE1BS0VXT1JEKDIsMCksICZ3c2EpICE9IDApIHsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKFdTQUdldExhc3RFcnJvcigpKTsKKyAgICB9CisKKyAgICAvKiBJbml0IHRoaXMgdGhyZWFkJ3MgVExTLiAqLworICAgIGlmICgocmM9cGpfdGhyZWFkX2luaXQoKSkgIT0gUEpfU1VDQ0VTUykgeworCXJldHVybiByYzsKKyAgICB9CisgICAgCisgICAgLyogSW5pdCBsb2dnaW5nICovCisgICAgcGpfbG9nX2luaXQoKTsKKworICAgIC8qIEluaXQgcmFuZG9tIHNlZWQuICovCisgICAgLyogT3IgcHJvYmFibHkgbm90LiBMZXQgYXBwbGljYXRpb24gaW4gY2hhcmdlIG9mIHRoaXMgKi8KKyAgICAvKiBwal9zcmFuZCggR2V0Q3VycmVudFByb2Nlc3NJZCgpICk7ICovCisKKyAgICAvKiBJbml0aWFsaXplIGNyaXRpY2FsIHNlY3Rpb24uICovCisgICAgaWYgKChyYz1pbml0X211dGV4KCZjcml0aWNhbF9zZWN0aW9uX211dGV4LCAicGolcCIpKSAhPSBQSl9TVUNDRVNTKQorCXJldHVybiByYzsKKworICAgIC8qIFN0YXJ0dXAgR1VJRC4gKi8KKyAgICBndWlkLnB0ciA9IGR1bW15X2d1aWQ7CisgICAgcGpfZ2VuZXJhdGVfdW5pcXVlX3N0cmluZyggJmd1aWQgKTsKKworICAgIC8qIEluaXRpYWxpemUgZXhjZXB0aW9uIElEIGZvciB0aGUgcG9vbC4gCisgICAgICogTXVzdCBkbyBzbyBhZnRlciBjcml0aWNhbCBzZWN0aW9uIGlzIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcmMgPSBwal9leGNlcHRpb25faWRfYWxsb2MoIlBKTElCL05vIG1lbW9yeSIsICZQSl9OT19NRU1PUllfRVhDRVBUSU9OKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgLyogU3RhcnR1cCB0aW1lc3RhbXAgKi8KKyNpZiBkZWZpbmVkKFBKX0hBU19ISUdIX1JFU19USU1FUikgJiYgUEpfSEFTX0hJR0hfUkVTX1RJTUVSICE9IDAKKyAgICB7CisJcGpfdGltZXN0YW1wIGR1bW15X3RzOworCWlmICgocmM9cGpfZ2V0X3RpbWVzdGFtcF9mcmVxKCZkdW1teV90cykpICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgcmV0dXJuIHJjOworCX0KKwlpZiAoKHJjPXBqX2dldF90aW1lc3RhbXAoJmR1bW15X3RzKSkgIT0gUEpfU1VDQ0VTUykgeworCSAgICByZXR1cm4gcmM7CisJfQorICAgIH0KKyNlbmRpZiAgIAorCisgICAgLyogRmxhZyBQSkxJQiBhcyBpbml0aWFsaXplZCAqLworICAgICsraW5pdGlhbGl6ZWQ7CisgICAgcGpfYXNzZXJ0KGluaXRpYWxpemVkID09IDEpOworCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgInBqbGliICVzIGZvciB3aW4zMiBpbml0aWFsaXplZCIsCisJICAgICAgUEpfVkVSU0lPTikpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal9hdGV4aXQoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2F0ZXhpdCh2b2lkICgqZnVuYykodm9pZCkpCit7CisgICAgaWYgKGF0ZXhpdF9jb3VudCA+PSBQSl9BUlJBWV9TSVpFKGF0ZXhpdF9mdW5jKSkKKwlyZXR1cm4gUEpfRVRPT01BTlk7CisKKyAgICBhdGV4aXRfZnVuY1thdGV4aXRfY291bnQrK10gPSBmdW5jOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBwal9zaHV0ZG93bih2b2lkKQorICovCitQSl9ERUYodm9pZCkgcGpfc2h1dGRvd24oKQoreworICAgIGludCBpOworCisgICAgLyogT25seSBwZXJmb3JtIHNodXRkb3duIG9wZXJhdGlvbiB3aGVuICdpbml0aWFsaXplZCcgcmVhY2hlcyB6ZXJvICovCisgICAgcGpfYXNzZXJ0KGluaXRpYWxpemVkID4gMCk7CisgICAgaWYgKC0taW5pdGlhbGl6ZWQgIT0gMCkKKwlyZXR1cm47CisKKyAgICAvKiBEaXNwbGF5IHN0YWNrIHVzYWdlICovCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyE9MAorICAgIHsKKwlwal90aHJlYWRfdCAqcmVjID0gKHBqX3RocmVhZF90KiltYWluX3RocmVhZDsKKwlQSl9MT0coNSwocmVjLT5vYmpfbmFtZSwgIk1haW4gdGhyZWFkIHN0YWNrIG1heCB1c2FnZT0ldSBieSAlczolZCIsIAorCQkgIHJlYy0+c3RrX21heF91c2FnZSwgcmVjLT5jYWxsZXJfZmlsZSwgcmVjLT5jYWxsZXJfbGluZSkpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogQ2FsbCBhdGV4aXQoKSBmdW5jdGlvbnMgKi8KKyAgICBmb3IgKGk9YXRleGl0X2NvdW50LTE7IGk+PTA7IC0taSkgeworCSgqYXRleGl0X2Z1bmNbaV0pKCk7CisgICAgfQorICAgIGF0ZXhpdF9jb3VudCA9IDA7CisKKyAgICAvKiBGcmVlIGV4Y2VwdGlvbiBJRCAqLworICAgIGlmIChQSl9OT19NRU1PUllfRVhDRVBUSU9OICE9IC0xKSB7CisJcGpfZXhjZXB0aW9uX2lkX2ZyZWUoUEpfTk9fTUVNT1JZX0VYQ0VQVElPTik7CisJUEpfTk9fTUVNT1JZX0VYQ0VQVElPTiA9IC0xOworICAgIH0KKworICAgIC8qIERlc3Ryb3kgUEpMSUIgY3JpdGljYWwgc2VjdGlvbiAqLworICAgIHBqX211dGV4X2Rlc3Ryb3koJmNyaXRpY2FsX3NlY3Rpb25fbXV0ZXgpOworCisgICAgLyogRnJlZSBQSkxJQiBUTFMgKi8KKyAgICBpZiAodGhyZWFkX3Rsc19pZCAhPSAtMSkgeworCXBqX3RocmVhZF9sb2NhbF9mcmVlKHRocmVhZF90bHNfaWQpOworCXRocmVhZF90bHNfaWQgPSAtMTsKKyAgICB9CisKKyAgICAvKiBDbGVhciBzdGF0aWMgdmFyaWFibGVzICovCisgICAgcGpfZXJybm9fY2xlYXJfaGFuZGxlcnMoKTsKKworICAgIC8qIFRpY2tldCAjMTEzMjogQXNzZXJ0aW9uIHdoZW4gKHJlKXN0YXJ0aW5nIFBKTElCIG9uIGRpZmZlcmVudCB0aHJlYWQgKi8KKyAgICBwal9iemVybyhtYWluX3RocmVhZCwgc2l6ZW9mKG1haW5fdGhyZWFkKSk7CisKKyAgICAvKiBTaHV0ZG93biBXaW5zb2NrICovCisgICAgV1NBQ2xlYW51cCgpOworfQorCisKKy8qCisgKiBwal9nZXRwaWQodm9pZCkKKyAqLworUEpfREVGKHBqX3VpbnQzMl90KSBwal9nZXRwaWQodm9pZCkKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIHJldHVybiBHZXRDdXJyZW50UHJvY2Vzc0lkKCk7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGlzIHRocmVhZCBoYXMgYmVlbiByZWdpc3RlcmVkIHRvIFBKTElCLgorICovCitQSl9ERUYocGpfYm9vbF90KSBwal90aHJlYWRfaXNfcmVnaXN0ZXJlZCh2b2lkKQoreworICAgIHJldHVybiBwal90aHJlYWRfbG9jYWxfZ2V0KHRocmVhZF90bHNfaWQpICE9IDA7Cit9CisKKworLyoKKyAqIEdldCB0aHJlYWQgcHJpb3JpdHkgdmFsdWUgZm9yIHRoZSB0aHJlYWQuCisgKi8KK1BKX0RFRihpbnQpIHBqX3RocmVhZF9nZXRfcHJpbyhwal90aHJlYWRfdCAqdGhyZWFkKQoreworICAgIHJldHVybiBHZXRUaHJlYWRQcmlvcml0eSh0aHJlYWQtPmh0aHJlYWQpOworfQorCisKKy8qCisgKiBTZXQgdGhlIHRocmVhZCBwcmlvcml0eS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfc2V0X3ByaW8ocGpfdGhyZWFkX3QgKnRocmVhZCwgIGludCBwcmlvKQoreworI2lmIFBKX0hBU19USFJFQURTCisgICAgUEpfQVNTRVJUX1JFVFVSTih0aHJlYWQsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihwcmlvPj1USFJFQURfUFJJT1JJVFlfSURMRSAmJiAKKwkJCXByaW88PVRIUkVBRF9QUklPUklUWV9USU1FX0NSSVRJQ0FMLAorCQkgICAgIFBKX0VJTlZBTCk7CisKKyAgICBpZiAoU2V0VGhyZWFkUHJpb3JpdHkodGhyZWFkLT5odGhyZWFkLCBwcmlvKSA9PSBGQUxTRSkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworCisjZWxzZQorICAgIFBKX1VOVVNFRF9BUkcodGhyZWFkKTsKKyAgICBQSl9VTlVTRURfQVJHKHByaW8pOworICAgIHBqX2Fzc2VydCgicGpfdGhyZWFkX3NldF9wcmlvKCkgY2FsbGVkIGluIG5vbi10aHJlYWRpbmcgbW9kZSEiKTsKKyAgICByZXR1cm4gUEpfRUlOVkFMSURPUDsKKyNlbmRpZgorfQorCisKKy8qCisgKiBHZXQgdGhlIGxvd2VzdCBwcmlvcml0eSB2YWx1ZSBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0uCisgKi8KK1BKX0RFRihpbnQpIHBqX3RocmVhZF9nZXRfcHJpb19taW4ocGpfdGhyZWFkX3QgKnRocmVhZCkKK3sKKyAgICBQSl9VTlVTRURfQVJHKHRocmVhZCk7CisgICAgcmV0dXJuIFRIUkVBRF9QUklPUklUWV9JRExFOworfQorCisKKy8qCisgKiBHZXQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdmFsdWUgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtLgorICovCitQSl9ERUYoaW50KSBwal90aHJlYWRfZ2V0X3ByaW9fbWF4KHBqX3RocmVhZF90ICp0aHJlYWQpCit7CisgICAgUEpfVU5VU0VEX0FSRyh0aHJlYWQpOworICAgIHJldHVybiBUSFJFQURfUFJJT1JJVFlfVElNRV9DUklUSUNBTDsKK30KKworCisvKgorICogR2V0IG5hdGl2ZSB0aHJlYWQgaGFuZGxlCisgKi8KK1BKX0RFRih2b2lkKikgcGpfdGhyZWFkX2dldF9vc19oYW5kbGUocGpfdGhyZWFkX3QgKnRocmVhZCkgCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTih0aHJlYWQsIE5VTEwpOworCisjaWYgUEpfSEFTX1RIUkVBRFMKKyAgICByZXR1cm4gdGhyZWFkLT5odGhyZWFkOworI2Vsc2UKKyAgICBwal9hc3NlcnQoInBqX3RocmVhZF9pc19yZWdpc3RlcmVkKCkgY2FsbGVkIGluIG5vbi10aHJlYWRpbmcgbW9kZSEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCisvKgorICogcGpfdGhyZWFkX3JlZ2lzdGVyKC4uKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9yZWdpc3RlciAoIGNvbnN0IGNoYXIgKmNzdHJfdGhyZWFkX25hbWUsCisJCQkJCSBwal90aHJlYWRfZGVzYyBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal90aHJlYWRfdCAqKnRocmVhZF9wdHIpCit7CisgICAgY2hhciBzdGFja19wdHI7CisgICAgcGpfc3RhdHVzX3QgcmM7CisgICAgcGpfdGhyZWFkX3QgKnRocmVhZCA9IChwal90aHJlYWRfdCAqKWRlc2M7CisgICAgcGpfc3RyX3QgdGhyZWFkX25hbWUgPSBwal9zdHIoKGNoYXIqKWNzdHJfdGhyZWFkX25hbWUpOworCisgICAgLyogU2l6ZSBzYW5pdHkgY2hlY2suICovCisgICAgaWYgKHNpemVvZihwal90aHJlYWRfZGVzYykgPCBzaXplb2YocGpfdGhyZWFkX3QpKSB7CisJcGpfYXNzZXJ0KCEiTm90IGVub3VnaCBwal90aHJlYWRfZGVzYyBzaXplISIpOworCXJldHVybiBQSl9FQlVHOworICAgIH0KKworICAgIC8qIElmIGEgdGhyZWFkIGRlc2NyaXB0b3IgaGFzIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUsIGp1c3QgcmV0dXJuIGl0LiAqLworICAgIGlmIChwal90aHJlYWRfbG9jYWxfZ2V0ICh0aHJlYWRfdGxzX2lkKSAhPSAwKSB7CisJLy8gMjAwNi0wMi0yNiBiZW5ueWxwOgorCS8vICBUaGlzIHdvdWxkbid0IHdvcmsgaW4gYWxsIGNhc2VzIS4KKwkvLyAgSWYgdGhyZWFkIGlzIGNyZWF0ZWQgYnkgZXh0ZXJuYWwgbW9kdWxlIChlLmcuIHNvdW5kIHRocmVhZCksCisJLy8gIHRocmVhZCBtYXkgYmUgcmV1c2VkIHdoaWxlIHRoZSBwb29sIHVzZWQgZm9yIHRoZSB0aHJlYWQgZGVzY3JpcHRvcgorCS8vICBoYXMgYmVlbiBkZWxldGVkIGJ5IGFwcGxpY2F0aW9uLgorCS8vKnRocmVhZF9wdHIgPSAocGpfdGhyZWFkX3QqKXBqX3RocmVhZF9sb2NhbF9nZXQgKHRocmVhZF90bHNfaWQpOworICAgICAgICAvL3JldHVybiBQSl9TVUNDRVNTOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgYW5kIHNldCB0aGUgdGhyZWFkIGVudHJ5LiAqLworICAgIHBqX2J6ZXJvKGRlc2MsIHNpemVvZihzdHJ1Y3QgcGpfdGhyZWFkX3QpKTsKKyAgICB0aHJlYWQtPmh0aHJlYWQgPSBHZXRDdXJyZW50VGhyZWFkKCk7CisgICAgdGhyZWFkLT5pZHRocmVhZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyE9MAorICAgIHRocmVhZC0+c3RrX3N0YXJ0ID0gJnN0YWNrX3B0cjsKKyAgICB0aHJlYWQtPnN0a19zaXplID0gMHhGRkZGRkZGRlVMOworICAgIHRocmVhZC0+c3RrX21heF91c2FnZSA9IDA7CisjZWxzZQorICAgIHN0YWNrX3B0ciA9ICdcMCc7CisjZW5kaWYKKworICAgIGlmIChjc3RyX3RocmVhZF9uYW1lICYmIHBqX3N0cmxlbigmdGhyZWFkX25hbWUpIDwgc2l6ZW9mKHRocmVhZC0+b2JqX25hbWUpLTEpCisJcGpfYW5zaV9zbnByaW50Zih0aHJlYWQtPm9ial9uYW1lLCBzaXplb2YodGhyZWFkLT5vYmpfbmFtZSksIAorCQkJIGNzdHJfdGhyZWFkX25hbWUsIHRocmVhZC0+aWR0aHJlYWQpOworICAgIGVsc2UKKwlwal9hbnNpX3NucHJpbnRmKHRocmVhZC0+b2JqX25hbWUsIHNpemVvZih0aHJlYWQtPm9ial9uYW1lKSwgCisJCSAgICAgICAgICJ0aHIlcCIsICh2b2lkKikocGpfc3NpemVfdCl0aHJlYWQtPmlkdGhyZWFkKTsKKyAgICAKKyAgICByYyA9IHBqX3RocmVhZF9sb2NhbF9zZXQodGhyZWFkX3Rsc19pZCwgdGhyZWFkKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gcmM7CisKKyAgICAqdGhyZWFkX3B0ciA9IHRocmVhZDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIHBqX3RocmVhZF9pbml0KHZvaWQpCisgKi8KK3BqX3N0YXR1c190IHBqX3RocmVhZF9pbml0KHZvaWQpCit7CisgICAgcGpfc3RhdHVzX3QgcmM7CisgICAgcGpfdGhyZWFkX3QgKnRocmVhZDsKKworICAgIHJjID0gcGpfdGhyZWFkX2xvY2FsX2FsbG9jKCZ0aHJlYWRfdGxzX2lkKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gcmM7CisKKyAgICByZXR1cm4gcGpfdGhyZWFkX3JlZ2lzdGVyKCJ0aHIlcCIsIG1haW5fdGhyZWFkLCAmdGhyZWFkKTsKK30KKworc3RhdGljIERXT1JEIFdJTkFQSSB0aHJlYWRfbWFpbih2b2lkICpwYXJhbSkKK3sKKyAgICBwal90aHJlYWRfdCAqcmVjID0gcGFyYW07CisgICAgRFdPUkQgcmVzdWx0OworCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyE9MAorICAgIHJlYy0+c3RrX3N0YXJ0ID0gKGNoYXIqKSZyZWM7CisjZW5kaWYKKworICAgIGlmIChwal90aHJlYWRfbG9jYWxfc2V0KHRocmVhZF90bHNfaWQsIHJlYykgIT0gUEpfU1VDQ0VTUykgeworCXBqX2Fzc2VydCghIlRMUyBpcyBub3Qgc2V0IChwal9pbml0KCkgZXJyb3I/KSIpOworICAgIH0KKworICAgIFBKX0xPRyg2LChyZWMtPm9ial9uYW1lLCAiVGhyZWFkIHN0YXJ0ZWQiKSk7CisKKyAgICByZXN1bHQgPSAoKnJlYy0+cHJvYykocmVjLT5hcmcpOworCisgICAgUEpfTE9HKDYsKHJlYy0+b2JqX25hbWUsICJUaHJlYWQgcXVpdHRpbmciKSk7CisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyE9MAorICAgIFBKX0xPRyg1LChyZWMtPm9ial9uYW1lLCAiVGhyZWFkIHN0YWNrIG1heCB1c2FnZT0ldSBieSAlczolZCIsIAorCSAgICAgIHJlYy0+c3RrX21heF91c2FnZSwgcmVjLT5jYWxsZXJfZmlsZSwgcmVjLT5jYWxsZXJfbGluZSkpOworI2VuZGlmCisKKyAgICByZXR1cm4gKERXT1JEKXJlc3VsdDsKK30KKworLyoKKyAqIHBqX3RocmVhZF9jcmVhdGUoLi4uKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9jcmVhdGUoIHBqX3Bvb2xfdCAqcG9vbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRocmVhZF9uYW1lLAorCQkJCSAgICAgIHBqX3RocmVhZF9wcm9jICpwcm9jLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnLAorCQkJCSAgICAgIHBqX3NpemVfdCBzdGFja19zaXplLCAKKwkJCQkgICAgICB1bnNpZ25lZCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdGhyZWFkX3QgKip0aHJlYWRfcHRyKQoreworICAgIERXT1JEIGR3ZmxhZ3MgPSAwOworICAgIHBqX3RocmVhZF90ICpyZWM7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBwcm9jICYmIHRocmVhZF9wdHIsIFBKX0VJTlZBTCk7CisKKyAgICAvKiBTZXQgZmxhZ3MgKi8KKyAgICBpZiAoZmxhZ3MgJiBQSl9USFJFQURfU1VTUEVOREVEKQorCWR3ZmxhZ3MgfD0gQ1JFQVRFX1NVU1BFTkRFRDsKKworICAgIC8qIENyZWF0ZSB0aHJlYWQgcmVjb3JkIGFuZCBhc3NpZ24gbmFtZSBmb3IgdGhlIHRocmVhZCAqLworICAgIHJlYyA9IChzdHJ1Y3QgcGpfdGhyZWFkX3QqKSBwal9wb29sX2NhbGxvYyhwb29sLCAxLCBzaXplb2YocGpfdGhyZWFkX3QpKTsKKyAgICBpZiAoIXJlYykKKwlyZXR1cm4gUEpfRU5PTUVNOworCisgICAgLyogU2V0IG5hbWUuICovCisgICAgaWYgKCF0aHJlYWRfbmFtZSkKKwl0aHJlYWRfbmFtZSA9ICJ0aHIlcCI7CisKKyAgICBpZiAoc3RyY2hyKHRocmVhZF9uYW1lLCAnJScpKSB7CisJcGpfYW5zaV9zbnByaW50ZihyZWMtPm9ial9uYW1lLCBQSl9NQVhfT0JKX05BTUUsIHRocmVhZF9uYW1lLCByZWMpOworICAgIH0gZWxzZSB7CisJcGpfYW5zaV9zdHJuY3B5KHJlYy0+b2JqX25hbWUsIHRocmVhZF9uYW1lLCBQSl9NQVhfT0JKX05BTUUpOworCXJlYy0+b2JqX25hbWVbUEpfTUFYX09CSl9OQU1FLTFdID0gJ1wwJzsKKyAgICB9CisKKyAgICBQSl9MT0coNiwgKHJlYy0+b2JqX25hbWUsICJUaHJlYWQgY3JlYXRlZCIpKTsKKworI2lmIGRlZmluZWQoUEpfT1NfSEFTX0NIRUNLX1NUQUNLKSAmJiBQSl9PU19IQVNfQ0hFQ0tfU1RBQ0shPTAKKyAgICByZWMtPnN0a19zaXplID0gc3RhY2tfc2l6ZSA/IChwal91aW50MzJfdClzdGFja19zaXplIDogMHhGRkZGRkZGRlVMOworICAgIHJlYy0+c3RrX21heF91c2FnZSA9IDA7CisjZW5kaWYKKworICAgIC8qIENyZWF0ZSB0aGUgdGhyZWFkLiAqLworICAgIHJlYy0+cHJvYyA9IHByb2M7CisgICAgcmVjLT5hcmcgPSBhcmc7CisgICAgcmVjLT5odGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsIHN0YWNrX3NpemUsIAorCQkJCXRocmVhZF9tYWluLCByZWMsCisJCQkJZHdmbGFncywgJnJlYy0+aWR0aHJlYWQpOworICAgIGlmIChyZWMtPmh0aHJlYWQgPT0gTlVMTCkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKKworICAgIC8qIFN1Y2Nlc3MhICovCisgICAgKnRocmVhZF9wdHIgPSByZWM7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal90aHJlYWQtZ2V0X25hbWUoKQorICovCitQSl9ERUYoY29uc3QgY2hhciopIHBqX3RocmVhZF9nZXRfbmFtZShwal90aHJlYWRfdCAqcCkKK3sKKyAgICBwal90aHJlYWRfdCAqcmVjID0gKHBqX3RocmVhZF90KilwOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHAsICIiKTsKKworICAgIHJldHVybiByZWMtPm9ial9uYW1lOworfQorCisvKgorICogcGpfdGhyZWFkX3Jlc3VtZSgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGhyZWFkX3Jlc3VtZShwal90aHJlYWRfdCAqcCkKK3sKKyAgICBwal90aHJlYWRfdCAqcmVjID0gKHBqX3RocmVhZF90KilwOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHAsIFBKX0VJTlZBTCk7CisKKyAgICBpZiAoUmVzdW1lVGhyZWFkKHJlYy0+aHRocmVhZCkgPT0gKERXT1JEKS0xKQorICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogcGpfdGhyZWFkX3RoaXMoKQorICovCitQSl9ERUYocGpfdGhyZWFkX3QqKSBwal90aHJlYWRfdGhpcyh2b2lkKQoreworICAgIHBqX3RocmVhZF90ICpyZWMgPSBwal90aHJlYWRfbG9jYWxfZ2V0KHRocmVhZF90bHNfaWQpOworCisgICAgaWYgKHJlYyA9PSBOVUxMKSB7CisJcGpfYXNzZXJ0KCEiQ2FsbGluZyBwamxpYiBmcm9tIHVua25vd24vZXh0ZXJuYWwgdGhyZWFkLiBZb3UgbXVzdCAiCisJCSAgICJyZWdpc3RlciBleHRlcm5hbCB0aHJlYWRzIHdpdGggcGpfdGhyZWFkX3JlZ2lzdGVyKCkgIgorCQkgICAiYmVmb3JlIGNhbGxpbmcgYW55IHBqbGliIGZ1bmN0aW9ucy4iKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE1VU1QgTk9UIGNoZWNrIHN0YWNrIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAgICAgKiBieSBQSl9DSEVDS19TVEFDSygpIGl0c2VsZiEhIQorICAgICAqCisgICAgICovCisKKyAgICByZXR1cm4gcmVjOworfQorCisvKgorICogcGpfdGhyZWFkX2pvaW4oKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9qb2luKHBqX3RocmVhZF90ICpwKQoreworICAgIHBqX3RocmVhZF90ICpyZWMgPSAocGpfdGhyZWFkX3QgKilwOworICAgIERXT1JEIHJjOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHAsIFBKX0VJTlZBTCk7CisKKyAgICBpZiAocCA9PSBwal90aHJlYWRfdGhpcygpKQorCXJldHVybiBQSl9FQ0FOQ0VMTEVEOworCisgICAgUEpfTE9HKDYsIChwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSwgIkpvaW5pbmcgdGhyZWFkICVzIiwgcC0+b2JqX25hbWUpKTsKKworICAgIHJjID0gV2FpdEZvclNpbmdsZU9iamVjdChyZWMtPmh0aHJlYWQsIElORklOSVRFKTsKKworICAgIGlmIChyYz09V0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgZWxzZSBpZiAocmM9PVdBSVRfVElNRU9VVCkKKyAgICAgICAgcmV0dXJuIFBKX0VUSU1FRE9VVDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworfQorCisvKgorICogcGpfdGhyZWFkX2Rlc3Ryb3koKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9kZXN0cm95KHBqX3RocmVhZF90ICpwKQoreworICAgIHBqX3RocmVhZF90ICpyZWMgPSAocGpfdGhyZWFkX3QgKilwOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHAsIFBKX0VJTlZBTCk7CisKKyAgICBpZiAoQ2xvc2VIYW5kbGUocmVjLT5odGhyZWFkKSA9PSBUUlVFKQorICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworfQorCisvKgorICogcGpfdGhyZWFkX3NsZWVwKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aHJlYWRfc2xlZXAodW5zaWduZWQgbXNlYykKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFNsZWVwKG1zZWMpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyAhPSAwCisvKgorICogcGpfdGhyZWFkX2NoZWNrX3N0YWNrKCkKKyAqIEltcGxlbWVudGF0aW9uIGZvciBQSl9DSEVDS19TVEFDSygpCisgKi8KK1BKX0RFRih2b2lkKSBwal90aHJlYWRfY2hlY2tfc3RhY2soY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCit7CisgICAgY2hhciBzdGtfcHRyOworICAgIHBqX3VpbnQzMl90IHVzYWdlOworICAgIHBqX3RocmVhZF90ICp0aHJlYWQgPSBwal90aHJlYWRfdGhpcygpOworCisgICAgcGpfYXNzZXJ0KHRocmVhZCk7CisKKyAgICAvKiBDYWxjdWxhdGUgY3VycmVudCB1c2FnZS4gKi8KKyAgICB1c2FnZSA9ICgmc3RrX3B0ciA+IHRocmVhZC0+c3RrX3N0YXJ0KSA/IAorCQkocGpfdWludDMyX3QpKCZzdGtfcHRyIC0gdGhyZWFkLT5zdGtfc3RhcnQpIDoKKwkJKHBqX3VpbnQzMl90KSh0aHJlYWQtPnN0a19zdGFydCAtICZzdGtfcHRyKTsKKworICAgIC8qIEFzc2VydCBpZiBzdGFjayB1c2FnZSBpcyBkYW5nZXJvdXNseSBoaWdoLiAqLworICAgIHBqX2Fzc2VydCgiU1RBQ0sgT1ZFUkZMT1chISAiICYmICh1c2FnZSA8PSB0aHJlYWQtPnN0a19zaXplIC0gMTI4KSk7CisKKyAgICAvKiBLZWVwIHN0YXRpc3RpYy4gKi8KKyAgICBpZiAodXNhZ2UgPiB0aHJlYWQtPnN0a19tYXhfdXNhZ2UpIHsKKwl0aHJlYWQtPnN0a19tYXhfdXNhZ2UgPSB1c2FnZTsKKwl0aHJlYWQtPmNhbGxlcl9maWxlID0gZmlsZTsKKwl0aHJlYWQtPmNhbGxlcl9saW5lID0gbGluZTsKKyAgICB9CisKK30KKworLyoKKyAqIHBqX3RocmVhZF9nZXRfc3RhY2tfbWF4X3VzYWdlKCkKKyAqLworUEpfREVGKHBqX3VpbnQzMl90KSBwal90aHJlYWRfZ2V0X3N0YWNrX21heF91c2FnZShwal90aHJlYWRfdCAqdGhyZWFkKQoreworICAgIHJldHVybiB0aHJlYWQtPnN0a19tYXhfdXNhZ2U7Cit9CisKKy8qCisgKiBwal90aHJlYWRfZ2V0X3N0YWNrX2luZm8oKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9nZXRfc3RhY2tfaW5mbyggcGpfdGhyZWFkX3QgKnRocmVhZCwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqKmZpbGUsCisJCQkJCSAgICAgIGludCAqbGluZSApCit7CisgICAgcGpfYXNzZXJ0KHRocmVhZCk7CisKKyAgICAqZmlsZSA9IHRocmVhZC0+Y2FsbGVyX2ZpbGU7CisgICAgKmxpbmUgPSB0aHJlYWQtPmNhbGxlcl9saW5lOworICAgIHJldHVybiAwOworfQorCisjZW5kaWYJLyogUEpfT1NfSEFTX0NIRUNLX1NUQUNLICovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKgorICogcGpfYXRvbWljX2NyZWF0ZSgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfYXRvbWljX2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfYXRvbWljX3ZhbHVlX3QgaW5pdGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfYXRvbWljX3QgKiphdG9taWNfcHRyKQoreworICAgIHBqX2F0b21pY190ICphdG9taWNfdmFyID0gcGpfcG9vbF9hbGxvYyhwb29sLCBzaXplb2YocGpfYXRvbWljX3QpKTsKKyAgICBpZiAoIWF0b21pY192YXIpCisJcmV0dXJuIFBKX0VOT01FTTsKKworICAgIGF0b21pY192YXItPnZhbHVlID0gaW5pdGlhbDsKKyAgICAqYXRvbWljX3B0ciA9IGF0b21pY192YXI7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIHBqX2F0b21pY19kZXN0cm95KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9hdG9taWNfZGVzdHJveSggcGpfYXRvbWljX3QgKnZhciApCit7CisgICAgUEpfVU5VU0VEX0FSRyh2YXIpOworICAgIFBKX0FTU0VSVF9SRVRVUk4odmFyLCBQSl9FSU5WQUwpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwal9hdG9taWNfc2V0KCkKKyAqLworUEpfREVGKHZvaWQpIHBqX2F0b21pY19zZXQoIHBqX2F0b21pY190ICphdG9taWNfdmFyLCBwal9hdG9taWNfdmFsdWVfdCB2YWx1ZSkKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgSW50ZXJsb2NrZWRFeGNoYW5nZSgmYXRvbWljX3Zhci0+dmFsdWUsIHZhbHVlKTsKK30KKworLyoKKyAqIHBqX2F0b21pY19nZXQoKQorICovCitQSl9ERUYocGpfYXRvbWljX3ZhbHVlX3QpIHBqX2F0b21pY19nZXQocGpfYXRvbWljX3QgKmF0b21pY192YXIpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGF0b21pY192YXIsIDApOworCisgICAgcmV0dXJuIGF0b21pY192YXItPnZhbHVlOworfQorCisvKgorICogcGpfYXRvbWljX2luY19hbmRfZ2V0KCkKKyAqLworUEpfREVGKHBqX2F0b21pY192YWx1ZV90KSBwal9hdG9taWNfaW5jX2FuZF9nZXQocGpfYXRvbWljX3QgKmF0b21pY192YXIpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworI2lmIGRlZmluZWQoUEpfV0lOMzJfV0lOTlQpICYmIFBKX1dJTjMyX1dJTk5UID49IDB4MDQwMAorICAgIHJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCgmYXRvbWljX3Zhci0+dmFsdWUpOworI2Vsc2UKKyAgICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJmF0b21pY192YXItPnZhbHVlKTsKKyNlbmRpZgorfQorCisvKgorICogcGpfYXRvbWljX2luYygpCisgKi8KK1BKX0RFRih2b2lkKSBwal9hdG9taWNfaW5jKHBqX2F0b21pY190ICphdG9taWNfdmFyKQoreworICAgIHBqX2F0b21pY19pbmNfYW5kX2dldChhdG9taWNfdmFyKTsKK30KKworLyoKKyAqIHBqX2F0b21pY19kZWNfYW5kX2dldCgpCisgKi8KK1BKX0RFRihwal9hdG9taWNfdmFsdWVfdCkgcGpfYXRvbWljX2RlY19hbmRfZ2V0KHBqX2F0b21pY190ICphdG9taWNfdmFyKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyNpZiBkZWZpbmVkKFBKX1dJTjMyX1dJTk5UKSAmJiBQSl9XSU4zMl9XSU5OVCA+PSAweDA0MDAKKyAgICByZXR1cm4gSW50ZXJsb2NrZWREZWNyZW1lbnQoJmF0b21pY192YXItPnZhbHVlKTsKKyNlbHNlCisgICAgcmV0dXJuIEludGVybG9ja2VkRGVjcmVtZW50KCZhdG9taWNfdmFyLT52YWx1ZSk7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX2F0b21pY19kZWMoKQorICovCitQSl9ERUYodm9pZCkgcGpfYXRvbWljX2RlYyhwal9hdG9taWNfdCAqYXRvbWljX3ZhcikKK3sKKyAgICBwal9hdG9taWNfZGVjX2FuZF9nZXQoYXRvbWljX3Zhcik7Cit9CisKKy8qCisgKiBwal9hdG9taWNfYWRkKCkKKyAqLworUEpfREVGKHZvaWQpIHBqX2F0b21pY19hZGQoIHBqX2F0b21pY190ICphdG9taWNfdmFyLAorCQkJICAgIHBqX2F0b21pY192YWx1ZV90IHZhbHVlICkKK3sKKyNpZiBkZWZpbmVkKFBKX1dJTjMyX1dJTk5UKSAmJiBQSl9XSU4zMl9XSU5OVCA+PSAweDA0MDAKKyAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAmYXRvbWljX3Zhci0+dmFsdWUsIHZhbHVlICk7CisjZWxzZQorICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICZhdG9taWNfdmFyLT52YWx1ZSwgdmFsdWUgKTsKKyNlbmRpZgorfQorCisvKgorICogcGpfYXRvbWljX2FkZF9hbmRfZ2V0KCkKKyAqLworUEpfREVGKHBqX2F0b21pY192YWx1ZV90KSBwal9hdG9taWNfYWRkX2FuZF9nZXQoIHBqX2F0b21pY190ICphdG9taWNfdmFyLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2F0b21pY192YWx1ZV90IHZhbHVlKQoreworI2lmIGRlZmluZWQoUEpfV0lOMzJfV0lOTlQpICYmIFBKX1dJTjMyX1dJTk5UID49IDB4MDQwMAorICAgIGxvbmcgb2xkVmFsdWUgPSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAmYXRvbWljX3Zhci0+dmFsdWUsIHZhbHVlKTsKKyAgICByZXR1cm4gb2xkVmFsdWUgKyB2YWx1ZTsKKyNlbHNlCisgICAgbG9uZyBvbGRWYWx1ZSA9IEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICZhdG9taWNfdmFyLT52YWx1ZSwgdmFsdWUpOworICAgIHJldHVybiBvbGRWYWx1ZSArIHZhbHVlOworI2VuZGlmCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8qCisgKiBwal90aHJlYWRfbG9jYWxfYWxsb2MoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9sb2NhbF9hbGxvYyhsb25nICppbmRleCkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGluZGV4ICE9IE5VTEwsIFBKX0VJTlZBTCk7CisKKyAgICAvL0Nhbid0IGNoZWNrIHN0YWNrIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlCisgICAgLy9iZWdpbm5pbmcgYmVmb3JlIG1haW4gdGhyZWFkIGlzIGluaXRpYWxpemVkLgorICAgIC8vUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgICppbmRleCA9IFRsc0FsbG9jKCk7CisKKyAgICBpZiAoKmluZGV4ID09IFRMU19PVVRfT0ZfSU5ERVhFUykKKyAgICAgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihHZXRMYXN0RXJyb3IoKSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIHBqX3RocmVhZF9sb2NhbF9mcmVlKCkKKyAqLworUEpfREVGKHZvaWQpIHBqX3RocmVhZF9sb2NhbF9mcmVlKGxvbmcgaW5kZXgpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBUbHNGcmVlKGluZGV4KTsKK30KKworLyoKKyAqIHBqX3RocmVhZF9sb2NhbF9zZXQoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RocmVhZF9sb2NhbF9zZXQobG9uZyBpbmRleCwgdm9pZCAqdmFsdWUpCit7CisgICAgQk9PTCByYzsKKworICAgIC8vQ2FuJ3QgY2hlY2sgc3RhY2sgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUKKyAgICAvL2JlZ2lubmluZyBiZWZvcmUgbWFpbiB0aHJlYWQgaXMgaW5pdGlhbGl6ZWQuCisgICAgLy9QSl9DSEVDS19TVEFDSygpOworICAgIHJjID0gVGxzU2V0VmFsdWUoaW5kZXgsIHZhbHVlKTsKKyAgICByZXR1cm4gcmMhPTAgPyBQSl9TVUNDRVNTIDogUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKK30KKworLyoKKyAqIHBqX3RocmVhZF9sb2NhbF9nZXQoKQorICovCitQSl9ERUYodm9pZCopIHBqX3RocmVhZF9sb2NhbF9nZXQobG9uZyBpbmRleCkKK3sKKyAgICAvL0Nhbid0IGNoZWNrIHN0YWNrIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAgICAvL2J5IFBKX0NIRUNLX1NUQUNLKCkgaXRzZWxmISEhCisgICAgLy9QSl9DSEVDS19TVEFDSygpOworICAgIHJldHVybiBUbHNHZXRWYWx1ZShpbmRleCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0YXRpYyBwal9zdGF0dXNfdCBpbml0X211dGV4KHBqX211dGV4X3QgKm11dGV4LCBjb25zdCBjaGFyICpuYW1lKQoreworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworI2lmIFBKX1dJTjMyX1dJTk5UID49IDB4MDQwMAorICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJm11dGV4LT5jcml0KTsKKyNlbHNlCisgICAgbXV0ZXgtPmhNdXRleCA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKTsKKyAgICBpZiAoIW11dGV4LT5oTXV0ZXgpIHsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKKyAgICB9CisjZW5kaWYKKworI2lmIFBKX0RFQlVHCisgICAgLyogU2V0IG93bmVyLiAqLworICAgIG11dGV4LT5uZXN0aW5nX2xldmVsID0gMDsKKyAgICBtdXRleC0+b3duZXIgPSBOVUxMOworI2VuZGlmCisKKyAgICAvKiBTZXQgbmFtZS4gKi8KKyAgICBpZiAoIW5hbWUpIHsKKwluYW1lID0gIm10eCVwIjsKKyAgICB9CisgICAgaWYgKHN0cmNocihuYW1lLCAnJScpKSB7CisJcGpfYW5zaV9zbnByaW50ZihtdXRleC0+b2JqX25hbWUsIFBKX01BWF9PQkpfTkFNRSwgbmFtZSwgbXV0ZXgpOworICAgIH0gZWxzZSB7CisJcGpfYW5zaV9zdHJuY3B5KG11dGV4LT5vYmpfbmFtZSwgbmFtZSwgUEpfTUFYX09CSl9OQU1FKTsKKwltdXRleC0+b2JqX25hbWVbUEpfTUFYX09CSl9OQU1FLTFdID0gJ1wwJzsKKyAgICB9CisKKyAgICBQSl9MT0coNiwgKG11dGV4LT5vYmpfbmFtZSwgIk11dGV4IGNyZWF0ZWQiKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBwal9tdXRleF9jcmVhdGUoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X2NyZWF0ZShwal9wb29sX3QgKnBvb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX211dGV4X3QgKiptdXRleF9wdHIpCit7CisgICAgcGpfc3RhdHVzX3QgcmM7CisgICAgcGpfbXV0ZXhfdCAqbXV0ZXg7CisKKyAgICBQSl9VTlVTRURfQVJHKHR5cGUpOworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBtdXRleF9wdHIsIFBKX0VJTlZBTCk7CisKKyAgICBtdXRleCA9IHBqX3Bvb2xfYWxsb2MocG9vbCwgc2l6ZW9mKCptdXRleCkpOworICAgIGlmICghbXV0ZXgpCisgICAgICAgIHJldHVybiBQSl9FTk9NRU07CisKKyAgICByYyA9IGluaXRfbXV0ZXgobXV0ZXgsIG5hbWUpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICAqbXV0ZXhfcHRyID0gbXV0ZXg7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIHBqX211dGV4X2NyZWF0ZV9zaW1wbGUoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X2NyZWF0ZV9zaW1wbGUoIHBqX3Bvb2xfdCAqcG9vbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICBwal9tdXRleF90ICoqbXV0ZXggKQoreworICAgIHJldHVybiBwal9tdXRleF9jcmVhdGUocG9vbCwgbmFtZSwgUEpfTVVURVhfU0lNUExFLCBtdXRleCk7Cit9CisKKy8qCisgKiBwal9tdXRleF9jcmVhdGVfcmVjdXJzaXZlKCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9tdXRleF9jcmVhdGVfcmVjdXJzaXZlKCBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICAgICAgcGpfbXV0ZXhfdCAqKm11dGV4ICkKK3sKKyAgICByZXR1cm4gcGpfbXV0ZXhfY3JlYXRlKHBvb2wsIG5hbWUsIFBKX01VVEVYX1JFQ1VSU0UsIG11dGV4KTsKK30KKworLyoKKyAqIHBqX211dGV4X2xvY2soKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X2xvY2socGpfbXV0ZXhfdCAqbXV0ZXgpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG11dGV4LCBQSl9FSU5WQUwpOworCisgICAgTE9HX01VVEVYKChtdXRleC0+b2JqX25hbWUsICJNdXRleDogdGhyZWFkICVzIGlzIHdhaXRpbmciLCAKKwkJCQlwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSkpOworCisjaWYgUEpfV0lOMzJfV0lOTlQgPj0gMHgwNDAwCisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJm11dGV4LT5jcml0KTsKKyAgICBzdGF0dXM9UEpfU1VDQ0VTUzsKKyNlbHNlCisgICAgaWYgKFdhaXRGb3JTaW5nbGVPYmplY3QobXV0ZXgtPmhNdXRleCwgSU5GSU5JVEUpPT1XQUlUX09CSkVDVF8wKQorICAgICAgICBzdGF0dXMgPSBQSl9TVUNDRVNTOworICAgIGVsc2UKKyAgICAgICAgc3RhdHVzID0gUEpfU1RBVFVTX0ZST01fT1MoR2V0TGFzdEVycm9yKCkpOworCisjZW5kaWYKKyAgICBMT0dfTVVURVgoKG11dGV4LT5vYmpfbmFtZSwgCisJICAgICAgKHN0YXR1cz09UEpfU1VDQ0VTUyA/ICJNdXRleCBhY3F1aXJlZCBieSB0aHJlYWQgJXMiIDogIkZBSUxFRCBieSAlcyIpLAorCSAgICAgIHBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lKSk7CisKKyNpZiBQSl9ERUJVRworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCW11dGV4LT5vd25lciA9IHBqX3RocmVhZF90aGlzKCk7CisJKyttdXRleC0+bmVzdGluZ19sZXZlbDsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBwal9tdXRleF91bmxvY2soKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X3VubG9jayhwal9tdXRleF90ICptdXRleCkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX0FTU0VSVF9SRVRVUk4obXV0ZXgsIFBKX0VJTlZBTCk7CisKKyNpZiBQSl9ERUJVRworICAgIHBqX2Fzc2VydChtdXRleC0+b3duZXIgPT0gcGpfdGhyZWFkX3RoaXMoKSk7CisgICAgaWYgKC0tbXV0ZXgtPm5lc3RpbmdfbGV2ZWwgPT0gMCkgeworCW11dGV4LT5vd25lciA9IE5VTEw7CisgICAgfQorI2VuZGlmCisKKyAgICBMT0dfTVVURVgoKG11dGV4LT5vYmpfbmFtZSwgIk11dGV4IHJlbGVhc2VkIGJ5IHRocmVhZCAlcyIsIAorCQkJCXBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lKSk7CisKKyNpZiBQSl9XSU4zMl9XSU5OVCA+PSAweDA0MDAKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbXV0ZXgtPmNyaXQpOworICAgIHN0YXR1cz1QSl9TVUNDRVNTOworI2Vsc2UKKyAgICBzdGF0dXMgPSBSZWxlYXNlTXV0ZXgobXV0ZXgtPmhNdXRleCkgPyBQSl9TVUNDRVNTIDogCisgICAgICAgICAgICAgICAgUEpfU1RBVFVTX0ZST01fT1MoR2V0TGFzdEVycm9yKCkpOworI2VuZGlmCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIHBqX211dGV4X3RyeWxvY2soKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX211dGV4X3RyeWxvY2socGpfbXV0ZXhfdCAqbXV0ZXgpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG11dGV4LCBQSl9FSU5WQUwpOworCisgICAgTE9HX01VVEVYKChtdXRleC0+b2JqX25hbWUsICJNdXRleDogdGhyZWFkICVzIGlzIHRyeWluZyIsIAorCQkJCXBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lKSk7CisKKyNpZiBQSl9XSU4zMl9XSU5OVCA+PSAweDA0MDAKKyAgICBzdGF0dXM9VHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24oJm11dGV4LT5jcml0KSA/IFBKX1NVQ0NFU1MgOiBQSl9FVU5LTk9XTjsKKyNlbHNlCisgICAgc3RhdHVzID0gV2FpdEZvclNpbmdsZU9iamVjdChtdXRleC0+aE11dGV4LCAwKT09V0FJVF9PQkpFQ1RfMCA/IAorICAgICAgICAgICAgICAgIFBKX1NVQ0NFU1MgOiBQSl9FVElNRURPVVQ7CisjZW5kaWYKKyAgICBpZiAoc3RhdHVzPT1QSl9TVUNDRVNTKSB7CisJTE9HX01VVEVYKChtdXRleC0+b2JqX25hbWUsICJNdXRleCBhY3F1aXJlZCBieSB0aHJlYWQgJXMiLCAKKwkJCQkgIHBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lKSk7CisKKyNpZiBQSl9ERUJVRworCW11dGV4LT5vd25lciA9IHBqX3RocmVhZF90aGlzKCk7CisJKyttdXRleC0+bmVzdGluZ19sZXZlbDsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisJTE9HX01VVEVYKChtdXRleC0+b2JqX25hbWUsICJNdXRleDogdGhyZWFkICVzJ3MgdHJ5bG9jaygpIGZhaWxlZCIsIAorCQkJCSAgICBwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSkpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBwal9tdXRleF9kZXN0cm95KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9tdXRleF9kZXN0cm95KHBqX211dGV4X3QgKm11dGV4KQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihtdXRleCwgUEpfRUlOVkFMKTsKKworICAgIExPR19NVVRFWCgobXV0ZXgtPm9ial9uYW1lLCAiTXV0ZXggZGVzdHJveWVkIikpOworCisjaWYgUEpfV0lOMzJfV0lOTlQgPj0gMHgwNDAwCisgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZtdXRleC0+Y3JpdCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisjZWxzZQorICAgIHJldHVybiBDbG9zZUhhbmRsZShtdXRleC0+aE11dGV4KSA/IFBKX1NVQ0NFU1MgOiAKKyAgICAgICAgICAgIFBKX1JFVFVSTl9PU19FUlJPUihHZXRMYXN0RXJyb3IoKSk7CisjZW5kaWYKK30KKworLyoKKyAqIHBqX211dGV4X2lzX2xvY2tlZCgpCisgKi8KK1BKX0RFRihwal9ib29sX3QpIHBqX211dGV4X2lzX2xvY2tlZChwal9tdXRleF90ICptdXRleCkKK3sKKyNpZiBQSl9ERUJVRworICAgIHJldHVybiBtdXRleC0+b3duZXIgPT0gcGpfdGhyZWFkX3RoaXMoKTsKKyNlbHNlCisgICAgUEpfVU5VU0VEX0FSRyhtdXRleCk7CisgICAgcGpfYXNzZXJ0KCEiUEpfREVCVUcgaXMgbm90IHNldCEiKTsKKyAgICByZXR1cm4gMTsKKyNlbmRpZgorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogV2luMzIgbGFja3MgUmVhZC9Xcml0ZSBtdXRleCwgc28gaW5jbHVkZSB0aGUgZW11bGF0aW9uLgorICovCisjaW5jbHVkZSAib3NfcndtdXRleC5jIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICogcGpfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigpCisgKi8KK1BKX0RFRih2b2lkKSBwal9lbnRlcl9jcml0aWNhbF9zZWN0aW9uKHZvaWQpCit7CisgICAgcGpfbXV0ZXhfbG9jaygmY3JpdGljYWxfc2VjdGlvbl9tdXRleCk7Cit9CisKKworLyoKKyAqIHBqX2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oKQorICovCitQSl9ERUYodm9pZCkgcGpfbGVhdmVfY3JpdGljYWxfc2VjdGlvbih2b2lkKQoreworICAgIHBqX211dGV4X3VubG9jaygmY3JpdGljYWxfc2VjdGlvbl9tdXRleCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNpZiBkZWZpbmVkKFBKX0hBU19TRU1BUEhPUkUpICYmIFBKX0hBU19TRU1BUEhPUkUgIT0gMAorCisvKgorICogcGpfc2VtX2NyZWF0ZSgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc2VtX2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICB1bnNpZ25lZCBpbml0aWFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zZW1fdCAqKnNlbV9wdHIpCit7CisgICAgcGpfc2VtX3QgKnNlbTsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIHNlbV9wdHIsIFBKX0VJTlZBTCk7CisKKyAgICBzZW0gPSBwal9wb29sX2FsbG9jKHBvb2wsIHNpemVvZigqc2VtKSk7ICAgIAorICAgIHNlbS0+aFNlbWFwaG9yZSA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCBpbml0aWFsLCBtYXgsIE5VTEwpOworICAgIGlmICghc2VtLT5oU2VtYXBob3JlKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgLyogU2V0IG5hbWUuICovCisgICAgaWYgKCFuYW1lKSB7CisJbmFtZSA9ICJzZW0lcCI7CisgICAgfQorICAgIGlmIChzdHJjaHIobmFtZSwgJyUnKSkgeworCXBqX2Fuc2lfc25wcmludGYoc2VtLT5vYmpfbmFtZSwgUEpfTUFYX09CSl9OQU1FLCBuYW1lLCBzZW0pOworICAgIH0gZWxzZSB7CisJcGpfYW5zaV9zdHJuY3B5KHNlbS0+b2JqX25hbWUsIG5hbWUsIFBKX01BWF9PQkpfTkFNRSk7CisJc2VtLT5vYmpfbmFtZVtQSl9NQVhfT0JKX05BTUUtMV0gPSAnXDAnOworICAgIH0KKworICAgIExPR19NVVRFWCgoc2VtLT5vYmpfbmFtZSwgIlNlbWFwaG9yZSBjcmVhdGVkIikpOworCisgICAgKnNlbV9wdHIgPSBzZW07CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBwal9zZW1fd2FpdF9mb3IocGpfc2VtX3QgKnNlbSwgdW5zaWduZWQgdGltZW91dCkKK3sKKyAgICBEV09SRCByZXN1bHQ7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2VtLCBQSl9FSU5WQUwpOworCisgICAgTE9HX01VVEVYKChzZW0tPm9ial9uYW1lLCAiU2VtYXBob3JlOiB0aHJlYWQgJXMgaXMgd2FpdGluZyIsIAorCQkJICAgICAgcGpfdGhyZWFkX3RoaXMoKS0+b2JqX25hbWUpKTsKKworICAgIHJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VtLT5oU2VtYXBob3JlLCB0aW1lb3V0KTsKKyAgICBpZiAocmVzdWx0ID09IFdBSVRfT0JKRUNUXzApIHsKKwlMT0dfTVVURVgoKHNlbS0+b2JqX25hbWUsICJTZW1hcGhvcmUgYWNxdWlyZWQgYnkgdGhyZWFkICVzIiwgCisJCQkJICBwal90aHJlYWRfdGhpcygpLT5vYmpfbmFtZSkpOworICAgIH0gZWxzZSB7CisJTE9HX01VVEVYKChzZW0tPm9ial9uYW1lLCAiU2VtYXBob3JlOiB0aHJlYWQgJXMgRkFJTEVEIHRvIGFjcXVpcmUiLCAKKwkJCQkgIHBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lKSk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdD09V0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgZWxzZSBpZiAocmVzdWx0PT1XQUlUX1RJTUVPVVQpCisgICAgICAgIHJldHVybiBQSl9FVElNRURPVVQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKK30KKworLyoKKyAqIHBqX3NlbV93YWl0KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zZW1fd2FpdChwal9zZW1fdCAqc2VtKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzZW0sIFBKX0VJTlZBTCk7CisKKyAgICByZXR1cm4gcGpfc2VtX3dhaXRfZm9yKHNlbSwgSU5GSU5JVEUpOworfQorCisvKgorICogcGpfc2VtX3RyeXdhaXQoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NlbV90cnl3YWl0KHBqX3NlbV90ICpzZW0pCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNlbSwgUEpfRUlOVkFMKTsKKworICAgIHJldHVybiBwal9zZW1fd2FpdF9mb3Ioc2VtLCAwKTsKK30KKworLyoKKyAqIHBqX3NlbV9wb3N0KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zZW1fcG9zdChwal9zZW1fdCAqc2VtKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzZW0sIFBKX0VJTlZBTCk7CisKKyAgICBMT0dfTVVURVgoKHNlbS0+b2JqX25hbWUsICJTZW1hcGhvcmUgcmVsZWFzZWQgYnkgdGhyZWFkICVzIiwKKwkJCSAgICAgIHBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lKSk7CisKKyAgICBpZiAoUmVsZWFzZVNlbWFwaG9yZShzZW0tPmhTZW1hcGhvcmUsIDEsIE5VTEwpKQorICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworfQorCisvKgorICogcGpfc2VtX2Rlc3Ryb3koKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NlbV9kZXN0cm95KHBqX3NlbV90ICpzZW0pCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNlbSwgUEpfRUlOVkFMKTsKKworICAgIExPR19NVVRFWCgoc2VtLT5vYmpfbmFtZSwgIlNlbWFwaG9yZSBkZXN0cm95ZWQgYnkgdGhyZWFkICVzIiwKKwkJCSAgICAgIHBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lKSk7CisKKyAgICBpZiAoQ2xvc2VIYW5kbGUoc2VtLT5oU2VtYXBob3JlKSkKKyAgICAgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKK30KKworI2VuZGlmCS8qIFBKX0hBU19TRU1BUEhPUkUgKi8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjaWYgZGVmaW5lZChQSl9IQVNfRVZFTlRfT0JKKSAmJiBQSl9IQVNfRVZFTlRfT0JKICE9IDAKKworLyoKKyAqIHBqX2V2ZW50X2NyZWF0ZSgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZXZlbnRfY3JlYXRlKCBwal9wb29sX3QgKnBvb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICBwal9ib29sX3QgbWFudWFsX3Jlc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9ib29sX3QgaW5pdGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9ldmVudF90ICoqZXZlbnRfcHRyKQoreworICAgIHBqX2V2ZW50X3QgKmV2ZW50OworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBvb2wgJiYgZXZlbnRfcHRyLCBQSl9FSU5WQUwpOworCisgICAgZXZlbnQgPSBwal9wb29sX2FsbG9jKHBvb2wsIHNpemVvZigqZXZlbnQpKTsKKyAgICBpZiAoIWV2ZW50KQorICAgICAgICByZXR1cm4gUEpfRU5PTUVNOworCisgICAgZXZlbnQtPmhFdmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIG1hbnVhbF9yZXNldD9UUlVFOkZBTFNFLCAKKwkJCQlpbml0aWFsP1RSVUU6RkFMU0UsIE5VTEwpOworCisgICAgaWYgKCFldmVudC0+aEV2ZW50KQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgLyogU2V0IG5hbWUuICovCisgICAgaWYgKCFuYW1lKSB7CisJbmFtZSA9ICJldnQlcCI7CisgICAgfQorICAgIGlmIChzdHJjaHIobmFtZSwgJyUnKSkgeworCXBqX2Fuc2lfc25wcmludGYoZXZlbnQtPm9ial9uYW1lLCBQSl9NQVhfT0JKX05BTUUsIG5hbWUsIGV2ZW50KTsKKyAgICB9IGVsc2UgeworCXBqX2Fuc2lfc3RybmNweShldmVudC0+b2JqX25hbWUsIG5hbWUsIFBKX01BWF9PQkpfTkFNRSk7CisJZXZlbnQtPm9ial9uYW1lW1BKX01BWF9PQkpfTkFNRS0xXSA9ICdcMCc7CisgICAgfQorCisgICAgUEpfTE9HKDYsIChldmVudC0+b2JqX25hbWUsICJFdmVudCBjcmVhdGVkIikpOworCisgICAgKmV2ZW50X3B0ciA9IGV2ZW50OworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgcGpfZXZlbnRfd2FpdF9mb3IocGpfZXZlbnRfdCAqZXZlbnQsIHVuc2lnbmVkIHRpbWVvdXQpCit7CisgICAgRFdPUkQgcmVzdWx0OworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGV2ZW50LCBQSl9FSU5WQUwpOworCisgICAgUEpfTE9HKDYsIChldmVudC0+b2JqX25hbWUsICJFdmVudDogdGhyZWFkICVzIGlzIHdhaXRpbmciLCAKKwkJCSAgICAgICAgcGpfdGhyZWFkX3RoaXMoKS0+b2JqX25hbWUpKTsKKworICAgIHJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoZXZlbnQtPmhFdmVudCwgdGltZW91dCk7CisgICAgaWYgKHJlc3VsdCA9PSBXQUlUX09CSkVDVF8wKSB7CisJUEpfTE9HKDYsIChldmVudC0+b2JqX25hbWUsICJFdmVudDogdGhyZWFkICVzIGlzIHJlbGVhc2VkIiwgCisJCQkJICAgIHBqX3RocmVhZF90aGlzKCktPm9ial9uYW1lKSk7CisgICAgfSBlbHNlIHsKKwlQSl9MT0coNiwgKGV2ZW50LT5vYmpfbmFtZSwgIkV2ZW50OiB0aHJlYWQgJXMgRkFJTEVEIHRvIGFjcXVpcmUiLCAKKwkJCQkgICAgcGpfdGhyZWFkX3RoaXMoKS0+b2JqX25hbWUpKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0PT1XQUlUX09CSkVDVF8wKQorICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICBlbHNlIGlmIChyZXN1bHQ9PVdBSVRfVElNRU9VVCkKKyAgICAgICAgcmV0dXJuIFBKX0VUSU1FRE9VVDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworfQorCisvKgorICogcGpfZXZlbnRfd2FpdCgpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZXZlbnRfd2FpdChwal9ldmVudF90ICpldmVudCkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGV2ZW50LCBQSl9FSU5WQUwpOworCisgICAgcmV0dXJuIHBqX2V2ZW50X3dhaXRfZm9yKGV2ZW50LCBJTkZJTklURSk7Cit9CisKKy8qCisgKiBwal9ldmVudF90cnl3YWl0KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9ldmVudF90cnl3YWl0KHBqX2V2ZW50X3QgKmV2ZW50KQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oZXZlbnQsIFBKX0VJTlZBTCk7CisKKyAgICByZXR1cm4gcGpfZXZlbnRfd2FpdF9mb3IoZXZlbnQsIDApOworfQorCisvKgorICogcGpfZXZlbnRfc2V0KCkKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9ldmVudF9zZXQocGpfZXZlbnRfdCAqZXZlbnQpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGV2ZW50LCBQSl9FSU5WQUwpOworCisgICAgUEpfTE9HKDYsIChldmVudC0+b2JqX25hbWUsICJTZXR0aW5nIGV2ZW50IikpOworCisgICAgaWYgKFNldEV2ZW50KGV2ZW50LT5oRXZlbnQpKQorICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworfQorCisvKgorICogcGpfZXZlbnRfcHVsc2UoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2V2ZW50X3B1bHNlKHBqX2V2ZW50X3QgKmV2ZW50KQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihldmVudCwgUEpfRUlOVkFMKTsKKworICAgIFBKX0xPRyg2LCAoZXZlbnQtPm9ial9uYW1lLCAiUHVsc2luZyBldmVudCIpKTsKKworICAgIGlmIChQdWxzZUV2ZW50KGV2ZW50LT5oRXZlbnQpKQorICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworfQorCisvKgorICogcGpfZXZlbnRfcmVzZXQoKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2V2ZW50X3Jlc2V0KHBqX2V2ZW50X3QgKmV2ZW50KQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihldmVudCwgUEpfRUlOVkFMKTsKKworICAgIFBKX0xPRyg2LCAoZXZlbnQtPm9ial9uYW1lLCAiRXZlbnQgaXMgcmVzZXQiKSk7CisKKyAgICBpZiAoUmVzZXRFdmVudChldmVudC0+aEV2ZW50KSkKKyAgICAgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKEdldExhc3RFcnJvcigpKTsKK30KKworLyoKKyAqIHBqX2V2ZW50X2Rlc3Ryb3koKQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2V2ZW50X2Rlc3Ryb3kocGpfZXZlbnRfdCAqZXZlbnQpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGV2ZW50LCBQSl9FSU5WQUwpOworCisgICAgUEpfTE9HKDYsIChldmVudC0+b2JqX25hbWUsICJFdmVudCBpcyBkZXN0cm95aW5nIikpOworCisgICAgaWYgKENsb3NlSGFuZGxlKGV2ZW50LT5oRXZlbnQpKQorICAgICAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworfQorCisjZW5kaWYJLyogUEpfSEFTX0VWRU5UX09CSiAqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjaWYgZGVmaW5lZChQSl9URVJNX0hBU19DT0xPUikgJiYgUEpfVEVSTV9IQVNfQ09MT1IgIT0gMAorLyoKKyAqIFRlcm1pbmFsIGNvbG9yCisgKi8KKworc3RhdGljIFdPUkQgcGpfY29sb3JfdG9fb3NfYXR0cihwal9jb2xvcl90IGNvbG9yKQoreworICAgIFdPUkQgYXR0ciA9IDA7CisKKyAgICBpZiAoY29sb3IgJiBQSl9URVJNX0NPTE9SX1IpCisJYXR0ciB8PSBGT1JFR1JPVU5EX1JFRDsKKyAgICBpZiAoY29sb3IgJiBQSl9URVJNX0NPTE9SX0cpCisJYXR0ciB8PSBGT1JFR1JPVU5EX0dSRUVOOworICAgIGlmIChjb2xvciAmIFBKX1RFUk1fQ09MT1JfQikKKwlhdHRyIHw9IEZPUkVHUk9VTkRfQkxVRTsKKyAgICBpZiAoY29sb3IgJiBQSl9URVJNX0NPTE9SX0JSSUdIVCkKKwlhdHRyIHw9IEZPUkVHUk9VTkRfSU5URU5TSVRZOworCisgICAgcmV0dXJuIGF0dHI7Cit9CisKK3N0YXRpYyBwal9jb2xvcl90IG9zX2F0dHJfdG9fcGpfY29sb3IoV09SRCBhdHRyKQoreworICAgIGludCBjb2xvciA9IDA7CisKKyAgICBpZiAoYXR0ciAmIEZPUkVHUk9VTkRfUkVEKQorCWNvbG9yIHw9IFBKX1RFUk1fQ09MT1JfUjsKKyAgICBpZiAoYXR0ciAmIEZPUkVHUk9VTkRfR1JFRU4pCisJY29sb3IgfD0gUEpfVEVSTV9DT0xPUl9HOworICAgIGlmIChhdHRyICYgRk9SRUdST1VORF9CTFVFKQorCWNvbG9yIHw9IFBKX1RFUk1fQ09MT1JfQjsKKyAgICBpZiAoYXR0ciAmIEZPUkVHUk9VTkRfSU5URU5TSVRZKQorCWNvbG9yIHw9IFBKX1RFUk1fQ09MT1JfQlJJR0hUOworCisgICAgcmV0dXJuIGNvbG9yOworfQorCisKKy8qCisgKiBwal90ZXJtX3NldF9jb2xvcigpCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGVybV9zZXRfY29sb3IocGpfY29sb3JfdCBjb2xvcikKK3sKKyAgICBCT09MIHJjOworICAgIFdPUkQgYXR0ciA9IDA7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgYXR0ciA9IHBqX2NvbG9yX3RvX29zX2F0dHIoY29sb3IpOworICAgIHJjID0gU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoIEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSksIGF0dHIpOworICAgIHJldHVybiByYyA/IFBKX1NVQ0NFU1MgOiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworfQorCisvKgorICogcGpfdGVybV9nZXRfY29sb3IoKQorICogR2V0IGN1cnJlbnQgdGVybWluYWwgZm9yZWdyb3VuZCBjb2xvci4KKyAqLworUEpfREVGKHBqX2NvbG9yX3QpIHBqX3Rlcm1fZ2V0X2NvbG9yKHZvaWQpCit7CisgICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gaW5mbzsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyggR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSwgJmluZm8pOworICAgIHJldHVybiBvc19hdHRyX3RvX3BqX2NvbG9yKGluZm8ud0F0dHJpYnV0ZXMpOworfQorCisjZW5kaWYJLyogUEpfVEVSTV9IQVNfQ09MT1IgKi8KKworLyoKKyAqIHBqX3J1bl9hcHAoKQorICovCitQSl9ERUYoaW50KSBwal9ydW5fYXBwKHBqX21haW5fZnVuY19wdHIgbWFpbl9mdW5jLCBpbnQgYXJnYywgY2hhciAqYXJndltdLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICBQSl9VTlVTRURfQVJHKGZsYWdzKTsKKyAgICByZXR1cm4gKCptYWluX2Z1bmMpKGFyZ2MsIGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19lcnJvcl9saW51eF9rZXJuZWwuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfZXJyb3JfbGludXhfa2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyYWM5MAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfZXJyb3JfbGludXhfa2VybmVsLmMKQEAgLTAsMCArMSw4MSBAQAorLyogJElkOiBvc19lcnJvcl9saW51eF9rZXJuZWwuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL2NvbXBhdC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBkZWZpbmVkKE1PRFZFUlNJT05TKQorI2luY2x1ZGUgPGxpbnV4L21vZHZlcnNpb25zLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitpbnQga2VybmVsX2Vycm5vOworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldF9vc19lcnJvcih2b2lkKQoreworICAgIHJldHVybiBlcnJubzsKK30KKworUEpfREVGKHZvaWQpIHBqX3NldF9vc19lcnJvcihwal9zdGF0dXNfdCBjb2RlKQoreworICAgIGVycm5vID0gY29kZTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfbmV0b3NfZXJyb3Iodm9pZCkKK3sKKyAgICByZXR1cm4gZXJybm87Cit9CisKK1BKX0RFRih2b2lkKSBwal9zZXRfbmV0b3NfZXJyb3IocGpfc3RhdHVzX3QgY29kZSkKK3sKKyAgICBlcnJubyA9IGNvZGU7Cit9CisKKy8qIAorICogcGxhdGZvcm1fc3RyZXJyb3IoKQorICoKKyAqIFBsYXRmb3JtIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UuIFRoaXMgZmlsZSBpcyBjYWxsZWQgYnkgcGpfc3RyZXJyb3IoKSAKKyAqIGluIGVycm5vLmMgCisgKi8KK2ludCBwbGF0Zm9ybV9zdHJlcnJvciggcGpfb3NfZXJyX3R5cGUgb3NfZXJyY29kZSwgCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZiwgcGpfc2l6ZV90IGJ1ZnNpemUpCit7CisgICAgY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKyAgICBpbnQgbGVuOworICAgIAorICAgIC8qIEhhbmRsZSBFSU5WQUwgYXMgc3BlY2lhbCBjYXNlIHNvIHRoYXQgaXQnbGwgcGFzcyBlcnJubyB0ZXN0LiAqLworICAgIGlmIChvc19lcnJjb2RlPT1FSU5WQUwpCisJc3RyY3B5KGVycm1zZywgIkludmFsaWQgdmFsdWUiKTsKKyAgICBlbHNlCisJc25wcmludGYoZXJybXNnLCBzaXplb2YoZXJybXNnKSwgImVycm5vPSVkIiwgb3NfZXJyY29kZSk7CisgICAgCisgICAgbGVuID0gc3RybGVuKGVycm1zZyk7CisKKyAgICBpZiAobGVuID49IGJ1ZnNpemUpCisJbGVuID0gYnVmc2l6ZS0xOworCisgICAgcGpfbWVtY3B5KGJ1ZiwgZXJybXNnLCBsZW4pOworICAgIGJ1ZltsZW5dID0gJ1wwJzsKKworICAgIHJldHVybiBsZW47Cit9CisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19lcnJvcl9zeW1iaWFuLmNwcCBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfZXJyb3Jfc3ltYmlhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3NzU0YwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfZXJyb3Jfc3ltYmlhbi5jcHAKQEAgLTAsMCArMSwxNzIgQEAKKy8qICRJZDogb3NfZXJyb3Jfc3ltYmlhbi5jcHAgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2NvbXBhdC9zdGRhcmcuaD4KKyNpbmNsdWRlIDxwai91bmljb2RlLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxlMzJlcnIuaD4KKyNpbmNsdWRlIDxpbl9zb2NrLmg+CisKKworI2lmIGRlZmluZWQoUEpfSEFTX0VSUk9SX1NUUklORykgJiYgKFBKX0hBU19FUlJPUl9TVFJJTkchPTApCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBwal9vc19lcnJfdHlwZSBjb2RlOworICAgIGNvbnN0IGNoYXIgKm1zZzsKK30gZ2FFcnJvckxpc3RbXSA9IHsKKyAgICAvKgorICAgICAqIEdlbmVyaWMgZXJyb3IgLTEgdG8gLTQ2CisgICAgICovCisgICAgUEpfQlVJTERfRVJSKCBLRXJyTm90Rm91bmQsCSAgICAiVW5hYmxlIHRvIGZpbmQgdGhlIHNwZWNpZmllZCBvYmplY3QiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJHZW5lcmFsLAkgICAgIkdlbmVyYWwgKHVuc3BlY2lmaWVkKSBlcnJvciIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyckNhbmNlbCwJICAgICJUaGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJOb01lbW9yeSwJICAgICJOb3QgZW5vdWdoIG1lbW9yeSIpLAorICAgIFBKX0JVSUxEX0VSUiggS0Vyck5vdFN1cHBvcnRlZCwgIlRoZSBvcGVyYXRpb24gcmVxdWVzdGVkIGlzIG5vdCBzdXBwb3J0ZWQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJBcmd1bWVudCwJICAgICJCYWQgcmVxdWVzdCIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyclRvdGFsTG9zc09mUHJlY2lzaW9uLCAiVG90YWwgbG9zcyBvZiBwcmVjaXNpb24iKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJCYWRIYW5kbGUsICAgICJCYWQgb2JqZWN0IiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJyT3ZlcmZsb3csCSAgICAiT3ZlcmZsb3ciKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJVbmRlcmZsb3csICAgICJVbmRlcmZsb3ciKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJBbHJlYWR5RXhpc3RzLCJBbHJlYWR5IGV4aXN0cyIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyclBhdGhOb3RGb3VuZCwgIlVuYWJsZSB0byBmaW5kIHRoZSBzcGVjaWZpZWQgZm9sZGVyIiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJyRGllZCwJICAgICJDbG9zZWQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJJblVzZSwJICAgICJUaGUgc3BlY2lmaWVkIG9iamVjdCBpcyBjdXJyZW50bHkgaW4gdXNlIGJ5IGFub3RoZXIgcHJvZ3JhbSIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyclNlcnZlclRlcm1pbmF0ZWQsCSAgICAiU2VydmVyIGhhcyBjbG9zZWQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJTZXJ2ZXJCdXN5LCAgICJTZXJ2ZXIgYnVzeSIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyckNvbXBsZXRpb24sICAgIkNvbXBsZXRpb24gZXJyb3IiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJOb3RSZWFkeSwJICAgICJOb3QgcmVhZHkiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJVbmtub3duLAkgICAgIlVua25vd24gZXJyb3IiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJDb3JydXB0LAkgICAgIkNvcnJ1cHQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJBY2Nlc3NEZW5pZWQsICJBY2Nlc3MgZGVuaWVkIiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJyTG9ja2VkLAkgICAgIkxvY2tlZCIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VycldyaXRlLAkgICAgIkZhaWxlZCB0byB3cml0ZSIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyckRpc01vdW50ZWQsICAgIldyb25nIGRpc2sgcHJlc2VudCIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyckVvZiwJICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJyRGlza0Z1bGwsCSAgICAiRGlzayBmdWxsIiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJyQmFkRHJpdmVyLCAgICAiQmFkIGRldmljZSBkcml2ZXIiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJCYWROYW1lLAkgICAgIkJhZCBuYW1lIiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJyQ29tbXNMaW5lRmFpbCwiQ29tbXMgbGluZSBmYWlsZWQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJDb21tc0ZyYW1lLCAgICJDb21tcyBmcmFtZSBlcnJvciIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyckNvbW1zT3ZlcnJ1biwgIkNvbW1zIG92ZXJydW4gZXJyb3IiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJDb21tc1Bhcml0eSwgICJDb21tcyBwYXJpdHkgZXJyb3IiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJUaW1lZE91dCwJICAgICJUaW1lZCBvdXQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJDb3VsZE5vdENvbm5lY3QsICJGYWlsZWQgdG8gY29ubmVjdCIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyckNvdWxkTm90RGlzY29ubmVjdCwgIkZhaWxlZCB0byBkaXNjb25uZWN0IiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJyRGlzY29ubmVjdGVkLCAiRGlzY29ubmVjdGVkIiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJyQmFkTGlicmFyeUVudHJ5UG9pbnQsICJCYWQgbGlicmFyeSBlbnRyeSBwb2ludCIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyckJhZERlc2NyaXB0b3IsIkJhZCBkZXNjcmlwdG9yIiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJyQWJvcnQsCSAgICAiSW50ZXJydXB0ZWQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJUb29CaWcsCSAgICAiVG9vIGJpZyIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyckRpdmlkZUJ5WmVybywgIkRpdmlkZSBieSB6ZXJvIiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJyQmFkUG93ZXIsCSAgICAiQmF0dGVyaWVzIHRvbyBsb3ciKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJEaXJGdWxsLAkgICAgIkZvbGRlciBmdWxsIiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJySGFyZHdhcmVOb3RBdmFpbGFibGUsICIiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJTZXNzaW9uQ2xvc2VkLAkgICAgIiIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyclBlcm1pc3Npb25EZW5pZWQsICAgICAiIiksCisKKyAgICAvKgorICAgICAqIFNvY2tldCBlcnJvcnMgKC0xOTAgLSAtMTAwMCkKKyAgICAgKi8KKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJOZXRVbnJlYWNoLCAgICJDb3VsZCBub3QgY29ubmVjdCB0byB0aGUgbmV0d29yay4gQ3VycmVudGx5IHVucmVhY2hhYmxlIiksCisgICAgUEpfQlVJTERfRVJSKCBLRXJySG9zdFVucmVhY2gsICAiQ291bGQgbm90IGNvbm5lY3QgdG8gdGhlIHNwZWNpZmllZCBzZXJ2ZXIiKSwKKyAgICBQSl9CVUlMRF9FUlIoIEtFcnJOb1Byb3RvY29sT3B0LCJUaGUgc3BlY2lmaWVkIHNlcnZlciByZWZ1c2VzIHRoZSBzZWxlY3RlZCBwcm90b2NvbCIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VyclVyZ2VudERhdGEsICAgIiIpLAorICAgIFBKX0JVSUxEX0VSUiggS0VycldvdWxkQmxvY2ssICAgIkNvbmZsaWN0cyB3aXRoIEtFcnJFeHRlbmRlZCwgYnV0IGNhbm5vdCBvY2N1ciBpbiBwcmFjdGljZSIpLAorCisgICAgezAsIE5VTEx9Cit9OworCisjZW5kaWYJLyogUEpfSEFTX0VSUk9SX1NUUklORyAqLworCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X29zX2Vycm9yKHZvaWQpCit7CisgICAgcmV0dXJuIC0xOworfQorCitQSl9ERUYodm9pZCkgcGpfc2V0X29zX2Vycm9yKHBqX3N0YXR1c190IGNvZGUpCit7CisgICAgUEpfVU5VU0VEX0FSRyhjb2RlKTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfbmV0b3NfZXJyb3Iodm9pZCkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK1BKX0RFRih2b2lkKSBwal9zZXRfbmV0b3NfZXJyb3IocGpfc3RhdHVzX3QgY29kZSkKK3sKKyAgICBQSl9VTlVTRURfQVJHKGNvZGUpOworfQorCitQSl9CRUdJTl9ERUNMCisKKyAgICBQSl9ERUNMKGludCkgcGxhdGZvcm1fc3RyZXJyb3IoIHBqX29zX2Vycl90eXBlIG9zX2VycmNvZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAJCSAgICBjaGFyICpidWYsIHBqX3NpemVfdCBidWZzaXplKTsKK1BKX0VORF9ERUNMCisKKy8qIAorICogcGxhdGZvcm1fc3RyZXJyb3IoKQorICoKKyAqIFBsYXRmb3JtIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UuIFRoaXMgZmlsZSBpcyBjYWxsZWQgYnkgcGpfc3RyZXJyb3IoKSAKKyAqIGluIGVycm5vLmMgCisgKi8KK1BKX0RFRihpbnQpIHBsYXRmb3JtX3N0cmVycm9yKCBwal9vc19lcnJfdHlwZSBvc19lcnJjb2RlLCAKKwkJCSAgICAgICBjaGFyICpidWYsIHBqX3NpemVfdCBidWZzaXplKQoreworICAgIGludCBsZW4gPSAwOworCisgICAgcGpfYXNzZXJ0KGJ1ZiAhPSBOVUxMKTsKKyAgICBwal9hc3NlcnQoYnVmc2l6ZSA+PSAwKTsKKworICAgIC8qCisgICAgICogTVVTVCBOT1QgY2hlY2sgc3RhY2sgaGVyZS4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIFBKX0NIRUNLX1NUQUNLKCkgaXRzZWxmIQorICAgICAgIC8vUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICAgKi8KKworICAgIGlmICghbGVuKSB7CisjaWYgZGVmaW5lZChQSl9IQVNfRVJST1JfU1RSSU5HKSAmJiAoUEpfSEFTX0VSUk9SX1NUUklORyE9MCkKKwlpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgZ2FFcnJvckxpc3RbaV0ubXNnOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChnYUVycm9yTGlzdFtpXS5jb2RlID09IG9zX2VycmNvZGUpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oZ2FFcnJvckxpc3RbaV0ubXNnKTsKKwkJaWYgKChwal9zaXplX3QpbGVuID49IGJ1ZnNpemUpIHsKKwkJICAgIGxlbiA9IGJ1ZnNpemUtMTsKKwkJfQorCQlwal9tZW1jcHkoYnVmLCBnYUVycm9yTGlzdFtpXS5tc2csIGxlbik7CisJCWJ1ZltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCS8qIFBKX0hBU19FUlJPUl9TVFJJTkcgKi8KKworICAgIH0KKworICAgIGlmICghbGVuKSB7CisJbGVuID0gcGpfYW5zaV9zbnByaW50ZiggYnVmLCBidWZzaXplLCAiU3ltYmlhbiBuYXRpdmUgZXJyb3IgJWQiLCAKKwkJCQlvc19lcnJjb2RlKTsKKwlidWZbbGVuXSA9ICdcMCc7CisgICAgfQorCisgICAgcmV0dXJuIGxlbjsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19lcnJvcl91bml4LmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2Vycm9yX3VuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWMyN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19lcnJvcl91bml4LmMKQEAgLTAsMCArMSw2OSBAQAorLyogJElkOiBvc19lcnJvcl91bml4LmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X29zX2Vycm9yKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX1NUQVRVU19GUk9NX09TKGVycm5vKTsKK30KKworUEpfREVGKHZvaWQpIHBqX3NldF9vc19lcnJvcihwal9zdGF0dXNfdCBjb2RlKQoreworICAgIGVycm5vID0gUEpfU1RBVFVTX1RPX09TKGNvZGUpOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldF9uZXRvc19lcnJvcih2b2lkKQoreworICAgIHJldHVybiBQSl9TVEFUVVNfRlJPTV9PUyhlcnJubyk7Cit9CisKK1BKX0RFRih2b2lkKSBwal9zZXRfbmV0b3NfZXJyb3IocGpfc3RhdHVzX3QgY29kZSkKK3sKKyAgICBlcnJubyA9IFBKX1NUQVRVU19UT19PUyhjb2RlKTsKK30KKworUEpfQkVHSU5fREVDTAorCisgICAgUEpfREVDTChpbnQpIHBsYXRmb3JtX3N0cmVycm9yKHBqX29zX2Vycl90eXBlIGNvZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgIGNoYXIgKmJ1ZiwgcGpfc2l6ZV90IGJ1ZnNpemUgKTsKK1BKX0VORF9ERUNMCisKKy8qIAorICogcGxhdGZvcm1fc3RyZXJyb3IoKQorICoKKyAqIFBsYXRmb3JtIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UuIFRoaXMgZmlsZSBpcyBjYWxsZWQgYnkgcGpfc3RyZXJyb3IoKSAKKyAqIGluIGVycm5vLmMgCisgKi8KK2ludCBwbGF0Zm9ybV9zdHJlcnJvciggcGpfb3NfZXJyX3R5cGUgb3NfZXJyY29kZSwgCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZiwgcGpfc2l6ZV90IGJ1ZnNpemUpCit7CisgICAgY29uc3QgY2hhciAqc3lzZXJyID0gc3RyZXJyb3Iob3NfZXJyY29kZSk7CisgICAgcGpfc2l6ZV90IGxlbiA9IHN5c2VyciA/IHN0cmxlbihzeXNlcnIpIDogMDsKKworICAgIGlmIChsZW4gPj0gYnVmc2l6ZSkgbGVuID0gYnVmc2l6ZSAtIDE7CisgICAgaWYgKGxlbiA+IDApCisJcGpfbWVtY3B5KGJ1Ziwgc3lzZXJyLCBsZW4pOworICAgIGJ1ZltsZW5dID0gJ1wwJzsKKyAgICByZXR1cm4gbGVuOworfQorCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfZXJyb3Jfd2luMzIuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfZXJyb3Jfd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWRmNGYzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19lcnJvcl93aW4zMi5jCkBAIC0wLDAgKzEsMjIwIEBACisvKiAkSWQ6IG9zX2Vycm9yX3dpbjMyLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc3RkYXJnLmg+CisjaW5jbHVkZSA8cGovdW5pY29kZS5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorCisKKyNpZiBkZWZpbmVkKFBKX0hBU19XSU5TT0NLMl9IKSAmJiBQSl9IQVNfV0lOU09DSzJfSCAhPSAwCisjICBpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2VsaWYgZGVmaW5lZChQSl9IQVNfV0lOU09DS19IKSAmJiBQSl9IQVNfV0lOU09DS19IICE9IDAKKyMgIGluY2x1ZGUgPHdpbnNvY2suaD4KKyNlbmRpZgorCisKKy8qCisgKiBGcm9tIEFwYWNoZSdzIEFQUjoKKyAqLworI2lmIGRlZmluZWQoUEpfSEFTX0VSUk9SX1NUUklORykgJiYgKFBKX0hBU19FUlJPUl9TVFJJTkchPTApCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIHBqX29zX2Vycl90eXBlIGNvZGU7CisgICAgY29uc3QgY2hhciAqbXNnOworfSBnYUVycm9yTGlzdFtdID0geworICAgIFBKX0JVSUxEX0VSUiggV1NBRUlOVFIsICAgICAgICAgICAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVCQURGLCAgICAgICAgICAgIkJhZCBmaWxlIG51bWJlciIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRUFDQ0VTLCAgICAgICAgICAiUGVybWlzc2lvbiBkZW5pZWQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVGQVVMVCwgICAgICAgICAgIkJhZCBhZGRyZXNzIiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFSU5WQUwsICAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50IiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFTUZJTEUsICAgICAgICAgICJUb28gbWFueSBvcGVuIHNvY2tldHMiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVXT1VMREJMT0NLLCAgICAgIk9wZXJhdGlvbiB3b3VsZCBibG9jayIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRUlOUFJPR1JFU1MsICAgICAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRUFMUkVBRFksICAgICAgICAiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVOT1RTT0NLLCAgICAgICAgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRURFU1RBRERSUkVRLCAgICAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRU1TR1NJWkUsICAgICAgICAiTWVzc2FnZSB0b28gbG9uZyIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRVBST1RPVFlQRSwgICAgICAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0IiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFTk9QUk9UT09QVCwgICAgICJCYWQgcHJvdG9jb2wgb3B0aW9uIiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFUFJPVE9OT1NVUFBPUlQsICJQcm90b2NvbCBub3Qgc3VwcG9ydGVkIiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFT1BOT1RTVVBQLCAgICAgICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiBzb2NrZXQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVQRk5PU1VQUE9SVCwgICAgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFQUZOT1NVUFBPUlQsICAgICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFQUREUklOVVNFLCAgICAgICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFQUREUk5PVEFWQUlMLCAgICJDYW4ndCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVORVRET1dOLCAgICAgICAgIk5ldHdvcmsgaXMgZG93biIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRU5FVFVOUkVBQ0gsICAgICAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRU5FVFJFU0VULCAgICAgICAiTmV0IGNvbm5lY3Rpb24gcmVzZXQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVDT05OQUJPUlRFRCwgICAgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0IiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFQ09OTlJFU0VULCAgICAgICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVOT0JVRlMsICAgICAgICAgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVJU0NPTk4sICAgICAgICAgIlNvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRU5PVENPTk4sICAgICAgICAiU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVTSFVURE9XTiwgICAgICAgIkNhbid0IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duIiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFVE9PTUFOWVJFRlMsICAgICJUb28gbWFueSByZWZlcmVuY2VzLCBjYW4ndCBzcGxpY2UiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVUSU1FRE9VVCwgICAgICAgIkNvbm5lY3Rpb24gdGltZWQgb3V0IiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFQ09OTlJFRlVTRUQsICAgICJDb25uZWN0aW9uIHJlZnVzZWQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVMT09QLCAgICAgICAgICAgIlRvbyBtYW55IGxldmVscyBvZiBzeW1ib2xpYyBsaW5rcyIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRU5BTUVUT09MT05HLCAgICAiRmlsZSBuYW1lIHRvbyBsb25nIiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FFSE9TVERPV04sICAgICAgICJIb3N0IGlzIGRvd24iKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVIT1NUVU5SRUFDSCwgICAgIk5vIHJvdXRlIHRvIGhvc3QiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVOT1RFTVBUWSwgICAgICAgIkRpcmVjdG9yeSBub3QgZW1wdHkiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVQUk9DTElNLCAgICAgICAgIlRvbyBtYW55IHByb2Nlc3NlcyIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRVVTRVJTLCAgICAgICAgICAiVG9vIG1hbnkgdXNlcnMiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVEUVVPVCwgICAgICAgICAgIkRpc2MgcXVvdGEgZXhjZWVkZWQiKSwKKyAgICBQSl9CVUlMRF9FUlIoIFdTQUVTVEFMRSwgICAgICAgICAgIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRVJFTU9URSwgICAgICAgICAiVG9vIG1hbnkgbGV2ZWxzIG9mIHJlbW90ZSBpbiBwYXRoIiksCisgICAgUEpfQlVJTERfRVJSKCBXU0FTWVNOT1RSRUFEWSwgICAgICJOZXR3b3JrIHN5c3RlbSBpcyB1bmF2YWlsYWJsZSIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBVkVSTk9UU1VQUE9SVEVELCAiV2luc29jayB2ZXJzaW9uIG91dCBvZiByYW5nZSIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBTk9USU5JVElBTElTRUQsICAiV1NBU3RhcnR1cCBub3QgeWV0IGNhbGxlZCIpLAorICAgIFBKX0JVSUxEX0VSUiggV1NBRURJU0NPTiwgICAgICAgICAiR3JhY2VmdWwgc2h1dGRvd24gaW4gcHJvZ3Jlc3MiKSwKKy8qCisjZGVmaW5lIFdTQUVOT01PUkUgICAgICAgICAgICAgIChXU0FCQVNFRVJSKzEwMikKKyNkZWZpbmUgV1NBRUNBTkNFTExFRCAgICAgICAgICAgKFdTQUJBU0VFUlIrMTAzKQorI2RlZmluZSBXU0FFSU5WQUxJRFBST0NUQUJMRSAgICAoV1NBQkFTRUVSUisxMDQpCisjZGVmaW5lIFdTQUVJTlZBTElEUFJPVklERVIgICAgIChXU0FCQVNFRVJSKzEwNSkKKyNkZWZpbmUgV1NBRVBST1ZJREVSRkFJTEVESU5JVCAgKFdTQUJBU0VFUlIrMTA2KQorI2RlZmluZSBXU0FTWVNDQUxMRkFJTFVSRSAgICAgICAoV1NBQkFTRUVSUisxMDcpCisjZGVmaW5lIFdTQVNFUlZJQ0VfTk9UX0ZPVU5EICAgIChXU0FCQVNFRVJSKzEwOCkKKyNkZWZpbmUgV1NBVFlQRV9OT1RfRk9VTkQgICAgICAgKFdTQUJBU0VFUlIrMTA5KQorI2RlZmluZSBXU0FfRV9OT19NT1JFICAgICAgICAgICAoV1NBQkFTRUVSUisxMTApCisjZGVmaW5lIFdTQV9FX0NBTkNFTExFRCAgICAgICAgIChXU0FCQVNFRVJSKzExMSkKKyNkZWZpbmUgV1NBRVJFRlVTRUQgICAgICAgICAgICAgKFdTQUJBU0VFUlIrMTEyKQorICovCisgICAgUEpfQlVJTERfRVJSKCBXU0FIT1NUX05PVF9GT1VORCwgICJIb3N0IG5vdCBmb3VuZCIpLAorLyoKKyNkZWZpbmUgV1NBVFJZX0FHQUlOICAgICAgICAgICAgKFdTQUJBU0VFUlIrMTAwMikKKyNkZWZpbmUgV1NBTk9fUkVDT1ZFUlkgICAgICAgICAgKFdTQUJBU0VFUlIrMTAwMykKKyAqLworICAgIFBKX0JVSUxEX0VSUiggV1NBTk9fREFUQSwgICAgICAgICAiTm8gaG9zdCBkYXRhIG9mIHRoYXQgdHlwZSB3YXMgZm91bmQiKSwKKyAgICB7MCwgTlVMTH0KK307CisKKyNlbmRpZgkvKiBQSl9IQVNfRVJST1JfU1RSSU5HICovCisKKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldF9vc19lcnJvcih2b2lkKQoreworICAgIHJldHVybiBQSl9TVEFUVVNfRlJPTV9PUyhHZXRMYXN0RXJyb3IoKSk7Cit9CisKK1BKX0RFRih2b2lkKSBwal9zZXRfb3NfZXJyb3IocGpfc3RhdHVzX3QgY29kZSkKK3sKKyAgICBTZXRMYXN0RXJyb3IoUEpfU1RBVFVTX1RPX09TKGNvZGUpKTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfbmV0b3NfZXJyb3Iodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfU1RBVFVTX0ZST01fT1MoV1NBR2V0TGFzdEVycm9yKCkpOworfQorCitQSl9ERUYodm9pZCkgcGpfc2V0X25ldG9zX2Vycm9yKHBqX3N0YXR1c190IGNvZGUpCit7CisgICAgV1NBU2V0TGFzdEVycm9yKFBKX1NUQVRVU19UT19PUyhjb2RlKSk7Cit9CisKKy8qIAorICogcGxhdGZvcm1fc3RyZXJyb3IoKQorICoKKyAqIFBsYXRmb3JtIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UuIFRoaXMgZmlsZSBpcyBjYWxsZWQgYnkgcGpfc3RyZXJyb3IoKSAKKyAqIGluIGVycm5vLmMgCisgKi8KK2ludCBwbGF0Zm9ybV9zdHJlcnJvciggcGpfb3NfZXJyX3R5cGUgb3NfZXJyY29kZSwgCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZiwgcGpfc2l6ZV90IGJ1ZnNpemUpCit7CisgICAgcGpfc2l6ZV90IGxlbiA9IDA7CisgICAgUEpfREVDTF9VTklDT0RFX1RFTVBfQlVGKHdidWYsMTI4KTsKKworICAgIHBqX2Fzc2VydChidWYgIT0gTlVMTCk7CisgICAgcGpfYXNzZXJ0KGJ1ZnNpemUgPj0gMCk7CisKKyAgICAvKgorICAgICAqIE1VU1QgTk9UIGNoZWNrIHN0YWNrIGhlcmUuCisgICAgICogVGhpcyBmdW5jdGlvbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBQSl9DSEVDS19TVEFDSygpIGl0c2VsZiEKKyAgICAgICAvL1BKX0NIRUNLX1NUQUNLKCk7CisgICAgICovCisKKyAgICBpZiAoIWxlbikgeworI2lmIGRlZmluZWQoUEpfSEFTX0VSUk9SX1NUUklORykgJiYgKFBKX0hBU19FUlJPUl9TVFJJTkchPTApCisJaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGdhRXJyb3JMaXN0W2ldLm1zZzsgKytpKSB7CisgICAgICAgICAgICBpZiAoZ2FFcnJvckxpc3RbaV0uY29kZSA9PSBvc19lcnJjb2RlKSB7CisgICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKGdhRXJyb3JMaXN0W2ldLm1zZyk7CisJCWlmICgocGpfc2l6ZV90KWxlbiA+PSBidWZzaXplKSB7CisJCSAgICBsZW4gPSBidWZzaXplLTE7CisJCX0KKwkJcGpfbWVtY3B5KGJ1ZiwgZ2FFcnJvckxpc3RbaV0ubXNnLCBsZW4pOworCQlidWZbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgkvKiBQSl9IQVNfRVJST1JfU1RSSU5HICovCisKKyAgICB9CisKKworICAgIGlmICghbGVuKSB7CisjaWYgUEpfTkFUSVZFX1NUUklOR19JU19VTklDT0RFCisJbGVuID0gRm9ybWF0TWVzc2FnZSggRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gCisJCQkgICAgIHwgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCisJCQkgICAgIE5VTEwsCisJCQkgICAgIG9zX2VycmNvZGUsCisJCQkgICAgIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLCAKKwkJCSAgICAgd2J1ZiwKKwkJCSAgICAgc2l6ZW9mKHdidWYpLAorCQkJICAgICBOVUxMKTsKKwlpZiAobGVuKSB7CisJICAgIHBqX3VuaWNvZGVfdG9fYW5zaSh3YnVmLCBsZW4sIGJ1ZiwgYnVmc2l6ZSk7CisJfQorI2Vsc2UKKwlsZW4gPSBGb3JtYXRNZXNzYWdlKCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSAKKwkJCSAgICAgfCBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKKwkJCSAgICAgTlVMTCwKKwkJCSAgICAgb3NfZXJyY29kZSwKKwkJCSAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksIAorCQkJICAgICBidWYsCisJCQkgICAgIChpbnQpYnVmc2l6ZSwKKwkJCSAgICAgTlVMTCk7CisJYnVmW2J1ZnNpemUtMV0gPSAnXDAnOworI2VuZGlmCisKKwlpZiAobGVuKSB7CisJICAgIC8qIFJlbW92ZSB0cmFpbGluZyBuZXdsaW5lcy4gKi8KKwkgICAgd2hpbGUgKGxlbiAmJiAoYnVmW2xlbi0xXSA9PSAnXG4nIHx8IGJ1ZltsZW4tMV0gPT0gJ1xyJykpIHsKKwkJYnVmW2xlbi0xXSA9ICdcMCc7CisJCS0tbGVuOworCSAgICB9CisJfQorICAgIH0KKworICAgIGlmICghbGVuKSB7CisJbGVuID0gcGpfYW5zaV9zbnByaW50ZiggYnVmLCBidWZzaXplLCAiV2luMzIgZXJyb3IgY29kZSAldSIsIAorCQkJCSh1bnNpZ25lZClvc19lcnJjb2RlKTsKKwlpZiAobGVuIDwgMCB8fCBsZW4gPj0gKGludClidWZzaXplKQorCSAgICBsZW4gPSBidWZzaXplLTE7CisJYnVmW2xlbl0gPSAnXDAnOworICAgIH0KKworICAgIHJldHVybiAoaW50KWxlbjsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19pbmZvLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGZmODU2Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19pbmZvLmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qICRJZDogb3NfaW5mby5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovY3R5cGUuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorCisvKgorICogRllJIHRoZXNlIGxpbmtzIGNvbnRhaW4gdXNlZnVsIGluZm9zIGFib3V0IHByZWRlZmluZWQgbWFjcm9zIGFjcm9zcworICogcGxhdGZvcm1zOgorICogIC0gaHR0cDovL3ByZWRlZi5zb3VyY2Vmb3JnZS5uZXQvcHJlb3MuaHRtbAorICovCisKKyNpZiBkZWZpbmVkKFBKX0hBU19TWVNfVVRTTkFNRV9IKSAmJiBQSl9IQVNfU1lTX1VUU05BTUVfSCAhPSAwCisvKiBGb3IgdW5hbWUoKSAqLworIyAgIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisjICAgZGVmaW5lIFBKX0hBU19VTkFNRQkJMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBKX0hBU19MSU1JVFNfSCkgJiYgUEpfSEFTX0xJTUlUU19IICE9IDAKKy8qIEluY2x1ZGUgPGxpbWl0cy5oPiB0byBnZXQgPGZlYXR1cmVzLmg+IHRvIGdldCB2YXJpb3VzIGdsaWJjIG1hY3Jvcy4KKyAqIFNlZSBodHRwOi8vcHJlZGVmLnNvdXJjZWZvcmdlLm5ldC9wcmVsaWIuaHRtbAorICovCisjICAgaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisvKiBGb3IgYWxsIFdpbmRvd3MgaW5jbHVkaW5nIG1vYmlsZSAqLworIyAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQSl9EQVJXSU5PUykgJiYgUEpfREFSV0lOT1MgIT0gMAorIyAgIGluY2x1ZGUgIlRhcmdldENvbmRpdGlvbmFscy5oIgorI2VuZGlmCisKKyNpZm5kZWYgUEpfU1lTX0lORk9fQlVGRkVSX1NJWkUKKyMgICBkZWZpbmUgUEpfU1lTX0lORk9fQlVGRkVSX1NJWkUJNjQKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKFBKX0RBUldJTk9TKSAmJiBQSl9EQVJXSU5PUyAhPSAwICYmIFRBUkdFVF9PU19JUEhPTkUKKyAgICB2b2lkIHBqX2lwaG9uZV9vc19nZXRfc3lzX2luZm8ocGpfc3lzX2luZm8gKnNpLCBwal9zdHJfdCAqc2lfYnVmZmVyKTsKKyNlbmRpZgorICAgIAorI2lmIGRlZmluZWQoUEpfU1lNQklBTikgJiYgUEpfU1lNQklBTiAhPSAwCisgICAgUEpfQkVHSU5fREVDTAorICAgIHVuc2lnbmVkIHBqX3N5bWJpYW5vc19nZXRfbW9kZWxfaW5mbyhjaGFyICpidWYsIHVuc2lnbmVkIGJ1Zl9zaXplKTsKKyAgICB1bnNpZ25lZCBwal9zeW1iaWFub3NfZ2V0X3BsYXRmb3JtX2luZm8oY2hhciAqYnVmLCB1bnNpZ25lZCBidWZfc2l6ZSk7CisgICAgdm9pZCBwal9zeW1iaWFub3NfZ2V0X3Nka19pbmZvKHBqX3N0cl90ICpuYW1lLCBwal91aW50MzJfdCAqdmVyKTsKKyAgICBQSl9FTkRfREVDTAorI2VuZGlmCisKKworc3RhdGljIGNoYXIgKnZlcl9pbmZvKHBqX3VpbnQzMl90IHZlciwgY2hhciAqYnVmKQoreworICAgIHBqX3NpemVfdCBsZW47CisKKyAgICBpZiAodmVyID09IDApIHsKKwkqYnVmID0gJ1wwJzsKKwlyZXR1cm4gYnVmOworICAgIH0KKworICAgIHNwcmludGYoYnVmLCAiLSV1LiV1IiwKKwkgICAgKHZlciAmIDB4RkYwMDAwMDApID4+IDI0LAorCSAgICAodmVyICYgMHgwMEZGMDAwMCkgPj4gMTYpOworICAgIGxlbiA9IHN0cmxlbihidWYpOworCisgICAgaWYgKHZlciAmIDB4RkZGRikgeworCXNwcmludGYoYnVmK2xlbiwgIi4ldSIsICh2ZXIgJiAweEZGMDApID4+IDgpOworCWxlbiA9IHN0cmxlbihidWYpOworCisJaWYgKHZlciAmIDB4MDBGRikgeworCSAgICBzcHJpbnRmKGJ1ZitsZW4sICIuJXUiLCAodmVyICYgMHhGRikpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgcGpfdWludDMyX3QgcGFyc2VfdmVyc2lvbihjaGFyICpzdHIpCit7CisgICAgY2hhciAqdG9rOworICAgIGludCBpLCBtYXh0b2s7CisgICAgcGpfdWludDMyX3QgdmVyc2lvbiA9IDA7CisgICAgCisgICAgd2hpbGUgKCpzdHIgJiYgIXBqX2lzZGlnaXQoKnN0cikpCisJc3RyKys7CisKKyAgICBtYXh0b2sgPSA0OworICAgIGZvciAodG9rID0gc3RydG9rKHN0ciwgIi4tIiksIGk9MDsgdG9rICYmIGk8bWF4dG9rOworCSArK2ksIHRvaz1zdHJ0b2soTlVMTCwgIi4tIikpCisgICAgeworCWludCBuOworCisJaWYgKCFwal9pc2RpZ2l0KCp0b2spKQorCSAgICBicmVhazsKKwkKKwluID0gYXRvaSh0b2spOworCXZlcnNpb24gfD0gKG4gPDwgKCgzLWkpKjgpKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHZlcnNpb247Cit9CisKK1BKX0RFRihjb25zdCBwal9zeXNfaW5mbyopIHBqX2dldF9zeXNfaW5mbyh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIHNpX2J1ZmZlcltQSl9TWVNfSU5GT19CVUZGRVJfU0laRV07CisgICAgc3RhdGljIHBqX3N5c19pbmZvIHNpOworICAgIHN0YXRpYyBwal9ib29sX3Qgc2lfaW5pdGlhbGl6ZWQ7CisgICAgcGpfc2l6ZV90IGxlZnQgPSBQSl9TWVNfSU5GT19CVUZGRVJfU0laRSwgbGVuOworCisgICAgaWYgKHNpX2luaXRpYWxpemVkKQorCXJldHVybiAmc2k7CisKKyAgICBzaS5tYWNoaW5lLnB0ciA9IHNpLm9zX25hbWUucHRyID0gc2kuc2RrX25hbWUucHRyID0gc2kuaW5mby5wdHIgPSAiIjsKKworI2RlZmluZSBBTExPQ19DUF9TVFIoc3RyLGZpZWxkKQlcCisJZG8geyBcCisJICAgIGxlbiA9IHBqX2Fuc2lfc3RybGVuKHN0cik7IFwKKwkgICAgaWYgKGxlbiAmJiBsZWZ0ID49IGxlbisxKSB7IFwKKwkJc2kuZmllbGQucHRyID0gc2lfYnVmZmVyICsgUEpfU1lTX0lORk9fQlVGRkVSX1NJWkUgLSBsZWZ0OyBcCisJCXNpLmZpZWxkLnNsZW4gPSBsZW47IFwKKwkJcGpfbWVtY3B5KHNpLmZpZWxkLnB0ciwgc3RyLCBsZW4rMSk7IFwKKwkJbGVmdCAtPSAobGVuKzEpOyBcCisJICAgIH0gXAorCX0gd2hpbGUgKDApCisKKyAgICAvKgorICAgICAqIE1hY2hpbmUgYW5kIE9TIGluZm8uCisgICAgICovCisjaWYgZGVmaW5lZChQSl9IQVNfVU5BTUUpICYmIFBKX0hBU19VTkFNRQorICAgICNpZiBkZWZpbmVkKFBKX0RBUldJTk9TKSAmJiBQSl9EQVJXSU5PUyAhPSAwICYmIFRBUkdFVF9PU19JUEhPTkUgJiYgXAorCSghZGVmaW5lZCBUQVJHRVRfSVBIT05FX1NJTVVMQVRPUiB8fCBUQVJHRVRfSVBIT05FX1NJTVVMQVRPUiA9PSAwKQorICAgIHsKKwlwal9zdHJfdCBidWYgPSB7c2lfYnVmZmVyICsgUEpfU1lTX0lORk9fQlVGRkVSX1NJWkUgLSBsZWZ0LCBsZWZ0fTsKKwlwal9zdHJfdCBtYWNoaW5lID0geyJhcm0iLCAzfTsKKwlwal9zdHJfdCBzZGtfbmFtZSA9IHsiaU9TLVNESyIsIDd9OworCWNoYXIgdG1wW1BKX1NZU19JTkZPX0JVRkZFUl9TSVpFXTsKKwkKKwlwal9pcGhvbmVfb3NfZ2V0X3N5c19pbmZvKCZzaSwgJmJ1Zik7CisJbGVmdCAtPSBzaS5vc19uYW1lLnNsZW4gKyAxOworCisJc2kub3NfdmVyID0gcGFyc2VfdmVyc2lvbihzaS5tYWNoaW5lLnB0cik7CisJCisJc2kubWFjaGluZSA9IG1hY2hpbmU7CisJc2kuc2RrX25hbWUgPSBzZGtfbmFtZTsKKworCSNpZmRlZiBQSl9TREtfTkFNRQorCXBqX21lbWNweSh0bXAsIFBKX1NES19OQU1FLCBwal9hbnNpX3N0cmxlbihQSl9TREtfTkFNRSkgKyAxKTsKKwlzaS5zZGtfdmVyID0gcGFyc2VfdmVyc2lvbih0bXApOworCSNlbmRpZgorICAgIH0KKyAgICAjZWxzZSAgICAKKyAgICB7CisJc3RydWN0IHV0c25hbWUgdTsKKworCS8qIFN1Y2Nlc3NmdWwgdW5hbWUoKSByZXR1cm5zIHplcm8gb24gTGludXggYW5kIHBvc2l0aXZlIHZhbHVlCisJICogb24gT3BlblNvbGFyaXMuCisJICovCisJaWYgKHVuYW1lKCZ1KSA9PSAtMSkKKwkgICAgZ290byBnZXRfc2RrX2luZm87CisKKwlBTExPQ19DUF9TVFIodS5tYWNoaW5lLCBtYWNoaW5lKTsKKwlBTExPQ19DUF9TVFIodS5zeXNuYW1lLCBvc19uYW1lKTsKKwkKKwlzaS5vc192ZXIgPSBwYXJzZV92ZXJzaW9uKHUucmVsZWFzZSk7CisgICAgfQorICAgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICB7CisJT1NWRVJTSU9OSU5GTyBvdmk7CisKKwlvdmkuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihvdmkpOworCisJaWYgKEdldFZlcnNpb25FeCgmb3ZpKSA9PSBGQUxTRSkKKwkgICAgZ290byBnZXRfc2RrX2luZm87CisKKwlzaS5vc192ZXIgPSAob3ZpLmR3TWFqb3JWZXJzaW9uIDw8IDI0KSB8CisJCSAgICAob3ZpLmR3TWlub3JWZXJzaW9uIDw8IDE2KTsKKwkjaWYgZGVmaW5lZChQSl9XSU4zMl9XSU5DRSkgJiYgUEpfV0lOMzJfV0lOQ0UKKwkgICAgc2kub3NfbmFtZSA9IHBqX3N0cigid2luY2UiKTsKKwkjZWxzZQorCSAgICBzaS5vc19uYW1lID0gcGpfc3RyKCJ3aW4zMiIpOworCSNlbmRpZgorICAgIH0KKworICAgIHsKKwlTWVNURU1fSU5GTyB3c2k7CisKKwlHZXRTeXN0ZW1JbmZvKCZ3c2kpOworCXN3aXRjaCAod3NpLndQcm9jZXNzb3JBcmNoaXRlY3R1cmUpIHsKKyAgICAjaWYgZGVmaW5lZChQSl9XSU4zMl9XSU5DRSkgJiYgUEpfV0lOMzJfV0lOQ0UKKwljYXNlIFBST0NFU1NPUl9BUkNISVRFQ1RVUkVfQVJNOgorCSAgICBzaS5tYWNoaW5lID0gcGpfc3RyKCJhcm0iKTsKKwkgICAgYnJlYWs7CisJY2FzZSBQUk9DRVNTT1JfQVJDSElURUNUVVJFX1NIWDoKKwkgICAgc2kubWFjaGluZSA9IHBqX3N0cigic2h4Iik7CisJICAgIGJyZWFrOworICAgICNlbHNlCisJY2FzZSBQUk9DRVNTT1JfQVJDSElURUNUVVJFX0FNRDY0OgorCSAgICBzaS5tYWNoaW5lID0gcGpfc3RyKCJ4ODZfNjQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSBQUk9DRVNTT1JfQVJDSElURUNUVVJFX0lBNjQ6CisJICAgIHNpLm1hY2hpbmUgPSBwal9zdHIoImlhNjQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSBQUk9DRVNTT1JfQVJDSElURUNUVVJFX0lOVEVMOgorCSAgICBzaS5tYWNoaW5lID0gcGpfc3RyKCJpMzg2Iik7CisJICAgIGJyZWFrOworICAgICNlbmRpZgkvKiBQSl9XSU4zMl9XSU5DRSAqLworCX0KKyAgICB9CisjZWxpZiBkZWZpbmVkKFBKX1NZTUJJQU4pICYmIFBKX1NZTUJJQU4gIT0gMAorICAgIHsKKwlwal9zeW1iaWFub3NfZ2V0X21vZGVsX2luZm8oc2lfYnVmZmVyLCBzaXplb2Yoc2lfYnVmZmVyKSk7CisJQUxMT0NfQ1BfU1RSKHNpX2J1ZmZlciwgbWFjaGluZSk7CisJCisJY2hhciAqcCA9IHNpX2J1ZmZlciArIHNpemVvZihzaV9idWZmZXIpIC0gbGVmdDsKKwl1bnNpZ25lZCBwbGVuOworCXBsZW4gPSBwal9zeW1iaWFub3NfZ2V0X3BsYXRmb3JtX2luZm8ocCwgbGVmdCk7CisJaWYgKHBsZW4pIHsKKwkgICAgLyogT3V0cHV0IGZvcm1hdCB3aWxsIGJlICJTZXJpZXM2MHZYLlgiICovCisJICAgIHNpLm9zX25hbWUgPSBwal9zdHIoIlM2MCIpOworCSAgICBzaS5vc192ZXIgID0gcGFyc2VfdmVyc2lvbihwKzkpOworCX0gZWxzZSB7CisJICAgIHNpLm9zX25hbWUgPSBwal9zdHIoIlVua25vd24iKTsKKwl9CisJCisJLyogQXZvaWQgY29tcGlsZSB3YXJuaW5nIG9uIFN5bWJpYW4uICovCisJZ290byBnZXRfc2RrX2luZm87CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIFNESyBpbmZvLgorICAgICAqLworZ2V0X3Nka19pbmZvOgorCisjaWYgZGVmaW5lZChfX0dMSUJDX18pCisgICAgc2kuc2RrX3ZlciA9IChfX0dMSUJDX18gPDwgMjQpIHwKKwkJIChfX0dMSUJDX01JTk9SX18gPDwgMTYpOworICAgIHNpLnNka19uYW1lID0gcGpfc3RyKCJnbGliYyIpOworI2VsaWYgZGVmaW5lZChfX0dOVV9MSUJSQVJZX18pCisgICAgc2kuc2RrX3ZlciA9IChfX0dOVV9MSUJSQVJZX18gPDwgMjQpIHwKKwkgICAgICAgICAoX19HTlVfTElCUkFSWV9NSU5PUl9fIDw8IDE2KTsKKyAgICBzaS5zZGtfbmFtZSA9IHBqX3N0cigibGliYyIpOworI2VsaWYgZGVmaW5lZChfX1VDTElCQ19fKQorICAgIHNpLnNka192ZXIgPSAoX19VQ0xJQkNfTUFKT1JfXyA8PCAyNCkgfAorICAgIAkgICAgICAgICAoX19VQ0xJQkNfTUlOT1JfXyA8PCAxNik7CisgICAgc2kuc2RrX25hbWUgPSBwal9zdHIoInVjbGliYyIpOworI2VsaWYgZGVmaW5lZChfV0lOMzJfV0NFKSAmJiBfV0lOMzJfV0NFCisgICAgLyogT2xkIHdpbmRvdyBtb2JpbGUgZGVjbGFyZXMgX1dJTjMyX1dDRSBhcyBkZWNpbWFsIChlLmcuIDMwMCwgNDIwLCBldGMuKSwKKyAgICAgKiBidXQgdGhlbiBpdCB3YXMgY2hhbmdlZCB0byB1c2UgaGV4LCBlLmcuIDB4NDIwLCBldGMuIFNlZQorICAgICAqIGh0dHA6Ly9zb2NpYWwubXNkbi5taWNyb3NvZnQuY29tL2ZvcnVtcy9lbi1VUy92c3NtYXJ0ZGV2aWNlc25hdGl2ZS90aHJlYWQvOGE5N2M1OWYtNWExYy00YmM2LTk5ZTYtNDI3ZjA2NWZmNDM5LworICAgICAqLworICAgICNpZiBfV0lOMzJfV0NFIDw9IDUwMAorCXNpLnNka192ZXIgPSAoIChfV0lOMzJfV0NFIC8gMTAwKSA8PCAyNCkgfAorCQkgICAgICggKChfV0lOMzJfV0NFICUgMTAwKSAvIDEwKSA8PCAxNikgfAorCQkgICAgICggKF9XSU4zMl9XQ0UgJSAxMCkgPDwgOCk7CisgICAgI2Vsc2UKKwlzaS5zZGtfdmVyID0gKCAoKF9XSU4zMl9XQ0UgJiAweEZGMDApID4+IDgpIDw8IDI0KSB8CisJCSAgICAgKCAoKF9XSU4zMl9XQ0UgJiAweDAwRjApID4+IDQpIDw8IDE2KSB8CisJCSAgICAgKCAoKF9XSU4zMl9XQ0UgJiAweDAwMEYpID4+IDApIDw8IDgpOworICAgICNlbmRpZgorICAgIHNpLnNka19uYW1lID0gcGpfc3RyKCJjZXNkayIpOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICAvKiBObyBTREsgaW5mbyBpcyBlYXNpbHkgb2J0YWluYWJsZSBmb3IgVmlzdWFsIEMsIHNvIGxldHMganVzdCB1c2UKKyAgICAgKiBfTVNDX1ZFUi4gVGhlIF9NU0NfVkVSIG1hY3JvIHJlcG9ydHMgdGhlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9ucworICAgICAqIG9mIHRoZSBjb21waWxlci4gRm9yIGV4YW1wbGUsIDEzMTAgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIC5ORVQgMjAwMy4KKyAgICAgKiAxMzEwIHJlcHJlc2VudHMgdmVyc2lvbiAxMyBhbmQgYSAxLjAgcG9pbnQgcmVsZWFzZS4KKyAgICAgKiBUaGUgVmlzdWFsIEMrKyAyMDA1IGNvbXBpbGVyIHZlcnNpb24gaXMgMTQwMC4KKyAgICAgKi8KKyAgICBzaS5zZGtfdmVyID0gKChfTVNDX1ZFUiAvIDEwMCkgPDwgMjQpIHwKKyAgICAJICAgICAgICAgKCgoX01TQ19WRVIgJSAxMDApIC8gMTApIDw8IDE2KSB8CisgICAgCSAgICAgICAgICgoX01TQ19WRVIgJSAxMCkgPDwgOCk7CisgICAgc2kuc2RrX25hbWUgPSBwal9zdHIoIm1zdmMiKTsKKyNlbGlmIGRlZmluZWQoUEpfU1lNQklBTikgJiYgUEpfU1lNQklBTiAhPSAwCisgICAgcGpfc3ltYmlhbm9zX2dldF9zZGtfaW5mbygmc2kuc2RrX25hbWUsICZzaS5zZGtfdmVyKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBCdWlsZCB0aGUgaW5mbyBzdHJpbmcuCisgICAgICovCisgICAgeworCWNoYXIgdG1wW1BKX1NZU19JTkZPX0JVRkZFUl9TSVpFXTsKKwljaGFyIG9zX3ZlclsyMF0sIHNka192ZXJbMjBdOworCWludCBjbnQ7CisKKwljbnQgPSBwal9hbnNpX3NucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksCisJCQkgICAgICAgIiVzJXMlcyVzJXMlcyVzIiwKKwkJCSAgICAgICBzaS5vc19uYW1lLnB0ciwKKwkJCSAgICAgICB2ZXJfaW5mbyhzaS5vc192ZXIsIG9zX3ZlciksCisJCQkgICAgICAgKHNpLm1hY2hpbmUuc2xlbiA/ICIvIiA6ICIiKSwKKwkJCSAgICAgICBzaS5tYWNoaW5lLnB0ciwKKwkJCSAgICAgICAoc2kuc2RrX25hbWUuc2xlbiA/ICIvIiA6ICIiKSwKKwkJCSAgICAgICBzaS5zZGtfbmFtZS5wdHIsCisJCQkgICAgICAgdmVyX2luZm8oc2kuc2RrX3Zlciwgc2RrX3ZlcikpOworCWlmIChjbnQgPiAwICYmIGNudCA8IChpbnQpc2l6ZW9mKHRtcCkpIHsKKwkgICAgQUxMT0NfQ1BfU1RSKHRtcCwgaW5mbyk7CisJfQorICAgIH0KKworICAgIHNpX2luaXRpYWxpemVkID0gUEpfVFJVRTsKKyAgICByZXR1cm4gJnNpOworfQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19pbmZvX2lwaG9uZS5tIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19pbmZvX2lwaG9uZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MzE1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2luZm9faXBob25lLm0KQEAgLTAsMCArMSw1MyBAQAorLyogJElkOiBvc19pbmZvX2lwaG9uZS5tIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSAiVGFyZ2V0Q29uZGl0aW9uYWxzLmgiCisKKyNpZiAhZGVmaW5lZCBUQVJHRVRfSVBIT05FX1NJTVVMQVRPUiB8fCBUQVJHRVRfSVBIT05FX1NJTVVMQVRPUiA9PSAwCisKKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorCisjaW5jbHVkZSA8VUlLaXQvVUlEZXZpY2UuaD4KKwordm9pZCBwal9pcGhvbmVfb3NfZ2V0X3N5c19pbmZvKHBqX3N5c19pbmZvICpzaSwgcGpfc3RyX3QgKnNpX2J1ZmZlcikKK3sKKyAgICB1bnNpZ25lZCBidWZfbGVuID0gc2lfYnVmZmVyLT5zbGVuLCBsZWZ0ID0gc2lfYnVmZmVyLT5zbGVuLCBsZW47CisgICAgVUlEZXZpY2UgKmRldmljZSA9IFtVSURldmljZSBjdXJyZW50RGV2aWNlXTsKKyAgICAKKyAgICBpZiAoW2RldmljZSByZXNwb25kc1RvU2VsZWN0b3I6QHNlbGVjdG9yKGlzTXVsdGl0YXNraW5nU3VwcG9ydGVkKV0pCisJc2ktPmZsYWdzIHw9IFBKX1NZU19IQVNfSU9TX0JHOworICAgIAorI2RlZmluZSBBTExPQ19DUF9TVFIoc3RyLGZpZWxkKQlcCisgICAgZG8geyBcCisJbGVuID0gW3N0ciBsZW5ndGhdOyBcCisJaWYgKGxlbiAmJiBsZWZ0ID49IGxlbisxKSB7IFwKKwkgICAgc2ktPmZpZWxkLnB0ciA9IHNpX2J1ZmZlci0+cHRyICsgYnVmX2xlbiAtIGxlZnQ7IFwKKwkgICAgc2ktPmZpZWxkLnNsZW4gPSBsZW47IFwKKwkgICAgW3N0ciBnZXRDU3RyaW5nOnNpLT5maWVsZC5wdHIgbWF4TGVuZ3RoOmxlbisxIFwKKwkJIGVuY29kaW5nOk5TQVNDSUlTdHJpbmdFbmNvZGluZ107IFwKKwkgICAgbGVmdCAtPSAobGVuKzEpOyBcCisJfSBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIEFMTE9DX0NQX1NUUihbZGV2aWNlIHN5c3RlbU5hbWVdLCBvc19uYW1lKTsKKyAgICBBTExPQ19DUF9TVFIoW2RldmljZSBzeXN0ZW1WZXJzaW9uXSwgbWFjaGluZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19pbmZvX3N5bWJpYW4uY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19pbmZvX3N5bWJpYW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzODlmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX2luZm9fc3ltYmlhbi5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8qICRJZDogb3NfaW5mb19zeW1iaWFuLmNwcCAzNDM3IDIwMTEtMDMtMDggMDY6MzA6MzRaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWYgIWRlZmluZWQoUEpfU1lNQklBTikgfHwgUEpfU1lNQklBTiA9PSAwCisjICAgZXJyb3IgVGhpcyBmaWxlIGlzIG9ubHkgZm9yIFN5bWJpYW4gcGxhdGZvcm0KKyNlbmRpZgorCisjaW5jbHVkZSA8cGovY3R5cGUuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGYzMmZpbGUuaD4JLyogbGluayBhZ2FpbnN0IGVmc3J2LmxpYgkqLworI2luY2x1ZGUgPGhhbC5oPgkvKiBsaW5rIGFnYWluc3QgaGFsLmxpYgkJKi8KKyNpbmNsdWRlIDx1dGYuaD4JLyogbGluayBhZ2FpbnN0IGNoYXJjb252LmxpYgkqLworCisKK1BKX0JFR0lOX0RFQ0wKK3Vuc2lnbmVkIHBqX3N5bWJpYW5vc19nZXRfbW9kZWxfaW5mbyhjaGFyICpidWYsIHVuc2lnbmVkIGJ1Zl9zaXplKTsKK3Vuc2lnbmVkIHBqX3N5bWJpYW5vc19nZXRfcGxhdGZvcm1faW5mbyhjaGFyICpidWYsIHVuc2lnbmVkIGJ1Zl9zaXplKTsKK3ZvaWQgcGpfc3ltYmlhbm9zX2dldF9zZGtfaW5mbyhwal9zdHJfdCAqbmFtZSwgcGpfdWludDMyX3QgKnZlcik7CitQSl9FTkRfREVDTAorCisKKy8qIEdldCBTeW1iaWFuIHBob25lIG1vZGVsIGluZm8sIHJldHVybmluZyBsZW5ndGggb2YgbW9kZWwgaW5mbyAqLwordW5zaWduZWQgcGpfc3ltYmlhbm9zX2dldF9tb2RlbF9pbmZvKGNoYXIgKmJ1ZiwgdW5zaWduZWQgYnVmX3NpemUpCit7CisgICAgcGpfc3RyX3QgbW9kZWxfbmFtZTsKKworICAgIC8qIEdldCBtYWNoaW5lIFVJRCAqLworICAgIFRJbnQgaGFsX3ZhbDsKKyAgICBIQUw6OkdldChIQUw6OkVNYWNoaW5lVWlkLCBoYWxfdmFsKTsKKyAgICBwal9hbnNpX3NucHJpbnRmKGJ1ZiwgYnVmX3NpemUsICIweCUwOFgiLCBoYWxfdmFsKTsKKyAgICBwal9zdHJzZXQyKCZtb2RlbF9uYW1lLCBidWYpOworCisgICAgLyogR2V0IG1vZGVsIG5hbWUgKi8KKyAgICBjb25zdCBwal9zdHJfdCBzdF9jb3B5cmlnaHQgPSB7IihDKSIsIDN9OworICAgIGNvbnN0IHBqX3N0cl90IHN0X25va2lhID0geyJOb2tpYSIsIDV9OworICAgIGNoYXIgdG1wX2J1Zls2NF07CisgICAgcGpfc3RyX3QgdG1wX3N0cjsKKworICAgIF9MSVQoS01vZGVsRmlsZW5hbWUsIlo6XFxyZXNvdXJjZVxcdmVyc2lvbnNcXG1vZGVsLnR4dCIpOworICAgIFJGaWxlIGZpbGU7CisgICAgUkZzIGZzOworICAgIFRJbnQgZXJyOworICAgIAorICAgIGZzLkNvbm5lY3QoMSk7CisgICAgZXJyID0gZmlsZS5PcGVuKGZzLCBLTW9kZWxGaWxlbmFtZSwgRUZpbGVSZWFkKTsKKyAgICBpZiAoZXJyID09IEtFcnJOb25lKSB7CisJVEZpbGVUZXh0IHRleHQ7CisJdGV4dC5TZXQoZmlsZSk7CisJVEJ1ZjE2PDY0PiBNb2RlbE5hbWUxNjsKKwllcnIgPSB0ZXh0LlJlYWQoTW9kZWxOYW1lMTYpOworCWlmIChlcnIgPT0gS0Vyck5vbmUpIHsKKwkgICAgVFB0cjggcHRyOCgoVFVpbnQ4Kil0bXBfYnVmLCBzaXplb2YodG1wX2J1ZikpOworCSAgICBwdHI4LkNvcHkoTW9kZWxOYW1lMTYpOworCSAgICBwal9zdHJzZXQoJnRtcF9zdHIsIHRtcF9idWYsIHB0cjguTGVuZ3RoKCkpOworCSAgICBwal9zdHJ0cmltKCZ0bXBfc3RyKTsKKwl9CisJZmlsZS5DbG9zZSgpOworICAgIH0KKyAgICBmcy5DbG9zZSgpOworICAgIGlmIChlcnIgIT0gS0Vyck5vbmUpCisJZ290byBvbl9yZXR1cm47CisgICAgCisgICAgLyogVGhlIHJldHJpZXZlZCBtb2RlbCBuYW1lIGlzIHVzdWFsbHkgaW4gbG9uZyBmb3JtYXQsIGUuZzogCisgICAgICogIqkgTm9raWEgTjk1ICgwMS4wMSkiLCAiKEMpIE5va2lhIEU1MiIuIEFzIHdlIG5lZWQgb25seQorICAgICAqIHRoZSBzaG9ydCB2ZXJzaW9uLCBsZXQncyBjbGVhbiBpdCB1cC4KKyAgICAgKi8KKyAgICAKKyAgICAvKiBSZW1vdmUgcHJlY2VkaW5nIG5vbi1BU0NJSSBjaGFycywgZS5nOiAiqSIgKi8KKyAgICBjaGFyICpwID0gdG1wX3N0ci5wdHI7CisgICAgd2hpbGUgKCFwal9pc2FzY2lpKCpwKSkgeyBwKys7IH0KKyAgICBwal9zdHJzZXQoJnRtcF9zdHIsIHAsIHRtcF9zdHIuc2xlbiAtIChwIC0gdG1wX3N0ci5wdHIpKTsKKyAgICAKKyAgICAvKiBSZW1vdmUgIihDKSIgKi8KKyAgICBwID0gcGpfc3RyaXN0cigmdG1wX3N0ciwgJnN0X2NvcHlyaWdodCk7CisgICAgaWYgKHApIHsKKwlwICs9IHN0X2NvcHlyaWdodC5zbGVuOworCXBqX3N0cnNldCgmdG1wX3N0ciwgcCwgdG1wX3N0ci5zbGVuIC0gKHAgLSB0bXBfc3RyLnB0cikpOworICAgIH0KKworICAgIC8qIFJlbW92ZSAiTm9raWEiICovCisgICAgcCA9IHBqX3N0cmlzdHIoJnRtcF9zdHIsICZzdF9ub2tpYSk7CisgICAgaWYgKHApIHsKKwlwICs9IHN0X25va2lhLnNsZW47CisJcGpfc3Ryc2V0KCZ0bXBfc3RyLCBwLCB0bXBfc3RyLnNsZW4gLSAocCAtIHRtcF9zdHIucHRyKSk7CisgICAgfQorICAgIAorICAgIC8qIFJlbW92ZSBsYW5ndWFnZSB2ZXJzaW9uLCBlLmc6ICIoMDEuMDEpIiAqLworICAgIHAgPSBwal9zdHJjaHIoJnRtcF9zdHIsICcoJyk7CisgICAgaWYgKHApIHsKKwl0bXBfc3RyLnNsZW4gPSBwIC0gdG1wX3N0ci5wdHI7CisgICAgfQorICAgIAorICAgIHBqX3N0cnRyaW0oJnRtcF9zdHIpOworICAgIAorICAgIGlmICh0bXBfc3RyLnNsZW4gPT0gMCkKKwlnb3RvIG9uX3JldHVybjsKKyAgICAKKyAgICBpZiAoKHVuc2lnbmVkKXRtcF9zdHIuc2xlbiA+IGJ1Zl9zaXplIC0gbW9kZWxfbmFtZS5zbGVuIC0gMykKKwl0bXBfc3RyLnNsZW4gPSBidWZfc2l6ZSAtIG1vZGVsX25hbWUuc2xlbiAtIDM7CisgICAgCisgICAgcGpfc3RyY2F0MigmbW9kZWxfbmFtZSwgIigiKTsKKyAgICBwal9zdHJjYXQoJm1vZGVsX25hbWUsICZ0bXBfc3RyKTsKKyAgICBwal9zdHJjYXQyKCZtb2RlbF9uYW1lLCAiKSIpOworICAgIAorICAgIC8qIFplcm8gdGVybWluYXRlICovCisgICAgYnVmW21vZGVsX25hbWUuc2xlbl0gPSAnXDAnOworICAgIAorb25fcmV0dXJuOgorICAgIHJldHVybiBtb2RlbF9uYW1lLnNsZW47Cit9CisKKworLyogR2V0IHBsYXRmb3JtIGluZm8sIHJldHVybmVkIGZvcm1hdCB3aWxsIGJlICJTZXJpZXM2MHZYLlgiICovCit1bnNpZ25lZCBwal9zeW1iaWFub3NfZ2V0X3BsYXRmb3JtX2luZm8oY2hhciAqYnVmLCB1bnNpZ25lZCBidWZfc2l6ZSkKK3sKKyAgICAvKiBPUyBpbmZvICovCisgICAgX0xJVChLUzYwUHJvZHVjdElERmlsZSwgIlNlcmllczYwdiouc2lzIik7CisgICAgX0xJVChLUk9NSW5zdGFsbERpciwgIno6XFxzeXN0ZW1cXGluc3RhbGxcXCIpOworCisgICAgUkZzIGZzOworICAgIFRGaW5kRmlsZSBmZihmcyk7CisgICAgQ0RpciogcmVzdWx0OworICAgIHBqX3N0cl90IHBsYXRfaW5mbyA9IHtOVUxMLCAwfTsKKyAgICBUSW50IGVycjsKKworICAgIGZzLkNvbm5lY3QoMSk7CisgICAgZXJyID0gZmYuRmluZFdpbGRCeURpcihLUzYwUHJvZHVjdElERmlsZSwgS1JPTUluc3RhbGxEaXIsIHJlc3VsdCk7CisgICAgaWYgKGVyciA9PSBLRXJyTm9uZSkgeworCWVyciA9IHJlc3VsdC0+U29ydChFU29ydEJ5TmFtZXxFRGVzY2VuZGluZyk7CisJaWYgKGVyciA9PSBLRXJyTm9uZSkgeworCSAgICBUUHRyOCB0bXBfcHRyOCgoVFVpbnQ4KilidWYsIGJ1Zl9zaXplKTsKKwkgICAgY29uc3QgcGpfc3RyX3QgdG1wX2V4dCA9IHsiLnNpcyIsIDR9OworCSAgICBjaGFyICpwOworCSAgICAKKwkgICAgdG1wX3B0cjguQ29weSgoKnJlc3VsdClbMF0uaU5hbWUpOworCSAgICBwal9zdHJzZXQoJnBsYXRfaW5mbywgYnVmLCAocGpfc2l6ZV90KXRtcF9wdHI4Lkxlbmd0aCgpKTsKKwkgICAgcCA9IHBqX3N0cmlzdHIoJnBsYXRfaW5mbywgJnRtcF9leHQpOworCSAgICBpZiAocCkKKwkJcGxhdF9pbmZvLnNsZW4gLT0gKHAgLSBwbGF0X2luZm8ucHRyKTsKKwl9CisJZGVsZXRlIHJlc3VsdDsKKyAgICB9CisgICAgZnMuQ2xvc2UoKTsKKyAgICBidWZbcGxhdF9pbmZvLnNsZW5dID0gJ1wwJzsKKyAgICAKKyAgICByZXR1cm4gcGxhdF9pbmZvLnNsZW47Cit9CisKKworLyogR2V0IFNESyBpbmZvICovCit2b2lkIHBqX3N5bWJpYW5vc19nZXRfc2RrX2luZm8ocGpfc3RyX3QgKm5hbWUsIHBqX3VpbnQzMl90ICp2ZXIpCit7CisgICAgY29uc3QgcGpfc3RyX3QgUzYwID0geyJTNjAiLCAzfTsKKyAgICAjaWYgZGVmaW5lZChfX1NFUklFUzYwXzMwX18pCisJKm5hbWUgPSBTNjA7CisJKnZlciAgPSAoMyA8PCAyNCk7CisgICAgI2VsaWYgZGVmaW5lZChfX1NFUklFUzYwXzMxX18pCisJKm5hbWUgPSBTNjA7CisJKnZlciAgPSAoMyA8PCAyNCkgfCAoMSA8PCAxNik7CisgICAgI2VsaWYgZGVmaW5lZChfX1M2MF8zMl9fKQorCSpuYW1lID0gUzYwOworCSp2ZXIgID0gKDMgPDwgMjQpIHwgKDIgPDwgMTYpOworICAgICNlbGlmIGRlZmluZWQoX19TNjBfNTBfXykKKwkqbmFtZSA9IFM2MDsKKwkqdmVyICA9ICg1IDw8IDI0KTsKKyAgICAjZWxpZiBkZWZpbmVkKF9fTk9LSUFfTjk3X18pCisJKm5hbWUgPSBwal9zdHIoIk45NyIpOworCSp2ZXIgID0gKDEgPDwgMjQpOworICAgICNlbHNlCisJKm5hbWUgPSBwal9zdHIoIlVua25vd24iKTsKKwkqdmVyICA9IDA7CisgICAgI2VuZGlmCit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfcndtdXRleC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19yd211dGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5MjM1MwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfcndtdXRleC5jCkBAIC0wLDAgKzEsMTYzIEBACisvKiAkSWQ6IG9zX3J3bXV0ZXguYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisvKiAKKyAqIE5vdGU6IAorICogCisgKiBETyBOT1QgQlVJTEQgVEhJUyBGSUxFIERJUkVDVExZLiBUSElTIEZJTEUgV0lMTCBCRSBJTkNMVURFRCBCWSBvc19jb3JlXyouYworICogV0hFTiBNQUNSTyBQSl9FTVVMQVRFX1JXTVVURVggSVMgU0VULgorICovCisKKy8qCisgKiBvc19yd211dGV4LmM6CisgKgorICogSW1wbGVtZW50YXRpb24gb2YgUmVhZC1Xcml0ZSBtdXRleCBmb3IgcGxhdGZvcm1zIHRoYXQgbGFjayBpdCAoZS5nLgorICogV2luMzIsIFJURU1TKS4KKyAqLworCisKK3N0cnVjdCBwal9yd211dGV4X3QKK3sKKyAgICBwal9tdXRleF90ICpyZWFkX2xvY2s7CisgICAgLyogd3JpdGVfbG9jayBtdXN0IHVzZSBzZW1hcGhvcmUsIGJlY2F1c2Ugd3JpdGVfbG9jayBtYXkgYmUgcmVsZWFzZWQKKyAgICAgKiBieSB0aHJlYWQgb3RoZXIgdGhhbiB0aGUgdGhyZWFkIHRoYXQgYWNxdWlyZSB0aGUgd3JpdGVfbG9jayBpbiB0aGUKKyAgICAgKiBmaXJzdCBwbGFjZS4KKyAgICAgKi8KKyAgICBwal9zZW1fdCAgICp3cml0ZV9sb2NrOworICAgIHBqX2ludDMyX3QgIHJlYWRlcl9jb3VudDsKK307CisKKy8qCisgKiBDcmVhdGUgcmVhZGVyL3dyaXRlciBtdXRleC4KKyAqCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfcndtdXRleF9jcmVhdGUocGpfcG9vbF90ICpwb29sLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgIHBqX3J3bXV0ZXhfdCAqKnBfbXV0ZXgpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIHBqX3J3bXV0ZXhfdCAqcndtdXRleDsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBwX211dGV4LCBQSl9FSU5WQUwpOworCisgICAgKnBfbXV0ZXggPSBOVUxMOworICAgIHJ3bXV0ZXggPSBQSl9QT09MX0FMTE9DX1QocG9vbCwgcGpfcndtdXRleF90KTsKKworICAgIHN0YXR1cyA9IHBqX211dGV4X2NyZWF0ZV9zaW1wbGUocG9vbCwgbmFtZSwgJnJ3bXV0ZXggLT5yZWFkX2xvY2spOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgc3RhdHVzID0gcGpfc2VtX2NyZWF0ZShwb29sLCBuYW1lLCAxLCAxLCAmcndtdXRleC0+d3JpdGVfbG9jayk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfbXV0ZXhfZGVzdHJveShyd211dGV4LT5yZWFkX2xvY2spOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcndtdXRleC0+cmVhZGVyX2NvdW50ID0gMDsKKyAgICAqcF9tdXRleCA9IHJ3bXV0ZXg7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBMb2NrIHRoZSBtdXRleCBmb3IgcmVhZGluZy4KKyAqCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfcndtdXRleF9sb2NrX3JlYWQocGpfcndtdXRleF90ICptdXRleCkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG11dGV4LCBQSl9FSU5WQUwpOworCisgICAgc3RhdHVzID0gcGpfbXV0ZXhfbG9jayhtdXRleC0+cmVhZF9sb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlwal9hc3NlcnQoISJUaGlzIHByZXR0eSBtdWNoIGlzIHVuZXhwZWN0ZWQiKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIG11dGV4LT5yZWFkZXJfY291bnQrKzsKKworICAgIHBqX2Fzc2VydChtdXRleC0+cmVhZGVyX2NvdW50IDwgMHg3RkZGRkZGMEwpOworCisgICAgaWYgKG11dGV4LT5yZWFkZXJfY291bnQgPT0gMSkKKwlwal9zZW1fd2FpdChtdXRleC0+d3JpdGVfbG9jayk7CisKKyAgICBzdGF0dXMgPSBwal9tdXRleF91bmxvY2sobXV0ZXgtPnJlYWRfbG9jayk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIExvY2sgdGhlIG11dGV4IGZvciB3cml0aW5nLgorICoKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9yd211dGV4X2xvY2tfd3JpdGUocGpfcndtdXRleF90ICptdXRleCkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG11dGV4LCBQSl9FSU5WQUwpOworICAgIHJldHVybiBwal9zZW1fd2FpdChtdXRleC0+d3JpdGVfbG9jayk7Cit9CisKKy8qCisgKiBSZWxlYXNlIHJlYWQgbG9jay4KKyAqCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfcndtdXRleF91bmxvY2tfcmVhZChwal9yd211dGV4X3QgKm11dGV4KQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4obXV0ZXgsIFBKX0VJTlZBTCk7CisKKyAgICBzdGF0dXMgPSBwal9tdXRleF9sb2NrKG11dGV4LT5yZWFkX2xvY2spOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqX2Fzc2VydCghIlRoaXMgcHJldHR5IG11Y2ggaXMgdW5leHBlY3RlZCIpOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcGpfYXNzZXJ0KG11dGV4LT5yZWFkZXJfY291bnQgPj0gMSk7CisKKyAgICAtLW11dGV4LT5yZWFkZXJfY291bnQ7CisgICAgaWYgKG11dGV4LT5yZWFkZXJfY291bnQgPT0gMCkKKwlwal9zZW1fcG9zdChtdXRleC0+d3JpdGVfbG9jayk7CisKKyAgICBzdGF0dXMgPSBwal9tdXRleF91bmxvY2sobXV0ZXgtPnJlYWRfbG9jayk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFJlbGVhc2Ugd3JpdGUgbG9jay4KKyAqCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfcndtdXRleF91bmxvY2tfd3JpdGUocGpfcndtdXRleF90ICptdXRleCkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG11dGV4LCBQSl9FSU5WQUwpOworICAgIHBqX2Fzc2VydChtdXRleC0+cmVhZGVyX2NvdW50IDw9IDEpOworICAgIHJldHVybiBwal9zZW1fcG9zdChtdXRleC0+d3JpdGVfbG9jayk7Cit9CisKKworLyoKKyAqIERlc3Ryb3kgcmVhZGVyL3dyaXRlciBtdXRleC4KKyAqCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfcndtdXRleF9kZXN0cm95KHBqX3J3bXV0ZXhfdCAqbXV0ZXgpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihtdXRleCwgUEpfRUlOVkFMKTsKKyAgICBwal9tdXRleF9kZXN0cm95KG11dGV4LT5yZWFkX2xvY2spOworICAgIHBqX3NlbV9kZXN0cm95KG11dGV4LT53cml0ZV9sb2NrKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19zeW1iaWFuLmggYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3N5bWJpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjM1MTFiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc19zeW1iaWFuLmgKQEAgLTAsMCArMSw0MjIgQEAKKy8qICRJZDogb3Nfc3ltYmlhbi5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fT1NfU1lNQklBTl9IX18KKyNkZWZpbmUgX19PU19TWU1CSUFOX0hfXworCisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9zb2NrLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGUzMmJhc2UuaD4KKyNpbmNsdWRlIDxlMzJjbW4uaD4KKyNpbmNsdWRlIDxlMzJzdGQuaD4KKyNpbmNsdWRlIDxlc19zb2NrLmg+CisjaW5jbHVkZSA8aW5fc29jay5oPgorI2luY2x1ZGUgPGNoYXJjb252Lmg+CisjaW5jbHVkZSA8dXRmLmg+CisjaW5jbHVkZSA8ZTMyY29ucy5oPgorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucworY2xhc3MgQ1BqU29ja2V0UmVhZGVyOworCisjaWZuZGVmIFBKX1NZTUJJQU5fVElNRVJfUFJJT1JJVFkKKyMgICAgZGVmaW5lIFBKX1NZTUJJQU5fVElNRVJfUFJJT1JJVFkJRVByaW9yaXR5Tm9ybWFsCisjZW5kaWYKKworLy8KKy8vIFBKTElCIFN5bWJpYW4ncyBTb2NrZXQKKy8vCitjbGFzcyBDUGpTb2NrZXQKK3sKK3B1YmxpYzoKKyAgICBlbnVtCisgICAgeworCU1BWF9MRU4gPSAxNTAwLAorICAgIH07CisKKyAgICAvLyBDb25zdHJ1Y3QgQ1BqU29ja2V0CisgICAgQ1BqU29ja2V0KGludCBhZiwgaW50IHNvY2tfdHlwZSwgUlNvY2tldCAmc29jaykKKwk6IGFmXyhhZiksIHNvY2tfKHNvY2spLCBzb2NrX3R5cGVfKHNvY2tfdHlwZSksIGNvbm5lY3RlZF8oZmFsc2UpLCAKKwkgIHNvY2tSZWFkZXJfKE5VTEwpCisgICAgeyAKKyAgICB9CisKKyAgICAvLyBEZXN0cm95IENQalNvY2tldAorICAgIH5DUGpTb2NrZXQoKTsKKworICAgIC8vIEdldCBhZGRyZXNzIGZhbWlseQorICAgIGludCBHZXRBZigpIGNvbnN0IAorICAgIHsKKyAgICAJcmV0dXJuIGFmXzsJCisgICAgfQorICAgIAorICAgIC8vIEdldCB0aGUgaW50ZXJuYWwgUlNvY2tldAorICAgIFJTb2NrZXQmIFNvY2tldCgpCisgICAgeworCXJldHVybiBzb2NrXzsKKyAgICB9CisKKyAgICAvLyBHZXQgc29ja2V0IGNvbm5lY3RlZCBmbGFnLgorICAgIGJvb2wgSXNDb25uZWN0ZWQoKSBjb25zdAorICAgIHsKKwlyZXR1cm4gY29ubmVjdGVkXzsKKyAgICB9CisKKyAgICAvLyBTZXQgc29ja2V0IGNvbm5lY3RlZCBmbGFnLgorICAgIHZvaWQgU2V0Q29ubmVjdGVkKGJvb2wgY29ubmVjdGVkKQorICAgIHsKKwljb25uZWN0ZWRfID0gY29ubmVjdGVkOworICAgIH0KKworICAgIC8vIEdldCBzb2NrZXQgdHlwZQorICAgIGludCBHZXRTb2NrVHlwZSgpIGNvbnN0CisgICAgeworCXJldHVybiBzb2NrX3R5cGVfOworICAgIH0KKyAgICAKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgc29ja2V0IGlzIGEgZGF0YWdyYW0KKyAgICBib29sIElzRGF0YWdyYW0oKSBjb25zdAorICAgIHsKKwlyZXR1cm4gc29ja190eXBlXyA9PSBLU29ja0RhdGFncmFtOworICAgIH0KKyAgICAKKyAgICAvLyBHZXQgc29ja2V0IHJlYWRlciwgaWYgYW55LgorICAgIC8vIE1heSByZXR1cm4gTlVMTC4KKyAgICBDUGpTb2NrZXRSZWFkZXIgKlJlYWRlcigpCisgICAgeworCXJldHVybiBzb2NrUmVhZGVyXzsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgc29ja2V0IHJlYWRlci4KKyAgICBDUGpTb2NrZXRSZWFkZXIgKkNyZWF0ZVJlYWRlcih1bnNpZ25lZCBtYXhfbGVuPUNQalNvY2tldDo6TUFYX0xFTik7CisKKyAgICAvLyBEZWxldGUgc29ja2V0IHJlYWRlciB3aGVuIGl0J3Mgbm90IHdhbnRlZC4KKyAgICB2b2lkIERlc3Ryb3lSZWFkZXIoKTsKKyAgICAKK3ByaXZhdGU6CisgICAgaW50CQkgICAgIGFmXzsKKyAgICBSU29ja2V0CSAgICAgc29ja187CSAgICAvLyBNdXN0IG5vdCBiZSByZWZlcmVuY2UsIG9yIG90aGVyd2lzZQorCQkJCSAgICAvLyBpdCBtYXkgcG9pbnQgdG8gbG9jYWwgdmFyaWFibGUhCisgICAgdW5zaWduZWQgICAJICAgICBzb2NrX3R5cGVfOworICAgIAorICAgIGJvb2wJICAgICBjb25uZWN0ZWRfOworICAgIENQalNvY2tldFJlYWRlciAqc29ja1JlYWRlcl87Cit9OworCisKKy8vCisvLyBTb2NrZXQgcmVhZGVyLCB1c2VkIGJ5IHNlbGVjdCgpIGFuZCBpb3F1ZXVlIGFic3RyYWN0aW9uCisvLworY2xhc3MgQ1BqU29ja2V0UmVhZGVyIDogcHVibGljIENBY3RpdmUKK3sKK3B1YmxpYzoKKyAgICAvLyBDb25zdHJ1Y3QuCisgICAgc3RhdGljIENQalNvY2tldFJlYWRlciAqTmV3TChDUGpTb2NrZXQgJnNvY2ssIHVuc2lnbmVkIG1heF9sZW49Q1BqU29ja2V0OjpNQVhfTEVOKTsKKworICAgIC8vIERlc3Ryb3k7CisgICAgfkNQalNvY2tldFJlYWRlcigpOworCisgICAgLy8gU3RhcnQgYXN5bmNocm9ub3VzIHJlYWQgZnJvbSB0aGUgc29ja2V0LgorICAgIHZvaWQgU3RhcnRSZWN2KHZvaWQgKCpjYikodm9pZCAqa2V5KT1OVUxMLCAKKwkJICAgdm9pZCAqa2V5PU5VTEwsIAorCQkgICBURGVzOCAqYURlc2MgPSBOVUxMLAorCQkgICBUVWludCBmbGFncyA9IDApOworCisgICAgLy8gU3RhcnQgYXN5bmNocm9ub3VzIHJlYWQgZnJvbSB0aGUgc29ja2V0LgorICAgIHZvaWQgU3RhcnRSZWN2RnJvbSh2b2lkICgqY2IpKHZvaWQgKmtleSk9TlVMTCwgCisJCSAgICAgICB2b2lkICprZXk9TlVMTCwgCisJCSAgICAgICBURGVzOCAqYURlc2MgPSBOVUxMLAorCQkgICAgICAgVFVpbnQgZmxhZ3MgPSAwLAorCQkgICAgICAgVFNvY2tBZGRyICpmcm9tQWRkciA9IE5VTEwpOworCisgICAgLy8gQ2FuY2VsIGFzeW5jaHJvbm91cyByZWFkLgorICAgIHZvaWQgRG9DYW5jZWwoKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uOiBjYWxsZWQgd2hlbiByZWFkIGhhcyBjb21wbGV0ZWQuCisgICAgdm9pZCBSdW5MKCk7CisKKyAgICAvLyBDaGVjayBpZiB0aGVyZSdzIHBlbmRpbmcgZGF0YS4KKyAgICBib29sIEhhc0RhdGEoKSBjb25zdAorICAgIHsKKwlyZXR1cm4gYnVmZmVyXy5MZW5ndGgoKSAhPSAwOworICAgIH0KKworICAgIC8vIEFwcGVuZCBkYXRhIHRvIGFEZXNjLCB1cCB0byBhRGVzYydzIG1heGltdW0gc2l6ZS4KKyAgICAvLyBJZiBzb2NrZXQgaXMgZGF0YWdyYW0gYmFzZWQsIGJ1ZmZlcl8gd2lsbCBiZSBjbGFyZWQuCisgICAgdm9pZCBSZWFkRGF0YShURGVzOCAmYURlc2MsIFRJbmV0QWRkciAqYWRkcj1OVUxMKTsKKworcHJpdmF0ZToKKyAgICBDUGpTb2NrZXQJICAgJnNvY2tfOworICAgIGJvb2wJICAgIGlzRGF0YWdyYW1fOworICAgIFRQdHI4CSAgICBidWZmZXJfOworICAgIFRJbmV0QWRkcgkgICAgcmVjdkFkZHJfOworCisgICAgdm9pZAkgICAoKnJlYWRDYl8pKHZvaWQgKmtleSk7CisgICAgdm9pZAkgICAgKmtleV87CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yCisgICAgLy8KKyAgICBDUGpTb2NrZXRSZWFkZXIoQ1BqU29ja2V0ICZzb2NrKTsKKyAgICB2b2lkIENvbnN0cnVjdEwodW5zaWduZWQgbWF4X2xlbik7Cit9OworCisKKworLy8KKy8vIFRpbWUtb3V0IFRpbWVyIEFjdGl2ZSBPYmplY3QKKy8vCitjbGFzcyBDUGpUaW1lb3V0VGltZXIgOiBwdWJsaWMgQ0FjdGl2ZQoreworcHVibGljOgorICAgIHN0YXRpYyBDUGpUaW1lb3V0VGltZXIgKk5ld0woKTsKKyAgICB+Q1BqVGltZW91dFRpbWVyKCk7CisKKyAgICB2b2lkIFN0YXJ0VGltZXIoVFVpbnQgbWlsaVNlY29uZHMpOworICAgIGJvb2wgSGFzVGltZWRPdXQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBSdW5MKCk7CisgICAgdmlydHVhbCB2b2lkIERvQ2FuY2VsKCk7CisgICAgdmlydHVhbCBUSW50IFJ1bkVycm9yKFRJbnQgYUVycm9yKTsKKworcHJpdmF0ZToKKyAgICBSVGltZXIJdGltZXJfOworICAgIHBqX2Jvb2xfdAloYXNUaW1lZE91dF87CisKKyAgICBDUGpUaW1lb3V0VGltZXIoKTsKKyAgICB2b2lkIENvbnN0cnVjdEwoKTsKK307CisKKworCisvLworLy8gU3ltYmlhbiBPUyBoZWxwZXIgZm9yIFBKTElCCisvLworY2xhc3MgUGpTeW1iaWFuT1MKK3sKK3B1YmxpYzoKKyAgICAvLworICAgIC8vIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIFBqU3ltYmlhbk9TCisgICAgLy8KKyAgICBzdGF0aWMgUGpTeW1iaWFuT1MgKkluc3RhbmNlKCk7CisKKyAgICAvLworICAgIC8vIFNldCBwYXJhbWV0ZXJzCisgICAgLy8KKyAgICB2b2lkIFNldFBhcmFtZXRlcnMocGpfc3ltYmlhbm9zX3BhcmFtcyAqcGFyYW1zKTsKKyAgICAKKyAgICAvLworICAgIC8vIEluaXRpYWxpemUuCisgICAgLy8KKyAgICBUSW50IEluaXRpYWxpemUoKTsKKworICAgIC8vCisgICAgLy8gU2h1dGRvd24uCisgICAgLy8KKyAgICB2b2lkIFNodXRkb3duKCk7CisKKworICAgIC8vCisgICAgLy8gU29ja2V0IGhlbHBlci4KKyAgICAvLworCisgICAgLy8gR2V0IFJTb2NrZXRTZXJ2IGluc3RhbmNlIHRvIGJlIHVzZWQgYnkgYWxsIHNvY2tldHMuCisgICAgUlNvY2tldFNlcnYgJlNvY2tldFNlcnYoKQorICAgIHsKKwlyZXR1cm4gYXBwU29ja2V0U2Vydl8gPyAqYXBwU29ja2V0U2Vydl8gOiBzb2NrZXRTZXJ2XzsKKyAgICB9CisKKyAgICAvLyBHZXQgUkNvbm5lY3Rpb24gaW5zdGFuY2UsIGlmIGFueS4KKyAgICBSQ29ubmVjdGlvbiAqQ29ubmVjdGlvbigpIAorICAgIHsKKyAgICAJcmV0dXJuIGFwcENvbm5lY3Rpb25fOworICAgIH0KKyAgICAKKyAgICAvLyBDb252ZXJ0IFRJbmV0QWRkciB0byBwal9zb2NrYWRkcl9pbgorICAgIHN0YXRpYyBpbmxpbmUgcGpfc3RhdHVzX3QgQWRkcjJwaihjb25zdCBUSW5ldEFkZHIgJiBzeW1fYWRkciwKKwkJCSAgICAgICAJICAgICAgcGpfc29ja2FkZHIgJnBqX2FkZHIsCisJCQkgICAgICAgCSAgICAgIGludCAqYWRkcl9sZW4sCisJCQkgICAgICAgCSAgICAgIHBqX2Jvb2xfdCBjb252ZXJ0X2lwdjRfbWFwcGVkX2FkZHIgPSBQSl9GQUxTRSkKKyAgICB7CisgICAgVFVpbnQgZmFtID0gc3ltX2FkZHIuRmFtaWx5KCk7CisJcGpfYnplcm8oJnBqX2FkZHIsICphZGRyX2xlbik7CisJaWYgKGZhbSA9PSBQSl9BRl9JTkVUIHx8IAorCQkJKGNvbnZlcnRfaXB2NF9tYXBwZWRfYWRkciAmJiAKKwkJCSBmYW0gPT0gUEpfQUZfSU5FVDYgJiYgCisJCQkgc3ltX2FkZHIuSXNWNE1hcHBlZCgpKSkgCisJeworCQlwal9hZGRyLmFkZHIuc2FfZmFtaWx5ID0gUEpfQUZfSU5FVDsKKwkgICAgUEpfQVNTRVJUX1JFVFVSTigqYWRkcl9sZW4+PShpbnQpc2l6ZW9mKHBqX3NvY2thZGRyX2luKSwgUEpfRVRPT1NNQUxMKTsKKwkgICAgcGpfYWRkci5pcHY0LnNpbl9hZGRyLnNfYWRkciA9IHBqX2h0b25sKHN5bV9hZGRyLkFkZHJlc3MoKSk7CisJICAgIHBqX2FkZHIuaXB2NC5zaW5fcG9ydCA9IHBqX2h0b25zKChwal91aW50MTZfdCkgc3ltX2FkZHIuUG9ydCgpKTsKKwkgICAgKmFkZHJfbGVuID0gc2l6ZW9mKHBqX3NvY2thZGRyX2luKTsKKwl9IGVsc2UgaWYgKGZhbSA9PSBQSl9BRl9JTkVUNikgeworCSAgICBQSl9BU1NFUlRfUkVUVVJOKCphZGRyX2xlbj49KGludClzaXplb2YocGpfc29ja2FkZHJfaW42KSwgUEpfRVRPT1NNQUxMKTsKKwkgICAgY29uc3QgVElwNkFkZHIgJiBpcDYgPSBzeW1fYWRkci5JcDZBZGRyZXNzKCk7CisJICAgIHBqX2FkZHIuYWRkci5zYV9mYW1pbHkgPSBQSl9BRl9JTkVUNjsKKwkgICAgcGpfbWVtY3B5KCZwal9hZGRyLmlwdjYuc2luNl9hZGRyLCBpcDYudS5pQWRkcjgsIDE2KTsKKwkgICAgcGpfYWRkci5pcHY2LnNpbjZfcG9ydCA9IHBqX2h0b25zKChwal91aW50MTZfdCkgc3ltX2FkZHIuUG9ydCgpKTsKKwkgICAgcGpfYWRkci5pcHY2LnNpbjZfc2NvcGVfaWQgPSBwal9odG9ubChzeW1fYWRkci5TY29wZSgpKTsKKwkgICAgcGpfYWRkci5pcHY2LnNpbjZfZmxvd2luZm8gPSBwal9odG9ubChzeW1fYWRkci5GbG93TGFiZWwoKSk7CisJICAgICphZGRyX2xlbiA9IHNpemVvZihwal9zb2NrYWRkcl9pbjYpOworCX0gZWxzZSB7CisJICAgIHBqX2Fzc2VydCghIlVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7CisJICAgIHJldHVybiBQSl9FQUZOT1RTVVA7CisJfQorCQorCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKworCisgICAgLy8gQ29udmVydCBwal9zb2NrYWRkcl9pbiB0byBUSW5ldEFkZHIKKyAgICBzdGF0aWMgaW5saW5lIHBqX3N0YXR1c190IHBqMkFkZHIoY29uc3QgcGpfc29ja2FkZHIgJnBqX2FkZHIsCisgICAgCQkJCSAgICAgIGludCBhZGRybGVuLAorCQkJICAgICAgIAkgICAgICBUSW5ldEFkZHIgJiBzeW1fYWRkcikKKyAgICB7CisgICAgCWlmIChwal9hZGRyLmFkZHIuc2FfZmFtaWx5ID09IFBKX0FGX0lORVQpIHsKKyAgICAJICAgIFBKX0FTU0VSVF9SRVRVUk4oYWRkcmxlbiA+PSAoaW50KXNpemVvZihwal9zb2NrYWRkcl9pbiksIFBKX0VJTlZBTCk7CisJICAgIHN5bV9hZGRyLkluaXQoS0FmSW5ldCk7CisgICAgCSAgICBzeW1fYWRkci5TZXRBZGRyZXNzKChUVWludDMyKXBqX250b2hsKHBqX2FkZHIuaXB2NC5zaW5fYWRkci5zX2FkZHIpKTsKKyAgICAJICAgIHN5bV9hZGRyLlNldFBvcnQocGpfbnRvaHMocGpfYWRkci5pcHY0LnNpbl9wb3J0KSk7CisgICAgCX0gZWxzZSBpZiAocGpfYWRkci5hZGRyLnNhX2ZhbWlseSA9PSBQSl9BRl9JTkVUNikgeworICAgIAkgICAgVElwNkFkZHIgaXA2OworICAgIAkKKyAgICAJICAgIFBKX0FTU0VSVF9SRVRVUk4oYWRkcmxlbj49KGludClzaXplb2YocGpfc29ja2FkZHJfaW42KSwgUEpfRUlOVkFMKTsKKyAgICAJICAgIHBqX21lbWNweShpcDYudS5pQWRkcjgsICZwal9hZGRyLmlwdjYuc2luNl9hZGRyLCAxNik7CisgICAgCSAgICBzeW1fYWRkci5Jbml0KEtBZkluZXQ2KTsKKyAgICAJICAgIHN5bV9hZGRyLlNldEFkZHJlc3MoaXA2KTsKKyAgICAJICAgIHN5bV9hZGRyLlNldFNjb3BlKHBqX250b2hsKHBqX2FkZHIuaXB2Ni5zaW42X3Njb3BlX2lkKSk7CisgICAgCSAgICBzeW1fYWRkci5TZXRGbG93TGFiZWwocGpfbnRvaGwocGpfYWRkci5pcHY2LnNpbjZfZmxvd2luZm8pKTsKKyAgICAJfSBlbHNlIHsKKyAgICAJICAgIHBqX2Fzc2VydCghIlVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7CisgICAgCX0KKyAgICAJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisKKyAgICAvLworICAgIC8vIFJlc29sdmVyIGhlbHBlcgorICAgIC8vCisKKyAgICAvLyBHZXQgUkhvc3RSZXNvbHZlciBpbnN0YW5jZQorICAgIFJIb3N0UmVzb2x2ZXIgJiBHZXRSZXNvbHZlcihpbnQgYWYpCisgICAgeworICAgIAlpZiAoYWY9PVBKX0FGX0lORVQ2KSB7CisgICAgCSAgICByZXR1cm4gYXBwSG9zdFJlc29sdmVyNl8gPyAqYXBwSG9zdFJlc29sdmVyNl8gOiBob3N0UmVzb2x2ZXI2XzsKKyAgICAJfSBlbHNlIHsKKyAgICAJICAgIHJldHVybiBhcHBIb3N0UmVzb2x2ZXJfID8gKmFwcEhvc3RSZXNvbHZlcl8gOiBob3N0UmVzb2x2ZXJfOworICAgIAl9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYWNjZXNzIHBvaW50IGNvbm5lY3Rpb24gaXMgdXAKKyAgICAvLworICAgIGJvb2wgSXNDb25uZWN0aW9uVXAoKSBjb25zdAorICAgIHsKKwlyZXR1cm4gaXNDb25uZWN0aW9uVXBfOworICAgIH0KKworICAgIC8vCisgICAgLy8gU2V0IGFjY2VzcyBwb2ludCBjb25uZWN0aW9uIHN0YXR1cworICAgIC8vCisgICAgdm9pZCBTZXRDb25uZWN0aW9uU3RhdHVzKGJvb2wgdXApCisgICAgeworCWlzQ29ubmVjdGlvblVwXyA9IHVwOworICAgIH0KKworICAgIC8vCisgICAgLy8gVW5pY29kZSBDb252ZXJ0ZXIKKyAgICAvLworCisgICAgLy8gQ29udmVydCB0byBVbmljb2RlCisgICAgVEludCBDb252ZXJ0VG9Vbmljb2RlKFREZXMxNiAmYVVuaWNvZGUsIGNvbnN0IFREZXNDOCAmYUZvcmVpZ24pOworCisgICAgLy8gQ29udmVydCBmcm9tIFVuaWNvZGUKKyAgICBUSW50IENvbnZlcnRGcm9tVW5pY29kZShURGVzOCAmYUZvcmVpZ24sIGNvbnN0IFREZXNDMTYgJmFVbmljb2RlKTsKKworICAgIC8vCisgICAgLy8gR2V0IGNvbnNvbGUKKyAgICAvLworICAgIAorICAgIC8vIEdldCBjb25zb2xlCisgICAgQ0NvbnNvbGVCYXNlICpDb25zb2xlKCkKKyAgICB7CisJcmV0dXJuIGNvbnNvbGVfOworICAgIH0KKyAgICAKKyAgICAvLworICAgIC8vIEdldCBzZWxlY3QoKSB0aW1lb3V0IHRpbWVyLgorICAgIC8vCisgICAgQ1BqVGltZW91dFRpbWVyICpTZWxlY3RUaW1lb3V0VGltZXIoKQorICAgIHsKKwlyZXR1cm4gc2VsZWN0VGltZW91dFRpbWVyXzsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFdhaXQgZm9yIGFueSBhY3RpdmUgb2JqZWN0cyB0byBydW4uCisgICAgLy8KKyAgICB2b2lkIFdhaXRGb3JBY3RpdmVPYmplY3RzKFRJbnQgYVByaW9yaXR5ID0gQ0FjdGl2ZTo6RVByaW9yaXR5U3RhbmRhcmQpCisgICAgeworCVRJbnQgYUVycm9yOworCUNBY3RpdmVTY2hlZHVsZXI6OkN1cnJlbnQoKS0+V2FpdEZvckFueVJlcXVlc3QoKTsKKwlDQWN0aXZlU2NoZWR1bGVyOjpSdW5JZlJlYWR5KGFFcnJvciwgYVByaW9yaXR5KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBpc0Nvbm5lY3Rpb25VcF87CisgICAgCisgICAgYm9vbCBpc1NvY2tldFNlcnZJbml0aWFsaXplZF87CisgICAgUlNvY2tldFNlcnYgc29ja2V0U2Vydl87CisKKyAgICBib29sIGlzUmVzb2x2ZXJJbml0aWFsaXplZF87CisgICAgUkhvc3RSZXNvbHZlciBob3N0UmVzb2x2ZXJfOworICAgIFJIb3N0UmVzb2x2ZXIgaG9zdFJlc29sdmVyNl87CisKKyAgICBDQ29uc29sZUJhc2UqIGNvbnNvbGVfOworCisgICAgQ1BqVGltZW91dFRpbWVyICpzZWxlY3RUaW1lb3V0VGltZXJfOworCisgICAgLy8gQXBwIHBhcmFtZXRlcnMKKyAgICBSU29ja2V0U2VydiAqYXBwU29ja2V0U2Vydl87CisgICAgUkNvbm5lY3Rpb24gKmFwcENvbm5lY3Rpb25fOworICAgIFJIb3N0UmVzb2x2ZXIgKmFwcEhvc3RSZXNvbHZlcl87CisgICAgUkhvc3RSZXNvbHZlciAqYXBwSG9zdFJlc29sdmVyNl87CisgICAgCitwcml2YXRlOgorICAgIFBqU3ltYmlhbk9TKCk7Cit9OworCisvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gY2hlY2sgdGhlIGFjY2VzcyBwb2ludCBjb25uZWN0aW9uIHN0YXR1cyBhbmQgcmV0dXJuCisvLyBmYWlsdXJlIGlmIHRoZSBBUCBjb25uZWN0aW9uIGlzIGRvd24gb3IgdW51c2FibGUuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbgorLy8gb2YgcGpfc3ltYmlhbm9zX3NldF9jb25uZWN0aW9uX3N0YXR1cygpIGZvciBtb3JlIGluZm8KKyNkZWZpbmUgUEpfU1lNQklBTl9DSEVDS19DT05ORUNUSU9OKCkgXAorICAgIFBKX1NZTUJJQU5fQ0hFQ0tfQ09OTkVDVElPTjIoUEpfRUNBTkNFTExFRCkKKworI2RlZmluZSBQSl9TWU1CSUFOX0NIRUNLX0NPTk5FQ1RJT04yKHJldHZhbCkgXAorICAgIGRvIHsgXAorCWlmICghUGpTeW1iaWFuT1M6Okluc3RhbmNlKCktPklzQ29ubmVjdGlvblVwKCkpIFwKKwkgICAgcmV0dXJuIHJldHZhbDsgXAorICAgIH0gd2hpbGUgKDApOworCisjZW5kaWYJLyogX19PU19TWU1CSUFOX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVfYnNkLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVfYnNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0MGM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfdGltZV9ic2QuYwpAQCAtMCwwICsxLDM2IEBACisvKiAkSWQ6IG9zX3RpbWVfYnNkLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL2NvbXBhdC90aW1lLmg+CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXR0aW1lb2ZkYXkocGpfdGltZV92YWwgKnR2KQoreworICAgIHN0cnVjdCB0aW1lYiB0YjsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBmdGltZSgmdGIpOworICAgIHR2LT5zZWMgPSB0Yi50aW1lOworICAgIHR2LT5tc2VjID0gdGIubWlsbGl0bTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc190aW1lX2NvbW1vbi5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc190aW1lX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGE3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVfY29tbW9uLmMKQEAgLTAsMCArMSw4NiBAQAorLyogJElkOiBvc190aW1lX2NvbW1vbi5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvdGltZS5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVfZGVjb2RlKGNvbnN0IHBqX3RpbWVfdmFsICp0diwgcGpfcGFyc2VkX3RpbWUgKnB0KQoreworICAgIHN0cnVjdCB0bSAqbG9jYWxfdGltZTsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBsb2NhbF90aW1lID0gbG9jYWx0aW1lKCh0aW1lX3QqKSZ0di0+c2VjKTsKKworICAgIHB0LT55ZWFyID0gbG9jYWxfdGltZS0+dG1feWVhcisxOTAwOworICAgIHB0LT5tb24gPSBsb2NhbF90aW1lLT50bV9tb247CisgICAgcHQtPmRheSA9IGxvY2FsX3RpbWUtPnRtX21kYXk7CisgICAgcHQtPmhvdXIgPSBsb2NhbF90aW1lLT50bV9ob3VyOworICAgIHB0LT5taW4gPSBsb2NhbF90aW1lLT50bV9taW47CisgICAgcHQtPnNlYyA9IGxvY2FsX3RpbWUtPnRtX3NlYzsKKyAgICBwdC0+d2RheSA9IGxvY2FsX3RpbWUtPnRtX3dkYXk7CisgICAgcHQtPm1zZWMgPSB0di0+bXNlYzsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKioKKyAqIEVuY29kZSBwYXJzZWQgdGltZSB0byB0aW1lIHZhbHVlLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVfZW5jb2RlKGNvbnN0IHBqX3BhcnNlZF90aW1lICpwdCwgcGpfdGltZV92YWwgKnR2KQoreworICAgIHN0cnVjdCB0bSBsb2NhbF90aW1lOworCisgICAgbG9jYWxfdGltZS50bV95ZWFyID0gcHQtPnllYXItMTkwMDsKKyAgICBsb2NhbF90aW1lLnRtX21vbiA9IHB0LT5tb247CisgICAgbG9jYWxfdGltZS50bV9tZGF5ID0gcHQtPmRheTsKKyAgICBsb2NhbF90aW1lLnRtX2hvdXIgPSBwdC0+aG91cjsKKyAgICBsb2NhbF90aW1lLnRtX21pbiA9IHB0LT5taW47CisgICAgbG9jYWxfdGltZS50bV9zZWMgPSBwdC0+c2VjOworICAgIGxvY2FsX3RpbWUudG1faXNkc3QgPSAwOworICAgIAorICAgIHR2LT5zZWMgPSBta3RpbWUoJmxvY2FsX3RpbWUpOworICAgIHR2LT5tc2VjID0gcHQtPm1zZWM7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoqCisgKiBDb252ZXJ0IGxvY2FsIHRpbWUgdG8gR01ULgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVfbG9jYWxfdG9fZ210KHBqX3RpbWVfdmFsICp0dikKK3sKKyAgICBQSl9VTlVTRURfQVJHKHR2KTsKKyAgICByZXR1cm4gUEpfRUJVRzsKK30KKworLyoqCisgKiBDb252ZXJ0IEdNVCB0byBsb2NhbCB0aW1lLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVfZ210X3RvX2xvY2FsKHBqX3RpbWVfdmFsICp0dikKK3sKKyAgICBQSl9VTlVTRURfQVJHKHR2KTsKKyAgICByZXR1cm4gUEpfRUJVRzsKK30KKworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVfbGludXhfa2VybmVsLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVfbGludXhfa2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3NzJhMAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfdGltZV9saW51eF9rZXJuZWwuYwpAQCAtMCwwICsxLDY2IEBACisvKiAkSWQ6IG9zX3RpbWVfbGludXhfa2VybmVsLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldHRpbWVvZmRheShwal90aW1lX3ZhbCAqdHYpCit7CisgICAgc3RydWN0IHRpbWV2YWwgdHZhbDsKKyAgCisgICAgZG9fZ2V0dGltZW9mZGF5KCZ0dmFsKTsKKyAgICB0di0+c2VjID0gdHZhbC50dl9zZWM7CisgICAgdHYtPm1zZWMgPSB0dmFsLnR2X3VzZWMgLyAxMDAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGltZV9kZWNvZGUoY29uc3QgcGpfdGltZV92YWwgKnR2LCBwal9wYXJzZWRfdGltZSAqcHQpCit7CisgICAgcHQtPnllYXIgPSAyMDA1OworICAgIHB0LT5tb24gPSA4OworICAgIHB0LT5kYXkgPSAyMDsKKyAgICBwdC0+aG91ciA9IDE2OworICAgIHB0LT5taW4gPSAzMDsKKyAgICBwdC0+c2VjID0gMzA7CisgICAgcHQtPndkYXkgPSAzOworICAgIHB0LT55ZGF5ID0gMjAwOworICAgIHB0LT5tc2VjID0gNzc3OworCisgICAgcmV0dXJuIC0xOworfQorCisvKioKKyAqIEVuY29kZSBwYXJzZWQgdGltZSB0byB0aW1lIHZhbHVlLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVfZW5jb2RlKGNvbnN0IHBqX3BhcnNlZF90aW1lICpwdCwgcGpfdGltZV92YWwgKnR2KTsKKworLyoqCisgKiBDb252ZXJ0IGxvY2FsIHRpbWUgdG8gR01ULgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVfbG9jYWxfdG9fZ210KHBqX3RpbWVfdmFsICp0dik7CisKKy8qKgorICogQ29udmVydCBHTVQgdG8gbG9jYWwgdGltZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aW1lX2dtdF90b19sb2NhbChwal90aW1lX3ZhbCAqdHYpOworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfdGltZV91bml4LmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVfdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzEzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVfdW5peC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qICRJZDogb3NfdGltZV91bml4LmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3RpbWUuaD4KKworI2lmIGRlZmluZWQoUEpfSEFTX1VOSVNURF9IKSAmJiBQSl9IQVNfVU5JU1REX0ghPTAKKyMgICAgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXR0aW1lb2ZkYXkocGpfdGltZV92YWwgKnBfdHYpCit7CisgICAgc3RydWN0IHRpbWV2YWwgdGhlX3RpbWU7CisgICAgaW50IHJjOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHJjID0gZ2V0dGltZW9mZGF5KCZ0aGVfdGltZSwgTlVMTCk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmF0aXZlX29zX2Vycm9yKCkpOworCisgICAgcF90di0+c2VjID0gdGhlX3RpbWUudHZfc2VjOworICAgIHBfdHYtPm1zZWMgPSB0aGVfdGltZS50dl91c2VjIC8gMTAwMDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc190aW1lX3dpbjMyLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVfd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTQzZTJlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc190aW1lX3dpbjMyLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qICRJZDogb3NfdGltZV93aW4zMi5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBTRUNTX1RPX0ZUX01VTFQgMTAwMDAwMDAKKworc3RhdGljIExBUkdFX0lOVEVHRVIgYmFzZV90aW1lOworCisjaWYgZGVmaW5lZChQSl9XSU4zMl9XSU5DRSkgJiYgUEpfV0lOMzJfV0lOQ0UKKyMgICBkZWZpbmUgV0lOQ0VfVElNRQorI2VuZGlmCisKKyNpZmRlZiBXSU5DRV9USU1FCisvKiBOb3RlOgorICogIEluIFdpbmRvd3MgQ0UvV2luZG93cyBNb2JpbGUgcGxhdGZvcm1zLCB0aGUgYXZhaWxhYmlsaXR5IG9mIG1pbGxpc2Vjb25kcworICogIHRpbWUgcmVzb2x1dGlvbiBpbiBTWVNURU1USU1FLndNaWxsaXNlY29uZHMgZGVwZW5kcyBvbiB0aGUgT0VNLCBhbmQgbW9zdAorICogIGxpa2VseSBpdCB3b24ndCBiZSBhdmFpbGFibGUuIFdoZW4gaXQncyBub3QgYXZhaWxhYmxlLCB0aGUgCisgKiAgU1lTVEVNVElNRS53TWlsbGlzZWNvbmRzIHdpbGwgY29udGFpbiBhIGNvbnN0YW50IGFyYml0cmFyeSB2YWx1ZS4KKyAqCisgKiAgQmVjYXVzZSBvZiB0aGF0LCB3ZSBuZWVkIHRvIGVtdWxhdGUgdGhlIG1pbGxpc2Vjb25kcyB0aW1lIHJlc29sdXRpb24KKyAqICB1c2luZyBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigpICh2aWEgcGpfZ2V0X3RpbWVzdGFtcCgpIEFQSSkuIEhvd2V2ZXIgCisgKiAgdGhlcmUgaXMgbGltaXRhdGlvbiBvbiB1c2luZyB0aGlzLCBpLmUuIHRoZSB0aW1lIHJldHVybmVkIGJ5IAorICogIHBqX2dldHRpbWVvZmRheSgpIG1heSBiZSBvZmYgYnkgdXAgdG8gcGx1cy9taW51cyA5OTkgbXNlYyAodGhlIHNlY29uZAorICogIHBhcnQgd2lsbCBiZSBjb3JyZWN0LCBob3dldmVyIHRoZSBtc2VjIHBhcnQgbWF5IGJlIG9mZiksIGJlY2F1c2Ugd2UncmUgCisgKiAgbm90IHN5bmNocm9uaXppbmcgdGhlIG1zZWMgZmllbGQgd2l0aCB0aGUgY2hhbmdlIG9mIHZhbHVlIG9mIHRoZSAic2Vjb25kIgorICogIGZpZWxkIG9mIHRoZSBzeXN0ZW0gdGltZS4KKyAqCisgKiAgQWxzbyB0aGVyZSBpcyBvdGhlciBjYXZlYXQgd2hpY2ggbmVlZCB0byBiZSBoYW5kbGVkIChhbmQgdGhleSBhcmUgCisgKiAgaGFuZGxlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uKToKKyAqICAgLSB1c2VyIG1heSBjaGFuZ2Ugc3lzdGVtIHRpbWUsIHNvIHBqX2dldHRpbWVvZmRheSgpIG5lZWRzIHRvIHBlcmlvZGljYWxseQorICogICAgIGNoZWNrcyBpZiBzeXN0ZW0gdGltZSBoYXMgY2hhbmdlZC4gVGhlIHBlcmlvZCBvbiB3aGljaCBzeXN0ZW0gdGltZSBpcworICogICAgIGNoZWNrZWQgaXMgY29udHJvbGxlZCBieSBQSl9XSU5DRV9USU1FX0NIRUNLX0lOVEVSVkFMIG1hY3JvLgorICovCitzdGF0aWMgTEFSR0VfSU5URUdFUiBnX3N0YXJ0X3RpbWU7ICAvKiBUaW1lIGdldHRpbWVvZmRheSgpIGlzIGZpcnN0IGNhbGxlZCAgKi8KK3N0YXRpYyBwal90aW1lc3RhbXAgIGdfc3RhcnRfdGljazsgIC8qIFRTIGdldHRpbWVvZmRheSgpIGlzIGZpcnN0IGNhbGxlZCAgKi8KK3N0YXRpYyBwal90aW1lc3RhbXAgIGdfbGFzdF91cGRhdGU7IC8qIExhc3QgdGltZSBjaGVja19zeXN0ZW1fdGltZSgpIGlzIAorCQkJCSAgICAgICBjYWxsZWQsIHRvIHBlcmlvZGljYWxseSBzeW5jaHJvbml6ZQorCQkJCSAgICAgICB3aXRoIHVwLXRvLWRhdGUgc3lzdGVtIHRpbWUgKGluIGNhc2UKKwkJCQkgICAgICAgdXNlciBjaGFuZ2VzIHN5c3RlbSB0aW1lKS4JICAgICovCitzdGF0aWMgcGpfdWludDY0X3QgICBnX3VwZGF0ZV9wZXJpb2Q7IC8qIFBlcmlvZCAoaW4gVFMpIGNoZWNrX3N5c3RlbV90aW1lKCkKKwkJCQkgICAgICAgICBzaG91bGQgYmUgY2FsbGVkLgkJICAgICovCisKKy8qIFBlcmlvZCBvbiB3aGljaCBjaGVja19zeXN0ZW1fdGltZSgpIGlzIGNhbGxlZCwgaW4gc2Vjb25kcwkJICAgICovCisjaWZuZGVmIFBKX1dJTkNFX1RJTUVfQ0hFQ0tfSU5URVJWQUwKKyMgICBkZWZpbmUgUEpfV0lOQ0VfVElNRV9DSEVDS19JTlRFUlZBTCAoMTApCisjZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBXSU5DRV9USU1FCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9zdGFydF90aW1lKHZvaWQpCit7CisgICAgU1lTVEVNVElNRSBzdDsKKyAgICBGSUxFVElNRSBmdDsKKyAgICBwal90aW1lc3RhbXAgZnJlcTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBHZXRMb2NhbFRpbWUoJnN0KTsKKyAgICBTeXN0ZW1UaW1lVG9GaWxlVGltZSgmc3QsICZmdCk7CisKKyAgICBnX3N0YXJ0X3RpbWUuTG93UGFydCA9IGZ0LmR3TG93RGF0ZVRpbWU7CisgICAgZ19zdGFydF90aW1lLkhpZ2hQYXJ0ID0gZnQuZHdIaWdoRGF0ZVRpbWU7CisgICAgZ19zdGFydF90aW1lLlF1YWRQYXJ0IC89IFNFQ1NfVE9fRlRfTVVMVDsKKyAgICBnX3N0YXJ0X3RpbWUuUXVhZFBhcnQgLT0gYmFzZV90aW1lLlF1YWRQYXJ0OworCisgICAgc3RhdHVzID0gcGpfZ2V0X3RpbWVzdGFtcCgmZ19zdGFydF90aWNrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgIGdfbGFzdF91cGRhdGUudTY0ID0gZ19zdGFydF90aWNrLnU2NDsKKworICAgIHN0YXR1cyA9IHBqX2dldF90aW1lc3RhbXBfZnJlcSgmZnJlcSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICBnX3VwZGF0ZV9wZXJpb2QgPSBQSl9XSU5DRV9USU1FX0NIRUNLX0lOVEVSVkFMICogZnJlcS51NjQ7CisKKyAgICBQSl9MT0coNCwoIm9zX3RpbWVfd2luMzIuYyIsICJXaW5DRSB0aW1lIChyZSlzdGFydGVkIikpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBwal9zdGF0dXNfdCBjaGVja19zeXN0ZW1fdGltZShwal91aW50NjRfdCB0c19lbGFwc2VkKQoreworICAgIGVudW0geyBNSVMgPSA1IH07CisgICAgU1lTVEVNVElNRSBzdDsKKyAgICBGSUxFVElNRSBmdDsKKyAgICBMQVJHRV9JTlRFR0VSIGN1ciwgY2FsYzsKKyAgICBEV09SRCBkaWZmOworICAgIHBqX3RpbWVzdGFtcCBmcmVxOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIEdldCBzeXN0ZW0ncyBjdXJyZW50IHRpbWUgKi8KKyAgICBHZXRMb2NhbFRpbWUoJnN0KTsKKyAgICBTeXN0ZW1UaW1lVG9GaWxlVGltZSgmc3QsICZmdCk7CisgICAgCisgICAgY3VyLkxvd1BhcnQgPSBmdC5kd0xvd0RhdGVUaW1lOworICAgIGN1ci5IaWdoUGFydCA9IGZ0LmR3SGlnaERhdGVUaW1lOworICAgIGN1ci5RdWFkUGFydCAvPSBTRUNTX1RPX0ZUX01VTFQ7CisgICAgY3VyLlF1YWRQYXJ0IC09IGJhc2VfdGltZS5RdWFkUGFydDsKKworICAgIC8qIEdldCBvdXIgY2FsY3VsYXRlZCBzeXN0ZW0gdGltZSAqLworICAgIHN0YXR1cyA9IHBqX2dldF90aW1lc3RhbXBfZnJlcSgmZnJlcSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICBjYWxjLlF1YWRQYXJ0ID0gZ19zdGFydF90aW1lLlF1YWRQYXJ0ICsgdHNfZWxhcHNlZCAvIGZyZXEudTY0OworCisgICAgLyogU2VlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY2FsY3VsYXRlZCBhbmQgYWN0dWFsIHN5c3RlbSB0aW1lICovCisgICAgaWYgKGNhbGMuUXVhZFBhcnQgPj0gY3VyLlF1YWRQYXJ0KSB7CisJZGlmZiA9IChEV09SRCkoY2FsYy5RdWFkUGFydCAtIGN1ci5RdWFkUGFydCk7CisgICAgfSBlbHNlIHsKKwlkaWZmID0gKERXT1JEKShjdXIuUXVhZFBhcnQgLSBjYWxjLlF1YWRQYXJ0KTsKKyAgICB9CisKKyAgICBpZiAoZGlmZiA+IE1JUykgeworCS8qIFN5c3RlbSB0aW1lIGhhcyBjaGFuZ2VkICovCisJUEpfTE9HKDMsKCJvc190aW1lX3dpbjMyLmMiLCAiV2luQ0Ugc3lzdGVtIHRpbWUgY2hhbmdlZCBkZXRlY3RlZCAiCisJCQkJICAgICAgIihkaWZmPSV1KSIsIGRpZmYpKTsKKwlzdGF0dXMgPSBpbml0X3N0YXJ0X3RpbWUoKTsKKyAgICB9IGVsc2UgeworCXN0YXR1cyA9IFBKX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmCisKKy8vIEZpbmQgMXN0IEphbiAxOTcwIGFzIGEgRklMRVRJTUUgCitzdGF0aWMgcGpfc3RhdHVzX3QgZ2V0X2Jhc2VfdGltZSh2b2lkKQoreworICAgIFNZU1RFTVRJTUUgc3Q7CisgICAgRklMRVRJTUUgZnQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworICAgIG1lbXNldCgmc3QsMCxzaXplb2Yoc3QpKTsKKyAgICBzdC53WWVhcj0xOTcwOworICAgIHN0LndNb250aD0xOworICAgIHN0LndEYXk9MTsKKyAgICBTeXN0ZW1UaW1lVG9GaWxlVGltZSgmc3QsICZmdCk7CisgICAgCisgICAgYmFzZV90aW1lLkxvd1BhcnQgPSBmdC5kd0xvd0RhdGVUaW1lOworICAgIGJhc2VfdGltZS5IaWdoUGFydCA9IGZ0LmR3SGlnaERhdGVUaW1lOworICAgIGJhc2VfdGltZS5RdWFkUGFydCAvPSBTRUNTX1RPX0ZUX01VTFQ7CisKKyNpZmRlZiBXSU5DRV9USU1FCisgICAgcGpfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigpOworICAgIHN0YXR1cyA9IGluaXRfc3RhcnRfdGltZSgpOworICAgIHBqX2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXR0aW1lb2ZkYXkocGpfdGltZV92YWwgKnR2KQoreworI2lmZGVmIFdJTkNFX1RJTUUKKyAgICBwal90aW1lc3RhbXAgdGljazsKKyAgICBwal91aW50NjRfdCBtc2VjX2VsYXBzZWQ7CisjZWxzZQorICAgIFNZU1RFTVRJTUUgc3Q7CisgICAgRklMRVRJTUUgZnQ7CisgICAgTEFSR0VfSU5URUdFUiBsaTsKKyNlbmRpZgorICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChiYXNlX3RpbWUuUXVhZFBhcnQgPT0gMCkgeworCXN0YXR1cyA9IGdldF9iYXNlX3RpbWUoKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisjaWZkZWYgV0lOQ0VfVElNRQorICAgIGRvIHsKKwlzdGF0dXMgPSBwal9nZXRfdGltZXN0YW1wKCZ0aWNrKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybiBzdGF0dXM7CisKKwlpZiAodGljay51NjQgLSBnX2xhc3RfdXBkYXRlLnU2NCA+PSBnX3VwZGF0ZV9wZXJpb2QpIHsKKwkgICAgcGpfZW50ZXJfY3JpdGljYWxfc2VjdGlvbigpOworCSAgICBpZiAodGljay51NjQgLSBnX2xhc3RfdXBkYXRlLnU2NCA+PSBnX3VwZGF0ZV9wZXJpb2QpIHsKKwkJZ19sYXN0X3VwZGF0ZS51NjQgPSB0aWNrLnU2NDsKKwkJY2hlY2tfc3lzdGVtX3RpbWUodGljay51NjQgLSBnX3N0YXJ0X3RpY2sudTY0KTsKKwkgICAgfQorCSAgICBwal9sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKCk7CisJfSBlbHNlIHsKKwkgICAgYnJlYWs7CisJfQorICAgIH0gd2hpbGUgKDEpOworCisgICAgbXNlY19lbGFwc2VkID0gcGpfZWxhcHNlZF9tc2VjNjQoJmdfc3RhcnRfdGljaywgJnRpY2spOworCisgICAgdHYtPnNlYyA9IChsb25nKShnX3N0YXJ0X3RpbWUuUXVhZFBhcnQgKyBtc2VjX2VsYXBzZWQvMTAwMCk7CisgICAgdHYtPm1zZWMgPSAobG9uZykobXNlY19lbGFwc2VkICUgMTAwMCk7CisjZWxzZQorICAgIC8qIFN0YW5kYXJkIFdpbjMyIEdldExvY2FsVGltZSAqLworICAgIEdldExvY2FsVGltZSgmc3QpOworICAgIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKCZzdCwgJmZ0KTsKKworICAgIGxpLkxvd1BhcnQgPSBmdC5kd0xvd0RhdGVUaW1lOworICAgIGxpLkhpZ2hQYXJ0ID0gZnQuZHdIaWdoRGF0ZVRpbWU7CisgICAgbGkuUXVhZFBhcnQgLz0gU0VDU19UT19GVF9NVUxUOworICAgIGxpLlF1YWRQYXJ0IC09IGJhc2VfdGltZS5RdWFkUGFydDsKKworICAgIHR2LT5zZWMgPSBsaS5Mb3dQYXJ0OworICAgIHR2LT5tc2VjID0gc3Qud01pbGxpc2Vjb25kczsKKyNlbmRpZgkvKiBXSU5DRV9USU1FICovCisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal90aW1lX2RlY29kZShjb25zdCBwal90aW1lX3ZhbCAqdHYsIHBqX3BhcnNlZF90aW1lICpwdCkKK3sKKyAgICBMQVJHRV9JTlRFR0VSIGxpOworICAgIEZJTEVUSU1FIGZ0OworICAgIFNZU1RFTVRJTUUgc3Q7CisKKyAgICBsaS5RdWFkUGFydCA9IHR2LT5zZWM7CisgICAgbGkuUXVhZFBhcnQgKz0gYmFzZV90aW1lLlF1YWRQYXJ0OworICAgIGxpLlF1YWRQYXJ0ICo9IFNFQ1NfVE9fRlRfTVVMVDsKKworICAgIGZ0LmR3TG93RGF0ZVRpbWUgPSBsaS5Mb3dQYXJ0OworICAgIGZ0LmR3SGlnaERhdGVUaW1lID0gbGkuSGlnaFBhcnQ7CisgICAgRmlsZVRpbWVUb1N5c3RlbVRpbWUoJmZ0LCAmc3QpOworCisgICAgcHQtPnllYXIgPSBzdC53WWVhcjsKKyAgICBwdC0+bW9uID0gc3Qud01vbnRoLTE7CisgICAgcHQtPmRheSA9IHN0LndEYXk7CisgICAgcHQtPndkYXkgPSBzdC53RGF5T2ZXZWVrOworCisgICAgcHQtPmhvdXIgPSBzdC53SG91cjsKKyAgICBwdC0+bWluID0gc3Qud01pbnV0ZTsKKyAgICBwdC0+c2VjID0gc3Qud1NlY29uZDsKKyAgICBwdC0+bXNlYyA9IHR2LT5tc2VjOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qKgorICogRW5jb2RlIHBhcnNlZCB0aW1lIHRvIHRpbWUgdmFsdWUuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGltZV9lbmNvZGUoY29uc3QgcGpfcGFyc2VkX3RpbWUgKnB0LCBwal90aW1lX3ZhbCAqdHYpCit7CisgICAgU1lTVEVNVElNRSBzdDsKKyAgICBGSUxFVElNRSBmdDsKKyAgICBMQVJHRV9JTlRFR0VSIGxpOworCisgICAgcGpfYnplcm8oJnN0LCBzaXplb2Yoc3QpKTsKKyAgICBzdC53WWVhciA9IChwal91aW50MTZfdCkgcHQtPnllYXI7CisgICAgc3Qud01vbnRoID0gKHBqX3VpbnQxNl90KSAocHQtPm1vbiArIDEpOworICAgIHN0LndEYXkgPSAocGpfdWludDE2X3QpIHB0LT5kYXk7CisgICAgc3Qud0hvdXIgPSAocGpfdWludDE2X3QpIHB0LT5ob3VyOworICAgIHN0LndNaW51dGUgPSAocGpfdWludDE2X3QpIHB0LT5taW47CisgICAgc3Qud1NlY29uZCA9IChwal91aW50MTZfdCkgcHQtPnNlYzsKKyAgICBzdC53TWlsbGlzZWNvbmRzID0gKHBqX3VpbnQxNl90KSBwdC0+bXNlYzsKKyAgICAKKyAgICBTeXN0ZW1UaW1lVG9GaWxlVGltZSgmc3QsICZmdCk7CisKKyAgICBsaS5Mb3dQYXJ0ID0gZnQuZHdMb3dEYXRlVGltZTsKKyAgICBsaS5IaWdoUGFydCA9IGZ0LmR3SGlnaERhdGVUaW1lOworICAgIGxpLlF1YWRQYXJ0IC89IFNFQ1NfVE9fRlRfTVVMVDsKKyAgICBsaS5RdWFkUGFydCAtPSBiYXNlX3RpbWUuUXVhZFBhcnQ7CisKKyAgICB0di0+c2VjID0gbGkuTG93UGFydDsKKyAgICB0di0+bXNlYyA9IHN0LndNaWxsaXNlY29uZHM7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoqCisgKiBDb252ZXJ0IGxvY2FsIHRpbWUgdG8gR01ULgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVfbG9jYWxfdG9fZ210KHBqX3RpbWVfdmFsICp0dik7CisKKy8qKgorICogQ29udmVydCBHTVQgdG8gbG9jYWwgdGltZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aW1lX2dtdF90b19sb2NhbChwal90aW1lX3ZhbCAqdHYpOworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfdGltZXN0YW1wX2NvbW1vbi5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc190aW1lc3RhbXBfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1ZTQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfdGltZXN0YW1wX2NvbW1vbi5jCkBAIC0wLDAgKzEsMjA2IEBACisvKiAkSWQ6IG9zX3RpbWVzdGFtcF9jb21tb24uYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L2hpZ2hfcHJlY2lzaW9uLmg+CisKKyNpZiBkZWZpbmVkKFBKX0hBU19ISUdIX1JFU19USU1FUikgJiYgUEpfSEFTX0hJR0hfUkVTX1RJTUVSICE9IDAKKworI2RlZmluZSBVMzJNQVggICgweEZGRkZGRkZGVUwpCisjZGVmaW5lIE5BTk9TRUMgKDEwMDAwMDAwMDBVTCkKKyNkZWZpbmUgVVNFQyAgICAoMTAwMDAwMFVMKQorI2RlZmluZSBNU0VDICAgICgxMDAwKQorCisjZGVmaW5lIHU2NHRvaGlnaHByZWModTY0KQkoKHBqX2hpZ2hwcmVjX3QpKChwal9pbnQ2NF90KSh1NjQpKSkKKworc3RhdGljIHBqX2hpZ2hwcmVjX3QgZ2V0X2VsYXBzZWQoIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfdGltZXN0YW1wICpzdG9wICkKK3sKKyNpZiBkZWZpbmVkKFBKX0hBU19JTlQ2NCkgJiYgUEpfSEFTX0lOVDY0IT0wCisgICAgcmV0dXJuIHU2NHRvaGlnaHByZWMoc3RvcC0+dTY0IC0gc3RhcnQtPnU2NCk7CisjZWxzZQorICAgIHBqX2hpZ2hwcmVjX3QgZWxhcHNlZF9oaSwgZWxhcHNlZF9sbzsKKworICAgIGVsYXBzZWRfaGkgPSBzdG9wLT51MzIuaGkgLSBzdGFydC0+dTMyLmhpOworICAgIGVsYXBzZWRfbG8gPSBzdG9wLT51MzIubG8gLSBzdGFydC0+dTMyLmxvOworCisgICAgLyogZWxhcHNlZF9oaSA9IGVsYXBzZWRfaGkgKiBVMzJNQVggKi8KKyAgICBwal9oaWdocHJlY19tdWwoZWxhcHNlZF9oaSwgVTMyTUFYKTsKKworICAgIHJldHVybiBlbGFwc2VkX2hpICsgZWxhcHNlZF9sbzsKKyNlbmRpZgorfQorCitzdGF0aWMgcGpfaGlnaHByZWNfdCBlbGFwc2VkX21zZWMoIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RvcCApCit7CisgICAgcGpfdGltZXN0YW1wIHRzX2ZyZXE7CisgICAgcGpfaGlnaHByZWNfdCBmcmVxLCBlbGFwc2VkOworCisgICAgaWYgKHBqX2dldF90aW1lc3RhbXBfZnJlcSgmdHNfZnJlcSkgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBDb252ZXJ0IGZyZXF1ZW5jeSB0aW1lc3RhbXAgKi8KKyNpZiBkZWZpbmVkKFBKX0hBU19JTlQ2NCkgJiYgUEpfSEFTX0lOVDY0IT0wCisgICAgZnJlcSA9IHU2NHRvaGlnaHByZWModHNfZnJlcS51NjQpOworI2Vsc2UKKyAgICBmcmVxID0gdHNfZnJlcS51MzIuaGk7CisgICAgcGpfaGlnaHByZWNfbXVsKGZyZXEsIFUzMk1BWCk7CisgICAgZnJlcSArPSB0c19mcmVxLnUzMi5sbzsKKyNlbmRpZgorCisgICAgLyogQXZvaWQgZGl2aXNpb24gYnkgemVyby4gKi8KKyAgICBpZiAoZnJlcSA9PSAwKSBmcmVxID0gMTsKKworICAgIC8qIEdldCBlbGFwc2VkIHRpbWUgaW4gY3ljbGVzLiAqLworICAgIGVsYXBzZWQgPSBnZXRfZWxhcHNlZChzdGFydCwgc3RvcCk7CisKKyAgICAvKiB1c2VjID0gZWxhcHNlZCAqIE1TRUMgLyBmcmVxICovCisgICAgcGpfaGlnaHByZWNfbXVsKGVsYXBzZWQsIE1TRUMpOworICAgIHBqX2hpZ2hwcmVjX2RpdihlbGFwc2VkLCBmcmVxKTsKKworICAgIHJldHVybiBlbGFwc2VkOworfQorCitzdGF0aWMgcGpfaGlnaHByZWNfdCBlbGFwc2VkX3VzZWMoIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RvcCApCit7CisgICAgcGpfdGltZXN0YW1wIHRzX2ZyZXE7CisgICAgcGpfaGlnaHByZWNfdCBmcmVxLCBlbGFwc2VkOworCisgICAgaWYgKHBqX2dldF90aW1lc3RhbXBfZnJlcSgmdHNfZnJlcSkgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBDb252ZXJ0IGZyZXF1ZW5jeSB0aW1lc3RhbXAgKi8KKyNpZiBkZWZpbmVkKFBKX0hBU19JTlQ2NCkgJiYgUEpfSEFTX0lOVDY0IT0wCisgICAgZnJlcSA9IHU2NHRvaGlnaHByZWModHNfZnJlcS51NjQpOworI2Vsc2UKKyAgICBmcmVxID0gdHNfZnJlcS51MzIuaGk7CisgICAgcGpfaGlnaHByZWNfbXVsKGZyZXEsIFUzMk1BWCk7CisgICAgZnJlcSArPSB0c19mcmVxLnUzMi5sbzsKKyNlbmRpZgorCisgICAgLyogQXZvaWQgZGl2aXNpb24gYnkgemVyby4gKi8KKyAgICBpZiAoZnJlcSA9PSAwKSBmcmVxID0gMTsKKworICAgIC8qIEdldCBlbGFwc2VkIHRpbWUgaW4gY3ljbGVzLiAqLworICAgIGVsYXBzZWQgPSBnZXRfZWxhcHNlZChzdGFydCwgc3RvcCk7CisKKyAgICAvKiB1c2VjID0gZWxhcHNlZCAqIFVTRUMgLyBmcmVxICovCisgICAgcGpfaGlnaHByZWNfbXVsKGVsYXBzZWQsIFVTRUMpOworICAgIHBqX2hpZ2hwcmVjX2RpdihlbGFwc2VkLCBmcmVxKTsKKworICAgIHJldHVybiBlbGFwc2VkOworfQorCitQSl9ERUYocGpfdWludDMyX3QpIHBqX2VsYXBzZWRfbmFub3NlYyggY29uc3QgcGpfdGltZXN0YW1wICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal90aW1lc3RhbXAgKnN0b3AgKQoreworICAgIHBqX3RpbWVzdGFtcCB0c19mcmVxOworICAgIHBqX2hpZ2hwcmVjX3QgZnJlcSwgZWxhcHNlZDsKKworICAgIGlmIChwal9nZXRfdGltZXN0YW1wX2ZyZXEoJnRzX2ZyZXEpICE9IFBKX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogQ29udmVydCBmcmVxdWVuY3kgdGltZXN0YW1wICovCisjaWYgZGVmaW5lZChQSl9IQVNfSU5UNjQpICYmIFBKX0hBU19JTlQ2NCE9MAorICAgIGZyZXEgPSB1NjR0b2hpZ2hwcmVjKHRzX2ZyZXEudTY0KTsKKyNlbHNlCisgICAgZnJlcSA9IHRzX2ZyZXEudTMyLmhpOworICAgIHBqX2hpZ2hwcmVjX211bChmcmVxLCBVMzJNQVgpOworICAgIGZyZXEgKz0gdHNfZnJlcS51MzIubG87CisjZW5kaWYKKworICAgIC8qIEF2b2lkIGRpdmlzaW9uIGJ5IHplcm8uICovCisgICAgaWYgKGZyZXEgPT0gMCkgZnJlcSA9IDE7CisKKyAgICAvKiBHZXQgZWxhcHNlZCB0aW1lIGluIGN5Y2xlcy4gKi8KKyAgICBlbGFwc2VkID0gZ2V0X2VsYXBzZWQoc3RhcnQsIHN0b3ApOworCisgICAgLyogdXNlYyA9IGVsYXBzZWQgKiBVU0VDIC8gZnJlcSAqLworICAgIHBqX2hpZ2hwcmVjX211bChlbGFwc2VkLCBOQU5PU0VDKTsKKyAgICBwal9oaWdocHJlY19kaXYoZWxhcHNlZCwgZnJlcSk7CisKKyAgICByZXR1cm4gKHBqX3VpbnQzMl90KWVsYXBzZWQ7Cit9CisKK1BKX0RFRihwal91aW50MzJfdCkgcGpfZWxhcHNlZF91c2VjKCBjb25zdCBwal90aW1lc3RhbXAgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RvcCApCit7CisgICAgcmV0dXJuIChwal91aW50MzJfdCllbGFwc2VkX3VzZWMoc3RhcnQsIHN0b3ApOworfQorCitQSl9ERUYocGpfdWludDMyX3QpIHBqX2VsYXBzZWRfbXNlYyggY29uc3QgcGpfdGltZXN0YW1wICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal90aW1lc3RhbXAgKnN0b3AgKQoreworICAgIHJldHVybiAocGpfdWludDMyX3QpZWxhcHNlZF9tc2VjKHN0YXJ0LCBzdG9wKTsKK30KKworUEpfREVGKHBqX3VpbnQ2NF90KSBwal9lbGFwc2VkX21zZWM2NChjb25zdCBwal90aW1lc3RhbXAgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal90aW1lc3RhbXAgKnN0b3AgKQoreworICAgIHJldHVybiAocGpfdWludDY0X3QpZWxhcHNlZF9tc2VjKHN0YXJ0LCBzdG9wKTsKK30KKworUEpfREVGKHBqX3RpbWVfdmFsKSBwal9lbGFwc2VkX3RpbWUoIGNvbnN0IHBqX3RpbWVzdGFtcCAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfdGltZXN0YW1wICpzdG9wICkKK3sKKyAgICBwal9oaWdocHJlY190IGVsYXBzZWQgPSBlbGFwc2VkX21zZWMoc3RhcnQsIHN0b3ApOworICAgIHBqX3RpbWVfdmFsIHR2X2VsYXBzZWQ7CisKKyAgICBpZiAoUEpfSElHSFBSRUNfVkFMVUVfSVNfWkVSTyhlbGFwc2VkKSkgeworICAgICAgICB0dl9lbGFwc2VkLnNlYyA9IHR2X2VsYXBzZWQubXNlYyA9IDA7CisgICAgICAgIHJldHVybiB0dl9lbGFwc2VkOworICAgIH0gZWxzZSB7CisgICAgICAgIHBqX2hpZ2hwcmVjX3Qgc2VjLCBtc2VjOworCisgICAgICAgIHNlYyA9IGVsYXBzZWQ7CisgICAgICAgIHBqX2hpZ2hwcmVjX2RpdihzZWMsIE1TRUMpOworICAgICAgICB0dl9lbGFwc2VkLnNlYyA9IChsb25nKXNlYzsKKworICAgICAgICBtc2VjID0gZWxhcHNlZDsKKyAgICAgICAgcGpfaGlnaHByZWNfbW9kKG1zZWMsIE1TRUMpOworICAgICAgICB0dl9lbGFwc2VkLm1zZWMgPSAobG9uZyltc2VjOworCisgICAgICAgIHJldHVybiB0dl9lbGFwc2VkOworICAgIH0KK30KKworUEpfREVGKHBqX3VpbnQzMl90KSBwal9lbGFwc2VkX2N5Y2xlKCBjb25zdCBwal90aW1lc3RhbXAgKnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal90aW1lc3RhbXAgKnN0b3AgKQoreworICAgIHJldHVybiBzdG9wLT51MzIubG8gLSBzdGFydC0+dTMyLmxvOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldHRpY2tjb3VudChwal90aW1lX3ZhbCAqdHYpCit7CisgICAgcGpfdGltZXN0YW1wIHRzLCBzdGFydDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoKHN0YXR1cyA9IHBqX2dldF90aW1lc3RhbXAoJnRzKSkgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKworICAgIHBqX3NldF90aW1lc3RhbXAzMigmc3RhcnQsIDAsIDApOworICAgICp0diA9IHBqX2VsYXBzZWRfdGltZSgmc3RhcnQsICZ0cyk7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworI2VuZGlmICAvKiBQSl9IQVNfSElHSF9SRVNfVElNRVIgKi8KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc190aW1lc3RhbXBfbGludXhfa2VybmVsLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVzdGFtcF9saW51eF9rZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDYwOWVhCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc190aW1lc3RhbXBfbGludXhfa2VybmVsLmMKQEAgLTAsMCArMSw3OSBAQAorLyogJElkOiBvc190aW1lc3RhbXBfbGludXhfa2VybmVsLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2lmIDAKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X3RpbWVzdGFtcChwal90aW1lc3RhbXAgKnRzKQoreworICAgIHRzLT51MzIuaGkgPSAwOworICAgIHRzLT51MzIubG8gPSBqaWZmaWVzOworICAgIHJldHVybiAwOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldF90aW1lc3RhbXBfZnJlcShwal90aW1lc3RhbXAgKmZyZXEpCit7CisgICAgZnJlcS0+dTMyLmhpID0gMDsKKyAgICBmcmVxLT51MzIubG8gPSBIWjsKKyAgICByZXR1cm4gMDsKK30KKyNlbGlmIDAKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X3RpbWVzdGFtcChwal90aW1lc3RhbXAgKnRzKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0djsKKyAgICAKKyAgICB0diA9IENVUlJFTlRfVElNRTsKKworICAgIHRzLT51NjQgPSB0di50dl9zZWM7CisgICAgdHMtPnU2NCAqPSBOU0VDX1BFUl9TRUM7CisgICAgdHMtPnU2NCArPSB0di50dl9uc2VjOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X3RpbWVzdGFtcF9mcmVxKHBqX3RpbWVzdGFtcCAqZnJlcSkKK3sKKyAgICBmcmVxLT51MzIuaGkgPSAwOworICAgIGZyZXEtPnUzMi5sbyA9IE5TRUNfUEVSX1NFQzsKKyAgICByZXR1cm4gMDsKK30KKyNlbHNlCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldF90aW1lc3RhbXAocGpfdGltZXN0YW1wICp0cykKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAKKyAgICBkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKworICAgIHRzLT51NjQgPSB0di50dl9zZWM7CisgICAgdHMtPnU2NCAqPSBVU0VDX1BFUl9TRUM7CisgICAgdHMtPnU2NCArPSB0di50dl91c2VjOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X3RpbWVzdGFtcF9mcmVxKHBqX3RpbWVzdGFtcCAqZnJlcSkKK3sKKyAgICBmcmVxLT51MzIuaGkgPSAwOworICAgIGZyZXEtPnUzMi5sbyA9IFVTRUNfUEVSX1NFQzsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfdGltZXN0YW1wX3Bvc2l4LmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVzdGFtcF9wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTU4OWMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL29zX3RpbWVzdGFtcF9wb3NpeC5jCkBAIC0wLDAgKzEsMjIwIEBACisvKiAkSWQ6IG9zX3RpbWVzdGFtcF9wb3NpeC5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmIGRlZmluZWQoUEpfSEFTX1VOSVNURF9IKSAmJiBQSl9IQVNfVU5JU1REX0ggIT0gMAorIyAgIGluY2x1ZGUgPHVuaXN0ZC5oPgorCisjICAgaWYgZGVmaW5lZChfUE9TSVhfVElNRVJTKSAmJiBfUE9TSVhfVElNRVJTID4gMCAmJiBcCisgICAgICAgZGVmaW5lZChfUE9TSVhfTU9OT1RPTklDX0NMT0NLKQorIyAgICAgICBkZWZpbmUgVVNFX1BPU0lYX1RJTUVSUyAxCisjICAgZW5kaWYKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBKX0hBU19QRU5USVVNKSAmJiBQSl9IQVNfUEVOVElVTSE9MCAmJiBcCisgICAgZGVmaW5lZChQSl9USU1FU1RBTVBfVVNFX1JEVFNDKSAmJiBQSl9USU1FU1RBTVBfVVNFX1JEVFNDIT0wICYmIFwKKyAgICBkZWZpbmVkKFBKX01fSTM4NikgJiYgUEpfTV9JMzg2IT0wICYmIFwKKyAgICBkZWZpbmVkKFBKX0xJTlVYKSAmJiBQSl9MSU5VWCE9MAorc3RhdGljIGludCBtYWNoaW5lX3NwZWVkX21oejsKK3N0YXRpYyBwal90aW1lc3RhbXAgbWFjaGluZV9zcGVlZDsKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIGludCByZHRzYygpCit7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCB4OworICAgIF9fYXNtX18gdm9sYXRpbGUgKCIuYnl0ZSAweDBmLCAweDMxIiA6ICI9QSIgKHgpKTsKKyAgICByZXR1cm4geDsKK30KKworLyogRGV0ZXJtaW5lIG1hY2hpbmUncyBDUFUgTUh6IHRvIGdldCB0aGUgY291bnRlcidzIGZyZXF1ZW5jeS4KKyAqLworc3RhdGljIGludCBnZXRfbWFjaGluZV9zcGVlZF9taHooKQoreworICAgIEZJTEUgKnN0cm07CisgICAgY2hhciBidWZbNTEyXTsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKnBvcywgKmVuZDsKKwkKKyAgICBQSl9DSEVDS19TVEFDSygpOworCQorICAgIC8qIE9wZW4gL3Byb2MvY3B1aW5mbyBhbmQgcmVhZCB0aGUgZmlsZSAqLworICAgIHN0cm0gPSBmb3BlbigiL3Byb2MvY3B1aW5mbyIsICJyIik7CisgICAgaWYgKCFzdHJtKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbGVuID0gZnJlYWQoYnVmLCAxLCBzaXplb2YoYnVmKSwgc3RybSk7CisgICAgZmNsb3NlKHN0cm0pOworICAgIGlmIChsZW4gPCAxKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYnVmW2xlbl0gPSAnXDAnOworCisgICAgLyogTG9jYXRlIHRoZSBNSHogZGlnaXQuICovCisgICAgcG9zID0gc3Ryc3RyKGJ1ZiwgImNwdSBNSHoiKTsKKyAgICBpZiAoIXBvcykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHBvcyA9IHN0cmNocihwb3MsICc6Jyk7CisgICAgaWYgKCFwb3MpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbmQgPSAocG9zICs9IDIpOworICAgIHdoaWxlIChpc2RpZ2l0KCplbmQpKSArK2VuZDsKKyAgICAqZW5kID0gJ1wwJzsKKworICAgIC8qIFJldHVybiB0aGUgTWh6IHBhcnQsIGFuZCBnaXZlIGl0IGEgKzEuICovCisgICAgcmV0dXJuIGF0b2kocG9zKSsxOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldF90aW1lc3RhbXAocGpfdGltZXN0YW1wICp0cykKK3sKKyAgICBpZiAobWFjaGluZV9zcGVlZF9taHogPT0gMCkgeworCW1hY2hpbmVfc3BlZWRfbWh6ID0gZ2V0X21hY2hpbmVfc3BlZWRfbWh6KCk7CisJaWYgKG1hY2hpbmVfc3BlZWRfbWh6ID4gMCkgeworCSAgICBtYWNoaW5lX3NwZWVkLnU2NCA9IG1hY2hpbmVfc3BlZWRfbWh6ICogMTAwMDAwMC4wOworCX0KKyAgICB9CisgICAgCisgICAgaWYgKG1hY2hpbmVfc3BlZWRfbWh6ID09IC0xKSB7CisJdHMtPnU2NCA9IDA7CisJcmV0dXJuIC0xOworICAgIH0gCisgICAgdHMtPnU2NCA9IHJkdHNjKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X3RpbWVzdGFtcF9mcmVxKHBqX3RpbWVzdGFtcCAqZnJlcSkKK3sKKyAgICBpZiAobWFjaGluZV9zcGVlZF9taHogPT0gMCkgeworCW1hY2hpbmVfc3BlZWRfbWh6ID0gZ2V0X21hY2hpbmVfc3BlZWRfbWh6KCk7CisJaWYgKG1hY2hpbmVfc3BlZWRfbWh6ID4gMCkgeworCSAgICBtYWNoaW5lX3NwZWVkLnU2NCA9IG1hY2hpbmVfc3BlZWRfbWh6ICogMTAwMDAwMC4wOworCX0KKyAgICB9CisgICAgCisgICAgaWYgKG1hY2hpbmVfc3BlZWRfbWh6ID09IC0xKSB7CisJZnJlcS0+dTY0ID0gMTsJLyogcmV0dXJuIDEgdG8gcHJldmVudCBkaXZpc2lvbiBieSB6ZXJvIGluIGFwcHMuICovCisJcmV0dXJuIC0xOworICAgIH0gCisKKyAgICBmcmVxLT51NjQgPSBtYWNoaW5lX3NwZWVkLnU2NDsKKyAgICByZXR1cm4gMDsKK30KKworI2VsaWYgZGVmaW5lZChQSl9EQVJXSU5PUykgJiYgUEpfREFSV0lOT1MgIT0gMAorI2luY2x1ZGUgPG1hY2gvbWFjaC5oPgorI2luY2x1ZGUgPG1hY2gvY2xvY2suaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjZGVmaW5lIE5TRUNfUEVSX1NFQwkxMDAwMDAwMDAwCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X3RpbWVzdGFtcChwal90aW1lc3RhbXAgKnRzKQoreworICAgIG1hY2hfdGltZXNwZWNfdCB0cDsKKyAgICBpbnQgcmV0OworICAgIGNsb2NrX3NlcnZfdCBzZXJ2OworCisgICAgcmV0ID0gaG9zdF9nZXRfY2xvY2tfc2VydmljZShtYWNoX2hvc3Rfc2VsZigpLCBTWVNURU1fQ0xPQ0ssICZzZXJ2KTsKKyAgICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykgeworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXQgPSBjbG9ja19nZXRfdGltZShzZXJ2LCAmdHApOworICAgIGlmIChyZXQgIT0gS0VSTl9TVUNDRVNTKSB7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHRzLT51NjQgPSB0cC50dl9zZWM7CisgICAgdHMtPnU2NCAqPSBOU0VDX1BFUl9TRUM7CisgICAgdHMtPnU2NCArPSB0cC50dl9uc2VjOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X3RpbWVzdGFtcF9mcmVxKHBqX3RpbWVzdGFtcCAqZnJlcSkKK3sKKyAgICBmcmVxLT51MzIuaGkgPSAwOworICAgIGZyZXEtPnUzMi5sbyA9IE5TRUNfUEVSX1NFQzsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisjZWxpZiBkZWZpbmVkKFVTRV9QT1NJWF9USU1FUlMpICYmIFVTRV9QT1NJWF9USU1FUlMgIT0gMAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgTlNFQ19QRVJfU0VDCTEwMDAwMDAwMDAKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wKHBqX3RpbWVzdGFtcCAqdHMpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHRwOworCisgICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHApICE9IDApIHsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfb3NfZXJyb3IoKSk7CisgICAgfQorCisgICAgdHMtPnU2NCA9IHRwLnR2X3NlYzsKKyAgICB0cy0+dTY0ICo9IE5TRUNfUEVSX1NFQzsKKyAgICB0cy0+dTY0ICs9IHRwLnR2X25zZWM7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wX2ZyZXEocGpfdGltZXN0YW1wICpmcmVxKQoreworICAgIGZyZXEtPnUzMi5oaSA9IDA7CisgICAgZnJlcS0+dTMyLmxvID0gTlNFQ19QRVJfU0VDOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjZGVmaW5lIFVTRUNfUEVSX1NFQwkxMDAwMDAwCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X3RpbWVzdGFtcChwal90aW1lc3RhbXAgKnRzKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworCisgICAgaWYgKGdldHRpbWVvZmRheSgmdHYsIE5VTEwpICE9IDApIHsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfb3NfZXJyb3IoKSk7CisgICAgfQorCisgICAgdHMtPnU2NCA9IHR2LnR2X3NlYzsKKyAgICB0cy0+dTY0ICo9IFVTRUNfUEVSX1NFQzsKKyAgICB0cy0+dTY0ICs9IHR2LnR2X3VzZWM7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wX2ZyZXEocGpfdGltZXN0YW1wICpmcmVxKQoreworICAgIGZyZXEtPnUzMi5oaSA9IDA7CisgICAgZnJlcS0+dTMyLmxvID0gVVNFQ19QRVJfU0VDOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9vc190aW1lc3RhbXBfd2luMzIuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfdGltZXN0YW1wX3dpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0MmFiMQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovb3NfdGltZXN0YW1wX3dpbjMyLmMKQEAgLTAsMCArMSwyOTUgQEAKKy8qICRJZDogb3NfdGltZXN0YW1wX3dpbjMyLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZGVmaW5lIFRISVNfRklMRSAgICJvc190aW1lc3RhbXBfd2luMzIuYyIKKworCisjaWYgMQorIyAgIGRlZmluZSBUUkFDRV8oeCkJICAgIFBKX0xPRygzLHgpCisjZWxzZQorIyAgIGRlZmluZSBUUkFDRV8oeCkJICAgIDsKKyNlbmRpZgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZiBkZWZpbmVkKFBKX1RJTUVTVEFNUF9VU0VfUkRUU0MpICYmIFBKX1RJTUVTVEFNUF9VU0VfUkRUU0MhPTAgJiYgXAorICAgIGRlZmluZWQoUEpfTV9JMzg2KSAmJiBQSl9NX0kzODYgIT0gMCAmJiBcCisgICAgZGVmaW5lZChQSl9IQVNfUEVOVElVTSkgJiYgUEpfSEFTX1BFTlRJVU0hPTAgJiYgXAorICAgIGRlZmluZWQoX01TQ19WRVIpCisKKy8qCisgKiBVc2UgcmR0c2MgdG8gZ2V0IHRoZSBPUyB0aW1lc3RhbXAuCisgKi8KK3N0YXRpYyBMT05HIENwdU1oejsKK3N0YXRpYyBwal9pbnQ2NF90IENwdUh6OworIAorc3RhdGljIHBqX3N0YXR1c190IEdldENwdUh6KHZvaWQpCit7CisgICAgSEtFWSBrZXk7CisgICAgTE9ORyByYzsKKyAgICBEV09SRCBzaXplOworCisjaWYgZGVmaW5lZChQSl9XSU4zMl9XSU5DRSkgJiYgUEpfV0lOMzJfV0lOQ0UhPTAKKyAgICByYyA9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsCisJCSAgICAgIEwiSEFSRFdBUkVcXERFU0NSSVBUSU9OXFxTeXN0ZW1cXENlbnRyYWxQcm9jZXNzb3JcXDAiLAorCQkgICAgICAwLCAwLCAma2V5KTsKKyNlbHNlCisgICAgcmMgPSBSZWdPcGVuS2V5KCBIS0VZX0xPQ0FMX01BQ0hJTkUsCisJCSAgICAgIkhBUkRXQVJFXFxERVNDUklQVElPTlxcU3lzdGVtXFxDZW50cmFsUHJvY2Vzc29yXFwwIiwKKwkJICAgICAma2V5KTsKKyNlbmRpZgorCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyYyk7CisKKyAgICBzaXplID0gc2l6ZW9mKENwdU1oeik7CisgICAgcmMgPSBSZWdRdWVyeVZhbHVlRXgoa2V5LCAifk1IeiIsIE5VTEwsIE5VTEwsIChCWVRFKikmQ3B1TWh6LCAmc2l6ZSk7CisgICAgUmVnQ2xvc2VLZXkoa2V5KTsKKworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKSB7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyYyk7CisgICAgfQorCisgICAgQ3B1SHogPSBDcHVNaHo7CisgICAgQ3B1SHogPSBDcHVIeiAqIDEwMDAwMDA7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogX19pbnQ2NCBpcyBuaWNlbHkgcmV0dXJuZWQgaW4gRURYOkVBWCAqLworX19kZWNsc3BlYyhuYWtlZCkgX19pbnQ2NCByZHRzYygpIAoreworICAgIF9fYXNtIAorICAgIHsKKwlSRFRTQworCVJFVAorICAgIH0KK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wKHBqX3RpbWVzdGFtcCAqdHMpCit7CisgICAgdHMtPnU2NCA9IHJkdHNjKCk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0X3RpbWVzdGFtcF9mcmVxKHBqX3RpbWVzdGFtcCAqZnJlcSkKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBpZiAoQ3B1SHogPT0gMCkgeworCXN0YXR1cyA9IEdldENwdUh6KCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGZyZXEtPnU2NCA9IENwdUh6OworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZWxpZiBkZWZpbmVkKFBKX1RJTUVTVEFNUF9XSU4zMl9VU0VfU0FGRV9RUEMpICYmIFwKKyAgICAgICAgIFBKX1RJTUVTVEFNUF9XSU4zMl9VU0VfU0FGRV9RUEMhPTAKKworLyogVXNlIHNhZmUgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIuCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBzb21lIHByb3RlY3Rpb24gYWdhaW5zdCBidWcgaW4gS0IgUTI3NDMyMzoKKyAqICAgUGVyZm9ybWFuY2UgY291bnRlciB2YWx1ZSBtYXkgdW5leHBlY3RlZGx5IGxlYXAgZm9yd2FyZAorICogICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPUtCO0VOLVVTO1EyNzQzMjMKKyAqCisgKiBUSElTIFNIT1VMRCBOT1QgQkUgVVNFRCBZRVQgQVMgSVQgRE9FU04nVCBIQU5ETEUgU1lTVEVNIFRJTUUKKyAqIENIQU5HRS4KKyAqLworCitzdGF0aWMgcGpfdGltZXN0YW1wIGdfdHNfZnJlcTsKK3N0YXRpYyBwal90aW1lc3RhbXAgZ190c19iYXNlOworc3RhdGljIHBqX2ludDY0X3QgICBnX3RpbWVfYmFzZTsKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wKHBqX3RpbWVzdGFtcCAqdHMpCit7CisgICAgZW51bSB7IE1BWF9SRVRSWSA9IDEwIH07CisgICAgdW5zaWduZWQgaTsKKworCisgICAgLyogcGpfZ2V0X3RpbWVzdGFtcF9mcmVxKCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGJlZm9yZS4KKyAgICAgKiBUaGlzIGlzIGRvbmUgd2hlbiBhcHBsaWNhdGlvbiBjYWxsZWQgcGpfaW5pdCgpLgorICAgICAqLworICAgIHBqX2Fzc2VydChnX3RzX2ZyZXEudTY0ICE9IDApOworCisgICAgLyogUmV0cnkgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKSB1bnRpbCB3ZSdyZSBzdXJlIHRoYXQgdGhlCisgICAgICogdmFsdWUgcmV0dXJuZWQgbWFrZXMgc2Vuc2UuCisgICAgICovCisgICAgaSA9IDA7CisgICAgZG8geworCUxBUkdFX0lOVEVHRVIgdmFsOworCXBqX2ludDY0X3QgY291bnRlcjY0LCB0aW1lNjQsIGRpZmY7CisJcGpfdGltZV92YWwgdGltZV9ub3c7CisKKwkvKiBSZXRyaWV2ZSB0aGUgY291bnRlciAqLworCWlmICghUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnZhbCkpCisJICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisJLyogUmVnYXJkbGVzcyBvZiB0aGUgZ29vZG5lc3Mgb2YgdGhlIHZhbHVlLCB3ZSBzaG91bGQgcHV0CisJICogdGhlIGNvdW50ZXIgaGVyZSwgYmVjYXVzZSBub3JtYWxseSBhcHBsaWNhdGlvbiB3b3VsZG4ndAorCSAqIGNoZWNrIHRoZSBlcnJvciByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwl0cy0+dTY0ID0gdmFsLlF1YWRQYXJ0OworCisJLyogUmV0cmlldmUgdGltZSAqLworCXBqX2dldHRpbWVvZmRheSgmdGltZV9ub3cpOworCisJLyogR2V0IHRoZSBjb3VudGVyIGVsYXBzZWQgdGltZSBpbiBtaWxpc2Vjb25kcyAqLworCWNvdW50ZXI2NCA9ICh2YWwuUXVhZFBhcnQgLSBnX3RzX2Jhc2UudTY0KSAqIDEwMDAgLyBnX3RzX2ZyZXEudTY0OworCQorCS8qIEdldCB0aGUgdGltZSBlbGFwc2VkIGluIG1pbGlzZWNvbmRzLiAKKwkgKiBXZSBkb24ndCB3YW50IHRvIHVzZSBQSl9USU1FX1ZBTF9NU0VDKCkgc2luY2UgaXQncyB1c2luZworCSAqIDMyYml0IGNhbGN1bGF0aW9uLCB3aGljaCBsaW1pdHMgdGhlIG1heGltdW0gZWxhcHNlZCB0aW1lCisJICogdG8gYXJvdW5kIDQ5IGRheXMgb25seS4KKwkgKi8KKwl0aW1lNjQgPSB0aW1lX25vdy5zZWM7CisJdGltZTY0ID0gdGltZTY0ICogMTAwMCArIHRpbWVfbm93Lm1zZWM7CisJLy90aW1lNjQgPSBHZXRUaWNrQ291bnQoKTsKKworCS8qIEl0J3MgZ29vZCBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBjbG9ja3MgYXJlIHdpdGhpbgorCSAqIHNvbWUgY29tcGlsZSB0aW1lIGNvbnN0YW50IChkZWZhdWx0OiAyMG1zLCB3aGljaCB0byBhbGxvdworCSAqIGNvbnRleHQgc3dpdGNoIGhhcHBlbiBiZXR3ZWVuIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyIGFuZAorCSAqIHBqX2dldHRpbWVvZmRheSgpKS4KKwkgKi8KKwlkaWZmID0gKHRpbWU2NCAtIGdfdGltZV9iYXNlKSAtIGNvdW50ZXI2NDsKKwlpZiAoZGlmZiA+PSAtMjAgJiYgZGlmZiA8PSAyMCkgeworCSAgICAvKiBJdCdzIGdvb2QgKi8KKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisJfQorCisJKytpOworCisgICAgfSB3aGlsZSAoaSA8IE1BWF9SRVRSWSk7CisKKyAgICBUUkFDRV8oKFRISVNfRklMRSwgIlF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyIHJldHVybmVkIGJhZCB2YWx1ZSIpKTsKKyAgICByZXR1cm4gUEpfRVRJTUVET1VUOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgaW5pdF9wZXJmb3JtYW5jZV9jb3VudGVyKHZvaWQpCit7CisgICAgTEFSR0VfSU5URUdFUiB2YWw7CisgICAgcGpfdGltZV92YWwgdGltZV9iYXNlOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIEdldCB0aGUgZnJlcXVlbmN5ICovCisgICAgaWYgKCFRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZ2YWwpKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgZ190c19mcmVxLnU2NCA9IHZhbC5RdWFkUGFydDsKKworICAgIC8qIEdldCB0aGUgYmFzZSB0aW1lc3RhbXAgKi8KKyAgICBpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZ2YWwpKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgZ190c19iYXNlLnU2NCA9IHZhbC5RdWFkUGFydDsKKworCisgICAgLyogR2V0IHRoZSBiYXNlIHRpbWUgKi8KKyAgICBzdGF0dXMgPSBwal9nZXR0aW1lb2ZkYXkoJnRpbWVfYmFzZSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICAvKiBDb252ZXJ0IHRpbWUgYmFzZSB0byA2NGJpdCB2YWx1ZSBpbiBtc2VjICovCisgICAgZ190aW1lX2Jhc2UgPSB0aW1lX2Jhc2Uuc2VjOworICAgIGdfdGltZV9iYXNlICA9IGdfdGltZV9iYXNlICogMTAwMCArIHRpbWVfYmFzZS5tc2VjOworICAgIC8vZ190aW1lX2Jhc2UgPSBHZXRUaWNrQ291bnQoKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2dldF90aW1lc3RhbXBfZnJlcShwal90aW1lc3RhbXAgKmZyZXEpCit7CisgICAgaWYgKGdfdHNfZnJlcS51NjQgPT0gMCkgeworCWVudW0geyBNQVhfUkVQRUFUID0gMTAgfTsKKwl1bnNpZ25lZCBpOworCXBqX3N0YXR1c190IHN0YXR1czsKKworCS8qIE1ha2UgdW5lbGxlZ2FudCBjb21waWxlciBoYXBweSAqLworCXN0YXR1cyA9IDA7CisKKwkvKiBSZXBlYXQgaW5pdGlhbGl6aW5nIHBlcmZvcm1hbmNlIGNvdW50ZXIgdW50aWwgd2UncmUgc3VyZQorCSAqIHRoZSBiYXNlIHRpbWluZyBpcyBjb3JyZWN0LiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzeXN0ZW0KKwkgKiByZXR1cm5zIGJhZCBjb3VudGVyIGR1cmluZyB0aGlzIGluaXRpYWxpemF0aW9uIQorCSAqLworCWZvciAoaT0wOyBpPE1BWF9SRVBFQVQ7ICsraSkgeworCisJICAgIHBqX3RpbWVzdGFtcCBkdW1teTsKKworCSAgICAvKiBJbml0IGJhc2UgdGltZSAqLworCSAgICBzdGF0dXMgPSBpbml0X3BlcmZvcm1hbmNlX2NvdW50ZXIoKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCisJICAgIC8qIFRyeSB0aGUgYmFzZSB0aW1lICovCisJICAgIHN0YXR1cyA9IHBqX2dldF90aW1lc3RhbXAoJmR1bW15KTsKKwkgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgZnJlcS0+dTY0ID0gZ190c19mcmVxLnU2NDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2Vsc2UKKworLyoKKyAqIFVzZSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciBhbmQgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeS4KKyAqIFRoaXMgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgb24gV2luZG93cy4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wKHBqX3RpbWVzdGFtcCAqdHMpCit7CisgICAgTEFSR0VfSU5URUdFUiB2YWw7CisKKyAgICBpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZ2YWwpKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgdHMtPnU2NCA9IHZhbC5RdWFkUGFydDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRfdGltZXN0YW1wX2ZyZXEocGpfdGltZXN0YW1wICpmcmVxKQoreworICAgIExBUkdFX0lOVEVHRVIgdmFsOworCisgICAgaWYgKCFRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZ2YWwpKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoR2V0TGFzdEVycm9yKCkpOworCisgICAgZnJlcS0+dTY0ID0gdmFsLlF1YWRQYXJ0OworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKyNlbmRpZgkvKiBQSl9USU1FU1RBTVBfVVNFX1JEVFNDICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovcG9vbC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9wb29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyNDIyMwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovcG9vbC5jCkBAIC0wLDAgKzEsMzAxIEBACisvKiAkSWQ6IHBvb2wuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovZXhjZXB0Lmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKworI2lmICFQSl9IQVNfUE9PTF9BTFRfQVBJCisKKworLyogSW5jbHVkZSBpbmxpbmUgZGVmaW5pdGlvbnMgd2hlbiBpbmxpbmluZyBpcyBkaXNhYmxlZC4gKi8KKyNpZiAhUEpfRlVOQ1RJT05TX0FSRV9JTkxJTkVECisjICBpbmNsdWRlIDxwai9wb29sX2kuaD4KKyNlbmRpZgorCisjZGVmaW5lIExPRyhleHByKSAgIAkJICAgIFBKX0xPRyg2LGV4cHIpCisjZGVmaW5lIEFMSUdOX1BUUihQVFIsQUxJR05NRU5UKSAgICAoUFRSICsgKC0ocGpfc3NpemVfdCkoUFRSKSAmIChBTElHTk1FTlQtMSkpKQorCitQSl9ERUZfREFUQShpbnQpIFBKX05PX01FTU9SWV9FWENFUFRJT047CisKK1BKX0RFRihpbnQpIHBqX05PX01FTU9SWV9FWENFUFRJT04oKQoreworICAgIHJldHVybiBQSl9OT19NRU1PUllfRVhDRVBUSU9OOworfQorCisvKgorICogQ3JlYXRlIG5ldyBibG9jay4KKyAqIENyZWF0ZSBhIG5ldyBiaWcgY2h1bmsgb2YgbWVtb3J5IGJsb2NrLCBmcm9tIHdoaWNoIHVzZXIgYWxsb2NhdGlvbiB3aWxsIGJlCisgKiB0YWtlbiBmcm9tLgorICovCitzdGF0aWMgcGpfcG9vbF9ibG9jayAqcGpfcG9vbF9jcmVhdGVfYmxvY2soIHBqX3Bvb2xfdCAqcG9vbCwgcGpfc2l6ZV90IHNpemUpCit7CisgICAgcGpfcG9vbF9ibG9jayAqYmxvY2s7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIHBqX2Fzc2VydChzaXplID49IHNpemVvZihwal9wb29sX2Jsb2NrKSk7CisKKyAgICBMT0coKHBvb2wtPm9ial9uYW1lLCAiY3JlYXRlX2Jsb2NrKHN6PSV1KSwgY3VyLmNhcD0ldSwgY3VyLnVzZWQ9JXUiLCAKKwkgc2l6ZSwgcG9vbC0+Y2FwYWNpdHksIHBqX3Bvb2xfZ2V0X3VzZWRfc2l6ZShwb29sKSkpOworCisgICAgLyogUmVxdWVzdCBtZW1vcnkgZnJvbSBhbGxvY2F0b3IuICovCisgICAgYmxvY2sgPSAocGpfcG9vbF9ibG9jayopIAorCSgqcG9vbC0+ZmFjdG9yeS0+cG9saWN5LmJsb2NrX2FsbG9jKShwb29sLT5mYWN0b3J5LCBzaXplKTsKKyAgICBpZiAoYmxvY2sgPT0gTlVMTCkgeworCSgqcG9vbC0+Y2FsbGJhY2spKHBvb2wsIHNpemUpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIEFkZCBjYXBhY2l0eS4gKi8KKyAgICBwb29sLT5jYXBhY2l0eSArPSBzaXplOworCisgICAgLyogU2V0IHN0YXJ0IGFuZCBlbmQgb2YgYnVmZmVyLiAqLworICAgIGJsb2NrLT5idWYgPSAoKHVuc2lnbmVkIGNoYXIqKWJsb2NrKSArIHNpemVvZihwal9wb29sX2Jsb2NrKTsKKyAgICBibG9jay0+ZW5kID0gKCh1bnNpZ25lZCBjaGFyKilibG9jaykgKyBzaXplOworCisgICAgLyogU2V0IHRoZSBzdGFydCBwb2ludGVyLCBhbGlnbmluZyBpdCBhcyBuZWVkZWQgKi8KKyAgICBibG9jay0+Y3VyID0gQUxJR05fUFRSKGJsb2NrLT5idWYsIFBKX1BPT0xfQUxJR05NRU5UKTsKKworICAgIC8qIEluc2VydCBpbiB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuICovCisgICAgcGpfbGlzdF9pbnNlcnRfYWZ0ZXIoJnBvb2wtPmJsb2NrX2xpc3QsIGJsb2NrKTsKKworICAgIExPRygocG9vbC0+b2JqX25hbWUsIiBibG9jayBjcmVhdGVkLCBidWZmZXI9JXAtJXAiLGJsb2NrLT5idWYsIGJsb2NrLT5lbmQpKTsKKworICAgIHJldHVybiBibG9jazsKK30KKworLyoKKyAqIEFsbG9jYXRlIG1lbW9yeSBjaHVuayBmb3IgdXNlciBmcm9tIGF2YWlsYWJsZSBibG9ja3MuCisgKiBUaGlzIHdpbGwgaXRlcmF0ZSB0aHJvdWdoIGJsb2NrIGxpc3QgdG8gZmluZCBzcGFjZSB0byBhbGxvY2F0ZSB0aGUgY2h1bmsuCisgKiBJZiBubyBzcGFjZSBpcyBhdmFpbGFibGUgaW4gYWxsIHRoZSBibG9ja3MsIGEgbmV3IGJsb2NrIG1pZ2h0IGJlIGNyZWF0ZWQKKyAqIChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcG9vbCBpcyBhbGxvd2VkIHRvIHJlc2l6ZSkuCisgKi8KK1BKX0RFRih2b2lkKikgcGpfcG9vbF9hbGxvY2F0ZV9maW5kKHBqX3Bvb2xfdCAqcG9vbCwgcGpfc2l6ZV90IHNpemUpCit7CisgICAgcGpfcG9vbF9ibG9jayAqYmxvY2sgPSBwb29sLT5ibG9ja19saXN0Lm5leHQ7CisgICAgdm9pZCAqcDsKKyAgICBwal9zaXplX3QgYmxvY2tfc2l6ZTsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICB3aGlsZSAoYmxvY2sgIT0gJnBvb2wtPmJsb2NrX2xpc3QpIHsKKwlwID0gcGpfcG9vbF9hbGxvY19mcm9tX2Jsb2NrKGJsb2NrLCBzaXplKTsKKwlpZiAocCAhPSBOVUxMKQorCSAgICByZXR1cm4gcDsKKwlibG9jayA9IGJsb2NrLT5uZXh0OworICAgIH0KKyAgICAvKiBObyBhdmFpbGFibGUgc3BhY2UgaW4gYWxsIGJsb2Nrcy4gKi8KKworICAgIC8qIElmIHBvb2wgaXMgY29uZmlndXJlZCBOT1QgdG8gZXhwYW5kLCByZXR1cm4gZXJyb3IuICovCisgICAgaWYgKHBvb2wtPmluY3JlbWVudF9zaXplID09IDApIHsKKwlMT0coKHBvb2wtPm9ial9uYW1lLCAiQ2FuJ3QgZXhwYW5kIHBvb2wgdG8gYWxsb2NhdGUgJXUgYnl0ZXMgIgorCSAgICAgIih1c2VkPSV1LCBjYXA9JXUpIiwKKwkgICAgIHNpemUsIHBqX3Bvb2xfZ2V0X3VzZWRfc2l6ZShwb29sKSwgcG9vbC0+Y2FwYWNpdHkpKTsKKwkoKnBvb2wtPmNhbGxiYWNrKShwb29sLCBzaXplKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBJZiBwb29sIGlzIGNvbmZpZ3VyZWQgdG8gZXhwYW5kLCBidXQgdGhlIGluY3JlbWVudCBzaXplCisgICAgICogaXMgbGVzcyB0aGFuIHRoZSByZXF1aXJlZCBzaXplLCBleHBhbmQgdGhlIHBvb2wgYnkgbXVsdGlwbGUKKyAgICAgKiBpbmNyZW1lbnQgc2l6ZS4gQWxzbyBjb3VudCB0aGUgc2l6ZSB3YXN0ZWQgZHVlIHRvIGFsaWduaW5nCisgICAgICogdGhlIGJsb2NrLgorICAgICAqLworICAgIGlmIChwb29sLT5pbmNyZW1lbnRfc2l6ZSA8IAorCSAgICBzaXplICsgc2l6ZW9mKHBqX3Bvb2xfYmxvY2spICsgUEpfUE9PTF9BTElHTk1FTlQpIAorICAgIHsKKyAgICAgICAgcGpfc2l6ZV90IGNvdW50OworICAgICAgICBjb3VudCA9IChzaXplICsgcG9vbC0+aW5jcmVtZW50X3NpemUgKyBzaXplb2YocGpfcG9vbF9ibG9jaykgKworICAgICAgICAgICAgICAgICBQSl9QT09MX0FMSUdOTUVOVCkgLyAKKyAgICAgICAgICAgICAgICBwb29sLT5pbmNyZW1lbnRfc2l6ZTsKKyAgICAgICAgYmxvY2tfc2l6ZSA9IGNvdW50ICogcG9vbC0+aW5jcmVtZW50X3NpemU7CisKKyAgICB9IGVsc2UgeworICAgICAgICBibG9ja19zaXplID0gcG9vbC0+aW5jcmVtZW50X3NpemU7CisgICAgfQorCisgICAgTE9HKChwb29sLT5vYmpfbmFtZSwgCisJICIldSBieXRlcyByZXF1ZXN0ZWQsIHJlc2l6aW5nIHBvb2wgYnkgJXUgYnl0ZXMgKHVzZWQ9JXUsIGNhcD0ldSkiLAorCSBzaXplLCBibG9ja19zaXplLCBwal9wb29sX2dldF91c2VkX3NpemUocG9vbCksIHBvb2wtPmNhcGFjaXR5KSk7CisKKyAgICBibG9jayA9IHBqX3Bvb2xfY3JlYXRlX2Jsb2NrKHBvb2wsIGJsb2NrX3NpemUpOworICAgIGlmICghYmxvY2spCisJcmV0dXJuIE5VTEw7CisKKyAgICBwID0gcGpfcG9vbF9hbGxvY19mcm9tX2Jsb2NrKGJsb2NrLCBzaXplKTsKKyAgICBwal9hc3NlcnQocCAhPSBOVUxMKTsKKyNpZiBQSl9ERUJVRworICAgIGlmIChwID09IE5VTEwpIHsKKwlwID0gcDsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gcDsKK30KKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgcG9vbC4KKyAqLworUEpfREVGKHZvaWQpIHBqX3Bvb2xfaW5pdF9pbnQoICBwal9wb29sX3QgKnBvb2wsIAorCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJcGpfc2l6ZV90IGluY3JlbWVudF9zaXplLAorCQkJCXBqX3Bvb2xfY2FsbGJhY2sgKmNhbGxiYWNrKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBwb29sLT5pbmNyZW1lbnRfc2l6ZSA9IGluY3JlbWVudF9zaXplOworICAgIHBvb2wtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisKKyAgICBpZiAobmFtZSkgeworCWlmIChzdHJjaHIobmFtZSwgJyUnKSAhPSBOVUxMKSB7CisJICAgIHBqX2Fuc2lfc25wcmludGYocG9vbC0+b2JqX25hbWUsIHNpemVvZihwb29sLT5vYmpfbmFtZSksIAorCQkJICAgICBuYW1lLCBwb29sKTsKKwl9IGVsc2UgeworCSAgICBwal9hbnNpX3N0cm5jcHkocG9vbC0+b2JqX25hbWUsIG5hbWUsIFBKX01BWF9PQkpfTkFNRSk7CisJICAgIHBvb2wtPm9ial9uYW1lW1BKX01BWF9PQkpfTkFNRS0xXSA9ICdcMCc7CisJfQorICAgIH0gZWxzZSB7CisJcG9vbC0+b2JqX25hbWVbMF0gPSAnXDAnOworICAgIH0KK30KKworLyoKKyAqIENyZWF0ZSBuZXcgbWVtb3J5IHBvb2wuCisgKi8KK1BKX0RFRihwal9wb29sX3QqKSBwal9wb29sX2NyZWF0ZV9pbnQoIHBqX3Bvb2xfZmFjdG9yeSAqZiwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICAgcGpfc2l6ZV90IGluaXRpYWxfc2l6ZSwgCisJCQkJICAgICAgIHBqX3NpemVfdCBpbmNyZW1lbnRfc2l6ZSwKKwkJCQkgICAgICAgcGpfcG9vbF9jYWxsYmFjayAqY2FsbGJhY2spCit7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHBqX3Bvb2xfYmxvY2sgKmJsb2NrOworICAgIHBqX3VpbnQ4X3QgKmJ1ZmZlcjsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICAvKiBTaXplIG11c3QgYmUgYXQgbGVhc3Qgc2l6ZW9mKHBqX3Bvb2wpK3NpemVvZihwal9wb29sX2Jsb2NrKSAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oaW5pdGlhbF9zaXplID49IHNpemVvZihwal9wb29sX3QpK3NpemVvZihwal9wb29sX2Jsb2NrKSwKKwkJICAgICBOVUxMKTsKKworICAgIC8qIElmIGNhbGxiYWNrIGlzIE5VTEwsIHNldCBjYWxiYWNrIGZyb20gdGhlIHBvbGljeSAqLworICAgIGlmIChjYWxsYmFjayA9PSBOVUxMKQorCWNhbGxiYWNrID0gZi0+cG9saWN5LmNhbGxiYWNrOworCisgICAgLyogQWxsb2NhdGUgaW5pdGlhbCBibG9jayAqLworICAgIGJ1ZmZlciA9IChwal91aW50OF90KikgKCpmLT5wb2xpY3kuYmxvY2tfYWxsb2MpKGYsIGluaXRpYWxfc2l6ZSk7CisgICAgaWYgKCFidWZmZXIpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBTZXQgcG9vbCBhZG1pbmlzdHJhdGl2ZSBkYXRhLiAqLworICAgIHBvb2wgPSAocGpfcG9vbF90KilidWZmZXI7CisgICAgcGpfYnplcm8ocG9vbCwgc2l6ZW9mKCpwb29sKSk7CisKKyAgICBwal9saXN0X2luaXQoJnBvb2wtPmJsb2NrX2xpc3QpOworICAgIHBvb2wtPmZhY3RvcnkgPSBmOworCisgICAgLyogQ3JlYXRlIHRoZSBmaXJzdCBibG9jayBmcm9tIHRoZSBtZW1vcnkuICovCisgICAgYmxvY2sgPSAocGpfcG9vbF9ibG9jayopIChidWZmZXIgKyBzaXplb2YoKnBvb2wpKTsKKyAgICBibG9jay0+YnVmID0gKCh1bnNpZ25lZCBjaGFyKilibG9jaykgKyBzaXplb2YocGpfcG9vbF9ibG9jayk7CisgICAgYmxvY2stPmVuZCA9IGJ1ZmZlciArIGluaXRpYWxfc2l6ZTsKKworICAgIC8qIFNldCB0aGUgc3RhcnQgcG9pbnRlciwgYWxpZ25pbmcgaXQgYXMgbmVlZGVkICovCisgICAgYmxvY2stPmN1ciA9IEFMSUdOX1BUUihibG9jay0+YnVmLCBQSl9QT09MX0FMSUdOTUVOVCk7CisKKyAgICBwal9saXN0X2luc2VydF9hZnRlcigmcG9vbC0+YmxvY2tfbGlzdCwgYmxvY2spOworCisgICAgcGpfcG9vbF9pbml0X2ludChwb29sLCBuYW1lLCBpbmNyZW1lbnRfc2l6ZSwgY2FsbGJhY2spOworCisgICAgLyogUG9vbCBpbml0aWFsIGNhcGFjaXR5IGFuZCB1c2VkIHNpemUgKi8KKyAgICBwb29sLT5jYXBhY2l0eSA9IGluaXRpYWxfc2l6ZTsKKworICAgIExPRygocG9vbC0+b2JqX25hbWUsICJwb29sIGNyZWF0ZWQsIHNpemU9JXUiLCBwb29sLT5jYXBhY2l0eSkpOworICAgIHJldHVybiBwb29sOworfQorCisvKgorICogUmVzZXQgdGhlIHBvb2wgdG8gdGhlIHN0YXRlIHdoZW4gaXQgd2FzIGNyZWF0ZWQuCisgKiBBbGwgYmxvY2tzIHdpbGwgYmUgZGVhbGxvY2F0ZWQgZXhjZXB0IHRoZSBmaXJzdCBibG9jay4gQWxsIG1lbW9yeSBhcmVhcworICogYXJlIG1hcmtlZCBhcyBmcmVlLgorICovCitzdGF0aWMgdm9pZCByZXNldF9wb29sKHBqX3Bvb2xfdCAqcG9vbCkKK3sKKyAgICBwal9wb29sX2Jsb2NrICpibG9jazsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBibG9jayA9IHBvb2wtPmJsb2NrX2xpc3QucHJldjsKKyAgICBpZiAoYmxvY2sgPT0gJnBvb2wtPmJsb2NrX2xpc3QpCisJcmV0dXJuOworCisgICAgLyogU2tpcCB0aGUgZmlyc3QgYmxvY2sgYmVjYXVzZSBpdCBpcyBvY2N1cHlpbmcgdGhlIHNhbWUgbWVtb3J5CisgICAgICAgYXMgdGhlIHBvb2wgaXRzZWxmLgorICAgICovCisgICAgYmxvY2sgPSBibG9jay0+cHJldjsKKyAgICAKKyAgICB3aGlsZSAoYmxvY2sgIT0gJnBvb2wtPmJsb2NrX2xpc3QpIHsKKwlwal9wb29sX2Jsb2NrICpwcmV2ID0gYmxvY2stPnByZXY7CisJcGpfbGlzdF9lcmFzZShibG9jayk7CisJKCpwb29sLT5mYWN0b3J5LT5wb2xpY3kuYmxvY2tfZnJlZSkocG9vbC0+ZmFjdG9yeSwgYmxvY2ssIAorCQkJCQkgICAgYmxvY2stPmVuZCAtICh1bnNpZ25lZCBjaGFyKilibG9jayk7CisJYmxvY2sgPSBwcmV2OworICAgIH0KKworICAgIGJsb2NrID0gcG9vbC0+YmxvY2tfbGlzdC5uZXh0OworCisgICAgLyogU2V0IHRoZSBzdGFydCBwb2ludGVyLCBhbGlnbmluZyBpdCBhcyBuZWVkZWQgKi8KKyAgICBibG9jay0+Y3VyID0gQUxJR05fUFRSKGJsb2NrLT5idWYsIFBKX1BPT0xfQUxJR05NRU5UKTsKKworICAgIHBvb2wtPmNhcGFjaXR5ID0gYmxvY2stPmVuZCAtICh1bnNpZ25lZCBjaGFyKilwb29sOworfQorCisvKgorICogVGhlIHB1YmxpYyBmdW5jdGlvbiB0byByZXNldCBwb29sLgorICovCitQSl9ERUYodm9pZCkgcGpfcG9vbF9yZXNldChwal9wb29sX3QgKnBvb2wpCit7CisgICAgTE9HKChwb29sLT5vYmpfbmFtZSwgInJlc2V0KCk6IGNhcD0lZCwgdXNlZD0lZCglZCUlKSIsIAorCXBvb2wtPmNhcGFjaXR5LCBwal9wb29sX2dldF91c2VkX3NpemUocG9vbCksIAorCXBqX3Bvb2xfZ2V0X3VzZWRfc2l6ZShwb29sKSoxMDAvcG9vbC0+Y2FwYWNpdHkpKTsKKworICAgIHJlc2V0X3Bvb2wocG9vbCk7Cit9CisKKy8qCisgKiBEZXN0cm95IHRoZSBwb29sLgorICovCitQSl9ERUYodm9pZCkgcGpfcG9vbF9kZXN0cm95X2ludChwal9wb29sX3QgKnBvb2wpCit7CisgICAgcGpfc2l6ZV90IGluaXRpYWxfc2l6ZTsKKworICAgIExPRygocG9vbC0+b2JqX25hbWUsICJkZXN0cm95KCk6IGNhcD0lZCwgdXNlZD0lZCglZCUlKSwgYmxvY2swPSVwLSVwIiwgCisJcG9vbC0+Y2FwYWNpdHksIHBqX3Bvb2xfZ2V0X3VzZWRfc2l6ZShwb29sKSwgCisJcGpfcG9vbF9nZXRfdXNlZF9zaXplKHBvb2wpKjEwMC9wb29sLT5jYXBhY2l0eSwKKwkoKHBqX3Bvb2xfYmxvY2sqKXBvb2wtPmJsb2NrX2xpc3QubmV4dCktPmJ1ZiwgCisJKChwal9wb29sX2Jsb2NrKilwb29sLT5ibG9ja19saXN0Lm5leHQpLT5lbmQpKTsKKworICAgIHJlc2V0X3Bvb2wocG9vbCk7CisgICAgaW5pdGlhbF9zaXplID0gKChwal9wb29sX2Jsb2NrKilwb29sLT5ibG9ja19saXN0Lm5leHQpLT5lbmQgLSAKKwkJICAgKHVuc2lnbmVkIGNoYXIqKXBvb2w7CisgICAgaWYgKHBvb2wtPmZhY3RvcnktPnBvbGljeS5ibG9ja19mcmVlKQorCSgqcG9vbC0+ZmFjdG9yeS0+cG9saWN5LmJsb2NrX2ZyZWUpKHBvb2wtPmZhY3RvcnksIHBvb2wsIGluaXRpYWxfc2l6ZSk7Cit9CisKKworI2VuZGlmCS8qIFBKX0hBU19QT09MX0FMVF9BUEkgKi8KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9wb29sX2J1Zi5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9wb29sX2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YWFlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3Bvb2xfYnVmLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qICRJZDogcG9vbF9idWYuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9wb29sX2J1Zi5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisKK3N0cnVjdCBwal9wb29sX2ZhY3Rvcnkgc3RhY2tfYmFzZWRfZmFjdG9yeTsKKworc3RydWN0IGNyZWF0aW9uX3BhcmFtCit7CisgICAgdm9pZAkqc3RhY2tfYnVmOworICAgIHBqX3NpemVfdAkgc2l6ZTsKK307CisKK3N0YXRpYyBpbnQgaXNfaW5pdGlhbGl6ZWQ7CitzdGF0aWMgbG9uZyB0bHMgPSAtMTsKK3N0YXRpYyB2b2lkKiBzdGFja19hbGxvYyhwal9wb29sX2ZhY3RvcnkgKmZhY3RvcnksIHBqX3NpemVfdCBzaXplKTsKKworc3RhdGljIHZvaWQgcG9vbF9idWZfY2xlYW51cCh2b2lkKQoreworICAgIGlmICh0bHMgIT0gLTEpIHsKKwlwal90aHJlYWRfbG9jYWxfZnJlZSh0bHMpOworCXRscyA9IC0xOworICAgIH0KKyAgICBpZiAoaXNfaW5pdGlhbGl6ZWQpCisJaXNfaW5pdGlhbGl6ZWQgPSAwOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgcG9vbF9idWZfaW5pdGlhbGl6ZSgpCit7CisgICAgcGpfYXRleGl0KCZwb29sX2J1Zl9jbGVhbnVwKTsKKworICAgIHN0YWNrX2Jhc2VkX2ZhY3RvcnkucG9saWN5LmJsb2NrX2FsbG9jID0gJnN0YWNrX2FsbG9jOworICAgIHJldHVybiBwal90aHJlYWRfbG9jYWxfYWxsb2MoJnRscyk7Cit9CisKK3N0YXRpYyB2b2lkKiBzdGFja19hbGxvYyhwal9wb29sX2ZhY3RvcnkgKmZhY3RvcnksIHBqX3NpemVfdCBzaXplKQoreworICAgIHN0cnVjdCBjcmVhdGlvbl9wYXJhbSAqcGFyYW07CisgICAgdm9pZCAqYnVmOworCisgICAgUEpfVU5VU0VEX0FSRyhmYWN0b3J5KTsKKworICAgIHBhcmFtID0gKHN0cnVjdCBjcmVhdGlvbl9wYXJhbSopIHBqX3RocmVhZF9sb2NhbF9nZXQodGxzKTsKKyAgICBpZiAocGFyYW0gPT0gTlVMTCkgeworCS8qIERvbid0IGFzc2VydCgpLCB0aGlzIGlzIG5vcm1hbCBuby1tZW1vcnkgc2l0dWF0aW9uICovCisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcGpfdGhyZWFkX2xvY2FsX3NldCh0bHMsIE5VTEwpOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihzaXplIDw9IHBhcmFtLT5zaXplLCBOVUxMKTsKKworICAgIGJ1ZiA9IHBhcmFtLT5zdGFja19idWY7CisKKyAgICAvKiBQcmV2ZW50IHRoZSBidWZmZXIgZnJvbSBiZWluZyByZXVzZWQgKi8KKyAgICBwYXJhbS0+c3RhY2tfYnVmID0gTlVMTDsKKworICAgIHJldHVybiBidWY7Cit9CisKKworUEpfREVGKHBqX3Bvb2xfdCopIHBqX3Bvb2xfY3JlYXRlX29uX2J1Zihjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgdm9pZCAqYnVmLAorCQkJCQkgcGpfc2l6ZV90IHNpemUpCit7CisjaWYgUEpfSEFTX1BPT0xfQUxUX0FQSSA9PSAwCisgICAgc3RydWN0IGNyZWF0aW9uX3BhcmFtIHBhcmFtOworICAgIHBqX3NpemVfdCBhbGlnbl9kaWZmOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihidWYgJiYgc2l6ZSwgTlVMTCk7CisKKyAgICBpZiAoIWlzX2luaXRpYWxpemVkKSB7CisJaWYgKHBvb2xfYnVmX2luaXRpYWxpemUoKSAhPSBQSl9TVUNDRVNTKQorCSAgICByZXR1cm4gTlVMTDsKKwlpc19pbml0aWFsaXplZCA9IDE7CisgICAgfQorCisgICAgLyogQ2hlY2sgYW5kIGFsaWduIGJ1ZmZlciAqLworICAgIGFsaWduX2RpZmYgPSAocGpfc2l6ZV90KWJ1ZjsKKyAgICBpZiAoYWxpZ25fZGlmZiAmIChQSl9QT09MX0FMSUdOTUVOVC0xKSkgeworCWFsaWduX2RpZmYgJj0gKFBKX1BPT0xfQUxJR05NRU5ULTEpOworCWJ1ZiA9ICh2b2lkKikgKCgoY2hhciopYnVmKSArIGFsaWduX2RpZmYpOworCXNpemUgLT0gYWxpZ25fZGlmZjsKKyAgICB9CisKKyAgICBwYXJhbS5zdGFja19idWYgPSBidWY7CisgICAgcGFyYW0uc2l6ZSA9IHNpemU7CisgICAgcGpfdGhyZWFkX2xvY2FsX3NldCh0bHMsICZwYXJhbSk7CisKKyAgICByZXR1cm4gcGpfcG9vbF9jcmVhdGVfaW50KCZzdGFja19iYXNlZF9mYWN0b3J5LCBuYW1lLCBzaXplLCAwLCAKKwkJCSAgICAgIHBqX3Bvb2xfZmFjdG9yeV9kZWZhdWx0X3BvbGljeS5jYWxsYmFjayk7CisjZWxzZQorICAgIFBKX1VOVVNFRF9BUkcoYnVmKTsKKyAgICByZXR1cm4gcGpfcG9vbF9jcmVhdGUoTlVMTCwgbmFtZSwgc2l6ZSwgc2l6ZSwgTlVMTCk7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9wb29sX2NhY2hpbmcuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovcG9vbF9jYWNoaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3ODBlMQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovcG9vbF9jYWNoaW5nLmMKQEAgLTAsMCArMSwzMzggQEAKKy8qICRJZDogcG9vbF9jYWNoaW5nLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2xvY2suaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL3Bvb2xfYnVmLmg+CisKKyNpZiAhUEpfSEFTX1BPT0xfQUxUX0FQSQorCitzdGF0aWMgcGpfcG9vbF90KiBjcG9vbF9jcmVhdGVfcG9vbChwal9wb29sX2ZhY3RvcnkgKnBmLCAKKwkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgcGpfc2l6ZV90IGluaXRpYWxfc2l6ZSwgCisJCQkJICAgIHBqX3NpemVfdCBpbmNyZW1lbnRfc3osCisJCQkJICAgIHBqX3Bvb2xfY2FsbGJhY2sgKmNhbGxiYWNrKTsKK3N0YXRpYyB2b2lkIGNwb29sX3JlbGVhc2VfcG9vbChwal9wb29sX2ZhY3RvcnkgKnBmLCBwal9wb29sX3QgKnBvb2wpOworc3RhdGljIHZvaWQgY3Bvb2xfZHVtcF9zdGF0dXMocGpfcG9vbF9mYWN0b3J5ICpmYWN0b3J5LCBwal9ib29sX3QgZGV0YWlsICk7CitzdGF0aWMgcGpfYm9vbF90IGNwb29sX29uX2Jsb2NrX2FsbG9jKHBqX3Bvb2xfZmFjdG9yeSAqZiwgcGpfc2l6ZV90IHN6KTsKK3N0YXRpYyB2b2lkIGNwb29sX29uX2Jsb2NrX2ZyZWUocGpfcG9vbF9mYWN0b3J5ICpmLCBwal9zaXplX3Qgc3opOworCisKK3N0YXRpYyBwal9zaXplX3QgcG9vbF9zaXplc1tQSl9DQUNISU5HX1BPT0xfQVJSQVlfU0laRV0gPSAKK3sKKyAgICAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgNDA5NiwgODE5MiwgMTIyODgsIDE2Mzg0LCAKKyAgICAyMDQ4MCwgMjQ1NzYsIDI4NjcyLCAzMjc2OCwgNDA5NjAsIDQ5MTUyLCA1NzM0NCwgNjU1MzYKK307CisKKy8qIEluZGV4IHdoZXJlIHRoZSBzZWFyY2ggZm9yIHNpemUgc2hvdWxkIGJlZ2luLgorICogU3RhcnQgd2l0aCBwb29sX3NpemVzWzVdLCB3aGljaCBpcyA4MTkyLgorICovCisjZGVmaW5lIFNUQVJUX1NJWkUgIDUKKworCitQSl9ERUYodm9pZCkgcGpfY2FjaGluZ19wb29sX2luaXQoIHBqX2NhY2hpbmdfcG9vbCAqY3AsIAorCQkJCSAgIGNvbnN0IHBqX3Bvb2xfZmFjdG9yeV9wb2xpY3kgKnBvbGljeSwKKwkJCQkgICBwal9zaXplX3QgbWF4X2NhcGFjaXR5KQoreworICAgIGludCBpOworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBwal9iemVybyhjcCwgc2l6ZW9mKCpjcCkpOworICAgIAorICAgIGNwLT5tYXhfY2FwYWNpdHkgPSBtYXhfY2FwYWNpdHk7CisgICAgcGpfbGlzdF9pbml0KCZjcC0+dXNlZF9saXN0KTsKKyAgICBmb3IgKGk9MDsgaTxQSl9DQUNISU5HX1BPT0xfQVJSQVlfU0laRTsgKytpKQorCXBqX2xpc3RfaW5pdCgmY3AtPmZyZWVfbGlzdFtpXSk7CisKKyAgICBpZiAocG9saWN5ID09IE5VTEwpIHsKKyAgICAJcG9saWN5ID0gJnBqX3Bvb2xfZmFjdG9yeV9kZWZhdWx0X3BvbGljeTsKKyAgICB9CisgICAgCisgICAgcGpfbWVtY3B5KCZjcC0+ZmFjdG9yeS5wb2xpY3ksIHBvbGljeSwgc2l6ZW9mKHBqX3Bvb2xfZmFjdG9yeV9wb2xpY3kpKTsKKyAgICBjcC0+ZmFjdG9yeS5jcmVhdGVfcG9vbCA9ICZjcG9vbF9jcmVhdGVfcG9vbDsKKyAgICBjcC0+ZmFjdG9yeS5yZWxlYXNlX3Bvb2wgPSAmY3Bvb2xfcmVsZWFzZV9wb29sOworICAgIGNwLT5mYWN0b3J5LmR1bXBfc3RhdHVzID0gJmNwb29sX2R1bXBfc3RhdHVzOworICAgIGNwLT5mYWN0b3J5Lm9uX2Jsb2NrX2FsbG9jID0gJmNwb29sX29uX2Jsb2NrX2FsbG9jOworICAgIGNwLT5mYWN0b3J5Lm9uX2Jsb2NrX2ZyZWUgPSAmY3Bvb2xfb25fYmxvY2tfZnJlZTsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZV9vbl9idWYoImNhY2hpbmdwb29sIiwgY3AtPnBvb2xfYnVmLCBzaXplb2YoY3AtPnBvb2xfYnVmKSk7CisgICAgcGpfbG9ja19jcmVhdGVfc2ltcGxlX211dGV4KHBvb2wsICJjYWNoaW5ncG9vbCIsICZjcC0+bG9jayk7Cit9CisKK1BKX0RFRih2b2lkKSBwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSggcGpfY2FjaGluZ19wb29sICpjcCApCit7CisgICAgaW50IGk7CisgICAgcGpfcG9vbF90ICpwb29sOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIC8qIERlbGV0ZSBhbGwgcG9vbCBpbiBmcmVlIGxpc3QgKi8KKyAgICBmb3IgKGk9MDsgaSA8IFBKX0NBQ0hJTkdfUE9PTF9BUlJBWV9TSVpFOyArK2kpIHsKKwlwal9wb29sX3QgKnBvb2wgPSAocGpfcG9vbF90KikgY3AtPmZyZWVfbGlzdFtpXS5uZXh0OworCXBqX3Bvb2xfdCAqbmV4dDsKKwlmb3IgKDsgcG9vbCAhPSAodm9pZCopJmNwLT5mcmVlX2xpc3RbaV07IHBvb2wgPSBuZXh0KSB7CisJICAgIG5leHQgPSBwb29sLT5uZXh0OworCSAgICBwal9saXN0X2VyYXNlKHBvb2wpOworCSAgICBwal9wb29sX2Rlc3Ryb3lfaW50KHBvb2wpOworCX0KKyAgICB9CisKKyAgICAvKiBEZWxldGUgYWxsIHBvb2xzIGluIHVzZWQgbGlzdCAqLworICAgIHBvb2wgPSAocGpfcG9vbF90KikgY3AtPnVzZWRfbGlzdC5uZXh0OworICAgIHdoaWxlIChwb29sICE9IChwal9wb29sX3QqKSAmY3AtPnVzZWRfbGlzdCkgeworCXBqX3Bvb2xfdCAqbmV4dCA9IHBvb2wtPm5leHQ7CisJcGpfbGlzdF9lcmFzZShwb29sKTsKKwlQSl9MT0coNCwocG9vbC0+b2JqX25hbWUsIAorCQkgICJQb29sIGlzIG5vdCByZWxlYXNlZCBieSBhcHBsaWNhdGlvbiwgcmVsZWFzaW5nIG5vdyIpKTsKKwlwal9wb29sX2Rlc3Ryb3lfaW50KHBvb2wpOworCXBvb2wgPSBuZXh0OworICAgIH0KKworICAgIGlmIChjcC0+bG9jaykgeworCXBqX2xvY2tfZGVzdHJveShjcC0+bG9jayk7CisJcGpfbG9ja19jcmVhdGVfbnVsbF9tdXRleChOVUxMLCAiY2FjaGluZ3Bvb2wiLCAmY3AtPmxvY2spOworICAgIH0KK30KKworc3RhdGljIHBqX3Bvb2xfdCogY3Bvb2xfY3JlYXRlX3Bvb2wocGpfcG9vbF9mYWN0b3J5ICpwZiwgCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIAorCQkJCQkgICAgICBwal9zaXplX3QgaW5pdGlhbF9zaXplLCAKKwkJCQkJICAgICAgcGpfc2l6ZV90IGluY3JlbWVudF9zeiwgCisJCQkJCSAgICAgIHBqX3Bvb2xfY2FsbGJhY2sgKmNhbGxiYWNrKQoreworICAgIHBqX2NhY2hpbmdfcG9vbCAqY3AgPSAocGpfY2FjaGluZ19wb29sKilwZjsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgaW50IGlkeDsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBwal9sb2NrX2FjcXVpcmUoY3AtPmxvY2spOworCisgICAgLyogVXNlIHBvb2wgZmFjdG9yeSdzIHBvbGljeSB3aGVuIGNhbGxiYWNrIGlzIE5VTEwgKi8KKyAgICBpZiAoY2FsbGJhY2sgPT0gTlVMTCkgeworCWNhbGxiYWNrID0gcGYtPnBvbGljeS5jYWxsYmFjazsKKyAgICB9CisKKyAgICAvKiBTZWFyY2ggdGhlIHN1aXRhYmxlIHNpemUgZm9yIHRoZSBwb29sLiAKKyAgICAgKiBXZSdsbCBqdXN0IGRvIGxpbmVhciBzZWFyY2ggdG8gdGhlIHNpemUgYXJyYXksIGFzIHRoZSBhcnJheSBzaXplIGl0c2VsZgorICAgICAqIGlzIG9ubHkgYSBmZXcgZWxlbWVudHMuIEJpbmFyeSBzZWFyY2ggSSBzdXNwZWN0IHdpbGwgYmUgbGVzcyBlZmZpY2llbnQKKyAgICAgKiBmb3IgdGhpcyBwdXJwb3NlLgorICAgICAqLworICAgIGlmIChpbml0aWFsX3NpemUgPD0gcG9vbF9zaXplc1tTVEFSVF9TSVpFXSkgeworCWZvciAoaWR4PVNUQVJUX1NJWkUtMTsgCisJICAgICBpZHggPj0gMCAmJiBwb29sX3NpemVzW2lkeF0gPj0gaW5pdGlhbF9zaXplOworCSAgICAgLS1pZHgpCisJICAgIDsKKwkrK2lkeDsKKyAgICB9IGVsc2UgeworCWZvciAoaWR4PVNUQVJUX1NJWkUrMTsgCisJICAgICBpZHggPCBQSl9DQUNISU5HX1BPT0xfQVJSQVlfU0laRSAmJiAKKwkJICBwb29sX3NpemVzW2lkeF0gPCBpbml0aWFsX3NpemU7CisJICAgICArK2lkeCkKKwkgICAgOworICAgIH0KKworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlcmUncyBhIHBvb2wgaW4gdGhlIGxpc3QuICovCisgICAgaWYgKGlkeD09UEpfQ0FDSElOR19QT09MX0FSUkFZX1NJWkUgfHwgcGpfbGlzdF9lbXB0eSgmY3AtPmZyZWVfbGlzdFtpZHhdKSkgeworCS8qIE5vIHBvb2wgaXMgYXZhaWxhYmxlLiAqLworCS8qIFNldCBtaW5pbXVtIHNpemUuICovCisJaWYgKGlkeCA8IFBKX0NBQ0hJTkdfUE9PTF9BUlJBWV9TSVpFKQorCSAgICBpbml0aWFsX3NpemUgPSAgcG9vbF9zaXplc1tpZHhdOworCisJLyogQ3JlYXRlIG5ldyBwb29sICovCisJcG9vbCA9IHBqX3Bvb2xfY3JlYXRlX2ludCgmY3AtPmZhY3RvcnksIG5hbWUsIGluaXRpYWxfc2l6ZSwgCisJCQkJICBpbmNyZW1lbnRfc3osIGNhbGxiYWNrKTsKKwlpZiAoIXBvb2wpIHsKKwkgICAgcGpfbG9ja19yZWxlYXNlKGNwLT5sb2NrKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCisgICAgfSBlbHNlIHsKKwkvKiBHZXQgb25lIHBvb2wgZnJvbSB0aGUgbGlzdC4gKi8KKwlwb29sID0gKHBqX3Bvb2xfdCopIGNwLT5mcmVlX2xpc3RbaWR4XS5uZXh0OworCXBqX2xpc3RfZXJhc2UocG9vbCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwb29sLiAqLworCXBqX3Bvb2xfaW5pdF9pbnQocG9vbCwgbmFtZSwgaW5jcmVtZW50X3N6LCBjYWxsYmFjayk7CisKKwkvKiBVcGRhdGUgcG9vbCBtYW5hZ2VyJ3MgZnJlZSBjYXBhY2l0eS4gKi8KKwlpZiAoY3AtPmNhcGFjaXR5ID4gcGpfcG9vbF9nZXRfY2FwYWNpdHkocG9vbCkpIHsKKwkgICAgY3AtPmNhcGFjaXR5IC09IHBqX3Bvb2xfZ2V0X2NhcGFjaXR5KHBvb2wpOworCX0gZWxzZSB7CisJICAgIGNwLT5jYXBhY2l0eSA9IDA7CisJfQorCisJUEpfTE9HKDYsIChwb29sLT5vYmpfbmFtZSwgInBvb2wgcmV1c2VkLCBzaXplPSV1IiwgcG9vbC0+Y2FwYWNpdHkpKTsKKyAgICB9CisKKyAgICAvKiBQdXQgaW4gdXNlZCBsaXN0LiAqLworICAgIHBqX2xpc3RfaW5zZXJ0X2JlZm9yZSggJmNwLT51c2VkX2xpc3QsIHBvb2wgKTsKKworICAgIC8qIE1hcmsgZmFjdG9yeSBkYXRhICovCisgICAgcG9vbC0+ZmFjdG9yeV9kYXRhID0gKHZvaWQqKSAocGpfc3NpemVfdCkgaWR4OworCisgICAgLyogSW5jcmVtZW50IHVzZWQgY291bnQuICovCisgICAgKytjcC0+dXNlZF9jb3VudDsKKworICAgIHBqX2xvY2tfcmVsZWFzZShjcC0+bG9jayk7CisgICAgcmV0dXJuIHBvb2w7Cit9CisKK3N0YXRpYyB2b2lkIGNwb29sX3JlbGVhc2VfcG9vbCggcGpfcG9vbF9mYWN0b3J5ICpwZiwgcGpfcG9vbF90ICpwb29sKQoreworICAgIHBqX2NhY2hpbmdfcG9vbCAqY3AgPSAocGpfY2FjaGluZ19wb29sKilwZjsKKyAgICBwal9zaXplX3QgcG9vbF9jYXBhY2l0eTsKKyAgICB1bnNpZ25lZCBpOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIFBKX0FTU0VSVF9PTl9GQUlMKHBmICYmIHBvb2wsIHJldHVybik7CisKKyAgICBwal9sb2NrX2FjcXVpcmUoY3AtPmxvY2spOworCisjaWYgUEpfU0FGRV9QT09MCisgICAgLyogTWFrZSBzdXJlIHBvb2wgaXMgc3RpbGwgaW4gb3VyIHVzZWQgbGlzdCAqLworICAgIGlmIChwal9saXN0X2ZpbmRfbm9kZSgmY3AtPnVzZWRfbGlzdCwgcG9vbCkgIT0gcG9vbCkgeworCXBqX2Fzc2VydCghIkF0dGVtcHQgdG8gZGVzdHJveSBwb29sIHRoYXQgaGFzIGJlZW4gZGVzdHJveWVkIGJlZm9yZSIpOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIEVyYXNlIGZyb20gdGhlIHVzZWQgbGlzdC4gKi8KKyAgICBwal9saXN0X2VyYXNlKHBvb2wpOworCisgICAgLyogRGVjcmVtZW50IHVzZWQgY291bnQuICovCisgICAgLS1jcC0+dXNlZF9jb3VudDsKKworICAgIHBvb2xfY2FwYWNpdHkgPSBwal9wb29sX2dldF9jYXBhY2l0eShwb29sKTsKKworICAgIC8qIERlc3Ryb3kgdGhlIHBvb2wgaWYgdGhlIHNpemUgaXMgZ3JlYXRlciB0aGFuIG91ciBzaXplIG9yIGlmIHRoZSB0b3RhbAorICAgICAqIGNhcGFjaXR5IGluIG91ciByZWN5Y2xlIGxpc3QgKHBsdXMgdGhlIHNpemUgb2YgdGhlIHBvb2wpIGV4Y2VlZHMgCisgICAgICogbWF4aW11bSBjYXBhY2l0eS4KKyAgIC4gKi8KKyAgICBpZiAocG9vbF9jYXBhY2l0eSA+IHBvb2xfc2l6ZXNbUEpfQ0FDSElOR19QT09MX0FSUkFZX1NJWkUtMV0gfHwKKwljcC0+Y2FwYWNpdHkgKyBwb29sX2NhcGFjaXR5ID4gY3AtPm1heF9jYXBhY2l0eSkKKyAgICB7CisJcGpfcG9vbF9kZXN0cm95X2ludChwb29sKTsKKwlwal9sb2NrX3JlbGVhc2UoY3AtPmxvY2spOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBSZXNldCBwb29sLiAqLworICAgIFBKX0xPRyg2LCAocG9vbC0+b2JqX25hbWUsICJyZWN5Y2xlKCk6IGNhcD0lZCwgdXNlZD0lZCglZCUlKSIsIAorCSAgICAgICBwb29sX2NhcGFjaXR5LCBwal9wb29sX2dldF91c2VkX3NpemUocG9vbCksIAorCSAgICAgICBwal9wb29sX2dldF91c2VkX3NpemUocG9vbCkqMTAwL3Bvb2xfY2FwYWNpdHkpKTsKKyAgICBwal9wb29sX3Jlc2V0KHBvb2wpOworCisgICAgcG9vbF9jYXBhY2l0eSA9IHBqX3Bvb2xfZ2V0X2NhcGFjaXR5KHBvb2wpOworCisgICAgLyoKKyAgICAgKiBPdGhlcndpc2UgcHV0IHRoZSBwb29sIGluIG91ciByZWN5Y2xlIGxpc3QuCisgICAgICovCisgICAgaSA9ICh1bnNpZ25lZCkgKHVuc2lnbmVkIGxvbmcpIChwal9zc2l6ZV90KSBwb29sLT5mYWN0b3J5X2RhdGE7CisKKyAgICBwal9hc3NlcnQoaTxQSl9DQUNISU5HX1BPT0xfQVJSQVlfU0laRSk7CisgICAgaWYgKGkgPj0gUEpfQ0FDSElOR19QT09MX0FSUkFZX1NJWkUgKSB7CisJLyogU29tZXRoaW5nIGhhcyBnb25lIHdyb25nIHdpdGggdGhlIHBvb2wuICovCisJcGpfcG9vbF9kZXN0cm95X2ludChwb29sKTsKKwlwal9sb2NrX3JlbGVhc2UoY3AtPmxvY2spOworCXJldHVybjsKKyAgICB9CisKKyAgICBwal9saXN0X2luc2VydF9hZnRlcigmY3AtPmZyZWVfbGlzdFtpXSwgcG9vbCk7CisgICAgY3AtPmNhcGFjaXR5ICs9IHBvb2xfY2FwYWNpdHk7CisKKyAgICBwal9sb2NrX3JlbGVhc2UoY3AtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBjcG9vbF9kdW1wX3N0YXR1cyhwal9wb29sX2ZhY3RvcnkgKmZhY3RvcnksIHBqX2Jvb2xfdCBkZXRhaWwgKQoreworI2lmIFBKX0xPR19NQVhfTEVWRUwgPj0gMworICAgIHBqX2NhY2hpbmdfcG9vbCAqY3AgPSAocGpfY2FjaGluZ19wb29sKilmYWN0b3J5OworCisgICAgcGpfbG9ja19hY3F1aXJlKGNwLT5sb2NrKTsKKworICAgIFBKX0xPRygzLCgiY2FjaHBvb2wiLCAiIER1bXBpbmcgY2FjaGluZyBwb29sOiIpKTsKKyAgICBQSl9MT0coMywoImNhY2hwb29sIiwgIiAgIENhcGFjaXR5PSV1LCBtYXhfY2FwYWNpdHk9JXUsIHVzZWRfY250PSV1IiwgXAorCQkJICAgICBjcC0+Y2FwYWNpdHksIGNwLT5tYXhfY2FwYWNpdHksIGNwLT51c2VkX2NvdW50KSk7CisgICAgaWYgKGRldGFpbCkgeworCXBqX3Bvb2xfdCAqcG9vbCA9IChwal9wb29sX3QqKSBjcC0+dXNlZF9saXN0Lm5leHQ7CisJcGpfc2l6ZV90IHRvdGFsX3VzZWQgPSAwLCB0b3RhbF9jYXBhY2l0eSA9IDA7CisgICAgICAgIFBKX0xPRygzLCgiY2FjaHBvb2wiLCAiICBEdW1waW5nIGFsbCBhY3RpdmUgcG9vbHM6IikpOworCXdoaWxlIChwb29sICE9ICh2b2lkKikmY3AtPnVzZWRfbGlzdCkgeworCSAgICBwal9zaXplX3QgcG9vbF9jYXBhY2l0eSA9IHBqX3Bvb2xfZ2V0X2NhcGFjaXR5KHBvb2wpOworCSAgICBQSl9MT0coMywoImNhY2hwb29sIiwgIiAgICUxNnM6ICU4ZCBvZiAlOGQgKCVkJSUpIHVzZWQiLCAKKwkJCQkgIHBqX3Bvb2xfZ2V0b2JqbmFtZShwb29sKSwgCisJCQkJICBwal9wb29sX2dldF91c2VkX3NpemUocG9vbCksIAorCQkJCSAgcG9vbF9jYXBhY2l0eSwKKwkJCQkgIHBqX3Bvb2xfZ2V0X3VzZWRfc2l6ZShwb29sKSoxMDAvcG9vbF9jYXBhY2l0eSkpOworCSAgICB0b3RhbF91c2VkICs9IHBqX3Bvb2xfZ2V0X3VzZWRfc2l6ZShwb29sKTsKKwkgICAgdG90YWxfY2FwYWNpdHkgKz0gcG9vbF9jYXBhY2l0eTsKKwkgICAgcG9vbCA9IHBvb2wtPm5leHQ7CisJfQorCWlmICh0b3RhbF9jYXBhY2l0eSkgeworCSAgICBQSl9MT0coMywoImNhY2hwb29sIiwgIiAgVG90YWwgJTlkIG9mICU5ZCAoJWQgJSUpIHVzZWQhIiwKKwkJCQkgIHRvdGFsX3VzZWQsIHRvdGFsX2NhcGFjaXR5LAorCQkJCSAgdG90YWxfdXNlZCAqIDEwMCAvIHRvdGFsX2NhcGFjaXR5KSk7CisJfQorICAgIH0KKworICAgIHBqX2xvY2tfcmVsZWFzZShjcC0+bG9jayk7CisjZWxzZQorICAgIFBKX1VOVVNFRF9BUkcoZmFjdG9yeSk7CisgICAgUEpfVU5VU0VEX0FSRyhkZXRhaWwpOworI2VuZGlmCit9CisKKworc3RhdGljIHBqX2Jvb2xfdCBjcG9vbF9vbl9ibG9ja19hbGxvYyhwal9wb29sX2ZhY3RvcnkgKmYsIHBqX3NpemVfdCBzeikKK3sKKyAgICBwal9jYWNoaW5nX3Bvb2wgKmNwID0gKHBqX2NhY2hpbmdfcG9vbCopZjsKKworICAgIC8vQ2FuJ3QgbG9jayBiZWNhdXNlIG11dGV4IGlzIG5vdCByZWN1cnNpdmUKKyAgICAvL2lmIChjcC0+bXV0ZXgpIHBqX211dGV4X2xvY2soY3AtPm11dGV4KTsKKworICAgIGNwLT51c2VkX3NpemUgKz0gc3o7CisgICAgaWYgKGNwLT51c2VkX3NpemUgPiBjcC0+cGVha191c2VkX3NpemUpCisJY3AtPnBlYWtfdXNlZF9zaXplID0gY3AtPnVzZWRfc2l6ZTsKKworICAgIC8vaWYgKGNwLT5tdXRleCkgcGpfbXV0ZXhfdW5sb2NrKGNwLT5tdXRleCk7CisKKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworCitzdGF0aWMgdm9pZCBjcG9vbF9vbl9ibG9ja19mcmVlKHBqX3Bvb2xfZmFjdG9yeSAqZiwgcGpfc2l6ZV90IHN6KQoreworICAgIHBqX2NhY2hpbmdfcG9vbCAqY3AgPSAocGpfY2FjaGluZ19wb29sKilmOworCisgICAgLy9wal9tdXRleF9sb2NrKGNwLT5tdXRleCk7CisgICAgY3AtPnVzZWRfc2l6ZSAtPSBzejsKKyAgICAvL3BqX211dGV4X3VubG9jayhjcC0+bXV0ZXgpOworfQorCisKKyNlbmRpZgkvKiBQSl9IQVNfUE9PTF9BTFRfQVBJICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovcG9vbF9kYmcuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovcG9vbF9kYmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJkMzZlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9wb29sX2RiZy5jCkBAIC0wLDAgKzEsMTkxIEBACisvKiAkSWQ6IHBvb2xfZGJnLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorCisjaWYgUEpfSEFTX1BPT0xfQUxUX0FQSQorCisjaWYgUEpfSEFTX01BTExPQ19ICisjICAgaW5jbHVkZSA8bWFsbG9jLmg+CisjZW5kaWYKKworCisjaWYgUEpfSEFTX1NURExJQl9ICisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworCisjaWYgKChkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMiE9MCkgfHwgXAorICAgICAoZGVmaW5lZChQSl9XSU42NCkgJiYgUEpfV0lONjQgIT0gMCkpICYmIFwKKyAgICAgZGVmaW5lZChQSl9ERUJVRykgJiYgUEpfREVCVUchPTAgJiYgIVBKX05BVElWRV9TVFJJTkdfSVNfVU5JQ09ERQorIyAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgICBkZWZpbmUgVFJBQ0VfKG1zZykJT3V0cHV0RGVidWdTdHJpbmcobXNnKQorI2VuZGlmCisKKy8qIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSBUUkFDRV8gKi8KKy8vI3VuZGVmIFRSQUNFXworCisKKworaW50IFBKX05PX01FTU9SWV9FWENFUFRJT047CisKKworUEpfREVGKGludCkgcGpfTk9fTUVNT1JZX0VYQ0VQVElPTigpCit7CisgICAgcmV0dXJuIFBKX05PX01FTU9SWV9FWENFUFRJT047Cit9CisKKy8qIENyZWF0ZSBwb29sICovCitQSl9ERUYocGpfcG9vbF90KikgcGpfcG9vbF9jcmVhdGVfaW1wKCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKwkJCQkgICAgICAgdm9pZCAqZmFjdG9yeSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICAgcGpfc2l6ZV90IGluaXRpYWxfc2l6ZSwKKwkJCQkgICAgICAgcGpfc2l6ZV90IGluY3JlbWVudF9zaXplLAorCQkJCSAgICAgICBwal9wb29sX2NhbGxiYWNrICpjYWxsYmFjaykKK3sKKyAgICBwal9wb29sX3QgKnBvb2w7CisKKyAgICBQSl9VTlVTRURfQVJHKGZpbGUpOworICAgIFBKX1VOVVNFRF9BUkcobGluZSk7CisgICAgUEpfVU5VU0VEX0FSRyhmYWN0b3J5KTsKKyAgICBQSl9VTlVTRURfQVJHKGluaXRpYWxfc2l6ZSk7CisgICAgUEpfVU5VU0VEX0FSRyhpbmNyZW1lbnRfc2l6ZSk7CisKKyAgICBwb29sID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGpfcG9vbF90KSk7CisgICAgaWYgKCFwb29sKQorCXJldHVybiBOVUxMOworCisgICAgaWYgKG5hbWUpIHsKKwlwal9hbnNpX3N0cm5jcHkocG9vbC0+b2JqX25hbWUsIG5hbWUsIHNpemVvZihwb29sLT5vYmpfbmFtZSkpOworCXBvb2wtPm9ial9uYW1lW3NpemVvZihwb29sLT5vYmpfbmFtZSktMV0gPSAnXDAnOworICAgIH0gZWxzZSB7CisJc3RyY3B5KHBvb2wtPm9ial9uYW1lLCAiYWx0cG9vbCIpOworICAgIH0KKworICAgIHBvb2wtPmZhY3RvcnkgPSBOVUxMOworICAgIHBvb2wtPmZpcnN0X21lbSA9IE5VTEw7CisgICAgcG9vbC0+dXNlZF9zaXplID0gMDsKKyAgICBwb29sLT5jYiA9IGNhbGxiYWNrOworCisgICAgcmV0dXJuIHBvb2w7Cit9CisKKworLyogUmVsZWFzZSBwb29sICovCitQSl9ERUYodm9pZCkgcGpfcG9vbF9yZWxlYXNlX2ltcChwal9wb29sX3QgKnBvb2wpCit7CisgICAgcGpfcG9vbF9yZXNldChwb29sKTsKKyAgICBmcmVlKHBvb2wpOworfQorCisvKiBHZXQgcG9vbCBuYW1lICovCitQSl9ERUYoY29uc3QgY2hhciopIHBqX3Bvb2xfZ2V0b2JqbmFtZV9pbXAocGpfcG9vbF90ICpwb29sKQoreworICAgIFBKX1VOVVNFRF9BUkcocG9vbCk7CisgICAgcmV0dXJuICJwb29sZGJnIjsKK30KKworLyogUmVzZXQgcG9vbCAqLworUEpfREVGKHZvaWQpIHBqX3Bvb2xfcmVzZXRfaW1wKHBqX3Bvb2xfdCAqcG9vbCkKK3sKKyAgICBzdHJ1Y3QgcGpfcG9vbF9tZW0gKm1lbTsKKworICAgIG1lbSA9IHBvb2wtPmZpcnN0X21lbTsKKyAgICB3aGlsZSAobWVtKSB7CisJc3RydWN0IHBqX3Bvb2xfbWVtICpuZXh0ID0gbWVtLT5uZXh0OworCWZyZWUobWVtKTsKKwltZW0gPSBuZXh0OworICAgIH0KKworICAgIHBvb2wtPmZpcnN0X21lbSA9IE5VTEw7Cit9CisKKy8qIEdldCBjYXBhY2l0eSAqLworUEpfREVGKHBqX3NpemVfdCkgcGpfcG9vbF9nZXRfY2FwYWNpdHlfaW1wKHBqX3Bvb2xfdCAqcG9vbCkKK3sKKyAgICBQSl9VTlVTRURfQVJHKHBvb2wpOworCisgICAgLyogVW5saW1pdGVkIGNhcGFjaXR5ICovCisgICAgcmV0dXJuIDB4N0ZGRkZGRkZVTDsKK30KKworLyogR2V0IHRvdGFsIHVzZWQgc2l6ZSAqLworUEpfREVGKHBqX3NpemVfdCkgcGpfcG9vbF9nZXRfdXNlZF9zaXplX2ltcChwal9wb29sX3QgKnBvb2wpCit7CisgICAgcmV0dXJuIHBvb2wtPnVzZWRfc2l6ZTsKK30KKworLyogQWxsb2NhdGUgbWVtb3J5IGZyb20gdGhlIHBvb2wgKi8KK1BKX0RFRih2b2lkKikgcGpfcG9vbF9hbGxvY19pbXAoIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCAKKwkJCQkgcGpfcG9vbF90ICpwb29sLCBwal9zaXplX3Qgc3opCit7CisgICAgc3RydWN0IHBqX3Bvb2xfbWVtICptZW07CisKKyAgICBQSl9VTlVTRURfQVJHKGZpbGUpOworICAgIFBKX1VOVVNFRF9BUkcobGluZSk7CisKKyAgICBtZW0gPSBtYWxsb2Moc3ogKyBzaXplb2Yoc3RydWN0IHBqX3Bvb2xfbWVtKSk7CisgICAgaWYgKCFtZW0pIHsKKwlpZiAocG9vbC0+Y2IpCisJICAgICgqcG9vbC0+Y2IpKHBvb2wsIHN6KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZW0tPm5leHQgPSBwb29sLT5maXJzdF9tZW07CisgICAgcG9vbC0+Zmlyc3RfbWVtID0gbWVtOworCisjaWZkZWYgVFJBQ0VfCisgICAgeworCWNoYXIgbXNnWzEyMF07CisJcGpfYW5zaV9zcHJpbnRmKG1zZywgIk1lbSAlWCAoJWQrJWQgYnl0ZXMpIGFsbG9jYXRlZCBieSAlczolZFxyXG4iLAorCQkJbWVtLCBzeiwgc2l6ZW9mKHN0cnVjdCBwal9wb29sX21lbSksIAorCQkJZmlsZSwgbGluZSk7CisJVFJBQ0VfKG1zZyk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gKChjaGFyKiltZW0pICsgc2l6ZW9mKHN0cnVjdCBwal9wb29sX21lbSk7Cit9CisKKy8qIEFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBwb29sIGFuZCB6ZXJvIHRoZSBtZW1vcnkgKi8KK1BKX0RFRih2b2lkKikgcGpfcG9vbF9jYWxsb2NfaW1wKCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgCisJCQkJICBwal9wb29sX3QgKnBvb2wsIHVuc2lnbmVkIGNudCwgCisJCQkJICB1bnNpZ25lZCBlbGVtc3opCit7CisgICAgdm9pZCAqbWVtOworCisgICAgbWVtID0gcGpfcG9vbF9hbGxvY19pbXAoZmlsZSwgbGluZSwgcG9vbCwgY250KmVsZW1zeik7CisgICAgaWYgKCFtZW0pCisJcmV0dXJuIE5VTEw7CisKKyAgICBwal9iemVybyhtZW0sIGNudCplbGVtc3opOworICAgIHJldHVybiBtZW07Cit9CisKKy8qIEFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBwb29sIGFuZCB6ZXJvIHRoZSBtZW1vcnkgKi8KK1BKX0RFRih2b2lkKikgcGpfcG9vbF96YWxsb2NfaW1wKCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgCisJCQkJICBwal9wb29sX3QgKnBvb2wsIHBqX3NpemVfdCBzeikKK3sKKyAgICByZXR1cm4gcGpfcG9vbF9jYWxsb2NfaW1wKGZpbGUsIGxpbmUsIHBvb2wsIDEsIHN6KTsgCit9CisKKworCisjZW5kaWYJLyogUEpfSEFTX1BPT0xfQUxUX0FQSSAqLwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9wb29sX3BvbGljeV9rbWFsbG9jLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3Bvb2xfcG9saWN5X2ttYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjVlYzcwCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9wb29sX3BvbGljeV9rbWFsbG9jLmMKQEAgLTAsMCArMSw2NCBAQAorLyogJElkOiBwb29sX3BvbGljeV9rbWFsbG9jLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovZXhjZXB0Lmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKworCitzdGF0aWMgdm9pZCAqZGVmYXVsdF9ibG9ja19hbGxvYyhwal9wb29sX2ZhY3RvcnkgKmZhY3RvcnksIHBqX3NpemVfdCBzaXplKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfVU5VU0VEX0FSRyhmYWN0b3J5KTsKKworICAgIHJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworfQorCitzdGF0aWMgdm9pZCBkZWZhdWx0X2Jsb2NrX2ZyZWUocGpfcG9vbF9mYWN0b3J5ICpmYWN0b3J5LCAKKwkJCSAgICAgICB2b2lkICptZW0sIHBqX3NpemVfdCBzaXplKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfVU5VU0VEX0FSRyhmYWN0b3J5KTsKKyAgICBQSl9VTlVTRURfQVJHKHNpemUpOworCisgICAga2ZyZWUobWVtKTsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9wb29sX2NhbGxiYWNrKHBqX3Bvb2xfdCAqcG9vbCwgcGpfc2l6ZV90IHNpemUpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9VTlVTRURfQVJHKHBvb2wpOworICAgIFBKX1VOVVNFRF9BUkcoc2l6ZSk7CisKKyAgICBQSl9USFJPVyhQSl9OT19NRU1PUllfRVhDRVBUSU9OKTsKK30KKworcGpfcG9vbF9mYWN0b3J5X3BvbGljeSBwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3kgPSAKK3sKKyAgICAmZGVmYXVsdF9ibG9ja19hbGxvYywKKyAgICAmZGVmYXVsdF9ibG9ja19mcmVlLAorICAgICZkZWZhdWx0X3Bvb2xfY2FsbGJhY2ssCisgICAgMAorfTsKKworUEpfREVGKGNvbnN0IHBqX3Bvb2xfZmFjdG9yeV9wb2xpY3kqKSBwal9wb29sX2ZhY3RvcnlfZ2V0X2RlZmF1bHRfcG9saWN5KHZvaWQpCit7CisgICAgcmV0dXJuICZwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3k7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovcG9vbF9wb2xpY3lfbWFsbG9jLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3Bvb2xfcG9saWN5X21hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmE5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3Bvb2xfcG9saWN5X21hbGxvYy5jCkBAIC0wLDAgKzEsMTA0IEBACisvKiAkSWQ6IHBvb2xfcG9saWN5X21hbGxvYy5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL2V4Y2VwdC5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L21hbGxvYy5oPgorCisjaWYgIVBKX0hBU19QT09MX0FMVF9BUEkKKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBwb29sIGRlZmF1bHQgcG9saWN5IGRlZmluaXRpb24gYW5kIGltcGxlbWVudGF0aW9uLgorICovCisjaW5jbHVkZSAicG9vbF9zaWduYXR1cmUuaCIKKworCitzdGF0aWMgdm9pZCAqZGVmYXVsdF9ibG9ja19hbGxvYyhwal9wb29sX2ZhY3RvcnkgKmZhY3RvcnksIHBqX3NpemVfdCBzaXplKQoreworICAgIHZvaWQgKnA7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgaWYgKGZhY3RvcnktPm9uX2Jsb2NrX2FsbG9jKSB7CisJaW50IHJjOworCXJjID0gZmFjdG9yeS0+b25fYmxvY2tfYWxsb2MoZmFjdG9yeSwgc2l6ZSk7CisJaWYgKCFyYykKKwkgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcCA9IG1hbGxvYyhzaXplKyhTSUdfU0laRSA8PCAxKSk7CisKKyAgICBpZiAocCA9PSBOVUxMKSB7CisJaWYgKGZhY3RvcnktPm9uX2Jsb2NrX2ZyZWUpIAorCSAgICBmYWN0b3J5LT5vbl9ibG9ja19mcmVlKGZhY3RvcnksIHNpemUpOworICAgIH0gZWxzZSB7CisJLyogQXBwbHkgc2lnbmF0dXJlIHdoZW4gUEpfU0FGRV9QT09MIGlzIHNldC4gSXQgd2lsbCBtb3ZlCisJICogInAiIHBvaW50ZXIgZm9yd2FyZC4KKwkgKi8KKwlBUFBMWV9TSUcocCwgc2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfYmxvY2tfZnJlZShwal9wb29sX2ZhY3RvcnkgKmZhY3RvcnksIHZvaWQgKm1lbSwgCisJCQkgICAgICAgcGpfc2l6ZV90IHNpemUpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIGlmIChmYWN0b3J5LT5vbl9ibG9ja19mcmVlKSAKKyAgICAgICAgZmFjdG9yeS0+b25fYmxvY2tfZnJlZShmYWN0b3J5LCBzaXplKTsKKworICAgIC8qIENoZWNrIGFuZCByZW1vdmUgc2lnbmF0dXJlIHdoZW4gUEpfU0FGRV9QT09MIGlzIHNldC4gSXQgd2lsbAorICAgICAqIG1vdmUgIm1lbSIgcG9pbnRlciBiYWNrd2FyZC4KKyAgICAgKi8KKyAgICBSRU1PVkVfU0lHKG1lbSwgc2l6ZSk7CisKKyAgICAvKiBOb3RlIHRoYXQgd2hlbiBQSl9TQUZFX1BPT0wgaXMgc2V0LCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGJsb2NrCisgICAgICogaXMgc2l6ZSArIFNJR19TSVpFKjIuCisgICAgICovCisKKyAgICBmcmVlKG1lbSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfcG9vbF9jYWxsYmFjayhwal9wb29sX3QgKnBvb2wsIHBqX3NpemVfdCBzaXplKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfVU5VU0VEX0FSRyhwb29sKTsKKyAgICBQSl9VTlVTRURfQVJHKHNpemUpOworCisgICAgUEpfVEhST1coUEpfTk9fTUVNT1JZX0VYQ0VQVElPTik7Cit9CisKK1BKX0RFRl9EQVRBKHBqX3Bvb2xfZmFjdG9yeV9wb2xpY3kpIHBqX3Bvb2xfZmFjdG9yeV9kZWZhdWx0X3BvbGljeSA9Cit7CisgICAgJmRlZmF1bHRfYmxvY2tfYWxsb2MsCisgICAgJmRlZmF1bHRfYmxvY2tfZnJlZSwKKyAgICAmZGVmYXVsdF9wb29sX2NhbGxiYWNrLAorICAgIDAKK307CisKK1BKX0RFRihjb25zdCBwal9wb29sX2ZhY3RvcnlfcG9saWN5KikgcGpfcG9vbF9mYWN0b3J5X2dldF9kZWZhdWx0X3BvbGljeSh2b2lkKQoreworICAgIHJldHVybiAmcGpfcG9vbF9mYWN0b3J5X2RlZmF1bHRfcG9saWN5OworfQorCisKKyNlbmRpZgkvKiBQSl9IQVNfUE9PTF9BTFRfQVBJICovCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3Bvb2xfcG9saWN5X25ldy5jcHAgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3Bvb2xfcG9saWN5X25ldy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5ZWI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovcG9vbF9wb2xpY3lfbmV3LmNwcApAQCAtMCwwICsxLDEwMiBAQAorLyogJElkOiBwb29sX3BvbGljeV9uZXcuY3BwIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL2V4Y2VwdC5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisKKyNpZiAhUEpfSEFTX1BPT0xfQUxUX0FQSQorCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHBvb2wgZGVmYXVsdCBwb2xpY3kgZGVmaW5pdGlvbiBhbmQgaW1wbGVtZW50YXRpb24uCisgKi8KKyNpbmNsdWRlICJwb29sX3NpZ25hdHVyZS5oIgorIAorCitzdGF0aWMgdm9pZCAqb3BlcmF0b3JfbmV3KHBqX3Bvb2xfZmFjdG9yeSAqZmFjdG9yeSwgcGpfc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqbWVtOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIGlmIChmYWN0b3J5LT5vbl9ibG9ja19hbGxvYykgeworCQlpbnQgcmM7CisJCXJjID0gZmFjdG9yeS0+b25fYmxvY2tfYWxsb2MoZmFjdG9yeSwgc2l6ZSk7CisJCWlmICghcmMpCisJCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgbWVtID0gKHZvaWQqKSBuZXcgY2hhcltzaXplKyhTSUdfU0laRSA8PCAxKV07CisgICAgCisgICAgLyogRXhjZXB0aW9uIGZvciBuZXcgb3BlcmF0b3IgbWF5IGJlIGRpc2FibGVkLCBzby4uICovCisgICAgaWYgKG1lbSkgeworCS8qIEFwcGx5IHNpZ25hdHVyZSB3aGVuIFBKX1NBRkVfUE9PTCBpcyBzZXQuIEl0IHdpbGwgbW92ZQorCSAqICJtZW0iIHBvaW50ZXIgZm9yd2FyZC4KKwkgKi8KKwlBUFBMWV9TSUcobWVtLCBzaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZCBvcGVyYXRvcl9kZWxldGUocGpfcG9vbF9mYWN0b3J5ICpmYWN0b3J5LCB2b2lkICptZW0sIHBqX3NpemVfdCBzaXplKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBpZiAoZmFjdG9yeS0+b25fYmxvY2tfZnJlZSkgCisgICAgICAgIGZhY3RvcnktPm9uX2Jsb2NrX2ZyZWUoZmFjdG9yeSwgc2l6ZSk7CisgICAgCisgICAgLyogQ2hlY2sgYW5kIHJlbW92ZSBzaWduYXR1cmUgd2hlbiBQSl9TQUZFX1BPT0wgaXMgc2V0LiBJdCB3aWxsCisgICAgICogbW92ZSAibWVtIiBwb2ludGVyIGJhY2t3YXJkLgorICAgICAqLworICAgIFJFTU9WRV9TSUcobWVtLCBzaXplKTsKKworICAgIC8qIE5vdGUgdGhhdCB3aGVuIFBKX1NBRkVfUE9PTCBpcyBzZXQsIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgYmxvY2sKKyAgICAgKiBpcyBzaXplICsgU0lHX1NJWkUqMi4KKyAgICAgKi8KKworICAgIGNoYXIgKnAgPSAoY2hhciopbWVtOworICAgIGRlbGV0ZSBbXSBwOworfQorCitzdGF0aWMgdm9pZCBkZWZhdWx0X3Bvb2xfY2FsbGJhY2socGpfcG9vbF90ICpwb29sLCBwal9zaXplX3Qgc2l6ZSkKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX1VOVVNFRF9BUkcocG9vbCk7CisgICAgUEpfVU5VU0VEX0FSRyhzaXplKTsKKworICAgIFBKX1RIUk9XKFBKX05PX01FTU9SWV9FWENFUFRJT04pOworfQorCitQSl9ERUZfREFUQShwal9wb29sX2ZhY3RvcnlfcG9saWN5KSBwal9wb29sX2ZhY3RvcnlfZGVmYXVsdF9wb2xpY3kgPSAKK3sKKyAgICAmb3BlcmF0b3JfbmV3LAorICAgICZvcGVyYXRvcl9kZWxldGUsCisgICAgJmRlZmF1bHRfcG9vbF9jYWxsYmFjaywKKyAgICAwCit9OworCitQSl9ERUYoY29uc3QgcGpfcG9vbF9mYWN0b3J5X3BvbGljeSopIHBqX3Bvb2xfZmFjdG9yeV9nZXRfZGVmYXVsdF9wb2xpY3kodm9pZCkKK3sKKyAgICByZXR1cm4gJnBqX3Bvb2xfZmFjdG9yeV9kZWZhdWx0X3BvbGljeTsKK30KKworIAorI2VuZGlmCS8qIFBKX0hBU19QT09MX0FMVF9BUEkgKi8KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9wb29sX3NpZ25hdHVyZS5oIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9wb29sX3NpZ25hdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMGQ0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3Bvb2xfc2lnbmF0dXJlLmgKQEAgLTAsMCArMSw2OCBAQAorLyogJElkOiBwb29sX3NpZ25hdHVyZS5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisKKyNpZiBQSl9TQUZFX1BPT0wKKyMgICBkZWZpbmUgU0lHX1NJWkUJCXNpemVvZihwal91aW50MzJfdCkKKworc3RhdGljIHZvaWQgYXBwbHlfc2lnbmF0dXJlKHZvaWQgKnAsIHBqX3NpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkIGNoZWNrX3Bvb2xfc2lnbmF0dXJlKHZvaWQgKnAsIHBqX3NpemVfdCBzaXplKTsKKworIyAgIGRlZmluZSBBUFBMWV9TSUcocCxzeikJYXBwbHlfc2lnbmF0dXJlKHAsc3opLCBcCisJCQkJcD0odm9pZCopKCgoY2hhciopcCkrU0lHX1NJWkUpCisjICAgZGVmaW5lIFJFTU9WRV9TSUcocCxzeikJY2hlY2tfcG9vbF9zaWduYXR1cmUocCxzeiksIFwKKwkJCQlwPSh2b2lkKikoKChjaGFyKilwKS1TSUdfU0laRSkKKworIyAgIGRlZmluZSBTSUdfQkVHSU4JICAgIDB4NjAwREMwREUKKyMgICBkZWZpbmUgU0lHX0VORAkgICAgMHgwQkFEQzBERQorCitzdGF0aWMgdm9pZCBhcHBseV9zaWduYXR1cmUodm9pZCAqcCwgcGpfc2l6ZV90IHNpemUpCit7CisgICAgcGpfdWludDMyX3Qgc2lnOworCisgICAgc2lnID0gU0lHX0JFR0lOOworICAgIHBqX21lbWNweShwLCAmc2lnLCBTSUdfU0laRSk7CisKKyAgICBzaWcgPSBTSUdfRU5EOworICAgIHBqX21lbWNweSgoKGNoYXIqKXApK1NJR19TSVpFK3NpemUsICZzaWcsIFNJR19TSVpFKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfcG9vbF9zaWduYXR1cmUodm9pZCAqcCwgcGpfc2l6ZV90IHNpemUpCit7CisgICAgcGpfdWludDMyX3Qgc2lnOworICAgIHBqX3VpbnQ4X3QgKm1lbSA9IChwal91aW50OF90KilwOworCisgICAgLyogQ2hlY2sgdGhhdCBzaWduYXR1cmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBpcyBzdGlsbCBpbnRhY3QgKi8KKyAgICBzaWcgPSBTSUdfQkVHSU47CisgICAgcGpfYXNzZXJ0KCFwal9tZW1jbXAobWVtLVNJR19TSVpFLCAmc2lnLCBTSUdfU0laRSkpOworCisgICAgLyogQ2hlY2sgdGhhdCBzaWduYXR1cmUgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2sgaXMgc3RpbGwgaW50YWN0LgorICAgICAqIE5vdGUgdGhhdCAibWVtIiBoYXMgYmVlbiBpbmNyZW1lbnRlZCBieSBTSUdfU0laRSAKKyAgICAgKi8KKyAgICBzaWcgPSBTSUdfRU5EOworICAgIHBqX2Fzc2VydCghcGpfbWVtY21wKG1lbStzaXplLCAmc2lnLCBTSUdfU0laRSkpOworfQorCisjZWxzZQorIyAgIGRlZmluZSBTSUdfU0laRQkgICAgMAorIyAgIGRlZmluZSBBUFBMWV9TSUcocCxzeikKKyMgICBkZWZpbmUgUkVNT1ZFX1NJRyhwLHN6KQorI2VuZGlmCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3JhbmQuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovcmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YmFkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3JhbmQuYwpAQCAtMCwwICsxLDM1IEBACisvKiAkSWQ6IHJhbmQuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3JhbmQuaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL2NvbXBhdC9yYW5kLmg+CisKK1BKX0RFRih2b2lkKSBwal9zcmFuZCh1bnNpZ25lZCBpbnQgc2VlZCkKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIHBsYXRmb3JtX3NyYW5kKHNlZWQpOworfQorCitQSl9ERUYoaW50KSBwal9yYW5kKHZvaWQpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICByZXR1cm4gcGxhdGZvcm1fcmFuZCgpOworfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3JidHJlZS5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9yYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2M5NzdlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9yYnRyZWUuYwpAQCAtMCwwICsxLDQyOCBAQAorLyogJElkOiByYnRyZWUuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3JidHJlZS5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisKK3N0YXRpYyB2b2lkIGxlZnRfcm90YXRlKCBwal9yYnRyZWUgKnRyZWUsIHBqX3JidHJlZV9ub2RlICpub2RlICkgCit7CisgICAgcGpfcmJ0cmVlX25vZGUgKnJub2RlLCAqcGFyZW50OworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHJub2RlID0gbm9kZS0+cmlnaHQ7CisgICAgaWYgKHJub2RlID09IHRyZWUtPm51bGwpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBub2RlLT5yaWdodCA9IHJub2RlLT5sZWZ0OworICAgIGlmIChybm9kZS0+bGVmdCAhPSB0cmVlLT5udWxsKQorICAgICAgICBybm9kZS0+bGVmdC0+cGFyZW50ID0gbm9kZTsKKyAgICBwYXJlbnQgPSBub2RlLT5wYXJlbnQ7CisgICAgcm5vZGUtPnBhcmVudCA9IHBhcmVudDsKKyAgICBpZiAocGFyZW50ICE9IHRyZWUtPm51bGwpIHsKKyAgICAgICAgaWYgKHBhcmVudC0+bGVmdCA9PSBub2RlKQorCSAgIHBhcmVudC0+bGVmdCA9IHJub2RlOworICAgICAgICBlbHNlCisJICAgcGFyZW50LT5yaWdodCA9IHJub2RlOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyZWUtPnJvb3QgPSBybm9kZTsKKyAgICB9CisgICAgcm5vZGUtPmxlZnQgPSBub2RlOworICAgIG5vZGUtPnBhcmVudCA9IHJub2RlOworfQorCitzdGF0aWMgdm9pZCByaWdodF9yb3RhdGUoIHBqX3JidHJlZSAqdHJlZSwgcGpfcmJ0cmVlX25vZGUgKm5vZGUgKSAKK3sKKyAgICBwal9yYnRyZWVfbm9kZSAqbG5vZGUsICpwYXJlbnQ7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgbG5vZGUgPSBub2RlLT5sZWZ0OworICAgIGlmIChsbm9kZSA9PSB0cmVlLT5udWxsKQorICAgICAgICByZXR1cm47CisKKyAgICBub2RlLT5sZWZ0ID0gbG5vZGUtPnJpZ2h0OworICAgIGlmIChsbm9kZS0+cmlnaHQgIT0gdHJlZS0+bnVsbCkKKwlsbm9kZS0+cmlnaHQtPnBhcmVudCA9IG5vZGU7CisgICAgcGFyZW50ID0gbm9kZS0+cGFyZW50OworICAgIGxub2RlLT5wYXJlbnQgPSBwYXJlbnQ7CisKKyAgICBpZiAocGFyZW50ICE9IHRyZWUtPm51bGwpIHsKKyAgICAgICAgaWYgKHBhcmVudC0+bGVmdCA9PSBub2RlKQorCSAgICBwYXJlbnQtPmxlZnQgPSBsbm9kZTsKKwllbHNlCisJICAgIHBhcmVudC0+cmlnaHQgPSBsbm9kZTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmVlLT5yb290ID0gbG5vZGU7CisgICAgfQorICAgIGxub2RlLT5yaWdodCA9IG5vZGU7CisgICAgbm9kZS0+cGFyZW50ID0gbG5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9maXh1cCggcGpfcmJ0cmVlICp0cmVlLCBwal9yYnRyZWVfbm9kZSAqbm9kZSApIAoreworICAgIHBqX3JidHJlZV9ub2RlICp0ZW1wLCAqcGFyZW50OworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHdoaWxlIChub2RlICE9IHRyZWUtPnJvb3QgJiYgbm9kZS0+cGFyZW50LT5jb2xvciA9PSBQSl9SQkNPTE9SX1JFRCkgeworICAgICAgICBwYXJlbnQgPSBub2RlLT5wYXJlbnQ7CisgICAgICAgIGlmIChwYXJlbnQgPT0gcGFyZW50LT5wYXJlbnQtPmxlZnQpIHsKKwkgICAgdGVtcCA9IHBhcmVudC0+cGFyZW50LT5yaWdodDsKKwkgICAgaWYgKHRlbXAtPmNvbG9yID09IFBKX1JCQ09MT1JfUkVEKSB7CisJICAgICAgICB0ZW1wLT5jb2xvciA9IFBKX1JCQ09MT1JfQkxBQ0s7CisJICAgICAgICBub2RlID0gcGFyZW50OworCSAgICAgICAgbm9kZS0+Y29sb3IgPSBQSl9SQkNPTE9SX0JMQUNLOworCSAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudDsKKwkgICAgICAgIG5vZGUtPmNvbG9yID0gUEpfUkJDT0xPUl9SRUQ7CisJICAgIH0gZWxzZSB7CisJICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQtPnJpZ2h0KSB7CisJCSAgIG5vZGUgPSBwYXJlbnQ7CisJCSAgIGxlZnRfcm90YXRlKHRyZWUsIG5vZGUpOworCSAgICAgICAgfQorCSAgICAgICAgdGVtcCA9IG5vZGUtPnBhcmVudDsKKwkgICAgICAgIHRlbXAtPmNvbG9yID0gUEpfUkJDT0xPUl9CTEFDSzsKKwkgICAgICAgIHRlbXAgPSB0ZW1wLT5wYXJlbnQ7CisJICAgICAgICB0ZW1wLT5jb2xvciA9IFBKX1JCQ09MT1JfUkVEOworCSAgICAgICAgcmlnaHRfcm90YXRlKCB0cmVlLCB0ZW1wKTsKKwkgICAgfQorICAgICAgICB9IGVsc2UgeworCSAgICB0ZW1wID0gcGFyZW50LT5wYXJlbnQtPmxlZnQ7CisJICAgIGlmICh0ZW1wLT5jb2xvciA9PSBQSl9SQkNPTE9SX1JFRCkgeworCSAgICAgICAgdGVtcC0+Y29sb3IgPSBQSl9SQkNPTE9SX0JMQUNLOworCSAgICAgICAgbm9kZSA9IHBhcmVudDsKKwkgICAgICAgIG5vZGUtPmNvbG9yID0gUEpfUkJDT0xPUl9CTEFDSzsKKwkgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CisJICAgICAgICBub2RlLT5jb2xvciA9IFBKX1JCQ09MT1JfUkVEOworCSAgICB9IGVsc2UgeworCSAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50LT5sZWZ0KSB7CisJCSAgICBub2RlID0gcGFyZW50OworCQkgICAgcmlnaHRfcm90YXRlKHRyZWUsIG5vZGUpOworCSAgICAgICAgfQorCSAgICAgICAgdGVtcCA9IG5vZGUtPnBhcmVudDsKKwkgICAgICAgIHRlbXAtPmNvbG9yID0gUEpfUkJDT0xPUl9CTEFDSzsKKwkgICAgICAgIHRlbXAgPSB0ZW1wLT5wYXJlbnQ7CisJICAgICAgICB0ZW1wLT5jb2xvciA9IFBKX1JCQ09MT1JfUkVEOworCSAgICAgICAgbGVmdF9yb3RhdGUodHJlZSwgdGVtcCk7CisJICAgfQorICAgICAgICB9CisgICAgfQorCQorICAgIHRyZWUtPnJvb3QtPmNvbG9yID0gUEpfUkJDT0xPUl9CTEFDSzsKK30KKworCitzdGF0aWMgdm9pZCBkZWxldGVfZml4dXAoIHBqX3JidHJlZSAqdHJlZSwgcGpfcmJ0cmVlX25vZGUgKm5vZGUgKQoreworICAgIHBqX3JidHJlZV9ub2RlICp0ZW1wOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHdoaWxlIChub2RlICE9IHRyZWUtPnJvb3QgJiYgbm9kZS0+Y29sb3IgPT0gUEpfUkJDT0xPUl9CTEFDSykgeworICAgICAgICBpZiAobm9kZS0+cGFyZW50LT5sZWZ0ID09IG5vZGUpIHsKKwkgICAgdGVtcCA9IG5vZGUtPnBhcmVudC0+cmlnaHQ7CisJICAgIGlmICh0ZW1wLT5jb2xvciA9PSBQSl9SQkNPTE9SX1JFRCkgeworCSAgICAgICAgdGVtcC0+Y29sb3IgPSBQSl9SQkNPTE9SX0JMQUNLOworCSAgICAgICAgbm9kZS0+cGFyZW50LT5jb2xvciA9IFBKX1JCQ09MT1JfUkVEOworCSAgICAgICAgbGVmdF9yb3RhdGUodHJlZSwgbm9kZS0+cGFyZW50KTsKKwkgICAgICAgIHRlbXAgPSBub2RlLT5wYXJlbnQtPnJpZ2h0OworCSAgICB9CisJICAgIGlmICh0ZW1wLT5sZWZ0LT5jb2xvciA9PSBQSl9SQkNPTE9SX0JMQUNLICYmIAorCSAgICAgICAgdGVtcC0+cmlnaHQtPmNvbG9yID09IFBKX1JCQ09MT1JfQkxBQ0spIAorCSAgICB7CisJICAgICAgICB0ZW1wLT5jb2xvciA9IFBKX1JCQ09MT1JfUkVEOworCSAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudDsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIGlmICh0ZW1wLT5yaWdodC0+Y29sb3IgPT0gUEpfUkJDT0xPUl9CTEFDSykgeworCQkgICAgdGVtcC0+bGVmdC0+Y29sb3IgPSBQSl9SQkNPTE9SX0JMQUNLOworCQkgICAgdGVtcC0+Y29sb3IgPSBQSl9SQkNPTE9SX1JFRDsKKwkJICAgIHJpZ2h0X3JvdGF0ZSggdHJlZSwgdGVtcCk7CisJCSAgICB0ZW1wID0gbm9kZS0+cGFyZW50LT5yaWdodDsKKwkgICAgICAgIH0KKwkgICAgICAgIHRlbXAtPmNvbG9yID0gbm9kZS0+cGFyZW50LT5jb2xvcjsKKwkgICAgICAgIHRlbXAtPnJpZ2h0LT5jb2xvciA9IFBKX1JCQ09MT1JfQkxBQ0s7CisJICAgICAgICBub2RlLT5wYXJlbnQtPmNvbG9yID0gUEpfUkJDT0xPUl9CTEFDSzsKKwkgICAgICAgIGxlZnRfcm90YXRlKHRyZWUsIG5vZGUtPnBhcmVudCk7CisJICAgICAgICBub2RlID0gdHJlZS0+cm9vdDsKKwkgICAgfQorICAgICAgICB9IGVsc2UgeworCSAgICB0ZW1wID0gbm9kZS0+cGFyZW50LT5sZWZ0OworCSAgICBpZiAodGVtcC0+Y29sb3IgPT0gUEpfUkJDT0xPUl9SRUQpIHsKKwkgICAgICAgIHRlbXAtPmNvbG9yID0gUEpfUkJDT0xPUl9CTEFDSzsKKwkgICAgICAgIG5vZGUtPnBhcmVudC0+Y29sb3IgPSBQSl9SQkNPTE9SX1JFRDsKKwkgICAgICAgIHJpZ2h0X3JvdGF0ZSggdHJlZSwgbm9kZS0+cGFyZW50KTsKKwkgICAgICAgIHRlbXAgPSBub2RlLT5wYXJlbnQtPmxlZnQ7CisJICAgIH0KKwkgICAgaWYgKHRlbXAtPnJpZ2h0LT5jb2xvciA9PSBQSl9SQkNPTE9SX0JMQUNLICYmIAorCQl0ZW1wLT5sZWZ0LT5jb2xvciA9PSBQSl9SQkNPTE9SX0JMQUNLKSAKKwkgICAgeworCSAgICAgICAgdGVtcC0+Y29sb3IgPSBQSl9SQkNPTE9SX1JFRDsKKwkgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CisJICAgIH0gZWxzZSB7CisJICAgICAgICBpZiAodGVtcC0+bGVmdC0+Y29sb3IgPT0gUEpfUkJDT0xPUl9CTEFDSykgeworCQkgICAgdGVtcC0+cmlnaHQtPmNvbG9yID0gUEpfUkJDT0xPUl9CTEFDSzsKKwkJICAgIHRlbXAtPmNvbG9yID0gUEpfUkJDT0xPUl9SRUQ7CisJCSAgICBsZWZ0X3JvdGF0ZSggdHJlZSwgdGVtcCk7CisJCSAgICB0ZW1wID0gbm9kZS0+cGFyZW50LT5sZWZ0OworCSAgICAgICAgfQorCSAgICAgICAgdGVtcC0+Y29sb3IgPSBub2RlLT5wYXJlbnQtPmNvbG9yOworCSAgICAgICAgbm9kZS0+cGFyZW50LT5jb2xvciA9IFBKX1JCQ09MT1JfQkxBQ0s7CisJICAgICAgICB0ZW1wLT5sZWZ0LT5jb2xvciA9IFBKX1JCQ09MT1JfQkxBQ0s7CisJICAgICAgICByaWdodF9yb3RhdGUodHJlZSwgbm9kZS0+cGFyZW50KTsKKwkgICAgICAgIG5vZGUgPSB0cmVlLT5yb290OworCSAgICB9CisgICAgICAgIH0KKyAgICB9CisJCisgICAgbm9kZS0+Y29sb3IgPSBQSl9SQkNPTE9SX0JMQUNLOworfQorCisKK1BKX0RFRih2b2lkKSBwal9yYnRyZWVfaW5pdCggcGpfcmJ0cmVlICp0cmVlLCBwal9yYnRyZWVfY29tcCAqY29tcCApCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHRyZWUtPm51bGwgPSB0cmVlLT5yb290ID0gJnRyZWUtPm51bGxfbm9kZTsKKyAgICB0cmVlLT5udWxsLT5rZXkgPSBOVUxMOworICAgIHRyZWUtPm51bGwtPnVzZXJfZGF0YSA9IE5VTEw7CisgICAgdHJlZS0+c2l6ZSA9IDA7CisgICAgdHJlZS0+bnVsbC0+bGVmdCA9IHRyZWUtPm51bGwtPnJpZ2h0ID0gdHJlZS0+bnVsbC0+cGFyZW50ID0gdHJlZS0+bnVsbDsKKyAgICB0cmVlLT5udWxsLT5jb2xvciA9IFBKX1JCQ09MT1JfQkxBQ0s7CisgICAgdHJlZS0+Y29tcCA9IGNvbXA7Cit9CisKK1BKX0RFRihwal9yYnRyZWVfbm9kZSopIHBqX3JidHJlZV9maXJzdCggcGpfcmJ0cmVlICp0cmVlICkKK3sKKyAgICByZWdpc3RlciBwal9yYnRyZWVfbm9kZSAqbm9kZSA9IHRyZWUtPnJvb3Q7CisgICAgcmVnaXN0ZXIgcGpfcmJ0cmVlX25vZGUgKm51bGwgPSB0cmVlLT5udWxsOworICAgIAorICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICB3aGlsZSAobm9kZS0+bGVmdCAhPSBudWxsKQorCW5vZGUgPSBub2RlLT5sZWZ0OworICAgIHJldHVybiBub2RlICE9IG51bGwgPyBub2RlIDogTlVMTDsKK30KKworUEpfREVGKHBqX3JidHJlZV9ub2RlKikgcGpfcmJ0cmVlX2xhc3QoIHBqX3JidHJlZSAqdHJlZSApCit7CisgICAgcmVnaXN0ZXIgcGpfcmJ0cmVlX25vZGUgKm5vZGUgPSB0cmVlLT5yb290OworICAgIHJlZ2lzdGVyIHBqX3JidHJlZV9ub2RlICpudWxsID0gdHJlZS0+bnVsbDsKKyAgICAKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgd2hpbGUgKG5vZGUtPnJpZ2h0ICE9IG51bGwpCisJbm9kZSA9IG5vZGUtPnJpZ2h0OworICAgIHJldHVybiBub2RlICE9IG51bGwgPyBub2RlIDogTlVMTDsKK30KKworUEpfREVGKHBqX3JidHJlZV9ub2RlKikgcGpfcmJ0cmVlX25leHQoIHBqX3JidHJlZSAqdHJlZSwgCisJCQkJCXJlZ2lzdGVyIHBqX3JidHJlZV9ub2RlICpub2RlICkKK3sKKyAgICByZWdpc3RlciBwal9yYnRyZWVfbm9kZSAqbnVsbCA9IHRyZWUtPm51bGw7CisgICAgCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIGlmIChub2RlLT5yaWdodCAhPSBudWxsKSB7CisJZm9yIChub2RlPW5vZGUtPnJpZ2h0OyBub2RlLT5sZWZ0IT1udWxsOyBub2RlID0gbm9kZS0+bGVmdCkKKwkgICAgLyogdm9pZCAqLzsKKyAgICB9IGVsc2UgeworICAgICAgICByZWdpc3RlciBwal9yYnRyZWVfbm9kZSAqdGVtcCA9IG5vZGUtPnBhcmVudDsKKyAgICAgICAgd2hpbGUgKHRlbXAhPW51bGwgJiYgdGVtcC0+cmlnaHQ9PW5vZGUpIHsKKwkgICAgbm9kZSA9IHRlbXA7CisJICAgIHRlbXAgPSB0ZW1wLT5wYXJlbnQ7CisJfQorCW5vZGUgPSB0ZW1wOworICAgIH0gICAgCisgICAgcmV0dXJuIG5vZGUgIT0gbnVsbCA/IG5vZGUgOiBOVUxMOworfQorCitQSl9ERUYocGpfcmJ0cmVlX25vZGUqKSBwal9yYnRyZWVfcHJldiggcGpfcmJ0cmVlICp0cmVlLCAKKwkJCQkJcmVnaXN0ZXIgcGpfcmJ0cmVlX25vZGUgKm5vZGUgKQoreworICAgIHJlZ2lzdGVyIHBqX3JidHJlZV9ub2RlICpudWxsID0gdHJlZS0+bnVsbDsKKyAgICAKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgaWYgKG5vZGUtPmxlZnQgIT0gbnVsbCkgeworICAgICAgICBmb3IgKG5vZGU9bm9kZS0+bGVmdDsgbm9kZS0+cmlnaHQhPW51bGw7IG5vZGU9bm9kZS0+cmlnaHQpCisJICAgLyogdm9pZCAqLzsKKyAgICB9IGVsc2UgeworICAgICAgICByZWdpc3RlciBwal9yYnRyZWVfbm9kZSAqdGVtcCA9IG5vZGUtPnBhcmVudDsKKyAgICAgICAgd2hpbGUgKHRlbXAhPW51bGwgJiYgdGVtcC0+bGVmdD09bm9kZSkgeworCSAgICBub2RlID0gdGVtcDsKKwkgICAgdGVtcCA9IHRlbXAtPnBhcmVudDsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gdGVtcDsKKyAgICB9ICAgIAorICAgIHJldHVybiBub2RlICE9IG51bGwgPyBub2RlIDogTlVMTDsKK30KKworUEpfREVGKGludCkgcGpfcmJ0cmVlX2luc2VydCggcGpfcmJ0cmVlICp0cmVlLCAKKwkJCSAgICAgIHBqX3JidHJlZV9ub2RlICplbGVtZW50ICkKK3sKKyAgICBpbnQgcnYgPSAwOworICAgIHBqX3JidHJlZV9ub2RlICpub2RlLCAqcGFyZW50ID0gdHJlZS0+bnVsbCwgCisJCSAgICpudWxsID0gdHJlZS0+bnVsbDsKKyAgICBwal9yYnRyZWVfY29tcCAqY29tcCA9IHRyZWUtPmNvbXA7CisJCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIG5vZGUgPSB0cmVlLT5yb290OwkKKyAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7CisgICAgICAgIHJ2ID0gKCpjb21wKShlbGVtZW50LT5rZXksIG5vZGUtPmtleSk7CisgICAgICAgIGlmIChydiA9PSAwKSB7CisJICAgIC8qIGZvdW5kIG1hdGNoLCBpLmUuIGVudHJ5IHdpdGggZXF1YWwga2V5IGFscmVhZHkgZXhpc3QgKi8KKwkgICAgcmV0dXJuIC0xOworCX0gICAgCisJcGFyZW50ID0gbm9kZTsKKyAgICAgICAgbm9kZSA9IHJ2IDwgMCA/IG5vZGUtPmxlZnQgOiBub2RlLT5yaWdodDsKKyAgICB9CisKKyAgICBlbGVtZW50LT5jb2xvciA9IFBKX1JCQ09MT1JfUkVEOworICAgIGVsZW1lbnQtPmxlZnQgPSBlbGVtZW50LT5yaWdodCA9IG51bGw7CisKKyAgICBub2RlID0gZWxlbWVudDsKKyAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgbm9kZS0+cGFyZW50ID0gcGFyZW50OworICAgICAgICBpZiAocnYgPCAwKQorCSAgIHBhcmVudC0+bGVmdCA9IG5vZGU7CisgICAgICAgIGVsc2UKKwkgICBwYXJlbnQtPnJpZ2h0ID0gbm9kZTsKKyAgICAgICAgaW5zZXJ0X2ZpeHVwKCB0cmVlLCBub2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmVlLT5yb290ID0gbm9kZTsKKyAgICAgICAgbm9kZS0+cGFyZW50ID0gbnVsbDsKKyAgICAgICAgbm9kZS0+Y29sb3IgPSBQSl9SQkNPTE9SX0JMQUNLOworICAgIH0KKwkKKyAgICArK3RyZWUtPnNpemU7CisgICAgcmV0dXJuIDA7Cit9CisKKworUEpfREVGKHBqX3JidHJlZV9ub2RlKikgcGpfcmJ0cmVlX2ZpbmQoIHBqX3JidHJlZSAqdHJlZSwKKwkJCQkJY29uc3Qgdm9pZCAqa2V5ICkKK3sKKyAgICBpbnQgcnY7CisgICAgcGpfcmJ0cmVlX25vZGUgKm5vZGUgPSB0cmVlLT5yb290OworICAgIHBqX3JidHJlZV9ub2RlICpudWxsID0gdHJlZS0+bnVsbDsKKyAgICBwal9yYnRyZWVfY29tcCAqY29tcCA9IHRyZWUtPmNvbXA7CisgICAgCisgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICBydiA9ICgqY29tcCkoa2V5LCBub2RlLT5rZXkpOworICAgICAgICBpZiAocnYgPT0gMCkKKwkgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIG5vZGUgPSBydiA8IDAgPyBub2RlLT5sZWZ0IDogbm9kZS0+cmlnaHQ7CisgICAgfQorICAgIHJldHVybiBub2RlICE9IG51bGwgPyBub2RlIDogTlVMTDsKK30KKworUEpfREVGKHBqX3JidHJlZV9ub2RlKikgcGpfcmJ0cmVlX2VyYXNlKCBwal9yYnRyZWUgKnRyZWUsCisJCQkJCSBwal9yYnRyZWVfbm9kZSAqbm9kZSApCit7CisgICAgcGpfcmJ0cmVlX25vZGUgKnN1Y2M7CisgICAgcGpfcmJ0cmVlX25vZGUgKm51bGwgPSB0cmVlLT5udWxsOworICAgIHBqX3JidHJlZV9ub2RlICpjaGlsZDsKKyAgICBwal9yYnRyZWVfbm9kZSAqcGFyZW50OworICAgIAorICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBpZiAobm9kZS0+bGVmdCA9PSBudWxsIHx8IG5vZGUtPnJpZ2h0ID09IG51bGwpIHsKKyAgICAgICAgc3VjYyA9IG5vZGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChzdWNjPW5vZGUtPnJpZ2h0OyBzdWNjLT5sZWZ0IT1udWxsOyBzdWNjPXN1Y2MtPmxlZnQpCisJICAgLyogdm9pZCAqLzsKKyAgICB9CisKKyAgICBjaGlsZCA9IHN1Y2MtPmxlZnQgIT0gbnVsbCA/IHN1Y2MtPmxlZnQgOiBzdWNjLT5yaWdodDsKKyAgICBwYXJlbnQgPSBzdWNjLT5wYXJlbnQ7CisgICAgY2hpbGQtPnBhcmVudCA9IHBhcmVudDsKKyAgICAKKyAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKwlpZiAocGFyZW50LT5sZWZ0ID09IHN1Y2MpCisJICAgIHBhcmVudC0+bGVmdCA9IGNoaWxkOworICAgICAgICBlbHNlCisJICAgcGFyZW50LT5yaWdodCA9IGNoaWxkOworICAgIH0gZWxzZQorICAgICAgICB0cmVlLT5yb290ID0gY2hpbGQ7CisKKyAgICBpZiAoc3VjYyAhPSBub2RlKSB7CisgICAgICAgIHN1Y2MtPnBhcmVudCA9IG5vZGUtPnBhcmVudDsKKyAgICAgICAgc3VjYy0+bGVmdCA9IG5vZGUtPmxlZnQ7CisgICAgICAgIHN1Y2MtPnJpZ2h0ID0gbm9kZS0+cmlnaHQ7CisgICAgICAgIHN1Y2MtPmNvbG9yID0gbm9kZS0+Y29sb3I7CisKKyAgICAgICAgcGFyZW50ID0gbm9kZS0+cGFyZW50OworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKwkgICBpZiAocGFyZW50LT5sZWZ0PT1ub2RlKQorCSAgICAgICAgcGFyZW50LT5sZWZ0PXN1Y2M7CisJICAgZWxzZQorCQlwYXJlbnQtPnJpZ2h0PXN1Y2M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUtPmxlZnQgIT0gbnVsbCkKKwkgICBub2RlLT5sZWZ0LT5wYXJlbnQgPSBzdWNjOzsKKyAgICAgICAgaWYgKG5vZGUtPnJpZ2h0ICE9IG51bGwpCisJICAgIG5vZGUtPnJpZ2h0LT5wYXJlbnQgPSBzdWNjOworCisgICAgICAgIGlmICh0cmVlLT5yb290ID09IG5vZGUpCisJICAgdHJlZS0+cm9vdCA9IHN1Y2M7CisgICAgfQorCisgICAgaWYgKHN1Y2MtPmNvbG9yID09IFBKX1JCQ09MT1JfQkxBQ0spIHsKKwlpZiAoY2hpbGQgIT0gbnVsbCkgCisJICAgIGRlbGV0ZV9maXh1cCh0cmVlLCBjaGlsZCk7CisgICAgICAgIHRyZWUtPm51bGwtPmNvbG9yID0gUEpfUkJDT0xPUl9CTEFDSzsKKyAgICB9CisKKyAgICAtLXRyZWUtPnNpemU7CisgICAgcmV0dXJuIG5vZGU7Cit9CisKKworUEpfREVGKHVuc2lnbmVkKSBwal9yYnRyZWVfbWF4X2hlaWdodCggcGpfcmJ0cmVlICp0cmVlLAorCQkJCSAgICAgICBwal9yYnRyZWVfbm9kZSAqbm9kZSApCit7CisgICAgdW5zaWduZWQgbCwgcjsKKyAgICAKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgaWYgKG5vZGU9PU5VTEwpIAorCW5vZGUgPSB0cmVlLT5yb290OworICAgIAorICAgIGwgPSBub2RlLT5sZWZ0ICE9IHRyZWUtPm51bGwgPyBwal9yYnRyZWVfbWF4X2hlaWdodCh0cmVlLG5vZGUtPmxlZnQpKzEgOiAwOworICAgIHIgPSBub2RlLT5yaWdodCAhPSB0cmVlLT5udWxsID8gcGpfcmJ0cmVlX21heF9oZWlnaHQodHJlZSxub2RlLT5yaWdodCkrMSA6IDA7CisgICAgcmV0dXJuIGwgPiByID8gbCA6IHI7Cit9CisKK1BKX0RFRih1bnNpZ25lZCkgcGpfcmJ0cmVlX21pbl9oZWlnaHQoIHBqX3JidHJlZSAqdHJlZSwKKwkJCQkgICAgICAgcGpfcmJ0cmVlX25vZGUgKm5vZGUgKQoreworICAgIHVuc2lnbmVkIGwsIHI7CisgICAgCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIGlmIChub2RlPT1OVUxMKSAKKwlub2RlPXRyZWUtPnJvb3Q7CisgICAgCisgICAgbCA9IChub2RlLT5sZWZ0ICE9IHRyZWUtPm51bGwpID8gcGpfcmJ0cmVlX21heF9oZWlnaHQodHJlZSxub2RlLT5sZWZ0KSsxIDogMDsKKyAgICByID0gKG5vZGUtPnJpZ2h0ICE9IHRyZWUtPm51bGwpID8gcGpfcmJ0cmVlX21heF9oZWlnaHQodHJlZSxub2RlLT5yaWdodCkrMSA6IDA7CisgICAgcmV0dXJuIGwgPiByID8gciA6IGw7Cit9CisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX2JzZC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX2JzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDdkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NvY2tfYnNkLmMKQEAgLTAsMCArMSw4NTAgQEAKKy8qICRJZDogc29ja19ic2QuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9zb2NrLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc29ja2V0Lmg+CisjaW5jbHVkZSA8cGovYWRkcl9yZXNvbHYuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL3VuaWNvZGUuaD4KKworLyoKKyAqIEFkZHJlc3MgZmFtaWxpZXMgY29udmVyc2lvbi4KKyAqIFRoZSB2YWx1ZXMgaGVyZSBhcmUgaW5kZXhlZCBiYXNlZCBvbiBwal9hZGRyX2ZhbWlseS4KKyAqLworY29uc3QgcGpfdWludDE2X3QgUEpfQUZfVU5TUEVDCT0gQUZfVU5TUEVDOworY29uc3QgcGpfdWludDE2X3QgUEpfQUZfVU5JWAk9IEFGX1VOSVg7Citjb25zdCBwal91aW50MTZfdCBQSl9BRl9JTkVUCT0gQUZfSU5FVDsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0FGX0lORVQ2CT0gQUZfSU5FVDY7CisjaWZkZWYgQUZfUEFDS0VUCitjb25zdCBwal91aW50MTZfdCBQSl9BRl9QQUNLRVQJPSBBRl9QQUNLRVQ7CisjZWxzZQorY29uc3QgcGpfdWludDE2X3QgUEpfQUZfUEFDS0VUCT0gMHhGRkZGOworI2VuZGlmCisjaWZkZWYgQUZfSVJEQQorY29uc3QgcGpfdWludDE2X3QgUEpfQUZfSVJEQQk9IEFGX0lSREE7CisjZWxzZQorY29uc3QgcGpfdWludDE2X3QgUEpfQUZfSVJEQQk9IDB4RkZGRjsKKyNlbmRpZgorCisvKgorICogU29ja2V0IHR5cGVzIGNvbnZlcnNpb24uCisgKiBUaGUgdmFsdWVzIGhlcmUgYXJlIGluZGV4ZWQgYmFzZWQgb24gcGpfc29ja190eXBlCisgKi8KK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPQ0tfU1RSRUFNPSBTT0NLX1NUUkVBTTsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPQ0tfREdSQU0JPSBTT0NLX0RHUkFNOworY29uc3QgcGpfdWludDE2X3QgUEpfU09DS19SQVcJPSBTT0NLX1JBVzsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPQ0tfUkRNCT0gU09DS19SRE07CisKKy8qCisgKiBTb2NrZXQgbGV2ZWwgdmFsdWVzLgorICovCitjb25zdCBwal91aW50MTZfdCBQSl9TT0xfU09DS0VUCT0gU09MX1NPQ0tFVDsKKyNpZmRlZiBTT0xfSVAKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9JUAk9IFNPTF9JUDsKKyNlbGlmIChkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMikgfHwgKGRlZmluZWQoUEpfV0lONjQpICYmIFBKX1dJTjY0KSAKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9JUAk9IElQUFJPVE9fSVA7CisjZWxzZQorY29uc3QgcGpfdWludDE2X3QgUEpfU09MX0lQCT0gMDsKKyNlbmRpZiAvKiBTT0xfSVAgKi8KKworI2lmIGRlZmluZWQoU09MX1RDUCkKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9UQ1AJPSBTT0xfVENQOworI2VsaWYgZGVmaW5lZChJUFBST1RPX1RDUCkKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9UQ1AJPSBJUFBST1RPX1RDUDsKKyNlbGlmIChkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMikgfHwgKGRlZmluZWQoUEpfV0lONjQpICYmIFBKX1dJTjY0KQorY29uc3QgcGpfdWludDE2X3QgUEpfU09MX1RDUAk9IElQUFJPVE9fVENQOworI2Vsc2UKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9UQ1AJPSA2OworI2VuZGlmIC8qIFNPTF9UQ1AgKi8KKworI2lmZGVmIFNPTF9VRFAKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9VRFAJPSBTT0xfVURQOworI2VsaWYgZGVmaW5lZChJUFBST1RPX1VEUCkKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9VRFAJPSBJUFBST1RPX1VEUDsKKyNlbGlmIChkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMikgfHwgKGRlZmluZWQoUEpfV0lONjQpICYmIFBKX1dJTjY0KQorY29uc3QgcGpfdWludDE2X3QgUEpfU09MX1VEUAk9IElQUFJPVE9fVURQOworI2Vsc2UKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9VRFAJPSAxNzsKKyNlbmRpZiAvKiBTT0xfVURQICovCisKKyNpZmRlZiBTT0xfSVBWNgorY29uc3QgcGpfdWludDE2X3QgUEpfU09MX0lQVjYJPSBTT0xfSVBWNjsKKyNlbGlmIChkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMikgfHwgKGRlZmluZWQoUEpfV0lONjQpICYmIFBKX1dJTjY0KQorIyAgIGlmIGRlZmluZWQoSVBQUk9UT19JUFY2KSB8fCAoX1dJTjMyX1dJTk5UID49IDB4MDUwMSkKKwljb25zdCBwal91aW50MTZfdCBQSl9TT0xfSVBWNgk9IElQUFJPVE9fSVBWNjsKKyMgICBlbHNlCisJY29uc3QgcGpfdWludDE2X3QgUEpfU09MX0lQVjYJPSA0MTsKKyMgICBlbmRpZgorI2Vsc2UKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9JUFY2CT0gNDE7CisjZW5kaWYgLyogU09MX0lQVjYgKi8KKworLyogSVBfVE9TICovCisjaWZkZWYgSVBfVE9TCitjb25zdCBwal91aW50MTZfdCBQSl9JUF9UT1MJPSBJUF9UT1M7CisjZWxzZQorY29uc3QgcGpfdWludDE2X3QgUEpfSVBfVE9TCT0gMTsKKyNlbmRpZgorCisKKy8qIFRPUyBzZXR0aW5ncyAoZGVjbGFyZWQgaW4gbmV0aW5ldC9pcC5oKSAqLworI2lmZGVmIElQVE9TX0xPV0RFTEFZCitjb25zdCBwal91aW50MTZfdCBQSl9JUFRPU19MT1dERUxBWQk9IElQVE9TX0xPV0RFTEFZOworI2Vsc2UKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQVE9TX0xPV0RFTEFZCT0gMHgxMDsKKyNlbmRpZgorI2lmZGVmIElQVE9TX1RIUk9VR0hQVVQKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQVE9TX1RIUk9VR0hQVVQJPSBJUFRPU19USFJPVUdIUFVUOworI2Vsc2UKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQVE9TX1RIUk9VR0hQVVQJPSAweDA4OworI2VuZGlmCisjaWZkZWYgSVBUT1NfUkVMSUFCSUxJVFkKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQVE9TX1JFTElBQklMSVRZCT0gSVBUT1NfUkVMSUFCSUxJVFk7CisjZWxzZQorY29uc3QgcGpfdWludDE2X3QgUEpfSVBUT1NfUkVMSUFCSUxJVFkJPSAweDA0OworI2VuZGlmCisjaWZkZWYgSVBUT1NfTUlOQ09TVAorY29uc3QgcGpfdWludDE2X3QgUEpfSVBUT1NfTUlOQ09TVAk9IElQVE9TX01JTkNPU1Q7CisjZWxzZQorY29uc3QgcGpfdWludDE2X3QgUEpfSVBUT1NfTUlOQ09TVAk9IDB4MDI7CisjZW5kaWYKKworCisvKiBvcHRuYW1lIHZhbHVlcy4gKi8KK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPX1RZUEUgICAgPSBTT19UWVBFOworY29uc3QgcGpfdWludDE2X3QgUEpfU09fUkNWQlVGICA9IFNPX1JDVkJVRjsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPX1NOREJVRiAgPSBTT19TTkRCVUY7Citjb25zdCBwal91aW50MTZfdCBQSl9UQ1BfTk9ERUxBWT0gVENQX05PREVMQVk7Citjb25zdCBwal91aW50MTZfdCBQSl9TT19SRVVTRUFERFI9IFNPX1JFVVNFQUREUjsKKyNpZmRlZiBTT19OT1NJR1BJUEUKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPX05PU0lHUElQRSA9IFNPX05PU0lHUElQRTsKKyNlbHNlCitjb25zdCBwal91aW50MTZfdCBQSl9TT19OT1NJR1BJUEUgPSAweEZGRkY7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNPX1BSSU9SSVRZKQorY29uc3QgcGpfdWludDE2X3QgUEpfU09fUFJJT1JJVFkgPSBTT19QUklPUklUWTsKKyNlbHNlCisvKiBUaGlzIGlzIGZyb20gTGludXgsIFlNTVYgKi8KK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPX1BSSU9SSVRZID0gMTI7CisjZW5kaWYKKworLyogTXVsdGljYXN0aW5nIGlzIG5vdCBzdXBwb3J0ZWQgZS5nLiBpbiBQb2NrZXRQQyAyMDAzIFNESyAqLworI2lmZGVmIElQX01VTFRJQ0FTVF9JRgorY29uc3QgcGpfdWludDE2X3QgUEpfSVBfTVVMVElDQVNUX0lGICAgID0gSVBfTVVMVElDQVNUX0lGOworY29uc3QgcGpfdWludDE2X3QgUEpfSVBfTVVMVElDQVNUX1RUTCAgID0gSVBfTVVMVElDQVNUX1RUTDsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQX01VTFRJQ0FTVF9MT09QICA9IElQX01VTFRJQ0FTVF9MT09QOworY29uc3QgcGpfdWludDE2X3QgUEpfSVBfQUREX01FTUJFUlNISVAgID0gSVBfQUREX01FTUJFUlNISVA7Citjb25zdCBwal91aW50MTZfdCBQSl9JUF9EUk9QX01FTUJFUlNISVAgPSBJUF9EUk9QX01FTUJFUlNISVA7CisjZWxzZQorY29uc3QgcGpfdWludDE2X3QgUEpfSVBfTVVMVElDQVNUX0lGICAgID0gMHhGRkZGOworY29uc3QgcGpfdWludDE2X3QgUEpfSVBfTVVMVElDQVNUX1RUTCAgID0gMHhGRkZGOworY29uc3QgcGpfdWludDE2X3QgUEpfSVBfTVVMVElDQVNUX0xPT1AgID0gMHhGRkZGOworY29uc3QgcGpfdWludDE2X3QgUEpfSVBfQUREX01FTUJFUlNISVAgID0gMHhGRkZGOworY29uc3QgcGpfdWludDE2X3QgUEpfSVBfRFJPUF9NRU1CRVJTSElQID0gMHhGRkZGOworI2VuZGlmCisKKy8qIHJlY3YoKSBhbmQgc2VuZCgpIGZsYWdzICovCitjb25zdCBpbnQgUEpfTVNHX09PQgkJPSBNU0dfT09COworY29uc3QgaW50IFBKX01TR19QRUVLCQk9IE1TR19QRUVLOworY29uc3QgaW50IFBKX01TR19ET05UUk9VVEUJPSBNU0dfRE9OVFJPVVRFOworCisKKyNpZiAwCitzdGF0aWMgdm9pZCBDSEVDS19BRERSX0xFTihjb25zdCBwal9zb2NrYWRkciAqYWRkciwgaW50IGxlbikKK3sKKyAgICBwal9zb2NrYWRkciAqYSA9IChwal9zb2NrYWRkciopYWRkcjsKKyAgICBwal9hc3NlcnQoKGEtPmFkZHIuc2FfZmFtaWx5PT1QSl9BRl9JTkVUICYmIGxlbj09c2l6ZW9mKHBqX3NvY2thZGRyX2luKSkgfHwKKwkgICAgICAoYS0+YWRkci5zYV9mYW1pbHk9PVBKX0FGX0lORVQ2ICYmIGxlbj09c2l6ZW9mKHBqX3NvY2thZGRyX2luNikpKTsKKworfQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0tfQUREUl9MRU4oYWRkcixsZW4pCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgMTYtYml0IHZhbHVlIGZyb20gbmV0d29yayBieXRlIG9yZGVyIHRvIGhvc3QgYnl0ZSBvcmRlci4KKyAqLworUEpfREVGKHBqX3VpbnQxNl90KSBwal9udG9ocyhwal91aW50MTZfdCBuZXRzaG9ydCkKK3sKKyAgICByZXR1cm4gbnRvaHMobmV0c2hvcnQpOworfQorCisvKgorICogQ29udmVydCAxNi1iaXQgdmFsdWUgZnJvbSBob3N0IGJ5dGUgb3JkZXIgdG8gbmV0d29yayBieXRlIG9yZGVyLgorICovCitQSl9ERUYocGpfdWludDE2X3QpIHBqX2h0b25zKHBqX3VpbnQxNl90IGhvc3RzaG9ydCkKK3sKKyAgICByZXR1cm4gaHRvbnMoaG9zdHNob3J0KTsKK30KKworLyoKKyAqIENvbnZlcnQgMzItYml0IHZhbHVlIGZyb20gbmV0d29yayBieXRlIG9yZGVyIHRvIGhvc3QgYnl0ZSBvcmRlci4KKyAqLworUEpfREVGKHBqX3VpbnQzMl90KSBwal9udG9obChwal91aW50MzJfdCBuZXRsb25nKQoreworICAgIHJldHVybiBudG9obChuZXRsb25nKTsKK30KKworLyoKKyAqIENvbnZlcnQgMzItYml0IHZhbHVlIGZyb20gaG9zdCBieXRlIG9yZGVyIHRvIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworUEpfREVGKHBqX3VpbnQzMl90KSBwal9odG9ubChwal91aW50MzJfdCBob3N0bG9uZykKK3sKKyAgICByZXR1cm4gaHRvbmwoaG9zdGxvbmcpOworfQorCisvKgorICogQ29udmVydCBhbiBJbnRlcm5ldCBob3N0IGFkZHJlc3MgZ2l2ZW4gaW4gbmV0d29yayBieXRlIG9yZGVyCisgKiB0byBzdHJpbmcgaW4gc3RhbmRhcmQgbnVtYmVycyBhbmQgZG90cyBub3RhdGlvbi4KKyAqLworUEpfREVGKGNoYXIqKSBwal9pbmV0X250b2EocGpfaW5fYWRkciBpbmFkZHIpCit7CisjaWYgIWRlZmluZWQoUEpfTElOVVgpICYmICFkZWZpbmVkKFBKX0xJTlVYX0tFUk5FTCkKKyAgICByZXR1cm4gaW5ldF9udG9hKCooc3RydWN0IGluX2FkZHIqKSZpbmFkZHIpOworI2Vsc2UKKyAgICBzdHJ1Y3QgaW5fYWRkciBhZGRyOworICAgIGFkZHIuc19hZGRyID0gaW5hZGRyLnNfYWRkcjsKKyAgICByZXR1cm4gaW5ldF9udG9hKGFkZHIpOworI2VuZGlmCit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBJbnRlcm5ldCBob3N0IGFkZHJlc3MgY3AgZnJvbSB0aGUgc3RhbmRhcmQKKyAqIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24gaW50byBiaW5hcnkgZGF0YSBhbmQgc3RvcmVzIGl0IGluIHRoZSBzdHJ1Y3R1cmUKKyAqIHRoYXQgaW5wIHBvaW50cyB0by4gCisgKi8KK1BKX0RFRihpbnQpIHBqX2luZXRfYXRvbihjb25zdCBwal9zdHJfdCAqY3AsIHN0cnVjdCBwal9pbl9hZGRyICppbnApCit7CisgICAgY2hhciB0ZW1wYWRkcltQSl9JTkVUX0FERFJTVFJMRU5dOworCisgICAgLyogSW5pdGlhbGl6ZSBvdXRwdXQgd2l0aCBQSl9JTkFERFJfTk9ORS4KKyAgICAgKiBTb21lIGFwcHMgcmVsaWVzIG9uIHRoaXMgaW5zdGVhZCBvZiB0aGUgcmV0dXJuIHZhbHVlCisgICAgICogKGFuZCBhbnl3YXkgdGhlIHJldHVybiB2YWx1ZSBpcyBxdWl0ZSBjb25mdXNpbmchKQorICAgICAqLworICAgIGlucC0+c19hZGRyID0gUEpfSU5BRERSX05PTkU7CisKKyAgICAvKiBDYXV0aW9uOgorICAgICAqCXRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgY2FsbGVkIHdpdGggY3AtPnNsZW4gPj0gMTYKKyAgICAgKiAgKGkuZS4gd2hlbiBjYWxsZWQgd2l0aCBob3N0bmFtZSB0byBjaGVjayBpZiBpdCdzIGFuIElQIGFkZHIpLgorICAgICAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oY3AgJiYgY3AtPnNsZW4gJiYgaW5wLCAwKTsKKyAgICBpZiAoY3AtPnNsZW4gPj0gUEpfSU5FVF9BRERSU1RSTEVOKSB7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgcGpfbWVtY3B5KHRlbXBhZGRyLCBjcC0+cHRyLCBjcC0+c2xlbik7CisgICAgdGVtcGFkZHJbY3AtPnNsZW5dID0gJ1wwJzsKKworI2lmIGRlZmluZWQoUEpfU09DS19IQVNfSU5FVF9BVE9OKSAmJiBQSl9TT0NLX0hBU19JTkVUX0FUT04gIT0gMAorICAgIHJldHVybiBpbmV0X2F0b24odGVtcGFkZHIsIChzdHJ1Y3QgaW5fYWRkciopaW5wKTsKKyNlbHNlCisgICAgaW5wLT5zX2FkZHIgPSBpbmV0X2FkZHIodGVtcGFkZHIpOworICAgIHJldHVybiBpbnAtPnNfYWRkciA9PSBQSl9JTkFERFJfTk9ORSA/IDAgOiAxOworI2VuZGlmCit9CisKKy8qCisgKiBDb252ZXJ0IHRleHQgdG8gSVB2NC9JUHY2IGFkZHJlc3MuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW5ldF9wdG9uKGludCBhZiwgY29uc3QgcGpfc3RyX3QgKnNyYywgdm9pZCAqZHN0KQoreworICAgIGNoYXIgdGVtcGFkZHJbUEpfSU5FVDZfQUREUlNUUkxFTl07CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFmPT1QSl9BRl9JTkVUIHx8IGFmPT1QSl9BRl9JTkVUNiwgUEpfRUFGTk9UU1VQKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNyYyAmJiBzcmMtPnNsZW4gJiYgZHN0LCBQSl9FSU5WQUwpOworCisgICAgLyogSW5pdGlhbGl6ZSBvdXRwdXQgd2l0aCBQSl9JTl9BRERSX05PTkUgZm9yIElQdjQgKHRvIGJlIAorICAgICAqIGNvbXBhdGlibGUgd2l0aCBwal9pbmV0X2F0b24oKQorICAgICAqLworICAgIGlmIChhZj09UEpfQUZfSU5FVCkgeworCSgocGpfaW5fYWRkciopZHN0KS0+c19hZGRyID0gUEpfSU5BRERSX05PTkU7CisgICAgfQorCisgICAgLyogQ2F1dGlvbjoKKyAgICAgKgl0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIGNwLT5zbGVuID49IDQ2CisgICAgICogIChpLmUuIHdoZW4gY2FsbGVkIHdpdGggaG9zdG5hbWUgdG8gY2hlY2sgaWYgaXQncyBhbiBJUCBhZGRyKS4KKyAgICAgKi8KKyAgICBpZiAoc3JjLT5zbGVuID49IFBKX0lORVQ2X0FERFJTVFJMRU4pIHsKKwlyZXR1cm4gUEpfRU5BTUVUT09MT05HOworICAgIH0KKworICAgIHBqX21lbWNweSh0ZW1wYWRkciwgc3JjLT5wdHIsIHNyYy0+c2xlbik7CisgICAgdGVtcGFkZHJbc3JjLT5zbGVuXSA9ICdcMCc7CisKKyNpZiBkZWZpbmVkKFBKX1NPQ0tfSEFTX0lORVRfUFRPTikgJiYgUEpfU09DS19IQVNfSU5FVF9QVE9OICE9IDAKKyAgICAvKgorICAgICAqIEltcGxlbWVudGF0aW9uIHVzaW5nIGluZXRfcHRvbigpCisgICAgICovCisgICAgaWYgKGluZXRfcHRvbihhZiwgdGVtcGFkZHIsIGRzdCkgIT0gMSkgeworCXBqX3N0YXR1c190IHN0YXR1cyA9IHBqX2dldF9uZXRvc19lcnJvcigpOworCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwkgICAgc3RhdHVzID0gUEpfRVVOS05PV047CisKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworCisjZWxpZiBkZWZpbmVkKFBKX1dJTjMyKSB8fCBkZWZpbmVkKFBKX1dJTjY0KSB8fCBkZWZpbmVkKFBKX1dJTjMyX1dJTkNFKQorICAgIC8qCisgICAgICogSW1wbGVtZW50YXRpb24gb24gV2luZG93cywgdXNpbmcgV1NBU3RyaW5nVG9BZGRyZXNzKCkuCisgICAgICogU2hvdWxkIGFsc28gd29yayBvbiBVbmljb2RlIHN5c3RlbXMuCisgICAgICovCisgICAgeworCVBKX0RFQ0xfVU5JQ09ERV9URU1QX0JVRih3dGVtcGFkZHIsUEpfSU5FVDZfQUREUlNUUkxFTikKKwlwal9zb2NrYWRkciBzb2NrX2FkZHI7CisJaW50IGFkZHJfbGVuID0gc2l6ZW9mKHNvY2tfYWRkcik7CisJaW50IHJjOworCisJc29ja19hZGRyLmFkZHIuc2FfZmFtaWx5ID0gKHBqX3VpbnQxNl90KWFmOworCXJjID0gV1NBU3RyaW5nVG9BZGRyZXNzKAorCQlQSl9TVFJJTkdfVE9fTkFUSVZFKHRlbXBhZGRyLHd0ZW1wYWRkcixzaXplb2Yod3RlbXBhZGRyKSksIAorCQlhZiwgTlVMTCwgKExQU09DS0FERFIpJnNvY2tfYWRkciwgJmFkZHJfbGVuKTsKKwlpZiAocmMgIT0gMCkgeworCSAgICAvKiBJZiB5b3UgZ2V0IHJjIDEzMDAyMiBJbnZhbGlkIGFyZ3VtZW50IChXU0FFSU5WQUwpIHdpdGggSVB2NiwKKwkgICAgICogY2hlY2sgdGhhdCB5b3UgaGF2ZSBJUHY2IGVuYWJsZWQgKGluc3RhbGwgaXQgaW4gdGhlIG5ldHdvcmsKKwkgICAgICogYWRhcHRlcikuCisJICAgICAqLworCSAgICBwal9zdGF0dXNfdCBzdGF0dXMgPSBwal9nZXRfbmV0b3NfZXJyb3IoKTsKKwkgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorCQlzdGF0dXMgPSBQSl9FVU5LTk9XTjsKKworCSAgICByZXR1cm4gc3RhdHVzOworCX0KKworCWlmIChzb2NrX2FkZHIuYWRkci5zYV9mYW1pbHkgPT0gUEpfQUZfSU5FVCkgeworCSAgICBwal9tZW1jcHkoZHN0LCAmc29ja19hZGRyLmlwdjQuc2luX2FkZHIsIDQpOworCSAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKwl9IGVsc2UgaWYgKHNvY2tfYWRkci5hZGRyLnNhX2ZhbWlseSA9PSBQSl9BRl9JTkVUNikgeworCSAgICBwal9tZW1jcHkoZHN0LCAmc29ja19hZGRyLmlwdjYuc2luNl9hZGRyLCAxNik7CisJICAgIHJldHVybiBQSl9TVUNDRVNTOworCX0gZWxzZSB7CisJICAgIHBqX2Fzc2VydCghIlNob3VsZG4ndCBoYXBwZW4iKTsKKwkgICAgcmV0dXJuIFBKX0VCVUc7CisJfQorICAgIH0KKyNlbGlmICFkZWZpbmVkKFBKX0hBU19JUFY2KSB8fCBQSl9IQVNfSVBWNj09MAorICAgIC8qIElQdjYgc3VwcG9ydCBpcyBkaXNhYmxlZCwganVzdCByZXR1cm4gZXJyb3Igd2l0aG91dCByYWlzaW5nIGFzc2VydGlvbiAqLworICAgIHJldHVybiBQSl9FSVBWNk5PVFNVUDsKKyNlbHNlCisgICAgcGpfYXNzZXJ0KCEiTm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBQSl9FSVBWNk5PVFNVUDsKKyNlbmRpZgorfQorCisvKgorICogQ29udmVydCBJUHY0L0lQdjYgYWRkcmVzcyB0byB0ZXh0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX2luZXRfbnRvcChpbnQgYWYsIGNvbnN0IHZvaWQgKnNyYywKKwkJCQkgY2hhciAqZHN0LCBpbnQgc2l6ZSkKKworeworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3JjICYmIGRzdCAmJiBzaXplLCBQSl9FSU5WQUwpOworCisgICAgKmRzdCA9ICdcMCc7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFmPT1QSl9BRl9JTkVUIHx8IGFmPT1QSl9BRl9JTkVUNiwgUEpfRUFGTk9UU1VQKTsKKworI2lmIGRlZmluZWQoUEpfU09DS19IQVNfSU5FVF9OVE9QKSAmJiBQSl9TT0NLX0hBU19JTkVUX05UT1AgIT0gMAorICAgIC8qCisgICAgICogSW1wbGVtZW50YXRpb24gdXNpbmcgaW5ldF9udG9wKCkKKyAgICAgKi8KKyAgICBpZiAoaW5ldF9udG9wKGFmLCBzcmMsIGRzdCwgc2l6ZSkgPT0gTlVMTCkgeworCXBqX3N0YXR1c190IHN0YXR1cyA9IHBqX2dldF9uZXRvc19lcnJvcigpOworCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwkgICAgc3RhdHVzID0gUEpfRVVOS05PV047CisKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworCisjZWxpZiBkZWZpbmVkKFBKX1dJTjMyKSB8fCBkZWZpbmVkKFBKX1dJTjY0KSB8fCBkZWZpbmVkKFBKX1dJTjMyX1dJTkNFKQorICAgIC8qCisgICAgICogSW1wbGVtZW50YXRpb24gb24gV2luZG93cywgdXNpbmcgV1NBQWRkcmVzc1RvU3RyaW5nKCkuCisgICAgICogU2hvdWxkIGFsc28gd29yayBvbiBVbmljb2RlIHN5c3RlbXMuCisgICAgICovCisgICAgeworCVBKX0RFQ0xfVU5JQ09ERV9URU1QX0JVRih3dGVtcGFkZHIsUEpfSU5FVDZfQUREUlNUUkxFTikKKwlwal9zb2NrYWRkciBzb2NrX2FkZHI7CisJRFdPUkQgYWRkcl9sZW4sIGFkZHJfc3RyX2xlbjsKKwlpbnQgcmM7CisKKwlwal9iemVybygmc29ja19hZGRyLCBzaXplb2Yoc29ja19hZGRyKSk7CisJc29ja19hZGRyLmFkZHIuc2FfZmFtaWx5ID0gKHBqX3VpbnQxNl90KWFmOworCWlmIChhZiA9PSBQSl9BRl9JTkVUKSB7CisJICAgIGlmIChzaXplIDwgUEpfSU5FVF9BRERSU1RSTEVOKQorCQlyZXR1cm4gUEpfRVRPT1NNQUxMOworCSAgICBwal9tZW1jcHkoJnNvY2tfYWRkci5pcHY0LnNpbl9hZGRyLCBzcmMsIDQpOworCSAgICBhZGRyX2xlbiA9IHNpemVvZihwal9zb2NrYWRkcl9pbik7CisJICAgIGFkZHJfc3RyX2xlbiA9IFBKX0lORVRfQUREUlNUUkxFTjsKKwl9IGVsc2UgaWYgKGFmID09IFBKX0FGX0lORVQ2KSB7CisJICAgIGlmIChzaXplIDwgUEpfSU5FVDZfQUREUlNUUkxFTikKKwkJcmV0dXJuIFBKX0VUT09TTUFMTDsKKwkgICAgcGpfbWVtY3B5KCZzb2NrX2FkZHIuaXB2Ni5zaW42X2FkZHIsIHNyYywgMTYpOworCSAgICBhZGRyX2xlbiA9IHNpemVvZihwal9zb2NrYWRkcl9pbjYpOworCSAgICBhZGRyX3N0cl9sZW4gPSBQSl9JTkVUNl9BRERSU1RSTEVOOworCX0gZWxzZSB7CisJICAgIHBqX2Fzc2VydCghIlVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7CisJICAgIHJldHVybiBQSl9FQUZOT1RTVVA7CisJfQorCisjaWYgUEpfTkFUSVZFX1NUUklOR19JU19VTklDT0RFCisJcmMgPSBXU0FBZGRyZXNzVG9TdHJpbmcoKExQU09DS0FERFIpJnNvY2tfYWRkciwgYWRkcl9sZW4sCisJCQkJTlVMTCwgd3RlbXBhZGRyLCAmYWRkcl9zdHJfbGVuKTsKKwlpZiAocmMgPT0gMCkgeworCSAgICBwal91bmljb2RlX3RvX2Fuc2kod3RlbXBhZGRyLCB3Y3NsZW4od3RlbXBhZGRyKSwgZHN0LCBzaXplKTsKKwl9CisjZWxzZQorCXJjID0gV1NBQWRkcmVzc1RvU3RyaW5nKChMUFNPQ0tBRERSKSZzb2NrX2FkZHIsIGFkZHJfbGVuLAorCQkJCU5VTEwsIGRzdCwgJmFkZHJfc3RyX2xlbik7CisjZW5kaWYKKworCWlmIChyYyAhPSAwKSB7CisJICAgIHBqX3N0YXR1c190IHN0YXR1cyA9IHBqX2dldF9uZXRvc19lcnJvcigpOworCSAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpCisJCXN0YXR1cyA9IFBKX0VVTktOT1dOOworCisJICAgIHJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisjZWxpZiAhZGVmaW5lZChQSl9IQVNfSVBWNikgfHwgUEpfSEFTX0lQVjY9PTAKKyAgICAvKiBJUHY2IHN1cHBvcnQgaXMgZGlzYWJsZWQsIGp1c3QgcmV0dXJuIGVycm9yIHdpdGhvdXQgcmFpc2luZyBhc3NlcnRpb24gKi8KKyAgICByZXR1cm4gUEpfRUlQVjZOT1RTVVA7CisjZWxzZQorICAgIHBqX2Fzc2VydCghIk5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm4gUEpfRUlQVjZOT1RTVVA7CisjZW5kaWYKK30KKworLyoKKyAqIEdldCBob3N0bmFtZS4KKyAqLworUEpfREVGKGNvbnN0IHBqX3N0cl90KikgcGpfZ2V0aG9zdG5hbWUodm9pZCkKK3sKKyAgICBzdGF0aWMgY2hhciBidWZbUEpfTUFYX0hPU1ROQU1FXTsKKyAgICBzdGF0aWMgcGpfc3RyX3QgaG9zdG5hbWU7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgaWYgKGhvc3RuYW1lLnB0ciA9PSBOVUxMKSB7CisJaG9zdG5hbWUucHRyID0gYnVmOworCWlmIChnZXRob3N0bmFtZShidWYsIHNpemVvZihidWYpKSAhPSAwKSB7CisJICAgIGhvc3RuYW1lLnB0clswXSA9ICdcMCc7CisJICAgIGhvc3RuYW1lLnNsZW4gPSAwOworCX0gZWxzZSB7CisgICAgICAgICAgICBob3N0bmFtZS5zbGVuID0gc3RybGVuKGJ1Zik7CisJfQorICAgIH0KKyAgICByZXR1cm4gJmhvc3RuYW1lOworfQorCisjaWYgZGVmaW5lZChQSl9XSU4zMikgfHwgZGVmaW5lZChQSl9XSU42NCkKKy8qCisgKiBDcmVhdGUgbmV3IHNvY2tldC9lbmRwb2ludCBmb3IgY29tbXVuaWNhdGlvbiBhbmQgcmV0dXJucyBhIGRlc2NyaXB0b3IuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19zb2NrZXQoaW50IGFmLCAKKwkJCQkgICBpbnQgdHlwZSwgCisJCQkJICAgaW50IHByb3RvLAorCQkJCSAgIHBqX3NvY2tfdCAqc29jaykKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgLyogU2FuaXR5IGNoZWNrcy4gKi8KKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNvY2shPU5VTEwsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTigoU09DS0VUKVBKX0lOVkFMSURfU09DS0VUPT1JTlZBTElEX1NPQ0tFVCwgCisgICAgICAgICAgICAgICAgICAgICAoKnNvY2s9UEpfSU5WQUxJRF9TT0NLRVQsIFBKX0VJTlZBTCkpOworCisgICAgKnNvY2sgPSBXU0FTb2NrZXQoYWYsIHR5cGUsIHByb3RvLCBOVUxMLCAwLCBXU0FfRkxBR19PVkVSTEFQUEVEKTsKKworICAgIGlmICgqc29jayA9PSBQSl9JTlZBTElEX1NPQ0tFVCkgCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmF0aXZlX25ldG9zX2Vycm9yKCkpOworICAgIAorI2lmIFBKX1NPQ0tfRElTQUJMRV9XU0FFQ09OTlJFU0VUICYmIFwKKyAgICAoIWRlZmluZWQoUEpfV0lOMzJfV0lOQ0UpIHx8IFBKX1dJTjMyX1dJTkNFPT0wKQorCisjaWZuZGVmIFNJT19VRFBfQ09OTlJFU0VUCisgICAgI2RlZmluZSBTSU9fVURQX0NPTk5SRVNFVCBfV1NBSU9XKElPQ19WRU5ET1IsMTIpCisjZW5kaWYKKworICAgIC8qIERpc2FibGUgV1NBRUNPTk5SRVNFVCBmb3IgVURQLgorICAgICAqIFNlZSBodHRwczovL3RyYWMucGpzaXAub3JnL3JlcG9zL3RpY2tldC8xMTk3CisgICAgICovCisgICAgaWYgKHR5cGU9PVBKX1NPQ0tfREdSQU0pIHsKKwlEV09SRCBkd0J5dGVzUmV0dXJuZWQgPSAwOworCUJPT0wgYk5ld0JlaGF2aW9yID0gRkFMU0U7CisJRFdPUkQgcmM7CisKKwlyYyA9IFdTQUlvY3RsKCpzb2NrLCBTSU9fVURQX0NPTk5SRVNFVCwKKwkJICAgICAgJmJOZXdCZWhhdmlvciwgc2l6ZW9mKGJOZXdCZWhhdmlvciksCisJCSAgICAgIE5VTEwsIDAsICZkd0J5dGVzUmV0dXJuZWQsCisJCSAgICAgIE5VTEwsIE5VTEwpOworCisJaWYgKHJjPT1TT0NLRVRfRVJST1IpIHsKKwkgICAgLy8gSWdub3JlZC4uCisJfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKyNlbHNlCisvKgorICogQ3JlYXRlIG5ldyBzb2NrZXQvZW5kcG9pbnQgZm9yIGNvbW11bmljYXRpb24gYW5kIHJldHVybnMgYSBkZXNjcmlwdG9yLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfc29ja2V0KGludCBhZiwgCisJCQkJICAgaW50IHR5cGUsIAorCQkJCSAgIGludCBwcm90bywgCisJCQkJICAgcGpfc29ja190ICpzb2NrKQoreworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIC8qIFNhbml0eSBjaGVja3MuICovCisgICAgUEpfQVNTRVJUX1JFVFVSTihzb2NrIT1OVUxMLCBQSl9FSU5WQUwpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oUEpfSU5WQUxJRF9TT0NLRVQ9PS0xLCAKKyAgICAgICAgICAgICAgICAgICAgICgqc29jaz1QSl9JTlZBTElEX1NPQ0tFVCwgUEpfRUlOVkFMKSk7CisgICAgCisgICAgKnNvY2sgPSBzb2NrZXQoYWYsIHR5cGUsIHByb3RvKTsKKyAgICBpZiAoKnNvY2sgPT0gUEpfSU5WQUxJRF9TT0NLRVQpCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmF0aXZlX25ldG9zX2Vycm9yKCkpOworICAgIGVsc2UgeworCXBqX2ludDMyX3QgdmFsID0gMTsKKwlpZiAodHlwZSA9PSBwal9TT0NLX1NUUkVBTSgpKSB7CisJICAgIHBqX3NvY2tfc2V0c29ja29wdCgqc29jaywgcGpfU09MX1NPQ0tFVCgpLCBwal9TT19OT1NJR1BJUEUoKSwKKwkJCSAgICAgICAmdmFsLCBzaXplb2YodmFsKSk7CisJfQorI2lmIGRlZmluZWQoUEpfSVBIT05FX09TX0hBU19NVUxUSVRBU0tJTkdfU1VQUE9SVCkgJiYgXAorICAgIFBKX0lQSE9ORV9PU19IQVNfTVVMVElUQVNLSU5HX1NVUFBPUlQhPTAKKwlpZiAodHlwZSA9PSBwal9TT0NLX0RHUkFNKCkpIHsKKwkgICAgcGpfc29ja19zZXRzb2Nrb3B0KCpzb2NrLCBwal9TT0xfU09DS0VUKCksIFNPX05PU0lHUElQRSwgCisJCQkgICAgICAgJnZhbCwgc2l6ZW9mKHZhbCkpOworCX0KKyNlbmRpZgorCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KK30KKyNlbmRpZgorCisvKgorICogQmluZCBzb2NrZXQuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19iaW5kKCBwal9zb2NrX3Qgc29jaywgCisJCQkJICBjb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCSAgaW50IGxlbikKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihhZGRyICYmIGxlbiA+PSAoaW50KXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLCBQSl9FSU5WQUwpOworCisgICAgQ0hFQ0tfQUREUl9MRU4oYWRkciwgbGVuKTsKKworICAgIGlmIChiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKWFkZHIsIGxlbikgIT0gMCkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfbmV0b3NfZXJyb3IoKSk7CisgICAgZWxzZQorCXJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBCaW5kIHNvY2tldC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2JpbmRfaW4oIHBqX3NvY2tfdCBzb2NrLCAKKwkJCQkgICAgIHBqX3VpbnQzMl90IGFkZHIzMiwKKwkJCQkgICAgIHBqX3VpbnQxNl90IHBvcnQpCit7CisgICAgcGpfc29ja2FkZHJfaW4gYWRkcjsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBQSl9TT0NLQUREUl9TRVRfTEVOKCZhZGRyLCBzaXplb2YocGpfc29ja2FkZHJfaW4pKTsKKyAgICBhZGRyLnNpbl9mYW1pbHkgPSBQSl9BRl9JTkVUOworICAgIHBqX2J6ZXJvKGFkZHIuc2luX3plcm8sIHNpemVvZihhZGRyLnNpbl96ZXJvKSk7CisgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBwal9odG9ubChhZGRyMzIpOworICAgIGFkZHIuc2luX3BvcnQgPSBwal9odG9ucyhwb3J0KTsKKworICAgIHJldHVybiBwal9zb2NrX2JpbmQoc29jaywgJmFkZHIsIHNpemVvZihwal9zb2NrYWRkcl9pbikpOworfQorCisKKy8qCisgKiBDbG9zZSBzb2NrZXQuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19jbG9zZShwal9zb2NrX3Qgc29jaykKK3sKKyAgICBpbnQgcmM7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworI2lmIGRlZmluZWQoUEpfV0lOMzIpICYmIFBKX1dJTjMyIT0wIHx8IFwKKyAgICBkZWZpbmVkKFBKX1dJTjY0KSAmJiBQSl9XSU42NCAhPSAwIHx8IFwKKyAgICBkZWZpbmVkKFBKX1dJTjMyX1dJTkNFKSAmJiBQSl9XSU4zMl9XSU5DRSE9MAorICAgIHJjID0gY2xvc2Vzb2NrZXQoc29jayk7CisjZWxzZQorICAgIHJjID0gY2xvc2Uoc29jayk7CisjZW5kaWYKKworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocGpfZ2V0X25hdGl2ZV9uZXRvc19lcnJvcigpKTsKKyAgICBlbHNlCisJcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBHZXQgcmVtb3RlJ3MgbmFtZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2dldHBlZXJuYW1lKCBwal9zb2NrX3Qgc29jaywKKwkJCQkJIHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJCSBpbnQgKm5hbWVsZW4pCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBpZiAoZ2V0cGVlcm5hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciopYWRkciwgKHNvY2tsZW5fdCopbmFtZWxlbikgIT0gMCkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfbmV0b3NfZXJyb3IoKSk7CisgICAgZWxzZSB7CisJUEpfU09DS0FERFJfUkVTRVRfTEVOKGFkZHIpOworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KK30KKworLyoKKyAqIEdldCBzb2NrZXQgbmFtZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2dldHNvY2tuYW1lKCBwal9zb2NrX3Qgc29jaywKKwkJCQkJIHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJCSBpbnQgKm5hbWVsZW4pCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBpZiAoZ2V0c29ja25hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciopYWRkciwgKHNvY2tsZW5fdCopbmFtZWxlbikgIT0gMCkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfbmV0b3NfZXJyb3IoKSk7CisgICAgZWxzZSB7CisJUEpfU09DS0FERFJfUkVTRVRfTEVOKGFkZHIpOworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KK30KKworLyoKKyAqIFNlbmQgZGF0YQorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfc2VuZChwal9zb2NrX3Qgc29jaywKKwkJCQkgY29uc3Qgdm9pZCAqYnVmLAorCQkJCSBwal9zc2l6ZV90ICpsZW4sCisJCQkJIHVuc2lnbmVkIGZsYWdzKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihsZW4sIFBKX0VJTlZBTCk7CisKKyNpZmRlZiBNU0dfTk9TSUdOQUwKKyAgICAvKiBTdXBwcmVzcyBTSUdQSVBFLiBTZWUgaHR0cHM6Ly90cmFjLnBqc2lwLm9yZy9yZXBvcy90aWNrZXQvMTUzOCAqLworICAgIGZsYWdzIHw9IE1TR19OT1NJR05BTDsKKyNlbmRpZgorCisgICAgKmxlbiA9IHNlbmQoc29jaywgKGNvbnN0IGNoYXIqKWJ1ZiwgKGludCkoKmxlbiksIGZsYWdzKTsKKworICAgIGlmICgqbGVuIDwgMCkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfbmV0b3NfZXJyb3IoKSk7CisgICAgZWxzZQorCXJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBTZW5kIGRhdGEuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19zZW5kdG8ocGpfc29ja190IHNvY2ssCisJCQkJICAgY29uc3Qgdm9pZCAqYnVmLAorCQkJCSAgIHBqX3NzaXplX3QgKmxlbiwKKwkJCQkgICB1bnNpZ25lZCBmbGFncywKKwkJCQkgICBjb25zdCBwal9zb2NrYWRkcl90ICp0bywKKwkJCQkgICBpbnQgdG9sZW4pCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGxlbiwgUEpfRUlOVkFMKTsKKyAgICAKKyAgICBDSEVDS19BRERSX0xFTih0bywgdG9sZW4pOworCisgICAgKmxlbiA9IHNlbmR0byhzb2NrLCAoY29uc3QgY2hhciopYnVmLCAoaW50KSgqbGVuKSwgZmxhZ3MsIAorCQkgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIqKXRvLCB0b2xlbik7CisKKyAgICBpZiAoKmxlbiA8IDApIAorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocGpfZ2V0X25hdGl2ZV9uZXRvc19lcnJvcigpKTsKKyAgICBlbHNlIAorCXJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogUmVjZWl2ZSBkYXRhLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfcmVjdihwal9zb2NrX3Qgc29jaywKKwkJCQkgdm9pZCAqYnVmLAorCQkJCSBwal9zc2l6ZV90ICpsZW4sCisJCQkJIHVuc2lnbmVkIGZsYWdzKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihidWYgJiYgbGVuLCBQSl9FSU5WQUwpOworCisgICAgKmxlbiA9IHJlY3Yoc29jaywgKGNoYXIqKWJ1ZiwgKGludCkoKmxlbiksIGZsYWdzKTsKKworICAgIGlmICgqbGVuIDwgMCkgCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmF0aXZlX25ldG9zX2Vycm9yKCkpOworICAgIGVsc2UKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIFJlY2VpdmUgZGF0YS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX3JlY3Zmcm9tKHBqX3NvY2tfdCBzb2NrLAorCQkJCSAgICAgdm9pZCAqYnVmLAorCQkJCSAgICAgcGpfc3NpemVfdCAqbGVuLAorCQkJCSAgICAgdW5zaWduZWQgZmxhZ3MsCisJCQkJICAgICBwal9zb2NrYWRkcl90ICpmcm9tLAorCQkJCSAgICAgaW50ICpmcm9tbGVuKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihidWYgJiYgbGVuLCBQSl9FSU5WQUwpOworCisgICAgKmxlbiA9IHJlY3Zmcm9tKHNvY2ssIChjaGFyKilidWYsIChpbnQpKCpsZW4pLCBmbGFncywgCisJCSAgICAoc3RydWN0IHNvY2thZGRyKilmcm9tLCAoc29ja2xlbl90Kilmcm9tbGVuKTsKKworICAgIGlmICgqbGVuIDwgMCkgCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmF0aXZlX25ldG9zX2Vycm9yKCkpOworICAgIGVsc2UgeworICAgICAgICBpZiAoZnJvbSkgeworICAgICAgICAgICAgUEpfU09DS0FERFJfUkVTRVRfTEVOKGZyb20pOworICAgICAgICB9CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorfQorCisvKgorICogR2V0IHNvY2tldCBvcHRpb24uCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19nZXRzb2Nrb3B0KCBwal9zb2NrX3Qgc29jaywKKwkJCQkJcGpfdWludDE2X3QgbGV2ZWwsCisJCQkJCXBqX3VpbnQxNl90IG9wdG5hbWUsCisJCQkJCXZvaWQgKm9wdHZhbCwKKwkJCQkJaW50ICpvcHRsZW4pCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKG9wdHZhbCAmJiBvcHRsZW4sIFBKX0VJTlZBTCk7CisKKyAgICBpZiAoZ2V0c29ja29wdChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgKGNoYXIqKW9wdHZhbCwgKHNvY2tsZW5fdCopb3B0bGVuKSE9MCkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfbmV0b3NfZXJyb3IoKSk7CisgICAgZWxzZQorCXJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogU2V0IHNvY2tldCBvcHRpb24uCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19zZXRzb2Nrb3B0KCBwal9zb2NrX3Qgc29jaywKKwkJCQkJcGpfdWludDE2X3QgbGV2ZWwsCisJCQkJCXBqX3VpbnQxNl90IG9wdG5hbWUsCisJCQkJCWNvbnN0IHZvaWQgKm9wdHZhbCwKKwkJCQkJaW50IG9wdGxlbikKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIGlmIChzZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lLCAoY29uc3QgY2hhciopb3B0dmFsLCBvcHRsZW4pICE9IDApCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmF0aXZlX25ldG9zX2Vycm9yKCkpOworICAgIGVsc2UKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIENvbm5lY3Qgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfY29ubmVjdCggcGpfc29ja190IHNvY2ssCisJCQkJICAgICBjb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCSAgICAgaW50IG5hbWVsZW4pCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBpZiAoY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyKilhZGRyLCBuYW1lbGVuKSAhPSAwKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocGpfZ2V0X25hdGl2ZV9uZXRvc19lcnJvcigpKTsKKyAgICBlbHNlCisJcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIFNodXRkb3duIHNvY2tldC4KKyAqLworI2lmIFBKX0hBU19UQ1AKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19zaHV0ZG93biggcGpfc29ja190IHNvY2ssCisJCQkJICAgICAgaW50IGhvdykKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIGlmIChzaHV0ZG93bihzb2NrLCBob3cpICE9IDApCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihwal9nZXRfbmF0aXZlX25ldG9zX2Vycm9yKCkpOworICAgIGVsc2UKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIFN0YXJ0IGxpc3RlbmluZyB0byBpbmNvbWluZyBjb25uZWN0aW9ucy4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2xpc3RlbiggcGpfc29ja190IHNvY2ssCisJCQkJICAgIGludCBiYWNrbG9nKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgaWYgKGxpc3Rlbihzb2NrLCBiYWNrbG9nKSAhPSAwKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocGpfZ2V0X25hdGl2ZV9uZXRvc19lcnJvcigpKTsKKyAgICBlbHNlCisJcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBBY2NlcHQgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2FjY2VwdCggcGpfc29ja190IHNlcnZlcmZkLAorCQkJCSAgICBwal9zb2NrX3QgKm5ld3NvY2ssCisJCQkJICAgIHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJICAgIGludCAqYWRkcmxlbikKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX0FTU0VSVF9SRVRVUk4obmV3c29jayAhPSBOVUxMLCBQSl9FSU5WQUwpOworCisjaWYgZGVmaW5lZChQSl9TT0NLQUREUl9IQVNfTEVOKSAmJiBQSl9TT0NLQUREUl9IQVNfTEVOIT0wCisgICAgaWYgKGFkZHIpIHsKKwlQSl9TT0NLQUREUl9TRVRfTEVOKGFkZHIsICphZGRybGVuKTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICAqbmV3c29jayA9IGFjY2VwdChzZXJ2ZXJmZCwgKHN0cnVjdCBzb2NrYWRkciopYWRkciwgKHNvY2tsZW5fdCopYWRkcmxlbik7CisgICAgaWYgKCpuZXdzb2NrPT1QSl9JTlZBTElEX1NPQ0tFVCkKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKHBqX2dldF9uYXRpdmVfbmV0b3NfZXJyb3IoKSk7CisgICAgZWxzZSB7CisJCisjaWYgZGVmaW5lZChQSl9TT0NLQUREUl9IQVNfTEVOKSAmJiBQSl9TT0NLQUREUl9IQVNfTEVOIT0wCisJaWYgKGFkZHIpIHsKKwkgICAgUEpfU09DS0FERFJfUkVTRVRfTEVOKGFkZHIpOworCX0KKyNlbmRpZgorCSAgICAKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9Cit9CisjZW5kaWYJLyogUEpfSEFTX1RDUCAqLworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19jb21tb24uYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzdkMzEyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX2NvbW1vbi5jCkBAIC0wLDAgKzEsMTMyNCBAQAorLyogJElkOiBzb2NrX2NvbW1vbi5jIDQ1MzggMjAxMy0wNi0xOSAwOTowNjo1NVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovc29jay5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2N0eXBlLmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9pcF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL2FkZHJfcmVzb2x2Lmg+CisjaW5jbHVkZSA8cGovcmFuZC5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL2NvbXBhdC9zb2NrZXQuaD4KKworI2lmIDAKKyAgICAvKiBFbmFibGUgc29tZSB0cmFjaW5nICovCisgICAgI2luY2x1ZGUgPHBqL2xvZy5oPgorICAgICNkZWZpbmUgVEhJU19GSUxFICAgInNvY2tfY29tbW9uLmMiCisgICAgI2RlZmluZSBUUkFDRV8oYXJnKQlQSl9MT0coNCxhcmcpCisjZWxzZQorICAgICNkZWZpbmUgVFJBQ0VfKGFyZykKKyNlbmRpZgorCisKKy8qCisgKiBDb252ZXJ0IGFkZHJlc3Mgc3RyaW5nIHdpdGggbnVtYmVycyBhbmQgZG90cyB0byBiaW5hcnkgSVAgYWRkcmVzcy4KKyAqLyAKK1BKX0RFRihwal9pbl9hZGRyKSBwal9pbmV0X2FkZHIoY29uc3QgcGpfc3RyX3QgKmNwKQoreworICAgIHBqX2luX2FkZHIgYWRkcjsKKworICAgIHBqX2luZXRfYXRvbihjcCwgJmFkZHIpOworICAgIHJldHVybiBhZGRyOworfQorCisvKgorICogQ29udmVydCBhZGRyZXNzIHN0cmluZyB3aXRoIG51bWJlcnMgYW5kIGRvdHMgdG8gYmluYXJ5IElQIGFkZHJlc3MuCisgKi8gCitQSl9ERUYocGpfaW5fYWRkcikgcGpfaW5ldF9hZGRyMihjb25zdCBjaGFyICpjcCkKK3sKKyAgICBwal9zdHJfdCBzdHIgPSBwal9zdHIoKGNoYXIqKWNwKTsKKyAgICByZXR1cm4gcGpfaW5ldF9hZGRyKCZzdHIpOworfQorCisvKgorICogR2V0IHRleHQgcmVwcmVzZW50YXRpb24uCisgKi8KK1BKX0RFRihjaGFyKikgcGpfaW5ldF9udG9wMiggaW50IGFmLCBjb25zdCB2b2lkICpzcmMsCisJCQkgICAgIGNoYXIgKmRzdCwgaW50IHNpemUpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gcGpfaW5ldF9udG9wKGFmLCBzcmMsIGRzdCwgc2l6ZSk7CisgICAgcmV0dXJuIChzdGF0dXM9PVBKX1NVQ0NFU1MpPyBkc3QgOiBOVUxMOworfQorCisvKgorICogUHJpbnQgc29ja2V0IGFkZHJlc3MuCisgKi8KK1BKX0RFRihjaGFyKikgcGpfc29ja2FkZHJfcHJpbnQoIGNvbnN0IHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJIGNoYXIgKmJ1ZiwgaW50IHNpemUsCisJCQkJIHVuc2lnbmVkIGZsYWdzKQoreworICAgIGVudW0geworCVdJVEhfUE9SVCA9IDEsCisJV0lUSF9CUkFDS0VUUyA9IDIKKyAgICB9OworCisgICAgY2hhciB0eHRbUEpfSU5FVDZfQUREUlNUUkxFTl07CisgICAgY2hhciBwb3J0WzMyXTsKKyAgICBjb25zdCBwal9hZGRyX2hkciAqaCA9IChjb25zdCBwal9hZGRyX2hkciopYWRkcjsKKyAgICBjaGFyICpicXVvdGUsICplcXVvdGU7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gcGpfaW5ldF9udG9wKGgtPnNhX2ZhbWlseSwgcGpfc29ja2FkZHJfZ2V0X2FkZHIoYWRkciksCisJCQkgIHR4dCwgc2l6ZW9mKHR4dCkpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gIiI7CisKKyAgICBpZiAoaC0+c2FfZmFtaWx5ICE9IFBKX0FGX0lORVQ2IHx8IChmbGFncyAmIFdJVEhfQlJBQ0tFVFMpPT0wKSB7CisJYnF1b3RlID0gIiI7IGVxdW90ZSA9ICIiOworICAgIH0gZWxzZSB7CisJYnF1b3RlID0gIlsiOyBlcXVvdGUgPSAiXSI7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgV0lUSF9QT1JUKSB7CisJcGpfYW5zaV9zbnByaW50Zihwb3J0LCBzaXplb2YocG9ydCksICI6JWQiLAorCQkJIHBqX3NvY2thZGRyX2dldF9wb3J0KGFkZHIpKTsKKyAgICB9IGVsc2UgeworCXBvcnRbMF0gPSAnXDAnOworICAgIH0KKworICAgIHBqX2Fuc2lfc25wcmludGYoYnVmLCBzaXplLCAiJXMlcyVzJXMiLAorCQkgICAgIGJxdW90ZSwgdHh0LCBlcXVvdGUsIHBvcnQpOworCisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIFNldCB0aGUgSVAgYWRkcmVzcyBvZiBhbiBJUCBzb2NrZXQgYWRkcmVzcyBmcm9tIHN0cmluZyBhZGRyZXNzLCAKKyAqIHdpdGggcmVzb2x2aW5nIHRoZSBob3N0IGlmIG5lY2Vzc2FyeS4gVGhlIHN0cmluZyBhZGRyZXNzIG1heSBiZSBpbiBhCisgKiBzdGFuZGFyZCBudW1iZXJzIGFuZCBkb3RzIG5vdGF0aW9uIG9yIG1heSBiZSBhIGhvc3RuYW1lLiBJZiBob3N0bmFtZQorICogaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHJlc29sdmUgdGhlIGhvc3QgaW50byB0aGUgSVAKKyAqIGFkZHJlc3MuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja2FkZHJfaW5fc2V0X3N0cl9hZGRyKCBwal9zb2NrYWRkcl9pbiAqYWRkciwKKwkJCQkJICAgICAgICAgY29uc3QgcGpfc3RyX3QgKnN0cl9hZGRyKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKCFzdHJfYWRkciB8fCBzdHJfYWRkci0+c2xlbiA8IFBKX01BWF9IT1NUTkFNRSwgCisgICAgICAgICAgICAgICAgICAgICAoYWRkci0+c2luX2FkZHIuc19hZGRyPVBKX0lOQUREUl9OT05FLCBQSl9FSU5WQUwpKTsKKworICAgIFBKX1NPQ0tBRERSX1JFU0VUX0xFTihhZGRyKTsKKyAgICBhZGRyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBwal9iemVybyhhZGRyLT5zaW5femVybywgc2l6ZW9mKGFkZHItPnNpbl96ZXJvKSk7CisKKyAgICBpZiAoc3RyX2FkZHIgJiYgc3RyX2FkZHItPnNsZW4pIHsKKwlhZGRyLT5zaW5fYWRkciA9IHBqX2luZXRfYWRkcihzdHJfYWRkcik7CisJaWYgKGFkZHItPnNpbl9hZGRyLnNfYWRkciA9PSBQSl9JTkFERFJfTk9ORSkgeworICAgIAkgICAgcGpfaG9zdGVudCBoZTsKKwkgICAgcGpfc3RhdHVzX3QgcmM7CisKKwkgICAgcmMgPSBwal9nZXRob3N0YnluYW1lKHN0cl9hZGRyLCAmaGUpOworCSAgICBpZiAocmMgPT0gMCkgeworCQlhZGRyLT5zaW5fYWRkci5zX2FkZHIgPSAqKHBqX3VpbnQzMl90KiloZS5oX2FkZHI7CisJICAgIH0gZWxzZSB7CisJCWFkZHItPnNpbl9hZGRyLnNfYWRkciA9IFBKX0lOQUREUl9OT05FOworCQlyZXR1cm4gcmM7CisJICAgIH0KKwl9CisKKyAgICB9IGVsc2UgeworCWFkZHItPnNpbl9hZGRyLnNfYWRkciA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIFNldCBhZGRyZXNzIGZyb20gYSBuYW1lICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2thZGRyX3NldF9zdHJfYWRkcihpbnQgYWYsCisJCQkJCSAgICAgcGpfc29ja2FkZHIgKmFkZHIsCisJCQkJCSAgICAgY29uc3QgcGpfc3RyX3QgKnN0cl9hZGRyKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChhZiA9PSBQSl9BRl9JTkVUKSB7CisJcmV0dXJuIHBqX3NvY2thZGRyX2luX3NldF9zdHJfYWRkcigmYWRkci0+aXB2NCwgc3RyX2FkZHIpOworICAgIH0KKworICAgIFBKX0FTU0VSVF9SRVRVUk4oYWY9PVBKX0FGX0lORVQ2LCBQSl9FQUZOT1RTVVApOworCisgICAgLyogSVB2NiBzcGVjaWZpYyAqLworCisgICAgYWRkci0+aXB2Ni5zaW42X2ZhbWlseSA9IFBKX0FGX0lORVQ2OworICAgIFBKX1NPQ0tBRERSX1JFU0VUX0xFTihhZGRyKTsKKworICAgIGlmIChzdHJfYWRkciAmJiBzdHJfYWRkci0+c2xlbikgeworCXN0YXR1cyA9IHBqX2luZXRfcHRvbihQSl9BRl9JTkVUNiwgc3RyX2FkZHIsICZhZGRyLT5pcHY2LnNpbjZfYWRkcik7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgCSAgICBwal9hZGRyaW5mbyBhaTsKKwkgICAgdW5zaWduZWQgY291bnQgPSAxOworCisJICAgIHN0YXR1cyA9IHBqX2dldGFkZHJpbmZvKFBKX0FGX0lORVQ2LCBzdHJfYWRkciwgJmNvdW50LCAmYWkpOworCSAgICBpZiAoc3RhdHVzPT1QSl9TVUNDRVNTKSB7CisJCXBqX21lbWNweSgmYWRkci0+aXB2Ni5zaW42X2FkZHIsICZhaS5haV9hZGRyLmlwdjYuc2luNl9hZGRyLAorCQkJICBzaXplb2YocGpfc29ja2FkZHJfaW42KSk7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKwlzdGF0dXMgPSBQSl9TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBTZXQgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgb2YgYW4gSVAgc29ja2V0IGFkZHJlc3MuCisgKiBUaGUgc3RyaW5nIGFkZHJlc3MgbWF5IGJlIGluIGEgc3RhbmRhcmQgbnVtYmVycyBhbmQgZG90cyBub3RhdGlvbiBvciAKKyAqIG1heSBiZSBhIGhvc3RuYW1lLiBJZiBob3N0bmFtZSBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgCisgKiByZXNvbHZlIHRoZSBob3N0IGludG8gdGhlIElQIGFkZHJlc3MuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja2FkZHJfaW5faW5pdCggcGpfc29ja2FkZHJfaW4gKmFkZHIsCisJCQkJICAgICAgICAgY29uc3QgcGpfc3RyX3QgKnN0cl9hZGRyLAorCQkJCQkgcGpfdWludDE2X3QgcG9ydCkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFkZHIsIChhZGRyLT5zaW5fYWRkci5zX2FkZHI9UEpfSU5BRERSX05PTkUsIFBKX0VJTlZBTCkpOworCisgICAgUEpfU09DS0FERFJfUkVTRVRfTEVOKGFkZHIpOworICAgIGFkZHItPnNpbl9mYW1pbHkgPSBQSl9BRl9JTkVUOworICAgIHBqX2J6ZXJvKGFkZHItPnNpbl96ZXJvLCBzaXplb2YoYWRkci0+c2luX3plcm8pKTsKKyAgICBwal9zb2NrYWRkcl9pbl9zZXRfcG9ydChhZGRyLCBwb3J0KTsKKyAgICByZXR1cm4gcGpfc29ja2FkZHJfaW5fc2V0X3N0cl9hZGRyKGFkZHIsIHN0cl9hZGRyKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgSVAgc29ja2V0IGFkZHJlc3MgYmFzZWQgb24gdGhlIGFkZHJlc3MgYW5kIHBvcnQgaW5mby4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrYWRkcl9pbml0KGludCBhZiwgCisJCQkJICAgICBwal9zb2NrYWRkciAqYWRkciwKKwkJCQkgICAgIGNvbnN0IHBqX3N0cl90ICpjcCwKKwkJCQkgICAgIHBqX3VpbnQxNl90IHBvcnQpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgaWYgKGFmID09IFBKX0FGX0lORVQpIHsKKwlyZXR1cm4gcGpfc29ja2FkZHJfaW5faW5pdCgmYWRkci0+aXB2NCwgY3AsIHBvcnQpOworICAgIH0KKworICAgIC8qIElQdjYgc3BlY2lmaWMgKi8KKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFmPT1QSl9BRl9JTkVUNiwgUEpfRUFGTk9UU1VQKTsKKworICAgIHBqX2J6ZXJvKGFkZHIsIHNpemVvZihwal9zb2NrYWRkcl9pbjYpKTsKKyAgICBhZGRyLT5hZGRyLnNhX2ZhbWlseSA9IFBKX0FGX0lORVQ2OworICAgIAorICAgIHN0YXR1cyA9IHBqX3NvY2thZGRyX3NldF9zdHJfYWRkcihhZiwgYWRkciwgY3ApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgYWRkci0+aXB2Ni5zaW42X3BvcnQgPSBwal9odG9ucyhwb3J0KTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIENvbXBhcmUgdHdvIHNvY2tldCBhZGRyZXNzZXMuCisgKi8KK1BKX0RFRihpbnQpIHBqX3NvY2thZGRyX2NtcCggY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkcjEsCisJCQkgICAgIGNvbnN0IHBqX3NvY2thZGRyX3QgKmFkZHIyKQoreworICAgIGNvbnN0IHBqX3NvY2thZGRyICphMSA9IChjb25zdCBwal9zb2NrYWRkciopIGFkZHIxOworICAgIGNvbnN0IHBqX3NvY2thZGRyICphMiA9IChjb25zdCBwal9zb2NrYWRkciopIGFkZHIyOworICAgIGludCBwb3J0MSwgcG9ydDI7CisgICAgaW50IHJlc3VsdDsKKworICAgIC8qIENvbXBhcmUgYWRkcmVzcyBmYW1pbHkgKi8KKyAgICBpZiAoYTEtPmFkZHIuc2FfZmFtaWx5IDwgYTItPmFkZHIuc2FfZmFtaWx5KQorCXJldHVybiAtMTsKKyAgICBlbHNlIGlmIChhMS0+YWRkci5zYV9mYW1pbHkgPiBhMi0+YWRkci5zYV9mYW1pbHkpCisJcmV0dXJuIDE7CisKKyAgICAvKiBDb21wYXJlIGFkZHJlc3NlcyAqLworICAgIHJlc3VsdCA9IHBqX21lbWNtcChwal9zb2NrYWRkcl9nZXRfYWRkcihhMSksCisJCSAgICAgICBwal9zb2NrYWRkcl9nZXRfYWRkcihhMiksCisJCSAgICAgICBwal9zb2NrYWRkcl9nZXRfYWRkcl9sZW4oYTEpKTsKKyAgICBpZiAocmVzdWx0ICE9IDApCisJcmV0dXJuIHJlc3VsdDsKKworICAgIC8qIENvbXBhcmUgcG9ydCBudW1iZXIgKi8KKyAgICBwb3J0MSA9IHBqX3NvY2thZGRyX2dldF9wb3J0KGExKTsKKyAgICBwb3J0MiA9IHBqX3NvY2thZGRyX2dldF9wb3J0KGEyKTsKKworICAgIGlmIChwb3J0MSA8IHBvcnQyKQorCXJldHVybiAtMTsKKyAgICBlbHNlIGlmIChwb3J0MSA+IHBvcnQyKQorCXJldHVybiAxOworCisgICAgLyogVE9ETzoKKyAgICAgKglEbyB3ZSBuZWVkIHRvIGNvbXBhcmUgZmxvdyBsYWJlbCBhbmQgc2NvcGUgaWQgaW4gSVB2Nj8gCisgICAgICovCisgICAgCisgICAgLyogTG9va3MgZXF1YWwgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCBmaXJzdCBJUCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9zdG5hbWUuCisgKi8KK1BKX0RFRihwal9pbl9hZGRyKSBwal9nZXRob3N0YWRkcih2b2lkKQoreworICAgIHBqX3NvY2thZGRyX2luIGFkZHI7CisgICAgY29uc3QgcGpfc3RyX3QgKmhvc3RuYW1lID0gcGpfZ2V0aG9zdG5hbWUoKTsKKworICAgIHBqX3NvY2thZGRyX2luX3NldF9zdHJfYWRkcigmYWRkciwgaG9zdG5hbWUpOworICAgIHJldHVybiBhZGRyLnNpbl9hZGRyOworfQorCisvKgorICogR2V0IHBvcnQgbnVtYmVyIG9mIGEgcGpfc29ja2FkZHJfaW4KKyAqLworUEpfREVGKHBqX3VpbnQxNl90KSBwal9zb2NrYWRkcl9pbl9nZXRfcG9ydChjb25zdCBwal9zb2NrYWRkcl9pbiAqYWRkcikKK3sKKyAgICByZXR1cm4gcGpfbnRvaHMoYWRkci0+c2luX3BvcnQpOworfQorCisvKgorICogR2V0IHRoZSBhZGRyZXNzIHBhcnQKKyAqLworUEpfREVGKHZvaWQqKSBwal9zb2NrYWRkcl9nZXRfYWRkcihjb25zdCBwal9zb2NrYWRkcl90ICphZGRyKQoreworICAgIGNvbnN0IHBqX3NvY2thZGRyICphID0gKGNvbnN0IHBqX3NvY2thZGRyKilhZGRyOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihhLT5hZGRyLnNhX2ZhbWlseSA9PSBQSl9BRl9JTkVUIHx8CisJCSAgICAgYS0+YWRkci5zYV9mYW1pbHkgPT0gUEpfQUZfSU5FVDYsIE5VTEwpOworCisgICAgaWYgKGEtPmFkZHIuc2FfZmFtaWx5ID09IFBKX0FGX0lORVQ2KQorCXJldHVybiAodm9pZCopICZhLT5pcHY2LnNpbjZfYWRkcjsKKyAgICBlbHNlCisJcmV0dXJuICh2b2lkKikgJmEtPmlwdjQuc2luX2FkZHI7Cit9CisKKy8qCisgKiBDaGVjayBpZiBzb2NrYWRkciBjb250YWlucyBhIG5vbi16ZXJvIGFkZHJlc3MKKyAqLworUEpfREVGKHBqX2Jvb2xfdCkgcGpfc29ja2FkZHJfaGFzX2FkZHIoY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkcikKK3sKKyAgICBjb25zdCBwal9zb2NrYWRkciAqYSA9IChjb25zdCBwal9zb2NrYWRkciopYWRkcjsKKworICAgIC8qIEl0J3MgcHJvYmFibHkgbm90IHdpc2UgdG8gcmFpc2UgYXNzZXJ0aW9uIGhlcmUgaWYKKyAgICAgKiB0aGUgYWRkcmVzcyBkb2Vzbid0IGNvbnRhaW4gYSB2YWxpZCBhZGRyZXNzIGZhbWlseSwgYW5kCisgICAgICoganVzdCByZXR1cm4gUEpfRkFMU0UgaW5zdGVhZC4KKyAgICAgKiAKKyAgICAgKiBUaGUgcmVhc29uIGlzIGJlY2F1c2UgYXBwbGljYXRpb24gbWF5IG5lZWQgdG8gZGlzdGluZ3Vpc2ggCisgICAgICogdGhlc2UgdGhyZWUgY29uZGl0aW9ucyB3aXRoIHNvY2thZGRyOgorICAgICAqCWEpIHNvY2thZGRyIGlzIG5vdCBpbml0aWFsaXplZC4gVGhpcyBpcyBieSBjb252ZW50aW9uCisgICAgICoJICAgaW5kaWNhdGVkIGJ5IHNhX2ZhbWlseT09MC4KKyAgICAgKgliKSBzb2NrYWRkciBpcyBpbml0aWFsaXplZCB3aXRoIHplcm8gYWRkcmVzcy4gVGhpcyBpcworICAgICAqCSAgIGluZGljYXRlZCB3aXRoIHRoZSBhZGRyZXNzIGZpZWxkIGhhdmluZyB6ZXJvIGFkZHJlc3MuCisgICAgICoJYykgc29ja2FkZHIgaXMgaW5pdGlhbGl6ZWQgd2l0aCB2YWxpZCBhZGRyZXNzL3BvcnQuCisgICAgICoKKyAgICAgKiBJZiB3ZSBlbmFibGUgdGhpcyBhc3NlcnRpb24sIHRoZW4gYXBwbGljYXRpb24gd2lsbCBsb29zZQorICAgICAqIHRoZSBjYXBhYmlsaXR5IHRvIHNwZWNpZnkgY29uZGl0aW9uIGEpLCBzaW5jZSBpdCB3aWxsIGJlCisgICAgICogZm9yY2VkIHRvIGFsd2F5cyBpbml0aWFsaXplIHNvY2thZGRyIChldmVuIHdpdGggemVybyBhZGRyZXNzKS4KKyAgICAgKiBUaGlzIG1heSBicmVhayBzb21lIHBhcnRzIG9mIHVwcGVyIGxheWVyIGxpYnJhcmllcy4KKyAgICAgKi8KKyAgICAvL1BKX0FTU0VSVF9SRVRVUk4oYS0+YWRkci5zYV9mYW1pbHkgPT0gUEpfQUZfSU5FVCB8fAorICAgIC8vCQkgICAgIGEtPmFkZHIuc2FfZmFtaWx5ID09IFBKX0FGX0lORVQ2LCBQSl9GQUxTRSk7CisKKyAgICBpZiAoYS0+YWRkci5zYV9mYW1pbHkhPVBKX0FGX0lORVQgJiYgYS0+YWRkci5zYV9mYW1pbHkhPVBKX0FGX0lORVQ2KSB7CisJcmV0dXJuIFBKX0ZBTFNFOworICAgIH0gZWxzZSBpZiAoYS0+YWRkci5zYV9mYW1pbHkgPT0gUEpfQUZfSU5FVDYpIHsKKwlwal91aW50OF90IHplcm9bMjRdOworCXBqX2J6ZXJvKHplcm8sIHNpemVvZih6ZXJvKSk7CisJcmV0dXJuIHBqX21lbWNtcChhLT5pcHY2LnNpbjZfYWRkci5zNl9hZGRyLCB6ZXJvLCAKKwkJCSBzaXplb2YocGpfaW42X2FkZHIpKSAhPSAwOworICAgIH0gZWxzZQorCXJldHVybiBhLT5pcHY0LnNpbl9hZGRyLnNfYWRkciAhPSBQSl9JTkFERFJfQU5ZOworfQorCisvKgorICogR2V0IHBvcnQgbnVtYmVyCisgKi8KK1BKX0RFRihwal91aW50MTZfdCkgcGpfc29ja2FkZHJfZ2V0X3BvcnQoY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkcikKK3sKKyAgICBjb25zdCBwal9zb2NrYWRkciAqYSA9IChjb25zdCBwal9zb2NrYWRkciopIGFkZHI7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGEtPmFkZHIuc2FfZmFtaWx5ID09IFBKX0FGX0lORVQgfHwKKwkJICAgICBhLT5hZGRyLnNhX2ZhbWlseSA9PSBQSl9BRl9JTkVUNiwgKHBqX3VpbnQxNl90KTB4RkZGRik7CisKKyAgICByZXR1cm4gcGpfbnRvaHMoKHBqX3VpbnQxNl90KShhLT5hZGRyLnNhX2ZhbWlseSA9PSBQSl9BRl9JTkVUNiA/CisJCQkJICAgIGEtPmlwdjYuc2luNl9wb3J0IDogYS0+aXB2NC5zaW5fcG9ydCkpOworfQorCisvKgorICogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGFkZHJlc3MgcGFydC4KKyAqLworUEpfREVGKHVuc2lnbmVkKSBwal9zb2NrYWRkcl9nZXRfYWRkcl9sZW4oY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkcikKK3sKKyAgICBjb25zdCBwal9zb2NrYWRkciAqYSA9IChjb25zdCBwal9zb2NrYWRkciopIGFkZHI7CisgICAgUEpfQVNTRVJUX1JFVFVSTihhLT5hZGRyLnNhX2ZhbWlseSA9PSBQSl9BRl9JTkVUIHx8CisJCSAgICAgYS0+YWRkci5zYV9mYW1pbHkgPT0gUEpfQUZfSU5FVDYsIDApOworICAgIHJldHVybiBhLT5hZGRyLnNhX2ZhbWlseSA9PSBQSl9BRl9JTkVUNiA/CisJICAgIHNpemVvZihwal9pbjZfYWRkcikgOiBzaXplb2YocGpfaW5fYWRkcik7Cit9CisKKy8qCisgKiBHZXQgc29ja2V0IGFkZHJlc3MgbGVuZ3RoLgorICovCitQSl9ERUYodW5zaWduZWQpIHBqX3NvY2thZGRyX2dldF9sZW4oY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkcikKK3sKKyAgICBjb25zdCBwal9zb2NrYWRkciAqYSA9IChjb25zdCBwal9zb2NrYWRkciopIGFkZHI7CisgICAgUEpfQVNTRVJUX1JFVFVSTihhLT5hZGRyLnNhX2ZhbWlseSA9PSBQSl9BRl9JTkVUIHx8CisJCSAgICAgYS0+YWRkci5zYV9mYW1pbHkgPT0gUEpfQUZfSU5FVDYsIDApOworICAgIHJldHVybiBhLT5hZGRyLnNhX2ZhbWlseSA9PSBQSl9BRl9JTkVUNiA/CisJICAgIHNpemVvZihwal9zb2NrYWRkcl9pbjYpIDogc2l6ZW9mKHBqX3NvY2thZGRyX2luKTsKK30KKworLyoKKyAqIENvcHkgb25seSB0aGUgYWRkcmVzcyBwYXJ0IChzaW5fYWRkci9zaW42X2FkZHIpIG9mIGEgc29ja2V0IGFkZHJlc3MuCisgKi8KK1BKX0RFRih2b2lkKSBwal9zb2NrYWRkcl9jb3B5X2FkZHIoIHBqX3NvY2thZGRyICpkc3QsCisJCQkJICAgIGNvbnN0IHBqX3NvY2thZGRyICpzcmMpCit7CisgICAgLyogRGVzdGluYXRpb24gc29ja2FkZHIgbWlnaHQgbm90IGJlIGluaXRpYWxpemVkICovCisgICAgY29uc3QgY2hhciAqc3JjYnVmID0gKGNoYXIqKXBqX3NvY2thZGRyX2dldF9hZGRyKHNyYyk7CisgICAgY2hhciAqZHN0YnVmID0gKChjaGFyKilkc3QpICsgKHNyY2J1ZiAtIChjaGFyKilzcmMpOworICAgIHBqX21lbWNweShkc3RidWYsIHNyY2J1ZiwgcGpfc29ja2FkZHJfZ2V0X2FkZHJfbGVuKHNyYykpOworfQorCisvKgorICogQ29weSBzb2NrZXQgYWRkcmVzcy4KKyAqLworUEpfREVGKHZvaWQpIHBqX3NvY2thZGRyX2NwKHBqX3NvY2thZGRyX3QgKmRzdCwgY29uc3QgcGpfc29ja2FkZHJfdCAqc3JjKQoreworICAgIHBqX21lbWNweShkc3QsIHNyYywgcGpfc29ja2FkZHJfZ2V0X2xlbihzcmMpKTsKK30KKworLyoKKyAqIFNldCBwb3J0IG51bWJlciBvZiBwal9zb2NrYWRkcl9pbgorICovCitQSl9ERUYodm9pZCkgcGpfc29ja2FkZHJfaW5fc2V0X3BvcnQocGpfc29ja2FkZHJfaW4gKmFkZHIsIAorCQkJCSAgICAgcGpfdWludDE2X3QgaG9zdHBvcnQpCit7CisgICAgYWRkci0+c2luX3BvcnQgPSBwal9odG9ucyhob3N0cG9ydCk7Cit9CisKKy8qCisgKiBTZXQgcG9ydCBudW1iZXIgb2YgcGpfc29ja2FkZHIKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrYWRkcl9zZXRfcG9ydChwal9zb2NrYWRkciAqYWRkciwgCisJCQkJCSBwal91aW50MTZfdCBob3N0cG9ydCkKK3sKKyAgICBpbnQgYWYgPSBhZGRyLT5hZGRyLnNhX2ZhbWlseTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oYWY9PVBKX0FGX0lORVQgfHwgYWY9PVBKX0FGX0lORVQ2LCBQSl9FSU5WQUwpOworCisgICAgaWYgKGFmID09IFBKX0FGX0lORVQ2KQorCWFkZHItPmlwdjYuc2luNl9wb3J0ID0gcGpfaHRvbnMoaG9zdHBvcnQpOworICAgIGVsc2UKKwlhZGRyLT5pcHY0LnNpbl9wb3J0ID0gcGpfaHRvbnMoaG9zdHBvcnQpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBHZXQgSVB2NCBhZGRyZXNzCisgKi8KK1BKX0RFRihwal9pbl9hZGRyKSBwal9zb2NrYWRkcl9pbl9nZXRfYWRkcihjb25zdCBwal9zb2NrYWRkcl9pbiAqYWRkcikKK3sKKyAgICBwal9pbl9hZGRyIGluX2FkZHI7CisgICAgaW5fYWRkci5zX2FkZHIgPSBwal9udG9obChhZGRyLT5zaW5fYWRkci5zX2FkZHIpOworICAgIHJldHVybiBpbl9hZGRyOworfQorCisvKgorICogU2V0IElQdjQgYWRkcmVzcworICovCitQSl9ERUYodm9pZCkgcGpfc29ja2FkZHJfaW5fc2V0X2FkZHIocGpfc29ja2FkZHJfaW4gKmFkZHIsCisJCQkJICAgICBwal91aW50MzJfdCBob3N0YWRkcikKK3sKKyAgICBhZGRyLT5zaW5fYWRkci5zX2FkZHIgPSBwal9odG9ubChob3N0YWRkcik7Cit9CisKKy8qCisgKiBQYXJzZSBhZGRyZXNzCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja2FkZHJfcGFyc2UyKGludCBhZiwgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkgICAgICAgY29uc3QgcGpfc3RyX3QgKnN0ciwKKwkJCQkgICAgICAgcGpfc3RyX3QgKnBfaG9zdHBhcnQsCisJCQkJICAgICAgIHBqX3VpbnQxNl90ICpwX3BvcnQsCisJCQkJICAgICAgIGludCAqcmFmKQoreworICAgIGNvbnN0IGNoYXIgKmVuZCA9IHN0ci0+cHRyICsgc3RyLT5zbGVuOworICAgIGNvbnN0IGNoYXIgKmxhc3RfY29sb25fcG9zID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjb2xvbl9jbnQgPSAwOworICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKChhZj09UEpfQUZfSU5FVCB8fCBhZj09UEpfQUZfSU5FVDYgfHwgYWY9PVBKX0FGX1VOU1BFQykgJiYKKwkJICAgICBvcHRpb25zPT0wICYmCisJCSAgICAgc3RyIT1OVUxMLCBQSl9FSU5WQUwpOworCisgICAgLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgZW1wdHkgaW5wdXQgKi8KKyAgICBpZiAoc3RyLT5zbGVuPT0wIHx8IHN0ci0+cHRyPT1OVUxMKSB7CisJaWYgKHBfaG9zdHBhcnQpCisJICAgIHBfaG9zdHBhcnQtPnNsZW4gPSAwOworCWlmIChwX3BvcnQpCisJICAgICpwX3BvcnQgPSAwOworCWlmIChyYWYpCisJICAgICpyYWYgPSBQSl9BRl9JTkVUOworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKworICAgIC8qIENvdW50IHRoZSBjb2xvbiBhbmQgZ2V0IHRoZSBsYXN0IGNvbG9uICovCisgICAgZm9yIChwPXN0ci0+cHRyOyBwIT1lbmQ7ICsrcCkgeworCWlmICgqcCA9PSAnOicpIHsKKwkgICAgKytjb2xvbl9jbnQ7CisJICAgIGxhc3RfY29sb25fcG9zID0gcDsKKwl9CisgICAgfQorCisgICAgLyogRGVkdWNlIGFkZHJlc3MgZmFtaWx5IGlmIGl0J3Mgbm90IGdpdmVuICovCisgICAgaWYgKGFmID09IFBKX0FGX1VOU1BFQykgeworCWlmIChjb2xvbl9jbnQgPiAxKQorCSAgICBhZiA9IFBKX0FGX0lORVQ2OworCWVsc2UKKwkgICAgYWYgPSBQSl9BRl9JTkVUOworICAgIH0gZWxzZSBpZiAoYWYgPT0gUEpfQUZfSU5FVCAmJiBjb2xvbl9jbnQgPiAxKQorCXJldHVybiBQSl9FSU5WQUw7CisKKyAgICBpZiAocmFmKQorCSpyYWYgPSBhZjsKKworICAgIGlmIChhZiA9PSBQSl9BRl9JTkVUKSB7CisJLyogUGFyc2UgYXMgSVB2NC4gU3VwcG9ydGVkIGZvcm1hdHM6CisJICogIC0gIjEwLjAuMC4xOjgwIgorCSAqICAtICIxMC4wLjAuMSIKKwkgKiAgLSAiMTAuMC4wLjE6IgorCSAqICAtICI6ODAiCisJICogIC0gIjoiCisJICovCisJcGpfc3RyX3QgaG9zdHBhcnQ7CisJdW5zaWduZWQgbG9uZyBwb3J0OworCisJaG9zdHBhcnQucHRyID0gKGNoYXIqKXN0ci0+cHRyOworCisJaWYgKGxhc3RfY29sb25fcG9zKSB7CisJICAgIHBqX3N0cl90IHBvcnRfcGFydDsKKwkgICAgaW50IGk7CisKKwkgICAgaG9zdHBhcnQuc2xlbiA9IGxhc3RfY29sb25fcG9zIC0gc3RyLT5wdHI7CisKKwkgICAgcG9ydF9wYXJ0LnB0ciA9IChjaGFyKilsYXN0X2NvbG9uX3BvcyArIDE7CisJICAgIHBvcnRfcGFydC5zbGVuID0gZW5kIC0gcG9ydF9wYXJ0LnB0cjsKKworCSAgICAvKiBNYWtlIHN1cmUgcG9ydCBudW1iZXIgaXMgdmFsaWQgKi8KKwkgICAgZm9yIChpPTA7IGk8cG9ydF9wYXJ0LnNsZW47ICsraSkgeworCQlpZiAoIXBqX2lzZGlnaXQocG9ydF9wYXJ0LnB0cltpXSkpCisJCSAgICByZXR1cm4gUEpfRUlOVkFMOworCSAgICB9CisJICAgIHBvcnQgPSBwal9zdHJ0b3VsKCZwb3J0X3BhcnQpOworCSAgICBpZiAocG9ydCA+IDY1NTM1KQorCQlyZXR1cm4gUEpfRUlOVkFMOworCX0gZWxzZSB7CisJICAgIGhvc3RwYXJ0LnNsZW4gPSBzdHItPnNsZW47CisJICAgIHBvcnQgPSAwOworCX0KKworCWlmIChwX2hvc3RwYXJ0KQorCSAgICAqcF9ob3N0cGFydCA9IGhvc3RwYXJ0OworCWlmIChwX3BvcnQpCisJICAgICpwX3BvcnQgPSAocGpfdWludDE2X3QpcG9ydDsKKworCXJldHVybiBQSl9TVUNDRVNTOworCisgICAgfSBlbHNlIGlmIChhZiA9PSBQSl9BRl9JTkVUNikgeworCisJLyogUGFyc2UgYXMgSVB2Ni4gU3VwcG9ydGVkIGZvcm1hdHM6CisJICogIC0gImZlOjowMTo4MCIgID09PiBub3RlOiBwb3J0IG51bWJlciBpcyB6ZXJvIGluIHRoaXMgY2FzZSwgbm90IDgwIQorCSAqICAtICJbZmU6OjAxXTo4MCIKKwkgKiAgLSAiZmU6OjAxIgorCSAqICAtICJmZTo6MDE6IgorCSAqICAtICJbZmU6OjAxXSIKKwkgKiAgLSAiW2ZlOjowMV06IgorCSAqICAtICJbOjpdOjgwIgorCSAqICAtICI6Ojo4MCIKKwkgKiAgLSAiWzo6XSIKKwkgKiAgLSAiWzo6XToiCisJICogIC0gIjo6OiIKKwkgKiAgLSAiOjoiCisJICovCisJcGpfc3RyX3QgaG9zdHBhcnQsIHBvcnRfcGFydDsKKworCWlmICgqc3RyLT5wdHIgPT0gJ1snKSB7CisJICAgIGNoYXIgKmVuZF9icmFja2V0OworCSAgICBpbnQgaTsKKwkgICAgdW5zaWduZWQgbG9uZyBwb3J0OworCisJICAgIGlmIChsYXN0X2NvbG9uX3BvcyA9PSBOVUxMKQorCQlyZXR1cm4gUEpfRUlOVkFMOworCisJICAgIGVuZF9icmFja2V0ID0gcGpfc3RyY2hyKHN0ciwgJ10nKTsKKwkgICAgaWYgKGVuZF9icmFja2V0ID09IE5VTEwpCisJCXJldHVybiBQSl9FSU5WQUw7CisKKwkgICAgaG9zdHBhcnQucHRyID0gKGNoYXIqKXN0ci0+cHRyICsgMTsKKwkgICAgaG9zdHBhcnQuc2xlbiA9IGVuZF9icmFja2V0IC0gaG9zdHBhcnQucHRyOworCisJICAgIGlmIChsYXN0X2NvbG9uX3BvcyA8IGVuZF9icmFja2V0KSB7CisJCXBvcnRfcGFydC5wdHIgPSBOVUxMOworCQlwb3J0X3BhcnQuc2xlbiA9IDA7CisJICAgIH0gZWxzZSB7CisJCXBvcnRfcGFydC5wdHIgPSAoY2hhciopbGFzdF9jb2xvbl9wb3MgKyAxOworCQlwb3J0X3BhcnQuc2xlbiA9IGVuZCAtIHBvcnRfcGFydC5wdHI7CisJICAgIH0KKworCSAgICAvKiBNYWtlIHN1cmUgcG9ydCBudW1iZXIgaXMgdmFsaWQgKi8KKwkgICAgZm9yIChpPTA7IGk8cG9ydF9wYXJ0LnNsZW47ICsraSkgeworCQlpZiAoIXBqX2lzZGlnaXQocG9ydF9wYXJ0LnB0cltpXSkpCisJCSAgICByZXR1cm4gUEpfRUlOVkFMOworCSAgICB9CisJICAgIHBvcnQgPSBwal9zdHJ0b3VsKCZwb3J0X3BhcnQpOworCSAgICBpZiAocG9ydCA+IDY1NTM1KQorCQlyZXR1cm4gUEpfRUlOVkFMOworCisJICAgIGlmIChwX2hvc3RwYXJ0KQorCQkqcF9ob3N0cGFydCA9IGhvc3RwYXJ0OworCSAgICBpZiAocF9wb3J0KQorCQkqcF9wb3J0ID0gKHBqX3VpbnQxNl90KXBvcnQ7CisKKwkgICAgcmV0dXJuIFBKX1NVQ0NFU1M7CisKKwl9IGVsc2UgeworCSAgICAvKiBUcmVhdCBldmVyeXRoaW5nIGFzIHBhcnQgb2YgdGhlIElQdjYgSVAgYWRkcmVzcyAqLworCSAgICBpZiAocF9ob3N0cGFydCkKKwkJKnBfaG9zdHBhcnQgPSAqc3RyOworCSAgICBpZiAocF9wb3J0KQorCQkqcF9wb3J0ID0gMDsKKworCSAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKwl9CisKKyAgICB9IGVsc2UgeworCXJldHVybiBQSl9FQUZOT1RTVVA7CisgICAgfQorCit9CisKKy8qCisgKiBQYXJzZSBhZGRyZXNzCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja2FkZHJfcGFyc2UoIGludCBhZiwgdW5zaWduZWQgb3B0aW9ucywKKwkJCQkgICAgICAgY29uc3QgcGpfc3RyX3QgKnN0ciwKKwkJCQkgICAgICAgcGpfc29ja2FkZHIgKmFkZHIpCit7CisgICAgcGpfc3RyX3QgaG9zdHBhcnQ7CisgICAgcGpfdWludDE2X3QgcG9ydDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFkZHIsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihhZj09UEpfQUZfVU5TUEVDIHx8CisJCSAgICAgYWY9PVBKX0FGX0lORVQgfHwKKwkJICAgICBhZj09UEpfQUZfSU5FVDYsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihvcHRpb25zID09IDAsIFBKX0VJTlZBTCk7CisKKyAgICBzdGF0dXMgPSBwal9zb2NrYWRkcl9wYXJzZTIoYWYsIG9wdGlvbnMsIHN0ciwgJmhvc3RwYXJ0LCAmcG9ydCwgJmFmKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKyAgICAKKyNpZiAhZGVmaW5lZChQSl9IQVNfSVBWNikgfHwgIVBKX0hBU19JUFY2CisgICAgaWYgKGFmPT1QSl9BRl9JTkVUNikKKwlyZXR1cm4gUEpfRUlQVjZOT1RTVVA7CisjZW5kaWYKKworICAgIHN0YXR1cyA9IHBqX3NvY2thZGRyX2luaXQoYWYsIGFkZHIsICZob3N0cGFydCwgcG9ydCk7CisjaWYgZGVmaW5lZChQSl9IQVNfSVBWNikgJiYgUEpfSEFTX0lQVjYKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgJiYgYWYgPT0gUEpfQUZfSU5FVDYpIHsKKwkvKiBQYXJzaW5nIGRvZXMgbm90IHlpZWxkIHZhbGlkIGFkZHJlc3MuIFRyeSB0byB0cmVhdCB0aGUgbGFzdCAKKwkgKiBwb3J0aW9uIGFmdGVyIHRoZSBjb2xvbiBhcyBwb3J0IG51bWJlci4KKwkgKi8KKwljb25zdCBjaGFyICpsYXN0X2NvbG9uX3Bvcz1OVUxMLCAqcDsKKwljb25zdCBjaGFyICplbmQgPSBzdHItPnB0ciArIHN0ci0+c2xlbjsKKwl1bnNpZ25lZCBsb25nIGxvbmdfcG9ydDsKKwlwal9zdHJfdCBwb3J0X3BhcnQ7CisJaW50IGk7CisKKwkvKiBQYXJzZSBhcyBJUHY2OnBvcnQgKi8KKwlmb3IgKHA9c3RyLT5wdHI7IHAhPWVuZDsgKytwKSB7CisJICAgIGlmICgqcCA9PSAnOicpCisJCWxhc3RfY29sb25fcG9zID0gcDsKKwl9CisKKwlpZiAobGFzdF9jb2xvbl9wb3MgPT0gTlVMTCkKKwkgICAgcmV0dXJuIHN0YXR1czsKKworCWhvc3RwYXJ0LnB0ciA9IChjaGFyKilzdHItPnB0cjsKKwlob3N0cGFydC5zbGVuID0gbGFzdF9jb2xvbl9wb3MgLSBzdHItPnB0cjsKKworCXBvcnRfcGFydC5wdHIgPSAoY2hhciopbGFzdF9jb2xvbl9wb3MgKyAxOworCXBvcnRfcGFydC5zbGVuID0gZW5kIC0gcG9ydF9wYXJ0LnB0cjsKKworCS8qIE1ha2Ugc3VyZSBwb3J0IG51bWJlciBpcyB2YWxpZCAqLworCWZvciAoaT0wOyBpPHBvcnRfcGFydC5zbGVuOyArK2kpIHsKKwkgICAgaWYgKCFwal9pc2RpZ2l0KHBvcnRfcGFydC5wdHJbaV0pKQorCQlyZXR1cm4gc3RhdHVzOworCX0KKwlsb25nX3BvcnQgPSBwal9zdHJ0b3VsKCZwb3J0X3BhcnQpOworCWlmIChsb25nX3BvcnQgPiA2NTUzNSkKKwkgICAgcmV0dXJuIHN0YXR1czsKKworCXBvcnQgPSAocGpfdWludDE2X3QpbG9uZ19wb3J0OworCisJc3RhdHVzID0gcGpfc29ja2FkZHJfaW5pdChQSl9BRl9JTkVUNiwgYWRkciwgJmhvc3RwYXJ0LCBwb3J0KTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBSZXNvbHZlIHRoZSBJUCBhZGRyZXNzIG9mIGxvY2FsIG1hY2hpbmUgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0aG9zdGlwKGludCBhZiwgcGpfc29ja2FkZHIgKmFkZHIpCit7CisgICAgdW5zaWduZWQgaSwgY291bnQsIGNhbmRfY250OworICAgIGVudW0geworCUNBTkRfQ05UID0gOCwKKworCS8qIFdlaWdodGluZyB0byBiZSBhcHBsaWVkIHRvIGZvdW5kIGFkZHJlc3NlcyAqLworCVdFSUdIVF9IT1NUTkFNRQk9IDEsCS8qIGhvc3RuYW1lIElQIGlzIG5vdCBhbHdheXMgdmFsaWQhICovCisJV0VJR0hUX0RFRl9ST1VURSA9IDIsCisJV0VJR0hUX0lOVEVSRkFDRSA9IDEsCisJV0VJR0hUX0xPT1BCQUNLID0gLTUsCisJV0VJR0hUX0xJTktfTE9DQUwgPSAtNCwKKwlXRUlHSFRfRElTQUJMRUQgPSAtNTAsCisKKwlNSU5fV0VJR0hUID0gV0VJR0hUX0RJU0FCTEVEKzEJLyogbWluaW11bSB3ZWlnaHQgdG8gdXNlICovCisgICAgfTsKKyAgICAvKiBjYW5kaWRhdGVzOiAqLworICAgIHBqX3NvY2thZGRyIGNhbmRfYWRkcltDQU5EX0NOVF07CisgICAgaW50CQljYW5kX3dlaWdodFtDQU5EX0NOVF07CisgICAgaW50CSAgICAgICAgc2VsZWN0ZWRfY2FuZDsKKyAgICBjaGFyCXN0cmlwW1BKX0lORVQ2X0FERFJTVFJMRU4rMTBdOworICAgIC8qIFNwZWNpYWwgSVB2NCBhZGRyZXNzZXMuICovCisgICAgc3RydWN0IHNwZWNfaXB2NF90CisgICAgeworCXBqX3VpbnQzMl90IGFkZHI7CisJcGpfdWludDMyX3QgbWFzazsKKwlpbnQJICAgIHdlaWdodDsKKyAgICB9IHNwZWNfaXB2NFtdID0KKyAgICB7CisJLyogMTI3LjAuMC4wLzgsIGxvb3BiYWNrIGFkZHIgd2lsbCBiZSB1c2VkIGlmIHRoZXJlIGlzIG5vIG90aGVyCisJICogYWRkcmVzc2VzLgorCSAqLworCXsgMHg3ZjAwMDAwMCwgMHhGRjAwMDAwMCwgV0VJR0hUX0xPT1BCQUNLIH0sCisKKwkvKiAwLjAuMC4wLzgsIHNwZWNpYWwgSVAgdGhhdCBkb2Vzbid0IHNlZW0gdG8gYmUgcHJhY3RpY2FsbHkgdXNlZnVsICovCisJeyAweDAwMDAwMDAwLCAweEZGMDAwMDAwLCBXRUlHSFRfRElTQUJMRUQgfSwKKworCS8qIDE2OS4yNTQuMC4wLzE2LCBhIHplcm9jb25mL2xpbmstbG9jYWwgYWRkcmVzcywgd2hpY2ggaGFzIGhpZ2hlcgorCSAqIHByaW9yaXR5IHRoYW4gbG9vcGJhY2sgYW5kIHdpbGwgYmUgdXNlZCBpZiB0aGVyZSBpcyBubyBvdGhlcgorCSAqIHZhbGlkIGFkZHJlc3Nlcy4KKwkgKi8KKwl7IDB4YTlmZTAwMDAsIDB4RkZGRjAwMDAsIFdFSUdIVF9MSU5LX0xPQ0FMIH0KKyAgICB9OworICAgIC8qIFNwZWNpYWwgSVB2NiBhZGRyZXNzZXMgKi8KKyAgICBzdHJ1Y3Qgc3BlY19pcHY2X3QKKyAgICB7CisJcGpfdWludDhfdCBhZGRyWzE2XTsKKwlwal91aW50OF90IG1hc2tbMTZdOworCWludAkgICB3ZWlnaHQ7CisgICAgfSBzcGVjX2lwdjZbXSA9CisgICAgeworCS8qIExvb3BiYWNrIGFkZHJlc3MsIDo6MS8xMjggKi8KKwl7IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxfSwKKwkgIHsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisJICAgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfSwKKwkgIFdFSUdIVF9MT09QQkFDSworCX0sCisKKwkvKiBMaW5rIGxvY2FsLCBmZTgwOjovMTAgKi8KKwl7IHsweGZlLDB4ODAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwKKwkgIHsweGZmLDB4YzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwKKwkgIFdFSUdIVF9MSU5LX0xPQ0FMCisJfSwKKworCS8qIERpc2FibGVkLCA6Oi8xMjggKi8KKwl7IHsweDAsMHgwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sCisJeyAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisJICAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9LAorCSAgV0VJR0hUX0RJU0FCTEVECisJfQorICAgIH07CisgICAgcGpfYWRkcmluZm8gYWk7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogTWF5IG5vdCBiZSB1c2VkIGlmIFRSQUNFXyBpcyBkaXNhYmxlZCAqLworICAgIFBKX1VOVVNFRF9BUkcoc3RyaXApOworCisjaWZkZWYgX01TQ19WRVIKKyAgICAvKiBHZXQgcmlkIG9mICJ1bmluaXRpYWxpemVkIGhlIHZhcmlhYmxlIiB3aXRoIE1TIGNvbXBpbGVycyAqLworICAgIHBqX2J6ZXJvKCZhaSwgc2l6ZW9mKGFpKSk7CisjZW5kaWYKKworICAgIGNhbmRfY250ID0gMDsKKyAgICBwal9iemVybyhjYW5kX2FkZHIsIHNpemVvZihjYW5kX2FkZHIpKTsKKyAgICBwal9iemVybyhjYW5kX3dlaWdodCwgc2l6ZW9mKGNhbmRfd2VpZ2h0KSk7CisgICAgZm9yIChpPTA7IGk8UEpfQVJSQVlfU0laRShjYW5kX2FkZHIpOyArK2kpIHsKKwljYW5kX2FkZHJbaV0uYWRkci5zYV9mYW1pbHkgPSAocGpfdWludDE2X3QpYWY7CisJUEpfU09DS0FERFJfUkVTRVRfTEVOKCZjYW5kX2FkZHJbaV0pOworICAgIH0KKworICAgIGFkZHItPmFkZHIuc2FfZmFtaWx5ID0gKHBqX3VpbnQxNl90KWFmOworICAgIFBKX1NPQ0tBRERSX1JFU0VUX0xFTihhZGRyKTsKKworI2lmICFkZWZpbmVkKFBKX0dFVEhPU1RJUF9ESVNBQkxFX0xPQ0FMX1JFU09MVVRJT04pIHx8IFwKKyAgICBQSl9HRVRIT1NUSVBfRElTQUJMRV9MT0NBTF9SRVNPTFVUSU9OID09IDAKKyAgICAvKiBHZXQgaG9zdG5hbWUncyBJUCBhZGRyZXNzICovCisgICAgY291bnQgPSAxOworICAgIHN0YXR1cyA9IHBqX2dldGFkZHJpbmZvKGFmLCBwal9nZXRob3N0bmFtZSgpLCAmY291bnQsICZhaSk7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisgICAgCXBqX2Fzc2VydChhaS5haV9hZGRyLmFkZHIuc2FfZmFtaWx5ID09IChwal91aW50MTZfdClhZik7CisgICAgCXBqX3NvY2thZGRyX2NvcHlfYWRkcigmY2FuZF9hZGRyW2NhbmRfY250XSwgJmFpLmFpX2FkZHIpOworCXBqX3NvY2thZGRyX3NldF9wb3J0KCZjYW5kX2FkZHJbY2FuZF9jbnRdLCAwKTsKKwljYW5kX3dlaWdodFtjYW5kX2NudF0gKz0gV0VJR0hUX0hPU1ROQU1FOworCSsrY2FuZF9jbnQ7CisKKwlUUkFDRV8oKFRISVNfRklMRSwgImhvc3RuYW1lIElQIGlzICVzIiwKKwkJcGpfc29ja2FkZHJfcHJpbnQoJmFpLmFpX2FkZHIsIHN0cmlwLCBzaXplb2Yoc3RyaXApLCAwKSkpOworICAgIH0KKyNlbHNlCisgICAgUEpfVU5VU0VEX0FSRyhhaSk7CisgICAgUEpfVU5VU0VEX0FSRyhjb3VudCk7CisjZW5kaWYKKworICAgIC8qIEdldCBkZWZhdWx0IGludGVyZmFjZSAoaW50ZXJmYWNlIGZvciBkZWZhdWx0IHJvdXRlKSAqLworICAgIGlmIChjYW5kX2NudCA8IFBKX0FSUkFZX1NJWkUoY2FuZF9hZGRyKSkgeworCXN0YXR1cyA9IHBqX2dldGRlZmF1bHRpcGludGVyZmFjZShhZiwgYWRkcik7CisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJICAgIFRSQUNFXygoVEhJU19GSUxFLCAiZGVmYXVsdCBJUCBpcyAlcyIsCisJCSAgICBwal9zb2NrYWRkcl9wcmludChhZGRyLCBzdHJpcCwgc2l6ZW9mKHN0cmlwKSwgMCkpKTsKKworCSAgICBwal9zb2NrYWRkcl9zZXRfcG9ydChhZGRyLCAwKTsKKwkgICAgZm9yIChpPTA7IGk8Y2FuZF9jbnQ7ICsraSkgeworCQlpZiAocGpfc29ja2FkZHJfY21wKCZjYW5kX2FkZHJbaV0sIGFkZHIpPT0wKQorCQkgICAgYnJlYWs7CisJICAgIH0KKworCSAgICBjYW5kX3dlaWdodFtpXSArPSBXRUlHSFRfREVGX1JPVVRFOworCSAgICBpZiAoaSA+PSBjYW5kX2NudCkgeworCQlwal9zb2NrYWRkcl9jb3B5X2FkZHIoJmNhbmRfYWRkcltpXSwgYWRkcik7CisJCSsrY2FuZF9jbnQ7CisJICAgIH0KKwl9CisgICAgfQorCisKKyAgICAvKiBFbnVtZXJhdGUgSVAgaW50ZXJmYWNlcyAqLworICAgIGlmIChjYW5kX2NudCA8IFBKX0FSUkFZX1NJWkUoY2FuZF9hZGRyKSkgeworCXVuc2lnbmVkIHN0YXJ0X2lmID0gY2FuZF9jbnQ7CisJdW5zaWduZWQgY291bnQgPSBQSl9BUlJBWV9TSVpFKGNhbmRfYWRkcikgLSBzdGFydF9pZjsKKworCXN0YXR1cyA9IHBqX2VudW1faXBfaW50ZXJmYWNlKGFmLCAmY291bnQsICZjYW5kX2FkZHJbc3RhcnRfaWZdKTsKKwlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MgJiYgY291bnQpIHsKKwkgICAgLyogQ2xlYXIgdGhlIHBvcnQgbnVtYmVyICovCisJICAgIGZvciAoaT0wOyBpPGNvdW50OyArK2kpCisJCXBqX3NvY2thZGRyX3NldF9wb3J0KCZjYW5kX2FkZHJbc3RhcnRfaWYraV0sIDApOworCisJICAgIC8qIEZvciBlYWNoIGNhbmRpZGF0ZSB0aGF0IHdlIGZvdW5kIHNvIGZhciAodGhhdCBpcyB0aGUgaG9zdG5hbWUKKwkgICAgICogYWRkcmVzcyBhbmQgZGVmYXVsdCBpbnRlcmZhY2UgYWRkcmVzcywgY2hlY2sgaWYgdGhleSdyZSBmb3VuZAorCSAgICAgKiBpbiB0aGUgaW50ZXJmYWNlIGxpc3QuIElmIGZvdW5kLCBhZGQgdGhlIHdlaWdodCwgYW5kIGlmIG5vdCwKKwkgICAgICogZGVjcmVhc2UgdGhlIHdlaWdodC4KKwkgICAgICovCisJICAgIGZvciAoaT0wOyBpPGNhbmRfY250OyArK2kpIHsKKwkJdW5zaWduZWQgajsKKwkJZm9yIChqPTA7IGo8Y291bnQ7ICsraikgeworCQkgICAgaWYgKHBqX3NvY2thZGRyX2NtcCgmY2FuZF9hZGRyW2ldLCAKKwkJCQkJJmNhbmRfYWRkcltzdGFydF9pZitqXSk9PTApCisJCQlicmVhazsKKwkJfQorCisJCWlmIChqID09IGNvdW50KSB7CisJCSAgICAvKiBOb3QgZm91bmQgKi8KKwkJICAgIGNhbmRfd2VpZ2h0W2ldIC09IFdFSUdIVF9JTlRFUkZBQ0U7CisJCX0gZWxzZSB7CisJCSAgICBjYW5kX3dlaWdodFtpXSArPSBXRUlHSFRfSU5URVJGQUNFOworCQl9CisJICAgIH0KKworCSAgICAvKiBBZGQgcmVtYWluaW5nIGludGVyZmFjZSB0byBjYW5kaWRhdGUgbGlzdC4gKi8KKwkgICAgZm9yIChpPTA7IGk8Y291bnQ7ICsraSkgeworCQl1bnNpZ25lZCBqOworCQlmb3IgKGo9MDsgajxjYW5kX2NudDsgKytqKSB7CisJCSAgICBpZiAocGpfc29ja2FkZHJfY21wKCZjYW5kX2FkZHJbc3RhcnRfaWYraV0sIAorCQkJCQkmY2FuZF9hZGRyW2pdKT09MCkKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGogPT0gY2FuZF9jbnQpIHsKKwkJICAgIHBqX3NvY2thZGRyX2NvcHlfYWRkcigmY2FuZF9hZGRyW2NhbmRfY250XSwgCisJCQkJCSAgJmNhbmRfYWRkcltzdGFydF9pZitpXSk7CisJCSAgICBjYW5kX3dlaWdodFtjYW5kX2NudF0gKz0gV0VJR0hUX0lOVEVSRkFDRTsKKwkJICAgICsrY2FuZF9jbnQ7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiBBcHBseSB3ZWlnaHQgYWRqdXN0bWVudCBmb3Igc3BlY2lhbCBJUHY0L0lQdjYgYWRkcmVzc2VzCisgICAgICogU2VlIGh0dHA6Ly90cmFjLnBqc2lwLm9yZy9yZXBvcy90aWNrZXQvMTA0NgorICAgICAqLworICAgIGlmIChhZiA9PSBQSl9BRl9JTkVUKSB7CisJZm9yIChpPTA7IGk8Y2FuZF9jbnQ7ICsraSkgeworCSAgICB1bnNpZ25lZCBqOworCSAgICBmb3IgKGo9MDsgajxQSl9BUlJBWV9TSVpFKHNwZWNfaXB2NCk7ICsraikgeworCQkgICAgcGpfdWludDMyX3QgYSA9IHBqX250b2hsKGNhbmRfYWRkcltpXS5pcHY0LnNpbl9hZGRyLnNfYWRkcik7CisJCSAgICBwal91aW50MzJfdCBwYSA9IHNwZWNfaXB2NFtqXS5hZGRyOworCQkgICAgcGpfdWludDMyX3QgcG0gPSBzcGVjX2lwdjRbal0ubWFzazsKKworCQkgICAgaWYgKChhICYgcG0pID09IHBhKSB7CisJCQljYW5kX3dlaWdodFtpXSArPSBzcGVjX2lwdjRbal0ud2VpZ2h0OworCQkJYnJlYWs7CisJCSAgICB9CisJICAgIH0KKwl9CisgICAgfSBlbHNlIGlmIChhZiA9PSBQSl9BRl9JTkVUNikgeworCWZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUoc3BlY19pcHY2KTsgKytpKSB7CisJCXVuc2lnbmVkIGo7CisJCWZvciAoaj0wOyBqPGNhbmRfY250OyArK2opIHsKKwkJICAgIHBqX3VpbnQ4X3QgKmEgPSBjYW5kX2FkZHJbal0uaXB2Ni5zaW42X2FkZHIuczZfYWRkcjsKKwkJICAgIHBqX3VpbnQ4X3QgYW1bMTZdOworCQkgICAgcGpfdWludDhfdCAqcGEgPSBzcGVjX2lwdjZbaV0uYWRkcjsKKwkJICAgIHBqX3VpbnQ4X3QgKnBtID0gc3BlY19pcHY2W2ldLm1hc2s7CisJCSAgICB1bnNpZ25lZCBrOworCisJCSAgICBmb3IgKGs9MDsgazwxNjsgKytrKSB7CisJCQlhbVtrXSA9IChwal91aW50OF90KSgoYVtrXSAmIHBtW2tdKSAmIDB4RkYpOworCQkgICAgfQorCisJCSAgICBpZiAocGpfbWVtY21wKGFtLCBwYSwgMTYpPT0wKSB7CisJCQljYW5kX3dlaWdodFtqXSArPSBzcGVjX2lwdjZbaV0ud2VpZ2h0OworCQkgICAgfQorCQl9CisJfQorICAgIH0gZWxzZSB7CisJcmV0dXJuIFBKX0VBRk5PVFNVUDsKKyAgICB9CisKKyAgICAvKiBFbnVtZXJhdGUgY2FuZGlkYXRlcyB0byBnZXQgdGhlIGJlc3QgSVAgYWRkcmVzcyB0byBjaG9vc2UgKi8KKyAgICBzZWxlY3RlZF9jYW5kID0gLTE7CisgICAgZm9yIChpPTA7IGk8Y2FuZF9jbnQ7ICsraSkgeworCVRSQUNFXygoVEhJU19GSUxFLCAiQ2hlY2tpbmcgY2FuZGlkYXRlIElQICVzLCB3ZWlnaHQ9JWQiLAorCQlwal9zb2NrYWRkcl9wcmludCgmY2FuZF9hZGRyW2ldLCBzdHJpcCwgc2l6ZW9mKHN0cmlwKSwgMCksCisJCWNhbmRfd2VpZ2h0W2ldKSk7CisKKwlpZiAoY2FuZF93ZWlnaHRbaV0gPCBNSU5fV0VJR0hUKSB7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmIChzZWxlY3RlZF9jYW5kID09IC0xKQorCSAgICBzZWxlY3RlZF9jYW5kID0gaTsKKwllbHNlIGlmIChjYW5kX3dlaWdodFtpXSA+IGNhbmRfd2VpZ2h0W3NlbGVjdGVkX2NhbmRdKQorCSAgICBzZWxlY3RlZF9jYW5kID0gaTsKKyAgICB9CisKKyAgICAvKiBJZiBlbHNlIGZhaWxzLCByZXR1cm5zIGxvb3BiYWNrIGludGVyZmFjZSBhcyB0aGUgbGFzdCByZXNvcnQgKi8KKyAgICBpZiAoc2VsZWN0ZWRfY2FuZCA9PSAtMSkgeworCWlmIChhZj09UEpfQUZfSU5FVCkgeworCSAgICBhZGRyLT5pcHY0LnNpbl9hZGRyLnNfYWRkciA9IHBqX2h0b25sICgweDdmMDAwMDAxKTsKKwl9IGVsc2UgeworCSAgICBwal9pbjZfYWRkciAqczZfYWRkcjsKKworCSAgICBzNl9hZGRyID0gKHBqX2luNl9hZGRyKikgcGpfc29ja2FkZHJfZ2V0X2FkZHIoYWRkcik7CisJICAgIHBqX2J6ZXJvKHM2X2FkZHIsIHNpemVvZihwal9pbjZfYWRkcikpOworCSAgICBzNl9hZGRyLT5zNl9hZGRyWzE1XSA9IDE7CisJfQorCVRSQUNFXygoVEhJU19GSUxFLCAiTG9vcGJhY2sgSVAgJXMgcmV0dXJuZWQiLAorCQlwal9zb2NrYWRkcl9wcmludChhZGRyLCBzdHJpcCwgc2l6ZW9mKHN0cmlwKSwgMCkpKTsKKyAgICB9IGVsc2UgeworCXBqX3NvY2thZGRyX2NvcHlfYWRkcihhZGRyLCAmY2FuZF9hZGRyW3NlbGVjdGVkX2NhbmRdKTsKKwlUUkFDRV8oKFRISVNfRklMRSwgIkNhbmRpZGF0ZSAlcyBzZWxlY3RlZCIsCisJCXBqX3NvY2thZGRyX3ByaW50KGFkZHIsIHN0cmlwLCBzaXplb2Yoc3RyaXApLCAwKSkpOworICAgIH0KKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKiBHZXQgSVAgaW50ZXJmYWNlIGZvciBzZW5kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfZ2V0aXBpbnRlcmZhY2UoaW50IGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal9zdHJfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zb2NrYWRkciAqaXRmX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2Jvb2xfdCBhbGxvd19yZXNvbHZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zb2NrYWRkciAqcF9kc3RfYWRkcikKK3sKKyAgICBwal9zb2NrYWRkciBkc3RfYWRkcjsKKyAgICBwal9zb2NrX3QgZmQ7CisgICAgaW50IGxlbjsKKyAgICBwal91aW50OF90IHplcm9bNjRdOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHBqX3NvY2thZGRyX2luaXQoYWYsICZkc3RfYWRkciwgTlVMTCwgNTMpOworICAgIHN0YXR1cyA9IHBqX2luZXRfcHRvbihhZiwgZHN0LCBwal9zb2NrYWRkcl9nZXRfYWRkcigmZHN0X2FkZHIpKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkvKiAiZHN0IiBpcyBub3QgYW4gSVAgYWRkcmVzcy4gKi8KKwlpZiAoYWxsb3dfcmVzb2x2ZSkgeworCSAgICBzdGF0dXMgPSBwal9zb2NrYWRkcl9pbml0KGFmLCAmZHN0X2FkZHIsIGRzdCwgNTMpOworCX0gZWxzZSB7CisJICAgIHBqX3N0cl90IGNwOworCisJICAgIGlmIChhZiA9PSBQSl9BRl9JTkVUKSB7CisJCWNwID0gcGpfc3RyKCIxLjEuMS4xIik7CisJICAgIH0gZWxzZSB7CisJCWNwID0gcGpfc3RyKCIxOjoxIik7CisJICAgIH0KKwkgICAgc3RhdHVzID0gcGpfc29ja2FkZHJfaW5pdChhZiwgJmRzdF9hZGRyLCAmY3AsIDUzKTsKKwl9CisKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyogQ3JlYXRlIFVEUCBzb2NrZXQgYW5kIGNvbm5lY3QoKSB0byB0aGUgZGVzdGluYXRpb24gSVAgKi8KKyAgICBzdGF0dXMgPSBwal9zb2NrX3NvY2tldChhZiwgcGpfU09DS19ER1JBTSgpLCAwLCAmZmQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfc29ja19jb25uZWN0KGZkLCAmZHN0X2FkZHIsIHBqX3NvY2thZGRyX2dldF9sZW4oJmRzdF9hZGRyKSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfc29ja19jbG9zZShmZCk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBsZW4gPSBzaXplb2YoKml0Zl9hZGRyKTsKKyAgICBzdGF0dXMgPSBwal9zb2NrX2dldHNvY2tuYW1lKGZkLCBpdGZfYWRkciwgJmxlbik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfc29ja19jbG9zZShmZCk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBwal9zb2NrX2Nsb3NlKGZkKTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIGFkZHJlc3MgcmV0dXJuZWQgaXMgbm90IHplcm8gKi8KKyAgICBwal9iemVybyh6ZXJvLCBzaXplb2YoemVybykpOworICAgIGlmIChwal9tZW1jbXAocGpfc29ja2FkZHJfZ2V0X2FkZHIoaXRmX2FkZHIpLCB6ZXJvLAorCQkgIHBqX3NvY2thZGRyX2dldF9hZGRyX2xlbihpdGZfYWRkcikpPT0wKQorICAgIHsKKwlyZXR1cm4gUEpfRU5PVEZPVU5EOworICAgIH0KKworICAgIGlmIChwX2RzdF9hZGRyKQorCSpwX2RzdF9hZGRyID0gZHN0X2FkZHI7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogR2V0IHRoZSBkZWZhdWx0IElQIGludGVyZmFjZSAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9nZXRkZWZhdWx0aXBpbnRlcmZhY2UoaW50IGFmLCBwal9zb2NrYWRkciAqYWRkcikKK3sKKyAgICBwal9zdHJfdCBjcDsKKworICAgIGlmIChhZiA9PSBQSl9BRl9JTkVUKSB7CisJY3AgPSBwal9zdHIoIjEuMS4xLjEiKTsKKyAgICB9IGVsc2UgeworCWNwID0gcGpfc3RyKCIxOjoxIik7CisgICAgfQorCisgICAgcmV0dXJuIHBqX2dldGlwaW50ZXJmYWNlKGFmLCAmY3AsIGFkZHIsIFBKX0ZBTFNFLCBOVUxMKTsKK30KKworCisvKgorICogQmluZCBzb2NrZXQgYXQgcmFuZG9tIHBvcnQuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19iaW5kX3JhbmRvbSggIHBqX3NvY2tfdCBzb2NrZmQsCisJCQkJICAgICAgICAgIGNvbnN0IHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJICAgICAgICAgIHBqX3VpbnQxNl90IHBvcnRfcmFuZ2UsCisJCQkJICAgICAgICAgIHBqX3VpbnQxNl90IG1heF90cnkpCit7CisgICAgcGpfc29ja2FkZHIgYmluZF9hZGRyOworICAgIGludCBhZGRyX2xlbjsKKyAgICBwal91aW50MTZfdCBiYXNlX3BvcnQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFkZHIsIFBKX0VJTlZBTCk7CisKKyAgICBwal9zb2NrYWRkcl9jcCgmYmluZF9hZGRyLCBhZGRyKTsKKyAgICBhZGRyX2xlbiA9IHBqX3NvY2thZGRyX2dldF9sZW4oYWRkcik7CisgICAgYmFzZV9wb3J0ID0gcGpfc29ja2FkZHJfZ2V0X3BvcnQoYWRkcik7CisKKyAgICBpZiAoYmFzZV9wb3J0ID09IDAgfHwgcG9ydF9yYW5nZSA9PSAwKSB7CisJcmV0dXJuIHBqX3NvY2tfYmluZChzb2NrZmQsICZiaW5kX2FkZHIsIGFkZHJfbGVuKTsKKyAgICB9CisKKyAgICBmb3IgKDsgbWF4X3RyeTsgLS1tYXhfdHJ5KSB7CisJcGpfdWludDE2X3QgcG9ydDsKKwlwb3J0ID0gKHBqX3VpbnQxNl90KShiYXNlX3BvcnQgKyBwal9yYW5kKCkgJSAocG9ydF9yYW5nZSArIDEpKTsKKwlwal9zb2NrYWRkcl9zZXRfcG9ydCgmYmluZF9hZGRyLCBwb3J0KTsKKwlzdGF0dXMgPSBwal9zb2NrX2JpbmQoc29ja2ZkLCAmYmluZF9hZGRyLCBhZGRyX2xlbik7CisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBBZGp1c3Qgc29ja2V0IHNlbmQvcmVjZWl2ZSBidWZmZXIgc2l6ZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX3NldHNvY2tvcHRfc29idWYoIHBqX3NvY2tfdCBzb2NrZmQsCisJCQkJCSAgICAgIHBqX3VpbnQxNl90IG9wdG5hbWUsCisJCQkJCSAgICAgIHBqX2Jvb2xfdCBhdXRvX3JldHJ5LAorCQkJCQkgICAgICB1bnNpZ25lZCAqYnVmX3NpemUpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCB0cnlfc2l6ZSwgY3VyX3NpemUsIGksIHN0ZXAsIHNpemVfbGVuOworICAgIGVudW0geyBNQVhfVFJZID0gMjAgfTsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNvY2tmZCAhPSBQSl9JTlZBTElEX1NPQ0tFVCAmJgorCQkgICAgIGJ1Zl9zaXplICYmCisJCSAgICAgKmJ1Zl9zaXplID4gMCAmJgorCQkgICAgIChvcHRuYW1lID09IHBqX1NPX1JDVkJVRigpIHx8CisJCSAgICAgIG9wdG5hbWUgPT0gcGpfU09fU05EQlVGKCkpLAorCQkgICAgIFBKX0VJTlZBTCk7CisKKyAgICBzaXplX2xlbiA9IHNpemVvZihjdXJfc2l6ZSk7CisgICAgc3RhdHVzID0gcGpfc29ja19nZXRzb2Nrb3B0KHNvY2tmZCwgcGpfU09MX1NPQ0tFVCgpLCBvcHRuYW1lLAorCQkJCSZjdXJfc2l6ZSwgJnNpemVfbGVuKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgIHRyeV9zaXplID0gKmJ1Zl9zaXplOworICAgIHN0ZXAgPSAodHJ5X3NpemUgLSBjdXJfc2l6ZSkgLyBNQVhfVFJZOworICAgIGlmIChzdGVwIDwgNDA5NikKKwlzdGVwID0gNDA5NjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoTUFYX1RSWS0xKTsgKytpKSB7CisJaWYgKHRyeV9zaXplIDw9IGN1cl9zaXplKSB7CisJICAgIC8qIERvbmUsIHJldHVybiBjdXJyZW50IHNpemUgKi8KKwkgICAgKmJ1Zl9zaXplID0gY3VyX3NpemU7CisJICAgIGJyZWFrOworCX0KKworCXN0YXR1cyA9IHBqX3NvY2tfc2V0c29ja29wdChzb2NrZmQsIHBqX1NPTF9TT0NLRVQoKSwgb3B0bmFtZSwKKwkJCQkgICAgJnRyeV9zaXplLCBzaXplb2YodHJ5X3NpemUpKTsKKwlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwkgICAgc3RhdHVzID0gcGpfc29ja19nZXRzb2Nrb3B0KHNvY2tmZCwgcGpfU09MX1NPQ0tFVCgpLCBvcHRuYW1lLAorCQkJCQkmY3VyX3NpemUsICZzaXplX2xlbik7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQkvKiBPcHMhIE5vIGluZm8gYWJvdXQgY3VycmVudCBzaXplLCBqdXN0IHJldHVybiBsYXN0IHRyeSBzaXplCisJCSAqIGFuZCBxdWl0LgorCQkgKi8KKwkJKmJ1Zl9zaXplID0gdHJ5X3NpemU7CisJCWJyZWFrOworCSAgICB9CisJfQorCisJaWYgKCFhdXRvX3JldHJ5KQorCSAgICBicmVhazsKKworCXRyeV9zaXplIC09IHN0ZXA7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBPbmx5IG5lZWQgdG8gaW1wbGVtZW50IHRoZXNlIGluIERMTCBidWlsZCAqLworI2lmIGRlZmluZWQoUEpfRExMKQorCitQSl9ERUYocGpfdWludDE2X3QpIHBqX0FGX1VOU1BFQyh2b2lkKQoreworICAgIHJldHVybiBQSl9BRl9VTlNQRUM7Cit9CisKK1BKX0RFRihwal91aW50MTZfdCkgcGpfQUZfVU5JWCh2b2lkKQoreworICAgIHJldHVybiBQSl9BRl9VTklYOworfQorCitQSl9ERUYocGpfdWludDE2X3QpIHBqX0FGX0lORVQodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfQUZfSU5FVDsKK30KKworUEpfREVGKHBqX3VpbnQxNl90KSBwal9BRl9JTkVUNih2b2lkKQoreworICAgIHJldHVybiBQSl9BRl9JTkVUNjsKK30KKworUEpfREVGKHBqX3VpbnQxNl90KSBwal9BRl9QQUNLRVQodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfQUZfUEFDS0VUOworfQorCitQSl9ERUYocGpfdWludDE2X3QpIHBqX0FGX0lSREEodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfQUZfSVJEQTsKK30KKworUEpfREVGKGludCkgcGpfU09DS19TVFJFQU0odm9pZCkKK3sKKyAgICByZXR1cm4gUEpfU09DS19TVFJFQU07Cit9CisKK1BKX0RFRihpbnQpIHBqX1NPQ0tfREdSQU0odm9pZCkKK3sKKyAgICByZXR1cm4gUEpfU09DS19ER1JBTTsKK30KKworUEpfREVGKGludCkgcGpfU09DS19SQVcodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfU09DS19SQVc7Cit9CisKK1BKX0RFRihpbnQpIHBqX1NPQ0tfUkRNKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX1NPQ0tfUkRNOworfQorCitQSl9ERUYocGpfdWludDE2X3QpIHBqX1NPTF9TT0NLRVQodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfU09MX1NPQ0tFVDsKK30KKworUEpfREVGKHBqX3VpbnQxNl90KSBwal9TT0xfSVAodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfU09MX0lQOworfQorCitQSl9ERUYocGpfdWludDE2X3QpIHBqX1NPTF9UQ1Aodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfU09MX1RDUDsKK30KKworUEpfREVGKHBqX3VpbnQxNl90KSBwal9TT0xfVURQKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX1NPTF9VRFA7Cit9CisKK1BKX0RFRihwal91aW50MTZfdCkgcGpfU09MX0lQVjYodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfU09MX0lQVjY7Cit9CisKK1BKX0RFRihpbnQpIHBqX0lQX1RPUyh2b2lkKQoreworICAgIHJldHVybiBQSl9JUF9UT1M7Cit9CisKK1BKX0RFRihpbnQpIHBqX0lQVE9TX0xPV0RFTEFZKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX0lQVE9TX0xPV0RFTEFZOworfQorCitQSl9ERUYoaW50KSBwal9JUFRPU19USFJPVUdIUFVUKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX0lQVE9TX1RIUk9VR0hQVVQ7Cit9CisKK1BKX0RFRihpbnQpIHBqX0lQVE9TX1JFTElBQklMSVRZKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX0lQVE9TX1JFTElBQklMSVRZOworfQorCitQSl9ERUYoaW50KSBwal9JUFRPU19NSU5DT1NUKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX0lQVE9TX01JTkNPU1Q7Cit9CisKK1BKX0RFRihwal91aW50MTZfdCkgcGpfU09fVFlQRSh2b2lkKQoreworICAgIHJldHVybiBQSl9TT19UWVBFOworfQorCitQSl9ERUYocGpfdWludDE2X3QpIHBqX1NPX1JDVkJVRih2b2lkKQoreworICAgIHJldHVybiBQSl9TT19SQ1ZCVUY7Cit9CisKK1BKX0RFRihwal91aW50MTZfdCkgcGpfU09fU05EQlVGKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX1NPX1NOREJVRjsKK30KKworUEpfREVGKHBqX3VpbnQxNl90KSBwal9UQ1BfTk9ERUxBWSh2b2lkKQoreworICAgIHJldHVybiBQSl9UQ1BfTk9ERUxBWTsKK30KKworUEpfREVGKHBqX3VpbnQxNl90KSBwal9TT19SRVVTRUFERFIodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfU09fUkVVU0VBRERSOworfQorCitQSl9ERUYocGpfdWludDE2X3QpIHBqX1NPX05PU0lHUElQRSh2b2lkKQoreworICAgIHJldHVybiBQSl9TT19OT1NJR1BJUEU7Cit9CisKK1BKX0RFRihwal91aW50MTZfdCkgcGpfU09fUFJJT1JJVFkodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfU09fUFJJT1JJVFk7Cit9CisKK1BKX0RFRihwal91aW50MTZfdCkgcGpfSVBfTVVMVElDQVNUX0lGKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX0lQX01VTFRJQ0FTVF9JRjsKK30KKworUEpfREVGKHBqX3VpbnQxNl90KSBwal9JUF9NVUxUSUNBU1RfVFRMKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX0lQX01VTFRJQ0FTVF9UVEw7Cit9CisKK1BKX0RFRihwal91aW50MTZfdCkgcGpfSVBfTVVMVElDQVNUX0xPT1Aodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfSVBfTVVMVElDQVNUX0xPT1A7Cit9CisKK1BKX0RFRihwal91aW50MTZfdCkgcGpfSVBfQUREX01FTUJFUlNISVAodm9pZCkKK3sKKyAgICByZXR1cm4gUEpfSVBfQUREX01FTUJFUlNISVA7Cit9CisKK1BKX0RFRihwal91aW50MTZfdCkgcGpfSVBfRFJPUF9NRU1CRVJTSElQKHZvaWQpCit7CisgICAgcmV0dXJuIFBKX0lQX0RST1BfTUVNQkVSU0hJUDsKK30KKworUEpfREVGKGludCkgcGpfTVNHX09PQih2b2lkKQoreworICAgIHJldHVybiBQSl9NU0dfT09COworfQorCitQSl9ERUYoaW50KSBwal9NU0dfUEVFSyh2b2lkKQoreworICAgIHJldHVybiBQSl9NU0dfUEVFSzsKK30KKworUEpfREVGKGludCkgcGpfTVNHX0RPTlRST1VURSh2b2lkKQoreworICAgIHJldHVybiBQSl9NU0dfRE9OVFJPVVRFOworfQorCisjZW5kaWYJLyogUEpfRExMICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19saW51eF9rZXJuZWwuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19saW51eF9rZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWE3YzdjCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX2xpbnV4X2tlcm5lbC5jCkBAIC0wLDAgKzEsNzU1IEBACisvKiAkSWQ6IHNvY2tfbGludXhfa2VybmVsLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9zb2NrLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CSAgICAvKiBwal9tZW1jcHkoKQkgICAgKi8KKyNpbmNsdWRlIDxwai9vcy5oPgkgICAgLyogUEpfQ0hFQ0tfU1RBQ0soKQkgICAgKi8KKyNpbmNsdWRlIDxwai9hZGRyX3Jlc29sdi5oPiAvKiBwal9nZXRob3N0YnluYW1lKCkgICAqLworI2luY2x1ZGUgPHBqL2N0eXBlLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3NwcmludGYuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorCisvKiBMaW51eCBrZXJuZWwgc3BlY2lmaWMuICovCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisvLyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4JLyogc3lzX3h4eCgpCSovCisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgkJLyogRklPTkJJTwkqLworI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4JLyogZm9yIHBqX2dldGhvc3RuYW1lKCkgKi8KKworLyoKKyAqIEFkZHJlc3MgZmFtaWxpZXMgY29udmVyc2lvbi4KKyAqIFRoZSB2YWx1ZXMgaGVyZSBhcmUgaW5kZXhlZCBiYXNlZCBvbiBwal9hZGRyX2ZhbWlseS0weEZGMDAuCisgKi8KK2NvbnN0IHBqX3VpbnQxNl90IFBKX0FGX1VOSVgJPSBBRl9VTklYOworY29uc3QgcGpfdWludDE2X3QgUEpfQUZfSU5FVAk9IEFGX0lORVQ7Citjb25zdCBwal91aW50MTZfdCBQSl9BRl9JTkVUNgk9IEFGX0lORVQ2OworI2lmZGVmIEFGX1BBQ0tFVAorY29uc3QgcGpfdWludDE2X3QgUEpfQUZfUEFDS0VUCT0gQUZfUEFDS0VUOworI2Vsc2UKKyMgIGVycm9yICJBRl9QQUNLRVQgdW5kZWNsYXJlZCEiCisjZW5kaWYKKyNpZmRlZiBBRl9JUkRBCitjb25zdCBwal91aW50MTZfdCBQSl9BRl9JUkRBCT0gQUZfSVJEQTsKKyNlbHNlCisjICBlcnJvciAiQUZfSVJEQSB1bmRlY2xhcmVkISIKKyNlbmRpZgorCisvKgorICogU29ja2V0IHR5cGVzIGNvbnZlcnNpb24uCisgKiBUaGUgdmFsdWVzIGhlcmUgYXJlIGluZGV4ZWQgYmFzZWQgb24gcGpfc29ja190eXBlLTB4RkYwMAorICovCitjb25zdCBwal91aW50MTZfdCBQSl9TT0NLX1NUUkVBTT0gU09DS19TVFJFQU07Citjb25zdCBwal91aW50MTZfdCBQSl9TT0NLX0RHUkFNCT0gU09DS19ER1JBTTsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPQ0tfUkFXCT0gU09DS19SQVc7Citjb25zdCBwal91aW50MTZfdCBQSl9TT0NLX1JETQk9IFNPQ0tfUkRNOworCisvKgorICogU29ja2V0IGxldmVsIHZhbHVlcy4KKyAqLworY29uc3QgcGpfdWludDE2X3QgUEpfU09MX1NPQ0tFVAk9IFNPTF9TT0NLRVQ7CisjaWZkZWYgU09MX0lQCitjb25zdCBwal91aW50MTZfdCBQSl9TT0xfSVAJPSBTT0xfSVA7CisjZWxzZQorIyAgZXJyb3IgIlNPTF9JUCB1bmRlY2xhcmVkISIKKyNlbmRpZiAvKiBTT0xfSVAgKi8KKyNpZiBkZWZpbmVkKFNPTF9UQ1ApCitjb25zdCBwal91aW50MTZfdCBQSl9TT0xfVENQCT0gU09MX1RDUDsKKyNlbHNlCisjICBlcnJvciAiU09MX1RDUCB1bmRlY2xhcmVkISIKKyNlbmRpZiAvKiBTT0xfVENQICovCisjaWZkZWYgU09MX1VEUAorY29uc3QgcGpfdWludDE2X3QgUEpfU09MX1VEUAk9IFNPTF9VRFA7CisjZWxzZQorIyAgZXJyb3IgIlNPTF9VRFAgdW5kZWNsYXJlZCEiCisjZW5kaWYKKyNpZmRlZiBTT0xfSVBWNgorY29uc3QgcGpfdWludDE2X3QgUEpfU09MX0lQVjYJPSBTT0xfSVBWNjsKKyNlbHNlCisjICBlcnJvciAiU09MX0lQVjYgdW5kZWNsYXJlZCEiCisjZW5kaWYKKworLyogb3B0bmFtZSB2YWx1ZXMuICovCitjb25zdCBwal91aW50MTZfdCBQSl9TT19UWVBFICAgID0gU09fVFlQRTsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPX1JDVkJVRiAgPSBTT19SQ1ZCVUY7Citjb25zdCBwal91aW50MTZfdCBQSl9TT19TTkRCVUYgID0gU09fU05EQlVGOworCisvKgorICogQ29udmVydCAxNi1iaXQgdmFsdWUgZnJvbSBuZXR3b3JrIGJ5dGUgb3JkZXIgdG8gaG9zdCBieXRlIG9yZGVyLgorICovCitQSl9ERUYocGpfdWludDE2X3QpIHBqX250b2hzKHBqX3VpbnQxNl90IG5ldHNob3J0KQoreworICAgIHJldHVybiBudG9ocyhuZXRzaG9ydCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IDE2LWJpdCB2YWx1ZSBmcm9tIGhvc3QgYnl0ZSBvcmRlciB0byBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KK1BKX0RFRihwal91aW50MTZfdCkgcGpfaHRvbnMocGpfdWludDE2X3QgaG9zdHNob3J0KQoreworICAgIHJldHVybiBodG9ucyhob3N0c2hvcnQpOworfQorCisvKgorICogQ29udmVydCAzMi1iaXQgdmFsdWUgZnJvbSBuZXR3b3JrIGJ5dGUgb3JkZXIgdG8gaG9zdCBieXRlIG9yZGVyLgorICovCitQSl9ERUYocGpfdWludDMyX3QpIHBqX250b2hsKHBqX3VpbnQzMl90IG5ldGxvbmcpCit7CisgICAgcmV0dXJuIG50b2hsKG5ldGxvbmcpOworfQorCisvKgorICogQ29udmVydCAzMi1iaXQgdmFsdWUgZnJvbSBob3N0IGJ5dGUgb3JkZXIgdG8gbmV0d29yayBieXRlIG9yZGVyLgorICovCitQSl9ERUYocGpfdWludDMyX3QpIHBqX2h0b25sKHBqX3VpbnQzMl90IGhvc3Rsb25nKQoreworICAgIHJldHVybiBodG9ubChob3N0bG9uZyk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGFuIEludGVybmV0IGhvc3QgYWRkcmVzcyBnaXZlbiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKyAqIHRvIHN0cmluZyBpbiBzdGFuZGFyZCBudW1iZXJzIGFuZCBkb3RzIG5vdGF0aW9uLgorICovCitQSl9ERUYoY2hhciopIHBqX2luZXRfbnRvYShwal9pbl9hZGRyIGluKQoreworI2RlZmluZQlVQyhiKQkoKChpbnQpYikmMHhmZikKKyAgICBzdGF0aWMgY2hhciBiWzE4XTsKKyAgICBjaGFyICpwOworCisgICAgcCA9IChjaGFyICopJmluOworICAgIHBqX3NucHJpbnRmKGIsIHNpemVvZihiKSwgIiVkLiVkLiVkLiVkIiwgCisJICAgICAgIFVDKHBbMF0pLCBVQyhwWzFdKSwgVUMocFsyXSksIFVDKHBbM10pKTsKKworICAgIHJldHVybiBiOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGNjcCBmcm9tIHRoZSBzdGFuZGFyZAorICogbnVtYmVycy1hbmQtZG90cyBub3RhdGlvbiBpbnRvIGJpbmFyeSBkYXRhIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHN0cnVjdHVyZQorICogdGhhdCBpbnAgcG9pbnRzIHRvLiAKKyAqLworUEpfREVGKGludCkgcGpfaW5ldF9hdG9uKGNvbnN0IHBqX3N0cl90ICpjY3AsIHN0cnVjdCBwal9pbl9hZGRyICphZGRyKQoreworICAgIHBqX3VpbnQzMl90IHZhbDsKKyAgICBpbnQgYmFzZSwgbjsKKyAgICBjaGFyIGM7CisgICAgdW5zaWduZWQgcGFydHNbNF07CisgICAgdW5zaWduZWQgKnBwID0gcGFydHM7CisgICAgY2hhciBjcF9jb3B5WzE4XTsKKyAgICBjaGFyICpjcCA9IGNwX2NvcHk7CisgICAgCisgICAgYWRkci0+c19hZGRyID0gUEpfSU5BRERSX05PTkU7CisKKyAgICBpZiAoY2NwLT5zbGVuID4gMTUpIHJldHVybiAwOworCisgICAgcGpfbWVtY3B5KGNwLCBjY3AtPnB0ciwgY2NwLT5zbGVuKTsKKyAgICBjcFtjY3AtPnNsZW5dID0gJ1wwJzsKKworICAgIGMgPSAqY3A7CisgICAgZm9yICg7OykgeworCS8qCisJICogQ29sbGVjdCBudW1iZXIgdXAgdG8gYGAuJycuCisJICogVmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgZm9yIEM6CisJICogMHg9aGV4LCAwPW9jdGFsLCBpc2RpZ2l0PWRlY2ltYWwuCisJICovCisJaWYgKCFwal9pc2RpZ2l0KChpbnQpYykpCisJICAgIHJldHVybiAoMCk7CisJdmFsID0gMDsgYmFzZSA9IDEwOworCWlmIChjID09ICcwJykgeworCSAgICBjID0gKisrY3A7CisJICAgIGlmIChjID09ICd4JyB8fCBjID09ICdYJykKKwkJYmFzZSA9IDE2LCBjID0gKisrY3A7CisJICAgIGVsc2UKKwkJYmFzZSA9IDg7CisJfQorCisJZm9yICg7OykgeworCSAgICBpZiAocGpfaXNhc2NpaSgoaW50KWMpICYmIHBqX2lzZGlnaXQoKGludCljKSkgeworCQl2YWwgPSAodmFsICogYmFzZSkgKyAoYyAtICcwJyk7CisJCWMgPSAqKytjcDsKKwkgICAgfSBlbHNlIGlmIChiYXNlPT0xNiAmJiBwal9pc2FzY2lpKChpbnQpYykgJiYgcGpfaXN4ZGlnaXQoKGludCljKSkgeworCQl2YWwgPSAodmFsIDw8IDQpIHwKKwkJICAgICAgKGMgKyAxMCAtIChwal9pc2xvd2VyKChpbnQpYykgPyAnYScgOiAnQScpKTsKKwkJYyA9ICorK2NwOworCSAgICB9IGVsc2UKKwkJYnJlYWs7CisJfQorCisJaWYgKGMgPT0gJy4nKSB7CisJICAgIC8qCisJICAgICAqIEludGVybmV0IGZvcm1hdDoKKwkgICAgICogIGEuYi5jLmQKKwkgICAgICogIGEuYi5jICAgKHdpdGggYyB0cmVhdGVkIGFzIDE2IGJpdHMpCisJICAgICAqICBhLmIJKHdpdGggYiB0cmVhdGVkIGFzIDI0IGJpdHMpCisJICAgICAqLworCSAgICBpZiAocHAgPj0gcGFydHMgKyAzKQorCQlyZXR1cm4gKDApOworCSAgICAqcHArKyA9IHZhbDsKKwkgICAgYyA9ICorK2NwOworCX0gZWxzZQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciB0cmFpbGluZyBjaGFyYWN0ZXJzLgorICAgICAqLworICAgIGlmIChjICE9ICdcMCcgJiYgKCFwal9pc2FzY2lpKChpbnQpYykgfHwgIXBqX2lzc3BhY2UoKGludCljKSkpCisgICAgICAgIHJldHVybiAoMCk7CisgICAgLyoKKyAgICAgKiBDb25jb2N0IHRoZSBhZGRyZXNzIGFjY29yZGluZyB0bworICAgICAqIHRoZSBudW1iZXIgb2YgcGFydHMgc3BlY2lmaWVkLgorICAgICAqLworICAgIG4gPSBwcCAtIHBhcnRzICsgMTsKKyAgICBzd2l0Y2ggKG4pIHsKKyAgICBjYXNlIDA6CisJcmV0dXJuICgwKTsJICAgIC8qIGluaXRpYWwgbm9uZGlnaXQgKi8KKyAgICBjYXNlIDE6CQkvKiBhIC0tIDMyIGJpdHMgKi8KKwlicmVhazsKKyAgICBjYXNlIDI6CQkvKiBhLmIgLS0gOC4yNCBiaXRzICovCisJaWYgKHZhbCA+IDB4ZmZmZmZmKQorCSAgICByZXR1cm4gKDApOworCXZhbCB8PSBwYXJ0c1swXSA8PCAyNDsKKwlicmVhazsKKyAgICBjYXNlIDM6CQkvKiBhLmIuYyAtLSA4LjguMTYgYml0cyAqLworCWlmICh2YWwgPiAweGZmZmYpCisJICAgIHJldHVybiAoMCk7CisJdmFsIHw9IChwYXJ0c1swXSA8PCAyNCkgfCAocGFydHNbMV0gPDwgMTYpOworCWJyZWFrOworICAgIGNhc2UgNDoJCS8qIGEuYi5jLmQgLS0gOC44LjguOCBiaXRzICovCisJaWYgKHZhbCA+IDB4ZmYpCisJICAgIHJldHVybiAoMCk7CisJdmFsIHw9IChwYXJ0c1swXSA8PCAyNCkgfCAocGFydHNbMV0gPDwgMTYpIHwgKHBhcnRzWzJdIDw8IDgpOworCWJyZWFrOworICAgIH0KKworICAgIGlmIChhZGRyKQorCWFkZHItPnNfYWRkciA9IHBqX2h0b25sKHZhbCk7CisgICAgcmV0dXJuICgxKTsKK30KKworLyoKKyAqIENvbnZlcnQgYWRkcmVzcyBzdHJpbmcgd2l0aCBudW1iZXJzIGFuZCBkb3RzIHRvIGJpbmFyeSBJUCBhZGRyZXNzLgorICovIAorUEpfREVGKHBqX2luX2FkZHIpIHBqX2luZXRfYWRkcihjb25zdCBwal9zdHJfdCAqY3ApCit7CisgICAgcGpfaW5fYWRkciBhZGRyOworICAgIHBqX2luZXRfYXRvbihjcCwgJmFkZHIpOworICAgIHJldHVybiBhZGRyOworfQorCisvKgorICogU2V0IHRoZSBJUCBhZGRyZXNzIG9mIGFuIElQIHNvY2tldCBhZGRyZXNzIGZyb20gc3RyaW5nIGFkZHJlc3MsIAorICogd2l0aCByZXNvbHZpbmcgdGhlIGhvc3QgaWYgbmVjZXNzYXJ5LiBUaGUgc3RyaW5nIGFkZHJlc3MgbWF5IGJlIGluIGEKKyAqIHN0YW5kYXJkIG51bWJlcnMgYW5kIGRvdHMgbm90YXRpb24gb3IgbWF5IGJlIGEgaG9zdG5hbWUuIElmIGhvc3RuYW1lCisgKiBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgcmVzb2x2ZSB0aGUgaG9zdCBpbnRvIHRoZSBJUAorICogYWRkcmVzcy4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrYWRkcl9pbl9zZXRfc3RyX2FkZHIoIHBqX3NvY2thZGRyX2luICphZGRyLAorCQkJCQkgICAgICAgICBjb25zdCBwal9zdHJfdCAqc3RyX2FkZHIpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHBqX2Fzc2VydChzdHJfYWRkciAmJiBzdHJfYWRkci0+c2xlbiA8IFBKX01BWF9IT1NUTkFNRSk7CisKKyAgICBhZGRyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworICAgIGlmIChzdHJfYWRkciAmJiBzdHJfYWRkci0+c2xlbikgeworCWFkZHItPnNpbl9hZGRyID0gcGpfaW5ldF9hZGRyKHN0cl9hZGRyKTsKKwlpZiAoYWRkci0+c2luX2FkZHIuc19hZGRyID09IFBKX0lOQUREUl9OT05FKSB7CisgICAgCSAgICBwal9ob3N0ZW50IGhlOworCSAgICBpZiAocGpfZ2V0aG9zdGJ5bmFtZShzdHJfYWRkciwgJmhlKSA9PSAwKSB7CisJCWFkZHItPnNpbl9hZGRyLnNfYWRkciA9ICoocGpfdWludDMyX3QqKWhlLmhfYWRkcjsKKwkgICAgfSBlbHNlIHsKKwkJYWRkci0+c2luX2FkZHIuc19hZGRyID0gUEpfSU5BRERSX05PTkU7CisJCXJldHVybiAtMTsKKwkgICAgfQorCX0KKworICAgIH0gZWxzZSB7CisJYWRkci0+c2luX2FkZHIuc19hZGRyID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIFNldCB0aGUgSVAgYWRkcmVzcyBhbmQgcG9ydCBvZiBhbiBJUCBzb2NrZXQgYWRkcmVzcy4KKyAqIFRoZSBzdHJpbmcgYWRkcmVzcyBtYXkgYmUgaW4gYSBzdGFuZGFyZCBudW1iZXJzIGFuZCBkb3RzIG5vdGF0aW9uIG9yIAorICogbWF5IGJlIGEgaG9zdG5hbWUuIElmIGhvc3RuYW1lIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCAKKyAqIHJlc29sdmUgdGhlIGhvc3QgaW50byB0aGUgSVAgYWRkcmVzcy4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrYWRkcl9pbl9pbml0KCBwal9zb2NrYWRkcl9pbiAqYWRkciwKKwkJCQkgICAgICAgICBjb25zdCBwal9zdHJfdCAqc3RyX2FkZHIsCisJCQkJCSBwal91aW50MTZfdCBwb3J0KQoreworICAgIHBqX2Fzc2VydChhZGRyICYmIHN0cl9hZGRyKTsKKworICAgIGFkZHItPnNpbl9mYW1pbHkgPSBQSl9BRl9JTkVUOworICAgIHBqX3NvY2thZGRyX2luX3NldF9wb3J0KGFkZHIsIHBvcnQpOworICAgIHJldHVybiBwal9zb2NrYWRkcl9pbl9zZXRfc3RyX2FkZHIoYWRkciwgc3RyX2FkZHIpOworfQorCisKKy8qCisgKiBHZXQgaG9zdG5hbWUuCisgKi8KK1BKX0RFRihjb25zdCBwal9zdHJfdCopIHBqX2dldGhvc3RuYW1lKHZvaWQpCit7CisgICAgc3RhdGljIGNoYXIgYnVmW1BKX01BWF9IT1NUTkFNRV07CisgICAgc3RhdGljIHBqX3N0cl90IGhvc3RuYW1lOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIGlmIChob3N0bmFtZS5wdHIgPT0gTlVMTCkgeworCWhvc3RuYW1lLnB0ciA9IGJ1ZjsKKwlkb3duX3JlYWQoJnV0c19zZW0pOworCWhvc3RuYW1lLnNsZW4gPSBzdHJsZW4oc3lzdGVtX3V0c25hbWUubm9kZW5hbWUpOworCWlmIChob3N0bmFtZS5zbGVuID4gUEpfTUFYX0hPU1ROQU1FKSB7CisJICAgIGhvc3RuYW1lLnB0clswXSA9ICdcMCc7CisJICAgIGhvc3RuYW1lLnNsZW4gPSAwOworCX0gZWxzZSB7CisJICAgIHBqX21lbWNweShob3N0bmFtZS5wdHIsIHN5c3RlbV91dHNuYW1lLm5vZGVuYW1lLCBob3N0bmFtZS5zbGVuKTsKKwl9CisJdXBfcmVhZCgmdXRzX3NlbSk7CisgICAgfQorICAgIHJldHVybiAmaG9zdG5hbWU7Cit9CisKKy8qCisgKiBHZXQgZmlyc3QgSVAgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGhvc3RuYW1lLgorICovCitQSl9ERUYocGpfaW5fYWRkcikgcGpfZ2V0aG9zdGFkZHIodm9pZCkKK3sKKyAgICBwal9zb2NrYWRkcl9pbiBhZGRyOworICAgIGNvbnN0IHBqX3N0cl90ICpob3N0bmFtZSA9IHBqX2dldGhvc3RuYW1lKCk7CisKKyAgICBwal9zb2NrYWRkcl9pbl9zZXRfc3RyX2FkZHIoJmFkZHIsIGhvc3RuYW1lKTsKKyAgICByZXR1cm4gYWRkci5zaW5fYWRkcjsKK30KKworCisvKgorICogQ3JlYXRlIG5ldyBzb2NrZXQvZW5kcG9pbnQgZm9yIGNvbW11bmljYXRpb24gYW5kIHJldHVybnMgYSBkZXNjcmlwdG9yLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfc29ja2V0KGludCBhZiwgaW50IHR5cGUsIGludCBwcm90bywgCisJCQkJICAgcGpfc29ja190ICpzb2NrX2ZkKQoreworICAgIGxvbmcgcmVzdWx0OworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIC8qIFNhbml0eSBjaGVja3MuICovCisgICAgUEpfQVNTRVJUX1JFVFVSTihQSl9JTlZBTElEX1NPQ0tFVCA9PSAtMSAmJiBzb2NrX2ZkICE9IE5VTEwsIFBKX0VJTlZBTCk7CisKKyAgICAvKiBJbml0aWFsaXplIHJldHVybmVkIHNvY2tldCAqLworICAgICpzb2NrX2ZkID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisKKyAgICAvKiBDcmVhdGUgc29ja2V0LiAqLworICAgIHJlc3VsdCA9IHN5c19zb2NrZXQoYWYsIHR5cGUsIHByb3RvKTsKKyAgICBpZiAocmVzdWx0IDwgMCkgeworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoKC1yZXN1bHQpKTsKKyAgICB9CisKKyAgICAqc29ja19mZCA9IHJlc3VsdDsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogQmluZCBzb2NrZXQuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19iaW5kKCBwal9zb2NrX3Qgc29ja2ZkLCAKKwkJCQkgIGNvbnN0IHBqX3NvY2thZGRyX3QgKmFkZHIsCisJCQkJICBpbnQgbGVuKQoreworICAgIGxvbmcgZXJyOworICAgIG1tX3NlZ21lbnRfdCBvbGRmczsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFkZHIhPU5VTEwgJiYgbGVuID49IHNpemVvZihzdHJ1Y3QgcGpfc29ja2FkZHIpLAorCQkgICAgIFBKX0VJTlZBTCk7CisKKyAgICBvbGRmcyA9IGdldF9mcygpOworICAgIHNldF9mcyhLRVJORUxfRFMpOworICAgIAorICAgIGVyciA9IHN5c19iaW5kKHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciopYWRkciwgbGVuKTsKKworICAgIHNldF9mcyhvbGRmcyk7CisKKyAgICBpZiAoZXJyKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoLWVycik7CisgICAgZWxzZQorCXJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBCaW5kIHNvY2tldC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2JpbmRfaW4oIHBqX3NvY2tfdCBzb2NrZmQsIAorCQkJCSAgICAgcGpfdWludDMyX3QgYWRkcjMyLAorCQkJCSAgICAgcGpfdWludDE2X3QgcG9ydCkKK3sKKyAgICBwal9zb2NrYWRkcl9pbiBhZGRyOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIGFkZHIuc2luX2ZhbWlseSA9IFBKX0FGX0lORVQ7CisgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBwal9odG9ubChhZGRyMzIpOworICAgIGFkZHIuc2luX3BvcnQgPSBwal9odG9ucyhwb3J0KTsKKworICAgIHJldHVybiBwal9zb2NrX2JpbmQoc29ja2ZkLCAmYWRkciwgc2l6ZW9mKHBqX3NvY2thZGRyX2luKSk7Cit9CisKKy8qCisgKiBDbG9zZSBzb2NrZXQuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19jbG9zZShwal9zb2NrX3Qgc29ja2ZkKQoreworICAgIGxvbmcgZXJyOworCisgICAgZXJyID0gc3lzX2Nsb3NlKHNvY2tmZCk7CisKKyAgICBpZiAoZXJyICE9IDApCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUigtZXJyKTsKKyAgICBlbHNlCisJcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBHZXQgcmVtb3RlJ3MgbmFtZS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2dldHBlZXJuYW1lKCBwal9zb2NrX3Qgc29ja2ZkLAorCQkJCQkgcGpfc29ja2FkZHJfdCAqYWRkciwKKwkJCQkJIGludCAqbmFtZWxlbikKK3sKKyAgICBtbV9zZWdtZW50X3Qgb2xkZnM7CisgICAgbG9uZyBlcnI7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgb2xkZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworICAgIGVyciA9IHN5c19nZXRwZWVybmFtZSggc29ja2ZkLCBhZGRyLCBuYW1lbGVuKTsKKworICAgIHNldF9mcyhvbGRmcyk7CisKKyAgICBpZiAoZXJyKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoLWVycik7CisgICAgZWxzZQorCXJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogR2V0IHNvY2tldCBuYW1lLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfZ2V0c29ja25hbWUoIHBqX3NvY2tfdCBzb2NrZmQsCisJCQkJCSBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCQkgaW50ICpuYW1lbGVuKQoreworICAgIG1tX3NlZ21lbnRfdCBvbGRmczsKKyAgICBpbnQgZXJyOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisgICAgCisgICAgZXJyID0gc3lzX2dldHNvY2tuYW1lKCBzb2NrZmQsIGFkZHIsIG5hbWVsZW4gKTsKKworICAgIHNldF9mcyhvbGRmcyk7CisKKyAgICBpZiAoZXJyKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoLWVycik7CisgICAgZWxzZQorCXJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogU2VuZCBkYXRhCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19zZW5kKCBwal9zb2NrX3Qgc29ja2ZkLAorCQkJCSAgY29uc3Qgdm9pZCAqYnVmLAorCQkJCSAgcGpfc3NpemVfdCAqbGVuLAorCQkJCSAgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgcmV0dXJuIHBqX3NvY2tfc2VuZHRvKHNvY2tmZCwgYnVmLCBsZW4sIGZsYWdzLCBOVUxMLCAwKTsKK30KKworCisvKgorICogU2VuZCBkYXRhLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfc2VuZHRvKCBwal9zb2NrX3Qgc29ja2ZkLAorCQkJCSAgICBjb25zdCB2b2lkICpidWZmLAorCQkJCSAgICBwal9zc2l6ZV90ICpsZW4sCisJCQkJICAgIHVuc2lnbmVkIGZsYWdzLAorCQkJCSAgICBjb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCSAgICBpbnQgYWRkcl9sZW4pCit7CisgICAgbG9uZyBlcnI7CisgICAgbW1fc2VnbWVudF90IG9sZGZzOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisgICAgCisgICAgZXJyID0gKmxlbiA9IHN5c19zZW5kdG8oIHNvY2tmZCwgKHZvaWQqKWJ1ZmYsICpsZW4sIGZsYWdzLCAKKwkJCSAgICAgKHZvaWQqKWFkZHIsIGFkZHJfbGVuICk7CisKKyAgICBzZXRfZnMob2xkZnMpOworICAgIAorICAgIGlmIChlcnIgPj0gMCkgeworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKyAgICBlbHNlIHsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKC1lcnIpOworICAgIH0KK30KKworLyoKKyAqIFJlY2VpdmUgZGF0YS4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX3JlY3YoIHBqX3NvY2tfdCBzb2NrZmQsCisJCQkJICB2b2lkICpidWYsCisJCQkJICBwal9zc2l6ZV90ICpsZW4sCisJCQkJICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICByZXR1cm4gcGpfc29ja19yZWN2ZnJvbShzb2NrZmQsIGJ1ZiwgbGVuLCBmbGFncywgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBSZWNlaXZlIGRhdGEuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19yZWN2ZnJvbSggcGpfc29ja190IHNvY2tmZCwKKwkJCQkgICAgICB2b2lkICpidWZmLAorCQkJCSAgICAgIHBqX3NzaXplX3QgKnNpemUsCisJCQkJICAgICAgdW5zaWduZWQgZmxhZ3MsCisJCQkJICAgICAgcGpfc29ja2FkZHJfdCAqZnJvbSwKKwkJCQkgICAgICBpbnQgKmZyb21sZW4pCit7CisgICAgbW1fc2VnbWVudF90IG9sZGZzOworICAgIGxvbmcgZXJyOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisKKyAgICBlcnIgPSAqc2l6ZSA9IHN5c19yZWN2ZnJvbSggc29ja2ZkLCBidWZmLCAqc2l6ZSwgZmxhZ3MsIGZyb20sIGZyb21sZW4pOworCisgICAgc2V0X2ZzKG9sZGZzKTsKKworICAgIGlmIChlcnIgPj0gMCkgeworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKyAgICBlbHNlIHsKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKC1lcnIpOworICAgIH0KK30KKworLyoKKyAqIEdldCBzb2NrZXQgb3B0aW9uLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfZ2V0c29ja29wdCggcGpfc29ja190IHNvY2tmZCwKKwkJCQkJcGpfdWludDE2X3QgbGV2ZWwsCisJCQkJCXBqX3VpbnQxNl90IG9wdG5hbWUsCisJCQkJCXZvaWQgKm9wdHZhbCwKKwkJCQkJaW50ICpvcHRsZW4pCit7CisgICAgbW1fc2VnbWVudF90IG9sZGZzOworICAgIGxvbmcgZXJyOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisKKyAgICBlcnIgPSBzeXNfZ2V0c29ja29wdCggc29ja2ZkLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCisgICAgc2V0X2ZzKG9sZGZzKTsKKworICAgIGlmIChlcnIpCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUigtZXJyKTsKKyAgICBlbHNlCisJcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBTZXQgc29ja2V0IG9wdGlvbi4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX3NldHNvY2tvcHQoIHBqX3NvY2tfdCBzb2NrZmQsCisJCQkJCXBqX3VpbnQxNl90IGxldmVsLAorCQkJCQlwal91aW50MTZfdCBvcHRuYW1lLAorCQkJCQljb25zdCB2b2lkICpvcHR2YWwsCisJCQkJCWludCBvcHRsZW4pCit7CisgICAgbG9uZyBlcnI7CisgICAgbW1fc2VnbWVudF90IG9sZGZzOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworCisgICAgb2xkZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworICAgIGVyciA9IHN5c19zZXRzb2Nrb3B0KCBzb2NrZmQsIGxldmVsLCBvcHRuYW1lLCAodm9pZCopb3B0dmFsLCBvcHRsZW4pOworCisgICAgc2V0X2ZzKG9sZGZzKTsKKworICAgIGlmIChlcnIpCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUigtZXJyKTsKKyAgICBlbHNlCisJcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBTaHV0ZG93biBzb2NrZXQuCisgKi8KKyNpZiBQSl9IQVNfVENQCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfc2h1dGRvd24oIHBqX3NvY2tfdCBzb2NrZmQsCisJCQkJICAgICAgaW50IGhvdykKK3sKKyAgICBsb25nIGVycjsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBlcnIgPSBzeXNfc2h1dGRvd24oc29ja2ZkLCBob3cpOworCisgICAgaWYgKGVycikKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKC1lcnIpOworICAgIGVsc2UKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIFN0YXJ0IGxpc3RlbmluZyB0byBpbmNvbWluZyBjb25uZWN0aW9ucy4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2xpc3RlbiggcGpfc29ja190IHNvY2tmZCwKKwkJCQkgICAgaW50IGJhY2tsb2cpCit7CisgICAgbG9uZyBlcnI7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgZXJyID0gc3lzX2xpc3Rlbiggc29ja2ZkLCBiYWNrbG9nICk7CisKKyAgICBpZiAoZXJyKQorCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoLWVycik7CisgICAgZWxzZQorCXJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogQ29ubmVjdCBzb2NrZXQuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19jb25uZWN0KCBwal9zb2NrX3Qgc29ja2ZkLAorCQkJCSAgICAgY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkciwKKwkJCQkgICAgIGludCBuYW1lbGVuKQoreworICAgIGxvbmcgZXJyOworICAgIG1tX3NlZ21lbnRfdCBvbGRmczsKKyAgICAKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgb2xkZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworICAgIGVyciA9IHN5c19jb25uZWN0KCBzb2NrZmQsICh2b2lkKilhZGRyLCBuYW1lbGVuICk7CisKKyAgICBzZXRfZnMob2xkZnMpOworCisgICAgaWYgKGVycikKKwlyZXR1cm4gUEpfUkVUVVJOX09TX0VSUk9SKC1lcnIpOworICAgIGVsc2UKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyoKKyAqIEFjY2VwdCBpbmNvbWluZyBjb25uZWN0aW9ucworICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfYWNjZXB0KCBwal9zb2NrX3Qgc29ja2ZkLAorCQkJCSAgICBwal9zb2NrX3QgKm5ld3NvY2tmZCwKKwkJCQkgICAgcGpfc29ja2FkZHJfdCAqYWRkciwKKwkJCQkgICAgaW50ICphZGRybGVuKQoreworICAgIGxvbmcgZXJyOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4obmV3c29ja2ZkICE9IE5VTEwsIFBKX0VJTlZBTCk7CisKKyAgICBlcnIgPSBzeXNfYWNjZXB0KCBzb2NrZmQsIGFkZHIsIGFkZHJsZW4pOworCisgICAgaWYgKGVyciA8IDApIHsKKwkqbmV3c29ja2ZkID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUigtZXJyKTsKKyAgICB9CisgICAgZWxzZSB7CisJKm5ld3NvY2tmZCA9IGVycjsKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9Cit9CisjZW5kaWYJLyogUEpfSEFTX1RDUCAqLworCisKKworLyoKKyAqIFBlcm1pc3Npb24gdG8gc3RlYWwgaW5ldF9udG9hKCkgYW5kIGluZXRfYXRvbigpIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgYmVsb3cKKyAqIGlzIGluY2x1ZGVkOgorICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKiAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19xb3NfYnNkLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NvY2tfcW9zX2JzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjg2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NvY2tfcW9zX2JzZC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKiAkSWQ6IHNvY2tfcW9zX2JzZC5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3NvY2tfcW9zLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworLyogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgUW9TIHdpdGggQlNEIHNvY2tldCdzIHNldHNvY2tvcHQoKSwKKyAqIHVzaW5nIElQX1RPUyBhbmQgU09fUFJJT1JJVFkKKyAqLyAKKyNpZiAhZGVmaW5lZChQSl9RT1NfSU1QTEVNRU5UQVRJT04pIHx8IFBKX1FPU19JTVBMRU1FTlRBVElPTj09UEpfUU9TX0JTRAorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfc2V0X3Fvc19wYXJhbXMocGpfc29ja190IHNvY2ssCisJCQkJCSAgIHBqX3Fvc19wYXJhbXMgKnBhcmFtKQoreworICAgIHBqX3N0YXR1c190IGxhc3RfZXJyID0gUEpfRU5PVFNVUDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvKiBObyBvcD8gKi8KKyAgICBpZiAoIXBhcmFtLT5mbGFncykKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKworICAgIC8qIENsZWFyIFdNTSBmaWVsZCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGl0ICovCisgICAgcGFyYW0tPmZsYWdzICY9IH4oUEpfUU9TX1BBUkFNX0hBU19XTU0pOworCisgICAgLyogU2V0IFRPUy9EU0NQICovCisgICAgaWYgKHBhcmFtLT5mbGFncyAmIFBKX1FPU19QQVJBTV9IQVNfRFNDUCkgeworCS8qIFZhbHVlIGlzIGRzY3BfdmFsIDw8IDIgKi8KKwlpbnQgdmFsID0gKHBhcmFtLT5kc2NwX3ZhbCA8PCAyKTsKKwlzdGF0dXMgPSBwal9zb2NrX3NldHNvY2tvcHQoc29jaywgcGpfU09MX0lQKCksIHBqX0lQX1RPUygpLCAKKwkJCQkgICAgJnZhbCwgc2l6ZW9mKHZhbCkpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBwYXJhbS0+ZmxhZ3MgJj0gfihQSl9RT1NfUEFSQU1fSEFTX0RTQ1ApOworCSAgICBsYXN0X2VyciA9IHN0YXR1czsKKwl9CisgICAgfQorCisgICAgLyogU2V0IFNPX1BSSU9SSVRZICovCisgICAgaWYgKHBhcmFtLT5mbGFncyAmIFBKX1FPU19QQVJBTV9IQVNfU09fUFJJTykgeworCWludCB2YWwgPSBwYXJhbS0+c29fcHJpbzsKKwlzdGF0dXMgPSBwal9zb2NrX3NldHNvY2tvcHQoc29jaywgcGpfU09MX1NPQ0tFVCgpLCBwal9TT19QUklPUklUWSgpLAorCQkJCSAgICAmdmFsLCBzaXplb2YodmFsKSk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHBhcmFtLT5mbGFncyAmPSB+KFBKX1FPU19QQVJBTV9IQVNfU09fUFJJTyk7CisJICAgIGxhc3RfZXJyID0gc3RhdHVzOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gcGFyYW0tPmZsYWdzID8gUEpfU1VDQ0VTUyA6IGxhc3RfZXJyOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfc2V0X3Fvc190eXBlKHBqX3NvY2tfdCBzb2NrLAorCQkJCQkgcGpfcW9zX3R5cGUgdHlwZSkKK3sKKyAgICBwal9xb3NfcGFyYW1zIHBhcmFtOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHBqX3Fvc19nZXRfcGFyYW1zKHR5cGUsICZwYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICByZXR1cm4gcGpfc29ja19zZXRfcW9zX3BhcmFtcyhzb2NrLCAmcGFyYW0pOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19nZXRfcW9zX3BhcmFtcyhwal9zb2NrX3Qgc29jaywKKwkJCQkJICAgcGpfcW9zX3BhcmFtcyAqcF9wYXJhbSkKK3sKKyAgICBwal9zdGF0dXNfdCBsYXN0X2VyciA9IFBKX0VOT1RTVVA7CisgICAgaW50IHZhbCwgb3B0bGVuOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHBqX2J6ZXJvKHBfcGFyYW0sIHNpemVvZigqcF9wYXJhbSkpOworCisgICAgLyogR2V0IERTQ1AvVE9TIHZhbHVlICovCisgICAgb3B0bGVuID0gc2l6ZW9mKHZhbCk7CisgICAgc3RhdHVzID0gcGpfc29ja19nZXRzb2Nrb3B0KHNvY2ssIHBqX1NPTF9JUCgpLCBwal9JUF9UT1MoKSwgCisJCQkJJnZhbCwgJm9wdGxlbik7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJcF9wYXJhbS0+ZmxhZ3MgfD0gUEpfUU9TX1BBUkFNX0hBU19EU0NQOworCXBfcGFyYW0tPmRzY3BfdmFsID0gKHBqX3VpbnQ4X3QpKHZhbCA+PiAyKTsKKyAgICB9IGVsc2UgeworCWxhc3RfZXJyID0gc3RhdHVzOworICAgIH0KKworICAgIC8qIEdldCBTT19QUklPUklUWSAqLworICAgIG9wdGxlbiA9IHNpemVvZih2YWwpOworICAgIHN0YXR1cyA9IHBqX3NvY2tfZ2V0c29ja29wdChzb2NrLCBwal9TT0xfU09DS0VUKCksIHBqX1NPX1BSSU9SSVRZKCksCisJCQkJJnZhbCwgJm9wdGxlbik7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJcF9wYXJhbS0+ZmxhZ3MgfD0gUEpfUU9TX1BBUkFNX0hBU19TT19QUklPOworCXBfcGFyYW0tPnNvX3ByaW8gPSAocGpfdWludDhfdCl2YWw7CisgICAgfSBlbHNlIHsKKwlsYXN0X2VyciA9IHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBXTU0gaXMgbm90IHN1cHBvcnRlZCAqLworCisgICAgcmV0dXJuIHBfcGFyYW0tPmZsYWdzID8gUEpfU1VDQ0VTUyA6IGxhc3RfZXJyOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfZ2V0X3Fvc190eXBlKHBqX3NvY2tfdCBzb2NrLAorCQkJCQkgcGpfcW9zX3R5cGUgKnBfdHlwZSkKK3sKKyAgICBwal9xb3NfcGFyYW1zIHBhcmFtOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHBqX3NvY2tfZ2V0X3Fvc19wYXJhbXMoc29jaywgJnBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgIHJldHVybiBwal9xb3NfZ2V0X3R5cGUoJnBhcmFtLCBwX3R5cGUpOworfQorCisjZW5kaWYJLyogUEpfUU9TX0lNUExFTUVOVEFUSU9OICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19xb3NfY29tbW9uLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NvY2tfcW9zX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0M2YwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NvY2tfcW9zX2NvbW1vbi5jCkBAIC0wLDAgKzEsMTUxIEBACisvKiAkSWQ6IHNvY2tfcW9zX2NvbW1vbi5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3NvY2tfcW9zLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworI2RlZmluZSBUSElTX0ZJTEUgICAic29ja19xb3NfY29tbW9uLmMiCisjZGVmaW5lIEFMTF9GTEFHUyAgIChQSl9RT1NfUEFSQU1fSEFTX0RTQ1AgfCBQSl9RT1NfUEFSQU1fSEFTX1NPX1BSSU8gfCBcCisgICAgICAgICAgICAgICAgICAgICBQSl9RT1NfUEFSQU1fSEFTX1dNTSkKKworLyogIlN0YW5kYXJkIiBtYXBwaW5nIGJldHdlZW4gdHJhZmZpYyB0eXBlIGFuZCBRb1MgcGFyYW1zICovCitzdGF0aWMgY29uc3QgcGpfcW9zX3BhcmFtcyBxb3NfbWFwW10gPSAKK3sKKyAgICAvKiBmbGFncwlkc2NwICBwcmlvIHdtbV9wcmlvICovCisgICAge0FMTF9GTEFHUywgMHgwMCwgMCwgICAgUEpfUU9TX1dNTV9QUklPX0JVTEtfRUZGT1JUfSwgICAvKiBCRSAqLworICAgIHtBTExfRkxBR1MsIDB4MDgsIDIsICAgIFBKX1FPU19XTU1fUFJJT19CVUxLfSwJICAgIC8qIEJLICovCisgICAge0FMTF9GTEFHUywgMHgyOCwgNSwgICAgUEpfUU9TX1dNTV9QUklPX1ZJREVPfSwJICAgIC8qIFZJICovCisgICAge0FMTF9GTEFHUywgMHgzMCwgNiwgICAgUEpfUU9TX1dNTV9QUklPX1ZPSUNFfSwJICAgIC8qIFZPICovCisgICAge0FMTF9GTEFHUywgMHgzOCwgNywgICAgUEpfUU9TX1dNTV9QUklPX1ZPSUNFfQkgICAgLyogQ08gKi8KK307CisKKworLyogUmV0cmlldmUgdGhlIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9xb3NfZ2V0X3BhcmFtcyhwal9xb3NfdHlwZSB0eXBlLCAKKwkJCQkgICAgICBwal9xb3NfcGFyYW1zICpwX3BhcmFtKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4odHlwZTw9UEpfUU9TX1RZUEVfQ09OVFJPTCAmJiBwX3BhcmFtLCBQSl9FSU5WQUwpOworICAgIHBqX21lbWNweShwX3BhcmFtLCAmcW9zX21hcFt0eXBlXSwgc2l6ZW9mKCpwX3BhcmFtKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEdldCB0aGUgbWF0Y2hpbmcgdHJhZmZpYyB0eXBlICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3Fvc19nZXRfdHlwZSggY29uc3QgcGpfcW9zX3BhcmFtcyAqcGFyYW0sCisJCQkJICAgICBwal9xb3NfdHlwZSAqcF90eXBlKQoreworICAgIHVuc2lnbmVkIGRzY3BfdHlwZSA9IFBKX1FPU19UWVBFX0JFU1RfRUZGT1JULAorCSAgICAgcHJpb190eXBlID0gUEpfUU9TX1RZUEVfQkVTVF9FRkZPUlQsCisJICAgICB3bW1fdHlwZSA9IFBKX1FPU19UWVBFX0JFU1RfRUZGT1JUOworICAgIHVuc2lnbmVkIGksIGNvdW50PTA7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBhcmFtICYmIHBfdHlwZSwgUEpfRUlOVkFMKTsKKworICAgIGlmIChwYXJhbS0+ZmxhZ3MgJiBQSl9RT1NfUEFSQU1fSEFTX0RTQ1ApICB7CisJZm9yIChpPTA7IGk8PVBKX1FPU19UWVBFX0NPTlRST0w7ICsraSkgeworCSAgICBpZiAocGFyYW0tPmRzY3BfdmFsID49IHFvc19tYXBbaV0uZHNjcF92YWwpCisJCWRzY3BfdHlwZSA9IChwal9xb3NfdHlwZSlpOworCX0KKwkrK2NvdW50OworICAgIH0KKworICAgIGlmIChwYXJhbS0+ZmxhZ3MgJiBQSl9RT1NfUEFSQU1fSEFTX1NPX1BSSU8pIHsKKwlmb3IgKGk9MDsgaTw9UEpfUU9TX1RZUEVfQ09OVFJPTDsgKytpKSB7CisJICAgIGlmIChwYXJhbS0+c29fcHJpbyA+PSBxb3NfbWFwW2ldLnNvX3ByaW8pCisJCXByaW9fdHlwZSA9IChwal9xb3NfdHlwZSlpOworCX0KKwkrK2NvdW50OworICAgIH0KKworICAgIGlmIChwYXJhbS0+ZmxhZ3MgJiBQSl9RT1NfUEFSQU1fSEFTX1dNTSkgeworCWZvciAoaT0wOyBpPD1QSl9RT1NfVFlQRV9DT05UUk9MOyArK2kpIHsKKwkgICAgaWYgKHBhcmFtLT53bW1fcHJpbyA+PSBxb3NfbWFwW2ldLndtbV9wcmlvKQorCQl3bW1fdHlwZSA9IChwal9xb3NfdHlwZSlpOworCX0KKwkrK2NvdW50OworICAgIH0KKworICAgIGlmIChjb3VudCkKKwkqcF90eXBlID0gKHBqX3Fvc190eXBlKSgoZHNjcF90eXBlICsgcHJpb190eXBlICsgd21tX3R5cGUpIC8gY291bnQpOworICAgIGVsc2UKKwkqcF90eXBlID0gUEpfUU9TX1RZUEVfQkVTVF9FRkZPUlQ7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworLyogQXBwbHkgUW9TICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfYXBwbHlfcW9zKCBwal9zb2NrX3Qgc29jaywKKwkJCQkgICAgICAgcGpfcW9zX3R5cGUgcW9zX3R5cGUsCisJCQkJICAgICAgIHBqX3Fvc19wYXJhbXMgKnFvc19wYXJhbXMsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvZ19sZXZlbCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbG9nX3NlbmRlciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqc29ja19uYW1lKQoreworICAgIHBqX3N0YXR1c190IHFvc190eXBlX3JjID0gUEpfU1VDQ0VTUywKKwkJcW9zX3BhcmFtc19yYyA9IFBKX1NVQ0NFU1M7CisKKyAgICBpZiAoIWxvZ19zZW5kZXIpCisJbG9nX3NlbmRlciA9IFRISVNfRklMRTsKKyAgICBpZiAoIXNvY2tfbmFtZSkKKwlzb2NrX25hbWUgPSAic29ja2V0IjsKKworICAgIGlmIChxb3NfdHlwZSAhPSBQSl9RT1NfVFlQRV9CRVNUX0VGRk9SVCkgeworCXFvc190eXBlX3JjID0gcGpfc29ja19zZXRfcW9zX3R5cGUoc29jaywgcW9zX3R5cGUpOworCisJaWYgKHFvc190eXBlX3JjICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgcGpfcGVycm9yKGxvZ19sZXZlbCwgbG9nX3NlbmRlciwgIHFvc190eXBlX3JjLCAKKwkJICAgICAgIkVycm9yIHNldHRpbmcgUW9TIHR5cGUgJWQgdG8gJXMiLCAKKwkJICAgICAgcW9zX3R5cGUsIHNvY2tfbmFtZSk7CisJfQorICAgIH0KKworICAgIGlmIChxb3NfcGFyYW1zICYmIHFvc19wYXJhbXMtPmZsYWdzKSB7CisJcW9zX3BhcmFtc19yYyA9IHBqX3NvY2tfc2V0X3Fvc19wYXJhbXMoc29jaywgcW9zX3BhcmFtcyk7CisJaWYgKHFvc19wYXJhbXNfcmMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBwal9wZXJyb3IobG9nX2xldmVsLCBsb2dfc2VuZGVyLCAgcW9zX3BhcmFtc19yYywgCisJCSAgICAgICJFcnJvciBzZXR0aW5nIFFvUyBwYXJhbXMgKGZsYWdzPSVkKSB0byAlcyIsIAorCQkgICAgICBxb3NfcGFyYW1zLT5mbGFncywgc29ja19uYW1lKTsKKwkgICAgaWYgKHFvc190eXBlX3JjICE9IFBKX1NVQ0NFU1MpCisJCXJldHVybiBxb3NfcGFyYW1zX3JjOworCX0KKyAgICB9IGVsc2UgaWYgKHFvc190eXBlX3JjICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHFvc190eXBlX3JjOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2FwcGx5X3FvczIoIHBqX3NvY2tfdCBzb2NrLAorIAkJCQkgICAgICAgIHBqX3Fvc190eXBlIHFvc190eXBlLAorCQkJCSAgICAgICAgY29uc3QgcGpfcW9zX3BhcmFtcyAqcW9zX3BhcmFtcywKKwkJCQkgICAgICAgIHVuc2lnbmVkIGxvZ19sZXZlbCwKKwkJCQkgICAgICAgIGNvbnN0IGNoYXIgKmxvZ19zZW5kZXIsCisJCQkJICAgICAgICBjb25zdCBjaGFyICpzb2NrX25hbWUpCit7CisgICAgcGpfcW9zX3BhcmFtcyBxb3NfcGFyYW1zX2J1ZiwgKnFvc19wYXJhbXNfY29weSA9IE5VTEw7CisKKyAgICBpZiAocW9zX3BhcmFtcykgeworCXBqX21lbWNweSgmcW9zX3BhcmFtc19idWYsIHFvc19wYXJhbXMsIHNpemVvZigqcW9zX3BhcmFtcykpOworCXFvc19wYXJhbXNfY29weSA9ICZxb3NfcGFyYW1zX2J1ZjsKKyAgICB9CisKKyAgICByZXR1cm4gcGpfc29ja19hcHBseV9xb3Moc29jaywgcW9zX3R5cGUsIHFvc19wYXJhbXNfY29weSwKKwkJCSAgICAgbG9nX2xldmVsLCBsb2dfc2VuZGVyLCBzb2NrX25hbWUpOworfQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX3Fvc19kdW1teS5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX3Fvc19kdW1teS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYmI1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NvY2tfcW9zX2R1bW15LmMKQEAgLTAsMCArMSw3NiBAQAorLyogJElkOiBzb2NrX3Fvc19kdW1teS5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3NvY2tfcW9zLmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKworLyogRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgUW9TIEFQSS4gCisgKiAodGhpcyBpcyBjb250cm9sbGVkIGJ5IHBqbGliJ3MgY29uZmlnLmgpCisgKi8KKyNpZiBkZWZpbmVkKFBKX1FPU19JTVBMRU1FTlRBVElPTikgJiYgUEpfUU9TX0lNUExFTUVOVEFUSU9OPT1QSl9RT1NfRFVNTVkKKworI2RlZmluZSBUSElTX0ZJTEUgICAic29ja19xb3NfZHVtbXkuYyIKKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfc2V0X3Fvc19wYXJhbXMocGpfc29ja190IHNvY2ssCisJCQkJCSAgIHBqX3Fvc19wYXJhbXMgKnBhcmFtKQoreworICAgIFBKX1VOVVNFRF9BUkcoc29jayk7CisgICAgUEpfVU5VU0VEX0FSRyhwYXJhbSk7CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAicGpfc29ja19zZXRfcW9zX3BhcmFtcygpIGlzIG5vdCBpbXBsZW1lbnRlZCAiCisJCQkgImZvciB0aGlzIHBsYXRmb3JtIikpOworICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfc2V0X3Fvc190eXBlKHBqX3NvY2tfdCBzb2NrLAorCQkJCQkgcGpfcW9zX3R5cGUgdHlwZSkKK3sKKyAgICBQSl9VTlVTRURfQVJHKHNvY2spOworICAgIFBKX1VOVVNFRF9BUkcodHlwZSk7CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAicGpfc29ja19zZXRfcW9zX3R5cGUoKSBpcyBub3QgaW1wbGVtZW50ZWQgIgorCQkJICJmb3IgdGhpcyBwbGF0Zm9ybSIpKTsKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfZ2V0X3Fvc19wYXJhbXMocGpfc29ja190IHNvY2ssCisJCQkJCSAgIHBqX3Fvc19wYXJhbXMgKnBfcGFyYW0pCit7CisgICAgUEpfVU5VU0VEX0FSRyhzb2NrKTsKKyAgICBQSl9VTlVTRURfQVJHKHBfcGFyYW0pOworCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgInBqX3NvY2tfZ2V0X3Fvc19wYXJhbXMoKSBpcyBub3QgaW1wbGVtZW50ZWQgIgorCQkJICJmb3IgdGhpcyBwbGF0Zm9ybSIpKTsKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2dldF9xb3NfdHlwZShwal9zb2NrX3Qgc29jaywKKwkJCQkJIHBqX3Fvc190eXBlICpwX3R5cGUpCit7CisgICAgUEpfVU5VU0VEX0FSRyhzb2NrKTsKKyAgICBQSl9VTlVTRURfQVJHKHBfdHlwZSk7CisKKyAgICBQSl9MT0coNCwoVEhJU19GSUxFLCAicGpfc29ja19nZXRfcW9zX3R5cGUoKSBpcyBub3QgaW1wbGVtZW50ZWQgIgorCQkJICJmb3IgdGhpcyBwbGF0Zm9ybSIpKTsKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworI2VuZGlmCS8qIFBKX1FPU19EVU1NWSAqLwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX3Fvc19zeW1iaWFuLmNwcCBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19xb3Nfc3ltYmlhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3NzliOAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19xb3Nfc3ltYmlhbi5jcHAKQEAgLTAsMCArMSw5NSBAQAorLyogJElkOiBzb2NrX3Fvc19zeW1iaWFuLmNwcCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9zb2NrX3Fvcy5oPgorI2luY2x1ZGUgIm9zX3N5bWJpYW4uaCIKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX3NldF9xb3NfcGFyYW1zKHBqX3NvY2tfdCBzb2NrLAorCQkJCQkgICBwal9xb3NfcGFyYW1zICpwYXJhbSkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNvY2shPTAgJiYgc29jayE9UEpfSU5WQUxJRF9TT0NLRVQsIFBKX0VJTlZBTCk7CisgICAgCisgICAgQ1BqU29ja2V0ICpwanNvY2sgPSAoQ1BqU29ja2V0Kilzb2NrOworICAgIFJTb2NrZXQgJiByc29jayA9IHBqc29jay0+U29ja2V0KCk7CisgICAgcGpfc3RhdHVzX3QgbGFzdF9lcnIgPSBQSl9FTk9UU1VQOworICAgIAorICAgIC8qIFNPX1BSSU9SSVRZIGFuZCBXTU0gYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBwYXJhbS0+ZmxhZ3MgJj0gfihQSl9RT1NfUEFSQU1fSEFTX1NPX1BSSU8gfCBQSl9RT1NfUEFSQU1fSEFTX1dNTSk7CisgICAgCisgICAgaWYgKHBhcmFtLT5mbGFncyAmIFBKX1FPU19QQVJBTV9IQVNfRFNDUCkgeworCVRJbnQgZXJyOworCQorCWVyciA9IHJzb2NrLlNldE9wdChLU29JcFRPUywgS1Byb3RvY29sSW5ldElwLAorCQkgICAgICAgICAgIChwYXJhbS0+ZHNjcF92YWwgPDwgMikpOworCWlmIChlcnIgIT0gS0Vyck5vbmUpIHsKKwkgICAgbGFzdF9lcnIgPSBQSl9SRVRVUk5fT1NfRVJST1IoZXJyKTsKKwkgICAgcGFyYW0tPmZsYWdzICY9IH4oUEpfUU9TX1BBUkFNX0hBU19EU0NQKTsKKwl9CisgICAgfQorICAgIAorICAgIHJldHVybiBwYXJhbS0+ZmxhZ3MgPyBQSl9TVUNDRVNTIDogbGFzdF9lcnI7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19zZXRfcW9zX3R5cGUocGpfc29ja190IHNvY2ssCisJCQkJCSBwal9xb3NfdHlwZSB0eXBlKQoreworICAgIHBqX3Fvc19wYXJhbXMgcGFyYW07CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIHN0YXR1cyA9IHBqX3Fvc19nZXRfcGFyYW1zKHR5cGUsICZwYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisgICAgCisgICAgcmV0dXJuIHBqX3NvY2tfc2V0X3Fvc19wYXJhbXMoc29jaywgJnBhcmFtKTsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfZ2V0X3Fvc19wYXJhbXMocGpfc29ja190IHNvY2ssCisJCQkJCSAgIHBqX3Fvc19wYXJhbXMgKnBfcGFyYW0pCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzb2NrIT0wICYmIHNvY2shPVBKX0lOVkFMSURfU09DS0VULCBQSl9FSU5WQUwpOworICAgIAorICAgIENQalNvY2tldCAqcGpzb2NrID0gKENQalNvY2tldCopc29jazsKKyAgICBSU29ja2V0ICYgcnNvY2sgPSBwanNvY2stPlNvY2tldCgpOworICAgIFRJbnQgZXJyLCBkc2NwOworICAgIAorICAgIHBqX2J6ZXJvKHBfcGFyYW0sIHNpemVvZigqcF9wYXJhbSkpOworCisgICAgZXJyID0gcnNvY2suR2V0T3B0KEtTb0lwVE9TLCBLUHJvdG9jb2xJbmV0SXAsIGRzY3ApOworICAgIGlmIChlcnIgPT0gS0Vyck5vbmUpIHsKKwlwX3BhcmFtLT5mbGFncyB8PSBQSl9RT1NfUEFSQU1fSEFTX0RTQ1A7CisJcF9wYXJhbS0+ZHNjcF92YWwgPSAoZHNjcCA+PiAyKTsKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9IGVsc2UgeworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZXJyKTsKKyAgICB9Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19nZXRfcW9zX3R5cGUocGpfc29ja190IHNvY2ssCisJCQkJCSBwal9xb3NfdHlwZSAqcF90eXBlKQoreworICAgIHBqX3Fvc19wYXJhbXMgcGFyYW07CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIHN0YXR1cyA9IHBqX3NvY2tfZ2V0X3Fvc19wYXJhbXMoc29jaywgJnBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKyAgICAKKyAgICByZXR1cm4gcGpfcW9zX2dldF90eXBlKCZwYXJhbSwgcF90eXBlKTsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX3Fvc193bS5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX3Fvc193bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MDdkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NvY2tfcW9zX3dtLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qICRJZDogc29ja19xb3Nfd20uYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9zb2NrX3Fvcy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisKKyNpbmNsdWRlIDx3aW5zb2NrLmg+CisKKy8qIFFvUyBpbXBsZW1lbnRhdGlvbiBmb3IgV2luZG93cyBNb2JpbGUgNiwgbXVzdCBiZSBlbmFibGVkIGV4cGxpY2l0bHkKKyAqICh0aGlzIGlzIGNvbnRyb2xsZWQgYnkgcGpsaWIncyBjb25maWcuaCkKKyAqLworI2lmIGRlZmluZWQoUEpfUU9TX0lNUExFTUVOVEFUSU9OKSAmJiBQSl9RT1NfSU1QTEVNRU5UQVRJT049PVBKX1FPU19XTQorCisjZGVmaW5lIFRISVNfRklMRSAgICJzb2NrX3Fvc193bS5jIgorCisvKiBNYXBwaW5nIGJldHdlZW4gb3VyIHRyYWZmaWMgdHlwZSBhbmQgV00ncyBEU0NQIHRyYWZmaWMgdHlwZXMgKi8KK3N0YXRpYyBjb25zdCBpbnQgZHNjcF9tYXBbXSA9IAoreworICAgIERTQ1BCZXN0RWZmb3J0LAorICAgIERTQ1BCYWNrZ3JvdW5kLAorICAgIERTQ1BWaWRlbywKKyAgICBEU0NQQXVkaW8sCisgICAgRFNDUENvbnRyb2wKK307CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19zZXRfcW9zX3BhcmFtcyhwal9zb2NrX3Qgc29jaywKKwkJCQkJICAgcGpfcW9zX3BhcmFtcyAqcGFyYW0pCit7CisgICAgUEpfVU5VU0VEX0FSRyhzb2NrKTsKKyAgICBQSl9VTlVTRURfQVJHKHBhcmFtKTsKKworICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsICJwal9zb2NrX3NldF9xb3NfcGFyYW1zKCkgaXMgbm90IGltcGxlbWVudGVkICIKKwkJCSAiZm9yIHRoaXMgcGxhdGZvcm0iKSk7CisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19zZXRfcW9zX3R5cGUocGpfc29ja190IHNvY2ssCisJCQkJCSBwal9xb3NfdHlwZSB0eXBlKQoreworICAgIGludCB2YWx1ZTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4odHlwZSA8IFBKX0FSUkFZX1NJWkUoZHNjcF9tYXApLCBQSl9FSU5WQUwpOworCisgICAgdmFsdWUgPSBkc2NwX21hcFt0eXBlXTsKKyAgICByZXR1cm4gcGpfc29ja19zZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fSVAsIElQX0RTQ1BfVFJBRkZJQ19UWVBFLAorCQkJICAgICAgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfZ2V0X3Fvc19wYXJhbXMocGpfc29ja190IHNvY2ssCisJCQkJCSAgIHBqX3Fvc19wYXJhbXMgKnBfcGFyYW0pCit7CisgICAgUEpfVU5VU0VEX0FSRyhzb2NrKTsKKyAgICBQSl9VTlVTRURfQVJHKHBfcGFyYW0pOworCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwgInBqX3NvY2tfZ2V0X3Fvc19wYXJhbXMoKSBpcyBub3QgaW1wbGVtZW50ZWQgIgorCQkJICJmb3IgdGhpcyBwbGF0Zm9ybSIpKTsKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2dldF9xb3NfdHlwZShwal9zb2NrX3Qgc29jaywKKwkJCQkJIHBqX3Fvc190eXBlICpwX3R5cGUpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCB2YWx1ZSwgb3B0bGVuOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBvcHRsZW4gPSBzaXplb2YodmFsdWUpOworICAgIHZhbHVlID0gMDsKKyAgICBzdGF0dXMgPSBwal9zb2NrX2dldHNvY2tvcHQoc29jaywgSVBQUk9UT19JUCwgSVBfRFNDUF9UUkFGRklDX1RZUEUsCisJCQkgICAgICAgICZ2YWx1ZSwgJm9wdGxlbik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiBzdGF0dXM7CisKKyAgICAqcF90eXBlID0gUEpfUU9TX1RZUEVfQkVTVF9FRkZPUlQ7CisgICAgZm9yIChpPTA7IGk8UEpfQVJSQVlfU0laRShkc2NwX21hcCk7ICsraSkgeworCWlmICh2YWx1ZSA9PSBkc2NwX21hcFtpXSkgeworCSAgICAqcF90eXBlID0gKHBqX3Fvc190eXBlKWk7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworI2VuZGlmCS8qIFBKX1FPU19JTVBMRU1FTlRBVElPTiAqLwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX3NlbGVjdC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX3NlbGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOTMwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NvY2tfc2VsZWN0LmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qICRJZDogc29ja19zZWxlY3QuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3NvY2tfc2VsZWN0Lmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3NvY2tldC5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKworI2lmIGRlZmluZWQoUEpfSEFTX1NUUklOR19IKSAmJiBQSl9IQVNfU1RSSU5HX0ghPTAKKyMgICBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQSl9IQVNfU1lTX1RJTUVfSCkgJiYgUEpfSEFTX1NZU19USU1FX0ghPTAKKyMgICBpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpZmRlZiBfTVNDX1ZFUgorIyAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwMTgpICAgIC8vIFNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaCBpbiBGRF8qCisjICAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDM4OSkgICAgLy8gU2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoIGluIEZEXyoKKyNlbmRpZgorCisjZGVmaW5lIFBBUlRfRkRTRVQocHMpCQkoKGZkX3NldCopJnBzLT5kYXRhWzFdKQorI2RlZmluZSBQQVJUX0ZEU0VUX09SX05VTEwocHMpCShwcyA/IFBBUlRfRkRTRVQocHMpIDogTlVMTCkKKyNkZWZpbmUgUEFSVF9DT1VOVChwcykJCShwcy0+ZGF0YVswXSkKKworUEpfREVGKHZvaWQpIFBKX0ZEX1pFUk8ocGpfZmRfc2V0X3QgKmZkc2V0cCkKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIHBqX2Fzc2VydChzaXplb2YocGpfZmRfc2V0X3QpLXNpemVvZihwal9zb2NrX3QpID49IHNpemVvZihmZF9zZXQpKTsKKworICAgIEZEX1pFUk8oUEFSVF9GRFNFVChmZHNldHApKTsKKyAgICBQQVJUX0NPVU5UKGZkc2V0cCkgPSAwOworfQorCisKK1BKX0RFRih2b2lkKSBQSl9GRF9TRVQocGpfc29ja190IGZkLCBwal9mZF9zZXRfdCAqZmRzZXRwKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgcGpfYXNzZXJ0KHNpemVvZihwal9mZF9zZXRfdCktc2l6ZW9mKHBqX3NvY2tfdCkgPj0gc2l6ZW9mKGZkX3NldCkpOworCisgICAgaWYgKCFQSl9GRF9JU1NFVChmZCwgZmRzZXRwKSkKKyAgICAgICAgKytQQVJUX0NPVU5UKGZkc2V0cCk7CisgICAgRkRfU0VUKGZkLCBQQVJUX0ZEU0VUKGZkc2V0cCkpOworfQorCisKK1BKX0RFRih2b2lkKSBQSl9GRF9DTFIocGpfc29ja190IGZkLCBwal9mZF9zZXRfdCAqZmRzZXRwKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgcGpfYXNzZXJ0KHNpemVvZihwal9mZF9zZXRfdCktc2l6ZW9mKHBqX3NvY2tfdCkgPj0gc2l6ZW9mKGZkX3NldCkpOworCisgICAgaWYgKFBKX0ZEX0lTU0VUKGZkLCBmZHNldHApKQorICAgICAgICAtLVBBUlRfQ09VTlQoZmRzZXRwKTsKKyAgICBGRF9DTFIoZmQsIFBBUlRfRkRTRVQoZmRzZXRwKSk7Cit9CisKKworUEpfREVGKHBqX2Jvb2xfdCkgUEpfRkRfSVNTRVQocGpfc29ja190IGZkLCBjb25zdCBwal9mZF9zZXRfdCAqZmRzZXRwKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzaXplb2YocGpfZmRfc2V0X3QpLXNpemVvZihwal9zb2NrX3QpID49IHNpemVvZihmZF9zZXQpLAorICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICByZXR1cm4gRkRfSVNTRVQoZmQsIFBBUlRfRkRTRVQoZmRzZXRwKSk7Cit9CisKK1BKX0RFRihwal9zaXplX3QpIFBKX0ZEX0NPVU5UKGNvbnN0IHBqX2ZkX3NldF90ICpmZHNldHApCit7CisgICAgcmV0dXJuIFBBUlRfQ09VTlQoZmRzZXRwKTsKK30KKworUEpfREVGKGludCkgcGpfc29ja19zZWxlY3QoIGludCBuLCAKKwkJCSAgICBwal9mZF9zZXRfdCAqcmVhZGZkcywgCisJCQkgICAgcGpfZmRfc2V0X3QgKndyaXRlZmRzLAorCQkJICAgIHBqX2ZkX3NldF90ICpleGNlcHRmZHMsIAorCQkJICAgIGNvbnN0IHBqX3RpbWVfdmFsICp0aW1lb3V0KQoreworICAgIHN0cnVjdCB0aW1ldmFsIG9zX3RpbWVvdXQsICpwX29zX3RpbWVvdXQ7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihzaXplb2YocGpfZmRfc2V0X3QpLXNpemVvZihwal9zb2NrX3QpID49IHNpemVvZihmZF9zZXQpLAorICAgICAgICAgICAgICAgICAgICAgUEpfRUJVRyk7CisKKyAgICBpZiAodGltZW91dCkgeworCW9zX3RpbWVvdXQudHZfc2VjID0gdGltZW91dC0+c2VjOworCW9zX3RpbWVvdXQudHZfdXNlYyA9IHRpbWVvdXQtPm1zZWMgKiAxMDAwOworCXBfb3NfdGltZW91dCA9ICZvc190aW1lb3V0OworICAgIH0gZWxzZSB7CisJcF9vc190aW1lb3V0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc2VsZWN0KG4sIFBBUlRfRkRTRVRfT1JfTlVMTChyZWFkZmRzKSwgUEFSVF9GRFNFVF9PUl9OVUxMKHdyaXRlZmRzKSwKKwkJICBQQVJUX0ZEU0VUX09SX05VTEwoZXhjZXB0ZmRzKSwgcF9vc190aW1lb3V0KTsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zb2NrX3NlbGVjdF9zeW1iaWFuLmNwcCBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19zZWxlY3Rfc3ltYmlhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhYTJiYwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19zZWxlY3Rfc3ltYmlhbi5jcHAKQEAgLTAsMCArMSwxNjMgQEAKKy8qICRJZDogc29ja19zZWxlY3Rfc3ltYmlhbi5jcHAgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9zb2NrX3NlbGVjdC5oPgorI2luY2x1ZGUgPHBqL2FycmF5Lmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlICJvc19zeW1iaWFuLmgiCisKKyAKK3N0cnVjdCBzeW1iaWFuX2ZkX3NldAoreworICAgIHVuc2lnbmVkCSBjb3VudDsKKyAgICBDUGpTb2NrZXQJKnNvY2tbUEpfSU9RVUVVRV9NQVhfSEFORExFU107Cit9OworCisKK1BKX0RFRih2b2lkKSBQSl9GRF9aRVJPKHBqX2ZkX3NldF90ICpmZHNldHApCit7CisgICAgc3ltYmlhbl9mZF9zZXQgKmZkcyA9IChzeW1iaWFuX2ZkX3NldCAqKWZkc2V0cDsKKyAgICBmZHMtPmNvdW50ID0gMDsKK30KKworCitQSl9ERUYodm9pZCkgUEpfRkRfU0VUKHBqX3NvY2tfdCBmZCwgcGpfZmRfc2V0X3QgKmZkc2V0cCkKK3sKKyAgICBzeW1iaWFuX2ZkX3NldCAqZmRzID0gKHN5bWJpYW5fZmRfc2V0ICopZmRzZXRwOworCisgICAgUEpfQVNTRVJUX09OX0ZBSUwoZmRzLT5jb3VudCA8IFBKX0lPUVVFVUVfTUFYX0hBTkRMRVMsIHJldHVybik7CisgICAgZmRzLT5zb2NrW2Zkcy0+Y291bnQrK10gPSAoQ1BqU29ja2V0KilmZDsKK30KKworCitQSl9ERUYodm9pZCkgUEpfRkRfQ0xSKHBqX3NvY2tfdCBmZCwgcGpfZmRfc2V0X3QgKmZkc2V0cCkKK3sKKyAgICBzeW1iaWFuX2ZkX3NldCAqZmRzID0gKHN5bWJpYW5fZmRfc2V0ICopZmRzZXRwOworICAgIHVuc2lnbmVkIGk7CisgICAgCisgICAgZm9yIChpPTA7IGk8ZmRzLT5jb3VudDsgKytpKSB7CisJaWYgKGZkcy0+c29ja1tpXSA9PSAoQ1BqU29ja2V0KilmZCkgeworCSAgICBwal9hcnJheV9lcmFzZShmZHMtPnNvY2ssIHNpemVvZihmZHMtPnNvY2tbMF0pLCBmZHMtPmNvdW50LCBpKTsKKwkgICAgLS1mZHMtPmNvdW50OworCSAgICByZXR1cm47CisJfQorICAgIH0KK30KKworCitQSl9ERUYocGpfYm9vbF90KSBQSl9GRF9JU1NFVChwal9zb2NrX3QgZmQsIGNvbnN0IHBqX2ZkX3NldF90ICpmZHNldHApCit7CisgICAgc3ltYmlhbl9mZF9zZXQgKmZkcyA9IChzeW1iaWFuX2ZkX3NldCAqKWZkc2V0cDsKKyAgICB1bnNpZ25lZCBpOworICAgIAorICAgIGZvciAoaT0wOyBpPGZkcy0+Y291bnQ7ICsraSkgeworCWlmIChmZHMtPnNvY2tbaV0gPT0gKENQalNvY2tldCopZmQpIHsKKwkgICAgcmV0dXJuIFBKX1RSVUU7CisJfQorICAgIH0KKworICAgIHJldHVybiBQSl9GQUxTRTsKK30KKworUEpfREVGKHBqX3NpemVfdCkgUEpfRkRfQ09VTlQoY29uc3QgcGpfZmRfc2V0X3QgKmZkc2V0cCkKK3sKKyAgICBzeW1iaWFuX2ZkX3NldCAqZmRzID0gKHN5bWJpYW5fZmRfc2V0ICopZmRzZXRwOworICAgIHJldHVybiBmZHMtPmNvdW50OworfQorCisKK1BKX0RFRihpbnQpIHBqX3NvY2tfc2VsZWN0KCBpbnQgbiwgCisJCQkgICAgcGpfZmRfc2V0X3QgKnJlYWRmZHMsIAorCQkJICAgIHBqX2ZkX3NldF90ICp3cml0ZWZkcywKKwkJCSAgICBwal9mZF9zZXRfdCAqZXhjZXB0ZmRzLCAKKwkJCSAgICBjb25zdCBwal90aW1lX3ZhbCAqdGltZW91dCkKK3sKKyAgICBDUGpUaW1lb3V0VGltZXIgKnBqVGltZXI7CisgICAgdW5zaWduZWQgaTsKKworICAgIFBKX1VOVVNFRF9BUkcobik7CisgICAgUEpfVU5VU0VEX0FSRyh3cml0ZWZkcyk7CisgICAgUEpfVU5VU0VEX0FSRyhleGNlcHRmZHMpOworCisgICAgaWYgKHRpbWVvdXQpIHsKKwlwalRpbWVyID0gUGpTeW1iaWFuT1M6Okluc3RhbmNlKCktPlNlbGVjdFRpbWVvdXRUaW1lcigpOworCXBqVGltZXItPlN0YXJ0VGltZXIodGltZW91dC0+c2VjKjEwMDAgKyB0aW1lb3V0LT5tc2VjKTsKKworICAgIH0gZWxzZSB7CisJcGpUaW1lciA9IE5VTEw7CisgICAgfQorCisgICAgLyogU2NhbiBmb3IgcmVhZGFibGUgc29ja2V0cyAqLworCisgICAgaWYgKHJlYWRmZHMpIHsKKwlzeW1iaWFuX2ZkX3NldCAqZmRzID0gKHN5bWJpYW5fZmRfc2V0ICopcmVhZGZkczsKKworCWRvIHsKKwkgICAgLyogU2NhbiBzb2NrZXRzIGZvciByZWFkaWx5IGF2YWlsYWJsZSBkYXRhICovCisJICAgIGZvciAoaT0wOyBpPGZkcy0+Y291bnQ7ICsraSkgeworCQlDUGpTb2NrZXQgKnBqc29jayA9IGZkcy0+c29ja1tpXTsKKworCQlpZiAocGpzb2NrLT5SZWFkZXIoKSkgeworCQkgICAgaWYgKHBqc29jay0+UmVhZGVyKCktPkhhc0RhdGEoKSAmJiAhcGpzb2NrLT5SZWFkZXIoKS0+SXNBY3RpdmUoKSkgeworCisJCQkvKiBGb3VuZCBzb2NrZXQgd2l0aCBkYXRhIHJlYWR5ICovCisJCQlQSl9GRF9aRVJPKHJlYWRmZHMpOworCQkJUEpfRkRfU0VUKChwal9zb2NrX3QpcGpzb2NrLCByZWFkZmRzKTsKKworCQkJLyogQ2FuY2VsIHRpbWVyLCBpZiBhbnkgKi8KKwkJCWlmIChwalRpbWVyKSB7CisJCQkgICAgcGpUaW1lci0+Q2FuY2VsKCk7CisJCQl9CisKKwkJCS8qIENsZWFyIHdyaXRhYmxlIGFuZCBleGNlcHRpb24gZmRfc2V0ICovCisJCQlpZiAod3JpdGVmZHMpCisJCQkgICAgUEpfRkRfWkVSTyh3cml0ZWZkcyk7CisJCQlpZiAoZXhjZXB0ZmRzKQorCQkJICAgIFBKX0ZEX1pFUk8oZXhjZXB0ZmRzKTsKKworCQkJcmV0dXJuIDE7CisKKwkJICAgIH0gZWxzZSBpZiAoIXBqc29jay0+UmVhZGVyKCktPklzQWN0aXZlKCkpCisJCQlwanNvY2stPlJlYWRlcigpLT5TdGFydFJlY3ZGcm9tKCk7CisKKwkJfSBlbHNlIHsKKwkJICAgIHBqc29jay0+Q3JlYXRlUmVhZGVyKCk7CisJCSAgICBwanNvY2stPlJlYWRlcigpLT5TdGFydFJlY3ZGcm9tKCk7CisJCX0KKwkgICAgfQorCisJICAgIFBqU3ltYmlhbk9TOjpJbnN0YW5jZSgpLT5XYWl0Rm9yQWN0aXZlT2JqZWN0cygpOworCisJfSB3aGlsZSAocGpUaW1lcj09TlVMTCB8fCAhcGpUaW1lci0+SGFzVGltZWRPdXQoKSk7CisgICAgfQorCisKKyAgICAvKiBUaW1lb3V0ICovCisKKyAgICBpZiAocmVhZGZkcykKKwlQSl9GRF9aRVJPKHJlYWRmZHMpOworICAgIGlmICh3cml0ZWZkcykKKwlQSl9GRF9aRVJPKHdyaXRlZmRzKTsKKyAgICBpZiAoZXhjZXB0ZmRzKQorCVBKX0ZEX1pFUk8oZXhjZXB0ZmRzKTsKKworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NvY2tfc3ltYmlhbi5jcHAgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NvY2tfc3ltYmlhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkYjFlYQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc29ja19zeW1iaWFuLmNwcApAQCAtMCwwICsxLDEwMjEgQEAKKy8qICRJZDogc29ja19zeW1iaWFuLmNwcCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3NvY2suaD4KKyNpbmNsdWRlIDxwai9hZGRyX3Jlc29sdi5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai91bmljb2RlLmg+CisKKyNpbmNsdWRlICJvc19zeW1iaWFuLmgiCisKKworLyoKKyAqIEFkZHJlc3MgZmFtaWxpZXMuCisgKi8KK2NvbnN0IHBqX3VpbnQxNl90IFBKX0FGX1VOU1BFQwk9IEtBRlVuc3BlYzsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0FGX1VOSVgJPSAweEZGRkY7Citjb25zdCBwal91aW50MTZfdCBQSl9BRl9JTkVUCT0gS0FmSW5ldDsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0FGX0lORVQ2CT0gS0FmSW5ldDY7Citjb25zdCBwal91aW50MTZfdCBQSl9BRl9QQUNLRVQJPSAweEZGRkY7Citjb25zdCBwal91aW50MTZfdCBQSl9BRl9JUkRBCT0gMHhGRkZGOworCisvKgorICogU29ja2V0IHR5cGVzIGNvbnZlcnNpb24uCisgKiBUaGUgdmFsdWVzIGhlcmUgYXJlIGluZGV4ZWQgYmFzZWQgb24gcGpfc29ja190eXBlCisgKi8KK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPQ0tfU1RSRUFNPSBLU29ja1N0cmVhbTsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPQ0tfREdSQU0JPSBLU29ja0RhdGFncmFtOworY29uc3QgcGpfdWludDE2X3QgUEpfU09DS19SQVcJPSAweEZGRkY7Citjb25zdCBwal91aW50MTZfdCBQSl9TT0NLX1JETQk9IDB4RkZGRjsKKworLyogd2UgZG9uJ3Qgc3VwcG9ydCBzZXRzb2Nrb3B0KCksIHRoZXNlIGFyZSBqdXN0IGR1bW15IHZhbHVlcyAqLworY29uc3QgcGpfdWludDE2X3QgUEpfU09MX1NPQ0tFVAk9IDB4RkZGRjsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9JUAk9IDB4RkZGRjsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPTF9UQ1AJPSAweEZGRkY7Citjb25zdCBwal91aW50MTZfdCBQSl9TT0xfVURQCT0gMHhGRkZGOworY29uc3QgcGpfdWludDE2X3QgUEpfU09MX0lQVjYJPSAweEZGRkY7Citjb25zdCBwal91aW50MTZfdCBQSl9TT19OT1NJR1BJUEUgPSAweEZGRkY7CisKKy8qIFRPUyAqLworY29uc3QgcGpfdWludDE2X3QgUEpfSVBfVE9TCQk9IDA7Citjb25zdCBwal91aW50MTZfdCBQSl9JUFRPU19MT1dERUxBWQk9IDA7Citjb25zdCBwal91aW50MTZfdCBQSl9JUFRPU19USFJPVUdIUFVUCT0gMDsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQVE9TX1JFTElBQklMSVRZCT0gMDsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQVE9TX01JTkNPU1QJPSAwOworCisvKiBNaXNjICovCitjb25zdCBwal91aW50MTZfdCBQSl9UQ1BfTk9ERUxBWSA9IDB4RkZGRjsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPX1JFVVNFQUREUiA9IDB4RkZGRjsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPX1BSSU9SSVRZID0gMHhGRkZGOworCisvKiBpb2N0bCgpIGlzIGFsc28gbm90IHN1cHBvcnRlZC4gKi8KK2NvbnN0IHBqX3VpbnQxNl90IFBKX1NPX1RZUEUgICAgPSAweEZGRkY7Citjb25zdCBwal91aW50MTZfdCBQSl9TT19SQ1ZCVUYgID0gMHhGRkZGOworY29uc3QgcGpfdWludDE2X3QgUEpfU09fU05EQlVGICA9IDB4RkZGRjsKKworLyogSVAgbXVsdGljYXN0IGlzIGFsc28gbm90IHN1cHBvcnRlZC4gKi8KK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQX01VTFRJQ0FTVF9JRiAgICA9IDB4RkZGRjsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQX01VTFRJQ0FTVF9UVEwgICA9IDB4RkZGRjsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQX01VTFRJQ0FTVF9MT09QICA9IDB4RkZGRjsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQX0FERF9NRU1CRVJTSElQICA9IDB4RkZGRjsKK2NvbnN0IHBqX3VpbnQxNl90IFBKX0lQX0RST1BfTUVNQkVSU0hJUCA9IDB4RkZGRjsKKworLyogRmxhZ3MgKi8KK2NvbnN0IGludCBQSl9NU0dfT09CCSAgICAgPSAwOworY29uc3QgaW50IFBKX01TR19QRUVLCSAgICAgPSBLU29ja1JlYWRQZWVrOworY29uc3QgaW50IFBKX01TR19ET05UUk9VVEUgICA9IDA7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gQ1BqU29ja2V0IGltcGxlbWVudGF0aW9uLgorLy8gKGRlY2xhcmF0aW9uIGlzIGluIG9zX3N5bWJpYW4uaCkKKy8vCisKK0NQalNvY2tldDo6fkNQalNvY2tldCgpCit7CisgICAgRGVzdHJveVJlYWRlcigpOworICAgIHNvY2tfLkNsb3NlKCk7Cit9CisKKworLy8gQ3JlYXRlIHNvY2tldCByZWFkZXIuCitDUGpTb2NrZXRSZWFkZXIgKkNQalNvY2tldDo6Q3JlYXRlUmVhZGVyKHVuc2lnbmVkIG1heF9sZW4pCit7CisgICAgcGpfYXNzZXJ0KHNvY2tSZWFkZXJfID09IE5VTEwpOworICAgIHJldHVybiBzb2NrUmVhZGVyXyA9IENQalNvY2tldFJlYWRlcjo6TmV3TCgqdGhpcywgbWF4X2xlbik7Cit9CisKKy8vIERlbGV0ZSBzb2NrZXQgcmVhZGVyIHdoZW4gaXQncyBub3Qgd2FudGVkLgordm9pZCBDUGpTb2NrZXQ6OkRlc3Ryb3lSZWFkZXIoKSAKK3sKKyAgICBpZiAoc29ja1JlYWRlcl8pIHsKKwlzb2NrUmVhZGVyXy0+Q2FuY2VsKCk7CisJZGVsZXRlIHNvY2tSZWFkZXJfOworCXNvY2tSZWFkZXJfID0gTlVMTDsKKyAgICB9Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBDUGpTb2NrZXRSZWFkZXIgaW1wbGVtZW50YXRpb24KKy8vIChkZWNsYXJhdGlvbiBpbiBvc19zeW1iaWFuLmgpCisvLworCisKK0NQalNvY2tldFJlYWRlcjo6Q1BqU29ja2V0UmVhZGVyKENQalNvY2tldCAmc29jaykKKzogQ0FjdGl2ZShFUHJpb3JpdHlTdGFuZGFyZCksIAorICBzb2NrXyhzb2NrKSwgYnVmZmVyXyhOVUxMLCAwKSwgcmVhZENiXyhOVUxMKSwga2V5XyhOVUxMKQoreworfQorCisKK3ZvaWQgQ1BqU29ja2V0UmVhZGVyOjpDb25zdHJ1Y3RMKHVuc2lnbmVkIG1heF9sZW4pCit7CisgICAgaXNEYXRhZ3JhbV8gPSBzb2NrXy5Jc0RhdGFncmFtKCk7CisKKyAgICBUVWludDggKnB0ciA9IG5ldyBUVWludDhbbWF4X2xlbl07CisgICAgYnVmZmVyXy5TZXQocHRyLCAwLCAoVEludCltYXhfbGVuKTsKKyAgICBDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7Cit9CisKK0NQalNvY2tldFJlYWRlciAqQ1BqU29ja2V0UmVhZGVyOjpOZXdMKENQalNvY2tldCAmc29jaywgdW5zaWduZWQgbWF4X2xlbikKK3sKKyAgICBDUGpTb2NrZXRSZWFkZXIgKnNlbGYgPSBuZXcgKEVMZWF2ZSkgQ1BqU29ja2V0UmVhZGVyKHNvY2spOworICAgIENsZWFudXBTdGFjazo6UHVzaEwoc2VsZik7CisgICAgc2VsZi0+Q29uc3RydWN0TChtYXhfbGVuKTsKKyAgICBDbGVhbnVwU3RhY2s6OlBvcChzZWxmKTsKKworICAgIHJldHVybiBzZWxmOworfQorCisKK0NQalNvY2tldFJlYWRlcjo6fkNQalNvY2tldFJlYWRlcigpCit7CisgICAgY29uc3QgVFVpbnQ4ICpkYXRhID0gYnVmZmVyXy5QdHIoKTsKKyAgICBkZWxldGUgW10gZGF0YTsKK30KKwordm9pZCBDUGpTb2NrZXRSZWFkZXI6OlN0YXJ0UmVjdih2b2lkICgqY2IpKHZvaWQgKmtleSksIAorCQkJICAgICAgICB2b2lkICprZXksIAorCQkJICAgICAgICBURGVzOCAqYURlc2MsCisJCQkgICAgICAgIFRVaW50IGZsYWdzKQoreworICAgIFN0YXJ0UmVjdkZyb20oY2IsIGtleSwgYURlc2MsIGZsYWdzLCBOVUxMKTsKK30KKwordm9pZCBDUGpTb2NrZXRSZWFkZXI6OlN0YXJ0UmVjdkZyb20odm9pZCAoKmNiKSh2b2lkICprZXkpLCAKKwkJCQkgICAgdm9pZCAqa2V5LCAKKwkJCQkgICAgVERlczggKmFEZXNjLAorCQkJCSAgICBUVWludCBmbGFncywKKwkJCQkgICAgVFNvY2tBZGRyICpmcm9tQWRkcikKK3sKKyAgICByZWFkQ2JfID0gY2I7CisgICAga2V5XyA9IGtleTsKKworICAgIGlmIChhRGVzYyA9PSBOVUxMKSBhRGVzYyA9ICZidWZmZXJfOworICAgIGlmIChmcm9tQWRkciA9PSBOVUxMKSBmcm9tQWRkciA9ICZyZWN2QWRkcl87CisKKyAgICBzb2NrXy5Tb2NrZXQoKS5SZWN2RnJvbSgqYURlc2MsICpmcm9tQWRkciwgZmxhZ3MsIGlTdGF0dXMpOworICAgIFNldEFjdGl2ZSgpOworfQorCit2b2lkIENQalNvY2tldFJlYWRlcjo6RG9DYW5jZWwoKQoreworICAgIHNvY2tfLlNvY2tldCgpLkNhbmNlbFJlY3YoKTsKK30KKwordm9pZCBDUGpTb2NrZXRSZWFkZXI6OlJ1bkwoKQoreworICAgIHZvaWQgKCpvbGRfY2IpKHZvaWQgKmtleSkgPSByZWFkQ2JfOworICAgIHZvaWQgKm9sZF9rZXkgPSBrZXlfOworCisgICAgcmVhZENiXyA9IE5VTEw7CisgICAga2V5XyA9IE5VTEw7CisKKyAgICBpZiAob2xkX2NiKSB7CisJKCpvbGRfY2IpKG9sZF9rZXkpOworICAgIH0KK30KKworLy8gQXBwZW5kIGRhdGEgdG8gYURlc2MsIHVwIHRvIGFEZXNjJ3MgbWF4aW11bSBzaXplLgorLy8gSWYgc29ja2V0IGlzIGRhdGFncmFtIGJhc2VkLCBidWZmZXJfIHdpbGwgYmUgY2xhcmVkLgordm9pZCBDUGpTb2NrZXRSZWFkZXI6OlJlYWREYXRhKFREZXM4ICZhRGVzYywgVEluZXRBZGRyICphZGRyKQoreworICAgIGlmIChpc0RhdGFncmFtXykKKwlhRGVzYy5aZXJvKCk7CisKKyAgICBpZiAoYnVmZmVyXy5MZW5ndGgoKSA9PSAwKQorCXJldHVybjsKKworICAgIFRJbnQgc2l6ZV90b19jb3B5ID0gYURlc2MuTWF4TGVuZ3RoKCkgLSBhRGVzYy5MZW5ndGgoKTsKKyAgICBpZiAoc2l6ZV90b19jb3B5ID4gYnVmZmVyXy5MZW5ndGgoKSkKKwlzaXplX3RvX2NvcHkgPSBidWZmZXJfLkxlbmd0aCgpOworCisgICAgYURlc2MuQXBwZW5kKGJ1ZmZlcl8uUHRyKCksIHNpemVfdG9fY29weSk7CisKKyAgICBpZiAoaXNEYXRhZ3JhbV8pCisJYnVmZmVyXy5aZXJvKCk7CisgICAgZWxzZQorCWJ1ZmZlcl8uRGVsZXRlKDAsIHNpemVfdG9fY29weSk7CisKKyAgICBpZiAoYWRkcikKKwkqYWRkciA9IHJlY3ZBZGRyXzsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gUEpMSUIncyBzb2NrLmggaW1wbGVtZW50YXRpb24KKy8vCisKKy8qCisgKiBDb252ZXJ0IDE2LWJpdCB2YWx1ZSBmcm9tIG5ldHdvcmsgYnl0ZSBvcmRlciB0byBob3N0IGJ5dGUgb3JkZXIuCisgKi8KK1BKX0RFRihwal91aW50MTZfdCkgcGpfbnRvaHMocGpfdWludDE2X3QgbmV0c2hvcnQpCit7CisjaWYgUEpfSVNfTElUVExFX0VORElBTgorICAgIHJldHVybiBwal9zd2FwMTYobmV0c2hvcnQpOworI2Vsc2UKKyAgICByZXR1cm4gbmV0c2hvcnQ7CisjZW5kaWYKK30KKworLyoKKyAqIENvbnZlcnQgMTYtYml0IHZhbHVlIGZyb20gaG9zdCBieXRlIG9yZGVyIHRvIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworUEpfREVGKHBqX3VpbnQxNl90KSBwal9odG9ucyhwal91aW50MTZfdCBob3N0c2hvcnQpCit7CisjaWYgUEpfSVNfTElUVExFX0VORElBTgorICAgIHJldHVybiBwal9zd2FwMTYoaG9zdHNob3J0KTsKKyNlbHNlCisgICAgcmV0dXJuIGhvc3RzaG9ydDsKKyNlbmRpZgorfQorCisvKgorICogQ29udmVydCAzMi1iaXQgdmFsdWUgZnJvbSBuZXR3b3JrIGJ5dGUgb3JkZXIgdG8gaG9zdCBieXRlIG9yZGVyLgorICovCitQSl9ERUYocGpfdWludDMyX3QpIHBqX250b2hsKHBqX3VpbnQzMl90IG5ldGxvbmcpCit7CisjaWYgUEpfSVNfTElUVExFX0VORElBTgorICAgIHJldHVybiBwal9zd2FwMzIobmV0bG9uZyk7CisjZWxzZQorICAgIHJldHVybiBuZXRsb25nOworI2VuZGlmCit9CisKKy8qCisgKiBDb252ZXJ0IDMyLWJpdCB2YWx1ZSBmcm9tIGhvc3QgYnl0ZSBvcmRlciB0byBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KK1BKX0RFRihwal91aW50MzJfdCkgcGpfaHRvbmwocGpfdWludDMyX3QgaG9zdGxvbmcpCit7CisjaWYgUEpfSVNfTElUVExFX0VORElBTgorICAgIHJldHVybiBwal9zd2FwMzIoaG9zdGxvbmcpOworI2Vsc2UKKyAgICByZXR1cm4gbmV0bG9uZzsKKyNlbmRpZgorfQorCisvKgorICogQ29udmVydCBhbiBJbnRlcm5ldCBob3N0IGFkZHJlc3MgZ2l2ZW4gaW4gbmV0d29yayBieXRlIG9yZGVyCisgKiB0byBzdHJpbmcgaW4gc3RhbmRhcmQgbnVtYmVycyBhbmQgZG90cyBub3RhdGlvbi4KKyAqLworUEpfREVGKGNoYXIqKSBwal9pbmV0X250b2EocGpfaW5fYWRkciBpbmFkZHIpCit7CisJc3RhdGljIGNoYXIgc3RyOFtQSl9JTkVUX0FERFJTVFJMRU5dOworICAgIFRCdWY8UEpfSU5FVF9BRERSU1RSTEVOPiBzdHIxNigwKTsKKworICAgIC8qIChTeW1iaWFuIElQIGFkZHJlc3MgaXMgaW4gaG9zdCBieXRlIG9yZGVyKSAqLworICAgIFRJbmV0QWRkciB0ZW1wX2FkZHIoKFRVaW50MzIpcGpfbnRvaGwoaW5hZGRyLnNfYWRkciksIChUVWludCkwKTsKKyAgICB0ZW1wX2FkZHIuT3V0cHV0KHN0cjE2KTsKKyAKKyAgICByZXR1cm4gcGpfdW5pY29kZV90b19hbnNpKChjb25zdCB3Y2hhcl90KilzdHIxNi5QdHJaKCksIHN0cjE2Lkxlbmd0aCgpLAorCQkJICAgICAgc3RyOCwgc2l6ZW9mKHN0cjgpKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIEludGVybmV0IGhvc3QgYWRkcmVzcyBjcCBmcm9tIHRoZSBzdGFuZGFyZAorICogbnVtYmVycy1hbmQtZG90cyBub3RhdGlvbiBpbnRvIGJpbmFyeSBkYXRhIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHN0cnVjdHVyZQorICogdGhhdCBpbnAgcG9pbnRzIHRvLiAKKyAqLworUEpfREVGKGludCkgcGpfaW5ldF9hdG9uKGNvbnN0IHBqX3N0cl90ICpjcCwgc3RydWN0IHBqX2luX2FkZHIgKmlucCkKK3sKKyAgICBlbnVtIHsgTUFYSVBMRU4gPSBQSl9JTkVUX0FERFJTVFJMRU4gfTsKKworICAgIC8qIEluaXRpYWxpemUgb3V0cHV0IHdpdGggUEpfSU5BRERSX05PTkUuCisgICAgICogU29tZSBhcHBzIHJlbGllcyBvbiB0aGlzIGluc3RlYWQgb2YgdGhlIHJldHVybiB2YWx1ZQorICAgICAqIChhbmQgYW55d2F5IHRoZSByZXR1cm4gdmFsdWUgaXMgcXVpdGUgY29uZnVzaW5nISkKKyAgICAgKi8KKyAgICBpbnAtPnNfYWRkciA9IFBKX0lOQUREUl9OT05FOworCisgICAgLyogQ2F1dGlvbjoKKyAgICAgKgl0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIGNwLT5zbGVuID49IDE2CisgICAgICogIChpLmUuIHdoZW4gY2FsbGVkIHdpdGggaG9zdG5hbWUgdG8gY2hlY2sgaWYgaXQncyBhbiBJUCBhZGRyKS4KKyAgICAgKi8KKyAgICBQSl9BU1NFUlRfUkVUVVJOKGNwICYmIGNwLT5zbGVuICYmIGlucCwgMCk7CisgICAgaWYgKGNwLT5zbGVuID49IDE2KSB7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgY2hhciB0ZW1wYWRkcjhbTUFYSVBMRU5dOworICAgIHBqX21lbWNweSh0ZW1wYWRkcjgsIGNwLT5wdHIsIGNwLT5zbGVuKTsKKyAgICB0ZW1wYWRkcjhbY3AtPnNsZW5dID0gJ1wwJzsKKworICAgIHdjaGFyX3QgdGVtcGFkZHIxNltNQVhJUExFTl07CisgICAgcGpfYW5zaV90b191bmljb2RlKHRlbXBhZGRyOCwgcGpfYW5zaV9zdHJsZW4odGVtcGFkZHI4KSwKKwkJICAgICAgIHRlbXBhZGRyMTYsIHNpemVvZih0ZW1wYWRkcjE2KSk7CisKKyAgICBUQnVmPE1BWElQTEVOPiBpcF9hZGRyKChjb25zdCBUVGV4dCopdGVtcGFkZHIxNik7CisKKyAgICBUSW5ldEFkZHIgYWRkcjsKKyAgICBhZGRyLkluaXQoS0FmSW5ldCk7CisgICAgaWYgKGFkZHIuSW5wdXQoaXBfYWRkcikgPT0gS0Vyck5vbmUpIHsKKwkvKiBTdWNjZXNzIChTeW1iaWFuIElQIGFkZHJlc3MgaXMgaW4gaG9zdCBieXRlIG9yZGVyKSAqLworCWlucC0+c19hZGRyID0gcGpfaHRvbmwoYWRkci5BZGRyZXNzKCkpOworCXJldHVybiAxOworICAgIH0gZWxzZSB7CisJLyogRXJyb3IgKi8KKwlyZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qCisgKiBDb252ZXJ0IHRleHQgdG8gSVB2NC9JUHY2IGFkZHJlc3MuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfaW5ldF9wdG9uKGludCBhZiwgY29uc3QgcGpfc3RyX3QgKnNyYywgdm9pZCAqZHN0KQoreworICAgIGNoYXIgdGVtcGFkZHJbUEpfSU5FVDZfQUREUlNUUkxFTl07CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGFmPT1QSl9BRl9JTkVUIHx8IGFmPT1QSl9BRl9JTkVUNiwgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNyYyAmJiBzcmMtPnNsZW4gJiYgZHN0LCBQSl9FSU5WQUwpOworCisgICAgLyogSW5pdGlhbGl6ZSBvdXRwdXQgd2l0aCBQSl9JTl9BRERSX05PTkUgZm9yIElQdjQgKHRvIGJlIAorICAgICAqIGNvbXBhdGlibGUgd2l0aCBwal9pbmV0X2F0b24oKQorICAgICAqLworICAgIGlmIChhZj09UEpfQUZfSU5FVCkgeworCSgocGpfaW5fYWRkciopZHN0KS0+c19hZGRyID0gUEpfSU5BRERSX05PTkU7CisgICAgfQorCisgICAgLyogQ2F1dGlvbjoKKyAgICAgKgl0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIGNwLT5zbGVuID49IDQ2CisgICAgICogIChpLmUuIHdoZW4gY2FsbGVkIHdpdGggaG9zdG5hbWUgdG8gY2hlY2sgaWYgaXQncyBhbiBJUCBhZGRyKS4KKyAgICAgKi8KKyAgICBpZiAoc3JjLT5zbGVuID49IFBKX0lORVQ2X0FERFJTVFJMRU4pIHsKKwlyZXR1cm4gUEpfRU5BTUVUT09MT05HOworICAgIH0KKworICAgIHBqX21lbWNweSh0ZW1wYWRkciwgc3JjLT5wdHIsIHNyYy0+c2xlbik7CisgICAgdGVtcGFkZHJbc3JjLT5zbGVuXSA9ICdcMCc7CisKKworICAgIHdjaGFyX3QgdGVtcGFkZHIxNltQSl9JTkVUNl9BRERSU1RSTEVOXTsKKyAgICBwal9hbnNpX3RvX3VuaWNvZGUodGVtcGFkZHIsIHBqX2Fuc2lfc3RybGVuKHRlbXBhZGRyKSwKKwkJICAgICAgIHRlbXBhZGRyMTYsIHNpemVvZih0ZW1wYWRkcjE2KSk7CisKKyAgICBUQnVmPFBKX0lORVQ2X0FERFJTVFJMRU4+IGlwX2FkZHIoKGNvbnN0IFRUZXh0Kil0ZW1wYWRkcjE2KTsKKworICAgIFRJbmV0QWRkciBhZGRyOworICAgIGFkZHIuSW5pdChLQWZJbmV0Nik7CisgICAgaWYgKGFkZHIuSW5wdXQoaXBfYWRkcikgPT0gS0Vyck5vbmUpIHsKKwlpZiAoYWY9PVBKX0FGX0lORVQpIHsKKwkgICAgLyogU3VjY2VzcyAoU3ltYmlhbiBJUCBhZGRyZXNzIGlzIGluIGhvc3QgYnl0ZSBvcmRlcikgKi8KKwkgICAgcGpfdWludDMyX3QgaXAgPSBwal9odG9ubChhZGRyLkFkZHJlc3MoKSk7CisJICAgIHBqX21lbWNweShkc3QsICZpcCwgNCk7CisJfSBlbHNlIGlmIChhZj09UEpfQUZfSU5FVDYpIHsKKwkgICAgY29uc3QgVElwNkFkZHIgJiBpcDYgPSBhZGRyLklwNkFkZHJlc3MoKTsKKwkgICAgcGpfbWVtY3B5KGRzdCwgaXA2LnUuaUFkZHI4LCAxNik7CisJfSBlbHNlIHsKKwkgICAgcGpfYXNzZXJ0KCEiVW5leHBlY3RlZCEiKTsKKwkgICAgcmV0dXJuIFBKX0VCVUc7CisJfQorCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0gZWxzZSB7CisJLyogRXJyb3IgKi8KKwlyZXR1cm4gUEpfRUlOVkFMOworICAgIH0KK30KKworLyoKKyAqIENvbnZlcnQgSVB2NC9JUHY2IGFkZHJlc3MgdG8gdGV4dC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9pbmV0X250b3AoaW50IGFmLCBjb25zdCB2b2lkICpzcmMsCisJCQkJIGNoYXIgKmRzdCwgaW50IHNpemUpCisKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNyYyAmJiBkc3QgJiYgc2l6ZSwgUEpfRUlOVkFMKTsKKworICAgICpkc3QgPSAnXDAnOworCisgICAgaWYgKGFmPT1QSl9BRl9JTkVUKSB7CisKKwlUQnVmPFBKX0lORVRfQUREUlNUUkxFTj4gc3RyMTY7CisJcGpfaW5fYWRkciBpbmFkZHI7CisKKwlpZiAoc2l6ZSA8IFBKX0lORVRfQUREUlNUUkxFTikKKwkgICAgcmV0dXJuIFBKX0VUT09TTUFMTDsKKworCXBqX21lbWNweSgmaW5hZGRyLCBzcmMsIDQpOworCisJLyogU3ltYmlhbiBJUCBhZGRyZXNzIGlzIGluIGhvc3QgYnl0ZSBvcmRlciAqLworCVRJbmV0QWRkciB0ZW1wX2FkZHIoKFRVaW50MzIpcGpfbnRvaGwoaW5hZGRyLnNfYWRkciksIChUVWludCkwKTsKKwl0ZW1wX2FkZHIuT3V0cHV0KHN0cjE2KTsKKyAKKwlwal91bmljb2RlX3RvX2Fuc2koKGNvbnN0IHdjaGFyX3QqKXN0cjE2LlB0clooKSwgc3RyMTYuTGVuZ3RoKCksCisJCQkgICBkc3QsIHNpemUpOworCXJldHVybiBQSl9TVUNDRVNTOworCisgICAgfSBlbHNlIGlmIChhZj09UEpfQUZfSU5FVDYpIHsKKwlUQnVmPFBKX0lORVQ2X0FERFJTVFJMRU4+IHN0cjE2OworCisJaWYgKHNpemUgPCBQSl9JTkVUNl9BRERSU1RSTEVOKQorCSAgICByZXR1cm4gUEpfRVRPT1NNQUxMOworCisJVElwNkFkZHIgaXA2OworCXBqX21lbWNweShpcDYudS5pQWRkcjgsIHNyYywgMTYpOworCisJVEluZXRBZGRyIHRlbXBfYWRkcihpcDYsIChUVWludCkwKTsKKwl0ZW1wX2FkZHIuT3V0cHV0KHN0cjE2KTsKKyAKKwlwal91bmljb2RlX3RvX2Fuc2koKGNvbnN0IHdjaGFyX3QqKXN0cjE2LlB0clooKSwgc3RyMTYuTGVuZ3RoKCksCisJCQkgICBkc3QsIHNpemUpOworCXJldHVybiBQSl9TVUNDRVNTOworCisgICAgfSBlbHNlIHsKKwlwal9hc3NlcnQoISJVbnN1cHBvcnQgYWRkcmVzcyBmYW1pbHkiKTsKKwlyZXR1cm4gUEpfRUlOVkFMOworICAgIH0KKworfQorCisvKgorICogR2V0IGhvc3RuYW1lLgorICovCitQSl9ERUYoY29uc3QgcGpfc3RyX3QqKSBwal9nZXRob3N0bmFtZSh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIGJ1ZltQSl9NQVhfSE9TVE5BTUVdOworICAgIHN0YXRpYyBwal9zdHJfdCBob3N0bmFtZTsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBpZiAoaG9zdG5hbWUucHRyID09IE5VTEwpIHsKKwlSSG9zdFJlc29sdmVyICZyZXN2ID0gUGpTeW1iaWFuT1M6Okluc3RhbmNlKCktPkdldFJlc29sdmVyKFBKX0FGX0lORVQpOworCVRSZXF1ZXN0U3RhdHVzIHJlcVN0YXR1czsKKwlUSG9zdE5hbWUgdG1wTmFtZTsKKworCS8vIFJldHVybiBlbXB0eSBob3N0bmFtZSBpZiBhY2Nlc3MgcG9pbnQgaXMgbWFya2VkIGFzIGRvd24gYnkgYXBwLgorCVBKX1NZTUJJQU5fQ0hFQ0tfQ09OTkVDVElPTjIoJmhvc3RuYW1lKTsKKworCXJlc3YuR2V0SG9zdE5hbWUodG1wTmFtZSwgcmVxU3RhdHVzKTsKKwlVc2VyOjpXYWl0Rm9yUmVxdWVzdChyZXFTdGF0dXMpOworCisJaG9zdG5hbWUucHRyID0gcGpfdW5pY29kZV90b19hbnNpKChjb25zdCB3Y2hhcl90Kil0bXBOYW1lLlB0cigpLCB0bXBOYW1lLkxlbmd0aCgpLAorCQkJCQkgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWhvc3RuYW1lLnNsZW4gPSB0bXBOYW1lLkxlbmd0aCgpOworICAgIH0KKyAgICByZXR1cm4gJmhvc3RuYW1lOworfQorCisvKgorICogQ3JlYXRlIG5ldyBzb2NrZXQvZW5kcG9pbnQgZm9yIGNvbW11bmljYXRpb24gYW5kIHJldHVybnMgYSBkZXNjcmlwdG9yLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfc29ja2V0KGludCBhZiwgCisJCQkJICAgaW50IHR5cGUsIAorCQkJCSAgIGludCBwcm90bywKKwkJCQkgICBwal9zb2NrX3QgKnBfc29jaykKK3sKKyAgICBUSW50IHJjOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIC8qIFNhbml0eSBjaGVja3MuICovCisgICAgUEpfQVNTRVJUX1JFVFVSTihwX3NvY2shPU5VTEwsIFBKX0VJTlZBTCk7CisKKyAgICAvLyBSZXR1cm4gZmFpbHVyZSBpZiBhY2Nlc3MgcG9pbnQgaXMgbWFya2VkIGFzIGRvd24gYnkgYXBwLgorICAgIFBKX1NZTUJJQU5fQ0hFQ0tfQ09OTkVDVElPTigpOworICAgIAorICAgIC8qIFNldCBwcm90byBpZiBub25lIGlzIHNwZWNpZmllZC4gKi8KKyAgICBpZiAocHJvdG8gPT0gMCkgeworCWlmICh0eXBlID09IHBqX1NPQ0tfU1RSRUFNKCkpCisJICAgIHByb3RvID0gS1Byb3RvY29sSW5ldFRjcDsKKwllbHNlIGlmICh0eXBlID09IHBqX1NPQ0tfREdSQU0oKSkKKwkgICAgcHJvdG8gPSBLUHJvdG9jb2xJbmV0VWRwOworICAgIH0KKworICAgIC8qIENyZWF0ZSBTeW1iaWFuIFJTb2NrZXQgKi8KKyAgICBSU29ja2V0IHJTb2NrOworICAgIGlmIChQalN5bWJpYW5PUzo6SW5zdGFuY2UoKS0+Q29ubmVjdGlvbigpKQorICAgIAlyYyA9IHJTb2NrLk9wZW4oUGpTeW1iaWFuT1M6Okluc3RhbmNlKCktPlNvY2tldFNlcnYoKSwgCisgICAgCQkJYWYsIHR5cGUsIHByb3RvLAorICAgIAkJCSpQalN5bWJpYW5PUzo6SW5zdGFuY2UoKS0+Q29ubmVjdGlvbigpKTsKKyAgICBlbHNlCisgICAgCXJjID0gclNvY2suT3BlbihQalN5bWJpYW5PUzo6SW5zdGFuY2UoKS0+U29ja2V0U2VydigpLCAKKyAgICAJCQlhZiwgdHlwZSwgcHJvdG8pOworICAgICAgICAKKyAgICBpZiAocmMgIT0gS0Vyck5vbmUpCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyYyk7CisKKworICAgIC8qIFdyYXAgU3ltYmlhbiBSU29ja2V0IGludG8gUEpMSUIncyBDUGpTb2NrZXQsIGFuZCByZXR1cm4gdG8gY2FsbGVyICovCisgICAgQ1BqU29ja2V0ICpwalNvY2sgPSBuZXcgQ1BqU29ja2V0KGFmLCB0eXBlLCByU29jayk7CisgICAgKnBfc29jayA9IChwal9zb2NrX3QpcGpTb2NrOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIEJpbmQgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfYmluZCggcGpfc29ja190IHNvY2ssIAorCQkJCSAgY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkciwKKwkJCQkgIGludCBsZW4pCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIFRJbnQgcmM7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihzb2NrICE9IDAsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihhZGRyICYmIGxlbj49KGludClzaXplb2YocGpfc29ja2FkZHJfaW4pLCBQSl9FSU5WQUwpOworCisgICAgLy8gQ29udmVydCBQSkxJQidzIHBqX3NvY2thZGRyIGludG8gU3ltYmlhbidzIFRJbmV0QWRkcgorICAgIFRJbmV0QWRkciBpbmV0QWRkcjsKKyAgICBzdGF0dXMgPSBQalN5bWJpYW5PUzo6cGoyQWRkcigqKHBqX3NvY2thZGRyKilhZGRyLCBsZW4sIGluZXRBZGRyKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgCXJldHVybiBzdGF0dXM7CisKKyAgICAvLyBHZXQgdGhlIFJTb2NrZXQgaW5zdGFuY2UKKyAgICBSU29ja2V0ICZyU29jayA9ICgoQ1BqU29ja2V0Kilzb2NrKS0+U29ja2V0KCk7CisKKyAgICAvLyBCaW5kCisgICAgcmMgPSByU29jay5CaW5kKGluZXRBZGRyKTsKKworICAgIHJldHVybiAocmM9PUtFcnJOb25lKSA/IFBKX1NVQ0NFU1MgOiBQSl9SRVRVUk5fT1NfRVJST1IocmMpOworfQorCisKKy8qCisgKiBCaW5kIHNvY2tldC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2JpbmRfaW4oIHBqX3NvY2tfdCBzb2NrLCAKKwkJCQkgICAgIHBqX3VpbnQzMl90IGFkZHIzMiwKKwkJCQkgICAgIHBqX3VpbnQxNl90IHBvcnQpCit7CisgICAgcGpfc29ja2FkZHJfaW4gYWRkcjsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBwal9iemVybygmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKyAgICBhZGRyLnNpbl9mYW1pbHkgPSBQSl9BRl9JTkVUOworICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gcGpfaHRvbmwoYWRkcjMyKTsKKyAgICBhZGRyLnNpbl9wb3J0ID0gcGpfaHRvbnMocG9ydCk7CisKKyAgICByZXR1cm4gcGpfc29ja19iaW5kKHNvY2ssICZhZGRyLCBzaXplb2YocGpfc29ja2FkZHJfaW4pKTsKK30KKworCisvKgorICogQ2xvc2Ugc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfY2xvc2UocGpfc29ja190IHNvY2spCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oc29jayAhPSAwLCBQSl9FSU5WQUwpOworCisgICAgQ1BqU29ja2V0ICpwalNvY2sgPSAoQ1BqU29ja2V0Kilzb2NrOworCisgICAgLy8gVGhpcyB3aWxsIGNsb3NlIHRoZSBzb2NrZXQuCisgICAgZGVsZXRlIHBqU29jazsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogR2V0IHJlbW90ZSdzIG5hbWUuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19nZXRwZWVybmFtZSggcGpfc29ja190IHNvY2ssCisJCQkJCSBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCQkgaW50ICpuYW1lbGVuKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgCisgICAgUEpfQVNTRVJUX1JFVFVSTihzb2NrICYmIGFkZHIgJiYgbmFtZWxlbiAmJiAKKwkJICAgICAqbmFtZWxlbj49KGludClzaXplb2YocGpfc29ja2FkZHJfaW4pLCBQSl9FSU5WQUwpOworCisgICAgQ1BqU29ja2V0ICpwalNvY2sgPSAoQ1BqU29ja2V0Kilzb2NrOworICAgIFJTb2NrZXQgJnJTb2NrID0gcGpTb2NrLT5Tb2NrZXQoKTsKKworICAgIC8vIFNvY2tldCBtdXN0IGJlIGNvbm5lY3RlZC4KKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBqU29jay0+SXNDb25uZWN0ZWQoKSwgUEpfRUlOVkFMSURPUCk7CisKKyAgICBUSW5ldEFkZHIgaW5ldEFkZHI7CisgICAgclNvY2suUmVtb3RlTmFtZShpbmV0QWRkcik7CisKKyAgICByZXR1cm4gUGpTeW1iaWFuT1M6OkFkZHIycGooaW5ldEFkZHIsICoocGpfc29ja2FkZHIqKWFkZHIsIG5hbWVsZW4pOworfQorCisvKgorICogR2V0IHNvY2tldCBuYW1lLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfZ2V0c29ja25hbWUoIHBqX3NvY2tfdCBzb2NrLAorCQkJCQkgcGpfc29ja2FkZHJfdCAqYWRkciwKKwkJCQkJIGludCAqbmFtZWxlbikKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIAorICAgIFBKX0FTU0VSVF9SRVRVUk4oc29jayAmJiBhZGRyICYmIG5hbWVsZW4gJiYgCisJCSAgICAgKm5hbWVsZW4+PShpbnQpc2l6ZW9mKHBqX3NvY2thZGRyX2luKSwgUEpfRUlOVkFMKTsKKworICAgIENQalNvY2tldCAqcGpTb2NrID0gKENQalNvY2tldCopc29jazsKKyAgICBSU29ja2V0ICZyU29jayA9IHBqU29jay0+U29ja2V0KCk7CisKKyAgICBUSW5ldEFkZHIgaW5ldEFkZHI7CisgICAgclNvY2suTG9jYWxOYW1lKGluZXRBZGRyKTsKKworICAgIHJldHVybiBQalN5bWJpYW5PUzo6QWRkcjJwaihpbmV0QWRkciwgKihwal9zb2NrYWRkciopYWRkciwgbmFtZWxlbik7Cit9CisKKy8qCisgKiBTZW5kIGRhdGEKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX3NlbmQocGpfc29ja190IHNvY2ssCisJCQkJIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCQkgcGpfc3NpemVfdCAqbGVuLAorCQkJCSB1bnNpZ25lZCBmbGFncykKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oc29jayAmJiBidWYgJiYgbGVuLCBQSl9FSU5WQUwpOworCisgICAgLy8gUmV0dXJuIGZhaWx1cmUgaWYgYWNjZXNzIHBvaW50IGlzIG1hcmtlZCBhcyBkb3duIGJ5IGFwcC4KKyAgICBQSl9TWU1CSUFOX0NIRUNLX0NPTk5FQ1RJT04oKTsKKyAgICAKKyAgICBDUGpTb2NrZXQgKnBqU29jayA9IChDUGpTb2NrZXQqKXNvY2s7CisgICAgUlNvY2tldCAmclNvY2sgPSBwalNvY2stPlNvY2tldCgpOworCisgICAgLy8gc2VuZCgpIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0byBjb25uZWN0ZWQgc29ja2V0CisgICAgUEpfQVNTRVJUX1JFVFVSTihwalNvY2stPklzQ29ubmVjdGVkKCksIFBKX0VJTlZBTElET1ApOworCisgICAgVFB0ckM4IGRhdGEoKGNvbnN0IFRVaW50OCopYnVmLCAoVEludCkqbGVuKTsKKyAgICBUUmVxdWVzdFN0YXR1cyByZXFTdGF0dXM7CisgICAgVFNvY2tYZnJMZW5ndGggc2VudExlbjsKKworICAgIHJTb2NrLlNlbmQoZGF0YSwgZmxhZ3MsIHJlcVN0YXR1cywgc2VudExlbik7CisgICAgVXNlcjo6V2FpdEZvclJlcXVlc3QocmVxU3RhdHVzKTsKKworICAgIGlmIChyZXFTdGF0dXMuSW50KCk9PUtFcnJOb25lKSB7CisJLy8qbGVuID0gKFRJbnQpIHNlbnRMZW4uTGVuZ3RoKCk7CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfSBlbHNlCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyZXFTdGF0dXMuSW50KCkpOworfQorCisKKy8qCisgKiBTZW5kIGRhdGEuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19zZW5kdG8ocGpfc29ja190IHNvY2ssCisJCQkJICAgY29uc3Qgdm9pZCAqYnVmLAorCQkJCSAgIHBqX3NzaXplX3QgKmxlbiwKKwkJCQkgICB1bnNpZ25lZCBmbGFncywKKwkJCQkgICBjb25zdCBwal9zb2NrYWRkcl90ICp0bywKKwkJCQkgICBpbnQgdG9sZW4pCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIFBKX0NIRUNLX1NUQUNLKCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzb2NrICYmIGJ1ZiAmJiBsZW4sIFBKX0VJTlZBTCk7CisKKyAgICAvLyBSZXR1cm4gZmFpbHVyZSBpZiBhY2Nlc3MgcG9pbnQgaXMgbWFya2VkIGFzIGRvd24gYnkgYXBwLgorICAgIFBKX1NZTUJJQU5fQ0hFQ0tfQ09OTkVDVElPTigpOworICAgIAorICAgIENQalNvY2tldCAqcGpTb2NrID0gKENQalNvY2tldCopc29jazsKKyAgICBSU29ja2V0ICZyU29jayA9IHBqU29jay0+U29ja2V0KCk7CisKKyAgICAvLyBPbmx5IHN1cHBvcnRzIEFGX0lORVQgZm9yIG5vdworICAgIFBKX0FTU0VSVF9SRVRVUk4odG9sZW4+PShpbnQpc2l6ZW9mKHBqX3NvY2thZGRyX2luKSwgUEpfRUlOVkFMKTsKKworICAgIFRJbmV0QWRkciBpbmV0QWRkcjsKKyAgICBzdGF0dXMgPSBQalN5bWJpYW5PUzo6cGoyQWRkcigqKHBqX3NvY2thZGRyKil0bywgdG9sZW4sIGluZXRBZGRyKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisgICAgCXJldHVybiBzdGF0dXM7CisKKyAgICBUUHRyQzggZGF0YSgoY29uc3QgVFVpbnQ4KilidWYsIChUSW50KSpsZW4pOworICAgIFRSZXF1ZXN0U3RhdHVzIHJlcVN0YXR1czsKKyAgICBUU29ja1hmckxlbmd0aCBzZW50TGVuOworCisgICAgclNvY2suU2VuZFRvKGRhdGEsIGluZXRBZGRyLCBmbGFncywgcmVxU3RhdHVzLCBzZW50TGVuKTsKKyAgICBVc2VyOjpXYWl0Rm9yUmVxdWVzdChyZXFTdGF0dXMpOworCisgICAgaWYgKHJlcVN0YXR1cy5JbnQoKT09S0Vyck5vbmUpIHsKKwkvL0ZvciBzb21lIHJlYXNvbiBUU29ja1hmckxlbmd0aCBpcyBub3QgcmV0dXJuaW5nIGNvcnJlY3RseSEKKwkvLypsZW4gPSAoVEludCkgc2VudExlbi5MZW5ndGgoKTsKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9IGVsc2UgCisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyZXFTdGF0dXMuSW50KCkpOworfQorCisvKgorICogUmVjZWl2ZSBkYXRhLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfcmVjdihwal9zb2NrX3Qgc29jaywKKwkJCQkgdm9pZCAqYnVmLAorCQkJCSBwal9zc2l6ZV90ICpsZW4sCisJCQkJIHVuc2lnbmVkIGZsYWdzKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNvY2sgJiYgYnVmICYmIGxlbiwgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKCpsZW4gPiAwLCBQSl9FSU5WQUwpOworCisgICAgLy8gUmV0dXJuIGZhaWx1cmUgaWYgYWNjZXNzIHBvaW50IGlzIG1hcmtlZCBhcyBkb3duIGJ5IGFwcC4KKyAgICBQSl9TWU1CSUFOX0NIRUNLX0NPTk5FQ1RJT04oKTsKKworICAgIENQalNvY2tldCAqcGpTb2NrID0gKENQalNvY2tldCopc29jazsKKworICAgIGlmIChwalNvY2stPlJlYWRlcigpKSB7CisJQ1BqU29ja2V0UmVhZGVyICpyZWFkZXIgPSBwalNvY2stPlJlYWRlcigpOworCisJd2hpbGUgKHJlYWRlci0+SXNBY3RpdmUoKSAmJiAhcmVhZGVyLT5IYXNEYXRhKCkpIHsKKwkgICAgVXNlcjo6V2FpdEZvckFueVJlcXVlc3QoKTsKKwl9CisKKwlpZiAocmVhZGVyLT5IYXNEYXRhKCkpIHsKKwkgICAgVFB0cjggZGF0YSgoVFVpbnQ4KilidWYsIChUSW50KSpsZW4pOworCSAgICBUSW5ldEFkZHIgaW5ldEFkZHI7CisKKwkgICAgcmVhZGVyLT5SZWFkRGF0YShkYXRhLCAmaW5ldEFkZHIpOworCisJICAgICpsZW4gPSBkYXRhLkxlbmd0aCgpOworCSAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKwl9CisgICAgfQorCisgICAgVFJlcXVlc3RTdGF0dXMgcmVxU3RhdHVzOworICAgIFRTb2NrWGZyTGVuZ3RoIHJlY3ZMZW47CisgICAgVFB0cjggZGF0YSgoVFVpbnQ4KilidWYsIChUSW50KSpsZW4sIChUSW50KSpsZW4pOworCisgICAgaWYgKHBqU29jay0+SXNEYXRhZ3JhbSgpKSB7CisJcGpTb2NrLT5Tb2NrZXQoKS5SZWN2KGRhdGEsIGZsYWdzLCByZXFTdGF0dXMpOworICAgIH0gZWxzZSB7CisJLy8gVXNpbmcgc3RhdGljIGxpa2UgdGhpcyBpcyBub3QgcHJldHR5LCBidXQgd2UgZG9uJ3QgbmVlZCB0byB1c2UKKwkvLyB0aGUgdmFsdWUgYW55d2F5LCBoZW5jZSBkb2luZyBpdCBsaWtlIHRoaXMgaXMgcHJvYmFibHkgbW9zdAorCS8vIG9wdGltYWwuCisJc3RhdGljIFRTb2NrWGZyTGVuZ3RoIGxlbjsKKwlwalNvY2stPlNvY2tldCgpLlJlY3ZPbmVPck1vcmUoZGF0YSwgZmxhZ3MsIHJlcVN0YXR1cywgbGVuKTsKKyAgICB9CisgICAgVXNlcjo6V2FpdEZvclJlcXVlc3QocmVxU3RhdHVzKTsKKworICAgIGlmIChyZXFTdGF0dXMgPT0gS0Vyck5vbmUpIHsKKwkvLypsZW4gPSAoVEludClyZWN2TGVuLkxlbmd0aCgpOworCSpsZW4gPSBkYXRhLkxlbmd0aCgpOworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0gZWxzZSB7CisJKmxlbiA9IC0xOworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocmVxU3RhdHVzLkludCgpKTsKKyAgICB9Cit9CisKKy8qCisgKiBSZWNlaXZlIGRhdGEuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19yZWN2ZnJvbShwal9zb2NrX3Qgc29jaywKKwkJCQkgICAgIHZvaWQgKmJ1ZiwKKwkJCQkgICAgIHBqX3NzaXplX3QgKmxlbiwKKwkJCQkgICAgIHVuc2lnbmVkIGZsYWdzLAorCQkJCSAgICAgcGpfc29ja2FkZHJfdCAqZnJvbSwKKwkJCQkgICAgIGludCAqZnJvbWxlbikKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihzb2NrICYmIGJ1ZiAmJiBsZW4gJiYgZnJvbSAmJiBmcm9tbGVuLCBQSl9FSU5WQUwpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oKmxlbiA+IDAsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTigqZnJvbWxlbiA+PSAoaW50KXNpemVvZihwal9zb2NrYWRkcl9pbiksIFBKX0VJTlZBTCk7CisKKyAgICAvLyBSZXR1cm4gZmFpbHVyZSBpZiBhY2Nlc3MgcG9pbnQgaXMgbWFya2VkIGFzIGRvd24gYnkgYXBwLgorICAgIFBKX1NZTUJJQU5fQ0hFQ0tfQ09OTkVDVElPTigpOworCisgICAgQ1BqU29ja2V0ICpwalNvY2sgPSAoQ1BqU29ja2V0Kilzb2NrOworICAgIFJTb2NrZXQgJnJTb2NrID0gcGpTb2NrLT5Tb2NrZXQoKTsKKworICAgIGlmIChwalNvY2stPlJlYWRlcigpKSB7CisJQ1BqU29ja2V0UmVhZGVyICpyZWFkZXIgPSBwalNvY2stPlJlYWRlcigpOworCisJd2hpbGUgKHJlYWRlci0+SXNBY3RpdmUoKSAmJiAhcmVhZGVyLT5IYXNEYXRhKCkpIHsKKwkgICAgVXNlcjo6V2FpdEZvckFueVJlcXVlc3QoKTsKKwl9CisKKwlpZiAocmVhZGVyLT5IYXNEYXRhKCkpIHsKKwkgICAgVFB0cjggZGF0YSgoVFVpbnQ4KilidWYsIChUSW50KSpsZW4pOworCSAgICBUSW5ldEFkZHIgaW5ldEFkZHI7CisKKwkgICAgcmVhZGVyLT5SZWFkRGF0YShkYXRhLCAmaW5ldEFkZHIpOworCisJICAgICpsZW4gPSBkYXRhLkxlbmd0aCgpOworCisJICAgIGlmIChmcm9tICYmIGZyb21sZW4pIHsKKwkJcmV0dXJuIFBqU3ltYmlhbk9TOjpBZGRyMnBqKGluZXRBZGRyLCAqKHBqX3NvY2thZGRyKilmcm9tLCAKKwkJCQkJICAgIGZyb21sZW4pOworCSAgICB9IGVsc2UgeworCSAgICAJcmV0dXJuIFBKX1NVQ0NFU1M7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgVEluZXRBZGRyIGluZXRBZGRyOworICAgIFRSZXF1ZXN0U3RhdHVzIHJlcVN0YXR1czsKKyAgICBUU29ja1hmckxlbmd0aCByZWN2TGVuOworICAgIFRQdHI4IGRhdGEoKFRVaW50OCopYnVmLCAoVEludCkqbGVuLCAoVEludCkqbGVuKTsKKworICAgIHJTb2NrLlJlY3ZGcm9tKGRhdGEsIGluZXRBZGRyLCBmbGFncywgcmVxU3RhdHVzLCByZWN2TGVuKTsKKyAgICBVc2VyOjpXYWl0Rm9yUmVxdWVzdChyZXFTdGF0dXMpOworCisgICAgaWYgKHJlcVN0YXR1cyA9PSBLRXJyTm9uZSkgeworCS8vKmxlbiA9IChUSW50KXJlY3ZMZW4uTGVuZ3RoKCk7CisJKmxlbiA9IGRhdGEuTGVuZ3RoKCk7CisJcmV0dXJuIFBqU3ltYmlhbk9TOjpBZGRyMnBqKGluZXRBZGRyLCAqKHBqX3NvY2thZGRyKilmcm9tLCBmcm9tbGVuKTsKKyAgICB9IGVsc2UgeworCSpsZW4gPSAtMTsKKwkqZnJvbWxlbiA9IC0xOworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocmVxU3RhdHVzLkludCgpKTsKKyAgICB9Cit9CisKKy8qCisgKiBHZXQgc29ja2V0IG9wdGlvbi4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2dldHNvY2tvcHQoIHBqX3NvY2tfdCBzb2NrLAorCQkJCQlwal91aW50MTZfdCBsZXZlbCwKKwkJCQkJcGpfdWludDE2X3Qgb3B0bmFtZSwKKwkJCQkJdm9pZCAqb3B0dmFsLAorCQkJCQlpbnQgKm9wdGxlbikKK3sKKyAgICAvLyBOb3Qgc3VwcG9ydGVkIGZvciBub3cuCisgICAgUEpfVU5VU0VEX0FSRyhzb2NrKTsKKyAgICBQSl9VTlVTRURfQVJHKGxldmVsKTsKKyAgICBQSl9VTlVTRURfQVJHKG9wdG5hbWUpOworICAgIFBKX1VOVVNFRF9BUkcob3B0dmFsKTsKKyAgICBQSl9VTlVTRURfQVJHKG9wdGxlbik7CisgICAgcmV0dXJuIFBKX0VJTlZBTElET1A7Cit9CisKKy8qCisgKiBTZXQgc29ja2V0IG9wdGlvbi4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX3NldHNvY2tvcHQoIHBqX3NvY2tfdCBzb2NrLAorCQkJCQlwal91aW50MTZfdCBsZXZlbCwKKwkJCQkJcGpfdWludDE2X3Qgb3B0bmFtZSwKKwkJCQkJY29uc3Qgdm9pZCAqb3B0dmFsLAorCQkJCQlpbnQgb3B0bGVuKQoreworICAgIC8vIE5vdCBzdXBwb3J0ZWQgZm9yIG5vdy4KKyAgICBQSl9VTlVTRURfQVJHKHNvY2spOworICAgIFBKX1VOVVNFRF9BUkcobGV2ZWwpOworICAgIFBKX1VOVVNFRF9BUkcob3B0bmFtZSk7CisgICAgUEpfVU5VU0VEX0FSRyhvcHR2YWwpOworICAgIFBKX1VOVVNFRF9BUkcob3B0bGVuKTsKKyAgICByZXR1cm4gUEpfRUlOVkFMSURPUDsKK30KKworLyoKKyAqIENvbm5lY3Qgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NvY2tfY29ubmVjdCggcGpfc29ja190IHNvY2ssCisJCQkJICAgICBjb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCSAgICAgaW50IG5hbWVsZW4pCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNvY2sgJiYgYWRkciAmJiBuYW1lbGVuLCBQSl9FSU5WQUwpOworICAgIFBKX0FTU0VSVF9SRVRVUk4oKChwal9zb2NrYWRkciopYWRkciktPmFkZHIuc2FfZmFtaWx5ID09IFBKX0FGX0lORVQsIAorCQkgICAgIFBKX0VJTlZBTCk7CisKKyAgICAvLyBSZXR1cm4gZmFpbHVyZSBpZiBhY2Nlc3MgcG9pbnQgaXMgbWFya2VkIGFzIGRvd24gYnkgYXBwLgorICAgIFBKX1NZTUJJQU5fQ0hFQ0tfQ09OTkVDVElPTigpOworICAgIAorICAgIENQalNvY2tldCAqcGpTb2NrID0gKENQalNvY2tldCopc29jazsKKyAgICBSU29ja2V0ICZyU29jayA9IHBqU29jay0+U29ja2V0KCk7CisKKyAgICBUSW5ldEFkZHIgaW5ldEFkZHI7CisgICAgVFJlcXVlc3RTdGF0dXMgcmVxU3RhdHVzOworCisgICAgc3RhdHVzID0gUGpTeW1iaWFuT1M6OnBqMkFkZHIoKihwal9zb2NrYWRkciopYWRkciwgbmFtZWxlbiwgaW5ldEFkZHIpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAJcmV0dXJuIHN0YXR1czsKKworICAgIHJTb2NrLkNvbm5lY3QoaW5ldEFkZHIsIHJlcVN0YXR1cyk7CisgICAgVXNlcjo6V2FpdEZvclJlcXVlc3QocmVxU3RhdHVzKTsKKworICAgIGlmIChyZXFTdGF0dXMgPT0gS0Vyck5vbmUpIHsKKwlwalNvY2stPlNldENvbm5lY3RlZCh0cnVlKTsKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9IGVsc2UgeworCXJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IocmVxU3RhdHVzLkludCgpKTsKKyAgICB9Cit9CisKKworLyoKKyAqIFNodXRkb3duIHNvY2tldC4KKyAqLworI2lmIFBKX0hBU19UQ1AKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19zaHV0ZG93biggcGpfc29ja190IHNvY2ssCisJCQkJICAgICAgaW50IGhvdykKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihzb2NrLCBQSl9FSU5WQUwpOworCisgICAgQ1BqU29ja2V0ICpwalNvY2sgPSAoQ1BqU29ja2V0Kilzb2NrOworICAgIFJTb2NrZXQgJnJTb2NrID0gcGpTb2NrLT5Tb2NrZXQoKTsKKworICAgIFJTb2NrZXQ6OlRTaHV0ZG93biBhSG93OworICAgIGlmIChob3cgPT0gUEpfU0RfUkVDRUlWRSkKKwlhSG93ID0gUlNvY2tldDo6RVN0b3BJbnB1dDsKKyAgICBlbHNlIGlmIChob3cgPT0gUEpfU0hVVF9XUikKKwlhSG93ID0gUlNvY2tldDo6RVN0b3BPdXRwdXQ7CisgICAgZWxzZQorCWFIb3cgPSBSU29ja2V0OjpFTm9ybWFsOworCisgICAgVFJlcXVlc3RTdGF0dXMgcmVxU3RhdHVzOworCisgICAgclNvY2suU2h1dGRvd24oYUhvdywgcmVxU3RhdHVzKTsKKyAgICBVc2VyOjpXYWl0Rm9yUmVxdWVzdChyZXFTdGF0dXMpOworCisgICAgaWYgKHJlcVN0YXR1cyA9PSBLRXJyTm9uZSkgeworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0gZWxzZSB7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyZXFTdGF0dXMuSW50KCkpOworICAgIH0KK30KKworLyoKKyAqIFN0YXJ0IGxpc3RlbmluZyB0byBpbmNvbWluZyBjb25uZWN0aW9ucy4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zb2NrX2xpc3RlbiggcGpfc29ja190IHNvY2ssCisJCQkJICAgIGludCBiYWNrbG9nKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNvY2sgJiYgYmFja2xvZywgUEpfRUlOVkFMKTsKKworICAgIENQalNvY2tldCAqcGpTb2NrID0gKENQalNvY2tldCopc29jazsKKyAgICBSU29ja2V0ICZyU29jayA9IHBqU29jay0+U29ja2V0KCk7CisKKyAgICBUSW50IHJjID0gclNvY2suTGlzdGVuKChUVWludCliYWNrbG9nKTsKKworICAgIGlmIChyYyA9PSBLRXJyTm9uZSkgeworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0gZWxzZSB7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyYyk7CisgICAgfQorfQorCisvKgorICogQWNjZXB0IGluY29taW5nIGNvbm5lY3Rpb25zCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc29ja19hY2NlcHQoIHBqX3NvY2tfdCBzZXJ2ZXJmZCwKKwkJCQkgICAgcGpfc29ja190ICpuZXdzb2NrLAorCQkJCSAgICBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCSAgICBpbnQgKmFkZHJsZW4pCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oc2VydmVyZmQgJiYgbmV3c29jaywgUEpfRUlOVkFMKTsKKworICAgIENQalNvY2tldCAqcGpTb2NrID0gKENQalNvY2tldCopc2VydmVyZmQ7CisgICAgUlNvY2tldCAmclNvY2sgPSBwalNvY2stPlNvY2tldCgpOworCisgICAgLy8gQ3JlYXRlIGEgJ2JsYW5rJyBzb2NrZXQKKyAgICBSU29ja2V0IG5ld1NvY2s7CisgICAgbmV3U29jay5PcGVuKFBqU3ltYmlhbk9TOjpJbnN0YW5jZSgpLT5Tb2NrZXRTZXJ2KCkpOworCisgICAgLy8gQ2FsbCBBY2NlcHQoKQorICAgIFRSZXF1ZXN0U3RhdHVzIHJlcVN0YXR1czsKKworICAgIHJTb2NrLkFjY2VwdChuZXdTb2NrLCByZXFTdGF0dXMpOworICAgIFVzZXI6OldhaXRGb3JSZXF1ZXN0KHJlcVN0YXR1cyk7CisKKyAgICBpZiAocmVxU3RhdHVzICE9IEtFcnJOb25lKSB7CisJcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyZXFTdGF0dXMuSW50KCkpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBQSiBzb2NrZXQKKyAgICBDUGpTb2NrZXQgKm5ld1BqU29jayA9IG5ldyBDUGpTb2NrZXQocGpTb2NrLT5HZXRBZigpLCBwalNvY2stPkdldFNvY2tUeXBlKCksCisJCQkJCSBuZXdTb2NrKTsKKyAgICBuZXdQalNvY2stPlNldENvbm5lY3RlZCh0cnVlKTsKKworICAgICpuZXdzb2NrID0gKHBqX3NvY2tfdCkgbmV3UGpTb2NrOworCisgICAgaWYgKGFkZHIgJiYgYWRkcmxlbikgeworCXJldHVybiBwal9zb2NrX2dldHBlZXJuYW1lKCpuZXdzb2NrLCBhZGRyLCBhZGRybGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKyNlbmRpZgkvKiBQSl9IQVNfVENQICovCisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zc2xfc29ja19jb21tb24uYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc3NsX3NvY2tfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4YTY0MAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc3NsX3NvY2tfY29tbW9uLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qICRJZDogc3NsX3NvY2tfY29tbW9uLmMgMzk5OSAyMDEyLTAzLTMwIDA3OjEwOjEzWiBiZW5ueWxwICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3NzbF9zb2NrLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFNTTCBzb2NrZXQgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcy4KKyAqLworUEpfREVGKHZvaWQpIHBqX3NzbF9zb2NrX3BhcmFtX2RlZmF1bHQocGpfc3NsX3NvY2tfcGFyYW0gKnBhcmFtKQoreworICAgIHBqX2J6ZXJvKHBhcmFtLCBzaXplb2YoKnBhcmFtKSk7CisKKyAgICAvKiBTb2NrZXQgY29uZmlnICovCisgICAgcGFyYW0tPnNvY2tfYWYgPSBQSl9BRl9JTkVUOworICAgIHBhcmFtLT5zb2NrX3R5cGUgPSBwal9TT0NLX1NUUkVBTSgpOworICAgIHBhcmFtLT5hc3luY19jbnQgPSAxOworICAgIHBhcmFtLT5jb25jdXJyZW5jeSA9IC0xOworICAgIHBhcmFtLT53aG9sZV9kYXRhID0gUEpfVFJVRTsKKyAgICBwYXJhbS0+c2VuZF9idWZmZXJfc2l6ZSA9IDgxOTI7CisjaWYgIWRlZmluZWQoUEpfU1lNQklBTikgfHwgUEpfU1lNQklBTj09MAorICAgIHBhcmFtLT5yZWFkX2J1ZmZlcl9zaXplID0gMTUwMDsKKyNlbmRpZgorICAgIHBhcmFtLT5xb3NfdHlwZSA9IFBKX1FPU19UWVBFX0JFU1RfRUZGT1JUOworICAgIHBhcmFtLT5xb3NfaWdub3JlX2Vycm9yID0gUEpfVFJVRTsKKworICAgIC8qIFNlY3VyaXR5IGNvbmZpZyAqLworICAgIHBhcmFtLT5wcm90byA9IFBKX1NTTF9TT0NLX1BST1RPX0RFRkFVTFQ7Cit9CisKKworUEpfREVGKHBqX3N0YXR1c190KSBwal9zc2xfY2VydF9nZXRfdmVyaWZ5X3N0YXR1c19zdHJpbmdzKAorCQkJCQkJcGpfdWludDMyX3QgdmVyaWZ5X3N0YXR1cywgCisJCQkJCQljb25zdCBjaGFyICplcnJvcl9zdHJpbmdzW10sCisJCQkJCQl1bnNpZ25lZCAqY291bnQpCit7CisgICAgdW5zaWduZWQgaSA9IDAsIHNoaWZ0X2lkeCA9IDA7CisgICAgdW5zaWduZWQgdW5rbm93biA9IDA7CisgICAgcGpfdWludDMyX3QgZXJyczsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oZXJyb3Jfc3RyaW5ncyAmJiBjb3VudCwgUEpfRUlOVkFMKTsKKworICAgIGlmICh2ZXJpZnlfc3RhdHVzID09IFBKX1NTTF9DRVJUX0VTVUNDRVNTICYmICpjb3VudCkgeworCWVycm9yX3N0cmluZ3NbMF0gPSAiT0siOworCSpjb3VudCA9IDE7CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisgICAgZXJycyA9IHZlcmlmeV9zdGF0dXM7CisKKyAgICB3aGlsZSAoZXJycyAmJiBpIDwgKmNvdW50KSB7CisJcGpfdWludDMyX3QgZXJyOworCWNvbnN0IGNoYXIgKnAgPSBOVUxMOworCisJaWYgKChlcnJzICYgMSkgPT0gMCkgeworCSAgICBzaGlmdF9pZHgrKzsKKwkgICAgZXJycyA+Pj0gMTsKKwkgICAgY29udGludWU7CisJfQorCisJZXJyID0gKDEgPDwgc2hpZnRfaWR4KTsKKworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSBQSl9TU0xfQ0VSVF9FSVNTVUVSX05PVF9GT1VORDoKKwkgICAgcCA9ICJUaGUgaXNzdWVyIGNlcnRpZmljYXRlIGNhbm5vdCBiZSBmb3VuZCI7CisJICAgIGJyZWFrOworCWNhc2UgUEpfU1NMX0NFUlRfRVVOVFJVU1RFRDoKKwkgICAgcCA9ICJUaGUgY2VydGlmaWNhdGUgaXMgdW50cnVzdGVkIjsKKwkgICAgYnJlYWs7CisJY2FzZSBQSl9TU0xfQ0VSVF9FVkFMSURJVFlfUEVSSU9EOgorCSAgICBwID0gIlRoZSBjZXJ0aWZpY2F0ZSBoYXMgZXhwaXJlZCBvciBub3QgeWV0IHZhbGlkIjsKKwkgICAgYnJlYWs7CisJY2FzZSBQSl9TU0xfQ0VSVF9FSU5WQUxJRF9GT1JNQVQ6CisJICAgIHAgPSAiT25lIG9yIG1vcmUgZmllbGRzIG9mIHRoZSBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmUgZGVjb2RlZCAiCisJCSJkdWUgdG8gaW52YWxpZCBmb3JtYXQiOworCSAgICBicmVhazsKKwljYXNlIFBKX1NTTF9DRVJUX0VJU1NVRVJfTUlTTUFUQ0g6CisJICAgIHAgPSAiVGhlIGlzc3VlciBpbmZvIGluIHRoZSBjZXJ0aWZpY2F0ZSBkb2VzIG5vdCBtYXRjaCB0byB0aGUgIgorCQkiKGNhbmRpZGF0ZSkgaXNzdWVyIGNlcnRpZmljYXRlIjsKKwkgICAgYnJlYWs7CisJY2FzZSBQSl9TU0xfQ0VSVF9FQ1JMX0ZBSUxVUkU6CisJICAgIHAgPSAiVGhlIENSTCBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmUgZm91bmQgb3IgY2Fubm90IGJlIHJlYWQgIgorCQkicHJvcGVybHkiOworCSAgICBicmVhazsKKwljYXNlIFBKX1NTTF9DRVJUX0VSRVZPS0VEOgorCSAgICBwID0gIlRoZSBjZXJ0aWZpY2F0ZSBoYXMgYmVlbiByZXZva2VkIjsKKwkgICAgYnJlYWs7CisJY2FzZSBQSl9TU0xfQ0VSVF9FSU5WQUxJRF9QVVJQT1NFOgorCSAgICBwID0gIlRoZSBjZXJ0aWZpY2F0ZSBvciBDQSBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmUgdXNlZCBmb3IgdGhlICIKKwkJInNwZWNpZmllZCBwdXJwb3NlIjsKKwkgICAgYnJlYWs7CisJY2FzZSBQSl9TU0xfQ0VSVF9FQ0hBSU5fVE9PX0xPTkc6CisJICAgIHAgPSAiVGhlIGNlcnRpZmljYXRlIGNoYWluIGxlbmd0aCBpcyB0b28gbG9uZyI7CisJICAgIGJyZWFrOworCWNhc2UgUEpfU1NMX0NFUlRfRUlERU5USVRZX05PVF9NQVRDSDoKKwkgICAgcCA9ICJUaGUgc2VydmVyIGlkZW50aXR5IGRvZXMgbm90IG1hdGNoIHRvIGFueSBpZGVudGl0aWVzICIKKwkJInNwZWNpZmllZCBpbiB0aGUgY2VydGlmaWNhdGUiOworCSAgICBicmVhazsKKwljYXNlIFBKX1NTTF9DRVJUX0VVTktOT1dOOgorCWRlZmF1bHQ6CisJICAgIHVua25vd24rKzsKKwkgICAgYnJlYWs7CisJfQorCQorCS8qIFNldCBlcnJvciBzdHJpbmcgKi8KKwlpZiAocCkKKwkgICAgZXJyb3Jfc3RyaW5nc1tpKytdID0gcDsKKworCS8qIE5leHQgKi8KKwlzaGlmdF9pZHgrKzsKKwllcnJzID4+PSAxOworICAgIH0KKworICAgIC8qIFVua25vd24gZXJyb3IgKi8KKyAgICBpZiAodW5rbm93biAmJiBpIDwgKmNvdW50KQorCWVycm9yX3N0cmluZ3NbaSsrXSA9ICJVbmtub3duIHZlcmlmaWNhdGlvbiBlcnJvciI7CisKKyAgICAqY291bnQgPSBpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NzbF9zb2NrX2R1bXAuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc3NsX3NvY2tfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODk5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NzbF9zb2NrX2R1bXAuYwpAQCAtMCwwICsxLDE0OCBAQAorLyogJElkOiBzc2xfc29ja19kdW1wLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovc3NsX3NvY2suaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisKKworLyogT25seSBidWlsZCB3aGVuIFBKX0hBU19TU0xfU09DSyBpcyBlbmFibGVkICovCisjaWYgZGVmaW5lZChQSl9IQVNfU1NMX1NPQ0spICYmIFBKX0hBU19TU0xfU09DSyE9MAorCisjZGVmaW5lIFRISVNfRklMRQkic3NsX3NvY2tfZHVtcC5jIgorCisjZGVmaW5lIENIRUNLX0JVRl9MRU4oKQkJCQkJCVwKKyAgICBpZiAoKGxlbiA8IDApIHx8IChsZW4gPj0gZW5kLXApKSB7CQkJCVwKKwkqcCA9ICdcMCc7CQkJCQkJXAorCXJldHVybiAtMTsJCQkJCQlcCisgICAgfQkJCQkJCQkJXAorICAgIHAgKz0gbGVuOworCitQSl9ERUYocGpfc3NpemVfdCkgcGpfc3NsX2NlcnRfaW5mb19kdW1wKGNvbnN0IHBqX3NzbF9jZXJ0X2luZm8gKmNpLAorCQkJCQkgY29uc3QgY2hhciAqaW5kZW50LAorCQkJCQkgY2hhciAqYnVmLAorCQkJCQkgcGpfc2l6ZV90IGJ1Zl9zaXplKQoreworICAgIGNvbnN0IGNoYXIgKndkYXlzW10gPSB7IlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCJ9OworICAgIHBqX3BhcnNlZF90aW1lIHB0MTsKKyAgICBwal9wYXJzZWRfdGltZSBwdDI7CisgICAgdW5zaWduZWQgaTsKKyAgICBpbnQgbGVuID0gMDsKKyAgICBjaGFyICpwLCAqZW5kOworCisgICAgcCA9IGJ1ZjsKKyAgICBlbmQgPSBidWYgKyBidWZfc2l6ZTsKKworICAgIHBqX3RpbWVfZGVjb2RlKCZjaS0+dmFsaWRpdHkuc3RhcnQsICZwdDEpOworICAgIHBqX3RpbWVfZGVjb2RlKCZjaS0+dmFsaWRpdHkuZW5kLCAmcHQyKTsKKworICAgIC8qIFZlcnNpb24gKi8KKyAgICBsZW4gPSBwal9hbnNpX3NucHJpbnRmKHAsIGVuZC1wLCAiJXNWZXJzaW9uICAgIDogdiVkXG4iLCAKKwkJCSAgIGluZGVudCwgY2ktPnZlcnNpb24pOworICAgIENIRUNLX0JVRl9MRU4oKTsKKyAgICAKKyAgICAvKiBTZXJpYWwgbnVtYmVyICovCisgICAgbGVuID0gcGpfYW5zaV9zbnByaW50ZihwLCBlbmQtcCwgIiVzU2VyaWFsICAgICA6ICIsIGluZGVudCk7CisgICAgQ0hFQ0tfQlVGX0xFTigpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihjaS0+c2VyaWFsX25vKSAmJiAhY2ktPnNlcmlhbF9ub1tpXTsgKytpKTsKKyAgICBmb3IgKDsgaSA8IHNpemVvZihjaS0+c2VyaWFsX25vKTsgKytpKSB7CisJbGVuID0gcGpfYW5zaV9zbnByaW50ZihwLCBlbmQtcCwgIiUwMlggIiwgY2ktPnNlcmlhbF9ub1tpXSk7CisJQ0hFQ0tfQlVGX0xFTigpOworICAgIH0KKyAgICAqKHAtMSkgPSAnXG4nOworICAgIAorICAgIC8qIFN1YmplY3QgKi8KKyAgICBsZW4gPSBwal9hbnNpX3NucHJpbnRmKCBwLCBlbmQtcCwgIiVzU3ViamVjdCAgICA6ICUuKnNcbiIsIGluZGVudCwKKwkJCSAgICAoaW50KWNpLT5zdWJqZWN0LmNuLnNsZW4sCisJCQkgICAgY2ktPnN1YmplY3QuY24ucHRyKTsKKyAgICBDSEVDS19CVUZfTEVOKCk7CisgICAgbGVuID0gcGpfYW5zaV9zbnByaW50ZiggcCwgZW5kLXAsICIlcyAgICAgICAgICAgICAlLipzXG4iLCBpbmRlbnQsCisJCQkgICAgKGludCljaS0+c3ViamVjdC5pbmZvLnNsZW4sCisJCQkgICAgY2ktPnN1YmplY3QuaW5mby5wdHIpOworICAgIENIRUNLX0JVRl9MRU4oKTsKKworICAgIC8qIElzc3VlciAqLworICAgIGxlbiA9IHBqX2Fuc2lfc25wcmludGYoIHAsIGVuZC1wLCAiJXNJc3N1ZXIgICAgIDogJS4qc1xuIiwgaW5kZW50LAorCQkJICAgIChpbnQpY2ktPmlzc3Vlci5jbi5zbGVuLAorCQkJICAgIGNpLT5pc3N1ZXIuY24ucHRyKTsKKyAgICBDSEVDS19CVUZfTEVOKCk7CisgICAgbGVuID0gcGpfYW5zaV9zbnByaW50ZiggcCwgZW5kLXAsICIlcyAgICAgICAgICAgICAlLipzXG4iLCBpbmRlbnQsCisJCQkgICAgKGludCljaS0+aXNzdWVyLmluZm8uc2xlbiwKKwkJCSAgICBjaS0+aXNzdWVyLmluZm8ucHRyKTsKKyAgICBDSEVDS19CVUZfTEVOKCk7CisKKyAgICAvKiBWYWxpZGl0eSBwZXJpb2QgKi8KKyAgICBsZW4gPSBwal9hbnNpX3NucHJpbnRmKCBwLCBlbmQtcCwgIiVzVmFsaWQgZnJvbSA6ICVzICU0ZC0lMDJkLSUwMmQgIgorCQkJICAgICIlMDJkOiUwMmQ6JTAyZC4lMDNkICVzXG4iLCBpbmRlbnQsCisJCQkgICAgd2RheXNbcHQxLndkYXldLCBwdDEueWVhciwgcHQxLm1vbisxLCBwdDEuZGF5LAorCQkJICAgIHB0MS5ob3VyLCBwdDEubWluLCBwdDEuc2VjLCBwdDEubXNlYywKKwkJCSAgICAoY2ktPnZhbGlkaXR5LmdtdD8gIkdNVCI6IiIpKTsKKyAgICBDSEVDS19CVUZfTEVOKCk7CisKKyAgICBsZW4gPSBwal9hbnNpX3NucHJpbnRmKCBwLCBlbmQtcCwgIiVzVmFsaWQgdG8gICA6ICVzICU0ZC0lMDJkLSUwMmQgIgorCQkJICAgICIlMDJkOiUwMmQ6JTAyZC4lMDNkICVzXG4iLCBpbmRlbnQsCisJCQkgICAgd2RheXNbcHQyLndkYXldLCBwdDIueWVhciwgcHQyLm1vbisxLCBwdDIuZGF5LAorCQkJICAgIHB0Mi5ob3VyLCBwdDIubWluLCBwdDIuc2VjLCBwdDIubXNlYywKKwkJCSAgICAoY2ktPnZhbGlkaXR5LmdtdD8gIkdNVCI6IiIpKTsKKyAgICBDSEVDS19CVUZfTEVOKCk7CisKKyAgICAvKiBTdWJqZWN0IGFsdGVybmF0aXZlIG5hbWUgZXh0ZW5zaW9uICovCisgICAgaWYgKGNpLT5zdWJqX2FsdF9uYW1lLmNudCkgeworCXVuc2lnbmVkIGk7CisKKwlsZW4gPSBwal9hbnNpX3NucHJpbnRmKHAsIGVuZC1wLCAiJXNzdWJqZWN0QWx0TmFtZSBleHRlbnNpb25cbiIsIAorCQkJICAgICAgIGluZGVudCk7CisJQ0hFQ0tfQlVGX0xFTigpOworCisJZm9yIChpID0gMDsgaSA8IGNpLT5zdWJqX2FsdF9uYW1lLmNudDsgKytpKSB7CisJICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMOworCisJICAgIHN3aXRjaChjaS0+c3Vial9hbHRfbmFtZS5lbnRyeVtpXS50eXBlKSB7CisJICAgIGNhc2UgUEpfU1NMX0NFUlRfTkFNRV9SRkM4MjI6CisJCXR5cGUgPSAiTUFJTCI7CisJCWJyZWFrOworCSAgICBjYXNlIFBKX1NTTF9DRVJUX05BTUVfRE5TOgorCQl0eXBlID0gIiBETlMiOworCQlicmVhazsKKwkgICAgY2FzZSBQSl9TU0xfQ0VSVF9OQU1FX1VSSToKKwkJdHlwZSA9ICIgVVJJIjsKKwkJYnJlYWs7CisJICAgIGNhc2UgUEpfU1NMX0NFUlRfTkFNRV9JUDoKKwkJdHlwZSA9ICIgIElQIjsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmICh0eXBlKSB7CisJCWxlbiA9IHBqX2Fuc2lfc25wcmludGYoIHAsIGVuZC1wLCAiJXMgICAgICAlcyA6ICUuKnNcbiIsIGluZGVudCwgCisJCQkJCXR5cGUsIAorCQkJCQkoaW50KWNpLT5zdWJqX2FsdF9uYW1lLmVudHJ5W2ldLm5hbWUuc2xlbiwKKwkJCQkJY2ktPnN1YmpfYWx0X25hbWUuZW50cnlbaV0ubmFtZS5wdHIpOworCQlDSEVDS19CVUZfTEVOKCk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcmV0dXJuIChwLWJ1Zik7Cit9CisKKworI2VuZGlmICAvKiBQSl9IQVNfU1NMX1NPQ0sgKi8KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zc2xfc29ja19vc3NsLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NzbF9zb2NrX29zc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGNhMzkyCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zc2xfc29ja19vc3NsLmMKQEAgLTAsMCArMSwyNTc3IEBACisvKiAkSWQ6IHNzbF9zb2NrX29zc2wuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovc3NsX3NvY2suaD4KKyNpbmNsdWRlIDxwai9hY3RpdmVzb2NrLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3NvY2tldC5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovbGlzdC5oPgorI2luY2x1ZGUgPHBqL2xvY2suaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9tYXRoLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovdGltZXIuaD4KKworCisvKiBPbmx5IGJ1aWxkIHdoZW4gUEpfSEFTX1NTTF9TT0NLIGlzIGVuYWJsZWQgKi8KKyNpZiBkZWZpbmVkKFBKX0hBU19TU0xfU09DSykgJiYgUEpfSEFTX1NTTF9TT0NLIT0wCisKKyNkZWZpbmUgVEhJU19GSUxFCQkic3NsX3NvY2tfb3NzbC5jIgorCisvKiBXb3JrYXJvdW5kIGZvciB0aWNrZXQgIzk4NSAqLworI2RlZmluZSBERUxBWUVEX0NMT1NFX1RJTUVPVVQJMjAwCisKKy8qIE1heGltdW0gY2lwaGVycyAqLworI2RlZmluZSBNQVhfQ0lQSEVSUwkJMTAwCisKKy8qIAorICogSW5jbHVkZSBPcGVuU1NMIGhlYWRlcnMgCisgKi8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKKyNpZmRlZiBfTVNDX1ZFUgorIyAgcHJhZ21hIGNvbW1lbnQoIGxpYiwgImxpYmVheTMyIikKKyMgIHByYWdtYSBjb21tZW50KCBsaWIsICJzc2xlYXkzMiIpCisjZW5kaWYKKworCisvKgorICogU1NML1RMUyBzdGF0ZSBlbnVtZXJhdGlvbi4KKyAqLworZW51bSBzc2xfc3RhdGUgeworICAgIFNTTF9TVEFURV9OVUxMLAorICAgIFNTTF9TVEFURV9IQU5EU0hBS0lORywKKyAgICBTU0xfU1RBVEVfRVNUQUJMSVNIRUQKK307CisKKy8qCisgKiBJbnRlcm5hbCB0aW1lciB0eXBlcy4KKyAqLworZW51bSB0aW1lcl9pZAoreworICAgIFRJTUVSX05PTkUsCisgICAgVElNRVJfSEFORFNIQUtFX1RJTUVPVVQsCisgICAgVElNRVJfQ0xPU0UKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgU1NMIHNvY2tldCByZWFkIGJ1ZmZlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcmVhZF9kYXRhX3QKK3sKKyAgICB2b2lkCQkgKmRhdGE7CisgICAgcGpfc2l6ZV90CQkgIGxlbjsKK30gcmVhZF9kYXRhX3Q7CisKKy8qCisgKiBHZXQgdGhlIG9mZnNldCBvZiBwb2ludGVyIHRvIHJlYWQtYnVmZmVyIG9mIFNTTCBzb2NrZXQgZnJvbSByZWFkLWJ1ZmZlcgorICogb2YgYWN0aXZlIHNvY2tldC4gTm90ZSB0aGF0IGJvdGggU1NMIHNvY2tldCBhbmQgYWN0aXZlIHNvY2tldCBlbXBsb3kgCisgKiBkaWZmZXJlbnQgYnV0IGNvcnJlbGF0ZWQgcmVhZC1idWZmZXJzIChhcyBtdWNoIGFzIGFzeW5jX2NudCBmb3IgZWFjaCksCisgKiBhbmQgdG8gbWFrZSBpdCBlYXNpZXIvZmFzdGVyIHRvIGZpbmQgY29ycmVzcG9uZGluZyBTU0wgc29ja2V0J3MgcmVhZC1idWZmZXIKKyAqIGZyb20ga25vd24gYWN0aXZlIHNvY2tldCdzIHJlYWQtYnVmZmVyLCB0aGUgcG9pbnRlciBvZiBjb3JyZXNwb25kaW5nIAorICogU1NMIHNvY2tldCdzIHJlYWQtYnVmZmVyIGlzIHN0b3JlZCByaWdodCBhZnRlciB0aGUgZW5kIG9mIGFjdGl2ZSBzb2NrZXQncworICogcmVhZC1idWZmZXIuCisgKi8KKyNkZWZpbmUgT0ZGU0VUX09GX1JFQURfREFUQV9QVFIoc3NvY2ssIGFzb2NrX3JidWYpIFwKKwkJCQkJKHJlYWRfZGF0YV90KiopIFwKKwkJCQkJKChwal9pbnQ4X3QqKShhc29ja19yYnVmKSArIFwKKwkJCQkJc3NvY2stPnBhcmFtLnJlYWRfYnVmZmVyX3NpemUpCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgU1NMIHNvY2tldCB3cml0ZSBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCB3cml0ZV9kYXRhX3QgeworICAgIFBKX0RFQ0xfTElTVF9NRU1CRVIoc3RydWN0IHdyaXRlX2RhdGFfdCk7CisgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdAkga2V5OworICAgIHBqX3NpemVfdCAJIAkgcmVjb3JkX2xlbjsKKyAgICBwal9pb3F1ZXVlX29wX2tleV90CSphcHBfa2V5OworICAgIHBqX3NpemVfdCAJIAkgcGxhaW5fZGF0YV9sZW47CisgICAgcGpfc2l6ZV90IAkgCSBkYXRhX2xlbjsKKyAgICB1bnNpZ25lZAkJIGZsYWdzOworICAgIHVuaW9uIHsKKwljaGFyCQkgY29udGVudFsxXTsKKwljb25zdCBjaGFyCSpwdHI7CisgICAgfSBkYXRhOworfSB3cml0ZV9kYXRhX3Q7CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgU1NMIHNvY2tldCB3cml0ZSBidWZmZXIgKGNpcmN1bGFyIGJ1ZmZlcikuCisgKi8KK3R5cGVkZWYgc3RydWN0IHNlbmRfYnVmX3QgeworICAgIGNoYXIJCSpidWY7CisgICAgcGpfc2l6ZV90CQkgbWF4X2xlbjsgICAgCisgICAgY2hhcgkJKnN0YXJ0OworICAgIHBqX3NpemVfdAkJIGxlbjsKK30gc2VuZF9idWZfdDsKKworLyoKKyAqIFNlY3VyZSBzb2NrZXQgc3RydWN0dXJlIGRlZmluaXRpb24uCisgKi8KK3N0cnVjdCBwal9zc2xfc29ja190Cit7CisgICAgcGpfcG9vbF90CQkgKnBvb2w7CisgICAgcGpfc3NsX3NvY2tfdAkgKnBhcmVudDsKKyAgICBwal9zc2xfc29ja19wYXJhbQkgIHBhcmFtOworICAgIHBqX3NzbF9jZXJ0X3QJICpjZXJ0OworICAgIAorICAgIHBqX3NzbF9jZXJ0X2luZm8JICBsb2NhbF9jZXJ0X2luZm87CisgICAgcGpfc3NsX2NlcnRfaW5mbwkgIHJlbW90ZV9jZXJ0X2luZm87CisKKyAgICBwal9ib29sX3QJCSAgaXNfc2VydmVyOworICAgIGVudW0gc3NsX3N0YXRlCSAgc3NsX3N0YXRlOworICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QJICBoYW5kc2hha2Vfb3Bfa2V5OworICAgIHBqX3RpbWVyX2VudHJ5CSAgdGltZXI7CisgICAgcGpfc3RhdHVzX3QJCSAgdmVyaWZ5X3N0YXR1czsKKworICAgIHVuc2lnbmVkIGxvbmcJICBsYXN0X2VycjsKKworICAgIHBqX3NvY2tfdAkJICBzb2NrOworICAgIHBqX2FjdGl2ZXNvY2tfdAkgKmFzb2NrOworCisgICAgcGpfc29ja2FkZHIJCSAgbG9jYWxfYWRkcjsKKyAgICBwal9zb2NrYWRkcgkJICByZW1fYWRkcjsKKyAgICBpbnQJCQkgIGFkZHJfbGVuOworICAgIAorICAgIHBqX2Jvb2xfdAkJICByZWFkX3N0YXJ0ZWQ7CisgICAgcGpfc2l6ZV90CQkgIHJlYWRfc2l6ZTsKKyAgICBwal91aW50MzJfdAkJICByZWFkX2ZsYWdzOworICAgIHZvaWQJCSoqYXNvY2tfcmJ1ZjsKKyAgICByZWFkX2RhdGFfdAkJICpzc29ja19yYnVmOworCisgICAgd3JpdGVfZGF0YV90CSAgd3JpdGVfcGVuZGluZzsvKiBsaXN0IG9mIHBlbmRpbmcgd3JpdGUgdG8gT3BlblNTTCAqLworICAgIHdyaXRlX2RhdGFfdAkgIHdyaXRlX3BlbmRpbmdfZW1wdHk7IC8qIGNhY2hlIGZvciB3cml0ZV9wZW5kaW5nICAgKi8KKyAgICBwal9ib29sX3QJCSAgZmx1c2hpbmdfd3JpdGVfcGVuZDsgLyogZmxhZyBvZiBmbHVzaGluZyBpcyBvbmdvaW5nKi8KKyAgICBzZW5kX2J1Zl90CQkgIHNlbmRfYnVmOworICAgIHdyaXRlX2RhdGFfdAkgIHNlbmRfcGVuZGluZzsJLyogbGlzdCBvZiBwZW5kaW5nIHdyaXRlIHRvIG5ldHdvcmsgKi8KKyAgICBwal9sb2NrX3QJCSAqd3JpdGVfbXV0ZXg7CS8qIHByb3RlY3Qgd3JpdGUgQklPIGFuZCBzZW5kX2J1ZiAgICovCisKKyAgICBTU0xfQ1RYCQkgKm9zc2xfY3R4OworICAgIFNTTAkJCSAqb3NzbF9zc2w7CisgICAgQklPCQkJICpvc3NsX3JiaW87CisgICAgQklPCQkJICpvc3NsX3diaW87Cit9OworCisKKy8qCisgKiBDZXJ0aWZpY2F0ZS9jcmVkZW50aWFsIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorICovCitzdHJ1Y3QgcGpfc3NsX2NlcnRfdAoreworICAgIHBqX3N0cl90IENBX2ZpbGU7CisgICAgcGpfc3RyX3QgY2VydF9maWxlOworICAgIHBqX3N0cl90IHByaXZrZXlfZmlsZTsKKyAgICBwal9zdHJfdCBwcml2a2V5X3Bhc3M7Cit9OworCisKK3N0YXRpYyB3cml0ZV9kYXRhX3QqIGFsbG9jX3NlbmRfZGF0YShwal9zc2xfc29ja190ICpzc29jaywgcGpfc2l6ZV90IGxlbik7CitzdGF0aWMgdm9pZCBmcmVlX3NlbmRfZGF0YShwal9zc2xfc29ja190ICpzc29jaywgd3JpdGVfZGF0YV90ICp3ZGF0YSk7CitzdGF0aWMgcGpfc3RhdHVzX3QgZmx1c2hfZGVsYXllZF9zZW5kKHBqX3NzbF9zb2NrX3QgKnNzb2NrKTsKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdGF0aWMvaW50ZXJuYWwgZnVuY3Rpb25zLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKioKKyAqIE1hcHBpbmcgZnJvbSBPcGVuU1NMIGVycm9yIGNvZGVzIHRvIHBqbGliIGVycm9yIHNwYWNlLgorICovCisKKyNkZWZpbmUgUEpfU1NMX0VSUk5PX1NUQVJUCQkoUEpfRVJSTk9fU1RBUlRfVVNFUiArIFwKKwkJCQkJIFBKX0VSUk5PX1NQQUNFX1NJWkUqNikKKworI2RlZmluZSBQSl9TU0xfRVJSTk9fU1BBQ0VfU0laRQkJUEpfRVJSTk9fU1BBQ0VfU0laRQorCisvKiBFeHBlY3RlZCBtYXhpbXVtIHZhbHVlIG9mIHJlYXNvbiBjb21wb25lbnQgaW4gT3BlblNTTCBlcnJvciBjb2RlICovCisjZGVmaW5lIE1BWF9PU1NMX0VSUl9SRUFTT04JCTEyMDAKKworc3RhdGljIHBqX3N0YXR1c190IFNUQVRVU19GUk9NX1NTTF9FUlIocGpfc3NsX3NvY2tfdCAqc3NvY2ssCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXJyKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIC8qIEdlbmVyYWwgU1NMIGVycm9yLCBkaWcgbW9yZSBmcm9tIE9wZW5TU0wgZXJyb3IgcXVldWUgKi8KKyAgICBpZiAoZXJyID09IFNTTF9FUlJPUl9TU0wpCisJZXJyID0gRVJSX2dldF9lcnJvcigpOworCisgICAgLyogT3BlblNTTCBlcnJvciByYW5nZSBpcyBtdWNoIHdpZGVyIHRoYW4gUEpMSUIgZXJybm8gc3BhY2UsIHNvCisgICAgICogaWYgaXQgZXhjZWVkcyB0aGUgc3BhY2UsIG9ubHkgdGhlIGVycm9yIHJlYXNvbiB3aWxsIGJlIGtlcHQuCisgICAgICogTm90ZSB0aGF0IHRoZSBsYXN0IG5hdGl2ZSBlcnJvciB3aWxsIGJlIGtlcHQgYXMgaXMgYW5kIGNhbiBiZQorICAgICAqIHJldHJpZXZlZCB2aWEgU1NMIHNvY2tldCBpbmZvLgorICAgICAqLworICAgIHN0YXR1cyA9IEVSUl9HRVRfTElCKGVycikqTUFYX09TU0xfRVJSX1JFQVNPTiArIEVSUl9HRVRfUkVBU09OKGVycik7CisgICAgaWYgKHN0YXR1cyA+IFBKX1NTTF9FUlJOT19TUEFDRV9TSVpFKQorCXN0YXR1cyA9IEVSUl9HRVRfUkVBU09OKGVycik7CisKKyAgICBzdGF0dXMgKz0gUEpfU1NMX0VSUk5PX1NUQVJUOworICAgIHNzb2NrLT5sYXN0X2VyciA9IGVycjsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgcGpfc3RhdHVzX3QgR0VUX1NTTF9TVEFUVVMocGpfc3NsX3NvY2tfdCAqc3NvY2spCit7CisgICAgcmV0dXJuIFNUQVRVU19GUk9NX1NTTF9FUlIoc3NvY2ssIEVSUl9nZXRfZXJyb3IoKSk7Cit9CisKKworLyoKKyAqIEdldCBlcnJvciBzdHJpbmcgb2YgT3BlblNTTC4KKyAqLworc3RhdGljIHBqX3N0cl90IHNzbF9zdHJlcnJvcihwal9zdGF0dXNfdCBzdGF0dXMsIAorCQkJICAgICBjaGFyICpidWYsIHBqX3NpemVfdCBidWZzaXplKQoreworICAgIHBqX3N0cl90IGVycnN0cjsKKyAgICB1bnNpZ25lZCBsb25nIHNzbF9lcnIgPSBzdGF0dXM7CisKKyAgICBpZiAoc3NsX2VycikgeworCXVuc2lnbmVkIGxvbmcgbCwgcjsKKwlzc2xfZXJyIC09IFBKX1NTTF9FUlJOT19TVEFSVDsKKwlsID0gc3NsX2VyciAvIE1BWF9PU1NMX0VSUl9SRUFTT047CisJciA9IHNzbF9lcnIgJSBNQVhfT1NTTF9FUlJfUkVBU09OOworCXNzbF9lcnIgPSBFUlJfUEFDSyhsLCAwLCByKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFBKX0hBU19FUlJPUl9TVFJJTkcpICYmIChQSl9IQVNfRVJST1JfU1RSSU5HICE9IDApCisKKyAgICB7CisJY29uc3QgY2hhciAqdG1wID0gTlVMTDsKKwl0bXAgPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhzc2xfZXJyKTsKKwlpZiAodG1wKSB7CisJICAgIHBqX2Fuc2lfc3RybmNweShidWYsIHRtcCwgYnVmc2l6ZSk7CisJICAgIGVycnN0ciA9IHBqX3N0cihidWYpOworCSAgICByZXR1cm4gZXJyc3RyOworCX0KKyAgICB9CisKKyNlbmRpZgkvKiBQSl9IQVNfRVJST1JfU1RSSU5HICovCisKKyAgICBlcnJzdHIucHRyID0gYnVmOworICAgIGVycnN0ci5zbGVuID0gcGpfYW5zaV9zbnByaW50ZihidWYsIGJ1ZnNpemUsIAorCQkJCSAgICJVbmtub3duIE9wZW5TU0wgZXJyb3IgJWx1IiwKKwkJCQkgICBzc2xfZXJyKTsKKworICAgIHJldHVybiBlcnJzdHI7Cit9CisKKworLyogT3BlblNTTCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGNvdW50ZXIgKi8KK3N0YXRpYyBpbnQgb3BlbnNzbF9pbml0X2NvdW50OworCisvKiBPcGVuU1NMIGF2YWlsYWJsZSBjaXBoZXJzICovCitzdGF0aWMgdW5zaWduZWQgb3BlbnNzbF9jaXBoZXJfbnVtOworc3RhdGljIHN0cnVjdCBvcGVuc3NsX2NpcGhlcnNfdCB7CisgICAgcGpfc3NsX2NpcGhlciAgICBpZDsKKyAgICBjb25zdCBjaGFyCSAgICAqbmFtZTsKK30gb3BlbnNzbF9jaXBoZXJzW01BWF9DSVBIRVJTXTsKKworLyogT3BlblNTTCBhcHBsaWNhdGlvbiBkYXRhIGluZGV4ICovCitzdGF0aWMgaW50IHNzbHNvY2tfaWR4OworCisKKy8qIEluaXRpYWxpemUgT3BlblNTTCAqLworc3RhdGljIHBqX3N0YXR1c190IGluaXRfb3BlbnNzbCh2b2lkKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChvcGVuc3NsX2luaXRfY291bnQpCisJcmV0dXJuIFBKX1NVQ0NFU1M7CisKKyAgICBvcGVuc3NsX2luaXRfY291bnQgPSAxOworCisgICAgLyogUmVnaXN0ZXIgZXJyb3Igc3Vic3lzdGVtICovCisgICAgc3RhdHVzID0gcGpfcmVnaXN0ZXJfc3RyZXJyb3IoUEpfU1NMX0VSUk5PX1NUQVJULCAKKwkJCQkgIFBKX1NTTF9FUlJOT19TUEFDRV9TSVpFLCAKKwkJCQkgICZzc2xfc3RyZXJyb3IpOworICAgIHBqX2Fzc2VydChzdGF0dXMgPT0gUEpfU1VDQ0VTUyk7CisKKyAgICAvKiBJbml0IE9wZW5TU0wgbGliICovCisgICAgU1NMX2xpYnJhcnlfaW5pdCgpOworICAgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyAgICBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOworCisgICAgLyogSW5pdCBhdmFpbGFibGUgY2lwaGVycyAqLworICAgIGlmIChvcGVuc3NsX2NpcGhlcl9udW0gPT0gMCkgeworCVNTTF9NRVRIT0QgKm1ldGggPSBOVUxMOworCVNTTF9DVFggKmN0eDsKKwlTU0wgKnNzbDsKKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqc2tfY2lwaGVyOworCXVuc2lnbmVkIGksIG47CisKKwltZXRoID0gKFNTTF9NRVRIT0QqKVNTTHYyM19zZXJ2ZXJfbWV0aG9kKCk7CisJaWYgKCFtZXRoKQorCSAgICBtZXRoID0gKFNTTF9NRVRIT0QqKVRMU3YxX3NlcnZlcl9tZXRob2QoKTsKKwlpZiAoIW1ldGgpCisJICAgIG1ldGggPSAoU1NMX01FVEhPRCopU1NMdjNfc2VydmVyX21ldGhvZCgpOworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDIKKwlpZiAoIW1ldGgpCisJICAgIG1ldGggPSAoU1NMX01FVEhPRCopU1NMdjJfc2VydmVyX21ldGhvZCgpOworI2VuZGlmCisJcGpfYXNzZXJ0KG1ldGgpOworCisJY3R4PVNTTF9DVFhfbmV3KG1ldGgpOworCVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGN0eCwgIkFMTCIpOworCisJc3NsID0gU1NMX25ldyhjdHgpOworCXNrX2NpcGhlciA9IFNTTF9nZXRfY2lwaGVycyhzc2wpOworCisJbiA9IHNrX1NTTF9DSVBIRVJfbnVtKHNrX2NpcGhlcik7CisJaWYgKG4gPiBQSl9BUlJBWV9TSVpFKG9wZW5zc2xfY2lwaGVycykpCisJICAgIG4gPSBQSl9BUlJBWV9TSVpFKG9wZW5zc2xfY2lwaGVycyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisJICAgIFNTTF9DSVBIRVIgKmM7CisJICAgIGMgPSBza19TU0xfQ0lQSEVSX3ZhbHVlKHNrX2NpcGhlcixpKTsKKwkgICAgb3BlbnNzbF9jaXBoZXJzW2ldLmlkID0gKHBqX3NzbF9jaXBoZXIpCisJCQkJICAgIChwal91aW50MzJfdCljLT5pZCAmIDB4MDBGRkZGRkY7CisJICAgIG9wZW5zc2xfY2lwaGVyc1tpXS5uYW1lID0gU1NMX0NJUEhFUl9nZXRfbmFtZShjKTsKKwl9CisKKwlTU0xfZnJlZShzc2wpOworCVNTTF9DVFhfZnJlZShjdHgpOworCisJb3BlbnNzbF9jaXBoZXJfbnVtID0gbjsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgT3BlblNTTCBhcHBsaWNhdGlvbiBkYXRhIGluZGV4IGZvciBTU0wgc29ja2V0ICovCisgICAgc3Nsc29ja19pZHggPSBTU0xfZ2V0X2V4X25ld19pbmRleCgwLCAiU1NMIHNvY2tldCIsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyogU2h1dGRvd24gT3BlblNTTCAqLworc3RhdGljIHZvaWQgc2h1dGRvd25fb3BlbnNzbCh2b2lkKQoreworICAgIFBKX1VOVVNFRF9BUkcob3BlbnNzbF9pbml0X2NvdW50KTsKK30KKworCisvKiBTU0wgcGFzc3dvcmQgY2FsbGJhY2suICovCitzdGF0aWMgaW50IHBhc3N3b3JkX2NiKGNoYXIgKmJ1ZiwgaW50IG51bSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIHBqX3NzbF9jZXJ0X3QgKmNlcnQgPSAocGpfc3NsX2NlcnRfdCopIHVzZXJfZGF0YTsKKworICAgIFBKX1VOVVNFRF9BUkcocndmbGFnKTsKKworICAgIGlmKG51bSA8IGNlcnQtPnByaXZrZXlfcGFzcy5zbGVuKQorCXJldHVybiAwOworICAgIAorICAgIHBqX21lbWNweShidWYsIGNlcnQtPnByaXZrZXlfcGFzcy5wdHIsIGNlcnQtPnByaXZrZXlfcGFzcy5zbGVuKTsKKyAgICByZXR1cm4gKGludCljZXJ0LT5wcml2a2V5X3Bhc3Muc2xlbjsKK30KKworCisvKiBTU0wgcGFzc3dvcmQgY2FsbGJhY2suICovCitzdGF0aWMgaW50IHZlcmlmeV9jYihpbnQgcHJldmVyaWZ5X29rLCBYNTA5X1NUT1JFX0NUWCAqeDUwOV9jdHgpCit7CisgICAgcGpfc3NsX3NvY2tfdCAqc3NvY2s7CisgICAgU1NMICpvc3NsX3NzbDsKKyAgICBpbnQgZXJyOworCisgICAgLyogR2V0IFNTTCBpbnN0YW5jZSAqLworICAgIG9zc2xfc3NsID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2V4X2RhdGEoeDUwOV9jdHgsIAorCQkJCSAgICBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkpOworICAgIHBqX2Fzc2VydChvc3NsX3NzbCk7CisKKyAgICAvKiBHZXQgU1NMIHNvY2tldCBpbnN0YW5jZSAqLworICAgIHNzb2NrID0gU1NMX2dldF9leF9kYXRhKG9zc2xfc3NsLCBzc2xzb2NrX2lkeCk7CisgICAgcGpfYXNzZXJ0KHNzb2NrKTsKKworICAgIC8qIFN0b3JlIHZlcmlmaWNhdGlvbiBzdGF0dXMgKi8KKyAgICBlcnIgPSBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoeDUwOV9jdHgpOworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgY2FzZSBYNTA5X1ZfT0s6CisJYnJlYWs7CisKKyAgICBjYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVDoKKwlzc29jay0+dmVyaWZ5X3N0YXR1cyB8PSBQSl9TU0xfQ0VSVF9FSVNTVUVSX05PVF9GT1VORDsKKwlicmVhazsKKworICAgIGNhc2UgWDUwOV9WX0VSUl9FUlJPUl9JTl9DRVJUX05PVF9CRUZPUkVfRklFTEQ6CisgICAgY2FzZSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0FGVEVSX0ZJRUxEOgorICAgIGNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fREVDUllQVF9DRVJUX1NJR05BVFVSRToKKyAgICBjYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWToKKwlzc29jay0+dmVyaWZ5X3N0YXR1cyB8PSBQSl9TU0xfQ0VSVF9FSU5WQUxJRF9GT1JNQVQ7CisJYnJlYWs7CisKKyAgICBjYXNlIFg1MDlfVl9FUlJfQ0VSVF9OT1RfWUVUX1ZBTElEOgorICAgIGNhc2UgWDUwOV9WX0VSUl9DRVJUX0hBU19FWFBJUkVEOgorCXNzb2NrLT52ZXJpZnlfc3RhdHVzIHw9IFBKX1NTTF9DRVJUX0VWQUxJRElUWV9QRVJJT0Q7CisJYnJlYWs7CisKKyAgICBjYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9DUkw6CisgICAgY2FzZSBYNTA5X1ZfRVJSX0NSTF9OT1RfWUVUX1ZBTElEOgorICAgIGNhc2UgWDUwOV9WX0VSUl9DUkxfSEFTX0VYUElSRUQ6CisgICAgY2FzZSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19ERUNSWVBUX0NSTF9TSUdOQVRVUkU6CisgICAgY2FzZSBYNTA5X1ZfRVJSX0NSTF9TSUdOQVRVUkVfRkFJTFVSRToKKyAgICBjYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ1JMX0xBU1RfVVBEQVRFX0ZJRUxEOgorICAgIGNhc2UgWDUwOV9WX0VSUl9FUlJPUl9JTl9DUkxfTkVYVF9VUERBVEVfRklFTEQ6CisJc3NvY2stPnZlcmlmeV9zdGF0dXMgfD0gUEpfU1NMX0NFUlRfRUNSTF9GQUlMVVJFOworCWJyZWFrOwkKKworICAgIGNhc2UgWDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQ6CisgICAgY2FzZSBYNTA5X1ZfRVJSX0NFUlRfVU5UUlVTVEVEOgorICAgIGNhc2UgWDUwOV9WX0VSUl9TRUxGX1NJR05FRF9DRVJUX0lOX0NIQUlOOgorICAgIGNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUX0xPQ0FMTFk6CisJc3NvY2stPnZlcmlmeV9zdGF0dXMgfD0gUEpfU1NMX0NFUlRfRVVOVFJVU1RFRDsKKwlicmVhazsJCisKKyAgICBjYXNlIFg1MDlfVl9FUlJfQ0VSVF9TSUdOQVRVUkVfRkFJTFVSRToKKyAgICBjYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX1ZFUklGWV9MRUFGX1NJR05BVFVSRToKKyAgICBjYXNlIFg1MDlfVl9FUlJfU1VCSkVDVF9JU1NVRVJfTUlTTUFUQ0g6CisgICAgY2FzZSBYNTA5X1ZfRVJSX0FLSURfU0tJRF9NSVNNQVRDSDoKKyAgICBjYXNlIFg1MDlfVl9FUlJfQUtJRF9JU1NVRVJfU0VSSUFMX01JU01BVENIOgorICAgIGNhc2UgWDUwOV9WX0VSUl9LRVlVU0FHRV9OT19DRVJUU0lHTjoKKwlzc29jay0+dmVyaWZ5X3N0YXR1cyB8PSBQSl9TU0xfQ0VSVF9FSVNTVUVSX01JU01BVENIOworCWJyZWFrOworCisgICAgY2FzZSBYNTA5X1ZfRVJSX0NFUlRfUkVWT0tFRDoKKwlzc29jay0+dmVyaWZ5X3N0YXR1cyB8PSBQSl9TU0xfQ0VSVF9FUkVWT0tFRDsKKwlicmVhazsJCisKKyAgICBjYXNlIFg1MDlfVl9FUlJfSU5WQUxJRF9QVVJQT1NFOgorICAgIGNhc2UgWDUwOV9WX0VSUl9DRVJUX1JFSkVDVEVEOgorICAgIGNhc2UgWDUwOV9WX0VSUl9JTlZBTElEX0NBOgorCXNzb2NrLT52ZXJpZnlfc3RhdHVzIHw9IFBKX1NTTF9DRVJUX0VJTlZBTElEX1BVUlBPU0U7CisJYnJlYWs7CisKKyAgICBjYXNlIFg1MDlfVl9FUlJfQ0VSVF9DSEFJTl9UT09fTE9ORzogLyogbm90IHJlYWxseSB1c2VkICovCisgICAgY2FzZSBYNTA5X1ZfRVJSX1BBVEhfTEVOR1RIX0VYQ0VFREVEOgorCXNzb2NrLT52ZXJpZnlfc3RhdHVzIHw9IFBKX1NTTF9DRVJUX0VDSEFJTl9UT09fTE9ORzsKKwlicmVhazsKKworICAgIC8qIFVua25vd24gZXJyb3JzICovCisgICAgY2FzZSBYNTA5X1ZfRVJSX09VVF9PRl9NRU06CisgICAgZGVmYXVsdDoKKwlzc29jay0+dmVyaWZ5X3N0YXR1cyB8PSBQSl9TU0xfQ0VSVF9FVU5LTk9XTjsKKwlicmVhazsKKyAgICB9CisKKyAgICAvKiBXaGVuIHZlcmlmaWNhdGlvbiBpcyBub3QgcmVxdWVzdGVkIGp1c3QgcmV0dXJuIG9rIGhlcmUsIGhvd2V2ZXIKKyAgICAgKiBhcHBsaWNhdGlvbiBjYW4gc3RpbGwgZ2V0IHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzLgorICAgICAqLworICAgIGlmIChQSl9GQUxTRSA9PSBzc29jay0+cGFyYW0udmVyaWZ5X3BlZXIpCisJcHJldmVyaWZ5X29rID0gMTsKKworICAgIHJldHVybiBwcmV2ZXJpZnlfb2s7Cit9CisKKy8qIFNldHRpbmcgU1NMIHNvY2sgY2lwaGVyIGxpc3QgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzZXRfY2lwaGVyX2xpc3QocGpfc3NsX3NvY2tfdCAqc3NvY2spOworCisKKy8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBuZXcgU1NMIGNvbnRleHQgYW5kIGluc3RhbmNlICovCitzdGF0aWMgcGpfc3RhdHVzX3QgY3JlYXRlX3NzbChwal9zc2xfc29ja190ICpzc29jaykKK3sKKyAgICBTU0xfTUVUSE9EICpzc2xfbWV0aG9kOworICAgIFNTTF9DVFggKmN0eDsKKyAgICBwal9zc2xfY2VydF90ICpjZXJ0OworICAgIGludCBtb2RlLCByYzsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIAorICAgIHBqX2Fzc2VydChzc29jayk7CisKKyAgICBjZXJ0ID0gc3NvY2stPmNlcnQ7CisKKyAgICAvKiBNYWtlIHN1cmUgT3BlblNTTCBsaWJyYXJ5IGhhcyBiZWVuIGluaXRpYWxpemVkICovCisgICAgaW5pdF9vcGVuc3NsKCk7CisKKyAgICAvKiBEZXRlcm1pbmUgU1NMIG1ldGhvZCB0byB1c2UgKi8KKyAgICBzd2l0Y2ggKHNzb2NrLT5wYXJhbS5wcm90bykgeworICAgIGNhc2UgUEpfU1NMX1NPQ0tfUFJPVE9fREVGQVVMVDoKKyAgICBjYXNlIFBKX1NTTF9TT0NLX1BST1RPX1RMUzE6CisJc3NsX21ldGhvZCA9IChTU0xfTUVUSE9EKilUTFN2MV9tZXRob2QoKTsKKwlicmVhazsKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCisgICAgY2FzZSBQSl9TU0xfU09DS19QUk9UT19TU0wyOgorCXNzbF9tZXRob2QgPSAoU1NMX01FVEhPRCopU1NMdjJfbWV0aG9kKCk7CisJYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFBKX1NTTF9TT0NLX1BST1RPX1NTTDM6CisJc3NsX21ldGhvZCA9IChTU0xfTUVUSE9EKilTU0x2M19tZXRob2QoKTsKKwlicmVhazsKKyAgICBjYXNlIFBKX1NTTF9TT0NLX1BST1RPX1NTTDIzOgorCXNzbF9tZXRob2QgPSAoU1NMX01FVEhPRCopU1NMdjIzX21ldGhvZCgpOworCWJyZWFrOworICAgIC8vY2FzZSBQSl9TU0xfU09DS19QUk9UT19EVExTMToKKwkvL3NzbF9tZXRob2QgPSAoU1NMX01FVEhPRCopRFRMU3YxX21ldGhvZCgpOworCS8vYnJlYWs7CisgICAgZGVmYXVsdDoKKwlyZXR1cm4gUEpfRUlOVkFMOworICAgIH0KKworICAgIC8qIENyZWF0ZSBTU0wgY29udGV4dCAqLworICAgIGN0eCA9IFNTTF9DVFhfbmV3KHNzbF9tZXRob2QpOworICAgIGlmIChjdHggPT0gTlVMTCkgeworCXJldHVybiBHRVRfU1NMX1NUQVRVUyhzc29jayk7CisgICAgfQorCisgICAgLyogQXBwbHkgY3JlZGVudGlhbHMgKi8KKyAgICBpZiAoY2VydCkgeworCS8qIExvYWQgQ0EgbGlzdCBpZiBvbmUgaXMgc3BlY2lmaWVkLiAqLworCWlmIChjZXJ0LT5DQV9maWxlLnNsZW4pIHsKKworCSAgICByYyA9IFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGN0eCwgY2VydC0+Q0FfZmlsZS5wdHIsIE5VTEwpOworCisJICAgIGlmIChyYyAhPSAxKSB7CisJCXN0YXR1cyA9IEdFVF9TU0xfU1RBVFVTKHNzb2NrKTsKKwkJUEpfTE9HKDEsKHNzb2NrLT5wb29sLT5vYmpfbmFtZSwgIkVycm9yIGxvYWRpbmcgQ0EgbGlzdCBmaWxlICIKKwkJCSAgIiclcyciLCBjZXJ0LT5DQV9maWxlLnB0cikpOworCQlTU0xfQ1RYX2ZyZWUoY3R4KTsKKwkJcmV0dXJuIHN0YXR1czsKKwkgICAgfQorCX0KKyAgICAKKwkvKiBTZXQgcGFzc3dvcmQgY2FsbGJhY2sgKi8KKwlpZiAoY2VydC0+cHJpdmtleV9wYXNzLnNsZW4pIHsKKwkgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoY3R4LCBwYXNzd29yZF9jYik7CisJICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKGN0eCwgY2VydCk7CisJfQorCisKKwkvKiBMb2FkIGNlcnRpZmljYXRlIGlmIG9uZSBpcyBzcGVjaWZpZWQgKi8KKwlpZiAoY2VydC0+Y2VydF9maWxlLnNsZW4pIHsKKworCSAgICAvKiBMb2FkIGNlcnRpZmljYXRlIGNoYWluIGZyb20gZmlsZSBpbnRvIGN0eCAqLworCSAgICByYyA9IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoY3R4LCBjZXJ0LT5jZXJ0X2ZpbGUucHRyKTsKKworCSAgICBpZihyYyAhPSAxKSB7CisJCXN0YXR1cyA9IEdFVF9TU0xfU1RBVFVTKHNzb2NrKTsKKwkJUEpfTE9HKDEsKHNzb2NrLT5wb29sLT5vYmpfbmFtZSwgIkVycm9yIGxvYWRpbmcgY2VydGlmaWNhdGUgIgorCQkJICAiY2hhaW4gZmlsZSAnJXMnIiwgY2VydC0+Y2VydF9maWxlLnB0cikpOworCQlTU0xfQ1RYX2ZyZWUoY3R4KTsKKwkJcmV0dXJuIHN0YXR1czsKKwkgICAgfQorCX0KKworCisJLyogTG9hZCBwcml2YXRlIGtleSBpZiBvbmUgaXMgc3BlY2lmaWVkICovCisJaWYgKGNlcnQtPnByaXZrZXlfZmlsZS5zbGVuKSB7CisJICAgIC8qIEFkZHMgdGhlIGZpcnN0IHByaXZhdGUga2V5IGZvdW5kIGluIGZpbGUgdG8gY3R4ICovCisJICAgIHJjID0gU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKGN0eCwgY2VydC0+cHJpdmtleV9maWxlLnB0ciwgCisJCQkJCSAgICAgU1NMX0ZJTEVUWVBFX1BFTSk7CisKKwkgICAgaWYocmMgIT0gMSkgeworCQlzdGF0dXMgPSBHRVRfU1NMX1NUQVRVUyhzc29jayk7CisJCVBKX0xPRygxLChzc29jay0+cG9vbC0+b2JqX25hbWUsICJFcnJvciBhZGRpbmcgcHJpdmF0ZSBrZXkgIgorCQkJICAiZnJvbSAnJXMnIiwgY2VydC0+cHJpdmtleV9maWxlLnB0cikpOworCQlTU0xfQ1RYX2ZyZWUoY3R4KTsKKwkJcmV0dXJuIHN0YXR1czsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiBDcmVhdGUgU1NMIGluc3RhbmNlICovCisgICAgc3NvY2stPm9zc2xfY3R4ID0gY3R4OworICAgIHNzb2NrLT5vc3NsX3NzbCA9IFNTTF9uZXcoc3NvY2stPm9zc2xfY3R4KTsKKyAgICBpZiAoc3NvY2stPm9zc2xfc3NsID09IE5VTEwpIHsKKwlyZXR1cm4gR0VUX1NTTF9TVEFUVVMoc3NvY2spOworICAgIH0KKworICAgIC8qIFNldCBTU0wgc29jayBhcyBhcHBsaWNhdGlvbiBkYXRhIG9mIFNTTCBpbnN0YW5jZSAqLworICAgIFNTTF9zZXRfZXhfZGF0YShzc29jay0+b3NzbF9zc2wsIHNzbHNvY2tfaWR4LCBzc29jayk7CisKKyAgICAvKiBTU0wgdmVyaWZpY2F0aW9uIG9wdGlvbnMgKi8KKyAgICBtb2RlID0gU1NMX1ZFUklGWV9QRUVSOworICAgIGlmIChzc29jay0+aXNfc2VydmVyICYmIHNzb2NrLT5wYXJhbS5yZXF1aXJlX2NsaWVudF9jZXJ0KQorCW1vZGUgfD0gU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVDsKKworICAgIFNTTF9zZXRfdmVyaWZ5KHNzb2NrLT5vc3NsX3NzbCwgbW9kZSwgJnZlcmlmeV9jYik7CisKKyAgICAvKiBTZXQgY2lwaGVyIGxpc3QgKi8KKyAgICBzdGF0dXMgPSBzZXRfY2lwaGVyX2xpc3Qoc3NvY2spOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgLyogU2V0dXAgU1NMIEJJT3MgKi8KKyAgICBzc29jay0+b3NzbF9yYmlvID0gQklPX25ldyhCSU9fc19tZW0oKSk7CisgICAgc3NvY2stPm9zc2xfd2JpbyA9IEJJT19uZXcoQklPX3NfbWVtKCkpOworICAgIEJJT19zZXRfY2xvc2Uoc3NvY2stPm9zc2xfcmJpbywgQklPX0NMT1NFKTsKKyAgICBCSU9fc2V0X2Nsb3NlKHNzb2NrLT5vc3NsX3diaW8sIEJJT19DTE9TRSk7CisgICAgU1NMX3NldF9iaW8oc3NvY2stPm9zc2xfc3NsLCBzc29jay0+b3NzbF9yYmlvLCBzc29jay0+b3NzbF93YmlvKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qIERlc3Ryb3kgU1NMIGNvbnRleHQgYW5kIGluc3RhbmNlICovCitzdGF0aWMgdm9pZCBkZXN0cm95X3NzbChwal9zc2xfc29ja190ICpzc29jaykKK3sKKyAgICAvKiBEZXN0cm95IFNTTCBpbnN0YW5jZSAqLworICAgIGlmIChzc29jay0+b3NzbF9zc2wpIHsKKwlTU0xfc2h1dGRvd24oc3NvY2stPm9zc2xfc3NsKTsKKwlTU0xfZnJlZShzc29jay0+b3NzbF9zc2wpOyAvKiB0aGlzIHdpbGwgYWxzbyBjbG9zZSBCSU9zICovCisJc3NvY2stPm9zc2xfc3NsID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBEZXN0cm95IFNTTCBjb250ZXh0ICovCisgICAgaWYgKHNzb2NrLT5vc3NsX2N0eCkgeworCVNTTF9DVFhfZnJlZShzc29jay0+b3NzbF9jdHgpOworCXNzb2NrLT5vc3NsX2N0eCA9IE5VTEw7CisgICAgfQorCisgICAgLyogUG90ZW50aWFsbHkgc2h1dGRvd24gT3BlblNTTCBsaWJyYXJ5IGlmIHRoaXMgaXMgdGhlIGxhc3QKKyAgICAgKiBjb250ZXh0IGV4aXN0cy4KKyAgICAgKi8KKyAgICBzaHV0ZG93bl9vcGVuc3NsKCk7Cit9CisKKworLyogUmVzZXQgU1NMIHNvY2tldCBzdGF0ZSAqLworc3RhdGljIHZvaWQgcmVzZXRfc3NsX3NvY2tfc3RhdGUocGpfc3NsX3NvY2tfdCAqc3NvY2spCit7CisgICAgc3NvY2stPnNzbF9zdGF0ZSA9IFNTTF9TVEFURV9OVUxMOworCisgICAgZGVzdHJveV9zc2woc3NvY2spOworCisgICAgaWYgKHNzb2NrLT5hc29jaykgeworCXBqX2FjdGl2ZXNvY2tfY2xvc2Uoc3NvY2stPmFzb2NrKTsKKwlzc29jay0+YXNvY2sgPSBOVUxMOworCXNzb2NrLT5zb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorICAgIGlmIChzc29jay0+c29jayAhPSBQSl9JTlZBTElEX1NPQ0tFVCkgeworCXBqX3NvY2tfY2xvc2Uoc3NvY2stPnNvY2spOworCXNzb2NrLT5zb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorCisgICAgLyogVXBvbiBlcnJvciwgT3BlblNTTCBtYXkgbGVhdmUgYW55IGVycm9yIGRlc2NyaXB0aW9uIGluIHRoZSB0aHJlYWQgCisgICAgICogZXJyb3IgcXVldWUsIHdoaWNoIHNvbWV0aW1lIG1heSBjYXVzZSBuZXh0IGNhbGwgdG8gU1NMIEFQSSByZXR1cm5pbmcKKyAgICAgKiBmYWxzZSBlcnJvciBhbGFybSwgZS5nOiBpbiBMaW51eCwgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSgpCisgICAgICogcmV0dXJuaW5nIGZhbHNlIGVycm9yIGFmdGVyIGEgaGFuZHNoYWtlIGVycm9yIChpbiBkaWZmZXJlbnQgU1NMX0NUWCEpLgorICAgICAqIEZvciBub3csIGp1c3QgY2xlYXIgdGhyZWFkIGVycm9yIHF1ZXVlIGhlcmUuCisgICAgICovCisgICAgRVJSX2NsZWFyX2Vycm9yKCk7Cit9CisKKworLyogR2VuZXJhdGUgY2lwaGVyIGxpc3Qgd2l0aCB1c2VyIHByZWZlcmVuY2Ugb3JkZXIgaW4gT3BlblNTTCBmb3JtYXQgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBzZXRfY2lwaGVyX2xpc3QocGpfc3NsX3NvY2tfdCAqc3NvY2spCit7CisgICAgY2hhciBidWZbMTAyNF07CisgICAgcGpfc3RyX3QgY2lwaGVyX2xpc3Q7CisgICAgU1RBQ0tfT0YoU1NMX0NJUEhFUikgKnNrX2NpcGhlcjsKKyAgICB1bnNpZ25lZCBpOworICAgIGludCBqLCByZXQ7CisKKyAgICBpZiAoc3NvY2stPnBhcmFtLmNpcGhlcnNfbnVtID09IDApCisJcmV0dXJuIFBKX1NVQ0NFU1M7CisKKyAgICBwal9zdHJzZXQoJmNpcGhlcl9saXN0LCBidWYsIDApOworCisgICAgLyogU2V0IFNTTCB3aXRoIEFMTCBhdmFpbGFibGUgY2lwaGVycyAqLworICAgIFNTTF9zZXRfY2lwaGVyX2xpc3Qoc3NvY2stPm9zc2xfc3NsLCAiQUxMIik7CisKKyAgICAvKiBHZW5lcmF0ZSB1c2VyIHNwZWNpZmllZCBjaXBoZXIgbGlzdCBpbiBPcGVuU1NMIGZvcm1hdCAqLworICAgIHNrX2NpcGhlciA9IFNTTF9nZXRfY2lwaGVycyhzc29jay0+b3NzbF9zc2wpOworICAgIGZvciAoaSA9IDA7IGkgPCBzc29jay0+cGFyYW0uY2lwaGVyc19udW07ICsraSkgeworCWZvciAoaiA9IDA7IGogPCBza19TU0xfQ0lQSEVSX251bShza19jaXBoZXIpOyArK2opIHsKKwkgICAgU1NMX0NJUEhFUiAqYzsKKwkgICAgYyA9IHNrX1NTTF9DSVBIRVJfdmFsdWUoc2tfY2lwaGVyLCBqKTsKKwkgICAgaWYgKHNzb2NrLT5wYXJhbS5jaXBoZXJzW2ldID09IChwal9zc2xfY2lwaGVyKQorCQkJCQkgICAoKHBqX3VpbnQzMl90KWMtPmlkICYgMHgwMEZGRkZGRikpCisJICAgIHsKKwkJY29uc3QgY2hhciAqY19uYW1lOworCisJCWNfbmFtZSA9IFNTTF9DSVBIRVJfZ2V0X25hbWUoYyk7CisKKwkJLyogQ2hlY2sgYnVmZmVyIHNpemUgKi8KKwkJaWYgKGNpcGhlcl9saXN0LnNsZW4gKyBwal9hbnNpX3N0cmxlbihjX25hbWUpICsgMiA+IHNpemVvZihidWYpKSB7CisJCSAgICBwal9hc3NlcnQoISJJbnN1ZmZpY2llbnQgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgY2lwaGVyIik7CisJCSAgICByZXR1cm4gUEpfRVRPT01BTlk7CisJCX0KKworCQkvKiBBZGQgY29sb24gc2VwYXJhdG9yICovCisJCWlmIChjaXBoZXJfbGlzdC5zbGVuKQorCQkgICAgcGpfc3RyY2F0MigmY2lwaGVyX2xpc3QsICI6Iik7CisKKwkJLyogQWRkIHRoZSBjaXBoZXIgKi8KKwkJcGpfc3RyY2F0MigmY2lwaGVyX2xpc3QsIGNfbmFtZSk7CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIFB1dCBOVUxMIHRlcm1pbmF0aW9uIGluIHRoZSBnZW5lcmF0ZWQgY2lwaGVyIGxpc3QgKi8KKyAgICBjaXBoZXJfbGlzdC5wdHJbY2lwaGVyX2xpc3Quc2xlbl0gPSAnXDAnOworCisgICAgLyogRmluYWxseSwgc2V0IGNob3NlbiBjaXBoZXIgbGlzdCAqLworICAgIHJldCA9IFNTTF9zZXRfY2lwaGVyX2xpc3Qoc3NvY2stPm9zc2xfc3NsLCBidWYpOworICAgIGlmIChyZXQgPCAxKSB7CisJcmV0dXJuIEdFVF9TU0xfU1RBVFVTKHNzb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKiBQYXJzZSBPcGVuU1NMIEFTTjFfVElNRSB0byBwal90aW1lX3ZhbCBhbmQgR01UIGluZm8gKi8KK3N0YXRpYyBwal9ib29sX3QgcGFyc2Vfb3NzbF9hc24xX3RpbWUocGpfdGltZV92YWwgKnR2LCBwal9ib29sX3QgKmdtdCwKKwkJCQkgICAgICBjb25zdCBBU04xX1RJTUUgKnRtKQoreworICAgIHVuc2lnbmVkIGxvbmcgcGFydHNbN10gPSB7MH07CisgICAgY2hhciAqcCwgKmVuZDsKKyAgICB1bnNpZ25lZCBsZW47CisgICAgcGpfYm9vbF90IHV0YzsKKyAgICBwal9wYXJzZWRfdGltZSBwdDsKKyAgICBpbnQgaTsKKworICAgIHV0YyA9IHRtLT50eXBlID09IFZfQVNOMV9VVENUSU1FOworICAgIHAgPSAoY2hhciopdG0tPmRhdGE7CisgICAgbGVuID0gdG0tPmxlbmd0aDsKKyAgICBlbmQgPSBwICsgbGVuIC0gMTsKKworICAgIC8qIEdNVCAqLworICAgICpnbXQgPSAoKmVuZCA9PSAnWicpOworCisgICAgLyogcGFyc2UgcGFydHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNyAmJiBwIDwgZW5kOyArK2kpIHsKKwlwal9zdHJfdCBzdDsKKworCWlmIChpPT0wICYmICF1dGMpIHsKKwkgICAgLyogNCBkaWdpdHMgeWVhciBwYXJ0IGZvciBub24tVVRDIHRpbWUgZm9ybWF0ICovCisJICAgIHN0LnNsZW4gPSA0OworCX0gZWxzZSBpZiAoaT09NikgeworCSAgICAvKiBmcmFjdGlvbiBvZiBzZWNvbmRzICovCisJICAgIGlmICgqcCA9PSAnLicpICsrcDsKKwkgICAgc3Quc2xlbiA9IGVuZCAtIHAgKyAxOworCX0gZWxzZSB7CisJICAgIC8qIG90aGVyIHBhcnRzIGFsd2F5cyAyIGRpZ2l0cyBsZW5ndGggKi8KKwkgICAgc3Quc2xlbiA9IDI7CisJfQorCXN0LnB0ciA9IHA7CisKKwlwYXJ0c1tpXSA9IHBqX3N0cnRvdWwoJnN0KTsKKwlwICs9IHN0LnNsZW47CisgICAgfQorCisgICAgLyogZW5jb2RlIHBhcnRzIHRvIHBqX3RpbWVfdmFsICovCisgICAgcHQueWVhciA9IHBhcnRzWzBdOworICAgIGlmICh1dGMpCisJcHQueWVhciArPSAocHQueWVhciA8IDUwKT8gMjAwMDoxOTAwOworICAgIHB0Lm1vbiA9IHBhcnRzWzFdIC0gMTsKKyAgICBwdC5kYXkgPSBwYXJ0c1syXTsKKyAgICBwdC5ob3VyID0gcGFydHNbM107CisgICAgcHQubWluID0gcGFydHNbNF07CisgICAgcHQuc2VjID0gcGFydHNbNV07CisgICAgcHQubXNlYyA9IHBhcnRzWzZdOworCisgICAgcGpfdGltZV9lbmNvZGUoJnB0LCB0dik7CisKKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworCisvKiBHZXQgQ29tbW9uIE5hbWUgZmllbGQgc3RyaW5nIGZyb20gYSBnZW5lcmFsIG5hbWUgc3RyaW5nICovCitzdGF0aWMgdm9pZCBnZXRfY25fZnJvbV9nZW5fbmFtZShjb25zdCBwal9zdHJfdCAqZ2VuX25hbWUsIHBqX3N0cl90ICpjbikKK3sKKyAgICBwal9zdHJfdCBDTl9zaWduID0geyIvQ049IiwgNH07CisgICAgY2hhciAqcCwgKnE7CisKKyAgICBwal9iemVybyhjbiwgc2l6ZW9mKGNuKSk7CisKKyAgICBwID0gcGpfc3Ryc3RyKGdlbl9uYW1lLCAmQ05fc2lnbik7CisgICAgaWYgKCFwKQorCXJldHVybjsKKworICAgIHAgKz0gNDsgLyogc2hpZnQgcG9pbnRlciB0byB2YWx1ZSBwYXJ0ICovCisgICAgcGpfc3Ryc2V0KGNuLCBwLCBnZW5fbmFtZS0+c2xlbiAtIChwIC0gZ2VuX25hbWUtPnB0cikpOworICAgIHEgPSBwal9zdHJjaHIoY24sICcvJyk7CisgICAgaWYgKHEpCisJY24tPnNsZW4gPSBxIC0gcDsKK30KKworCisvKiBHZXQgY2VydGlmaWNhdGUgaW5mbyBmcm9tIE9wZW5TU0wgWDUwOSwgaW4gY2FzZSB0aGUgY2VydGlmaWNhdGUgaW5mbworICogaGFsIGFscmVhZHkgcG9wdWxhdGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlIGNvbnRlbnRzIG5lZWQgCisgKiB0byBiZSB1cGRhdGVkIGJ5IGluc3BlY3RpbmcgdGhlIGlzc3VlciBhbmQgdGhlIHNlcmlhbCBudW1iZXIuCisgKi8KK3N0YXRpYyB2b2lkIGdldF9jZXJ0X2luZm8ocGpfcG9vbF90ICpwb29sLCBwal9zc2xfY2VydF9pbmZvICpjaSwgWDUwOSAqeCkKK3sKKyAgICBwal9ib29sX3QgdXBkYXRlX25lZWRlZDsKKyAgICBjaGFyIGJ1Zls1MTJdOworICAgIHBqX3VpbnQ4X3Qgc2VyaWFsX25vWzY0XSA9IHswfTsgLyogc2hvdWxkIGJlID49IHNpemVvZihjaS0+c2VyaWFsX25vKSAqLworICAgIHBqX3VpbnQ4X3QgKnA7CisgICAgdW5zaWduZWQgbGVuOworICAgIEdFTkVSQUxfTkFNRVMgKm5hbWVzID0gTlVMTDsKKworICAgIHBqX2Fzc2VydChwb29sICYmIGNpICYmIHgpOworCisgICAgLyogR2V0IGlzc3VlciAqLworICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpLCBidWYsIHNpemVvZihidWYpKTsKKworICAgIC8qIEdldCBzZXJpYWwgbm8gKi8KKyAgICBwID0gKHBqX3VpbnQ4X3QqKSBNX0FTTjFfU1RSSU5HX2RhdGEoWDUwOV9nZXRfc2VyaWFsTnVtYmVyKHgpKTsKKyAgICBsZW4gPSBNX0FTTjFfU1RSSU5HX2xlbmd0aChYNTA5X2dldF9zZXJpYWxOdW1iZXIoeCkpOworICAgIGlmIChsZW4gPiBzaXplb2YoY2ktPnNlcmlhbF9ubykpIAorCWxlbiA9IHNpemVvZihjaS0+c2VyaWFsX25vKTsKKyAgICBwal9tZW1jcHkoc2VyaWFsX25vICsgc2l6ZW9mKGNpLT5zZXJpYWxfbm8pIC0gbGVuLCBwLCBsZW4pOworCisgICAgLyogQ2hlY2sgaWYgdGhlIGNvbnRlbnRzIG5lZWQgdG8gYmUgdXBkYXRlZC4gKi8KKyAgICB1cGRhdGVfbmVlZGVkID0gcGpfc3RyY21wMigmY2ktPmlzc3Vlci5pbmZvLCBidWYpIHx8IAorCSAgICAgICAgICAgIHBqX21lbWNtcChjaS0+c2VyaWFsX25vLCBzZXJpYWxfbm8sIHNpemVvZihjaS0+c2VyaWFsX25vKSk7CisgICAgaWYgKCF1cGRhdGVfbmVlZGVkKQorCXJldHVybjsKKworICAgIC8qIFVwZGF0ZSBjZXJ0IGluZm8gKi8KKworICAgIHBqX2J6ZXJvKGNpLCBzaXplb2YocGpfc3NsX2NlcnRfaW5mbykpOworCisgICAgLyogVmVyc2lvbiAqLworICAgIGNpLT52ZXJzaW9uID0gWDUwOV9nZXRfdmVyc2lvbih4KSArIDE7CisKKyAgICAvKiBJc3N1ZXIgKi8KKyAgICBwal9zdHJkdXAyKHBvb2wsICZjaS0+aXNzdWVyLmluZm8sIGJ1Zik7CisgICAgZ2V0X2NuX2Zyb21fZ2VuX25hbWUoJmNpLT5pc3N1ZXIuaW5mbywgJmNpLT5pc3N1ZXIuY24pOworCisgICAgLyogU2VyaWFsIG51bWJlciAqLworICAgIHBqX21lbWNweShjaS0+c2VyaWFsX25vLCBzZXJpYWxfbm8sIHNpemVvZihjaS0+c2VyaWFsX25vKSk7CisKKyAgICAvKiBTdWJqZWN0ICovCisgICAgcGpfc3RyZHVwMihwb29sLCAmY2ktPnN1YmplY3QuaW5mbywgCisJICAgICAgIFg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSwKKwkJCQkgYnVmLCBzaXplb2YoYnVmKSkpOworICAgIGdldF9jbl9mcm9tX2dlbl9uYW1lKCZjaS0+c3ViamVjdC5pbmZvLCAmY2ktPnN1YmplY3QuY24pOworCisgICAgLyogVmFsaWRpdHkgKi8KKyAgICBwYXJzZV9vc3NsX2FzbjFfdGltZSgmY2ktPnZhbGlkaXR5LnN0YXJ0LCAmY2ktPnZhbGlkaXR5LmdtdCwKKwkJCSBYNTA5X2dldF9ub3RCZWZvcmUoeCkpOworICAgIHBhcnNlX29zc2xfYXNuMV90aW1lKCZjaS0+dmFsaWRpdHkuZW5kLCAmY2ktPnZhbGlkaXR5LmdtdCwKKwkJCSBYNTA5X2dldF9ub3RBZnRlcih4KSk7CisKKyAgICAvKiBTdWJqZWN0IEFsdGVybmF0aXZlIE5hbWUgZXh0ZW5zaW9uICovCisgICAgaWYgKGNpLT52ZXJzaW9uID49IDMpIHsKKwluYW1lcyA9IChHRU5FUkFMX05BTUVTKikgWDUwOV9nZXRfZXh0X2QyaSh4LCBOSURfc3ViamVjdF9hbHRfbmFtZSwKKwkJCQkJCSAgTlVMTCwgTlVMTCk7CisgICAgfQorICAgIGlmIChuYW1lcykgeworICAgICAgICB1bnNpZ25lZCBpLCBjbnQ7CisKKyAgICAgICAgY250ID0gc2tfR0VORVJBTF9OQU1FX251bShuYW1lcyk7CisJY2ktPnN1YmpfYWx0X25hbWUuZW50cnkgPSBwal9wb29sX2NhbGxvYyhwb29sLCBjbnQsIAorCQkJCQkgICAgc2l6ZW9mKCpjaS0+c3Vial9hbHRfbmFtZS5lbnRyeSkpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7ICsraSkgeworCSAgICB1bnNpZ25lZCBjaGFyICpwID0gMDsKKwkgICAgcGpfc3NsX2NlcnRfbmFtZV90eXBlIHR5cGUgPSBQSl9TU0xfQ0VSVF9OQU1FX1VOS05PV047CisgICAgICAgICAgICBjb25zdCBHRU5FUkFMX05BTUUgKm5hbWU7CisJICAgIAorCSAgICBuYW1lID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKG5hbWVzLCBpKTsKKworICAgICAgICAgICAgc3dpdGNoIChuYW1lLT50eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBHRU5fRU1BSUw6CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IEFTTjFfU1RSSU5HX3RvX1VURjgoJnAsIG5hbWUtPmQuaWE1KTsKKwkJICAgIHR5cGUgPSBQSl9TU0xfQ0VSVF9OQU1FX1JGQzgyMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHRU5fRE5TOgorICAgICAgICAgICAgICAgICAgICBsZW4gPSBBU04xX1NUUklOR190b19VVEY4KCZwLCBuYW1lLT5kLmlhNSk7CisJCSAgICB0eXBlID0gUEpfU1NMX0NFUlRfTkFNRV9ETlM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0VOX1VSSToKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmcCwgbmFtZS0+ZC5pYTUpOworCQkgICAgdHlwZSA9IFBKX1NTTF9DRVJUX05BTUVfVVJJOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdFTl9JUEFERDoKKwkJICAgIHAgPSBBU04xX1NUUklOR19kYXRhKG5hbWUtPmQuaXApOworCQkgICAgbGVuID0gQVNOMV9TVFJJTkdfbGVuZ3RoKG5hbWUtPmQuaXApOworCQkgICAgdHlwZSA9IFBKX1NTTF9DRVJUX05BTUVfSVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkgICAgaWYgKHAgJiYgbGVuICYmIHR5cGUgIT0gUEpfU1NMX0NFUlRfTkFNRV9VTktOT1dOKSB7CisJCWNpLT5zdWJqX2FsdF9uYW1lLmVudHJ5W2NpLT5zdWJqX2FsdF9uYW1lLmNudF0udHlwZSA9IHR5cGU7CisJCWlmICh0eXBlID09IFBKX1NTTF9DRVJUX05BTUVfSVApIHsKKwkJICAgIGludCBhZiA9IHBqX0FGX0lORVQoKTsKKwkJICAgIGlmIChsZW4gPT0gc2l6ZW9mKHBqX2luNl9hZGRyKSkgYWYgPSBwal9BRl9JTkVUNigpOworCQkgICAgcGpfaW5ldF9udG9wMihhZiwgcCwgYnVmLCBzaXplb2YoYnVmKSk7CisJCSAgICBwal9zdHJkdXAyKHBvb2wsIAorCQkgICAgICAgICAgJmNpLT5zdWJqX2FsdF9uYW1lLmVudHJ5W2NpLT5zdWJqX2FsdF9uYW1lLmNudF0ubmFtZSwKKwkJICAgICAgICAgIGJ1Zik7CisJCX0gZWxzZSB7CisJCSAgICBwal9zdHJkdXAyKHBvb2wsIAorCQkJICAmY2ktPnN1YmpfYWx0X25hbWUuZW50cnlbY2ktPnN1YmpfYWx0X25hbWUuY250XS5uYW1lLCAKKwkJCSAgKGNoYXIqKXApOworCQkgICAgT1BFTlNTTF9mcmVlKHApOworCQl9CisJCWNpLT5zdWJqX2FsdF9uYW1lLmNudCsrOworCSAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyogVXBkYXRlIGxvY2FsICYgcmVtb3RlIGNlcnRpZmljYXRlcyBpbmZvLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZQorICogY2FsbGVkIGFmdGVyIGhhbmRzaGFrZSBvciByZW5lZ290aWF0aW9uIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9jZXJ0c19pbmZvKHBqX3NzbF9zb2NrX3QgKnNzb2NrKQoreworICAgIFg1MDkgKng7CisKKyAgICBwal9hc3NlcnQoc3NvY2stPnNzbF9zdGF0ZSA9PSBTU0xfU1RBVEVfRVNUQUJMSVNIRUQpOworCisgICAgLyogQWN0aXZlIGxvY2FsIGNlcnRpZmljYXRlICovCisgICAgeCA9IFNTTF9nZXRfY2VydGlmaWNhdGUoc3NvY2stPm9zc2xfc3NsKTsKKyAgICBpZiAoeCkgeworCWdldF9jZXJ0X2luZm8oc3NvY2stPnBvb2wsICZzc29jay0+bG9jYWxfY2VydF9pbmZvLCB4KTsKKwkvKiBEb24ndCBmcmVlIGxvY2FsJ3MgWDUwOSEgKi8KKyAgICB9IGVsc2UgeworCXBqX2J6ZXJvKCZzc29jay0+bG9jYWxfY2VydF9pbmZvLCBzaXplb2YocGpfc3NsX2NlcnRfaW5mbykpOworICAgIH0KKworICAgIC8qIEFjdGl2ZSByZW1vdGUgY2VydGlmaWNhdGUgKi8KKyAgICB4ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzb2NrLT5vc3NsX3NzbCk7CisgICAgaWYgKHgpIHsKKwlnZXRfY2VydF9pbmZvKHNzb2NrLT5wb29sLCAmc3NvY2stPnJlbW90ZV9jZXJ0X2luZm8sIHgpOworCS8qIEZyZWUgcGVlcidzIFg1MDkgKi8KKwlYNTA5X2ZyZWUoeCk7CisgICAgfSBlbHNlIHsKKwlwal9iemVybygmc3NvY2stPnJlbW90ZV9jZXJ0X2luZm8sIHNpemVvZihwal9zc2xfY2VydF9pbmZvKSk7CisgICAgfQorfQorCisKKy8qIFdoZW4gaGFuZHNoYWtlIGNvbXBsZXRlZDoKKyAqIC0gbm90aWZ5IGFwcGxpY2F0aW9uCisgKiAtIGlmIGhhbmRzaGFrZSBmYWlsZWQsIHJlc2V0IFNTTCBzdGF0ZQorICogLSByZXR1cm4gUEpfRkFMU0Ugd2hlbiBTU0wgc29ja2V0IGluc3RhbmNlIGlzIGRlc3Ryb3llZCBieSBhcHBsaWNhdGlvbi4KKyAqLworc3RhdGljIHBqX2Jvb2xfdCBvbl9oYW5kc2hha2VfY29tcGxldGUocGpfc3NsX3NvY2tfdCAqc3NvY2ssIAorCQkJCSAgICAgICBwal9zdGF0dXNfdCBzdGF0dXMpCit7CisgICAgLyogQ2FuY2VsIGhhbmRzaGFrZSB0aW1lciAqLworICAgIGlmIChzc29jay0+dGltZXIuaWQgPT0gVElNRVJfSEFORFNIQUtFX1RJTUVPVVQpIHsKKwlwal90aW1lcl9oZWFwX2NhbmNlbChzc29jay0+cGFyYW0udGltZXJfaGVhcCwgJnNzb2NrLT50aW1lcik7CisJc3NvY2stPnRpbWVyLmlkID0gVElNRVJfTk9ORTsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgY2VydGlmaWNhdGVzIGluZm8gb24gc3VjY2Vzc2Z1bCBoYW5kc2hha2UgKi8KKyAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpCisJdXBkYXRlX2NlcnRzX2luZm8oc3NvY2spOworCisgICAgLyogQWNjZXB0aW5nICovCisgICAgaWYgKHNzb2NrLT5pc19zZXJ2ZXIpIHsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgLyogSGFuZHNoYWtlIGZhaWxlZCBpbiBhY2NlcHRpbmcsIGRlc3Ryb3kgb3VyIHNlbGYgc2lsZW50bHkuICovCisKKwkgICAgY2hhciBlcnJtc2dbUEpfRVJSX01TR19TSVpFXTsKKwkgICAgY2hhciBidWZbUEpfSU5FVDZfQUREUlNUUkxFTisxMF07CisKKwkgICAgcGpfc3RyZXJyb3Ioc3RhdHVzLCBlcnJtc2csIHNpemVvZihlcnJtc2cpKTsKKwkgICAgUEpfTE9HKDMsKHNzb2NrLT5wb29sLT5vYmpfbmFtZSwgIkhhbmRzaGFrZSBmYWlsZWQgaW4gYWNjZXB0aW5nICIKKwkJICAgICAgIiVzOiAlcyIsCisJCSAgICAgIHBqX3NvY2thZGRyX3ByaW50KCZzc29jay0+cmVtX2FkZHIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIDMpLAorCQkgICAgICBlcnJtc2cpKTsKKworCSAgICAvKiBXb3JrYXJvdW5kIGZvciB0aWNrZXQgIzk4NSAqLworI2lmIChkZWZpbmVkKFBKX1dJTjMyKSAmJiBQSl9XSU4zMiE9MCkgfHwgKGRlZmluZWQoUEpfV0lONjQpICYmIFBKX1dJTjY0IT0wKQorCSAgICBpZiAoc3NvY2stPnBhcmFtLnRpbWVyX2hlYXApIHsKKwkJcGpfdGltZV92YWwgaW50ZXJ2YWwgPSB7MCwgREVMQVlFRF9DTE9TRV9USU1FT1VUfTsKKworCQlyZXNldF9zc2xfc29ja19zdGF0ZShzc29jayk7CisKKwkJc3NvY2stPnRpbWVyLmlkID0gVElNRVJfQ0xPU0U7CisJCXBqX3RpbWVfdmFsX25vcm1hbGl6ZSgmaW50ZXJ2YWwpOworCQlpZiAocGpfdGltZXJfaGVhcF9zY2hlZHVsZShzc29jay0+cGFyYW0udGltZXJfaGVhcCwgCisJCQkJCSAgICZzc29jay0+dGltZXIsICZpbnRlcnZhbCkgIT0gMCkKKwkJeworCQkgICAgc3NvY2stPnRpbWVyLmlkID0gVElNRVJfTk9ORTsKKwkJICAgIHBqX3NzbF9zb2NrX2Nsb3NlKHNzb2NrKTsKKwkJfQorCSAgICB9IGVsc2UgCisjZW5kaWYJLyogUEpfV0lOMzIgKi8KKwkgICAgeworCQlwal9zc2xfc29ja19jbG9zZShzc29jayk7CisJICAgIH0KKwkgICAgcmV0dXJuIFBKX0ZBTFNFOworCX0KKwkvKiBOb3RpZnkgYXBwbGljYXRpb24gdGhlIG5ld2x5IGFjY2VwdGVkIFNTTCBzb2NrZXQgKi8KKwlpZiAoc3NvY2stPnBhcmFtLmNiLm9uX2FjY2VwdF9jb21wbGV0ZSkgeworCSAgICBwal9ib29sX3QgcmV0OworCSAgICByZXQgPSAoKnNzb2NrLT5wYXJhbS5jYi5vbl9hY2NlcHRfY29tcGxldGUpCisJCSAgICAgIChzc29jay0+cGFyZW50LCBzc29jaywgKHBqX3NvY2thZGRyX3QqKSZzc29jay0+cmVtX2FkZHIsCisJCSAgICAgICBwal9zb2NrYWRkcl9nZXRfbGVuKChwal9zb2NrYWRkcl90Kikmc3NvY2stPnJlbV9hZGRyKSk7CisJICAgIGlmIChyZXQgPT0gUEpfRkFMU0UpCisJCXJldHVybiBQSl9GQUxTRTsKKwl9CisgICAgfQorCisgICAgLyogQ29ubmVjdGluZyAqLworICAgIGVsc2UgeworCS8qIE9uIGZhaWx1cmUsIHJlc2V0IFNTTCBzb2NrZXQgc3RhdGUgZmlyc3QsIGFzIGFwcCBtYXkgdHJ5IHRvIAorCSAqIHJlY29ubmVjdCBpbiB0aGUgY2FsbGJhY2suCisJICovCisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIC8qIFNlcnZlciBkaXNjb25uZWN0ZWQgdXMsIHBvc3NpYmx5IGR1ZSB0byBTU0wgbmVnbyBmYWlsdXJlICovCisJICAgIGlmIChzdGF0dXMgPT0gUEpfRUVPRikgeworCQl1bnNpZ25lZCBsb25nIGVycjsKKwkJZXJyID0gRVJSX2dldF9lcnJvcigpOworCQlpZiAoZXJyICE9IFNTTF9FUlJPUl9OT05FKQorCQkgICAgc3RhdHVzID0gU1RBVFVTX0ZST01fU1NMX0VSUihzc29jaywgZXJyKTsKKwkgICAgfQorCSAgICByZXNldF9zc2xfc29ja19zdGF0ZShzc29jayk7CisJfQorCWlmIChzc29jay0+cGFyYW0uY2Iub25fY29ubmVjdF9jb21wbGV0ZSkgeworCSAgICBwal9ib29sX3QgcmV0OworCSAgICByZXQgPSAoKnNzb2NrLT5wYXJhbS5jYi5vbl9jb25uZWN0X2NvbXBsZXRlKShzc29jaywgc3RhdHVzKTsKKwkgICAgaWYgKHJldCA9PSBQSl9GQUxTRSkKKwkJcmV0dXJuIFBKX0ZBTFNFOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworc3RhdGljIHdyaXRlX2RhdGFfdCogYWxsb2Nfc2VuZF9kYXRhKHBqX3NzbF9zb2NrX3QgKnNzb2NrLCBwal9zaXplX3QgbGVuKQoreworICAgIHNlbmRfYnVmX3QgKnNlbmRfYnVmID0gJnNzb2NrLT5zZW5kX2J1ZjsKKyAgICBwal9zaXplX3QgYXZhaWxfbGVuLCBza2lwcGVkX2xlbiA9IDA7CisgICAgY2hhciAqcmVnMSwgKnJlZzI7CisgICAgcGpfc2l6ZV90IHJlZzFfbGVuLCByZWcyX2xlbjsKKyAgICB3cml0ZV9kYXRhX3QgKnA7CisKKyAgICAvKiBDaGVjayBidWZmZXIgYXZhaWxhYmlsaXR5ICovCisgICAgYXZhaWxfbGVuID0gc2VuZF9idWYtPm1heF9sZW4gLSBzZW5kX2J1Zi0+bGVuOworICAgIGlmIChhdmFpbF9sZW4gPCBsZW4pCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBJZiBidWZmZXIgZW1wdHksIHJlc2V0IHN0YXJ0IHBvaW50ZXIgYW5kIHJldHVybiBpdCAqLworICAgIGlmIChzZW5kX2J1Zi0+bGVuID09IDApIHsKKwlzZW5kX2J1Zi0+c3RhcnQgPSBzZW5kX2J1Zi0+YnVmOworCXNlbmRfYnVmLT5sZW4gICA9IGxlbjsKKwlwID0gKHdyaXRlX2RhdGFfdCopc2VuZF9idWYtPnN0YXJ0OworCWdvdG8gaW5pdF9zZW5kX2RhdGE7CisgICAgfQorCisgICAgLyogRnJlZSBzcGFjZSBtYXkgYmUgd3JhcHBlZC9zcGxpdHRlZCBpbnRvIHR3byByZWdpb25zLCBzbyBsZXQncworICAgICAqIGFuYWx5emUgdGhlbSBpZiBhbnkgcmVnaW9uIGNhbiBob2xkIHRoZSB3cml0ZSBkYXRhLgorICAgICAqLworICAgIHJlZzEgPSBzZW5kX2J1Zi0+c3RhcnQgKyBzZW5kX2J1Zi0+bGVuOworICAgIGlmIChyZWcxID49IHNlbmRfYnVmLT5idWYgKyBzZW5kX2J1Zi0+bWF4X2xlbikKKwlyZWcxIC09IHNlbmRfYnVmLT5tYXhfbGVuOworICAgIHJlZzFfbGVuID0gc2VuZF9idWYtPm1heF9sZW4gLSBzZW5kX2J1Zi0+bGVuOworICAgIGlmIChyZWcxICsgcmVnMV9sZW4gPiBzZW5kX2J1Zi0+YnVmICsgc2VuZF9idWYtPm1heF9sZW4pIHsKKwlyZWcxX2xlbiA9IHNlbmRfYnVmLT5idWYgKyBzZW5kX2J1Zi0+bWF4X2xlbiAtIHJlZzE7CisJcmVnMiA9IHNlbmRfYnVmLT5idWY7CisJcmVnMl9sZW4gPSBzZW5kX2J1Zi0+c3RhcnQgLSBzZW5kX2J1Zi0+YnVmOworICAgIH0gZWxzZSB7CisJcmVnMiA9IE5VTEw7CisJcmVnMl9sZW4gPSAwOworICAgIH0KKworICAgIC8qIE1vcmUgYnVmZmVyIGF2YWlsYWJpbGl0eSBjaGVjaywgbm90ZSB0aGF0IHRoZSB3cml0ZSBkYXRhIG11c3QgYmUgaW4KKyAgICAgKiBhIGNvbnRpZ3VlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBhdmFpbF9sZW4gPSBQSl9NQVgocmVnMV9sZW4sIHJlZzJfbGVuKTsKKyAgICBpZiAoYXZhaWxfbGVuIDwgbGVuKQorCXJldHVybiBOVUxMOworCisgICAgLyogR2V0IHRoZSBkYXRhIHNsb3QgKi8KKyAgICBpZiAocmVnMV9sZW4gPj0gbGVuKSB7CisJcCA9ICh3cml0ZV9kYXRhX3QqKXJlZzE7CisgICAgfSBlbHNlIHsKKwlwID0gKHdyaXRlX2RhdGFfdCopcmVnMjsKKwlza2lwcGVkX2xlbiA9IHJlZzFfbGVuOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBidWZmZXIgbGVuZ3RoICovCisgICAgc2VuZF9idWYtPmxlbiArPSBsZW4gKyBza2lwcGVkX2xlbjsKKworaW5pdF9zZW5kX2RhdGE6CisgICAgLyogSW5pdCB0aGUgbmV3IHNlbmQgZGF0YSAqLworICAgIHBqX2J6ZXJvKHAsIHNpemVvZigqcCkpOworICAgIHBqX2xpc3RfaW5pdChwKTsKKyAgICBwal9saXN0X3B1c2hfYmFjaygmc3NvY2stPnNlbmRfcGVuZGluZywgcCk7CisKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9zZW5kX2RhdGEocGpfc3NsX3NvY2tfdCAqc3NvY2ssIHdyaXRlX2RhdGFfdCAqd2RhdGEpCit7CisgICAgc2VuZF9idWZfdCAqYnVmID0gJnNzb2NrLT5zZW5kX2J1ZjsKKyAgICB3cml0ZV9kYXRhX3QgKnNwbCA9ICZzc29jay0+c2VuZF9wZW5kaW5nOworCisgICAgcGpfYXNzZXJ0KCFwal9saXN0X2VtcHR5KCZzc29jay0+c2VuZF9wZW5kaW5nKSk7CisgICAgCisgICAgLyogRnJlZSBzbG90IGZyb20gdGhlIGJ1ZmZlciAqLworICAgIGlmIChzcGwtPm5leHQgPT0gd2RhdGEgJiYgc3BsLT5wcmV2ID09IHdkYXRhKSB7CisJLyogVGhpcyBpcyB0aGUgb25seSBkYXRhLCByZXNldCB0aGUgYnVmZmVyICovCisJYnVmLT5zdGFydCA9IGJ1Zi0+YnVmOworCWJ1Zi0+bGVuID0gMDsKKyAgICB9IGVsc2UgaWYgKHNwbC0+bmV4dCA9PSB3ZGF0YSkgeworCS8qIFRoaXMgaXMgdGhlIGZpcnN0IGRhdGEsIHNoaWZ0IHN0YXJ0IHBvaW50ZXIgb2YgdGhlIGJ1ZmZlciBhbmQKKwkgKiBhZGp1c3QgdGhlIGJ1ZmZlciBsZW5ndGguCisJICovCisJYnVmLT5zdGFydCA9IChjaGFyKil3ZGF0YS0+bmV4dDsKKwlpZiAod2RhdGEtPm5leHQgPiB3ZGF0YSkgeworCSAgICBidWYtPmxlbiAtPSAoKGNoYXIqKXdkYXRhLT5uZXh0IC0gYnVmLT5zdGFydCk7CisJfSBlbHNlIHsKKwkgICAgLyogT3ZlcmxhcHBlZCAqLworCSAgICBwal9zaXplX3QgcmlnaHRfbGVuLCBsZWZ0X2xlbjsKKwkgICAgcmlnaHRfbGVuID0gYnVmLT5idWYgKyBidWYtPm1heF9sZW4gLSAoY2hhciopd2RhdGE7CisJICAgIGxlZnRfbGVuICA9IChjaGFyKil3ZGF0YS0+bmV4dCAtIGJ1Zi0+YnVmOworCSAgICBidWYtPmxlbiAtPSAocmlnaHRfbGVuICsgbGVmdF9sZW4pOworCX0KKyAgICB9IGVsc2UgaWYgKHNwbC0+cHJldiA9PSB3ZGF0YSkgeworCS8qIFRoaXMgaXMgdGhlIGxhc3QgZGF0YSwganVzdCBhZGp1c3QgdGhlIGJ1ZmZlciBsZW5ndGggKi8KKwlpZiAod2RhdGEtPnByZXYgPCB3ZGF0YSkgeworCSAgICBwal9zaXplX3QganVtcF9sZW47CisJICAgIGp1bXBfbGVuID0gKGNoYXIqKXdkYXRhIC0KKwkJICAgICAgICgoY2hhciopd2RhdGEtPnByZXYgKyB3ZGF0YS0+cHJldi0+cmVjb3JkX2xlbik7CisJICAgIGJ1Zi0+bGVuIC09ICh3ZGF0YS0+cmVjb3JkX2xlbiArIGp1bXBfbGVuKTsKKwl9IGVsc2UgeworCSAgICAvKiBPdmVybGFwcGVkICovCisJICAgIHBqX3NpemVfdCByaWdodF9sZW4sIGxlZnRfbGVuOworCSAgICByaWdodF9sZW4gPSBidWYtPmJ1ZiArIGJ1Zi0+bWF4X2xlbiAtCisJCQkoKGNoYXIqKXdkYXRhLT5wcmV2ICsgd2RhdGEtPnByZXYtPnJlY29yZF9sZW4pOworCSAgICBsZWZ0X2xlbiAgPSAoY2hhciopd2RhdGEgKyB3ZGF0YS0+cmVjb3JkX2xlbiAtIGJ1Zi0+YnVmOworCSAgICBidWYtPmxlbiAtPSAocmlnaHRfbGVuICsgbGVmdF9sZW4pOworCX0KKyAgICB9CisgICAgLyogRm9yIGRhdGEgaW4gdGhlIG1pZGRsZSBidWZmZXIsIGp1c3QgZG8gbm90aGluZyBvbiB0aGUgYnVmZmVyLiBUaGUgc2xvdAorICAgICAqIHdpbGwgYmUgZnJlZWQgbGF0ZXIgd2hlbiBmcmVlaW5nIHRoZSBmaXJzdC9sYXN0IGRhdGEuCisgICAgICovCisgICAgCisgICAgLyogUmVtb3ZlIHRoZSBkYXRhIGZyb20gc2VuZCBwZW5kaW5nIGxpc3QgKi8KKyAgICBwal9saXN0X2VyYXNlKHdkYXRhKTsKK30KKworI2lmIDAKKy8qIEp1c3QgZm9yIHRlc3Rpbmcgc2VuZCBidWZmZXIgYWxsb2MvZnJlZSAqLworI2luY2x1ZGUgPHBqL3JhbmQuaD4KK3BqX3N0YXR1c190IHBqX3NzbF9zb2NrX29zc2xfdGVzdF9zZW5kX2J1Zihwal9wb29sX3QgKnBvb2wpCit7CisgICAgZW51bSB7IE1BWF9DSFVOS19OVU0gPSAyMCB9OworICAgIHVuc2lnbmVkIGNodW5rX3NpemUsIGNodW5rX2NudCwgaTsKKyAgICB3cml0ZV9kYXRhX3QgKndkYXRhW01BWF9DSFVOS19OVU1dID0gezB9OworICAgIHBqX3RpbWVfdmFsIG5vdzsKKyAgICBwal9zc2xfc29ja190ICpzc29jayA9IE5VTEw7CisgICAgcGpfc3NsX3NvY2tfcGFyYW0gcGFyYW07CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgcGpfZ2V0dGltZW9mZGF5KCZub3cpOworICAgIHBqX3NyYW5kKCh1bnNpZ25lZClub3cuc2VjKTsKKworICAgIHBqX3NzbF9zb2NrX3BhcmFtX2RlZmF1bHQoJnBhcmFtKTsKKyAgICBzdGF0dXMgPSBwal9zc2xfc29ja19jcmVhdGUocG9vbCwgJnBhcmFtLCAmc3NvY2spOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKHNzb2NrLT5zZW5kX2J1Zi5tYXhfbGVuID09IDApIHsKKwlzc29jay0+c2VuZF9idWYuYnVmID0gKGNoYXIqKQorCQkJICAgICAgcGpfcG9vbF9hbGxvYyhzc29jay0+cG9vbCwgCisJCQkJCSAgICBzc29jay0+cGFyYW0uc2VuZF9idWZmZXJfc2l6ZSk7CisJc3NvY2stPnNlbmRfYnVmLm1heF9sZW4gPSBzc29jay0+cGFyYW0uc2VuZF9idWZmZXJfc2l6ZTsKKwlzc29jay0+c2VuZF9idWYuc3RhcnQgPSBzc29jay0+c2VuZF9idWYuYnVmOworCXNzb2NrLT5zZW5kX2J1Zi5sZW4gPSAwOworICAgIH0KKworICAgIGNodW5rX3NpemUgPSBzc29jay0+cGFyYW0uc2VuZF9idWZmZXJfc2l6ZSAvIE1BWF9DSFVOS19OVU0gLyAyOworICAgIGNodW5rX2NudCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9DSFVOS19OVU07IGkrKykgeworCXdkYXRhW2ldID0gYWxsb2Nfc2VuZF9kYXRhKHNzb2NrLCBwal9yYW5kKCkgJSBjaHVua19zaXplICsgMzIxKTsKKwlpZiAod2RhdGFbaV0pCisJICAgIGNodW5rX2NudCsrOworCWVsc2UKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgd2hpbGUgKGNodW5rX2NudCkgeworCWkgPSBwal9yYW5kKCkgJSBNQVhfQ0hVTktfTlVNOworCWlmICh3ZGF0YVtpXSkgeworCSAgICBmcmVlX3NlbmRfZGF0YShzc29jaywgd2RhdGFbaV0pOworCSAgICB3ZGF0YVtpXSA9IE5VTEw7CisJICAgIGNodW5rX2NudC0tOworCX0KKyAgICB9CisKKyAgICBpZiAoc3NvY2stPnNlbmRfYnVmLmxlbiAhPSAwKQorCXN0YXR1cyA9IFBKX0VCVUc7CisKKyAgICBwal9zc2xfc29ja19jbG9zZShzc29jayk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisKKy8qIEZsdXNoIHdyaXRlIEJJTyB0byBuZXR3b3JrIHNvY2tldC4gTm90ZSB0aGF0IGFueSBhY2Nlc3MgdG8gd3JpdGUgQklPCisgKiBNVVNUIGJlIHNlcmlhbGl6ZWQsIHNvIG11dGV4IHByb3RlY3Rpb24gbXVzdCBjb3ZlciBhbnkgY2FsbCB0byBPcGVuU1NMCisgKiBBUEkgKHRoYXQgcG9zc2libHkgZ2VuZXJhdGUgZGF0YSBmb3Igd3JpdGUgQklPKSBhbG9uZyB3aXRoIHRoZSBjYWxsIHRvCisgKiB0aGlzIGZ1bmN0aW9uIChmbHVzaGluZyBhbGwgZGF0YSBpbiB3cml0ZSBCSU8gZ2VuZXJhdGVkIGJ5IGFib3ZlIAorICogT3BlblNTTCBBUEkgY2FsbCkuCisgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBmbHVzaF93cml0ZV9iaW8ocGpfc3NsX3NvY2tfdCAqc3NvY2ssIAorCQkJCSAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKnNlbmRfa2V5LAorCQkJCSAgIHBqX3NpemVfdCBvcmlnX2xlbiwKKwkJCQkgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICBjaGFyICpkYXRhOworICAgIHBqX3NzaXplX3QgbGVuOworICAgIHdyaXRlX2RhdGFfdCAqd2RhdGE7CisgICAgcGpfc2l6ZV90IG5lZWRlZF9sZW47CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgcGpfbG9ja19hY3F1aXJlKHNzb2NrLT53cml0ZV9tdXRleCk7CisKKyAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBkYXRhIGluIHdyaXRlIEJJTywgZmx1c2ggaXQgaWYgYW55ICovCisgICAgaWYgKCFCSU9fcGVuZGluZyhzc29jay0+b3NzbF93YmlvKSkgeworCXBqX2xvY2tfcmVsZWFzZShzc29jay0+d3JpdGVfbXV0ZXgpOworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKworICAgIC8qIEdldCBkYXRhIGFuZCBpdHMgbGVuZ3RoICovCisgICAgbGVuID0gQklPX2dldF9tZW1fZGF0YShzc29jay0+b3NzbF93YmlvLCAmZGF0YSk7CisgICAgaWYgKGxlbiA9PSAwKSB7CisJcGpfbG9ja19yZWxlYXNlKHNzb2NrLT53cml0ZV9tdXRleCk7CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIGJ1ZmZlciBzaXplIG5lZWRlZCwgYW5kIGFsaWduIGl0IHRvIDggKi8KKyAgICBuZWVkZWRfbGVuID0gbGVuICsgc2l6ZW9mKHdyaXRlX2RhdGFfdCk7CisgICAgbmVlZGVkX2xlbiA9ICgobmVlZGVkX2xlbiArIDcpID4+IDMpIDw8IDM7CisKKyAgICAvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHNlbmQgZGF0YSAqLworICAgIHdkYXRhID0gYWxsb2Nfc2VuZF9kYXRhKHNzb2NrLCBuZWVkZWRfbGVuKTsKKyAgICBpZiAod2RhdGEgPT0gTlVMTCkgeworCXBqX2xvY2tfcmVsZWFzZShzc29jay0+d3JpdGVfbXV0ZXgpOworCXJldHVybiBQSl9FTk9NRU07CisgICAgfQorCisgICAgLyogQ29weSB0aGUgZGF0YSBhbmQgc2V0IGl0cyBwcm9wZXJ0aWVzIGludG8gdGhlIHNlbmQgZGF0YSAqLworICAgIHBqX2lvcXVldWVfb3Bfa2V5X2luaXQoJndkYXRhLT5rZXksIHNpemVvZihwal9pb3F1ZXVlX29wX2tleV90KSk7CisgICAgd2RhdGEtPmtleS51c2VyX2RhdGEgPSB3ZGF0YTsKKyAgICB3ZGF0YS0+YXBwX2tleSA9IHNlbmRfa2V5OworICAgIHdkYXRhLT5yZWNvcmRfbGVuID0gbmVlZGVkX2xlbjsKKyAgICB3ZGF0YS0+ZGF0YV9sZW4gPSBsZW47CisgICAgd2RhdGEtPnBsYWluX2RhdGFfbGVuID0gb3JpZ19sZW47CisgICAgd2RhdGEtPmZsYWdzID0gZmxhZ3M7CisgICAgcGpfbWVtY3B5KCZ3ZGF0YS0+ZGF0YSwgZGF0YSwgbGVuKTsKKworICAgIC8qIFJlc2V0IHdyaXRlIEJJTyAqLworICAgIEJJT19yZXNldChzc29jay0+b3NzbF93YmlvKTsKKworICAgIC8qIFRpY2tldCAjMTU3MzogRG9uJ3QgaG9sZCBtdXRleCB3aGlsZSBjYWxsaW5nIFBKTElCIHNvY2tldCBzZW5kKCkuICovCisgICAgcGpfbG9ja19yZWxlYXNlKHNzb2NrLT53cml0ZV9tdXRleCk7CisKKyAgICAvKiBTZW5kIGl0ICovCisgICAgaWYgKHNzb2NrLT5wYXJhbS5zb2NrX3R5cGUgPT0gcGpfU09DS19TVFJFQU0oKSkgeworCXN0YXR1cyA9IHBqX2FjdGl2ZXNvY2tfc2VuZChzc29jay0+YXNvY2ssICZ3ZGF0YS0+a2V5LCAKKwkJCQkgICAgd2RhdGEtPmRhdGEuY29udGVudCwgJmxlbiwKKwkJCQkgICAgZmxhZ3MpOworICAgIH0gZWxzZSB7CisJc3RhdHVzID0gcGpfYWN0aXZlc29ja19zZW5kdG8oc3NvY2stPmFzb2NrLCAmd2RhdGEtPmtleSwgCisJCQkJICAgICAgd2RhdGEtPmRhdGEuY29udGVudCwgJmxlbiwKKwkJCQkgICAgICBmbGFncywKKwkJCQkgICAgICAocGpfc29ja2FkZHJfdCopJnNzb2NrLT5yZW1fYWRkciwKKwkJCQkgICAgICBzc29jay0+YWRkcl9sZW4pOworICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gUEpfRVBFTkRJTkcpIHsKKwkvKiBXaGVuIHRoZSBzZW5kaW5nIGlzIG5vdCBwZW5kaW5nLCByZW1vdmUgdGhlIHdkYXRhIGZyb20gc2VuZAorCSAqIHBlbmRpbmcgbGlzdC4KKwkgKi8KKwlwal9sb2NrX2FjcXVpcmUoc3NvY2stPndyaXRlX211dGV4KTsKKwlmcmVlX3NlbmRfZGF0YShzc29jaywgd2RhdGEpOworCXBqX2xvY2tfcmVsZWFzZShzc29jay0+d3JpdGVfbXV0ZXgpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIHZvaWQgb25fdGltZXIocGpfdGltZXJfaGVhcF90ICp0aCwgc3RydWN0IHBqX3RpbWVyX2VudHJ5ICp0ZSkKK3sKKyAgICBwal9zc2xfc29ja190ICpzc29jayA9IChwal9zc2xfc29ja190Kil0ZS0+dXNlcl9kYXRhOworICAgIGludCB0aW1lcl9pZCA9IHRlLT5pZDsKKworICAgIHRlLT5pZCA9IFRJTUVSX05PTkU7CisKKyAgICBQSl9VTlVTRURfQVJHKHRoKTsKKworICAgIHN3aXRjaCAodGltZXJfaWQpIHsKKyAgICBjYXNlIFRJTUVSX0hBTkRTSEFLRV9USU1FT1VUOgorCVBKX0xPRygxLChzc29jay0+cG9vbC0+b2JqX25hbWUsICJTU0wgdGltZW91dCBhZnRlciAlZC4lZHMiLAorCQkgIHNzb2NrLT5wYXJhbS50aW1lb3V0LnNlYywgc3NvY2stPnBhcmFtLnRpbWVvdXQubXNlYykpOworCisJb25faGFuZHNoYWtlX2NvbXBsZXRlKHNzb2NrLCBQSl9FVElNRURPVVQpOworCWJyZWFrOworICAgIGNhc2UgVElNRVJfQ0xPU0U6CisJcGpfc3NsX3NvY2tfY2xvc2Uoc3NvY2spOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcGpfYXNzZXJ0KCEiVW5rbm93biB0aW1lciIpOworCWJyZWFrOworICAgIH0KK30KKworCisvKiBBc3luY2hyb25vdXNlIGhhbmRzaGFrZSAqLworc3RhdGljIHBqX3N0YXR1c190IGRvX2hhbmRzaGFrZShwal9zc2xfc29ja190ICpzc29jaykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgaW50IGVycjsKKworICAgIC8qIFBlcmZvcm0gU1NMIGhhbmRzaGFrZSAqLworICAgIHBqX2xvY2tfYWNxdWlyZShzc29jay0+d3JpdGVfbXV0ZXgpOworICAgIGVyciA9IFNTTF9kb19oYW5kc2hha2Uoc3NvY2stPm9zc2xfc3NsKTsKKyAgICBwal9sb2NrX3JlbGVhc2Uoc3NvY2stPndyaXRlX211dGV4KTsKKworICAgIC8qIFNTTF9kb19oYW5kc2hha2UoKSBtYXkgcHV0IHNvbWUgcGVuZGluZyBkYXRhIGludG8gU1NMIHdyaXRlIEJJTywgCisgICAgICogZmx1c2ggaXQgaWYgYW55LgorICAgICAqLworICAgIHN0YXR1cyA9IGZsdXNoX3dyaXRlX2Jpbyhzc29jaywgJnNzb2NrLT5oYW5kc2hha2Vfb3Bfa2V5LCAwLCAwKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgJiYgc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoZXJyIDwgMCkgeworCWVyciA9IFNTTF9nZXRfZXJyb3Ioc3NvY2stPm9zc2xfc3NsLCBlcnIpOworCWlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQpIAorCXsKKwkgICAgLyogSGFuZHNoYWtlIGZhaWxzICovCisJICAgIHN0YXR1cyA9IFNUQVRVU19GUk9NX1NTTF9FUlIoc3NvY2ssIGVycik7CisJICAgIHJldHVybiBzdGF0dXM7CisJfQorICAgIH0KKworICAgIC8qIENoZWNrIGlmIGhhbmRzaGFrZSBoYXMgYmVlbiBjb21wbGV0ZWQgKi8KKyAgICBpZiAoU1NMX2lzX2luaXRfZmluaXNoZWQoc3NvY2stPm9zc2xfc3NsKSkgeworCXNzb2NrLT5zc2xfc3RhdGUgPSBTU0xfU1RBVEVfRVNUQUJMSVNIRUQ7CisJcmV0dXJuIFBKX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0dXJuIFBKX0VQRU5ESU5HOworfQorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWN0aXZlIHNvY2tldCBjYWxsYmFja3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyBwal9ib29sX3QgYXNvY2tfb25fZGF0YV9yZWFkIChwal9hY3RpdmVzb2NrX3QgKmFzb2NrLAorCQkJCSAgICAgdm9pZCAqZGF0YSwKKwkJCQkgICAgIHBqX3NpemVfdCBzaXplLAorCQkJCSAgICAgcGpfc3RhdHVzX3Qgc3RhdHVzLAorCQkJCSAgICAgcGpfc2l6ZV90ICpyZW1haW5kZXIpCit7CisgICAgcGpfc3NsX3NvY2tfdCAqc3NvY2sgPSAocGpfc3NsX3NvY2tfdCopCisJCQkgICBwal9hY3RpdmVzb2NrX2dldF91c2VyX2RhdGEoYXNvY2spOworICAgIHBqX3NpemVfdCBud3JpdHRlbjsKKworICAgIC8qIFNvY2tldCBlcnJvciBvciBjbG9zZWQgKi8KKyAgICBpZiAoZGF0YSAmJiBzaXplID4gMCkgeworCS8qIENvbnN1bWUgdGhlIHdob2xlIGRhdGEgKi8KKwlud3JpdHRlbiA9IEJJT193cml0ZShzc29jay0+b3NzbF9yYmlvLCBkYXRhLCAoaW50KXNpemUpOworCWlmIChud3JpdHRlbiA8IHNpemUpIHsKKwkgICAgc3RhdHVzID0gR0VUX1NTTF9TVEFUVVMoc3NvY2spOworCSAgICBnb3RvIG9uX2Vycm9yOworCX0KKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBTU0wgaGFuZHNoYWtlIGhhc24ndCBmaW5pc2hlZCB5ZXQgKi8KKyAgICBpZiAoc3NvY2stPnNzbF9zdGF0ZSA9PSBTU0xfU1RBVEVfSEFORFNIQUtJTkcpIHsKKwlwal9ib29sX3QgcmV0ID0gUEpfVFJVRTsKKworCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwkgICAgc3RhdHVzID0gZG9faGFuZHNoYWtlKHNzb2NrKTsKKworCS8qIE5vdCBwZW5kaW5nIGlzIGVpdGhlciBzdWNjZXNzIG9yIGZhaWxlZCAqLworCWlmIChzdGF0dXMgIT0gUEpfRVBFTkRJTkcpCisJICAgIHJldCA9IG9uX2hhbmRzaGFrZV9jb21wbGV0ZShzc29jaywgc3RhdHVzKTsKKworCXJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogU2VlIGlmIHRoZXJlIGlzIGFueSBkZWNyeXB0ZWQgZGF0YSBmb3IgdGhlIGFwcGxpY2F0aW9uICovCisgICAgaWYgKHNzb2NrLT5yZWFkX3N0YXJ0ZWQpIHsKKwlkbyB7CisJICAgIHJlYWRfZGF0YV90ICpidWYgPSAqKE9GRlNFVF9PRl9SRUFEX0RBVEFfUFRSKHNzb2NrLCBkYXRhKSk7CisJICAgIHZvaWQgKmRhdGFfID0gKHBqX2ludDhfdCopYnVmLT5kYXRhICsgYnVmLT5sZW47CisJICAgIGludCBzaXplXyA9IChpbnQpKHNzb2NrLT5yZWFkX3NpemUgLSBidWYtPmxlbik7CisKKwkgICAgLyogU1NMX3JlYWQoKSBtYXkgd3JpdGUgc29tZSBkYXRhIHRvIEJJTyB3cml0ZSB3aGVuIHJlLW5lZ290aWF0aW9uCisJICAgICAqIGlzIG9uIHByb2dyZXNzLCBzbyBsZXQncyBwcm90ZWN0IGl0IHdpdGggd3JpdGUgbXV0ZXguCisJICAgICAqLworCSAgICBwal9sb2NrX2FjcXVpcmUoc3NvY2stPndyaXRlX211dGV4KTsKKwkgICAgc2l6ZV8gPSBTU0xfcmVhZChzc29jay0+b3NzbF9zc2wsIGRhdGFfLCBzaXplXyk7CisJICAgIHBqX2xvY2tfcmVsZWFzZShzc29jay0+d3JpdGVfbXV0ZXgpOworCisJICAgIGlmIChzaXplXyA+IDAgfHwgc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkJaWYgKHNzb2NrLT5wYXJhbS5jYi5vbl9kYXRhX3JlYWQpIHsKKwkJICAgIHBqX2Jvb2xfdCByZXQ7CisJCSAgICBwal9zaXplX3QgcmVtYWluZGVyXyA9IDA7CisKKwkJICAgIGlmIChzaXplXyA+IDApCisJCQlidWYtPmxlbiArPSBzaXplXzsKKyAgICAJCQorCQkgICAgcmV0ID0gKCpzc29jay0+cGFyYW0uY2Iub25fZGF0YV9yZWFkKShzc29jaywgYnVmLT5kYXRhLAorCQkJCQkJCSAgYnVmLT5sZW4sIHN0YXR1cywKKwkJCQkJCQkgICZyZW1haW5kZXJfKTsKKwkJICAgIGlmICghcmV0KSB7CisJCQkvKiBXZSd2ZSBiZWVuIGRlc3Ryb3llZCAqLworCQkJcmV0dXJuIFBKX0ZBTFNFOworCQkgICAgfQorCisJCSAgICAvKiBBcHBsaWNhdGlvbiBtYXkgaGF2ZSBsZWZ0IHNvbWUgZGF0YSB0byBiZSBjb25zdW1lZCAKKwkJICAgICAqIGxhdGVyLgorCQkgICAgICovCisJCSAgICBidWYtPmxlbiA9IHJlbWFpbmRlcl87CisJCX0KKworCQkvKiBBY3RpdmUgc29ja2V0IHNpZ25hbGxlZCBjb25uZWN0aW9uIGNsb3NlZC9lcnJvciwgdGhpcyBoYXMKKwkJICogYmVlbiBzaWduYWxsZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGFsb25nIHdpdGggYW55IHJlbWFpbmluZworCQkgKiBidWZmZXIuIFNvLCBsZXQncyBqdXN0IHJlc2V0IFNTTCBzb2NrZXQgbm93LgorCQkgKi8KKwkJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCSAgICByZXNldF9zc2xfc29ja19zdGF0ZShzc29jayk7CisJCSAgICByZXR1cm4gUEpfRkFMU0U7CisJCX0KKworCSAgICB9IGVsc2UgeworCisJCWludCBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNzb2NrLT5vc3NsX3NzbCwgKGludClzaXplKTsKKwkJCisJCS8qIFNTTCBtaWdodCBqdXN0IHJldHVybiBTU0xfRVJST1JfV0FOVF9SRUFEIGluIAorCQkgKiByZS1uZWdvdGlhdGlvbi4KKwkJICovCisJCWlmIChlcnIgIT0gU1NMX0VSUk9SX05PTkUgJiYgZXJyICE9IFNTTF9FUlJPUl9XQU5UX1JFQUQpCisJCXsKKwkJICAgIC8qIFJlc2V0IFNTTCBzb2NrZXQgc3RhdGUsIHRoZW4gcmV0dXJuIFBKX0ZBTFNFICovCisJCSAgICBzdGF0dXMgPSBTVEFUVVNfRlJPTV9TU0xfRVJSKHNzb2NrLCBlcnIpOworCQkgICAgcmVzZXRfc3NsX3NvY2tfc3RhdGUoc3NvY2spOworCQkgICAgZ290byBvbl9lcnJvcjsKKwkJfQorCisJCXN0YXR1cyA9IGRvX2hhbmRzaGFrZShzc29jayk7CisJCWlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCQkgICAgLyogUmVuZWdvdGlhdGlvbiBjb21wbGV0ZWQgKi8KKworCQkgICAgLyogVXBkYXRlIGNlcnRpZmljYXRlcyAqLworCQkgICAgdXBkYXRlX2NlcnRzX2luZm8oc3NvY2spOworCisJCSAgICAvLyBUaWNrZXQgIzE1NzM6IERvbid0IGhvbGQgbXV0ZXggd2hpbGUgY2FsbGluZworCQkgICAgLy8gICAgICAgICAgICAgICBQSkxJQiBzb2NrZXQgc2VuZCgpLiAKKwkJICAgIC8vcGpfbG9ja19hY3F1aXJlKHNzb2NrLT53cml0ZV9tdXRleCk7CisJCSAgICBzdGF0dXMgPSBmbHVzaF9kZWxheWVkX3NlbmQoc3NvY2spOworCQkgICAgLy9wal9sb2NrX3JlbGVhc2Uoc3NvY2stPndyaXRlX211dGV4KTsKKworCQkgICAgLyogSWYgZmx1c2hpbmcgaXMgb25nb2luZywgdHJlYXQgaXQgYXMgc3VjY2VzcyAqLworCQkgICAgaWYgKHN0YXR1cyA9PSBQSl9FQlVTWSkKKwkJCXN0YXR1cyA9IFBKX1NVQ0NFU1M7CisKKwkJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gUEpfRVBFTkRJTkcpIHsKKwkJCVBKX1BFUlJPUigxLChzc29jay0+cG9vbC0+b2JqX25hbWUsIHN0YXR1cywgCisJCQkJICAgICAiRmFpbGVkIHRvIGZsdXNoIGRlbGF5ZWQgc2VuZCIpKTsKKwkJCWdvdG8gb25fZXJyb3I7CisJCSAgICB9CisJCX0gZWxzZSBpZiAoc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisJCSAgICBQSl9QRVJST1IoMSwoc3NvY2stPnBvb2wtPm9ial9uYW1lLCBzdGF0dXMsIAorCQkJICAgICAgICAgIlJlbmVnb3RpYXRpb24gZmFpbGVkIikpOworCQkgICAgZ290byBvbl9lcnJvcjsKKwkJfQorCisJCWJyZWFrOworCSAgICB9CisJfSB3aGlsZSAoMSk7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1RSVUU7CisKK29uX2Vycm9yOgorICAgIGlmIChzc29jay0+c3NsX3N0YXRlID09IFNTTF9TVEFURV9IQU5EU0hBS0lORykKKwlyZXR1cm4gb25faGFuZHNoYWtlX2NvbXBsZXRlKHNzb2NrLCBzdGF0dXMpOworCisgICAgaWYgKHNzb2NrLT5yZWFkX3N0YXJ0ZWQgJiYgc3NvY2stPnBhcmFtLmNiLm9uX2RhdGFfcmVhZCkgeworCXBqX2Jvb2xfdCByZXQ7CisJcmV0ID0gKCpzc29jay0+cGFyYW0uY2Iub25fZGF0YV9yZWFkKShzc29jaywgTlVMTCwgMCwgc3RhdHVzLAorCQkJCQkgICAgICByZW1haW5kZXIpOworCWlmICghcmV0KSB7CisJICAgIC8qIFdlJ3ZlIGJlZW4gZGVzdHJveWVkICovCisJICAgIHJldHVybiBQSl9GQUxTRTsKKwl9CisgICAgfQorCisgICAgcmVzZXRfc3NsX3NvY2tfc3RhdGUoc3NvY2spOworICAgIHJldHVybiBQSl9GQUxTRTsKK30KKworCitzdGF0aWMgcGpfYm9vbF90IGFzb2NrX29uX2RhdGFfc2VudCAocGpfYWN0aXZlc29ja190ICphc29jaywKKwkJCQkgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKnNlbmRfa2V5LAorCQkJCSAgICAgcGpfc3NpemVfdCBzZW50KQoreworICAgIHBqX3NzbF9zb2NrX3QgKnNzb2NrID0gKHBqX3NzbF9zb2NrX3QqKQorCQkJICAgcGpfYWN0aXZlc29ja19nZXRfdXNlcl9kYXRhKGFzb2NrKTsKKworICAgIFBKX1VOVVNFRF9BUkcoc2VuZF9rZXkpOworICAgIFBKX1VOVVNFRF9BUkcoc2VudCk7CisKKyAgICBpZiAoc3NvY2stPnNzbF9zdGF0ZSA9PSBTU0xfU1RBVEVfSEFORFNIQUtJTkcpIHsKKwkvKiBJbml0aWFsIGhhbmRzaGFraW5nICovCisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCQorCXN0YXR1cyA9IGRvX2hhbmRzaGFrZShzc29jayk7CisJLyogTm90IHBlbmRpbmcgaXMgZWl0aGVyIHN1Y2Nlc3Mgb3IgZmFpbGVkICovCisJaWYgKHN0YXR1cyAhPSBQSl9FUEVORElORykKKwkgICAgcmV0dXJuIG9uX2hhbmRzaGFrZV9jb21wbGV0ZShzc29jaywgc3RhdHVzKTsKKworICAgIH0gZWxzZSBpZiAoc2VuZF9rZXkgIT0gJnNzb2NrLT5oYW5kc2hha2Vfb3Bfa2V5KSB7CisJLyogU29tZSBkYXRhIGhhcyBiZWVuIHNlbnQsIG5vdGlmeSBhcHBsaWNhdGlvbiAqLworCXdyaXRlX2RhdGFfdCAqd2RhdGEgPSAod3JpdGVfZGF0YV90KilzZW5kX2tleS0+dXNlcl9kYXRhOworCWlmIChzc29jay0+cGFyYW0uY2Iub25fZGF0YV9zZW50KSB7CisJICAgIHBqX2Jvb2xfdCByZXQ7CisJICAgIHBqX3NzaXplX3Qgc2VudF9sZW47CisKKwkgICAgc2VudF9sZW4gPSAoc2VudCA+IDApPyB3ZGF0YS0+cGxhaW5fZGF0YV9sZW4gOiBzZW50OworCSAgICByZXQgPSAoKnNzb2NrLT5wYXJhbS5jYi5vbl9kYXRhX3NlbnQpKHNzb2NrLCB3ZGF0YS0+YXBwX2tleSwgCisJCQkJCQkgIHNlbnRfbGVuKTsKKwkgICAgaWYgKCFyZXQpIHsKKwkJLyogV2UndmUgYmVlbiBkZXN0cm95ZWQgKi8KKwkJcmV0dXJuIFBKX0ZBTFNFOworCSAgICB9CisJfQorCisJLyogVXBkYXRlIHdyaXRlIGJ1ZmZlciBzdGF0ZSAqLworCXBqX2xvY2tfYWNxdWlyZShzc29jay0+d3JpdGVfbXV0ZXgpOworCWZyZWVfc2VuZF9kYXRhKHNzb2NrLCB3ZGF0YSk7CisJcGpfbG9ja19yZWxlYXNlKHNzb2NrLT53cml0ZV9tdXRleCk7CisKKyAgICB9IGVsc2UgeworCS8qIFNTTCByZS1uZWdvdGlhdGlvbiBpcyBvbi1wcm9ncmVzcywganVzdCBkbyBub3RoaW5nICovCisgICAgfQorCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKKworc3RhdGljIHBqX2Jvb2xfdCBhc29ja19vbl9hY2NlcHRfY29tcGxldGUgKHBqX2FjdGl2ZXNvY2tfdCAqYXNvY2ssCisJCQkJCSAgIHBqX3NvY2tfdCBuZXdzb2NrLAorCQkJCQkgICBjb25zdCBwal9zb2NrYWRkcl90ICpzcmNfYWRkciwKKwkJCQkJICAgaW50IHNyY19hZGRyX2xlbikKK3sKKyAgICBwal9zc2xfc29ja190ICpzc29ja19wYXJlbnQgPSAocGpfc3NsX3NvY2tfdCopCisJCQkJICBwal9hY3RpdmVzb2NrX2dldF91c2VyX2RhdGEoYXNvY2spOworICAgIHBqX3NzbF9zb2NrX3QgKnNzb2NrOworICAgIHBqX2FjdGl2ZXNvY2tfY2IgYXNvY2tfY2I7CisgICAgcGpfYWN0aXZlc29ja19jZmcgYXNvY2tfY2ZnOworICAgIHVuc2lnbmVkIGk7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfVU5VU0VEX0FSRyhzcmNfYWRkcl9sZW4pOworCisgICAgLyogQ3JlYXRlIG5ldyBTU0wgc29ja2V0IGluc3RhbmNlICovCisgICAgc3RhdHVzID0gcGpfc3NsX3NvY2tfY3JlYXRlKHNzb2NrX3BhcmVudC0+cG9vbCwgJnNzb2NrX3BhcmVudC0+cGFyYW0sCisJCQkJJnNzb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICAvKiBVcGRhdGUgbmV3IFNTTCBzb2NrZXQgYXR0cmlidXRlcyAqLworICAgIHNzb2NrLT5zb2NrID0gbmV3c29jazsKKyAgICBzc29jay0+cGFyZW50ID0gc3NvY2tfcGFyZW50OworICAgIHNzb2NrLT5pc19zZXJ2ZXIgPSBQSl9UUlVFOworICAgIGlmIChzc29ja19wYXJlbnQtPmNlcnQpIHsKKwlzdGF0dXMgPSBwal9zc2xfc29ja19zZXRfY2VydGlmaWNhdGUoc3NvY2ssIHNzb2NrLT5wb29sLCAKKwkJCQkJICAgICBzc29ja19wYXJlbnQtPmNlcnQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogQXBwbHkgUW9TLCBpZiBzcGVjaWZpZWQgKi8KKyAgICBzdGF0dXMgPSBwal9zb2NrX2FwcGx5X3FvczIoc3NvY2stPnNvY2ssIHNzb2NrLT5wYXJhbS5xb3NfdHlwZSwKKwkJCQkmc3NvY2stPnBhcmFtLnFvc19wYXJhbXMsIDEsIAorCQkJCXNzb2NrLT5wb29sLT5vYmpfbmFtZSwgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTICYmICFzc29jay0+cGFyYW0ucW9zX2lnbm9yZV9lcnJvcikKKwlnb3RvIG9uX3JldHVybjsKKworICAgIC8qIFVwZGF0ZSBsb2NhbCBhZGRyZXNzICovCisgICAgc3NvY2stPmFkZHJfbGVuID0gc3JjX2FkZHJfbGVuOworICAgIHN0YXR1cyA9IHBqX3NvY2tfZ2V0c29ja25hbWUoc3NvY2stPnNvY2ssICZzc29jay0+bG9jYWxfYWRkciwgCisJCQkJICZzc29jay0+YWRkcl9sZW4pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCS8qIFRoaXMgZmFpbHMgb24gZmV3IGVudnMsIGUuZzogd2luIElPQ1AsIGp1c3QgdG9sZXJhdGUgdGhpcyBhbmQKKwkgKiB1c2UgcGFyZW50IGxvY2FsIGFkZHJlc3MgaW5zdGVhZC4KKwkgKi8KKwlwal9zb2NrYWRkcl9jcCgmc3NvY2stPmxvY2FsX2FkZHIsICZzc29ja19wYXJlbnQtPmxvY2FsX2FkZHIpOworICAgIH0KKworICAgIC8qIFNldCByZW1vdGUgYWRkcmVzcyAqLworICAgIHBqX3NvY2thZGRyX2NwKCZzc29jay0+cmVtX2FkZHIsIHNyY19hZGRyKTsKKworICAgIC8qIENyZWF0ZSBTU0wgY29udGV4dCAqLworICAgIHN0YXR1cyA9IGNyZWF0ZV9zc2woc3NvY2spOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX3JldHVybjsKKworICAgIC8qIFByZXBhcmUgcmVhZCBidWZmZXIgKi8KKyAgICBzc29jay0+YXNvY2tfcmJ1ZiA9ICh2b2lkKiopcGpfcG9vbF9jYWxsb2Moc3NvY2stPnBvb2wsIAorCQkJCQkgICAgICAgc3NvY2stPnBhcmFtLmFzeW5jX2NudCwKKwkJCQkJICAgICAgIHNpemVvZih2b2lkKikpOworICAgIGZvciAoaSA9IDA7IGk8c3NvY2stPnBhcmFtLmFzeW5jX2NudDsgKytpKSB7CisJc3NvY2stPmFzb2NrX3JidWZbaV0gPSAodm9pZCopIHBqX3Bvb2xfYWxsb2MoCisJCQkJCSAgICBzc29jay0+cG9vbCwgCisJCQkJCSAgICBzc29jay0+cGFyYW0ucmVhZF9idWZmZXJfc2l6ZSArIAorCQkJCQkgICAgc2l6ZW9mKHJlYWRfZGF0YV90KikpOworICAgIH0KKworICAgIC8qIENyZWF0ZSBhY3RpdmUgc29ja2V0ICovCisgICAgcGpfYWN0aXZlc29ja19jZmdfZGVmYXVsdCgmYXNvY2tfY2ZnKTsKKyAgICBhc29ja19jZmcuYXN5bmNfY250ID0gc3NvY2stPnBhcmFtLmFzeW5jX2NudDsKKyAgICBhc29ja19jZmcuY29uY3VycmVuY3kgPSBzc29jay0+cGFyYW0uY29uY3VycmVuY3k7CisgICAgYXNvY2tfY2ZnLndob2xlX2RhdGEgPSBQSl9UUlVFOworCisgICAgcGpfYnplcm8oJmFzb2NrX2NiLCBzaXplb2YoYXNvY2tfY2IpKTsKKyAgICBhc29ja19jYi5vbl9kYXRhX3JlYWQgPSBhc29ja19vbl9kYXRhX3JlYWQ7CisgICAgYXNvY2tfY2Iub25fZGF0YV9zZW50ID0gYXNvY2tfb25fZGF0YV9zZW50OworCisgICAgc3RhdHVzID0gcGpfYWN0aXZlc29ja19jcmVhdGUoc3NvY2stPnBvb2wsCisJCQkJICBzc29jay0+c29jaywgCisJCQkJICBzc29jay0+cGFyYW0uc29ja190eXBlLAorCQkJCSAgJmFzb2NrX2NmZywKKwkJCQkgIHNzb2NrLT5wYXJhbS5pb3F1ZXVlLCAKKwkJCQkgICZhc29ja19jYiwKKwkJCQkgIHNzb2NrLAorCQkJCSAgJnNzb2NrLT5hc29jayk7CisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICAvKiBTdGFydCByZWFkICovCisgICAgc3RhdHVzID0gcGpfYWN0aXZlc29ja19zdGFydF9yZWFkMihzc29jay0+YXNvY2ssIHNzb2NrLT5wb29sLCAKKwkJCQkgICAgICAgKHVuc2lnbmVkKXNzb2NrLT5wYXJhbS5yZWFkX2J1ZmZlcl9zaXplLAorCQkJCSAgICAgICBzc29jay0+YXNvY2tfcmJ1ZiwKKwkJCQkgICAgICAgUEpfSU9RVUVVRV9BTFdBWVNfQVNZTkMpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX3JldHVybjsKKworICAgIC8qIFByZXBhcmUgd3JpdGUvc2VuZCBzdGF0ZSAqLworICAgIHBqX2Fzc2VydChzc29jay0+c2VuZF9idWYubWF4X2xlbiA9PSAwKTsKKyAgICBzc29jay0+c2VuZF9idWYuYnVmID0gKGNoYXIqKQorCQkJICBwal9wb29sX2FsbG9jKHNzb2NrLT5wb29sLCAKKwkJCQkJc3NvY2stPnBhcmFtLnNlbmRfYnVmZmVyX3NpemUpOworICAgIHNzb2NrLT5zZW5kX2J1Zi5tYXhfbGVuID0gc3NvY2stPnBhcmFtLnNlbmRfYnVmZmVyX3NpemU7CisgICAgc3NvY2stPnNlbmRfYnVmLnN0YXJ0ID0gc3NvY2stPnNlbmRfYnVmLmJ1ZjsKKyAgICBzc29jay0+c2VuZF9idWYubGVuID0gMDsKKworICAgIC8qIFN0YXJ0IGhhbmRzaGFrZSB0aW1lciAqLworICAgIGlmIChzc29jay0+cGFyYW0udGltZXJfaGVhcCAmJiAoc3NvY2stPnBhcmFtLnRpbWVvdXQuc2VjICE9IDAgfHwKKwlzc29jay0+cGFyYW0udGltZW91dC5tc2VjICE9IDApKQorICAgIHsKKwlwal9hc3NlcnQoc3NvY2stPnRpbWVyLmlkID09IFRJTUVSX05PTkUpOworCXNzb2NrLT50aW1lci5pZCA9IFRJTUVSX0hBTkRTSEFLRV9USU1FT1VUOworCXN0YXR1cyA9IHBqX3RpbWVyX2hlYXBfc2NoZWR1bGUoc3NvY2stPnBhcmFtLnRpbWVyX2hlYXAsIAorCQkJCSAgICAgICAgJnNzb2NrLT50aW1lciwKKwkJCQkJJnNzb2NrLT5wYXJhbS50aW1lb3V0KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHNzb2NrLT50aW1lci5pZCA9IFRJTUVSX05PTkU7CisgICAgfQorCisgICAgLyogU3RhcnQgU1NMIGhhbmRzaGFrZSAqLworICAgIHNzb2NrLT5zc2xfc3RhdGUgPSBTU0xfU1RBVEVfSEFORFNIQUtJTkc7CisgICAgU1NMX3NldF9hY2NlcHRfc3RhdGUoc3NvY2stPm9zc2xfc3NsKTsKKyAgICBzdGF0dXMgPSBkb19oYW5kc2hha2Uoc3NvY2spOworCitvbl9yZXR1cm46CisgICAgaWYgKHNzb2NrICYmIHN0YXR1cyAhPSBQSl9FUEVORElORykKKwlvbl9oYW5kc2hha2VfY29tcGxldGUoc3NvY2ssIHN0YXR1cyk7CisKKyAgICAvKiBNdXN0IHJldHVybiBQSl9UUlVFIHdoYXRldmVyIGhhcHBlbmVkLCBhcyBhY3RpdmUgc29ja2V0IG11c3QgCisgICAgICogY29udGludWUgbGlzdGVuaW5nLgorICAgICAqLworICAgIHJldHVybiBQSl9UUlVFOworfQorCisKK3N0YXRpYyBwal9ib29sX3QgYXNvY2tfb25fY29ubmVjdF9jb21wbGV0ZSAocGpfYWN0aXZlc29ja190ICphc29jaywKKwkJCQkJICAgIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBwal9zc2xfc29ja190ICpzc29jayA9IChwal9zc2xfc29ja190KikKKwkJCSAgIHBqX2FjdGl2ZXNvY2tfZ2V0X3VzZXJfZGF0YShhc29jayk7CisgICAgdW5zaWduZWQgaTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX3JldHVybjsKKworICAgIC8qIFVwZGF0ZSBsb2NhbCBhZGRyZXNzICovCisgICAgc3NvY2stPmFkZHJfbGVuID0gc2l6ZW9mKHBqX3NvY2thZGRyKTsKKyAgICBzdGF0dXMgPSBwal9zb2NrX2dldHNvY2tuYW1lKHNzb2NrLT5zb2NrLCAmc3NvY2stPmxvY2FsX2FkZHIsIAorCQkJCSAmc3NvY2stPmFkZHJfbGVuKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICAvKiBDcmVhdGUgU1NMIGNvbnRleHQgKi8KKyAgICBzdGF0dXMgPSBjcmVhdGVfc3NsKHNzb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9yZXR1cm47CisKKyAgICAvKiBQcmVwYXJlIHJlYWQgYnVmZmVyICovCisgICAgc3NvY2stPmFzb2NrX3JidWYgPSAodm9pZCoqKXBqX3Bvb2xfY2FsbG9jKHNzb2NrLT5wb29sLCAKKwkJCQkJICAgICAgIHNzb2NrLT5wYXJhbS5hc3luY19jbnQsCisJCQkJCSAgICAgICBzaXplb2Yodm9pZCopKTsKKyAgICBmb3IgKGkgPSAwOyBpPHNzb2NrLT5wYXJhbS5hc3luY19jbnQ7ICsraSkgeworCXNzb2NrLT5hc29ja19yYnVmW2ldID0gKHZvaWQqKSBwal9wb29sX2FsbG9jKAorCQkJCQkgICAgc3NvY2stPnBvb2wsIAorCQkJCQkgICAgc3NvY2stPnBhcmFtLnJlYWRfYnVmZmVyX3NpemUgKyAKKwkJCQkJICAgIHNpemVvZihyZWFkX2RhdGFfdCopKTsKKyAgICB9CisKKyAgICAvKiBTdGFydCByZWFkICovCisgICAgc3RhdHVzID0gcGpfYWN0aXZlc29ja19zdGFydF9yZWFkMihzc29jay0+YXNvY2ssIHNzb2NrLT5wb29sLCAKKwkJCQkgICAgICAgKHVuc2lnbmVkKXNzb2NrLT5wYXJhbS5yZWFkX2J1ZmZlcl9zaXplLAorCQkJCSAgICAgICBzc29jay0+YXNvY2tfcmJ1ZiwKKwkJCQkgICAgICAgUEpfSU9RVUVVRV9BTFdBWVNfQVNZTkMpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX3JldHVybjsKKworICAgIC8qIFByZXBhcmUgd3JpdGUvc2VuZCBzdGF0ZSAqLworICAgIHBqX2Fzc2VydChzc29jay0+c2VuZF9idWYubWF4X2xlbiA9PSAwKTsKKyAgICBzc29jay0+c2VuZF9idWYuYnVmID0gKGNoYXIqKQorCQkJICAgICBwal9wb29sX2FsbG9jKHNzb2NrLT5wb29sLCAKKwkJCQkJICAgc3NvY2stPnBhcmFtLnNlbmRfYnVmZmVyX3NpemUpOworICAgIHNzb2NrLT5zZW5kX2J1Zi5tYXhfbGVuID0gc3NvY2stPnBhcmFtLnNlbmRfYnVmZmVyX3NpemU7CisgICAgc3NvY2stPnNlbmRfYnVmLnN0YXJ0ID0gc3NvY2stPnNlbmRfYnVmLmJ1ZjsKKyAgICBzc29jay0+c2VuZF9idWYubGVuID0gMDsKKworI2lmZGVmIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZQorICAgIC8qIFNldCBzZXJ2ZXIgbmFtZSB0byBjb25uZWN0ICovCisgICAgaWYgKHNzb2NrLT5wYXJhbS5zZXJ2ZXJfbmFtZS5zbGVuKSB7CisJLyogU2VydmVyIG5hbWUgaXMgbnVsbCB0ZXJtaW5hdGVkIGFscmVhZHkgKi8KKwlpZiAoIVNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShzc29jay0+b3NzbF9zc2wsIAorCQkJCSAgICAgIHNzb2NrLT5wYXJhbS5zZXJ2ZXJfbmFtZS5wdHIpKQorCXsKKwkgICAgY2hhciBlcnJfc3RyW1BKX0VSUl9NU0dfU0laRV07CisKKwkgICAgRVJSX2Vycm9yX3N0cmluZ19uKEVSUl9nZXRfZXJyb3IoKSwgZXJyX3N0ciwgc2l6ZW9mKGVycl9zdHIpKTsKKwkgICAgUEpfTE9HKDMsKHNzb2NrLT5wb29sLT5vYmpfbmFtZSwgIlNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpICIKKwkJImZhaWxlZDogJXMiLCBlcnJfc3RyKSk7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogU3RhcnQgU1NMIGhhbmRzaGFrZSAqLworICAgIHNzb2NrLT5zc2xfc3RhdGUgPSBTU0xfU1RBVEVfSEFORFNIQUtJTkc7CisgICAgU1NMX3NldF9jb25uZWN0X3N0YXRlKHNzb2NrLT5vc3NsX3NzbCk7CisKKyAgICBzdGF0dXMgPSBkb19oYW5kc2hha2Uoc3NvY2spOworICAgIGlmIChzdGF0dXMgIT0gUEpfRVBFTkRJTkcpCisJZ290byBvbl9yZXR1cm47CisKKyAgICByZXR1cm4gUEpfVFJVRTsKKworb25fcmV0dXJuOgorICAgIHJldHVybiBvbl9oYW5kc2hha2VfY29tcGxldGUoc3NvY2ssIHN0YXR1cyk7Cit9CisKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBMb2FkIGNyZWRlbnRpYWxzIGZyb20gZmlsZXMuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9jZXJ0X2xvYWRfZnJvbV9maWxlcyAocGpfcG9vbF90ICpwb29sLAorCQkJCQkJIGNvbnN0IHBqX3N0cl90ICpDQV9maWxlLAorCQkJCQkJIGNvbnN0IHBqX3N0cl90ICpjZXJ0X2ZpbGUsCisJCQkJCQkgY29uc3QgcGpfc3RyX3QgKnByaXZrZXlfZmlsZSwKKwkJCQkJCSBjb25zdCBwal9zdHJfdCAqcHJpdmtleV9wYXNzLAorCQkJCQkJIHBqX3NzbF9jZXJ0X3QgKipwX2NlcnQpCit7CisgICAgcGpfc3NsX2NlcnRfdCAqY2VydDsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4ocG9vbCAmJiBDQV9maWxlICYmIGNlcnRfZmlsZSAmJiBwcml2a2V5X2ZpbGUsIFBKX0VJTlZBTCk7CisKKyAgICBjZXJ0ID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBwal9zc2xfY2VydF90KTsKKyAgICBwal9zdHJkdXBfd2l0aF9udWxsKHBvb2wsICZjZXJ0LT5DQV9maWxlLCBDQV9maWxlKTsKKyAgICBwal9zdHJkdXBfd2l0aF9udWxsKHBvb2wsICZjZXJ0LT5jZXJ0X2ZpbGUsIGNlcnRfZmlsZSk7CisgICAgcGpfc3RyZHVwX3dpdGhfbnVsbChwb29sLCAmY2VydC0+cHJpdmtleV9maWxlLCBwcml2a2V5X2ZpbGUpOworICAgIHBqX3N0cmR1cF93aXRoX251bGwocG9vbCwgJmNlcnQtPnByaXZrZXlfcGFzcywgcHJpdmtleV9wYXNzKTsKKworICAgICpwX2NlcnQgPSBjZXJ0OworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyogU2V0IFNTTCBzb2NrZXQgY3JlZGVudGlhbHMuICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9zc2xfc29ja19zZXRfY2VydGlmaWNhdGUoCisJCQkJCSAgICBwal9zc2xfc29ja190ICpzc29jaywKKwkJCQkJICAgIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgIGNvbnN0IHBqX3NzbF9jZXJ0X3QgKmNlcnQpCit7CisgICAgcGpfc3NsX2NlcnRfdCAqY2VydF87CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNzb2NrICYmIHBvb2wgJiYgY2VydCwgUEpfRUlOVkFMKTsKKworICAgIGNlcnRfID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBwal9zc2xfY2VydF90KTsKKyAgICBwal9tZW1jcHkoY2VydF8sIGNlcnQsIHNpemVvZihjZXJ0KSk7CisgICAgcGpfc3RyZHVwX3dpdGhfbnVsbChwb29sLCAmY2VydF8tPkNBX2ZpbGUsICZjZXJ0LT5DQV9maWxlKTsKKyAgICBwal9zdHJkdXBfd2l0aF9udWxsKHBvb2wsICZjZXJ0Xy0+Y2VydF9maWxlLCAmY2VydC0+Y2VydF9maWxlKTsKKyAgICBwal9zdHJkdXBfd2l0aF9udWxsKHBvb2wsICZjZXJ0Xy0+cHJpdmtleV9maWxlLCAmY2VydC0+cHJpdmtleV9maWxlKTsKKyAgICBwal9zdHJkdXBfd2l0aF9udWxsKHBvb2wsICZjZXJ0Xy0+cHJpdmtleV9wYXNzLCAmY2VydC0+cHJpdmtleV9wYXNzKTsKKworICAgIHNzb2NrLT5jZXJ0ID0gY2VydF87CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKiBHZXQgYXZhaWxhYmxlIGNpcGhlcnMuICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9jaXBoZXJfZ2V0X2F2YWlsYWJsZXMocGpfc3NsX2NpcGhlciBjaXBoZXJzW10sCisJCQkJCSAgICAgICAgIHVuc2lnbmVkICpjaXBoZXJfbnVtKQoreworICAgIHVuc2lnbmVkIGk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGNpcGhlcnMgJiYgY2lwaGVyX251bSwgUEpfRUlOVkFMKTsKKworICAgIGlmIChvcGVuc3NsX2NpcGhlcl9udW0gPT0gMCkgeworCWluaXRfb3BlbnNzbCgpOworCXNodXRkb3duX29wZW5zc2woKTsKKyAgICB9CisKKyAgICBpZiAob3BlbnNzbF9jaXBoZXJfbnVtID09IDApIHsKKwkqY2lwaGVyX251bSA9IDA7CisJcmV0dXJuIFBKX0VOT1RGT1VORDsKKyAgICB9CisKKyAgICAqY2lwaGVyX251bSA9IFBKX01JTigqY2lwaGVyX251bSwgb3BlbnNzbF9jaXBoZXJfbnVtKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAqY2lwaGVyX251bTsgKytpKQorCWNpcGhlcnNbaV0gPSBvcGVuc3NsX2NpcGhlcnNbaV0uaWQ7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKiBHZXQgY2lwaGVyIG5hbWUgc3RyaW5nICovCitQSl9ERUYoY29uc3QgY2hhciopIHBqX3NzbF9jaXBoZXJfbmFtZShwal9zc2xfY2lwaGVyIGNpcGhlcikKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgaWYgKG9wZW5zc2xfY2lwaGVyX251bSA9PSAwKSB7CisJaW5pdF9vcGVuc3NsKCk7CisJc2h1dGRvd25fb3BlbnNzbCgpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBvcGVuc3NsX2NpcGhlcl9udW07ICsraSkgeworCWlmIChjaXBoZXIgPT0gb3BlbnNzbF9jaXBoZXJzW2ldLmlkKQorCSAgICByZXR1cm4gb3BlbnNzbF9jaXBoZXJzW2ldLm5hbWU7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgY2lwaGVyIGlzIHN1cHBvcnRlZCBieSBTU0wvVExTIGJhY2tlbmQuICovCitQSl9ERUYocGpfYm9vbF90KSBwal9zc2xfY2lwaGVyX2lzX3N1cHBvcnRlZChwal9zc2xfY2lwaGVyIGNpcGhlcikKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgaWYgKG9wZW5zc2xfY2lwaGVyX251bSA9PSAwKSB7CisJaW5pdF9vcGVuc3NsKCk7CisJc2h1dGRvd25fb3BlbnNzbCgpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBvcGVuc3NsX2NpcGhlcl9udW07ICsraSkgeworCWlmIChjaXBoZXIgPT0gb3BlbnNzbF9jaXBoZXJzW2ldLmlkKQorCSAgICByZXR1cm4gUEpfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfRkFMU0U7Cit9CisKKworLyoKKyAqIENyZWF0ZSBTU0wgc29ja2V0IGluc3RhbmNlLiAKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zc2xfc29ja19jcmVhdGUgKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJY29uc3QgcGpfc3NsX3NvY2tfcGFyYW0gKnBhcmFtLAorCQkJCQlwal9zc2xfc29ja190ICoqcF9zc29jaykKK3sKKyAgICBwal9zc2xfc29ja190ICpzc29jazsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBvb2wgJiYgcGFyYW0gJiYgcF9zc29jaywgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHBhcmFtLT5zb2NrX3R5cGUgPT0gcGpfU09DS19TVFJFQU0oKSwgUEpfRU5PVFNVUCk7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUocG9vbC0+ZmFjdG9yeSwgInNzbCVwIiwgNTEyLCA1MTIsIE5VTEwpOworCisgICAgLyogQ3JlYXRlIHNlY3VyZSBzb2NrZXQgKi8KKyAgICBzc29jayA9IFBKX1BPT0xfWkFMTE9DX1QocG9vbCwgcGpfc3NsX3NvY2tfdCk7CisgICAgc3NvY2stPnBvb2wgPSBwb29sOworICAgIHNzb2NrLT5zb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgc3NvY2stPnNzbF9zdGF0ZSA9IFNTTF9TVEFURV9OVUxMOworICAgIHBqX2xpc3RfaW5pdCgmc3NvY2stPndyaXRlX3BlbmRpbmcpOworICAgIHBqX2xpc3RfaW5pdCgmc3NvY2stPndyaXRlX3BlbmRpbmdfZW1wdHkpOworICAgIHBqX2xpc3RfaW5pdCgmc3NvY2stPnNlbmRfcGVuZGluZyk7CisgICAgcGpfdGltZXJfZW50cnlfaW5pdCgmc3NvY2stPnRpbWVyLCAwLCBzc29jaywgJm9uX3RpbWVyKTsKKyAgICBwal9pb3F1ZXVlX29wX2tleV9pbml0KCZzc29jay0+aGFuZHNoYWtlX29wX2tleSwKKwkJCSAgIHNpemVvZihwal9pb3F1ZXVlX29wX2tleV90KSk7CisKKyAgICAvKiBDcmVhdGUgc2VjdXJlIHNvY2tldCBtdXRleCAqLworICAgIHN0YXR1cyA9IHBqX2xvY2tfY3JlYXRlX3JlY3Vyc2l2ZV9tdXRleChwb29sLCBwb29sLT5vYmpfbmFtZSwKKwkJCQkJICAgICZzc29jay0+d3JpdGVfbXV0ZXgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgLyogSW5pdCBzZWN1cmUgc29ja2V0IHBhcmFtICovCisgICAgc3NvY2stPnBhcmFtID0gKnBhcmFtOworICAgIHNzb2NrLT5wYXJhbS5yZWFkX2J1ZmZlcl9zaXplID0gKChzc29jay0+cGFyYW0ucmVhZF9idWZmZXJfc2l6ZSs3KT4+Myk8PDM7CisgICAgaWYgKHBhcmFtLT5jaXBoZXJzX251bSA+IDApIHsKKwl1bnNpZ25lZCBpOworCXNzb2NrLT5wYXJhbS5jaXBoZXJzID0gKHBqX3NzbF9jaXBoZXIqKQorCQkJICAgICAgIHBqX3Bvb2xfY2FsbG9jKHBvb2wsIHBhcmFtLT5jaXBoZXJzX251bSwgCisJCQkJCSAgICAgIHNpemVvZihwal9zc2xfY2lwaGVyKSk7CisJZm9yIChpID0gMDsgaSA8IHBhcmFtLT5jaXBoZXJzX251bTsgKytpKQorCSAgICBzc29jay0+cGFyYW0uY2lwaGVyc1tpXSA9IHBhcmFtLT5jaXBoZXJzW2ldOworICAgIH0KKworICAgIC8qIFNlcnZlciBuYW1lIG11c3QgYmUgbnVsbC10ZXJtaW5hdGVkICovCisgICAgcGpfc3RyZHVwX3dpdGhfbnVsbChwb29sLCAmc3NvY2stPnBhcmFtLnNlcnZlcl9uYW1lLCAKKwkJCSZwYXJhbS0+c2VydmVyX25hbWUpOworCisgICAgLyogRmluYWxseSAqLworICAgICpwX3Nzb2NrID0gc3NvY2s7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCisvKgorICogQ2xvc2UgdGhlIHNlY3VyZSBzb2NrZXQuIFRoaXMgd2lsbCB1bnJlZ2lzdGVyIHRoZSBzb2NrZXQgZnJvbSB0aGUKKyAqIGlvcXVldWUgYW5kIHVsdGltYXRlbHkgY2xvc2UgdGhlIHNvY2tldC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zc2xfc29ja19jbG9zZShwal9zc2xfc29ja190ICpzc29jaykKK3sKKyAgICBwal9wb29sX3QgKnBvb2w7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNzb2NrLCBQSl9FSU5WQUwpOworCisgICAgaWYgKCFzc29jay0+cG9vbCkKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKworICAgIGlmIChzc29jay0+dGltZXIuaWQgIT0gVElNRVJfTk9ORSkgeworCXBqX3RpbWVyX2hlYXBfY2FuY2VsKHNzb2NrLT5wYXJhbS50aW1lcl9oZWFwLCAmc3NvY2stPnRpbWVyKTsKKwlzc29jay0+dGltZXIuaWQgPSBUSU1FUl9OT05FOworICAgIH0KKworICAgIHJlc2V0X3NzbF9zb2NrX3N0YXRlKHNzb2NrKTsKKyAgICBwal9sb2NrX2Rlc3Ryb3koc3NvY2stPndyaXRlX211dGV4KTsKKyAgICAKKyAgICBwb29sID0gc3NvY2stPnBvb2w7CisgICAgc3NvY2stPnBvb2wgPSBOVUxMOworICAgIGlmIChwb29sKQorCXBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBBc3NvY2lhdGUgYXJiaXRyYXJ5IGRhdGEgd2l0aCB0aGUgc2VjdXJlIHNvY2tldC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zc2xfc29ja19zZXRfdXNlcl9kYXRhKHBqX3NzbF9zb2NrX3QgKnNzb2NrLAorCQkJCQkgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzc29jaywgUEpfRUlOVkFMKTsKKworICAgIHNzb2NrLT5wYXJhbS51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyoKKyAqIFJldHJpZXZlIHRoZSB1c2VyIGRhdGEgcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZWN1cmUKKyAqIHNvY2tldC4KKyAqLworUEpfREVGKHZvaWQqKSBwal9zc2xfc29ja19nZXRfdXNlcl9kYXRhKHBqX3NzbF9zb2NrX3QgKnNzb2NrKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3NvY2ssIE5VTEwpOworCisgICAgcmV0dXJuIHNzb2NrLT5wYXJhbS51c2VyX2RhdGE7Cit9CisKKworLyoKKyAqIFJldHJpZXZlIHRoZSBsb2NhbCBhZGRyZXNzIGFuZCBwb3J0IHVzZWQgYnkgc3BlY2lmaWVkIFNTTCBzb2NrZXQuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3NsX3NvY2tfZ2V0X2luZm8gKHBqX3NzbF9zb2NrX3QgKnNzb2NrLAorCQkJCQkgIHBqX3NzbF9zb2NrX2luZm8gKmluZm8pCit7CisgICAgcGpfYnplcm8oaW5mbywgc2l6ZW9mKCppbmZvKSk7CisKKyAgICAvKiBFc3RhYmxpc2hlZCBmbGFnICovCisgICAgaW5mby0+ZXN0YWJsaXNoZWQgPSAoc3NvY2stPnNzbF9zdGF0ZSA9PSBTU0xfU1RBVEVfRVNUQUJMSVNIRUQpOworCisgICAgLyogUHJvdG9jb2wgKi8KKyAgICBpbmZvLT5wcm90byA9IHNzb2NrLT5wYXJhbS5wcm90bzsKKworICAgIC8qIExvY2FsIGFkZHJlc3MgKi8KKyAgICBwal9zb2NrYWRkcl9jcCgmaW5mby0+bG9jYWxfYWRkciwgJnNzb2NrLT5sb2NhbF9hZGRyKTsKKyAgICAKKyAgICBpZiAoaW5mby0+ZXN0YWJsaXNoZWQpIHsKKwljb25zdCBTU0xfQ0lQSEVSICpjaXBoZXI7CisKKwkvKiBDdXJyZW50IGNpcGhlciAqLworCWNpcGhlciA9IFNTTF9nZXRfY3VycmVudF9jaXBoZXIoc3NvY2stPm9zc2xfc3NsKTsKKwlpbmZvLT5jaXBoZXIgPSAoY2lwaGVyLT5pZCAmIDB4MDBGRkZGRkYpOworCisJLyogUmVtb3RlIGFkZHJlc3MgKi8KKwlwal9zb2NrYWRkcl9jcCgmaW5mby0+cmVtb3RlX2FkZHIsICZzc29jay0+cmVtX2FkZHIpOworCisJLyogQ2VydGlmaWNhdGVzIGluZm8gKi8KKwlpbmZvLT5sb2NhbF9jZXJ0X2luZm8gPSAmc3NvY2stPmxvY2FsX2NlcnRfaW5mbzsKKwlpbmZvLT5yZW1vdGVfY2VydF9pbmZvID0gJnNzb2NrLT5yZW1vdGVfY2VydF9pbmZvOworCisJLyogVmVyaWZpY2F0aW9uIHN0YXR1cyAqLworCWluZm8tPnZlcmlmeV9zdGF0dXMgPSBzc29jay0+dmVyaWZ5X3N0YXR1czsKKyAgICB9CisKKyAgICAvKiBMYXN0IGtub3duIE9wZW5TU0wgZXJyb3IgY29kZSAqLworICAgIGluZm8tPmxhc3RfbmF0aXZlX2VyciA9IHNzb2NrLT5sYXN0X2VycjsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBTdGFydHMgcmVhZCBvcGVyYXRpb24gb24gdGhpcyBzZWN1cmUgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9zb2NrX3N0YXJ0X3JlYWQgKHBqX3NzbF9zb2NrX3QgKnNzb2NrLAorCQkJCQkgICAgcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgdW5zaWduZWQgYnVmZl9zaXplLAorCQkJCQkgICAgcGpfdWludDMyX3QgZmxhZ3MpCit7CisgICAgdm9pZCAqKnJlYWRidWY7CisgICAgdW5zaWduZWQgaTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3NvY2sgJiYgcG9vbCAmJiBidWZmX3NpemUsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzc29jay0+c3NsX3N0YXRlPT1TU0xfU1RBVEVfRVNUQUJMSVNIRUQsIFBKX0VJTlZBTElET1ApOworCisgICAgcmVhZGJ1ZiA9ICh2b2lkKiopIHBqX3Bvb2xfY2FsbG9jKHBvb2wsIHNzb2NrLT5wYXJhbS5hc3luY19jbnQsIAorCQkJCSAgICAgIHNpemVvZih2b2lkKikpOworCisgICAgZm9yIChpPTA7IGk8c3NvY2stPnBhcmFtLmFzeW5jX2NudDsgKytpKSB7CisJcmVhZGJ1ZltpXSA9IHBqX3Bvb2xfYWxsb2MocG9vbCwgYnVmZl9zaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gcGpfc3NsX3NvY2tfc3RhcnRfcmVhZDIoc3NvY2ssIHBvb2wsIGJ1ZmZfc2l6ZSwgCisJCQkJICAgcmVhZGJ1ZiwgZmxhZ3MpOworfQorCisKKy8qCisgKiBTYW1lIGFzICNwal9zc2xfc29ja19zdGFydF9yZWFkKCksIGV4Y2VwdCB0aGF0IHRoZSBhcHBsaWNhdGlvbgorICogc3VwcGxpZXMgdGhlIGJ1ZmZlcnMgZm9yIHRoZSByZWFkIG9wZXJhdGlvbiBzbyB0aGF0IHRoZSBhY2l2ZSBzb2NrZXQKKyAqIGRvZXMgbm90IGhhdmUgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlcnMuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3NsX3NvY2tfc3RhcnRfcmVhZDIgKHBqX3NzbF9zb2NrX3QgKnNzb2NrLAorCQkJCQkgICAgIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICB1bnNpZ25lZCBidWZmX3NpemUsCisJCQkJCSAgICAgdm9pZCAqcmVhZGJ1ZltdLAorCQkJCQkgICAgIHBqX3VpbnQzMl90IGZsYWdzKQoreworICAgIHVuc2lnbmVkIGk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNzb2NrICYmIHBvb2wgJiYgYnVmZl9zaXplICYmIHJlYWRidWYsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzc29jay0+c3NsX3N0YXRlPT1TU0xfU1RBVEVfRVNUQUJMSVNIRUQsIFBKX0VJTlZBTElET1ApOworCisgICAgLyogQ3JlYXRlIFNTTCBzb2NrZXQgcmVhZCBidWZmZXIgKi8KKyAgICBzc29jay0+c3NvY2tfcmJ1ZiA9IChyZWFkX2RhdGFfdCopcGpfcG9vbF9jYWxsb2MocG9vbCwgCisJCQkJCSAgICAgICBzc29jay0+cGFyYW0uYXN5bmNfY250LAorCQkJCQkgICAgICAgc2l6ZW9mKHJlYWRfZGF0YV90KSk7CisKKyAgICAvKiBTdG9yZSBTU0wgc29ja2V0IHJlYWQgYnVmZmVyIHBvaW50ZXIgaW4gdGhlIGFjdGl2ZXNvY2sgcmVhZCBidWZmZXIgKi8KKyAgICBmb3IgKGk9MDsgaTxzc29jay0+cGFyYW0uYXN5bmNfY250OyArK2kpIHsKKwlyZWFkX2RhdGFfdCAqKnBfc3NvY2tfcmJ1ZiA9IAorCQkJT0ZGU0VUX09GX1JFQURfREFUQV9QVFIoc3NvY2ssIHNzb2NrLT5hc29ja19yYnVmW2ldKTsKKworCXNzb2NrLT5zc29ja19yYnVmW2ldLmRhdGEgPSByZWFkYnVmW2ldOworCXNzb2NrLT5zc29ja19yYnVmW2ldLmxlbiA9IDA7CisKKwkqcF9zc29ja19yYnVmID0gJnNzb2NrLT5zc29ja19yYnVmW2ldOworICAgIH0KKworICAgIHNzb2NrLT5yZWFkX3NpemUgPSBidWZmX3NpemU7CisgICAgc3NvY2stPnJlYWRfc3RhcnRlZCA9IFBKX1RSVUU7CisgICAgc3NvY2stPnJlYWRfZmxhZ3MgPSBmbGFnczsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBTYW1lIGFzIHBqX3NzbF9zb2NrX3N0YXJ0X3JlYWQoKSwgZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkCisgKiBvbmx5IGZvciBkYXRhZ3JhbSBzb2NrZXRzLCBhbmQgaXQgd2lsbCB0cmlnZ2VyIFxhIG9uX2RhdGFfcmVjdmZyb20oKQorICogY2FsbGJhY2sgaW5zdGVhZC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zc2xfc29ja19zdGFydF9yZWN2ZnJvbSAocGpfc3NsX3NvY2tfdCAqc3NvY2ssCisJCQkJCQlwal9wb29sX3QgKnBvb2wsCisJCQkJCQl1bnNpZ25lZCBidWZmX3NpemUsCisJCQkJCQlwal91aW50MzJfdCBmbGFncykKK3sKKyAgICBQSl9VTlVTRURfQVJHKHNzb2NrKTsKKyAgICBQSl9VTlVTRURfQVJHKHBvb2wpOworICAgIFBKX1VOVVNFRF9BUkcoYnVmZl9zaXplKTsKKyAgICBQSl9VTlVTRURfQVJHKGZsYWdzKTsKKworICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisKKy8qCisgKiBTYW1lIGFzICNwal9zc2xfc29ja19zdGFydF9yZWN2ZnJvbSgpIGV4Y2VwdCB0aGF0IHRoZSByZWN2ZnJvbSgpIAorICogb3BlcmF0aW9uIHRha2VzIHRoZSBidWZmZXIgZnJvbSB0aGUgYXJndW1lbnQgcmF0aGVyIHRoYW4gY3JlYXRpbmcKKyAqIG5ldyBvbmVzLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9zb2NrX3N0YXJ0X3JlY3Zmcm9tMiAocGpfc3NsX3NvY2tfdCAqc3NvY2ssCisJCQkJCQkgcGpfcG9vbF90ICpwb29sLAorCQkJCQkJIHVuc2lnbmVkIGJ1ZmZfc2l6ZSwKKwkJCQkJCSB2b2lkICpyZWFkYnVmW10sCisJCQkJCQkgcGpfdWludDMyX3QgZmxhZ3MpCit7CisgICAgUEpfVU5VU0VEX0FSRyhzc29jayk7CisgICAgUEpfVU5VU0VEX0FSRyhwb29sKTsKKyAgICBQSl9VTlVTRURfQVJHKGJ1ZmZfc2l6ZSk7CisgICAgUEpfVU5VU0VEX0FSRyhyZWFkYnVmKTsKKyAgICBQSl9VTlVTRURfQVJHKGZsYWdzKTsKKworICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKiBXcml0ZSBwbGFpbiBkYXRhIHRvIFNTTCBhbmQgZmx1c2ggd3JpdGUgQklPLiAqLworc3RhdGljIHBqX3N0YXR1c190IHNzbF93cml0ZShwal9zc2xfc29ja190ICpzc29jaywgCisJCQkgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKnNlbmRfa2V5LAorCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICBwal9zc2l6ZV90IHNpemUsCisJCQkgICAgIHVuc2lnbmVkIGZsYWdzKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBpbnQgbndyaXR0ZW47CisKKyAgICAvKiBXcml0ZSB0aGUgcGxhaW4gZGF0YSB0byBTU0wsIGFmdGVyIFNTTCBlbmNyeXB0cyBpdCwgd3JpdGUgQklPIHdpbGwKKyAgICAgKiBjb250YWluIHRoZSBzZWN1cmVkIGRhdGEgdG8gYmUgc2VudCB2aWEgc29ja2V0LiBOb3RlIHRoYXQgcmUtCisgICAgICogbmVnb3RpdGF0aW9uIG1heSBiZSBvbiBwcm9ncmVzcywgc28gc2VuZGluZyBkYXRhIHNob3VsZCBiZSBkZWxheWVkCisgICAgICogdW50aWwgcmUtbmVnb3RpYXRpb24gaXMgY29tcGxldGVkLgorICAgICAqLworICAgIHBqX2xvY2tfYWNxdWlyZShzc29jay0+d3JpdGVfbXV0ZXgpOworICAgIG53cml0dGVuID0gU1NMX3dyaXRlKHNzb2NrLT5vc3NsX3NzbCwgZGF0YSwgKGludClzaXplKTsKKyAgICBwal9sb2NrX3JlbGVhc2Uoc3NvY2stPndyaXRlX211dGV4KTsKKyAgICAKKyAgICBpZiAobndyaXR0ZW4gPT0gc2l6ZSkgeworCS8qIEFsbCBkYXRhIHdyaXR0ZW4sIGZsdXNoIHdyaXRlIEJJTyB0byBuZXR3b3JrIHNvY2tldCAqLworCXN0YXR1cyA9IGZsdXNoX3dyaXRlX2Jpbyhzc29jaywgc2VuZF9rZXksIHNpemUsIGZsYWdzKTsKKyAgICB9IGVsc2UgaWYgKG53cml0dGVuIDw9IDApIHsKKwkvKiBTU0wgZmFpbGVkIHRvIHByb2Nlc3MgdGhlIGRhdGEsIGl0IG1heSBqdXN0IHRoYXQgcmUtbmVnb3RpYXRpb24KKwkgKiBpcyBvbiBwcm9ncmVzcy4KKwkgKi8KKwlpbnQgZXJyOworCWVyciA9IFNTTF9nZXRfZXJyb3Ioc3NvY2stPm9zc2xfc3NsLCBud3JpdHRlbik7CisJaWYgKGVyciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEIHx8IGVyciA9PSBTU0xfRVJST1JfTk9ORSkgeworCSAgICAvKiBSZS1uZWdvdGlhdGlvbiBpcyBvbiBwcm9ncmVzcywgZmx1c2ggcmUtbmVnb3RpYXRpb24gZGF0YSAqLworCSAgICBzdGF0dXMgPSBmbHVzaF93cml0ZV9iaW8oc3NvY2ssICZzc29jay0+aGFuZHNoYWtlX29wX2tleSwgMCwgMCk7CisJICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUyB8fCBzdGF0dXMgPT0gUEpfRVBFTkRJTkcpCisJCS8qIEp1c3QgcmV0dXJuIFBKX0VCVVNZIHdoZW4gcmUtbmVnb3RpYXRpb24gaXMgb24gcHJvZ3Jlc3MgKi8KKwkJc3RhdHVzID0gUEpfRUJVU1k7CisJfSBlbHNlIHsKKwkgICAgLyogU29tZSBwcm9ibGVtIG9jY3VyZWQgKi8KKwkgICAgc3RhdHVzID0gU1RBVFVTX0ZST01fU1NMX0VSUihzc29jaywgZXJyKTsKKwl9CisgICAgfSBlbHNlIHsKKwkvKiBud3JpdHRlbiA8ICpzaXplLCBzaG91bGRuJ3QgaGFwcGVuLCB1bmxlc3Mgd3JpdGUgQklPIGNhbm5vdCBob2xkIAorCSAqIHRoZSB3aG9sZSBzZWN1cmVkIGRhdGEsIHBlcmhhcHMgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgbWVtb3J5LgorCSAqLworCXN0YXR1cyA9IFBKX0VOT01FTTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBGbHVzaCBkZWxheWVkIGRhdGEgc2VuZGluZyBpbiB0aGUgd3JpdGUgcGVuZGluZyBsaXN0LiAqLworc3RhdGljIHBqX3N0YXR1c190IGZsdXNoX2RlbGF5ZWRfc2VuZChwal9zc2xfc29ja190ICpzc29jaykKK3sKKyAgICAvKiBDaGVjayBmb3IgYW5vdGhlciBvbmdvaW5nIGZsdXNoICovCisgICAgaWYgKHNzb2NrLT5mbHVzaGluZ193cml0ZV9wZW5kKQorCXJldHVybiBQSl9FQlVTWTsKKworICAgIHBqX2xvY2tfYWNxdWlyZShzc29jay0+d3JpdGVfbXV0ZXgpOworCisgICAgLyogQWdhaW4sIGNoZWNrIGZvciBhbm90aGVyIG9uZ29pbmcgZmx1c2ggKi8KKyAgICBpZiAoc3NvY2stPmZsdXNoaW5nX3dyaXRlX3BlbmQpIHsKKwlwal9sb2NrX3JlbGVhc2Uoc3NvY2stPndyaXRlX211dGV4KTsKKwlyZXR1cm4gUEpfRUJVU1k7CisgICAgfQorCisgICAgLyogU2V0IG9uZ29pbmcgZmx1c2ggZmxhZyAqLworICAgIHNzb2NrLT5mbHVzaGluZ193cml0ZV9wZW5kID0gUEpfVFJVRTsKKworICAgIHdoaWxlICghcGpfbGlzdF9lbXB0eSgmc3NvY2stPndyaXRlX3BlbmRpbmcpKSB7CisgICAgICAgIHdyaXRlX2RhdGFfdCAqd3A7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJd3AgPSBzc29jay0+d3JpdGVfcGVuZGluZy5uZXh0OworCisJLyogVGlja2V0ICMxNTczOiBEb24ndCBob2xkIG11dGV4IHdoaWxlIGNhbGxpbmcgc29ja2V0IHNlbmQuICovCisJcGpfbG9ja19yZWxlYXNlKHNzb2NrLT53cml0ZV9tdXRleCk7CisKKwlzdGF0dXMgPSBzc2xfd3JpdGUoc3NvY2ssICZ3cC0+a2V5LCB3cC0+ZGF0YS5wdHIsIAorCQkJICAgd3AtPnBsYWluX2RhdGFfbGVuLCB3cC0+ZmxhZ3MpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICAvKiBSZXNldCBvbmdvaW5nIGZsdXNoIGZsYWcgZmlyc3QuICovCisJICAgIHNzb2NrLT5mbHVzaGluZ193cml0ZV9wZW5kID0gUEpfRkFMU0U7CisJICAgIHJldHVybiBzdGF0dXM7CisJfQorCisJcGpfbG9ja19hY3F1aXJlKHNzb2NrLT53cml0ZV9tdXRleCk7CisJcGpfbGlzdF9lcmFzZSh3cCk7CisJcGpfbGlzdF9wdXNoX2JhY2soJnNzb2NrLT53cml0ZV9wZW5kaW5nX2VtcHR5LCB3cCk7CisgICAgfQorCisgICAgLyogUmVzZXQgb25nb2luZyBmbHVzaCBmbGFnICovCisgICAgc3NvY2stPmZsdXNoaW5nX3dyaXRlX3BlbmQgPSBQSl9GQUxTRTsKKworICAgIHBqX2xvY2tfcmVsZWFzZShzc29jay0+d3JpdGVfbXV0ZXgpOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIFNlbmRpbmcgaXMgZGVsYXllZCwgcHVzaCBiYWNrIHRoZSBzZW5kaW5nIGRhdGEgaW50byBwZW5kaW5nIGxpc3QuICovCitzdGF0aWMgcGpfc3RhdHVzX3QgZGVsYXlfc2VuZCAocGpfc3NsX3NvY2tfdCAqc3NvY2ssCisJCQkgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqc2VuZF9rZXksCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgICBwal9zc2l6ZV90IHNpemUsCisJCQkgICAgICAgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgd3JpdGVfZGF0YV90ICp3cDsKKworICAgIHBqX2xvY2tfYWNxdWlyZShzc29jay0+d3JpdGVfbXV0ZXgpOworCisgICAgLyogSW5pdCB3cml0ZSBwZW5kaW5nIGluc3RhbmNlICovCisgICAgaWYgKCFwal9saXN0X2VtcHR5KCZzc29jay0+d3JpdGVfcGVuZGluZ19lbXB0eSkpIHsKKwl3cCA9IHNzb2NrLT53cml0ZV9wZW5kaW5nX2VtcHR5Lm5leHQ7CisJcGpfbGlzdF9lcmFzZSh3cCk7CisgICAgfSBlbHNlIHsKKwl3cCA9IFBKX1BPT0xfWkFMTE9DX1Qoc3NvY2stPnBvb2wsIHdyaXRlX2RhdGFfdCk7CisgICAgfQorCisgICAgd3AtPmFwcF9rZXkgPSBzZW5kX2tleTsKKyAgICB3cC0+cGxhaW5fZGF0YV9sZW4gPSBzaXplOworICAgIHdwLT5kYXRhLnB0ciA9IGRhdGE7CisgICAgd3AtPmZsYWdzID0gZmxhZ3M7CisKKyAgICBwal9saXN0X3B1c2hfYmFjaygmc3NvY2stPndyaXRlX3BlbmRpbmcsIHdwKTsKKyAgICAKKyAgICBwal9sb2NrX3JlbGVhc2Uoc3NvY2stPndyaXRlX211dGV4KTsKKworICAgIC8qIE11c3QgcmV0dXJuIFBKX0VQRU5ESU5HICovCisgICAgcmV0dXJuIFBKX0VQRU5ESU5HOworfQorCisvKioKKyAqIFNlbmQgZGF0YSB1c2luZyB0aGUgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9zb2NrX3NlbmQgKHBqX3NzbF9zb2NrX3QgKnNzb2NrLAorCQkJCSAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKnNlbmRfa2V5LAorCQkJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgICAgcGpfc3NpemVfdCAqc2l6ZSwKKwkJCQkgICAgICB1bnNpZ25lZCBmbGFncykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNzb2NrICYmIGRhdGEgJiYgc2l6ZSAmJiAoKnNpemU+MCksIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzc29jay0+c3NsX3N0YXRlPT1TU0xfU1RBVEVfRVNUQUJMSVNIRUQsIFBKX0VJTlZBTElET1ApOworCisgICAgLy8gVGlja2V0ICMxNTczOiBEb24ndCBob2xkIG11dGV4IHdoaWxlIGNhbGxpbmcgUEpMSUIgc29ja2V0IHNlbmQoKS4KKyAgICAvL3BqX2xvY2tfYWNxdWlyZShzc29jay0+d3JpdGVfbXV0ZXgpOworCisgICAgLyogRmx1c2ggZGVsYXllZCBzZW5kIGZpcnN0LiBTZW5kaW5nIGRhdGEgbWlnaHQgYmUgZGVsYXllZCB3aGVuIAorICAgICAqIHJlLW5lZ290aWF0aW9uIGlzIG9uLXByb2dyZXNzLgorICAgICAqLworICAgIHN0YXR1cyA9IGZsdXNoX2RlbGF5ZWRfc2VuZChzc29jayk7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9FQlVTWSkgeworCS8qIFJlLW5lZ290aWF0aW9uIG9yIGZsdXNoaW5nIGlzIG9uIHByb2dyZXNzLCBkZWxheSBzZW5kaW5nICovCisJc3RhdHVzID0gZGVsYXlfc2VuZChzc29jaywgc2VuZF9rZXksIGRhdGEsICpzaXplLCBmbGFncyk7CisJZ290byBvbl9yZXR1cm47CisgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIC8qIFdyaXRlIGRhdGEgdG8gU1NMICovCisgICAgc3RhdHVzID0gc3NsX3dyaXRlKHNzb2NrLCBzZW5kX2tleSwgZGF0YSwgKnNpemUsIGZsYWdzKTsKKyAgICBpZiAoc3RhdHVzID09IFBKX0VCVVNZKSB7CisJLyogUmUtbmVnb3RpYXRpb24gaXMgb24gcHJvZ3Jlc3MsIGRlbGF5IHNlbmRpbmcgKi8KKwlzdGF0dXMgPSBkZWxheV9zZW5kKHNzb2NrLCBzZW5kX2tleSwgZGF0YSwgKnNpemUsIGZsYWdzKTsKKyAgICB9CisKK29uX3JldHVybjoKKyAgICAvL3BqX2xvY2tfcmVsZWFzZShzc29jay0+d3JpdGVfbXV0ZXgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgKiBTZW5kIGRhdGFncmFtIHVzaW5nIHRoZSBzb2NrZXQuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3NsX3NvY2tfc2VuZHRvIChwal9zc2xfc29ja190ICpzc29jaywKKwkJCQkJcGpfaW9xdWV1ZV9vcF9rZXlfdCAqc2VuZF9rZXksCisJCQkJCWNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCXBqX3NzaXplX3QgKnNpemUsCisJCQkJCXVuc2lnbmVkIGZsYWdzLAorCQkJCQljb25zdCBwal9zb2NrYWRkcl90ICphZGRyLAorCQkJCQlpbnQgYWRkcl9sZW4pCit7CisgICAgUEpfVU5VU0VEX0FSRyhzc29jayk7CisgICAgUEpfVU5VU0VEX0FSRyhzZW5kX2tleSk7CisgICAgUEpfVU5VU0VEX0FSRyhkYXRhKTsKKyAgICBQSl9VTlVTRURfQVJHKHNpemUpOworICAgIFBKX1VOVVNFRF9BUkcoZmxhZ3MpOworICAgIFBKX1VOVVNFRF9BUkcoYWRkcik7CisgICAgUEpfVU5VU0VEX0FSRyhhZGRyX2xlbik7CisKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworCisvKioKKyAqIFN0YXJ0cyBhc3luY2hyb25vdXMgc29ja2V0IGFjY2VwdCgpIG9wZXJhdGlvbnMgb24gdGhpcyBzZWN1cmUgc29ja2V0LiAKKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zc2xfc29ja19zdGFydF9hY2NlcHQgKHBqX3NzbF9zb2NrX3QgKnNzb2NrLAorCQkJCQkgICAgICBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgIGNvbnN0IHBqX3NvY2thZGRyX3QgKmxvY2FsYWRkciwKKwkJCQkJICAgICAgaW50IGFkZHJfbGVuKQoreworICAgIHBqX2FjdGl2ZXNvY2tfY2IgYXNvY2tfY2I7CisgICAgcGpfYWN0aXZlc29ja19jZmcgYXNvY2tfY2ZnOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3NvY2sgJiYgcG9vbCAmJiBsb2NhbGFkZHIgJiYgYWRkcl9sZW4sIFBKX0VJTlZBTCk7CisKKyAgICAvKiBDcmVhdGUgc29ja2V0ICovCisgICAgc3RhdHVzID0gcGpfc29ja19zb2NrZXQoc3NvY2stPnBhcmFtLnNvY2tfYWYsIHNzb2NrLT5wYXJhbS5zb2NrX3R5cGUsIDAsIAorCQkJICAgICZzc29jay0+c29jayk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBBcHBseSBTT19SRVVTRUFERFIgKi8KKyAgICBpZiAoc3NvY2stPnBhcmFtLnJldXNlX2FkZHIpIHsKKwlpbnQgZW5hYmxlZCA9IDE7CisJc3RhdHVzID0gcGpfc29ja19zZXRzb2Nrb3B0KHNzb2NrLT5zb2NrLCBwal9TT0xfU09DS0VUKCksCisJCQkJICAgIHBqX1NPX1JFVVNFQUREUigpLAorCQkJCSAgICAmZW5hYmxlZCwgc2l6ZW9mKGVuYWJsZWQpKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgUEpfUEVSUk9SKDQsKHNzb2NrLT5wb29sLT5vYmpfbmFtZSwgc3RhdHVzLAorCQkgICAgICAgICAiV2FybmluZzogZXJyb3IgYXBwbHlpbmcgU09fUkVVU0VBRERSIikpOworCX0KKyAgICB9CisKKyAgICAvKiBBcHBseSBRb1MsIGlmIHNwZWNpZmllZCAqLworICAgIHN0YXR1cyA9IHBqX3NvY2tfYXBwbHlfcW9zMihzc29jay0+c29jaywgc3NvY2stPnBhcmFtLnFvc190eXBlLAorCQkJCSZzc29jay0+cGFyYW0ucW9zX3BhcmFtcywgMiwgCisJCQkJc3NvY2stPnBvb2wtPm9ial9uYW1lLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgJiYgIXNzb2NrLT5wYXJhbS5xb3NfaWdub3JlX2Vycm9yKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBCaW5kIHNvY2tldCAqLworICAgIHN0YXR1cyA9IHBqX3NvY2tfYmluZChzc29jay0+c29jaywgbG9jYWxhZGRyLCBhZGRyX2xlbik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGFkZHJlc3MgKi8KKyAgICBzdGF0dXMgPSBwal9zb2NrX2xpc3Rlbihzc29jay0+c29jaywgUEpfU09NQVhDT05OKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9lcnJvcjsKKworICAgIC8qIENyZWF0ZSBhY3RpdmUgc29ja2V0ICovCisgICAgcGpfYWN0aXZlc29ja19jZmdfZGVmYXVsdCgmYXNvY2tfY2ZnKTsKKyAgICBhc29ja19jZmcuYXN5bmNfY250ID0gc3NvY2stPnBhcmFtLmFzeW5jX2NudDsKKyAgICBhc29ja19jZmcuY29uY3VycmVuY3kgPSBzc29jay0+cGFyYW0uY29uY3VycmVuY3k7CisgICAgYXNvY2tfY2ZnLndob2xlX2RhdGEgPSBQSl9UUlVFOworCisgICAgcGpfYnplcm8oJmFzb2NrX2NiLCBzaXplb2YoYXNvY2tfY2IpKTsKKyAgICBhc29ja19jYi5vbl9hY2NlcHRfY29tcGxldGUgPSBhc29ja19vbl9hY2NlcHRfY29tcGxldGU7CisKKyAgICBzdGF0dXMgPSBwal9hY3RpdmVzb2NrX2NyZWF0ZShwb29sLAorCQkJCSAgc3NvY2stPnNvY2ssIAorCQkJCSAgc3NvY2stPnBhcmFtLnNvY2tfdHlwZSwKKwkJCQkgICZhc29ja19jZmcsCisJCQkJICBzc29jay0+cGFyYW0uaW9xdWV1ZSwgCisJCQkJICAmYXNvY2tfY2IsCisJCQkJICBzc29jaywKKwkJCQkgICZzc29jay0+YXNvY2spOworCisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBTdGFydCBhY2NlcHRpbmcgKi8KKyAgICBzdGF0dXMgPSBwal9hY3RpdmVzb2NrX3N0YXJ0X2FjY2VwdChzc29jay0+YXNvY2ssIHBvb2wpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX2Vycm9yOworCisgICAgLyogVXBkYXRlIGxvY2FsIGFkZHJlc3MgKi8KKyAgICBzc29jay0+YWRkcl9sZW4gPSBhZGRyX2xlbjsKKyAgICBzdGF0dXMgPSBwal9zb2NrX2dldHNvY2tuYW1lKHNzb2NrLT5zb2NrLCAmc3NvY2stPmxvY2FsX2FkZHIsIAorCQkJCSAmc3NvY2stPmFkZHJfbGVuKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcGpfc29ja2FkZHJfY3AoJnNzb2NrLT5sb2NhbF9hZGRyLCBsb2NhbGFkZHIpOworCisgICAgc3NvY2stPmlzX3NlcnZlciA9IFBKX1RSVUU7CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKKworb25fZXJyb3I6CisgICAgcmVzZXRfc3NsX3NvY2tfc3RhdGUoc3NvY2spOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyoqCisgKiBTdGFydHMgYXN5bmNocm9ub3VzIHNvY2tldCBjb25uZWN0KCkgb3BlcmF0aW9uLgorICovCitQSl9ERUNMKHBqX3N0YXR1c190KSBwal9zc2xfc29ja19zdGFydF9jb25uZWN0KHBqX3NzbF9zb2NrX3QgKnNzb2NrLAorCQkJCQkgICAgICAgcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgICAgY29uc3QgcGpfc29ja2FkZHJfdCAqbG9jYWxhZGRyLAorCQkJCQkgICAgICAgY29uc3QgcGpfc29ja2FkZHJfdCAqcmVtYWRkciwKKwkJCQkJICAgICAgIGludCBhZGRyX2xlbikKK3sKKyAgICBwal9hY3RpdmVzb2NrX2NiIGFzb2NrX2NiOworICAgIHBqX2FjdGl2ZXNvY2tfY2ZnIGFzb2NrX2NmZzsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNzb2NrICYmIHBvb2wgJiYgbG9jYWxhZGRyICYmIHJlbWFkZHIgJiYgYWRkcl9sZW4sCisJCSAgICAgUEpfRUlOVkFMKTsKKworICAgIC8qIENyZWF0ZSBzb2NrZXQgKi8KKyAgICBzdGF0dXMgPSBwal9zb2NrX3NvY2tldChzc29jay0+cGFyYW0uc29ja19hZiwgc3NvY2stPnBhcmFtLnNvY2tfdHlwZSwgMCwgCisJCQkgICAgJnNzb2NrLT5zb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9lcnJvcjsKKworICAgIC8qIEFwcGx5IFFvUywgaWYgc3BlY2lmaWVkICovCisgICAgc3RhdHVzID0gcGpfc29ja19hcHBseV9xb3MyKHNzb2NrLT5zb2NrLCBzc29jay0+cGFyYW0ucW9zX3R5cGUsCisJCQkJJnNzb2NrLT5wYXJhbS5xb3NfcGFyYW1zLCAyLCAKKwkJCQlzc29jay0+cG9vbC0+b2JqX25hbWUsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyAmJiAhc3NvY2stPnBhcmFtLnFvc19pZ25vcmVfZXJyb3IpCisJZ290byBvbl9lcnJvcjsKKworICAgIC8qIEJpbmQgc29ja2V0ICovCisgICAgc3RhdHVzID0gcGpfc29ja19iaW5kKHNzb2NrLT5zb2NrLCBsb2NhbGFkZHIsIGFkZHJfbGVuKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJZ290byBvbl9lcnJvcjsKKworICAgIC8qIENyZWF0ZSBhY3RpdmUgc29ja2V0ICovCisgICAgcGpfYWN0aXZlc29ja19jZmdfZGVmYXVsdCgmYXNvY2tfY2ZnKTsKKyAgICBhc29ja19jZmcuYXN5bmNfY250ID0gc3NvY2stPnBhcmFtLmFzeW5jX2NudDsKKyAgICBhc29ja19jZmcuY29uY3VycmVuY3kgPSBzc29jay0+cGFyYW0uY29uY3VycmVuY3k7CisgICAgYXNvY2tfY2ZnLndob2xlX2RhdGEgPSBQSl9UUlVFOworCisgICAgcGpfYnplcm8oJmFzb2NrX2NiLCBzaXplb2YoYXNvY2tfY2IpKTsKKyAgICBhc29ja19jYi5vbl9jb25uZWN0X2NvbXBsZXRlID0gYXNvY2tfb25fY29ubmVjdF9jb21wbGV0ZTsKKyAgICBhc29ja19jYi5vbl9kYXRhX3JlYWQgPSBhc29ja19vbl9kYXRhX3JlYWQ7CisgICAgYXNvY2tfY2Iub25fZGF0YV9zZW50ID0gYXNvY2tfb25fZGF0YV9zZW50OworCisgICAgc3RhdHVzID0gcGpfYWN0aXZlc29ja19jcmVhdGUocG9vbCwKKwkJCQkgIHNzb2NrLT5zb2NrLCAKKwkJCQkgIHNzb2NrLT5wYXJhbS5zb2NrX3R5cGUsCisJCQkJICAmYXNvY2tfY2ZnLAorCQkJCSAgc3NvY2stPnBhcmFtLmlvcXVldWUsIAorCQkJCSAgJmFzb2NrX2NiLAorCQkJCSAgc3NvY2ssCisJCQkJICAmc3NvY2stPmFzb2NrKTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlnb3RvIG9uX2Vycm9yOworCisgICAgLyogU2F2ZSByZW1vdGUgYWRkcmVzcyAqLworICAgIHBqX3NvY2thZGRyX2NwKCZzc29jay0+cmVtX2FkZHIsIHJlbWFkZHIpOworCisgICAgLyogU3RhcnQgdGltZXIgKi8KKyAgICBpZiAoc3NvY2stPnBhcmFtLnRpbWVyX2hlYXAgJiYgKHNzb2NrLT5wYXJhbS50aW1lb3V0LnNlYyAhPSAwIHx8CisJc3NvY2stPnBhcmFtLnRpbWVvdXQubXNlYyAhPSAwKSkKKyAgICB7CisJcGpfYXNzZXJ0KHNzb2NrLT50aW1lci5pZCA9PSBUSU1FUl9OT05FKTsKKwlzc29jay0+dGltZXIuaWQgPSBUSU1FUl9IQU5EU0hBS0VfVElNRU9VVDsKKwlzdGF0dXMgPSBwal90aW1lcl9oZWFwX3NjaGVkdWxlKHNzb2NrLT5wYXJhbS50aW1lcl9oZWFwLAorCQkJCQkmc3NvY2stPnRpbWVyLAorCQkJCSAgICAgICAgJnNzb2NrLT5wYXJhbS50aW1lb3V0KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHNzb2NrLT50aW1lci5pZCA9IFRJTUVSX05PTkU7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfYWN0aXZlc29ja19zdGFydF9jb25uZWN0KHNzb2NrLT5hc29jaywgcG9vbCwgcmVtYWRkciwKKwkJCQkJIGFkZHJfbGVuKTsKKworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwlhc29ja19vbl9jb25uZWN0X2NvbXBsZXRlKHNzb2NrLT5hc29jaywgUEpfU1VDQ0VTUyk7CisgICAgZWxzZSBpZiAoc3RhdHVzICE9IFBKX0VQRU5ESU5HKQorCWdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBVcGRhdGUgbG9jYWwgYWRkcmVzcyAqLworICAgIHNzb2NrLT5hZGRyX2xlbiA9IGFkZHJfbGVuOworICAgIHN0YXR1cyA9IHBqX3NvY2tfZ2V0c29ja25hbWUoc3NvY2stPnNvY2ssICZzc29jay0+bG9jYWxfYWRkciwKKwkJCQkgJnNzb2NrLT5hZGRyX2xlbik7CisgICAgLyogTm90ZSB0aGF0IHdlIG1heSBub3QgZ2V0IGFuIElQIGFkZHJlc3MgaGVyZS4gVGhpcyBjYW4KKyAgICAgKiBoYXBwZW4gZm9yIGV4YW1wbGUgb24gV2luZG93cywgd2hlcmUgZ2V0c29ja25hbWUoKQorICAgICAqIHdvdWxkIHJldHVybiAwLjAuMC4wIGlmIHNvY2tldCBoYXMganVzdCBzdGFydGVkIHRoZQorICAgICAqIGFzeW5jIGNvbm5lY3QuIEluIHRoaXMgY2FzZSwganVzdCBsZWF2ZSB0aGUgbG9jYWwKKyAgICAgKiBhZGRyZXNzIHdpdGggMC4wLjAuMCBmb3Igbm93OyBpdCB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiBvbmNlIHRoZSBzb2NrZXQgaXMgZXN0YWJsaXNoZWQuCisgICAgICovCisKKyAgICAvKiBVcGRhdGUgU1NMIHN0YXRlICovCisgICAgc3NvY2stPmlzX3NlcnZlciA9IFBKX0ZBTFNFOworCisgICAgcmV0dXJuIFBKX0VQRU5ESU5HOworCitvbl9lcnJvcjoKKyAgICByZXNldF9zc2xfc29ja19zdGF0ZShzc29jayk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9zb2NrX3JlbmVnb3RpYXRlKHBqX3NzbF9zb2NrX3QgKnNzb2NrKQoreworICAgIGludCByZXQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihzc29jay0+c3NsX3N0YXRlID09IFNTTF9TVEFURV9FU1RBQkxJU0hFRCwgUEpfRUlOVkFMSURPUCk7CisKKyAgICBpZiAoU1NMX3JlbmVnb3RpYXRlX3BlbmRpbmcoc3NvY2stPm9zc2xfc3NsKSkKKwlyZXR1cm4gUEpfRVBFTkRJTkc7CisKKyAgICByZXQgPSBTU0xfcmVuZWdvdGlhdGUoc3NvY2stPm9zc2xfc3NsKTsKKyAgICBpZiAocmV0IDw9IDApIHsKKwlzdGF0dXMgPSBHRVRfU1NMX1NUQVRVUyhzc29jayk7CisgICAgfSBlbHNlIHsKKwlzdGF0dXMgPSBkb19oYW5kc2hha2Uoc3NvY2spOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNlbmRpZiAgLyogUEpfSEFTX1NTTF9TT0NLICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc3NsX3NvY2tfc3ltYmlhbi5jcHAgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NzbF9zb2NrX3N5bWJpYW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOWIzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3NzbF9zb2NrX3N5bWJpYW4uY3BwCkBAIC0wLDAgKzEsMTQyNiBAQAorLyogJElkOiBzc2xfc29ja19zeW1iaWFuLmNwcCAzOTk5IDIwMTItMDMtMzAgMDc6MTA6MTNaIGJlbm55bHAgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovc3NsX3NvY2suaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc29ja2V0Lmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9tYXRoLmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL3NvY2suaD4KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKworI2luY2x1ZGUgIm9zX3N5bWJpYW4uaCIKKyNpbmNsdWRlIDxzZWN1cmVzb2NrZXQuaD4KKyNpbmNsdWRlIDx4NTA5Y2VydC5oPgorI2luY2x1ZGUgPGUzMmRlczguaD4KKworI2RlZmluZSBUSElTX0ZJTEUgInNzbF9zb2NrX3N5bWJpYW4uY3BwIgorCisKKy8qIENpcGhlciBuYW1lIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgY2lwaGVyX25hbWVfdCB7CisgICAgcGpfc3NsX2NpcGhlciAgICBjaXBoZXI7CisgICAgY29uc3QgY2hhcgkgICAgKm5hbWU7Cit9IGNpcGhlcl9uYW1lX3Q7CisKKy8qIENpcGhlciBuYW1lIGNvbnN0YW50cyAqLworc3RhdGljIGNpcGhlcl9uYW1lX3QgY2lwaGVyX25hbWVzW10gPQoreworICAgIHtQSl9UTFNfTlVMTF9XSVRIX05VTExfTlVMTCwgICAgICAgICAgICAgICAiTlVMTCJ9LAorCisgICAgLyogVExTL1NTTHYzICovCisgICAge1BKX1RMU19SU0FfV0lUSF9OVUxMX01ENSwgICAgICAgICAgICAgICAgICJUTFNfUlNBX1dJVEhfTlVMTF9NRDUifSwKKyAgICB7UEpfVExTX1JTQV9XSVRIX05VTExfU0hBLCAgICAgICAgICAgICAgICAgIlRMU19SU0FfV0lUSF9OVUxMX1NIQSJ9LAorICAgIHtQSl9UTFNfUlNBX1dJVEhfTlVMTF9TSEEyNTYsICAgICAgICAgICAgICAiVExTX1JTQV9XSVRIX05VTExfU0hBMjU2In0sCisgICAge1BKX1RMU19SU0FfV0lUSF9SQzRfMTI4X01ENSwgICAgICAgICAgICAgICJUTFNfUlNBX1dJVEhfUkM0XzEyOF9NRDUifSwKKyAgICB7UEpfVExTX1JTQV9XSVRIX1JDNF8xMjhfU0hBLCAgICAgICAgICAgICAgIlRMU19SU0FfV0lUSF9SQzRfMTI4X1NIQSJ9LAorICAgIHtQSl9UTFNfUlNBX1dJVEhfM0RFU19FREVfQ0JDX1NIQSwgICAgICAgICAiVExTX1JTQV9XSVRIXzNERVNfRURFX0NCQ19TSEEifSwKKyAgICB7UEpfVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwgICAgICAgICAgIlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEifSwKKyAgICB7UEpfVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwgICAgICAgICAgIlRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEifSwKKyAgICB7UEpfVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwgICAgICAgIlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYifSwKKyAgICB7UEpfVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiwgICAgICAgIlRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYifSwKKyAgICB7UEpfVExTX0RIX0RTU19XSVRIXzNERVNfRURFX0NCQ19TSEEsICAgICAgIlRMU19ESF9EU1NfV0lUSF8zREVTX0VERV9DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESF9SU0FfV0lUSF8zREVTX0VERV9DQkNfU0hBLCAgICAgICJUTFNfREhfUlNBX1dJVEhfM0RFU19FREVfQ0JDX1NIQSJ9LAorICAgIHtQSl9UTFNfREhFX0RTU19XSVRIXzNERVNfRURFX0NCQ19TSEEsICAgICAiVExTX0RIRV9EU1NfV0lUSF8zREVTX0VERV9DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESEVfUlNBX1dJVEhfM0RFU19FREVfQ0JDX1NIQSwgICAgICJUTFNfREhFX1JTQV9XSVRIXzNERVNfRURFX0NCQ19TSEEifSwKKyAgICB7UEpfVExTX0RIX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQSwgICAgICAgIlRMU19ESF9EU1NfV0lUSF9BRVNfMTI4X0NCQ19TSEEifSwKKyAgICB7UEpfVExTX0RIX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwgICAgICAgIlRMU19ESF9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEifSwKKyAgICB7UEpfVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0NCQ19TSEEsICAgICAgIlRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLCAgICAgICJUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSJ9LAorICAgIHtQSl9UTFNfREhfRFNTX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLCAgICAgICAiVExTX0RIX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQSJ9LAorICAgIHtQSl9UTFNfREhfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLCAgICAgICAiVExTX0RIX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSJ9LAorICAgIHtQSl9UTFNfREhFX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQSwgICAgICAiVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0NCQ19TSEEifSwKKyAgICB7UEpfVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsICAgICAgIlRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESF9EU1NfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsICAgICJUTFNfREhfRFNTX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2In0sCisgICAge1BKX1RMU19ESF9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsICAgICJUTFNfREhfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2In0sCisgICAge1BKX1RMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2LCAgICJUTFNfREhFX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiJ9LAorICAgIHtQSl9UTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwgICAiVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYifSwKKyAgICB7UEpfVExTX0RIX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiwgICAgIlRMU19ESF9EU1NfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYifSwKKyAgICB7UEpfVExTX0RIX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiwgICAgIlRMU19ESF9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYifSwKKyAgICB7UEpfVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYsICAgIlRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2In0sCisgICAge1BKX1RMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2LCAgICJUTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiJ9LAorICAgIHtQSl9UTFNfREhfYW5vbl9XSVRIX1JDNF8xMjhfTUQ1LCAgICAgICAgICAiVExTX0RIX2Fub25fV0lUSF9SQzRfMTI4X01ENSJ9LAorICAgIHtQSl9UTFNfREhfYW5vbl9XSVRIXzNERVNfRURFX0NCQ19TSEEsICAgICAiVExTX0RIX2Fub25fV0lUSF8zREVTX0VERV9DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESF9hbm9uX1dJVEhfQUVTXzEyOF9DQkNfU0hBLCAgICAgICJUTFNfREhfYW5vbl9XSVRIX0FFU18xMjhfQ0JDX1NIQSJ9LAorICAgIHtQSl9UTFNfREhfYW5vbl9XSVRIX0FFU18yNTZfQ0JDX1NIQSwgICAgICAiVExTX0RIX2Fub25fV0lUSF9BRVNfMjU2X0NCQ19TSEEifSwKKyAgICB7UEpfVExTX0RIX2Fub25fV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsICAgIlRMU19ESF9hbm9uX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2In0sCisgICAge1BKX1RMU19ESF9hbm9uX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2LCAgICJUTFNfREhfYW5vbl9XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiJ9LAorCisgICAgLyogVExTIChkZXByZWNhdGVkKSAqLworICAgIHtQSl9UTFNfUlNBX0VYUE9SVF9XSVRIX1JDNF80MF9NRDUsICAgICAgICAiVExTX1JTQV9FWFBPUlRfV0lUSF9SQzRfNDBfTUQ1In0sCisgICAge1BKX1RMU19SU0FfRVhQT1JUX1dJVEhfUkMyX0NCQ180MF9NRDUsICAgICJUTFNfUlNBX0VYUE9SVF9XSVRIX1JDMl9DQkNfNDBfTUQ1In0sCisgICAge1BKX1RMU19SU0FfV0lUSF9JREVBX0NCQ19TSEEsICAgICAgICAgICAgICJUTFNfUlNBX1dJVEhfSURFQV9DQkNfU0hBIn0sCisgICAge1BKX1RMU19SU0FfRVhQT1JUX1dJVEhfREVTNDBfQ0JDX1NIQSwgICAgICJUTFNfUlNBX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEifSwKKyAgICB7UEpfVExTX1JTQV9XSVRIX0RFU19DQkNfU0hBLCAgICAgICAgICAgICAgIlRMU19SU0FfV0lUSF9ERVNfQ0JDX1NIQSJ9LAorICAgIHtQSl9UTFNfREhfRFNTX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEsICAiVExTX0RIX0RTU19FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESF9EU1NfV0lUSF9ERVNfQ0JDX1NIQSwgICAgICAgICAgICJUTFNfREhfRFNTX1dJVEhfREVTX0NCQ19TSEEifSwKKyAgICB7UEpfVExTX0RIX1JTQV9FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBLCAgIlRMU19ESF9SU0FfRVhQT1JUX1dJVEhfREVTNDBfQ0JDX1NIQSJ9LAorICAgIHtQSl9UTFNfREhfUlNBX1dJVEhfREVTX0NCQ19TSEEsICAgICAgICAgICAiVExTX0RIX1JTQV9XSVRIX0RFU19DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESEVfRFNTX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEsICJUTFNfREhFX0RTU19FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESEVfRFNTX1dJVEhfREVTX0NCQ19TSEEsICAgICAgICAgICJUTFNfREhFX0RTU19XSVRIX0RFU19DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESEVfUlNBX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEsICJUTFNfREhFX1JTQV9FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESEVfUlNBX1dJVEhfREVTX0NCQ19TSEEsICAgICAgICAgICJUTFNfREhFX1JTQV9XSVRIX0RFU19DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESF9hbm9uX0VYUE9SVF9XSVRIX1JDNF80MF9NRDUsICAgICJUTFNfREhfYW5vbl9FWFBPUlRfV0lUSF9SQzRfNDBfTUQ1In0sCisgICAge1BKX1RMU19ESF9hbm9uX0VYUE9SVF9XSVRIX0RFUzQwX0NCQ19TSEEsICJUTFNfREhfYW5vbl9FWFBPUlRfV0lUSF9ERVM0MF9DQkNfU0hBIn0sCisgICAge1BKX1RMU19ESF9hbm9uX1dJVEhfREVTX0NCQ19TSEEsICAgICAgICAgICJUTFNfREhfYW5vbl9XSVRIX0RFU19DQkNfU0hBIn0sCisKKyAgICAvKiBTU0x2MyAqLworICAgIHtQSl9TU0xfRk9SVEVaWkFfS0VBX1dJVEhfTlVMTF9TSEEsICAgICAgICAiU1NMX0ZPUlRFWlpBX0tFQV9XSVRIX05VTExfU0hBIn0sCisgICAge1BKX1NTTF9GT1JURVpaQV9LRUFfV0lUSF9GT1JURVpaQV9DQkNfU0hBLCJTU0xfRk9SVEVaWkFfS0VBX1dJVEhfRk9SVEVaWkFfQ0JDX1NIQSJ9LAorICAgIHtQSl9TU0xfRk9SVEVaWkFfS0VBX1dJVEhfUkM0XzEyOF9TSEEsICAgICAiU1NMX0ZPUlRFWlpBX0tFQV9XSVRIX1JDNF8xMjhfU0hBIn0sCisKKyAgICAvKiBTU0x2MiAqLworICAgIHtQSl9TU0xfQ0tfUkM0XzEyOF9XSVRIX01ENSwgICAgICAgICAgICAgICAiU1NMX0NLX1JDNF8xMjhfV0lUSF9NRDUifSwKKyAgICB7UEpfU1NMX0NLX1JDNF8xMjhfRVhQT1JUNDBfV0lUSF9NRDUsICAgICAgIlNTTF9DS19SQzRfMTI4X0VYUE9SVDQwX1dJVEhfTUQ1In0sCisgICAge1BKX1NTTF9DS19SQzJfMTI4X0NCQ19XSVRIX01ENSwgICAgICAgICAgICJTU0xfQ0tfUkMyXzEyOF9DQkNfV0lUSF9NRDUifSwKKyAgICB7UEpfU1NMX0NLX1JDMl8xMjhfQ0JDX0VYUE9SVDQwX1dJVEhfTUQ1LCAgIlNTTF9DS19SQzJfMTI4X0NCQ19FWFBPUlQ0MF9XSVRIX01ENSJ9LAorICAgIHtQSl9TU0xfQ0tfSURFQV8xMjhfQ0JDX1dJVEhfTUQ1LCAgICAgICAgICAiU1NMX0NLX0lERUFfMTI4X0NCQ19XSVRIX01ENSJ9LAorICAgIHtQSl9TU0xfQ0tfREVTXzY0X0NCQ19XSVRIX01ENSwgICAgICAgICAgICAiU1NMX0NLX0RFU182NF9DQkNfV0lUSF9NRDUifSwKKyAgICB7UEpfU1NMX0NLX0RFU18xOTJfRURFM19DQkNfV0lUSF9NRDUsICAgICAgIlNTTF9DS19ERVNfMTkyX0VERTNfQ0JDX1dJVEhfTUQ1In0KK307CisKKworLyogR2V0IGNpcGhlciBuYW1lIHN0cmluZyAqLworc3RhdGljIGNvbnN0IGNoYXIqIGdldF9jaXBoZXJfbmFtZShwal9zc2xfY2lwaGVyIGNpcGhlcikKK3sKKyAgICB1bnNpZ25lZCBpLCBuOworCisgICAgbiA9IFBKX0FSUkFZX1NJWkUoY2lwaGVyX25hbWVzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgaWYgKGNpcGhlciA9PSBjaXBoZXJfbmFtZXNbaV0uY2lwaGVyKQorICAgICAgICAgICByZXR1cm4gY2lwaGVyX25hbWVzW2ldLm5hbWU7CisgICAgfQorCisgICAgcmV0dXJuICJDSVBIRVJfVU5LTk9XTiI7Cit9CisKK3R5cGVkZWYgdm9pZCAoKkNQalNTTFNvY2tldF9jYikoaW50IGVyciwgdm9pZCAqa2V5KTsKKworY2xhc3MgQ1BqU1NMU29ja2V0UmVhZGVyIDogcHVibGljIENBY3RpdmUKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgQ1BqU1NMU29ja2V0UmVhZGVyICpOZXdMKENTZWN1cmVTb2NrZXQgJnNvY2spIAorICAgIHsKKwlDUGpTU0xTb2NrZXRSZWFkZXIgKnNlbGYgPSBuZXcgKEVMZWF2ZSkgCisJCQkJICAgQ1BqU1NMU29ja2V0UmVhZGVyKHNvY2spOworCUNsZWFudXBTdGFjazo6UHVzaEwoc2VsZik7CisJc2VsZi0+Q29uc3RydWN0TCgpOworCUNsZWFudXBTdGFjazo6UG9wKHNlbGYpOworCXJldHVybiBzZWxmOworICAgIH0KKworICAgIH5DUGpTU0xTb2NrZXRSZWFkZXIoKSB7CisJQ2FuY2VsKCk7CisgICAgfQorCisgICAgLyogQXN5bmNocm9ub3VzIHJlYWQgZnJvbSB0aGUgc29ja2V0LiAqLworICAgIGludCBSZWFkKENQalNTTFNvY2tldF9jYiBjYiwgdm9pZCAqa2V5LCBUUHRyOCAmZGF0YSwgVFVpbnQgZmxhZ3MpCisgICAgeworCVBKX0FTU0VSVF9SRVRVUk4oIUlzQWN0aXZlKCksIFBKX0VCVVNZKTsKKwkKKwljYl8gPSBjYjsKKwlrZXlfID0ga2V5OworCXNvY2tfLlJlY3ZPbmVPck1vcmUoZGF0YSwgaVN0YXR1cywgbGVuX3JlY2VpdmVkXyk7CisJU2V0QWN0aXZlKCk7CisJCisJcmV0dXJuIFBKX0VQRU5ESU5HOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDU2VjdXJlU29ja2V0ICAJJnNvY2tfOworICAgIENQalNTTFNvY2tldF9jYgkgY2JfOworICAgIHZvaWQJCSprZXlfOworICAgIFRTb2NrWGZyTGVuZ3RoICAJIGxlbl9yZWNlaXZlZF87IC8qIG5vdCByZWFsbHkgdXNlZnVsPyAqLworCisgICAgdm9pZCBEb0NhbmNlbCgpIHsKKwlzb2NrXy5DYW5jZWxBbGwoKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBSdW5MKCkgeworCSgqY2JfKShpU3RhdHVzLkludCgpLCBrZXlfKTsKKyAgICB9CisKKyAgICBDUGpTU0xTb2NrZXRSZWFkZXIoQ1NlY3VyZVNvY2tldCAmc29jaykgOiAKKwlDQWN0aXZlKDApLCBzb2NrXyhzb2NrKSwgY2JfKE5VTEwpLCBrZXlfKE5VTEwpIAorICAgIHt9CisgICAgCisgICAgdm9pZCBDb25zdHJ1Y3RMKCkgeworCUNBY3RpdmVTY2hlZHVsZXI6OkFkZCh0aGlzKTsKKyAgICB9Cit9OworCitjbGFzcyBDUGpTU0xTb2NrZXQgOiBwdWJsaWMgQ0FjdGl2ZQoreworcHVibGljOgorICAgIGVudW0gc3NsX3N0YXRlIHsKKwlTU0xfU1RBVEVfTlVMTCwKKwlTU0xfU1RBVEVfQ09OTkVDVElORywKKwlTU0xfU1RBVEVfSEFORFNIQUtJTkcsCisJU1NMX1NUQVRFX0VTVEFCTElTSEVECisgICAgfTsKKyAgICAKKyAgICBzdGF0aWMgQ1BqU1NMU29ja2V0ICpOZXdMKGNvbnN0IFREZXNDOCAmc3NsX3Byb3RvLAorCQkJICAgICAgcGpfcW9zX3R5cGUgcW9zX3R5cGUsCisJCQkgICAgICBjb25zdCBwal9xb3NfcGFyYW1zICZxb3NfcGFyYW1zKSAKKyAgICB7CisJQ1BqU1NMU29ja2V0ICpzZWxmID0gbmV3IChFTGVhdmUpIENQalNTTFNvY2tldChxb3NfdHlwZSwgcW9zX3BhcmFtcyk7CisJQ2xlYW51cFN0YWNrOjpQdXNoTChzZWxmKTsKKwlzZWxmLT5Db25zdHJ1Y3RMKHNzbF9wcm90byk7CisJQ2xlYW51cFN0YWNrOjpQb3Aoc2VsZik7CisJcmV0dXJuIHNlbGY7CisgICAgfQorCisgICAgfkNQalNTTFNvY2tldCgpIHsKKwlDYW5jZWwoKTsKKwlDbGVhbnVwU3ViT2JqZWN0cygpOworICAgIH0KKworICAgIGludCBDb25uZWN0KENQalNTTFNvY2tldF9jYiBjYiwgdm9pZCAqa2V5LCBjb25zdCBUSW5ldEFkZHIgJmxvY2FsX2FkZHIsIAorCQljb25zdCBUSW5ldEFkZHIgJnJlbV9hZGRyLCAKKwkJY29uc3QgVERlc0M4ICZzZXJ2ZXJuYW1lID0gVFB0ckM4KE5VTEwsMCksCisJCWNvbnN0IFREZXNDOCAmY2lwaGVycyA9IFRQdHJDOChOVUxMLDApKTsKKyAgICBpbnQgU2VuZChDUGpTU0xTb2NrZXRfY2IgY2IsIHZvaWQgKmtleSwgY29uc3QgVERlc0M4ICZhRGVzYywgVFVpbnQgZmxhZ3MpOworICAgIGludCBTZW5kU3luYyhjb25zdCBURGVzQzggJmFEZXNjLCBUVWludCBmbGFncyk7CisKKyAgICBDUGpTU0xTb2NrZXRSZWFkZXIqIEdldFJlYWRlcigpOworICAgIGVudW0gc3NsX3N0YXRlIEdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfOyB9CisgICAgY29uc3QgVEluZXRBZGRyKiBHZXRMb2NhbEFkZHIoKSBjb25zdCB7IHJldHVybiAmbG9jYWxfYWRkcl87IH0KKyAgICBpbnQgR2V0Q2lwaGVyKFREZXM4ICZjaXBoZXIpIGNvbnN0IHsKKwlpZiAoc2VjdXJlc29ja18pCisJICAgIHJldHVybiBzZWN1cmVzb2NrXy0+Q3VycmVudENpcGhlclN1aXRlKGNpcGhlcik7CisJcmV0dXJuIEtFcnJOb3RGb3VuZDsKKyAgICB9CisgICAgY29uc3QgQ1g1MDlDZXJ0aWZpY2F0ZSAqR2V0UGVlckNlcnQoKSB7CisJaWYgKHNlY3VyZXNvY2tfKQorCSAgICByZXR1cm4gc2VjdXJlc29ja18tPlNlcnZlckNlcnQoKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZW51bSBzc2xfc3RhdGUJIHN0YXRlXzsKKyAgICBwal9zb2NrX3QJICAgIAkgc29ja187CisgICAgQ1NlY3VyZVNvY2tldCAgCSpzZWN1cmVzb2NrXzsKKyAgICBib29sCSAgICAJIGlzX2Nvbm5lY3RlZF87CisgICAgCisgICAgcGpfcW9zX3R5cGUgCSBxb3NfdHlwZV87CisgICAgcGpfcW9zX3BhcmFtcyAJIHFvc19wYXJhbXNfOworICAgIAkJCSAgICAgIAorICAgIENQalNTTFNvY2tldFJlYWRlciAgKnJlYWRlcl87CisgICAgVEJ1ZjwzMj4gCSAgICAJIHNzbF9wcm90b187CisgICAgVEluZXRBZGRyICAgICAgIAkgcmVtX2FkZHJfOworICAgIFRQdHJDOAkJIHNlcnZlcm5hbWVfOworICAgIFRQdHJDOAkJIGNpcGhlcnNfOworICAgIFRJbmV0QWRkciAgICAgICAJIGxvY2FsX2FkZHJfOworICAgIFRTb2NrWGZyTGVuZ3RoIAkgc2VudF9sZW5fOworCisgICAgQ1BqU1NMU29ja2V0X2NiIAkgY2JfOworICAgIHZvaWQgCSAgIAkqa2V5XzsKKyAgICAKKyAgICB2b2lkIERvQ2FuY2VsKCk7CisgICAgdm9pZCBSdW5MKCk7CisKKyAgICBDUGpTU0xTb2NrZXQocGpfcW9zX3R5cGUgcW9zX3R5cGUsIGNvbnN0IHBqX3Fvc19wYXJhbXMgJnFvc19wYXJhbXMpIDoKKwlDQWN0aXZlKDApLCBzdGF0ZV8oU1NMX1NUQVRFX05VTEwpLCBzb2NrXyhQSl9JTlZBTElEX1NPQ0tFVCksIAorCXNlY3VyZXNvY2tfKE5VTEwpLCBpc19jb25uZWN0ZWRfKGZhbHNlKSwKKwlxb3NfdHlwZV8ocW9zX3R5cGUpLCBxb3NfcGFyYW1zXyhxb3NfcGFyYW1zKSwKKwlyZWFkZXJfKE5VTEwpLCAJY2JfKE5VTEwpLCBrZXlfKE5VTEwpCisgICAge30KKyAgICAKKyAgICB2b2lkIENvbnN0cnVjdEwoY29uc3QgVERlc0M4ICZzc2xfcHJvdG8pIHsKKwlzc2xfcHJvdG9fLkNvcHkoc3NsX3Byb3RvKTsKKwlDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7CisgICAgfQorCisgICAgdm9pZCBDbGVhbnVwU3ViT2JqZWN0cygpIHsKKwlkZWxldGUgcmVhZGVyXzsKKwlyZWFkZXJfID0gTlVMTDsKKwlpZiAoc2VjdXJlc29ja18pIHsKKwkgICAgaWYgKHN0YXRlXyA9PSBTU0xfU1RBVEVfRVNUQUJMSVNIRUQpCisJCXNlY3VyZXNvY2tfLT5DbG9zZSgpOworCSAgICBkZWxldGUgc2VjdXJlc29ja187CisJICAgIHNlY3VyZXNvY2tfID0gTlVMTDsKKwl9CisJaWYgKHNvY2tfICE9IFBKX0lOVkFMSURfU09DS0VUKSB7CisJICAgIHBqX3NvY2tfY2xvc2Uoc29ja18pOworCSAgICBzb2NrXyA9IFBKX0lOVkFMSURfU09DS0VUOworCX0JICAgIAorICAgIH0KK307CisKK2ludCBDUGpTU0xTb2NrZXQ6OkNvbm5lY3QoQ1BqU1NMU29ja2V0X2NiIGNiLCB2b2lkICprZXksIAorCQkJICBjb25zdCBUSW5ldEFkZHIgJmxvY2FsX2FkZHIsIAorCQkJICBjb25zdCBUSW5ldEFkZHIgJnJlbV9hZGRyLAorCQkJICBjb25zdCBURGVzQzggJnNlcnZlcm5hbWUsCisJCQkgIGNvbnN0IFREZXNDOCAmY2lwaGVycykKK3sKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgCisgICAgUEpfQVNTRVJUX1JFVFVSTihzdGF0ZV8gPT0gU1NMX1NUQVRFX05VTEwsIFBKX0VJTlZBTElET1ApOworICAgIAorICAgIHN0YXR1cyA9IHBqX3NvY2tfc29ja2V0KHJlbV9hZGRyLkZhbWlseSgpLCBwal9TT0NLX1NUUkVBTSgpLCAwLCAmc29ja18pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gc3RhdHVzOworCisgICAgLy8gQXBwbHkgUW9TCisgICAgc3RhdHVzID0gcGpfc29ja19hcHBseV9xb3MyKHNvY2tfLCBxb3NfdHlwZV8sICZxb3NfcGFyYW1zXywgCisgICAgCQkJCTIsICBUSElTX0ZJTEUsIE5VTEwpOworICAgIAorICAgIFJTb2NrZXQgJnJTb2NrID0gKChDUGpTb2NrZXQqKXNvY2tfKS0+U29ja2V0KCk7CisKKyAgICBsb2NhbF9hZGRyXyA9IGxvY2FsX2FkZHI7CisgICAgCisgICAgaWYgKCFsb2NhbF9hZGRyXy5Jc1Vuc3BlY2lmaWVkKCkpIHsKKwlUSW50IGVyciA9IHJTb2NrLkJpbmQobG9jYWxfYWRkcl8pOworCWlmIChlcnIgIT0gS0Vyck5vbmUpCisJICAgIHJldHVybiBQSl9SRVRVUk5fT1NfRVJST1IoZXJyKTsKKyAgICB9CisgICAgCisgICAgY2JfID0gY2I7CisgICAga2V5XyA9IGtleTsKKyAgICByZW1fYWRkcl8gPSByZW1fYWRkcjsKKyAgICAKKyAgICAvKiBOb3RlOiB0aGUgZm9sbG93aW5nIG1lbWJlcnMgb25seSBrZWVwIHRoZSBwb2ludGVyLCBub3QgdGhlIGRhdGEgKi8KKyAgICBzZXJ2ZXJuYW1lXy5TZXQoc2VydmVybmFtZSk7CisgICAgY2lwaGVyc18uU2V0KGNpcGhlcnMpOworCisgICAgclNvY2suQ29ubmVjdChyZW1fYWRkcl8sIGlTdGF0dXMpOworICAgIFNldEFjdGl2ZSgpOworICAgIHN0YXRlXyA9IFNTTF9TVEFURV9DT05ORUNUSU5HOworICAgIAorICAgIHJTb2NrLkxvY2FsTmFtZShsb2NhbF9hZGRyXyk7CisKKyAgICByZXR1cm4gUEpfRVBFTkRJTkc7Cit9CisKK2ludCBDUGpTU0xTb2NrZXQ6OlNlbmQoQ1BqU1NMU29ja2V0X2NiIGNiLCB2b2lkICprZXksIGNvbnN0IFREZXNDOCAmYURlc2MsIAorCQkgICAgICAgVFVpbnQgZmxhZ3MpCit7CisgICAgUEpfVU5VU0VEX0FSRyhmbGFncyk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXRlXyA9PSBTU0xfU1RBVEVfRVNUQUJMSVNIRUQsIFBKX0VJTlZBTElET1ApOworICAgIAorICAgIGlmIChJc0FjdGl2ZSgpKQorCXJldHVybiBQSl9FQlVTWTsKKyAgICAKKyAgICBjYl8gPSBjYjsKKyAgICBrZXlfID0ga2V5OworICAgIAorICAgIHNlY3VyZXNvY2tfLT5TZW5kKGFEZXNjLCBpU3RhdHVzLCBzZW50X2xlbl8pOworICAgIFNldEFjdGl2ZSgpOworICAgIAorICAgIHJldHVybiBQSl9FUEVORElORzsKK30KKworaW50IENQalNTTFNvY2tldDo6U2VuZFN5bmMoY29uc3QgVERlc0M4ICZhRGVzYywgVFVpbnQgZmxhZ3MpCit7CisgICAgUEpfVU5VU0VEX0FSRyhmbGFncyk7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXRlXyA9PSBTU0xfU1RBVEVfRVNUQUJMSVNIRUQsIFBKX0VJTlZBTElET1ApOworICAgIAorICAgIFRSZXF1ZXN0U3RhdHVzIHJlcVN0YXR1czsKKyAgICBzZWN1cmVzb2NrXy0+U2VuZChhRGVzYywgcmVxU3RhdHVzLCBzZW50X2xlbl8pOworICAgIFVzZXI6OldhaXRGb3JSZXF1ZXN0KHJlcVN0YXR1cyk7CisgICAgCisgICAgcmV0dXJuIFBKX1JFVFVSTl9PU19FUlJPUihyZXFTdGF0dXMuSW50KCkpOworfQorCitDUGpTU0xTb2NrZXRSZWFkZXIqIENQalNTTFNvY2tldDo6R2V0UmVhZGVyKCkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHN0YXRlXyA9PSBTU0xfU1RBVEVfRVNUQUJMSVNIRUQsIE5VTEwpOworICAgIAorICAgIGlmIChyZWFkZXJfKQorCXJldHVybiByZWFkZXJfOworICAgIAorICAgIFRSQVBEKGVyciwJcmVhZGVyXyA9IENQalNTTFNvY2tldFJlYWRlcjo6TmV3TCgqc2VjdXJlc29ja18pKTsKKyAgICBpZiAoZXJyICE9IEtFcnJOb25lKQorCXJldHVybiBOVUxMOworICAgIAorICAgIHJldHVybiByZWFkZXJfOworfQorCit2b2lkIENQalNTTFNvY2tldDo6RG9DYW5jZWwoKQoreworICAgIC8qIE9wZXJhdGlvbiB0byBiZSBjYW5jZWxsZWQgZGVwZW5kcyBvbiBjdXJyZW50IHN0YXRlICovCisgICAgc3dpdGNoIChzdGF0ZV8pIHsKKyAgICBjYXNlIFNTTF9TVEFURV9DT05ORUNUSU5HOgorCXsKKwkgICAgUlNvY2tldCAmclNvY2sgPSAoKENQalNvY2tldCopc29ja18pLT5Tb2NrZXQoKTsKKworCSAgICByU29jay5DYW5jZWxDb25uZWN0KCk7CisJICAgIENsZWFudXBTdWJPYmplY3RzKCk7CisJICAgIHN0YXRlXyA9IFNTTF9TVEFURV9OVUxMOworCX0KKwlicmVhazsKKyAgICBjYXNlIFNTTF9TVEFURV9IQU5EU0hBS0lORzoKKwl7CisJICAgIHNlY3VyZXNvY2tfLT5DYW5jZWxIYW5kc2hha2UoKTsKKwkgICAgQ2xlYW51cFN1Yk9iamVjdHMoKTsKKwkgICAgc3RhdGVfID0gU1NMX1NUQVRFX05VTEw7CisJfQorCWJyZWFrOworICAgIGNhc2UgU1NMX1NUQVRFX0VTVEFCTElTSEVEOgorCXNlY3VyZXNvY2tfLT5DYW5jZWxTZW5kKCk7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgQ1BqU1NMU29ja2V0OjpSdW5MKCkKK3sKKyAgICBzd2l0Y2ggKHN0YXRlXykgeworICAgIGNhc2UgU1NMX1NUQVRFX0NPTk5FQ1RJTkc6CisJaWYgKGlTdGF0dXMgIT0gS0Vyck5vbmUpIHsKKwkgICAgQ2xlYW51cFN1Yk9iamVjdHMoKTsKKwkgICAgc3RhdGVfID0gU1NMX1NUQVRFX05VTEw7CisJICAgIC8qIERpc3BhdGNoIGNvbm5lY3QgZmFpbHVyZSBub3RpZmljYXRpb24gKi8KKwkgICAgaWYgKGNiXykgKCpjYl8pKGlTdGF0dXMuSW50KCksIGtleV8pOworCX0gZWxzZSB7CisJICAgIFJTb2NrZXQgJnJTb2NrID0gKChDUGpTb2NrZXQqKXNvY2tfKS0+U29ja2V0KCk7CisKKwkgICAgLyogR2V0IGxvY2FsIGFkZHIgKi8KKwkgICAgclNvY2suTG9jYWxOYW1lKGxvY2FsX2FkZHJfKTsKKwkgICAgCisJICAgIC8qIFByZXBhcmUgYW5kIHN0YXJ0IGhhbmRzaGFrZSAqLworCSAgICBzZWN1cmVzb2NrXyA9IENTZWN1cmVTb2NrZXQ6Ok5ld0woclNvY2ssIHNzbF9wcm90b18pOworCSAgICBzZWN1cmVzb2NrXy0+U2V0RGlhbG9nTW9kZShFRGlhbG9nTW9kZUF0dGVuZGVkKTsKKwkgICAgaWYgKHNlcnZlcm5hbWVfLkxlbmd0aCgpID4gMCkKKwkJc2VjdXJlc29ja18tPlNldE9wdChLU29TU0xEb21haW5OYW1lLCBLU29sSW5ldFNTTCwKKwkJCQkgICAgc2VydmVybmFtZV8pOworCSAgICBpZiAoY2lwaGVyc18uTGVuZ3RoKCkgPiAwKQorCQlzZWN1cmVzb2NrXy0+U2V0QXZhaWxhYmxlQ2lwaGVyU3VpdGVzKGNpcGhlcnNfKTsKKworCSAgICAvLyBGbHVzaFNlc3Npb25DYWNoZSgpIHNlZW1zIHRvIGFsc28gZmlyZSBzaWduYWxzIHRvIGFsbCAKKwkgICAgLy8gY29tcGxldGVkIEFPcyAoc29tZXRoaW5nIGxpa2UgQ0FjdGl2ZVNjaGVkdWxlcjo6UnVuSWZSZWFkeSgpKQorCSAgICAvLyB3aGljaCBtYXkgY2F1c2UgcHJvYmxlbSwgZS5nOiB3ZSd2ZSBleHBlcmllbmNlZCB0aGF0IHdoZW4gCisJICAgIC8vIFNTTCB0aW1lb3V0IGlzIHNldCB0byAxcywgdGhlIFNTTCB0aW1lb3V0IHRpbWVyIGZpcmVzIHVwCisJICAgIC8vIGF0IHRoaXMgcG9pbnQgYW5kIHNlY3VyZXNvY2tfIGluc3RhbmNlIGdldHMgZGVsZXRlZCBoZXJlIQorCSAgICAvLyBTbyBiZSBjYXJlZnVsIHVzaW5nIHRoaXMuIEFuZCB3ZSBkb24ndCB0aGluayB3ZSBuZWVkIGl0IGhlcmUuCisJICAgIC8vc2VjdXJlc29ja18tPkZsdXNoU2Vzc2lvbkNhY2hlKCk7CisKKwkgICAgc2VjdXJlc29ja18tPlN0YXJ0Q2xpZW50SGFuZHNoYWtlKGlTdGF0dXMpOworCSAgICBTZXRBY3RpdmUoKTsKKwkgICAgc3RhdGVfID0gU1NMX1NUQVRFX0hBTkRTSEFLSU5HOworCX0KKwlicmVhazsKKyAgICBjYXNlIFNTTF9TVEFURV9IQU5EU0hBS0lORzoKKwlpZiAoaVN0YXR1cyA9PSBLRXJyTm9uZSkgeworCSAgICBzdGF0ZV8gPSBTU0xfU1RBVEVfRVNUQUJMSVNIRUQ7CisJfSBlbHNlIHsKKwkgICAgc3RhdGVfID0gU1NMX1NUQVRFX05VTEw7CisJICAgIENsZWFudXBTdWJPYmplY3RzKCk7CisJfQorCS8qIERpc3BhdGNoIGNvbm5lY3Qgc3RhdHVzIG5vdGlmaWNhdGlvbiAqLworCWlmIChjYl8pICgqY2JfKShpU3RhdHVzLkludCgpLCBrZXlfKTsKKwlicmVhazsKKyAgICBjYXNlIFNTTF9TVEFURV9FU1RBQkxJU0hFRDoKKwkvKiBEaXNwYXRjaCBkYXRhIHNlbnQgbm90aWZpY2F0aW9uICovCisJaWYgKGNiXykgKCpjYl8pKGlTdGF0dXMuSW50KCksIGtleV8pOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcGpfYXNzZXJ0KDApOworCWJyZWFrOworICAgIH0KK30KKwordHlwZWRlZiB2b2lkICgqQ1BqVGltZXJfY2IpKHZvaWQgKnVzZXJfZGF0YSk7CisKK2NsYXNzIENQalRpbWVyIDogcHVibGljIENBY3RpdmUgCit7CitwdWJsaWM6CisgICAgQ1BqVGltZXIoY29uc3QgcGpfdGltZV92YWwgKmRlbGF5LCBDUGpUaW1lcl9jYiBjYiwgdm9pZCAqdXNlcl9kYXRhKSA6IAorCUNBY3RpdmUoMCksIGNiXyhjYiksIHVzZXJfZGF0YV8odXNlcl9kYXRhKQorICAgIHsKKwlDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7CisKKwlydGltZXJfLkNyZWF0ZUxvY2FsKCk7CisJcGpfaW50MzJfdCBpbnRlcnZhbCA9IFBKX1RJTUVfVkFMX01TRUMoKmRlbGF5KSAqIDEwMDA7CisJaWYgKGludGVydmFsIDwgMCkgeworCSAgICBpbnRlcnZhbCA9IDA7CisJfQorCXJ0aW1lcl8uQWZ0ZXIoaVN0YXR1cywgaW50ZXJ2YWwpOworCVNldEFjdGl2ZSgpOworICAgIH0KKyAgICAKKyAgICB+Q1BqVGltZXIoKSB7IENhbmNlbCgpOyB9CisgICAgCitwcml2YXRlOgkKKyAgICBSVGltZXIJCSBydGltZXJfOworICAgIENQalRpbWVyX2NiCQkgY2JfOworICAgIHZvaWQJCSp1c2VyX2RhdGFfOworICAgIAorICAgIHZvaWQgUnVuTCgpIHsgaWYgKGNiXykgKCpjYl8pKHVzZXJfZGF0YV8pOyB9CisgICAgdm9pZCBEb0NhbmNlbCgpIHsgcnRpbWVyXy5DYW5jZWwoKTsgfQorfTsKKworLyoKKyAqIFN0cnVjdHVyZSBvZiByZWN2L3JlYWQgc3RhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHJlYWRfc3RhdGVfdCB7CisgICAgVFB0cjgJCSpyZWFkX2J1ZjsKKyAgICBUUHRyOAkJKm9yaWdfYnVmOworICAgIHBqX3VpbnQzMl90CQkgZmxhZ3M7ICAgIAorfSByZWFkX3N0YXRlX3Q7CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2Ygc2VuZC93cml0ZSBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCB3cml0ZV9kYXRhX3QgeworICAgIHBqX3NpemVfdCAJIAkgbGVuOworICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QJKmtleTsKKyAgICBwal9zaXplX3QgCSAJIGRhdGFfbGVuOworICAgIGNoYXIJCSBkYXRhWzFdOworfSB3cml0ZV9kYXRhX3Q7CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2Ygc2VuZC93cml0ZSBzdGF0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgd3JpdGVfc3RhdGVfdCB7CisgICAgY2hhcgkJKmJ1ZjsKKyAgICBwal9zaXplX3QJCSBtYXhfbGVuOyAgICAKKyAgICBjaGFyCQkqc3RhcnQ7CisgICAgcGpfc2l6ZV90CQkgbGVuOworICAgIHdyaXRlX2RhdGFfdAkqY3VycmVudF9kYXRhOworICAgIFRQdHJDOAkJIHNlbmRfcHRyOworfSB3cml0ZV9zdGF0ZV90OworCisvKgorICogU2VjdXJlIHNvY2tldCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworc3RydWN0IHBqX3NzbF9zb2NrX3QKK3sKKyAgICBwal9wb29sX3QJCSpwb29sOworICAgIHBqX3NzbF9zb2NrX2NiCSBjYjsKKyAgICB2b2lkCQkqdXNlcl9kYXRhOworICAgIAorICAgIHBqX2Jvb2xfdAkJIGVzdGFibGlzaGVkOworICAgIHdyaXRlX3N0YXRlX3QJIHdyaXRlX3N0YXRlOworICAgIHJlYWRfc3RhdGVfdAkgcmVhZF9zdGF0ZTsKKyAgICBDUGpUaW1lcgkJKmNvbm5lY3RfdGltZXI7CisKKyAgICBDUGpTU0xTb2NrZXQgICAJKnNvY2s7CisgICAgaW50CQkJIHNvY2tfYWY7CisgICAgaW50CQkJIHNvY2tfdHlwZTsKKyAgICBwal9zb2NrYWRkcgkJIGxvY2FsX2FkZHI7CisgICAgcGpfc29ja2FkZHIJCSByZW1fYWRkcjsKKworICAgIC8qIFFvUyBzZXR0aW5ncyAqLworICAgIHBqX3Fvc190eXBlCQkgcW9zX3R5cGU7CisgICAgcGpfcW9zX3BhcmFtcwkgcW9zX3BhcmFtczsKKyAgICBwal9ib29sX3QJCSBxb3NfaWdub3JlX2Vycm9yOworCisKKyAgICBwal9zc2xfc29ja19wcm90bwkgcHJvdG87CisgICAgcGpfdGltZV92YWwJCSB0aW1lb3V0OworICAgIHBqX3N0cl90CQkgc2VydmVybmFtZTsKKyAgICBwal9zdHJfdAkJIGNpcGhlcnM7CisgICAgcGpfc3NsX2NlcnRfaW5mbwkgcmVtb3RlX2NlcnRfaW5mbzsKK307CisKKworc3RhdGljIHBqX3N0cl90IGdldF9jZXJ0X25hbWUoY2hhciAqYnVmLCB1bnNpZ25lZCBidWZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1g1MDBEaXN0aW5ndWlzaGVkTmFtZSAmbmFtZSkKK3sKKyAgICBUSW50IGk7CisgICAgVFVpbnQ4ICpwOworICAgIFRJbnQgbCA9IGJ1Zl9sZW47CisgICAgCisgICAgcCA9IChUVWludDgqKWJ1ZjsKKyAgICBmb3IoaSA9IDA7IGkgPCBuYW1lLkNvdW50KCk7ICsraSkgeworCWNvbnN0IENYNTIwQXR0cmlidXRlVHlwZUFuZFZhbHVlICZhdHRyID0gbmFtZS5FbGVtZW50KGkpOworCisJLyogUHJpbnQgZWxlbWVudCBzZXBhcmF0b3IgKi8KKwkqcCsrID0gJy8nOworCWlmICgwID09IC0tbCkgYnJlYWs7CisKKwkvKiBQcmludCB0aGUgdHlwZS4gKi8KKwlUUHRyOCB0eXBlKHAsIGwpOworCXR5cGUuQ29weShhdHRyLlR5cGUoKSk7CisJcCArPSB0eXBlLkxlbmd0aCgpOworCWwgLT0gdHlwZS5MZW5ndGgoKTsKKwlpZiAoMCA+PSAtLWwpIGJyZWFrOworCisJLyogUHJpbnQgZXF1YWwgc2lnbiAqLworCSpwKysgPSAnPSc7CisJaWYgKDAgPT0gLS1sKSBicmVhazsKKwkKKwkvKiBQcmludCB0aGUgdmFsdWUuIExldCdzIGp1c3QgZ2V0IHRoZSByYXcgZGF0YSBoZXJlICovCisJVFB0cjggdmFsdWUocCwgbCk7CisJdmFsdWUuQ29weShhdHRyLkVuY29kZWRWYWx1ZSgpLk1pZCgyKSk7CisJcCArPSB2YWx1ZS5MZW5ndGgoKTsKKwlsIC09IHZhbHVlLkxlbmd0aCgpOworCWlmICgwID49IC0tbCkgYnJlYWs7CisgICAgfQorICAgIAorICAgIHBqX3N0cl90IHNyYzsKKyAgICBwal9zdHJzZXQoJnNyYywgYnVmLCBidWZfbGVuIC0gbCk7CisgICAgCisgICAgcmV0dXJuIHNyYzsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qIEdldCBjZXJ0aWZpY2F0ZSBpbmZvIGZyb20gQ1g1MDlDZXJ0aWZpY2F0ZS4KKyAqLworc3RhdGljIHZvaWQgZ2V0X2NlcnRfaW5mbyhwal9wb29sX3QgKnBvb2wsIHBqX3NzbF9jZXJ0X2luZm8gKmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWDUwOUNlcnRpZmljYXRlICp4KQoreworICAgIGVudW0geyB0bXBfYnVmX2xlbiA9IDUxMiB9OworICAgIGNoYXIgKnRtcF9idWY7CisgICAgdW5zaWduZWQgbGVuOworICAgIAorICAgIHBqX2Fzc2VydChwb29sICYmIGNpICYmIHgpOworICAgIAorICAgIC8qIEluaXQgKi8KKyAgICB0bXBfYnVmID0gbmV3IGNoYXJbdG1wX2J1Zl9sZW5dOworICAgIHBqX2J6ZXJvKGNpLCBzaXplb2YoKmNpKSk7CisgICAgCisgICAgLyogVmVyc2lvbiAqLworICAgIGNpLT52ZXJzaW9uID0geC0+VmVyc2lvbigpOworICAgIAorICAgIC8qIFNlcmlhbCBudW1iZXIgKi8KKyAgICBsZW4gPSB4LT5TZXJpYWxOdW1iZXIoKS5MZW5ndGgoKTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKGNpLT5zZXJpYWxfbm8pKSAKKwlsZW4gPSBzaXplb2YoY2ktPnNlcmlhbF9ubyk7CisgICAgcGpfbWVtY3B5KGNpLT5zZXJpYWxfbm8gKyBzaXplb2YoY2ktPnNlcmlhbF9ubykgLSBsZW4sIAorICAgICAgICAgICAgICB4LT5TZXJpYWxOdW1iZXIoKS5QdHIoKSwgbGVuKTsKKyAgICAKKyAgICAvKiBTdWJqZWN0ICovCisgICAgeworCUhCdWZDICpzdWJqZWN0ID0gTlVMTDsKKwlUUkFQRChlcnIsIHN1YmplY3QgPSB4LT5TdWJqZWN0TCgpKTsKKwlpZiAoZXJyID09IEtFcnJOb25lKSB7CisJICAgIFRQdHIxNiBwdHIxNihzdWJqZWN0LT5EZXMoKSk7CisJICAgIGxlbiA9IHB0cjE2Lkxlbmd0aCgpOworCSAgICBUUHRyOCBwdHI4KChUVWludDgqKXBqX3Bvb2xfYWxsb2MocG9vbCwgbGVuKSwgbGVuKTsKKwkgICAgcHRyOC5Db3B5KHB0cjE2KTsKKwkgICAgcGpfc3Ryc2V0KCZjaS0+c3ViamVjdC5jbiwgKGNoYXIqKXB0cjguUHRyKCksIHB0cjguTGVuZ3RoKCkpOworCX0KKwlwal9zdHJfdCB0bXAgPSBnZXRfY2VydF9uYW1lKHRtcF9idWYsIHRtcF9idWZfbGVuLAorCQkJCSAgICAgeC0+U3ViamVjdE5hbWUoKSk7CisJcGpfc3RyZHVwKHBvb2wsICZjaS0+c3ViamVjdC5pbmZvLCAmdG1wKTsKKyAgICB9CisKKyAgICAvKiBJc3N1ZXIgKi8KKyAgICB7CisJSEJ1ZkMgKmlzc3VlciA9IE5VTEw7CisJVFJBUEQoZXJyLCBpc3N1ZXIgPSB4LT5Jc3N1ZXJMKCkpOworCWlmIChlcnIgPT0gS0Vyck5vbmUpIHsKKwkgICAgVFB0cjE2IHB0cjE2KGlzc3Vlci0+RGVzKCkpOworCSAgICBsZW4gPSBwdHIxNi5MZW5ndGgoKTsKKwkgICAgVFB0cjggcHRyOCgoVFVpbnQ4Kilwal9wb29sX2FsbG9jKHBvb2wsIGxlbiksIGxlbik7CisJICAgIHB0cjguQ29weShwdHIxNik7CisJICAgIHBqX3N0cnNldCgmY2ktPmlzc3Vlci5jbiwgKGNoYXIqKXB0cjguUHRyKCksIHB0cjguTGVuZ3RoKCkpOworCX0KKwlwal9zdHJfdCB0bXAgPSBnZXRfY2VydF9uYW1lKHRtcF9idWYsIHRtcF9idWZfbGVuLAorCQkJCSAgICAgeC0+SXNzdWVyTmFtZSgpKTsKKwlwal9zdHJkdXAocG9vbCwgJmNpLT5pc3N1ZXIuaW5mbywgJnRtcCk7CisgICAgfQorICAgIAorICAgIC8qIFZhbGlkaXR5ICovCisgICAgY29uc3QgQ1ZhbGlkaXR5UGVyaW9kICZ2YWxpZF9wZXJpb2QgPSB4LT5WYWxpZGl0eVBlcmlvZCgpOworICAgIFRUaW1lIGJhc2VfdGltZShURGF0ZVRpbWUoMTk3MCwgRUphbnVhcnksIDAsIDAsIDAsIDAsIDApKTsKKyAgICBUVGltZUludGVydmFsU2Vjb25kcyB0bXBfc2VjOworICAgIHZhbGlkX3BlcmlvZC5TdGFydCgpLlNlY29uZHNGcm9tKGJhc2VfdGltZSwgdG1wX3NlYyk7CisgICAgY2ktPnZhbGlkaXR5LnN0YXJ0LnNlYyA9IHRtcF9zZWMuSW50KCk7IAorICAgIHZhbGlkX3BlcmlvZC5GaW5pc2goKS5TZWNvbmRzRnJvbShiYXNlX3RpbWUsIHRtcF9zZWMpOworICAgIGNpLT52YWxpZGl0eS5lbmQuc2VjID0gdG1wX3NlYy5JbnQoKTsKKyAgICAKKyAgICAvKiBEZWluaXQgKi8KKyAgICBkZWxldGUgW10gdG1wX2J1ZjsKK30KKworCisvKiBVcGRhdGUgY2VydGlmaWNhdGVzIGluZm8uIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBoYW5kc2hha2UKKyAqIG9yIHJlbmVnb3RpYXRpb24gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX2NlcnRzX2luZm8ocGpfc3NsX3NvY2tfdCAqc3NvY2spCit7CisgICAgY29uc3QgQ1g1MDlDZXJ0aWZpY2F0ZSAqeDsKKworICAgIHBqX2Fzc2VydChzc29jayAmJiBzc29jay0+c29jayAmJgorICAgICAgICAgICAgICBzc29jay0+c29jay0+R2V0U3RhdGUoKSA9PSBDUGpTU0xTb2NrZXQ6OlNTTF9TVEFURV9FU1RBQkxJU0hFRCk7CisgICAgICAgIAorICAgIC8qIEFjdGl2ZSByZW1vdGUgY2VydGlmaWNhdGUgKi8KKyAgICB4ID0gc3NvY2stPnNvY2stPkdldFBlZXJDZXJ0KCk7CisgICAgaWYgKHgpIHsKKwlnZXRfY2VydF9pbmZvKHNzb2NrLT5wb29sLCAmc3NvY2stPnJlbW90ZV9jZXJ0X2luZm8sIHgpOworICAgIH0gZWxzZSB7CisJcGpfYnplcm8oJnNzb2NrLT5yZW1vdGVfY2VydF9pbmZvLCBzaXplb2YocGpfc3NsX2NlcnRfaW5mbykpOworICAgIH0KK30KKworCisvKiBBdmFpbGFibGUgY2lwaGVycyAqLworc3RhdGljIHVuc2lnbmVkIGNpcGhlcnNfbnVtXyA9IDA7CitzdGF0aWMgc3RydWN0IGNpcGhlcnNfdAoreworICAgIHBqX3NzbF9jaXBoZXIgICAgaWQ7CisgICAgY29uc3QgY2hhcgkgICAgKm5hbWU7Cit9IGNpcGhlcnNfWzY0XTsKKworLyoKKyAqIEdldCBjaXBoZXIgbGlzdCBzdXBwb3J0ZWQgYnkgU1NML1RMUyBiYWNrZW5kLgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9jaXBoZXJfZ2V0X2F2YWlsYWJsZXMgKHBqX3NzbF9jaXBoZXIgY2lwaGVyc1tdLAorCQkJCQkgICAgICAgICAgdW5zaWduZWQgKmNpcGhlcl9udW0pCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oY2lwaGVycyAmJiBjaXBoZXJfbnVtLCBQSl9FSU5WQUwpOworICAgIAorICAgIGlmIChjaXBoZXJzX251bV8gPT0gMCkgeworICAgICAgICBSU29ja2V0IHNvY2s7CisgICAgICAgIENTZWN1cmVTb2NrZXQgKnNlY3VyZV9zb2NrOworICAgICAgICBUUHRyQzE2IHByb3RvKF9MMTYoIlRMUzEuMCIpKTsKKworICAgICAgICBzZWN1cmVfc29jayA9IENTZWN1cmVTb2NrZXQ6Ok5ld0woc29jaywgcHJvdG8pOworICAgICAgICBpZiAoc2VjdXJlX3NvY2spIHsKKyAgICAgICAgICAgIFRCdWY4PDEyOD4gY2lwaGVyc19idWYoMCk7CisgICAgICAgICAgICBzZWN1cmVfc29jay0+QXZhaWxhYmxlQ2lwaGVyU3VpdGVzKGNpcGhlcnNfYnVmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2lwaGVyc19udW1fID0gY2lwaGVyc19idWYuTGVuZ3RoKCkgLyAyOworICAgICAgICAgICAgaWYgKGNpcGhlcnNfbnVtXyA+IFBKX0FSUkFZX1NJWkUoY2lwaGVyc18pKQorICAgICAgICAJY2lwaGVyc19udW1fID0gUEpfQVJSQVlfU0laRShjaXBoZXJzXyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2lwaGVyc19udW1fOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjaXBoZXJzX1tpXS5pZCA9IChwal9zc2xfY2lwaGVyKShjaXBoZXJzX2J1ZltpKjJdKjEwICsgCisJCQkJCSAgICAgICAgIGNpcGhlcnNfYnVmW2kqMisxXSk7CisJCWNpcGhlcnNfW2ldLm5hbWUgPSBnZXRfY2lwaGVyX25hbWUoY2lwaGVyc19baV0uaWQpOworCSAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRlbGV0ZSBzZWN1cmVfc29jazsKKyAgICB9CisgICAgCisgICAgaWYgKGNpcGhlcnNfbnVtXyA9PSAwKSB7CisJKmNpcGhlcl9udW0gPSAwOworCXJldHVybiBQSl9FTk9URk9VTkQ7CisgICAgfQorICAgIAorICAgICpjaXBoZXJfbnVtID0gUEpfTUlOKCpjaXBoZXJfbnVtLCBjaXBoZXJzX251bV8pOworICAgIGZvciAoaSA9IDA7IGkgPCAqY2lwaGVyX251bTsgKytpKQorICAgICAgICBjaXBoZXJzW2ldID0gY2lwaGVyc19baV0uaWQ7CisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyogR2V0IGNpcGhlciBuYW1lIHN0cmluZyAqLworUEpfREVGKGNvbnN0IGNoYXIqKSBwal9zc2xfY2lwaGVyX25hbWUocGpfc3NsX2NpcGhlciBjaXBoZXIpCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIGlmIChjaXBoZXJzX251bV8gPT0gMCkgeworCXBqX3NzbF9jaXBoZXIgY1sxXTsKKwlpID0gMDsKKwlwal9zc2xfY2lwaGVyX2dldF9hdmFpbGFibGVzKGMsICZpKTsKKyAgICB9CisJCisgICAgZm9yIChpID0gMDsgaSA8IGNpcGhlcnNfbnVtXzsgKytpKSB7CisJaWYgKGNpcGhlciA9PSBjaXBoZXJzX1tpXS5pZCkKKwkgICAgcmV0dXJuIGNpcGhlcnNfW2ldLm5hbWU7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBjaXBoZXIgaXMgc3VwcG9ydGVkIGJ5IFNTTC9UTFMgYmFja2VuZC4gKi8KK1BKX0RFRihwal9ib29sX3QpIHBqX3NzbF9jaXBoZXJfaXNfc3VwcG9ydGVkKHBqX3NzbF9jaXBoZXIgY2lwaGVyKQoreworICAgIHVuc2lnbmVkIGk7CisKKyAgICBpZiAoY2lwaGVyc19udW1fID09IDApIHsKKwlwal9zc2xfY2lwaGVyIGNbMV07CisJaSA9IDA7CisJcGpfc3NsX2NpcGhlcl9nZXRfYXZhaWxhYmxlcyhjLCAmaSk7CisgICAgfQorCQorICAgIGZvciAoaSA9IDA7IGkgPCBjaXBoZXJzX251bV87ICsraSkgeworCWlmIChjaXBoZXIgPT0gY2lwaGVyc19baV0uaWQpCisJICAgIHJldHVybiBQSl9UUlVFOworICAgIH0KKworICAgIHJldHVybiBQSl9GQUxTRTsKK30KKworCisvKgorICogQ3JlYXRlIFNTTCBzb2NrZXQgaW5zdGFuY2UuIAorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9zb2NrX2NyZWF0ZSAocGpfcG9vbF90ICpwb29sLAorCQkJCQljb25zdCBwal9zc2xfc29ja19wYXJhbSAqcGFyYW0sCisJCQkJCXBqX3NzbF9zb2NrX3QgKipwX3Nzb2NrKQoreworICAgIHBqX3NzbF9zb2NrX3QgKnNzb2NrOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihwYXJhbS0+YXN5bmNfY250ID09IDEsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIHBhcmFtICYmIHBfc3NvY2ssIFBKX0VJTlZBTCk7CisKKyAgICAvKiBBbGxvY2F0ZSBzZWN1cmUgc29ja2V0ICovCisgICAgc3NvY2sgPSBQSl9QT09MX1pBTExPQ19UKHBvb2wsIHBqX3NzbF9zb2NrX3QpOworICAgIAorICAgIC8qIEFsbG9jYXRlIHdyaXRlIGJ1ZmZlciAqLworICAgIHNzb2NrLT53cml0ZV9zdGF0ZS5idWYgPSAoY2hhciopcGpfcG9vbF9hbGxvYyhwb29sLCAKKwkJCQkJCSAgcGFyYW0tPnNlbmRfYnVmZmVyX3NpemUpOworICAgIHNzb2NrLT53cml0ZV9zdGF0ZS5tYXhfbGVuID0gcGFyYW0tPnNlbmRfYnVmZmVyX3NpemU7CisgICAgc3NvY2stPndyaXRlX3N0YXRlLnN0YXJ0ID0gc3NvY2stPndyaXRlX3N0YXRlLmJ1ZjsKKyAgICAKKyAgICAvKiBJbml0IHNlY3VyZSBzb2NrZXQgKi8KKyAgICBzc29jay0+cG9vbCA9IHBvb2w7CisgICAgc3NvY2stPnNvY2tfYWYgPSBwYXJhbS0+c29ja19hZjsKKyAgICBzc29jay0+c29ja190eXBlID0gcGFyYW0tPnNvY2tfdHlwZTsKKyAgICBzc29jay0+Y2IgPSBwYXJhbS0+Y2I7CisgICAgc3NvY2stPnVzZXJfZGF0YSA9IHBhcmFtLT51c2VyX2RhdGE7CisgICAgc3NvY2stPnRpbWVvdXQgPSBwYXJhbS0+dGltZW91dDsKKyAgICBpZiAocGFyYW0tPmNpcGhlcnNfbnVtID4gMCkgeworCS8qIENpcGhlciBsaXN0IGluIFN5bWJpYW4gaXMgcmVwcmVzZW50ZWQgYXMgYXJyYXkgb2YgdHdvLW9jdGV0cy4gKi8KKwlzc29jay0+Y2lwaGVycy5zbGVuID0gcGFyYW0tPmNpcGhlcnNfbnVtKjI7CisJc3NvY2stPmNpcGhlcnMucHRyICA9IChjaGFyKilwal9wb29sX2FsbG9jKHBvb2wsIHNzb2NrLT5jaXBoZXJzLnNsZW4pOworCXBqX3VpbnQ4X3QgKmMgPSAocGpfdWludDhfdCopc3NvY2stPmNpcGhlcnMucHRyOworCWZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwYXJhbS0+Y2lwaGVyc19udW07ICsraSkgeworCSAgICAqYysrID0gKHBqX3VpbnQ4X3QpKHBhcmFtLT5jaXBoZXJzW2ldICYgMHhGRjAwKSA+PiA4OworCSAgICAqYysrID0gKHBqX3VpbnQ4X3QpKHBhcmFtLT5jaXBoZXJzW2ldICYgMHhGRik7CisJfQorICAgIH0KKyAgICBwal9zdHJkdXBfd2l0aF9udWxsKHBvb2wsICZzc29jay0+c2VydmVybmFtZSwgJnBhcmFtLT5zZXJ2ZXJfbmFtZSk7CisKKyAgICBzc29jay0+cW9zX3R5cGUgPSBwYXJhbS0+cW9zX3R5cGU7CisgICAgc3NvY2stPnFvc19pZ25vcmVfZXJyb3IgPSBwYXJhbS0+cW9zX2lnbm9yZV9lcnJvcjsKKyAgICBwal9tZW1jcHkoJnNzb2NrLT5xb3NfcGFyYW1zLCAmcGFyYW0tPnFvc19wYXJhbXMsCisJICAgICAgc2l6ZW9mKHBhcmFtLT5xb3NfcGFyYW1zKSk7CisKKyAgICAvKiBGaW5hbGx5ICovCisgICAgKnBfc3NvY2sgPSBzc29jazsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3NsX2NlcnRfbG9hZF9mcm9tX2ZpbGVzKHBqX3Bvb2xfdCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJY29uc3QgcGpfc3RyX3QgKkNBX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNvbnN0IHBqX3N0cl90ICpjZXJ0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNvbnN0IHBqX3N0cl90ICpwcml2a2V5X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNvbnN0IHBqX3N0cl90ICpwcml2a2V5X3Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCXBqX3NzbF9jZXJ0X3QgKipwX2NlcnQpCit7CisgICAgUEpfVU5VU0VEX0FSRyhwb29sKTsKKyAgICBQSl9VTlVTRURfQVJHKENBX2ZpbGUpOworICAgIFBKX1VOVVNFRF9BUkcoY2VydF9maWxlKTsKKyAgICBQSl9VTlVTRURfQVJHKHByaXZrZXlfZmlsZSk7CisgICAgUEpfVU5VU0VEX0FSRyhwcml2a2V5X3Bhc3MpOworICAgIFBKX1VOVVNFRF9BUkcocF9jZXJ0KTsKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyoKKyAqIFNldCBTU0wgc29ja2V0IGNyZWRlbnRpYWwuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3NsX3NvY2tfc2V0X2NlcnRpZmljYXRlKAorCQkJCQkgICAgcGpfc3NsX3NvY2tfdCAqc3NvY2ssCisJCQkJCSAgICBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICBjb25zdCBwal9zc2xfY2VydF90ICpjZXJ0KQoreworICAgIFBKX1VOVVNFRF9BUkcoc3NvY2spOworICAgIFBKX1VOVVNFRF9BUkcocG9vbCk7CisgICAgUEpfVU5VU0VEX0FSRyhjZXJ0KTsKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyoKKyAqIENsb3NlIHRoZSBTU0wgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9zb2NrX2Nsb3NlKHBqX3NzbF9zb2NrX3QgKnNzb2NrKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3NvY2ssIFBKX0VJTlZBTCk7CisgICAgCisgICAgZGVsZXRlIHNzb2NrLT5jb25uZWN0X3RpbWVyOworICAgIHNzb2NrLT5jb25uZWN0X3RpbWVyID0gTlVMTDsKKyAgICAKKyAgICBkZWxldGUgc3NvY2stPnNvY2s7CisgICAgc3NvY2stPnNvY2sgPSBOVUxMOworCisgICAgZGVsZXRlIHNzb2NrLT5yZWFkX3N0YXRlLnJlYWRfYnVmOworICAgIGRlbGV0ZSBzc29jay0+cmVhZF9zdGF0ZS5vcmlnX2J1ZjsKKyAgICBzc29jay0+cmVhZF9zdGF0ZS5yZWFkX2J1ZiA9IE5VTEw7CisgICAgc3NvY2stPnJlYWRfc3RhdGUub3JpZ19idWYgPSBOVUxMOworICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBBc3NvY2lhdGUgYXJiaXRyYXJ5IGRhdGEgd2l0aCB0aGUgU1NMIHNvY2tldC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zc2xfc29ja19zZXRfdXNlcl9kYXRhIChwal9zc2xfc29ja190ICpzc29jaywKKwkJCQkJICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNzb2NrLCBQSl9FSU5WQUwpOworICAgIAorICAgIHNzb2NrLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisJCQkJCSAgICAgICAKKworLyoKKyAqIFJldHJpZXZlIHRoZSB1c2VyIGRhdGEgcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBTU0wKKyAqIHNvY2tldC4KKyAqLworUEpfREVGKHZvaWQqKSBwal9zc2xfc29ja19nZXRfdXNlcl9kYXRhKHBqX3NzbF9zb2NrX3QgKnNzb2NrKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3NvY2ssIE5VTEwpOworICAgIAorICAgIHJldHVybiBzc29jay0+dXNlcl9kYXRhOworfQorCisKKy8qCisgKiBSZXRyaWV2ZSB0aGUgbG9jYWwgYWRkcmVzcyBhbmQgcG9ydCB1c2VkIGJ5IHNwZWNpZmllZCBTU0wgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9zb2NrX2dldF9pbmZvIChwal9zc2xfc29ja190ICpzc29jaywKKwkJCQkJICBwal9zc2xfc29ja19pbmZvICppbmZvKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3NvY2sgJiYgaW5mbywgUEpfRUlOVkFMKTsKKyAgICAKKyAgICBwal9iemVybyhpbmZvLCBzaXplb2YoKmluZm8pKTsKKyAgICAKKyAgICBpbmZvLT5lc3RhYmxpc2hlZCA9IHNzb2NrLT5lc3RhYmxpc2hlZDsKKyAgICAKKyAgICAvKiBMb2NhbCBhZGRyZXNzICovCisgICAgaWYgKHNzb2NrLT5zb2NrKSB7CisJY29uc3QgVEluZXRBZGRyKiBsb2NhbF9hZGRyXyA9IHNzb2NrLT5zb2NrLT5HZXRMb2NhbEFkZHIoKTsKKwlpbnQgYWRkcmxlbiA9IHNpemVvZihwal9zb2NrYWRkcik7CisJcGpfc3RhdHVzX3Qgc3RhdHVzOworCQorCXN0YXR1cyA9IFBqU3ltYmlhbk9TOjpBZGRyMnBqKCpsb2NhbF9hZGRyXywgaW5mby0+bG9jYWxfYWRkciwgJmFkZHJsZW4pOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgeworCXBqX3NvY2thZGRyX2NwKCZpbmZvLT5sb2NhbF9hZGRyLCAmc3NvY2stPmxvY2FsX2FkZHIpOworICAgIH0KKworICAgIGlmIChpbmZvLT5lc3RhYmxpc2hlZCkgeworCS8qIENpcGhlciBzdWl0ZSAqLworCVRCdWY4PDQ+IGNpcGhlcjsKKwlpZiAoc3NvY2stPnNvY2stPkdldENpcGhlcihjaXBoZXIpID09IEtFcnJOb25lKSB7CisJICAgIGluZm8tPmNpcGhlciA9IChwal9zc2xfY2lwaGVyKWNpcGhlclsxXTsgCisJfQorCisJLyogUmVtb3RlIGFkZHJlc3MgKi8KKyAgICAgICAgcGpfc29ja2FkZHJfY3AoKHBqX3NvY2thZGRyX3QqKSZpbmZvLT5yZW1vdGVfYWRkciwgCisgICAgCQkgICAgICAgKHBqX3NvY2thZGRyX3QqKSZzc29jay0+cmVtX2FkZHIpOworICAgICAgICAKKyAgICAgICAgLyogQ2VydGlmaWNhdGVzIGluZm8gKi8KKyAgICAgICAgaW5mby0+cmVtb3RlX2NlcnRfaW5mbyA9ICZzc29jay0+cmVtb3RlX2NlcnRfaW5mbzsKKyAgICB9CisKKyAgICAvKiBQcm90b2NvbCAqLworICAgIGluZm8tPnByb3RvID0gc3NvY2stPnByb3RvOworICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiBTdGFydHMgcmVhZCBvcGVyYXRpb24gb24gdGhpcyBTU0wgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9zb2NrX3N0YXJ0X3JlYWQgKHBqX3NzbF9zb2NrX3QgKnNzb2NrLAorCQkJCQkgICAgcGpfcG9vbF90ICpwb29sLAorCQkJCQkgICAgdW5zaWduZWQgYnVmZl9zaXplLAorCQkJCQkgICAgcGpfdWludDMyX3QgZmxhZ3MpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzc29jayAmJiBwb29sICYmIGJ1ZmZfc2l6ZSwgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNzb2NrLT5lc3RhYmxpc2hlZCwgUEpfRUlOVkFMSURPUCk7CisKKyAgICAvKiBSZWFkaW5nIGlzIGFscmVhZHkgc3RhcnRlZCAqLworICAgIGlmIChzc29jay0+cmVhZF9zdGF0ZS5vcmlnX2J1ZikgeworCXJldHVybiBQSl9TVUNDRVNTOworICAgIH0KKworICAgIHZvaWQgKnJlYWRidWZbMV07CisgICAgcmVhZGJ1ZlswXSA9IHBqX3Bvb2xfYWxsb2MocG9vbCwgYnVmZl9zaXplKTsKKyAgICByZXR1cm4gcGpfc3NsX3NvY2tfc3RhcnRfcmVhZDIoc3NvY2ssIHBvb2wsIGJ1ZmZfc2l6ZSwgcmVhZGJ1ZiwgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByZWFkX2NiKGludCBlcnIsIHZvaWQgKmtleSkKK3sKKyAgICBwal9zc2xfc29ja190ICpzc29jayA9IChwal9zc2xfc29ja190KilrZXk7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgc3RhdHVzID0gKGVyciA9PSBLRXJyTm9uZSk/IFBKX1NVQ0NFU1MgOiBQSl9SRVRVUk5fT1NfRVJST1IoZXJyKTsKKworICAgIC8qIENoZWNrIGNvbm5lY3Rpb24gc3RhdHVzICovCisgICAgaWYgKGVyciA9PSBLRXJyRW9mIHx8ICFQalN5bWJpYW5PUzo6SW5zdGFuY2UoKS0+SXNDb25uZWN0aW9uVXAoKSB8fAorCSFzc29jay0+ZXN0YWJsaXNoZWQpIAorICAgIHsKKwlzdGF0dXMgPSBQSl9FRU9GOworICAgIH0KKyAgICAKKyAgICAvKiBOb3RpZnkgZGF0YSBhcnJpdmFsICovCisgICAgaWYgKHNzb2NrLT5jYi5vbl9kYXRhX3JlYWQpIHsKKwlwal9zaXplX3QgcmVtYWluZGVyID0gMDsKKwljaGFyICpkYXRhID0gKGNoYXIqKXNzb2NrLT5yZWFkX3N0YXRlLm9yaWdfYnVmLT5QdHIoKTsKKwlwal9zaXplX3QgZGF0YV9sZW4gPSBzc29jay0+cmVhZF9zdGF0ZS5yZWFkX2J1Zi0+TGVuZ3RoKCkgKyAKKwkJCSAgICAgc3NvY2stPnJlYWRfc3RhdGUucmVhZF9idWYtPlB0cigpIC0KKwkJCSAgICAgc3NvY2stPnJlYWRfc3RhdGUub3JpZ19idWYtPlB0cigpOworCQorCWlmIChkYXRhX2xlbiA+IDApIHsKKwkgICAgLyogTm90aWZ5IHJlY2VpdmVkIGRhdGEgKi8KKwkgICAgcGpfYm9vbF90IHJldCA9ICgqc3NvY2stPmNiLm9uX2RhdGFfcmVhZCkoc3NvY2ssIGRhdGEsIGRhdGFfbGVuLCAKKwkJCQkJCSAgICAgIHN0YXR1cywgJnJlbWFpbmRlcik7CisJICAgIGlmICghcmV0KSB7CisJCS8qIFdlJ3ZlIGJlZW4gZGVzdHJveWVkICovCisJCXJldHVybjsKKwkgICAgfQorCSAgICAKKwkgICAgLyogQ2FsY3VsYXRlIGF2YWlsYWJsZSBkYXRhIGZvciBuZXh0IFJFQUQgb3BlcmF0aW9uICovCisJICAgIGlmIChyZW1haW5kZXIgPiAwKSB7CisJCXBqX3NpemVfdCBkYXRhX21heGxlbiA9IHNzb2NrLT5yZWFkX3N0YXRlLm9yaWdfYnVmLT5NYXhMZW5ndGgoKTsKKwkJCisJCS8qIFRoZXJlIGlzIHNvbWUgZGF0YSBsZWZ0IHVuY29uc3VtZWQgYnkgYXBwbGljYXRpb24sIHdlIGdpdmUKKwkJICogc21hbGxlciBidWZmZXIgZm9yIG5leHQgUkVBRCBvcGVyYXRpb24uCisJCSAqLworCQlzc29jay0+cmVhZF9zdGF0ZS5yZWFkX2J1Zi0+U2V0KChUVWludDgqKWRhdGErcmVtYWluZGVyLCAwLCAKKwkJCQkJICAgICAgICBkYXRhX21heGxlbiAtIHJlbWFpbmRlcik7CisJICAgIH0gZWxzZSB7CisJCS8qIEdpdmUgYWxsIGJ1ZmZlciBmb3IgbmV4dCBSRUFEIG9wZXJhdGlvbi4gCisJCSAqLworCQlzc29jay0+cmVhZF9zdGF0ZS5yZWFkX2J1Zi0+U2V0KCpzc29jay0+cmVhZF9zdGF0ZS5vcmlnX2J1Zik7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJLyogUGVyZm9ybSB0aGUgIm5leHQiIFJFQUQgb3BlcmF0aW9uICovCisJQ1BqU1NMU29ja2V0UmVhZGVyICpyZWFkZXIgPSBzc29jay0+c29jay0+R2V0UmVhZGVyKCk7IAorCXNzb2NrLT5yZWFkX3N0YXRlLnJlYWRfYnVmLT5TZXRMZW5ndGgoMCk7CisJc3RhdHVzID0gcmVhZGVyLT5SZWFkKCZyZWFkX2NiLCBzc29jaywgKnNzb2NrLT5yZWFkX3N0YXRlLnJlYWRfYnVmLCAKKwkJCSAgICAgIHNzb2NrLT5yZWFkX3N0YXRlLmZsYWdzKTsKKyAgICB9CisgICAgCisgICAgLyogQ29ubmVjdGlvbiBjbG9zZWQgb3Igc29tZXRoaW5nIGdvZXMgd3JvbmcgKi8KKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgJiYgc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisJLyogTm90aWZ5IGVycm9yICovCisJaWYgKHNzb2NrLT5jYi5vbl9kYXRhX3JlYWQpIHsKKwkgICAgcGpfYm9vbF90IHJldCA9ICgqc3NvY2stPmNiLm9uX2RhdGFfcmVhZCkoc3NvY2ssIE5VTEwsIDAsIAorCQkJCQkJICAgICAgc3RhdHVzLCBOVUxMKTsKKwkgICAgaWYgKCFyZXQpIHsKKwkJLyogV2UndmUgYmVlbiBkZXN0cm95ZWQgKi8KKwkJcmV0dXJuOworCSAgICB9CisJfQorCQorCWRlbGV0ZSBzc29jay0+cmVhZF9zdGF0ZS5yZWFkX2J1ZjsKKwlkZWxldGUgc3NvY2stPnJlYWRfc3RhdGUub3JpZ19idWY7CisJc3NvY2stPnJlYWRfc3RhdGUucmVhZF9idWYgPSBOVUxMOworCXNzb2NrLT5yZWFkX3N0YXRlLm9yaWdfYnVmID0gTlVMTDsKKwlzc29jay0+ZXN0YWJsaXNoZWQgPSBQSl9GQUxTRTsKKyAgICB9Cit9CisKKy8qCisgKiBTYW1lIGFzICNwal9zc2xfc29ja19zdGFydF9yZWFkKCksIGV4Y2VwdCB0aGF0IHRoZSBhcHBsaWNhdGlvbgorICogc3VwcGxpZXMgdGhlIGJ1ZmZlcnMgZm9yIHRoZSByZWFkIG9wZXJhdGlvbiBzbyB0aGF0IHRoZSBhY2l2ZSBzb2NrZXQKKyAqIGRvZXMgbm90IGhhdmUgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlcnMuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3NsX3NvY2tfc3RhcnRfcmVhZDIgKHBqX3NzbF9zb2NrX3QgKnNzb2NrLAorCQkJCQkgICAgIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICB1bnNpZ25lZCBidWZmX3NpemUsCisJCQkJCSAgICAgdm9pZCAqcmVhZGJ1ZltdLAorCQkJCQkgICAgIHBqX3VpbnQzMl90IGZsYWdzKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oc3NvY2sgJiYgYnVmZl9zaXplICYmIHJlYWRidWYsIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzc29jay0+ZXN0YWJsaXNoZWQsIFBKX0VJTlZBTElET1ApOworICAgIAorICAgIC8qIFJldHVybiBmYWlsdXJlIGlmIGFjY2VzcyBwb2ludCBpcyBtYXJrZWQgYXMgZG93biBieSBhcHAuICovCisgICAgUEpfU1lNQklBTl9DSEVDS19DT05ORUNUSU9OKCk7CisgICAgCisgICAgLyogUmVhZGluZyBpcyBhbHJlYWR5IHN0YXJ0ZWQgKi8KKyAgICBpZiAoc3NvY2stPnJlYWRfc3RhdGUub3JpZ19idWYpIHsKKwlyZXR1cm4gUEpfU1VDQ0VTUzsKKyAgICB9CisgICAgCisgICAgUEpfVU5VU0VEX0FSRyhwb29sKTsKKworICAgIC8qIEdldCByZWFkZXIgaW5zdGFuY2UgKi8KKyAgICBDUGpTU0xTb2NrZXRSZWFkZXIgKnJlYWRlciA9IHNzb2NrLT5zb2NrLT5HZXRSZWFkZXIoKTsKKyAgICBpZiAoIXJlYWRlcikKKwlyZXR1cm4gUEpfRU5PTUVNOworICAgIAorICAgIC8qIFdlIG1hbmFnZSB0d28gYnVmZmVyIHBvaW50ZXJzIGhlcmU6CisgICAgICogMS4gb3JpZ19idWYga2VlcHMgdGhlIG9yZ2luYWwgYnVmZmVyIGFkZHJlc3MgKGFuZCBpdHMgbWF4IGxlbmd0aCkuCisgICAgICogMi4gcmVhZF9idWYgcHJvdmlkZXMgYnVmZmVyIGZvciBSRUFEIG9wZXJhdGlvbiwgbWluZCB0aGF0IHRoZXJlIG1heSBiZQorICAgICAqICAgIHNvbWUgcmVtYWluZGVyIGRhdGEgbGVmdCBieSBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBzc29jay0+cmVhZF9zdGF0ZS5yZWFkX2J1ZiA9IG5ldyBUUHRyOCgoVFVpbnQ4KilyZWFkYnVmWzBdLCAwLCBidWZmX3NpemUpOworICAgIHNzb2NrLT5yZWFkX3N0YXRlLm9yaWdfYnVmID0gbmV3IFRQdHI4KChUVWludDgqKXJlYWRidWZbMF0sIDAsIGJ1ZmZfc2l6ZSk7CisgICAgc3NvY2stPnJlYWRfc3RhdGUuZmxhZ3MgPSBmbGFnczsKKyAgICAKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgc3RhdHVzID0gcmVhZGVyLT5SZWFkKCZyZWFkX2NiLCBzc29jaywgKnNzb2NrLT5yZWFkX3N0YXRlLnJlYWRfYnVmLCAKKwkJCSAgc3NvY2stPnJlYWRfc3RhdGUuZmxhZ3MpOworICAgIAorICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gUEpfRVBFTkRJTkcpIHsKKwlkZWxldGUgc3NvY2stPnJlYWRfc3RhdGUucmVhZF9idWY7CisJZGVsZXRlIHNzb2NrLT5yZWFkX3N0YXRlLm9yaWdfYnVmOworCXNzb2NrLT5yZWFkX3N0YXRlLnJlYWRfYnVmID0gTlVMTDsKKwlzc29jay0+cmVhZF9zdGF0ZS5vcmlnX2J1ZiA9IE5VTEw7CisJCisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBTYW1lIGFzIHBqX3NzbF9zb2NrX3N0YXJ0X3JlYWQoKSwgZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkCisgKiBvbmx5IGZvciBkYXRhZ3JhbSBzb2NrZXRzLCBhbmQgaXQgd2lsbCB0cmlnZ2VyIFxhIG9uX2RhdGFfcmVjdmZyb20oKQorICogY2FsbGJhY2sgaW5zdGVhZC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zc2xfc29ja19zdGFydF9yZWN2ZnJvbSAocGpfc3NsX3NvY2tfdCAqc3NvY2ssCisJCQkJCQlwal9wb29sX3QgKnBvb2wsCisJCQkJCQl1bnNpZ25lZCBidWZmX3NpemUsCisJCQkJCQlwal91aW50MzJfdCBmbGFncykKK3sKKyAgICBQSl9VTlVTRURfQVJHKHNzb2NrKTsKKyAgICBQSl9VTlVTRURfQVJHKHBvb2wpOworICAgIFBKX1VOVVNFRF9BUkcoYnVmZl9zaXplKTsKKyAgICBQSl9VTlVTRURfQVJHKGZsYWdzKTsKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworLyoKKyAqIFNhbWUgYXMgI3BqX3NzbF9zb2NrX3N0YXJ0X3JlY3Zmcm9tKCkgZXhjZXB0IHRoYXQgdGhlIHJlY3Zmcm9tKCkgCisgKiBvcGVyYXRpb24gdGFrZXMgdGhlIGJ1ZmZlciBmcm9tIHRoZSBhcmd1bWVudCByYXRoZXIgdGhhbiBjcmVhdGluZworICogbmV3IG9uZXMuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3NsX3NvY2tfc3RhcnRfcmVjdmZyb20yIChwal9zc2xfc29ja190ICpzc29jaywKKwkJCQkJCSBwal9wb29sX3QgKnBvb2wsCisJCQkJCQkgdW5zaWduZWQgYnVmZl9zaXplLAorCQkJCQkJIHZvaWQgKnJlYWRidWZbXSwKKwkJCQkJCSBwal91aW50MzJfdCBmbGFncykKK3sKKyAgICBQSl9VTlVTRURfQVJHKHNzb2NrKTsKKyAgICBQSl9VTlVTRURfQVJHKHBvb2wpOworICAgIFBKX1VOVVNFRF9BUkcoYnVmZl9zaXplKTsKKyAgICBQSl9VTlVTRURfQVJHKHJlYWRidWYpOworICAgIFBKX1VOVVNFRF9BUkcoZmxhZ3MpOworICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2NiKGludCBlcnIsIHZvaWQgKmtleSkKK3sKKyAgICBwal9zc2xfc29ja190ICpzc29jayA9IChwal9zc2xfc29ja190KilrZXk7CisgICAgd3JpdGVfc3RhdGVfdCAqc3QgPSAmc3NvY2stPndyaXRlX3N0YXRlOworCisgICAgLyogQ2hlY2sgY29ubmVjdGlvbiBzdGF0dXMgKi8KKyAgICBpZiAoZXJyICE9IEtFcnJOb25lIHx8ICFQalN5bWJpYW5PUzo6SW5zdGFuY2UoKS0+SXNDb25uZWN0aW9uVXAoKSB8fAorCSFzc29jay0+ZXN0YWJsaXNoZWQpIAorICAgIHsKKwlzc29jay0+ZXN0YWJsaXNoZWQgPSBQSl9GQUxTRTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogUmVtb3ZlIHNlbnQgZGF0YSBmcm9tIGJ1ZmZlciAqLworICAgIHN0LT5zdGFydCArPSBzdC0+Y3VycmVudF9kYXRhLT5sZW47CisgICAgc3QtPmxlbiAtPSBzdC0+Y3VycmVudF9kYXRhLT5sZW47CisKKyAgICAvKiBSZXNldCBjdXJyZW50IG91dHN0YW5kaW5nIHNlbmQgKi8KKyAgICBzdC0+Y3VycmVudF9kYXRhID0gTlVMTDsKKworICAgIC8qIExldCdzIGNoZWNrIGlmIHRoZXJlIGlzIHBlbmRpbmcgZGF0YSB0byBzZW5kICovCisgICAgaWYgKHN0LT5sZW4pIHsKKwl3cml0ZV9kYXRhX3QgKndkYXRhID0gKHdyaXRlX2RhdGFfdCopc3QtPnN0YXJ0OworCXBqX3N0YXR1c190IHN0YXR1czsKKwkKKwlzdC0+c2VuZF9wdHIuU2V0KChUVWludDgqKXdkYXRhLT5kYXRhLCAoVEludCl3ZGF0YS0+ZGF0YV9sZW4pOworCXN0LT5jdXJyZW50X2RhdGEgPSB3ZGF0YTsKKwlzdGF0dXMgPSBzc29jay0+c29jay0+U2VuZCgmc2VuZF9jYiwgc3NvY2ssIHN0LT5zZW5kX3B0ciwgMCk7CisJaWYgKHN0YXR1cyAhPSBQSl9FUEVORElORykgeworCSAgICBzc29jay0+ZXN0YWJsaXNoZWQgPSBQSl9GQUxTRTsKKwkgICAgc3QtPmxlbiA9IDA7CisJICAgIHJldHVybjsKKwl9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQnVmZmVyIGVtcHR5LCByZXNldCB0aGUgc3RhcnQgcG9zaXRpb24gKi8KKyAgICAgICAgc3QtPnN0YXJ0ID0gc3QtPmJ1ZjsKKyAgICB9Cit9CisKKy8qCisgKiBTZW5kIGRhdGEgdXNpbmcgdGhlIHNvY2tldC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal9zc2xfc29ja19zZW5kIChwal9zc2xfc29ja190ICpzc29jaywKKwkJCQkgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpzZW5kX2tleSwKKwkJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgICAgIHBqX3NzaXplX3QgKnNpemUsCisJCQkJICAgICAgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNzb2NrICYmIGRhdGEgJiYgc2l6ZSwgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHNzb2NrLT53cml0ZV9zdGF0ZS5tYXhfbGVuID09IDAgfHwgCisJCSAgICAgc3NvY2stPndyaXRlX3N0YXRlLm1heF9sZW4gPj0gKHBqX3NpemVfdCkqc2l6ZSwgCisJCSAgICAgUEpfRVRPT1NNQUxMKTsKKyAgICAKKyAgICAvKiBDaGVjayBjb25uZWN0aW9uIHN0YXR1cyAqLworICAgIGlmICghUGpTeW1iaWFuT1M6Okluc3RhbmNlKCktPklzQ29ubmVjdGlvblVwKCkgfHwgIXNzb2NrLT5lc3RhYmxpc2hlZCkgCisgICAgeworCXNzb2NrLT5lc3RhYmxpc2hlZCA9IFBKX0ZBTFNFOworCXJldHVybiBQSl9FQ0FOQ0VMTEVEOworICAgIH0KKworICAgIHdyaXRlX3N0YXRlX3QgKnN0ID0gJnNzb2NrLT53cml0ZV9zdGF0ZTsKKyAgICAKKyAgICAvKiBTeW5jaHJvbm91cyBtb2RlICovCisgICAgaWYgKHN0LT5tYXhfbGVuID09IDApIHsKKwlzdC0+c2VuZF9wdHIuU2V0KChUVWludDgqKWRhdGEsIChUSW50KSpzaXplKTsKKwlyZXR1cm4gc3NvY2stPnNvY2stPlNlbmRTeW5jKHN0LT5zZW5kX3B0ciwgZmxhZ3MpOworICAgIH0KKworICAgIC8qIENTZWN1cmVTb2NrZXQgb25seSBhbGxvd3Mgb25lIG91dHN0YW5kaW5nIHNlbmQgb3BlcmF0aW9uLCBzbworICAgICAqIHdlIHVzZSBidWZmZXJpbmcgbWVjaGFuaXNtIHRvIGFsbG93IGFwcGxpY2F0aW9uIHRvIHBlcmZvcm0gc2VuZCAKKyAgICAgKiBvcGVyYXRpb25zIGF0IGFueSB0aW1lLgorICAgICAqLworICAgIAorICAgIHBqX3NpemVfdCBuZWVkZWRfbGVuID0gKnNpemUgKyBzaXplb2Yod3JpdGVfZGF0YV90KSAtIDE7CisgICAgCisgICAgLyogQWxpZ24gbmVlZGVkX2xlbiB0byBiZSBtdWx0aXBsaWNhdGlvbiBvZiA0ICovCisgICAgbmVlZGVkX2xlbiA9ICgobmVlZGVkX2xlbiArIDMpID4+IDIpIDw8IDI7IAorCisgICAgLyogQmxvY2sgdW50aWwgdGhlcmUgaXMgYnVmZmVyIHNsb3QgYXZhaWxhYmxlIGFuZCBjb250aWd1b3VzISAqLworICAgIHdoaWxlIChzdC0+c3RhcnQgKyBzdC0+bGVuICsgbmVlZGVkX2xlbiA+IHN0LT5idWYgKyBzdC0+bWF4X2xlbikgeworCXBqX3N5bWJpYW5vc19wb2xsKC0xLCAtMSk7CisgICAgfQorCisgICAgLyogUHVzaCBiYWNrIHRoZSBzZW5kIGRhdGEgaW50byB0aGUgYnVmZmVyICovCisgICAgd3JpdGVfZGF0YV90ICp3ZGF0YSA9ICh3cml0ZV9kYXRhX3QqKShzdC0+c3RhcnQgKyBzdC0+bGVuKTsKKyAgICAKKyAgICB3ZGF0YS0+bGVuID0gbmVlZGVkX2xlbjsKKyAgICB3ZGF0YS0+a2V5ID0gc2VuZF9rZXk7CisgICAgd2RhdGEtPmRhdGFfbGVuID0gKHBqX3NpemVfdCkqc2l6ZTsKKyAgICBwal9tZW1jcHkod2RhdGEtPmRhdGEsIGRhdGEsICpzaXplKTsKKyAgICBzdC0+bGVuICs9IG5lZWRlZF9sZW47CisKKyAgICAvKiBJZiBubyBvdXRzdGFuZGluZyBzZW5kLCBzZW5kIGl0ICovCisgICAgaWYgKHN0LT5jdXJyZW50X2RhdGEgPT0gTlVMTCkgeworCXBqX3N0YXR1c190IHN0YXR1czsKKwkgICAgCisJd2RhdGEgPSAod3JpdGVfZGF0YV90KilzdC0+c3RhcnQ7CisJc3QtPmN1cnJlbnRfZGF0YSA9IHdkYXRhOworCXN0LT5zZW5kX3B0ci5TZXQoKFRVaW50OCopd2RhdGEtPmRhdGEsIChUSW50KXdkYXRhLT5kYXRhX2xlbik7CisJc3RhdHVzID0gc3NvY2stPnNvY2stPlNlbmQoJnNlbmRfY2IsIHNzb2NrLCBzdC0+c2VuZF9wdHIsIGZsYWdzKTsKKwkKKwlpZiAoc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisJICAgICpzaXplID0gLXN0YXR1czsKKwkgICAgcmV0dXJuIHN0YXR1czsKKwl9CisgICAgfQorICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisvKgorICogU2VuZCBkYXRhZ3JhbSB1c2luZyB0aGUgc29ja2V0LgorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9zb2NrX3NlbmR0byAocGpfc3NsX3NvY2tfdCAqc3NvY2ssCisJCQkJCXBqX2lvcXVldWVfb3Bfa2V5X3QgKnNlbmRfa2V5LAorCQkJCQljb25zdCB2b2lkICpkYXRhLAorCQkJCQlwal9zc2l6ZV90ICpzaXplLAorCQkJCQl1bnNpZ25lZCBmbGFncywKKwkJCQkJY29uc3QgcGpfc29ja2FkZHJfdCAqYWRkciwKKwkJCQkJaW50IGFkZHJfbGVuKQoreworICAgIFBKX1VOVVNFRF9BUkcoc3NvY2spOworICAgIFBKX1VOVVNFRF9BUkcoc2VuZF9rZXkpOworICAgIFBKX1VOVVNFRF9BUkcoZGF0YSk7CisgICAgUEpfVU5VU0VEX0FSRyhzaXplKTsKKyAgICBQSl9VTlVTRURfQVJHKGZsYWdzKTsKKyAgICBQSl9VTlVTRURfQVJHKGFkZHIpOworICAgIFBKX1VOVVNFRF9BUkcoYWRkcl9sZW4pOworICAgIHJldHVybiBQSl9FTk9UU1VQOworfQorCisvKgorICogU3RhcnRzIGFzeW5jaHJvbm91cyBzb2NrZXQgYWNjZXB0KCkgb3BlcmF0aW9ucyBvbiB0aGlzIFNTTCBzb2NrZXQuIAorICovCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3NzbF9zb2NrX3N0YXJ0X2FjY2VwdCAocGpfc3NsX3NvY2tfdCAqc3NvY2ssCisJCQkJCSAgICAgIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICAgICAgY29uc3QgcGpfc29ja2FkZHJfdCAqbG9jYWxfYWRkciwKKwkJCQkJICAgICAgaW50IGFkZHJfbGVuKQoreworICAgIFBKX1VOVVNFRF9BUkcoc3NvY2spOworICAgIFBKX1VOVVNFRF9BUkcocG9vbCk7CisgICAgUEpfVU5VU0VEX0FSRyhsb2NhbF9hZGRyKTsKKyAgICBQSl9VTlVTRURfQVJHKGFkZHJfbGVuKTsKKyAgICAKKyAgICByZXR1cm4gUEpfRU5PVFNVUDsKK30KKworc3RhdGljIHZvaWQgY29ubmVjdF9jYihpbnQgZXJyLCB2b2lkICprZXkpCit7CisgICAgcGpfc3NsX3NvY2tfdCAqc3NvY2sgPSAocGpfc3NsX3NvY2tfdCopa2V5OworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICAKKyAgICBpZiAoc3NvY2stPmNvbm5lY3RfdGltZXIpIHsKKwlkZWxldGUgc3NvY2stPmNvbm5lY3RfdGltZXI7CisJc3NvY2stPmNvbm5lY3RfdGltZXIgPSBOVUxMOworICAgIH0KKworICAgIHN0YXR1cyA9IChlcnIgPT0gS0Vyck5vbmUpPyBQSl9TVUNDRVNTIDogUEpfUkVUVVJOX09TX0VSUk9SKGVycik7CisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJc3NvY2stPmVzdGFibGlzaGVkID0gUEpfVFJVRTsKKwl1cGRhdGVfY2VydHNfaW5mbyhzc29jayk7CisgICAgfSBlbHNlIHsKKwlkZWxldGUgc3NvY2stPnNvY2s7CisJc3NvY2stPnNvY2sgPSBOVUxMOworCWlmIChlcnIgPT0gS0VyclRpbWVkT3V0KSBzdGF0dXMgPSBQSl9FVElNRURPVVQ7CisgICAgfQorICAgIAorICAgIGlmIChzc29jay0+Y2Iub25fY29ubmVjdF9jb21wbGV0ZSkgeworCXBqX2Jvb2xfdCByZXQgPSAoKnNzb2NrLT5jYi5vbl9jb25uZWN0X2NvbXBsZXRlKShzc29jaywgc3RhdHVzKTsKKwlpZiAoIXJldCkgeworCSAgICAvKiBXZSd2ZSBiZWVuIGRlc3Ryb3llZCAqLworCSAgICByZXR1cm47CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgY29ubmVjdF90aW1lcl9jYih2b2lkICprZXkpCit7CisgICAgY29ubmVjdF9jYihLRXJyVGltZWRPdXQsIGtleSk7Cit9CisKKy8qCisgKiBTdGFydHMgYXN5bmNocm9ub3VzIHNvY2tldCBjb25uZWN0KCkgb3BlcmF0aW9uIGFuZCBTU0wvVExTIGhhbmRzaGFraW5nIAorICogZm9yIHRoaXMgc29ja2V0LiBPbmNlIHRoZSBjb25uZWN0aW9uIGlzIGRvbmUgKGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igbm90KSwKKyAqIHRoZSBcYSBvbl9jb25uZWN0X2NvbXBsZXRlKCkgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3NsX3NvY2tfc3RhcnRfY29ubmVjdCAocGpfc3NsX3NvY2tfdCAqc3NvY2ssCisJCQkJCSAgICAgICBwal9wb29sX3QgKnBvb2wsCisJCQkJCSAgICAgICBjb25zdCBwal9zb2NrYWRkcl90ICpsb2NhbGFkZHIsCisJCQkJCSAgICAgICBjb25zdCBwal9zb2NrYWRkcl90ICpyZW1hZGRyLAorCQkJCQkgICAgICAgaW50IGFkZHJfbGVuKQoreworICAgIENQalNTTFNvY2tldCAqc29jayA9IE5VTEw7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIFBKX0FTU0VSVF9SRVRVUk4oc3NvY2sgJiYgcG9vbCAmJiBsb2NhbGFkZHIgJiYgcmVtYWRkciAmJiBhZGRyX2xlbiwKKwkJICAgICBQSl9FSU5WQUwpOworCisgICAgLyogQ2hlY2sgY29ubmVjdGlvbiBzdGF0dXMgKi8KKyAgICBQSl9TWU1CSUFOX0NIRUNLX0NPTk5FQ1RJT04oKTsKKyAgICAKKyAgICBpZiAoc3NvY2stPnNvY2sgIT0gTlVMTCkgeworCUNQalNTTFNvY2tldDo6c3NsX3N0YXRlIHN0YXRlID0gc3NvY2stPnNvY2stPkdldFN0YXRlKCk7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgQ1BqU1NMU29ja2V0OjpTU0xfU1RBVEVfRVNUQUJMSVNIRUQ6CisJICAgIHJldHVybiBQSl9TVUNDRVNTOworCWRlZmF1bHQ6CisJICAgIHJldHVybiBQSl9FUEVORElORzsKKwl9CisgICAgfQorCisgICAgLyogU2V0IFNTTCBwcm90b2NvbCAqLworICAgIFRQdHJDOCBwcm90bzsKKyAgICAKKyAgICBpZiAoc3NvY2stPnByb3RvID09IFBKX1NTTF9TT0NLX1BST1RPX0RFRkFVTFQpCisJc3NvY2stPnByb3RvID0gUEpfU1NMX1NPQ0tfUFJPVE9fVExTMTsKKworICAgIC8qIENTZWN1cmVTb2NrZXQgb25seSBzdXBwb3J0IFRMUzEuMCBhbmQgU1NMMy4wICovCisgICAgc3dpdGNoKHNzb2NrLT5wcm90bykgeworICAgIGNhc2UgUEpfU1NMX1NPQ0tfUFJPVE9fVExTMToKKwlwcm90by5TZXQoKGNvbnN0IFRVaW50OCopIlRMUzEuMCIsIDYpOworCWJyZWFrOworICAgIGNhc2UgUEpfU1NMX1NPQ0tfUFJPVE9fU1NMMzoKKwlwcm90by5TZXQoKGNvbnN0IFRVaW50OCopIlNTTDMuMCIsIDYpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIFBKX0VOT1RTVVA7CisgICAgfQorCisgICAgLyogUHJlcGFyZSBhZGRyZXNzZXMgKi8KKyAgICBUSW5ldEFkZHIgbG9jYWxhZGRyXywgcmVtYWRkcl87CisgICAgc3RhdHVzID0gUGpTeW1iaWFuT1M6OnBqMkFkZHIoKihwal9zb2NrYWRkciopbG9jYWxhZGRyLCBhZGRyX2xlbiwgCisJCQkJICBsb2NhbGFkZHJfKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKyAgICAKKyAgICBzdGF0dXMgPSBQalN5bWJpYW5PUzo6cGoyQWRkcigqKHBqX3NvY2thZGRyKilyZW1hZGRyLCBhZGRyX2xlbiwKKwkJCQkgIHJlbWFkZHJfKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgIHBqX3NvY2thZGRyX2NwKChwal9zb2NrYWRkcl90Kikmc3NvY2stPnJlbV9hZGRyLCByZW1hZGRyKTsKKworICAgIC8qIEluaXQgU1NMIGVuZ2luZSAqLworICAgIFRSQVBEKGVyciwgc29jayA9IENQalNTTFNvY2tldDo6TmV3TChwcm90bywgc3NvY2stPnFvc190eXBlLCAKKwkJCQkgICAgICAgICBzc29jay0+cW9zX3BhcmFtcykpOworICAgIGlmIChlcnIgIT0gS0Vyck5vbmUpCisJcmV0dXJuIFBKX0VOT01FTTsKKyAgICAKKyAgICBpZiAoc3NvY2stPnRpbWVvdXQuc2VjICE9IDAgfHwgc3NvY2stPnRpbWVvdXQubXNlYyAhPSAwKSB7CisJc3NvY2stPmNvbm5lY3RfdGltZXIgPSBuZXcgQ1BqVGltZXIoJnNzb2NrLT50aW1lb3V0LCAKKwkJCQkJICAgICZjb25uZWN0X3RpbWVyX2NiLCBzc29jayk7CisgICAgfQorICAgIAorICAgIC8qIENvbnZlcnQgc2VydmVyIG5hbWUgdG8gU3ltYmlhbiBkZXNjcmlwdG9yICovCisgICAgVFB0ckM4IHNlcnZlcm5hbWVfKChUVWludDgqKXNzb2NrLT5zZXJ2ZXJuYW1lLnB0ciwgCisJCSAgICAgICBzc29jay0+c2VydmVybmFtZS5zbGVuKTsKKyAgICAKKyAgICAvKiBDb252ZXJ0IGNpcGhlciBsaXN0IHRvIFN5bWJpYW4gZGVzY3JpcHRvciAqLworICAgIFRQdHJDOCBjaXBoZXJzXygoVFVpbnQ4Kilzc29jay0+Y2lwaGVycy5wdHIsIAorCQkgICAgc3NvY2stPmNpcGhlcnMuc2xlbik7CisgICAgCisgICAgLyogVHJ5IHRvIGNvbm5lY3QgKi8KKyAgICBzdGF0dXMgPSBzb2NrLT5Db25uZWN0KCZjb25uZWN0X2NiLCBzc29jaywgbG9jYWxhZGRyXywgcmVtYWRkcl8sCisJCQkgICBzZXJ2ZXJuYW1lXywgY2lwaGVyc18pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gUEpfRVBFTkRJTkcpIHsKKwlkZWxldGUgc29jazsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHNzb2NrLT5zb2NrID0gc29jazsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfc3NsX3NvY2tfcmVuZWdvdGlhdGUocGpfc3NsX3NvY2tfdCAqc3NvY2spCit7CisgICAgUEpfVU5VU0VEX0FSRyhzc29jayk7CisgICAgcmV0dXJuIFBKX0VOT1RTVVA7Cit9CmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3N0cmluZy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmMzZmRlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zdHJpbmcuYwpAQCAtMCwwICsxLDIxNSBAQAorLyogJElkOiBzdHJpbmcuYyA0NTM3IDIwMTMtMDYtMTkgMDY6NDc6NDNaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovY3R5cGUuaD4KKyNpbmNsdWRlIDxwai9yYW5kLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKworI2lmIFBKX0ZVTkNUSU9OU19BUkVfSU5MSU5FRD09MAorIyAgaW5jbHVkZSA8cGovc3RyaW5nX2kuaD4KKyNlbmRpZgorCisKK1BKX0RFRihjaGFyKikgcGpfc3Ryc3RyKGNvbnN0IHBqX3N0cl90ICpzdHIsIGNvbnN0IHBqX3N0cl90ICpzdWJzdHIpCit7CisgICAgY29uc3QgY2hhciAqcywgKmVuZHM7CisKKyAgICAvKiBTcGVjaWFsIGNhc2Ugd2hlbiBzdWJzdHIgaXMgemVybyAqLworICAgIGlmIChzdWJzdHItPnNsZW4gPT0gMCkgeworCXJldHVybiAoY2hhciopc3RyLT5wdHI7CisgICAgfQorCisgICAgcyA9IHN0ci0+cHRyOworICAgIGVuZHMgPSBzdHItPnB0ciArIHN0ci0+c2xlbiAtIHN1YnN0ci0+c2xlbjsKKyAgICBmb3IgKDsgczw9ZW5kczsgKytzKSB7CisJaWYgKHBqX2Fuc2lfc3RybmNtcChzLCBzdWJzdHItPnB0ciwgc3Vic3RyLT5zbGVuKT09MCkKKwkgICAgcmV0dXJuIChjaGFyKilzOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCitQSl9ERUYoY2hhciopIHBqX3N0cmlzdHIoY29uc3QgcGpfc3RyX3QgKnN0ciwgY29uc3QgcGpfc3RyX3QgKnN1YnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpzLCAqZW5kczsKKworICAgIC8qIFNwZWNpYWwgY2FzZSB3aGVuIHN1YnN0ciBpcyB6ZXJvICovCisgICAgaWYgKHN1YnN0ci0+c2xlbiA9PSAwKSB7CisJcmV0dXJuIChjaGFyKilzdHItPnB0cjsKKyAgICB9CisKKyAgICBzID0gc3RyLT5wdHI7CisgICAgZW5kcyA9IHN0ci0+cHRyICsgc3RyLT5zbGVuIC0gc3Vic3RyLT5zbGVuOworICAgIGZvciAoOyBzPD1lbmRzOyArK3MpIHsKKwlpZiAocGpfYW5zaV9zdHJuaWNtcChzLCBzdWJzdHItPnB0ciwgc3Vic3RyLT5zbGVuKT09MCkKKwkgICAgcmV0dXJuIChjaGFyKilzOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCitQSl9ERUYocGpfc3RyX3QqKSBwal9zdHJsdHJpbSggcGpfc3RyX3QgKnN0ciApCit7CisgICAgY2hhciAqZW5kID0gc3RyLT5wdHIgKyBzdHItPnNsZW47CisgICAgcmVnaXN0ZXIgY2hhciAqcCA9IHN0ci0+cHRyOworICAgIHdoaWxlIChwIDwgZW5kICYmIHBqX2lzc3BhY2UoKnApKQorCSsrcDsKKyAgICBzdHItPnNsZW4gLT0gKHAgLSBzdHItPnB0cik7CisgICAgc3RyLT5wdHIgPSBwOworICAgIHJldHVybiBzdHI7Cit9CisKK1BKX0RFRihwal9zdHJfdCopIHBqX3N0cnJ0cmltKCBwal9zdHJfdCAqc3RyICkKK3sKKyAgICBjaGFyICplbmQgPSBzdHItPnB0ciArIHN0ci0+c2xlbjsKKyAgICByZWdpc3RlciBjaGFyICpwID0gZW5kIC0gMTsKKyAgICB3aGlsZSAocCA+PSBzdHItPnB0ciAmJiBwal9pc3NwYWNlKCpwKSkKKyAgICAgICAgLS1wOworICAgIHN0ci0+c2xlbiAtPSAoKGVuZCAtIHApIC0gMSk7CisgICAgcmV0dXJuIHN0cjsKK30KKworUEpfREVGKGNoYXIqKSBwal9jcmVhdGVfcmFuZG9tX3N0cmluZyhjaGFyICpzdHIsIHBqX3NpemVfdCBsZW4pCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBjaGFyICpwID0gc3RyOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIGZvciAoaT0wOyBpPGxlbi84OyArK2kpIHsKKwlwal91aW50MzJfdCB2YWwgPSBwal9yYW5kKCk7CisJcGpfdmFsX3RvX2hleF9kaWdpdCggKHZhbCAmIDB4RkYwMDAwMDApID4+IDI0LCBwKzAgKTsKKwlwal92YWxfdG9faGV4X2RpZ2l0KCAodmFsICYgMHgwMEZGMDAwMCkgPj4gMTYsIHArMiApOworCXBqX3ZhbF90b19oZXhfZGlnaXQoICh2YWwgJiAweDAwMDBGRjAwKSA+PiAgOCwgcCs0ICk7CisJcGpfdmFsX3RvX2hleF9kaWdpdCggKHZhbCAmIDB4MDAwMDAwRkYpID4+ICAwLCBwKzYgKTsKKwlwICs9IDg7CisgICAgfQorICAgIGZvciAoaT1pICogODsgaTxsZW47ICsraSkgeworCSpwKysgPSBwal9oZXhfZGlnaXRzWyBwal9yYW5kKCkgJiAweDBGIF07CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKK1BKX0RFRihsb25nKSBwal9zdHJ0b2woY29uc3QgcGpfc3RyX3QgKnN0cikKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgaWYgKHN0ci0+c2xlbiA+IDAgJiYgKHN0ci0+cHRyWzBdID09ICcrJyB8fCBzdHItPnB0clswXSA9PSAnLScpKSB7CisgICAgICAgIHBqX3N0cl90IHM7CisgICAgICAgIAorICAgICAgICBzLnB0ciA9IHN0ci0+cHRyICsgMTsKKyAgICAgICAgcy5zbGVuID0gc3RyLT5zbGVuIC0gMTsKKyAgICAgICAgcmV0dXJuIChzdHItPnB0clswXSA9PSAnLSc/IC0obG9uZylwal9zdHJ0b3VsKCZzKSA6IHBqX3N0cnRvdWwoJnMpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIHBqX3N0cnRvdWwoc3RyKTsKK30KKworUEpfREVGKHVuc2lnbmVkIGxvbmcpIHBqX3N0cnRvdWwoY29uc3QgcGpfc3RyX3QgKnN0cikKK3sKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgdmFsdWUgPSAwOworICAgIGZvciAoaT0wOyBpPCh1bnNpZ25lZClzdHItPnNsZW47ICsraSkgeworCWlmICghcGpfaXNkaWdpdChzdHItPnB0cltpXSkpCisJICAgIGJyZWFrOworCXZhbHVlID0gdmFsdWUgKiAxMCArIChzdHItPnB0cltpXSAtICcwJyk7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKK30KKworUEpfREVGKHVuc2lnbmVkIGxvbmcpIHBqX3N0cnRvdWwyKGNvbnN0IHBqX3N0cl90ICpzdHIsIHBqX3N0cl90ICplbmRwdHIsCisJCQkJICB1bnNpZ25lZCBiYXNlKQoreworICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgICAgdW5zaWduZWQgaTsKKworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICB2YWx1ZSA9IDA7CisgICAgaWYgKGJhc2UgPD0gMTApIHsKKwlmb3IgKGk9MDsgaTwodW5zaWduZWQpc3RyLT5zbGVuOyArK2kpIHsKKwkgICAgdW5zaWduZWQgYyA9IChzdHItPnB0cltpXSAtICcwJyk7CisJICAgIGlmIChjID49IGJhc2UpCisJCWJyZWFrOworCSAgICB2YWx1ZSA9IHZhbHVlICogYmFzZSArIGM7CisJfQorICAgIH0gZWxzZSBpZiAoYmFzZSA9PSAxNikgeworCWZvciAoaT0wOyBpPCh1bnNpZ25lZClzdHItPnNsZW47ICsraSkgeworCSAgICBpZiAoIXBqX2lzeGRpZ2l0KHN0ci0+cHRyW2ldKSkKKwkJYnJlYWs7CisJICAgIHZhbHVlID0gdmFsdWUgKiAxNiArIHBqX2hleF9kaWdpdF90b192YWwoc3RyLT5wdHJbaV0pOworCX0KKyAgICB9IGVsc2UgeworCXBqX2Fzc2VydCghIlVuc3VwcG9ydGVkIGJhc2UiKTsKKwlpID0gMDsKKwl2YWx1ZSA9IDB4RkZGRkZGRkZVTDsKKyAgICB9CisKKyAgICBpZiAoZW5kcHRyKSB7CisJZW5kcHRyLT5wdHIgPSBzdHItPnB0ciArIGk7CisJZW5kcHRyLT5zbGVuID0gc3RyLT5zbGVuIC0gaTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK1BKX0RFRihpbnQpIHBqX3V0b2EodW5zaWduZWQgbG9uZyB2YWwsIGNoYXIgKmJ1ZikKK3sKKyAgICByZXR1cm4gcGpfdXRvYV9wYWQodmFsLCBidWYsIDAsIDApOworfQorCitQSl9ERUYoaW50KSBwal91dG9hX3BhZCggdW5zaWduZWQgbG9uZyB2YWwsIGNoYXIgKmJ1ZiwgaW50IG1pbl9kaWcsIGludCBwYWQpCit7CisgICAgY2hhciAqcDsKKyAgICBpbnQgbGVuOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHAgPSBidWY7CisgICAgZG8geworICAgICAgICB1bnNpZ25lZCBsb25nIGRpZ3ZhbCA9ICh1bnNpZ25lZCBsb25nKSAodmFsICUgMTApOworICAgICAgICB2YWwgLz0gMTA7CisgICAgICAgICpwKysgPSAoY2hhcikgKGRpZ3ZhbCArICcwJyk7CisgICAgfSB3aGlsZSAodmFsID4gMCk7CisKKyAgICBsZW4gPSAoaW50KShwLWJ1Zik7CisgICAgd2hpbGUgKGxlbiA8IG1pbl9kaWcpIHsKKwkqcCsrID0gKGNoYXIpcGFkOworCSsrbGVuOworICAgIH0KKyAgICAqcC0tID0gJ1wwJzsKKworICAgIGRvIHsKKyAgICAgICAgY2hhciB0ZW1wID0gKnA7CisgICAgICAgICpwID0gKmJ1ZjsKKyAgICAgICAgKmJ1ZiA9IHRlbXA7CisgICAgICAgIC0tcDsKKyAgICAgICAgKytidWY7CisgICAgfSB3aGlsZSAoYnVmIDwgcCk7CisKKyAgICByZXR1cm4gbGVuOworfQorCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc3ltYm9scy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai9zeW1ib2xzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlOTUyNgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovc3ltYm9scy5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKiAkSWQ6IHN5bWJvbHMuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqbGliLmg+CisKKy8qCisgKiBhZGRyX3Jlc29sdi5oCisgKi8KK1BKX0VYUE9SVF9TWU1CT0wocGpfZ2V0aG9zdGJ5bmFtZSkKKworLyoKKyAqIGFycmF5LmgKKyAqLworUEpfRVhQT1JUX1NZTUJPTChwal9hcnJheV9pbnNlcnQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2FycmF5X2VyYXNlKQorUEpfRVhQT1JUX1NZTUJPTChwal9hcnJheV9maW5kKQorCisvKgorICogY29uZmlnLmgKKyAqLworUEpfRVhQT1JUX1NZTUJPTChwal9kdW1wX2NvbmZpZykKKwkKKy8qCisgKiBlcnJuby5oCisgKi8KK1BKX0VYUE9SVF9TWU1CT0wocGpfZ2V0X29zX2Vycm9yKQorUEpfRVhQT1JUX1NZTUJPTChwal9zZXRfb3NfZXJyb3IpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2dldF9uZXRvc19lcnJvcikKK1BKX0VYUE9SVF9TWU1CT0wocGpfc2V0X25ldG9zX2Vycm9yKQorUEpfRVhQT1JUX1NZTUJPTChwal9zdHJlcnJvcikKKworLyoKKyAqIGV4Y2VwdC5oCisgKi8KK1BKX0VYUE9SVF9TWU1CT0wocGpfdGhyb3dfZXhjZXB0aW9uXykKK1BKX0VYUE9SVF9TWU1CT0wocGpfcHVzaF9leGNlcHRpb25faGFuZGxlcl8pCitQSl9FWFBPUlRfU1lNQk9MKHBqX3BvcF9leGNlcHRpb25faGFuZGxlcl8pCitQSl9FWFBPUlRfU1lNQk9MKHBqX3NldGptcCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9uZ2ptcCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfZXhjZXB0aW9uX2lkX2FsbG9jKQorUEpfRVhQT1JUX1NZTUJPTChwal9leGNlcHRpb25faWRfZnJlZSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfZXhjZXB0aW9uX2lkX25hbWUpCisKKworLyoKKyAqIGZpZm9idWYuaAorICovCitQSl9FWFBPUlRfU1lNQk9MKHBqX2ZpZm9idWZfaW5pdCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfZmlmb2J1Zl9tYXhfc2l6ZSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfZmlmb2J1Zl9hbGxvYykKK1BKX0VYUE9SVF9TWU1CT0wocGpfZmlmb2J1Zl91bmFsbG9jKQorUEpfRVhQT1JUX1NZTUJPTChwal9maWZvYnVmX2ZyZWUpCisKKy8qCisgKiBndWlkLmgKKyAqLworUEpfRVhQT1JUX1NZTUJPTChwal9nZW5lcmF0ZV91bmlxdWVfc3RyaW5nKQorUEpfRVhQT1JUX1NZTUJPTChwal9jcmVhdGVfdW5pcXVlX3N0cmluZykKKworLyoKKyAqIGhhc2guaAorICovCitQSl9FWFBPUlRfU1lNQk9MKHBqX2hhc2hfY2FsYykKK1BKX0VYUE9SVF9TWU1CT0wocGpfaGFzaF9jcmVhdGUpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2hhc2hfZ2V0KQorUEpfRVhQT1JUX1NZTUJPTChwal9oYXNoX3NldCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfaGFzaF9jb3VudCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfaGFzaF9maXJzdCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfaGFzaF9uZXh0KQorUEpfRVhQT1JUX1NZTUJPTChwal9oYXNoX3RoaXMpCisKKy8qCisgKiBpb3F1ZXVlLmgKKyAqLworUEpfRVhQT1JUX1NZTUJPTChwal9pb3F1ZXVlX2NyZWF0ZSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfaW9xdWV1ZV9kZXN0cm95KQorUEpfRVhQT1JUX1NZTUJPTChwal9pb3F1ZXVlX3NldF9sb2NrKQorUEpfRVhQT1JUX1NZTUJPTChwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2spCitQSl9FWFBPUlRfU1lNQk9MKHBqX2lvcXVldWVfdW5yZWdpc3RlcikKK1BKX0VYUE9SVF9TWU1CT0wocGpfaW9xdWV1ZV9nZXRfdXNlcl9kYXRhKQorUEpfRVhQT1JUX1NZTUJPTChwal9pb3F1ZXVlX3BvbGwpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2lvcXVldWVfcmVhZCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfaW9xdWV1ZV9yZWN2KQorUEpfRVhQT1JUX1NZTUJPTChwal9pb3F1ZXVlX3JlY3Zmcm9tKQorUEpfRVhQT1JUX1NZTUJPTChwal9pb3F1ZXVlX3dyaXRlKQorUEpfRVhQT1JUX1NZTUJPTChwal9pb3F1ZXVlX3NlbmQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2lvcXVldWVfc2VuZHRvKQorI2lmIGRlZmluZWQoUEpfSEFTX1RDUCkgJiYgUEpfSEFTX1RDUCAhPSAwCitQSl9FWFBPUlRfU1lNQk9MKHBqX2lvcXVldWVfYWNjZXB0KQorUEpfRVhQT1JUX1NZTUJPTChwal9pb3F1ZXVlX2Nvbm5lY3QpCisjZW5kaWYKKworLyoKKyAqIGxpc3QuaAorICovCitQSl9FWFBPUlRfU1lNQk9MKHBqX2xpc3RfaW5zZXJ0X2JlZm9yZSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfbGlzdF9pbnNlcnRfbm9kZXNfYmVmb3JlKQorUEpfRVhQT1JUX1NZTUJPTChwal9saXN0X2luc2VydF9hZnRlcikKK1BKX0VYUE9SVF9TWU1CT0wocGpfbGlzdF9pbnNlcnRfbm9kZXNfYWZ0ZXIpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2xpc3RfbWVyZ2VfZmlyc3QpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2xpc3RfbWVyZ2VfbGFzdCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfbGlzdF9lcmFzZSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfbGlzdF9maW5kX25vZGUpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2xpc3Rfc2VhcmNoKQorCisKKy8qCisgKiBsb2cuaAorICovCitQSl9FWFBPUlRfU1lNQk9MKHBqX2xvZ193cml0ZSkKKyNpZiBQSl9MT0dfTUFYX0xFVkVMID49IDEKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nX3NldF9sb2dfZnVuYykKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nX2dldF9sb2dfZnVuYykKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nX3NldF9sZXZlbCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nX2dldF9sZXZlbCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nX3NldF9kZWNvcikKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nX2dldF9kZWNvcikKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nXzEpCisjZW5kaWYKKyNpZiBQSl9MT0dfTUFYX0xFVkVMID49IDIKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nXzIpCisjZW5kaWYKKyNpZiBQSl9MT0dfTUFYX0xFVkVMID49IDMKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nXzMpCisjZW5kaWYKKyNpZiBQSl9MT0dfTUFYX0xFVkVMID49IDQKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nXzQpCisjZW5kaWYKKyNpZiBQSl9MT0dfTUFYX0xFVkVMID49IDUKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nXzUpCisjZW5kaWYKKyNpZiBQSl9MT0dfTUFYX0xFVkVMID49IDYKK1BKX0VYUE9SVF9TWU1CT0wocGpfbG9nXzYpCisjZW5kaWYKKworLyoKKyAqIG9zLmgKKyAqLworUEpfRVhQT1JUX1NZTUJPTChwal9pbml0KQorUEpfRVhQT1JUX1NZTUJPTChwal9nZXRwaWQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3RocmVhZF9yZWdpc3RlcikKK1BKX0VYUE9SVF9TWU1CT0wocGpfdGhyZWFkX2NyZWF0ZSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfdGhyZWFkX2dldF9uYW1lKQorUEpfRVhQT1JUX1NZTUJPTChwal90aHJlYWRfcmVzdW1lKQorUEpfRVhQT1JUX1NZTUJPTChwal90aHJlYWRfdGhpcykKK1BKX0VYUE9SVF9TWU1CT0wocGpfdGhyZWFkX2pvaW4pCitQSl9FWFBPUlRfU1lNQk9MKHBqX3RocmVhZF9kZXN0cm95KQorUEpfRVhQT1JUX1NZTUJPTChwal90aHJlYWRfc2xlZXApCisjaWYgZGVmaW5lZChQSl9PU19IQVNfQ0hFQ0tfU1RBQ0spICYmIFBKX09TX0hBU19DSEVDS19TVEFDSyAhPSAwCitQSl9FWFBPUlRfU1lNQk9MKHBqX3RocmVhZF9jaGVja19zdGFjaykKK1BKX0VYUE9SVF9TWU1CT0wocGpfdGhyZWFkX2dldF9zdGFja19tYXhfdXNhZ2UpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3RocmVhZF9nZXRfc3RhY2tfaW5mbykKKyNlbmRpZgorUEpfRVhQT1JUX1NZTUJPTChwal9hdG9taWNfY3JlYXRlKQorUEpfRVhQT1JUX1NZTUJPTChwal9hdG9taWNfZGVzdHJveSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfYXRvbWljX3NldCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfYXRvbWljX2dldCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfYXRvbWljX2luYykKK1BKX0VYUE9SVF9TWU1CT0wocGpfYXRvbWljX2RlYykKK1BKX0VYUE9SVF9TWU1CT0wocGpfdGhyZWFkX2xvY2FsX2FsbG9jKQorUEpfRVhQT1JUX1NZTUJPTChwal90aHJlYWRfbG9jYWxfZnJlZSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfdGhyZWFkX2xvY2FsX3NldCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfdGhyZWFkX2xvY2FsX2dldCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfZW50ZXJfY3JpdGljYWxfc2VjdGlvbikKK1BKX0VYUE9SVF9TWU1CT0wocGpfbGVhdmVfY3JpdGljYWxfc2VjdGlvbikKK1BKX0VYUE9SVF9TWU1CT0wocGpfbXV0ZXhfY3JlYXRlKQorUEpfRVhQT1JUX1NZTUJPTChwal9tdXRleF9sb2NrKQorUEpfRVhQT1JUX1NZTUJPTChwal9tdXRleF91bmxvY2spCitQSl9FWFBPUlRfU1lNQk9MKHBqX211dGV4X3RyeWxvY2spCitQSl9FWFBPUlRfU1lNQk9MKHBqX211dGV4X2Rlc3Ryb3kpCisjaWYgZGVmaW5lZChQSl9ERUJVRykgJiYgUEpfREVCVUcgIT0gMAorUEpfRVhQT1JUX1NZTUJPTChwal9tdXRleF9pc19sb2NrZWQpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFBKX0hBU19TRU1BUEhPUkUpICYmIFBKX0hBU19TRU1BUEhPUkUgIT0gMAorUEpfRVhQT1JUX1NZTUJPTChwal9zZW1fY3JlYXRlKQorUEpfRVhQT1JUX1NZTUJPTChwal9zZW1fd2FpdCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfc2VtX3RyeXdhaXQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3NlbV9wb3N0KQorUEpfRVhQT1JUX1NZTUJPTChwal9zZW1fZGVzdHJveSkKKyNlbmRpZgorUEpfRVhQT1JUX1NZTUJPTChwal9nZXR0aW1lb2ZkYXkpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3RpbWVfZGVjb2RlKQorI2lmIGRlZmluZWQoUEpfSEFTX0hJR0hfUkVTX1RJTUVSKSAmJiBQSl9IQVNfSElHSF9SRVNfVElNRVIgIT0gMAorUEpfRVhQT1JUX1NZTUJPTChwal9nZXR0aWNrY291bnQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2dldF90aW1lc3RhbXApCitQSl9FWFBPUlRfU1lNQk9MKHBqX2dldF90aW1lc3RhbXBfZnJlcSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfZWxhcHNlZF90aW1lKQorUEpfRVhQT1JUX1NZTUJPTChwal9lbGFwc2VkX3VzZWMpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2VsYXBzZWRfbmFub3NlYykKK1BKX0VYUE9SVF9TWU1CT0wocGpfZWxhcHNlZF9jeWNsZSkKKyNlbmRpZgorCisJCisvKgorICogcG9vbC5oCisgKi8KK1BKX0VYUE9SVF9TWU1CT0wocGpfcG9vbF9jcmVhdGUpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3Bvb2xfcmVsZWFzZSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfcG9vbF9nZXRvYmpuYW1lKQorUEpfRVhQT1JUX1NZTUJPTChwal9wb29sX3Jlc2V0KQorUEpfRVhQT1JUX1NZTUJPTChwal9wb29sX2dldF9jYXBhY2l0eSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfcG9vbF9nZXRfdXNlZF9zaXplKQorUEpfRVhQT1JUX1NZTUJPTChwal9wb29sX2FsbG9jKQorUEpfRVhQT1JUX1NZTUJPTChwal9wb29sX2NhbGxvYykKK1BKX0VYUE9SVF9TWU1CT0wocGpfcG9vbF9mYWN0b3J5X2RlZmF1bHRfcG9saWN5KQorUEpfRVhQT1JUX1NZTUJPTChwal9wb29sX2NyZWF0ZV9pbnQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3Bvb2xfaW5pdF9pbnQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3Bvb2xfZGVzdHJveV9pbnQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX2NhY2hpbmdfcG9vbF9pbml0KQorUEpfRVhQT1JUX1NZTUJPTChwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSkKKworLyoKKyAqIHJhbmQuaAorICovCitQSl9FWFBPUlRfU1lNQk9MKHBqX3JhbmQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3NyYW5kKQorCisvKgorICogcmJ0cmVlLmgKKyAqLworUEpfRVhQT1JUX1NZTUJPTChwal9yYnRyZWVfaW5pdCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfcmJ0cmVlX2ZpcnN0KQorUEpfRVhQT1JUX1NZTUJPTChwal9yYnRyZWVfbGFzdCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfcmJ0cmVlX25leHQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3JidHJlZV9wcmV2KQorUEpfRVhQT1JUX1NZTUJPTChwal9yYnRyZWVfaW5zZXJ0KQorUEpfRVhQT1JUX1NZTUJPTChwal9yYnRyZWVfZmluZCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfcmJ0cmVlX2VyYXNlKQorUEpfRVhQT1JUX1NZTUJPTChwal9yYnRyZWVfbWF4X2hlaWdodCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfcmJ0cmVlX21pbl9oZWlnaHQpCisKKy8qCisgKiBzb2NrLmgKKyAqLworUEpfRVhQT1JUX1NZTUJPTChQSl9BRl9VTklYKQorUEpfRVhQT1JUX1NZTUJPTChQSl9BRl9JTkVUKQorUEpfRVhQT1JUX1NZTUJPTChQSl9BRl9JTkVUNikKK1BKX0VYUE9SVF9TWU1CT0woUEpfQUZfUEFDS0VUKQorUEpfRVhQT1JUX1NZTUJPTChQSl9BRl9JUkRBKQorUEpfRVhQT1JUX1NZTUJPTChQSl9TT0NLX1NUUkVBTSkKK1BKX0VYUE9SVF9TWU1CT0woUEpfU09DS19ER1JBTSkKK1BKX0VYUE9SVF9TWU1CT0woUEpfU09DS19SQVcpCitQSl9FWFBPUlRfU1lNQk9MKFBKX1NPQ0tfUkRNKQorUEpfRVhQT1JUX1NZTUJPTChQSl9TT0xfU09DS0VUKQorUEpfRVhQT1JUX1NZTUJPTChQSl9TT0xfSVApCitQSl9FWFBPUlRfU1lNQk9MKFBKX1NPTF9UQ1ApCitQSl9FWFBPUlRfU1lNQk9MKFBKX1NPTF9VRFApCitQSl9FWFBPUlRfU1lNQk9MKFBKX1NPTF9JUFY2KQorUEpfRVhQT1JUX1NZTUJPTChwal9udG9ocykKK1BKX0VYUE9SVF9TWU1CT0wocGpfaHRvbnMpCitQSl9FWFBPUlRfU1lNQk9MKHBqX250b2hsKQorUEpfRVhQT1JUX1NZTUJPTChwal9odG9ubCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfaW5ldF9udG9hKQorUEpfRVhQT1JUX1NZTUJPTChwal9pbmV0X2F0b24pCitQSl9FWFBPUlRfU1lNQk9MKHBqX2luZXRfYWRkcikKK1BKX0VYUE9SVF9TWU1CT0wocGpfc29ja2FkZHJfaW5fc2V0X3N0cl9hZGRyKQorUEpfRVhQT1JUX1NZTUJPTChwal9zb2NrYWRkcl9pbl9pbml0KQorUEpfRVhQT1JUX1NZTUJPTChwal9nZXRob3N0bmFtZSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfZ2V0aG9zdGFkZHIpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3NvY2tfc29ja2V0KQorUEpfRVhQT1JUX1NZTUJPTChwal9zb2NrX2Nsb3NlKQorUEpfRVhQT1JUX1NZTUJPTChwal9zb2NrX2JpbmQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3NvY2tfYmluZF9pbikKKyNpZiBkZWZpbmVkKFBKX0hBU19UQ1ApICYmIFBKX0hBU19UQ1AgIT0gMAorUEpfRVhQT1JUX1NZTUJPTChwal9zb2NrX2xpc3RlbikKK1BKX0VYUE9SVF9TWU1CT0wocGpfc29ja19hY2NlcHQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3NvY2tfc2h1dGRvd24pCisjZW5kaWYKK1BKX0VYUE9SVF9TWU1CT0wocGpfc29ja19jb25uZWN0KQorUEpfRVhQT1JUX1NZTUJPTChwal9zb2NrX2dldHBlZXJuYW1lKQorUEpfRVhQT1JUX1NZTUJPTChwal9zb2NrX2dldHNvY2tuYW1lKQorUEpfRVhQT1JUX1NZTUJPTChwal9zb2NrX2dldHNvY2tvcHQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3NvY2tfc2V0c29ja29wdCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfc29ja19yZWN2KQorUEpfRVhQT1JUX1NZTUJPTChwal9zb2NrX3JlY3Zmcm9tKQorUEpfRVhQT1JUX1NZTUJPTChwal9zb2NrX3NlbmQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3NvY2tfc2VuZHRvKQorCisvKgorICogc29ja19zZWxlY3QuaAorICovCitQSl9FWFBPUlRfU1lNQk9MKFBKX0ZEX1pFUk8pCitQSl9FWFBPUlRfU1lNQk9MKFBKX0ZEX1NFVCkKK1BKX0VYUE9SVF9TWU1CT0woUEpfRkRfQ0xSKQorUEpfRVhQT1JUX1NZTUJPTChQSl9GRF9JU1NFVCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfc29ja19zZWxlY3QpCisKKy8qCisgKiBzdHJpbmcuaAorICovCitQSl9FWFBPUlRfU1lNQk9MKHBqX3N0cikKK1BKX0VYUE9SVF9TWU1CT0wocGpfc3RyYXNzaWduKQorUEpfRVhQT1JUX1NZTUJPTChwal9zdHJjcHkpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3N0cmNweTIpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3N0cmR1cCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfc3RyZHVwX3dpdGhfbnVsbCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfc3RyZHVwMikKK1BKX0VYUE9SVF9TWU1CT0wocGpfc3RyZHVwMykKK1BKX0VYUE9SVF9TWU1CT0wocGpfc3RyY21wKQorUEpfRVhQT1JUX1NZTUJPTChwal9zdHJjbXAyKQorUEpfRVhQT1JUX1NZTUJPTChwal9zdHJuY21wKQorUEpfRVhQT1JUX1NZTUJPTChwal9zdHJuY21wMikKK1BKX0VYUE9SVF9TWU1CT0wocGpfc3RyaWNtcCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfc3RyaWNtcDIpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3N0cm5pY21wKQorUEpfRVhQT1JUX1NZTUJPTChwal9zdHJuaWNtcDIpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3N0cmNhdCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfc3RybHRyaW0pCitQSl9FWFBPUlRfU1lNQk9MKHBqX3N0cnJ0cmltKQorUEpfRVhQT1JUX1NZTUJPTChwal9zdHJ0cmltKQorUEpfRVhQT1JUX1NZTUJPTChwal9jcmVhdGVfcmFuZG9tX3N0cmluZykKK1BKX0VYUE9SVF9TWU1CT0wocGpfc3RydG91bCkKK1BKX0VYUE9SVF9TWU1CT0wocGpfdXRvYSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfdXRvYV9wYWQpCisKKy8qCisgKiB0aW1lci5oCisgKi8KK1BKX0VYUE9SVF9TWU1CT0wocGpfdGltZXJfaGVhcF9tZW1fc2l6ZSkKK1BKX0VYUE9SVF9TWU1CT0wocGpfdGltZXJfaGVhcF9jcmVhdGUpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3RpbWVyX2VudHJ5X2luaXQpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3RpbWVyX2hlYXBfc2NoZWR1bGUpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3RpbWVyX2hlYXBfY2FuY2VsKQorUEpfRVhQT1JUX1NZTUJPTChwal90aW1lcl9oZWFwX2NvdW50KQorUEpfRVhQT1JUX1NZTUJPTChwal90aW1lcl9oZWFwX2VhcmxpZXN0X3RpbWUpCitQSl9FWFBPUlRfU1lNQk9MKHBqX3RpbWVyX2hlYXBfcG9sbCkKKworLyoKKyAqIHR5cGVzLmgKKyAqLworUEpfRVhQT1JUX1NZTUJPTChwal90aW1lX3ZhbF9ub3JtYWxpemUpCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovdGltZXIuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGUzMThlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai90aW1lci5jCkBAIC0wLDAgKzEsNzE0IEBACisvKiAkSWQ6IHRpbWVyLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogVGhlIFBKTElCJ3MgdGltZXIgaGVhcCBpcyBiYXNlZCAob3IgbW9yZSBjb3JyZWN0bHksIGNvcGllZCBhbmQgbW9kaWVkKQorICogZnJvbSBBQ0UgbGlicmFyeSBieSBEb3VnbGFzIEMuIFNjaG1pZHQuIEFDRSBpcyBhbiBleGNlbGxlbnQgT08gZnJhbWV3b3JrCisgKiB0aGF0IGltcGxlbWVudHMgbWFueSBjb3JlIHBhdHRlcm5zIGZvciBjb25jdXJyZW50IGNvbW11bmljYXRpb24gc29mdHdhcmUuCisgKiBJZiB5b3UncmUgbG9va2luZyBmb3IgQysrIGFsdGVybmF0aXZlIG9mIFBKTElCLCB0aGVuIEFDRSBpcyB5b3VyIGJlc3QKKyAqIHNvbHV0aW9uLgorICoKKyAqIFlvdSBtYXkgdXNlIHRoaXMgZmlsZSBhY2NvcmRpbmcgdG8gQUNFIG9wZW4gc291cmNlIHRlcm1zIG9yIFBKTElCIG9wZW4KKyAqIHNvdXJjZSB0ZXJtcy4gWW91IGNhbiBmaW5kIHRoZSBmaW5lIEFDRSBsaWJyYXJ5IGF0OgorICogIGh0dHA6Ly93d3cuY3Mud3VzdGwuZWR1L35zY2htaWR0L0FDRS5odG1sCisgKgorICogQUNFIGlzIENvcHlyaWdodCAoQykxOTkzLTIwMDYgRG91Z2xhcyBDLiBTY2htaWR0IDxkLnNjaG1pZHRAdmFuZGVyYmlsdC5lZHU+CisgKgorICogR05VIFB1YmxpYyBMaWNlbnNlOgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3RpbWVyLmg+CisjaW5jbHVkZSA8cGovcG9vbC5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovYXNzZXJ0Lmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9sb2NrLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovcmFuZC5oPgorCisjZGVmaW5lIFRISVNfRklMRQkidGltZXIuYyIKKworI2RlZmluZSBIRUFQX1BBUkVOVChYKQkoWCA9PSAwID8gMCA6ICgoKFgpIC0gMSkgLyAyKSkKKyNkZWZpbmUgSEVBUF9MRUZUKFgpCSgoKFgpKyhYKSkrMSkKKworCisjZGVmaW5lIERFRkFVTFRfTUFYX1RJTUVEX09VVF9QRVJfUE9MTCAgKDY0KQorCitlbnVtCit7CisgICAgRl9ET05UX0NBTEwgPSAxLAorICAgIEZfRE9OVF9BU1NFUlQgPSAyLAorICAgIEZfU0VUX0lEID0gNAorfTsKKworCisvKioKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aW1lciBoZWFwLgorICovCitzdHJ1Y3QgcGpfdGltZXJfaGVhcF90Cit7CisgICAgLyoqIFBvb2wgZnJvbSB3aGljaCB0aGUgdGltZXIgaGVhcCByZXNpemUgd2lsbCBnZXQgdGhlIHN0b3JhZ2UgZnJvbSAqLworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKworICAgIC8qKiBNYXhpbXVtIHNpemUgb2YgdGhlIGhlYXAuICovCisgICAgcGpfc2l6ZV90IG1heF9zaXplOworCisgICAgLyoqIEN1cnJlbnQgc2l6ZSBvZiB0aGUgaGVhcC4gKi8KKyAgICBwal9zaXplX3QgY3VyX3NpemU7CisKKyAgICAvKiogTWF4IHRpbWVkIG91dCBlbnRyaWVzIHRvIHByb2Nlc3MgcGVyIHBvbGwuICovCisgICAgdW5zaWduZWQgbWF4X2VudHJpZXNfcGVyX3BvbGw7CisKKyAgICAvKiogTG9jayBvYmplY3QuICovCisgICAgcGpfbG9ja190ICpsb2NrOworCisgICAgLyoqIEF1dG9kZWxldGUgbG9jay4gKi8KKyAgICBwal9ib29sX3QgYXV0b19kZWxldGVfbG9jazsKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgY29udGVudHMgb2YgdGhlIEhlYXAsIHdoaWNoIGlzIG9yZ2FuaXplZCBhcyBhICJoZWFwIiBvZgorICAgICAqIHBqX3RpbWVyX2VudHJ5IConcy4gIEluIHRoaXMgY29udGV4dCwgYSBoZWFwIGlzIGEgInBhcnRpYWxseQorICAgICAqIG9yZGVyZWQsIGFsbW9zdCBjb21wbGV0ZSIgYmluYXJ5IHRyZWUsIHdoaWNoIGlzIHN0b3JlZCBpbiBhbgorICAgICAqIGFycmF5LgorICAgICAqLworICAgIHBqX3RpbWVyX2VudHJ5ICoqaGVhcDsKKworICAgIC8qKgorICAgICAqIEFuIGFycmF5IG9mICJwb2ludGVycyIgdGhhdCBhbGxvd3MgZWFjaCBwal90aW1lcl9lbnRyeSBpbiB0aGUKKyAgICAgKiA8aGVhcF8+IHRvIGJlIGxvY2F0ZWQgaW4gTygxKSB0aW1lLiAgQmFzaWNhbGx5LCA8dGltZXJfaWRfW2ldPgorICAgICAqIGNvbnRhaW5zIHRoZSBzbG90IGluIHRoZSA8aGVhcF8+IGFycmF5IHdoZXJlIGFuIHBqX3RpbWVyX2VudHJ5CisgICAgICogd2l0aCB0aW1lciBpZCA8aT4gcmVzaWRlcy4gIFRodXMsIHRoZSB0aW1lciBpZCBwYXNzZWQgYmFjayBmcm9tCisgICAgICogPHNjaGVkdWxlX2VudHJ5PiBpcyByZWFsbHkgYW4gc2xvdCBpbnRvIHRoZSA8dGltZXJfaWRzPiBhcnJheS4gIFRoZQorICAgICAqIDx0aW1lcl9pZHNfPiBhcnJheSBzZXJ2ZXMgdHdvIHB1cnBvc2VzOiBuZWdhdGl2ZSB2YWx1ZXMgYXJlCisgICAgICogdHJlYXRlZCBhcyAicG9pbnRlcnMiIGZvciB0aGUgPGZyZWVsaXN0Xz4sIHdoZXJlYXMgcG9zaXRpdmUKKyAgICAgKiB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgInBvaW50ZXJzIiBpbnRvIHRoZSA8aGVhcF8+IGFycmF5LgorICAgICAqLworICAgIHBqX3RpbWVyX2lkX3QgKnRpbWVyX2lkczsKKworICAgIC8qKgorICAgICAqICJQb2ludGVyIiB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgZnJlZWxpc3QgY29udGFpbmVkIHdpdGhpbgorICAgICAqIHRoZSA8dGltZXJfaWRzXz4gYXJyYXksIHdoaWNoIGlzIG9yZ2FuaXplZCBhcyBhIHN0YWNrLgorICAgICAqLworICAgIHBqX3RpbWVyX2lkX3QgdGltZXJfaWRzX2ZyZWVsaXN0OworCisgICAgLyoqIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgdGltZXIgZXhwaXJlcy4gKi8KKyAgICBwal90aW1lcl9oZWFwX2NhbGxiYWNrICpjYWxsYmFjazsKKworfTsKKworCisKK1BKX0lOTElORSh2b2lkKSBsb2NrX3RpbWVyX2hlYXAoIHBqX3RpbWVyX2hlYXBfdCAqaHQgKQoreworICAgIGlmIChodC0+bG9jaykgeworCXBqX2xvY2tfYWNxdWlyZShodC0+bG9jayk7CisgICAgfQorfQorCitQSl9JTkxJTkUodm9pZCkgdW5sb2NrX3RpbWVyX2hlYXAoIHBqX3RpbWVyX2hlYXBfdCAqaHQgKQoreworICAgIGlmIChodC0+bG9jaykgeworCXBqX2xvY2tfcmVsZWFzZShodC0+bG9jayk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGNvcHlfbm9kZSggcGpfdGltZXJfaGVhcF90ICpodCwgcGpfc2l6ZV90IHNsb3QsIAorCQkgICAgICAgcGpfdGltZXJfZW50cnkgKm1vdmVkX25vZGUgKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICAvLyBJbnNlcnQgPG1vdmVkX25vZGU+IGludG8gaXRzIG5ldyBsb2NhdGlvbiBpbiB0aGUgaGVhcC4KKyAgICBodC0+aGVhcFtzbG90XSA9IG1vdmVkX25vZGU7CisgICAgCisgICAgLy8gVXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIHNsb3QgaW4gdGhlIHBhcmFsbGVsIDx0aW1lcl9pZHNfPiBhcnJheS4KKyAgICBodC0+dGltZXJfaWRzW21vdmVkX25vZGUtPl90aW1lcl9pZF0gPSAoaW50KXNsb3Q7Cit9CisKK3N0YXRpYyBwal90aW1lcl9pZF90IHBvcF9mcmVlbGlzdCggcGpfdGltZXJfaGVhcF90ICpodCApCit7CisgICAgLy8gV2UgbmVlZCB0byB0cnVuY2F0ZSB0aGlzIHRvIDxpbnQ+IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgICBwal90aW1lcl9pZF90IG5ld19pZCA9IGh0LT50aW1lcl9pZHNfZnJlZWxpc3Q7CisgICAgCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIC8vIFRoZSBmcmVlbGlzdCB2YWx1ZXMgaW4gdGhlIDx0aW1lcl9pZHNfPiBhcmUgbmVnYXRpdmUsIHNvIHdlIG5lZWQKKyAgICAvLyB0byBuZWdhdGUgdGhlbSB0byBnZXQgdGhlIG5leHQgZnJlZWxpc3QgInBvaW50ZXIuIgorICAgIGh0LT50aW1lcl9pZHNfZnJlZWxpc3QgPQorCS1odC0+dGltZXJfaWRzW2h0LT50aW1lcl9pZHNfZnJlZWxpc3RdOworICAgIAorICAgIHJldHVybiBuZXdfaWQ7CisgICAgCit9CisKK3N0YXRpYyB2b2lkIHB1c2hfZnJlZWxpc3QgKHBqX3RpbWVyX2hlYXBfdCAqaHQsIHBqX3RpbWVyX2lkX3Qgb2xkX2lkKQoreworICAgIFBKX0NIRUNLX1NUQUNLKCk7CisKKyAgICAvLyBUaGUgZnJlZWxpc3QgdmFsdWVzIGluIHRoZSA8dGltZXJfaWRzXz4gYXJlIG5lZ2F0aXZlLCBzbyB3ZSBuZWVkCisgICAgLy8gdG8gbmVnYXRlIHRoZW0gdG8gZ2V0IHRoZSBuZXh0IGZyZWVsaXN0ICJwb2ludGVyLiIKKyAgICBodC0+dGltZXJfaWRzW29sZF9pZF0gPSAtaHQtPnRpbWVyX2lkc19mcmVlbGlzdDsKKyAgICBodC0+dGltZXJfaWRzX2ZyZWVsaXN0ID0gb2xkX2lkOworfQorCisKK3N0YXRpYyB2b2lkIHJlaGVhcF9kb3duKHBqX3RpbWVyX2hlYXBfdCAqaHQsIHBqX3RpbWVyX2VudHJ5ICptb3ZlZF9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNsb3QsIHNpemVfdCBjaGlsZCkKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgLy8gUmVzdG9yZSB0aGUgaGVhcCBwcm9wZXJ0eSBhZnRlciBhIGRlbGV0aW9uLgorICAgIAorICAgIHdoaWxlIChjaGlsZCA8IGh0LT5jdXJfc2l6ZSkKKyAgICB7CisJLy8gQ2hvb3NlIHRoZSBzbWFsbGVyIG9mIHRoZSB0d28gY2hpbGRyZW4uCisJaWYgKGNoaWxkICsgMSA8IGh0LT5jdXJfc2l6ZQorCSAgICAmJiBQSl9USU1FX1ZBTF9MVChodC0+aGVhcFtjaGlsZCArIDFdLT5fdGltZXJfdmFsdWUsIGh0LT5oZWFwW2NoaWxkXS0+X3RpbWVyX3ZhbHVlKSkKKwkgICAgY2hpbGQrKzsKKwkKKwkvLyBQZXJmb3JtIGEgPGNvcHk+IGlmIHRoZSBjaGlsZCBoYXMgYSBsYXJnZXIgdGltZW91dCB2YWx1ZSB0aGFuCisJLy8gdGhlIDxtb3ZlZF9ub2RlPi4KKwlpZiAoUEpfVElNRV9WQUxfTFQoaHQtPmhlYXBbY2hpbGRdLT5fdGltZXJfdmFsdWUsIG1vdmVkX25vZGUtPl90aW1lcl92YWx1ZSkpCisgICAgICAgIHsKKwkgICAgY29weV9ub2RlKCBodCwgc2xvdCwgaHQtPmhlYXBbY2hpbGRdKTsKKwkgICAgc2xvdCA9IGNoaWxkOworCSAgICBjaGlsZCA9IEhFQVBfTEVGVChjaGlsZCk7CisgICAgICAgIH0KKwllbHNlCisJICAgIC8vIFdlJ3ZlIGZvdW5kIG91ciBsb2NhdGlvbiBpbiB0aGUgaGVhcC4KKwkgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGNvcHlfbm9kZSggaHQsIHNsb3QsIG1vdmVkX25vZGUpOworfQorCitzdGF0aWMgdm9pZCByZWhlYXBfdXAoIHBqX3RpbWVyX2hlYXBfdCAqaHQsIHBqX3RpbWVyX2VudHJ5ICptb3ZlZF9ub2RlLAorCQkgICAgICAgc2l6ZV90IHNsb3QsIHNpemVfdCBwYXJlbnQpCit7CisgICAgLy8gUmVzdG9yZSB0aGUgaGVhcCBwcm9wZXJ0eSBhZnRlciBhbiBpbnNlcnRpb24uCisgICAgCisgICAgd2hpbGUgKHNsb3QgPiAwKQorICAgIHsKKwkvLyBJZiB0aGUgcGFyZW50IG5vZGUgaXMgZ3JlYXRlciB0aGFuIHRoZSA8bW92ZWRfbm9kZT4gd2UgbmVlZAorCS8vIHRvIGNvcHkgaXQgZG93bi4KKwlpZiAoUEpfVElNRV9WQUxfTFQobW92ZWRfbm9kZS0+X3RpbWVyX3ZhbHVlLCBodC0+aGVhcFtwYXJlbnRdLT5fdGltZXJfdmFsdWUpKQorICAgICAgICB7CisJICAgIGNvcHlfbm9kZShodCwgc2xvdCwgaHQtPmhlYXBbcGFyZW50XSk7CisJICAgIHNsb3QgPSBwYXJlbnQ7CisJICAgIHBhcmVudCA9IEhFQVBfUEFSRU5UKHNsb3QpOworICAgICAgICB9CisJZWxzZQorCSAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgLy8gSW5zZXJ0IHRoZSBuZXcgbm9kZSBpbnRvIGl0cyBwcm9wZXIgcmVzdGluZyBwbGFjZSBpbiB0aGUgaGVhcCBhbmQKKyAgICAvLyB1cGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgc2xvdCBpbiB0aGUgcGFyYWxsZWwgPHRpbWVyX2lkcz4gYXJyYXkuCisgICAgY29weV9ub2RlKGh0LCBzbG90LCBtb3ZlZF9ub2RlKTsKK30KKworCitzdGF0aWMgcGpfdGltZXJfZW50cnkgKiByZW1vdmVfbm9kZSggcGpfdGltZXJfaGVhcF90ICpodCwgc2l6ZV90IHNsb3QpCit7CisgICAgcGpfdGltZXJfZW50cnkgKnJlbW92ZWRfbm9kZSA9IGh0LT5oZWFwW3Nsb3RdOworICAgIAorICAgIC8vIFJldHVybiB0aGlzIHRpbWVyIGlkIHRvIHRoZSBmcmVlbGlzdC4KKyAgICBwdXNoX2ZyZWVsaXN0KCBodCwgcmVtb3ZlZF9ub2RlLT5fdGltZXJfaWQgKTsKKyAgICAKKyAgICAvLyBEZWNyZW1lbnQgdGhlIHNpemUgb2YgdGhlIGhlYXAgYnkgb25lIHNpbmNlIHdlJ3JlIHJlbW92aW5nIHRoZQorICAgIC8vICJzbG90InRoIG5vZGUuCisgICAgaHQtPmN1cl9zaXplLS07CisgICAgCisgICAgLy8gU2V0IHRoZSBJRAorICAgIHJlbW92ZWRfbm9kZS0+X3RpbWVyX2lkID0gLTE7CisKKyAgICAvLyBPbmx5IHRyeSB0byByZWhlYXBpZnkgaWYgd2UncmUgbm90IGRlbGV0aW5nIHRoZSBsYXN0IGVudHJ5LgorICAgIAorICAgIGlmIChzbG90IDwgaHQtPmN1cl9zaXplKQorICAgIHsKKwlwal9zaXplX3QgcGFyZW50OworCXBqX3RpbWVyX2VudHJ5ICptb3ZlZF9ub2RlID0gaHQtPmhlYXBbaHQtPmN1cl9zaXplXTsKKwkKKwkvLyBNb3ZlIHRoZSBlbmQgbm9kZSB0byB0aGUgbG9jYXRpb24gYmVpbmcgcmVtb3ZlZCBhbmQgdXBkYXRlCisJLy8gdGhlIGNvcnJlc3BvbmRpbmcgc2xvdCBpbiB0aGUgcGFyYWxsZWwgPHRpbWVyX2lkcz4gYXJyYXkuCisJY29weV9ub2RlKCBodCwgc2xvdCwgbW92ZWRfbm9kZSk7CisJCisJLy8gSWYgdGhlIDxtb3ZlZF9ub2RlLT50aW1lX3ZhbHVlXz4gaXMgZ3JlYXQgdGhhbiBvciBlcXVhbCBpdHMKKwkvLyBwYXJlbnQgaXQgbmVlZHMgYmUgbW92ZWQgZG93biB0aGUgaGVhcC4KKwlwYXJlbnQgPSBIRUFQX1BBUkVOVCAoc2xvdCk7CisJCisJaWYgKFBKX1RJTUVfVkFMX0dURShtb3ZlZF9ub2RlLT5fdGltZXJfdmFsdWUsIGh0LT5oZWFwW3BhcmVudF0tPl90aW1lcl92YWx1ZSkpCisJICAgIHJlaGVhcF9kb3duKCBodCwgbW92ZWRfbm9kZSwgc2xvdCwgSEVBUF9MRUZUKHNsb3QpKTsKKwllbHNlCisJICAgIHJlaGVhcF91cCggaHQsIG1vdmVkX25vZGUsIHNsb3QsIHBhcmVudCk7CisgICAgfQorICAgIAorICAgIHJldHVybiByZW1vdmVkX25vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGdyb3dfaGVhcChwal90aW1lcl9oZWFwX3QgKmh0KQoreworICAgIC8vIEFsbCB0aGUgY29udGFpbmVycyB3aWxsIGRvdWJsZSBpbiBzaXplIGZyb20gbWF4X3NpemVfCisgICAgc2l6ZV90IG5ld19zaXplID0gaHQtPm1heF9zaXplICogMjsKKyAgICBwal90aW1lcl9pZF90ICpuZXdfdGltZXJfaWRzOworICAgIHBqX3NpemVfdCBpOworICAgIAorICAgIC8vIEZpcnN0IGdyb3cgdGhlIGhlYXAgaXRzZWxmLgorICAgIAorICAgIHBqX3RpbWVyX2VudHJ5ICoqbmV3X2hlYXAgPSAwOworICAgIAorICAgIG5ld19oZWFwID0gKHBqX3RpbWVyX2VudHJ5KiopIAorICAgIAkgICAgICAgcGpfcG9vbF9hbGxvYyhodC0+cG9vbCwgc2l6ZW9mKHBqX3RpbWVyX2VudHJ5KikgKiBuZXdfc2l6ZSk7CisgICAgbWVtY3B5KG5ld19oZWFwLCBodC0+aGVhcCwgaHQtPm1heF9zaXplICogc2l6ZW9mKHBqX3RpbWVyX2VudHJ5KikpOworICAgIC8vZGVsZXRlIFtdIHRoaXMtPmhlYXBfOworICAgIGh0LT5oZWFwID0gbmV3X2hlYXA7CisgICAgCisgICAgLy8gR3JvdyB0aGUgYXJyYXkgb2YgdGltZXIgaWRzLgorICAgIAorICAgIG5ld190aW1lcl9pZHMgPSAwOworICAgIG5ld190aW1lcl9pZHMgPSAocGpfdGltZXJfaWRfdCopCisgICAgCQkgICAgcGpfcG9vbF9hbGxvYyhodC0+cG9vbCwgbmV3X3NpemUgKiBzaXplb2YocGpfdGltZXJfaWRfdCkpOworICAgIAorICAgIG1lbWNweSggbmV3X3RpbWVyX2lkcywgaHQtPnRpbWVyX2lkcywgaHQtPm1heF9zaXplICogc2l6ZW9mKHBqX3RpbWVyX2lkX3QpKTsKKyAgICAKKyAgICAvL2RlbGV0ZSBbXSB0aW1lcl9pZHNfOworICAgIGh0LT50aW1lcl9pZHMgPSBuZXdfdGltZXJfaWRzOworICAgIAorICAgIC8vIEFuZCBhZGQgdGhlIG5ldyBlbGVtZW50cyB0byB0aGUgZW5kIG9mIHRoZSAiZnJlZWxpc3QiLgorICAgIGZvciAoaSA9IGh0LT5tYXhfc2l6ZTsgaSA8IG5ld19zaXplOyBpKyspCisJaHQtPnRpbWVyX2lkc1tpXSA9IC0oKHBqX3RpbWVyX2lkX3QpIChpICsgMSkpOworICAgIAorICAgIGh0LT5tYXhfc2l6ZSA9IG5ld19zaXplOworfQorCitzdGF0aWMgdm9pZCBpbnNlcnRfbm9kZShwal90aW1lcl9oZWFwX3QgKmh0LCBwal90aW1lcl9lbnRyeSAqbmV3X25vZGUpCit7CisgICAgaWYgKGh0LT5jdXJfc2l6ZSArIDIgPj0gaHQtPm1heF9zaXplKQorCWdyb3dfaGVhcChodCk7CisgICAgCisgICAgcmVoZWFwX3VwKCBodCwgbmV3X25vZGUsIGh0LT5jdXJfc2l6ZSwgSEVBUF9QQVJFTlQoaHQtPmN1cl9zaXplKSk7CisgICAgaHQtPmN1cl9zaXplKys7Cit9CisKKworc3RhdGljIHBqX3N0YXR1c190IHNjaGVkdWxlX2VudHJ5KCBwal90aW1lcl9oZWFwX3QgKmh0LAorCQkJCSAgIHBqX3RpbWVyX2VudHJ5ICplbnRyeSwgCisJCQkJICAgY29uc3QgcGpfdGltZV92YWwgKmZ1dHVyZV90aW1lICkKK3sKKyAgICBpZiAoaHQtPmN1cl9zaXplIDwgaHQtPm1heF9zaXplKQorICAgIHsKKwkvLyBPYnRhaW4gdGhlIG5leHQgdW5pcXVlIHNlcXVlbmNlIG51bWJlci4KKwkvLyBTZXQgdGhlIGVudHJ5CisJZW50cnktPl90aW1lcl9pZCA9IHBvcF9mcmVlbGlzdChodCk7CisJZW50cnktPl90aW1lcl92YWx1ZSA9ICpmdXR1cmVfdGltZTsKKwlpbnNlcnRfbm9kZSggaHQsIGVudHJ5KTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgaW50IGNhbmNlbCggcGpfdGltZXJfaGVhcF90ICpodCwgCisJCSAgIHBqX3RpbWVyX2VudHJ5ICplbnRyeSwgCisJCSAgIHVuc2lnbmVkIGZsYWdzKQoreworICBsb25nIHRpbWVyX25vZGVfc2xvdDsKKworICBQSl9DSEVDS19TVEFDSygpOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdGltZXJfaWQgaXMgb3V0IG9mIHJhbmdlCisgIGlmIChlbnRyeS0+X3RpbWVyX2lkIDwgMCB8fCAocGpfc2l6ZV90KWVudHJ5LT5fdGltZXJfaWQgPiBodC0+bWF4X3NpemUpCisgICAgcmV0dXJuIDA7CisKKyAgdGltZXJfbm9kZV9zbG90ID0gaHQtPnRpbWVyX2lkc1tlbnRyeS0+X3RpbWVyX2lkXTsKKworICBpZiAodGltZXJfbm9kZV9zbG90IDwgMCkgLy8gQ2hlY2sgdG8gc2VlIGlmIHRpbWVyX2lkIGlzIHN0aWxsIHZhbGlkLgorICAgIHJldHVybiAwOworCisgIGlmIChlbnRyeSAhPSBodC0+aGVhcFt0aW1lcl9ub2RlX3Nsb3RdKQorICAgIHsKKyAgICAgIGlmICgoZmxhZ3MgJiBGX0RPTlRfQVNTRVJUKSA9PSAwKQorCSAgcGpfYXNzZXJ0KGVudHJ5ID09IGh0LT5oZWFwW3RpbWVyX25vZGVfc2xvdF0pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVtb3ZlX25vZGUoIGh0LCB0aW1lcl9ub2RlX3Nsb3QpOworCisgICAgICBpZiAoKGZsYWdzICYgRl9ET05UX0NBTEwpID09IDApCisgICAgICAgIC8vIENhbGwgdGhlIGNsb3NlIGhvb2suCisJKCpodC0+Y2FsbGJhY2spKGh0LCBlbnRyeSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKworLyoKKyAqIENhbGN1bGF0ZSBtZW1vcnkgc2l6ZSByZXF1aXJlZCB0byBjcmVhdGUgYSB0aW1lciBoZWFwLgorICovCitQSl9ERUYocGpfc2l6ZV90KSBwal90aW1lcl9oZWFwX21lbV9zaXplKHBqX3NpemVfdCBjb3VudCkKK3sKKyAgICByZXR1cm4gLyogc2l6ZSBvZiB0aGUgdGltZXIgaGVhcCBpdHNlbGY6ICovCisgICAgICAgICAgIHNpemVvZihwal90aW1lcl9oZWFwX3QpICsgCisgICAgICAgICAgIC8qIHNpemUgb2YgZWFjaCBlbnRyeTogKi8KKyAgICAgICAgICAgKGNvdW50KzIpICogKHNpemVvZihwal90aW1lcl9lbnRyeSopK3NpemVvZihwal90aW1lcl9pZF90KSkgKworICAgICAgICAgICAvKiBsb2NrLCBwb29sIGV0YzogKi8KKyAgICAgICAgICAgMTMyOworfQorCisvKgorICogQ3JlYXRlIGEgbmV3IHRpbWVyIGhlYXAuCisgKi8KK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGltZXJfaGVhcF9jcmVhdGUoIHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkJICBwal9zaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3RpbWVyX2hlYXBfdCAqKnBfaGVhcCkKK3sKKyAgICBwal90aW1lcl9oZWFwX3QgKmh0OworICAgIHBqX3NpemVfdCBpOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIHBfaGVhcCwgUEpfRUlOVkFMKTsKKworICAgICpwX2hlYXAgPSBOVUxMOworCisgICAgLyogTWFnaWM/ICovCisgICAgc2l6ZSArPSAyOworCisgICAgLyogQWxsb2NhdGUgdGltZXIgaGVhcCBkYXRhIHN0cnVjdHVyZSBmcm9tIHRoZSBwb29sICovCisgICAgaHQgPSBQSl9QT09MX0FMTE9DX1QocG9vbCwgcGpfdGltZXJfaGVhcF90KTsKKyAgICBpZiAoIWh0KQorICAgICAgICByZXR1cm4gUEpfRU5PTUVNOworCisgICAgLyogSW5pdGlhbGl6ZSB0aW1lciBoZWFwIHNpemVzICovCisgICAgaHQtPm1heF9zaXplID0gc2l6ZTsKKyAgICBodC0+Y3VyX3NpemUgPSAwOworICAgIGh0LT5tYXhfZW50cmllc19wZXJfcG9sbCA9IERFRkFVTFRfTUFYX1RJTUVEX09VVF9QRVJfUE9MTDsKKyAgICBodC0+dGltZXJfaWRzX2ZyZWVsaXN0ID0gMTsKKyAgICBodC0+cG9vbCA9IHBvb2w7CisKKyAgICAvKiBMb2NrLiAqLworICAgIGh0LT5sb2NrID0gTlVMTDsKKyAgICBodC0+YXV0b19kZWxldGVfbG9jayA9IDA7CisKKyAgICAvLyBDcmVhdGUgdGhlIGhlYXAgYXJyYXkuCisgICAgaHQtPmhlYXAgPSAocGpfdGltZXJfZW50cnkqKikKKyAgICAJICAgICAgIHBqX3Bvb2xfYWxsb2MocG9vbCwgc2l6ZW9mKHBqX3RpbWVyX2VudHJ5KikgKiBzaXplKTsKKyAgICBpZiAoIWh0LT5oZWFwKQorICAgICAgICByZXR1cm4gUEpfRU5PTUVNOworCisgICAgLy8gQ3JlYXRlIHRoZSBwYXJhbGxlbAorICAgIGh0LT50aW1lcl9pZHMgPSAocGpfdGltZXJfaWRfdCAqKQorICAgIAkJICAgIHBqX3Bvb2xfYWxsb2MoIHBvb2wsIHNpemVvZihwal90aW1lcl9pZF90KSAqIHNpemUpOworICAgIGlmICghaHQtPnRpbWVyX2lkcykKKyAgICAgICAgcmV0dXJuIFBKX0VOT01FTTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlICJmcmVlbGlzdCwiIHdoaWNoIHVzZXMgbmVnYXRpdmUgdmFsdWVzIHRvCisgICAgLy8gZGlzdGluZ3Vpc2ggZnJlZWxpc3QgZWxlbWVudHMgZnJvbSAicG9pbnRlcnMiIGludG8gdGhlIDxoZWFwXz4KKyAgICAvLyBhcnJheS4KKyAgICBmb3IgKGk9MDsgaTxzaXplOyArK2kpCisJaHQtPnRpbWVyX2lkc1tpXSA9IC0oKHBqX3RpbWVyX2lkX3QpIChpICsgMSkpOworCisgICAgKnBfaGVhcCA9IGh0OworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYodm9pZCkgcGpfdGltZXJfaGVhcF9kZXN0cm95KCBwal90aW1lcl9oZWFwX3QgKmh0ICkKK3sKKyAgICBpZiAoaHQtPmxvY2sgJiYgaHQtPmF1dG9fZGVsZXRlX2xvY2spIHsKKyAgICAgICAgcGpfbG9ja19kZXN0cm95KGh0LT5sb2NrKTsKKyAgICAgICAgaHQtPmxvY2sgPSBOVUxMOworICAgIH0KK30KKworUEpfREVGKHZvaWQpIHBqX3RpbWVyX2hlYXBfc2V0X2xvY2soICBwal90aW1lcl9oZWFwX3QgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9sb2NrX3QgKmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2Jvb2xfdCBhdXRvX2RlbCApCit7CisgICAgaWYgKGh0LT5sb2NrICYmIGh0LT5hdXRvX2RlbGV0ZV9sb2NrKQorICAgICAgICBwal9sb2NrX2Rlc3Ryb3koaHQtPmxvY2spOworCisgICAgaHQtPmxvY2sgPSBsb2NrOworICAgIGh0LT5hdXRvX2RlbGV0ZV9sb2NrID0gYXV0b19kZWw7Cit9CisKKworUEpfREVGKHVuc2lnbmVkKSBwal90aW1lcl9oZWFwX3NldF9tYXhfdGltZWRfb3V0X3Blcl9wb2xsKHBqX3RpbWVyX2hlYXBfdCAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY291bnQgKQoreworICAgIHVuc2lnbmVkIG9sZF9jb3VudCA9IGh0LT5tYXhfZW50cmllc19wZXJfcG9sbDsKKyAgICBodC0+bWF4X2VudHJpZXNfcGVyX3BvbGwgPSBjb3VudDsKKyAgICByZXR1cm4gb2xkX2NvdW50OworfQorCitQSl9ERUYocGpfdGltZXJfZW50cnkqKSBwal90aW1lcl9lbnRyeV9pbml0KCBwal90aW1lcl9lbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal90aW1lcl9oZWFwX2NhbGxiYWNrICpjYiApCit7CisgICAgcGpfYXNzZXJ0KGVudHJ5ICYmIGNiKTsKKworICAgIGVudHJ5LT5fdGltZXJfaWQgPSAtMTsKKyAgICBlbnRyeS0+aWQgPSBpZDsKKyAgICBlbnRyeS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICAgIGVudHJ5LT5jYiA9IGNiOworICAgIGVudHJ5LT5fZ3JwX2xvY2sgPSBOVUxMOworCisgICAgcmV0dXJuIGVudHJ5OworfQorCisjaWYgUEpfVElNRVJfREVCVUcKK3N0YXRpYyBwal9zdGF0dXNfdCBzY2hlZHVsZV93X2dycF9sb2NrX2RiZyhwal90aW1lcl9oZWFwX3QgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3RpbWVyX2VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwal90aW1lX3ZhbCAqZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfYm9vbF90IHNldF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWRfdmFsLAorCQkJCQkgICBwal9ncnBfbG9ja190ICpncnBfbG9jaywKKwkJCQkJICAgY29uc3QgY2hhciAqc3JjX2ZpbGUsCisJCQkJCSAgIGludCBzcmNfbGluZSkKKyNlbHNlCitzdGF0aWMgcGpfc3RhdHVzX3Qgc2NoZWR1bGVfd19ncnBfbG9jayhwal90aW1lcl9oZWFwX3QgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdGltZXJfZW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfdGltZV92YWwgKmRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfYm9vbF90IHNldF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9ncnBfbG9ja190ICpncnBfbG9jaykKKyNlbmRpZgoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBwal90aW1lX3ZhbCBleHBpcmVzOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihodCAmJiBlbnRyeSAmJiBkZWxheSwgUEpfRUlOVkFMKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGVudHJ5LT5jYiAhPSBOVUxMLCBQSl9FSU5WQUwpOworCisgICAgLyogUHJldmVudCBzYW1lIGVudHJ5IGZyb20gYmVpbmcgc2NoZWR1bGVkIG1vcmUgdGhhbiBvbmNlICovCisgICAgUEpfQVNTRVJUX1JFVFVSTihlbnRyeS0+X3RpbWVyX2lkIDwgMSwgUEpfRUlOVkFMSURPUCk7CisKKyNpZiBQSl9USU1FUl9ERUJVRworICAgIGVudHJ5LT5zcmNfZmlsZSA9IHNyY19maWxlOworICAgIGVudHJ5LT5zcmNfbGluZSA9IHNyY19saW5lOworI2VuZGlmCisgICAgcGpfZ2V0dGlja2NvdW50KCZleHBpcmVzKTsKKyAgICBQSl9USU1FX1ZBTF9BREQoZXhwaXJlcywgKmRlbGF5KTsKKyAgICAKKyAgICBsb2NrX3RpbWVyX2hlYXAoaHQpOworICAgIHN0YXR1cyA9IHNjaGVkdWxlX2VudHJ5KGh0LCBlbnRyeSwgJmV4cGlyZXMpOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCWlmIChzZXRfaWQpCisJICAgIGVudHJ5LT5pZCA9IGlkX3ZhbDsKKwllbnRyeS0+X2dycF9sb2NrID0gZ3JwX2xvY2s7CisJaWYgKGVudHJ5LT5fZ3JwX2xvY2spIHsKKwkgICAgcGpfZ3JwX2xvY2tfYWRkX3JlZihlbnRyeS0+X2dycF9sb2NrKTsKKwl9CisgICAgfQorICAgIHVubG9ja190aW1lcl9oZWFwKGh0KTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworI2lmIFBKX1RJTUVSX0RFQlVHCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVyX2hlYXBfc2NoZWR1bGVfZGJnKCBwal90aW1lcl9oZWFwX3QgKmh0LAorCQkJCQkJcGpfdGltZXJfZW50cnkgKmVudHJ5LAorCQkJCQkJY29uc3QgcGpfdGltZV92YWwgKmRlbGF5LAorCQkJCQkJY29uc3QgY2hhciAqc3JjX2ZpbGUsCisJCQkJCQlpbnQgc3JjX2xpbmUpCit7CisgICAgcmV0dXJuIHNjaGVkdWxlX3dfZ3JwX2xvY2tfZGJnKGh0LCBlbnRyeSwgZGVsYXksIFBKX0ZBTFNFLCAxLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZmlsZSwgc3JjX2xpbmUpOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVyX2hlYXBfc2NoZWR1bGVfd19ncnBfbG9ja19kYmcoCisJCQkJCQlwal90aW1lcl9oZWFwX3QgKmh0LAorCQkJCQkJcGpfdGltZXJfZW50cnkgKmVudHJ5LAorCQkJCQkJY29uc3QgcGpfdGltZV92YWwgKmRlbGF5LAorCQkJCQkJaW50IGlkX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2dycF9sb2NrX3QgKmdycF9sb2NrLAorCQkJCQkJY29uc3QgY2hhciAqc3JjX2ZpbGUsCisJCQkJCQlpbnQgc3JjX2xpbmUpCit7CisgICAgcmV0dXJuIHNjaGVkdWxlX3dfZ3JwX2xvY2tfZGJnKGh0LCBlbnRyeSwgZGVsYXksIFBKX1RSVUUsIGlkX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwX2xvY2ssIHNyY19maWxlLCBzcmNfbGluZSk7Cit9CisKKyNlbHNlCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVyX2hlYXBfc2NoZWR1bGUoIHBqX3RpbWVyX2hlYXBfdCAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3RpbWVyX2VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfdGltZV92YWwgKmRlbGF5KQoreworICAgIHJldHVybiBzY2hlZHVsZV93X2dycF9sb2NrKGh0LCBlbnRyeSwgZGVsYXksIFBKX0ZBTFNFLCAxLCBOVUxMKTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal90aW1lcl9oZWFwX3NjaGVkdWxlX3dfZ3JwX2xvY2socGpfdGltZXJfaGVhcF90ICpodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3RpbWVyX2VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBqX3RpbWVfdmFsICpkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9ncnBfbG9ja190ICpncnBfbG9jaykKK3sKKyAgICByZXR1cm4gc2NoZWR1bGVfd19ncnBfbG9jayhodCwgZW50cnksIGRlbGF5LCBQSl9UUlVFLCBpZF92YWwsIGdycF9sb2NrKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNhbmNlbF90aW1lcihwal90aW1lcl9oZWFwX3QgKmh0LAorCQkJcGpfdGltZXJfZW50cnkgKmVudHJ5LAorCQkJdW5zaWduZWQgZmxhZ3MsCisJCQlpbnQgaWRfdmFsKQoreworICAgIGludCBjb3VudDsKKworICAgIFBKX0FTU0VSVF9SRVRVUk4oaHQgJiYgZW50cnksIFBKX0VJTlZBTCk7CisKKyAgICBsb2NrX3RpbWVyX2hlYXAoaHQpOworICAgIGNvdW50ID0gY2FuY2VsKGh0LCBlbnRyeSwgZmxhZ3MgfCBGX0RPTlRfQ0FMTCk7CisgICAgaWYgKGZsYWdzICYgRl9TRVRfSUQpIHsKKwllbnRyeS0+aWQgPSBpZF92YWw7CisgICAgfQorICAgIGlmIChlbnRyeS0+X2dycF9sb2NrKSB7CisJcGpfZ3JwX2xvY2tfdCAqZ3JwX2xvY2sgPSBlbnRyeS0+X2dycF9sb2NrOworCWVudHJ5LT5fZ3JwX2xvY2sgPSBOVUxMOworCXBqX2dycF9sb2NrX2RlY19yZWYoZ3JwX2xvY2spOworICAgIH0KKyAgICB1bmxvY2tfdGltZXJfaGVhcChodCk7CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK1BKX0RFRihpbnQpIHBqX3RpbWVyX2hlYXBfY2FuY2VsKCBwal90aW1lcl9oZWFwX3QgKmh0LAorCQkJCSAgcGpfdGltZXJfZW50cnkgKmVudHJ5KQoreworICAgIHJldHVybiBjYW5jZWxfdGltZXIoaHQsIGVudHJ5LCAwLCAwKTsKK30KKworUEpfREVGKGludCkgcGpfdGltZXJfaGVhcF9jYW5jZWxfaWZfYWN0aXZlKHBqX3RpbWVyX2hlYXBfdCAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdGltZXJfZW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZF92YWwpCit7CisgICAgcmV0dXJuIGNhbmNlbF90aW1lcihodCwgZW50cnksIEZfU0VUX0lEIHwgRl9ET05UX0FTU0VSVCwgaWRfdmFsKTsKK30KKworUEpfREVGKHVuc2lnbmVkKSBwal90aW1lcl9oZWFwX3BvbGwoIHBqX3RpbWVyX2hlYXBfdCAqaHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3RpbWVfdmFsICpuZXh0X2RlbGF5ICkKK3sKKyAgICBwal90aW1lX3ZhbCBub3c7CisgICAgdW5zaWduZWQgY291bnQ7CisKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGh0LCAwKTsKKworICAgIGxvY2tfdGltZXJfaGVhcChodCk7CisgICAgaWYgKCFodC0+Y3VyX3NpemUgJiYgbmV4dF9kZWxheSkgeworCW5leHRfZGVsYXktPnNlYyA9IG5leHRfZGVsYXktPm1zZWMgPSBQSl9NQVhJTlQzMjsKKyAgICAgICAgdW5sb2NrX3RpbWVyX2hlYXAoaHQpOworCXJldHVybiAwOworICAgIH0KKworICAgIGNvdW50ID0gMDsKKyAgICBwal9nZXR0aWNrY291bnQoJm5vdyk7CisKKyAgICB3aGlsZSAoIGh0LT5jdXJfc2l6ZSAmJiAKKwkgICAgUEpfVElNRV9WQUxfTFRFKGh0LT5oZWFwWzBdLT5fdGltZXJfdmFsdWUsIG5vdykgJiYKKyAgICAgICAgICAgIGNvdW50IDwgaHQtPm1heF9lbnRyaWVzX3Blcl9wb2xsICkgCisgICAgeworCXBqX3RpbWVyX2VudHJ5ICpub2RlID0gcmVtb3ZlX25vZGUoaHQsIDApOworCXBqX2dycF9sb2NrX3QgKmdycF9sb2NrOworCisJKytjb3VudDsKKworCWdycF9sb2NrID0gbm9kZS0+X2dycF9sb2NrOworCW5vZGUtPl9ncnBfbG9jayA9IE5VTEw7CisKKwl1bmxvY2tfdGltZXJfaGVhcChodCk7CisKKwlQSl9SQUNFX01FKDUpOworCisJaWYgKG5vZGUtPmNiKQorCSAgICAoKm5vZGUtPmNiKShodCwgbm9kZSk7CisKKwlpZiAoZ3JwX2xvY2spCisJICAgIHBqX2dycF9sb2NrX2RlY19yZWYoZ3JwX2xvY2spOworCisJbG9ja190aW1lcl9oZWFwKGh0KTsKKyAgICB9CisgICAgaWYgKGh0LT5jdXJfc2l6ZSAmJiBuZXh0X2RlbGF5KSB7CisJKm5leHRfZGVsYXkgPSBodC0+aGVhcFswXS0+X3RpbWVyX3ZhbHVlOworCVBKX1RJTUVfVkFMX1NVQigqbmV4dF9kZWxheSwgbm93KTsKKwlpZiAobmV4dF9kZWxheS0+c2VjIDwgMCB8fCBuZXh0X2RlbGF5LT5tc2VjIDwgMCkKKwkgICAgbmV4dF9kZWxheS0+c2VjID0gbmV4dF9kZWxheS0+bXNlYyA9IDA7CisgICAgfSBlbHNlIGlmIChuZXh0X2RlbGF5KSB7CisJbmV4dF9kZWxheS0+c2VjID0gbmV4dF9kZWxheS0+bXNlYyA9IFBKX01BWElOVDMyOworICAgIH0KKyAgICB1bmxvY2tfdGltZXJfaGVhcChodCk7CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK1BKX0RFRihwal9zaXplX3QpIHBqX3RpbWVyX2hlYXBfY291bnQoIHBqX3RpbWVyX2hlYXBfdCAqaHQgKQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oaHQsIDApOworCisgICAgcmV0dXJuIGh0LT5jdXJfc2l6ZTsKK30KKworUEpfREVGKHBqX3N0YXR1c190KSBwal90aW1lcl9oZWFwX2VhcmxpZXN0X3RpbWUoIHBqX3RpbWVyX2hlYXBfdCAqIGh0LAorCQkJCQkgICAgICAgICBwal90aW1lX3ZhbCAqdGltZXZhbCkKK3sKKyAgICBwal9hc3NlcnQoaHQtPmN1cl9zaXplICE9IDApOworICAgIGlmIChodC0+Y3VyX3NpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIFBKX0VOT1RGT1VORDsKKworICAgIGxvY2tfdGltZXJfaGVhcChodCk7CisgICAgKnRpbWV2YWwgPSBodC0+aGVhcFswXS0+X3RpbWVyX3ZhbHVlOworICAgIHVubG9ja190aW1lcl9oZWFwKGh0KTsKKworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisjaWYgUEpfVElNRVJfREVCVUcKK1BKX0RFRih2b2lkKSBwal90aW1lcl9oZWFwX2R1bXAocGpfdGltZXJfaGVhcF90ICpodCkKK3sKKyAgICBsb2NrX3RpbWVyX2hlYXAoaHQpOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIkR1bXBpbmcgdGltZXIgaGVhcDoiKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgQ3VyIHNpemU6ICVkIGVudHJpZXMsIG1heDogJWQiLAorCQkJIChpbnQpaHQtPmN1cl9zaXplLCAoaW50KWh0LT5tYXhfc2l6ZSkpOworCisgICAgaWYgKGh0LT5jdXJfc2l6ZSkgeworCXVuc2lnbmVkIGk7CisJcGpfdGltZV92YWwgbm93OworCisJUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgRW50cmllczogIikpOworCVBKX0xPRygzLChUSElTX0ZJTEUsICIgICAgX2lkXHRJZFx0RWxhcHNlZFx0U291cmNlIikpOworCVBKX0xPRygzLChUSElTX0ZJTEUsICIgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpKTsKKworCXBqX2dldHRpY2tjb3VudCgmbm93KTsKKworCWZvciAoaT0wOyBpPCh1bnNpZ25lZClodC0+Y3VyX3NpemU7ICsraSkgeworCSAgICBwal90aW1lcl9lbnRyeSAqZSA9IGh0LT5oZWFwW2ldOworCSAgICBwal90aW1lX3ZhbCBkZWx0YTsKKworCSAgICBpZiAoUEpfVElNRV9WQUxfTFRFKGUtPl90aW1lcl92YWx1ZSwgbm93KSkKKwkJZGVsdGEuc2VjID0gZGVsdGEubXNlYyA9IDA7CisJICAgIGVsc2UgeworCQlkZWx0YSA9IGUtPl90aW1lcl92YWx1ZTsKKwkJUEpfVElNRV9WQUxfU1VCKGRlbHRhLCBub3cpOworCSAgICB9CisKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgICAlZFx0JWRcdCVkLiUwM2RcdCVzOiVkIiwKKwkJICAgICAgZS0+X3RpbWVyX2lkLCBlLT5pZCwKKwkJICAgICAgKGludClkZWx0YS5zZWMsIChpbnQpZGVsdGEubXNlYywKKwkJICAgICAgZS0+c3JjX2ZpbGUsIGUtPnNyY19saW5lKSk7CisJfQorICAgIH0KKworICAgIHVubG9ja190aW1lcl9oZWFwKGh0KTsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3RpbWVyX3N5bWJpYW4uY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai90aW1lcl9zeW1iaWFuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjE4NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai90aW1lcl9zeW1iaWFuLmNwcApAQCAtMCwwICsxLDQ3NSBAQAorLyogJElkOiB0aW1lcl9zeW1iaWFuLmNwcCA0Mzc0IDIwMTMtMDItMjcgMDc6MTU6NTdaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai90aW1lci5oPgorI2luY2x1ZGUgPHBqL3Bvb2wuaD4KKyNpbmNsdWRlIDxwai9hc3NlcnQuaD4KKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL2xvY2suaD4KKworI2luY2x1ZGUgIm9zX3N5bWJpYW4uaCIKKworCisjZGVmaW5lIERFRkFVTFRfTUFYX1RJTUVEX09VVF9QRVJfUE9MTCAgKDY0KQorCisvLyBNYXhpbXVtIG51bWJlciBvZiBtaWxpc2Vjb25kcyB0aGF0IFJUaW1lci5BdCgpIHN1cHBvcnRzCisjZGVmaW5lIE1BWF9SVElNRVJfSU5URVJWQUwJCTIxNDcKKworLyogQWJzb2x1dGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXIgZW50cmllcyAqLworI2lmbmRlZiBQSl9TWU1CSUFOX1RJTUVSX01BWF9DT1VOVAorIyAgZGVmaW5lIFBKX1NZTUJJQU5fVElNRVJfTUFYX0NPVU5UCTY1NTM1CisjZW5kaWYKKworLyogR2V0IHRoZSBudW1iZXIgb2YgZnJlZSBzbG90cyBpbiB0aGUgdGltZXIgaGVhcCAqLworI2RlZmluZSBGUkVFQ05UKHRoKQkodGgtPm1heF9zaXplIC0gdGgtPmN1cl9zaXplKQorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uCitjbGFzcyBDUGpUaW1lckVudHJ5OworCisvKioKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aW1lciBoZWFwLgorICovCitzdHJ1Y3QgcGpfdGltZXJfaGVhcF90Cit7CisgICAgLyoqIE1heGltdW0gc2l6ZSBvZiB0aGUgaGVhcC4gKi8KKyAgICBwal9zaXplX3QgbWF4X3NpemU7CisKKyAgICAvKiogQ3VycmVudCBzaXplIG9mIHRoZSBoZWFwLiAqLworICAgIHBqX3NpemVfdCBjdXJfc2l6ZTsKKworICAgIC8qKiBBcnJheSBvZiB0aW1lciBlbnRyaWVzLiBBIHNjaGVkdWxlZCB0aW1lciB3aWxsIG9jY3VweSBvbmUgc2xvdCwgYW5kCisgICAgICogIHRoZSBzbG90IG51bWJlciB3aWxsIGJlIHNhdmVkIGluIGVudHJ5LT5fdGltZXJfaWQKKyAgICAgKi8KKyAgICBDUGpUaW1lckVudHJ5ICoqZW50cmllczsKKyAgICAKKyAgICAvKiogQXJyYXkgb2YgZnJlZSBzbG90IGluZGV4ZXMgaW4gdGhlICJlbnRyaWVzIiBhcnJheSAqLworICAgIGludCAqZnJlZV9zbG90czsKK307CisKKy8qKgorICogQWN0aXZlIG9iamVjdCBmb3IgZWFjaCB0aW1lciBlbnRyeS4KKyAqLworY2xhc3MgQ1BqVGltZXJFbnRyeSA6IHB1YmxpYyBDQWN0aXZlIAoreworcHVibGljOgorICAgIHBqX3RpbWVyX2VudHJ5ICAqZW50cnlfOworICAgIAorICAgIHN0YXRpYyBDUGpUaW1lckVudHJ5KiBOZXdMKAlwal90aW1lcl9oZWFwX3QgKnRpbWVyX2hlYXAsCisgICAgCQkJCXBqX3RpbWVyX2VudHJ5ICplbnRyeSwKKyAgICAJCQkJY29uc3QgcGpfdGltZV92YWwgKmRlbGF5KTsKKyAgICAKKyAgICB+Q1BqVGltZXJFbnRyeSgpOworICAgIAorICAgIHZpcnR1YWwgdm9pZCBSdW5MKCk7CisgICAgdmlydHVhbCB2b2lkIERvQ2FuY2VsKCk7CisKK3ByaXZhdGU6CQorICAgIHBqX3RpbWVyX2hlYXBfdCAqdGltZXJfaGVhcF87CisgICAgUlRpbWVyCSAgICAgcnRpbWVyXzsKKyAgICBwal91aW50MzJfdAkgICAgIGludGVydmFsX2xlZnRfOworICAgIAorICAgIENQalRpbWVyRW50cnkocGpfdGltZXJfaGVhcF90ICp0aW1lcl9oZWFwLCBwal90aW1lcl9lbnRyeSAqZW50cnkpOworICAgIHZvaWQgQ29uc3RydWN0TChjb25zdCBwal90aW1lX3ZhbCAqZGVsYXkpOworICAgIHZvaWQgU2NoZWR1bGUoKTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoKKyAqIEltcGxlbWVudGF0aW9uLgorICovCisKKy8qIEdyb3cgdGltZXIgaGVhcCB0byB0aGUgc3BlY2lmaWVkIHNpemUgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCByZWFsbG9jX3RpbWVyX2hlYXAocGpfdGltZXJfaGVhcF90ICp0aCwgcGpfc2l6ZV90IG5ld19zaXplKQoreworICAgIHR5cGVkZWYgQ1BqVGltZXJFbnRyeSAqZW50cnlfcHRyOworICAgIENQalRpbWVyRW50cnkgKiplbnRyaWVzID0gTlVMTDsKKyAgICBpbnQgKmZyZWVfc2xvdHMgPSBOVUxMOworICAgIHVuc2lnbmVkIGksIGo7CisgCisgICAgaWYgKG5ld19zaXplID4gUEpfU1lNQklBTl9USU1FUl9NQVhfQ09VTlQpIHsKKwkvKiBKdXN0IHNvbWUgc2FuaXR5IGxpbWl0ICovCisJbmV3X3NpemUgPSBQSl9TWU1CSUFOX1RJTUVSX01BWF9DT1VOVDsKKwlpZiAobmV3X3NpemUgPD0gdGgtPm1heF9zaXplKSB7CisJICAgIC8qIFdlJ3ZlIGdyb3duIGxhcmdlIGVub3VnaCAqLworCSAgICBwal9hc3NlcnQoISJUb28gbWFueSB0aW1lciBoZWFwIGVudHJpZXMiKTsKKwkgICAgcmV0dXJuIFBKX0VUT09NQU5ZOworCX0KKyAgICB9CisgICAgCisgICAgLyogQWxsb2NhdGUgZW50cmllcywgbW92ZSBlbnRyaWVzIGZyb20gdGhlIG9sZCBhcnJheSBpZiB0aGVyZSBpcyBvbmUgKi8KKyAgICBlbnRyaWVzID0gbmV3IGVudHJ5X3B0cltuZXdfc2l6ZV07CisgICAgaWYgKHRoLT5lbnRyaWVzKSB7CisJcGpfbWVtY3B5KGVudHJpZXMsIHRoLT5lbnRyaWVzLCB0aC0+bWF4X3NpemUgKiBzaXplb2YodGgtPmVudHJpZXNbMF0pKTsKKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgcmVtYWluaW5nIG5ldyBhcmVhICovCisgICAgcGpfYnplcm8oJmVudHJpZXNbdGgtPm1heF9zaXplXSwgCisJICAgIChuZXdfc2l6ZSAtIHRoLT5tYXhfc2l6ZSkgKiBzaXplb2YodGgtPmVudHJpZXNbMF0pKTsKKyAgICAKKyAgICAvKiBBbGxvY2F0ZSBmcmVlIHNsb3RzIGFycmF5ICovCisgICAgZnJlZV9zbG90cyA9IG5ldyBpbnRbbmV3X3NpemVdOworICAgIGlmICh0aC0+ZnJlZV9zbG90cykgeworCXBqX21lbWNweShmcmVlX3Nsb3RzLCB0aC0+ZnJlZV9zbG90cywgCisJCSAgRlJFRUNOVCh0aCkgKiBzaXplb2YodGgtPmZyZWVfc2xvdHNbMF0pKTsKKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgcmVtYWluaW5nIG5ldyBhcmVhICovCisgICAgZm9yIChpPUZSRUVDTlQodGgpLCBqPXRoLT5tYXhfc2l6ZTsgajxuZXdfc2l6ZTsgKytpLCArK2opIHsKKwlmcmVlX3Nsb3RzW2ldID0gajsKKyAgICB9CisgICAgZm9yICggOyBpPG5ld19zaXplOyArK2kpIHsKKwlmcmVlX3Nsb3RzW2ldID0gLTE7CisgICAgfQorICAgIAorICAgIC8qIEFwcGx5ICovCisgICAgZGVsZXRlIFtdIHRoLT5lbnRyaWVzOworICAgIHRoLT5lbnRyaWVzID0gZW50cmllczsKKyAgICB0aC0+bWF4X3NpemUgPSBuZXdfc2l6ZTsKKyAgICBkZWxldGUgW10gdGgtPmZyZWVfc2xvdHM7CisgICAgdGgtPmZyZWVfc2xvdHMgPSBmcmVlX3Nsb3RzOworCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEFsbG9jYXRlIGFuZCByZWdpc3RlciBhbiBlbnRyeSB0byB0aW1lciBoZWFwIGZvciBuZXdseSBzY2hlZHVsZWQgZW50cnkgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCBhZGRfZW50cnkocGpfdGltZXJfaGVhcF90ICp0aCwgQ1BqVGltZXJFbnRyeSAqZW50cnkpCit7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCBzbG90OworICAgIAorICAgIC8qIENoZWNrIHRoYXQgdGhlcmUncyBzdGlsbCBjYXBhY2l0eSBsZWZ0IGluIHRoZSB0aW1lciBoZWFwICovCisgICAgaWYgKEZSRUVDTlQodGgpIDwgMSkgeworCS8vIEdyb3cgdGhlIHRpbWVyIGhlYXAgdHdpY2UgdGhlIGNhcGFjaXR5CisJc3RhdHVzID0gcmVhbGxvY190aW1lcl9oZWFwKHRoLCB0aC0+bWF4X3NpemUgKiAyKTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIAorICAgIC8qIEFsbG9jYXRlIG9uZSBmcmVlIHNsb3QuIFVzZSBMSUZPICovCisgICAgc2xvdCA9IHRoLT5mcmVlX3Nsb3RzW0ZSRUVDTlQodGgpLTFdOworICAgIFBKX0FTU0VSVF9SRVRVUk4oKHNsb3QgPj0gMCkgJiYgKHNsb3QgPCAoaW50KXRoLT5tYXhfc2l6ZSkgJiYgCisJCSAgICAgKHRoLT5lbnRyaWVzW3Nsb3RdPT1OVUxMKSwgUEpfRUJVRyk7CisgICAgCisgICAgdGgtPmZyZWVfc2xvdHNbRlJFRUNOVCh0aCktMV0gPSAtMTsKKyAgICB0aC0+ZW50cmllc1tzbG90XSA9IGVudHJ5OworICAgIGVudHJ5LT5lbnRyeV8tPl90aW1lcl9pZCA9IHNsb3Q7CisgICAgKyt0aC0+Y3VyX3NpemU7CisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKy8qIEZyZWUgYSBzbG90IHdoZW4gYW4gZW50cnkncyB0aW1lciBoYXMgZWxhcHNlZCBvciBjYW5jZWwgKi8KK3N0YXRpYyBwal9zdGF0dXNfdCByZW1vdmVfZW50cnkocGpfdGltZXJfaGVhcF90ICp0aCwgQ1BqVGltZXJFbnRyeSAqZW50cnkpCit7CisgICAgaW50IHNsb3QgPSBlbnRyeS0+ZW50cnlfLT5fdGltZXJfaWQ7CisgICAgCisgICAgUEpfQVNTRVJUX1JFVFVSTihzbG90ID49IDAgJiYgc2xvdCA8IChpbnQpdGgtPm1heF9zaXplLCBQSl9FQlVHKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKEZSRUVDTlQodGgpIDwgdGgtPm1heF9zaXplLCBQSl9FQlVHKTsKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHRoLT5lbnRyaWVzW3Nsb3RdPT1lbnRyeSwgUEpfRUJVRyk7CisgICAgUEpfQVNTRVJUX1JFVFVSTih0aC0+ZnJlZV9zbG90c1tGUkVFQ05UKHRoKV09PS0xLCBQSl9FQlVHKTsKKyAgICAKKyAgICB0aC0+ZW50cmllc1tzbG90XSA9IE5VTEw7CisgICAgdGgtPmZyZWVfc2xvdHNbRlJFRUNOVCh0aCldID0gc2xvdDsKKyAgICBlbnRyeS0+ZW50cnlfLT5fdGltZXJfaWQgPSAtMTsKKyAgICAtLXRoLT5jdXJfc2l6ZTsKKyAgICAKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitDUGpUaW1lckVudHJ5OjpDUGpUaW1lckVudHJ5KHBqX3RpbWVyX2hlYXBfdCAqdGltZXJfaGVhcCwKKwkJCSAgICAgcGpfdGltZXJfZW50cnkgKmVudHJ5KQorOiBDQWN0aXZlKFBKX1NZTUJJQU5fVElNRVJfUFJJT1JJVFkpLCBlbnRyeV8oZW50cnkpLCB0aW1lcl9oZWFwXyh0aW1lcl9oZWFwKSwgCisgIGludGVydmFsX2xlZnRfKDApCit7Cit9CisKK0NQalRpbWVyRW50cnk6On5DUGpUaW1lckVudHJ5KCkgCit7CisgICAgQ2FuY2VsKCk7CisgICAgcnRpbWVyXy5DbG9zZSgpOworfQorCit2b2lkIENQalRpbWVyRW50cnk6OlNjaGVkdWxlKCkKK3sKKyAgICBwal9pbnQzMl90IGludGVydmFsOworICAgIAorICAgIGlmIChpbnRlcnZhbF9sZWZ0XyA+IE1BWF9SVElNRVJfSU5URVJWQUwpIHsKKwlpbnRlcnZhbCA9IE1BWF9SVElNRVJfSU5URVJWQUw7CisgICAgfSBlbHNlIHsKKwlpbnRlcnZhbCA9IGludGVydmFsX2xlZnRfOworICAgIH0KKyAgICAKKyAgICBpbnRlcnZhbF9sZWZ0XyAtPSBpbnRlcnZhbDsKKyAgICBydGltZXJfLkFmdGVyKGlTdGF0dXMsIGludGVydmFsICogMTAwMCk7CisgICAgU2V0QWN0aXZlKCk7Cit9CisKK3ZvaWQgQ1BqVGltZXJFbnRyeTo6Q29uc3RydWN0TChjb25zdCBwal90aW1lX3ZhbCAqZGVsYXkpIAoreworICAgIHJ0aW1lcl8uQ3JlYXRlTG9jYWwoKTsKKyAgICBDQWN0aXZlU2NoZWR1bGVyOjpBZGQodGhpcyk7CisgICAgCisgICAgaW50ZXJ2YWxfbGVmdF8gPSBQSl9USU1FX1ZBTF9NU0VDKCpkZWxheSk7CisgICAgU2NoZWR1bGUoKTsKK30KKworQ1BqVGltZXJFbnRyeSogQ1BqVGltZXJFbnRyeTo6TmV3TChwal90aW1lcl9oZWFwX3QgKnRpbWVyX2hlYXAsCisJCQkJICAgcGpfdGltZXJfZW50cnkgKmVudHJ5LAorCQkJCSAgIGNvbnN0IHBqX3RpbWVfdmFsICpkZWxheSkgCit7CisgICAgQ1BqVGltZXJFbnRyeSAqc2VsZiA9IG5ldyBDUGpUaW1lckVudHJ5KHRpbWVyX2hlYXAsIGVudHJ5KTsKKyAgICBDbGVhbnVwU3RhY2s6OlB1c2hMKHNlbGYpOworICAgIHNlbGYtPkNvbnN0cnVjdEwoZGVsYXkpOworICAgIENsZWFudXBTdGFjazo6UG9wKHNlbGYpOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKK3ZvaWQgQ1BqVGltZXJFbnRyeTo6UnVuTCgpIAoreworICAgIGlmIChpbnRlcnZhbF9sZWZ0XyA+IDApIHsKKwlTY2hlZHVsZSgpOworCXJldHVybjsKKyAgICB9CisgICAgCisgICAgcmVtb3ZlX2VudHJ5KHRpbWVyX2hlYXBfLCB0aGlzKTsKKyAgICBlbnRyeV8tPmNiKHRpbWVyX2hlYXBfLCBlbnRyeV8pOworICAgIAorICAgIC8vIEZpbmdlcidzIGNyb3NzZWQhCisgICAgZGVsZXRlIHRoaXM7Cit9CisKK3ZvaWQgQ1BqVGltZXJFbnRyeTo6RG9DYW5jZWwoKSAKK3sKKyAgICAvKiBJdCdzIHBvc3NpYmxlIHRoYXQgX3RpbWVyX2lkIGlzIC0xLCBzZWUgc2NoZWR1bGUoKS4gSW4gdGhpcyBjYXNlLAorICAgICAqIHRoZSBlbnRyeSBoYXMgbm90IGJlZW4gYWRkZWQgdG8gdGhlIHRpbWVyIGhlYXAsIHNvIGRvbid0IHJlbW92ZQorICAgICAqIGl0LgorICAgICAqLworICAgIGlmIChlbnRyeV8gJiYgZW50cnlfLT5fdGltZXJfaWQgIT0gLTEpCisJcmVtb3ZlX2VudHJ5KHRpbWVyX2hlYXBfLCB0aGlzKTsKKyAgICAKKyAgICBydGltZXJfLkNhbmNlbCgpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKy8qCisgKiBDYWxjdWxhdGUgbWVtb3J5IHNpemUgcmVxdWlyZWQgdG8gY3JlYXRlIGEgdGltZXIgaGVhcC4KKyAqLworUEpfREVGKHBqX3NpemVfdCkgcGpfdGltZXJfaGVhcF9tZW1fc2l6ZShwal9zaXplX3QgY291bnQpCit7CisgICAgcmV0dXJuIC8qIHNpemUgb2YgdGhlIHRpbWVyIGhlYXAgaXRzZWxmOiAqLworICAgICAgICAgICBzaXplb2YocGpfdGltZXJfaGVhcF90KSArIAorICAgICAgICAgICAvKiBzaXplIG9mIGVhY2ggZW50cnk6ICovCisgICAgICAgICAgIChjb3VudCsyKSAqIChzaXplb2Yodm9pZCopK3NpemVvZihpbnQpKSArCisgICAgICAgICAgIC8qIGxvY2ssIHBvb2wgZXRjOiAqLworICAgICAgICAgICAxMzI7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBuZXcgdGltZXIgaGVhcC4KKyAqLworUEpfREVGKHBqX3N0YXR1c190KSBwal90aW1lcl9oZWFwX2NyZWF0ZSggcGpfcG9vbF90ICpwb29sLAorCQkJCQkgIHBqX3NpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdGltZXJfaGVhcF90ICoqcF9oZWFwKQoreworICAgIHBqX3RpbWVyX2hlYXBfdCAqaHQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgUEpfQVNTRVJUX1JFVFVSTihwb29sICYmIHBfaGVhcCwgUEpfRUlOVkFMKTsKKworICAgICpwX2hlYXAgPSBOVUxMOworCisgICAgLyogQWxsb2NhdGUgdGltZXIgaGVhcCBkYXRhIHN0cnVjdHVyZSBmcm9tIHRoZSBwb29sICovCisgICAgaHQgPSBQSl9QT09MX1pBTExPQ19UKHBvb2wsIHBqX3RpbWVyX2hlYXBfdCk7CisgICAgaWYgKCFodCkKKyAgICAgICAgcmV0dXJuIFBKX0VOT01FTTsKKworICAgIC8qIEFsbG9jYXRlIHNsb3RzICovCisgICAgc3RhdHVzID0gcmVhbGxvY190aW1lcl9oZWFwKGh0LCBzaXplKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHN0YXR1czsKKworICAgICpwX2hlYXAgPSBodDsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworUEpfREVGKHZvaWQpIHBqX3RpbWVyX2hlYXBfZGVzdHJveSggcGpfdGltZXJfaGVhcF90ICpodCApCit7CisgICAgLyogQ2FuY2VsIGFuZCBkZWxldGUgcGVuZGluZyBhY3RpdmUgb2JqZWN0cyAqLworICAgIGlmIChodC0+ZW50cmllcykgeworCXVuc2lnbmVkIGk7CisJZm9yIChpPTA7IGk8aHQtPm1heF9zaXplOyArK2kpIHsKKwkgICAgaWYgKGh0LT5lbnRyaWVzW2ldKSB7CisJCWh0LT5lbnRyaWVzW2ldLT5lbnRyeV8gPSBOVUxMOworCQlodC0+ZW50cmllc1tpXS0+Q2FuY2VsKCk7CisJCWRlbGV0ZSBodC0+ZW50cmllc1tpXTsKKwkJaHQtPmVudHJpZXNbaV0gPSBOVUxMOworCSAgICB9CisJfQorICAgIH0KKyAgICAKKyAgICBkZWxldGUgW10gaHQtPmVudHJpZXM7CisgICAgZGVsZXRlIFtdIGh0LT5mcmVlX3Nsb3RzOworICAgIAorICAgIGh0LT5lbnRyaWVzID0gTlVMTDsKKyAgICBodC0+ZnJlZV9zbG90cyA9IE5VTEw7Cit9CisKK1BKX0RFRih2b2lkKSBwal90aW1lcl9oZWFwX3NldF9sb2NrKCAgcGpfdGltZXJfaGVhcF90ICpodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfbG9ja190ICpsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9ib29sX3QgYXV0b19kZWwgKQoreworICAgIFBKX1VOVVNFRF9BUkcoaHQpOworICAgIGlmIChhdXRvX2RlbCkKKyAgICAJcGpfbG9ja19kZXN0cm95KGxvY2spOworfQorCisKK1BKX0RFRih1bnNpZ25lZCkgcGpfdGltZXJfaGVhcF9zZXRfbWF4X3RpbWVkX291dF9wZXJfcG9sbChwal90aW1lcl9oZWFwX3QgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50ICkKK3sKKyAgICAvKiBOb3QgYXBwbGljYWJsZSAqLworICAgIFBKX1VOVVNFRF9BUkcoY291bnQpOworICAgIHJldHVybiBodC0+bWF4X3NpemU7Cit9CisKK1BKX0RFRihwal90aW1lcl9lbnRyeSopIHBqX3RpbWVyX2VudHJ5X2luaXQoIHBqX3RpbWVyX2VudHJ5ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3RpbWVyX2hlYXBfY2FsbGJhY2sgKmNiICkKK3sKKyAgICBwal9hc3NlcnQoZW50cnkgJiYgY2IpOworCisgICAgZW50cnktPl90aW1lcl9pZCA9IC0xOworICAgIGVudHJ5LT5pZCA9IGlkOworICAgIGVudHJ5LT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisgICAgZW50cnktPmNiID0gY2I7CisKKyAgICByZXR1cm4gZW50cnk7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGltZXJfaGVhcF9zY2hlZHVsZSggcGpfdGltZXJfaGVhcF90ICpodCwKKwkJCQkJICAgIHBqX3RpbWVyX2VudHJ5ICplbnRyeSwgCisJCQkJCSAgICBjb25zdCBwal90aW1lX3ZhbCAqZGVsYXkpCit7CisgICAgQ1BqVGltZXJFbnRyeSAqdGltZXJPYmo7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIAorICAgIFBKX0FTU0VSVF9SRVRVUk4oaHQgJiYgZW50cnkgJiYgZGVsYXksIFBKX0VJTlZBTCk7CisgICAgUEpfQVNTRVJUX1JFVFVSTihlbnRyeS0+Y2IgIT0gTlVMTCwgUEpfRUlOVkFMKTsKKworICAgIC8qIFByZXZlbnQgc2FtZSBlbnRyeSBmcm9tIGJlaW5nIHNjaGVkdWxlZCBtb3JlIHRoYW4gb25jZSAqLworICAgIFBKX0FTU0VSVF9SRVRVUk4oZW50cnktPl90aW1lcl9pZCA8IDEsIFBKX0VJTlZBTElET1ApOworCisgICAgZW50cnktPl90aW1lcl9pZCA9IC0xOworICAgIAorICAgIHRpbWVyT2JqID0gQ1BqVGltZXJFbnRyeTo6TmV3TChodCwgZW50cnksIGRlbGF5KTsKKyAgICBzdGF0dXMgPSBhZGRfZW50cnkoaHQsIHRpbWVyT2JqKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwl0aW1lck9iai0+Q2FuY2VsKCk7CisJZGVsZXRlIHRpbWVyT2JqOworCXJldHVybiBzdGF0dXM7CisgICAgfQorICAgIAorICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitQSl9ERUYocGpfc3RhdHVzX3QpIHBqX3RpbWVyX2hlYXBfc2NoZWR1bGVfd19ncnBfbG9jayhwal90aW1lcl9oZWFwX3QgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdGltZXJfZW50cnkgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGpfdGltZV92YWwgKmRlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2dycF9sb2NrX3QgKmdycF9sb2NrKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKwkgICAgCisgICAgUEpfVU5VU0VEX0FSRyhncnBfbG9jayk7CisKKyAgICBzdGF0dXMgPSBwal90aW1lcl9oZWFwX3NjaGVkdWxlKGh0LCBlbnRyeSwgZGVsYXkpOworICAgIAorICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKyAgICAJZW50cnktPmlkID0gaWRfdmFsOworICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1BKX0RFRihpbnQpIHBqX3RpbWVyX2hlYXBfY2FuY2VsKCBwal90aW1lcl9oZWFwX3QgKmh0LAorCQkJCSAgcGpfdGltZXJfZW50cnkgKmVudHJ5KQoreworICAgIFBKX0FTU0VSVF9SRVRVUk4oaHQgJiYgZW50cnksIFBKX0VJTlZBTCk7CisgICAgCisgICAgaWYgKGVudHJ5LT5fdGltZXJfaWQgPj0gMCAmJiBlbnRyeS0+X3RpbWVyX2lkIDwgKGludClodC0+bWF4X3NpemUpIHsKKyAgICAJQ1BqVGltZXJFbnRyeSAqdGltZXJPYmogPSBodC0+ZW50cmllc1tlbnRyeS0+X3RpbWVyX2lkXTsKKyAgICAJaWYgKHRpbWVyT2JqKSB7CisgICAgCSAgICB0aW1lck9iai0+Q2FuY2VsKCk7CisgICAgCSAgICBkZWxldGUgdGltZXJPYmo7CisgICAgCSAgICByZXR1cm4gMTsKKyAgICAJfSBlbHNlIHsKKyAgICAJICAgIHJldHVybiAwOworICAgIAl9CisgICAgfSBlbHNlIHsKKyAgICAJcmV0dXJuIDA7CisgICAgfQorfQorCitQSl9ERUYoaW50KSBwal90aW1lcl9oZWFwX2NhbmNlbF9pZl9hY3RpdmUocGpfdGltZXJfaGVhcF90ICpodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal90aW1lcl9lbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkX3ZhbCkKK3sKKyAgICBpbnQgY291bnQgPSBwal90aW1lcl9oZWFwX2NhbmNlbChodCwgZW50cnkpOworICAgIGlmIChjb3VudCA9PSAxKQorICAgIAllbnRyeS0+aWQgPSBpZF92YWw7CisgICAgCisgICAgcmV0dXJuIGNvdW50OworfQorCitQSl9ERUYodW5zaWduZWQpIHBqX3RpbWVyX2hlYXBfcG9sbCggcGpfdGltZXJfaGVhcF90ICpodCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfdGltZV92YWwgKm5leHRfZGVsYXkgKQoreworICAgIC8qIFBvbGxpbmcgaXMgbm90IG5lY2Vzc2FyeSBvbiBTeW1iaWFuLCBzaW5jZSBhbGwgYXN5bmMgYWN0aXZpdGllcworICAgICAqIGFyZSByZWdpc3RlcmVkIHRvIGFjdGl2ZSBzY2hlZHVsZXIuCisgICAgICovCisgICAgUEpfVU5VU0VEX0FSRyhodCk7CisgICAgaWYgKG5leHRfZGVsYXkpIHsKKyAgICAJbmV4dF9kZWxheS0+c2VjID0gMTsKKyAgICAJbmV4dF9kZWxheS0+bXNlYyA9IDA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitQSl9ERUYocGpfc2l6ZV90KSBwal90aW1lcl9oZWFwX2NvdW50KCBwal90aW1lcl9oZWFwX3QgKmh0ICkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKGh0LCAwKTsKKworICAgIHJldHVybiBodC0+Y3VyX3NpemU7Cit9CisKK1BKX0RFRihwal9zdGF0dXNfdCkgcGpfdGltZXJfaGVhcF9lYXJsaWVzdF90aW1lKCBwal90aW1lcl9oZWFwX3QgKiBodCwKKwkJCQkJICAgICAgICAgcGpfdGltZV92YWwgKnRpbWV2YWwpCit7CisgICAgLyogV2UgZG9uJ3Qgc3VwcG9ydCB0aGlzISAqLworICAgIFBKX1VOVVNFRF9BUkcoaHQpOworICAgIAorICAgIHRpbWV2YWwtPnNlYyA9IDE7CisgICAgdGltZXZhbC0+bXNlYyA9IDA7CisgICAgCisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovdHlwZXMuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGovdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTJhZmNmCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai90eXBlcy5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qICRJZDogdHlwZXMuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3R5cGVzLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKworUEpfREVGKHZvaWQpIHBqX3RpbWVfdmFsX25vcm1hbGl6ZShwal90aW1lX3ZhbCAqdCkKK3sKKyAgICBQSl9DSEVDS19TVEFDSygpOworCisgICAgaWYgKHQtPm1zZWMgPj0gMTAwMCkgeworCXQtPnNlYyArPSAodC0+bXNlYyAvIDEwMDApOworCXQtPm1zZWMgPSAodC0+bXNlYyAlIDEwMDApOworICAgIH0KKyAgICBlbHNlIGlmICh0LT5tc2VjIDw9IC0xMDAwKSB7CisJZG8geworCSAgICB0LT5zZWMtLTsKKwkgICAgdC0+bXNlYyArPSAxMDAwOworICAgICAgICB9IHdoaWxlICh0LT5tc2VjIDw9IC0xMDAwKTsKKyAgICB9CisKKyAgICBpZiAodC0+c2VjID49IDEgJiYgdC0+bXNlYyA8IDApIHsKKwl0LT5zZWMtLTsKKwl0LT5tc2VjICs9IDEwMDA7CisKKyAgICB9IGVsc2UgaWYgKHQtPnNlYyA8IDAgJiYgdC0+bXNlYyA+IDApIHsKKwl0LT5zZWMrKzsKKwl0LT5tc2VjIC09IDEwMDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai91bmljb2RlX3N5bWJpYW4uY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai91bmljb2RlX3N5bWJpYW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMTA5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3VuaWNvZGVfc3ltYmlhbi5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyogJElkOiB1bmljb2RlX3N5bWJpYW4uY3BwIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovdW5pY29kZS5oPgorCisjaW5jbHVkZSAib3Nfc3ltYmlhbi5oIgorCisKKy8qCisgKiBDb252ZXJ0IEFOU0kgc3RyaW5ncyB0byBVbmljb2RlIHN0cmluZ3MuCisgKi8KK1BKX0RFRih3Y2hhcl90KikgcGpfYW5zaV90b191bmljb2RlKCBjb25zdCBjaGFyICpzdHIsIHBqX3NpemVfdCBsZW4sCisJCQkJICAgICB3Y2hhcl90ICp3YnVmLCBwal9zaXplX3Qgd2J1Zl9jb3VudCkKK3sKKyAgICBUUHRyQzggYUZvcmVpZ24oKGNvbnN0IFRVaW50OCopc3RyLCAoVEludClsZW4pOworICAgIFRQdHIxNiBhVW5pY29kZSgoVFVpbnQxNiopd2J1ZiwgKFRJbnQpKHdidWZfY291bnQtMSkpOworICAgIFRJbnQgbGVmdDsKKworICAgIGxlZnQgPSBQalN5bWJpYW5PUzo6SW5zdGFuY2UoKS0+Q29udmVydFRvVW5pY29kZShhVW5pY29kZSwgYUZvcmVpZ24pOworCisgICAgaWYgKGxlZnQgIT0gMCkgeworCS8vIEVycm9yLCBvciB0aGVyZSBhcmUgdW5jb252ZXJ0YWJsZSBjaGFyYWN0ZXJzCisJKndidWYgPSAwOworICAgIH0gZWxzZSB7CisJaWYgKGxlbiA8IHdidWZfY291bnQpCisJICAgIHdidWZbbGVuXSA9IDA7CisJZWxzZQorCSAgICB3YnVmW2xlbi0xXSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHdidWY7Cit9CisKKworLyoKKyAqIENvbnZlcnQgVW5pY29kZSBzdHJpbmcgdG8gQU5TSSBzdHJpbmcuCisgKi8KK1BKX0RFRihjaGFyKikgcGpfdW5pY29kZV90b19hbnNpKCBjb25zdCB3Y2hhcl90ICp3c3RyLCBwal9zaXplX3QgbGVuLAorCQkJCSAgY2hhciAqYnVmLCBwal9zaXplX3QgYnVmX3NpemUpCit7CisgICAgVFB0ckMxNiBhVW5pY29kZSgoY29uc3QgVFVpbnQxNiopd3N0ciwgKFRJbnQpbGVuKTsKKyAgICBUUHRyOCBhRm9yZWlnbigoVFVpbnQ4KilidWYsIChUSW50KShidWZfc2l6ZS0xKSk7CisgICAgVEludCBsZWZ0OworCisgICAgbGVmdCA9IFBqU3ltYmlhbk9TOjpJbnN0YW5jZSgpLT5Db252ZXJ0RnJvbVVuaWNvZGUoYUZvcmVpZ24sIGFVbmljb2RlKTsKKworICAgIGlmIChsZWZ0ICE9IDApIHsKKwkvLyBFcnJvciwgb3IgdGhlcmUgYXJlIHVuY29udmVydGFibGUgY2hhcmFjdGVycworCWJ1ZlswXSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKwlpZiAobGVuIDwgYnVmX3NpemUpCisJICAgIGJ1ZltsZW5dID0gJ1wwJzsKKwllbHNlCisJICAgIGJ1ZltsZW4tMV0gPSAnXDAnOworICAgIH0KKworICAgIHJldHVybiBidWY7Cit9CisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai91bmljb2RlX3dpbjMyLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqL3VuaWNvZGVfd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGE2M2JlCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wai91bmljb2RlX3dpbjMyLmMKQEAgLTAsMCArMSw2MCBAQAorLyogJElkOiB1bmljb2RlX3dpbjMyLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovdW5pY29kZS5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworCitQSl9ERUYod2NoYXJfdCopIHBqX2Fuc2lfdG9fdW5pY29kZShjb25zdCBjaGFyICpzLCBpbnQgbGVuLAorCQkJCSAgICB3Y2hhcl90ICpidWYsIGludCBidWZfY291bnQpCit7CisgICAgUEpfQVNTRVJUX1JFVFVSTihzICYmIGJ1ZiwgTlVMTCk7CisKKyAgICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgcywgbGVuLCAKKwkJCSAgICAgIGJ1ZiwgYnVmX2NvdW50KTsKKyAgICBpZiAoYnVmX2NvdW50KSB7CisJaWYgKGxlbiA8IGJ1Zl9jb3VudCkKKwkgICAgYnVmW2xlbl0gPSAwOworCWVsc2UKKwkgICAgYnVmW2xlbi0xXSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZjsKK30KKworCitQSl9ERUYoY2hhciopIHBqX3VuaWNvZGVfdG9fYW5zaSggY29uc3Qgd2NoYXJfdCAqd3N0ciwgcGpfc3NpemVfdCBsZW4sCisJCQkJICBjaGFyICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBQSl9BU1NFUlRfUkVUVVJOKHdzdHIgJiYgYnVmLCBOVUxMKTsKKworICAgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB3c3RyLCAoaW50KWxlbiwgYnVmLCBidWZfc2l6ZSwgCisJCQkgICAgICBOVUxMLCBOVUxMKTsKKyAgICBpZiAoYnVmX3NpemUpIHsKKwlpZiAobGVuIDwgYnVmX3NpemUpCisJICAgIGJ1ZltsZW5dID0gJ1wwJzsKKwllbHNlCisJICAgIGJ1ZltsZW4tMV0gPSAnXDAnOworICAgIH0KKworICAgIHJldHVybiBidWY7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWIrKy10ZXN0L21haW4uY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYisrLXRlc3QvbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3NTY0NAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWIrKy10ZXN0L21haW4uY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8qICRJZCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwaisrL2ZpbGUuaHBwPgorI2luY2x1ZGUgPHBqKysvbGlzdC5ocHA+CisjaW5jbHVkZSA8cGorKy9sb2NrLmhwcD4KKyNpbmNsdWRlIDxwaisrL2hhc2guaHBwPgorI2luY2x1ZGUgPHBqKysvb3MuaHBwPgorI2luY2x1ZGUgPHBqKysvcHJvYWN0b3IuaHBwPgorI2luY2x1ZGUgPHBqKysvc29jay5ocHA+CisjaW5jbHVkZSA8cGorKy9zdHJpbmcuaHBwPgorI2luY2x1ZGUgPHBqKysvdGltZXIuaHBwPgorI2luY2x1ZGUgPHBqKysvdHJlZS5ocHA+CisKK2NsYXNzIE15X0FzeW5jX09wIDogcHVibGljIFBqX0FzeW5jX09wCit7Cit9OworCitjbGFzcyBNeV9FdmVudF9IYW5kbGVyIDogcHVibGljIFBqX0V2ZW50X0hhbmRsZXIKK3sKK307CisKK2ludCBtYWluKCkKK3sKKyAgICBQamxpYiBsaWI7CisgICAgUGpfQ2FjaGluZ19Qb29sIG1lbTsKKyAgICBQal9Qb29sIHRoZV9wb29sOworICAgIFBqX1Bvb2wgKnBvb2wgPSAmdGhlX3Bvb2w7CisgICAgCisgICAgdGhlX3Bvb2wuYXR0YWNoKG1lbS5jcmVhdGVfcG9vbCg0MDAwLDQwMDApKTsKKworICAgIFBqX1NlbWFwaG9yZV9Mb2NrIGxzZW0ocG9vbCk7CisgICAgUGpfU2VtYXBob3JlX0xvY2sgKnBsc2VtOworCisgICAgcGxzZW0gPSBuZXcocG9vbCkgUGpfU2VtYXBob3JlX0xvY2socG9vbCk7CisgICAgZGVsZXRlIHBsc2VtOworCisgICAgUGpfUHJvYWN0b3IgcHJvYWN0b3IocG9vbCwgMTAwLCAxMDApOworCisgICAgTXlfRXZlbnRfSGFuZGxlciAqZXZlbnRfaGFuZGxlciA9IG5ldyh0aGVfcG9vbCkgTXlfRXZlbnRfSGFuZGxlcjsKKyAgICBwcm9hY3Rvci5yZWdpc3Rlcl9zb2NrZXRfaGFuZGxlcihwb29sLCBldmVudF9oYW5kbGVyKTsKKyAgICBwcm9hY3Rvci51bnJlZ2lzdGVyX2hhbmRsZXIoZXZlbnRfaGFuZGxlcik7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi1zYW1wbGVzL2V4Y2VwdC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi1zYW1wbGVzL2V4Y2VwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlN2FhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXNhbXBsZXMvZXhjZXB0LmMKQEAgLTAsMCArMSw4MiBAQAorLyogJElkOiBleGNlcHQuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2V4Y2VwdC5oPgorI2luY2x1ZGUgPHBqL3JhbmQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKioKKyAqIFxwYWdlIHBhZ2VfcGpsaWJfc2FtcGxlc19leGNlcHRfYyBFeGFtcGxlOiBFeGNlcHRpb24gSGFuZGxpbmcKKyAqCisgKiBCZWxvdyBpcyBzYW1wbGUgcHJvZ3JhbSB0byBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAqCisgKiBcaW5jbHVkZWxpbmVubyBwamxpYi1zYW1wbGVzL2V4Y2VwdC5jCisgKi8KKworc3RhdGljIHBqX2V4Y2VwdGlvbl9pZF90IE5PX01FTU9SWSwgT1RIRVJfRVhDRVBUSU9OOworCitzdGF0aWMgdm9pZCByYW5kb21seV90aHJvd19leGNlcHRpb24oKQoreworICAgIGlmIChwal9yYW5kKCkgJSAyKQorICAgICAgICBQSl9USFJPVyhPVEhFUl9FWENFUFRJT04pOworfQorCitzdGF0aWMgdm9pZCAqbXlfbWFsbG9jKHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnB0ciA9IG1hbGxvYyhzaXplKTsKKyAgICBpZiAoIXB0cikKKyAgICAgICAgUEpfVEhST1coTk9fTUVNT1JZKTsKKyAgICByZXR1cm4gcHRyOworfQorCitzdGF0aWMgaW50IHRlc3RfZXhjZXB0aW9uKCkKK3sKKyAgICBQSl9VU0VfRVhDRVBUSU9OOworICAgIAorICAgIFBKX1RSWSB7CisgICAgICAgIHZvaWQgKmRhdGEgPSBteV9tYWxsb2MoMjAwKTsKKyAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgcmFuZG9tbHlfdGhyb3dfZXhjZXB0aW9uKCk7CisgICAgfQorICAgIFBKX0NBVENIX0FOWSB7CisgICAgICAgIHBqX2V4Y2VwdGlvbl9pZF90IHhfaWQ7CisgICAgICAgIAorICAgICAgICB4X2lkID0gUEpfR0VUX0VYQ0VQVElPTigpOworICAgICAgICBwcmludGYoIkNhdWdodCBleGNlcHRpb24gJWQgKCVzKVxuIiwgCisgICAgICAgICAgICB4X2lkLCBwal9leGNlcHRpb25faWRfbmFtZSh4X2lkKSk7CisgICAgfQorICAgIFBKX0VORAorICAgICAgICByZXR1cm4gMTsKK30KKworaW50IG1haW4oKQoreworICAgIHBqX3N0YXR1c190IHJjOworICAgIAorICAgIC8vIEVycm9yIGhhbmRsaW5nIGlzIG9taXRlZCBmb3IgY2xhcml0eS4KKyAgICAKKyAgICByYyA9IHBqX2luaXQoKTsKKworICAgIHJjID0gcGpfZXhjZXB0aW9uX2lkX2FsbG9jKCJObyBNZW1vcnkiLCAmTk9fTUVNT1JZKTsKKyAgICByYyA9IHBqX2V4Y2VwdGlvbl9pZF9hbGxvYygiT3RoZXIgRXhjZXB0aW9uIiwgJk9USEVSX0VYQ0VQVElPTik7CisgICAgCisgICAgcmV0dXJuIHRlc3RfZXhjZXB0aW9uKCk7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItc2FtcGxlcy9saXN0LmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXNhbXBsZXMvbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlY2UzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXNhbXBsZXMvbGlzdC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qICRJZDogbGlzdC5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovbGlzdC5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorCisvKioKKyAqIFxwYWdlIHBhZ2VfcGpsaWJfc2FtcGxlc19saXN0X2MgRXhhbXBsZTogTGlzdCBNYW5pcHVsYXRpb24KKyAqCisgKiBCZWxvdyBpcyBzYW1wbGUgcHJvZ3JhbSB0byBkZW1vbnN0cmF0ZSBob3cgdG8gbWFuaXB1bGF0ZSBsaW5rZWQgbGlzdC4KKyAqCisgKiBcaW5jbHVkZWxpbmVubyBwamxpYi1zYW1wbGVzL2xpc3QuYworICovCisKK3N0cnVjdCBteV9ub2RlCit7CisgICAgLy8gVGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBtZW1iZXIgZGVjbGFyZWQgaW4gdGhlIHN0cnVjdCEKKyAgICBQSl9ERUNMX0xJU1RfTUVNQkVSKHN0cnVjdCBteV9ub2RlKTsKKyAgICBpbnQgdmFsdWU7Cit9OworCisKK2ludCBtYWluKCkKK3sKKyAgICBzdHJ1Y3QgbXlfbm9kZSBub2Rlc1sxMF07CisgICAgc3RydWN0IG15X25vZGUgbGlzdDsKKyAgICBzdHJ1Y3QgbXlfbm9kZSAqaXQ7CisgICAgaW50IGk7CisgICAgCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbGlzdCBhcyBlbXB0eS4KKyAgICBwal9saXN0X2luaXQoJmxpc3QpOworICAgIAorICAgIC8vIEluc2VydCBub2Rlcy4KKyAgICBmb3IgKGk9MDsgaTwxMDsgKytpKSB7CisgICAgICAgIG5vZGVzW2ldLnZhbHVlID0gaTsKKyAgICAgICAgcGpfbGlzdF9pbnNlcnRfYmVmb3JlKCZsaXN0LCAmbm9kZXNbaV0pOworICAgIH0KKyAgICAKKyAgICAvLyBJdGVyYXRlIGxpc3Qgbm9kZXMuCisgICAgaXQgPSBsaXN0Lm5leHQ7CisgICAgd2hpbGUgKGl0ICE9ICZsaXN0KSB7CisgICAgICAgIFBKX0xPRygzLCgibGlzdCIsICJ2YWx1ZSA9ICVkIiwgaXQtPnZhbHVlKSk7CisgICAgICAgIGl0ID0gaXQtPm5leHQ7CisgICAgfQorICAgIAorICAgIC8vIEVyYXNlIGFsbCBub2Rlcy4KKyAgICBmb3IgKGk9MDsgaTwxMDsgKytpKSB7CisgICAgICAgIHBqX2xpc3RfZXJhc2UoJm5vZGVzW2ldKTsKKyAgICB9CisgICAgCisgICAgLy8gTGlzdCBtdXN0IGJlIGVtcHR5IGJ5IG5vdy4KKyAgICBwal9hc3NlcnQoIHBqX2xpc3RfZW1wdHkoJmxpc3QpICk7CisgICAgCisgICAgcmV0dXJuIDA7Cit9OwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi1zYW1wbGVzL2xvZy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi1zYW1wbGVzL2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzFlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXNhbXBsZXMvbG9nLmMKQEAgLTAsMCArMSw0MyBAQAorLyogJElkOiBsb2cuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL2xvZy5oPgorCisvKioKKyAqIFxwYWdlIHBhZ2VfcGpsaWJfc2FtcGxlc19sb2dfYyBFeGFtcGxlOiBMb2csIEhlbGxvIFdvcmxkCisgKgorICogVmVyeSBzaW1wbGUgcHJvZ3JhbSB0byB3cml0ZSBsb2cuCisgKgorICogXGluY2x1ZGVsaW5lbm8gcGpsaWItc2FtcGxlcy9sb2cuYworICovCisKK2ludCBtYWluKCkKK3sKKyAgICBwal9zdGF0dXNfdCByYzsKKworICAgIC8vIEVycm9yIGhhbmRsaW5nIG9taXRlZCBmb3IgY2xhcml0eQorICAgIAorICAgIC8vIE11c3QgaW5pdGlhbGl6ZSBQSkxJQiBmaXJzdCEKKyAgICByYyA9IHBqX2luaXQoKTsKKworICAgIFBKX0xPRygzLCAoIm1haW4uYyIsICJIZWxsbyB3b3JsZCEiKSk7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2FjdGl2ZXNvY2suYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9hY3RpdmVzb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2ZGNjYQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9hY3RpdmVzb2NrLmMKQEAgLTAsMCArMSw1MjAgQEAKKy8qICRJZDogYWN0aXZlc29jay5jIDQ0ODcgMjAxMy0wNC0yMyAwNTozNzo0MVogYmVubnlscCAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxwamxpYi5oPgorCisvKioKKyAqIFxwYWdlIHBhZ2VfcGpsaWJfYWN0aXZlc29ja190ZXN0IFRlc3Q6IEFjdGl2ZSBTb2NrZXQKKyAqCisgKiBUaGlzIGZpbGUgaXMgPGI+cGpsaWItdGVzdC9hY3RpdmVzb2NrLmM8L2I+CisgKgorICogXGluY2x1ZGUgcGpsaWItdGVzdC9hY3RpdmVzb2NrLmMKKyAqLworCisjaWYgSU5DTFVERV9BQ1RJVkVTT0NLX1RFU1QKKworI2RlZmluZSBUSElTX0ZJTEUgICAiYWN0aXZlc29jay5jIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaW1wbGUgVURQIGVjaG8gc2VydmVyLgorICovCitzdHJ1Y3QgdWRwX2VjaG9fc3J2Cit7CisgICAgcGpfYWN0aXZlc29ja190CSphc29jazsKKyAgICBwal9ib29sX3QJCSBlY2hvX2VuYWJsZWQ7CisgICAgcGpfdWludDE2X3QJCSBwb3J0OworICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QJIHNlbmRfa2V5OworICAgIHBqX3N0YXR1c190CQkgc3RhdHVzOworICAgIHVuc2lnbmVkCQkgcnhfY250OworICAgIHVuc2lnbmVkCQkgcnhfZXJyX2NudCwgdHhfZXJyX2NudDsKK307CisKK3N0YXRpYyB2b2lkIHVkcF9lY2hvX2Vycihjb25zdCBjaGFyICp0aXRsZSwgcGpfc3RhdHVzX3Qgc3RhdHVzKQoreworICAgIGNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisKKyAgICBwal9zdHJlcnJvcihzdGF0dXMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIgICBlcnJvcjogJXM6ICVzIiwgdGl0bGUsIGVycm1zZykpOworfQorCitzdGF0aWMgcGpfYm9vbF90IHVkcF9lY2hvX3Nydl9vbl9kYXRhX3JlY3Zmcm9tKHBqX2FjdGl2ZXNvY2tfdCAqYXNvY2ssCisJCQkJCSAgICAgICB2b2lkICpkYXRhLAorCQkJCQkgICAgICAgcGpfc2l6ZV90IHNpemUsCisJCQkJCSAgICAgICBjb25zdCBwal9zb2NrYWRkcl90ICpzcmNfYWRkciwKKwkJCQkJICAgICAgIGludCBhZGRyX2xlbiwKKwkJCQkJICAgICAgIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBzdHJ1Y3QgdWRwX2VjaG9fc3J2ICpzcnY7CisgICAgcGpfc3NpemVfdCBzZW50OworCisKKyAgICBzcnYgPSAoc3RydWN0IHVkcF9lY2hvX3NydiopIHBqX2FjdGl2ZXNvY2tfZ2V0X3VzZXJfZGF0YShhc29jayk7CisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlzcnYtPnN0YXR1cyA9IHN0YXR1czsKKwlzcnYtPnJ4X2Vycl9jbnQrKzsKKwl1ZHBfZWNob19lcnIoInJlY3Zmcm9tKCkgY2FsbGJhY2siLCBzdGF0dXMpOworCXJldHVybiBQSl9UUlVFOworICAgIH0KKworICAgIHNydi0+cnhfY250Kys7CisKKyAgICAvKiBTZW5kIGJhY2sgaWYgZWNobyBpcyBlbmFibGVkICovCisgICAgaWYgKHNydi0+ZWNob19lbmFibGVkKSB7CisJc2VudCA9IHNpemU7CisJc3J2LT5zdGF0dXMgPSBwal9hY3RpdmVzb2NrX3NlbmR0byhhc29jaywgJnNydi0+c2VuZF9rZXksIGRhdGEsIAorCQkJCQkgICAmc2VudCwgMCwKKwkJCQkJICAgc3JjX2FkZHIsIGFkZHJfbGVuKTsKKwlpZiAoc3J2LT5zdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBzcnYtPnR4X2Vycl9jbnQrKzsKKwkgICAgdWRwX2VjaG9fZXJyKCJzZW5kdG8oKSIsIHN0YXR1cyk7CisJfQorICAgIH0KKworICAgIHJldHVybiBQSl9UUlVFOworfQorCisKK3N0YXRpYyBwal9zdGF0dXNfdCB1ZHBfZWNob19zcnZfY3JlYXRlKHBqX3Bvb2xfdCAqcG9vbCwKKwkJCQkgICAgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJCSAgICAgICBwal9ib29sX3QgZW5hYmxlX2VjaG8sCisJCQkJICAgICAgIHN0cnVjdCB1ZHBfZWNob19zcnYgKipwX3NydikKK3sKKyAgICBzdHJ1Y3QgdWRwX2VjaG9fc3J2ICpzcnY7CisgICAgcGpfc29ja190IHNvY2tfZmQgPSBQSl9JTlZBTElEX1NPQ0tFVDsKKyAgICBwal9zb2NrYWRkciBhZGRyOworICAgIHBqX2FjdGl2ZXNvY2tfY2IgYWN0aXZlc29ja19jYjsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBzcnYgPSBQSl9QT09MX1pBTExPQ19UKHBvb2wsIHN0cnVjdCB1ZHBfZWNob19zcnYpOworICAgIHNydi0+ZWNob19lbmFibGVkID0gZW5hYmxlX2VjaG87CisKKyAgICBwal9zb2NrYWRkcl9pbl9pbml0KCZhZGRyLmlwdjQsIE5VTEwsIDApOworCisgICAgcGpfYnplcm8oJmFjdGl2ZXNvY2tfY2IsIHNpemVvZihhY3RpdmVzb2NrX2NiKSk7CisgICAgYWN0aXZlc29ja19jYi5vbl9kYXRhX3JlY3Zmcm9tID0gJnVkcF9lY2hvX3Nydl9vbl9kYXRhX3JlY3Zmcm9tOworCisgICAgc3RhdHVzID0gcGpfYWN0aXZlc29ja19jcmVhdGVfdWRwKHBvb2wsICZhZGRyLCBOVUxMLCBpb3F1ZXVlLCAmYWN0aXZlc29ja19jYiwgCisJCQkJICAgICAgc3J2LCAmc3J2LT5hc29jaywgJmFkZHIpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXBqX3NvY2tfY2xvc2Uoc29ja19mZCk7CisJdWRwX2VjaG9fZXJyKCJwal9hY3RpdmVzb2NrX2NyZWF0ZSgpIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHNydi0+cG9ydCA9IHBqX250b2hzKGFkZHIuaXB2NC5zaW5fcG9ydCk7CisKKyAgICBwal9pb3F1ZXVlX29wX2tleV9pbml0KCZzcnYtPnNlbmRfa2V5LCBzaXplb2Yoc3J2LT5zZW5kX2tleSkpOworCisgICAgc3RhdHVzID0gcGpfYWN0aXZlc29ja19zdGFydF9yZWN2ZnJvbShzcnYtPmFzb2NrLCBwb29sLCAzMiwgMCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJcGpfYWN0aXZlc29ja19jbG9zZShzcnYtPmFzb2NrKTsKKwl1ZHBfZWNob19lcnIoInBqX2FjdGl2ZXNvY2tfc3RhcnRfcmVjdmZyb20oKSIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKworICAgICpwX3NydiA9IHNydjsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgdWRwX2VjaG9fc3J2X2Rlc3Ryb3koc3RydWN0IHVkcF9lY2hvX3NydiAqc3J2KQoreworICAgIHBqX2FjdGl2ZXNvY2tfY2xvc2Uoc3J2LT5hc29jayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVRFAgcGluZyBwb25nIHRlc3QgKHNlbmQgcGFja2V0IGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdHdvIFVEUCBlY2hvCisgKiBzZXJ2ZXJzLgorICovCitzdGF0aWMgaW50IHVkcF9waW5nX3BvbmdfdGVzdCh2b2lkKQoreworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSA9IE5VTEw7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKyAgICBzdHJ1Y3QgdWRwX2VjaG9fc3J2ICpzcnYxPU5VTEwsICpzcnYyPU5VTEw7CisgICAgcGpfYm9vbF90IG5lZWRfc2VuZCA9IFBKX1RSVUU7CisgICAgdW5zaWduZWQgZGF0YSA9IDA7CisgICAgaW50IGNvdW50LCByZXQ7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgInBpbmdwb25nIiwgNTEyLCA1MTIsIE5VTEwpOworICAgIGlmICghcG9vbCkKKwlyZXR1cm4gLTEwOworCisgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9jcmVhdGUocG9vbCwgNCwgJmlvcXVldWUpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXJldCA9IC0yMDsKKwl1ZHBfZWNob19lcnIoInBqX2lvcXVldWVfY3JlYXRlKCkiLCBzdGF0dXMpOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHVkcF9lY2hvX3Nydl9jcmVhdGUocG9vbCwgaW9xdWV1ZSwgUEpfVFJVRSwgJnNydjEpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXJldCA9IC0zMDsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB1ZHBfZWNob19zcnZfY3JlYXRlKHBvb2wsIGlvcXVldWUsIFBKX1RSVUUsICZzcnYyKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlyZXQgPSAtNDA7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogaW5pdGlhdGUgdGhlIGZpcnN0IHNlbmQgKi8KKyAgICBmb3IgKGNvdW50PTA7IGNvdW50PDEwMDA7ICsrY291bnQpIHsKKwl1bnNpZ25lZCBsYXN0X3J4MSwgbGFzdF9yeDI7CisJdW5zaWduZWQgaTsKKworCWlmIChuZWVkX3NlbmQpIHsKKwkgICAgcGpfc3RyX3QgbG9vcGJhY2s7CisJICAgIHBqX3NvY2thZGRyX2luIGFkZHI7CisJICAgIHBqX3NzaXplX3Qgc2VudDsKKworCSAgICArK2RhdGE7CisKKwkgICAgc2VudCA9IHNpemVvZihkYXRhKTsKKwkgICAgbG9vcGJhY2sgPSBwal9zdHIoIjEyNy4wLjAuMSIpOworCSAgICBwal9zb2NrYWRkcl9pbl9pbml0KCZhZGRyLCAmbG9vcGJhY2ssIHNydjItPnBvcnQpOworCSAgICBzdGF0dXMgPSBwal9hY3RpdmVzb2NrX3NlbmR0byhzcnYxLT5hc29jaywgJnNydjEtPnNlbmRfa2V5LAorCQkJCQkgICZkYXRhLCAmc2VudCwgMCwKKwkJCQkJICAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTICYmIHN0YXR1cyAhPSBQSl9FUEVORElORykgeworCQlyZXQgPSAtNTA7CisJCXVkcF9lY2hvX2Vycigic2VuZHRvKCkiLCBzdGF0dXMpOworCQlnb3RvIG9uX3JldHVybjsKKwkgICAgfQorCisJICAgIG5lZWRfc2VuZCA9IFBKX0ZBTFNFOworCX0KKworCWxhc3RfcngxID0gc3J2MS0+cnhfY250OworCWxhc3RfcngyID0gc3J2Mi0+cnhfY250OworCisJZm9yIChpPTA7IGk8MTAgJiYgbGFzdF9yeDEgPT0gc3J2MS0+cnhfY250ICYmIGxhc3RfcngyID09IHNydjItPnJ4X2NudDsgKytpKSB7CisJICAgIHBqX3RpbWVfdmFsIGRlbGF5ID0gezAsIDEwfTsKKyNpZmRlZiBQSl9TWU1CSUFOCisJICAgIFBKX1VOVVNFRF9BUkcoZGVsYXkpOworCSAgICBwal9zeW1iaWFub3NfcG9sbCgtMSwgMTAwKTsKKyNlbHNlCisJICAgIHBqX2lvcXVldWVfcG9sbChpb3F1ZXVlLCAmZGVsYXkpOworI2VuZGlmCisJfQorCisJaWYgKHNydjEtPnJ4X2Vycl9jbnQrc3J2MS0+dHhfZXJyX2NudCAhPSAwIHx8CisJICAgIHNydjItPnJ4X2Vycl9jbnQrc3J2Mi0+dHhfZXJyX2NudCAhPSAwKQorCXsKKwkgICAgLyogR290IGVycm9yICovCisJICAgIHJldCA9IC02MDsKKwkgICAgZ290byBvbl9yZXR1cm47CisJfQorCisJaWYgKGxhc3RfcngxID09IHNydjEtPnJ4X2NudCAmJiBsYXN0X3J4MiA9PSBzcnYyLT5yeF9jbnQpIHsKKwkgICAgLyogUGFja2V0IGxvc3QgKi8KKwkgICAgcmV0ID0gLTcwOworCSAgICB1ZHBfZWNob19lcnIoInBhY2tldHMgaGF2ZSBiZWVuIGxvc3QiLCBQSl9FVElNRURPVVQpOworCSAgICBnb3RvIG9uX3JldHVybjsKKwl9CisgICAgfQorCisgICAgcmV0ID0gMDsKKworb25fcmV0dXJuOgorICAgIGlmIChzcnYyKQorCXVkcF9lY2hvX3Nydl9kZXN0cm95KHNydjIpOworICAgIGlmIChzcnYxKQorCXVkcF9lY2hvX3Nydl9kZXN0cm95KHNydjEpOworICAgIGlmIChpb3F1ZXVlKQorCXBqX2lvcXVldWVfZGVzdHJveShpb3F1ZXVlKTsKKyAgICBpZiAocG9vbCkKKwlwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgCisgICAgcmV0dXJuIHJldDsKK30KKworCisKKyNkZWZpbmUgU0lHTkFUVVJFICAgMHhkZWFkYmVlZgorc3RydWN0IHRjcF9wa3QKK3sKKyAgICBwal91aW50MzJfdAlzaWduYXR1cmU7CisgICAgcGpfdWludDMyX3QJc2VxOworICAgIGNoYXIJZmlsbFs1MTNdOworfTsKKworc3RydWN0IHRjcF9zdGF0ZQoreworICAgIHBqX2Jvb2xfdAllcnI7CisgICAgcGpfYm9vbF90CXNlbnQ7CisgICAgcGpfdWludDMyX3QJbmV4dF9yZWN2X3NlcTsKKyAgICBwal91aW50OF90CXBrdFs2MDBdOworfTsKKworc3RydWN0IHNlbmRfa2V5Cit7CisgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdAlvcF9rZXk7Cit9OworCisKK3N0YXRpYyBwal9ib29sX3QgdGNwX29uX2RhdGFfcmVhZChwal9hY3RpdmVzb2NrX3QgKmFzb2NrLAorCQkJCSAgdm9pZCAqZGF0YSwKKwkJCQkgIHBqX3NpemVfdCBzaXplLAorCQkJCSAgcGpfc3RhdHVzX3Qgc3RhdHVzLAorCQkJCSAgcGpfc2l6ZV90ICpyZW1haW5kZXIpCit7CisgICAgc3RydWN0IHRjcF9zdGF0ZSAqc3QgPSAoc3RydWN0IHRjcF9zdGF0ZSopIHBqX2FjdGl2ZXNvY2tfZ2V0X3VzZXJfZGF0YShhc29jayk7CisgICAgY2hhciAqbmV4dCA9IChjaGFyKikgZGF0YTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gUEpfRVBFTkRJTkcpIHsKKwlQSl9MT0coMSwoIiIsICIgICBlcnI6IHN0YXR1cz0lZCIsIHN0YXR1cykpOworCXN0LT5lcnIgPSBQSl9UUlVFOworCXJldHVybiBQSl9GQUxTRTsKKyAgICB9CisKKyAgICB3aGlsZSAoc2l6ZSA+PSBzaXplb2Yoc3RydWN0IHRjcF9wa3QpKSB7CisJc3RydWN0IHRjcF9wa3QgKnRjcF9wa3QgPSAoc3RydWN0IHRjcF9wa3QqKSBuZXh0OworCisJaWYgKHRjcF9wa3QtPnNpZ25hdHVyZSAhPSBTSUdOQVRVUkUpIHsKKwkgICAgUEpfTE9HKDEsKCIiLCAiICAgZXJyOiBpbnZhbGlkIHNpZ25hdHVyZSBhdCBzZXE9JWQiLCAKKwkJCSAgc3QtPm5leHRfcmVjdl9zZXEpKTsKKwkgICAgc3QtPmVyciA9IFBKX1RSVUU7CisJICAgIHJldHVybiBQSl9GQUxTRTsKKwl9CisJaWYgKHRjcF9wa3QtPnNlcSAhPSBzdC0+bmV4dF9yZWN2X3NlcSkgeworCSAgICBQSl9MT0coMSwoIiIsICIgICBlcnI6IHdyb25nIHNlcXVlbmNlIikpOworCSAgICBzdC0+ZXJyID0gUEpfVFJVRTsKKwkgICAgcmV0dXJuIFBKX0ZBTFNFOworCX0KKworCXN0LT5uZXh0X3JlY3Zfc2VxKys7CisJbmV4dCArPSBzaXplb2Yoc3RydWN0IHRjcF9wa3QpOworCXNpemUgLT0gc2l6ZW9mKHN0cnVjdCB0Y3BfcGt0KTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSkgeworCXBqX21lbW1vdmUoZGF0YSwgbmV4dCwgc2l6ZSk7CisJKnJlbWFpbmRlciA9IHNpemU7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKK3N0YXRpYyBwal9ib29sX3QgdGNwX29uX2RhdGFfc2VudChwal9hY3RpdmVzb2NrX3QgKmFzb2NrLAorCQkJCSAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorCQkJCSAgcGpfc3NpemVfdCBzZW50KQoreworICAgIHN0cnVjdCB0Y3Bfc3RhdGUgKnN0PShzdHJ1Y3QgdGNwX3N0YXRlKilwal9hY3RpdmVzb2NrX2dldF91c2VyX2RhdGEoYXNvY2spOworCisgICAgUEpfVU5VU0VEX0FSRyhvcF9rZXkpOworCisgICAgc3QtPnNlbnQgPSAxOworCisgICAgaWYgKHNlbnQgPCAxKSB7CisJc3QtPmVyciA9IFBKX1RSVUU7CisJcmV0dXJuIFBKX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBQSl9UUlVFOworfQorCitzdGF0aWMgaW50IHRjcF9wZXJmX3Rlc3Qodm9pZCkKK3sKKyAgICBlbnVtIHsgQ09VTlQ9MTAwMDAgfTsKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSA9IE5VTEw7CisgICAgcGpfc29ja190IHNvY2sxPVBKX0lOVkFMSURfU09DS0VULCBzb2NrMj1QSl9JTlZBTElEX1NPQ0tFVDsKKyAgICBwal9hY3RpdmVzb2NrX3QgKmFzb2NrMSA9IE5VTEwsICphc29jazIgPSBOVUxMOworICAgIHBqX2FjdGl2ZXNvY2tfY2IgY2I7CisgICAgc3RydWN0IHRjcF9zdGF0ZSAqc3RhdGUxLCAqc3RhdGUyOworICAgIHVuc2lnbmVkIGk7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgInRjcHBlcmYiLCAyNTYsIDI1NiwgTlVMTCk7CisKKyAgICBzdGF0dXMgPSBhcHBfc29ja2V0cGFpcihwal9BRl9JTkVUKCksIHBqX1NPQ0tfU1RSRUFNKCksIDAsICZzb2NrMSwgCisJCQkgICAgJnNvY2syKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlzdGF0dXMgPSAtMTAwOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX2lvcXVldWVfY3JlYXRlKHBvb2wsIDQsICZpb3F1ZXVlKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlzdGF0dXMgPSAtMTEwOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHBqX2J6ZXJvKCZjYiwgc2l6ZW9mKGNiKSk7CisgICAgY2Iub25fZGF0YV9yZWFkID0gJnRjcF9vbl9kYXRhX3JlYWQ7CisgICAgY2Iub25fZGF0YV9zZW50ID0gJnRjcF9vbl9kYXRhX3NlbnQ7CisKKyAgICBzdGF0ZTEgPSBQSl9QT09MX1pBTExPQ19UKHBvb2wsIHN0cnVjdCB0Y3Bfc3RhdGUpOworICAgIHN0YXR1cyA9IHBqX2FjdGl2ZXNvY2tfY3JlYXRlKHBvb2wsIHNvY2sxLCBwal9TT0NLX1NUUkVBTSgpLCBOVUxMLCBpb3F1ZXVlLAorCQkJCSAgJmNiLCBzdGF0ZTEsICZhc29jazEpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXN0YXR1cyA9IC0xMjA7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgc3RhdGUyID0gUEpfUE9PTF9aQUxMT0NfVChwb29sLCBzdHJ1Y3QgdGNwX3N0YXRlKTsKKyAgICBzdGF0dXMgPSBwal9hY3RpdmVzb2NrX2NyZWF0ZShwb29sLCBzb2NrMiwgcGpfU09DS19TVFJFQU0oKSwgTlVMTCwgaW9xdWV1ZSwKKwkJCQkgICZjYiwgc3RhdGUyLCAmYXNvY2syKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlzdGF0dXMgPSAtMTMwOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX2FjdGl2ZXNvY2tfc3RhcnRfcmVhZChhc29jazEsIHBvb2wsIDEwMDAsIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXN0YXR1cyA9IC0xNDA7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogU2VuZCBwYWNrZXQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSAqLworICAgIGZvciAoaT0wOyBpPENPVU5UICYmICFzdGF0ZTEtPmVyciAmJiAhc3RhdGUyLT5lcnI7ICsraSkgeworCXN0cnVjdCB0Y3BfcGt0ICpwa3Q7CisJc3RydWN0IHNlbmRfa2V5IHNlbmRfa2V5WzJdLCAqb3Bfa2V5OworCXBqX3NzaXplX3QgbGVuOworCisJcGt0ID0gKHN0cnVjdCB0Y3BfcGt0KilzdGF0ZTItPnBrdDsKKwlwa3QtPnNpZ25hdHVyZSA9IFNJR05BVFVSRTsKKwlwa3QtPnNlcSA9IGk7CisJcGpfbWVtc2V0KHBrdC0+ZmlsbCwgJ2EnLCBzaXplb2YocGt0LT5maWxsKSk7CisKKwlvcF9rZXkgPSAmc2VuZF9rZXlbaSUyXTsKKwlwal9pb3F1ZXVlX29wX2tleV9pbml0KCZvcF9rZXktPm9wX2tleSwgc2l6ZW9mKCpvcF9rZXkpKTsKKworCXN0YXRlMi0+c2VudCA9IFBKX0ZBTFNFOworCWxlbiA9IHNpemVvZigqcGt0KTsKKwlzdGF0dXMgPSBwal9hY3RpdmVzb2NrX3NlbmQoYXNvY2syLCAmb3Bfa2V5LT5vcF9rZXksIHBrdCwgJmxlbiwgMCk7CisJaWYgKHN0YXR1cyA9PSBQSl9FUEVORElORykgeworCSAgICBkbyB7CisjaWYgUEpfU1lNQklBTgorCQlwal9zeW1iaWFub3NfcG9sbCgtMSwgLTEpOworI2Vsc2UKKwkJcGpfaW9xdWV1ZV9wb2xsKGlvcXVldWUsIE5VTEwpOworI2VuZGlmCisJICAgIH0gd2hpbGUgKCFzdGF0ZTItPnNlbnQpOworCX0gZWxzZSB7CisjaWYgUEpfU1lNQklBTgorCQkvKiBUaGUgU3ltYmlhbiBzb2NrZXQgYWx3YXlzIHJldHVybnMgUEpfU1VDQ0VTUyBmb3IgVENQIHNlbmQsCisJCSAqIGV2ZW50aG91Z2ggdGhlIHJlbW90ZSBlbmQgaGFzbid0IHJlY2VpdmVkIHRoZSBkYXRhIHlldC4KKwkJICogSWYgd2UgY29udGludWUgc2VuZGluZywgZXZlbnR1YWxseSBzZW5kKCkgd2lsbCBibG9jaywKKwkJICogcG9zc2libHkgYmVjYXVzZSB0aGUgc2VuZCBidWZmZXIgaXMgZnVsbC4gU28gd2UgbmVlZCB0bworCQkgKiBwb2xsIHRoZSBpb3F1ZXVlIHBlcmlvZGljYWxseSwgdG8gbGV0IHJlY2VpdmVyIGdldHMgdGhlIAorCQkgKiBkYXRhLgorCQkgKi8KKwkJcGpfc3ltYmlhbm9zX3BvbGwoLTEsIDApOworI2VuZGlmCisJCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQkgICAgUEpfTE9HKDEsKCIiLCAiICAgZXJyOiBzZW5kIHN0YXR1cz0lZCIsIHN0YXR1cykpOworCQkgICAgc3RhdHVzID0gLTE4MDsKKwkJICAgIGJyZWFrOworCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJCSAgICBpZiAobGVuICE9IHNpemVvZigqcGt0KSkgeworCQkJUEpfTE9HKDEsKCIiLCAiICAgZXJyOiBzaG91bGRuJ3QgcmVwb3J0IHBhcnRpYWwgc2VudCIpKTsKKwkJCXN0YXR1cyA9IC0xOTA7CisJCQlicmVhazsKKwkJICAgIH0KKwkJfQorCX0KKworI2lmbmRlZiBQSl9TWU1CSUFOCisJZm9yICg7OykgeworCSAgICBwal90aW1lX3ZhbCB0aW1lb3V0ID0gezAsIDEwfTsKKwkgICAgaWYgKHBqX2lvcXVldWVfcG9sbChpb3F1ZXVlLCAmdGltZW91dCkgPCAxKQorCQlicmVhazsKKwl9CisjZW5kaWYKKworICAgIH0KKworICAgIC8qIFdhaXQgdW50aWwgZXZlcnl0aGluZyBoYXMgYmVlbiBzZW50L3JlY2VpdmVkICovCisgICAgaWYgKHN0YXRlMS0+bmV4dF9yZWN2X3NlcSA8IENPVU5UKSB7CisjaWZkZWYgUEpfU1lNQklBTgorCXdoaWxlIChwal9zeW1iaWFub3NfcG9sbCgtMSwgMTAwMCkgPT0gUEpfVFJVRSkKKwkgICAgOworI2Vsc2UKKwlwal90aW1lX3ZhbCBkZWxheSA9IHswLCAxMDB9OworCXdoaWxlIChwal9pb3F1ZXVlX3BvbGwoaW9xdWV1ZSwgJmRlbGF5KSA+IDApCisJICAgIDsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gUEpfRVBFTkRJTkcpCisJc3RhdHVzID0gUEpfU1VDQ0VTUzsKKworICAgIGlmIChzdGF0dXMgIT0gMCkKKwlnb3RvIG9uX3JldHVybjsKKworICAgIGlmIChzdGF0ZTEtPmVycikgeworCXN0YXR1cyA9IC0xODM7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorICAgIGlmIChzdGF0ZTItPmVycikgeworCXN0YXR1cyA9IC0xODY7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorICAgIGlmIChzdGF0ZTEtPm5leHRfcmVjdl9zZXEgIT0gQ09VTlQpIHsKKwlQSl9MT0coMywoIiIsICIgICBlcnI6IG9ubHkgJXUgcGFja2V0cyByZWNlaXZlZCwgZXhwZWN0aW5nICV1IiwgCisJCSAgICAgIHN0YXRlMS0+bmV4dF9yZWN2X3NlcSwgQ09VTlQpKTsKKwlzdGF0dXMgPSAtMTk1OworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworb25fcmV0dXJuOgorICAgIGlmIChhc29jazIpCisJcGpfYWN0aXZlc29ja19jbG9zZShhc29jazIpOworICAgIGlmIChhc29jazEpCisJcGpfYWN0aXZlc29ja19jbG9zZShhc29jazEpOworICAgIGlmIChpb3F1ZXVlKQorCXBqX2lvcXVldWVfZGVzdHJveShpb3F1ZXVlKTsKKyAgICBpZiAocG9vbCkKKwlwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKworaW50IGFjdGl2ZXNvY2tfdGVzdCh2b2lkKQoreworICAgIGludCByZXQ7CisKKyAgICBQSl9MT0coMywoIiIsICIuLnVkcCBwaW5nL3BvbmcgdGVzdCIpKTsKKyAgICByZXQgPSB1ZHBfcGluZ19wb25nX3Rlc3QoKTsKKyAgICBpZiAocmV0ICE9IDApCisJcmV0dXJuIHJldDsKKworICAgIFBKX0xPRygzLCgiIiwgIi4udGNwIHBlcmYgdGVzdCIpKTsKKyAgICByZXQgPSB0Y3BfcGVyZl90ZXN0KCk7CisgICAgaWYgKHJldCAhPSAwKQorCXJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UJLyogSU5DTFVERV9BQ1RJVkVTT0NLX1RFU1QgKi8KKy8qIFRvIHByZXZlbnQgd2FybmluZyBhYm91dCAidHJhbnNsYXRpb24gdW5pdCBpcyBlbXB0eSIKKyAqIHdoZW4gdGhpcyB0ZXN0IGlzIGRpc2FibGVkLiAKKyAqLworaW50IGR1bW15X2FjdGl2ZV9zb2NrX3Rlc3Q7CisjZW5kaWYJLyogSU5DTFVERV9BQ1RJVkVTT0NLX1RFU1QgKi8KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2F0b21pYy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2F0b21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2RkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvYXRvbWljLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qICRJZDogYXRvbWljLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8cGpsaWIuaD4KKworLyoqCisgKiBccGFnZSBwYWdlX3BqbGliX2F0b21pY190ZXN0IFRlc3Q6IEF0b21pYyBWYXJpYWJsZQorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiBcYiBhdG9taWNfdGVzdCgpLiBJdCB0ZXN0cyB0aGUKKyAqIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGF0b21pYyB2YXJpYWJsZSBBUEkuCisgKgorICogXHNlY3Rpb24gYXRvbWljX3Rlc3Rfc2VjIFNjb3BlIG9mIHRoZSBUZXN0CisgKgorICogQVBJIHRlc3RlZDoKKyAqICAtIHBqX2F0b21pY19jcmVhdGUoKQorICogIC0gcGpfYXRvbWljX2dldCgpCisgKiAgLSBwal9hdG9taWNfaW5jKCkKKyAqICAtIHBqX2F0b21pY19kZWMoKQorICogIC0gcGpfYXRvbWljX3NldCgpCisgKiAgLSBwal9hdG9taWNfZGVzdHJveSgpCisgKgorICoKKyAqIFRoaXMgZmlsZSBpcyA8Yj5wamxpYi10ZXN0L2F0b21pYy5jPC9iPgorICoKKyAqIFxpbmNsdWRlIHBqbGliLXRlc3QvYXRvbWljLmMKKyAqLworCisKKyNpZiBJTkNMVURFX0FUT01JQ19URVNUCisKK2ludCBhdG9taWNfdGVzdCh2b2lkKQoreworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBwal9hdG9taWNfdCAqYXRvbWljX3ZhcjsKKyAgICBwal9zdGF0dXNfdCByYzsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIDQwOTYsIDAsIE5VTEwpOworICAgIGlmICghcG9vbCkKKyAgICAgICAgcmV0dXJuIC0xMDsKKworICAgIC8qIGNyZWF0ZSgpICovCisgICAgcmMgPSBwal9hdG9taWNfY3JlYXRlKHBvb2wsIDExMSwgJmF0b21pY192YXIpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIHJldHVybiAtMjA7CisgICAgfQorCisgICAgLyogZ2V0OiBjaGVjayB0aGUgdmFsdWUuICovCisgICAgaWYgKHBqX2F0b21pY19nZXQoYXRvbWljX3ZhcikgIT0gMTExKQorICAgICAgICByZXR1cm4gLTMwOworCisgICAgLyogaW5jcmVtZW50LiAqLworICAgIHBqX2F0b21pY19pbmMoYXRvbWljX3Zhcik7CisgICAgaWYgKHBqX2F0b21pY19nZXQoYXRvbWljX3ZhcikgIT0gMTEyKQorICAgICAgICByZXR1cm4gLTQwOworCisgICAgLyogZGVjcmVtZW50LiAqLworICAgIHBqX2F0b21pY19kZWMoYXRvbWljX3Zhcik7CisgICAgaWYgKHBqX2F0b21pY19nZXQoYXRvbWljX3ZhcikgIT0gMTExKQorICAgICAgICByZXR1cm4gLTUwOworCisgICAgLyogc2V0ICovCisgICAgcGpfYXRvbWljX3NldChhdG9taWNfdmFyLCAyMTEpOworICAgIGlmIChwal9hdG9taWNfZ2V0KGF0b21pY192YXIpICE9IDIxMSkKKyAgICAgICAgcmV0dXJuIC02MDsKKworICAgIC8qIGFkZCAqLworICAgIHBqX2F0b21pY19hZGQoYXRvbWljX3ZhciwgMTApOworICAgIGlmIChwal9hdG9taWNfZ2V0KGF0b21pY192YXIpICE9IDIyMSkKKyAgICAgICAgcmV0dXJuIC02MDsKKworICAgIC8qIGNoZWNrIHRoZSB2YWx1ZSBhZ2Fpbi4gKi8KKyAgICBpZiAocGpfYXRvbWljX2dldChhdG9taWNfdmFyKSAhPSAyMjEpCisgICAgICAgIHJldHVybiAtNzA7CisKKyAgICAvKiBkZXN0cm95ICovCisgICAgcmMgPSBwal9hdG9taWNfZGVzdHJveShhdG9taWNfdmFyKTsKKyAgICBpZiAocmMgIT0gMCkKKyAgICAgICAgcmV0dXJuIC04MDsKKworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIHJldHVybiAwOworfQorCisKKyNlbHNlCisvKiBUbyBwcmV2ZW50IHdhcm5pbmcgYWJvdXQgInRyYW5zbGF0aW9uIHVuaXQgaXMgZW1wdHkiCisgKiB3aGVuIHRoaXMgdGVzdCBpcyBkaXNhYmxlZC4gCisgKi8KK2ludCBkdW1teV9hdG9taWNfdGVzdDsKKyNlbmRpZiAgLyogSU5DTFVERV9BVE9NSUNfVEVTVCAqLworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvZWNob19jbHQuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9lY2hvX2NsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTI3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvZWNob19jbHQuYwpAQCAtMCwwICsxLDI2OSBAQAorLyogJElkOiBlY2hvX2NsdC5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPHBqbGliLmg+CisKKyNpZiBJTkNMVURFX0VDSE9fQ0xJRU5UCisKK2VudW0geyBCVUZfU0laRSA9IDUxMiB9OworCitzdHJ1Y3QgY2xpZW50Cit7CisgICAgaW50IHNvY2tfdHlwZTsKKyAgICBjb25zdCBjaGFyICpzZXJ2ZXI7CisgICAgaW50IHBvcnQ7Cit9OworCitzdGF0aWMgcGpfYXRvbWljX3QgKnRvdGFsQnl0ZXM7CitzdGF0aWMgcGpfYXRvbWljX3QgKnRpbWVvdXRfY291bnRlcjsKK3N0YXRpYyBwal9hdG9taWNfdCAqaW52YWxpZF9jb3VudGVyOworCisjZGVmaW5lIE1TRUNfUFJJTlRfRFVSQVRJT04gMTAwMAorCitzdGF0aWMgaW50IHdhaXRfc29ja2V0KHBqX3NvY2tfdCBzb2NrLCB1bnNpZ25lZCBtc2VjX3RpbWVvdXQpCit7CisgICAgcGpfZmRfc2V0X3QgZmRzZXQ7CisgICAgcGpfdGltZV92YWwgdGltZW91dDsKKworICAgIHRpbWVvdXQuc2VjID0gMDsKKyAgICB0aW1lb3V0Lm1zZWMgPSBtc2VjX3RpbWVvdXQ7CisgICAgcGpfdGltZV92YWxfbm9ybWFsaXplKCZ0aW1lb3V0KTsKKworICAgIFBKX0ZEX1pFUk8oJmZkc2V0KTsKKyAgICBQSl9GRF9TRVQoc29jaywgJmZkc2V0KTsKKyAgICAKKyAgICByZXR1cm4gcGpfc29ja19zZWxlY3QoRkRfU0VUU0laRSwgJmZkc2V0LCBOVUxMLCBOVUxMLCAmdGltZW91dCk7Cit9CisKK3N0YXRpYyBpbnQgZWNob19jbGllbnRfdGhyZWFkKHZvaWQgKmFyZykKK3sKKyAgICBwal9zb2NrX3Qgc29jazsKKyAgICBjaGFyIHNlbmRfYnVmW0JVRl9TSVpFXTsKKyAgICBjaGFyIHJlY3ZfYnVmW0JVRl9TSVpFXTsKKyAgICBwal9zb2NrYWRkcl9pbiBhZGRyOworICAgIHBqX3N0cl90IHM7CisgICAgcGpfc3RhdHVzX3QgcmM7CisgICAgcGpfdWludDMyX3QgYnVmZmVyX2lkOworICAgIHBqX3VpbnQzMl90IGJ1ZmZlcl9jb3VudGVyOworICAgIHN0cnVjdCBjbGllbnQgKmNsaWVudCA9IGFyZzsKKyAgICBwal9zdGF0dXNfdCBsYXN0X3JlY3ZfZXJyID0gUEpfU1VDQ0VTUywgbGFzdF9zZW5kX2VyciA9IFBKX1NVQ0NFU1M7CisgICAgdW5zaWduZWQgY291bnRlciA9IDA7CisKKyAgICByYyA9IGFwcF9zb2NrZXQocGpfQUZfSU5FVCgpLCBjbGllbnQtPnNvY2tfdHlwZSwgMCwgLTEsICZzb2NrKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi51bmFibGUgdG8gY3JlYXRlIHNvY2tldCIsIHJjKTsKKyAgICAgICAgcmV0dXJuIC0xMDsKKyAgICB9CisKKyAgICByYyA9IHBqX3NvY2thZGRyX2luX2luaXQoICZhZGRyLCBwal9jc3RyKCZzLCBjbGllbnQtPnNlcnZlciksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBqX3VpbnQxNl90KWNsaWVudC0+cG9ydCk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4udW5hYmxlIHRvIHJlc29sdmUgc2VydmVyIiwgcmMpOworICAgICAgICByZXR1cm4gLTE1OworICAgIH0KKworICAgIHJjID0gcGpfc29ja19jb25uZWN0KHNvY2ssICZhZGRyLCBzaXplb2YoYWRkcikpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLmNvbm5lY3QoKSBlcnJvciIsIHJjKTsKKyAgICAgICAgcGpfc29ja19jbG9zZShzb2NrKTsKKyAgICAgICAgcmV0dXJuIC0yMDsKKyAgICB9CisKKyAgICBQSl9MT0coMywoIiIsICIuLi5zb2NrZXQgY29ubmVjdGVkIHRvICVzOiVkIiwgCisJCSAgcGpfaW5ldF9udG9hKGFkZHIuc2luX2FkZHIpLAorCQkgIHBqX250b2hzKGFkZHIuc2luX3BvcnQpKSk7CisKKyAgICBwal9tZW1zZXQoc2VuZF9idWYsICdBJywgQlVGX1NJWkUpOworICAgIHNlbmRfYnVmW0JVRl9TSVpFLTFdPSdcMCc7CisKKyAgICAvKiBHaXZlIG90aGVyIHRocmVhZCBjaGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGVtc2VsdmVzISAqLworICAgIHBqX3RocmVhZF9zbGVlcCgyMDApOworCisgICAgLy9QSl9MT0coMywoIiIsICIuLi50aHJlYWQgJXAgcnVubmluZyIsIHBqX3RocmVhZF90aGlzKCkpKTsKKworICAgIGJ1ZmZlcl9pZCA9IChwal91aW50MzJfdCkgcGpfdGhyZWFkX3RoaXMoKTsKKyAgICBidWZmZXJfY291bnRlciA9IDA7CisKKyAgICAqKHBqX3VpbnQzMl90KilzZW5kX2J1ZiA9IGJ1ZmZlcl9pZDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHJjOworICAgICAgICBwal9zc2l6ZV90IGJ5dGVzOworCisJKytjb3VudGVyOworCisJLy93aGlsZSAod2FpdF9zb2NrZXQoc29jaywwKSA+IDApCisJLy8gICAgOworCisgICAgICAgIC8qIFNlbmQgYSBwYWNrZXQuICovCisgICAgICAgIGJ5dGVzID0gQlVGX1NJWkU7CisJKihwal91aW50MzJfdCopKHNlbmRfYnVmKzQpID0gKytidWZmZXJfY291bnRlcjsKKyAgICAgICAgcmMgPSBwal9zb2NrX3NlbmQoc29jaywgc2VuZF9idWYsICZieXRlcywgMCk7CisgICAgICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTIHx8IGJ5dGVzICE9IEJVRl9TSVpFKSB7CisgICAgICAgICAgICBpZiAocmMgIT0gbGFzdF9zZW5kX2VycikgeworICAgICAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLnNlbmQoKSBlcnJvciIsIHJjKTsKKyAgICAgICAgICAgICAgICBQSl9MT0coMywoIiIsICIuLi5pZ25vcmluZyBzdWJzZXF1ZW50IGVycm9yLi4iKSk7CisgICAgICAgICAgICAgICAgbGFzdF9zZW5kX2VyciA9IHJjOworICAgICAgICAgICAgICAgIHBqX3RocmVhZF9zbGVlcCgxMDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICByYyA9IHdhaXRfc29ja2V0KHNvY2ssIDUwMCk7CisgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICBQSl9MT0coMywoIiIsICIuLi50aW1lb3V0IikpOworCSAgICBieXRlcyA9IDA7CisJICAgIHBqX2F0b21pY19pbmModGltZW91dF9jb3VudGVyKTsKKwl9IGVsc2UgaWYgKHJjIDwgMCkgeworCSAgICByYyA9IHBqX2dldF9uZXRvc19lcnJvcigpOworCSAgICBhcHBfcGVycm9yKCIuLi5zZWxlY3QoKSBlcnJvciIsIHJjKTsKKwkgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBSZWNlaXZlIGJhY2sgdGhlIG9yaWdpbmFsIHBhY2tldC4gKi8KKyAgICAgICAgICAgIGJ5dGVzID0gMDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBwal9zc2l6ZV90IHJlY2VpdmVkID0gQlVGX1NJWkUgLSBieXRlczsKKyAgICAgICAgICAgICAgICByYyA9IHBqX3NvY2tfcmVjdihzb2NrLCByZWN2X2J1ZitieXRlcywgJnJlY2VpdmVkLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUyB8fCByZWNlaXZlZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBsYXN0X3JlY3ZfZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5yZWN2KCkgZXJyb3IiLCByYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBQSl9MT0coMywoIiIsICIuLi5pZ25vcmluZyBzdWJzZXF1ZW50IGVycm9yLi4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3JlY3ZfZXJyID0gcmM7CisgICAgICAgICAgICAgICAgICAgICAgICBwal90aHJlYWRfc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBieXRlcyA9IDA7CisJCSAgICByZWNlaXZlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBieXRlcyArPSByZWNlaXZlZDsKKyAgICAgICAgICAgIH0gd2hpbGUgKGJ5dGVzICE9IEJVRl9TSVpFICYmIGJ5dGVzICE9IDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ5dGVzID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAocGpfbWVtY21wKHNlbmRfYnVmLCByZWN2X2J1ZiwgQlVGX1NJWkUpICE9IDApIHsKKwkgICAgcmVjdl9idWZbQlVGX1NJWkUtMV0gPSAnXDAnOworICAgICAgICAgICAgUEpfTE9HKDMsKCIiLCAiLi4uZXJyb3I6IGJ1ZmZlciAldSBoYXMgY2hhbmdlZCFcbiIKKwkJCSAgInNlbmRfYnVmPSVzXG4iCisJCQkgICJyZWN2X2J1Zj0lc1xuIiwgCisJCQkgIGNvdW50ZXIsIHNlbmRfYnVmLCByZWN2X2J1ZikpOworCSAgICBwal9hdG9taWNfaW5jKGludmFsaWRfY291bnRlcik7CisgICAgICAgIH0KKworICAgICAgICAvKiBBY2N1bXVsYXRlIHRvdGFsIHJlY2VpdmVkLiAqLworCXBqX2F0b21pY19hZGQodG90YWxCeXRlcywgYnl0ZXMpOworICAgIH0KKworICAgIHBqX3NvY2tfY2xvc2Uoc29jayk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBlY2hvX2NsaWVudChpbnQgc29ja190eXBlLCBjb25zdCBjaGFyICpzZXJ2ZXIsIGludCBwb3J0KQoreworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBwal90aHJlYWRfdCAqdGhyZWFkW0VDSE9fQ0xJRU5UX01BWF9USFJFQURTXTsKKyAgICBwal9zdGF0dXNfdCByYzsKKyAgICBzdHJ1Y3QgY2xpZW50IGNsaWVudDsKKyAgICBpbnQgaTsKKyAgICBwal9hdG9taWNfdmFsdWVfdCBsYXN0X3JlY2VpdmVkOworICAgIHBqX3RpbWVzdGFtcCBsYXN0X3JlcG9ydDsKKworICAgIGNsaWVudC5zb2NrX3R5cGUgPSBzb2NrX3R5cGU7CisgICAgY2xpZW50LnNlcnZlciA9IHNlcnZlcjsKKyAgICBjbGllbnQucG9ydCA9IHBvcnQ7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUoIG1lbSwgTlVMTCwgNDAwMCwgNDAwMCwgTlVMTCApOworCisgICAgcmMgPSBwal9hdG9taWNfY3JlYXRlKHBvb2wsIDAsICZ0b3RhbEJ5dGVzKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBQSl9MT0coMywoIiIsICIuLi5lcnJvcjogdW5hYmxlIHRvIGNyZWF0ZSBhdG9taWMgdmFyaWFibGUiLCByYykpOworICAgICAgICByZXR1cm4gLTMwOworICAgIH0KKyAgICByYyA9IHBqX2F0b21pY19jcmVhdGUocG9vbCwgMCwgJmludmFsaWRfY291bnRlcik7CisgICAgcmMgPSBwal9hdG9taWNfY3JlYXRlKHBvb2wsIDAsICZ0aW1lb3V0X2NvdW50ZXIpOworCisgICAgUEpfTE9HKDMsKCIiLCAiRWNobyBjbGllbnQgc3RhcnRlZCIpKTsKKyAgICBQSl9MT0coMywoIiIsICIgIERlc3RpbmF0aW9uOiAlczolZCIsIAorICAgICAgICAgICAgICAgICAgRUNIT19TRVJWRVJfQUREUkVTUywgRUNIT19TRVJWRVJfU1RBUlRfUE9SVCkpOworICAgIFBKX0xPRygzLCgiIiwgIiAgUHJlc3MgQ3RybC1DIHRvIGV4aXQiKSk7CisKKyAgICBmb3IgKGk9MDsgaTxFQ0hPX0NMSUVOVF9NQVhfVEhSRUFEUzsgKytpKSB7CisgICAgICAgIHJjID0gcGpfdGhyZWFkX2NyZWF0ZSggcG9vbCwgTlVMTCwgJmVjaG9fY2xpZW50X3RocmVhZCwgJmNsaWVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfVEhSRUFEX0RFRkFVTFRfU1RBQ0tfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyZWFkW2ldKTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiB1bmFibGUgdG8gY3JlYXRlIHRocmVhZCIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAtMTA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsYXN0X3JlY2VpdmVkID0gMDsKKyAgICBwal9nZXRfdGltZXN0YW1wKCZsYXN0X3JlcG9ydCk7CisKKyAgICBmb3IgKDs7KSB7CisJcGpfdGltZXN0YW1wIG5vdzsKKwl1bnNpZ25lZCBsb25nIHJlY2VpdmVkLCBjdXJfcmVjZWl2ZWQ7CisJdW5zaWduZWQgbXNlYzsKKwlwal9oaWdocHJlY190IGJ3OworCXBqX3RpbWVfdmFsIGVsYXBzZWQ7CisJdW5zaWduZWQgYnczMjsKKwlwal91aW50MzJfdCB0aW1lb3V0LCBpbnZhbGlkOworCisJcGpfdGhyZWFkX3NsZWVwKDEwMDApOworCisJcGpfZ2V0X3RpbWVzdGFtcCgmbm93KTsKKwllbGFwc2VkID0gcGpfZWxhcHNlZF90aW1lKCZsYXN0X3JlcG9ydCwgJm5vdyk7CisJbXNlYyA9IFBKX1RJTUVfVkFMX01TRUMoZWxhcHNlZCk7CisKKwlyZWNlaXZlZCA9IHBqX2F0b21pY19nZXQodG90YWxCeXRlcyk7CisJY3VyX3JlY2VpdmVkID0gcmVjZWl2ZWQgLSBsYXN0X3JlY2VpdmVkOworCQorCWJ3ID0gY3VyX3JlY2VpdmVkOworCXBqX2hpZ2hwcmVjX211bChidywgMTAwMCk7CisJcGpfaGlnaHByZWNfZGl2KGJ3LCBtc2VjKTsKKworCWJ3MzIgPSAodW5zaWduZWQpYnc7CisJCisJbGFzdF9yZXBvcnQgPSBub3c7CisJbGFzdF9yZWNlaXZlZCA9IHJlY2VpdmVkOworCisJdGltZW91dCA9IHBqX2F0b21pY19nZXQodGltZW91dF9jb3VudGVyKTsKKwlpbnZhbGlkID0gcGpfYXRvbWljX2dldChpbnZhbGlkX2NvdW50ZXIpOworCisgICAgICAgIFBKX0xPRygzLCgiIiwgCisJICAgICAgICAgICIuLi4lZCB0aHJlYWRzLCB0b3RhbCBiYW5kd2lkdGg6ICVkIEtCL3MsICIKKwkJICAidGltZW91dD0lZCwgaW52YWxpZD0lZCIsIAorICAgICAgICAgICAgICAgICAgRUNIT19DTElFTlRfTUFYX1RIUkVBRFMsIGJ3MzIvMTAwMCwKKwkJICB0aW1lb3V0LCBpbnZhbGlkKSk7CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8RUNIT19DTElFTlRfTUFYX1RIUkVBRFM7ICsraSkgeworICAgICAgICBwal90aHJlYWRfam9pbiggdGhyZWFkW2ldICk7CisgICAgfQorCisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIHJldHVybiAwOworfQorCisKKyNlbHNlCitpbnQgZHVtbXlfZWNob19jbGllbnQ7CisjZW5kaWYgIC8qIElOQ0xVREVfRUNIT19DTElFTlQgKi8KZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9lcnJuby5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2Vycm5vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmMWZjMgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9lcnJuby5jCkBAIC0wLDAgKzEsMTcyIEBACisvKiAkSWQ6IGVycm5vLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovY3R5cGUuaD4KKyNpbmNsdWRlIDxwai9jb21wYXQvc29ja2V0Lmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisKKyNpZiBJTkNMVURFX0VSUk5PX1RFU1QKKworI2RlZmluZSBUSElTX0ZJTEUgICAiZXJybm8iCisKKyNpZiAoZGVmaW5lZChQSl9XSU4zMikgJiYgUEpfV0lOMzIgIT0gMCkgfHwgXAorICAgIChkZWZpbmVkKFBKX1dJTjY0KSAmJiBQSl9XSU42NCAhPSAwKQorIyAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChQSl9IQVNfRVJSTk9fSCkgJiYgUEpfSEFTX0VSUk5PX0ggIT0gMAorIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworc3RhdGljIHZvaWQgdHJpbV9uZXdsaW5lcyhjaGFyICpzKQoreworICAgIHdoaWxlICgqcykgeworICAgICAgICBpZiAoKnMgPT0gJ1xyJyB8fCAqcyA9PSAnXG4nKQorICAgICAgICAgICAgKnMgPSAnICc7CisgICAgICAgICsrczsKKyAgICB9Cit9CisKK2ludCBteV9zdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGludCBtYXhfbGVuKQoreworICAgIHdoaWxlICgqczEgJiYgKnMyICYmIG1heF9sZW4gPiAwKSB7CisgICAgICAgIGlmIChwal90b2xvd2VyKCpzMSkgIT0gcGpfdG9sb3dlcigqczIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICArK3MxOworICAgICAgICArK3MyOworICAgICAgICAtLW1heF9sZW47CisgICAgfQorICAgIHJldHVybiAwOworfQorCitjb25zdCBjaGFyICpteV9zdHJpc3RyKGNvbnN0IGNoYXIgKndob2xlLCBjb25zdCBjaGFyICpwYXJ0KQoreworICAgIGludCBwYXJ0X2xlbiA9IChpbnQpc3RybGVuKHBhcnQpOworICAgIHdoaWxlICgqd2hvbGUpIHsKKyAgICAgICAgaWYgKG15X3N0cm5jYXNlY21wKHdob2xlLCBwYXJ0LCBwYXJ0X2xlbikgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB3aG9sZTsKKyAgICAgICAgKyt3aG9sZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBlcnJub190ZXN0KHZvaWQpCit7CisgICAgZW51bSB7IENVVCA9IDYgfTsKKyAgICBwal9zdGF0dXNfdCByYyA9IDA7CisgICAgY2hhciBlcnJidWZbMjU2XTsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLi5lcnJubyB0ZXN0OiBjaGVjayB0aGUgbXNnIGNhcmVmdWxseSIpKTsKKworICAgIFBKX1VOVVNFRF9BUkcocmMpOworICAgIAorICAgIC8qIAorICAgICAqIFdpbmRvd3MgcGxhdGZvcm0gZXJyb3IuIAorICAgICAqLworIyAgIGlmZGVmIEVSUk9SX0lOVkFMSURfREFUQQorICAgIHJjID0gUEpfU1RBVFVTX0ZST01fT1MoRVJST1JfSU5WQUxJRF9EQVRBKTsKKyAgICBwal9zZXRfb3NfZXJyb3IocmMpOworCisgICAgLyogV2hvbGUgKi8KKyAgICBwal9zdHJlcnJvcihyYywgZXJyYnVmLCBzaXplb2YoZXJyYnVmKSk7CisgICAgdHJpbV9uZXdsaW5lcyhlcnJidWYpOworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLi5tc2cgZm9yIHJjPUVSUk9SX0lOVkFMSURfREFUQTogJyVzJyIsIGVycmJ1ZikpOworICAgIGlmIChteV9zdHJpc3RyKGVycmJ1ZiwgImludmFsaWQiKSA9PSBOVUxMKSB7CisgICAgICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAKKyAgICAgICAgICAgICAgICAgICAiLi4uZXJyb3I6IGV4cGVjdGluZyBcImludmFsaWRcIiBzdHJpbmcgaW4gdGhlIG1zZyIpKTsKKyNpZm5kZWYgUEpfV0lOMzJfV0lOQ0UKKyAgICAgICAgcmV0dXJuIC0yMDsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIEN1dCB2ZXJzaW9uLiAqLworICAgIHBqX3N0cmVycm9yKHJjLCBlcnJidWYsIENVVCk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLm1zZyBmb3IgcmM9RVJST1JfSU5WQUxJRF9EQVRBIChjdXQpOiAnJXMnIiwgZXJyYnVmKSk7CisjICAgZW5kaWYKKworICAgIC8qCisgICAgICogVW5peCBlcnJvcnMKKyAgICAgKi8KKyMgICBpZiBkZWZpbmVkKEVJTlZBTCkgJiYgIWRlZmluZWQoUEpfU1lNQklBTikKKyAgICByYyA9IFBKX1NUQVRVU19GUk9NX09TKEVJTlZBTCk7CisgICAgcGpfc2V0X29zX2Vycm9yKHJjKTsKKworICAgIC8qIFdob2xlICovCisgICAgcGpfc3RyZXJyb3IocmMsIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpOworICAgIHRyaW1fbmV3bGluZXMoZXJyYnVmKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4ubXNnIGZvciByYz1FSU5WQUw6ICclcyciLCBlcnJidWYpKTsKKyAgICBpZiAobXlfc3RyaXN0cihlcnJidWYsICJpbnZhbGlkIikgPT0gTlVMTCkgeworICAgICAgICBQSl9MT0coMywgKFRISVNfRklMRSwgCisgICAgICAgICAgICAgICAgICAgIi4uLmVycm9yOiBleHBlY3RpbmcgXCJpbnZhbGlkXCIgc3RyaW5nIGluIHRoZSBtc2ciKSk7CisgICAgICAgIHJldHVybiAtMzA7CisgICAgfQorCisgICAgLyogQ3V0ICovCisgICAgcGpfc3RyZXJyb3IocmMsIGVycmJ1ZiwgQ1VUKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4ubXNnIGZvciByYz1FSU5WQUwgKGN1dCk6ICclcyciLCBlcnJidWYpKTsKKyMgICBlbmRpZgorCisgICAgLyogCisgICAgICogV2luZG93cyBXU0EgZXJyb3JzCisgICAgICovCisjICAgaWZkZWYgV1NBRUlOVkFMCisgICAgcmMgPSBQSl9TVEFUVVNfRlJPTV9PUyhXU0FFSU5WQUwpOworICAgIHBqX3NldF9vc19lcnJvcihyYyk7CisKKyAgICAvKiBXaG9sZSAqLworICAgIHBqX3N0cmVycm9yKHJjLCBlcnJidWYsIHNpemVvZihlcnJidWYpKTsKKyAgICB0cmltX25ld2xpbmVzKGVycmJ1Zik7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLm1zZyBmb3IgcmM9V1NBRUlOVkFMOiAnJXMnIiwgZXJyYnVmKSk7CisgICAgaWYgKG15X3N0cmlzdHIoZXJyYnVmLCAiaW52YWxpZCIpID09IE5VTEwpIHsKKyAgICAgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsIAorICAgICAgICAgICAgICAgICAgICIuLi5lcnJvcjogZXhwZWN0aW5nIFwiaW52YWxpZFwiIHN0cmluZyBpbiB0aGUgbXNnIikpOworICAgICAgICByZXR1cm4gLTQwOworICAgIH0KKworICAgIC8qIEN1dCAqLworICAgIHBqX3N0cmVycm9yKHJjLCBlcnJidWYsIENVVCk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLm1zZyBmb3IgcmM9V1NBRUlOVkFMIChjdXQpOiAnJXMnIiwgZXJyYnVmKSk7CisjICAgZW5kaWYKKworICAgIHBqX3N0cmVycm9yKFBKX0VCVUcsIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpOworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLi5tc2cgZm9yIHJjPVBKX0VCVUc6ICclcyciLCBlcnJidWYpKTsKKyAgICBpZiAobXlfc3RyaXN0cihlcnJidWYsICJCVUciKSA9PSBOVUxMKSB7CisgICAgICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAKKyAgICAgICAgICAgICAgICAgICAiLi4uZXJyb3I6IGV4cGVjdGluZyBcIkJVR1wiIHN0cmluZyBpbiB0aGUgbXNnIikpOworICAgICAgICByZXR1cm4gLTIwOworICAgIH0KKworICAgIHBqX3N0cmVycm9yKFBKX0VCVUcsIGVycmJ1ZiwgQ1VUKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4ubXNnIGZvciByYz1QSl9FQlVHLCBjdXQgYXQgJWQgY2hhcnM6ICclcyciLCAKKyAgICAgICAgICAgICAgQ1VULCBlcnJidWYpKTsKKworICAgIC8qIFBlcnJvciAqLworICAgIHBqX3BlcnJvcigzLCBUSElTX0ZJTEUsIFBKX1NVQ0NFU1MsICIuLi50ZXN0aW5nICVzIiwgInBqX3BlcnJvciIpOworICAgIFBKX1BFUlJPUigzLChUSElTX0ZJTEUsIFBKX1NVQ0NFU1MsICIuLi50ZXN0aW5nICVzIiwgIlBKX1BFUlJPUiIpKTsKKworICAgIHJldHVybiAwOworfQorCisKKyNlbmRpZgkvKiBJTkNMVURFX0VSUk5PX1RFU1QgKi8KKworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvZXhjZXB0aW9uLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvZXhjZXB0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0YjFjZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9leGNlcHRpb24uYwpAQCAtMCwwICsxLDI4MiBAQAorLyogJElkOiBleGNlcHRpb24uYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKworCisvKioKKyAqIFxwYWdlIHBhZ2VfcGpsaWJfZXhjZXB0aW9uX3Rlc3QgVGVzdDogRXhjZXB0aW9uIEhhbmRsaW5nCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIFxiIGV4Y2VwdGlvbl90ZXN0KCkuIEl0IHRlc3RzIHRoZQorICogZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIEFQSS4KKyAqCisgKiBAbm90ZSBUaGlzIHRlc3QgdXNlIHN0YXRpYyBJRCBub3QgYWNxdWlyZWQgdGhyb3VnaCBwcm9wZXIgcmVnaXN0cmF0aW9uLgorICogVGhpcyBpcyBub3QgcmVjb21tZW5kZWQsIHNpbmNlIGl0IG1heSBjcmVhdGUgSUQgY29sbGlzc2lvbnMuCisgKgorICogXHNlY3Rpb24gZXhjZXB0aW9uX3Rlc3Rfc2VjIFNjb3BlIG9mIHRoZSBUZXN0CisgKgorICogU29tZSBzY2VuYXJpb3MgdGVzdGVkOgorICogIC0gbm8gZXhjZXB0aW9uIHNpdHVhdGlvbgorICogIC0gYmFzaWMgVFJZL0NBVENICisgKiAgLSBtdWx0aXBsZSBleGNlcHRpb24gaGFuZGxlcnMKKyAqICAtIGRlZmF1bHQgaGFuZGxlcnMKKyAqCisgKgorICogVGhpcyBmaWxlIGlzIDxiPnBqbGliLXRlc3QvZXhjZXB0aW9uLmM8L2I+CisgKgorICogXGluY2x1ZGUgcGpsaWItdGVzdC9leGNlcHRpb24uYworICovCisKKworI2lmIElOQ0xVREVfRVhDRVBUSU9OX1RFU1QKKworI2luY2x1ZGUgPHBqbGliLmg+CisKKyNkZWZpbmUJSURfMQkxCisjZGVmaW5lIElEXzIJMgorCitzdGF0aWMgaW50IHRocm93X2lkXzEodm9pZCkKK3sKKyAgICBQSl9USFJPVyggSURfMSApOworICAgIFBKX1VOUkVBQ0hFRChyZXR1cm4gLTE7KQorfQorCitzdGF0aWMgaW50IHRocm93X2lkXzIodm9pZCkKK3sKKyAgICBQSl9USFJPVyggSURfMiApOworICAgIFBKX1VOUkVBQ0hFRChyZXR1cm4gLTE7KQorfQorCitzdGF0aWMgaW50IHRyeV9jYXRjaF90ZXN0KHZvaWQpCit7CisgICAgUEpfVVNFX0VYQ0VQVElPTjsKKyAgICBpbnQgcmMgPSAtMjAwOworCisgICAgUEpfVFJZIHsKKwlQSl9USFJPVyhJRF8xKTsKKyAgICB9CisgICAgUEpfQ0FUQ0hfQU5ZIHsKKwlyYyA9IDA7CisgICAgfQorICAgIFBKX0VORDsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdGhyb3dfaW5faGFuZGxlcih2b2lkKQoreworICAgIFBKX1VTRV9FWENFUFRJT047CisgICAgaW50IHJjID0gMDsKKworICAgIFBKX1RSWSB7CisJUEpfVEhST1coSURfMSk7CisgICAgfQorICAgIFBKX0NBVENIX0FOWSB7CisJaWYgKFBKX0dFVF9FWENFUFRJT04oKSAhPSBJRF8xKQorCSAgICByYyA9IC0zMDA7CisJZWxzZQorCSAgICBQSl9USFJPVyhJRF8yKTsKKyAgICB9CisgICAgUEpfRU5EOworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCByZXR1cm5faW5faGFuZGxlcih2b2lkKQoreworICAgIFBKX1VTRV9FWENFUFRJT047CisKKyAgICBQSl9UUlkgeworCVBKX1RIUk9XKElEXzEpOworICAgIH0KKyAgICBQSl9DQVRDSF9BTlkgeworCXJldHVybiAwOworICAgIH0KKyAgICBQSl9FTkQ7CisgICAgcmV0dXJuIC00MDA7Cit9CisKKworc3RhdGljIGludCB0ZXN0KHZvaWQpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBQSl9VU0VfRVhDRVBUSU9OOworCisgICAgLyoKKyAgICAgKiBObyBleGNlcHRpb24gc2l0dWF0aW9uLgorICAgICAqLworICAgIFBKX1RSWSB7CisgICAgICAgIHJjID0gcmM7CisgICAgfQorICAgIFBKX0NBVENIX0FOWSB7CisgICAgICAgIHJjID0gLTM7CisgICAgfQorICAgIFBKX0VORDsKKworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworCisgICAgLyoKKyAgICAgKiBCYXNpYyBUUlkvQ0FUQ0gKKyAgICAgKi8gCisgICAgUEpfVFJZIHsKKwlyYyA9IHRocm93X2lkXzEoKTsKKworCS8vIHNob3VsZCBub3QgcmVhY2ggaGVyZS4KKwlyYyA9IC0xMDsKKyAgICB9CisgICAgUEpfQ0FUQ0hfQU5ZIHsKKyAgICAgICAgaW50IGlkID0gUEpfR0VUX0VYQ0VQVElPTigpOworCWlmIChpZCAhPSBJRF8xKSB7CisJICAgIFBKX0xPRygzLCgiIiwgIi4uLmVycm9yOiBnb3QgdW5leHBlY3RlZCBleGNlcHRpb24gJWQgKCVzKSIsIAorCQkgICAgICBpZCwgcGpfZXhjZXB0aW9uX2lkX25hbWUoaWQpKSk7CisJICAgIGlmICghcmMpIHJjID0gLTIwOworCX0KKyAgICB9CisgICAgUEpfRU5EOworCisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisgICAgLyoKKyAgICAgKiBNdWx0aXBsZSBleGNlcHRpb25zIGhhbmRsZXJzCisgICAgICovCisgICAgUEpfVFJZIHsKKwlyYyA9IHRocm93X2lkXzIoKTsKKwkvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUuCisJcmMgPSAtMjU7CisgICAgfQorICAgIFBKX0NBVENIX0FOWSB7CisJc3dpdGNoIChQSl9HRVRfRVhDRVBUSU9OKCkpIHsKKwljYXNlIElEXzE6CisJICAgIGlmICghcmMpIHJjID0gLTMwOyBicmVhazsKKwljYXNlIElEXzI6CisJICAgIGlmICghcmMpIHJjID0gMDsgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgaWYgKCFyYykgcmMgPSAtNDA7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisgICAgUEpfRU5EOworCisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisgICAgLyoKKyAgICAgKiBUZXN0IGRlZmF1bHQgaGFuZGxlci4KKyAgICAgKi8KKyAgICBQSl9UUlkgeworCXJjID0gdGhyb3dfaWRfMSgpOworCS8vIHNob3VsZCBub3QgcmVhY2ggaGVyZQorCXJjID0gLTUwOworICAgIH0KKyAgICBQSl9DQVRDSF9BTlkgeworCXN3aXRjaCAoUEpfR0VUX0VYQ0VQVElPTigpKSB7CisJY2FzZSBJRF8xOgorCSAgICBpZiAoIXJjKSByYyA9IDA7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGlmICghcmMpIHJjID0gLTYwOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIFBKX0VORDsKKworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworICAgIC8qCisgICAgICogTmVzdGVkIGhhbmRsZXJzCisgICAgICovCisgICAgUEpfVFJZIHsKKwlyYyA9IHRyeV9jYXRjaF90ZXN0KCk7CisgICAgfQorICAgIFBKX0NBVENIX0FOWSB7CisJcmMgPSAtNzA7CisgICAgfQorICAgIFBKX0VORDsKKworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworICAgIC8qCisgICAgICogVGhyb3dpbmcgZXhjZXB0aW9uIGluc2lkZSBoYW5kbGVyCisgICAgICovCisgICAgcmMgPSAtODA7CisgICAgUEpfVFJZIHsKKwlpbnQgcmMyOworCXJjMiA9IHRocm93X2luX2hhbmRsZXIoKTsKKwlpZiAocmMyKQorCSAgICByYyA9IHJjMjsKKyAgICB9CisgICAgUEpfQ0FUQ0hfQU5ZIHsKKwlpZiAoUEpfR0VUX0VYQ0VQVElPTigpID09IElEXzIpIHsKKwkgICAgcmMgPSAwOworCX0gZWxzZSB7CisJICAgIHJjID0gLTkwOworCX0KKyAgICB9CisgICAgUEpfRU5EOworCisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisKKyAgICAvKgorICAgICAqIFJldHVybiBmcm9tIGhhbmRsZXIuIFJldHVybmluZyBmcm9tIHRoZSBmdW5jdGlvbiBpbnNpZGUgYSBoYW5kbGVyCisgICAgICogc2hvdWxkIGJlIG9rYXkgKHRob3VnaCByZXR1cm5pbmcgZnJvbSB0aGUgZnVuY3Rpb24gaW5zaWRlIHRoZQorICAgICAqIFBKX1RSWSBibG9jayBJUyBOT1QgT0tBWSEhKS4gV2Ugd2FudCB0byB0ZXN0IHRvIHNlZSBpZiBoYW5kbGVyCisgICAgICogaXMgY2xlYW5lZCB1cCBwcm9wZXJseSwgYnV0IG5vdCBzdXJlIGhvdyB0byBkbyB0aGlzLgorICAgICAqLworICAgIFBKX1RSWSB7CisJaW50IHJjMjsKKwlyYzIgPSByZXR1cm5faW5faGFuZGxlcigpOworCWlmIChyYzIpCisJICAgIHJjID0gcmMyOworICAgIH0KKyAgICBQSl9DQVRDSF9BTlkgeworCXJjID0gLTEwMDsKKyAgICB9CisgICAgUEpfRU5EOworCisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGV4Y2VwdGlvbl90ZXN0KHZvaWQpCit7CisgICAgaW50IGksIHJjOworICAgIGVudW0geyBMT09QID0gMTAgfTsKKworICAgIGZvciAoaT0wOyBpPExPT1A7ICsraSkgeworCWlmICgocmM9dGVzdCgpKSAhPSAwKSB7CisJICAgIFBKX0xPRygzLCgiIiwgIi4uLmZhaWxlZCBhdCBpPSVkIChyYz0lZCkiLCBpLCByYykpOworCSAgICByZXR1cm4gcmM7CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UKKy8qIFRvIHByZXZlbnQgd2FybmluZyBhYm91dCAidHJhbnNsYXRpb24gdW5pdCBpcyBlbXB0eSIKKyAqIHdoZW4gdGhpcyB0ZXN0IGlzIGRpc2FibGVkLiAKKyAqLworaW50IGR1bW15X2V4Y2VwdGlvbl90ZXN0OworI2VuZGlmCS8qIElOQ0xVREVfRVhDRVBUSU9OX1RFU1QgKi8KKworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvZXhjZXB0aW9uX3dyYXAuY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2V4Y2VwdGlvbl93cmFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzViMzFiCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2V4Y2VwdGlvbl93cmFwLmNwcApAQCAtMCwwICsxLDI0IEBACisvKiAkSWQ6IGV4Y2VwdGlvbl93cmFwLmNwcCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhIEMrKyB3cmFwcGVyLCBzZWUgdGlja2V0ICM4ODYgZm9yIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5jIgpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2ZpZm9idWYuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9maWZvYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljM2VlMgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9maWZvYnVmLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qICRJZDogZmlmb2J1Zi5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSAidGVzdC5oIgorCisvKiBUbyBwcmV2ZW50IHdhcm5pbmcgYWJvdXQgInRyYW5zbGF0aW9uIHVuaXQgaXMgZW1wdHkiCisgKiB3aGVuIHRoaXMgdGVzdCBpcyBkaXNhYmxlZC4gCisgKi8KK2ludCBkdW1teV9maWZvYnVmX3Rlc3Q7CisKKyNpZiBJTkNMVURFX0ZJRk9CVUZfVEVTVAorCisjaW5jbHVkZSA8cGpsaWIuaD4KKworaW50IGZpZm9idWZfdGVzdCgpCit7CisgICAgZW51bSB7IFNJWkUgPSAxMDI0LCBNQVhfRU5UUklFUyA9IDEyOCwgCisJICAgTUlOX1NJWkUgPSA0LCBNQVhfU0laRSA9IDY0LCAKKwkgICBMT09QPTEwMDAwIH07CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHBqX2ZpZm9idWZfdCBmaWZvOworICAgIHVuc2lnbmVkIGF2YWlsYWJsZSA9IFNJWkU7CisgICAgdm9pZCAqZW50cmllc1tNQVhfRU5UUklFU107CisgICAgdm9pZCAqYnVmZmVyOworICAgIGludCBpOworCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgTlVMTCwgU0laRSsyNTYsIDAsIE5VTEwpOworICAgIGlmICghcG9vbCkKKwlyZXR1cm4gLTEwOworCisgICAgYnVmZmVyID0gcGpfcG9vbF9hbGxvYyhwb29sLCBTSVpFKTsKKyAgICBpZiAoIWJ1ZmZlcikKKwlyZXR1cm4gLTIwOworCisgICAgcGpfZmlmb2J1Zl9pbml0ICgmZmlmbywgYnVmZmVyLCBTSVpFKTsKKyAgICAKKyAgICAvLyBUZXN0IDEKKyAgICBmb3IgKGk9MDsgaTxMT09QKk1BWF9FTlRSSUVTOyArK2kpIHsKKwlpbnQgc2l6ZTsKKwlpbnQgYywgZjsKKwljID0gaSUyOworCWYgPSAoaSsxKSUyOworCWRvIHsKKwkgICAgc2l6ZSA9IE1JTl9TSVpFKyhwal9yYW5kKCkgJSBNQVhfU0laRSk7CisJICAgIGVudHJpZXNbY10gPSBwal9maWZvYnVmX2FsbG9jICgmZmlmbywgc2l6ZSk7CisJfSB3aGlsZSAoZW50cmllc1tjXSA9PSAwKTsKKwlpZiAoIGkhPTApIHsKKwkgICAgcGpfZmlmb2J1Zl9mcmVlKCZmaWZvLCBlbnRyaWVzW2ZdKTsKKwl9CisgICAgfQorICAgIGlmIChlbnRyaWVzWyhpKzEpJTJdKQorCXBqX2ZpZm9idWZfZnJlZSgmZmlmbywgZW50cmllc1soaSsxKSUyXSk7CisKKyAgICBpZiAocGpfZmlmb2J1Zl9tYXhfc2l6ZSgmZmlmbykgPCBTSVpFLTQpIHsKKwlwal9hc3NlcnQoMCk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIFRlc3QgMgorICAgIGVudHJpZXNbMF0gPSBwal9maWZvYnVmX2FsbG9jICgmZmlmbywgTUlOX1NJWkUpOworICAgIGlmICghZW50cmllc1swXSkgcmV0dXJuIC0xOworICAgIGZvciAoaT0wOyBpPExPT1AqTUFYX0VOVFJJRVM7ICsraSkgeworCWludCBzaXplID0gTUlOX1NJWkUrKHBqX3JhbmQoKSAlIE1BWF9TSVpFKTsKKwllbnRyaWVzWzFdID0gcGpfZmlmb2J1Zl9hbGxvYyAoJmZpZm8sIHNpemUpOworCWlmIChlbnRyaWVzWzFdKQorCSAgICBwal9maWZvYnVmX3VuYWxsb2MoJmZpZm8sIGVudHJpZXNbMV0pOworICAgIH0KKyAgICBwal9maWZvYnVmX3VuYWxsb2MoJmZpZm8sIGVudHJpZXNbMF0pOworICAgIGlmIChwal9maWZvYnVmX21heF9zaXplKCZmaWZvKSA8IFNJWkUtNCkgeworCXBqX2Fzc2VydCgwKTsKKwlyZXR1cm4gLTI7CisgICAgfQorCisgICAgLy8gVGVzdCAzCisgICAgZm9yIChpPTA7IGk8TE9PUDsgKytpKSB7CisJaW50IGNvdW50LCBqOworCWZvciAoY291bnQ9MDsgYXZhaWxhYmxlPj1NSU5fU0laRSs0ICYmIGNvdW50IDwgTUFYX0VOVFJJRVM7KSB7CisJICAgIGludCBzaXplID0gTUlOX1NJWkUrKHBqX3JhbmQoKSAlIE1BWF9TSVpFKTsKKwkgICAgZW50cmllc1tjb3VudF0gPSBwal9maWZvYnVmX2FsbG9jICgmZmlmbywgc2l6ZSk7CisJICAgIGlmIChlbnRyaWVzW2NvdW50XSkgeworCQlhdmFpbGFibGUgLT0gKHNpemUrNCk7CisJCSsrY291bnQ7CisJICAgIH0KKwl9CisJZm9yIChqPTA7IGo8Y291bnQ7ICsraikgeworCSAgICBwal9maWZvYnVmX2ZyZWUgKCZmaWZvLCBlbnRyaWVzW2pdKTsKKwl9CisJYXZhaWxhYmxlID0gU0laRTsKKyAgICB9CisKKyAgICBpZiAocGpfZmlmb2J1Zl9tYXhfc2l6ZSgmZmlmbykgPCBTSVpFLTQpIHsKKwlwal9hc3NlcnQoMCk7CisJcmV0dXJuIC0zOworICAgIH0KKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiBJTkNMVURFX0ZJRk9CVUZfVEVTVCAqLworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9maWxlLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDg2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvZmlsZS5jCkBAIC0wLDAgKzEsMjI1IEBACisvKiAkSWQ6IGZpbGUuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxwamxpYi5oPgorCisjaWYgSU5DTFVERV9GSUxFX1RFU1QKKworI2RlZmluZSBGSUxFTkFNRSAgICAgICAgICAgICAgICAidGVzdGZpbDEudHh0IgorI2RlZmluZSBORVdOQU1FICAgICAgICAgICAgICAgICAidGVzdGZpbDIudHh0IgorI2RlZmluZSBJTkNMVURFX0ZJTEVfVElNRV9URVNUICAwCisKK3N0YXRpYyBjaGFyIGJ1ZmZlclsxMV0gPSB7J0gnLCAnZScsICdsJywgJ2wnLCAnbycsICcgJywKKwkJICAgICAgICAgICdXJywgJ28nLCAncicsICdsJywgJ2QnIH07CisKK3N0YXRpYyBpbnQgZmlsZV90ZXN0X2ludGVybmFsKHZvaWQpCit7CisgICAgZW51bSB7IEZJTEVfTUFYX0FHRSA9IDEwMDAgfTsKKyAgICBwal9vc2hhbmRsZV90IGZkID0gMDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisgICAgY2hhciByZWFkYnVmW3NpemVvZihidWZmZXIpKzE2XTsKKyAgICBwal9maWxlX3N0YXQgc3RhdDsKKyAgICBwal90aW1lX3ZhbCBzdGFydF90aW1lOworICAgIHBqX3NzaXplX3Qgc2l6ZTsKKyAgICBwal9vZmZfdCBwb3M7CisKKyAgICBQSl9MT0coMywoIiIsICIuLmZpbGUgaW8gdGVzdC4uIikpOworCisgICAgLyogR2V0IHRpbWUuICovCisgICAgcGpfZ2V0dGltZW9mZGF5KCZzdGFydF90aW1lKTsKKworICAgIC8qIERlbGV0ZSBvcmlnaW5hbCBmaWxlIGlmIGV4aXN0cy4gKi8KKyAgICBpZiAocGpfZmlsZV9leGlzdHMoRklMRU5BTUUpKQorICAgICAgICBwal9maWxlX2RlbGV0ZShGSUxFTkFNRSk7CisKKyAgICAvKgorICAgICAqIFdyaXRlIGRhdGEgdG8gdGhlIGZpbGUuCisgICAgICovCisgICAgc3RhdHVzID0gcGpfZmlsZV9vcGVuKE5VTEwsIEZJTEVOQU1FLCBQSl9PX1dST05MWSwgJmZkKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZmlsZV9vcGVuKCkgZXJyb3IiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gLTEwOworICAgIH0KKworICAgIHNpemUgPSBzaXplb2YoYnVmZmVyKTsKKyAgICBzdGF0dXMgPSBwal9maWxlX3dyaXRlKGZkLCBidWZmZXIsICZzaXplKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZmlsZV93cml0ZSgpIGVycm9yIiwgc3RhdHVzKTsKKyAgICAgICAgcGpfZmlsZV9jbG9zZShmZCk7CisgICAgICAgIHJldHVybiAtMjA7CisgICAgfQorICAgIGlmIChzaXplICE9IHNpemVvZihidWZmZXIpKQorICAgICAgICByZXR1cm4gLTI1OworCisgICAgc3RhdHVzID0gcGpfZmlsZV9jbG9zZShmZCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLmZpbGVfY2xvc2UoKSBlcnJvciIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiAtMzA7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhlIGZpbGUgZXhpc3RhbmNlIGFuZCBzaXplLiAqLworICAgIGlmICghcGpfZmlsZV9leGlzdHMoRklMRU5BTUUpKQorICAgICAgICByZXR1cm4gLTQwOworCisgICAgaWYgKHBqX2ZpbGVfc2l6ZShGSUxFTkFNRSkgIT0gc2l6ZW9mKGJ1ZmZlcikpCisgICAgICAgIHJldHVybiAtNTA7CisKKyAgICAvKiBHZXQgZmlsZSBzdGF0LiAqLworICAgIHN0YXR1cyA9IHBqX2ZpbGVfZ2V0c3RhdChGSUxFTkFNRSwgJnN0YXQpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC02MDsKKworICAgIC8qIENoZWNrIHN0YXQgc2l6ZS4gKi8KKyAgICBpZiAoc3RhdC5zaXplICE9IHNpemVvZihidWZmZXIpKQorICAgICAgICByZXR1cm4gLTcwOworCisjaWYgSU5DTFVERV9GSUxFX1RJTUVfVEVTVAorICAgIC8qIENoZWNrIGZpbGUgY3JlYXRpb24gdGltZSA+PSBzdGFydF90aW1lLiAqLworICAgIGlmICghUEpfVElNRV9WQUxfR1RFKHN0YXQuY3RpbWUsIHN0YXJ0X3RpbWUpKQorICAgICAgICByZXR1cm4gLTgwOworICAgIC8qIENoZWNrIGZpbGUgY3JlYXRpb24gdGltZSBpcyBub3QgbXVjaCBsYXRlci4gKi8KKyAgICBQSl9USU1FX1ZBTF9TVUIoc3RhdC5jdGltZSwgc3RhcnRfdGltZSk7CisgICAgaWYgKHN0YXQuY3RpbWUuc2VjID4gRklMRV9NQVhfQUdFKQorICAgICAgICByZXR1cm4gLTkwOworCisgICAgLyogQ2hlY2sgZmlsZSBtb2RpZmljYXRpb24gdGltZSA+PSBzdGFydF90aW1lLiAqLworICAgIGlmICghUEpfVElNRV9WQUxfR1RFKHN0YXQubXRpbWUsIHN0YXJ0X3RpbWUpKQorICAgICAgICByZXR1cm4gLTgwOworICAgIC8qIENoZWNrIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgaXMgbm90IG11Y2ggbGF0ZXIuICovCisgICAgUEpfVElNRV9WQUxfU1VCKHN0YXQubXRpbWUsIHN0YXJ0X3RpbWUpOworICAgIGlmIChzdGF0Lm10aW1lLnNlYyA+IEZJTEVfTUFYX0FHRSkKKyAgICAgICAgcmV0dXJuIC05MDsKKworICAgIC8qIENoZWNrIGZpbGUgYWNjZXNzIHRpbWUgPj0gc3RhcnRfdGltZS4gKi8KKyAgICBpZiAoIVBKX1RJTUVfVkFMX0dURShzdGF0LmF0aW1lLCBzdGFydF90aW1lKSkKKyAgICAgICAgcmV0dXJuIC04MDsKKyAgICAvKiBDaGVjayBmaWxlIGFjY2VzcyB0aW1lIGlzIG5vdCBtdWNoIGxhdGVyLiAqLworICAgIFBKX1RJTUVfVkFMX1NVQihzdGF0LmF0aW1lLCBzdGFydF90aW1lKTsKKyAgICBpZiAoc3RhdC5hdGltZS5zZWMgPiBGSUxFX01BWF9BR0UpCisgICAgICAgIHJldHVybiAtOTA7CisjZW5kaWYKKworICAgIC8qCisgICAgICogUmUtb3BlbiB0aGUgZmlsZSBhbmQgcmVhZCBkYXRhLgorICAgICAqLworICAgIHN0YXR1cyA9IHBqX2ZpbGVfb3BlbihOVUxMLCBGSUxFTkFNRSwgUEpfT19SRE9OTFksICZmZCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLmZpbGVfb3BlbigpIGVycm9yIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIC0xMDA7CisgICAgfQorCisgICAgc2l6ZSA9IDA7CisgICAgd2hpbGUgKHNpemUgPCAocGpfc3NpemVfdClzaXplb2YocmVhZGJ1ZikpIHsKKyAgICAgICAgcGpfc3NpemVfdCByZWFkOworICAgICAgICByZWFkID0gMTsKKyAgICAgICAgc3RhdHVzID0gcGpfZmlsZV9yZWFkKGZkLCAmcmVhZGJ1ZltzaXplXSwgJnJlYWQpOworICAgICAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgUEpfTE9HKDMsKCIiLCAiLi4uZXJyb3IgcmVhZGluZyBmaWxlIGFmdGVyICVkIGJ5dGVzIChlcnJvciBmb2xsb3dzKSIsIAorCQkgICAgICBzaXplKSk7CisgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvciIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gLTExMDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAvLyBFT0YKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gcmVhZDsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSAhPSBzaXplb2YoYnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIC0xMjA7CisKKyAgICAvKgorICAgIGlmICghcGpfZmlsZV9lb2YoZmQsIFBKX09fUkRPTkxZKSkKKyAgICAgICAgcmV0dXJuIC0xMzA7CisgICAgICovCisKKyAgICBpZiAocGpfbWVtY21wKHJlYWRidWYsIGJ1ZmZlciwgc2l6ZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xNDA7CisKKyAgICAvKiBTZWVrIHRlc3QuICovCisgICAgc3RhdHVzID0gcGpfZmlsZV9zZXRwb3MoZmQsIDQsIFBKX1NFRUtfU0VUKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZmlsZV9zZXRwb3MoKSBlcnJvciIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiAtMTQxOworICAgIH0KKworICAgIC8qIGdldHBvcyB0ZXN0LiAqLworICAgIHN0YXR1cyA9IHBqX2ZpbGVfZ2V0cG9zKGZkLCAmcG9zKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZmlsZV9nZXRwb3MoKSBlcnJvciIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiAtMTQyOworICAgIH0KKyAgICBpZiAocG9zICE9IDQpCisgICAgICAgIHJldHVybiAtMTQzOworCisgICAgc3RhdHVzID0gcGpfZmlsZV9jbG9zZShmZCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLmZpbGVfY2xvc2UoKSBlcnJvciIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiAtMTUwOworICAgIH0KKworICAgIC8qCisgICAgICogUmVuYW1lIHRlc3QuCisgICAgICovCisgICAgc3RhdHVzID0gcGpfZmlsZV9tb3ZlKEZJTEVOQU1FLCBORVdOQU1FKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZmlsZV9tb3ZlKCkgZXJyb3IiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gLTE2MDsKKyAgICB9CisKKyAgICBpZiAocGpfZmlsZV9leGlzdHMoRklMRU5BTUUpKQorICAgICAgICByZXR1cm4gLTE3MDsKKyAgICBpZiAoIXBqX2ZpbGVfZXhpc3RzKE5FV05BTUUpKQorICAgICAgICByZXR1cm4gLTE4MDsKKworICAgIGlmIChwal9maWxlX3NpemUoTkVXTkFNRSkgIT0gc2l6ZW9mKGJ1ZmZlcikpCisgICAgICAgIHJldHVybiAtMTkwOworCisgICAgLyogRGVsZXRlIHRlc3QuICovCisgICAgc3RhdHVzID0gcGpfZmlsZV9kZWxldGUoTkVXTkFNRSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLmZpbGVfZGVsZXRlKCkgZXJyb3IiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gLTIwMDsKKyAgICB9CisKKyAgICBpZiAocGpfZmlsZV9leGlzdHMoTkVXTkFNRSkpCisgICAgICAgIHJldHVybiAtMjEwOworCisgICAgUEpfTE9HKDMsKCIiLCAiLi4uc3VjY2VzcyIpKTsKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitpbnQgZmlsZV90ZXN0KHZvaWQpCit7CisgICAgaW50IHJjID0gZmlsZV90ZXN0X2ludGVybmFsKCk7CisKKyAgICAvKiBEZWxldGUgdGVzdCBmaWxlIGlmIGV4aXN0cy4gKi8KKyAgICBpZiAocGpfZmlsZV9leGlzdHMoRklMRU5BTUUpKQorICAgICAgICBwal9maWxlX2RlbGV0ZShGSUxFTkFNRSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNlbHNlCitpbnQgZHVtbXlfZmlsZV90ZXN0OworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9oYXNoX3Rlc3QuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9oYXNoX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgxMDdkCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2hhc2hfdGVzdC5jCkBAIC0wLDAgKzEsMTYzIEBACisvKiAkSWQ6IGhhc2hfdGVzdC5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovaGFzaC5oPgorI2luY2x1ZGUgPHBqL3JhbmQuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSAidGVzdC5oIgorCisjaWYgSU5DTFVERV9IQVNIX1RFU1QKKworI2RlZmluZSBIQVNIX0NPVU5UICAzMQorCitzdGF0aWMgaW50IGhhc2hfdGVzdF93aXRoX2tleShwal9wb29sX3QgKnBvb2wsIHVuc2lnbmVkIGNoYXIga2V5KQoreworICAgIHBqX2hhc2hfdGFibGVfdCAqaHQ7CisgICAgdW5zaWduZWQgdmFsdWUgPSAweDEyMzQ1OworICAgIHBqX2hhc2hfaXRlcmF0b3JfdCBpdF9idWYsICppdDsKKyAgICB1bnNpZ25lZCAqZW50cnk7CisKKyAgICBodCA9IHBqX2hhc2hfY3JlYXRlKHBvb2wsIEhBU0hfQ09VTlQpOworICAgIGlmICghaHQpCisJcmV0dXJuIC0xMDsKKworICAgIHBqX2hhc2hfc2V0KHBvb2wsIGh0LCAma2V5LCBzaXplb2Yoa2V5KSwgMCwgJnZhbHVlKTsKKworICAgIGVudHJ5ID0gKHVuc2lnbmVkKikgcGpfaGFzaF9nZXQoaHQsICZrZXksIHNpemVvZihrZXkpLCBOVUxMKTsKKyAgICBpZiAoIWVudHJ5KQorCXJldHVybiAtMjA7CisKKyAgICBpZiAoKmVudHJ5ICE9IHZhbHVlKQorCXJldHVybiAtMzA7CisKKyAgICBpZiAocGpfaGFzaF9jb3VudChodCkgIT0gMSkKKwlyZXR1cm4gLTMwOworCisgICAgaXQgPSBwal9oYXNoX2ZpcnN0KGh0LCAmaXRfYnVmKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKwlyZXR1cm4gLTQwOworCisgICAgZW50cnkgPSAodW5zaWduZWQqKSBwal9oYXNoX3RoaXMoaHQsIGl0KTsKKyAgICBpZiAoIWVudHJ5KQorCXJldHVybiAtNTA7CisKKyAgICBpZiAoKmVudHJ5ICE9IHZhbHVlKQorCXJldHVybiAtNjA7CisKKyAgICBpdCA9IHBqX2hhc2hfbmV4dChodCwgaXQpOworICAgIGlmIChpdCAhPSBOVUxMKQorCXJldHVybiAtNzA7CisKKyAgICAvKiBFcmFzZSBpdGVtICovCisKKyAgICBwal9oYXNoX3NldChOVUxMLCBodCwgJmtleSwgc2l6ZW9mKGtleSksIDAsIE5VTEwpOworCisgICAgaWYgKHBqX2hhc2hfZ2V0KGh0LCAma2V5LCBzaXplb2Yoa2V5KSwgTlVMTCkgIT0gTlVMTCkKKwlyZXR1cm4gLTgwOworCisgICAgaWYgKHBqX2hhc2hfY291bnQoaHQpICE9IDApCisJcmV0dXJuIC05MDsKKworICAgIGl0ID0gcGpfaGFzaF9maXJzdChodCwgJml0X2J1Zik7CisgICAgaWYgKGl0ICE9IE5VTEwpCisJcmV0dXJuIC0xMDA7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhhc2hfY29sbGlzaW9uX3Rlc3QocGpfcG9vbF90ICpwb29sKQoreworICAgIGVudW0geworCUNPVU5UID0gSEFTSF9DT1VOVCAqIDQKKyAgICB9OworICAgIHBqX2hhc2hfdGFibGVfdCAqaHQ7CisgICAgcGpfaGFzaF9pdGVyYXRvcl90IGl0X2J1ZiwgKml0OworICAgIHVuc2lnbmVkIGNoYXIgKnZhbHVlczsKKyAgICB1bnNpZ25lZCBpOworCisgICAgaHQgPSBwal9oYXNoX2NyZWF0ZShwb29sLCBIQVNIX0NPVU5UKTsKKyAgICBpZiAoIWh0KQorCXJldHVybiAtMjAwOworCisgICAgdmFsdWVzID0gKHVuc2lnbmVkIGNoYXIqKSBwal9wb29sX2FsbG9jKHBvb2wsIENPVU5UKTsKKworICAgIGZvciAoaT0wOyBpPENPVU5UOyArK2kpIHsKKwl2YWx1ZXNbaV0gPSAodW5zaWduZWQgY2hhcilpOworCXBqX2hhc2hfc2V0KHBvb2wsIGh0LCAmaSwgc2l6ZW9mKGkpLCAwLCAmdmFsdWVzW2ldKTsKKyAgICB9CisKKyAgICBpZiAocGpfaGFzaF9jb3VudChodCkgIT0gQ09VTlQpCisJcmV0dXJuIC0yMTA7CisKKyAgICBmb3IgKGk9MDsgaTxDT1VOVDsgKytpKSB7CisJdW5zaWduZWQgY2hhciAqZW50cnk7CisJZW50cnkgPSAodW5zaWduZWQgY2hhciopIHBqX2hhc2hfZ2V0KGh0LCAmaSwgc2l6ZW9mKGkpLCBOVUxMKTsKKwlpZiAoIWVudHJ5KQorCSAgICByZXR1cm4gLTIyMDsKKwlpZiAoKmVudHJ5ICE9IHZhbHVlc1tpXSkKKwkgICAgcmV0dXJuIC0yMzA7CisgICAgfQorCisgICAgaSA9IDA7CisgICAgaXQgPSBwal9oYXNoX2ZpcnN0KGh0LCAmaXRfYnVmKTsKKyAgICB3aGlsZSAoaXQpIHsKKwkrK2k7CisJaXQgPSBwal9oYXNoX25leHQoaHQsIGl0KTsKKyAgICB9CisKKyAgICBpZiAoaSAhPSBDT1VOVCkKKwlyZXR1cm4gLTI0MDsKKworICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBIYXNoIHRhYmxlIHRlc3QuCisgKi8KK2ludCBoYXNoX3Rlc3Qodm9pZCkKK3sKKyAgICBwal9wb29sX3QgKnBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sICJoYXNoIiwgNTEyLCA1MTIsIE5VTEwpOworICAgIGludCByYzsKKyAgICB1bnNpZ25lZCBpOworCisgICAgLyogVGVzdCB0byBmaWxsIGluIGVhY2ggcm93IGluIHRoZSB0YWJsZSAqLworICAgIGZvciAoaT0wOyBpPD1IQVNIX0NPVU5UOyArK2kpIHsKKwlyYyA9IGhhc2hfdGVzdF93aXRoX2tleShwb29sLCAodW5zaWduZWQgY2hhcilpKTsKKwlpZiAocmMgIT0gMCkgeworCSAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisJICAgIHJldHVybiByYzsKKwl9CisgICAgfQorCisgICAgLyogQ29sbGlzaW9uIHRlc3QgKi8KKyAgICByYyA9IGhhc2hfY29sbGlzaW9uX3Rlc3QocG9vbCk7CisgICAgaWYgKHJjICE9IDApIHsKKwlwal9wb29sX3JlbGVhc2UocG9vbCk7CisJcmV0dXJuIHJjOworICAgIH0KKworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIElOQ0xVREVfSEFTSF9URVNUICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9pb3FfcGVyZi5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2lvcV9wZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3NzQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9pb3FfcGVyZi5jCkBAIC0wLDAgKzEsNTcyIEBACisvKiAkSWQ6IGlvcV9wZXJmLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPHBqbGliLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L2hpZ2hfcHJlY2lzaW9uLmg+CisKKy8qKgorICogXHBhZ2UgcGFnZV9wamxpYl9pb3F1ZXVlX3BlcmZfdGVzdCBUZXN0OiBJL08gUXVldWUgUGVyZm9ybWFuY2UKKyAqCisgKiBUZXN0IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgSS9PIHF1ZXVlLCB1c2luZyB0eXBpY2FsIHByb2R1Y2VyCisgKiBjb25zdW1lciB0ZXN0LiBUaGUgdGVzdCBzaG91bGQgZXhhbWluZSB0aGUgZWZmZWN0IG9mIHVzaW5nIG11bHRpcGxlCisgKiB0aHJlYWRzIG9uIHRoZSBwZXJmb3JtYW5jZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgPGI+cGpsaWItdGVzdC9pb3FfcGVyZi5jPC9iPgorICoKKyAqIFxpbmNsdWRlIHBqbGliLXRlc3QvaW9xX3BlcmYuYworICovCisKKyNpZiBJTkNMVURFX0lPUVVFVUVfUEVSRl9URVNUCisKKyNpZmRlZiBfTVNDX1ZFUgorIyAgIHByYWdtYSB3YXJuaW5nICggZGlzYWJsZTogNDIwNCkgICAgIC8vIG5vbi1jb25zdGFudCBhZ2dyZWdhdGUgaW5pdGlhbGl6ZXIKKyNlbmRpZgorCisjZGVmaW5lIFRISVNfRklMRQkiaW9xX3BlcmYiCisvLyNkZWZpbmUgVFJBQ0VfKGV4cHIpCVBKX0xPRygzLGV4cHIpCisjZGVmaW5lIFRSQUNFXyhleHByKQorCisKK3N0YXRpYyBwal9ib29sX3QgdGhyZWFkX3F1aXRfZmxhZzsKK3N0YXRpYyBwal9zdGF0dXNfdCBsYXN0X2Vycm9yOworc3RhdGljIHVuc2lnbmVkIGxhc3RfZXJyb3JfY291bnRlcjsKKworLyogRGVzY3JpcHRvciBmb3IgZWFjaCBwcm9kdWNlci9jb25zdW1lciBwYWlyLiAqLwordHlwZWRlZiBzdHJ1Y3QgdGVzdF9pdGVtCit7CisgICAgcGpfc29ja190ICAgICAgICAgICAgc2VydmVyX2ZkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfZmQ7CisgICAgcGpfaW9xdWV1ZV90ICAgICAgICAqaW9xdWV1ZTsKKyAgICBwal9pb3F1ZXVlX2tleV90ICAgICpzZXJ2ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgKmNsaWVudF9rZXk7CisgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAgcmVjdl9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX29wOworICAgIGludCAgICAgICAgICAgICAgICAgIGhhc19wZW5kaW5nX3NlbmQ7CisgICAgcGpfc2l6ZV90ICAgICAgICAgICAgYnVmZmVyX3NpemU7CisgICAgY2hhciAgICAgICAgICAgICAgICAqb3V0Z29pbmdfYnVmZmVyOworICAgIGNoYXIgICAgICAgICAgICAgICAgKmluY29taW5nX2J1ZmZlcjsKKyAgICBwal9zaXplX3QgICAgICAgICAgICBieXRlc19zZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19yZWN2OworfSB0ZXN0X2l0ZW07CisKKy8qIENhbGxiYWNrIHdoZW4gZGF0YSBoYXMgYmVlbiByZWFkLgorICogSW5jcmVtZW50IGl0ZW0tPmJ5dGVzX3JlY3YgYW5kIHJlYWR5IHRvIHJlYWQgdGhlIG5leHQgZGF0YS4KKyAqLworc3RhdGljIHZvaWQgb25fcmVhZF9jb21wbGV0ZShwal9pb3F1ZXVlX2tleV90ICprZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3NzaXplX3QgYnl0ZXNfcmVhZCkKK3sKKyAgICB0ZXN0X2l0ZW0gKml0ZW0gPSAodGVzdF9pdGVtKilwal9pb3F1ZXVlX2dldF91c2VyX2RhdGEoa2V5KTsKKyAgICBwal9zdGF0dXNfdCByYzsKKyAgICBpbnQgZGF0YV9pc19hdmFpbGFibGUgPSAxOworCisgICAgLy9UUkFDRV8oKFRISVNfRklMRSwgIiAgICAgcmVhZCBjb21wbGV0ZSwgYnl0ZXNfcmVhZD0lZCIsIGJ5dGVzX3JlYWQpKTsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKHRocmVhZF9xdWl0X2ZsYWcpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7CisgICAgICAgICAgICBwal9zdGF0dXNfdCByYyA9IChwal9zdGF0dXNfdCktYnl0ZXNfcmVhZDsKKyAgICAgICAgICAgIGNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisKKwkgICAgaWYgKHJjICE9IGxhc3RfZXJyb3IpIHsKKwkgICAgICAgIC8vbGFzdF9lcnJvciA9IHJjOworCSAgICAgICAgcGpfc3RyZXJyb3IocmMsIGVycm1zZywgc2l6ZW9mKGVycm1zZykpOworCSAgICAgICAgUEpfTE9HKDMsKFRISVNfRklMRSwiLi4uZXJyb3I6IHJlYWQgZXJyb3IsIGJ5dGVzX3JlYWQ9JWQgKCVzKSIsIAorCQkgICAgICAgICAgYnl0ZXNfcmVhZCwgZXJybXNnKSk7CisJICAgICAgICBQSl9MT0coMywoVEhJU19GSUxFLCAKKwkJICAgICAgICAgICIuLi4uLmFkZGl0aW9uYWwgaW5mbzogdG90YWwgcmVhZD0ldSwgdG90YWwgc2VudD0ldSIsCisJCSAgICAgICAgICBpdGVtLT5ieXRlc19yZWN2LCBpdGVtLT5ieXRlc19zZW50KSk7CisJICAgIH0gZWxzZSB7CisJICAgICAgICBsYXN0X2Vycm9yX2NvdW50ZXIrKzsKKwkgICAgfQorICAgICAgICAgICAgYnl0ZXNfcmVhZCA9IDA7CisKKyAgICAgICAgfSBlbHNlIGlmIChieXRlc19yZWFkID09IDApIHsKKyAgICAgICAgICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLi5zb2NrZXQgaGFzIGNsb3NlZCEiKSk7CisgICAgICAgIH0KKworICAgICAgICBpdGVtLT5ieXRlc19yZWN2ICs9IGJ5dGVzX3JlYWQ7CisgICAgCisgICAgICAgIC8qIFRvIGFzc3VyZSB0aGF0IHRoZSB0ZXN0IHF1aXRzLCBldmVuIGlmIG1haW4gdGhyZWFkCisgICAgICAgICAqIGRvZXNuJ3QgaGF2ZSB0aW1lIHRvIHJ1bi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChpdGVtLT5ieXRlc19yZWN2ID4gaXRlbS0+YnVmZmVyX3NpemUgKiAxMDAwMCkgCisJICAgIHRocmVhZF9xdWl0X2ZsYWcgPSAxOworCisgICAgICAgIGJ5dGVzX3JlYWQgPSBpdGVtLT5idWZmZXJfc2l6ZTsKKyAgICAgICAgcmMgPSBwal9pb3F1ZXVlX3JlY3YoIGtleSwgb3Bfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+aW5jb21pbmdfYnVmZmVyLCAmYnl0ZXNfcmVhZCwgMCApOworCisgICAgICAgIGlmIChyYyA9PSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICBkYXRhX2lzX2F2YWlsYWJsZSA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAocmMgPT0gUEpfRVBFTkRJTkcpIHsKKyAgICAgICAgICAgIGRhdGFfaXNfYXZhaWxhYmxlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFfaXNfYXZhaWxhYmxlID0gMDsKKwkgICAgaWYgKHJjICE9IGxhc3RfZXJyb3IpIHsKKwkgICAgICAgIGxhc3RfZXJyb3IgPSByYzsKKwkgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiByZWFkIGVycm9yKDEpIiwgcmMpOworCSAgICB9IGVsc2UgeworCSAgICAgICAgbGFzdF9lcnJvcl9jb3VudGVyKys7CisJICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXRlbS0+aGFzX3BlbmRpbmdfc2VuZCkgeworICAgICAgICAgICAgcGpfc3NpemVfdCBzZW50ID0gaXRlbS0+YnVmZmVyX3NpemU7CisgICAgICAgICAgICByYyA9IHBqX2lvcXVldWVfc2VuZChpdGVtLT5jbGllbnRfa2V5LCAmaXRlbS0+c2VuZF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPm91dGdvaW5nX2J1ZmZlciwgJnNlbnQsIDApOworICAgICAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MgJiYgcmMgIT0gUEpfRVBFTkRJTkcpIHsKKyAgICAgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvcjogd3JpdGUgZXJyb3IiLCByYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZW0tPmhhc19wZW5kaW5nX3NlbmQgPSAocmM9PVBKX0VQRU5ESU5HKTsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoZGF0YV9pc19hdmFpbGFibGUpOworfQorCisvKiBDYWxsYmFjayB3aGVuIGRhdGEgaGFzIGJlZW4gd3JpdHRlbi4KKyAqIEluY3JlbWVudCBpdGVtLT5ieXRlc19zZW50IGFuZCB3cml0ZSB0aGUgbmV4dCBkYXRhLgorICovCitzdGF0aWMgdm9pZCBvbl93cml0ZV9jb21wbGV0ZShwal9pb3F1ZXVlX2tleV90ICprZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc3NpemVfdCBieXRlc19zZW50KQoreworICAgIHRlc3RfaXRlbSAqaXRlbSA9ICh0ZXN0X2l0ZW0qKSBwal9pb3F1ZXVlX2dldF91c2VyX2RhdGEoa2V5KTsKKyAgICAKKyAgICAvL1RSQUNFXygoVEhJU19GSUxFLCAiICAgICB3cml0ZSBjb21wbGV0ZTogc2VudCA9ICVkIiwgYnl0ZXNfc2VudCkpOworCisgICAgaWYgKHRocmVhZF9xdWl0X2ZsYWcpCisgICAgICAgIHJldHVybjsKKworICAgIGl0ZW0tPmhhc19wZW5kaW5nX3NlbmQgPSAwOworICAgIGl0ZW0tPmJ5dGVzX3NlbnQgKz0gYnl0ZXNfc2VudDsKKworICAgIGlmIChieXRlc19zZW50IDw9IDApIHsKKyAgICAgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLmVycm9yOiBzZW5kaW5nIHN0b3BwZWQuIGJ5dGVzX3NlbnQ9JWQiLCAKKyAgICAgICAgICAgICAgICAgIGJ5dGVzX3NlbnQpKTsKKyAgICB9IAorICAgIGVsc2UgeworICAgICAgICBwal9zdGF0dXNfdCByYzsKKworICAgICAgICBieXRlc19zZW50ID0gaXRlbS0+YnVmZmVyX3NpemU7CisgICAgICAgIHJjID0gcGpfaW9xdWV1ZV9zZW5kKCBpdGVtLT5jbGllbnRfa2V5LCBvcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5vdXRnb2luZ19idWZmZXIsICZieXRlc19zZW50LCAwKTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MgJiYgcmMgIT0gUEpfRVBFTkRJTkcpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiB3cml0ZSBlcnJvciIsIHJjKTsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZW0tPmhhc19wZW5kaW5nX3NlbmQgPSAocmM9PVBKX0VQRU5ESU5HKTsKKyAgICB9Cit9CisKK3N0cnVjdCB0aHJlYWRfYXJnCit7CisgICAgaW50CQkgIGlkOworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZTsKKyAgICB1bnNpZ25lZAkgIGNvdW50ZXI7Cit9OworCisvKiBUaGUgd29ya2VyIHRocmVhZC4gKi8KK3N0YXRpYyBpbnQgd29ya2VyX3RocmVhZCh2b2lkICpwKQoreworICAgIHN0cnVjdCB0aHJlYWRfYXJnICphcmcgPSAoc3RydWN0IHRocmVhZF9hcmcqKSBwOworICAgIGNvbnN0IHBqX3RpbWVfdmFsIHRpbWVvdXQgPSB7MCwgMTAwfTsKKyAgICBpbnQgcmM7CisKKyAgICB3aGlsZSAoIXRocmVhZF9xdWl0X2ZsYWcpIHsKKworCSsrYXJnLT5jb3VudGVyOworICAgICAgICByYyA9IHBqX2lvcXVldWVfcG9sbChhcmctPmlvcXVldWUsICZ0aW1lb3V0KTsKKwkvL1RSQUNFXygoVEhJU19GSUxFLCAiICAgICB0aHJlYWQ6IHBvbGwgcmV0dXJuZWQgcmM9JWQiLCByYykpOworICAgICAgICBpZiAocmMgPCAwKSB7CisJICAgIGNoYXIgZXJybXNnW1BKX0VSUl9NU0dfU0laRV07CisJICAgIHBqX3N0cmVycm9yKC1yYywgZXJybXNnLCBzaXplb2YoZXJybXNnKSk7CisgICAgICAgICAgICBQSl9MT0coMywgKFRISVNfRklMRSwgCisJCSAgICAgICAiLi4uZXJyb3IgaW4gcGpfaW9xdWV1ZV9wb2xsKCkgaW4gdGhyZWFkICVkICIKKwkJICAgICAgICJhZnRlciAlZCBsb29wOiAlcyBbcGpfc3RhdHVzX3Q9JWRdIiwgCisJCSAgICAgICBhcmctPmlkLCBhcmctPmNvdW50ZXIsIGVycm1zZywgLXJjKSk7CisgICAgICAgICAgICAvL3JldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBiYW5kd2lkdGggZm9yIHRoZSBzcGVjaWZpYyB0ZXN0IGNvbmZpZ3VyYXRpb24uCisgKiBUaGUgdGVzdCBpcyBzaW1wbGU6CisgKiAgLSBjcmVhdGUgc29ja3BhaXJfY250IG51bWJlciBvZiBwcm9kdWNlci1jb25zdW1lciBzb2NrZXQgcGFpci4KKyAqICAtIGNyZWF0ZSB0aHJlYWRfY250IG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcy4KKyAqICAtIGVhY2ggcHJvZHVjZXIgd2lsbCBzZW5kIGJ1ZmZlcl9zaXplIGJ5dGVzIGRhdGEgYXMgZmFzdCBhbmQKKyAqICAgIGFzIHNvb24gYXMgaXQgY2FuLgorICogIC0gZWFjaCBjb25zdW1lciB3aWxsIHJlYWQgYnVmZmVyX3NpemUgYnl0ZXMgb2YgZGF0YSBhcyBmYXN0IAorICogICAgYXMgaXQgY291bGQuCisgKiAgLSBtZWFzdXJlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBieSBhbGwgY29uc3VtZXJzIGR1cmluZyBhCisgKiAgICBwZXJpb2Qgb2YgdGltZS4KKyAqLworc3RhdGljIGludCBwZXJmb3JtX3Rlc3QocGpfYm9vbF90IGFsbG93X2NvbmN1ciwKKwkJCWludCBzb2NrX3R5cGUsIGNvbnN0IGNoYXIgKnR5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHRocmVhZF9jbnQsIHVuc2lnbmVkIHNvY2twYWlyX2NudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBqX3NpemVfdCBidWZmZXJfc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICBwal9zaXplX3QgKnBfYmFuZHdpZHRoKQoreworICAgIGVudW0geyBNU0VDX0RVUkFUSU9OID0gNTAwMCB9OworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICB0ZXN0X2l0ZW0gKml0ZW1zOworICAgIHBqX3RocmVhZF90ICoqdGhyZWFkOworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZTsKKyAgICBwal9zdGF0dXNfdCByYzsKKyAgICBwal9pb3F1ZXVlX2NhbGxiYWNrIGlvcXVldWVfY2FsbGJhY2s7CisgICAgcGpfdWludDMyX3QgdG90YWxfZWxhcHNlZF91c2VjLCB0b3RhbF9yZWNlaXZlZDsKKyAgICBwal9oaWdocHJlY190IGJhbmR3aWR0aDsKKyAgICBwal90aW1lc3RhbXAgc3RhcnQsIHN0b3A7CisgICAgdW5zaWduZWQgaTsKKworICAgIFRSQUNFXygoVEhJU19GSUxFLCAiICAgIHN0YXJ0aW5nIHRlc3QuLiIpKTsKKworICAgIGlvcXVldWVfY2FsbGJhY2sub25fcmVhZF9jb21wbGV0ZSA9ICZvbl9yZWFkX2NvbXBsZXRlOworICAgIGlvcXVldWVfY2FsbGJhY2sub25fd3JpdGVfY29tcGxldGUgPSAmb25fd3JpdGVfY29tcGxldGU7CisKKyAgICB0aHJlYWRfcXVpdF9mbGFnID0gMDsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIDQwOTYsIDQwOTYsIE5VTEwpOworICAgIGlmICghcG9vbCkKKyAgICAgICAgcmV0dXJuIC0xMDsKKworICAgIGl0ZW1zID0gKHRlc3RfaXRlbSopIHBqX3Bvb2xfYWxsb2MocG9vbCwgc29ja3BhaXJfY250KnNpemVvZih0ZXN0X2l0ZW0pKTsKKyAgICB0aHJlYWQgPSAocGpfdGhyZWFkX3QqKikKKyAgICAJICAgICBwal9wb29sX2FsbG9jKHBvb2wsIHRocmVhZF9jbnQqc2l6ZW9mKHBqX3RocmVhZF90KikpOworCisgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIgICAgIGNyZWF0aW5nIGlvcXVldWUuLiIpKTsKKyAgICByYyA9IHBqX2lvcXVldWVfY3JlYXRlKHBvb2wsIHNvY2twYWlyX2NudCoyLCAmaW9xdWV1ZSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3I6IHVuYWJsZSB0byBjcmVhdGUgaW9xdWV1ZSIsIHJjKTsKKyAgICAgICAgcmV0dXJuIC0xNTsKKyAgICB9CisKKyAgICByYyA9IHBqX2lvcXVldWVfc2V0X2RlZmF1bHRfY29uY3VycmVuY3koaW9xdWV1ZSwgYWxsb3dfY29uY3VyKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9pb3F1ZXVlX3NldF9kZWZhdWx0X2NvbmN1cnJlbmN5KCkiLCByYyk7CisgICAgICAgIHJldHVybiAtMTY7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBlYWNoIHByb2R1Y2VyLWNvbnN1bWVyIHBhaXIuICovCisgICAgZm9yIChpPTA7IGk8c29ja3BhaXJfY250OyArK2kpIHsKKyAgICAgICAgcGpfc3NpemVfdCBieXRlczsKKworICAgICAgICBpdGVtc1tpXS5pb3F1ZXVlID0gaW9xdWV1ZTsKKyAgICAgICAgaXRlbXNbaV0uYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKKyAgICAgICAgaXRlbXNbaV0ub3V0Z29pbmdfYnVmZmVyID0gKGNoYXIqKSBwal9wb29sX2FsbG9jKHBvb2wsIGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgaXRlbXNbaV0uaW5jb21pbmdfYnVmZmVyID0gKGNoYXIqKSBwal9wb29sX2FsbG9jKHBvb2wsIGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgaXRlbXNbaV0uYnl0ZXNfcmVjdiA9IGl0ZW1zW2ldLmJ5dGVzX3NlbnQgPSAwOworCisgICAgICAgIC8qIHJhbmRvbWl6ZSBvdXRnb2luZyBidWZmZXIuICovCisgICAgICAgIHBqX2NyZWF0ZV9yYW5kb21fc3RyaW5nKGl0ZW1zW2ldLm91dGdvaW5nX2J1ZmZlciwgYnVmZmVyX3NpemUpOworCisgICAgICAgIC8qIENyZWF0ZSBzb2NrZXQgcGFpci4gKi8KKwlUUkFDRV8oKFRISVNfRklMRSwgIiAgICAgIGNhbGxpbmcgc29ja2V0cGFpci4uIikpOworICAgICAgICByYyA9IGFwcF9zb2NrZXRwYWlyKHBqX0FGX0lORVQoKSwgc29ja190eXBlLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbXNbaV0uc2VydmVyX2ZkLCAmaXRlbXNbaV0uY2xpZW50X2ZkKTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiB1bmFibGUgdG8gY3JlYXRlIHNvY2tldCBwYWlyIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuIC0yMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlZ2lzdGVyIHNlcnZlciBzb2NrZXQgdG8gaW9xdWV1ZS4gKi8KKwlUUkFDRV8oKFRISVNfRklMRSwgIiAgICAgIHJlZ2lzdGVyKDEpLi4iKSk7CisgICAgICAgIHJjID0gcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKHBvb2wsIGlvcXVldWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5zZXJ2ZXJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtc1tpXSwgJmlvcXVldWVfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtc1tpXS5zZXJ2ZXJfa2V5KTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiByZWdpc3RlcmluZyBzZXJ2ZXIgc29ja2V0IHRvIGlvcXVldWUiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLTYwOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVnaXN0ZXIgY2xpZW50IHNvY2tldCB0byBpb3F1ZXVlLiAqLworCVRSQUNFXygoVEhJU19GSUxFLCAiICAgICAgcmVnaXN0ZXIoMikuLiIpKTsKKyAgICAgICAgcmMgPSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2socG9vbCwgaW9xdWV1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmNsaWVudF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1zW2ldLCAgJmlvcXVldWVfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtc1tpXS5jbGllbnRfa2V5KTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiByZWdpc3RlcmluZyBzZXJ2ZXIgc29ja2V0IHRvIGlvcXVldWUiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLTcwOworICAgICAgICB9CisKKyAgICAgICAgLyogU3RhcnQgcmVhZGluZy4gKi8KKwlUUkFDRV8oKFRISVNfRklMRSwgIiAgICAgIHBqX2lvcXVldWVfcmVjdi4uIikpOworICAgICAgICBieXRlcyA9IGl0ZW1zW2ldLmJ1ZmZlcl9zaXplOworICAgICAgICByYyA9IHBqX2lvcXVldWVfcmVjdihpdGVtc1tpXS5zZXJ2ZXJfa2V5LCAmaXRlbXNbaV0ucmVjdl9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uaW5jb21pbmdfYnVmZmVyLCAmYnl0ZXMsCisJCQkgICAgIDApOworICAgICAgICBpZiAocmMgIT0gUEpfRVBFTkRJTkcpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9pb3F1ZXVlX3JlY3YiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLTczOworICAgICAgICB9CisKKyAgICAgICAgLyogU3RhcnQgd3JpdGluZy4gKi8KKwlUUkFDRV8oKFRISVNfRklMRSwgIiAgICAgIHBqX2lvcXVldWVfd3JpdGUuLiIpKTsKKyAgICAgICAgYnl0ZXMgPSBpdGVtc1tpXS5idWZmZXJfc2l6ZTsKKyAgICAgICAgcmMgPSBwal9pb3F1ZXVlX3NlbmQoaXRlbXNbaV0uY2xpZW50X2tleSwgJml0ZW1zW2ldLnNlbmRfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLm91dGdvaW5nX2J1ZmZlciwgJmJ5dGVzLCAwKTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MgJiYgcmMgIT0gUEpfRVBFTkRJTkcpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9pb3F1ZXVlX3dyaXRlIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuIC03NjsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZW1zW2ldLmhhc19wZW5kaW5nX3NlbmQgPSAocmM9PVBKX0VQRU5ESU5HKTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgdGhlIHRocmVhZHMuICovCisgICAgZm9yIChpPTA7IGk8dGhyZWFkX2NudDsgKytpKSB7CisJc3RydWN0IHRocmVhZF9hcmcgKmFyZzsKKworCWFyZyA9IChzdHJ1Y3QgdGhyZWFkX2FyZyopIHBqX3Bvb2xfemFsbG9jKHBvb2wsIHNpemVvZigqYXJnKSk7CisJYXJnLT5pZCA9IGk7CisJYXJnLT5pb3F1ZXVlID0gaW9xdWV1ZTsKKwlhcmctPmNvdW50ZXIgPSAwOworCisgICAgICAgIHJjID0gcGpfdGhyZWFkX2NyZWF0ZSggcG9vbCwgTlVMTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndvcmtlcl90aHJlYWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfVEhSRUFEX0RFRkFVTFRfU1RBQ0tfU0laRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfVEhSRUFEX1NVU1BFTkRFRCwgJnRocmVhZFtpXSApOworICAgICAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3I6IHVuYWJsZSB0byBjcmVhdGUgdGhyZWFkIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuIC04MDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE1hcmsgc3RhcnQgdGltZS4gKi8KKyAgICByYyA9IHBqX2dldF90aW1lc3RhbXAoJnN0YXJ0KTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC05MDsKKworICAgIC8qIFN0YXJ0IHRoZSB0aHJlYWQuICovCisgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIgICAgIHJlc3VtaW5nIGFsbCB0aHJlYWRzLi4iKSk7CisgICAgZm9yIChpPTA7IGk8dGhyZWFkX2NudDsgKytpKSB7CisgICAgICAgIHJjID0gcGpfdGhyZWFkX3Jlc3VtZSh0aHJlYWRbaV0pOworICAgICAgICBpZiAocmMgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTAwOworICAgIH0KKworICAgIC8qIFdhaXQgZm9yIE1TRUNfRFVSQVRJT04gc2Vjb25kcy4gCisgICAgICogVGhpcyBzaG91bGQgYmUgYXMgc2ltcGxlIGFzIHBqX3RocmVhZF9zbGVlcChNU0VDX0RVUkFUSU9OKSBhY3R1YWxseSwKKyAgICAgKiBidXQgdW5mb3J0dW5hdGVseSBpdCBkb2Vzbid0IHdvcmsgd2hlbiBzeXN0ZW0gZG9lc24ndCBlbXBsb3kKKyAgICAgKiB0aW1lc2xpY2luZyBmb3IgdGhyZWFkcy4KKyAgICAgKi8KKyAgICBUUkFDRV8oKFRISVNfRklMRSwgIiAgICAgd2FpdCBmb3IgZmV3IHNlY29uZHMuLiIpKTsKKyAgICBkbyB7CisJcGpfdGhyZWFkX3NsZWVwKDEpOworCisJLyogTWFyayBlbmQgdGltZS4gKi8KKwlyYyA9IHBqX2dldF90aW1lc3RhbXAoJnN0b3ApOworCisJaWYgKHRocmVhZF9xdWl0X2ZsYWcpIHsKKwkgICAgVFJBQ0VfKChUSElTX0ZJTEUsICIgICAgICB0cmFuc2ZlciBsaW1pdCByZWFjaGVkLi4iKSk7CisJICAgIGJyZWFrOworCX0KKworCWlmIChwal9lbGFwc2VkX3VzZWMoJnN0YXJ0LCZzdG9wKTxNU0VDX0RVUkFUSU9OICogMTAwMCkgeworCSAgICBUUkFDRV8oKFRISVNfRklMRSwgIiAgICAgIHRpbWUgbGltaXQgcmVhY2hlZC4uIikpOworCSAgICBicmVhazsKKwl9CisKKyAgICB9IHdoaWxlICgxKTsKKworICAgIC8qIFRlcm1pbmF0ZSBhbGwgdGhyZWFkcy4gKi8KKyAgICBUUkFDRV8oKFRISVNfRklMRSwgIiAgICAgdGVybWluYXRpbmcgYWxsIHRocmVhZHMuLiIpKTsKKyAgICB0aHJlYWRfcXVpdF9mbGFnID0gMTsKKworICAgIGZvciAoaT0wOyBpPHRocmVhZF9jbnQ7ICsraSkgeworCVRSQUNFXygoVEhJU19GSUxFLCAiICAgICAgam9pbiB0aHJlYWQgJWQuLiIsIGkpKTsKKyAgICAgICAgcGpfdGhyZWFkX2pvaW4odGhyZWFkW2ldKTsKKyAgICB9CisKKyAgICAvKiBDbG9zZSBhbGwgc29ja2V0cy4gKi8KKyAgICBUUkFDRV8oKFRISVNfRklMRSwgIiAgICAgY2xvc2luZyBhbGwgc29ja2V0cy4uIikpOworICAgIGZvciAoaT0wOyBpPHNvY2twYWlyX2NudDsgKytpKSB7CisgICAgICAgIHBqX2lvcXVldWVfdW5yZWdpc3RlcihpdGVtc1tpXS5zZXJ2ZXJfa2V5KTsKKyAgICAgICAgcGpfaW9xdWV1ZV91bnJlZ2lzdGVyKGl0ZW1zW2ldLmNsaWVudF9rZXkpOworICAgIH0KKworICAgIC8qIERlc3Ryb3kgdGhyZWFkcyAqLworICAgIGZvciAoaT0wOyBpPHRocmVhZF9jbnQ7ICsraSkgeworICAgICAgICBwal90aHJlYWRfZGVzdHJveSh0aHJlYWRbaV0pOworICAgIH0KKworICAgIC8qIERlc3Ryb3kgaW9xdWV1ZS4gKi8KKyAgICBUUkFDRV8oKFRISVNfRklMRSwgIiAgICAgZGVzdHJveWluZyBpb3F1ZXVlLi4iKSk7CisgICAgcGpfaW9xdWV1ZV9kZXN0cm95KGlvcXVldWUpOworCisgICAgLyogQ2FsY3VsYXRlIGFjdHVhbCB0aW1lIGluIHVzZWMuICovCisgICAgdG90YWxfZWxhcHNlZF91c2VjID0gcGpfZWxhcHNlZF91c2VjKCZzdGFydCwgJnN0b3ApOworCisgICAgLyogQ2FsY3VsYXRlIHRvdGFsIGJ5dGVzIHJlY2VpdmVkLiAqLworICAgIHRvdGFsX3JlY2VpdmVkID0gMDsKKyAgICBmb3IgKGk9MDsgaTxzb2NrcGFpcl9jbnQ7ICsraSkgeworICAgICAgICB0b3RhbF9yZWNlaXZlZCA9IChwal91aW50MzJfdClpdGVtc1tpXS5ieXRlc19yZWN2OworICAgIH0KKworICAgIC8qIGJhbmR3aWR0aCA9IHRvdGFsX3JlY2VpdmVkKjEwMDAvdG90YWxfZWxhcHNlZF91c2VjICovCisgICAgYmFuZHdpZHRoID0gdG90YWxfcmVjZWl2ZWQ7CisgICAgcGpfaGlnaHByZWNfbXVsKGJhbmR3aWR0aCwgMTAwMCk7CisgICAgcGpfaGlnaHByZWNfZGl2KGJhbmR3aWR0aCwgdG90YWxfZWxhcHNlZF91c2VjKTsKKyAgICAKKyAgICAqcF9iYW5kd2lkdGggPSAocGpfdWludDMyX3QpYmFuZHdpZHRoOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgICUuNHMgICAgJTJkICAgICAgICAlMmQgICAgICAgJThkIEtCL3MiLAorICAgICAgICAgICAgICB0eXBlX25hbWUsIHRocmVhZF9jbnQsIHNvY2twYWlyX2NudCwKKyAgICAgICAgICAgICAgKnBfYmFuZHdpZHRoKSk7CisKKyAgICAvKiBEb25lLiAqLworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIFRSQUNFXygoVEhJU19GSUxFLCAiICAgIGRvbmUuLiIpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb3F1ZXVlX3BlcmZfdGVzdF9pbXAocGpfYm9vbF90IGFsbG93X2NvbmN1cikKK3sKKyAgICBlbnVtIHsgQlVGX1NJWkUgPSA1MTIgfTsKKyAgICBpbnQgaSwgcmM7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICAgICAgY29uc3QgY2hhciAqdHlwZV9uYW1lOworICAgICAgICBpbnQgICAgICAgICB0aHJlYWRfY250OworICAgICAgICBpbnQgICAgICAgICBzb2NrcGFpcl9jbnQ7CisgICAgfSB0ZXN0X3BhcmFtW10gPSAKKyAgICB7CisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMSwgMX0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMSwgMn0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMSwgNH0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMSwgOH0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMiwgMX0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMiwgMn0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMiwgNH0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMiwgOH0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgNCwgMX0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgNCwgMn0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgNCwgNH0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgNCwgOH0sCisgICAgICAgIHsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgNCwgMTZ9LAorICAgICAgICB7IHBqX1NPQ0tfU1RSRUFNKCksICJ0Y3AiLCAxLCAxfSwKKyAgICAgICAgeyBwal9TT0NLX1NUUkVBTSgpLCAidGNwIiwgMSwgMn0sCisgICAgICAgIHsgcGpfU09DS19TVFJFQU0oKSwgInRjcCIsIDEsIDR9LAorICAgICAgICB7IHBqX1NPQ0tfU1RSRUFNKCksICJ0Y3AiLCAxLCA4fSwKKyAgICAgICAgeyBwal9TT0NLX1NUUkVBTSgpLCAidGNwIiwgMiwgMX0sCisgICAgICAgIHsgcGpfU09DS19TVFJFQU0oKSwgInRjcCIsIDIsIDJ9LAorICAgICAgICB7IHBqX1NPQ0tfU1RSRUFNKCksICJ0Y3AiLCAyLCA0fSwKKyAgICAgICAgeyBwal9TT0NLX1NUUkVBTSgpLCAidGNwIiwgMiwgOH0sCisgICAgICAgIHsgcGpfU09DS19TVFJFQU0oKSwgInRjcCIsIDQsIDF9LAorICAgICAgICB7IHBqX1NPQ0tfU1RSRUFNKCksICJ0Y3AiLCA0LCAyfSwKKyAgICAgICAgeyBwal9TT0NLX1NUUkVBTSgpLCAidGNwIiwgNCwgNH0sCisgICAgICAgIHsgcGpfU09DS19TVFJFQU0oKSwgInRjcCIsIDQsIDh9LAorICAgICAgICB7IHBqX1NPQ0tfU1RSRUFNKCksICJ0Y3AiLCA0LCAxNn0sCisvKgorCXsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMzIsIDF9LAorCXsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMzIsIDF9LAorCXsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMzIsIDF9LAorCXsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMzIsIDF9LAorCXsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMSwgMzJ9LAorCXsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMSwgMzJ9LAorCXsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMSwgMzJ9LAorCXsgcGpfU09DS19ER1JBTSgpLCAidWRwIiwgMSwgMzJ9LAorCXsgcGpfU09DS19TVFJFQU0oKSwgInRjcCIsIDMyLCAxfSwKKwl7IHBqX1NPQ0tfU1RSRUFNKCksICJ0Y3AiLCAzMiwgMX0sCisJeyBwal9TT0NLX1NUUkVBTSgpLCAidGNwIiwgMzIsIDF9LAorCXsgcGpfU09DS19TVFJFQU0oKSwgInRjcCIsIDMyLCAxfSwKKwl7IHBqX1NPQ0tfU1RSRUFNKCksICJ0Y3AiLCAxLCAzMn0sCisJeyBwal9TT0NLX1NUUkVBTSgpLCAidGNwIiwgMSwgMzJ9LAorCXsgcGpfU09DS19TVFJFQU0oKSwgInRjcCIsIDEsIDMyfSwKKwl7IHBqX1NPQ0tfU1RSRUFNKCksICJ0Y3AiLCAxLCAzMn0sCisqLworICAgIH07CisgICAgcGpfc2l6ZV90IGJlc3RfYmFuZHdpZHRoOworICAgIGludCBiZXN0X2luZGV4ID0gMDsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIgICBCZW5jaG1hcmtpbmcgJXMgaW9xdWV1ZToiLCBwal9pb3F1ZXVlX25hbWUoKSkpOworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIgICBUZXN0aW5nIHdpdGggY29uY3VyZW5jeT0lZCIsIGFsbG93X2NvbmN1cikpOworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgIFR5cGUgIFRocmVhZHMgIFNrdC5QYWlycyAgICAgIEJhbmR3aWR0aCIpKTsKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikpOworCisgICAgYmVzdF9iYW5kd2lkdGggPSAwOworICAgIGZvciAoaT0wOyBpPChpbnQpKHNpemVvZih0ZXN0X3BhcmFtKS9zaXplb2YodGVzdF9wYXJhbVswXSkpOyArK2kpIHsKKyAgICAgICAgcGpfc2l6ZV90IGJhbmR3aWR0aDsKKworICAgICAgICByYyA9IHBlcmZvcm1fdGVzdChhbGxvd19jb25jdXIsCisJCQkgIHRlc3RfcGFyYW1baV0udHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcGFyYW1baV0udHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcmFtW2ldLnRocmVhZF9jbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3BhcmFtW2ldLnNvY2twYWlyX2NudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJVRl9TSVpFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbmR3aWR0aCk7CisgICAgICAgIGlmIChyYyAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIHJjOworCisgICAgICAgIGlmIChiYW5kd2lkdGggPiBiZXN0X2JhbmR3aWR0aCkKKyAgICAgICAgICAgIGJlc3RfYmFuZHdpZHRoID0gYmFuZHdpZHRoLCBiZXN0X2luZGV4ID0gaTsKKworICAgICAgICAvKiBHaXZlIGl0IGEgcmVzdCBiZWZvcmUgbmV4dCB0ZXN0LCB0byBhbGxvdyBzeXN0ZW0gdG8gY2xvc2UgdGhlCisJICogc29ja2V0cyBwcm9wZXJseS4gCisJICovCisgICAgICAgIHBqX3RocmVhZF9zbGVlcCg1MDApOworICAgIH0KKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsIAorICAgICAgICAgICAgICAiICAgQmVzdDogVHlwZT0lcyBUaHJlYWRzPSVkLCBTa3QuUGFpcnM9JWQsIEJhbmR3aWR0aD0ldSBLQi9zIiwKKyAgICAgICAgICAgICAgdGVzdF9wYXJhbVtiZXN0X2luZGV4XS50eXBlX25hbWUsCisgICAgICAgICAgICAgIHRlc3RfcGFyYW1bYmVzdF9pbmRleF0udGhyZWFkX2NudCwKKyAgICAgICAgICAgICAgdGVzdF9wYXJhbVtiZXN0X2luZGV4XS5zb2NrcGFpcl9jbnQsCisgICAgICAgICAgICAgIGJlc3RfYmFuZHdpZHRoKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgIChOb3RlOiBwYWNrZXQgc2l6ZT0lZCwgdG90YWwgZXJyb3JzPSV1KSIsIAorCQkJIEJVRl9TSVpFLCBsYXN0X2Vycm9yX2NvdW50ZXIpKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIG1haW4gdGVzdCBlbnRyeS4KKyAqLworaW50IGlvcXVldWVfcGVyZl90ZXN0KHZvaWQpCit7CisgICAgaW50IHJjOworCisgICAgcmMgPSBpb3F1ZXVlX3BlcmZfdGVzdF9pbXAoUEpfVFJVRSk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisgICAgcmMgPSBpb3F1ZXVlX3BlcmZfdGVzdF9pbXAoUEpfRkFMU0UpOworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworICAgIHJldHVybiAwOworfQorCisjZWxzZQorLyogVG8gcHJldmVudCB3YXJuaW5nIGFib3V0ICJ0cmFuc2xhdGlvbiB1bml0IGlzIGVtcHR5IgorICogd2hlbiB0aGlzIHRlc3QgaXMgZGlzYWJsZWQuIAorICovCitpbnQgZHVtbXlfdWlxX3BlcmZfdGVzdDsKKyNlbmRpZiAgLyogSU5DTFVERV9JT1FVRVVFX1BFUkZfVEVTVCAqLworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9pb3FfdGNwLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvaW9xX3RjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOWUxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvaW9xX3RjcC5jCkBAIC0wLDAgKzEsOTcyIEBACisvKiAkSWQ6IGlvcV90Y3AuYyA0NTUwIDIwMTMtMDctMDIgMTE6NDU6NTdaIHJpemEgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJ0ZXN0LmgiCisKKy8qKgorICogXHBhZ2UgcGFnZV9wamxpYl9pb3F1ZXVlX3RjcF90ZXN0IFRlc3Q6IEkvTyBRdWV1ZSAoVENQKQorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbiB0byB0ZXN0IHRoZQorICogZnVuY3Rpb25hbGl0eSBvZiB0aGUgSS9PIHF1ZXVlIHdoZW4gVENQIHNvY2tldCBpcyB1c2VkLgorICoKKyAqCisgKiBUaGlzIGZpbGUgaXMgPGI+cGpsaWItdGVzdC9pb3FfdGNwLmM8L2I+CisgKgorICogXGluY2x1ZGUgcGpsaWItdGVzdC9pb3FfdGNwLmMKKyAqLworCisKKyNpZiBJTkNMVURFX1RDUF9JT1FVRVVFX1RFU1QKKworI2luY2x1ZGUgPHBqbGliLmg+CisKKyNpZiBQSl9IQVNfVENQCisKKyNkZWZpbmUgVEhJU19GSUxFCSAgICAidGVzdF90Y3AiCisjZGVmaW5lIE5PTl9FWElTVEFOVF9QT1JUICAgNTAxMjMKKyNkZWZpbmUgTE9PUAkJICAgIDEwMAorI2RlZmluZSBCVUZfTUlOX1NJWkUJICAgIDMyCisjZGVmaW5lIEJVRl9NQVhfU0laRQkgICAgMjA0OAorI2RlZmluZSBTT0NLX0lOQUNUSVZFX01JTiAgICg0LTIpCisjZGVmaW5lIFNPQ0tfSU5BQ1RJVkVfTUFYICAgKFBKX0lPUVVFVUVfTUFYX0hBTkRMRVMgLSAyKQorI2RlZmluZSBQT09MX1NJWkUJICAgICgyKkJVRl9NQVhfU0laRSArIFNPQ0tfSU5BQ1RJVkVfTUFYKjEyOCArIDIwNDgpCisKK3N0YXRpYyBwal9zc2l6ZV90CSAgICAgY2FsbGJhY2tfcmVhZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja193cml0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19hY2NlcHRfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19jb25uZWN0X3N0YXR1czsKK3N0YXRpYyB1bnNpZ25lZAkJICAgICBjYWxsYmFja19jYWxsX2NvdW50Oworc3RhdGljIHBqX2lvcXVldWVfa2V5X3QgICAgICpjYWxsYmFja19yZWFkX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2FsbGJhY2tfd3JpdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjYWxsYmFja19hY2NlcHRfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjYWxsYmFja19jb25uZWN0X2tleTsKK3N0YXRpYyBwal9pb3F1ZXVlX29wX2tleV90ICAqY2FsbGJhY2tfcmVhZF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2FsbGJhY2tfd3JpdGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNhbGxiYWNrX2FjY2VwdF9vcDsKKworc3RhdGljIHZvaWQgb25faW9xdWV1ZV9yZWFkKHBqX2lvcXVldWVfa2V5X3QgKmtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3NzaXplX3QgYnl0ZXNfcmVhZCkKK3sKKyAgICBjYWxsYmFja19yZWFkX2tleSA9IGtleTsKKyAgICBjYWxsYmFja19yZWFkX29wID0gb3Bfa2V5OworICAgIGNhbGxiYWNrX3JlYWRfc2l6ZSA9IGJ5dGVzX3JlYWQ7CisgICAgY2FsbGJhY2tfY2FsbF9jb3VudCsrOworfQorCitzdGF0aWMgdm9pZCBvbl9pb3F1ZXVlX3dyaXRlKHBqX2lvcXVldWVfa2V5X3QgKmtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc3NpemVfdCBieXRlc193cml0dGVuKQoreworICAgIGNhbGxiYWNrX3dyaXRlX2tleSA9IGtleTsKKyAgICBjYWxsYmFja193cml0ZV9vcCA9IG9wX2tleTsKKyAgICBjYWxsYmFja193cml0ZV9zaXplID0gYnl0ZXNfd3JpdHRlbjsKKyAgICBjYWxsYmFja19jYWxsX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkIG9uX2lvcXVldWVfYWNjZXB0KHBqX2lvcXVldWVfa2V5X3QgKmtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zb2NrX3Qgc29jaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKQoreworICAgIGlmIChzb2NrID09IFBKX0lOVkFMSURfU09DS0VUKSB7CisKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgLyogSWdub3JlLiBDb3VsZCBiZSBibG9ja2luZyBlcnJvciAqLworCSAgICBhcHBfcGVycm9yKCIuLi4uLndhcm5pbmc6IHJlY2VpdmVkIGVycm9yIGluIG9uX2lvcXVldWVfYWNjZXB0KCkgY2FsbGJhY2siLAorCQkgICAgICAgc3RhdHVzKTsKKwl9IGVsc2UgeworCSAgICBjYWxsYmFja19hY2NlcHRfc3RhdHVzID0gLTYxOworCSAgICBQSl9MT0coMywoIiIsICIuLi4uLiBvbl9pb3F1ZXVlX2FjY2VwdCgpIGNhbGxiYWNrIHdhcyBnaXZlbiAiCisJCQkgICJpbnZhbGlkIHNvY2tldCBhbmQgc3RhdHVzIGlzICVkIiwgc3RhdHVzKSk7CisJfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBqX3NvY2thZGRyIGFkZHI7CisgICAgICAgIGludCBjbGllbnRfYWRkcl9sZW47CisKKyAgICAgICAgY2xpZW50X2FkZHJfbGVuID0gc2l6ZW9mKGFkZHIpOworICAgICAgICBzdGF0dXMgPSBwal9zb2NrX2dldHNvY2tuYW1lKHNvY2ssICZhZGRyLCAmY2xpZW50X2FkZHJfbGVuKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5FUlJPUiBpbiBwal9zb2NrX2dldHNvY2tuYW1lKCkiLCBzdGF0dXMpOworICAgICAgICB9CisKKwljYWxsYmFja19hY2NlcHRfa2V5ID0ga2V5OworCWNhbGxiYWNrX2FjY2VwdF9vcCA9IG9wX2tleTsKKwljYWxsYmFja19hY2NlcHRfc3RhdHVzID0gc3RhdHVzOworCWNhbGxiYWNrX2NhbGxfY291bnQrKzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9uX2lvcXVldWVfY29ubmVjdChwal9pb3F1ZXVlX2tleV90ICprZXksIGludCBzdGF0dXMpCit7CisgICAgY2FsbGJhY2tfY29ubmVjdF9rZXkgPSBrZXk7CisgICAgY2FsbGJhY2tfY29ubmVjdF9zdGF0dXMgPSBzdGF0dXM7CisgICAgY2FsbGJhY2tfY2FsbF9jb3VudCsrOworfQorCitzdGF0aWMgcGpfaW9xdWV1ZV9jYWxsYmFjayB0ZXN0X2NiID0gCit7CisgICAgJm9uX2lvcXVldWVfcmVhZCwKKyAgICAmb25faW9xdWV1ZV93cml0ZSwKKyAgICAmb25faW9xdWV1ZV9hY2NlcHQsCisgICAgJm9uX2lvcXVldWVfY29ubmVjdCwKK307CisKK3N0YXRpYyBpbnQgc2VuZF9yZWN2X3Rlc3QocGpfaW9xdWV1ZV90ICppb3F1ZSwKKwkJCSAgcGpfaW9xdWV1ZV9rZXlfdCAqc2tleSwKKwkJCSAgcGpfaW9xdWV1ZV9rZXlfdCAqY2tleSwKKwkJCSAgdm9pZCAqc2VuZF9idWYsCisJCQkgIHZvaWQgKnJlY3ZfYnVmLAorCQkJICBwal9zc2l6ZV90IGJ1ZnNpemUsCisJCQkgIHBqX3RpbWVzdGFtcCAqdF9lbGFwc2VkKQoreworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBwal9zc2l6ZV90IGJ5dGVzOworICAgIHBqX3RpbWVfdmFsIHRpbWVvdXQ7CisgICAgcGpfdGltZXN0YW1wIHQxLCB0MjsKKyAgICBpbnQgcGVuZGluZ19vcCA9IDA7CisgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCByZWFkX29wLCB3cml0ZV9vcDsKKworICAgIC8vIFN0YXJ0IHJlYWRpbmcgb24gdGhlIHNlcnZlciBzaWRlLgorICAgIGJ5dGVzID0gYnVmc2l6ZTsKKyAgICBzdGF0dXMgPSBwal9pb3F1ZXVlX3JlY3Yoc2tleSwgJnJlYWRfb3AsIHJlY3ZfYnVmLCAmYnl0ZXMsIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gUEpfRVBFTkRJTkcpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4ucGpfaW9xdWV1ZV9yZWN2IGVycm9yIiwgc3RhdHVzKTsKKwlyZXR1cm4gLTEwMDsKKyAgICB9CisgICAgCisgICAgaWYgKHN0YXR1cyA9PSBQSl9FUEVORElORykKKyAgICAgICAgKytwZW5kaW5nX29wOworICAgIGVsc2UgeworICAgICAgICAvKiBEb2VzIG5vdCBleHBlY3QgdG8gcmV0dXJuIGVycm9yIG9yIGltbWVkaWF0ZSBkYXRhLiAqLworICAgICAgICByZXR1cm4gLTExNTsKKyAgICB9CisKKyAgICAvLyBSYW5kb21pemUgc2VuZCBidWZmZXIuCisgICAgcGpfY3JlYXRlX3JhbmRvbV9zdHJpbmcoKGNoYXIqKXNlbmRfYnVmLCBidWZzaXplKTsKKworICAgIC8vIFN0YXJ0cyBzZW5kIG9uIHRoZSBjbGllbnQgc2lkZS4KKyAgICBieXRlcyA9IGJ1ZnNpemU7CisgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9zZW5kKGNrZXksICZ3cml0ZV9vcCwgc2VuZF9idWYsICZieXRlcywgMCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTICYmIGJ5dGVzICE9IFBKX0VQRU5ESU5HKSB7CisJcmV0dXJuIC0xMjA7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gUEpfRVBFTkRJTkcpIHsKKwkrK3BlbmRpbmdfb3A7CisgICAgfQorCisgICAgLy8gQmVnaW4gdGltZS4KKyAgICBwal9nZXRfdGltZXN0YW1wKCZ0MSk7CisKKyAgICAvLyBSZXNldCBpbmRpY2F0b3JzCisgICAgY2FsbGJhY2tfcmVhZF9zaXplID0gY2FsbGJhY2tfd3JpdGVfc2l6ZSA9IDA7CisgICAgY2FsbGJhY2tfcmVhZF9rZXkgPSBjYWxsYmFja193cml0ZV9rZXkgPSBOVUxMOworICAgIGNhbGxiYWNrX3JlYWRfb3AgPSBjYWxsYmFja193cml0ZV9vcCA9IE5VTEw7CisKKyAgICAvLyBQb2xsIHRoZSBxdWV1ZSB1bnRpbCB3ZSd2ZSBnb3QgY29tcGxldGlvbiBldmVudCBpbiB0aGUgc2VydmVyIHNpZGUuCisgICAgc3RhdHVzID0gMDsKKyAgICB3aGlsZSAocGVuZGluZ19vcCA+IDApIHsKKyAgICAgICAgdGltZW91dC5zZWMgPSAxOyB0aW1lb3V0Lm1zZWMgPSAwOworI2lmZGVmIFBKX1NZTUJJQU4KKwlQSl9VTlVTRURfQVJHKGlvcXVlKTsKKwlzdGF0dXMgPSBwal9zeW1iaWFub3NfcG9sbCgtMSwgMTAwMCk7CisjZWxzZQorCXN0YXR1cyA9IHBqX2lvcXVldWVfcG9sbChpb3F1ZSwgJnRpbWVvdXQpOworI2VuZGlmCisJaWYgKHN0YXR1cyA+IDApIHsKKyAgICAgICAgICAgIGlmIChjYWxsYmFja19yZWFkX3NpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tfcmVhZF9zaXplICE9IGJ1ZnNpemUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTYwOworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja19yZWFkX2tleSAhPSBza2V5KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE2MTsKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tfcmVhZF9vcCAhPSAmcmVhZF9vcCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xNjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tfd3JpdGVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja193cml0ZV9rZXkgIT0gY2tleSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xNjM7CisgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrX3dyaXRlX29wICE9ICZ3cml0ZV9vcCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xNjQ7CisgICAgICAgICAgICB9CisJICAgIHBlbmRpbmdfb3AgLT0gc3RhdHVzOworCX0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICBQSl9MT0coMywoIiIsICIuLi5lcnJvcjogdGltZWQgb3V0IikpOworICAgICAgICB9CisJaWYgKHN0YXR1cyA8IDApIHsKKwkgICAgcmV0dXJuIC0xNzA7CisJfQorICAgIH0KKworICAgIC8vIFBlbmRpbmcgb3AgaXMgemVyby4KKyAgICAvLyBTdWJzZXF1ZW50IHBvbGwgc2hvdWxkIHlpZWxkIHplcm8gdG9vLgorICAgIHRpbWVvdXQuc2VjID0gdGltZW91dC5tc2VjID0gMDsKKyNpZmRlZiBQSl9TWU1CSUFOCisgICAgc3RhdHVzID0gcGpfc3ltYmlhbm9zX3BvbGwoLTEsIDEpOworI2Vsc2UKKyAgICBzdGF0dXMgPSBwal9pb3F1ZXVlX3BvbGwoaW9xdWUsICZ0aW1lb3V0KTsKKyNlbmRpZgorICAgIGlmIChzdGF0dXMgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xNzM7CisKKyAgICAvLyBFbmQgdGltZS4KKyAgICBwal9nZXRfdGltZXN0YW1wKCZ0Mik7CisgICAgdF9lbGFwc2VkLT51MzIubG8gKz0gKHQyLnUzMi5sbyAtIHQxLnUzMi5sbyk7CisKKyAgICAvLyBDb21wYXJlIHJlY3YgYnVmZmVyIHdpdGggc2VuZCBidWZmZXIuCisgICAgaWYgKHBqX21lbWNtcChzZW5kX2J1ZiwgcmVjdl9idWYsIGJ1ZnNpemUpICE9IDApIHsKKwlyZXR1cm4gLTE4MDsKKyAgICB9CisKKyAgICAvLyBTdWNjZXNzCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENvbXBsaWFuY2UgdGVzdCBmb3Igc3VjY2VzcyBzY2VuYXJpby4KKyAqLworc3RhdGljIGludCBjb21wbGlhbmNlX3Rlc3RfMChwal9ib29sX3QgYWxsb3dfY29uY3VyKQoreworICAgIHBqX3NvY2tfdCBzc29jaz0tMSwgY3NvY2swPS0xLCBjc29jazE9LTE7CisgICAgcGpfc29ja2FkZHJfaW4gYWRkciwgY2xpZW50X2FkZHIsIHJtdF9hZGRyOworICAgIGludCBjbGllbnRfYWRkcl9sZW47CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKyAgICBjaGFyICpzZW5kX2J1ZiwgKnJlY3ZfYnVmOworICAgIHBqX2lvcXVldWVfdCAqaW9xdWUgPSBOVUxMOworICAgIHBqX2lvcXVldWVfa2V5X3QgKnNrZXk9TlVMTCwgKmNrZXkwPU5VTEwsICpja2V5MT1OVUxMOworICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgYWNjZXB0X29wOworICAgIGludCBidWZzaXplID0gQlVGX01JTl9TSVpFOworICAgIGludCBzdGF0dXMgPSAtMTsKKyAgICBpbnQgcGVuZGluZ19vcCA9IDA7CisgICAgcGpfdGltZXN0YW1wIHRfZWxhcHNlZDsKKyAgICBwal9zdHJfdCBzOworICAgIHBqX3N0YXR1c190IHJjOworCisgICAgLy8gQ3JlYXRlIHBvb2wuCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgTlVMTCwgUE9PTF9TSVpFLCA0MDAwLCBOVUxMKTsKKworICAgIC8vIEFsbG9jYXRlIGJ1ZmZlcnMgZm9yIHNlbmQgYW5kIHJlY2VpdmUuCisgICAgc2VuZF9idWYgPSAoY2hhciopcGpfcG9vbF9hbGxvYyhwb29sLCBidWZzaXplKTsKKyAgICByZWN2X2J1ZiA9IChjaGFyKilwal9wb29sX2FsbG9jKHBvb2wsIGJ1ZnNpemUpOworCisgICAgLy8gQ3JlYXRlIHNlcnZlciBzb2NrZXQgYW5kIGNsaWVudCBzb2NrZXQgZm9yIGNvbm5lY3RpbmcKKyAgICByYyA9IHBqX3NvY2tfc29ja2V0KHBqX0FGX0lORVQoKSwgcGpfU09DS19TVFJFQU0oKSwgMCwgJnNzb2NrKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvciBjcmVhdGluZyBzb2NrZXQiLCByYyk7CisgICAgICAgIHN0YXR1cz0tMTsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICByYyA9IHBqX3NvY2tfc29ja2V0KHBqX0FGX0lORVQoKSwgcGpfU09DS19TVFJFQU0oKSwgMCwgJmNzb2NrMSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3IgY3JlYXRpbmcgc29ja2V0IiwgcmMpOworCXN0YXR1cz0tMTsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBCaW5kIHNlcnZlciBzb2NrZXQuCisgICAgcGpfc29ja2FkZHJfaW5faW5pdCgmYWRkciwgMCwgMCk7CisgICAgaWYgKChyYz1wal9zb2NrX2JpbmQoc3NvY2ssICZhZGRyLCBzaXplb2YoYWRkcikpKSAhPSAwICkgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5iaW5kIGVycm9yIiwgcmMpOworCXN0YXR1cz0tMTA7IGdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLy8gR2V0IHNlcnZlciBhZGRyZXNzLgorICAgIGNsaWVudF9hZGRyX2xlbiA9IHNpemVvZihhZGRyKTsKKyAgICByYyA9IHBqX3NvY2tfZ2V0c29ja25hbWUoc3NvY2ssICZhZGRyLCAmY2xpZW50X2FkZHJfbGVuKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5FUlJPUiBpbiBwal9zb2NrX2dldHNvY2tuYW1lKCkiLCByYyk7CisJc3RhdHVzPS0xNTsgZ290byBvbl9lcnJvcjsKKyAgICB9CisgICAgYWRkci5zaW5fYWRkciA9IHBqX2luZXRfYWRkcihwal9jc3RyKCZzLCAiMTI3LjAuMC4xIikpOworCisgICAgLy8gQ3JlYXRlIEkvTyBRdWV1ZS4KKyAgICByYyA9IHBqX2lvcXVldWVfY3JlYXRlKHBvb2wsIFBKX0lPUVVFVUVfTUFYX0hBTkRMRVMsICZpb3F1ZSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgaW4gcGpfaW9xdWV1ZV9jcmVhdGUoKSIsIHJjKTsKKwlzdGF0dXM9LTIwOyBnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8vIENvbmN1cnJlbmN5CisgICAgcmMgPSBwal9pb3F1ZXVlX3NldF9kZWZhdWx0X2NvbmN1cnJlbmN5KGlvcXVlLCBhbGxvd19jb25jdXIpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLkVSUk9SIGluIHBqX2lvcXVldWVfc2V0X2RlZmF1bHRfY29uY3VycmVuY3koKSIsIHJjKTsKKwlzdGF0dXM9LTIxOyBnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIHNlcnZlciBzb2NrZXQgYW5kIGNsaWVudCBzb2NrZXQuCisgICAgcmMgPSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2socG9vbCwgaW9xdWUsIHNzb2NrLCBOVUxMLCAmdGVzdF9jYiwgJnNrZXkpOworICAgIGlmIChyYyA9PSBQSl9TVUNDRVNTKQorICAgICAgICByYyA9IHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayhwb29sLCBpb3F1ZSwgY3NvY2sxLCBOVUxMLCAmdGVzdF9jYiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZja2V5MSk7CisgICAgZWxzZQorICAgICAgICBja2V5MSA9IE5VTEw7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgaW4gcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKCkiLCByYyk7CisJc3RhdHVzPS0yMzsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBTZXJ2ZXIgc29ja2V0IGxpc3RlbigpLgorICAgIGlmIChwal9zb2NrX2xpc3Rlbihzc29jaywgNSkpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgaW4gcGpfc29ja19saXN0ZW4oKSIsIHJjKTsKKwlzdGF0dXM9LTI1OyBnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8vIFNlcnZlciBzb2NrZXQgYWNjZXB0KCkKKyAgICBjbGllbnRfYWRkcl9sZW4gPSBzaXplb2YocGpfc29ja2FkZHJfaW4pOworICAgIHN0YXR1cyA9IHBqX2lvcXVldWVfYWNjZXB0KHNrZXksICZhY2NlcHRfb3AsICZjc29jazAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRfYWRkciwgJnJtdF9hZGRyLCAmY2xpZW50X2FkZHJfbGVuKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLkVSUk9SIGluIHBqX2lvcXVldWVfYWNjZXB0KCkiLCByYyk7CisJc3RhdHVzPS0zMDsgZ290byBvbl9lcnJvcjsKKyAgICB9CisgICAgaWYgKHN0YXR1cz09UEpfRVBFTkRJTkcpIHsKKwkrK3BlbmRpbmdfb3A7CisgICAgfQorCisgICAgLy8gQ2xpZW50IHNvY2tldCBjb25uZWN0KCkKKyAgICBzdGF0dXMgPSBwal9pb3F1ZXVlX2Nvbm5lY3QoY2tleTEsICZhZGRyLCBzaXplb2YoYWRkcikpOworICAgIGlmIChzdGF0dXMhPVBKX1NVQ0NFU1MgJiYgc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLkVSUk9SIGluIHBqX2lvcXVldWVfY29ubmVjdCgpIiwgcmMpOworCXN0YXR1cz0tNDA7IGdvdG8gb25fZXJyb3I7CisgICAgfQorICAgIGlmIChzdGF0dXM9PVBKX0VQRU5ESU5HKSB7CisJKytwZW5kaW5nX29wOworICAgIH0KKworICAgIC8vIFBvbGwgdW50aWwgY29ubmVjdGVkCisgICAgY2FsbGJhY2tfcmVhZF9zaXplID0gY2FsbGJhY2tfd3JpdGVfc2l6ZSA9IDA7CisgICAgY2FsbGJhY2tfYWNjZXB0X3N0YXR1cyA9IGNhbGxiYWNrX2Nvbm5lY3Rfc3RhdHVzID0gLTI7CisgICAgY2FsbGJhY2tfY2FsbF9jb3VudCA9IDA7CisKKyAgICBjYWxsYmFja19yZWFkX2tleSA9IGNhbGxiYWNrX3dyaXRlX2tleSA9IAorICAgICAgICBjYWxsYmFja19hY2NlcHRfa2V5ID0gY2FsbGJhY2tfY29ubmVjdF9rZXkgPSBOVUxMOworICAgIGNhbGxiYWNrX2FjY2VwdF9vcCA9IGNhbGxiYWNrX3JlYWRfb3AgPSBjYWxsYmFja193cml0ZV9vcCA9IE5VTEw7CisKKyAgICB3aGlsZSAocGVuZGluZ19vcCkgeworCXBqX3RpbWVfdmFsIHRpbWVvdXQgPSB7MSwgMH07CisKKyNpZmRlZiBQSl9TWU1CSUFOCisJY2FsbGJhY2tfY2FsbF9jb3VudCA9IDA7CisJcGpfc3ltYmlhbm9zX3BvbGwoLTEsIFBKX1RJTUVfVkFMX01TRUModGltZW91dCkpOworCXN0YXR1cyA9IGNhbGxiYWNrX2NhbGxfY291bnQ7CisjZWxzZQorCXN0YXR1cyA9IHBqX2lvcXVldWVfcG9sbChpb3F1ZSwgJnRpbWVvdXQpOworI2VuZGlmCisJaWYgKHN0YXR1cyA+IDApIHsKKyAgICAgICAgICAgIGlmIChjYWxsYmFja19hY2NlcHRfc3RhdHVzICE9IC0yKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrX2FjY2VwdF9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXM9LTQxOyBnb3RvIG9uX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tfYWNjZXB0X2tleSAhPSBza2V5KSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cz0tNDI7IGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja19hY2NlcHRfb3AgIT0gJmFjY2VwdF9vcCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXM9LTQzOyBnb3RvIG9uX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFja19hY2NlcHRfc3RhdHVzID0gLTI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYWxsYmFja19jb25uZWN0X3N0YXR1cyAhPSAtMikgeworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja19jb25uZWN0X3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cz0tNTA7IGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja19jb25uZWN0X2tleSAhPSBja2V5MSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXM9LTUxOyBnb3RvIG9uX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFja19jb25uZWN0X3N0YXR1cyA9IC0yOworICAgICAgICAgICAgfQorCisJICAgIGlmIChzdGF0dXMgPiBwZW5kaW5nX29wKSB7CisJCVBKX0xPRygzLChUSElTX0ZJTEUsCisJCQkgICIuLi5lcnJvcjogcGpfaW9xdWV1ZV9wb2xsKCkgcmV0dXJuZWQgJWQgIgorCQkJICAiKG9ubHkgZXhwZWN0aW5nICVkKSIsCisJCQkgIHN0YXR1cywgcGVuZGluZ19vcCkpOworCQlyZXR1cm4gLTUyOworCSAgICB9CisJICAgIHBlbmRpbmdfb3AgLT0gc3RhdHVzOworCisJICAgIGlmIChwZW5kaW5nX29wID09IDApIHsKKwkJc3RhdHVzID0gMDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvLyBUaGVyZSdzIG5vIHBlbmRpbmcgb3BlcmF0aW9uLgorICAgIC8vIFdoZW4gd2UgcG9sbCB0aGUgaW9xdWV1ZSwgdGhlcmUgbXVzdCBub3QgYmUgZXZlbnRzLgorICAgIGlmIChwZW5kaW5nX29wID09IDApIHsKKyAgICAgICAgcGpfdGltZV92YWwgdGltZW91dCA9IHsxLCAwfTsKKyNpZmRlZiBQSl9TWU1CSUFOCisJc3RhdHVzID0gcGpfc3ltYmlhbm9zX3BvbGwoLTEsIFBKX1RJTUVfVkFMX01TRUModGltZW91dCkpOworI2Vsc2UKKyAgICAgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9wb2xsKGlvcXVlLCAmdGltZW91dCk7CisjZW5kaWYKKyAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBzdGF0dXM9LTYwOyBnb3RvIG9uX2Vycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgYWNjZXB0ZWQgc29ja2V0LgorICAgIGlmIChjc29jazAgPT0gUEpfSU5WQUxJRF9TT0NLRVQpIHsKKwlzdGF0dXMgPSAtNjk7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLmFjY2VwdCgpIGVycm9yIiwgcGpfZ2V0X29zX2Vycm9yKCkpOworCWdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLy8gUmVnaXN0ZXIgbmV3bHkgYWNjZXB0ZWQgc29ja2V0LgorICAgIHJjID0gcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKHBvb2wsIGlvcXVlLCBjc29jazAsIE5VTEwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0X2NiLCAmY2tleTApOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLkVSUk9SIGluIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayIsIHJjKTsKKwlzdGF0dXMgPSAtNzA7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBUZXN0IHNlbmQgYW5kIHJlY2VpdmUuCisgICAgdF9lbGFwc2VkLnUzMi5sbyA9IDA7CisgICAgc3RhdHVzID0gc2VuZF9yZWN2X3Rlc3QoaW9xdWUsIGNrZXkwLCBja2V5MSwgc2VuZF9idWYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ZfYnVmLCBidWZzaXplLCAmdF9lbGFwc2VkKTsKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKwlnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8vIFN1Y2Nlc3MKKyAgICBzdGF0dXMgPSAwOworCitvbl9lcnJvcjoKKyAgICBpZiAoc2tleSAhPSBOVUxMKQorICAgIAlwal9pb3F1ZXVlX3VucmVnaXN0ZXIoc2tleSk7CisgICAgZWxzZSBpZiAoc3NvY2sgIT0gUEpfSU5WQUxJRF9TT0NLRVQpCisJcGpfc29ja19jbG9zZShzc29jayk7CisgICAgCisgICAgaWYgKGNrZXkxICE9IE5VTEwpCisgICAgCXBqX2lvcXVldWVfdW5yZWdpc3Rlcihja2V5MSk7CisgICAgZWxzZSBpZiAoY3NvY2sxICE9IFBKX0lOVkFMSURfU09DS0VUKQorCXBqX3NvY2tfY2xvc2UoY3NvY2sxKTsKKyAgICAKKyAgICBpZiAoY2tleTAgIT0gTlVMTCkKKyAgICAJcGpfaW9xdWV1ZV91bnJlZ2lzdGVyKGNrZXkwKTsKKyAgICBlbHNlIGlmIChjc29jazAgIT0gUEpfSU5WQUxJRF9TT0NLRVQpCisJcGpfc29ja19jbG9zZShjc29jazApOworICAgIAorICAgIGlmIChpb3F1ZSAhPSBOVUxMKQorCXBqX2lvcXVldWVfZGVzdHJveShpb3F1ZSk7CisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIHJldHVybiBzdGF0dXM7CisKK30KKworLyoKKyAqIENvbXBsaWFuY2UgdGVzdCBmb3IgZmFpbGVkIHNjZW5hcmlvLgorICogSW4gdGhpcyBjYXNlLCB0aGUgY2xpZW50IGNvbm5lY3RzIHRvIGEgbm9uLWV4aXN0YW50IHNlcnZpY2UuCisgKi8KK3N0YXRpYyBpbnQgY29tcGxpYW5jZV90ZXN0XzEocGpfYm9vbF90IGFsbG93X2NvbmN1cikKK3sKKyAgICBwal9zb2NrX3QgY3NvY2sxPVBKX0lOVkFMSURfU09DS0VUOworICAgIHBqX3NvY2thZGRyX2luIGFkZHI7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKyAgICBwal9pb3F1ZXVlX3QgKmlvcXVlID0gTlVMTDsKKyAgICBwal9pb3F1ZXVlX2tleV90ICpja2V5MSA9IE5VTEw7CisgICAgaW50IHN0YXR1cyA9IC0xOworICAgIGludCBwZW5kaW5nX29wID0gMDsKKyAgICBwal9zdHJfdCBzOworICAgIHBqX3N0YXR1c190IHJjOworCisgICAgLy8gQ3JlYXRlIHBvb2wuCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgTlVMTCwgUE9PTF9TSVpFLCA0MDAwLCBOVUxMKTsKKworICAgIC8vIENyZWF0ZSBJL08gUXVldWUuCisgICAgcmMgPSBwal9pb3F1ZXVlX2NyZWF0ZShwb29sLCBQSl9JT1FVRVVFX01BWF9IQU5ETEVTLCAmaW9xdWUpOworICAgIGlmICghaW9xdWUpIHsKKwlzdGF0dXM9LTIwOyBnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8vIENvbmN1cnJlbmN5CisgICAgcmMgPSBwal9pb3F1ZXVlX3NldF9kZWZhdWx0X2NvbmN1cnJlbmN5KGlvcXVlLCBhbGxvd19jb25jdXIpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJc3RhdHVzPS0yMTsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgY2xpZW50IHNvY2tldAorICAgIHJjID0gcGpfc29ja19zb2NrZXQocGpfQUZfSU5FVCgpLCBwal9TT0NLX1NUUkVBTSgpLCAwLCAmY3NvY2sxKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5FUlJPUiBpbiBwal9zb2NrX3NvY2tldCgpIiwgcmMpOworCXN0YXR1cz0tMTsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBSZWdpc3RlciBjbGllbnQgc29ja2V0LgorICAgIHJjID0gcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKHBvb2wsIGlvcXVlLCBjc29jazEsIE5VTEwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0X2NiLCAmY2tleTEpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLkVSUk9SIGluIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jaygpIiwgcmMpOworCXN0YXR1cz0tMjM7IGdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSByZW1vdGUgYWRkcmVzcy4KKyAgICBwal9zb2NrYWRkcl9pbl9pbml0KCZhZGRyLCBwal9jc3RyKCZzLCAiMTI3LjAuMC4xIiksIE5PTl9FWElTVEFOVF9QT1JUKTsKKworICAgIC8vIENsaWVudCBzb2NrZXQgY29ubmVjdCgpCisgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9jb25uZWN0KGNrZXkxLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKyAgICBpZiAoc3RhdHVzPT1QSl9TVUNDRVNTKSB7CisJLy8gdW5leHBlY3RlZGx5IHN1Y2Nlc3MhCisJc3RhdHVzID0gLTMwOworCWdvdG8gb25fZXJyb3I7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gUEpfRVBFTkRJTkcpIHsKKwkvLyBzdWNjZXNzCisgICAgfSBlbHNlIHsKKwkrK3BlbmRpbmdfb3A7CisgICAgfQorCisgICAgY2FsbGJhY2tfY29ubmVjdF9zdGF0dXMgPSAtMjsKKyAgICBjYWxsYmFja19jb25uZWN0X2tleSA9IE5VTEw7CisKKyAgICAvLyBQb2xsIHVudGlsIHdlJ3ZlIGdvdCByZXN1bHQKKyAgICB3aGlsZSAocGVuZGluZ19vcCkgeworCXBqX3RpbWVfdmFsIHRpbWVvdXQgPSB7MSwgMH07CisKKyNpZmRlZiBQSl9TWU1CSUFOCisJY2FsbGJhY2tfY2FsbF9jb3VudCA9IDA7CisJcGpfc3ltYmlhbm9zX3BvbGwoLTEsIFBKX1RJTUVfVkFMX01TRUModGltZW91dCkpOworCXN0YXR1cyA9IGNhbGxiYWNrX2NhbGxfY291bnQ7CisjZWxzZQorCXN0YXR1cyA9IHBqX2lvcXVldWVfcG9sbChpb3F1ZSwgJnRpbWVvdXQpOworI2VuZGlmCisJaWYgKHN0YXR1cyA+IDApIHsKKyAgICAgICAgICAgIGlmIChjYWxsYmFja19jb25uZWN0X2tleT09Y2tleTEpIHsKKwkJaWYgKGNhbGxiYWNrX2Nvbm5lY3Rfc3RhdHVzID09IDApIHsKKwkJICAgIC8vIHVuZXhwZWN0ZWRseSBjb25uZWN0ZWQhCisJCSAgICBzdGF0dXMgPSAtNTA7CisJCSAgICBnb3RvIG9uX2Vycm9yOworCQl9CisJICAgIH0KKworCSAgICBpZiAoc3RhdHVzID4gcGVuZGluZ19vcCkgeworCQlQSl9MT0coMywoVEhJU19GSUxFLAorCQkJICAiLi4uZXJyb3I6IHBqX2lvcXVldWVfcG9sbCgpIHJldHVybmVkICVkICIKKwkJCSAgIihvbmx5IGV4cGVjdGluZyAlZCkiLAorCQkJICBzdGF0dXMsIHBlbmRpbmdfb3ApKTsKKwkJcmV0dXJuIC01NTI7CisJICAgIH0KKworCSAgICBwZW5kaW5nX29wIC09IHN0YXR1czsKKwkgICAgaWYgKHBlbmRpbmdfb3AgPT0gMCkgeworCQlzdGF0dXMgPSAwOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8vIFRoZXJlJ3Mgbm8gcGVuZGluZyBvcGVyYXRpb24uCisgICAgLy8gV2hlbiB3ZSBwb2xsIHRoZSBpb3F1ZXVlLCB0aGVyZSBtdXN0IG5vdCBiZSBldmVudHMuCisgICAgaWYgKHBlbmRpbmdfb3AgPT0gMCkgeworICAgICAgICBwal90aW1lX3ZhbCB0aW1lb3V0ID0gezEsIDB9OworI2lmZGVmIFBKX1NZTUJJQU4KKwlzdGF0dXMgPSBwal9zeW1iaWFub3NfcG9sbCgtMSwgUEpfVElNRV9WQUxfTVNFQyh0aW1lb3V0KSk7CisjZWxzZQorICAgICAgICBzdGF0dXMgPSBwal9pb3F1ZXVlX3BvbGwoaW9xdWUsICZ0aW1lb3V0KTsKKyNlbmRpZgorICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIHN0YXR1cz0tNjA7IGdvdG8gb25fZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdWNjZXNzCisgICAgc3RhdHVzID0gMDsKKworb25fZXJyb3I6CisgICAgaWYgKGNrZXkxICE9IE5VTEwpCisgICAgCXBqX2lvcXVldWVfdW5yZWdpc3Rlcihja2V5MSk7CisgICAgZWxzZSBpZiAoY3NvY2sxICE9IFBKX0lOVkFMSURfU09DS0VUKQorCXBqX3NvY2tfY2xvc2UoY3NvY2sxKTsKKyAgICAKKyAgICBpZiAoaW9xdWUgIT0gTlVMTCkKKwlwal9pb3F1ZXVlX2Rlc3Ryb3koaW9xdWUpOworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBSZXBlYXRlZCBjb25uZWN0L2FjY2VwdCBvbiB0aGUgc2FtZSBsaXN0ZW5lciBzb2NrZXQuCisgKi8KK3N0YXRpYyBpbnQgY29tcGxpYW5jZV90ZXN0XzIocGpfYm9vbF90IGFsbG93X2NvbmN1cikKK3sKKyNpZiBkZWZpbmVkKFBKX1NZTUJJQU4pICYmIFBKX1NZTUJJQU4hPTAKKyAgICBlbnVtIHsgTUFYX1BBSVIgPSAxLCBURVNUX0xPT1AgPSAyIH07CisjZWxzZQorICAgIGVudW0geyBNQVhfUEFJUiA9IDQsIFRFU1RfTE9PUCA9IDIgfTsKKyNlbmRpZgorCisgICAgc3RydWN0IGxpc3RlbmVyCisgICAgeworCXBqX3NvY2tfdAkgICAgIHNvY2s7CisJcGpfaW9xdWV1ZV9rZXlfdCAgICAqa2V5OworCXBqX3NvY2thZGRyX2luCSAgICAgYWRkcjsKKwlpbnQJCSAgICAgYWRkcl9sZW47CisgICAgfSBsaXN0ZW5lcjsKKworICAgIHN0cnVjdCBzZXJ2ZXIKKyAgICB7CisJcGpfc29ja190CSAgICAgc29jazsKKwlwal9pb3F1ZXVlX2tleV90ICAgICprZXk7CisJcGpfc29ja2FkZHJfaW4JICAgICBsb2NhbF9hZGRyOworCXBqX3NvY2thZGRyX2luCSAgICAgcmVtX2FkZHI7CisJaW50CQkgICAgIHJlbV9hZGRyX2xlbjsKKwlwal9pb3F1ZXVlX29wX2tleV90ICBhY2NlcHRfb3A7CisgICAgfSBzZXJ2ZXJbTUFYX1BBSVJdOworCisgICAgc3RydWN0IGNsaWVudAorICAgIHsKKwlwal9zb2NrX3QJICAgICBzb2NrOworCXBqX2lvcXVldWVfa2V5X3QgICAgKmtleTsKKyAgICB9IGNsaWVudFtNQVhfUEFJUl07CisKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworICAgIGNoYXIgKnNlbmRfYnVmLCAqcmVjdl9idWY7CisgICAgcGpfaW9xdWV1ZV90ICppb3F1ZSA9IE5VTEw7CisgICAgaW50IGksIGJ1ZnNpemUgPSBCVUZfTUlOX1NJWkU7CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgdGVzdF9sb29wLCBwZW5kaW5nX29wID0gMDsKKyAgICBwal90aW1lc3RhbXAgdF9lbGFwc2VkOworICAgIHBqX3N0cl90IHM7CisgICAgcGpfc3RhdHVzX3QgcmM7CisKKyAgICBsaXN0ZW5lci5zb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgbGlzdGVuZXIua2V5ID0gTlVMTDsKKyAgICAKKyAgICBmb3IgKGk9MDsgaTxNQVhfUEFJUjsgKytpKSB7CisgICAgCXNlcnZlcltpXS5zb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgCXNlcnZlcltpXS5rZXkgPSBOVUxMOworICAgIH0KKyAgICAKKyAgICBmb3IgKGk9MDsgaTxNQVhfUEFJUjsgKytpKSB7CisgICAgCWNsaWVudFtpXS5zb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgCWNsaWVudFtpXS5rZXkgPSBOVUxMOwkKKyAgICB9CisgICAgCisgICAgLy8gQ3JlYXRlIHBvb2wuCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgTlVMTCwgUE9PTF9TSVpFLCA0MDAwLCBOVUxMKTsKKworCisgICAgLy8gQ3JlYXRlIEkvTyBRdWV1ZS4KKyAgICByYyA9IHBqX2lvcXVldWVfY3JlYXRlKHBvb2wsIFBKX0lPUVVFVUVfTUFYX0hBTkRMRVMsICZpb3F1ZSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgaW4gcGpfaW9xdWV1ZV9jcmVhdGUoKSIsIHJjKTsKKwlyZXR1cm4gLTEwOworICAgIH0KKworCisgICAgLy8gQ29uY3VycmVuY3kKKyAgICByYyA9IHBqX2lvcXVldWVfc2V0X2RlZmF1bHRfY29uY3VycmVuY3koaW9xdWUsIGFsbG93X2NvbmN1cik7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgaW4gcGpfaW9xdWV1ZV9zZXRfZGVmYXVsdF9jb25jdXJyZW5jeSgpIiwgcmMpOworCXJldHVybiAtMTE7CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgYnVmZmVycyBmb3Igc2VuZCBhbmQgcmVjZWl2ZS4KKyAgICBzZW5kX2J1ZiA9IChjaGFyKilwal9wb29sX2FsbG9jKHBvb2wsIGJ1ZnNpemUpOworICAgIHJlY3ZfYnVmID0gKGNoYXIqKXBqX3Bvb2xfYWxsb2MocG9vbCwgYnVmc2l6ZSk7CisKKyAgICAvLyBDcmVhdGUgbGlzdGVuZXIgc29ja2V0CisgICAgcmMgPSBwal9zb2NrX3NvY2tldChwal9BRl9JTkVUKCksIHBqX1NPQ0tfU1RSRUFNKCksIDAsICZsaXN0ZW5lci5zb2NrKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvciBjcmVhdGluZyBzb2NrZXQiLCByYyk7CisgICAgICAgIHN0YXR1cz0tMjA7IGdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLy8gQmluZCBsaXN0ZW5lciBzb2NrZXQuCisgICAgcGpfc29ja2FkZHJfaW5faW5pdCgmbGlzdGVuZXIuYWRkciwgMCwgMCk7CisgICAgaWYgKChyYz1wal9zb2NrX2JpbmQobGlzdGVuZXIuc29jaywgJmxpc3RlbmVyLmFkZHIsIHNpemVvZihsaXN0ZW5lci5hZGRyKSkpICE9IDAgKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLmJpbmQgZXJyb3IiLCByYyk7CisJc3RhdHVzPS0zMDsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBHZXQgbGlzdGVuZXIgYWRkcmVzcy4KKyAgICBsaXN0ZW5lci5hZGRyX2xlbiA9IHNpemVvZihsaXN0ZW5lci5hZGRyKTsKKyAgICByYyA9IHBqX3NvY2tfZ2V0c29ja25hbWUobGlzdGVuZXIuc29jaywgJmxpc3RlbmVyLmFkZHIsICZsaXN0ZW5lci5hZGRyX2xlbik7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgaW4gcGpfc29ja19nZXRzb2NrbmFtZSgpIiwgcmMpOworCXN0YXR1cz0tNDA7IGdvdG8gb25fZXJyb3I7CisgICAgfQorICAgIGxpc3RlbmVyLmFkZHIuc2luX2FkZHIgPSBwal9pbmV0X2FkZHIocGpfY3N0cigmcywgIjEyNy4wLjAuMSIpKTsKKworCisgICAgLy8gUmVnaXN0ZXIgbGlzdGVuZXIgc29ja2V0LgorICAgIHJjID0gcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKHBvb2wsIGlvcXVlLCBsaXN0ZW5lci5zb2NrLCBOVUxMLCAmdGVzdF9jYiwgCisJCQkJICAmbGlzdGVuZXIua2V5KTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLkVSUk9SIiwgcmMpOworCXN0YXR1cz0tNTA7IGdvdG8gb25fZXJyb3I7CisgICAgfQorCisKKyAgICAvLyBMaXN0ZW5lciBzb2NrZXQgbGlzdGVuKCkuCisgICAgaWYgKHBqX3NvY2tfbGlzdGVuKGxpc3RlbmVyLnNvY2ssIDUpKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLkVSUk9SIGluIHBqX3NvY2tfbGlzdGVuKCkiLCByYyk7CisJc3RhdHVzPS02MDsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKworICAgIGZvciAodGVzdF9sb29wPTA7IHRlc3RfbG9vcCA8IFRFU1RfTE9PUDsgKyt0ZXN0X2xvb3ApIHsKKwkvLyBDbGllbnQgY29ubmVjdCBhbmQgc2VydmVyIGFjY2VwdC4KKwlmb3IgKGk9MDsgaTxNQVhfUEFJUjsgKytpKSB7CisJICAgIHJjID0gcGpfc29ja19zb2NrZXQocGpfQUZfSU5FVCgpLCBwal9TT0NLX1NUUkVBTSgpLCAwLCAmY2xpZW50W2ldLnNvY2spOworCSAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCQlhcHBfcGVycm9yKCIuLi5lcnJvciBjcmVhdGluZyBzb2NrZXQiLCByYyk7CisJCXN0YXR1cz0tNzA7IGdvdG8gb25fZXJyb3I7CisJICAgIH0KKworCSAgICByYyA9IHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayhwb29sLCBpb3F1ZSwgY2xpZW50W2ldLnNvY2ssIE5VTEwsIAorCQkJCQkgICZ0ZXN0X2NiLCAmY2xpZW50W2ldLmtleSk7CisJICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJCWFwcF9wZXJyb3IoIi4uLmVycm9yICIsIHJjKTsKKwkJc3RhdHVzPS04MDsgZ290byBvbl9lcnJvcjsKKwkgICAgfQorCisJICAgIC8vIFNlcnZlciBzb2NrZXQgYWNjZXB0KCkKKwkgICAgcGpfaW9xdWV1ZV9vcF9rZXlfaW5pdCgmc2VydmVyW2ldLmFjY2VwdF9vcCwgCisJCQkJICAgc2l6ZW9mKHNlcnZlcltpXS5hY2NlcHRfb3ApKTsKKwkgICAgc2VydmVyW2ldLnJlbV9hZGRyX2xlbiA9IHNpemVvZihwal9zb2NrYWRkcl9pbik7CisJICAgIHN0YXR1cyA9IHBqX2lvcXVldWVfYWNjZXB0KGxpc3RlbmVyLmtleSwgJnNlcnZlcltpXS5hY2NlcHRfb3AsIAorCQkJCSAgICAgICAmc2VydmVyW2ldLnNvY2ssICZzZXJ2ZXJbaV0ubG9jYWxfYWRkciwgCisJCQkJICAgICAgICZzZXJ2ZXJbaV0ucmVtX2FkZHIsIAorCQkJCSAgICAgICAmc2VydmVyW2ldLnJlbV9hZGRyX2xlbik7CisJICAgIGlmIChzdGF0dXMhPVBKX1NVQ0NFU1MgJiYgc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisJCWFwcF9wZXJyb3IoIi4uLkVSUk9SIGluIHBqX2lvcXVldWVfYWNjZXB0KCkiLCByYyk7CisJCXN0YXR1cz0tOTA7IGdvdG8gb25fZXJyb3I7CisJICAgIH0KKwkgICAgaWYgKHN0YXR1cz09UEpfRVBFTkRJTkcpIHsKKwkJKytwZW5kaW5nX29wOworCSAgICB9CisKKworCSAgICAvLyBDbGllbnQgc29ja2V0IGNvbm5lY3QoKQorCSAgICBzdGF0dXMgPSBwal9pb3F1ZXVlX2Nvbm5lY3QoY2xpZW50W2ldLmtleSwgJmxpc3RlbmVyLmFkZHIsIAorCQkJCQlzaXplb2YobGlzdGVuZXIuYWRkcikpOworCSAgICBpZiAoc3RhdHVzIT1QSl9TVUNDRVNTICYmIHN0YXR1cyAhPSBQSl9FUEVORElORykgeworCQlhcHBfcGVycm9yKCIuLi5FUlJPUiBpbiBwal9pb3F1ZXVlX2Nvbm5lY3QoKSIsIHJjKTsKKwkJc3RhdHVzPS0xMDA7IGdvdG8gb25fZXJyb3I7CisJICAgIH0KKwkgICAgaWYgKHN0YXR1cz09UEpfRVBFTkRJTkcpIHsKKwkJKytwZW5kaW5nX29wOworCSAgICB9CisKKwkgICAgLy8gUG9sbCB1bnRpbCBjb25uZWN0aW9uIG9mIHRoaXMgcGFpciBlc3RhYmxpc2hlZAorCSAgICB3aGlsZSAocGVuZGluZ19vcCkgeworCQlwal90aW1lX3ZhbCB0aW1lb3V0ID0gezEsIDB9OworCisjaWZkZWYgUEpfU1lNQklBTgorCQlzdGF0dXMgPSBwal9zeW1iaWFub3NfcG9sbCgtMSwgUEpfVElNRV9WQUxfTVNFQyh0aW1lb3V0KSk7CisjZWxzZQorCQlzdGF0dXMgPSBwal9pb3F1ZXVlX3BvbGwoaW9xdWUsICZ0aW1lb3V0KTsKKyNlbmRpZgorCQlpZiAoc3RhdHVzID4gMCkgeworCQkgICAgaWYgKHN0YXR1cyA+IHBlbmRpbmdfb3ApIHsKKwkJCVBKX0xPRygzLChUSElTX0ZJTEUsCisJCQkJICAiLi4uZXJyb3I6IHBqX2lvcXVldWVfcG9sbCgpIHJldHVybmVkICVkICIKKwkJCQkgICIob25seSBleHBlY3RpbmcgJWQpIiwKKwkJCQkgIHN0YXR1cywgcGVuZGluZ19vcCkpOworCQkJcmV0dXJuIC0xMTA7CisJCSAgICB9CisJCSAgICBwZW5kaW5nX29wIC09IHN0YXR1czsKKworCQkgICAgaWYgKHBlbmRpbmdfb3AgPT0gMCkgeworCQkJc3RhdHVzID0gMDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCisJLy8gVGhlcmUncyBubyBwZW5kaW5nIG9wZXJhdGlvbi4KKwkvLyBXaGVuIHdlIHBvbGwgdGhlIGlvcXVldWUsIHRoZXJlIG11c3Qgbm90IGJlIGV2ZW50cy4KKwlpZiAocGVuZGluZ19vcCA9PSAwKSB7CisJICAgIHBqX3RpbWVfdmFsIHRpbWVvdXQgPSB7MSwgMH07CisjaWZkZWYgUEpfU1lNQklBTgorCSAgICBzdGF0dXMgPSBwal9zeW1iaWFub3NfcG9sbCgtMSwgUEpfVElNRV9WQUxfTVNFQyh0aW1lb3V0KSk7CisjZWxzZQorCSAgICBzdGF0dXMgPSBwal9pb3F1ZXVlX3BvbGwoaW9xdWUsICZ0aW1lb3V0KTsKKyNlbmRpZgorCSAgICBpZiAoc3RhdHVzICE9IDApIHsKKwkJc3RhdHVzPS0xMjA7IGdvdG8gb25fZXJyb3I7CisJICAgIH0KKwl9CisKKwlmb3IgKGk9MDsgaTxNQVhfUEFJUjsgKytpKSB7CisJICAgIC8vIENoZWNrIHNlcnZlciBzb2NrZXQuCisJICAgIGlmIChzZXJ2ZXJbaV0uc29jayA9PSBQSl9JTlZBTElEX1NPQ0tFVCkgeworCQlzdGF0dXMgPSAtMTMwOworCQlhcHBfcGVycm9yKCIuLi5hY2NlcHQoKSBlcnJvciIsIHBqX2dldF9vc19lcnJvcigpKTsKKwkJZ290byBvbl9lcnJvcjsKKwkgICAgfQorCisJICAgIC8vIENoZWNrIGFkZHJlc3NlcworCSAgICBpZiAoc2VydmVyW2ldLmxvY2FsX2FkZHIuc2luX2ZhbWlseSAhPSBwal9BRl9JTkVUKCkgfHwKKwkJc2VydmVyW2ldLmxvY2FsX2FkZHIuc2luX2FkZHIuc19hZGRyID09IDAgfHwKKwkJc2VydmVyW2ldLmxvY2FsX2FkZHIuc2luX3BvcnQgPT0gMCkKKwkgICAgeworCQlhcHBfcGVycm9yKCIuLi5FUlJPUiBhZGRyZXNzIG5vdCBzZXQiLCByYyk7CisJCXN0YXR1cyA9IC0xNDA7CisJCWdvdG8gb25fZXJyb3I7CisJICAgIH0KKworCSAgICBpZiAoc2VydmVyW2ldLnJlbV9hZGRyLnNpbl9mYW1pbHkgIT0gcGpfQUZfSU5FVCgpIHx8CisJCXNlcnZlcltpXS5yZW1fYWRkci5zaW5fYWRkci5zX2FkZHIgPT0gMCB8fAorCQlzZXJ2ZXJbaV0ucmVtX2FkZHIuc2luX3BvcnQgPT0gMCkKKwkgICAgeworCQlhcHBfcGVycm9yKCIuLi5FUlJPUiBhZGRyZXNzIG5vdCBzZXQiLCByYyk7CisJCXN0YXR1cyA9IC0xNTA7CisJCWdvdG8gb25fZXJyb3I7CisJICAgIH0KKworCisJICAgIC8vIFJlZ2lzdGVyIG5ld2x5IGFjY2VwdGVkIHNvY2tldC4KKwkgICAgcmMgPSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2socG9vbCwgaW9xdWUsIHNlcnZlcltpXS5zb2NrLCBOVUxMLAorCQkJCQkgICZ0ZXN0X2NiLCAmc2VydmVyW2ldLmtleSk7CisJICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJCWFwcF9wZXJyb3IoIi4uLkVSUk9SIGluIHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayIsIHJjKTsKKwkJc3RhdHVzID0gLTE2MDsKKwkJZ290byBvbl9lcnJvcjsKKwkgICAgfQorCisJICAgIC8vIFRlc3Qgc2VuZCBhbmQgcmVjZWl2ZS4KKwkgICAgdF9lbGFwc2VkLnUzMi5sbyA9IDA7CisJICAgIHN0YXR1cyA9IHNlbmRfcmVjdl90ZXN0KGlvcXVlLCBzZXJ2ZXJbaV0ua2V5LCBjbGllbnRbaV0ua2V5LCAKKwkJCQkgICAgc2VuZF9idWYsIHJlY3ZfYnVmLCBidWZzaXplLCAmdF9lbGFwc2VkKTsKKwkgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisJCWdvdG8gb25fZXJyb3I7CisJICAgIH0KKwl9CisKKwkvLyBTdWNjZXNzCisJc3RhdHVzID0gMDsKKworCWZvciAoaT0wOyBpPE1BWF9QQUlSOyArK2kpIHsKKwkgICAgaWYgKHNlcnZlcltpXS5rZXkgIT0gTlVMTCkgeworCQlwal9pb3F1ZXVlX3VucmVnaXN0ZXIoc2VydmVyW2ldLmtleSk7CisJCXNlcnZlcltpXS5rZXkgPSBOVUxMOworCQlzZXJ2ZXJbaV0uc29jayA9IFBKX0lOVkFMSURfU09DS0VUOworCSAgICB9IGVsc2UgaWYgKHNlcnZlcltpXS5zb2NrICE9IFBKX0lOVkFMSURfU09DS0VUKSB7CisJCXBqX3NvY2tfY2xvc2Uoc2VydmVyW2ldLnNvY2spOworCQlzZXJ2ZXJbaV0uc29jayA9IFBKX0lOVkFMSURfU09DS0VUOworCSAgICB9CisKKwkgICAgaWYgKGNsaWVudFtpXS5rZXkgIT0gTlVMTCkgeworCQlwal9pb3F1ZXVlX3VucmVnaXN0ZXIoY2xpZW50W2ldLmtleSk7CisJCWNsaWVudFtpXS5rZXkgPSBOVUxMOworCQljbGllbnRbaV0uc29jayA9IFBKX0lOVkFMSURfU09DS0VUOworCSAgICB9IGVsc2UgaWYgKGNsaWVudFtpXS5zb2NrICE9IFBKX0lOVkFMSURfU09DS0VUKSB7CisJCXBqX3NvY2tfY2xvc2UoY2xpZW50W2ldLnNvY2spOworCQljbGllbnRbaV0uc29jayA9IFBKX0lOVkFMSURfU09DS0VUOworCSAgICB9CisJfQorICAgIH0KKworICAgIHN0YXR1cyA9IDA7CisKK29uX2Vycm9yOgorICAgIGZvciAoaT0wOyBpPE1BWF9QQUlSOyArK2kpIHsKKwlpZiAoc2VydmVyW2ldLmtleSAhPSBOVUxMKSB7CisJICAgIHBqX2lvcXVldWVfdW5yZWdpc3RlcihzZXJ2ZXJbaV0ua2V5KTsKKwkgICAgc2VydmVyW2ldLmtleSA9IE5VTEw7CisJICAgIHNlcnZlcltpXS5zb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisJfSBlbHNlIGlmIChzZXJ2ZXJbaV0uc29jayAhPSBQSl9JTlZBTElEX1NPQ0tFVCkgeworCSAgICBwal9zb2NrX2Nsb3NlKHNlcnZlcltpXS5zb2NrKTsKKwkgICAgc2VydmVyW2ldLnNvY2sgPSBQSl9JTlZBTElEX1NPQ0tFVDsKKwl9CisKKwlpZiAoY2xpZW50W2ldLmtleSAhPSBOVUxMKSB7CisJICAgIHBqX2lvcXVldWVfdW5yZWdpc3RlcihjbGllbnRbaV0ua2V5KTsKKwkgICAgY2xpZW50W2ldLmtleSA9IE5VTEw7CisJICAgIHNlcnZlcltpXS5zb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisJfSBlbHNlIGlmIChjbGllbnRbaV0uc29jayAhPSBQSl9JTlZBTElEX1NPQ0tFVCkgeworCSAgICBwal9zb2NrX2Nsb3NlKGNsaWVudFtpXS5zb2NrKTsKKwkgICAgY2xpZW50W2ldLnNvY2sgPSBQSl9JTlZBTElEX1NPQ0tFVDsKKwl9CisgICAgfQorCisgICAgaWYgKGxpc3RlbmVyLmtleSkgeworCXBqX2lvcXVldWVfdW5yZWdpc3RlcihsaXN0ZW5lci5rZXkpOworCWxpc3RlbmVyLmtleSA9IE5VTEw7CisgICAgfSBlbHNlIGlmIChsaXN0ZW5lci5zb2NrICE9IFBKX0lOVkFMSURfU09DS0VUKSB7CisJcGpfc29ja19jbG9zZShsaXN0ZW5lci5zb2NrKTsKKwlsaXN0ZW5lci5zb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorCisgICAgaWYgKGlvcXVlICE9IE5VTEwpCisJcGpfaW9xdWV1ZV9kZXN0cm95KGlvcXVlKTsKKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgcmV0dXJuIHN0YXR1czsKKworfQorCisKK3N0YXRpYyBpbnQgdGNwX2lvcXVldWVfdGVzdF9pbXBsKHBqX2Jvb2xfdCBhbGxvd19jb25jdXIpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLnRlc3Rpbmcgd2l0aCBjb25jdXJlbmN5PSVkIiwgYWxsb3dfY29uY3VyKSk7CisKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIi4uJXMgY29tcGxpYW5jZSB0ZXN0IDAgKHN1Y2Nlc3Mgc2NlbmFyaW8pIiwKKwkgICAgICAgcGpfaW9xdWV1ZV9uYW1lKCkpKTsKKyAgICBpZiAoKHN0YXR1cz1jb21wbGlhbmNlX3Rlc3RfMChhbGxvd19jb25jdXIpKSAhPSAwKSB7CisJUEpfTE9HKDEsIChUSElTX0ZJTEUsICIuLi4uRkFJTEVEIChzdGF0dXM9JWQpXG4iLCBzdGF0dXMpKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIi4uJXMgY29tcGxpYW5jZSB0ZXN0IDEgKGZhaWxlZCBzY2VuYXJpbykiLAorICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9uYW1lKCkpKTsKKyAgICBpZiAoKHN0YXR1cz1jb21wbGlhbmNlX3Rlc3RfMShhbGxvd19jb25jdXIpKSAhPSAwKSB7CisJUEpfTE9HKDEsIChUSElTX0ZJTEUsICIuLi4uRkFJTEVEIChzdGF0dXM9JWQpXG4iLCBzdGF0dXMpKTsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiLi4lcyBjb21wbGlhbmNlIHRlc3QgMiAocmVwZWF0ZWQgYWNjZXB0KSIsCisgICAgICAgICAgICAgICBwal9pb3F1ZXVlX25hbWUoKSkpOworICAgIGlmICgoc3RhdHVzPWNvbXBsaWFuY2VfdGVzdF8yKGFsbG93X2NvbmN1cikpICE9IDApIHsKKwlQSl9MT0coMSwgKFRISVNfRklMRSwgIi4uLi5GQUlMRUQgKHN0YXR1cz0lZClcbiIsIHN0YXR1cykpOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB0Y3BfaW9xdWV1ZV90ZXN0KCkKK3sKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IHRjcF9pb3F1ZXVlX3Rlc3RfaW1wbChQSl9UUlVFKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gcmM7CisKKyAgICByYyA9IHRjcF9pb3F1ZXVlX3Rlc3RfaW1wbChQSl9GQUxTRSk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiBQSl9IQVNfVENQICovCisKKworI2Vsc2UKKy8qIFRvIHByZXZlbnQgd2FybmluZyBhYm91dCAidHJhbnNsYXRpb24gdW5pdCBpcyBlbXB0eSIKKyAqIHdoZW4gdGhpcyB0ZXN0IGlzIGRpc2FibGVkLiAKKyAqLworaW50IGR1bW15X3VpcV90Y3A7CisjZW5kaWYJLyogSU5DTFVERV9UQ1BfSU9RVUVVRV9URVNUICovCisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2lvcV91ZHAuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9pb3FfdWRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2NTZmZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9pb3FfdWRwLmMKQEAgLTAsMCArMSw5NTMgQEAKKy8qICRJZDogaW9xX3VkcC5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKworCisvKioKKyAqIFxwYWdlIHBhZ2VfcGpsaWJfaW9xdWV1ZV91ZHBfdGVzdCBUZXN0OiBJL08gUXVldWUgKFVEUCkKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gdG8gdGVzdCB0aGUKKyAqIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIEkvTyBxdWV1ZSB3aGVuIFVEUCBzb2NrZXQgaXMgdXNlZC4KKyAqCisgKgorICogVGhpcyBmaWxlIGlzIDxiPnBqbGliLXRlc3QvaW9xX3VkcC5jPC9iPgorICoKKyAqIFxpbmNsdWRlIHBqbGliLXRlc3QvaW9xX3VkcC5jCisgKi8KKworCisjaWYgSU5DTFVERV9VRFBfSU9RVUVVRV9URVNUCisKKyNpbmNsdWRlIDxwamxpYi5oPgorCisjaW5jbHVkZSA8cGovY29tcGF0L3NvY2tldC5oPgorCisjZGVmaW5lIFRISVNfRklMRQkgICAgInRlc3RfdWRwIgorI2RlZmluZSBQT1JUCQkgICAgNTEyMzMKKyNkZWZpbmUgTE9PUAkJICAgIDIKKy8vLyNkZWZpbmUgTE9PUAkJICAgIDIKKyNkZWZpbmUgQlVGX01JTl9TSVpFCSAgICAzMgorI2RlZmluZSBCVUZfTUFYX1NJWkUJICAgIDIwNDgKKyNkZWZpbmUgU09DS19JTkFDVElWRV9NSU4gICAoMSkKKyNkZWZpbmUgU09DS19JTkFDVElWRV9NQVggICAoUEpfSU9RVUVVRV9NQVhfSEFORExFUyAtIDIpCisjZGVmaW5lIFBPT0xfU0laRQkgICAgKDIqQlVGX01BWF9TSVpFICsgU09DS19JTkFDVElWRV9NQVgqMTI4ICsgMjA0OCkKKworI3VuZGVmIFRSQUNFXworI2RlZmluZSBUUkFDRV8obXNnKQkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwiLi4uLi4iIG1zZykpCisKKyNpZiAwCisjICBkZWZpbmUgVFJBQ0VfXyhhcmdzKQkgICAgUEpfTE9HKDMsYXJncykKKyNlbHNlCisjICBkZWZpbmUgVFJBQ0VfXyhhcmdzKQorI2VuZGlmCisKKworc3RhdGljIHBqX3NzaXplX3QgICAgICAgICAgICBjYWxsYmFja19yZWFkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3dyaXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2FjY2VwdF9zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2Nvbm5lY3Rfc3RhdHVzOworc3RhdGljIHBqX2lvcXVldWVfa2V5X3QgICAgICpjYWxsYmFja19yZWFkX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2FsbGJhY2tfd3JpdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjYWxsYmFja19hY2NlcHRfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjYWxsYmFja19jb25uZWN0X2tleTsKK3N0YXRpYyBwal9pb3F1ZXVlX29wX2tleV90ICAqY2FsbGJhY2tfcmVhZF9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2FsbGJhY2tfd3JpdGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNhbGxiYWNrX2FjY2VwdF9vcDsKKworc3RhdGljIHZvaWQgb25faW9xdWV1ZV9yZWFkKHBqX2lvcXVldWVfa2V5X3QgKmtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3NzaXplX3QgYnl0ZXNfcmVhZCkKK3sKKyAgICBjYWxsYmFja19yZWFkX2tleSA9IGtleTsKKyAgICBjYWxsYmFja19yZWFkX29wID0gb3Bfa2V5OworICAgIGNhbGxiYWNrX3JlYWRfc2l6ZSA9IGJ5dGVzX3JlYWQ7CisgICAgVFJBQ0VfXygoVEhJU19GSUxFLCAiICAgICBjYWxsYmFja19yZWFkX2tleSA9ICVwLCBieXRlcz0lZCIsIAorCSAgICAga2V5LCBieXRlc19yZWFkKSk7Cit9CisKK3N0YXRpYyB2b2lkIG9uX2lvcXVldWVfd3JpdGUocGpfaW9xdWV1ZV9rZXlfdCAqa2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zc2l6ZV90IGJ5dGVzX3dyaXR0ZW4pCit7CisgICAgY2FsbGJhY2tfd3JpdGVfa2V5ID0ga2V5OworICAgIGNhbGxiYWNrX3dyaXRlX29wID0gb3Bfa2V5OworICAgIGNhbGxiYWNrX3dyaXRlX3NpemUgPSBieXRlc193cml0dGVuOworfQorCitzdGF0aWMgdm9pZCBvbl9pb3F1ZXVlX2FjY2VwdChwal9pb3F1ZXVlX2tleV90ICprZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAqb3Bfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc29ja190IHNvY2ssIGludCBzdGF0dXMpCit7CisgICAgUEpfVU5VU0VEX0FSRyhzb2NrKTsKKyAgICBjYWxsYmFja19hY2NlcHRfa2V5ID0ga2V5OworICAgIGNhbGxiYWNrX2FjY2VwdF9vcCA9IG9wX2tleTsKKyAgICBjYWxsYmFja19hY2NlcHRfc3RhdHVzID0gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBvbl9pb3F1ZXVlX2Nvbm5lY3QocGpfaW9xdWV1ZV9rZXlfdCAqa2V5LCBpbnQgc3RhdHVzKQoreworICAgIGNhbGxiYWNrX2Nvbm5lY3Rfa2V5ID0ga2V5OworICAgIGNhbGxiYWNrX2Nvbm5lY3Rfc3RhdHVzID0gc3RhdHVzOworfQorCitzdGF0aWMgcGpfaW9xdWV1ZV9jYWxsYmFjayB0ZXN0X2NiID0gCit7CisgICAgJm9uX2lvcXVldWVfcmVhZCwKKyAgICAmb25faW9xdWV1ZV93cml0ZSwKKyAgICAmb25faW9xdWV1ZV9hY2NlcHQsCisgICAgJm9uX2lvcXVldWVfY29ubmVjdCwKK307CisKKyNpZiBkZWZpbmVkKFBKX1dJTjMyKSB8fCBkZWZpbmVkKFBKX1dJTjY0KQorIyAgZGVmaW5lIFNfQUREUiBTX3VuLlNfYWRkcgorI2Vsc2UKKyMgIGRlZmluZSBTX0FERFIgc19hZGRyCisjZW5kaWYKKworLyoKKyAqIGNvbXBsaWFuY2VfdGVzdCgpCisgKiBUbyB0ZXN0IHRoYXQgdGhlIGJhc2ljIElPUXVldWUgZnVuY3Rpb25hbGl0eSB3b3Jrcy4gSXQgd2lsbCBqdXN0IGV4Y2hhbmdlCisgKiBkYXRhIGJldHdlZW4gdHdvIHNvY2tldHMuCisgKi8gCitzdGF0aWMgaW50IGNvbXBsaWFuY2VfdGVzdChwal9ib29sX3QgYWxsb3dfY29uY3VyKQoreworICAgIHBqX3NvY2tfdCBzc29jaz0tMSwgY3NvY2s9LTE7CisgICAgcGpfc29ja2FkZHJfaW4gYWRkciwgZHN0X2FkZHI7CisgICAgaW50IGFkZHJsZW47CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKyAgICBjaGFyICpzZW5kX2J1ZiwgKnJlY3ZfYnVmOworICAgIHBqX2lvcXVldWVfdCAqaW9xdWUgPSBOVUxMOworICAgIHBqX2lvcXVldWVfa2V5X3QgKnNrZXkgPSBOVUxMLCAqY2tleSA9IE5VTEw7CisgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCByZWFkX29wLCB3cml0ZV9vcDsKKyAgICBpbnQgYnVmc2l6ZSA9IEJVRl9NSU5fU0laRTsKKyAgICBwal9zc2l6ZV90IGJ5dGVzOworICAgIGludCBzdGF0dXMgPSAtMTsKKyAgICBwal9zdHJfdCB0ZW1wOworICAgIHBqX2Jvb2xfdCBzZW5kX3BlbmRpbmcsIHJlY3ZfcGVuZGluZzsKKyAgICBwal9zdGF0dXNfdCByYzsKKworICAgIHBqX3NldF9vc19lcnJvcihQSl9TVUNDRVNTKTsKKworICAgIC8vIENyZWF0ZSBwb29sLgorICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIFBPT0xfU0laRSwgNDAwMCwgTlVMTCk7CisKKyAgICAvLyBBbGxvY2F0ZSBidWZmZXJzIGZvciBzZW5kIGFuZCByZWNlaXZlLgorICAgIHNlbmRfYnVmID0gKGNoYXIqKXBqX3Bvb2xfYWxsb2MocG9vbCwgYnVmc2l6ZSk7CisgICAgcmVjdl9idWYgPSAoY2hhciopcGpfcG9vbF9hbGxvYyhwb29sLCBidWZzaXplKTsKKworICAgIC8vIEFsbG9jYXRlIHNvY2tldHMgZm9yIHNlbmRpbmcgYW5kIHJlY2VpdmluZy4KKyAgICBUUkFDRV8oImNyZWF0aW5nIHNvY2tldHMuLi4iKTsKKyAgICByYyA9IHBqX3NvY2tfc29ja2V0KHBqX0FGX0lORVQoKSwgcGpfU09DS19ER1JBTSgpLCAwLCAmc3NvY2spOworICAgIGlmIChyYz09UEpfU1VDQ0VTUykKKyAgICAgICAgcmMgPSBwal9zb2NrX3NvY2tldChwal9BRl9JTkVUKCksIHBqX1NPQ0tfREdSQU0oKSwgMCwgJmNzb2NrKTsKKyAgICBlbHNlCisgICAgICAgIGNzb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgaW4gcGpfc29ja19zb2NrZXQoKSIsIHJjKTsKKwlzdGF0dXM9LTE7IGdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLy8gQmluZCBzZXJ2ZXIgc29ja2V0LgorICAgIFRSQUNFXygiYmluZCBzb2NrZXQuLi4iKTsKKyAgICBwal9iemVybygmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKyAgICBhZGRyLnNpbl9mYW1pbHkgPSBwal9BRl9JTkVUKCk7CisgICAgYWRkci5zaW5fcG9ydCA9IHBqX2h0b25zKFBPUlQpOworICAgIGlmIChwal9zb2NrX2JpbmQoc3NvY2ssICZhZGRyLCBzaXplb2YoYWRkcikpKSB7CisJc3RhdHVzPS0xMDsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgSS9PIFF1ZXVlLgorICAgIFRSQUNFXygiY3JlYXRlIGlvcXVldWUuLi4iKTsKKyAgICByYyA9IHBqX2lvcXVldWVfY3JlYXRlKHBvb2wsIFBKX0lPUVVFVUVfTUFYX0hBTkRMRVMsICZpb3F1ZSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwlzdGF0dXM9LTIwOyBnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8vIFNldCBjb25jdXJyZW5jeQorICAgIFRSQUNFXygic2V0IGNvbmN1cnJlbmN5Li4uIik7CisgICAgcmMgPSBwal9pb3F1ZXVlX3NldF9kZWZhdWx0X2NvbmN1cnJlbmN5KGlvcXVlLCBhbGxvd19jb25jdXIpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJc3RhdHVzPS0yMTsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBSZWdpc3RlciBzZXJ2ZXIgYW5kIGNsaWVudCBzb2NrZXQuCisgICAgLy8gV2UgcHV0IHRoaXMgYWZ0ZXIgaW5hY3Rpdml0eSBzb2NrZXQsIGhvcGVmdWxseSB0aGlzIGNhbiByZXByZXNlbnQgdGhlCisgICAgLy8gd29yc3Qgd2FpdGluZyB0aW1lLgorICAgIFRSQUNFXygicmVnaXN0ZXJpbmcgZmlyc3Qgc29ja2V0cy4uLiIpOworICAgIHJjID0gcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKHBvb2wsIGlvcXVlLCBzc29jaywgTlVMTCwgCisJCQkgICAgICAgICAgJnRlc3RfY2IsICZza2V5KTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLmVycm9yKDEwKTogaW9xdWV1ZV9yZWdpc3RlciBlcnJvciIsIHJjKTsKKwlzdGF0dXM9LTI1OyBnb3RvIG9uX2Vycm9yOworICAgIH0KKyAgICBUUkFDRV8oInJlZ2lzdGVyaW5nIHNlY29uZCBzb2NrZXRzLi4uIik7CisgICAgcmMgPSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2soIHBvb2wsIGlvcXVlLCBjc29jaywgTlVMTCwgCisJCQkgICAgICAgICAgICZ0ZXN0X2NiLCAmY2tleSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCIuLi5lcnJvcigxMSk6IGlvcXVldWVfcmVnaXN0ZXIgZXJyb3IiLCByYyk7CisJc3RhdHVzPS0yNjsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBSYW5kb21pemUgc2VuZF9idWYuCisgICAgcGpfY3JlYXRlX3JhbmRvbV9zdHJpbmcoc2VuZF9idWYsIGJ1ZnNpemUpOworCisgICAgLy8gUmVnaXN0ZXIgcmVhZGluZyBmcm9tIGlvcXVldWUuCisgICAgVFJBQ0VfKCJzdGFydCByZWN2ZnJvbS4uLiIpOworICAgIHBqX2J6ZXJvKCZhZGRyLCBzaXplb2YoYWRkcikpOworICAgIGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisgICAgYnl0ZXMgPSBidWZzaXplOworICAgIHJjID0gcGpfaW9xdWV1ZV9yZWN2ZnJvbShza2V5LCAmcmVhZF9vcCwgcmVjdl9idWYsICZieXRlcywgMCwKKwkJCSAgICAgJmFkZHIsICZhZGRybGVuKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUyAmJiByYyAhPSBQSl9FUEVORElORykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvcjogcGpfaW9xdWV1ZV9yZWN2ZnJvbSIsIHJjKTsKKwlzdGF0dXM9LTI4OyBnb3RvIG9uX2Vycm9yOworICAgIH0gZWxzZSBpZiAocmMgPT0gUEpfRVBFTkRJTkcpIHsKKwlyZWN2X3BlbmRpbmcgPSAxOworCVBKX0xPRygzLCAoVEhJU19GSUxFLCAKKwkJICAgIi4uLi4uLm9rOiByZWN2ZnJvbSByZXR1cm5lZCBwZW5kaW5nIikpOworICAgIH0gZWxzZSB7CisJUEpfTE9HKDMsIChUSElTX0ZJTEUsIAorCQkgICAiLi4uLi4uZXJyb3I6IHJlY3Zmcm9tIHJldHVybmVkIGltbWVkaWF0ZSBvayEiKSk7CisJc3RhdHVzPS0yOTsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBTZXQgZGVzdGluYXRpb24gYWRkcmVzcyB0byBzZW5kIHRoZSBwYWNrZXQuCisgICAgVFJBQ0VfKCJzZXQgZGVzdGluYXRpb24gYWRkcmVzcy4uLiIpOworICAgIHRlbXAgPSBwal9zdHIoIjEyNy4wLjAuMSIpOworICAgIGlmICgocmM9cGpfc29ja2FkZHJfaW5faW5pdCgmZHN0X2FkZHIsICZ0ZW1wLCBQT1JUKSkgIT0gMCkgeworCWFwcF9wZXJyb3IoIi4uLmVycm9yOiB1bmFibGUgdG8gcmVzb2x2ZSAxMjcuMC4wLjEiLCByYyk7CisJc3RhdHVzPS0yOTA7IGdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLy8gV3JpdGUgbXVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcy4KKyAgICBUUkFDRV8oInN0YXJ0IHNlbmR0by4uLiIpOworICAgIGJ5dGVzID0gYnVmc2l6ZTsKKyAgICByYyA9IHBqX2lvcXVldWVfc2VuZHRvKGNrZXksICZ3cml0ZV9vcCwgc2VuZF9idWYsICZieXRlcywgMCwgJmRzdF9hZGRyLCAKKwkJCSAgIHNpemVvZihkc3RfYWRkcikpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTICYmIHJjICE9IFBKX0VQRU5ESU5HKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9pb3F1ZXVlX3NlbmR0byIsIHJjKTsKKwlzdGF0dXM9LTMwOyBnb3RvIG9uX2Vycm9yOworICAgIH0gZWxzZSBpZiAocmMgPT0gUEpfRVBFTkRJTkcpIHsKKwlzZW5kX3BlbmRpbmcgPSAxOworCVBKX0xPRygzLCAoVEhJU19GSUxFLCAKKwkJICAgIi4uLi4uLm9rOiBzZW5kdG8gcmV0dXJuZWQgcGVuZGluZyIpKTsKKyAgICB9IGVsc2UgeworCXNlbmRfcGVuZGluZyA9IDA7CisJUEpfTE9HKDMsIChUSElTX0ZJTEUsIAorCQkgICAiLi4uLi4ub2s6IHNlbmR0byByZXR1cm5lZCBpbW1lZGlhdGUgc3VjY2VzcyIpKTsKKyAgICB9CisKKyAgICAvLyByZXNldCBjYWxsYmFjayB2YXJpYWJsZXMuCisgICAgY2FsbGJhY2tfcmVhZF9zaXplID0gY2FsbGJhY2tfd3JpdGVfc2l6ZSA9IDA7CisgICAgY2FsbGJhY2tfYWNjZXB0X3N0YXR1cyA9IGNhbGxiYWNrX2Nvbm5lY3Rfc3RhdHVzID0gLTI7CisgICAgY2FsbGJhY2tfcmVhZF9rZXkgPSBjYWxsYmFja193cml0ZV9rZXkgPSAKKyAgICAgICAgY2FsbGJhY2tfYWNjZXB0X2tleSA9IGNhbGxiYWNrX2Nvbm5lY3Rfa2V5ID0gTlVMTDsKKyAgICBjYWxsYmFja19yZWFkX29wID0gY2FsbGJhY2tfd3JpdGVfb3AgPSBOVUxMOworCisgICAgLy8gUG9sbCBpZiBwZW5kaW5nLgorICAgIHdoaWxlIChzZW5kX3BlbmRpbmcgfHwgcmVjdl9wZW5kaW5nKSB7CisJaW50IHJjOworCXBqX3RpbWVfdmFsIHRpbWVvdXQgPSB7IDUsIDAgfTsKKworCVRSQUNFXygicG9sbC4uLiIpOworI2lmZGVmIFBKX1NZTUJJQU4KKwlyYyA9IHBqX3N5bWJpYW5vc19wb2xsKC0xLCBQSl9USU1FX1ZBTF9NU0VDKHRpbWVvdXQpKTsKKyNlbHNlCisJcmMgPSBwal9pb3F1ZXVlX3BvbGwoaW9xdWUsICZ0aW1lb3V0KTsKKyNlbmRpZgorCisJaWYgKHJjID09IDApIHsKKwkgICAgUEpfTE9HKDEsKFRISVNfRklMRSwgIi4uLkVSUk9SOiB0aW1lZCBvdXQuLi4iKSk7CisJICAgIHN0YXR1cz0tNDU7IGdvdG8gb25fZXJyb3I7CisgICAgICAgIH0gZWxzZSBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5FUlJPUiBpbiBpb3F1ZXVlX3BvbGwoKSIsIC1yYyk7CisJICAgIHN0YXR1cz0tNTA7IGdvdG8gb25fZXJyb3I7CisJfQorCisJaWYgKGNhbGxiYWNrX3JlYWRfa2V5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChjYWxsYmFja19yZWFkX3NpemUgIT0gYnVmc2l6ZSkgeworICAgICAgICAgICAgICAgIHN0YXR1cz0tNjE7IGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tfcmVhZF9rZXkgIT0gc2tleSkgeworICAgICAgICAgICAgICAgIHN0YXR1cz0tNjU7IGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tfcmVhZF9vcCAhPSAmcmVhZF9vcCkgeworICAgICAgICAgICAgICAgIHN0YXR1cz0tNjY7IGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgICB9CisKKwkgICAgaWYgKHBqX21lbWNtcChzZW5kX2J1ZiwgcmVjdl9idWYsIGJ1ZnNpemUpICE9IDApIHsKKwkJc3RhdHVzPS02NzsgZ290byBvbl9lcnJvcjsKKwkgICAgfQorCSAgICBpZiAoYWRkcmxlbiAhPSBzaXplb2YocGpfc29ja2FkZHJfaW4pKSB7CisJCXN0YXR1cz0tNjg7IGdvdG8gb25fZXJyb3I7CisJICAgIH0KKwkgICAgaWYgKGFkZHIuc2luX2ZhbWlseSAhPSBwal9BRl9JTkVUKCkpIHsKKwkJc3RhdHVzPS02OTsgZ290byBvbl9lcnJvcjsKKwkgICAgfQorCisKKwkgICAgcmVjdl9wZW5kaW5nID0gMDsKKwl9IAorCisgICAgICAgIGlmIChjYWxsYmFja193cml0ZV9rZXkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGNhbGxiYWNrX3dyaXRlX3NpemUgIT0gYnVmc2l6ZSkgeworICAgICAgICAgICAgICAgIHN0YXR1cz0tNzM7IGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tfd3JpdGVfa2V5ICE9IGNrZXkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXM9LTc1OyBnb3RvIG9uX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbGxiYWNrX3dyaXRlX29wICE9ICZ3cml0ZV9vcCkgeworICAgICAgICAgICAgICAgIHN0YXR1cz0tNzY7IGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlbmRfcGVuZGluZyA9IDA7CisJfQorICAgIH0gCisgICAgCisgICAgLy8gU3VjY2VzcworICAgIHN0YXR1cyA9IDA7CisKK29uX2Vycm9yOgorICAgIGlmIChza2V5KQorICAgIAlwal9pb3F1ZXVlX3VucmVnaXN0ZXIoc2tleSk7CisgICAgZWxzZSBpZiAoc3NvY2sgIT0gLTEpCisJcGpfc29ja19jbG9zZShzc29jayk7CisgICAgCisgICAgaWYgKGNrZXkpCisgICAgCXBqX2lvcXVldWVfdW5yZWdpc3Rlcihja2V5KTsKKyAgICBlbHNlIGlmIChjc29jayAhPSAtMSkKKwlwal9zb2NrX2Nsb3NlKGNzb2NrKTsKKyAgICAKKyAgICBpZiAoaW9xdWUgIT0gTlVMTCkKKwlwal9pb3F1ZXVlX2Rlc3Ryb3koaW9xdWUpOworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICByZXR1cm4gc3RhdHVzOworCit9CisKKworc3RhdGljIHZvaWQgb25fcmVhZF9jb21wbGV0ZShwal9pb3F1ZXVlX2tleV90ICprZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zc2l6ZV90IGJ5dGVzX3JlYWQpCit7CisgICAgdW5zaWduZWQgKnBfcGFja2V0X2NudCA9ICh1bnNpZ25lZCopIHBqX2lvcXVldWVfZ2V0X3VzZXJfZGF0YShrZXkpOworCisgICAgUEpfVU5VU0VEX0FSRyhvcF9rZXkpOworICAgIFBKX1VOVVNFRF9BUkcoYnl0ZXNfcmVhZCk7CisKKyAgICAoKnBfcGFja2V0X2NudCkrKzsKK30KKworLyoKKyAqIHVucmVnaXN0ZXJfdGVzdCgpCisgKiBDaGVjayBpZiBjYWxsYmFjayBpcyBzdGlsbCBjYWxsZWQgYWZ0ZXIgc29ja2V0IGhhcyBiZWVuIHVucmVnaXN0ZXJlZCBvciAKKyAqIGNsb3NlZC4KKyAqLyAKK3N0YXRpYyBpbnQgdW5yZWdpc3Rlcl90ZXN0KHBqX2Jvb2xfdCBhbGxvd19jb25jdXIpCit7CisgICAgZW51bSB7IFJQT1JUID0gNTAwMDAsIFNQT1JUID0gNTAwMDEgfTsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlOworICAgIHBqX3NvY2tfdCBzc29jazsKKyAgICBwal9zb2NrX3QgcnNvY2s7CisgICAgaW50IGFkZHJsZW47CisgICAgcGpfc29ja2FkZHJfaW4gYWRkcjsKKyAgICBwal9pb3F1ZXVlX2tleV90ICprZXk7CisgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCBvcGtleTsKKyAgICBwal9pb3F1ZXVlX2NhbGxiYWNrIGNiOworICAgIHVuc2lnbmVkIHBhY2tldF9jbnQ7CisgICAgY2hhciBzZW5kYnVmWzEwXSwgcmVjdmJ1ZlsxMF07CisgICAgcGpfc3NpemVfdCBieXRlczsKKyAgICBwal90aW1lX3ZhbCB0aW1lb3V0OworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sICJ0ZXN0IiwgNDAwMCwgNDAwMCwgTlVMTCk7CisgICAgaWYgKCFwb29sKSB7CisJYXBwX3BlcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBwb29sIiwgUEpfRU5PTUVNKTsKKwlyZXR1cm4gLTEwMDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9pb3F1ZXVlX2NyZWF0ZShwb29sLCAxNiwgJmlvcXVldWUpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGNyZWF0aW5nIGlvcXVldWUiLCBzdGF0dXMpOworCXJldHVybiAtMTEwOworICAgIH0KKworICAgIC8vIFNldCBjb25jdXJyZW5jeQorICAgIFRSQUNFXygic2V0IGNvbmN1cnJlbmN5Li4uIik7CisgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9zZXRfZGVmYXVsdF9jb25jdXJyZW5jeShpb3F1ZXVlLCBhbGxvd19jb25jdXIpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCXJldHVybiAtMTEyOworICAgIH0KKworICAgIC8qIENyZWF0ZSBzZW5kZXIgc29ja2V0ICovCisgICAgc3RhdHVzID0gYXBwX3NvY2tldChwal9BRl9JTkVUKCksIHBqX1NPQ0tfREdSQU0oKSwgMCwgU1BPUlQsICZzc29jayk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiRXJyb3IgaW5pdGlhbGl6aW5nIHNvY2tldCIsIHN0YXR1cyk7CisJcmV0dXJuIC0xMjA7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHJlY2VpdmVyIHNvY2tldC4gKi8KKyAgICBzdGF0dXMgPSBhcHBfc29ja2V0KHBqX0FGX0lORVQoKSwgcGpfU09DS19ER1JBTSgpLCAwLCBSUE9SVCwgJnJzb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJFcnJvciBpbml0aWFsaXppbmcgc29ja2V0Iiwgc3RhdHVzKTsKKwlyZXR1cm4gLTEzMDsKKyAgICB9CisKKyAgICAvKiBSZWdpc3RlciByc29jayB0byBpb3F1ZXVlLiAqLworICAgIHBqX2J6ZXJvKCZjYiwgc2l6ZW9mKGNiKSk7CisgICAgY2Iub25fcmVhZF9jb21wbGV0ZSA9ICZvbl9yZWFkX2NvbXBsZXRlOworICAgIHBhY2tldF9jbnQgPSAwOworICAgIHN0YXR1cyA9IHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayhwb29sLCBpb3F1ZXVlLCByc29jaywgJnBhY2tldF9jbnQsCisJCQkJICAgICAgJmNiLCAma2V5KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJFcnJvciByZWdpc3RlcmluZyB0byBpb3F1ZXVlIiwgc3RhdHVzKTsKKwlyZXR1cm4gLTE0MDsKKyAgICB9CisKKyAgICAvKiBJbml0IG9wZXJhdGlvbiBrZXkuICovCisgICAgcGpfaW9xdWV1ZV9vcF9rZXlfaW5pdCgmb3BrZXksIHNpemVvZihvcGtleSkpOworCisgICAgLyogU3RhcnQgcmVhZGluZy4gKi8KKyAgICBieXRlcyA9IHNpemVvZihyZWN2YnVmKTsKKyAgICBzdGF0dXMgPSBwal9pb3F1ZXVlX3JlY3YoIGtleSwgJm9wa2V5LCByZWN2YnVmLCAmYnl0ZXMsIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfRVBFTkRJTkcpIHsKKwlhcHBfcGVycm9yKCJFeHBlY3RpbmcgUEpfRVBFTkRJTkcsIGJ1dCBnb3QgdGhpcyIsIHN0YXR1cyk7CisJcmV0dXJuIC0xNTA7CisgICAgfQorCisgICAgLyogSW5pdCBkZXN0aW5hdGlvbiBhZGRyZXNzLiAqLworICAgIGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisgICAgc3RhdHVzID0gcGpfc29ja19nZXRzb2NrbmFtZShyc29jaywgJmFkZHIsICZhZGRybGVuKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJnZXRzb2NrbmFtZSBlcnJvciIsIHN0YXR1cyk7CisJcmV0dXJuIC0xNjA7CisgICAgfQorCisgICAgLyogT3ZlcnJpZGUgYWRkcmVzcyB3aXRoIDEyNy4wLjAuMSwgc2luY2UgZ2V0c29ja25hbWUgd2lsbCByZXR1cm4KKyAgICAgKiB6ZXJvIGluIHRoZSBhZGRyZXNzIGZpZWxkLgorICAgICAqLworICAgIGFkZHIuc2luX2FkZHIgPSBwal9pbmV0X2FkZHIyKCIxMjcuMC4wLjEiKTsKKworICAgIC8qIEluaXQgYnVmZmVyIHRvIHNlbmQgKi8KKyAgICBwal9hbnNpX3N0cmNweShzZW5kYnVmLCAiSGVsbG8wMTIzIik7CisKKyAgICAvKiBTZW5kIG9uZSBwYWNrZXQuICovCisgICAgYnl0ZXMgPSBzaXplb2Yoc2VuZGJ1Zik7CisgICAgc3RhdHVzID0gcGpfc29ja19zZW5kdG8oc3NvY2ssIHNlbmRidWYsICZieXRlcywgMCwKKwkJCSAgICAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoInNlbmR0byBlcnJvciIsIHN0YXR1cyk7CisJcmV0dXJuIC0xNzA7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgcGFja2V0IGlzIHJlY2VpdmVkLiAqLworICAgIHRpbWVvdXQuc2VjID0gMTsgdGltZW91dC5tc2VjID0gMDsKKyNpZmRlZiBQSl9TWU1CSUFOCisgICAgcGpfc3ltYmlhbm9zX3BvbGwoLTEsIDEwMDApOworI2Vsc2UKKyAgICBwal9pb3F1ZXVlX3BvbGwoaW9xdWV1ZSwgJnRpbWVvdXQpOworI2VuZGlmCisKKyAgICBpZiAocGFja2V0X2NudCAhPSAxKSB7CisJcmV0dXJuIC0xODA7CisgICAgfQorCisgICAgLyogSnVzdCB0byBtYWtlIHN1cmUgdGhpbmdzIGFyZSBzZXR0bGVkLi4gKi8KKyAgICBwal90aHJlYWRfc2xlZXAoMTAwKTsKKworICAgIC8qIFN0YXJ0IHJlYWRpbmcgYWdhaW4uICovCisgICAgYnl0ZXMgPSBzaXplb2YocmVjdmJ1Zik7CisgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9yZWN2KCBrZXksICZvcGtleSwgcmVjdmJ1ZiwgJmJ5dGVzLCAwKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisJYXBwX3BlcnJvcigiRXhwZWN0aW5nIFBKX0VQRU5ESU5HLCBidXQgZ290IHRoaXMiLCBzdGF0dXMpOworCXJldHVybiAtMTkwOworICAgIH0KKworICAgIC8qIFJlc2V0IHBhY2tldCBjb3VudGVyICovCisgICAgcGFja2V0X2NudCA9IDA7CisKKyAgICAvKiBTZW5kIG9uZSBwYWNrZXQuICovCisgICAgYnl0ZXMgPSBzaXplb2Yoc2VuZGJ1Zik7CisgICAgc3RhdHVzID0gcGpfc29ja19zZW5kdG8oc3NvY2ssIHNlbmRidWYsICZieXRlcywgMCwKKwkJCSAgICAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoInNlbmR0byBlcnJvciIsIHN0YXR1cyk7CisJcmV0dXJuIC0yMDA7CisgICAgfQorCisgICAgLyogTm93IHVucmVnaXN0ZXIgYW5kIGNsb3NlIHNvY2tldC4gKi8KKyAgICBwal9pb3F1ZXVlX3VucmVnaXN0ZXIoa2V5KTsKKworICAgIC8qIFBvbGwgaW9xdWV1ZS4gKi8KKyNpZmRlZiBQSl9TWU1CSUFOCisgICAgcGpfc3ltYmlhbm9zX3BvbGwoLTEsIDEwMDApOworI2Vsc2UKKyAgICB0aW1lb3V0LnNlYyA9IDE7IHRpbWVvdXQubXNlYyA9IDA7CisgICAgcGpfaW9xdWV1ZV9wb2xsKGlvcXVldWUsICZ0aW1lb3V0KTsKKyNlbmRpZgorCisgICAgLyogTXVzdCBOT1QgcmVjZWl2ZSBhbnkgcGFja2V0cyBhZnRlciBzb2NrZXQgaXMgY2xvc2VkISAqLworICAgIGlmIChwYWNrZXRfY250ID4gMCkgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICIuLi4uZXJycm9yOiBub3QgZXhwZWN0aW5nIHRvIHJlY2VpdmUgcGFja2V0ICIKKwkJCSAgICAgImFmdGVyIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQiKSk7CisJcmV0dXJuIC0yMTA7CisgICAgfQorCisgICAgLyogU3VjY2VzcyAqLworICAgIHBqX3NvY2tfY2xvc2Uoc3NvY2spOworICAgIHBqX2lvcXVldWVfZGVzdHJveShpb3F1ZXVlKTsKKworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBUZXN0aW5nIHdpdGggbWFueSBoYW5kbGVzLgorICogVGhpcyB3aWxsIGp1c3QgdGVzdCByZWdpc3RlcmluZyBQSl9JT1FVRVVFX01BWF9IQU5ETEVTIGNvdW50CisgKiBvZiBzb2NrZXRzIHRvIHRoZSBpb3F1ZXVlLgorICovCitzdGF0aWMgaW50IG1hbnlfaGFuZGxlc190ZXN0KHBqX2Jvb2xfdCBhbGxvd19jb25jdXIpCit7CisgICAgZW51bSB7IE1BWCA9IFBKX0lPUVVFVUVfTUFYX0hBTkRMRVMgfTsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlOworICAgIHBqX3NvY2tfdCAqc29jazsKKyAgICBwal9pb3F1ZXVlX2tleV90ICoqa2V5OworICAgIHBqX3N0YXR1c190IHJjOworICAgIGludCBjb3VudCwgaTsgLyogbXVzdCBiZSBzaWduZWQgKi8KKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsIi4uLnRlc3Rpbmcgd2l0aCBzbyBtYW55IGhhbmRsZXMiKSk7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCBOVUxMLCA0MDAwLCA0MDAwLCBOVUxMKTsKKyAgICBpZiAoIXBvb2wpCisJcmV0dXJuIFBKX0VOT01FTTsKKworICAgIGtleSA9IChwal9pb3F1ZXVlX2tleV90KiopIAorICAgIAkgIHBqX3Bvb2xfYWxsb2MocG9vbCwgTUFYKnNpemVvZihwal9pb3F1ZXVlX2tleV90KikpOworICAgIHNvY2sgPSAocGpfc29ja190KikgcGpfcG9vbF9hbGxvYyhwb29sLCBNQVgqc2l6ZW9mKHBqX3NvY2tfdCkpOworICAgIAorICAgIC8qIENyZWF0ZSBJT1F1ZXVlICovCisgICAgcmMgPSBwal9pb3F1ZXVlX2NyZWF0ZShwb29sLCBNQVgsICZpb3F1ZXVlKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUyB8fCBpb3F1ZXVlID09IE5VTEwpIHsKKwlhcHBfcGVycm9yKCIuLi5lcnJvciBpbiBwal9pb3F1ZXVlX2NyZWF0ZSIsIHJjKTsKKwlyZXR1cm4gLTEwOworICAgIH0KKworICAgIC8vIFNldCBjb25jdXJyZW5jeQorICAgIHJjID0gcGpfaW9xdWV1ZV9zZXRfZGVmYXVsdF9jb25jdXJyZW5jeShpb3F1ZXVlLCBhbGxvd19jb25jdXIpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJcmV0dXJuIC0xMTsKKyAgICB9CisKKyAgICAvKiBSZWdpc3RlciBhcyBtYW55IHNvY2tldHMuICovCisgICAgZm9yIChjb3VudD0wOyBjb3VudDxNQVg7ICsrY291bnQpIHsKKwlzb2NrW2NvdW50XSA9IFBKX0lOVkFMSURfU09DS0VUOworCXJjID0gcGpfc29ja19zb2NrZXQocGpfQUZfSU5FVCgpLCBwal9TT0NLX0RHUkFNKCksIDAsICZzb2NrW2NvdW50XSk7CisJaWYgKHJjICE9IFBKX1NVQ0NFU1MgfHwgc29ja1tjb3VudF0gPT0gUEpfSU5WQUxJRF9TT0NLRVQpIHsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLi51bmFibGUgdG8gY3JlYXRlICVkLXRoIHNvY2tldCwgcmM9JWQiLCAKKwkJCQkgY291bnQsIHJjKSk7CisJICAgIGJyZWFrOworCX0KKwlrZXlbY291bnRdID0gTlVMTDsKKwlyYyA9IHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayhwb29sLCBpb3F1ZXVlLCBzb2NrW2NvdW50XSwKKwkJCQkgICAgICBOVUxMLCAmdGVzdF9jYiwgJmtleVtjb3VudF0pOworCWlmIChyYyAhPSBQSl9TVUNDRVNTIHx8IGtleVtjb3VudF0gPT0gTlVMTCkgeworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uLnVuYWJsZSB0byByZWdpc3RlciAlZC10aCBzb2NrZXQsIHJjPSVkIiwgCisJCQkJIGNvdW50LCByYykpOworCSAgICByZXR1cm4gLTMwOworCX0KKyAgICB9CisKKyAgICAvKiBUZXN0IGNvbXBsZXRlLiAqLworCisgICAgLyogTm93IGRlcmVnaXN0ZXIgYW5kIGNsb3NlIGFsbCBoYW5kbGVzLiAqLyAKKworICAgIC8qIE5PVEUgZm9yIFJURU1TOgorICAgICAqICBJdCBzZWVtcyB0aGF0IHRoZSBvcmRlciBvZiBjbG9zZShzb2NrKSBpcyBwcmV0dHkgaW1wb3J0YW50IGhlcmUuCisgICAgICogIElmIHdlIGNsb3NlIHRoZSBzb2NrZXRzIHdpdGggdGhlIHNhbWUgb3JkZXIgYXMgd2hlbiB0aGV5IHdlcmUgY3JlYXRlZCwKKyAgICAgKiAgUlRFTVMgZG9lc24ndCBzZWVtIHRvIHJldXNlIHRoZSBzb2NrZXRzLCB0aHVzIG5leHQgc29ja2V0IGNyZWF0ZWQKKyAgICAgKiAgd2lsbCBoYXZlIGRlc2NyaXB0b3IgaGlnaGVyIHRoYW4gdGhlIGxhc3Qgc29ja2V0IGNyZWF0ZWQuCisgICAgICogIElmIHdlIGNsb3NlIHRoZSBzb2NrZXRzIGluIHRoZSByZXZlcnNlIG9yZGVyLCB0aGVuIHRoZSBkZXNjcmlwdG9yIHdpbGwKKyAgICAgKiAgZ2V0IHJldXNlZC4KKyAgICAgKiAgVGhpcyB1c2VkIHRvIGNhdXNlIHByb2JsZW0gd2l0aCBzZWxlY3QgaW9xdWV1ZSwgc2luY2UgdGhlIGlvcXVldWUKKyAgICAgKiAgYWx3YXlzIGdpdmVzIEZEX1NFVFNJWkUgZm9yIHRoZSBmaXJzdCBzZWxlY3QoKSBhcmd1bWVudC4gVGhpcyBpb3F1ZXVlCisgICAgICogIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIHdpdGggc2V0dGluZyBQSl9TRUxFQ1RfTkVFRFNfTkZEUyBtYWNyby4KKyAgICAgKi8KKyAgICBmb3IgKGk9Y291bnQtMTsgaT49MDsgLS1pKSB7CisgICAgLy8vZm9yIChpPTA7IGk8Y291bnQ7ICsraSkgeworCXJjID0gcGpfaW9xdWV1ZV91bnJlZ2lzdGVyKGtleVtpXSk7CisJaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcigiLi4uZXJyb3IgaW4gcGpfaW9xdWV1ZV91bnJlZ2lzdGVyIiwgcmMpOworCX0KKyAgICB9CisKKyAgICByYyA9IHBqX2lvcXVldWVfZGVzdHJveShpb3F1ZXVlKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLmVycm9yIGluIHBqX2lvcXVldWVfZGVzdHJveSIsIHJjKTsKKyAgICB9CisgICAgCisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwiLi4uLm1hbnlfaGFuZGxlc190ZXN0KCkgb2siKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIE11bHRpLW9wZXJhdGlvbiB0ZXN0LgorICovCisKKy8qCisgKiBCZW5jaG1hcmtpbmcgSU9RdWV1ZQorICovCitzdGF0aWMgaW50IGJlbmNoX3Rlc3QocGpfYm9vbF90IGFsbG93X2NvbmN1ciwgaW50IGJ1ZnNpemUsIAorCQkgICAgICBpbnQgaW5hY3RpdmVfc29ja19jb3VudCkKK3sKKyAgICBwal9zb2NrX3Qgc3NvY2s9LTEsIGNzb2NrPS0xOworICAgIHBqX3NvY2thZGRyX2luIGFkZHI7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKyAgICBwal9zb2NrX3QgKmluYWN0aXZlX3NvY2s9TlVMTDsKKyAgICBwal9pb3F1ZXVlX29wX2tleV90ICppbmFjdGl2ZV9yZWFkX29wOworICAgIGNoYXIgKnNlbmRfYnVmLCAqcmVjdl9idWY7CisgICAgcGpfaW9xdWV1ZV90ICppb3F1ZSA9IE5VTEw7CisgICAgcGpfaW9xdWV1ZV9rZXlfdCAqc2tleSwgKmNrZXksICprZXlzW1NPQ0tfSU5BQ1RJVkVfTUFYKzJdOworICAgIHBqX3RpbWVzdGFtcCB0MSwgdDIsIHRfZWxhcHNlZDsKKyAgICBpbnQgcmM9MCwgaTsgICAgLyogaSBtdXN0IGJlIHNpZ25lZCAqLworICAgIHBqX3N0cl90IHRlbXA7CisgICAgY2hhciBlcnJidWZbUEpfRVJSX01TR19TSVpFXTsKKworICAgIFRSQUNFX18oKFRISVNfRklMRSwgIiAgIGJlbmNoIHRlc3QgJWQiLCBpbmFjdGl2ZV9zb2NrX2NvdW50KSk7CisKKyAgICAvLyBDcmVhdGUgcG9vbC4KKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCBOVUxMLCBQT09MX1NJWkUsIDQwMDAsIE5VTEwpOworCisgICAgLy8gQWxsb2NhdGUgYnVmZmVycyBmb3Igc2VuZCBhbmQgcmVjZWl2ZS4KKyAgICBzZW5kX2J1ZiA9IChjaGFyKilwal9wb29sX2FsbG9jKHBvb2wsIGJ1ZnNpemUpOworICAgIHJlY3ZfYnVmID0gKGNoYXIqKXBqX3Bvb2xfYWxsb2MocG9vbCwgYnVmc2l6ZSk7CisKKyAgICAvLyBBbGxvY2F0ZSBzb2NrZXRzIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcuCisgICAgcmMgPSBwal9zb2NrX3NvY2tldChwal9BRl9JTkVUKCksIHBqX1NPQ0tfREdSQU0oKSwgMCwgJnNzb2NrKTsKKyAgICBpZiAocmMgPT0gUEpfU1VDQ0VTUykgeworICAgICAgICByYyA9IHBqX3NvY2tfc29ja2V0KHBqX0FGX0lORVQoKSwgcGpfU09DS19ER1JBTSgpLCAwLCAmY3NvY2spOworICAgIH0gZWxzZQorICAgICAgICBjc29jayA9IFBKX0lOVkFMSURfU09DS0VUOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHBqX3NvY2tfc29ja2V0KCkiLCByYyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBCaW5kIHNlcnZlciBzb2NrZXQuCisgICAgcGpfYnplcm8oJmFkZHIsIHNpemVvZihhZGRyKSk7CisgICAgYWRkci5zaW5fZmFtaWx5ID0gcGpfQUZfSU5FVCgpOworICAgIGFkZHIuc2luX3BvcnQgPSBwal9odG9ucyhQT1JUKTsKKyAgICBpZiAocGpfc29ja19iaW5kKHNzb2NrLCAmYWRkciwgc2l6ZW9mKGFkZHIpKSkKKwlnb3RvIG9uX2Vycm9yOworCisgICAgcGpfYXNzZXJ0KGluYWN0aXZlX3NvY2tfY291bnQrMiA8PSBQSl9JT1FVRVVFX01BWF9IQU5ETEVTKTsKKworICAgIC8vIENyZWF0ZSBJL08gUXVldWUuCisgICAgcmMgPSBwal9pb3F1ZXVlX2NyZWF0ZShwb29sLCBQSl9JT1FVRVVFX01BWF9IQU5ETEVTLCAmaW9xdWUpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHBqX2lvcXVldWVfY3JlYXRlKCkiLCByYyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBTZXQgY29uY3VycmVuY3kKKyAgICByYyA9IHBqX2lvcXVldWVfc2V0X2RlZmF1bHRfY29uY3VycmVuY3koaW9xdWUsIGFsbG93X2NvbmN1cik7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCIuLi5lcnJvcjogcGpfaW9xdWV1ZV9zZXRfZGVmYXVsdF9jb25jdXJyZW5jeSgpIiwgcmMpOworCWdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgaW5hY3RpdmUgc29ja2V0cywgYW5kIGJpbmQgdGhlbSB0byBzb21lIGFyYml0cmFyeSBhZGRyZXNzLgorICAgIC8vIFRoZW4gcmVnaXN0ZXIgdGhlbSB0byB0aGUgSS9PIHF1ZXVlLCBhbmQgc3RhcnQgYSByZWFkIG9wZXJhdGlvbi4KKyAgICBpbmFjdGl2ZV9zb2NrID0gKHBqX3NvY2tfdCopcGpfcG9vbF9hbGxvYyhwb29sLCAKKwkJCQkgICAgaW5hY3RpdmVfc29ja19jb3VudCpzaXplb2YocGpfc29ja190KSk7CisgICAgaW5hY3RpdmVfcmVhZF9vcCA9IChwal9pb3F1ZXVlX29wX2tleV90Kilwal9wb29sX2FsbG9jKHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmFjdGl2ZV9zb2NrX2NvdW50KnNpemVvZihwal9pb3F1ZXVlX29wX2tleV90KSk7CisgICAgcGpfYnplcm8oJmFkZHIsIHNpemVvZihhZGRyKSk7CisgICAgYWRkci5zaW5fZmFtaWx5ID0gcGpfQUZfSU5FVCgpOworICAgIGZvciAoaT0wOyBpPGluYWN0aXZlX3NvY2tfY291bnQ7ICsraSkgeworICAgICAgICBwal9zc2l6ZV90IGJ5dGVzOworCisJcmMgPSBwal9zb2NrX3NvY2tldChwal9BRl9JTkVUKCksIHBqX1NPQ0tfREdSQU0oKSwgMCwgJmluYWN0aXZlX3NvY2tbaV0pOworCWlmIChyYyAhPSBQSl9TVUNDRVNTIHx8IGluYWN0aXZlX3NvY2tbaV0gPCAwKSB7CisJICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9zb2NrX3NvY2tldCgpIiwgcmMpOworCSAgICBnb3RvIG9uX2Vycm9yOworCX0KKwlpZiAoKHJjPXBqX3NvY2tfYmluZChpbmFjdGl2ZV9zb2NrW2ldLCAmYWRkciwgc2l6ZW9mKGFkZHIpKSkgIT0gMCkgeworCSAgICBwal9zb2NrX2Nsb3NlKGluYWN0aXZlX3NvY2tbaV0pOworCSAgICBpbmFjdGl2ZV9zb2NrW2ldID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisJICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9zb2NrX2JpbmQoKSIsIHJjKTsKKwkgICAgZ290byBvbl9lcnJvcjsKKwl9CisJcmMgPSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2socG9vbCwgaW9xdWUsIGluYWN0aXZlX3NvY2tbaV0sIAorCQkJICAgICAgICAgICAgICBOVUxMLCAmdGVzdF9jYiwgJmtleXNbaV0pOworCWlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIHBqX3NvY2tfY2xvc2UoaW5hY3RpdmVfc29ja1tpXSk7CisJICAgIGluYWN0aXZlX3NvY2tbaV0gPSBQSl9JTlZBTElEX1NPQ0tFVDsKKwkgICAgYXBwX3BlcnJvcigiLi4uZXJyb3IoMSk6IHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jaygpIiwgcmMpOworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uLmk9JWQiLCBpKSk7CisJICAgIGdvdG8gb25fZXJyb3I7CisJfQorICAgICAgICBieXRlcyA9IGJ1ZnNpemU7CisJcmMgPSBwal9pb3F1ZXVlX3JlY3Yoa2V5c1tpXSwgJmluYWN0aXZlX3JlYWRfb3BbaV0sIHJlY3ZfYnVmLCAmYnl0ZXMsIDApOworCWlmIChyYyAhPSBQSl9FUEVORElORykgeworCSAgICBwal9zb2NrX2Nsb3NlKGluYWN0aXZlX3NvY2tbaV0pOworCSAgICBpbmFjdGl2ZV9zb2NrW2ldID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisJICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9pb3F1ZXVlX3JlYWQoKSIsIHJjKTsKKwkgICAgZ290byBvbl9lcnJvcjsKKwl9CisgICAgfQorCisgICAgLy8gUmVnaXN0ZXIgc2VydmVyIGFuZCBjbGllbnQgc29ja2V0LgorICAgIC8vIFdlIHB1dCB0aGlzIGFmdGVyIGluYWN0aXZpdHkgc29ja2V0LCBob3BlZnVsbHkgdGhpcyBjYW4gcmVwcmVzZW50IHRoZQorICAgIC8vIHdvcnN0IHdhaXRpbmcgdGltZS4KKyAgICByYyA9IHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayhwb29sLCBpb3F1ZSwgc3NvY2ssIE5VTEwsIAorCQkJICAgICAgICAgICZ0ZXN0X2NiLCAmc2tleSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCIuLi5lcnJvcigyKTogcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKCkiLCByYyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICByYyA9IHBqX2lvcXVldWVfcmVnaXN0ZXJfc29jayhwb29sLCBpb3F1ZSwgY3NvY2ssIE5VTEwsIAorCQkJICAgICAgICAgICZ0ZXN0X2NiLCAmY2tleSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCIuLi5lcnJvcigzKTogcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKCkiLCByYyk7CisJZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvLyBTZXQgZGVzdGluYXRpb24gYWRkcmVzcyB0byBzZW5kIHRoZSBwYWNrZXQuCisgICAgcGpfc29ja2FkZHJfaW5faW5pdCgmYWRkciwgcGpfY3N0cigmdGVtcCwgIjEyNy4wLjAuMSIpLCBQT1JUKTsKKworICAgIC8vIFRlc3QgbG9vcC4KKyAgICB0X2VsYXBzZWQudTY0ID0gMDsKKyAgICBmb3IgKGk9MDsgaTxMT09QOyArK2kpIHsKKwlwal9zc2l6ZV90IGJ5dGVzOworICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90IHJlYWRfb3AsIHdyaXRlX29wOworCisJLy8gUmFuZG9taXplIHNlbmQgYnVmZmVyLgorCXBqX2NyZWF0ZV9yYW5kb21fc3RyaW5nKHNlbmRfYnVmLCBidWZzaXplKTsKKworCS8vIFN0YXJ0IHJlYWRpbmcgb24gdGhlIHNlcnZlciBzaWRlLgorICAgICAgICBieXRlcyA9IGJ1ZnNpemU7CisJcmMgPSBwal9pb3F1ZXVlX3JlY3Yoc2tleSwgJnJlYWRfb3AsIHJlY3ZfYnVmLCAmYnl0ZXMsIDApOworCWlmIChyYyAhPSBQSl9FUEVORElORykgeworCSAgICBhcHBfcGVycm9yKCIuLi5lcnJvcjogcGpfaW9xdWV1ZV9yZWFkKCkiLCByYyk7CisJICAgIGJyZWFrOworCX0KKworCS8vIFN0YXJ0cyBzZW5kIG9uIHRoZSBjbGllbnQgc2lkZS4KKyAgICAgICAgYnl0ZXMgPSBidWZzaXplOworCXJjID0gcGpfaW9xdWV1ZV9zZW5kdG8oY2tleSwgJndyaXRlX29wLCBzZW5kX2J1ZiwgJmJ5dGVzLCAwLAorCQkJICAgICAgICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyYyAhPSBQSl9TVUNDRVNTICYmIHJjICE9IFBKX0VQRU5ESU5HKSB7CisJICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9pb3F1ZXVlX3dyaXRlKCkiLCByYyk7CisJICAgIGJyZWFrOworCX0KKwlpZiAocmMgPT0gUEpfU1VDQ0VTUykgeworCSAgICBpZiAoYnl0ZXMgPCAwKSB7CisJCWFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9pb3F1ZXVlX3NlbmR0bygpIiwocGpfc3RhdHVzX3QpLWJ5dGVzKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKwkvLyBCZWdpbiB0aW1lLgorCXBqX2dldF90aW1lc3RhbXAoJnQxKTsKKworCS8vIFBvbGwgdGhlIHF1ZXVlIHVudGlsIHdlJ3ZlIGdvdCBjb21wbGV0aW9uIGV2ZW50IGluIHRoZSBzZXJ2ZXIgc2lkZS4KKyAgICAgICAgY2FsbGJhY2tfcmVhZF9rZXkgPSBOVUxMOworICAgICAgICBjYWxsYmFja19yZWFkX3NpemUgPSAwOworCVRSQUNFX18oKFRISVNfRklMRSwgIiAgICAgd2FpdGluZyBmb3Iga2V5ID0gJXAiLCBza2V5KSk7CisJZG8geworCSAgICBwal90aW1lX3ZhbCB0aW1lb3V0ID0geyAxLCAwIH07CisjaWZkZWYgUEpfU1lNQklBTgorCSAgICByYyA9IHBqX3N5bWJpYW5vc19wb2xsKC0xLCBQSl9USU1FX1ZBTF9NU0VDKHRpbWVvdXQpKTsKKyNlbHNlCisJICAgIHJjID0gcGpfaW9xdWV1ZV9wb2xsKGlvcXVlLCAmdGltZW91dCk7CisjZW5kaWYKKwkgICAgVFJBQ0VfXygoVEhJU19GSUxFLCAiICAgICBwb2xsIHJjPSVkIiwgcmMpKTsKKwl9IHdoaWxlIChyYyA+PSAwICYmIGNhbGxiYWNrX3JlYWRfa2V5ICE9IHNrZXkpOworCisJLy8gRW5kIHRpbWUuCisJcGpfZ2V0X3RpbWVzdGFtcCgmdDIpOworCXRfZWxhcHNlZC51NjQgKz0gKHQyLnU2NCAtIHQxLnU2NCk7CisKKwlpZiAocmMgPCAwKSB7CisJICAgIGFwcF9wZXJyb3IoIiAgIGVycm9yOiBwal9pb3F1ZXVlX3BvbGwiLCAtcmMpOworCSAgICBicmVhazsKKwl9CisKKwkvLyBDb21wYXJlIHJlY3YgYnVmZmVyIHdpdGggc2VuZCBidWZmZXIuCisJaWYgKGNhbGxiYWNrX3JlYWRfc2l6ZSAhPSBidWZzaXplIHx8IAorCSAgICBwal9tZW1jbXAoc2VuZF9idWYsIHJlY3ZfYnVmLCBidWZzaXplKSkgCisJeworCSAgICByYyA9IC0xMDsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgIGVycm9yOiBzaXplL2J1ZmZlciBtaXNtYXRjaCIpKTsKKwkgICAgYnJlYWs7CisJfQorCisJLy8gUG9sbCB1bnRpbCBhbGwgZXZlbnRzIGFyZSBleGhhdXN0ZWQsIGJlZm9yZSB3ZSBzdGFydCB0aGUgbmV4dCBsb29wLgorCWRvIHsKKwkgICAgcGpfdGltZV92YWwgdGltZW91dCA9IHsgMCwgMTAgfTsKKyNpZmRlZiBQSl9TWU1CSUFOCisJICAgIFBKX1VOVVNFRF9BUkcodGltZW91dCk7CisJICAgIHJjID0gcGpfc3ltYmlhbm9zX3BvbGwoLTEsIDEwMCk7CisjZWxzZQkgICAgCisJICAgIHJjID0gcGpfaW9xdWV1ZV9wb2xsKGlvcXVlLCAmdGltZW91dCk7CisjZW5kaWYKKwl9IHdoaWxlIChyYz4wKTsKKworCXJjID0gMDsKKyAgICB9CisKKyAgICAvLyBQcmludCByZXN1bHRzCisgICAgaWYgKHJjID09IDApIHsKKwlwal90aW1lc3RhbXAgdHplcm87CisJcGpfdWludDMyX3QgdXNlY19kZWxheTsKKworCXR6ZXJvLnUzMi5oaSA9IHR6ZXJvLnUzMi5sbyA9IDA7CisJdXNlY19kZWxheSA9IHBqX2VsYXBzZWRfdXNlYyggJnR6ZXJvLCAmdF9lbGFwc2VkKTsKKworCVBKX0xPRygzLCAoVEhJU19GSUxFLCAiLi4uJTEwZCAlMTVkICAlIDlkIiwgCisJICAgICAgICAgICBidWZzaXplLCBpbmFjdGl2ZV9zb2NrX2NvdW50LCB1c2VjX2RlbGF5KSk7CisKKyAgICB9IGVsc2UgeworCVBKX0xPRygyLCAoVEhJU19GSUxFLCAiLi4uRVJST1IgcmM9JWQgKGJ1ZjolZCwgZmRzOiVkKSIsIAorCQkJICAgICAgcmMsIGJ1ZnNpemUsIGluYWN0aXZlX3NvY2tfY291bnQrMikpOworICAgIH0KKworICAgIC8vIENsZWFuaW5nIHVwLgorICAgIGZvciAoaT1pbmFjdGl2ZV9zb2NrX2NvdW50LTE7IGk+PTA7IC0taSkgeworCXBqX2lvcXVldWVfdW5yZWdpc3RlcihrZXlzW2ldKTsKKyAgICB9CisKKyAgICBwal9pb3F1ZXVlX3VucmVnaXN0ZXIoc2tleSk7CisgICAgcGpfaW9xdWV1ZV91bnJlZ2lzdGVyKGNrZXkpOworCisKKyAgICBwal9pb3F1ZXVlX2Rlc3Ryb3koaW9xdWUpOworICAgIHBqX3Bvb2xfcmVsZWFzZSggcG9vbCk7CisgICAgcmV0dXJuIHJjOworCitvbl9lcnJvcjoKKyAgICBQSl9MT0coMSwoVEhJU19GSUxFLCAiLi4uRVJST1I6ICVzIiwgCisJICAgICAgcGpfc3RyZXJyb3IocGpfZ2V0X25ldG9zX2Vycm9yKCksIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpKSk7CisgICAgaWYgKHNzb2NrKQorCXBqX3NvY2tfY2xvc2Uoc3NvY2spOworICAgIGlmIChjc29jaykKKwlwal9zb2NrX2Nsb3NlKGNzb2NrKTsKKyAgICBmb3IgKGk9MDsgaTxpbmFjdGl2ZV9zb2NrX2NvdW50ICYmIGluYWN0aXZlX3NvY2sgJiYgCisJICAgICAgaW5hY3RpdmVfc29ja1tpXSE9UEpfSU5WQUxJRF9TT0NLRVQ7ICsraSkgCisgICAgeworCXBqX3NvY2tfY2xvc2UoaW5hY3RpdmVfc29ja1tpXSk7CisgICAgfQorICAgIGlmIChpb3F1ZSAhPSBOVUxMKQorCXBqX2lvcXVldWVfZGVzdHJveShpb3F1ZSk7CisgICAgcGpfcG9vbF9yZWxlYXNlKCBwb29sKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdWRwX2lvcXVldWVfdGVzdF9pbXAocGpfYm9vbF90IGFsbG93X2NvbmN1cikKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBidWZzaXplLCBzb2NrX2NvdW50OworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4udGVzdGluZyB3aXRoIGNvbmN1cmVuY3k9JWQiLCBhbGxvd19jb25jdXIpKTsKKworICAgIC8vZ290byBwYXNzMTsKKworICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiLi4uY29tcGxpYW5jZSB0ZXN0ICglcykiLCBwal9pb3F1ZXVlX25hbWUoKSkpOworICAgIGlmICgoc3RhdHVzPWNvbXBsaWFuY2VfdGVzdChhbGxvd19jb25jdXIpKSAhPSAwKSB7CisJcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIuLi4uY29tcGxpYW5jZSB0ZXN0IG9rIikpOworCisKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIi4uLnVucmVnaXN0ZXIgdGVzdCAoJXMpIiwgcGpfaW9xdWV1ZV9uYW1lKCkpKTsKKyAgICBpZiAoKHN0YXR1cz11bnJlZ2lzdGVyX3Rlc3QoYWxsb3dfY29uY3VyKSkgIT0gMCkgeworCXJldHVybiBzdGF0dXM7CisgICAgfQorICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiLi4uLnVucmVnaXN0ZXIgdGVzdCBvayIpKTsKKworICAgIGlmICgoc3RhdHVzPW1hbnlfaGFuZGxlc190ZXN0KGFsbG93X2NvbmN1cikpICE9IDApIHsKKwlyZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAKKyAgICAvL3JldHVybiAwOworCisgICAgUEpfTE9HKDQsIChUSElTX0ZJTEUsICIuLi5iZW5jaG1hcmtpbmcgZGlmZmVyZW50IGJ1ZmZlciBzaXplOiIpKTsKKyAgICBQSl9MT0coNCwgKFRISVNfRklMRSwgIi4uLiBub3RlOiBidWY9Ynl0ZXMgc2VudCwgZmRzPSMgb2YgZmRzLCAiCisJCQkgICJlbGFwc2VkPWluIHRpbWVyIHRpY2tzIikpOworCisvL3Bhc3MxOgorICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiLi4uQmVuY2htYXJraW5nIHBvbGwgdGltZXMgZm9yICVzOiIsIHBqX2lvcXVldWVfbmFtZSgpKSk7CisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIuLi49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikpOworICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiLi4uQnVmLnNpemUgICAjaW5hY3RpdmUtc29ja3MgIFRpbWUvcG9sbCIpKTsKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIi4uLiAoYnl0ZXMpICAgICAgICAgICAgICAgICAgICAobmFub3NlYykiKSk7CisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIuLi49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikpOworCisgICAgLy9nb3RvIHBhc3MyOworCisgICAgZm9yIChidWZzaXplPUJVRl9NSU5fU0laRTsgYnVmc2l6ZSA8PSBCVUZfTUFYX1NJWkU7IGJ1ZnNpemUgKj0gMikgeworCWlmICgoc3RhdHVzPWJlbmNoX3Rlc3QoYWxsb3dfY29uY3VyLCBidWZzaXplLCBTT0NLX0lOQUNUSVZFX01JTikpICE9IDApCisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorLy9wYXNzMjoKKyAgICBidWZzaXplID0gNTEyOworICAgIGZvciAoc29ja19jb3VudD1TT0NLX0lOQUNUSVZFX01JTisyOyAKKwkgc29ja19jb3VudDw9U09DS19JTkFDVElWRV9NQVgrMjsgCisJIHNvY2tfY291bnQgKj0gMikgCisgICAgeworCS8vUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLnRlc3Rpbmcgd2l0aCAlZCBmZHMiLCBzb2NrX2NvdW50KSk7CisJaWYgKChzdGF0dXM9YmVuY2hfdGVzdChhbGxvd19jb25jdXIsIGJ1ZnNpemUsIHNvY2tfY291bnQtMikpICE9IDApCisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgdWRwX2lvcXVldWVfdGVzdCgpCit7CisgICAgaW50IHJjOworCisgICAgcmMgPSB1ZHBfaW9xdWV1ZV90ZXN0X2ltcChQSl9UUlVFKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gcmM7CisKKyAgICByYyA9IHVkcF9pb3F1ZXVlX3Rlc3RfaW1wKFBKX0ZBTFNFKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gcmM7CisKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UKKy8qIFRvIHByZXZlbnQgd2FybmluZyBhYm91dCAidHJhbnNsYXRpb24gdW5pdCBpcyBlbXB0eSIKKyAqIHdoZW4gdGhpcyB0ZXN0IGlzIGRpc2FibGVkLiAKKyAqLworaW50IGR1bW15X3VpcV91ZHA7CisjZW5kaWYJLyogSU5DTFVERV9VRFBfSU9RVUVVRV9URVNUICovCisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2lvcV91bnJlZy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2lvcV91bnJlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDJlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvaW9xX3VucmVnLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qICRJZDogaW9xX3VucmVnLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSAidGVzdC5oIgorCisjaWYgSU5DTFVERV9JT1FVRVVFX1VOUkVHX1RFU1QKKy8qCisgKiBUaGlzIHRlc3RzIHRoZSB0aHJlYWQgc2FmZXR5IG9mIGlvcXVldWUgdW5yZWdpc3RyYXRpb24gb3BlcmF0aW9uLgorICovCisKKyNpbmNsdWRlIDxwai9lcnJuby5oPgorI2luY2x1ZGUgPHBqL2lvcXVldWUuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL3Bvb2wuaD4KKyNpbmNsdWRlIDxwai9zb2NrLmg+CisjaW5jbHVkZSA8cGovY29tcGF0L3NvY2tldC5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorCisKKyNkZWZpbmUgVEhJU19GSUxFICAgImlvcV91bnJlZy5jIgorCisKK2VudW0gdGVzdF9tZXRob2QKK3sKKyAgICBVTlJFR0lTVEVSX0lOX0FQUCwKKyAgICBVTlJFR0lTVEVSX0lOX0NBTExCQUNLLAorfTsKKworc3RhdGljIGludCB0aHJlYWRfcXVpdHRpbmc7CitzdGF0aWMgZW51bSB0ZXN0X21ldGhvZCB0ZXN0X21ldGhvZDsKK3N0YXRpYyBwal90aW1lX3ZhbCB0aW1lX3RvX3VucmVnaXN0ZXI7CisKK3N0cnVjdCBzb2NrX2RhdGEKK3sKKyAgICBwal9zb2NrX3QJCSBzb2NrOworICAgIHBqX3NvY2tfdAkJIGNzb2NrOworICAgIHBqX3Bvb2xfdAkJKnBvb2w7CisgICAgcGpfaW9xdWV1ZV9rZXlfdAkqa2V5OworICAgIHBqX211dGV4X3QJCSptdXRleDsKKyAgICBwal9pb3F1ZXVlX29wX2tleV90CSpvcF9rZXk7CisgICAgY2hhcgkJKmJ1ZmZlcjsKKyAgICBwal9zaXplX3QJCSBidWZzaXplOworICAgIHBqX2Jvb2xfdAkJIHVucmVnaXN0ZXJlZDsKKyAgICBwal9zc2l6ZV90CQkgcmVjZWl2ZWQ7Cit9IHNvY2tfZGF0YTsKKworc3RhdGljIHZvaWQgb25fcmVhZF9jb21wbGV0ZShwal9pb3F1ZXVlX2tleV90ICprZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zc2l6ZV90IGJ5dGVzX3JlYWQpCit7CisgICAgcGpfc3NpemVfdCBzaXplOworICAgIGNoYXIgKnNlbmRidWYgPSAiSGVsbG8gd29ybGQiOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIGlmIChzb2NrX2RhdGEudW5yZWdpc3RlcmVkKQorCXJldHVybjsKKworICAgIHBqX211dGV4X2xvY2soc29ja19kYXRhLm11dGV4KTsKKworICAgIGlmIChzb2NrX2RhdGEudW5yZWdpc3RlcmVkKSB7CisJcGpfbXV0ZXhfdW5sb2NrKHNvY2tfZGF0YS5tdXRleCk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmIChieXRlc19yZWFkIDwgMCkgeworCWlmICgtYnl0ZXNfcmVhZCAhPSBQSl9TVEFUVVNfRlJPTV9PUyhQSl9CTE9DS0lOR19FUlJPUl9WQUwpKQorCSAgICBhcHBfcGVycm9yKCJpb3F1ZXVlIHJlcG9ydGVkIHJlY3YgZXJyb3IiLCAocGpfc3RhdHVzX3QpLWJ5dGVzX3JlYWQpOworICAgIH0gZWxzZSB7CisJc29ja19kYXRhLnJlY2VpdmVkICs9IGJ5dGVzX3JlYWQ7CisgICAgfQorCisgICAgaWYgKHRlc3RfbWV0aG9kID09IFVOUkVHSVNURVJfSU5fQ0FMTEJBQ0spIHsKKwlwal90aW1lX3ZhbCBub3c7CisKKwlwal9nZXR0aW1lb2ZkYXkoJm5vdyk7CisJaWYgKFBKX1RJTUVfVkFMX0dURShub3csIHRpbWVfdG9fdW5yZWdpc3RlcikpIHsgCisJICAgIHNvY2tfZGF0YS51bnJlZ2lzdGVyZWQgPSAxOworCSAgICBwal9pb3F1ZXVlX3VucmVnaXN0ZXIoa2V5KTsKKwkgICAgcGpfbXV0ZXhfdW5sb2NrKHNvY2tfZGF0YS5tdXRleCk7CisJICAgIHJldHVybjsKKwl9CisgICAgfQorIAorICAgIGRvIHsgCisJc2l6ZSA9IHNvY2tfZGF0YS5idWZzaXplOworCXN0YXR1cyA9IHBqX2lvcXVldWVfcmVjdihrZXksIG9wX2tleSwgc29ja19kYXRhLmJ1ZmZlciwgJnNpemUsIDApOworCWlmIChzdGF0dXMgIT0gUEpfRVBFTkRJTkcgJiYgc3RhdHVzICE9IFBKX1NVQ0NFU1MpCisJICAgIGFwcF9wZXJyb3IoInJlY3YoKSBlcnJvciIsIHN0YXR1cyk7CisKKyAgICB9IHdoaWxlIChzdGF0dXMgPT0gUEpfU1VDQ0VTUyk7CisKKyAgICBwal9tdXRleF91bmxvY2soc29ja19kYXRhLm11dGV4KTsKKworICAgIHNpemUgPSBwal9hbnNpX3N0cmxlbihzZW5kYnVmKTsKKyAgICBzdGF0dXMgPSBwal9zb2NrX3NlbmQoc29ja19kYXRhLmNzb2NrLCBzZW5kYnVmLCAmc2l6ZSwgMCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWFwcF9wZXJyb3IoInNlbmQoKSBlcnJvciIsIHN0YXR1cyk7CisKKyAgICBzaXplID0gcGpfYW5zaV9zdHJsZW4oc2VuZGJ1Zik7CisgICAgc3RhdHVzID0gcGpfc29ja19zZW5kKHNvY2tfZGF0YS5jc29jaywgc2VuZGJ1ZiwgJnNpemUsIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykKKwlhcHBfcGVycm9yKCJzZW5kKCkgZXJyb3IiLCBzdGF0dXMpOworCit9IAorCitzdGF0aWMgaW50IHdvcmtlcl90aHJlYWQodm9pZCAqYXJnKQoreworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSA9IChwal9pb3F1ZXVlX3QqKSBhcmc7CisKKyAgICB3aGlsZSAoIXRocmVhZF9xdWl0dGluZykgeworCXBqX3RpbWVfdmFsIHRpbWVvdXQgPSB7IDAsIDIwIH07CisJcGpfaW9xdWV1ZV9wb2xsKGlvcXVldWUsICZ0aW1lb3V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gdW5yZWdpc3RyYXRpb24gdGVzdC4KKyAqCisgKiBUaGlzIHdpbGwgY3JlYXRlIGlvcXVldWUgYW5kIHJlZ2lzdGVyIGEgc2VydmVyIHNvY2tldC4gRGVwZW5kaW5nCisgKiBvbiB0aGUgdGVzdCBtZXRob2QsIGVpdGhlciB0aGUgY2FsbGJhY2sgb3IgdGhlIG1haW4gdGhyZWFkIHdpbGwKKyAqIHVucmVnaXN0ZXIgYW5kIGRlc3Ryb3kgdGhlIHNlcnZlciBzb2NrZXQgYWZ0ZXIgc29tZSBwZXJpb2Qgb2YgdGltZS4KKyAqLworc3RhdGljIGludCBwZXJmb3JtX3VucmVnX3Rlc3QocGpfaW9xdWV1ZV90ICppb3F1ZXVlLAorCQkJICAgICAgcGpfcG9vbF90ICp0ZXN0X3Bvb2wsCisJCQkgICAgICBjb25zdCBjaGFyICp0aXRsZSwgCisJCQkgICAgICBwal9ib29sX3Qgb3RoZXJfc29ja2V0KQoreworICAgIGVudW0geyBXT1JLRVJfQ05UID0gMSwgTVNFQyA9IDUwMCwgUVVJVF9NU0VDID0gNTAwIH07CisgICAgaW50IGk7CisgICAgcGpfdGhyZWFkX3QgKnRocmVhZFtXT1JLRVJfQ05UXTsKKyAgICBzdHJ1Y3Qgc29ja19kYXRhIG9zZDsKKyAgICBwal9pb3F1ZXVlX2NhbGxiYWNrIGNhbGxiYWNrOworICAgIHBqX3RpbWVfdmFsIGVuZF90aW1lOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworCisgICAgLyogU29tZXRpbWVzIGl0cyBpbXBvcnRhbnQgdG8gaGF2ZSBvdGhlciBzb2NrZXRzIHJlZ2lzdGVyZWQgdG8KKyAgICAgKiB0aGUgaW9xdWV1ZSwgYmVjYXVzZSB3aGVuIG5vIHNvY2tldHMgYXJlIHJlZ2lzdGVyZWQsIHRoZSBpb3F1ZXVlCisgICAgICogd2lsbCByZXR1cm4gZnJvbSB0aGUgcG9sbCBlYXJseS4KKyAgICAgKi8KKyAgICBpZiAob3RoZXJfc29ja2V0KSB7CisJc3RhdHVzID0gYXBwX3NvY2tldChwal9BRl9JTkVUKCksIHBqX1NPQ0tfREdSQU0oKSwgMCwgNTYxMjcsICZvc2Quc29jayk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoIkVycm9yIGNyZWF0aW5nIG90aGVyIHNvY2tldCIsIHN0YXR1cyk7CisJICAgIHJldHVybiAtMTI7CisJfQorCisJcGpfYnplcm8oJmNhbGxiYWNrLCBzaXplb2YoY2FsbGJhY2spKTsKKwlzdGF0dXMgPSBwal9pb3F1ZXVlX3JlZ2lzdGVyX3NvY2sodGVzdF9wb29sLCBpb3F1ZXVlLCBvc2Quc29jaywKKwkJCQkJICBOVUxMLCAmY2FsbGJhY2ssICZvc2Qua2V5KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcigiRXJyb3IgcmVnaXN0ZXJpbmcgb3RoZXIgc29ja2V0Iiwgc3RhdHVzKTsKKwkgICAgcmV0dXJuIC0xMzsKKwl9CisKKyAgICB9IGVsc2UgeworCW9zZC5rZXkgPSBOVUxMOworCW9zZC5zb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgfQorCisgICAgLyogSW5pdCBib3RoIHRpbWUgZHVyYXRpb24gb2YgdGVzdGluZyAqLworICAgIHRocmVhZF9xdWl0dGluZyA9IDA7CisgICAgcGpfZ2V0dGltZW9mZGF5KCZ0aW1lX3RvX3VucmVnaXN0ZXIpOworICAgIHRpbWVfdG9fdW5yZWdpc3Rlci5tc2VjICs9IE1TRUM7CisgICAgcGpfdGltZV92YWxfbm9ybWFsaXplKCZ0aW1lX3RvX3VucmVnaXN0ZXIpOworCisgICAgZW5kX3RpbWUgPSB0aW1lX3RvX3VucmVnaXN0ZXI7CisgICAgZW5kX3RpbWUubXNlYyArPSBRVUlUX01TRUM7CisgICAgcGpfdGltZV92YWxfbm9ybWFsaXplKCZlbmRfdGltZSk7CisKKyAgICAKKyAgICAvKiBDcmVhdGUgcG9sbGluZyB0aHJlYWQgKi8KKyAgICBmb3IgKGk9MDsgaTxXT1JLRVJfQ05UOyArK2kpIHsKKwlzdGF0dXMgPSBwal90aHJlYWRfY3JlYXRlKHRlc3RfcG9vbCwgInVucmVndGVzdCIsICZ3b3JrZXJfdGhyZWFkLAorCQkJCSAgIGlvcXVldWUsIDAsIDAsICZ0aHJlYWRbaV0pOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBhcHBfcGVycm9yKCJFcnJvciBjcmVhdGluZyB0aHJlYWQiLCBzdGF0dXMpOworCSAgICByZXR1cm4gLTIwOworCX0KKyAgICB9CisKKyAgICAvKiBDcmVhdGUgcGFpciBvZiBjbGllbnQvc2VydmVyIHNvY2tldHMgKi8KKyAgICBzdGF0dXMgPSBhcHBfc29ja2V0cGFpcihwal9BRl9JTkVUKCksIHBqX1NPQ0tfREdSQU0oKSwgMCwgCisJCQkgICAgJnNvY2tfZGF0YS5zb2NrLCAmc29ja19kYXRhLmNzb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJhcHBfc29ja2V0cGFpciBlcnJvciIsIHN0YXR1cyk7CisJcmV0dXJuIC0zMDsKKyAgICB9CisKKworICAgIC8qIEluaXRpYWxpemUgdGVzdCBkYXRhICovCisgICAgc29ja19kYXRhLnBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sICJzZCIsIDEwMDAsIDEwMDAsIE5VTEwpOworICAgIHNvY2tfZGF0YS5idWZmZXIgPSAoY2hhciopIHBqX3Bvb2xfYWxsb2Moc29ja19kYXRhLnBvb2wsIDEyOCk7CisgICAgc29ja19kYXRhLmJ1ZnNpemUgPSAxMjg7CisgICAgc29ja19kYXRhLm9wX2tleSA9IChwal9pb3F1ZXVlX29wX2tleV90KikgCisgICAgCQkgICAgICAgcGpfcG9vbF9hbGxvYyhzb2NrX2RhdGEucG9vbCwgCisJCQkJICAgICBzaXplb2YoKnNvY2tfZGF0YS5vcF9rZXkpKTsKKyAgICBzb2NrX2RhdGEucmVjZWl2ZWQgPSAwOworICAgIHNvY2tfZGF0YS51bnJlZ2lzdGVyZWQgPSAwOworCisgICAgcGpfaW9xdWV1ZV9vcF9rZXlfaW5pdChzb2NrX2RhdGEub3Bfa2V5LCBzaXplb2YoKnNvY2tfZGF0YS5vcF9rZXkpKTsKKworICAgIHN0YXR1cyA9IHBqX211dGV4X2NyZWF0ZV9zaW1wbGUoc29ja19kYXRhLnBvb2wsICJzZCIsICZzb2NrX2RhdGEubXV0ZXgpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoImNyZWF0ZV9tdXRleCgpIGVycm9yIiwgc3RhdHVzKTsKKwlyZXR1cm4gLTM1OworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIHNvY2tldCB0byBpb3F1ZXVlICovCisgICAgcGpfYnplcm8oJmNhbGxiYWNrLCBzaXplb2YoY2FsbGJhY2spKTsKKyAgICBjYWxsYmFjay5vbl9yZWFkX2NvbXBsZXRlID0gJm9uX3JlYWRfY29tcGxldGU7CisgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKHNvY2tfZGF0YS5wb29sLCBpb3F1ZXVlLCBzb2NrX2RhdGEuc29jaywKKwkJCQkgICAgICBOVUxMLCAmY2FsbGJhY2ssICZzb2NrX2RhdGEua2V5KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCJwal9pb3F1ZXVlX3JlZ2lzdGVyIGVycm9yIiwgc3RhdHVzKTsKKwlyZXR1cm4gLTQwOworICAgIH0KKworICAgIC8qIEJvb3RzdHJhcCB0aGUgZmlyc3Qgc2VuZC9yZWNlaXZlICovCisgICAgb25fcmVhZF9jb21wbGV0ZShzb2NrX2RhdGEua2V5LCBzb2NrX2RhdGEub3Bfa2V5LCAwKTsKKworICAgIC8qIExvb3AgdW50aWwgdGVzdCB0aW1lIGVuZHMgKi8KKyAgICBmb3IgKDs7KSB7CisJcGpfdGltZV92YWwgbm93LCB0aW1lb3V0OworCWludCBuOworCisJcGpfZ2V0dGltZW9mZGF5KCZub3cpOworCisJaWYgKHRlc3RfbWV0aG9kID09IFVOUkVHSVNURVJfSU5fQVBQICYmIAorCSAgICBQSl9USU1FX1ZBTF9HVEUobm93LCB0aW1lX3RvX3VucmVnaXN0ZXIpICYmCisJICAgICFzb2NrX2RhdGEudW5yZWdpc3RlcmVkKSAKKwl7CisJICAgIHNvY2tfZGF0YS51bnJlZ2lzdGVyZWQgPSAxOworCSAgICAvKiBXYWl0IChhcyBtdWNoIGFzIHBvc3NpYmxlKSBmb3IgY2FsbGJhY2sgdG8gY29tcGxldGUgKi8KKwkgICAgcGpfbXV0ZXhfbG9jayhzb2NrX2RhdGEubXV0ZXgpOworCSAgICBwal9tdXRleF91bmxvY2soc29ja19kYXRhLm11dGV4KTsKKwkgICAgcGpfaW9xdWV1ZV91bnJlZ2lzdGVyKHNvY2tfZGF0YS5rZXkpOworCX0KKworCWlmIChQSl9USU1FX1ZBTF9HVChub3csIGVuZF90aW1lKSAmJiBzb2NrX2RhdGEudW5yZWdpc3RlcmVkKQorCSAgICBicmVhazsKKworCXRpbWVvdXQuc2VjID0gMDsgdGltZW91dC5tc2VjID0gMTA7CisJbiA9IHBqX2lvcXVldWVfcG9sbChpb3F1ZXVlLCAmdGltZW91dCk7CisJaWYgKG4gPCAwKSB7CisJICAgIGFwcF9wZXJyb3IoInBqX2lvcXVldWVfcG9sbCBlcnJvciIsIC1uKTsKKwkgICAgcGpfdGhyZWFkX3NsZWVwKDEpOworCX0KKyAgICB9CisKKyAgICB0aHJlYWRfcXVpdHRpbmcgPSAxOworCisgICAgZm9yIChpPTA7IGk8V09SS0VSX0NOVDsgKytpKSB7CisJcGpfdGhyZWFkX2pvaW4odGhyZWFkW2ldKTsKKwlwal90aHJlYWRfZGVzdHJveSh0aHJlYWRbaV0pOworICAgIH0KKworICAgIC8qIERlc3Ryb3kgZGF0YSAqLworICAgIHBqX211dGV4X2Rlc3Ryb3koc29ja19kYXRhLm11dGV4KTsKKyAgICBwal9wb29sX3JlbGVhc2Uoc29ja19kYXRhLnBvb2wpOworICAgIHNvY2tfZGF0YS5wb29sID0gTlVMTDsKKworICAgIGlmIChvdGhlcl9zb2NrZXQpIHsKKwlwal9pb3F1ZXVlX3VucmVnaXN0ZXIob3NkLmtleSk7CisgICAgfQorCisgICAgcGpfc29ja19jbG9zZShzb2NrX2RhdGEuY3NvY2spOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLi4lczogZG9uZSAoJWQgS0IvcykiLAorCSAgICAgIHRpdGxlLCBzb2NrX2RhdGEucmVjZWl2ZWQgKiAxMDAwIC8gTVNFQyAvIDEwMDApKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZHBfaW9xdWV1ZV91bnJlZ190ZXN0X2ltcChwal9ib29sX3QgYWxsb3dfY29uY3VyKQoreworICAgIGVudW0geyBMT09QID0gMTAgfTsKKyAgICBpbnQgaSwgcmM7CisgICAgY2hhciB0aXRsZVszMF07CisgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlOworICAgIHBqX3Bvb2xfdCAqdGVzdF9wb29sOworCQorICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLnRlc3Rpbmcgd2l0aCBjb25jdXJlbmN5PSVkIiwgYWxsb3dfY29uY3VyKSk7CisKKyAgICB0ZXN0X21ldGhvZCA9IFVOUkVHSVNURVJfSU5fQVBQOworCisgICAgdGVzdF9wb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCAidW5yZWd0ZXN0IiwgNDAwMCwgNDAwMCwgTlVMTCk7CisKKyAgICByYyA9IHBqX2lvcXVldWVfY3JlYXRlKHRlc3RfcG9vbCwgMTYsICZpb3F1ZXVlKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGNyZWF0aW5nIGlvcXVldWUiLCByYyk7CisJcmV0dXJuIC0xMDsKKyAgICB9CisKKyAgICByYyA9IHBqX2lvcXVldWVfc2V0X2RlZmF1bHRfY29uY3VycmVuY3koaW9xdWV1ZSwgYWxsb3dfY29uY3VyKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIkVycm9yIGluIHBqX2lvcXVldWVfc2V0X2RlZmF1bHRfY29uY3VycmVuY3koKSIsIHJjKTsKKwlyZXR1cm4gLTEyOworICAgIH0KKworICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiLi4uaW9xdWV1ZSB1bnJlZ2lzdGVyIHN0cmVzcyB0ZXN0IDAvMywgdW5yZWdpc3RlciBpbiBhcHAgKCVzKSIsIAorCSAgICAgICBwal9pb3F1ZXVlX25hbWUoKSkpOworICAgIGZvciAoaT0wOyBpPExPT1A7ICsraSkgeworCXBqX2Fuc2lfc3ByaW50Zih0aXRsZSwgInJlcGVhdCAlZC8lZCIsIGksIExPT1ApOworCXJjID0gcGVyZm9ybV91bnJlZ190ZXN0KGlvcXVldWUsIHRlc3RfcG9vbCwgdGl0bGUsIDApOworCWlmIChyYyAhPSAwKQorCSAgICByZXR1cm4gcmM7CisgICAgfQorCisKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIi4uLmlvcXVldWUgdW5yZWdpc3RlciBzdHJlc3MgdGVzdCAxLzMsIHVucmVnaXN0ZXIgaW4gYXBwICglcykiLAorCSAgICAgICBwal9pb3F1ZXVlX25hbWUoKSkpOworICAgIGZvciAoaT0wOyBpPExPT1A7ICsraSkgeworCXBqX2Fuc2lfc3ByaW50Zih0aXRsZSwgInJlcGVhdCAlZC8lZCIsIGksIExPT1ApOworCXJjID0gcGVyZm9ybV91bnJlZ190ZXN0KGlvcXVldWUsIHRlc3RfcG9vbCwgdGl0bGUsIDEpOworCWlmIChyYyAhPSAwKQorCSAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgdGVzdF9tZXRob2QgPSBVTlJFR0lTVEVSX0lOX0NBTExCQUNLOworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIuLi5pb3F1ZXVlIHVucmVnaXN0ZXIgc3RyZXNzIHRlc3QgMi8zLCB1bnJlZ2lzdGVyIGluIGNiICglcykiLCAKKwkgICAgICAgcGpfaW9xdWV1ZV9uYW1lKCkpKTsKKyAgICBmb3IgKGk9MDsgaTxMT09QOyArK2kpIHsKKwlwal9hbnNpX3NwcmludGYodGl0bGUsICJyZXBlYXQgJWQvJWQiLCBpLCBMT09QKTsKKwlyYyA9IHBlcmZvcm1fdW5yZWdfdGVzdChpb3F1ZXVlLCB0ZXN0X3Bvb2wsIHRpdGxlLCAwKTsKKwlpZiAocmMgIT0gMCkKKwkgICAgcmV0dXJuIHJjOworICAgIH0KKworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIuLi5pb3F1ZXVlIHVucmVnaXN0ZXIgc3RyZXNzIHRlc3QgMy8zLCB1bnJlZ2lzdGVyIGluIGNiICglcykiLCAKKwkgICAgICAgcGpfaW9xdWV1ZV9uYW1lKCkpKTsKKyAgICBmb3IgKGk9MDsgaTxMT09QOyArK2kpIHsKKwlwal9hbnNpX3NwcmludGYodGl0bGUsICJyZXBlYXQgJWQvJWQiLCBpLCBMT09QKTsKKwlyYyA9IHBlcmZvcm1fdW5yZWdfdGVzdChpb3F1ZXVlLCB0ZXN0X3Bvb2wsIHRpdGxlLCAxKTsKKwlpZiAocmMgIT0gMCkKKwkgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHBqX2lvcXVldWVfZGVzdHJveShpb3F1ZXVlKTsKKyAgICBwal9wb29sX3JlbGVhc2UodGVzdF9wb29sKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdWRwX2lvcXVldWVfdW5yZWdfdGVzdCh2b2lkKQoreworICAgIGludCByYzsKKworICAgIHJjID0gdWRwX2lvcXVldWVfdW5yZWdfdGVzdF9pbXAoUEpfVFJVRSk7CisgICAgaWYgKHJjICE9IDApCisgICAgCXJldHVybiByYzsKKworICAgIHJjID0gdWRwX2lvcXVldWVfdW5yZWdfdGVzdF9pbXAoUEpfRkFMU0UpOworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworICAgIHJldHVybiAwOworfQorCisjZWxzZQorLyogVG8gcHJldmVudCB3YXJuaW5nIGFib3V0ICJ0cmFuc2xhdGlvbiB1bml0IGlzIGVtcHR5IgorICogd2hlbiB0aGlzIHRlc3QgaXMgZGlzYWJsZWQuIAorICovCitpbnQgZHVtbXlfdWlxX3VucmVnOworI2VuZGlmCS8qIElOQ0xVREVfSU9RVUVVRV9VTlJFR19URVNUICovCisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L2xpc3QuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1NGQzNQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9saXN0LmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qICRJZDogbGlzdC5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKworLyoqCisgKiBccGFnZSBwYWdlX3BqbGliX2xpc3RfdGVzdCBUZXN0OiBMaW5rZWQgTGlzdAorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiBcYiBsaXN0X3Rlc3QoKS4gSXQgdGVzdHMgdGhlCisgKiBmdW5jdGlvbmFsaXR5IG9mIHRoZSBsaW5rZWQtbGlzdCBBUEkuCisgKgorICogXHNlY3Rpb24gbGlzdF90ZXN0X3NlYyBTY29wZSBvZiB0aGUgVGVzdAorICoKKyAqIEFQSSB0ZXN0ZWQ6CisgKiAgLSBwal9saXN0X2luaXQoKQorICogIC0gcGpfbGlzdF9pbnNlcnRfYmVmb3JlKCkKKyAqICAtIHBqX2xpc3RfaW5zZXJ0X2FmdGVyKCkKKyAqICAtIHBqX2xpc3RfbWVyZ2VfbGFzdCgpCisgKiAgLSBwal9saXN0X2VtcHR5KCkKKyAqICAtIHBqX2xpc3RfaW5zZXJ0X25vZGVzX2JlZm9yZSgpCisgKiAgLSBwal9saXN0X2VyYXNlKCkKKyAqICAtIHBqX2xpc3RfZmluZF9ub2RlKCkKKyAqICAtIHBqX2xpc3Rfc2VhcmNoKCkKKyAqCisgKgorICogVGhpcyBmaWxlIGlzIDxiPnBqbGliLXRlc3QvbGlzdC5jPC9iPgorICoKKyAqIFxpbmNsdWRlIHBqbGliLXRlc3QvbGlzdC5jCisgKi8KKworI2lmIElOQ0xVREVfTElTVF9URVNUCisKKyNpbmNsdWRlIDxwamxpYi5oPgorCit0eXBlZGVmIHN0cnVjdCBsaXN0X25vZGUKK3sKKyAgICBQSl9ERUNMX0xJU1RfTUVNQkVSKHN0cnVjdCBsaXN0X25vZGUpOworICAgIGludCB2YWx1ZTsKK30gbGlzdF9ub2RlOworCitzdGF0aWMgaW50IGNvbXBhcmVfbm9kZSh2b2lkICp2YWx1ZSwgY29uc3QgcGpfbGlzdF90eXBlICpuZCkKK3sKKyAgICBsaXN0X25vZGUgKm5vZGUgPSAobGlzdF9ub2RlKiluZDsKKyAgICByZXR1cm4gKChsb25nKShwal9zc2l6ZV90KXZhbHVlID09IG5vZGUtPnZhbHVlKSA/IDAgOiAtMTsKK30KKworI2RlZmluZSBQSl9TSUdORURfQVJSQVlfU0laRShhKQkoKGludClQSl9BUlJBWV9TSVpFKGEpKQorCitpbnQgbGlzdF90ZXN0KCkKK3sKKyAgICBsaXN0X25vZGUgbm9kZXNbNF07ICAgIC8vIG11c3QgYmUgZXZlbiBudW1iZXIgb2Ygbm9kZXMKKyAgICBsaXN0X25vZGUgbGlzdDsKKyAgICBsaXN0X25vZGUgbGlzdDI7CisgICAgbGlzdF9ub2RlICpwOworICAgIGludCBpOyAvLyBkb24ndCBjaGFuZ2UgdG8gdW5zaWduZWQhCisKKyAgICAvLworICAgIC8vIFRlc3QgaW5zZXJ0X2JlZm9yZSgpLgorICAgIC8vCisgICAgbGlzdC52YWx1ZSA9ICh1bnNpZ25lZCktMTsKKyAgICBwal9saXN0X2luaXQoJmxpc3QpOworICAgIGZvciAoaT0wOyBpPFBKX1NJR05FRF9BUlJBWV9TSVpFKG5vZGVzKTsgKytpKSB7CisJbm9kZXNbaV0udmFsdWUgPSBpOworCXBqX2xpc3RfaW5zZXJ0X2JlZm9yZSgmbGlzdCwgJm5vZGVzW2ldKTsKKyAgICB9CisgICAgLy8gY2hlY2suCisgICAgZm9yIChpPTAsIHA9bGlzdC5uZXh0OyBpPFBKX1NJR05FRF9BUlJBWV9TSVpFKG5vZGVzKTsgKytpLCBwPXAtPm5leHQpIHsKKwlwal9hc3NlcnQocC0+dmFsdWUgPT0gaSk7CisJaWYgKHAtPnZhbHVlICE9IGkpIHsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFRlc3QgaW5zZXJ0X2FmdGVyKCkKKyAgICAvLworICAgIHBqX2xpc3RfaW5pdCgmbGlzdCk7CisgICAgZm9yIChpPVBKX1NJR05FRF9BUlJBWV9TSVpFKG5vZGVzKS0xOyBpPj0wOyAtLWkpIHsKKwlwal9saXN0X2luc2VydF9hZnRlcigmbGlzdCwgJm5vZGVzW2ldKTsKKyAgICB9CisgICAgLy8gY2hlY2suCisgICAgZm9yIChpPTAsIHA9bGlzdC5uZXh0OyBpPFBKX1NJR05FRF9BUlJBWV9TSVpFKG5vZGVzKTsgKytpLCBwPXAtPm5leHQpIHsKKwlwal9hc3NlcnQocC0+dmFsdWUgPT0gaSk7CisJaWYgKHAtPnZhbHVlICE9IGkpIHsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFRlc3QgbWVyZ2VfbGFzdCgpCisgICAgLy8KKyAgICAvLyBJbml0IGxpc3RzCisgICAgcGpfbGlzdF9pbml0KCZsaXN0KTsKKyAgICBwal9saXN0X2luaXQoJmxpc3QyKTsKKyAgICBmb3IgKGk9MDsgaTxQSl9TSUdORURfQVJSQVlfU0laRShub2RlcykvMjsgKytpKSB7CisJcGpfbGlzdF9pbnNlcnRfYmVmb3JlKCZsaXN0LCAmbm9kZXNbaV0pOworICAgIH0KKyAgICBmb3IgKGk9UEpfU0lHTkVEX0FSUkFZX1NJWkUobm9kZXMpLzI7IGk8UEpfU0lHTkVEX0FSUkFZX1NJWkUobm9kZXMpOyArK2kpIHsKKwlwal9saXN0X2luc2VydF9iZWZvcmUoJmxpc3QyLCAmbm9kZXNbaV0pOworICAgIH0KKyAgICAvLyBtZXJnZQorICAgIHBqX2xpc3RfbWVyZ2VfbGFzdCgmbGlzdCwgJmxpc3QyKTsKKyAgICAvLyBjaGVjay4KKyAgICBmb3IgKGk9MCwgcD1saXN0Lm5leHQ7IGk8UEpfU0lHTkVEX0FSUkFZX1NJWkUobm9kZXMpOyArK2ksIHA9cC0+bmV4dCkgeworCXBqX2Fzc2VydChwLT52YWx1ZSA9PSBpKTsKKwlpZiAocC0+dmFsdWUgIT0gaSkgeworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKyAgICAvLyBjaGVjayBsaXN0IGlzIGVtcHR5CisgICAgcGpfYXNzZXJ0KCBwal9saXN0X2VtcHR5KCZsaXN0MikgKTsKKyAgICBpZiAoIXBqX2xpc3RfZW1wdHkoJmxpc3QyKSkgeworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyAKKyAgICAvLyBDaGVjayBtZXJnZV9maXJzdCgpCisgICAgLy8KKyAgICBwal9saXN0X2luaXQoJmxpc3QpOworICAgIHBqX2xpc3RfaW5pdCgmbGlzdDIpOworICAgIGZvciAoaT0wOyBpPFBKX1NJR05FRF9BUlJBWV9TSVpFKG5vZGVzKS8yOyArK2kpIHsKKwlwal9saXN0X2luc2VydF9iZWZvcmUoJmxpc3QsICZub2Rlc1tpXSk7CisgICAgfQorICAgIGZvciAoaT1QSl9TSUdORURfQVJSQVlfU0laRShub2RlcykvMjsgaTxQSl9TSUdORURfQVJSQVlfU0laRShub2Rlcyk7ICsraSkgeworCXBqX2xpc3RfaW5zZXJ0X2JlZm9yZSgmbGlzdDIsICZub2Rlc1tpXSk7CisgICAgfQorICAgIC8vIG1lcmdlCisgICAgcGpfbGlzdF9tZXJnZV9maXJzdCgmbGlzdDIsICZsaXN0KTsKKyAgICAvLyBjaGVjayAobGlzdDIpLgorICAgIGZvciAoaT0wLCBwPWxpc3QyLm5leHQ7IGk8UEpfU0lHTkVEX0FSUkFZX1NJWkUobm9kZXMpOyArK2ksIHA9cC0+bmV4dCkgeworCXBqX2Fzc2VydChwLT52YWx1ZSA9PSBpKTsKKwlpZiAocC0+dmFsdWUgIT0gaSkgeworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKyAgICAvLyBjaGVjayBsaXN0IGlzIGVtcHR5CisgICAgcGpfYXNzZXJ0KCBwal9saXN0X2VtcHR5KCZsaXN0KSApOworICAgIGlmICghcGpfbGlzdF9lbXB0eSgmbGlzdCkpIHsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBUZXN0IGluc2VydF9ub2Rlc19iZWZvcmUoKQorICAgIC8vCisgICAgLy8gaW5pdCBsaXN0CisgICAgcGpfbGlzdF9pbml0KCZsaXN0KTsKKyAgICBmb3IgKGk9MDsgaTxQSl9TSUdORURfQVJSQVlfU0laRShub2RlcykvMjsgKytpKSB7CisJcGpfbGlzdF9pbnNlcnRfYmVmb3JlKCZsaXN0LCAmbm9kZXNbaV0pOworICAgIH0KKyAgICAvLyBjaGFpbiByZW1haW5pbmcgbm9kZXMKKyAgICBwal9saXN0X2luaXQoJm5vZGVzW1BKX1NJR05FRF9BUlJBWV9TSVpFKG5vZGVzKS8yXSk7CisgICAgZm9yIChpPVBKX1NJR05FRF9BUlJBWV9TSVpFKG5vZGVzKS8yKzE7IGk8UEpfU0lHTkVEX0FSUkFZX1NJWkUobm9kZXMpOyArK2kpIHsKKwlwal9saXN0X2luc2VydF9iZWZvcmUoJm5vZGVzW1BKX1NJR05FRF9BUlJBWV9TSVpFKG5vZGVzKS8yXSwgJm5vZGVzW2ldKTsKKyAgICB9CisgICAgLy8gaW5zZXJ0IG5vZGVzCisgICAgcGpfbGlzdF9pbnNlcnRfbm9kZXNfYmVmb3JlKCZsaXN0LCAmbm9kZXNbUEpfU0lHTkVEX0FSUkFZX1NJWkUobm9kZXMpLzJdKTsKKyAgICAvLyBjaGVjaworICAgIGZvciAoaT0wLCBwPWxpc3QubmV4dDsgaTxQSl9TSUdORURfQVJSQVlfU0laRShub2Rlcyk7ICsraSwgcD1wLT5uZXh0KSB7CisJcGpfYXNzZXJ0KHAtPnZhbHVlID09IGkpOworCWlmIChwLT52YWx1ZSAhPSBpKSB7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgICAgLy8gZXJhc2UgdGVzdC4KKyAgICBwal9saXN0X2luaXQoJmxpc3QpOworICAgIGZvciAoaT0wOyBpPFBKX1NJR05FRF9BUlJBWV9TSVpFKG5vZGVzKTsgKytpKSB7CisJbm9kZXNbaV0udmFsdWUgPSBpOworCXBqX2xpc3RfaW5zZXJ0X2JlZm9yZSgmbGlzdCwgJm5vZGVzW2ldKTsKKyAgICB9CisgICAgZm9yIChpPVBKX1NJR05FRF9BUlJBWV9TSVpFKG5vZGVzKS0xOyBpPj0wOyAtLWkpIHsKKwlpbnQgajsKKwlwal9saXN0X2VyYXNlKCZub2Rlc1tpXSk7CisJZm9yIChqPTAsIHA9bGlzdC5uZXh0OyBqPGk7ICsraiwgcD1wLT5uZXh0KSB7CisJICAgIHBqX2Fzc2VydChwLT52YWx1ZSA9PSBqKTsKKwkgICAgaWYgKHAtPnZhbHVlICE9IGopIHsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8vIGZpbmQgYW5kIHNlYXJjaAorICAgIHBqX2xpc3RfaW5pdCgmbGlzdCk7CisgICAgZm9yIChpPTA7IGk8UEpfU0lHTkVEX0FSUkFZX1NJWkUobm9kZXMpOyArK2kpIHsKKwlub2Rlc1tpXS52YWx1ZSA9IGk7CisJcGpfbGlzdF9pbnNlcnRfYmVmb3JlKCZsaXN0LCAmbm9kZXNbaV0pOworICAgIH0KKyAgICBmb3IgKGk9MDsgaTxQSl9TSUdORURfQVJSQVlfU0laRShub2Rlcyk7ICsraSkgeworCXAgPSAobGlzdF9ub2RlKikgcGpfbGlzdF9maW5kX25vZGUoJmxpc3QsICZub2Rlc1tpXSk7CisJcGpfYXNzZXJ0KCBwID09ICZub2Rlc1tpXSApOworCWlmIChwICE9ICZub2Rlc1tpXSkgeworCSAgICByZXR1cm4gLTE7CisJfQorCXAgPSAobGlzdF9ub2RlKikgcGpfbGlzdF9zZWFyY2goJmxpc3QsICh2b2lkKikocGpfc3NpemVfdClpLCAKKwkJCQkJJmNvbXBhcmVfbm9kZSk7CisJcGpfYXNzZXJ0KCBwID09ICZub2Rlc1tpXSApOworCWlmIChwICE9ICZub2Rlc1tpXSkgeworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UKKy8qIFRvIHByZXZlbnQgd2FybmluZyBhYm91dCAidHJhbnNsYXRpb24gdW5pdCBpcyBlbXB0eSIKKyAqIHdoZW4gdGhpcyB0ZXN0IGlzIGRpc2FibGVkLiAKKyAqLworaW50IGR1bW15X2xpc3RfdGVzdDsKKyNlbmRpZgkvKiBJTkNMVURFX0xJU1RfVEVTVCAqLworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9tYWluLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjQxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvbWFpbi5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiAkSWQ6IG1haW4uYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKworI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL3NvY2suaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitleHRlcm4gaW50IHBhcmFtX2VjaG9fc29ja190eXBlOworZXh0ZXJuIGNvbnN0IGNoYXIgKnBhcmFtX2VjaG9fc2VydmVyOworZXh0ZXJuIGludCBwYXJhbV9lY2hvX3BvcnQ7CisKKworLy8jaWYgZGVmaW5lZChQSl9XSU4zMikgJiYgUEpfV0lOMzIhPTAKKyNpZiAwCisjaW5jbHVkZSA8d2luZG93cy5oPgorc3RhdGljIHZvaWQgYm9vc3Qodm9pZCkKK3sKKyAgICBTZXRQcmlvcml0eUNsYXNzKEdldEN1cnJlbnRQcm9jZXNzKCksIFJFQUxUSU1FX1BSSU9SSVRZX0NMQVNTKTsKK30KKyNlbHNlCisjZGVmaW5lIGJvb3N0KCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQSl9TVU5PUykgJiYgUEpfU1VOT1MhPTAKKyNpbmNsdWRlIDxzaWduYWwuaD4KK3N0YXRpYyB2b2lkIGluaXRfc2lnbmFscygpCit7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisKKyAgICBtZW1zZXQoJmFjdCwgMCwgc2l6ZW9mKGFjdCkpOworICAgIGFjdC5zYV9oYW5kbGVyID0gU0lHX0lHTjsKKworICAgIHNpZ2FjdGlvbihTSUdBTFJNLCAmYWN0LCBOVUxMKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgaW5pdF9zaWduYWxzKCkKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCByYzsKKyAgICBpbnQgaW50ZXJyYWN0aXZlID0gMDsKKworICAgIGJvb3N0KCk7CisgICAgaW5pdF9zaWduYWxzKCk7CisKKyAgICB3aGlsZSAoYXJnYyA+IDEpIHsKKyAgICAgICAgY2hhciAqYXJnID0gYXJndlstLWFyZ2NdOworCisJaWYgKCphcmc9PSctJyAmJiAqKGFyZysxKT09J2knKSB7CisJICAgIGludGVycmFjdGl2ZSA9IDE7CisKKwl9IGVsc2UgaWYgKCphcmc9PSctJyAmJiAqKGFyZysxKT09J3AnKSB7CisgICAgICAgICAgICBwal9zdHJfdCBwb3J0ID0gcGpfc3RyKGFyZ3ZbLS1hcmdjXSk7CisKKyAgICAgICAgICAgIHBhcmFtX2VjaG9fcG9ydCA9IHBqX3N0cnRvdWwoJnBvcnQpOworCisgICAgICAgIH0gZWxzZSBpZiAoKmFyZz09Jy0nICYmICooYXJnKzEpPT0ncycpIHsKKyAgICAgICAgICAgIHBhcmFtX2VjaG9fc2VydmVyID0gYXJndlstLWFyZ2NdOworCisgICAgICAgIH0gZWxzZSBpZiAoKmFyZz09Jy0nICYmICooYXJnKzEpPT0ndCcpIHsKKyAgICAgICAgICAgIHBqX3N0cl90IHR5cGUgPSBwal9zdHIoYXJndlstLWFyZ2NdKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBqX3N0cmljbXAyKCZ0eXBlLCAidGNwIik9PTApCisgICAgICAgICAgICAgICAgcGFyYW1fZWNob19zb2NrX3R5cGUgPSBwal9TT0NLX1NUUkVBTSgpOworICAgICAgICAgICAgZWxzZSBpZiAocGpfc3RyaWNtcDIoJnR5cGUsICJ1ZHAiKT09MCkKKyAgICAgICAgICAgICAgICBwYXJhbV9lY2hvX3NvY2tfdHlwZSA9IHBqX1NPQ0tfREdSQU0oKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFBKX0xPRygzLCgiIiwgImVycm9yOiB1bmtub3duIHNvY2tldCB0eXBlICVzIiwgdHlwZS5wdHIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJjID0gdGVzdF9tYWluKCk7CisKKyAgICBpZiAoaW50ZXJyYWN0aXZlKSB7CisJY2hhciBzWzEwXTsKKwlwdXRzKCIiKTsKKwlwdXRzKCJQcmVzcyA8RU5URVI+IHRvIGV4aXQiKTsKKwlpZiAoIWZnZXRzKHMsIHNpemVvZihzKSwgc3RkaW4pKQorCSAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvbWFpbl9tb2QuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9tYWluX21vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNTJhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvbWFpbl9tb2QuYwpAQCAtMCwwICsxLDQwIEBACisvKiAkSWQ6IG1haW5fbW9kLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworICAgIHByaW50ayhLRVJOX0lORk8gIlBKTElCIHRlc3QgbW9kdWxlIGxvYWRlZC4gU3RhcnRpbmcgdGVzdHMuLi5cbiIpOworICAgIAorICAgIHRlc3RfbWFpbigpOworCisgICAgLyogUHJldmVudCBtb2R1bGUgZnJvbSBsb2FkaW5nLiBXZSd2ZSBmaW5pc2hlZCB0ZXN0IGFueXdheS4uICovCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAgICBwcmludGsoS0VSTl9JTkZPICJQSkxJQiB0ZXN0IG1vZHVsZSB1bmxvYWRpbmcuLi5cbiIpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9tYWluX3J0ZW1zLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvbWFpbl9ydGVtcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzhkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvbWFpbl9ydGVtcy5jCkBAIC0wLDAgKzEsMzI2IEBACisvKiAkSWQ6IG1haW5fcnRlbXMuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworCisvKgorICogLSBNYW55IHRoYW5rcyBmb3IgWmV0cm9uLCBJbmMuIGFuZCBQaGlsIFRvcnJlIDxwdG9ycmVAemV0cm9uLmNvbT4gZm9yIAorICogICBkb25hdGluZyB0aGlzIGZpbGUgYW5kIHRoZSBSVEVNUyBwb3J0IGluIGdlbmVyYWwhCisgKi8KKworI2luY2x1ZGUgInRlc3QuaCIKKworI2luY2x1ZGUgPHBqL2Vycm5vLmg+CisjaW5jbHVkZSA8cGovc3RyaW5nLmg+CisjaW5jbHVkZSA8cGovc29jay5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorCitleHRlcm4gaW50IHBhcmFtX2VjaG9fc29ja190eXBlOworZXh0ZXJuIGNvbnN0IGNoYXIgKnBhcmFtX2VjaG9fc2VydmVyOworZXh0ZXJuIGludCBwYXJhbV9lY2hvX3BvcnQ7CisKKyNpbmNsdWRlIDxic3AuaD4KKworI2RlZmluZSBDT05GSUdVUkVfVVNFX0lNRlNfQVNfQkFTRV9GSUxFU1lTVEVNCisjZGVmaW5lIENPTkZJR1VSRV9MSUJJT19NQVhJTVVNX0ZJTEVfREVTQ1JJUFRPUlMgICAgMzAwCisjZGVmaW5lIENPTkZJR1VSRV9NQVhJTVVNX1RBU0tTICAgICAgICAgICAgICAgICAgICAgNTAKKyNkZWZpbmUgQ09ORklHVVJFX01BWElNVU1fTUVTU0FHRV9RVUVVRVMgICAgICAgICAgICBydGVtc19yZXNvdXJjZV91bmxpbWl0ZWQoMTApCisjZGVmaW5lIENPTkZJR1VSRV9NQVhJTVVNX1NFTUFQSE9SRVMgICAgICAgICAgICAgICAgcnRlbXNfcmVzb3VyY2VfdW5saW1pdGVkKDEwKQorI2RlZmluZSBDT05GSUdVUkVfTUFYSU1VTV9USU1FUlMgICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIENPTkZJR1VSRV9NQVhJTVVNX1JFR0lPTlMgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDT05GSUdVUkVfQVBQTElDQVRJT05fTkVFRFNfQ09OU09MRV9EUklWRVIKKyNkZWZpbmUgQ09ORklHVVJFX0FQUExJQ0FUSU9OX05FRURTX0NMT0NLX0RSSVZFUgorI2RlZmluZSBDT05GSUdVUkVfQVBQTElDQVRJT05fTkVFRFNfVElNRVJfRFJJVkVSCisjZGVmaW5lIENPTkZJR1VSRV9USUNLU19QRVJfVElNRVNMSUNFICAgICAgICAgICAgICAgMgorLy8jZGVmaW5lIENPTkZJR1VSRV9SVEVNU19JTklUX1RBU0tTX1RBQkxFCisjZGVmaW5lIENPTkZJR1VSRV9QT1NJWF9JTklUX1RIUkVBRF9UQUJMRQorCisKKyNkZWZpbmUgQ09ORklHVVJFX01BWElNVU1fUE9TSVhfTVVURVhFUwkgICAgcnRlbXNfcmVzb3VyY2VfdW5saW1pdGVkKDE2KQorI2RlZmluZSBDT05GSUdVUkVfTUFYSU1VTV9QT1NJWF9DT05ESVRJT05fVkFSSUFCTEVTIHJ0ZW1zX3Jlc291cmNlX3VubGltaXRlZCg1KQorI2RlZmluZSBDT05GSUdVUkVfTUFYSU1VTV9QT1NJWF9TRU1BUEhPUkVTICBydGVtc19yZXNvdXJjZV91bmxpbWl0ZWQoMTYpCisjZGVmaW5lIENPTkZJR1VSRV9NQVhJTVVNX1BPU0lYX1RJTUVSUwkgICAgcnRlbXNfcmVzb3VyY2VfdW5saW1pdGVkKDUpCisjZGVmaW5lIENPTkZJR1VSRV9NQVhJTVVNX1BPU0lYX1RIUkVBRFMJICAgIHJ0ZW1zX3Jlc291cmNlX3VubGltaXRlZCgxNikKKyNkZWZpbmUgQ09ORklHVVJFX01BWElNVU1fUE9TSVhfS0VZUwkgICAgcnRlbXNfcmVzb3VyY2VfdW5saW1pdGVkKDE2KQorCisjZGVmaW5lIENPTkZJR1VSRV9QT1NJWF9JTklUX1RIUkVBRF9TVEFDS19TSVpFCTQwOTYKKworLyogTWFrZSBzdXJlIHRoYXQgc3RhY2sgc2l6ZSBpcyBhdCBsZWFzdCA0MDk2ICovCisjZGVmaW5lIFNaCQkJCQkoNDA5Ni1SVEVNU19NSU5JTVVNX1NUQUNLX1NJWkUpCisjZGVmaW5lIENPTkZJR1VSRV9FWFRSQV9UQVNLX1NUQUNLUwkJKChTWik8MCA/IDAgOiAoU1opKQorCisjZGVmaW5lIENPTkZJR1VSRV9JTklUCisjZGVmaW5lIFNUQUNLX0NIRUNLRVJfT04KKworcnRlbXNfdGFzayBJbml0KHJ0ZW1zX3Rhc2tfYXJndW1lbnQgQXJndW1lbnQpIDsKK3ZvaWQgKlBPU0lYX0luaXQodm9pZCAqYXJndW1lbnQpOworCisjaW5jbHVkZSA8Y29uZmRlZnMuaD4KKyNpbmNsdWRlIDxydGVtcy5oPgorCisvKiBBbnkgdGVzdHMgdGhhdCB3YW50IHRvIGJ1aWxkIGEgbGlua2VkIGV4ZWN1dGFibGUgZm9yIFJURU1TIG11c3QgaW5jbHVkZQorICAgdGhlc2UgaGVhZGVycyB0byBnZXQgYSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIG5ldHdvcmsgc3RhY2suICovCisjaW5jbHVkZSA8cnRlbXMvcnRlbXNfYnNkbmV0Lmg+CisjaW5jbHVkZSAicnRlbXNfbmV0d29ya19jb25maWcuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2RlZmluZSBUSElTX0ZJTEUgICAibWFpbl9ydGVtcy5jIgorCitzdGF0aWMgdm9pZCogcGpsaWJfdGVzdF9tYWluKHZvaWQqIHVudXNlZCk7CitzdGF0aWMgdm9pZCAgaW5pdGlhbGl6ZV9uZXR3b3JrKCk7CitzdGF0aWMgdm9pZCB0ZXN0X3NvY2sodm9pZCk7CisKK3N0YXRpYyB2b2lkIG15X3BlcnJvcihwal9zdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGNoYXIgKnRpdGxlKQoreworICAgIGNoYXIgZXJyW1BKX0VSUl9NU0dfU0laRV07CisKKyAgICBwal9zdHJlcnJvcihzdGF0dXMsIGVyciwgc2l6ZW9mKGVycikpOworICAgIHByaW50ZigiJXM6ICVzIFslZF1cbiIsIHRpdGxlLCBlcnIsIHN0YXR1cyk7Cit9CisKKyNkZWZpbmUgVEVTVChleHByKSAgICB7IGludCByYztcCisJCSAgICAgICAgLypQSl9MT0coMywoVEhJU19GSUxFLCIlcyIsICNleHByKSk7Ki8gXAorCQkJLypzbGVlcCgxKTsqLyBcCisJCSAgICAgICAgcmM9ZXhwcjsgXAorCQkgICAgICAgIGlmIChyYykgbXlfcGVycm9yKFBKX1NUQVRVU19GUk9NX09TKHJjKSwjZXhwcik7IH0KKworCisKKy8vcnRlbXNfdGFzayBJbml0KHJ0ZW1zX3Rhc2tfYXJndW1lbnQgQXJndW1lbnQpCit2b2lkICpQT1NJWF9Jbml0KHZvaWQgKmFyZ3VtZW50KQoreworICAgIHB0aHJlYWRfYXR0cl90CXRocmVhZEF0dHI7CisgICAgcHRocmVhZF90ICAgICAJdGhlVGhyZWFkOworICAgIHN0cnVjdCBzY2hlZF9wYXJhbQlzY2hlZF9wYXJhbTsKKyAgICBzaXplX3QJCXN0YWNrX3NpemU7CisgICAgaW50ICAgICAgICAgICAJcmVzdWx0OworICAgIGNoYXIJCWRhdGFbMTAwMF07CisgICAgCisKKyAgICBtZW1zZXQoZGF0YSwgMSwgc2l6ZW9mKGRhdGEpKTsKKworICAgIC8qIFNldCB0aGUgVE9EIGNsb2NrLCBzbyB0aGF0IGdldHRpbWVvZmRheSgpIHdpbGwgd29yayAqLworICAgIHJ0ZW1zX3RpbWVfb2ZfZGF5IGZha2VUaW1lID0geyAyMDA2LCAzLCAxNSwgMTcsIDMwLCAwLCAwIH07CisKKyAgICBpZiAoUlRFTVNfU1VDQ0VTU0ZVTCAhPSBydGVtc19jbG9ja19zZXQoJmZha2VUaW1lKSkKKyAgICB7CisJYXNzZXJ0KDApOworICAgIH0JCisKKyAgICAvKiBCcmluZyB1cCB0aGUgbmV0d29yayBzdGFjayBzbyB3ZSBjYW4gcnVuIHRoZSBzb2NrZXQgdGVzdHMuICovCisgICAgaW5pdGlhbGl6ZV9uZXR3b3JrKCk7CisKKyAgICAvKiBTdGFydCBhIFBPU0lYIHRocmVhZCBmb3IgcGpsaWJfdGVzdF9tYWluKCksIHNpbmNlIHRoYXQncyB3aGF0IGl0CisgICAgICogdGhpbmtzIGl0IGlzIHJ1bm5pbmcgaW4uIAorICAgICAqLworCisgICAgLyogSW5pdGlhbGl6ZSBhdHRyaWJ1dGUgKi8KKyAgICBURVNUKCBwdGhyZWFkX2F0dHJfaW5pdCgmdGhyZWFkQXR0cikgKTsKKworICAgIC8qIExvb2tzIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgbXVzdCBiZSBmdWxseSBpbml0aWFsaXplZCB0b28sCisgICAgICogb3Igb3RoZXJ3aXNlIHB0aHJlYWRfY3JlYXRlIHdpbGwgcmV0dXJuIEVJTlZBTC4KKyAgICAgKi8KKworICAgIC8qIFNwZWNpZnkgZXhwbGljaXQgc2NoZWR1bGluZyByZXF1ZXN0ICovCisgICAgVEVTVCggcHRocmVhZF9hdHRyX3NldGluaGVyaXRzY2hlZCgmdGhyZWFkQXR0ciwgUFRIUkVBRF9FWFBMSUNJVF9TQ0hFRCkpOworCisgICAgLyogVGltZXNsaWNpbmcgaXMgbmVlZGVkIGJ5IHRocmVhZCB0ZXN0LCBhbmQgdGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkKKyAgICAgKiBTQ0hFRF9SUi4KKyAgICAgKi8KKyAgICBURVNUKCBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koJnRocmVhZEF0dHIsIFNDSEVEX1JSKSk7CisKKyAgICAvKiBTZXQgcHJpb3JpdHkgKi8KKyAgICBURVNUKCBwdGhyZWFkX2F0dHJfZ2V0c2NoZWRwYXJhbSgmdGhyZWFkQXR0ciwgJnNjaGVkX3BhcmFtKSk7CisgICAgc2NoZWRfcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBORVRXT1JLX1NUQUNLX1BSSU9SSVRZIC0gMTA7CisgICAgVEVTVCggcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0oJnRocmVhZEF0dHIsICZzY2hlZF9wYXJhbSkpOworCisgICAgLyogTXVzdCBoYXZlIHN1ZmZpY2llbnQgc3RhY2sgc2l6ZSAobGFyZ2Ugc2l6ZSBpcyBuZWVkZWQgYnkKKyAgICAgKiBsb2dnZXIsIGJlY2F1c2UgZGVmYXVsdCBzZXR0aW5ncyBmb3IgbG9nZ2VyIGlzIHRvIHVzZSBtZXNzYWdlIGJ1ZmZlcgorICAgICAqIGZyb20gdGhlIHN0YWNrKS4KKyAgICAgKi8KKyAgICBURVNUKCBwdGhyZWFkX2F0dHJfZ2V0c3RhY2tzaXplKCZ0aHJlYWRBdHRyLCAmc3RhY2tfc2l6ZSkpOworICAgIGlmIChzdGFja19zaXplIDwgODE5MikKKwlURVNUKCBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZ0aHJlYWRBdHRyLCA4MTkyKSk7CisKKworICAgIC8qIENyZWF0ZSB0aGUgdGhyZWFkIGZvciBhcHBsaWNhdGlvbiAqLworICAgIHJlc3VsdCA9IHB0aHJlYWRfY3JlYXRlKCZ0aGVUaHJlYWQsICZ0aHJlYWRBdHRyLCAmcGpsaWJfdGVzdF9tYWluLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ICE9IDApIHsKKwlteV9wZXJyb3IoUEpfU1RBVFVTX0ZST01fT1MocmVzdWx0KSwgCisJCSAgIkVycm9yIGNyZWF0aW5nIHBqbGliX3Rlc3RfbWFpbiB0aHJlYWQiKTsKKwlhc3NlcnQoISJFcnJvciBjcmVhdGluZyBtYWluIHRocmVhZCIpOworICAgIH0gCisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisKKyNkZWZpbmUgYm9vc3QoKQorI2RlZmluZSBpbml0X3NpZ25hbHMoKQorCitzdGF0aWMgdm9pZCoKK3BqbGliX3Rlc3RfbWFpbih2b2lkKiB1bnVzZWQpCit7CisgICAgaW50IHJjOworCisgICAgLyogRHJvcCBvdXIgcHJpb3JpdHkgdG8gYmVsb3cgdGhhdCBvZiB0aGUgbmV0d29yayBzdGFjaywgb3RoZXJ3aXNlCisgICAgICogc2VsZWN0KCkgdGVzdHMgd2lsbCBmYWlsLiAqLworICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzY2hlZFBhcmFtOworICAgIGludCBzY2hlZFBvbGljeTsKKyAgCisgICAgcHJpbnRmKCJwamxpYl90ZXN0X21haW4gdGhyZWFkIHN0YXJ0ZWQuLlxuIik7CisKKyAgICBURVNUKCBwdGhyZWFkX2dldHNjaGVkcGFyYW0ocHRocmVhZF9zZWxmKCksICZzY2hlZFBvbGljeSwgJnNjaGVkUGFyYW0pICk7CisKKyAgICBzY2hlZFBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gTkVUV09SS19TVEFDS19QUklPUklUWSAtIDEwOworCisgICAgVEVTVCggcHRocmVhZF9zZXRzY2hlZHBhcmFtKHB0aHJlYWRfc2VsZigpLCBzY2hlZFBvbGljeSwgJnNjaGVkUGFyYW0pICk7CisKKyAgICBib29zdCgpOworICAgIGluaXRfc2lnbmFscygpOworCisgICAgLy9teV90ZXN0X3RocmVhZCgiZnJvbSBwamxpYl90ZXN0X21haW4iKTsKKyAgICAvL3Rlc3Rfc29jaygpOworCisgICAgcmMgPSB0ZXN0X21haW4oKTsKKworICAgIHJldHVybiAodm9pZCopcmM7Cit9CisKKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorIyAgaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogCisgKiBTZW5kIFVEUCBwYWNrZXQgdG8gc29tZSBob3N0LiBXZSBjYW4gdGhlbiB1c2UgRXRoZXJlYWwgdG8gc25pZmYgdGhlIHBhY2tldAorICogdG8gc2VlIGlmIHRoaXMgdGFyZ2V0IHJlYWxseSB0cmFuc21pdHMgVURQIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQKK3NlbmRfdWRwKGNvbnN0IGNoYXIgKnRhcmdldCkKK3sKKyAgICBpbnQgc29jaywgcmM7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisKKyAgICBQSl9MT0coMywoIm1haW5fcnRlbXMuYyIsICJJUCBhZGRyPSVzLyVzLCBndz0lcyIsCisJCURFRkFVTFRfSVBfQUREUkVTU19TVFJJTkcsCisJCURFRkFVTFRfTkVUTUFTS19TVFJJTkcsCisJCURFRkFVTFRfR0FURVdBWV9TVFJJTkcpKTsKKworICAgIHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgYXNzZXJ0KHNvY2sgPiAwKTsKKworICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCisgICAgcmMgPSBiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBzaXplb2YoYWRkcikpOworICAgIGFzc2VydCgiYmluZCBlcnJvciIgJiYgcmM9PTApOworCisgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIodGFyZ2V0KTsKKyAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMoNDQ0NCk7CisKKyAgICB3aGlsZSgxKSB7CisJY29uc3QgY2hhciAqZGF0YSA9ICJoZWxsbyI7CisKKwlyYyA9IHNlbmR0byhzb2NrLCBkYXRhLCA1LCAwLCAoc3RydWN0IHNvY2thZGRyKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwlQSl9MT0coMywoIm1haW5fcnRlbXMuYyIsICJwaW5naW5nICVzLi4ocmM9JWQpIiwgdGFyZ2V0LCByYykpOworICAgIAlzbGVlcCgxKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgdGVzdF9zb2NrKHZvaWQpCit7CisgICAgaW50IHNvY2s7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgICAgaW50IHJjOworCisgICAgc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBpZiAoc29jayA8IDApIHsKKwlwcmludGYoInNvY2tldCgpIGVycm9yXG4iKTsKKwlnb3RvIGVuZDsKKyAgICB9CisKKyAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisgICAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigiMTI3LjAuMC4xIik7CisgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKDUwMDApOworCisgICAgcmMgPSBiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyLCBzaXplb2YoYWRkcikpOworICAgIGlmIChyYyAhPSAwKSB7CisJcHJpbnRmKCJiaW5kKCkgZXJyb3IgJWRcbiIsIHJjKTsKKwljbG9zZShzb2NrKTsKKwlnb3RvIGVuZDsKKyAgICB9CisKKyAgICBwdXRzKCJCaW5kIHNvY2tldCBzdWNjZXNzIik7CisKKyAgICBjbG9zZShzb2NrKTsKKworZW5kOgorICAgIHdoaWxlKDEpIHNsZWVwKDEpOworfQorCisvKiAKKyAqIEluaXRpYWxpemUgdGhlIG5ldHdvcmsgc3RhY2sgYW5kIEV0aGVybmV0IGRyaXZlciwgdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24KKyAqIGluIHJ0ZW1zLW5ldHdvcmstY29uZmlnLmgKKyAqLworc3RhdGljIHZvaWQKK2luaXRpYWxpemVfbmV0d29yaygpCit7CisgICAgdW5zaWduZWQzMiBmZCwgcmVzdWx0OworICAgIGNoYXIgaXBfYWRkcmVzc19zdHJpbmdbXSA9IERFRkFVTFRfSVBfQUREUkVTU19TVFJJTkc7CisgICAgY2hhciBuZXRtYXNrX3N0cmluZ1tdID0gREVGQVVMVF9ORVRNQVNLX1NUUklORzsKKyAgICBjaGFyIGdhdGV3YXlfc3RyaW5nW10gPSBERUZBVUxUX0dBVEVXQVlfU1RSSU5HOworCisgICAgLy8gV3JpdGUgdGhlIG5ldHdvcmsgY29uZmlnIGZpbGVzIHRvIC9ldGMvaG9zdHMgYW5kIC9ldGMvaG9zdC5jb25mCisgICAgcmVzdWx0ID0gbWtkaXIoIi9ldGMiLCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOworICAgIGZkID0gb3BlbigiL2V0Yy9ob3N0LmNvbmYiLCBPX1JEV1IgfCBPX0NSRUFULCAwNzQ0KTsKKyAgICByZXN1bHQgPSB3cml0ZShmZCwgImhvc3RzLGJpbmRcbiIsIDExKTsKKyAgICByZXN1bHQgPSBjbG9zZShmZCk7CisgICAgZmQgPSBvcGVuKCIvZXRjL2hvc3RzIiwgT19SRFdSIHwgT19DUkVBVCwgMDc0NCk7CisgICAgcmVzdWx0ID0gd3JpdGUoZmQsICIxMjcuMC4wLjEJbG9jYWxob3N0XG4iLCA0MSk7CisgICAgcmVzdWx0ID0gd3JpdGUoZmQsIGlwX2FkZHJlc3Nfc3RyaW5nLCBzdHJsZW4oaXBfYWRkcmVzc19zdHJpbmcpKTsKKyAgICByZXN1bHQgPSB3cml0ZShmZCwgIglwanNpcC10ZXN0XG4iLCAzMik7IAorICAgIHJlc3VsdCA9IGNsb3NlKGZkKTsKKworICAgIG5ldGRyaXZlcl9jb25maWcuaXBfYWRkcmVzcyA9IGlwX2FkZHJlc3Nfc3RyaW5nOworICAgIG5ldGRyaXZlcl9jb25maWcuaXBfbmV0bWFzayA9IG5ldG1hc2tfc3RyaW5nOworICAgIHJ0ZW1zX2JzZG5ldF9jb25maWcuZ2F0ZXdheSA9IGdhdGV3YXlfc3RyaW5nOworCisgICAgaWYgKDAgIT0gcnRlbXNfYnNkbmV0X2luaXRpYWxpemVfbmV0d29yaygpKQorCVBKX0xPRygzLChUSElTX0ZJTEUsICJFcnJvcjogVW5hYmxlIHRvIGluaXRpYWxpemUgbmV0d29yayBzdGFjayEiKSk7CisgICAgZWxzZQorCVBKX0xPRygzLChUSElTX0ZJTEUsICJJUCBhZGRyPSVzLyVzLCBndz0lcyIsIAorCQkJICAgICAgaXBfYWRkcmVzc19zdHJpbmcsCisJCQkgICAgICBuZXRtYXNrX3N0cmluZywKKwkJCSAgICAgIGdhdGV3YXlfc3RyaW5nKSk7CisKKyAgICAvL3J0ZW1zX3JkYmdfaW5pdGlhbGl6ZSgpOworICAgIC8vZW50ZXJSZGJnKCk7CisgICAgLy9zZW5kX3VkcCgiMTkyLjE2OC4wLjEiKTsKKyAgICAvL3Rlc3Rfc29jaygpOworfQorCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9tYWluX3N5bWJpYW4uY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L21haW5fc3ltYmlhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxYjY3MQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9tYWluX3N5bWJpYW4uY3BwCkBAIC0wLDAgKzEsMTMzIEBACisvL0F1dG8tZ2VuZXJhdGVkIGZpbGUuIFBsZWFzZSBkbyBub3QgbW9kaWZ5LgorLy8jaW5jbHVkZSA8ZTMyY21uLmg+CisKKy8vI3ByYWdtYSBkYXRhX3NlZygiLlNZTUJJQU4iKQorLy9fX0VNVUxBVE9SX0lNQUdFX0hFQURFUjIgKDB4MTAwMDAwN2EsMHgwMDAwMDAwMCwweDAwMDAwMDAwLEVQcmlvcml0eUZvcmVncm91bmQsMHgwMDAwMDAwMHUsMHgwMDAwMDAwMHUsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMCkKKy8vI3ByYWdtYSBkYXRhX3NlZygpCisKKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKyNpbmNsdWRlIDxwai9vcy5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL3VuaWNvZGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8ZTMyc3RkLmg+CisKKyNpZiAwCitpbnQgbWFpbigpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgaW50IGV4cCA9IDA7CisKKyAgICBlcnIgPSB0ZXN0X21haW4oKTsKKyAgICAvL2VyciA9IHRlc3RfbWFpbigpOworCisgICAgaWYgKGVycikKKwlyZXR1cm4gZXJyOworICAgIHJldHVybiBleHA7CisgICAgLy9yZXR1cm4gMDsKK30KKworI2Vsc2UKKyNpbmNsdWRlIDxwai9vcy5oPgorCisjaW5jbHVkZSA8ZTMyYmFzZS5oPgorI2luY2x1ZGUgPGUzMnN0ZC5oPgorI2luY2x1ZGUgPGUzMmNvbnMuaD4gICAgICAgICAgICAvLyBDb25zb2xlCisKKworCisvLyAgR2xvYmFsIFZhcmlhYmxlcworCitMT0NBTF9EIENDb25zb2xlQmFzZSogY29uc29sZTsgIC8vIHdyaXRlIGFsbCBtZXNzYWdlcyB0byB0aGlzCisKKworY2xhc3MgTXlTY2hlZHVsZXIgOiBwdWJsaWMgQ0FjdGl2ZVNjaGVkdWxlcgoreworcHVibGljOgorICAgIE15U2NoZWR1bGVyKCkKKyAgICB7fQorCisgICAgdm9pZCBFcnJvcihUSW50IGFFcnJvcikgY29uc3Q7Cit9OworCit2b2lkIE15U2NoZWR1bGVyOjpFcnJvcihUSW50IGFFcnJvcikgY29uc3QKK3sKKyAgICBQSl9VTlVTRURfQVJHKGFFcnJvcik7Cit9CisKK0xPQ0FMX0Mgdm9pZCBEb1N0YXJ0TCgpCisgICAgeworICAgIC8vIENyZWF0ZSBhY3RpdmUgc2NoZWR1bGVyICh0byBydW4gYWN0aXZlIG9iamVjdHMpCisgICAgQ0FjdGl2ZVNjaGVkdWxlciogc2NoZWR1bGVyID0gbmV3IChFTGVhdmUpIE15U2NoZWR1bGVyOworICAgIENsZWFudXBTdGFjazo6UHVzaEwoc2NoZWR1bGVyKTsKKyAgICBDQWN0aXZlU2NoZWR1bGVyOjpJbnN0YWxsKHNjaGVkdWxlcik7CisKKyAgICB0ZXN0X21haW4oKTsKKworICAgIENBY3RpdmVTY2hlZHVsZXI6Okluc3RhbGwoTlVMTCk7CisgICAgQ2xlYW51cFN0YWNrOjpQb3Aoc2NoZWR1bGVyKTsKKyAgICBkZWxldGUgc2NoZWR1bGVyOworICAgIH0KKworI2RlZmluZSBXUklURV9UT19ERUJVR19DT05TT0xFCisKKyNpZmRlZiBXUklURV9UT19ERUJVR19DT05TT0xFCisjaW5jbHVkZTxlMzJkZWJ1Zy5oPgorI2VuZGlmCisKKy8vICBHbG9iYWwgRnVuY3Rpb25zCitzdGF0aWMgdm9pZCBsb2dfd3JpdGVyKGludCBsZXZlbCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICAgIHN0YXRpYyB3Y2hhcl90IGJ1ZjE2W1BKX0xPR19NQVhfU0laRV07CisKKyAgICBQSl9VTlVTRURfQVJHKGxldmVsKTsKKyAgICAKKyAgICBwal9hbnNpX3RvX3VuaWNvZGUoYnVmLCBsZW4sIGJ1ZjE2LCBQSl9BUlJBWV9TSVpFKGJ1ZjE2KSk7CisgICAgYnVmMTZbbGVuXSA9IDA7CisgICAgYnVmMTZbbGVuKzFdID0gMDsKKyAgICAKKyAgICBUUHRyQzE2IGFCdWYoKGNvbnN0IFRVaW50MTYqKWJ1ZjE2LCAoVEludClsZW4pOworICAgIGNvbnNvbGUtPldyaXRlKGFCdWYpOworICAgIAorI2lmZGVmIFdSSVRFX1RPX0RFQlVHX0NPTlNPTEUKKyAgICBSRGVidWc6OlByaW50KGFCdWYpOworI2VuZGlmCit9CisKKworR0xERUZfQyBUSW50IEUzMk1haW4oKQorICAgIHsKKyAgICAvLyBDcmVhdGUgY2xlYW51cCBzdGFjaworICAgIF9fVUhFQVBfTUFSSzsKKyAgICBDVHJhcENsZWFudXAqIGNsZWFudXAgPSBDVHJhcENsZWFudXA6Ok5ldygpOworCisgICAgLy8gQ3JlYXRlIG91dHB1dCBjb25zb2xlCisgICAgVFJBUEQoY3JlYXRlRXJyb3IsIGNvbnNvbGUgPSBDb25zb2xlOjpOZXdMKF9MKCJDb25zb2xlIiksIFRTaXplKEtDb25zRnVsbFNjcmVlbixLQ29uc0Z1bGxTY3JlZW4pKSk7CisgICAgaWYgKGNyZWF0ZUVycm9yKQorICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3I7CisKKyAgICBwal9sb2dfc2V0X2xvZ19mdW5jKCZsb2dfd3JpdGVyKTsKKworICAgIC8vIFJ1biBhcHBsaWNhdGlvbiBjb2RlIGluc2lkZSBUUkFQIGhhcm5lc3MsIHdhaXQga2V5cHJlc3Mgd2hlbiB0ZXJtaW5hdGVkCisgICAgVFJBUEQobWFpbkVycm9yLCBEb1N0YXJ0TCgpKTsKKyAgICBpZiAobWFpbkVycm9yKQorICAgICAgICBjb25zb2xlLT5QcmludGYoX0woIiBmYWlsZWQsIGxlYXZlIGNvZGUgPSAlZCIpLCBtYWluRXJyb3IpOworICAgIAorICAgIGNvbnNvbGUtPlByaW50ZihfTCgiIFtwcmVzcyBhbnkga2V5XVxuIikpOworICAgIGNvbnNvbGUtPkdldGNoKCk7CisgICAgCisgICAgZGVsZXRlIGNvbnNvbGU7CisgICAgZGVsZXRlIGNsZWFudXA7CisgICAgCisgICAgQ2xvc2VTVERMSUIoKTsgCisgICAgCisgICAgX19VSEVBUF9NQVJLRU5EOworICAgIAorICAgIHJldHVybiBLRXJyTm9uZTsKKyAgICB9CisKKyNlbmRpZgkvKiBpZiAwICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9tYWluX3dpbjMyLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvbWFpbl93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTA3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvbWFpbl93aW4zMi5jCkBAIC0wLDAgKzEsMjExIEBACisvKiAkSWQ6IG1haW5fd2luMzIuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKworI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL3VuaWNvZGUuaD4KKyNpbmNsdWRlIDxwai9zb2NrLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBOT05BTUVMRVNTVU5JT04KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8Y29tbWN0cmwuaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorCisjZGVmaW5lIE1BWF9MT0FEU1RSSU5HCSAgICAxMDAKKyNkZWZpbmUgVEhJU19GSUxFCSAgICAibWFpbl93aW4zMi5jIgorCisjZGVmaW5lIElEQ19IRUxMT19XSU5DRQkgICAgMworI2RlZmluZSBJRF9MT0dXSU5ET1cJICAgIDEwNAorCisKK0FUT00JCQkgICAgTXlSZWdpc3RlckNsYXNzCShISU5TVEFOQ0UsIExQVFNUUik7CitCT09MCQkJICAgIEluaXRJbnN0YW5jZQkoSElOU1RBTkNFLCBpbnQpOworTFJFU1VMVCBDQUxMQkFDSwkgICAgV25kUHJvYwkJKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKKworCitleHRlcm4gaW50CQkgICAgcGFyYW1fbG9nX2RlY29yOwkvLyBpbiB0ZXN0LmMKKworc3RhdGljIEhJTlNUQU5DRQkgICAgaEluc3Q7CitzdGF0aWMgSFdORAkJICAgIGh3bmRMb2c7CitzdGF0aWMgSEZPTlQJCSAgICBoRml4ZWRGb250OworCisKK3N0YXRpYyB2b2lkIHdyaXRlX2xvZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisgICAgUEpfREVDTF9VTklDT0RFX1RFTVBfQlVGKHdkYXRhLDI1Nik7CisKKyAgICBQSl9VTlVTRURfQVJHKGxldmVsKTsKKyAgICBQSl9VTlVTRURfQVJHKGxlbik7CisgICAgU2VuZE1lc3NhZ2UoaHduZExvZywgRU1fUkVQTEFDRVNFTCwgRkFMU0UsIAorCQkoTFBBUkFNKVBKX1NUUklOR19UT19OQVRJVkUoZGF0YSx3ZGF0YSwyNTYpKTsKK30KKworCitpbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0YW5jZSwgSElOU1RBTkNFIGhQcmV2SW5zdGFuY2UsIAorCQkgICBMUFRTVFIgbHBDbWRMaW5lLCBpbnQgbkNtZFNob3cpCit7CisgICAgTVNHIG1zZzsKKyAgICAKKyAgICBQSl9VTlVTRURfQVJHKGxwQ21kTGluZSk7CisgICAgUEpfVU5VU0VEX0FSRyhoUHJldkluc3RhbmNlKTsKKworICAgIAorICAgIGlmICghSW5pdEluc3RhbmNlIChoSW5zdGFuY2UsIG5DbWRTaG93KSkKKwlyZXR1cm4gRkFMU0U7CisgICAgCisgICAgcGpfbG9nX3NldF9sb2dfZnVuYyggJndyaXRlX2xvZyApOworICAgIHBhcmFtX2xvZ19kZWNvciA9IFBKX0xPR19IQVNfTkVXTElORSB8IFBKX0xPR19IQVNfQ1I7CisKKyAgICAvLyBSdW4gdGhlIHRlc3QhCisgICAgdGVzdF9tYWluKCk7CisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCIiKSk7CisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwiUHJlc3MgRVNDIHRvIHF1aXQiKSk7CisKKyAgICAvLyBNZXNzYWdlIGxvb3AsIHdhaXRpbmcgdG8gcXVpdC4KKyAgICB3aGlsZSAoR2V0TWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwKSkgeworCVRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CisJRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworICAgIH0KKyAgICAKKyAgICBEZWxldGVPYmplY3QoaEZpeGVkRm9udCk7CisgICAgcmV0dXJuIG1zZy53UGFyYW07Cit9CisKKworI2lmZGVmIF9DT05TT0xFCitpbnQgbWFpbigpCit7CisgICAgcmV0dXJuIFdpbk1haW4oR2V0TW9kdWxlSGFuZGxlKE5VTEwpLCBOVUxMLCBOVUxMLCBTV19TSE9XKTsKK30KKyNlbmRpZgorCisKK0FUT00gTXlSZWdpc3RlckNsYXNzKEhJTlNUQU5DRSBoSW5zdGFuY2UsIExQVFNUUiBzeldpbmRvd0NsYXNzKQoreworICAgIFdORENMQVNTCXdjOworICAgIAorICAgIHdjLnN0eWxlCQk9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOworICAgIHdjLmxwZm5XbmRQcm9jCT0gKFdORFBST0MpIFduZFByb2M7CisgICAgd2MuY2JDbHNFeHRyYQk9IDA7CisgICAgd2MuY2JXbmRFeHRyYQk9IDA7CisgICAgd2MuaEluc3RhbmNlCT0gaEluc3RhbmNlOworICAgIC8vL3djLmhJY29uCQk9IExvYWRJY29uKGhJbnN0YW5jZSwgTUFLRUlOVFJFU09VUkNFKElESV9IRUxMT19XSU5DRSkpOworICAgIHdjLmhJY29uCQk9IE5VTEw7CisgICAgd2MuaEN1cnNvcgkJPSAwOworICAgIHdjLmhickJhY2tncm91bmQJPSAoSEJSVVNIKSBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCk7CisgICAgd2MubHBzek1lbnVOYW1lCT0gMDsKKyAgICB3Yy5scHN6Q2xhc3NOYW1lCT0gc3pXaW5kb3dDbGFzczsKKyAgICAKKyAgICByZXR1cm4gUmVnaXN0ZXJDbGFzcygmd2MpOworfQorCisKK0JPT0wgSW5pdEluc3RhbmNlKEhJTlNUQU5DRSBoSW5zdGFuY2UsIGludCBuQ21kU2hvdykKK3sKKyAgICBIV05ECWhXbmQ7CisgICAgVENIQVIJKnN6VGl0bGUgPSBfVCgiUEpTSVAgVGVzdCIpOworICAgIFRDSEFSCSpzeldpbmRvd0NsYXNzID0gX1QoIlBKU0lQX1RFU1QiKTsKKyAgICBMT0dGT05UCWxmOworCisKKyAgICBtZW1zZXQoJmxmLCAwLCBzaXplb2YobGYpKTsKKyAgICBsZi5sZkhlaWdodCA9IDEzOworI2lmIFBKX05BVElWRV9TVFJJTkdfSVNfVU5JQ09ERQorICAgIHdjc2NweShsZi5sZkZhY2VOYW1lLCBfVCgiQ291cmllciBOZXciKSk7CisjZWxzZQorICAgIHN0cmNweShsZi5sZkZhY2VOYW1lLCAiTHVjaWRhIENvbnNvbGUiKTsKKyNlbmRpZgorCisgICAgaEZpeGVkRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdCgmbGYpOworICAgIGlmICghaEZpeGVkRm9udCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBoSW5zdCA9IGhJbnN0YW5jZTsKKyAgICAKKyAgICBNeVJlZ2lzdGVyQ2xhc3MoaEluc3RhbmNlLCBzeldpbmRvd0NsYXNzKTsKKyAgICAKKyAgICBoV25kID0gQ3JlYXRlV2luZG93KHN6V2luZG93Q2xhc3MsIHN6VGl0bGUsIFdTX1ZJU0lCTEUsCisJCSAgICAgICAgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgCisJCQlDV19VU0VERUZBVUxULCBOVUxMLCBOVUxMLCBoSW5zdGFuY2UsIE5VTEwpOworICAgIAorICAgIGlmICghaFduZCkKKwlyZXR1cm4gRkFMU0U7CisgICAgCisgICAgU2hvd1dpbmRvdyhoV25kLCBuQ21kU2hvdyk7CisgICAgVXBkYXRlV2luZG93KGhXbmQpOworCisgICAgaWYgKGh3bmRMb2cpIHsKKwlTZW5kTWVzc2FnZShod25kTG9nLCBXTV9TRVRGT05ULCAoV1BBUkFNKSBoRml4ZWRGb250LCAoTFBBUkFNKSAwKTsgIAorCVNob3dXaW5kb3coaHduZExvZywgVFJVRSk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jKEhXTkQgaFduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFJFQ1QgcnQ7CisgICAgRFdPUkQgZHdTdHlsZTsKKyAgICAKKyAgICBzd2l0Y2ggKG1lc3NhZ2UpIAorICAgIHsKKyAgICBjYXNlIFdNX0NSRUFURToKKwkvLyBDcmVhdGUgdGV4dCBjb250cm9sLgorCUdldENsaWVudFJlY3QoaFduZCwgJnJ0KTsKKwlkd1N0eWxlID0gV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfSFNDUk9MTCB8IFdTX1ZTQ1JPTEwgfCAKKwkJICBXU19CT1JERVIgfCBFU19MRUZUIHwgRVNfTVVMVElMSU5FIHwgRVNfTk9ISURFU0VMIHwKKwkJICBFU19BVVRPSFNDUk9MTCB8IEVTX0FVVE9WU0NST0xMIHwgRVNfUkVBRE9OTFk7IAorCWh3bmRMb2cgPSBDcmVhdGVXaW5kb3coIFRFWFQoImVkaXQiKSwJICAgIC8vIGNsYXNzCisJCQkJTlVMTCwJCSAgICAvLyB3aW5kb3cgdGV4dAorCQkJCWR3U3R5bGUsCSAgICAvLyBzdHlsZQorCQkJCTAsCQkgICAgLy8geC1sZWZ0CisJCQkJMCwJCSAgICAvLyB5LXRvcAorCQkJCXJ0LnJpZ2h0LXJ0LmxlZnQsICAgLy8gdworCQkJCXJ0LmJvdHRvbS1ydC50b3AsICAgLy8gaAorCQkJCWhXbmQsCQkgICAgLy8gcGFyZW50CisJCQkJKEhNRU5VKUlEX0xPR1dJTkRPVywvLyBpZAorCQkJCWhJbnN0LAkJICAgIC8vIGluc3RhbmNlCisJCQkJTlVMTCk7CQkgICAgLy8gTlVMTCBmb3IgY29udHJvbC4KKwlicmVhazsKKyAgICBjYXNlIFdNX0FDVElWQVRFOgorCWlmIChMT1dPUkQod1BhcmFtKSA9PSBXQV9JTkFDVElWRSkKKwkgICAgRGVzdHJveVdpbmRvdyhoV25kKTsKKwlicmVhazsKKyAgICBjYXNlIFdNX0NIQVI6CisJaWYgKHdQYXJhbSA9PSAyNykgeworCSAgICBEZXN0cm95V2luZG93KGhXbmQpOworCX0KKwlicmVhazsKKyAgICBjYXNlIFdNX0NMT1NFOgorCURlc3Ryb3lXaW5kb3coaFduZCk7CisJYnJlYWs7CisgICAgY2FzZSBXTV9ERVNUUk9ZOgorCVBvc3RRdWl0TWVzc2FnZSgwKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXJldHVybiBEZWZXaW5kb3dQcm9jKGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9tdXRleC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L211dGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1ZmEwNwotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9tdXRleC5jCkBAIC0wLDAgKzEsMjM0IEBACisvKiAkSWQ6IG11dGV4LmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8cGpsaWIuaD4KKworI2lmIElOQ0xVREVfTVVURVhfVEVTVAorCisjdW5kZWYgVFJBQ0VfCisvLyNkZWZpbmUgVFJBQ0VfKHgpICAgUEpfTE9HKDMseCkKKyNkZWZpbmUgVFJBQ0VfKHgpCisKKy8qIFRlc3Qgd2l0biBub24tcmVjdXJzaXZlIG11dGV4LiAqLworc3RhdGljIGludCBzaW1wbGVfbXV0ZXhfdGVzdChwal9wb29sX3QgKnBvb2wpCit7CisgICAgcGpfc3RhdHVzX3QgcmM7CisgICAgcGpfbXV0ZXhfdCAqbXV0ZXg7CisKKyAgICBQSl9MT0coMywoIiIsICIuLi50ZXN0aW5nIHNpbXBsZSBtdXRleCIpKTsKKyAgICAKKyAgICAvKiBDcmVhdGUgbXV0ZXguICovCisgICAgVFJBQ0VfKCgiIiwgIi4uLi5jcmVhdGUgbXV0ZXgiKSk7CisgICAgcmMgPSBwal9tdXRleF9jcmVhdGUoIHBvb2wsICIiLCBQSl9NVVRFWF9TSU1QTEUsICZtdXRleCk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCIuLi5lcnJvcjogcGpfbXV0ZXhfY3JlYXRlIiwgcmMpOworCXJldHVybiAtMTA7CisgICAgfQorCisgICAgLyogTm9ybWFsIGxvY2svdW5sb2NrIGN5Y2xlLiAqLworICAgIFRSQUNFXygoIiIsICIuLi4ubG9jayBtdXRleCIpKTsKKyAgICByYyA9IHBqX211dGV4X2xvY2sobXV0ZXgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHBqX211dGV4X2xvY2siLCByYyk7CisJcmV0dXJuIC0yMDsKKyAgICB9CisgICAgVFJBQ0VfKCgiIiwgIi4uLi51bmxvY2sgbXV0ZXgiKSk7CisgICAgcmMgPSBwal9tdXRleF91bmxvY2sobXV0ZXgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHBqX211dGV4X3VubG9jayIsIHJjKTsKKwlyZXR1cm4gLTMwOworICAgIH0KKyAgICAKKyAgICAvKiBMb2NrIGFnYWluLiAqLworICAgIFRSQUNFXygoIiIsICIuLi4ubG9jayBtdXRleCIpKTsKKyAgICByYyA9IHBqX211dGV4X2xvY2sobXV0ZXgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSByZXR1cm4gLTQwOworCisgICAgLyogVHJ5LWxvY2sgc2hvdWxkIGZhaWwuIEl0IHNob3VsZCBub3QgZGVhZGxvY2tlZC4gKi8KKyAgICBUUkFDRV8oKCIiLCAiLi4uLnRyeWxvY2sgbXV0ZXgiKSk7CisgICAgcmMgPSBwal9tdXRleF90cnlsb2NrKG11dGV4KTsKKyAgICBpZiAocmMgPT0gUEpfU1VDQ0VTUykKKwlQSl9MT0coMywoIiIsICIuLi5pbmZvOiBsb29rcyBsaWtlIHNpbXBsZSBtdXRleCBpcyByZWN1cnNpdmUiKSk7CisKKyAgICAvKiBVbmxvY2sgYW5kIGRvbmUuICovCisgICAgVFJBQ0VfKCgiIiwgIi4uLi51bmxvY2sgbXV0ZXgiKSk7CisgICAgcmMgPSBwal9tdXRleF91bmxvY2sobXV0ZXgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSByZXR1cm4gLTUwOworCisgICAgVFJBQ0VfKCgiIiwgIi4uLi5kZXN0cm95IG11dGV4IikpOworICAgIHJjID0gcGpfbXV0ZXhfZGVzdHJveShtdXRleCk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHJldHVybiAtNjA7CisKKyAgICBUUkFDRV8oKCIiLCAiLi4uLmRvbmUiKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKworLyogVGVzdCB3aXRoIHJlY3Vyc2l2ZSBtdXRleC4gKi8KK3N0YXRpYyBpbnQgcmVjdXJzaXZlX211dGV4X3Rlc3QocGpfcG9vbF90ICpwb29sKQoreworICAgIHBqX3N0YXR1c190IHJjOworICAgIHBqX211dGV4X3QgKm11dGV4OworCisgICAgUEpfTE9HKDMsKCIiLCAiLi4udGVzdGluZyByZWN1cnNpdmUgbXV0ZXgiKSk7CisKKyAgICAvKiBDcmVhdGUgbXV0ZXguICovCisgICAgVFJBQ0VfKCgiIiwgIi4uLi5jcmVhdGUgbXV0ZXgiKSk7CisgICAgcmMgPSBwal9tdXRleF9jcmVhdGUoIHBvb2wsICIiLCBQSl9NVVRFWF9SRUNVUlNFLCAmbXV0ZXgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHBqX211dGV4X2NyZWF0ZSIsIHJjKTsKKwlyZXR1cm4gLTEwOworICAgIH0KKworICAgIC8qIE5vcm1hbCBsb2NrL3VubG9jayBjeWNsZS4gKi8KKyAgICBUUkFDRV8oKCIiLCAiLi4uLmxvY2sgbXV0ZXgiKSk7CisgICAgcmMgPSBwal9tdXRleF9sb2NrKG11dGV4KTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9tdXRleF9sb2NrIiwgcmMpOworCXJldHVybiAtMjA7CisgICAgfQorICAgIFRSQUNFXygoIiIsICIuLi4udW5sb2NrIG11dGV4IikpOworICAgIHJjID0gcGpfbXV0ZXhfdW5sb2NrKG11dGV4KTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9tdXRleF91bmxvY2siLCByYyk7CisJcmV0dXJuIC0zMDsKKyAgICB9CisgICAgCisgICAgLyogTG9jayBhZ2Fpbi4gKi8KKyAgICBUUkFDRV8oKCIiLCAiLi4uLmxvY2sgbXV0ZXgiKSk7CisgICAgcmMgPSBwal9tdXRleF9sb2NrKG11dGV4KTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgcmV0dXJuIC00MDsKKworICAgIC8qIFRyeS1sb2NrIHNob3VsZCBOT1QgZmFpbC4gLiAqLworICAgIFRSQUNFXygoIiIsICIuLi4udHJ5bG9jayBtdXRleCIpKTsKKyAgICByYyA9IHBqX211dGV4X3RyeWxvY2sobXV0ZXgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHJlY3Vyc2l2ZSBtdXRleCBpcyBub3QgcmVjdXJzaXZlISIsIHJjKTsKKwlyZXR1cm4gLTQwOworICAgIH0KKworICAgIC8qIExvY2tpbmcgYWdhaW4gc2hvdWxkIG5vdCBmYWlsLiAqLworICAgIFRSQUNFXygoIiIsICIuLi4ubG9jayBtdXRleCIpKTsKKyAgICByYyA9IHBqX211dGV4X2xvY2sobXV0ZXgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHJlY3Vyc2l2ZSBtdXRleCBpcyBub3QgcmVjdXJzaXZlISIsIHJjKTsKKwlyZXR1cm4gLTQ1OworICAgIH0KKworICAgIC8qIFVubG9jayBzZXZlcmFsIHRpbWVzIGFuZCBkb25lLiAqLworICAgIFRSQUNFXygoIiIsICIuLi4udW5sb2NrIG11dGV4IDN4IikpOworICAgIHJjID0gcGpfbXV0ZXhfdW5sb2NrKG11dGV4KTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgcmV0dXJuIC01MDsKKyAgICByYyA9IHBqX211dGV4X3VubG9jayhtdXRleCk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHJldHVybiAtNTE7CisgICAgcmMgPSBwal9tdXRleF91bmxvY2sobXV0ZXgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSByZXR1cm4gLTUyOworCisgICAgVFJBQ0VfKCgiIiwgIi4uLi5kZXN0cm95IG11dGV4IikpOworICAgIHJjID0gcGpfbXV0ZXhfZGVzdHJveShtdXRleCk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHJldHVybiAtNjA7CisKKyAgICBUUkFDRV8oKCIiLCAiLi4uLmRvbmUiKSk7CisgICAgcmV0dXJuIFBKX1NVQ0NFU1M7Cit9CisKKyNpZiBQSl9IQVNfU0VNQVBIT1JFCitzdGF0aWMgaW50IHNlbWFwaG9yZV90ZXN0KHBqX3Bvb2xfdCAqcG9vbCkKK3sKKyAgICBwal9zZW1fdCAqc2VtOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIFBKX0xPRygzLCgiIiwgIi4uLnRlc3Rpbmcgc2VtYXBob3JlIikpOworCisgICAgc3RhdHVzID0gcGpfc2VtX2NyZWF0ZShwb29sLCBOVUxMLCAwLCAxLCAmc2VtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCIuLi5lcnJvcjogcGpfc2VtX2NyZWF0ZSgpIiwgc3RhdHVzKTsKKwlyZXR1cm4gLTE1MTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9zZW1fcG9zdChzZW0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9zZW1fcG9zdCgpIiwgc3RhdHVzKTsKKwlwal9zZW1fZGVzdHJveShzZW0pOworCXJldHVybiAtMTUzOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX3NlbV90cnl3YWl0KHNlbSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHBqX3NlbV90cnl3YWl0KCkiLCBzdGF0dXMpOworCXBqX3NlbV9kZXN0cm95KHNlbSk7CisJcmV0dXJuIC0xNTY7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfc2VtX3Bvc3Qoc2VtKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCIuLi5lcnJvcjogcGpfc2VtX3Bvc3QoKSIsIHN0YXR1cyk7CisJcGpfc2VtX2Rlc3Ryb3koc2VtKTsKKwlyZXR1cm4gLTE1OTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9zZW1fd2FpdChzZW0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9zZW1fd2FpdCgpIiwgc3RhdHVzKTsKKwlwal9zZW1fZGVzdHJveShzZW0pOworCXJldHVybiAtMTYxOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX3NlbV9kZXN0cm95KHNlbSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHBqX3NlbV9kZXN0cm95KCkiLCBzdGF0dXMpOworCXJldHVybiAtMTYzOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCS8qIFBKX0hBU19TRU1BUEhPUkUgKi8KKworCitpbnQgbXV0ZXhfdGVzdCh2b2lkKQoreworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBpbnQgcmM7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCAiIiwgNDAwMCwgNDAwMCwgTlVMTCk7CisKKyAgICByYyA9IHNpbXBsZV9tdXRleF90ZXN0KHBvb2wpOworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworICAgIHJjID0gcmVjdXJzaXZlX211dGV4X3Rlc3QocG9vbCk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisjaWYgUEpfSEFTX1NFTUFQSE9SRQorICAgIHJjID0gc2VtYXBob3JlX3Rlc3QocG9vbCk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworI2VuZGlmCisKKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UKK2ludCBkdW1teV9tdXRleF90ZXN0OworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9vcy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L29zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyNzBmZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9vcy5jCkBAIC0wLDAgKzEsMTE2IEBACisvKiAkSWQ6IG9zLmMgMzg0MSAyMDExLTEwLTI0IDA5OjI4OjEzWiBtaW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisKKyNpZiBJTkNMVURFX09TX1RFU1QKK3N0YXRpYyBpbnQgZW5kaWFubmVzc190ZXN0MzIodm9pZCkKK3sKKyAgICB1bmlvbiB0CisgICAgeworCXBqX3VpbnQzMl90IHUzMjsKKwlwal91aW50MTZfdCB1MTZbMl07CisJcGpfdWludDhfdCB1OFs0XTsKKyAgICB9IHQ7CisKKyAgICBQSl9MT0coMywoIiIsICIgVGVzdGluZyBlbmRpYW5uZXNzLi4iKSk7CisKKyAgICB0LnUzMiA9IDB4MTEyMjMzNDQ7CisKKyNpZiBkZWZpbmVkKFBKX0lTX0xJVFRMRV9FTkRJQU4pICYmIFBKX0lTX0xJVFRMRV9FTkRJQU4KKyAgICBQSl9MT0coMywoIiIsICIgICBMaWJyYXJ5IGlzIHNldCB0byBsaXR0bGUgZW5kaWFuIikpOworCisjICBpZiBkZWZpbmVkKFBKX0lTX0JJR19FTkRJQU4pICYmIFBKX0lTX0JJR19FTkRJQU4KKyMgICAgZXJyb3IgRXJyb3I6IEJvdGggUEpfSVNfTElUVExFX0VORElBTiBhbmQgUEpfSVNfQklHX0VORElBTiBhcmUgc2V0IQorIyAgZW5kaWYKKworICAgIGlmICgodC51MTZbMF0gJiAweEZGRkYpICE9IDB4MzM0NCB8fAorCSh0LnUxNlsxXSAmIDB4RkZGRikgIT0gMHgxMTIyKQorICAgIHsKKwlQSl9MT0coMywoIiIsICIgICBFcnJvcjogd3JvbmcgMTZiaXQgdmFsdWVzIDB4JXggYW5kIDB4JXgiLAorCQkgICAgICAodC51MTZbMF0gJiAweEZGRkYpLCAodC51MTZbMV0gJiAweEZGRkYpKSk7CisJcmV0dXJuIDEwOworICAgIH0KKworICAgIGlmICgodC51OFswXSAmIDB4RkYpICE9IDB4NDQgfHwKKwkodC51OFsxXSAmIDB4RkYpICE9IDB4MzMgfHwKKwkodC51OFsyXSAmIDB4RkYpICE9IDB4MjIgfHwKKwkodC51OFszXSAmIDB4RkYpICE9IDB4MTEpCisgICAgeworCVBKX0xPRygzLCgiIiwgIiAgIEVycm9yOiB3cm9uZyA4Yml0IHZhbHVlcyIpKTsKKwlyZXR1cm4gMTI7CisgICAgfQorCisjZWxpZiBkZWZpbmVkKFBKX0lTX0JJR19FTkRJQU4pICYmIFBKX0lTX0JJR19FTkRJQU4KKyAgICBQSl9MT0coMywoIiIsICIgICBMaWJyYXJ5IGlzIHNldCB0byBiaWcgZW5kaWFuIikpOworCisgICAgaWYgKCh0LnUxNlswXSAmIDB4RkZGRikgIT0gMHgxMTIyIHx8CisJKHQudTE2WzFdICYgMHhGRkZGKSAhPSAweDMzNDQpCisgICAgeworCVBKX0xPRygzLCgiIiwgIiAgIEVycm9yOiB3cm9uZyAxNmJpdCB2YWx1ZXMgMHgleCBhbmQgMHgleCIsCisJCSAgICAgICh0LnUxNlswXSAmIDB4RkZGRiksICh0LnUxNlsxXSAmIDB4RkZGRikpKTsKKwlyZXR1cm4gMjA7CisgICAgfQorCisgICAgaWYgKCh0LnU4WzBdICYgMHhGRikgIT0gMHgxMSB8fAorCSh0LnU4WzFdICYgMHhGRikgIT0gMHgyMiB8fAorCSh0LnU4WzJdICYgMHhGRikgIT0gMHgzMyB8fAorCSh0LnU4WzNdICYgMHhGRikgIT0gMHg0NCkKKyAgICB7CisJUEpfTE9HKDMsKCIiLCAiICAgRXJyb3I6IHdyb25nIDhiaXQgdmFsdWVzIikpOworCXJldHVybiAyMjsKKyAgICB9CisKKyMgIGlmIGRlZmluZWQoUEpfSVNfTElUVExFX0VORElBTikgJiYgUEpfSVNfTElUVExFX0VORElBTgorIyAgICBlcnJvciBFcnJvcjogQm90aCBQSl9JU19MSVRUTEVfRU5ESUFOIGFuZCBQSl9JU19CSUdfRU5ESUFOIGFyZSBzZXQhCisjICBlbmRpZgorCisKKyNlbHNlCisjICAgIGVycm9yIEVycm9yOiBFbmRpYW5uZXNzIGlzIG5vdCBzZXQgcHJvcGVybHkhCisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCitpbnQgb3NfdGVzdCh2b2lkKQoreworICAgIGNvbnN0IHBqX3N5c19pbmZvICpzaTsKKyAgICBpbnQgcmMgPSAwOworCisgICAgUEpfTE9HKDMsKCIiLCAiIFN5cyBpbmZvOiIpKTsKKyAgICBzaSA9IHBqX2dldF9zeXNfaW5mbygpOworICAgIFBKX0xPRygzLCgiIiwgIiAgIG1hY2hpbmU6ICAlcyIsIHNpLT5tYWNoaW5lLnB0cikpOworICAgIFBKX0xPRygzLCgiIiwgIiAgIG9zX25hbWU6ICAlcyIsIHNpLT5vc19uYW1lLnB0cikpOworICAgIFBKX0xPRygzLCgiIiwgIiAgIG9zX3ZlcjogICAweCV4Iiwgc2ktPm9zX3ZlcikpOworICAgIFBKX0xPRygzLCgiIiwgIiAgIHNka19uYW1lOiAlcyIsIHNpLT5zZGtfbmFtZS5wdHIpKTsKKyAgICBQSl9MT0coMywoIiIsICIgICBzZGtfdmVyOiAgMHgleCIsIHNpLT5zZGtfdmVyKSk7CisgICAgUEpfTE9HKDMsKCIiLCAiICAgaW5mbzogICAgICVzIiwgc2ktPmluZm8ucHRyKSk7CisKKyAgICByYyA9IGVuZGlhbm5lc3NfdGVzdDMyKCk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNlbHNlCitpbnQgZHVtbXlfb3NfdmFyOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9wamxpYl90ZXN0X3JlZy5yc3MgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvcGpsaWJfdGVzdF9yZWcucnNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkODkyZTQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvcGpsaWJfdGVzdF9yZWcucnNzCkBAIC0wLDAgKzEsMTIgQEAKKy8vIFN5bWJpYW4gYXBwbGljYXRpb24gcmVnaXN0cmF0aW9uIGluZm8gZm9yIHBqbGliLXRlc3QNCisNCisjaW5jbHVkZSA8YXBwaW5mby5yaD4NCisNCitVSUQyIEtVaWRBcHBSZWdpc3RyYXRpb25SZXNvdXJjZUZpbGUNCitVSUQzIDB4QTAwMDAwMDINCisNCitSRVNPVVJDRSBBUFBfUkVHSVNUUkFUSU9OX0lORk8NCit7DQorICAgIGFwcF9maWxlPSJwamxpYl90ZXN0IjsNCit9DQorDQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3Bvb2wuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9wb29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmYmUwYQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9wb29sLmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qICRJZDogcG9vbC5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgPHBqL3Bvb2wuaD4KKyNpbmNsdWRlIDxwai9wb29sX2J1Zi5oPgorI2luY2x1ZGUgPHBqL3JhbmQuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9leGNlcHQuaD4KKyNpbmNsdWRlICJ0ZXN0LmgiCisKKy8qKgorICogXHBhZ2UgcGFnZV9wamxpYl9wb29sX3Rlc3QgVGVzdDogUG9vbAorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiBcYiBwb29sX3Rlc3QoKS4gSXQgdGVzdHMgdGhlCisgKiBmdW5jdGlvbmFsaXR5IG9mIHRoZSBtZW1vcnkgcG9vbC4KKyAqCisgKgorICogVGhpcyBmaWxlIGlzIDxiPnBqbGliLXRlc3QvcG9vbC5jPC9iPgorICoKKyAqIFxpbmNsdWRlIHBqbGliLXRlc3QvcG9vbC5jCisgKi8KKworCisjaWYgSU5DTFVERV9QT09MX1RFU1QKKworI2RlZmluZSBTSVpFCTQwOTYKKworLyogTm9ybWFsbHkgd2Ugc2hvdWxkIHRocm93IGV4Y2VwdGlvbiB3aGVuIG1lbW9yeSBhbGxvYyBmYWlscy4KKyAqIEhlcmUgd2UgZG8gbm90aGluZyBzbyB0aGF0IHRoZSBmbG93IHdpbGwgZ28gYmFjayB0byBvcmlnaW5hbCBjYWxsZXIsCisgKiB3aGljaCB3aWxsIHRlc3QgdGhlIHJlc3VsdCB1c2luZyBOVUxMIGNvbXBhcmlzb24uIE5vcm1hbGx5IGNhbGxlciB3aWxsCisgKiBjYXRjaCB0aGUgZXhjZXB0aW9uIGluc3RlYWQgb2YgY2hlY2tpbmcgZm9yIE5VTExzLgorICovCitzdGF0aWMgdm9pZCBudWxsX2NhbGxiYWNrKHBqX3Bvb2xfdCAqcG9vbCwgcGpfc2l6ZV90IHNpemUpCit7CisgICAgUEpfVU5VU0VEX0FSRyhwb29sKTsKKyAgICBQSl9VTlVTRURfQVJHKHNpemUpOworfQorCisjZGVmaW5lIEdFVF9GUkVFKHApCShwal9wb29sX2dldF9jYXBhY2l0eShwKS1wal9wb29sX2dldF91c2VkX3NpemUocCkpCisKKy8qIFRlc3QgdGhhdCB0aGUgY2FwYWNpdHkgYW5kIHVzZWQgc2l6ZSByZXBvcnRlZCBieSB0aGUgcG9vbCBpcyBjb3JyZWN0LiAKKyAqLworc3RhdGljIGludCBjYXBhY2l0eV90ZXN0KHZvaWQpCit7CisgICAgcGpfcG9vbF90ICpwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCBOVUxMLCBTSVpFLCAwLCAmbnVsbF9jYWxsYmFjayk7CisgICAgcGpfc2l6ZV90IGZyZWVzaXplOworCisgICAgUEpfTE9HKDMsKCJ0ZXN0IiwgIi4uLmNhcGFjaXR5X3Rlc3QoKSIpKTsKKworICAgIGlmICghcG9vbCkKKwlyZXR1cm4gLTIwMDsKKworICAgIGZyZWVzaXplID0gR0VUX0ZSRUUocG9vbCk7CisKKyAgICBpZiAocGpfcG9vbF9hbGxvYyhwb29sLCBmcmVlc2l6ZSkgPT0gTlVMTCkgeworCVBKX0xPRygzLCgidGVzdCIsICIuLi5lcnJvcjogd3JvbmcgZnJlZXNpemUgJXUgcmVwb3J0ZWQiLAorCQkJICBmcmVlc2l6ZSkpOworCXBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKwlyZXR1cm4gLTIxMDsKKyAgICB9CisKKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRlc3QgdGhhdCB0aGUgYWxpZ25tZW50IHdvcmtzLiAqLworc3RhdGljIGludCBwb29sX2FsaWdubWVudF90ZXN0KHZvaWQpCit7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHZvaWQgKnB0cjsKKyAgICBlbnVtIHsgTUVNU0laRSA9IDY0LCBMT09QID0gMTAwIH07CisgICAgdW5zaWduZWQgaTsKKworICAgIFBKX0xPRygzLCgidGVzdCIsICIuLi5hbGlnbm1lbnQgdGVzdCIpKTsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIFBKX1BPT0xfU0laRStNRU1TSVpFLCBNRU1TSVpFLCBOVUxMKTsKKyAgICBpZiAoIXBvb2wpCisJcmV0dXJuIC0zMDA7CisKKyNkZWZpbmUgSVNfQUxJR05FRChwKQkoKCgodW5zaWduZWQgbG9uZykocGpfc3NpemVfdClwKSAmIFwKKwkJCSAgIChQSl9QT09MX0FMSUdOTUVOVC0xKSkgPT0gMCkKKworICAgIGZvciAoaT0wOyBpPExPT1A7ICsraSkgeworCS8qIFRlc3QgZmlyc3QgYWxsb2NhdGlvbiAqLworCXB0ciA9IHBqX3Bvb2xfYWxsb2MocG9vbCwgMSk7CisJaWYgKCFJU19BTElHTkVEKHB0cikpIHsKKwkgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCSAgICByZXR1cm4gLTMxMDsKKwl9CisKKwkvKiBUZXN0IHN1YnNlcXVlbnQgYWxsb2NhdGlvbiAqLworCXB0ciA9IHBqX3Bvb2xfYWxsb2MocG9vbCwgMSk7CisJaWYgKCFJU19BTElHTkVEKHB0cikpIHsKKwkgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCSAgICByZXR1cm4gLTMyMDsKKwl9CisKKwkvKiBUZXN0IGFsbG9jYXRpb24gYWZ0ZXIgbmV3IGJsb2NrIGlzIGNyZWF0ZWQgKi8KKwlwdHIgPSBwal9wb29sX2FsbG9jKHBvb2wsIE1FTVNJWkUqMisxKTsKKwlpZiAoIUlTX0FMSUdORUQocHRyKSkgeworCSAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisJICAgIHJldHVybiAtMzMwOworCX0KKworCS8qIFJlc2V0IHRoZSBwb29sICovCisJcGpfcG9vbF9yZXNldChwb29sKTsKKyAgICB9CisKKyAgICAvKiBEb25lICovCisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRlc3QgdGhhdCB0aGUgYWxpZ25tZW50IHdvcmtzIGZvciBwb29sIG9uIGJ1Zi4gKi8KK3N0YXRpYyBpbnQgcG9vbF9idWZfYWxpZ25tZW50X3Rlc3Qodm9pZCkKK3sKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgY2hhciBidWZbNTEyXTsKKyAgICB2b2lkICpwdHI7CisgICAgZW51bSB7IExPT1AgPSAxMDAgfTsKKyAgICB1bnNpZ25lZCBpOworCisgICAgUEpfTE9HKDMsKCJ0ZXN0IiwgIi4uLnBvb2xfYnVmIGFsaWdubWVudCB0ZXN0IikpOworCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlX29uX2J1ZihOVUxMLCBidWYsIHNpemVvZihidWYpKTsKKyAgICBpZiAoIXBvb2wpCisJcmV0dXJuIC00MDA7CisKKyAgICBmb3IgKGk9MDsgaTxMT09QOyArK2kpIHsKKwkvKiBUZXN0IGZpcnN0IGFsbG9jYXRpb24gKi8KKwlwdHIgPSBwal9wb29sX2FsbG9jKHBvb2wsIDEpOworCWlmICghSVNfQUxJR05FRChwdHIpKSB7CisJICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKwkgICAgcmV0dXJuIC00MTA7CisJfQorCisJLyogVGVzdCBzdWJzZXF1ZW50IGFsbG9jYXRpb24gKi8KKwlwdHIgPSBwal9wb29sX2FsbG9jKHBvb2wsIDEpOworCWlmICghSVNfQUxJR05FRChwdHIpKSB7CisJICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKwkgICAgcmV0dXJuIC00MjA7CisJfQorCisJLyogUmVzZXQgdGhlIHBvb2wgKi8KKwlwal9wb29sX3Jlc2V0KHBvb2wpOworICAgIH0KKworICAgIC8qIERvbmUgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyogVGVzdCBmdW5jdGlvbiB0byBkcmFpbiB0aGUgcG9vbCdzIHNwYWNlLiAKKyAqLworc3RhdGljIGludCBkcmFpbl90ZXN0KHBqX3NpemVfdCBzaXplLCBwal9zaXplX3QgaW5jcmVtZW50KQoreworICAgIHBqX3Bvb2xfdCAqcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgTlVMTCwgc2l6ZSwgaW5jcmVtZW50LCAKKwkJCQkgICAgICZudWxsX2NhbGxiYWNrKTsKKyAgICBwal9zaXplX3QgZnJlZXNpemU7CisgICAgdm9pZCAqcDsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICAKKyAgICBQSl9MT0coMywoInRlc3QiLCAiLi4uZHJhaW5fdGVzdCglZCwlZCkiLCBzaXplLCBpbmNyZW1lbnQpKTsKKworICAgIGlmICghcG9vbCkKKwlyZXR1cm4gLTEwOworCisgICAgLyogR2V0IGZyZWUgc2l6ZSAqLworICAgIGZyZWVzaXplID0gR0VUX0ZSRUUocG9vbCk7CisgICAgaWYgKGZyZWVzaXplIDwgMSkgeworICAgIAlzdGF0dXM9LTE1OyAKKwlnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8qIERyYWluIHRoZSBwb29sIHVudGlsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0LiAqLworICAgIHdoaWxlIChmcmVlc2l6ZSA+IDApIHsKKwlpbnQgc2l6ZTsKKworCWlmIChmcmVlc2l6ZSA+IDI1NSkKKwkgICAgc2l6ZSA9ICgocGpfcmFuZCgpICYgMHgwMDAwMDBGRikgKyBQSl9QT09MX0FMSUdOTUVOVCkgJiAKKwkJICAgfihQSl9QT09MX0FMSUdOTUVOVCAtIDEpOworCWVsc2UKKwkgICAgc2l6ZSA9IChpbnQpZnJlZXNpemU7CisKKwlwID0gcGpfcG9vbF9hbGxvYyhwb29sLCBzaXplKTsKKwlpZiAoIXApIHsKKwkgICAgc3RhdHVzPS0yMDsgZ290byBvbl9lcnJvcjsKKwl9CisKKwlmcmVlc2l6ZSAtPSBzaXplOworICAgIH0KKworICAgIC8qIENoZWNrIHRoYXQgY2FwYWNpdHkgaXMgemVyby4gKi8KKyAgICBpZiAoR0VUX0ZSRUUocG9vbCkgIT0gMCkgeworCVBKX0xPRygzLCgidGVzdCIsICIuLi4uZXJyb3I6IHJldHVybmVkIGZyZWU9JXUgKGV4cGVjdGluZyAwKSIsCisJCSAgR0VUX0ZSRUUocG9vbCkpKTsKKwlzdGF0dXM9LTMwOyBnb3RvIG9uX2Vycm9yOworICAgIH0KKworICAgIC8qIFRyeSB0byBhbGxvY2F0ZSBvbmNlIG1vcmUgKi8KKyAgICBwID0gcGpfcG9vbF9hbGxvYyhwb29sLCAyNTcpOworICAgIGlmICghcCkgeworCXN0YXR1cz0tNDA7IGdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhhdCBjYXBhY2l0eSBpcyBOT1QgemVyby4gKi8KKyAgICBpZiAoR0VUX0ZSRUUocG9vbCkgPT0gMCkgeworCXN0YXR1cz0tNTA7IGdvdG8gb25fZXJyb3I7CisgICAgfQorCisKK29uX2Vycm9yOgorICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBUZXN0IHRoZSBidWZmZXIgYmFzZWQgcG9vbCAqLworc3RhdGljIGludCBwb29sX2J1Zl90ZXN0KHZvaWQpCit7CisgICAgZW51bSB7IFNUQVRJQ19CVUZfU0laRSA9IDQwIH07CisgICAgLyogMTYgaXMgdGhlIGludGVybmFsIHN0cnVjdCBpbiBwb29sX2J1ZiAqLworICAgIHN0YXRpYyBjaGFyIGJ1ZlsgU1RBVElDX0JVRl9TSVpFICsgc2l6ZW9mKHBqX3Bvb2xfdCkgKyAKKwkJICAgICBzaXplb2YocGpfcG9vbF9ibG9jaykgKyAyICogUEpfUE9PTF9BTElHTk1FTlRdOworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICB2b2lkICpwOworICAgIFBKX1VTRV9FWENFUFRJT047CisKKyAgICBQSl9MT0coMywoInRlc3QiLCAiLi4ucG9vbF9idWYgdGVzdCIpKTsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZV9vbl9idWYoIm5vIG5hbWUiLCBidWYsIHNpemVvZihidWYpKTsKKyAgICBpZiAoIXBvb2wpCisJcmV0dXJuIC03MDsKKworICAgIC8qIERyYWluIHRoZSBwb29sICovCisgICAgUEpfVFJZIHsKKwlpZiAoKHA9cGpfcG9vbF9hbGxvYyhwb29sLCBTVEFUSUNfQlVGX1NJWkUvMikpID09IE5VTEwpCisJICAgIHJldHVybiAtNzU7CisKKwlpZiAoKHA9cGpfcG9vbF9hbGxvYyhwb29sLCBTVEFUSUNfQlVGX1NJWkUvMikpID09IE5VTEwpCisJICAgIHJldHVybiAtNzY7CisgICAgfQorICAgIFBKX0NBVENIX0FOWSB7CisJcmV0dXJuIC03NzsKKyAgICB9CisgICAgUEpfRU5EOworCisgICAgLyogT24gdGhlIG5leHQgYWxsb2MsIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duICovCisgICAgUEpfVFJZIHsKKwlwID0gcGpfcG9vbF9hbGxvYyhwb29sLCBTVEFUSUNfQlVGX1NJWkUpOworCWlmIChwICE9IE5VTEwpIHsKKwkgICAgLyogVGhpcyBpcyB1bmV4cGVjdGVkLCB0aGUgYWxsb2Mgc2hvdWxkIGZhaWwgKi8KKwkgICAgcmV0dXJuIC03ODsKKwl9CisgICAgfQorICAgIFBKX0NBVENIX0FOWSB7CisJLyogVGhpcyBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0ICovCisgICAgfQorICAgIFBKX0VORDsKKworICAgIC8qIERvbmUgKi8KKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgcG9vbF90ZXN0KHZvaWQpCit7CisgICAgZW51bSB7IExPT1AgPSAyIH07CisgICAgaW50IGxvb3A7CisgICAgaW50IHJjOworCisgICAgcmMgPSBjYXBhY2l0eV90ZXN0KCk7CisgICAgaWYgKHJjKSByZXR1cm4gcmM7CisKKyAgICByYyA9IHBvb2xfYWxpZ25tZW50X3Rlc3QoKTsKKyAgICBpZiAocmMpIHJldHVybiByYzsKKworICAgIHJjID0gcG9vbF9idWZfYWxpZ25tZW50X3Rlc3QoKTsKKyAgICBpZiAocmMpIHJldHVybiByYzsKKworICAgIGZvciAobG9vcD0wOyBsb29wPExPT1A7ICsrbG9vcCkgeworCS8qIFRlc3QgdGhhdCB0aGUgcG9vbCBzaG91bGQgZ3JvdyBhdXRvbWF0aWNseS4gKi8KKwlyYyA9IGRyYWluX3Rlc3QoU0laRSwgU0laRSk7CisJaWYgKHJjICE9IDApIHJldHVybiByYzsKKworCS8qIFRlc3Qgc2l0dWF0aW9uIHdoZXJlIHBvb2wgaXMgbm90IGFsbG93ZWQgdG8gZ3Jvdy4gCisgCSAqIFdlIGV4cGVjdCB0aGUgdGVzdCB0byByZXR1cm4gY29ycmVjdCBlcnJvci4KKwkgKi8KKwlyYyA9IGRyYWluX3Rlc3QoU0laRSwgMCk7CisJaWYgKHJjICE9IC00MCkgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJjID0gcG9vbF9idWZfdGVzdCgpOworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCisvKiBUbyBwcmV2ZW50IHdhcm5pbmcgYWJvdXQgInRyYW5zbGF0aW9uIHVuaXQgaXMgZW1wdHkiCisgKiB3aGVuIHRoaXMgdGVzdCBpcyBkaXNhYmxlZC4gCisgKi8KK2ludCBkdW1teV9wb29sX3Rlc3Q7CisjZW5kaWYJLyogSU5DTFVERV9QT09MX1RFU1QgKi8KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3Bvb2xfcGVyZi5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3Bvb2xfcGVyZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OTg1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvcG9vbF9wZXJmLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qICRJZDogcG9vbF9wZXJmLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJ0ZXN0LmgiCisKKyNpZiBJTkNMVURFX1BPT0xfUEVSRl9URVNUCisKKyNpbmNsdWRlIDxwamxpYi5oPgorI2luY2x1ZGUgPHBqL2NvbXBhdC9tYWxsb2MuaD4KKworI2lmICFQSl9IQVNfSElHSF9SRVNfVElNRVIKKyMgZXJyb3IgTmVlZCBoaWdoIHJlc29sdXRpb24gdGltZXIgZm9yIHRoaXMgdGVzdC4KKyNlbmRpZgorCisjZGVmaW5lIFRISVNfRklMRSAgICJ0ZXN0IgorCisjZGVmaW5lIExPT1AJICAgIDEwCisjZGVmaW5lIENPVU5UCSAgICAxMDI0CitzdGF0aWMgdW5zaWduZWQJICAgIHNpemVzW0NPVU5UXTsKK3N0YXRpYyBjaGFyCSAgICpwW0NPVU5UXTsKKyNkZWZpbmUgTUlOX1NJWkUgICAgNAorI2RlZmluZSBNQVhfU0laRSAgICA1MTIKK3N0YXRpYyB1bnNpZ25lZCB0b3RhbF9zaXplOworCisKK3N0YXRpYyBpbnQgcG9vbF90ZXN0X3Bvb2woKQoreworICAgIGludCBpOworICAgIHBqX3Bvb2xfdCAqcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgTlVMTCwgdG90YWxfc2l6ZSArIDQqQ09VTlQsIDAsIE5VTEwpOworICAgIGlmICghcG9vbCkKKwlyZXR1cm4gLTE7CisKKyAgICBmb3IgKGk9MDsgaTxDT1VOVDsgKytpKSB7CisJY2hhciAqcDsKKwlpZiAoIChwPShjaGFyKilwal9wb29sX2FsbG9jKHBvb2wsIHNpemVzW2ldKSkgPT0gTlVMTCkgeworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCIgICBlcnJvcjogcG9vbCBmYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMiLAorCQkgICAgICBzaXplc1tpXSkpOworCSAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisJICAgIHJldHVybiAtMTsKKwl9CisJKnAgPSAnXDAnOworICAgIH0KKworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogU3ltYmlhbiBkb2Vzbid0IGhhdmUgbWFsbG9jKCkvZnJlZSgpLCBzbyB3ZSB1c2UgbmV3L2RlbGV0ZSBpbnN0ZWFkICovCisvLyNpZiBkZWZpbmVkKFBKX1NZTUJJQU4pICYmIFBKX1NZTUJJQU4gIT0gMAorI2lmIDAKK3N0YXRpYyBpbnQgcG9vbF90ZXN0X21hbGxvY19mcmVlKCkKK3sKKyAgICBpbnQgaTsgLyogbXVzdCBiZSBzaWduZWQgKi8KKworICAgIGZvciAoaT0wOyBpPENPVU5UOyArK2kpIHsKKwkJcFtpXSA9IG5ldyBjaGFyW3NpemVzW2ldXTsKKwkJaWYgKCFwW2ldKSB7CisJCQlQSl9MT0coMywoVEhJU19GSUxFLCIgICBlcnJvcjogbWFsbG9jIGZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyIsCisJCQkJCSAgc2l6ZXNbaV0pKTsKKwkJCS0taTsKKwkJCXdoaWxlIChpID49IDApIHsKKwkJCQlkZWxldGUgW10gcFtpXTsKKwkJCQktLWk7CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJKnBbaV0gPSAnXDAnOworICAgIH0KKworICAgIGZvciAoaT0wOyBpPENPVU5UOyArK2kpIHsKKyAgICAJZGVsZXRlIFtdIHBbaV07CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCS8qIFBKX1NZTUJJQU4gKi8KKworc3RhdGljIGludCBwb29sX3Rlc3RfbWFsbG9jX2ZyZWUoKQoreworICAgIGludCBpOyAvKiBtdXN0IGJlIHNpZ25lZCAqLworCisgICAgZm9yIChpPTA7IGk8Q09VTlQ7ICsraSkgeworCXBbaV0gPSAoY2hhciopbWFsbG9jKHNpemVzW2ldKTsKKwlpZiAoIXBbaV0pIHsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwiICAgZXJyb3I6IG1hbGxvYyBmYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMiLAorCQkgICAgICBzaXplc1tpXSkpOworCSAgICAtLWk7CisJICAgIHdoaWxlIChpID49IDApCisJCWZyZWUocFtpXSksIC0taTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwkqcFtpXSA9ICdcMCc7CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8Q09VTlQ7ICsraSkgeworCWZyZWUocFtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBQSl9TWU1CSUFOICovCisKK2ludCBwb29sX3BlcmZfdGVzdCgpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBwal91aW50MzJfdCBwb29sX3RpbWU9MCwgbWFsbG9jX3RpbWU9MCwgcG9vbF90aW1lMj0wOworICAgIHBqX3RpbWVzdGFtcCBzdGFydCwgZW5kOworICAgIHBqX3VpbnQzMl90IGJlc3QsIHdvcnN0OworCisgICAgLyogSW5pdGlhbGl6ZSBzaXplIG9mIGNodW5rcyB0byBhbGxvY2F0ZSBpbiBmb3IgdGhlIHRlc3QuICovCisgICAgZm9yIChpPTA7IGk8Q09VTlQ7ICsraSkgeworCXVuc2lnbmVkIGFsaWduZWRfc2l6ZTsKKwlzaXplc1tpXSA9IE1JTl9TSVpFICsgKHBqX3JhbmQoKSAlIE1BWF9TSVpFKTsKKwlhbGlnbmVkX3NpemUgPSBzaXplc1tpXTsKKwlpZiAoYWxpZ25lZF9zaXplICYgKFBKX1BPT0xfQUxJR05NRU5ULTEpKQorCSAgICBhbGlnbmVkX3NpemUgPSAoKGFsaWduZWRfc2l6ZSArIFBKX1BPT0xfQUxJR05NRU5UIC0gMSkpICYgfihQSl9QT09MX0FMSUdOTUVOVCAtIDEpOworCXRvdGFsX3NpemUgKz0gYWxpZ25lZF9zaXplOworICAgIH0KKworICAgIC8qIEFkZCBzb21lIG1vcmUgZm9yIHBvb2wgYWRtaW4gYXJlYSAqLworICAgIHRvdGFsX3NpemUgKz0gNTEyOworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJCZW5jaG1hcmtpbmcgcG9vbC4uIikpOworCisgICAgLyogV2FybXVwICovCisgICAgcG9vbF90ZXN0X3Bvb2woKTsKKyAgICBwb29sX3Rlc3RfbWFsbG9jX2ZyZWUoKTsKKworICAgIGZvciAoaT0wOyBpPExPT1A7ICsraSkgeworCXBqX2dldF90aW1lc3RhbXAoJnN0YXJ0KTsKKwlpZiAocG9vbF90ZXN0X3Bvb2woKSkgeworCSAgICByZXR1cm4gMTsKKwl9CisJcGpfZ2V0X3RpbWVzdGFtcCgmZW5kKTsKKwlwb29sX3RpbWUgKz0gKGVuZC51MzIubG8gLSBzdGFydC51MzIubG8pOworCisJcGpfZ2V0X3RpbWVzdGFtcCgmc3RhcnQpOworCWlmIChwb29sX3Rlc3RfbWFsbG9jX2ZyZWUoKSkgeworCSAgICByZXR1cm4gMjsKKwl9CisJcGpfZ2V0X3RpbWVzdGFtcCgmZW5kKTsKKwltYWxsb2NfdGltZSArPSAoZW5kLnUzMi5sbyAtIHN0YXJ0LnUzMi5sbyk7CisKKwlwal9nZXRfdGltZXN0YW1wKCZzdGFydCk7CisJaWYgKHBvb2xfdGVzdF9wb29sKCkpIHsKKwkgICAgcmV0dXJuIDQ7CisJfQorCXBqX2dldF90aW1lc3RhbXAoJmVuZCk7CisJcG9vbF90aW1lMiArPSAoZW5kLnUzMi5sbyAtIHN0YXJ0LnUzMi5sbyk7CisgICAgfQorCisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwiLi5MT09QIGNvdW50OiAgICAgICAgICAgICAgICAgICAgICAgICV1IixMT09QKSk7CisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwiLi5udW1iZXIgb2YgYWxsb2MvZGVhbGxvYyBwZXIgbG9vcDogICV1IixDT1VOVCkpOworICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsIi4ucG9vbCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiB0aW1lOiAldSIscG9vbF90aW1lKSk7CisgICAgUEpfTE9HKDQsKFRISVNfRklMRSwiLi5tYWxsb2MvZnJlZSB0aW1lOiAgICAgICAgICAgICAgICAgICV1IixtYWxsb2NfdGltZSkpOworICAgIFBKX0xPRyg0LChUSElTX0ZJTEUsIi4ucG9vbCBhZ2Fpbiwgc2Vjb25kIGludm9jYXRpb246ICAgICAldSIscG9vbF90aW1lMikpOworCisgICAgaWYgKHBvb2xfdGltZTI9PTApIHBvb2xfdGltZTI9MTsKKyAgICBpZiAocG9vbF90aW1lIDwgcG9vbF90aW1lMikKKwliZXN0ID0gcG9vbF90aW1lLCB3b3JzdCA9IHBvb2xfdGltZTI7CisgICAgZWxzZQorCWJlc3QgPSBwb29sX3RpbWUyLCB3b3JzdCA9IHBvb2xfdGltZTsKKyAgICAKKyAgICAvKiBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvICovCisgICAgaWYgKGJlc3Q9PTApIGJlc3Q9MTsKKyAgICBpZiAod29yc3Q9PTApIHdvcnN0PTE7CisKKyAgICBQSl9MT0coMywgKFRISVNfRklMRSwgIi4ucG9vbCBzcGVlZHVwIG92ZXIgbWFsbG9jIGJlc3Q9JWR4LCB3b3JzdD0lZHgiLCAKKwkJCSAgKGludCkobWFsbG9jX3RpbWUvYmVzdCksCisJCQkgIChpbnQpKG1hbGxvY190aW1lL3dvcnN0KSkpOworICAgIHJldHVybiAwOworfQorCisKKyNlbmRpZgkvKiBJTkNMVURFX1BPT0xfUEVSRl9URVNUICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9wb29sX3dyYXAuY3BwIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3Bvb2xfd3JhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzNWFlOAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9wb29sX3dyYXAuY3BwCkBAIC0wLDAgKzEsMjQgQEAKKy8qICRJZDogcG9vbF93cmFwLmNwcCAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhIEMrKyB3cmFwcGVyLCBzZWUgdGlja2V0ICM4ODYgZm9yIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgInBvb2wuYyIKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9yYW5kLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvcmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNDQyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvcmFuZC5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qICRJZDogcmFuZC5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGovcmFuZC5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgInRlc3QuaCIKKworI2lmIElOQ0xVREVfUkFORF9URVNUCisKKyNkZWZpbmUgQ09VTlQgIDEwMjQKK3N0YXRpYyBpbnQgdmFsdWVzW0NPVU5UXTsKKworLyoKKyAqIHJhbmRfdGVzdCgpLCBzaW1wbHkgZ2VuZXJhdGVzIENPVU5UIG51bWJlciBvZiByYW5kb20gbnVtYmVyIGFuZAorICogY2hlY2sgdGhhdCB0aGVyZSdzIG5vIGR1cGxpY2F0ZSBudW1iZXJzLgorICovCitpbnQgcmFuZF90ZXN0KHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxDT1VOVDsgKytpKSB7CisJaW50IGo7CisKKwl2YWx1ZXNbaV0gPSBwal9yYW5kKCk7CisJZm9yIChqPTA7IGo8aTsgKytqKSB7CisJICAgIGlmICh2YWx1ZXNbaV0gPT0gdmFsdWVzW2pdKSB7CisJCVBKX0xPRygzLCgidGVzdCIsICJlcnJvcjogZHVwbGljYXRlIHZhbHVlICVkIGF0ICVkLXRoIGluZGV4IiwKKwkJCSB2YWx1ZXNbaV0sIGkpKTsKKwkJcmV0dXJuIC0xMDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIElOQ0xVREVfUkFORF9URVNUICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9yYnRyZWUuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9yYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFhMTYzCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3JidHJlZS5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiAkSWQ6IHJidHJlZS5jIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSAidGVzdC5oIgorCisjaWYgSU5DTFVERV9SQlRSRUVfVEVTVAorCisjaW5jbHVkZSA8cGpsaWIuaD4KKworI2RlZmluZSBMT09QCSAgICAzMgorI2RlZmluZSBNSU5fQ09VTlQgICA2NAorI2RlZmluZSBNQVhfQ09VTlQgICAoTE9PUCAqIE1JTl9DT1VOVCkKKyNkZWZpbmUgU1RSU0laRQkgICAgMTYKKyNkZWZpbmUgVEhJU19GSUxFICAgInJidHJlZV90ZXN0IgorCit0eXBlZGVmIHN0cnVjdCBub2RlX2tleQoreworICAgIHBqX3VpbnQzMl90IGhhc2g7CisgICAgY2hhciBzdHJbU1RSU0laRV07Cit9IG5vZGVfa2V5OworCitzdGF0aWMgaW50IGNvbXBhcmVfbm9kZShjb25zdCBub2RlX2tleSAqazEsIGNvbnN0IG5vZGVfa2V5ICprMikKK3sKKyAgICBpZiAoazEtPmhhc2ggPT0gazItPmhhc2gpIHsKKwlyZXR1cm4gc3RyY21wKGsxLT5zdHIsIGsyLT5zdHIpOworICAgIH0gZWxzZSB7CisJcmV0dXJuIGsxLT5oYXNoCTwgazItPmhhc2ggPyAtMSA6IDE7CisgICAgfQorfQorCit2b2lkIHJhbmRvbWl6ZV9zdHJpbmcoY2hhciAqc3RyLCBpbnQgbGVuKQoreworICAgIGludCBpOworICAgIGZvciAoaT0wOyBpPGxlbi0xOyArK2kpCisJc3RyW2ldID0gKGNoYXIpKCdhJyArIHBqX3JhbmQoKSAlIDI2KTsKKyAgICBzdHJbbGVuLTFdID0gJ1wwJzsKK30KKworc3RhdGljIGludCB0ZXN0KHZvaWQpCit7CisgICAgcGpfcmJ0cmVlIHJiOworICAgIG5vZGVfa2V5ICprZXk7CisgICAgcGpfcmJ0cmVlX25vZGUgKm5vZGU7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIGludCBlcnI9MDsKKyAgICBpbnQgY291bnQgPSBNSU5fQ09VTlQ7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgc2l6ZTsKKworICAgIHBqX3JidHJlZV9pbml0KCZyYiwgKHBqX3JidHJlZV9jb21wKikmY29tcGFyZV9ub2RlKTsKKyAgICBzaXplID0gTUFYX0NPVU5UKihzaXplb2YoKmtleSkrUEpfUkJUUkVFX05PREVfU0laRSkgKyAKKwkJCSAgIFBKX1JCVFJFRV9TSVpFICsgUEpfUE9PTF9TSVpFOworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZSggbWVtLCAicG9vbCIsIHNpemUsIDAsIE5VTEwpOworICAgIGlmICghcG9vbCkgeworCVBKX0xPRygzLCgidGVzdCIsICIuLi5lcnJvcjogY3JlYXRpbmcgcG9vbCBvZiAldSBieXRlcyIsIHNpemUpKTsKKwlyZXR1cm4gLTEwOworICAgIH0KKworICAgIGtleSA9IChub2RlX2tleSAqKXBqX3Bvb2xfYWxsb2MocG9vbCwgTUFYX0NPVU5UKnNpemVvZigqa2V5KSk7CisgICAgaWYgKCFrZXkpCisJcmV0dXJuIC0yMDsKKworICAgIG5vZGUgPSAocGpfcmJ0cmVlX25vZGUqKXBqX3Bvb2xfYWxsb2MocG9vbCwgTUFYX0NPVU5UKnNpemVvZigqbm9kZSkpOworICAgIGlmICghbm9kZSkKKwlyZXR1cm4gLTMwOworCisgICAgZm9yIChpPTA7IGk8TE9PUDsgKytpKSB7CisJaW50IGo7CisJcGpfcmJ0cmVlX25vZGUgKnByZXYsICppdDsKKwlwal90aW1lc3RhbXAgdDEsIHQyLCB0X3NldHVwLCB0X2luc2VydCwgdF9zZWFyY2gsIHRfZXJhc2U7CisKKwlwal9hc3NlcnQocmIuc2l6ZSA9PSAwKTsKKworCXRfc2V0dXAudTMyLmxvID0gdF9pbnNlcnQudTMyLmxvID0gdF9zZWFyY2gudTMyLmxvID0gdF9lcmFzZS51MzIubG8gPSAwOworCisJZm9yIChqPTA7IGo8Y291bnQ7IGorKykgeworCSAgICByYW5kb21pemVfc3RyaW5nKGtleVtqXS5zdHIsIFNUUlNJWkUpOworCisJICAgIHBqX2dldF90aW1lc3RhbXAoJnQxKTsKKwkgICAgbm9kZVtqXS5rZXkgPSAma2V5W2pdOworCSAgICBub2RlW2pdLnVzZXJfZGF0YSA9IGtleVtqXS5zdHI7CisJICAgIGtleVtqXS5oYXNoID0gcGpfaGFzaF9jYWxjKDAsIGtleVtqXS5zdHIsIFBKX0hBU0hfS0VZX1NUUklORyk7CisJICAgIHBqX2dldF90aW1lc3RhbXAoJnQyKTsKKwkgICAgdF9zZXR1cC51MzIubG8gKz0gKHQyLnUzMi5sbyAtIHQxLnUzMi5sbyk7CisKKwkgICAgcGpfZ2V0X3RpbWVzdGFtcCgmdDEpOworCSAgICBwal9yYnRyZWVfaW5zZXJ0KCZyYiwgJm5vZGVbal0pOworCSAgICBwal9nZXRfdGltZXN0YW1wKCZ0Mik7CisJICAgIHRfaW5zZXJ0LnUzMi5sbyArPSAodDIudTMyLmxvIC0gdDEudTMyLmxvKTsKKwl9CisKKwlwal9hc3NlcnQocmIuc2l6ZSA9PSAodW5zaWduZWQpY291bnQpOworCisJLy8gSXRlcmF0ZSBrZXksIG1ha2Ugc3VyZSB0aGV5J3JlIHNvcnRlZC4KKwlwcmV2ID0gTlVMTDsKKwlpdCA9IHBqX3JidHJlZV9maXJzdCgmcmIpOworCXdoaWxlIChpdCkgeworCSAgICBpZiAocHJldikgeworCQlpZiAoY29tcGFyZV9ub2RlKChub2RlX2tleSopcHJldi0+a2V5LChub2RlX2tleSopaXQtPmtleSk+PTApIHsKKwkJICAgICsrZXJyOworCQkgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICJFcnJvcjogJXMgPj0gJXMiLCAKKwkJCSAgICAgICAoY2hhciopcHJldi0+dXNlcl9kYXRhLCAoY2hhciopaXQtPnVzZXJfZGF0YSkpOworCQl9CisJICAgIH0KKwkgICAgcHJldiA9IGl0OworCSAgICBpdCA9IHBqX3JidHJlZV9uZXh0KCZyYiwgaXQpOworCX0KKworCS8vIFNlYXJjaC4KKwlmb3IgKGo9MDsgajxjb3VudDsgaisrKSB7CisJICAgIHBqX2dldF90aW1lc3RhbXAoJnQxKTsKKwkgICAgaXQgPSBwal9yYnRyZWVfZmluZCgmcmIsICZrZXlbal0pOworCSAgICBwal9nZXRfdGltZXN0YW1wKCZ0Mik7CisJICAgIHRfc2VhcmNoLnUzMi5sbyArPSAodDIudTMyLmxvIC0gdDEudTMyLmxvKTsKKworCSAgICBwal9hc3NlcnQoaXQgIT0gTlVMTCk7CisJICAgIGlmIChpdCA9PSBOVUxMKQorCQkrK2VycjsKKwl9CisKKwkvLyBFcmFzZSBub2RlLgorCWZvciAoaj0wOyBqPGNvdW50OyBqKyspIHsKKwkgICAgcGpfZ2V0X3RpbWVzdGFtcCgmdDEpOworCSAgICBpdCA9IHBqX3JidHJlZV9lcmFzZSgmcmIsICZub2RlW2pdKTsKKwkgICAgcGpfZ2V0X3RpbWVzdGFtcCgmdDIpOworCSAgICB0X2VyYXNlLnUzMi5sbyArPSAodDIudTMyLmxvIC0gdDEudTMyLmxvKTsKKwl9CisKKwlQSl9MT0coNCwgKFRISVNfRklMRSwgCisJCSIuLi5jb3VudDolZCwgc2V0dXA6JWQsIGluc2VydDolZCwgc2VhcmNoOiVkLCBlcmFzZTolZCIsCisJCWNvdW50LAorCQl0X3NldHVwLnUzMi5sbyAvIGNvdW50LCB0X2luc2VydC51MzIubG8gLyBjb3VudCwKKwkJdF9zZWFyY2gudTMyLmxvIC8gY291bnQsIHRfZXJhc2UudTMyLmxvIC8gY291bnQpKTsKKworCWNvdW50ID0gMiAqIGNvdW50OworCWlmIChjb3VudCA+IE1BWF9DT1VOVCkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIHJldHVybiBlcnI7Cit9CisKKworaW50IHJidHJlZV90ZXN0KCkKK3sKKyAgICByZXR1cm4gdGVzdCgpOworfQorCisjZW5kaWYJLyogSU5DTFVERV9SQlRSRUVfVEVTVCAqLworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9ydGVtc19uZXR3b3JrX2NvbmZpZy5oIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3J0ZW1zX25ldHdvcmtfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkNTY1MgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9ydGVtc19uZXR3b3JrX2NvbmZpZy5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKiAkSWQ6IHJ0ZW1zX25ldHdvcmtfY29uZmlnLmggMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKworLyoKKyAqIFRoYW5rcyBaZXRyb24sIEluYyBhbmQgUGhpbCBUb3JyZSA8cHRvcnJlQHpldHJvbi5jb20+IGZvciBkb25hdGluZyBQSkxJQgorICogcG9ydCB0byBSVEVNUy4KKyAqLworCisvKgorICogTmV0d29yayBjb25maWd1cmF0aW9uCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVESVQgVEhJUyBGSUxFIFRPIFJFRkxFQ1QgWU9VUiBORVRXT1JLIENPTkZJR1VSQVRJT04gICAgICoKKyAqIEJFRk9SRSBSVU5OSU5HIEFOWSBSVEVNUyBQUk9HUkFNUyBXSElDSCBVU0UgVEhFIE5FVFdPUkshICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICovCisKKyNpZm5kZWYgX1JURU1TX05FVFdPUktDT05GSUdfSF8KKyNkZWZpbmUgX1JURU1TX05FVFdPUktDT05GSUdfSF8KKworCisjZGVmaW5lIERFRkFVTFRfSVBfQUREUkVTU19TVFJJTkcgIjE5Mi4xNjguMC4yIgorI2RlZmluZSBERUZBVUxUX05FVE1BU0tfU1RSSU5HICAgICIyNTUuMjU1LjI1NS4wIgorI2RlZmluZSBERUZBVUxUX0dBVEVXQVlfU1RSSU5HICAgICIxOTIuMTY4LjAuMSIKKworCisKKworI2lmbmRlZiBSVEVNU19CU1BfTkVUV09SS19EUklWRVJfTkFNRQorI3dhcm5pbmcgIlJURU1TX0JTUF9ORVRXT1JLX0RSSVZFUl9OQU1FIGlzIG5vdCBkZWZpbmVkIgorI2RlZmluZSBSVEVNU19CU1BfTkVUV09SS19EUklWRVJfTkFNRSAibm9fbmV0d29yazEiCisjZW5kaWYKKworI2lmbmRlZiBSVEVNU19CU1BfTkVUV09SS19EUklWRVJfQVRUQUNICisjd2FybmluZyAiUlRFTVNfQlNQX05FVFdPUktfRFJJVkVSX0FUVEFDSCBpcyBub3QgZGVmaW5lZCIKKyNkZWZpbmUgUlRFTVNfQlNQX05FVFdPUktfRFJJVkVSX0FUVEFDSCAwCisjZW5kaWYKKworI2RlZmluZSBORVRXT1JLX1NUQUNLX1BSSU9SSVRZIDEyOAorLyogI2RlZmluZSBSVEVNU19VU0VfQk9PVFAgKi8KKworLyogI2RlZmluZSBSVEVNU19VU0VfTE9PUEJBQ0sgKi8KKworI2luY2x1ZGUgPGJzcC5oPgorCisvKgorICogRGVmaW5lIFJURU1TX1NFVF9FVEhFUk5FVF9BRERSRVNTIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlCisgKiBFdGhlcm5ldCBhZGRyZXNzIGhlcmUuICBJZiBSVEVNU19TRVRfRVRIRVJORVRfQUREUkVTUyBpcyBub3QKKyAqIGRlZmluZWQgdGhlIGRyaXZlciB3aWxsIGNob29zZSBhbiBhZGRyZXNzLgorICovCisvLyBOT1RFOiAgVGhlIGFkZHJlc3MgYmVsb3cgaXMgYSBkdW1teSBhZGRyZXNzIHRoYXQgc2hvdWxkIG9ubHkgZXZlcgorLy8gYmUgdXNlZCBmb3IgdGVzdGluZyBvbiBhIHByaXZhdGUgbmV0d29yay4gIERPIE5PVCBMRVQgQSBQUk9EVUNUCisvLyBDT05UQUlOSU5HIFRISVMgRVRIRVJORVQgQUREUkVTUyBPVVQgSU5UTyBUSEUgRklFTEQhCisvLyNkZWZpbmUgUlRFTVNfU0VUX0VUSEVSTkVUX0FERFJFU1MKKyNpZiAoZGVmaW5lZCAoUlRFTVNfU0VUX0VUSEVSTkVUX0FERFJFU1MpKQorc3RhdGljIGNoYXIgZXRoZXJuZXRfYWRkcmVzc1s2XSA9IHsgMHgwMCwgMHg4MCwgMHg3RiwgMHgyMiwgMHg2MSwgMHg3NyB9OworI2VuZGlmCisKKyNkZWZpbmUgUlRFTVNfVVNFX0xPT1BCQUNLIAorI2lmZGVmIFJURU1TX1VTRV9MT09QQkFDSyAKKy8qCisgKiBMb29wYmFjayBpbnRlcmZhY2UKKyAqLworZXh0ZXJuIGludCBydGVtc19ic2RuZXRfbG9vcGF0dGFjaChzdHJ1Y3QgcnRlbXNfYnNkbmV0X2lmY29uZmlnKiBkdW1teSwgaW50IHVudXNlZCk7CitzdGF0aWMgc3RydWN0IHJ0ZW1zX2JzZG5ldF9pZmNvbmZpZyBsb29wYmFja19jb25maWcgPSB7CisJImxvMCIsCQkJCS8qIG5hbWUgKi8KKwlydGVtc19ic2RuZXRfbG9vcGF0dGFjaCwJLyogYXR0YWNoIGZ1bmN0aW9uICovCisJTlVMTCwJCQkJLyogbGluayB0byBuZXh0IGludGVyZmFjZSAqLworCSIxMjcuMC4wLjEiLAkJCS8qIElQIGFkZHJlc3MgKi8KKwkiMjU1LjAuMC4wIiwJCQkvKiBJUCBuZXQgbWFzayAqLworfTsKKyNlbmRpZgorCisvKgorICogRGVmYXVsdCBuZXR3b3JrIGludGVyZmFjZQorICovCitzdGF0aWMgc3RydWN0IHJ0ZW1zX2JzZG5ldF9pZmNvbmZpZyBuZXRkcml2ZXJfY29uZmlnID0geworCVJURU1TX0JTUF9ORVRXT1JLX0RSSVZFUl9OQU1FLAkJLyogbmFtZSAqLworCVJURU1TX0JTUF9ORVRXT1JLX0RSSVZFUl9BVFRBQ0gsCS8qIGF0dGFjaCBmdW5jdGlvbiAqLworCisjaWZkZWYgUlRFTVNfVVNFX0xPT1BCQUNLIAorCSZsb29wYmFja19jb25maWcsCQkvKiBsaW5rIHRvIG5leHQgaW50ZXJmYWNlICovCisjZWxzZQorCU5VTEwsCQkJCS8qIE5vIG1vcmUgaW50ZXJmYWNlcyAqLworI2VuZGlmCisKKyNpZiAoZGVmaW5lZCAoUlRFTVNfVVNFX0JPT1RQKSkKKwlOVUxMLAkJCQkvKiBCT09UUCBzdXBwbGllcyBJUCBhZGRyZXNzICovCisJTlVMTCwJCQkJLyogQk9PVFAgc3VwcGxpZXMgSVAgbmV0IG1hc2sgKi8KKyNlbHNlCisJIjE5Mi4xNjguMC4zMyIsCQkJLyogSVAgYWRkcmVzcyAqLworCSIyNTUuMjU1LjI1NS4wIiwJCS8qIElQIG5ldCBtYXNrICovCisjZW5kaWYgLyogIVJURU1TX1VTRV9CT09UUCAqLworCisjaWYgKGRlZmluZWQgKFJURU1TX1NFVF9FVEhFUk5FVF9BRERSRVNTKSkKKwlldGhlcm5ldF9hZGRyZXNzLCAgICAgICAgICAgICAgIC8qIEV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MgKi8KKyNlbHNlCisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEcml2ZXIgc3VwcGxpZXMgaGFyZHdhcmUgYWRkcmVzcyAqLworI2VuZGlmCisJMAkJCQkvKiBVc2UgZGVmYXVsdCBkcml2ZXIgcGFyYW1ldGVycyAqLworfTsKKworLyoKKyAqIE5ldHdvcmsgY29uZmlndXJhdGlvbgorICovCitzdHJ1Y3QgcnRlbXNfYnNkbmV0X2NvbmZpZyBydGVtc19ic2RuZXRfY29uZmlnID0geworCSZuZXRkcml2ZXJfY29uZmlnLAorCisjaWYgKGRlZmluZWQgKFJURU1TX1VTRV9CT09UUCkpCisJcnRlbXNfYnNkbmV0X2RvX2Jvb3RwLAorI2Vsc2UKKwlOVUxMLAorI2VuZGlmCisKKwlORVRXT1JLX1NUQUNLX1BSSU9SSVRZLAkJLyogRGVmYXVsdCBuZXR3b3JrIHRhc2sgcHJpb3JpdHkgKi8KKwkxMDQ4NTc2LAkJCS8qIERlZmF1bHQgbWJ1ZiBjYXBhY2l0eSAqLworCTEwNDg1NzYsCQkJLyogRGVmYXVsdCBtYnVmIGNsdXN0ZXIgY2FwYWNpdHkgKi8KKworI2lmICghZGVmaW5lZCAoUlRFTVNfVVNFX0JPT1RQKSkKKwkidGVzdG5vZGUiLAkJLyogSG9zdCBuYW1lICovCisJImV4YW1wbGUub3JnIiwJCS8qIERvbWFpbiBuYW1lICovCisJIjE5Mi4xNjguNi45IiwJCS8qIEdhdGV3YXkgKi8KKwkiMTkyLjE2OC43LjQxIiwJCS8qIExvZyBob3N0ICovCisJeyIxOTguMTM3LjIzMS4xIiB9LAkvKiBOYW1lIHNlcnZlcihzKSAqLworCXsiMjA3LjIwMi4xOTAuMTYyIiB9LAkvKiBOVFAgc2VydmVyKHMpICovCisjZW5kaWYgLyogIVJURU1TX1VTRV9CT09UUCAqLworCit9OworCisjZW5kaWYJLyogX1JURU1TX05FVFdPUktDT05GSUdfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3NlbGVjdC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3NlbGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDg5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3Qvc2VsZWN0LmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qICRJZDogc2VsZWN0LmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJ0ZXN0LmgiCisKKy8qKgorICogXHBhZ2UgcGFnZV9wamxpYl9zZWxlY3RfdGVzdCBUZXN0OiBTb2NrZXQgU2VsZWN0KCkKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gb2YgXGIgc2VsZWN0X3Rlc3QoKS4gSXQgdGVzdHMgdGhlCisgKiBmdW5jdGlvbmFsaXR5IG9mIHRoZSBwal9zb2NrX3NlbGVjdCgpIEFQSS4KKyAqCisgKgorICogVGhpcyBmaWxlIGlzIDxiPnBqbGliLXRlc3Qvc2VsZWN0LmM8L2I+CisgKgorICogXGluY2x1ZGUgcGpsaWItdGVzdC9zZWxlY3QuYworICovCisKKworI2lmIElOQ0xVREVfU0VMRUNUX1RFU1QKKworI2luY2x1ZGUgPHBqL3NvY2suaD4KKyNpbmNsdWRlIDxwai9zb2NrX3NlbGVjdC5oPgorI2luY2x1ZGUgPHBqL2xvZy5oPgorI2luY2x1ZGUgPHBqL3N0cmluZy5oPgorI2luY2x1ZGUgPHBqL2Fzc2VydC5oPgorI2luY2x1ZGUgPHBqL29zLmg+CisjaW5jbHVkZSA8cGovZXJybm8uaD4KKworZW51bQoreworICAgIFJFQURfRkRTLAorICAgIFdSSVRFX0ZEUywKKyAgICBFWENFUFRfRkRTCit9OworCisjZGVmaW5lIFVEUF9QT1JUICAgIDUxMjMyCisjZGVmaW5lIFRISVNfRklMRSAgICJzZWxlY3RfdGVzdCIKKworLyoKKyAqIGRvX3NlbGVjdCgpCisgKgorICogUGVyZm9ybSBwal9zb2NrX3NlbGVjdCgpIGFuZCBmaW5kIG91dCB3aGljaCBzb2NrZXRzCisgKiBhcmUgc2lnbmFsbGVkLgorICovICAgIAorc3RhdGljIGludCBkb19zZWxlY3QoIHBqX3NvY2tfdCBzb2NrMSwgcGpfc29ja190IHNvY2syLAorCQkgICAgICBpbnQgc2V0Y291bnRbXSkKK3sKKyAgICBwal9mZF9zZXRfdCBmZHNbM107CisgICAgcGpfdGltZV92YWwgdGltZW91dDsKKyAgICBpbnQgaSwgbjsKKyAgICAKKyAgICBmb3IgKGk9MDsgaTwzOyArK2kpIHsKKyAgICAgICAgUEpfRkRfWkVSTygmZmRzW2ldKTsKKyAgICAgICAgUEpfRkRfU0VUKHNvY2sxLCAmZmRzW2ldKTsKKyAgICAgICAgUEpfRkRfU0VUKHNvY2syLCAmZmRzW2ldKTsKKyAgICAgICAgc2V0Y291bnRbaV0gPSAwOworICAgIH0KKworICAgIHRpbWVvdXQuc2VjID0gMTsKKyAgICB0aW1lb3V0Lm1zZWMgPSAwOworCisgICAgbiA9IHBqX3NvY2tfc2VsZWN0KFBKX0lPUVVFVUVfTUFYX0hBTkRMRVMsICZmZHNbMF0sICZmZHNbMV0sICZmZHNbMl0sCisJCSAgICAgICAmdGltZW91dCk7CisgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gbjsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaT0wOyBpPDM7ICsraSkgeworICAgICAgICBpZiAoUEpfRkRfSVNTRVQoc29jazEsICZmZHNbaV0pKQorICAgICAgICAgICAgc2V0Y291bnRbaV0rKzsKKyAgICAgICAgaWYgKFBKX0ZEX0lTU0VUKHNvY2syLCAmZmRzW2ldKSkKKwkgICAgc2V0Y291bnRbaV0rKzsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworLyoKKyAqIHNlbGVjdF90ZXN0KCkKKyAqCisgKiBUZXN0IG1haW4gZW50cnkuCisgKi8KK2ludCBzZWxlY3RfdGVzdCgpCit7CisgICAgcGpfc29ja190IHVkcDE9UEpfSU5WQUxJRF9TT0NLRVQsIHVkcDI9UEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgcGpfc29ja2FkZHJfaW4gdWRwX2FkZHI7CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgc2V0Y291bnRbM107CisgICAgcGpfc3RyX3QgczsKKyAgICBjb25zdCBjaGFyIGRhdGFbXSA9ICJoZWxsbyI7CisgICAgY29uc3QgaW50IGRhdGFsZW4gPSA1OworICAgIHBqX3NzaXplX3Qgc2VudCwgcmVjZWl2ZWQ7CisgICAgY2hhciBidWZbMTBdOworICAgIHBqX3N0YXR1c190IHJjOworCisgICAgUEpfTE9HKDMsIChUSElTX0ZJTEUsICIuLi5UZXN0aW5nIHNpbXBsZSBVRFAgc2VsZWN0KCkiKSk7CisgICAgCisgICAgLy8gQ3JlYXRlIHR3byBVRFAgc29ja2V0cy4KKyAgICByYyA9IHBqX3NvY2tfc29ja2V0KCBwal9BRl9JTkVUKCksIHBqX1NPQ0tfREdSQU0oKSwgMCwgJnVkcDEpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiB1bmFibGUgdG8gY3JlYXRlIHNvY2tldCIsIHJjKTsKKwlzdGF0dXM9LTEwOyBnb3RvIG9uX3JldHVybjsKKyAgICB9CisgICAgcmMgPSBwal9zb2NrX3NvY2tldCggcGpfQUZfSU5FVCgpLCBwal9TT0NLX0RHUkFNKCksIDAsICZ1ZHAyKTsKKyAgICBpZiAodWRwMiA9PSBQSl9JTlZBTElEX1NPQ0tFVCkgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvcjogdW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQiLCByYyk7CisJc3RhdHVzPS0yMDsgZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLy8gQmluZCBvbmUgb2YgdGhlIFVEUCBzb2NrZXQuCisgICAgcGpfYnplcm8oJnVkcF9hZGRyLCBzaXplb2YodWRwX2FkZHIpKTsKKyAgICB1ZHBfYWRkci5zaW5fZmFtaWx5ID0gcGpfQUZfSU5FVCgpOworICAgIHVkcF9hZGRyLnNpbl9wb3J0ID0gVURQX1BPUlQ7CisgICAgdWRwX2FkZHIuc2luX2FkZHIgPSBwal9pbmV0X2FkZHIocGpfY3N0cigmcywgIjEyNy4wLjAuMSIpKTsKKworICAgIGlmIChwal9zb2NrX2JpbmQodWRwMiwgJnVkcF9hZGRyLCBzaXplb2YodWRwX2FkZHIpKSkgeworCXN0YXR1cz0tMzA7IGdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIC8vIFNlbmQgZGF0YS4KKyAgICBzZW50ID0gZGF0YWxlbjsKKyAgICByYyA9IHBqX3NvY2tfc2VuZHRvKHVkcDEsIGRhdGEsICZzZW50LCAwLCAmdWRwX2FkZHIsIHNpemVvZih1ZHBfYWRkcikpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTIHx8IHNlbnQgIT0gZGF0YWxlbikgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvcjogc2VuZHRvKCkgZXJyb3IiLCByYyk7CisJc3RhdHVzPS00MDsgZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLy8gU2xlZXAgYSBiaXQuIFNlZSBodHRwOi8vdHJhYy5wanNpcC5vcmcvcmVwb3MvdGlja2V0Lzg5MAorICAgIHBqX3RocmVhZF9zbGVlcCgxMCk7CisKKyAgICAvLyBDaGVjayB0aGF0IHNvY2tldCBpcyBtYXJrZWQgYXMgcmVhYmxlLgorICAgIC8vIE5vdGUgdGhhdCBzZWxlY3QoKSBtYXkgYWxzbyByZXBvcnQgdGhhdCBzb2NrZXRzIGFyZSB3cml0YWJsZS4KKyAgICBzdGF0dXMgPSBkb19zZWxlY3QodWRwMSwgdWRwMiwgc2V0Y291bnQpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisJY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgcGpfc3RyZXJyb3IocGpfZ2V0X25ldG9zX2Vycm9yKCksIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpOworCVBKX0xPRygxLChUSElTX0ZJTEUsICIuLi5lcnJvcjogJXMiLCBlcnJidWYpKTsKKwlzdGF0dXM9LTUwOyBnb3RvIG9uX3JldHVybjsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisJc3RhdHVzPS02MDsgZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgaWYgKHNldGNvdW50W1JFQURfRkRTXSAhPSAxKSB7CisJc3RhdHVzPS03MDsgZ290byBvbl9yZXR1cm47CisgICAgfQorICAgIGlmIChzZXRjb3VudFtXUklURV9GRFNdICE9IDApIHsKKwlpZiAoc2V0Y291bnRbV1JJVEVfRkRTXSA9PSAyKSB7CisJICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLi5pbmZvOiBzeXN0ZW0gcmVwb3J0cyB3cml0YWJsZSBzb2NrZXRzIikpOworCX0gZWxzZSB7CisJICAgIHN0YXR1cz0tODA7IGdvdG8gb25fcmV0dXJuOworCX0KKyAgICB9IGVsc2UgeworCVBKX0xPRygzLChUSElTX0ZJTEUsIAorCQkgICIuLi5pbmZvOiBzeXN0ZW0gZG9lc24ndCByZXBvcnQgd3JpdGFibGUgc29ja2V0cyIpKTsKKyAgICB9CisgICAgaWYgKHNldGNvdW50W0VYQ0VQVF9GRFNdICE9IDApIHsKKwlzdGF0dXM9LTkwOyBnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvLyBSZWFkIHRoZSBzb2NrZXQgdG8gY2xlYXIgcmVhZGFibGUgc29ja2V0cy4KKyAgICByZWNlaXZlZCA9IHNpemVvZihidWYpOworICAgIHJjID0gcGpfc29ja19yZWN2KHVkcDIsIGJ1ZiwgJnJlY2VpdmVkLCAwKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUyB8fCByZWNlaXZlZCAhPSA1KSB7CisJc3RhdHVzPS0xMDA7IGdvdG8gb25fcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBzdGF0dXMgPSAwOworCisgICAgLy8gVGVzdCB0aW1lb3V0IG9uIHRoZSByZWFkIHBhcnQuCisgICAgLy8gVGhpcyB3b24ndCBuZWNlc3NhcmlseSByZXR1cm4gemVybywgYXMgc2VsZWN0KCkgbWF5IHJlcG9ydCB0aGF0CisgICAgLy8gc29ja2V0cyBhcmUgd3JpdGFibGUuCisgICAgc2V0Y291bnRbMF0gPSBzZXRjb3VudFsxXSA9IHNldGNvdW50WzJdID0gMDsKKyAgICBzdGF0dXMgPSBkb19zZWxlY3QodWRwMSwgdWRwMiwgc2V0Y291bnQpOworICAgIGlmIChzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gc2V0Y291bnRbV1JJVEVfRkRTXSkgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICIuLi5lcnJvcjogZXhwZWN0aW5nIHRpbWVvdXQgYnV0IGdvdCAlZCBza3Mgc2V0IiwKKwkJCSAgICAgc3RhdHVzKSk7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIiAgICAgICAgICByZHNldDogJWQsIHdyc2V0OiAlZCwgZXhzZXQ6ICVkIiwKKwkJCSAgICAgc2V0Y291bnRbMF0sIHNldGNvdW50WzFdLCBzZXRjb3VudFsyXSkpOworCXN0YXR1cyA9IC0xMTA7IGdvdG8gb25fcmV0dXJuOworICAgIH0KKyAgICBpZiAoc2V0Y291bnRbUkVBRF9GRFNdICE9IDApIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uZXJyb3I6IHJlYWRhYmxlIHNvY2tldCBub3QgZXhwZWN0ZWQiKSk7CisJc3RhdHVzID0gLTEyMDsgZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzID0gMDsKKworb25fcmV0dXJuOgorICAgIGlmICh1ZHAxICE9IFBKX0lOVkFMSURfU09DS0VUKQorCXBqX3NvY2tfY2xvc2UodWRwMSk7CisgICAgaWYgKHVkcDIgIT0gUEpfSU5WQUxJRF9TT0NLRVQpCisJcGpfc29ja19jbG9zZSh1ZHAyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisjZWxzZQorLyogVG8gcHJldmVudCB3YXJuaW5nIGFib3V0ICJ0cmFuc2xhdGlvbiB1bml0IGlzIGVtcHR5IgorICogd2hlbiB0aGlzIHRlc3QgaXMgZGlzYWJsZWQuIAorICovCitpbnQgZHVtbXlfc2VsZWN0X3Rlc3Q7CisjZW5kaWYJLyogSU5DTFVERV9TRUxFQ1RfVEVTVCAqLworCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9zbGVlcC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3NsZWVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiZWY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9zbGVlcC5jCkBAIC0wLDAgKzEsMjI0IEBACisvKiAkSWQ6IHNsZWVwLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJ0ZXN0LmgiCisKKy8qKgorICogXHBhZ2UgcGFnZV9wamxpYl9zbGVlcF90ZXN0IFRlc3Q6IFNsZWVwLCBUaW1lLCBhbmQgVGltZXN0YW1wCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIFxiIHNsZWVwX3Rlc3QoKS4KKyAqCisgKiBcc2VjdGlvbiBzbGVlcF90ZXN0X3NlYyBTY29wZSBvZiB0aGUgVGVzdAorICoKKyAqIFRoaXMgdGVzdHM6CisgKiAgLSB3aGV0aGVyIHBqX3RocmVhZF9zbGVlcCgpIHdvcmtzLgorICogIC0gd2hldGhlciBwal9nZXR0aW1lb2ZkYXkoKSB3b3Jrcy4KKyAqICAtIHdoZXRoZXIgcGpfZ2V0X3RpbWVzdGFtcCgpIGFuZCBmcmllbmRzIHdvcmtzLgorICoKKyAqIEFQSSB0ZXN0ZWQ6CisgKiAgLSBwal90aHJlYWRfc2xlZXAoKQorICogIC0gcGpfZ2V0dGltZW9mZGF5KCkKKyAqICAtIFBKX1RJTUVfVkFMX1NVQigpCisgKiAgLSBQSl9USU1FX1ZBTF9MVEUoKQorICogIC0gcGpfZ2V0X3RpbWVzdGFtcCgpCisgKiAgLSBwal9nZXRfdGltZXN0YW1wX2ZyZXEoKSAoaW1wbGljaXRseSkKKyAqICAtIHBqX2VsYXBzZWRfdGltZSgpCisgKiAgLSBwal9lbGFwc2VkX3VzZWMoKQorICoKKyAqCisgKiBUaGlzIGZpbGUgaXMgPGI+cGpsaWItdGVzdC9zbGVlcC5jPC9iPgorICoKKyAqIFxpbmNsdWRlIHBqbGliLXRlc3Qvc2xlZXAuYworICovCisKKyNpZiBJTkNMVURFX1NMRUVQX1RFU1QKKworI2luY2x1ZGUgPHBqbGliLmg+CisKKyNkZWZpbmUgVEhJU19GSUxFICAgInNsZWVwX3Rlc3QiCisKK3N0YXRpYyBpbnQgc2ltcGxlX3NsZWVwX3Rlc3Qodm9pZCkKK3sKKyAgICBlbnVtIHsgQ09VTlQgPSAxMCB9OworICAgIGludCBpOworICAgIHBqX3N0YXR1c190IHJjOworICAgIAorICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLndpbGwgd3JpdGUgbWVzc2FnZXMgZXZlcnkgMSBzZWNvbmQ6IikpOworICAgIAorICAgIGZvciAoaT0wOyBpPENPVU5UOyArK2kpIHsKKwlwal90aW1lX3ZhbCB0djsKKwlwal9wYXJzZWRfdGltZSBwdDsKKworCXJjID0gcGpfdGhyZWFkX3NsZWVwKDEwMDApOworCWlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal90aHJlYWRfc2xlZXAoKSIsIHJjKTsKKwkgICAgcmV0dXJuIC0xMDsKKwl9CisKKwlyYyA9IHBqX2dldHRpbWVvZmRheSgmdHYpOworCWlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal9nZXR0aW1lb2ZkYXkoKSIsIHJjKTsKKwkgICAgcmV0dXJuIC0xMTsKKwl9CisKKwlwal90aW1lX2RlY29kZSgmdHYsICZwdCk7CisKKwlQSl9MT0coMywoVEhJU19GSUxFLCAKKwkJICAiLi4uJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQuJTAzZCIsCisJCSAgcHQueWVhciwgcHQubW9uLCBwdC5kYXksCisJCSAgcHQuaG91ciwgcHQubWluLCBwdC5zZWMsIHB0Lm1zZWMpKTsKKworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsZWVwX2R1cmF0aW9uX3Rlc3Qodm9pZCkKK3sKKyAgICBlbnVtIHsgTUlTID0gMjB9OworICAgIHVuc2lnbmVkIGR1cmF0aW9uW10gPSB7IDIwMDAsIDEwMDAsIDUwMCwgMjAwLCAxMDAgfTsKKyAgICB1bnNpZ25lZCBpOworICAgIHBqX3N0YXR1c190IHJjOworCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4ucnVubmluZyBzbGVlcCBkdXJhdGlvbiB0ZXN0IikpOworCisgICAgLyogVGVzdCBwal90aHJlYWRfc2xlZXAoKSBhbmQgcGpfZ2V0dGltZW9mZGF5KCkgKi8KKyAgICBmb3IgKGk9MDsgaTxQSl9BUlJBWV9TSVpFKGR1cmF0aW9uKTsgKytpKSB7CisgICAgICAgIHBqX3RpbWVfdmFsIHN0YXJ0LCBzdG9wOworCXBqX3VpbnQzMl90IG1zZWM7CisKKyAgICAgICAgLyogTWFyayBzdGFydCBvZiB0ZXN0LiAqLworICAgICAgICByYyA9IHBqX2dldHRpbWVvZmRheSgmc3RhcnQpOworICAgICAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3I6IHBqX2dldHRpbWVvZmRheSgpIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuIC0xMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNsZWVwICovCisgICAgICAgIHJjID0gcGpfdGhyZWFkX3NsZWVwKGR1cmF0aW9uW2ldKTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBwal90aHJlYWRfc2xlZXAoKSIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAtMjA7CisgICAgICAgIH0KKworICAgICAgICAvKiBNYXJrIGVuZCBvZiB0ZXN0LiAqLworICAgICAgICByYyA9IHBqX2dldHRpbWVvZmRheSgmc3RvcCk7CisKKyAgICAgICAgLyogQ2FsY3VsYXRlIGR1cmF0aW9uIChzdG9yZSBpbiBzdG9wKS4gKi8KKyAgICAgICAgUEpfVElNRV9WQUxfU1VCKHN0b3AsIHN0YXJ0KTsKKworCS8qIENvbnZlcnQgdG8gbXNlYy4gKi8KKwltc2VjID0gUEpfVElNRV9WQUxfTVNFQyhzdG9wKTsKKworCS8qIENoZWNrIGlmIGl0J3Mgd2l0aGluIHJhbmdlLiAqLworCWlmIChtc2VjIDwgZHVyYXRpb25baV0gKiAoMTAwLU1JUykvMTAwIHx8CisJICAgIG1zZWMgPiBkdXJhdGlvbltpXSAqICgxMDArTUlTKS8xMDApCisJeworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAKKwkJICAgICAgIi4uLmVycm9yOiBzbGVwdCBmb3IgJWQgbXMgaW5zdGVhZCBvZiAlZCBtcyAiCisJCSAgICAgICIob3V0c2lkZSAlZCUlIGVyciB3aW5kb3cpIiwKKwkJICAgICAgbXNlYywgZHVyYXRpb25baV0sIE1JUykpOworCSAgICByZXR1cm4gLTMwOworCX0KKyAgICB9CisKKworICAgIC8qIFRlc3QgcGpfdGhyZWFkX3NsZWVwKCkgYW5kIHBqX2dldF90aW1lc3RhbXAoKSBhbmQgZnJpZW5kcyAqLworICAgIGZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUoZHVyYXRpb24pOyArK2kpIHsKKwlwal90aW1lX3ZhbCB0MSwgdDI7CisgICAgICAgIHBqX3RpbWVzdGFtcCBzdGFydCwgc3RvcDsKKwlwal91aW50MzJfdCBtc2VjOworCisJcGpfdGhyZWFkX3NsZWVwKDApOworCisgICAgICAgIC8qIE1hcmsgc3RhcnQgb2YgdGVzdC4gKi8KKyAgICAgICAgcmMgPSBwal9nZXRfdGltZXN0YW1wKCZzdGFydCk7CisgICAgICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvcjogcGpfZ2V0X3RpbWVzdGFtcCgpIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuIC02MDsKKyAgICAgICAgfQorCisJLyogLi5hbHNvIHdpdGggZ2V0dGltZW9mZGF5KCkgKi8KKwlwal9nZXR0aW1lb2ZkYXkoJnQxKTsKKworICAgICAgICAvKiBTbGVlcCAqLworICAgICAgICByYyA9IHBqX3RocmVhZF9zbGVlcChkdXJhdGlvbltpXSk7CisgICAgICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvcjogcGpfdGhyZWFkX3NsZWVwKCkiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLTcwOworICAgICAgICB9CisKKyAgICAgICAgLyogTWFyayBlbmQgb2YgdGVzdC4gKi8KKyAgICAgICAgcGpfZ2V0X3RpbWVzdGFtcCgmc3RvcCk7CisKKwkvKiAuLmFsc28gd2l0aCBnZXR0aW1lb2ZkYXkoKSAqLworCXBqX2dldHRpbWVvZmRheSgmdDIpOworCisJLyogQ29tcGFyZSB0MSBhbmQgdDIuICovCisJaWYgKFBKX1RJTUVfVkFMX0xUKHQyLCB0MSkpIHsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLmVycm9yOiB0MiBpcyBsZXNzIHRoYW4gdDEhISIpKTsKKwkgICAgcmV0dXJuIC03NTsKKwl9CisKKyAgICAgICAgLyogR2V0IGVsYXBzZWQgdGltZSBpbiBtc2VjICovCisgICAgICAgIG1zZWMgPSBwal9lbGFwc2VkX21zZWMoJnN0YXJ0LCAmc3RvcCk7CisKKwkvKiBDaGVjayBpZiBpdCdzIHdpdGhpbiByYW5nZS4gKi8KKwlpZiAobXNlYyA8IGR1cmF0aW9uW2ldICogKDEwMC1NSVMpLzEwMCB8fAorCSAgICBtc2VjID4gZHVyYXRpb25baV0gKiAoMTAwK01JUykvMTAwKQorCXsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgCisJCSAgICAgICIuLi5lcnJvcjogc2xlcHQgZm9yICVkIG1zIGluc3RlYWQgb2YgJWQgbXMgIgorCQkgICAgICAiKG91dHNpZGUgJWQlJSBlcnIgd2luZG93KSIsCisJCSAgICAgIG1zZWMsIGR1cmF0aW9uW2ldLCBNSVMpKTsKKwkgICAgUEpfVElNRV9WQUxfU1VCKHQyLCB0MSk7CisJICAgIFBKX0xPRygzLChUSElTX0ZJTEUsIAorCQkgICAgICAiLi4uaW5mbzogZ2V0dGltZW9mZGF5KCkgcmVwb3J0ZWQgZHVyYXRpb24gaXMgIgorCQkgICAgICAiJWQgbXNlYyIsCisJCSAgICAgIFBKX1RJTUVfVkFMX01TRUModDIpKSk7CisKKwkgICAgcmV0dXJuIC03NjsKKwl9CisgICAgfQorCisgICAgLyogQWxsIGRvbmUuICovCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzbGVlcF90ZXN0KCkKK3sKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IHNpbXBsZV9zbGVlcF90ZXN0KCk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHJjOworCisgICAgcmMgPSBzbGVlcF9kdXJhdGlvbl90ZXN0KCk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisJcmV0dXJuIHJjOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCisvKiBUbyBwcmV2ZW50IHdhcm5pbmcgYWJvdXQgInRyYW5zbGF0aW9uIHVuaXQgaXMgZW1wdHkiCisgKiB3aGVuIHRoaXMgdGVzdCBpcyBkaXNhYmxlZC4gCisgKi8KK2ludCBkdW1teV9zbGVlcF90ZXN0OworI2VuZGlmICAvKiBJTkNMVURFX1NMRUVQX1RFU1QgKi8KZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9zb2NrLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3Qvc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMGZiOTcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3Qvc29jay5jCkBAIC0wLDAgKzEsODc3IEBACisvKiAkSWQ6IHNvY2suYyAzODQxIDIwMTEtMTAtMjQgMDk6Mjg6MTNaIG1pbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwamxpYi5oPgorI2luY2x1ZGUgInRlc3QuaCIKKworCisvKioKKyAqIFxwYWdlIHBhZ2VfcGpsaWJfc29ja190ZXN0IFRlc3Q6IFNvY2tldAorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiBcYiBzb2NrX3Rlc3QoKS4gSXQgdGVzdHMgdGhlCisgKiB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIHNvY2tldCBBUEkuCisgKgorICogXHNlY3Rpb24gc29ja190ZXN0X3Njb3BlX3NlYyBTY29wZSBvZiB0aGUgVGVzdAorICoKKyAqIFRoZSBzY29wZSBvZiB0aGUgdGVzdDoKKyAqICAtIHZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgdGhlIGFkZHJlc3Mgc3RydWN0cy4KKyAqICAtIHZlcmlmeSB0aGF0IGFkZHJlc3MgbWFuaXB1bGF0aW9uIEFQSSB3b3Jrcy4KKyAqICAtIHNpbXBsZSBzb2NrZXQgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uLgorICogIC0gc2ltcGxlIHNvY2tldCBzZW5kL3JlY3YgYW5kIHNlbmR0by9yZWN2ZnJvbS4KKyAqICAtIFVEUCBjb25uZWN0KCkKKyAqICAtIHNlbmQvcmVjdiBiaWcgZGF0YS4KKyAqICAtIGFsbCBmb3IgYm90aCBVRFAgYW5kIFRDUC4KKyAqCisgKiBUaGUgQVBJcyB0ZXN0ZWQgaW4gdGhpcyB0ZXN0OgorICogIC0gcGpfaW5ldF9hdG9uKCkKKyAqICAtIHBqX2luZXRfbnRvYSgpCisgKiAgLSBwal9pbmV0X3B0b24oKSAgKG9ubHkgaWYgSVB2NiBpcyBlbmFibGVkKQorICogIC0gcGpfaW5ldF9udG9wKCkgIChvbmx5IGlmIElQdjYgaXMgZW5hYmxlZCkKKyAqICAtIHBqX2dldGhvc3RuYW1lKCkKKyAqICAtIHBqX3NvY2tfc29ja2V0KCkKKyAqICAtIHBqX3NvY2tfY2xvc2UoKQorICogIC0gcGpfc29ja19zZW5kKCkKKyAqICAtIHBqX3NvY2tfc2VuZHRvKCkKKyAqICAtIHBqX3NvY2tfcmVjdigpCisgKiAgLSBwal9zb2NrX3JlY3Zmcm9tKCkKKyAqICAtIHBqX3NvY2tfYmluZCgpCisgKiAgLSBwal9zb2NrX2Nvbm5lY3QoKQorICogIC0gcGpfc29ja19saXN0ZW4oKQorICogIC0gcGpfc29ja19hY2NlcHQoKQorICogIC0gcGpfZ2V0aG9zdGJ5bmFtZSgpCisgKgorICoKKyAqIFRoaXMgZmlsZSBpcyA8Yj5wamxpYi10ZXN0L3NvY2suYzwvYj4KKyAqCisgKiBcaW5jbHVkZSBwamxpYi10ZXN0L3NvY2suYworICovCisKKyNpZiBJTkNMVURFX1NPQ0tfVEVTVAorCisjZGVmaW5lIFVEUF9QT1JUCTUxMjM0CisjZGVmaW5lIFRDUF9QT1JUICAgICAgICAoVURQX1BPUlQrMTApCisjZGVmaW5lIEJJR19EQVRBX0xFTgk4MTkyCisjZGVmaW5lIEFERFJFU1MJCSIxMjcuMC4wLjEiCisKK3N0YXRpYyBjaGFyIGJpZ2RhdGFbQklHX0RBVEFfTEVOXTsKK3N0YXRpYyBjaGFyIGJpZ2J1ZmZlcltCSUdfREFUQV9MRU5dOworCisvKiBNYWNybyBmb3IgY2hlY2tpbmcgdGhlIHZhbHVlIG9mICJzaW5fbGVuIiBtZW1iZXIgb2Ygc29ja2FkZHIKKyAqIChpdCBtdXN0IGFsd2F5cyBiZSB6ZXJvKS4KKyAqLworI2lmIGRlZmluZWQoUEpfU09DS0FERFJfSEFTX0xFTikgJiYgUEpfU09DS0FERFJfSEFTX0xFTiE9MAorIyAgIGRlZmluZSBDSEVDS19TQV9aRVJPX0xFTihhZGRyLCByZXQpIFwKKwlpZiAoKChwal9hZGRyX2hkciopKGFkZHIpKS0+c2FfemVyb19sZW4gIT0gMCkgXAorCSAgICByZXR1cm4gcmV0CisjZWxzZQorIyAgIGRlZmluZSBDSEVDS19TQV9aRVJPX0xFTihhZGRyLCByZXQpCisjZW5kaWYKKworCitzdGF0aWMgaW50IGZvcm1hdF90ZXN0KHZvaWQpCit7CisgICAgcGpfc3RyX3QgcyA9IHBqX3N0cihBRERSRVNTKTsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIHBqX2luX2FkZHIgYWRkcjsKKyAgICBjaGFyIHplcm9bNjRdOworICAgIHBqX3NvY2thZGRyX2luIGFkZHIyOworICAgIGNvbnN0IHBqX3N0cl90ICpob3N0bmFtZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEFbXSA9IHsxMjcsIDAsIDAsIDF9OworCisgICAgUEpfTE9HKDMsKCJ0ZXN0IiwgIi4uLmZvcm1hdF90ZXN0KCkiKSk7CisgICAgCisgICAgLyogcGpfaW5ldF9hdG9uKCkgKi8KKyAgICBpZiAocGpfaW5ldF9hdG9uKCZzLCAmYWRkcikgIT0gMSkKKwlyZXR1cm4gLTEwOworICAgIAorICAgIC8qIENoZWNrIHRoZSByZXN1bHQuICovCisgICAgcCA9ICh1bnNpZ25lZCBjaGFyKikmYWRkcjsKKyAgICBpZiAocFswXSE9QVswXSB8fCBwWzFdIT1BWzFdIHx8IHBbMl0hPUFbMl0gfHwgcFszXSE9QVszXSkgeworCVBKX0xPRygzLCgidGVzdCIsICIgIGVycm9yOiBtaXNtYXRjaGVkIGFkZHJlc3MuIHAwPSVkLCBwMT0lZCwgIgorCQkJICAicDI9JWQsIHAzPSVkIiwgcFswXSAmIDB4RkYsIHBbMV0gJiAweEZGLCAKKwkJCSAgIHBbMl0gJiAweEZGLCBwWzNdICYgMHhGRikpOworCXJldHVybiAtMTU7CisgICAgfQorCisgICAgLyogcGpfaW5ldF9udG9hKCkgKi8KKyAgICBwID0gKHVuc2lnbmVkIGNoYXIqKSBwal9pbmV0X250b2EoYWRkcik7CisgICAgaWYgKCFwKQorCXJldHVybiAtMjA7CisKKyAgICBpZiAocGpfc3RyY21wMigmcywgKGNoYXIqKXApICE9IDApCisJcmV0dXJuIC0yMjsKKworI2lmIGRlZmluZWQoUEpfSEFTX0lQVjYpICYmIFBKX0hBU19JUFY2IT0wCisgICAgLyogcGpfaW5ldF9wdG9uKCkgKi8KKyAgICAvKiBwal9pbmV0X250b3AoKSAqLworICAgIHsKKwljb25zdCBwal9zdHJfdCBzX2lwdjQgPSBwal9zdHIoIjEyNy4wLjAuMSIpOworCWNvbnN0IHBqX3N0cl90IHNfaXB2NiA9IHBqX3N0cigiZmU4MDo6MmZmOjgzZmY6ZmU3Yzo4YjQyIik7CisJY2hhciBidWZfaXB2NFtQSl9JTkVUX0FERFJTVFJMRU5dOworCWNoYXIgYnVmX2lwdjZbUEpfSU5FVDZfQUREUlNUUkxFTl07CisJcGpfaW5fYWRkciBpcHY0OworCXBqX2luNl9hZGRyIGlwdjY7CisKKwlpZiAocGpfaW5ldF9wdG9uKHBqX0FGX0lORVQoKSwgJnNfaXB2NCwgJmlwdjQpICE9IFBKX1NVQ0NFU1MpCisJICAgIHJldHVybiAtMjQ7CisKKwlwID0gKHVuc2lnbmVkIGNoYXIqKSZpcHY0OworCWlmIChwWzBdIT1BWzBdIHx8IHBbMV0hPUFbMV0gfHwgcFsyXSE9QVsyXSB8fCBwWzNdIT1BWzNdKSB7CisJICAgIHJldHVybiAtMjU7CisJfQorCisJaWYgKHBqX2luZXRfcHRvbihwal9BRl9JTkVUNigpLCAmc19pcHY2LCAmaXB2NikgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIC0yNjsKKworCXAgPSAodW5zaWduZWQgY2hhciopJmlwdjY7CisJaWYgKHBbMF0gIT0gMHhmZSB8fCBwWzFdICE9IDB4ODAgfHwgcFsyXSAhPSAwIHx8IHBbM10gIT0gMCB8fAorCSAgICBwWzRdICE9IDAgfHwgcFs1XSAhPSAwIHx8IHBbNl0gIT0gMCB8fCBwWzddICE9IDAgfHwKKwkgICAgcFs4XSAhPSAweDAyIHx8IHBbOV0gIT0gMHhmZiB8fCBwWzEwXSAhPSAweDgzIHx8IHBbMTFdICE9IDB4ZmYgfHwKKwkgICAgcFsxMl0hPTB4ZmUgfHwgcFsxM10hPTB4N2MgfHwgcFsxNF0gIT0gMHg4YiB8fCBwWzE1XSE9MHg0MikKKwl7CisJICAgIHJldHVybiAtMjc7CisJfQorCisJaWYgKHBqX2luZXRfbnRvcChwal9BRl9JTkVUKCksICZpcHY0LCBidWZfaXB2NCwgc2l6ZW9mKGJ1Zl9pcHY0KSkgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIC0yODsKKwlpZiAocGpfc3RyaWNtcDIoJnNfaXB2NCwgYnVmX2lwdjQpICE9IDApCisJICAgIHJldHVybiAtMjk7CisKKwlpZiAocGpfaW5ldF9udG9wKHBqX0FGX0lORVQ2KCksICZpcHY2LCBidWZfaXB2Niwgc2l6ZW9mKGJ1Zl9pcHY2KSkgIT0gUEpfU1VDQ0VTUykKKwkgICAgcmV0dXJuIC0zMDsKKwlpZiAocGpfc3RyaWNtcDIoJnNfaXB2NiwgYnVmX2lwdjYpICE9IDApCisJICAgIHJldHVybiAtMzE7CisgICAgfQorCisjZW5kaWYJLyogUEpfSEFTX0lQVjYgKi8KKworICAgIC8qIFRlc3QgdGhhdCBwal9zb2NrYWRkcl9pbl9pbml0KCkgaW5pdGlhbGl6ZSB0aGUgd2hvbGUgc3RydWN0dXJlLCAKKyAgICAgKiBpbmNsdWRpbmcgc2luX3plcm8uCisgICAgICovCisgICAgcGpfc29ja2FkZHJfaW5faW5pdCgmYWRkcjIsIDAsIDEwMDApOworICAgIHBqX2J6ZXJvKHplcm8sIHNpemVvZih6ZXJvKSk7CisgICAgaWYgKHBqX21lbWNtcChhZGRyMi5zaW5femVybywgemVybywgc2l6ZW9mKGFkZHIyLnNpbl96ZXJvKSkgIT0gMCkKKwlyZXR1cm4gLTM1OworCisgICAgLyogcGpfZ2V0aG9zdG5hbWUoKSAqLworICAgIGhvc3RuYW1lID0gcGpfZ2V0aG9zdG5hbWUoKTsKKyAgICBpZiAoIWhvc3RuYW1lIHx8ICFob3N0bmFtZS0+cHRyIHx8ICFob3N0bmFtZS0+c2xlbikKKwlyZXR1cm4gLTQwOworCisgICAgUEpfTE9HKDMsKCJ0ZXN0IiwgIi4uLi5ob3N0bmFtZSBpcyAlLipzIiwgCisJICAgICAgKGludClob3N0bmFtZS0+c2xlbiwgaG9zdG5hbWUtPnB0cikpOworCisgICAgLyogcGpfZ2V0aG9zdGFkZHIoKSAqLworCisgICAgLyogVmFyaW91cyBjb25zdGFudHMgKi8KKyNpZiAhZGVmaW5lZChQSl9TWU1CSUFOKSB8fCBQSl9TWU1CSUFOPT0wCisgICAgaWYgKFBKX0FGX0lORVQ9PTB4RkZGRikgcmV0dXJuIC01NTAwOworICAgIGlmIChQSl9BRl9JTkVUNj09MHhGRkZGKSByZXR1cm4gLTU1MDE7CisgICAgCisgICAgLyogMHhGRkZGIGNvdWxkIGJlIGEgdmFsaWQgU09MX1NPQ0tFVCAoZS5nOiBvbiBzb21lIFdpbiBvciBNYWMpICovCisgICAgLy9pZiAoUEpfU09MX1NPQ0tFVD09MHhGRkZGKSByZXR1cm4gLTU1MDM7CisgICAgCisgICAgaWYgKFBKX1NPTF9JUD09MHhGRkZGKSByZXR1cm4gLTU1MDI7CisgICAgaWYgKFBKX1NPTF9UQ1A9PTB4RkZGRikgcmV0dXJuIC01NTEwOworICAgIGlmIChQSl9TT0xfVURQPT0weEZGRkYpIHJldHVybiAtNTUyMDsKKyAgICBpZiAoUEpfU09MX0lQVjY9PTB4RkZGRikgcmV0dXJuIC01NTMwOworCisgICAgaWYgKFBKX1NPX1RZUEU9PTB4RkZGRikgcmV0dXJuIC01NTQwOworICAgIGlmIChQSl9TT19SQ1ZCVUY9PTB4RkZGRikgcmV0dXJuIC01NTUwOworICAgIGlmIChQSl9TT19TTkRCVUY9PTB4RkZGRikgcmV0dXJuIC01NTYwOworICAgIGlmIChQSl9UQ1BfTk9ERUxBWT09MHhGRkZGKSByZXR1cm4gLTU1NzA7CisgICAgaWYgKFBKX1NPX1JFVVNFQUREUj09MHhGRkZGKSByZXR1cm4gLTU1ODA7CisKKyAgICBpZiAoUEpfTVNHX09PQj09MHhGRkZGKSByZXR1cm4gLTU1OTA7CisgICAgaWYgKFBKX01TR19QRUVLPT0weEZGRkYpIHJldHVybiAtNTYwMDsKKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdGVzdCh2b2lkKQoreworI2RlZmluZSBJUHY0CTEKKyNkZWZpbmUgSVB2NgkyCisKKyAgICBzdHJ1Y3QgdGVzdF90IHsKKwljb25zdCBjaGFyICAqaW5wdXQ7CisJaW50CSAgICAgcmVzdWx0X2FmOworCWNvbnN0IGNoYXIgICpyZXN1bHRfaXA7CisJcGpfdWludDE2X3QgIHJlc3VsdF9wb3J0OworICAgIH07CisgICAgc3RydWN0IHRlc3RfdCB2YWxpZF90ZXN0c1tdID0gCisgICAgeworCS8qIElQdjQgKi8KKwl7ICIxMC4wLjAuMTo4MCIsIElQdjQsICIxMC4wLjAuMSIsIDgwfSwKKwl7ICIxMC4wLjAuMSIsIElQdjQsICIxMC4wLjAuMSIsIDB9LAorCXsgIjEwLjAuMC4xOiIsIElQdjQsICIxMC4wLjAuMSIsIDB9LAorCXsgIjEwLjAuMC4xOjAiLCBJUHY0LCAiMTAuMC4wLjEiLCAwfSwKKwl7ICI6ODAiLCBJUHY0LCAiMC4wLjAuMCIsIDgwfSwKKwl7ICI6IiwgSVB2NCwgIjAuMC4wLjAiLCAwfSwKKyNpZiAhUEpfU1lNQklBTgorCXsgImxvY2FsaG9zdCIsIElQdjQsICIxMjcuMC4wLjEiLCAwfSwKKwl7ICJsb2NhbGhvc3Q6IiwgSVB2NCwgIjEyNy4wLjAuMSIsIDB9LAorCXsgImxvY2FsaG9zdDo4MCIsIElQdjQsICIxMjcuMC4wLjEiLCA4MH0sCisjZW5kaWYKKworI2lmIGRlZmluZWQoUEpfSEFTX0lQVjYpICYmIFBKX0hBU19JUFY2CisJeyAiZmU6OjAxOjgwIiwgSVB2NiwgImZlOjowMTo4MCIsIDB9LAorCXsgIltmZTo6MDFdOjgwIiwgSVB2NiwgImZlOjowMSIsIDgwfSwKKwl7ICJmZTo6MDEiLCBJUHY2LCAiZmU6OjAxIiwgMH0sCisJeyAiW2ZlOjowMV0iLCBJUHY2LCAiZmU6OjAxIiwgMH0sCisJeyAiZmU6OjAxOiIsIElQdjYsICJmZTo6MDEiLCAwfSwKKwl7ICJbZmU6OjAxXToiLCBJUHY2LCAiZmU6OjAxIiwgMH0sCisJeyAiOjoiLCBJUHY2LCAiOjowIiwgMH0sCisJeyAiWzo6XSIsIElQdjYsICI6OiIsIDB9LAorCXsgIjo6OiIsIElQdjYsICI6OiIsIDB9LAorCXsgIls6Ol06IiwgSVB2NiwgIjo6IiwgMH0sCisJeyAiOjo6ODAiLCBJUHY2LCAiOjoiLCA4MH0sCisJeyAiWzo6XTo4MCIsIElQdjYsICI6OiIsIDgwfSwKKyNlbmRpZgorICAgIH07CisgICAgc3RydWN0IHRlc3RfdCBpbnZhbGlkX3Rlc3RzW10gPSAKKyAgICB7CisJLyogSVB2NCAqLworCXsgIjEwLjAuMC4xOmFiY2QiLCBJUHY0fSwgICAvKiBwb3J0IG5vdCBudW1lcmljICovCisJeyAiMTAuMC4wLjE6LTEiLCBJUHY0fSwJICAgIC8qIHBvcnQgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXIgKi8KKwl7ICIxMC4wLjAuMToxMjM0NTYiLCBJUHY0fSwgLyogcG9ydCB0b28gYmlnCSovCisJeyAiMS4yLjMuNC41OjgwIiwgSVB2NH0sICAgIC8qIGludmFsaWQgSVAgKi8KKwl7ICIxMDowOjgwIiwgSVB2NH0sCSAgICAvKiBob3N0bmFtZSBoYXMgY29sb24gKi8KKworI2lmIGRlZmluZWQoUEpfSEFTX0lQVjYpICYmIFBKX0hBU19JUFY2CisJeyAiW2ZlOjowMV06YWJjZCIsIElQdjZ9LCAgIC8qIHBvcnQgbm90IG51bWVyaWMgKi8KKwl7ICJbZmU6OjAxXTotMSIsIElQdjZ9LAkgICAgLyogcG9ydCBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlciAqLworCXsgIltmZTo6MDFdOjEyMzQ1NiIsIElQdjZ9LCAvKiBwb3J0IHRvbyBiaWcJKi8KKwl7ICJmZTo6MDE6MDI6OjAzOjA0OjgwIiwgSVB2Nn0sCSAgICAvKiBpbnZhbGlkIElQICovCisJeyAiW2ZlOjowMTowMjo6MDM6MDRdOjgwIiwgSVB2Nn0sICAgLyogaW52YWxpZCBJUCAqLworCXsgIltmZTowMSIsIElQdjZ9LAkgICAgLyogVW50ZXJtaW5hdGVkIGJyYWNrZXQgKi8KKyNlbmRpZgorICAgIH07CisKKyAgICB1bnNpZ25lZCBpOworCisgICAgUEpfTE9HKDMsKCJ0ZXN0IiwgIi4uLklQIGFkZHJlc3MgcGFyc2luZyIpKTsKKworICAgIGZvciAoaT0wOyBpPFBKX0FSUkFZX1NJWkUodmFsaWRfdGVzdHMpOyArK2kpIHsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisJcGpfc3RyX3QgaW5wdXQ7CisJcGpfc29ja2FkZHIgYWRkciwgcmVzdWx0OworCisJc3dpdGNoICh2YWxpZF90ZXN0c1tpXS5yZXN1bHRfYWYpIHsKKwljYXNlIElQdjQ6CisJICAgIHZhbGlkX3Rlc3RzW2ldLnJlc3VsdF9hZiA9IFBKX0FGX0lORVQ7CisJICAgIGJyZWFrOworCWNhc2UgSVB2NjoKKwkgICAgdmFsaWRfdGVzdHNbaV0ucmVzdWx0X2FmID0gUEpfQUZfSU5FVDY7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHBqX2Fzc2VydCghIkludmFsaWQgQUYhIik7CisJICAgIGNvbnRpbnVlOworCX0KKworCS8qIFRyeSBwYXJzaW5nIHdpdGggUEpfQUZfVU5TUEVDICovCisJc3RhdHVzID0gcGpfc29ja2FkZHJfcGFyc2UoUEpfQUZfVU5TUEVDLCAwLCAKKwkJCQkgICBwal9jc3RyKCZpbnB1dCwgdmFsaWRfdGVzdHNbaV0uaW5wdXQpLCAKKwkJCQkgICAmYWRkcik7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIFBKX0xPRygxLCgidGVzdCIsICIuLi4uIGZhaWxlZCB3aGVuIHBhcnNpbmcgJXMgKGk9JWQpIiwgCisJCSAgICAgIHZhbGlkX3Rlc3RzW2ldLmlucHV0LCBpKSk7CisJICAgIHJldHVybiAtMTA7CisJfQorCisJLyogQ2hlY2sgInNpbl9sZW4iIG1lbWJlciBvZiBwYXJzZSByZXN1bHQgKi8KKwlDSEVDS19TQV9aRVJPX0xFTigmYWRkciwgLTIwKTsKKworCS8qIEJ1aWxkIHRoZSBjb3JyZWN0IHJlc3VsdCAqLworCXN0YXR1cyA9IHBqX3NvY2thZGRyX2luaXQodmFsaWRfdGVzdHNbaV0ucmVzdWx0X2FmLAorCQkJCSAgJnJlc3VsdCwKKwkJCQkgIHBqX2NzdHIoJmlucHV0LCB2YWxpZF90ZXN0c1tpXS5yZXN1bHRfaXApLCAKKwkJCQkgIHZhbGlkX3Rlc3RzW2ldLnJlc3VsdF9wb3J0KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgUEpfTE9HKDEsKCJ0ZXN0IiwgIi4uLi4gZXJyb3IgYnVpbGRpbmcgSVAgYWRkcmVzcyAlcyIsIAorCQkgICAgICB2YWxpZF90ZXN0c1tpXS5pbnB1dCkpOworCSAgICByZXR1cm4gLTMwOworCX0KKworCS8qIENvbXBhcmUgdGhlIHJlc3VsdCAqLworCWlmIChwal9zb2NrYWRkcl9jbXAoJmFkZHIsICZyZXN1bHQpICE9IDApIHsKKwkgICAgUEpfTE9HKDEsKCJ0ZXN0IiwgIi4uLi4gcGFyc2VkIHJlc3VsdCBtaXNtYXRjaGVkIGZvciAlcyIsIAorCQkgICAgICB2YWxpZF90ZXN0c1tpXS5pbnB1dCkpOworCSAgICByZXR1cm4gLTQwOworCX0KKworCS8qIFBhcnNlIGFnYWluIHdpdGggdGhlIHNwZWNpZmllZCBhZiAqLworCXN0YXR1cyA9IHBqX3NvY2thZGRyX3BhcnNlKHZhbGlkX3Rlc3RzW2ldLnJlc3VsdF9hZiwgMCwgCisJCQkJICAgcGpfY3N0cigmaW5wdXQsIHZhbGlkX3Rlc3RzW2ldLmlucHV0KSwgCisJCQkJICAgJmFkZHIpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBQSl9MT0coMSwoInRlc3QiLCAiLi4uLiBmYWlsZWQgd2hlbiBwYXJzaW5nICVzIiwgCisJCSAgICAgIHZhbGlkX3Rlc3RzW2ldLmlucHV0KSk7CisJICAgIHJldHVybiAtNTA7CisJfQorCisJLyogQ2hlY2sgInNpbl9sZW4iIG1lbWJlciBvZiBwYXJzZSByZXN1bHQgKi8KKwlDSEVDS19TQV9aRVJPX0xFTigmYWRkciwgLTU1KTsKKworCS8qIENvbXBhcmUgdGhlIHJlc3VsdCBhZ2FpbiAqLworCWlmIChwal9zb2NrYWRkcl9jbXAoJmFkZHIsICZyZXN1bHQpICE9IDApIHsKKwkgICAgUEpfTE9HKDEsKCJ0ZXN0IiwgIi4uLi4gcGFyc2VkIHJlc3VsdCBtaXNtYXRjaGVkIGZvciAlcyIsIAorCQkgICAgICB2YWxpZF90ZXN0c1tpXS5pbnB1dCkpOworCSAgICByZXR1cm4gLTYwOworCX0KKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxQSl9BUlJBWV9TSVpFKGludmFsaWRfdGVzdHMpOyArK2kpIHsKKwlwal9zdGF0dXNfdCBzdGF0dXM7CisJcGpfc3RyX3QgaW5wdXQ7CisJcGpfc29ja2FkZHIgYWRkcjsKKworCXN3aXRjaCAoaW52YWxpZF90ZXN0c1tpXS5yZXN1bHRfYWYpIHsKKwljYXNlIElQdjQ6CisJICAgIGludmFsaWRfdGVzdHNbaV0ucmVzdWx0X2FmID0gUEpfQUZfSU5FVDsKKwkgICAgYnJlYWs7CisJY2FzZSBJUHY2OgorCSAgICBpbnZhbGlkX3Rlc3RzW2ldLnJlc3VsdF9hZiA9IFBKX0FGX0lORVQ2OworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBwal9hc3NlcnQoISJJbnZhbGlkIEFGISIpOworCSAgICBjb250aW51ZTsKKwl9CisKKwkvKiBUcnkgcGFyc2luZyB3aXRoIFBKX0FGX1VOU1BFQyAqLworCXN0YXR1cyA9IHBqX3NvY2thZGRyX3BhcnNlKFBKX0FGX1VOU1BFQywgMCwgCisJCQkJICAgcGpfY3N0cigmaW5wdXQsIGludmFsaWRfdGVzdHNbaV0uaW5wdXQpLCAKKwkJCQkgICAmYWRkcik7CisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJICAgIFBKX0xPRygxLCgidGVzdCIsICIuLi4uIGV4cGVjdGluZyBmYWlsdXJlIHdoZW4gcGFyc2luZyAlcyIsIAorCQkgICAgICBpbnZhbGlkX3Rlc3RzW2ldLmlucHV0KSk7CisJICAgIHJldHVybiAtMTAwOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXJpdHlfdGVzdCh2b2lkKQoreworICAgIFBKX0xPRygzLCgidGVzdCIsICIuLi5wdXJpdHlfdGVzdCgpIikpOworCisjaWYgZGVmaW5lZChQSl9TT0NLQUREUl9IQVNfTEVOKSAmJiBQSl9TT0NLQUREUl9IQVNfTEVOIT0wCisgICAgLyogQ2hlY2sgb24gInNpbl9sZW4iIG1lbWJlciBvZiBzb2NrYWRkciAqLworICAgIHsKKwljb25zdCBwal9zdHJfdCBzdHJfaXAgPSB7IjEuMS4xLjEiLCA3fTsKKwlwal9zb2NrYWRkciBhZGRyWzE2XTsKKwlwal9hZGRyaW5mbyBhaVsxNl07CisJdW5zaWduZWQgY250OworCXBqX3N0YXR1c190IHJjOworCisJLyogcGpfZW51bV9pcF9pbnRlcmZhY2UoKSAqLworCWNudCA9IFBKX0FSUkFZX1NJWkUoYWRkcik7CisJcmMgPSBwal9lbnVtX2lwX2ludGVyZmFjZShwal9BRl9VTlNQRUMoKSwgJmNudCwgYWRkcik7CisJaWYgKHJjID09IFBKX1NVQ0NFU1MpIHsKKwkgICAgd2hpbGUgKGNudC0tKQorCQlDSEVDS19TQV9aRVJPX0xFTigmYWRkcltjbnRdLCAtMTApOworCX0KKworCS8qIHBqX2dldGhvc3RpcCgpIG9uIElQdjQgKi8KKwlyYyA9IHBqX2dldGhvc3RpcChwal9BRl9JTkVUKCksICZhZGRyWzBdKTsKKwlpZiAocmMgPT0gUEpfU1VDQ0VTUykKKwkgICAgQ0hFQ0tfU0FfWkVST19MRU4oJmFkZHJbMF0sIC0yMCk7CisKKwkvKiBwal9nZXRob3N0aXAoKSBvbiBJUHY2ICovCisJcmMgPSBwal9nZXRob3N0aXAocGpfQUZfSU5FVDYoKSwgJmFkZHJbMF0pOworCWlmIChyYyA9PSBQSl9TVUNDRVNTKQorCSAgICBDSEVDS19TQV9aRVJPX0xFTigmYWRkclswXSwgLTMwKTsKKworCS8qIHBqX2dldGRlZmF1bHRpcGludGVyZmFjZSgpIG9uIElQdjQgKi8KKwlyYyA9IHBqX2dldGRlZmF1bHRpcGludGVyZmFjZShwal9BRl9JTkVUKCksICZhZGRyWzBdKTsKKwlpZiAocmMgPT0gUEpfU1VDQ0VTUykKKwkgICAgQ0hFQ0tfU0FfWkVST19MRU4oJmFkZHJbMF0sIC00MCk7CisKKwkvKiBwal9nZXRkZWZhdWx0aXBpbnRlcmZhY2UoKSBvbiBJUHY2ICovCisJcmMgPSBwal9nZXRkZWZhdWx0aXBpbnRlcmZhY2UocGpfQUZfSU5FVDYoKSwgJmFkZHJbMF0pOworCWlmIChyYyA9PSBQSl9TVUNDRVNTKQorCSAgICBDSEVDS19TQV9aRVJPX0xFTigmYWRkclswXSwgLTUwKTsKKworCS8qIHBqX2dldGFkZHJpbmZvKCkgb24gYSBob3N0IG5hbWUgKi8KKwljbnQgPSBQSl9BUlJBWV9TSVpFKGFpKTsKKwlyYyA9IHBqX2dldGFkZHJpbmZvKHBqX0FGX1VOU1BFQygpLCBwal9nZXRob3N0bmFtZSgpLCAmY250LCBhaSk7CisJaWYgKHJjID09IFBKX1NVQ0NFU1MpIHsKKwkgICAgd2hpbGUgKGNudC0tKQorCQlDSEVDS19TQV9aRVJPX0xFTigmYWlbY250XS5haV9hZGRyLCAtNjApOworCX0KKworCS8qIHBqX2dldGFkZHJpbmZvKCkgb24gYW4gSVAgYWRkcmVzcyAqLworCWNudCA9IFBKX0FSUkFZX1NJWkUoYWkpOworCXJjID0gcGpfZ2V0YWRkcmluZm8ocGpfQUZfVU5TUEVDKCksICZzdHJfaXAsICZjbnQsIGFpKTsKKwlpZiAocmMgPT0gUEpfU1VDQ0VTUykgeworCSAgICBwal9hc3NlcnQoY250ID09IDEpOworCSAgICBDSEVDS19TQV9aRVJPX0xFTigmYWlbMF0uYWlfYWRkciwgLTcwKTsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaW1wbGVfc29ja190ZXN0KHZvaWQpCit7CisgICAgaW50IHR5cGVzWzJdOworICAgIHBqX3NvY2tfdCBzb2NrOworICAgIGludCBpOworICAgIHBqX3N0YXR1c190IHJjID0gUEpfU1VDQ0VTUzsKKworICAgIHR5cGVzWzBdID0gcGpfU09DS19TVFJFQU0oKTsKKyAgICB0eXBlc1sxXSA9IHBqX1NPQ0tfREdSQU0oKTsKKworICAgIFBKX0xPRygzLCgidGVzdCIsICIuLi5zaW1wbGVfc29ja190ZXN0KCkiKSk7CisKKyAgICBmb3IgKGk9MDsgaTwoaW50KShzaXplb2YodHlwZXMpL3NpemVvZih0eXBlc1swXSkpOyArK2kpIHsKKwkKKwlyYyA9IHBqX3NvY2tfc29ja2V0KHBqX0FGX0lORVQoKSwgdHlwZXNbaV0sIDAsICZzb2NrKTsKKwlpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBhcHBfcGVycm9yKCIuLi5lcnJvcjogdW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQiLCByYyk7CisJICAgIGJyZWFrOworCX0gZWxzZSB7CisJICAgIHJjID0gcGpfc29ja19jbG9zZShzb2NrKTsKKwkgICAgaWYgKHJjICE9IDApIHsKKwkJYXBwX3BlcnJvcigiLi4uZXJyb3I6IGNsb3NlIHNvY2tldCIsIHJjKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IHNlbmRfcmVjdl90ZXN0KGludCBzb2NrX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3NvY2tfdCBzcywgcGpfc29ja190IGNzLAorCQkJICBwal9zb2NrYWRkcl9pbiAqZHN0YWRkciwgcGpfc29ja2FkZHJfaW4gKnNyY2FkZHIsIAorCQkJICBpbnQgYWRkcmxlbikKK3sKKyAgICBlbnVtIHsgREFUQV9MRU4gPSAxNiB9OworICAgIGNoYXIgc2VuZGRhdGFbREFUQV9MRU4rNF0sIHJlY3ZkYXRhW0RBVEFfTEVOKzRdOworICAgIHBqX3NzaXplX3Qgc2VudCwgcmVjZWl2ZWQsIHRvdGFsX3JlY2VpdmVkOworICAgIHBqX3N0YXR1c190IHJjOworCisgICAgVFJBQ0VfKCgidGVzdCIsICIuLi4uY3JlYXRlX3JhbmRvbV9zdHJpbmcoKSIpKTsKKyAgICBwal9jcmVhdGVfcmFuZG9tX3N0cmluZyhzZW5kZGF0YSwgREFUQV9MRU4pOworICAgIHNlbmRkYXRhW0RBVEFfTEVOLTFdID0gJ1wwJzsKKworICAgIC8qCisgICAgICogVGVzdCBzZW5kL3JlY3Ygc21hbGwgZGF0YS4KKyAgICAgKi8KKyAgICBUUkFDRV8oKCJ0ZXN0IiwgIi4uLi5zZW5kdG8oKSIpKTsKKyAgICBpZiAoZHN0YWRkcikgeworICAgICAgICBzZW50ID0gREFUQV9MRU47CisJcmMgPSBwal9zb2NrX3NlbmR0byhjcywgc2VuZGRhdGEsICZzZW50LCAwLCBkc3RhZGRyLCBhZGRybGVuKTsKKwlpZiAocmMgIT0gUEpfU1VDQ0VTUyB8fCBzZW50ICE9IERBVEFfTEVOKSB7CisJICAgIGFwcF9wZXJyb3IoIi4uLnNlbmR0byBlcnJvciIsIHJjKTsKKwkgICAgcmMgPSAtMTQwOyBnb3RvIG9uX2Vycm9yOworCX0KKyAgICB9IGVsc2UgeworICAgICAgICBzZW50ID0gREFUQV9MRU47CisJcmMgPSBwal9zb2NrX3NlbmQoY3MsIHNlbmRkYXRhLCAmc2VudCwgMCk7CisJaWYgKHJjICE9IFBKX1NVQ0NFU1MgfHwgc2VudCAhPSBEQVRBX0xFTikgeworCSAgICBhcHBfcGVycm9yKCIuLi5zZW5kIGVycm9yIiwgcmMpOworCSAgICByYyA9IC0xNDU7IGdvdG8gb25fZXJyb3I7CisJfQorICAgIH0KKworICAgIFRSQUNFXygoInRlc3QiLCAiLi4uLnJlY3YoKSIpKTsKKyAgICBpZiAoc3JjYWRkcikgeworCXBqX3NvY2thZGRyX2luIGFkZHI7CisJaW50IHNyY2xlbiA9IHNpemVvZihhZGRyKTsKKwkKKwlwal9iemVybygmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKworICAgICAgICByZWNlaXZlZCA9IERBVEFfTEVOOworCXJjID0gcGpfc29ja19yZWN2ZnJvbShzcywgcmVjdmRhdGEsICZyZWNlaXZlZCwgMCwgJmFkZHIsICZzcmNsZW4pOworCWlmIChyYyAhPSBQSl9TVUNDRVNTIHx8IHJlY2VpdmVkICE9IERBVEFfTEVOKSB7CisJICAgIGFwcF9wZXJyb3IoIi4uLnJlY3Zmcm9tIGVycm9yIiwgcmMpOworCSAgICByYyA9IC0xNTA7IGdvdG8gb25fZXJyb3I7CisJfQorCWlmIChzcmNsZW4gIT0gYWRkcmxlbikKKwkgICAgcmV0dXJuIC0xNTE7CisJaWYgKHBqX3NvY2thZGRyX2NtcCgmYWRkciwgc3JjYWRkcikgIT0gMCkgeworCSAgICBjaGFyIHNyY2FkZHJfc3RyWzMyXSwgYWRkcl9zdHJbMzJdOworCSAgICBzdHJjcHkoc3JjYWRkcl9zdHIsIHBqX2luZXRfbnRvYShzcmNhZGRyLT5zaW5fYWRkcikpOworCSAgICBzdHJjcHkoYWRkcl9zdHIsIHBqX2luZXRfbnRvYShhZGRyLnNpbl9hZGRyKSk7CisJICAgIFBKX0xPRygzLCgidGVzdCIsICIuLi5lcnJvcjogc3JjIGFkZHJlc3MgbWlzbWF0Y2ggKG9yaWdpbmFsPSVzLCAiCisJCQkgICAgICAicmVjdmZyb20gYWRkcj0lcykiLCAKKwkJCSAgICAgIHNyY2FkZHJfc3RyLCBhZGRyX3N0cikpOworCSAgICByZXR1cm4gLTE1MjsKKwl9CisJCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUmVwZWF0IHJlY3YoKSB1bnRpbCBhbGwgZGF0YSBpcyByZWNlaXZlZC4KKyAgICAgICAgICogVGhpcyBhcHBsaWVzIG9ubHkgZm9yIG5vbi1VRFAgb2YgY291cnNlLCBzaW5jZSBmb3IgVURQCisgICAgICAgICAqIHdlIHdvdWxkIGV4cGVjdCBhbGwgZGF0YSB0byBiZSByZWNlaXZlZCBpbiBvbmUgcGFja2V0LgorICAgICAgICAgKi8KKyAgICAgICAgdG90YWxfcmVjZWl2ZWQgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICByZWNlaXZlZCA9IERBVEFfTEVOLXRvdGFsX3JlY2VpdmVkOworCSAgICByYyA9IHBqX3NvY2tfcmVjdihzcywgcmVjdmRhdGErdG90YWxfcmVjZWl2ZWQsICZyZWNlaXZlZCwgMCk7CisJICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJICAgICAgICBhcHBfcGVycm9yKCIuLi5yZWN2IGVycm9yIiwgcmMpOworCSAgICAgICAgcmMgPSAtMTU1OyBnb3RvIG9uX2Vycm9yOworCSAgICB9CisgICAgICAgICAgICBpZiAocmVjZWl2ZWQgPD0gMCkgeworICAgICAgICAgICAgICAgIFBKX0xPRygzLCgiIiwgIi4uLmVycm9yOiBzb2NrZXQgaGFzIGNsb3NlZCEgKHJlY2VpdmVkPSVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkKSk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTU2OyBnb3RvIG9uX2Vycm9yOworICAgICAgICAgICAgfQorCSAgICBpZiAocmVjZWl2ZWQgIT0gREFUQV9MRU4tdG90YWxfcmVjZWl2ZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc29ja190eXBlICE9IHBqX1NPQ0tfU1RSRUFNKCkpIHsKKwkgICAgICAgICAgICBQSl9MT0coMywoIiIsICIuLi5lcnJvcjogZXhwZWN0aW5nICV1IGJ5dGVzLCBnb3QgJXUgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9MRU4tdG90YWxfcmVjZWl2ZWQsIHJlY2VpdmVkKSk7CisJICAgICAgICAgICAgcmMgPSAtMTU3OyBnb3RvIG9uX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKwkgICAgfQorICAgICAgICAgICAgdG90YWxfcmVjZWl2ZWQgKz0gcmVjZWl2ZWQ7CisgICAgICAgIH0gd2hpbGUgKHRvdGFsX3JlY2VpdmVkIDwgREFUQV9MRU4pOworICAgIH0KKworICAgIFRSQUNFXygoInRlc3QiLCAiLi4uLm1lbWNtcCgpIikpOworICAgIGlmIChwal9tZW1jbXAoc2VuZGRhdGEsIHJlY3ZkYXRhLCBEQVRBX0xFTikgIT0gMCkgeworCVBKX0xPRygzLCgiIiwiLi4uZXJyb3I6IHJlY2VpdmVkIGRhdGEgbWlzbWF0Y2ggIgorCQkgICAgICIoZ290OiclcycgZXhwZWN0aW5nOiclcyciLAorCQkgICAgIHJlY3ZkYXRhLCBzZW5kZGF0YSkpOworCXJjID0gLTE2MDsgZ290byBvbl9lcnJvcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3Qgc2VuZC9yZWN2IGJpZyBkYXRhLgorICAgICAqLworICAgIFRSQUNFXygoInRlc3QiLCAiLi4uLnNlbmR0bygpIikpOworICAgIGlmIChkc3RhZGRyKSB7CisgICAgICAgIHNlbnQgPSBCSUdfREFUQV9MRU47CisJcmMgPSBwal9zb2NrX3NlbmR0byhjcywgYmlnZGF0YSwgJnNlbnQsIDAsIGRzdGFkZHIsIGFkZHJsZW4pOworCWlmIChyYyAhPSBQSl9TVUNDRVNTIHx8IHNlbnQgIT0gQklHX0RBVEFfTEVOKSB7CisJICAgIGFwcF9wZXJyb3IoIi4uLnNlbmR0byBlcnJvciIsIHJjKTsKKwkgICAgcmMgPSAtMTYxOyBnb3RvIG9uX2Vycm9yOworCX0KKyAgICB9IGVsc2UgeworICAgICAgICBzZW50ID0gQklHX0RBVEFfTEVOOworCXJjID0gcGpfc29ja19zZW5kKGNzLCBiaWdkYXRhLCAmc2VudCwgMCk7CisJaWYgKHJjICE9IFBKX1NVQ0NFU1MgfHwgc2VudCAhPSBCSUdfREFUQV9MRU4pIHsKKwkgICAgYXBwX3BlcnJvcigiLi4uc2VuZCBlcnJvciIsIHJjKTsKKwkgICAgcmMgPSAtMTY1OyBnb3RvIG9uX2Vycm9yOworCX0KKyAgICB9CisKKyAgICBUUkFDRV8oKCJ0ZXN0IiwgIi4uLi5yZWN2KCkiKSk7CisKKyAgICAvKiBSZXBlYXQgcmVjdigpIHVudGlsIGFsbCBkYXRhIGlzIHJlY2VpdmVkLgorICAgICAqIFRoaXMgYXBwbGllcyBvbmx5IGZvciBub24tVURQIG9mIGNvdXJzZSwgc2luY2UgZm9yIFVEUAorICAgICAqIHdlIHdvdWxkIGV4cGVjdCBhbGwgZGF0YSB0byBiZSByZWNlaXZlZCBpbiBvbmUgcGFja2V0LgorICAgICAqLworICAgIHRvdGFsX3JlY2VpdmVkID0gMDsKKyAgICBkbyB7CisgICAgICAgIHJlY2VpdmVkID0gQklHX0RBVEFfTEVOLXRvdGFsX3JlY2VpdmVkOworCXJjID0gcGpfc29ja19yZWN2KHNzLCBiaWdidWZmZXIrdG90YWxfcmVjZWl2ZWQsICZyZWNlaXZlZCwgMCk7CisJaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcigiLi4ucmVjdiBlcnJvciIsIHJjKTsKKwkgICAgcmMgPSAtMTcwOyBnb3RvIG9uX2Vycm9yOworCX0KKyAgICAgICAgaWYgKHJlY2VpdmVkIDw9IDApIHsKKyAgICAgICAgICAgIFBKX0xPRygzLCgiIiwgIi4uLmVycm9yOiBzb2NrZXQgaGFzIGNsb3NlZCEgKHJlY2VpdmVkPSVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQpKTsKKyAgICAgICAgICAgIHJjID0gLTE3MzsgZ290byBvbl9lcnJvcjsKKyAgICAgICAgfQorCWlmIChyZWNlaXZlZCAhPSBCSUdfREFUQV9MRU4tdG90YWxfcmVjZWl2ZWQpIHsKKyAgICAgICAgICAgIGlmIChzb2NrX3R5cGUgIT0gcGpfU09DS19TVFJFQU0oKSkgeworCSAgICAgICAgUEpfTE9HKDMsKCIiLCAiLi4uZXJyb3I6IGV4cGVjdGluZyAldSBieXRlcywgZ290ICV1IGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQklHX0RBVEFfTEVOLXRvdGFsX3JlY2VpdmVkLCByZWNlaXZlZCkpOworCSAgICAgICAgcmMgPSAtMTc2OyBnb3RvIG9uX2Vycm9yOworICAgICAgICAgICAgfQorCX0KKyAgICAgICAgdG90YWxfcmVjZWl2ZWQgKz0gcmVjZWl2ZWQ7CisgICAgfSB3aGlsZSAodG90YWxfcmVjZWl2ZWQgPCBCSUdfREFUQV9MRU4pOworCisgICAgVFJBQ0VfKCgidGVzdCIsICIuLi4ubWVtY21wKCkiKSk7CisgICAgaWYgKHBqX21lbWNtcChiaWdkYXRhLCBiaWdidWZmZXIsIEJJR19EQVRBX0xFTikgIT0gMCkgeworICAgICAgICBQSl9MT0coMywoIiIsICIuLi5lcnJvcjogcmVjZWl2ZWQgZGF0YSBoYXMgYmVlbiBhbHRlcmVkISIpKTsKKwlyYyA9IC0xODA7IGdvdG8gb25fZXJyb3I7CisgICAgfQorICAgIAorICAgIHJjID0gMDsKKworb25fZXJyb3I6CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHVkcF90ZXN0KHZvaWQpCit7CisgICAgcGpfc29ja190IGNzID0gUEpfSU5WQUxJRF9TT0NLRVQsIHNzID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgcGpfc29ja2FkZHJfaW4gZHN0YWRkciwgc3JjYWRkcjsKKyAgICBwal9zdHJfdCBzOworICAgIHBqX3N0YXR1c190IHJjID0gMCwgcmV0dmFsOworCisgICAgUEpfTE9HKDMsKCJ0ZXN0IiwgIi4uLnVkcF90ZXN0KCkiKSk7CisKKyAgICByYyA9IHBqX3NvY2tfc29ja2V0KHBqX0FGX0lORVQoKSwgcGpfU09DS19ER1JBTSgpLCAwLCAmc3MpOworICAgIGlmIChyYyAhPSAwKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHVuYWJsZSB0byBjcmVhdGUgc29ja2V0IiwgcmMpOworCXJldHVybiAtMTAwOworICAgIH0KKworICAgIHJjID0gcGpfc29ja19zb2NrZXQocGpfQUZfSU5FVCgpLCBwal9TT0NLX0RHUkFNKCksIDAsICZjcyk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIC0xMTA7CisKKyAgICAvKiBCaW5kIHNlcnZlciBzb2NrZXQuICovCisgICAgcGpfYnplcm8oJmRzdGFkZHIsIHNpemVvZihkc3RhZGRyKSk7CisgICAgZHN0YWRkci5zaW5fZmFtaWx5ID0gcGpfQUZfSU5FVCgpOworICAgIGRzdGFkZHIuc2luX3BvcnQgPSBwal9odG9ucyhVRFBfUE9SVCk7CisgICAgZHN0YWRkci5zaW5fYWRkciA9IHBqX2luZXRfYWRkcihwal9jc3RyKCZzLCBBRERSRVNTKSk7CisgICAgCisgICAgaWYgKChyYz1wal9zb2NrX2JpbmQoc3MsICZkc3RhZGRyLCBzaXplb2YoZHN0YWRkcikpKSAhPSAwKSB7CisJYXBwX3BlcnJvcigiLi4uYmluZCBlcnJvciB1ZHA6IkFERFJFU1MsIHJjKTsKKwlyYyA9IC0xMjA7IGdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLyogQmluZCBjbGllbnQgc29ja2V0LiAqLworICAgIHBqX2J6ZXJvKCZzcmNhZGRyLCBzaXplb2Yoc3JjYWRkcikpOworICAgIHNyY2FkZHIuc2luX2ZhbWlseSA9IHBqX0FGX0lORVQoKTsKKyAgICBzcmNhZGRyLnNpbl9wb3J0ID0gcGpfaHRvbnMoVURQX1BPUlQtMSk7CisgICAgc3JjYWRkci5zaW5fYWRkciA9IHBqX2luZXRfYWRkcihwal9jc3RyKCZzLCBBRERSRVNTKSk7CisKKyAgICBpZiAoKHJjPXBqX3NvY2tfYmluZChjcywgJnNyY2FkZHIsIHNpemVvZihzcmNhZGRyKSkpICE9IDApIHsKKwlhcHBfcGVycm9yKCIuLi5iaW5kIGVycm9yIiwgcmMpOworCXJjID0gLTEyMTsgZ290byBvbl9lcnJvcjsKKyAgICB9CisJICAgIAorICAgIC8qIFRlc3Qgc2VuZC9yZWN2LCB3aXRoIHNlbmR0byAqLworICAgIHJjID0gc2VuZF9yZWN2X3Rlc3QocGpfU09DS19ER1JBTSgpLCBzcywgY3MsICZkc3RhZGRyLCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkc3RhZGRyKSk7CisgICAgaWYgKHJjICE9IDApCisJZ290byBvbl9lcnJvcjsKKworICAgIC8qIFRlc3Qgc2VuZC9yZWN2LCB3aXRoIHNlbmR0byBhbmQgcmVjdmZyb20gKi8KKyAgICByYyA9IHNlbmRfcmVjdl90ZXN0KHBqX1NPQ0tfREdSQU0oKSwgc3MsIGNzLCAmZHN0YWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAmc3JjYWRkciwgc2l6ZW9mKGRzdGFkZHIpKTsKKyAgICBpZiAocmMgIT0gMCkKKwlnb3RvIG9uX2Vycm9yOworCisgICAgLyogRGlzYWJsZSB0aGlzIHRlc3Qgb24gU3ltYmlhbiBzaW5jZSBVRFAgY29ubmVjdCgpL3NlbmQoKSBmYWlsZWQKKyAgICAgKiB3aXRoIFM2MCAzcmQgZWRpdGlvbiAoaW5jbHVkaW5nIE1SMikuCisgICAgICogU2VlIGh0dHA6Ly93d3cucGpzaXAub3JnL3RyYWMvdGlja2V0LzI2NAorICAgICAqLyAgICAKKyNpZiAhZGVmaW5lZChQSl9TWU1CSUFOKSB8fCBQSl9TWU1CSUFOPT0wCisgICAgLyogY29ubmVjdCgpIHRoZSBzb2NrZXRzLiAqLworICAgIHJjID0gcGpfc29ja19jb25uZWN0KGNzLCAmZHN0YWRkciwgc2l6ZW9mKGRzdGFkZHIpKTsKKyAgICBpZiAocmMgIT0gMCkgeworCWFwcF9wZXJyb3IoIi4uLmNvbm5lY3QoKSBlcnJvciIsIHJjKTsKKwlyYyA9IC0xMjI7IGdvdG8gb25fZXJyb3I7CisgICAgfQorCisgICAgLyogVGVzdCBzZW5kL3JlY3Ygd2l0aCBzZW5kKCkgKi8KKyAgICByYyA9IHNlbmRfcmVjdl90ZXN0KHBqX1NPQ0tfREdSQU0oKSwgc3MsIGNzLCBOVUxMLCBOVUxMLCAwKTsKKyAgICBpZiAocmMgIT0gMCkKKwlnb3RvIG9uX2Vycm9yOworCisgICAgLyogVGVzdCBzZW5kL3JlY3Ygd2l0aCBzZW5kKCkgYW5kIHJlY3Zmcm9tICovCisgICAgcmMgPSBzZW5kX3JlY3ZfdGVzdChwal9TT0NLX0RHUkFNKCksIHNzLCBjcywgTlVMTCwgJnNyY2FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNyY2FkZHIpKTsKKyAgICBpZiAocmMgIT0gMCkKKwlnb3RvIG9uX2Vycm9yOworI2VuZGlmCisKK29uX2Vycm9yOgorICAgIHJldHZhbCA9IHJjOworICAgIGlmIChjcyAhPSBQSl9JTlZBTElEX1NPQ0tFVCkgeworICAgICAgICByYyA9IHBqX3NvY2tfY2xvc2UoY3MpOworICAgICAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3IgaW4gY2xvc2luZyBzb2NrZXQiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLTEwMDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNzICE9IFBKX0lOVkFMSURfU09DS0VUKSB7CisgICAgICAgIHJjID0gcGpfc29ja19jbG9zZShzcyk7CisgICAgICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvciBpbiBjbG9zaW5nIHNvY2tldCIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAtMTAxMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Rlc3Qodm9pZCkKK3sKKyAgICBwal9zb2NrX3QgY3MsIHNzOworICAgIHBqX3N0YXR1c190IHJjID0gMCwgcmV0dmFsOworCisgICAgUEpfTE9HKDMsKCJ0ZXN0IiwgIi4uLnRjcF90ZXN0KCkiKSk7CisKKyAgICByYyA9IGFwcF9zb2NrZXRwYWlyKHBqX0FGX0lORVQoKSwgcGpfU09DS19TVFJFQU0oKSwgMCwgJnNzLCAmY3MpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiBhcHBfc29ja2V0cGFpcigpOiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIC0yMDAwOworICAgIH0KKworICAgIC8qIFRlc3Qgc2VuZC9yZWN2IHdpdGggc2VuZCgpIGFuZCByZWN2KCkgKi8KKyAgICByZXR2YWwgPSBzZW5kX3JlY3ZfdGVzdChwal9TT0NLX1NUUkVBTSgpLCBzcywgY3MsIE5VTEwsIE5VTEwsIDApOworCisgICAgcmMgPSBwal9zb2NrX2Nsb3NlKGNzKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvciBpbiBjbG9zaW5nIHNvY2tldCIsIHJjKTsKKyAgICAgICAgcmV0dXJuIC0yMDAwOworICAgIH0KKworICAgIHJjID0gcGpfc29ja19jbG9zZShzcyk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3IgaW4gY2xvc2luZyBzb2NrZXQiLCByYyk7CisgICAgICAgIHJldHVybiAtMjAxMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGlvY3RsX3Rlc3Qodm9pZCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRob3N0YnluYW1lX3Rlc3Qodm9pZCkKK3sKKyAgICBwal9zdHJfdCBob3N0OworICAgIHBqX2hvc3RlbnQgaGU7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisgICAgLyogVGVzdGluZyBwal9nZXRob3N0YnluYW1lKCkgd2l0aCBpbnZhbGlkIGhvc3QgKi8KKyAgICBob3N0ID0gcGpfc3RyKCJhbi1pbnZhbGlkLWhvc3QtbmFtZSIpOworICAgIHN0YXR1cyA9IHBqX2dldGhvc3RieW5hbWUoJmhvc3QsICZoZSk7CisKKyAgICAvKiBNdXN0IHJldHVybiBmYWlsdXJlISAqLworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gLTIwMTAwOworICAgIGVsc2UKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKyNpbmNsdWRlICIuLi9wai9vc19zeW1iaWFuLmgiCitzdGF0aWMgaW50IGNvbm5lY3RfdGVzdCgpCit7CisJUlNvY2tldFNlcnYgclNvY2tTZXJ2OworCVJTb2NrZXQgclNvY2s7CisJVEluZXRBZGRyIGluZXRBZGRyOworCVRSZXF1ZXN0U3RhdHVzIHJlcVN0YXR1czsKKwljaGFyIGJ1ZmZlclsxNl07CisJVFB0ckM4IGRhdGEoKGNvbnN0IFRVaW50OCopYnVmZmVyLCAoVEludClzaXplb2YoYnVmZmVyKSk7CisgCWludCByYzsKKwkKKwlyYyA9IHJTb2NrU2Vydi5Db25uZWN0KCk7CisJaWYgKHJjICE9IEtFcnJOb25lKQorCQlyZXR1cm4gcmM7CisJCisJcmMgPSByU29jay5PcGVuKHJTb2NrU2VydiwgS0FmSW5ldCwgS1NvY2tEYXRhZ3JhbSwgS1Byb3RvY29sSW5ldFVkcCk7CisgICAgCWlmIChyYyAhPSBLRXJyTm9uZSkgCisgICAgCXsgICAgCQkKKyAgICAJCXJTb2NrU2Vydi5DbG9zZSgpOworICAgIAkJcmV0dXJuIHJjOworICAgIAl9CisgICAJCisgICAgCWluZXRBZGRyLkluaXQoS0FmSW5ldCk7CisgICAgCWluZXRBZGRyLklucHV0KF9MKCIxMjcuMC4wLjEiKSk7CisgICAgCWluZXRBZGRyLlNldFBvcnQoODApOworICAgIAkKKyAgICAJclNvY2suQ29ubmVjdChpbmV0QWRkciwgcmVxU3RhdHVzKTsKKyAgICAJVXNlcjo6V2FpdEZvclJlcXVlc3QocmVxU3RhdHVzKTsKKworICAgIAlpZiAocmVxU3RhdHVzICE9IEtFcnJOb25lKSB7CisJCXJTb2NrLkNsb3NlKCk7CisgICAgCQlyU29ja1NlcnYuQ2xvc2UoKTsKKwkJcmV0dXJuIHJjOworICAgIAl9CisgICAgCisgICAgCXJTb2NrLlNlbmQoZGF0YSwgMCwgcmVxU3RhdHVzKTsKKyAgICAJVXNlcjo6V2FpdEZvclJlcXVlc3QocmVxU3RhdHVzKTsKKyAgICAJCisgICAgCWlmIChyZXFTdGF0dXMhPUtFcnJOb25lKSB7CisgICAgCQlyU29jay5DbG9zZSgpOworICAgIAkJclNvY2tTZXJ2LkNsb3NlKCk7CisgICAgCQlyZXR1cm4gcmM7CisgICAgCX0KKyAgICAJCisgICAgCXJTb2NrLkNsb3NlKCk7CisgICAgCXJTb2NrU2Vydi5DbG9zZSgpOworCXJldHVybiBLRXJyTm9uZTsKK30KKyNlbmRpZgorCitpbnQgc29ja190ZXN0KCkKK3sKKyAgICBpbnQgcmM7CisgICAgCisgICAgcGpfY3JlYXRlX3JhbmRvbV9zdHJpbmcoYmlnZGF0YSwgQklHX0RBVEFfTEVOKTsKKworLy8gRW5hYmxlIHRoaXMgdG8gZGVtb25zdHJhdGUgdGhlIGVycm9yIHdpdG4gUzYwIDNyZCBFZGl0aW9uIE1SMgorI2lmIDAKKyAgICByYyA9IGNvbm5lY3RfdGVzdCgpOworICAgIGlmIChyYyAhPSAwKQorICAgIAlyZXR1cm4gcmM7CisjZW5kaWYKKyAgICAKKyAgICByYyA9IGZvcm1hdF90ZXN0KCk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisgICAgcmMgPSBwYXJzZV90ZXN0KCk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisgICAgcmMgPSBwdXJpdHlfdGVzdCgpOworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworICAgIHJjID0gZ2V0aG9zdGJ5bmFtZV90ZXN0KCk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisgICAgcmMgPSBzaW1wbGVfc29ja190ZXN0KCk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisgICAgcmMgPSBpb2N0bF90ZXN0KCk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisgICAgcmMgPSB1ZHBfdGVzdCgpOworICAgIGlmIChyYyAhPSAwKQorCXJldHVybiByYzsKKworICAgIHJjID0gdGNwX3Rlc3QoKTsKKyAgICBpZiAocmMgIT0gMCkKKwlyZXR1cm4gcmM7CisKKyAgICByZXR1cm4gMDsKK30KKworCisjZWxzZQorLyogVG8gcHJldmVudCB3YXJuaW5nIGFib3V0ICJ0cmFuc2xhdGlvbiB1bml0IGlzIGVtcHR5IgorICogd2hlbiB0aGlzIHRlc3QgaXMgZGlzYWJsZWQuIAorICovCitpbnQgZHVtbXlfc29ja190ZXN0OworI2VuZGlmCS8qIElOQ0xVREVfU09DS19URVNUICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9zb2NrX3BlcmYuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC9zb2NrX3BlcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTZkOWYxCi0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3NvY2tfcGVyZi5jCkBAIC0wLDAgKzEsMTkwIEBACisvKiAkSWQ6IHNvY2tfcGVyZi5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxwamxpYi5oPgorI2luY2x1ZGUgPHBqL2NvbXBhdC9oaWdoX3ByZWNpc2lvbi5oPgorCisKKy8qKgorICogXHBhZ2UgcGFnZV9wamxpYl9zb2NrX3BlcmZfdGVzdCBUZXN0OiBTb2NrZXQgUGVyZm9ybWFuY2UKKyAqCisgKiBUZXN0IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgc29ja2V0IGNvbW11bmljYXRpb24uIFRoaXMgd2lsbCBwZXJmb3JtCisgKiBzaW1wbGUgcHJvZHVjZXItY29uc3VtZXIgdHlwZSBvZiB0ZXN0LCB3aGVyZSB3ZSBjYWxjdWxhdGUgaG93IGxvbmcKKyAqIGRvZXMgaXQgdGFrZSB0byBzZW5kIGNlcnRhaW4gbnVtYmVyIG9mIHBhY2tldHMgZnJvbSBwcm9kdWNlciB0bworICogY29uc3VtZXIuCisgKgorICogVGhpcyBmaWxlIGlzIDxiPnBqbGliLXRlc3Qvc29ja19wZXJmLmM8L2I+CisgKgorICogXGluY2x1ZGUgcGpsaWItdGVzdC9zb2NrX3BlcmYuYworICovCisKKyNpZiBJTkNMVURFX1NPQ0tfUEVSRl9URVNUCisKKy8qCisgKiBzb2NrX3Byb2R1Y2VyX2NvbnN1bWVyKCkKKyAqCisgKiBTaW1wbGUgcHJvZHVjZXItY29uc3VtZXIgYmVuY2htYXJraW5nLiBTZW5kIGxvb3AgbnVtYmVyIG9mCisgKiBidWZfc2l6ZSBzaXplIHBhY2tldHMgYXMgZmFzdCBhcyBwb3NzaWJsZS4KKyAqLworc3RhdGljIGludCBzb2NrX3Byb2R1Y2VyX2NvbnN1bWVyKGludCBzb2NrX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc2l6ZV90IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvb3AsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpwX2JhbmR3aWR0aCkKK3sKKyAgICBwal9zb2NrX3QgY29uc3VtZXIsIHByb2R1Y2VyOworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBjaGFyICpvdXRnb2luZ19idWZmZXIsICppbmNvbWluZ19idWZmZXI7CisgICAgcGpfdGltZXN0YW1wIHN0YXJ0LCBzdG9wOworICAgIHVuc2lnbmVkIGk7CisgICAgcGpfaGlnaHByZWNfdCBlbGFwc2VkLCBiYW5kd2lkdGg7CisgICAgcGpfaGlnaHByZWNfdCB0b3RhbF9yZWNlaXZlZDsKKyAgICBwal9zdGF0dXNfdCByYzsKKworICAgIC8qIENyZWF0ZSBwb29sLiAqLworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIDQwOTYsIDQwOTYsIE5VTEwpOworICAgIGlmICghcG9vbCkKKyAgICAgICAgcmV0dXJuIC0xMDsKKworICAgIC8qIENyZWF0ZSBwcm9kdWNlci1jb25zdW1lciBwYWlyLiAqLworICAgIHJjID0gYXBwX3NvY2tldHBhaXIocGpfQUZfSU5FVCgpLCBzb2NrX3R5cGUsIDAsICZjb25zdW1lciwgJnByb2R1Y2VyKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvcjogY3JlYXRlIHNvY2tldCBwYWlyIiwgcmMpOworICAgICAgICByZXR1cm4gLTIwOworICAgIH0KKworICAgIC8qIENyZWF0ZSBidWZmZXJzLiAqLworICAgIG91dGdvaW5nX2J1ZmZlciA9IChjaGFyKikgcGpfcG9vbF9hbGxvYyhwb29sLCBidWZfc2l6ZSk7CisgICAgaW5jb21pbmdfYnVmZmVyID0gKGNoYXIqKSBwal9wb29sX2FsbG9jKHBvb2wsIGJ1Zl9zaXplKTsKKworICAgIC8qIFN0YXJ0IGxvb3AuICovCisgICAgcGpfZ2V0X3RpbWVzdGFtcCgmc3RhcnQpOworICAgIHRvdGFsX3JlY2VpdmVkID0gMDsKKyAgICBmb3IgKGk9MDsgaTxsb29wOyArK2kpIHsKKyAgICAgICAgcGpfc3NpemVfdCBzZW50LCBwYXJ0X3JlY2VpdmVkLCByZWNlaXZlZDsKKwlwal90aW1lX3ZhbCBkZWxheTsKKworICAgICAgICBzZW50ID0gYnVmX3NpemU7CisgICAgICAgIHJjID0gcGpfc29ja19zZW5kKHByb2R1Y2VyLCBvdXRnb2luZ19idWZmZXIsICZzZW50LCAwKTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MgfHwgc2VudCAhPSAocGpfc3NpemVfdClidWZfc2l6ZSkgeworICAgICAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3I6IHNlbmQoKSIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAtNjE7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZXBlYXQgcmVjdigpIHVudGlsIGFsbCBkYXRhIGlzIHBhcnRfcmVjZWl2ZWQuCisgICAgICAgICAqIFRoaXMgYXBwbGllcyBvbmx5IGZvciBub24tVURQIG9mIGNvdXJzZSwgc2luY2UgZm9yIFVEUAorICAgICAgICAgKiB3ZSB3b3VsZCBleHBlY3QgYWxsIGRhdGEgdG8gYmUgcGFydF9yZWNlaXZlZCBpbiBvbmUgcGFja2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcmVjZWl2ZWQgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBwYXJ0X3JlY2VpdmVkID0gYnVmX3NpemUtcmVjZWl2ZWQ7CisJICAgIHJjID0gcGpfc29ja19yZWN2KGNvbnN1bWVyLCBpbmNvbWluZ19idWZmZXIrcmVjZWl2ZWQsIAorCQkJICAgICAgJnBhcnRfcmVjZWl2ZWQsIDApOworCSAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCSAgICAgICAgYXBwX3BlcnJvcigiLi4ucmVjdiBlcnJvciIsIHJjKTsKKwkgICAgICAgIHJldHVybiAtNzA7CisJICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJ0X3JlY2VpdmVkIDw9IDApIHsKKyAgICAgICAgICAgICAgICBQSl9MT0coMywoIiIsICIuLi5lcnJvcjogc29ja2V0IGhhcyBjbG9zZWQgKHBhcnRfcmVjZWl2ZWQ9JWQpISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRfcmVjZWl2ZWQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTczOworICAgICAgICAgICAgfQorCSAgICBpZiAoKHBqX3NpemVfdClwYXJ0X3JlY2VpdmVkICE9IGJ1Zl9zaXplLXJlY2VpdmVkKSB7CisgICAgICAgICAgICAgICAgaWYgKHNvY2tfdHlwZSAhPSBwal9TT0NLX1NUUkVBTSgpKSB7CisJICAgICAgICAgICAgUEpfTE9HKDMsKCIiLCAiLi4uZXJyb3I6IGV4cGVjdGluZyAldSBieXRlcywgZ290ICV1IGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplLXJlY2VpdmVkLCBwYXJ0X3JlY2VpdmVkKSk7CisJICAgICAgICAgICAgcmV0dXJuIC03NjsKKyAgICAgICAgICAgICAgICB9CisJICAgIH0KKyAgICAgICAgICAgIHJlY2VpdmVkICs9IHBhcnRfcmVjZWl2ZWQ7CisgICAgICAgIH0gd2hpbGUgKChwal9zaXplX3QpcmVjZWl2ZWQgPCBidWZfc2l6ZSk7CisKKwl0b3RhbF9yZWNlaXZlZCArPSByZWNlaXZlZDsKKworCS8qIFN0b3AgdGVzdCBpZiBpdCdzIGJlZW4gcnVubmlnbiBmb3IgbW9yZSB0aGFuIDEwIHNlY3MuICovCisJcGpfZ2V0X3RpbWVzdGFtcCgmc3RvcCk7CisJZGVsYXkgPSBwal9lbGFwc2VkX3RpbWUoJnN0YXJ0LCAmc3RvcCk7CisJaWYgKGRlbGF5LnNlYyA+IDEwKQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBTdG9wIHRpbWVyLiAqLworICAgIHBqX2dldF90aW1lc3RhbXAoJnN0b3ApOworCisgICAgZWxhcHNlZCA9IHBqX2VsYXBzZWRfdXNlYygmc3RhcnQsICZzdG9wKTsKKworICAgIC8qIGJhbmR3aWR0aCA9IHRvdGFsX3JlY2VpdmVkICogMTAwMCAvIGVsYXBzZWQgKi8KKyAgICBiYW5kd2lkdGggPSB0b3RhbF9yZWNlaXZlZDsKKyAgICBwal9oaWdocHJlY19tdWwoYmFuZHdpZHRoLCAxMDAwKTsKKyAgICBwal9oaWdocHJlY19kaXYoYmFuZHdpZHRoLCBlbGFwc2VkKTsKKyAgICAKKyAgICAqcF9iYW5kd2lkdGggPSAocGpfdWludDMyX3QpYmFuZHdpZHRoOworCisgICAgLyogQ2xvc2Ugc29ja2V0cy4gKi8KKyAgICBwal9zb2NrX2Nsb3NlKGNvbnN1bWVyKTsKKyAgICBwal9zb2NrX2Nsb3NlKHByb2R1Y2VyKTsKKworICAgIC8qIERvbmUgKi8KKyAgICBwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIHNvY2tfcGVyZl90ZXN0KCkKKyAqCisgKiBNYWluIHRlc3QgZW50cnkuCisgKi8KK2ludCBzb2NrX3BlcmZfdGVzdCh2b2lkKQoreworICAgIGVudW0geyBMT09QID0gNjQgKiAxMDI0IH07CisgICAgaW50IHJjOworICAgIHVuc2lnbmVkIGJhbmR3aWR0aDsKKworICAgIFBKX0xPRygzLCgiIiwgIi4uLmJlbmNobWFya2luZyBzb2NrZXQgIgorICAgICAgICAgICAgICAgICAgIigyIHNvY2tldHMsIHBhY2tldD01MTIsIHNpbmdsZSB0aHJlYWRlZCk6IikpOworCisgICAgLyogRGlzYWJsZSB0aGlzIHRlc3Qgb24gU3ltYmlhbiBzaW5jZSBVRFAgY29ubmVjdCgpL3NlbmQoKSBmYWlsZWQKKyAgICAgKiB3aXRoIFM2MCAzcmQgZWRpdGlvbiAoaW5jbHVkaW5nIE1SMikuCisgICAgICogU2VlIGh0dHA6Ly93d3cucGpzaXAub3JnL3RyYWMvdGlja2V0LzI2NAorICAgICAqLyAgICAKKyNpZiAhZGVmaW5lZChQSl9TWU1CSUFOKSB8fCBQSl9TWU1CSUFOPT0wCisgICAgLyogQmVuY2htYXJraW5nIFVEUCAqLworICAgIHJjID0gc29ja19wcm9kdWNlcl9jb25zdW1lcihwal9TT0NLX0RHUkFNKCksIDUxMiwgTE9PUCwgJmJhbmR3aWR0aCk7CisgICAgaWYgKHJjICE9IDApIHJldHVybiByYzsKKyAgICBQSl9MT0coMywoIiIsICIuLi4uYmFuZHdpZHRoIFVEUCA9ICVkIEtCL3MiLCBiYW5kd2lkdGgpKTsKKyNlbmRpZgorCisgICAgLyogQmVuY2htYXJraW5nIFRDUCAqLworICAgIHJjID0gc29ja19wcm9kdWNlcl9jb25zdW1lcihwal9TT0NLX1NUUkVBTSgpLCA1MTIsIExPT1AsICZiYW5kd2lkdGgpOworICAgIGlmIChyYyAhPSAwKSByZXR1cm4gcmM7CisgICAgUEpfTE9HKDMsKCIiLCAiLi4uLmJhbmR3aWR0aCBUQ1AgPSAlZCBLQi9zIiwgYmFuZHdpZHRoKSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworI2Vsc2UKKy8qIFRvIHByZXZlbnQgd2FybmluZyBhYm91dCAidHJhbnNsYXRpb24gdW5pdCBpcyBlbXB0eSIKKyAqIHdoZW4gdGhpcyB0ZXN0IGlzIGRpc2FibGVkLiAKKyAqLworaW50IGR1bW15X3NvY2tfcGVyZl90ZXN0OworI2VuZGlmICAvKiBJTkNMVURFX1NPQ0tfUEVSRl9URVNUICovCisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3NzbF9zb2NrLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3Qvc3NsX3NvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY4OWI3Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3NzbF9zb2NrLmMKQEAgLTAsMCArMSwxNDQ4IEBACisvKiAkSWQ6IHNzbF9zb2NrLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPHBqbGliLmg+CisKKworI2RlZmluZSBDRVJUX0RJUgkJICAgICIuLi9idWlsZC8iCisjZGVmaW5lIENFUlRfQ0FfRklMRQkJICAgIENFUlRfRElSICJjYWNlcnQucGVtIgorI2RlZmluZSBDRVJUX0ZJTEUJCSAgICBDRVJUX0RJUiAiY2FjZXJ0LnBlbSIKKyNkZWZpbmUgQ0VSVF9QUklWS0VZX0ZJTEUJICAgIENFUlRfRElSICJwcml2a2V5LnBlbSIKKyNkZWZpbmUgQ0VSVF9QUklWS0VZX1BBU1MJICAgICIiCisKKworI2lmIElOQ0xVREVfU1NMU09DS19URVNUCisKKy8qIEdsb2JhbCB2YXJzICovCitzdGF0aWMgaW50IGNsaWVudHNfbnVtOworCitzdHJ1Y3Qgc2VuZF9rZXkgeworICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QJb3Bfa2V5OworfTsKKworCitzdGF0aWMgaW50IGdldF9jaXBoZXJfbGlzdCh2b2lkKSB7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIHBqX3NzbF9jaXBoZXIgY2lwaGVyc1sxMDBdOworICAgIHVuc2lnbmVkIGNpcGhlcl9udW07CisgICAgdW5zaWduZWQgaTsKKworICAgIGNpcGhlcl9udW0gPSBQSl9BUlJBWV9TSVpFKGNpcGhlcnMpOworICAgIHN0YXR1cyA9IHBqX3NzbF9jaXBoZXJfZ2V0X2F2YWlsYWJsZXMoY2lwaGVycywgJmNpcGhlcl9udW0pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLkZBSUxFRCB0byBnZXQgYXZhaWxhYmxlIGNpcGhlcnMiLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgUEpfTE9HKDMsICgiIiwgIi4uLkZvdW5kICV1IGNpcGhlcnM6IiwgY2lwaGVyX251bSkpOworICAgIGZvciAoaSA9IDA7IGkgPCBjaXBoZXJfbnVtOyArK2kpIHsKKwljb25zdCBjaGFyKiBzdDsKKwlzdCA9IHBqX3NzbF9jaXBoZXJfbmFtZShjaXBoZXJzW2ldKTsKKwlpZiAoc3QgPT0gTlVMTCkKKwkgICAgc3QgPSAiW1Vua25vd25dIjsKKworCVBKX0xPRygzLCAoIiIsICIuLi4lM3U6IDB4JTA4eD0lcyIsIGkrMSwgY2lwaGVyc1tpXSwgc3QpKTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfU1VDQ0VTUzsKK30KKworCitzdHJ1Y3QgdGVzdF9zdGF0ZQoreworICAgIHBqX3Bvb2xfdAkgICAqcG9vbDsJICAgIC8qIHBvb2wJCQkJICAgICovCisgICAgcGpfaW9xdWV1ZV90ICAgKmlvcXVldWU7CSAgICAvKiBpb3F1ZXVlCQkJCSAgICAqLworICAgIHBqX2Jvb2xfdAkgICAgaXNfc2VydmVyOwkgICAgLyogc2VydmVyIHJvbGUgZmxhZwkJCSAgICAqLworICAgIHBqX2Jvb2xfdAkgICAgaXNfdmVyYm9zZTsJICAgIC8qIHZlcmJvc2UgZmxhZywgZS5nOiBjZXJ0IGluZm8JICAgICovCisgICAgcGpfYm9vbF90CSAgICBlY2hvOwkgICAgLyogZWNobyByZWNlaXZlZCBkYXRhCQkgICAgKi8KKyAgICBwal9zdGF0dXNfdAkgICAgZXJyOwkgICAgLyogZXJyb3IgZmxhZwkJCSAgICAqLworICAgIHBqX3NpemVfdAkgICAgc2VudDsJICAgIC8qIGJ5dGVzIHNlbnQJCQkgICAgKi8KKyAgICBwal9zaXplX3QJICAgIHJlY3Y7CSAgICAvKiBieXRlcyByZWNlaXZlZAkJCSAgICAqLworICAgIHBqX3VpbnQ4X3QJICAgIHJlYWRfYnVmWzI1Nl07ICAvKiByZWFkIGJ1ZmZlcgkJCSAgICAqLworICAgIHBqX2Jvb2xfdAkgICAgZG9uZTsJICAgIC8qIHRlc3QgZG9uZSBmbGFnCQkJICAgICovCisgICAgY2hhcgkgICAqc2VuZF9zdHI7CSAgICAvKiBkYXRhIHRvIHNlbmQgb25jZSBjb25uZWN0ZWQJICAgICovCisgICAgcGpfc2l6ZV90CSAgICBzZW5kX3N0cl9sZW47ICAgLyogc2VuZCBkYXRhIGxlbmd0aAkJCSAgICAqLworICAgIHBqX2Jvb2xfdAkgICAgY2hlY2tfZWNobzsJICAgIC8qIGZsYWcgdG8gY29tcGFyZSBzZW50ICYgZWNob2VkIGRhdGEgICAqLworICAgIGNvbnN0IGNoYXIJICAgKmNoZWNrX2VjaG9fcHRyOyAvKiBwb2ludGVyL2N1cnNvciBmb3IgY29tcGFyaW5nIGRhdGEgICAgKi8KKyAgICBzdHJ1Y3Qgc2VuZF9rZXkgc2VuZF9rZXk7CSAgICAvKiBzZW5kIG9wIGtleQkJCSAgICAqLworfTsKKworc3RhdGljIHZvaWQgZHVtcF9zc2xfaW5mbyhjb25zdCBwal9zc2xfc29ja19pbmZvICpzaSkKK3sKKyAgICBjb25zdCBjaGFyICp0bXBfc3Q7CisKKyAgICAvKiBQcmludCBjaXBoZXIgbmFtZSAqLworICAgIHRtcF9zdCA9IHBqX3NzbF9jaXBoZXJfbmFtZShzaS0+Y2lwaGVyKTsKKyAgICBpZiAodG1wX3N0ID09IE5VTEwpCisJdG1wX3N0ID0gIltVbmtub3duXSI7CisgICAgUEpfTE9HKDMsICgiIiwgIi4uLi4uQ2lwaGVyOiAlcyIsIHRtcF9zdCkpOworCisgICAgLyogUHJpbnQgcmVtb3RlIGNlcnRpZmljYXRlIGluZm8gYW5kIHZlcmlmaWNhdGlvbiByZXN1bHQgKi8KKyAgICBpZiAoc2ktPnJlbW90ZV9jZXJ0X2luZm8gJiYgc2ktPnJlbW90ZV9jZXJ0X2luZm8tPnN1YmplY3QuaW5mby5zbGVuKSAKKyAgICB7CisJY2hhciBidWZbMjA0OF07CisJY29uc3QgY2hhciAqdmVyaWZfbXNnc1szMl07CisJdW5zaWduZWQgdmVyaWZfbXNnX2NudDsKKworCS8qIER1bXAgcmVtb3RlIFRMUyBjZXJ0aWZpY2F0ZSBpbmZvICovCisJUEpfTE9HKDMsICgiIiwgIi4uLi4uUmVtb3RlIGNlcnRpZmljYXRlIGluZm86IikpOworCXBqX3NzbF9jZXJ0X2luZm9fZHVtcChzaS0+cmVtb3RlX2NlcnRfaW5mbywgIiAgIiwgYnVmLCBzaXplb2YoYnVmKSk7CisJUEpfTE9HKDMsKCIiLCAiXG4lcyIsIGJ1ZikpOworCisJLyogRHVtcCByZW1vdGUgVExTIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiByZXN1bHQgKi8KKwl2ZXJpZl9tc2dfY250ID0gUEpfQVJSQVlfU0laRSh2ZXJpZl9tc2dzKTsKKwlwal9zc2xfY2VydF9nZXRfdmVyaWZ5X3N0YXR1c19zdHJpbmdzKHNpLT52ZXJpZnlfc3RhdHVzLAorCQkJCQkgICAgICB2ZXJpZl9tc2dzLCAmdmVyaWZfbXNnX2NudCk7CisJUEpfTE9HKDMsKCIiLCAiLi4uLi5SZW1vdGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHJlc3VsdDogJXMiLAorCQkgICh2ZXJpZl9tc2dfY250ID09IDE/IHZlcmlmX21zZ3NbMF06IiIpKSk7CisJaWYgKHZlcmlmX21zZ19jbnQgPiAxKSB7CisJICAgIHVuc2lnbmVkIGk7CisJICAgIGZvciAoaSA9IDA7IGkgPCB2ZXJpZl9tc2dfY250OyArK2kpCisJCVBKX0xPRygzLCgiIiwgIi4uLi4uIC0gJXMiLCB2ZXJpZl9tc2dzW2ldKSk7CisJfQorICAgIH0KK30KKworCitzdGF0aWMgcGpfYm9vbF90IHNzbF9vbl9jb25uZWN0X2NvbXBsZXRlKHBqX3NzbF9zb2NrX3QgKnNzb2NrLAorCQkJCQkgcGpfc3RhdHVzX3Qgc3RhdHVzKQoreworICAgIHN0cnVjdCB0ZXN0X3N0YXRlICpzdCA9IChzdHJ1Y3QgdGVzdF9zdGF0ZSopIAorCQkgICAgCSAgICBwal9zc2xfc29ja19nZXRfdXNlcl9kYXRhKHNzb2NrKTsKKyAgICB2b2lkICpyZWFkX2J1ZlsxXTsKKyAgICBwal9zc2xfc29ja19pbmZvIGluZm87CisgICAgY2hhciBidWYxWzY0XSwgYnVmMls2NF07CisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlhcHBfcGVycm9yKCIuLi5FUlJPUiBzc2xfb25fY29ubmVjdF9jb21wbGV0ZSgpIiwgc3RhdHVzKTsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9zc2xfc29ja19nZXRfaW5mbyhzc29jaywgJmluZm8pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLkVSUk9SIHBqX3NzbF9zb2NrX2dldF9pbmZvKCkiLCBzdGF0dXMpOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHBqX3NvY2thZGRyX3ByaW50KChwal9zb2NrYWRkcl90KikmaW5mby5sb2NhbF9hZGRyLCBidWYxLCBzaXplb2YoYnVmMSksIDEpOworICAgIHBqX3NvY2thZGRyX3ByaW50KChwal9zb2NrYWRkcl90KikmaW5mby5yZW1vdGVfYWRkciwgYnVmMiwgc2l6ZW9mKGJ1ZjIpLCAxKTsKKyAgICBQSl9MT0coMywgKCIiLCAiLi4uQ29ubmVjdGVkICVzIC0+ICVzISIsIGJ1ZjEsIGJ1ZjIpKTsKKworICAgIGlmIChzdC0+aXNfdmVyYm9zZSkKKwlkdW1wX3NzbF9pbmZvKCZpbmZvKTsKKworICAgIC8qIFN0YXJ0IHJlYWRpbmcgZGF0YSAqLworICAgIHJlYWRfYnVmWzBdID0gc3QtPnJlYWRfYnVmOworICAgIHN0YXR1cyA9IHBqX3NzbF9zb2NrX3N0YXJ0X3JlYWQyKHNzb2NrLCBzdC0+cG9vbCwgc2l6ZW9mKHN0LT5yZWFkX2J1ZiksICh2b2lkKiopcmVhZF9idWYsIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLkVSUk9SIHBqX3NzbF9zb2NrX3N0YXJ0X3JlYWQyKCkiLCBzdGF0dXMpOworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIC8qIFN0YXJ0IHNlbmRpbmcgZGF0YSAqLworICAgIHdoaWxlIChzdC0+c2VudCA8IHN0LT5zZW5kX3N0cl9sZW4pIHsKKwlwal9zc2l6ZV90IHNpemU7CisKKwlzaXplID0gc3QtPnNlbmRfc3RyX2xlbiAtIHN0LT5zZW50OworCXN0YXR1cyA9IHBqX3NzbF9zb2NrX3NlbmQoc3NvY2ssIChwal9pb3F1ZXVlX29wX2tleV90Kikmc3QtPnNlbmRfa2V5LCAKKwkJCQkgIHN0LT5zZW5kX3N0ciArIHN0LT5zZW50LCAmc2l6ZSwgMCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTICYmIHN0YXR1cyAhPSBQSl9FUEVORElORykgeworCSAgICBhcHBfcGVycm9yKCIuLi5FUlJPUiBwal9zc2xfc29ja19zZW5kKCkiLCBzdGF0dXMpOworCSAgICBnb3RvIG9uX3JldHVybjsKKwl9CisKKwlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpCisJICAgIHN0LT5zZW50ICs9IHNpemU7CisJZWxzZQorCSAgICBicmVhazsKKyAgICB9CisKK29uX3JldHVybjoKKyAgICBzdC0+ZXJyID0gc3RhdHVzOworCisgICAgaWYgKHN0LT5lcnIgIT0gUEpfU1VDQ0VTUykgeworCXBqX3NzbF9zb2NrX2Nsb3NlKHNzb2NrKTsKKwljbGllbnRzX251bS0tOworCXJldHVybiBQSl9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gUEpfVFJVRTsKK30KKworCitzdGF0aWMgcGpfYm9vbF90IHNzbF9vbl9hY2NlcHRfY29tcGxldGUocGpfc3NsX3NvY2tfdCAqc3NvY2ssCisJCQkJCXBqX3NzbF9zb2NrX3QgKm5ld3NvY2ssCisJCQkJCWNvbnN0IHBqX3NvY2thZGRyX3QgKnNyY19hZGRyLAorCQkJCQlpbnQgc3JjX2FkZHJfbGVuKQoreworICAgIHN0cnVjdCB0ZXN0X3N0YXRlICpwYXJlbnRfc3QgPSAoc3RydWN0IHRlc3Rfc3RhdGUqKSAKKwkJCQkgICBwal9zc2xfc29ja19nZXRfdXNlcl9kYXRhKHNzb2NrKTsKKyAgICBzdHJ1Y3QgdGVzdF9zdGF0ZSAqc3Q7CisgICAgdm9pZCAqcmVhZF9idWZbMV07CisgICAgcGpfc3NsX3NvY2tfaW5mbyBpbmZvOworICAgIGNoYXIgYnVmWzY0XTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHNyY19hZGRyX2xlbik7CisKKyAgICAvKiBEdXBsaWNhdGUgcGFyZW50IHRlc3Qgc3RhdGUgdG8gbmV3bHkgYWNjZXB0ZWQgdGVzdCBzdGF0ZSAqLworICAgIHN0ID0gKHN0cnVjdCB0ZXN0X3N0YXRlKilwal9wb29sX3phbGxvYyhwYXJlbnRfc3QtPnBvb2wsIHNpemVvZihzdHJ1Y3QgdGVzdF9zdGF0ZSkpOworICAgICpzdCA9ICpwYXJlbnRfc3Q7CisgICAgcGpfc3NsX3NvY2tfc2V0X3VzZXJfZGF0YShuZXdzb2NrLCBzdCk7CisKKyAgICBzdGF0dXMgPSBwal9zc2xfc29ja19nZXRfaW5mbyhuZXdzb2NrLCAmaW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uRVJST1IgcGpfc3NsX3NvY2tfZ2V0X2luZm8oKSIsIHN0YXR1cyk7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgcGpfc29ja2FkZHJfcHJpbnQoc3JjX2FkZHIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIDEpOworICAgIFBKX0xPRygzLCAoIiIsICIuLi5BY2NlcHRlZCBjb25uZWN0aW9uIGZyb20gJXMiLCBidWYpKTsKKworICAgIGlmIChzdC0+aXNfdmVyYm9zZSkKKwlkdW1wX3NzbF9pbmZvKCZpbmZvKTsKKworICAgIC8qIFN0YXJ0IHJlYWRpbmcgZGF0YSAqLworICAgIHJlYWRfYnVmWzBdID0gc3QtPnJlYWRfYnVmOworICAgIHN0YXR1cyA9IHBqX3NzbF9zb2NrX3N0YXJ0X3JlYWQyKG5ld3NvY2ssIHN0LT5wb29sLCBzaXplb2Yoc3QtPnJlYWRfYnVmKSwgKHZvaWQqKilyZWFkX2J1ZiwgMCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uRVJST1IgcGpfc3NsX3NvY2tfc3RhcnRfcmVhZDIoKSIsIHN0YXR1cyk7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogU3RhcnQgc2VuZGluZyBkYXRhICovCisgICAgd2hpbGUgKHN0LT5zZW50IDwgc3QtPnNlbmRfc3RyX2xlbikgeworCXBqX3NzaXplX3Qgc2l6ZTsKKworCXNpemUgPSBzdC0+c2VuZF9zdHJfbGVuIC0gc3QtPnNlbnQ7CisJc3RhdHVzID0gcGpfc3NsX3NvY2tfc2VuZChuZXdzb2NrLCAocGpfaW9xdWV1ZV9vcF9rZXlfdCopJnN0LT5zZW5kX2tleSwgCisJCQkJICBzdC0+c2VuZF9zdHIgKyBzdC0+c2VudCwgJnNpemUsIDApOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gUEpfRVBFTkRJTkcpIHsKKwkgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgcGpfc3NsX3NvY2tfc2VuZCgpIiwgc3RhdHVzKTsKKwkgICAgZ290byBvbl9yZXR1cm47CisJfQorCisJaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorCSAgICBzdC0+c2VudCArPSBzaXplOworCWVsc2UKKwkgICAgYnJlYWs7CisgICAgfQorCitvbl9yZXR1cm46CisgICAgc3QtPmVyciA9IHN0YXR1czsKKworICAgIGlmIChzdC0+ZXJyICE9IFBKX1NVQ0NFU1MpIHsKKwlwal9zc2xfc29ja19jbG9zZShuZXdzb2NrKTsKKwlyZXR1cm4gUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKK3N0YXRpYyBwal9ib29sX3Qgc3NsX29uX2RhdGFfcmVhZChwal9zc2xfc29ja190ICpzc29jaywKKwkJCQkgIHZvaWQgKmRhdGEsCisJCQkJICBwal9zaXplX3Qgc2l6ZSwKKwkJCQkgIHBqX3N0YXR1c190IHN0YXR1cywKKwkJCQkgIHBqX3NpemVfdCAqcmVtYWluZGVyKQoreworICAgIHN0cnVjdCB0ZXN0X3N0YXRlICpzdCA9IChzdHJ1Y3QgdGVzdF9zdGF0ZSopIAorCQkJICAgICBwal9zc2xfc29ja19nZXRfdXNlcl9kYXRhKHNzb2NrKTsKKworICAgIFBKX1VOVVNFRF9BUkcocmVtYWluZGVyKTsKKyAgICBQSl9VTlVTRURfQVJHKGRhdGEpOworCisgICAgaWYgKHNpemUgPiAwKSB7CisJcGpfc2l6ZV90IGNvbnN1bWVkOworCisJLyogU2V0IHJhbmRvbSByZW1haW5kZXIgKi8KKwkqcmVtYWluZGVyID0gcGpfcmFuZCgpICUgMTAwOworCisJLyogQXBwbHkgemVybyByZW1haW5kZXIgaWY6CisJICogLSByZW1haW5kZXIgaXMgbGVzcyB0aGFuIHNpemUsIG9yCisJICogLSBjb25uZWN0aW9uIGNsb3NlZC9lcnJvcgorCSAqIC0gZWNoby9jaGVja19lY28gc2V0CisJICovCisJaWYgKCpyZW1haW5kZXIgPiBzaXplIHx8IHN0YXR1cyAhPSBQSl9TVUNDRVNTIHx8IHN0LT5lY2hvIHx8IHN0LT5jaGVja19lY2hvKQorCSAgICAqcmVtYWluZGVyID0gMDsKKworCWNvbnN1bWVkID0gc2l6ZSAtICpyZW1haW5kZXI7CisJc3QtPnJlY3YgKz0gY29uc3VtZWQ7CisKKwkvL3ByaW50ZigiJS4qcyIsIGNvbnN1bWVkLCAoY2hhciopZGF0YSk7CisKKwlwal9tZW1tb3ZlKGRhdGEsIChjaGFyKilkYXRhICsgY29uc3VtZWQsICpyZW1haW5kZXIpOworCisJLyogRWNobyBkYXRhIHdoZW4gc3BlY2lmaWVkIHRvICovCisJaWYgKHN0LT5lY2hvKSB7CisJICAgIHBqX3NzaXplX3Qgc2l6ZV8gPSBjb25zdW1lZDsKKwkgICAgc3RhdHVzID0gcGpfc3NsX3NvY2tfc2VuZChzc29jaywgKHBqX2lvcXVldWVfb3Bfa2V5X3QqKSZzdC0+c2VuZF9rZXksIGRhdGEsICZzaXplXywgMCk7CisJICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gUEpfRVBFTkRJTkcpIHsKKwkJYXBwX3BlcnJvcigiLi4uRVJST1IgcGpfc3NsX3NvY2tfc2VuZCgpIiwgc3RhdHVzKTsKKwkJZ290byBvbl9yZXR1cm47CisJICAgIH0KKworCSAgICBpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpCisJCXN0LT5zZW50ICs9IHNpemVfOworCX0KKworCS8qIFZlcmlmeSBlY2hvZWQgZGF0YSB3aGVuIHNwZWNpZmllZCB0byAqLworCWlmIChzdC0+Y2hlY2tfZWNobykgeworCSAgICBpZiAoIXN0LT5jaGVja19lY2hvX3B0cikKKwkJc3QtPmNoZWNrX2VjaG9fcHRyID0gc3QtPnNlbmRfc3RyOworCisJICAgIGlmIChwal9tZW1jbXAoc3QtPmNoZWNrX2VjaG9fcHRyLCBkYXRhLCBjb25zdW1lZCkpIHsKKwkJc3RhdHVzID0gUEpfRUlOVkFMOworCQlhcHBfcGVycm9yKCIuLi5FUlJPUiBlY2hvZWQgZGF0YSBub3QgZXhhY3QiLCBzdGF0dXMpOworCQlnb3RvIG9uX3JldHVybjsKKwkgICAgfQorCSAgICBzdC0+Y2hlY2tfZWNob19wdHIgKz0gY29uc3VtZWQ7CisKKwkgICAgLyogRWNobyByZWNlaXZlZCBjb21wbGV0ZWx5ICovCisJICAgIGlmIChzdC0+c2VuZF9zdHJfbGVuID09IHN0LT5yZWN2KSB7CisJCXBqX3NzbF9zb2NrX2luZm8gaW5mbzsKKwkJY2hhciBidWZbNjRdOworCisJCXN0YXR1cyA9IHBqX3NzbF9zb2NrX2dldF9pbmZvKHNzb2NrLCAmaW5mbyk7CisJCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCQkgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgcGpfc3NsX3NvY2tfZ2V0X2luZm8oKSIsIHN0YXR1cyk7CisJCSAgICBnb3RvIG9uX3JldHVybjsKKwkJfQorCisJCXBqX3NvY2thZGRyX3ByaW50KChwal9zb2NrYWRkcl90KikmaW5mby5sb2NhbF9hZGRyLCBidWYsIHNpemVvZihidWYpLCAxKTsKKwkJUEpfTE9HKDMsICgiIiwgIi4uLiVzIHN1Y2Nlc3NmdWxseSByZWN2ICVkIGJ5dGVzIGVjaG8iLCBidWYsIHN0LT5yZWN2KSk7CisJCXN0LT5kb25lID0gUEpfVFJVRTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlpZiAoc3RhdHVzID09IFBKX0VFT0YpIHsKKwkgICAgc3RhdHVzID0gUEpfU1VDQ0VTUzsKKwkgICAgc3QtPmRvbmUgPSBQSl9UUlVFOworCX0gZWxzZSB7CisJICAgIGFwcF9wZXJyb3IoIi4uLkVSUk9SIHNzbF9vbl9kYXRhX3JlYWQoKSIsIHN0YXR1cyk7CisJfQorICAgIH0KKworb25fcmV0dXJuOgorICAgIHN0LT5lcnIgPSBzdGF0dXM7CisKKyAgICBpZiAoc3QtPmVyciAhPSBQSl9TVUNDRVNTIHx8IHN0LT5kb25lKSB7CisJcGpfc3NsX3NvY2tfY2xvc2Uoc3NvY2spOworCWlmICghc3QtPmlzX3NlcnZlcikKKwkgICAgY2xpZW50c19udW0tLTsKKwlyZXR1cm4gUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKK3N0YXRpYyBwal9ib29sX3Qgc3NsX29uX2RhdGFfc2VudChwal9zc2xfc29ja190ICpzc29jaywKKwkJCQkgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwKKwkJCQkgIHBqX3NzaXplX3Qgc2VudCkKK3sKKyAgICBzdHJ1Y3QgdGVzdF9zdGF0ZSAqc3QgPSAoc3RydWN0IHRlc3Rfc3RhdGUqKQorCQkJICAgICBwal9zc2xfc29ja19nZXRfdXNlcl9kYXRhKHNzb2NrKTsKKyAgICBQSl9VTlVTRURfQVJHKG9wX2tleSk7CisKKyAgICBpZiAoc2VudCA8IDApIHsKKwlzdC0+ZXJyID0gKHBqX3N0YXR1c190KS1zZW50OworICAgIH0gZWxzZSB7CisJc3QtPnNlbnQgKz0gc2VudDsKKworCS8qIFNlbmQgbW9yZSBpZiBhbnkgKi8KKwl3aGlsZSAoc3QtPnNlbnQgPCBzdC0+c2VuZF9zdHJfbGVuKSB7CisJICAgIHBqX3NzaXplX3Qgc2l6ZTsKKwkgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworCisJICAgIHNpemUgPSBzdC0+c2VuZF9zdHJfbGVuIC0gc3QtPnNlbnQ7CisJICAgIHN0YXR1cyA9IHBqX3NzbF9zb2NrX3NlbmQoc3NvY2ssIChwal9pb3F1ZXVlX29wX2tleV90Kikmc3QtPnNlbmRfa2V5LCAKKwkJCQkgICAgICBzdC0+c2VuZF9zdHIgKyBzdC0+c2VudCwgJnNpemUsIDApOworCSAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MgJiYgc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisJCWFwcF9wZXJyb3IoIi4uLkVSUk9SIHBqX3NzbF9zb2NrX3NlbmQoKSIsIHN0YXR1cyk7CisJCXN0LT5lcnIgPSBzdGF0dXM7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKQorCQlzdC0+c2VudCArPSBzaXplOworCSAgICBlbHNlCisJCWJyZWFrOworCX0KKyAgICB9CisKKyAgICBpZiAoc3QtPmVyciAhPSBQSl9TVUNDRVNTKSB7CisJcGpfc3NsX3NvY2tfY2xvc2Uoc3NvY2spOworCWlmICghc3QtPmlzX3NlcnZlcikKKwkgICAgY2xpZW50c19udW0tLTsKKwlyZXR1cm4gUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKKyNkZWZpbmUgSFRUUF9SRVEJCSJHRVQgLyBIVFRQLzEuMFxyXG5cclxuIjsKKyNkZWZpbmUgSFRUUF9TRVJWRVJfQUREUgkidHJhYy5wanNpcC5vcmciCisjZGVmaW5lIEhUVFBfU0VSVkVSX1BPUlQJNDQzCisKK3N0YXRpYyBpbnQgaHR0cHNfY2xpZW50X3Rlc3QodW5zaWduZWQgbXNfdGltZW91dCkKK3sKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSA9IE5VTEw7CisgICAgcGpfdGltZXJfaGVhcF90ICp0aW1lciA9IE5VTEw7CisgICAgcGpfc3NsX3NvY2tfdCAqc3NvY2sgPSBOVUxMOworICAgIHBqX3NzbF9zb2NrX3BhcmFtIHBhcmFtOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKyAgICBzdHJ1Y3QgdGVzdF9zdGF0ZSBzdGF0ZSA9IHswfTsKKyAgICBwal9zb2NrYWRkciBsb2NhbF9hZGRyLCByZW1fYWRkcjsKKyAgICBwal9zdHJfdCB0bXBfc3Q7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCAiaHR0cHNfZ2V0IiwgMjU2LCAyNTYsIE5VTEwpOworCisgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9jcmVhdGUocG9vbCwgNCwgJmlvcXVldWUpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX3RpbWVyX2hlYXBfY3JlYXRlKHBvb2wsIDQsICZ0aW1lcik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgc3RhdGUucG9vbCA9IHBvb2w7CisgICAgc3RhdGUuc2VuZF9zdHIgPSBIVFRQX1JFUTsKKyAgICBzdGF0ZS5zZW5kX3N0cl9sZW4gPSBwal9hbnNpX3N0cmxlbihzdGF0ZS5zZW5kX3N0cik7CisgICAgc3RhdGUuaXNfdmVyYm9zZSA9IFBKX1RSVUU7CisKKyAgICBwal9zc2xfc29ja19wYXJhbV9kZWZhdWx0KCZwYXJhbSk7CisgICAgcGFyYW0uY2Iub25fY29ubmVjdF9jb21wbGV0ZSA9ICZzc2xfb25fY29ubmVjdF9jb21wbGV0ZTsKKyAgICBwYXJhbS5jYi5vbl9kYXRhX3JlYWQgPSAmc3NsX29uX2RhdGFfcmVhZDsKKyAgICBwYXJhbS5jYi5vbl9kYXRhX3NlbnQgPSAmc3NsX29uX2RhdGFfc2VudDsKKyAgICBwYXJhbS5pb3F1ZXVlID0gaW9xdWV1ZTsKKyAgICBwYXJhbS51c2VyX2RhdGEgPSAmc3RhdGU7CisgICAgcGFyYW0uc2VydmVyX25hbWUgPSBwal9zdHIoKGNoYXIqKUhUVFBfU0VSVkVSX0FERFIpOworICAgIHBhcmFtLnRpbWVyX2hlYXAgPSB0aW1lcjsKKyAgICBwYXJhbS50aW1lb3V0LnNlYyA9IDA7CisgICAgcGFyYW0udGltZW91dC5tc2VjID0gbXNfdGltZW91dDsKKyAgICBwYXJhbS5wcm90byA9IFBKX1NTTF9TT0NLX1BST1RPX1NTTDIzOworICAgIHBqX3RpbWVfdmFsX25vcm1hbGl6ZSgmcGFyYW0udGltZW91dCk7CisKKyAgICBzdGF0dXMgPSBwal9zc2xfc29ja19jcmVhdGUocG9vbCwgJnBhcmFtLCAmc3NvY2spOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHBqX3NvY2thZGRyX2luaXQoUEpfQUZfSU5FVCwgJmxvY2FsX2FkZHIsIHBqX3N0cnNldDIoJnRtcF9zdCwgIjAuMC4wLjAiKSwgMCk7CisgICAgcGpfc29ja2FkZHJfaW5pdChQSl9BRl9JTkVULCAmcmVtX2FkZHIsIHBqX3N0cnNldDIoJnRtcF9zdCwgSFRUUF9TRVJWRVJfQUREUiksIEhUVFBfU0VSVkVSX1BPUlQpOworICAgIHN0YXR1cyA9IHBqX3NzbF9zb2NrX3N0YXJ0X2Nvbm5lY3Qoc3NvY2ssIHBvb2wsICZsb2NhbF9hZGRyLCAmcmVtX2FkZHIsIHNpemVvZihyZW1fYWRkcikpOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCXNzbF9vbl9jb25uZWN0X2NvbXBsZXRlKHNzb2NrLCBQSl9TVUNDRVNTKTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBQSl9FUEVORElORykgeworCXN0YXR1cyA9IFBKX1NVQ0NFU1M7CisgICAgfSBlbHNlIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBXYWl0IHVudGlsIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gc2VudC9yZWNlaXZlZCAqLworICAgIHdoaWxlIChzdGF0ZS5lcnIgPT0gUEpfU1VDQ0VTUyAmJiAhc3RhdGUuZG9uZSkgeworI2lmZGVmIFBKX1NZTUJJQU4KKwlwal9zeW1iaWFub3NfcG9sbCgtMSwgMTAwMCk7CisjZWxzZQorCXBqX3RpbWVfdmFsIGRlbGF5ID0gezAsIDEwMH07CisJcGpfaW9xdWV1ZV9wb2xsKGlvcXVldWUsICZkZWxheSk7CisJcGpfdGltZXJfaGVhcF9wb2xsKHRpbWVyLCAmZGVsYXkpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKHN0YXRlLmVycikgeworCXN0YXR1cyA9IHN0YXRlLmVycjsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBQSl9MT0coMywgKCIiLCAiLi4uRG9uZSEiKSk7CisgICAgUEpfTE9HKDMsICgiIiwgIi4uLi4uU2VudC9yZWN2OiAlZC8lZCBieXRlcyIsIHN0YXRlLnNlbnQsIHN0YXRlLnJlY3YpKTsKKworb25fcmV0dXJuOgorICAgIGlmIChzc29jayAmJiAhc3RhdGUuZXJyICYmICFzdGF0ZS5kb25lKSAKKwlwal9zc2xfc29ja19jbG9zZShzc29jayk7CisgICAgaWYgKGlvcXVldWUpCisJcGpfaW9xdWV1ZV9kZXN0cm95KGlvcXVldWUpOworICAgIGlmICh0aW1lcikKKwlwal90aW1lcl9oZWFwX2Rlc3Ryb3kodGltZXIpOworICAgIGlmIChwb29sKQorCXBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGludCBlY2hvX3Rlc3QocGpfc3NsX3NvY2tfcHJvdG8gc3J2X3Byb3RvLCBwal9zc2xfc29ja19wcm90byBjbGlfcHJvdG8sCisJCSAgICAgcGpfc3NsX2NpcGhlciBzcnZfY2lwaGVyLCBwal9zc2xfY2lwaGVyIGNsaV9jaXBoZXIsCisJCSAgICAgcGpfYm9vbF90IHJlcV9jbGllbnRfY2VydCwgcGpfYm9vbF90IGNsaWVudF9wcm92aWRlX2NlcnQpCit7CisgICAgcGpfcG9vbF90ICpwb29sID0gTlVMTDsKKyAgICBwal9pb3F1ZXVlX3QgKmlvcXVldWUgPSBOVUxMOworICAgIHBqX3NzbF9zb2NrX3QgKnNzb2NrX3NlcnYgPSBOVUxMOworICAgIHBqX3NzbF9zb2NrX3QgKnNzb2NrX2NsaSA9IE5VTEw7CisgICAgcGpfc3NsX3NvY2tfcGFyYW0gcGFyYW07CisgICAgc3RydWN0IHRlc3Rfc3RhdGUgc3RhdGVfc2VydiA9IHsgMCB9OworICAgIHN0cnVjdCB0ZXN0X3N0YXRlIHN0YXRlX2NsaSA9IHsgMCB9OworICAgIHBqX3NvY2thZGRyIGFkZHIsIGxpc3Rlbl9hZGRyOworICAgIHBqX3NzbF9jaXBoZXIgY2lwaGVyc1sxXTsKKyAgICBwal9zc2xfY2VydF90ICpjZXJ0ID0gTlVMTDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCAic3NsX2VjaG8iLCAyNTYsIDI1NiwgTlVMTCk7CisKKyAgICBzdGF0dXMgPSBwal9pb3F1ZXVlX2NyZWF0ZShwb29sLCA0LCAmaW9xdWV1ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgcGpfc3NsX3NvY2tfcGFyYW1fZGVmYXVsdCgmcGFyYW0pOworICAgIHBhcmFtLmNiLm9uX2FjY2VwdF9jb21wbGV0ZSA9ICZzc2xfb25fYWNjZXB0X2NvbXBsZXRlOworICAgIHBhcmFtLmNiLm9uX2Nvbm5lY3RfY29tcGxldGUgPSAmc3NsX29uX2Nvbm5lY3RfY29tcGxldGU7CisgICAgcGFyYW0uY2Iub25fZGF0YV9yZWFkID0gJnNzbF9vbl9kYXRhX3JlYWQ7CisgICAgcGFyYW0uY2Iub25fZGF0YV9zZW50ID0gJnNzbF9vbl9kYXRhX3NlbnQ7CisgICAgcGFyYW0uaW9xdWV1ZSA9IGlvcXVldWU7CisgICAgcGFyYW0uY2lwaGVycyA9IGNpcGhlcnM7CisKKyAgICAvKiBJbml0IGRlZmF1bHQgYmluZCBhZGRyZXNzICovCisgICAgeworCXBqX3N0cl90IHRtcF9zdDsKKwlwal9zb2NrYWRkcl9pbml0KFBKX0FGX0lORVQsICZhZGRyLCBwal9zdHJzZXQyKCZ0bXBfc3QsICIxMjcuMC4wLjEiKSwgMCk7CisgICAgfQorCisgICAgLyogPT09IFNFUlZFUiA9PT0gKi8KKyAgICBwYXJhbS5wcm90byA9IHNydl9wcm90bzsKKyAgICBwYXJhbS51c2VyX2RhdGEgPSAmc3RhdGVfc2VydjsKKyAgICBwYXJhbS5jaXBoZXJzX251bSA9IChzcnZfY2lwaGVyID09IC0xKT8gMCA6IDE7CisgICAgcGFyYW0ucmVxdWlyZV9jbGllbnRfY2VydCA9IHJlcV9jbGllbnRfY2VydDsKKyAgICBjaXBoZXJzWzBdID0gc3J2X2NpcGhlcjsKKworICAgIHN0YXRlX3NlcnYucG9vbCA9IHBvb2w7CisgICAgc3RhdGVfc2Vydi5lY2hvID0gUEpfVFJVRTsKKyAgICBzdGF0ZV9zZXJ2LmlzX3NlcnZlciA9IFBKX1RSVUU7CisgICAgc3RhdGVfc2Vydi5pc192ZXJib3NlID0gUEpfVFJVRTsKKworICAgIHN0YXR1cyA9IHBqX3NzbF9zb2NrX2NyZWF0ZShwb29sLCAmcGFyYW0sICZzc29ja19zZXJ2KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBTZXQgc2VydmVyIGNlcnQgKi8KKyAgICB7CisJcGpfc3RyX3QgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKworCXN0YXR1cyA9IHBqX3NzbF9jZXJ0X2xvYWRfZnJvbV9maWxlcyhwb29sLCAKKwkJCQkJICAgICBwal9zdHJzZXQyKCZ0bXAxLCAoY2hhciopQ0VSVF9DQV9GSUxFKSwgCisJCQkJCSAgICAgcGpfc3Ryc2V0MigmdG1wMiwgKGNoYXIqKUNFUlRfRklMRSksIAorCQkJCQkgICAgIHBqX3N0cnNldDIoJnRtcDMsIChjaGFyKilDRVJUX1BSSVZLRVlfRklMRSksIAorCQkJCQkgICAgIHBqX3N0cnNldDIoJnRtcDQsIChjaGFyKilDRVJUX1BSSVZLRVlfUEFTUyksIAorCQkJCQkgICAgICZjZXJ0KTsKKwlpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgZ290byBvbl9yZXR1cm47CisJfQorCisJc3RhdHVzID0gcGpfc3NsX3NvY2tfc2V0X2NlcnRpZmljYXRlKHNzb2NrX3NlcnYsIHBvb2wsIGNlcnQpOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBnb3RvIG9uX3JldHVybjsKKwl9CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfc3NsX3NvY2tfc3RhcnRfYWNjZXB0KHNzb2NrX3NlcnYsIHBvb2wsICZhZGRyLCBwal9zb2NrYWRkcl9nZXRfbGVuKCZhZGRyKSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogR2V0IGxpc3RlbmVyIGFkZHJlc3MgKi8KKyAgICB7CisJcGpfc3NsX3NvY2tfaW5mbyBpbmZvOworCisJcGpfc3NsX3NvY2tfZ2V0X2luZm8oc3NvY2tfc2VydiwgJmluZm8pOworCXBqX3NvY2thZGRyX2NwKCZsaXN0ZW5fYWRkciwgJmluZm8ubG9jYWxfYWRkcik7CisgICAgfQorCisgICAgLyogPT09IENMSUVOVCA9PT0gKi8KKyAgICBwYXJhbS5wcm90byA9IGNsaV9wcm90bzsKKyAgICBwYXJhbS51c2VyX2RhdGEgPSAmc3RhdGVfY2xpOworICAgIHBhcmFtLmNpcGhlcnNfbnVtID0gKGNsaV9jaXBoZXIgPT0gLTEpPyAwIDogMTsKKyAgICBjaXBoZXJzWzBdID0gY2xpX2NpcGhlcjsKKworICAgIHN0YXRlX2NsaS5wb29sID0gcG9vbDsKKyAgICBzdGF0ZV9jbGkuY2hlY2tfZWNobyA9IFBKX1RSVUU7CisgICAgc3RhdGVfY2xpLmlzX3ZlcmJvc2UgPSBQSl9UUlVFOworCisgICAgeworCXBqX3RpbWVfdmFsIG5vdzsKKworCXBqX2dldHRpbWVvZmRheSgmbm93KTsKKwlwal9zcmFuZCgodW5zaWduZWQpbm93LnNlYyk7CisJc3RhdGVfY2xpLnNlbmRfc3RyX2xlbiA9IChwal9yYW5kKCkgJSA1ICsgMSkgKiAxMDI0ICsgcGpfcmFuZCgpICUgMTAyNDsKKyAgICB9CisgICAgc3RhdGVfY2xpLnNlbmRfc3RyID0gKGNoYXIqKXBqX3Bvb2xfYWxsb2MocG9vbCwgc3RhdGVfY2xpLnNlbmRfc3RyX2xlbik7CisgICAgeworCXVuc2lnbmVkIGk7CisJZm9yIChpID0gMDsgaSA8IHN0YXRlX2NsaS5zZW5kX3N0cl9sZW47ICsraSkKKwkgICAgc3RhdGVfY2xpLnNlbmRfc3RyW2ldID0gKGNoYXIpKHBqX3JhbmQoKSAlIDI1Nik7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfc3NsX3NvY2tfY3JlYXRlKHBvb2wsICZwYXJhbSwgJnNzb2NrX2NsaSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogU2V0IGNlcnQgZm9yIGNsaWVudCAqLworICAgIHsKKworCWlmICghY2xpZW50X3Byb3ZpZGVfY2VydCkgeworCSAgICBwal9zdHJfdCB0bXAxLCB0bXAyOworCisJICAgIHBqX3N0cnNldDIoJnRtcDEsIChjaGFyKilDRVJUX0NBX0ZJTEUpOworCSAgICBwal9zdHJzZXQyKCZ0bXAyLCBOVUxMKTsKKwkgICAgc3RhdHVzID0gcGpfc3NsX2NlcnRfbG9hZF9mcm9tX2ZpbGVzKHBvb2wsIAorCQkJCQkJICZ0bXAxLCAmdG1wMiwgJnRtcDIsICZ0bXAyLAorCQkJCQkJICZjZXJ0KTsKKwkgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJCWdvdG8gb25fcmV0dXJuOworCSAgICB9CisJfQorCisJc3RhdHVzID0gcGpfc3NsX3NvY2tfc2V0X2NlcnRpZmljYXRlKHNzb2NrX2NsaSwgcG9vbCwgY2VydCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGdvdG8gb25fcmV0dXJuOworCX0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9zc2xfc29ja19zdGFydF9jb25uZWN0KHNzb2NrX2NsaSwgcG9vbCwgJmFkZHIsICZsaXN0ZW5fYWRkciwgcGpfc29ja2FkZHJfZ2V0X2xlbigmYWRkcikpOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCXNzbF9vbl9jb25uZWN0X2NvbXBsZXRlKHNzb2NrX2NsaSwgUEpfU1VDQ0VTUyk7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gUEpfRVBFTkRJTkcpIHsKKwlzdGF0dXMgPSBQSl9TVUNDRVNTOworICAgIH0gZWxzZSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogV2FpdCB1bnRpbCBldmVyeXRoaW5nIGhhcyBiZWVuIHNlbnQvcmVjZWl2ZWQgb3IgZXJyb3IgKi8KKyAgICB3aGlsZSAoIXN0YXRlX3NlcnYuZXJyICYmICFzdGF0ZV9jbGkuZXJyICYmICFzdGF0ZV9zZXJ2LmRvbmUgJiYgIXN0YXRlX2NsaS5kb25lKQorICAgIHsKKyNpZmRlZiBQSl9TWU1CSUFOCisJcGpfc3ltYmlhbm9zX3BvbGwoLTEsIDEwMDApOworI2Vsc2UKKwlwal90aW1lX3ZhbCBkZWxheSA9IHswLCAxMDB9OworCXBqX2lvcXVldWVfcG9sbChpb3F1ZXVlLCAmZGVsYXkpOworI2VuZGlmCisgICAgfQorCisgICAgLyogQ2xlYW4gdXAgc29ja2V0cyAqLworICAgIHsKKwlwal90aW1lX3ZhbCBkZWxheSA9IHswLCAxMDB9OworCXdoaWxlIChwal9pb3F1ZXVlX3BvbGwoaW9xdWV1ZSwgJmRlbGF5KSA+IDApOworICAgIH0KKworICAgIGlmIChzdGF0ZV9zZXJ2LmVyciB8fCBzdGF0ZV9jbGkuZXJyKSB7CisJaWYgKHN0YXRlX3NlcnYuZXJyICE9IFBKX1NVQ0NFU1MpCisJICAgIHN0YXR1cyA9IHN0YXRlX3NlcnYuZXJyOworCWVsc2UKKwkgICAgc3RhdHVzID0gc3RhdGVfY2xpLmVycjsKKworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIFBKX0xPRygzLCAoIiIsICIuLi5Eb25lISIpKTsKKyAgICBQSl9MT0coMywgKCIiLCAiLi4uLi5TZW50L3JlY3Y6ICVkLyVkIGJ5dGVzIiwgc3RhdGVfY2xpLnNlbnQsIHN0YXRlX2NsaS5yZWN2KSk7CisKK29uX3JldHVybjoKKyAgICBpZiAoc3NvY2tfc2VydikKKwlwal9zc2xfc29ja19jbG9zZShzc29ja19zZXJ2KTsKKyAgICBpZiAoc3NvY2tfY2xpICYmICFzdGF0ZV9jbGkuZXJyICYmICFzdGF0ZV9jbGkuZG9uZSkgCisJcGpfc3NsX3NvY2tfY2xvc2Uoc3NvY2tfY2xpKTsKKyAgICBpZiAoaW9xdWV1ZSkKKwlwal9pb3F1ZXVlX2Rlc3Ryb3koaW9xdWV1ZSk7CisgICAgaWYgKHBvb2wpCisJcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0aWMgcGpfYm9vbF90IGFzb2NrX29uX2RhdGFfcmVhZChwal9hY3RpdmVzb2NrX3QgKmFzb2NrLAorCQkJCSAgICB2b2lkICpkYXRhLAorCQkJCSAgICBwal9zaXplX3Qgc2l6ZSwKKwkJCQkgICAgcGpfc3RhdHVzX3Qgc3RhdHVzLAorCQkJCSAgICBwal9zaXplX3QgKnJlbWFpbmRlcikKK3sKKyAgICBzdHJ1Y3QgdGVzdF9zdGF0ZSAqc3QgPSAoc3RydWN0IHRlc3Rfc3RhdGUqKQorCQkJICAgICBwal9hY3RpdmVzb2NrX2dldF91c2VyX2RhdGEoYXNvY2spOworCisgICAgUEpfVU5VU0VEX0FSRyhkYXRhKTsKKyAgICBQSl9VTlVTRURfQVJHKHNpemUpOworICAgIFBKX1VOVVNFRF9BUkcocmVtYWluZGVyKTsKKworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWlmIChzdGF0dXMgPT0gUEpfRUVPRikgeworCSAgICBzdGF0dXMgPSBQSl9TVUNDRVNTOworCSAgICBzdC0+ZG9uZSA9IFBKX1RSVUU7CisJfSBlbHNlIHsKKwkgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgYXNvY2tfb25fZGF0YV9yZWFkKCkiLCBzdGF0dXMpOworCX0KKyAgICB9CisKKyAgICBzdC0+ZXJyID0gc3RhdHVzOworCisgICAgaWYgKHN0LT5lcnIgIT0gUEpfU1VDQ0VTUyB8fCBzdC0+ZG9uZSkgeworCXBqX2FjdGl2ZXNvY2tfY2xvc2UoYXNvY2spOworCWlmICghc3QtPmlzX3NlcnZlcikKKwkgICAgY2xpZW50c19udW0tLTsKKwlyZXR1cm4gUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFBKX1RSVUU7Cit9CisKKworc3RhdGljIHBqX2Jvb2xfdCBhc29ja19vbl9jb25uZWN0X2NvbXBsZXRlKHBqX2FjdGl2ZXNvY2tfdCAqYXNvY2ssCisJCQkJCSAgIHBqX3N0YXR1c190IHN0YXR1cykKK3sKKyAgICBzdHJ1Y3QgdGVzdF9zdGF0ZSAqc3QgPSAoc3RydWN0IHRlc3Rfc3RhdGUqKQorCQkJICAgICBwal9hY3RpdmVzb2NrX2dldF91c2VyX2RhdGEoYXNvY2spOworCisgICAgaWYgKHN0YXR1cyA9PSBQSl9TVUNDRVNTKSB7CisJdm9pZCAqcmVhZF9idWZbMV07CisKKwkvKiBTdGFydCByZWFkaW5nIGRhdGEgKi8KKwlyZWFkX2J1ZlswXSA9IHN0LT5yZWFkX2J1ZjsKKwlzdGF0dXMgPSBwal9hY3RpdmVzb2NrX3N0YXJ0X3JlYWQyKGFzb2NrLCBzdC0+cG9vbCwgc2l6ZW9mKHN0LT5yZWFkX2J1ZiksICh2b2lkKiopcmVhZF9idWYsIDApOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBhcHBfcGVycm9yKCIuLi5FUlJPUiBwal9zc2xfc29ja19zdGFydF9yZWFkMigpIiwgc3RhdHVzKTsKKwl9CisgICAgfQorCisgICAgc3QtPmVyciA9IHN0YXR1czsKKworICAgIGlmIChzdC0+ZXJyICE9IFBKX1NVQ0NFU1MpIHsKKwlwal9hY3RpdmVzb2NrX2Nsb3NlKGFzb2NrKTsKKwlpZiAoIXN0LT5pc19zZXJ2ZXIpCisJICAgIGNsaWVudHNfbnVtLS07CisJcmV0dXJuIFBKX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBQSl9UUlVFOworfQorCitzdGF0aWMgcGpfYm9vbF90IGFzb2NrX29uX2FjY2VwdF9jb21wbGV0ZShwal9hY3RpdmVzb2NrX3QgKmFzb2NrLAorCQkJCQkgIHBqX3NvY2tfdCBuZXdzb2NrLAorCQkJCQkgIGNvbnN0IHBqX3NvY2thZGRyX3QgKnNyY19hZGRyLAorCQkJCQkgIGludCBzcmNfYWRkcl9sZW4pCit7CisgICAgc3RydWN0IHRlc3Rfc3RhdGUgKnN0OworICAgIHZvaWQgKnJlYWRfYnVmWzFdOworICAgIHBqX2FjdGl2ZXNvY2tfdCAqbmV3X2Fzb2NrOworICAgIHBqX2FjdGl2ZXNvY2tfY2IgYXNvY2tfY2IgPSB7IDAgfTsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBQSl9VTlVTRURfQVJHKHNyY19hZGRyKTsKKyAgICBQSl9VTlVTRURfQVJHKHNyY19hZGRyX2xlbik7CisKKyAgICBzdCA9IChzdHJ1Y3QgdGVzdF9zdGF0ZSopIHBqX2FjdGl2ZXNvY2tfZ2V0X3VzZXJfZGF0YShhc29jayk7CisKKyAgICBhc29ja19jYi5vbl9kYXRhX3JlYWQgPSAmYXNvY2tfb25fZGF0YV9yZWFkOworICAgIHN0YXR1cyA9IHBqX2FjdGl2ZXNvY2tfY3JlYXRlKHN0LT5wb29sLCBuZXdzb2NrLCBwal9TT0NLX1NUUkVBTSgpLCBOVUxMLCAKKwkJCQkgIHN0LT5pb3F1ZXVlLCAmYXNvY2tfY2IsIHN0LCAmbmV3X2Fzb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBTdGFydCByZWFkaW5nIGRhdGEgKi8KKyAgICByZWFkX2J1ZlswXSA9IHN0LT5yZWFkX2J1ZjsKKyAgICBzdGF0dXMgPSBwal9hY3RpdmVzb2NrX3N0YXJ0X3JlYWQyKG5ld19hc29jaywgc3QtPnBvb2wsIAorCQkJCSAgICAgICBzaXplb2Yoc3QtPnJlYWRfYnVmKSwgCisJCQkJICAgICAgICh2b2lkKiopcmVhZF9idWYsIDApOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLkVSUk9SIHBqX3NzbF9zb2NrX3N0YXJ0X3JlYWQyKCkiLCBzdGF0dXMpOworICAgIH0KKworb25fcmV0dXJuOgorICAgIHN0LT5lcnIgPSBzdGF0dXM7CisKKyAgICBpZiAoc3QtPmVyciAhPSBQSl9TVUNDRVNTKQorCXBqX2FjdGl2ZXNvY2tfY2xvc2UobmV3X2Fzb2NrKTsKKworICAgIHJldHVybiBQSl9UUlVFOworfQorCisKKy8qIFJhdyBUQ1Agc29ja2V0IHRyeSB0byBjb25uZWN0IHRvIFNTTCBzb2NrZXQgc2VydmVyLCBvbmNlCisgKiBjb25uZWN0aW9uIGVzdGFibGlzaGVkLCBpdCB3aWxsIGp1c3QgZG8gbm90aGluZywgU1NMIHNvY2tldAorICogc2VydmVyIHNob3VsZCBiZSBhYmxlIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFmdGVyIHNwZWNpZmllZAorICogdGltZW91dCBwZXJpb2QgKHNldCBtc190aW1lb3V0IHRvIDAgdG8gZGlzYWJsZSB0aW1lcikuCisgKi8KK3N0YXRpYyBpbnQgY2xpZW50X25vbl9zc2wodW5zaWduZWQgbXNfdGltZW91dCkKK3sKKyAgICBwal9wb29sX3QgKnBvb2wgPSBOVUxMOworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSA9IE5VTEw7CisgICAgcGpfdGltZXJfaGVhcF90ICp0aW1lciA9IE5VTEw7CisgICAgcGpfc3NsX3NvY2tfdCAqc3NvY2tfc2VydiA9IE5VTEw7CisgICAgcGpfYWN0aXZlc29ja190ICphc29ja19jbGkgPSBOVUxMOworICAgIHBqX2FjdGl2ZXNvY2tfY2IgYXNvY2tfY2IgPSB7IDAgfTsKKyAgICBwal9zb2NrX3Qgc29jayA9IFBKX0lOVkFMSURfU09DS0VUOworICAgIHBqX3NzbF9zb2NrX3BhcmFtIHBhcmFtOworICAgIHN0cnVjdCB0ZXN0X3N0YXRlIHN0YXRlX3NlcnYgPSB7IDAgfTsKKyAgICBzdHJ1Y3QgdGVzdF9zdGF0ZSBzdGF0ZV9jbGkgPSB7IDAgfTsKKyAgICBwal9zb2NrYWRkciBsaXN0ZW5fYWRkcjsKKyAgICBwal9zc2xfY2VydF90ICpjZXJ0ID0gTlVMTDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCAic3NsX2FjY2VwdF9yYXdfdGNwIiwgMjU2LCAyNTYsIE5VTEwpOworCisgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9jcmVhdGUocG9vbCwgNCwgJmlvcXVldWUpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX3RpbWVyX2hlYXBfY3JlYXRlKHBvb2wsIDQsICZ0aW1lcik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogU2V0IGNlcnQgKi8KKyAgICB7CisJcGpfc3RyX3QgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKwlzdGF0dXMgPSBwal9zc2xfY2VydF9sb2FkX2Zyb21fZmlsZXMocG9vbCwgCisJCQkJCSAgICAgcGpfc3Ryc2V0MigmdG1wMSwgKGNoYXIqKUNFUlRfQ0FfRklMRSksIAorCQkJCQkgICAgIHBqX3N0cnNldDIoJnRtcDIsIChjaGFyKilDRVJUX0ZJTEUpLCAKKwkJCQkJICAgICBwal9zdHJzZXQyKCZ0bXAzLCAoY2hhciopQ0VSVF9QUklWS0VZX0ZJTEUpLCAKKwkJCQkJICAgICBwal9zdHJzZXQyKCZ0bXA0LCAoY2hhciopQ0VSVF9QUklWS0VZX1BBU1MpLCAKKwkJCQkJICAgICAmY2VydCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGdvdG8gb25fcmV0dXJuOworCX0KKyAgICB9CisKKyAgICBwal9zc2xfc29ja19wYXJhbV9kZWZhdWx0KCZwYXJhbSk7CisgICAgcGFyYW0uY2Iub25fYWNjZXB0X2NvbXBsZXRlID0gJnNzbF9vbl9hY2NlcHRfY29tcGxldGU7CisgICAgcGFyYW0uY2Iub25fZGF0YV9yZWFkID0gJnNzbF9vbl9kYXRhX3JlYWQ7CisgICAgcGFyYW0uY2Iub25fZGF0YV9zZW50ID0gJnNzbF9vbl9kYXRhX3NlbnQ7CisgICAgcGFyYW0uaW9xdWV1ZSA9IGlvcXVldWU7CisgICAgcGFyYW0udGltZXJfaGVhcCA9IHRpbWVyOworICAgIHBhcmFtLnRpbWVvdXQuc2VjID0gMDsKKyAgICBwYXJhbS50aW1lb3V0Lm1zZWMgPSBtc190aW1lb3V0OworICAgIHBqX3RpbWVfdmFsX25vcm1hbGl6ZSgmcGFyYW0udGltZW91dCk7CisKKyAgICAvKiBTRVJWRVIgKi8KKyAgICBwYXJhbS51c2VyX2RhdGEgPSAmc3RhdGVfc2VydjsKKyAgICBzdGF0ZV9zZXJ2LnBvb2wgPSBwb29sOworICAgIHN0YXRlX3NlcnYuaXNfc2VydmVyID0gUEpfVFJVRTsKKyAgICBzdGF0ZV9zZXJ2LmlzX3ZlcmJvc2UgPSBQSl9UUlVFOworCisgICAgc3RhdHVzID0gcGpfc3NsX3NvY2tfY3JlYXRlKHBvb2wsICZwYXJhbSwgJnNzb2NrX3NlcnYpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX3NzbF9zb2NrX3NldF9jZXJ0aWZpY2F0ZShzc29ja19zZXJ2LCBwb29sLCBjZXJ0KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBJbml0IGJpbmQgYWRkcmVzcyAqLworICAgIHsKKwlwal9zdHJfdCB0bXBfc3Q7CisJcGpfc29ja2FkZHJfaW5pdChQSl9BRl9JTkVULCAmbGlzdGVuX2FkZHIsIHBqX3N0cnNldDIoJnRtcF9zdCwgIjEyNy4wLjAuMSIpLCAwKTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9zc2xfc29ja19zdGFydF9hY2NlcHQoc3NvY2tfc2VydiwgcG9vbCwgJmxpc3Rlbl9hZGRyLCBwal9zb2NrYWRkcl9nZXRfbGVuKCZsaXN0ZW5fYWRkcikpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBsaXN0ZW5lciBhZGRyZXNzICovCisgICAgeworCXBqX3NzbF9zb2NrX2luZm8gaW5mbzsKKworCXBqX3NzbF9zb2NrX2dldF9pbmZvKHNzb2NrX3NlcnYsICZpbmZvKTsKKwlwal9zb2NrYWRkcl9jcCgmbGlzdGVuX2FkZHIsICZpbmZvLmxvY2FsX2FkZHIpOworICAgIH0KKworICAgIC8qIENMSUVOVCAqLworICAgIHN0YXRlX2NsaS5wb29sID0gcG9vbDsKKyAgICBzdGF0dXMgPSBwal9zb2NrX3NvY2tldChwal9BRl9JTkVUKCksIHBqX1NPQ0tfU1RSRUFNKCksIDAsICZzb2NrKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBhc29ja19jYi5vbl9jb25uZWN0X2NvbXBsZXRlID0gJmFzb2NrX29uX2Nvbm5lY3RfY29tcGxldGU7CisgICAgYXNvY2tfY2Iub25fZGF0YV9yZWFkID0gJmFzb2NrX29uX2RhdGFfcmVhZDsKKyAgICBzdGF0dXMgPSBwal9hY3RpdmVzb2NrX2NyZWF0ZShwb29sLCBzb2NrLCBwal9TT0NLX1NUUkVBTSgpLCBOVUxMLCAKKwkJCQkgIGlvcXVldWUsICZhc29ja19jYiwgJnN0YXRlX2NsaSwgJmFzb2NrX2NsaSk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfYWN0aXZlc29ja19zdGFydF9jb25uZWN0KGFzb2NrX2NsaSwgcG9vbCwgKHBqX3NvY2thZGRyX3QqKSZsaXN0ZW5fYWRkciwgCisJCQkJCSBwal9zb2NrYWRkcl9nZXRfbGVuKCZsaXN0ZW5fYWRkcikpOworICAgIGlmIChzdGF0dXMgPT0gUEpfU1VDQ0VTUykgeworCWFzb2NrX29uX2Nvbm5lY3RfY29tcGxldGUoYXNvY2tfY2xpLCBQSl9TVUNDRVNTKTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBQSl9FUEVORElORykgeworCXN0YXR1cyA9IFBKX1NVQ0NFU1M7CisgICAgfSBlbHNlIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBXYWl0IHVudGlsIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gc2VudC9yZWNlaXZlZCBvciBlcnJvciAqLworICAgIHdoaWxlICghc3RhdGVfc2Vydi5lcnIgJiYgIXN0YXRlX2NsaS5lcnIgJiYgIXN0YXRlX3NlcnYuZG9uZSAmJiAhc3RhdGVfY2xpLmRvbmUpCisgICAgeworI2lmZGVmIFBKX1NZTUJJQU4KKwlwal9zeW1iaWFub3NfcG9sbCgtMSwgMTAwMCk7CisjZWxzZQorCXBqX3RpbWVfdmFsIGRlbGF5ID0gezAsIDEwMH07CisJcGpfaW9xdWV1ZV9wb2xsKGlvcXVldWUsICZkZWxheSk7CisJcGpfdGltZXJfaGVhcF9wb2xsKHRpbWVyLCAmZGVsYXkpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKHN0YXRlX3NlcnYuZXJyIHx8IHN0YXRlX2NsaS5lcnIpIHsKKwlpZiAoc3RhdGVfc2Vydi5lcnIgIT0gUEpfU1VDQ0VTUykKKwkgICAgc3RhdHVzID0gc3RhdGVfc2Vydi5lcnI7CisJZWxzZQorCSAgICBzdGF0dXMgPSBzdGF0ZV9jbGkuZXJyOworCisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgUEpfTE9HKDMsICgiIiwgIi4uLkRvbmUhIikpOworCitvbl9yZXR1cm46CisgICAgaWYgKHNzb2NrX3NlcnYpCisJcGpfc3NsX3NvY2tfY2xvc2Uoc3NvY2tfc2Vydik7CisgICAgaWYgKGFzb2NrX2NsaSAmJiAhc3RhdGVfY2xpLmVyciAmJiAhc3RhdGVfY2xpLmRvbmUpCisJcGpfYWN0aXZlc29ja19jbG9zZShhc29ja19jbGkpOworICAgIGlmICh0aW1lcikKKwlwal90aW1lcl9oZWFwX2Rlc3Ryb3kodGltZXIpOworICAgIGlmIChpb3F1ZXVlKQorCXBqX2lvcXVldWVfZGVzdHJveShpb3F1ZXVlKTsKKyAgICBpZiAocG9vbCkKKwlwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qIFNTTCBzb2NrZXQgdHJ5IHRvIGNvbm5lY3QgdG8gcmF3IFRDUCBzb2NrZXQgc2VydmVyLCBvbmNlCisgKiBjb25uZWN0aW9uIGVzdGFibGlzaGVkLCBTU0wgc29ja2V0IHdpbGwgdHJ5IHRvIHBlcmZvcm0gU1NMCisgKiBoYW5kc2hha2UuIFNTTCBjbGllbnQgc29ja2V0IHNob3VsZCBiZSBhYmxlIHRvIGNsb3NlIHRoZQorICogY29ubmVjdGlvbiBhZnRlciBzcGVjaWZpZWQgdGltZW91dCBwZXJpb2QgKHNldCBtc190aW1lb3V0IHRvIAorICogMCB0byBkaXNhYmxlIHRpbWVyKS4KKyAqLworc3RhdGljIGludCBzZXJ2ZXJfbm9uX3NzbCh1bnNpZ25lZCBtc190aW1lb3V0KQoreworICAgIHBqX3Bvb2xfdCAqcG9vbCA9IE5VTEw7CisgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlID0gTlVMTDsKKyAgICBwal90aW1lcl9oZWFwX3QgKnRpbWVyID0gTlVMTDsKKyAgICBwal9hY3RpdmVzb2NrX3QgKmFzb2NrX3NlcnYgPSBOVUxMOworICAgIHBqX3NzbF9zb2NrX3QgKnNzb2NrX2NsaSA9IE5VTEw7CisgICAgcGpfYWN0aXZlc29ja19jYiBhc29ja19jYiA9IHsgMCB9OworICAgIHBqX3NvY2tfdCBzb2NrID0gUEpfSU5WQUxJRF9TT0NLRVQ7CisgICAgcGpfc3NsX3NvY2tfcGFyYW0gcGFyYW07CisgICAgc3RydWN0IHRlc3Rfc3RhdGUgc3RhdGVfc2VydiA9IHsgMCB9OworICAgIHN0cnVjdCB0ZXN0X3N0YXRlIHN0YXRlX2NsaSA9IHsgMCB9OworICAgIHBqX3NvY2thZGRyIGFkZHIsIGxpc3Rlbl9hZGRyOworICAgIHBqX3N0YXR1c190IHN0YXR1czsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sICJzc2xfY29ubmVjdF9yYXdfdGNwIiwgMjU2LCAyNTYsIE5VTEwpOworCisgICAgc3RhdHVzID0gcGpfaW9xdWV1ZV9jcmVhdGUocG9vbCwgNCwgJmlvcXVldWUpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX3RpbWVyX2hlYXBfY3JlYXRlKHBvb2wsIDQsICZ0aW1lcik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogU0VSVkVSICovCisgICAgc3RhdGVfc2Vydi5wb29sID0gcG9vbDsKKyAgICBzdGF0ZV9zZXJ2LmlvcXVldWUgPSBpb3F1ZXVlOworCisgICAgc3RhdHVzID0gcGpfc29ja19zb2NrZXQocGpfQUZfSU5FVCgpLCBwal9TT0NLX1NUUkVBTSgpLCAwLCAmc29jayk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogSW5pdCBiaW5kIGFkZHJlc3MgKi8KKyAgICB7CisJcGpfc3RyX3QgdG1wX3N0OworCXBqX3NvY2thZGRyX2luaXQoUEpfQUZfSU5FVCwgJmxpc3Rlbl9hZGRyLCBwal9zdHJzZXQyKCZ0bXBfc3QsICIxMjcuMC4wLjEiKSwgMCk7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfc29ja19iaW5kKHNvY2ssIChwal9zb2NrYWRkcl90KikmbGlzdGVuX2FkZHIsIAorCQkJICBwal9zb2NrYWRkcl9nZXRfbGVuKChwal9zb2NrYWRkcl90KikmbGlzdGVuX2FkZHIpKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9zb2NrX2xpc3Rlbihzb2NrLCBQSl9TT01BWENPTk4pOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIGFzb2NrX2NiLm9uX2FjY2VwdF9jb21wbGV0ZSA9ICZhc29ja19vbl9hY2NlcHRfY29tcGxldGU7CisgICAgc3RhdHVzID0gcGpfYWN0aXZlc29ja19jcmVhdGUocG9vbCwgc29jaywgcGpfU09DS19TVFJFQU0oKSwgTlVMTCwgCisJCQkJICBpb3F1ZXVlLCAmYXNvY2tfY2IsICZzdGF0ZV9zZXJ2LCAmYXNvY2tfc2Vydik7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfYWN0aXZlc29ja19zdGFydF9hY2NlcHQoYXNvY2tfc2VydiwgcG9vbCk7CisgICAgaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKQorCWdvdG8gb25fcmV0dXJuOworCisgICAgLyogVXBkYXRlIGxpc3RlbmVyIGFkZHJlc3MgKi8KKyAgICB7CisJaW50IGFkZHJfbGVuOworCisJYWRkcl9sZW4gPSBzaXplb2YobGlzdGVuX2FkZHIpOworCXBqX3NvY2tfZ2V0c29ja25hbWUoc29jaywgKHBqX3NvY2thZGRyX3QqKSZsaXN0ZW5fYWRkciwgJmFkZHJfbGVuKTsKKyAgICB9CisKKyAgICAvKiBDTElFTlQgKi8KKyAgICBwal9zc2xfc29ja19wYXJhbV9kZWZhdWx0KCZwYXJhbSk7CisgICAgcGFyYW0uY2Iub25fY29ubmVjdF9jb21wbGV0ZSA9ICZzc2xfb25fY29ubmVjdF9jb21wbGV0ZTsKKyAgICBwYXJhbS5jYi5vbl9kYXRhX3JlYWQgPSAmc3NsX29uX2RhdGFfcmVhZDsKKyAgICBwYXJhbS5jYi5vbl9kYXRhX3NlbnQgPSAmc3NsX29uX2RhdGFfc2VudDsKKyAgICBwYXJhbS5pb3F1ZXVlID0gaW9xdWV1ZTsKKyAgICBwYXJhbS50aW1lcl9oZWFwID0gdGltZXI7CisgICAgcGFyYW0udGltZW91dC5zZWMgPSAwOworICAgIHBhcmFtLnRpbWVvdXQubXNlYyA9IG1zX3RpbWVvdXQ7CisgICAgcGpfdGltZV92YWxfbm9ybWFsaXplKCZwYXJhbS50aW1lb3V0KTsKKyAgICBwYXJhbS51c2VyX2RhdGEgPSAmc3RhdGVfY2xpOworCisgICAgc3RhdGVfY2xpLnBvb2wgPSBwb29sOworICAgIHN0YXRlX2NsaS5pc19zZXJ2ZXIgPSBQSl9GQUxTRTsKKyAgICBzdGF0ZV9jbGkuaXNfdmVyYm9zZSA9IFBKX1RSVUU7CisKKyAgICBzdGF0dXMgPSBwal9zc2xfc29ja19jcmVhdGUocG9vbCwgJnBhcmFtLCAmc3NvY2tfY2xpKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBJbml0IGRlZmF1bHQgYmluZCBhZGRyZXNzICovCisgICAgeworCXBqX3N0cl90IHRtcF9zdDsKKwlwal9zb2NrYWRkcl9pbml0KFBKX0FGX0lORVQsICZhZGRyLCBwal9zdHJzZXQyKCZ0bXBfc3QsICIxMjcuMC4wLjEiKSwgMCk7CisgICAgfQorCisgICAgc3RhdHVzID0gcGpfc3NsX3NvY2tfc3RhcnRfY29ubmVjdChzc29ja19jbGksIHBvb2wsIAorCQkJCSAgICAgICAocGpfc29ja2FkZHJfdCopJmFkZHIsIAorCQkJCSAgICAgICAocGpfc29ja2FkZHJfdCopJmxpc3Rlbl9hZGRyLCAKKwkJCQkgICAgICAgcGpfc29ja2FkZHJfZ2V0X2xlbigmbGlzdGVuX2FkZHIpKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX0VQRU5ESU5HKSB7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgLyogV2FpdCB1bnRpbCBldmVyeXRoaW5nIGhhcyBiZWVuIHNlbnQvcmVjZWl2ZWQgb3IgZXJyb3IgKi8KKyAgICB3aGlsZSAoKCFzdGF0ZV9zZXJ2LmVyciAmJiAhc3RhdGVfc2Vydi5kb25lKSB8fCAoIXN0YXRlX2NsaS5lcnIgJiYgIXN0YXRlX2NsaS5kb25lKSkKKyAgICB7CisjaWZkZWYgUEpfU1lNQklBTgorCXBqX3N5bWJpYW5vc19wb2xsKC0xLCAxMDAwKTsKKyNlbHNlCisJcGpfdGltZV92YWwgZGVsYXkgPSB7MCwgMTAwfTsKKwlwal9pb3F1ZXVlX3BvbGwoaW9xdWV1ZSwgJmRlbGF5KTsKKwlwal90aW1lcl9oZWFwX3BvbGwodGltZXIsICZkZWxheSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoc3RhdGVfc2Vydi5lcnIgfHwgc3RhdGVfY2xpLmVycikgeworCWlmIChzdGF0ZV9jbGkuZXJyICE9IFBKX1NVQ0NFU1MpCisJICAgIHN0YXR1cyA9IHN0YXRlX2NsaS5lcnI7CisJZWxzZQorCSAgICBzdGF0dXMgPSBzdGF0ZV9zZXJ2LmVycjsKKworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIFBKX0xPRygzLCAoIiIsICIuLi5Eb25lISIpKTsKKworb25fcmV0dXJuOgorICAgIGlmIChhc29ja19zZXJ2KQorCXBqX2FjdGl2ZXNvY2tfY2xvc2UoYXNvY2tfc2Vydik7CisgICAgaWYgKHNzb2NrX2NsaSAmJiAhc3RhdGVfY2xpLmVyciAmJiAhc3RhdGVfY2xpLmRvbmUpCisJcGpfc3NsX3NvY2tfY2xvc2Uoc3NvY2tfY2xpKTsKKyAgICBpZiAodGltZXIpCisJcGpfdGltZXJfaGVhcF9kZXN0cm95KHRpbWVyKTsKKyAgICBpZiAoaW9xdWV1ZSkKKwlwal9pb3F1ZXVlX2Rlc3Ryb3koaW9xdWV1ZSk7CisgICAgaWYgKHBvb2wpCisJcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBUZXN0IHdpbGwgcGVyZm9ybSBtdWx0aXBsZSBjbGllbnRzIHRyeWluZyB0byBjb25uZWN0IHRvIHNpbmdsZSBzZXJ2ZXIuCisgKiBPbmNlIFNTTCBjb25uZWN0aW9uIGVzdGFibGlzaGVkLCBlY2hvIHRlc3Qgd2lsbCBiZSBwZXJmb3JtZWQuCisgKi8KK3N0YXRpYyBpbnQgcGVyZl90ZXN0KHVuc2lnbmVkIGNsaWVudHMsIHVuc2lnbmVkIG1zX2hhbmRzaGFrZV90aW1lb3V0KQoreworICAgIHBqX3Bvb2xfdCAqcG9vbCA9IE5VTEw7CisgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlID0gTlVMTDsKKyAgICBwal90aW1lcl9oZWFwX3QgKnRpbWVyID0gTlVMTDsKKyAgICBwal9zc2xfc29ja190ICpzc29ja19zZXJ2ID0gTlVMTDsKKyAgICBwal9zc2xfc29ja190ICoqc3NvY2tfY2xpID0gTlVMTDsKKyAgICBwal9zc2xfc29ja19wYXJhbSBwYXJhbTsKKyAgICBzdHJ1Y3QgdGVzdF9zdGF0ZSBzdGF0ZV9zZXJ2ID0geyAwIH07CisgICAgc3RydWN0IHRlc3Rfc3RhdGUgKnN0YXRlX2NsaSA9IE5VTEw7CisgICAgcGpfc29ja2FkZHIgYWRkciwgbGlzdGVuX2FkZHI7CisgICAgcGpfc3NsX2NlcnRfdCAqY2VydCA9IE5VTEw7CisgICAgcGpfc3RhdHVzX3Qgc3RhdHVzOworICAgIHVuc2lnbmVkIGksIGNsaV9lcnIgPSAwOworICAgIHBqX3NpemVfdCB0b3Rfc2VudCA9IDAsIHRvdF9yZWN2ID0gMDsKKyAgICBwal90aW1lX3ZhbCBzdGFydDsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sICJzc2xfcGVyZiIsIDI1NiwgMjU2LCBOVUxMKTsKKworICAgIHN0YXR1cyA9IHBqX2lvcXVldWVfY3JlYXRlKHBvb2wsIFBKX0lPUVVFVUVfTUFYX0hBTkRMRVMsICZpb3F1ZXVlKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal90aW1lcl9oZWFwX2NyZWF0ZShwb29sLCBQSl9JT1FVRVVFX01BWF9IQU5ETEVTLCAmdGltZXIpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIC8qIFNldCBjZXJ0ICovCisgICAgeworCXBqX3N0cl90IHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisKKwlzdGF0dXMgPSBwal9zc2xfY2VydF9sb2FkX2Zyb21fZmlsZXMocG9vbCwgCisJCQkJCSAgICAgcGpfc3Ryc2V0MigmdG1wMSwgKGNoYXIqKUNFUlRfQ0FfRklMRSksIAorCQkJCQkgICAgIHBqX3N0cnNldDIoJnRtcDIsIChjaGFyKilDRVJUX0ZJTEUpLCAKKwkJCQkJICAgICBwal9zdHJzZXQyKCZ0bXAzLCAoY2hhciopQ0VSVF9QUklWS0VZX0ZJTEUpLCAKKwkJCQkJICAgICBwal9zdHJzZXQyKCZ0bXA0LCAoY2hhciopQ0VSVF9QUklWS0VZX1BBU1MpLCAKKwkJCQkJICAgICAmY2VydCk7CisJaWYgKHN0YXR1cyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGdvdG8gb25fcmV0dXJuOworCX0KKyAgICB9CisKKyAgICBwal9zc2xfc29ja19wYXJhbV9kZWZhdWx0KCZwYXJhbSk7CisgICAgcGFyYW0uY2Iub25fYWNjZXB0X2NvbXBsZXRlID0gJnNzbF9vbl9hY2NlcHRfY29tcGxldGU7CisgICAgcGFyYW0uY2Iub25fY29ubmVjdF9jb21wbGV0ZSA9ICZzc2xfb25fY29ubmVjdF9jb21wbGV0ZTsKKyAgICBwYXJhbS5jYi5vbl9kYXRhX3JlYWQgPSAmc3NsX29uX2RhdGFfcmVhZDsKKyAgICBwYXJhbS5jYi5vbl9kYXRhX3NlbnQgPSAmc3NsX29uX2RhdGFfc2VudDsKKyAgICBwYXJhbS5pb3F1ZXVlID0gaW9xdWV1ZTsKKyAgICBwYXJhbS50aW1lcl9oZWFwID0gdGltZXI7CisgICAgcGFyYW0udGltZW91dC5zZWMgPSAwOworICAgIHBhcmFtLnRpbWVvdXQubXNlYyA9IG1zX2hhbmRzaGFrZV90aW1lb3V0OworICAgIHBqX3RpbWVfdmFsX25vcm1hbGl6ZSgmcGFyYW0udGltZW91dCk7CisKKyAgICAvKiBJbml0IGRlZmF1bHQgYmluZCBhZGRyZXNzICovCisgICAgeworCXBqX3N0cl90IHRtcF9zdDsKKwlwal9zb2NrYWRkcl9pbml0KFBKX0FGX0lORVQsICZhZGRyLCBwal9zdHJzZXQyKCZ0bXBfc3QsICIxMjcuMC4wLjEiKSwgMCk7CisgICAgfQorCisgICAgLyogU0VSVkVSICovCisgICAgcGFyYW0udXNlcl9kYXRhID0gJnN0YXRlX3NlcnY7CisKKyAgICBzdGF0ZV9zZXJ2LnBvb2wgPSBwb29sOworICAgIHN0YXRlX3NlcnYuZWNobyA9IFBKX1RSVUU7CisgICAgc3RhdGVfc2Vydi5pc19zZXJ2ZXIgPSBQSl9UUlVFOworCisgICAgc3RhdHVzID0gcGpfc3NsX3NvY2tfY3JlYXRlKHBvb2wsICZwYXJhbSwgJnNzb2NrX3NlcnYpOworICAgIGlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCWdvdG8gb25fcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IHBqX3NzbF9zb2NrX3NldF9jZXJ0aWZpY2F0ZShzc29ja19zZXJ2LCBwb29sLCBjZXJ0KTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwal9zc2xfc29ja19zdGFydF9hY2NlcHQoc3NvY2tfc2VydiwgcG9vbCwgJmFkZHIsIHBqX3NvY2thZGRyX2dldF9sZW4oJmFkZHIpKTsKKyAgICBpZiAoc3RhdHVzICE9IFBKX1NVQ0NFU1MpIHsKKwlnb3RvIG9uX3JldHVybjsKKyAgICB9CisKKyAgICAvKiBHZXQgbGlzdGVuaW5nIGFkZHJlc3MgZm9yIGNsaWVudHMgdG8gY29ubmVjdCB0byAqLworICAgIHsKKwlwal9zc2xfc29ja19pbmZvIGluZm87CisJY2hhciBidWZbNjRdOworCisJcGpfc3NsX3NvY2tfZ2V0X2luZm8oc3NvY2tfc2VydiwgJmluZm8pOworCXBqX3NvY2thZGRyX2NwKCZsaXN0ZW5fYWRkciwgJmluZm8ubG9jYWxfYWRkcik7CisKKwlwal9zb2NrYWRkcl9wcmludCgocGpfc29ja2FkZHJfdCopJmxpc3Rlbl9hZGRyLCBidWYsIHNpemVvZihidWYpLCAxKTsKKwlQSl9MT0coMywgKCIiLCAiLi4uTGlzdGVuZXIgcmVhZHkgYXQgJXMiLCBidWYpKTsKKyAgICB9CisKKworICAgIC8qIENMSUVOVFMgKi8KKyAgICBjbGllbnRzX251bSA9IGNsaWVudHM7CisgICAgcGFyYW0udGltZW91dC5zZWMgPSAwOworICAgIHBhcmFtLnRpbWVvdXQubXNlYyA9IDA7CisKKyAgICAvKiBJbml0IHJhbmRvbSBzZWVkICovCisgICAgeworCXBqX3RpbWVfdmFsIG5vdzsKKworCXBqX2dldHRpbWVvZmRheSgmbm93KTsKKwlwal9zcmFuZCgodW5zaWduZWQpbm93LnNlYyk7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgU1NMIHNvY2tldCBwb2ludGVycyBhbmQgdGVzdCBzdGF0ZSAqLworICAgIHNzb2NrX2NsaSA9IChwal9zc2xfc29ja190KiopcGpfcG9vbF9jYWxsb2MocG9vbCwgY2xpZW50cywgc2l6ZW9mKHBqX3NzbF9zb2NrX3QqKSk7CisgICAgc3RhdGVfY2xpID0gKHN0cnVjdCB0ZXN0X3N0YXRlKilwal9wb29sX2NhbGxvYyhwb29sLCBjbGllbnRzLCBzaXplb2Yoc3RydWN0IHRlc3Rfc3RhdGUpKTsKKworICAgIC8qIEdldCBzdGFydCB0aW1lc3RhbXAgKi8KKyAgICBwal9nZXR0aW1lb2ZkYXkoJnN0YXJ0KTsKKworICAgIC8qIFNldHVwIGNsaWVudHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY2xpZW50czsgKytpKSB7CisJcGFyYW0udXNlcl9kYXRhID0gJnN0YXRlX2NsaVtpXTsKKworCXN0YXRlX2NsaVtpXS5wb29sID0gcG9vbDsKKwlzdGF0ZV9jbGlbaV0uY2hlY2tfZWNobyA9IFBKX1RSVUU7CisJc3RhdGVfY2xpW2ldLnNlbmRfc3RyX2xlbiA9IChwal9yYW5kKCkgJSA1ICsgMSkgKiAxMDI0ICsgcGpfcmFuZCgpICUgMTAyNDsKKwlzdGF0ZV9jbGlbaV0uc2VuZF9zdHIgPSAoY2hhciopcGpfcG9vbF9hbGxvYyhwb29sLCBzdGF0ZV9jbGlbaV0uc2VuZF9zdHJfbGVuKTsKKwl7CisJICAgIHVuc2lnbmVkIGo7CisJICAgIGZvciAoaiA9IDA7IGogPCBzdGF0ZV9jbGlbaV0uc2VuZF9zdHJfbGVuOyArK2opCisJCXN0YXRlX2NsaVtpXS5zZW5kX3N0cltqXSA9IChjaGFyKShwal9yYW5kKCkgJSAyNTYpOworCX0KKworCXN0YXR1cyA9IHBqX3NzbF9zb2NrX2NyZWF0ZShwb29sLCAmcGFyYW0sICZzc29ja19jbGlbaV0pOworCWlmIChzdGF0dXMgIT0gUEpfU1VDQ0VTUykgeworCSAgICBhcHBfcGVycm9yKCIuLi5FUlJPUiBwal9zc2xfc29ja19jcmVhdGUoKSIsIHN0YXR1cyk7CisJICAgIGNsaV9lcnIrKzsKKwkgICAgY2xpZW50c19udW0tLTsKKwkgICAgY29udGludWU7CisJfQorCisJc3RhdHVzID0gcGpfc3NsX3NvY2tfc3RhcnRfY29ubmVjdChzc29ja19jbGlbaV0sIHBvb2wsICZhZGRyLCAmbGlzdGVuX2FkZHIsIHBqX3NvY2thZGRyX2dldF9sZW4oJmFkZHIpKTsKKwlpZiAoc3RhdHVzID09IFBKX1NVQ0NFU1MpIHsKKwkgICAgc3NsX29uX2Nvbm5lY3RfY29tcGxldGUoc3NvY2tfY2xpW2ldLCBQSl9TVUNDRVNTKTsKKwl9IGVsc2UgaWYgKHN0YXR1cyA9PSBQSl9FUEVORElORykgeworCSAgICBzdGF0dXMgPSBQSl9TVUNDRVNTOworCX0gZWxzZSB7CisJICAgIGFwcF9wZXJyb3IoIi4uLkVSUk9SIHBqX3NzbF9zb2NrX2NyZWF0ZSgpIiwgc3RhdHVzKTsKKwkgICAgcGpfc3NsX3NvY2tfY2xvc2Uoc3NvY2tfY2xpW2ldKTsKKwkgICAgc3NvY2tfY2xpW2ldID0gTlVMTDsKKwkgICAgY2xpZW50c19udW0tLTsKKwkgICAgY2xpX2VycisrOworCSAgICBjb250aW51ZTsKKwl9CisKKwkvKiBHaXZlIGNoYW5jZSB0byBzZXJ2ZXIgdG8gYWNjZXB0IHRoaXMgY2xpZW50ICovCisJeworCSAgICB1bnNpZ25lZCBuID0gNTsKKworI2lmZGVmIFBKX1NZTUJJQU4KKwkgICAgd2hpbGUobiAmJiBwal9zeW1iaWFub3NfcG9sbCgtMSwgMTAwMCkpCisJCW4tLTsKKyNlbHNlCisJICAgIHBqX3RpbWVfdmFsIGRlbGF5ID0gezAsIDEwMH07CisJICAgIHdoaWxlKG4gJiYgcGpfaW9xdWV1ZV9wb2xsKGlvcXVldWUsICZkZWxheSkgPiAwKQorCQluLS07CisjZW5kaWYKKwl9CisgICAgfQorCisgICAgLyogV2FpdCB1bnRpbCBldmVyeXRoaW5nIGhhcyBiZWVuIHNlbnQvcmVjZWl2ZWQgb3IgZXJyb3IgKi8KKyAgICB3aGlsZSAoY2xpZW50c19udW0pCisgICAgeworI2lmZGVmIFBKX1NZTUJJQU4KKwlwal9zeW1iaWFub3NfcG9sbCgtMSwgMTAwMCk7CisjZWxzZQorCXBqX3RpbWVfdmFsIGRlbGF5ID0gezAsIDEwMH07CisJcGpfaW9xdWV1ZV9wb2xsKGlvcXVldWUsICZkZWxheSk7CisJcGpfdGltZXJfaGVhcF9wb2xsKHRpbWVyLCAmZGVsYXkpOworI2VuZGlmCisgICAgfQorCisgICAgLyogQ2xlYW4gdXAgc29ja2V0cyAqLworICAgIHsKKwlwal90aW1lX3ZhbCBkZWxheSA9IHswLCA1MDB9OworCXdoaWxlIChwal9pb3F1ZXVlX3BvbGwoaW9xdWV1ZSwgJmRlbGF5KSA+IDApOworICAgIH0KKworICAgIGlmIChzdGF0ZV9zZXJ2LmVyciAhPSBQSl9TVUNDRVNTKSB7CisJc3RhdHVzID0gc3RhdGVfc2Vydi5lcnI7CisJZ290byBvbl9yZXR1cm47CisgICAgfQorCisgICAgUEpfTE9HKDMsICgiIiwgIi4uLkRvbmUhIikpOworCisgICAgLyogU1NMIHNldHVwIGFuZCBkYXRhIHRyYW5zZmVyIGR1cmF0aW9uICovCisgICAgeworCXBqX3RpbWVfdmFsIHN0b3A7CisJCisJcGpfZ2V0dGltZW9mZGF5KCZzdG9wKTsKKwlQSl9USU1FX1ZBTF9TVUIoc3RvcCwgc3RhcnQpOworCisJUEpfTE9HKDMsICgiIiwgIi4uLi4uU2V0dXAgJiBkYXRhIHRyYW5zZmVyIGR1cmF0aW9uOiAlZC4lMDNkcyIsIHN0b3Auc2VjLCBzdG9wLm1zZWMpKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBjbGllbnRzIHN0YXR1cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjbGllbnRzOyArK2kpIHsKKwlpZiAoc3RhdGVfY2xpW2ldLmVyciAhPSBQSl9TVUNDRVNTKQorCSAgICBjbGlfZXJyKys7CisKKwl0b3Rfc2VudCArPSBzdGF0ZV9jbGlbMV0uc2VudDsKKwl0b3RfcmVjdiArPSBzdGF0ZV9jbGlbMV0ucmVjdjsKKyAgICB9CisKKyAgICBQSl9MT0coMywgKCIiLCAiLi4uLi5DbGllbnRzOiAlZCAoJWQgZXJyb3JzKSIsIGNsaWVudHMsIGNsaV9lcnIpKTsKKyAgICBQSl9MT0coMywgKCIiLCAiLi4uLi5Ub3RhbCBzZW50L3JlY3Y6ICVkLyVkIGJ5dGVzIiwgdG90X3NlbnQsIHRvdF9yZWN2KSk7CisKK29uX3JldHVybjoKKyAgICBpZiAoc3NvY2tfc2VydikgCisJcGpfc3NsX3NvY2tfY2xvc2Uoc3NvY2tfc2Vydik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2xpZW50czsgKytpKSB7CisJaWYgKHNzb2NrX2NsaVtpXSAmJiAhc3RhdGVfY2xpW2ldLmVyciAmJiAhc3RhdGVfY2xpW2ldLmRvbmUpCisJICAgIHBqX3NzbF9zb2NrX2Nsb3NlKHNzb2NrX2NsaVtpXSk7CisgICAgfQorICAgIGlmIChpb3F1ZXVlKQorCXBqX2lvcXVldWVfZGVzdHJveShpb3F1ZXVlKTsKKyAgICBpZiAocG9vbCkKKwlwal9wb29sX3JlbGVhc2UocG9vbCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisjaWYgMCAmJiAoIWRlZmluZWQoUEpfU1lNQklBTikgfHwgUEpfU1lNQklBTj09MCkKK3BqX3N0YXR1c190IHBqX3NzbF9zb2NrX29zc2xfdGVzdF9zZW5kX2J1Zihwal9wb29sX3QgKnBvb2wpOworc3RhdGljIGludCBvc3NsX3Rlc3Rfc2VuZF9idWYoKQoreworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBwal9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCAic2VuZF9idWYiLCAyNTYsIDI1NiwgTlVMTCk7CisgICAgc3RhdHVzID0gcGpfc3NsX3NvY2tfb3NzbF90ZXN0X3NlbmRfYnVmKHBvb2wpOworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgb3NzbF90ZXN0X3NlbmRfYnVmKCkKK3sKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgc3NsX3NvY2tfdGVzdCh2b2lkKQoreworICAgIGludCByZXQ7CisKKyAgICBQSl9MT0coMywoIiIsICIuLnRlc3Qgb3NzbCBzZW5kIGJ1ZiIpKTsKKyAgICByZXQgPSBvc3NsX3Rlc3Rfc2VuZF9idWYoKTsKKyAgICBpZiAocmV0ICE9IDApCisJcmV0dXJuIHJldDsKKworICAgIFBKX0xPRygzLCgiIiwgIi4uZ2V0IGNpcGhlciBsaXN0IHRlc3QiKSk7CisgICAgcmV0ID0gZ2V0X2NpcGhlcl9saXN0KCk7CisgICAgaWYgKHJldCAhPSAwKQorCXJldHVybiByZXQ7CisKKyAgICBQSl9MT0coMywoIiIsICIuLmh0dHBzIGNsaWVudCB0ZXN0IikpOworICAgIHJldCA9IGh0dHBzX2NsaWVudF90ZXN0KDMwMDAwKTsKKyAgICAvLyBJZ25vcmUgdGVzdCByZXN1bHQgYXMgaW50ZXJuZXQgY29ubmVjdGlvbiBtYXkgbm90IGJlIGF2YWlsYWJsZS4KKyAgICAvL2lmIChyZXQgIT0gMCkKKwkvL3JldHVybiByZXQ7CisKKyNpZm5kZWYgUEpfU1lNQklBTgorICAgCisgICAgLyogT24gU3ltYmlhbiBwbGF0Zm9ybXMsIFNTTCBzb2NrZXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgQ1NlY3VyZVNvY2tldCwgCisgICAgICogYW5kIGl0IGhhc24ndCBzdXBwb3J0ZWQgc2VydmVyIG1vZGUsIHNvIGV4Y2x1ZGUgdGhlIGZvbGxvd2luZyB0ZXN0cywKKyAgICAgKiB3aGljaCByZXF1aXJlIFNTTCBzZXJ2ZXIsIGZvciBub3cuCisgICAgICovCisKKyAgICBQSl9MT0coMywoIiIsICIuLmVjaG8gdGVzdCB3LyBUTFN2MSBhbmQgUEpfVExTX1JTQV9XSVRIX0RFU19DQkNfU0hBIGNpcGhlciIpKTsKKyAgICByZXQgPSBlY2hvX3Rlc3QoUEpfU1NMX1NPQ0tfUFJPVE9fVExTMSwgUEpfU1NMX1NPQ0tfUFJPVE9fVExTMSwgCisJCSAgICBQSl9UTFNfUlNBX1dJVEhfREVTX0NCQ19TSEEsIFBKX1RMU19SU0FfV0lUSF9ERVNfQ0JDX1NIQSwgCisJCSAgICBQSl9GQUxTRSwgUEpfRkFMU0UpOworICAgIGlmIChyZXQgIT0gMCkKKwlyZXR1cm4gcmV0OworCisgICAgUEpfTE9HKDMsKCIiLCAiLi5lY2hvIHRlc3Qgdy8gU1NMdjIzIGFuZCBQSl9UTFNfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBIGNpcGhlciIpKTsKKyAgICByZXQgPSBlY2hvX3Rlc3QoUEpfU1NMX1NPQ0tfUFJPVE9fU1NMMjMsIFBKX1NTTF9TT0NLX1BST1RPX1NTTDIzLCAKKwkJICAgIFBKX1RMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsIFBKX1RMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCisJCSAgICBQSl9GQUxTRSwgUEpfRkFMU0UpOworICAgIGlmIChyZXQgIT0gMCkKKwlyZXR1cm4gcmV0OworCisgICAgUEpfTE9HKDMsKCIiLCAiLi5lY2hvIHRlc3Qgdy8gaW5jb21wYXRpYmxlIHByb3RvIikpOworICAgIHJldCA9IGVjaG9fdGVzdChQSl9TU0xfU09DS19QUk9UT19UTFMxLCBQSl9TU0xfU09DS19QUk9UT19TU0wzLCAKKwkJICAgIFBKX1RMU19SU0FfV0lUSF9ERVNfQ0JDX1NIQSwgUEpfVExTX1JTQV9XSVRIX0RFU19DQkNfU0hBLAorCQkgICAgUEpfRkFMU0UsIFBKX0ZBTFNFKTsKKyAgICBpZiAocmV0ID09IDApCisJcmV0dXJuIFBKX0VCVUc7CisKKyAgICBQSl9MT0coMywoIiIsICIuLmVjaG8gdGVzdCB3LyBpbmNvbXBhdGlibGUgY2lwaGVycyIpKTsKKyAgICByZXQgPSBlY2hvX3Rlc3QoUEpfU1NMX1NPQ0tfUFJPVE9fREVGQVVMVCwgUEpfU1NMX1NPQ0tfUFJPVE9fREVGQVVMVCwgCisJCSAgICBQSl9UTFNfUlNBX1dJVEhfREVTX0NCQ19TSEEsIFBKX1RMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCisJCSAgICBQSl9GQUxTRSwgUEpfRkFMU0UpOworICAgIGlmIChyZXQgPT0gMCkKKwlyZXR1cm4gUEpfRUJVRzsKKworICAgIFBKX0xPRygzLCgiIiwgIi4uZWNobyB0ZXN0IHcvIGNsaWVudCBjZXJ0IHJlcXVpcmVkIGJ1dCBub3QgcHJvdmlkZWQiKSk7CisgICAgcmV0ID0gZWNob190ZXN0KFBKX1NTTF9TT0NLX1BST1RPX0RFRkFVTFQsIFBKX1NTTF9TT0NLX1BST1RPX0RFRkFVTFQsIAorCQkgICAgUEpfVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwgUEpfVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKKwkJICAgIFBKX1RSVUUsIFBKX0ZBTFNFKTsKKyAgICBpZiAocmV0ID09IDApCisJcmV0dXJuIFBKX0VCVUc7CisKKyAgICBQSl9MT0coMywoIiIsICIuLmVjaG8gdGVzdCB3LyBjbGllbnQgY2VydCByZXF1aXJlZCBhbmQgcHJvdmlkZWQiKSk7CisgICAgcmV0ID0gZWNob190ZXN0KFBKX1NTTF9TT0NLX1BST1RPX0RFRkFVTFQsIFBKX1NTTF9TT0NLX1BST1RPX0RFRkFVTFQsIAorCQkgICAgUEpfVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwgUEpfVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKKwkJICAgIFBKX1RSVUUsIFBKX1RSVUUpOworICAgIGlmIChyZXQgIT0gMCkKKwlyZXR1cm4gcmV0OworCisgICAgUEpfTE9HKDMsKCIiLCAiLi5wZXJmb3JtYW5jZSB0ZXN0IikpOworICAgIHJldCA9IHBlcmZfdGVzdChQSl9JT1FVRVVFX01BWF9IQU5ETEVTLzIgLSAxLCAwKTsKKyAgICBpZiAocmV0ICE9IDApCisJcmV0dXJuIHJldDsKKworICAgIFBKX0xPRygzLCgiIiwgIi4uY2xpZW50IG5vbi1TU0wgKGhhbmRzaGFrZSB0aW1lb3V0IDUgc2VjcykiKSk7CisgICAgcmV0ID0gY2xpZW50X25vbl9zc2woNTAwMCk7CisgICAgLyogUEpfVElNRURPVVQgd29uJ3QgYmUgcmV0dXJuZWQgYXMgYWNjZXB0ZWQgc29ja2V0IGlzIGRlbGV0ZWQgc2lsZW50bHkgKi8KKyAgICBpZiAocmV0ICE9IDApCisJcmV0dXJuIHJldDsKKworI2VuZGlmCisKKyAgICBQSl9MT0coMywoIiIsICIuLnNlcnZlciBub24tU1NMIChoYW5kc2hha2UgdGltZW91dCA1IHNlY3MpIikpOworICAgIHJldCA9IHNlcnZlcl9ub25fc3NsKDUwMDApOworICAgIGlmIChyZXQgIT0gUEpfRVRJTUVET1VUKQorCXJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UJLyogSU5DTFVERV9TU0xTT0NLX1RFU1QgKi8KKy8qIFRvIHByZXZlbnQgd2FybmluZyBhYm91dCAidHJhbnNsYXRpb24gdW5pdCBpcyBlbXB0eSIKKyAqIHdoZW4gdGhpcyB0ZXN0IGlzIGRpc2FibGVkLiAKKyAqLworaW50IGR1bW15X3NzbF9zb2NrX3Rlc3Q7CisjZW5kaWYJLyogSU5DTFVERV9TU0xTT0NLX1RFU1QgKi8KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3N0cmluZy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjczYjkKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3Qvc3RyaW5nLmMKQEAgLTAsMCArMSw0MzggQEAKKy8qICRJZDogc3RyaW5nLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlIDxwai9zdHJpbmcuaD4KKyNpbmNsdWRlIDxwai9wb29sLmg+CisjaW5jbHVkZSA8cGovbG9nLmg+CisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlICJ0ZXN0LmgiCisKKyNkZWZpbmUgVEhJU19GSUxFCSJzdHJpbmcuYyIKKworLyoqCisgKiBccGFnZSBwYWdlX3BqbGliX3N0cmluZ190ZXN0IFRlc3Q6IFN0cmluZworICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiBcYiBzdHJpbmdfdGVzdCgpLiBJdCB0ZXN0cyB0aGUKKyAqIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHN0cmluZyBBUEkuCisgKgorICogXHNlY3Rpb24gc2xlZXBfdGVzdF9zZWMgU2NvcGUgb2YgdGhlIFRlc3QKKyAqCisgKiBBUEkgdGVzdGVkOgorICogIC0gcGpfc3RyKCkKKyAqICAtIHBqX3N0cmNtcCgpCisgKiAgLSBwal9zdHJjbXAyKCkKKyAqICAtIHBqX3N0cmljbXAoKQorICogIC0gcGpfc3RybGVuKCkKKyAqICAtIHBqX3N0cm5jbXAoKQorICogIC0gcGpfc3RybmljbXAoKQorICogIC0gcGpfc3RyY2hyKCkKKyAqICAtIHBqX3N0cmR1cCgpCisgKiAgLSBwal9zdHJkdXAyKCkKKyAqICAtIHBqX3N0cmNweSgpCisgKiAgLSBwal9zdHJjYXQoKQorICogIC0gcGpfc3RydHJpbSgpCisgKiAgLSBwal91dG9hKCkKKyAqICAtIHBqX3N0cnRvdWwoKQorICogIC0gcGpfc3RydG91bDIoKQorICogIC0gcGpfY3JlYXRlX3JhbmRvbV9zdHJpbmcoKQorICogIC0gLi4uIGFuZCBtb2RlLi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgPGI+cGpsaWItdGVzdC9zdHJpbmcuYzwvYj4KKyAqCisgKiBcaW5jbHVkZSBwamxpYi10ZXN0L3N0cmluZy5jCisgKi8KKworI2lmIElOQ0xVREVfU1RSSU5HX1RFU1QKKworI2lmZGVmIF9NU0NfVkVSCisjICAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDIwNCkKKyNlbmRpZgorCisjZGVmaW5lIEhFTExPX1dPUkxECSJIZWxsbyBXb3JsZCIKKyNkZWZpbmUgSEVMTE9fV09STERfTEVOCTExCisjZGVmaW5lIEpVU1RfSEVMTE8JIkhlbGxvIgorI2RlZmluZSBKVVNUX0hFTExPX0xFTgk1CisjZGVmaW5lIFVMX1ZBTFVFCTM0NTY3ODkwMTJVTAorCisjaWYgMQorLyogU2VlIGlmIGJvdGggaW50ZWdlcnMgaGF2ZSB0aGUgc2FtZSBzaWduICovCitQSl9JTkxJTkUoaW50KSBjbXAoY29uc3QgY2hhciAqZXhwciwgaW50IGksIGludCBqKQoreworICAgIGludCByID0gISgoaT4wICYmIGo+MCkgfHwgKGk8MCAmJiBqPDApIHx8IChpPT0wICYmIGo9PTApKTsKKyAgICBpZiAocikgeworCVBKX0xPRygzLChUSElTX0ZJTEUsIiAgIGVycm9yOiAlczogZXhwZWN0aW5nICVkLCBnb3QgJWQiLCBleHByLCBqLCBpKSk7CisgICAgfQorICAgIHJldHVybiByOworfQorI2Vsc2UKKy8qIEZvciBzdHJpY3QgY29tcGFyaXNvbiwgbXVzdCBiZSBlcXVhbCAqLworUEpfSU5MSU5FKGludCkgY21wKGNvbnN0IGNoYXIgKmV4cHIsIGludCBpLCBpbnQgaikKK3sKKyAgICBQSl9VTlVTRURfQVJHKGV4cHIpOworICAgIHJldHVybiBpIT1qOworfQorI2VuZGlmCisKKyNkZWZpbmUgQyhleHByLCByZXMpCWNtcCgjZXhwciwgZXhwciwgcmVzKQorCitzdGF0aWMgaW50IHN0cmljbXBfdGVzdCh2b2lkKQoreworLyogVGhpcyBzcGVjaWZpY2x5IHRlc3RzIGFuZCBiZW5jaG1hcmsgcGpfc3RyaWNtcCgpLCBwal9zdHJpY21wX2FsbnVtKCkuCisgKiBJbiBhZGRpdGlvbiwgaXQgYWxzbyB0ZXN0cyBwal9zdHJpY21wMigpLCBwal9zdHJuaWNtcCgpLCBhbmQgCisgKiBwal9zdHJuaWNtcDIoKS4KKyAqLworI2RlZmluZSBTVFJURVNUKHJlcyxyZXMyLFMxLFMyLGNvZGUpCVwKKwkgICAgZG8geyBcCisJCXMxLnB0cj1TMTsgczEuc2xlbj0oUzEpP2xlbjowOyBcCisJCXMyLnB0cj1TMjsgczIuc2xlbj0oUzIpP2xlbjowOyBcCisJCXBqX2dldF90aW1lc3RhbXAoJnQxKTsgXAorCSAgICAgICAgaWYgKEMocGpfc3RyaWNtcCgmczEsJnMyKSxyZXMpKSByZXR1cm4gY29kZTsgXAorCQlwal9nZXRfdGltZXN0YW1wKCZ0Mik7IFwKKwkJcGpfc3ViX3RpbWVzdGFtcCgmdDIsICZ0MSk7IFwKKwkJcGpfYWRkX3RpbWVzdGFtcCgmZTEsICZ0Mik7IFwKKwkJcGpfZ2V0X3RpbWVzdGFtcCgmdDEpOyBcCisJICAgICAgICBpZiAoQyhwal9zdHJpY21wX2FsbnVtKCZzMSwmczIpLHJlcykpIHJldHVybiBjb2RlLTE7IFwKKwkJcGpfZ2V0X3RpbWVzdGFtcCgmdDIpOyBcCisJCXBqX3N1Yl90aW1lc3RhbXAoJnQyLCAmdDEpOyBcCisJCXBqX2FkZF90aW1lc3RhbXAoJmUyLCAmdDIpOyBcCisJCWlmIChDKHBqX3N0cmljbXAyKCZzMSxTMikscmVzMikpIHJldHVybiBjb2RlKjEwOyBcCisJCWlmIChDKHBqX3N0cm5pY21wKCZzMSwmczIsbGVuKSxyZXMpKSByZXR1cm4gY29kZSoxMDA7IFwKKwkJaWYgKEMocGpfc3RybmljbXAyKCZzMSxTMixsZW4pLHJlcykpIHJldHVybiBjb2RlKjEwMDA7IFwKKwkgICAgfSB3aGlsZSAoMCkKKworICAgIGNoYXIgKmJ1ZjsKKyAgICBwal9zdHJfdCBzMSwgczI7CisgICAgcGpfdGltZXN0YW1wIHQxLCB0MiwgZTEsIGUyLCB6ZXJvOworICAgIHBqX3VpbnQzMl90IGMxLCBjMjsKKyAgICBpbnQgbGVuOworCisgICAgZTEudTMyLmhpID0gZTEudTMyLmxvID0gZTIudTMyLmhpID0gZTIudTMyLmxvID0gMDsKKworICAgIHBqX3RocmVhZF9zbGVlcCgwKTsKKworI2RlZmluZSBTTlVMTCAwCisKKyAgICAvKiBDb21wYXJlIGVtcHR5IHN0cmluZ3MuICovCisgICAgbGVuPTA7CisgICAgU1RSVEVTVCggMCwgMCwgIiIsIiIsLTUwMCk7CisgICAgU1RSVEVTVCggMCwgMCwgU05VTEwsIiIsLTUwMik7CisgICAgU1RSVEVTVCggMCwgMCwgIiIsU05VTEwsLTUwNCk7CisgICAgU1RSVEVTVCggMCwgMCwgU05VTEwsU05VTEwsLTUwNik7CisgICAgU1RSVEVTVCggMCwgLTEsICJoZWxsbyIsIndvcmxkIiwtNTA4KTsKKworICAgIC8qIGVxdWFsLCBsZW5ndGg9MSAKKyAgICAgKiB1c2UgYnVmZmVyIHRvIHNpbXVsYXRlIG5vbi1hbGlnbmVkIHN0cmluZy4KKyAgICAgKi8KKyAgICBidWYgPSAiYSIiQSI7CisgICAgbGVuPTE7CisgICAgU1RSVEVTVCggMCwgIC0xLCAiYSIsYnVmKzAsLTUxMCk7CisgICAgU1RSVEVTVCggMCwgIDAsICJhIixidWYrMSwtNTEyKTsKKyAgICBTVFJURVNUKC0xLCAtMSwgIk8iLCAiUCIsIC01MTQpOworICAgIFNUUlRFU1QoLTEsIC0xLCBTTlVMTCwgImEiLCAtNTE2KTsKKyAgICBTVFJURVNUKCAxLCAgMSwgImEiLCBTTlVMTCwgLTUxOCk7CisKKyAgICAvKiBlcXVhbCwgbGVuZ3RoPTIgCisgICAgICogdXNlIGJ1ZmZlciB0byBzaW11bGF0ZSBub24tYWxpZ25lZCBzdHJpbmcuCisgICAgICovCisgICAgYnVmID0gImFhIiJBYSIiYUEiIkFBIjsKKyAgICBsZW49MjsKKyAgICBTVFJURVNUKCAwLCAtMSwgImFhIixidWYrMCwtNTIwKTsKKyAgICBTVFJURVNUKCAwLCAtMSwgImFhIixidWYrMiwtNTIyKTsKKyAgICBTVFJURVNUKCAwLCAtMSwgImFhIixidWYrNCwtNTI0KTsKKyAgICBTVFJURVNUKCAwLCAwLCAiYWEiLGJ1Zis2LC01MjQpOworCisgICAgLyogZXF1YWwsIGxlbmd0aD0zIAorICAgICAqIHVzZSBidWZmZXIgdG8gc2ltdWxhdGUgbm9uLWFsaWduZWQgc3RyaW5nLgorICAgICAqLworICAgIGJ1ZiA9ICJhYWEiIkFhYSIiYUFhIiJhYUEiIkFBYSIiYUFBIiJBYUEiIkFBQSI7CisgICAgbGVuPTM7CisgICAgU1RSVEVTVCggMCwgLTEsICJhYWEiLGJ1ZiswLC01MzApOworICAgIFNUUlRFU1QoIDAsIC0xLCAiYWFhIixidWYrMywtNTMyKTsKKyAgICBTVFJURVNUKCAwLCAtMSwgImFhYSIsYnVmKzYsLTUzNCk7CisgICAgU1RSVEVTVCggMCwgLTEsICJhYWEiLGJ1Zis5LC01MzYpOworICAgIFNUUlRFU1QoIDAsIC0xLCAiYWFhIixidWYrMTIsLTUzOCk7CisgICAgU1RSVEVTVCggMCwgLTEsICJhYWEiLGJ1ZisxNSwtNTQwKTsKKyAgICBTVFJURVNUKCAwLCAtMSwgImFhYSIsYnVmKzE4LC01NDIpOworICAgIFNUUlRFU1QoIDAsIDAsICJhYWEiLGJ1ZisyMSwtNTM0KTsKKworICAgIC8qIGVxdWFsLCBsZW5ndGg9NCAqLworICAgIGxlbj00OworICAgIFNUUlRFU1QoIDAsIDAsICJhYWFhIiwiYWFhYSIsLTU0MCk7CisgICAgU1RSVEVTVCggMCwgMCwgImFhYWEiLCJBYWFhIiwtNTQyKTsKKyAgICBTVFJURVNUKCAwLCAwLCAiYWFhYSIsImFBYWEiLC01NDQpOworICAgIFNUUlRFU1QoIDAsIDAsICJhYWFhIiwiYWFBYSIsLTU0Nik7CisgICAgU1RSVEVTVCggMCwgMCwgImFhYWEiLCJhYWFBIiwtNTQ4KTsKKyAgICBTVFJURVNUKCAwLCAwLCAiYWFhYSIsIkFBYWEiLC01NTApOworICAgIFNUUlRFU1QoIDAsIDAsICJhYWFhIiwiYUFBYSIsLTU1Mik7CisgICAgU1RSVEVTVCggMCwgMCwgImFhYWEiLCJhYUFBIiwtNTU0KTsKKyAgICBTVFJURVNUKCAwLCAwLCAiYWFhYSIsIkFhQWEiLC01NTYpOworICAgIFNUUlRFU1QoIDAsIDAsICJhYWFhIiwiYUFhQSIsLTU1OCk7CisgICAgU1RSVEVTVCggMCwgMCwgImFhYWEiLCJBYWFBIiwtNTYwKTsKKyAgICBTVFJURVNUKCAwLCAwLCAiYWFhYSIsIkFBQWEiLC01NjIpOworICAgIFNUUlRFU1QoIDAsIDAsICJhYWFhIiwiYUFBQSIsLTU2NCk7CisgICAgU1RSVEVTVCggMCwgMCwgImFhYWEiLCJBQWFBIiwtNTY2KTsKKyAgICBTVFJURVNUKCAwLCAwLCAiYWFhYSIsIkFhQUEiLC01NjgpOworICAgIFNUUlRFU1QoIDAsIDAsICJhYWFhIiwiQUFBQSIsLTU3MCk7CisKKyAgICAvKiBlcXVhbCwgbGVuZ3RoPTUgKi8KKyAgICBidWYgPSAiYWFhQWEiIkFhYWFBIiJBYUFhQSIiQUFBQUEiOworICAgIGxlbj01OworICAgIFNUUlRFU1QoIDAsIC0xLCAiYWFhYWEiLGJ1ZiswLC01ODApOworICAgIFNUUlRFU1QoIDAsIC0xLCAiYWFhYWEiLGJ1Zis1LC01ODIpOworICAgIFNUUlRFU1QoIDAsIC0xLCAiYWFhYWEiLGJ1ZisxMCwtNTg0KTsKKyAgICBTVFJURVNUKCAwLCAwLCAiYWFhYWEiLGJ1ZisxNSwtNTg2KTsKKworICAgIC8qIG5vdCBlcXVhbCwgbGVuZ3RoPTEgKi8KKyAgICBsZW49MTsKKyAgICBTVFJURVNUKCAtMSwgLTEsICJhIiwgImIiLCAtNjAwKTsKKworICAgIC8qIG5vdCBlcXVhbCwgbGVuZ3RoPTIgKi8KKyAgICBidWYgPSAiYWIiImJhIjsKKyAgICBsZW49MjsKKyAgICBTVFJURVNUKCAtMSwgLTEsICJhYSIsIGJ1ZiswLCAtNjEwKTsKKyAgICBTVFJURVNUKCAtMSwgLTEsICJhYSIsIGJ1ZisyLCAtNjEyKTsKKworICAgIC8qIG5vdCBlcXVhbCwgbGVuZ3RoPTMgKi8KKyAgICBidWYgPSAiYWFiIiJhYmEiImJhYSI7CisgICAgbGVuPTM7CisgICAgU1RSVEVTVCggLTEsIC0xLCAiYWFhIiwgYnVmKzAsIC02MjApOworICAgIFNUUlRFU1QoIC0xLCAtMSwgImFhYSIsIGJ1ZiszLCAtNjIyKTsKKyAgICBTVFJURVNUKCAtMSwgLTEsICJhYWEiLCBidWYrNiwgLTYyNCk7CisKKyAgICAvKiBub3QgZXF1YWwsIGxlbmd0aD00ICovCisgICAgYnVmID0gImFhYWIiImFhYmEiImFiYWEiImJhYWEiOworICAgIGxlbj00OworICAgIFNUUlRFU1QoIC0xLCAtMSwgImFhYWEiLCBidWYrMCwgLTYzMCk7CisgICAgU1RSVEVTVCggLTEsIC0xLCAiYWFhYSIsIGJ1Zis0LCAtNjMyKTsKKyAgICBTVFJURVNUKCAtMSwgLTEsICJhYWFhIiwgYnVmKzgsIC02MzQpOworICAgIFNUUlRFU1QoIC0xLCAtMSwgImFhYWEiLCBidWYrMTIsIC02MzYpOworCisgICAgLyogbm90IGVxdWFsLCBsZW5ndGg9NSAqLworICAgIGJ1Zj0iYWFhYWIiImFhYWJhIiJhYWJhYSIiYWJhYWEiImJhYWFhIjsKKyAgICBsZW49NTsKKyAgICBTVFJURVNUKCAtMSwgLTEsICJhYWFhYSIsIGJ1ZiswLCAtNjQwKTsKKyAgICBTVFJURVNUKCAtMSwgLTEsICJhYWFhYSIsIGJ1Zis1LCAtNjQyKTsKKyAgICBTVFJURVNUKCAtMSwgLTEsICJhYWFhYSIsIGJ1ZisxMCwgLTY0NCk7CisgICAgU1RSVEVTVCggLTEsIC0xLCAiYWFhYWEiLCBidWYrMTUsIC02NDYpOworICAgIFNUUlRFU1QoIC0xLCAtMSwgImFhYWFhIiwgYnVmKzIwLCAtNjQ4KTsKKworICAgIHplcm8udTMyLmhpID0gemVyby51MzIubG8gPSAwOworICAgIGMxID0gcGpfZWxhcHNlZF9jeWNsZSgmemVybywgJmUxKTsKKyAgICBjMiA9IHBqX2VsYXBzZWRfY3ljbGUoJnplcm8sICZlMik7CisKKyAgICBpZiAoYzEgPCBjMikgeworCVBKX0xPRygzLCgiIiwgIiAgaW5mbzogcGpfc3RyaWNtcF9hbG51bSBpcyBzbG93ZXIgdGhhbiBwal9zdHJpY21wISIpKTsKKwkvL3JldHVybiAtNzAwOworICAgIH0KKworICAgIC8qIEF2b2lkIGRpdmlzaW9uIGJ5IHplcm8gKi8KKyAgICBpZiAoYzIgPT0gMCkgYzI9MTsKKyAgICAKKyAgICBQSl9MT0coMywgKCIiLCAiICB0aW1lOiBzdHJpY21wPSV1LCBzdHJpY21wX2FsbnVtPSV1IChzcGVlZHVwPSVkLiUwMmR4KSIsIAorCQkgICBjMSwgYzIsCisJCSAgIChjMSAqIDEwMCAvIGMyKSAvIDEwMCwKKwkJICAgKGMxICogMTAwIC8gYzIpICUgMTAwKSk7CisgICAgcmV0dXJuIDA7CisjdW5kZWYgU1RSVEVTVAorfQorCisvKiBUaGlzIHRlc3RzIHBqX3N0cmNtcCgpLCBwal9zdHJjbXAyKCksIHBqX3N0cm5jbXAoKSwgcGpfc3RybmNtcDIoKSAqLworc3RhdGljIGludCBzdHJjbXBfdGVzdCh2b2lkKQoreworI2RlZmluZSBTVFJfVEVTVChyZXMsUzEsUzIsY29kZSkgICAgXAorCSAgICBkbyB7IFwKKwkJczEucHRyPVMxOyBzMS5zbGVuPVMxP2xlbjowOyBcCisJCXMyLnB0cj1TMjsgczIuc2xlbj1TMj9sZW46MDsgXAorCSAgICAgICAgaWYgKEMocGpfc3RyY21wKCZzMSwmczIpLHJlcykpIHJldHVybiBjb2RlOyBcCisJCWlmIChDKHBqX3N0cmNtcDIoJnMxLFMyKSxyZXMpKSByZXR1cm4gY29kZS0xOyBcCisJCWlmIChDKHBqX3N0cm5jbXAoJnMxLCZzMixsZW4pLHJlcykpIHJldHVybiBjb2RlLTI7IFwKKwkJaWYgKEMocGpfc3RybmNtcDIoJnMxLFMyLGxlbikscmVzKSkgcmV0dXJuIGNvZGUtMzsgXAorCSAgICB9IHdoaWxlICgwKQorCisgICAgcGpfc3RyX3QgczEsIHMyOworICAgIGludCBsZW47CisgICAgCisgICAgLyogVGVzdCB3aXRoIGxlbmd0aCA9PSAwICovCisgICAgbGVuPTA7CisgICAgU1RSX1RFU1QoMCwgIiIsICIiLCAtNDAwKTsKKyAgICBTVFJfVEVTVCgwLCBTTlVMTCwgIiIsIC00MDUpOworICAgIFNUUl9URVNUKDAsICIiLCBTTlVMTCwgLTQxMCk7CisgICAgU1RSX1RFU1QoMCwgU05VTEwsIFNOVUxMLCAtNDE1KTsKKyAgICBTVFJfVEVTVCgwLCAiaGVsbG8iLCAiIiwgLTQyMCk7CisgICAgU1RSX1RFU1QoMCwgImhlbGxvIiwgU05VTEwsIC00MjUpOworCisgICAgLyogVGVzdCB3aXRoIGxlbmd0aCAhPSAwICovCisgICAgbGVuID0gMjsKKyAgICBTVFJfVEVTVCgwLCAiMTIiLCAiMTIiLCAtNDMwKTsKKyAgICBTVFJfVEVTVCgxLCAiMTIiLCAiMSIsIC00MzUpOworICAgIFNUUl9URVNUKC0xLCAiMSIsICIxMiIsIC00NDApOworICAgIFNUUl9URVNUKC0xLCBTTlVMTCwgIjEyIiwgLTQ0NSk7CisgICAgU1RSX1RFU1QoMSwgIjEyIiwgU05VTEwsIC00NTApOworCisgICAgcmV0dXJuIDA7CisKKyN1bmRlZiBTVFJfVEVTVAorfQorCitpbnQgc3RyaW5nX3Rlc3Qodm9pZCkKK3sKKyAgICBjb25zdCBwal9zdHJfdCBoZWxsb193b3JsZCA9IHsgSEVMTE9fV09STEQsIEhFTExPX1dPUkxEX0xFTiB9OworICAgIGNvbnN0IHBqX3N0cl90IGp1c3RfaGVsbG8gPSB7IEpVU1RfSEVMTE8sIEpVU1RfSEVMTE9fTEVOIH07CisgICAgcGpfc3RyX3QgczEsIHMyLCBzMywgczQsIHM1OworICAgIGVudW0geyBSQ09VTlQgPSAxMCwgUkxFTiA9IDE2IH07CisgICAgcGpfc3RyX3QgcmFuZG9tW1JDT1VOVF07CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIGludCBpOworCisgICAgcG9vbCA9IHBqX3Bvb2xfY3JlYXRlKG1lbSwgU05VTEwsIDQwOTYsIDAsIFNOVUxMKTsKKyAgICBpZiAoIXBvb2wpIHJldHVybiAtNTsKKyAgICAKKyAgICAvKiAKKyAgICAgKiBwal9zdHIoKSwgcGpfc3RyY21wKCksIHBqX3N0cmljbXAoKSwgcGpfc3RybGVuKCksIAorICAgICAqIHBqX3N0cm5jbXAoKSwgcGpfc3RyY2hyKCkgCisgICAgICovCisgICAgczEgPSBwal9zdHIoSEVMTE9fV09STEQpOworICAgIGlmIChwal9zdHJjbXAoJnMxLCAmaGVsbG9fd29ybGQpICE9IDApCisJcmV0dXJuIC0xMDsKKyAgICBpZiAocGpfc3RyaWNtcCgmczEsICZoZWxsb193b3JsZCkgIT0gMCkKKwlyZXR1cm4gLTIwOworICAgIGlmIChwal9zdHJjbXAoJnMxLCAmanVzdF9oZWxsbykgPD0gMCkKKwlyZXR1cm4gLTMwOworICAgIGlmIChwal9zdHJpY21wKCZzMSwgJmp1c3RfaGVsbG8pIDw9IDApCisJcmV0dXJuIC00MDsKKyAgICBpZiAocGpfc3RybGVuKCZzMSkgIT0gc3RybGVuKEhFTExPX1dPUkxEKSkKKwlyZXR1cm4gLTUwOworICAgIGlmIChwal9zdHJuY21wKCZzMSwgJmhlbGxvX3dvcmxkLCA1KSAhPSAwKQorCXJldHVybiAtNjA7CisgICAgaWYgKHBqX3N0cm5pY21wKCZzMSwgJmhlbGxvX3dvcmxkLCA1KSAhPSAwKQorCXJldHVybiAtNzA7CisgICAgaWYgKHBqX3N0cmNocigmczEsIEhFTExPX1dPUkxEWzFdKSAhPSBzMS5wdHIrMSkKKwlyZXR1cm4gLTgwOworCisgICAgLyogCisgICAgICogcGpfc3RyZHVwKCkgCisgICAgICovCisgICAgaWYgKCFwal9zdHJkdXAocG9vbCwgJnMyLCAmczEpKQorCXJldHVybiAtMTAwOworICAgIGlmIChwal9zdHJjbXAoJnMxLCAmczIpICE9IDApCisJcmV0dXJuIC0xMTA7CisgICAgCisgICAgLyogCisgICAgICogcGpfc3RyY3B5KCksIHBqX3N0cmNhdCgpIAorICAgICAqLworICAgIHMzLnB0ciA9IChjaGFyKikgcGpfcG9vbF9hbGxvYyhwb29sLCAyNTYpOworICAgIGlmICghczMucHRyKSAKKwlyZXR1cm4gLTIwMDsKKyAgICBwal9zdHJjcHkoJnMzLCAmczIpOworICAgIHBqX3N0cmNhdCgmczMsICZqdXN0X2hlbGxvKTsKKworICAgIGlmIChwal9zdHJjbXAyKCZzMywgSEVMTE9fV09STEQgSlVTVF9IRUxMTykgIT0gMCkKKwlyZXR1cm4gLTIxMDsKKworICAgIC8qIAorICAgICAqIHBqX3N0cmR1cDIoKSwgcGpfc3RydHJpbSgpLiAKKyAgICAgKi8KKyAgICBwal9zdHJkdXAyKHBvb2wsICZzNCwgIiAiIEhFTExPX1dPUkxEICJcdCAiKTsKKyAgICBwal9zdHJ0cmltKCZzNCk7CisgICAgaWYgKHBqX3N0cmNtcDIoJnM0LCBIRUxMT19XT1JMRCkgIT0gMCkKKwlyZXR1cm4gLTI1MDsKKworICAgIC8qIAorICAgICAqIHBqX3V0b2EoKSAKKyAgICAgKi8KKyAgICBzNS5wdHIgPSAoY2hhciopIHBqX3Bvb2xfYWxsb2MocG9vbCwgMTYpOworICAgIGlmICghczUucHRyKQorCXJldHVybiAtMjcwOworICAgIHM1LnNsZW4gPSBwal91dG9hKFVMX1ZBTFVFLCBzNS5wdHIpOworCisgICAgLyogCisgICAgICogcGpfc3RydG91bCgpIAorICAgICAqLworICAgIGlmIChwal9zdHJ0b3VsKCZzNSkgIT0gVUxfVkFMVUUpCisJcmV0dXJuIC0yODA7CisKKyAgICAvKgorICAgICAqIHBqX3N0cnRvdWwyKCkKKyAgICAgKi8KKyAgICBzNSA9IHBqX3N0cigiMTIzNDU2Iik7CisKKyAgICBwal9zdHJ0b3VsMigmczUsIFNOVUxMLCAxMCk7CS8qIENyYXNoIHRlc3QgKi8KKworICAgIGlmIChwal9zdHJ0b3VsMigmczUsICZzNCwgMTApICE9IDEyMzQ1NlVMKQorCXJldHVybiAtMjkwOworICAgIGlmIChzNC5zbGVuICE9IDApCisJcmV0dXJuIC0yOTE7CisgICAgaWYgKHBqX3N0cnRvdWwyKCZzNSwgJnM0LCAxNikgIT0gMHgxMjM0NTZVTCkKKwlyZXR1cm4gLTI5MjsKKworICAgIHM1ID0gcGpfc3RyKCIwMTIzQUJDRCIpOworICAgIGlmIChwal9zdHJ0b3VsMigmczUsICZzNCwgMTApICE9IDEyMykKKwlyZXR1cm4gLTI5MzsKKyAgICBpZiAoczQuc2xlbiAhPSA0KQorCXJldHVybiAtMjk0OworICAgIGlmIChzNC5wdHIgPT0gU05VTEwgfHwgKnM0LnB0ciAhPSAnQScpCisJcmV0dXJuIC0yOTU7CisgICAgaWYgKHBqX3N0cnRvdWwyKCZzNSwgJnM0LCAxNikgIT0gMHgxMjNBQkNEVUwpCisJcmV0dXJuIC0yOTY7CisgICAgaWYgKHM0LnNsZW4gIT0gMCkKKwlyZXR1cm4gLTI5NzsKKworICAgIC8qIAorICAgICAqIHBqX2NyZWF0ZV9yYW5kb21fc3RyaW5nKCkgCisgICAgICogQ2hlY2sgdGhhdCBubyBkdXBsaWNhdGUgc3RyaW5ncyBhcmUgcmV0dXJuZWQuCisgICAgICovCisgICAgZm9yIChpPTA7IGk8UkNPVU5UOyArK2kpIHsKKwlpbnQgajsKKwkKKwlyYW5kb21baV0ucHRyID0gKGNoYXIqKSBwal9wb29sX2FsbG9jKHBvb2wsIFJMRU4pOworCWlmICghcmFuZG9tW2ldLnB0cikKKwkgICAgcmV0dXJuIC0zMjA7CisKKyAgICAgICAgcmFuZG9tW2ldLnNsZW4gPSBSTEVOOworCXBqX2NyZWF0ZV9yYW5kb21fc3RyaW5nKHJhbmRvbVtpXS5wdHIsIFJMRU4pOworCisJZm9yIChqPTA7IGo8aTsgKytqKSB7CisJICAgIGlmIChwal9zdHJjbXAoJnJhbmRvbVtpXSwgJnJhbmRvbVtqXSk9PTApCisJCXJldHVybiAtMzMwOworCX0KKyAgICB9CisKKyAgICAvKiBEb25lLiAqLworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKworICAgIC8qIENhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24gdGVzdC4gKi8KKyAgICBpID0gc3RyY21wX3Rlc3QoKTsKKyAgICBpZiAoaSAhPSAwKQorCXJldHVybiBpOworCisgICAgLyogQ2FzZWxlc3MgY29tcGFyaXNvbiB0ZXN0LiAqLworICAgIGkgPSBzdHJpY21wX3Rlc3QoKTsKKyAgICBpZiAoaSAhPSAwKQorCXJldHVybiBpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCisvKiBUbyBwcmV2ZW50IHdhcm5pbmcgYWJvdXQgInRyYW5zbGF0aW9uIHVuaXQgaXMgZW1wdHkiCisgKiB3aGVuIHRoaXMgdGVzdCBpcyBkaXNhYmxlZC4gCisgKi8KK2ludCBkdW1teV9zdHJpbmdfdGVzdDsKKyNlbmRpZgkvKiBJTkNMVURFX1NUUklOR19URVNUICovCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC90ZXN0LmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNmY1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdGVzdC5jCkBAIC0wLDAgKzEsMjM0IEBACisvKiAkSWQ6IHRlc3QuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxwamxpYi5oPgorI2lmZGVmIF9NU0NfVkVSCisjICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQxMjcpCisjZW5kaWYKKworI2RlZmluZSBET19URVNUKHRlc3QpCWRvIHsgXAorCQkJICAgIFBKX0xPRygzLCAoInRlc3QiLCAiUnVubmluZyAlcy4uLiIsICN0ZXN0KSk7ICBcCisJCQkgICAgcmMgPSB0ZXN0OyBcCisJCQkgICAgUEpfTE9HKDMsICgidGVzdCIsICBcCisJCQkJICAgICAgICIlcyglZCkiLCAgXAorCQkJCSAgICAgICAocmMgPyAiLi5FUlJPUiIgOiAiLi5zdWNjZXNzIiksIHJjKSk7IFwKKwkJCSAgICBpZiAocmMhPTApIGdvdG8gb25fcmV0dXJuOyBcCisJCQl9IHdoaWxlICgwKQorCisKK3BqX3Bvb2xfZmFjdG9yeSAqbWVtOworCitpbnQgcGFyYW1fZWNob19zb2NrX3R5cGU7Citjb25zdCBjaGFyICpwYXJhbV9lY2hvX3NlcnZlciA9IEVDSE9fU0VSVkVSX0FERFJFU1M7CitpbnQgcGFyYW1fZWNob19wb3J0ID0gRUNIT19TRVJWRVJfU1RBUlRfUE9SVDsKK2ludCBwYXJhbV9sb2dfZGVjb3IgPSBQSl9MT0dfSEFTX05FV0xJTkUgfCBQSl9MT0dfSEFTX1RJTUUgfCAKKwkJICAgICAgUEpfTE9HX0hBU19NSUNST19TRUM7CisKK2ludCBudWxsX2Z1bmMoKQoreworICAgIHJldHVybiAwOworfQorCitpbnQgdGVzdF9pbm5lcih2b2lkKQoreworICAgIHBqX2NhY2hpbmdfcG9vbCBjYWNoaW5nX3Bvb2w7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgaW50IGxpbmU7CisgICAgaW50IHJjID0gMDsKKworICAgIG1lbSA9ICZjYWNoaW5nX3Bvb2wuZmFjdG9yeTsKKworICAgIHBqX2xvZ19zZXRfbGV2ZWwoMyk7CisgICAgcGpfbG9nX3NldF9kZWNvcihwYXJhbV9sb2dfZGVjb3IpOworCisgICAgcmMgPSBwal9pbml0KCk7CisgICAgaWYgKHJjICE9IDApIHsKKwlhcHBfcGVycm9yKCJwal9pbml0KCkgZXJyb3IhISIsIHJjKTsKKwlyZXR1cm4gcmM7CisgICAgfQorICAgIAorICAgIC8vcGpfZHVtcF9jb25maWcoKTsKKyAgICBwal9jYWNoaW5nX3Bvb2xfaW5pdCggJmNhY2hpbmdfcG9vbCwgTlVMTCwgMCApOworCisjaWYgSU5DTFVERV9FUlJOT19URVNUCisgICAgRE9fVEVTVCggZXJybm9fdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfRVhDRVBUSU9OX1RFU1QKKyAgICBET19URVNUKCBleGNlcHRpb25fdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfT1NfVEVTVAorICAgIERPX1RFU1QoIG9zX3Rlc3QoKSApOworI2VuZGlmCisKKyNpZiBJTkNMVURFX1JBTkRfVEVTVAorICAgIERPX1RFU1QoIHJhbmRfdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfTElTVF9URVNUCisgICAgRE9fVEVTVCggbGlzdF90ZXN0KCkgKTsKKyNlbmRpZgorCisjaWYgSU5DTFVERV9QT09MX1RFU1QKKyAgICBET19URVNUKCBwb29sX3Rlc3QoKSApOworI2VuZGlmCisKKyNpZiBJTkNMVURFX1BPT0xfUEVSRl9URVNUCisgICAgRE9fVEVTVCggcG9vbF9wZXJmX3Rlc3QoKSApOworI2VuZGlmCisKKyNpZiBJTkNMVURFX1NUUklOR19URVNUCisgICAgRE9fVEVTVCggc3RyaW5nX3Rlc3QoKSApOworI2VuZGlmCisgICAgCisjaWYgSU5DTFVERV9GSUZPQlVGX1RFU1QKKyAgICBET19URVNUKCBmaWZvYnVmX3Rlc3QoKSApOworI2VuZGlmCisKKyNpZiBJTkNMVURFX1JCVFJFRV9URVNUCisgICAgRE9fVEVTVCggcmJ0cmVlX3Rlc3QoKSApOworI2VuZGlmCisKKyNpZiBJTkNMVURFX0hBU0hfVEVTVAorICAgIERPX1RFU1QoIGhhc2hfdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfVElNRVNUQU1QX1RFU1QKKyAgICBET19URVNUKCB0aW1lc3RhbXBfdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfQVRPTUlDX1RFU1QKKyAgICBET19URVNUKCBhdG9taWNfdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfTVVURVhfVEVTVAorICAgIERPX1RFU1QoIG11dGV4X3Rlc3QoKSApOworI2VuZGlmCisKKyNpZiBJTkNMVURFX1RJTUVSX1RFU1QKKyAgICBET19URVNUKCB0aW1lcl90ZXN0KCkgKTsKKyNlbmRpZgorCisjaWYgSU5DTFVERV9TTEVFUF9URVNUCisgICAgRE9fVEVTVCggc2xlZXBfdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfVEhSRUFEX1RFU1QKKyAgICBET19URVNUKCB0aHJlYWRfdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfU09DS19URVNUCisgICAgRE9fVEVTVCggc29ja190ZXN0KCkgKTsKKyNlbmRpZgorCisjaWYgSU5DTFVERV9TT0NLX1BFUkZfVEVTVAorICAgIERPX1RFU1QoIHNvY2tfcGVyZl90ZXN0KCkgKTsKKyNlbmRpZgorCisjaWYgSU5DTFVERV9TRUxFQ1RfVEVTVAorICAgIERPX1RFU1QoIHNlbGVjdF90ZXN0KCkgKTsKKyNlbmRpZgorCisjaWYgSU5DTFVERV9VRFBfSU9RVUVVRV9URVNUCisgICAgRE9fVEVTVCggdWRwX2lvcXVldWVfdGVzdCgpICk7CisjZW5kaWYKKworI2lmIFBKX0hBU19UQ1AgJiYgSU5DTFVERV9UQ1BfSU9RVUVVRV9URVNUCisgICAgRE9fVEVTVCggdGNwX2lvcXVldWVfdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfSU9RVUVVRV9QRVJGX1RFU1QKKyAgICBET19URVNUKCBpb3F1ZXVlX3BlcmZfdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfSU9RVUVVRV9VTlJFR19URVNUCisgICAgRE9fVEVTVCggdWRwX2lvcXVldWVfdW5yZWdfdGVzdCgpICk7CisjZW5kaWYKKworI2lmIElOQ0xVREVfQUNUSVZFU09DS19URVNUCisgICAgRE9fVEVTVCggYWN0aXZlc29ja190ZXN0KCkgKTsKKyNlbmRpZgorCisjaWYgSU5DTFVERV9GSUxFX1RFU1QKKyAgICBET19URVNUKCBmaWxlX3Rlc3QoKSApOworI2VuZGlmCisKKyNpZiBJTkNMVURFX1NTTFNPQ0tfVEVTVAorICAgIERPX1RFU1QoIHNzbF9zb2NrX3Rlc3QoKSApOworI2VuZGlmCisKKyNpZiBJTkNMVURFX0VDSE9fU0VSVkVSCisgICAgLy9lY2hvX3NlcnZlcigpOworICAgIC8vZWNob19zcnZfc3luYygpOworICAgIHVkcF9lY2hvX3Nydl9pb3F1ZXVlKCk7CisKKyNlbGlmIElOQ0xVREVfRUNIT19DTElFTlQKKyAgICBpZiAocGFyYW1fZWNob19zb2NrX3R5cGUgPT0gMCkKKyAgICAgICAgcGFyYW1fZWNob19zb2NrX3R5cGUgPSBwal9TT0NLX0RHUkFNKCk7CisKKyAgICBlY2hvX2NsaWVudCggcGFyYW1fZWNob19zb2NrX3R5cGUsIAorICAgICAgICAgICAgICAgICBwYXJhbV9lY2hvX3NlcnZlciwgCisgICAgICAgICAgICAgICAgIHBhcmFtX2VjaG9fcG9ydCk7CisjZW5kaWYKKworICAgIGdvdG8gb25fcmV0dXJuOworCitvbl9yZXR1cm46CisKKyAgICBwal9jYWNoaW5nX3Bvb2xfZGVzdHJveSggJmNhY2hpbmdfcG9vbCApOworCisgICAgUEpfTE9HKDMsKCJ0ZXN0IiwgIiIpKTsKKyAKKyAgICBwal90aHJlYWRfZ2V0X3N0YWNrX2luZm8ocGpfdGhyZWFkX3RoaXMoKSwgJmZpbGVuYW1lLCAmbGluZSk7CisgICAgUEpfTE9HKDMsKCJ0ZXN0IiwgIlN0YWNrIG1heCB1c2FnZTogJXUsIGRlZXBlc3Q6ICVzOiV1IiwgCisJICAgICAgICAgICAgICBwal90aHJlYWRfZ2V0X3N0YWNrX21heF91c2FnZShwal90aHJlYWRfdGhpcygpKSwKKwkJICAgICAgZmlsZW5hbWUsIGxpbmUpKTsKKyAgICBpZiAocmMgPT0gMCkKKwlQSl9MT0coMywoInRlc3QiLCAiTG9va3MgbGlrZSBldmVyeXRoaW5nIGlzIG9rYXkhLi4iKSk7CisgICAgZWxzZQorCVBKX0xPRygzLCgidGVzdCIsICJUZXN0IGNvbXBsZXRlZCB3aXRoIGVycm9yKHMpIikpOworICAgIAorICAgIHBqX3NodXRkb3duKCk7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKyNpbmNsdWRlIDxwai9zb2NrLmg+CisKK2ludCB0ZXN0X21haW4odm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBQSl9VU0VfRVhDRVBUSU9OOworCisgICAgaSA9IHBqX0FGX0lORVQoKTsKKworICAgIFBKX1RSWSB7CisgICAgICAgIHJldHVybiB0ZXN0X2lubmVyKCk7CisgICAgfQorICAgIFBKX0NBVENIX0FOWSB7CisgICAgICAgIGludCBpZCA9IFBKX0dFVF9FWENFUFRJT04oKTsKKyAgICAgICAgUEpfTE9HKDMsKCJ0ZXN0IiwgIkZBVEFMOiB1bmhhbmRsZWQgZXhjZXB0aW9uIGlkICVkICglcykiLCAKKyAgICAgICAgICAgICAgICAgIGlkLCBwal9leGNlcHRpb25faWRfbmFtZShpZCkpKTsKKyAgICB9CisgICAgUEpfRU5EOworCisgICAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3Rlc3QuaCBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU2OWVhNAotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC90ZXN0LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qICRJZDogdGVzdC5oIDM1NTMgMjAxMS0wNS0wNSAwNjoxNDoxOVogbmFuYW5nICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaWZuZGVmIF9fUEpMSUJfVEVTVF9IX18KKyNkZWZpbmUgX19QSkxJQl9URVNUX0hfXworCisjaW5jbHVkZSA8cGovdHlwZXMuaD4KKworI2RlZmluZSBHUk9VUF9MSUJDICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUk9VUF9PUyAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUk9VUF9EQVRBX1NUUlVDVFVSRSAgICAgICAgMQorI2RlZmluZSBHUk9VUF9ORVRXT1JLICAgICAgICAgICAgICAgMQorI2lmIGRlZmluZWQoUEpfU1lNQklBTikKKyMgICBkZWZpbmUgR1JPVVBfRklMRSAgICAgICAgICAgICAgIDAKKyNlbHNlCisjICAgZGVmaW5lIEdST1VQX0ZJTEUgICAgICAgICAgICAgICAxCisjZW5kaWYKKworI2RlZmluZSBJTkNMVURFX0VSUk5PX1RFU1QgICAgICAgICAgR1JPVVBfTElCQworI2RlZmluZSBJTkNMVURFX1RJTUVTVEFNUF9URVNUICAgICAgR1JPVVBfT1MKKyNkZWZpbmUgSU5DTFVERV9FWENFUFRJT05fVEVTVAkgICAgR1JPVVBfTElCQworI2RlZmluZSBJTkNMVURFX1JBTkRfVEVTVAkgICAgR1JPVVBfTElCQworI2RlZmluZSBJTkNMVURFX0xJU1RfVEVTVAkgICAgR1JPVVBfREFUQV9TVFJVQ1RVUkUKKyNkZWZpbmUgSU5DTFVERV9IQVNIX1RFU1QJICAgIEdST1VQX0RBVEFfU1RSVUNUVVJFCisjZGVmaW5lIElOQ0xVREVfUE9PTF9URVNUCSAgICBHUk9VUF9MSUJDCisjZGVmaW5lIElOQ0xVREVfUE9PTF9QRVJGX1RFU1QJICAgIEdST1VQX0xJQkMKKyNkZWZpbmUgSU5DTFVERV9TVFJJTkdfVEVTVAkgICAgR1JPVVBfREFUQV9TVFJVQ1RVUkUKKyNkZWZpbmUgSU5DTFVERV9GSUZPQlVGX1RFU1QJICAgIDAJLy8gR1JPVVBfREFUQV9TVFJVQ1RVUkUKKyNkZWZpbmUgSU5DTFVERV9SQlRSRUVfVEVTVAkgICAgR1JPVVBfREFUQV9TVFJVQ1RVUkUKKyNkZWZpbmUgSU5DTFVERV9USU1FUl9URVNUCSAgICBHUk9VUF9EQVRBX1NUUlVDVFVSRQorI2RlZmluZSBJTkNMVURFX0FUT01JQ19URVNUICAgICAgICAgR1JPVVBfT1MKKyNkZWZpbmUgSU5DTFVERV9NVVRFWF9URVNUCSAgICAoUEpfSEFTX1RIUkVBRFMgJiYgR1JPVVBfT1MpCisjZGVmaW5lIElOQ0xVREVfU0xFRVBfVEVTVCAgICAgICAgICBHUk9VUF9PUworI2RlZmluZSBJTkNMVURFX09TX1RFU1QgICAgICAgICAgICAgR1JPVVBfT1MKKyNkZWZpbmUgSU5DTFVERV9USFJFQURfVEVTVCAgICAgICAgIChQSl9IQVNfVEhSRUFEUyAmJiBHUk9VUF9PUykKKyNkZWZpbmUgSU5DTFVERV9TT0NLX1RFU1QJICAgIEdST1VQX05FVFdPUksKKyNkZWZpbmUgSU5DTFVERV9TT0NLX1BFUkZfVEVTVAkgICAgR1JPVVBfTkVUV09SSworI2RlZmluZSBJTkNMVURFX1NFTEVDVF9URVNUCSAgICBHUk9VUF9ORVRXT1JLCisjZGVmaW5lIElOQ0xVREVfVURQX0lPUVVFVUVfVEVTVCAgICBHUk9VUF9ORVRXT1JLCisjZGVmaW5lIElOQ0xVREVfVENQX0lPUVVFVUVfVEVTVCAgICBHUk9VUF9ORVRXT1JLCisjZGVmaW5lIElOQ0xVREVfQUNUSVZFU09DS19URVNUCSAgICBHUk9VUF9ORVRXT1JLCisjZGVmaW5lIElOQ0xVREVfU1NMU09DS19URVNUCSAgICAoUEpfSEFTX1NTTF9TT0NLICYmIEdST1VQX05FVFdPUkspCisjZGVmaW5lIElOQ0xVREVfSU9RVUVVRV9QRVJGX1RFU1QgICAoUEpfSEFTX1RIUkVBRFMgJiYgR1JPVVBfTkVUV09SSykKKyNkZWZpbmUgSU5DTFVERV9JT1FVRVVFX1VOUkVHX1RFU1QgIChQSl9IQVNfVEhSRUFEUyAmJiBHUk9VUF9ORVRXT1JLKQorI2RlZmluZSBJTkNMVURFX0ZJTEVfVEVTVCAgICAgICAgICAgR1JPVVBfRklMRQorCisjZGVmaW5lIElOQ0xVREVfRUNIT19TRVJWRVIgICAgICAgICAwCisjZGVmaW5lIElOQ0xVREVfRUNIT19DTElFTlQgICAgICAgICAwCisKKworI2RlZmluZSBFQ0hPX1NFUlZFUl9NQVhfVEhSRUFEUyAgICAgMgorI2RlZmluZSBFQ0hPX1NFUlZFUl9TVEFSVF9QT1JUICAgICAgNjUwMDAKKyNkZWZpbmUgRUNIT19TRVJWRVJfQUREUkVTUyAgICAgICAgICJjb21wYXEuaG9tZSIKKyNkZWZpbmUgRUNIT19TRVJWRVJfRFVSQVRJT05fTVNFQyAgICg2MCo2MCoxMDAwKQorCisjZGVmaW5lIEVDSE9fQ0xJRU5UX01BWF9USFJFQURTICAgICA2CisKK1BKX0JFR0lOX0RFQ0wKKworZXh0ZXJuIGludCBlcnJub190ZXN0KHZvaWQpOworZXh0ZXJuIGludCB0aW1lc3RhbXBfdGVzdCh2b2lkKTsKK2V4dGVybiBpbnQgZXhjZXB0aW9uX3Rlc3Qodm9pZCk7CitleHRlcm4gaW50IHJhbmRfdGVzdCh2b2lkKTsKK2V4dGVybiBpbnQgbGlzdF90ZXN0KHZvaWQpOworZXh0ZXJuIGludCBoYXNoX3Rlc3Qodm9pZCk7CitleHRlcm4gaW50IG9zX3Rlc3Qodm9pZCk7CitleHRlcm4gaW50IHBvb2xfdGVzdCh2b2lkKTsKK2V4dGVybiBpbnQgcG9vbF9wZXJmX3Rlc3Qodm9pZCk7CitleHRlcm4gaW50IHN0cmluZ190ZXN0KHZvaWQpOworZXh0ZXJuIGludCBmaWZvYnVmX3Rlc3Qodm9pZCk7CitleHRlcm4gaW50IHRpbWVyX3Rlc3Qodm9pZCk7CitleHRlcm4gaW50IHJidHJlZV90ZXN0KHZvaWQpOworZXh0ZXJuIGludCBhdG9taWNfdGVzdCh2b2lkKTsKK2V4dGVybiBpbnQgbXV0ZXhfdGVzdCh2b2lkKTsKK2V4dGVybiBpbnQgc2xlZXBfdGVzdCh2b2lkKTsKK2V4dGVybiBpbnQgdGhyZWFkX3Rlc3Qodm9pZCk7CitleHRlcm4gaW50IHNvY2tfdGVzdCh2b2lkKTsKK2V4dGVybiBpbnQgc29ja19wZXJmX3Rlc3Qodm9pZCk7CitleHRlcm4gaW50IHNlbGVjdF90ZXN0KHZvaWQpOworZXh0ZXJuIGludCB1ZHBfaW9xdWV1ZV90ZXN0KHZvaWQpOworZXh0ZXJuIGludCB1ZHBfaW9xdWV1ZV91bnJlZ190ZXN0KHZvaWQpOworZXh0ZXJuIGludCB0Y3BfaW9xdWV1ZV90ZXN0KHZvaWQpOworZXh0ZXJuIGludCBpb3F1ZXVlX3BlcmZfdGVzdCh2b2lkKTsKK2V4dGVybiBpbnQgYWN0aXZlc29ja190ZXN0KHZvaWQpOworZXh0ZXJuIGludCBmaWxlX3Rlc3Qodm9pZCk7CitleHRlcm4gaW50IHNzbF9zb2NrX3Rlc3Qodm9pZCk7CisKK2V4dGVybiBpbnQgZWNob19zZXJ2ZXIodm9pZCk7CitleHRlcm4gaW50IGVjaG9fY2xpZW50KGludCBzb2NrX3R5cGUsIGNvbnN0IGNoYXIgKnNlcnZlciwgaW50IHBvcnQpOworCitleHRlcm4gaW50IGVjaG9fc3J2X3N5bmModm9pZCk7CitleHRlcm4gaW50IHVkcF9lY2hvX3Nydl9pb3F1ZXVlKHZvaWQpOworZXh0ZXJuIGludCBlY2hvX3Nydl9jb21tb25fbG9vcChwal9hdG9taWNfdCAqYnl0ZXNfY291bnRlcik7CisKKworZXh0ZXJuIHBqX3Bvb2xfZmFjdG9yeSAqbWVtOworCitleHRlcm4gaW50ICAgICAgICAgIHRlc3RfbWFpbih2b2lkKTsKK2V4dGVybiB2b2lkICAgICAgICAgYXBwX3BlcnJvcihjb25zdCBjaGFyICptc2csIHBqX3N0YXR1c190IGVycik7CitleHRlcm4gcGpfc3RhdHVzX3QgIGFwcF9zb2NrZXQoaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90bywgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc29ja190ICpwdHJfc29jayk7CitleHRlcm4gcGpfc3RhdHVzX3QgIGFwcF9zb2NrZXRwYWlyKGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX3NvY2tfdCAqc2VydmVyLCBwal9zb2NrX3QgKmNsaWVudCk7CitleHRlcm4gaW50CSAgICBudWxsX2Z1bmModm9pZCk7CisKKy8vI2RlZmluZSBUUkFDRV8oZXhwcikgUEpfTE9HKDMsZXhwcikKKyNkZWZpbmUgVFJBQ0VfKGV4cHIpCisjZGVmaW5lIEhBTFQobXNnKSAgIHsgUEpfTE9HKDMsKFRISVNfRklMRSwiJXMgaGFsdGVkIixtc2cpKTsgZm9yKDs7KSBzbGVlcCgxKTsgfQorCitQSl9FTkRfREVDTAorCisjZW5kaWYJLyogX19QSkxJQl9URVNUX0hfXyAqLworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdGVzdF93cmFwLmNwcCBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC90ZXN0X3dyYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNDEyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdGVzdF93cmFwLmNwcApAQCAtMCwwICsxLDI0IEBACisvKiAkSWQ6IHRlc3Rfd3JhcC5jcHAgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYSBDKysgd3JhcHBlciwgc2VlIHRpY2tldCAjODg2IGZvciBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJ0ZXN0LmMiCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdGhyZWFkLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2MzE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC90aHJlYWQuYwpAQCAtMCwwICsxLDMzNiBAQAorLyogJElkOiB0aHJlYWQuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKworLyoqCisgKiBccGFnZSBwYWdlX3BqbGliX3RocmVhZF90ZXN0IFRlc3Q6IFRocmVhZCBUZXN0CisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIFxhIHRocmVhZF90ZXN0KCkgZGVmaW5pdGlvbi4KKyAqCisgKiBcc2VjdGlvbiB0aHJlYWRfdGVzdF9zY29wZV9zZWMgU2NvcGUgb2YgVGVzdAorICogVGhpcyB0ZXN0czoKKyAqICAtIHdoZXRoZXIgUEpfVEhSRUFEX1NVU1BFTkRFRCBmbGFnIHdvcmtzLgorICogIC0gd2hldGhlciBtdWx0aXRocmVhZGluZyB3b3Jrcy4KKyAqICAtIHdoZXRoZXIgdGhyZWFkIHRpbWVzbGljaW5nIHdvcmtzLCBhbmQgdGhyZWFkcyBoYXZlIGVxdWFsCisgKiAgICB0aW1lLXNsaWNlIHByb3BvcnRpb24uCisgKiAKKyAqIEFQSXMgdGVzdGVkOgorICogIC0gcGpfdGhyZWFkX2NyZWF0ZSgpCisgKiAgLSBwal90aHJlYWRfcmVnaXN0ZXIoKQorICogIC0gcGpfdGhyZWFkX3RoaXMoKQorICogIC0gcGpfdGhyZWFkX2dldF9uYW1lKCkKKyAqICAtIHBqX3RocmVhZF9kZXN0cm95KCkKKyAqICAtIHBqX3RocmVhZF9yZXN1bWUoKQorICogIC0gcGpfdGhyZWFkX3NsZWVwKCkKKyAqICAtIHBqX3RocmVhZF9qb2luKCkKKyAqICAtIHBqX3RocmVhZF9kZXN0cm95KCkKKyAqCisgKgorICogVGhpcyBmaWxlIGlzIDxiPnBqbGliLXRlc3QvdGhyZWFkLmM8L2I+CisgKgorICogXGluY2x1ZGUgcGpsaWItdGVzdC90aHJlYWQuYworICovCisjaWYgSU5DTFVERV9USFJFQURfVEVTVAorCisjaW5jbHVkZSA8cGpsaWIuaD4KKworI2RlZmluZSBUSElTX0ZJTEUgICAidGhyZWFkX3Rlc3QiCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcXVpdF9mbGFnPTA7CisKKyNpZiAwCisjICAgZGVmaW5lIFRSQUNFX18oYXJncykJUEpfTE9HKDMsYXJncykKKyNlbHNlCisjICAgZGVmaW5lIFRSQUNFX18oYXJncykKKyNlbmRpZgorCisKKy8qCisgKiBUaGUgdGhyZWFkJ3MgZW50cnkgcG9pbnQuCisgKgorICogRWFjaCBvZiB0aGUgdGhyZWFkIG1haW5seSB3aWxsIGp1c3QgZXhlY3V0ZSB0aGUgbG9vcCB3aGljaAorICogaW5jcmVtZW50cyBhIHZhcmlhYmxlLgorICovCitzdGF0aWMgdm9pZCogdGhyZWFkX3Byb2MocGpfdWludDMyX3QgKnBjb3VudGVyKQoreworICAgIC8qIFRlc3QgdGhhdCBwal90aHJlYWRfcmVnaXN0ZXIoKSB3b3Jrcy4gKi8KKyAgICBwal90aHJlYWRfZGVzYyBkZXNjOworICAgIHBqX3RocmVhZF90ICp0aGlzX3RocmVhZDsKKyAgICB1bnNpZ25lZCBpZDsKKyAgICBwal9zdGF0dXNfdCByYzsKKworICAgIGlkID0gKnBjb3VudGVyOworICAgIFRSQUNFX18oKFRISVNfRklMRSwgIiAgICAgdGhyZWFkICVkIHJ1bm5pbmcuLiIsIGlkKSk7CisKKyAgICBwal9iemVybyhkZXNjLCBzaXplb2YoZGVzYykpOworCisgICAgcmMgPSBwal90aHJlYWRfcmVnaXN0ZXIoInRocmVhZCIsIGRlc2MsICZ0aGlzX3RocmVhZCk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3IgaW4gcGpfdGhyZWFkX3JlZ2lzdGVyIiwgcmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBUZXN0IHRoYXQgcGpfdGhyZWFkX3RoaXMoKSB3b3JrcyAqLworICAgIHRoaXNfdGhyZWFkID0gcGpfdGhyZWFkX3RoaXMoKTsKKyAgICBpZiAodGhpc190aHJlYWQgPT0gTlVMTCkgeworICAgICAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uZXJyb3I6IHBqX3RocmVhZF90aGlzKCkgcmV0dXJucyBOVUxMISIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogVGVzdCB0aGF0IHBqX3RocmVhZF9nZXRfbmFtZSgpIHdvcmtzICovCisgICAgaWYgKHBqX3RocmVhZF9nZXRfbmFtZSh0aGlzX3RocmVhZCkgPT0gTlVMTCkgeworICAgICAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uZXJyb3I6IHBqX3RocmVhZF9nZXRfbmFtZSgpIHJldHVybnMgTlVMTCEiKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIE1haW4gbG9vcCAqLworICAgIGZvciAoOyFxdWl0X2ZsYWc7KSB7CisJKCpwY291bnRlcikrKzsKKyAgICAgICAgLy9NdXN0IHNsZWVwIGlmIHBsYXRmb3JtIGRvZXNuJ3QgZG8gdGltZS1zbGljaW5nLgorCS8vcGpfdGhyZWFkX3NsZWVwKDApOworICAgIH0KKworICAgIFRSQUNFX18oKFRISVNfRklMRSwgIiAgICAgdGhyZWFkICVkIHF1aXR0aW5nLi4iLCBpZCkpOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogc2ltcGxlX3RocmVhZCgpCisgKi8KK3N0YXRpYyBpbnQgc2ltcGxlX3RocmVhZChjb25zdCBjaGFyICp0aXRsZSwgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHBqX3RocmVhZF90ICp0aHJlYWQ7CisgICAgcGpfc3RhdHVzX3QgcmM7CisgICAgcGpfdWludDMyX3QgY291bnRlciA9IDA7CisgCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uJXMiLCB0aXRsZSkpOworICAgIAorICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIDQwMDAsIDQwMDAsIE5VTEwpOworICAgIGlmICghcG9vbCkKKwlyZXR1cm4gLTEwMDA7CisKKyAgICBxdWl0X2ZsYWcgPSAwOworCisgICAgVFJBQ0VfXygoVEhJU19GSUxFLCAiICAgIENyZWF0aW5nIHRocmVhZCAwLi4iKSk7CisgICAgcmMgPSBwal90aHJlYWRfY3JlYXRlKHBvb2wsICJ0aHJlYWQiLCAocGpfdGhyZWFkX3Byb2MqKSZ0aHJlYWRfcHJvYywKKwkJCSAgJmNvdW50ZXIsCisJCQkgIFBKX1RIUkVBRF9ERUZBVUxUX1NUQUNLX1NJWkUsCisJCQkgIGZsYWdzLAorCQkJICAmdGhyZWFkKTsKKworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uZXJyb3I6IHVuYWJsZSB0byBjcmVhdGUgdGhyZWFkIiwgcmMpOworCXJldHVybiAtMTAxMDsKKyAgICB9CisKKyAgICBUUkFDRV9fKChUSElTX0ZJTEUsICIgICAgTWFpbiB0aHJlYWQgd2FpdGluZy4uIikpOworICAgIHBqX3RocmVhZF9zbGVlcCgxNTAwKTsKKyAgICBUUkFDRV9fKChUSElTX0ZJTEUsICIgICAgTWFpbiB0aHJlYWQgcmVzdW1pbmcuLiIpKTsKKworICAgIGlmIChmbGFncyAmIFBKX1RIUkVBRF9TVVNQRU5ERUQpIHsKKworCS8qIENoZWNrIHRoYXQgY291bnRlciBpcyBzdGlsbCB6ZXJvICovCisJaWYgKGNvdW50ZXIgIT0gMCkgeworCSAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uZXJyb3I6IHRocmVhZCBpcyBub3Qgc3VzcGVuZGVkIikpOworCSAgICByZXR1cm4gLTEwMTU7CisJfQorCQorCXJjID0gcGpfdGhyZWFkX3Jlc3VtZSh0aHJlYWQpOworCWlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJICAgIGFwcF9wZXJyb3IoIi4uLmVycm9yOiByZXN1bWUgdGhyZWFkIGVycm9yIiwgcmMpOworCSAgICByZXR1cm4gLTEwMjA7CisJfQorICAgIH0KKyAgICAKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi53YWl0aW5nIGZvciB0aHJlYWQgdG8gcXVpdC4uIikpOworCisgICAgcGpfdGhyZWFkX3NsZWVwKDE1MDApOworCisgICAgcXVpdF9mbGFnID0gMTsKKyAgICBwal90aHJlYWRfam9pbih0aHJlYWQpOworCisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworCisgICAgaWYgKGNvdW50ZXIgPT0gMCkgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICIuLi5lcnJvcjogdGhyZWFkIGlzIG5vdCBydW5uaW5nIikpOworCXJldHVybiAtMTAyNTsKKyAgICB9CisgICAgCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLiVzIHN1Y2Nlc3MiLCB0aXRsZSkpOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCisKKy8qCisgKiB0aW1lc2xpY2VfdGVzdCgpCisgKi8KK3N0YXRpYyBpbnQgdGltZXNsaWNlX3Rlc3Qodm9pZCkKK3sKKyAgICBlbnVtIHsgTlVNX1RIUkVBRFMgPSA0IH07CisgICAgcGpfcG9vbF90ICpwb29sOworICAgIHBqX3VpbnQzMl90IGNvdW50ZXJbTlVNX1RIUkVBRFNdLCBsb3dlc3QsIGhpZ2hlc3QsIGRpZmY7CisgICAgcGpfdGhyZWFkX3QgKnRocmVhZFtOVU1fVEhSRUFEU107CisgICAgdW5zaWduZWQgaTsKKyAgICBwal9zdGF0dXNfdCByYzsKKworICAgIHF1aXRfZmxhZyA9IDA7CisKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUobWVtLCBOVUxMLCA0MDAwLCA0MDAwLCBOVUxMKTsKKyAgICBpZiAoIXBvb2wpCisgICAgICAgIHJldHVybiAtMTA7CisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi50aW1lc2xpY2UgdGVzdGluZyB3aXRoICVkIHRocmVhZHMiLCBOVU1fVEhSRUFEUykpOworCisgICAgLyogQ3JlYXRlIGFsbCB0aHJlYWRzIGluIHN1c3BlbmRlZCBtb2RlLiAqLworICAgIGZvciAoaT0wOyBpPE5VTV9USFJFQURTOyArK2kpIHsKKyAgICAgICAgY291bnRlcltpXSA9IGk7CisgICAgICAgIHJjID0gcGpfdGhyZWFkX2NyZWF0ZShwb29sLCAidGhyZWFkIiwgKHBqX3RocmVhZF9wcm9jKikmdGhyZWFkX3Byb2MsIAorCQkJICAgICAgJmNvdW50ZXJbaV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfVEhSRUFEX0RFRkFVTFRfU1RBQ0tfU0laRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSl9USFJFQURfU1VTUEVOREVELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRbaV0pOworICAgICAgICBpZiAocmMhPVBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLkVSUk9SIGluIHBqX3RocmVhZF9jcmVhdGUoKSIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAtMjA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTbGVlcCBmb3IgMSBzZWNvbmQuCisgICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byB0ZXN0IHdoZXRoZXIgYWxsIHRocmVhZHMgYXJlIHN1c3BlbmRlZC4KKyAgICAgKi8KKyAgICBUUkFDRV9fKChUSElTX0ZJTEUsICIgICAgTWFpbiB0aHJlYWQgd2FpdGluZy4uIikpOworICAgIHBqX3RocmVhZF9zbGVlcCgxMDAwKTsKKyAgICBUUkFDRV9fKChUSElTX0ZJTEUsICIgICAgTWFpbiB0aHJlYWQgcmVzdW1pbmcuLiIpKTsKKworICAgIC8qIENoZWNrIHRoYXQgYWxsIGNvdW50ZXJzIGFyZSBzdGlsbCB6ZXJvLiAqLworICAgIGZvciAoaT0wOyBpPE5VTV9USFJFQURTOyArK2kpIHsKKyAgICAgICAgaWYgKGNvdW50ZXJbaV0gPiBpKSB7CisgICAgICAgICAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uLkVSUk9SISBUaHJlYWQgJWQtdGggaXMgbm90IHN1c3BlbmRlZCEiLCAKKwkJICAgICAgaSkpOworICAgICAgICAgICAgcmV0dXJuIC0zMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5vdyByZXN1bWUgYWxsIHRocmVhZHMuICovCisgICAgZm9yIChpPTA7IGk8TlVNX1RIUkVBRFM7ICsraSkgeworCVRSQUNFX18oKFRISVNfRklMRSwgIiAgICBSZXN1bWluZyB0aHJlYWQgJWQgWyVwXS4uIiwgaSwgdGhyZWFkW2ldKSk7CisgICAgICAgIHJjID0gcGpfdGhyZWFkX3Jlc3VtZSh0aHJlYWRbaV0pOworICAgICAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgYXBwX3BlcnJvcigiLi4uRVJST1IgaW4gcGpfdGhyZWFkX3Jlc3VtZSgpIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuIC00MDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE1haW4gdGhyZWFkIHNsZWVwcyBmb3Igc29tZSB0aW1lIHRvIGFsbG93IHRocmVhZHMgdG8gcnVuLiAKKyAgICAgKiBUaGUgbG9uZ2VyIHdlIHNsZWVwLCB0aGUgbW9yZSBhY2N1cmF0ZSB0aGUgY2FsY3VsYXRpb24gd2lsbCBiZSwKKyAgICAgKiBidXQgaXQnbGwgbWFrZSB1c2VyIHdhaXRzIGZvciBsb25nZXIgZm9yIHRoZSB0ZXN0IHRvIGZpbmlzaC4KKyAgICAgKi8KKyAgICBUUkFDRV9fKChUSElTX0ZJTEUsICIgICAgTWFpbiB0aHJlYWQgd2FpdGluZyAoNXMpLi4iKSk7CisgICAgcGpfdGhyZWFkX3NsZWVwKDUwMDApOworICAgIFRSQUNFX18oKFRISVNfRklMRSwgIiAgICBNYWluIHRocmVhZCByZXN1bWluZy4uIikpOworCisgICAgLyogU2lnbmFsIGFsbCB0aHJlYWRzIHRvIHF1aXQuICovCisgICAgcXVpdF9mbGFnID0gMTsKKworICAgIC8qIFdhaXQgdW50aWwgYWxsIHRocmVhZHMgcXVpdCwgdGhlbiBkZXN0cm95LiAqLworICAgIGZvciAoaT0wOyBpPE5VTV9USFJFQURTOyArK2kpIHsKKwlUUkFDRV9fKChUSElTX0ZJTEUsICIgICAgTWFpbiB0aHJlYWQgam9pbmluZyB0aHJlYWQgJWQgWyVwXS4uIiwgCisJCQkgICAgaSwgdGhyZWFkW2ldKSk7CisgICAgICAgIHJjID0gcGpfdGhyZWFkX2pvaW4odGhyZWFkW2ldKTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLkVSUk9SIGluIHBqX3RocmVhZF9qb2luKCkiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLTUwOworICAgICAgICB9CisJVFJBQ0VfXygoVEhJU19GSUxFLCAiICAgIERlc3Ryb3lpbmcgdGhyZWFkICVkIFslcF0uLiIsIGksIHRocmVhZFtpXSkpOworICAgICAgICByYyA9IHBqX3RocmVhZF9kZXN0cm95KHRocmVhZFtpXSk7CisgICAgICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5FUlJPUiBpbiBwal90aHJlYWRfZGVzdHJveSgpIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuIC02MDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRSQUNFX18oKFRISVNfRklMRSwgIiAgICBNYWluIHRocmVhZCBjYWxjdWxhdGluZyB0aW1lIHNsaWNlcy4uIikpOworCisgICAgLyogTm93IGV4YW1pbmUgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVycy4KKyAgICAgKiBDaGVjayB0aGF0IGFsbCB0aHJlYWRzIGhhZCBlcXVhbCBwcm9wb3J0aW9uIG9mIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgbG93ZXN0ID0gMHhGRkZGRkZGRjsKKyAgICBoaWdoZXN0ID0gMDsKKyAgICBmb3IgKGk9MDsgaTxOVU1fVEhSRUFEUzsgKytpKSB7CisgICAgICAgIGlmIChjb3VudGVyW2ldIDwgbG93ZXN0KQorICAgICAgICAgICAgbG93ZXN0ID0gY291bnRlcltpXTsKKyAgICAgICAgaWYgKGNvdW50ZXJbaV0gPiBoaWdoZXN0KQorICAgICAgICAgICAgaGlnaGVzdCA9IGNvdW50ZXJbaV07CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhhdCBhbGwgdGhyZWFkcyBhcmUgcnVubmluZy4gKi8KKyAgICBpZiAobG93ZXN0IDwgMikgeworICAgICAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uRVJST1I6IG5vdCBhbGwgdGhyZWFkcyB3ZXJlIHJ1bm5pbmchIikpOworICAgICAgICByZXR1cm4gLTcwOworICAgIH0KKworICAgIC8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbG93ZXN0IGFuZCBoaWdlc3Qgc2hvdWxkIGJlIGxvd2VyIHRoYW4gNTAlLgorICAgICAqLworICAgIGRpZmYgPSAoaGlnaGVzdC1sb3dlc3QpKjEwMCAvICgoaGlnaGVzdCtsb3dlc3QpLzIpOworICAgIGlmICggZGlmZiA+PSA1MCkgeworICAgICAgICBQSl9MT0coMywoVEhJU19GSUxFLCAKKwkJICAiLi4uRVJST1I6IHRocmVhZCBkaWRuJ3QgaGF2ZSBlcXVhbCB0aW1lc2xpY2UhIikpOworICAgICAgICBQSl9MT0coMywoVEhJU19GSUxFLCAKKwkJICAiLi4uLi5sb3dlc3QgY291bnRlcj0ldSwgaGlnaGVzdCBjb3VudGVyPSV1LCBkaWZmPSV1JSUiLAorICAgICAgICAgICAgICAgICAgbG93ZXN0LCBoaWdoZXN0LCBkaWZmKSk7CisgICAgICAgIHJldHVybiAtODA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgCisgICAgICAgICAgICAgICAgICAiLi4uaW5mbzogdGltZXNsaWNlIGRpZmYgYmV0d2VlbiBsb3dlc3QgJiBoaWdoZXN0PSV1JSUiLAorICAgICAgICAgICAgICAgICAgZGlmZikpOworICAgIH0KKworICAgIHBqX3Bvb2xfcmVsZWFzZShwb29sKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHRocmVhZF90ZXN0KHZvaWQpCit7CisgICAgaW50IHJjOworCisgICAgcmMgPSBzaW1wbGVfdGhyZWFkKCJzaW1wbGUgdGhyZWFkIHRlc3QiLCAwKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gcmM7CisgICAgCisgICAgcmMgPSBzaW1wbGVfdGhyZWFkKCJzdXNwZW5kZWQgdGhyZWFkIHRlc3QiLCBQSl9USFJFQURfU1VTUEVOREVEKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKwlyZXR1cm4gcmM7CisgICAgCisgICAgcmMgPSB0aW1lc2xpY2VfdGVzdCgpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKQorCXJldHVybiByYzsKKworICAgIHJldHVybiByYzsKK30KKworI2Vsc2UKKy8qIFRvIHByZXZlbnQgd2FybmluZyBhYm91dCAidHJhbnNsYXRpb24gdW5pdCBpcyBlbXB0eSIKKyAqIHdoZW4gdGhpcyB0ZXN0IGlzIGRpc2FibGVkLiAKKyAqLworaW50IGR1bW15X3RocmVhZF90ZXN0OworI2VuZGlmCS8qIElOQ0xVREVfVEhSRUFEX1RFU1QgKi8KKworCmRpZmYgLS1naXQgYS9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdGltZXIuYyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDA5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdGltZXIuYwpAQCAtMCwwICsxLDE5NyBAQAorLyogJElkOiB0aW1lci5jIDQ1MzcgMjAxMy0wNi0xOSAwNjo0Nzo0M1ogcml6YSAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKworLyoqCisgKiBccGFnZSBwYWdlX3BqbGliX3RpbWVyX3Rlc3QgVGVzdDogVGltZXIKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgaW1wbGVtZW50YXRpb24gb2YgXGIgdGltZXJfdGVzdCgpLiBJdCB0ZXN0cyB0aGUKKyAqIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHRpbWVyIGhlYXAuCisgKgorICoKKyAqIFRoaXMgZmlsZSBpcyA8Yj5wamxpYi10ZXN0L3RpbWVyLmM8L2I+CisgKgorICogXGluY2x1ZGUgcGpsaWItdGVzdC90aW1lci5jCisgKi8KKworCisjaWYgSU5DTFVERV9USU1FUl9URVNUCisKKyNpbmNsdWRlIDxwamxpYi5oPgorCisjZGVmaW5lIExPT1AJCTE2CisjZGVmaW5lIE1JTl9DT1VOVAkyNTAKKyNkZWZpbmUgTUFYX0NPVU5UCShMT09QICogTUlOX0NPVU5UKQorI2RlZmluZSBNSU5fREVMQVkJMgorI2RlZmluZQlECQkoTUFYX0NPVU5UIC8gMzIwMDApCisjZGVmaW5lIERFTEFZCQkoRCA8IE1JTl9ERUxBWSA/IE1JTl9ERUxBWSA6IEQpCisjZGVmaW5lIFRISVNfRklMRQkidGltZXJfdGVzdCIKKworCitzdGF0aWMgdm9pZCB0aW1lcl9jYWxsYmFjayhwal90aW1lcl9oZWFwX3QgKmh0LCBwal90aW1lcl9lbnRyeSAqZSkKK3sKKyAgICBQSl9VTlVTRURfQVJHKGh0KTsKKyAgICBQSl9VTlVTRURfQVJHKGUpOworfQorCitzdGF0aWMgaW50IHRlc3RfdGltZXJfaGVhcCh2b2lkKQoreworICAgIGludCBpLCBqOworICAgIHBqX3RpbWVyX2VudHJ5ICplbnRyeTsKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGpfdGltZXJfaGVhcF90ICp0aW1lcjsKKyAgICBwal90aW1lX3ZhbCBkZWxheTsKKyAgICBwal9zdGF0dXNfdCByYzsgICAgaW50IGVycj0wOworICAgIHBqX3NpemVfdCBzaXplOworICAgIHVuc2lnbmVkIGNvdW50OworCisgICAgc2l6ZSA9IHBqX3RpbWVyX2hlYXBfbWVtX3NpemUoTUFYX0NPVU5UKStNQVhfQ09VTlQqc2l6ZW9mKHBqX3RpbWVyX2VudHJ5KTsKKyAgICBwb29sID0gcGpfcG9vbF9jcmVhdGUoIG1lbSwgTlVMTCwgc2l6ZSwgNDAwMCwgTlVMTCk7CisgICAgaWYgKCFwb29sKSB7CisJUEpfTE9HKDMsKCJ0ZXN0IiwgIi4uLmVycm9yOiB1bmFibGUgdG8gY3JlYXRlIHBvb2wgb2YgJXUgYnl0ZXMiLAorCQkgIHNpemUpKTsKKwlyZXR1cm4gLTEwOworICAgIH0KKworICAgIGVudHJ5ID0gKHBqX3RpbWVyX2VudHJ5Kilwal9wb29sX2NhbGxvYyhwb29sLCBNQVhfQ09VTlQsIHNpemVvZigqZW50cnkpKTsKKyAgICBpZiAoIWVudHJ5KQorCXJldHVybiAtMjA7CisKKyAgICBmb3IgKGk9MDsgaTxNQVhfQ09VTlQ7ICsraSkgeworCWVudHJ5W2ldLmNiID0gJnRpbWVyX2NhbGxiYWNrOworICAgIH0KKyAgICByYyA9IHBqX3RpbWVyX2hlYXBfY3JlYXRlKHBvb2wsIE1BWF9DT1VOVCwgJnRpbWVyKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvcjogdW5hYmxlIHRvIGNyZWF0ZSB0aW1lciBoZWFwIiwgcmMpOworCXJldHVybiAtMzA7CisgICAgfQorCisgICAgY291bnQgPSBNSU5fQ09VTlQ7CisgICAgZm9yIChpPTA7IGk8TE9PUDsgKytpKSB7CisJaW50IGVhcmx5ID0gMDsKKwlpbnQgZG9uZT0wOworCWludCBjYW5jZWxsZWQ9MDsKKwlpbnQgcmM7CisJcGpfdGltZXN0YW1wIHQxLCB0MiwgdF9zY2hlZCwgdF9jYW5jZWwsIHRfcG9sbDsKKwlwal90aW1lX3ZhbCBub3csIGV4cGlyZTsKKworCXBqX2dldHRpbWVvZmRheSgmbm93KTsKKwlwal9zcmFuZChub3cuc2VjKTsKKwl0X3NjaGVkLnUzMi5sbyA9IHRfY2FuY2VsLnUzMi5sbyA9IHRfcG9sbC51MzIubG8gPSAwOworCisJLy8gUmVnaXN0ZXIgdGltZXJzCisJZm9yIChqPTA7IGo8KGludCljb3VudDsgKytqKSB7CisJICAgIGRlbGF5LnNlYyA9IHBqX3JhbmQoKSAlIERFTEFZOworCSAgICBkZWxheS5tc2VjID0gcGpfcmFuZCgpICUgMTAwMDsKKworCSAgICAvLyBTY2hlZHVsZSB0aW1lcgorCSAgICBwal9nZXRfdGltZXN0YW1wKCZ0MSk7CisJICAgIHJjID0gcGpfdGltZXJfaGVhcF9zY2hlZHVsZSh0aW1lciwgJmVudHJ5W2pdLCAmZGVsYXkpOworCSAgICBpZiAocmMgIT0gMCkKKwkJcmV0dXJuIC00MDsKKwkgICAgcGpfZ2V0X3RpbWVzdGFtcCgmdDIpOworCisJICAgIHRfc2NoZWQudTMyLmxvICs9ICh0Mi51MzIubG8gLSB0MS51MzIubG8pOworCisJICAgIC8vIFBvbGwgdGltZXJzLgorCSAgICBwal9nZXRfdGltZXN0YW1wKCZ0MSk7CisJICAgIHJjID0gcGpfdGltZXJfaGVhcF9wb2xsKHRpbWVyLCBOVUxMKTsKKwkgICAgcGpfZ2V0X3RpbWVzdGFtcCgmdDIpOworCSAgICBpZiAocmMgPiAwKSB7CisJCXRfcG9sbC51MzIubG8gKz0gKHQyLnUzMi5sbyAtIHQxLnUzMi5sbyk7CisJCWVhcmx5ICs9IHJjOworCSAgICB9CisJfQorCisJLy8gU2V0IHRoZSB0aW1lIHdoZXJlIGFsbCB0aW1lcnMgc2hvdWxkIGZpbmlzaAorCXBqX2dldHRpbWVvZmRheSgmZXhwaXJlKTsKKwlkZWxheS5zZWMgPSBERUxBWTsgCisJZGVsYXkubXNlYyA9IDA7CisJUEpfVElNRV9WQUxfQUREKGV4cGlyZSwgZGVsYXkpOworCisJLy8gV2FpdCB1bmZpbCBhbGwgdGltZXJzIGZpbmlzaCwgY2FuY2VsIHNvbWUgb2YgdGhlbS4KKwlkbyB7CisJICAgIGludCBpbmRleCA9IHBqX3JhbmQoKSAlIGNvdW50OworCSAgICBwal9nZXRfdGltZXN0YW1wKCZ0MSk7CisJICAgIHJjID0gcGpfdGltZXJfaGVhcF9jYW5jZWwodGltZXIsICZlbnRyeVtpbmRleF0pOworCSAgICBwal9nZXRfdGltZXN0YW1wKCZ0Mik7CisJICAgIGlmIChyYyA+IDApIHsKKwkJY2FuY2VsbGVkICs9IHJjOworCQl0X2NhbmNlbC51MzIubG8gKz0gKHQyLnUzMi5sbyAtIHQxLnUzMi5sbyk7CisJICAgIH0KKworCSAgICBwal9nZXR0aW1lb2ZkYXkoJm5vdyk7CisKKwkgICAgcGpfZ2V0X3RpbWVzdGFtcCgmdDEpOworI2lmIGRlZmluZWQoUEpfU1lNQklBTikgJiYgUEpfU1lNQklBTiE9MAorCSAgICAvKiBPbiBTeW1iaWFuLCB3ZSBtdXN0IHVzZSBPUyBwb2xsIChBY3RpdmUgU2NoZWR1bGVyIHBvbGwpIHNpbmNlIAorCSAgICAgKiB0aW1lciBpcyBpbXBsZW1lbnRlZCB1c2luZyBBY3RpdmUgT2JqZWN0LgorCSAgICAgKi8KKwkgICAgcmMgPSAwOworCSAgICB3aGlsZSAocGpfc3ltYmlhbm9zX3BvbGwoLTEsIDApKQorCQkrK3JjOworI2Vsc2UKKwkgICAgcmMgPSBwal90aW1lcl9oZWFwX3BvbGwodGltZXIsIE5VTEwpOworI2VuZGlmCisJICAgIHBqX2dldF90aW1lc3RhbXAoJnQyKTsKKwkgICAgaWYgKHJjID4gMCkgeworCQlkb25lICs9IHJjOworCQl0X3BvbGwudTMyLmxvICs9ICh0Mi51MzIubG8gLSB0MS51MzIubG8pOworCSAgICB9CisKKwl9IHdoaWxlIChQSl9USU1FX1ZBTF9MVEUobm93LCBleHBpcmUpJiZwal90aW1lcl9oZWFwX2NvdW50KHRpbWVyKSA+IDApOworCisJaWYgKHBqX3RpbWVyX2hlYXBfY291bnQodGltZXIpKSB7CisJICAgIFBKX0xPRygzLCAoVEhJU19GSUxFLCAiRVJST1I6ICVkIHRpbWVycyBsZWZ0IiwgCisJCSAgICAgICBwal90aW1lcl9oZWFwX2NvdW50KHRpbWVyKSkpOworCSAgICArK2VycjsKKwl9CisJdF9zY2hlZC51MzIubG8gLz0gY291bnQ7IAorCXRfY2FuY2VsLnUzMi5sbyAvPSBjb3VudDsKKwl0X3BvbGwudTMyLmxvIC89IGNvdW50OworCVBKX0xPRyg0LCAoVEhJU19GSUxFLCAKKwkgICAgICAgICIuLi5vayAoY291bnQ6JWQsIGVhcmx5OiVkLCBjYW5jZWxsZWQ6JWQsICIKKwkJInNjaGVkOiVkLCBjYW5jZWw6JWQgcG9sbDolZCkiLCAKKwkJY291bnQsIGVhcmx5LCBjYW5jZWxsZWQsIHRfc2NoZWQudTMyLmxvLCB0X2NhbmNlbC51MzIubG8sCisJCXRfcG9sbC51MzIubG8pKTsKKworCWNvdW50ID0gY291bnQgKiAyOworCWlmIChjb3VudCA+IE1BWF9DT1VOVCkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgcGpfcG9vbF9yZWxlYXNlKHBvb2wpOworICAgIHJldHVybiBlcnI7Cit9CisKKworaW50IHRpbWVyX3Rlc3QoKQoreworICAgIHJldHVybiB0ZXN0X3RpbWVyX2hlYXAoKTsKK30KKworI2Vsc2UKKy8qIFRvIHByZXZlbnQgd2FybmluZyBhYm91dCAidHJhbnNsYXRpb24gdW5pdCBpcyBlbXB0eSIKKyAqIHdoZW4gdGhpcyB0ZXN0IGlzIGRpc2FibGVkLiAKKyAqLworaW50IGR1bW15X3RpbWVyX3Rlc3Q7CisjZW5kaWYJLyogSU5DTFVERV9USU1FUl9URVNUICovCisKKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3RpbWVzdGFtcC5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3RpbWVzdGFtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMDQwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdGltZXN0YW1wLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qICRJZDogdGltZXN0YW1wLmMgMzU1MyAyMDExLTA1LTA1IDA2OjE0OjE5WiBuYW5hbmcgJCAqLworLyogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUZWx1dSBJbmMuIChodHRwOi8vd3d3LnRlbHV1LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEJlbm55IFByaWpvbm8gPGJlbm55QHByaWpvbm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKi8KKyNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8cGovb3MuaD4KKyNpbmNsdWRlIDxwai9sb2cuaD4KKyNpbmNsdWRlIDxwai9yYW5kLmg+CisKKworLyoqCisgKiBccGFnZSBwYWdlX3BqbGliX3RpbWVzdGFtcF90ZXN0IFRlc3Q6IFRpbWVzdGFtcAorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiB0aW1lc3RhbXBfdGVzdCgpCisgKgorICogXHNlY3Rpb24gdGltZXN0YW1wX3Rlc3Rfc2VjIFNjb3BlIG9mIHRoZSBUZXN0CisgKgorICogVGhpcyB0ZXN0cyB3aGV0aGVyIHRpbWVzdGFtcCBBUEkgd29ya3MuCisgKgorICogQVBJIHRlc3RlZDoKKyAqICAtIHBqX2dldF90aW1lc3RhbXBfZnJlcSgpCisgKiAgLSBwal9nZXRfdGltZXN0YW1wKCkKKyAqICAtIHBqX2VsYXBzZWRfdXNlYygpCisgKiAgLSBQSl9MT0coKQorICoKKyAqCisgKiBUaGlzIGZpbGUgaXMgPGI+cGpsaWItdGVzdC90aW1lc3RhbXAuYzwvYj4KKyAqCisgKiBcaW5jbHVkZSBwamxpYi10ZXN0L3RpbWVzdGFtcC5jCisgKi8KKworI2lmIElOQ0xVREVfVElNRVNUQU1QX1RFU1QKKworI2RlZmluZSBUSElTX0ZJTEUgICAidGltZXN0YW1wIgorCitzdGF0aWMgaW50IHRpbWVzdGFtcF9hY2N1cmFjeSgpCit7CisgICAgcGpfdGltZXN0YW1wIGZyZXEsIHQxLCB0MjsKKyAgICBwal90aW1lX3ZhbCB0djEsIHR2MiwgdHZ0bXA7CisgICAgcGpfaW50NjRfdCBtc2VjLCB0aWNzOworICAgIHBqX2ludDY0X3QgZGlmZjsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLi50ZXN0aW5nIGZyZXF1ZW5jeSBhY2N1cmFjeSAocGxzIHdhaXQpIikpOworCisgICAgcGpfZ2V0X3RpbWVzdGFtcF9mcmVxKCZmcmVxKTsKKworICAgIC8qIEdldCB0aGUgc3RhcnQgdGltZSAqLworICAgIHBqX2dldHRpbWVvZmRheSgmdHZ0bXApOworICAgIGRvIHsKKwlwal9nZXR0aW1lb2ZkYXkoJnR2MSk7CisgICAgfSB3aGlsZSAoUEpfVElNRV9WQUxfRVEodHZ0bXAsIHR2MSkpOworICAgIHBqX2dldF90aW1lc3RhbXAoJnQxKTsKKworICAgIC8qIFNsZWVwIGZvciAxMCBzZWNvbmRzICovCisgICAgcGpfdGhyZWFkX3NsZWVwKDEwMDAwKTsKKworICAgIC8qIEdldCBlbmQgdGltZSAqLworICAgIHBqX2dldHRpbWVvZmRheSgmdHZ0bXApOworICAgIGRvIHsKKwlwal9nZXR0aW1lb2ZkYXkoJnR2Mik7CisgICAgfSB3aGlsZSAoUEpfVElNRV9WQUxfRVEodHZ0bXAsIHR2MikpOworICAgIHBqX2dldF90aW1lc3RhbXAoJnQyKTsKKworICAgIC8qIEdldCB0aGUgZWxhcHNlZCB0aW1lICovCisgICAgUEpfVElNRV9WQUxfU1VCKHR2MiwgdHYxKTsKKyAgICBtc2VjID0gUEpfVElNRV9WQUxfTVNFQyh0djIpOworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgZnJlcXVlbmN5IG1hdGNoIHRoZSBlbGFwc2VkIHRpbWUgKi8KKyAgICB0aWNzID0gdDIudTY0IC0gdDEudTY0OworICAgIGRpZmYgPSB0aWNzIC0gKG1zZWMgKiBmcmVxLnU2NCAvIDEwMDApOworICAgIGlmIChkaWZmIDwgMCkKKwlkaWZmID0gLWRpZmY7CisKKyAgICAvKiBPbmx5IGFsbG93IDEgbXNlYyBtaXNtYXRjaCAqLworICAgIGlmIChkaWZmID4gKHBqX2ludDY0X3QpKGZyZXEudTY0IC8gMTAwMCkpIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uLmVycm9yOiB0aW1lc3RhbXAgZHJpZnRlZCBieSAlZCB1c2VjIGFmdGVyICIKKwkJCSAgICAgIiVkIG1zZWMiLCAKKwkJCSAgICAgKHBqX3VpbnQzMl90KShkaWZmICogMTAwMDAwMCAvIGZyZXEudTY0KSwgCisJCQkgICAgIG1zZWMpKTsKKwlyZXR1cm4gLTIwMDA7CisKKyAgICAvKiBPdGhlcndpc2UganVzdCBwcmludCB3YXJuaW5nIGlmIHRpbWVzdGFtcCBkcmlmdGVkIGJ5ID4xIHVzZWMgKi8KKyAgICB9IGVsc2UgaWYgKGRpZmYgPiAocGpfaW50NjRfdCkoZnJlcS51NjQgLyAxMDAwMDAwKSkgeworCVBKX0xPRygzLChUSElTX0ZJTEUsICIuLi4ud2FybmluZzogdGltZXN0YW1wIGRyaWZ0ZWQgYnkgJWQgdXNlYyBhZnRlciAiCisJCQkgICAgICIlZCBtc2VjIiwgCisJCQkgICAgIChwal91aW50MzJfdCkoZGlmZiAqIDEwMDAwMDAgLyBmcmVxLnU2NCksIAorCQkJICAgICBtc2VjKSk7CisgICAgfSBlbHNlIHsKKwlQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uLmdvb2QuIFRpbWVzdGFtcCBpcyBhY2N1cmF0ZSBkb3duIHRvIgorCQkJICAgICAiIG5lYXJlc3QgdXNlYy4iKSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IHRpbWVzdGFtcF90ZXN0KHZvaWQpCit7CisgICAgZW51bSB7IENPTlNFQ1VUSVZFX0xPT1AgPSAxMDAgfTsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBpOworICAgIHBqX3RpbWVzdGFtcCBmcmVxLCB0MSwgdDI7CisgICAgcGpfdGltZV92YWwgdHYxLCB0djI7CisgICAgdW5zaWduZWQgZWxhcHNlZDsKKyAgICBwal9zdGF0dXNfdCByYzsKKworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLi5UZXN0aW5nIHRpbWVzdGFtcCAoaGlnaCByZXMgdGltZSkiKSk7CisgICAgCisgICAgLyogR2V0IGFuZCBkaXNwbGF5IHRpbWVzdGFtcCBmcmVxdWVuY3kuICovCisgICAgaWYgKChyYz1wal9nZXRfdGltZXN0YW1wX2ZyZXEoJmZyZXEpKSAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uRVJST1I6IGdldCB0aW1lc3RhbXAgZnJlcSIsIHJjKTsKKwlyZXR1cm4gLTEwMDA7CisgICAgfQorCisgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLi5mcmVxdWVuY3k6IGhpd29yZD0lbHUgbG93b3JkPSVsdSIsIAorCQkJZnJlcS51MzIuaGksIGZyZXEudTMyLmxvKSk7CisKKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uY2hlY2tpbmcgaWYgdGltZSBjYW4gcnVuIGJhY2t3YXJkcyAocGxzIHdhaXQpLi4iKSk7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIGNvbnNlY3V0aXZlIHJlYWRpbmdzIHNob3VsZCB5aWVsZCB0aW1lc3RhbXAgdmFsdWUKKyAgICAgKiB0aGF0IGlzIGJpZ2dlciB0aGFuIHByZXZpb3VzIHZhbHVlLgorICAgICAqIEZpcnN0IHdlIGdldCB0aGUgZmlyc3QgdGltZXN0YW1wLgorICAgICAqLworICAgIHJjID0gcGpfZ2V0X3RpbWVzdGFtcCgmdDEpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uRVJST1I6IHBqX2dldF90aW1lc3RhbXAiLCByYyk7CisJcmV0dXJuIC0xMDAxOworICAgIH0KKyAgICByYyA9IHBqX2dldHRpbWVvZmRheSgmdHYxKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworCWFwcF9wZXJyb3IoIi4uLkVSUk9SOiBwal9nZXR0aW1lb2ZkYXkiLCByYyk7CisJcmV0dXJuIC0xMDAyOworICAgIH0KKyAgICBmb3IgKGk9MDsgaTxDT05TRUNVVElWRV9MT09QOyArK2kpIHsKKyAgICAgICAgCisgICAgICAgIHBqX3RocmVhZF9zbGVlcChwal9yYW5kKCkgJSAxMDApOworCisJcmMgPSBwal9nZXRfdGltZXN0YW1wKCZ0Mik7CisJaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcigiLi4uRVJST1I6IHBqX2dldF90aW1lc3RhbXAiLCByYyk7CisJICAgIHJldHVybiAtMTAwMzsKKwl9CisJcmMgPSBwal9nZXR0aW1lb2ZkYXkoJnR2Mik7CisJaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKwkgICAgYXBwX3BlcnJvcigiLi4uRVJST1I6IHBqX2dldHRpbWVvZmRheSIsIHJjKTsKKwkgICAgcmV0dXJuIC0xMDA0OworCX0KKworCS8qIGNvbXBhcmUgdDIgd2l0aCB0MSwgZXhwZWN0aW5nIHQyID49IHQxLiAqLworCWlmICh0Mi51MzIuaGkgPCB0MS51MzIuaGkgfHwKKwkgICAgKHQyLnUzMi5oaSA9PSB0MS51MzIuaGkgJiYgdDIudTMyLmxvIDwgdDEudTMyLmxvKSkKKwl7CisJICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLi5FUlJPUjogdGltZXN0YW1wIHJ1biBiYWNrd2FyZHMhIikpOworCSAgICByZXR1cm4gLTEwMDU7CisJfQorCisJLyogY29tcGFyZSB0djIgd2l0aCB0djEsIGV4cGVjdGluZyB0djIgPj0gdHYxLiAqLworCWlmIChQSl9USU1FX1ZBTF9MVCh0djIsIHR2MSkpIHsKKwkgICAgUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLkVSUk9SOiB0aW1lIHJ1biBiYWNrd2FyZHMhIikpOworCSAgICByZXR1cm4gLTEwMDY7CisJfQorICAgIH0KKworICAgIC8qIAorICAgICAqIFNpbXBsZSB0ZXN0IHRvIHRpbWUgc29tZSBsb29wLiAKKyAgICAgKi8KKyAgICBQSl9MT0coMywoVEhJU19GSUxFLCAiLi4uLnRlc3Rpbmcgc2ltcGxlIDEwMDAwMDAgbG9vcCIpKTsKKworCisgICAgLyogTWFyayBzdGFydCB0aW1lLiAqLworICAgIGlmICgocmM9cGpfZ2V0X3RpbWVzdGFtcCgmdDEpKSAhPSBQSl9TVUNDRVNTKSB7CisJYXBwX3BlcnJvcigiLi4uLmVycm9yOiBjYXQndCBnZXQgdGltZXN0YW1wIiwgcmMpOworCXJldHVybiAtMTAxMDsKKyAgICB9CisKKyAgICAvKiBMb29wLi4gKi8KKyAgICBmb3IgKGk9MDsgaTwxMDAwMDAwOyArK2kpIHsKKwkvKiBUcnkgdG8gZG8gc29tZXRoaW5nIHNvIHRoYXQgc21hcnQgY29tcGlsZXJzIHdvbnQKKwkgKiByZW1vdmUgdGhpcyBzaWxseSBsb29wLgorCSAqLworCW51bGxfZnVuYygpOworICAgIH0KKworICAgIHBqX3RocmVhZF9zbGVlcCgwKTsKKworICAgIC8qIE1hcmsgZW5kIHRpbWUuICovCisgICAgcGpfZ2V0X3RpbWVzdGFtcCgmdDIpOworCisgICAgLyogR2V0IGVsYXBzZWQgdGltZSBpbiB1c2VjLiAqLworICAgIGVsYXBzZWQgPSBwal9lbGFwc2VkX3VzZWMoJnQxLCAmdDIpOworICAgIFBKX0xPRygzLChUSElTX0ZJTEUsICIuLi4uZWxhcHNlZDogJXUgdXNlYyIsICh1bnNpZ25lZCllbGFwc2VkKSk7CisKKyAgICAvKiBTZWUgaWYgZWxhcHNlZCB0aW1lIGlzICJyZWFzb25hYmxlIi4gCisgICAgICogVGhpcyBzaG91bGQgYmUgZ29vZCBldmVuIG9uIDUwTWh6IGVtYmVkZGVkIHBvd2VycGMuCisgICAgICovCisgICAgaWYgKGVsYXBzZWQgPCAxIHx8IGVsYXBzZWQgPiAxMDAwMDAwKSB7CisJUEpfTE9HKDMsKFRISVNfRklMRSwgIi4uLi5lcnJvcjogZWxhcHNlZCB0aW1lIG91dHNpZGUgd2luZG93ICgldSwgIgorCQkJICAgICAidDEudTMyLmhpPSV1LCB0MS51MzIubG89JXUsICIKKwkJCSAgICAgInQyLnUzMi5oaT0ldSwgdDIudTMyLmxvPSV1KSIsCisJCQkgICAgIGVsYXBzZWQsIAorCQkJICAgICB0MS51MzIuaGksIHQxLnUzMi5sbywgdDIudTMyLmhpLCB0Mi51MzIubG8pKTsKKwlyZXR1cm4gLTEwMzA7CisgICAgfQorCisgICAgLyogVGVzdGluZyB0aW1lL3RpbWVzdGFtcCBhY2N1cmFjeSAqLworICAgIHJjID0gdGltZXN0YW1wX2FjY3VyYWN5KCk7CisgICAgaWYgKHJjICE9IDApCisJcmV0dXJuIHJjOworCisgICAgcmV0dXJuIDA7Cit9CisKKworI2Vsc2UKKy8qIFRvIHByZXZlbnQgd2FybmluZyBhYm91dCAidHJhbnNsYXRpb24gdW5pdCBpcyBlbXB0eSIKKyAqIHdoZW4gdGhpcyB0ZXN0IGlzIGRpc2FibGVkLiAKKyAqLworaW50IGR1bW15X3RpbWVzdGFtcF90ZXN0OworI2VuZGlmCS8qIElOQ0xVREVfVElNRVNUQU1QX1RFU1QgKi8KKwpkaWZmIC0tZ2l0IGEvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3VkcF9lY2hvX3Nydl9pb3F1ZXVlLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdWRwX2VjaG9fc3J2X2lvcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDcwMTY1Ci0tLSAvZGV2L251bGwKKysrIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3VkcF9lY2hvX3Nydl9pb3F1ZXVlLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qICRJZCQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSA8cGpsaWIuaD4KKyNpbmNsdWRlICJ0ZXN0LmgiCisKK3N0YXRpYyBwal9pb3F1ZXVlX2tleV90ICprZXk7CitzdGF0aWMgcGpfYXRvbWljX3QgKnRvdGFsX2J5dGVzOworc3RhdGljIHBqX2Jvb2xfdCB0aHJlYWRfcXVpdF9mbGFnOworCitzdHJ1Y3Qgb3Bfa2V5Cit7CisgICAgcGpfaW9xdWV1ZV9vcF9rZXlfdCAgb3Bfa2V5XzsKKyAgICBzdHJ1Y3Qgb3Bfa2V5ICAgICAgICpwZWVyOworICAgIGNoYXIgICAgICAgICAgICAgICAgKmJ1ZmZlcjsKKyAgICBwal9zaXplX3QgICAgICAgICAgICBzaXplOworICAgIGludCAgICAgICAgICAgICAgICAgIGlzX3BlbmRpbmc7CisgICAgcGpfc3RhdHVzX3QgICAgICAgICAgbGFzdF9lcnI7CisgICAgcGpfc29ja2FkZHJfaW4gICAgICAgYWRkcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBhZGRybGVuOworfTsKKworc3RhdGljIHZvaWQgb25fcmVhZF9jb21wbGV0ZShwal9pb3F1ZXVlX2tleV90ICprZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9pb3F1ZXVlX29wX2tleV90ICpvcF9rZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zc2l6ZV90IGJ5dGVzX3JlY2VpdmVkKQoreworICAgIHBqX3N0YXR1c190IHJjOworICAgIHN0cnVjdCBvcF9rZXkgKnJlY3ZfcmVjID0gKHN0cnVjdCBvcF9rZXkgKilvcF9rZXk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHN0cnVjdCBvcF9rZXkgKnNlbmRfcmVjID0gcmVjdl9yZWMtPnBlZXI7CisgICAgICAgIHJlY3ZfcmVjLT5pc19wZW5kaW5nID0gMDsKKworICAgICAgICBpZiAoYnl0ZXNfcmVjZWl2ZWQgPCAwKSB7CisgICAgICAgICAgICBpZiAoLWJ5dGVzX3JlY2VpdmVkICE9IHJlY3ZfcmVjLT5sYXN0X2VycikgeworICAgICAgICAgICAgICAgIHJlY3ZfcmVjLT5sYXN0X2VyciA9IChwal9zdGF0dXNfdCktYnl0ZXNfcmVjZWl2ZWQ7CisgICAgICAgICAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3IgcmVjZWl2aW5nIGRhdGEiLCByZWN2X3JlYy0+bGFzdF9lcnIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzX3JlY2VpdmVkID09IDApIHsKKyAgICAgICAgICAgIC8qIG5vdGU6IHByZXZpb3VzIGVycm9yLCBvciB3cml0ZSBjYWxsYmFjayAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGpfYXRvbWljX2FkZCh0b3RhbF9ieXRlcywgKHBqX2F0b21pY192YWx1ZV90KWJ5dGVzX3JlY2VpdmVkKTsKKworICAgICAgICAgICAgaWYgKCFzZW5kX3JlYy0+aXNfcGVuZGluZykgeworICAgICAgICAgICAgICAgIHBqX3NzaXplX3Qgc2VudCA9IGJ5dGVzX3JlY2VpdmVkOworICAgICAgICAgICAgICAgIHBqX21lbWNweShzZW5kX3JlYy0+YnVmZmVyLCByZWN2X3JlYy0+YnVmZmVyLCBieXRlc19yZWNlaXZlZCk7CisgICAgICAgICAgICAgICAgcGpfbWVtY3B5KCZzZW5kX3JlYy0+YWRkciwgJnJlY3ZfcmVjLT5hZGRyLCByZWN2X3JlYy0+YWRkcmxlbik7CisgICAgICAgICAgICAgICAgc2VuZF9yZWMtPmFkZHJsZW4gPSByZWN2X3JlYy0+YWRkcmxlbjsKKyAgICAgICAgICAgICAgICByYyA9IHBqX2lvcXVldWVfc2VuZHRvKGtleSwgJnNlbmRfcmVjLT5vcF9rZXlfLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfcmVjLT5idWZmZXIsICZzZW50LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbmRfcmVjLT5hZGRyLCBzZW5kX3JlYy0+YWRkcmxlbik7CisgICAgICAgICAgICAgICAgc2VuZF9yZWMtPmlzX3BlbmRpbmcgPSAocmM9PVBKX0VQRU5ESU5HKTsKKworICAgICAgICAgICAgICAgIGlmIChyYyE9UEpfU1VDQ0VTUyAmJiByYyE9UEpfRVBFTkRJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwX3BlcnJvcigiLi4uc2VuZCBlcnJvcigxKSIsIHJjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNlbmRfcmVjLT5pc19wZW5kaW5nKSB7CisgICAgICAgICAgICBieXRlc19yZWNlaXZlZCA9IHJlY3ZfcmVjLT5zaXplOworICAgICAgICAgICAgcmMgPSBwal9pb3F1ZXVlX3JlY3Zmcm9tKGtleSwgJnJlY3ZfcmVjLT5vcF9rZXlfLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN2X3JlYy0+YnVmZmVyLCAmYnl0ZXNfcmVjZWl2ZWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZfcmVjLT5hZGRyLCAmcmVjdl9yZWMtPmFkZHJsZW4pOworICAgICAgICAgICAgcmVjdl9yZWMtPmlzX3BlbmRpbmcgPSAocmM9PVBKX0VQRU5ESU5HKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIG5leHQgbG9vcC4gKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmMgPT0gUEpfRVBFTkRJTkcpIHsKKyAgICAgICAgICAgICAgICAvKiBxdWl0IGNhbGxiYWNrLiAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBlcnJvciAqLworICAgICAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLnJlY3YgZXJyb3IiLCByYyk7CisgICAgICAgICAgICAgICAgcmVjdl9yZWMtPmxhc3RfZXJyID0gcmM7CisKKyAgICAgICAgICAgICAgICBieXRlc19yZWNlaXZlZCA9IDA7CisgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIG5leHQgbG9vcC4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHJlY3Ygd2lsbCBiZSBkb25lIHdoZW4gd3JpdGUgY29tcGxldGlvbiBjYWxsYmFjayBpcyBjYWxsZWQuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgb25fd3JpdGVfY29tcGxldGUocGpfaW9xdWV1ZV9rZXlfdCAqa2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqX2lvcXVldWVfb3Bfa2V5X3QgKm9wX2tleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwal9zc2l6ZV90IGJ5dGVzX3NlbnQpCit7CisgICAgc3RydWN0IG9wX2tleSAqc2VuZF9yZWMgPSAoc3RydWN0IG9wX2tleSopb3Bfa2V5OworCisgICAgaWYgKGJ5dGVzX3NlbnQgPD0gMCkgeworICAgICAgICBwal9zdGF0dXNfdCByYyA9IChwal9zdGF0dXNfdCktYnl0ZXNfc2VudDsKKyAgICAgICAgaWYgKHJjICE9IHNlbmRfcmVjLT5sYXN0X2VycikgeworICAgICAgICAgICAgc2VuZF9yZWMtPmxhc3RfZXJyID0gcmM7CisgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5zZW5kIGVycm9yKDIpIiwgcmMpOworICAgICAgICB9CisgICAgfQorCisgICAgc2VuZF9yZWMtPmlzX3BlbmRpbmcgPSAwOworICAgIG9uX3JlYWRfY29tcGxldGUoa2V5LCAmc2VuZF9yZWMtPnBlZXItPm9wX2tleV8sIDApOworfQorCitzdGF0aWMgaW50IHdvcmtlcl90aHJlYWQodm9pZCAqYXJnKQoreworICAgIHBqX2lvcXVldWVfdCAqaW9xdWV1ZSA9IChwal9pb3F1ZXVlX3QqKSBhcmc7CisgICAgc3RydWN0IG9wX2tleSByZWFkX29wLCB3cml0ZV9vcDsKKyAgICBjaGFyIHJlY3ZfYnVmWzUxMl0sIHNlbmRfYnVmWzUxMl07CisgICAgcGpfc3NpemVfdCBsZW5ndGg7CisgICAgcGpfc3RhdHVzX3QgcmM7CisKKyAgICByZWFkX29wLnBlZXIgPSAmd3JpdGVfb3A7CisgICAgcmVhZF9vcC5pc19wZW5kaW5nID0gMDsKKyAgICByZWFkX29wLmxhc3RfZXJyID0gMDsKKyAgICByZWFkX29wLmJ1ZmZlciA9IHJlY3ZfYnVmOworICAgIHJlYWRfb3Auc2l6ZSA9IHNpemVvZihyZWN2X2J1Zik7CisgICAgcmVhZF9vcC5hZGRybGVuID0gc2l6ZW9mKHJlYWRfb3AuYWRkcik7CisKKyAgICB3cml0ZV9vcC5wZWVyID0gJnJlYWRfb3A7CisgICAgd3JpdGVfb3AuaXNfcGVuZGluZyA9IDA7CisgICAgd3JpdGVfb3AubGFzdF9lcnIgPSAwOworICAgIHdyaXRlX29wLmJ1ZmZlciA9IHNlbmRfYnVmOworICAgIHdyaXRlX29wLnNpemUgPSBzaXplb2Yoc2VuZF9idWYpOworCisgICAgbGVuZ3RoID0gc2l6ZW9mKHJlY3ZfYnVmKTsKKyAgICByYyA9IHBqX2lvcXVldWVfcmVjdmZyb20oa2V5LCAmcmVhZF9vcC5vcF9rZXlfLCByZWN2X2J1ZiwgJmxlbmd0aCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRfb3AuYWRkciwgJnJlYWRfb3AuYWRkcmxlbik7CisgICAgaWYgKHJjID09IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgcmVhZF9vcC5pc19wZW5kaW5nID0gMTsKKyAgICAgICAgb25fcmVhZF9jb21wbGV0ZShrZXksICZyZWFkX29wLm9wX2tleV8sIGxlbmd0aCk7CisgICAgfQorICAgIAorICAgIHdoaWxlICghdGhyZWFkX3F1aXRfZmxhZykgeworICAgICAgICBwal90aW1lX3ZhbCB0aW1lb3V0OworICAgICAgICB0aW1lb3V0LnNlYyA9IDA7IHRpbWVvdXQubXNlYyA9IDEwOworICAgICAgICByYyA9IHBqX2lvcXVldWVfcG9sbChpb3F1ZXVlLCAmdGltZW91dCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgdWRwX2VjaG9fc3J2X2lvcXVldWUodm9pZCkKK3sKKyAgICBwal9wb29sX3QgKnBvb2w7CisgICAgcGpfc29ja190IHNvY2s7CisgICAgcGpfaW9xdWV1ZV90ICppb3F1ZXVlOworICAgIHBqX2lvcXVldWVfY2FsbGJhY2sgY2FsbGJhY2s7CisgICAgaW50IGk7CisgICAgcGpfdGhyZWFkX3QgKnRocmVhZFtFQ0hPX1NFUlZFUl9NQVhfVEhSRUFEU107CisgICAgcGpfc3RhdHVzX3QgcmM7CisKKyAgICBwal9iemVybygmY2FsbGJhY2ssIHNpemVvZihjYWxsYmFjaykpOworICAgIGNhbGxiYWNrLm9uX3JlYWRfY29tcGxldGUgPSAmb25fcmVhZF9jb21wbGV0ZTsKKyAgICBjYWxsYmFjay5vbl93cml0ZV9jb21wbGV0ZSA9ICZvbl93cml0ZV9jb21wbGV0ZTsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIDQwMDAsIDQwMDAsIE5VTEwpOworICAgIGlmICghcG9vbCkKKyAgICAgICAgcmV0dXJuIC0xMDsKKworICAgIHJjID0gcGpfaW9xdWV1ZV9jcmVhdGUocG9vbCwgMiwgJmlvcXVldWUpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgIGFwcF9wZXJyb3IoIi4uLnBqX2lvcXVldWVfY3JlYXRlIGVycm9yIiwgcmMpOworICAgICAgICByZXR1cm4gLTIwOworICAgIH0KKworICAgIHJjID0gYXBwX3NvY2tldChwal9BRl9JTkVUKCksIHBqX1NPQ0tfREdSQU0oKSwgMCwgCisgICAgICAgICAgICAgICAgICAgIEVDSE9fU0VSVkVSX1NUQVJUX1BPUlQsICZzb2NrKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5hcHBfc29ja2V0IGVycm9yIiwgcmMpOworICAgICAgICByZXR1cm4gLTMwOworICAgIH0KKworICAgIHJjID0gcGpfaW9xdWV1ZV9yZWdpc3Rlcl9zb2NrKHBvb2wsIGlvcXVldWUsIHNvY2ssIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrLCAma2V5KTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5lcnJvciByZWdpc3RlcmluZyBzb2NrZXQiLCByYyk7CisgICAgICAgIHJldHVybiAtNDA7CisgICAgfQorCisgICAgcmMgPSBwal9hdG9taWNfY3JlYXRlKHBvb2wsIDAsICZ0b3RhbF9ieXRlcyk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4uZXJyb3IgY3JlYXRpbmcgYXRvbWljIHZhcmlhYmxlIiwgcmMpOworICAgICAgICByZXR1cm4gLTQ1OworICAgIH0KKworICAgIGZvciAoaT0wOyBpPEVDSE9fU0VSVkVSX01BWF9USFJFQURTOyArK2kpIHsKKyAgICAgICAgcmMgPSBwal90aHJlYWRfY3JlYXRlKHBvb2wsIE5VTEwsICZ3b3JrZXJfdGhyZWFkLCBpb3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfVEhSRUFEX0RFRkFVTFRfU1RBQ0tfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRbaV0pOworICAgICAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgYXBwX3BlcnJvcigiLi4uY3JlYXRlIHRocmVhZCBlcnJvciIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAtNTA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlY2hvX3Nydl9jb21tb25fbG9vcCh0b3RhbF9ieXRlcyk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC91ZHBfZWNob19zcnZfc3luYy5jIGIvam5pL3BqcHJvamVjdC1hbmRyb2lkL3BqbGliL3NyYy9wamxpYi10ZXN0L3VkcF9lY2hvX3Nydl9zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2MzM3YQotLS0gL2Rldi9udWxsCisrKyBiL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC91ZHBfZWNob19zcnZfc3luYy5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiAkSWQ6IHVkcF9lY2hvX3Nydl9zeW5jLmMgNDUzNyAyMDEzLTA2LTE5IDA2OjQ3OjQzWiByaXphICQgKi8KKy8qIAorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBCZW5ueSBQcmlqb25vIDxiZW5ueUBwcmlqb25vLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBIAorICovCisjaW5jbHVkZSAidGVzdC5oIgorI2luY2x1ZGUgPHBqbGliLmg+CisKK3N0YXRpYyBwal9hdG9taWNfdCAqdG90YWxfYnl0ZXM7CitzdGF0aWMgcGpfYm9vbF90IHRocmVhZF9xdWl0X2ZsYWcgPSAwOworCitzdGF0aWMgaW50IHdvcmtlcl90aHJlYWQodm9pZCAqYXJnKQoreworICAgIHBqX3NvY2tfdCAgICBzb2NrID0gKHBqX3NvY2tfdClhcmc7CisgICAgY2hhciAgICAgICAgIGJ1Zls1MTJdOworICAgIHBqX3N0YXR1c190ICBsYXN0X3JlY3ZfZXJyID0gUEpfU1VDQ0VTUywgbGFzdF93cml0ZV9lcnIgPSBQSl9TVUNDRVNTOworCisgICAgd2hpbGUgKCF0aHJlYWRfcXVpdF9mbGFnKSB7CisgICAgICAgIHBqX3NzaXplX3QgbGVuOworICAgICAgICBwal9zdGF0dXNfdCByYzsKKyAgICAgICAgcGpfc29ja2FkZHJfaW4gYWRkcjsKKyAgICAgICAgaW50IGFkZHJsZW47CisKKyAgICAgICAgbGVuID0gc2l6ZW9mKGJ1Zik7CisgICAgICAgIGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisgICAgICAgIHJjID0gcGpfc29ja19yZWN2ZnJvbShzb2NrLCBidWYsICZsZW4sIDAsICZhZGRyLCAmYWRkcmxlbik7CisgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICBpZiAocmMgIT0gbGFzdF9yZWN2X2VycikgeworICAgICAgICAgICAgICAgIGFwcF9wZXJyb3IoIi4uLnJlY3YgZXJyb3IiLCByYyk7CisgICAgICAgICAgICAgICAgbGFzdF9yZWN2X2VyciA9IHJjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworCXBqX2F0b21pY19hZGQodG90YWxfYnl0ZXMsIChwal9hdG9taWNfdmFsdWVfdClsZW4pOworCisgICAgICAgIHJjID0gcGpfc29ja19zZW5kdG8oc29jaywgYnVmLCAmbGVuLCAwLCAmYWRkciwgYWRkcmxlbik7CisgICAgICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAocmMgIT0gbGFzdF93cml0ZV9lcnIpIHsKKyAgICAgICAgICAgICAgICBhcHBfcGVycm9yKCIuLi5zZW5kIGVycm9yIiwgcmMpOworICAgICAgICAgICAgICAgIGxhc3Rfd3JpdGVfZXJyID0gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgZWNob19zcnZfc3luYyh2b2lkKQoreworICAgIHBqX3Bvb2xfdCAqcG9vbDsKKyAgICBwal9zb2NrX3Qgc29jazsKKyAgICBwal90aHJlYWRfdCAqdGhyZWFkW0VDSE9fU0VSVkVSX01BWF9USFJFQURTXTsKKyAgICBwal9zdGF0dXNfdCByYzsKKyAgICBpbnQgaTsKKworICAgIHBvb2wgPSBwal9wb29sX2NyZWF0ZShtZW0sIE5VTEwsIDQwMDAsIDQwMDAsIE5VTEwpOworICAgIGlmICghcG9vbCkKKyAgICAgICAgcmV0dXJuIC01OworCisgICAgcmMgPSBwal9hdG9taWNfY3JlYXRlKHBvb2wsIDAsICZ0b3RhbF9ieXRlcyk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgYXBwX3BlcnJvcigiLi4udW5hYmxlIHRvIGNyZWF0ZSBhdG9taWNfdmFyIiwgcmMpOworICAgICAgICByZXR1cm4gLTY7CisgICAgfQorCisgICAgcmMgPSBhcHBfc29ja2V0KHBqX0FGX0lORVQoKSwgcGpfU09DS19ER1JBTSgpLDAsIEVDSE9fU0VSVkVSX1NUQVJUX1BPUlQsICZzb2NrKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICBhcHBfcGVycm9yKCIuLi5zb2NrZXQgZXJyb3IiLCByYyk7CisgICAgICAgIHJldHVybiAtMTA7CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8RUNIT19TRVJWRVJfTUFYX1RIUkVBRFM7ICsraSkgeworICAgICAgICByYyA9IHBqX3RocmVhZF9jcmVhdGUocG9vbCwgTlVMTCwgJndvcmtlcl90aHJlYWQsICh2b2lkKilzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEpfVEhSRUFEX0RFRkFVTFRfU1RBQ0tfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRbaV0pOworICAgICAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykgeworICAgICAgICAgICAgYXBwX3BlcnJvcigiLi4udW5hYmxlIHRvIGNyZWF0ZSB0aHJlYWQiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLTIwOworICAgICAgICB9CisgICAgfQorCisgICAgUEpfTE9HKDMsKCIiLCAiLi4uVURQIGVjaG8gc2VydmVyIHJ1bm5pbmcgd2l0aCAlZCB0aHJlYWRzIGF0IHBvcnQgJWQiLAorICAgICAgICAgICAgICAgICAgRUNIT19TRVJWRVJfTUFYX1RIUkVBRFMsIEVDSE9fU0VSVkVSX1NUQVJUX1BPUlQpKTsKKyAgICBQSl9MT0coMywoIiIsICIuLi5QcmVzcyBDdHJsLUMgdG8gYWJvcnQiKSk7CisKKyAgICBlY2hvX3Nydl9jb21tb25fbG9vcCh0b3RhbF9ieXRlcyk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IGVjaG9fc3J2X2NvbW1vbl9sb29wKHBqX2F0b21pY190ICpieXRlc19jb3VudGVyKQoreworICAgIHBqX2hpZ2hwcmVjX3QgbGFzdF9yZWNlaXZlZCwgYXZnX2J3LCBoaWdoZXN0X2J3OworICAgIHBqX3RpbWVfdmFsIGxhc3RfcHJpbnQ7CisgICAgdW5zaWduZWQgY291bnQ7CisgICAgY29uc3QgY2hhciAqaW9xdWV1ZV9uYW1lOworCisgICAgbGFzdF9yZWNlaXZlZCA9IDA7CisgICAgcGpfZ2V0dGltZW9mZGF5KCZsYXN0X3ByaW50KTsKKyAgICBhdmdfYncgPSBoaWdoZXN0X2J3ID0gMDsKKyAgICBjb3VudCA9IDA7CisKKyAgICBpb3F1ZXVlX25hbWUgPSBwal9pb3F1ZXVlX25hbWUoKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgcGpfaGlnaHByZWNfdCByZWNlaXZlZCwgY3VyX3JlY2VpdmVkLCBidzsKKyAgICAgICAgdW5zaWduZWQgbXNlYzsKKyAgICAgICAgcGpfdGltZV92YWwgbm93LCBkdXJhdGlvbjsKKworICAgICAgICBwal90aHJlYWRfc2xlZXAoMTAwMCk7CisKKyAgICAgICAgcmVjZWl2ZWQgPSBjdXJfcmVjZWl2ZWQgPSBwal9hdG9taWNfZ2V0KGJ5dGVzX2NvdW50ZXIpOworICAgICAgICBjdXJfcmVjZWl2ZWQgPSBjdXJfcmVjZWl2ZWQgLSBsYXN0X3JlY2VpdmVkOworCisgICAgICAgIHBqX2dldHRpbWVvZmRheSgmbm93KTsKKyAgICAgICAgZHVyYXRpb24gPSBub3c7CisgICAgICAgIFBKX1RJTUVfVkFMX1NVQihkdXJhdGlvbiwgbGFzdF9wcmludCk7CisgICAgICAgIG1zZWMgPSBQSl9USU1FX1ZBTF9NU0VDKGR1cmF0aW9uKTsKKyAgICAgICAgCisgICAgICAgIGJ3ID0gY3VyX3JlY2VpdmVkOworICAgICAgICBwal9oaWdocHJlY19tdWwoYncsIDEwMDApOworICAgICAgICBwal9oaWdocHJlY19kaXYoYncsIG1zZWMpOworCisgICAgICAgIGxhc3RfcHJpbnQgPSBub3c7CisgICAgICAgIGxhc3RfcmVjZWl2ZWQgPSByZWNlaXZlZDsKKworICAgICAgICBhdmdfYncgPSBhdmdfYncgKyBidzsKKyAgICAgICAgY291bnQrKzsKKworICAgICAgICBQSl9MT0coMywoIiIsICIlcyBVRFAgKCVkIHRocmVhZHMpOiAldSBLQi9zIChhdmc9JXUgS0IvcykgJXMiLCAKKwkJICBpb3F1ZXVlX25hbWUsCisgICAgICAgICAgICAgICAgICBFQ0hPX1NFUlZFUl9NQVhfVEhSRUFEUywgCisgICAgICAgICAgICAgICAgICAodW5zaWduZWQpKGJ3IC8gMTAwMCksCisgICAgICAgICAgICAgICAgICAodW5zaWduZWQpKGF2Z19idyAvIGNvdW50IC8gMTAwMCksCisgICAgICAgICAgICAgICAgICAoY291bnQ9PTIwID8gIjxzZXMgYXZnPiIgOiAiIikpKTsKKworICAgICAgICBpZiAoY291bnQ9PTIwKSB7CisgICAgICAgICAgICBpZiAoYXZnX2J3L2NvdW50ID4gaGlnaGVzdF9idykKKyAgICAgICAgICAgICAgICBoaWdoZXN0X2J3ID0gYXZnX2J3L2NvdW50OworCisgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICBhdmdfYncgPSAwOworCisgICAgICAgICAgICBQSl9MT0coMywoIiIsICJIaWdoZXN0IGF2ZXJhZ2UgYmFuZHdpZHRoPSV1IEtCL3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpKGhpZ2hlc3RfYncvMTAwMCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQSl9VTlJFQUNIRUQocmV0dXJuIDA7KQorfQorCisKZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC9wamxpYi9zcmMvcGpsaWItdGVzdC91dGlsLmMgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYWE5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvcGpsaWIvc3JjL3BqbGliLXRlc3QvdXRpbC5jCkBAIC0wLDAgKzEsMTQwIEBACisvKiAkSWQ6IHV0aWwuYyAzNTUzIDIwMTEtMDUtMDUgMDY6MTQ6MTlaIG5hbmFuZyAkICovCisvKiAKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRlbHV1IEluYy4gKGh0dHA6Ly93d3cudGVsdXUuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggQmVubnkgUHJpam9ubyA8YmVubnlAcHJpam9uby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQSAKKyAqLworI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDxwamxpYi5oPgorCisjZGVmaW5lIFRISVNfRklMRSAidXRpbC5jIgorCit2b2lkIGFwcF9wZXJyb3IoY29uc3QgY2hhciAqbXNnLCBwal9zdGF0dXNfdCByYykKK3sKKyAgICBjaGFyIGVycmJ1ZltQSl9FUlJfTVNHX1NJWkVdOworCisgICAgUEpfQ0hFQ0tfU1RBQ0soKTsKKworICAgIHBqX3N0cmVycm9yKHJjLCBlcnJidWYsIHNpemVvZihlcnJidWYpKTsKKyAgICBQSl9MT0coMywoInRlc3QiLCAiJXM6IFtwal9zdGF0dXNfdD0lZF0gJXMiLCBtc2csIHJjLCBlcnJidWYpKTsKK30KKworI2RlZmluZSBTRVJWRVIgMAorI2RlZmluZSBDTElFTlQgMQorCitwal9zdGF0dXNfdCBhcHBfc29ja2V0KGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG8sIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICBwal9zb2NrX3QgKnB0cl9zb2NrKQoreworICAgIHBqX3NvY2thZGRyX2luIGFkZHI7CisgICAgcGpfc29ja190IHNvY2s7CisgICAgcGpfc3RhdHVzX3QgcmM7CisKKyAgICByYyA9IHBqX3NvY2tfc29ja2V0KGZhbWlseSwgdHlwZSwgcHJvdG8sICZzb2NrKTsKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcGpfYnplcm8oJmFkZHIsIHNpemVvZihhZGRyKSk7CisgICAgYWRkci5zaW5fZmFtaWx5ID0gKHBqX3VpbnQxNl90KWZhbWlseTsKKyAgICBhZGRyLnNpbl9wb3J0ID0gKHNob3J0KShwb3J0IT0tMSA/IHBqX2h0b25zKChwal91aW50MTZfdClwb3J0KSA6IDApOworICAgIHJjID0gcGpfc29ja19iaW5kKHNvY2ssICZhZGRyLCBzaXplb2YoYWRkcikpOworICAgIGlmIChyYyAhPSBQSl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmM7CisgICAgCisjaWYgUEpfSEFTX1RDUAorICAgIGlmICh0eXBlID09IHBqX1NPQ0tfU1RSRUFNKCkpIHsKKyAgICAgICAgcmMgPSBwal9zb2NrX2xpc3Rlbihzb2NrLCA1KTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgfQorI2VuZGlmCisKKyAgICAqcHRyX3NvY2sgPSBzb2NrOworICAgIHJldHVybiBQSl9TVUNDRVNTOworfQorCitwal9zdGF0dXNfdCBhcHBfc29ja2V0cGFpcihpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGpfc29ja190ICpzZXJ2ZXJmZCwgcGpfc29ja190ICpjbGllbnRmZCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgdW5zaWduZWQgc2hvcnQgcG9ydCA9IDExMDAwOworICAgIHBqX3NvY2thZGRyX2luIGFkZHI7CisgICAgcGpfc3RyX3QgczsKKyAgICBwal9zdGF0dXNfdCByYyA9IDA7CisgICAgcGpfc29ja190IHNvY2tbMl07CisKKyAgICAvKiBDcmVhdGUgYm90aCBzb2NrZXRzLiAqLworICAgIGZvciAoaT0wOyBpPDI7ICsraSkgeworICAgICAgICByYyA9IHBqX3NvY2tfc29ja2V0KGZhbWlseSwgdHlwZSwgcHJvdG9jb2wsICZzb2NrW2ldKTsKKyAgICAgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChpPT0xKQorICAgICAgICAgICAgICAgIHBqX3NvY2tfY2xvc2Uoc29ja1swXSk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXRyeSBiaW5kICovCisgICAgcGpfYnplcm8oJmFkZHIsIHNpemVvZihhZGRyKSk7CisgICAgYWRkci5zaW5fZmFtaWx5ID0gcGpfQUZfSU5FVCgpOworICAgIGZvciAoaT0wOyBpPDU7ICsraSkgeworICAgICAgICBhZGRyLnNpbl9wb3J0ID0gcGpfaHRvbnMocG9ydCsrKTsKKyAgICAgICAgcmMgPSBwal9zb2NrX2JpbmQoc29ja1tTRVJWRVJdLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKyAgICAgICAgaWYgKHJjID09IFBKX1NVQ0NFU1MpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKworICAgIC8qIEZvciBUQ1AsIGxpc3RlbiB0aGUgc29ja2V0LiAqLworI2lmIFBKX0hBU19UQ1AKKyAgICBpZiAodHlwZSA9PSBwal9TT0NLX1NUUkVBTSgpKSB7CisgICAgICAgIHJjID0gcGpfc29ja19saXN0ZW4oc29ja1tTRVJWRVJdLCBQSl9TT01BWENPTk4pOworICAgICAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBDb25uZWN0IGNsaWVudCBzb2NrZXQuICovCisgICAgYWRkci5zaW5fYWRkciA9IHBqX2luZXRfYWRkcihwal9jc3RyKCZzLCAiMTI3LjAuMC4xIikpOworICAgIHJjID0gcGpfc29ja19jb25uZWN0KHNvY2tbQ0xJRU5UXSwgJmFkZHIsIHNpemVvZihhZGRyKSk7CisgICAgaWYgKHJjICE9IFBKX1NVQ0NFU1MpCisgICAgICAgIGdvdG8gb25fZXJyb3I7CisKKyAgICAvKiBGb3IgVENQLCBtdXN0IGFjY2VwdCgpLCBhbmQgZ2V0IHRoZSBuZXcgc29ja2V0LiAqLworI2lmIFBKX0hBU19UQ1AKKyAgICBpZiAodHlwZSA9PSBwal9TT0NLX1NUUkVBTSgpKSB7CisgICAgICAgIHBqX3NvY2tfdCBuZXdzZXJ2ZXI7CisKKyAgICAgICAgcmMgPSBwal9zb2NrX2FjY2VwdChzb2NrW1NFUlZFUl0sICZuZXdzZXJ2ZXIsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAocmMgIT0gUEpfU1VDQ0VTUykKKyAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisKKyAgICAgICAgLyogUmVwbGFjZSBzZXJ2ZXIgc29ja2V0IHdpdGggbmV3IHNvY2tldC4gKi8KKyAgICAgICAgcGpfc29ja19jbG9zZShzb2NrW1NFUlZFUl0pOworICAgICAgICBzb2NrW1NFUlZFUl0gPSBuZXdzZXJ2ZXI7CisgICAgfQorI2VuZGlmCisKKyAgICAqc2VydmVyZmQgPSBzb2NrW1NFUlZFUl07CisgICAgKmNsaWVudGZkID0gc29ja1tDTElFTlRdOworCisgICAgcmV0dXJuIHJjOworCitvbl9lcnJvcjoKKyAgICBmb3IgKGk9MDsgaTwyOyArK2kpCisgICAgICAgIHBqX3NvY2tfY2xvc2Uoc29ja1tpXSk7CisgICAgcmV0dXJuIHJjOworfQo=