LyoKICogCQkJCVNoZWxsIE9yZGluYWwgRnVuY3Rpb25zCiAqCiAqIFRoZXNlIGFyZSBjb21wbGV0ZWx5IHVuZG9jdW1lbnRlZC4gVGhlIG1lYW5pbmcgb2YgdGhlIGZ1bmN0aW9ucyBjaGFuZ2VzCiAqIGJldHdlZW4gZGlmZmVyZW50IE9TIHZlcnNpb25zIChOVCB1c2VzIFVuaWNvZGUgc3RyaW5ncywgOTUgdXNlcyBBU0NJSQogKiBzdHJpbmdzLCBldGMuIGV0Yy4pCiAqIAogKiBUaGV5IGFyZSBqdXN0IGhlcmUgc28gdGhhdCBleHBsb3Jlci5leGUgYW5kIGlleHBsb3JlLmV4ZSBjYW4gYmUgdGVzdGVkLgogKgogKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICogICAgICAgICAgIDE5OTggSvxyZ2VuIFNjaG1pZWQKICovCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgInNoZWxsLmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgIm5lZXhlLmgiCiNpbmNsdWRlICJyZXNvdXJjZS5oIgojaW5jbHVkZSAiZGxncy5oIgojaW5jbHVkZSAid2luLmgiCiNpbmNsdWRlICJncmFwaGljcy5oIgojaW5jbHVkZSAiY3Vyc29yaWNvbi5oIgojaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgojaW5jbHVkZSAic2hsb2JqLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnZlcnNpb24uaCIKI2luY2x1ZGUgInNoZWxsMzJfbWFpbi5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDaGFuZ2VOb3RpZnlSZWdpc3RlciBbU0hFTEwzMi4yXQogKiBOT1RFUwogKiAgIElkbGlzdCBpcyBhbiBhcnJheSBvZiBzdHJ1Y3R1cmVzIGFuZCBDb3VudCBzcGVjaWZpZXMgaG93IG1hbnkgaXRlbXMgaW4gdGhlIGFycmF5CiAqICAgKHVzdWFsbHkganVzdCBvbmUgSSB0aGluaykuCiAqLwpEV09SRCBXSU5BUEkKU0hDaGFuZ2VOb3RpZnlSZWdpc3RlcigKICAgIEhXTkQzMiBod25kLAogICAgTE9ORyBldmVudHMxLAogICAgTE9ORyBldmVudHMyLAogICAgRFdPUkQgbXNnLAogICAgaW50IGNvdW50LAogICAgSURTVFJVQ1QgKmlkbGlzdCkKewlGSVhNRShzaGVsbCwiKDB4JTA0eCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCwweCUwOHgsJXApOnN0dWIuXG4iLAoJCWh3bmQsZXZlbnRzMSxldmVudHMyLG1zZyxjb3VudCxpZGxpc3QpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDaGFuZ2VOb3RpZnlEZXJlZ2lzdGVyIFtTSEVMTDMyLjRdCiAqLwpEV09SRCBXSU5BUEkKU0hDaGFuZ2VOb3RpZnlEZXJlZ2lzdGVyKExPTkcgeDEsTE9ORyB4MikKewlGSVhNRShzaGVsbCwiKDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIseDEseDIpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhJc1Jvb3QgW1NIRUxMMzIuMjldCiAqLwpCT09MMzIgV0lOQVBJIFBhdGhJc1Jvb3QzMkEoTFBDU1RSIHgpCnsJVFJBQ0Uoc2hlbGwsIiVzXG4iLHgpOwoJaWYgKCooeCsxKT09JzonICYmICooeCsyKT09J1xcJykJCS8qICJYOlwiICovCgkgIHJldHVybiAxOwoJaWYgKCp4PT0nXFwnKQkJLyogIlwiICovCgkgIHJldHVybiAwOwoJaWYgKHhbMF09PSdcXCcgJiYgeFsxXT09J1xcJykJCS8qIFVOQyAiXFw8eHg+XCIgKi8KCXsgaW50CWZvdW5kYmFja3NsYXNoID0gMDsKCSAgeD14KzI7CgkgIHdoaWxlICgqeCkKCSAgeyBpZiAoKngrKz09J1xcJykKCSAgICAgIGZvdW5kYmFja3NsYXNoKys7CgkgIH0KCSAgaWYgKGZvdW5kYmFja3NsYXNoPD0xKQkvKiBtYXggMSBcIG1vcmUgLi4uICovCgkgICAgcmV0dXJuIDE7Cgl9CglyZXR1cm4gMDsKfQpCT09MMzIgV0lOQVBJIFBhdGhJc1Jvb3QzMlcoTFBDV1NUUiB4KSAKewlUUkFDRShzaGVsbCwiJXNcbiIsZGVidWdzdHJfdyh4KSk7CglpZiAoKih4KzEpPT0nOicgJiYgKih4KzIpPT0nXFwnKQkJLyogIlg6XCIgKi8KCSAgcmV0dXJuIDE7CglpZiAoKnggPT0gKFdDSEFSKSAnXFwnKQkJLyogIlwiICovCgkgIHJldHVybiAwOwoJaWYgKHhbMF09PShXQ0hBUiknXFwnICYmIHhbMV09PShXQ0hBUiknXFwnKQkvKiBVTkMgIlxcPHh4PlwiICovCgl7IGludAlmb3VuZGJhY2tzbGFzaCA9IDA7CgkgIHg9eCsyOwoJICB3aGlsZSAoKngpIAoJICB7IGlmICgqeCsrPT0oV0NIQVIpJ1xcJykKCSAgICAgIGZvdW5kYmFja3NsYXNoKys7CgkgIH0KCSAgaWYgKGZvdW5kYmFja3NsYXNoPD0xKQkvKiBtYXggMSBcIG1vcmUgLi4uICovCgkgICAgcmV0dXJuIDE7Cgl9CglyZXR1cm4gMDsKfQpCT09MMzIgV0lOQVBJIFBhdGhJc1Jvb3QzMkFXKExQQ1ZPSUQgeCkgCnsJaWYgKFZFUlNJT05fT3NJc1VuaWNvZGUoKSkKCSAgcmV0dXJuIFBhdGhJc1Jvb3QzMlcoeCk7CglyZXR1cm4gUGF0aElzUm9vdDMyQSh4KTsKCn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEJ1aWxkUm9vdCBbU0hFTEwzMi4zMF0KICovCkxQU1RSIFdJTkFQSSBQYXRoQnVpbGRSb290KExQU1RSIHJvb3QsQllURSBkcml2ZSkgewogIFRSQUNFKHNoZWxsLCIlcCAlaVxuIixyb290LCBkcml2ZSk7CglzdHJjcHkocm9vdCwiQTpcXCIpOwoJcm9vdFswXSs9ZHJpdmU7CglyZXR1cm4gcm9vdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEZpbmRFeHRlbnNpb24gW1NIRUxMMzIuMzFdCiAqCiAqIE5PVEVTCiAqICAgICByZXR1cm5zIHBvaW50ZXIgdG8gbGFzdCAuIGluIGxhc3QgcGF0aGNvbXBvbmVudCBvciBhdCBcMC4KICovCkxQQ1NUUiBXSU5BUEkgUGF0aEZpbmRFeHRlbnNpb24zMkEoTFBDU1RSIHBhdGgpIAp7CUxQQ1NUUiAgIGxhc3Rwb2ludCA9IE5VTEw7CglUUkFDRShzaGVsbCwiJXAgJXNcbiIscGF0aCxwYXRoKTsKCXdoaWxlICgqcGF0aCkgCgl7IGlmICgqcGF0aD09J1xcJ3x8KnBhdGg9PScgJykKCSAgICBsYXN0cG9pbnQ9TlVMTDsKCSAgaWYgKCpwYXRoPT0nLicpCgkgICAgbGFzdHBvaW50PXBhdGg7CgkgIHBhdGgrKzsKCX0KCXJldHVybiBsYXN0cG9pbnQ/bGFzdHBvaW50OnBhdGg7Cn0KTFBDV1NUUiBXSU5BUEkgUGF0aEZpbmRFeHRlbnNpb24zMlcoTFBDV1NUUiBwYXRoKSAKewlMUENXU1RSICAgbGFzdHBvaW50ID0gTlVMTDsKCVRSQUNFKHNoZWxsLCIlcCBMJXNcbiIscGF0aCxkZWJ1Z3N0cl93KHBhdGgpKTsKCXdoaWxlICgqcGF0aCkKCXsgaWYgKCpwYXRoPT0oV0NIQVIpJ1xcJ3x8KnBhdGg9PShXQ0hBUiknICcpCgkgICAgbGFzdHBvaW50PU5VTEw7CgkgIGlmICgqcGF0aD09KFdDSEFSKScuJykKCSAgICBsYXN0cG9pbnQ9cGF0aDsKCSAgcGF0aCsrOwoJfQoJcmV0dXJuIGxhc3Rwb2ludD9sYXN0cG9pbnQ6cGF0aDsKfQpMUENWT0lEIFdJTkFQSSBQYXRoRmluZEV4dGVuc2lvbjMyQVcoTFBDVk9JRCBwYXRoKSAKewlpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gUGF0aEZpbmRFeHRlbnNpb24zMlcocGF0aCk7CglyZXR1cm4gUGF0aEZpbmRFeHRlbnNpb24zMkEocGF0aCk7Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoQWRkQmFja3NsYXNoIFtTSEVMTDMyLjMyXQogKiAKICogTk9URVMKICogICAgIGFwcGVuZCBcIGlmIHRoZXJlIGlzIG5vbmUKICovCkxQU1RSIFdJTkFQSSBQYXRoQWRkQmFja3NsYXNoMzJBKExQU1RSIHBhdGgpCnsJaW50IGxlbjsKCVRSQUNFKHNoZWxsLCIlcC0+JXNcbiIscGF0aCxwYXRoKTsKCglsZW4gPSBzdHJsZW4ocGF0aCk7CglpZiAobGVuICYmIHBhdGhbbGVuLTFdIT0nXFwnKSAKCXsgcGF0aFtsZW5dICA9ICdcXCc7CgkgIHBhdGhbbGVuKzFdPSAweDAwOwoJICByZXR1cm4gcGF0aCtsZW4rMTsKCX0KCXJldHVybiBwYXRoK2xlbjsKfQpMUFdTVFIgV0lOQVBJIFBhdGhBZGRCYWNrc2xhc2gzMlcoTFBXU1RSIHBhdGgpCnsJaW50IGxlbjsKCVRSQUNFKHNoZWxsLCIlcC0+JXNcbiIscGF0aCxkZWJ1Z3N0cl93KHBhdGgpKTsKCglsZW4gPSBsc3RybGVuMzJXKHBhdGgpOwoJaWYgKGxlbiAmJiBwYXRoW2xlbi0xXSE9KFdDSEFSKSdcXCcpIAoJeyBwYXRoW2xlbl0gID0gKFdDSEFSKSdcXCc7CgkgIHBhdGhbbGVuKzFdPSAweDAwOwoJICByZXR1cm4gcGF0aCtsZW4rMTsKCX0KCXJldHVybiBwYXRoK2xlbjsKfQpMUFZPSUQgV0lOQVBJIFBhdGhBZGRCYWNrc2xhc2gzMkFXKExQVk9JRCBwYXRoKQp7CWlmKFZFUlNJT05fT3NJc1VuaWNvZGUoKSkKCSAgcmV0dXJuIFBhdGhBZGRCYWNrc2xhc2gzMlcocGF0aCk7CglyZXR1cm4gUGF0aEFkZEJhY2tzbGFzaDMyQShwYXRoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aFJlbW92ZUJsYW5rcyBbU0hFTEwzMi4zM10KICogCiAqIE5PVEVTCiAqICAgICByZW1vdmUgc3BhY2VzIGZyb20gYmVnaW5uaW5nIGFuZCBlbmQgb2YgcGFzc2VkIHN0cmluZwogKi8KTFBTVFIgV0lOQVBJIFBhdGhSZW1vdmVCbGFua3MoTFBTVFIgc3RyKQp7IExQU1RSIHggPSBzdHI7CiAgVFJBQ0Uoc2hlbGwsIiVzXG4iLHN0cik7CiAgd2hpbGUgKCp4PT0nICcpIHgrKzsKICBpZiAoeCE9c3RyKQoJICBzdHJjcHkoc3RyLHgpOwogIGlmICghKnN0cikKCSAgcmV0dXJuIHN0cjsKICB4PXN0citzdHJsZW4oc3RyKS0xOwogIHdoaWxlICgqeD09JyAnKQoJICB4LS07CiAgaWYgKCp4PT0nICcpCgkgICp4PSdcMCc7CiAgcmV0dXJuIHg7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoRmluZEZpbGVuYW1lIFtTSEVMTDMyLjM0XQogKiAKICogTk9URVMKICogICAgIGJhc2VuYW1lKGNoYXIgKmZuKTsKICovCkxQVk9JRCBXSU5BUEkgUGF0aEZpbmRGaWxlbmFtZShMUFZPSUQgZm4pCnsJTFBTVFIgYXNsYXNoLGFwdHI7CglMUFdTVFIgd3NsYXNoLHdwdHI7CgkKCWlmKFZFUlNJT05fT3NJc1VuaWNvZGUoKSkKCXsgd3NsYXNoID0gd3B0ciA9IChMUFdTVFIpIGZuOwoJICBUUkFDRShzaGVsbCwiTCVzXG4iLGRlYnVnc3RyX3cod3NsYXNoKSk7CgkgIHdoaWxlICh3cHRyWzBdKSAKCSAgeyBpZiAoKCh3cHRyWzBdPT0nXFwnKSB8fCAod3B0clswXT09JzonKSkgJiYgd3B0clsxXSAmJiB3cHRyWzFdIT0nXFwnKQoJICAgICAgd3NsYXNoID0gd3B0cisxOwoJICAgIHdwdHIrKzsKCSAgfQoJICByZXR1cm4gKExQVk9JRCkgd3NsYXNoOwoJfQoJYXNsYXNoID0gYXB0ciA9IChMUFNUUikgZm47CglUUkFDRShzaGVsbCwiJXNcbiIsYXNsYXNoKTsKCXdoaWxlIChhcHRyWzBdKSAKCXsgaWYgKCgoYXB0clswXT09J1xcJykgfHwgKGFwdHJbMF09PSc6JykpICYmIGFwdHJbMV0gJiYgYXB0clsxXSE9J1xcJykKCSAgICAgIGFzbGFzaCA9IGFwdHIrMTsKCSAgICBhcHRyKys7Cgl9CglyZXR1cm4gKExQVk9JRCkgYXNsYXNoOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoUmVtb3ZlRmlsZVNwZWMgW1NIRUxMMzIuMzVdCiAqIAogKiBOT1RFUwogKiAgICAgYm9vbCBnZXRwYXRoKGNoYXIgKnBhdGhuYW1lKTsgdHJ1bmNhdGVzIHBhc3NlZCBhcmd1bWVudCB0byBhIHZhbGlkIHBhdGgKICogICAgIHJldHVybnMgaWYgdGhlIHN0cmluZyB3YXMgbW9kaWZpZWQgb3Igbm90LgogKiAgICAgIlxmb29ceHhcZm9vIi0+ICJcZm9vXHh4IgogKiAgICAgIlwiIC0+ICJcIgogKiAgICAgImE6XGZvbyIJLT4gImE6XCIKICovCkRXT1JEIFdJTkFQSSBQYXRoUmVtb3ZlRmlsZVNwZWMoTFBTVFIgZm4pIHsKCUxQU1RSCXgsY3V0cGxhY2U7CiAgVFJBQ0Uoc2hlbGwsIiVzXG4iLGZuKTsKCWlmICghZm5bMF0pCgkJcmV0dXJuIDA7Cgl4PWZuOwoJY3V0cGxhY2UgPSBmbjsKCXdoaWxlICgqeCkgewoJCWlmICgqeD09J1xcJykgewoJCQljdXRwbGFjZT14Kys7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoKng9PSc6JykgewoJCQl4Kys7CgkJCWlmICgqeD09J1xcJykKCQkJCWN1dHBsYWNlPSsreDsKCQkJY29udGludWU7IC8qIGFscmVhZHkgeCsrZWQgKi8KCQl9CgkJeCsrOwoJfQoJaWYgKCEqY3V0cGxhY2UpCgkJcmV0dXJuIDA7CglpZiAoY3V0cGxhY2U9PWZuKSB7CgkJaWYgKGZuWzBdPT0nXFwnKSB7CgkJCWlmICghZm5bMV0pCgkJCQlyZXR1cm4gMDsKCQkJZm5bMF09J1wwJzsKCQkJcmV0dXJuIDE7CgkJfQoJfQoJKmN1dHBsYWNlPSdcMCc7CglyZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEFwcGVuZCBbU0hFTEwzMi4zNl0KICogCiAqIE5PVEVTCiAqICAgICBjb25jYXRfcGF0aHMoY2hhcip0YXJnZXQsY29uc3QgY2hhciphZGQpOwogKiAgICAgY29uY2F0cyAidGFyZ2V0XFxhZGQiIGFuZCB3cml0ZXMgdGhlbSB0byB0YXJnZXQKICovCkxQU1RSIFdJTkFQSSBQYXRoQXBwZW5kKExQU1RSIHgxLExQU1RSIHgyKSB7CiAgVFJBQ0Uoc2hlbGwsIiVzICVzXG4iLHgxLHgyKTsKICB3aGlsZSAoeDJbMF09PSdcXCcpIHgyKys7CiAgcmV0dXJuIFBhdGhDb21iaW5lMzJBKHgxLHgxLHgyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aENvbWJpbmUgW1NIRUxMMzIuMzddCiAqIAogKiBOT1RFUwogKiAgaWYgbHBzekZpbGU9Jy4nIHNraXAgaXQKICogIHN6RGVzdCBjYW4gYmUgZXF1YWwgdG8gbHBzekZpbGUuIFRoYXRzIHdoeSB3ZSB1c2Ugc1RlbXAKICovCkxQU1RSIFdJTkFQSSBQYXRoQ29tYmluZTMyQShMUFNUUiBzekRlc3QsIExQQ1NUUiBscHN6RGlyLCBMUENTVFIgbHBzekZpbGUpIAp7CWNoYXIgc1RlbXBbTUFYX1BBVEhdOwoJVFJBQ0Uoc2hlbGwsIiVwICVwLT4lcyAlcC0+JXNcbiIsc3pEZXN0LCBscHN6RGlyLCBscHN6RGlyLCBscHN6RmlsZSwgbHBzekZpbGUpOwoJCgkKCWlmICghbHBzekZpbGUgfHwgIWxwc3pGaWxlWzBdIHx8IChscHN6RmlsZVswXT09Jy4nICYmICFscHN6RmlsZVsxXSkgKSAKCXsgc3RyY3B5KHN6RGVzdCxscHN6RGlyKTsKCSAgcmV0dXJuIHN6RGVzdDsKCX0KCgkvKiAgaWYgbHBzekZpbGUgaXMgYSBjb21wbGV0ZSBwYXRoIGRvbid0IGNhcmUgYWJvdXQgbHBzekRpciAqLwoJaWYgKFBhdGhJc1Jvb3QzMkEobHBzekZpbGUpKQoJeyBzdHJjcHkoc3pEZXN0LGxwc3pGaWxlKTsKCX0KCXN0cmNweShzVGVtcCxscHN6RGlyKTsKCVBhdGhBZGRCYWNrc2xhc2gzMkEoc1RlbXApOwoJc3RyY2F0KHNUZW1wLGxwc3pGaWxlKTsKCXN0cmNweShzekRlc3Qsc1RlbXApOwoJcmV0dXJuIHN6RGVzdDsKfQpMUFdTVFIgV0lOQVBJIFBhdGhDb21iaW5lMzJXKExQV1NUUiBzekRlc3QsIExQQ1dTVFIgbHBzekRpciwgTFBDV1NUUiBscHN6RmlsZSkgCnsJV0NIQVIgc1RlbXBbTUFYX1BBVEhdOwoJVFJBQ0Uoc2hlbGwsIiVwICVwLT4lcyAlcC0+JXNcbiIsc3pEZXN0LCBscHN6RGlyLCBkZWJ1Z3N0cl93KGxwc3pEaXIpLAoJCQkgbHBzekZpbGUsIGRlYnVnc3RyX3cobHBzekZpbGUpKTsKCQoJCglpZiAoIWxwc3pGaWxlIHx8ICFscHN6RmlsZVswXSB8fCAobHBzekZpbGVbMF09PShXQ0hBUiknLicgJiYgIWxwc3pGaWxlWzFdKSApIAoJeyBsc3RyY3B5MzJXKHN6RGVzdCxscHN6RGlyKTsKCSAgcmV0dXJuIHN6RGVzdDsKCX0KCgkvKiAgaWYgbHBzekZpbGUgaXMgYSBjb21wbGV0ZSBwYXRoIGRvbid0IGNhcmUgYWJvdXQgbHBzekRpciAqLwoJaWYgKFBhdGhJc1Jvb3QzMlcobHBzekZpbGUpKQoJeyBsc3RyY3B5MzJXKHN6RGVzdCxscHN6RmlsZSk7Cgl9Cglsc3RyY3B5MzJXKHNUZW1wLGxwc3pEaXIpOwoJUGF0aEFkZEJhY2tzbGFzaDMyVyhzVGVtcCk7Cglsc3RyY2F0MzJXKHNUZW1wLGxwc3pGaWxlKTsKCWxzdHJjcHkzMlcoc3pEZXN0LHNUZW1wKTsKCXJldHVybiBzekRlc3Q7Cn0KTFBWT0lEIFdJTkFQSSBQYXRoQ29tYmluZTMyQVcoTFBWT0lEIHN6RGVzdCwgTFBDVk9JRCBscHN6RGlyLCBMUENWT0lEIGxwc3pGaWxlKSAKewlpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gUGF0aENvbWJpbmUzMlcoIHN6RGVzdCwgbHBzekRpciwgbHBzekZpbGUgKTsKCXJldHVybiBQYXRoQ29tYmluZTMyQSggc3pEZXN0LCBscHN6RGlyLCBscHN6RmlsZSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoSXNVTkMgW1NIRUxMMzIuMzldCiAqIAogKiBOT1RFUwogKiAgICAgUGF0aElzVU5DKGNoYXIqcGF0aCk7CiAqLwpCT09MMzIgV0lOQVBJIFBhdGhJc1VOQyhMUENTVFIgcGF0aCkgewogIFRSQUNFKHNoZWxsLCIlc1xuIixwYXRoKTsKCWlmICgocGF0aFswXT09J1xcJykgJiYgKHBhdGhbMV09PSdcXCcpKQoJCXJldHVybiBUUlVFOwoJcmV0dXJuIEZBTFNFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBQYXRoSXNFeGUgW1NIRUxMMzIuNDNdCiAqIAogKi8KQk9PTDMyIFdJTkFQSSBQYXRoSXNFeGUgKExQQ1NUUiBwYXRoKQp7ICBUUkFDRShzaGVsbCwicGF0aD0lc1xuIixwYXRoKTsKICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEZpbGVFeGlzdHMgW1NIRUxMMzIuNDVdCiAqIAogKiBOT1RFUwogKiAgICAgZmlsZV9leGlzdHMoY2hhciAqZm4pOwogKi8KQk9PTDMyIFdJTkFQSSBQYXRoRmlsZUV4aXN0cyhMUFNUUiBmbikgewogIFRSQUNFKHNoZWxsLCIlc1xuIixmbik7CiAgIGlmIChHZXRGaWxlQXR0cmlidXRlczMyQShmbik9PS0xKQogICAgCXJldHVybiBGQUxTRTsKICAgIGVsc2UKICAgIAlyZXR1cm4gVFJVRTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoTWF0Y2hTcGVjIFtTSEVMTDMyLjQ2XQogKiAKICogTk9URVMKICogICAgIHVzZWQgZnJvbSBDT01ETEczMgogKi8KCkJPT0wzMiBXSU5BUEkgUGF0aE1hdGNoU3BlYyhMUFNUUiB4LCBMUFNUUiB5KSAKewlGSVhNRShzaGVsbCwiJXMgJXMgc3R1YlxuIix4LHkpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhSZXNvbHZlIFtTSEVMTDMyLjUxXQogKi8KRFdPUkQgV0lOQVBJIFBhdGhSZXNvbHZlKExQQ1NUUiBzLERXT1JEIHgyLERXT1JEIHgzKSB7CglGSVhNRShzaGVsbCwiKCVzLDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIscyx4Mix4Myk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aEdldEFyZ3MgW1NIRUxMMzIuNTJdCiAqCiAqIE5PVEVTCiAqICAgICBsb29rIGZvciBuZXh0IGFyZyBpbiBzdHJpbmcuIGhhbmRsZSAicXVvdGVkIiBzdHJpbmdzCiAqICAgICByZXR1cm5zIHBvaW50ZXIgdG8gYXJndW1lbnQgKkFGVEVSKiB0aGUgc3BhY2UuIE9yIHRvIHRoZSBcMC4KICovCkxQVk9JRCBXSU5BUEkgUGF0aEdldEFyZ3MoTFBWT0lEIGNtZGxpbmUpIAp7CUJPT0wzMglxZmxhZyA9IEZBTFNFOwoJTFBXU1RSIHdwdHI7CglMUFNUUiBhcHRyOwoJCglpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJeyBUUkFDRShzaGVsbCwiJXNMXG4iLGRlYnVnc3RyX3coKExQV1NUUiljbWRsaW5lKSk7CgkgIHdwdHI9KExQV1NUUikgY21kbGluZTsKCSAgd2hpbGUgKCp3cHRyKSAKCSAgeyBpZiAoKCp3cHRyPT0nICcpICYmICFxZmxhZykKCQlyZXR1cm4gd3B0cisxOwoJICAgIGlmICgqd3B0cj09JyInKQoJCXFmbGFnPSFxZmxhZzsKCSAgICB3cHRyKys7CgkgIH0KCSAgcmV0dXJuIChMUFZPSUQpIHdwdHI7Cgl9CglUUkFDRShzaGVsbCwiJXNcbiIsKExQU1RSKWNtZGxpbmUpOwoJYXB0cj0oTFBTVFIpIGNtZGxpbmU7Cgl3aGlsZSAoKmFwdHIpIAoJeyBpZiAoKCphcHRyPT0nICcpICYmICFxZmxhZykKCSAgICByZXR1cm4gYXB0cisxOwoJICBpZiAoKmFwdHI9PSciJykKCSAgICBxZmxhZz0hcWZsYWc7CgkgIGFwdHIrKzsKCX0KCXJldHVybiAoTFBWT0lEKSBhcHRyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoVW5xdW90ZVNwYWNlcyBbU0hFTEwzMi41Nl0KICogCiAqIE5PVEVTCiAqICAgICB1bnF1b3RlIHN0cmluZyAocmVtb3ZlICIpCiAqLwpWT0lEIFdJTkFQSSBQYXRoVW5xdW90ZVNwYWNlcyhMUFNUUiBzdHIpIHsKICAgIERXT1JEICAgICAgbGVuID0gbHN0cmxlbjMyQShzdHIpOwogICAgVFJBQ0Uoc2hlbGwsIiVzXG4iLHN0cik7CiAgICBpZiAoKnN0ciE9JyInKSByZXR1cm47CiAgICBpZiAoc3RyW2xlbi0xXSE9JyInKSByZXR1cm47CiAgICBzdHJbbGVuLTFdPSdcMCc7CiAgICBsc3RyY3B5MzJBKHN0cixzdHIrMSk7CiAgICByZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhcnNlRmllbGQgW1NIRUxMMzIuNThdCiAqCiAqLwpEV09SRCBXSU5BUEkgUGFyc2VGaWVsZChMUENTVFIgc3JjLERXT1JEIHgyLExQU1RSIHRhcmdldCxEV09SRCBwYXRobGVuKSB7CglGSVhNRShzaGVsbCwiKCVzLDB4JTA4bHgsJXAsJWxkKTpzdHViLlxuIiwKCQlzcmMseDIsdGFyZ2V0LHBhdGhsZW4KCSk7CglpZiAoIXNyYykKCQlyZXR1cm4gMDsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQaWNrSWNvbkRsZyBbU0hFTEwzMi42Ml0KICogCiAqLwpEV09SRCBXSU5BUEkgUGlja0ljb25EbGcoRFdPUkQgeCxEV09SRCB5LERXT1JEIHosRFdPUkQgYSkgewoJRklYTUUoc2hlbGwsIiglMDhseCwlMDhseCwlMDhseCwlMDhseCk6c3R1Yi5cbiIseCx5LHosYSk7CglyZXR1cm4gMHhmZmZmZmZmZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR2V0RmlsZU5hbWVGcm9tQnJvd3NlIFtTSEVMTDMyLjYzXQogKiAKICovCkRXT1JEIFdJTkFQSSBHZXRGaWxlTmFtZUZyb21Ccm93c2UoSFdORDMyIGhvd25lciwgTFBTVFIgdGFyZ2V0YnVmLCBEV09SRCBsZW4sIERXT1JEIHgsIExQQ1NUUiBzdWZmaXgsIExQQ1NUUiB5LCBMUENTVFIgY21kKSB7CiAgICBGSVhNRShzaGVsbCwiKCUwNHgsJXAsJWxkLCUwOGx4LCVzLCVzLCVzKTpzdHViLlxuIiwKCSAgICBob3duZXIsdGFyZ2V0YnVmLGxlbix4LHN1ZmZpeCx5LGNtZAogICAgKTsKICAgIC8qIHB1dHMgdXAgYSBPcGVuIERpYWxvZyBhbmQgcmVxdWVzdHMgaW5wdXQgaW50byB0YXJnZXRidWYgKi8KICAgIC8qIE9GTl9ISURFUkVBRE9OTFl8T0ZOX05PQ0hBTkdFRElSfE9GTl9GSUxFTVVTVEVYSVNUfE9GTl91bmtub3duICovCiAgICBsc3RyY3B5MzJBKHRhcmdldGJ1ZiwieDpcXHMzLmV4ZSIpOwogICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0U2V0dGluZ3MgW1NIRUxMMzIuNjhdCiAqIAogKi8KRFdPUkQgV0lOQVBJIFNIR2V0U2V0dGluZ3MoRFdPUkQgeCxEV09SRCB5LERXT1JEIHopIHsKCUZJWE1FKHNoZWxsLCIoMHglMDhseCwweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLAoJCXgseSx6CgkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsX0dldENhY2hlZEltYWdlSW5kZXggW1NIRUxMMzIuNzJdCiAqCiAqLwp2b2lkIFdJTkFQSSBTaGVsbF9HZXRDYWNoZWRJbWFnZUluZGV4KExQVk9JRCB4LERXT1JEIHksRFdPUkQgeikgCnsJaWYoIFZFUlNJT05fT3NJc1VuaWNvZGUoKSkKCXsgRklYTUUoc2hlbGwsIihMJXMsJTA4bHgsJTA4bHgpOnN0dWIuXG4iLGRlYnVnc3RyX3coKExQV1NUUil4KSx5LHopOwoJfQoJZWxzZQoJeyBGSVhNRShzaGVsbCwiKCVzLCUwOGx4LCUwOGx4KTpzdHViLlxuIixkZWJ1Z3N0cl9hKChMUFNUUil4KSx5LHopOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNoZWxsRm9sZGVyVmlld19NZXNzYWdlIFtTSEVMTDMyLjczXQogKgogKiBQQVJBTUVURVJTCiAqICBod25kQ2FiaW5ldCBkZWZpbmVzIHRoZSBleHBsb3JlciBjYWJpbmV0IHdpbmRvdyB0aGF0IGNvbnRhaW5zIHRoZSAKICogICAgICAgICAgICAgIHNoZWxsdmlldyB5b3UgbmVlZCB0byBjb21tdW5pY2F0ZSB3aXRoCiAqICB1TXNnICAgICAgICBpZGVudGlmeWluZyB0aGUgU0ZWTSBlbnVtIHRvIHBlcmZvcm0KICogIGxQYXJhbQogKgogKiBOT1RFUwogKiAgTWVzc2FnZSBTRlZNX1JFQVJSQU5HRSA9IDEKICogICAgVGhpcyBtZXNzYWdlIGdldHMgc2VudCB3aGVuIGEgY29sdW1uIGdldHMgY2xpY2tlZCB0byBpbnN0cnVjdCB0aGUKICogICAgc2hlbGwgdmlldyB0byByZS1zb3J0IHRoZSBpdGVtIGxpc3QuIGxQYXJhbSBpZGVudGlmaWVzIHRoZSBjb2x1bW4KICogICAgdGhhdCB3YXMgY2xpY2tlZC4KICovCmludCBXSU5BUEkgU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZShIV05EMzIgaHduZENhYmluZXQsVUlOVDMyIHVNc2csTFBBUkFNIGxQYXJhbSkKeyBGSVhNRShzaGVsbCwiJTA0eCAlMDh1eCAlMDhseCBzdHViXG4iLGh3bmRDYWJpbmV0LHVNc2csbFBhcmFtKTsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGF0aFlldEFub3RoZXJNYWtlVW5pcXVlTmFtZSBbU0hFTEwzMi43NV0KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpCT09MMzIgV0lOQVBJIFBhdGhZZXRBbm90aGVyTWFrZVVuaXF1ZU5hbWUoTFBEV09SRCB4LExQRFdPUkQgeSkgewogICAgRklYTUUoc2hlbGwsIiglcCwlcCk6c3R1Yi5cbiIseCx5KTsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSE1hcFBJRExUb1N5c3RlbUltYWdlTGlzdEluZGV4IFtTSEVMTDMyLjc3XQogKgogKiBQQVJBTUVURVJTCiAqIHggIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgSVNoZWxsRm9sZGVyIAogKiAKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICoKICovCkRXT1JEIFdJTkFQSQpTSE1hcFBJRExUb1N5c3RlbUltYWdlTGlzdEluZGV4KExQU0hFTExGT0xERVIgc2gsRFdPUkQgeSxEV09SRCB6KQp7IEZJWE1FKHNoZWxsLCIoU0Y9JXAscGlkbD0lMDhseCwlMDhseCk6c3R1Yi5cbiIsc2gseSx6KTsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT2xlU3RyVG9TdHJOICBbU0hFTEwzMi43OF0KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqIEZJWE1FCiAqICB3cm9uZyBpbXBsZW1lbnRlZCBPbGVTdHIgaXMgTk9UIHdpZGUgc3RyaW5nICEhISEgKGpzY2gpCiAqLwpCT09MMzIgV0lOQVBJCk9sZVN0clRvU3RyTiAoTFBTVFIgbHBNdWx0aSwgSU5UMzIgbk11bHRpLCBMUENXU1RSIGxwV2lkZSwgSU5UMzIgbldpZGUpIHsKICAgIHJldHVybiBXaWRlQ2hhclRvTXVsdGlCeXRlICgwLCAwLCBscFdpZGUsIG5XaWRlLAogICAgICAgIGxwTXVsdGksIG5NdWx0aSwgTlVMTCwgTlVMTCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0clRvT2xlU3RyTiAgW1NIRUxMMzIuNzldCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqIEZJWE1FCiAqICB3cm9uZyBpbXBsZW1lbnRlZCBPbGVTdHIgaXMgTk9UIHdpZGUgc3RyaW5nICEhISEgKGpzY2gpCiovCkJPT0wzMiBXSU5BUEkKU3RyVG9PbGVTdHJOIChMUFdTVFIgbHBXaWRlLCBJTlQzMiBuV2lkZSwgTFBDU1RSIGxwTXVsdGksIElOVDMyIG5NdWx0aSkgewogICAgcmV0dXJuIE11bHRpQnl0ZVRvV2lkZUNoYXIgKDAsIDAsIGxwTXVsdGksIG5NdWx0aSwgbHBXaWRlLCBuV2lkZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2xvbmVTcGVjaWFsSURMaXN0IFtTSEVMTDMyLjg5XQogKiAKICogUEFSQU1FVEVSUwogKiAgaHduZE93bmVyIAlbaW5dIAogKiAgbkZvbGRlciAJW2luXQlDU0lETF94eHh4eCA/PwogKgogKiBSRVRVUk5TCiAqICBwaWRsID8/CiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpMUElURU1JRExJU1QgV0lOQVBJIFNIQ2xvbmVTcGVjaWFsSURMaXN0KEhXTkQzMiBod25kT3duZXIsRFdPUkQgbkZvbGRlcixEV09SRCB4MykKewlMUElURU1JRExJU1QgcHBpZGw7CglXQVJOKHNoZWxsLCIoaHduZD0weCV4LGNzaWRsPTB4JWx4LDB4JWx4KTpzZW1pLXN0dWIuXG4iLAoJCQkJCSBod25kT3duZXIsbkZvbGRlcix4Myk7CgoJU0hHZXRTcGVjaWFsRm9sZGVyTG9jYXRpb24oaHduZE93bmVyLCBuRm9sZGVyLCAmcHBpZGwpOwoKCXJldHVybiBwcGlkbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSXNMRk5Ecml2ZSBbU0hFTEwzMi4xMTldCiAqIAogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbCBOYW1lCiAqLwpCT09MMzIgV0lOQVBJIElzTEZORHJpdmUoTFBDU1RSIHBhdGgpIHsKICAgIERXT1JECWZubGVuOwoKICAgIGlmICghR2V0Vm9sdW1lSW5mb3JtYXRpb24zMkEocGF0aCxOVUxMLDAsTlVMTCwmZm5sZW4sTlVMTCxOVUxMLDApKQoJcmV0dXJuIEZBTFNFOwogICAgcmV0dXJuIGZubGVuPjEyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldFNwZWNpYWxGb2xkZXJQYXRoIFtTSEVMTDMyLjE3NV0KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwp2b2lkIFdJTkFQSSBTSEdldFNwZWNpYWxGb2xkZXJQYXRoKERXT1JEIHgxLERXT1JEIHgyLERXT1JEIHgzLERXT1JEIHg0KSB7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA0bHgsMHglMDRseCxjc2lkbD0weCUwNGx4LDB4JTA0bHgpOnN0dWIuXG4iLAogICAgICB4MSx4Mix4Myx4NAogICAgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUmVnaXN0ZXJTaGVsbEhvb2sgW1NIRUxMMzIuMTgxXQogKgogKiBQQVJBTVMKICogICAgICBod25kIFtJXSAgd2luZG93IGhhbmRsZQogKiAgICAgIHkgICAgW0ldICBmbGFnID8/Pz8KICogCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwp2b2lkIFdJTkFQSSBSZWdpc3RlclNoZWxsSG9vazMyKEhXTkQzMiBod25kLCBEV09SRCB5KSB7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA4eCwweCUwOGx4KTpzdHViLlxuIixod25kLHkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hBIFtTSEVMTDMyLjE4M10KICoKICogRm9ybWF0IGFuZCBvdXRwdXQgZXJyb3JtZXNzYWdlLgogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8Kdm9pZCBfX2NkZWNsClNoZWxsTWVzc2FnZUJveEEoSE1PRFVMRTMyIGhtb2QsSFdORDMyIGh3bmQsRFdPUkQgaWQsRFdPUkQgeCxEV09SRCB0eXBlLExQVk9JRCBhcmdsaXN0KSB7CgljaGFyCWJ1ZlsxMDBdLGJ1ZjJbMTAwXS8qLCpidWYzKi87Ci8qCUxQVk9JRAlhcmdzID0gJmFyZ2xpc3Q7Ki8KCglpZiAoIUxvYWRTdHJpbmczMkEoaG1vZCx4LGJ1ZiwxMDApKQoJCXN0cmNweShidWYsIkRlc2t0b3AiKTsKLy8JTG9hZFN0cmluZzMyQShobW9kLGlkLGJ1ZjIsMTAwKTsKCS8qIEZJWE1FOiB0aGUgdmFyYXJncyBoYW5kbGluZyBkb2Vzbid0LiAqLwovLwlGb3JtYXRNZXNzYWdlMzJBKDB4NTAwLGJ1ZjIsMCwwLChMUFNUUikmYnVmMywyNTYsKExQRFdPUkQpJmFyZ3MpOwoKCUZJWE1FKHNoZWxsLCIoJTA4bHgsJTA4bHgsJTA4bHgoJXMpLCUwOGx4KCVzKSwlMDhseCwlcCk6c3R1Yi5cbiIsCgkJKERXT1JEKWhtb2QsKERXT1JEKWh3bmQsaWQsYnVmMix4LGJ1Zix0eXBlLGFyZ2xpc3QKCSk7CgkvKk1lc3NhZ2VCb3gzMkEoaHduZCxidWYzLGJ1ZixpZHwweDEwMDAwKTsqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlc3RyaWN0ZWQgW1NIRUxMMzIuMTAwXQogKgogKiB3YWxrcyB0aHJvdWdoIHBvbGljeSB0YWJsZSwgcXVlcmllcyA8YXBwPiBrZXksIDx0eXBlPiB2YWx1ZSwgcmV0dXJucyAKICogcXVlcmllZCAoRFdPUkQpIHZhbHVlLgogKiB7MHgwMDAwMSxFeHBsb3JlcixOb1J1bn0KICogezB4MDAwMDIsRXhwbG9yZXIsTm9DbG9zZX0KICogezB4MDAwMDQsRXhwbG9yZXIsTm9TYXZlU2V0dGluZ3N9CiAqIHsweDAwMDA4LEV4cGxvcmVyLE5vRmlsZU1lbnV9CiAqIHsweDAwMDEwLEV4cGxvcmVyLE5vU2V0Rm9sZGVyc30KICogezB4MDAwMjAsRXhwbG9yZXIsTm9TZXRUYXNrYmFyfQogKiB7MHgwMDA0MCxFeHBsb3JlcixOb0Rlc2t0b3B9CiAqIHsweDAwMDgwLEV4cGxvcmVyLE5vRmluZH0KICogezB4MDAxMDAsRXhwbG9yZXIsTm9Ecml2ZXN9CiAqIHsweDAwMjAwLEV4cGxvcmVyLE5vRHJpdmVBdXRvUnVufQogKiB7MHgwMDQwMCxFeHBsb3JlcixOb0RyaXZlVHlwZUF1dG9SdW59CiAqIHsweDAwODAwLEV4cGxvcmVyLE5vTmV0SG9vZH0KICogezB4MDEwMDAsRXhwbG9yZXIsTm9TdGFydEJhbm5lcn0KICogezB4MDIwMDAsRXhwbG9yZXIsUmVzdHJpY3RSdW59CiAqIHsweDA0MDAwLEV4cGxvcmVyLE5vUHJpbnRlclRhYnN9CiAqIHsweDA4MDAwLEV4cGxvcmVyLE5vRGVsZXRlUHJpbnRlcn0KICogezB4MTAwMDAsRXhwbG9yZXIsTm9BZGRQcmludGVyfQogKiB7MHgyMDAwMCxFeHBsb3JlcixOb1N0YXJ0TWVudVN1YkZvbGRlcnN9CiAqIHsweDQwMDAwLEV4cGxvcmVyLE15RG9jc09uTmV0fQogKiB7MHg4MDAwMCxXaW5PbGRBcHAsTm9SZWFsTW9kZX0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSFJlc3RyaWN0ZWQgKERXT1JEIHBvbCkgewoJSEtFWQl4aGtleTsKCglGSVhNRShzaGVsbCwiKCUwOGx4KTpzdHViLlxuIixwb2wpOwoJaWYgKFJlZ09wZW5LZXkzMkEoSEtFWV9DVVJSRU5UX1VTRVIsIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxQb2xpY2llcyIsJnhoa2V5KSkKCQlyZXR1cm4gMDsKCS8qIEZJWE1FOiBkbyBub3RoaW5nIGZvciBub3csIGp1c3QgcmV0dXJuIDAgKD09ICJhbGxvd2VkIikgKi8KCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXRoR2V0RXh0ZW5zaW9uIFtTSEVMTDMyLjE1OF0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkxQQ1NUUiBXSU5BUEkgUGF0aEdldEV4dGVuc2lvbjMyQShMUENTVFIgcGF0aCxEV09SRCB5LERXT1JEIHopCnsJVFJBQ0Uoc2hlbGwsIiglcywlMDhseCwlMDhseClcbiIscGF0aCx5LHopOwoJcGF0aCA9IFBhdGhGaW5kRXh0ZW5zaW9uMzJBKHBhdGgpOwoJcmV0dXJuICpwYXRoPyhwYXRoKzEpOnBhdGg7Cn0KTFBDV1NUUiBXSU5BUEkgUGF0aEdldEV4dGVuc2lvbjMyVyhMUENXU1RSIHBhdGgsRFdPUkQgeSxEV09SRCB6KQp7CVRSQUNFKHNoZWxsLCIoTCVzLCUwOGx4LCUwOGx4KVxuIixkZWJ1Z3N0cl93KHBhdGgpLHkseik7CglwYXRoID0gUGF0aEZpbmRFeHRlbnNpb24zMlcocGF0aCk7CglyZXR1cm4gKnBhdGg/KHBhdGgrMSk6cGF0aDsKfQpMUENWT0lEIFdJTkFQSSBQYXRoR2V0RXh0ZW5zaW9uMzJBVyhMUENWT0lEIHBhdGgsRFdPUkQgeSxEV09SRCB6KSAKewlpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gUGF0aEdldEV4dGVuc2lvbjMyVyhwYXRoLHkseik7CglyZXR1cm4gUGF0aEdldEV4dGVuc2lvbjMyQShwYXRoLHkseik7Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENyZWF0ZURpcmVjdG9yeSBbU0hFTEwzMi4xNjVdCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBvcmRpbmFsCiAqICBub3Qgc3VyZSBhYm91dCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMKICovCkRXT1JEIFdJTkFQSSBTSENyZWF0ZURpcmVjdG9yeShMUFNFQ1VSSVRZX0FUVFJJQlVURVMgc2VjLExQQ1NUUiBwYXRoKSB7CglUUkFDRShzaGVsbCwiKCVwLCVzKTpzdHViLlxuIixzZWMscGF0aCk7CglpZiAoQ3JlYXRlRGlyZWN0b3J5MzJBKHBhdGgsc2VjKSkKCQlyZXR1cm4gVFJVRTsKCS8qIFNIQ2hhbmdlTm90aWZ5KDgsMSxwYXRoLDApOyAqLwoJcmV0dXJuIEZBTFNFOwojaWYgMAoJaWYgKFNIRUxMMzJfNzkocGF0aCwoTFBWT0lEKXgpKQoJCXJldHVybiAwOwoJRklYTUUoc2hlbGwsIiglMDhseCwlcyk6c3R1Yi5cbiIseCxwYXRoKTsKCXJldHVybiAwOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlIFtTSEVMTDMyLjE5NV0KICoKICogTk9URVMKICogICAgIGZyZWVfcHRyKCkgLSBmcmVlcyBtZW1vcnkgdXNpbmcgSU1hbGxvYwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIRnJlZShMUFZPSUQgeCkgewogIFRSQUNFKHNoZWxsLCIlcFxuIix4KTsKICAvKnJldHVybiBMb2NhbEZyZWUzMigoSEFORExFMzIpeCk7Ki8gLyogY3Jhc2hlcyAqLwogIHJldHVybiBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAseCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWxsb2MgW1NIRUxMMzIuMTk2XQogKgogKiBOT1RFUwogKiAgICAgdm9pZCAqdGFza19hbGxvYyhEV09SRCBsZW4pLCB1c2VzIFNITWFsbG9jIGFsbG9jYXRvcgogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KTFBWT0lEIFdJTkFQSSBTSEFsbG9jKERXT1JEIGxlbikgewogLyogdm9pZCAqIHJldCA9IChMUFZPSUQpTG9jYWxBbGxvYzMyKGxlbixMTUVNX1pFUk9JTklUKTsqLyAvKiBjaHJhc2hlcyAqLwogdm9pZCAqIHJldCA9IChMUFZPSUQpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKICBUUkFDRShzaGVsbCwiJWx1IGJ5dGVzIGF0ICVwXG4iLGxlbiwgcmV0KTsKICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPcGVuUmVnU3RyZWFtIFtTSEVMTDMyLjg1XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIE9wZW5SZWdTdHJlYW0oRFdPUkQgeDEsRFdPUkQgeDIsRFdPUkQgeDMsRFdPUkQgeDQpIHsKICAgIEZJWE1FKHNoZWxsLCIoMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIsCiAgICAJeDEseDIseDMseDQKICAgICk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdpc3RlckRyYWdEcm9wIFtTSEVMTDMyLjg2XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIUmVnaXN0ZXJEcmFnRHJvcChIV05EMzIgaHduZCxEV09SRCB4MikgewogICAgRklYTUUgKHNoZWxsLCAiKDB4JTA4eCwweCUwOGx4KTpzdHViLlxuIiwgaHduZCwgeDIpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmV2b2tlRHJhZ0Ryb3AgW1NIRUxMMzIuODddCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkgU0hSZXZva2VEcmFnRHJvcChEV09SRCB4KSB7CiAgICBGSVhNRShzaGVsbCwiKDB4JTA4bHgpOnN0dWIuXG4iLHgpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJ1bkZpbGVEbGcgW1NIRUxMMzIuNjFdCiAqCiAqIE5PVEVTCiAqICAgICBPcmlnaW5hbCBuYW1lOiBSdW5GaWxlRGxnIChleHBvcnRlZCBieSBvcmRpbmFsKQogKi8KRFdPUkQgV0lOQVBJClJ1bkZpbGVEbGcgKEhXTkQzMiBod25kT3duZXIsIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMiwKCSAgICBMUFNUUiBscHN6VGl0bGUsIExQU1RSIGxwc3pQcm9tcHQsIFVJTlQzMiB1RmxhZ3MpCnsKICAgIEZJWE1FIChzaGVsbCwiKDB4JTA4eCAweCVseCAweCVseCBcIiVzXCIgXCIlc1wiIDB4JXgpOnN0dWIuXG4iLAoJICAgaHduZE93bmVyLCBkd1BhcmFtMSwgZHdQYXJhbTIsIGxwc3pUaXRsZSwgbHBzelByb21wdCwgdUZsYWdzKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBFeGl0V2luZG93c0RpYWxvZyBbU0hFTEwzMi42MF0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSQpFeGl0V2luZG93c0RpYWxvZyAoSFdORDMyIGh3bmRPd25lcikKewogICAgRklYTUUgKHNoZWxsLCIoMHglMDh4KTpzdHViLlxuIiwgaHduZE93bmVyKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBBcnJhbmdlV2luZG93cyBbU0hFTEwzMi4xODRdCiAqIAogKi8KRFdPUkQgV0lOQVBJCkFycmFuZ2VXaW5kb3dzIChEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIsIERXT1JEIGR3UGFyYW0zLAoJCURXT1JEIGR3UGFyYW00LCBEV09SRCBkd1BhcmFtNSkKewogICAgRklYTUUgKHNoZWxsLCIoMHglbHggMHglbHggMHglbHggMHglbHggMHglbHgpOnN0dWIuXG4iLAoJICAgZHdQYXJhbTEsIGR3UGFyYW0yLCBkd1BhcmFtMywgZHdQYXJhbTQsIGR3UGFyYW01KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENMU0lERnJvbVN0cmluZyBbU0hFTEwzMi4xNDddCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkKU0hDTFNJREZyb21TdHJpbmcgKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKewogICAgRklYTUUgKHNoZWxsLCIoMHglbHggMHglbHgpOnN0dWIuXG4iLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogICAgRklYTUUgKHNoZWxsLCIoXCIlc1wiIFwiJXNcIik6c3R1Yi5cbiIsIChMUFNUUilkd1BhcmFtMSwgKExQU1RSKWR3UGFyYW0yKTsKCiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNpZ25hbEZpbGVPcGVuIFtTSEVMTDMyLjEwM10KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSQpTaWduYWxGaWxlT3BlbiAoRFdPUkQgZHdQYXJhbTEpCnsKICAgIEZJWE1FIChzaGVsbCwiKDB4JTA4bHgpOnN0dWIuXG4iLCBkd1BhcmFtMSk7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWRkVG9SZWNlbnREb2NzIFtTSEVMTDMyLjIzNF0KICoKICogUEFSQU1FVEVSUwogKiAgIHVGbGFncyAgW0lOXSBTSEFSRF9QQVRIIG9yIFNIQVJEX1BJREwKICogICBwdiAgICAgIFtJTl0gc3RyaW5nIG9yIHBpZGwsIE5VTEwgY2xlYXJzIHRoZSBsaXN0CiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hBZGRUb1JlY2VudERvY3MzMiAoVUlOVDMyIHVGbGFncyxMUENWT0lEIHB2KSAgIAp7IGlmIChTSEFSRF9QSURMPT11RmxhZ3MpCiAgeyBGSVhNRSAoc2hlbGwsIigweCUwOHgscGlkbD0lcCk6c3R1Yi5cbiIsIHVGbGFncyxwdik7Cgl9CgllbHNlCgl7IEZJWE1FIChzaGVsbCwiKDB4JTA4eCwlcyk6c3R1Yi5cbiIsIHVGbGFncywoY2hhciopcHYpOwoJfQogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRmlsZU9wZXJhdGlvbjMyIFtTSEVMTDMyLjI0Ml0KICoKICovCkRXT1JEIFdJTkFQSSBTSEZpbGVPcGVyYXRpb24zMihEV09SRCB4KQp7CUZJWE1FKHNoZWxsLCIweCUwOGx4IHN0dWJcbiIseCk7CglyZXR1cm4gMDsKCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRmlsZU9wZXJhdGlvbjMyQSBbU0hFTEwzMi4yNDNdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hGaWxlT3BlcmF0aW9uMzJBIChMUFNIRklMRU9QU1RSVUNUMzJBIGxwRmlsZU9wKSAgIAp7IEZJWE1FIChzaGVsbCwiKCVwKTpzdHViLlxuIiwgbHBGaWxlT3ApOwogIHJldHVybiAxOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRmlsZU9wZXJhdGlvbjMyVyBbU0hFTEwzMi4yNDRdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hGaWxlT3BlcmF0aW9uMzJXIChMUFNIRklMRU9QU1RSVUNUMzJXIGxwRmlsZU9wKSAgIAp7IEZJWE1FIChzaGVsbCwiKCVwKTpzdHViLlxuIiwgbHBGaWxlT3ApOwogIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENoYW5nZU5vdGlmeSBbU0hFTEwzMi4yMzldCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hDaGFuZ2VOb3RpZnkzMiAoCiAgICBJTlQzMiAgIHdFdmVudElkLCAgLyogW0lOXSBmbGFncyB0aGF0IHNwZWNpZmllcyB0aGUgZXZlbnQqLwogICAgVUlOVDMyICB1RmxhZ3MsICAgLyogW0lOXSB0aGUgbWVhbmluZyBvZiBkd0l0ZW1bMXwyXSovCgkJTFBDVk9JRCBkd0l0ZW0xLAoJCUxQQ1ZPSUQgZHdJdGVtMikKeyBGSVhNRSAoc2hlbGwsIigweCUwOHgsMHglMDh1eCwlcCwlcCk6c3R1Yi5cbiIsIHdFdmVudElkLHVGbGFncyxkd0l0ZW0xLGR3SXRlbTIpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXggW1NIRUxMMzIuMTc0XQogKgogKiBOT1RFUwogKiAgc2VlIElTaGVsbEZvbGRlcjo6Q3JlYXRlVmlld09iamVjdAogKi8KSFJFU1VMVCBXSU5BUEkgU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeDMyKAogIExQU0hFTExWSUVXREFUQSBwc3ZjYmksIC8qW2luIF0gc2hlbGx0ZW1wbGF0ZSBzdHJ1Y3QqLwogIExQVk9JRCogcHB2KSAgICAgICAgICAgIC8qW291dF0gSVNoZWxsVmlldyBwb2ludGVyKi8KeyBGSVhNRSAoc2hlbGwsIiglcCwlcCk6c3R1Yi5cbiIsIHBzdmNiaSxwcHYpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRmluZF9Jbml0TWVudVBvcHVwIFtTSEVMTDMyLjE0OV0KICoKICogTk9URVMKICogIFJlZ2lzdGVycyB0aGUgbWVudSBiZWhpbmQgdGhlICJTdGFydCIgYnV0dG9uCiAqCiAqIFBBUkFNRVRFUlMKICogIGhNZW51CQlbaW5dIGhhbmRlbCBvZiBtZW51IHByZXZpb3VzbHkgY3JlYXRlZAogKiAgaFduZFBhcmVudAlbaW5dIHBhcmVudCB3aW5kb3cKICogIHcJCQlbaW5dIG5vIHBvaW50ZXIKICogIHgJCQlbaW5dIG5vIHBvaW50ZXIKICovCkhSRVNVTFQgV0lOQVBJIFNIRmluZF9Jbml0TWVudVBvcHVwIChITUVOVTMyIGhNZW51LCBIV05EMzIgaFduZFBhcmVudCwgRFdPUkQgdywgRFdPUkQgeCkKewlGSVhNRShzaGVsbCwiaG1lbnU9MHglMDh4IGh3bmQ9MHglMDh4IDB4JTA4bHggMHglMDhseCBzdHViXG4iLAoJCWhNZW51LGhXbmRQYXJlbnQsdyx4KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZpbGVNZW51X0luaXRNZW51UG9wdXAgW1NIRUxMMzIuMTA5XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfSW5pdE1lbnVQb3B1cCAoRFdPUkQgaG1lbnUpCnsJRklYTUUoc2hlbGwsImhtZW51PTB4JWx4IHN0dWJcbiIsaG1lbnUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZU1lbnVfQ3JlYXRlIFtTSEVMTDMyLjExNF0KICoKICogdyByZXR2YWwgZnJvbSBMb2FkQml0bWFwQQogKgogKgogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfQ3JlYXRlIChEV09SRCB1LCBEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB6KQp7IEZJWE1FKHNoZWxsLCIweCUwOGx4IDB4JTA4bHggaGJtcD0weCVseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix1LHYsdyx4LHopOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZpbGVNZW51X1RyYWNrUG9wdXBNZW51RXggW1NIRUxMMzIuMTE2XQogKgogKiBQQVJBTUVURVJTCiAqICB1RmxhZ3MJCVtpbl0JYWNjb3JkaW5nIHRvIFRyYWNrUG9wdXBNZW51RXgKICogIHBvc1gJCVtpbl0KICogIHBvc1kJCVtpbl0KICogIGhXbmRQYXJlbnQJCVtpbl0KICogIHoJY291bGQgYmUgcmVjdCAodHJhY2UpIG9yIFRQTVBBUkFNUyAoVHJhY2tQb3B1cE1lbnVFeCkKICovCkhSRVNVTFQgV0lOQVBJIEZpbGVNZW51X1RyYWNrUG9wdXBNZW51RXggKERXT1JEIHQsIERXT1JEIHVGbGFncywgRFdPUkQgcG9zWCwgRFdPUkQgcG9zWSwgSFdORDMyIGhXbmRQYXJlbnQsIERXT1JEIHopCnsJRklYTUUoc2hlbGwsIjB4JWx4IGZsYWdzPTB4JWx4IHBvc3g9MHglbHggcG9zeT0weCVseCBod25kcD0weCV4IDB4JWx4IHN0dWJcbiIsCgkJdCx1RmxhZ3MscG9zWCxwb3NZLCBoV25kUGFyZW50LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFNIV2luSGVscCBbU0hFTEwzMi4xMjddCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFdpbkhlbHAgKERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHopCnsJRklYTUUoc2hlbGwsIjB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix2LHcseCx6KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTSFJ1bkNvbnRyb2xQYW5lbCBbU0hFTEwzMi4xNjFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJ1bkNvbnRyb2xQYW5lbCAoRFdPUkQgeCwgRFdPUkQgeikKewlGSVhNRShzaGVsbCwiMHglMDhseCAweCUwOGx4IHN0dWJcbiIseCx6KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTSFNpbXBsZUlETGlzdEZyb21QYXRoIFtTSEVMTDMyLjE2Ml0KICoKICovCkxQSVRFTUlETElTVCBXSU5BUEkgU0hTaW1wbGVJRExpc3RGcm9tUGF0aCAoTFBDU1RSIGxwc3pQYXRoKQp7CglGSVhNRShzaGVsbCwiKCVzKTogc3R1YlxuIixscHN6UGF0aCk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeCBbU0hFTEwzMi4yOTFdCiAqCiAqLwpCT09MMzIgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4MzJBIChMUFNIRUxMRVhFQ1VURUlORk8zMkEgc2VpKQp7IAlDSEFSIHN6VGVtcFtNQVhfUEFUSF07CgogIAlGSVhNRShzaGVsbCwiKCVwKTogc3R1YlxuIixzZWkpOwoKCWlmIChzZWktPmZNYXNrICYgU0VFX01BU0tfSURMSVNUKQoJeyBTSEdldFBhdGhGcm9tSURMaXN0MzJBIChzZWktPmxwSURMaXN0LHN6VGVtcCk7CgkgIFRSQUNFIChzaGVsbCwiLS0gaWRsaXN0PSVwICglcylcbiIsIHNlaS0+bHBJRExpc3QsIHN6VGVtcCk7Cgl9CgoJaWYgKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpCgl7IFRSQUNFIChzaGVsbCwiLS0gY2xhc3NuYW1lPSAlc1xuIiwgc2VpLT5scENsYXNzKTsKCX0KICAgIAoJaWYgKHNlaS0+bHBWZXJiKQoJeyBUUkFDRSAoc2hlbGwsIi0tIGFjdGlvbj0lc1xuIiwgc2VpLT5scFZlcmIpOwoJfQoJCglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNldEluc3RhbmNlRXhwbG9yZXIgW1NIRUxMMzIuMTc2XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hTZXRJbnN0YW5jZUV4cGxvcmVyIChEV09SRCB1KQp7CUZJWE1FKHNoZWxsLCIweCUwOGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEdldEluc3RhbmNlRXhwbG9yZXIgW1NIRUxMMzIuMjU2XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgU0hHZXRJbnN0YW5jZUV4cGxvcmVyIChEV09SRCB1KQp7CUZJWE1FKHNoZWxsLCIweCUwOGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWVVbnVzZWRMaWJyYXJpZXMgW1NIRUxMMzIuMTIzXQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgU0hGcmVlVW51c2VkTGlicmFyaWVzIChEV09SRCB1KQp7CUZJWE1FKHNoZWxsLCIweCUwOGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEQURfU2hvd0RyYWdJbWFnZSBbU0hFTEwzMi4xMzddCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpIUkVTVUxUIFdJTkFQSSBEQURfU2hvd0RyYWdJbWFnZSAoRFdPUkQgdSkKeyBGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZpbGVNZW51X0Rlc3Ryb3kgW1NIRUxMMzIuMTE4XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfRGVzdHJveSAoRFdPUkQgdSkKeyBGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0RGF0YUZyb21JRExpc3RBIFtTSEVMTDMyLjI0N10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIR2V0RGF0YUZyb21JRExpc3RBKERXT1JEIHUsIERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHkpCnsJRklYTUUoc2hlbGwsIjB4JTA0bHggMHglMDRseCAweCUwNGx4IDB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdix3LHgseSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ0Nsb3NlS2V5MzIgW05UNC4wOlNIRUxMMzIuNTA1XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdDbG9zZUtleTMyIChIS0VZIGhrZXkpCnsJVFJBQ0Uoc2hlbGwsIjB4JTA0eFxuIixoa2V5KTsKCXJldHVybiBSZWdDbG9zZUtleSggaGtleSApOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnT3BlbktleTMyQSBbU0hFTEwzMi41MDZdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ09wZW5LZXkzMkEoSEtFWSBoS2V5LCBMUFNUUiBscFN1YktleSwgTFBIS0VZIHBoa1Jlc3VsdCkKewlGSVhNRShzaGVsbCwiKDB4JTA4eCwgJXMsICVwKVxuIiwgaEtleSwgZGVidWdzdHJfYShscFN1YktleSksCgkgICAgICBwaGtSZXN1bHQpOwoJcmV0dXJuIFJlZ09wZW5LZXkzMkEoaEtleSwgbHBTdWJLZXksIHBoa1Jlc3VsdCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnT3BlbktleTMyVyBbTlQ0LjA6U0hFTEwzMi41MDddCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ09wZW5LZXkzMlcgKEhLRVkgaGtleSwgTFBDV1NUUiBscHN6U3ViS2V5LCBMUEhLRVkgcmV0a2V5KQp7CVdBUk4oc2hlbGwsIjB4JTA0eCAlcyAlcFxuIixoa2V5LGRlYnVnc3RyX3cobHBzelN1YktleSkscmV0a2V5KTsKCXJldHVybiBSZWdPcGVuS2V5MzJXKCBoa2V5LCBscHN6U3ViS2V5LCByZXRrZXkgKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ1F1ZXJ5VmFsdWVFeEEgW1NIRUxMMzIuNTA5XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdRdWVyeVZhbHVlRXgzMkEoRFdPUkQgdSwgTFBTVFIgdiwgRFdPUkQgdywgRFdPUkQgeCwKCQkJCSAgRFdPUkQgeSwgRFdPUkQgeikKewlGSVhNRShzaGVsbCwiMHglMDRseCAlcyAweCUwNGx4IDB4JTA0bHggMHglMDRseCAgMHglMDRseCBzdHViXG4iLAoJCXUsZGVidWdzdHJfYSh2KSx3LHgseSx6KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnUXVlcnlWYWx1ZTMyVyBbTlQ0LjA6U0hFTEwzMi41MTBdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ1F1ZXJ5VmFsdWUzMlcgKEhLRVkgaGtleSwgTFBXU1RSIGxwc3pTdWJLZXksCgkJCQkgTFBXU1RSIGxwc3pEYXRhLCBMUERXT1JEIGxwY2JEYXRhICkKewlXQVJOKHNoZWxsLCIweCUwNHggJXMgJXAgJXAgc2VtaS1zdHViXG4iLAoJCWhrZXksIGRlYnVnc3RyX3cobHBzelN1YktleSksIGxwc3pEYXRhLCBscGNiRGF0YSk7CglyZXR1cm4gUmVnUXVlcnlWYWx1ZTMyVyggaGtleSwgbHBzelN1YktleSwgbHBzekRhdGEsIGxwY2JEYXRhICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnUXVlcnlWYWx1ZUV4MzJXIFtOVDQuMDpTSEVMTDMyLjUxMV0KICoKICogRklYTUUgCiAqICBpZiB0aGUgZGF0YXR5cGUgUkVHX0VYUEFORF9TWiB0aGVuIGV4cGFuZCB0aGUgc3RyaW5nIGFuZCBjaGFuZ2UKICogICpwZHdUeXBlIHRvIFJFR19TWi4gCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ1F1ZXJ5VmFsdWVFeDMyVyAoSEtFWSBoa2V5LCBMUFdTVFIgcHN6VmFsdWUsIExQRFdPUkQgcGR3UmVzZXJ2ZWQsCgkJIExQRFdPUkQgcGR3VHlwZSwgTFBWT0lEIHB2RGF0YSwgTFBEV09SRCBwY2JEYXRhKQp7CURXT1JEIHJldDsKCVdBUk4oc2hlbGwsIjB4JTA0eCAlcyAlcCAlcCAlcCAlcCBzZW1pLXN0dWJcbiIsCgkJaGtleSwgZGVidWdzdHJfdyhwc3pWYWx1ZSksIHBkd1Jlc2VydmVkLCBwZHdUeXBlLCBwdkRhdGEsIHBjYkRhdGEpOwoJcmV0ID0gUmVnUXVlcnlWYWx1ZUV4MzJXICggaGtleSwgcHN6VmFsdWUsIHBkd1Jlc2VydmVkLCBwZHdUeXBlLCBwdkRhdGEsIHBjYkRhdGEpOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUmVhZENhYmluZXRTdGF0ZSBbTlQgNC4wOlNIRUxMMzIuNjUxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgUmVhZENhYmluZXRTdGF0ZShEV09SRCB1LCBEV09SRCB2KQp7CUZJWE1FKHNoZWxsLCIweCUwNGx4IDB4JTA0bHggc3R1YlxuIix1LHYpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogV3JpdGVDYWJpbmV0U3RhdGUgW05UIDQuMDpTSEVMTDMyLjY1Ml0KICoKICovCkhSRVNVTFQgV0lOQVBJIFdyaXRlQ2FiaW5ldFN0YXRlKERXT1JEIHUpCnsJRklYTUUoc2hlbGwsIjB4JTA0bHggc3R1YlxuIix1KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZpbGVJY29uSW5pdCBbU0hFTEwzMi42NjBdCiAqCiAqLwpCT09MMzIgV0lOQVBJIEZpbGVJY29uSW5pdChCT09MMzIgYkZ1bGxJbml0KQp7CUZJWE1FKHNoZWxsLCIoJXMpXG4iLCBiRnVsbEluaXQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElzVXNlckFkbWluIFtOVCA0LjA6U0hFTEwzMi42ODBdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBJc1VzZXJBZG1pbigpCnsJRklYTUUoc2hlbGwsInN0dWJcbiIpOwoJcmV0dXJuIFRSVUU7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyUmV0VG9TdHJOIFtTSEVMTDMyLjk2XQogKiAKICogY29udmVydHMgYSBTVFJSRVQgdG8gYSBub3JtYWwgc3RyaW5nCiAqCiAqIE5PVEVTCiAqICBGSVhNRSB0aGUgc3RyaW5nIGhhbmRsaW5nIGlzIHRvIHNpbXBsZSAoZGlmZmVyZW50IFNUUlJFVCBjaG9pY2VzKQogKiAgYXQgdGhlIG1vbWVudCBvbmx5IENTVFIKICogIHRoZSBwaWRsIGlzIGZvciBTVFJSRVQgT0ZGU0VUCiAqLwpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb1N0ck4gKExQVk9JRCBkZXN0LCBEV09SRCBsZW4sIExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwpCnsJVFJBQ0Uoc2hlbGwsImRlc3Q9MHglcCBsZW49MHglbHggc3RycmV0PTB4JXAgcGlkbD0lcCBzdHViXG4iLGRlc3QsbGVuLHNyYyxwaWRsKTsKCglzd2l0Y2ggKHNyYy0+dVR5cGUpCgl7IGNhc2UgU1RSUkVUX1dTVFI6CgkgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHNyYy0+dS5wT2xlU3RyLCAtMSwgKExQU1RSKWRlc3QsIGxlbiwgTlVMTCwgTlVMTCk7CgkgICAgU0hGcmVlKHNyYy0+dS5wT2xlU3RyKTsKCSAgICBicmVhazsKCgkgIGNhc2UgU1RSUkVUX0NTVFJBOgoJICAgIGlmIChWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgICAgICBsc3RyY3B5bkF0b1coKExQV1NUUilkZXN0LCBzcmMtPnUuY1N0ciwgbGVuKTsKCSAgICBlbHNlCgkgICAgICBzdHJuY3B5KChMUFNUUilkZXN0LCBzcmMtPnUuY1N0ciwgbGVuKTsKCSAgICBicmVhazsKCgkgIGNhc2UgU1RSUkVUX09GRlNFVEE6CgkgICAgaWYgKHBpZGwpCgkgICAgeyBpZihWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgICAgICAgIGxzdHJjcHluQXRvVygoTFBXU1RSKWRlc3QsICgoTFBDU1RSKSZwaWRsLT5ta2lkKStzcmMtPnUudU9mZnNldCwgbGVuKTsKCSAgICAgIGVsc2UKCSAgICAgICAgc3RybmNweSgoTFBTVFIpZGVzdCwgKChMUENTVFIpJnBpZGwtPm1raWQpK3NyYy0+dS51T2Zmc2V0LCBsZW4pOwoJICAgICAgYnJlYWs7CgkgICAgfQoKCSAgZGVmYXVsdDoKCSAgICBGSVhNRShzaGVsbCwidW5rbm93biB0eXBlIVxuIik7CgkgICAgaWYgKGxlbikKCSAgICB7ICooTFBTVFIpZGVzdCA9ICdcMCc7CgkgICAgfQoJICAgIHJldHVybihGQUxTRSk7Cgl9CglyZXR1cm4oVFJVRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0ckNoclcgW05UIDQuMDpTSEVMTDMyLjY1MV0KICoKICovCkxQV1NUUiBXSU5BUEkgU3RyQ2hyVyAoTFBXU1RSIHN0ciwgV0NIQVIgeCApCnsJTFBXU1RSIHB0cj1zdHI7CgkKCVRSQUNFKHNoZWxsLCIlcyAweCUwNHhcbiIsZGVidWdzdHJfdyhzdHIpLHgpOwoJZG8gCgl7ICBpZiAoKnB0cj09eCkKCSAgIHsgcmV0dXJuIHB0cjsKCSAgIH0KCSAgIHB0cisrOwoJfSB3aGlsZSAoKnB0cik7CglyZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU3RyQ21wTklXCQlbTlQgNC4wOlNIRUxMMzIuKl0KICoKICovCklOVDMyIFdJTkFQSSBTdHJDbXBOSVcgKCBMUFdTVFIgd3N0cjEsIExQV1NUUiB3c3RyMiwgSU5UMzIgbGVuKQp7CUZJWE1FKCBzaGVsbCwiJXMgJXMgJWkgc3R1YlxuIiwgZGVidWdzdHJfdyh3c3RyMSksZGVidWdzdHJfdyh3c3RyMiksbGVuKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFsbG9jU2hhcmVkIFtTSEVMTDMyLjUyMF0KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gSGVhcEFsbG9jCiAqICBwYXJhbWV0ZXIyIGlzIGVxdWFsIHRvIHRoZSBzaXplIGFsbG9jYXRlZCB3aXRoIEhlYXBBbGxvYwogKiAgcGFyYW1ldGVyMyBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqCiAqICB0aGUgcmV0dXJuIHZhbHVlIGlzIHBvc3RlZCBhcyBsUGFyYW0gd2l0aCAweDQwMiAoV01fVVNFUisyKSB0byBzb21ld2hlcmUKICogIFdNX1VTRVIrMiBjb3VsZCBiZSB0aGUgdW5kb2N1bWVudGVkIENXTV9TRVRQQVRICiAqICB0aGUgYWxsb2NhdGVkIG1lbW9yeSBjb250YWlucyBhIHBpZGwKICovCkhHTE9CQUwzMiBXSU5BUEkgU0hBbGxvY1NoYXJlZChMUFZPSUQgcHNyYywgRFdPUkQgc2l6ZSwgRFdPUkQgcHJvY0lEKQp7CUhHTE9CQUwzMiBobWVtOwoJTFBWT0lEIHBtZW07CgkKCVRSQUNFKHNoZWxsLCJwdHI9JXAgc2l6ZT0weCUwNGx4IHByb2NJRD0weCUwNGx4XG4iLHBzcmMsc2l6ZSxwcm9jSUQpOwoJaG1lbSA9IEdsb2JhbEFsbG9jMzIoR01FTV9GSVhFRCwgc2l6ZSk7CglpZiAoIWhtZW0pCgkgIHJldHVybiAwOwoJCglwbWVtID0gIEdsb2JhbExvY2szMiAoaG1lbSk7CgoJaWYgKCEgcG1lbSkKCSAgcmV0dXJuIDA7CgkgIAoJbWVtY3B5IChwbWVtLCBwc3JjLCBzaXplKTsKCUdsb2JhbFVubG9jazMyKGhtZW0pOyAKCXJldHVybiBobWVtOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNITG9ja1NoYXJlZCBbU0hFTEwzMi41MjFdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIFNIQWxsb2NTaGFyZWQKICogIHBhcmFtZXRlcjIgaXMgcmV0dXJuIHZhbHVlIGZyb20gR2V0Q3VycmVudFByb2Nlc3NJZAogKiAgdGhlIHJlY2VpdmVyIG9mIChXTV9VU0VSKzIpIHRyeXMgdG8gbG9jayB0aGUgSEFORExFICg/KSAKICogIHRoZSByZXR1cm52YWx1ZSBzZWVtcyB0byBiZSBhIG1lbW9yeWFkcmVzcwogKi8Kdm9pZCAqIFdJTkFQSSBTSExvY2tTaGFyZWQoSEFORExFMzIgaG1lbSwgRFdPUkQgcHJvY0lEKQp7CVRSQUNFKHNoZWxsLCJoYW5kbGU9MHglMDR4IHByb2NJRD0weCUwNGx4XG4iLGhtZW0scHJvY0lEKTsKCXJldHVybiBHbG9iYWxMb2NrMzIoaG1lbSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hVbmxvY2tTaGFyZWQgW1NIRUxMMzIuNTIyXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBTSExvY2tTaGFyZWQKICovCkJPT0wzMiBXSU5BUEkgU0hVbmxvY2tTaGFyZWQoSEFORExFMzIgcG1lbSkKewlUUkFDRShzaGVsbCwiaGFuZGxlPTB4JTA0eFxuIixwbWVtKTsKCXJldHVybiBHbG9iYWxVbmxvY2szMihwbWVtKTsgCn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlU2hhcmVkIFtTSEVMTDMyLjUyM10KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gU0hBbGxvY1NoYXJlZAogKiAgcGFyYW1ldGVyMiBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqLwpIQU5ETEUzMiBXSU5BUEkgU0hGcmVlU2hhcmVkKEhBTkRMRTMyIGhtZW0sIERXT1JEIHByb2NJRCkKewlUUkFDRShzaGVsbCwiaGFuZGxlPTB4JTA0eCAweCUwNGx4XG4iLGhtZW0scHJvY0lEKTsKCXJldHVybiBHbG9iYWxGcmVlMzIoaG1lbSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNldEFwcFN0YXJ0aW5nQ3Vyc29yMzIgW1NIRUxMMzIuOTldCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTZXRBcHBTdGFydGluZ0N1cnNvcjMyKERXT1JEIHUsIERXT1JEIHYpCnsJRklYTUUoc2hlbGwsIjB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdiApOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hMb2FkT0xFMzIgW1NIRUxMMzIuMTUxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hMb2FkT0xFMzIoRFdPUkQgdSkKewlGSVhNRShzaGVsbCwiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIFNfT0s7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxfTWVyZ2VNZW51czMyIFtTSEVMTDMyLjY3XQogKgogKi8KQk9PTDMyIF9TSElzTWVudVNlcGFyYXRvcihITUVOVTMyIGhtLCBpbnQgaSkKewoJTUVOVUlURU1JTkZPMzJBIG1paTsKCgltaWkuY2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5GTzMyQSk7CgltaWkuZk1hc2sgPSBNSUlNX1RZUEU7CgltaWkuY2NoID0gMDsgICAgLyogV0FSTklORzogV2UgTVVTVCBpbml0aWFsaXplIGl0IHRvIDAqLwoJaWYgKCFHZXRNZW51SXRlbUluZm8zMkEoaG0sIGksIFRSVUUsICZtaWkpKQoJeyByZXR1cm4oRkFMU0UpOwoJfQoKCWlmIChtaWkuZlR5cGUgJiBNRlRfU0VQQVJBVE9SKQoJeyByZXR1cm4oVFJVRSk7Cgl9CgogICAgICAgIHJldHVybihGQUxTRSk7Cn0KI2RlZmluZSBNTV9BRERTRVBBUkFUT1IgICAgICAgICAweDAwMDAwMDAxTAojZGVmaW5lIE1NX1NVQk1FTlVTSEFWRUlEUyAgICAgIDB4MDAwMDAwMDJMCkhSRVNVTFQgV0lOQVBJIFNoZWxsX01lcmdlTWVudXMzMiAoSE1FTlUzMiBobURzdCwgSE1FTlUzMiBobVNyYywgVUlOVDMyIHVJbnNlcnQsIFVJTlQzMiB1SURBZGp1c3QsIFVJTlQzMiB1SURBZGp1c3RNYXgsIFVMT05HIHVGbGFncykKewlpbnQJCW5JdGVtOwoJSE1FTlUzMgkJaG1TdWJNZW51OwoJQk9PTDMyCQliQWxyZWFkeVNlcGFyYXRlZDsKCU1FTlVJVEVNSU5GTzMyQSBtaWlTcmM7CgljaGFyCQlzek5hbWVbMjU2XTsKCVVJTlQzMgkJdVRlbXAsIHVJRE1heCA9IHVJREFkanVzdDsKCglGSVhNRShzaGVsbCwiaG1lbnUxPTB4JTA0eCBobWVudTI9MHglMDR4IDB4JTA0eCAweCUwNHggMHglMDR4ICAweCUwNGx4IHN0dWJcbiIsCgkJIGhtRHN0LCBobVNyYywgdUluc2VydCwgdUlEQWRqdXN0LCB1SURBZGp1c3RNYXgsIHVGbGFncyk7CgoJaWYgKCFobURzdCB8fCAhaG1TcmMpCgl7IHJldHVybiB1SURNYXg7Cgl9CgoJbkl0ZW0gPSBHZXRNZW51SXRlbUNvdW50MzIoaG1Ec3QpOwoJaWYgKHVJbnNlcnQgPj0gKFVJTlQzMiluSXRlbSkKCXsgdUluc2VydCA9IChVSU5UMzIpbkl0ZW07CgkgIGJBbHJlYWR5U2VwYXJhdGVkID0gVFJVRTsKCX0KCWVsc2UKCXsgYkFscmVhZHlTZXBhcmF0ZWQgPSBfU0hJc01lbnVTZXBhcmF0b3IoaG1Ec3QsIHVJbnNlcnQpOzsKCX0KCWlmICgodUZsYWdzICYgTU1fQUREU0VQQVJBVE9SKSAmJiAhYkFscmVhZHlTZXBhcmF0ZWQpCgl7IC8qIEFkZCBhIHNlcGFyYXRvciBiZXR3ZWVuIHRoZSBtZW51cyAqLwoJICBJbnNlcnRNZW51MzJBKGhtRHN0LCB1SW5zZXJ0LCBNRl9CWVBPU0lUSU9OIHwgTUZfU0VQQVJBVE9SLCAwLCBOVUxMKTsKCSAgYkFscmVhZHlTZXBhcmF0ZWQgPSBUUlVFOwogICAgICAgIH0KCgogICAgICAgIC8qIEdvIHRocm91Z2ggdGhlIG1lbnUgaXRlbXMgYW5kIGNsb25lIHRoZW0qLwogICAgICAgIGZvciAobkl0ZW0gPSBHZXRNZW51SXRlbUNvdW50MzIoaG1TcmMpIC0gMTsgbkl0ZW0gPj0gMDsgbkl0ZW0tLSkKICAgICAgICB7IG1paVNyYy5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPMzJBKTsKCSAgbWlpU3JjLmZNYXNrID0gTUlJTV9TVEFURSB8IE1JSU1fSUQgfCBNSUlNX1NVQk1FTlUgfCBNSUlNX0NIRUNLTUFSS1MgfCBNSUlNX1RZUEUgfCBNSUlNX0RBVEE7CgkgIC8qIFdlIG5lZWQgdG8gcmVzZXQgdGhpcyBldmVyeSB0aW1lIHRocm91Z2ggdGhlIGxvb3AgaW4gY2FzZQoJICBtZW51cyBET04nVCBoYXZlIElEcyovCgkgIG1paVNyYy5mVHlwZSA9IE1GVF9TVFJJTkc7CgkgIG1paVNyYy5kd1R5cGVEYXRhID0gc3pOYW1lOwoJICBtaWlTcmMuZHdJdGVtRGF0YSA9IDA7CgkgIG1paVNyYy5jY2ggPSBzaXplb2Yoc3pOYW1lKTsKCgkgIGlmICghR2V0TWVudUl0ZW1JbmZvMzJBKGhtU3JjLCBuSXRlbSwgVFJVRSwgJm1paVNyYykpCgkgIHsgY29udGludWU7CgkgIH0KCSAgaWYgKG1paVNyYy5mVHlwZSAmIE1GVF9TRVBBUkFUT1IpCgkgIHsgLyogVGhpcyBpcyBhIHNlcGFyYXRvcjsgZG9uJ3QgcHV0IHR3byBvZiB0aGVtIGluIGEgcm93Ki8KCSAgICBpZiAoYkFscmVhZHlTZXBhcmF0ZWQpCgkgICAgeyBjb250aW51ZTsKCSAgICB9CgkgICAgYkFscmVhZHlTZXBhcmF0ZWQgPSBUUlVFOwoJICB9CgkgIGVsc2UgaWYgKG1paVNyYy5oU3ViTWVudSkKCSAgeyBpZiAodUZsYWdzICYgTU1fU1VCTUVOVVNIQVZFSURTKQoJICAgIHsgLyogQWRqdXN0IHRoZSBJRCBhbmQgY2hlY2sgaXQqLwoJICAgICAgbWlpU3JjLndJRCArPSB1SURBZGp1c3Q7CgkgICAgICBpZiAobWlpU3JjLndJRCA+IHVJREFkanVzdE1heCkKCSAgICAgIHsgY29udGludWU7CgkgICAgICB9CgkgICAgICBpZiAodUlETWF4IDw9IG1paVNyYy53SUQpCgkgICAgICB7IHVJRE1heCA9IG1paVNyYy53SUQgKyAxOwoJICAgICAgfQoJICAgIH0KCSAgICBlbHNlCgkgICAgeyAvKiBEb24ndCBzZXQgSURzIGZvciBzdWJtZW51cyB0aGF0IGRpZG4ndCBoYXZlIHRoZW0gYWxyZWFkeSAqLwoJICAgICAgbWlpU3JjLmZNYXNrICY9IH5NSUlNX0lEOwoJICAgIH0KCSAgICBobVN1Yk1lbnUgPSBtaWlTcmMuaFN1Yk1lbnU7CgkgICAgbWlpU3JjLmhTdWJNZW51ID0gQ3JlYXRlUG9wdXBNZW51MzIoKTsKCSAgICBpZiAoIW1paVNyYy5oU3ViTWVudSkKCSAgICB7IHJldHVybih1SURNYXgpOwoJICAgIH0KCSAgICB1VGVtcCA9IFNoZWxsX01lcmdlTWVudXMzMihtaWlTcmMuaFN1Yk1lbnUsIGhtU3ViTWVudSwgMCwgdUlEQWRqdXN0LCB1SURBZGp1c3RNYXgsIHVGbGFncyZNTV9TVUJNRU5VU0hBVkVJRFMpOwoJICAgIGlmICh1SURNYXggPD0gdVRlbXApCgkgICAgeyB1SURNYXggPSB1VGVtcDsKCSAgICB9CgkgICAgYkFscmVhZHlTZXBhcmF0ZWQgPSBGQUxTRTsKCSAgfQoJICBlbHNlCgkgIHsgLyogQWRqdXN0IHRoZSBJRCBhbmQgY2hlY2sgaXQqLwoJICAgIG1paVNyYy53SUQgKz0gdUlEQWRqdXN0OwoJICAgIGlmIChtaWlTcmMud0lEID4gdUlEQWRqdXN0TWF4KQoJICAgIHsgY29udGludWU7CgkgICAgfQoJICAgIGlmICh1SURNYXggPD0gbWlpU3JjLndJRCkKCSAgICB7IHVJRE1heCA9IG1paVNyYy53SUQgKyAxOwoJICAgIH0KCSAgICBiQWxyZWFkeVNlcGFyYXRlZCA9IEZBTFNFOwoJICB9CgkgIGlmICghSW5zZXJ0TWVudUl0ZW0zMkEoaG1Ec3QsIHVJbnNlcnQsIFRSVUUsICZtaWlTcmMpKQoJICB7IHJldHVybih1SURNYXgpOwoJICB9Cgl9CgoJLyogRW5zdXJlIHRoZSBjb3JyZWN0IG51bWJlciBvZiBzZXBhcmF0b3JzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCiAgICAgICAgaW5zZXJ0ZWQgbWVudSBpdGVtcyovCiAgICAgICAgaWYgKHVJbnNlcnQgPT0gMCkKICAgICAgICB7IGlmIChiQWxyZWFkeVNlcGFyYXRlZCkKCSAgeyBEZWxldGVNZW51MzIoaG1Ec3QsIHVJbnNlcnQsIE1GX0JZUE9TSVRJT04pOwoJICB9Cgl9CgllbHNlCgl7IGlmIChfU0hJc01lbnVTZXBhcmF0b3IoaG1Ec3QsIHVJbnNlcnQtMSkpCgkgIHsgaWYgKGJBbHJlYWR5U2VwYXJhdGVkKQoJICAgIHsgRGVsZXRlTWVudTMyKGhtRHN0LCB1SW5zZXJ0LCBNRl9CWVBPU0lUSU9OKTsKCSAgICB9CgkgIH0KCSAgZWxzZQoJICB7IGlmICgodUZsYWdzICYgTU1fQUREU0VQQVJBVE9SKSAmJiAhYkFscmVhZHlTZXBhcmF0ZWQpCgkgICAgeyAvKiBBZGQgYSBzZXBhcmF0b3IgYmV0d2VlbiB0aGUgbWVudXMqLwoJICAgICAgSW5zZXJ0TWVudTMyQShobURzdCwgdUluc2VydCwgTUZfQllQT1NJVElPTiB8IE1GX1NFUEFSQVRPUiwgMCwgTlVMTCk7CgkgICAgfQoJICB9Cgl9CiAgICAgICAgcmV0dXJuKHVJRE1heCk7Cgp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhdGhHZXREcml2ZU51bWJlcjMyIFtTSEVMTDMyLjU3XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgUGF0aEdldERyaXZlTnVtYmVyMzIoTFBTVFIgdSkKewlGSVhNRShzaGVsbCwiJXMgc3R1YlxuIixkZWJ1Z3N0cl9hKHUpKTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERyaXZlVHlwZTMyIFtTSEVMTDMyLjY0XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRHJpdmVUeXBlMzIoRFdPUkQgdSkKewlGSVhNRShzaGVsbCwiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBYm9ydEludm9rZUNvbW1hbmQgW1NIRUxMMzIuMTk4XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hBYm9ydEludm9rZUNvbW1hbmQoKQp7CUZJWE1FKHNoZWxsLCJzdHViXG4iKTsKCXJldHVybiAxOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIT3V0T2ZNZW1vcnlNZXNzYWdlQm94IFtTSEVMTDMyLjEyNl0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIT3V0T2ZNZW1vcnlNZXNzYWdlQm94KERXT1JEIHUsIERXT1JEIHYsIERXT1JEIHcpCnsJRklYTUUoc2hlbGwsIjB4JTA0bHggMHglMDRseCAweCUwNGx4IHN0dWJcbiIsdSx2LHcpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGbHVzaENsaXBib2FyZCBbU0hFTEwzMi4xMjFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEZsdXNoQ2xpcGJvYXJkKCkKewlGSVhNRShzaGVsbCwic3R1YlxuIik7CglyZXR1cm4gMTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVHZXREaXJXIFtTSEVMTDMyLjI4MV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNoZUdldERpclcoTFBXU1RSIHUsIExQV1NUUiB2KQp7CUZJWE1FKHNoZWxsLCIlcyAlcyBzdHViXG4iLGRlYnVnc3RyX3codSksZGVidWdzdHJfdyh2KSApOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyUkNoclcgW1NIRUxMMzIuMzIwXQogKgogKi8KTFBXU1RSIFdJTkFQSSBTdHJSQ2hyVyhMUFdTVFIgbHBTdGFydCwgTFBXU1RSIGxwRW5kLCBEV09SRCB3TWF0Y2gpCnsJTFBXU1RSIHdwdHI9TlVMTDsKCVRSQUNFKHNoZWxsLCIlcyAlcyAweCUwNHhcbiIsZGVidWdzdHJfdyhscFN0YXJ0KSxkZWJ1Z3N0cl93KGxwRW5kKSwgKFdDSEFSKXdNYXRjaCApOwoKCS8qIGlmIHRoZSBlbmQgbm90IGdpdmVuLCBzZWFyY2gqLwoJaWYgKCFscEVuZCkKCXsgbHBFbmQ9bHBTdGFydDsKCSAgd2hpbGUgKCpscEVuZCkgCgkgICAgbHBFbmQrKzsKCX0KCglkbyAKCXsgaWYgKCpscFN0YXJ0PT0oV0NIQVIpd01hdGNoKQoJICAgIHdwdHIgPSBscFN0YXJ0OwoJICBscFN0YXJ0Kys7ICAKCX0gd2hpbGUgKCBscFN0YXJ0PD1scEVuZCApOyAKCXJldHVybiB3cHRyOwp9Cg==