badmfck-api-server 2.7.3 → 2.7.5
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/apiServer/APIService.js +2 -2
- package/dist/apiServer/BaseService.d.ts +1 -0
- package/dist/apiServer/BaseService.js +12 -1
- package/dist/apiServer/DBService.d.ts +55 -5
- package/dist/apiServer/DBService.js +48 -6
- package/dist/apiServer/db/IDBAdapter.d.ts +7 -0
- package/dist/apiServer/db/IDBAdapter.js +3 -0
- package/dist/apiServer/db/MysqlAdapter.d.ts +45 -0
- package/dist/apiServer/db/MysqlAdapter.js +433 -0
- package/dist/apiServer/structures/DefaultErrors.d.ts +2 -1
- package/dist/apiServer/structures/DefaultErrors.js +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -2
- package/package.json +1 -1
@@ -88,7 +88,7 @@ async function Initializer(services) {
|
|
88
88
|
exports.Initializer = Initializer;
|
89
89
|
class APIService extends BaseService_1.BaseService {
|
90
90
|
static nextLogID = 0;
|
91
|
-
version = "2.7.
|
91
|
+
version = "2.7.5";
|
92
92
|
options;
|
93
93
|
monitor;
|
94
94
|
monitorIndexFile;
|
@@ -510,4 +510,4 @@ class APIService extends BaseService_1.BaseService {
|
|
510
510
|
}
|
511
511
|
}
|
512
512
|
exports.APIService = APIService;
|
513
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQVBJU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGlTZXJ2ZXIvQVBJU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUF3RDtBQUN4RCwrQ0FBeUQ7QUFDekQsZ0RBQXVCO0FBRXZCLGlEQUE0RDtBQUM1RCw0RUFBc0U7QUFFdEUsbURBQWtDO0FBQ2xDLDZDQUF5RDtBQUN6RCwrQ0FBMkM7QUFDM0MsZ0RBQXVCO0FBQ3ZCLG9EQUE0QjtBQUM1Qiw0Q0FBbUI7QUFDbkIsNEVBQTJDO0FBQzNDLDRDQUFtQjtBQUNuQixnREFBNEM7QUFDNUMsa0RBQThDO0FBQzlDLGdEQUF1QjtBQUN2QixpREFBNkM7QUFFN0MsK0NBQTJDO0FBQzNDLGdGQUE0RTtBQW1DNUUsU0FBZ0IsaUJBQWlCO0lBQ2hDLE9BQU87UUFDTixJQUFJLEVBQUUsSUFBSTtRQUNWLFlBQVksRUFBRSxPQUFPO1FBQ3JCLGlCQUFpQixFQUFFO1lBQ2xCLHVCQUF1QjtTQUN2QjtRQUNELFNBQVMsRUFBRSxFQUFFO1FBQ2IsU0FBUyxFQUFDLE1BQU07UUFDaEIsWUFBWSxFQUFFLFVBQVUsR0FBNkI7WUFDcEQsSUFBQSxvQkFBTyxFQUFDLGtCQUFrQixFQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2hDLENBQUM7UUFDRCxPQUFPLEVBQUMsVUFBUyxHQUFPO1lBQ3ZCLElBQUEscUJBQVEsRUFBQyxrQkFBa0IsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsdUJBQXVCLEVBQUMsS0FBSztRQUM3QixTQUFTLEVBQUMsRUFBRSxHQUFDLElBQUksR0FBQyxJQUFJO1FBQ3RCLFdBQVcsRUFBQyxjQUFJLENBQUMsT0FBTyxDQUFDLFlBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBQyxhQUFhLENBQUM7S0FDbkQsQ0FBQTtBQUNGLENBQUM7QUFuQkQsOENBbUJDO0FBRVksUUFBQSxrQkFB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QWEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQTtZQUNoRSxPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsSUFBRyxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUM7WUFDM0IsSUFBRyxDQUFDLE1BQU07Z0JBQ1QsTUFBTSxHQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNqQixLQUFJLElBQUksQ0FBQyxJQUFJLElBQUksRUFBQztnQkFDakIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFHLEdBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUcsTUFBTSxJQUFFLENBQUMsRUFBQztvQkFDWixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUMsYUFBYSxHQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFBLElBQUksQ0FBQyxNQUFNLENBQUEsQ0FBQyxDQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNyRixNQUFNO2lCQUNOO2FBQ0Q7U0FDRDtRQUNELE9BQU8sTUFBTSxJQUFJLElBQUksQ0FBQztJQUN2QixDQUFDOztBQWhoQkYsZ0NBa2hCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBleHByZXNzLCB7IEFwcGxpY2F0aW9uLCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnXG5pbXBvcnQgeyBCYXNlU2VydmljZSwgSUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9CYXNlU2VydmljZSdcbmltcG9ydCBjb3JzIGZyb20gJ2NvcnMnXG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UgfSBmcm9tICdodHRwJ1xuaW1wb3J0IHsgQmFzZUVuZHBvaW50LCBJQmFzZUVuZHBvaW50IH0gZnJvbSAnLi9CYXNlRW5kcG9pbnQnXG5pbXBvcnQgRGVmYXVsdEVycm9ycywgeyBFcnJvclV0aWxzIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzL0RlZmF1bHRFcnJvcnMnXG5pbXBvcnQgeyBIVFRQUmVxdWVzdFZPLCBJRXJyb3IsIFRyYW5zZmVyUGFja2V0Vk8gfSBmcm9tICcuL3N0cnVjdHVyZXMvSW50ZXJmYWNlcydcbmltcG9ydCB7UmVxfSBmcm9tIFwiYmFkbWZjay1zaWduYWxcIlxuaW1wb3J0IHsgbG9nQ3JpdCwgbG9nRXJyb3IsIGxvZ0luZm8gfSBmcm9tICcuL0xvZ1NlcnZpY2UnXG5pbXBvcnQgeyBNb25pdG9yIH0gZnJvbSAnLi9tb25pdG9yL01vbml0b3InXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0IGZpbGVVcGxvYWQgZnJvbSAnZXhwcmVzcy1maWxldXBsb2FkJ1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiXG5pbXBvcnQgeyBMaXZlbmVzcyB9IGZyb20gJy4vcm91dGVzL0xpdmVuZXNzJ1xuaW1wb3J0IHsgUmVhZGluZXNzIH0gZnJvbSAnLi9yb3V0ZXMvUmVhZGluZXNzJ1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCdcbmltcG9ydCB7IGlzTXlzcWxFcnJvciB9IGZyb20gJy4vTXlzcWxTZXJ2aWNlJ1xuaW1wb3J0IHsgTXlzcWxFcnJvciB9IGZyb20gJ215c3FsJ1xuaW1wb3J0IHsgU3RhdFNlcnZpY2UgfSBmcm9tICcuL1N0YXRTZXJ2aWNlJ1xuaW1wb3J0IHsgRXh0ZXJuYWxTZXJ2aWNlRW5kcG9pbnQgfSBmcm9tICcuL2V4dGVybmFsL0V4dGVybmFsU2VydmljZUVuZHBvaW50J1xuXG5cblxuZXhwb3J0IGludGVyZmFjZSBBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW17XHRcblx0aWQ6bnVtYmVyLFxuXHRjcmVhdGVkOm51bWJlcixcblx0dGltZTpudW1iZXIsXG5cdHJlZmVyZXI/OnN0cmluZyxcblx0cmVxdWVzdDp7W2tleTpzdHJpbmddOmFueX0sXG5cdHJlc3BvbnNlOntba2V5OnN0cmluZ106YW55fVxuXHRlcnJvcj86c3RyaW5nfG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBUElTZXJ2aWNlT3B0aW9uc3tcblx0cG9ydDpudW1iZXIsXG5cdGJhc2VFbmRQb2ludDpzdHJpbmcgLy8gXCIvYXBpL1wiXG5cdGNvcnNIb3N0V2hpdGVMaXN0OnN0cmluZ1tdLFxuXHRlbmRwb2ludHM6SUJhc2VFbmRwb2ludFtdLFxuXHRqc29uTGltaXQ6c3RyaW5nIC8vIFwiMTBtYlwiXG5cdG9uTmV0d29ya0xvZz86KChsb2c6QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtKT0+dm9pZCl8bnVsbFxuXHRvbkVycm9yPzooKC4uLnJlc3Q6YW55W10pPT52b2lkKXxudWxsXG5cdGlzUHJvZHVjdGlvbkVudmlyb25tZW50OmJvb2xlYW4sXG5cdGludGVyY2VwdG9yPzpJQmFzZUVuZHBvaW50LFxuXHRwb3N0cHJvZHVjZXI/OihyZXE6SFRUUFJlcXVlc3RWT3x1bmRlZmluZWR8bnVsbCxyZXM6UmVzcG9uc2UsZGF0YTpUcmFuc2ZlclBhY2tldFZPPGFueT4scmVxdWVzdFRpbWU6bnVtYmVyLGVuZHBvaW50PzpzdHJpbmcsbG9nPzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW18bnVsbCk9PlByb21pc2U8VHJhbnNmZXJQYWNrZXRWTz5cblx0cHJlcHJvZHVjZXI/OihyZXE6SFRUUFJlcXVlc3RWT3x1bmRlZmluZWR8bnVsbCk9PmFueVxuXHRcblx0bW9uaXRvcj86e2xvZ2luOnN0cmluZyxwYXNzd29yZDpzdHJpbmd9W11cblx0Ly9kZXBsb3ltZW50Pzp7bG9naW46c3RyaW5nLHBhc3N3b3JkOnN0cmluZ31cblx0YXBwVmVyc2lvbj86c3RyaW5nXG5cblx0ZmlsZVRlbXBEaXI6c3RyaW5nO1xuXHRmaWxlTGltaXQ6bnVtYmVyIC8vIGJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCk6QVBJU2VydmljZU9wdGlvbnN7XG5cdHJldHVybiB7XG5cdFx0cG9ydDogODA5MSxcblx0XHRiYXNlRW5kUG9pbnQ6ICcvYXBpLycsXG5cdFx0Y29yc0hvc3RXaGl0ZUxpc3Q6IFtcblx0XHRcdCdodHRwOi8vbG9jYWxob3N0OjMwMDAnLFxuXHRcdF0sXG5cdFx0ZW5kcG9pbnRzOiBbXSxcblx0XHRqc29uTGltaXQ6XCIxMG1iXCIsXG5cdFx0b25OZXR3b3JrTG9nOiBmdW5jdGlvbiAobG9nOiBBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0pOiB2b2lkIHtcblx0XHRcdGxvZ0luZm8oXCIke0FQSVNlcnZpY2UuanN9XCIsbG9nKVxuXHRcdH0sXG5cdFx0b25FcnJvcjpmdW5jdGlvbihlcnI6YW55KXtcblx0XHRcdGxvZ0Vycm9yKFwiJHtBUElTZXJ2aWNlLmpzfVwiLGVycik7XG5cdFx0fSxcblx0XHRpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudDpmYWxzZSxcblx0XHRmaWxlTGltaXQ6NTAqMTAyNCoxMDI0LFxuXHRcdGZpbGVUZW1wRGlyOnBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSxcImZpbGVUZW1wRGlyXCIpXG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IFJFUV9DUkVBVEVfTkVUX0xPRzpSZXE8dm9pZCxBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0+ID0gbmV3IFJlcSh1bmRlZmluZWQsXCJSRVFfQ1JFQVRFX05FVF9MT0dcIik7XG5leHBvcnQgY29uc3QgUkVRX0hUVFBfTE9HOlJlcTx2b2lkLEFQSVNlcnZpY2VOZXR3b3JrTG9nSXRlbVtdPiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX0hUVFBfTE9HXCIpO1xuZXhwb3J0IGNvbnN0IFJFUV9IVFRQX1JFUVVFU1RTX0NPVU5UOlJlcTx2b2lkLG51bWJlcj4gPSBuZXcgUmVxKHVuZGVmaW5lZCxcIlJFUV9IVFRQX1JFUVVFU1RTX0NPVU5UXCIpO1xuZXhwb3J0IGNvbnN0IFJFUV9IVFRQX1NFUlZFUjpSZXE8dm9pZCx7ZXhwcmVzczpBcHBsaWNhdGlvbixodHRwOmh0dHAuU2VydmVyfT4gPSBuZXcgUmVxKHVuZGVmaW5lZCxcIlJFUV9IVFRQX1NFUlZFUlwiKTtcbmV4cG9ydCBjb25zdCBSRVFfSU5URVJOQUxfQ0FMTDpSZXE8SFRUUFJlcXVlc3RWTyxJRXJyb3J8YW55PiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX0lOVEVSTkFMX0NBTExcIik7XG5leHBvcnQgY29uc3QgUkVRX01PTklUT1JfVVNFUlM6UmVxPHthdXRob3JpemF0aW9uOnN0cmluZ30sYW55PiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX01PTklUT1JfVVNFUlNcIik7XG5cbmNvbnN0IGFjdGl2ZVNlcnZpY2VzOlN0cmluZ1tdPVtdXG5jb25zdCBlbnRyeVBvaW50czpTdHJpbmdbXT1bXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gSW5pdGlhbGl6ZXIoc2VydmljZXM6SUJhc2VTZXJ2aWNlW10pe1xuXHQvLyBhZGQgc3RhdCBzZXJ2aWNlXG5cdHNlcnZpY2VzLnB1c2gobmV3IFN0YXRTZXJ2aWNlKCkpO1xuXHRcbiAgICBmb3IgKGxldCBpIG9mIHNlcnZpY2VzKSB7IGF3YWl0IGkuaW5pdCgpO2FjdGl2ZVNlcnZpY2VzLnB1c2goaS5nZXROYW1lKCkpIH1cbiAgICBmb3IgKGxldCBpIG9mIHNlcnZpY2VzKSB7IGkuYXBwbGljYXRpb25SZWFkeSgpIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFQSVNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XG5cblx0Ly8gTkVUIExPR1xuXHRwcml2YXRlIHN0YXRpYyBuZXh0TG9nSUQ9MDtcblx0cHJpdmF0ZSB2ZXJzaW9uID0gXCIyLjcuM1wiXG5cdHByaXZhdGUgb3B0aW9uczpBUElTZXJ2aWNlT3B0aW9ucztcblx0cHJpdmF0ZSBtb25pdG9yPzpNb25pdG9yXG5cdHByaXZhdGUgbW9uaXRvckluZGV4RmlsZT86QnVmZmVyXG5cdHByaXZhdGUgc3RhcnRlZDpEYXRlID0gbmV3IERhdGUoKTtcblx0cHJpdmF0ZSByZXF1ZXN0c0NvdW50PTA7XG5cdHByaXZhdGUgc2VydmVyPWh0dHBcblxuXHRuZXRMb2c6QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtW109W107XG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucz86QVBJU2VydmljZU9wdGlvbnN8bnVsbCkge1xuXHRcdHN1cGVyKCdIVFRQIFNlcnZpY2UnKVxuXHRcdHRoaXMub3B0aW9ucz1vcHRpb25zID8/IGdldERlZmF1bHRPcHRpb25zKCk7XG5cdFx0aWYoIXRoaXMub3B0aW9ucy5jb3JzSG9zdFdoaXRlTGlzdClcblx0XHRcdHRoaXMub3B0aW9ucy5jb3JzSG9zdFdoaXRlTGlzdD1bXTtcblx0XHRjb25zdCBzZWxmID0gXCJodHRwOi8vbG9jYWxob3N0OlwiK3RoaXMub3B0aW9ucy5wb3J0O1xuXHRcdGlmKCF0aGlzLm9wdGlvbnMuY29yc0hvc3RXaGl0ZUxpc3QuZmluZCh2YWw9PnZhbD09PXNlbGYpKVxuXHRcdFx0dGhpcy5vcHRpb25zLmNvcnNIb3N0V2hpdGVMaXN0LnB1c2goKVxuXG5cdFx0aWYodGhpcy5vcHRpb25zLm1vbml0b3IgJiYgdGhpcy5vcHRpb25zLm1vbml0b3IubGVuZ3RoPjApe1xuXHRcdFx0dGhpcy5tb25pdG9yPW5ldyBNb25pdG9yKCk7XG5cdFx0XHR0aGlzLm9wdGlvbnMuZW5kcG9pbnRzLnB1c2godGhpcy5tb25pdG9yKVxuXHRcdFx0Y29uc29sZS53YXJuKFwiU2VydmljZSBNb25pdG9yIGluaXRpYWxpemVkXCIpXG5cdFx0XHRjb25zb2xlLndhcm4oXCJtb25pdG9yIGxpbmtzOlwiKVxuXHRcdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5tb25pdG9yKXtcblx0XHRcdFx0Y29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpLmxvZ2luK2kucGFzc3dvcmQpLmRpZ2VzdCgpLnRvU3RyaW5nKFwiaGV4XCIpXG5cdFx0XHRcdGNvbnNvbGUud2FybihcIk1vbml0b3IgbGluayBmb3I6IFwiK2kubG9naW4rXCIgLT4gL3NtLVwiK2hhc2gpXHRcdFx0XHRcdFx0XG5cdFx0XHR9XG5cblx0XHRcdFJFUV9NT05JVE9SX1VTRVJTLmxpc3RlbmVyID0gYXN5bmMgKHJlcSk9Pntcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gW11cblx0XHRcdFx0aWYodGhpcy5vcHRpb25zLm1vbml0b3Ipe1xuXHRcdFx0XHRcdGZvcihsZXQgaSBvZiB0aGlzLm9wdGlvbnMubW9uaXRvcil7XG5cdFx0XHRcdFx0XHRjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGkubG9naW4raS5wYXNzd29yZCkuZGlnZXN0KCkudG9TdHJpbmcoXCJoZXhcIik7XG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChoYXNoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhdHRhY2ggZW5kcG9pbnRzIGZvciBleHRlcm5hbCBjYWxsc1xuXHRcdHRoaXMub3B0aW9ucy5lbmRwb2ludHMucHVzaChuZXcgRXh0ZXJuYWxTZXJ2aWNlRW5kcG9pbnQoKSk7XG5cblx0XHQvLyBjcmVhdGUgbGl2ZW5lc3MsIHJlYWRpbmVzc1xuXHRcdHRoaXMub3B0aW9ucy5lbmRwb2ludHMucHVzaChuZXcgTGl2ZW5lc3ModGhpcy5zdGFydGVkKSxuZXcgUmVhZGluZXNzKHRoaXMuc3RhcnRlZCkpXG5cdFx0UkVRX0hUVFBfUkVRVUVTVFNfQ09VTlQubGlzdGVuZXIgPSBhc3luYyAoKSA9PiB0aGlzLnJlcXVlc3RzQ291bnQ7XG5cdH1cblxuXG5cdG92ZXJyaWRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cblx0XHRSRVFfSFRUUF9MT0cubGlzdGVuZXI9YXN5bmMgaWdub3JlPT50aGlzLm5ldExvZztcblx0XHRSRVFfQ1JFQVRFX05FVF9MT0cubGlzdGVuZXIgPSBhc3luYyBpZ25vcmU9Pntcblx0XHRcdGNvbnN0IGxvZzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0gPSB7XG5cdFx0XHRcdGNyZWF0ZWQ6ICtuZXcgRGF0ZSgpLFxuXHRcdFx0XHR0aW1lOiAwLFxuXHRcdFx0XHRyZXF1ZXN0OiB7fSxcblx0XHRcdFx0cmVzcG9uc2U6IHt9LFxuXHRcdFx0XHRlcnJvcjpudWxsLFxuXHRcdFx0XHRpZDogQVBJU2VydmljZS5uZXh0TG9nSUQrK1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5uZXRMb2cucHVzaChsb2cpXG5cdFx0XHRpZih0aGlzLm5ldExvZy5sZW5ndGg+MTAwMClcblx0XHRcdFx0dGhpcy5uZXRMb2cuc2hpZnQoKVxuXHRcdFx0cmV0dXJuIGxvZztcblx0XHR9XG5cblx0XHQvLyBpbnRlcm5hbCBjYWxsXG5cdFx0UkVRX0lOVEVSTkFMX0NBTEwubGlzdGVuZXIgPSBhc3luYyAocmVxKT0+e1xuXHRcdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5lbmRwb2ludHMpe1xuXHRcdFx0XHRpZighaSB8fCAhaS5lbmRwb2ludHMpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdGZvcihsZXQgaiBvZiBpLmVuZHBvaW50cyl7XG5cdFx0XHRcdFx0bGV0IGVwID0gQmFzZUVuZHBvaW50LmdldEVudHJ5UG9pbnQoKStqLmVuZHBvaW50O1xuXHRcdFx0XHRcdGVwID0gZXAucmVwbGFjZUFsbChcIi8vXCIsXCIvXCIpXG5cdFx0XHRcdFx0aWYoZXAgPT09IHJlcS5lbmRwb2ludCl7XG5cdFx0XHRcdFx0XHRyZXEuaW50ZXJuYWxDYWxsPXRydWU7XG5cdFx0XHRcdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGkuZXhlY3V0ZShyZXEpXG5cdFx0XHRcdFx0XHRpZihyZXNwb25zZS5lcnJvcilcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge2Vycm9yOkRlZmF1bHRFcnJvcnMuVU5LTk9XTl9SRVFVRVNULGRhdGE6bnVsbCxodHRwU3RhdHVzOjQwNH1cblx0XHR9XG5cblx0XHQvLyBpbml0aWFsaXplIGV4cHJlc3Ncblx0XHRjb25zdCBhcHAgPSBleHByZXNzKClcblx0XHRjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhcHApO1xuXG5cdFx0UkVRX0hUVFBfU0VSVkVSLmxpc3RlbmVyID0gYXN5bmMgaWdub3JlPT57cmV0dXJuIHtleHByZXNzOmFwcCxodHRwOnNlcnZlcn19O1xuXG5cdFx0aWYodGhpcy5vcHRpb25zLmlzUHJvZHVjdGlvbkVudmlyb25tZW50KVxuXHRcdFx0YXBwLnNldChcImVudlwiLCdwcm9kdWN0aW9uJyk7XG5cblx0XHRhcHAudXNlKGV4cHJlc3MuanNvbih7IGxpbWl0OiAnMTBtYicgfSkpIC8vIGZvciBwYXJzaW5nIGFwcGxpY2F0aW9uL2pzb25cblx0XHRhcHAudXNlKGV4cHJlc3MudXJsZW5jb2RlZCh7IGxpbWl0OiAnMTBtYicsIGV4dGVuZGVkOiB0cnVlIH0pKSAvLyBmb3IgcGFyc2luZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblxuXHRcdGFwcC51c2UoZmlsZVVwbG9hZCh7XG5cdFx0XHRsaW1pdEhhbmRsZXI6IChyZXEsIHJlcywgbmV4dCk9Pntcblx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtcblx0XHRcdFx0XHRlcnJvcjpEZWZhdWx0RXJyb3JzLkZJTEVfVE9PX0xBUkdFLFxuXHRcdFx0XHRcdGRhdGE6bnVsbCxcblx0XHRcdFx0XHRodHRwU3RhdHVzOjQxMyxcblx0XHRcdFx0fSwrbmV3IERhdGUoKSxyZXEucGF0aCk7XG5cdFx0XHR9LFxuXHRcdFx0bGltaXRzOiB7IGZpbGVTaXplOiB0aGlzLm9wdGlvbnMuZmlsZUxpbWl0IH0sXG5cdFx0XHR1c2VUZW1wRmlsZXM6IHRydWUsXG5cdFx0XHR1cmlEZWNvZGVGaWxlTmFtZXM6IHRydWUsXG5cdFx0XHR0ZW1wRmlsZURpcjogdGhpcy5vcHRpb25zLmZpbGVUZW1wRGlyLFxuXHRcdFx0Ly9zYWZlRmlsZU5hbWVzOiB0cnVlLFxuXHRcdFx0YWJvcnRPbkxpbWl0OnRydWVcblx0XHR9KSlcblxuXHRcdGFwcC51c2UoYXN5bmMgKGVycjphbnkscmVxOmFueSxyZXNwOmFueSxuZXh0OmFueSk9Pntcblx0XHRcdFxuXHRcdFx0aWYoIWVycil7XG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHR9XG5cdFx0XHRcdC8vcmVxdWVzdCBzdGFydCB0aW1lXG5cdFx0XHRjb25zdCB0bWUgPSArbmV3IERhdGUoKTtcblx0XHRcdGNvbnN0IGxvZyA9IGF3YWl0IFJFUV9DUkVBVEVfTkVUX0xPRy5yZXF1ZXN0KCk7XG5cdFx0XHRsb2cucmVxdWVzdD17XG5cdFx0XHRcdG1ldGhvZDpyZXEubWV0aG9kLFxuXHRcdFx0XHRkYXRhOlwiXCIsXG5cdFx0XHRcdHBhcmFtczpyZXEucGFyYW1zXG5cdFx0XHR9XG5cblx0XHRcdGxldCByZXNwb25zZUVycm9yPURlZmF1bHRFcnJvcnMuVU5LTk9XTl9SRVFVRVNUO1xuXHRcdFx0aWYgKHR5cGVvZiBlcnIgPT09IFwib2JqZWN0XCIgJiYgZXJyLnN0YXR1cyA9PT0gNDAwICYmICdib2R5JyBpbiBlcnIgJiYgZXJyLnR5cGUgPT09ICdlbnRpdHkucGFyc2UuZmFpbGVkJykge1xuXHRcdFx0XHRyZXNwb25zZUVycm9yID0gRGVmYXVsdEVycm9ycy5KU09OX01BTEZPUk1FRFxuXHRcdFx0fVxuICAgICAgXG5cblx0XHRcdHRoaXMuc2VuZFJlc3BvbnNlKHJlcS5nZXQoXCJSZWZlcmVyXCIpPz9cIlwiLHJlc3Ase1xuXHRcdFx0XHRlcnJvcjpyZXNwb25zZUVycm9yLFxuXHRcdFx0XHRkYXRhOm51bGwsXG5cdFx0XHRcdGh0dHBTdGF0dXM6NDAwXG5cdFx0XHR9LHRtZSxcIlwiLGxvZylcblxuXHRcdH0pXG5cblx0XHRjb25zdCBjb3JzT3B0aW9ucyA9IHtcblx0XHRcdG9yaWdpbjogKG9yaWdpbjogYW55LCBjYWxsYmFjazogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9yaWdpbklzV2hpdGVsaXN0ZWQgPSB0aGlzLm9wdGlvbnMuY29yc0hvc3RXaGl0ZUxpc3QuaW5jbHVkZXMob3JpZ2luKVxuXHRcdFx0XHRjYWxsYmFjayhudWxsLCBvcmlnaW5Jc1doaXRlbGlzdGVkKVxuXHRcdFx0fSxcblx0XHRcdGNyZWRlbnRpYWxzOiB0cnVlXG5cdFx0fVxuXHRcdGFwcC51c2UoY29ycyhjb3JzT3B0aW9ucykpXG5cblx0XHQvLyByZWdpc3RyYXRlIGVuZHBvaW50c1xuXHRcdEJhc2VFbmRwb2ludC5zZXRFbnRyeVBvaW50KHRoaXMub3B0aW9ucy5iYXNlRW5kUG9pbnQpXG5cdFx0XG5cdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5lbmRwb2ludHMpe1xuXHRcdFx0YXdhaXQgaS5pbml0KCk7XG5cdFx0XHRpZighaS5lbmRwb2ludHMpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0Zm9yKGxldCBqIG9mIGkuZW5kcG9pbnRzKXtcblx0XHRcdFx0bGV0IGVwID0gQmFzZUVuZHBvaW50LmdldEVudHJ5UG9pbnQoKStqLmVuZHBvaW50O1xuXHRcdFx0XHRlcCA9IGVwLnJlcGxhY2VBbGwoXCIvL1wiLFwiL1wiKVxuXHRcdFx0XHRcblxuXHRcdFx0XHQvLyBpbmNvbWluZyByZXF1ZXN0XG5cdFx0XHRcdGFwcC5hbGwoZXAsYXN5bmMgKHJlcSxyZXMpPT57XG5cdFx0XHRcdFx0dGhpcy5yZXF1ZXN0c0NvdW50Kys7XG5cdFx0XHRcdFx0Y29uc3QgdG1lID0gK25ldyBEYXRlKCk7XG5cdFx0XHRcdFx0bGV0IGxvZzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW18bnVsbCA9IG51bGw7XG5cdFx0XHRcdFx0aWYoIWkuaWdub3JlSHR0cExvZ2dpbmcpe1xuXHRcdFx0XHRcdFx0bG9nID0gYXdhaXQgUkVRX0NSRUFURV9ORVRfTE9HLnJlcXVlc3QoKTtcblx0XHRcdFx0XHRcdGxvZy5yZXF1ZXN0PXtcblx0XHRcdFx0XHRcdFx0dXJsOnJlcS51cmwsXG5cdFx0XHRcdFx0XHRcdG1ldGhvZDpyZXEubWV0aG9kLFxuXHRcdFx0XHRcdFx0XHRkYXRhOnRoaXMuY2hlY2tEYXRhTGVuZ3RoKHJlcS5ib2R5KSxcblx0XHRcdFx0XHRcdFx0cGFyYW1zOnRoaXMuY2hlY2tEYXRhTGVuZ3RoKHJlcS5wYXJhbXMpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgZXhlY3V0ZSA9IGFzeW5jICgpPT57XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJvZHkgPSByZXEuYm9keTtcblx0XHRcdFx0XHRcdGlmKHJlcS5xdWVyeSAmJiB0eXBlb2YgcmVxLnF1ZXJ5ID09PSBcIm9iamVjdFwiKXtcblx0XHRcdFx0XHRcdFx0Zm9yKGxldCBpIGluIHJlcS5xdWVyeSl7XG5cdFx0XHRcdFx0XHRcdFx0Ym9keVtpXT1yZXEucXVlcnlbaV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgaHR0cFJlcXVlc3Q6SFRUUFJlcXVlc3RWTyA9IHtcblx0XHRcdFx0XHRcdFx0cmF3OnJlcSBhcyBJbmNvbWluZ01lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlOnJlcyxcblx0XHRcdFx0XHRcdFx0bWV0aG9kOnJlcS5tZXRob2QsXG5cdFx0XHRcdFx0XHRcdGRhdGE6cmVxLmJvZHksXG5cdFx0XHRcdFx0XHRcdHBhcmFtczpyZXEucGFyYW1zLFxuXHRcdFx0XHRcdFx0XHRoZWFkZXJzOnJlcS5oZWFkZXJzIGFzIGFueSxcblx0XHRcdFx0XHRcdFx0ZW5kcG9pbnQ6ZXAsXG5cdFx0XHRcdFx0XHRcdGZpbGVzOnJlcS5maWxlcyA/PyBudWxsLFxuXHRcdFx0XHRcdFx0XHRyZWZlcmVyOnJlcS5nZXQoXCJSZWZlcmVyXCIpLFxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZih0aGlzLm9wdGlvbnMucHJlcHJvZHVjZXIpe1xuXHRcdFx0XHRcdFx0XHR0cnl7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByZXByb2R1Y2VyUmVzdWx0ID0gYXdhaXQgdGhpcy5vcHRpb25zLnByZXByb2R1Y2VyKGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0aWYocHJlcHJvZHVjZXJSZXN1bHQpXG5cdFx0XHRcdFx0XHRcdFx0aHR0cFJlcXVlc3QucHJlcHJvZHVjZXJSZXN1bHQgPSBwcmVwcm9kdWNlclJlc3VsdDtcblx0XHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRcdFx0XHRcdGxldCBkZXRhaWxzPWAke2V9YFxuXHRcdFx0XHRcdFx0XHRcdGxldCBzdGFjazpJRXJyb3JbXXx1bmRlZmluZWQ9dW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdGlmKEVycm9yVXRpbHMuaXNFcnJvcihlKSl7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXRhaWxzPShlIGFzIGFueSkubWVzc2FnZVxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhY2sgPSBbZSBhcyBhbnldO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmKGlzTXlzcWxFcnJvcihlKSlcblx0XHRcdFx0XHRcdFx0XHRcdGRldGFpbHMgPSAoZSBhcyBNeXNxbEVycm9yKS5tZXNzYWdlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtlcnJvcjp7Y29kZToxMDAwMixtZXNzYWdlOlwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsc3RhY2s6c3RhY2ssZGV0YWlsczpkZXRhaWxzfSxkYXRhOm51bGwsaHR0cFN0YXR1czo1MDB9LHRtZSxlcCxsb2csaHR0cFJlcXVlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgcmVzdWx0XG5cdFx0XHRcdFx0XHR0cnl7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGlnbm9yZUludGVyY2VwdG9yID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGxldCBhbGxvd0ludGVyY2VwdG9yRXJyb3IgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0aWYoai5pZ25vcmVJbnRlcmNlcHRvcilcblx0XHRcdFx0XHRcdFx0XHRpZ25vcmVJbnRlcmNlcHRvcj10cnVlO1xuXHRcdFx0XHRcdFx0XHRpZihqLmFsbG93SW50ZXJjZXB0b3JFcnJvcilcblx0XHRcdFx0XHRcdFx0XHRhbGxvd0ludGVyY2VwdG9yRXJyb3I9dHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHRpZih0eXBlb2Ygai5oYW5kbGVyID09PSBcIm9iamVjdFwiICl7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdHJ5IHRvIGdldCBoYW5kbGVyIHJlbGF5aW5nIG9uIGh0dHAgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaGFuZGxlciA9IGouaGFuZGxlcltodHRwUmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKV07XG5cdFx0XHRcdFx0XHRcdFx0aWYodHlwZW9mIGhhbmRsZXIgPT09IFwib2JqZWN0XCIpe1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYoaGFuZGxlci5pZ25vcmVJbnRlcmNlcHRvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWdub3JlSW50ZXJjZXB0b3I9dHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKGhhbmRsZXIuYWxsb3dJbnRlcmNlcHRvckVycm9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbGxvd0ludGVyY2VwdG9yRXJyb3I9dHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9IFxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSBpbnRlcmNlcHRvciBpZiBleGlzdHNcblx0XHRcdFx0XHRcdFx0aWYoIWlnbm9yZUludGVyY2VwdG9yKXtcblx0XHRcdFx0XHRcdFx0XHRsZXQgaW50ZXJjZXB0b3JSZXN1bHQ7XG5cdFx0XHRcdFx0XHRcdFx0aWYodGhpcy5vcHRpb25zLmludGVyY2VwdG9yKXtcblx0XHRcdFx0XHRcdFx0XHRcdGludGVyY2VwdG9yUmVzdWx0PWF3YWl0IHRoaXMub3B0aW9ucy5pbnRlcmNlcHRvci5leGVjdXRlKGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKGludGVyY2VwdG9yUmVzdWx0LmVycm9yICYmICFhbGxvd0ludGVyY2VwdG9yRXJyb3Ipe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMsaW50ZXJjZXB0b3JSZXN1bHQsdG1lLGVwLGxvZyxodHRwUmVxdWVzdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGh0dHBSZXF1ZXN0LmludGVyY2VwdG9yUmVzdWx0ID0gaW50ZXJjZXB0b3JSZXN1bHRcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyBQcmVjaGVjayBXSFk/XG5cdFx0XHRcdFx0XHRcdGlmKGkgPT09IHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHRcdFx0XHRodHRwUmVxdWVzdC5wcmVjaGVjaz17ZGF0YTp0aGlzLm9wdGlvbnMubW9uaXRvcn1cblxuXHRcdFx0XHRcdFx0XHRjb25zdCBwcmVjaGVjaz1hd2FpdCBpLnByZWNoZWNrKGh0dHBSZXF1ZXN0KVxuXHRcdFx0XHRcdFx0XHRpZihwcmVjaGVjayAmJiBwcmVjaGVjay5lcnJvcil7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHByZWNoZWNrLHRtZSxlcCxsb2csaHR0cFJlcXVlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGh0dHBSZXF1ZXN0LnByZWNoZWNrPXByZWNoZWNrO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gSWYgaW50ZXJjZXB0b3IgaGFzIG5vIGVycm9ycywgZXhlY3V0ZSBtYWluIGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgaS5leGVjdXRlKGh0dHBSZXF1ZXN0KVxuXG5cblx0XHRcdFx0XHRcdFx0IFxuXHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMub3B0aW9ucy5vbkVycm9yKGUpXG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUZhdGFsRXJyb3IoZXApO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgaWYgZXJyb3IgaXMgSUVycm9yXG5cdFx0XHRcdFx0XHRcdGxldCBkYXRhOlRyYW5zZmVyUGFja2V0Vk8gPSB7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6e1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29kZToxMDAwMixcblx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6XCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGV0YWlsczpgJHtlfWBcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZihFcnJvclV0aWxzLmlzRXJyb3IoZSkpXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YSA9IHtlcnJvcjplIGFzIElFcnJvcn1cblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMsZGF0YSx0bWUsZXAsbG9nLGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHJlc3VsdCx0bWUsZXAsbG9nLGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRleGVjdXRlKClcblx0XHRcdFx0fSk7Ly8gaGFuZGxlIGluY29taW5nIHJlcXVlc3RcblxuXHRcdFx0fVxuXHRcdH1cblxuXHRcblxuXHRcdC8vIGZpbmFsIGhhbmRsZXJcblx0XHRhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuXHRcdFx0XG5cdFx0XHRjb25zdCB0bWUgPSArbmV3IERhdGUoKVxuXG5cdFx0XHRpZih0aGlzLm1vbml0b3IgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb25pdG9yKXtcblx0XHRcdFx0Ly9jaGVjayBpZiByZXF1ZXN0aW5nIG1vbml0b3Jcblx0XHRcdFx0aWYocmVxLm1ldGhvZD09PVwiR0VUXCIpe1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdGxldCBtb25pdG9yUmVxdWVzdD1mYWxzZTtcblx0XHRcdFx0XHRmb3IobGV0IGkgb2YgdGhpcy5vcHRpb25zLm1vbml0b3Ipe1xuXHRcdFx0XHRcdFx0Y29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpLmxvZ2luK2kucGFzc3dvcmQpLmRpZ2VzdCgpLnRvU3RyaW5nKFwiaGV4XCIpXG5cdFx0XHRcdFx0XHRpZihyZXEub3JpZ2luYWxVcmwuZW5kc1dpdGgoXCIvc20tXCIraGFzaCkpe1xuXHRcdFx0XHRcdFx0XHRtb25pdG9yUmVxdWVzdD10cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZihtb25pdG9yUmVxdWVzdCl7XG5cdFx0XHRcdFx0XHQvLyBzZW5kIGluZGV4IFRodSwgMTYgTm92IDIwMjMgMjM6MzM6MzUgR01UXG5cdFx0XHRcdFx0XHRjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcblx0XHRcdFx0XHRcdHRyeXtcblx0XHRcdFx0XHRcdFx0aWYoIXRoaXMubW9uaXRvckluZGV4RmlsZSlcblx0XHRcdFx0XHRcdFx0dGhpcy5tb25pdG9ySW5kZXhGaWxlID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsXCJtb25pdG9yXCIsXCJpbmRleC5odG1sXCIpKTtcblx0XHRcdFx0XHRcdFx0cmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLFwidGV4dC9odG1sXCIpXG5cdFx0XHRcdFx0XHRcdHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiLHRoaXMubW9uaXRvckluZGV4RmlsZS5ieXRlTGVuZ3RoKVxuXHRcdFx0XHRcdFx0XHRyZXMuc3RhdHVzKDIwMCkuc2VuZCh0aGlzLm1vbml0b3JJbmRleEZpbGUpO1xuXHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMse1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yOntcblx0XHRcdFx0XHRcdFx0XHRcdGNvZGU6MTAwMDIsXG5cdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOlwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRkZXRhaWxzOmAke2V9YFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTpudWxsLFxuXHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwXG5cdFx0XHRcdFx0XHRcdH0sdG1lLHJlcS5wYXRoKTtcdFx0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdFxuXHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtcblx0XHRcdFx0ZXJyb3I6RGVmYXVsdEVycm9ycy5VTktOT1dOX1JFUVVFU1QsXG5cdFx0XHRcdGRhdGE6bnVsbCxcblx0XHRcdFx0aHR0cFN0YXR1czo0MDRcblx0XHRcdH0sdG1lLHJlcS5wYXRoKTtcblx0XHR9KVxuXG5cdFx0c2VydmVyLmxpc3Rlbih0aGlzLm9wdGlvbnMucG9ydCwgKCkgPT4ge1xuXHRcdFx0bG9nQ3JpdCgnJHtBUElTZXJ2aWNlLmpzfScsJ0FQSSBTZXJ2aWNlIHN0YXJ0ZWQgYXQ6ICcrdGhpcy5vcHRpb25zLnBvcnQrXCIsIHdpdGggYmFzZSBlbmRwb2ludDpcIit0aGlzLm9wdGlvbnMuYmFzZUVuZFBvaW50K1wiLCB2ZXIuOiBcIit0aGlzLnZlcnNpb24pXG5cdFx0fSlcblxuXHRcdC8qYXBwLmxpc3Rlbih0aGlzLm9wdGlvbnMucG9ydCwgKCkgPT4ge1xuXHRcdFx0bG9nQ3JpdCgnJHtBUElTZXJ2aWNlLmpzfScsJ0FQSSBTZXJ2aWNlIHN0YXJ0ZWQgYXQ6ICcrdGhpcy5vcHRpb25zLnBvcnQrXCIsIHdpdGggYmFzZSBlbmRwb2ludDpcIit0aGlzLm9wdGlvbnMuYmFzZUVuZFBvaW50K1wiLCB2ZXIuOiBcIit0aGlzLnZlcnNpb24pXG5cdFx0fSkqL1xuXHR9XG5cblx0YXN5bmMgc2VuZFJlc3BvbnNlKHJlZjpzdHJpbmcscmVzOlJlc3BvbnNlLGRhdGE6VHJhbnNmZXJQYWNrZXRWTzxhbnk+LHJlcXVlc3RUaW1lOm51bWJlcixlbmRwb2ludD86c3RyaW5nLGxvZz86QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtfG51bGwscmVxPzpIVFRQUmVxdWVzdFZPKXtcblxuXHRcdGlmKGRhdGEuYmxvY2tSZXNwb25zZSl7XG5cdFx0XHRpZihsb2cpXG5cdFx0XHRcdGxvZy5lcnJvciA9IFwiUmVzcG9uc2UgYmxvY2tlZFwiXG5cdFx0XHRpZih0aGlzLm9wdGlvbnMub25OZXR3b3JrTG9nICYmIGxvZylcblx0XHRcdFx0dGhpcy5vcHRpb25zLm9uTmV0d29ya0xvZyhsb2cpXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYocmVxICYmIHJlcS5zdHJlYW0pe1xuXHRcdFx0XG5cdFx0fVxuXG5cdFx0aWYodGhpcy5vcHRpb25zLnBvc3Rwcm9kdWNlcil7XG5cdFx0XHR0cnl7XG5cdFx0XHRcdGRhdGEgPSBhd2FpdCB0aGlzLm9wdGlvbnMucG9zdHByb2R1Y2VyKHJlcSxyZXMsZGF0YSxyZXF1ZXN0VGltZSxlbmRwb2ludCxsb2cpO1xuXHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRsb2dFcnJvcihcIlBvc3Rwcm9kdWNlciBlcnJvclwiLGUpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYoRXJyb3JVdGlscy5pc0Vycm9yKGRhdGEpKVxuXHRcdFx0ZGF0YSA9IHtlcnJvcjpkYXRhIGFzIElFcnJvcixkYXRhOm51bGx9XG5cdFx0XG4gICAgICAgIGRhdGEucmVzcG9uc2VUaW1lID0gKCtuZXcgRGF0ZSgpKSAtIHJlcXVlc3RUaW1lO1xuICAgICAgICBkYXRhLmNvcmUgPSB0aGlzLnZlcnNpb25cbiAgICAgICAgZGF0YS5lbmRwb2ludCA9IGVuZHBvaW50ID8/IFwibm9fZW5kcG9pbnRcIlxuXHRcdFxuXHRcdGlmKHRoaXMub3B0aW9ucy5hcHBWZXJzaW9uKVxuXHRcdFx0ZGF0YS52ZXJzaW9uPXRoaXMub3B0aW9ucy5hcHBWZXJzaW9uXG5cblx0XHRcblx0XHRpZihsb2cpe1xuXHRcdFx0bG9nLnRpbWUgPSBkYXRhLnJlc3BvbnNlVGltZVxuXHRcdFx0bG9nLnJlZmVyZXI9cmVmO1xuXHRcdH1cblxuXHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdHRoaXMubW9uaXRvci5yZWdpc3RyYXRlUmVzcG9uc2UoZGF0YS5lbmRwb2ludCxkYXRhLnJlc3BvbnNlVGltZSlcblxuICAgICAgICBpZihyZXMuZGVzdHJveWVkIHx8IHJlcy5jbG9zZWQpe1xuXG5cdFx0XHRpZihsb2cpXG5cdFx0XHRcdGxvZy5lcnJvciA9IFwiQ29ubmVjdGlvbiBhbHJlYWR5IGNsb3NlZCwgY2FuJ3Qgc2VuZCByZXNwb25zZSBmb3I6IFwiK2RhdGEuZW5kcG9pbnRcblx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuICAgICAgICAgICAgXHR0aGlzLm9wdGlvbnMub25FcnJvcihcIkNvbm5lY3Rpb24gYWxyZWFkeSBjbG9zZWQsIGNhbid0IHNlbmQgcmVzcG9uc2U6IFwiK2RhdGEuZW5kcG9pbnQsZGF0YSlcbiAgICAgICAgICAgIFxuXHRcdFx0aWYodGhpcy5tb25pdG9yKVxuXHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXG4gICAgICAgIH1lbHNle1xuXHRcdFx0dHJ5e1xuXG5cdFx0XHRcdGlmKGRhdGEuZmlsZSl7XG5cblx0XHRcdFx0XHRyZXMuc2VuZEZpbGUoZGF0YS5maWxlLGVycj0+e1xuXHRcdFx0XHRcdFx0aWYoZXJyKXtcblx0XHRcdFx0XHRcdFx0aWYobG9nKVxuXHRcdFx0XHRcdFx0XHRcdGxvZy5lcnJvciA9IFwiQ2FuJ3Qgc2VuZCBmaWxlOiBcIitkYXRhLmZpbGVcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRpZih0aGlzLm1vbml0b3IgJiYgZGF0YS5lbmRwb2ludClcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUFQSUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VuZFJlc3BvbnNlKHJlZixyZXMse1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yOkRlZmF1bHRFcnJvcnMuQ0FOVF9TRU5EX0ZJTEUsXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTpudWxsLFxuXHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwXG5cdFx0XHRcdFx0XHRcdH0scmVxdWVzdFRpbWUsZGF0YS5lbmRwb2ludCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHR9KVxuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHRpZihkYXRhLnJlZGlyZWN0KXtcblx0XHRcdFx0XHRyZXMucmVkaXJlY3QoZGF0YS5yZWRpcmVjdCk7XG5cdFx0XHRcdFx0aWYobG9nKVxuXHRcdFx0XHRcdFx0bG9nLnJlc3BvbnNlID0ge3JlZGlyZWN0OmRhdGEucmVkaXJlY3R9XG5cdFx0XHRcdH1lbHNle1xuXHRcdFx0XHRcdC8vIHNldHVwIGhlYWRlcnNcblx0XHRcdFx0XHRpZihkYXRhLmhlYWRlcnMpe1xuXHRcdFx0XHRcdFx0Zm9yKGxldCBpIGluIGRhdGEuaGVhZGVycylcblx0XHRcdFx0XHRcdFx0cmVzLnNldEhlYWRlcihpLGRhdGEuaGVhZGVyc1tpXSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoZGF0YS5lcnJvciAmJiBkYXRhLmVycm9yLmh0dHBTdGF0dXMgJiYgZGF0YS5lcnJvci5odHRwU3RhdHVzPjk5KVxuXHRcdFx0XHRcdFx0cmVzLnN0YXR1c0NvZGUgPSBkYXRhLmVycm9yLmh0dHBTdGF0dXNcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXMuc3RhdHVzQ29kZT1kYXRhLmh0dHBTdGF0dXMgPz8gMjAwXG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0aWYoZGF0YS5yYXdSZXNwb25zZSl7XG5cdFx0XHRcdFx0XHRyZXMuc2VuZChkYXRhLmRhdGEpXG5cdFx0XHRcdFx0XHRpZihsb2cpXG5cdFx0XHRcdFx0XHRcdGxvZy5yZXNwb25zZSA9IHRoaXMuY2hlY2tEYXRhTGVuZ3RoKGRhdGEpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0XHRyZXMuc2VuZChkYXRhKTtcblx0XHRcdFx0XHRcdGlmKGxvZylcblx0XHRcdFx0XHRcdFx0bG9nLnJlc3BvbnNlID0gdGhpcy5jaGVja0RhdGFMZW5ndGgoZGF0YSlcblxuXHRcdFx0XHRcdFx0aWYoZGF0YS5lcnJvciAmJiB0aGlzLm1vbml0b3Ipe1xuXHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUFQSUVycm9yKGRhdGEuZW5kcG9pbnQpXG5cdFx0XHRcdFx0XHRcdGlmKGxvZylcblx0XHRcdFx0XHRcdFx0XHRsb2cuZXJyb3IgPSBkYXRhLmVycm9yLm1lc3NhZ2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9Y2F0Y2goZSl7XG5cdFx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuXHRcdFx0XHRcdHRoaXMub3B0aW9ucy5vbkVycm9yKFwiQ2FuJ3Qgc2VuZCByZXNwb25zZVwiLGUpO1xuXHRcdFx0XHRpZihsb2cpXG5cdFx0XHRcdFx0bG9nLmVycm9yPVwiQ2FuJ3Qgc2VuZCByZXNwb25zZVwiXG5cdFx0XHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHNob3cgbG9nXG5cdFx0aWYobG9nICYmIGxvZy5lcnJvciAmJiB0aGlzLm9wdGlvbnMub25FcnJvcil7XG5cdFx0XHR0aGlzLm9wdGlvbnMub25FcnJvcihsb2cuZXJyb3IpXG5cdFx0fWVsc2V7XG5cdFx0XHRpZih0aGlzLm9wdGlvbnMub25OZXR3b3JrTG9nICYmIGxvZylcblx0XHRcdFx0dGhpcy5vcHRpb25zLm9uTmV0d29ya0xvZyhsb2cpXG5cdFx0fVxuICAgIH1cblxuXG5cdGNoZWNrRGF0YUxlbmd0aChkYXRhOmFueSxyZXN1bHQ/OmFueSxsdmw/Om51bWJlcik6YW55e1xuXHRcdFxuXHRcdGlmKCFsdmwpXG5cdFx0XHRsdmw9MDtcblxuXHRcdGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiKXtcblx0XHRcdGlmKHR5cGVvZiBkYXRhPT09XCJzdHJpbmdcIiAmJiBkYXRhLmxlbmd0aD4xMDI0KVxuXHRcdFx0XHRyZXR1cm4gZGF0YS5zdWJzdHJpbmcoMCwxMDAwKStcIi4uLiAodG90YWw6XCIgKyBkYXRhLmxlbmd0aCArIFwiKVwiXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHRpZih0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIil7XG5cdFx0XHRpZighcmVzdWx0KVxuXHRcdFx0XHRyZXN1bHQ9e307XG5cdFx0XHRsZXQgYXJyY250ID0gMTAwO1xuXHRcdFx0Zm9yKGxldCBpIGluIGRhdGEpe1xuXHRcdFx0XHRyZXN1bHRbaV09dGhpcy5jaGVja0RhdGFMZW5ndGgoZGF0YVtpXSxyZXN1bHRbaV0sbHZsKzEpO1xuXHRcdFx0XHRhcnJjbnQtLTtcblx0XHRcdFx0aWYoYXJyY250PD0wKXtcblx0XHRcdFx0XHRyZXN1bHRbXCIuLi5cIl09XCIuLi4gdG90YWw6IFwiK0FycmF5LmlzQXJyYXkoZGF0YSk/ZGF0YS5sZW5ndGg6T2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQgPz8gbnVsbDtcblx0fVxuXG59XG4iXX0=
|
513
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQVBJU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGlTZXJ2ZXIvQVBJU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUF3RDtBQUN4RCwrQ0FBeUQ7QUFDekQsZ0RBQXVCO0FBRXZCLGlEQUE0RDtBQUM1RCw0RUFBc0U7QUFFdEUsbURBQWtDO0FBQ2xDLDZDQUF5RDtBQUN6RCwrQ0FBMkM7QUFDM0MsZ0RBQXVCO0FBQ3ZCLG9EQUE0QjtBQUM1Qiw0Q0FBbUI7QUFDbkIsNEVBQTJDO0FBQzNDLDRDQUFtQjtBQUNuQixnREFBNEM7QUFDNUMsa0RBQThDO0FBQzlDLGdEQUF1QjtBQUN2QixpREFBNkM7QUFFN0MsK0NBQTJDO0FBQzNDLGdGQUE0RTtBQW1DNUUsU0FBZ0IsaUJBQWlCO0lBQ2hDLE9BQU87UUFDTixJQUFJLEVBQUUsSUFBSTtRQUNWLFlBQVksRUFBRSxPQUFPO1FBQ3JCLGlCQUFpQixFQUFFO1lBQ2xCLHVCQUF1QjtTQUN2QjtRQUNELFNBQVMsRUFBRSxFQUFFO1FBQ2IsU0FBUyxFQUFDLE1BQU07UUFDaEIsWUFBWSxFQUFFLFVBQVUsR0FBNkI7WUFDcEQsSUFBQSxvQkFBTyxFQUFDLGtCQUFrQixFQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2hDLENBQUM7UUFDRCxPQUFPLEVBQUMsVUFBUyxHQUFPO1lBQ3ZCLElBQUEscUJBQVEsRUFBQyxrQkFBa0IsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsdUJBQXVCLEVBQUMsS0FBSztRQUM3QixTQUFTLEVBQUMsRUFBRSxHQUFDLElBQUksR0FBQyxJQUFJO1FBQ3RCLFdBQVcsRUFBQyxjQUFJLENBQUMsT0FBTyxDQUFDLFlBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBQyxhQUFhLENBQUM7S0FDbkQsQ0FBQTtBQUNGLENBQUM7QUFuQkQsOENBbUJDO0FBRVksUUFBQSxrQkFBa0IsR0FBc0MsSUFBSSxvQkFBRyxDQUFDLFNBQVMsRUFBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2hHLFFBQUEsWUFBWSxHQUF3QyxJQUFJLG9CQUFHLENBQUMsU0FBUyxFQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3RGLFFBQUEsdUJBQXVCLEdBQW9CLElBQUksb0JBQUcsQ0FBQyxTQUFTLEVBQUMseUJBQXlCLENBQUMsQ0FBQztBQUN4RixRQUFBLGVBQWUsR0FBb0QsSUFBSSxvQkFBRyxDQUFDLFNBQVMsRUFBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3hHLFFBQUEsaUJBQWlCLEdBQWlDLElBQUksb0JBQUcsQ0FBQyxTQUFTLEVBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUN6RixRQUFBLGlCQUFpQixHQUFtQyxJQUFJLG9CQUFHLENBQUMsU0FBUyxFQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFeEcsTUFBTSxjQUFjLEdBQVUsRUFBRSxDQUFBO0FBQ2hDLE1BQU0sV0FBVyxHQUFVLEVBQUUsQ0FBQTtBQUV0QixLQUFLLFVBQVUsV0FBVyxDQUFDLFFBQXVCO0lBRXhELFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSx5QkFBVyxFQUFFLENBQUMsQ0FBQztJQUU5QixLQUFLLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRTtRQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQUEsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtLQUFFO0lBQzNFLEtBQUssSUFBSSxDQUFDLElBQUksUUFBUSxFQUFFO1FBQUUsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUE7S0FBRTtBQUNwRCxDQUFDO0FBTkQsa0NBTUM7QUFFRCxNQUFhLFVBQVcsU0FBUSx5QkFBVztJQUdsQyxNQUFNLENBQUMsU0FBUyxHQUFDLENBQUMsQ0FBQztJQUNuQixPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQ2pCLE9BQU8sQ0FBbUI7SUFDMUIsT0FBTyxDQUFTO0lBQ2hCLGdCQUFnQixDQUFRO0lBQ3hCLE9BQU8sR0FBUSxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzFCLGFBQWEsR0FBQyxDQUFDLENBQUM7SUFDaEIsTUFBTSxHQUFDLGNBQUksQ0FBQTtJQUVuQixNQUFNLEdBQTRCLEVBQUUsQ0FBQztJQUVyQyxZQUFZLE9BQStCO1FBQzFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFDLE9BQU8sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQzVDLElBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQjtZQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixHQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxtQkFBbUIsR0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUNuRCxJQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFBLEVBQUUsQ0FBQSxHQUFHLEtBQUcsSUFBSSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUE7UUFFdEMsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFDO1lBQ3hELElBQUksQ0FBQyxPQUFPLEdBQUMsSUFBSSxpQkFBTyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUN6QyxPQUFPLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUE7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1lBQzlCLEtBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxHQUFHLGdCQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQzVGLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEdBQUMsQ0FBQyxDQUFDLEtBQUssR0FBQyxVQUFVLEdBQUMsSUFBSSxDQUFDLENBQUE7YUFDMUQ7WUFFRCx5QkFBaUIsQ0FBQyxRQUFRLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBQyxFQUFFO2dCQUN6QyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7Z0JBQ2pCLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUM7b0JBQ3ZCLEtBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUM7d0JBQ2pDLE1BQU0sSUFBSSxHQUFHLGdCQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzdGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2xCO2lCQUNEO2dCQUNELE9BQU8sTUFBTSxDQUFDO1lBQ2YsQ0FBQyxDQUFBO1NBQ0Q7UUFHRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxpREFBdUIsRUFBRSxDQUFDLENBQUM7UUFHM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksbUJBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUMsSUFBSSxxQkFBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ25GLCtCQUF1QixDQUFDLFFBQVEsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDbkUsQ0FBQztJQUdRLEtBQUssQ0FBQyxJQUFJO1FBRWxCLG9CQUFZLENBQUMsUUFBUSxHQUFDLEtBQUssRUFBQyxNQUFNLEVBQUEsRUFBRSxDQUFBLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDaEQsMEJBQWtCLENBQUMsUUFBUSxHQUFHLEtBQUssRUFBQyxNQUFNLEVBQUEsRUFBRTtZQUMzQyxNQUFNLEdBQUcsR0FBNEI7Z0JBQ3BDLE9BQU8sRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUNwQixJQUFJLEVBQUUsQ0FBQztnQkFDUCxPQUFPLEVBQUUsRUFBRTtnQkFDWCxRQUFRLEVBQUUsRUFBRTtnQkFDWixLQUFLLEVBQUMsSUFBSTtnQkFDVixFQUFFLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRTthQUMxQixDQUFBO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDckIsSUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBQyxJQUFJO2dCQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1lBQ3BCLE9BQU8sR0FBRyxDQUFDO1FBQ1osQ0FBQyxDQUFBO1FBR0QseUJBQWlCLENBQUMsUUFBUSxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUMsRUFBRTtZQUN6QyxLQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFDO2dCQUNuQyxJQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVM7b0JBQ3BCLFNBQVM7Z0JBQ1YsS0FBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFDO29CQUN4QixJQUFJLEVBQUUsR0FBRywyQkFBWSxDQUFDLGFBQWEsRUFBRSxHQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7b0JBQ2pELEVBQUUsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksRUFBQyxHQUFHLENBQUMsQ0FBQTtvQkFDNUIsSUFBRyxFQUFFLEtBQUssR0FBRyxDQUFDLFFBQVEsRUFBQzt3QkFDdEIsR0FBRyxDQUFDLFlBQVksR0FBQyxJQUFJLENBQUM7d0JBQ3RCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTt3QkFDckMsSUFBRyxRQUFRLENBQUMsS0FBSzs0QkFDaEIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO3dCQUN2QixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7cUJBQ3JCO2lCQUNEO2FBQ0Q7WUFDRCxPQUFPLEVBQUMsS0FBSyxFQUFDLHVCQUFhLENBQUMsZUFBZSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsVUFBVSxFQUFDLEdBQUcsRUFBQyxDQUFBO1FBQ3RFLENBQUMsQ0FBQTtRQUdELE1BQU0sR0FBRyxHQUFHLElBQUEsaUJBQU8sR0FBRSxDQUFBO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLGNBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdEMsdUJBQWUsQ0FBQyxRQUFRLEdBQUcsS0FBSyxFQUFDLE1BQU0sRUFBQSxFQUFFLEdBQUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxHQUFHLEVBQUMsSUFBSSxFQUFDLE1BQU0sRUFBQyxDQUFBLENBQUEsQ0FBQyxDQUFDO1FBRTVFLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUI7WUFDdEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUMsWUFBWSxDQUFDLENBQUM7UUFFN0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDeEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUU5RCxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUEsNEJBQVUsRUFBQztZQUNsQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQyxFQUFFO2dCQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUUsRUFBRSxFQUFDLEdBQUcsRUFBQztvQkFDNUMsS0FBSyxFQUFDLHVCQUFhLENBQUMsY0FBYztvQkFDbEMsSUFBSSxFQUFDLElBQUk7b0JBQ1QsVUFBVSxFQUFDLEdBQUc7aUJBQ2QsRUFBQyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDNUMsWUFBWSxFQUFFLElBQUk7WUFDbEIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBRXJDLFlBQVksRUFBQyxJQUFJO1NBQ2pCLENBQUMsQ0FBQyxDQUFBO1FBRUgsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBTyxFQUFDLEdBQU8sRUFBQyxJQUFRLEVBQUMsSUFBUSxFQUFDLEVBQUU7WUFFbEQsSUFBRyxDQUFDLEdBQUcsRUFBQztnQkFDUCxJQUFJLEVBQUUsQ0FBQztnQkFDUCxPQUFNO2FBQ047WUFFRCxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDeEIsTUFBTSxHQUFHLEdBQUcsTUFBTSwwQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxHQUFHLENBQUMsT0FBTyxHQUFDO2dCQUNYLE1BQU0sRUFBQyxHQUFHLENBQUMsTUFBTTtnQkFDakIsSUFBSSxFQUFDLEVBQUU7Z0JBQ1AsTUFBTSxFQUFDLEdBQUcsQ0FBQyxNQUFNO2FBQ2pCLENBQUE7WUFFRCxJQUFJLGFBQWEsR0FBQyx1QkFBYSxDQUFDLGVBQWUsQ0FBQztZQUNoRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUU7Z0JBQ3pHLGFBQWEsR0FBRyx1QkFBYSxDQUFDLGNBQWMsQ0FBQTthQUM1QztZQUdELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBRSxFQUFFLEVBQUMsSUFBSSxFQUFDO2dCQUM3QyxLQUFLLEVBQUMsYUFBYTtnQkFDbkIsSUFBSSxFQUFDLElBQUk7Z0JBQ1QsVUFBVSxFQUFDLEdBQUc7YUFDZCxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsR0FBRyxDQUFDLENBQUE7UUFFZCxDQUFDLENBQUMsQ0FBQTtRQUVGLE1BQU0sV0FBVyxHQUFHO1lBQ25CLE1BQU0sRUFBRSxDQUFDLE1BQVcsRUFBRSxRQUFhLEVBQUUsRUFBRTtnQkFDdEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDM0UsUUFBUSxDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO1lBQ3BDLENBQUM7WUFDRCxXQUFXLEVBQUUsSUFBSTtTQUNqQixDQUFBO1FBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFBLGNBQUksRUFBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBRzFCLDJCQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFckQsS0FBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBQztZQUNuQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLElBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDZCxTQUFTO1lBQ1YsS0FBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFDO2dCQUN4QixJQUFJLEVBQUUsR0FBRywyQkFBWSxDQUFDLGFBQWEsRUFBRSxHQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ2pELEVBQUUsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksRUFBQyxHQUFHLENBQUMsQ0FBQTtnQkFJNUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxHQUFHLEVBQUMsRUFBRTtvQkFDM0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNyQixNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3hCLElBQUksR0FBRyxHQUFpQyxJQUFJLENBQUM7b0JBQzdDLElBQUcsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUM7d0JBQ3ZCLEdBQUcsR0FBRyxNQUFNLDBCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN6QyxHQUFHLENBQUMsT0FBTyxHQUFDOzRCQUNYLEdBQUcsRUFBQyxHQUFHLENBQUMsR0FBRzs0QkFDWCxNQUFNLEVBQUMsR0FBRyxDQUFDLE1BQU07NEJBQ2pCLElBQUksRUFBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7NEJBQ25DLE1BQU0sRUFBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7eUJBQ3ZDLENBQUE7cUJBQ0Q7b0JBRUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxJQUFHLEVBQUU7d0JBRXpCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7d0JBQ3RCLElBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFDOzRCQUM3QyxLQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUM7Z0NBQ3RCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOzZCQUNyQjt5QkFDRDt3QkFFRCxNQUFNLFdBQVcsR0FBaUI7NEJBQ2pDLEdBQUcsRUFBQyxHQUFzQjs0QkFDMUIsUUFBUSxFQUFDLEdBQUc7NEJBQ1osTUFBTSxFQUFDLEdBQUcsQ0FBQyxNQUFNOzRCQUNqQixJQUFJLEVBQUMsR0FBRyxDQUFDLElBQUk7NEJBQ2IsTUFBTSxFQUFDLEdBQUcsQ0FBQyxNQUFNOzRCQUNqQixPQUFPLEVBQUMsR0FBRyxDQUFDLE9BQWM7NEJBQzFCLFFBQVEsRUFBQyxFQUFFOzRCQUNYLEtBQUssRUFBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUk7NEJBQ3ZCLE9BQU8sRUFBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQzt5QkFDMUIsQ0FBQTt3QkFFRCxJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFDOzRCQUMzQixJQUFHO2dDQUNILE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQ0FDdEUsSUFBRyxpQkFBaUI7b0NBQ25CLFdBQVcsQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQzs2QkFDbEQ7NEJBQUEsT0FBTSxDQUFDLEVBQUM7Z0NBQ1IsSUFBSSxPQUFPLEdBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQTtnQ0FDbEIsSUFBSSxLQUFLLEdBQW9CLFNBQVMsQ0FBQztnQ0FDdkMsSUFBRywwQkFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQztvQ0FDeEIsT0FBTyxHQUFFLENBQVMsQ0FBQyxPQUFPLENBQUE7b0NBQzFCLEtBQUssR0FBRyxDQUFDLENBQVEsQ0FBQyxDQUFDO2lDQUNuQjtnQ0FFRCxJQUFHLElBQUEsMkJBQVksRUFBQyxDQUFDLENBQUM7b0NBQ2pCLE9BQU8sR0FBSSxDQUFnQixDQUFDLE9BQU8sQ0FBQztnQ0FFckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFFLEVBQUUsRUFBQyxHQUFHLEVBQUMsRUFBQyxLQUFLLEVBQUMsRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLE9BQU8sRUFBQyxPQUFPLEVBQUMsRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLFVBQVUsRUFBQyxHQUFHLEVBQUMsRUFBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxXQUFXLENBQUMsQ0FBQztnQ0FDL0ssT0FBTzs2QkFDUDt5QkFDRDt3QkFFRCxJQUFJLE1BQU0sQ0FBQTt3QkFDVixJQUFHOzRCQUVGLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDOzRCQUM5QixJQUFJLHFCQUFxQixHQUFHLEtBQUssQ0FBQzs0QkFDbEMsSUFBRyxDQUFDLENBQUMsaUJBQWlCO2dDQUNyQixpQkFBaUIsR0FBQyxJQUFJLENBQUM7NEJBQ3hCLElBQUcsQ0FBQyxDQUFDLHFCQUFxQjtnQ0FDekIscUJBQXFCLEdBQUMsSUFBSSxDQUFDOzRCQUU1QixJQUFHLE9BQU8sQ0FBQyxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0NBRWpDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dDQUM1RCxJQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBQztvQ0FDOUIsSUFBRyxPQUFPLENBQUMsaUJBQWlCO3dDQUMzQixpQkFBaUIsR0FBQyxJQUFJLENBQUM7b0NBQ3hCLElBQUcsT0FBTyxDQUFDLHFCQUFxQjt3Q0FDL0IscUJBQXFCLEdBQUMsSUFBSSxDQUFDO2lDQUM1Qjs2QkFDRDs0QkFHRCxJQUFHLENBQUMsaUJBQWlCLEVBQUM7Z0NBQ3JCLElBQUksaUJBQWlCLENBQUM7Z0NBQ3RCLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUM7b0NBQzNCLGlCQUFpQixHQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29DQUN0RSxJQUFHLGlCQUFpQixDQUFDLEtBQUssSUFBSSxDQUFDLHFCQUFxQixFQUFDO3dDQUNwRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUUsRUFBRSxFQUFDLEdBQUcsRUFBQyxpQkFBaUIsRUFBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxXQUFXLENBQUMsQ0FBQzt3Q0FDdkYsT0FBTztxQ0FDUDtvQ0FDRCxXQUFXLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUE7aUNBQ2pEOzZCQUNEOzRCQUdELElBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPO2dDQUNwQixXQUFXLENBQUMsUUFBUSxHQUFDLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFDLENBQUE7NEJBRWpELE1BQU0sUUFBUSxHQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTs0QkFDNUMsSUFBRyxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssRUFBQztnQ0FDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFFLEVBQUUsRUFBQyxHQUFHLEVBQUMsUUFBUSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLFdBQVcsQ0FBQyxDQUFDO2dDQUM5RSxPQUFPOzZCQUNQOzRCQUVELFdBQVcsQ0FBQyxRQUFRLEdBQUMsUUFBUSxDQUFDOzRCQUk5QixNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFBO3lCQUlyQzt3QkFBQSxPQUFNLENBQUMsRUFBQzs0QkFFUixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNqQixJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztnQ0FDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7NEJBQ3hCLElBQUcsSUFBSSxDQUFDLE9BQU87Z0NBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFHdkMsSUFBSSxJQUFJLEdBQW9CO2dDQUMzQixLQUFLLEVBQUM7b0NBQ0wsSUFBSSxFQUFDLEtBQUs7b0NBQ1YsT0FBTyxFQUFDLHVCQUF1QjtvQ0FDL0IsVUFBVSxFQUFDLEdBQUc7b0NBQ2QsT0FBTyxFQUFDLEdBQUcsQ0FBQyxFQUFFO2lDQUNkOzZCQUNELENBQUE7NEJBRUQsSUFBRywwQkFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0NBQ3ZCLElBQUksR0FBRyxFQUFDLEtBQUssRUFBQyxDQUFXLEVBQUMsQ0FBQTs0QkFFM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFFLEVBQUUsRUFBQyxHQUFHLEVBQUMsSUFBSSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLFdBQVcsQ0FBQyxDQUFDOzRCQUMxRSxPQUFPO3lCQUNQO3dCQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBRSxFQUFFLEVBQUMsR0FBRyxFQUFDLE1BQU0sRUFBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxXQUFXLENBQUMsQ0FBQztvQkFDN0UsQ0FBQyxDQUFBO29CQUVELE9BQU8sRUFBRSxDQUFBO2dCQUNWLENBQUMsQ0FBQyxDQUFDO2FBRUg7U0FDRDtRQUtELEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1lBRTFCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtZQUV2QixJQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBQztnQkFFdkQsSUFBRyxHQUFHLENBQUMsTUFBTSxLQUFHLEtBQUssRUFBQztvQkFFckIsSUFBSSxjQUFjLEdBQUMsS0FBSyxDQUFDO29CQUN6QixLQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFDO3dCQUNqQyxNQUFNLElBQUksR0FBRyxnQkFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO3dCQUM1RixJQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBQyxJQUFJLENBQUMsRUFBQzs0QkFDeEMsY0FBYyxHQUFDLElBQUksQ0FBQzs0QkFDcEIsTUFBTTt5QkFDTjtxQkFDRDtvQkFFRCxJQUFHLGNBQWMsRUFBQzt3QkFFakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDeEIsSUFBRzs0QkFDRixJQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQjtnQ0FDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsY0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUMsU0FBUyxFQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7NEJBQ3hGLEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFDLFdBQVcsQ0FBQyxDQUFBOzRCQUN6QyxHQUFHLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTs0QkFDaEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7eUJBQzVDO3dCQUFBLE9BQU0sQ0FBQyxFQUFDOzRCQUNSLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBRSxFQUFFLEVBQUMsR0FBRyxFQUFDO2dDQUM1QyxLQUFLLEVBQUM7b0NBQ0wsSUFBSSxFQUFDLEtBQUs7b0NBQ1YsT0FBTyxFQUFDLHVCQUF1QjtvQ0FDL0IsT0FBTyxFQUFDLEdBQUcsQ0FBQyxFQUFFO2lDQUNkO2dDQUNELElBQUksRUFBQyxJQUFJO2dDQUNULFVBQVUsRUFBQyxHQUFHOzZCQUNkLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDaEI7d0JBQ0QsT0FBTztxQkFDUDtpQkFDRDthQUNEO1lBR0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFFLEVBQUUsRUFBQyxHQUFHLEVBQUM7Z0JBQzVDLEtBQUssRUFBQyx1QkFBYSxDQUFDLGVBQWU7Z0JBQ25DLElBQUksRUFBQyxJQUFJO2dCQUNULFVBQVUsRUFBQyxHQUFHO2FBQ2QsRUFBQyxHQUFHLEVBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7WUFDckMsSUFBQSxvQkFBTyxFQUFDLGtCQUFrQixFQUFDLDBCQUEwQixHQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFDLHVCQUF1QixHQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFDLFVBQVUsR0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbkosQ0FBQyxDQUFDLENBQUE7SUFLSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFVLEVBQUMsR0FBWSxFQUFDLElBQTBCLEVBQUMsV0FBa0IsRUFBQyxRQUFnQixFQUFDLEdBQWtDLEVBQUMsR0FBa0I7UUFFOUosSUFBRyxJQUFJLENBQUMsYUFBYSxFQUFDO1lBQ3JCLElBQUcsR0FBRztnQkFDTCxHQUFHLENBQUMsS0FBSyxHQUFHLGtCQUFrQixDQUFBO1lBQy9CLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksR0FBRztnQkFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDL0IsT0FBTztTQUNQO1FBRUQsSUFBRyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBQztTQUVwQjtRQUVELElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUM7WUFDNUIsSUFBRztnQkFDRixJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLElBQUksRUFBQyxXQUFXLEVBQUMsUUFBUSxFQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzlFO1lBQUEsT0FBTSxDQUFDLEVBQUM7Z0JBQ1IsSUFBQSxxQkFBUSxFQUFDLG9CQUFvQixFQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ2hDO1NBQ0Q7UUFFRCxJQUFHLDBCQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUMxQixJQUFJLEdBQUcsRUFBQyxLQUFLLEVBQUMsSUFBYyxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsQ0FBQTtRQUVsQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxhQUFhLENBQUE7UUFFL0MsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQTtRQUdyQyxJQUFHLEdBQUcsRUFBQztZQUNOLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQTtZQUM1QixHQUFHLENBQUMsT0FBTyxHQUFDLEdBQUcsQ0FBQztTQUNoQjtRQUVELElBQUcsSUFBSSxDQUFDLE9BQU87WUFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRTNELElBQUcsR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFDO1lBRXBDLElBQUcsR0FBRztnQkFDTCxHQUFHLENBQUMsS0FBSyxHQUFHLHNEQUFzRCxHQUFDLElBQUksQ0FBQyxRQUFRLENBQUE7WUFDakYsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87Z0JBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0RBQWtELEdBQUMsSUFBSSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsQ0FBQTtZQUVyRyxJQUFHLElBQUksQ0FBQyxPQUFPO2dCQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUV2QzthQUFJO1lBQ1YsSUFBRztnQkFFRixJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUM7b0JBRVosR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFDLEdBQUcsQ0FBQSxFQUFFO3dCQUMzQixJQUFHLEdBQUcsRUFBQzs0QkFDTixJQUFHLEdBQUc7Z0NBQ0wsR0FBRyxDQUFDLEtBQUssR0FBRyxtQkFBbUIsR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBOzRCQUUxQyxJQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVE7Z0NBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUVoRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUM7Z0NBQ3pCLEtBQUssRUFBQyx1QkFBYSxDQUFDLGNBQWM7Z0NBQ2xDLElBQUksRUFBQyxJQUFJO2dDQUNULFVBQVUsRUFBQyxHQUFHOzZCQUNkLEVBQUMsV0FBVyxFQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt5QkFDN0I7b0JBRUYsQ0FBQyxDQUFDLENBQUE7b0JBRUYsT0FBTztpQkFDUDtnQkFFRCxJQUFHLElBQUksQ0FBQyxRQUFRLEVBQUM7b0JBQ2hCLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUM1QixJQUFHLEdBQUc7d0JBQ0wsR0FBRyxDQUFDLFFBQVEsR0FBRyxFQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsUUFBUSxFQUFDLENBQUE7aUJBQ3hDO3FCQUFJO29CQUVKLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQzt3QkFDZixLQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPOzRCQUN4QixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ2xDO29CQUVELElBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBQyxFQUFFO3dCQUNqRSxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFBOzt3QkFFdEMsR0FBRyxDQUFDLFVBQVUsR0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQTtvQkFFdEMsSUFBRyxJQUFJLENBQUMsV0FBVyxFQUFDO3dCQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTt3QkFDbkIsSUFBRyxHQUFHOzRCQUNMLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtxQkFDMUM7eUJBQ0c7d0JBQ0gsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDZixJQUFHLEdBQUc7NEJBQ0wsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO3dCQUUxQyxJQUFHLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBQzs0QkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7NEJBQzlDLElBQUcsR0FBRztnQ0FDTCxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO3lCQUNoQztxQkFDRDtpQkFDRDthQUNEO1lBQUEsT0FBTSxDQUFDLEVBQUM7Z0JBQ1IsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU87b0JBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxJQUFHLEdBQUc7b0JBQ0wsR0FBRyxDQUFDLEtBQUssR0FBQyxxQkFBcUIsQ0FBQTtnQkFDaEMsSUFBRyxJQUFJLENBQUMsT0FBTztvQkFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDN0M7U0FDRDtRQUdELElBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUM7WUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQy9CO2FBQUk7WUFDSixJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEdBQUc7Z0JBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQy9CO0lBQ0MsQ0FBQztJQUdKLGVBQWUsQ0FBQyxJQUFRLEVBQUMsTUFBVyxFQUFDLEdBQVc7UUFFL0MsSUFBRyxDQUFDLEdBQUc7WUFDTixHQUFHLEdBQUMsQ0FBQyxDQUFDO1FBRVAsSUFBRyxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUM7WUFDM0IsSUFBRyxPQUFPLElBQUksS0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBQyxJQUFJO2dCQUM1QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFDLElBQUksQ0FBQyxHQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQTtZQUNoRSxPQUFPLElBQUksQ0FBQztTQUNaO1FBRUQsSUFBRyxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUM7WUFDM0IsSUFBRyxDQUFDLE1BQU07Z0JBQ1QsTUFBTSxHQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNqQixLQUFJLElBQUksQ0FBQyxJQUFJLElBQUksRUFBQztnQkFDakIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFHLEdBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUcsTUFBTSxJQUFFLENBQUMsRUFBQztvQkFDWixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUMsYUFBYSxHQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFBLElBQUksQ0FBQyxNQUFNLENBQUEsQ0FBQyxDQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNyRixNQUFNO2lCQUNOO2FBQ0Q7U0FDRDtRQUNELE9BQU8sTUFBTSxJQUFJLElBQUksQ0FBQztJQUN2QixDQUFDOztBQWhoQkYsZ0NBa2hCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBleHByZXNzLCB7IEFwcGxpY2F0aW9uLCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnXG5pbXBvcnQgeyBCYXNlU2VydmljZSwgSUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9CYXNlU2VydmljZSdcbmltcG9ydCBjb3JzIGZyb20gJ2NvcnMnXG5pbXBvcnQgeyBJbmNvbWluZ01lc3NhZ2UgfSBmcm9tICdodHRwJ1xuaW1wb3J0IHsgQmFzZUVuZHBvaW50LCBJQmFzZUVuZHBvaW50IH0gZnJvbSAnLi9CYXNlRW5kcG9pbnQnXG5pbXBvcnQgRGVmYXVsdEVycm9ycywgeyBFcnJvclV0aWxzIH0gZnJvbSAnLi9zdHJ1Y3R1cmVzL0RlZmF1bHRFcnJvcnMnXG5pbXBvcnQgeyBIVFRQUmVxdWVzdFZPLCBJRXJyb3IsIFRyYW5zZmVyUGFja2V0Vk8gfSBmcm9tICcuL3N0cnVjdHVyZXMvSW50ZXJmYWNlcydcbmltcG9ydCB7UmVxfSBmcm9tIFwiYmFkbWZjay1zaWduYWxcIlxuaW1wb3J0IHsgbG9nQ3JpdCwgbG9nRXJyb3IsIGxvZ0luZm8gfSBmcm9tICcuL0xvZ1NlcnZpY2UnXG5pbXBvcnQgeyBNb25pdG9yIH0gZnJvbSAnLi9tb25pdG9yL01vbml0b3InXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0IGZpbGVVcGxvYWQgZnJvbSAnZXhwcmVzcy1maWxldXBsb2FkJ1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiXG5pbXBvcnQgeyBMaXZlbmVzcyB9IGZyb20gJy4vcm91dGVzL0xpdmVuZXNzJ1xuaW1wb3J0IHsgUmVhZGluZXNzIH0gZnJvbSAnLi9yb3V0ZXMvUmVhZGluZXNzJ1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCdcbmltcG9ydCB7IGlzTXlzcWxFcnJvciB9IGZyb20gJy4vTXlzcWxTZXJ2aWNlJ1xuaW1wb3J0IHsgTXlzcWxFcnJvciB9IGZyb20gJ215c3FsJ1xuaW1wb3J0IHsgU3RhdFNlcnZpY2UgfSBmcm9tICcuL1N0YXRTZXJ2aWNlJ1xuaW1wb3J0IHsgRXh0ZXJuYWxTZXJ2aWNlRW5kcG9pbnQgfSBmcm9tICcuL2V4dGVybmFsL0V4dGVybmFsU2VydmljZUVuZHBvaW50J1xuXG5cblxuZXhwb3J0IGludGVyZmFjZSBBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW17XHRcblx0aWQ6bnVtYmVyLFxuXHRjcmVhdGVkOm51bWJlcixcblx0dGltZTpudW1iZXIsXG5cdHJlZmVyZXI/OnN0cmluZyxcblx0cmVxdWVzdDp7W2tleTpzdHJpbmddOmFueX0sXG5cdHJlc3BvbnNlOntba2V5OnN0cmluZ106YW55fVxuXHRlcnJvcj86c3RyaW5nfG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBUElTZXJ2aWNlT3B0aW9uc3tcblx0cG9ydDpudW1iZXIsXG5cdGJhc2VFbmRQb2ludDpzdHJpbmcgLy8gXCIvYXBpL1wiXG5cdGNvcnNIb3N0V2hpdGVMaXN0OnN0cmluZ1tdLFxuXHRlbmRwb2ludHM6SUJhc2VFbmRwb2ludFtdLFxuXHRqc29uTGltaXQ6c3RyaW5nIC8vIFwiMTBtYlwiXG5cdG9uTmV0d29ya0xvZz86KChsb2c6QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtKT0+dm9pZCl8bnVsbFxuXHRvbkVycm9yPzooKC4uLnJlc3Q6YW55W10pPT52b2lkKXxudWxsXG5cdGlzUHJvZHVjdGlvbkVudmlyb25tZW50OmJvb2xlYW4sXG5cdGludGVyY2VwdG9yPzpJQmFzZUVuZHBvaW50LFxuXHRwb3N0cHJvZHVjZXI/OihyZXE6SFRUUFJlcXVlc3RWT3x1bmRlZmluZWR8bnVsbCxyZXM6UmVzcG9uc2UsZGF0YTpUcmFuc2ZlclBhY2tldFZPPGFueT4scmVxdWVzdFRpbWU6bnVtYmVyLGVuZHBvaW50PzpzdHJpbmcsbG9nPzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW18bnVsbCk9PlByb21pc2U8VHJhbnNmZXJQYWNrZXRWTz5cblx0cHJlcHJvZHVjZXI/OihyZXE6SFRUUFJlcXVlc3RWT3x1bmRlZmluZWR8bnVsbCk9PmFueVxuXHRcblx0bW9uaXRvcj86e2xvZ2luOnN0cmluZyxwYXNzd29yZDpzdHJpbmd9W11cblx0Ly9kZXBsb3ltZW50Pzp7bG9naW46c3RyaW5nLHBhc3N3b3JkOnN0cmluZ31cblx0YXBwVmVyc2lvbj86c3RyaW5nXG5cblx0ZmlsZVRlbXBEaXI6c3RyaW5nO1xuXHRmaWxlTGltaXQ6bnVtYmVyIC8vIGJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCk6QVBJU2VydmljZU9wdGlvbnN7XG5cdHJldHVybiB7XG5cdFx0cG9ydDogODA5MSxcblx0XHRiYXNlRW5kUG9pbnQ6ICcvYXBpLycsXG5cdFx0Y29yc0hvc3RXaGl0ZUxpc3Q6IFtcblx0XHRcdCdodHRwOi8vbG9jYWxob3N0OjMwMDAnLFxuXHRcdF0sXG5cdFx0ZW5kcG9pbnRzOiBbXSxcblx0XHRqc29uTGltaXQ6XCIxMG1iXCIsXG5cdFx0b25OZXR3b3JrTG9nOiBmdW5jdGlvbiAobG9nOiBBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0pOiB2b2lkIHtcblx0XHRcdGxvZ0luZm8oXCIke0FQSVNlcnZpY2UuanN9XCIsbG9nKVxuXHRcdH0sXG5cdFx0b25FcnJvcjpmdW5jdGlvbihlcnI6YW55KXtcblx0XHRcdGxvZ0Vycm9yKFwiJHtBUElTZXJ2aWNlLmpzfVwiLGVycik7XG5cdFx0fSxcblx0XHRpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudDpmYWxzZSxcblx0XHRmaWxlTGltaXQ6NTAqMTAyNCoxMDI0LFxuXHRcdGZpbGVUZW1wRGlyOnBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSxcImZpbGVUZW1wRGlyXCIpXG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IFJFUV9DUkVBVEVfTkVUX0xPRzpSZXE8dm9pZCxBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0+ID0gbmV3IFJlcSh1bmRlZmluZWQsXCJSRVFfQ1JFQVRFX05FVF9MT0dcIik7XG5leHBvcnQgY29uc3QgUkVRX0hUVFBfTE9HOlJlcTx2b2lkLEFQSVNlcnZpY2VOZXR3b3JrTG9nSXRlbVtdPiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX0hUVFBfTE9HXCIpO1xuZXhwb3J0IGNvbnN0IFJFUV9IVFRQX1JFUVVFU1RTX0NPVU5UOlJlcTx2b2lkLG51bWJlcj4gPSBuZXcgUmVxKHVuZGVmaW5lZCxcIlJFUV9IVFRQX1JFUVVFU1RTX0NPVU5UXCIpO1xuZXhwb3J0IGNvbnN0IFJFUV9IVFRQX1NFUlZFUjpSZXE8dm9pZCx7ZXhwcmVzczpBcHBsaWNhdGlvbixodHRwOmh0dHAuU2VydmVyfT4gPSBuZXcgUmVxKHVuZGVmaW5lZCxcIlJFUV9IVFRQX1NFUlZFUlwiKTtcbmV4cG9ydCBjb25zdCBSRVFfSU5URVJOQUxfQ0FMTDpSZXE8SFRUUFJlcXVlc3RWTyxJRXJyb3J8YW55PiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX0lOVEVSTkFMX0NBTExcIik7XG5leHBvcnQgY29uc3QgUkVRX01PTklUT1JfVVNFUlM6UmVxPHthdXRob3JpemF0aW9uOnN0cmluZ30sYW55PiA9IG5ldyBSZXEodW5kZWZpbmVkLFwiUkVRX01PTklUT1JfVVNFUlNcIik7XG5cbmNvbnN0IGFjdGl2ZVNlcnZpY2VzOlN0cmluZ1tdPVtdXG5jb25zdCBlbnRyeVBvaW50czpTdHJpbmdbXT1bXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gSW5pdGlhbGl6ZXIoc2VydmljZXM6SUJhc2VTZXJ2aWNlW10pe1xuXHQvLyBhZGQgc3RhdCBzZXJ2aWNlXG5cdHNlcnZpY2VzLnB1c2gobmV3IFN0YXRTZXJ2aWNlKCkpO1xuXHRcbiAgICBmb3IgKGxldCBpIG9mIHNlcnZpY2VzKSB7IGF3YWl0IGkuaW5pdCgpO2FjdGl2ZVNlcnZpY2VzLnB1c2goaS5nZXROYW1lKCkpIH1cbiAgICBmb3IgKGxldCBpIG9mIHNlcnZpY2VzKSB7IGkuYXBwbGljYXRpb25SZWFkeSgpIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFQSVNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XG5cblx0Ly8gTkVUIExPR1xuXHRwcml2YXRlIHN0YXRpYyBuZXh0TG9nSUQ9MDtcblx0cHJpdmF0ZSB2ZXJzaW9uID0gXCIyLjcuNVwiXG5cdHByaXZhdGUgb3B0aW9uczpBUElTZXJ2aWNlT3B0aW9ucztcblx0cHJpdmF0ZSBtb25pdG9yPzpNb25pdG9yXG5cdHByaXZhdGUgbW9uaXRvckluZGV4RmlsZT86QnVmZmVyXG5cdHByaXZhdGUgc3RhcnRlZDpEYXRlID0gbmV3IERhdGUoKTtcblx0cHJpdmF0ZSByZXF1ZXN0c0NvdW50PTA7XG5cdHByaXZhdGUgc2VydmVyPWh0dHBcblxuXHRuZXRMb2c6QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtW109W107XG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucz86QVBJU2VydmljZU9wdGlvbnN8bnVsbCkge1xuXHRcdHN1cGVyKCdIVFRQIFNlcnZpY2UnKVxuXHRcdHRoaXMub3B0aW9ucz1vcHRpb25zID8/IGdldERlZmF1bHRPcHRpb25zKCk7XG5cdFx0aWYoIXRoaXMub3B0aW9ucy5jb3JzSG9zdFdoaXRlTGlzdClcblx0XHRcdHRoaXMub3B0aW9ucy5jb3JzSG9zdFdoaXRlTGlzdD1bXTtcblx0XHRjb25zdCBzZWxmID0gXCJodHRwOi8vbG9jYWxob3N0OlwiK3RoaXMub3B0aW9ucy5wb3J0O1xuXHRcdGlmKCF0aGlzLm9wdGlvbnMuY29yc0hvc3RXaGl0ZUxpc3QuZmluZCh2YWw9PnZhbD09PXNlbGYpKVxuXHRcdFx0dGhpcy5vcHRpb25zLmNvcnNIb3N0V2hpdGVMaXN0LnB1c2goKVxuXG5cdFx0aWYodGhpcy5vcHRpb25zLm1vbml0b3IgJiYgdGhpcy5vcHRpb25zLm1vbml0b3IubGVuZ3RoPjApe1xuXHRcdFx0dGhpcy5tb25pdG9yPW5ldyBNb25pdG9yKCk7XG5cdFx0XHR0aGlzLm9wdGlvbnMuZW5kcG9pbnRzLnB1c2godGhpcy5tb25pdG9yKVxuXHRcdFx0Y29uc29sZS53YXJuKFwiU2VydmljZSBNb25pdG9yIGluaXRpYWxpemVkXCIpXG5cdFx0XHRjb25zb2xlLndhcm4oXCJtb25pdG9yIGxpbmtzOlwiKVxuXHRcdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5tb25pdG9yKXtcblx0XHRcdFx0Y29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpLmxvZ2luK2kucGFzc3dvcmQpLmRpZ2VzdCgpLnRvU3RyaW5nKFwiaGV4XCIpXG5cdFx0XHRcdGNvbnNvbGUud2FybihcIk1vbml0b3IgbGluayBmb3I6IFwiK2kubG9naW4rXCIgLT4gL3NtLVwiK2hhc2gpXHRcdFx0XHRcdFx0XG5cdFx0XHR9XG5cblx0XHRcdFJFUV9NT05JVE9SX1VTRVJTLmxpc3RlbmVyID0gYXN5bmMgKHJlcSk9Pntcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gW11cblx0XHRcdFx0aWYodGhpcy5vcHRpb25zLm1vbml0b3Ipe1xuXHRcdFx0XHRcdGZvcihsZXQgaSBvZiB0aGlzLm9wdGlvbnMubW9uaXRvcil7XG5cdFx0XHRcdFx0XHRjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGkubG9naW4raS5wYXNzd29yZCkuZGlnZXN0KCkudG9TdHJpbmcoXCJoZXhcIik7XG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChoYXNoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhdHRhY2ggZW5kcG9pbnRzIGZvciBleHRlcm5hbCBjYWxsc1xuXHRcdHRoaXMub3B0aW9ucy5lbmRwb2ludHMucHVzaChuZXcgRXh0ZXJuYWxTZXJ2aWNlRW5kcG9pbnQoKSk7XG5cblx0XHQvLyBjcmVhdGUgbGl2ZW5lc3MsIHJlYWRpbmVzc1xuXHRcdHRoaXMub3B0aW9ucy5lbmRwb2ludHMucHVzaChuZXcgTGl2ZW5lc3ModGhpcy5zdGFydGVkKSxuZXcgUmVhZGluZXNzKHRoaXMuc3RhcnRlZCkpXG5cdFx0UkVRX0hUVFBfUkVRVUVTVFNfQ09VTlQubGlzdGVuZXIgPSBhc3luYyAoKSA9PiB0aGlzLnJlcXVlc3RzQ291bnQ7XG5cdH1cblxuXG5cdG92ZXJyaWRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cblx0XHRSRVFfSFRUUF9MT0cubGlzdGVuZXI9YXN5bmMgaWdub3JlPT50aGlzLm5ldExvZztcblx0XHRSRVFfQ1JFQVRFX05FVF9MT0cubGlzdGVuZXIgPSBhc3luYyBpZ25vcmU9Pntcblx0XHRcdGNvbnN0IGxvZzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW0gPSB7XG5cdFx0XHRcdGNyZWF0ZWQ6ICtuZXcgRGF0ZSgpLFxuXHRcdFx0XHR0aW1lOiAwLFxuXHRcdFx0XHRyZXF1ZXN0OiB7fSxcblx0XHRcdFx0cmVzcG9uc2U6IHt9LFxuXHRcdFx0XHRlcnJvcjpudWxsLFxuXHRcdFx0XHRpZDogQVBJU2VydmljZS5uZXh0TG9nSUQrK1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5uZXRMb2cucHVzaChsb2cpXG5cdFx0XHRpZih0aGlzLm5ldExvZy5sZW5ndGg+MTAwMClcblx0XHRcdFx0dGhpcy5uZXRMb2cuc2hpZnQoKVxuXHRcdFx0cmV0dXJuIGxvZztcblx0XHR9XG5cblx0XHQvLyBpbnRlcm5hbCBjYWxsXG5cdFx0UkVRX0lOVEVSTkFMX0NBTEwubGlzdGVuZXIgPSBhc3luYyAocmVxKT0+e1xuXHRcdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5lbmRwb2ludHMpe1xuXHRcdFx0XHRpZighaSB8fCAhaS5lbmRwb2ludHMpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdGZvcihsZXQgaiBvZiBpLmVuZHBvaW50cyl7XG5cdFx0XHRcdFx0bGV0IGVwID0gQmFzZUVuZHBvaW50LmdldEVudHJ5UG9pbnQoKStqLmVuZHBvaW50O1xuXHRcdFx0XHRcdGVwID0gZXAucmVwbGFjZUFsbChcIi8vXCIsXCIvXCIpXG5cdFx0XHRcdFx0aWYoZXAgPT09IHJlcS5lbmRwb2ludCl7XG5cdFx0XHRcdFx0XHRyZXEuaW50ZXJuYWxDYWxsPXRydWU7XG5cdFx0XHRcdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGkuZXhlY3V0ZShyZXEpXG5cdFx0XHRcdFx0XHRpZihyZXNwb25zZS5lcnJvcilcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge2Vycm9yOkRlZmF1bHRFcnJvcnMuVU5LTk9XTl9SRVFVRVNULGRhdGE6bnVsbCxodHRwU3RhdHVzOjQwNH1cblx0XHR9XG5cblx0XHQvLyBpbml0aWFsaXplIGV4cHJlc3Ncblx0XHRjb25zdCBhcHAgPSBleHByZXNzKClcblx0XHRjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhcHApO1xuXG5cdFx0UkVRX0hUVFBfU0VSVkVSLmxpc3RlbmVyID0gYXN5bmMgaWdub3JlPT57cmV0dXJuIHtleHByZXNzOmFwcCxodHRwOnNlcnZlcn19O1xuXG5cdFx0aWYodGhpcy5vcHRpb25zLmlzUHJvZHVjdGlvbkVudmlyb25tZW50KVxuXHRcdFx0YXBwLnNldChcImVudlwiLCdwcm9kdWN0aW9uJyk7XG5cblx0XHRhcHAudXNlKGV4cHJlc3MuanNvbih7IGxpbWl0OiAnMTBtYicgfSkpIC8vIGZvciBwYXJzaW5nIGFwcGxpY2F0aW9uL2pzb25cblx0XHRhcHAudXNlKGV4cHJlc3MudXJsZW5jb2RlZCh7IGxpbWl0OiAnMTBtYicsIGV4dGVuZGVkOiB0cnVlIH0pKSAvLyBmb3IgcGFyc2luZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblxuXHRcdGFwcC51c2UoZmlsZVVwbG9hZCh7XG5cdFx0XHRsaW1pdEhhbmRsZXI6IChyZXEsIHJlcywgbmV4dCk9Pntcblx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtcblx0XHRcdFx0XHRlcnJvcjpEZWZhdWx0RXJyb3JzLkZJTEVfVE9PX0xBUkdFLFxuXHRcdFx0XHRcdGRhdGE6bnVsbCxcblx0XHRcdFx0XHRodHRwU3RhdHVzOjQxMyxcblx0XHRcdFx0fSwrbmV3IERhdGUoKSxyZXEucGF0aCk7XG5cdFx0XHR9LFxuXHRcdFx0bGltaXRzOiB7IGZpbGVTaXplOiB0aGlzLm9wdGlvbnMuZmlsZUxpbWl0IH0sXG5cdFx0XHR1c2VUZW1wRmlsZXM6IHRydWUsXG5cdFx0XHR1cmlEZWNvZGVGaWxlTmFtZXM6IHRydWUsXG5cdFx0XHR0ZW1wRmlsZURpcjogdGhpcy5vcHRpb25zLmZpbGVUZW1wRGlyLFxuXHRcdFx0Ly9zYWZlRmlsZU5hbWVzOiB0cnVlLFxuXHRcdFx0YWJvcnRPbkxpbWl0OnRydWVcblx0XHR9KSlcblxuXHRcdGFwcC51c2UoYXN5bmMgKGVycjphbnkscmVxOmFueSxyZXNwOmFueSxuZXh0OmFueSk9Pntcblx0XHRcdFxuXHRcdFx0aWYoIWVycil7XG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHR9XG5cdFx0XHRcdC8vcmVxdWVzdCBzdGFydCB0aW1lXG5cdFx0XHRjb25zdCB0bWUgPSArbmV3IERhdGUoKTtcblx0XHRcdGNvbnN0IGxvZyA9IGF3YWl0IFJFUV9DUkVBVEVfTkVUX0xPRy5yZXF1ZXN0KCk7XG5cdFx0XHRsb2cucmVxdWVzdD17XG5cdFx0XHRcdG1ldGhvZDpyZXEubWV0aG9kLFxuXHRcdFx0XHRkYXRhOlwiXCIsXG5cdFx0XHRcdHBhcmFtczpyZXEucGFyYW1zXG5cdFx0XHR9XG5cblx0XHRcdGxldCByZXNwb25zZUVycm9yPURlZmF1bHRFcnJvcnMuVU5LTk9XTl9SRVFVRVNUO1xuXHRcdFx0aWYgKHR5cGVvZiBlcnIgPT09IFwib2JqZWN0XCIgJiYgZXJyLnN0YXR1cyA9PT0gNDAwICYmICdib2R5JyBpbiBlcnIgJiYgZXJyLnR5cGUgPT09ICdlbnRpdHkucGFyc2UuZmFpbGVkJykge1xuXHRcdFx0XHRyZXNwb25zZUVycm9yID0gRGVmYXVsdEVycm9ycy5KU09OX01BTEZPUk1FRFxuXHRcdFx0fVxuICAgICAgXG5cblx0XHRcdHRoaXMuc2VuZFJlc3BvbnNlKHJlcS5nZXQoXCJSZWZlcmVyXCIpPz9cIlwiLHJlc3Ase1xuXHRcdFx0XHRlcnJvcjpyZXNwb25zZUVycm9yLFxuXHRcdFx0XHRkYXRhOm51bGwsXG5cdFx0XHRcdGh0dHBTdGF0dXM6NDAwXG5cdFx0XHR9LHRtZSxcIlwiLGxvZylcblxuXHRcdH0pXG5cblx0XHRjb25zdCBjb3JzT3B0aW9ucyA9IHtcblx0XHRcdG9yaWdpbjogKG9yaWdpbjogYW55LCBjYWxsYmFjazogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9yaWdpbklzV2hpdGVsaXN0ZWQgPSB0aGlzLm9wdGlvbnMuY29yc0hvc3RXaGl0ZUxpc3QuaW5jbHVkZXMob3JpZ2luKVxuXHRcdFx0XHRjYWxsYmFjayhudWxsLCBvcmlnaW5Jc1doaXRlbGlzdGVkKVxuXHRcdFx0fSxcblx0XHRcdGNyZWRlbnRpYWxzOiB0cnVlXG5cdFx0fVxuXHRcdGFwcC51c2UoY29ycyhjb3JzT3B0aW9ucykpXG5cblx0XHQvLyByZWdpc3RyYXRlIGVuZHBvaW50c1xuXHRcdEJhc2VFbmRwb2ludC5zZXRFbnRyeVBvaW50KHRoaXMub3B0aW9ucy5iYXNlRW5kUG9pbnQpXG5cdFx0XG5cdFx0Zm9yKGxldCBpIG9mIHRoaXMub3B0aW9ucy5lbmRwb2ludHMpe1xuXHRcdFx0YXdhaXQgaS5pbml0KCk7XG5cdFx0XHRpZighaS5lbmRwb2ludHMpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0Zm9yKGxldCBqIG9mIGkuZW5kcG9pbnRzKXtcblx0XHRcdFx0bGV0IGVwID0gQmFzZUVuZHBvaW50LmdldEVudHJ5UG9pbnQoKStqLmVuZHBvaW50O1xuXHRcdFx0XHRlcCA9IGVwLnJlcGxhY2VBbGwoXCIvL1wiLFwiL1wiKVxuXHRcdFx0XHRcblxuXHRcdFx0XHQvLyBpbmNvbWluZyByZXF1ZXN0XG5cdFx0XHRcdGFwcC5hbGwoZXAsYXN5bmMgKHJlcSxyZXMpPT57XG5cdFx0XHRcdFx0dGhpcy5yZXF1ZXN0c0NvdW50Kys7XG5cdFx0XHRcdFx0Y29uc3QgdG1lID0gK25ldyBEYXRlKCk7XG5cdFx0XHRcdFx0bGV0IGxvZzpBUElTZXJ2aWNlTmV0d29ya0xvZ0l0ZW18bnVsbCA9IG51bGw7XG5cdFx0XHRcdFx0aWYoIWkuaWdub3JlSHR0cExvZ2dpbmcpe1xuXHRcdFx0XHRcdFx0bG9nID0gYXdhaXQgUkVRX0NSRUFURV9ORVRfTE9HLnJlcXVlc3QoKTtcblx0XHRcdFx0XHRcdGxvZy5yZXF1ZXN0PXtcblx0XHRcdFx0XHRcdFx0dXJsOnJlcS51cmwsXG5cdFx0XHRcdFx0XHRcdG1ldGhvZDpyZXEubWV0aG9kLFxuXHRcdFx0XHRcdFx0XHRkYXRhOnRoaXMuY2hlY2tEYXRhTGVuZ3RoKHJlcS5ib2R5KSxcblx0XHRcdFx0XHRcdFx0cGFyYW1zOnRoaXMuY2hlY2tEYXRhTGVuZ3RoKHJlcS5wYXJhbXMpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgZXhlY3V0ZSA9IGFzeW5jICgpPT57XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJvZHkgPSByZXEuYm9keTtcblx0XHRcdFx0XHRcdGlmKHJlcS5xdWVyeSAmJiB0eXBlb2YgcmVxLnF1ZXJ5ID09PSBcIm9iamVjdFwiKXtcblx0XHRcdFx0XHRcdFx0Zm9yKGxldCBpIGluIHJlcS5xdWVyeSl7XG5cdFx0XHRcdFx0XHRcdFx0Ym9keVtpXT1yZXEucXVlcnlbaV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgaHR0cFJlcXVlc3Q6SFRUUFJlcXVlc3RWTyA9IHtcblx0XHRcdFx0XHRcdFx0cmF3OnJlcSBhcyBJbmNvbWluZ01lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlOnJlcyxcblx0XHRcdFx0XHRcdFx0bWV0aG9kOnJlcS5tZXRob2QsXG5cdFx0XHRcdFx0XHRcdGRhdGE6cmVxLmJvZHksXG5cdFx0XHRcdFx0XHRcdHBhcmFtczpyZXEucGFyYW1zLFxuXHRcdFx0XHRcdFx0XHRoZWFkZXJzOnJlcS5oZWFkZXJzIGFzIGFueSxcblx0XHRcdFx0XHRcdFx0ZW5kcG9pbnQ6ZXAsXG5cdFx0XHRcdFx0XHRcdGZpbGVzOnJlcS5maWxlcyA/PyBudWxsLFxuXHRcdFx0XHRcdFx0XHRyZWZlcmVyOnJlcS5nZXQoXCJSZWZlcmVyXCIpLFxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZih0aGlzLm9wdGlvbnMucHJlcHJvZHVjZXIpe1xuXHRcdFx0XHRcdFx0XHR0cnl7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByZXByb2R1Y2VyUmVzdWx0ID0gYXdhaXQgdGhpcy5vcHRpb25zLnByZXByb2R1Y2VyKGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0aWYocHJlcHJvZHVjZXJSZXN1bHQpXG5cdFx0XHRcdFx0XHRcdFx0aHR0cFJlcXVlc3QucHJlcHJvZHVjZXJSZXN1bHQgPSBwcmVwcm9kdWNlclJlc3VsdDtcblx0XHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRcdFx0XHRcdGxldCBkZXRhaWxzPWAke2V9YFxuXHRcdFx0XHRcdFx0XHRcdGxldCBzdGFjazpJRXJyb3JbXXx1bmRlZmluZWQ9dW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdGlmKEVycm9yVXRpbHMuaXNFcnJvcihlKSl7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZXRhaWxzPShlIGFzIGFueSkubWVzc2FnZVxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhY2sgPSBbZSBhcyBhbnldO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdGlmKGlzTXlzcWxFcnJvcihlKSlcblx0XHRcdFx0XHRcdFx0XHRcdGRldGFpbHMgPSAoZSBhcyBNeXNxbEVycm9yKS5tZXNzYWdlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtlcnJvcjp7Y29kZToxMDAwMixtZXNzYWdlOlwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsc3RhY2s6c3RhY2ssZGV0YWlsczpkZXRhaWxzfSxkYXRhOm51bGwsaHR0cFN0YXR1czo1MDB9LHRtZSxlcCxsb2csaHR0cFJlcXVlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgcmVzdWx0XG5cdFx0XHRcdFx0XHR0cnl7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGlnbm9yZUludGVyY2VwdG9yID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGxldCBhbGxvd0ludGVyY2VwdG9yRXJyb3IgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0aWYoai5pZ25vcmVJbnRlcmNlcHRvcilcblx0XHRcdFx0XHRcdFx0XHRpZ25vcmVJbnRlcmNlcHRvcj10cnVlO1xuXHRcdFx0XHRcdFx0XHRpZihqLmFsbG93SW50ZXJjZXB0b3JFcnJvcilcblx0XHRcdFx0XHRcdFx0XHRhbGxvd0ludGVyY2VwdG9yRXJyb3I9dHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHRpZih0eXBlb2Ygai5oYW5kbGVyID09PSBcIm9iamVjdFwiICl7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdHJ5IHRvIGdldCBoYW5kbGVyIHJlbGF5aW5nIG9uIGh0dHAgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaGFuZGxlciA9IGouaGFuZGxlcltodHRwUmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKV07XG5cdFx0XHRcdFx0XHRcdFx0aWYodHlwZW9mIGhhbmRsZXIgPT09IFwib2JqZWN0XCIpe1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYoaGFuZGxlci5pZ25vcmVJbnRlcmNlcHRvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWdub3JlSW50ZXJjZXB0b3I9dHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKGhhbmRsZXIuYWxsb3dJbnRlcmNlcHRvckVycm9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbGxvd0ludGVyY2VwdG9yRXJyb3I9dHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9IFxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSBpbnRlcmNlcHRvciBpZiBleGlzdHNcblx0XHRcdFx0XHRcdFx0aWYoIWlnbm9yZUludGVyY2VwdG9yKXtcblx0XHRcdFx0XHRcdFx0XHRsZXQgaW50ZXJjZXB0b3JSZXN1bHQ7XG5cdFx0XHRcdFx0XHRcdFx0aWYodGhpcy5vcHRpb25zLmludGVyY2VwdG9yKXtcblx0XHRcdFx0XHRcdFx0XHRcdGludGVyY2VwdG9yUmVzdWx0PWF3YWl0IHRoaXMub3B0aW9ucy5pbnRlcmNlcHRvci5leGVjdXRlKGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKGludGVyY2VwdG9yUmVzdWx0LmVycm9yICYmICFhbGxvd0ludGVyY2VwdG9yRXJyb3Ipe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMsaW50ZXJjZXB0b3JSZXN1bHQsdG1lLGVwLGxvZyxodHRwUmVxdWVzdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGh0dHBSZXF1ZXN0LmludGVyY2VwdG9yUmVzdWx0ID0gaW50ZXJjZXB0b3JSZXN1bHRcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyBQcmVjaGVjayBXSFk/XG5cdFx0XHRcdFx0XHRcdGlmKGkgPT09IHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHRcdFx0XHRodHRwUmVxdWVzdC5wcmVjaGVjaz17ZGF0YTp0aGlzLm9wdGlvbnMubW9uaXRvcn1cblxuXHRcdFx0XHRcdFx0XHRjb25zdCBwcmVjaGVjaz1hd2FpdCBpLnByZWNoZWNrKGh0dHBSZXF1ZXN0KVxuXHRcdFx0XHRcdFx0XHRpZihwcmVjaGVjayAmJiBwcmVjaGVjay5lcnJvcil7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHByZWNoZWNrLHRtZSxlcCxsb2csaHR0cFJlcXVlc3QpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGh0dHBSZXF1ZXN0LnByZWNoZWNrPXByZWNoZWNrO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gSWYgaW50ZXJjZXB0b3IgaGFzIG5vIGVycm9ycywgZXhlY3V0ZSBtYWluIGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0cmVzdWx0ID0gYXdhaXQgaS5leGVjdXRlKGh0dHBSZXF1ZXN0KVxuXG5cblx0XHRcdFx0XHRcdFx0IFxuXHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMub3B0aW9ucy5vbkVycm9yKGUpXG5cdFx0XHRcdFx0XHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUZhdGFsRXJyb3IoZXApO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgaWYgZXJyb3IgaXMgSUVycm9yXG5cdFx0XHRcdFx0XHRcdGxldCBkYXRhOlRyYW5zZmVyUGFja2V0Vk8gPSB7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6e1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29kZToxMDAwMixcblx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6XCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGV0YWlsczpgJHtlfWBcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZihFcnJvclV0aWxzLmlzRXJyb3IoZSkpXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YSA9IHtlcnJvcjplIGFzIElFcnJvcn1cblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMsZGF0YSx0bWUsZXAsbG9nLGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHJlc3VsdCx0bWUsZXAsbG9nLGh0dHBSZXF1ZXN0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRleGVjdXRlKClcblx0XHRcdFx0fSk7Ly8gaGFuZGxlIGluY29taW5nIHJlcXVlc3RcblxuXHRcdFx0fVxuXHRcdH1cblxuXHRcblxuXHRcdC8vIGZpbmFsIGhhbmRsZXJcblx0XHRhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuXHRcdFx0XG5cdFx0XHRjb25zdCB0bWUgPSArbmV3IERhdGUoKVxuXG5cdFx0XHRpZih0aGlzLm1vbml0b3IgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb25pdG9yKXtcblx0XHRcdFx0Ly9jaGVjayBpZiByZXF1ZXN0aW5nIG1vbml0b3Jcblx0XHRcdFx0aWYocmVxLm1ldGhvZD09PVwiR0VUXCIpe1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdGxldCBtb25pdG9yUmVxdWVzdD1mYWxzZTtcblx0XHRcdFx0XHRmb3IobGV0IGkgb2YgdGhpcy5vcHRpb25zLm1vbml0b3Ipe1xuXHRcdFx0XHRcdFx0Y29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpLmxvZ2luK2kucGFzc3dvcmQpLmRpZ2VzdCgpLnRvU3RyaW5nKFwiaGV4XCIpXG5cdFx0XHRcdFx0XHRpZihyZXEub3JpZ2luYWxVcmwuZW5kc1dpdGgoXCIvc20tXCIraGFzaCkpe1xuXHRcdFx0XHRcdFx0XHRtb25pdG9yUmVxdWVzdD10cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZihtb25pdG9yUmVxdWVzdCl7XG5cdFx0XHRcdFx0XHQvLyBzZW5kIGluZGV4IFRodSwgMTYgTm92IDIwMjMgMjM6MzM6MzUgR01UXG5cdFx0XHRcdFx0XHRjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcblx0XHRcdFx0XHRcdHRyeXtcblx0XHRcdFx0XHRcdFx0aWYoIXRoaXMubW9uaXRvckluZGV4RmlsZSlcblx0XHRcdFx0XHRcdFx0dGhpcy5tb25pdG9ySW5kZXhGaWxlID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsXCJtb25pdG9yXCIsXCJpbmRleC5odG1sXCIpKTtcblx0XHRcdFx0XHRcdFx0cmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLFwidGV4dC9odG1sXCIpXG5cdFx0XHRcdFx0XHRcdHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiLHRoaXMubW9uaXRvckluZGV4RmlsZS5ieXRlTGVuZ3RoKVxuXHRcdFx0XHRcdFx0XHRyZXMuc3RhdHVzKDIwMCkuc2VuZCh0aGlzLm1vbml0b3JJbmRleEZpbGUpO1xuXHRcdFx0XHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbmRSZXNwb25zZShyZXEuZ2V0KFwiUmVmZXJlclwiKT8/XCJcIixyZXMse1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yOntcblx0XHRcdFx0XHRcdFx0XHRcdGNvZGU6MTAwMDIsXG5cdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOlwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRkZXRhaWxzOmAke2V9YFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTpudWxsLFxuXHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwXG5cdFx0XHRcdFx0XHRcdH0sdG1lLHJlcS5wYXRoKTtcdFx0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdFxuXHRcdFx0dGhpcy5zZW5kUmVzcG9uc2UocmVxLmdldChcIlJlZmVyZXJcIik/P1wiXCIscmVzLHtcblx0XHRcdFx0ZXJyb3I6RGVmYXVsdEVycm9ycy5VTktOT1dOX1JFUVVFU1QsXG5cdFx0XHRcdGRhdGE6bnVsbCxcblx0XHRcdFx0aHR0cFN0YXR1czo0MDRcblx0XHRcdH0sdG1lLHJlcS5wYXRoKTtcblx0XHR9KVxuXG5cdFx0c2VydmVyLmxpc3Rlbih0aGlzLm9wdGlvbnMucG9ydCwgKCkgPT4ge1xuXHRcdFx0bG9nQ3JpdCgnJHtBUElTZXJ2aWNlLmpzfScsJ0FQSSBTZXJ2aWNlIHN0YXJ0ZWQgYXQ6ICcrdGhpcy5vcHRpb25zLnBvcnQrXCIsIHdpdGggYmFzZSBlbmRwb2ludDpcIit0aGlzLm9wdGlvbnMuYmFzZUVuZFBvaW50K1wiLCB2ZXIuOiBcIit0aGlzLnZlcnNpb24pXG5cdFx0fSlcblxuXHRcdC8qYXBwLmxpc3Rlbih0aGlzLm9wdGlvbnMucG9ydCwgKCkgPT4ge1xuXHRcdFx0bG9nQ3JpdCgnJHtBUElTZXJ2aWNlLmpzfScsJ0FQSSBTZXJ2aWNlIHN0YXJ0ZWQgYXQ6ICcrdGhpcy5vcHRpb25zLnBvcnQrXCIsIHdpdGggYmFzZSBlbmRwb2ludDpcIit0aGlzLm9wdGlvbnMuYmFzZUVuZFBvaW50K1wiLCB2ZXIuOiBcIit0aGlzLnZlcnNpb24pXG5cdFx0fSkqL1xuXHR9XG5cblx0YXN5bmMgc2VuZFJlc3BvbnNlKHJlZjpzdHJpbmcscmVzOlJlc3BvbnNlLGRhdGE6VHJhbnNmZXJQYWNrZXRWTzxhbnk+LHJlcXVlc3RUaW1lOm51bWJlcixlbmRwb2ludD86c3RyaW5nLGxvZz86QVBJU2VydmljZU5ldHdvcmtMb2dJdGVtfG51bGwscmVxPzpIVFRQUmVxdWVzdFZPKXtcblxuXHRcdGlmKGRhdGEuYmxvY2tSZXNwb25zZSl7XG5cdFx0XHRpZihsb2cpXG5cdFx0XHRcdGxvZy5lcnJvciA9IFwiUmVzcG9uc2UgYmxvY2tlZFwiXG5cdFx0XHRpZih0aGlzLm9wdGlvbnMub25OZXR3b3JrTG9nICYmIGxvZylcblx0XHRcdFx0dGhpcy5vcHRpb25zLm9uTmV0d29ya0xvZyhsb2cpXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYocmVxICYmIHJlcS5zdHJlYW0pe1xuXHRcdFx0XG5cdFx0fVxuXG5cdFx0aWYodGhpcy5vcHRpb25zLnBvc3Rwcm9kdWNlcil7XG5cdFx0XHR0cnl7XG5cdFx0XHRcdGRhdGEgPSBhd2FpdCB0aGlzLm9wdGlvbnMucG9zdHByb2R1Y2VyKHJlcSxyZXMsZGF0YSxyZXF1ZXN0VGltZSxlbmRwb2ludCxsb2cpO1xuXHRcdFx0fWNhdGNoKGUpe1xuXHRcdFx0XHRsb2dFcnJvcihcIlBvc3Rwcm9kdWNlciBlcnJvclwiLGUpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYoRXJyb3JVdGlscy5pc0Vycm9yKGRhdGEpKVxuXHRcdFx0ZGF0YSA9IHtlcnJvcjpkYXRhIGFzIElFcnJvcixkYXRhOm51bGx9XG5cdFx0XG4gICAgICAgIGRhdGEucmVzcG9uc2VUaW1lID0gKCtuZXcgRGF0ZSgpKSAtIHJlcXVlc3RUaW1lO1xuICAgICAgICBkYXRhLmNvcmUgPSB0aGlzLnZlcnNpb25cbiAgICAgICAgZGF0YS5lbmRwb2ludCA9IGVuZHBvaW50ID8/IFwibm9fZW5kcG9pbnRcIlxuXHRcdFxuXHRcdGlmKHRoaXMub3B0aW9ucy5hcHBWZXJzaW9uKVxuXHRcdFx0ZGF0YS52ZXJzaW9uPXRoaXMub3B0aW9ucy5hcHBWZXJzaW9uXG5cblx0XHRcblx0XHRpZihsb2cpe1xuXHRcdFx0bG9nLnRpbWUgPSBkYXRhLnJlc3BvbnNlVGltZVxuXHRcdFx0bG9nLnJlZmVyZXI9cmVmO1xuXHRcdH1cblxuXHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdHRoaXMubW9uaXRvci5yZWdpc3RyYXRlUmVzcG9uc2UoZGF0YS5lbmRwb2ludCxkYXRhLnJlc3BvbnNlVGltZSlcblxuICAgICAgICBpZihyZXMuZGVzdHJveWVkIHx8IHJlcy5jbG9zZWQpe1xuXG5cdFx0XHRpZihsb2cpXG5cdFx0XHRcdGxvZy5lcnJvciA9IFwiQ29ubmVjdGlvbiBhbHJlYWR5IGNsb3NlZCwgY2FuJ3Qgc2VuZCByZXNwb25zZSBmb3I6IFwiK2RhdGEuZW5kcG9pbnRcblx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuICAgICAgICAgICAgXHR0aGlzLm9wdGlvbnMub25FcnJvcihcIkNvbm5lY3Rpb24gYWxyZWFkeSBjbG9zZWQsIGNhbid0IHNlbmQgcmVzcG9uc2U6IFwiK2RhdGEuZW5kcG9pbnQsZGF0YSlcbiAgICAgICAgICAgIFxuXHRcdFx0aWYodGhpcy5tb25pdG9yKVxuXHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXG4gICAgICAgIH1lbHNle1xuXHRcdFx0dHJ5e1xuXG5cdFx0XHRcdGlmKGRhdGEuZmlsZSl7XG5cblx0XHRcdFx0XHRyZXMuc2VuZEZpbGUoZGF0YS5maWxlLGVycj0+e1xuXHRcdFx0XHRcdFx0aWYoZXJyKXtcblx0XHRcdFx0XHRcdFx0aWYobG9nKVxuXHRcdFx0XHRcdFx0XHRcdGxvZy5lcnJvciA9IFwiQ2FuJ3Qgc2VuZCBmaWxlOiBcIitkYXRhLmZpbGVcblx0XHRcdFxuXHRcdFx0XHRcdFx0XHRpZih0aGlzLm1vbml0b3IgJiYgZGF0YS5lbmRwb2ludClcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUFQSUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VuZFJlc3BvbnNlKHJlZixyZXMse1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yOkRlZmF1bHRFcnJvcnMuQ0FOVF9TRU5EX0ZJTEUsXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YTpudWxsLFxuXHRcdFx0XHRcdFx0XHRcdGh0dHBTdGF0dXM6NTAwXG5cdFx0XHRcdFx0XHRcdH0scmVxdWVzdFRpbWUsZGF0YS5lbmRwb2ludCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHR9KVxuXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHRpZihkYXRhLnJlZGlyZWN0KXtcblx0XHRcdFx0XHRyZXMucmVkaXJlY3QoZGF0YS5yZWRpcmVjdCk7XG5cdFx0XHRcdFx0aWYobG9nKVxuXHRcdFx0XHRcdFx0bG9nLnJlc3BvbnNlID0ge3JlZGlyZWN0OmRhdGEucmVkaXJlY3R9XG5cdFx0XHRcdH1lbHNle1xuXHRcdFx0XHRcdC8vIHNldHVwIGhlYWRlcnNcblx0XHRcdFx0XHRpZihkYXRhLmhlYWRlcnMpe1xuXHRcdFx0XHRcdFx0Zm9yKGxldCBpIGluIGRhdGEuaGVhZGVycylcblx0XHRcdFx0XHRcdFx0cmVzLnNldEhlYWRlcihpLGRhdGEuaGVhZGVyc1tpXSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYoZGF0YS5lcnJvciAmJiBkYXRhLmVycm9yLmh0dHBTdGF0dXMgJiYgZGF0YS5lcnJvci5odHRwU3RhdHVzPjk5KVxuXHRcdFx0XHRcdFx0cmVzLnN0YXR1c0NvZGUgPSBkYXRhLmVycm9yLmh0dHBTdGF0dXNcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXMuc3RhdHVzQ29kZT1kYXRhLmh0dHBTdGF0dXMgPz8gMjAwXG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0aWYoZGF0YS5yYXdSZXNwb25zZSl7XG5cdFx0XHRcdFx0XHRyZXMuc2VuZChkYXRhLmRhdGEpXG5cdFx0XHRcdFx0XHRpZihsb2cpXG5cdFx0XHRcdFx0XHRcdGxvZy5yZXNwb25zZSA9IHRoaXMuY2hlY2tEYXRhTGVuZ3RoKGRhdGEpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0XHRyZXMuc2VuZChkYXRhKTtcblx0XHRcdFx0XHRcdGlmKGxvZylcblx0XHRcdFx0XHRcdFx0bG9nLnJlc3BvbnNlID0gdGhpcy5jaGVja0RhdGFMZW5ndGgoZGF0YSlcblxuXHRcdFx0XHRcdFx0aWYoZGF0YS5lcnJvciAmJiB0aGlzLm1vbml0b3Ipe1xuXHRcdFx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUFQSUVycm9yKGRhdGEuZW5kcG9pbnQpXG5cdFx0XHRcdFx0XHRcdGlmKGxvZylcblx0XHRcdFx0XHRcdFx0XHRsb2cuZXJyb3IgPSBkYXRhLmVycm9yLm1lc3NhZ2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9Y2F0Y2goZSl7XG5cdFx0XHRcdGlmKHRoaXMub3B0aW9ucy5vbkVycm9yKVxuXHRcdFx0XHRcdHRoaXMub3B0aW9ucy5vbkVycm9yKFwiQ2FuJ3Qgc2VuZCByZXNwb25zZVwiLGUpO1xuXHRcdFx0XHRpZihsb2cpXG5cdFx0XHRcdFx0bG9nLmVycm9yPVwiQ2FuJ3Qgc2VuZCByZXNwb25zZVwiXG5cdFx0XHRcdGlmKHRoaXMubW9uaXRvcilcblx0XHRcdFx0XHR0aGlzLm1vbml0b3IucmVnaXN0cmF0ZUVycm9yKGRhdGEuZW5kcG9pbnQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHNob3cgbG9nXG5cdFx0aWYobG9nICYmIGxvZy5lcnJvciAmJiB0aGlzLm9wdGlvbnMub25FcnJvcil7XG5cdFx0XHR0aGlzLm9wdGlvbnMub25FcnJvcihsb2cuZXJyb3IpXG5cdFx0fWVsc2V7XG5cdFx0XHRpZih0aGlzLm9wdGlvbnMub25OZXR3b3JrTG9nICYmIGxvZylcblx0XHRcdFx0dGhpcy5vcHRpb25zLm9uTmV0d29ya0xvZyhsb2cpXG5cdFx0fVxuICAgIH1cblxuXG5cdGNoZWNrRGF0YUxlbmd0aChkYXRhOmFueSxyZXN1bHQ/OmFueSxsdmw/Om51bWJlcik6YW55e1xuXHRcdFxuXHRcdGlmKCFsdmwpXG5cdFx0XHRsdmw9MDtcblxuXHRcdGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiKXtcblx0XHRcdGlmKHR5cGVvZiBkYXRhPT09XCJzdHJpbmdcIiAmJiBkYXRhLmxlbmd0aD4xMDI0KVxuXHRcdFx0XHRyZXR1cm4gZGF0YS5zdWJzdHJpbmcoMCwxMDAwKStcIi4uLiAodG90YWw6XCIgKyBkYXRhLmxlbmd0aCArIFwiKVwiXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHRpZih0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIil7XG5cdFx0XHRpZighcmVzdWx0KVxuXHRcdFx0XHRyZXN1bHQ9e307XG5cdFx0XHRsZXQgYXJyY250ID0gMTAwO1xuXHRcdFx0Zm9yKGxldCBpIGluIGRhdGEpe1xuXHRcdFx0XHRyZXN1bHRbaV09dGhpcy5jaGVja0RhdGFMZW5ndGgoZGF0YVtpXSxyZXN1bHRbaV0sbHZsKzEpO1xuXHRcdFx0XHRhcnJjbnQtLTtcblx0XHRcdFx0aWYoYXJyY250PD0wKXtcblx0XHRcdFx0XHRyZXN1bHRbXCIuLi5cIl09XCIuLi4gdG90YWw6IFwiK0FycmF5LmlzQXJyYXkoZGF0YSk/ZGF0YS5sZW5ndGg6T2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQgPz8gbnVsbDtcblx0fVxuXG59XG4iXX0=
|
@@ -8,6 +8,17 @@ class BaseService {
|
|
8
8
|
}
|
9
9
|
async init() {
|
10
10
|
console.log("Service: " + this.name + " initialized");
|
11
|
+
process.on('SIGINT', async () => {
|
12
|
+
await this.finishService();
|
13
|
+
process.exit(0);
|
14
|
+
});
|
15
|
+
process.on('SIGTERM', async () => {
|
16
|
+
await this.finishService();
|
17
|
+
process.exit(0);
|
18
|
+
});
|
19
|
+
}
|
20
|
+
async finishService() {
|
21
|
+
console.log("Service: " + this.name + " finished -- not implemented --");
|
11
22
|
}
|
12
23
|
getName() {
|
13
24
|
return this.name;
|
@@ -15,4 +26,4 @@ class BaseService {
|
|
15
26
|
applicationReady() { }
|
16
27
|
}
|
17
28
|
exports.BaseService = BaseService;
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpU2VydmVyL0Jhc2VTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLE1BQWEsV0FBVztJQUVaLElBQUksQ0FBUTtJQUN0QixZQUFhLElBQVk7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7SUFDbEIsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUMsSUFBSSxDQUFDLElBQUksR0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsRCxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM5QixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBR0gsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUMsS0FBSyxJQUFJLEVBQUU7WUFDOUIsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYTtRQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBQyxJQUFJLENBQUMsSUFBSSxHQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELGdCQUFnQixLQUFZLENBQUM7Q0FDOUI7QUE5QkQsa0NBOEJDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJQmFzZVNlcnZpY2Uge1xuICBpbml0OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIGFwcGxpY2F0aW9uUmVhZHk6ICgpID0+IHZvaWRcbiAgZ2V0TmFtZTogKCkgPT4gc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBCYXNlU2VydmljZSBpbXBsZW1lbnRzIElCYXNlU2VydmljZSB7XG5cbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZ1xuICBjb25zdHJ1Y3RvciAobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICB9XG5cbiAgYXN5bmMgaW5pdCAoKTogUHJvbWlzZTx2b2lkPiB7IFxuICAgIGNvbnNvbGUubG9nKFwiU2VydmljZTogXCIrdGhpcy5uYW1lK1wiIGluaXRpYWxpemVkXCIpO1xuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoU2VydmljZSgpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgIC8vIHRlcm1pbmF0ZSAoa2lsbClcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJyxhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmlzaFNlcnZpY2UoKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9KTtcbiAgfVxuICBcbiAgYXN5bmMgZmluaXNoU2VydmljZSAoKXtcbiAgICBjb25zb2xlLmxvZyhcIlNlcnZpY2U6IFwiK3RoaXMubmFtZStcIiBmaW5pc2hlZCAtLSBub3QgaW1wbGVtZW50ZWQgLS1cIik7XG4gIH1cblxuICBnZXROYW1lKCk6c3RyaW5ne1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICBhcHBsaWNhdGlvblJlYWR5ICgpOiB2b2lkIHsgfVxufVxuIl19
|
@@ -1,11 +1,61 @@
|
|
1
1
|
import { Req } from "badmfck-signal";
|
2
2
|
import { BaseService } from "./BaseService";
|
3
|
-
|
3
|
+
import { IDBAdapter } from "./db/IDBAdapter";
|
4
|
+
export interface IDBQueryField extends Record<string, string | number | boolean | null | undefined | {
|
5
|
+
name?: string | null;
|
6
|
+
value: string | number | boolean | null | undefined;
|
7
|
+
system?: boolean;
|
8
|
+
ignoreInInsert?: boolean;
|
9
|
+
ignoreInUpdate?: boolean;
|
10
|
+
useInReplace?: boolean;
|
11
|
+
__parsedValue?: string | number | boolean | null | undefined;
|
12
|
+
}> {
|
4
13
|
}
|
5
|
-
export interface
|
14
|
+
export interface IDBQuery {
|
15
|
+
dbid?: string;
|
16
|
+
query: string;
|
17
|
+
fields?: IDBQueryField;
|
18
|
+
throwable?: boolean;
|
19
|
+
transactionID?: number;
|
20
|
+
calculateCount?: boolean;
|
6
21
|
}
|
7
|
-
export
|
8
|
-
|
22
|
+
export interface IDBError {
|
23
|
+
code: string;
|
24
|
+
errno: number;
|
25
|
+
fatal: boolean;
|
26
|
+
sql: string;
|
27
|
+
name: string;
|
28
|
+
message: string;
|
29
|
+
}
|
30
|
+
export interface IDBResult {
|
31
|
+
data?: any | null;
|
32
|
+
error?: IDBError | null;
|
33
|
+
}
|
34
|
+
export interface IDBSericeOptions {
|
9
35
|
id: string;
|
10
|
-
|
36
|
+
type: "mysql" | "postgres";
|
37
|
+
connection: DBAdapterOptions;
|
38
|
+
}
|
39
|
+
export interface DBAdapterOptions {
|
40
|
+
connectionLimit: number;
|
41
|
+
host: string;
|
42
|
+
user: string;
|
43
|
+
password: string;
|
44
|
+
port: number;
|
45
|
+
database: string;
|
46
|
+
queueLimit?: number;
|
47
|
+
transactionFailReport?: (trx: any, message: string) => void;
|
48
|
+
transactionFailReportDir?: string;
|
49
|
+
naxTransactionWaitTime?: number;
|
50
|
+
debug?: boolean;
|
51
|
+
}
|
52
|
+
export declare const REQ_DB: Req<IDBQuery, IDBResult>;
|
53
|
+
export declare class DBService extends BaseService {
|
54
|
+
static allInstances: DBService[];
|
55
|
+
options: IDBSericeOptions;
|
56
|
+
adapter: IDBAdapter | null;
|
57
|
+
constructor(options: IDBSericeOptions);
|
58
|
+
init(): Promise<void>;
|
59
|
+
finishService(): Promise<void>;
|
60
|
+
createMysqlDatabase(): Promise<void>;
|
11
61
|
}
|
@@ -1,15 +1,57 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.DBService = exports.
|
3
|
+
exports.DBService = exports.REQ_DB = void 0;
|
4
4
|
const badmfck_signal_1 = require("badmfck-signal");
|
5
5
|
const BaseService_1 = require("./BaseService");
|
6
|
-
|
6
|
+
const MysqlAdapter_1 = require("./db/MysqlAdapter");
|
7
|
+
exports.REQ_DB = new badmfck_signal_1.Req(undefined, "DB_SELECT");
|
7
8
|
class DBService extends BaseService_1.BaseService {
|
8
|
-
|
9
|
-
|
9
|
+
static allInstances = [];
|
10
|
+
options;
|
11
|
+
adapter = null;
|
12
|
+
constructor(options) {
|
10
13
|
super("DB Service");
|
11
|
-
this.
|
14
|
+
this.options = options;
|
15
|
+
if (DBService.allInstances.length > 0) {
|
16
|
+
for (let i of DBService.allInstances) {
|
17
|
+
if (i.options.id === options.id)
|
18
|
+
throw { code: -1, message: "DBService duplicate id: " + options.id };
|
19
|
+
}
|
20
|
+
}
|
21
|
+
DBService.allInstances.push(this);
|
22
|
+
}
|
23
|
+
async init() {
|
24
|
+
super.init();
|
25
|
+
if (this.options.type === "mysql") {
|
26
|
+
await this.createMysqlDatabase();
|
27
|
+
}
|
28
|
+
exports.REQ_DB.listener = async (req) => {
|
29
|
+
if (!req.dbid && DBService.allInstances.length === 1 && DBService.allInstances[0].adapter)
|
30
|
+
return DBService.allInstances[0].adapter.query(req);
|
31
|
+
for (let i of DBService.allInstances) {
|
32
|
+
if (i.options.id === req.dbid && i.adapter)
|
33
|
+
return i.adapter.query(req);
|
34
|
+
}
|
35
|
+
const error = {
|
36
|
+
code: "DB_NOT_FOUND",
|
37
|
+
errno: -1,
|
38
|
+
fatal: true,
|
39
|
+
sql: "",
|
40
|
+
name: "DB_NOT_FOUND",
|
41
|
+
message: "DB not found: " + req.dbid
|
42
|
+
};
|
43
|
+
if (req.throwable)
|
44
|
+
throw error;
|
45
|
+
return { error: error };
|
46
|
+
};
|
47
|
+
}
|
48
|
+
async finishService() {
|
49
|
+
await this.adapter?.finish();
|
50
|
+
}
|
51
|
+
async createMysqlDatabase() {
|
52
|
+
this.adapter = new MysqlAdapter_1.MysqlAdapter(this.options.connection);
|
53
|
+
await this.adapter.init();
|
12
54
|
}
|
13
55
|
}
|
14
56
|
exports.DBService = DBService;
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiREJTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaVNlcnZlci9EQlNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQXFDO0FBQ3JDLCtDQUE0QztBQUc1QyxvREFBaUQ7QUEwRHBDLFFBQUEsTUFBTSxHQUFDLElBQUksb0JBQUcsQ0FBcUIsU0FBUyxFQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRXZFLE1BQWEsU0FBVSxTQUFRLHlCQUFXO0lBRXRDLE1BQU0sQ0FBQyxZQUFZLEdBQWUsRUFBRSxDQUFDO0lBRXJDLE9BQU8sQ0FBa0I7SUFDekIsT0FBTyxHQUFtQixJQUFJLENBQUM7SUFDL0IsWUFBWSxPQUF3QjtRQUNoQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBQyxPQUFPLENBQUM7UUFDckIsSUFBRyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUM7WUFDL0IsS0FBSSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFDO2dCQUNoQyxJQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxFQUFFO29CQUMxQixNQUFNLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQywwQkFBMEIsR0FBQyxPQUFPLENBQUMsRUFBRSxFQUFDLENBQUE7YUFDcEU7U0FDSjtRQUNELFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNOLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNiLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUcsT0FBTyxFQUFDO1lBQzNCLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7U0FDbkM7UUFFRCxjQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUMsRUFBRTtZQUUzQixJQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUNsRixPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUd4RCxLQUFJLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUM7Z0JBQ2hDLElBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTztvQkFDckMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNuQztZQUVELE1BQU0sS0FBSyxHQUFHO2dCQUNWLElBQUksRUFBQyxjQUFjO2dCQUNuQixLQUFLLEVBQUMsQ0FBQyxDQUFDO2dCQUNSLEtBQUssRUFBQyxJQUFJO2dCQUNWLEdBQUcsRUFBQyxFQUFFO2dCQUNOLElBQUksRUFBQyxjQUFjO2dCQUNuQixPQUFPLEVBQUMsZ0JBQWdCLEdBQUMsR0FBRyxDQUFDLElBQUk7YUFDcEMsQ0FBQTtZQUVELElBQUcsR0FBRyxDQUFDLFNBQVM7Z0JBQ1osTUFBTSxLQUFLLENBQUM7WUFDaEIsT0FBTyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsQ0FBQztRQUN6QixDQUFDLENBQUE7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWE7UUFDZixNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUI7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLDJCQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDN0IsQ0FBQzs7QUF6REwsOEJBNERDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBSZXEgfSBmcm9tIFwiYmFkbWZjay1zaWduYWxcIjtcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSBcIi4vQmFzZVNlcnZpY2VcIjtcbmltcG9ydCB7IG9mZiB9IGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyBJREJBZGFwdGVyIH0gZnJvbSBcIi4vZGIvSURCQWRhcHRlclwiO1xuaW1wb3J0IHsgTXlzcWxBZGFwdGVyIH0gZnJvbSBcIi4vZGIvTXlzcWxBZGFwdGVyXCI7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJREJRdWVyeUZpZWxkIGV4dGVuZHMgUmVjb3JkPHN0cmluZyxzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbHx1bmRlZmluZWR8e1xuICAgIG5hbWU/OnN0cmluZ3xudWxsLFxuICAgIHZhbHVlOnN0cmluZ3xudW1iZXJ8Ym9vbGVhbnxudWxsfHVuZGVmaW5lZCxcbiAgICBzeXN0ZW0/OmJvb2xlYW4sXG4gICAgaWdub3JlSW5JbnNlcnQ/OmJvb2xlYW4sXG4gICAgaWdub3JlSW5VcGRhdGU/OmJvb2xlYW4sXG4gICAgdXNlSW5SZXBsYWNlPzpib29sZWFuXG5cbiAgICBfX3BhcnNlZFZhbHVlPzpzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbHx1bmRlZmluZWRcbn0+e31cblxuZXhwb3J0IGludGVyZmFjZSBJREJRdWVyeXtcbiAgICBkYmlkPzpzdHJpbmcsXG4gICAgcXVlcnk6c3RyaW5nLFxuICAgIGZpZWxkcz86SURCUXVlcnlGaWVsZFxuICAgIHRocm93YWJsZT86Ym9vbGVhblxuICAgIHRyYW5zYWN0aW9uSUQ/Om51bWJlclxuICAgIGNhbGN1bGF0ZUNvdW50Pzpib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURCRXJyb3J7XG4gICAgY29kZTogc3RyaW5nLFxuICAgIGVycm5vOiBudW1iZXIsXG4gICAgZmF0YWw6IGJvb2xlYW4sXG4gICAgc3FsOiBzdHJpbmcsXG4gICAgbmFtZTpzdHJpbmcsXG4gICAgbWVzc2FnZTpzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURCUmVzdWx0e1xuICAgIGRhdGE/OmFueXxudWxsLFxuICAgIGVycm9yPzpJREJFcnJvcnxudWxsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURCU2VyaWNlT3B0aW9uc3tcbiAgICBpZDpzdHJpbmcsXG4gICAgdHlwZTpcIm15c3FsXCJ8XCJwb3N0Z3Jlc1wiLFxuICAgIGNvbm5lY3Rpb246REJBZGFwdGVyT3B0aW9ucyBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEQkFkYXB0ZXJPcHRpb25ze1xuICAgIGNvbm5lY3Rpb25MaW1pdDpudW1iZXIsXG4gICAgaG9zdDpzdHJpbmcsXG4gICAgdXNlcjpzdHJpbmcsXG4gICAgcGFzc3dvcmQ6c3RyaW5nLFxuICAgIHBvcnQ6bnVtYmVyLFxuICAgIGRhdGFiYXNlOnN0cmluZywgIFxuICAgIHF1ZXVlTGltaXQ/Om51bWJlcixcbiAgICB0cmFuc2FjdGlvbkZhaWxSZXBvcnQ/Oih0cng6YW55LG1lc3NhZ2U6c3RyaW5nKT0+dm9pZCxcbiAgICB0cmFuc2FjdGlvbkZhaWxSZXBvcnREaXI/OnN0cmluZyxcbiAgICBuYXhUcmFuc2FjdGlvbldhaXRUaW1lPzpudW1iZXIsXG4gICAgZGVidWc/OmJvb2xlYW5cblxufVxuXG5leHBvcnQgY29uc3QgUkVRX0RCPW5ldyBSZXE8SURCUXVlcnksSURCUmVzdWx0Pih1bmRlZmluZWQsXCJEQl9TRUxFQ1RcIik7XG5cbmV4cG9ydCBjbGFzcyBEQlNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XG5cbiAgICBzdGF0aWMgYWxsSW5zdGFuY2VzOkRCU2VydmljZVtdID0gW107XG5cbiAgICBvcHRpb25zOklEQlNlcmljZU9wdGlvbnM7XG4gICAgYWRhcHRlcjpJREJBZGFwdGVyfG51bGwgPSBudWxsO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6SURCU2VyaWNlT3B0aW9ucykge1xuICAgICAgICBzdXBlcihcIkRCIFNlcnZpY2VcIik7XG4gICAgICAgIHRoaXMub3B0aW9ucz1vcHRpb25zO1xuICAgICAgICBpZihEQlNlcnZpY2UuYWxsSW5zdGFuY2VzLmxlbmd0aD4wKXtcbiAgICAgICAgICAgIGZvcihsZXQgaSBvZiBEQlNlcnZpY2UuYWxsSW5zdGFuY2VzKXtcbiAgICAgICAgICAgICAgICBpZihpLm9wdGlvbnMuaWQgPT09IG9wdGlvbnMuaWQpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHtjb2RlOi0xLG1lc3NhZ2U6XCJEQlNlcnZpY2UgZHVwbGljYXRlIGlkOiBcIitvcHRpb25zLmlkfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIERCU2VydmljZS5hbGxJbnN0YW5jZXMucHVzaCh0aGlzKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCl7XG4gICAgICAgIHN1cGVyLmluaXQoKTtcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnR5cGU9PT1cIm15c3FsXCIpe1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVNeXNxbERhdGFiYXNlKClcbiAgICAgICAgfVxuXG4gICAgICAgIFJFUV9EQi5saXN0ZW5lciA9IGFzeW5jIChyZXEpPT57XG4gICAgICAgICAgICAvLyBvbmx5IG9uZSBkYiBpbnN0YW5jZVxuICAgICAgICAgICAgaWYoIXJlcS5kYmlkICYmIERCU2VydmljZS5hbGxJbnN0YW5jZXMubGVuZ3RoPT09MSAmJiBEQlNlcnZpY2UuYWxsSW5zdGFuY2VzWzBdLmFkYXB0ZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIERCU2VydmljZS5hbGxJbnN0YW5jZXNbMF0uYWRhcHRlci5xdWVyeShyZXEpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBtdWx0aXBsZSBkYiBpbnN0YW5jZXNcbiAgICAgICAgICAgIGZvcihsZXQgaSBvZiBEQlNlcnZpY2UuYWxsSW5zdGFuY2VzKXtcbiAgICAgICAgICAgICAgICBpZihpLm9wdGlvbnMuaWQgPT09IHJlcS5kYmlkICYmIGkuYWRhcHRlcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYWRhcHRlci5xdWVyeShyZXEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHtcbiAgICAgICAgICAgICAgICBjb2RlOlwiREJfTk9UX0ZPVU5EXCIsXG4gICAgICAgICAgICAgICAgZXJybm86LTEsXG4gICAgICAgICAgICAgICAgZmF0YWw6dHJ1ZSxcbiAgICAgICAgICAgICAgICBzcWw6XCJcIixcbiAgICAgICAgICAgICAgICBuYW1lOlwiREJfTk9UX0ZPVU5EXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcIkRCIG5vdCBmb3VuZDogXCIrcmVxLmRiaWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYocmVxLnRocm93YWJsZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIHJldHVybiB7ZXJyb3I6ZXJyb3J9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmluaXNoU2VydmljZSgpe1xuICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXI/LmZpbmlzaCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZU15c3FsRGF0YWJhc2UoKXtcbiAgICAgICAgdGhpcy5hZGFwdGVyID0gbmV3IE15c3FsQWRhcHRlcih0aGlzLm9wdGlvbnMuY29ubmVjdGlvbilcbiAgICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLmluaXQoKVxuICAgIH1cblxuXG59Il19
|
@@ -0,0 +1,3 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSURCQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGlTZXJ2ZXIvZGIvSURCQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURCUXVlcnksIElEQlJlc3VsdCB9IGZyb20gXCIuLi9EQlNlcnZpY2VcIlxuXG5cblxuXG5leHBvcnQgaW50ZXJmYWNlIElEQkFkYXB0ZXJ7XG4gICAgaW5pdCgpOlByb21pc2U8dm9pZD5cbiAgICBmaW5pc2goKTpQcm9taXNlPHZvaWQ+XG4gICAgcHJlcGFyZVF1ZXJ5KHJlcXVlc3Q6SURCUXVlcnkpOnN0cmluZ1xuICAgIHF1ZXJ5KHJlcXVlc3Q6SURCUXVlcnkpOlByb21pc2U8SURCUmVzdWx0PlxufSJdfQ==
|
@@ -0,0 +1,45 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import { DBAdapterOptions, IDBError, IDBQuery, IDBQueryField, IDBResult } from "../DBService";
|
3
|
+
import { IDBAdapter } from "./IDBAdapter";
|
4
|
+
import mysql from 'mysql2/promise';
|
5
|
+
import fs from 'fs';
|
6
|
+
interface ITransaction {
|
7
|
+
id: number;
|
8
|
+
timestamp: number;
|
9
|
+
conn: mysql.PoolConnection;
|
10
|
+
queries: {
|
11
|
+
sql: string;
|
12
|
+
status: string;
|
13
|
+
}[];
|
14
|
+
}
|
15
|
+
export declare class MysqlAdapter implements IDBAdapter {
|
16
|
+
options: DBAdapterOptions;
|
17
|
+
serviceStarted: boolean;
|
18
|
+
reconnectionTimeout: number;
|
19
|
+
reconnecting: boolean;
|
20
|
+
pool: mysql.Pool | null;
|
21
|
+
timeoutID: any;
|
22
|
+
queries: never[];
|
23
|
+
static nextTransactionID: number;
|
24
|
+
transactions: ITransaction[];
|
25
|
+
maxTransactionWaitTime: number;
|
26
|
+
lastSuccessQueryTime: number;
|
27
|
+
pingInterval: number;
|
28
|
+
failReportFileStream: fs.WriteStream | null;
|
29
|
+
failReportFileStreamName: string | null;
|
30
|
+
failReportLastAccessTime: number;
|
31
|
+
constructor(options: DBAdapterOptions);
|
32
|
+
init(): Promise<void>;
|
33
|
+
setupTimers(): void;
|
34
|
+
recreatePool(): Promise<boolean>;
|
35
|
+
query(request: IDBQuery): Promise<IDBResult>;
|
36
|
+
prepareQuery(request: IDBQuery): string;
|
37
|
+
static prepareQueryFieldValue(field: IDBQueryField): string | number | boolean | null | undefined;
|
38
|
+
prepareCountQuery(query: string): string;
|
39
|
+
commit(trx: ITransaction): Promise<IDBError | null>;
|
40
|
+
rollbackTransaction(trx: ITransaction, donNotRemove?: boolean): Promise<IDBError | null>;
|
41
|
+
finish(): Promise<void>;
|
42
|
+
createMysqlQueryError(err: any, throwable?: boolean): IDBError;
|
43
|
+
storeTransactionAsProblem(trx: ITransaction, message: string): Promise<void>;
|
44
|
+
}
|
45
|
+
export {};
|
@@ -0,0 +1,433 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.MysqlAdapter = void 0;
|
7
|
+
const promise_1 = __importDefault(require("mysql2/promise"));
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
9
|
+
const LogService_1 = require("../LogService");
|
10
|
+
const DefaultErrors_1 = __importDefault(require("../structures/DefaultErrors"));
|
11
|
+
const path_1 = __importDefault(require("path"));
|
12
|
+
class MysqlAdapter {
|
13
|
+
options;
|
14
|
+
serviceStarted = false;
|
15
|
+
reconnectionTimeout = 1000 * 3;
|
16
|
+
reconnecting = false;
|
17
|
+
pool = null;
|
18
|
+
timeoutID;
|
19
|
+
queries = [];
|
20
|
+
static nextTransactionID = 1;
|
21
|
+
transactions = [];
|
22
|
+
maxTransactionWaitTime = 1000 * 60 * 1;
|
23
|
+
lastSuccessQueryTime = 0;
|
24
|
+
pingInterval = 1000 * 60 * 2;
|
25
|
+
failReportFileStream = null;
|
26
|
+
failReportFileStreamName = null;
|
27
|
+
failReportLastAccessTime = 0;
|
28
|
+
constructor(options) {
|
29
|
+
this.options = options;
|
30
|
+
}
|
31
|
+
async init() {
|
32
|
+
if (this.options.transactionFailReportDir) {
|
33
|
+
try {
|
34
|
+
if (!fs_1.default.existsSync(this.options.transactionFailReportDir))
|
35
|
+
fs_1.default.mkdirSync(this.options.transactionFailReportDir);
|
36
|
+
}
|
37
|
+
catch (e) {
|
38
|
+
this.options.transactionFailReportDir = undefined;
|
39
|
+
(0, LogService_1.logCrit)("${MysqlService.js}", "Can't create transaction fail report dir");
|
40
|
+
}
|
41
|
+
}
|
42
|
+
this.serviceStarted = false;
|
43
|
+
let poolCreated = false;
|
44
|
+
while (!poolCreated) {
|
45
|
+
poolCreated = await this.recreatePool();
|
46
|
+
if (!poolCreated) {
|
47
|
+
(0, LogService_1.logCrit)("${MysqlService.js}", "Can't connect to MYSQL! Retrying in 3 seconds...");
|
48
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
49
|
+
}
|
50
|
+
}
|
51
|
+
this.setupTimers();
|
52
|
+
}
|
53
|
+
setupTimers() {
|
54
|
+
setInterval(() => {
|
55
|
+
const now = Date.now();
|
56
|
+
const count = this.transactions.length;
|
57
|
+
const removedIDs = [];
|
58
|
+
for (let i of this.transactions) {
|
59
|
+
if (now - i.timestamp > this.maxTransactionWaitTime) {
|
60
|
+
(0, LogService_1.logError)("Release transaction connection due to timeout");
|
61
|
+
this.rollbackTransaction(i, true);
|
62
|
+
removedIDs.push(i.id);
|
63
|
+
}
|
64
|
+
}
|
65
|
+
this.transactions = this.transactions.filter(i => !removedIDs.includes(i.id));
|
66
|
+
if (this.options.debug && count - this.transactions.length > 0)
|
67
|
+
console.log("Removed: ", count - this.transactions.length);
|
68
|
+
if (Date.now() - this.lastSuccessQueryTime > this.pingInterval) {
|
69
|
+
if (!this.pool)
|
70
|
+
return;
|
71
|
+
for (let i = 0; i < this.options.connectionLimit; i++) {
|
72
|
+
this.query({ query: "SELECT 1 @NOLIMIT" });
|
73
|
+
if (this.options.debug)
|
74
|
+
console.log("Ping mysql on each connection in pool");
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}, 1000 * 30);
|
78
|
+
setInterval(() => {
|
79
|
+
if (!this.failReportFileStream)
|
80
|
+
return;
|
81
|
+
if (Date.now() - this.failReportLastAccessTime > 1000 * 60 * 15) {
|
82
|
+
this.failReportFileStream.end();
|
83
|
+
this.failReportFileStream = null;
|
84
|
+
}
|
85
|
+
}, 1000 * 60 * 5);
|
86
|
+
}
|
87
|
+
async recreatePool() {
|
88
|
+
(0, LogService_1.logInfo)("${MysqlAdapter.js}", "Connecting to mysql: \n " + JSON.stringify({ ...this.options, password: "****" }));
|
89
|
+
if (this.pool) {
|
90
|
+
this.pool.removeAllListeners();
|
91
|
+
try {
|
92
|
+
await this.pool.end();
|
93
|
+
}
|
94
|
+
catch (e) {
|
95
|
+
(0, LogService_1.logCrit)("${MysqlService.js}", "Can't close MYSQL pool!");
|
96
|
+
}
|
97
|
+
this.pool = null;
|
98
|
+
}
|
99
|
+
try {
|
100
|
+
this.pool = promise_1.default.createPool({
|
101
|
+
host: this.options.host,
|
102
|
+
user: this.options.user,
|
103
|
+
password: this.options.password,
|
104
|
+
database: this.options.database,
|
105
|
+
port: this.options.port,
|
106
|
+
connectionLimit: this.options.connectionLimit,
|
107
|
+
queueLimit: 10,
|
108
|
+
multipleStatements: true,
|
109
|
+
enableKeepAlive: true,
|
110
|
+
keepAliveInitialDelay: 3 * 1000,
|
111
|
+
idleTimeout: 1000 * 60 * 5
|
112
|
+
});
|
113
|
+
}
|
114
|
+
catch (e) {
|
115
|
+
(0, LogService_1.logCrit)("${MysqlService.js}", "Can't connect to MYSQL! " + e);
|
116
|
+
return false;
|
117
|
+
}
|
118
|
+
this.pool?.on('connection', (connection) => {
|
119
|
+
if (this.options.debug)
|
120
|
+
(0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION CREATED");
|
121
|
+
});
|
122
|
+
this.pool?.on('acquire', (connection) => {
|
123
|
+
if (this.options.debug)
|
124
|
+
(0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION ACQUIRED");
|
125
|
+
});
|
126
|
+
this.pool?.on('release', (connection) => {
|
127
|
+
if (this.options.debug)
|
128
|
+
(0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION RELEASED");
|
129
|
+
});
|
130
|
+
this.pool?.on('enqueue', () => {
|
131
|
+
if (this.options.debug)
|
132
|
+
(0, LogService_1.logInfo)("${MysqlService.js}", "MYSQL CONNECTION ENQUEUED");
|
133
|
+
});
|
134
|
+
if (this.options.debug)
|
135
|
+
console.log("Check mysql connection");
|
136
|
+
return new Promise(async (resolve, _) => {
|
137
|
+
try {
|
138
|
+
const conn = await this.pool?.getConnection();
|
139
|
+
if (conn) {
|
140
|
+
await conn.query("SELECT 1");
|
141
|
+
conn?.release();
|
142
|
+
(0, LogService_1.logInfo)("${MysqlService.js}", "Connected to MYSQL!");
|
143
|
+
resolve(true);
|
144
|
+
}
|
145
|
+
else
|
146
|
+
resolve(false);
|
147
|
+
}
|
148
|
+
catch (e) {
|
149
|
+
(0, LogService_1.logCrit)("${MysqlService.js}", "Can't connect to MYSQL!");
|
150
|
+
resolve(false);
|
151
|
+
}
|
152
|
+
});
|
153
|
+
}
|
154
|
+
async query(request) {
|
155
|
+
const query = this.prepareQuery(request);
|
156
|
+
if (!this.pool) {
|
157
|
+
(0, LogService_1.logError)("${MysqlAdapter.js}", "No pool");
|
158
|
+
const error = {
|
159
|
+
code: "NO_POOL",
|
160
|
+
errno: 100000,
|
161
|
+
fatal: true,
|
162
|
+
sql: query,
|
163
|
+
name: "NO_POOL",
|
164
|
+
message: "Mysql pool not created",
|
165
|
+
};
|
166
|
+
if (request.throwable)
|
167
|
+
throw { ...DefaultErrors_1.default.DB_ERROR, details: error.message, stack: error };
|
168
|
+
return {
|
169
|
+
data: null,
|
170
|
+
error: error,
|
171
|
+
};
|
172
|
+
}
|
173
|
+
try {
|
174
|
+
let conn = null;
|
175
|
+
if (request.transactionID && request.transactionID > 0) {
|
176
|
+
conn = this.transactions.find(i => i.id === request.transactionID)?.conn ?? null;
|
177
|
+
if (this.options.debug)
|
178
|
+
console.log("Execute query on transaction: ", conn?.threadId);
|
179
|
+
}
|
180
|
+
else
|
181
|
+
conn = await this.pool.getConnection();
|
182
|
+
if (this.options.debug)
|
183
|
+
console.log("Execute query", conn?.threadId);
|
184
|
+
if (!conn) {
|
185
|
+
(0, LogService_1.logCrit)("${MysqlAdapter.js}", `No connection created!`);
|
186
|
+
const error = {
|
187
|
+
code: "NO_CONN",
|
188
|
+
errno: 100001,
|
189
|
+
fatal: true,
|
190
|
+
sql: query,
|
191
|
+
name: "NO_CONN",
|
192
|
+
message: "Mysql pool cant get connection",
|
193
|
+
};
|
194
|
+
if (request.throwable)
|
195
|
+
throw { ...DefaultErrors_1.default.DB_ERROR, details: error.message, stack: error };
|
196
|
+
return {
|
197
|
+
data: null,
|
198
|
+
error: error,
|
199
|
+
};
|
200
|
+
}
|
201
|
+
try {
|
202
|
+
const result = await conn.query(query);
|
203
|
+
return {
|
204
|
+
data: result[0],
|
205
|
+
error: null
|
206
|
+
};
|
207
|
+
}
|
208
|
+
catch (e) {
|
209
|
+
const error = this.createMysqlQueryError(e);
|
210
|
+
if (request.throwable)
|
211
|
+
throw { ...DefaultErrors_1.default.DB_ERROR, details: error.message, stack: error };
|
212
|
+
return {
|
213
|
+
data: null,
|
214
|
+
error: this.createMysqlQueryError(e),
|
215
|
+
};
|
216
|
+
}
|
217
|
+
}
|
218
|
+
catch (e) {
|
219
|
+
(0, LogService_1.logCrit)("${MysqlAdapter.js}", `Error when executing query: ${e}`);
|
220
|
+
const error = {
|
221
|
+
code: "EXEC_ERROR",
|
222
|
+
errno: 100002,
|
223
|
+
fatal: true,
|
224
|
+
sql: query,
|
225
|
+
name: "EXECUTION_ERROR",
|
226
|
+
message: e + "",
|
227
|
+
};
|
228
|
+
if (request.throwable)
|
229
|
+
throw { ...DefaultErrors_1.default.DB_ERROR, details: error.message, stack: error };
|
230
|
+
return {
|
231
|
+
data: null,
|
232
|
+
error: error,
|
233
|
+
};
|
234
|
+
}
|
235
|
+
}
|
236
|
+
prepareQuery(request) {
|
237
|
+
let query = request.query;
|
238
|
+
let fields = request.fields;
|
239
|
+
if (fields) {
|
240
|
+
for (let i in fields) {
|
241
|
+
const name = i;
|
242
|
+
const value = fields[i];
|
243
|
+
if (typeof value === "string")
|
244
|
+
fields[i] = { value: value, system: false };
|
245
|
+
if (value === undefined)
|
246
|
+
continue;
|
247
|
+
if (value === null)
|
248
|
+
fields[i] = { value: null, system: true };
|
249
|
+
const parsed = MysqlAdapter.prepareQueryFieldValue(value);
|
250
|
+
query = query.replaceAll("@" + name, parsed + "");
|
251
|
+
}
|
252
|
+
}
|
253
|
+
const tmp = query.toLowerCase();
|
254
|
+
if (tmp.indexOf("select") === 0 && tmp.indexOf("limit") === -1)
|
255
|
+
query += " LIMIT 100";
|
256
|
+
query = query.replaceAll("@NOLIMIT", "");
|
257
|
+
if (query.indexOf("@fields") !== -1) {
|
258
|
+
let insertFieldNames = [];
|
259
|
+
let insertFieldValues = [];
|
260
|
+
for (let i in fields) {
|
261
|
+
let f = fields[i];
|
262
|
+
if (f.ignoreInInsert)
|
263
|
+
continue;
|
264
|
+
if (!f.name)
|
265
|
+
continue;
|
266
|
+
insertFieldNames.push('`' + (f.name + "").replaceAll("`", '').replaceAll('\"', "").replaceAll('\'', "") + '`');
|
267
|
+
insertFieldValues.push(f._parsedValue);
|
268
|
+
}
|
269
|
+
query = query
|
270
|
+
.replaceAll('@fields', insertFieldNames.join(","))
|
271
|
+
.replaceAll('@values', insertFieldValues.join(","));
|
272
|
+
}
|
273
|
+
if (query.indexOf("@insert") !== -1) {
|
274
|
+
let oninsertNames = [];
|
275
|
+
let oninsertValues = [];
|
276
|
+
for (let i in fields) {
|
277
|
+
let f = fields[i];
|
278
|
+
if (f.ignoreInInsert)
|
279
|
+
continue;
|
280
|
+
oninsertNames.push((f.name + "").replaceAll("`", '').replaceAll('\"', "").replaceAll('\'', ""));
|
281
|
+
oninsertValues.push(f._parsedValue);
|
282
|
+
}
|
283
|
+
query = query.replaceAll("@insert", `(${oninsertNames.join(",")}) VALUES (${oninsertValues.join(",")})`);
|
284
|
+
}
|
285
|
+
if (query.indexOf("@onupdate") !== -1) {
|
286
|
+
let onUpdate = [];
|
287
|
+
for (let i in fields) {
|
288
|
+
let f = fields[i];
|
289
|
+
if (f.ignoreInUpdate)
|
290
|
+
continue;
|
291
|
+
onUpdate.push('`' + (f.name + "").replaceAll("`", '').replaceAll('\"', "").replaceAll('\'', "") + '` = ' + f._parsedValue);
|
292
|
+
}
|
293
|
+
query = query.replaceAll("@onupdate", onUpdate.join(" , "));
|
294
|
+
}
|
295
|
+
if (query.indexOf('@onduplicate') !== -1) {
|
296
|
+
let onDuplicate = [];
|
297
|
+
for (let i in fields) {
|
298
|
+
let f = fields[i];
|
299
|
+
if (!f.useInReplace)
|
300
|
+
continue;
|
301
|
+
onDuplicate.push('`' + (f.name + "").replaceAll("`", '').replaceAll('\"', "").replaceAll('\'', "") + '` = ' + f._parsedValue);
|
302
|
+
}
|
303
|
+
query = query.replaceAll("@onduplicate", onDuplicate.join(" , "));
|
304
|
+
}
|
305
|
+
return query;
|
306
|
+
}
|
307
|
+
static prepareQueryFieldValue(field) {
|
308
|
+
let value = field.value;
|
309
|
+
let system = field.system;
|
310
|
+
if (value === null || value === undefined)
|
311
|
+
return "NULL";
|
312
|
+
if (!system && typeof value === "string")
|
313
|
+
value = value.replaceAll('"', '\\"');
|
314
|
+
field.__parsedValue = value;
|
315
|
+
return value;
|
316
|
+
}
|
317
|
+
prepareCountQuery(query) {
|
318
|
+
let countQuery = query;
|
319
|
+
if (countQuery.indexOf("LIMIT") === -1)
|
320
|
+
countQuery = countQuery.substring(0, countQuery.indexOf("LIMIT"));
|
321
|
+
if (countQuery.indexOf("ORDER") !== -1)
|
322
|
+
countQuery = countQuery.substring(0, countQuery.indexOf("ORDER"));
|
323
|
+
countQuery = countQuery.substring(countQuery.indexOf("FROM"));
|
324
|
+
countQuery = "SELECT COUNT(1) as `count` " + countQuery;
|
325
|
+
return countQuery;
|
326
|
+
}
|
327
|
+
async commit(trx) {
|
328
|
+
try {
|
329
|
+
await trx.conn.commit();
|
330
|
+
trx.conn.removeAllListeners();
|
331
|
+
trx.conn.release();
|
332
|
+
}
|
333
|
+
catch (e) {
|
334
|
+
await this.rollbackTransaction(trx);
|
335
|
+
return this.createMysqlQueryError(e);
|
336
|
+
}
|
337
|
+
return null;
|
338
|
+
}
|
339
|
+
async rollbackTransaction(trx, donNotRemove) {
|
340
|
+
let err = null;
|
341
|
+
try {
|
342
|
+
console.log("Rollback started", trx.conn.threadId);
|
343
|
+
await trx.conn.rollback();
|
344
|
+
await trx.conn.commit();
|
345
|
+
trx.conn.removeAllListeners();
|
346
|
+
trx.conn.release();
|
347
|
+
if (!donNotRemove)
|
348
|
+
this.transactions = this.transactions.filter(i => i.id !== trx.id);
|
349
|
+
if (this.options.debug)
|
350
|
+
console.log("Rollback complete", trx.conn.threadId);
|
351
|
+
}
|
352
|
+
catch (e) {
|
353
|
+
(0, LogService_1.logCrit)("${MysqlService.js}", "Can't rollback transaction", trx.queries);
|
354
|
+
err = this.createMysqlQueryError(e);
|
355
|
+
}
|
356
|
+
this.storeTransactionAsProblem(trx, "rollback");
|
357
|
+
return err;
|
358
|
+
}
|
359
|
+
async finish() {
|
360
|
+
console.log("Finishing mysql service");
|
361
|
+
for (let i of this.transactions)
|
362
|
+
this.rollbackTransaction(i);
|
363
|
+
if (this.pool) {
|
364
|
+
try {
|
365
|
+
await this.pool.end();
|
366
|
+
}
|
367
|
+
catch (e) {
|
368
|
+
(0, LogService_1.logCrit)("${MysqlService.js}", "Can't close MYSQL pool!");
|
369
|
+
}
|
370
|
+
}
|
371
|
+
if (this.failReportFileStream)
|
372
|
+
this.failReportFileStream.end();
|
373
|
+
this.failReportFileStream = null;
|
374
|
+
}
|
375
|
+
createMysqlQueryError(err, throwable) {
|
376
|
+
if (err && typeof err === "object" && "code" in err && "errno" in err && "sql" in err && "name" in err && "message" in err) {
|
377
|
+
return {
|
378
|
+
code: err.code,
|
379
|
+
errno: err.errno,
|
380
|
+
sql: err.sql,
|
381
|
+
name: err.name,
|
382
|
+
message: err.message,
|
383
|
+
fatal: false
|
384
|
+
};
|
385
|
+
}
|
386
|
+
else {
|
387
|
+
return {
|
388
|
+
code: "QUERY_ERR",
|
389
|
+
errno: 100002,
|
390
|
+
fatal: true,
|
391
|
+
sql: "no query",
|
392
|
+
name: "QUERY_ERR",
|
393
|
+
message: "Error: " + (err) ? err : "",
|
394
|
+
};
|
395
|
+
}
|
396
|
+
}
|
397
|
+
async storeTransactionAsProblem(trx, message) {
|
398
|
+
if (!this.options.transactionFailReport && !this.options.transactionFailReportDir) {
|
399
|
+
(0, LogService_1.logCrit)("${MysqlService.js}", "Can't report failed transaction, no report function: transactionFailReport in options, and transactionFailReportDir isnt set");
|
400
|
+
return;
|
401
|
+
}
|
402
|
+
if (this.options.transactionFailReportDir) {
|
403
|
+
const yyymmdd = new Date().toISOString().substring(0, 10).replaceAll("-", "");
|
404
|
+
const date = new Date();
|
405
|
+
const file = path_1.default.resolve(this.options.transactionFailReportDir, yyymmdd + ".json");
|
406
|
+
if (this.failReportFileStream) {
|
407
|
+
if (this.failReportFileStreamName !== file) {
|
408
|
+
this.failReportFileStream.end();
|
409
|
+
this.failReportFileStream = null;
|
410
|
+
}
|
411
|
+
}
|
412
|
+
if (this.failReportFileStreamName) {
|
413
|
+
this.failReportFileStream = fs_1.default.createWriteStream(file, { flags: 'a' });
|
414
|
+
this.failReportFileStreamName = file;
|
415
|
+
}
|
416
|
+
if (this.options.debug)
|
417
|
+
console.log("Store transaction fail report: ", file, trx.queries, message);
|
418
|
+
if (!this.failReportFileStream)
|
419
|
+
this.failReportFileStream = fs_1.default.createWriteStream(file, { flags: 'a' });
|
420
|
+
this.failReportFileStream.write(JSON.stringify({ queries: trx.queries, time: trx.timestamp, date, message }) + "\n}EOB{\n", err => {
|
421
|
+
if (err)
|
422
|
+
(0, LogService_1.logCrit)("${MysqlService.js}", "Can't write to transaction fail report file");
|
423
|
+
else
|
424
|
+
(0, LogService_1.logInfo)("${MysqlService.js}", "Transaction fail report stored");
|
425
|
+
});
|
426
|
+
this.failReportLastAccessTime = Date.now();
|
427
|
+
}
|
428
|
+
if (this.options.transactionFailReport)
|
429
|
+
this.options.transactionFailReport(trx, message);
|
430
|
+
}
|
431
|
+
}
|
432
|
+
exports.MysqlAdapter = MysqlAdapter;
|
433
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXlzcWxBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaVNlcnZlci9kYi9NeXNxbEFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsNkRBQW1DO0FBQ25DLDRDQUFvQjtBQUNwQiw4Q0FBMkQ7QUFDM0QsZ0ZBQXdEO0FBQ3hELGdEQUF3QjtBQVV4QixNQUFhLFlBQVk7SUFDckIsT0FBTyxDQUFrQjtJQUN6QixjQUFjLEdBQVMsS0FBSyxDQUFDO0lBRTdCLG1CQUFtQixHQUFDLElBQUksR0FBQyxDQUFDLENBQUM7SUFDM0IsWUFBWSxHQUFDLEtBQUssQ0FBQztJQUNuQixJQUFJLEdBQWlCLElBQUksQ0FBQztJQUMxQixTQUFTLENBQUk7SUFFYixPQUFPLEdBQUMsRUFBRSxDQUFDO0lBQ1gsTUFBTSxDQUFDLGlCQUFpQixHQUFDLENBQUMsQ0FBQztJQUMzQixZQUFZLEdBQWdCLEVBQUUsQ0FBQTtJQUU5QixzQkFBc0IsR0FBRyxJQUFJLEdBQUMsRUFBRSxHQUFDLENBQUMsQ0FBQztJQUNuQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDekIsWUFBWSxHQUFHLElBQUksR0FBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDO0lBRXpCLG9CQUFvQixHQUFxQixJQUFJLENBQUM7SUFDOUMsd0JBQXdCLEdBQWEsSUFBSSxDQUFDO0lBQzFDLHdCQUF3QixHQUFRLENBQUMsQ0FBQztJQUVsQyxZQUFZLE9BQXdCO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUMsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUdOLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBQztZQUNyQyxJQUFHO2dCQUNDLElBQUcsQ0FBQyxZQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUM7b0JBQ3BELFlBQUUsQ0FBQyxTQUFTLENBQUMsSUFB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QUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELENBQUM7O0FBaGhCVCxvQ0FpaEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREJBZGFwdGVyT3B0aW9ucywgSURCRXJyb3IsIElEQlF1ZXJ5LCBJREJRdWVyeUZpZWxkLCBJREJSZXN1bHQgfSBmcm9tIFwiLi4vREJTZXJ2aWNlXCI7XG5pbXBvcnQgeyBJREJBZGFwdGVyLCB9IGZyb20gXCIuL0lEQkFkYXB0ZXJcIjtcbmltcG9ydCBteXNxbCBmcm9tICdteXNxbDIvcHJvbWlzZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgbG9nSW5mbywgbG9nQ3JpdCwgbG9nRXJyb3IgfSBmcm9tIFwiLi4vTG9nU2VydmljZVwiO1xuaW1wb3J0IERlZmF1bHRFcnJvcnMgZnJvbSBcIi4uL3N0cnVjdHVyZXMvRGVmYXVsdEVycm9yc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW50ZXJmYWNlIElUcmFuc2FjdGlvbntcbiAgICBpZDpudW1iZXJcbiAgICB0aW1lc3RhbXA6bnVtYmVyLFxuICAgIGNvbm46bXlzcWwuUG9vbENvbm5lY3Rpb24sXG4gICAgcXVlcmllczp7c3FsOnN0cmluZyxzdGF0dXM6c3RyaW5nfVtdXG59XG5cblxuZXhwb3J0IGNsYXNzIE15c3FsQWRhcHRlciBpbXBsZW1lbnRzIElEQkFkYXB0ZXJ7XG4gICAgb3B0aW9uczpEQkFkYXB0ZXJPcHRpb25zO1xuICAgIHNlcnZpY2VTdGFydGVkOmJvb2xlYW49ZmFsc2U7XG5cbiAgICByZWNvbm5lY3Rpb25UaW1lb3V0PTEwMDAqMztcbiAgICByZWNvbm5lY3Rpbmc9ZmFsc2U7XG4gICAgcG9vbDpteXNxbC5Qb29sfG51bGw9bnVsbDtcbiAgICB0aW1lb3V0SUQ6YW55XG4gICAgICAgIFxuICAgIHF1ZXJpZXM9W107IC8vIFRPRE86IFNUT1JFIFFVRVJJRVMgU0VOVFMgQkVGT1JFIFRIRSBTRVJWSUNFIElTIFNUQVJURUQhXG4gICAgc3RhdGljIG5leHRUcmFuc2FjdGlvbklEPTE7XG4gICAgdHJhbnNhY3Rpb25zOklUcmFuc2FjdGlvbltdPVtdXG4gICAgXG4gICAgbWF4VHJhbnNhY3Rpb25XYWl0VGltZSA9IDEwMDAqNjAqMTsgLy8gMSBtaW4gYW5kIGRldGVsZXRlIHRyYW5zYWN0aW9uXG4gICAgbGFzdFN1Y2Nlc3NRdWVyeVRpbWUgPSAwO1xuICAgIHBpbmdJbnRlcnZhbCA9IDEwMDAqNjAqMjsgLy8gZWFjaCAyIG1pblxuICAgIFxuICAgIGZhaWxSZXBvcnRGaWxlU3RyZWFtOmZzLldyaXRlU3RyZWFtfG51bGw9bnVsbDtcbiAgICBmYWlsUmVwb3J0RmlsZVN0cmVhbU5hbWU6c3RyaW5nfG51bGw9bnVsbDtcbiAgICBmYWlsUmVwb3J0TGFzdEFjY2Vzc1RpbWU6bnVtYmVyPTA7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOkRCQWRhcHRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zPW9wdGlvbnM7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgICAgICAvLyBDcmVhdGUgZmlsZSBmb3IgdHJhbnNhY3Rpb24gcG9yYmxlbSByZXBvcnRcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydERpcil7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmModGhpcy5vcHRpb25zLnRyYW5zYWN0aW9uRmFpbFJlcG9ydERpcikpXG4gICAgICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyh0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyKTtcbiAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyPXVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsb2dDcml0KFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsXCJDYW4ndCBjcmVhdGUgdHJhbnNhY3Rpb24gZmFpbCByZXBvcnQgZGlyXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIHNldHVwIHByb2Nlc3MgZXhpdCBoYW5kbGVycyBpbnRlcnJ1cHQgKGN0cmwrYylcbiAgICAgICAgdGhpcy5zZXJ2aWNlU3RhcnRlZD1mYWxzZTtcbiAgICAgICAgbGV0IHBvb2xDcmVhdGVkOmJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgd2hpbGUoIXBvb2xDcmVhdGVkKXtcbiAgICAgICAgICAgIHBvb2xDcmVhdGVkID0gYXdhaXQgdGhpcy5yZWNyZWF0ZVBvb2woKTtcbiAgICAgICAgICAgIGlmKCFwb29sQ3JlYXRlZCl7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiQ2FuJ3QgY29ubmVjdCB0byBNWVNRTCEgUmV0cnlpbmcgaW4gMyBzZWNvbmRzLi4uXCIpXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpPT5zZXRUaW1lb3V0KHJlc29sdmUsMzAwMCkpIC8vIHNsZWVwIDMgc2Vjb25kc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXR1cFRpbWVycygpO1xuICAgIH1cblxuICAgIHNldHVwVGltZXJzKCl7XG5cbiAgICAgICAgLy8gSGFuZGxlIGhhbmdpbmcgdHJhbnNhY3Rpb25zXG4gICAgICAgIHNldEludGVydmFsKCgpPT57XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy50cmFuc2FjdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZElEczpudW1iZXJbXT1bXTtcblxuICAgICAgICAgICAgZm9yKGxldCBpIG9mIHRoaXMudHJhbnNhY3Rpb25zKXtcbiAgICAgICAgICAgICAgICBpZihub3ctaS50aW1lc3RhbXA+dGhpcy5tYXhUcmFuc2FjdGlvbldhaXRUaW1lKXtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3IoXCJSZWxlYXNlIHRyYW5zYWN0aW9uIGNvbm5lY3Rpb24gZHVlIHRvIHRpbWVvdXRcIilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKGksdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWRJRHMucHVzaChpLmlkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9ucy5maWx0ZXIoaT0+IXJlbW92ZWRJRHMuaW5jbHVkZXMoaS5pZCkpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZyAmJiBjb3VudC10aGlzLnRyYW5zYWN0aW9ucy5sZW5ndGg+MClcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlbW92ZWQ6IFwiLGNvdW50LXRoaXMudHJhbnNhY3Rpb25zLmxlbmd0aClcblxuICAgICAgICAgICAgLy8gUElORyBTRVJWRVJcbiAgICAgICAgICAgIGlmKERhdGUubm93KCktdGhpcy5sYXN0U3VjY2Vzc1F1ZXJ5VGltZT50aGlzLnBpbmdJbnRlcnZhbCl7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMucG9vbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIERPIFBJTkdcbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgPTA7aTx0aGlzLm9wdGlvbnMuY29ubmVjdGlvbkxpbWl0O2krKyl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkoe3F1ZXJ5OlwiU0VMRUNUIDEgQE5PTElNSVRcIn0pXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGluZyBteXNxbCBvbiBlYWNoIGNvbm5lY3Rpb24gaW4gcG9vbFwiKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH0sMTAwMCozMClcbiAgICAgICAgXG5cbiAgICAgICAgc2V0SW50ZXJ2YWwoKCk9PntcbiAgICAgICAgICAgIGlmKCF0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGFmdGVyIDE1IG1pbiBvZiBpbmFjdGl2aXR5LCBjbG9zZSBmaWxlXG4gICAgICAgICAgICBpZihEYXRlLm5vdygpLXRoaXMuZmFpbFJlcG9ydExhc3RBY2Nlc3NUaW1lPjEwMDAqNjAqMTUpe1xuICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0uZW5kKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbT1udWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sMTAwMCo2MCo1KVxuICAgIH1cblxuICAgIC8qKiBDcmVhdGUgY29ubmVjdGlvbiBwb29sICovXG4gICAgYXN5bmMgcmVjcmVhdGVQb29sKCk6UHJvbWlzZTxib29sZWFuPntcbiAgICAgICAgbG9nSW5mbyhcIiR7TXlzcWxBZGFwdGVyLmpzfVwiLFwiQ29ubmVjdGluZyB0byBteXNxbDogXFxuIFwiK0pTT04uc3RyaW5naWZ5KHsuLi50aGlzLm9wdGlvbnMscGFzc3dvcmQ6XCIqKioqXCJ9KSlcbiAgICBcbiAgICAgICAgaWYodGhpcy5wb29sKXtcbiAgICAgICAgICAgIHRoaXMucG9vbC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRyeXthd2FpdCB0aGlzLnBvb2wuZW5kKCk7fWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IGNsb3NlIE1ZU1FMIHBvb2whXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvb2wgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgXG4gICAgICAgIC8vIEtlZXAgYWxpdmUgcGFja2V0cyBzaG91bGQgYmUgc2VudFxuICAgICAgICAvKmVuYWJsZUtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAgLy8gV2Ugc2hvdWxkIHN0YXJ0IHNlbmRpbmcgdGhlbSBlYXJseVxuICAgICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXk6IDMgKiAxMDAwLCAvLyAzIHNlY29uZHNcbiAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCBpZGxlIGNvbm5lY3Rpb25zLCBidXQgaXQncyBub3QgbWFuZGF0b3J5IGZvciB0aGUgZml4IHRvIHdvcmssIGl0IHNlZW1zXG4gICAgICAgIG1heElkbGU6IDAsXG4gICAgICAgIC8vIElkbGUgdGltZW91dCBtdWNoIGxhcmdlciB0aGFuIGtlZXAgYWxpdmUgZGVsYXkgYW5kIG11Y2ggc21hbGxlciB0aGFuIE15U1FMJ3MgdGltZW91dCBzZXR0aW5nXG4gICAgICAgIGlkbGVUaW1lb3V0OiA1ICogNjAgKiAxMDAwIC8vIDUgbWludXRlc1xuICAgICAgICAqL1xuXG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIHRoaXMucG9vbCA9bXlzcWwuY3JlYXRlUG9vbCh7XG4gICAgICAgICAgICAgICAgaG9zdDogdGhpcy5vcHRpb25zLmhvc3RcbiAgICAgICAgICAgICAgICAsdXNlcjogdGhpcy5vcHRpb25zLnVzZXJcbiAgICAgICAgICAgICAgICAscGFzc3dvcmQ6IHRoaXMub3B0aW9ucy5wYXNzd29yZFxuICAgICAgICAgICAgICAgICxkYXRhYmFzZTogdGhpcy5vcHRpb25zLmRhdGFiYXNlXG4gICAgICAgICAgICAgICAgLHBvcnQ6IHRoaXMub3B0aW9ucy5wb3J0XG4gICAgICAgICAgICAgICAgLGNvbm5lY3Rpb25MaW1pdDogdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25MaW1pdFxuICAgICAgICAgICAgICAgICxxdWV1ZUxpbWl0OiAxMFxuICAgICAgICAgICAgICAgICxtdWx0aXBsZVN0YXRlbWVudHM6IHRydWVcblxuICAgICAgICAgICAgICAgICxlbmFibGVLZWVwQWxpdmU6dHJ1ZVxuICAgICAgICAgICAgICAgICxrZWVwQWxpdmVJbml0aWFsRGVsYXk6MyoxMDAwXG4gICAgICAgICAgICAgICAgLy8sbWF4SWRsZTowXG4gICAgICAgICAgICAgICAgLGlkbGVUaW1lb3V0OjEwMDAqNjAqNVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IGNvbm5lY3QgdG8gTVlTUUwhIFwiK2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvb2w/Lm9uKCdjb25uZWN0aW9uJywgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBsb2dJbmZvKFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsXCJNWVNRTCBDT05ORUNUSU9OIENSRUFURURcIilcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9vbD8ub24oJ2FjcXVpcmUnLCAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgIGxvZ0luZm8oXCIke015c3FsU2VydmljZS5qc31cIixcIk1ZU1FMIENPTk5FQ1RJT04gQUNRVUlSRURcIilcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5wb29sPy5vbigncmVsZWFzZScsIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcpXG4gICAgICAgICAgICAgICAgbG9nSW5mbyhcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiTVlTUUwgQ09OTkVDVElPTiBSRUxFQVNFRFwiKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnBvb2w/Lm9uKCdlbnF1ZXVlJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgIGxvZ0luZm8oXCIke015c3FsU2VydmljZS5qc31cIixcIk1ZU1FMIENPTk5FQ1RJT04gRU5RVUVVRURcIilcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGNvbm5lY3Rpb25cbiAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDaGVjayBteXNxbCBjb25uZWN0aW9uXCIpXG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLF8pPT57XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMucG9vbD8uZ2V0Q29ubmVjdGlvbigpXG4gICAgICAgICAgICAgICAgaWYoY29ubil7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm4ucXVlcnkoXCJTRUxFQ1QgMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29ubj8ucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgICAgICBsb2dJbmZvKFwiJHtNeXNxbFNlcnZpY2UuanN9XCIsXCJDb25uZWN0ZWQgdG8gTVlTUUwhXCIpXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICAgICAgICB9ZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IGNvbm5lY3QgdG8gTVlTUUwhXCIpXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcXVlcnkocmVxdWVzdDogSURCUXVlcnkpOiBQcm9taXNlPElEQlJlc3VsdD4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMucHJlcGFyZVF1ZXJ5KHJlcXVlc3QpO1xuXG4gICAgICAgIC8vIENoZWNrIHBvb2xcbiAgICAgICAgaWYoIXRoaXMucG9vbCl7XG4gICAgICAgICAgICBsb2dFcnJvcihcIiR7TXlzcWxBZGFwdGVyLmpzfVwiLFwiTm8gcG9vbFwiKVxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgY29kZTogXCJOT19QT09MXCIsXG4gICAgICAgICAgICAgICAgZXJybm86IDEwMDAwMCxcbiAgICAgICAgICAgICAgICBmYXRhbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzcWw6IHF1ZXJ5LFxuICAgICAgICAgICAgICAgIG5hbWU6XCJOT19QT09MXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcIk15c3FsIHBvb2wgbm90IGNyZWF0ZWRcIixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHJlcXVlc3QudGhyb3dhYmxlKVxuICAgICAgICAgICAgICAgIHRocm93IHsuLi5EZWZhdWx0RXJyb3JzLkRCX0VSUk9SLGRldGFpbHM6ZXJyb3IubWVzc2FnZSxzdGFjazplcnJvcn1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3IsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8vIGdldCBjb25uZWN0aW9uXG4gICAgICAgICAgICBsZXQgY29ubjpteXNxbC5Qb29sQ29ubmVjdGlvbnxudWxsPW51bGxcbiAgICAgICAgICAgIGlmKHJlcXVlc3QudHJhbnNhY3Rpb25JRCAmJiByZXF1ZXN0LnRyYW5zYWN0aW9uSUQ+MCl7XG4gICAgICAgICAgICAgICAgY29ubiA9IHRoaXMudHJhbnNhY3Rpb25zLmZpbmQoaT0+aS5pZD09PXJlcXVlc3QudHJhbnNhY3Rpb25JRCk/LmNvbm4gPz8gbnVsbDtcbiAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuZGVidWcpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXhlY3V0ZSBxdWVyeSBvbiB0cmFuc2FjdGlvbjogXCIsY29ubj8udGhyZWFkSWQpXG4gICAgICAgICAgICB9ZWxzZVxuICAgICAgICAgICAgICAgIGNvbm4gPSBhd2FpdCB0aGlzLnBvb2wuZ2V0Q29ubmVjdGlvbigpO1xuICAgICAgICBcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkV4ZWN1dGUgcXVlcnlcIixjb25uPy50aHJlYWRJZClcbiAgICAgICAgXG4gICAgICAgICAgICAvLyBpZiBjb25uZWN0aW9uIG5vdCBjcmVhdGVkXG4gICAgICAgICAgICBpZighY29ubil7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxBZGFwdGVyLmpzfVwiLGBObyBjb25uZWN0aW9uIGNyZWF0ZWQhYClcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogXCJOT19DT05OXCIsXG4gICAgICAgICAgICAgICAgICAgIGVycm5vOiAxMDAwMDEsXG4gICAgICAgICAgICAgICAgICAgIGZhdGFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcWw6IHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBuYW1lOlwiTk9fQ09OTlwiLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlwiTXlzcWwgcG9vbCBjYW50IGdldCBjb25uZWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYocmVxdWVzdC50aHJvd2FibGUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHsuLi5EZWZhdWx0RXJyb3JzLkRCX0VSUk9SLGRldGFpbHM6ZXJyb3IubWVzc2FnZSxzdGFjazplcnJvcn1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbm4ucXVlcnkocXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6cmVzdWx0WzBdLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjpudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVNeXNxbFF1ZXJ5RXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgaWYocmVxdWVzdC50aHJvd2FibGUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHsuLi5EZWZhdWx0RXJyb3JzLkRCX0VSUk9SLGRldGFpbHM6ZXJyb3IubWVzc2FnZSxzdGFjazplcnJvcn1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOnRoaXMuY3JlYXRlTXlzcWxRdWVyeUVycm9yKGUpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICBsb2dDcml0KFwiJHtNeXNxbEFkYXB0ZXIuanN9XCIsYEVycm9yIHdoZW4gZXhlY3V0aW5nIHF1ZXJ5OiAke2V9YClcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0ge1xuICAgICAgICAgICAgICAgIGNvZGU6IFwiRVhFQ19FUlJPUlwiLFxuICAgICAgICAgICAgICAgIGVycm5vOiAxMDAwMDIsXG4gICAgICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICAgICAgc3FsOiBxdWVyeSxcbiAgICAgICAgICAgICAgICBuYW1lOlwiRVhFQ1VUSU9OX0VSUk9SXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTplK1wiXCIsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKHJlcXVlc3QudGhyb3dhYmxlKVxuICAgICAgICAgICAgICAgIHRocm93IHsuLi5EZWZhdWx0RXJyb3JzLkRCX0VSUk9SLGRldGFpbHM6ZXJyb3IubWVzc2FnZSxzdGFjazplcnJvcn1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOm51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3IsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJlcGFyZVF1ZXJ5KHJlcXVlc3Q6IElEQlF1ZXJ5KTpzdHJpbmd7XG5cbiAgICAgICAgbGV0IHF1ZXJ5ID0gcmVxdWVzdC5xdWVyeTtcbiAgICAgICAgbGV0IGZpZWxkcyA9IHJlcXVlc3QuZmllbGRzO1xuXG4gICAgICAgIGlmKGZpZWxkcyl7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZmllbGRzKXtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkc1tpXT17dmFsdWU6dmFsdWUsc3lzdGVtOmZhbHNlfVxuICAgICAgICAgICAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmKHZhbHVlPT09bnVsbClcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ldPXt2YWx1ZTpudWxsLHN5c3RlbTp0cnVlfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZD0gTXlzcWxBZGFwdGVyLnByZXBhcmVRdWVyeUZpZWxkVmFsdWUodmFsdWUgYXMgSURCUXVlcnlGaWVsZCk7XG5cbiAgICAgICAgICAgICAgICAvLyB0b2RvIGNyZWF0ZSByZWdleCB0byByZXBsYWNlIGFsbFxuICAgICAgICAgICAgICAgIHF1ZXJ5PXF1ZXJ5LnJlcGxhY2VBbGwoXCJAXCIrbmFtZSxwYXJzZWQrXCJcIikgXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIFxuICAgICAgICBjb25zdCB0bXAgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZih0bXAuaW5kZXhPZihcInNlbGVjdFwiKT09PTAgJiYgdG1wLmluZGV4T2YoXCJsaW1pdFwiKT09PS0xKVxuICAgICAgICAgICAgcXVlcnkrPVwiIExJTUlUIDEwMFwiXG4gICAgICAgICAgICBcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlQWxsKFwiQE5PTElNSVRcIixcIlwiKVxuICAgIFxuICAgICAgICBpZihxdWVyeS5pbmRleE9mKFwiQGZpZWxkc1wiKSE9PS0xKXtcbiAgICAgICAgICAgICAgICBsZXQgaW5zZXJ0RmllbGROYW1lcz1bXVxuICAgICAgICAgICAgICAgIGxldCBpbnNlcnRGaWVsZFZhbHVlcz1bXVxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBmaWVsZHMpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgZiA9IGZpZWxkc1tpXSBhcyBJREJRdWVyeUZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZihmLmlnbm9yZUluSW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFmLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0RmllbGROYW1lcy5wdXNoKCdgJysoZi5uYW1lK1wiXCIpLnJlcGxhY2VBbGwoXCJgXCIsJycpLnJlcGxhY2VBbGwoJ1xcXCInLFwiXCIpLnJlcGxhY2VBbGwoJ1xcJycsXCJcIikrJ2AnKVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRGaWVsZFZhbHVlcy5wdXNoKGYuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICBxdWVyeT1xdWVyeVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnQGZpZWxkcycsaW5zZXJ0RmllbGROYW1lcy5qb2luKFwiLFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJ0B2YWx1ZXMnLGluc2VydEZpZWxkVmFsdWVzLmpvaW4oXCIsXCIpKVxuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgaWYocXVlcnkuaW5kZXhPZihcIkBpbnNlcnRcIikhPT0tMSl7XG4gICAgICAgICAgICAgICAgbGV0IG9uaW5zZXJ0TmFtZXM9W11cbiAgICAgICAgICAgICAgICBsZXQgb25pbnNlcnRWYWx1ZXM9W11cbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gZmllbGRzKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGYgPSBmaWVsZHNbaV0gYXMgSURCUXVlcnlGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYoZi5pZ25vcmVJbkluc2VydClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBvbmluc2VydE5hbWVzLnB1c2goKGYubmFtZStcIlwiKS5yZXBsYWNlQWxsKFwiYFwiLCcnKS5yZXBsYWNlQWxsKCdcXFwiJyxcIlwiKS5yZXBsYWNlQWxsKCdcXCcnLFwiXCIpKVxuICAgICAgICAgICAgICAgICAgICBvbmluc2VydFZhbHVlcy5wdXNoKGYuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2VBbGwoXCJAaW5zZXJ0XCIsYCgke29uaW5zZXJ0TmFtZXMuam9pbihcIixcIil9KSBWQUxVRVMgKCR7b25pbnNlcnRWYWx1ZXMuam9pbihcIixcIil9KWApXG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZihxdWVyeS5pbmRleE9mKFwiQG9udXBkYXRlXCIpIT09LTEpe1xuICAgICAgICAgICAgICAgIGxldCBvblVwZGF0ZT1bXVxuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBmaWVsZHMpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgZiA9IGZpZWxkc1tpXSBhcyBJREJRdWVyeUZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZihmLmlnbm9yZUluVXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIG9uVXBkYXRlLnB1c2goJ2AnKyhmLm5hbWUrXCJcIikucmVwbGFjZUFsbChcImBcIiwnJykucmVwbGFjZUFsbCgnXFxcIicsXCJcIikucmVwbGFjZUFsbCgnXFwnJyxcIlwiKSsnYCA9ICcrZi5fcGFyc2VkVmFsdWUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZUFsbChcIkBvbnVwZGF0ZVwiLG9uVXBkYXRlLmpvaW4oXCIgLCBcIikpXG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZihxdWVyeS5pbmRleE9mKCdAb25kdXBsaWNhdGUnKSE9PS0xKXtcbiAgICAgICAgICAgICAgICBsZXQgb25EdXBsaWNhdGU9W107XG4gICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIGZpZWxkcyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmID0gZmllbGRzW2ldIGFzIElEQlF1ZXJ5RmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFmLnVzZUluUmVwbGFjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBvbkR1cGxpY2F0ZS5wdXNoKCdgJysoZi5uYW1lK1wiXCIpLnJlcGxhY2VBbGwoXCJgXCIsJycpLnJlcGxhY2VBbGwoJ1xcXCInLFwiXCIpLnJlcGxhY2VBbGwoJ1xcJycsXCJcIikrJ2AgPSAnK2YuX3BhcnNlZFZhbHVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2VBbGwoXCJAb25kdXBsaWNhdGVcIixvbkR1cGxpY2F0ZS5qb2luKFwiICwgXCIpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiAgcXVlcnk7XG4gICAgfVxuXG4gICAgLyoqIFByZXBhcmUgZmllbGQgdmFsdWUgKi9cbiAgICBzdGF0aWMgcHJlcGFyZVF1ZXJ5RmllbGRWYWx1ZShmaWVsZDpJREJRdWVyeUZpZWxkKTpzdHJpbmd8bnVtYmVyfGJvb2xlYW58bnVsbHx1bmRlZmluZWR7XG4gICAgICAgIGxldCB2YWx1ZSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICBsZXQgc3lzdGVtID0gZmllbGQuc3lzdGVtO1xuXG4gICAgICAgIGlmKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gXCJOVUxMXCJcblxuICAgICAgICBpZighc3lzdGVtICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZUFsbCgnXCInLCdcXFxcXCInKTtcbiAgICAgICAgICAgIFxuICAgICAgICBmaWVsZC5fX3BhcnNlZFZhbHVlPXZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWUgYXMgYW55O1xuICAgIH1cblxuICAgIHByZXBhcmVDb3VudFF1ZXJ5KHF1ZXJ5OnN0cmluZyk6c3RyaW5ne1xuICAgICAgICBsZXQgY291bnRRdWVyeSA9IHF1ZXJ5O1xuXG4gICAgICAgIC8vIFJFTU9WRSBMSU1JVFxuICAgICAgICBpZihjb3VudFF1ZXJ5LmluZGV4T2YoXCJMSU1JVFwiKT09PS0xKVxuICAgICAgICAgICAgY291bnRRdWVyeSA9IGNvdW50UXVlcnkuc3Vic3RyaW5nKDAsY291bnRRdWVyeS5pbmRleE9mKFwiTElNSVRcIikpO1xuICAgICAgICBcbiAgICAgICAgLy8gUkVNT1ZFIE9SREVSIFxuICAgICAgICBpZihjb3VudFF1ZXJ5LmluZGV4T2YoXCJPUkRFUlwiKSE9PS0xKVxuICAgICAgICAgICAgY291bnRRdWVyeSA9IGNvdW50UXVlcnkuc3Vic3RyaW5nKDAsY291bnRRdWVyeS5pbmRleE9mKFwiT1JERVJcIikpXG5cbiAgICAgICAgLy9UT0RPOiBSRU1PVkUgSk9JTlNcblxuICAgICAgICBjb3VudFF1ZXJ5ID0gY291bnRRdWVyeS5zdWJzdHJpbmcoY291bnRRdWVyeS5pbmRleE9mKFwiRlJPTVwiKSk7XG4gICAgICAgIFxuXG4gICAgICAgIGNvdW50UXVlcnkgPSBcIlNFTEVDVCBDT1VOVCgxKSBhcyBgY291bnRgIFwiK2NvdW50UXVlcnlcbiAgICAgICAgcmV0dXJuIGNvdW50UXVlcnk7XG4gICAgfVxuXG5cbiAgICAvLyBUUkFOU0FDVElPTlNcbiAgICBhc3luYyBjb21taXQodHJ4OklUcmFuc2FjdGlvbik6UHJvbWlzZTxJREJFcnJvcnxudWxsPntcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgYXdhaXQgdHJ4LmNvbm4uY29tbWl0KCk7XG4gICAgICAgICAgICAvL2F3YWl0IHRyeC5jb25uLnF1ZXJ5KFwiQ09NTUlUXCIpO1xuICAgICAgICAgICAgdHJ4LmNvbm4ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICB0cnguY29ubi5yZWxlYXNlKCk7XG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbih0cngpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTXlzcWxRdWVyeUVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuXG4gICAgYXN5bmMgcm9sbGJhY2tUcmFuc2FjdGlvbih0cng6SVRyYW5zYWN0aW9uLGRvbk5vdFJlbW92ZT86Ym9vbGVhbik6UHJvbWlzZTxJREJFcnJvcnxudWxsPntcbiAgICAgICAgbGV0IGVycj1udWxsO1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJvbGxiYWNrIHN0YXJ0ZWRcIix0cnguY29ubi50aHJlYWRJZClcbiAgICAgICAgICAgIGF3YWl0IHRyeC5jb25uLnJvbGxiYWNrKCk7XG4gICAgICAgICAgICBhd2FpdCB0cnguY29ubi5jb21taXQoKTtcbiAgICAgICAgICAgIC8vYXdhaXQgdHJ4LmNvbm4ucXVlcnkoXCJST0xMQkFDS1wiKTtcbiAgICAgICAgICAgIHRyeC5jb25uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgdHJ4LmNvbm4ucmVsZWFzZSgpO1xuICAgICAgICAgICAgaWYoIWRvbk5vdFJlbW92ZSlcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHRoaXMudHJhbnNhY3Rpb25zLmZpbHRlcihpPT5pLmlkIT09dHJ4LmlkKTtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5kZWJ1ZylcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJvbGxiYWNrIGNvbXBsZXRlXCIsdHJ4LmNvbm4udGhyZWFkSWQpXG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IHJvbGxiYWNrIHRyYW5zYWN0aW9uXCIsdHJ4LnF1ZXJpZXMpXG4gICAgICAgICAgICBlcnIgPSB0aGlzLmNyZWF0ZU15c3FsUXVlcnlFcnJvcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RvcmVUcmFuc2FjdGlvbkFzUHJvYmxlbSh0cngsXCJyb2xsYmFja1wiKVxuXG4gICAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBGaW5pc2ggc2VydmljZVxuICAgICAqL1xuICAgIGFzeW5jIGZpbmlzaCgpe1xuICAgICAgICBjb25zb2xlLmxvZyhcIkZpbmlzaGluZyBteXNxbCBzZXJ2aWNlXCIpXG4gICAgICAgIGZvcihsZXQgaSBvZiB0aGlzLnRyYW5zYWN0aW9ucylcbiAgICAgICAgICAgIHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbihpKTtcblxuICAgICAgICBpZih0aGlzLnBvb2wpe1xuICAgICAgICAgICAgdHJ5e2F3YWl0IHRoaXMucG9vbC5lbmQoKTt9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgbG9nQ3JpdChcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiQ2FuJ3QgY2xvc2UgTVlTUUwgcG9vbCFcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0pXG4gICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtLmVuZCgpO1xuICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtPW51bGw7XG4gICAgfVxuXG4gICAgY3JlYXRlTXlzcWxRdWVyeUVycm9yKGVycjphbnksdGhyb3dhYmxlPzpib29sZWFuKTpJREJFcnJvcntcbiAgICAgICAgaWYoZXJyICYmICB0eXBlb2YgZXJyPT09XCJvYmplY3RcIiAmJiBcImNvZGVcIiBpbiBlcnIgJiYgXCJlcnJub1wiIGluIGVyciAmJiBcInNxbFwiIGluIGVyciAmJiBcIm5hbWVcIiBpbiBlcnIgJiYgXCJtZXNzYWdlXCIgaW4gZXJyKXtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IGVyci5jb2RlLFxuICAgICAgICAgICAgICAgICAgICBlcnJubzogZXJyLmVycm5vLFxuICAgICAgICAgICAgICAgICAgICBzcWw6IGVyci5zcWwsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ZXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGZhdGFsOmZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBcIlFVRVJZX0VSUlwiLFxuICAgICAgICAgICAgICAgIGVycm5vOiAxMDAwMDIsXG4gICAgICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICAgICAgc3FsOiBcIm5vIHF1ZXJ5XCIsXG4gICAgICAgICAgICAgICAgbmFtZTpcIlFVRVJZX0VSUlwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6XCJFcnJvcjogXCIrKGVycik/ZXJyOlwiXCIsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzdG9yZVRyYW5zYWN0aW9uQXNQcm9ibGVtKHRyeDpJVHJhbnNhY3Rpb24sbWVzc2FnZTpzdHJpbmcpe1xuICAgIFxuICAgICAgICAgICAgaWYoIXRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnQgJiYgIXRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIpe1xuICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IHJlcG9ydCBmYWlsZWQgdHJhbnNhY3Rpb24sIG5vIHJlcG9ydCBmdW5jdGlvbjogdHJhbnNhY3Rpb25GYWlsUmVwb3J0IGluIG9wdGlvbnMsIGFuZCB0cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIgaXNudCBzZXRcIilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0RGlyKXtcbiAgICAgICAgICAgICAgICBjb25zdCB5eXltbWRkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLDEwKS5yZXBsYWNlQWxsKFwiLVwiLFwiXCIpO1xuICAgIFxuICAgICAgICAgICAgICAgIC8vc3RvcmUgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gcGF0aC5yZXNvbHZlKHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnREaXIseXl5bW1kZCtcIi5qc29uXCIpO1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0pe1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtTmFtZSE9PWZpbGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbS5lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW09bnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICBcbiAgICAgICAgICAgICAgICBpZih0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtTmFtZSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlLHtmbGFnczonYSd9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0RmlsZVN0cmVhbU5hbWU9ZmlsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmRlYnVnKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN0b3JlIHRyYW5zYWN0aW9uIGZhaWwgcmVwb3J0OiBcIixmaWxlLHRyeC5xdWVyaWVzLG1lc3NhZ2UpXG4gICAgXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbFJlcG9ydEZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlLHtmbGFnczonYSd9KTtcbiAgICBcbiAgICAgICAgICAgICAgICB0aGlzLmZhaWxSZXBvcnRGaWxlU3RyZWFtLndyaXRlKEpTT04uc3RyaW5naWZ5KHtxdWVyaWVzOnRyeC5xdWVyaWVzLHRpbWU6dHJ4LnRpbWVzdGFtcCxkYXRlLG1lc3NhZ2V9KStcIlxcbn1FT0J7XFxuXCIsZXJyPT57XG4gICAgICAgICAgICAgICAgICAgIGlmKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0NyaXQoXCIke015c3FsU2VydmljZS5qc31cIixcIkNhbid0IHdyaXRlIHRvIHRyYW5zYWN0aW9uIGZhaWwgcmVwb3J0IGZpbGVcIilcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nSW5mbyhcIiR7TXlzcWxTZXJ2aWNlLmpzfVwiLFwiVHJhbnNhY3Rpb24gZmFpbCByZXBvcnQgc3RvcmVkXCIpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgXG4gICAgICAgICAgICAgICAgdGhpcy5mYWlsUmVwb3J0TGFzdEFjY2Vzc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgIFxuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25GYWlsUmVwb3J0KVxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkZhaWxSZXBvcnQodHJ4LG1lc3NhZ2UpO1xuICAgICAgICB9XG59Il19
|
@@ -11,9 +11,10 @@ declare class DefaultErrors {
|
|
11
11
|
static SERVICE_NOT_WORKING: IError;
|
12
12
|
static TIMEOUT: IError;
|
13
13
|
static METHOD_NOT_ALLOWED: IError;
|
14
|
+
static DB_ERROR: IError;
|
14
15
|
}
|
15
16
|
export declare class ErrorUtils {
|
16
|
-
static isError(obj: any):
|
17
|
+
static isError(obj: any): obj is IError;
|
17
18
|
static appendStack(error: IError, stack?: IError[]): IError;
|
18
19
|
}
|
19
20
|
export default DefaultErrors;
|
@@ -14,6 +14,7 @@ class DefaultErrors {
|
|
14
14
|
static SERVICE_NOT_WORKING = { code: 8, message: "Service not working" };
|
15
15
|
static TIMEOUT = { code: 9, message: "Timeout" };
|
16
16
|
static METHOD_NOT_ALLOWED = { code: 10, message: "Method not allowed", httpStatus: 405 };
|
17
|
+
static DB_ERROR = { code: 11, message: "DB error" };
|
17
18
|
}
|
18
19
|
class ErrorUtils {
|
19
20
|
static isError(obj) {
|
@@ -33,4 +34,4 @@ class ErrorUtils {
|
|
33
34
|
}
|
34
35
|
exports.ErrorUtils = ErrorUtils;
|
35
36
|
exports.default = DefaultErrors;
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGlTZXJ2ZXIvc3RydWN0dXJlcy9EZWZhdWx0RXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFpRTtBQUdqRSxNQUFNLGFBQWE7SUFDZixNQUFNLENBQUMsZUFBZSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUNoRSxNQUFNLENBQUMsZUFBZSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUNoRSxNQUFNLENBQUMsY0FBYyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsQ0FBQTtJQUM5RCxNQUFNLENBQUMsY0FBYyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsQ0FBQTtJQUNqRSxNQUFNLENBQUMsY0FBYyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUMvRCxNQUFNLENBQUMsZUFBZSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQTtJQUNoRSxNQUFNLENBQUMsWUFBWSxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsY0FBYyxFQUFDLENBQUE7SUFDMUQsTUFBTSxDQUFDLFdBQVcsR0FBUSxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxVQUFVLEVBQUMsR0FBRyxFQUFDLENBQUE7SUFDdkUsTUFBTSxDQUFDLG1CQUFtQixHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsQ0FBQTtJQUN4RSxNQUFNLENBQUMsT0FBTyxHQUFRLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsU0FBUyxFQUFDLENBQUE7SUFDaEQsTUFBTSxDQUFDLGtCQUFrQixHQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsVUFBVSxFQUFDLEdBQUcsRUFBQyxDQUFBO0lBQ3RGLE1BQU0sQ0FBQyxRQUFRLEdBQVEsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsQ0FBQTs7QUFHdkQsTUFBYSxVQUFVO0lBRW5CLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBTztRQUNsQixNQUFNLGNBQWMsR0FBRyxxQkFBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sRUFBQyxTQUFTLENBQUMsRUFBQyxHQUFHLENBQUMsQ0FBQTtRQUV2RSxJQUFHLENBQUMsY0FBYztZQUNkLE9BQU8sS0FBSyxDQUFDO1FBRWpCLElBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksRUFBQyxFQUFDLElBQUksRUFBQyxRQUFRLEVBQUMsQ0FBQyxLQUFHLDRCQUFnQixDQUFDLEVBQUU7WUFDdEUsT0FBTyxLQUFLLENBQUM7UUFFakIsSUFBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsRUFBQyxDQUFDLEtBQUcsNEJBQWdCLENBQUMsRUFBRTtZQUN6RSxPQUFPLEtBQUssQ0FBQztRQUVqQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFZLEVBQUMsS0FBZTtRQUMzQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0o7QUFyQkQsZ0NBcUJDO0FBRUQsa0JBQWUsYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmFsaWRhdGlvblJlcG9ydCwgVmFsaWRhdG9yIH0gZnJvbSBcIi4uL2hlbHBlci9WYWxpZGF0b3JcIlxuaW1wb3J0IHsgSUVycm9yIH0gZnJvbSBcIi4vSW50ZXJmYWNlc1wiXG5cbmNsYXNzIERlZmF1bHRFcnJvcnN7XG4gICAgc3RhdGljIE5PVF9JTVBMRU1FTlRFRDpJRXJyb3I9e2NvZGU6MSxtZXNzYWdlOlwiTm90IGltcGxlbWVudGVkXCJ9XG4gICAgc3RhdGljIFVOS05PV05fUkVRVUVTVDpJRXJyb3I9e2NvZGU6MixtZXNzYWdlOlwiVW5rbm93biByZXF1ZXN0XCJ9XG4gICAgc3RhdGljIEpTT05fTUFMRk9STUVEOklFcnJvcj17Y29kZTozLG1lc3NhZ2U6XCJKU09OIG1hbGZvcm1lZFwifVxuICAgIHN0YXRpYyBGSUxFX1RPT19MQVJHRTpJRXJyb3I9e2NvZGU6NCxtZXNzYWdlOlwiRmlsZSBpcyB0b28gbGFyZ2VcIn1cbiAgICBzdGF0aWMgQ0FOVF9TRU5EX0ZJTEU6SUVycm9yPXtjb2RlOjUsbWVzc2FnZTpcIkNhbid0IHNlbmQgZmlsZVwifVxuICAgIHN0YXRpYyBGSUxFX05PVF9FWElTVFM6SUVycm9yPXtjb2RlOjUsbWVzc2FnZTpcIkZpbGUgbm90IGV4aXN0c1wifVxuICAgIHN0YXRpYyBVTkFVVEhPUklaRUQ6SUVycm9yPXtjb2RlOjYsbWVzc2FnZTpcIlVuYXV0aG9yaXplZFwifVxuICAgIHN0YXRpYyBCQURfUkVRVUVTVDpJRXJyb3I9e2NvZGU6NyxtZXNzYWdlOlwiQmFkIHJlcXVlc3RcIixodHRwU3RhdHVzOjQwMH1cbiAgICBzdGF0aWMgU0VSVklDRV9OT1RfV09SS0lORzpJRXJyb3I9e2NvZGU6OCxtZXNzYWdlOlwiU2VydmljZSBub3Qgd29ya2luZ1wifVxuICAgIHN0YXRpYyBUSU1FT1VUOklFcnJvcj17Y29kZTo5LG1lc3NhZ2U6XCJUaW1lb3V0XCJ9XG4gICAgc3RhdGljIE1FVEhPRF9OT1RfQUxMT1dFRDpJRXJyb3I9e2NvZGU6MTAsbWVzc2FnZTpcIk1ldGhvZCBub3QgYWxsb3dlZFwiLGh0dHBTdGF0dXM6NDA1fVxuICAgIHN0YXRpYyBEQl9FUlJPUjpJRXJyb3I9e2NvZGU6MTEsbWVzc2FnZTpcIkRCIGVycm9yXCJ9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvclV0aWxze1xuXG4gICAgc3RhdGljIGlzRXJyb3Iob2JqOmFueSk6b2JqIGlzIElFcnJvcntcbiAgICAgICAgY29uc3QgaXNGaWVsZHNFeGlzdHMgPSBWYWxpZGF0b3IudmFsaWRhdGVPYmplY3QoWydjb2RlJywnbWVzc2FnZSddLG9iailcbiAgICBcbiAgICAgICAgaWYoIWlzRmllbGRzRXhpc3RzKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgICAgICBpZihWYWxpZGF0b3IudmFsaWRhdGVWYWx1ZShvYmouY29kZSx7dHlwZTpcIm51bWJlclwifSkhPT1WYWxpZGF0aW9uUmVwb3J0Lk9LKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgICAgICBpZihWYWxpZGF0b3IudmFsaWRhdGVWYWx1ZShvYmoubWVzc2FnZSx7dHlwZTpcInN0cmluZ1wifSkhPT1WYWxpZGF0aW9uUmVwb3J0Lk9LKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXBwZW5kU3RhY2soZXJyb3I6SUVycm9yLHN0YWNrPzpJRXJyb3JbXSk6SUVycm9ye1xuICAgICAgICBlcnJvci5zdGFjayA9IHN0YWNrO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEZWZhdWx0RXJyb3JzIl19
|
package/dist/index.d.ts
CHANGED
@@ -8,4 +8,5 @@ import { S_MONITOR_REGISTRATE_ACTION } from "./apiServer/monitor/Monitor";
|
|
8
8
|
import { DataProvider } from "./apiServer/helper/DataProvider";
|
9
9
|
import { UID } from "./apiServer/helper/UID";
|
10
10
|
import { ExternalService } from "./apiServer/external/ExternalService";
|
11
|
-
|
11
|
+
import { DBService } from "./apiServer/DBService";
|
12
|
+
export { UID, APIService, Initializer, LocalRequest, MysqlService, Validator, LogService, DataProvider, ErrorUtils, ExternalService, DBService, S_MONITOR_REGISTRATE_ACTION };
|
package/dist/index.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.S_MONITOR_REGISTRATE_ACTION = exports.ExternalService = exports.ErrorUtils = exports.DataProvider = exports.LogService = exports.Validator = exports.MysqlService = exports.LocalRequest = exports.Initializer = exports.APIService = exports.UID = void 0;
|
3
|
+
exports.S_MONITOR_REGISTRATE_ACTION = exports.DBService = exports.ExternalService = exports.ErrorUtils = exports.DataProvider = exports.LogService = exports.Validator = exports.MysqlService = exports.LocalRequest = exports.Initializer = exports.APIService = exports.UID = void 0;
|
4
4
|
const APIService_1 = require("./apiServer/APIService");
|
5
5
|
Object.defineProperty(exports, "APIService", { enumerable: true, get: function () { return APIService_1.APIService; } });
|
6
6
|
Object.defineProperty(exports, "Initializer", { enumerable: true, get: function () { return APIService_1.Initializer; } });
|
@@ -22,4 +22,6 @@ const UID_1 = require("./apiServer/helper/UID");
|
|
22
22
|
Object.defineProperty(exports, "UID", { enumerable: true, get: function () { return UID_1.UID; } });
|
23
23
|
const ExternalService_1 = require("./apiServer/external/ExternalService");
|
24
24
|
Object.defineProperty(exports, "ExternalService", { enumerable: true, get: function () { return ExternalService_1.ExternalService; } });
|
25
|
-
|
25
|
+
const DBService_1 = require("./apiServer/DBService");
|
26
|
+
Object.defineProperty(exports, "DBService", { enumerable: true, get: function () { return DBService_1.DBService; } });
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQWdFO0FBZTVELDJGQWZLLHVCQUFVLE9BZUw7QUFDViw0RkFoQmdCLHdCQUFXLE9BZ0JoQjtBQWZmLDJEQUF3RDtBQWdCcEQsNkZBaEJLLDJCQUFZLE9BZ0JMO0FBZmhCLDJEQUFxRDtBQWdCakQsNkZBaEJJLDJCQUFZLE9BZ0JKO0FBZmhCLDREQUF5RDtBQWdCckQsMEZBaEJLLHFCQUFTLE9BZ0JMO0FBZmIsdURBQW9EO0FBZ0JoRCwyRkFoQkssdUJBQVUsT0FnQkw7QUFmZCx3RUFBa0U7QUFpQjlELDJGQWpCSywwQkFBVSxPQWlCTDtBQWhCZCx5REFBMEU7QUFtQnRFLDRHQW5CSyxxQ0FBMkIsT0FtQkw7QUFsQi9CLGtFQUErRDtBQWMzRCw2RkFkSywyQkFBWSxPQWNMO0FBYmhCLGdEQUE2QztBQU16QyxvRkFOSyxTQUFHLE9BTUw7QUFMUCwwRUFBdUU7QUFjbkUsZ0dBZEssaUNBQWUsT0FjTDtBQWJuQixxREFBa0Q7QUFjOUMsMEZBZEsscUJBQVMsT0FjTCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQSVNlcnZpY2UsSW5pdGlhbGl6ZXIgfSBmcm9tIFwiLi9hcGlTZXJ2ZXIvQVBJU2VydmljZVwiO1xuaW1wb3J0IHsgTG9jYWxSZXF1ZXN0IH0gZnJvbSBcIi4vYXBpU2VydmVyL0xvY2FsUmVxdWVzdFwiO1xuaW1wb3J0IHtNeXNxbFNlcnZpY2V9IGZyb20gXCIuL2FwaVNlcnZlci9NeXNxbFNlcnZpY2VcIlxuaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vYXBpU2VydmVyL2hlbHBlci9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tIFwiLi9hcGlTZXJ2ZXIvTG9nU2VydmljZVwiO1xuaW1wb3J0IHsgRXJyb3JVdGlscyB9IGZyb20gXCIuL2FwaVNlcnZlci9zdHJ1Y3R1cmVzL0RlZmF1bHRFcnJvcnNcIjtcbmltcG9ydCB7IFNfTU9OSVRPUl9SRUdJU1RSQVRFX0FDVElPTiB9IGZyb20gXCIuL2FwaVNlcnZlci9tb25pdG9yL01vbml0b3JcIjtcbmltcG9ydCB7IERhdGFQcm92aWRlciB9IGZyb20gXCIuL2FwaVNlcnZlci9oZWxwZXIvRGF0YVByb3ZpZGVyXCI7XG5pbXBvcnQgeyBVSUQgfSBmcm9tIFwiLi9hcGlTZXJ2ZXIvaGVscGVyL1VJRFwiO1xuaW1wb3J0IHsgRXh0ZXJuYWxTZXJ2aWNlIH0gZnJvbSBcIi4vYXBpU2VydmVyL2V4dGVybmFsL0V4dGVybmFsU2VydmljZVwiO1xuaW1wb3J0IHsgREJTZXJ2aWNlIH0gZnJvbSBcIi4vYXBpU2VydmVyL0RCU2VydmljZVwiO1xuXG5cbmV4cG9ydCB7XG4gICAgVUlELFxuICAgIEFQSVNlcnZpY2UsXG4gICAgSW5pdGlhbGl6ZXIsXG4gICAgTG9jYWxSZXF1ZXN0LFxuICAgIE15c3FsU2VydmljZSxcbiAgICBWYWxpZGF0b3IsXG4gICAgTG9nU2VydmljZSxcbiAgICBEYXRhUHJvdmlkZXIsXG4gICAgRXJyb3JVdGlscyxcbiAgICBFeHRlcm5hbFNlcnZpY2UsXG4gICAgREJTZXJ2aWNlLFxuICAgIFNfTU9OSVRPUl9SRUdJU1RSQVRFX0FDVElPTlxufSJdfQ==
|