LyoKICogbXNpZXhlYy5leGUgaW1wbGVtZW50YXRpb24KICoKICogQ29weXJpZ2h0IDIwMDQgVmluY2VudCBC6XJvbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8bXNpLmg+CiNpbmNsdWRlIDxvYmpiYXNlLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgIm1zaWV4ZWMuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChtc2lleGVjKTsKCnN0YXRpYyBjb25zdCBjaGFyIFVzYWdlU3RyW10gPQoiVXNhZ2U6XG4iCiIgIEluc3RhbGwgYSBwcm9kdWN0OlxuIgoiICAgIG1zaWV4ZWMge3BhY2thZ2V8cHJvZHVjdGNvZGV9IFtwcm9wZXJ0eV1cbiIKIiAgICBtc2lleGVjIC9pIHtwYWNrYWdlfHByb2R1Y3Rjb2RlfSBbcHJvcGVydHldXG4iCiIgICAgbXNpZXhlYyAvYSBwYWNrYWdlIFtwcm9wZXJ0eV1cbiIKIiAgUmVwYWlyIGFuIGluc3RhbGxhdGlvbjpcbiIKIiAgICBtc2lleGVjIC9mW3B8b3xlfGR8Y3xhfHV8bXxzfHZdIHtwYWNrYWdlfHByb2R1Y3Rjb2RlfVxuIgoiICBVbmluc3RhbGwgYSBwcm9kdWN0OlxuIgoiICAgIG1zaWV4ZWMgL3gge3BhY2thZ2V8cHJvZHVjdGNvZGV9IFtwcm9wZXJ0eV1cbiIKIiAgQWR2ZXJ0aXNlIGEgcHJvZHVjdDpcbiIKIiAgICBtc2lleGVjIC9qW3V8bV0gcGFja2FnZSBbL3QgdHJhbnNmb3JtXSBbL2cgbGFuZ3VhZ2VpZF1cbiIKIiAgICBtc2lleGVjIHt1fG19IHBhY2thZ2UgWy90IHRyYW5zZm9ybV0gWy9nIGxhbmd1YWdlaWRdXG4iCiIgIEFwcGx5IGEgcGF0Y2g6XG4iCiIgICAgbXNpZXhlYyAvcCBwYXRjaHBhY2thZ2UgW3Byb3BlcnR5XVxuIgoiICAgIG1zaWV4ZWMgL3AgcGF0Y2hwYWNrYWdlIC9hIHBhY2thZ2UgW3Byb3BlcnR5XVxuIgoiICBNb2RpZmllcnMgZm9yIGFib3ZlIG9wZXJhdGlvbnM6XG4iCiIgICAgbXNpZXhlYyAvbFsqXVtpfHd8ZXxhfHJ8dXxjfG18b3xwfHZ8XVsrfCFdIGxvZ2ZpbGVcbiIKIiAgICBtc2lleGVjIC9xe3xufGJ8cnxmfG4rfGIrfGItfVxuIgoiICBSZWdpc3RlciBhIG1vZHVsZTpcbiIKIiAgICBtc2lleGVjIC95IG1vZHVsZVxuIgoiICBVbnJlZ2lzdGVyIGEgbW9kdWxlOlxuIgoiICAgIG1zaWV4ZWMgL3ogbW9kdWxlXG4iCiIgIERpc3BsYXkgdXNhZ2UgYW5kIGNvcHlyaWdodDpcbiIKIiAgICBtc2lleGVjIHsvaHwvP31cbiIKIk5PVEU6IFByb2R1Y3QgY29kZSBvbiBjb21tYW5kbGluZSB1bmltcGxlbWVudGVkIGFzIG9mIHlldFxuIgoiXG4iCiJDb3B5cmlnaHQgMjAwNCBWaW5jZW50IELpcm9uXG4iOwoKc3RhdGljIGNvbnN0IGNoYXIgQWN0aW9uQWRtaW5bXSA9ICJBQ1RJT049QURNSU4gIjsKc3RhdGljIGNvbnN0IGNoYXIgUmVtb3ZlQWxsW10gPSAiUkVNT1ZFPUFMTCAiOwoKc3RhdGljIHZvaWQgU2hvd1VzYWdlKGludCBFeGl0Q29kZSkKewoJcHJpbnRmKFVzYWdlU3RyKTsKCUV4aXRQcm9jZXNzKEV4aXRDb2RlKTsKfQoKc3RhdGljIEJPT0wgR2V0UHJvZHVjdENvZGUoTFBDU1RSIHN0ciwgTFBDU1RSICpQYWNrYWdlTmFtZSwgTFBHVUlEICpQcm9kdWN0Q29kZSkKewoJQk9PTCByZXQgPSBGQUxTRTsKCWludCBsZW4gPSAwOwoJTFBXU1RSIHdzdHIgPSBOVUxMOwoKCWlmKHN0cmxlbihzdHIpID09IDM4KQoJewoJCWxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzdHIsIC0xLCB3c3RyLCAwKTsKCQl3c3RyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIChsZW4rMSkqc2l6ZW9mKFdDSEFSKSk7CgkJcmV0ID0gKENMU0lERnJvbVN0cmluZyh3c3RyLCAqUHJvZHVjdENvZGUpID09IE5PRVJST1IpOwoJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdzdHIpOwoJCXdzdHIgPSBOVUxMOwoJfQoKCWlmKCFyZXQpCgl7CgkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKlByb2R1Y3RDb2RlKTsKCQkqUHJvZHVjdENvZGUgPSBOVUxMOwoJCSpQYWNrYWdlTmFtZSA9IHN0cjsKCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgVk9JRCBTdHJpbmdMaXN0QXBwZW5kKExQU1RSICpTdHJpbmdMaXN0LCBMUENTVFIgU3RyaW5nQXBwZW5kKQp7CglMUFNUUiBUZW1wU3RyID0gSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKlN0cmluZ0xpc3QsIEhlYXBTaXplKEdldFByb2Nlc3NIZWFwKCksIDAsICpTdHJpbmdMaXN0KStzdHJsZW4oU3RyaW5nQXBwZW5kKSk7CglpZighVGVtcFN0cikKCXsKCQlXSU5FX0VSUigiT3V0IG9mIG1lbW9yeSFcbiIpOwoJCUV4aXRQcm9jZXNzKDEpOwoJfQoJKlN0cmluZ0xpc3QgPSBUZW1wU3RyOwoJc3RyY2F0KCpTdHJpbmdMaXN0LCBTdHJpbmdBcHBlbmQpOwp9CgpzdGF0aWMgVk9JRCBTdHJpbmdDb21wYXJlUmVtb3ZlTGFzdChMUFNUUiBTdHJpbmcsIENIQVIgY2hhcmFjdGVyKQp7CglpbnQgbGVuID0gc3RybGVuKFN0cmluZyk7CglpZihsZW4gJiYgU3RyaW5nW2xlbi0xXSA9PSBjaGFyYWN0ZXIpIFN0cmluZ1tsZW4tMV0gPSAwOwp9CgpzdGF0aWMgVk9JRCAqTG9hZFByb2MoTFBDU1RSIERsbE5hbWUsIExQQ1NUUiBQcm9jTmFtZSwgSE1PRFVMRSogRGxsSGFuZGxlKQp7CglWT0lEKiAoKnByb2MpKHZvaWQpOwoKCSpEbGxIYW5kbGUgPSBMb2FkTGlicmFyeUV4QShEbGxOYW1lLCBOVUxMLCBMT0FEX1dJVEhfQUxURVJFRF9TRUFSQ0hfUEFUSCk7CglpZighKkRsbEhhbmRsZSkKCXsKCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBsb2FkIGRsbCAlc1xuIiwgRGxsTmFtZSk7CgkJRXhpdFByb2Nlc3MoMSk7Cgl9Cglwcm9jID0gKFZPSUQgKikgR2V0UHJvY0FkZHJlc3MoKkRsbEhhbmRsZSwgUHJvY05hbWUpOwoJaWYoIXByb2MpCgl7CgkJZnByaW50ZihzdGRlcnIsICJEbGwgJXMgZG9lcyBub3QgaW1wbGVtZW50IGZ1bmN0aW9uICVzXG4iLCBEbGxOYW1lLCBQcm9jTmFtZSk7CgkJRnJlZUxpYnJhcnkoKkRsbEhhbmRsZSk7CgkJRXhpdFByb2Nlc3MoMSk7Cgl9CgoJcmV0dXJuIHByb2M7Cn0KCnN0YXRpYyB2b2lkIERsbFJlZ2lzdGVyU2VydmVyKExQQ1NUUiBEbGxOYW1lKQp7CglIUkVTVUxUIGhyOwoJRExMUkVHSVNURVJTRVJWRVIgcGZEbGxSZWdpc3RlclNlcnZlciA9IE5VTEw7CglITU9EVUxFIERsbEhhbmRsZSA9IE5VTEw7CgoJcGZEbGxSZWdpc3RlclNlcnZlciA9IExvYWRQcm9jKERsbE5hbWUsICJEbGxSZWdpc3RlclNlcnZlciIsICZEbGxIYW5kbGUpOwoKCWhyID0gcGZEbGxSZWdpc3RlclNlcnZlcigpOwoJaWYoRkFJTEVEKGhyKSkKCXsKCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZWdpc3RlciBkbGwgJXNcbiIsIERsbE5hbWUpOwoJCUV4aXRQcm9jZXNzKDEpOwoJfQoJcHJpbnRmKCJTdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCBkbGwgJXNcbiIsIERsbE5hbWUpOwoJaWYoRGxsSGFuZGxlKQoJCUZyZWVMaWJyYXJ5KERsbEhhbmRsZSk7Cn0KCnN0YXRpYyB2b2lkIERsbFVucmVnaXN0ZXJTZXJ2ZXIoTFBDU1RSIERsbE5hbWUpCnsKCUhSRVNVTFQgaHI7CglETExVTlJFR0lTVEVSU0VSVkVSIHBmRGxsVW5yZWdpc3RlclNlcnZlciA9IE5VTEw7CglITU9EVUxFIERsbEhhbmRsZSA9IE5VTEw7CgoJcGZEbGxVbnJlZ2lzdGVyU2VydmVyID0gTG9hZFByb2MoRGxsTmFtZSwgIkRsbFVucmVnaXN0ZXJTZXJ2ZXIiLCAmRGxsSGFuZGxlKTsKCglociA9IHBmRGxsVW5yZWdpc3RlclNlcnZlcigpOwoJaWYoRkFJTEVEKGhyKSkKCXsKCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB1bnJlZ2lzdGVyIGRsbCAlc1xuIiwgRGxsTmFtZSk7CgkJRXhpdFByb2Nlc3MoMSk7Cgl9CglwcmludGYoIlN1Y2Nlc3NmdWxseSB1bnJlZ2lzdGVyZWQgZGxsICVzXG4iLCBEbGxOYW1lKTsKCWlmKERsbEhhbmRsZSkKCQlGcmVlTGlicmFyeShEbGxIYW5kbGUpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CglpbnQgaTsKCUJPT0wgRnVuY3Rpb25JbnN0YWxsID0gRkFMU0U7CglCT09MIEZ1bmN0aW9uSW5zdGFsbEFkbWluID0gRkFMU0U7CglCT09MIEZ1bmN0aW9uUmVwYWlyID0gRkFMU0U7CglCT09MIEZ1bmN0aW9uQWR2ZXJ0aXNlID0gRkFMU0U7CglCT09MIEZ1bmN0aW9uUGF0Y2ggPSBGQUxTRTsKCUJPT0wgRnVuY3Rpb25EbGxSZWdpc3RlclNlcnZlciA9IEZBTFNFOwoJQk9PTCBGdW5jdGlvbkRsbFVucmVnaXN0ZXJTZXJ2ZXIgPSBGQUxTRTsKCUJPT0wgRnVuY3Rpb25SZWdTZXJ2ZXIgPSBGQUxTRTsKCUJPT0wgRnVuY3Rpb25VbnJlZ1NlcnZlciA9IEZBTFNFOwoKCUJPT0wgR290UHJvZHVjdENvZGUgPSBGQUxTRTsKCUxQQ1NUUiBQYWNrYWdlTmFtZSA9IE5VTEw7CglMUEdVSUQgUHJvZHVjdENvZGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKEdVSUQpKTsKCUxQU1RSIFByb3BlcnRpZXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMSk7CgoJRFdPUkQgUmVwYWlyTW9kZSA9IDA7CgoJRFdPUkQgQWR2ZXJ0aXNlTW9kZSA9IDA7CglMUFNUUiBUcmFuc2Zvcm1zID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIDEpOwoJTEFOR0lEIExhbmd1YWdlID0gMDsKCglEV09SRCBMb2dNb2RlID0gMDsKCUxQU1RSIExvZ0ZpbGVOYW1lID0gTlVMTDsKCURXT1JEIExvZ0F0dHJpYnV0ZXMgPSAwOwoKCUxQU1RSIFBhdGNoRmlsZU5hbWUgPSBOVUxMOwoJSU5TVEFMTFRZUEUgSW5zdGFsbFR5cGUgPSBJTlNUQUxMVFlQRV9ERUZBVUxUOwoKCUlOU1RBTExVSUxFVkVMIEluc3RhbGxVSUxldmVsID0gMCwgcmV0SW5zdGFsbFVJTGV2ZWw7CgoJTFBTVFIgRGxsTmFtZSA9IE5VTEw7CgoJUHJvcGVydGllc1swXSA9IDA7CglUcmFuc2Zvcm1zWzBdID0gMDsKCglmb3IoaSA9IDE7IGkgPCBhcmdjOyBpKyspCgl7CgkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgogICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGFyZ3ZbaV0sICIvcmVnc2VydmVyIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25SZWdTZXJ2ZXIgPSBUUlVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndltpXSwgIi91bnJlZ3NlcnZlciIpIHx8ICFzdHJjYXNlY21wKGFyZ3ZbaV0sICIvdW5yZWdpc3RlciIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVW5yZWdTZXJ2ZXIgPSBUUlVFOwogICAgICAgICAgICAgICAgfQoJCWVsc2UgaWYoIXN0cm5jYXNlY21wKGFyZ3ZbaV0sICIvaSIsIDIpKQoJCXsKCQkJY2hhciAqYXJndmkgPSBhcmd2W2ldOwoJCQlGdW5jdGlvbkluc3RhbGwgPSBUUlVFOwoJCQlpZihzdHJsZW4oYXJndmkpID4gMikKCQkJCWFyZ3ZpICs9IDI7CgkJCWVsc2UgewoJCQkJaSsrOwoJCQkJaWYoaSA+PSBhcmdjKQoJCQkJCVNob3dVc2FnZSgxKTsKCQkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQkJYXJndmkgPSBhcmd2W2ldOwoJCQl9CgkJCUdvdFByb2R1Y3RDb2RlID0gR2V0UHJvZHVjdENvZGUoYXJndmksICZQYWNrYWdlTmFtZSwgJlByb2R1Y3RDb2RlKTsKCQl9CgkJZWxzZSBpZighc3RyY2FzZWNtcChhcmd2W2ldLCAiL2EiKSkKCQl7CgkJCUZ1bmN0aW9uSW5zdGFsbCA9IFRSVUU7CgkJCUZ1bmN0aW9uSW5zdGFsbEFkbWluID0gVFJVRTsKCQkJSW5zdGFsbFR5cGUgPSBJTlNUQUxMVFlQRV9ORVRXT1JLX0lNQUdFOwoJCQlpKys7CgkJCWlmKGkgPj0gYXJnYykKCQkJCVNob3dVc2FnZSgxKTsKCQkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgkJCVBhY2thZ2VOYW1lID0gYXJndltpXTsKCQkJU3RyaW5nTGlzdEFwcGVuZCgmUHJvcGVydGllcywgQWN0aW9uQWRtaW4pOwoJCX0KCQllbHNlIGlmKCFzdHJuY2FzZWNtcChhcmd2W2ldLCAiL2YiLCAyKSkKCQl7CgkJCWludCBqOwoJCQlpbnQgbGVuID0gc3RybGVuKGFyZ3ZbaV0pOwoJCQlGdW5jdGlvblJlcGFpciA9IFRSVUU7CgkJCWZvcihqID0gMjsgaiA8IGxlbjsgaisrKQoJCQl7CgkJCQlzd2l0Y2goYXJndltpXVtqXSkKCQkJCXsKCQkJCQljYXNlICdQJzoKCQkJCQljYXNlICdwJzoKCQkJCQkJUmVwYWlyTW9kZSB8PSBSRUlOU1RBTExNT0RFX0ZJTEVNSVNTSU5HOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdPJzoKCQkJCQljYXNlICdvJzoKCQkJCQkJUmVwYWlyTW9kZSB8PSBSRUlOU1RBTExNT0RFX0ZJTEVPTERFUlZFUlNJT047CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ0UnOgoJCQkJCWNhc2UgJ2UnOgoJCQkJCQlSZXBhaXJNb2RlIHw9IFJFSU5TVEFMTE1PREVfRklMRUVRVUFMVkVSU0lPTjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnRCc6CgkJCQkJY2FzZSAnZCc6CgkJCQkJCVJlcGFpck1vZGUgfD0gUkVJTlNUQUxMTU9ERV9GSUxFRVhBQ1Q7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ0MnOgoJCQkJCWNhc2UgJ2MnOgoJCQkJCQlSZXBhaXJNb2RlIHw9IFJFSU5TVEFMTE1PREVfRklMRVZFUklGWTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnQSc6CgkJCQkJY2FzZSAnYSc6CgkJCQkJCVJlcGFpck1vZGUgfD0gUkVJTlNUQUxMTU9ERV9GSUxFUkVQTEFDRTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnVSc6CgkJCQkJY2FzZSAndSc6CgkJCQkJCVJlcGFpck1vZGUgfD0gUkVJTlNUQUxMTU9ERV9VU0VSREFUQTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnTSc6CgkJCQkJY2FzZSAnbSc6CgkJCQkJCVJlcGFpck1vZGUgfD0gUkVJTlNUQUxMTU9ERV9NQUNISU5FREFUQTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnUyc6CgkJCQkJY2FzZSAncyc6CgkJCQkJCVJlcGFpck1vZGUgfD0gUkVJTlNUQUxMTU9ERV9TSE9SVENVVDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnVic6CgkJCQkJY2FzZSAndic6CgkJCQkJCVJlcGFpck1vZGUgfD0gUkVJTlNUQUxMTU9ERV9QQUNLQUdFOwoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uIFwiJWNcIiBpbiBSZXBhaXIgbW9kZVxuIiwgYXJndltpXVtqXSk7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWlmKGxlbiA9PSAyKQoJCQl7CgkJCQlSZXBhaXJNb2RlID0gUkVJTlNUQUxMTU9ERV9GSUxFTUlTU0lORyB8CgkJCQkJUkVJTlNUQUxMTU9ERV9GSUxFRVFVQUxWRVJTSU9OIHwKCQkJCQlSRUlOU1RBTExNT0RFX0ZJTEVWRVJJRlkgfAoJCQkJCVJFSU5TVEFMTE1PREVfTUFDSElORURBVEEgfAoJCQkJCVJFSU5TVEFMTE1PREVfU0hPUlRDVVQ7CgkJCX0KCQkJaSsrOwoJCQlpZihpID49IGFyZ2MpCgkJCQlTaG93VXNhZ2UoMSk7CgkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQlHb3RQcm9kdWN0Q29kZSA9IEdldFByb2R1Y3RDb2RlKGFyZ3ZbaV0sICZQYWNrYWdlTmFtZSwgJlByb2R1Y3RDb2RlKTsKCQl9CgkJZWxzZSBpZighc3RyY2FzZWNtcChhcmd2W2ldLCAiL3giKSkKCQl7CgkJCUZ1bmN0aW9uSW5zdGFsbCA9IFRSVUU7CgkJCWkrKzsKCQkJaWYoaSA+PSBhcmdjKQoJCQkJU2hvd1VzYWdlKDEpOwoJCQlXSU5FX1RSQUNFKCJhcmd2WyVkXSA9ICVzXG4iLCBpLCBhcmd2W2ldKTsKCQkJR290UHJvZHVjdENvZGUgPSBHZXRQcm9kdWN0Q29kZShhcmd2W2ldLCAmUGFja2FnZU5hbWUsICZQcm9kdWN0Q29kZSk7CgkJCVN0cmluZ0xpc3RBcHBlbmQoJlByb3BlcnRpZXMsIFJlbW92ZUFsbCk7CgkJfQoJCWVsc2UgaWYoIXN0cm5jYXNlY21wKGFyZ3ZbaV0sICIvaiIsIDIpKQoJCXsKCQkJaW50IGo7CgkJCWludCBsZW4gPSBzdHJsZW4oYXJndltpXSk7CgkJCUZ1bmN0aW9uQWR2ZXJ0aXNlID0gVFJVRTsKCQkJZm9yKGogPSAyOyBqIDwgbGVuOyBqKyspCgkJCXsKCQkJCXN3aXRjaChhcmd2W2ldW2pdKQoJCQkJewoJCQkJCWNhc2UgJ1UnOgoJCQkJCWNhc2UgJ3UnOgoJCQkJCQlBZHZlcnRpc2VNb2RlID0gQURWRVJUSVNFRkxBR1NfVVNFUkFTU0lHTjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnTSc6CgkJCQkJY2FzZSAnbSc6CgkJCQkJCUFkdmVydGlzZU1vZGUgPSBBRFZFUlRJU0VGTEFHU19NQUNISU5FQVNTSUdOOwoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uIFwiJWNcIiBpbiBBZHZlcnRpc2UgbW9kZVxuIiwgYXJndltpXVtqXSk7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWkrKzsKCQkJaWYoaSA+PSBhcmdjKQoJCQkJU2hvd1VzYWdlKDEpOwoJCQlXSU5FX1RSQUNFKCJhcmd2WyVkXSA9ICVzXG4iLCBpLCBhcmd2W2ldKTsKCQkJUGFja2FnZU5hbWUgPSBhcmd2W2ldOwoJCX0KCQllbHNlIGlmKCFzdHJjYXNlY21wKGFyZ3ZbaV0sICJ1IikpCgkJewoJCQlGdW5jdGlvbkFkdmVydGlzZSA9IFRSVUU7CgkJCUFkdmVydGlzZU1vZGUgPSBBRFZFUlRJU0VGTEFHU19VU0VSQVNTSUdOOwoJCQlpKys7CgkJCWlmKGkgPj0gYXJnYykKCQkJCVNob3dVc2FnZSgxKTsKCQkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgkJCVBhY2thZ2VOYW1lID0gYXJndltpXTsKCQl9CgkJZWxzZSBpZighc3RyY2FzZWNtcChhcmd2W2ldLCAibSIpKQoJCXsKCQkJRnVuY3Rpb25BZHZlcnRpc2UgPSBUUlVFOwoJCQlBZHZlcnRpc2VNb2RlID0gQURWRVJUSVNFRkxBR1NfTUFDSElORUFTU0lHTjsKCQkJaSsrOwoJCQlpZihpID49IGFyZ2MpCgkJCQlTaG93VXNhZ2UoMSk7CgkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQlQYWNrYWdlTmFtZSA9IGFyZ3ZbaV07CgkJfQoJCWVsc2UgaWYoIXN0cmNhc2VjbXAoYXJndltpXSwgIi90IikpCgkJewoJCQlpKys7CgkJCWlmKGkgPj0gYXJnYykKCQkJCVNob3dVc2FnZSgxKTsKCQkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgkJCVN0cmluZ0xpc3RBcHBlbmQoJlRyYW5zZm9ybXMsIGFyZ3ZbaV0pOwoJCQlTdHJpbmdMaXN0QXBwZW5kKCZUcmFuc2Zvcm1zLCAiOyIpOwoJCX0KCQllbHNlIGlmKCFzdHJuY2FzZWNtcChhcmd2W2ldLCAiVFJBTlNGT1JNUz0iLCAxMSkpCgkJewoJCQlTdHJpbmdMaXN0QXBwZW5kKCZUcmFuc2Zvcm1zLCBhcmd2W2ldKzExKTsKCQkJU3RyaW5nTGlzdEFwcGVuZCgmVHJhbnNmb3JtcywgIjsiKTsKCQl9CgkJZWxzZSBpZighc3RyY2FzZWNtcChhcmd2W2ldLCAiL2ciKSkKCQl7CgkJCWkrKzsKCQkJaWYoaSA+PSBhcmdjKQoJCQkJU2hvd1VzYWdlKDEpOwoJCQlXSU5FX1RSQUNFKCJhcmd2WyVkXSA9ICVzXG4iLCBpLCBhcmd2W2ldKTsKCQkJTGFuZ3VhZ2UgPSBzdHJ0b2woYXJndltpXSwgTlVMTCwgMCk7CgkJfQoJCWVsc2UgaWYoIXN0cm5jYXNlY21wKGFyZ3ZbaV0sICIvbCIsIDIpKQoJCXsKCQkJaW50IGo7CgkJCWludCBsZW4gPSBzdHJsZW4oYXJndltpXSk7CgkJCWZvcihqID0gMjsgaiA8IGxlbjsgaisrKQoJCQl7CgkJCQlzd2l0Y2goYXJndltpXVtqXSkKCQkJCXsKCQkJCQljYXNlICdJJzoKCQkJCQljYXNlICdpJzoKCQkJCQkJTG9nTW9kZSB8PSBJTlNUQUxMTE9HTU9ERV9JTkZPOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdXJzoKCQkJCQljYXNlICd3JzoKCQkJCQkJTG9nTW9kZSB8PSBJTlNUQUxMTE9HTU9ERV9XQVJOSU5HOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdFJzoKCQkJCQljYXNlICdlJzoKCQkJCQkJTG9nTW9kZSB8PSBJTlNUQUxMTE9HTU9ERV9FUlJPUjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnQSc6CgkJCQkJY2FzZSAnYSc6CgkJCQkJCUxvZ01vZGUgfD0gSU5TVEFMTExPR01PREVfQUNUSU9OU1RBUlQ7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ1InOgoJCQkJCWNhc2UgJ3InOgoJCQkJCQlMb2dNb2RlIHw9IElOU1RBTExMT0dNT0RFX0FDVElPTkRBVEE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ1UnOgoJCQkJCWNhc2UgJ3UnOgoJCQkJCQlMb2dNb2RlIHw9IElOU1RBTExMT0dNT0RFX1VTRVI7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ0MnOgoJCQkJCWNhc2UgJ2MnOgoJCQkJCQlMb2dNb2RlIHw9IElOU1RBTExMT0dNT0RFX0NPTU1PTkRBVEE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ00nOgoJCQkJCWNhc2UgJ20nOgoJCQkJCQlMb2dNb2RlIHw9IElOU1RBTExMT0dNT0RFX0ZBVEFMRVhJVDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnTyc6CgkJCQkJY2FzZSAnbyc6CgkJCQkJCUxvZ01vZGUgfD0gSU5TVEFMTExPR01PREVfT1VUT0ZESVNLU1BBQ0U7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ1AnOgoJCQkJCWNhc2UgJ3AnOgoJCQkJCQlMb2dNb2RlIHw9IElOU1RBTExMT0dNT0RFX1BST1BFUlRZRFVNUDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnVic6CgkJCQkJY2FzZSAndic6CgkJCQkJCUxvZ01vZGUgfD0gSU5TVEFMTExPR01PREVfVkVSQk9TRTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnKic6CgkJCQkJCUxvZ01vZGUgPSBJTlNUQUxMTE9HTU9ERV9GQVRBTEVYSVQgfAoJCQkJCQkJSU5TVEFMTExPR01PREVfRVJST1IgfAoJCQkJCQkJSU5TVEFMTExPR01PREVfV0FSTklORyB8CgkJCQkJCQlJTlNUQUxMTE9HTU9ERV9VU0VSIHwKCQkJCQkJCUlOU1RBTExMT0dNT0RFX0lORk8gfAoJCQkJCQkJSU5TVEFMTExPR01PREVfUkVTT0xWRVNPVVJDRSB8CgkJCQkJCQlJTlNUQUxMTE9HTU9ERV9PVVRPRkRJU0tTUEFDRSB8CgkJCQkJCQlJTlNUQUxMTE9HTU9ERV9BQ1RJT05TVEFSVCB8CgkJCQkJCQlJTlNUQUxMTE9HTU9ERV9BQ1RJT05EQVRBIHwKCQkJCQkJCUlOU1RBTExMT0dNT0RFX0NPTU1PTkRBVEEgfAoJCQkJCQkJSU5TVEFMTExPR01PREVfUFJPUEVSVFlEVU1QIHwKCQkJCQkJCUlOU1RBTExMT0dNT0RFX1BST0dSRVNTIHwKCQkJCQkJCUlOU1RBTExMT0dNT0RFX0lOSVRJQUxJWkUgfAoJCQkJCQkJSU5TVEFMTExPR01PREVfVEVSTUlOQVRFIHwKCQkJCQkJCUlOU1RBTExMT0dNT0RFX1NIT1dESUFMT0c7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJysnOgoJCQkJCQlMb2dBdHRyaWJ1dGVzIHw9IElOU1RBTExMT0dBVFRSSUJVVEVTX0FQUEVORDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnISc6CgkJCQkJCUxvZ0F0dHJpYnV0ZXMgfD0gSU5TVEFMTExPR0FUVFJJQlVURVNfRkxVU0hFQUNITElORTsKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJaSsrOwoJCQlpZihpID49IGFyZ2MpCgkJCQlTaG93VXNhZ2UoMSk7CgkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQlMb2dGaWxlTmFtZSA9IGFyZ3ZbaV07CgkJCWlmKE1zaUVuYWJsZUxvZ0EoTG9nTW9kZSwgTG9nRmlsZU5hbWUsIExvZ0F0dHJpYnV0ZXMpICE9IEVSUk9SX1NVQ0NFU1MpCgkJCXsKCQkJCWZwcmludGYoc3RkZXJyLCAiTG9nZ2luZyBpbiAlcyAoMHglMDhseCwgJWx1KSBmYWlsZWRcbiIsIExvZ0ZpbGVOYW1lLCBMb2dNb2RlLCBMb2dBdHRyaWJ1dGVzKTsKCQkJCUV4aXRQcm9jZXNzKDEpOwoJCQl9CgkJfQoJCWVsc2UgaWYoIXN0cmNhc2VjbXAoYXJndltpXSwgIi9wIikpCgkJewoJCQlGdW5jdGlvblBhdGNoID0gVFJVRTsKCQkJaSsrOwoJCQlpZihpID49IGFyZ2MpCgkJCQlTaG93VXNhZ2UoMSk7CgkJCVdJTkVfVFJBQ0UoImFyZ3ZbJWRdID0gJXNcbiIsIGksIGFyZ3ZbaV0pOwoJCQlQYXRjaEZpbGVOYW1lID0gYXJndltpXTsKCQl9CgkJZWxzZSBpZighc3RybmNhc2VjbXAoYXJndltpXSwgIi9xIiwgMikpCgkJewoJCQlpZihzdHJsZW4oYXJndltpXSkgPT0gMiB8fCAhc3RyY2FzZWNtcChhcmd2W2ldKzIsICJuIikpCgkJCXsKCQkJCUluc3RhbGxVSUxldmVsID0gSU5TVEFMTFVJTEVWRUxfTk9ORTsKCQkJfQoJCQllbHNlIGlmKCFzdHJjYXNlY21wKGFyZ3ZbaV0rMiwgImIiKSkKCQkJewoJCQkJSW5zdGFsbFVJTGV2ZWwgPSBJTlNUQUxMVUlMRVZFTF9CQVNJQzsKCQkJfQoJCQllbHNlIGlmKCFzdHJjYXNlY21wKGFyZ3ZbaV0rMiwgInIiKSkKCQkJewoJCQkJSW5zdGFsbFVJTGV2ZWwgPSBJTlNUQUxMVUlMRVZFTF9SRURVQ0VEOwoJCQl9CgkJCWVsc2UgaWYoIXN0cmNhc2VjbXAoYXJndltpXSsyLCAiZiIpKQoJCQl7CgkJCQlJbnN0YWxsVUlMZXZlbCA9IElOU1RBTExVSUxFVkVMX0ZVTEx8SU5TVEFMTFVJTEVWRUxfRU5ERElBTE9HOwoJCQl9CgkJCWVsc2UgaWYoIXN0cmNhc2VjbXAoYXJndltpXSsyLCAibisiKSkKCQkJewoJCQkJSW5zdGFsbFVJTGV2ZWwgPSBJTlNUQUxMVUlMRVZFTF9OT05FfElOU1RBTExVSUxFVkVMX0VORERJQUxPRzsKCQkJfQoJCQllbHNlIGlmKCFzdHJjYXNlY21wKGFyZ3ZbaV0rMiwgImIrIikpCgkJCXsKCQkJCUluc3RhbGxVSUxldmVsID0gSU5TVEFMTFVJTEVWRUxfQkFTSUN8SU5TVEFMTFVJTEVWRUxfRU5ERElBTE9HOwoJCQl9CgkJCWVsc2UgaWYoIXN0cmNhc2VjbXAoYXJndltpXSsyLCAiYi0iKSkKCQkJewoJCQkJSW5zdGFsbFVJTGV2ZWwgPSBJTlNUQUxMVUlMRVZFTF9CQVNJQ3xJTlNUQUxMVUlMRVZFTF9QUk9HUkVTU09OTFk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uIFwiJXNcIiBmb3IgVUkgbGV2ZWxcbiIsIGFyZ3ZbaV0rMik7CgkJCX0KCQkJcmV0SW5zdGFsbFVJTGV2ZWwgPSBNc2lTZXRJbnRlcm5hbFVJKEluc3RhbGxVSUxldmVsLCBOVUxMKTsKCQkJaWYocmV0SW5zdGFsbFVJTGV2ZWwgPT0gSU5TVEFMTFVJTEVWRUxfTk9DSEFOR0UpCgkJCXsKCQkJCWZwcmludGYoc3RkZXJyLCAiU2V0dGluZyB0aGUgVUkgbGV2ZWwgdG8gMHgleCBmYWlsZWQuXG4iLCBJbnN0YWxsVUlMZXZlbCk7CgkJCQlFeGl0UHJvY2VzcygxKTsKCQkJfQoJCX0KCQllbHNlIGlmKCFzdHJjYXNlY21wKGFyZ3ZbaV0sICIveSIpKQoJCXsKCQkJRnVuY3Rpb25EbGxSZWdpc3RlclNlcnZlciA9IFRSVUU7CgkJCWkrKzsKCQkJaWYoaSA+PSBhcmdjKQoJCQkJU2hvd1VzYWdlKDEpOwoJCQlXSU5FX1RSQUNFKCJhcmd2WyVkXSA9ICVzXG4iLCBpLCBhcmd2W2ldKTsKCQkJRGxsTmFtZSA9IGFyZ3ZbaV07CgkJfQoJCWVsc2UgaWYoIXN0cmNhc2VjbXAoYXJndltpXSwgIi96IikpCgkJewoJCQlGdW5jdGlvbkRsbFVucmVnaXN0ZXJTZXJ2ZXIgPSBUUlVFOwoJCQlpKys7CgkJCWlmKGkgPj0gYXJnYykKCQkJCVNob3dVc2FnZSgxKTsKCQkJV0lORV9UUkFDRSgiYXJndlslZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CgkJCURsbE5hbWUgPSBhcmd2W2ldOwoJCX0KCQllbHNlIGlmKCFzdHJjYXNlY21wKGFyZ3ZbaV0sICIvaCIpIHx8ICFzdHJjYXNlY21wKGFyZ3ZbaV0sICIvPyIpKQoJCXsKCQkJU2hvd1VzYWdlKDApOwoJCX0KCQllbHNlIGlmKHN0cmNocihhcmd2W2ldLCAnPScpKQoJCXsKCQkJU3RyaW5nTGlzdEFwcGVuZCgmUHJvcGVydGllcywgYXJndltpXSk7CgkJCVN0cmluZ0xpc3RBcHBlbmQoJlByb3BlcnRpZXMsICIgIik7CgkJfQoJCWVsc2UKCQl7CgkJCUZ1bmN0aW9uSW5zdGFsbCA9IFRSVUU7CgkJCUdvdFByb2R1Y3RDb2RlID0gR2V0UHJvZHVjdENvZGUoYXJndltpXSwgJlBhY2thZ2VOYW1lLCAmUHJvZHVjdENvZGUpOwoJCX0KCX0KCglTdHJpbmdDb21wYXJlUmVtb3ZlTGFzdChQcm9wZXJ0aWVzLCAnICcpOwoJU3RyaW5nQ29tcGFyZVJlbW92ZUxhc3QoVHJhbnNmb3JtcywgJzsnKTsKCglpZihGdW5jdGlvbkluc3RhbGxBZG1pbiAmJiBGdW5jdGlvblBhdGNoKQoJCUZ1bmN0aW9uSW5zdGFsbCA9IEZBTFNFOwoKCWlmKEZ1bmN0aW9uSW5zdGFsbCkKCXsKCQlpZihHb3RQcm9kdWN0Q29kZSkKCQl7CgkJCVdJTkVfRklYTUUoIlByb2R1Y3QgY29kZSB0cmVhdG1lbnQgbm90IGltcGxlbWVudGVkIHlldFxuIik7CgkJCUV4aXRQcm9jZXNzKDEpOwoJCX0KCQllbHNlCgkJewoJCQlpZihNc2lJbnN0YWxsUHJvZHVjdEEoUGFja2FnZU5hbWUsIFByb3BlcnRpZXMpICE9IEVSUk9SX1NVQ0NFU1MpCgkJCXsKCQkJCWZwcmludGYoc3RkZXJyLCAiSW5zdGFsbGF0aW9uIG9mICVzICglcykgZmFpbGVkLlxuIiwgUGFja2FnZU5hbWUsIFByb3BlcnRpZXMpOwoJCQkJRXhpdFByb2Nlc3MoMSk7CgkJCX0KCQl9Cgl9CgllbHNlIGlmKEZ1bmN0aW9uUmVwYWlyKQoJewoJCWlmKEdvdFByb2R1Y3RDb2RlKQoJCXsKCQkJV0lORV9GSVhNRSgiUHJvZHVjdCBjb2RlIHRyZWF0bWVudCBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKCQkJRXhpdFByb2Nlc3MoMSk7CgkJfQoJCWVsc2UKCQl7CgkJCWlmKE1zaVJlaW5zdGFsbFByb2R1Y3RBKFBhY2thZ2VOYW1lLCBSZXBhaXJNb2RlKSAhPSBFUlJPUl9TVUNDRVNTKQoJCQl7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlJlcGFpciBvZiAlcyAoMHglMDhseCkgZmFpbGVkLlxuIiwgUGFja2FnZU5hbWUsIFJlcGFpck1vZGUpOwoJCQkJRXhpdFByb2Nlc3MoMSk7CgkJCX0KCQl9Cgl9CgllbHNlIGlmKEZ1bmN0aW9uQWR2ZXJ0aXNlKQoJewoJCWlmKE1zaUFkdmVydGlzZVByb2R1Y3RBKFBhY2thZ2VOYW1lLCAoTFBTVFIpIEFkdmVydGlzZU1vZGUsIFRyYW5zZm9ybXMsIExhbmd1YWdlKSAhPSBFUlJPUl9TVUNDRVNTKQoJCXsKCQkJZnByaW50ZihzdGRlcnIsICJBZHZlcnRpc2luZyBvZiAlcyAoJWx1LCAlcywgMHglMDR4KSBmYWlsZWQuXG4iLCBQYWNrYWdlTmFtZSwgQWR2ZXJ0aXNlTW9kZSwgVHJhbnNmb3JtcywgTGFuZ3VhZ2UpOwoJCQlFeGl0UHJvY2VzcygxKTsKCQl9Cgl9CgllbHNlIGlmKEZ1bmN0aW9uUGF0Y2gpCgl7CgkJaWYoTXNpQXBwbHlQYXRjaEEoUGF0Y2hGaWxlTmFtZSwgUGFja2FnZU5hbWUsIEluc3RhbGxUeXBlLCBQcm9wZXJ0aWVzKSAhPSBFUlJPUl9TVUNDRVNTKQoJCXsKCQkJZnByaW50ZihzdGRlcnIsICJQYXRjaGluZyB3aXRoICVzICglcywgJWQsICVzKVxuIiwgUGF0Y2hGaWxlTmFtZSwgUGFja2FnZU5hbWUsIEluc3RhbGxUeXBlLCBQcm9wZXJ0aWVzKTsKCQkJRXhpdFByb2Nlc3MoMSk7CgkJfQoJfQoJZWxzZSBpZihGdW5jdGlvbkRsbFJlZ2lzdGVyU2VydmVyKQoJewoJCURsbFJlZ2lzdGVyU2VydmVyKERsbE5hbWUpOwoJfQoJZWxzZSBpZihGdW5jdGlvbkRsbFVucmVnaXN0ZXJTZXJ2ZXIpCgl7CgkJRGxsVW5yZWdpc3RlclNlcnZlcihEbGxOYW1lKTsKCX0KCWVsc2UgaWYgKEZ1bmN0aW9uUmVnU2VydmVyKQoJewoJCVdJTkVfRklYTUUoICIvcmVnc2VydmVyIG5vdCBpbXBsZW1lbnRlZCB5ZXQsIGlnbm9yaW5nXG4iICk7Cgl9CgllbHNlIGlmIChGdW5jdGlvblVucmVnU2VydmVyKQoJewoJCVdJTkVfRklYTUUoICIvdW5yZWdzZXJ2ZXIgbm90IGltcGxlbWVudGVkIHlldCwgaWdub3JpbmdcbiIgKTsKCX0KCWVsc2UKCQlTaG93VXNhZ2UoMSk7CgoJcmV0dXJuIDA7Cn0K