JJ

I2lmbmRlZiBVVElMX0NIQUlOTElCX0gKI2RlZmluZSBVVElMX0NIQUlOTElCX0gKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPG5ldz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgoKbmFtZXNwYWNlIHV0aWwgewoKCS8qKgoJKiDov5nmmK/kuIDkuKrmjpLluo/nmoTpk77ooajvvIzliIbphY3nmoTlhoXlrZjlsIbkuI3kvJrliKDpmaTvvIznm7TliLDlr7nosaHplIDmr4Hml7bmiY3liKAKCSoKCSogQG5vdGljZSDlr7nosaFU6ZyA6KaB5pSv5oyBIDwsID0sIDw8IDPkuKrmk43kvZznrKYKCSovCgoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCXN0cnVjdCBOb2RlT2JqZWN0IHsKCQlUIG9iajsgLy8g5a+56LGh5a2Y5pS+CgoJCU5vZGVPYmplY3QqIHByZXY7IC8vIOWJjeS4gOS4quaMh+mSiAoJCU5vZGVPYmplY3QqIG5leHQ7IC8vIOWQjuS4gOS4quaMh+mSiAoKCQkJCQkJICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCU5vZGVPYmplY3QoKSA6IHByZXYoTlVMTCksIG5leHQoTlVMTCkge30KCQlOb2RlT2JqZWN0KGNvbnN0IFQmIG8pIDogcHJldihOVUxMKSwgbmV4dChOVUxMKSB7CgkJCW1lbWNweSgmb2JqLCAmbywgc2l6ZW9mKFQpKTsKCQl9CgkJTm9kZU9iamVjdChjb25zdCBOb2RlT2JqZWN0PFQ+JiB0KSB7CgkJCW1lbWNweSgmb2JqLCAmKHQub2JqKSwgc2l6ZW9mKFQpKTsKCQkJcHJldiA9IHQucHJldjsKCQkJbmV4dCA9IHQubmV4dDsKCQl9CgoJCS8vCgkJTm9kZU9iamVjdCYgb3BlcmF0b3IgPSAoY29uc3QgVCYgbykgewoJCQltZW1jcHkoJm9iaiwgJm8sIHNpemVvZihUKSk7CgkJCXJldHVybiAqdGhpczsKCQl9CgkJTm9kZU9iamVjdCYgb3BlcmF0b3IgPSAoY29uc3QgTm9kZU9iamVjdDxUPiYgdCkgewoJCQltZW1jcHkoJm9iaiwgJih0Lm9iaiksIHNpemVvZihUKSk7CgkJCXByZXYgPSB0LnByZXY7CgkJCW5leHQgPSB0Lm5leHQ7CgkJCXJldHVybiAqdGhpczsKCQl9CgkJb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKCQkJcmV0dXJuIChOVUxMICE9IHByZXYgfHwgTlVMTCAhPSBuZXh0KTsKCQl9Cgl9OwoKCXRlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lIFM+CglzdHJ1Y3QgUGFpclR5cGUgewoJCUYgICBmaXJzdDsKCQlTICAgc2Vjb25kOwoKCQlQYWlyVHlwZSgpIDogZmlyc3QoKSwgc2Vjb25kKCkgeyB9CgkJUGFpclR5cGUoY29uc3QgUGFpclR5cGUmIHIpIHsKCQkJKnRoaXMgPSByOwoJCX0KCQlQYWlyVHlwZShGIGYsIFMgcykgOiBmaXJzdChmKSwgc2Vjb25kKHMpIHt9CgkJUGFpclR5cGUmIG9wZXJhdG9yID0gKGNvbnN0IFBhaXJUeXBlJiByKSB7CgkJCWZpcnN0ID0gci5maXJzdDsvL2xpbnQgIWUxNTU1CgkJCXNlY29uZCA9IHIuc2Vjb25kOwoJCQlyZXR1cm4gKnRoaXM7CgkJfQoJfTsKCgkvLwoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCWNsYXNzIFNvcnRDaGFpbiB7CglwdWJsaWM6CgkJdHlwZWRlZiBOb2RlT2JqZWN0PFQ+KiBOb2RlUHRyOwoKCQkvLwoJCVNvcnRDaGFpbigpIDogX3BXb3JrQ2hhaW5IZWFkKE5VTEwpLCBfcFdvcmtDaGFpblRhaWwoTlVMTCksIF9wUmVjdUNoYWluVGFpbChOVUxMKSwKCQkJX3BOZXh0Q2hhaW5IZWFkKE5VTEwpLCBfcE5leHRDdXJPYmooTlVMTCksIF93b3JrTnVtKDApIHsKCQl9CgkJflNvcnRDaGFpbigpIHsKCQkJZGVsQWxsKCk7CgkJfQoKCQkvLyDlop7liqDmlrnms5XvvIzpmLLmraLlhoXlrZjms4TpnLIKCQlTb3J0Q2hhaW48VD4mIG9wZXJhdG9yPSAoY29uc3QgU29ydENoYWluPFQ+JiByKSB7CgkJCWlmICgmciA9PSB0aGlzKSB7CgkJCQlyZXR1cm4gKnRoaXM7CgkJCX0KCgkJCXRoaXMtPmNsZWFyKCk7CgkJCVNvcnRDaGFpbjxUPiYgaVIgPSBjb25zdF9jYXN0PFNvcnRDaGFpbjxUPiY+KHIpOwoJCQlpUi5yZXdpbmQoKTsKCgkJCXdoaWxlIChpUi5uZXh0KCkpIHsKCQkJCXRoaXMtPnB1c2hfYmFjayhpUi5nZXQoKSk7CgkJCX0KCgkJCWlSLnJld2luZCgpOwoKCQkJcmV0dXJuICp0aGlzOwoJCX0KCQlTb3J0Q2hhaW4oY29uc3QgU29ydENoYWluPFQ+JiByKSA6IF9wV29ya0NoYWluSGVhZChOVUxMKSwgX3BXb3JrQ2hhaW5UYWlsKE5VTEwpLCBfcFJlY3VDaGFpblRhaWwoTlVMTCksCgkJCV9wTmV4dENoYWluSGVhZChOVUxMKSwgX3BOZXh0Q3VyT2JqKE5VTEwpLCBfd29ya051bSgwKSB7CgkJCSp0aGlzID0gcjsKCQl9CgoJCS8qKgoJCSog5p+l5om+77yM5LqM5YiG5p+l5om+CgkJKgoJCSogQHJldHVybiwgcGFpcuWJjemdoueahFTmjIfpkojmmK/kuKrlj4LogIPlgLzvvIwKCQkqICAgICAgICAgIOWmguaenOmTvuihqOS4uk5VTEzvvIw8TlVMTCwgLTI+CgkJKiAgICAgICAgICDlpoLmnpzmib7liLDkuobkuI5vYmrnm7jnrYnnmoTpk77ooajoioLngrnvvIw8Zmlyc3QsIDA+77yMZmlyc3TmmK/mjIflkJHmib7liLDoioLngrnnmoTmjIfpkogKCQkqICAgICAgICAgIOWmguaenOayoeacieaJvuWIsO+8jOacgOWQjuaJvuWIsOeahOiKgueCueavlG9iauWkp++8jDxmaXJzdCwgLTE+LCBvYmrlkI7nu63lupTor6Xmj5LlnKhmaXJzdOWJjQoJCSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5bCP77yMPGZpcnN0LCAxPu+8jCBvYmrlkI7nu63lupTor6Xmj5LlnKhmaXJzdOWQjgoJCSogQHdhcm5uaW5nIOWPqumAguWQiOS6jmluc2VydOaWueW8j+aPkuWFpeeahOmTvuihqAoJCSovCgkJdHlwZWRlZiBQYWlyVHlwZTxOb2RlT2JqZWN0PFQ+KiwgaW50PiBGaW5kX3R5cGU7IC8vLTIsIOmTvuihqOaYr+epujsgLTEsIDw7IDAgPT0sIDEgPgoJCUZpbmRfdHlwZSBmaW5kT2JqKGNvbnN0IFQmIG9iaikgewoJCQlpZiAoMCA9PSBfd29ya051bSkgewoJCQkJcmV0dXJuIEZpbmRfdHlwZShOVUxMLCAtMik7CgkJCX0KCgkJCWludCBuTWlkOwoJCQlpbnQgbkhlYWQgPSAxOwoJCQlpbnQgblRhaWwgPSBfd29ya051bTsKCQkJTm9kZU9iamVjdDxUPiogcEhlYWQgPSBfcFdvcmtDaGFpbkhlYWQ7CgkJCU5vZGVPYmplY3Q8VD4qIHBNaWQgPSBOVUxMOwoKCQkJLy8KCQkJaW50IG5UeXBlID0gMDsKCgkJCXdoaWxlIChuSGVhZCA8PSBuVGFpbCkgewoJCQkJcE1pZCA9IHBIZWFkOwoJCQkJbk1pZCA9IChuSGVhZCArIG5UYWlsKSAvIDI7CgoJCQkJZm9yIChpbnQgaSA9IG5IZWFkOyAocE1pZCAhPSBOVUxMKSAmJiAoaSA8IG5NaWQpOyArK2kpIHsKCQkJCQlwTWlkID0gcE1pZC0+bmV4dDsKCQkJCX0KCgkJCQlpZiAoTlVMTCA9PSBwTWlkKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJLy8g5q+U6L6DCgkJCQlpZiAob2JqIDwgcE1pZC0+b2JqKSB7IC8vIOWwj+S6jgoJCQkJCW5UYWlsID0gbk1pZCAtIDE7CgkJCQkJblR5cGUgPSAtMTsKCgkJCQl9CgkJCQllbHNlIGlmIChwTWlkLT5vYmogPCBvYmopIHsgLy8g5aSn5LqOCgkJCQkJcEhlYWQgPSBwTWlkLT5uZXh0OwoJCQkJCW5IZWFkID0gbk1pZCArIDE7CgkJCQkJblR5cGUgPSAxOwoKCQkJCX0KCQkJCWVsc2UgeyAvLyDmib7liLAKCQkJCQluVHlwZSA9IDA7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCXJldHVybiBGaW5kX3R5cGUocE1pZCwgblR5cGUpOwoJCX0KCgkJLyoqCgkJKiDmn6Xmib7vvIzkuozliIbmn6Xmib4KCQkqCgkJKiBAcmV0dXJuLCDmsqHmnInmib7liLAgTlVMTO+8m+aJvuWIsOS6hiDov5Tlm55vYmrlnKjpk77ooajkuK3mlbDmja7lrZjmlL7nmoTmjIfpkogKCQkqIEB3YXJubmluZyDlj6rpgILlkIjkuo5pbnNlcnTmlrnlvI/mj5LlhaXnmoTpk77ooagKCQkqLwoJCVQqIGZpbmQoY29uc3QgVCYgb2JqKSB7CgkJCUZpbmRfdHlwZSBmdCA9IGZpbmRPYmoob2JqKTsKCgkJCWlmICgwID09IGZ0LnNlY29uZCkgewoJCQkJcmV0dXJuICYoZnQuZmlyc3QtPm9iaik7CgkJCX0KCgkJCXJldHVybiBOVUxMOwoJCX0KCgkJLyoqCgkJKiDmjpLluo/mj5LlhaUKCQkqCgkJKiBAcmV0dXJuLCDlpoLmnpxvYmrlnKjpk77ooajkuK3lt7Lnu4/lrZjlnKggPGZpcnN0LCBmYWxzZT4sIGZpcnN05pivb2Jq5bey57uP5a2Y5Zyo55qE5pWw5o2u5a+56LGh5oyH6ZKICgkJKiAgICAgICAgICDlpoLmnpzkuI3lrZjlnKjvvIw8Zmlyc3QsIHRydWU+77yMZmlyc3TmmK9vYmrlnKjpk77ooajkuK3nmoTmlbDmja7lr7nosaHmjIfpkogKCQkqIEB3YXJuaW5nLCBvYmrmnIkgPCwgPSDmk43kvZznrKbnmoTlrp7njrAKCQkqLwoJCXR5cGVkZWYgUGFpclR5cGU8VCosIGJvb2w+IEluc2VydF90eXBlOwoJCS8vbGludCAtZWNhbGwoNTM0LHV0aWw6OlNvcnRDaGFpbjwqPjo6aW5zZXJ0KSAKCQlJbnNlcnRfdHlwZSBpbnNlcnQoY29uc3QgVCYgb2JqKSB7CgkJCS8vIOWIpOaWreaYr+WQpuS4uuepuumTvgoJCQlpZiAoTlVMTCA9PSBfcFdvcmtDaGFpbkhlYWQpIHsKCQkJCV9wV29ya0NoYWluSGVhZCA9IGFsbG9jKCk7CgkJCQlfcFdvcmtDaGFpblRhaWwgPSBfcFdvcmtDaGFpbkhlYWQ7CgkJCQlfcFdvcmtDaGFpbkhlYWQtPm9iaiA9IG9iajsKCQkJCSsrX3dvcmtOdW07CgkJCQlyZXR1cm4gSW5zZXJ0X3R5cGUoJihfcFdvcmtDaGFpbkhlYWQtPm9iaiksIHRydWUpOwoJCQl9CgoJCQkvLyDmn6Xmib4KCQkJRmluZF90eXBlIGZ0ID0gZmluZE9iaihvYmopOwoKCQkJaWYgKE5VTEwgPT0gZnQuZmlyc3QpIHsKCQkJCS8vIHRocm93CgkJCX0KCgkJCWlmICgwID09IGZ0LnNlY29uZCkgewoJCQkJcmV0dXJuIEluc2VydF90eXBlKCYoZnQuZmlyc3QtPm9iaiksIGZhbHNlKTsKCQkJfQoKCQkJLy8g5YiG6YWN56m66Ze05a2Y5YKoCgkJCSsrX3dvcmtOdW07CgkJCU5vZGVPYmplY3Q8VD4qIHBUbXAgPSBhbGxvYygpOwoJCQlwVG1wLT5vYmogPSBvYmo7CgoJCQkvLyDnu4Tnu4fpk74KCQkJTm9kZU9iamVjdDxUPiogcFByZXYgPSBmdC5maXJzdC0+cHJldjsKCQkJTm9kZU9iamVjdDxUPiogcE5leHQgPSBmdC5maXJzdC0+bmV4dDsKCgkJCWlmIChmdC5zZWNvbmQgPCAwKSB7ICAgICAgICAgICAgLy8g5bCP5LqO77yM5pS+5Zyo5YmN6Z2iCgkJCQlmdC5maXJzdC0+cHJldiA9IHBUbXA7CgkJCQlwVG1wLT5wcmV2ID0gcFByZXY7CgkJCQlwVG1wLT5uZXh0ID0gZnQuZmlyc3Q7CgoJCQkJaWYgKHBQcmV2ICE9IE5VTEwpIHsKCQkJCQlwUHJldi0+bmV4dCA9IHBUbXA7CgoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJX3BXb3JrQ2hhaW5IZWFkID0gcFRtcDsgLy8g5Li656m65bCG5oiQ5Li66aaW5oyH6ZKICgkJCQl9CgoJCQl9CgkJCWVsc2UgaWYgKGZ0LnNlY29uZCA+IDApIHsgICAgIC8vIOWkp+S6ju+8jOaUvuWcqOWQjumdogoJCQkJZnQuZmlyc3QtPm5leHQgPSBwVG1wOwoJCQkJcFRtcC0+cHJldiA9IGZ0LmZpcnN0OwoJCQkJcFRtcC0+bmV4dCA9IHBOZXh0OwoKCQkJCWlmIChwTmV4dCAhPSBOVUxMKSB7CgkJCQkJcE5leHQtPnByZXYgPSBwVG1wOwoKCQkJCX0KCQkJCWVsc2UgewoJCQkJCV9wV29ya0NoYWluVGFpbCA9IHBUbXA7IC8vIOS4uuepuuaYr+acgOWQjuS4gOS4quS9jee9rgoJCQkJfQoJCQl9CgoJCQlyZXR1cm4gSW5zZXJ0X3R5cGUoJihwVG1wLT5vYmopLCB0cnVlKTsKCQl9CgoJCS8vIOmdnuaOkuW6j+WJjeaPkuWFpe+8jOS5n+S4jeWIpOWUr+S4gOaApwoJCS8vbGludCAtZWNhbGwoNTM0LHV0aWw6OlNvcnRDaGFpbjwqPjo6cHVzaF9mcm9udCkgCgkJTm9kZU9iamVjdDxUPiogcHVzaF9mcm9udChjb25zdCBUJiBvYmopIHsKCQkJTm9kZU9iamVjdDxUPiogcFRtcCA9IGFsbG9jKCk7CgkJCXBUbXAtPm9iaiA9IG9iajsKCgkJCSsrX3dvcmtOdW07CgoJCQlpZiAoTlVMTCA9PSBfcFdvcmtDaGFpbkhlYWQpIHsgLy8g56ys5LiA5qyhCgkJCQlfcFdvcmtDaGFpbkhlYWQgPSBwVG1wOwoJCQkJX3BXb3JrQ2hhaW5UYWlsID0gcFRtcDsKCQkJCXJldHVybiBwVG1wOwoJCQl9CgoJCQlwVG1wLT5uZXh0ID0gX3BXb3JrQ2hhaW5IZWFkOwoJCQlfcFdvcmtDaGFpbkhlYWQtPnByZXYgPSBwVG1wOwoJCQlfcFdvcmtDaGFpbkhlYWQgPSBwVG1wOwoKCQkJcmV0dXJuIF9wV29ya0NoYWluSGVhZDsKCQl9CgoJCS8vIOmdnuaOkuW6j+WQjuaPkuWFpe+8jOS5n+S4jeWIpOWUr+S4gOaApwoJCS8vbGludCAtZWNhbGwoNTM0LHV0aWw6OlNvcnRDaGFpbjwqPjo6cHVzaF9iYWNrKSAKCQlOb2RlT2JqZWN0PFQ+KiBwdXNoX2JhY2soY29uc3QgVCYgb2JqKSB7CgkJCU5vZGVPYmplY3Q8VD4qIHBUbXAgPSBhbGxvYygpOwoJCQlwVG1wLT5vYmogPSBvYmo7CgoJCQkrK193b3JrTnVtOwoKCQkJaWYgKE5VTEwgPT0gX3BXb3JrQ2hhaW5UYWlsKSB7IC8vIOesrOS4gOasoQoJCQkJX3BXb3JrQ2hhaW5IZWFkID0gcFRtcDsKCQkJCV9wV29ya0NoYWluVGFpbCA9IHBUbXA7CgkJCQlyZXR1cm4gcFRtcDsKCQkJfQoKCQkJX3BXb3JrQ2hhaW5UYWlsLT5uZXh0ID0gcFRtcDsKCQkJcFRtcC0+cHJldiA9IF9wV29ya0NoYWluVGFpbDsKCQkJX3BXb3JrQ2hhaW5UYWlsID0gcFRtcDsKCgkJCXJldHVybiBfcFdvcmtDaGFpblRhaWw7CgkJfQoKCQkvLyDku47liY3pnaLlvLnlh7oKCQlib29sIHBvcF9mcm9udChUJiBwT2JqKSB7CgkJCWlmIChOVUxMID09IF9wV29ya0NoYWluSGVhZCkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQkvLyDotYvlgLwKCQkJcE9iaiA9IF9wV29ya0NoYWluSGVhZC0+b2JqOwoKCQkJLy8g5Yig6IqC54K5CgkJCU5vZGVPYmplY3Q8VD4qIHBUbXAgPSBfcFdvcmtDaGFpbkhlYWQ7CgkJCV9wV29ya0NoYWluSGVhZCA9IHBUbXAtPm5leHQ7CgoJCQlpZiAoX3BXb3JrQ2hhaW5IZWFkICE9IE5VTEwpIHsKCQkJCV9wV29ya0NoYWluSGVhZC0+cHJldiA9IE5VTEw7CgoJCQl9CgkJCWVsc2UgewoJCQkJX3BXb3JrQ2hhaW5UYWlsID0gTlVMTDsgLy8g5Li656m65pe277yM6ZO+5bC+5Lmf5Li656m6CgkJCX0KCgkJCXJlY3UocFRtcCk7CgkJCS0tX3dvcmtOdW07CgoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCS8vIOS7juWQjumdouW8ueWHugoJCWJvb2wgcG9wX2JhY2soVCYgcE9iaikgewoJCQlpZiAoTlVMTCA9PSBfcFdvcmtDaGFpblRhaWwpIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJLy8g6LWL5YC8CgkJCU5vZGVPYmplY3Q8VD4qIHBUbXAgPSBfcFdvcmtDaGFpblRhaWw7CgkJCXBPYmogPSBwVG1wLT5vYmo7CgoJCQkvLyDliKDoioLngrkKCQkJX3BXb3JrQ2hhaW5UYWlsID0gcFRtcC0+cHJldjsKCgkJCWlmIChfcFdvcmtDaGFpblRhaWwgIT0gTlVMTCkgewoJCQkJX3BXb3JrQ2hhaW5UYWlsLT5uZXh0ID0gTlVMTDsKCgkJCX0KCQkJZWxzZSB7CgkJCQlfcFdvcmtDaGFpbkhlYWQgPSBOVUxMOyAgLy8g5Li656m65pe277yM6ZO+6aaW5Lmf5Li656m6CgkJCX0KCgkJCXJlY3UocFRtcCk7CgkJCS0tX3dvcmtOdW07CgoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCS8qKgoJCSog5Yig6ZmkCgkJKgoJCSog6L+U5Zue5YC877yaMe+8jOaJvuWIsOS4lOWIoOmZpO+8mzDvvIzmsqHmnInmib7liLAKCQkqIEB3YXJubmluZywg6YCa6L+HaW5zZXJ05pa55byP55qE5omN6IO96LCD6L+Z5Liq5Ye95pWwCgkJKi8KCQkvL2xpbnQgLWVjYWxsKDUzNCx1dGlsOjpTb3J0Q2hhaW48Kj46OnJlbW92ZSkgCgkJaW50IHJlbW92ZShjb25zdCBUJiBvYmopIHsKCQkJLy8g5p+l5om+CgkJCUZpbmRfdHlwZSBmdCA9IGZpbmRPYmoob2JqKTsKCgkJCS8vIOayoeacieaJvuWIsAoJCQlpZiAoTlVMTCA9PSBmdC5maXJzdCB8fCBmdC5zZWNvbmQgIT0gMCkgewoJCQkJcmV0dXJuIDA7CgkJCX0KCgkJCS8vIOWIoOiKgueCuQoJCQlyZW1vdmUoZnQuZmlyc3QpOwoKCQkJcmV0dXJuIDE7CgkJfQoJCXZvaWQgcmVtb3ZlKE5vZGVPYmplY3Q8VD4qIHBUKSB7CgkJCWlmIChOVUxMID09IHBUKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCS8vIOaLhumTvgoJCQlOb2RlT2JqZWN0PFQ+KiBwUHJldiA9IHBULT5wcmV2OwoJCQlOb2RlT2JqZWN0PFQ+KiBwTmV4dCA9IHBULT5uZXh0OwoKCQkJaWYgKHBQcmV2ICE9IE5VTEwpIHsKCQkJCXBQcmV2LT5uZXh0ID0gcE5leHQ7CgoJCQl9CgkJCWVsc2UgeyAvLyDliKDpmaTnmoTmmK/nrKzkuIDkuKroioLngrnvvIzph43nva7pk77pppbmjIfpkogKCQkJCV9wV29ya0NoYWluSGVhZCA9IHBOZXh0OwoKCQkJCWlmIChOVUxMICE9IF9wV29ya0NoYWluSGVhZCkgewoJCQkJCV9wV29ya0NoYWluSGVhZC0+cHJldiA9IE5VTEw7CgkJCQl9CgkJCX0KCgkJCWlmIChwTmV4dCAhPSBOVUxMKSB7CgkJCQlwTmV4dC0+cHJldiA9IHBQcmV2OwoKCQkJfQoJCQllbHNlIHsgLy8g5Yig6Zmk55qE5piv5pyA5ZCO5LiA5Liq6IqC54K577yM5bC+6ZO+5oyH5ZCR5YmN5LiA5LiqCgkJCQlfcFdvcmtDaGFpblRhaWwgPSBwUHJldjsKCgkJCQlpZiAoTlVMTCAhPSBfcFdvcmtDaGFpblRhaWwpIHsKCQkJCQlfcFdvcmtDaGFpblRhaWwtPm5leHQgPSBOVUxMOwoJCQkJfQoJCQl9CgoJCQkvLyDlm57mlLYKCQkJcmVjdShwVCk7CgkJCS0tX3dvcmtOdW07CgkJfQoKCQkvLyDnrKzkuIDkuKrmjIfpkojpk77lr7nosaEKCQlOb2RlT2JqZWN0PFQ+KiBmaXJzdCgpIHsKCQkJcmV0dXJuIF9wV29ya0NoYWluSGVhZDsKCQl9CgkJLy8g5pyA5ZCO5LiA5Liq5oyH6ZKI6ZO+5a+56LGhCgkJTm9kZU9iamVjdDxUPiogbGFzdCgpIHsKCQkJcmV0dXJuIF9wV29ya0NoYWluVGFpbDsKCQl9CgkJLy8g5q2j5ZCR5aSN5L2N6YGN5Y6GCgkJdm9pZCByZXdpbmQoKSB7CgkJCV9wTmV4dENoYWluSGVhZCA9IF9wV29ya0NoYWluSGVhZDsKCQl9CgkJLy8g6YCG5ZCR5aSN5L2N6YGN5Y6GCgkJdm9pZCByZXZlcnNlUmV3aW5kKCkgewoJCQlfcE5leHRDaGFpbkhlYWQgPSBfcFdvcmtDaGFpblRhaWw7CgkJfQoKCQkvKioKCQkqIOmBjeWOhu+8jOmFjeWQiGdldCgp5pa55rOV5L2/55SoCgkJKgoJCSogQHJldHVybiAg5pyJ5pWw5o2uIHRydWXvvIzmsqHmnInmlbDmja4gZmFsc2UKCQkqIEB3YXJuaW5nIOS5i+WJjeW/hemhu+WFiOiwg+eUqCByZXdpbmQoKeaWueazlQoJCSovCgkJYm9vbCBuZXh0KCkgewoJCQlpZiAoX3BOZXh0Q2hhaW5IZWFkICE9IE5VTEwpIHsKCQkJCV9wTmV4dEN1ck9iaiA9IF9wTmV4dENoYWluSGVhZDsKCQkJCV9wTmV4dENoYWluSGVhZCA9IF9wTmV4dENoYWluSGVhZC0+bmV4dDsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgoJCQlfcE5leHRDdXJPYmogPSBOVUxMOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCS8vIOmAhuWQkeafpeaJvgoJCWJvb2wgcmV2ZXJzZU5leHQoKSB7CgkJCWlmIChfcE5leHRDaGFpbkhlYWQgIT0gTlVMTCkgewoJCQkJX3BOZXh0Q3VyT2JqID0gX3BOZXh0Q2hhaW5IZWFkOwoJCQkJX3BOZXh0Q2hhaW5IZWFkID0gX3BOZXh0Q2hhaW5IZWFkLT5wcmV2OwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCgkJCV9wTmV4dEN1ck9iaiA9IE5VTEw7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIOWPluW+l25leHQoKeWQjuWvueW6lOeahFTmlbDmja4KCQljb25zdCBUJiBnZXQoKSBjb25zdCB7CgkJCWFzc2VydChfcE5leHRDdXJPYmopOwoJCQlyZXR1cm4gX3BOZXh0Q3VyT2JqLT5vYmo7CgkJfQoKCQkvLyDmiorlt6XkvZzpk77kuIrnmoTmiYDmnInoioLngrnvvIzmlL7lhaXlm57mlLbpmJ/liJcKCQl2b2lkIGNsZWFyKCkgewoJCQlfd29ya051bSA9IDA7CgoJCQlpZiAoTlVMTCA9PSBfcFdvcmtDaGFpbkhlYWQpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJTm9kZU9iamVjdDxUPiogcFRhaWwgPSBfcFdvcmtDaGFpblRhaWw7CgoJCQlpZiAoX3BSZWN1Q2hhaW5UYWlsICE9IE5VTEwpIHsKCQkJCV9wUmVjdUNoYWluVGFpbC0+bmV4dCA9IF9wV29ya0NoYWluSGVhZDsKCQkJCV9wV29ya0NoYWluSGVhZC0+cHJldiA9IF9wUmVjdUNoYWluVGFpbDsKCQkJfQoKCQkJX3BXb3JrQ2hhaW5IZWFkID0gTlVMTDsgLy8g6ZO+6aaW6LWL56m6CgkJCV9wV29ya0NoYWluVGFpbCA9IE5VTEw7IC8vIOmTvuWwvui1i+epugoJCQlfcFJlY3VDaGFpblRhaWwgPSBwVGFpbDsKCQl9CgoJCS8vIOi+k+WHuuWGheWuue+8jOmcgOimgVTmlK/mjIEgPDwg5pON5L2c6LWLCgkJdm9pZCBzaG93KGludCBtYXhOdW0gPSAxMDI0KSB7CgkJCWludCBjdXJQb3MgPSAwOwoJCQlOb2RlT2JqZWN0PFQ+KiBwVG1wID0gX3BXb3JrQ2hhaW5IZWFkOwoKCQkJd2hpbGUgKHBUbXAgIT0gTlVMTCAmJiBjdXJQb3MgPCBtYXhOdW0pIHsKCQkJCXN0ZDo6Y291dCA8PCBjdXJQb3MrKyA8PCAiIDogIiA8PCBwVG1wLT5vYmogPDwgc3RkOjplbmRsOwoJCQkJcFRtcCA9IHBUbXAtPm5leHQ7CgkJCX0KCQl9CgoJCVQqIG9wZXJhdG9yW10oc2l6ZV90IGkpIHsKCQkJaWYgKGkgPj0gX3dvcmtOdW0pIHsKCQkJCXJldHVybiBOVUxMOwoJCQl9CgoJCQlOb2RlT2JqZWN0PFQ+KiBwVG1wID0gX3BXb3JrQ2hhaW5IZWFkOwoJCQlhc3NlcnQocFRtcCk7CgoJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgewoJCQkJcFRtcCA9IHBUbXAtPm5leHQ7CgkJCX0KCgkJCXJldHVybiAmKHBUbXAtPm9iaik7CgkJfQoKCQlOb2RlT2JqZWN0PFQ+KiBhdChzaXplX3QgaSkgewoJCQlpZiAoaSA+PSBfd29ya051bSkgewoJCQkJcmV0dXJuIE5VTEw7CgkJCX0KCgkJCU5vZGVPYmplY3Q8VD4qIHBUbXAgPSBfcFdvcmtDaGFpbkhlYWQ7CgoJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgewoJCQkJcFRtcCA9IHBUbXAtPm5leHQ7IC8vbGludCAhZTYxMyzmraTlpITkuI3kvJrotoXlh7rpk77ooajvvIzmiYDku6XkuI3pnIDopoHnqbrmjIfpkojliKTmlq0KCQkJfQoKCQkJcmV0dXJuIHBUbXA7CgkJfQoKCQlib29sIGVtcHR5KCkgewoJCQlyZXR1cm4gTlVMTCA9PSBfcFdvcmtDaGFpbkhlYWQ7CgkJfQoKCQlpbnQgZ2V0U2l6ZSgpIGNvbnN0IHsKCQkJcmV0dXJuIF93b3JrTnVtOwoJCX0KCgkJdm9pZCByZXNldEhlYWQoTm9kZU9iamVjdDxUPiogcEhlYWQpIHsKCQkJX3BXb3JrQ2hhaW5IZWFkID0gcEhlYWQ7CgkJfQoKCQl2b2lkIHJlc2V0VGFpbChOb2RlT2JqZWN0PFQ+KiBwVGFpbCkgewoJCQlfcFdvcmtDaGFpblRhaWwgPSBwVGFpbDsKCQl9CgoJCS8vCglwcml2YXRlOgoJCS8vIOWIhumFjeS4gOS4quaMh+mSiAoJCU5vZGVPYmplY3Q8VD4qIGFsbG9jKCkgewoJCQkvLyDmo4Dmn6Xlm57mlLbpk77mmK/lkKbmnIkKCQkJTm9kZU9iamVjdDxUPiogcFRtcCA9IF9wUmVjdUNoYWluVGFpbDsKCgkJCWlmIChwVG1wICE9IE5VTEwpIHsKCQkJCV9wUmVjdUNoYWluVGFpbCA9IHBUbXAtPnByZXY7CgoJCQkJaWYgKF9wUmVjdUNoYWluVGFpbCAhPSBOVUxMKSB7CgkJCQkJX3BSZWN1Q2hhaW5UYWlsLT5uZXh0ID0gTlVMTDsKCQkJCX0KCgkJCQlwVG1wLT5wcmV2ID0gTlVMTDsKCQkJCXBUbXAtPm5leHQgPSBOVUxMOwoJCQkJcmV0dXJuIHBUbXA7CgkJCX0KCgkJCS8vIG5ldyDkuIDkuKoKCQkJaW50IGFsbG9jTnVtID0gMzsKCgkJCWRvIHsKCQkJCXRyeSB7CgkJCQkJcFRtcCA9IG5ldyBOb2RlT2JqZWN0PFQ+KCk7CgoJCQkJfQoJCQkJY2F0Y2ggKHN0ZDo6YmFkX2FsbG9jJiBlKSB7CgkJCQkJaWYgKGFsbG9jTnVtLS0gPCAwKSB7CgkJCQkJCXRocm93OwoJCQkJCX0KCQkJCX0KCQkJfSB3aGlsZSAoTlVMTCA9PSBwVG1wKTsKCgkJCXJldHVybiBwVG1wOwoJCX0KCgkJLy8g5Zue5pS25LiA5LiqCgkJdm9pZCByZWN1KE5vZGVPYmplY3Q8VD4qIHBUcikgewoJCQlpZiAoTlVMTCA9PSBwVHIpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJcFRyLT5wcmV2ID0gTlVMTDsKCQkJcFRyLT5uZXh0ID0gTlVMTDsKCgkJCWlmIChOVUxMID09IF9wUmVjdUNoYWluVGFpbCkgewoJCQkJX3BSZWN1Q2hhaW5UYWlsID0gcFRyOwoKCQkJfQoJCQllbHNlIHsKCQkJCV9wUmVjdUNoYWluVGFpbC0+bmV4dCA9IHBUcjsKCQkJCXBUci0+cHJldiA9IF9wUmVjdUNoYWluVGFpbDsKCQkJCV9wUmVjdUNoYWluVGFpbCA9IHBUcjsKCQkJfQoJCX0KCglwdWJsaWM6CgkJLy8g5Yig6Zmk5YaF5a2YCgkJdm9pZCBkZWxBbGwoKSB7CgkJCWNsZWFyKCk7CgoJCQlOb2RlT2JqZWN0PFQ+KiBwVG1wID0gTlVMTDsKCgkJCXdoaWxlIChfcFJlY3VDaGFpblRhaWwgIT0gTlVMTCkgewoJCQkJcFRtcCA9IF9wUmVjdUNoYWluVGFpbDsKCQkJCV9wUmVjdUNoYWluVGFpbCA9IHBUbXAtPnByZXY7CgkJCQlkZWxldGUgcFRtcDsKCQkJfQoJCX0KCglwcml2YXRlOgoJCU5vZGVPYmplY3Q8VD4qIF9wV29ya0NoYWluSGVhZDsgLy8g5bel5L2c6ZO+5aS0CgkJTm9kZU9iamVjdDxUPiogX3BXb3JrQ2hhaW5UYWlsOyAvLyDlt6XkvZzpk77lsL4KCQlOb2RlT2JqZWN0PFQ+KiBfcFJlY3VDaGFpblRhaWw7IC8vIOWbnuaUtumTvuWwvgoJCU5vZGVPYmplY3Q8VD4qIF9wTmV4dENoYWluSGVhZDsgLy8KCQlOb2RlT2JqZWN0PFQ+KiBfcE5leHRDdXJPYmo7CgkJaW50ICAgICAgICAgICAgX3dvcmtOdW07ICAgICAgICAvLyDlt6XkvZzpk77nmoToioLngrnkuKrmlbAKCX07CgoJLy8g5oyJ54Wn5oyH5a6a55qE5Ye95pWw5a+56ZO+6L+b6KGM5o6S5bqPCgl0eXBlZGVmIGJvb2woKlNvcnRDaGFpbkZ1bmMpKHZvaWQqIGwsIHZvaWQqIHIpOwoKCS8qKgoJKiDln7rkuo7mlbDmja7lhoXlrrnkuqTmjaLmjpLluo8sIOWmguaenOaVsOaNruWGheWuuee7k+aehOWwj+S4lOeugOWNle+8jOeUqOi/meS4qgoJKgoJKiBAcGFyYW0gcywg6ZO+6KGo5a+56LGhCgkqIEBwYXJhbSBmLCDmjpLluo/mlrnms5UKCSovCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCWlubGluZSB2b2lkIHNvcnRTd2l0Y2hEYXRhKFNvcnRDaGFpbjxUPiYgcywgU29ydENoYWluRnVuYyBmKSB7CgkJLy8g5om+5Yiw6ZO+5aS0CgkJTm9kZU9iamVjdDxUPiogZmlyc3RQdHIgPSBzLmZpcnN0KCk7CgkJTm9kZU9iamVjdDxUPiogY3VyUHRyOwoJCVQgICAgICAgICAgICAgIHRtcE9iajsKCgkJLy8g5b6q546v5q+U6L6DCgkJZm9yICg7IGZpcnN0UHRyOyBmaXJzdFB0ciA9IGZpcnN0UHRyLT5uZXh0KSB7CgkJCWN1clB0ciA9IGZpcnN0UHRyLT5uZXh0OwoKCQkJd2hpbGUgKGN1clB0cikgewoJCQkJaWYgKGYoJihjdXJQdHItPm9iaiksICYoZmlyc3RQdHItPm9iaikpKSB7IC8vIOadoeS7tua7oei2s+S6pOaNouWAvAoJCQkJCXRtcE9iaiA9IGN1clB0ci0+b2JqOwoJCQkJCWN1clB0ci0+b2JqID0gZmlyc3RQdHItPm9iajsKCQkJCQlmaXJzdFB0ci0+b2JqID0gdG1wT2JqOwoJCQkJfQoKCQkJCWN1clB0ciA9IGN1clB0ci0+bmV4dDsKCQkJfQoJCX0KCX0KCgkvKioKCSog5Z+65LqO5pWw5o2u5a+55bqU55qE5L2N572u5Lqk5o2iLCDlpoLmnpzmlbDmja7lhoXlrrnnu5PmnoTlpKfkuJTlpI3mnYLvvIznlKjov5nkuKoKCSog5bm25LiU5Y+q5piv5a+55pW05Liq6ZO+6KGo5Lit55qE5p+Q5LiA5q616L+b6KGM5o6S5bqPCgkqCgkqIEBwYXJhbSBzLCDpk77ooajlr7nosaEKCSogQHBhcmFtIGZpcnN0UHRy77yM5Y+C5LiO5o6S5bqP55qE6ZO+5aS0CgkqIEBwYXJhbSBsYXN0UHRyLCAg5Y+C5LiO5o6S5bqP55qE6ZO+5bC+CgkqIEBwYXJhbSBmLCDmjpLluo/mlrnms5UKCSovCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCWlubGluZSB2b2lkIHNvcnRTZWdTd2l0Y2hQb3MoU29ydENoYWluPFQ+JiBzLCBOb2RlT2JqZWN0PFQ+KiBmaXJzdFB0ciwgTm9kZU9iamVjdDxUPiogbGFzdFB0ciwgU29ydENoYWluRnVuYyBmKSB7CgkJYnViYmxlU29ydChzLCBmaXJzdFB0ciwgbGFzdFB0ciwgZik7Cgl9CgoJLy8g5YaS5rOh5o6S5bqPCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCWlubGluZSB2b2lkIGJ1YmJsZVNvcnQoU29ydENoYWluPFQ+JiBzLCBOb2RlT2JqZWN0PFQ+KiBmaXJzdFB0ciwgTm9kZU9iamVjdDxUPiogbGFzdFB0ciwgU29ydENoYWluRnVuYyBmKSB7CgkJTm9kZU9iamVjdDxUPiogY3VyUHRyID0gTlVMTDsKCQlOb2RlT2JqZWN0PFQ+KiBmaXJzdFByZXYgPSBOVUxMOwoJCU5vZGVPYmplY3Q8VD4qIGZpcnN0TmV4dCA9IE5VTEw7CgkJTm9kZU9iamVjdDxUPiogY3VyUHJldiA9IE5VTEw7CgkJTm9kZU9iamVjdDxUPiogY3VyTmV4dCA9IE5VTEw7CgkJTm9kZU9iamVjdDxUPiogdG1wUHRyID0gTlVMTDsKCQlOb2RlT2JqZWN0PFQ+KiBzcGxpdFB0ciA9IGxhc3RQdHIgPyBsYXN0UHRyLT5uZXh0IDogTlVMTDsKCgkJLy8g5b6q546v5q+U6L6DCgkJZm9yICg7IGZpcnN0UHRyICYmIGZpcnN0UHRyICE9IHNwbGl0UHRyOyBmaXJzdFB0ciA9IGZpcnN0UHRyLT5uZXh0KSB7CgkJCWN1clB0ciA9IGZpcnN0UHRyLT5uZXh0OwoKCQkJaWYgKGN1clB0ciA9PSBzcGxpdFB0cikgewoJCQkJYnJlYWs7CgkJCX0KCgkJCXdoaWxlIChjdXJQdHIpIHsKCQkJCWlmIChmKCYoY3VyUHRyLT5vYmopLCAmKGZpcnN0UHRyLT5vYmopKSkgeyAvLyDmnaHku7bmu6HotrPkuqTmjaLlgLwKCQkJCQlmaXJzdFByZXYgPSBmaXJzdFB0ci0+cHJldjsKCQkJCQlmaXJzdE5leHQgPSBmaXJzdFB0ci0+bmV4dDsKCQkJCQljdXJQcmV2ID0gY3VyUHRyLT5wcmV2OwoJCQkJCWN1ck5leHQgPSBjdXJQdHItPm5leHQ7CgoJCQkJCS8vIOWfuueCueeahOWJjeS4gOS4quiKgueCuQoJCQkJCWlmIChmaXJzdFByZXYpIHsKCQkJCQkJZmlyc3RQcmV2LT5uZXh0ID0gY3VyUHRyOwoJCQkJCX0KCgkJCQkJY3VyUHRyLT5wcmV2ID0gZmlyc3RQcmV2OwoKCQkJCQkvLyDln7rngrnnmoTkuIvkuIDkuKroioLngrkKCQkJCQlpZiAoZmlyc3ROZXh0ICE9IGN1clB0cikgewoJCQkJCQlmaXJzdE5leHQtPnByZXYgPSBjdXJQdHI7CgkJCQkJfQoKCQkJCQljdXJQdHItPm5leHQgPSAoZmlyc3ROZXh0ICE9IGN1clB0cikgPyBmaXJzdE5leHQgOiBmaXJzdFB0cjsKCgkJCQkJLy8g5q+U6L6D54K555qE5YmN5LiA5Liq6IqC54K5CgkJCQkJaWYgKGN1clByZXYgIT0gZmlyc3RQdHIpIHsKCQkJCQkJY3VyUHJldi0+bmV4dCA9IGZpcnN0UHRyOwoJCQkJCX0KCgkJCQkJZmlyc3RQdHItPnByZXYgPSAoY3VyUHJldiAhPSBmaXJzdFB0cikgPyBjdXJQcmV2IDogY3VyUHRyOwoKCQkJCQkvLyDmr5TovoPngrnnmoTlkI7kuIDkuKroioLngrkKCQkJCQlpZiAoY3VyTmV4dCkgewoJCQkJCQljdXJOZXh0LT5wcmV2ID0gZmlyc3RQdHI7CgkJCQkJfQoKCQkJCQlmaXJzdFB0ci0+bmV4dCA9IGN1ck5leHQ7CgoJCQkJCS8vIOmTvuWktOmcgOimgeWPmOabtAoJCQkJCWlmIChOVUxMID09IGZpcnN0UHJldikgewoJCQkJCQlzLnJlc2V0SGVhZChjdXJQdHIpOwoJCQkJCX0KCgkJCQkJLy8g6ZO+5bC+6ZyA6KaB5Y+Y5pu0CgkJCQkJaWYgKE5VTEwgPT0gY3VyTmV4dCkgewoJCQkJCQlzLnJlc2V0VGFpbChmaXJzdFB0cik7CgkJCQkJfQoKCQkJCQkvLyDosIPmlbTpk77mr5TovoPkvY3nva4KCQkJCQl0bXBQdHIgPSBmaXJzdFB0cjsKCQkJCQlmaXJzdFB0ciA9IGN1clB0cjsKCQkJCQljdXJQdHIgPSB0bXBQdHI7CgkJCQl9CgoJCQkJLy8KCQkJCWN1clB0ciA9IGN1clB0ci0+bmV4dDsKCgkJCQlpZiAoY3VyUHRyID09IHNwbGl0UHRyKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8g5b+r6YCf5o6S5bqPCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCWlubGluZSB2b2lkIHF1aWNrU29ydChTb3J0Q2hhaW48VD4mIHMsIE5vZGVPYmplY3Q8VD4qIGZpcnN0UHRyLCBOb2RlT2JqZWN0PFQ+KiBsYXN0UHRyLCBTb3J0Q2hhaW5GdW5jIGYpIHsKCQkvLyDmjIfpkojkuLrnqbrkuobvvIzmiJbogIXmmK/lkIzkuIDkuKrmjIfpkojvvIzliJnkuI3pnIDopoHmjpLluo8KCQlpZiAoTlVMTCA9PSBmaXJzdFB0ciB8fCBOVUxMID09IGxhc3RQdHIgfHwgZmlyc3RQdHIgPT0gbGFzdFB0cikgewoJCQlyZXR1cm47CgkJfQoKCQkvLyDkv53lrZjlj5jph48KCQlOb2RlT2JqZWN0PFQ+KiBwTGVmdEVuZCA9IGZpcnN0UHRyLT5wcmV2OyAvLyDlvZPliY3mjpLluo/mrrXnmoTliY3kuIDkuKrmjIfpkogKCQlOb2RlT2JqZWN0PFQ+KiBwUmlnaHRGaXJzdCA9IGxhc3RQdHItPm5leHQ7ICAvLyDlvZPliY3mjpLluo/mrrXnmoTlkI7kuIDkuKrmjIfpkogKCgkJCQkJCQkJCQkJCQkgLy8g5o6S5bqP5ZCO55qEM+S4quWFs+mUruiKgueCuQoJCU5vZGVPYmplY3Q8VD4qIHBMZWZ0SGVhZCA9IE5VTEw7IC8vIOaOkuW6j+WQjuW3puS+p+eahOWktAoJCU5vZGVPYmplY3Q8VD4qIHBSaWdodFRhaWwgPSBOVUxMOyAvLyDmjpLluo/lkI7lj7PkvqfnmoTlsL4KCQlOb2RlT2JqZWN0PFQ+KiBwQmFzZU1pZCA9IE5VTEw7IC8vIOWfuuehgOaMh+mSiO+8jOW3puS+p+eahOavlOS7luWwj++8jOWPs+S+p+eahOavlOS7luWkpwoKCQkJCQkJCQkJCS8vIDEuIOaOkuW6jwoJCU5vZGVPYmplY3Q8VD4qIHBDdXJDbXBQdHIgPSBmaXJzdFB0ci0+bmV4dDsgLy8g5LuO6ZO+6KGo5Lit6I635Y+W5q+U6L6D55qE5oyH6ZKI77yM5LuO5LiL5LiA5Liq5byA5aeLCgkJTm9kZU9iamVjdDxUPiogcFJlZlB0ciA9IE5VTEw7ICAgICAgICAgICAvLyDlj4LogIPmjIfpkojvvIzlsLHmmK/ln7rnoYDmjIfpkojnmoTlt6bovrnnrKzkuIDkuKrvvIzmiJbogIXlj7PovrnnrKzkuIDkuKoKCQlOb2RlT2JqZWN0PFQ+KiBwTmV4dFB0ciA9IE5VTEw7CgoJCS8vIDIuIOmBjeWOhuavlOi+gwoJCXBCYXNlTWlkID0gZmlyc3RQdHI7CgkJcEJhc2VNaWQtPnByZXYgPSBOVUxMOwoJCXBCYXNlTWlkLT5uZXh0ID0gTlVMTDsKCgkJd2hpbGUgKHBDdXJDbXBQdHIpIHsKCQkJLy8g5L+d5a2Y5LiL5LiA5Liq5oyH6ZKICgkJCXBOZXh0UHRyID0gcEN1ckNtcFB0ci0+bmV4dDsKCgkJCS8vIOWwj+S6juaUvuW3puS+pwoJCQlpZiAoZigmKHBDdXJDbXBQdHItPm9iaiksICYocEJhc2VNaWQtPm9iaikpKSB7CgkJCQlpZiAoTlVMTCA9PSBwTGVmdEhlYWQpIHsKCQkJCQlwTGVmdEhlYWQgPSBwQ3VyQ21wUHRyOwoJCQkJfQoKCQkJCS8vIOaMgumTvgoJCQkJcFJlZlB0ciA9IHBCYXNlTWlkLT5wcmV2OwoKCQkJCWlmIChOVUxMICE9IHBSZWZQdHIpIHsKCQkJCQlwUmVmUHRyLT5uZXh0ID0gcEN1ckNtcFB0cjsKCQkJCX0KCgkJCQlwQ3VyQ21wUHRyLT5wcmV2ID0gcFJlZlB0cjsKCQkJCXBDdXJDbXBQdHItPm5leHQgPSBwQmFzZU1pZDsKCQkJCXBCYXNlTWlkLT5wcmV2ID0gcEN1ckNtcFB0cjsKCgkJCX0KCQkJZWxzZSB7IC8v5aSn5LqO5pS+5Y+z5L6nCgkJCQlpZiAoTlVMTCA9PSBwUmlnaHRUYWlsKSB7CgkJCQkJcFJpZ2h0VGFpbCA9IHBDdXJDbXBQdHI7CgkJCQl9CgoJCQkJLy8g5oyC6ZO+CgkJCQlwUmVmUHRyID0gcEJhc2VNaWQtPm5leHQ7CgoJCQkJaWYgKE5VTEwgIT0gcFJlZlB0cikgewoJCQkJCXBSZWZQdHItPnByZXYgPSBwQ3VyQ21wUHRyOwoJCQkJfQoKCQkJCXBDdXJDbXBQdHItPnByZXYgPSBwQmFzZU1pZDsKCQkJCXBDdXJDbXBQdHItPm5leHQgPSBwUmVmUHRyOwoJCQkJcEJhc2VNaWQtPm5leHQgPSBwQ3VyQ21wUHRyOwoJCQl9CgoJCQkvLyDlt7Lnu4/mmK/mnIDlkI7kuIDkuKrmjIfpkogKCQkJaWYgKHBDdXJDbXBQdHIgPT0gbGFzdFB0cikgewoJCQkJYnJlYWs7CgkJCX0KCgkJCS8vIOavlOi+g+S4i+S4gOS4qgoJCQlwQ3VyQ21wUHRyID0gcE5leHRQdHI7CgkJfQoKCQkvLyAzLiDliKTmlq3ln7rnoYDpk77lt6blj7PkvqfmmK/lkKbmnInpk74KCQlib29sIGJOb0xlZnRPdXQgPSBmYWxzZTsgLy8g5peg5bem5L6n6ZO+CgkJYm9vbCBiTm9SaWdodE91dCA9IGZhbHNlOyAvLyDml6Dlj7Pkvqfpk74KCgkJaWYgKE5VTEwgPT0gcExlZnRIZWFkKSB7CgkJCWJOb0xlZnRPdXQgPSB0cnVlOwoJCQlwTGVmdEhlYWQgPSBwQmFzZU1pZDsKCQl9CgoJCWlmIChOVUxMID09IHBSaWdodFRhaWwpIHsKCQkJYk5vUmlnaHRPdXQgPSB0cnVlOwoJCQlwUmlnaHRUYWlsID0gcEJhc2VNaWQ7CgkJfQoKCQkvLyA0LiDlkozlpJblm7TnmoTlpKfpk77lhbPogZTotbfmnaUKCQlwTGVmdEhlYWQtPnByZXYgPSBwTGVmdEVuZDsKCgkJaWYgKE5VTEwgIT0gcExlZnRFbmQpIHsKCQkJcExlZnRFbmQtPm5leHQgPSBwTGVmdEhlYWQ7CgkJfQoKCQlwUmlnaHRUYWlsLT5uZXh0ID0gcFJpZ2h0Rmlyc3Q7CgoJCWlmIChOVUxMICE9IHBSaWdodEZpcnN0KSB7CgkJCXBSaWdodEZpcnN0LT5wcmV2ID0gcFJpZ2h0VGFpbDsKCQl9CgoJCS8vIDUuIOmHjeaWsOWumuS9jemTvummluWSjOmTvuWwvgoJCWlmIChOVUxMID09IHBMZWZ0SGVhZC0+cHJldikgewoJCQlzLnJlc2V0SGVhZChwTGVmdEhlYWQpOwoJCX0KCgkJaWYgKE5VTEwgPT0gcFJpZ2h0VGFpbC0+bmV4dCkgewoJCQlzLnJlc2V0VGFpbChwUmlnaHRUYWlsKTsKCQl9CgoJCS8vIDYuIOmAkuW9kuaOkuW6jwoJCWlmICghYk5vTGVmdE91dCAmJiBwTGVmdEhlYWQgIT0gcEJhc2VNaWQtPnByZXYpIHsKCQkJcXVpY2tTb3J0KHMsIHBMZWZ0SGVhZCwgcEJhc2VNaWQtPnByZXYsIGYpOwoJCX0KCgkJaWYgKCFiTm9SaWdodE91dCAmJiBwQmFzZU1pZC0+bmV4dCAhPSBwUmlnaHRUYWlsKSB7CgkJCXF1aWNrU29ydChzLCBwQmFzZU1pZC0+bmV4dCwgcFJpZ2h0VGFpbCwgZik7CgkJfQoJfQoKCS8qKgoJKiBTb3J0Q2hhaW7pgJrov4dWZWN0b3LmnaXmjpLluo/vvIzkvYbmmK/pnIDopoHms6jmhI/ku6XkuIvpl67popjvvJoKCSogMS4gVCDmnKzouqvkuI3og73ljIXlkKtTb3J0Q2hhaW4KCSogMi4g5aaC5p6cIDEg5oiQ56uL77yM6K+35a+5VOWunueOsCBvcGVyYXRvciA9IOaWueazle+8jOS7pemYsuatouWGheWtmCBjb3JlZHVtcAoJKi8KCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCWlubGluZSB2b2lkIHNvcnRCeVZlY3RvcihTb3J0Q2hhaW48VD4mIHMsIGJvb2woKmYpKGNvbnN0IFQmIGwsIGNvbnN0IFQmIHIpKSB7CgkJc3RkOjp2ZWN0b3I8VD4gdnM7CgoJCWlmIChzLmdldFNpemUoKSA8PSAxKSB7CgkJCXJldHVybjsKCQl9CgoJCXZzLnJlc2VydmUocy5nZXRTaXplKCkpOyAgICAvLyDkuIDmrKHmgKfliIbphY3lpb3mnJ/mnJvnmoTnqbrpl7QKCgkJcy5yZXdpbmQoKTsKCgkJd2hpbGUgKHMubmV4dCgpKSB7CgkJCXZzLnB1c2hfYmFjayhzLmdldCgpKTsKCQl9CgoJCXN0ZDo6c29ydCh2cy5iZWdpbigpLCB2cy5lbmQoKSwgZik7CgoJCXMuY2xlYXIoKTsKCgkJZm9yIChpbnQgaSA9IHZzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCXMucHVzaF9mcm9udCh2c1tpXSk7CgkJfQoJfQoKCS8vIOmAmui/h1ZlY3RvcuaOkuW6j++8jOS9v+eUqOaMh+mSiOaOkuW6j++8jOWHj+WwkeWvueixoeaLt+i0neaXtumXtAoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CglpbmxpbmUgdm9pZCBzb3J0UHRyQnlWZWN0b3IoU29ydENoYWluPFQ+JiBzLCBib29sKCpmKShjb25zdCBOb2RlT2JqZWN0PFQ+KiBsLCBjb25zdCBOb2RlT2JqZWN0PFQ+KiByKSA9IE5VTEwpIHsKCQlpZiAocy5nZXRTaXplKCkgPD0gMSkgewoJCQlyZXR1cm47CgkJfQoKCQlzdGQ6OnZlY3RvcjxOb2RlT2JqZWN0PFQ+KiA+IHZlYzsKCQl2ZWMucmVzZXJ2ZShzLmdldFNpemUoKSk7ICAgIC8vIOS4gOasoeaAp+WIhumFjeWlveacn+acm+eahOepuumXtAoKCQkJCQkJCQkJIC8vIOaKiuaMh+mSiOaUvuWFpVZlY3RvcgoJCU5vZGVPYmplY3Q8VD4qIGN1clB0cjsKCQljdXJQdHIgPSBzLmZpcnN0KCk7CgoJCXdoaWxlIChjdXJQdHIpIHsKCQkJdmVjLnB1c2hfYmFjayhjdXJQdHIpOwoJCQljdXJQdHIgPSBjdXJQdHItPm5leHQ7CgkJfQoKCQkvLyDmjpLluo/lh73mlbAKCQlzdHJ1Y3QgbXlPYmpTb3J0IHsKCQkJc3RhdGljIGlubGluZSBib29sIGNtcE5vZGVQcnQoY29uc3QgTm9kZU9iamVjdDxUPiogbCwgY29uc3QgTm9kZU9iamVjdDxUPiogcikgewoJCQkJcmV0dXJuIGwtPm9iaiA8IHItPm9iajsKCQkJfQoJCX07CgoJCWlmIChOVUxMICE9IGYpIHsKCQkJc3RkOjpzb3J0KHZlYy5iZWdpbigpLCB2ZWMuZW5kKCksIGYpOwoKCQl9CgkJZWxzZSB7CgkJCXN0ZDo6c29ydCh2ZWMuYmVnaW4oKSwgdmVjLmVuZCgpLCBteU9ialNvcnQ6OmNtcE5vZGVQcnQpOwoJCX0KCgkJLy8g5oqK5o6S5aW955qE5oyH6ZKI6YeN5paw57uE57uH6LW35p2lCgkJTm9kZU9iamVjdDxUPiogcEhlYWQgPSB2ZWNbMF07CgkJTm9kZU9iamVjdDxUPiogcFRhaWwgPSB2ZWNbdmVjLnNpemUoKSAtIDFdOwoKCQlwSGVhZC0+cHJldiA9IE5VTEw7CgkJcEhlYWQtPm5leHQgPSBOVUxMOwoJCXBUYWlsLT5wcmV2ID0gTlVMTDsKCQlwVGFpbC0+bmV4dCA9IE5VTEw7CgoJCS8vCgkJY3VyUHRyID0gcEhlYWQ7CgoJCWZvciAoaW50IGkgPSAxOyBpIDwgdmVjLnNpemUoKTsgKytpKSB7CgkJCWN1clB0ci0+bmV4dCA9IHZlY1tpXTsKCQkJdmVjW2ldLT5wcmV2ID0gY3VyUHRyOwoJCQljdXJQdHIgPSB2ZWNbaV07CgkJfQoKCQkvLyDph43nva7pk77lpLTlkozpk77lsL4KCQlzLnJlc2V0SGVhZChwSGVhZCk7CgkJcy5yZXNldFRhaWwocFRhaWwpOwoKCQl2ZWMuY2xlYXIoKTsKCX0KCgkvKioKCSog5Z+65LqO5pWw5o2u5a+55bqU55qE5L2N572u5Lqk5o2iLCDlpoLmnpzmlbDmja7lhoXlrrnnu5PmnoTlpKfkuJTlpI3mnYLvvIznlKjov5nkuKoKCSoKCSogQHBhcmFtIHMsIOmTvuihqOWvueixoQoJKiBAcGFyYW0gZiwg5o6S5bqP5pa55rOVCgkqLwoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CglpbmxpbmUgdm9pZCBzb3J0U3dpdGNoUG9zKFNvcnRDaGFpbjxUPiYgcywgU29ydENoYWluRnVuYyBmKSB7CgkJLy8g5om+5Yiw6ZO+5aS0CgkJTm9kZU9iamVjdDxUPiogZmlyc3RQdHIgPSBzLmZpcnN0KCk7CgkJTm9kZU9iamVjdDxUPiogbGFzdFB0ciA9IHMubGFzdCgpOwoJCXNvcnRTZWdTd2l0Y2hQb3MocywgZmlyc3RQdHIsIGxhc3RQdHIsIGYpOwoJfQoKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJaW5saW5lIHZvaWQgY2xlYXIoU29ydENoYWluPFQ+JiBzKSB7CgkJcy5yZXdpbmQoKTsKCgkJd2hpbGUgKHMubmV4dCgpKSB7CgkJCVQmIHQgPSBjb25zdF9jYXN0PFQmPihzLmdldCgpKTsKCQkJdC5yZXNldCgpOwoJCX0KCgkJcy5jbGVhcigpOwoJfQoKfSAvLyBuYW1lc2FwYWNlCiNlbmRpZgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIHV0aWw7Cgp2b2lkIGZmKCkKewoJU29ydENoYWluPGludD4gaVRlc3Q7CglpbnQgYSA9IDEyMzsKCWludCBiID0gNDU2OwoJaVRlc3QucHVzaF9iYWNrKGEpOwoJaVRlc3QucHVzaF9iYWNrKGIpOwoJcmV0dXJuOwp9Cgp2b2lkIGdnKCkKewoJU29ydENoYWluPGludD4gaVRlc3Q7CglpbnQgYSA9IDEyMzsKCWludCBiID0gNDU2OwoJaVRlc3QucHVzaF9iYWNrKGEpOwoJaVRlc3QucHVzaF9iYWNrKGIpOwoJaVRlc3QucmV3aW5kKCk7Cgl3aGlsZSAoaVRlc3QubmV4dCgpKQoJewoJCWNvdXQgPDwgaVRlc3QuZ2V0KCkgPDwgZW5kbDsKCX0KfQoKaW50ICBtYWluKCkKewoJZ2coKTsKCWdldGNoYXIoKTsKCXJldHVybiAwOwp9

猜你喜欢

转载自my.oschina.net/pirtt/blog/1806657
JJ