LyoKICogbXNpZXhlYy5leGUgaW1wbGVtZW50YXRpb24KICoKICogQ29weXJpZ2h0IDIwMDQgVmluY2VudCBC6XJvbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8bXNpLmg+CiNpbmNsdWRlIDxvYmpiYXNlLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgIm1zaWV4ZWMuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChtc2lleGVjKTsKCnN0YXRpYyBjb25zdCBjaGFyIFVzYWdlU3RyW10gPQoiVXNhZ2U6XG4iCiIgIEluc3RhbGwgYSBwcm9kdWN0OlxuIgoiICAgIG1zaWV4ZWMge3BhY2thZ2V8cHJvZHVjdGNvZGV9IFtwcm9wZXJ0eV1cbiIKIiAgICBtc2lleGVjIC9pIHtwYWNrYWdlfHByb2R1Y3Rjb2RlfSBbcHJvcGVydHldXG4iCiIgICAgbXNpZXhlYyAvYSBwYWNrYWdlIFtwcm9wZXJ0eV1cbiIKIiAgUmVwYWlyIGFuIGluc3RhbGxhdGlvbjpcbiIKIiAgICBtc2lleGVjIC9mW3B8b3xlfGR8Y3xhfHV8bXxzfHZdIHtwYWNrYWdlfHByb2R1Y3Rjb2RlfVxuIgoiICBVbmluc3RhbGwgYSBwcm9kdWN0OlxuIgoiICAgIG1zaWV4ZWMgL3gge3BhY2thZ2V8cHJvZHVjdGNvZGV9IFtwcm9wZXJ0eV1cbiIKIiAgQWR2ZXJ0aXNlIGEgcHJvZHVjdDpcbiIKIiAgICBtc2lleGVjIC9qW3V8bV0gcGFja2FnZSBbL3QgdHJhbnNmb3JtXSBbL2cgbGFuZ3VhZ2VpZF1cbiIKIiAgICBtc2lleGVjIHt1fG19IHBhY2thZ2UgWy90IHRyYW5zZm9ybV0gWy9nIGxhbmd1YWdlaWRdXG4iCiIgIEFwcGx5IGEgcGF0Y2g6XG4iCiIgICAgbXNpZXhlYyAvcCBwYXRjaHBhY2thZ2UgW3Byb3BlcnR5XVxuIgoiICAgIG1zaWV4ZWMgL3AgcGF0Y2hwYWNrYWdlIC9hIHBhY2thZ2UgW3Byb3BlcnR5XVxuIgoiICBNb2RpZmllcnMgZm9yIGFib3ZlIG9wZXJhdGlvbnM6XG4iCiIgICAgbXNpZXhlYyAvbFsqXVtpfHd8ZXxhfHJ8dXxjfG18b3xwfHZ8XVsrfCFdIGxvZ2ZpbGVcbiIKIiAgICBtc2lleGVjIC9xe3xufGJ8cnxmfG4rfGIrfGItfVxuIgoiICBSZWdpc3RlciBhIG1vZHVsZTpcbiIKIiAgICBtc2lleGVjIC95IG1vZHVsZVxuIgoiICBVbnJlZ2lzdGVyIGEgbW9kdWxlOlxuIgoiICAgIG1zaWV4ZWMgL3ogbW9kdWxlXG4iCiIgIERpc3BsYXkgdXNhZ2UgYW5kIGNvcHlyaWdodDpcbiIKIiAgICBtc2lleGVjIHsvaHwvP31cbiIKIk5PVEU6IFByb2R1Y3QgY29kZSBvbiBjb21tYW5kbGluZSB1bmltcGxlbWVudGVkIGFzIG9mIHlldFxuIgoiXG4iCiJDb3B5cmlnaHQgMjAwNCBWaW5jZW50IELpcm9uXG4iOwoKc3RhdGljIGNvbnN0IGNoYXIgQWN0aW9uQWRtaW5bXSA9ICJBQ1RJT049QURNSU4gIjsKc3RhdGljIGNvbnN0IGNoYXIgUmVtb3ZlQWxsW10gPSAiUkVNT1ZFPUFMTCAiOwoKc3RhdGljIHZvaWQgU2hvd1VzYWdlKGludCBFeGl0Q29kZSkKewoJcHJpbnRmKFVzYWdlU3RyKTsKCUV4aXRQcm9jZXNzKEV4aXRDb2RlKTsKfQoKc3RhdGljIEJPT0wgR2V0UHJvZHVjdENvZGUoTFBDU1RSIHN0ciwgTFBDU1RSICpQYWNrYWdlTmFtZSwgTFBHVUlEICpQcm9kdWN0Q29kZSkKewoJQk9PTCByZXQgPSBGQUxTRTsKCWludCBsZW4gPSAwOwoJTFBXU1RSIHdzdHIgPSBOVUxMOwoKCWlmKHN0cmxlbihzdHIpID09IDM4KQoJewoJCWxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzdHIsIC0xLCB3c3RyLCAwKTsKCQl3c3RyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIChsZW4rMSkqc2l6ZW9mKFdDSEFSKSk7CgkJcmV0ID0gKENMU0lERnJvbVN0cmluZyh3c3RyLCAqUHJvZHVjdENvZGUpID09IE5PRVJST1IpOwoJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdzdHIpOwoJCXdzdHIgPSBOVUxMOwoJfQoKCWlmKCFyZXQpCgl7CgkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKlByb2R1Y3RDb2RlKTsKCQkqUHJvZHVjdENvZGUgPSBOVUxMOwoJCSpQYWNrYWdlTmFtZSA9IHN0cjsKCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgVk9JRCBTdHJpbmdMaXN0QXBwZW5kKExQU1RSICpTdHJpbmdMaXN0LCBMUENTVFIgU3RyaW5nQXBwZW5kKQp7CglMUFNUUiBUZW1wU3RyID0gSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKlN0cmluZ0xpc3QsIEhlYXBTaXplKEdldFByb2Nlc3NIZWFwKCksIDAsICpTdHJpbmdMaXN0KStzdHJsZW4oU3RyaW5nQXBwZW5kKSk7CglpZighVGVtcFN0cikKCXsKCQlXSU5FX0VSUigiT3V0IG9mIG1lbW9yeSFcbiIpOwoJCUV4aXRQcm9jZXNzKDEpOwoJfQoJKlN0cmluZ0xpc3QgPSBUZW1wU3RyOwoJc3RyY2F0KCpTdHJpbmdMaXN0LCBTdHJpbmdBcHBlbmQpOwp9CgpzdGF0aWMgVk9JRCBTdHJpbmdDb21wYXJlUmVtb3ZlTGFzdChMUFNUUiBTdHJpbmcsIENIQVIgY2hhcmFjdGVyKQp7CglpbnQgbGVuID0gc3RybGVuKFN0cmluZyk7CglpZihsZW4gJiYgU3RyaW5nW2xlbi0xXSA9PSBjaGFyYWN0ZXIpIFN0cmluZ1tsZW4tMV0gPSAwOwp9CgpzdGF0aWMgSU5UIE1TSUVYRUNfbHN0cm5jbXBpQShMUENTVFIgc3RyMSwgTFBDU1RSIHN0cjIsIElOVCBzaXplKQp7CiAgICBJTlQgcmV0OwoKICAgIGlmICgoc3RyMSA9PSBOVUxMKSAmJiAoc3RyMiA9PSBOVUxMKSkgcmV0dXJuIDA7CiAgICBpZiAoc3RyMSA9PSBOVUxMKSByZXR1cm4gLTE7CiAgICBpZiAoc3RyMiA9PSBOVUxMKSByZXR1cm4gMTsKCiAgICByZXQgPSBDb21wYXJlU3RyaW5nQShHZXRUaHJlYWRMb2NhbGUoKSwgTk9STV9JR05PUkVDQVNFLCBzdHIxLCBzaXplLCBzdHIyLCAtMSk7CiAgICBpZiAocmV0KSByZXQgLT0gMjsKCiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgVk9JRCAqTG9hZFByb2MoTFBDU1RSIERsbE5hbWUsIExQQ1NUUiBQcm9jTmFtZSwgSE1PRFVMRSogRGxsSGFuZGxlKQp7CglWT0lEKiAoKnByb2MpKHZvaWQpOwoKCSpEbGxIYW5kbGUgPSBMb2FkTGlicmFyeUV4QShEbGxOYW1lLCBOVUxMLCBMT0FEX1dJVEhfQUxURVJFRF9TRUFSQ0hfUEFUSCk7CglpZighKkRsbEhhbmRsZSkKCXsKCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBsb2FkIGRsbCAlc1xuIiwgRGxsTmFtZSk7CgkJRXhpdFByb2Nlc3MoMSk7Cgl9Cglwcm9jID0gKFZPSUQgKikgR2V0UHJvY0FkZHJlc3MoKkRsbEhhbmRsZSwgUHJvY05hbWUpOwoJaWYoIXByb2MpCgl7CgkJZnByaW50ZihzdGRlcnIsICJEbGwgJXMgZG9lcyBub3QgaW1wbGVtZW50IGZ1bmN0aW9uICVzXG4iLCBEbGxOYW1lLCBQcm9jTmFtZSk7CgkJRnJlZUxpYnJhcnkoKkRsbEhhbmRsZSk7CgkJRXhpdFByb2Nlc3MoMSk7Cgl9CgoJcmV0dXJuIHByb2M7Cn0KCnN0YXRpYyB2b2lkIERsbFJlZ2lzdGVyU2VydmVyKExQQ1NUUiBEbGxOYW1lKQp7CglIUkVTVUxUIGhyOwoJRExMUkVHSVNURVJTRVJWRVIgcGZEbGxSZWdpc3RlclNlcnZlciA9IE5VTEw7CglITU9EVUxFIERsbEhhbmRsZSA9IE5VTEw7CgoJcGZEbGxSZWdpc3RlclNlcnZlciA9IExvYWRQcm9jKERsbE5hbWUsICJEbGxSZWdpc3RlclNlcnZlciIsICZEbGxIYW5kbGUpOwoKCWhyID0gcGZEbGxSZWdpc3RlclNlcnZlcigpOwoJaWYoRkFJTEVEKGhyKSkKCXsKCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZWdpc3RlciBkbGwgJXNcbiIsIERsbE5hbWUpOwoJCUV4aXRQcm9jZXNzKDEpOwoJfQoJcHJpbnRmKCJTdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCBkbGwgJXNcbiIsIERsbE5hbWUpOwoJaWYoRGxsSGFuZGxlKQoJCUZyZWVMaWJyYXJ5KERsbEhhbmRsZSk7Cn0KCnN0YXRpYyB2b2lkIERsbFVucmVnaXN0ZXJTZXJ2ZXIoTFBDU1RSIERsbE5hbWUpCnsKCUhSRVNVTFQgaHI7CglETExVTlJFR0lTVEVSU0VSVkVSIHBmRGxsVW5yZWdpc3RlclNlcnZlciA9IE5VTEw7CglITU9EVUxFIERsbEhhbmRsZSA9IE5VTEw7CgoJcGZEbGxVbnJlZ2lzdGVyU2VydmVyID0gTG9hZFByb2MoRGxsTmFtZSwgIkRsbFVucmVnaXN0ZXJTZXJ2ZXIiLCAmRGxsSGFuZGxlKTsKCglociA9IHBmRGxsVW5yZWdpc3RlclNlcnZlcigpOwoJaWYoRkFJTEVEKGhyKSkKCXsKCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB1bnJlZ2lzdGVyIGRsbCAlc1xuIiwgRGxsTmFtZSk7CgkJRXhpdFByb2Nlc3MoMSk7Cgl9CglwcmludGYoIlN1Y2Nlc3NmdWxseSB1bnJlZ2lzdGVyZWQgZGxsICVzXG4iLCBEbGxOYW1lKTsKCWlmKERsbEhhbmRsZSkKCQlGcmVlTGlicmFyeShEbGxIYW5kbGUpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CglpbnQgaTsKCUJPT0wgRnVuY3Rpb25JbnN0YWxsID0gRkFMU0U7CglCT09MIEZ1bmN0aW9uSW5zdGFsbEFkbWluID0gRkFMU0U7CglCT09MIEZ1bmN0aW9uUmVwYWlyID0gRkFMU0U7CglCT09MIEZ1bmN0aW9uQWR2ZXJ0aXNlID0gRkFMU0U7CglCT09MIEZ1bmN0aW9uUGF0Y2ggPSBGQUxTRTsKCUJPT0wgRnVuY3Rpb25EbGxSZWdpc3RlclNlcnZlciA9IEZBTFNFOwoJQk9PTCBGdW5jdGlvbkRsbFVucmVnaXN0ZXJTZXJ2ZXIgPSBGQUxTRTsKCUJPT0wgRnVuY3Rpb25SZWdTZXJ2ZXIgPSBGQUxTRTsKCUJPT0wgRnVuY3Rpb25VbnJlZ1NlcnZlciA9IEZBTFNFOwoJQk9PTCBGdW5jdGlvblVua25vd24gPSBGQUxTRTsKCglCT09MIEdvdFByb2R1Y3RDb2RlID0gRkFMU0U7CglMUENTVFIgUGFja2FnZU5hbWUgPSBOVUxMOwoJTFBHVUlEIFByb2R1Y3RDb2RlID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihHVUlEKSk7CglMUFNUUiBQcm9wZXJ0aWVzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIDEpOwoKCURXT1JEIFJlcGFpck1vZGUgPSAwOwoKCURXT1JEIEFkdmVydGlzZU1vZGUgPSAwOwoJTFBTVFIgVHJhbnNmb3JtcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCAxKTsKCUxBTkdJRCBMYW5ndWFnZSA9IDA7CgoJRFdPUkQgTG9nTW9kZSA9IDA7CglMUFNUUiBMb2dGaWxlTmFtZSA9IE5VTEw7CglEV09SRCBMb2dBdHRyaWJ1dGVzID0gMDsKCglMUFNUUiBQYXRjaEZpbGVOYW1lID0gTlVMTDsKCUlOU1RBTExUWVBFIEluc3RhbGxUeXBlID0gSU5TVEFMTFRZUEVfREVGQVVMVDsKCglJTlNUQUxMVUlMRVZFTCBJbnN0YWxsVUlMZXZlbCA9IDAsIHJldEluc3RhbGxVSUxldmVsOwoKCUxQU1RSIERsbE5hbWUgPSBOVUxMOwoKCVByb3BlcnRpZXNbMF0gPSAwOwoJVHJhbnNmb3Jtc1swXSA9IDA7CgoJZm9yKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQoJewoJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoKICAgICAgICAgICAgICAgIGlmICghbHN0cmNtcGlBKGFyZ3ZbaV0sICIvcmVnc2VydmVyIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25SZWdTZXJ2ZXIgPSBUUlVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIWxzdHJjbXBpQShhcmd2W2ldLCAiL3VucmVnc2VydmVyIikgfHwgIWxzdHJjbXBpQShhcmd2W2ldLCAiL3VucmVnaXN0ZXIiKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblVucmVnU2VydmVyID0gVFJVRTsKICAgICAgICAgICAgICAgIH0KCQllbHNlIGlmKCFNU0lFWEVDX2xzdHJuY21waUEoYXJndltpXSwgIi9pIiwgMikpCgkJewoJCQljaGFyICphcmd2aSA9IGFyZ3ZbaV07CgkJCUZ1bmN0aW9uSW5zdGFsbCA9IFRSVUU7CgkJCWlmKHN0cmxlbihhcmd2aSkgPiAyKQoJCQkJYXJndmkgKz0gMjsKCQkJZWxzZSB7CgkJCQlpKys7CgkJCQlpZihpID49IGFyZ2MpCgkJCQkJU2hvd1VzYWdlKDEpOwoJCQkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgkJCQlhcmd2aSA9IGFyZ3ZbaV07CgkJCX0KCQkJR290UHJvZHVjdENvZGUgPSBHZXRQcm9kdWN0Q29kZShhcmd2aSwgJlBhY2thZ2VOYW1lLCAmUHJvZHVjdENvZGUpOwoJCX0KCQllbHNlIGlmKCFsc3RyY21waUEoYXJndltpXSwgIi9hIikpCgkJewoJCQlGdW5jdGlvbkluc3RhbGwgPSBUUlVFOwoJCQlGdW5jdGlvbkluc3RhbGxBZG1pbiA9IFRSVUU7CgkJCUluc3RhbGxUeXBlID0gSU5TVEFMTFRZUEVfTkVUV09SS19JTUFHRTsKCQkJaSsrOwoJCQlpZihpID49IGFyZ2MpCgkJCQlTaG93VXNhZ2UoMSk7CgkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQlQYWNrYWdlTmFtZSA9IGFyZ3ZbaV07CgkJCVN0cmluZ0xpc3RBcHBlbmQoJlByb3BlcnRpZXMsIEFjdGlvbkFkbWluKTsKCQl9CgkJZWxzZSBpZighTVNJRVhFQ19sc3RybmNtcGlBKGFyZ3ZbaV0sICIvZiIsIDIpKQoJCXsKCQkJaW50IGo7CgkJCWludCBsZW4gPSBzdHJsZW4oYXJndltpXSk7CgkJCUZ1bmN0aW9uUmVwYWlyID0gVFJVRTsKCQkJZm9yKGogPSAyOyBqIDwgbGVuOyBqKyspCgkJCXsKCQkJCXN3aXRjaChhcmd2W2ldW2pdKQoJCQkJewoJCQkJCWNhc2UgJ1AnOgoJCQkJCWNhc2UgJ3AnOgoJCQkJCQlSZXBhaXJNb2RlIHw9IFJFSU5TVEFMTE1PREVfRklMRU1JU1NJTkc7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ08nOgoJCQkJCWNhc2UgJ28nOgoJCQkJCQlSZXBhaXJNb2RlIHw9IFJFSU5TVEFMTE1PREVfRklMRU9MREVSVkVSU0lPTjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnRSc6CgkJCQkJY2FzZSAnZSc6CgkJCQkJCVJlcGFpck1vZGUgfD0gUkVJTlNUQUxMTU9ERV9GSUxFRVFVQUxWRVJTSU9OOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdEJzoKCQkJCQljYXNlICdkJzoKCQkJCQkJUmVwYWlyTW9kZSB8PSBSRUlOU1RBTExNT0RFX0ZJTEVFWEFDVDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnQyc6CgkJCQkJY2FzZSAnYyc6CgkJCQkJCVJlcGFpck1vZGUgfD0gUkVJTlNUQUxMTU9ERV9GSUxFVkVSSUZZOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdBJzoKCQkJCQljYXNlICdhJzoKCQkJCQkJUmVwYWlyTW9kZSB8PSBSRUlOU1RBTExNT0RFX0ZJTEVSRVBMQUNFOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdVJzoKCQkJCQljYXNlICd1JzoKCQkJCQkJUmVwYWlyTW9kZSB8PSBSRUlOU1RBTExNT0RFX1VTRVJEQVRBOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdNJzoKCQkJCQljYXNlICdtJzoKCQkJCQkJUmVwYWlyTW9kZSB8PSBSRUlOU1RBTExNT0RFX01BQ0hJTkVEQVRBOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdTJzoKCQkJCQljYXNlICdzJzoKCQkJCQkJUmVwYWlyTW9kZSB8PSBSRUlOU1RBTExNT0RFX1NIT1JUQ1VUOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdWJzoKCQkJCQljYXNlICd2JzoKCQkJCQkJUmVwYWlyTW9kZSB8PSBSRUlOU1RBTExNT0RFX1BBQ0tBR0U7CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb24gXCIlY1wiIGluIFJlcGFpciBtb2RlXG4iLCBhcmd2W2ldW2pdKTsKCQkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJaWYobGVuID09IDIpCgkJCXsKCQkJCVJlcGFpck1vZGUgPSBSRUlOU1RBTExNT0RFX0ZJTEVNSVNTSU5HIHwKCQkJCQlSRUlOU1RBTExNT0RFX0ZJTEVFUVVBTFZFUlNJT04gfAoJCQkJCVJFSU5TVEFMTE1PREVfRklMRVZFUklGWSB8CgkJCQkJUkVJTlNUQUxMTU9ERV9NQUNISU5FREFUQSB8CgkJCQkJUkVJTlNUQUxMTU9ERV9TSE9SVENVVDsKCQkJfQoJCQlpKys7CgkJCWlmKGkgPj0gYXJnYykKCQkJCVNob3dVc2FnZSgxKTsKCQkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgkJCUdvdFByb2R1Y3RDb2RlID0gR2V0UHJvZHVjdENvZGUoYXJndltpXSwgJlBhY2thZ2VOYW1lLCAmUHJvZHVjdENvZGUpOwoJCX0KCQllbHNlIGlmKCFsc3RyY21waUEoYXJndltpXSwgIi94IikpCgkJewoJCQlGdW5jdGlvbkluc3RhbGwgPSBUUlVFOwoJCQlpKys7CgkJCWlmKGkgPj0gYXJnYykKCQkJCVNob3dVc2FnZSgxKTsKCQkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgkJCUdvdFByb2R1Y3RDb2RlID0gR2V0UHJvZHVjdENvZGUoYXJndltpXSwgJlBhY2thZ2VOYW1lLCAmUHJvZHVjdENvZGUpOwoJCQlTdHJpbmdMaXN0QXBwZW5kKCZQcm9wZXJ0aWVzLCBSZW1vdmVBbGwpOwoJCX0KCQllbHNlIGlmKCFNU0lFWEVDX2xzdHJuY21waUEoYXJndltpXSwgIi9qIiwgMikpCgkJewoJCQlpbnQgajsKCQkJaW50IGxlbiA9IHN0cmxlbihhcmd2W2ldKTsKCQkJRnVuY3Rpb25BZHZlcnRpc2UgPSBUUlVFOwoJCQlmb3IoaiA9IDI7IGogPCBsZW47IGorKykKCQkJewoJCQkJc3dpdGNoKGFyZ3ZbaV1bal0pCgkJCQl7CgkJCQkJY2FzZSAnVSc6CgkJCQkJY2FzZSAndSc6CgkJCQkJCUFkdmVydGlzZU1vZGUgPSBBRFZFUlRJU0VGTEFHU19VU0VSQVNTSUdOOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdNJzoKCQkJCQljYXNlICdtJzoKCQkJCQkJQWR2ZXJ0aXNlTW9kZSA9IEFEVkVSVElTRUZMQUdTX01BQ0hJTkVBU1NJR047CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb24gXCIlY1wiIGluIEFkdmVydGlzZSBtb2RlXG4iLCBhcmd2W2ldW2pdKTsKCQkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJaSsrOwoJCQlpZihpID49IGFyZ2MpCgkJCQlTaG93VXNhZ2UoMSk7CgkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQlQYWNrYWdlTmFtZSA9IGFyZ3ZbaV07CgkJfQoJCWVsc2UgaWYoIWxzdHJjbXBpQShhcmd2W2ldLCAidSIpKQoJCXsKCQkJRnVuY3Rpb25BZHZlcnRpc2UgPSBUUlVFOwoJCQlBZHZlcnRpc2VNb2RlID0gQURWRVJUSVNFRkxBR1NfVVNFUkFTU0lHTjsKCQkJaSsrOwoJCQlpZihpID49IGFyZ2MpCgkJCQlTaG93VXNhZ2UoMSk7CgkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQlQYWNrYWdlTmFtZSA9IGFyZ3ZbaV07CgkJfQoJCWVsc2UgaWYoIWxzdHJjbXBpQShhcmd2W2ldLCAibSIpKQoJCXsKCQkJRnVuY3Rpb25BZHZlcnRpc2UgPSBUUlVFOwoJCQlBZHZlcnRpc2VNb2RlID0gQURWRVJUSVNFRkxBR1NfTUFDSElORUFTU0lHTjsKCQkJaSsrOwoJCQlpZihpID49IGFyZ2MpCgkJCQlTaG93VXNhZ2UoMSk7CgkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQlQYWNrYWdlTmFtZSA9IGFyZ3ZbaV07CgkJfQoJCWVsc2UgaWYoIWxzdHJjbXBpQShhcmd2W2ldLCAiL3QiKSkKCQl7CgkJCWkrKzsKCQkJaWYoaSA+PSBhcmdjKQoJCQkJU2hvd1VzYWdlKDEpOwoJCQlXSU5FX1RSQUNFKCJhcmd2WyVkXSA9ICVzXG4iLCBpLCBhcmd2W2ldKTsKCQkJU3RyaW5nTGlzdEFwcGVuZCgmVHJhbnNmb3JtcywgYXJndltpXSk7CgkJCVN0cmluZ0xpc3RBcHBlbmQoJlRyYW5zZm9ybXMsICI7Iik7CgkJfQoJCWVsc2UgaWYoIU1TSUVYRUNfbHN0cm5jbXBpQShhcmd2W2ldLCAiVFJBTlNGT1JNUz0iLCAxMSkpCgkJewoJCQlTdHJpbmdMaXN0QXBwZW5kKCZUcmFuc2Zvcm1zLCBhcmd2W2ldKzExKTsKCQkJU3RyaW5nTGlzdEFwcGVuZCgmVHJhbnNmb3JtcywgIjsiKTsKCQl9CgkJZWxzZSBpZighbHN0cmNtcGlBKGFyZ3ZbaV0sICIvZyIpKQoJCXsKCQkJaSsrOwoJCQlpZihpID49IGFyZ2MpCgkJCQlTaG93VXNhZ2UoMSk7CgkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQlMYW5ndWFnZSA9IHN0cnRvbChhcmd2W2ldLCBOVUxMLCAwKTsKCQl9CgkJZWxzZSBpZighTVNJRVhFQ19sc3RybmNtcGlBKGFyZ3ZbaV0sICIvbCIsIDIpKQoJCXsKCQkJaW50IGo7CgkJCWludCBsZW4gPSBzdHJsZW4oYXJndltpXSk7CgkJCWZvcihqID0gMjsgaiA8IGxlbjsgaisrKQoJCQl7CgkJCQlzd2l0Y2goYXJndltpXVtqXSkKCQkJCXsKCQkJCQljYXNlICdJJzoKCQkJCQljYXNlICdpJzoKCQkJCQkJTG9nTW9kZSB8PSBJTlNUQUxMTE9HTU9ERV9JTkZPOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdXJzoKCQkJCQljYXNlICd3JzoKCQkJCQkJTG9nTW9kZSB8PSBJTlNUQUxMTE9HTU9ERV9XQVJOSU5HOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdFJzoKCQkJCQljYXNlICdlJzoKCQkJCQkJTG9nTW9kZSB8PSBJTlNUQUxMTE9HTU9ERV9FUlJPUjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnQSc6CgkJCQkJY2FzZSAnYSc6CgkJCQkJCUxvZ01vZGUgfD0gSU5TVEFMTExPR01PREVfQUNUSU9OU1RBUlQ7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ1InOgoJCQkJCWNhc2UgJ3InOgoJCQkJCQlMb2dNb2RlIHw9IElOU1RBTExMT0dNT0RFX0FDVElPTkRBVEE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ1UnOgoJCQkJCWNhc2UgJ3UnOgoJCQkJCQlMb2dNb2RlIHw9IElOU1RBTExMT0dNT0RFX1VTRVI7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ0MnOgoJCQkJCWNhc2UgJ2MnOgoJCQkJCQlMb2dNb2RlIHw9IElOU1RBTExMT0dNT0RFX0NPTU1PTkRBVEE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ00nOgoJCQkJCWNhc2UgJ20nOgoJCQkJCQlMb2dNb2RlIHw9IElOU1RBTExMT0dNT0RFX0ZBVEFMRVhJVDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnTyc6CgkJCQkJY2FzZSAnbyc6CgkJCQkJCUxvZ01vZGUgfD0gSU5TVEFMTExPR01PREVfT1VUT0ZESVNLU1BBQ0U7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ1AnOgoJCQkJCWNhc2UgJ3AnOgoJCQkJCQlMb2dNb2RlIHw9IElOU1RBTExMT0dNT0RFX1BST1BFUlRZRFVNUDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnVic6CgkJCQkJY2FzZSAndic6CgkJCQkJCUxvZ01vZGUgfD0gSU5TVEFMTExPR01PREVfVkVSQk9TRTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnKic6CgkJCQkJCUxvZ01vZGUgPSBJTlNUQUxMTE9HTU9ERV9GQVRBTEVYSVQgfAoJCQkJCQkJSU5TVEFMTExPR01PREVfRVJST1IgfAoJCQkJCQkJSU5TVEFMTExPR01PREVfV0FSTklORyB8CgkJCQkJCQlJTlNUQUxMTE9HTU9ERV9VU0VSIHwKCQkJCQkJCUlOU1RBTExMT0dNT0RFX0lORk8gfAoJCQkJCQkJSU5TVEFMTExPR01PREVfUkVTT0xWRVNPVVJDRSB8CgkJCQkJCQlJTlNUQUxMTE9HTU9ERV9PVVRPRkRJU0tTUEFDRSB8CgkJCQkJCQlJTlNUQUxMTE9HTU9ERV9BQ1RJT05TVEFSVCB8CgkJCQkJCQlJTlNUQUxMTE9HTU9ERV9BQ1RJT05EQVRBIHwKCQkJCQkJCUlOU1RBTExMT0dNT0RFX0NPTU1PTkRBVEEgfAoJCQkJCQkJSU5TVEFMTExPR01PREVfUFJPUEVSVFlEVU1QIHwKCQkJCQkJCUlOU1RBTExMT0dNT0RFX1BST0dSRVNTIHwKCQkJCQkJCUlOU1RBTExMT0dNT0RFX0lOSVRJQUxJWkUgfAoJCQkJCQkJSU5TVEFMTExPR01PREVfVEVSTUlOQVRFIHwKCQkJCQkJCUlOU1RBTExMT0dNT0RFX1NIT1dESUFMT0c7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJysnOgoJCQkJCQlMb2dBdHRyaWJ1dGVzIHw9IElOU1RBTExMT0dBVFRSSUJVVEVTX0FQUEVORDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnISc6CgkJCQkJCUxvZ0F0dHJpYnV0ZXMgfD0gSU5TVEFMTExPR0FUVFJJQlVURVNfRkxVU0hFQUNITElORTsKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJaSsrOwoJCQlpZihpID49IGFyZ2MpCgkJCQlTaG93VXNhZ2UoMSk7CgkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQlMb2dGaWxlTmFtZSA9IGFyZ3ZbaV07CgkJCWlmKE1zaUVuYWJsZUxvZ0EoTG9nTW9kZSwgTG9nRmlsZU5hbWUsIExvZ0F0dHJpYnV0ZXMpICE9IEVSUk9SX1NVQ0NFU1MpCgkJCXsKCQkJCWZwcmludGYoc3RkZXJyLCAiTG9nZ2luZyBpbiAlcyAoMHglMDhseCwgJWx1KSBmYWlsZWRcbiIsIExvZ0ZpbGVOYW1lLCBMb2dNb2RlLCBMb2dBdHRyaWJ1dGVzKTsKCQkJCUV4aXRQcm9jZXNzKDEpOwoJCQl9CgkJfQoJCWVsc2UgaWYoIWxzdHJjbXBpQShhcmd2W2ldLCAiL3AiKSkKCQl7CgkJCUZ1bmN0aW9uUGF0Y2ggPSBUUlVFOwoJCQlpKys7CgkJCWlmKGkgPj0gYXJnYykKCQkJCVNob3dVc2FnZSgxKTsKCQkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgkJCVBhdGNoRmlsZU5hbWUgPSBhcmd2W2ldOwoJCX0KCQllbHNlIGlmKCFNU0lFWEVDX2xzdHJuY21waUEoYXJndltpXSwgIi9xIiwgMikpCgkJewoJCQlpZihzdHJsZW4oYXJndltpXSkgPT0gMiB8fCAhbHN0cmNtcGlBKGFyZ3ZbaV0rMiwgIm4iKSkKCQkJewoJCQkJSW5zdGFsbFVJTGV2ZWwgPSBJTlNUQUxMVUlMRVZFTF9OT05FOwoJCQl9CgkJCWVsc2UgaWYoIWxzdHJjbXBpQShhcmd2W2ldKzIsICJiIikpCgkJCXsKCQkJCUluc3RhbGxVSUxldmVsID0gSU5TVEFMTFVJTEVWRUxfQkFTSUM7CgkJCX0KCQkJZWxzZSBpZighbHN0cmNtcGlBKGFyZ3ZbaV0rMiwgInIiKSkKCQkJewoJCQkJSW5zdGFsbFVJTGV2ZWwgPSBJTlNUQUxMVUlMRVZFTF9SRURVQ0VEOwoJCQl9CgkJCWVsc2UgaWYoIWxzdHJjbXBpQShhcmd2W2ldKzIsICJmIikpCgkJCXsKCQkJCUluc3RhbGxVSUxldmVsID0gSU5TVEFMTFVJTEVWRUxfRlVMTHxJTlNUQUxMVUlMRVZFTF9FTkRESUFMT0c7CgkJCX0KCQkJZWxzZSBpZighbHN0cmNtcGlBKGFyZ3ZbaV0rMiwgIm4rIikpCgkJCXsKCQkJCUluc3RhbGxVSUxldmVsID0gSU5TVEFMTFVJTEVWRUxfTk9ORXxJTlNUQUxMVUlMRVZFTF9FTkRESUFMT0c7CgkJCX0KCQkJZWxzZSBpZighbHN0cmNtcGlBKGFyZ3ZbaV0rMiwgImIrIikpCgkJCXsKCQkJCUluc3RhbGxVSUxldmVsID0gSU5TVEFMTFVJTEVWRUxfQkFTSUN8SU5TVEFMTFVJTEVWRUxfRU5ERElBTE9HOwoJCQl9CgkJCWVsc2UgaWYoIWxzdHJjbXBpQShhcmd2W2ldKzIsICJiLSIpKQoJCQl7CgkJCQlJbnN0YWxsVUlMZXZlbCA9IElOU1RBTExVSUxFVkVMX0JBU0lDfElOU1RBTExVSUxFVkVMX1BST0dSRVNTT05MWTsKCQkJfQoJCQllbHNlIGlmKCFsc3RyY21waUEoYXJndltpXSsyLCAiYishIikpCiAgICAgICAgICAgIAkJewoJCQkJSW5zdGFsbFVJTGV2ZWwgPSBJTlNUQUxMVUlMRVZFTF9CQVNJQ3xJTlNUQUxMVUlMRVZFTF9FTkRESUFMT0c7CgkJCQlXSU5FX0ZJWE1FKCJVbmtub3duIG1vZGlmaWVyOiAhXG4iKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb24gXCIlc1wiIGZvciBVSSBsZXZlbFxuIiwgYXJndltpXSsyKTsKCQkJfQoJCQlyZXRJbnN0YWxsVUlMZXZlbCA9IE1zaVNldEludGVybmFsVUkoSW5zdGFsbFVJTGV2ZWwsIE5VTEwpOwoJCQlpZihyZXRJbnN0YWxsVUlMZXZlbCA9PSBJTlNUQUxMVUlMRVZFTF9OT0NIQU5HRSkKCQkJewoJCQkJZnByaW50ZihzdGRlcnIsICJTZXR0aW5nIHRoZSBVSSBsZXZlbCB0byAweCV4IGZhaWxlZC5cbiIsIEluc3RhbGxVSUxldmVsKTsKCQkJCUV4aXRQcm9jZXNzKDEpOwoJCQl9CgkJfQoJCWVsc2UgaWYoIWxzdHJjbXBpQShhcmd2W2ldLCAiL3kiKSkKCQl7CgkJCUZ1bmN0aW9uRGxsUmVnaXN0ZXJTZXJ2ZXIgPSBUUlVFOwoJCQlpKys7CgkJCWlmKGkgPj0gYXJnYykKCQkJCVNob3dVc2FnZSgxKTsKCQkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgkJCURsbE5hbWUgPSBhcmd2W2ldOwoJCX0KCQllbHNlIGlmKCFsc3RyY21waUEoYXJndltpXSwgIi96IikpCgkJewoJCQlGdW5jdGlvbkRsbFVucmVnaXN0ZXJTZXJ2ZXIgPSBUUlVFOwoJCQlpKys7CgkJCWlmKGkgPj0gYXJnYykKCQkJCVNob3dVc2FnZSgxKTsKCQkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgkJCURsbE5hbWUgPSBhcmd2W2ldOwoJCX0KCQllbHNlIGlmKCFsc3RyY21waUEoYXJndltpXSwgIi9oIikgfHwgIWxzdHJjbXBpQShhcmd2W2ldLCAiLz8iKSkKCQl7CgkJCVNob3dVc2FnZSgwKTsKCQl9CgkJZWxzZSBpZighbHN0cmNtcGlBKGFyZ3ZbaV0sICIvbSIpKQoJCXsKCQkJRnVuY3Rpb25Vbmtub3duID0gVFJVRTsKCQkJV0lORV9GSVhNRSgiVW5rbm93biBwYXJhbWV0ZXIgL21cbiIpOwoJCX0KCQllbHNlIGlmKCFsc3RyY21waUEoYXJndltpXSwgIi9EIikpCgkJewoJCQlGdW5jdGlvblVua25vd24gPSBUUlVFOwoJCQlXSU5FX0ZJWE1FKCJVbmtub3duIHBhcmFtZXRlciAvRFxuIik7CgkJfQoJCWVsc2UgaWYoc3RyY2hyKGFyZ3ZbaV0sICc9JykpCgkJewoJCQlTdHJpbmdMaXN0QXBwZW5kKCZQcm9wZXJ0aWVzLCBhcmd2W2ldKTsKCQkJU3RyaW5nTGlzdEFwcGVuZCgmUHJvcGVydGllcywgIiAiKTsKCQl9CgkJZWxzZQoJCXsKCQkJRnVuY3Rpb25JbnN0YWxsID0gVFJVRTsKCQkJR290UHJvZHVjdENvZGUgPSBHZXRQcm9kdWN0Q29kZShhcmd2W2ldLCAmUGFja2FnZU5hbWUsICZQcm9kdWN0Q29kZSk7CgkJfQoJfQoKCVN0cmluZ0NvbXBhcmVSZW1vdmVMYXN0KFByb3BlcnRpZXMsICcgJyk7CglTdHJpbmdDb21wYXJlUmVtb3ZlTGFzdChUcmFuc2Zvcm1zLCAnOycpOwoKCWlmKEZ1bmN0aW9uSW5zdGFsbEFkbWluICYmIEZ1bmN0aW9uUGF0Y2gpCgkJRnVuY3Rpb25JbnN0YWxsID0gRkFMU0U7CgoJaWYoRnVuY3Rpb25JbnN0YWxsKQoJewoJCWlmKEdvdFByb2R1Y3RDb2RlKQoJCXsKCQkJV0lORV9GSVhNRSgiUHJvZHVjdCBjb2RlIHRyZWF0bWVudCBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKCQkJRXhpdFByb2Nlc3MoMSk7CgkJfQoJCWVsc2UKCQl7CgkJCWlmKE1zaUluc3RhbGxQcm9kdWN0QShQYWNrYWdlTmFtZSwgUHJvcGVydGllcykgIT0gRVJST1JfU1VDQ0VTUykKCQkJewoJCQkJZnByaW50ZihzdGRlcnIsICJJbnN0YWxsYXRpb24gb2YgJXMgKCVzKSBmYWlsZWQuXG4iLCBQYWNrYWdlTmFtZSwgUHJvcGVydGllcyk7CgkJCQlFeGl0UHJvY2VzcygxKTsKCQkJfQoJCX0KCX0KCWVsc2UgaWYoRnVuY3Rpb25SZXBhaXIpCgl7CgkJaWYoR290UHJvZHVjdENvZGUpCgkJewoJCQlXSU5FX0ZJWE1FKCJQcm9kdWN0IGNvZGUgdHJlYXRtZW50IG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwoJCQlFeGl0UHJvY2VzcygxKTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYoTXNpUmVpbnN0YWxsUHJvZHVjdEEoUGFja2FnZU5hbWUsIFJlcGFpck1vZGUpICE9IEVSUk9SX1NVQ0NFU1MpCgkJCXsKCQkJCWZwcmludGYoc3RkZXJyLCAiUmVwYWlyIG9mICVzICgweCUwOGx4KSBmYWlsZWQuXG4iLCBQYWNrYWdlTmFtZSwgUmVwYWlyTW9kZSk7CgkJCQlFeGl0UHJvY2VzcygxKTsKCQkJfQoJCX0KCX0KCWVsc2UgaWYoRnVuY3Rpb25BZHZlcnRpc2UpCgl7CgkJaWYoTXNpQWR2ZXJ0aXNlUHJvZHVjdEEoUGFja2FnZU5hbWUsIChMUFNUUikgQWR2ZXJ0aXNlTW9kZSwgVHJhbnNmb3JtcywgTGFuZ3VhZ2UpICE9IEVSUk9SX1NVQ0NFU1MpCgkJewoJCQlmcHJpbnRmKHN0ZGVyciwgIkFkdmVydGlzaW5nIG9mICVzICglbHUsICVzLCAweCUwNHgpIGZhaWxlZC5cbiIsIFBhY2thZ2VOYW1lLCBBZHZlcnRpc2VNb2RlLCBUcmFuc2Zvcm1zLCBMYW5ndWFnZSk7CgkJCUV4aXRQcm9jZXNzKDEpOwoJCX0KCX0KCWVsc2UgaWYoRnVuY3Rpb25QYXRjaCkKCXsKCQlpZihNc2lBcHBseVBhdGNoQShQYXRjaEZpbGVOYW1lLCBQYWNrYWdlTmFtZSwgSW5zdGFsbFR5cGUsIFByb3BlcnRpZXMpICE9IEVSUk9SX1NVQ0NFU1MpCgkJewoJCQlmcHJpbnRmKHN0ZGVyciwgIlBhdGNoaW5nIHdpdGggJXMgKCVzLCAlZCwgJXMpXG4iLCBQYXRjaEZpbGVOYW1lLCBQYWNrYWdlTmFtZSwgSW5zdGFsbFR5cGUsIFByb3BlcnRpZXMpOwoJCQlFeGl0UHJvY2VzcygxKTsKCQl9Cgl9CgllbHNlIGlmKEZ1bmN0aW9uRGxsUmVnaXN0ZXJTZXJ2ZXIpCgl7CgkJRGxsUmVnaXN0ZXJTZXJ2ZXIoRGxsTmFtZSk7Cgl9CgllbHNlIGlmKEZ1bmN0aW9uRGxsVW5yZWdpc3RlclNlcnZlcikKCXsKCQlEbGxVbnJlZ2lzdGVyU2VydmVyKERsbE5hbWUpOwoJfQoJZWxzZSBpZiAoRnVuY3Rpb25SZWdTZXJ2ZXIpCgl7CgkJV0lORV9GSVhNRSggIi9yZWdzZXJ2ZXIgbm90IGltcGxlbWVudGVkIHlldCwgaWdub3JpbmdcbiIgKTsKCX0KCWVsc2UgaWYgKEZ1bmN0aW9uVW5yZWdTZXJ2ZXIpCgl7CgkJV0lORV9GSVhNRSggIi91bnJlZ3NlcnZlciBub3QgaW1wbGVtZW50ZWQgeWV0LCBpZ25vcmluZ1xuIiApOwoJfQoJZWxzZSBpZiAoRnVuY3Rpb25Vbmtub3duKQoJewoJCVdJTkVfRklYTUUoICJVbmtub3duIGZ1bmN0aW9uLCBpZ25vcmluZ1xuIiApOwoJfQoJZWxzZQoJCVNob3dVc2FnZSgxKTsKCglyZXR1cm4gMDsKfQo=