ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJzb2Z0YXAvbmV0b3RoZXJhcGkuYyBiL2FwL2xpYi9saWJzb2Z0YXAvbmV0b3RoZXJhcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNGI1NDdkCi0tLSAvZGV2L251bGwKKysrIGIvYXAvbGliL2xpYnNvZnRhcC9uZXRvdGhlcmFwaS5jCkBAIC0wLDAgKzEsMTUxOSBAQAorLyoqCisqIEBmaWxlIG5ldG90aGVyYXBpLmMKKyogQGJyaWVmIFB1YmxpYyBBUElzIG9mIFNhbmVjaGlwcworKgorKiBDb3B5cmlnaHQgKEMpIDIwMTcgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuCisqIEBhdXRob3IgIExpbnh1IEdlYmluCisqIEBkZWZncm91cCBzaV9pZCBTYW5lY2hpcHMKKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJIEluY2x1ZGUgaGVhZGVyIGZpbGVzCQkJCQkJCSAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL2tsb2cuaD4KKyNpbmNsdWRlIDxzeXMvbXNnLmg+CisjaW5jbHVkZSAibWVzc2FnZS5oIgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgInNvZnRhcF9hcGkuaCIKKyNpbmNsdWRlIDxuZXRvdGhlcmFwaS5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyogQGJyaWVmIHJvdXRlIGluZm9ybWF0aW9uCisqIEBwYXJhbSBkc3RBZGRyIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyogQHBhcmFtIHNyY0FkZHIgc291cmNlIGFkZHJlc3MKKyogQHBhcmFtIGdhdGVXYXkgZ2F0ZVdheQorKiBAcGFyYW0gaWZOYW1lIE5JQyBuYW1lCisqLworc3RydWN0IHJvdXRlX2luZm8geworCXVfaW50IGRzdEFkZHI7CisJdV9pbnQgc3JjQWRkcjsKKwl1X2ludCBnYXRlV2F5OworCWNoYXIgaWZOYW1lW0lGX05BTUVTSVpFXTsKK307CisKKyNkZWZpbmUgQlVGU0laRSA4MTkyCisKKyNkZWZpbmUgU1BJTkxPQ0tfSU9DX01BR0lDCSdTJworCisjZGVmaW5lIFNQSU5MT0NLX0dFVF9TVEFUVVMgIF9JT1dSKFNQSU5MT0NLX0lPQ19NQUdJQywxLGNoYXIgKikKKworI2RlZmluZSBSRUFEX0JVRl9TSVpFIDU2CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgSW5saW5lIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbmxpbmUgY2hhciAqc3RyaXBfc3BhY2UoY2hhciAqc3RyKQoreworCXdoaWxlICgqc3RyID09ICcgJykKKwkJc3RyKys7CisJcmV0dXJuIHN0cjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBMb2NhbCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qINC0zsS8/rLZ1/e6r8r9ICovCitpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlcGF0aCwgaW50IGZsYWdzLCBjb25zdCBjaGFyICpidWYsIGludCBzaXplKQoreworCWludCBmZCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlmZCA9IG9wZW4oZmlsZXBhdGgsIGZsYWdzLCAwNjQ0KTsKKwlpZiAoZmQgPCAwKSB7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsICJ3cml0ZV90b19maWxlIG9wZW4gJXMgZmFpbCwgZXJyb3I6JXMhIFxuIiwgZmlsZXBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKyAgICByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoZmQsIGJ1Ziwgc2l6ZSkpOworCWlmIChyZXQgIT0gc2l6ZSkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCAid3JpdGVfdG9fZmlsZSB3cml0ZSAlcyBmYWlsLCBlcnJvcjolcyEgXG4iLCBmaWxlcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlpZihmc3luYyhmZCkgPCAwKQorICAgIHsKKyAgICAgICAgLy8gdG9kbzogY292IG0KKyAgICB9ICAKKyAgICAKKwlyZXQgPSAwOworCitvdXQ6CisJaWYgKGZkID49IDApCisJCWNsb3NlKGZkKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiDQtM7EvP46ILiyuMfQtCAqLworaW50IHdyaXRlX3RvX2ZpbGUoY29uc3QgY2hhciAqZmlsZXBhdGgsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJcmV0dXJuIHdyaXRlX2ZpbGUoZmlsZXBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIGJ1Ziwgc2l6ZSk7Cit9CisKKy8qINC0zsS8/jogzrKyv9e3vNPQtCAgKi8KK2ludCBhcHBlbmRfdG9fZmlsZShjb25zdCBjaGFyICpmaWxlcGF0aCwgY29uc3QgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlyZXR1cm4gd3JpdGVfZmlsZShmaWxlcGF0aCwgT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fQ1JFQVQsIGJ1Ziwgc2l6ZSk7Cit9CisKKy8vv+K907/aY3RpbWWhomFzY3RpbWW74bu70NCjrNTss8nDv8z1bG9nsbu31tDQz9TKvqOssru3vbHjv7SjrMv50tS9q2N0aW1l1LTC68nUzqK4xNTsz8IKK3N0YXRpYyBjaGFyICpzdHJfY3RpbWUoY29uc3Qgc3RydWN0IHRtICp0aW1lcHRyKQoreworCS8qc3RhdGljIGNvbnN0IGNoYXIgd2RheV9uYW1lW11bNF0gPSB7CisJICAiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IgorCX07Ki8KKworCXN0YXRpYyBjb25zdCBjaGFyIG1vbl9uYW1lW11bNF0gPSB7CisJCSJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisJCSJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIKKwl9OworCisJc3RhdGljIGNoYXIgcmVzdWx0WzI2XTsKKworCS8qc3ByaW50ZihyZXN1bHQsICIlLjNzICUuM3MlM2QgJS4yZDolLjJkOiUuMmQgJWQiLAorCSAgd2RheV9uYW1lW3RpbWVwdHItPnRtX3dkYXldLAorCSAgbW9uX25hbWVbdGltZXB0ci0+dG1fbW9uXSwKKwkgIHRpbWVwdHItPnRtX21kYXksIHRpbWVwdHItPnRtX2hvdXIsCisJICB0aW1lcHRyLT50bV9taW4sIHRpbWVwdHItPnRtX3NlYywKKwkgIDE5MDAgKyB0aW1lcHRyLT50bV95ZWFyKTsqLworCXNucHJpbnRmKHJlc3VsdCwgc2l6ZW9mKHJlc3VsdCksICIlLjNzJTNkICUuMmQ6JS4yZDolLjJkICVkIiwKKwkgICAgICAgIG1vbl9uYW1lW3RpbWVwdHItPnRtX21vbl0sCisJICAgICAgICB0aW1lcHRyLT50bV9tZGF5LCB0aW1lcHRyLT50bV9ob3VyLAorCSAgICAgICAgdGltZXB0ci0+dG1fbWluLCB0aW1lcHRyLT50bV9zZWMsCisJICAgICAgICAxOTAwICsgdGltZXB0ci0+dG1feWVhcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vaW5wdXQ6ICBudl9zdHI6bnbE2sjd1rjV6yAgICAqIG52X3BhcmFtIL3izva687LOyv21xNa41esKKy8vb3V0cHV0OiAgIHBhcmFtX251bSAgICAgbnZfcGFyYW0KKy8vyr7A/ToKKy8vICAgaW50IG51bTsKKy8vICAgY2hhcioqIG52X3BhcmFtOworLy8gICBudW0gPSBudl9hbmFseXplKG52X3N0ciwmbnZfcGFyYW0pCisvLyAgIHN0cmNtcChudl9wYXJhbVswXSwiYWFhIikgLi4uCisvLyAgIHN0cmNtcChudl9wYXJhbVsxXSwiYmJiIikgLi4uCisvLyAgIC4uLgorLy8gICBmcmVlKG52X3BhcmFtKTsKKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG52X2FuYWx5emUoY2hhciogbnZfc3RyLCBjaGFyKioqIG52X3BhcmFtKQoreworCWludCBwYXJhbV9udW0gPSAxOworCWludCBpID0gMDsKKwljaGFyKiBzdHJfcHRyOworCWNoYXIqKiBtZW1fcHRyOworCWNoYXIqIHRtcF9wdHI7CisJZm9yIChzdHJfcHRyID0gbnZfc3RyOyAqc3RyX3B0ciAhPSAnXDAnOyBzdHJfcHRyKyspIHsKKwkJaWYgKCpzdHJfcHRyID09ICcrJykKKwkJCXBhcmFtX251bSsrOworCX0KKwltZW1fcHRyID0gKGNoYXIqKiltYWxsb2MoKDEgKyBzaXplb2YoY2hhciopKSAqIHBhcmFtX251bSArIHN0cmxlbihudl9zdHIpKTsKKwlpZiAobWVtX3B0ciA9PSBOVUxMKSB7Ly9rbG9jd29yaworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChtZW1fcHRyLCAwLCAoMSArIHNpemVvZihjaGFyKikpICogcGFyYW1fbnVtICsgc3RybGVuKG52X3N0cikpOworCSogbnZfcGFyYW0gPSBtZW1fcHRyOworCXN0cl9wdHIgPSBzdHJ0b2sobnZfc3RyLCAiKyIpOworCXRtcF9wdHIgPSAoY2hhciopKG1lbV9wdHIgKyBwYXJhbV9udW0pOworCXdoaWxlIChzdHJfcHRyICE9IE5VTEwpIHsKKwkJbWVtY3B5KChtZW1fcHRyICsgaSksICZ0bXBfcHRyLCBzaXplb2YoY2hhciopKTsKKwkJc3RyY3B5KHRtcF9wdHIsIHN0cl9wdHIpOworCQl0bXBfcHRyID0gKGNoYXIqKSgobG9uZyl0bXBfcHRyICsgc3RybGVuKHN0cl9wdHIpICsgMSk7CisJCWkgKys7CisJCXN0cl9wdHIgPSBzdHJ0b2soTlVMTCwgIisiKTsKKwl9CisJcmV0dXJuIHBhcmFtX251bTsKK30KKworCitjaGFyKiBnZXRGaWVsZChjaGFyICphX2xpbmUsIGNoYXIgKmRlbGltLCBpbnQgY291bnQpCit7CisJaW50IGkgPSAwOworCWNoYXIgKnRvayA9IE5VTEw7CisJY2hhciAqc2F2ZSA9IE5VTEw7CisJdG9rID0gc3RydG9rX3IoYV9saW5lLCBkZWxpbSwgJnNhdmUpOworCXdoaWxlICh0b2spIHsKKwkJaWYgKGkgPT0gY291bnQpCisJCQlicmVhazsKKwkJaSsrOworCQl0b2sgPSBzdHJ0b2tfcihOVUxMLCBkZWxpbSwgJnNhdmUpOworCX0KKwlpZiAodG9rKQorCQlyZXR1cm4gdG9rOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgIGZyZWVfZGhjcF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmRoY3BfaW5mb19saXN0KQoreworCURIQ1BPRkZFUkFERFJfTElTVF90ICpkaGNwX2luZm9fdGVtcCAgPSBOVUxMOworCURIQ1BPRkZFUkFERFJfTElTVF90ICpkaGNwX2luZm9fdGVtcDEgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRoY3BfaW5mb190ZW1wLCBkaGNwX2luZm9fdGVtcDEsIGRoY3BfaW5mb19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZkaGNwX2luZm9fdGVtcC0+bGlzdCk7CisJCWZyZWUoZGhjcF9pbmZvX3RlbXApOworCX0KK30KKwordm9pZCAgZnJlZV9sYW5pbmZvX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqZmlsZV9pbmZvX2xpc3QpCit7CisJTEFOX0lORk9fTElTVF90ICpsYW5faW5mb19saXN0X3RtcCAgPSBOVUxMOworCUxBTl9JTkZPX0xJU1RfdCAqbGFuX2luZm9fbGlzdF90bXAxID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsYW5faW5mb19saXN0X3RtcCwgbGFuX2luZm9fbGlzdF90bXAxLCBmaWxlX2luZm9fbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmbGFuX2luZm9fbGlzdF90bXAtPmxpc3QpOworCQlmcmVlKGxhbl9pbmZvX2xpc3RfdG1wKTsKKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILqvyv3D+7PGo7ogZ2V0SWZTdGF0aXN0aWMKKyoguabE3MPoyvajuiC78cihzfjC58nosbi1scewwffBvworKiCyzsr9y7XD96O6IGludGVyZmFjZTogICAgIM34v9rJ6LG4w/uzxgorKiAgICAgICAgICAgIHR5cGU6ICAgICAgICAgIMH3wb/A4NDNo6zJz9DQoaLPwtDQscjM2LvysPy49sr9CisqICAgICAgICAgICAgcmVzdWx0X2RhdGE6ICAgsaO05sH3wb/WtQorKiC3tSC72CDWtaO6IMqnsNy3tbvYLTGjrLPJuaa3tbvYMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZ2V0SWZTdGF0aXN0aWMoY2hhciAqaW50ZXJmYWNlLCBpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBsb25nICpyZXN1bHRfZGF0YSkKK3sKKwlpbnQgZm91bmRfZmxhZyA9IDA7CisJaW50IHNraXBfbGluZSA9IDI7CisJY2hhciB0ZW1wX3Jjdls2NF0gPSB7MH07CisJY2hhciBidWZbMTAyNF0sICpmaWVsZCwgKnNlbWlDb2xvbiA9IE5VTEw7CisJbG9uZyBsb25nIHJlc3VsdF9kYXRhX251bSA9IDA7CisJRklMRSAqZnAgPSBmb3BlbihQUk9DX0lGX1NUQVRJU1RJQywgInIiKTsKKwlpZiAoIWZwKSB7CisJCXNsb2coTUlTQ19QUklOVCwgU0xPR19FUlIsICJubyBwcm9jP1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmLCAxMDI0LCBmcCkpIHsKKwkJY2hhciAqaWZuYW1lOworCQlpZiAoc2tpcF9saW5lICE9IDApIHsKKwkJCXNraXBfbGluZS0tOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCEoc2VtaUNvbG9uID0gc3RyY2hyKGJ1ZiwgJzonKSkpCisJCQljb250aW51ZTsKKwkJKnNlbWlDb2xvbiA9ICdcMCc7CisJCWlmbmFtZSA9IGJ1ZjsKKwkJaWZuYW1lID0gc3RyaXBfc3BhY2UoaWZuYW1lKTsKKworCQlpZiAoIXN0cmNtcChpZm5hbWUsIGludGVyZmFjZSkpIHsKKwkJCWZvdW5kX2ZsYWcgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJZmNsb3NlKGZwKTsKKworCWlmIChmb3VuZF9mbGFnID09IDApIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCAiW2ZsdXhzdGF0XWdldElmU3RhdGlzdGljIG5vIGZvdW5kIGRhdGE9PT09PT1cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2VtaUNvbG9uKys7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFRYQllURToKKwkJaWYgKChmaWVsZCA9IGdldEZpZWxkKHNlbWlDb2xvbiwgIiAiLCA4KSkpIHsKKwkJCWVycm5vID0gMDsKKwkJCXJlc3VsdF9kYXRhX251bSA9IHN0cnRvdWxsKGZpZWxkLCBOVUxMLCAxMCk7CisJCQlpZiAoZXJybm8gPT0gRVJBTkdFKS8vIGt3IEVSUk5PLk5PVF9DSEVDS0VECisJCQl7CisJCQkJcHJpbnRmKCJzdHJ0b3VsbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQkJaWYgKHJlc3VsdF9kYXRhX251bSA8IDAgfHwgcmVzdWx0X2RhdGFfbnVtID4gTExPTkdfTUFYLTEpCisJCQkJcmVzdWx0X2RhdGFfbnVtID0gMDsKKwkJCSpyZXN1bHRfZGF0YSA9IHJlc3VsdF9kYXRhX251bTsKKwkJCQorCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCAiW2dldElmU3RhdGlzdGljXVRYQllURSBmaWVsZDolcywgcmVzdWx0X2RhdGE6JWxsdVxuIiwgZmllbGQsICpyZXN1bHRfZGF0YSk7CisJCQlyZXR1cm4gMDsgLy9rdyAzCisJCX0KKwkJYnJlYWs7CisJY2FzZSBUWFBBQ0tFVDoKKwkJaWYgKChmaWVsZCA9IGdldEZpZWxkKHNlbWlDb2xvbiwgIiAiLCA5KSkpIHsKKwkJCWVycm5vID0gMDsKKwkJCXJlc3VsdF9kYXRhX251bSA9IHN0cnRvdWxsKGZpZWxkLCBOVUxMLCAxMCk7CisJCQlpZiAoZXJybm8gPT0gRVJBTkdFKS8vIGt3IEVSUk5PLk5PVF9DSEVDS0VECisJCQl7CisJCQkJcHJpbnRmKCJzdHJ0b3VsbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQkJaWYgKHJlc3VsdF9kYXRhX251bSA8IDAgfHwgcmVzdWx0X2RhdGFfbnVtID4gTExPTkdfTUFYLTEpCisJCQkJcmVzdWx0X2RhdGFfbnVtID0gMDsKKwkJCSpyZXN1bHRfZGF0YSA9IHJlc3VsdF9kYXRhX251bTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgUlhCWVRFOgorCQlpZiAoKGZpZWxkID0gZ2V0RmllbGQoc2VtaUNvbG9uLCAiICIsIDApKSkgeworCQkJZXJybm8gPSAwOworCQkJcmVzdWx0X2RhdGFfbnVtID0gc3RydG91bGwoZmllbGQsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQKKwkJCXsKKwkJCQlwcmludGYoInN0cnRvdWxsIGVycm5vICVkOiAlc1xuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCQlpZiAocmVzdWx0X2RhdGFfbnVtIDwgMCB8fCByZXN1bHRfZGF0YV9udW0gPiBMTE9OR19NQVgtMSkKKwkJCQlyZXN1bHRfZGF0YV9udW0gPSAwOworCQkJKnJlc3VsdF9kYXRhID0gcmVzdWx0X2RhdGFfbnVtOworCQkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0RFQlVHLCAiW2dldElmU3RhdGlzdGljXVJYQllURSBmaWVsZDolcywgcmVzdWx0X2RhdGE6JWxsdVxuIiwgZmllbGQsICpyZXN1bHRfZGF0YSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIFJYUEFDS0VUOgorCQlpZiAoKGZpZWxkID0gZ2V0RmllbGQoc2VtaUNvbG9uLCAiICIsIDEpKSkgeworCQkJZXJybm8gPSAwOworCQkJcmVzdWx0X2RhdGFfbnVtID0gc3RydG91bGwoZmllbGQsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQKKwkJCXsKKwkJCQlwcmludGYoInN0cnRvdWxsIGVycm5vICVkOiAlc1xuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCQlpZiAocmVzdWx0X2RhdGFfbnVtIDwgMCB8fCByZXN1bHRfZGF0YV9udW0gPiBMTE9OR19NQVgtMSkKKwkJCQlyZXN1bHRfZGF0YV9udW0gPSAwOworCQkJKnJlc3VsdF9kYXRhID0gcmVzdWx0X2RhdGFfbnVtOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAtMTsKK30KKwordm9pZCAqc2FmZV9tYWxsb2MoaW50IHNpemUsIEJPT0wgaXNfYXNzZXJ0KQoreworCXZvaWQgKnJldCA9IG1hbGxvYyhzaXplKTsKKworCWlmIChyZXQgPT0gTlVMTCkgeworCQlpZiAoaXNfYXNzZXJ0ID09IFRSVUUpIHsKKwkJCWFzc2VydChyZXQpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJbJXNdWyVzXSAtLS0tY2FuIG5vdCBnZXQgbWVtb3J5IiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXyk7CisJCX0KKwl9IGVsc2UgeworCQltZW1zZXQocmV0LCAwLCBzaXplKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvL8rkyOtzaXplsdjQ68rHZGVzdLXEs6S2yAordm9pZCBzYWZlX3N0cmNweShjaGFyICpkZXN0LCBjaGFyICpzb3VyY2UsIGludCBzaXplKQoreworCWlmIChkZXN0ID09IE5VTEwgfHwgc291cmNlID09IE5VTEwgfHwgc2l6ZSA8IDEpIHsKKwkJcmV0dXJuOworCX0KKworCXN0cm5jcHkoZGVzdCwgc291cmNlLCBzaXplIC0gMSk7CisJZGVzdFtzaXplIC0gMV0gPSAnXDAnOworfQorCitpbnQgZ2V0X2Rldl9saXN0KHN0cnVjdCBwY19ub2RlKiBteXBjX25vZGUpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBuZXRpb2N0bF9oYW5kbGUoTklPQ0dQQ0lORk8sIG15cGNfbm9kZSk7CisJaWYgKC0xID09IHJldCkgeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJOSU9DR1BDSU5GTyBlcnIiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50ICB6dGVfZ2V0X21hY19saXN0X2Zyb21fbGVhc2Uoc3RydWN0IGxpc3RfaGVhZCAqZGhjcF9saXN0X2luZm8pCit7CisJRklMRSAqbGVhc2VGaWxlICAgID0gTlVMTDsKKwlpbnQ2NF90IGxlYXNlRmlyc3QgPSAwOworCWNoYXIgYnVmWzMyXTsKKworCURIQ1BPRkZFUkFERFJORVQgZGhjcEluZm8gPSB7MH07CisKKwljaGFyIHBhdGhfY29uZls1MF0gPSB7MH07CisJY2hhciBwYXRoX2ZpbGVbMTAwXSA9IHswfTsKKworCWlmICghbGlzdF9lbXB0eShkaGNwX2xpc3RfaW5mbykpCisJCXJldHVybiAtMTsKKworCWNmZ19nZXRfaXRlbSgicGF0aF9jb25mIiwgcGF0aF9jb25mLCBzaXplb2YocGF0aF9jb25mKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy91ZGhjcGQubGVhc2VzIiwgcGF0aF9jb25mKTsKKworCWxlYXNlRmlsZSA9IGZvcGVuKHBhdGhfZmlsZSwgInIiKTsKKwlpZiAobGVhc2VGaWxlID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjYW4gbm90IG9wZW4gZmlsZSB1ZGhjcGQubGVhc2VzLiIpOworCQlyZXR1cm4gLTEgOworCX0KKworCWlmIChmcmVhZCgmbGVhc2VGaXJzdCwgMSwgc2l6ZW9mKGxlYXNlRmlyc3QpLCBsZWFzZUZpbGUpICE9IHNpemVvZihsZWFzZUZpcnN0KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlYWQgdGhlIGZpcnN0IHBhcnQgb2YgdWRoY3BkLmxlYXNlcyBmYWlsISIpOworCQlmY2xvc2UobGVhc2VGaWxlKTsKKwkJcmV0dXJuIC0xIDsKKwl9CisKKwltZW1zZXQoYnVmLCAweDAwLCBzaXplb2YoYnVmKSk7CisJY2ZnX2dldF9pdGVtKCJkaGNwRW5hYmxlZCIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChzdHJjbXAoYnVmLCAiMCIpID09IDApIHsKKwkJZmNsb3NlKGxlYXNlRmlsZSk7CisJCXJldHVybiAtMSA7CisJfQorCisJd2hpbGUgKChmcmVhZCgmZGhjcEluZm8sIDEsIHNpemVvZihkaGNwSW5mbyksIGxlYXNlRmlsZSkgPT0gc2l6ZW9mKGRoY3BJbmZvKSkpIHsKKwkJREhDUE9GRkVSQUREUl9MSVNUX3QgKmRoY3BJbmZvX3B0ciA9IChESENQT0ZGRVJBRERSX0xJU1RfdCAqKXNhZmVfbWFsbG9jKHNpemVvZihESENQT0ZGRVJBRERSX0xJU1RfdCksIFRSVUUpOworCQlpZiAoIWRoY3BJbmZvX3B0cikgeworCQkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAiZ2V0X2xhbl9pbmZvX2xpc3Qgc2FmZV9tYWxsb2MgZGhjcEluZm9fcHRyIGZhaWwgXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1jcHkoJihkaGNwSW5mb19wdHItPmRoY3BfaW5mbyksICZkaGNwSW5mbywgc2l6ZW9mKERIQ1BPRkZFUkFERFJORVQpKTsKKwkJbGlzdF9hZGRfdGFpbCgmZGhjcEluZm9fcHRyLT5saXN0LCBkaGNwX2xpc3RfaW5mbyk7CisJfQorCisJZmNsb3NlKGxlYXNlRmlsZSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZmxhc2hfZmlsZShjaGFyICpmaWxlLCBjaGFyICpmaWxlX251bSkKK3sKKwljaGFyIG5ld0ZpbGVbMTI4XSA9IHswfTsKKwljaGFyIG9sZEZpbGVbMTI4XSA9IHswfTsKKwlpbnQgaSA9IDA7Ly9rbG9jd29yaworCWludCBpX2ZpbGVfbnVtID0gYXRvaShmaWxlX251bSk7CisKKyAgICBpZihpX2ZpbGVfbnVtIDwgMCB8fCBpX2ZpbGVfbnVtID4gSU5UX01BWC0xKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgCisJZm9yIChpID0gaV9maWxlX251bSAtIDI7IGkgPiAwICYmIGkgPCAxMDAwOyBpLS0pIHsKKwkJc3ByaW50ZihuZXdGaWxlLCAiJXNfYmslZCIsIGZpbGUsIGkpOworCQlzcHJpbnRmKG9sZEZpbGUsICIlc19iayVkIiwgZmlsZSwgaSArIDEpOworCQlpZiAoKGFjY2VzcyhuZXdGaWxlLCBGX09LKSkgPT0gMCkgeworCQkJaWYocmVuYW1lKG5ld0ZpbGUsIG9sZEZpbGUpIDwgMCl7CisgICAgICAgICAgICAgICAgLy8gY292IE0gCisgICAgICAgICAgICB9CisJCX0KKwl9CisJc3ByaW50ZihuZXdGaWxlLCAiJXNfYmsxIiwgZmlsZSk7CisKKyAgICBpZihyZW5hbWUoZmlsZSwgbmV3RmlsZSkgPCAwKQorICAgIHsKKyAgICAgICAgLy8gY292IE0KKyAgICB9Cit9CisKK3ZvaWQgZmlsZV93cml0ZShjaGFyICpmaWxlbmFtZSwgY2hhciAqaW5mbykKK3sKKwlGSUxFICpmcDsKKwljaGFyIGxvZ3BhdGhbMTI4XSAgPSB7MH07CisJY2hhciBsb2duYW1lWzEyOF0gPSB7MH07CisJY2hhciBmaWxlc2l6ZVszMl0JPSB7MH07CisJY2hhciB0ZW1wWzY0XQk9IHswfTsKKwlpbnQgZmxhZyA9IDA7CisJdGltZV90IG5vdzsKKwlzdHJ1Y3QgdG0gKnRpbWVub3c7CisKKwl0aW1lKCZub3cpOworCXRpbWVub3cgPSBsb2NhbHRpbWUoJm5vdyk7CisJaWYgKCF0aW1lbm93KSB7Ly9rbG9jd29yaworCQlwcmludGYoImxvY2FsdGltZSBnZXQgZXJyLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWZpbGVuYW1lIHx8IDAgPT0gc3RyY21wKGZpbGVuYW1lLCAiIikpIHsKKwkJcHJpbnRmKCJmaWxlbmFtZSBpcyBlcnIuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8v1ri2qGxvZ87EvP6089Cho6zI57n7zrTWuLaovs3Tw8SsyM9jb21tX2xvZ3NpemUKKwlzcHJpbnRmKHRlbXAsICIlc19sb2dzaXplIiwgZmlsZW5hbWUpOworCWNmZ19nZXRfaXRlbSh0ZW1wLCBmaWxlc2l6ZSwgc2l6ZW9mKGZpbGVzaXplKSk7CisJaWYgKDAgPT0gc3RyY21wKGZpbGVzaXplLCAiMCIpKSB7CisJCXJldHVybiA7CisJfSBlbHNlIGlmICgwID09IHN0cmNtcChmaWxlc2l6ZSwgIiIpKSB7CisJCWNmZ19nZXRfaXRlbSgiY29tbV9sb2dzaXplIiwgZmlsZXNpemUsIHNpemVvZihmaWxlc2l6ZSkpOworCQlpZiAoMCA9PSBzdHJjbXAoZmlsZXNpemUsICIwIikgfHwgMCA9PSBzdHJjbXAoZmlsZXNpemUsICIiKSkgeworCQkJcHJpbnRmKCJmaWxlc2l6ZSBpcyBub3Qgc2V0LlxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwljZmdfZ2V0X2l0ZW0oInBhdGhfbG9nIiwgbG9ncGF0aCwgc2l6ZW9mKGxvZ3BhdGgpKTsKKwlzbnByaW50Zihsb2duYW1lLCBzaXplb2YobG9nbmFtZSksICIlcyVzLmxvZyIsIGxvZ3BhdGgsIGZpbGVuYW1lKTsKKworCWZwID0gZm9wZW4obG9nbmFtZSwgImEiKTsKKwlpZiAoIWZwKSB7CisJCXByaW50ZigiZm9wZW4gJXMgZmFpbGVkIFxuIiwgbG9nbmFtZSk7CisJCXJldHVybjsKKwl9CisJLy9mbG9ja7v61sayorK7xNzV5rXExvC1vWxvY2vX99PDo6y3tbvYu+HU7LPJdW5sb2Nrsru19AorCS8qCisJZWxzZSBpZiAoZmxvY2soZmlsZW5vKGZwKSwgTE9DS19FWCkgIT0gMCkKKwl7CisJICAgIHBlcnJvcigiZmxvY2siKTsKKwkJZmNsb3NlKGZwKTsKKwkgICAgcmV0dXJuOworCX0qLworCisJZnByaW50ZihmcCwgIiVzOiVzXG4iLCBzdHJfY3RpbWUodGltZW5vdyksIGluZm8pOworCS8vZnByaW50ZihmcCwgIiVzICVzICVzWyVkXTogJXMiLCBjdGltZSh0aW1lbm93KSwgYXNjdGltZSh0aW1lbm93KSwgZmlsZW5hbWUsIGdldHBpZCgpLCBpbmZvKTsKKwlmZmx1c2goZnApOworCWZzZWVrKGZwLCAwTCwgU0VFS19FTkQpOworCisJaWYgKGZ0ZWxsKGZwKSA+IGF0b2koZmlsZXNpemUpKQorCQlmbGFnID0gMTsKKworCS8vZmxvY2soZmlsZW5vKGZwKSwgTE9DS19VTik7CisJZmNsb3NlKGZwKTsKKworCWlmIChmbGFnID09IDEpIHsKKwkJZmxhc2hfZmlsZShsb2duYW1lLCAiMiIpOworCX0KK30KKworaW50IGVjaG9fZmlsZShjaGFyICpmaWxlbmFtZSwgY2hhcippbmZvKQoreworCWludCBsZW47CisJaW50IHJldDsKKwlpbnQgZmQ7CisJaWYgKCFmaWxlbmFtZSB8fCAwID09IHN0cmNtcChmaWxlbmFtZSwgIiIpIHx8ICFpbmZvKSB7CisJCXByaW50ZigiZWNobyBmaWxlbmFtZSBpcyBlcnIuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19SRFdSLCA3NzcpOworCWlmIChmZCA8IDApIHsKKwkJcHJpbnRmKCIlcyBvcGVuIGZhaWxlZCFcbiIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwlsZW4gPSBzdHJsZW4oaW5mbyk7CisJcmV0ID0gd3JpdGUoZmQsIGluZm8sIGxlbik7CisKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHNhdmVfZmlsZShjaGFyICpmaWxlbmFtZSwgY2hhciogaW5mbykKK3sKKwlGSUxFKiBmcDsKKwljaGFyIGZpbGVwYXRoWzEyOF0gID0gezB9OworCWNoYXIgZmlsZXNpemVbMzJdCT0gezB9OworCWNoYXIgZmlsZW51bVszMl0JPSB7MH07CisJY2hhciB0ZW1wWzY0XQk9IHswfTsKKwlpbnQgZmxhZyA9IDA7CisJdGltZV90IG5vdzsKKwlzdHJ1Y3QgdG0gKnRpbWVub3c7CisJdGltZSgmbm93KTsKKwl0aW1lbm93ID0gbG9jYWx0aW1lKCZub3cpOworCWlmICghdGltZW5vdykgey8va2xvY3dvcmsKKwkJcHJpbnRmKCJsb2NhbHRpbWUgZ2V0IGVyci5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFmaWxlbmFtZSB8fCAwID09IHN0cmNtcChmaWxlbmFtZSwgIiIpKSB7CisJCXByaW50ZigiZmlsZW5hbWUgaXMgZXJyLlxuIik7CisJCXJldHVybjsKKwl9CisJc3ByaW50Zih0ZW1wLCAiJXNmaWxlIiwgZmlsZW5hbWUpOworCWNmZ19nZXRfaXRlbSh0ZW1wLCBmaWxlcGF0aCwgc2l6ZW9mKGZpbGVwYXRoKSk7CisJc3ByaW50Zih0ZW1wLCAiJXNmaWxlU2l6ZSIsIGZpbGVuYW1lKTsKKwljZmdfZ2V0X2l0ZW0odGVtcCwgZmlsZXNpemUsIHNpemVvZihmaWxlc2l6ZSkpOworCWlmICgwID09IHN0cmNtcChmaWxlc2l6ZSwgIjAiKSB8fCAwID09IHN0cmNtcChmaWxlc2l6ZSwgIiIpKSB7CisJCXByaW50ZigiZmlsZXNpemUgaXMgbm90IHNldC5cbiIpOworCQlyZXR1cm47CisJfQorCisJc3ByaW50Zih0ZW1wLCAiJXNOdW0iLCBmaWxlbmFtZSk7CisJY2ZnX2dldF9pdGVtKHRlbXAsIGZpbGVudW0sIHNpemVvZihmaWxlbnVtKSk7CisJZnAgPSBmb3BlbihmaWxlcGF0aCwgImEiKTsKKwlpZiAoIWZwKSB7CisJCXByaW50ZigiZm9wZW4gJXMgZmFpbGVkIFxuIiwgZmlsZXBhdGgpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChmbG9jayhmaWxlbm8oZnApLCBMT0NLX0VYKSAhPSAwKSB7CisJCXBlcnJvcigiZmxvY2siKTsKKwkJZmNsb3NlKGZwKTsKKwkJcmV0dXJuOworCX0KKworCWZwcmludGYoZnAsICIlcyAlc1xuIiwgc3RyX2N0aW1lKHRpbWVub3cpLCBpbmZvKTsKKwlmZmx1c2goZnApOworCWZzZWVrKGZwLCAwTCwgU0VFS19FTkQpOworCWlmIChmdGVsbChmcCkgPiBhdG9pKGZpbGVzaXplKSkKKwkJZmxhZyA9IDE7CisKKwlmbG9jayhmaWxlbm8oZnApLCBMT0NLX1VOKTsKKwlmY2xvc2UoZnApOworCisJaWYgKGZsYWcgPT0gMSkgeworCQlmbGFzaF9maWxlKGZpbGVwYXRoLCAiMiIpOworCX0KK30KKworc3RydWN0IHRpbWV2YWwgdGltZWdldCh2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwl1bnNpZ25lZCBjaGFyICB0aW1lc3RyWzYwXSA9IHswfTsKKwl1bnNpZ25lZCBjaGFyICB1cHRpbWVzdHJbMzBdID0gezB9OworCXVuc2lnbmVkIGNoYXIgKiBkb3RhZGRyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHNlY29uZDsKKwljaGFyIGVycm9yID0gMDsKKwlGSUxFICogdGltZWZpbGUgPSBOVUxMOworICAgIGludCByZWFkX2xlbiA9IDA7CisKKwl0aW1lZmlsZSA9IGZvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpOworCWlmICghdGltZWZpbGUpIHsKKwkJcHJpbnRmKCJbJXM6bGluZTolZF0gZXJyb3Igb3BlbmluZyAnL3Byb2MvdXB0aW1lJyIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCWVycm9yID0gMTsKKwkJZ290byBvdXQ7CisJfQorCS8va2xvY3dvcmsgIGNvdiBNCisJcmVhZF9sZW4gPSBmcmVhZCh0aW1lc3RyLCBzaXplb2YoY2hhciksIHNpemVvZih0aW1lc3RyKS0xLCB0aW1lZmlsZSk7CisJaWYgKHJlYWRfbGVuID09IDAgKSB7CisJCXByaW50ZigiWyVzOmxpbmU6JWRdIHJlYWQgJy9wcm9jL3VwdGltZScgZXJyb3IiLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQllcnJvciA9IDE7CisJCWdvdG8gb3V0OworCX0KKwl0aW1lc3RyW3NpemVvZih0aW1lc3RyKS0xXSA9ICdcMCc7Ly9jb3YKKwlkb3RhZGRyID0gc3RyY2hyKHRpbWVzdHIsICcuJyk7CisJaWYgKGRvdGFkZHIgIT0gTlVMTCAmJiAoZG90YWRkciAtIHRpbWVzdHIpIDwgKDMwIC0gMikpLy9jb3YKKwkJbWVtY3B5KHVwdGltZXN0ciwgdGltZXN0ciwgZG90YWRkciAtIHRpbWVzdHIgKyAyKTsKKwllbHNlIHsKKwkJcHJpbnRmKCJbJXM6bGluZTolZF0gdXB0aW1lIHN0cmluZyBpcyB0b28gbG9uZyIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCWVycm9yID0gMTsKKwkJZ290byBvdXQ7CisJfQorCXVwdGltZXN0cltkb3RhZGRyIC0gdGltZXN0ciArIDJdID0gJ1wwJzsKKworb3V0OgorCWlmIChlcnJvcikgeworCQlub3cudHZfc2VjICA9IDA7CisJCW5vdy50dl91c2VjID0gMDsKKwl9IGVsc2UgeworCQlub3cudHZfc2VjICA9IGF0b2wodXB0aW1lc3RyKTsKKwkJbm93LnR2X3VzZWMgPSAwOworCX0KKwlpZiAodGltZWZpbGUpIHsvL2tsb2N3b3JrCisJCWZjbG9zZSh0aW1lZmlsZSk7CisJfQorCXJldHVybiBub3c7Cit9CisKK3Vuc2lnbmVkIGxvbmcgdGltZV9zZWMoKQoreworCXN0cnVjdCB0aW1ldmFsIHVwdGltZTsKKworCXVwdGltZSA9IHRpbWVnZXQoKTsKKwkvL3ByaW50ZigidXB0aW1lID0gJWx1IFxuIiwodW5zaWduZWQgbG9uZyl1cHRpbWUudHZfc2VjKTsKKwlyZXR1cm4gdXB0aW1lLnR2X3NlYzsKK30KKworaW50IGdldF9sYW5faW5mb19saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmZpbGVfbGlzdF9pbmZvKQoreworCUZJTEUgKmxhbkZpbGUgICAgPSBOVUxMOworCWNoYXIgYnVmWzMyXTsKKworCUxBTl9JTkZPX3QgbGFuSW5mbyA9IHswfTsKKwljaGFyIHBhdGhfY29uZls1MF0gPSB7MH07CisJY2hhciBwYXRoX2ZpbGVbMTAwXSA9IHswfTsKKworCWlmICghbGlzdF9lbXB0eShmaWxlX2xpc3RfaW5mbykpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWNmZ19nZXRfaXRlbSgicGF0aF9jb25mIiwgcGF0aF9jb25mLCBzaXplb2YocGF0aF9jb25mKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy9sYW5pbmZvLnRtcCIsIHBhdGhfY29uZik7CisKKwlsYW5GaWxlID0gZm9wZW4ocGF0aF9maWxlLCAiciIpOworCWlmIChsYW5GaWxlID09IE5VTEwpIHsKKwkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAiZm9wZW4gbGFuaW5mby50bXAgZmFpbCBcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoZnJlYWQoJmxhbkluZm8sIHNpemVvZihMQU5fSU5GT190KSwgMSwgbGFuRmlsZSkgPT0gMSkgeworCQlMQU5fSU5GT19MSVNUX3QgKmxhbkluZm9fcHRyID0gKExBTl9JTkZPX0xJU1RfdCAqKXNhZmVfbWFsbG9jKHNpemVvZihMQU5fSU5GT19MSVNUX3QpLCBUUlVFKTsKKwkJaWYgKCFsYW5JbmZvX3B0cikgeworCQkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAiZ2V0X2xhbl9pbmZvX2xpc3Qgc2FmZV9tYWxsb2MgbGFuSW5mb19wdHIgZmFpbCBcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbWNweSgmKGxhbkluZm9fcHRyLT5sYW5faW5mbyksICZsYW5JbmZvLCBzaXplb2YoTEFOX0lORk9fdCkpOworCQlsaXN0X2FkZF90YWlsKCZsYW5JbmZvX3B0ci0+bGlzdCwgZmlsZV9saXN0X2luZm8pOworCX0KKworCWZjbG9zZShsYW5GaWxlKTsKKwlyZXR1cm4gMDsKKworfQorCisvKiDJ6NbDs6zKscv4o6wgs6zKsTCx7cq+08C+w8v4IC0g1N2yu7bUzeKjrNDo0qptc7y2sfDKsb+qt8UgKi8KK2ludCBzZXRfd2FrZV9sb2NrX3RpbWVvdXRfbXMoY29uc3QgY2hhciAqbG9ja2lkLCB1bnNpZ25lZCBsb25nIGludGVydmFsX21zKQoreworCWNoYXIgKnAgPSBOVUxMOworCWludCByZXQgPSAtMTsKKworCWlmICgobG9ja2lkID09IE5VTEwpIHx8ICgqbG9ja2lkID09ICdcMCcpKSAKKwkJcmV0dXJuIC0xOworCisJaWYgKGludGVydmFsX21zID09IDApIHsKKwkJcmV0ID0gYXNwcmludGYoJnAsICIlcyIsIGxvY2tpZCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gYXNwcmludGYoJnAsICIlcyAlbHUwMDAwMDAiLCBsb2NraWQsIGludGVydmFsX21zKTsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlyZXQgPSB3cml0ZV90b19maWxlKFdBS0VfTE9DS19QQVRILCBwLCBzdHJsZW4ocCkpOworCQorb3V0OgorCXNhZmVfZnJlZShwKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiC78cihd2FrZWxvY2vL+CAqLworaW50IHNldF93YWtlX2xvY2soY29uc3QgY2hhciAqbG9ja0lkKQoreworCXJldHVybiBzZXRfd2FrZV9sb2NrX3RpbWVvdXRfbXMobG9ja0lkLCAwKTsKK30KKworLyogyejWw7OsyrHL+CAqLworaW50IHNldF93YWtlX2xvY2tfdGltZW91dChjb25zdCBjaGFyICpsb2NrSWQsIHVuc2lnbmVkIGxvbmcgc2Vjb25kcykKK3sKKwlyZXR1cm4gc2V0X3dha2VfbG9ja190aW1lb3V0X21zKGxvY2tJZCwgc2Vjb25kcyAqIDEwMDApOworfQorCisvKiDKzbfFd2FrZWxvY2vL+CAqLworaW50IHNldF93YWtlX3VubG9jayhjb25zdCBjaGFyICpsb2NrSWQpCit7CisJaWYgKChsb2NrSWQgPT0gTlVMTCkgfHwgKCpsb2NrSWQgPT0gJ1wwJykpCisJCXJldHVybiAtMTsKKwkKKwlyZXR1cm4gd3JpdGVfdG9fZmlsZShXQUtFX1VOTE9DS19QQVRILCBsb2NrSWQsIHN0cmxlbihsb2NrSWQpKTsKK30KKworaW50IHJlYWRObFNvY2soaW50IHNvY2tGZCwgY2hhciAqYnVmUHRyLCBpbnQgc2VxTnVtLCBpbnQgcElkKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxIZHI7CisJaW50IHJlYWRMZW4gPSAwLCBtc2dMZW4gPSAwOworCWRvIHsKKwkJLy/K1bW9xNq6y7XE06a08AorCQlpZiAoKHJlYWRMZW4gPSByZWN2KHNvY2tGZCwgYnVmUHRyLCBCVUZTSVpFIC0gbXNnTGVuLCAwKSkgPCAwKSB7CisJCQlwZXJyb3IoIlNPQ0sgUkVBRDogIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCisJCW5sSGRyID0gKHN0cnVjdCBubG1zZ2hkciAqKWJ1ZlB0cjsKKwkJLy+87LLpaGVhZGVyyse38dPQ0KcKKwkJaWYgKChOTE1TR19PSyhubEhkciwgcmVhZExlbikgPT0gMCkgfHwgKG5sSGRyLT5ubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKSkgeworCQkJcGVycm9yKCJFcnJvciBpbiByZWNpZXZlZCBwYWNrZXQiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisKKworCisJCWlmIChubEhkci0+bmxtc2dfdHlwZSA9PSBOTE1TR19ET05FKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWJ1ZlB0ciArPSByZWFkTGVuOworCQkJbXNnTGVuICs9IHJlYWRMZW47CisJCX0KKworCQlpZiAoKG5sSGRyLT5ubG1zZ19mbGFncyAmIE5MTV9GX01VTFRJKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKChubEhkci0+bmxtc2dfc2VxICE9IHNlcU51bSkgfHwgKG5sSGRyLT5ubG1zZ19waWQgIT0gcElkKSk7CisJcmV0dXJuIG1zZ0xlbjsKK30KKworLy9jb3Zlcml0eQorc3RhdGljIGludCBuZXRfUlRBX09LKHN0cnVjdCBydGF0dHIgKnJ0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlyZXR1cm4gUlRBX09LKHJ0YSwgbGVuKTsKK30KKworLy+31s72t7W72LXEwrfTydDFz6IKK3ZvaWQgcGFyc2VSb3V0ZXMoc3RydWN0IG5sbXNnaGRyICpubEhkciwgc3RydWN0IHJvdXRlX2luZm8gKnJ0SW5mbykKK3sKKwlzdHJ1Y3QgcnRtc2cgKnJ0TXNnOworCXN0cnVjdCBydGF0dHIgKnJ0QXR0cjsKKwlpbnQgcnRMZW4sIGRzdExlbjsKKwkvL2NoYXIgKnRlbXBCdWYgPSBOVUxMOworCXN0cnVjdCBpbl9hZGRyIGRzdDsKKwlzdHJ1Y3QgaW5fYWRkciBnYXRlOworCWNoYXIgY21kWzEyOF07CisJY2hhciBkc3RhZGRyWzMyXSwgc3JjYWRkclszMl07CisKKworCS8vdGVtcEJ1ZiA9IChjaGFyICopbWFsbG9jKDEwMCk7CisJcnRNc2cgPSAoc3RydWN0IHJ0bXNnICopTkxNU0dfREFUQShubEhkcik7CisJLy8gSWYgdGhlIHJvdXRlIGlzIG5vdCBmb3IgQUZfSU5FVCBvciBkb2VzIG5vdCBiZWxvbmcgdG8gbWFpbiByb3V0aW5nIHRhYmxlCisJLy90aGVuIHJldHVybi4KKwlpZiAoKHJ0TXNnLT5ydG1fZmFtaWx5ICE9IEFGX0lORVQpIHx8IChydE1zZy0+cnRtX3RhYmxlICE9IFJUX1RBQkxFX01BSU4pKQorCQlyZXR1cm47CisJLy9wcmludGYoInJ0bXNnIHNyY2xlbjolZCxkc3RsZW46JWRcbiIscnRNc2ctPnJ0bV9zcmNfbGVuLHJ0TXNnLT5ydG1fZHN0X2xlbik7CisJZHN0TGVuID0gcnRNc2ctPnJ0bV9kc3RfbGVuOyAvL8K308mx7dbQxL+1xLXY1re1xNHawuuzpLbICisKKworCXJ0QXR0ciA9IChzdHJ1Y3QgcnRhdHRyICopUlRNX1JUQShydE1zZyk7CisJcnRMZW4gPSBSVE1fUEFZTE9BRChubEhkcik7CisJZm9yICg7IG5ldF9SVEFfT0socnRBdHRyLCBydExlbik7IHJ0QXR0ciA9IFJUQV9ORVhUKHJ0QXR0ciwgcnRMZW4pKSB7CisJCXN3aXRjaCAocnRBdHRyLT5ydGFfdHlwZSkgeworCQljYXNlIFJUQV9PSUY6CisJCQlpZl9pbmRleHRvbmFtZSgqKGludCAqKVJUQV9EQVRBKHJ0QXR0ciksIHJ0SW5mby0+aWZOYW1lKTsgICAgICAgLy/N+L+ow/uzxgorCQkJYnJlYWs7CisJCWNhc2UgUlRBX0dBVEVXQVk6CisJCQlydEluZm8tPmdhdGVXYXkgPSAqKHVfaW50ICopUlRBX0RBVEEocnRBdHRyKTsgICAgICAgICAgICAgICAgICAgICAgIC8vtMvM9cK308nP7rXEzfi52AorCQkJYnJlYWs7CisJCWNhc2UgUlRBX1BSRUZTUkM6CisJCQlydEluZm8tPnNyY0FkZHIgPSAqKHVfaW50ICopUlRBX0RBVEEocnRBdHRyKTsgICAgICAgICAgICAgICAgICAgICAgIC8vwrfTyc/utcTUtLXY1rcKKwkJCWJyZWFrOworCQljYXNlIFJUQV9EU1Q6CisJCQlydEluZm8tPmRzdEFkZHIgPSAqKHVfaW50ICopUlRBX0RBVEEocnRBdHRyKTsgICAgICAgICAgICAgICAgICAgICAgIC8vwrfTyc/u1tC1xMS/tcS12Na3CisJCQlicmVhazsKKwkJfQorCX0KKwlkc3Quc19hZGRyID0gcnRJbmZvLT5kc3RBZGRyOworCisJcHJpbnRmKCJvaWY6JXNcdCIsIHJ0SW5mby0+aWZOYW1lKTsKKwlnYXRlLnNfYWRkciA9IHJ0SW5mby0+Z2F0ZVdheTsKKwlwcmludGYoIiVzXG4iLCAoY2hhciAqKWluZXRfbnRvYShnYXRlKSk7CisKKwlwcmludGYoInNyYzolc1xuIiwgKGNoYXIgKilpbmV0X250b2EoZ2F0ZSkpOworCXNucHJpbnRmKHNyY2FkZHIsIHNpemVvZihzcmNhZGRyKSwgIiVzIiwgKGNoYXIgKilpbmV0X250b2EoZ2F0ZSkpOy8va2xvY3dvcmsKKwlnYXRlLnNfYWRkciA9IHJ0SW5mby0+ZHN0QWRkcjsKKwlwcmludGYoImRzdDolc1xuIiwgKGNoYXIgKilpbmV0X250b2EoZ2F0ZSkpOworCisJLy9mcmVlKHRlbXBCdWYpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvL73Tv9q5psTco7ogvOyy4srHt/HF5NbDwcvIscqhwrfTyaOs0OjSqsGszeLN+LXE06bTw7/J0tS199PDsb6907/axdC2z834wufKx7fxvs3Q9worLy9yZXR1cm46CisvLyAgICAtMTogZXJyb3I7CisvLyAgICAgMDogzfjC5860vs3Q9worLy8gICAgIDE6IM34wufS0b7N0PcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRlZmF1bHRfcm91dGVfY2hlY2soKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxNc2c7CisJc3RydWN0IHJ0bXNnICpydE1zZzsKKwlzdHJ1Y3Qgcm91dGVfaW5mbyAqcnRJbmZvOworCWNoYXIgKm1zZ0J1ZiA9IG1hbGxvYyhCVUZTSVpFKTsKKworCisJaW50IHNvY2ssIGxlbiwgbXNnU2VxID0gMDsKKworICAgIGlmKE5VTEwgPT0gbXNnQnVmKSB7CisgICAgICAgIHNvZnRhcF9hc3NlcnQoIiIpOworCQlyZXR1cm4gLTE7Ly9rbG9jd29yaworICAgIH0KKworCWlmICgoc29jayA9IHNvY2tldChQRl9ORVRMSU5LLCBTT0NLX0RHUkFNLCBORVRMSU5LX1JPVVRFKSkgPCAwKSB7CisJCXBlcnJvcigiU29ja2V0IENyZWF0aW9uOiAiKTsKKwkJZnJlZShtc2dCdWYpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KG1zZ0J1ZiwgMCwgQlVGU0laRSk7CisKKwlubE1zZyA9IChzdHJ1Y3Qgbmxtc2doZHIgKiltc2dCdWY7CisJcnRNc2cgPSAoc3RydWN0IHJ0bXNnICopTkxNU0dfREFUQShubE1zZyk7CisJbmxNc2ctPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0bXNnKSk7IC8vIExlbmd0aCBvZiBtZXNzYWdlLgorCW5sTXNnLT5ubG1zZ190eXBlID0gUlRNX0dFVFJPVVRFOyAvLyBHZXQgdGhlIHJvdXRlcyBmcm9tIGtlcm5lbCByb3V0aW5nIHRhYmxlIC4KKwlubE1zZy0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9EVU1QIHwgTkxNX0ZfUkVRVUVTVDsgLy8gVGhlIG1lc3NhZ2UgaXMgYSByZXF1ZXN0IGZvciBkdW1wLgorCW5sTXNnLT5ubG1zZ19zZXEgPSBtc2dTZXErKzsgLy8gU2VxdWVuY2Ugb2YgdGhlIG1lc3NhZ2UgcGFja2V0LgorCW5sTXNnLT5ubG1zZ19waWQgPSBnZXRwaWQoKTsgLy8gUElEIG9mIHByb2Nlc3Mgc2VuZGluZyB0aGUgcmVxdWVzdC4KKworCWlmIChzZW5kKHNvY2ssIG5sTXNnLCBubE1zZy0+bmxtc2dfbGVuLCAwKSA8IDApIHsKKwkJcHJpbnRmKCJXcml0ZSBUbyBTb2NrZXQgRmFpbGVkoa1cbiIpOworCQlmcmVlKG1zZ0J1Zik7CisJCWNsb3NlKHNvY2spOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKChsZW4gPSByZWFkTmxTb2NrKHNvY2ssIG1zZ0J1ZiwgbXNnU2VxLCBnZXRwaWQoKSkpIDwgMCkgeworCQlwcmludGYoIlJlYWQgRnJvbSBTb2NrZXQgRmFpbGVkoa1cbiIpOworCQlmcmVlKG1zZ0J1Zik7CisJCWNsb3NlKHNvY2spOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlydEluZm8gPSAoc3RydWN0IHJvdXRlX2luZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCByb3V0ZV9pbmZvKSk7CisJaWYgKE5VTEwgPT0gcnRJbmZvKSB7IC8va2xvY3dvcmsKKwkJcHJpbnRmKCJNYWxsb2Mgcm91dGVfaW5mbyBGYWlsZWShrVxuIik7CisJCWZyZWUobXNnQnVmKTsKKwkJY2xvc2Uoc29jayk7CisJCXJldHVybiAtMTsKKwl9CisJZm9yICg7IE5MTVNHX09LKG5sTXNnLCBsZW4pOyBubE1zZyA9IE5MTVNHX05FWFQobmxNc2csIGxlbikpIHsKKwkJbWVtc2V0KHJ0SW5mbywgMCwgc2l6ZW9mKHN0cnVjdCByb3V0ZV9pbmZvKSk7CisJCXBhcnNlUm91dGVzKG5sTXNnLCBydEluZm8pOworCQlpZiAocnRJbmZvLT5kc3RBZGRyID09IDAgJiYgc3RybGVuKHJ0SW5mby0+aWZOYW1lKSkgeworCQkJcHJpbnRmKCJkZWZhdWx0IHdhbiA6JXMgXG4iLCBydEluZm8tPmlmTmFtZSk7CisJCQlmcmVlKHJ0SW5mbyk7CisJCQljbG9zZShzb2NrKTsKKwkJCWZyZWUobXNnQnVmKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCWZyZWUocnRJbmZvKTsKKwljbG9zZShzb2NrKTsKKwlmcmVlKG1zZ0J1Zik7CisJcmV0dXJuIDA7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvL73Tv9q5psTcOiAgILzssuJmbGFzaMrHt/Gxu8bky/u6y9W808MKKy8vcmV0dXJuOgorLy8gICAgICAgICAgICAgMCAgIC0tLS0tICBmbGFzaMO709Cxu9W808MKKy8vCQkgICAxICAgLS0tLS0gIGZsYXNo1f2xu8bky/u6y9W808MKKy8vCQkgIC0xICAtLS0tLSAgb3Blbr3atePKp7DcCisvLwkJICAtMiAgLS0tLS0gIGlvY3Rsyqew3AorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZmxhc2hfbXV0ZXhfY2hlY2soKQoreworCWludCBmZCwgcmV0OworCWNoYXIgYXJnID0gMzsKKwlmZCA9IG9wZW4oIi9kZXYvc29mdHNwaW5sb2NrIiwgT19SRFdSKTsKKwkvL3ByaW50ZigiZmQgPSAlZCBcbiIsZmQpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKworCXJldCA9IGlvY3RsKGZkLCBTUElOTE9DS19HRVRfU1RBVFVTLCAmYXJnKTsKKwkvL3ByaW50ZigicmV0ID0gJWQgIGFyZyA9ICVkIFxuIixyZXQsYXJnKTsKKwlpZiAocmV0IDwgMCkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAtMjsKKwl9CisJY2xvc2UoZmQpOworCXJldHVybiBhcmc7CisKK30KKworLy+78cih1ri2qM/fs8zD+7XEcGlkusWjrNei0uKjurX308O4w7qvyv278ciht7W72Na1o6zKudPDuvPSu7ao0qrKzbfFuMPE2rTmv9W85AorcGlkX3QqIGZpbmRfcGlkX2J5X25hbWUoY2hhciAqcGlkTmFtZSkKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpuZXh0OworCXBpZF90KiBwaWRMaXN0ID0gTlVMTDsKKwlwaWRfdCogdG1wTGlzdCA9IE5VTEw7CisJaW50IGkgPSAwOworCQorCS8vcHJvY9bQsPzAqLWxx7C1xL34s8zQxc+io6y2wcihuMPEv8K8CisJZGlyID0gb3BlbmRpcigiL3Byb2MiKTsKKwlpZighZGlyKQorCXsKKwkJcGVycm9yKCJDYW5ub3Qgb3BlbiAvcHJvYyIpOworCQlyZXR1cm4gcGlkTGlzdDsKKwl9CisJLy+x6cD6L3Byb2PPwsS/wrwKKwl3aGlsZSgobmV4dCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkKKwl7CisJCUZJTEUgKnN0YXR1czsKKwkJY2hhciBmaWxlbmFtZVtSRUFEX0JVRl9TSVpFXSA9IHswfTsvL2tsb2N3b3JrCisJCWNoYXIgZmlsZW5hbWUxW1JFQURfQlVGX1NJWkVdID0gezB9Oy8va2xvY3dvcmsKKwkJY2hhciBuYW1lW1JFQURfQlVGX1NJWkVdID0gezB9OworCQkvL3NraXAgIi4uIiBzaW5jZSB0aGF0IGlzIG91dHNpZGUgL3Byb2MKKwkJaWYoMCA9PSBzdHJjbXAobmV4dC0+ZF9uYW1lLCIuLiIpKQorCQkJY29udGludWU7CisJCS8vaWYgaXQgaXNuJ3QgYSBudW1iZXIsd2Ugc2tpcCBpdAorCQlpZighaXNkaWdpdCgqbmV4dC0+ZF9uYW1lKSkKKwkJCWNvbnRpbnVlOworCQkKKwkJc25wcmludGYoZmlsZW5hbWUsc2l6ZW9mKGZpbGVuYW1lKSwiL3Byb2MvJXMvc3RhdHVzIixuZXh0LT5kX25hbWUpOworCisJCWlmKCEoc3RhdHVzID0gZm9wZW4oZmlsZW5hbWUsInIiKSkpCisJCXsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmKE5VTEwgPT0gZmdldHMoZmlsZW5hbWUxLFJFQURfQlVGX1NJWkUtMSxzdGF0dXMpKQorCQl7CisJCQlmY2xvc2Uoc3RhdHVzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZjbG9zZShzdGF0dXMpOworCQkKKwkJLy+78cihvfizzHBpZKOszazKsdKyu+HT0LbguPbP4M2svfizzMP7tcTH6b/2CisJCXNzY2FuZihmaWxlbmFtZTEsICIlKnMgJXMiLCBuYW1lKTsKKwkJaWYoMCA9PSBzdHJjbXAobmFtZSxwaWROYW1lKSkKKwkJeworCQkJLy9waWRMaXN0ID0gcmVhbGxvYyhwaWRMaXN0LHNpemVvZihwaWRfdCkqKGkrMikpOworCQkJLy9rbG9jd29yaworCQkJdG1wTGlzdCA9IHJlYWxsb2MocGlkTGlzdCxzaXplb2YocGlkX3QpKihpKzIpKTsKKwkJCWlmIChOVUxMID09IHRtcExpc3QpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXBpZExpc3QgPSB0bXBMaXN0OworCQkJZXJybm8gPSAwOworCQkJcGlkTGlzdFtpKytdID0gc3RydG9sKG5leHQtPmRfbmFtZSxOVUxMLDApOworCQkJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRAorCQkJeworCQkJCXByaW50Zigic3RydG9sIGVycm5vICVkOiAlc1xuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCX0KKwl9CisJaWYocGlkTGlzdCkKKwl7CisJCXBpZExpc3RbaV0gPSAwOworCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybiBwaWRMaXN0OworfQorCit2b2lkIGhhbmRsZV9xdWl0KGludCBzaWdubykKK3sKKyAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Cit9CisKKy8qIGdldGhvc3RieW5hbWW5psTc1tC2qMqxxvezrMqxtKbA7bqvyv0gKi8KK3ZvaWQgZ2V0aG9zdGJ5bmFtZV90aW1lb3V0KGludCBtc2dfaWQpCit7CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfREVCVUcsICJnZXRob3N0YnluYW1lX3RpbWVvdXQgYmVnaW4sbXNnX2lkPSVkXG4iLG1zZ19pZCk7CisJaWYoaXBjX3NlbmRfbWVzc2FnZShtc2dfaWQsIG1zZ19pZCwgTVNHX0dFVF9IT1NUX0JZX05BTUVfVElNRU9VVCwwLCAwLCAwKSA8IDApCisgICAgeworICAgICAgICAvLyB0b2RvOiBmb3IgY292IE0KKyAgICB9ICAgICAgICAKK30KKworLyoqCisqIGdldGhvc3RieW5hbWW5psTc1tC0tL2otqjKscb3CisqIHNlY29uZF90aW1lOiCzrMqxyrGzpAorKiBtc2dfaWQ6ICAgICAgICAgz9+zzGlkCisqLwordm9pZCBnZXRob3N0YnluYW1lX2NyZWF0dGltZXIoaW50IHNlY29uZF90aW1lLCBpbnQgbXNnX2lkKQoreworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiZ2V0aG9zdGJ5bmFtZV9jcmVhdHRpbWVyIGJlZ2luXG4iKTsKKwlEZWxldGVTb2Z0VGltZXIoVElNRVJfR0VUSE9TVEJZTkFNRV9JRCk7CisJQ3JlYXRlU29mdFRpbWVyKFRJTUVSX0dFVEhPU1RCWU5BTUVfSUQsIFRJTUVSX0ZMQUdfT05DRSwgc2Vjb25kX3RpbWUqMTAwMCwgZ2V0aG9zdGJ5bmFtZV90aW1lb3V0LCAodm9pZCAqKW1zZ19pZCk7Cit9CisKKy8qIGdldGhvc3RieW5hbWW5psTc1tDJvrP9tqjKscb3ICovCit2b2lkIGdldGhvc3RieW5hbWVfZGVsZXRldGltZXIoKQoreworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiZ2V0aG9zdGJ5bmFtZV9kZWxldGV0aW1lciBiZWdpblxuIik7CisJRGVsZXRlU29mdFRpbWVyKFRJTUVSX0dFVEhPU1RCWU5BTUVfSUQpOworfQorCit2b2lkICpnZXRob3N0YnluYW1lX3RpbWVyKHZvaWQgKmFyZykKK3sKKwlpbnQgdGltZSA9IDA7CisJY2hhciAqbmFtZSA9IE5VTEw7CisJaW50IG1zZ19pZDsKKwlzdHJ1Y3QgaG9zdGVudCogaHB0ciA9IE5VTEw7CisJCisJdGltZSA9KChzdHJ1Y3QgZ2V0aG9zdGJ5bmFtZV9pbmZvICopYXJnKS0+dGltZTsKKwluYW1lID0gKChzdHJ1Y3QgZ2V0aG9zdGJ5bmFtZV9pbmZvICopYXJnKS0+bmFtZTsKKwltc2dfaWQgPSAoKHN0cnVjdCBnZXRob3N0YnluYW1lX2luZm8gKilhcmcpLT5tc2dfaWQ7CisKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19ERUJVRywgImdldGhvc3RieW5hbWVfdGltZXIgdGltZT0lZCxuYW1lPSVzLG1zZ19pZD0lZFxuIiwgdGltZSwgbmFtZSwgbXNnX2lkKTsKKwkKKwlzaWduYWwoU0lHUVVJVCwgaGFuZGxlX3F1aXQpOworCQorCWdldGhvc3RieW5hbWVfY3JlYXR0aW1lcih0aW1lLCBtc2dfaWQpOyAvL8bwtqjKscb3CisJCisJaHB0ciA9IGdldGhvc3RieW5hbWUobmFtZSk7CisJaWYoTlVMTCAhPSBocHRyKSAvL7vxyKG1vWhvc3TQxc+iCisJeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19ERUJVRywgImdldGhvc3RieW5hbWVfdGltZXIgZ2V0IGluZm9cbiIpOworCQlnZXRob3N0YnluYW1lX2RlbGV0ZXRpbWVyKCk7IC8vyb6z/baoyrHG9worCQlzbG9nKE5FVF9QUklOVCwgU0xPR19ERUJVRywgImdldGhvc3RieW5hbWVfdGltZXIgcmVzdWx0IGhvc3RuYW1lPSVzXG4iLGhwdHItPmhfbmFtZSk7CisJCS8vuPjW9734s8y3os/7z6IKKwkJaWYoaXBjX3NlbmRfbWVzc2FnZShtc2dfaWQsIG1zZ19pZCwgTVNHX0dFVF9IT1NUX0JZX05BTUVfU1VDQ0VTUywgc2l6ZW9mKHZvaWQgKiksIChVQ0hBUiAqKSZocHRyLCAwKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRvZG86IGZvciBjb3YgTQorICAgICAgICB9ICAgICAgCisJCXB0aHJlYWRfZXhpdChOVUxMKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8vt+LXsGdldGhvc3RieW5hbWW6r8r9o6zU9rzT0ru49rOsyrHKsbzktcTI67LOo6x0aW1ltaXOu86qw+sKKy8vyOe5+7Osuf2zrMqxyrG85MjUyLu78cihsru1vWhvc3TQxc+io6zU8rqvyv23tbvYsru8zND41+jI+worLy+2qMqxxvdJRM/fs8zE2rmyz+2jrNK7uPa9+LPMsrvSqs2syrG199PDuMO907/aCitzdHJ1Y3QgaG9zdGVudCAqZ2V0aG9zdGJ5bmFtZV90KGNvbnN0IGNoYXIgKm5hbWUsIGludCB0aW1lKQoreworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiZ2V0aG9zdGJ5bmFtZV90IGJlZ2luXG4iKTsKKwlwdGhyZWFkX3QgcHRocmVhZDsKKwlpbnQgbXlfaGFuZGxlID0gMDsKKwlpbnQgbW9kdWxlX2lkID0gTU9EVUxFX0lEX0FQX0dFVEhPU1RCWU5BTUVfQkFTRTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbXNnX3JldCA9IDA7CisJc3RydWN0IGhvc3RlbnQqIGhvc3RyZXN1bHRpbmZvID0gTlVMTDsKKwlzdHJ1Y3QgZ2V0aG9zdGJ5bmFtZV9pbmZvIG15aG9zdGluZm8gPSB7MH07CisJTVNHX0JVRiByc3BfbXNnID0gezB9OworCUxPTkcgbXNnU2l6ZSA9ICBzaXplb2YoTVNHX0JVRikgLSBzaXplb2YoTE9ORyk7CisJaWYoMCA9PSB0aW1lKQorCXsKKwkJc2xvZyhORVRfUFJJTlQsIFNMT0dfREVCVUcsICJnZXRob3N0YnluYW1lX3QgdGltZSA9MFxuIik7CisJCXJldHVybiBnZXRob3N0YnluYW1lKG5hbWUpOworCX0KKwllbHNlCisJeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19ERUJVRywgImdldGhvc3RieW5hbWVfdCB0aW1lID0gJWRcbiIsdGltZSk7CisKKyAgICAgICAgLy+2r8ystLS9qMHZyrG1xM/7z6K208HQudy1wAorICAgICAgICAvL21zZ2dldMq508Oyzsr9SVBDX0NSRUFUIHwgSVBDX0VYQ0x8IDA2MDCjrMXQts+1scewbW9kdWxlX2lktcTP+8+ittPB0MrHt/EKKyAgICAgICAgLy+05tTao6zI57n7sru05tTao6zWsb3TtLS9qNDCtcTP+8+ittPB0KO7yOe5+7Tm1NqjrLe1u9jWtc60LTGjrMi7uvNtb2R1bGVfaWQKKyAgICAgICAgLy/WtbzTMaOssru2z9Gtu7fWsbW91dK1vcO709DKudPDtcRtb2R1bGVfaWTWtQorCQl3aGlsZSgobXlfaGFuZGxlID0gbXNnZ2V0KG1vZHVsZV9pZCxJUENfQ1JFQVQgfCBJUENfRVhDTHwgMDYwMCkpID09IC0xKSAKKwkJeworICAgICAgICAJbW9kdWxlX2lkKys7CisJCQkvL7WxbW9kdWxlX2lktPPT2k1PRFVMRV9JRF9BVERZTkFNSUNfRU5E1rXKsaOs1ve2r7bP0dQKKwkJCWlmIChtb2R1bGVfaWQgPiBNT0RVTEVfSURfQVBfR0VUSE9TVEJZTkFNRV9FTkQpIAorCQkJeworCQkJCXNvZnRhcF9hc3NlcnQoIk1PRFVMRV9JRF9BUF9HRVRIT1NUQllOQU1FX0VORCEhISEhISEhISEhXG4iKTsKKwkJCX0KKwkJfQorCQlteWhvc3RpbmZvLnRpbWUgPSB0aW1lOworCQlzdHJuY3B5KG15aG9zdGluZm8ubmFtZSwgbmFtZSwgc2l6ZW9mKG15aG9zdGluZm8ubmFtZSktMSk7CisJCW15aG9zdGluZm8ubXNnX2lkID0gbW9kdWxlX2lkOworCQkvL8bw19PP37PMo6zU2tfTz9+zzMDvtLS9qLaoyrHG9worCQlyZXQgPSBwdGhyZWFkX2NyZWF0ZSgmcHRocmVhZCwgTlVMTCwgKHZvaWQgKilnZXRob3N0YnluYW1lX3RpbWVyLCAodm9pZCAqKSZteWhvc3RpbmZvKTsKKwkJaWYgKHJldCA8IDAgfHwgcHRocmVhZCA9PSBOVUxMKSB7CisJCQlzbG9nKE5FVF9QUklOVCwgU0xPR19ERUJVRywgImNyZWF0IHRocmVhZCBmYWlsXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXdoaWxlKDEpCisJCXsKKwkJCW1zZ19yZXQgPSAwOworCQkJbWVtc2V0KCZyc3BfbXNnLCAweDAwLCBzaXplb2YoTVNHX0JVRikpOworCQkJbXNnX3JldCA9IG1zZ3JjdihteV9oYW5kbGUsICZyc3BfbXNnLCBtc2dTaXplLCAwLCAwKTsKKwkJCWlmIChtc2dfcmV0IDwgMCkKKyAgICAgICAgCXsKKyAgICAgICAgCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYocnNwX21zZy51c01zZ0NtZCA9PSBNU0dfR0VUX0hPU1RfQllfTkFNRV9TVUNDRVNTKQorCQkJeworCQkJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiZ2V0aG9zdGJ5bmFtZV90IHN1Y2Nlc3NcbiIpOworCQkJCWhvc3RyZXN1bHRpbmZvID0gKHN0cnVjdCBob3N0ZW50KikoKihpbnQgKilyc3BfbXNnLmF1Y0RhdGFCdWYpOworCQkJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiZ2V0aG9zdGJ5bmFtZV90IHJlc3VsdDpuYW1lPSVzXG4iLGhvc3RyZXN1bHRpbmZvLT5oX25hbWUpOworCQkJCXJldHVybiBob3N0cmVzdWx0aW5mbzsKKwkJCX0KKwkJCWVsc2UgaWYocnNwX21zZy51c01zZ0NtZCA9PSBNU0dfR0VUX0hPU1RfQllfTkFNRV9USU1FT1VUKQorCQkJeworCQkJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0RFQlVHLCAiZ2V0aG9zdGJ5bmFtZV90IGZhaWxcbiIpOworCQkJCXB0aHJlYWRfa2lsbChwdGhyZWFkLCBTSUdRVUlUKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJnZXRob3N0YnluYW1lX3QgZmFpbFxuIik7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRE5TX1NFUlZFUl9OVU0gMgorCisjZGVmaW5lIFRfQSAxIC8vSXB2NCBhZGRyZXNzCisjZGVmaW5lIFRfTlMgMiAvL05hbWVzZXJ2ZXIKKyNkZWZpbmUgVF9DTkFNRSA1IC8vIGNhbm9uaWNhbCBuYW1lCisjZGVmaW5lIFRfU09BIDYgLyogc3RhcnQgb2YgYXV0aG9yaXR5IHpvbmUgKi8KKyNkZWZpbmUgVF9QVFIgMTIgLyogZG9tYWluIG5hbWUgcG9pbnRlciAqLworI2RlZmluZSBUX01YIDE1IC8vTWFpbCBzZXJ2ZXIKKworCisKKy8vRE5TIGhlYWRlciBzdHJ1Y3R1cmUKK3N0cnVjdCBETlNfSEVBREVSIHsKKwl1bnNpZ25lZCBzaG9ydCBpZDsgLy8gaWRlbnRpZmljYXRpb24gbnVtYmVyCisKKwl1bnNpZ25lZCBjaGFyIHJkIDoxOyAvLyByZWN1cnNpb24gZGVzaXJlZAorCXVuc2lnbmVkIGNoYXIgdGMgOjE7IC8vIHRydW5jYXRlZCBtZXNzYWdlCisJdW5zaWduZWQgY2hhciBhYSA6MTsgLy8gYXV0aG9yaXRpdmUgYW5zd2VyCisJdW5zaWduZWQgY2hhciBvcGNvZGUgOjQ7IC8vIHB1cnBvc2Ugb2YgbWVzc2FnZQorCXVuc2lnbmVkIGNoYXIgcXIgOjE7IC8vIHF1ZXJ5L3Jlc3BvbnNlIGZsYWcKKworCXVuc2lnbmVkIGNoYXIgcmNvZGUgOjQ7IC8vIHJlc3BvbnNlIGNvZGUKKwl1bnNpZ25lZCBjaGFyIGNkIDoxOyAvLyBjaGVja2luZyBkaXNhYmxlZAorCXVuc2lnbmVkIGNoYXIgYWQgOjE7IC8vIGF1dGhlbnRpY2F0ZWQgZGF0YQorCXVuc2lnbmVkIGNoYXIgeiA6MTsgLy8gaXRzIHohIHJlc2VydmVkCisJdW5zaWduZWQgY2hhciByYSA6MTsgLy8gcmVjdXJzaW9uIGF2YWlsYWJsZQorCisJdW5zaWduZWQgc2hvcnQgcV9jb3VudDsgLy8gbnVtYmVyIG9mIHF1ZXN0aW9uIGVudHJpZXMKKwl1bnNpZ25lZCBzaG9ydCBhbnNfY291bnQ7IC8vIG51bWJlciBvZiBhbnN3ZXIgZW50cmllcworCXVuc2lnbmVkIHNob3J0IGF1dGhfY291bnQ7IC8vIG51bWJlciBvZiBhdXRob3JpdHkgZW50cmllcworCXVuc2lnbmVkIHNob3J0IGFkZF9jb3VudDsgLy8gbnVtYmVyIG9mIHJlc291cmNlIGVudHJpZXMKK307CisKKy8vQ29uc3RhbnQgc2l6ZWQgZmllbGRzIG9mIHF1ZXJ5IHN0cnVjdHVyZQorc3RydWN0IFFVRVNUSU9OIHsKKwl1bnNpZ25lZCBzaG9ydCBxdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBxY2xhc3M7Cit9OworCisvL0NvbnN0YW50IHNpemVkIGZpZWxkcyBvZiB0aGUgcmVzb3VyY2UgcmVjb3JkIHN0cnVjdHVyZQorI3ByYWdtYSBwYWNrKHB1c2gsIDEpCitzdHJ1Y3QgUl9EQVRBIHsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlOworCXVuc2lnbmVkIHNob3J0IF9jbGFzczsKKwl1bnNpZ25lZCBpbnQgdHRsOworCXVuc2lnbmVkIHNob3J0IGRhdGFfbGVuOworfTsKKyNwcmFnbWEgcGFjayhwb3ApCisKKy8vUG9pbnRlcnMgdG8gcmVzb3VyY2UgcmVjb3JkIGNvbnRlbnRzCitzdHJ1Y3QgUkVTX1JFQ09SRCB7CisJdW5zaWduZWQgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgUl9EQVRBICpyZXNvdXJjZTsKKwl1bnNpZ25lZCBjaGFyICpyZGF0YTsKK307CisKKy8vU3RydWN0dXJlIG9mIGEgUXVlcnkKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyICpuYW1lOworCXN0cnVjdCBRVUVTVElPTiAqcXVlczsKK30gUVVFUlk7CisKKwordm9pZCBDaGFuZ2V0b0Ruc05hbWVGb3JtYXQodW5zaWduZWQgY2hhciogZG5zLCB1bnNpZ25lZCBjaGFyKiBob3N0KSB7CisJaW50IGxvY2sgPSAwLCBpOworCXN0cmNhdCgoY2hhciopIGhvc3QsICIuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RybGVuKChjaGFyKikgaG9zdCk7IGkrKykgeworCQlpZiAoaG9zdFtpXSA9PSAnLicpIHsKKwkJCSpkbnMrKyA9IGkgLSBsb2NrOworCQkJZm9yICg7IGxvY2sgPCBpOyBsb2NrKyspIHsKKwkJCQkqZG5zKysgPSBob3N0W2xvY2tdOworCQkJfQorCQkJbG9jaysrOyAvL29yIGxvY2s9aSsxOworCQl9CisJfQorCSpkbnMrKyA9ICdcMCc7Cit9CisKK3VfY2hhciogUmVhZE5hbWUodW5zaWduZWQgY2hhciogcmVhZGVyLCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIGludCogY291bnQpIHsKKwl1bnNpZ25lZCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBwID0gMCwganVtcGVkID0gMCwgb2Zmc2V0OworCWludCBpLCBqOworCisJKmNvdW50ID0gMTsKKwluYW1lID0gKHVuc2lnbmVkIGNoYXIqKSBtYWxsb2MoMjU2KTsKKwlpZiAoIW5hbWUpCisJCXJldHVybiBOVUxMOy8va2xvY3dvcmsKKworCW5hbWVbMF0gPSAnXDAnOworCisJLy9yZWFkIHRoZSBuYW1lcyBpbiAzd3d3Nmdvb2dsZTNjb20gZm9ybWF0CisJd2hpbGUgKCpyZWFkZXIgIT0gMCkgeworCQlpZiAoKnJlYWRlciA+PSAxOTIpIHsKKwkJCW9mZnNldCA9ICgqcmVhZGVyKSAqIDI1NiArICoocmVhZGVyICsgMSkgLSA0OTE1MjsgLy80OTE1MiA9IDExMDAwMDAwIDAwMDAwMDAwIDspCisJCQlyZWFkZXIgPSBidWZmZXIgKyBvZmZzZXQgLSAxOworCQkJanVtcGVkID0gMTsgLy93ZSBoYXZlIGp1bXBlZCB0byBhbm90aGVyIGxvY2F0aW9uIHNvIGNvdW50aW5nIHdvbnQgZ28gdXAhCisJCX0gZWxzZSB7CisJCQluYW1lW3ArK10gPSAqcmVhZGVyOworCQl9CisKKwkJcmVhZGVyID0gcmVhZGVyICsgMTsKKworCQlpZiAoanVtcGVkID09IDApIHsKKwkJCSpjb3VudCA9ICpjb3VudCArIDE7IC8vaWYgd2UgaGF2ZW50IGp1bXBlZCB0byBhbm90aGVyIGxvY2F0aW9uIHRoZW4gd2UgY2FuIGNvdW50IHVwCisJCX0KKwl9CisKKwluYW1lW3BdID0gJ1wwJzsgLy9zdHJpbmcgY29tcGxldGUKKwlpZiAoanVtcGVkID09IDEpIHsKKwkJKmNvdW50ID0gKmNvdW50ICsgMTsgLy9udW1iZXIgb2Ygc3RlcHMgd2UgYWN0dWFsbHkgbW92ZWQgZm9yd2FyZCBpbiB0aGUgcGFja2V0CisJfQorCisJLy9ub3cgY29udmVydCAzd3d3Nmdvb2dsZTNjb20wIHRvIHd3dy5nb29nbGUuY29tCisJZm9yIChpID0gMDsgaSA8IChpbnQpIHN0cmxlbigoY29uc3QgY2hhciopIG5hbWUpOyBpKyspIHsKKwkJcCA9IG5hbWVbaV07CisJCWZvciAoaiA9IDA7IGogPCAoaW50KSBwOyBqKyspIHsKKwkJCW5hbWVbaV0gPSBuYW1lW2kgKyAxXTsKKwkJCWkgPSBpICsgMTsKKwkJfQorCQluYW1lW2ldID0gJy4nOworCX0KKwluYW1lW2kgLSAxXSA9ICdcMCc7IC8vcmVtb3ZlIHRoZSBsYXN0IGRvdAorCXJldHVybiBuYW1lOworfQorCit1bnNpZ25lZCBsb25nIG15X2dldGhvc3RieW5hbWUodW5zaWduZWQgY2hhciAqaG9zdCwgY2hhciAqZGV2X25hbWUsY2hhciogZG5zX3NlcnZlciwgaW50IHF1ZXJ5X3R5cGUpIHsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMDI1XSwgKnFuYW1lLCAqcmVhZGVyOworCWludCBpLCBqLCBzdG9wLCBzLCBhbnNfbWF4OworCXN0cnVjdCB0aW1ldmFsIHR2OworCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCQorCXN0cnVjdCBzb2NrYWRkcl9pbiBhOworCisJc3RydWN0IFJFU19SRUNPUkQgYW5zd2Vyc1syMF0sIGF1dGhbMjBdLCBhZGRpdFsyMF07IC8vdGhlIHJlcGxpZXMgZnJvbSB0aGUgRE5TIHNlcnZlcgorCXN0cnVjdCBzb2NrYWRkcl9pbiBkZXN0OworCisJc3RydWN0IEROU19IRUFERVIgKmRucyA9IE5VTEw7CisJc3RydWN0IFFVRVNUSU9OICpxaW5mbyA9IE5VTEw7CisKKwlwcmludGYoIlJlc29sdmluZyAlcyIsIGhvc3QpOworCisJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7IC8vVURQIHBhY2tldCBmb3IgRE5TIHF1ZXJpZXMKKwlpZihzIDwgMCkKKyAgICB7CisgICAgICAgIHByaW50Zigic29ja2V0IHJldHVybiBmYWlsIFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSAgIAorCQorCW1lbXNldCgmaWZyLDAsc2l6ZW9mKGlmcikpOyAgICAKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2X25hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpLTEpOworCWlmKHNldHNvY2tvcHQocyxTT0xfU09DS0VULFNPX0JJTkRUT0RFVklDRSwoY2hhciopJmlmcixzaXplb2YoaWZyKSkgPCAwKXsKKwkJcHJpbnRmKCJTT19CSU5EVE9ERVZJQ0UgZmFpbCBcbiIpOworCQlnb3RvIG91dDsKKwl9CisJdHYudHZfc2VjID0gNTsKKwl0di50dl91c2VjID0gMDsKKwlpZiAoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJnR2LCBzaXplb2YodHYpKSA8IDApIHsKKwkJcHJpbnRmKCJzb2NrZXQgb3B0aW9uICBTT19SQ1ZUSU1FTyBub3Qgc3VwcG9ydFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlkZXN0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWRlc3Quc2luX3BvcnQgPSBodG9ucyg1Myk7CisJZGVzdC5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoZG5zX3NlcnZlcik7IC8vZG5zIHNlcnZlcnMKKworCS8vU2V0IHRoZSBETlMgc3RydWN0dXJlIHRvIHN0YW5kYXJkIHF1ZXJpZXMKKwlkbnMgPSAoc3RydWN0IEROU19IRUFERVIgKikgJmJ1ZjsKKworCWRucy0+aWQgPSAodW5zaWduZWQgc2hvcnQpIGh0b25zKGdldHBpZCgpKTsKKwlkbnMtPnFyID0gMDsgLy9UaGlzIGlzIGEgcXVlcnkKKwlkbnMtPm9wY29kZSA9IDA7IC8vVGhpcyBpcyBhIHN0YW5kYXJkIHF1ZXJ5CisJZG5zLT5hYSA9IDA7IC8vTm90IEF1dGhvcml0YXRpdmUKKwlkbnMtPnRjID0gMDsgLy9UaGlzIG1lc3NhZ2UgaXMgbm90IHRydW5jYXRlZAorCWRucy0+cmQgPSAxOyAvL1JlY3Vyc2lvbiBEZXNpcmVkCisJZG5zLT5yYSA9IDA7IC8vUmVjdXJzaW9uIG5vdCBhdmFpbGFibGUhIGhleSB3ZSBkb250IGhhdmUgaXQgKGxvbCkKKwlkbnMtPnogPSAwOworCWRucy0+YWQgPSAwOworCWRucy0+Y2QgPSAwOworCWRucy0+cmNvZGUgPSAwOworCWRucy0+cV9jb3VudCA9IGh0b25zKDEpOyAvL3dlIGhhdmUgb25seSAxIHF1ZXN0aW9uCisJZG5zLT5hbnNfY291bnQgPSAwOworCWRucy0+YXV0aF9jb3VudCA9IDA7CisJZG5zLT5hZGRfY291bnQgPSAwOworCisJLy9wb2ludCB0byB0aGUgcXVlcnkgcG9ydGlvbgorCXFuYW1lID0gKHVuc2lnbmVkIGNoYXIqKSAmYnVmW3NpemVvZihzdHJ1Y3QgRE5TX0hFQURFUildOworCisJQ2hhbmdldG9EbnNOYW1lRm9ybWF0KHFuYW1lLCBob3N0KTsKKwlxaW5mbyA9IChzdHJ1Y3QgUVVFU1RJT04qKSAmYnVmW3NpemVvZihzdHJ1Y3QgRE5TX0hFQURFUikKKwkJCSsgKHN0cmxlbigoY29uc3QgY2hhciopIHFuYW1lKSArIDEpXTsgLy9maWxsIGl0CisKKwlxaW5mby0+cXR5cGUgPSBodG9ucyhxdWVyeV90eXBlKTsgLy90eXBlIG9mIHRoZSBxdWVyeSAsIEEgLCBNWCAsIENOQU1FICwgTlMgZXRjCisJcWluZm8tPnFjbGFzcyA9IGh0b25zKDEpOyAvL2l0cyBpbnRlcm5ldCAobG9sKQorCisJcHJpbnRmKCJcblNlbmRpbmcgUGFja2V0Li4uIik7CisJaWYgKHNlbmR0byhzLCAoY2hhciopIGJ1ZiwKKwkJCXNpemVvZihzdHJ1Y3QgRE5TX0hFQURFUikgKyAoc3RybGVuKChjb25zdCBjaGFyKikgcW5hbWUpICsgMSkKKwkJCQkJKyBzaXplb2Yoc3RydWN0IFFVRVNUSU9OKSwgMCwgKHN0cnVjdCBzb2NrYWRkciopICZkZXN0LAorCQkJc2l6ZW9mKGRlc3QpKSA8IDApIHsKKwkJcGVycm9yKCJzZW5kdG8gZmFpbGVkIik7CisJfQorCXByaW50ZigiRG9uZSIpOworCisJLy9SZWNlaXZlIHRoZSBhbnN3ZXIKKwlpID0gc2l6ZW9mIGRlc3Q7CisJcHJpbnRmKCJcblJlY2VpdmluZyBhbnN3ZXIuLi4iKTsKKwlpZiAocmVjdmZyb20ocywgKGNoYXIqKSBidWYsIHNpemVvZihidWYpLTEsIDAsIChzdHJ1Y3Qgc29ja2FkZHIqKSAmZGVzdCwKKwkJCShzb2NrbGVuX3QqKSAmaSkgPCAwKSB7CisJCXBlcnJvcigicmVjdmZyb20gZmFpbGVkIik7CisJfQorCSooYnVmK3NpemVvZihidWYpLTEpID0gMDsKKwlwcmludGYoIkRvbmUiKTsKKworCWRucyA9IChzdHJ1Y3QgRE5TX0hFQURFUiopIGJ1ZjsKKwlpZigoc2l6ZW9mKHN0cnVjdCBETlNfSEVBREVSKSArIAorCQkoc3RybGVuKChjb25zdCBjaGFyKikgcW5hbWUpICsgMSkrIAorCQlzaXplb2Yoc3RydWN0IFFVRVNUSU9OKSkgPj0gc2l6ZW9mKGJ1ZikpCisJeworCQlwZXJyb3IoIm15X2dldGhvc3RieW5hbWUgZXJyb3IiKTsKKwkJZ290byBvdXQ7CisJfQorCQorCS8vbW92ZSBhaGVhZCBvZiB0aGUgZG5zIGhlYWRlciBhbmQgdGhlIHF1ZXJ5IGZpZWxkCisJcmVhZGVyID0gJmJ1ZltzaXplb2Yoc3RydWN0IEROU19IRUFERVIpICsgKHN0cmxlbigoY29uc3QgY2hhciopIHFuYW1lKSArIDEpCisJCQkrIHNpemVvZihzdHJ1Y3QgUVVFU1RJT04pXTsKKworCS8vcHJpbnRmKCJcblRoZSByZXNwb25zZSBjb250YWlucyA6ICIpOworCS8vcHJpbnRmKCJcbiAlZCBRdWVzdGlvbnMuIiwgbnRvaHMoZG5zLT5xX2NvdW50KSk7CisJLy9wcmludGYoIlxuICVkIEFuc3dlcnMuIiwgbnRvaHMoZG5zLT5hbnNfY291bnQpKTsKKwkvL3ByaW50ZigiXG4gJWQgQXV0aG9yaXRhdGl2ZSBTZXJ2ZXJzLiIsIG50b2hzKGRucy0+YXV0aF9jb3VudCkpOworCS8vcHJpbnRmKCJcbiAlZCBBZGRpdGlvbmFsIHJlY29yZHMuXG5cbiIsIG50b2hzKGRucy0+YWRkX2NvdW50KSk7CisKKwkvL1N0YXJ0IHJlYWRpbmcgYW5zd2VycworCXN0b3AgPSAwOworCS8va2xvY3dvcmsKKwkvL2Fuc19tYXggPSAoKG50b2hzKGRucy0+YW5zX2NvdW50KSA8PSAoc2l6ZW9mKGFuc3dlcnMpL3NpemVvZihhbnN3ZXJzWzBdKSkpID8gbnRvaHMoZG5zLT5hbnNfY291bnQpIDogKHNpemVvZihhbnN3ZXJzKS9zaXplb2YoYW5zd2Vyc1swXSkpKTsKKwlhbnNfbWF4ID0gbnRvaHMoZG5zLT5hbnNfY291bnQpOworCWlmIChhbnNfbWF4ID4gKHNpemVvZihhbnN3ZXJzKS9zaXplb2YoYW5zd2Vyc1swXSkpKQorCQlhbnNfbWF4ID0gKHNpemVvZihhbnN3ZXJzKS9zaXplb2YoYW5zd2Vyc1swXSkpOworCWZvciAoaSA9IDA7IGkgPCBhbnNfbWF4OyBpKyspIAorCXsKKwkJYW5zd2Vyc1tpXS5uYW1lID0gUmVhZE5hbWUocmVhZGVyLCBidWYsICZzdG9wKTsKKwkJcmVhZGVyID0gcmVhZGVyICsgc3RvcDsKKworCQlhbnN3ZXJzW2ldLnJlc291cmNlID0gKHN0cnVjdCBSX0RBVEEqKSAocmVhZGVyKTsKKwkJcmVhZGVyID0gcmVhZGVyICsgc2l6ZW9mKHN0cnVjdCBSX0RBVEEpOworCisJCWlmIChudG9ocyhhbnN3ZXJzW2ldLnJlc291cmNlLT50eXBlKSA9PSAxKSAvL2lmIGl0cyBhbiBpcHY0IGFkZHJlc3MKKwkJCQl7CisJCQlhbnN3ZXJzW2ldLnJkYXRhID0gKHVuc2lnbmVkIGNoYXIqKSBtYWxsb2MoCisJCQkJCW50b2hzKGFuc3dlcnNbaV0ucmVzb3VyY2UtPmRhdGFfbGVuKSk7CisKKwkJCWZvciAoaiA9IDA7IGogPCBudG9ocyhhbnN3ZXJzW2ldLnJlc291cmNlLT5kYXRhX2xlbik7IGorKykgeworCQkJCWFuc3dlcnNbaV0ucmRhdGFbal0gPSByZWFkZXJbal07CisJCQl9CisKKwkJCWFuc3dlcnNbaV0ucmRhdGFbbnRvaHMoYW5zd2Vyc1tpXS5yZXNvdXJjZS0+ZGF0YV9sZW4pXSA9ICdcMCc7CisKKwkJCXJlYWRlciA9IHJlYWRlciArIG50b2hzKGFuc3dlcnNbaV0ucmVzb3VyY2UtPmRhdGFfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCWFuc3dlcnNbaV0ucmRhdGEgPSBSZWFkTmFtZShyZWFkZXIsIGJ1ZiwgJnN0b3ApOworCQkJcmVhZGVyID0gcmVhZGVyICsgc3RvcDsKKwkJfQorCX0KKworCS8vcHJpbnQgYW5zd2VycworCXByaW50ZigiXG5BbnN3ZXIgUmVjb3JkcyA6ICVkIFxuIiwgbnRvaHMoZG5zLT5hbnNfY291bnQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgYW5zX21heDsgaSsrKSB7CisJCXByaW50ZigiTmFtZSA6ICVzICIsIGFuc3dlcnNbaV0ubmFtZSk7CisKKwkJaWYgKG50b2hzKGFuc3dlcnNbaV0ucmVzb3VyY2UtPnR5cGUpID09IFRfQSkgLy9JUHY0IGFkZHJlc3MKKwkJeworCQkJbG9uZyAqcDsKKwkJCXAgPSAobG9uZyopIGFuc3dlcnNbaV0ucmRhdGE7CisJCQlhLnNpbl9hZGRyLnNfYWRkciA9ICgqcCk7IC8vd29ya2luZyB3aXRob3V0IG50b2hsCisjaWYgMSAgICAgICAvLyBjb3YgTQorCQkJY2hhciAqIHNfYWRkciA9IGluZXRfbnRvYShhLnNpbl9hZGRyKTsKKwkJCXByaW50ZigiaGFzIElQdjQgYWRkcmVzcyA6ICVzIiwgc19hZGRyKTsKKyNlbHNlCisgICAgICAgICAgICBwcmludGYoImhhcyBJUHY0IGFkZHJlc3MgOiAlcyIsIGluZXRfbnRvYShhLnNpbl9hZGRyKSk7CisjZW5kaWYKKwkJCXJldCA9ICh1bnNpZ25lZCBsb25nKWEuc2luX2FkZHIuc19hZGRyOworCQl9CisKKwkJaWYgKG50b2hzKGFuc3dlcnNbaV0ucmVzb3VyY2UtPnR5cGUpID09IDUpIHsKKwkJCS8vQ2Fub25pY2FsIG5hbWUgZm9yIGFuIGFsaWFzCisJCQlwcmludGYoImhhcyBhbGlhcyBuYW1lIDogJXMiLCBhbnN3ZXJzW2ldLnJkYXRhKTsKKwkJfQorCisJCXByaW50ZigiXG4iKTsKKwl9CitvdXQ6CisJY2xvc2Uocyk7CisJcmV0dXJuIHJldDsKK30KKworCit1bnNpZ25lZCBsb25nIGdldGhvc3RieW5hbWVfbChjaGFyICpob3N0bmFtZSxjaGFyKiBkZXZfbmFtZSkgCit7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKKwljaGFyIGRuc19zZXJ2ZXJzW0ROU19TRVJWRVJfTlVNXVszMl0gPSB7MH07CisKKwkvL0dldCB0aGUgRE5TIHNlcnZlcnMgZnJvbSB0aGUgcmVzb2x2LmNvbmYgZmlsZQorCWNoYXIgbnZfZG5zWzMyXQk9IHswfTsKKwljaGFyIGlwX2Ruc1szMl0JPSB7MH07CisJCisgICAgc3ByaW50Zihudl9kbnMsICIlc19wcmlkbnMiLCBkZXZfbmFtZSk7CisJY2ZnX2dldF9pdGVtKG52X2RucywgaXBfZG5zLCBzaXplb2YoaXBfZG5zKSk7CisJc3RyY3B5KGRuc19zZXJ2ZXJzWzBdLCBpcF9kbnMpOworCisJbWVtc2V0KG52X2RucywwLHNpemVvZihudl9kbnMpKTsKKwltZW1zZXQoaXBfZG5zLDAsc2l6ZW9mKGlwX2RucykpOworCXNwcmludGYobnZfZG5zLCAiJXNfc2VjZG5zIiwgZGV2X25hbWUpOworCWNmZ19nZXRfaXRlbShudl9kbnMsIGlwX2Rucywgc2l6ZW9mKGlwX2RucykpOworCXN0cmNweShkbnNfc2VydmVyc1sxXSwgaXBfZG5zKTsKKworCQorCS8vTm93IGdldCB0aGUgaXAgb2YgdGhpcyBob3N0bmFtZSAsIEEgcmVjb3JkCisJZm9yKGk9MDtpPEROU19TRVJWRVJfTlVNO2krKykKKwl7CisJCXJldCA9IG15X2dldGhvc3RieW5hbWUoaG9zdG5hbWUsIGRldl9uYW1lICwgZG5zX3NlcnZlcnNbaV0sIFRfQSk7CisJCWlmKHJldCA+IDApCisJCQlicmVhazsKKwl9CisgCisJcmV0dXJuIHJldDsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCg==