ZGlmZiAtLWdpdCBhL2FwL2FwcC9nb2FoZWFkL2ludGVyZmFjZTUuMC93aWZpL01ha2VmaWxlIGIvYXAvYXBwL2dvYWhlYWQvaW50ZXJmYWNlNS4wL3dpZmkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTg5ODA2MQotLS0gL2Rldi9udWxsCisrKyBiL2FwL2FwcC9nb2FoZWFkL2ludGVyZmFjZTUuMC93aWZpL01ha2VmaWxlCkBAIC0wLDAgKzEsNjggQEAKKyMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjKiCw5sioy/nT0CAoQykyMDE1LCDW0NDLzajRtrnJt93T0M/euavLvqGjCisjKiAKKyMqIM7EvP7D+7PGOiAgICAgTWFrZWZpbGUKKyMqIM7EvP6x6sq2OiAgICAgTWFrZWZpbGUKKyMqIMTayN3VqtKqOiAgICAgTWFrZWZpbGUgb2YgWlRFIGFwcGxpY2F0aW9ucworIyogyrnTw7e9t6g6ICAgICB2b2lkCisjKiAKKyMqINDeuMTI1cbaICAgICAgICCw5rG+usUgICAgICDQ3rjEseq8xyAgICAgICAg0N64xMjLICAgICAgICAgINDeuMTE2sjdCisjKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyogMjAxNS8xMS8yNiAgICAgIFYxLjAgICAgICAgIENyZWF0ZSAgICAgICAgICDH8c/o0+4gICAgICAgICAgtLS9qAorIyogCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgaW5jbHVkZSBaVEUgYXBwbGljYXRpb24gbWFrZWZpbGUKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjaWZlcSAoJChMSU5VWF9UWVBFKSx1Q2xpbnV4KQoraW5jbHVkZSAkKHp0ZV9hcHBfbWFrKQorI2VuZGlmCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIGV4ZWN1dGUKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjRVhFQyA9IGxpYndlYnVpd2lmaS5hCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIG9iamVjdHMKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitPQkpTID0genRlX3dlYl9sYW4ubyB6dGVfd2ViX21nbXRfd2lmaS5vIHp0ZV93ZWJfd2xhbl9zdGF0aW9uLm8genRlX3dlYl9sYW5fdXRpbHMubworCitTUkMgPSB6dGVfd2ViX2xhbi5jIHp0ZV93ZWJfbWdtdF93aWZpLmMgenRlX3dlYl93bGFuX3N0YXRpb24uYyB6dGVfd2ViX2xhbl91dGlscy5jCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIGluY2x1ZGUgcGF0aAorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ0ZMQUdTICs9IC1EQ09ORklHX0NISU5BX1VOSUNPTSAtRFdFQlMgLURVRU1GIC1ET1M9IkxJTlVYIiAtRExJTlVYIFwKKyAgICAgICAgICAtSS4gXAorCQkgIC1JJCh6dGVfbGliX3BhdGgpL2xpYm52cmFtIFwKKwkJICAtSSQoenRlX2xpYl9wYXRoKS9saWJlenhtbCBcCisJCSAgLUkkKHp0ZV9saWJfcGF0aCkvbGlibXhtbCBcCisJCSAgLUkuLi8uLi8uLi9pbmNsdWRlIFwKKwkJICAtSS4uLy4uLy4uL3dsYW4gXAorCQkgIC1JJCh6dGVfbGliX3BhdGgpL2xpYnNxbGl0ZSBcCisJCSAgLUkkKHp0ZV9saWJfcGF0aCkvbGlic29mdF90aW1lciBcCisJCSAgLUkuLi8uLi8uLi9hdF9zZXJ2ZXIgXAorCQkgIC1JLi4vLi4vc2VydmVyIFwKKwkJICAtSS4uIFwKKwkJICAtSS4uL25ldCBcCisKK2lmZXEgKCQoQ09ORklHX1VTRV9XRUJVSV9TRUNVUklUWSkseWVzKQorQ0ZMQUdTCSs9IC1EV0VCU19TRUNVUklUWQorZW5kaWYKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIHRhcmdldHMKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMkKGVycm9yID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PikKKwkKK2FsbDogJChPQkpTKQorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLXdpZmkgYnVpbGQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyMkKFJBTkxJQikgJEAKKyUubzogJS5jCisJJChDQykgJChDRkxBR1MpICQoSU5DTFVERVMpIC1jICQ8IC1XbCwtLXN0YXJ0LWdyb3VwICQoTERMSUJTKSAtV2wsLS1lbmQtZ3JvdXAKKworY2xlYW46CisJLXJtIC1mICouZWxmICouZ2RiICoubyAqLmEKZGlmZiAtLWdpdCBhL2FwL2FwcC9nb2FoZWFkL2ludGVyZmFjZTUuMC93aWZpL3p0ZV93ZWJfbGFuLmMgYi9hcC9hcHAvZ29haGVhZC9pbnRlcmZhY2U1LjAvd2lmaS96dGVfd2ViX2xhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwZGQxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9hcHAvZ29haGVhZC9pbnRlcmZhY2U1LjAvd2lmaS96dGVfd2ViX2xhbi5jCkBAIC0wLDAgKzEsMjExMiBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILDmyKjL+dPQIChDKTIwMTAsIMnu29rK0NbQ0MvNqNG2ucm33dPQz965q8u+oaMKKyoKKyogzsS8/sP7s8ajuiB6dGVfd2ViX2xhbi5jCisqIM7EvP6x6sq2o7oKKyogxNrI3dWq0qqjugorKiDG5Mv8y7XD96O6CisqILWxx7Cw5rG+o7ogVjAuMQorKiDX9yAgICDV36O6IHp5dAorKiDN6rPJyNXG2qO6IDIwMTAtMTEtMDYKKyoKKyog0N64xLzHwrwxo7oKKyog0N64xMTayN2jurP1yryw5rG+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiDQ3rjEseC6xSA6INDCuabE3AorKiDQ3iC4xCDIyyA6IGNoZW5qaWUxMDA5MjM3NAorKiDQ3rjEyNXG2iA6IDIwMTQuNi4yNAorKiDQ3rjExNrI3SA6IMztvNPWp7PWdWZpIG1vbml0b3K5psTctKbA7bT6wusKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgICA8Y3R5cGUuaD4KKworI2luY2x1ZGUgInp0ZV93ZWJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiLi9uZXQvenRlX3dlYl9uZXRfb3RoZXIuaCIKKyNpbmNsdWRlICJuZXRvdGhlcmFwaS5oIgorCisjZGVmaW5lIFdEU19ESVNBQkxFICIwIgorI2RlZmluZSBXRFNfUk9PVEFQICIxIgorI2RlZmluZSBXRFNfQ0xJRU5UICIyIgorI2RlZmluZSBXRFNfUkVQRUFURVIgIjMiCisjZGVmaW5lIFdJRklfTUFYX1NUQV9OVU0gMzIgLy9rdyAzCisKKworI2RlZmluZSBOVl9XUklURShudl9uYW1lLCBzdHIsIHJldCkgIGRveyByZXQgPSB6dGVfd2ViX3dyaXRlKG52X25hbWUsIChjaGFyICopc3RyKTt9d2hpbGUoMCkKKworc3RhdGljIGludCB6dGVfd2xhbl9zc2lkMV9iYXNpY19zZXQod2Vic190IHdwLCB1bnNpZ25lZCBpbnQgKndpZmlfc2V0X2ZsYWdzKTsKK3N0YXRpYyBpbnQgenRlX2xhbl9zc2lkMV9zZWN1cml0eV9zZXQod2Vic190IHdwLCB1bnNpZ25lZCBpbnQgKndpZmlfc2V0X2ZsYWdzKTsKK3N0YXRpYyBpbnQgenRlX3dsYW5fc3NpZDJfYmFzaWNfc2V0KHdlYnNfdCB3cCwgdW5zaWduZWQgaW50ICp3aWZpX3NldF9mbGFncyk7CitzdGF0aWMgaW50IHp0ZV9sYW5fc3NpZDJfc2VjdXJpdHlfc2V0KHdlYnNfdCB3cCwgdW5zaWduZWQgaW50ICp3aWZpX3NldF9mbGFncyk7CisKK3N0YXRpYyBpbnQgZ2V0X3JhbmRvbSh1bnNpZ25lZCBjaGFyKiBidWYsIHNpemVfdCBsZW4pOworCisKK2VudW0ge1dJRklfQ09WRVJBR0VfTEVOID0gMTZ9OworLyoqCisgKiBAYnJpZWYgd2lmaSBzaGFyZSBtb2RlIHNldHRpbmcncyBzdHJ1Y3QKKyAqIEBwYXJhbSB3ZXBfa2V5X2luZGV4CisgKiBAcGFyYW0gd2VwX2tleTFfbW9kZQorICogQHBhcmFtIHdlcF9rZXkyX21vZGUKKyAqIEBwYXJhbSB3ZXBfa2V5M19tb2RlCisgKiBAcGFyYW0gd2VwX2tleTRfbW9kZQorICogQHBhcmFtIHdlcF9rZXkxCisgKiBAcGFyYW0gd2VwX2tleTIKKyAqIEBwYXJhbSB3ZXBfa2V5MworICogQHBhcmFtIHdlcF9rZXk0CisgKiBAbm90ZQorICogQHdhcm5pbmcKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4IHdlcF9rZXlfaW5kZXhbV0ZfV1BTX0tFWV9JTkRFWF9MRU5dOworCXVpbnQ4IHdlcF9rZXkxX21vZGVbV0ZfS0VZX01PREVfTEVOXTsKKwl1aW50OCB3ZXBfa2V5Ml9tb2RlW1dGX0tFWV9NT0RFX0xFTl07CisJdWludDggd2VwX2tleTNfbW9kZVtXRl9LRVlfTU9ERV9MRU5dOworCXVpbnQ4IHdlcF9rZXk0X21vZGVbV0ZfS0VZX01PREVfTEVOXTsKKwl1aW50OCB3ZXBfa2V5MVtXRl9XRVBfS0VZX01BWF9MRU5dOworCXVpbnQ4IHdlcF9rZXkyW1dGX1dFUF9LRVlfTUFYX0xFTl07CisJdWludDggd2VwX2tleTNbV0ZfV0VQX0tFWV9NQVhfTEVOXTsKKwl1aW50OCB3ZXBfa2V5NFtXRl9XRVBfS0VZX01BWF9MRU5dOworfSB6dGVfd2lmaV9vcGVuX2FuZF9zaGFyZV9tb2RlX3NfdHlwZTsKKy8qd2lmaSBXUEEvV1BBMiBtb2RlIHNldHRpbmcqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4IHByZV9zaGFyZV9rZXlbV0ZfV1BBX0tFWV9NQVhfTEVOXTsKK30genRlX3dpZmlfd3BhX2FuZF93cGEyX21vZGVfc190eXBlOworCitzdGF0aWMgY2hhciAqIHN0cjJ1cHBlcihjb25zdCBjaGFyICogaW4sIGNoYXIgKiBvdXQpCit7CisJY2hhciAqcDEgPSBpbjsKKwljaGFyICAqcDIgPSBvdXQ7CisJaWYgKGluID09IE5VTEwgfHwgb3V0ID09IE5VTEwpIHJldHVybiBOVUxMOworCisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdICBpbj0lc1xuIiwgX19GSUxFX18sIGluKTsKKworCXdoaWxlICgqcDEgICAhPSAnXDAnKSB7CisJCS8vaWYgKGlzYWxwaGEoKnAxKSkgey8vY292IG0KKwkJaWYgKCgqcDEpID49ICdhJyAmJiAoKnAxKSA8PSAneicpIHsKKwkJCSpwMiAgID0gdG91cHBlcigqcDEpOworCQl9IGVsc2UgeworCQkJKnAyICA9ICAqcDE7CisJCX0KKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdICBVUFBFUiA9ICVjWyVkXSwgIExvd2VyPSVjWyVkXVxuIiwgX19GSUxFX18sICpwMiwgKnAyLCAqcDEsICpwMSk7CisJCXAxKys7CisJCXAyKys7CisJfQorCisJKnAyID0gJ1wwJzsKKwlyZXR1cm4gb3V0OworCit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfcGluX2NvZGUodW5zaWduZWQgbG9uZyBjb2RlKQoreworCXVuc2lnbmVkIGxvbmcgYWNjdW0gPSAwOworCWFjY3VtICs9IDMgKiAoKGNvZGUgLyAxMDAwMDAwMCkgJSAxMCk7CisJYWNjdW0gKz0gMSAqICgoY29kZSAvIDEwMDAwMDApICUgMTApOworCWFjY3VtICs9IDMgKiAoKGNvZGUgLyAxMDAwMDApICUgMTApOworCWFjY3VtICs9IDEgKiAoKGNvZGUgLyAxMDAwMCkgJSAxMCk7CisJYWNjdW0gKz0gMyAqICgoY29kZSAvIDEwMDApICUgMTApOworCWFjY3VtICs9IDEgKiAoKGNvZGUgLyAxMDApICUgMTApOworCWFjY3VtICs9IDMgKiAoKGNvZGUgLyAxMCkgJSAxMCk7CisJYWNjdW0gKz0gMSAqICgoY29kZSAvIDEpICUgMTApOworCXJldHVybiAoMCA9PSAoYWNjdW0gJSAxMCkpOworfQorc3RhdGljIGludCB6dGVfU2FmZV92YWxpZF9TcGVjaWFsQ2hhckZvclNTSUQoY2hhciBzaW5nbGVfZGF0YSkKK3sKKwkvKmlmKHNpbmdsZV9kYXRhID09ICcmJykgcmV0dXJuIDA7CisJZWxzZSBpZihzaW5nbGVfZGF0YSA9PSAnLicpIHJldHVybiAwOworCWVsc2UgaWYoc2luZ2xlX2RhdGEgPT0gJ2AnKSByZXR1cm4gMDsKKwllbHNlIGlmKHNpbmdsZV9kYXRhID09ICdcXCcpIHJldHVybiAwOworCWVsc2UqLworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBkYXRhX3NhZmVfcmVzdWx0X3R5cGVfdCB6dGVfU2FmZV9ub1NwZWNpYWxDaGFyRm9yU1NJRChjaGFyICpzdHIpCit7CisjaWYgMCAvL2t3IDMKKwlpbnQgaSA9IDA7CisJaW50IGxlbiA9IDA7CisJaWYgKE5VTEwgPT0gc3RyKSB7CisJCXJldHVybiAwOworCX0KKworCWxlbiA9IHN0cmxlbihzdHIpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoenRlX1NhZmVfdmFsaWRfU3BlY2lhbENoYXJGb3JTU0lEKHN0cltpXSkgIT0gMCkgeworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiAxOworfQorCit2b2lkIHdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKQoreworCWlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dFQl9DR0ksIE1PRFVMRV9JRF9NTUksIE1TR19DTURfTU9ESUZZX1NTSURfS0VZLCAwLCBOVUxMLCAwKTsKK30KKworCit2b2lkIHdpZmlfd29ya19tb2RlX3NldF9iYXNpYygpCit7CisJY2hhciBtX3NzaWRfZW5hYmxlWzIwXSA9IHswfTsKKwljaGFyIHN5c3RlbV9yZXN0b3JlX2ZsZ1szMl0gPSB7MH07CisJY2hhciBNQVhfQWNjZXNzX251bVsxNl0gPSB7MH07CisJY2hhciBtX01BWF9BY2Nlc3NfbnVtWzE2XSA9IHswfTsKKwljaGFyIE1BWF9TdGF0aW9uX251bVsxNl0gPSB7MH07CisKKwljaGFyIG51bV9idWZbMTJdID0gezB9OworCWNoYXIgbV9udW1fYnVmWzEyXSA9IHswfTsKKwlpbnQgbWF4X3N0YV9udW0gPSAwOworCWludCBtYXhfbnVtID0gMDsKKwlpbnQgbV9tYXhfbnVtID0gMDsKKwljaGFyIG1heF9hY2Nlc3NfYmFrWzE2XSA9IHswfTsKKwljaGFyIG1heF9zdGF0aW9uX2Jha1sxNl0gPSB7MH07CisJc2NfY2ZnX2dldCgiTUFYX0FjY2Vzc19udW1fYmJhayIsIG1heF9hY2Nlc3NfYmFrLCBzaXplb2YobWF4X2FjY2Vzc19iYWspKTsKKwlzY19jZmdfZ2V0KCJNQVhfU3RhdGlvbl9udW1fYmFrIiwgbWF4X3N0YXRpb25fYmFrLCBzaXplb2YobWF4X3N0YXRpb25fYmFrKSk7CisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwiTUFYX0FjY2Vzc19udW1fYmJhazolcyxNQVhfU3RhdGlvbl9udW1fYmFrOiVzXG4iLG1heF9hY2Nlc3NfYmFrLG1heF9zdGF0aW9uX2Jhayk7CisJaWYoc3RybGVuKG1heF9zdGF0aW9uX2JhaykgIT0gMCAmJiBzdHJjbXAobWF4X3N0YXRpb25fYmFrLCAiMCIpKXsJCisJCXNjX2NmZ19zZXQoIk1BWF9TdGF0aW9uX251bSIsbWF4X3N0YXRpb25fYmFrKTsKKwkJc2NfY2ZnX3NldCgiTUFYX1N0YXRpb25fbnVtX2JhayIsIjAiKTsKKwl9CisJaWYoc3RybGVuKG1heF9hY2Nlc3NfYmFrKSAhPSAwICYmIHN0cmNtcChtYXhfYWNjZXNzX2JhaywgIjAiKSl7CisJCXNjX2NmZ19zZXQoIk1BWF9BY2Nlc3NfbnVtIiwgbWF4X2FjY2Vzc19iYWspOwkKKwl9CisKKwkvL3dpZmkgd29ya21vZGUgc2V0CisJc2NfY2ZnX2dldCgibV9zc2lkX2VuYWJsZSIsIG1fc3NpZF9lbmFibGUsIHNpemVvZihtX3NzaWRfZW5hYmxlKSk7CisJc2NfY2ZnX2dldCgic3lzdGVtX3Jlc3RvcmVfZmxnIiwgc3lzdGVtX3Jlc3RvcmVfZmxnLCBzaXplb2Yoc3lzdGVtX3Jlc3RvcmVfZmxnKSk7CisKKwlpZiAoIXN0cmNtcChtX3NzaWRfZW5hYmxlLCAiMSIpKSB7CisJCXNjX2NmZ19zZXQoIkFQX1NUQVJUTU9ERSIsICJtdWx0aSIpOworCQlpZiAoIXN0cmNtcChzeXN0ZW1fcmVzdG9yZV9mbGcsICJmaXJzdF9yZXN0b3JlIikpIHsKKwkJCXNjX2NmZ19zZXQoInN5c3RlbV9yZXN0b3JlX2ZsZyIsICJub3RfZmlyc3RfcmVzdG9yZSIpOworCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJpcyBmaXJzdCBjb25maWcgYWNjZXNzIG51bS4uLi4uXG4iKTsKKworCQkJc2NfY2ZnX2dldCgiTUFYX0FjY2Vzc19udW0iLCBNQVhfQWNjZXNzX251bSwgc2l6ZW9mKE1BWF9BY2Nlc3NfbnVtKSk7CisJCQltYXhfbnVtID0gYXRvaShNQVhfQWNjZXNzX251bSk7CisJCQlpZiAobWF4X251bSA+IDEgJiYgbWF4X251bSA8IDMzKSB7CisJCQkJc3ByaW50ZihudW1fYnVmLCAiJWQiLCBtYXhfbnVtIC8gMik7CisJCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJudW1fYnVmID0gJXNcbiIsIG51bV9idWYpOworCQkJCXp0ZV93ZWJfd3JpdGUoIk1BWF9BY2Nlc3NfbnVtIiwgbnVtX2J1Zik7CisJCQkJenRlX3dlYl93cml0ZSgibV9NQVhfQWNjZXNzX251bSIsIG51bV9idWYpOworCQkJfQorCQl9CisKKwkJc2NfY2ZnX2dldCgiTUFYX1N0YXRpb25fbnVtIiwgTUFYX1N0YXRpb25fbnVtLCBzaXplb2YoTUFYX1N0YXRpb25fbnVtKSk7CisJCXNjX2NmZ19nZXQoIk1BWF9BY2Nlc3NfbnVtIiwgTUFYX0FjY2Vzc19udW0sIHNpemVvZihNQVhfQWNjZXNzX251bSkpOworCQlzY19jZmdfZ2V0KCJtX01BWF9BY2Nlc3NfbnVtIiwgbV9NQVhfQWNjZXNzX251bSwgc2l6ZW9mKG1fTUFYX0FjY2Vzc19udW0pKTsKKworCQl6dGVfd2ViX3dyaXRlKCJNQVhfQWNjZXNzX251bV9iYWsiLCBNQVhfQWNjZXNzX251bSk7CisKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdLE1BWF9BY2Nlc3NfbnVtX2Jhaz0lc1xuIiwgX19GSUxFX18sIE1BWF9BY2Nlc3NfbnVtKTsKKworCQltYXhfc3RhX251bSA9IGF0b2koTUFYX1N0YXRpb25fbnVtKTsKKwkJbWF4X251bSA9IGF0b2koTUFYX0FjY2Vzc19udW0pOworCQltX21heF9udW0gPSBhdG9pKG1fTUFYX0FjY2Vzc19udW0pOworCQlpZiAoKG1heF9zdGFfbnVtIDwgMCB8fCBtYXhfc3RhX251bSA+IFdJRklfTUFYX1NUQV9OVU0pIHx8CisJCQkobWF4X251bSA8IDAgfHwgbWF4X251bSA+IFdJRklfTUFYX1NUQV9OVU0pKSB7IC8va3cgMworCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwiXG4gZXJyb3IgbWF4X3N0YV9udW0gcGFyYW1ldGVyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzXSxNQVhfU3RhdGlvbl9udW09JXMsTUFYX0FjY2Vzc19udW09JXMsbV9NQVhfQWNjZXNzX251bT0lc1xuIiwgX19GSUxFX18sIE1BWF9TdGF0aW9uX251bSwgTUFYX0FjY2Vzc19udW0sIG1fTUFYX0FjY2Vzc19udW0pOworCQlpZiAobWF4X251bSA9PSBtYXhfc3RhX251bSkgeworCQkJc3ByaW50ZihtX251bV9idWYsICIlZCIsIG1heF9zdGFfbnVtIC8gMik7CisJCQl6dGVfd2ViX3dyaXRlKCJNQVhfQWNjZXNzX251bSIsIG1fbnVtX2J1Zik7CisJCQl6dGVfd2ViX3dyaXRlKCJtX01BWF9BY2Nlc3NfbnVtIiwgbV9udW1fYnVmKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYXhfbnVtIDwgbWF4X3N0YV9udW0pIHsgLy8gyrW8ysnPo6yz/cHLtcjT2tfutPPWtaOsvs3Kx9Ch09rX7rTz1rWjrLTLtKbF0LbPzt7S4tLlCisJCQkJbV9tYXhfbnVtID0gbWF4X3N0YV9udW0gLSBtYXhfbnVtOworCQkJCXNwcmludGYobV9udW1fYnVmLCAiJWQiLCBtX21heF9udW0pOworCQkJCXp0ZV93ZWJfd3JpdGUoIm1fTUFYX0FjY2Vzc19udW0iLCBtX251bV9idWYpOworCQkJfQorCisJCX0KKworCX0gZWxzZSBpZiAoIXN0cmNtcChtX3NzaWRfZW5hYmxlLCAiMCIpKSB7CisJCXNjX2NmZ19zZXQoIkFQX1NUQVJUTU9ERSIsICJzdGFuZGFyZCIpOworCQlzY19jZmdfZ2V0KCJNQVhfQWNjZXNzX251bV9iYWsiLCBNQVhfQWNjZXNzX251bSwgc2l6ZW9mKE1BWF9BY2Nlc3NfbnVtKSk7CisJCXp0ZV93ZWJfd3JpdGUoIk1BWF9BY2Nlc3NfbnVtIiwgTUFYX0FjY2Vzc19udW0pOworCX0gZWxzZSB7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsIlxuIGVycm9yIHdpZmlfd29ya19tb2RlX3NldCBwYXJhbWV0ZXJcbiIpOworCQlyZXR1cm47CisJfQorfQorCit2b2lkIHp0ZV9sYW5fc3RvcF9hcHN0YSgpCit7CisJenRlX3dlYl93cml0ZSgid2lmaV9zdGFfY29ubmVjdGlvbiIsICIwIik7CisJLy96dGVfd2ViX3dyaXRlKCJibGNfc3dpdGNoIiwgIjAwIik7CisJenRlX3dlYl93cml0ZSgidXNlcl9pbml0aWF0ZV9kaXNjb25uZWN0IiwgIjAiKTsgLy/Tw7un1ve2r8GsvdPXtMyso6zNy7P2uMnUpMSjyr0KKwl6dGVfd2ViX3dyaXRlKCJtYW51YWxfZF93aWZpIiwgIjAiKTsKKworCXNsb2coTUlTQ19QUklOVCwgU0xPR19OT1JNQUwsIlt6dGVfbGFuX3N0b3BfYXBzdGFdTVNHX0NNRF9XSUZJX1NUQVRJT05fQ0xPU0VfT1BFTl9NU1NJRFxuIiwgMCwgTlVMTCk7CisKKwkvL3p0ZV9zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dJRkksIE1TR19DTURfV0lGSV9TVEFUSU9OX0NMT1NFX09QRU5fTVNTSUQsIDAsICBOVUxMKTsKKwlpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9XRUJfQ0dJLCBNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9XSUZJX1NUQVRJT05fQ0xPU0VfT1BFTl9NU1NJRCwgMCwgTlVMTCwgMCk7Cit9CisKK3ZvaWQgenRlX3dsYW5fYmFzaWNfc2V0KHdlYnNfdCB3cCkKK3sKKwljaGFyX3QgKndpZmlfb24gPSBOVUxMLCAqb2xkX3dpZmlfb24gPSBOVUxMOworCWNoYXJfdCAqcmFkaW9fb2ZmID0gTlVMTDsKKwljaGFyX3QgICp3aXJlbGVzc21vZGUgPSBOVUxMLCAqb2xkX3dpcmVsZXNzbW9kZSA9IE5VTEw7CisJY2hhcl90ICAqY291bnRyeWNvZGUgPSBOVUxMLCAqb2xkX2NvdW50cnljb2RlID0gTlVMTDsKKwkvL2NoYXJfdCAgKnNzaWQgPSBOVUxMLCAqb2xkX3NzaWQgPSBOVUxMOworCWNoYXJfdCAgKmJyb2FkY2FzdHNzaWQgPSBOVUxMLCAqb2xkX2Jyb2FkY2FzdHNzaWQgPSBOVUxMIDsKKwljaGFyX3QgICpjaGFubmVsID0gTlVMTCwgKm9sZF9jaGFubmVsID0gTlVMTDsKKwkvL2NoYXJfdCAqYWJnX3JhdGUgPSBOVUxMLCpvbGRfYWJnX3JhdGUgPSBOVUxMOworCS8vY2hhcl90ICpOb0ZvcndhcmRpbmcgPSBOVUxMLCpvbGRfTm9Gb3J3YXJkaW5nID0gTlVMTDsKKwljaGFyX3QgKk1BWF9BY2Nlc3NfbnVtID0gTlVMTCwgKm9sZF9NQVhfQWNjZXNzX251bSA9IE5VTEw7CisJY2hhcl90ICptX3NzaWRfZW5hYmxlID0gTlVMTCwgKm9sZF9tX3NzaWRfZW5hYmxlID0gTlVMTDsKKwkvL2NoYXJfdCAqbV9TU0lEID0gTlVMTCwqb2xkX21fU1NJRCA9IE5VTEw7CisJLy9jaGFyX3QgKm1fSGlkZVNTSUQgPSBOVUxMLCpvbGRfbV9IaWRlU1NJRCA9IE5VTEw7CisJLy9jaGFyX3QgKm1fTm9Gb3J3YXJkaW5nID0gTlVMTCwqb2xkX21fTm9Gb3J3YXJkaW5nID1OVUxMOworCWNoYXJfdCAqd2lmaV8xMW5fY2FwID0gTlVMTCwgKm9sZF93aWZpXzExbl9jYXAgPSBOVUxMOworCS8vY2hhcl90ICAqY2hhbm5lbF9KUCA9IE5VTEwsICpvbGRfY2hhbm5lbF9KUCA9IE5VTEw7CisJY2hhcl90ICAqd2lmaV9iYW5kID0gTlVMTCwgKm9sZF93aWZpX2JhbmQgPSBOVUxMOworCisJLy9pbnQgQWNjZXNzX251bSA9IDA7CisJdW5zaWduZWQgaW50IHdpZmlfc2V0X2ZsYWdzID0gMDsKKwljaGFyIHdpZmlfc2V0X2ZsYWdzX3N0cltOVl9JVEVNX1NUUklOR19MRU5fMjBdID0gezB9OworCWNoYXIgd2lmaV9zdGFfY29ubmVjdGlvbls4XSA9IHswfTsKKworCXp0ZV90b3Bzd19zdGF0ZV9lX3R5cGUgbnZfcmV0ID0gWlRFX05WSU9fRE9ORTsKKwljaGFyIG52X2Jhc2ljW05WSU9fV0lGSV9NQVhfTEVOXSA9IHswfTsgLy8gZm9yIG52IHJlYWQgYW5kIHdyaXRlCisvL2NvdiBtCisjZGVmaW5lIE5WX1JFQUQobnZfbmFtZSwgc3RyLCByZXQpIGRve3JldCA9IHp0ZV93ZWJfcmVhZChudl9uYW1lLCBudl9iYXNpYyk7IHN0ciA9IG52X2Jhc2ljO313aGlsZSgwKQorCS8qbGludCAtZTcxNyovCisJLy8jZGVmaW5lIE5WX1dSSVRFKG52X25hbWUsIHN0ciwgcmV0KSAgZG97IHJldCA9IHp0ZV93ZWJfd3JpdGUobnZfbmFtZSwgKGNoYXIgKilzdHIpO313aGlsZSgwKQorCisJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwgInp0ZV93bGFuX2Jhc2ljX3NldCBlbnRlciBcbiIpOworCisJLy9yZXNldCB3aWZpX3NldF9mbGFncworCSh2b2lkKXp0ZV93ZWJfd3JpdGUoV0lGSV9OVl9JVEVNX1dJRklfU0VUX0ZMQUdTLCAiIik7CisKKwkvL3dpZmlFbmFibGVkIG9yIG5vdAorCW1lbXNldChudl9iYXNpYywgMCwgc2l6ZW9mKG52X2Jhc2ljKSk7CisJd2lmaV9vbiA9IHdlYnNHZXRWYXIod3AsIFQoIndpZmlFbmFibGVkIiksIE5VTEwpOworCWlmICh3aWZpX29uICE9IE5VTEwpIHsKKwkJaWYgKFNUUl9FUVVBTCh3aWZpX29uLCAiMCIpKSB7CisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCBUKCJVRkl4IFVzZXIgZGlzYWJsZSBXSUZJIHN3dGljaCFcbiIpKTsKKwkJfSBlbHNlIGlmIChTVFJfRVFVQUwod2lmaV9vbiwgIjEiKSkgeworCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgVCgiVUZJeCBVc2VyIGVuYWJsZSBXSUZJIHN3dGljaCFcbiIpKTsKKwkJfQorCQlOVl9SRUFEKCJ3aWZpRW5hYmxlZCIsIG9sZF93aWZpX29uLCBudl9yZXQpOworCQlwcmludGYoIlslczolc11vbGRfd2lmaV9vbj0lcywgbnZfcmV0PSVkXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBvbGRfd2lmaV9vbiwgbnZfcmV0KTsKKwkJLy9OVl9SRUFEKCJSYWRpb09mZiIsIHJhZGlvX29mZiwgbnZfcmV0KTsKKwkJLy9wcmludGYoIlslczolc11yYWRpb19vZmY9JXMsIG52X3JldD0lZCIsX19GSUxFX18sIF9fRlVOQ1RJT05fXywgcmFkaW9fb2ZmLG52X3JldCk7CisJCWlmICghU1RSX0VRVUFMKHdpZmlfb24sIG9sZF93aWZpX29uKSkgeyAvL2t3IDMKKwkJCS8vc2VuZF90b19tYyA9IFRSVUU7CisJCQl3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9PTl9PRkZfU0VUOworCQkJTlZfV1JJVEUoIndpZmlFbmFibGVkIiwgd2lmaV9vbiwgbnZfcmV0KTsKKworI2lmIDAKKwkJCWlmIChTVFJfRVFVQUwod2lmaV9vbiwgIjAiKSAmJiBTVFJfRVFVQUwocmFkaW9fb2ZmLCAiMSIpKSB7CisJCQkJTlZfV1JJVEUoIndpZmlFbmFibGVkIiwgd2lmaV9vbiwgbnZfcmV0KTsKKwkJCQlOVl9XUklURSgiUmFkaW9PZmYiLCB3aWZpX29uLCBudl9yZXQpOworCQkJCU5WX1dSSVRFKCJSYWRpb09uIiwgd2lmaV9vbiwgbnZfcmV0KTsKKworCQkJfSBlbHNlIGlmIChTVFJfRVFVQUwod2lmaV9vbiwgIjEiKSkgeworCQkJCU5WX1dSSVRFKCJ3aWZpRW5hYmxlZCIsIHdpZmlfb24sIG52X3JldCk7CisJCQkJTlZfV1JJVEUoIlJhZGlvT24iLCB3aWZpX29uLCBudl9yZXQpOworCQkJfQorI2VuZGlmCisJCX0KKwkJcHJpbnRmKCJbJXM6JXNdd2lmaV9vbjpbJXNdXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCB3aWZpX29uKTsKKwl9CisKKwkvL3dpZmlNb2RlCisJbWVtc2V0KG52X2Jhc2ljLCAwLCBzaXplb2YobnZfYmFzaWMpKTsKKwl3aXJlbGVzc21vZGUgPSB3ZWJzR2V0VmFyKHdwLCBUKCJ3aWZpTW9kZSIpLCBOVUxMKTsKKwlpZiAod2lyZWxlc3Ntb2RlICE9IE5VTEwpIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgVCgiVUZJeCBVc2VyIHNldCBXSUZJIGFkdmFuY2VkIHNldHRpbmdzIVxuIikpOworCQlwcmludGYoIlslczolc113aXJlbGVzc21vZGU6JXNcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHdpcmVsZXNzbW9kZSk7ICAgLypsaW50ICFlMjYqLworCQlOVl9SRUFEKCJXaXJlbGVzc01vZGUiLCBvbGRfd2lyZWxlc3Ntb2RlLCBudl9yZXQpOworCQlwcmludGYoIlslczolc11vbGRfd2lyZWxlc3Ntb2RlPSVzLCBudl9yZXQ9JWRcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIG9sZF93aXJlbGVzc21vZGUsIG52X3JldCk7IC8qbGludCAhZTI2Ki8KKwkJaWYgKCFTVFJfRVFVQUwod2lyZWxlc3Ntb2RlLCBvbGRfd2lyZWxlc3Ntb2RlKSkgeyAvL2t3IDMKKwkJCXdpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX1dJUkVMRVNTX01PREVfU0VUOworCQkJTlZfV1JJVEUoIldpcmVsZXNzTW9kZSIsIHdpcmVsZXNzbW9kZSwgbnZfcmV0KTsKKwkJCXByaW50ZigiWyVzOiVzXXdpcmVsZXNzbW9kZSBpcyA6JXNcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHdpcmVsZXNzbW9kZSk7ICAgICAgIC8qbGludCAhZTI2Ki8KKwkJfQorCX0KKworCS8qIGNvdW50cnkgY29kZSovCisJbWVtc2V0KG52X2Jhc2ljLCAwLCBzaXplb2YobnZfYmFzaWMpKTsKKwljb3VudHJ5Y29kZSA9IHdlYnNHZXRWYXIod3AsIFQoImNvdW50cnlDb2RlIiksIE5VTEwpOworCWlmIChjb3VudHJ5Y29kZSAhPSBOVUxMKSB7CisjaWZkZWYgV0VCU19TRUNVUklUWQorCQl6dGVfd2ViX3JlYWQoIndpZmlfc3RhX2Nvbm5lY3Rpb24iLCB3aWZpX3N0YV9jb25uZWN0aW9uKTsKKwkJaWYod2lmaV9zdGFfY29ubmVjdGlvblswXSA9PSAnMScpCisJCXsKKwkJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmCQkKKwkJTlZfUkVBRCgiQ291bnRyeUNvZGUiLCBvbGRfY291bnRyeWNvZGUsIG52X3JldCk7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzOiVzXW9sZF9jb3VudHJ5Y29kZT0lcywgbnZfcmV0PSVkXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBvbGRfY291bnRyeWNvZGUsIG52X3JldCk7ICAvKmxpbnQgIWUyNiovCisJCWlmICghU1RSX0VRVUFMKGNvdW50cnljb2RlLCBvbGRfY291bnRyeWNvZGUpKSB7IC8va3cgMworCQkJd2lmaV9zZXRfZmxhZ3MgfD0gWlRFX1dMQU5fQ09VTlRSWV9TRVQ7CisJCQlOVl9XUklURSgiQ291bnRyeUNvZGUiLCBjb3VudHJ5Y29kZSwgbnZfcmV0KTsKKwkJfQorCisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzOiVzXWNvdW50cnljb2RlOiVzXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBjb3VudHJ5Y29kZSk7ICAgICAgICAgLypsaW50ICFlMjYqLworCX0KKworI2lmIDAgIC8vsrvK9NPauN+8tsnkxrWyzsr9CisJLy9icm9hZGNhc3RTc2lkRW5hYmxlZAorCW1lbXNldChudl9iYXNpYywgMCwgc2l6ZW9mKG52X2Jhc2ljKSk7CisJYnJvYWRjYXN0c3NpZCA9IHdlYnNHZXRWYXIod3AsIFQoImJyb2FkY2FzdFNzaWRFbmFibGVkIiksIE5VTEwpOworCWlmIChicm9hZGNhc3Rzc2lkICE9IE5VTEwpIHsKKwkJTlZfUkVBRCgiSGlkZVNTSUQiLCBvbGRfYnJvYWRjYXN0c3NpZCwgbnZfcmV0KTsKKwkJcHJpbnRmKCJbJXM6JXNdb2xkX2Jyb2FkY2FzdHNzaWQ9JXMsIG52X3JldD0lZFxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgb2xkX2Jyb2FkY2FzdHNzaWQsIG52X3JldCk7ICAvKmxpbnQgIWUyNiovCisJCWlmICgobnZfcmV0ID09ICBaVEVfTlZJT19ET05FICYmCisJCSAgICAgIVNUUl9FUVVBTChicm9hZGNhc3Rzc2lkLCBvbGRfYnJvYWRjYXN0c3NpZCkpIHx8CisJCSAgICAobnZfcmV0ICE9ICBaVEVfTlZJT19ET05FKSkgeworCQkJLy9zZW5kX3RvX21jID0gVFJVRTsKKwkJCXdpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX0JST0FEQ0FTVF9TRVQ7CisJCQlOVl9XUklURSgiSGlkZVNTSUQiLCBicm9hZGNhc3Rzc2lkLCBudl9yZXQpOworCQl9CisJCXByaW50ZigiWyVzOiVzXWJyb2FkY2FzdHNzaWQ6JXNcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIGJyb2FkY2FzdHNzaWQpOyAgICAgLypsaW50ICFlMjYqLworCX0KKyNlbmRpZgorCS8vc2VsZWN0ZWRDaGFubmVsCisJbWVtc2V0KG52X2Jhc2ljLCAwLCBzaXplb2YobnZfYmFzaWMpKTsKKwljaGFubmVsID0gd2Vic0dldFZhcih3cCwgVCgic2VsZWN0ZWRDaGFubmVsIiksIE5VTEwpOworCWlmIChjaGFubmVsICE9IE5VTEwpIHsKKwkJTlZfUkVBRCgiQ2hhbm5lbCIsIG9sZF9jaGFubmVsLCBudl9yZXQpOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslczolc11vbGRfY2hhbm5lbD0lcywgbnZfcmV0PSVkXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBvbGRfY2hhbm5lbCwgbnZfcmV0KTsgIC8qbGludCAhZTI2Ki8KKwkJaWYgKCFTVFJfRVFVQUwoY2hhbm5lbCwgb2xkX2NoYW5uZWwpKSB7IC8va3cgMworCQkJLy9zZW5kX3RvX21jID0gVFJVRTsKKwkJCXdpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX0NIQU5ORUxfU0VUOworCQkJTlZfV1JJVEUoIkNoYW5uZWwiLCBjaGFubmVsLCBudl9yZXQpOworCQl9CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzOiVzXWNoYW5uZWw6JXNcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIGNoYW5uZWwpOyAvKmxpbnQgIWUyNiovCisJfQorCisJLy9iYW5kIHNldHRpbmcKKwltZW1zZXQobnZfYmFzaWMsIDAsIHNpemVvZihudl9iYXNpYykpOworCXdpZmlfYmFuZCA9IHdlYnNHZXRWYXIod3AsIFQoIndpZmlfYmFuZCIpLCBOVUxMKTsKKwlpZiAod2lmaV9iYW5kICE9IE5VTEwpIHsKKwkJTlZfUkVBRCgid2lmaV9iYW5kIiwgb2xkX3dpZmlfYmFuZCwgbnZfcmV0KTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXM6JXNdb2xkX3dpZmlfYmFuZD0lcywgbnZfcmV0PSVkXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBvbGRfd2lmaV9iYW5kLCBudl9yZXQpOyAgICAgIC8qbGludCAhZTI2Ki8KKwkJaWYgKCFTVFJfRVFVQUwod2lmaV9iYW5kLCBvbGRfd2lmaV9iYW5kKSkgeyAvL2t3IDMKKwkJCXdpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX1dJRklfQkFORF9TRVQ7CisJCQlOVl9XUklURSgid2lmaV9iYW5kIiwgd2lmaV9iYW5kLCBudl9yZXQpOworCQl9CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzOiVzXXdpZmlfYmFuZDolc1xuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgd2lmaV9iYW5kKTsgICAgICAgICAvKmxpbnQgIWUyNiovCisJfQorCisKKwkvL3NldCB3aWZpIHJhdGUKKyNpZiAwCisJbWVtc2V0KG52X2Jhc2ljLCAwLCBzaXplb2YobnZfYmFzaWMpKTsKKwlhYmdfcmF0ZSA9IHdlYnNHZXRWYXIod3AsIFQoImFiZ19yYXRlIiksIE5VTEwpOworCWlmIChhYmdfcmF0ZSAhPSBOVUxMKSB7CisJCU5WX1JFQUQoIkhUX01DUyIsIG9sZF9hYmdfcmF0ZSwgbnZfcmV0KTsKKwkJcHJpbnRmKCJvbGRfYWJnX3JhdGU9JXMsIG52X3JldD0lZCIsIG9sZF9hYmdfcmF0ZSwgbnZfcmV0KTsgIC8qbGludCAhZTI2Ki8KKwkJaWYgKChudl9yZXQgPT0gIFpURV9OVklPX0RPTkUgJiYKKwkJICAgICAhU1RSX0VRVUFMKGFiZ19yYXRlLCBvbGRfYWJnX3JhdGUpKSB8fAorCQkgICAgKG52X3JldCAhPSAgWlRFX05WSU9fRE9ORSkpIHsKKwkJCXdpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX0RBVEFfUkFURV9TRVQ7CisJCQlOVl9XUklURSgiSFRfTUNTIiwgYWJnX3JhdGUsIG52X3JldCk7CisJCX0KKworCQlwcmludGYoImFiZ19yYXRlOiVzIiwgYWJnX3JhdGUpOyAvKmxpbnQgIWUyNiovCisJfQorI2VuZGlmCisKKyNpZiAwIC8vIG5vdCBiZWxvbmcgdG8gUkYgcGFyYW1ldGVycworCS8vc2V0ICBNQVhfQWNjZXNzX251bQorCW1lbXNldChudl9iYXNpYywgMCwgc2l6ZW9mKG52X2Jhc2ljKSk7CisJTUFYX0FjY2Vzc19udW0gPSB3ZWJzR2V0VmFyKHdwLCBUKCJNQVhfQWNjZXNzX251bSIpLCBOVUxMKTsKKwlpZiAoTUFYX0FjY2Vzc19udW0gIT0gTlVMTCkgeworCQlOVl9SRUFEKCJNQVhfQWNjZXNzX251bSIsIG9sZF9NQVhfQWNjZXNzX251bSwgbnZfcmV0KTsKKwkJcHJpbnRmKCJbJXM6JXNdb2xkX01BWF9BY2Nlc3NfbnVtPSVzLCBudl9yZXQ9JWRcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIG9sZF9NQVhfQWNjZXNzX251bSwgbnZfcmV0KTsgICAgLypsaW50ICFlMjYqLworCQlpZiAoKG52X3JldCA9PSAgWlRFX05WSU9fRE9ORSAmJgorCQkgICAgICFTVFJfRVFVQUwoTUFYX0FjY2Vzc19udW0sIG9sZF9NQVhfQWNjZXNzX251bSkpIHx8CisJCSAgICAobnZfcmV0ICE9ICBaVEVfTlZJT19ET05FKSkgeworCQkJd2lmaV9zZXRfZmxhZ3MgfD0gWlRFX1dMQU5fTUFYX0FDQ0VTU19OVU1fU0VUOworCQkJTlZfV1JJVEUoIk1BWF9BY2Nlc3NfbnVtIiwgTUFYX0FjY2Vzc19udW0sIG52X3JldCk7CisJCQlOVl9XUklURSgiTUFYX0FjY2Vzc19udW1fdXNlcl9zZXQiLCAiMSIsIG52X3JldCk7CisJCX0KKworCQlwcmludGYoIlslczolc11NQVhfQWNjZXNzX251bTolc1xuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgTUFYX0FjY2Vzc19udW0pOyAgIC8qbGludCAhZTI2Ki8KKwl9CisjZW5kaWYKKwkvL3NldCAgbV9zc2lkX2VuYWJsZQorCW1lbXNldChudl9iYXNpYywgMCwgc2l6ZW9mKG52X2Jhc2ljKSk7CisJbV9zc2lkX2VuYWJsZSA9IHdlYnNHZXRWYXIod3AsIFQoIm1fc3NpZF9lbmFibGUiKSwgTlVMTCk7CisJaWYgKG1fc3NpZF9lbmFibGUgIT0gTlVMTCkgeworI2lmIDEKKwkJTlZfUkVBRCgibV9zc2lkX2VuYWJsZSIsIG9sZF9tX3NzaWRfZW5hYmxlLCBudl9yZXQpOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIm9sZF9tX3NzaWRfZW5hYmxlPSVzLCBudl9yZXQ9JWRcbiIsIG9sZF9tX3NzaWRfZW5hYmxlLCBudl9yZXQpOy8qbGludCAhZTI2Ki8KKwkJaWYgKCFTVFJfRVFVQUwobV9zc2lkX2VuYWJsZSwgb2xkX21fc3NpZF9lbmFibGUpKSB7IC8va3cgMworCQkJd2lmaV9zZXRfZmxhZ3MgfD0gWlRFX1dMQU5fU0VUX0FQX01TU0lEOworCQkJTlZfV1JJVEUoIm1fc3NpZF9lbmFibGUiLCBtX3NzaWRfZW5hYmxlLCBudl9yZXQpOworCQkJd2xhbl9zZXRfY2hhbmdlX3NzaWRfa2V5X3N0YXR1cygpOy8vYWRkZWQgYnkgZHVqaWFqaWFvCisJCQl3aWZpX3dvcmtfbW9kZV9zZXRfYmFzaWMoKTsKKwkJfQorI2Vsc2UKKwkJaWYgKCFzdHJjbXAobV9zc2lkX2VuYWJsZSwgIjEiKSkgeworCQkJTlZfV1JJVEUoIm1fc3NpZF9lbmFibGUiLCAiMCIsIG52X3JldCk7CisJCX0KKyNlbmRpZgorCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslczolc11tX3NzaWRfZW5hYmxlOiVzXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBtX3NzaWRfZW5hYmxlKTsgLypsaW50ICFlMjYqLworCX0KKworCS8vc2V0ICB3aWZpXzExbl9jYXAKKwltZW1zZXQobnZfYmFzaWMsIDAsIHNpemVvZihudl9iYXNpYykpOworCU5WX1JFQUQoIndpZmlfMTFuX2NhcCIsIG9sZF93aWZpXzExbl9jYXAsIG52X3JldCk7CisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXM6JXNdb2xkX3dpZmlfMTFuX2NhcD0lcywgbnZfcmV0PSVkXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBvbGRfd2lmaV8xMW5fY2FwLCBudl9yZXQpOyAvKmxpbnQgIWUyNiovCisJd2lmaV8xMW5fY2FwID0gd2Vic0dldFZhcih3cCwgVCgid2lmaV8xMW5fY2FwIiksIE5VTEwpOworCWlmICh3aWZpXzExbl9jYXAgIT0gTlVMTCkgeworCQlpZiAoIVNUUl9FUVVBTCh3aWZpXzExbl9jYXAsIG9sZF93aWZpXzExbl9jYXApKSB7IC8va3cgMworCQkJd2lmaV9zZXRfZmxhZ3MgfD0gWlRFX1dMQU5fV0lSRUxFU1NfTU9ERV9TRVQ7CisJCQlOVl9XUklURSgid2lmaV8xMW5fY2FwIiwgd2lmaV8xMW5fY2FwLCBudl9yZXQpOworCQl9CisKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXM6JXNdd2lmaV8xMW5fY2FwOiVzXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCB3aWZpXzExbl9jYXApOyAgICAgICAvKmxpbnQgIWUyNiovCisJfQorCisJLy9sYXN0LCB3cml0ZSB0aGUgd2lmaV9zZXRfZmxhZ3MKKwkodm9pZClzbnByaW50Zih3aWZpX3NldF9mbGFnc19zdHIsIHNpemVvZih3aWZpX3NldF9mbGFnc19zdHIpIC0gMSwgIiV1Iiwgd2lmaV9zZXRfZmxhZ3MpOworCSh2b2lkKXp0ZV93ZWJfd3JpdGUoV0lGSV9OVl9JVEVNX1dJRklfU0VUX0ZMQUdTLCB3aWZpX3NldF9mbGFnc19zdHIpOworCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzOiVzXXdpZmlfc2V0X2ZsYWdzOlsweCV4XSB0byBbJXNdXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCB3aWZpX3NldF9mbGFncywgd2lmaV9zZXRfZmxhZ3Nfc3RyKTsgLypsaW50ICFlMjYqLworCisJaWYgKDAgIT0gd2lmaV9zZXRfZmxhZ3MpIHsKKwkJdW5zaWduZWQgaW50ICBmbGFncyA9IDA7CisJCVVDSEFSICBmbGFnX3N0cls4XSA9IHswfTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXM6JXNdc2VuZCB3aWZpIHBhcmEgdG8gd2xhbi1zZXJ2ZXJAYmFzaWNfc2V0XG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsgLypsaW50ICFlMjYqLworCisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzOiVzXW1fc3NpZF9lbmFibGU9JXMsd2lmaV9vbj0lc1xuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgbV9zc2lkX2VuYWJsZSwgd2lmaV9vbik7IC8qbGludCAhZTI2Ki8KKworCQlpZiAoTlVMTCAhPSB3aWZpX29uICYmICh3aWZpX3NldF9mbGFncyAmIFpURV9XTEFOX09OX09GRl9TRVQpKSB7CisvL7+qxvR3aWZpyrG68qOsyOe5+82syrG/qsb0TVNTSUSjrLu5ysfWu8no1sO/qsb0d2lmaSC1xGZsYWdzo6zS8s6qTVNTSUS1xG520tG+rcno1sO5/cHLCisKKwkJCWlmICgwID09IGF0b2kod2lmaV9vbikpCisJCQkJZmxhZ3MgPSBXSUZJX0FEVkFOQ0VEX0NMT1NFOworCQkJZWxzZSBpZiAobV9zc2lkX2VuYWJsZSAhPSBOVUxMICYmIDEgPT0gYXRvaShtX3NzaWRfZW5hYmxlKSkgeyAvLyDNrMqxv6rG9G11bHRpc3NzaWSjrNKq1KS3wGFwc3RhINK7sqK/qsb0tcTH6b/2CisJCQkJZmxhZ3MgPSBXSUZJX0FEVkFOQ0VEX09QRU5fVkEwMTsKKwkJCX0gZWxzZQorCQkJCWZsYWdzID0gV0lGSV9BRFZBTkNFRF9PUEVOOworCisJCX0gZWxzZSBpZiAod2lmaV9zZXRfZmxhZ3MgJiBaVEVfV0xBTl9TRVRfQVBfTVNTSUQpIHsgLy8g1Np3aWZpv6q52L+qxvS1xNe0zKzPwqOsttQgTXVsdGkgU1NJRCC9+NDQv6q52MfQu7sKKwkJCWlmICgxID09IGF0b2kobV9zc2lkX2VuYWJsZSkpCisJCQkJZmxhZ3MgPSBXSUZJX0FEVkFOQ0VEX09QRU5fVkExOworCQkJZWxzZQorCQkJCWZsYWdzID0gV0lGSV9BRFZBTkNFRF9DTE9TRV9NU1NJRDsKKworCQl9IGVsc2UgeyAvLyDJ6NbDuN+8trLOyv3J5Ma1CisJCQlmbGFncyA9IFdJRklfQURWQU5DRURfUkY7CisJCX0KKwkJc25wcmludGYoZmxhZ19zdHIsc2l6ZW9mKGZsYWdfc3RyKSwgIiVkIiwgZmxhZ3MpOworCQl6dGVfd2ViX3JlYWQoIndpZmlfc3RhX2Nvbm5lY3Rpb24iLCB3aWZpX3N0YV9jb25uZWN0aW9uKTsKKworCisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzOiVzXW1fc3NpZF9lbmFibGU9JXMsd2lmaV9vbj0lc1xuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgbV9zc2lkX2VuYWJsZSwgd2lmaV9vbik7IC8qbGludCAhZTI2Ki8KKworLy93aGVuIG9wZW4gbXNzaWQgLCBuZWVkIGNsb3NlIGFwc3RhIGF0IHNhbWUgdGltZQorCQlpZiAoKGZsYWdzID09IFdJRklfQURWQU5DRURfT1BFTl9WQTEpICYmICBhdG9pKHdpZmlfc3RhX2Nvbm5lY3Rpb24pID09IDEpIHsKKwkJCXp0ZV9sYW5fc3RvcF9hcHN0YSgpOworCQl9IGVsc2UgeworCQkJLy9pZigwICE9IHp0ZV9zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dJRkksIE1TR19DTURfV0lGSV9BRFZBTkNFRCwgc3RybGVuKGZsYWdfc3RyKSsxLCAgZmxhZ19zdHIpKQorCQkJaWYgKDAgIT0gaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0VCX0NHSSwgTU9EVUxFX0lEX1dJRkksIE1TR19DTURfV0lGSV9BRFZBTkNFRCwgc3RybGVuKGZsYWdfc3RyKSArIDEsIGZsYWdfc3RyLCAwKSkgeworCQkJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwgIlslczolc113aWZpIHNldCBjbWQgZG9uZSEgXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsgLypsaW50ICFlMjYqLworCX0KKwl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgU1VDQ0VTUyk7CisKK30KKwordm9pZCB6dGVfd2xhbl9tYWNfZmlsdGVyX3NldCh3ZWJzX3Qgd3ApCit7CisJY2hhcl90ICpBQ0xfbW9kZSA9IE5VTEw7CisJY2hhcl90ICpvbGRfQUNMX21vZGUgPSBOVUxMOworCWNoYXJfdCAqd2lmaV9tYWNfYmxhY2tfbGlzdCA9IE5VTEw7CisJY2hhcl90ICp3aWZpX21hY193aGl0ZV9saXN0ID0gTlVMTDsKKwljaGFyX3QgKm9sZF93aWZpX21hY19ibGFja19saXN0ID0gTlVMTDsKKwljaGFyX3QgKm9sZF93aWZpX21hY193aGl0ZV9saXN0ID0gTlVMTDsKKwljaGFyX3QgKndpZmlfaG9zdG5hbWVfYmxhY2tfbGlzdCA9IE5VTEw7CisJY2hhcl90ICp3aWZpX2hvc3RuYW1lX3doaXRlX2xpc3QgPSBOVUxMOworCXVuc2lnbmVkIGludCB3aWZpX3NldF9mbGFncyA9IDA7CisJY2hhciB3aWZpX3NldF9mbGFnc19zdHJbTlZfSVRFTV9TVFJJTkdfTEVOXzIwXSA9IHswfTsKKwljaGFyIGFjY2Vzc2NvbnRyb2xsaXN0MFs3MjBdID0gezB9OworCXp0ZV90b3Bzd19zdGF0ZV9lX3R5cGUgbnZfcmV0ID0gWlRFX05WSU9fRE9ORTsKKwljaGFyIG52X2Jhc2ljW05WSU9fV0lGSV9NQVhfTEVOXSA9IHswfTsgLy8gZm9yIG52IHJlYWQgYW5kIHdyaXRlCisJY2hhciBudl9tYWNbNzIwXSA9IHswfTsKKy8vY292IG0KKyNkZWZpbmUgTlZfUkVBRChudl9uYW1lLCBzdHIsIHJldCkgIGRve3JldCA9IHp0ZV93ZWJfcmVhZChudl9uYW1lLCBudl9iYXNpYyk7IHN0ciA9IG52X2Jhc2ljO313aGlsZSgwKQorI2RlZmluZSBOVl9SRUFEX01BQyhudl9uYW1lLCBzdHIsIHJldCkgIGRve3JldCA9IHp0ZV93ZWJfcmVhZChudl9uYW1lLCBudl9tYWMpOyBzdHIgPSBudl9tYWM7fXdoaWxlKDApCisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXM6JXNdenRlX3dsYW5fbWFjX2ZpbHRlcl9zZXQuXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsgLypsaW50ICFlMjYqLworCW1lbXNldChudl9iYXNpYywgMCwgc2l6ZW9mKG52X2Jhc2ljKSk7CisJTlZfUkVBRCgiQUNMX21vZGUiLCBvbGRfQUNMX21vZGUsIG52X3JldCk7CisJQUNMX21vZGUgPSB3ZWJzR2V0VmFyKHdwLCBUKCJBQ0xfbW9kZSIpLCBUKCIiKSk7CisKKwlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslczolc10gQUNMX21vZGUgPSVzLG52X3JldCA9ICVkICBvbGRfQUNMX21vZGUgPSAlcyBcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIEFDTF9tb2RlLCBudl9yZXQsIG9sZF9BQ0xfbW9kZSk7CisJaWYgKEFDTF9tb2RlICE9IE5VTEwpIHsKKwkJaWYgKCFzdHJjbXAoQUNMX21vZGUsICIyIikpIHsKKwkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsIFQoIlVGSXggVXNlciBlbmFibGUgYmxhY2sgbGlzdCFcbiIpKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKEFDTF9tb2RlLCAiMCIpKSB7CisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCBUKCJVRkl4IFVzZXIgZGlzYWJsZSBibGFjayBsaXN0IVxuIikpOworCQl9CisJCWlmICghU1RSX0VRVUFMKEFDTF9tb2RlLCBvbGRfQUNMX21vZGUpKSB7IC8va3cgMworCQkJd2lmaV9zZXRfZmxhZ3MgfD0gWlRFX1dMQU5fQUNMX1NFVDsKKwkJCU5WX1dSSVRFKCJBQ0xfbW9kZSIsIEFDTF9tb2RlLCBudl9yZXQpOworCQl9CisKKwl9IGVsc2Ugey8va2xvY3dvcmsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwiWyVzOiVzXUFDTF9tb2RlOm5vIHN1Y2ggcGFyYS4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsgLypsaW50ICFlMjYqLworCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQobnZfbWFjLCAwLCBzaXplb2YobnZfbWFjKSk7CisJaWYgKCFzdHJjbXAoQUNMX21vZGUsICIyIikpIHsKKwkJY2hhciAgYmxhY2tfbGlzdFs3MjBdID0gezB9OworCQlOVl9SRUFEX01BQygid2lmaV9tYWNfYmxhY2tfbGlzdCIsIG9sZF93aWZpX21hY19ibGFja19saXN0LCBudl9yZXQpOworCQl3aWZpX21hY19ibGFja19saXN0ID0gd2Vic0dldFZhcih3cCwgVCgid2lmaV9tYWNfYmxhY2tfbGlzdCIpLCBUKCIiKSk7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzXSB3aWZpX21hY19ibGFja19saXN0ID0gJXMsIG9sZF93aWZpX21hY19ibGFja19saXN0PSVzIFxuIiwgX19GSUxFX18sIHdpZmlfbWFjX2JsYWNrX2xpc3QsIG9sZF93aWZpX21hY19ibGFja19saXN0KTsKKwkJLy9jb3YgbQorCQlpZiAoKHdpZmlfbWFjX2JsYWNrX2xpc3QgIT0gTlVMTCkgJiYgKHN0cmxlbih3aWZpX21hY19ibGFja19saXN0KSA8IHNpemVvZihibGFja19saXN0KSkpIHsKKwkJCXN0cjJ1cHBlcih3aWZpX21hY19ibGFja19saXN0LCBibGFja19saXN0KTsKKwkJCWlmICghU1RSX0VRVUFMKGJsYWNrX2xpc3QsIG9sZF93aWZpX21hY19ibGFja19saXN0KSkgeyAvL2t3IDMKKwkJCQl3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9BQ0xfU0VUOworCQkJCU5WX1dSSVRFKCJ3aWZpX21hY19ibGFja19saXN0IiwgYmxhY2tfbGlzdCwgbnZfcmV0KTsKKwkJCX0KKworCQl9CisJCXdpZmlfaG9zdG5hbWVfYmxhY2tfbGlzdCA9IHdlYnNHZXRWYXIod3AsIFQoIndpZmlfaG9zdG5hbWVfYmxhY2tfbGlzdCIpLCBUKCIiKSk7CisJCWlmICh3aWZpX2hvc3RuYW1lX2JsYWNrX2xpc3QgIT0gTlVMTCkvL2tsb2N3b3JrCisJCQkodm9pZCl6dGVfd2ViX3dyaXRlKCJ3aWZpX2hvc3RuYW1lX2JsYWNrX2xpc3QiLCB3aWZpX2hvc3RuYW1lX2JsYWNrX2xpc3QpOworCX0gZWxzZSBpZiAoIXN0cmNtcChBQ0xfbW9kZSwgIjEiKSkgeworCQljaGFyICB3aGl0ZV9saXN0WzcyMF0gPSB7MH07CisJCU5WX1JFQURfTUFDKCJ3aWZpX21hY193aGl0ZV9saXN0Iiwgb2xkX3dpZmlfbWFjX3doaXRlX2xpc3QsIG52X3JldCk7CisJCXdpZmlfbWFjX3doaXRlX2xpc3QgPSB3ZWJzR2V0VmFyKHdwLCBUKCJ3aWZpX21hY193aGl0ZV9saXN0IiksIFQoIiIpKTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdIHdpZmlfbWFjX3doaXRlX2xpc3QgPSAlcyxvbGRfd2lmaV9tYWNfd2hpdGVfbGlzdD0lcyBcbiIsIF9fRklMRV9fLCAgd2lmaV9tYWNfd2hpdGVfbGlzdCwgb2xkX3dpZmlfbWFjX3doaXRlX2xpc3QpOworCQkvL2NvdiBtCisJCWlmICgod2lmaV9tYWNfd2hpdGVfbGlzdCAhPSBOVUxMKSAgJiYgKHN0cmxlbih3aWZpX21hY193aGl0ZV9saXN0KSA8IHNpemVvZih3aGl0ZV9saXN0KSkpIHsKKwkJCXN0cjJ1cHBlcih3aWZpX21hY193aGl0ZV9saXN0LCB3aGl0ZV9saXN0KTsKKwkJCWlmICghU1RSX0VRVUFMKHdoaXRlX2xpc3QsIG9sZF93aWZpX21hY193aGl0ZV9saXN0KSkgeyAvL2t3IDMKKwkJCQl3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9BQ0xfU0VUOworCQkJCU5WX1dSSVRFKCJ3aWZpX21hY193aGl0ZV9saXN0Iiwgd2hpdGVfbGlzdCwgbnZfcmV0KTsKKwkJCX0KKworCQl9CisJCXdpZmlfaG9zdG5hbWVfd2hpdGVfbGlzdCA9IHdlYnNHZXRWYXIod3AsIFQoIndpZmlfaG9zdG5hbWVfd2hpdGVfbGlzdCIpLCBUKCIiKSk7CisJCWlmICh3aWZpX2hvc3RuYW1lX3doaXRlX2xpc3QgIT0gTlVMTCkvL2tsb2N3b3JrCisJCQkodm9pZCl6dGVfd2ViX3dyaXRlKCJ3aWZpX2hvc3RuYW1lX3doaXRlX2xpc3QiLCB3aWZpX2hvc3RuYW1lX3doaXRlX2xpc3QpOworCX0KKwlpZiAoJ1wwJyA9PSAqQUNMX21vZGUpIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwiWyVzOiVzXUFDTF9tb2RlOmludmFsaWQgaW5wdXQgcGFyYS4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsgLypsaW50ICFlMjYqLworCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwkvLyh2b2lkKXp0ZV93ZWJfd3JpdGUoIkFDTF9tb2RlIixBQ0xfbW9kZSk7CisJLy8odm9pZCl6dGVfd2ViX3dyaXRlKCJ3aWZpX21hY19ibGFja19saXN0Iiwgd2lmaV9tYWNfYmxhY2tfbGlzdCk7CisKKworLyoKKwlpZiAoIXN0cmNtcChBQ0xfbW9kZSwgIjIiKSkgeworCQkodm9pZCl6dGVfd2ViX3dyaXRlKCJ3aWZpX2hvc3RuYW1lX2JsYWNrX2xpc3QiLCB3aWZpX2hvc3RuYW1lX2JsYWNrX2xpc3QpOworCX0gZWxzZSBpZiAoIXN0cmNtcChBQ0xfbW9kZSwgIjEiKSkgeworCQkodm9pZCl6dGVfd2ViX3dyaXRlKCJ3aWZpX2hvc3RuYW1lX3doaXRlX2xpc3QiLCB3aWZpX2hvc3RuYW1lX3doaXRlX2xpc3QpOworCX0KKyovCisKKwlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslc10gd2lmaV9tYWNfYmxhY2tfbGlzdD0lcyAsd2lmaV9tYWNfd2hpdGVfbGlzdD0lcywgd2lmaV9zZXRfZmxhZ3M9JWRcbiIsCisJICAgICAgIF9fRklMRV9fLCB3aWZpX21hY19ibGFja19saXN0LCB3aWZpX21hY193aGl0ZV9saXN0LCB3aWZpX3NldF9mbGFncyk7CisKKwlpZiAod2lmaV9zZXRfZmxhZ3MgIT0gMCkgeworCQkodm9pZClzbnByaW50Zih3aWZpX3NldF9mbGFnc19zdHIsIHNpemVvZih3aWZpX3NldF9mbGFnc19zdHIpIC0gMSwgIiV1Iiwgd2lmaV9zZXRfZmxhZ3MpOworCQkodm9pZCl6dGVfd2ViX3dyaXRlKFdJRklfTlZfSVRFTV9XSUZJX1NFVF9GTEFHUywgd2lmaV9zZXRfZmxhZ3Nfc3RyKTsKKwkJLy96dGVfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9XSUZJLE1TR19DTURfV0lGSV9NQUMsMCxOVUxMKTsKKwkJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0VCX0NHSSwgTU9EVUxFX0lEX1dJRkksIE1TR19DTURfV0lGSV9NQUMsIDAsIE5VTEwsIDApOworCisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19OT1JNQUwsIlslczolc10gTVNHX0NNRF9XSUZJX01BQyAgc2VuZCB0byB3bGFuLXNlcnZlciFcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18pOyAvKmxpbnQgIWUyNiovCisJfSBlbHNlIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX05PUk1BTCwiWyVzOiVzXWRvIG5vdCBkZWFsXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsKKwl9CisKKwl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgU1VDQ0VTUyk7CisKK30KKwordm9pZCB6dGVfd2xhbl93cHNfbW9kZV9zZXQod2Vic190IHdwKQorCit7CisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgVCgiVUZJeCBVc2VyIHNldCB3cHMgbW9kZSFcbiIpKTsKKworCWNoYXIgKndwc19tb2RlID0gTlVMTDsKKwljaGFyICpXUFNfU1NJRCA9IE5VTEw7CisJY2hhciAqd3BzX3BpbiA9IE5VTEw7CisKKy8vICAgIGNoYXIgcGluSXNWYWxpZGF0ZVsxMF0gPSB7MH07CisJY2hhciBhdXRoX21vZGVbTlZfSVRFTV9TVFJJTkdfTEVOXzIwXSA9IHswfTsKKwljaGFyIGVuY3J5cFR5cGVbV0ZfRU5DUllfVFlQRV9MRU5dID0gezB9OworCWNoYXIgd3BzX3N0YXRlW05WX0lURU1fU1RSSU5HX0xFTl81MF0gPSB7MH07CisJaW50ICBwaW5fbGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgd2lmaV9zZXRfZmxhZ3MgPSAwOworCWNoYXIgd2lmaV9zZXRfZmxhZ3Nfc3RyW05WX0lURU1fU1RSSU5HX0xFTl8yMF0gPSB7MH07CisKKwljaGFyICp3aWZpX3dwc19pbmRleCA9IE5VTEw7CisJY2hhciAgd3BzX21zZ1sxNl0gPSB7MH07CisKKwl3cHNfbW9kZSA9IHdlYnNHZXRWYXIod3AsIFQoIndwc19tb2RlIiksIFQoIiIpKTsKKwlXUFNfU1NJRCA9IHdlYnNHZXRWYXIod3AsIFQoIldQU19TU0lEIiksIFQoIiIpKTsKKwl3aWZpX3dwc19pbmRleCA9IHdlYnNHZXRWYXIod3AsIFQoIndpZmlfd3BzX2luZGV4IiksIFQoIiIpKTsKKworCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzXVslc10gd2lmaV93cHNfaW5kZXggPSAlc1xuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgd2lmaV93cHNfaW5kZXgpOworCisJaWYgKCgnXDAnID09ICp3cHNfbW9kZSkgfHwgKCdcMCcgID09ICpXUFNfU1NJRCkpIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwiWyVzOiVzXXp0ZV9sYW5fd3BzX3NldDppbnZhbGlkIGlucHV0IHBhcmEuXG4gd3BzX21vZGUgaXMgWyVzXVxuIFdQU19TU0lEIGlzIFslc10iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCB3cHNfbW9kZSwgV1BTX1NTSUQpOyAvKmxpbnQgIWUyNiovCisJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCSh2b2lkKSB6dGVfd2ViX3JlYWQoTlZfV0lGSV9XUFNfU1RBVEUsIHdwc19zdGF0ZSk7CisJaWYgKDAgPT0gc3RyY21wKHdwc19zdGF0ZSwgIjEiKSkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJ6dGVfbGFuX3dwc19zZXQ6aW52YWxpZCBvcGVyYXRlLCB3cHMgaW4gcHJvY2Vzc2luZy4uIik7LypsaW50ICFlMjYqLworCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoMCA9PSBzdHJjbXAod3BzX21vZGUsIFdQU19NT0RFX1BCQykpIHsKKwkJKHZvaWQpenRlX3dlYl93cml0ZShOVl9XSUZJX1dQU19TVEFURSwgIjEiKTsKKwkJKHZvaWQpenRlX3dlYl93cml0ZShOVl9XSUZJX1dQU19NT0RFLCB3cHNfbW9kZSk7CisJCSh2b2lkKXp0ZV93ZWJfd3JpdGUoTlZfV0lGSV9XUFNfU1NJRCwgV1BTX1NTSUQpOworCX0gZWxzZSBpZiAoMCA9PSBzdHJjbXAod3BzX21vZGUsIFdQU19NT0RFX1BJTikpIHsKKwkJd3BzX3BpbiA9IHdlYnNHZXRWYXIod3AsIFQoIndwc19waW4iKSwgVCgiIikpOworCQkvL2FkZCBieSBsaXV5aW5nbmFuIGZvciBzZXJ2ZXIgc2FmZSBmb3IgeHNzIGF0dGFjayBzdGFydAorCQlpZiAoREFUQV9OT19TQUZFID09IHp0ZV9TYWZlX25vU3BlY2lhbENoYXIod3BzX3BpbikpIHsKKwkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsIlslczolc11HZXQgRGF0YSBpcyBubyBTYWZlOndwc19waW46JXNcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHdwc19waW4pOyAvKmxpbnQgIWUyNiovCisJCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvL3ByaW50ZigiIC0tLS0genRlX3dsYW5fd3BzX21vZGVfc2V0IGxlbiBpcyAlc1xuIiwgd3BzX3Bpbik7CisJCWlmICh3cHNfcGluID09IE5VTEwpIHsKKwkJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBpbl9sZW4gPSBzdHJsZW4od3BzX3Bpbik7CisJCWlmICgocGluX2xlbiA9PSAwKSB8fCAoKHBpbl9sZW4gIT0gNCkgJiYgKHBpbl9sZW4gIT0gOCkpKSB7CisJCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IHdwc19waW5fbnVtID0gYXRvaSh3cHNfcGluKTsKKwkJaWYod3BzX3Bpbl9udW08MCB8fCB3cHNfcGluX251bT4gSU5UX01BWC0xKQorCQl7CisJCQl3cHNfcGluX251bSA9IDA7CisJCX0KKwkJaWYgKChwaW5fbGVuID09IDgpICYmICF2YWxpZGF0ZV9waW5fY29kZSh3cHNfcGluX251bSkpIHsKKwkJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsIiVzIFBJTiBjaGVjayBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm47CisJCX0KKworCisJCS8vYWRkIGJ5IGxpdXlpbmduYW4gZm9yIHNlcnZlciBzYWZlIGZvciB4c3MgYXR0YWNrIGVuZAorCQkodm9pZCl6dGVfd2ViX3dyaXRlKE5WX1dJRklfV1BTX1NUQVRFLCAiMSIpOworCQkodm9pZCl6dGVfd2ViX3dyaXRlKE5WX1dJRklfV1BTX01PREUsIHdwc19tb2RlKTsKKwkJKHZvaWQpenRlX3dlYl93cml0ZShOVl9XSUZJX1dQU19TU0lELCBXUFNfU1NJRCk7CisJCSh2b2lkKXp0ZV93ZWJfd3JpdGUoTlZfV0lGSV9XUFNfUElOLCB3cHNfcGluKTsKKwl9IGVsc2UgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJbJXNdWyVzXWludmFsaWQgd3BzX21vZGVbJXNdLiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHdwc19tb2RlKTsgLypsaW50ICFlMjYqLworCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwl3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9XUFNfU0VUOworCisJLy9sYXN0LCB3cml0ZSB0aGUgd2lmaV9zZXRfZmxhZ3MKKwkodm9pZClzbnByaW50Zih3aWZpX3NldF9mbGFnc19zdHIsIHNpemVvZih3aWZpX3NldF9mbGFnc19zdHIpIC0gMSwgIiV1Iiwgd2lmaV9zZXRfZmxhZ3MpOworCSh2b2lkKXp0ZV93ZWJfd3JpdGUoV0lGSV9OVl9JVEVNX1dJRklfU0VUX0ZMQUdTLCB3aWZpX3NldF9mbGFnc19zdHIpOworCisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX05PUk1BTCwiWyVzXVslc10gc2VuZCB0byB3bGFuLXNlcnZlciB3cHMgY21kXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsKKworCisJaWYgKHdpZmlfd3BzX2luZGV4ICE9IE5VTEwpIHsKKwkJenRlX3dlYl93cml0ZShOVl9XSUZJX1dQU19JTkRFWCwgd2lmaV93cHNfaW5kZXgpOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslc11bJXNdIHdpZmlfd3BzX2luZGV4ID0gJXNcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHdpZmlfd3BzX2luZGV4KTsKKwl9CisKKwkvL3p0ZV9zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dJRkksTVNHX0NNRF9XSUZJX1dQUywwLE5VTEwpOworCWlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dFQl9DR0ksIE1PRFVMRV9JRF9XSUZJLCBNU0dfQ01EX1dJRklfV1BTLCAwLCBOVUxMLCAwKTsKKwlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslc11bJXNdd2lmaSBzZXQgY21kIGRvbmUhIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXyk7IC8qbGludCAhZTI2Ki8KKwl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgU1VDQ0VTUyk7Cit9CisKKworCit2b2lkIHp0ZV93bGFuX3dlYl9zc2lkMV9zZXQod2Vic190IHdwKQoreworCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywgVCgiVUZJeCBVc2VyIHNldCBXSUZJIFNTSUQgc2V0dGluZ3MhXG4iKSk7CisKKwl1bnNpZ25lZCBpbnQgd2lmaV9zZXRfZmxhZ3MgPSAwOworCWNoYXIgd2lmaV9zZXRfZmxhZ3Nfc3RyW05WX0lURU1fU1RSSU5HX0xFTl8yMF0gPSB7MH07CisJenRlX3RvcHN3X3N0YXRlX2VfdHlwZSByZXQgPSBaVEVfTlZJT19ET05FOworCisJKHZvaWQpenRlX3dlYl93cml0ZShXSUZJX05WX0lURU1fV0lGSV9TRVRfRkxBR1MsICIiKTsKKworCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywienRlX3dsYW5fd2ViX3NzaWQxX3NldDorKysrKysrKysrKysrKysrKz09PT09PVxuIik7CisJaWYgKEZBTFNFID09IHp0ZV93bGFuX3NzaWQxX2Jhc2ljX3NldCh3cCwgJndpZmlfc2V0X2ZsYWdzKSkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJ6dGVfd2xhbl93ZWJfc3NpZDFfc2V0OiB6dGVfd2xhbl9zc2lkMV9iYXNpY19zZXQgZmFpbHVyZSAuXG4iKTsvKmxpbnQgIWUyNiovCisJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgtMSA9PSB6dGVfbGFuX3NzaWQxX3NlY3VyaXR5X3NldCh3cCwgJndpZmlfc2V0X2ZsYWdzKSkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJjYWxsIHp0ZV9sYW5fc3NpZDFfc2VjdXJpdHlfc2V0IGZhaWx1cmUgLlxuIik7LypsaW50ICFlMjYqLworCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwkodm9pZClzbnByaW50Zih3aWZpX3NldF9mbGFnc19zdHIsIHNpemVvZih3aWZpX3NldF9mbGFnc19zdHIpIC0gMSwgIiV1Iiwgd2lmaV9zZXRfZmxhZ3MpOworCSh2b2lkKXp0ZV93ZWJfd3JpdGUoV0lGSV9OVl9JVEVNX1dJRklfU0VUX0ZMQUdTLCB3aWZpX3NldF9mbGFnc19zdHIpOworCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywienRlX3dsYW5fd2ViX3NzaWQxX3NldDogd2lmaV9zZXRfZmxhZ3MgWyV1XSB0byBbJXNdLlxuIiwgd2lmaV9zZXRfZmxhZ3MsIHdpZmlfc2V0X2ZsYWdzX3N0cik7IC8qbGludCAhZTI2Ki8KKworCWlmICgwICE9IHdpZmlfc2V0X2ZsYWdzKSB7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19OT1JNQUwsInNlbmQgd2lmaSBwYXJhIHRvIHdsYW4tc2VydmVyQHNzaWQxXG4iKTsvKmxpbnQgIWUyNiovCisJCS8venRlX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0lGSSxNU0dfQ01EX1dJRklfU1NJRCxOVUxMLE5VTEwpOworCQlpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9XRUJfQ0dJLCBNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9XSUZJX0NGR19BUCwgMCwgTlVMTCwgMCk7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzXVslc113aWZpIHNldCBjbWQgZG9uZSEiLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsgLypsaW50ICFlMjYqLworCX0KKwl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgU1VDQ0VTUyk7CisKK30KKworCisKK3ZvaWQgenRlX3dsYW5fc3NpZDJfc2V0KHdlYnNfdCB3cCkKK3sKKworCXVuc2lnbmVkIGludCB3aWZpX3NldF9mbGFncyA9IDA7CisJY2hhciB3aWZpX3NldF9mbGFnc19zdHJbTlZfSVRFTV9TVFJJTkdfTEVOXzIwXSA9IHswfTsKKwl6dGVfdG9wc3dfc3RhdGVfZV90eXBlIHJldCA9IFpURV9OVklPX0RPTkU7CisKKwkodm9pZCl6dGVfd2ViX3dyaXRlKFdJRklfTlZfSVRFTV9XSUZJX1NFVF9GTEFHUywgIiIpOworCisJaWYgKEZBTFNFID09IHp0ZV93bGFuX3NzaWQyX2Jhc2ljX3NldCh3cCwgJndpZmlfc2V0X2ZsYWdzKSkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJ6dGVfd2xhbl9zc2lkMl9zZXQ6IHp0ZV93bGFuX3NzaWQyX2Jhc2ljX3NldCBmYWlsdXJlIC4iKTsvKmxpbnQgIWUyNiovCisJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgtMSA9PSB6dGVfbGFuX3NzaWQyX3NlY3VyaXR5X3NldCh3cCwgJndpZmlfc2V0X2ZsYWdzKSkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJjYWxsIHp0ZV9sYW5fc3NpZDJfc2VjdXJpdHlfc2V0IGZhaWwuXG4gLiIpOy8qbGludCAhZTI2Ki8KKwkJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIEZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJKHZvaWQpc25wcmludGYod2lmaV9zZXRfZmxhZ3Nfc3RyLCBzaXplb2Yod2lmaV9zZXRfZmxhZ3Nfc3RyKSAtIDEsICIldSIsIHdpZmlfc2V0X2ZsYWdzKTsKKwkodm9pZCl6dGVfd2ViX3dyaXRlKFdJRklfTlZfSVRFTV9XSUZJX1NFVF9GTEFHUywgd2lmaV9zZXRfZmxhZ3Nfc3RyKTsKKwlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInp0ZV93bGFuX3NzaWQyX3NldDogd2lmaV9zZXRfZmxhZ3MgWyV1XSB0byBbJXNdLiIsIHdpZmlfc2V0X2ZsYWdzLCB3aWZpX3NldF9mbGFnc19zdHIpOworCisJaWYgKDAgIT0gd2lmaV9zZXRfZmxhZ3MpIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX05PUk1BTCwic2VuZCB3aWZpIHBhcmEgdG8gd2xhbi1zZXJ2ZXJAc3NpZDIiKTsvKmxpbnQgIWUyNiovCisJCS8venRlX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0lGSSxNU0dfQ01EX1dJRklfU1NJRF9NLE5VTEwsTlVMTCk7CisJCWlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dFQl9DR0ksIE1PRFVMRV9JRF9XSUZJLCBNU0dfQ01EX1dJRklfQ0ZHX0FQMiwgMCwgTlVMTCwgMCk7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywid2lmaSBzZXQgY21kIGRvbmUhIik7ICAgICAgICAvKmxpbnQgIWUyNiovCisJfQorCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBTVUNDRVNTKTsKKworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRnVuY3Rpb246ICAgICAgICB6dGVfd2xhbl9zbGVlcF9zZXQKKyogRGVzY3JpcHRpb246ICAgICB0byBzZXQgdGhlIHdpZmkgc2xlZXAgbW9kZQorKiBJbnB1dDogICAgICAgICAgIGh0dHAgaW5mbworKiBPdXRwdXQ6CisqIFJldHVybjogICAgICAgICAgIDA6b2s7LTE6ZmFpbAorKiBPdGhlcnM6CisqIE1vZGlmeSBEYXRlICAgVmVyc2lvbiAgICAgQXV0aG9yICAgICAgICAgIE1vZGlmaWNhdGlvbgorKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiAyMDEyLzA3LzExICAgIFYxLjAgICAgICAgIHpob3V0aSAgICAgICBmaXJzdCB2ZXJzaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6dGVfd2xhbl9zbGVlcF9zZXQod2Vic190IHdwKQoreworCWNoYXJfdCAqc2xlZXBNb2RlID0gTlVMTDsKKwkvL2NoYXJfdCAqd2lmaV9tYWNfYmxhY2tfbGlzdCA9IE5VTEw7CisJLy9jaGFyX3QgKndpZmlfaG9zdG5hbWVfYmxhY2tfbGlzdCA9IE5VTEw7CisJdW5zaWduZWQgaW50IHdpZmlfc2V0X2ZsYWdzID0gMDsKKwljaGFyIHdpZmlfc2V0X2ZsYWdzX3N0cltOVl9JVEVNX1NUUklOR19MRU5fMjBdID0gezB9OworCisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdWyVzXXp0ZV93bGFuX3NsZWVwX3NldC4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsgLypsaW50ICFlMjYqLworCS8vcHJpbnRmKCJ6aG91dGkgenRlX3dsYW5fc2xlZXBfc2V0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlzbGVlcE1vZGUgPSB3ZWJzR2V0VmFyKHdwLCBUKCJzeXNJZGxlVGltZVRvU2xlZXAiKSwgVCgiIikpOworCisJaWYgKE5VTEwgPT0gc2xlZXBNb2RlIHx8ICdcMCcgPT0gKnNsZWVwTW9kZSkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJzbGVlcE1vZGU6aW52YWxpZCBpbnB1dCBwYXJhLiIpOy8qbGludCAhZTI2Ki8KKwkJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIEZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCS8vcHJpbnRmKCJ6aG91dGkgenRlX3dsYW5fc2xlZXBfc2V0IHNsZWVwTW9kZSBpcyAlc1xuIiwgc2xlZXBNb2RlKTsKKwkodm9pZCl6dGVfd2ViX3dyaXRlKCJTbGVlcF9pbnRlcnZhbCIsIHNsZWVwTW9kZSk7CisJLy8gKHZvaWQpenRlX3dlYl93cml0ZSgid2lmaV9tYWNfYmxhY2tfbGlzdCIsIHdpZmlfbWFjX2JsYWNrX2xpc3QpOworCS8vICh2b2lkKXp0ZV93ZWJfd3JpdGUoIndpZmlfaG9zdG5hbWVfYmxhY2tfbGlzdCIsIHdpZmlfaG9zdG5hbWVfYmxhY2tfbGlzdCk7CisKKworCXdpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX1NFVF9BUF9TTEVFUFRJTUVSOworCisJKHZvaWQpc25wcmludGYod2lmaV9zZXRfZmxhZ3Nfc3RyLCBzaXplb2Yod2lmaV9zZXRfZmxhZ3Nfc3RyKSAtIDEsICIldSIsIHdpZmlfc2V0X2ZsYWdzKTsKKwkodm9pZCl6dGVfd2ViX3dyaXRlKFdJRklfTlZfSVRFTV9XSUZJX1NFVF9GTEFHUywgd2lmaV9zZXRfZmxhZ3Nfc3RyKTsKKworCXNsb2coTUlTQ19QUklOVCwgU0xPR19OT1JNQUwsInNlbmQgd2lmaSBwYXJhIHRvIHdsYW4tbWFjX2ZpbHRlcl9zZXRAYmFzaWNfc2V0Iik7LypsaW50ICFlMjYqLworCS8venRlX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9XSUZJX1NMRUVQLCAwLCBOVUxMKTsKKwlpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9XRUJfQ0dJLCBNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9XSUZJX1NMRUVQLCAwLCBOVUxMLCAwKTsKKwkvL3ByaW50Zigid2lmaSBzZXQgY21kIGRvbmUhIik7LypsaW50ICFlMjYqLworCisJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIFNVQ0NFU1MpOworfQorCitzdGF0aWMgaW50IGNoZWNrX3dlYl9pbnB1dF93aWZpKGNoYXIgKnN0ciwgaW50IGxlbikKK3sKKwlpbnQgaSA9IDA7CisJaWYgKHN0ciA9PSBOVUxMIHx8IGxlbiA8PSAwIHx8IHN0cmxlbihzdHIpIDwgbGVuKSB7CisJCXJldHVybiAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKHN0cmNocigiYCQmKlxcW107OlwnXCI8PiwiLHN0cltpXSkgfHwgIWlzcHJpbnQoc3RyW2ldKSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZ1bmN0aW9uOiAgICAgICAgenRlX3dsYW5fY292ZXJhZ2Vfc2V0CisqIERlc2NyaXB0aW9uOiAgICAgdG8gc2V0IHRoZSB3aWZpIGNvdmVyYWdlCisqIElucHV0OiAgICAgICAgICAgaHR0cCBpbmZvCisqIE91dHB1dDoKKyogUmV0dXJuOgorKiBPdGhlcnM6CisqIE1vZGlmeSBEYXRlICAgVmVyc2lvbiAgICAgQXV0aG9yICAgICAgICAgIE1vZGlmaWNhdGlvbgorKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiAyMDE0LzA1LzI3ICAgIFYxLjAgICAgICAgIHpob3V0aSAgICAgICBmaXJzdCB2ZXJzaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6dGVfd2xhbl9jb3ZlcmFnZV9zZXQod2Vic190IHdwKQoreworCWNoYXJfdCAqd2lmaV9jb3ZlcmFnZSA9IE5VTEw7CisJY2hhcl90IG9sZF93aWZpX2NvdmVyYWdlW1dJRklfQ09WRVJBR0VfTEVOICsgMV0gPSB7MH07CisJdW5zaWduZWQgaW50IHdpZmlfc2V0X2ZsYWdzID0gMDsKKwljaGFyIHdpZmlfc2V0X2ZsYWdzX3N0cltOVl9JVEVNX1NUUklOR19MRU5fMjBdID0gezB9OworCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywienRlX3dsYW5fY292ZXJhZ2Vfc2V0LiIpOworCS8vcHJpbnRmKCJ6aG91dGkgenRlX3dsYW5fY292ZXJhZ2Vfc2V0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwl3aWZpX2NvdmVyYWdlID0gd2Vic0dldFZhcih3cCwgVChOVl9XSUZJX0NPVkVSQUdFKSwgVCgiIikpOworCisJaWYgKE5VTEwgPT0gd2lmaV9jb3ZlcmFnZSB8fCAnXDAnID09ICp3aWZpX2NvdmVyYWdlKSB7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsIlslc11bJXNdY292ZXJhZ2U6IGludmFsaWQgaW5wdXQgcGFyYS4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsKKwkJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIEZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCSh2b2lkKXp0ZV93ZWJfcmVhZChOVl9XSUZJX0NPVkVSQUdFLCBvbGRfd2lmaV9jb3ZlcmFnZSk7CisJaWYgKHN0cmNtcCh3aWZpX2NvdmVyYWdlLCBvbGRfd2lmaV9jb3ZlcmFnZSkpIHsgLy9rdyAzCisJCSh2b2lkKXp0ZV93ZWJfd3JpdGUoTlZfV0lGSV9DT1ZFUkFHRSwgd2lmaV9jb3ZlcmFnZSk7CisKKwkJd2lmaV9zZXRfZmxhZ3MgfD0gWlRFX1dMQU5fUE9XRVJfU0VUOworCisJCSh2b2lkKXNucHJpbnRmKHdpZmlfc2V0X2ZsYWdzX3N0ciwgc2l6ZW9mKHdpZmlfc2V0X2ZsYWdzX3N0cikgLSAxLCAiJXUiLCB3aWZpX3NldF9mbGFncyk7CisJCSh2b2lkKXp0ZV93ZWJfd3JpdGUoV0lGSV9OVl9JVEVNX1dJRklfU0VUX0ZMQUdTLCB3aWZpX3NldF9mbGFnc19zdHIpOworCisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19OT1JNQUwsInNlbmQgd2lmaSBwYXJhIHRvIHdsYW4tbWFjX2ZpbHRlcl9zZXRAYmFzaWNfc2V0Iik7LypsaW50ICFlMjYqLworCQkvL3p0ZV9zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dJRkksTVNHX0NNRF9XSUZJX0NPVkVSQUdFLDAsTlVMTCk7CisJCWlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dFQl9DR0ksIE1PRFVMRV9JRF9XSUZJLCBNU0dfQ01EX1dJRklfQ09WRVJBR0UsIDAsIE5VTEwsIDApOworCQkvL3ByaW50Zigid2lmaSBzZXQgY21kIGRvbmUhIik7LypsaW50ICFlMjYqLworCX0KKwl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgU1VDQ0VTUyk7Cit9CisKK3N0YXRpYyBpbnQgenRlX3dsYW5fc3NpZDFfYmFzaWNfc2V0KHdlYnNfdCB3cCwgdW5zaWduZWQgaW50ICp3aWZpX3NldF9mbGFncykKK3sKKworCWNoYXJfdCAgKnNzaWQgPSBOVUxMOworCWNoYXJfdCAgKmJyb2FkY2FzdHNzaWQgPSBOVUxMIDsKKwljaGFyX3QgICpOb0ZvcndhcmRpbmcgPSBOVUxMIDsKKwljaGFyX3QgKk1BWF9BY2Nlc3NfbnVtID0gTlVMTDsKKwl6dGVfdG9wc3dfc3RhdGVfZV90eXBlIHN0YXR1cyA9IFpURV9OVklPX01BWDsKKwljaGFyIG52X3RtcFtOVklPX1dJRklfTUFYX0xFTl0gPSB7MH07CisJY2hhcl90ICAqd2lyZWxlc3Ntb2RlID0gTlVMTDsKKwljaGFyX3QgICpjb3VudHJ5Y29kZSA9IE5VTEw7CisJY2hhcl90ICAqY2hhbm5lbCA9IE5VTEw7CisJY2hhcl90ICp3aWZpXzExbl9jYXAgPSBOVUxMOworCWNoYXJfdCAgKndpZmlfYmFuZCA9IE5VTEw7CisJY2hhcl90ICAqc2hvd19xcmNvZGVfZmxhZyA9IE5VTEw7Ly9tYWluIHNzaWQgc2hvdyBxcmNvZGUgZmxhZworCisJY2hhciB3aWZpX3N0YV9jb25uZWN0aW9uWzhdID0gezB9OworCisJc2NfY2ZnX2dldCgid2lmaV9zdGFfY29ubmVjdGlvbiIsIHdpZmlfc3RhX2Nvbm5lY3Rpb24sIHNpemVvZih3aWZpX3N0YV9jb25uZWN0aW9uKSk7CisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdWyVzXXdpZmlfc3RhX2Nvbm5lY3Rpb249JXNcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHdpZmlfc3RhX2Nvbm5lY3Rpb24pOworCisJLy9zc2lkCisJbWVtc2V0KG52X3RtcCwgMCwgc2l6ZW9mKG52X3RtcCkpOworCXNzaWQgPSB3ZWJzR2V0VmFyKHdwLCBUKCJzc2lkIiksIE5VTEwpOworI2lmZGVmIFdFQlNfU0VDVVJJVFkKKwkJaWYoc3NpZCAmJiAhY2hlY2tfd2ViX2lucHV0X3dpZmkoc3NpZCxzdHJsZW4oc3NpZCkpKQorCQl7CisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJbZ29haGVhZF1zc2lkMT0lc1xuIixzc2lkKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorI2VuZGlmCisJaWYgKHNzaWQgIT0gTlVMTCAgJiYgISh3cC0+ZmxhZ3MgJiBXRUJTX1hNTF9DTElFTlRfUkVRVUVTVCkpIHsKKwkJKHZvaWQpenRlX3dlYl9yZWFkKCJTU0lEMSIsIG52X3RtcCk7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzOiVzXW9sZF9zc2lkPVslc10sIHNzaWQ9WyVzXSIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIG52X3RtcCwgc3NpZCk7IC8qbGludCAhZTI2Ki8KKwkJLy9hZGQgYnkgbGl1eWluZ25hbiBmb3Igc2VydmVyIHNhZmUgZm9yIHhzcyBhdHRhY2sgc3RhcnQKKyNpZiAwIC8va3cgMworCQlpZiAoREFUQV9OT19TQUZFID09IHp0ZV9TYWZlX25vU3BlY2lhbENoYXJGb3JTU0lEKHNzaWQpKSB7CisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslczolc11HZXQgRGF0YSBpcyBubyBTYWZlOnNzaWQ6JXNcbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIHNzaWQpOyAvKmxpbnQgIWUyNiovCisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKyNlbmRpZgorCQkvL2FkZCBieSBsaXV5aW5nbmFuIGZvciBzZXJ2ZXIgc2FmZSBmb3IgeHNzIGF0dGFjayBlbmQKKwkJaWYgKDAgIT0gc3RyY21wKHNzaWQsIG52X3RtcCkpIHsKKwkJCSp3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9TU0lEX1NFVDsKKwkJCXN0YXR1cyA9IHp0ZV93ZWJfd3JpdGUoIlNTSUQxIiwgc3NpZCk7CisJCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7CisJCQlpZiAoWlRFX05WSU9fRE9ORSAhPSBzdGF0dXMpIHsKKwkJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslczolc116dGVfd2xhbl9zc2lkMV9iYXNpY19zZXQ6IHdyaXRlIG52IFtTU0lEMV0gZmFpbC4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsgLypsaW50ICFlMjYqLworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworCS8vYnJvYWRjYXN0U3NpZEVuYWJsZWQKKwltZW1zZXQobnZfdG1wLCAwLCBzaXplb2YobnZfdG1wKSk7CisJYnJvYWRjYXN0c3NpZCA9IHdlYnNHZXRWYXIod3AsIFQoImJyb2FkY2FzdFNzaWRFbmFibGVkIiksIE5VTEwpOworCisJaWYgKGJyb2FkY2FzdHNzaWQgIT0gTlVMTCAgICYmICEod3AtPmZsYWdzICYgV0VCU19YTUxfQ0xJRU5UX1JFUVVFU1QpKSB7CisJCSh2b2lkKXp0ZV93ZWJfcmVhZCgiSGlkZVNTSUQiLCBudl90bXApOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIm9sZF9IaWRlU1NJRD1bJXNdLCBIaWRlU1NJRD1bJXNdIiwgbnZfdG1wLCBicm9hZGNhc3Rzc2lkKTsgIC8qbGludCAhZTI2Ki8KKwkJaWYgKDAgIT0gc3RyY21wKGJyb2FkY2FzdHNzaWQsIG52X3RtcCkpIHsKKwkJCSp3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9CUk9BRENBU1RfU0VUOworCQkJc3RhdHVzID0genRlX3dlYl93cml0ZSgiSGlkZVNTSUQiLCBicm9hZGNhc3Rzc2lkKTsKKwkJCWlmIChaVEVfTlZJT19ET05FICE9IHN0YXR1cykgeworCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywienRlX3dsYW5fc3NpZDFfYmFzaWNfc2V0OiB3cml0ZSBudiBbSGlkZVNTSURdIGZhaWwuIik7LypsaW50ICFlMjYqLworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworI2lmIDAKKwkvL3NldCAgTm9Gb3J3YXJkaW5nKGFwIGlzb2xhdGVkKQorCW1lbXNldChudl90bXAsIDAsIHNpemVvZihudl90bXApKTsKKwlOb0ZvcndhcmRpbmcgPSB3ZWJzR2V0VmFyKHdwLCBUKCJOb0ZvcndhcmRpbmciKSwgTlVMTCk7CisJaWYgKE5vRm9yd2FyZGluZyAhPSBOVUxMICAgJiYgISh3cC0+ZmxhZ3MgJiBXRUJTX1hNTF9DTElFTlRfUkVRVUVTVCkpIHsKKwkJKHZvaWQpenRlX3dlYl9yZWFkKCJOb0ZvcndhcmRpbmciLCBudl90bXApOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIm9sZF9Ob0ZvcndhcmRpbmc9WyVzXSwgTm9Gb3J3YXJkaW5nPVslc10iLCBudl90bXAsIE5vRm9yd2FyZGluZyk7LypsaW50ICFlMjYqLworCQlpZiAoMCAhPSBzdHJjbXAoTm9Gb3J3YXJkaW5nLCBudl90bXApKSB7CisJCQkqd2lmaV9zZXRfZmxhZ3MgfD0gWlRFX1dMQU5fQVBfSVNPTEFUSU9OX1NFVDsKKwkJCXN0YXR1cyA9IHp0ZV93ZWJfd3JpdGUoIk5vRm9yd2FyZGluZyIsIE5vRm9yd2FyZGluZyk7CisJCQlpZiAoWlRFX05WSU9fRE9ORSAhPSBzdGF0dXMpIHsKKwkJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInp0ZV93bGFuX3NzaWQxX2Jhc2ljX3NldDogd3JpdGUgbnYgW05vRm9yd2FyZGluZ10gZmFpbC4iKTsvKmxpbnQgIWUyNiovCisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQl9CisJfQorI2VuZGlmCisJLy9zZXQgIE1BWF9BY2Nlc3NfbnVtCisJbWVtc2V0KG52X3RtcCwgMCwgc2l6ZW9mKG52X3RtcCkpOworCU1BWF9BY2Nlc3NfbnVtID0gd2Vic0dldFZhcih3cCwgVCgiTUFYX0FjY2Vzc19udW0iKSwgTlVMTCk7CisJaWYgKE1BWF9BY2Nlc3NfbnVtICE9IE5VTEwgICAmJiAhKHdwLT5mbGFncyAmIFdFQlNfWE1MX0NMSUVOVF9SRVFVRVNUKSkgeworCQkodm9pZCl6dGVfd2ViX3JlYWQoIk1BWF9BY2Nlc3NfbnVtIiwgbnZfdG1wKTsKKworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslc11bJXNdb2xkX01BWF9BY2Nlc3NfbnVtPVslc10sIE1BWF9BY2Nlc3NfbnVtPVslc11cbiIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIG52X3RtcCwgTUFYX0FjY2Vzc19udW0pOworCisJCWlmICgwICE9IHN0cmNtcChNQVhfQWNjZXNzX251bSwgbnZfdG1wKSkgeworCQkJKndpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX01BWF9BQ0NFU1NfTlVNX1NFVDsKKwkJCXp0ZV93ZWJfd3JpdGUoIk1BWF9BY2Nlc3NfbnVtIiwgTUFYX0FjY2Vzc19udW0pOyAvL2t3IDMJCQorCQkJenRlX3dlYl93cml0ZSgiTUFYX0FjY2Vzc19udW1fdXNlcl9zZXQiLCAiMSIpOworCQl9CisJfQorCS8vc2V0ICBzaG93X3FyY29kZV9mbGFnCisJbWVtc2V0KG52X3RtcCwgMCwgc2l6ZW9mKG52X3RtcCkpOworCXNob3dfcXJjb2RlX2ZsYWcgPSB3ZWJzR2V0VmFyKHdwLCBUKCJzaG93X3FyY29kZV9mbGFnIiksIE5VTEwpOworCWlmIChzaG93X3FyY29kZV9mbGFnICE9IE5VTEwpIHsKKwkJKHZvaWQpenRlX3dlYl9yZWFkKCJzaG93X3FyY29kZV9mbGFnIiwgbnZfdG1wKTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdWyVzXXNzaWQxOm9sZF9zaG93X3FyY29kZV9mbGFnPVslc10sIHNob3dfcXJjb2RlX2ZsYWc9WyVzXVxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgbnZfdG1wLCBzaG93X3FyY29kZV9mbGFnKTsKKworCQlpZiAoMCAhPSBzdHJjbXAoc2hvd19xcmNvZGVfZmxhZywgbnZfdG1wKSkgeworCQkJc3RhdHVzID0genRlX3dlYl93cml0ZSgic2hvd19xcmNvZGVfZmxhZyIsIHNob3dfcXJjb2RlX2ZsYWcpOworCQkJaWYgKFpURV9OVklPX0RPTkUgIT0gc3RhdHVzKSB7CisJCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJ6dGVfd2xhbl9zc2lkMV9iYXNpY19zZXQ6IHdyaXRlIG52IFtzaG93X3FyY29kZV9mbGFnXSBmYWlsLiIpOy8qbGludCAhZTI2Ki8KKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKwl9CisKKworCisjaWYgMAorCS8vd2lmaU1vZGUKKwltZW1zZXQobnZfdG1wLCAwLCBzaXplb2YobnZfdG1wKSk7CisJd2lyZWxlc3Ntb2RlID0gd2Vic0dldFZhcih3cCwgVCgid2lmaU1vZGUiKSwgTlVMTCk7CisJaWYgKHdpcmVsZXNzbW9kZSAhPSBOVUxMICYmICEod3AtPmZsYWdzICYgV0VCU19YTUxfQ0xJRU5UX1JFUVVFU1QpKSB7CisJCXByaW50Zigid2lyZWxlc3Ntb2RlOiVzIiwgd2lyZWxlc3Ntb2RlKTsgICAgLypsaW50ICFlMjYqLworCQkodm9pZCl6dGVfd2ViX3JlYWQoIldpcmVsZXNzTW9kZSIsIG52X3RtcCk7CisJCXByaW50ZigiWyVzXVslc11vbGRfV2lyZWxlc3NNb2RlPVslc10sIHdpcmVsZXNzbW9kZT1bJXNdIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgbnZfdG1wLCB3aXJlbGVzc21vZGUpOyAvKmxpbnQgIWUyNiovCisJCWlmICgwICE9IHN0cmNtcCh3aXJlbGVzc21vZGUsIG52X3RtcCkpIHsKKwkJCSp3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9XSVJFTEVTU19NT0RFX1NFVDsKKwkJCXN0YXR1cyA9IHp0ZV93ZWJfd3JpdGUoIldpcmVsZXNzTW9kZSIsIHdpcmVsZXNzbW9kZSk7CisJCQlpZiAoWlRFX05WSU9fRE9ORSAhPSBzdGF0dXMpIHsKKwkJCQlwcmludGYoInp0ZV93bGFuX3NzaWQxX2Jhc2ljX3NldDogd3JpdGUgbnYgW1dpcmVsZXNzTW9kZV0gZmFpbC4iKTsvKmxpbnQgIWUyNiovCisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQl9CisJfQorCisJLyogY291bnRyeSBjb2RlKi8KKwltZW1zZXQobnZfdG1wLCAwLCBzaXplb2YobnZfdG1wKSk7CisJY291bnRyeWNvZGUgPSB3ZWJzR2V0VmFyKHdwLCBUKCJjb3VudHJ5Q29kZSIpLCBOVUxMKTsKKwlpZiAoY291bnRyeWNvZGUgIT0gTlVMTCAmJiAhKHdwLT5mbGFncyAmIFdFQlNfWE1MX0NMSUVOVF9SRVFVRVNUKSkgeworCQkodm9pZCl6dGVfd2ViX3JlYWQoIkNvdW50cnlDb2RlIiwgbnZfdG1wKTsKKwkJcHJpbnRmKCJbJXNdWyVzXW9sZF9jb3VudHJ5Y29kZT0lcywgY291bnRyeWNvZGUgPSAlcyIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIG52X3RtcCwgY291bnRyeWNvZGUpOyAvKmxpbnQgIWUyNiovCisJCWlmICgwICE9IHN0cmNtcChjb3VudHJ5Y29kZSwgbnZfdG1wKSkgeworCQkJKndpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX0NPVU5UUllfU0VUOworCQkJc3RhdHVzID0genRlX3dlYl93cml0ZSgiQ291bnRyeUNvZGUiLCBjb3VudHJ5Y29kZSk7CisJCQlpZiAoWlRFX05WSU9fRE9ORSAhPSBzdGF0dXMpIHsKKwkJCQlwcmludGYoIlslc11bJXNdenRlX3dsYW5fc3NpZDFfYmFzaWNfc2V0OiB3cml0ZSBudiBbQ291bnRyeUNvZGVdIGZhaWwuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXyk7IC8qbGludCAhZTI2Ki8KKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKwl9CisKKwkvL3NlbGVjdGVkQ2hhbm5lbAorCW1lbXNldChudl90bXAsIDAsIHNpemVvZihudl90bXApKTsKKwljaGFubmVsID0gd2Vic0dldFZhcih3cCwgVCgic2VsZWN0ZWRDaGFubmVsIiksIE5VTEwpOworCWlmIChjaGFubmVsICE9IE5VTEwgJiYgISh3cC0+ZmxhZ3MgJiBXRUJTX1hNTF9DTElFTlRfUkVRVUVTVCkpIHsKKwkJKHZvaWQpenRlX3dlYl9yZWFkKCJDaGFubmVsIiwgbnZfdG1wKTsKKwkJcHJpbnRmKCJbJXNdWyVzXW9sZF9jaGFubmVsPSVzLCBjaGFubmVsID0gJXMiLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBudl90bXAsIGNoYW5uZWwpOyAvKmxpbnQgIWUyNiovCisJCWlmICgwICE9IHN0cmNtcChjaGFubmVsLCBudl90bXApKSB7CisJCQkqd2lmaV9zZXRfZmxhZ3MgfD0gWlRFX1dMQU5fQ0hBTk5FTF9TRVQ7CisJCQlzdGF0dXMgPSB6dGVfd2ViX3dyaXRlKCJDaGFubmVsIiwgY2hhbm5lbCk7CisJCQlpZiAoWlRFX05WSU9fRE9ORSAhPSBzdGF0dXMpIHsKKwkJCQlwcmludGYoInp0ZV93bGFuX3NzaWQxX2Jhc2ljX3NldDogd3JpdGUgbnYgW0NoYW5uZWxdIGZhaWwuIik7LypsaW50ICFlMjYqLworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworCS8vYmFuZCBzZXR0aW5nCisJbWVtc2V0KG52X3RtcCwgMCwgc2l6ZW9mKG52X3RtcCkpOworCXdpZmlfYmFuZCA9IHdlYnNHZXRWYXIod3AsIFQoIndpZmlfYmFuZCIpLCBOVUxMKTsKKwlpZiAod2lmaV9iYW5kICE9IE5VTEwgJiYgISh3cC0+ZmxhZ3MgJiBXRUJTX1hNTF9DTElFTlRfUkVRVUVTVCkpIHsKKwkJKHZvaWQpenRlX3dlYl9yZWFkKCJ3aWZpX2JhbmQiLCBudl90bXApOworCQlwcmludGYoIlslc11bJXNdb2xkX3dpZmlfYmFuZD0lcywgd2lmaV9iYW5kID0gJXMiLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBudl90bXAsIHdpZmlfYmFuZCk7IC8qbGludCAhZTI2Ki8KKwkJaWYgKDAgIT0gc3RyY21wKHdpZmlfYmFuZCwgbnZfdG1wKSkgeworCQkJKndpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX1dJRklfQkFORF9TRVQ7CisJCQlzdGF0dXMgPSB6dGVfd2ViX3dyaXRlKCJ3aWZpX2JhbmQiLCBjaGFubmVsKTsKKwkJCWlmIChaVEVfTlZJT19ET05FICE9IHN0YXR1cykgeworCQkJCXByaW50ZigienRlX3dsYW5fc3NpZDFfYmFzaWNfc2V0OiB3cml0ZSBudiBbd2lmaV9iYW5kXSBmYWlsLiIpOy8qbGludCAhZTI2Ki8KKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKwl9CisKKwkvL3NldCAgd2lmaV8xMW5fY2FwCisJbWVtc2V0KG52X3RtcCwgMCwgc2l6ZW9mKG52X3RtcCkpOworCXdpZmlfMTFuX2NhcCA9IHdlYnNHZXRWYXIod3AsIFQoIndpZmlfMTFuX2NhcCIpLCBOVUxMKTsKKwlpZiAod2lmaV8xMW5fY2FwICE9IE5VTEwgJiYgISh3cC0+ZmxhZ3MgJiBXRUJTX1hNTF9DTElFTlRfUkVRVUVTVCkpIHsKKwkJKHZvaWQpenRlX3dlYl9yZWFkKCJ3aWZpXzExbl9jYXAiLCBudl90bXApOworCQlwcmludGYoIlslc11bJXNdb2xkX3dpZmlfMTFuX2NhcD0lcywgd2lmaV8xMW5fY2FwPSVzIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgbnZfdG1wLCB3aWZpXzExbl9jYXApOyAvKmxpbnQgIWUyNiovCisJCWlmICgwICE9IHN0cmNtcCh3aWZpXzExbl9jYXAsIG52X3RtcCkpIHsKKwkJCSp3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9XSVJFTEVTU19NT0RFX1NFVDsKKwkJCXN0YXR1cyA9IHp0ZV93ZWJfd3JpdGUoIndpZmlfMTFuX2NhcCIsIHdpZmlfMTFuX2NhcCk7CisJCQlpZiAoWlRFX05WSU9fRE9ORSAhPSBzdGF0dXMpIHsKKwkJCQlwcmludGYoInp0ZV93bGFuX3NzaWQxX2Jhc2ljX3NldDogd3JpdGUgbnYgW3dpZmlfMTFuX2NhcF0gZmFpbC4iKTsvKmxpbnQgIWUyNiovCisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQl9CisJfQorI2VuZGlmCisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJ6dGVfd2xhbl9zc2lkMV9iYXNpY19zZXQ6ICB3aWZpIGJhc2ljIHNldHVwIHN1Y2Nlc3MuIik7LypsaW50ICFlMjYqLworCXJldHVybiBUUlVFOworCit9CisKK3N0YXRpYyBpbnQgenRlX3dsYW5fc3NpZDJfYmFzaWNfc2V0KHdlYnNfdCB3cCwgdW5zaWduZWQgaW50ICp3aWZpX3NldF9mbGFncykKK3sKKwljaGFyX3QgICpzc2lkID0gTlVMTDsKKwljaGFyX3QgICpicm9hZGNhc3Rzc2lkID0gTlVMTCA7CisJY2hhcl90ICAqTm9Gb3J3YXJkaW5nID0gTlVMTCA7CisJY2hhcl90ICpNQVhfQWNjZXNzX251bSA9IE5VTEw7CisJY2hhcl90ICAqc2hvd19xcmNvZGVfZmxhZyA9IE5VTEw7Ly9ndWVzdCBzc2lkIHNob3cgcXJjb2RlIGZsYWcKKwl6dGVfdG9wc3dfc3RhdGVfZV90eXBlIHN0YXR1cyA9IFpURV9OVklPX01BWDsKKwljaGFyIG52X3RtcFtOVklPX1dJRklfTUFYX0xFTl0gPSB7MH07CisKKwlpZiAoKE5VTEwgPT0gd3ApIHx8IChOVUxMID09IHdpZmlfc2V0X2ZsYWdzKSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy9zc2lkCisJbWVtc2V0KG52X3RtcCwgMCwgc2l6ZW9mKG52X3RtcCkpOworCXNzaWQgPSB3ZWJzR2V0VmFyKHdwLCBUKCJtX1NTSUQiKSwgTlVMTCk7CisjaWZkZWYgV0VCU19TRUNVUklUWQorCQlpZihzc2lkICYmICFjaGVja193ZWJfaW5wdXRfd2lmaShzc2lkLHN0cmxlbihzc2lkKSkpCisJCXsKKwkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsIltnb2FoZWFkXXNzaWQyPSVzXG4iLHNzaWQpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisjZW5kaWYKKwlpZiAoc3NpZCAhPSBOVUxMKSB7CisJCS8vYWRkIGJ5IGxpdXlpbmduYW4gZm9yIHNlcnZlciBzYWZlIGZvciB4c3MgYXR0YWNrIHN0YXJ0CisJCWlmIChEQVRBX05PX1NBRkUgPT0genRlX1NhZmVfbm9TcGVjaWFsQ2hhcihzc2lkKSkgeworCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJHZXQgRGF0YSBpcyBubyBTYWZlOnNzaWQ6JXNcbiIsIHNzaWQpOyAvKmxpbnQgIWUyNiovCisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJLy9hZGQgYnkgbGl1eWluZ25hbiBmb3Igc2VydmVyIHNhZmUgZm9yIHhzcyBhdHRhY2sgZW5kCisJCSh2b2lkKXp0ZV93ZWJfcmVhZCgibV9TU0lEIiwgbnZfdG1wKTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJvbGRfbV9TU0lEPVslc10sIG1fU1NJRD1bJXNdIiwgbnZfdG1wLCBzc2lkKTsgICAgLypsaW50ICFlMjYqLworCQlpZiAoMCAhPSBzdHJjbXAoc3NpZCwgbnZfdG1wKSkgeworCQkJKndpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX1NFVF9BUF9NU1NJRDsKKwkJCXN0YXR1cyA9IHp0ZV93ZWJfd3JpdGUoIm1fU1NJRCIsIHNzaWQpOworCQkJd2xhbl9zZXRfY2hhbmdlX3NzaWRfa2V5X3N0YXR1cygpOy8vYWRkZWQgYnkgZHVqaWFqaWFvCisJCQlpZiAoWlRFX05WSU9fRE9ORSAhPSBzdGF0dXMpIHsKKwkJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJ6dGVfd2xhbl9zc2lkMl9iYXNpY19zZXQ6IHdyaXRlIG52IFttX1NTSURdIGZhaWwuIik7LypsaW50ICFlMjYqLworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworCS8vYnJvYWRjYXN0U3NpZEVuYWJsZWQKKwltZW1zZXQobnZfdG1wLCAwLCBzaXplb2YobnZfdG1wKSk7CisJYnJvYWRjYXN0c3NpZCA9IHdlYnNHZXRWYXIod3AsIFQoIm1fSGlkZVNTSUQiKSwgTlVMTCk7CisJaWYgKGJyb2FkY2FzdHNzaWQgIT0gTlVMTCkgeworCQkodm9pZCl6dGVfd2ViX3JlYWQoIm1fSGlkZVNTSUQiLCBudl90bXApOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIm9sZF9tX0hpZGVTU0lEPVslc10sIG1fSGlkZVNTSUQ9WyVzXSIsIG52X3RtcCwgYnJvYWRjYXN0c3NpZCk7ICAgLypsaW50ICFlMjYqLworCQlpZiAoMCAhPSBzdHJjbXAoYnJvYWRjYXN0c3NpZCwgbnZfdG1wKSkgeworCQkJKndpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX1NFVF9BUF9NU1NJRDsKKwkJCXN0YXR1cyA9IHp0ZV93ZWJfd3JpdGUoIm1fSGlkZVNTSUQiLCBicm9hZGNhc3Rzc2lkKTsKKwkJCWlmIChaVEVfTlZJT19ET05FICE9IHN0YXR1cykgeworCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsInp0ZV93bGFuX3NzaWQyX2Jhc2ljX3NldDogd3JpdGUgbnYgW21fSGlkZVNTSURdIGZhaWwuIik7LypsaW50ICFlMjYqLworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworCisJLy9zZXQgIE5vRm9yd2FyZGluZworCW1lbXNldChudl90bXAsIDAsIHNpemVvZihudl90bXApKTsKKwlOb0ZvcndhcmRpbmcgPSB3ZWJzR2V0VmFyKHdwLCBUKCJtX05vRm9yd2FyZGluZyIpLCBOVUxMKTsKKwlpZiAoTm9Gb3J3YXJkaW5nICE9IE5VTEwpIHsKKwkJKHZvaWQpenRlX3dlYl9yZWFkKCJtX05vRm9yd2FyZGluZyIsIG52X3RtcCk7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywib2xkX21fTm9Gb3J3YXJkaW5nPVslc10sIG1fTm9Gb3J3YXJkaW5nPVslc10iLCBudl90bXAsIE5vRm9yd2FyZGluZyk7LypsaW50ICFlMjYqLworCQlpZiAoMCAhPSBzdHJjbXAoTm9Gb3J3YXJkaW5nLCBudl90bXApKSB7CisJCQkqd2lmaV9zZXRfZmxhZ3MgfD0gWlRFX1dMQU5fU0VUX0FQX01TU0lEOworCQkJc3RhdHVzID0genRlX3dlYl93cml0ZSgibV9Ob0ZvcndhcmRpbmciLCBOb0ZvcndhcmRpbmcpOworCQkJaWYgKFpURV9OVklPX0RPTkUgIT0gc3RhdHVzKSB7CisJCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwienRlX3dsYW5fc3NpZDFfYmFzaWNfc2V0OiB3cml0ZSBudiBbbV9Ob0ZvcndhcmRpbmddIGZhaWwuIik7LypsaW50ICFlMjYqLworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworCS8vc2V0ICBNQVhfQWNjZXNzX251bQorCW1lbXNldChudl90bXAsIDAsIHNpemVvZihudl90bXApKTsKKwlNQVhfQWNjZXNzX251bSA9IHdlYnNHZXRWYXIod3AsIFQoIm1fTUFYX0FjY2Vzc19udW0iKSwgTlVMTCk7CisJaWYgKE1BWF9BY2Nlc3NfbnVtICE9IE5VTEwpIHsKKwkJKHZvaWQpenRlX3dlYl9yZWFkKCJtX01BWF9BY2Nlc3NfbnVtIiwgbnZfdG1wKTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJvbGRfbV9NQVhfQWNjZXNzX251bT1bJXNdLCBtX01BWF9BY2Nlc3NfbnVtPVslc10iLCBudl90bXAsIE1BWF9BY2Nlc3NfbnVtKTsvKmxpbnQgIWUyNiovCisJCWlmICgwICE9IHN0cmNtcChNQVhfQWNjZXNzX251bSwgbnZfdG1wKSkgeworCQkJKndpZmlfc2V0X2ZsYWdzIHw9IFpURV9XTEFOX1NFVF9BUF9NU1NJRDsKKwkJCXN0YXR1cyA9IHp0ZV93ZWJfd3JpdGUoIm1fTUFYX0FjY2Vzc19udW0iLCBNQVhfQWNjZXNzX251bSk7CisJCQlpZiAoWlRFX05WSU9fRE9ORSAhPSBzdGF0dXMpIHsKKwkJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJ6dGVfd2xhbl9zc2lkMl9iYXNpY19zZXQ6IHdyaXRlIG52IFtNQVhfQWNjZXNzX251bV0gZmFpbC4iKTsvKmxpbnQgIWUyNiovCisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQl9CisJfQorCisJLy9zZXQgIHNob3dfcXJjb2RlX2ZsYWcKKwltZW1zZXQobnZfdG1wLCAwLCBzaXplb2YobnZfdG1wKSk7CisJc2hvd19xcmNvZGVfZmxhZyA9IHdlYnNHZXRWYXIod3AsIFQoIm1fc2hvd19xcmNvZGVfZmxhZyIpLCBOVUxMKTsKKwlpZiAoc2hvd19xcmNvZGVfZmxhZyAhPSBOVUxMKSB7CisJCSh2b2lkKXp0ZV93ZWJfcmVhZCgibV9zaG93X3FyY29kZV9mbGFnIiwgbnZfdG1wKTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJzc2lkMjogb2xkX3Nob3dfcXJjb2RlX2ZsYWc9WyVzXSwgc2hvd19xcmNvZGVfZmxhZz1bJXNdIiwgbnZfdG1wLCBzaG93X3FyY29kZV9mbGFnKTsvKmxpbnQgIWUyNiovCisJCWlmICgwICE9IHN0cmNtcChzaG93X3FyY29kZV9mbGFnLCBudl90bXApKSB7CisJCQlzdGF0dXMgPSB6dGVfd2ViX3dyaXRlKCJtX3Nob3dfcXJjb2RlX2ZsYWciLCBzaG93X3FyY29kZV9mbGFnKTsKKwkJCWlmIChaVEVfTlZJT19ET05FICE9IHN0YXR1cykgeworCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsInp0ZV93bGFuX3NzaWQyX2Jhc2ljX3NldDogd3JpdGUgbnYgW3Nob3dfcXJjb2RlX2ZsYWddIGZhaWwuIik7LypsaW50ICFlMjYqLworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworCisKKwlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInp0ZV93bGFuX3NzaWQyX2Jhc2ljX3NldDogIHdpZmkgYmFzaWMgc2V0dXAgc3VjY2Vzcy4iKTsvKmxpbnQgIWUyNiovCisJcmV0dXJuIFRSVUU7CisKK30KKworc3RhdGljIGludCB6dGVfbGFuX3NzaWQxX3NlY3VyaXR5X3NldCh3ZWJzX3Qgd3AsIHVuc2lnbmVkIGludCAqd2lmaV9zZXRfZmxhZ3MpCit7CisjZGVmaW5lIEtFWV9JTkRFWF9NQVggNQorCisJY2hhcl90ICpzZWN1cml0eV9tb2RlID0gTlVMTDsKKwljaGFyICplbmNyeXBfdHlwZSA9IE5VTEw7CisJaW50IGkgPSAwOworCWNoYXJfdCAqcGFzc19waHJhc2Vfc3RyID0gTlVMTDsKKwkvL2FkZCBieSBsaXV5aW5nbmFuIGZvciBTZXJ2ZXIgc2FmZSBzdGFydAorCWludCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCA9IDA7CisJY2hhcl90ICpwYXNzX3BocmFzZV9zdHJfZGVjb2RlID0gTlVMTDsKKyNpZmRlZiBXRUJTX1NFQ1VSSVRZCisJY2hhcl90ICpwYXNzX3BocmFzZV9iNjRfZW5jb2RlID0gTlVMTDsKKyNlbmRpZgorCWNoYXJfdCB6dGVfcGFzc19waHJhc2Vfc3RyW1dJRklfUFNXX0RFRkFVTFRfTEVOR1RIXSA9IHswfTsKKwlpbnQgenRlX3Bhc3NfcGhyYXNlX2xlbiA9IDA7CisJLy9hZGQgYnkgbGl1eWluZ25hbiBmb3IgU2VydmVyIHNhZmUgZW5kCisKKwljaGFyX3QgKkRlZmF1bHRLZXlJRCA9IE5VTEw7CisJY2hhcl90ICogS2V5VHlwZVtLRVlfSU5ERVhfTUFYXTsKKwljaGFyX3QgKiBLZXlTdHJbS0VZX0lOREVYX01BWF07CisKKwljaGFyX3QgKmNpcGhlcl9zdHIgPSBOVUxMOworCWNoYXJfdCB3cGFfZW5jcnlfdHlwZVtXRl9FTkNSWV9UWVBFX0xFTl0gPSB7MH07CisKKwl6dGVfdG9wc3dfc3RhdGVfZV90eXBlIG52X3JldCA9IFpURV9OVklPX0RPTkU7ICAgIC8qbGludCAtZTU1MCovCisKKwl1aW50OCBudl9hdV9tb2RlW1dGX0FVX01PREVfTEVOXSA9IHswfTsKKwl1aW50OCBudl9lY3J5X3R5cGVbV0ZfRU5DUllfVFlQRV9MRU5dID0gezB9OworCWNoYXJfdCAgcHN3W05WX0lURU1fVkFMVUVfREVGQVVMVF9TVFJJTkdfTEVOXSA9IHswfTsKKwkvL2NoYXIgbnZfYmFzaWNbTlZJT19XSUZJX01BWF9MRU5dPXswfTsgLy8gZm9yIG52IHJlYWQgYW5kIHdyaXRlCisKKwkvKmxpbnQgLWU3MTcqLworI2RlZmluZSBTRUNVUklUWV9OVl9XUklURShudl9uYW1lLCBzdHIsIHJldCkgIGRveyByZXQgPSB6dGVfd2ViX3dyaXRlKG52X25hbWUsIChjaGFyICopc3RyKTt9d2hpbGUoMCkKKworCW1lbXNldChLZXlUeXBlLCAwLCBzaXplb2YoS2V5VHlwZSkpOyAvL3NldCAwCisJbWVtc2V0KEtleVN0ciwgMCwgc2l6ZW9mKEtleVN0cikpOyAgICAgLy9zZXQgMAorCisJaWYgKChOVUxMID09IHdwKSB8fCAoTlVMTCA9PSB3aWZpX3NldF9mbGFncykpIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwiWyVzXVslc11pbnB1dCBwYXJhIGlzIG51bGwuXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsgLypsaW50ICFlMjYqLworCQlyZXR1cm4gLTE7CisJfQorCisJc2VjdXJpdHlfbW9kZSA9IHdlYnNHZXRWYXIod3AsIFQoInNlY3VyaXR5X21vZGUiKSwgTlVMTCk7CisJaWYgKHNlY3VyaXR5X21vZGUgIT0gTlVMTCkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslc11bJXNdc2VjdXJpdHlfbW9kZSA9IFslc10iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBzZWN1cml0eV9tb2RlKTsgLypsaW50ICFlMjYqLworCisJCWVuY3J5cF90eXBlID0gd2Vic0dldFZhcih3cCwgVCgic2VjdXJpdHlfc2hhcmVkX21vZGUiKSwgTlVMTCk7CisJCWlmIChOVUxMID09IGVuY3J5cF90eXBlKSB7CisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJlbmNyeXBfdHlwZSA9PSBOVUxMIik7LypsaW50ICFlMjYqLworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdWyVzXWVuY3J5cF90eXBlID0gWyVzXSIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIGVuY3J5cF90eXBlKTsgLypsaW50ICFlMjYqLworCisJCWlmIChTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgV0ZfQVVfT1BFTikgIHx8IFNUUl9FUVVBTChzZWN1cml0eV9tb2RlLCBXRl9BVV9TSEFSRSkpIHsKKwkJCWlmICgoU1RSX0VRVUFMKHNlY3VyaXR5X21vZGUsIFdGX0FVX09QRU4pICYmIFNUUl9FUVVBTChlbmNyeXBfdHlwZSwgV0ZfRU5DUllfV0VQKSkgfHwKKwkJCSAgICAoU1RSX0VRVUFMKHNlY3VyaXR5X21vZGUsIFdGX0FVX1NIQVJFKSkpIHsgLy8mJlNUUl9FUVVBTCh3aWZpX2VuY3J5X3R5cGUsIFdGX0FVX09QRU4pKSApCisJCQkJenRlX3dpZmlfb3Blbl9hbmRfc2hhcmVfbW9kZV9zX3R5cGUgbnZfb3Blbl9hbmRfc2hhcmVfczsKKwkJCQltZW1zZXQoJm52X29wZW5fYW5kX3NoYXJlX3MsIDAsIHNpemVvZih6dGVfd2lmaV9vcGVuX2FuZF9zaGFyZV9tb2RlX3NfdHlwZSkpOworCisJCQkJLy9yZWFkIG52CisJCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJBdXRoTW9kZSIsIG52X2F1X21vZGUpOworCQkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgiRW5jcnlwVHlwZSIsIG52X2VjcnlfdHlwZSk7CisJCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJEZWZhdWx0S2V5SUQiLCBudl9vcGVuX2FuZF9zaGFyZV9zLndlcF9rZXlfaW5kZXgpOworCQkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgiS2V5MVN0cjEiLCBudl9vcGVuX2FuZF9zaGFyZV9zLndlcF9rZXkxKTsKKwkJCQkodm9pZCl6dGVfd2ViX3JlYWQoIktleTJTdHIxIiwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5Mik7CisJCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJLZXkzU3RyMSIsIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTMpOworCQkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgiS2V5NFN0cjEiLCBudl9vcGVuX2FuZF9zaGFyZV9zLndlcF9rZXk0KTsKKwkJCQkodm9pZCl6dGVfd2ViX3JlYWQoIktleTFUeXBlIiwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5MV9tb2RlKTsKKwkJCQkodm9pZCl6dGVfd2ViX3JlYWQoIktleTJUeXBlIiwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5Ml9tb2RlKTsKKwkJCQkodm9pZCl6dGVfd2ViX3JlYWQoIktleTNUeXBlIiwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5M19tb2RlKTsKKwkJCQkodm9pZCl6dGVfd2ViX3JlYWQoIktleTRUeXBlIiwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5NF9tb2RlKTsKKworCQkJCURlZmF1bHRLZXlJRCA9IHdlYnNHZXRWYXIod3AsIFQoIndlcF9kZWZhdWx0X2tleSIpLCAiIik7CisJCQkJS2V5U3RyWzFdID0gd2Vic0dldFZhcih3cCwgVCgid2VwX2tleV8xIiksICIiKTsKKwkJCQlLZXlTdHJbMl0gPSB3ZWJzR2V0VmFyKHdwLCBUKCJ3ZXBfa2V5XzIiKSwgIiIpOworCQkJCUtleVN0clszXSA9IHdlYnNHZXRWYXIod3AsIFQoIndlcF9rZXlfMyIpLCAiIik7CisJCQkJS2V5U3RyWzRdID0gd2Vic0dldFZhcih3cCwgVCgid2VwX2tleV80IiksICIiKTsKKwkJCQlLZXlUeXBlWzFdID0gd2Vic0dldFZhcih3cCwgVCgiV0VQMVNlbGVjdCIpLCAiIik7CisJCQkJS2V5VHlwZVsyXSA9IHdlYnNHZXRWYXIod3AsIFQoIldFUDJTZWxlY3QiKSwgIiIpOworCQkJCUtleVR5cGVbM10gPSB3ZWJzR2V0VmFyKHdwLCBUKCJXRVAzU2VsZWN0IiksICIiKTsKKwkJCQlLZXlUeXBlWzRdID0gd2Vic0dldFZhcih3cCwgVCgiV0VQNFNlbGVjdCIpLCAiIik7CisKKwkJCQkvL3doZW4gdGhlIHdpZmkgc2V0dGluZyBoYXMgY2hhbmdlZCx0aGVuIHNldCB0aGVtCisJCQkJaWYgKFNUUl9FUVVBTChzZWN1cml0eV9tb2RlLCBudl9hdV9tb2RlKSAmJiBTVFJfRVFVQUwoZW5jcnlwX3R5cGUsIG52X2VjcnlfdHlwZSkgXAorCQkJCSAgICAmJiBTVFJfRVFVQUwoRGVmYXVsdEtleUlELCBudl9vcGVuX2FuZF9zaGFyZV9zLndlcF9rZXlfaW5kZXgpIFwKKwkJCQkgICAgJiYgU1RSX0VRVUFMKEtleVN0clsxXSwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5MSkgJiYgU1RSX0VRVUFMKEtleVN0clsyXSwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5MikgJiYgU1RSX0VRVUFMKEtleVN0clszXSwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5MykgJiYgU1RSX0VRVUFMKEtleVN0cls0XSwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5NCkgXAorCQkJCSAgICAmJiBTVFJfRVFVQUwoS2V5VHlwZVsxXSwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5MV9tb2RlKSAmJiBTVFJfRVFVQUwoS2V5VHlwZVsyXSwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5Ml9tb2RlKSAmJiBTVFJfRVFVQUwoS2V5VHlwZVszXSwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5M19tb2RlKSAmJiBTVFJfRVFVQUwoS2V5VHlwZVs0XSwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5NF9tb2RlKSkgeworCisJCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzXVslc113aWZpOlslc11bJXNdIG5vdCBjaGFuZ2VkLlxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgc2VjdXJpdHlfbW9kZSwgZW5jcnlwX3R5cGUpOyAvKmxpbnQgIWUyNiovCisJCQkJfSBlbHNlIHsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIkF1dGhNb2RlIiwgc2VjdXJpdHlfbW9kZSwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIkVuY3J5cFR5cGUiLCBlbmNyeXBfdHlwZSwgbnZfcmV0KTsKKworCQkJCQlTRUNVUklUWV9OVl9XUklURSgiRGVmYXVsdEtleUlEIiwgRGVmYXVsdEtleUlELCBudl9yZXQpOworCisJCQkJCVNFQ1VSSVRZX05WX1dSSVRFKCJLZXkxU3RyMSIsIEtleVN0clsxXSwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIktleTJTdHIxIiwgS2V5U3RyWzJdLCBudl9yZXQpOworCQkJCQlTRUNVUklUWV9OVl9XUklURSgiS2V5M1N0cjEiLCBLZXlTdHJbM10sIG52X3JldCk7CisJCQkJCVNFQ1VSSVRZX05WX1dSSVRFKCJLZXk0U3RyMSIsIEtleVN0cls0XSwgbnZfcmV0KTsKKworCQkJCQlTRUNVUklUWV9OVl9XUklURSgiS2V5MVR5cGUiLCBLZXlUeXBlWzFdLCBudl9yZXQpOworCQkJCQlTRUNVUklUWV9OVl9XUklURSgiS2V5MlR5cGUiLCBLZXlUeXBlWzJdLCBudl9yZXQpOworCQkJCQlTRUNVUklUWV9OVl9XUklURSgiS2V5M1R5cGUiLCBLZXlUeXBlWzNdLCBudl9yZXQpOworCQkJCQlTRUNVUklUWV9OVl9XUklURSgiS2V5NFR5cGUiLCBLZXlUeXBlWzRdLCBudl9yZXQpOworCisJCQkJCSp3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9CQVNJQ19TRUNVUklUWV9TRVQ7CisJCQkJCXdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKFNUUl9FUVVBTChzZWN1cml0eV9tb2RlLCBXRl9BVV9PUEVOKSAmJiBTVFJfRVFVQUwoZW5jcnlwX3R5cGUsIFdGX0VOQ1JZX05PTkUpKSB7CisJCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJBdXRoTW9kZSIsbnZfYXVfbW9kZSk7CisJCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJFbmNyeXBUeXBlIiwgbnZfZWNyeV90eXBlKTsKKworCQkJCWlmIChTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgbnZfYXVfbW9kZSkgJiYgU1RSX0VRVUFMKGVuY3J5cF90eXBlLCBudl9lY3J5X3R5cGUpKSB7CisJCQkJCXByaW50ZigiWyVzXVslc113aWZpOlslc11bJXNdIG5vdCBjaGFuZ2VkLlxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgc2VjdXJpdHlfbW9kZSwgZW5jcnlwX3R5cGUpOyAvKmxpbnQgIWUyNiovCisJCQkJfSBlbHNlIHsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIkF1dGhNb2RlIiwgc2VjdXJpdHlfbW9kZSwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIkVuY3J5cFR5cGUiLCBlbmNyeXBfdHlwZSwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoTlZfV0lGSV9XUEFfUEFTU19FTkNPREUsICIiLCBudl9yZXQpOworCQkJCQlTRUNVUklUWV9OVl9XUklURShOVl9XSUZJX1dQQV9QQVNTLCAiIiwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIktleTFTdHIxIiwgIiIsIG52X3JldCk7CisJCQkJCVNFQ1VSSVRZX05WX1dSSVRFKCJLZXkyU3RyMSIsICIiLCBudl9yZXQpOworCQkJCQlTRUNVUklUWV9OVl9XUklURSgiS2V5M1N0cjEiLCAiIiwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIktleTRTdHIxIiwgIiIsIG52X3JldCk7CisJCQkJCSp3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9CQVNJQ19TRUNVUklUWV9TRVQ7CisJCQkJCXdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vd2lmaV9hdV9tb2RlIG9yIGVuY3J5cGUgaW52YWxpZAorCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsIlslc11bJXNdd2lmaTpbJXNdWyVzXSBpcyBpbnZhbGlkLlxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgc2VjdXJpdHlfbW9kZSwgZW5jcnlwX3R5cGUpOyAvKmxpbnQgIWUyNiovCisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKFNUUl9FUVVBTChzZWN1cml0eV9tb2RlLCBXRl9BVV9XUEEpICB8fCBTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgV0ZfQVVfV1BBMikgfHwKKwkJICAgICAgICAgICBTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgV0ZfQVVfV1BBX1dQQTIpIHx8IFNUUl9FUVVBTChzZWN1cml0eV9tb2RlLCBXRl9BVV9XUEEzKSB8fCBTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgV0ZfQVVfV1BBMl9XUEEzKSkgeworCQkJenRlX3dpZmlfd3BhX2FuZF93cGEyX21vZGVfc190eXBlIG52X3dwYV9hbmRfd3BhMjsKKwkJCW1lbXNldCgmbnZfd3BhX2FuZF93cGEyLCAwLCBzaXplb2YoenRlX3dpZmlfd3BhX2FuZF93cGEyX21vZGVfc190eXBlKSk7CisKKwkJCXBhc3NfcGhyYXNlX3N0ciA9IHdlYnNHZXRWYXIod3AsIFQoInBhc3NwaHJhc2UiKSwgIiIpOworCQkJaW50IGogPSAwOworCQkJZm9yIChpID0gMDsgaSA8IHN0cmxlbihwYXNzX3BocmFzZV9zdHIpICYmIGogPCBOVl9JVEVNX1ZBTFVFX0RFRkFVTFRfU1RSSU5HX0xFTjsgaSsrKSB7CisJCQkJaWYgKHBhc3NfcGhyYXNlX3N0cltpXSAhPSAnXHInICYmIHBhc3NfcGhyYXNlX3N0cltpXSAhPSAnXG4nKSB7CisJCQkJCXBzd1tqXSA9IHBhc3NfcGhyYXNlX3N0cltpXTsKKwkJCQkJaisrOworCQkJCX0KKwkJCX0KKwkJCXBhc3NfcGhyYXNlX3N0ciA9IHBzdzsKKwkJCWlmICh3cC0+ZmxhZ3MgJiBXRUJTX1hNTF9DTElFTlRfUkVRVUVTVCkgeworCQkJCWNpcGhlcl9zdHIgPSB3ZWJzR2V0VmFyKHdwLCBUKCJjaXBoZXIiKSwgIiIpOworCQkJfSBlbHNlIHsKKyNpZm5kZWYgQ09ORklHX0NISU5BX1VOSUNPTQorCQkJCWlmIChTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgV0ZfQVVfV1BBX1dQQTIpKSB7CisJCQkJCWNpcGhlcl9zdHIgPSB3ZWJzR2V0VmFyKHdwLCBUKCJjaXBoZXJfc3RyIiksICIiKTsKKwkJCQl9IGVsc2UKKyNlbmRpZgorCQkJCXsKKwkJCQkJY2lwaGVyX3N0ciA9IHdlYnNHZXRWYXIod3AsIFQoImNpcGhlciIpLCAiIik7CisJCQkJfQorCQkJfQorCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdWyVzXXBhc3NfcGhyYXNlX3N0ciA9ICVzIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgcGFzc19waHJhc2Vfc3RyKTsgLypsaW50ICFlMjYqLworCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdWyVzXWNpcGhlcl9zdHIgPSAlcyIsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIGNpcGhlcl9zdHIpOyAvKmxpbnQgIWUyNiovCisJCQkvL2FkZCBieSBsaXV5aW5nbmFuIGZvciBzZXJ2ZXIgc2FmZSBmb3IgeHNzIGF0dGFjayBzdGFydAorCQkJaWYgKERBVEFfTk9fU0FGRSA9PSB6dGVfU2FmZV9ub1NwZWNpYWxDaGFyKHBhc3NfcGhyYXNlX3N0cikpIHsKKwkJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJHZXQgRGF0YSBpcyBubyBTYWZlOnNzaWQ6JXNcbiIsIHBhc3NfcGhyYXNlX3N0cik7IC8qbGludCAhZTI2Ki8KKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQkvL2FkZCBieSBsaXV5aW5nbmFuIGZvciBzZXJ2ZXIgc2FmZSBmb3IgeHNzIGF0dGFjayBlbmQKKworCQkJc3dpdGNoIChjaXBoZXJfc3RyWzBdKSB7CisJCQljYXNlICcwJzoKKwkJCQlzdHJuY3B5KHdwYV9lbmNyeV90eXBlLCBXRl9FTkNSWV9US0lQLCBzaXplb2Yod3BhX2VuY3J5X3R5cGUpIC0gMSk7CisJCQkJYnJlYWs7CisJCQljYXNlICcxJzoKKwkJCQlzdHJuY3B5KHdwYV9lbmNyeV90eXBlLCBXRl9FTkNSWV9BRVMsIHNpemVvZih3cGFfZW5jcnlfdHlwZSkgLSAxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzInOgorCQkJCXN0cm5jcHkod3BhX2VuY3J5X3R5cGUsIFdGX0VOQ1JZX1RLSVBfQUVTLCBzaXplb2Yod3BhX2VuY3J5X3R5cGUpIC0gMSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsInVudmFsaWQgZW5jcnkgdHlwZSBbJWNdIiwgZW5jcnlwX3R5cGVbMF0sIDAsIDApOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJBdXRoTW9kZSIsIG52X2F1X21vZGUpOworCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJFbmNyeXBUeXBlIiwgbnZfZWNyeV90eXBlKTsKKwkJCSh2b2lkKXp0ZV93ZWJfcmVhZChOVl9XSUZJX1dQQV9QQVNTLCBudl93cGFfYW5kX3dwYTIucHJlX3NoYXJlX2tleSk7CisKKwkJCWlmIChTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgbnZfYXVfbW9kZSkgJiYgU1RSX0VRVUFMKHdwYV9lbmNyeV90eXBlLCBudl9lY3J5X3R5cGUpICYmIFNUUl9FUVVBTChwYXNzX3BocmFzZV9zdHIsIG52X3dwYV9hbmRfd3BhMi5wcmVfc2hhcmVfa2V5KSkgeworCisJCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdWyVzXXdpZmk6WyVzXVslc10gbm90IGNoYW5nZWQuXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBzZWN1cml0eV9tb2RlLCB3cGFfZW5jcnlfdHlwZSk7IC8qbGludCAhZTI2Ki8KKwkJCX0gZWxzZSB7CisJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIkF1dGhNb2RlIiwgc2VjdXJpdHlfbW9kZSwgbnZfcmV0KTsKKwkJCQlTRUNVUklUWV9OVl9XUklURSgiRW5jcnlwVHlwZSIsIHdwYV9lbmNyeV90eXBlLCBudl9yZXQpOworI2lmbmRlZiBDT05GSUdfQ0hJTkFfVU5JQ09NCisJCQkJaWYgKFNUUl9FUVVBTChzZWN1cml0eV9tb2RlLCBXRl9BVV9XUEFfV1BBMikpIHsKKyNlbmRpZgorCQkJCQlTRUNVUklUWV9OVl9XUklURSgiY2lwaGVyX3N0ciIsIGNpcGhlcl9zdHIsIG52X3JldCk7CisjaWZuZGVmIENPTkZJR19DSElOQV9VTklDT00KKwkJCQl9CisjZW5kaWYKKwkJCQkvL2FkZCBieSBsaXV5aW5nbmFuIGZvciBTZXJ2ZXIgc2FmZSBzdGFydAorCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzXVslc11wYXNzX3BocmFzZV9zdHI6JXMuXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBwYXNzX3BocmFzZV9zdHIpOyAvKmxpbnQgIWUyNiovCisjaWZkZWYgV0VCU19TRUNVUklUWQorCQkJCXBhc3NfcGhyYXNlX3N0cl9kZWNvZGUgPSBqc19hZXNfZGVjb2RlKHBhc3NfcGhyYXNlX3N0ciwgc3RybGVuKHBhc3NfcGhyYXNlX3N0ciksICh1bnNpZ25lZCBpbnQqKSZwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCk7CisjZWxzZQorCQkJCXBhc3NfcGhyYXNlX3N0cl9kZWNvZGUgPSAoY2hhciopenRlX2Jhc2U2NF9kZWNvZGUoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwYXNzX3BocmFzZV9zdHIsIHN0cmxlbihwYXNzX3BocmFzZV9zdHIpLCAodW5zaWduZWQgaW50KikmcGFzc19waHJhc2Vfc3RyX2RlY29kZV9sZW5ndGgpOworI2VuZGlmCisJCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdWyVzXWxvZ2luMiAtPiB6dGVfcGFzc3dvcmQ6JXMuXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlKTsgLypsaW50ICFlMjYqLworCisJCQkJaWYgKE5VTEwgPT0gcGFzc19waHJhc2Vfc3RyX2RlY29kZSkgeworCQkJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInBhc3NfcGhyYXNlX3N0cl9kZWNvZGU6IHBzdyBpcyBlbXB0eS5cbiIpOy8qbGludCAhZTI2Ki8KKwkJCQkJZnJlZShwYXNzX3BocmFzZV9zdHJfZGVjb2RlKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQl6dGVfcGFzc19waHJhc2VfbGVuID0gKHBhc3NfcGhyYXNlX3N0cl9kZWNvZGVfbGVuZ3RoIDwgc2l6ZW9mKHp0ZV9wYXNzX3BocmFzZV9zdHIpID8gcGFzc19waHJhc2Vfc3RyX2RlY29kZV9sZW5ndGggOiBzaXplb2YoenRlX3Bhc3NfcGhyYXNlX3N0cikgLSAxKTsKKwkJCQlzbnByaW50Zih6dGVfcGFzc19waHJhc2Vfc3RyLHp0ZV9wYXNzX3BocmFzZV9sZW4rMSwiJXMiLHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpOworCQkJCS8vc3RybmNweSh6dGVfcGFzc19waHJhc2Vfc3RyLCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlLCB6dGVfcGFzc19waHJhc2VfbGVuKTsKKwkJCQlmcmVlKHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpOworCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywibG9naW4zIC0+IHp0ZV9wc3dfYWRtaW46JXMuXG4iLCB6dGVfcGFzc19waHJhc2Vfc3RyKTsgLy9jb3YgbQorI2lmZGVmIFdFQlNfU0VDVVJJVFkKKwkJCQlpZih6dGVfcGFzc19waHJhc2Vfc3RyICYmICFjaGVja193ZWJfaW5wdXRfd2lmaSh6dGVfcGFzc19waHJhc2Vfc3RyLHN0cmxlbih6dGVfcGFzc19waHJhc2Vfc3RyKSkpCisJCQkJeworCQkJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJbZ29haGVhZF13aWZpcGFzczE9JXNcbiIsenRlX3Bhc3NfcGhyYXNlX3N0cik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcGFzc19waHJhc2VfYjY0X2VuY29kZSA9IHp0ZV9iYXNlNjRfZW5jb2RlKHp0ZV9wYXNzX3BocmFzZV9zdHIsIHN0cmxlbih6dGVfcGFzc19waHJhc2Vfc3RyKSk7CisJCQkJaWYgKE5VTEwgPT0gcGFzc19waHJhc2VfYjY0X2VuY29kZSkgeworCQkJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInBhc3NfcGhyYXNlX2I2NF9lbmNvZGU6IHBzdyBpcyBOVUxMLlxuIik7LypsaW50ICFlMjYqLworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCVNFQ1VSSVRZX05WX1dSSVRFKE5WX1dJRklfV1BBX1BBU1NfRU5DT0RFLCBwYXNzX3BocmFzZV9iNjRfZW5jb2RlLCBudl9yZXQpOworCQkJCWZyZWUocGFzc19waHJhc2VfYjY0X2VuY29kZSk7CisJCQkJU0VDVVJJVFlfTlZfV1JJVEUoTlZfV0lGSV9XUEFfUEFTUywgenRlX3Bhc3NfcGhyYXNlX3N0ciwgbnZfcmV0KTsKKwkJCQlTRUNVUklUWV9OVl9XUklURSgiV1BBUFNLMV9lbmFlcyIsIHBhc3NfcGhyYXNlX3N0ciwgbnZfcmV0KTsKKyNlbHNlCisJCQkJU0VDVVJJVFlfTlZfV1JJVEUoTlZfV0lGSV9XUEFfUEFTU19FTkNPREUsIHBhc3NfcGhyYXNlX3N0ciwgbnZfcmV0KTsKKwkJCQlTRUNVUklUWV9OVl9XUklURShOVl9XSUZJX1dQQV9QQVNTLCB6dGVfcGFzc19waHJhc2Vfc3RyLCBudl9yZXQpOworI2VuZGlmCisJCQkJLy9hZGQgYnkgbGl1eWluZ25hbiBmb3IgU2VydmVyIHNhZmUgZW5kCisJCQkJLy9TRUNVUklUWV9OVl9XUklURShOVl9XSUZJX1dQQV9QQVNTLCBwYXNzX3BocmFzZV9zdHIsIG52X3JldCk7CisKKwkJCQkqd2lmaV9zZXRfZmxhZ3MgfD0gWlRFX1dMQU5fQkFTSUNfU0VDVVJJVFlfU0VUOworCQkJCXdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIG90aGVyIHNlY3VyaXR5IG1vZGUgaXMgaW52YWxpZAorCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwiRVJST1I6c2VjdXJpdHkgbW9kZSAgaXMgaW52YWxpZCIsIDAsIDAsIDApOy8qbGludCAhZTI2Ki8KKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZSB7CisJCS8vc2VjdXJpdHlfbW9kZSBpcyBOVUxMCisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsIkVSUk9SOnNlY3VyaXR5X21vZGUgaXMgTlVMTCAiLCAwLCAwLCAwKTsvKmxpbnQgIWUyNiovCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbjogICAgICAgICB6dGVfbGFuX3NzaWQyX3NlY3VyaXR5X3NldAorKiBEZXNjcmlwdGlvbjogICAgIHRvIHNldCB0aGUgd2lmaSBzZWN1cml0eSBwYXJhcyBmb3IgU1NJRDIKKyogSW5wdXQ6ICAgICAgICAgICBodHRwIGluZm8KKyogT3V0cHV0OgorKiBSZXR1cm46ICAgICAgICAgICAwOm9rOy0xOmZhaWwKKyogT3RoZXJzOgorKiBNb2RpZnkgRGF0ZSAgIFZlcnNpb24gICAgIEF1dGhvciAgICAgICAgICBNb2RpZmljYXRpb24KKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogMjAxMi8wNy8xMSAgICBWMS4wICAgICAgICBjaGVueWkgICAgICAgZmlyc3QgdmVyc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qbGludCAtZXs4MTgsODMwfSovCitzdGF0aWMgaW50IHp0ZV9sYW5fc3NpZDJfc2VjdXJpdHlfc2V0KHdlYnNfdCB3cCwgdW5zaWduZWQgaW50ICp3aWZpX3NldF9mbGFncykgLypsaW50ICFlNTMzKi8KK3sKKyNkZWZpbmUgS0VZX0lOREVYX01BWCA1CisKKwljaGFyX3QgKnNlY3VyaXR5X21vZGUgPSBOVUxMOworCWNoYXIgKmVuY3J5cF90eXBlID0gTlVMTDsKKworCWNoYXJfdCAqcGFzc19waHJhc2Vfc3RyID0gTlVMTDsKKwkvL2FkZCBieSBsaXV5aW5nbmFuIGZvciBTZXJ2ZXIgc2FmZSBzdGFydAorCWludCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCA9IDA7CisJY2hhcl90ICpwYXNzX3BocmFzZV9zdHJfZGVjb2RlID0gTlVMTDsKKyNpZmRlZiBXRUJTX1NFQ1VSSVRZCisJY2hhcl90ICpwYXNzX3BocmFzZV9iNjRfZW5jb2RlID0gTlVMTDsKKyNlbmRpZgorCWNoYXJfdCB6dGVfcGFzc19waHJhc2Vfc3RyW1dJRklfUFNXX0RFRkFVTFRfTEVOR1RIXSA9IHswfTsKKwlpbnQgenRlX3Bhc3NfcGhyYXNlX2xlbiA9IDA7CisJLy9hZGQgYnkgbGl1eWluZ25hbiBmb3IgU2VydmVyIHNhZmUgZW5kCisKKwljaGFyX3QgKkRlZmF1bHRLZXlJRCA9IE5VTEw7CisJY2hhcl90ICogS2V5VHlwZVtLRVlfSU5ERVhfTUFYXTsKKwljaGFyX3QgKiBLZXlTdHJbS0VZX0lOREVYX01BWF07CisKKwljaGFyX3QgKmNpcGhlcl9zdHIgPSBOVUxMOworCWNoYXJfdCB3cGFfZW5jcnlfdHlwZVtXRl9FTkNSWV9UWVBFX0xFTl0gPSB7MH07CisKKwl6dGVfdG9wc3dfc3RhdGVfZV90eXBlIG52X3JldCA9IFpURV9OVklPX0RPTkU7ICAgIC8qbGludCAtZTU1MCovCisKKwl1aW50OCBudl9hdV9tb2RlW1dGX0FVX01PREVfTEVOXSA9IHswfTsKKwl1aW50OCBudl9lY3J5X3R5cGVbV0ZfRU5DUllfVFlQRV9MRU5dID0gezB9OworCisJLy9jaGFyIG52X2Jhc2ljW05WSU9fV0lGSV9NQVhfTEVOXT17MH07IC8vIGZvciBudiByZWFkIGFuZCB3cml0ZQorCisJLypsaW50IC1lNzE3Ki8KKyNkZWZpbmUgU0VDVVJJVFlfTlZfV1JJVEUobnZfbmFtZSwgc3RyLCByZXQpICBkb3sgcmV0ID0genRlX3dlYl93cml0ZShudl9uYW1lLCAoY2hhciAqKXN0cik7fXdoaWxlKDApCisKKwltZW1zZXQoS2V5VHlwZSwgMCwgc2l6ZW9mKEtleVR5cGUpKTsgLy9zZXQgMAorCW1lbXNldChLZXlTdHIsIDAsIHNpemVvZihLZXlTdHIpKTsgICAgIC8vc2V0IDAKKworCWlmICgoTlVMTCA9PSB3cCkgfHwgKE5VTEwgPT0gd2lmaV9zZXRfZmxhZ3MpKSB7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsImlucHV0IHBhcmEgaXMgbnVsbC5cbiIpOy8qbGludCAhZTI2Ki8KKwkJcmV0dXJuIC0xOworCX0KKworCXNlY3VyaXR5X21vZGUgPSB3ZWJzR2V0VmFyKHdwLCBUKCJtX0F1dGhNb2RlIiksIE5VTEwpOworCWlmIChzZWN1cml0eV9tb2RlICE9IE5VTEwpIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJzZWN1cml0eV9tb2RlID0gWyVzXSIsIHNlY3VyaXR5X21vZGUpOy8qbGludCAhZTI2Ki8KKworCQllbmNyeXBfdHlwZSA9IHdlYnNHZXRWYXIod3AsIFQoIm1fRW5jcnlwVHlwZSIpLCBOVUxMKTsKKwkJaWYgKE5VTEwgPT0gZW5jcnlwX3R5cGUpIHsKKwkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiZW5jcnlwX3R5cGUgPT0gTlVMTCIsIDAsIDAsIDApOy8qbGludCAhZTI2Ki8KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiZW5jcnlwX3R5cGUgPSBbJXNdIiwgZW5jcnlwX3R5cGUpOyAgLypsaW50ICFlMjYqLworCisJCWlmIChTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgV0ZfQVVfT1BFTikgIHx8IFNUUl9FUVVBTChzZWN1cml0eV9tb2RlLCBXRl9BVV9TSEFSRSkpIHsKKwkJCWlmICgoU1RSX0VRVUFMKHNlY3VyaXR5X21vZGUsIFdGX0FVX09QRU4pICYmIFNUUl9FUVVBTChlbmNyeXBfdHlwZSwgV0ZfRU5DUllfV0VQKSkgfHwKKwkJCSAgICAoU1RSX0VRVUFMKHNlY3VyaXR5X21vZGUsIFdGX0FVX1NIQVJFKSkpIHsgLy8mJlNUUl9FUVVBTCh3aWZpX2VuY3J5X3R5cGUsIFdGX0FVX09QRU4pKSApCisJCQkJenRlX3dpZmlfb3Blbl9hbmRfc2hhcmVfbW9kZV9zX3R5cGUgbnZfb3Blbl9hbmRfc2hhcmVfczsKKwkJCQltZW1zZXQoJm52X29wZW5fYW5kX3NoYXJlX3MsIDAsIHNpemVvZih6dGVfd2lmaV9vcGVuX2FuZF9zaGFyZV9tb2RlX3NfdHlwZSkpOworCisJCQkJLy9yZWFkIG52CisJCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJtX0F1dGhNb2RlIiwgbnZfYXVfbW9kZSk7CisJCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJtX0VuY3J5cFR5cGUiLCBudl9lY3J5X3R5cGUpOworCQkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgibV9EZWZhdWx0S2V5SUQiLCBudl9vcGVuX2FuZF9zaGFyZV9zLndlcF9rZXlfaW5kZXgpOworCQkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgibV9LZXkxU3RyMSIsIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTEpOworCQkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgibV9LZXkyU3RyMSIsIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTIpOworCQkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgibV9LZXkzU3RyMSIsIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTMpOworCQkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgibV9LZXk0U3RyMSIsIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTQpOworCQkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgibV9LZXkxVHlwZSIsIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTFfbW9kZSk7CisJCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJtX0tleTJUeXBlIiwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5Ml9tb2RlKTsKKwkJCQkodm9pZCl6dGVfd2ViX3JlYWQoIm1fS2V5M1R5cGUiLCBudl9vcGVuX2FuZF9zaGFyZV9zLndlcF9rZXkzX21vZGUpOworCQkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgibV9LZXk0VHlwZSIsIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTRfbW9kZSk7CisKKwkJCQlEZWZhdWx0S2V5SUQgPSB3ZWJzR2V0VmFyKHdwLCBUKCJtX0RlZmF1bHRLZXlJRCIpLCAiIik7CisJCQkJS2V5U3RyWzFdID0gd2Vic0dldFZhcih3cCwgVCgibV9LZXkxU3RyMSIpLCAiIik7CisJCQkJS2V5U3RyWzJdID0gd2Vic0dldFZhcih3cCwgVCgibV9LZXkyU3RyMSIpLCAiIik7CisJCQkJS2V5U3RyWzNdID0gd2Vic0dldFZhcih3cCwgVCgibV9LZXkzU3RyMSIpLCAiIik7CisJCQkJS2V5U3RyWzRdID0gd2Vic0dldFZhcih3cCwgVCgibV9LZXk0U3RyMSIpLCAiIik7CisJCQkJS2V5VHlwZVsxXSA9IHdlYnNHZXRWYXIod3AsIFQoIm1fS2V5MVR5cGUiKSwgIiIpOworCQkJCUtleVR5cGVbMl0gPSB3ZWJzR2V0VmFyKHdwLCBUKCJtX0tleTJUeXBlIiksICIiKTsKKwkJCQlLZXlUeXBlWzNdID0gd2Vic0dldFZhcih3cCwgVCgibV9LZXkzVHlwZSIpLCAiIik7CisJCQkJS2V5VHlwZVs0XSA9IHdlYnNHZXRWYXIod3AsIFQoIm1fS2V5NFR5cGUiKSwgIiIpOworCisJCQkJLy93aGVuIHRoZSB3aWZpIHNldHRpbmcgaGFzIGNoYW5nZWQsdGhlbiBzZXQgdGhlbQorCQkJCWlmIChTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgbnZfYXVfbW9kZSkgJiYgU1RSX0VRVUFMKGVuY3J5cF90eXBlLCBudl9lY3J5X3R5cGUpIFwKKwkJCQkgICAgJiYgU1RSX0VRVUFMKERlZmF1bHRLZXlJRCwgbnZfb3Blbl9hbmRfc2hhcmVfcy53ZXBfa2V5X2luZGV4KSBcCisJCQkJICAgICYmIFNUUl9FUVVBTChLZXlTdHJbMV0sIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTEpICYmIFNUUl9FUVVBTChLZXlTdHJbMl0sIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTIpICYmIFNUUl9FUVVBTChLZXlTdHJbM10sIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTMpICYmIFNUUl9FUVVBTChLZXlTdHJbNF0sIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTQpIFwKKwkJCQkgICAgJiYgU1RSX0VRVUFMKEtleVR5cGVbMV0sIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTFfbW9kZSkgJiYgU1RSX0VRVUFMKEtleVR5cGVbMl0sIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTJfbW9kZSkgJiYgU1RSX0VRVUFMKEtleVR5cGVbM10sIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTNfbW9kZSkgJiYgU1RSX0VRVUFMKEtleVR5cGVbNF0sIG52X29wZW5fYW5kX3NoYXJlX3Mud2VwX2tleTRfbW9kZSkpIHsKKworCQkJCQlwcmludGYoIndpZmk6WyVzXVslc10gbm90IGNoYW5nZWQuXG4iLCBzZWN1cml0eV9tb2RlLCBlbmNyeXBfdHlwZSk7IC8qbGludCAhZTI2Ki8KKwkJCQl9IGVsc2UgeworCQkJCQlTRUNVUklUWV9OVl9XUklURSgibV9BdXRoTW9kZSIsIHNlY3VyaXR5X21vZGUsIG52X3JldCk7CisJCQkJCVNFQ1VSSVRZX05WX1dSSVRFKCJtX0VuY3J5cFR5cGUiLCBlbmNyeXBfdHlwZSwgbnZfcmV0KTsKKworCQkJCQlTRUNVUklUWV9OVl9XUklURSgibV9EZWZhdWx0S2V5SUQiLCBEZWZhdWx0S2V5SUQsIG52X3JldCk7CisKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIm1fS2V5MVN0cjEiLCBLZXlTdHJbMV0sIG52X3JldCk7CisJCQkJCVNFQ1VSSVRZX05WX1dSSVRFKCJtX0tleTJTdHIxIiwgS2V5U3RyWzJdLCBudl9yZXQpOworCQkJCQlTRUNVUklUWV9OVl9XUklURSgibV9LZXkzU3RyMSIsIEtleVN0clszXSwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIm1fS2V5NFN0cjEiLCBLZXlTdHJbNF0sIG52X3JldCk7CisKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIm1fS2V5MVR5cGUiLCBLZXlUeXBlWzFdLCBudl9yZXQpOworCQkJCQlTRUNVUklUWV9OVl9XUklURSgibV9LZXkyVHlwZSIsIEtleVR5cGVbMl0sIG52X3JldCk7CisJCQkJCVNFQ1VSSVRZX05WX1dSSVRFKCJtX0tleTNUeXBlIiwgS2V5VHlwZVszXSwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIm1fS2V5NFR5cGUiLCBLZXlUeXBlWzRdLCBudl9yZXQpOworCisJCQkJCSp3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9TRVRfQVBfTVNTSUQ7CisJCQkJCXdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKTsgLy9hZGRlZCBieSBkdWppYWppYW8KKwkJCQl9CisJCQl9IGVsc2UgaWYgKFNUUl9FUVVBTChzZWN1cml0eV9tb2RlLCBXRl9BVV9PUEVOKSAmJiBTVFJfRVFVQUwoZW5jcnlwX3R5cGUsIFdGX0VOQ1JZX05PTkUpKSB7CisJCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJtX0F1dGhNb2RlIiwgbnZfYXVfbW9kZSk7CisJCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJtX0VuY3J5cFR5cGUiLCBudl9lY3J5X3R5cGUpOworCisJCQkJaWYgKFNUUl9FUVVBTChzZWN1cml0eV9tb2RlLCBudl9hdV9tb2RlKSAmJiBTVFJfRVFVQUwoZW5jcnlwX3R5cGUsIG52X2VjcnlfdHlwZSkpIHsKKwkJCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX05PUk1BTCwid2lmaTpbJXNdWyVzXSBub3QgY2hhbmdlZC5cbiIsIHNlY3VyaXR5X21vZGUsIGVuY3J5cF90eXBlKTsgLypsaW50ICFlMjYqLworCQkJCX0gZWxzZSB7CisJCQkJCVNFQ1VSSVRZX05WX1dSSVRFKCJtX0F1dGhNb2RlIiwgc2VjdXJpdHlfbW9kZSwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIm1fRW5jcnlwVHlwZSIsIGVuY3J5cF90eXBlLCBudl9yZXQpOworCQkJCQkvKiBhZGRlZCBieSBkdWppYWppYW8sIGluIG9wZW4mbm8gZW5jcnlwdCBjb25kaXRpb24sIHRoZXJlIGlzIG5vIHBhc3N3b3JkICAqLworCQkJCQlTRUNVUklUWV9OVl9XUklURShOVl9XSUZJX1dQQV9QQVNTX01fRU5DT0RFLCAiIiwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoTlZfV0lGSV9XUEFfUEFTU19NLCAiIiwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIm1fS2V5MVN0cjEiLCAiIiwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIm1fS2V5MlN0cjEiLCAiIiwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIm1fS2V5M1N0cjEiLCAiIiwgbnZfcmV0KTsKKwkJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIm1fS2V5NFN0cjEiLCAiIiwgbnZfcmV0KTsKKwkJCQkJLyphZGRlZCBieSBkdWppYWppYW8gZW5kICovCisJCQkJCSp3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9TRVRfQVBfTVNTSUQ7CisJCQkJCXdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKTsgLy9hZGRlZCBieSBkdWppYWppYW8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vd2lmaV9hdV9tb2RlIG9yIGVuY3J5cGUgaW52YWxpZAorCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsIndpZmk6WyVzXVslc10gaXMgaW52YWxpZC5cbiIsIHNlY3VyaXR5X21vZGUsIGVuY3J5cF90eXBlKTsgLypsaW50ICFlMjYqLworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgV0ZfQVVfV1BBKSAgfHwgU1RSX0VRVUFMKHNlY3VyaXR5X21vZGUsIFdGX0FVX1dQQTIpIHx8CisJCSAgICAgICAgICAgU1RSX0VRVUFMKHNlY3VyaXR5X21vZGUsIFdGX0FVX1dQQV9XUEEyKSB8fCBTVFJfRVFVQUwoc2VjdXJpdHlfbW9kZSwgV0ZfQVVfV1BBMykgfHwgU1RSX0VRVUFMKHNlY3VyaXR5X21vZGUsIFdGX0FVX1dQQTJfV1BBMykpIHsKKwkJCXp0ZV93aWZpX3dwYV9hbmRfd3BhMl9tb2RlX3NfdHlwZSBudl93cGFfYW5kX3dwYTI7CisJCQltZW1zZXQoJm52X3dwYV9hbmRfd3BhMiwgMCwgc2l6ZW9mKHp0ZV93aWZpX3dwYV9hbmRfd3BhMl9tb2RlX3NfdHlwZSkpOworCisJCQlwYXNzX3BocmFzZV9zdHIgPSB3ZWJzR2V0VmFyKHdwLCBUKE5WX1dJRklfV1BBX1BBU1NfTSksICIiKTsKKwkJCWNpcGhlcl9zdHIgPSB3ZWJzR2V0VmFyKHdwLCBUKCJjaXBoZXIiKSwgIiIpOworCisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInBhc3NfcGhyYXNlX3N0ciA9ICVzIiwgcGFzc19waHJhc2Vfc3RyKTsgICAgIC8qbGludCAhZTI2Ki8KKwkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiY2lwaGVyX3N0ciA9ICVzIiwgY2lwaGVyX3N0cik7ICAvKmxpbnQgIWUyNiovCisKKwkJCS8vYWRkIGJ5IGxpdXlpbmduYW4gZm9yIHNlcnZlciBzYWZlIGZvciB4c3MgYXR0YWNrIHN0YXJ0CisJCQlpZiAoREFUQV9OT19TQUZFID09IHp0ZV9TYWZlX25vU3BlY2lhbENoYXIocGFzc19waHJhc2Vfc3RyKSkgeworCQkJCXByaW50ZigiR2V0IERhdGEgaXMgbm8gU2FmZTpzc2lkOiVzXG4iLCBwYXNzX3BocmFzZV9zdHIpOyAvKmxpbnQgIWUyNiovCisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJLy9hZGQgYnkgbGl1eWluZ25hbiBmb3Igc2VydmVyIHNhZmUgZm9yIHhzcyBhdHRhY2sgZW5kCisKKwkJCXN3aXRjaCAoY2lwaGVyX3N0clswXSkgeworCQkJY2FzZSAnMCc6CisJCQkJc3RybmNweSh3cGFfZW5jcnlfdHlwZSwgV0ZfRU5DUllfVEtJUCwgc2l6ZW9mKHdwYV9lbmNyeV90eXBlKSAtIDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAnMSc6CisJCQkJc3RybmNweSh3cGFfZW5jcnlfdHlwZSwgV0ZfRU5DUllfQUVTLCBzaXplb2Yod3BhX2VuY3J5X3R5cGUpIC0gMSk7CisJCQkJYnJlYWs7CisJCQljYXNlICcyJzoKKwkJCQlzdHJuY3B5KHdwYV9lbmNyeV90eXBlLCBXRl9FTkNSWV9US0lQX0FFUywgc2l6ZW9mKHdwYV9lbmNyeV90eXBlKSAtIDEpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoInVudmFsaWQgZW5jcnkgdHlwZSBbJWNdIiwgZW5jcnlwX3R5cGVbMF0pOy8qbGludCAhZTI2Ki8KKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCSh2b2lkKXp0ZV93ZWJfcmVhZCgibV9BdXRoTW9kZSIsIG52X2F1X21vZGUpOworCQkJKHZvaWQpenRlX3dlYl9yZWFkKCJtX0VuY3J5cFR5cGUiLCBudl9lY3J5X3R5cGUpOworCQkJKHZvaWQpenRlX3dlYl9yZWFkKE5WX1dJRklfV1BBX1BBU1NfTSwgbnZfd3BhX2FuZF93cGEyLnByZV9zaGFyZV9rZXkpOworCisJCQlpZiAoU1RSX0VRVUFMKHNlY3VyaXR5X21vZGUsIG52X2F1X21vZGUpICYmIFNUUl9FUVVBTCh3cGFfZW5jcnlfdHlwZSwgbnZfZWNyeV90eXBlKSAmJiBTVFJfRVFVQUwocGFzc19waHJhc2Vfc3RyLCBudl93cGFfYW5kX3dwYTIucHJlX3NoYXJlX2tleSkpIHsKKworCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19OT1JNQUwsIndpZmk6WyVzXVslc10gbm90IGNoYW5nZWQuXG4iLCBzZWN1cml0eV9tb2RlLCB3cGFfZW5jcnlfdHlwZSk7IC8qbGludCAhZTI2Ki8KKwkJCX0gZWxzZSB7CisJCQkJU0VDVVJJVFlfTlZfV1JJVEUoIm1fQXV0aE1vZGUiLCBzZWN1cml0eV9tb2RlLCBudl9yZXQpOworCQkJCVNFQ1VSSVRZX05WX1dSSVRFKCJtX0VuY3J5cFR5cGUiLCB3cGFfZW5jcnlfdHlwZSwgbnZfcmV0KTsKKwkJCQkvL2FkZCBieSBsaXV5aW5nbmFuIGZvciBTZXJ2ZXIgc2FmZSBzdGFydAorCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywicGFzc19waHJhc2Vfc3RyOiVzLlxuIiwgcGFzc19waHJhc2Vfc3RyKTsgLypsaW50ICFlMjYqLworI2lmZGVmIFdFQlNfU0VDVVJJVFkKKwkJCQlwYXNzX3BocmFzZV9zdHJfZGVjb2RlID0ganNfYWVzX2RlY29kZShwYXNzX3BocmFzZV9zdHIsIHN0cmxlbihwYXNzX3BocmFzZV9zdHIpLCAodW5zaWduZWQgaW50KSZwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCk7CisjZWxzZQorCQkJCXBhc3NfcGhyYXNlX3N0cl9kZWNvZGUgPSAoY2hhciopenRlX2Jhc2U2NF9kZWNvZGUoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwYXNzX3BocmFzZV9zdHIsIHN0cmxlbihwYXNzX3BocmFzZV9zdHIpLCAodW5zaWduZWQgaW50KSZwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCk7CisjZW5kaWYKKwkJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInBhc3NfcGhyYXNlX3N0cl9kZWNvZGU6JXMuXG4iLCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlKTsgLypsaW50ICFlMjYqLworCisJCQkJaWYgKE5VTEwgPT0gcGFzc19waHJhc2Vfc3RyX2RlY29kZSkgeworCQkJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInBhc3NfcGhyYXNlX3N0cl9kZWNvZGU6IHBzdyBpcyBlbXB0eS5cbiIpOy8qbGludCAhZTI2Ki8KKwkJCQkJZnJlZShwYXNzX3BocmFzZV9zdHJfZGVjb2RlKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0JCQorCQkJCXp0ZV9wYXNzX3BocmFzZV9sZW4gPSAocGFzc19waHJhc2Vfc3RyX2RlY29kZV9sZW5ndGggPCBzaXplb2YoenRlX3Bhc3NfcGhyYXNlX3N0cikgPyBwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCA6IHNpemVvZih6dGVfcGFzc19waHJhc2Vfc3RyKSAtIDEpOworCQkJCXNucHJpbnRmKHp0ZV9wYXNzX3BocmFzZV9zdHIsenRlX3Bhc3NfcGhyYXNlX2xlbisxLCIlcyIscGFzc19waHJhc2Vfc3RyX2RlY29kZSk7CisJCQkJLy9zdHJuY3B5KHp0ZV9wYXNzX3BocmFzZV9zdHIsIHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUsIHp0ZV9wYXNzX3BocmFzZV9sZW4pOworCQkJCWZyZWUocGFzc19waHJhc2Vfc3RyX2RlY29kZSk7CisJCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJsb2dpbjMgLT4genRlX3Bhc3NfcGhyYXNlX3N0cjolcy5cbiIsIHp0ZV9wYXNzX3BocmFzZV9zdHIpOyAvL2NvdiBtCisjaWZkZWYgV0VCU19TRUNVUklUWQorCQkJCWlmKHp0ZV9wYXNzX3BocmFzZV9zdHIgJiYgIWNoZWNrX3dlYl9pbnB1dF93aWZpKHp0ZV9wYXNzX3BocmFzZV9zdHIsc3RybGVuKHp0ZV9wYXNzX3BocmFzZV9zdHIpKSkKKwkJCQl7CisJCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsIltnb2FoZWFkXXdpZmlwYXNzMj0lc1xuIix6dGVfcGFzc19waHJhc2Vfc3RyKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwYXNzX3BocmFzZV9iNjRfZW5jb2RlID0genRlX2Jhc2U2NF9lbmNvZGUoenRlX3Bhc3NfcGhyYXNlX3N0ciwgc3RybGVuKHp0ZV9wYXNzX3BocmFzZV9zdHIpKTsKKwkJCQlpZiAoTlVMTCA9PSBwYXNzX3BocmFzZV9iNjRfZW5jb2RlKSB7CisJCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywicGFzc19waHJhc2VfYjY0X2VuY29kZTogcHN3IGlzIE5VTEwuXG4iKTsvKmxpbnQgIWUyNiovCisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJU0VDVVJJVFlfTlZfV1JJVEUoTlZfV0lGSV9XUEFfUEFTU19NX0VOQ09ERSwgcGFzc19waHJhc2VfYjY0X2VuY29kZSwgbnZfcmV0KTsKKwkJCQlmcmVlKHBhc3NfcGhyYXNlX2I2NF9lbmNvZGUpOworCQkJCVNFQ1VSSVRZX05WX1dSSVRFKE5WX1dJRklfV1BBX1BBU1NfTSwgenRlX3Bhc3NfcGhyYXNlX3N0ciwgbnZfcmV0KTsKKwkJCQlTRUNVUklUWV9OVl9XUklURSgibV9XUEFQU0sxX2VuYWVzIiwgcGFzc19waHJhc2Vfc3RyLCBudl9yZXQpOworI2Vsc2UKKwkJCQlTRUNVUklUWV9OVl9XUklURShOVl9XSUZJX1dQQV9QQVNTX01fRU5DT0RFLCBwYXNzX3BocmFzZV9zdHIsIG52X3JldCk7CisJCQkJU0VDVVJJVFlfTlZfV1JJVEUoTlZfV0lGSV9XUEFfUEFTU19NLCB6dGVfcGFzc19waHJhc2Vfc3RyLCBudl9yZXQpOworI2VuZGlmCisJCQkJLy9hZGQgYnkgbGl1eWluZ25hbiBmb3IgU2VydmVyIHNhZmUgZW5kCisJCQkJLy9TRUNVUklUWV9OVl9XUklURShOVl9XSUZJX1dQQV9QQVNTX00sIHBhc3NfcGhyYXNlX3N0ciwgbnZfcmV0KTsKKworCQkJCSp3aWZpX3NldF9mbGFncyB8PSBaVEVfV0xBTl9TRVRfQVBfTVNTSUQ7CisJCQkJd2xhbl9zZXRfY2hhbmdlX3NzaWRfa2V5X3N0YXR1cygpOyAvL2FkZGVkIGJ5IGR1amlhamlhbworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gb3RoZXIgc2VjdXJpdHkgbW9kZSBpcyBpbnZhbGlkCisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJFUlJPUjpzZWN1cml0eSBtb2RlICBpcyBpbnZhbGlkIik7LypsaW50ICFlMjYqLworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJLy9zZWN1cml0eV9tb2RlIGlzIE5VTEwKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwiRVJST1I6c2VjdXJpdHlfbW9kZSBpcyBOVUxMICIpOy8qbGludCAhZTI2Ki8KKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworCit9CisKK3ZvaWQgenRlX3dsYW5fc2V0X3Rzdyh3ZWJzX3Qgd3ApCit7CisJY2hhciAqIG9wZW5FbmFibGUgPSBOVUxMOworCWNoYXIgKiBjbG9zZUVuYWJsZSA9IE5VTEw7CisJY2hhciAqIG9wZW5UaW1lID0gTlVMTDsKKwljaGFyICogY2xvc2VUaW1lID0gTlVMTDsKKwljaGFyIG9sZF9vcGVuX3RpbWVbMTZdID0gezB9OworCWNoYXIgb2xkX2Nsb3NlX3RpbWVbMTZdID0gezB9OworCWNoYXIgb2xkX29wZW5fZW5hYmxlWzE2XSA9IHswfTsKKwljaGFyIHRzd19zbGVlcF90aW1lX2hvdXJbMTZdID0gezB9OworCWNoYXIgdHN3X3NsZWVwX3RpbWVfbWluWzE2XSA9IHswfTsKKwljaGFyIHRzd193YWtlX3RpbWVfaG91clsxNl0gPSB7MH07CisJY2hhciB0c3dfd2FrZV90aW1lX21pblsxNl0gPSB7MH07CisJY2hhciAqdG1wID0gTlVMTDsKKwlpbnQgdHN3X2NoYW5nZV9mbGFnID0gMDsKKwlzY19jZmdfZ2V0KCJvcGVuRW5hYmxlIiwgb2xkX29wZW5fZW5hYmxlLCBzaXplb2Yob2xkX29wZW5fZW5hYmxlKSk7CisKKwlzY19jZmdfZ2V0KCJvcGVuVGltZSIsIG9sZF9vcGVuX3RpbWUsIHNpemVvZihvbGRfb3Blbl90aW1lKSk7CisKKwlzY19jZmdfZ2V0KCJjbG9zZVRpbWUiLCBvbGRfY2xvc2VfdGltZSwgc2l6ZW9mKG9sZF9jbG9zZV90aW1lKSk7CisKKwlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslc11vbGRfb3Blbl9lbmFibGU9JXMsb2xkX29wZW5fdGltZT0lcyxvbGRfY2xvc2VfdGltZT0lc1xuIiwgX19GVU5DVElPTl9fLCBvbGRfb3Blbl9lbmFibGUsIG9sZF9vcGVuX3RpbWUsIG9sZF9jbG9zZV90aW1lKTsKKwlvcGVuRW5hYmxlID0gd2Vic0dldFZhcih3cCwgVCgib3BlbkVuYWJsZSIpLCBUKCIiKSk7CisJY2xvc2VFbmFibGUgPSB3ZWJzR2V0VmFyKHdwLCBUKCJjbG9zZUVuYWJsZSIpLCBUKCIiKSk7CisJb3BlblRpbWUgPSB3ZWJzR2V0VmFyKHdwLCBUKCJvcGVuVGltZSIpLCBUKCIiKSk7CisJY2xvc2VUaW1lID0gd2Vic0dldFZhcih3cCwgVCgiY2xvc2VUaW1lIiksIFQoIiIpKTsKKwlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslc11vcGVuRW5hYmxlPSVzLGNsb3NlRW5hYmxlPSVzLG9wZW5UaW1lPSVzLGNsb3NlVGltZT0lc1xuIiwgX19GVU5DVElPTl9fLCBvcGVuRW5hYmxlLCBjbG9zZUVuYWJsZSwgb3BlblRpbWUsIGNsb3NlVGltZSk7CisKKwkvL2NoZWNrIHRoZSBwYXJhbTogb3BlbkVuYWJsZSAmIGNsb3NlRW5hYmxlCisJaWYgKE5VTEwgPT0gb3BlbkVuYWJsZSB8fCAnXDAnID09ICpvcGVuRW5hYmxlIHx8IE5VTEwgPT0gY2xvc2VFbmFibGUgfHwgJ1wwJyA9PSAqY2xvc2VFbmFibGUpIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwienRlX3dsYW5fc2V0X3RzdzogKipvcGVuL2Nsb3NlKippbnZhbGlkIGlucHV0IHBhcmEuXG4iKTsvKmxpbnQgIWUyNiovCisJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKwkvL2lmIHN3dGljaCBpcyBvcGVuICwgdGhlbiBjaGVjayB0aGUgcGFyYW06IG9wZW5UaW1lICYgY2xvc2VUaW1lCisJaWYgKHN0cmNtcChvcGVuRW5hYmxlLCAiMSIpID09IDApIHsKKwkJaWYgKE5VTEwgPT0gb3BlblRpbWUgfHwgJ1wwJyA9PSAqb3BlblRpbWUgfHwgTlVMTCA9PSBjbG9zZVRpbWUgfHwgJ1wwJyA9PSAqY2xvc2VUaW1lKSB7CisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJ6dGVfd2xhbl9zZXRfdHN3OiAqKm9wZW4qKmludmFsaWQgaW5wdXQgcGFyYTpvcGVuVGltZSAvY2xvc2VUaW1lLlxuIik7LypsaW50ICFlMjYqLworCQkJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIEZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisJfQorCXNjX2NmZ19zZXQoIm9wZW5FbmFibGUiLCBvcGVuRW5hYmxlKTsKKwlzY19jZmdfc2V0KCJjbG9zZUVuYWJsZSIsIGNsb3NlRW5hYmxlKTsKKworCS8vc2VuZCBtc2cgdG8gd2xhbi1zZXJ2ZXIgdG8gY2xvc2UgdGltaW5nIHNsZWVwIHdha2UgdXAKKwlpZiAoc3RyY21wKG9wZW5FbmFibGUsICIwIikgPT0gMCAmJiBzdHJjbXAob2xkX29wZW5fZW5hYmxlLCAiMSIpID09IDApIHsKKwkJdHN3X2NoYW5nZV9mbGFnID0gMTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX05PUk1BTCwic2VuZCB0byB3bGFuLXNlcnZlciA6IE1TR19DTURfV0lGSV9UU1dfQ0xPU0VcbiIpOworCQkvL3p0ZV9zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dJRkksTVNHX0NNRF9XSUZJX1RTV19DTE9TRSwwLE5VTEwpOworCQlpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9XRUJfQ0dJLCBNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9XSUZJX1RTV19DTE9TRSwgMCwgTlVMTCwgMCk7CisKKwl9CisJLy8gMS5pZiBjdXJyZW50IG9wZW5FbmFibGUgaXMgMSwgYW5kIG9sZF9vcGVuX2VuYWJsZSBpcyAwLCB0aGVuIHNlbmQgbXNnIHRvIHdsYW4tc2VydmVyIHRvIHNldHVwIHRzdworCS8vIDIuIGlmIGN1cnJlbnQgb3BlbkVuYWJsZSBpcyAxLCAgYW5kIG9wZW5UaW1lIGlzIGNoYW5nZWQgb3IgY2xvc2VUaW1lIGNoYW5nZWQsIHRoZW4gc2VuZCBtc2cgdG8gd2xhbi1zZXJ2ZXIgdG8gc2V0dXAgdHN3CisJZWxzZSBpZiAoKHN0cmNtcChvcGVuRW5hYmxlLCAiMSIpID09IDAgJiYgc3RyY21wKG9sZF9vcGVuX2VuYWJsZSwgIjAiKSA9PSAwKSB8fCBcCisJICAgICAgICAgKChzdHJjbXAob3BlbkVuYWJsZSwgIjEiKSA9PSAwKSAgJiYgKHN0cmNtcChvcGVuVGltZSwgb2xkX29wZW5fdGltZSkgIT0gMCB8fCBzdHJjbXAoY2xvc2VUaW1lLCBvbGRfY2xvc2VfdGltZSkgIT0gMCkpKSB7CisJCXRzd19jaGFuZ2VfZmxhZyA9IDE7CisKKwkJc2NfY2ZnX3NldCgib3BlblRpbWUiLCBvcGVuVGltZSk7CisJCXNjX2NmZ19zZXQoImNsb3NlVGltZSIsIGNsb3NlVGltZSk7CisJCXNucHJpbnRmKHRzd193YWtlX3RpbWVfaG91ciwgMywgIiVzIiwgb3BlblRpbWUpOworCQlzbnByaW50Zih0c3dfd2FrZV90aW1lX21pbiwgMywgIiVzIiwgb3BlblRpbWUgKyAzKTsKKwkJc25wcmludGYodHN3X3NsZWVwX3RpbWVfaG91ciwgMywgIiVzIiwgY2xvc2VUaW1lKTsKKwkJc25wcmludGYodHN3X3NsZWVwX3RpbWVfbWluLCAzLCAiJXMiLCBjbG9zZVRpbWUgKyAzKTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJ0c3dfd2FrZV90aW1lX2hvdXI6JXMsdHN3X3dha2VfdGltZV9taW46JXNcbiIsIHRzd193YWtlX3RpbWVfaG91ciwgdHN3X3dha2VfdGltZV9taW4pOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInRzd19zbGVlcF90aW1lX2hvdXI6JXMsdHN3X3NsZWVwX3RpbWVfbWluOiVzXG4iLCB0c3dfc2xlZXBfdGltZV9ob3VyLCB0c3dfc2xlZXBfdGltZV9taW4pOworCQlzY19jZmdfc2V0KCJ0c3dfd2FrZV90aW1lX2hvdXIiLCB0c3dfd2FrZV90aW1lX2hvdXIpOworCisJCXNjX2NmZ19zZXQoInRzd193YWtlX3RpbWVfbWluIiwgdHN3X3dha2VfdGltZV9taW4pOworCQlzY19jZmdfc2V0KCJ0c3dfc2xlZXBfdGltZV9ob3VyIiwgdHN3X3NsZWVwX3RpbWVfaG91cik7CisKKwkJc2NfY2ZnX3NldCgidHN3X3NsZWVwX3RpbWVfbWluIiwgdHN3X3NsZWVwX3RpbWVfbWluKTsKKworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfTk9STUFMLCJzZW5kIG1zZyB0byB3bGFuLXNlcnZlciA6IE1TR19DTURfV0lGSV9UU1dfU0VUXG4gIik7CisJCS8venRlX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0lGSSxNU0dfQ01EX1dJRklfVFNXX1NFVCwwLE5VTEwpOworCQlpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9XRUJfQ0dJLCBNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9XSUZJX1RTV19TRVQsIDAsIE5VTEwsIDApOworCX0KKworCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBTVUNDRVNTKTsKK30KKworc3RhdGljIHZvaWQgenRlX2dldF9jdXJfdXNlcl9tYWMoc3RydWN0IGxpc3RfaGVhZCAqRGhjcF9pbmZvX2xpc3QpCit7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKKwljaGFyIGlwYWRkcmVzc1sxNl0gPSB7MH07CisJY2hhciBjbGllbnRfbWFjX2FkZHJbMThdID0gezB9OworCWNoYXIgb2xkX2NsaWVudF9tYWNfYWRkclsxOF0gPSB7MH07CisJREhDUE9GRkVSQUREUl9MSVNUX3QgKiBwX2RoY3BfaW5mbyAgPSBOVUxMOworCisJc2NfY2ZnX2dldCgiY2xpZW50X21hY19hZGRyZXNzIiwgb2xkX2NsaWVudF9tYWNfYWRkciwgc2l6ZW9mKG9sZF9jbGllbnRfbWFjX2FkZHIpKTsKKwlzY19jZmdfZ2V0KE5WX1VTRVJfSVBfQUREUiwgaXBhZGRyZXNzLCBzaXplb2YoaXBhZGRyZXNzKSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwX2RoY3BfaW5mbywgRGhjcF9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJYWRkci5zX2FkZHIgPSBwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLmlwOworCQlpZiAoKHN0cmNtcChpcGFkZHJlc3MsICIiKSAhPSAwKSAmJiAoc3RyY21wKGluZXRfbnRvYShhZGRyKSwgIiIpKSAmJiAoIXN0cmNtcChpcGFkZHJlc3MsIGluZXRfbnRvYShhZGRyKSkpKSB7CisJCQlzbnByaW50ZihjbGllbnRfbWFjX2FkZHIsIDE4LCAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLCBwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLm1hY1swXSwgcF9kaGNwX2luZm8tPmRoY3BfaW5mby5tYWNbMV0sIHBfZGhjcF9pbmZvLT5kaGNwX2luZm8ubWFjWzJdLCBwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLm1hY1szXSwgcF9kaGNwX2luZm8tPmRoY3BfaW5mby5tYWNbNF0sIHBfZGhjcF9pbmZvLT5kaGNwX2luZm8ubWFjWzVdKTsKKwkJCWlmIChzdHJjbXAoY2xpZW50X21hY19hZGRyLCBvbGRfY2xpZW50X21hY19hZGRyKSkgeworCQkJCXNjX2NmZ19zZXQoImNsaWVudF9tYWNfYWRkcmVzcyIsIGNsaWVudF9tYWNfYWRkcik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBESENQT0ZGRVJBRERSX0xJU1RfdCAqZmluZF9tYXRjaF9zdGEoc3RydWN0IGxpc3RfaGVhZCAqZGhjcF9pbmZvX2xpc3QsICBSVF84MDJfMTFfTUFDX0VOVFJZICogcEVudHJ5KQoreworCURIQ1BPRkZFUkFERFJfTElTVF90ICogcF9kaGNwX2luZm8gPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwX2RoY3BfaW5mbywgZGhjcF9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJLy8gIHByaW50ZigiWyVzXSBwX2RoY3BfaW5mbzolZFxuIiwgX19GVU5DVElPTl9fLCBwX2RoY3BfaW5mbyk7CisKKworCQlpZiAoKHBfZGhjcF9pbmZvLT5kaGNwX2luZm8ubWFjWzBdID09IHBFbnRyeS0+QWRkclswXSkgJiYgKHBfZGhjcF9pbmZvLT5kaGNwX2luZm8ubWFjWzFdID09IHBFbnRyeS0+QWRkclsxXSkgJiYKKwkJICAgIChwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLm1hY1syXSA9PSBwRW50cnktPkFkZHJbMl0pICYmIChwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLm1hY1szXSA9PSBwRW50cnktPkFkZHJbM10pICYmCisJCSAgICAocF9kaGNwX2luZm8tPmRoY3BfaW5mby5tYWNbNF0gPT0gcEVudHJ5LT5BZGRyWzRdKSAmJiAocF9kaGNwX2luZm8tPmRoY3BfaW5mby5tYWNbNV0gPT0gcEVudHJ5LT5BZGRyWzVdKSkgeworCisJCQlyZXR1cm4gcF9kaGNwX2luZm87CisKKwkJfQorCX0KKworCisJcmV0dXJuICBOVUxMOworCit9CisKKy8vu/HIoXdpZmkgbGFuv9rQxc+iOiB3aWZpt9a/qtSt0vKjrMHavtPB0LHtus1sZWFzZba8zt63qMf4t9bLrcrHd2lmaaOs1rvT0HdpZmnQvsas1qq1wAordm9pZCB6dGVfd2xhbl9nZXRfc3RhdGlvbl9saXN0KHdlYnNfdCB3cCkKK3sKKwlpbnQgaSAgICAgID0gMDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCUJPT0wgZmlyc3QgCT0gVFJVRTsKKwlCT09MIG1hdGNoICA9IEZBTFNFOworCisJc3RydWN0IGluX2FkZHIgaXBBZGRyICAgICAgICAgICAgICAgICAgID0gezB9OworCVJUXzgwMl8xMV9NQUNfVEFCTEUgc3RhTGlzdCAgICAgICAgICAgICA9IHswfTsKKwlESENQT0ZGRVJBRERSX0xJU1RfdCAqIHBfZGhjcF9pbmZvICAgPSBOVUxMOworCisJc3RydWN0IGxpc3RfaGVhZCBkaGNwX2luZm9fbGlzdDsKKwlJTklUX0xJU1RfSEVBRCgmZGhjcF9pbmZvX2xpc3QpOworCisJenRlX2dldF93aWZpX3N0YV9saXN0KCZzdGFMaXN0KTsKKwlpZiAoc3RhTGlzdC5OdW0gPiBNQVhfTlVNQkVSX09GX01BQykgey8va3cgMiwzCisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsICJzdGFfY291bnQgZXJyLCBOdW09JWRcbiIsIHN0YUxpc3QuTnVtKTsKKwkJcmV0dXJuOworCX0KKwlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslc11zdGFMaXN0Lk51bTolZFxuIiwgX19GVU5DVElPTl9fLCBzdGFMaXN0Lk51bSk7CisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdc3RhX2xpc3QtPkNvbm5lY3RlZFRpbWU6JWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhTGlzdC5FbnRyeVswXS5Db25uZWN0ZWRUaW1lKTsKKwlpZiAoMCA9PSBzdGFMaXN0Lk51bSkgeworCQlzY19jZmdfc2V0KCJjbGllbnRfbWFjX2FkZHJlc3MiLCAiIik7IC8vYWRkZWQgYnkgZHVqaWFqaWFvIDIwMTYtMi0yNAorCX0KKworCXJlc3VsdCA9IHp0ZV9nZXRfbWFjX2xpc3RfZnJvbV9sZWFzZSgmZGhjcF9pbmZvX2xpc3QpOworCisJd2ViX2ZlZWRiYWNrX2hlYWRlcih3cCk7CisJKHZvaWQpd2Vic1dyaXRlKHdwLCBUKCJ7XCIlc1wiOlsiKSwgQ01EX1dJRklfU1RBVElPTl9MSVNUKTsKKworCS8qCisJICAgICAgICBpZigtMSA9PSByZXN1bHQgfHwgLTIgPT0gcmVzdWx0IHx8IC0zID09IHJlc3VsdCkKKwkgICAgICAgIHsKKwkgICAgCSAgICAodm9pZCl3ZWJzV3JpdGUod3AsIFQoIl19IikpOworCSAgICAgICAgICAgIHNhZmVfZnJlZShkaGNwX2luZm9fbGlzdCk7CisJICAgICAgICAgICAgcmV0dXJuOworCSAgICAgICAgfQorCSovCisKKwlpZiAoMCA9PSByZXN1bHQpIHsKKwkJenRlX2dldF9jdXJfdXNlcl9tYWMoJmRoY3BfaW5mb19saXN0KTsvL2FkZGVkIGJ5IGR1amlhamlhbyAyMDE2LTItMjQKKwl9CisKKworCWZvciAoaSA9IDA7IGkgPCBzdGFMaXN0Lk51bTsgaSsrKSB7CisKKwkJaWYgKGZpcnN0ID09IEZBTFNFKSB7CisJCQkodm9pZCl3ZWJzV3JpdGUod3AsIFQoIiwiKSk7CisJCX0gZWxzZSB7CisJCQlmaXJzdCA9IEZBTFNFOworCQl9CisKKwkJaWYgKHN0YUxpc3QuRW50cnlbaV0uQ29ubmVjdGVkVGltZSkgeworCQkJKHZvaWQpd2Vic1dyaXRlKHdwLCBUKCJ7XCIlc1wiOiVsZCwiKSwgV0lGSV9TVEFUSU9OX0NPTk5FQ1RUSU1FLCBzdGFMaXN0LkVudHJ5W2ldLkNvbm5lY3RlZFRpbWUpOworCQl9IGVsc2UgeworCQkJKHZvaWQpd2Vic1dyaXRlKHdwLCBUKCJ7XCIlc1wiOlwiLS1cIiwiKSwgV0lGSV9TVEFUSU9OX0NPTk5FQ1RUSU1FKTsKKwkJfQorCisJCS8qZG8gbm90IHVzZSBtYWNybywgIHRoZSBTU0lEX2luZGV4ID0gMCBpbiBicm9hZGNvbSovCisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzXVNTSURfaW5kZXg6JWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhTGlzdC5FbnRyeVtpXS5TU0lEX2luZGV4KTsKKworCQlpZiAoc3RhTGlzdC5FbnRyeVtpXS5TU0lEX2luZGV4KSB7CisJCQkodm9pZCl3ZWJzV3JpdGUod3AsIFQoIlwiJXNcIjpcIiVkXCIsIiksIFdJRklfU1NJRF9JTkRFWCwgc3RhTGlzdC5FbnRyeVtpXS5TU0lEX2luZGV4KTsKKwkJfQorCisJCSh2b2lkKXdlYnNXcml0ZSh3cCwgVCgiXCIlc1wiOlwid2lmaVwiLCIpLCBXSUZJX1NUQVRJT05fREVWVFlQRSk7CisKKworCQkodm9pZCl3ZWJzV3JpdGUod3AsIFQoIlwiJXNcIjpcIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXCIsIiksIFdJRklfU1RBVElPTl9NQUMsIFwKKwkJICAgICAgICAgICAgICAgIHN0YUxpc3QuRW50cnlbaV0uQWRkclswXSwgc3RhTGlzdC5FbnRyeVtpXS5BZGRyWzFdLCBzdGFMaXN0LkVudHJ5W2ldLkFkZHJbMl0sIHN0YUxpc3QuRW50cnlbaV0uQWRkclszXSwgc3RhTGlzdC5FbnRyeVtpXS5BZGRyWzRdLCBzdGFMaXN0LkVudHJ5W2ldLkFkZHJbNV0pOworCisJCWlmICgocF9kaGNwX2luZm8gPSBmaW5kX21hdGNoX3N0YSgmZGhjcF9pbmZvX2xpc3QsICAmc3RhTGlzdC5FbnRyeVtpXSkpICE9IE5VTEwpIHsKKworCisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsIlslc10gZGhjcF9pbmZvLm1hYz0gJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggXG4iLCBfX0ZVTkNUSU9OX18sIFwKKwkJCSAgICAgICBwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLm1hY1swXSwgcF9kaGNwX2luZm8tPmRoY3BfaW5mby5tYWNbMV0sIHBfZGhjcF9pbmZvLT5kaGNwX2luZm8ubWFjWzJdLCBcCisJCQkgICAgICAgcF9kaGNwX2luZm8tPmRoY3BfaW5mby5tYWNbM10sIHBfZGhjcF9pbmZvLT5kaGNwX2luZm8ubWFjWzRdLCBwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLm1hY1s1XSk7CisKKwkJCWlmIChwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLmlwICE9IE5VTEwpIHsKKworCQkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywiWyVzXWRoY3BfaW5mb19pcDolZFxuIiwgX19GVU5DVElPTl9fLCBwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLmlwKTsKKworCQkJfQorCisJCQlpcEFkZHIuc19hZGRyID0gcF9kaGNwX2luZm8tPmRoY3BfaW5mby5pcDsKKworCQkJaWYgKHN0cmxlbihwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLmhvc3RfbmFtZSkgPiAwKSB7IC8va3cgMyA/PworCQkJCSh2b2lkKXdlYnNXcml0ZSh3cCwgVCgiXCIlc1wiOlwiJXNcIiwiKSwgV0lGSV9TVEFUSU9OX0hPU1ROQU1FLCBwX2RoY3BfaW5mby0+ZGhjcF9pbmZvLmhvc3RfbmFtZSk7CisJCQl9IGVsc2UgeworCQkJCSh2b2lkKXdlYnNXcml0ZSh3cCwgVCgiXCIlc1wiOlwiLS1cIiwiKSwgV0lGSV9TVEFUSU9OX0hPU1ROQU1FKTsKKwkJCX0KKworCQkJaWYgKGluZXRfbnRvYShpcEFkZHIpKSB7CisJCQkJKHZvaWQpd2Vic1dyaXRlKHdwLCBUKCJcIiVzXCI6XCIlc1wiLCIpLCBXSUZJX1NUQVRJT05fSVBBRERSLCBpbmV0X250b2EoaXBBZGRyKSk7CisJCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdZGhjcF9pbmZvX2lwLWluZXRfbnRvYTolc1xuIiwgX19GVU5DVElPTl9fLCBpbmV0X250b2EoaXBBZGRyKSk7CisJCQl9IGVsc2UgeworCQkJCSh2b2lkKXdlYnNXcml0ZSh3cCwgVCgiXCIlc1wiOlwiLS1cIiwiKSwgV0lGSV9TVEFUSU9OX0lQQUREUik7CisJCQl9CisKKwkJCWlmICh6dGVfaXNfc3RhdGljX2RoY3BfaXAoaW5ldF9udG9hKGlwQWRkcikpKSB7CisJCQkJLy8odm9pZCl3ZWJzV3JpdGUod3AsVCgiXCIlc1wiOi0xLCIpLFdJRklfU1RBVElPTl9WQUxJRFRJTUUpOworCQkJCSh2b2lkKXdlYnNXcml0ZSh3cCwgVCgiXCIlc1wiOlwiU1RBVElDXCJ9IiksIFdJRklfU1RBVElPTl9JUFRZUEUpOworCQkJfSBlbHNlIHsKKwkJCQkvLyh2b2lkKXdlYnNXcml0ZSh3cCxUKCJcIiVzXCI6JWxkLCIpLFdJRklfU1RBVElPTl9WQUxJRFRJTUUsIGRoY3BJbmZvLmV4cGlyZXMpOworCQkJCSh2b2lkKXdlYnNXcml0ZSh3cCwgVCgiXCIlc1wiOlwiREhDUFwifSIpLCBXSUZJX1NUQVRJT05fSVBUWVBFKTsKKwkJCX0KKwkJCW1hdGNoID0gRkFMU0U7CisJCX0gZWxzZSB7CisvLzEuICBkY2hwICBub3QgIGdpdmUgYW4gSVAKKy8vMi4gIGN1c3RvbWVyIHNldCBhIHN0YXRpYyBpcAorCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXM6JXNdZG8gbm90IG1hdGNoICsrKysrKysrIFxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXyk7CisKKwkJCSh2b2lkKXdlYnNXcml0ZSh3cCwgVCgiXCIlc1wiOlwiLS1cIiwiKSwgV0lGSV9TVEFUSU9OX0hPU1ROQU1FKTsKKwkJCSh2b2lkKXdlYnNXcml0ZSh3cCwgVCgiXCIlc1wiOlwiLS1cIiwiKSwgV0lGSV9TVEFUSU9OX0lQQUREUik7CisJCQkodm9pZCl3ZWJzV3JpdGUod3AsIFQoIlwiJXNcIjpcIi0tXCJ9IiksIFdJRklfU1RBVElPTl9JUFRZUEUpOworCQl9CisKKwl9CisKKwkodm9pZCl3ZWJzV3JpdGUod3AsIFQoIl19IikpOworCisJZnJlZV9kaGNwX2xpc3QoJmRoY3BfaW5mb19saXN0KTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IHdwc19waW5fY2hlY2tzdW0odW5zaWduZWQgbG9uZyBwaW4pCit7CisJdW5zaWduZWQgbG9uZyBpbnQgYWNjdW0gPSAwOworCXdoaWxlIChwaW4pIHsKKwkJYWNjdW0gKz0gMyAqIChwaW4gJSAxMCk7CisJCXBpbiAvPSAxMDsKKwkJYWNjdW0gKz0gcGluICUgMTA7CisJCXBpbiAvPSAxMDsKKwl9CisKKwlyZXR1cm4gKDEwIC0gYWNjdW0gJSAxMCkgJSAxMDsKK30KKworaW50IG9zX2dldF90aW1lKHN0cnVjdCBvc190aW1lICp0KQoreworCWludCByZXMgPSAwOworCXN0cnVjdCB0aW1ldmFsIHR2OworCXJlcyA9IGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCXQtPnNlYyA9IHR2LnR2X3NlYzsKKwl0LT51c2VjID0gdHYudHZfdXNlYzsKKwlyZXR1cm4gcmVzOworfQorc3RhdGljIGludCBnZXRfcmFuZG9tKHVuc2lnbmVkIGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlGSUxFKiBmOworCXNpemVfdCByYzsKKworCWYgPSBmb3BlbigiL2Rldi91cmFuZG9tIiwgInJiIik7CisJaWYgKGYgPT0gTlVMTCkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJDb3VsZCBub3Qgb3BlbiAvZGV2L3VyYW5kb20uXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJjID0gZnJlYWQoYnVmLCAxLCBsZW4sIGYpOworCS8va3cgMworCWZjbG9zZShmKTsKKwkKKwkvL3ByaW50ZigicmMgaXMgJWQsIGJ1ZiBpcyAlc1xuIiwgcmMsIGJ1Zik7CisJcmV0dXJuIHJjICE9IGxlbiA/IC0xIDogMDsKK30KKworaW50IHJhbmRvbV9nZXRfYnl0ZXModm9pZCogYnVmLCBzaXplX3QgbGVuKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciogYnl0ZXMgPSBidWY7CisKKwlyZXQgPSBnZXRfcmFuZG9tKGJ1ZiwgbGVuKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdwc19nZW5lcmF0ZV9waW4odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKworCS8qR2VuZXJhdGUgc2V2ZW4gcmFuZG9tIGRpZ2l0cyBmb3IgdGhlIFBJTiovCisJaWYgKHJhbmRvbV9nZXRfYnl0ZXMoKHVuc2lnbmVkIGNoYXIgKikgJnZhbCwgc2l6ZW9mKHZhbCkpIDwgMCkgeworCQlzdHJ1Y3Qgb3NfdGltZSBub3c7CisJCW9zX2dldF90aW1lKCZub3cpOworCQl2YWwgPSByYW5kb20oKSBeIG5vdy5zZWMgXiBub3cudXNlYzsKKwl9IGVsc2Ugey8va2xvY3dvcmsKKwkJaWYgKHZhbCA+IDB4RkZGRkZGRjApIHsKKwkJCXN0cnVjdCBvc190aW1lIG5vdzsKKwkJCW9zX2dldF90aW1lKCZub3cpOworCQkJdmFsID0gcmFuZG9tKCkgXiBub3cuc2VjIF4gbm93LnVzZWM7CisJCX0KKwl9CisJdmFsICU9IDEwMDAwMDAwOworCS8vcHJpbnRmKCJ2YWwgaXMgJWxkXG4iLCB2YWwpOworCS8qQXBwZW5kIGNoZWNrc3VtIGRpZ2l0Ki8KKwlyZXR1cm4gdmFsICogMTAgKyB3cHNfcGluX2NoZWNrc3VtKHZhbCk7Cit9CisKK3ZvaWQgenRlX3dsYW5fZ2V0X3dwc19waW4od2Vic190IHdwKQoreworCXVuc2lnbmVkIGxvbmcgcGluY29kZSA9IDA7CisJY2hhciBwaW5bOV0gPSB7MH07CisKKwlwaW5jb2RlID0gd3BzX2dlbmVyYXRlX3BpbigpOworCXNucHJpbnRmKHBpbixzaXplb2YocGluKSwgIiUwOGQiLCBwaW5jb2RlKTsKKworCSh2b2lkKXp0ZV93ZWJfd3JpdGUoTlZfV0lGSV9XUFNfQVBfUElOLCBwaW4pOworCXdlYl9mZWVkYmFja19oZWFkZXIod3ApOworCXp0ZV9yZXN0X2NtZF93cml0ZV9oZWFkKHdwKTsKKwl6dGVfcmVzdF9jbWRfd3JpdGUod3AsIE5WX1dJRklfV1BTX0FQX1BJTiwgcGluLCAwKTsKKwl6dGVfcmVzdF9jbWRfd3JpdGVfZm9vdCh3cCk7Cit9CisKK3ZvaWQgenRlX3dsYW5fZ2V0X3dwc19kZWZwaW4od2Vic190IHdwKQoreworCS8vdW5zaWduZWQgbG9uZyBkZWZwaW5jb2RlID0gMDsKKwljaGFyIHBpbls5XSA9IHswfTsKKwkodm9pZCl6dGVfd2ViX3JlYWQoTlZfV0lGSV9XUFNfREVGX1BJTiwgcGluKTsKKworCXdlYl9mZWVkYmFja19oZWFkZXIod3ApOworCXp0ZV9yZXN0X2NtZF93cml0ZV9oZWFkKHdwKTsKKwl6dGVfcmVzdF9jbWRfd3JpdGUod3AsIE5WX1dJRklfV1BTX0RFRl9QSU4sIHBpbiwgMCk7CisJenRlX3Jlc3RfY21kX3dyaXRlX2Zvb3Qod3ApOworfQorCisKZGlmZiAtLWdpdCBhL2FwL2FwcC9nb2FoZWFkL2ludGVyZmFjZTUuMC93aWZpL3p0ZV93ZWJfbGFuX3V0aWxzLmMgYi9hcC9hcHAvZ29haGVhZC9pbnRlcmZhY2U1LjAvd2lmaS96dGVfd2ViX2xhbl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE1ODg0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9hcHAvZ29haGVhZC9pbnRlcmZhY2U1LjAvd2lmaS96dGVfd2ViX2xhbl91dGlscy5jCkBAIC0wLDAgKzEsMzEwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NCBzdHM9NDogKi8KKy8qCisgKgl3aXJlbGVzcy5jIC0tIFdpcmVsZXNzIFNldHRpbmdzCisgKgorICoJQ29weXJpZ2h0IChjKSBSYWxpbmsgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqCSRJZDogd2lyZWxlc3MuYyx2IDEuOTkuMi40IDIwMDgtMTAtMTcgMTA6NDk6MTcgd2luZnJlZCBFeHAgJAorICovCisKKyNpbmNsdWRlCTxzdGRsaWIuaD4KKyNpbmNsdWRlCTxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlCTxhcnBhL2luZXQuaD4KKyNpbmNsdWRlCTxuZXQvaWYuaD4KKyNpbmNsdWRlCTxuZXQvcm91dGUuaD4KKy8vI2luY2x1ZGUJIi4uLy4uL2F1dG9jb25mLmgiCisjaWZkZWYgQ09ORklHX0RFRkFVTFRTX0tFUk5FTF8yXzZfMjEKKyNpbmNsdWRlCTxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUJPGxpbnV4L3NvY2tldC5oPgorI2VuZGlmCisvLyNpbmNsdWRlCTxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgICAgPHN0cmluZy5oPgorI2luY2x1ZGUgICAgPGRpcmVudC5oPgorLy8jaW5jbHVkZQkibnZyYW0uaCIKKyNpbmNsdWRlCSJ3ZWJzLmgiCisjaW5jbHVkZQkienRlX3dlYl9sYW5fdXRpbHMuaCIKKy8vI2luY2x1ZGUJInp0ZV93ZWJfbGFuX29pZC5oIgorLy8jaW5jbHVkZQkibGludXgvYXV0b2NvbmYuaCIKKyNpbmNsdWRlICAgIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgICAgPHNpZ25hbC5oPgorI2luY2x1ZGUgICAgInp0ZV93ZWJfaW50ZXJmYWNlLmgiCisKKy8qCisgKiBuYW5vc2xlZXAoMikgZG9uJ3QgZGVwZW5kIG9uIHNpZ25hbCBTSUdBTFJNIGFuZCBjb3VsZCBjb29wZXJhdGUgd2l0aAorICogb3RoZXIgU0lHQUxSTS1yZWxhdGVkIGZ1bmN0aW9ucyhleC4gc2V0aXRpbWVyKDIpKQorICovCit1bnNpZ25lZCBpbnQgU2xlZXAodW5zaWduZWQgaW50IHNlY3MpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgdGltZXNwZWMgdHMsIHJlbWFpbjsvKmxpbnQgIWUxMDgwICFlNTY1ICovCisJdHMudHZfc2VjICA9IHNlY3M7LypsaW50ICFlMTE1ICFlMTAxMyAhZTYzICovCisJdHMudHZfbnNlYyA9IDA7LypsaW50ICFlMTE1ICFlMTAxMyAhZTYzICovCitzbGVlcF9hZ2FpbjoKKwlyYyA9IG5hbm9zbGVlcCgmdHMsICZyZW1haW4pOworCWlmIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikgeworCQl0cy50dl9zZWMgPSByZW1haW4udHZfc2VjOy8qbGludCAhZTExNSAhZTEwMTMgIWU2MyAqLworCQl0cy50dl9uc2VjID0gcmVtYWluLnR2X25zZWM7LypsaW50ICFlMTE1ICFlMTAxMyAhZTYzICovCisJCWdvdG8gc2xlZXBfYWdhaW47CisJfQorCXJldHVybiAwOworfQorCitpbnQgc2V0VGltZXIoaW50IG1pY3Jvc2VjLCB2b2lkICgoKnNpZ3JvdXRpbmUpKGludCkpKQoreworCXN0cnVjdCBpdGltZXJ2YWwgdmFsdWUsIG92YWx1ZTsKKwlzaWduYWwoU0lHQUxSTSwgc2lncm91dGluZSk7CisJdmFsdWUuaXRfdmFsdWUudHZfc2VjID0gMDsKKwl2YWx1ZS5pdF92YWx1ZS50dl91c2VjID0gbWljcm9zZWM7CisJdmFsdWUuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKwl2YWx1ZS5pdF9pbnRlcnZhbC50dl91c2VjID0gbWljcm9zZWM7CisJcmV0dXJuIHNldGl0aW1lcihJVElNRVJfUkVBTCwgJnZhbHVlLCAmb3ZhbHVlKTsKK30KK3ZvaWQgc3RvcFRpbWVyKHZvaWQpCit7CisJc3RydWN0IGl0aW1lcnZhbCB2YWx1ZSwgb3ZhbHVlOworCXZhbHVlLml0X3ZhbHVlLnR2X3NlYyA9IDA7CisJdmFsdWUuaXRfdmFsdWUudHZfdXNlYyA9IDA7CisJdmFsdWUuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKwl2YWx1ZS5pdF9pbnRlcnZhbC50dl91c2VjID0gMDsKKwlzZXRpdGltZXIoSVRJTUVSX1JFQUwsICZ2YWx1ZSwgJm92YWx1ZSk7Cit9CisKKy8qCisgKiAgYXJndW1lbnQ6ICBbSU5dICAgICBpbmRleCAtLSB0aGUgaW5kZXggYXJyYXkgb2YgZGVsZXRlZCBpdGVtcyhiZWdpbiBmcm9tIDApCisgKiAgICAgICAgICAgICBbSU5dICAgICBjb3VudCAtLSBkZWxldGVkIGl0bWVzIGNvdW50LgorICogICAgICAgICAgICAgW0lOL09VVF0gdmFsdWUgLS0gb3JpZ2luYWwgc3RyaW5nL3JldHVybiBzdHJpbmcKKyAqICAgICAgICAgICAgIFtJTl0gICAgIGRlbGltaXQgLS0gZGVsaW1pdG9yCisgKi8KK2ludCBkZWxldGVOdGhWYWx1ZU11bHRpKGludCBpbmRleFtdLCBpbnQgY291bnQsIGNoYXIgKnZhbHVlLCBjaGFyIGRlbGltaXQpCit7CisJY2hhciAqYmVnaW4gPSBOVUxMOworCWNoYXIgKmVuZCA9IE5VTEw7CisJaW50IGkgPSAwOworCWludCBqID0gMDsKKwlpbnQgbmVlZF9jaGVja19mbGFnID0gMDsKKwljaGFyICpidWYgPSBzdHJkdXAodmFsdWUpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCSooYnVmK3N0cmxlbih2YWx1ZSkpID0gMDsKKwliZWdpbiA9IGJ1ZjsKKwllbmQgPSBzdHJjaHIoYmVnaW4sIGRlbGltaXQpOworCXdoaWxlIChlbmQpIHsKKwkJaWYgKGkgPT0gaW5kZXhbal0pIHsKKwkJCW1lbXNldChiZWdpbiwgMCwgZW5kIC0gYmVnaW4pOworCQkJaWYgKGluZGV4W2pdID09IDApIHsKKwkJCQluZWVkX2NoZWNrX2ZsYWcgPSAxOworCQkJfQorCQkJaisrOworCQkJaWYgKGogPj0gY291bnQpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQliZWdpbiA9IGVuZDsKKwkJZW5kID0gc3RyY2hyKGJlZ2luICsgMSwgZGVsaW1pdCk7CisJCWkrKzsKKwl9CisJaWYgKCFlbmQgJiYgaW5kZXhbal0gPT0gaSkgeworCQltZW1zZXQoYmVnaW4sIDAsIHN0cmxlbihiZWdpbikpOworCX0KKwlpZiAobmVlZF9jaGVja19mbGFnKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4odmFsdWUpOyBpKyspIHsKKwkJCWlmIChidWZbaV0gPT0gJ1wwJykgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGJ1ZltpXSA9PSAnOycpIHsKKwkJCQlidWZbaV0gPSAnXDAnOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBzdHJsZW4odmFsdWUpOyBpKyspIHsKKwkJaWYgKGJ1ZltpXSAhPSAnXDAnKSB7CisJCQl2YWx1ZVtqKytdID0gYnVmW2ldOworCQl9CisJfQorCXZhbHVlW2pdID0gJ1wwJzsKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzdWJzdGl0dXRpb24gb2YgZ2V0TnRoVmFsdWUgd2hpY2ggZG9zZW4ndCBkZXN0cm95IHRoZSBvcmlnaW5hbCB2YWx1ZQorICovCitpbnQgZ2V0TnRoVmFsdWVTYWZlKGludCBpbmRleCwgY2hhciAqdmFsdWUsIGNoYXIgZGVsaW1pdCwgY2hhciAqcmVzdWx0LCBpbnQgbGVuKQoreworCWludCBpID0gMDsKKwlpbnQgcmVzdWx0X2xlbiA9IDA7CisJY2hhciAqYmVnaW4gPSBOVUxMOworCWNoYXIgKmVuZCA9IE5VTEw7CisJaWYgKCF2YWx1ZSB8fCAhcmVzdWx0IHx8ICFsZW4pIHsKKwkJcmV0dXJuIC0xOworCX0KKwliZWdpbiA9IHZhbHVlOworCWVuZCA9IHN0cmNocihiZWdpbiwgZGVsaW1pdCk7CisJd2hpbGUgKGkgPCBpbmRleCAmJiBlbmQpIHsKKwkJYmVnaW4gPSBlbmQgKyAxOworCQllbmQgPSBzdHJjaHIoYmVnaW4sIGRlbGltaXQpOworCQlpKys7CisJfQorCWlmICghZW5kKSB7CisJCWlmIChpID09IGluZGV4KSB7CisJCQllbmQgPSBiZWdpbiArIHN0cmxlbihiZWdpbik7CisJCQlyZXN1bHRfbGVuID0gKGxlbiAtIDEpIDwgKGVuZCAtIGJlZ2luKSA/IChsZW4gLSAxKSA6IChlbmQgLSBiZWdpbik7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQlyZXN1bHRfbGVuID0gKGxlbiAtIDEpIDwgKGVuZCAtIGJlZ2luKSA/IChsZW4gLSAxKSA6IChlbmQgLSBiZWdpbik7CisJfQorCW1lbWNweShyZXN1bHQsIGJlZ2luLCByZXN1bHRfbGVuKTsKKwkqKHJlc3VsdCArIHJlc3VsdF9sZW4pID0gJ1wwJzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFyZ3VtZW50czogaWZuYW1lICAtIGludGVyZmFjZSBuYW1lCisgKiAgICAgICAgICAgIGlmX2FkZHIgLSBhIDE4LWJ5dGUgYnVmZmVyIHRvIHN0b3JlIG1hYyBhZGRyZXNzCisgKiBkZXNjcmlwdGlvbjogZmV0Y2ggbWFjIGFkZHJlc3MgYWNjb3JkaW5nIHRvIGdpdmVuIGludGVyZmFjZSBuYW1lCisgKi8KK2ludCBnZXRJZk1hYyhjaGFyICppZm5hbWUsIGNoYXIgKmlmX2h3KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJY2hhciAqcHRyID0gTlVMTDsKKwlpbnQgc2tmZCA9IDA7CisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKKwlpZiAoKHNrZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCJnZXRJZk1hYzogb3BlbiBzb2NrZXQgZXJyb3IiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lLCBJRl9OQU1FU0laRS0xKTsKKwlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRkhXQUREUiwgJmlmcikgPCAwKSB7CisJCWNsb3NlKHNrZmQpOworCQlyZXR1cm4gLTE7CisJfQorCXB0ciA9IChjaGFyICopICYgKGlmci5pZnJfYWRkci5zYV9kYXRhKTsgLypsaW50ICFlNTQ1Ki8KKwlzcHJpbnRmKGlmX2h3LCAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLCAocHRyWzBdICYgMDM3NyksIChwdHJbMV0gJiAwMzc3KSwgKHB0clsyXSAmIDAzNzcpLAkocHRyWzNdICYgMDM3NyksIChwdHJbNF0gJiAwMzc3KSwgKHB0cls1XSAmIDAzNzcpKTsKKwljbG9zZShza2ZkKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFyZ3VtZW50czogaWZuYW1lICAtIGludGVyZmFjZSBuYW1lCisgKiAgICAgICAgICAgIGlmX2FkZHIgLSBhIDE2LWJ5dGUgYnVmZmVyIHRvIHN0b3JlIGlwIGFkZHJlc3MKKyAqIGRlc2NyaXB0aW9uOiBmZXRjaCBpcCBhZGRyZXNzLCBuZXRtYXNrIGFzc29jaWF0ZWQgdG8gZ2l2ZW4gaW50ZXJmYWNlIG5hbWUKKyAqLworaW50IGdldElmSXAoY2hhciAqaWZuYW1lLCBjaGFyICppZl9hZGRyKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHNrZmQgPSAwOworCW1lbXNldCgmaWZyLCAwLCBzaXplb2Yoc3RydWN0IGlmcmVxKSk7CisJaWYgKChza2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCJnZXRJZklwOiBvcGVuIHNvY2tldCBlcnJvciIpOworCQlyZXR1cm4gLTE7CisJfQorCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBpZm5hbWUsIElGX05BTUVTSVpFLTEpOworCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGQUREUiwgJmlmcikgPCAwKSB7CisJCWNsb3NlKHNrZmQpOworCQlyZXR1cm4gLTE7CisJfQorCXN0cmNweShpZl9hZGRyLCBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZyLmlmcl9hZGRyKS0+c2luX2FkZHIpKTsKKwljbG9zZShza2ZkKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFyZ3VtZW50czogaW5kZXggLSBpbmRleCBvZiB0aGUgTnRoIHZhbHVlIChzdGFydHMgZnJvbSAwKQorICogICAgICAgICAgICBvbGRfdmFsdWVzIC0gdW4tcGFyc2VkIHZhbHVlcworICogICAgICAgICAgICBuZXdfdmFsdWUgLSBuZXcgdmFsdWUgdG8gYmUgcmVwbGFjZWQKKyAqIGRlc2NyaXB0aW9uOiBwYXJzZSB2YWx1ZXMgZGVsaW1pdGVkIGJ5IHNlbWljb2xvbiwKKyAqICAgICAgICAgICAgICByZXBsYWNlIHRoZSBOdGggdmFsdWUgd2l0aCBuZXdfdmFsdWUsCisgKiAgICAgICAgICAgICAgYW5kIHJldHVybiB0aGUgcmVzdWx0CisgKiBXQVJOSU5HOiByZXR1cm4gdGhlIGludGVybmFsIHN0YXRpYyBzdHJpbmcgLT4gdXNlIGl0IGNhcmVmdWxseQorICovCitjaGFyICpzZXROdGhWYWx1ZShpbnQgaW5kZXgsIGNoYXIgKm9sZF92YWx1ZXMsIGNoYXIgKm5ld192YWx1ZSkKK3sKKwlpbnQgaSA9IDA7CisJY2hhciAqcCA9IE5VTEw7CisJY2hhciAqcSA9IE5VTEw7CisJc3RhdGljIGNoYXIgcmV0WzIwNDhdID0gezB9OworCWNoYXIgYnVmWzhdWzI1Nl0gPSB7MH07CisJbWVtc2V0KHJldCwgMCwgMjA0OCk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQltZW1zZXQoYnVmW2ldLCAwLCAyNTYpOworCX0KKwlmb3IgKGkgPSAwLCBwID0gb2xkX3ZhbHVlcywgcSA9IHN0cmNocihwLCAnOycpOworCSAgICAgaSA8IDggJiYgcSAhPSBOVUxMOworCSAgICAgaSsrLCBwID0gcSArIDEsIHEgPSBzdHJjaHIocCwgJzsnKSkgeworCQkvL3N0cm5jcHkoYnVmW2ldLCBwLCBxIC0gcCk7CisJCWlmIChxIC0gcCA8IHNpemVvZihidWZbaV0pKQorCQkJc25wcmludGYoYnVmW2ldLHEtcCsxLCIlcyIscCk7CisJCWVsc2UKKwkJCXNucHJpbnRmKGJ1ZltpXSxzaXplb2YoYnVmW2ldKSwiJXMiLHApOworCX0KKwlpZiAoaSA8IDgpIHsgLy9rdyAzCisJCS8vc3RyY3B5KGJ1ZltpXSwgcCk7IC8vdGhlIGxhc3Qgb25lCisJCWlmIChzdHJsZW4ocCkgPCBzaXplb2YoYnVmW2ldKSkKKwkJCXNucHJpbnRmKGJ1ZltpXSxzdHJsZW4ocCkrMSwiJXMiLHApOworCQllbHNlCisJCQlzbnByaW50ZihidWZbaV0sc2l6ZW9mKGJ1ZltpXSksIiVzIixwKTsKKwl9CisJc3RybmNweShidWZbaW5kZXhdLCBuZXdfdmFsdWUsIDI1NSk7Ly9jb3YKKwlpbmRleCA9IChpID4gaW5kZXgpID8gaSA6IGluZGV4OworCXN0cm5jYXQocmV0LCBidWZbMF0sc2l6ZW9mKHJldCktc3RybGVuKHJldCktMSk7CisJZm9yIChpID0gMTsgaSA8PSBpbmRleDsgaSsrKSB7CisJCS8vc3RybmNhdChyZXQsICI7IiwgMik7CisJCS8vc3RybmNhdChyZXQsIGJ1ZltpXSwgMjU2KTsKKwkJc25wcmludGYocmV0K3N0cmxlbihyZXQpLHNpemVvZihyZXQpLXN0cmxlbihyZXQpLCI7JXMiLGJ1ZltpXSk7Ly9jb3YKKwl9CisJcCA9IHJldDsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIGRlc2NyaXB0aW9uOiByZXR1cm4gTEFOIGludGVyZmFjZSBuYW1lCisgKi8KK2NoYXIqIGdldExhbklmTmFtZSh2b2lkKQoreworCWNoYXIgbW9kZVsxMjhdID0gezB9OworCXN0YXRpYyBjaGFyICppZl9uYW1lID0gImJyMCI7CisJY2hhciBudW1fc1s2NF0gPSB7MH07CisKKwlzY19jZmdfZ2V0KCJPcGVyYXRpb25Nb2RlIiwgJm1vZGUsIHNpemVvZihtb2RlKSk7CisKKwlpZiAoc3RyY21wKG1vZGUsICIiKSA9PSAwKSB7CisJCXJldHVybiBpZl9uYW1lOworCX0KKwlpZiAoIXN0cm5jbXAobW9kZSwgIjAiLCAyKSkgeyAvKmxpbnQgIWU1MzAqLworCQlpZl9uYW1lID0gImJyMCI7CisJfSBlbHNlIGlmICghc3RybmNtcChtb2RlLCAiMSIsIDIpKSB7CisjaWYgZGVmaW5lZCBDT05GSUdfUkFFVEhfUk9VVEVSIHx8IGRlZmluZWQgQ09ORklHX01BQ19UT19NQUNfTU9ERSB8fCBkZWZpbmVkIENPTkZJR19SVF8zMDUyX0VTVworCQlpZl9uYW1lID0gImJyMCI7CisjZWxpZiBkZWZpbmVkICBDT05GSUdfSUNQTFVTX1BIWSAmJiBDT05GSUdfUlQyODYwVjJfQVBfTUJTUworCQlzY19jZmdfZ2V0KCJCc3NpZE51bSIsICZudW1fcywgc2l6ZW9mKG51bV9zKSk7CisKKwkJaWYgKGF0b2kobnVtX3MpID4gMSkgewkvLyBtdWx0aXBsZSBzc2lkCisJCQlpZl9uYW1lID0gImJyMCI7CisJCX0gZWxzZSB7CisJCQlpZl9uYW1lID0gInJhMCI7CisJCX0KKyNlbHNlCisJCWlmX25hbWUgPSAicmEwIjsKKyNlbmRpZgorCX0gZWxzZSBpZiAoIXN0cm5jbXAobW9kZSwgIjIiLCAyKSkgeworCQlpZl9uYW1lID0gImV0aDIiOworCX0gZWxzZSBpZiAoIXN0cm5jbXAobW9kZSwgIjMiLCAyKSkgeworCQlpZl9uYW1lID0gImJyMCI7CisJfQorCXJldHVybiBpZl9uYW1lOworfS8qbGludCAhZTUyOSovCisKKy8qCisgKiBjb25jYXRlbmF0ZSBhIHN0cmluZyB3aXRoIGFuIGludGVnZXIKKyAqIGV4OiByYWNhdCgiU1NJRCIsIDEpIHdpbGwgcmV0dXJuICJTU0lEMSIKKyAqLworY2hhciAqcmFjYXQoY2hhciAqcywgaW50IGkpCit7CisJc3RhdGljIGNoYXIgc3RyWzMyXSA9IHswfTsKKwlzbnByaW50ZihzdHIsIDMyLCAiJXMlMWQiLCBzLCBpKTsKKwlyZXR1cm4gc3RyOworfQorCmRpZmYgLS1naXQgYS9hcC9hcHAvZ29haGVhZC9pbnRlcmZhY2U1LjAvd2lmaS96dGVfd2ViX2xhbl91dGlscy5oIGIvYXAvYXBwL2dvYWhlYWQvaW50ZXJmYWNlNS4wL3dpZmkvenRlX3dlYl9sYW5fdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNGExNjIwCi0tLSAvZGV2L251bGwKKysrIGIvYXAvYXBwL2dvYWhlYWQvaW50ZXJmYWNlNS4wL3dpZmkvenRlX3dlYl9sYW5fdXRpbHMuaApAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqCXp0ZV93ZWJfd2lyZWxlc3NfdXRpbHMuaCAtLSBXaXJlbGVzcyBDb25maWd1cmF0aW9uIEhlYWRlcgorICoKKyAqCUNvcHlyaWdodCAoYykgWlRFIENvcnBvcmF0aW9uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICoJJElkOiB6dGVfd2ViX3dpcmVsZXNzX3V0aWxzLmgsdiAwLjEgMjAxMC0xMi0xNSAkCisgKiAgQXV0aG9ycyA6CVpIQU9ZT05HIC0gemhhby55b25nM0B6dGUuY29tLmNuPgorICovCisjaWZuZGVmIF9fV0lSRUxFU1NfX0hfXworI2RlZmluZSBfX1dJUkVMRVNTX19IX18KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKy8vI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorLy8jaW5jbHVkZQk8bmV0L2lmLmg+CisvLyNpbmNsdWRlCTxuZXQvcm91dGUuaD4KKworI2lmZGVmIENPTkZJR19ERUZBVUxUU19LRVJORUxfMl82XzIxCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNlbmRpZgorLy8jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKy8vI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorLy8jaW5jbHVkZSAibnZyYW0uaCIKKyNpbmNsdWRlICJ3ZWJzLmgiCisvLyNpbmNsdWRlICJ6dGVfd2ViX2xhbl9vaWQuaCIKKy8vI2luY2x1ZGUgImxpbnV4L2F1dG9jb25mLmgiCisjaW5jbHVkZSAienRlX3dlYl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2RlZmluZSBSVDI4NjBfTlZSQU0gMAorI2RlZmluZSBSVElOSUNfTlZSQU0gMQorI2RlZmluZSBSVDI1NjFfTlZSQU0gMgorI2RlZmluZSBSVERFVl9OVlJBTSAgICAJMQorI2RlZmluZSBDRVJUX05WUkFNICAgIAkyCisjZGVmaW5lIFdBUElfTlZSQU0gICAgCTMKKyNkZWZpbmUgUEFDS0VEICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKyNkZWZpbmUgVVNIT1JUICB1bnNpZ25lZCBzaG9ydAorI2RlZmluZSBVQ0hBUiAgIHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgV1BTX0FQX1RJTUVPVVRfU0VDUwkJCQkxMjAwMDAJCQkJLy8gMTIwIHNlY29uZHMKKyNkZWZpbmUgV1BTX0FQX0NBVENIX0NPTkZJR1VSRURfVElNRVIJMTAwCQkJCQkvLyAwLjEgc2VjIAorI2RlZmluZSBXSUZJUElOIDgKKyNkZWZpbmUgTEZXKHgsIHkpCWRvewkJCQkJCQkJCQkJCVwKKwkJCQkJCWlmKCEgKCB4ID0gd2Vic0dldFZhcih3cCwgVCgjeSksIFQoIiIpKSkpCVwKKwkJCQkJCQlyZXR1cm47CQkJCQkJCQkJXAorCQkJCQl9d2hpbGUoMCkKKworI2RlZmluZSBMRldpKHgsIHkpCWRvewkJCQkJCQkJCQkJCQkJXAorCQkJCQkJY2hhcl90ICp4IyNfc3RyOwkJCQkJCQkJCVwKKwkJCQkJCWlmKCEgKCB4IyNfc3RyID0gd2Vic0dldFZhcih3cCwgVCgjeSksIFQoIiIpKSkpCQlcCisJCQkJCQkJcmV0dXJuOwkJCQkJCQkJCQkJXAorCQkJCQkJeCA9IGF0b2koeCMjX3N0cik7CQkJCQkJCQkJXAorCQkJCQl9d2hpbGUoMCkKKworI2RlZmluZSBMRkYocmVzdWx0LCBudnJhbSwgeCwgbikJXAorCQkJCQkJCWRvewkJY2hhciB0bXBbMTI4XTsJCQkJCQkJCQkJXAorCQkJCQkJCQkJY2hhciBzdHJ4WzUxMl07ICAgXAorCQkJCQkJCQkJc2NfY2ZnX2dldCgjeCxzdHJ4LHNpemVvZihzdHJ4KSk7IFwKKwkJCQkJCQkJCXN0cmNweShzdHJ4LHgpOyBcCisJCQkJCQkJCQlpZigheCkJCQkJXAorCQkJCQkJCQkJCXRtcFswXSA9ICdcMCc7CQkJCQkJCQkJXAorCQkJCQkJCQkJZWxzZXsJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJaWYoIGdldE50aFZhbHVlU2FmZShuLCB4LCAnOycsIHRtcCwgMTI4KSAhPSAtMSl7XAorCQkJCQkJCQkJCQlnc3RybmNhdChyZXN1bHQsIHRtcCwgNDA5Nik7CQkJCVwKKwkJCQkJCQkJCQl9CQkJCQkJCQkJCQkJXAorCQkJCQkJCQkJfWdzdHJuY2F0KHJlc3VsdCwgIlxyIiwgNDA5Nik7CQkJCQkJXAorCQkJCQkJCX13aGlsZSgwKQorCisjZGVmaW5lIGNwcmludGYoZm10LCBhcmdzLi4uKSBkbyB7ICBcCisgICAgRklMRSAqZnAgPSBmb3BlbigiL2Rldi9jb25zb2xlIiwgInciKTsgIFwKKyAgICBpZiAoZnApIHsgICBcCisgICAgICAgIGZwcmludGYoZnAsIGZtdCwgIyMgYXJncyk7ICBcCisgICAgICAgIGZjbG9zZShmcCk7IFwKKyAgICB9ICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBQQkNfV1BTXzM0IDM0CisjZGVmaW5lIFJBTElOS19HUElPX1JFR19JUlEJCTB4MEEKKworI2lmIDAKKyNpZmRlZiBDT05GSUdfUlQyODYwVjJfQVBfV0FQSQorI2RlZmluZSBNQVhfTlVNQkVSX09GX01BQyAgICAgICAgICAgICAgIDk2CisjZWxzZQorI2RlZmluZSBNQVhfTlVNQkVSX09GX01BQyAgICAgICAgICAgICAgIDMyIC8vIGlmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoaXMgdmFsdWUgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gMjExCisjZW5kaWYKKwordHlwZWRlZiB1bmlvbiBfTUFDSFRUUkFOU01JVF9TRVRUSU5HIHsKKwlzdHJ1Y3QgIHsKKwkJdW5zaWduZWQgc2hvcnQgIE1DUzogNzsgLy8gTUNTCisJCXVuc2lnbmVkIHNob3J0ICBCVzogMTsgIC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJCXVuc2lnbmVkIHNob3J0ICBTaG9ydEdJOiAxOworCQl1bnNpZ25lZCBzaG9ydCAgU1RCQzogMjsgLy9TUEFDRQorCQl1bnNpZ25lZCBzaG9ydAllVHhCRjogMTsKKwkJdW5zaWduZWQgc2hvcnQJcnN2OiAxOworCQl1bnNpZ25lZCBzaG9ydAlpVHhCRjogMTsKKwkJdW5zaWduZWQgc2hvcnQgIE1PREU6IDI7IC8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorCX0gZmllbGQ7CisJdW5zaWduZWQgc2hvcnQgICAgICB3b3JkOworfSBNQUNIVFRSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX0VOVFJZIHsKKyNpZmRlZiBDT05GSUdfUlQyODYwVjJfQVBfVjI0X0RBVEFfU1RSVUNUVVJFCisJdW5zaWduZWQgY2hhcgkJCUFwSWR4OworI2VuZGlmCisJdW5zaWduZWQgY2hhciAgICAgICAgICAgQWRkcls2XTsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBBaWQ7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgUHNtOyAgICAgLy8gMDpQV1JfQUNUSVZFLCAxOlBXUl9TQVZFCisJdW5zaWduZWQgY2hhciAgICAgICAgICAgTWltb1BzOyAgLy8gMDpNTVBTX1NUQVRJQywgMTpNTVBTX0RZTkFNSUMsIDM6TU1QU19FbmFibGVkCisJY2hhciAgICAgICAgICAgICAgICAgICAgQXZnUnNzaTA7CisJY2hhciAgICAgICAgICAgICAgICAgICAgQXZnUnNzaTE7CisJY2hhciAgICAgICAgICAgICAgICAgICAgQXZnUnNzaTI7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgQ29ubmVjdGVkVGltZTsKKwlNQUNIVFRSQU5TTUlUX1NFVFRJTkcJVHhSYXRlOworCXVuc2lnbmVkIGludAkJCUxhc3RSeFJhdGU7CisJaW50CQkJCQkJU3RyZWFtU25yWzNdOworCWludAkJCQkJCVNvdW5kaW5nUmVzcFNuclszXTsKK30gUlRfODAyXzExX01BQ19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9NQUNfVEFCTEUgeworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICBOdW07CisJUlRfODAyXzExX01BQ19FTlRSWSAgICAgIEVudHJ5W01BWF9OVU1CRVJfT0ZfTUFDXTsgLy9NQVhfTEVOX09GX01BQ19UQUJMRSA9IDMyCit9IFJUXzgwMl8xMV9NQUNfVEFCTEU7CisKKy8qYWRkIGJ5IG15YyBmb3Igd2lmaV9jbGllbnRfc2hvdyAyMDEyLTA0LTE5IGJlZ2luKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0RIQ1BPRkZFUkFERFIgeworCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKKwl1bnNpZ25lZCBsb25nIGlwOworCXVuc2lnbmVkIGNoYXIgbWFjWzZdOworCXVuc2lnbmVkIGNoYXIgaG9zdF9uYW1lWzIwXTsKKwl1bnNpZ25lZCBjaGFyIHBhZFsyXTsKK30gREhDUE9GRkVSQUREUjsKKworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfV1NDX0NPTkZJR1VSRURfVkFMVUUgeworCVVTSE9SVCBXc2NDb25maWd1cmVkOyAvLyAxIHVuLWNvbmZpZ3VyZWQ7IDIgY29uZmlndXJlZAorCVVDSEFSICAgV3NjU3NpZFszMiArIDFdOworCVVTSE9SVCBXc2NBdXRoTW9kZTsgLy8gbWFuZGF0b3J5LCAweDAxOiBvcGVuLCAweDAyOiB3cGEtcHNrLCAweDA0OiBzaGFyZWQsIDB4MDg6d3BhLCAweDEwOiB3cGEyLCAweAorCVVTSE9SVCAgV3NjRW5jcnlwVHlwZTsgIC8vIDB4MDE6IG5vbmUsIDB4MDI6IHdlcCwgMHgwNDogdGtpcCwgMHgwODogYWVzCisJVUNIQVIgICBEZWZhdWx0S2V5SWR4OworCVVDSEFSICAgV3NjV1BBS2V5WzY0ICsgMV07Cit9IFdTQ19DT05GSUdVUkVEX1ZBTFVFOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGlycTsJCS8vcmVxdWVzdCBpcnEgcGluIG51bWJlcgorCXBpZF90IHBpZDsJCQkvL3Byb2Nlc3MgaWQgdG8gbm90aWZ5Cit9IHJhbGlua19ncGlvX3JlZ19pbmZvOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVM4MDIxMVNTSUQgeworCXVuc2lnbmVkIGludCAgICBTc2lkTGVuZ3RoOyAgIC8vIGxlbmd0aCBvZiBTU0lEIGZpZWxkIGJlbG93LCBpbiBieXRlczsKKwkvLyB0aGlzIGNhbiBiZSB6ZXJvLgorCXVuc2lnbmVkIGNoYXIgICBTc2lkWzMyXTsgLy8gU1NJRCBpbmZvcm1hdGlvbiBmaWVsZAorfSBORElTODAyMTFTU0lEOworCit0eXBlZGVmIHN0cnVjdCAgX1dTQ19DUkVERU5USUFMIHsKKwlORElTODAyMTFTU0lEICAgIFNTSUQ7ICAgICAgICAgICAgICAgLy8gbWFuZGF0b3J5CisJVVNIT1JUICAgICAgICAgICAgICBBdXRoVHlwZTsgICAgICAgICAgIC8vIG1hbmRhdG9yeSwgMTogb3BlbiwgMjogd3BhLXBzaywgNDogc2hhcmVkLCA4OndwYSwgMHgxMDogd3BhMiwgMHgyMDogd3BhLXBzazIKKwlVU0hPUlQgICAgICAgICAgICAgIEVuY3JUeXBlOyAgICAgICAgICAgLy8gbWFuZGF0b3J5LCAxOiBub25lLCAyOiB3ZXAsIDQ6IHRraXAsIDg6IGFlcworCVVDSEFSICAgICAgICAgICAgICAgS2V5WzY0XTsgICAgICAgICAgICAvLyBtYW5kYXRvcnksIE1heGltdW0gNjQgYnl0ZQorCVVTSE9SVCAgICAgICAgICAgICAgS2V5TGVuZ3RoOworCVVDSEFSICAgICAgICAgICAgICAgTWFjQWRkcls2XTsgICAgICAgICAvLyBtYW5kYXRvcnksIEFQIE1BQyBhZGRyZXNzCisJVUNIQVIgICAgICAgICAgICAgICBLZXlJbmRleDsgICAgICAgICAgIC8vIG9wdGlvbmFsLCBkZWZhdWx0IGlzIDEKKwlVQ0hBUiAgICAgICAgICAgICAgIFJzdmRbM107ICAgICAgICAgICAgLy8gTWFrZSBhbGlnbm1lbnQKK30gICBXU0NfQ1JFREVOVElBTCwgKlBXU0NfQ1JFREVOVElBTDsKKwordHlwZWRlZiBzdHJ1Y3QgIF9XU0NfUFJPRklMRSB7CisjaWZuZGVmIFVJTlQKKyNkZWZpbmUgVUlOVAl1bnNpZ25lZCBsb25nCisjZW5kaWYKKwlVSU5UICAgICAgICAgICAJUHJvZmlsZUNudDsKKwlVSU5UCQlBcHBseVByb2ZpbGVJZHg7ICAvLyBhZGQgYnkgam9obmxpLCBmaXggV1BTIHRlc3QgcGxhbiA1LjEuMQorCVdTQ19DUkVERU5USUFMICAJUHJvZmlsZVs4XTsgICAgICAgICAgICAgLy8gU3VwcG9ydCB1cCB0byA4IHByb2ZpbGVzCit9ICAgV1NDX1BST0ZJTEUsICpQV1NDX1BST0ZJTEU7CisKK3R5cGVkZWYgc3RydWN0IF9BRFZBTkNFRF9TRVRUSU5HUyB7CisJY2hhcl90ICpiZ19wcm90ZWN0aW9uOworCWNoYXJfdCAqYmVhY29uOworCWNoYXJfdCAqZHRpbTsKKwljaGFyX3QgKmZyYWdtZW50OworCWNoYXJfdCAqcnRzOworCWNoYXJfdCAqdHhfcG93ZXI7CisJY2hhcl90ICpzaG9ydF9wcmVhbWJsZTsKKwljaGFyX3QgKnNob3J0X3Nsb3Q7CisJY2hhcl90ICp0eF9idXJzdDsKKwljaGFyX3QgKnBrdF9hZ2dyZWdhdGU7CisJY2hhcl90ICppZWVlXzgwMjExaDsKKwljaGFyX3QgKndtbV9jYXBhYmxlOworCWNoYXJfdCAqYXBzZF9jYXBhYmxlOworCWNoYXJfdCAqZGxzX2NhcGFibGU7CisJY2hhcl90ICpjb3VudHJ5Y29kZTsKKwljaGFyX3QgKm0ydV9lbmFibGU7Cit9IEFEVkFOQ0VEX1NFVFRJTkdTOworCisKKworLy90eXBlZGVmIHN0cnVjdCBfREhDUE9GRkVSQUREUiB7CisvLwl1aW50OF90IGhvc3RuYW1lWzE2XTsKKy8vCXVpbnQ4X3QgY2hhZGRyWzE2XTsKKy8vCXVpbnQzMl90IHlpYWRkcjsJLyogbmV0d29yayBvcmRlciAqLworLy8JdWludDMyX3QgZXhwaXJlczsJLyogaG9zdCBvcmRlciAqLworLy99IERIQ1BPRkZFUkFERFI7CisKKworLyphZGQgYnkgbXljIGZvciB3aWZpX2NsaWVudF9zaG93IDIwMTItMDQtMTkgZW5kICovCisKK2V4dGVybiB2b2lkIGZvcm1EZWZpbmVXaXJlbGVzc19BZHZhbmNlZCh2b2lkKTsKK2V4dGVybiB2b2lkIGZvcm1EZWZpbmVXaXJlbGVzc19CYXNpYyh2b2lkKTsKK2V4dGVybiB2b2lkIGZvcm1EZWZpbmVXaXJlbGVzc19TdGFpbmZvKHZvaWQpOworZXh0ZXJuIHZvaWQgZm9ybURlZmluZVdpcmVsZXNzX1NlY3VyaXR5KHZvaWQpOworZXh0ZXJuIHZvaWQgZm9ybURlZmluZVdpcmVsZXNzKHZvaWQpOworZXh0ZXJuIHZvaWQgcmVzdGFydDgwMjFYRGFlbW9uKGludCBudnJhbSk7CitleHRlcm4gdm9pZCB1cGRhdGVGbGFzaDgwMjF4KGludCBudnJhbSk7CitleHRlcm4gdm9pZCBTZWN1cml0eShpbnQgbnZyYW0sIHdlYnNfdCB3cCwgY2hhcl90ICpwYXRoLCBjaGFyX3QgKnF1ZXJ5KTsKK2V4dGVybiB2b2lkIGNvbmZXUEFHZW5lcmFsKGludCBudnJhbSwgd2Vic190IHdwLCBpbnQgbWJzc2lkKTsKK2V4dGVybiB2b2lkIGNvbmZXRVAoaW50IG52cmFtLCB3ZWJzX3Qgd3AsIGludCBtYnNzaWQpOworZXh0ZXJuIHZvaWQgY29uZjgwMjF4KGludCBudnJhbSwgd2Vic190IHdwLCBpbnQgbWJzc2lkKTsKK2V4dGVybiB2b2lkIGdldFNlY3VyaXR5KGludCBudnJhbSwgd2Vic190IHdwLCBjaGFyX3QgKnBhdGgsIGNoYXJfdCAqcXVlcnkpOworZXh0ZXJuIHZvaWQgRGVsZXRlQWNjZXNzUG9saWN5TGlzdChpbnQgbnZyYW0sIHdlYnNfdCB3cCwgY2hhcl90ICpwYXRoLCBjaGFyX3QgKnF1ZXJ5KTsKK2V4dGVybiB2b2lkIHJlc3RhcnRfd2xhbih2b2lkKTsKK2V4dGVybiBjaGFyICpyYWNhdChjaGFyICpzLCBpbnQgaSk7CitleHRlcm4gY2hhciogZ2V0TGFuSWZOYW1lKHZvaWQpOworZXh0ZXJuIGNoYXIgKnNldE50aFZhbHVlKGludCBpbmRleCwgY2hhciAqb2xkX3ZhbHVlcywgY2hhciAqbmV3X3ZhbHVlKTsKK2V4dGVybiBpbnQgZ2V0SWZJcChjaGFyICppZm5hbWUsIGNoYXIgKmlmX2FkZHIpOworZXh0ZXJuIGludCBkZWxldGVOdGhWYWx1ZU11bHRpKGludCBpbmRleFtdLCBpbnQgY291bnQsIGNoYXIgKnZhbHVlLCBjaGFyIGRlbGltaXQpOworZXh0ZXJuIGludCBnZXROdGhWYWx1ZVNhZmUoaW50IGluZGV4LCBjaGFyICp2YWx1ZSwgY2hhciBkZWxpbWl0LCBjaGFyICpyZXN1bHQsIGludCBsZW4pOworZXh0ZXJuIGludCBnZXRJZk1hYyhjaGFyICppZm5hbWUsIGNoYXIgKmlmX2h3KTsKK2V4dGVybiBpbnQgZ2V0SWZJcChjaGFyICppZm5hbWUsIGNoYXIgKmlmX2FkZHIpOworZXh0ZXJuIGNoYXIgKnNldE50aFZhbHVlKGludCBpbmRleCwgY2hhciAqb2xkX3ZhbHVlcywgY2hhciAqbmV3X3ZhbHVlKTsKK2V4dGVybiBjaGFyICpnZXRMYW5JZk5hbWUodm9pZCk7CitleHRlcm4gY2hhciAqcmFjYXQoY2hhciAqcywgaW50IGkpOworZXh0ZXJuIGludCBzZXRUaW1lcihpbnQgbWljcm9zZWMsIHZvaWQgKCgqc2lncm91dGluZSkoaW50KSkpOworZXh0ZXJuIHZvaWQgc3RvcFRpbWVyKHZvaWQpOworZXh0ZXJuIGludCB3bGFuX3RpbWVvdXRfZGVhbChpbnQgZWlkLCB3ZWJzX3Qgd3AsIGludCBhcmdjLCBjaGFyX3QgKiphcmd2KTsKK2V4dGVybiBpbnQgIGdldFdsYW4xMWFDaGFubmVscyhpbnQgZWlkLCB3ZWJzX3Qgd3AsIGludCBhcmdjLCBjaGFyX3QgKiphcmd2KTsKK2V4dGVybiBpbnQgIGdldFdsYW4xMWJDaGFubmVscyhpbnQgZWlkLCB3ZWJzX3Qgd3AsIGludCBhcmdjLCBjaGFyX3QgKiphcmd2KTsKK2V4dGVybiBpbnQgIGdldFdsYW4xMWdDaGFubmVscyhpbnQgZWlkLCB3ZWJzX3Qgd3AsIGludCBhcmdjLCBjaGFyX3QgKiphcmd2KTsKK2V4dGVybiBpbnQgIGdldFdsYW5DaGFubmVsKGludCBlaWQsIHdlYnNfdCB3cCwgaW50IGFyZ2MsIGNoYXJfdCAqKmFyZ3YpOworZXh0ZXJuIGludCAgZ2V0V2xhbkN1cnJlbnRNYWMoaW50IGVpZCwgd2Vic190IHdwLCBpbnQgYXJnYywgY2hhcl90ICoqYXJndik7CitleHRlcm4gaW50ICBnZXRXbGFuV2RzRW5jVHlwZShpbnQgZWlkLCB3ZWJzX3Qgd3AsIGludCBhcmdjLCBjaGFyX3QgKiphcmd2KTsKK2V4dGVybiBpbnQgZGVsZXRlTnRoVmFsdWVNdWx0aShpbnQgaW5kZXhbXSwgaW50IGNvdW50LCBjaGFyICp2YWx1ZSwgY2hhciBkZWxpbWl0KTsJCS8qIGZvciBBY2Nlc3MgUG9saWN5IGxpc3QgZGVsZXRpb24qLworZXh0ZXJuIHZvaWQgRGVsZXRlQWNjZXNzUG9saWN5TGlzdChpbnQgbnZyYW0sIHdlYnNfdCB3cCwgY2hhcl90ICpwYXRoLCBjaGFyX3QgKnF1ZXJ5KTsKK2V4dGVybiB2b2lkIHJldmlzZV9tYnNzX3ZhbHVlKGludCBvbGRfbnVtLCBpbnQgbmV3X251bSk7CitleHRlcm4gdm9pZCByZXN0YXJ0ODAyMVhEYWVtb24oaW50IG52cmFtKTsKK2V4dGVybiB2b2lkIHJlc3RhcnRfd2xhbih2b2lkKTsKK2V4dGVybiB2b2lkIHVwZGF0ZUZsYXNoODAyMXgoaW50IG52cmFtKTsKK2V4dGVybiB2b2lkIFNURnMoaW50IG52cmFtLCBpbnQgaW5kZXgsIGNoYXIgKmZsYXNoX2tleSwgY2hhciAqdmFsdWUpOworZXh0ZXJuIGludCBBY2Nlc3NQb2xpY3lIYW5kbGUod2Vic190IHdwLCBpbnQgbWJzc2lkKTsKK2V4dGVybiBpbnQgZ2V0RExTQnVpbHQoaW50IGVpZCwgd2Vic190IHdwLCBpbnQgYXJnYywgY2hhcl90ICoqYXJndik7CitleHRlcm4gaW50IGdldFdsYW5NMlVCdWlsdChpbnQgZWlkLCB3ZWJzX3Qgd3AsIGludCBhcmdjLCBjaGFyX3QgKiphcmd2KTsKK2V4dGVybiBpbnQgZ2V0V2xhblN0YUluZm8oaW50IGVpZCwgd2Vic190IHdwLCBpbnQgYXJnYywgY2hhcl90ICoqYXJndik7CitleHRlcm4gaW50IGdldFdsYW5TdGFJbmZvX2FwMihpbnQgZWlkLCB3ZWJzX3Qgd3AsIGludCBhcmdjLCBjaGFyX3QgKiphcmd2KTsKK2V4dGVybiB2b2lkIHdpcmVsZXNzR2V0U2VjdXJpdHkod2Vic190IHdwLCBjaGFyX3QgKnBhdGgsIGNoYXJfdCAqcXVlcnkpOworaW5saW5lIHZvaWQgY2xlYXJSYWRpdXNTZXR0aW5nKGludCBudnJhbSwgaW50IG1ic3NpZCk7CitleHRlcm4gdm9pZCBBUFNlY3VyaXR5KHdlYnNfdCB3cCwgY2hhcl90ICpwYXRoLCBjaGFyX3QgKnF1ZXJ5KTsKK2V4dGVybiB2b2lkIEFQRGVsZXRlQWNjZXNzUG9saWN5TGlzdCh3ZWJzX3Qgd3AsIGNoYXJfdCAqcGF0aCwgY2hhcl90ICpxdWVyeSk7CitleHRlcm4gdm9pZCBXUFNSZXN0YXJ0KHZvaWQpOworZXh0ZXJuIHZvaWQgZm9ybURlZmluZVdQUyh2b2lkKTsKK2V4dGVybiB2b2lkIHdwc19yZWdpc3Rlcih2b2lkKTsKK2V4dGVybiB2b2lkIHdpcmVsZXNzYWR2YW5jZWRfZ2V0d2VicGFyYSh3ZWJzX3Qgd3AsIEFEVkFOQ0VEX1NFVFRJTkdTICphZHZhbmNlZF9zZXR0aW5nX2luc2lkZSk7CitleHRlcm4gdm9pZCB3aXJlbGVzc2FkdmFuY2VkX3NldG52KEFEVkFOQ0VEX1NFVFRJTkdTICphZHZhbmNlZF9zZXR0aW5nX2luc2lkZSwgaW50IHNzaWRfbnVtX2luc2lkZSwgaW50IHdsYW5fbW9kZV9pbnNpZGUpOworZXh0ZXJuIHZvaWQgV1BTU2luZ2xlVHJpZ2dlckhhbmRsZXIoaW50IHNpZ25vKTsKKy8qZXh0ZXJuIHZvaWQgTEZXKHdlYnNfdCB3cCxjaGFyX3QgKngsY2hhciAqeSk7CitleHRlcm4gdm9pZCBMRkYoY2hhcl90ICpyZXN1bHQsaW50IG52cmFtLGNoYXJfdCAqeCxpbnQgbik7CitleHRlcm4gdm9pZCBMRldpKHdlYnNfdCB3cCxpbnQgKmludHZhbHVlLGNoYXIgKndlYm5hbWUpOyovCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcC9hcHAvZ29haGVhZC9pbnRlcmZhY2U1LjAvd2lmaS96dGVfd2ViX21nbXRfd2lmaS5jIGIvYXAvYXBwL2dvYWhlYWQvaW50ZXJmYWNlNS4wL3dpZmkvenRlX3dlYl9tZ210X3dpZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42Njc3ZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXAvYXBwL2dvYWhlYWQvaW50ZXJmYWNlNS4wL3dpZmkvenRlX3dlYl9tZ210X3dpZmkuYwpAQCAtMCwwICsxLDQzMSBAQAorI2luY2x1ZGUgInp0ZV93ZWJfbWdtdF93aWZpLmgiCisjaW5jbHVkZSAienRlX3dlYl9pbnRlcmZhY2UuaCIKKwordm9pZCBkZWFsX3F1aWNrX3NldHVwX3dpZmlfYmFzaWNfbWdtdCh3ZWJzX3Qgd3ApCit7CisJY2hhciAqc3NpZF9uYW1lID0gTlVMTDsKKwljaGFyICpzc2lkX2Jyb2FkY2FzdCA9IE5VTEw7CisKKwlzc2lkX25hbWUgPSB3ZWJzR2V0VmFyKHdwLCAiU1NJRF9uYW1lIiwgVCgiIikpOworCXNzaWRfYnJvYWRjYXN0ID0gd2Vic0dldFZhcih3cCwgIlNTSURfQnJvYWRjYXN0IiwgVCgiIikpOworCisJc2NfY2ZnX3NldCgiU1NJRDEiLCBzc2lkX25hbWUpOworCXdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKTsKKwlzY19jZmdfc2V0KCJIaWRlU1NJRCIsIHNzaWRfYnJvYWRjYXN0KTsKK30KKwordm9pZCBkZWFsX3F1aWNrX3NldHVwX3dpZmlfYmFzaWNfbWdtdF8xKHdlYnNfdCB3cCkKK3sKKwljaGFyICpzc2lkX25hbWUgPSBOVUxMOworCWNoYXIgKnNzaWRfYnJvYWRjYXN0ID0gTlVMTDsKKworCXNzaWRfbmFtZSA9IHdlYnNHZXRWYXIod3AsICJzc2lkIiwgVCgiIikpOworCXNzaWRfYnJvYWRjYXN0ID0gd2Vic0dldFZhcih3cCwgImJyb2FkY2FzdFNzaWRFbmFibGVkIiwgVCgiIikpOworCisJc2NfY2ZnX3NldCgiU1NJRDEiLCBzc2lkX25hbWUpOworCisJd2xhbl9zZXRfY2hhbmdlX3NzaWRfa2V5X3N0YXR1cygpOworCisJc2NfY2ZnX3NldCgiSGlkZVNTSUQiLCBzc2lkX2Jyb2FkY2FzdCk7Cit9CisKK3ZvaWQgZGVhbF9xdWlja19zZXR1cF93aWZpX3NlY3VyaXR5X21nbXQod2Vic190IHdwKQoreworCWNoYXIgKnNlY3VyaXR5X21vZGUgPSBOVUxMOworCWNoYXIgKnNoYXJlZF9tb2RlID0gTlVMTDsKKwljaGFyICpwYXNzX3BocmFzZV9zdHIgPSBOVUxMOworCWNoYXJfdCAqY2lwaGVyX3N0ciA9IE5VTEw7CisJdWludDggd3BhX2VuY3J5X3R5cGVbV0ZfRU5DUllfVFlQRV9MRU5dID0gezB9OworCWludCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCA9IDA7CisJY2hhciAqcGFzc19waHJhc2Vfc3RyX2RlY29kZSA9IE5VTEw7CisjaWZkZWYgV0VCU19TRUNVUklUWQorCWNoYXIgKnBhc3NfcGhyYXNlX2I2NF9lbmNvZGUgPSBOVUxMOworI2VuZGlmCisJY2hhciB6dGVfcGFzc19waHJhc2Vfc3RyW1dJRklfUFNXX0RFRkFVTFRfTEVOR1RIXSA9IHswfTsKKwljaGFyIHdpZmlfY3VyX3N0YXRlW1dJRklfU1RBVFVTX0xFTl0gPSB7MH07CisJdW5zaWduZWQgaW50IHdpZmlfc2V0X2ZsYWdzID0gMDsKKwljaGFyIHdpZmlfc2V0X2ZsYWdzX3N0cltOVl9JVEVNX1NUUklOR19MRU5fMjBdID0gezB9OworCisJc2VjdXJpdHlfbW9kZSA9IHdlYnNHZXRWYXIod3AsICJFbmNyeXB0aW9uX01vZGVfaGlkIiwgVCgiIikpOyAgLyogT1BFTiB8IFNIQVJFRCB8IFdQU1BBU0suLi4gICovCisJaWYgKDAgPT0gc3RyY21wKCJTSEFSRUQiLCBzZWN1cml0eV9tb2RlKSB8fAorCSAgICAwID09IHN0cmNtcCgiV0VQQVVUTyIsIHNlY3VyaXR5X21vZGUpKSB7CisJCXNjX2NmZ19zZXQoIkVuY3J5cFR5cGUiLCAiV0VQIik7CisJCS8vc2NfY2ZnX3NldCgiRGVmYXVsdEtleUlEIiwgIjEiKTsKKwkJLy9zY19jZmdfc2V0KCJLZXkxVHlwZSIsIHdlYnNHZXRWYXIod3AsICJXRVAxU2VsZWN0IiwgVCgiIikpKTsKKwkJLy9zY19jZmdfc2V0KCJLZXkxU3RyMSIsIHdlYnNHZXRWYXIod3AsICJOZXR3b3JrX0tleV8xIiwgVCgiIikpKTsKKwkJc2NfY2ZnX3NldCgiRGVmYXVsdEtleUlEIiwgd2Vic0dldFZhcih3cCwgIndlcF9kZWZhdWx0X2tleSIsIFQoIiIpKSk7CisJCXNjX2NmZ19zZXQoIktleTFUeXBlIiwgd2Vic0dldFZhcih3cCwgIldFUDFTZWxlY3QiLCBUKCIiKSkpOworCQlzY19jZmdfc2V0KCJLZXkxU3RyMSIsIHdlYnNHZXRWYXIod3AsICJ3ZXBfa2V5XzEiLCBUKCIiKSkpOworCQlzY19jZmdfc2V0KCJLZXkyVHlwZSIsIHdlYnNHZXRWYXIod3AsICJXRVAyU2VsZWN0IiwgVCgiIikpKTsKKwkJc2NfY2ZnX3NldCgiS2V5MlN0cjEiLCB3ZWJzR2V0VmFyKHdwLCAid2VwX2tleV8yIiwgVCgiIikpKTsKKwkJc2NfY2ZnX3NldCgiS2V5M1R5cGUiLCB3ZWJzR2V0VmFyKHdwLCAiV0VQM1NlbGVjdCIsIFQoIiIpKSk7CisJCXNjX2NmZ19zZXQoIktleTNTdHIxIiwgd2Vic0dldFZhcih3cCwgIndlcF9rZXlfMyIsIFQoIiIpKSk7CisJCXNjX2NmZ19zZXQoIktleTRUeXBlIiwgd2Vic0dldFZhcih3cCwgIldFUDRTZWxlY3QiLCBUKCIiKSkpOworCQlzY19jZmdfc2V0KCJLZXk0U3RyMSIsIHdlYnNHZXRWYXIod3AsICJ3ZXBfa2V5XzQiLCBUKCIiKSkpOworCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7CisJfSBlbHNlIGlmICgwID09IHN0cmNtcChXRl9BVV9PUEVOLCBzZWN1cml0eV9tb2RlKSkgeworCQlzaGFyZWRfbW9kZSAgPSB3ZWJzR2V0VmFyKHdwLCAic2VjdXJpdHlfc2hhcmVkX21vZGUiLCBUKCIiKSk7CisJCWlmICgwID09IHN0cmNtcCgiTk9ORSIsIHNoYXJlZF9tb2RlKSkgeyAgLyogT1BFTi1OT05FICovCisJCQlzY19jZmdfc2V0KCJFbmNyeXBUeXBlIiwgIk5PTkUiKTsKKwkJCXNjX2NmZ19zZXQoTlZfV0lGSV9XUEFfUEFTU19FTkNPREUsICIiKTsKKwkJCXNjX2NmZ19zZXQoTlZfV0lGSV9XUEFfUEFTUywgIiIpOworCQkJc2NfY2ZnX3NldCgiS2V5MVN0cjEiLCAiIik7CisJCQlzY19jZmdfc2V0KCJLZXkyU3RyMSIsICIiKTsKKwkJCXNjX2NmZ19zZXQoIktleTNTdHIxIiwgIiIpOworCQkJc2NfY2ZnX3NldCgiS2V5NFN0cjEiLCAiIik7CisJCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7CisJCX0gZWxzZSB7CisJCQlzY19jZmdfc2V0KCJFbmNyeXBUeXBlIiwgIldFUCIpOworCQkJLy9zY19jZmdfc2V0KCJEZWZhdWx0S2V5SUQiLCAiMSIpOworCQkJLy9zY19jZmdfc2V0KCJLZXkxVHlwZSIsIHdlYnNHZXRWYXIod3AsICJXRVAxU2VsZWN0IiwgVCgiIikpKTsKKwkJCS8vc2NfY2ZnX3NldCgiS2V5MVN0cjEiLCB3ZWJzR2V0VmFyKHdwLCAiTmV0d29ya19LZXlfMSIsIFQoIiIpKSk7CisJCQlzY19jZmdfc2V0KCJEZWZhdWx0S2V5SUQiLCB3ZWJzR2V0VmFyKHdwLCAid2VwX2RlZmF1bHRfa2V5IiwgVCgiIikpKTsKKwkJCXNjX2NmZ19zZXQoIktleTFUeXBlIiwgd2Vic0dldFZhcih3cCwgIldFUDFTZWxlY3QiLCBUKCIiKSkpOworCQkJc2NfY2ZnX3NldCgiS2V5MVN0cjEiLCB3ZWJzR2V0VmFyKHdwLCAid2VwX2tleV8xIiwgVCgiIikpKTsKKwkJCXNjX2NmZ19zZXQoIktleTJUeXBlIiwgd2Vic0dldFZhcih3cCwgIldFUDJTZWxlY3QiLCBUKCIiKSkpOworCQkJc2NfY2ZnX3NldCgiS2V5MlN0cjEiLCB3ZWJzR2V0VmFyKHdwLCAid2VwX2tleV8yIiwgVCgiIikpKTsKKwkJCXNjX2NmZ19zZXQoIktleTNUeXBlIiwgd2Vic0dldFZhcih3cCwgIldFUDNTZWxlY3QiLCBUKCIiKSkpOworCQkJc2NfY2ZnX3NldCgiS2V5M1N0cjEiLCB3ZWJzR2V0VmFyKHdwLCAid2VwX2tleV8zIiwgVCgiIikpKTsKKwkJCXNjX2NmZ19zZXQoIktleTRUeXBlIiwgd2Vic0dldFZhcih3cCwgIldFUDRTZWxlY3QiLCBUKCIiKSkpOworCQkJc2NfY2ZnX3NldCgiS2V5NFN0cjEiLCB3ZWJzR2V0VmFyKHdwLCAid2VwX2tleV80IiwgVCgiIikpKTsKKwkJCXdsYW5fc2V0X2NoYW5nZV9zc2lkX2tleV9zdGF0dXMoKTsKKwkJfQorCX0gZWxzZSBpZiAoMCA9PSBzdHJjbXAoIldQQVBTSyIsIHNlY3VyaXR5X21vZGUpIHx8CisJICAgICAgICAgICAwID09IHN0cmNtcCgiV1BBMlBTSyIsIHNlY3VyaXR5X21vZGUpIHx8CisJICAgICAgICAgICAwID09IHN0cmNtcCgiV1BBUFNLV1BBMlBTSyIsIHNlY3VyaXR5X21vZGUpIHx8CisJICAgICAgICAgICAwID09IHN0cmNtcCgiV1BBM1BlcnNvbmFsIiwgc2VjdXJpdHlfbW9kZSkgfHwKKwkgICAgICAgICAgIDAgPT0gc3RyY21wKCJXUEEyV1BBMyIsIHNlY3VyaXR5X21vZGUpKSB7CisjaWZuZGVmIENPTkZJR19DSElOQV9VTklDT00KKwkJaWYgKFNUUl9FUVVBTChzZWN1cml0eV9tb2RlLCBXRl9BVV9XUEFfV1BBMikpIHsKKwkJCWNpcGhlcl9zdHIgPSB3ZWJzR2V0VmFyKHdwLCBUKCJjaXBoZXJfc3RyIiksIFQoIiIpKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJY2lwaGVyX3N0ciA9IHdlYnNHZXRWYXIod3AsIFQoIldQQV9FTkNSWVBUSU9OX2hpZCIpLCBUKCIiKSk7CisJCX0KKwkJc3dpdGNoIChjaXBoZXJfc3RyWzBdKSB7CisJCWNhc2UgJzAnOgorCQkJc3RybmNweSh3cGFfZW5jcnlfdHlwZSwgV0ZfRU5DUllfVEtJUCwgc2l6ZW9mKHdwYV9lbmNyeV90eXBlKSAtIDEpOworCQkJYnJlYWs7CisJCWNhc2UgJzEnOgorCQkJc3RybmNweSh3cGFfZW5jcnlfdHlwZSwgV0ZfRU5DUllfQUVTLCBzaXplb2Yod3BhX2VuY3J5X3R5cGUpIC0gMSk7CisJCQlicmVhazsKKwkJY2FzZSAnMic6CisJCQlzdHJuY3B5KHdwYV9lbmNyeV90eXBlLCBXRl9FTkNSWV9US0lQX0FFUywgc2l6ZW9mKHdwYV9lbmNyeV90eXBlKSAtIDEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwkJc2NfY2ZnX3NldCgiRW5jcnlwVHlwZSIsIHdwYV9lbmNyeV90eXBlKTsKKworI2lmbmRlZiBDT05GSUdfQ0hJTkFfVU5JQ09NCisJCWlmICgwID09IHN0cmNtcCgiV1BBUFNLV1BBMlBTSyIsIHNlY3VyaXR5X21vZGUpKSB7CisjZW5kaWYKKwkJCXNjX2NmZ19zZXQoImNpcGhlcl9zdHIiLCBjaXBoZXJfc3RyKTsKKworI2lmbmRlZiBDT05GSUdfQ0hJTkFfVU5JQ09NCisJCX0KKyNlbmRpZgorCQlzY19jZmdfc2V0KCJSZWtleU1ldGhvZCIsICJUSU1FIik7CisJCXNjX2NmZ19zZXQoIlJla2V5SW50ZXJ2YWwiLCB3ZWJzR2V0VmFyKHdwLCAiS2V5X1JvdGF0aW9uX0ludGVydmFsX2hpZCIsIFQoIiIpKSk7CisJCS8vIHNjX2NmZ19zZXQoIkRlZmF1bHRLZXlJRCIsICIyIik7CisKKwkJcGFzc19waHJhc2Vfc3RyID0gd2Vic0dldFZhcih3cCwgVCgiV1BBX1ByZVNoYXJlZF9LZXkiKSwgVCgiIikpOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsICJwYXNzX3BocmFzZV9zdHI6JXMuXG4iLCBwYXNzX3BocmFzZV9zdHIpOyAvKmxpbnQgIWUyNiovCisjaWZkZWYgV0VCU19TRUNVUklUWQorCQlwYXNzX3BocmFzZV9zdHJfZGVjb2RlID0ganNfYWVzX2RlY29kZShwYXNzX3BocmFzZV9zdHIsIHN0cmxlbihwYXNzX3BocmFzZV9zdHIpLCAmcGFzc19waHJhc2Vfc3RyX2RlY29kZV9sZW5ndGgpOworI2Vsc2UKKwkJcGFzc19waHJhc2Vfc3RyX2RlY29kZSA9IHp0ZV9iYXNlNjRfZGVjb2RlKChjb25zdCB1bnNpZ25lZCBjaGFyICopcGFzc19waHJhc2Vfc3RyLCBzdHJsZW4ocGFzc19waHJhc2Vfc3RyKSwgJnBhc3NfcGhyYXNlX3N0cl9kZWNvZGVfbGVuZ3RoKTsKKyNlbmRpZgorCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsICJsb2dpbjIgLT4gIHp0ZV9wYXNzd29yZDolcy5cbiIsIHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpOyAvKmxpbnQgIWUyNiovCisKKwkJaWYgKE5VTEwgPT0gcGFzc19waHJhc2Vfc3RyX2RlY29kZSkgeworCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCAicGFzc19waHJhc2Vfc3RyX2RlY29kZTogcHN3IGlzIGVtcHR5LlxuIik7IC8qbGludCAhZTI2Ki8KKwkJCWZyZWUocGFzc19waHJhc2Vfc3RyX2RlY29kZSk7CisJCQlyZXR1cm47CisJCX0KKwkJLy9zdHJuY3B5KHp0ZV9wYXNzX3BocmFzZV9zdHIsIHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUsIHBhc3NfcGhyYXNlX3N0cl9kZWNvZGVfbGVuZ3RoKTsKKwkJaWYocGFzc19waHJhc2Vfc3RyX2RlY29kZV9sZW5ndGggPj0gc2l6ZW9mKHp0ZV9wYXNzX3BocmFzZV9zdHIpKQorCQkJc25wcmludGYoenRlX3Bhc3NfcGhyYXNlX3N0cixzaXplb2YoenRlX3Bhc3NfcGhyYXNlX3N0ciksIiVzIixwYXNzX3BocmFzZV9zdHJfZGVjb2RlKTsKKwkJZWxzZQorCQkJc25wcmludGYoenRlX3Bhc3NfcGhyYXNlX3N0cixwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCsxLCIlcyIscGFzc19waHJhc2Vfc3RyX2RlY29kZSk7CisJCWZyZWUocGFzc19waHJhc2Vfc3RyX2RlY29kZSk7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywgImxvZ2luMyAtPiB6dGVfcHN3X2FkbWluOiVzLlxuIiwgenRlX3Bhc3NfcGhyYXNlX3N0cik7IC8vY292IG0KKworI2lmZGVmIFdFQlNfU0VDVVJJVFkKKwkJcGFzc19waHJhc2VfYjY0X2VuY29kZSA9IHp0ZV9iYXNlNjRfZW5jb2RlKHp0ZV9wYXNzX3BocmFzZV9zdHIsIHN0cmxlbih6dGVfcGFzc19waHJhc2Vfc3RyKSk7CisJCWlmIChOVUxMID09IHBhc3NfcGhyYXNlX2I2NF9lbmNvZGUpIHsKKwkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywicGFzc19waHJhc2VfYjY0X2VuY29kZTogcHN3IGlzIE5VTEwuXG4iKTsvKmxpbnQgIWUyNiovCisJCQlyZXR1cm47CisJCX0KKwkJc2NfY2ZnX3NldChOVl9XSUZJX1dQQV9QQVNTX0VOQ09ERSwgcGFzc19waHJhc2VfYjY0X2VuY29kZSk7CisJCWZyZWUocGFzc19waHJhc2VfYjY0X2VuY29kZSk7CisJCXNjX2NmZ19zZXQoTlZfV0lGSV9XUEFfUEFTUywgenRlX3Bhc3NfcGhyYXNlX3N0cik7CisJCXNjX2NmZ19zZXQoIldQQVBTSzFfZW5hZXMiLCBwYXNzX3BocmFzZV9zdHIpOworI2Vsc2UKKwkJc2NfY2ZnX3NldChOVl9XSUZJX1dQQV9QQVNTX0VOQ09ERSwgcGFzc19waHJhc2Vfc3RyKTsKKwkJc2NfY2ZnX3NldChOVl9XSUZJX1dQQV9QQVNTLCB6dGVfcGFzc19waHJhc2Vfc3RyKTsKKyNlbmRpZgorCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7CisJfSBlbHNlIGlmICgwID09IHN0cmNtcCgiV0FQSVNLIiwgc2VjdXJpdHlfbW9kZSkpIHsKKwkJc2NfY2ZnX3NldCgiUmVrZXlNZXRob2QiLCAiVElNRSIpOworCQlzY19jZmdfc2V0KCJSZWtleUludGVydmFsIiwgd2Vic0dldFZhcih3cCwgIktleV9Sb3RhdGlvbl9JbnRlcnZhbF9oaWQiLCBUKCIiKSkpOworCQlzY19jZmdfc2V0KCJ3YXBpVHlwZSIsICIyIik7CisJCXBhc3NfcGhyYXNlX3N0ciA9IHdlYnNHZXRWYXIod3AsIFQoIldQQV9QcmVTaGFyZWRfS2V5IiksIFQoIiIpKTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCAicGFzc19waHJhc2Vfc3RyOiVzLlxuIiwgcGFzc19waHJhc2Vfc3RyKTsgLypsaW50ICFlMjYqLworI2lmZGVmIFdFQlNfU0VDVVJJVFkKKwkJcGFzc19waHJhc2Vfc3RyX2RlY29kZSA9IGpzX2Flc19kZWNvZGUocGFzc19waHJhc2Vfc3RyLCBzdHJsZW4ocGFzc19waHJhc2Vfc3RyKSwgJnBhc3NfcGhyYXNlX3N0cl9kZWNvZGVfbGVuZ3RoKTsKKyNlbHNlCisJCXBhc3NfcGhyYXNlX3N0cl9kZWNvZGUgPSB6dGVfYmFzZTY0X2RlY29kZSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXBhc3NfcGhyYXNlX3N0ciwgc3RybGVuKHBhc3NfcGhyYXNlX3N0ciksICZwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCk7CisjZW5kaWYKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCAibG9naW4yIC0+IHp0ZV9wYXNzd29yZDolcy5cbiIsIHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpOyAvKmxpbnQgIWUyNiovCisKKwkJaWYgKE5VTEwgPT0gcGFzc19waHJhc2Vfc3RyX2RlY29kZSkgeworCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCAicGFzc19waHJhc2Vfc3RyX2RlY29kZTogcHN3IGlzIGVtcHR5LlxuIik7IC8qbGludCAhZTI2Ki8KKwkJCWZyZWUocGFzc19waHJhc2Vfc3RyX2RlY29kZSk7CisJCQlyZXR1cm47CisJCX0KKwkJLy9zdHJuY3B5KHp0ZV9wYXNzX3BocmFzZV9zdHIsIHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUsIHBhc3NfcGhyYXNlX3N0cl9kZWNvZGVfbGVuZ3RoKTsKKwkJaWYocGFzc19waHJhc2Vfc3RyX2RlY29kZV9sZW5ndGggPj0gc2l6ZW9mKHp0ZV9wYXNzX3BocmFzZV9zdHIpKQorCQkJc25wcmludGYoenRlX3Bhc3NfcGhyYXNlX3N0cixzaXplb2YoenRlX3Bhc3NfcGhyYXNlX3N0ciksIiVzIixwYXNzX3BocmFzZV9zdHJfZGVjb2RlKTsKKwkJZWxzZQorCQkJc25wcmludGYoenRlX3Bhc3NfcGhyYXNlX3N0cixwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCsxLCIlcyIscGFzc19waHJhc2Vfc3RyX2RlY29kZSk7CisJCWZyZWUocGFzc19waHJhc2Vfc3RyX2RlY29kZSk7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywgImxvZ2luMyAtPiB6dGVfcHN3X2FkbWluOiVzLlxuIiwgenRlX3Bhc3NfcGhyYXNlX3N0cik7IC8qbGludCAhZTI2Ki8KKworI2lmZGVmIFdFQlNfU0VDVVJJVFkKKwkJcGFzc19waHJhc2VfYjY0X2VuY29kZSA9IHp0ZV9iYXNlNjRfZW5jb2RlKHp0ZV9wYXNzX3BocmFzZV9zdHIsIHN0cmxlbih6dGVfcGFzc19waHJhc2Vfc3RyKSk7CisJCWlmIChOVUxMID09IHBhc3NfcGhyYXNlX2I2NF9lbmNvZGUpIHsKKwkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywicGFzc19waHJhc2VfYjY0X2VuY29kZTogcHN3IGlzIE5VTEwuXG4iKTsvKmxpbnQgIWUyNiovCisJCQlyZXR1cm47CisJCX0KKwkJc2NfY2ZnX3NldChOVl9XSUZJX1dQQV9QQVNTX0VOQ09ERSwgcGFzc19waHJhc2VfYjY0X2VuY29kZSk7CisJCWZyZWUocGFzc19waHJhc2VfYjY0X2VuY29kZSk7CisJCXNjX2NmZ19zZXQoTlZfV0lGSV9XUEFfUEFTUywgenRlX3Bhc3NfcGhyYXNlX3N0cik7CisJCXNjX2NmZ19zZXQoIldQQVBTSzFfZW5hZXMiLCBwYXNzX3BocmFzZV9zdHIpOworI2Vsc2UKKwkJc2NfY2ZnX3NldChOVl9XSUZJX1dQQV9QQVNTX0VOQ09ERSwgcGFzc19waHJhc2Vfc3RyKTsKKwkJc2NfY2ZnX3NldChOVl9XSUZJX1dQQV9QQVNTLCB6dGVfcGFzc19waHJhc2Vfc3RyKTsKKyNlbmRpZgorCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuOworCX0KKworCXNjX2NmZ19zZXQoIkF1dGhNb2RlIiwgc2VjdXJpdHlfbW9kZSk7CisJLy9zY19jZmdfc2V0KCJJRUVFODAyMVgiLCAiMCIpOworCisJLypUQkQ6bm90aWZ5IHdpZmkgbW9kdWxlIHRvIG1ha2UgcGFyYW1ldGVycyBnbyBpbnRvIGVmZmVjdCovCisJLy8odm9pZClzbnByaW50Zih3aWZpX3NldF9mbGFnc19zdHIsc2l6ZW9mKHdpZmlfc2V0X2ZsYWdzX3N0ciktMSwiJXUiLHdpZmlfc2V0X2ZsYWdzKTsKKwkvLyh2b2lkKXp0ZV93ZWJfd3JpdGUoV0lGSV9OVl9JVEVNX1dJRklfU0VUX0ZMQUdTLCB3aWZpX3NldF9mbGFnc19zdHIpOworCS8vc2xvZyhNSVNDX1BSSU5ULFNMT0dfREVCVUcsInp0ZV93bGFuX3NzaWQxX3NldDogd2lmaV9zZXRfZmxhZ3MgWyV1XSB0byBbJXNdLiIsIHdpZmlfc2V0X2ZsYWdzLHdpZmlfc2V0X2ZsYWdzX3N0cik7LypsaW50ICFlMjYqLworCS8vcHJpbnRmKCIgZGVhbF9xdWlja19zZXR1cF93aWZpX3NlY3VyaXR5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAxMTExMVxuIik7CisKKwlzY19jZmdfZ2V0KCJ3aWZpX2N1cl9zdGF0ZSIsIHdpZmlfY3VyX3N0YXRlLCBzaXplb2Yod2lmaV9jdXJfc3RhdGUpKTsKKwlwcmludGYoIlslc113aWZpX2N1cl9zdGF0ZSBpcyAlc1xuIiwgX19GVU5DVElPTl9fLCB3aWZpX2N1cl9zdGF0ZSk7CisJaWYgKHN0cmNtcCh3aWZpX2N1cl9zdGF0ZSwgV0lGSV9PUEVORUQpICE9IDApIHsKKwkJcHJpbnRmKCJbJXNdd2lmaV9jdXJfc3RhdGUgaXMgMCwgd2lmaSBpcyBvZmYsIGRvbid0IHNlbmQgbXNnIHRvIHdsYW4tc2VydmVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCQorCXdpZmlfc2V0X2ZsYWdzID0gWlRFX1dMQU5fU1NJRF9TRVR8WlRFX1dMQU5fQlJPQURDQVNUX1NFVHxaVEVfV0xBTl9CQVNJQ19TRUNVUklUWV9TRVQ7CisJKHZvaWQpc25wcmludGYod2lmaV9zZXRfZmxhZ3Nfc3RyLCBzaXplb2Yod2lmaV9zZXRfZmxhZ3Nfc3RyKSAtIDEsICIldSIsIHdpZmlfc2V0X2ZsYWdzKTsKKwkodm9pZCl6dGVfd2ViX3dyaXRlKFdJRklfTlZfSVRFTV9XSUZJX1NFVF9GTEFHUywgd2lmaV9zZXRfZmxhZ3Nfc3RyKTsKKwkKKwlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfTk9STUFMLCAic2VuZCB3aWZpIHBhcmEgdG8gd2xhbi1zZXJ2ZXJAc3NpZDEiKTsgLypsaW50ICFlMjYqLworCS8venRlX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0lGSSxNU0dfQ01EX1dJRklfU1NJRCxOVUxMLE5VTEwpOworCWlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dFQl9DR0ksIE1PRFVMRV9JRF9XSUZJLCBNU0dfQ01EX1dJRklfQ0ZHX0FQLCAwLCBOVUxMLCAwKTsKKworCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywgIndpZmkgc2V0IGNtZCBkb25lISIpOwkvKmxpbnQgIWUyNiovCisKKwlyZXR1cm47Cit9CisKKwordm9pZCBkZWFsX3F1aWNrX3NldHVwX3dpZmlfc2VjdXJpdHlfbWdtdF8xKHdlYnNfdCB3cCkKK3sKKwljaGFyICpzZWN1cml0eV9tb2RlID0gTlVMTDsKKwljaGFyICpzaGFyZWRfbW9kZSA9IE5VTEw7CisJY2hhciAqcGFzc19waHJhc2Vfc3RyID0gTlVMTDsKKwljaGFyX3QgKmNpcGhlcl9zdHIgPSBOVUxMOworCXVpbnQ4IHdwYV9lbmNyeV90eXBlW1dGX0VOQ1JZX1RZUEVfTEVOXSA9IHswfTsKKwlpbnQgcGFzc19waHJhc2Vfc3RyX2RlY29kZV9sZW5ndGggPSAwOworCWNoYXIgKnBhc3NfcGhyYXNlX3N0cl9kZWNvZGUgPSBOVUxMOworI2lmZGVmIFdFQlNfU0VDVVJJVFkKKwljaGFyICpwYXNzX3BocmFzZV9iNjRfZW5jb2RlID0gTlVMTDsKKyNlbmRpZgorCWNoYXIgenRlX3Bhc3NfcGhyYXNlX3N0cltXSUZJX1BTV19ERUZBVUxUX0xFTkdUSF0gPSB7MH07CisJY2hhciB3aWZpX2N1cl9zdGF0ZVtXSUZJX1NUQVRVU19MRU5dID0gezB9OworCXNlY3VyaXR5X21vZGUgPSB3ZWJzR2V0VmFyKHdwLCAic2VjdXJpdHlfbW9kZSIsIFQoIiIpKTsgIC8qIE9QRU4gfCBTSEFSRUQgfCBXUFNQQVNLLi4uICAqLworCWlmICgwID09IHN0cmNtcCgiU0hBUkVEIiwgc2VjdXJpdHlfbW9kZSkgfHwKKwkgICAgMCA9PSBzdHJjbXAoIldFUEFVVE8iLCBzZWN1cml0eV9tb2RlKSkgeworCQlzY19jZmdfc2V0KCJFbmNyeXBUeXBlIiwgIldFUCIpOworCQkvL3NjX2NmZ19zZXQoIkRlZmF1bHRLZXlJRCIsICIxIik7CisJCS8vc2NfY2ZnX3NldCgiS2V5MVR5cGUiLCB3ZWJzR2V0VmFyKHdwLCAiV0VQMVNlbGVjdCIsIFQoIiIpKSk7CisJCS8vc2NfY2ZnX3NldCgiS2V5MVN0cjEiLCB3ZWJzR2V0VmFyKHdwLCAiTmV0d29ya19LZXlfMSIsIFQoIiIpKSk7CisJCXNjX2NmZ19zZXQoIkRlZmF1bHRLZXlJRCIsIHdlYnNHZXRWYXIod3AsICJ3ZXBfZGVmYXVsdF9rZXkiLCBUKCIiKSkpOworCQlzY19jZmdfc2V0KCJLZXkxVHlwZSIsIHdlYnNHZXRWYXIod3AsICJXRVAxU2VsZWN0IiwgVCgiIikpKTsKKwkJc2NfY2ZnX3NldCgiS2V5MVN0cjEiLCB3ZWJzR2V0VmFyKHdwLCAid2VwX2tleV8xIiwgVCgiIikpKTsKKwkJc2NfY2ZnX3NldCgiS2V5MlR5cGUiLCB3ZWJzR2V0VmFyKHdwLCAiV0VQMlNlbGVjdCIsIFQoIiIpKSk7CisJCXNjX2NmZ19zZXQoIktleTJTdHIxIiwgd2Vic0dldFZhcih3cCwgIndlcF9rZXlfMiIsIFQoIiIpKSk7CisJCXNjX2NmZ19zZXQoIktleTNUeXBlIiwgd2Vic0dldFZhcih3cCwgIldFUDNTZWxlY3QiLCBUKCIiKSkpOworCQlzY19jZmdfc2V0KCJLZXkzU3RyMSIsIHdlYnNHZXRWYXIod3AsICJ3ZXBfa2V5XzMiLCBUKCIiKSkpOworCQlzY19jZmdfc2V0KCJLZXk0VHlwZSIsIHdlYnNHZXRWYXIod3AsICJXRVA0U2VsZWN0IiwgVCgiIikpKTsKKwkJc2NfY2ZnX3NldCgiS2V5NFN0cjEiLCB3ZWJzR2V0VmFyKHdwLCAid2VwX2tleV80IiwgVCgiIikpKTsKKwkJd2xhbl9zZXRfY2hhbmdlX3NzaWRfa2V5X3N0YXR1cygpOworCX0gZWxzZSBpZiAoMCA9PSBzdHJjbXAoV0ZfQVVfT1BFTiwgc2VjdXJpdHlfbW9kZSkpIHsKKwkJc2hhcmVkX21vZGUgID0gd2Vic0dldFZhcih3cCwgInNlY3VyaXR5X3NoYXJlZF9tb2RlIiwgVCgiIikpOworCQlpZiAoMCA9PSBzdHJjbXAoIk5PTkUiLCBzaGFyZWRfbW9kZSkpIHsgIC8qIE9QRU4tTk9ORSAqLworCQkJc2NfY2ZnX3NldCgiRW5jcnlwVHlwZSIsICJOT05FIik7CisJCQlzY19jZmdfc2V0KE5WX1dJRklfV1BBX1BBU1NfRU5DT0RFLCAiIik7CisJCQlzY19jZmdfc2V0KE5WX1dJRklfV1BBX1BBU1MsICIiKTsKKwkJCXNjX2NmZ19zZXQoIktleTFTdHIxIiwgIiIpOworCQkJc2NfY2ZnX3NldCgiS2V5MlN0cjEiLCAiIik7CisJCQlzY19jZmdfc2V0KCJLZXkzU3RyMSIsICIiKTsKKwkJCXNjX2NmZ19zZXQoIktleTRTdHIxIiwgIiIpOworCQkJd2xhbl9zZXRfY2hhbmdlX3NzaWRfa2V5X3N0YXR1cygpOworCQl9IGVsc2UgeworCQkJc2NfY2ZnX3NldCgiRW5jcnlwVHlwZSIsICJXRVAiKTsKKwkJCS8vc2NfY2ZnX3NldCgiRGVmYXVsdEtleUlEIiwgIjEiKTsKKwkJCS8vc2NfY2ZnX3NldCgiS2V5MVR5cGUiLCB3ZWJzR2V0VmFyKHdwLCAiV0VQMVNlbGVjdCIsIFQoIiIpKSk7CisJCQkvL3NjX2NmZ19zZXQoIktleTFTdHIxIiwgd2Vic0dldFZhcih3cCwgIk5ldHdvcmtfS2V5XzEiLCBUKCIiKSkpOworCQkJc2NfY2ZnX3NldCgiRGVmYXVsdEtleUlEIiwgd2Vic0dldFZhcih3cCwgIndlcF9kZWZhdWx0X2tleSIsIFQoIiIpKSk7CisJCQlzY19jZmdfc2V0KCJLZXkxVHlwZSIsIHdlYnNHZXRWYXIod3AsICJXRVAxU2VsZWN0IiwgVCgiIikpKTsKKwkJCXNjX2NmZ19zZXQoIktleTFTdHIxIiwgd2Vic0dldFZhcih3cCwgIndlcF9rZXlfMSIsIFQoIiIpKSk7CisJCQlzY19jZmdfc2V0KCJLZXkyVHlwZSIsIHdlYnNHZXRWYXIod3AsICJXRVAyU2VsZWN0IiwgVCgiIikpKTsKKwkJCXNjX2NmZ19zZXQoIktleTJTdHIxIiwgd2Vic0dldFZhcih3cCwgIndlcF9rZXlfMiIsIFQoIiIpKSk7CisJCQlzY19jZmdfc2V0KCJLZXkzVHlwZSIsIHdlYnNHZXRWYXIod3AsICJXRVAzU2VsZWN0IiwgVCgiIikpKTsKKwkJCXNjX2NmZ19zZXQoIktleTNTdHIxIiwgd2Vic0dldFZhcih3cCwgIndlcF9rZXlfMyIsIFQoIiIpKSk7CisJCQlzY19jZmdfc2V0KCJLZXk0VHlwZSIsIHdlYnNHZXRWYXIod3AsICJXRVA0U2VsZWN0IiwgVCgiIikpKTsKKwkJCXNjX2NmZ19zZXQoIktleTRTdHIxIiwgd2Vic0dldFZhcih3cCwgIndlcF9rZXlfNCIsIFQoIiIpKSk7CisJCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7CisJCX0KKwl9IGVsc2UgaWYgKDAgPT0gc3RyY21wKCJXUEFQU0siLCBzZWN1cml0eV9tb2RlKSB8fAorCSAgICAgICAgICAgMCA9PSBzdHJjbXAoIldQQTJQU0siLCBzZWN1cml0eV9tb2RlKSB8fAorCSAgICAgICAgICAgMCA9PSBzdHJjbXAoIldQQVBTS1dQQTJQU0siLCBzZWN1cml0eV9tb2RlKSB8fAorCSAgICAgICAgICAgMCA9PSBzdHJjbXAoIldQQTNQZXJzb25hbCIsIHNlY3VyaXR5X21vZGUpIHx8CisJICAgICAgICAgICAwID09IHN0cmNtcCgiV1BBMldQQTMiLCBzZWN1cml0eV9tb2RlKSkgeworCQljaXBoZXJfc3RyID0gd2Vic0dldFZhcih3cCwgVCgiY2lwaGVyIiksIFQoIiIpKTsKKwkJc3dpdGNoIChjaXBoZXJfc3RyWzBdKSB7CisJCWNhc2UgJzAnOgorCQkJc3RybmNweSh3cGFfZW5jcnlfdHlwZSwgV0ZfRU5DUllfVEtJUCwgc2l6ZW9mKHdwYV9lbmNyeV90eXBlKSAtIDEpOworCQkJYnJlYWs7CisJCWNhc2UgJzEnOgorCQkJc3RybmNweSh3cGFfZW5jcnlfdHlwZSwgV0ZfRU5DUllfQUVTLCBzaXplb2Yod3BhX2VuY3J5X3R5cGUpIC0gMSk7CisJCQlicmVhazsKKwkJY2FzZSAnMic6CisJCQlzdHJuY3B5KHdwYV9lbmNyeV90eXBlLCBXRl9FTkNSWV9US0lQX0FFUywgc2l6ZW9mKHdwYV9lbmNyeV90eXBlKSAtIDEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwkJc2NfY2ZnX3NldCgiRW5jcnlwVHlwZSIsIHdwYV9lbmNyeV90eXBlKTsKKworI2lmbmRlZiBDT05GSUdfQ0hJTkFfVU5JQ09NCisJCWlmICgwID09IHN0cmNtcCgiV1BBUFNLV1BBMlBTSyIsIHNlY3VyaXR5X21vZGUpKSB7CisjZW5kaWYKKwkJCXNjX2NmZ19zZXQoImNpcGhlcl9zdHIiLCBjaXBoZXJfc3RyKTsKKworI2lmbmRlZiBDT05GSUdfQ0hJTkFfVU5JQ09NCisJCX0KKyNlbmRpZgorCQlzY19jZmdfc2V0KCJSZWtleU1ldGhvZCIsICJUSU1FIik7CisJCXNjX2NmZ19zZXQoIlJla2V5SW50ZXJ2YWwiLCB3ZWJzR2V0VmFyKHdwLCAiS2V5X1JvdGF0aW9uX0ludGVydmFsX2hpZCIsIFQoIiIpKSk7CisJCS8vIHNjX2NmZ19zZXQoIkRlZmF1bHRLZXlJRCIsICIyIik7CisKKwkJcGFzc19waHJhc2Vfc3RyID0gd2Vic0dldFZhcih3cCwgVCgicGFzc3BocmFzZSIpLCBUKCIiKSk7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywgInBhc3NfcGhyYXNlX3N0cjolcy5cbiIsIHBhc3NfcGhyYXNlX3N0cik7IC8qbGludCAhZTI2Ki8KKwkJcGFzc19waHJhc2Vfc3RyX2RlY29kZSA9IHp0ZV9iYXNlNjRfZGVjb2RlKChjb25zdCB1bnNpZ25lZCBjaGFyICopcGFzc19waHJhc2Vfc3RyLCBzdHJsZW4ocGFzc19waHJhc2Vfc3RyKSwgJnBhc3NfcGhyYXNlX3N0cl9kZWNvZGVfbGVuZ3RoKTsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCAibG9naW4yIC0+ICB6dGVfcGFzc3dvcmQ6JXMuXG4iLCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlKTsgLypsaW50ICFlMjYqLworCisJCWlmIChOVUxMID09IHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpIHsKKwkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywgInBhc3NfcGhyYXNlX3N0cl9kZWNvZGU6IHBzdyBpcyBlbXB0eS5cbiIpOyAvKmxpbnQgIWUyNiovCisJCQlmcmVlKHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpOworCQkJcmV0dXJuOworCQl9CisJCS8vc3RybmNweSh6dGVfcGFzc19waHJhc2Vfc3RyLCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlLCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCk7CisJCWlmKHBhc3NfcGhyYXNlX3N0cl9kZWNvZGVfbGVuZ3RoID49IHNpemVvZih6dGVfcGFzc19waHJhc2Vfc3RyKSkKKwkJCXNucHJpbnRmKHp0ZV9wYXNzX3BocmFzZV9zdHIsc2l6ZW9mKHp0ZV9wYXNzX3BocmFzZV9zdHIpLCIlcyIscGFzc19waHJhc2Vfc3RyX2RlY29kZSk7CisJCWVsc2UKKwkJCXNucHJpbnRmKHp0ZV9wYXNzX3BocmFzZV9zdHIscGFzc19waHJhc2Vfc3RyX2RlY29kZV9sZW5ndGgrMSwiJXMiLHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpOworCQlmcmVlKHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsICJsb2dpbjMgLT4genRlX3Bzd19hZG1pbjolcy5cbiIsIHp0ZV9wYXNzX3BocmFzZV9zdHIpOyAvL2NvdiBtCisKKyNpZmRlZiBXRUJTX1NFQ1VSSVRZCisJCXBhc3NfcGhyYXNlX2I2NF9lbmNvZGUgPSB6dGVfYmFzZTY0X2VuY29kZSh6dGVfcGFzc19waHJhc2Vfc3RyLCBzdHJsZW4oenRlX3Bhc3NfcGhyYXNlX3N0cikpOworCQlpZiAoTlVMTCA9PSBwYXNzX3BocmFzZV9iNjRfZW5jb2RlKSB7CisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInBhc3NfcGhyYXNlX2I2NF9lbmNvZGU6IHBzdyBpcyBOVUxMLlxuIik7LypsaW50ICFlMjYqLworCQkJcmV0dXJuOworCQl9CisJCXNjX2NmZ19zZXQoTlZfV0lGSV9XUEFfUEFTU19FTkNPREUsIHBhc3NfcGhyYXNlX2I2NF9lbmNvZGUpOworCQlmcmVlKHBhc3NfcGhyYXNlX2I2NF9lbmNvZGUpOworI2Vsc2UKKwkJc2NfY2ZnX3NldChOVl9XSUZJX1dQQV9QQVNTX0VOQ09ERSwgcGFzc19waHJhc2Vfc3RyKTsKKyNlbmRpZgorCQlzY19jZmdfc2V0KE5WX1dJRklfV1BBX1BBU1MsIHp0ZV9wYXNzX3BocmFzZV9zdHIpOworCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7CisJfSBlbHNlIGlmICgwID09IHN0cmNtcCgiV0FQSVNLIiwgc2VjdXJpdHlfbW9kZSkpIHsKKwkJc2NfY2ZnX3NldCgiUmVrZXlNZXRob2QiLCAiVElNRSIpOworCQlzY19jZmdfc2V0KCJSZWtleUludGVydmFsIiwgd2Vic0dldFZhcih3cCwgIktleV9Sb3RhdGlvbl9JbnRlcnZhbF9oaWQiLCBUKCIiKSkpOworCQlzY19jZmdfc2V0KCJ3YXBpVHlwZSIsICIyIik7CisJCXBhc3NfcGhyYXNlX3N0ciA9IHdlYnNHZXRWYXIod3AsIFQoInBhc3NwaHJhc2UiKSwgVCgiIikpOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsICJwYXNzX3BocmFzZV9zdHI6JXMuXG4iLCBwYXNzX3BocmFzZV9zdHIpOyAvKmxpbnQgIWUyNiovCisJCXBhc3NfcGhyYXNlX3N0cl9kZWNvZGUgPSB6dGVfYmFzZTY0X2RlY29kZSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXBhc3NfcGhyYXNlX3N0ciwgc3RybGVuKHBhc3NfcGhyYXNlX3N0ciksICZwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCk7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywgImxvZ2luMiAtPiB6dGVfcGFzc3dvcmQ6JXMuXG4iLCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlKTsgLypsaW50ICFlMjYqLworCisJCWlmIChOVUxMID09IHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpIHsKKwkJCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywgInBhc3NfcGhyYXNlX3N0cl9kZWNvZGU6IHBzdyBpcyBlbXB0eS5cbiIpOyAvKmxpbnQgIWUyNiovCisJCQlmcmVlKHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpOworCQkJcmV0dXJuOworCQl9CisJCS8vc3RybmNweSh6dGVfcGFzc19waHJhc2Vfc3RyLCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlLCBwYXNzX3BocmFzZV9zdHJfZGVjb2RlX2xlbmd0aCk7CisJCWlmKHBhc3NfcGhyYXNlX3N0cl9kZWNvZGVfbGVuZ3RoID49IHNpemVvZih6dGVfcGFzc19waHJhc2Vfc3RyKSkKKwkJCXNucHJpbnRmKHp0ZV9wYXNzX3BocmFzZV9zdHIsc2l6ZW9mKHp0ZV9wYXNzX3BocmFzZV9zdHIpLCIlcyIscGFzc19waHJhc2Vfc3RyX2RlY29kZSk7CisJCWVsc2UKKwkJCXNucHJpbnRmKHp0ZV9wYXNzX3BocmFzZV9zdHIscGFzc19waHJhc2Vfc3RyX2RlY29kZV9sZW5ndGgrMSwiJXMiLHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpOworCQlmcmVlKHBhc3NfcGhyYXNlX3N0cl9kZWNvZGUpOworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsICJsb2dpbjMgLT4genRlX3Bzd19hZG1pbjolcy5cbiIsIHp0ZV9wYXNzX3BocmFzZV9zdHIpOyAvKmxpbnQgIWUyNiovCisKKyNpZmRlZiBXRUJTX1NFQ1VSSVRZCisJCXBhc3NfcGhyYXNlX2I2NF9lbmNvZGUgPSB6dGVfYmFzZTY0X2VuY29kZSh6dGVfcGFzc19waHJhc2Vfc3RyLCBzdHJsZW4oenRlX3Bhc3NfcGhyYXNlX3N0cikpOworCQlpZiAoTlVMTCA9PSBwYXNzX3BocmFzZV9iNjRfZW5jb2RlKSB7CisJCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfREVCVUcsInBhc3NfcGhyYXNlX2I2NF9lbmNvZGU6IHBzdyBpcyBOVUxMLlxuIik7LypsaW50ICFlMjYqLworCQkJcmV0dXJuOworCQl9CisJCXNjX2NmZ19zZXQoTlZfV0lGSV9XUEFfUEFTU19FTkNPREUsIHBhc3NfcGhyYXNlX2I2NF9lbmNvZGUpOworCQlmcmVlKHBhc3NfcGhyYXNlX2I2NF9lbmNvZGUpOworI2Vsc2UKKwkJc2NfY2ZnX3NldChOVl9XSUZJX1dQQV9QQVNTX0VOQ09ERSwgcGFzc19waHJhc2Vfc3RyKTsKKyNlbmRpZgorCQlzY19jZmdfc2V0KE5WX1dJRklfV1BBX1BBU1MsIHp0ZV9wYXNzX3BocmFzZV9zdHIpOworCQl3bGFuX3NldF9jaGFuZ2Vfc3NpZF9rZXlfc3RhdHVzKCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuOworCX0KKworCXNjX2NmZ19zZXQoIkF1dGhNb2RlIiwgc2VjdXJpdHlfbW9kZSk7CisJLy9zY19jZmdfc2V0KCJJRUVFODAyMVgiLCAiMCIpOworCisJLypUQkQ6bm90aWZ5IHdpZmkgbW9kdWxlIHRvIG1ha2UgcGFyYW1ldGVycyBnbyBpbnRvIGVmZmVjdCovCisJLy8odm9pZClzbnByaW50Zih3aWZpX3NldF9mbGFnc19zdHIsc2l6ZW9mKHdpZmlfc2V0X2ZsYWdzX3N0ciktMSwiJXUiLHdpZmlfc2V0X2ZsYWdzKTsKKwkvLyh2b2lkKXp0ZV93ZWJfd3JpdGUoV0lGSV9OVl9JVEVNX1dJRklfU0VUX0ZMQUdTLCB3aWZpX3NldF9mbGFnc19zdHIpOworCS8vc2xvZyhNSVNDX1BSSU5ULFNMT0dfREVCVUcsInp0ZV93bGFuX3NzaWQxX3NldDogd2lmaV9zZXRfZmxhZ3MgWyV1XSB0byBbJXNdLiIsIHdpZmlfc2V0X2ZsYWdzLHdpZmlfc2V0X2ZsYWdzX3N0cik7LypsaW50ICFlMjYqLworCS8vcHJpbnRmKCIgZGVhbF9xdWlja19zZXR1cF93aWZpX3NlY3VyaXR5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAxMTExMVxuIik7CisKKwlzY19jZmdfZ2V0KCJ3aWZpX2N1cl9zdGF0ZSIsIHdpZmlfY3VyX3N0YXRlLCBzaXplb2Yod2lmaV9jdXJfc3RhdGUpKTsKKwlpZiAoc3RyY21wKHdpZmlfY3VyX3N0YXRlLCBXSUZJX09QRU5FRCkgIT0gMCkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfTk9STUFMLCJbJXNdd2lmaV9jdXJfc3RhdGUgaXMgMCwgd2lmaSBpcyBvZmYsIGRvbid0IHNlbmQgbXNnIHRvIHdsYW4tc2VydmVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCXNsb2coTUlTQ19QUklOVCwgU0xPR19OT1JNQUwsICJzZW5kIHdpZmkgcGFyYSB0byB3bGFuLXNlcnZlckBzc2lkMSIpOyAvKmxpbnQgIWUyNiovCisJLy96dGVfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9XSUZJLE1TR19DTURfV0lGSV9TU0lELE5VTEwsTlVMTCk7CisJaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0VCX0NHSSwgTU9EVUxFX0lEX1dJRkksIE1TR19DTURfV0lGSV9DRkdfQVAsIDAsIE5VTEwsIDApOworCXNsb2coTUlTQ19QUklOVCwgU0xPR19ERUJVRywgIndpZmkgc2V0IGNtZCBkb25lISIpOwkvKmxpbnQgIWUyNiovCisKKwlyZXR1cm47Cit9CisKK3ZvaWQgZGVhbF9xdWlja19zZXR1cF93cHNfbWdtdCh3ZWJzX3Qgd3ApCit7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvYXAvYXBwL2dvYWhlYWQvaW50ZXJmYWNlNS4wL3dpZmkvenRlX3dlYl9tZ210X3dpZmkuaCBiL2FwL2FwcC9nb2FoZWFkL2ludGVyZmFjZTUuMC93aWZpL3p0ZV93ZWJfbWdtdF93aWZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyN2E3NgotLS0gL2Rldi9udWxsCisrKyBiL2FwL2FwcC9nb2FoZWFkL2ludGVyZmFjZTUuMC93aWZpL3p0ZV93ZWJfbWdtdF93aWZpLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBaVEVfV0VCX01HTVRfV0lGSV9ICisjZGVmaW5lIFpURV9XRUJfTUdNVF9XSUZJX0gKKworI2luY2x1ZGUgIndlYnMuaCIKKworZXh0ZXJuIHZvaWQgZGVhbF9xdWlja19zZXR1cF93aWZpX2Jhc2ljX21nbXQod2Vic190IHdwKTsKK2V4dGVybiB2b2lkIGRlYWxfcXVpY2tfc2V0dXBfd2lmaV9zZWN1cml0eV9tZ210KHdlYnNfdCB3cCk7CitleHRlcm4gdm9pZCBkZWFsX3F1aWNrX3NldHVwX3dwc19tZ210KHdlYnNfdCB3cCk7CisKKy8vc3RhcnQ6Zm9yIE1GOTEwVworZXh0ZXJuIHZvaWQgZGVhbF9xdWlja19zZXR1cF93aWZpX2Jhc2ljX21nbXRfMSh3ZWJzX3Qgd3ApOworZXh0ZXJuIHZvaWQgZGVhbF9xdWlja19zZXR1cF93aWZpX3NlY3VyaXR5X21nbXQod2Vic190IHdwKTsKKy8vZW5kOmZvciBNRjkxMFcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcC9hcHAvZ29haGVhZC9pbnRlcmZhY2U1LjAvd2lmaS96dGVfd2ViX3dsYW5fc3RhdGlvbi5jIGIvYXAvYXBwL2dvYWhlYWQvaW50ZXJmYWNlNS4wL3dpZmkvenRlX3dlYl93bGFuX3N0YXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42M2I4ZGQwCi0tLSAvZGV2L251bGwKKysrIGIvYXAvYXBwL2dvYWhlYWQvaW50ZXJmYWNlNS4wL3dpZmkvenRlX3dlYl93bGFuX3N0YXRpb24uYwpAQCAtMCwwICsxLDEzNjcgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiCw5sioy/nT0CAoQykyMDE1LCDJ7tvaytDW0NDLzajRtrnJt93T0M/euavLvqGjCisqCisqIM7EvP7D+7PGo7ogenRlX3dlYl93bGFuX3N0YXRpb24uYworKiDOxLz+serKtqO6CisqIMTayN3VqtKqo7oKKyogxuTL/Mu1w/ejugorKiC1scewsOaxvqO6IFYwLjEKKyog1/cgICAg1d+juiBYVUpJQU4KKyogzeqzycjVxtqjuiAyMDE1LTAzLTA5CisqCisqINDeuMS8x8K8MaO6CisqINDeuMTE2sjdo7qz9cq8sOaxvgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgICAgInp0ZV93ZWJfaW50ZXJmYWNlLmgiCisKKworI2RlZmluZSBXRUJfV0xBTl9TVEFUSU9OX01PREVfV0lGSV9QUkVGICJ3aWZpX3ByZWYiCisjZGVmaW5lIFdFQl9XTEFOX1NUQVRJT05fTU9ERV9ESUFMX1BSRUYgImRpYWxfcHJlZiIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9DT05ORUNUSU9OX0xFTiAgIDEKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9NT0RFX0xFTiAgIDEwCisKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9JUF9TVEFUVVNfQ09OTkVDVCAiY29ubmVjdCIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9JUF9TVEFUVVNfRElTQ09OTkVDVCAiZGlzY29ubmVjdCIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9JUF9TVEFUVVNfQ09OTkVDVElORyAiY29ubmVjdGluZyIKKyNkZWZpbmUgV0lGSV9TVEFUSU9OX0lQX1NUQVRVU19ESENQSU5HICAiZGhjcGluZyIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9JUF9TVEFUVVNfTEVOICAgMTUKKworI2RlZmluZSBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfQUREICJhZGQiCisjZGVmaW5lIFdFQl9XTEFOX1NUQVRJT05fU1BPVF9NT0RJRlkgIm1vZGlmeSIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9TUE9UX0RFTCAiZGVsZXRlIgorI2RlZmluZSBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfTlVNX0xFTiAgIDgKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9TUE9UX0xJU1RfTUFYICAxMAorI2RlZmluZSBXRUJfV0xBTl9TVEFUSU9OX1BST0ZJTEVfTlZfTkFNRV9MRU4gMjAKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9TUE9UX0xFTiAgMjU2CisjZGVmaW5lIFdFQl9XTEFOX1NUQVRJT05fU1BPVF9QUk9GSUxFX05BTUVfTEVOICAzMAorI2RlZmluZSBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfS0VZX0lEX0xFTiAgMTAKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9TUE9UX1BBU1NXT1JEX0xFTiAgMTI4CisKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9TU0lEX0xFTiAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBXRUJfV0xBTl9TVEFUSU9OX0FDVElPTl9MRU4gICAgICAgICAgICAgMzIKKworI2RlZmluZSBXSUZJX1NUQVRJT05fU1BPVF9MRU4gIDI1NgorI2RlZmluZSBXSUZJX1NUQVRJT05fU1BPVF9MSVNUX05VTSAgMTAKKyNkZWZpbmUgV0lGSV9TVEFUSU9OX1NQT1RfUFJPRklMRV9OQU1FX0xFTiAgMzAKKyNkZWZpbmUgV0lGSV9TVEFUSU9OX1NQT1RfUEFTU1dPUkRfTEVOICAxMjgKKyNkZWZpbmUgV0lGSV9TVEFUSU9OX1NQT1RfS0VZX0lEX0xFTiAgMTAKKyNkZWZpbmUgV0lGSV9TVEFUSU9OX1BST0ZJTEVfTlZfTkFNRV9MRU4gIDIwCisjZGVmaW5lIFdJRklfU1RBVElPTl9NQUNfTEVOICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFdJRklfU1RBVElPTl9TU0lEX0xFTiAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBXSUZJX1NUQVRJT05fQVVUSF9NT0RFX0xFTiAgMjAKKyNkZWZpbmUgV0lGSV9TVEFUSU9OX0VOQ1JZUFRfVFlQRV9MRU4gIDIwCisjZGVmaW5lIFdJRklfU1RBVElPTl9BUF9NQUNfTEVOICAxOAorCisjZGVmaW5lIFdFQl9XTEFOX1NUQVRJT05fQVVUSF9NT0RFX1NIQVJFRCAiU0hBUkVEIgorI2RlZmluZSBXRUJfV0xBTl9TVEFUSU9OX0FVVEhfTU9ERV9XUEFQU0tfV1BBMlBTSyAiV1BBUFNLV1BBMlBTSyIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9BVVRIX01PREVfV1BBUFNLICJXUEFQU0siCisjZGVmaW5lIFdFQl9XTEFOX1NUQVRJT05fQVVUSF9NT0RFX1dQQTJQU0sgIldQQTJQU0siCisjZGVmaW5lIFdFQl9XTEFOX1NUQVRJT05fQVVUSF9NT0RFX1dQQUVBUF9XUEEyRUFQICJXUEFFQVBXUEEyRUFQIgorI2RlZmluZSBXRUJfV0xBTl9TVEFUSU9OX0FVVEhfTU9ERV9XUEFFQVAgIldQQUVBUCIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9BVVRIX01PREVfV1BBMkVBUCAiV1BBMkVBUCIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9BVVRIX01PREVfRUFQX1NJTV9BS0EgIkVBUC1TSU0vQUtBIgorI2RlZmluZSBXRUJfV0xBTl9TVEFUSU9OX0FVVEhfTU9ERV9XUEEyX1dQQTMgIldQQTJXUEEzIgorI2RlZmluZSBXRUJfV0xBTl9TVEFUSU9OX0FVVEhfTU9ERV9XUEEzICJXUEEzUGVyc29uYWwiCisKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9FTkNSWVBUX1RZUEVfVEtJUF9DQ01QICJUS0lQQ0NNUCIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9FTkNSWVBUX1RZUEVfQ0NNUCAiQ0NNUCIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9FTkNSWVBUX1RZUEVfVEtJUCAiVEtJUCIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9FTkNSWVBUX1RZUEVfTk9ORSAiTk9ORSIKKyNkZWZpbmUgV0VCX1dMQU5fU1RBVElPTl9FTkNSWVBUX1RZUEVfV0VQICJXRVAiCisKKyNkZWZpbmUgc2FmZV9mcmVlKHgpIGRvIHsgaWYoeCkge2ZyZWUoeCk7IHg9TlVMTDt9IH0gd2hpbGUoMCkKKyNkZWZpbmUgIHdmX2xvZyhmbXQsIGFyZ3MuLi4pCVwKKwlkbyB7c2xvZyhXSUZJX1BSSU5ULFNMT0dfRVJSLCAgICJbd2xhbl1bJXMtJWRdOiAiIGZtdCJcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjIGFyZ3MpO30gd2hpbGUgKDApCisKK2V4dGVybiB2b2lkIHp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdlYnNfdCB3cCwgY2hhcl90ICpyZXN1bHQpOworLy9leHRlcm4gTE9ORyB6dGVfc2VuZF9tZXNzYWdlKFVTSE9SVCB0YXJnZXRfaWQsVVNIT1JUIE1zZ19jbWQsVVNIT1JUIHVzX0RhdGFMZW4sVUNIQVIgKnBEYXRhKTsKK3R5cGVkZWYgZW51bSB3ZWJfd2lmaV9wcm9maWxlX2NvbnRlbnQgeworCVdFQl9XTEFOX1NUQVRJT05fQ09OVEVOVF9VTkRFRklORUQsCisJV0VCX1dMQU5fU1RBVElPTl9QUk9GSUxFX05BTUUsCisJV0VCX1dMQU5fU1RBVElPTl9GUk9NX1BST1ZJREVSLAorCVdFQl9XTEFOX1NUQVRJT05fQ09OTkVDVF9TVEFUVVMsCisJV0VCX1dMQU5fU1RBVElPTl9TSUdOQUwsCisJV0VCX1dMQU5fU1RBVElPTl9TU0lELAorCVdFQl9XTEFOX1NUQVRJT05fQVVUSF9NT0RFLAorCVdFQl9XTEFOX1NUQVRJT05fRU5DUllQVF9UWVBFLAorCVdFQl9XTEFOX1NUQVRJT05fUEFTU1dPUkQsCisJV0VCX1dMQU5fU1RBVElPTl9LRVlfSUQsCisJV0VCX1dMQU5fU1RBVElPTl9NQUMKK30gd2ViX3dpZmlfcHJvZmlsZV9jb250ZW50X3Q7CisKK3R5cGVkZWYgc3RydWN0ICB1cGRhdGVfc3BvdF9pbmZvIHsKKwljaGFyICBzcG90W1dFQl9XTEFOX1NUQVRJT05fU1BPVF9MRU5dOworCWNoYXIgIGFjdGlvbltXRUJfV0xBTl9TVEFUSU9OX0FDVElPTl9MRU5dOworfSB1cGRhdGVpbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHdlYl9zcG90IHsKKwljaGFyICAgICAgcHJvZmlsZV9uYW1lW1dJRklfU1RBVElPTl9TUE9UX1BST0ZJTEVfTkFNRV9MRU5dOworCXNob3J0ICAgICBmcm9tX3Byb3ZpZGVyOy8vMDq3x9TL06rJzKOsMTrUy9OqycwKKwlzaG9ydCAgICAgY29ubmVjdF9zdGF0dXM7CisJc2hvcnQgICAgIHNpZ25hbDsKKwljaGFyICAgICAgc3NpZFtXSUZJX1NUQVRJT05fU1NJRF9MRU5dOworCWNoYXIgICAgICBhdXRoX21vZGVbV0lGSV9TVEFUSU9OX0FVVEhfTU9ERV9MRU5dOworCWNoYXIgICAgICBlbmNyeXB0X3R5cGVbV0lGSV9TVEFUSU9OX0VOQ1JZUFRfVFlQRV9MRU5dOworCWNoYXIgICAgICBwYXNzd29yZFtXSUZJX1NUQVRJT05fU1BPVF9QQVNTV09SRF9MRU5dOworCXNob3J0ICAgICBrZXlJRDsKKwljaGFyICAgICBtYWNbV0lGSV9TVEFUSU9OX01BQ19MRU5dOworfSB3ZWJfc3BvdF90OworCitzdGF0aWMgd2ViX3Nwb3RfdCAqIGdfc3BvdF9saXN0W1dFQl9XTEFOX1NUQVRJT05fU1BPVF9MSVNUX01BWF0gPSB7TlVMTH07CisKK3N0YXRpYyBpbnQgZ2V0X3Nwb3RfbnVtKGNoYXJfdCogc3BvdF9udW0pCit7CisJaW50IG51bSA9IC0xOworCisJaWYgKHNwb3RfbnVtID09IE5VTEwpIHsKKwkJcmV0dXJuIG51bTsKKwl9CisKKwlpZiAoc3RyY21wKHNwb3RfbnVtLCAiMCIpID09IDApIHsKKwkJbnVtID0gMDsKKwl9IGVsc2UgaWYgKHN0cmNtcChzcG90X251bSwgIjEiKSA9PSAwKSB7CisJCW51bSA9IDE7CisJfSBlbHNlIGlmIChzdHJjbXAoc3BvdF9udW0sICIyIikgPT0gMCkgeworCQludW0gPSAyOworCX0gZWxzZSBpZiAoc3RyY21wKHNwb3RfbnVtLCAiMyIpID09IDApIHsKKwkJbnVtID0gMzsKKwl9IGVsc2UgaWYgKHN0cmNtcChzcG90X251bSwgIjQiKSA9PSAwKSB7CisJCW51bSA9IDQ7CisJfSBlbHNlIGlmIChzdHJjbXAoc3BvdF9udW0sICI1IikgPT0gMCkgeworCQludW0gPSA1OworCX0gZWxzZSBpZiAoc3RyY21wKHNwb3RfbnVtLCAiNiIpID09IDApIHsKKwkJbnVtID0gNjsKKwl9IGVsc2UgaWYgKHN0cmNtcChzcG90X251bSwgIjciKSA9PSAwKSB7CisJCW51bSA9IDc7CisJfSBlbHNlIGlmIChzdHJjbXAoc3BvdF9udW0sICI4IikgPT0gMCkgeworCQludW0gPSA4OworCX0gZWxzZSBpZiAoc3RyY21wKHNwb3RfbnVtLCAiOSIpID09IDApIHsKKwkJbnVtID0gOTsKKwl9IGVsc2UgaWYgKHN0cmNtcChzcG90X251bSwgIjEwIikgPT0gMCkgeworCQludW0gPSAxMDsKKwl9IGVsc2UgeworCX0KKworCXJldHVybiBudW07Cit9CisKK3N0YXRpYyBCT09MIGNoZWNrX3Byb2ZpbGVfbmFtZShjaGFyX3QqIHByb2ZpbGVfbmFtZSkKK3sKKwlpbnQgcHJvZmlsZV9uYW1lX2xlbiA9IDA7CisKKwlpZiAocHJvZmlsZV9uYW1lID09IE5VTEwpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXByb2ZpbGVfbmFtZV9sZW4gPSBzdHJsZW4ocHJvZmlsZV9uYW1lKTsKKworCWlmIChwcm9maWxlX25hbWVfbGVuID4gMCAmJiBwcm9maWxlX25hbWVfbGVuIDwgV0VCX1dMQU5fU1RBVElPTl9TUE9UX1BST0ZJTEVfTkFNRV9MRU4pIHsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworfQorCitzdGF0aWMgQk9PTCBjaGVja19rZXlJRChjaGFyX3QqIGtleUlEKQoreworCWludCBrZXlJRF9sZW4gPSAwOworCisJaWYgKGtleUlEID09IE5VTEwpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWtleUlEX2xlbiA9IHN0cmxlbihrZXlJRCk7CisKKwlpZiAoa2V5SURfbGVuID4gMCAmJiBrZXlJRF9sZW4gPCBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfS0VZX0lEX0xFTikgeworCQlyZXR1cm4gVFJVRTsKKwl9IGVsc2UgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCit9CisKK3N0YXRpYyBCT09MIGNoZWNrX3Bhc3N3b3JkKGNoYXJfdCogcGFzc3dvcmQpCit7CisJaW50IHBhc3N3b3JkX2xlbiA9IDA7CisKKwlpZiAocGFzc3dvcmQgPT0gTlVMTCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcGFzc3dvcmRfbGVuID0gc3RybGVuKHBhc3N3b3JkKTsKKworCWlmIChwYXNzd29yZF9sZW4gPj0gMCAmJiBwYXNzd29yZF9sZW4gPCBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfUEFTU1dPUkRfTEVOKSB7CisJCXJldHVybiBUUlVFOworCX0gZWxzZSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKK30KKworc3RhdGljIEJPT0wgY2hlY2tfZW5jcnlwdF90eXBlKGNoYXJfdCogZW5jcnlwdF90eXBlKQoreworCWlmIChlbmNyeXB0X3R5cGUgPT0gTlVMTCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKHN0cmNtcChlbmNyeXB0X3R5cGUsIFdFQl9XTEFOX1NUQVRJT05fRU5DUllQVF9UWVBFX1RLSVBfQ0NNUCkgPT0gMAorCSAgICB8fCBzdHJjbXAoZW5jcnlwdF90eXBlLCBXRUJfV0xBTl9TVEFUSU9OX0VOQ1JZUFRfVFlQRV9DQ01QKSA9PSAwCisJICAgIHx8IHN0cmNtcChlbmNyeXB0X3R5cGUsIFdFQl9XTEFOX1NUQVRJT05fRU5DUllQVF9UWVBFX1RLSVApID09IDAKKwkgICAgfHwgc3RyY21wKGVuY3J5cHRfdHlwZSwgV0VCX1dMQU5fU1RBVElPTl9FTkNSWVBUX1RZUEVfV0VQKSA9PSAwCisJICAgIHx8IHN0cmNtcChlbmNyeXB0X3R5cGUsIFdFQl9XTEFOX1NUQVRJT05fRU5DUllQVF9UWVBFX05PTkUpID09IDApIHsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworfQorCitzdGF0aWMgQk9PTCBjaGVja19hdXRoX21vZGUoY2hhcl90KiBhdXRoX21vZGUpCit7CisJaWYgKGF1dGhfbW9kZSA9PSBOVUxMKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoc3RyY21wKGF1dGhfbW9kZSwgV0ZfQVVfT1BFTikgPT0gMAorCSAgICB8fCBzdHJjbXAoYXV0aF9tb2RlLCBXRUJfV0xBTl9TVEFUSU9OX0FVVEhfTU9ERV9TSEFSRUQpID09IDAKKwkgICAgfHwgc3RyY21wKGF1dGhfbW9kZSwgV0VCX1dMQU5fU1RBVElPTl9BVVRIX01PREVfV1BBUFNLX1dQQTJQU0spID09IDAKKwkgICAgfHwgc3RyY21wKGF1dGhfbW9kZSwgV0VCX1dMQU5fU1RBVElPTl9BVVRIX01PREVfV1BBUFNLKSA9PSAwCisJICAgIHx8IHN0cmNtcChhdXRoX21vZGUsIFdFQl9XTEFOX1NUQVRJT05fQVVUSF9NT0RFX1dQQTJQU0spID09IDAKKwkgICAgfHwgc3RyY21wKGF1dGhfbW9kZSwgV0VCX1dMQU5fU1RBVElPTl9BVVRIX01PREVfV1BBRUFQX1dQQTJFQVApID09IDAKKwkgICAgfHwgc3RyY21wKGF1dGhfbW9kZSwgV0VCX1dMQU5fU1RBVElPTl9BVVRIX01PREVfV1BBRUFQKSA9PSAwCisJICAgIHx8IHN0cmNtcChhdXRoX21vZGUsIFdFQl9XTEFOX1NUQVRJT05fQVVUSF9NT0RFX1dQQTJFQVApID09IDAKKwkgICAgfHwgc3RyY21wKGF1dGhfbW9kZSwgV0VCX1dMQU5fU1RBVElPTl9BVVRIX01PREVfRUFQX1NJTV9BS0EpID09IDAKKwkgICAgfHwgc3RyY21wKGF1dGhfbW9kZSwgV0VCX1dMQU5fU1RBVElPTl9BVVRIX01PREVfV1BBMl9XUEEzKSA9PSAwCisJICAgIHx8IHN0cmNtcChhdXRoX21vZGUsIFdFQl9XTEFOX1NUQVRJT05fQVVUSF9NT0RFX1dQQTMpID09IDApIHsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworfQorCitzdGF0aWMgQk9PTCBjaGVja19zaWduYWwoY2hhcl90KiBzaWduYWwpCit7CisJaWYgKHNpZ25hbCA9PSBOVUxMKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoc3RyY21wKHNpZ25hbCwgIjAiKSA9PSAwCisJICAgIHx8IHN0cmNtcChzaWduYWwsICIxIikgPT0gMAorCSAgICB8fCBzdHJjbXAoc2lnbmFsLCAiMiIpID09IDAKKwkgICAgfHwgc3RyY21wKHNpZ25hbCwgIjMiKSA9PSAwCisJICAgIHx8IHN0cmNtcChzaWduYWwsICI0IikgPT0gMCkgeworCQlyZXR1cm4gVFJVRTsKKwl9IGVsc2UgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCit9CisKK3N0YXRpYyBCT09MIGNoZWNrX21hYyhjaGFyX3QgKiBtYWMpCit7CisJaW50IG1hY19sZW4gPSAwOworCWlmIChtYWMgPT0gTlVMTCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCW1hY19sZW4gPSBzdHJsZW4obWFjKSArIDE7CisJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdIG1hYz0lcyxtYWNfbGVuPSVkXG4iLCBfX0ZJTEVfXywgbWFjLCBtYWNfbGVuKTsKKwlpZiAobWFjX2xlbiA9PSAgV0lGSV9TVEFUSU9OX0FQX01BQ19MRU4pIHsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KK30KK3N0YXRpYyBCT09MIGNoZWNrX3NzaWQoY2hhcl90KiBzc2lkKQoreworCWludCBzc2lkX2xlbiA9IDA7CisKKwlpZiAoc3NpZCA9PSBOVUxMKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlzc2lkX2xlbiA9IHN0cmxlbihzc2lkKTsKKworCWlmIChzc2lkX2xlbiA+IDAgJiYgc3NpZF9sZW4gPCBXRUJfV0xBTl9TVEFUSU9OX1NTSURfTEVOKSB7CisJCXJldHVybiBUUlVFOworCX0gZWxzZSB7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKK3N0YXRpYyBCT09MIGNoZWNrX3plcm9fb25lX3N0cihjaGFyX3QqIHN0cikKK3sKKwlpZiAoc3RyID09IE5VTEwpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChzdHJjbXAoc3RyLCAiMCIpID09IDAKKwkgICAgfHwgc3RyY21wKHN0ciwgIjEiKSA9PSAwKSB7CisJCXJldHVybiBUUlVFOworCX0gZWxzZSB7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CitzdGF0aWMgd2ViX3Nwb3RfdCogcGFyc2Vfc3BvdF9zdHJpbmcoY2hhciAqc3BvdF9zdHJpbmcpCit7CisJd2ViX3Nwb3RfdCAqc3BvdCA9IE5VTEw7CisJY2hhciAqc3BsaXRlZF9zdHJpbmcgPSBOVUxMOworCWNoYXIgKnNhdmUgPSBOVUxMOworCWNvbnN0IGNoYXIgKmRlbGltaXRlciA9ICIsIjsKKwl3ZWJfd2lmaV9wcm9maWxlX2NvbnRlbnRfdCB3aWZpX3Byb2ZpbGVfY29udGVudCA9IFdFQl9XTEFOX1NUQVRJT05fQ09OVEVOVF9VTkRFRklORUQ7CisJY2hhciBzcG90X3N0cmluZ190bXBbMjU2XSA9IHswfTsKKworCWlmIChzcG90X3N0cmluZyA9PSBOVUxMKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXN0cm5jcHkoc3BvdF9zdHJpbmdfdG1wLCBzcG90X3N0cmluZywgc2l6ZW9mKHNwb3Rfc3RyaW5nX3RtcCktMSk7CisKKwlzcG90ID0gc2FmZV9tYWxsb2Moc2l6ZW9mKHdlYl9zcG90X3QpLCBGQUxTRSk7CisJaWYgKHNwb3QgPT0gTlVMTCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvL7fWuO7X1rf7tK6jrLTmtKK1vb3hubnM5QorCXNwbGl0ZWRfc3RyaW5nID0gc3RydG9rX3Ioc3BvdF9zdHJpbmdfdG1wLCBkZWxpbWl0ZXIsICZzYXZlKTsKKwl3aGlsZSAoc3BsaXRlZF9zdHJpbmcpIHsKKwkJd2lmaV9wcm9maWxlX2NvbnRlbnQrKzsKKwkJc3dpdGNoICh3aWZpX3Byb2ZpbGVfY29udGVudCkgeworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fUFJPRklMRV9OQU1FOgorCQkJc3RybmNweShzcG90LT5wcm9maWxlX25hbWUsIHNwbGl0ZWRfc3RyaW5nLCBzaXplb2Yoc3BvdC0+cHJvZmlsZV9uYW1lKS0xKTsKKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fRlJPTV9QUk9WSURFUjoKKwkJCXNwb3QtPmZyb21fcHJvdmlkZXIgPSBhdG9pKHNwbGl0ZWRfc3RyaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fQ09OTkVDVF9TVEFUVVM6CisJCQlzcG90LT5jb25uZWN0X3N0YXR1cyA9IGF0b2koc3BsaXRlZF9zdHJpbmcpOworCQkJYnJlYWs7CisJCWNhc2UgV0VCX1dMQU5fU1RBVElPTl9TSUdOQUw6CisJCQlzcG90LT5zaWduYWwgPSBhdG9pKHNwbGl0ZWRfc3RyaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fU1NJRDoKKwkJCXN0cm5jcHkoc3BvdC0+c3NpZCwgc3BsaXRlZF9zdHJpbmcsIHNpemVvZihzcG90LT5zc2lkKS0xKTsKKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fQVVUSF9NT0RFOgorCQkJc3RybmNweShzcG90LT5hdXRoX21vZGUsIHNwbGl0ZWRfc3RyaW5nLCBzaXplb2Yoc3BvdC0+YXV0aF9tb2RlKS0xKTsKKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fRU5DUllQVF9UWVBFOgorCQkJc3RybmNweShzcG90LT5lbmNyeXB0X3R5cGUsIHNwbGl0ZWRfc3RyaW5nLCBzaXplb2Yoc3BvdC0+ZW5jcnlwdF90eXBlKS0xKTsKKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fUEFTU1dPUkQ6CisJCQlzdHJuY3B5KHNwb3QtPnBhc3N3b3JkLCBzcGxpdGVkX3N0cmluZywgc2l6ZW9mKHNwb3QtPnBhc3N3b3JkKS0xKTsKKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fS0VZX0lEOgorCQkJc3BvdC0+a2V5SUQgPSBhdG9pKHNwbGl0ZWRfc3RyaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fTUFDOgorCQkJc3RybmNweShzcG90LT5tYWMsIHNwbGl0ZWRfc3RyaW5nLCBzaXplb2Yoc3BvdC0+bWFjKS0xKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlzcGxpdGVkX3N0cmluZyA9IHN0cnRva19yKE5VTEwsIGRlbGltaXRlciwgJnNhdmUpOworCX0KKworCWlmICh3aWZpX3Byb2ZpbGVfY29udGVudCAhPSBXRUJfV0xBTl9TVEFUSU9OX01BQykgeworCQlzYWZlX2ZyZWUoc3BvdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBzcG90OworCit9CisKKworCitzdGF0aWMgQk9PTCBjaGVja193aWZpX3Byb2ZpbGUoY2hhcl90KiB3aWZpX3Byb2ZpbGUpCit7CisJd2ViX3dpZmlfcHJvZmlsZV9jb250ZW50X3Qgd2lmaV9wcm9maWxlX2NvbnRlbnQgPSBXRUJfV0xBTl9TVEFUSU9OX0NPTlRFTlRfVU5ERUZJTkVEOworCWNoYXJfdCAqc3BsaXRlZF9zdHJpbmcgPSBOVUxMOworCWNoYXJfdCAqc2F2ZSA9IE5VTEw7CisJY2hhcl90ICpkZWxpbWl0ZXIgPSAiLCI7CisJY2hhcl90IHdpZmlfcHJvZmlsZV90ZW1wW1dFQl9XTEFOX1NUQVRJT05fU1BPVF9MRU5dID0gezB9OworCisJaWYgKHdpZmlfcHJvZmlsZSA9PSBOVUxMKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlzdHJuY3B5KHdpZmlfcHJvZmlsZV90ZW1wLCB3aWZpX3Byb2ZpbGUsIHNpemVvZih3aWZpX3Byb2ZpbGVfdGVtcCktMSk7CisKKwkvL7fWuO7X1rf7tK4KKwlzcGxpdGVkX3N0cmluZyA9IHN0cnRva19yKHdpZmlfcHJvZmlsZV90ZW1wLCBkZWxpbWl0ZXIsICZzYXZlKTsKKwl3aGlsZSAoc3BsaXRlZF9zdHJpbmcpIHsKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdcHJvZmlsZSBzcGxpdD0lc1xuIiwgX19GSUxFX18sIHNwbGl0ZWRfc3RyaW5nKTsKKwkJd2lmaV9wcm9maWxlX2NvbnRlbnQrKzsKKwkJc3dpdGNoICh3aWZpX3Byb2ZpbGVfY29udGVudCkgeworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fUFJPRklMRV9OQU1FOi8vcHJvZmlsZV9uYW1lCisJCQlpZiAoY2hlY2tfcHJvZmlsZV9uYW1lKHNwbGl0ZWRfc3RyaW5nKSA9PSBGQUxTRSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fRlJPTV9QUk9WSURFUjovL2Zyb21fcHJvdmlkZXIKKwkJCWlmIChjaGVja196ZXJvX29uZV9zdHIoc3BsaXRlZF9zdHJpbmcpID09IEZBTFNFKSB7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0VCX1dMQU5fU1RBVElPTl9DT05ORUNUX1NUQVRVUzovL2Nvbm5lY3Rfc3RhdHVzCisJCQlpZiAoY2hlY2tfemVyb19vbmVfc3RyKHNwbGl0ZWRfc3RyaW5nKSA9PSBGQUxTRSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fU0lHTkFMOi8vc2lnbmFsCisJCQlpZiAoY2hlY2tfc2lnbmFsKHNwbGl0ZWRfc3RyaW5nKSA9PSBGQUxTRSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fU1NJRDovL3NzaWQKKwkJCWlmIChjaGVja19zc2lkKHNwbGl0ZWRfc3RyaW5nKSA9PSBGQUxTRSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fQVVUSF9NT0RFOi8vYXV0aF9tb2RlCisJCQlpZiAoY2hlY2tfYXV0aF9tb2RlKHNwbGl0ZWRfc3RyaW5nKSA9PSBGQUxTRSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fRU5DUllQVF9UWVBFOi8vZW5jcnlwdF90eXBlCisJCQlpZiAoY2hlY2tfZW5jcnlwdF90eXBlKHNwbGl0ZWRfc3RyaW5nKSA9PSBGQUxTRSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fUEFTU1dPUkQ6Ly9wYXNzd29yZAorCQkJaWYgKGNoZWNrX3Bhc3N3b3JkKHNwbGl0ZWRfc3RyaW5nKSA9PSBGQUxTRSkgeworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdFQl9XTEFOX1NUQVRJT05fS0VZX0lEOi8va2V5SUQKKwkJCWlmIChjaGVja19rZXlJRChzcGxpdGVkX3N0cmluZykgPT0gRkFMU0UpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXRUJfV0xBTl9TVEFUSU9OX01BQzovL21hYworCQkJaWYgKGNoZWNrX21hYyhzcGxpdGVkX3N0cmluZykgPT0gRkFMU0UpIHsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCXNwbGl0ZWRfc3RyaW5nID0gc3RydG9rX3IoTlVMTCwgZGVsaW1pdGVyLCAmc2F2ZSk7CisJfQorCisJaWYgKHdpZmlfcHJvZmlsZV9jb250ZW50ID09IFdFQl9XTEFOX1NUQVRJT05fTUFDKSB7CisJCXJldHVybiBUUlVFOworCX0gZWxzZSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKK30KKworc3RhdGljIEJPT0wgY2hlY2tfc2V0X3ZhbHVlKGNoYXJfdCogd2lmaV9zdGFfY29ubmVjdGlvbikKK3sKKwlpZiAod2lmaV9zdGFfY29ubmVjdGlvbiA9PSBOVUxMKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoY2hlY2tfemVyb19vbmVfc3RyKHdpZmlfc3RhX2Nvbm5lY3Rpb24pID09IEZBTFNFKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoqKgorCSAgICBpZihzdHJjbXAoYXBfc3RhdGlvbl9tb2RlLCBXRUJfV0xBTl9TVEFUSU9OX01PREVfV0lGSV9QUkVGKSA9PSAwCisJICAgICAgICB8fCBzdHJjbXAoYXBfc3RhdGlvbl9tb2RlLCBXRUJfV0xBTl9TVEFUSU9OX01PREVfRElBTF9QUkVGKSA9PSAwKQorCSAgICB7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgICAgICByZXR1cm4gRkFMU0U7CisJICAgIH0KKwkqKioqKi8KKwlyZXR1cm4gVFJVRTsKKworfQorCitzdGF0aWMgQk9PTCBjaGVja19zcG90X3ZhbHVlKGNoYXJfdCogYWN0aW9uLCBjaGFyX3QqIHdpZmlfcHJvZmlsZV9udW0sIGNoYXJfdCogb2xkX3dpZmlfcHJvZmlsZV9udW0sIGNoYXJfdCogd2lmaV91cGRhdGVfcHJvZmlsZSwgY2hhcl90Kiogd2lmaV9wcm9maWxlKQoreworCWludCBzcG90X251bV9uZXcgPSAtMTsKKwlpbnQgc3BvdF9udW1fb2xkID0gLTE7CisJaW50IHRlbXAgPSAtNTsKKwlpbnQgaSA9IDA7CisJaW50IGogPSAwOworCWNoYXJfdCBwcm9maWxlX25hbWVfdG1wMVtXRUJfV0xBTl9TVEFUSU9OX1NQT1RfUFJPRklMRV9OQU1FX0xFTl0gPSB7MH07CisJY2hhcl90IHByb2ZpbGVfbmFtZV90bXAyW1dFQl9XTEFOX1NUQVRJT05fU1BPVF9QUk9GSUxFX05BTUVfTEVOXSA9IHswfTsKKworCWlmIChhY3Rpb24gPT0gTlVMTCB8fCB3aWZpX3Byb2ZpbGVfbnVtID09IE5VTEwgfHwgb2xkX3dpZmlfcHJvZmlsZV9udW0gPT0gTlVMTAorCSAgICB8fCB3aWZpX3VwZGF0ZV9wcm9maWxlID09IE5VTEwgfHwgd2lmaV9wcm9maWxlID09IE5VTEwpIHsKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXXBhcmEgaXMgbnVsbFxuIiwgX19GSUxFX18pOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJc3BvdF9udW1fbmV3ID0gZ2V0X3Nwb3RfbnVtKHdpZmlfcHJvZmlsZV9udW0pOworCXNwb3RfbnVtX29sZCA9IGdldF9zcG90X251bShvbGRfd2lmaV9wcm9maWxlX251bSk7CisJdGVtcCA9IHNwb3RfbnVtX25ldyAtIHNwb3RfbnVtX29sZDsKKworCXNsb2coV0lGSV9QUklOVCwgU0xPR19ERUJVRywiWyVzXXNwb3RfbnVtX25ldz0lZFxuIiwgX19GSUxFX18sIHNwb3RfbnVtX25ldyk7CisJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdc3BvdF9udW1fb2xkPSVkXG4iLCBfX0ZJTEVfXywgc3BvdF9udW1fb2xkKTsKKwlzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc110ZW1wPSVkXG4iLCBfX0ZJTEVfXywgdGVtcCk7CisKKwkvL7zssul3aWZpX3Byb2ZpbGUKKwlmb3IgKGkgPSAwOyBpIDwgc3BvdF9udW1fbmV3OyBpKyspIHsKKwkJLy+87LLptaW49ndpZmlfcHJvZmlsZbG+ye21xLrPt6jQ1AorCQlpZiAoY2hlY2tfd2lmaV9wcm9maWxlKHdpZmlfcHJvZmlsZVtpXSkgPT0gRkFMU0UpIHsKKwkJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsIlslc113aWZpX3Byb2ZpbGVbJWRdPSVzIHdyb25nXG4iLCBfX0ZJTEVfXywgaSwgd2lmaV9wcm9maWxlW2ldKTsKKworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwl9CisjaWYgMAorCS8vvOyy6XdpZmlfdXBkYXRlX3Byb2ZpbGWxvsnttcS6z7eo0NQKKwlpZiAoY2hlY2tfd2lmaV9wcm9maWxlKHdpZmlfdXBkYXRlX3Byb2ZpbGUpID09IEZBTFNFKSB7CisJCXdmX2xvZygiWyVzXXdpZmlfdXBkYXRlX3Byb2ZpbGUgd3JvbmdcbiIsIF9fRklMRV9fKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKyNlbmRpZgorCS8vvOyy6WFjdGlvbgorCisJaWYgKHN0cmNtcChhY3Rpb24sIFdFQl9XTEFOX1NUQVRJT05fU1BPVF9BREQpID09IDApIHsKKwkJLy+87LLpd2lmaV9wcm9maWxlX251bQorCQlpZiAoc3BvdF9udW1fbmV3ID4gMCAmJiB0ZW1wID09IDEpIHsgLy9rdyAzCisJCX0gZWxzZSB7CisJCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCJbJXNdd2lmaV9wcm9maWxlX251bSBhZGQgd3JvbmdcbiIsIF9fRklMRV9fKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0gZWxzZSBpZiAoc3RyY21wKGFjdGlvbiwgV0VCX1dMQU5fU1RBVElPTl9TUE9UX01PRElGWSkgPT0gMCkgeworCQkvL7zssul3aWZpX3Byb2ZpbGVfbnVtCisJCWlmIChzcG90X251bV9uZXcgPiAwICYmIHRlbXAgPT0gMCkgeyAvL2t3IDMKKwkJfSBlbHNlIHsKKwkJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsIlslc113aWZpX3Byb2ZpbGVfbnVtIG1vZGlmeSB3cm9uZ1xuIiwgX19GSUxFX18pOworCisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9IGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sIFdFQl9XTEFOX1NUQVRJT05fU1BPVF9ERUwpID09IDApIHsKKwkJLy+87LLpd2lmaV9wcm9maWxlX251bQorCQlpZiAoc3BvdF9udW1fbmV3ID49IDAgJiYgdGVtcCA9PSAtMSkgeyAvL2t3IDMKKwkJfSBlbHNlIHsKKwkJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsIlslc113aWZpX3Byb2ZpbGVfbnVtIGRlbCB3cm9uZ1xuIiwgX19GSUxFX18pOworCisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9IGVsc2UgeworCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCJbJXNdd2lmaV9wcm9maWxlX251bSBhY3Rpb24gd3JvbmdcbiIsIF9fRklMRV9fKTsKKworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy/It7Gj0MK1xMjItePB0LHt1tC1xHByb2ZpbGUgbmFtZbXEzqjSu9DUCisJZm9yIChpID0gMDsgaSA8IHNwb3RfbnVtX25ldyAtIDE7IGkrKykgeworCQlmb3IgKGogPSBpICsgMTsgaiA8IHNwb3RfbnVtX25ldzsgaisrKSB7CisJCQlzc2NhbmYod2lmaV9wcm9maWxlW2ldLCAiJTI5W14sXSIsIHByb2ZpbGVfbmFtZV90bXAxKTsKKwkJCXNzY2FuZih3aWZpX3Byb2ZpbGVbal0sICIlMjlbXixdIiwgcHJvZmlsZV9uYW1lX3RtcDIpOworCQkJaWYgKHN0cmNtcChwcm9maWxlX25hbWVfdG1wMSwgcHJvZmlsZV9uYW1lX3RtcDIpID09IDApIHsKKwkJCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCJbJXNdd2lmaV9wcm9maWxlX251bSBwcm9maWxlIG5hbWUgd3JvbmdcbiIsIF9fRklMRV9fKTsKKworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworCisJLy9UT0RPINTdsru/vMLHvOyy6b7JtcTT69DCtcR3aWZpX3Byb2ZpbGW1xLHIvc+1xLrPt6jQ1AorCisJcmV0dXJuIFRSVUU7CisKK30KKworc3RhdGljIEJPT0wgY2hlY2tfY29ubmVjdF92YWx1ZShjaGFyX3QqIHNzaWQsIGNoYXJfdCogYXV0aF9tb2RlLCBjaGFyX3QqIGVuY3J5cHRfdHlwZSwgY2hhcl90KiBrZXlJRCwgY2hhcl90KiBwcm9maWxlLCBjaGFyX3QqIHdlcF9rZXksIGNoYXJfdCogd3BhX3BzazEpCit7CisJaWYgKHNzaWQgPT0gTlVMTCB8fCBhdXRoX21vZGUgPT0gTlVMTCB8fCB3ZXBfa2V5ID09IE5VTEwgfHwgd3BhX3BzazEgPT0gTlVMTAorCSAgICB8fCBlbmNyeXB0X3R5cGUgPT0gTlVMTCB8fCBrZXlJRCA9PSBOVUxMIHx8IHByb2ZpbGUgPT0gTlVMTCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKGNoZWNrX3NzaWQoc3NpZCkgPT0gRkFMU0UpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChjaGVja19hdXRoX21vZGUoYXV0aF9tb2RlKSA9PSBGQUxTRSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKGNoZWNrX2VuY3J5cHRfdHlwZShlbmNyeXB0X3R5cGUpID09IEZBTFNFKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoY2hlY2tfa2V5SUQoa2V5SUQpID09IEZBTFNFKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoY2hlY2tfcHJvZmlsZV9uYW1lKHByb2ZpbGUpID09IEZBTFNFKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoY2hlY2tfcGFzc3dvcmQod2VwX2tleSkgPT0gRkFMU0UpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChjaGVja19wYXNzd29yZCh3cGFfcHNrMSkgPT0gRkFMU0UpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZ1bmN0aW9uOiAgICAgICAgc29ydF9zcG90CisqIERlc2NyaXB0aW9uOiAgICAgc29ydCBzcG90IGJ5IHJlcXVpcmVtZW50CisqIElucHV0OiAgICAgICAgICAgZ19zcG90X2xpc3QKKyogT3V0cHV0OiAgICAgICAgICBzb3J0IHRoZSBzcG90LCBzYXZlIGluIGdfc3BvdF9saXN0CisqIFJldHVybjoKKyogT3RoZXJzOgorKiBNb2RpZnkgRGF0ZSAgIFZlcnNpb24gICAgIEF1dGhvciAgICAgICAgICBNb2RpZmljYXRpb24KKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogMjAxNS8wMy8wOSAgICBWMS4wICAgICAgICB4dWppYW4gICAgICAgICAgZmlyc3QgdmVyc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW5zZXJ0X3RvX3Nwb3RfbGlzdChpbnQgcHJpb3JpdHksIHdlYl9zcG90X3QgKiBzcG90KQoreworCWludCBpID0gMCwgaiA9IDA7CisKKworCisJLy8xLiBwcm92aWRlciBhcCBwbGFjZSB0aGUgZmlyc3QKKwkvLzIuIGxhc3QgY29ubmVjdGVkIGFwIHBsYWNlIHRoZSBzZWNvbmQKKwlpZiAoMSA9PSBwcmlvcml0eSB8fCAyID09IHByaW9yaXR5KSB7CisKKwkJZm9yIChpID0gMDsgaSA8IFdFQl9XTEFOX1NUQVRJT05fU1BPVF9MSVNUX01BWDsgaSsrKSB7CisJCQlpZiAoZ19zcG90X2xpc3RbaV0gPT0gTlVMTCkgeworCQkJCWdfc3BvdF9saXN0W2ldID0gc3BvdDsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWlmICgxID09IGdfc3BvdF9saXN0W2ldLT5mcm9tX3Byb3ZpZGVyKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSB7CisKKwkJCQkJLy+9q9Pgz8LIyLXjyKuyv7rz0sbSu7j2zrvWw6Osv9Wz9rWxx7BptcTOu9bDCisJCQkJCWZvciAoaiA9IFdFQl9XTEFOX1NUQVRJT05fU1BPVF9MSVNUX01BWCAtIDI7IGogPj0gaTsgai0tKSB7IC8vILzZtqjX7rrz0ru49r/PtqjKx7/VtcSjrLK7v8nE3DEwuPbC+sHLo6y7udTazO2808jIteOjrNaux7DS0b6txdC2z7TtzvO3tbvYwcsKKwkJCQkJCWlmIChnX3Nwb3RfbGlzdFtqXSA9PSBOVUxMKWNvbnRpbnVlOworCQkJCQkJZWxzZSB7CisJCQkJCQkJZ19zcG90X2xpc3RbaiArIDFdID0gZ19zcG90X2xpc3Rbal07CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlnX3Nwb3RfbGlzdFtpXSA9IHNwb3Q7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKworCS8vMy4gb3RoZXIgYXAgc3RheQorCWlmICgzID09IHByaW9yaXR5KSB7CisKKwkJZm9yIChpID0gMDsgaSA8IFdFQl9XTEFOX1NUQVRJT05fU1BPVF9MSVNUX01BWDsgaSsrKSB7CisKKwkJCWlmIChnX3Nwb3RfbGlzdFtpXSAhPSBOVUxMKWNvbnRpbnVlOworCisJCQlnX3Nwb3RfbGlzdFtpXSA9IHNwb3Q7CisJCQlyZXR1cm47CisKKwkJfQorCX0KKworfQorCit2b2lkIHJlc29ydF9zcG90X2xpc3QoaW50IHByaW9yaXR5LCBjaGFyICogcHJvZmlsZV9uYW1lKQoreworCisJaW50IGkgPSAwLCBqID0gMDsKKwljaGFyX3Qgd2lmaV9wcm9maWxlX252X25hbWVbV0VCX1dMQU5fU1RBVElPTl9QUk9GSUxFX05WX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHNwb3Rfc3RyaW5nWzI1Nl0gPSB7MH07CisKKwlpbnQgaW5kZXggPSAwOworCXdlYl9zcG90X3QgKiAgc3BvdCA9IE5VTEw7CisKKworCWZvciAoaSA9IDA7IGkgPCBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfTElTVF9NQVg7IGkrKykgeworCQlpZiAoZ19zcG90X2xpc3RbaV0gIT0gTlVMTCkgeworCQkJaWYgKHN0cmNtcChnX3Nwb3RfbGlzdFtpXS0+cHJvZmlsZV9uYW1lLCBwcm9maWxlX25hbWUpID09IDApIHsKKwkJCQlpbmRleCA9IGk7CisJCQkJc3BvdCA9IGdfc3BvdF9saXN0W2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwl9CisKKwlpZiAoaW5kZXggPT0gMCkgcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IFdFQl9XTEFOX1NUQVRJT05fU1BPVF9MSVNUX01BWDsgaSsrKSB7CisJCWlmICgxID09IGdfc3BvdF9saXN0W2ldLT5mcm9tX3Byb3ZpZGVyKSB7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCS8vbW92ZSBvdGhlciBzcG90CisJCQlmb3IgKGogPSBpbmRleDsgaiA+IGk7IGotLSkgeyAvLyC82bao1+6689K7uPa/z7aoyse/1bXEo6yyu7/JxNwxMLj2wvrBy6Osu7nU2sztvNPIyLXjo6zWrsew0tG+rcXQts+07c7zt7W72MHLCisJCQkJaWYgKGdfc3BvdF9saXN0W2pdID09IE5VTEwpY29udGludWU7CisJCQkJZWxzZSB7CisJCQkJCWdfc3BvdF9saXN0W2pdID0gZ19zcG90X2xpc3RbaiAtIDFdOyAvL2ogbXVzdCBncmVhdGVyIHRoYW4gMAorCQkJCX0KKwkJCX0KKworCQkJZ19zcG90X2xpc3RbaV0gPSBzcG90OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VCX1dMQU5fU1RBVElPTl9TUE9UX0xJU1RfTUFYOyBpKyspIHsKKwkJaWYgKGkgPT0gMCkgeworCQkJc2FmZV9zdHJjcHkod2lmaV9wcm9maWxlX252X25hbWUsICJ3aWZpX3Byb2ZpbGUiLCBXRUJfV0xBTl9TVEFUSU9OX1BST0ZJTEVfTlZfTkFNRV9MRU4pOworCQl9IGVsc2UgeworCQkJbWVtc2V0KHdpZmlfcHJvZmlsZV9udl9uYW1lLCAwLCBXRUJfV0xBTl9TVEFUSU9OX1BST0ZJTEVfTlZfTkFNRV9MRU4pOworCQkJc25wcmludGYod2lmaV9wcm9maWxlX252X25hbWUsIFdFQl9XTEFOX1NUQVRJT05fUFJPRklMRV9OVl9OQU1FX0xFTiwgIndpZmlfcHJvZmlsZSVkIiwgaSk7CisJCX0KKworCisJCW1lbXNldChzcG90X3N0cmluZywgMCwgc2l6ZW9mKHNwb3Rfc3RyaW5nKSk7CisJCWlmIChnX3Nwb3RfbGlzdFtpXSAhPSBOVUxMKSB7CisJCQlzbnByaW50ZihzcG90X3N0cmluZywgV0lGSV9TVEFUSU9OX1NQT1RfTEVOLCAiJXMsJWQsJWQsJWQsJXMsJXMsJXMsJXMsJWQiLCBnX3Nwb3RfbGlzdFtpXS0+cHJvZmlsZV9uYW1lLAorCQkJICAgICAgICAgZ19zcG90X2xpc3RbaV0tPmZyb21fcHJvdmlkZXIsIGdfc3BvdF9saXN0W2ldLT5jb25uZWN0X3N0YXR1cywgZ19zcG90X2xpc3RbaV0tPnNpZ25hbCwKKwkJCSAgICAgICAgIGdfc3BvdF9saXN0W2ldLT5zc2lkLCBnX3Nwb3RfbGlzdFtpXS0+YXV0aF9tb2RlLCBnX3Nwb3RfbGlzdFtpXS0+ZW5jcnlwdF90eXBlLAorCQkJICAgICAgICAgZ19zcG90X2xpc3RbaV0tPnBhc3N3b3JkLCBnX3Nwb3RfbGlzdFtpXS0+a2V5SUQpOworCQl9CisKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdd2lmaV9wcm9maWxlX252X25hbWU9JXMsIHNwb3Rfc3RyaW5nPSVzXG4iLCBfX0ZJTEVfXywgd2lmaV9wcm9maWxlX252X25hbWUsIHNwb3Rfc3RyaW5nKTsKKworCQl6dGVfd2ViX3dyaXRlKHdpZmlfcHJvZmlsZV9udl9uYW1lLCBzcG90X3N0cmluZyk7CisJfQorCisKKworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRnVuY3Rpb246ICAgICAgICB6dGVfd2xhbl9zdGF0aW9uX3NldAorKiBEZXNjcmlwdGlvbjogICAgIHRvIHNldCB0aGUgd2lmaSBzdGF0aW9uIGZ1bmMKKyogSW5wdXQ6ICAgICAgICAgICBodHRwIGluZm8KKyogT3V0cHV0OgorKiBSZXR1cm46CisqIE90aGVyczoKKyogTW9kaWZ5IERhdGUgICBWZXJzaW9uICAgICBBdXRob3IgICAgICAgICAgTW9kaWZpY2F0aW9uCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIDIwMTUvMDMvMDkgICAgVjEuMCAgICAgICAgeHVqaWFuICAgICAgICAgIGZpcnN0IHZlcnNpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHp0ZV93bGFuX3N0YXRpb25fc2V0KHdlYnNfdCB3cCkKK3sKKwljaGFyX3QgKndpZmlfc3RhX2Nvbm5lY3Rpb24gPSBOVUxMOworCS8vY2hhcl90ICphcF9zdGF0aW9uX21vZGUgPSBOVUxMOworCWNoYXJfdCBvbGRfd2lmaV9zdGFfY29ubmVjdGlvbltXRUJfV0xBTl9TVEFUSU9OX0NPTk5FQ1RJT05fTEVOICsgMV0gPSB7MH07CisJbG9uZyBsUmV0ID0gMDsKKworCWNoYXIgTUFYX0FjY2Vzc19udW1fYmFrWzE2XSA9IHswfTsKKwljaGFyIG1fc3NpZF9lbmFibGVbMTZdID0gezB9OworCXdpZmlfc3RhX2Nvbm5lY3Rpb24gPSB3ZWJzR2V0VmFyKHdwLCBUKCJ3aWZpX3N0YV9jb25uZWN0aW9uIiksIFQoIiIpKTsKKwkvL2FwX3N0YXRpb25fbW9kZSA9IHdlYnNHZXRWYXIod3AsIFQoImFwX3N0YXRpb25fbW9kZSIpLCBUKCIiKSk7CisKKworCS8vss7K/brPt6jQ1LzssukKKwlzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc116dGVfd2xhbl9zdGF0aW9uX3NldCAhXG4iLCBfX0ZJTEVfXyk7CisJaWYgKGNoZWNrX3NldF92YWx1ZSh3aWZpX3N0YV9jb25uZWN0aW9uKSA9PSBGQUxTRSkgeworCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXXBhcmFtZXRlciB3cm9uZyFcbiIsIF9fRklMRV9fKTsKKwkJcmV0dXJuOworCX0KKworCS8vtsG+yda1CisJKHZvaWQpenRlX3dlYl9yZWFkKCJ3aWZpX3N0YV9jb25uZWN0aW9uIiwgb2xkX3dpZmlfc3RhX2Nvbm5lY3Rpb24pOworCisKKwkvL9C0TlYKKwkodm9pZCl6dGVfd2ViX3dyaXRlKCJ3aWZpX3N0YV9jb25uZWN0aW9uIiwgd2lmaV9zdGFfY29ubmVjdGlvbik7CisJaWYgKHN0cmNtcCh3aWZpX3N0YV9jb25uZWN0aW9uLCAiMSIpID09IDApIHsgLy8gu6Wz4rGju6QKKwkJKHZvaWQpenRlX3dlYl9yZWFkKCJtX3NzaWRfZW5hYmxlIiwgbV9zc2lkX2VuYWJsZSk7CisKKwkJaWYgKCFzdHJjbXAobV9zc2lkX2VuYWJsZSwgIjEiKSkgeyAvL2lmIG11bHRpIHNzaWQgaXMgb3BlbiwgcmVjb3ZlcnkgdGhlIG1heCBhY2Nlc3MgbnYKKwkJCXp0ZV93ZWJfcmVhZCgiTUFYX0FjY2Vzc19udW1fYmFrIiwgTUFYX0FjY2Vzc19udW1fYmFrKTsKKwkJCXp0ZV93ZWJfd3JpdGUoIk1BWF9BY2Nlc3NfbnVtIiwgTUFYX0FjY2Vzc19udW1fYmFrKTsKKwkJCXp0ZV93ZWJfd3JpdGUoIm1fc3NpZF9lbmFibGUiLCAiMCIpOworCQkJd2xhbl9zZXRfY2hhbmdlX3NzaWRfa2V5X3N0YXR1cygpOy8vYWRkZWQgYnkgZHVqaWFqaWFvLCBmb3IgdGhlIHN3aXRjaCBiZXR3ZWVuIGFwc3RhIGFuZCBtc3NpZAorCQl9CisJfQorCS8vKHZvaWQpenRlX3dlYl93cml0ZSgiYXBfc3RhdGlvbl9tb2RlIiwgYXBfc3RhdGlvbl9tb2RlKTsKKworCWlmIChzdHJjbXAod2lmaV9zdGFfY29ubmVjdGlvbiwgIjAiKSA9PSAwKSB7IC8vuabE3LnYsdUKKworCQkvL8no1sO1xNa1us3Urc/ItcTSu9bCo6zU8taxvdO72Li0s8m5pgorCQlpZiAoc3RyY21wKHdpZmlfc3RhX2Nvbm5lY3Rpb24sIG9sZF93aWZpX3N0YV9jb25uZWN0aW9uKSA9PSAwKSB7CisJCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgU1VDQ0VTUyk7CisJCQlyZXR1cm47CisJCX0KKwkJLy9lbHNleworCQkvL3p0ZV93ZWJfd3JpdGUoIlJhZGlvT2ZmIiwgIjAiKTsgLy8gc2V0IGFwIHJhZGlvIG9mZgorCQkvL30KKworCisJCS8vVE9ETyDX3L/YxKO/6b/Y1sYtLcjnuftXSUZJysfBrL3TyMi149e0zKyjrNTyts+/qsjItePBrL3TLNTZ199NT0RFTdfUtq/W2MGswfezzAorCQl6dGVfd2ViX3dyaXRlKCJ1c2VyX2luaXRpYXRlX2Rpc2Nvbm5lY3QiLCAiMCIpOyAvL9PDu6fW97avway909e0zKyjrM3Ls/a4ydSkxKPKvQorCQl6dGVfd2ViX3dyaXRlKCJtYW51YWxfZF93aWZpIiwgIjAiKTsKKworCisJCS8vbFJldD16dGVfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9XSUZJLCBNU0dfQ01EX1dJRklfU1RBVElPTl9DTE9TRSwgMCwgTlVMTCk7CisJCWxSZXQgPSBpcGNfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9XRUJfQ0dJLCBNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9XSUZJX1NUQVRJT05fQ0xPU0UsIDAsIE5VTEwsIDApOworCQlpZiAobFJldCAhPSAwKSB7CisJCQkvL3p0ZV93ZWJfd3JpdGUoIlJhZGlvT2ZmIiwgIjEiKTsKKwkJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsIlslc116dGVfd2xhbl9zdGF0aW9uX3NldCBNU0dfQ01EX1dJRklfU1RBVElPTl9DTE9TRSBmYWlsZWRcbiIsIF9fRklMRV9fKTsKKwkJfSBlbHNlIHsKKworCQkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX05PUk1BTCwiWyVzXXp0ZV93bGFuX3N0YXRpb25fc2V0IE1TR19DTURfV0lGSV9TVEFUSU9OX0NMT1NFIVxuIiwgX19GSUxFX18pOworCQl9CisKKwl9IGVsc2UgaWYgKHN0cmNtcCh3aWZpX3N0YV9jb25uZWN0aW9uLCAiMSIpID09IDApIHsgLy+5psTcv6rG9AorCisJCWlmIChzdHJjbXAod2lmaV9zdGFfY29ubmVjdGlvbiwgb2xkX3dpZmlfc3RhX2Nvbm5lY3Rpb24pID09IDApIHsKKwkJCS8vIGFwc3RhIMO709C/qsb0tq/X96OssrvQ6NKqyejWw1JhZGlvT2ZmCisKKwkJCXp0ZV93ZWJfd3JpdGUoInVzZXJfaW5pdGlhdGVfZGlzY29ubmVjdCIsICIwIik7IC8v08O7p9b3tq/BrL3T17TMrKOszcuz9rjJ1KTEo8q9CisJCQl6dGVfd2ViX3dyaXRlKCJtYW51YWxfZF93aWZpIiwgIjAiKTsKKwkJCS8qKioqKioqKioqKioKKwkJCSAgaWYoc3RyY21wKGFwX3N0YXRpb25fbW9kZSwgV0VCX1dMQU5fU1RBVElPTl9NT0RFX1dJRklfUFJFRikgPT0gMCkKKwkJCSAgeworCQkJICAgICAvLyB6dGVfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9CTENfUkNWLCBNU0dfQ01EX0JMQ19TRVRfV0lGSVNUQVRJT05fUFJFLCAwLCBOVUxMKTsKKwkJCSAgICAgIHdmX2xvZygiWyVzXXp0ZV93bGFuX3N0YXRpb25fc2V0IFdJRklTVEFUSU9OX1BSRSFcbiIsX19GSUxFX18pOworCQkJICB9CisJCQkgIGVsc2UgaWYoc3RyY21wKGFwX3N0YXRpb25fbW9kZSwgV0VCX1dMQU5fU1RBVElPTl9NT0RFX0RJQUxfUFJFRikgPT0gMCkKKwkJCSAgeworCQkJICAgICAgLy96dGVfc2VuZF9tZXNzYWdlKE1PRFVMRV9JRF9CTENfUkNWLCBNU0dfQ01EX0JMQ19TRVRfTU9ERU1fUFJFLCAwLCBOVUxMKTsKKwkJCSAgICAgIHdmX2xvZygiWyVzXXp0ZV93bGFuX3N0YXRpb25fc2V0IE1PREVNX1BSRSFcbiIsX19GSUxFX18pOworCQkJICB9CisJCQkgICoqKioqKioqKiovCisKKwkJfSBlbHNlIHsKKwkJCS8venRlX3dlYl93cml0ZSgiUmFkaW9PZmYiLCAiMCIpOyAvLyBzZXQgYXAgcmFkaW8gb2ZmCisKKwkJCXp0ZV93ZWJfd3JpdGUoInVzZXJfaW5pdGlhdGVfZGlzY29ubmVjdCIsICIwIik7IC8v08O7p9b3tq/BrL3T17TMrKOszcuz9rjJ1KTEo8q9CisJCQl6dGVfd2ViX3dyaXRlKCJtYW51YWxfZF93aWZpIiwgIjAiKTsKKworCQkJLy9sUmV0PXp0ZV9zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dJRkksIE1TR19DTURfV0lGSV9TVEFUSU9OX09QRU4sIDAsIE5VTEwpOworCQkJbFJldCA9IGlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dFQl9DR0ksIE1PRFVMRV9JRF9XSUZJLCBNU0dfQ01EX1dJRklfU1RBVElPTl9PUEVOLCAwLCBOVUxMLCAwKTsKKwkJCWlmIChsUmV0ICE9IDApIHsKKwkJCQkvL3p0ZV93ZWJfd3JpdGUoIlJhZGlvT2ZmIiwgIjEiKTsKKwkJCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCJbJXNdenRlX3dsYW5fc3RhdGlvbl9zZXQgTVNHX0NNRF9XSUZJX1NUQVRJT05fT1BFTiBmYWlsZWRcbiIsIF9fRklMRV9fKTsKKwkJCX0gZWxzZSB7CisKKwkJCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfTk9STUFMLCJbJXNdenRlX3dsYW5fc3RhdGlvbl9zZXQgTVNHX0NNRF9XSUZJX1NUQVRJT05fT1BFTiFcbiIsIF9fRklMRV9fKTsKKwkJCX0KKworCQl9CisJfQorCXNsb2coV0lGSV9QUklOVCwgU0xPR19ERUJVRywienRlX3dsYW5fc3RhdGlvbl9zZXQgU1VDQ0VTUyFcbiIpOy8vY292IG0KKwl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgU1VDQ0VTUyk7Cit9CisKKy8qCisgICAgtbHJvrP9tcTIyLXjINPrIMGsvdO5/bXEyMi14yDKx82s0ru49sjIteO1xMqxuvKjrNDo0qq9qworCisgICAgRVhfU1NJRDG1yCDW2NbDzqq/1aOssrvIu8/CtM674cilway909XiuPayu7Tm1Nq1xMjIteOjrAorCisgICAgMaGiyOe5+8m+s/2689bY0MLM7bzTo6y99r32ysdwcm9maWxlIG5hbWWyu82so6zI1Mi7u+HBrL3Tyc+1q8rHzt63qL2rd2lmaV9wcm9maWxlILXE17TMrM671sPOqiAxo6zS8s6qcHJvZmlsZdLRvq2yu8/gtcjByworCisgICAgMqGiyOe5+8rHyb6z/brzo6y4w8jItePKtbzKyNTIu7Tm1NqjrMjnuft3bGFuc3RhdGlvbrK71/YgcHJvZmlsZV9udW3OqjC1xLGju6SjrNTyu7nKx7vhway908nPo6y1vNbC17TMrLTtwtIKKworICAgIMv50tTH5b/V1eLQqW521rXKx9PQsdjSqrXECisKKyovCit2b2lkIHp0ZV93bGFuX3Jlc2V0X0VYX2FwKHZvaWQpCit7CisKKwl6dGVfd2ViX3dyaXRlKCJFWF9TU0lEMSIsICIiKTsKKwl6dGVfd2ViX3dyaXRlKCJFWF9BdXRoTW9kZSIsICIiKTsKKwl6dGVfd2ViX3dyaXRlKCJFWF9FbmNyeXBUeXBlIiwgIiIpOworCXp0ZV93ZWJfd3JpdGUoIkVYX0RlZmF1bHRLZXlJRCIsICIiKTsKKwl6dGVfd2ViX3dyaXRlKCJFWF9XRVBLRVkiLCAiIik7CisJenRlX3dlYl93cml0ZSgiRVhfV1BBUFNLMSIsICIiKTsKKwl6dGVfd2ViX3dyaXRlKCJFWF93aWZpX3Byb2ZpbGUiLCAiIik7CisJenRlX3dlYl93cml0ZSgiRVhfbWFjIiwgIiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbjogICAgICAgIHp0ZV93bGFuX3N0YXRpb25fc3BvdF9wcm9maWxlX3VwZGF0ZQorKiBEZXNjcmlwdGlvbjogICAgIHRvIHVwZGF0ZSB0aGUgd2lmaSBzcG90IHByb2ZpbGUKKyogSW5wdXQ6ICAgICAgICAgICBodHRwIGluZm8KKyogT3V0cHV0OgorKiBSZXR1cm46CisqIE90aGVyczoKKyogTW9kaWZ5IERhdGUgICBWZXJzaW9uICAgICBBdXRob3IgICAgICAgICAgTW9kaWZpY2F0aW9uCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIDIwMTUvMDMvMDkgICAgVjEuMCAgICAgICAgeHVqaWFuICAgICAgICAgIGZpcnN0IHZlcnNpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHp0ZV93bGFuX3N0YXRpb25fc3BvdF9wcm9maWxlX3VwZGF0ZSh3ZWJzX3Qgd3ApCit7CisJY2hhcl90ICphY3Rpb24gPSBOVUxMOworCWNoYXJfdCAqd2lmaV9wcm9maWxlX251bSA9IE5VTEw7CisJY2hhcl90IG9sZF93aWZpX3Byb2ZpbGVfbnVtW1dFQl9XTEFOX1NUQVRJT05fU1BPVF9OVU1fTEVOICsgMV0gPSB7MH07CisJY2hhcl90ICp3aWZpX3VwZGF0ZV9wcm9maWxlID0gTlVMTDsKKwljaGFyX3QgKndpZmlfcHJvZmlsZVtXRUJfV0xBTl9TVEFUSU9OX1NQT1RfTElTVF9NQVhdID0ge05VTEx9OworCWNoYXJfdCBzdGFfaXBfc3RhdHVzW1dFQl9XTEFOX1NUQVRJT05fSVBfU1RBVFVTX0xFTiArIDFdID0gezB9OworCWNoYXJfdCB3aWZpX3N0YV9jb25uZWN0aW9uW1dFQl9XTEFOX1NUQVRJT05fQ09OTkVDVElPTl9MRU4gKyAxXSA9IHswfTsKKwljaGFyX3Qgd2lmaV9wcm9maWxlX252X25hbWVbV0VCX1dMQU5fU1RBVElPTl9QUk9GSUxFX05WX05BTUVfTEVOXSA9IHswfTsKKwl1cGRhdGVpbmZvX3QgIGluZm8gPSB7MH07CisKKwljaGFyX3QgY3VycmVudF9wcm9maWxlW1dFQl9XTEFOX1NUQVRJT05fU1BPVF9QUk9GSUxFX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHNwb3Rfc3RyaW5nW1dFQl9XTEFOX1NUQVRJT05fU1BPVF9MRU5dID0gezB9OworCisJY2hhciB3aWZpX3Byb2ZpbGVfc3RyaW5nW1dFQl9XTEFOX1NUQVRJT05fU1BPVF9MRU5dID0gezB9OworCXdlYl9zcG90X3QgKiB3ZWJfd2lmaV9wcm9maWxlID0gTlVMTDsKKwl3ZWJfc3BvdF90ICogbnZfd2lmaV9wcm9maWxlID0gTlVMTDsKKworCXdlYl9zcG90X3QgKiB0bXBfd2lmaV9wcm9maWxlID0gTlVMTDsKKworCXdlYl9zcG90X3QgKiB3ZWJfc3BvdCA9IE5VTEw7CisJd2ViX3Nwb3RfdCAqIHVwZGF0ZV9zcG90ID0gTlVMTDsKKwlpbnQgaSA9IDA7CisKKwlpbnQgY3VycmVudF9wcm9maWxlX2ZsYWcgPSAtMTsgLy9zb3J0ZWQgbnVtIG9mIHdpZmlfcHJvZmlsZShudikgIGluIHdlYiB1aQorCisJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX05PUk1BTCwiWyVzXXVwZGF0ZSBzcG90IHByb2ZpbGVcbiIsIF9fRklMRV9fKTsKKworCS8vyOe5+1dJRknKx9X91NrBrL3TyMi149e0zKyjrNTysrvUytDt0N64xMjItePQxc+iCisJKHZvaWQpenRlX3dlYl9yZWFkKCJzdGFfaXBfc3RhdHVzIiwgc3RhX2lwX3N0YXR1cyk7CisJaWYgKHN0cmNtcChzdGFfaXBfc3RhdHVzLCBXRUJfV0xBTl9TVEFUSU9OX0lQX1NUQVRVU19DT05ORUNUSU5HKSA9PSAwIHx8CisJICAgIHN0cmNtcChzdGFfaXBfc3RhdHVzLCBXSUZJX1NUQVRJT05fSVBfU1RBVFVTX0RIQ1BJTkcpID09IDApIHsKKwkJLy96dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCxGQUlMVVJFKTsKKwkJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIFBST0NFU1NJTkcpOworCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCJbJXNddXBkYXRlIHNwb3QgcHJvZmlsZSxjb25uZWN0aW5nIHNvIGZhaWxlZFxuIiwgX19GSUxFX18pOworCisJCXJldHVybjsKKwl9CisKKwkvL7mmxNy52LHVo6zU8re1u9i07c7zCisJKHZvaWQpenRlX3dlYl9yZWFkKCJ3aWZpX3N0YV9jb25uZWN0aW9uIiwgd2lmaV9zdGFfY29ubmVjdGlvbik7CisJaWYgKHN0cmNtcCh3aWZpX3N0YV9jb25uZWN0aW9uLCAiMSIpICE9IDApIHsKKwkJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIEZBSUxVUkUpOworCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfRVJSLCJbJXNddXBkYXRlIHNwb3QgcHJvZmlsZSx3aWZpIHN0YSBubyBvcGVuIHNvIGZhaWxlZFxuIiwgX19GSUxFX18pOworCisJCXJldHVybjsKKwl9CisKKwlhY3Rpb24gPSB3ZWJzR2V0VmFyKHdwLCBUKCJhY3Rpb24iKSwgVCgiIikpOworCXdpZmlfcHJvZmlsZV9udW0gPSB3ZWJzR2V0VmFyKHdwLCBUKCJ3aWZpX3Byb2ZpbGVfbnVtIiksIFQoIiIpKTsKKwl3aWZpX3VwZGF0ZV9wcm9maWxlID0gd2Vic0dldFZhcih3cCwgVCgid2lmaV91cGRhdGVfcHJvZmlsZSIpLCBUKCIiKSk7CisKKwlzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc111cGRhdGUgc3BvdCBwcm9maWxlLHdpZmlfcHJvZmlsZV9udW09JXNcbiIsIF9fRklMRV9fLCB3aWZpX3Byb2ZpbGVfbnVtKTsKKwlzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc111cGRhdGUgc3BvdCBwcm9maWxlLHdpZmlfdXBkYXRlX3Byb2ZpbGU9JXNcbiIsIF9fRklMRV9fLCB3aWZpX3VwZGF0ZV9wcm9maWxlKTsKKworCXp0ZV93ZWJfcmVhZCgiRVhfd2lmaV9wcm9maWxlIiwgY3VycmVudF9wcm9maWxlKTsKKworCWlmIChzdHJjbXAoYWN0aW9uLCBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfREVMKSA9PSAwKSB7CisKKwkJaWYgKHN0cm5jbXAoY3VycmVudF9wcm9maWxlLCB3aWZpX3VwZGF0ZV9wcm9maWxlLCAyMCkgPT0gMCkgeworCisvL3dlYnVptObU2sui0MLOyszio6y74dPQvOTPtiC/ydLUsbvJvrP9o6zQ6NKq1Pa807TLsaO7pKOsway909e0zKy1xMjIteOjrLK71MrQ7bG7yb6z/QorCQkJaWYgKHN0cmNtcChzdGFfaXBfc3RhdHVzLCBXRUJfV0xBTl9TVEFUSU9OX0lQX1NUQVRVU19DT05ORUNUKSA9PSAwKSB7CisJCQkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXWRvIG5vdCBhbGxvdyBkZWwgY29ubmVjdGVkIHByb2ZpbGU9JXMsWyVzXVxuIiwgX19GSUxFX18sIHdpZmlfdXBkYXRlX3Byb2ZpbGUsIGN1cnJlbnRfcHJvZmlsZSk7CisJCQkJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIEZBSUxVUkUpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisvL8jnufvJvrP9wcvWrsewway907n9tcTIyLXjo6zQ6NKqx+W/1UVYX1NTSUQxtchudta1CisJCQkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdcmVzZXQgRVhfU1NJRDEgRVhfd2lmaV9wcm9maWxlPVslc11cbiIsIF9fRklMRV9fLCBjdXJyZW50X3Byb2ZpbGUpOworCQkJCXp0ZV93bGFuX3Jlc2V0X0VYX2FwKCk7CisJCQl9CisJCX0KKwl9CisJaWYgKHN0cmNtcChhY3Rpb24sIFdFQl9XTEFOX1NUQVRJT05fU1BPVF9NT0RJRlkpID09IDApIHsKKwkJc2NfY2ZnX2dldCgid2lmaV9wcm9maWxlIiwgd2lmaV9wcm9maWxlX3N0cmluZywgc2l6ZW9mKHdpZmlfcHJvZmlsZV9zdHJpbmcpKTsKKwkJaWYgKHN0cmNtcCh3aWZpX3Byb2ZpbGVfc3RyaW5nLCAiIikgPT0gMCkgeworCQkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXWVycm9yIW52OndpZmlfcHJvZmlsZT0lc1xuIiwgX19GSUxFX18sIHdpZmlfcHJvZmlsZV9zdHJpbmcpOworCQkJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIEZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkJbnZfd2lmaV9wcm9maWxlID0gcGFyc2Vfc3BvdF9zdHJpbmcod2lmaV9wcm9maWxlX3N0cmluZyk7CisJCWlmIChOVUxMID09IG52X3dpZmlfcHJvZmlsZSkgeworCQkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXWVycm9yIW52X3dpZmlfcHJvZmlsZT1udWxsXG4iLCBfX0ZJTEVfXyk7CisJCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VCX1dMQU5fU1RBVElPTl9TUE9UX0xJU1RfTUFYOyBpKyspIHsKKwkJaWYgKGkgPT0gMCkgeworCQkJc2FmZV9zdHJjcHkod2lmaV9wcm9maWxlX252X25hbWUsICJ3aWZpX3Byb2ZpbGUiLCBXRUJfV0xBTl9TVEFUSU9OX1BST0ZJTEVfTlZfTkFNRV9MRU4pOworCQl9IGVsc2UgeworCQkJbWVtc2V0KHdpZmlfcHJvZmlsZV9udl9uYW1lLCAwLCBXRUJfV0xBTl9TVEFUSU9OX1BST0ZJTEVfTlZfTkFNRV9MRU4pOworCQkJc25wcmludGYod2lmaV9wcm9maWxlX252X25hbWUsIFdFQl9XTEFOX1NUQVRJT05fUFJPRklMRV9OVl9OQU1FX0xFTiwgIndpZmlfcHJvZmlsZSVkIiwgaSk7CisJCX0KKworCQkvL7vxyKFXRUKyzsr91rUKKwkJd2lmaV9wcm9maWxlW2ldID0gd2Vic0dldFZhcih3cCwgd2lmaV9wcm9maWxlX252X25hbWUsIFQoIiIpKTsKKworCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc111cGRhdGUgc3BvdCBwcm9maWxlLHdpZmlfcHJvZmlsZVslZF09JXNcbiIsIF9fRklMRV9fLCBpLCB3aWZpX3Byb2ZpbGVbaV0pOworI2lmIDAKKwkJaWYgKHN0cmNtcChhY3Rpb24sIFdFQl9XTEFOX1NUQVRJT05fU1BPVF9NT0RJRlkpID09IDApIHsKKwkJCXRtcF93aWZpX3Byb2ZpbGUgPSBwYXJzZV9zcG90X3N0cmluZyh3aWZpX3Byb2ZpbGVbaV0pOworCQkJLy9rdyAzCisJCQlpZiAoKE5VTEwgIT0gdG1wX3dpZmlfcHJvZmlsZSkgJiYgKE5VTEwgIT0gbnZfd2lmaV9wcm9maWxlKSAmJiAoc3RyY21wKG52X3dpZmlfcHJvZmlsZS0+cHJvZmlsZV9uYW1lLCB0bXBfd2lmaV9wcm9maWxlLT5wcm9maWxlX25hbWUpID09IDApKSB7CisJCQkJY3VycmVudF9wcm9maWxlX2ZsYWcgPSBpOworCQkJCXdlYl93aWZpX3Byb2ZpbGUgPSB0bXBfd2lmaV9wcm9maWxlOworCQkJCXNsb2coV0lGSV9QUklOVCwgU0xPR19ERUJVRywiWyVzXWN1cnJlbnRfcHJvZmlsZV9mbGFnPSVkXG4iLCBfX0ZJTEVfXywgaSk7CisJCQl9IGVsc2UgeworCQkJCXNhZmVfZnJlZSh0bXBfd2lmaV9wcm9maWxlKTsvL2NvdgorCQkJfQorCQl9CisjZW5kaWYKKwl9CisJLy9rdyAzCisJZm9yIChpID0gMDsgaSA8IFdFQl9XTEFOX1NUQVRJT05fU1BPVF9MSVNUX01BWDsgaSsrKSB7CisJCWlmIChzdHJjbXAoYWN0aW9uLCBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfTU9ESUZZKSA9PSAwKSB7CisJCQl0bXBfd2lmaV9wcm9maWxlID0gcGFyc2Vfc3BvdF9zdHJpbmcod2lmaV9wcm9maWxlW2ldKTsKKwkJCWlmICgoTlVMTCAhPSB0bXBfd2lmaV9wcm9maWxlKSAmJiAoTlVMTCAhPSBudl93aWZpX3Byb2ZpbGUpICYmIChzdHJjbXAobnZfd2lmaV9wcm9maWxlLT5wcm9maWxlX25hbWUsIHRtcF93aWZpX3Byb2ZpbGUtPnByb2ZpbGVfbmFtZSkgPT0gMCkpIHsKKwkJCQljdXJyZW50X3Byb2ZpbGVfZmxhZyA9IGk7CisJCQkJd2ViX3dpZmlfcHJvZmlsZSA9IHRtcF93aWZpX3Byb2ZpbGU7CisJCQkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdY3VycmVudF9wcm9maWxlX2ZsYWc9JWRcbiIsIF9fRklMRV9fLCBpKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJc2FmZV9mcmVlKHRtcF93aWZpX3Byb2ZpbGUpOy8vY292CisJCQl9CisJCX0KKwl9CisKKwlpZiAoc3RyY21wKGFjdGlvbiwgV0VCX1dMQU5fU1RBVElPTl9TUE9UX01PRElGWSkgPT0gMCkgeworCQlpZiAoY3VycmVudF9wcm9maWxlX2ZsYWcgPD0gLTEpIHsgLy9rdyAzCisJCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc11lcnJvciFjdXJyZW50X3Byb2ZpbGVfZmxhZz0lZFxuIiwgX19GSUxFX18sIGN1cnJlbnRfcHJvZmlsZV9mbGFnKTsKKwkJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJCWdvdG8gZW5kOworCQl9CisJCWlmICh3ZWJfd2lmaV9wcm9maWxlLT5jb25uZWN0X3N0YXR1cyAhPSBudl93aWZpX3Byb2ZpbGUtPmNvbm5lY3Rfc3RhdHVzKSB7CisJCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc11lcnJvciF3ZWJfd2lmaV9wcm9maWxlLT5jb25uZWN0X3N0YXR1cz0lZCxudl93aWZpX3Byb2ZpbGUtPmNvbm5lY3Rfc3RhdHVzPSVkXG4iLCBfX0ZJTEVfXywKKwkJCSAgICAgICB3ZWJfd2lmaV9wcm9maWxlLT5jb25uZWN0X3N0YXR1cywgbnZfd2lmaV9wcm9maWxlLT5jb25uZWN0X3N0YXR1cyk7CisJCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgUFJPQ0VTU0lORyk7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKwkvL7bBvsnWtQorCSh2b2lkKXp0ZV93ZWJfcmVhZCgid2lmaV9wcm9maWxlX251bSIsIG9sZF93aWZpX3Byb2ZpbGVfbnVtKTsKKwlzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc111cGRhdGUgc3BvdCBwcm9maWxlLCBvbGRfd2lmaV9wcm9maWxlX251bT0lc1xuIiwgX19GSUxFX18sIG9sZF93aWZpX3Byb2ZpbGVfbnVtKTsKKworCS8vss7K/brPt6jQ1LzssukKKwlpZiAoY2hlY2tfc3BvdF92YWx1ZShhY3Rpb24sIHdpZmlfcHJvZmlsZV9udW0sIG9sZF93aWZpX3Byb2ZpbGVfbnVtLCB3aWZpX3VwZGF0ZV9wcm9maWxlLCB3aWZpX3Byb2ZpbGUpID09IEZBTFNFKSB7CisJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXXVwZGF0ZSBzcG90IHByb2ZpbGUscGFyYSB3cm9uZyBzbyBmYWlsZWRcbiIsIF9fRklMRV9fKTsKKwkJZ290byBlbmQ7CisJfQorCXNsb2coV0lGSV9QUklOVCwgU0xPR19ERUJVRywiWyVzXXVwZGF0ZSBzcG90IHByb2ZpbGUsIGFjdGlvbj0lc1xuIiwgX19GSUxFX18sIGFjdGlvbik7CisKKworCisJLy/PyMrNt8XWrsewtOa0orXEyMi148HQse3E2rTmCisJZm9yIChpID0gMDsgaSA8IFdFQl9XTEFOX1NUQVRJT05fU1BPVF9MSVNUX01BWDsgaSsrKSB7CisJCXNhZmVfZnJlZShnX3Nwb3RfbGlzdFtpXSk7CisJfQorCisvL72ryMi1473izva1vSC94bm5zOXA78Pmo6y3vbHjxcXQ8sq508MKKwlmb3IgKGkgPSAwOyBpIDwgV0VCX1dMQU5fU1RBVElPTl9TUE9UX0xJU1RfTUFYOyBpKyspIHsKKworCQl3ZWJfc3BvdCA9IHBhcnNlX3Nwb3Rfc3RyaW5nKHdpZmlfcHJvZmlsZVtpXSk7CisKKwkJaWYgKE5VTEwgPT0gd2ViX3Nwb3QpYnJlYWs7CisKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdd2ViX3Nwb3QtPnNzaWQ9JXNcbiIsIF9fRklMRV9fLCB3ZWJfc3BvdC0+c3NpZCk7CisKKwkJaWYgKHdlYl9zcG90LT5mcm9tX3Byb3ZpZGVyID09IDEpIC8vINTL06rJzMjItePM7bzT1Nq12tK7zrsKKwkJCWluc2VydF90b19zcG90X2xpc3QoMSwgd2ViX3Nwb3QpOworCQllbHNlIGlmIChzdHJjbXAoY3VycmVudF9wcm9maWxlLCB3ZWJfc3BvdC0+cHJvZmlsZV9uYW1lKSA9PSAwKSAvLyDI57n7yse1scewwbS907XEyMi146Os1PLQ6NKqxcXU2tTL06rJzLrzw+YKKwkJCWluc2VydF90b19zcG90X2xpc3QoMiwgd2ViX3Nwb3QpOworCQllbHNlCisJCQlpbnNlcnRfdG9fc3BvdF9saXN0KDMsIHdlYl9zcG90KTsgLy/G1c2oyMi146OssLTLs9Dyzfm688XFCisKKwl9CisKKy8vvau4/NDCyMi147340NC31r3io6y05rW9z+DTpr3hubnM5dbQCisJdXBkYXRlX3Nwb3QgPSBwYXJzZV9zcG90X3N0cmluZyh3aWZpX3VwZGF0ZV9wcm9maWxlKTsKKwlpZiAodXBkYXRlX3Nwb3QgIT0gTlVMTCkgeworCQljaGFyICpwdHIgPSBOVUxMOworCQlzaXplX3QgIGtleV9sZW4gPSAwOworCQorICAgICAgICBzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc111cGRhdGVfc3BvdC0+c3NpZD0lc1xuIiwgX19GSUxFX18sIHVwZGF0ZV9zcG90LT5zc2lkKTsKKwkJLy/F0LbPd2Vws6S2yMrHt/HOqjWhojEzoaIxNgorCQlwdHIgPSBzdHJzdHIgKHVwZGF0ZV9zcG90LT5lbmNyeXB0X3R5cGUsICJXRVAiKTsKKwkJaWYgKHB0cikgeworCQkJa2V5X2xlbiA9IHN0cm5sZW4odXBkYXRlX3Nwb3QtPnBhc3N3b3JkLFdJRklfU1RBVElPTl9TUE9UX1BBU1NXT1JEX0xFTik7CisJCQlpZiAoa2V5X2xlbiAhPSA1ICYmIGtleV9sZW4gIT0gMTMgJiYga2V5X2xlbiAhPSAxNikgeyAvL2FzY2lpCisJCQkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXWVycm9yIXdlcCBrZXkgbGVuIGludmFsaWRcbiIsIF9fRklMRV9fKTsKKwkJCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCQkJc2FmZV9mcmVlKHVwZGF0ZV9zcG90KTsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisJfQorCisvL7WxseC8rcqxuvKjrNDo0qqy6b+0yse38dDo0qq4/NDCRVggQVAgz+C52MTayN0KKwlpZiAodXBkYXRlX3Nwb3QgIT0gTlVMTCAmJiBzdHJjbXAoYWN0aW9uLCBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfTU9ESUZZKSA9PSAwKSB7CisJCWlmIChzdHJjbXAoY3VycmVudF9wcm9maWxlLCB1cGRhdGVfc3BvdC0+cHJvZmlsZV9uYW1lKSA9PSAwKSB7CisJCQljaGFyIGtleWlkWzhdID0gezB9OworCQkJc3ByaW50ZihrZXlpZCwgIiVkIiwgdXBkYXRlX3Nwb3QtPmtleUlEKTsKKwkJCXp0ZV93ZWJfd3JpdGUoIkVYX1NTSUQxIiwgdXBkYXRlX3Nwb3QtPnNzaWQpOworCQkJenRlX3dlYl93cml0ZSgiRVhfQXV0aE1vZGUiLCB1cGRhdGVfc3BvdC0+YXV0aF9tb2RlKTsKKwkJCXp0ZV93ZWJfd3JpdGUoIkVYX0VuY3J5cFR5cGUiLCB1cGRhdGVfc3BvdC0+ZW5jcnlwdF90eXBlKTsKKwkJCXp0ZV93ZWJfd3JpdGUoIkVYX0RlZmF1bHRLZXlJRCIsIGtleWlkKTsKKwkJCXp0ZV93ZWJfd3JpdGUoIkVYX1dQQVBTSzEiLCB1cGRhdGVfc3BvdC0+cGFzc3dvcmQpOworCQkJenRlX3dlYl93cml0ZSgiRVhfV0VQS0VZIiwgdXBkYXRlX3Nwb3QtPnBhc3N3b3JkKTsKKwkJCXp0ZV93ZWJfd3JpdGUoIkVYX21hYyIsIHVwZGF0ZV9zcG90LT5tYWMpOworCQkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0RFQlVHLCJbJXNdcmVzZXQgRVhfU1NJRDE9JXMgLEVYX0F1dGhNb2RlPSVzICxFWF9FbmNyeXBUeXBlPSVzICxFWF9EZWZhdWx0S2V5SUQgPSVkICxFWF9XUEFQU0sxPUVYX1dFUEtFWT1bJXNdPVxuIiwKKwkJCSAgICAgICBfX0ZJTEVfXywgdXBkYXRlX3Nwb3QtPnNzaWQsIHVwZGF0ZV9zcG90LT5hdXRoX21vZGUsIHVwZGF0ZV9zcG90LT5lbmNyeXB0X3R5cGUsIHVwZGF0ZV9zcG90LT5rZXlJRCwgdXBkYXRlX3Nwb3QtPnBhc3N3b3JkKTsKKwkJfQorCX0KKy8vsum/tMrHt/HW2Li0zO2808/gzaxTU0lECisJZm9yIChpID0gMDsgaSA8IFdFQl9XTEFOX1NUQVRJT05fU1BPVF9MSVNUX01BWDsgaSsrKSB7CisJCWlmIChnX3Nwb3RfbGlzdFtpXSAhPSBOVUxMICYmIHVwZGF0ZV9zcG90ICE9IE5VTEwpIHsKKwkJCWlmIChzdHJjbXAoZ19zcG90X2xpc3RbaV0tPnByb2ZpbGVfbmFtZSwgdXBkYXRlX3Nwb3QtPnByb2ZpbGVfbmFtZSkgIT0gMCAmJgorCQkJICAgIHN0cmNtcChnX3Nwb3RfbGlzdFtpXS0+c3NpZCwgdXBkYXRlX3Nwb3QtPnNzaWQpID09IDAgJiYKKwkJCSAgICBzdHJjbXAoYWN0aW9uLCBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfQUREKSA9PSAwKSB7CisJCQkJc2FmZV9mcmVlKHVwZGF0ZV9zcG90KTsKKwkJCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc11ub3QgYWxsb3cgYWRkIHRoZSBzYW1lIFNTSUShoXNwb3RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIEVYSVNUKTsKKwkJCQlnb3RvIGVuZDsKKworCQkJfSBlbHNlIGlmICgKKwkJCSAgICBzdHJjbXAoZ19zcG90X2xpc3RbaV0tPnByb2ZpbGVfbmFtZSwgdXBkYXRlX3Nwb3QtPnByb2ZpbGVfbmFtZSkgIT0gMCAmJgorCQkJICAgIHN0cmNtcChnX3Nwb3RfbGlzdFtpXS0+c3NpZCwgdXBkYXRlX3Nwb3QtPnNzaWQpID09IDAgJiYKKwkJCSAgICBzdHJjbXAoYWN0aW9uLCBXRUJfV0xBTl9TVEFUSU9OX1NQT1RfTU9ESUZZKSA9PSAwKSB7CisJCQkJc2FmZV9mcmVlKHVwZGF0ZV9zcG90KTsKKwkJCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfREVCVUcsIlslc11ub3QgYWxsb3cgbW9kaWZ5IHRvIHRoZSBleGlzdGVkIFNTSUQgZnJvbSBzcG90IGxpc3QhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBFWElTVCk7CisJCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwl9CisJc2FmZV9mcmVlKHVwZGF0ZV9zcG90KTsKKworCisKKworCS8v1+66872ruPzQwrXEbnbWtSCxo7TmINC0yOsKKwkodm9pZCl6dGVfd2ViX3dyaXRlKCJ3aWZpX3Byb2ZpbGVfbnVtIiwgd2lmaV9wcm9maWxlX251bSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VCX1dMQU5fU1RBVElPTl9TUE9UX0xJU1RfTUFYOyBpKyspIHsKKworCQlpZiAoaSA9PSAwKSB7CisJCQlzYWZlX3N0cmNweSh3aWZpX3Byb2ZpbGVfbnZfbmFtZSwgIndpZmlfcHJvZmlsZSIsIFdFQl9XTEFOX1NUQVRJT05fUFJPRklMRV9OVl9OQU1FX0xFTik7CisJCX0gZWxzZSB7CisJCQltZW1zZXQod2lmaV9wcm9maWxlX252X25hbWUsIDAsIFdFQl9XTEFOX1NUQVRJT05fUFJPRklMRV9OVl9OQU1FX0xFTik7CisJCQlzbnByaW50Zih3aWZpX3Byb2ZpbGVfbnZfbmFtZSwgV0VCX1dMQU5fU1RBVElPTl9QUk9GSUxFX05WX05BTUVfTEVOLCAid2lmaV9wcm9maWxlJWQiLCBpKTsKKwkJfQorCQltZW1zZXQoc3BvdF9zdHJpbmcsIDAsIHNpemVvZihzcG90X3N0cmluZykpOworCQlpZiAoZ19zcG90X2xpc3RbaV0gIT0gTlVMTCkgeworCQkJc25wcmludGYoc3BvdF9zdHJpbmcsIFdJRklfU1RBVElPTl9TUE9UX0xFTiwgIiVzLCVkLCVkLCVkLCVzLCVzLCVzLCVzLCVkLCVzIiwgZ19zcG90X2xpc3RbaV0tPnByb2ZpbGVfbmFtZSwKKwkJCSAgICAgICAgIGdfc3BvdF9saXN0W2ldLT5mcm9tX3Byb3ZpZGVyLCBnX3Nwb3RfbGlzdFtpXS0+Y29ubmVjdF9zdGF0dXMsIGdfc3BvdF9saXN0W2ldLT5zaWduYWwsCisJCQkgICAgICAgICBnX3Nwb3RfbGlzdFtpXS0+c3NpZCwgZ19zcG90X2xpc3RbaV0tPmF1dGhfbW9kZSwgZ19zcG90X2xpc3RbaV0tPmVuY3J5cHRfdHlwZSwKKwkJCSAgICAgICAgIGdfc3BvdF9saXN0W2ldLT5wYXNzd29yZCwgZ19zcG90X2xpc3RbaV0tPmtleUlELCBnX3Nwb3RfbGlzdFtpXS0+bWFjKTsKKwkJfQorCisJCXNsb2coV0lGSV9QUklOVCwgU0xPR19ERUJVRywiWyVzXXdpZmlfcHJvZmlsZV9udl9uYW1lPSVzLCBzcG90X3N0cmluZz0lc1xuIiwgX19GSUxFX18sIHdpZmlfcHJvZmlsZV9udl9uYW1lLCBzcG90X3N0cmluZyk7CisJCSh2b2lkKXp0ZV93ZWJfd3JpdGUod2lmaV9wcm9maWxlX252X25hbWUsIHNwb3Rfc3RyaW5nKTsKKwl9CisKKwlzdHJuY3B5KGluZm8uYWN0aW9uLCBhY3Rpb24sc2l6ZW9mKGluZm8uYWN0aW9uKS0xKTsKKwlzdHJuY3B5KGluZm8uc3BvdCwgd2lmaV91cGRhdGVfcHJvZmlsZSwgc2l6ZW9mKGluZm8uc3BvdCktMSk7CisJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX05PUk1BTCwiWyVzXXh1amlhbiBzZW5kIE1TR19DTURfV0lGSV9TVEFUSU9OX1NQT1RfVVBEQVRFIHN0YXJ0ICBhY3Rpb24gPSVzICAgXG4iLCBfX0ZJTEVfXywgaW5mby5hY3Rpb24pOworCS8venRlX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9XSUZJX1NUQVRJT05fU1BPVF9VUERBVEUsIHNpemVvZihpbmZvKSwoVUNIQVIqKWluZm8pOworCWlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dFQl9DR0ksIE1PRFVMRV9JRF9XSUZJLCBNU0dfQ01EX1dJRklfU1RBVElPTl9TUE9UX1VQREFURSwgc2l6ZW9mKHVwZGF0ZWluZm9fdCksIChVQ0hBUiopJmluZm8sIDApOworCXNsb2coV0lGSV9QUklOVCwgU0xPR19ERUJVRywiWyVzXXh1amlhbiBzZW5kIE1TR19DTURfV0lGSV9TVEFUSU9OX1NQT1RfVVBEQVRFIGVuZFxuIiwgX19GSUxFX18pOworCisJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIFNVQ0NFU1MpOworCitlbmQ6CisJc2FmZV9mcmVlKG52X3dpZmlfcHJvZmlsZSk7CisJc2FmZV9mcmVlKHRtcF93aWZpX3Byb2ZpbGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbjogICAgICAgIHp0ZV93bGFuX3N0YXRpb25fY29ubmVjdAorKiBEZXNjcmlwdGlvbjogICAgIHRvIGNvbm5lY3QgdGhlIHdpZmkgc3BvdAorKiBJbnB1dDogICAgICAgICAgIGh0dHAgaW5mbworKiBPdXRwdXQ6CisqIFJldHVybjoKKyogT3RoZXJzOgorKiBNb2RpZnkgRGF0ZSAgIFZlcnNpb24gICAgIEF1dGhvciAgICAgICAgICBNb2RpZmljYXRpb24KKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogMjAxNS8wMy8wOSAgICBWMS4wICAgICAgICB4dWppYW4gICAgICAgICAgZmlyc3QgdmVyc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgenRlX3dsYW5fc3RhdGlvbl9jb25uZWN0KHdlYnNfdCB3cCkKK3sKKwljaGFyX3QgKkVYX1NTSUQxID0gTlVMTDsKKwljaGFyX3QgKkVYX0F1dGhNb2RlID0gTlVMTDsKKwljaGFyX3QgKkVYX0VuY3J5cFR5cGUgPSBOVUxMOworCWNoYXJfdCAqRVhfRGVmYXVsdEtleUlEID0gTlVMTDsKKwljaGFyX3QgKkVYX1dFUEtFWSA9IE5VTEw7CisJY2hhcl90ICpFWF9XUEFQU0sxID0gTlVMTDsKKwljaGFyX3QgKkVYX3dpZmlfcHJvZmlsZSA9IE5VTEw7CisJY2hhcl90ICpFWF9tYWMgPSBOVUxMOworCWNoYXJfdCBzdGFfaXBfc3RhdHVzW1dFQl9XTEFOX1NUQVRJT05fSVBfU1RBVFVTX0xFTiArIDFdID0gezB9OworCWNoYXJfdCB3aWZpX3N0YV9jb25uZWN0aW9uW1dFQl9XTEFOX1NUQVRJT05fQ09OTkVDVElPTl9MRU4gKyAxXSA9IHswfTsKKwljaGFyIHdpZmlfY3VyX3N0YXRlWzhdID0gezB9OworCisJbG9uZyByZXQgPSAwOworCisJRVhfU1NJRDEgPSB3ZWJzR2V0VmFyKHdwLCBUKCJFWF9TU0lEMSIpLCBUKCIiKSk7CisJRVhfQXV0aE1vZGUgPSB3ZWJzR2V0VmFyKHdwLCBUKCJFWF9BdXRoTW9kZSIpLCBUKCIiKSk7CisJRVhfRW5jcnlwVHlwZSA9IHdlYnNHZXRWYXIod3AsIFQoIkVYX0VuY3J5cFR5cGUiKSwgVCgiIikpOworCUVYX0RlZmF1bHRLZXlJRCA9IHdlYnNHZXRWYXIod3AsIFQoIkVYX0RlZmF1bHRLZXlJRCIpLCBUKCIiKSk7CisJRVhfV0VQS0VZID0gd2Vic0dldFZhcih3cCwgVCgiRVhfV0VQS0VZIiksIFQoIiIpKTsKKwlFWF9XUEFQU0sxID0gd2Vic0dldFZhcih3cCwgVCgiRVhfV1BBUFNLMSIpLCBUKCIiKSk7CisJRVhfd2lmaV9wcm9maWxlID0gd2Vic0dldFZhcih3cCwgVCgiRVhfd2lmaV9wcm9maWxlIiksIFQoIiIpKTsKKwlFWF9tYWMgPSB3ZWJzR2V0VmFyKHdwLCBUKCJFWF9tYWMiKSwgVCgiIikpOworCXNsb2coV0lGSV9QUklOVCwgU0xPR19OT1JNQUwsIi0tLS0tenRlX3dsYW5fc3RhdGlvbl9jb25uZWN0LS0tLS1FWF9BdXRoTW9kZSBpcyAlc1xuIiwgRVhfQXV0aE1vZGUpOworCS8vss7K/brPt6jQ1LzssukKKwlpZiAoY2hlY2tfY29ubmVjdF92YWx1ZShFWF9TU0lEMSwgRVhfQXV0aE1vZGUsIEVYX0VuY3J5cFR5cGUsIEVYX0RlZmF1bHRLZXlJRCwgRVhfd2lmaV9wcm9maWxlLCBFWF9XRVBLRVksIEVYX1dQQVBTSzEpID09IEZBTFNFKSB7CisJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXWNvbm5lY3QgcGFyYSBjaGVjayBmYWlsZWRcbiIsIF9fRklMRV9fKTsKKworCQlyZXR1cm47CisJfQorCisJLy/I57n7V0lGScrH1f3U2sGsvdPIyLXj17TMrCzU8re1u9i07c7zCisJKHZvaWQpenRlX3dlYl9yZWFkKCJzdGFfaXBfc3RhdHVzIiwgc3RhX2lwX3N0YXR1cyk7CisJKHZvaWQpenRlX3dlYl9yZWFkKCJ3aWZpX2N1cl9zdGF0ZSIsIHdpZmlfY3VyX3N0YXRlKTsKKwlpZiAoc3RyY21wKHN0YV9pcF9zdGF0dXMsIFdFQl9XTEFOX1NUQVRJT05fSVBfU1RBVFVTX0NPTk5FQ1RJTkcpID09IDAgfHwKKwkgICAgc3RyY21wKHN0YV9pcF9zdGF0dXMsIFdJRklfU1RBVElPTl9JUF9TVEFUVVNfREhDUElORykgPT0gMCkgeworCQkvL3p0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLEZBSUxVUkUpOworCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgUFJPQ0VTU0lORyk7CisJCXNsb2coV0lGSV9QUklOVCwgU0xPR19FUlIsIlslc11zdGFfaXBfc3RhdHVzIGNvbm5lY3Rpbmcgc28gZmFpbGVkXG4iLCBfX0ZJTEVfXyk7CisKKwkJcmV0dXJuOworCX0KKworCS8vuabE3LnYsdWjrNTyt7W72LTtzvMKKwkodm9pZCl6dGVfd2ViX3JlYWQoIndpZmlfc3RhX2Nvbm5lY3Rpb24iLCB3aWZpX3N0YV9jb25uZWN0aW9uKTsKKwlpZiAoc3RyY21wKHdpZmlfY3VyX3N0YXRlLCBXSUZJX0NMT1NFRCkgPT0gMCB8fCBzdHJjbXAod2lmaV9zdGFfY29ubmVjdGlvbiwgIjEiKSAhPSAwKSB7CisJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBGQUlMVVJFKTsKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXWFwc3RhIGNsb3NlZCAsIHNvIGZhaWxlZFxuIiwgX19GSUxFX18pOworCQlyZXR1cm47CisJfQorCisJLy/QtE5WCisJKHZvaWQpenRlX3dlYl93cml0ZSgiRVhfU1NJRDEiLCBFWF9TU0lEMSk7CisJKHZvaWQpenRlX3dlYl93cml0ZSgiRVhfQXV0aE1vZGUiLCBFWF9BdXRoTW9kZSk7CisJKHZvaWQpenRlX3dlYl93cml0ZSgiRVhfRW5jcnlwVHlwZSIsIEVYX0VuY3J5cFR5cGUpOworCSh2b2lkKXp0ZV93ZWJfd3JpdGUoIkVYX0RlZmF1bHRLZXlJRCIsIEVYX0RlZmF1bHRLZXlJRCk7CisJKHZvaWQpenRlX3dlYl93cml0ZSgiRVhfV0VQS0VZIiwgRVhfV0VQS0VZKTsKKwkodm9pZCl6dGVfd2ViX3dyaXRlKCJFWF9XUEFQU0sxIiwgRVhfV1BBUFNLMSk7CisJKHZvaWQpenRlX3dlYl93cml0ZSgiRVhfd2lmaV9wcm9maWxlIiwgRVhfd2lmaV9wcm9maWxlKTsKKwkodm9pZCl6dGVfd2ViX3dyaXRlKCJFWF9tYWMiLCBFWF9tYWMpOworCisKKwkvLyAgIHJlc29ydF9zcG90X2xpc3QoMixFWF93aWZpX3Byb2ZpbGUpOworCisJLy/QtNX91NrBrL3T17TMrAorLy8gICAodm9pZCl6dGVfd2ViX3dyaXRlKCJzdGFfaXBfc3RhdHVzIiwgV0VCX1dMQU5fU1RBVElPTl9JUF9TVEFUVVNfQ09OTkVDVElORyk7CisKKwl6dGVfd2ViX3dyaXRlKCJtYW51YWxfZF93aWZpIiwgIjAiKTsKKworCS8vcmV0PXp0ZV9zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dJRkksIE1TR19DTURfV0lGSV9TVEFUSU9OX0NPTk5FQ1QsIDAsIE5VTEwpOworCXJldCA9IGlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dFQl9DR0ksIE1PRFVMRV9JRF9XSUZJLCBNU0dfQ01EX1dJRklfU1RBVElPTl9DT05ORUNULCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXXNlbmQgTVNHX0NNRF9XSUZJX1NUQVRJT05fQ09OTkVDVCBmYWlsZWRcbiIsIF9fRklMRV9fKTsKKwl9IGVsc2UgeworCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfTk9STUFMLCJbJXNdc2VuZCBNU0dfQ01EX1dJRklfU1RBVElPTl9DT05ORUNUIHN1Y2Nlc3NcbiIsIF9fRklMRV9fKTsKKwl9CisJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIFNVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbjogICAgICAgIHp0ZV93bGFuX3N0YXRpb25fZGlzY29ubmVjdAorKiBEZXNjcmlwdGlvbjogICAgIHRvIGRpc2Nvbm5lY3QgdGhlIHdpZmkgc3BvdAorKiBJbnB1dDogICAgICAgICAgIGh0dHAgaW5mbworKiBPdXRwdXQ6CisqIFJldHVybjoKKyogT3RoZXJzOgorKiBNb2RpZnkgRGF0ZSAgIFZlcnNpb24gICAgIEF1dGhvciAgICAgICAgICBNb2RpZmljYXRpb24KKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogMjAxNS8wMy8wOSAgICBWMS4wICAgICAgICB4dWppYW4gICAgICAgICAgZmlyc3QgdmVyc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgenRlX3dsYW5fc3RhdGlvbl9kaXNjb25uZWN0KHdlYnNfdCB3cCkKK3sKKwljaGFyX3Qgd2lmaV9zdGFfY29ubmVjdGlvbltXRUJfV0xBTl9TVEFUSU9OX0NPTk5FQ1RJT05fTEVOICsgMV0gPSB7MH07CisJY2hhcl90IHN0YV9pcF9zdGF0dXNbV0VCX1dMQU5fU1RBVElPTl9JUF9TVEFUVVNfTEVOICsgMV0gPSB7MH07CisJbG9uZyByZXQgPSAwOworCS8vuabE3LnYsdWjrNTyt7W72LTtzvMKKwkodm9pZCl6dGVfd2ViX3JlYWQoIndpZmlfc3RhX2Nvbm5lY3Rpb24iLCB3aWZpX3N0YV9jb25uZWN0aW9uKTsKKwlpZiAoc3RyY21wKHdpZmlfc3RhX2Nvbm5lY3Rpb24sICIxIikgIT0gMCkgeworCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKworCS8vyOe5+1dJRknKx9X91NrBrL3TyMi149e0zKws1PK3tbvYtO3O8worCSh2b2lkKXp0ZV93ZWJfcmVhZCgic3RhX2lwX3N0YXR1cyIsIHN0YV9pcF9zdGF0dXMpOworCWlmIChzdHJjbXAoc3RhX2lwX3N0YXR1cywgV0VCX1dMQU5fU1RBVElPTl9JUF9TVEFUVVNfQ09OTkVDVElORykgPT0gMCB8fAorCSAgICBzdHJjbXAoc3RhX2lwX3N0YXR1cywgV0lGSV9TVEFUSU9OX0lQX1NUQVRVU19ESENQSU5HKSA9PSAwKSB7CisJCS8venRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsRkFJTFVSRSk7CisJCXp0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLCBQUk9DRVNTSU5HKTsKKwkJcmV0dXJuOworCX0KKworCXp0ZV93ZWJfd3JpdGUoIm1hbnVhbF9kX3dpZmkiLCAiMSIpOworCS8venRlX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0lGSSwgTVNHX0NNRF9XSUZJX1NUQVRJT05fRElTQ09OTkVDVCwgMCwgTlVMTCk7CisJcmV0ID0gaXBjX3NlbmRfbWVzc2FnZShNT0RVTEVfSURfV0VCX0NHSSwgTU9EVUxFX0lEX1dJRkksIE1TR19DTURfV0lGSV9TVEFUSU9OX0RJU0NPTk5FQ1QsIDAsIE5VTEwsIDApOyAvL2t3IDMKKwlpZiAocmV0ICE9IDApIHsKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXXNlbmQgTVNHX0NNRF9XSUZJX1NUQVRJT05fRElTQ09OTkVDVCBmYWlsZWRcbiIsIF9fRklMRV9fKTsKKwl9IGVsc2UgeworCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfTk9STUFMLCJbJXNdc2VuZCBNU0dfQ01EX1dJRklfU1RBVElPTl9ESVNDT05ORUNUIHN1Y2Nlc3NcbiIsIF9fRklMRV9fKTsKKwl9CisJenRlX3dyaXRlX3Jlc3VsdF90b193ZWIod3AsIFNVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbjogICAgICAgIHp0ZV93bGFuX3N0YXRpb25fcmVmcmVzaAorKiBEZXNjcmlwdGlvbjogICAgIHRvIHNjYW4gdGhlIHdpZmkgc3BvdAorKiBJbnB1dDogICAgICAgICAgIGh0dHAgaW5mbworKiBPdXRwdXQ6CisqIFJldHVybjoKKyogT3RoZXJzOgorKiBNb2RpZnkgRGF0ZSAgIFZlcnNpb24gICAgIEF1dGhvciAgICAgICAgICBNb2RpZmljYXRpb24KKyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogMjAxNS8wMy8wOSAgICBWMS4wICAgICAgICB4dWppYW4gICAgICAgICAgZmlyc3QgdmVyc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgenRlX3dsYW5fc3RhdGlvbl9yZWZyZXNoKHdlYnNfdCB3cCkKK3sKKwljaGFyX3Qgd2lmaV9zdGFfY29ubmVjdGlvbltXRUJfV0xBTl9TVEFUSU9OX0NPTk5FQ1RJT05fTEVOICsgMV0gPSB7MH07CisJY2hhcl90IHN0YV9pcF9zdGF0dXNbV0VCX1dMQU5fU1RBVElPTl9JUF9TVEFUVVNfTEVOICsgMV0gPSB7MH07CisJbG9uZyByZXQgPSAwOworCS8vuabE3LnYsdWjrNTyt7W72LTtzvMKKwkodm9pZCl6dGVfd2ViX3JlYWQoIndpZmlfc3RhX2Nvbm5lY3Rpb24iLCB3aWZpX3N0YV9jb25uZWN0aW9uKTsKKwlpZiAoc3RyY21wKHdpZmlfc3RhX2Nvbm5lY3Rpb24sICIxIikgIT0gMCkgeworCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwkvL8jnuftXSUZJysfV/dTaway908jItePXtMysLNTyt7W72LTtzvMKKwkodm9pZCl6dGVfd2ViX3JlYWQoInN0YV9pcF9zdGF0dXMiLCBzdGFfaXBfc3RhdHVzKTsKKwlpZiAoc3RyY21wKHN0YV9pcF9zdGF0dXMsIFdFQl9XTEFOX1NUQVRJT05fSVBfU1RBVFVTX0NPTk5FQ1RJTkcpID09IDAgfHwKKwkgICAgc3RyY21wKHN0YV9pcF9zdGF0dXMsIFdJRklfU1RBVElPTl9JUF9TVEFUVVNfREhDUElORykgPT0gMCkgeworCQkvL3p0ZV93cml0ZV9yZXN1bHRfdG9fd2ViKHdwLEZBSUxVUkUpOworCQl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgUFJPQ0VTU0lORyk7CisJCXJldHVybjsKKwl9CisKKwkodm9pZCl6dGVfd2ViX3dyaXRlKE5WX1dJRklfU0NBTl9GSU5JU0gsICIwIik7CisKKwkvL3p0ZV9zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dJRkksIE1TR19DTURfV0lGSV9TVEFUSU9OX1NDQU4sIDAsIE5VTEwpOworCXJldCA9IGlwY19zZW5kX21lc3NhZ2UoTU9EVUxFX0lEX1dFQl9DR0ksIE1PRFVMRV9JRF9XSUZJLCBNU0dfQ01EX1dJRklfU1RBVElPTl9TQ0FOLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJc2xvZyhXSUZJX1BSSU5ULCBTTE9HX0VSUiwiWyVzXXNlbmQgTVNHX0NNRF9XSUZJX1NUQVRJT05fU0NBTiBmYWlsZWRcbiIsIF9fRklMRV9fKTsKKwl9IGVsc2UgeworCQlzbG9nKFdJRklfUFJJTlQsIFNMT0dfTk9STUFMLCJbJXNdc2VuZCBNU0dfQ01EX1dJRklfU1RBVElPTl9TQ0FOIHN1Y2Nlc3NcbiIsIF9fRklMRV9fKTsKKwl9CisKKwl6dGVfd3JpdGVfcmVzdWx0X3RvX3dlYih3cCwgU1VDQ0VTUyk7CisKK30K