I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgInVzYi5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKI2luY2x1ZGUgInRyYW5zcG9ydC5oIgojaW5jbHVkZSAibXMuaCIKCi8vLS0tLS0gTVNfUmVhZGVyQ29weUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19SZWFkZXJDb3B5QmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIG9sZHBoeSwgV09SRCBuZXdwaHksIFdPUkQgUGh5QmxvY2tBZGRyLCBCWVRFIFBhZ2VOdW0sIFBCWVRFIGJ1ZiwgV09SRCBsZW4pCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CgoJLy9wcmludGsoIk1TX1JlYWRlckNvcHlCbG9jayAtLS0gUGh5QmxvY2tBZGRyID0gJXgsIFBhZ2VOdW0gPSAleFxuIiwgUGh5QmxvY2tBZGRyLCBQYWdlTnVtKTsKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgTVNfUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwKmxlbjsKCWJjYi0+RmxhZ3MJCQk9IDB4MDA7CgliY2ItPkNEQlswXQkJCT0gMHhGMDsKCWJjYi0+Q0RCWzFdCQkJPSAweDA4OwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKShvbGRwaHkpOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShvbGRwaHk+PjgpOwoJYmNiLT5DREJbMl0JCQk9IChCWVRFKShvbGRwaHk+PjE2KTsKCWJjYi0+Q0RCWzddCQkJPSAoQllURSkobmV3cGh5KTsKCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkobmV3cGh5Pj44KTsKCWJjYi0+Q0RCWzVdCQkJPSAoQllURSkobmV3cGh5Pj4xNik7CgliY2ItPkNEQls5XQkJCT0gKEJZVEUpKFBoeUJsb2NrQWRkcik7CgliY2ItPkNEQls4XQkJCT0gKEJZVEUpKFBoeUJsb2NrQWRkcj4+OCk7CgliY2ItPkNEQlsxMF0JCT0gUGFnZU51bTsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfV1JJVEUsIGJ1ZiwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8tLS0tLSBNU19SZWFkZXJSZWFkUGFnZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfUmVhZGVyUmVhZFBhZ2Uoc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBQaHlCbG9ja0FkZHIsIEJZVEUgUGFnZU51bSwgUERXT1JEIFBhZ2VCdWYsIE1TX0xpYlR5cGVFeHRkYXQgKkV4dHJhRGF0KQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJQllURQlFeHRCdWZbNF07CglEV09SRAlibiA9IFBoeUJsb2NrQWRkciAqIDB4MjAgKyBQYWdlTnVtOwoKCS8vcHJpbnRrKCJNUyAtLS0gTVNfUmVhZGVyUmVhZFBhZ2UsICBQaHlCbG9ja0FkZHIgPSAleCwgUGFnZU51bSA9ICV4XG4iLCBQaHlCbG9ja0FkZHIsIFBhZ2VOdW0pOwoKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgTVNfUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCS8vIFJlYWQgUGFnZSBEYXRhCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSAweDIwMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAyOwoJYmNiLT5DREJbNV0JCQk9IChCWVRFKShibik7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpKGJuPj44KTsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYm4+PjE2KTsKCWJjYi0+Q0RCWzJdCQkJPSAoQllURSkoYm4+PjI0KTsKCQoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIFBhZ2VCdWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCgkvLyBSZWFkIEV4dHJhIERhdGEKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IDB4NDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwoJYmNiLT5DREJbNV0JCQk9IChCWVRFKShQYWdlTnVtKTsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSkoUGh5QmxvY2tBZGRyKTsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoUGh5QmxvY2tBZGRyPj44KTsKCWJjYi0+Q0RCWzJdCQkJPSAoQllURSkoUGh5QmxvY2tBZGRyPj4xNik7CgliY2ItPkNEQls2XQkJCT0gMHgwMTsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgJkV4dEJ1ZiwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCUV4dHJhRGF0LT5yZXNlcnZlZCA9IDA7CglFeHRyYURhdC0+aW50ciAgICAgPSAweDgwOyAgLy8gTm90IHlldCwgpf2wsrNdLCC1pSBmaXJld2FyZSBzdXBwb3J0CglFeHRyYURhdC0+c3RhdHVzMCAgPSAweDEwOyAgLy8gTm90IHlldCwgpf2wsrNdLCC1pSBmaXJld2FyZSBzdXBwb3J0CglFeHRyYURhdC0+c3RhdHVzMSAgPSAweDAwOyAgLy8gTm90IHlldCwgpf2wsrNdLCC1pSBmaXJld2FyZSBzdXBwb3J0CglFeHRyYURhdC0+b3ZyZmxnICAgPSBFeHRCdWZbMF07CglFeHRyYURhdC0+bW5nZmxnICAgPSBFeHRCdWZbMV07CglFeHRyYURhdC0+bG9nYWRyICAgPSBNZW1TdGlja0xvZ0FkZHIoRXh0QnVmWzJdLCBFeHRCdWZbM10pOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8tLS0tLSBNU19SZWFkZXJFcmFzZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfUmVhZGVyRXJhc2VCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIFBoeUJsb2NrQWRkcikKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCURXT1JECWJuID0gUGh5QmxvY2tBZGRyOwoKCS8vcHJpbnRrKCJNUyAtLS0gTVNfUmVhZGVyRXJhc2VCbG9jaywgIFBoeUJsb2NrQWRkciA9ICV4XG4iLCBQaHlCbG9ja0FkZHIpOwoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBNU19SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgyMDA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjI7CgliY2ItPkNEQlsxXQkJCT0gMHgwNjsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSkoYm4pOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShibj4+OCk7CgliY2ItPkNEQlsyXQkJCT0gKEJZVEUpKGJuPj4xNik7CgkKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBOVUxMLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9CgovLy0tLS0tIE1TX0NhcmRJbml0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19DYXJkSW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCURXT1JECQkJcmVzdWx0PTA7CglXT1JECQkJVG1wQmxvY2s7CglQQllURQkJCVBhZ2VCdWZmZXIwID0gTlVMTCwgUGFnZUJ1ZmZlcjEgPSBOVUxMOwoJTVNfTGliVHlwZUV4dGRhdAlleHRkYXQ7CglXT1JECQkJYnRCbGsxc3QsIGJ0QmxrMm5kOwoJRFdPUkQJCQlidEJsazFzdEVycmVkOwoKCXByaW50aygiTVNfQ2FyZEluaXQgc3RhcnRcbiIpOwoKCU1TX0xpYkZyZWVBbGxvY2F0ZWRBcmVhKHVzKTsKCglpZiAoKChQYWdlQnVmZmVyMCA9IGttYWxsb2MoTVNfQllURVNfUEVSX1BBR0UsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB8fAoJICAgICgoUGFnZUJ1ZmZlcjEgPSBrbWFsbG9jKE1TX0JZVEVTX1BFUl9QQUdFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkpCgl7CgkJcmVzdWx0ID0gTVNfTk9fTUVNT1JZX0VSUk9SOwoJCWdvdG8gZXhpdDsKCX0KCglidEJsazFzdCA9IGJ0QmxrMm5kID0gTVNfTEJfTk9UX1VTRUQ7CglidEJsazFzdEVycmVkID0gMDsKCglmb3IgKFRtcEJsb2NrPTA7IFRtcEJsb2NrIDwgTVNfTUFYX0lOSVRJQUxfRVJST1JfQkxPQ0tTKzI7IFRtcEJsb2NrKyspCgl7CgkJc3dpdGNoIChNU19SZWFkZXJSZWFkUGFnZSh1cywgVG1wQmxvY2ssIDAsIChEV09SRCAqKVBhZ2VCdWZmZXIwLCAmZXh0ZGF0KSkKCQl7CgkJCWNhc2UgTVNfU1RBVFVTX1NVQ0NFU1M6CgkJCWJyZWFrOwoJCQljYXNlIE1TX1NUQVRVU19JTlRfRVJST1I6CgkJCWJyZWFrOwoJCQljYXNlIE1TX1NUQVRVU19FUlJPUjoKCQkJZGVmYXVsdDoKCQkJY29udGludWU7CgkJfQoKCQlpZiAoKGV4dGRhdC5vdnJmbGcgJiBNU19SRUdfT1ZSX0JLU1QpID09IE1TX1JFR19PVlJfQktTVF9ORykKCQkJY29udGludWU7CgoJCWlmICgoKGV4dGRhdC5tbmdmbGcgJiBNU19SRUdfTU5HX1NZU0ZMRykgPT0gTVNfUkVHX01OR19TWVNGTEdfVVNFUikgfHwKCQkJKEJpZ0VuZGlhbldPUkQoKChNZW1TdGlja0Jvb3RCbG9ja1BhZ2UwICopUGFnZUJ1ZmZlcjApLT5oZWFkZXIud0Jsb2NrSUQpICE9IE1TX0JPT1RfQkxPQ0tfSUQpIHx8CgkJCShCaWdFbmRpYW5XT1JEKCgoTWVtU3RpY2tCb290QmxvY2tQYWdlMCAqKVBhZ2VCdWZmZXIwKS0+aGVhZGVyLndGb3JtYXRWZXJzaW9uKSAhPSBNU19CT09UX0JMT0NLX0ZPUk1BVF9WRVJTSU9OKSB8fAoJCQkoKChNZW1TdGlja0Jvb3RCbG9ja1BhZ2UwICopUGFnZUJ1ZmZlcjApLT5oZWFkZXIuYk51bWJlck9mRGF0YUVudHJ5ICE9IE1TX0JPT1RfQkxPQ0tfREFUQV9FTlRSSUVTKSkKCQkJCWNvbnRpbnVlOwoKCQlpZiAoYnRCbGsxc3QgIT0gTVNfTEJfTk9UX1VTRUQpCgkJewoJCQlidEJsazJuZCA9IFRtcEJsb2NrOwoJCQlicmVhazsKCQl9CgoJCWJ0QmxrMXN0ID0gVG1wQmxvY2s7CgkJbWVtY3B5KFBhZ2VCdWZmZXIxLCBQYWdlQnVmZmVyMCwgTVNfQllURVNfUEVSX1BBR0UpOwoJCWlmIChleHRkYXQuc3RhdHVzMSAmIChNU19SRUdfU1QxX0RURVIgfCBNU19SRUdfU1QxX0VYRVIgfCBNU19SRUdfU1QxX0ZHRVIpKQoJCQlidEJsazFzdEVycmVkID0gMTsKCX0KCglpZiAoYnRCbGsxc3QgPT0gTVNfTEJfTk9UX1VTRUQpCgl7CgkJcmVzdWx0ID0gTVNfU1RBVFVTX0VSUk9SOwoJCWdvdG8gZXhpdDsKCX0KCgkvLyB3cml0ZSBwcm90ZWN0CglpZiAoKGV4dGRhdC5zdGF0dXMwICYgTVNfUkVHX1NUMF9XUCkgPT0gTVNfUkVHX1NUMF9XUF9PTikKCQlNU19MaWJDdHJsU2V0KHVzLCBNU19MSUJfQ1RSTF9XUlBST1RFQ1QpOwoKCXJlc3VsdCA9IE1TX1NUQVRVU19FUlJPUjsKCS8vIDFzdCBCb290IEJsb2NrCglpZiAoYnRCbGsxc3RFcnJlZCA9PSAwKQoJCXJlc3VsdCA9IE1TX0xpYlByb2Nlc3NCb290QmxvY2sodXMsIGJ0QmxrMXN0LCBQYWdlQnVmZmVyMSk7ICAgLy8gMXN0CgkvLyAybmQgQm9vdCBCbG9jawoJaWYgKHJlc3VsdCAmJiAoYnRCbGsybmQgIT0gTVNfTEJfTk9UX1VTRUQpKQoJCXJlc3VsdCA9IE1TX0xpYlByb2Nlc3NCb290QmxvY2sodXMsIGJ0QmxrMm5kLCBQYWdlQnVmZmVyMCk7CgoJaWYgKHJlc3VsdCkKCXsKCQlyZXN1bHQgPSBNU19TVEFUVVNfRVJST1I7CgkJZ290byBleGl0OwoJfQoKCWZvciAoVG1wQmxvY2sgPSAwOyBUbXBCbG9jayA8IGJ0QmxrMXN0OyBUbXBCbG9jaysrKQoJCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtUbXBCbG9ja10gPSBNU19MQl9JTklUSUFMX0VSUk9SOwoKCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtidEJsazFzdF0gPSBNU19MQl9CT09UX0JMT0NLOwoKCWlmIChidEJsazJuZCAhPSBNU19MQl9OT1RfVVNFRCkKCXsKCQlmb3IgKFRtcEJsb2NrID0gYnRCbGsxc3QgKyAxOyBUbXBCbG9jayA8IGJ0QmxrMm5kOyBUbXBCbG9jaysrKQoJCQl1cy0+TVNfTGliLlBoeTJMb2dNYXBbVG1wQmxvY2tdID0gTVNfTEJfSU5JVElBTF9FUlJPUjsKCQl1cy0+TVNfTGliLlBoeTJMb2dNYXBbYnRCbGsybmRdID0gTVNfTEJfQk9PVF9CTE9DSzsKCX0KCglyZXN1bHQgPSBNU19MaWJTY2FuTG9naWNhbEJsb2NrTnVtYmVyKHVzLCBidEJsazFzdCk7CglpZiAocmVzdWx0KQoJCWdvdG8gZXhpdDsKCglmb3IgKFRtcEJsb2NrPU1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsgVG1wQmxvY2s8dXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrOyBUbXBCbG9jays9TVNfUEhZU0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UKQoJewoJCWlmIChNU19Db3VudEZyZWVCbG9jayh1cywgVG1wQmxvY2spID09IDApCgkJewoJCQlNU19MaWJDdHJsU2V0KHVzLCBNU19MSUJfQ1RSTF9XUlBST1RFQ1QpOwoJCQlicmVhazsKCQl9Cgl9CgoJLy8gd3JpdGUKCWlmIChNU19MaWJBbGxvY1dyaXRlQnVmKHVzKSkKCXsKCQlyZXN1bHQgPSBNU19OT19NRU1PUllfRVJST1I7CgkJZ290byBleGl0OwoJfQoKCXJlc3VsdCA9IE1TX1NUQVRVU19TVUNDRVNTOwoKZXhpdDoKCWlmIChQYWdlQnVmZmVyMSkJCWtmcmVlKFBhZ2VCdWZmZXIxKTsKICAgIAlpZiAoUGFnZUJ1ZmZlcjApCQlrZnJlZShQYWdlQnVmZmVyMCk7CgoJcHJpbnRrKCJNU19DYXJkSW5pdCBlbmRcbiIpOwoJcmV0dXJuIHJlc3VsdDsKfQoKLy8tLS0tLSBNU19MaWJDaGVja0Rpc2FibGVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliQ2hlY2tEaXNhYmxlQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIFBoeUJsb2NrKQp7CglQV09SRAkJCVBhZ2VCdWY9TlVMTDsKCURXT1JECQkJcmVzdWx0PU1TX1NUQVRVU19TVUNDRVNTOwoJRFdPUkQJCQlibGssIGluZGV4PTA7CglNU19MaWJUeXBlRXh0ZGF0CWV4dGRhdDsKCglpZiAoKChQYWdlQnVmID0ga21hbGxvYyhNU19CWVRFU19QRVJfUEFHRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpKQoJewoJCXJlc3VsdCA9IE1TX05PX01FTU9SWV9FUlJPUjsKCQlnb3RvIGV4aXQ7Cgl9CgoJTVNfUmVhZGVyUmVhZFBhZ2UodXMsIFBoeUJsb2NrLCAxLCAoRFdPUkQgKilQYWdlQnVmLCAmZXh0ZGF0KTsKCWRvCgl7CgkJYmxrID0gQmlnRW5kaWFuV09SRChQYWdlQnVmW2luZGV4XSk7CgkJaWYgKGJsayA9PSBNU19MQl9OT1RfVVNFRCkKCQkJYnJlYWs7CgkJaWYgKGJsayA9PSB1cy0+TVNfTGliLkxvZzJQaHlNYXBbMF0pCgkJewoJCQlyZXN1bHQgPSBNU19FUlJPUl9GTEFTSF9SRUFEOwoJCQlicmVhazsKCQl9CgkJaW5kZXgrKzsKCX0gd2hpbGUoMSk7CgpleGl0OgoJaWYgKFBhZ2VCdWYpCWtmcmVlKFBhZ2VCdWYpOwoJcmV0dXJuIHJlc3VsdDsKfQoKLy8tLS0tLSBNU19MaWJGcmVlQWxsb2NhdGVkQXJlYSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE1TX0xpYkZyZWVBbGxvY2F0ZWRBcmVhKHN0cnVjdCB1c19kYXRhICp1cykKewoJTVNfTGliRnJlZVdyaXRlQnVmKHVzKTsKCU1TX0xpYkZyZWVMb2dpY2FsTWFwKHVzKTsKCgl1cy0+TVNfTGliLmZsYWdzCQkJPSAwOwoJdXMtPk1TX0xpYi5CeXRlc1BlclNlY3Rvcgk9IDA7Cgl1cy0+TVNfTGliLlNlY3RvcnNQZXJDeWxpbmRlcgk9IDA7CgoJdXMtPk1TX0xpYi5jYXJkVHlwZQkJPSAwOwoJdXMtPk1TX0xpYi5ibG9ja1NpemUJCT0gMDsKCXVzLT5NU19MaWIuUGFnZXNQZXJCbG9jawk9IDA7CgoJdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrCT0gMDsKCXVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jawk9IDA7Cn0KCi8vLS0tLS0gTVNfTGliRnJlZVdyaXRlQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBNU19MaWJGcmVlV3JpdGVCdWYoc3RydWN0IHVzX2RhdGEgKnVzKQp7Cgl1cy0+TVNfTGliLndydGJsayA9IChXT1JEKS0xOyAvL3NldCB0byAtMQoJTVNfTGliQ2xlYXJQYWdlTWFwKHVzKTsgLy8gbWVtc2V0KChmZG9FeHQpLT5NU19MaWIucGFnZW1hcCwgMCwgc2l6ZW9mKChmZG9FeHQpLT5NU19MaWIucGFnZW1hcCkpCgoJaWYgKHVzLT5NU19MaWIuYmxrcGFnKQoJewoJCWtmcmVlKChCWVRFICopKHVzLT5NU19MaWIuYmxrcGFnKSk7ICAvLyBBcm5vbGQgdGVzdCAuLi4KCQl1cy0+TVNfTGliLmJsa3BhZyA9IE5VTEw7Cgl9CgoJaWYgKHVzLT5NU19MaWIuYmxrZXh0KQoJewoJCWtmcmVlKChCWVRFICopKHVzLT5NU19MaWIuYmxrZXh0KSk7ICAvLyBBcm5vbGQgdGVzdCAuLi4KCQl1cy0+TVNfTGliLmJsa2V4dCA9IE5VTEw7Cgl9Cn0KCi8vLS0tLS0gTVNfTGliRnJlZUxvZ2ljYWxNYXAoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYkZyZWVMb2dpY2FsTWFwKHN0cnVjdCB1c19kYXRhICp1cykKewoJaWYgKHVzLT5NU19MaWIuUGh5MkxvZ01hcCkKCXsKCQlrZnJlZSh1cy0+TVNfTGliLlBoeTJMb2dNYXApOwoJCXVzLT5NU19MaWIuUGh5MkxvZ01hcCA9IE5VTEw7Cgl9CgoJaWYgKHVzLT5NU19MaWIuTG9nMlBoeU1hcCkKCXsKCQlrZnJlZSh1cy0+TVNfTGliLkxvZzJQaHlNYXApOwoJCXVzLT5NU19MaWIuTG9nMlBoeU1hcCA9IE5VTEw7Cgl9CgogICAgcmV0dXJuIDA7Cn0KCi8vLS0tLS0gTVNfTGliUHJvY2Vzc0Jvb3RCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYlByb2Nlc3NCb290QmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIFBoeUJsb2NrLCBCWVRFICpQYWdlRGF0YSkKewoJTWVtU3RpY2tCb290QmxvY2tTeXNFbnQgICpTeXNFbnRyeTsKCU1lbVN0aWNrQm9vdEJsb2NrU3lzSW5mICAqU3lzSW5mbzsKCURXT1JEICAgICAgICAgICAgICAgICAgICBpLCByZXN1bHQ7CglCWVRFICAgICAgICAgICAgICAgICAgICAgUGFnZU51bWJlcjsKCUJZVEUgICAgICAgICAgICAgICAgICAgICAqUGFnZUJ1ZmZlcjsKCU1TX0xpYlR5cGVFeHRkYXQgICAgICAgICBFeHRyYURhdGE7CgoJaWYgKChQYWdlQnVmZmVyID0gKEJZVEUgKilrbWFsbG9jKE1TX0JZVEVTX1BFUl9QQUdFLCBHRlBfS0VSTkVMKSk9PU5VTEwpCgkJcmV0dXJuIChEV09SRCktMTsKCglyZXN1bHQgPSAoRFdPUkQpLTE7CgoJU3lzSW5mbz0gJigoKE1lbVN0aWNrQm9vdEJsb2NrUGFnZTAgKilQYWdlRGF0YSktPnN5c2luZik7CgoJaWYgKChTeXNJbmZvLT5iTXNDbGFzcyAhPSBNU19TWVNJTkZfTVNDTEFTU19UWVBFXzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAoJCShCaWdFbmRpYW5XT1JEKFN5c0luZm8tPndQYWdlU2l6ZSkgIT0gTVNfU1lTSU5GX1BBR0VfU0laRSkgICAgICAgICAgICAgICAgICAgICAgIHx8CgkJKChTeXNJbmZvLT5iU2VjdXJpdHlTdXBwb3J0ICYgTVNfU1lTSU5GX1NFQ1VSSVRZKSA9PSBNU19TWVNJTkZfU0VDVVJJVFlfU1VQUE9SVCkgfHwKCQkoU3lzSW5mby0+YlJlc2VydmVkMSAhPSBNU19TWVNJTkZfUkVTRVJWRUQxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAoJCShTeXNJbmZvLT5iUmVzZXJ2ZWQyICE9IE1TX1NZU0lORl9SRVNFUlZFRDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CgkJKFN5c0luZm8tPmJGb3JtYXRUeXBlIT0gTVNfU1lTSU5GX0ZPUk1BVF9GQVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKCQkoU3lzSW5mby0+YlVzYWdlICE9IE1TX1NZU0lORl9VU0FHRV9HRU5FUkFMKSkKCQlnb3RvIGV4aXQ7CgoJc3dpdGNoICh1cy0+TVNfTGliLmNhcmRUeXBlID0gU3lzSW5mby0+YkNhcmRUeXBlKQoJewoJCWNhc2UgTVNfU1lTSU5GX0NBUkRUWVBFX1JET05MWToKCQkJTVNfTGliQ3RybFNldCh1cywgTVNfTElCX0NUUkxfUkRPTkxZKTsKCQkJYnJlYWs7CgkJY2FzZSBNU19TWVNJTkZfQ0FSRFRZUEVfUkRXUjoKCQkJTVNfTGliQ3RybFJlc2V0KHVzLCBNU19MSUJfQ1RSTF9SRE9OTFkpOwoJCQlicmVhazsKCQljYXNlIE1TX1NZU0lORl9DQVJEVFlQRV9IWUJSSUQ6CgkJZGVmYXVsdDoKCQkJZ290byBleGl0OwoJfQoKCXVzLT5NU19MaWIuYmxvY2tTaXplICAgICAgICA9IEJpZ0VuZGlhbldPUkQoU3lzSW5mby0+d0Jsb2NrU2l6ZSk7Cgl1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2sgPSBCaWdFbmRpYW5XT1JEKFN5c0luZm8tPndCbG9ja051bWJlcik7Cgl1cy0+TVNfTGliLk51bWJlck9mTG9nQmxvY2sgPSBCaWdFbmRpYW5XT1JEKFN5c0luZm8tPndUb3RhbEJsb2NrTnVtYmVyKS0gMjsKCXVzLT5NU19MaWIuUGFnZXNQZXJCbG9jayAgICA9IHVzLT5NU19MaWIuYmxvY2tTaXplICogU0laRV9PRl9LSVJPIC8gTVNfQllURVNfUEVSX1BBR0U7Cgl1cy0+TVNfTGliLk51bWJlck9mU2VnbWVudCAgPSB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2sgLyBNU19QSFlTSUNBTF9CTE9DS1NfUEVSX1NFR01FTlQ7Cgl1cy0+TVNfTW9kZWwgICAgICAgICAgICAgICAgPSBCaWdFbmRpYW5XT1JEKFN5c0luZm8tPndNZW1vcnlTaXplKTsKCglpZiAoTVNfTGliQWxsb2NMb2dpY2FsTWFwKHVzKSkJCQkvL0FsbG9jYXRlIHRvIGFsbCBudW1iZXIgb2YgbG9naWNhbGJsb2NrIGFuZCBwaHlzaWNhbGJsb2NrCgkJZ290byBleGl0OwoKCU1TX0xpYlNldEJvb3RCbG9ja01hcmsodXMsIFBoeUJsb2NrKTsJCS8vTWFyayB0aGUgYm9vayBibG9jawoKCVN5c0VudHJ5ID0gJigoKE1lbVN0aWNrQm9vdEJsb2NrUGFnZTAgKilQYWdlRGF0YSktPnN5c2VudCk7CgoJZm9yIChpPTA7IGk8TVNfTlVNQkVSX09GX1NZU1RFTV9FTlRSWTsgaSsrKQoJewoJCURXT1JEICBFbnRyeU9mZnNldCwgRW50cnlTaXplOwoKCQlpZiAoKEVudHJ5T2Zmc2V0ID0gQmlnRW5kaWFuRFdPUkQoU3lzRW50cnktPmVudHJ5W2ldLmR3U3RhcnQpKSA9PSAweGZmZmZmZikKCQkJY29udGludWU7CgoJCWlmICgoRW50cnlTaXplID0gQmlnRW5kaWFuRFdPUkQoU3lzRW50cnktPmVudHJ5W2ldLmR3U2l6ZSkpID09IDApCgkJCWNvbnRpbnVlOwoKCQlpZiAoRW50cnlPZmZzZXQgKyBNU19CWVRFU19QRVJfUEFHRSArIEVudHJ5U2l6ZSA+IHVzLT5NU19MaWIuYmxvY2tTaXplICogKERXT1JEKVNJWkVfT0ZfS0lSTykKCQkJY29udGludWU7CgoJCWlmIChpID09IDApCgkJewoJCQlCWVRFICBQcmV2UGFnZU51bWJlciA9IDA7CgkJCVdPUkQgIHBoeWJsazsKCgkJCWlmIChTeXNFbnRyeS0+ZW50cnlbaV0uYlR5cGUgIT0gTVNfU1lTRU5UX1RZUEVfSU5WQUxJRF9CTE9DSykKCQkJCWdvdG8gZXhpdDsKCgkJCXdoaWxlIChFbnRyeVNpemUgPiAwKQoJCQl7CgkJCQlpZiAoKFBhZ2VOdW1iZXIgPSAoQllURSkoRW50cnlPZmZzZXQgLyBNU19CWVRFU19QRVJfUEFHRSArIDEpKSAhPSBQcmV2UGFnZU51bWJlcikKCQkJCXsKCQkJCQlzd2l0Y2ggKE1TX1JlYWRlclJlYWRQYWdlKHVzLCBQaHlCbG9jaywgUGFnZU51bWJlciwgKERXT1JEICopUGFnZUJ1ZmZlciwgJkV4dHJhRGF0YSkpCgkJCQkJewoJCQkJCQljYXNlIE1TX1NUQVRVU19TVUNDRVNTOgoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgTVNfU1RBVFVTX1dSSVRFX1BST1RFQ1Q6CgkJCQkJCWNhc2UgTVNfRVJST1JfRkxBU0hfUkVBRDoKCQkJCQkJY2FzZSBNU19TVEFUVVNfRVJST1I6CgkJCQkJCWRlZmF1bHQ6CgkJCQkJCQlnb3RvIGV4aXQ7CgkJCQkJfQoKCQkJCQlQcmV2UGFnZU51bWJlciA9IFBhZ2VOdW1iZXI7CgkJCQl9CgoJCQkJaWYgKChwaHlibGsgPSBCaWdFbmRpYW5XT1JEKCooV09SRCAqKShQYWdlQnVmZmVyICsgKEVudHJ5T2Zmc2V0ICUgTVNfQllURVNfUEVSX1BBR0UpKSkpIDwgMHgwZmZmKQoJCQkJCU1TX0xpYlNldEluaXRpYWxFcnJvckJsb2NrKHVzLCBwaHlibGspOwoKCQkJCUVudHJ5T2Zmc2V0ICs9IDI7CgkJCQlFbnRyeVNpemUgLT0gMjsKCQkJfQoJCX0KCQllbHNlIGlmIChpID09IDEpCgkJeyAgLy8gQ0lTL0lESQoJCQlNZW1TdGlja0Jvb3RCbG9ja0lESSAgKmlkaTsKCgkJCWlmIChTeXNFbnRyeS0+ZW50cnlbaV0uYlR5cGUgIT0gTVNfU1lTRU5UX1RZUEVfQ0lTX0lESSkKCQkJCWdvdG8gZXhpdDsKCgkJCXN3aXRjaCAoTVNfUmVhZGVyUmVhZFBhZ2UodXMsIFBoeUJsb2NrLCAoQllURSkoRW50cnlPZmZzZXQgLyBNU19CWVRFU19QRVJfUEFHRSArIDEpLCAoRFdPUkQgKilQYWdlQnVmZmVyLCAmRXh0cmFEYXRhKSkKCQkJewoJCQkJY2FzZSBNU19TVEFUVVNfU1VDQ0VTUzoKCQkJCQlicmVhazsKCQkJCWNhc2UgTVNfU1RBVFVTX1dSSVRFX1BST1RFQ1Q6CgkJCQljYXNlIE1TX0VSUk9SX0ZMQVNIX1JFQUQ6CgkJCQljYXNlIE1TX1NUQVRVU19FUlJPUjoKCQkJCWRlZmF1bHQ6CgkJCQkJZ290byBleGl0OwoJCQl9CgoJCQlpZGkgPSAmKChNZW1TdGlja0Jvb3RCbG9ja0NJU19JREkgKikoUGFnZUJ1ZmZlciArIChFbnRyeU9mZnNldCAlIE1TX0JZVEVTX1BFUl9QQUdFKSkpLT5pZGkuaWRpOwoJCQlpZiAoTGl0dGxlRW5kaWFuV09SRChpZGktPndJRElnZW5lcmFsQ29uZmlndXJhdGlvbikgIT0gTVNfSURJX0dFTkVSQUxfQ09ORikKCQkJCWdvdG8gZXhpdDsKCgkJCXVzLT5NU19MaWIuQnl0ZXNQZXJTZWN0b3IgPSBMaXR0bGVFbmRpYW5XT1JEKGlkaS0+d0lESWJ5dGVzUGVyU2VjdG9yKTsKCQkJaWYgKHVzLT5NU19MaWIuQnl0ZXNQZXJTZWN0b3IgIT0gTVNfQllURVNfUEVSX1BBR0UpCgkJCQlnb3RvIGV4aXQ7CgkJfQoJfSAvLyBFbmQgZm9yIC4uCgoJcmVzdWx0ID0gMDsKCmV4aXQ6CglpZiAocmVzdWx0KQkJTVNfTGliRnJlZUxvZ2ljYWxNYXAodXMpOwoJaWYgKFBhZ2VCdWZmZXIpCWtmcmVlKFBhZ2VCdWZmZXIpOwoKCXJlc3VsdCA9IDA7CglyZXR1cm4gcmVzdWx0Owp9CgovLy0tLS0tIE1TX0xpYkFsbG9jTG9naWNhbE1hcCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJBbGxvY0xvZ2ljYWxNYXAoc3RydWN0IHVzX2RhdGEgKnVzKQp7CglEV09SRCAgaTsKCgoJdXMtPk1TX0xpYi5QaHkyTG9nTWFwID0gKFdPUkQgKilrbWFsbG9jKHVzLT5NU19MaWIuTnVtYmVyT2ZQaHlCbG9jayAqIHNpemVvZihXT1JEKSwgR0ZQX0tFUk5FTCk7Cgl1cy0+TVNfTGliLkxvZzJQaHlNYXAgPSAoV09SRCAqKWttYWxsb2ModXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrICogc2l6ZW9mKFdPUkQpLCBHRlBfS0VSTkVMKTsKCglpZiAoKHVzLT5NU19MaWIuUGh5MkxvZ01hcCA9PSBOVUxMKSB8fCAodXMtPk1TX0xpYi5Mb2cyUGh5TWFwID09IE5VTEwpKQoJewoJCU1TX0xpYkZyZWVMb2dpY2FsTWFwKHVzKTsKCQlyZXR1cm4gKERXT1JEKS0xOwoJfQoKCWZvciAoaSA9IDA7IGkgPCB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2s7IGkrKykKCQl1cy0+TVNfTGliLlBoeTJMb2dNYXBbaV0gPSBNU19MQl9OT1RfVVNFRDsKCglmb3IgKGkgPSAwOyBpIDwgdXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrOyBpKyspCgl1cy0+TVNfTGliLkxvZzJQaHlNYXBbaV0gPSBNU19MQl9OT1RfVVNFRDsKCglyZXR1cm4gMDsKfQoKLy8tLS0tLSBNU19MaWJTZXRCb290QmxvY2tNYXJrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliU2V0Qm9vdEJsb2NrTWFyayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgcGh5YmxrKQp7CiAgICByZXR1cm4gTVNfTGliU2V0TG9naWNhbEJsb2NrTWFyayh1cywgcGh5YmxrLCBNU19MQl9CT09UX0JMT0NLKTsKfQoKLy8tLS0tLSBNU19MaWJTZXRMb2dpY2FsQmxvY2tNYXJrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliU2V0TG9naWNhbEJsb2NrTWFyayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgcGh5YmxrLCBXT1JEIG1hcmspCnsKICAgIGlmIChwaHlibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrKQogICAgICAgIHJldHVybiAoRFdPUkQpLTE7CgogICAgdXMtPk1TX0xpYi5QaHkyTG9nTWFwW3BoeWJsa10gPSBtYXJrOwoKICAgIHJldHVybiAwOwp9CgovLy0tLS0tIE1TX0xpYlNldEluaXRpYWxFcnJvckJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJTZXRJbml0aWFsRXJyb3JCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgcGh5YmxrKQp7CiAgICByZXR1cm4gTVNfTGliU2V0TG9naWNhbEJsb2NrTWFyayh1cywgcGh5YmxrLCBNU19MQl9JTklUSUFMX0VSUk9SKTsKfQoKLy8tLS0tLSBNU19MaWJTY2FuTG9naWNhbEJsb2NrTnVtYmVyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliU2NhbkxvZ2ljYWxCbG9ja051bWJlcihzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgYnRCbGsxc3QpCnsKCVdPUkQJCQlQaHlCbG9jaywgbmV3YmxrLCBpOwoJV09SRAkJCUxvZ1N0YXJ0LCBMb2dFbmRlOwoJTVNfTGliVHlwZUV4dGRhdAlleHRkYXQ7CglCWVRFCQkJYnVmWzB4MjAwXTsKCURXT1JECQkJY291bnQ9MCwgaW5kZXg9MDsKCglmb3IgKFBoeUJsb2NrID0gMDsgUGh5QmxvY2sgPCB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2s7KQoJewoJCU1TX0xpYlBoeTJMb2dSYW5nZShQaHlCbG9jaywgJkxvZ1N0YXJ0LCAmTG9nRW5kZSk7CgoJCWZvciAoaT0wOyBpPE1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsgaSsrLCBQaHlCbG9jaysrKQoJCXsKCQkJc3dpdGNoIChNU19MaWJDb252MkxvZ2ljYWwodXMsIFBoeUJsb2NrKSkKCQkJewoJCQkJY2FzZSBNU19TVEFUVVNfRVJST1I6CgkJCQkJY29udGludWU7CgkJCQlkZWZhdWx0OgoJCQkJCWJyZWFrOwoJCQl9CgoJCQlpZiAoY291bnQgPT0gUGh5QmxvY2spCgkJCXsKCQkJCU1TX0xpYlJlYWRFeHRyYUJsb2NrKHVzLCBQaHlCbG9jaywgMCwgMHg4MCwgJmJ1Zik7CgkJCQljb3VudCArPSAweDgwOwoJCQl9CgkJCWluZGV4ID0gKFBoeUJsb2NrICUgMHg4MCkgKiA0OwoKCQkJZXh0ZGF0Lm92cmZsZyA9IGJ1ZltpbmRleF07CgkJCWV4dGRhdC5tbmdmbGcgPSBidWZbaW5kZXgrMV07CgkJCWV4dGRhdC5sb2dhZHIgPSBNZW1TdGlja0xvZ0FkZHIoYnVmW2luZGV4KzJdLCBidWZbaW5kZXgrM10pOwoKCQkJaWYgKChleHRkYXQub3ZyZmxnICYgTVNfUkVHX09WUl9CS1NUKSAhPSBNU19SRUdfT1ZSX0JLU1RfT0spCgkJCXsKCQkJCU1TX0xpYlNldEFjcXVpcmVkRXJyb3JCbG9jayh1cywgUGh5QmxvY2spOwoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICgoZXh0ZGF0Lm1uZ2ZsZyAmIE1TX1JFR19NTkdfQVRGTEcpID09IE1TX1JFR19NTkdfQVRGTEdfQVRUQkwpCgkJCXsKCQkJCU1TX0xpYkVyYXNlUGh5QmxvY2sodXMsIFBoeUJsb2NrKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoZXh0ZGF0LmxvZ2FkciAhPSBNU19MQl9OT1RfVVNFRCkKCQkJewoJCQkJaWYgKChleHRkYXQubG9nYWRyIDwgTG9nU3RhcnQpIHx8IChMb2dFbmRlIDw9IGV4dGRhdC5sb2dhZHIpKQoJCQkJewoJCQkJCU1TX0xpYkVyYXNlUGh5QmxvY2sodXMsIFBoeUJsb2NrKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlpZiAoKG5ld2JsayA9IE1TX0xpYkNvbnYyUGh5c2ljYWwodXMsIGV4dGRhdC5sb2dhZHIpKSAhPSBNU19MQl9OT1RfVVNFRCkKCQkJCXsKCQkJCQlpZiAoZXh0ZGF0LmxvZ2Fkcj09MCkKCQkJCQl7CgkJCQkJCU1TX0xpYlNldExvZ2ljYWxQYWlyKHVzLCBleHRkYXQubG9nYWRyLCBQaHlCbG9jayk7CgkJCQkJCWlmICggTVNfTGliQ2hlY2tEaXNhYmxlQmxvY2sodXMsIGJ0QmxrMXN0KSApCgkJCQkJCXsKCQkJCQkJCU1TX0xpYlNldExvZ2ljYWxQYWlyKHVzLCBleHRkYXQubG9nYWRyLCBuZXdibGspOwoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCU1TX0xpYlJlYWRFeHRyYSh1cywgbmV3YmxrLCAwLCAmZXh0ZGF0KTsKCQkJCQlpZiAoKGV4dGRhdC5vdnJmbGcgJiBNU19SRUdfT1ZSX1VEU1QpID09IE1TX1JFR19PVlJfVURTVF9VUERBVElORykKCQkJCQl7CgkJCQkJCU1TX0xpYkVyYXNlUGh5QmxvY2sodXMsIFBoeUJsb2NrKTsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQkJTVNfTGliRXJhc2VQaHlCbG9jayh1cywgbmV3YmxrKTsKCQkJCX0KCgkJCQlNU19MaWJTZXRMb2dpY2FsUGFpcih1cywgZXh0ZGF0LmxvZ2FkciwgUGh5QmxvY2spOwoJCQl9CgkJfQoJfSAvL0VuZCBmb3IgLi4uCgoJcmV0dXJuIE1TX1NUQVRVU19TVUNDRVNTOwp9CgovLy0tLS0tIE1TX0xpYkFsbG9jV3JpdGVCdWYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJBbGxvY1dyaXRlQnVmKHN0cnVjdCB1c19kYXRhICp1cykKewoJdXMtPk1TX0xpYi53cnRibGsgPSAoV09SRCktMTsKCgl1cy0+TVNfTGliLmJsa3BhZyA9IChCWVRFICopa21hbGxvYyh1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiB1cy0+TVNfTGliLkJ5dGVzUGVyU2VjdG9yLCBHRlBfS0VSTkVMKTsKCXVzLT5NU19MaWIuYmxrZXh0ID0gKE1TX0xpYlR5cGVFeHRkYXQgKilrbWFsbG9jKHVzLT5NU19MaWIuUGFnZXNQZXJCbG9jayAqIHNpemVvZihNU19MaWJUeXBlRXh0ZGF0KSwgR0ZQX0tFUk5FTCk7CgoJaWYgKCh1cy0+TVNfTGliLmJsa3BhZyA9PSBOVUxMKSB8fCAodXMtPk1TX0xpYi5ibGtleHQgPT0gTlVMTCkpCgl7CgkJTVNfTGliRnJlZVdyaXRlQnVmKHVzKTsKCQlyZXR1cm4gKERXT1JEKS0xOwoJfQoKCU1TX0xpYkNsZWFyV3JpdGVCdWYodXMpOwoKCXJldHVybiAwOwp9CgovLy0tLS0tIE1TX0xpYkNsZWFyV3JpdGVCdWYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgTVNfTGliQ2xlYXJXcml0ZUJ1ZihzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCWludCBpOwoKCXVzLT5NU19MaWIud3J0YmxrID0gKFdPUkQpLTE7CglNU19MaWJDbGVhclBhZ2VNYXAodXMpOwoKCWlmICh1cy0+TVNfTGliLmJsa3BhZykKCQltZW1zZXQodXMtPk1TX0xpYi5ibGtwYWcsIDB4ZmYsIHVzLT5NU19MaWIuUGFnZXNQZXJCbG9jayAqIHVzLT5NU19MaWIuQnl0ZXNQZXJTZWN0b3IpOwoKCWlmICh1cy0+TVNfTGliLmJsa2V4dCkKCXsKCQlmb3IgKGkgPSAwOyBpIDwgdXMtPk1TX0xpYi5QYWdlc1BlckJsb2NrOyBpKyspCgkJewoJCQl1cy0+TVNfTGliLmJsa2V4dFtpXS5zdGF0dXMxID0gTVNfUkVHX1NUMV9ERUZBVUxUOwoJCQl1cy0+TVNfTGliLmJsa2V4dFtpXS5vdnJmbGcgPSBNU19SRUdfT1ZSX0RFRkFVTFQ7CgkJCXVzLT5NU19MaWIuYmxrZXh0W2ldLm1uZ2ZsZyA9IE1TX1JFR19NTkdfREVGQVVMVDsKCQkJdXMtPk1TX0xpYi5ibGtleHRbaV0ubG9nYWRyID0gTVNfTEJfTk9UX1VTRUQ7CgkJfQoJfQp9CgovLy0tLS0tIE1TX0xpYlBoeTJMb2dSYW5nZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgTVNfTGliUGh5MkxvZ1JhbmdlKFdPUkQgUGh5QmxvY2ssIFdPUkQgKkxvZ1N0YXJ0LCBXT1JEICpMb2dFbmRlKQp7CglQaHlCbG9jayAvPSBNU19QSFlTSUNBTF9CTE9DS1NfUEVSX1NFR01FTlQ7CgoJaWYgKFBoeUJsb2NrKQoJewoJCSpMb2dTdGFydCA9IE1TX0xPR0lDQUxfQkxPQ0tTX0lOXzFTVF9TRUdNRU5UICsgKFBoeUJsb2NrIC0gMSkgKiBNU19MT0dJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsvLzQ5NgoJCSpMb2dFbmRlID0gKkxvZ1N0YXJ0ICsgTVNfTE9HSUNBTF9CTE9DS1NfUEVSX1NFR01FTlQ7Ly80OTYKCX0KCWVsc2UKCXsKCQkqTG9nU3RhcnQgPSAwOwoJCSpMb2dFbmRlID0gTVNfTE9HSUNBTF9CTE9DS1NfSU5fMVNUX1NFR01FTlQ7Ly80OTQKCX0KfQoKLy8tLS0tLSBNU19MaWJSZWFkRXh0cmFCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJSZWFkRXh0cmFCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIFBoeUJsb2NrLCBCWVRFIFBhZ2VOdW0sIEJZVEUgYmxlbiwgdm9pZCAqYnVmKQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoKCS8vcHJpbnRrKCJNU19MaWJSZWFkRXh0cmFCbG9jayAtLS0gUGh5QmxvY2sgPSAleCwgUGFnZU51bSA9ICV4LCBibGVuID0gJXhcbiIsIFBoeUJsb2NrLCBQYWdlTnVtLCBibGVuKTsKCgkvLyBSZWFkIEV4dHJhIERhdGEKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IDB4NCAqIGJsZW47CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMzsKCWJjYi0+Q0RCWzVdCQkJPSAoQllURSkoUGFnZU51bSk7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpKFBoeUJsb2NrKTsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoUGh5QmxvY2s+PjgpOwoJYmNiLT5DREJbMl0JCQk9IChCWVRFKShQaHlCbG9jaz4+MTYpOwoJYmNiLT5DREJbNl0JCQk9IGJsZW47CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoKCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKfQoKLy8tLS0tLSBNU19MaWJSZWFkRXh0cmEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliUmVhZEV4dHJhKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgUGh5QmxvY2ssIEJZVEUgUGFnZU51bSwgTVNfTGliVHlwZUV4dGRhdCAqRXh0cmFEYXQpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CglCWVRFCUV4dEJ1Zls0XTsKCgkvL3ByaW50aygiTVNfTGliUmVhZEV4dHJhIC0tLSBQaHlCbG9jayA9ICV4LCBQYWdlTnVtID0gJXhcbiIsIFBoeUJsb2NrLCBQYWdlTnVtKTsKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IDB4NDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwoJYmNiLT5DREJbNV0JCQk9IChCWVRFKShQYWdlTnVtKTsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSkoUGh5QmxvY2spOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShQaHlCbG9jaz4+OCk7CgliY2ItPkNEQlsyXQkJCT0gKEJZVEUpKFBoeUJsb2NrPj4xNik7CgliY2ItPkNEQls2XQkJCT0gMHgwMTsKCQoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsICZFeHRCdWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglFeHRyYURhdC0+cmVzZXJ2ZWQgPSAwOwoJRXh0cmFEYXQtPmludHIgICAgID0gMHg4MDsgIC8vIE5vdCB5ZXQsIHdhaXRpbmcgZm9yIGZpcmV3YXJlIHN1cHBvcnQKCUV4dHJhRGF0LT5zdGF0dXMwICA9IDB4MTA7ICAvLyBOb3QgeWV0LCB3YWl0aW5nIGZvciBmaXJld2FyZSBzdXBwb3J0CglFeHRyYURhdC0+c3RhdHVzMSAgPSAweDAwOyAgLy8gTm90IHlldCwgd2FpdGluZyBmb3IgZmlyZXdhcmUgc3VwcG9ydAoJRXh0cmFEYXQtPm92cmZsZyAgID0gRXh0QnVmWzBdOwoJRXh0cmFEYXQtPm1uZ2ZsZyAgID0gRXh0QnVmWzFdOwoJRXh0cmFEYXQtPmxvZ2FkciAgID0gTWVtU3RpY2tMb2dBZGRyKEV4dEJ1ZlsyXSwgRXh0QnVmWzNdKTsKCQoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9CgovLy0tLS0tIE1TX0xpYlNldEFjcXVpcmVkRXJyb3JCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJTZXRBY3F1aXJlZEVycm9yQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIHBoeWJsaykKewoJV09SRCBsb2c7CgoJaWYgKHBoeWJsayA+PSB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2spCgkJcmV0dXJuIChEV09SRCktMTsKCglpZiAoKGxvZyA9IHVzLT5NU19MaWIuUGh5MkxvZ01hcFtwaHlibGtdKSA8IHVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jaykKCQl1cy0+TVNfTGliLkxvZzJQaHlNYXBbbG9nXSA9IE1TX0xCX05PVF9VU0VEOwoKCWlmICh1cy0+TVNfTGliLlBoeTJMb2dNYXBbcGh5YmxrXSAhPSBNU19MQl9JTklUSUFMX0VSUk9SKQoJCXVzLT5NU19MaWIuUGh5MkxvZ01hcFtwaHlibGtdID0gTVNfTEJfQUNRVUlSRURfRVJST1I7CgoJcmV0dXJuIDA7Cn0KCi8vLS0tLS0gTVNfTGliRXJhc2VQaHlCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYkVyYXNlUGh5QmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIHBoeWJsaykKewoJV09SRCAgbG9nOwoKCWlmIChwaHlibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrKQoJCXJldHVybiBNU19TVEFUVVNfRVJST1I7CgoJaWYgKChsb2cgPSB1cy0+TVNfTGliLlBoeTJMb2dNYXBbcGh5YmxrXSkgPCB1cy0+TVNfTGliLk51bWJlck9mTG9nQmxvY2spCgkJdXMtPk1TX0xpYi5Mb2cyUGh5TWFwW2xvZ10gPSBNU19MQl9OT1RfVVNFRDsKCgl1cy0+TVNfTGliLlBoeTJMb2dNYXBbcGh5YmxrXSA9IE1TX0xCX05PVF9VU0VEOwoKCWlmIChNU19MaWJJc1dyaXRhYmxlKHVzKSkKCXsKCQlzd2l0Y2ggKE1TX1JlYWRlckVyYXNlQmxvY2sodXMsIHBoeWJsaykpCgkJewoJCQljYXNlIE1TX1NUQVRVU19TVUNDRVNTOgoJCQkJdXMtPk1TX0xpYi5QaHkyTG9nTWFwW3BoeWJsa10gPSBNU19MQl9OT1RfVVNFRF9FUkFTRUQ7CgkJCQlyZXR1cm4gTVNfU1RBVFVTX1NVQ0NFU1M7CgkJCWNhc2UgTVNfRVJST1JfRkxBU0hfRVJBU0U6CgkJCWNhc2UgTVNfU1RBVFVTX0lOVF9FUlJPUiA6CgkJCQlNU19MaWJFcnJvclBoeUJsb2NrKHVzLCBwaHlibGspOwoJCQkJcmV0dXJuIE1TX0VSUk9SX0ZMQVNIX0VSQVNFOwoJCQljYXNlIE1TX1NUQVRVU19FUlJPUjoKCQkJZGVmYXVsdDoKCQkJCU1TX0xpYkN0cmxTZXQodXMsIE1TX0xJQl9DVFJMX1JET05MWSk7CgkJCQlNU19MaWJTZXRBY3F1aXJlZEVycm9yQmxvY2sodXMsIHBoeWJsayk7CgkJCQlyZXR1cm4gTVNfU1RBVFVTX0VSUk9SOwoJCX0KCX0KCglNU19MaWJTZXRBY3F1aXJlZEVycm9yQmxvY2sodXMsIHBoeWJsayk7CgoJcmV0dXJuIE1TX1NUQVRVU19TVUNDRVNTOwp9CgovLy0tLS0tIE1TX0xpYkVycm9yUGh5QmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJFcnJvclBoeUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBwaHlibGspCnsKICAgIGlmIChwaHlibGsgPj0gdXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrKQogICAgICAgIHJldHVybiBNU19TVEFUVVNfRVJST1I7CgogICAgTVNfTGliU2V0QWNxdWlyZWRFcnJvckJsb2NrKHVzLCBwaHlibGspOwoKICAgIGlmIChNU19MaWJJc1dyaXRhYmxlKHVzKSkKICAgICAgICByZXR1cm4gTVNfTGliT3ZlcndyaXRlRXh0cmEodXMsIHBoeWJsaywgMCwgKEJZVEUpKH5NU19SRUdfT1ZSX0JLU1QpKTsKCgogICAgcmV0dXJuIE1TX1NUQVRVU19TVUNDRVNTOwp9CgovLy0tLS0tIE1TX0xpYk92ZXJ3cml0ZUV4dHJhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJPdmVyd3JpdGVFeHRyYShzdHJ1Y3QgdXNfZGF0YSAqdXMsIERXT1JEIFBoeUJsb2NrQWRkciwgQllURSBQYWdlTnVtLCBCWVRFIE92ZXJ3cml0ZUZsYWcpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CgoJLy9wcmludGsoIk1TIC0tLSBNU19MaWJPdmVyd3JpdGVFeHRyYSwgIFBoeUJsb2NrQWRkciA9ICV4LCBQYWdlTnVtID0gJXhcbiIsIFBoeUJsb2NrQWRkciwgUGFnZU51bSk7CglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIE1TX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSAweDQ7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjI7CgliY2ItPkNEQlsxXQkJCT0gMHgwNTsKCWJjYi0+Q0RCWzVdCQkJPSAoQllURSkoUGFnZU51bSk7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpKFBoeUJsb2NrQWRkcik7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKFBoeUJsb2NrQWRkcj4+OCk7CgliY2ItPkNEQlsyXQkJCT0gKEJZVEUpKFBoeUJsb2NrQWRkcj4+MTYpOwoJYmNiLT5DREJbNl0JCQk9IE92ZXJ3cml0ZUZsYWc7CgliY2ItPkNEQls3XQkJCT0gMHhGRjsKCWJjYi0+Q0RCWzhdCQkJPSAweEZGOwoJYmNiLT5DREJbOV0JCQk9IDB4RkY7CgkKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBOVUxMLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9CgovLy0tLS0tIE1TX0xpYkZvcmNlU2V0TG9naWNhbFBhaXIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNU19MaWJGb3JjZVNldExvZ2ljYWxQYWlyKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBsb2dibGssIFdPUkQgcGh5YmxrKQp7CglpZiAobG9nYmxrID09IE1TX0xCX05PVF9VU0VEKQoJCXJldHVybiAwOwoKCWlmICgobG9nYmxrID49IHVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jaykgfHwgKHBoeWJsayA+PSB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2spKQoJCXJldHVybiAoRFdPUkQpLTE7CgoJdXMtPk1TX0xpYi5QaHkyTG9nTWFwW3BoeWJsa10gPSBsb2dibGs7Cgl1cy0+TVNfTGliLkxvZzJQaHlNYXBbbG9nYmxrXSA9IHBoeWJsazsKCglyZXR1cm4gMDsKfQoKLy8tLS0tLSBNU19MaWJTZXRMb2dpY2FsUGFpcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfTGliU2V0TG9naWNhbFBhaXIoc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGxvZ2JsaywgV09SRCBwaHlibGspCnsKCWlmICgobG9nYmxrID49IHVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jaykgfHwgKHBoeWJsayA+PSB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2spKQoJCXJldHVybiAoRFdPUkQpLTE7CgoJdXMtPk1TX0xpYi5QaHkyTG9nTWFwW3BoeWJsa10gPSBsb2dibGs7Cgl1cy0+TVNfTGliLkxvZzJQaHlNYXBbbG9nYmxrXSA9IHBoeWJsazsKCglyZXR1cm4gMDsKfQoKLy8tLS0tLSBNU19Db3VudEZyZWVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTVNfQ291bnRGcmVlQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIFBoeUJsb2NrKQp7CglEV09SRCBFbmRlLCBDb3VudDsKCglFbmRlID0gUGh5QmxvY2sgKyBNU19QSFlTSUNBTF9CTE9DS1NfUEVSX1NFR01FTlQ7Cglmb3IgKENvdW50ID0gMDsgUGh5QmxvY2sgPCBFbmRlOyBQaHlCbG9jaysrKQoJewoJCXN3aXRjaCAodXMtPk1TX0xpYi5QaHkyTG9nTWFwW1BoeUJsb2NrXSkKCQl7CgkJCWNhc2UgTVNfTEJfTk9UX1VTRUQ6CgkJCWNhc2UgTVNfTEJfTk9UX1VTRURfRVJBU0VEOgoJCQkJQ291bnQrKzsKCQkJZGVmYXVsdDoKCQkJCWJyZWFrOwoJCX0KCX0KCglyZXR1cm4gQ291bnQ7Cn0KCi8vLS0tLS0gTVNfTGliU2VhcmNoQmxvY2tGcm9tUGh5c2ljYWwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYlNlYXJjaEJsb2NrRnJvbVBoeXNpY2FsKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBwaHlibGspCnsKCVdPUkQJCQlOZXdibGs7CglXT1JECQkJYmxrOwoJTVNfTGliVHlwZUV4dGRhdAlleHRkYXQ7CgoJaWYgKHBoeWJsayA+PSB1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2spCgkJcmV0dXJuIE1TX0xCX0VSUk9SOwoKCWZvciAoYmxrID0gcGh5YmxrICsgMTsgYmxrICE9IHBoeWJsazsgYmxrKyspCgl7CgkJaWYgKChibGsgJiBNU19QSFlTSUNBTF9CTE9DS1NfUEVSX1NFR01FTlRfTUFTSykgPT0gMCkKCQkJYmxrIC09IE1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVDsKCgkJTmV3YmxrID0gdXMtPk1TX0xpYi5QaHkyTG9nTWFwW2Jsa107CgkJaWYgKHVzLT5NU19MaWIuUGh5MkxvZ01hcFtibGtdID09IE1TX0xCX05PVF9VU0VEX0VSQVNFRCkKCQkJcmV0dXJuIGJsazsKCQllbHNlIGlmICh1cy0+TVNfTGliLlBoeTJMb2dNYXBbYmxrXSA9PSBNU19MQl9OT1RfVVNFRCkKCQl7CgkJCXN3aXRjaCAoTVNfTGliUmVhZEV4dHJhKHVzLCBibGssIDAsICZleHRkYXQpKQoJCQl7CgkJCQljYXNlIE1TX1NUQVRVU19TVUNDRVNTIDoKCQkJCWNhc2UgTVNfU1RBVFVTX1NVQ0NFU1NfV0lUSF9FQ0M6CgkJCQkJYnJlYWs7CgkJCQljYXNlIE1TX05PQ0FSRF9FUlJPUjoKCQkJCQlyZXR1cm4gTVNfTk9DQVJEX0VSUk9SOwoJCQkJY2FzZSBNU19TVEFUVVNfSU5UX0VSUk9SOgoJCQkJCXJldHVybiBNU19MQl9FUlJPUjsKCQkJCWNhc2UgTVNfRVJST1JfRkxBU0hfUkVBRDoKCQkJCWRlZmF1bHQ6CgkJCQkJTVNfTGliU2V0QWNxdWlyZWRFcnJvckJsb2NrKHVzLCBibGspOyAgICAgLy8gTVNfTGliRXJyb3JQaHlCbG9jayhmZG9FeHQsIGJsayk7CgkJCQkJY29udGludWU7CgkJCX0gLy8gRW5kIHN3aXRjaAoKCQkJaWYgKChleHRkYXQub3ZyZmxnICYgTVNfUkVHX09WUl9CS1NUKSAhPSBNU19SRUdfT1ZSX0JLU1RfT0spCgkJCXsKCQkJCU1TX0xpYlNldEFjcXVpcmVkRXJyb3JCbG9jayh1cywgYmxrKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzd2l0Y2ggKE1TX0xpYkVyYXNlUGh5QmxvY2sodXMsIGJsaykpCgkJCXsKCQkJCWNhc2UgTVNfU1RBVFVTX1NVQ0NFU1M6CgkJCQkJcmV0dXJuIGJsazsKCQkJCWNhc2UgTVNfU1RBVFVTX0VSUk9SOgoJCQkJCXJldHVybiBNU19MQl9FUlJPUjsKCQkJCWNhc2UgTVNfRVJST1JfRkxBU0hfRVJBU0U6CgkJCQlkZWZhdWx0OgoJCQkJCU1TX0xpYkVycm9yUGh5QmxvY2sodXMsIGJsayk7CgkJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9IC8vIEVuZCBmb3IKCglyZXR1cm4gTVNfTEJfRVJST1I7Cn0KCi8vLS0tLS0gTVNfTGliU2VhcmNoQmxvY2tGcm9tTG9naWNhbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1TX0xpYlNlYXJjaEJsb2NrRnJvbUxvZ2ljYWwoc3RydWN0IHVzX2RhdGEgKnVzLCBXT1JEIGxvZ2JsaykKewoJV09SRCBwaHlibGs7CgoJaWYgKChwaHlibGs9TVNfTGliQ29udjJQaHlzaWNhbCh1cywgbG9nYmxrKSkgPj0gTVNfTEJfRVJST1IpCgl7CgkJaWYgKGxvZ2JsayA+PSB1cy0+TVNfTGliLk51bWJlck9mTG9nQmxvY2spCgkJCXJldHVybiBNU19MQl9FUlJPUjsKCgkJcGh5YmxrID0gKGxvZ2JsayArIE1TX05VTUJFUl9PRl9CT09UX0JMT0NLKSAvIE1TX0xPR0lDQUxfQkxPQ0tTX1BFUl9TRUdNRU5UOwoJCXBoeWJsayAqPSBNU19QSFlTSUNBTF9CTE9DS1NfUEVSX1NFR01FTlQ7CgkJcGh5YmxrICs9IE1TX1BIWVNJQ0FMX0JMT0NLU19QRVJfU0VHTUVOVCAtIDE7Cgl9CgoJcmV0dXJuIE1TX0xpYlNlYXJjaEJsb2NrRnJvbVBoeXNpY2FsKHVzLCBwaHlibGspOwp9CgoK