sonamu 0.9.0 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -4
- package/dist/api/sonamu.d.ts +5 -2
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +61 -22
- package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/api-key.js +16 -12
- package/dist/auth/plugins/wrappers/admin.d.ts +169 -73
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/api-key.d.ts +2 -3
- package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/api-key.js +4 -3
- package/dist/auth/plugins/wrappers/phone-number.d.ts +19 -18
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.d.ts +119 -38
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.d.ts +29 -19
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.d.ts +14 -13
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/bin/cli.js +7 -2
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +10 -18
- package/dist/database/puri.d.ts +6 -6
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +1 -1
- package/dist/database/puri.types.d.ts +2 -1
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/upsert-builder.js +1 -1
- package/dist/testing/fixture-manager.js +3 -3
- package/dist/ui-web/assets/index-CfgbCoOJ.js +199 -0
- package/dist/ui-web/assets/index-Dr8pRJC_.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/package.json +14 -12
- package/src/api/config.ts +0 -4
- package/src/api/sonamu.ts +70 -23
- package/src/auth/plugins/entity-definitions/api-key.ts +5 -10
- package/src/auth/plugins/wrappers/api-key.ts +4 -4
- package/src/bin/cli.ts +7 -1
- package/src/database/knex.ts +9 -19
- package/src/database/puri.ts +6 -6
- package/src/database/puri.types.ts +2 -1
- package/src/database/upsert-builder.ts +1 -1
- package/src/skills/AGENTS.md +3 -3
- package/src/skills/project/README.md +1 -3
- package/src/skills/sonamu/auth-plugins.md +21 -13
- package/src/skills/sonamu/auth.md +17 -0
- package/src/skills/sonamu/cdd.md +18 -26
- package/src/skills/sonamu/create-sonamu.md +8 -0
- package/src/skills/sonamu/entity-basic.md +1 -1
- package/src/skills/sonamu/scaffolding.md +13 -0
- package/src/testing/fixture-manager.ts +2 -2
- package/dist/ui-web/assets/index-C-Zz-wYg.css +0 -1
- package/dist/ui-web/assets/index-DejDON8K.js +0 -238
|
@@ -232,7 +232,7 @@ var init_fixture_manager = __esmMin((() => {
|
|
|
232
232
|
currentFixtureRecord.fetchedRecords = fixtures.filter((r) => r.fixtureId !== currentFixtureRecord.fixtureId).slice(initialRecordsLength).map((r) => r.fixtureId);
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
|
-
for
|
|
235
|
+
for (const fixture of fixtures) {
|
|
236
236
|
const entity$1 = EntityManager.get(fixture.entityId);
|
|
237
237
|
const customColumns = duplicateCheck?.columns?.[fixture.entityId];
|
|
238
238
|
if (customColumns && customColumns.length > 0) {
|
|
@@ -437,7 +437,7 @@ var init_fixture_manager = __esmMin((() => {
|
|
|
437
437
|
await trx.raw(`SELECT setval(pg_get_serial_sequence(?, 'id'), ?)`, [tableName, maxId]);
|
|
438
438
|
!isTest() && console.log(chalk.green(`Reset sequence for ${tableName}: ${maxId}`));
|
|
439
439
|
}
|
|
440
|
-
} catch
|
|
440
|
+
} catch {
|
|
441
441
|
!isTest() && console.log(chalk.gray(`Skipped sequence reset for ${tableName}`));
|
|
442
442
|
}
|
|
443
443
|
}
|
|
@@ -718,4 +718,4 @@ var init_fixture_manager = __esmMin((() => {
|
|
|
718
718
|
//#endregion
|
|
719
719
|
init_fixture_manager();
|
|
720
720
|
export { FixtureManager, FixtureManagerClass, init_fixture_manager };
|
|
721
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1tYW5hZ2VyLmpzIiwibmFtZXMiOlsiZmllbGQ6IHN0cmluZyIsImlkOiBudW1iZXIiLCJhcmdzIiwiZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSIsImVudGl0eSIsInJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSIsInJvdyIsInJlY29yZDogRml4dHVyZVJlY29yZCIsInJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSIsInRhYmxlT3JkZXI6IHN0cmluZ1tdIiwicm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsInRhcmdldElkOiBudW1iZXIgfCBzdHJpbmciLCJsZXZlbHM6IEZpeHR1cmVSZWNvcmRbXVtdIiwiY3VycmVudExldmVsOiBGaXh0dXJlUmVjb3JkW10iLCJ3aGVyZUNsYXVzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9maXh0dXJlLW1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGluc3BlY3QgfSBmcm9tIFwidXRpbFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICB0eXBlIERhdGFiYXNlU2NoZW1hRXh0ZW5kLFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRml4dHVyZUltcG9ydFJlc3VsdCxcbiAgdHlwZSBGaXh0dXJlUmVjb3JkLFxuICB0eXBlIEZpeHR1cmVTZWFyY2hPcHRpb25zLFxuICB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSZWxhdGlvbkdyYXBoIH0gZnJvbSBcIi4vX3JlbGF0aW9uLWdyYXBoXCI7XG5cbi8qKiDsgqzsmqnsnpAg7KeA7KCVIOykkeuztSDtmZXsnbgg7Lus65+8IChlbnRpdHlJZOuzhOuhnCDsp4DsoJUpICovXG5leHBvcnQgaW50ZXJmYWNlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB7XG4gIGNvbHVtbnM/OiB7XG4gICAgW2VudGl0eUlkOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIF90ZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLl90ZGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fdGRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90ZGI7XG4gIH1cblxuICBwcml2YXRlIF9mZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLl9mZGIgPSBmZGI7XG4gIH1cbiAgZ2V0IGZkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fZmRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mZGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNraXBwZWRGaXh0dXJlczogTWFwPHN0cmluZywgeyBlbnRpdHlJZDogc3RyaW5nOyBleGlzdGluZ0lkOiBudW1iZXIgfCBzdHJpbmcgfT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl90ZGIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNvbmFtdS5kYkNvbmZpZy50ZXN0ICYmIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlcikge1xuICAgICAgY29uc3QgdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBwQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcblxuICAgIC8vIDMuIOyLnO2AgOyKpCDrpqzshYsgKOuNsOydtO2EsCDrs7Xsgqwg7ZuEIOyLnO2AgOyKpOulvCBNQVgoaWQp66GcIOygleugrClcbiAgICBhd2FpdCB0aGlzLnJlc2V0U2VxdWVuY2VzKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqqjrk6Ag7YWM7J2067iU7J2YIOyLnO2AgOyKpOulvCDtmITsnqwgTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAqIGZpeHR1cmUgc3luYyDtm4Qg7Iuc7YCA7Iqk6rCAIOyLpOygnCDrjbDsnbTthLDsmYAg66ee7KeAIOyViuuKlCDrrLjsoJzrpbwg7ZW06rKw7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFNlcXVlbmNlcyhkYkNvbmZpZzogU29uYW11REJDb25maWdbXCJ0ZXN0XCJdKSB7XG4gICAgY29uc3QgdGVzdERiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcbiAgICBjb25zdCBlbnRpdGllcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGUgfHwgZW50aXR5LmlkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDtmZXsnbjtlanri4jri6RcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gaWRQcm9wPy50eXBlO1xuXG4gICAgICAgIC8vIGludGVnZXIvYmlnSW50ZWdlcuydtOqxsOuCmCwgc3RyaW5n7J207KeA66eMIGZpeHR1cmVTdHJhdGVneT1zZXF1ZW5jZeyduCDqsr3smrDsl5Drp4wg66as7IWL7ZWp64uI64ukXG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgaWRUeXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGlkVHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiO1xuXG4gICAgICAgIGlmICghdXNlc1NlcXVlbmNlKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgYFNraXBwaW5nIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvc3RncmVTUUwg7Iuc7YCA7Iqk66W8IO2YhOyerCDthYzsnbTruJTsnZggTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAgICAgIC8vIHN0cmluZyDtg4DsnoXsnZgg6rK97JqwIOyIq+yekCDsupDsiqTtjIXsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgICBjb25zdCBtYXhFeHByID0gaWRUeXBlID09PSBcInN0cmluZ1wiID8gXCJNQVgoaWQ6OmJpZ2ludClcIiA6IFwiTUFYKGlkKVwiO1xuICAgICAgICBhd2FpdCB0ZXN0RGIucmF3KGBcbiAgICAgICAgICBTRUxFQ1Qgc2V0dmFsKFxuICAgICAgICAgICAgcGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZSgncHVibGljLiR7dGFibGVOYW1lfScsICdpZCcpLFxuICAgICAgICAgICAgQ09BTEVTQ0UoKFNFTEVDVCAke21heEV4cHJ9IEZST00gJHt0YWJsZU5hbWV9KSwgMSlcbiAgICAgICAgICApXG4gICAgICAgIGApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0ZXN0RGIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgYXdhaXQgd2RiLnJhdyhxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnRvUmV2ZXJzZWQoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzb3VyY2VEQk5hbWVdKTtcbiAgICBjb25zdCB0YXJnZXREQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZmllbGQsIHZhbHVlLCBzZWFyY2hUeXBlIH0gPSBzZWFyY2hPcHRpb25zO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICBlbnRpdHkucHJvcHMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBmaWVsZCk/LnR5cGUgPT09IFwicmVsYXRpb25cIlxuICAgICAgICAgID8gYCR7ZmllbGR9X2lkYFxuICAgICAgICAgIDogZmllbGQ7XG5cbiAgICAgIGxldCBxdWVyeSA9IHNvdXJjZURCKGVudGl0eS50YWJsZSk7XG4gICAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09PSBcImxpa2VcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZWNvcmRzTGVuZ3RoID0gZml4dHVyZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgICAgX2RiOiBzb3VyY2VEQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlUmVjb3JkID0gZml4dHVyZXMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IGAke2VudGl0eUlkfSMke3Jvdy5pZH1gKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpeHR1cmVSZWNvcmQpIHtcbiAgICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgICAgY3VycmVudEZpeHR1cmVSZWNvcmQuZmV0Y2hlZFJlY29yZHMgPSBmaXh0dXJlc1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5maXh0dXJlSWQgIT09IGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZpeHR1cmVJZClcbiAgICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICAgIGN1c3RvbUNvbHVtbnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIGN1c3RvbUR1cGxpY2F0ZVJvdywge1xuICAgICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZpeHR1cmUudGFyZ2V0ID0gcmVjb3JkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuaXF1ZSBpbmRleCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgZml4dHVyZS51bmlxdWVcbiAgICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgICAgaWYgKHVuaXF1ZVJvdykge1xuICAgICAgICAgIGNvbnN0IFtyZWNvcmRdID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlxdWUoZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbdGFyZ2V0REIuZGVzdHJveSgpLCBzb3VyY2VEQi5kZXN0cm95KCldKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvdzoge1xuICAgICAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBfZGI/OiBLbmV4O1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHJvdzoge1xuICAgICAgICBpZDogbnVtYmVyIHwgc3RyaW5nO1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH0sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogcm93W3Byb3AubmFtZV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5fZGIgPz8gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRocm91Z2hUYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IGZyb21Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0b0NvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYih0aHJvdWdoVGFibGUpLndoZXJlKGZyb21Db2x1bW4sIHJvdy5pZCkucGx1Y2sodG9Db2x1bW4pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKVxuICAgICAgICAgICAgLndoZXJlKHByb3Auam9pbkNvbHVtbiwgcm93LmlkKVxuICAgICAgICAgICAgLnBsdWNrKFwiaWRcIik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiAhcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgLy8g7Jet67Cp7ZalIE9uZVRvT25lOiBGS+ulvCDqsIDsp4Qg6rSA66CoIOyXlO2LsO2LsOulvCDssL7sirXri4jri6RcbiAgICAgICAgICAvLyDsmIjsi5w6IFVzZXIgT25lVG9PbmUgRW1wbG95ZWUgKEVtcGxveWVl6rCAIHVzZXJfaWQgRkvrpbwg6rCA7KeQKVxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRQcm9wID0gcmVsYXRlZEVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRQcm9wICYmIGlzUmVsYXRpb25Qcm9wKHJlbGF0ZWRQcm9wKSkge1xuICAgICAgICAgICAgLy8g6rSA66CoIOyXlO2LsO2LsOyXkOyEnCBGSyDsu6zrn7zsnLzroZwg7L+866as7ZWp64uI64ukIChpZOqwgCDslYTri5gpXG4gICAgICAgICAgICBjb25zdCBma0NvbHVtbiA9IGAke3JlbGF0ZWRQcm9wLm5hbWV9X2lkYDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShma0NvbHVtbiwgcm93LmlkKS5maXJzdCgpO1xuICAgICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRSb3c/LmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZCA9IHJvd1tgJHtwcm9wLm5hbWV9X2lkYF07XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICBpZiAocmVsYXRlZElkKSB7XG4gICAgICAgICAgICByZWNvcmQuYmVsb25nc1JlY29yZHMucHVzaChgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW9wdGlvbnM/LnNpbmdsZVJlY29yZCAmJiByZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgcmVsYXRlZElkKS5maXJzdCgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlKHJlbGF0ZWRFbnRpdHksIHJlbGF0ZWRSb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICB9O1xuXG4gICAgYXdhaXQgY3JlYXRlKGVudGl0eSwgcm93KTtcblxuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrAgKHNlbGYtcmVmZXJlbmNlIO2PrO2VqClcbiAgICogMi4g7YWM7J2067iU67OEIOugiOuyqOuzhOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSDrsI8gdXBzZXJ0IOyLpO2WiVxuICAgKiAzLiDsiJzshJwg6riw67CYIHV1aWTihpJpZCDrp6TtlZEgKFVwc2VydEJ1aWxkZXLqsIAgdXVpZOulvCBEQuyXkCDsoIDsnqXtlZjsp4Ag7JWK7Jy866+A66GcKVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy64qUIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWY7JesIOqwgSB1cHNlcnQg7Zi47Lac7JeQ7ISc64qUXG4gICAqIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuPhOuhnSDtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBpbnNlcnRGaXh0dXJlcyhcbiAgICBkYk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIF9maXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGZpeHR1cmVzID0gdW5pcXVlKF9maXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcblxuICAgIC8vIOy0iOq4sO2ZlFxuICAgIHRoaXMuYnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8g67OR66CsIO2FjOyKpO2KuCDrqqjrk5zsl5DshJzripQgd29ya2Vy67OEIERC7JeQIOyggOyepVxuICAgIGNvbnN0IGRiQ29uZmlnID1cbiAgICAgIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiICYmIHByb2Nlc3MuZW52LlZJVEVTVF9QT09MX0lEXG4gICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgPz8gXCIxXCIsIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBTb25hbXUuZGJDb25maWdbZGJOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBiYXNlQ29uZmlnLmNvbm5lY3Rpb24gYXMgeyBkYXRhYmFzZTogc3RyaW5nIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5iYXNlQ29uZmlnLFxuICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7IC4uLmNvbm5lY3Rpb24sIGRhdGFiYXNlOiBgJHtjb25uZWN0aW9uLmRhdGFiYXNlfV8ke3dvcmtlcklkfWAgfSxcbiAgICAgICAgICAgICAgcG9vbDogeyBtaW46IDEsIG1heDogMSB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSgpXG4gICAgICAgIDogU29uYW11LmRiQ29uZmlnW2RiTmFtZV07XG4gICAgY29uc3QgZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoZGJDb25maWcpO1xuICAgIGNvbnN0IHJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrBcbiAgICAgIHRoaXMucmVsYXRpb25HcmFwaC5idWlsZEdyYXBoKGZpeHR1cmVzKTtcbiAgICAgIGNvbnN0IGluc2VydGlvbk9yZGVyID0gdGhpcy5yZWxhdGlvbkdyYXBoLmdldEluc2VydGlvbk9yZGVyKCk7XG5cbiAgICAgIC8vIDIuIOyKpO2Cte2VoCBmaXh0dXJlIOuovOyggCDsspjrpqwgKG92ZXJyaWRlIOyytO2BrClcbiAgICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIGluc2VydGlvbk9yZGVyKSB7XG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBmaXh0dXJlcy5maW5kKChmKSA9PiBmLmZpeHR1cmVJZCA9PT0gZml4dHVyZUlkKTtcbiAgICAgICAgaWYgKCFmaXh0dXJlKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBoYXNUYXJnZXQgPSAhIWZpeHR1cmUudGFyZ2V0O1xuICAgICAgICBjb25zdCBoYXNVbmlxdWUgPSAhIWZpeHR1cmUudW5pcXVlO1xuICAgICAgICBjb25zdCBoYXNEdXBsaWNhdGUgPSBoYXNUYXJnZXQgfHwgaGFzVW5pcXVlO1xuXG4gICAgICAgIC8vIOykkeuzteydtCDsnojqs6Agb3ZlcnJpZGU9ZmFsc2Xsnbgg6rK97JqwOiDsiqTtgrVcbiAgICAgICAgaWYgKGhhc0R1cGxpY2F0ZSAmJiAhZml4dHVyZS5vdmVycmlkZSkge1xuICAgICAgICAgIC8vIOq4sOyhtCDroIjsvZTrk5wgSUQg7KCA7J6lICh1bmlxdWUg7Jqw7ISgLCDsl4bsnLzrqbQgdGFyZ2V0KVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBmaXh0dXJlLnVuaXF1ZT8uaWQgPz8gZml4dHVyZS50YXJnZXQ/LmlkO1xuICAgICAgICAgIGFzc2VydChleGlzdGluZ0lkKTtcbiAgICAgICAgICB0aGlzLnNraXBwZWRGaXh0dXJlcy5zZXQoZml4dHVyZUlkLCB7XG4gICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgIGV4aXN0aW5nSWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYFNraXBwZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9IChleGlzdGluZzogIyR7ZXhpc3RpbmdJZH0sIG92ZXJyaWRlOiBmYWxzZSlgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgZml4dHVyZSDqt7jro7ntmZQgKGluc2VydGlvbk9yZGVyIOyInOyEnCDquLDrsJgpXG4gICAgICBjb25zdCBmaXh0dXJlc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgRml4dHVyZVJlY29yZFtdPigpO1xuICAgICAgY29uc3QgdGFibGVPcmRlcjogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmUg7KCc7Jm4XG4gICAgICAgIGlmICh0aGlzLnNraXBwZWRGaXh0dXJlcy5oYXMoZml4dHVyZUlkKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGU7XG5cbiAgICAgICAgaWYgKCFmaXh0dXJlc0J5VGFibGUuaGFzKHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICBmaXh0dXJlc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgW10pO1xuICAgICAgICAgIHRhYmxlT3JkZXIucHVzaCh0YWJsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKT8ucHVzaChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICBjb25zdCBpbnNlcnRlZElkc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4oKTtcblxuICAgICAgICAvLyA0LiDthYzsnbTruJTrs4Qg66CI67Ko67OEIOyymOumrFxuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVGaXh0dXJlcyA9IGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBbXTtcbiAgICAgICAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmdyb3VwRml4dHVyZXNCeUxldmVsKHRhYmxlRml4dHVyZXMpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsZXZlbEZpeHR1cmVzIG9mIGxldmVscykge1xuICAgICAgICAgICAgLy8g7ZW064u5IOugiOuyqOydmCBmaXh0dXJl65OkIHJlZ2lzdGVyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgbGV2ZWxGaXh0dXJlcykge1xuICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRml4dHVyZShmaXh0dXJlLCBpbnNlcnRlZElkc0J5VGFibGUpO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICAgIGBSZWdpc3RlcmVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSR7Zml4dHVyZS5vdmVycmlkZSA/IGAgKG92ZXJyaWRlKWAgOiBcIlwifWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwc2VydCDsi6Ttlokg7KCEIHV1aWQg66qp66GdIOyggOyepVxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmJ1aWxkZXIuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LnV1aWQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICBgVXBzZXJ0aW5nICR7dGFibGVOYW1lfSB3aXRoICR7dXVpZHMubGVuZ3RofSByb3dzIChsZXZlbCAke2xldmVscy5pbmRleE9mKGxldmVsRml4dHVyZXMpICsgMX0vJHtsZXZlbHMubGVuZ3RofSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSAoYXdhaXQgdGhpcy5idWlsZGVyLnVwc2VydChcbiAgICAgICAgICAgICAgdHJ4LFxuICAgICAgICAgICAgICB0YWJsZU5hbWUgYXMga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gICAgICAgICAgICApKSBhcyAobnVtYmVyIHwgc3RyaW5nKVtdO1xuXG4gICAgICAgICAgICAvLyDsiJzshJwg6riw67CYIHV1aWQgLT4gaWQg66ek7ZWRXG4gICAgICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDsl4bsnLzrr4DroZwg65Ox66GdIOyInOyEnCA9IOuwmO2ZmCDsiJzshJwg67O07J6lXG4gICAgICAgICAgICBpZiAodXVpZHMubGVuZ3RoID4gMCAmJiB1dWlkcy5sZW5ndGggPT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdNYXAgPVxuICAgICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBuZXcgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPigpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHV1aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdNYXAuc2V0KHV1aWRzW2ldLCBpZHNbaV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBleGlzdGluZ01hcCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHV1aWRzLmxlbmd0aCAhPT0gaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgICAgYFdhcm5pbmc6IHV1aWQgY291bnQgKCR7dXVpZHMubGVuZ3RofSkgIT0gaWQgY291bnQgKCR7aWRzLmxlbmd0aH0pIGZvciAke3RhYmxlTmFtZX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gTWFueVRvTWFueSDqtIDqs4Qg7LKY66asXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnModHJ4LCBmaXh0dXJlcywgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcblxuICAgICAgICAvLyA2LiBQb3N0Z3JlU1FMIOyLnO2AgOyKpCDrpqzshYtcbiAgICAgICAgLy8gRml4dHVyZSDsgr3snoUg7ZuEIOqwgSDthYzsnbTruJTsnZggSUQg7Iuc7YCA7Iqk66W8IOy1nOuMgCBJRCDqsJLsnLzroZwg7JeF642w7J207Yq47ZWp64uI64ukLlxuICAgICAgICAvLyDsnbTroIfqsowg7ZWY7KeAIOyViuycvOuptCDri6TsnYwgSU5TRVJUIOyLnCBJROqwgCAyMDAw67KI64yA66GcIOyDneyEseuQoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJlc2V0dGluZyBzZXF1ZW5jZXMuLi5cIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEVudGl0eeulvCDssL7slYTshJwgaWQg7YOA7J6FIO2ZleyduFxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpLmZpbmQoXG4gICAgICAgICAgICAgIChlKSA9PiBlLnRhYmxlID09PSB0YWJsZU5hbWUgfHwgZS5pZC50b0xvd2VyQ2FzZSgpID09PSB0YWJsZU5hbWUsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgICAgICAgIGNvbnN0IGlkVHlwZSA9IGlkUHJvcD8udHlwZTtcblxuICAgICAgICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXLsnbTqsbDrgpgsIHN0cmluZ+ydtOyngOunjCBmaXh0dXJlU3RyYXRlZ3k9c2VxdWVuY2Xsnbgg6rK97Jqw7JeQ66eMIOumrOyFi+2VqeuLiOuLpFxuICAgICAgICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgICAgICAgIGlkVHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICAgICAgICBpZFR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcblxuICAgICAgICAgICAgICBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgYFNraXBwZWQgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfSAoaWQgdHlwZTogJHtpZFR5cGUgfHwgXCJ1bmtub3duXCJ9KWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2FjOydtOu4lOydmCDstZzrjIAgSUQg7KGw7ZqMIChzdHJpbmcg7YOA7J6F7J2AIOyIq+yekCDsupDsiqTtjIUg7ZWE7JqUKVxuICAgICAgICAgICAgY29uc3QgZW50aXR5MiA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKS5maW5kKFxuICAgICAgICAgICAgICAoZSkgPT4gZS50YWJsZSA9PT0gdGFibGVOYW1lIHx8IGUuaWQudG9Mb3dlckNhc2UoKSA9PT0gdGFibGVOYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGlkVHlwZTIgPSBlbnRpdHkyPy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik/LnR5cGU7XG4gICAgICAgICAgICBjb25zdCBtYXhJZFJlc3VsdCA9XG4gICAgICAgICAgICAgIGlkVHlwZTIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IGF3YWl0IHRyeFxuICAgICAgICAgICAgICAgICAgICAucmF3KGBTRUxFQ1QgTUFYKGlkOjpiaWdpbnQpIGFzIG1heF9pZCBGUk9NIFwiJHt0YWJsZU5hbWV9XCJgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4gci5yb3dzWzBdKVxuICAgICAgICAgICAgICAgIDogYXdhaXQgdHJ4KHRhYmxlTmFtZSkubWF4KFwiaWQgYXMgbWF4X2lkXCIpLmZpcnN0KCk7XG4gICAgICAgICAgICBjb25zdCBtYXhJZCA9IG1heElkUmVzdWx0Py5tYXhfaWQ7XG5cbiAgICAgICAgICAgIGlmIChtYXhJZCAhPT0gbnVsbCAmJiBtYXhJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIOyLnO2AgOyKpOuqheydhCBwZ19nZXRfc2VyaWFsX3NlcXVlbmNl66GcIOyViOyghO2VmOqyjCDsobDtmoxcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4LnJhdyhgU0VMRUNUIHNldHZhbChwZ19nZXRfc2VyaWFsX3NlcXVlbmNlKD8sICdpZCcpLCA/KWAsIFtcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgbWF4SWQsXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFJlc2V0IHNlcXVlbmNlIGZvciAke3RhYmxlTmFtZX06ICR7bWF4SWR9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgIC8vIOyLnO2AgOyKpOqwgCDsl4bripQg7YWM7J2067iUKGpvaW4gdGFibGUg65OxKeydgCDrrLTsi5xcbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNy4g6rKw6rO8IOyImOynkVxuICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJl64qUIOq4sOyhtCDroIjsvZTrk5wg7KCV67O066GcIOqysOqzvCDstpTqsIBcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgc2tpcHBlZC5leGlzdGluZ0lkKS5maXJzdCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkSWQgPSB1dWlkVG9JZD8uZ2V0KHJlZi51dWlkKTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgaW5zZXJ0ZWRJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZShyZXN1bHRzLCAocikgPT4gYCR7ci5lbnRpdHlJZH0jJHtyLmRhdGEuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZVJlY29yZOulvCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnVxuICAgKiBAcGFyYW0gaW5zZXJ0ZWRJZHNCeVRhYmxlIOydtOuvuCB1cHNlcnTrkJwg7YWM7J2067iU7J2YIHV1aWTihpJpZCDrp6TtlZEgKOugiOuyqOuzhCDsspjrpqwg7IucIOyCrOyaqSlcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJGaXh0dXJlKFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICBjb25zdCByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICAvLyBPdmVycmlkZSDrqqjrk5wg7YyQ64uoOiB0YXJnZXQg65iQ64qUIHVuaXF1ZeqwgCDsnojqs6Agb3ZlcnJpZGU9dHJ1ZeyduCDqsr3smrBcbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGZpeHR1cmUudGFyZ2V0ID8/IGZpeHR1cmUudW5pcXVlO1xuICAgIGNvbnN0IGlzT3ZlcnJpZGVNb2RlID0gZml4dHVyZS5vdmVycmlkZSAmJiBleGlzdGluZ1JlY29yZDtcblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb2x1bW5dIG9mIE9iamVjdC5lbnRyaWVzKGZpeHR1cmUuY29sdW1ucykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlZCBjb2x1bW7snYAgSU5TRVJU7JeQ7IScIOygnOyZuCAoRELqsIAg7J6Q64+ZIOyDneyEsSlcbiAgICAgIGlmIChcImdlbmVyYXRlZFwiIGluIHByb3AgJiYgcHJvcC5nZW5lcmF0ZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlkIOyymOumrFxuICAgICAgaWYgKHByb3BOYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgLy8gcGFyZW50SWQg7JeU7Yuw7Yuw7J2YIGlk64qUIOu2gOuqqCDsl5Tti7Dti7DsnZggRkvsnbTrr4DroZwg7Iuc7YCA7IqkIOuvuOyCrOyaqSAo66qF7Iuc7KCB7Jy866GcIO2PrO2VqClcbiAgICAgICAgY29uc3QgdXNlc1NlcXVlbmNlID1cbiAgICAgICAgICAhZW50aXR5LnBhcmVudElkICYmXG4gICAgICAgICAgKGlkUHJvcD8udHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICAgIGlkUHJvcD8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICAgIGlkUHJvcD8uY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCIpO1xuXG4gICAgICAgIGlmIChpc092ZXJyaWRlTW9kZSAmJiBleGlzdGluZ1JlY29yZCkge1xuICAgICAgICAgIC8vIE92ZXJyaWRlOiDquLDsobQg66CI7L2U65Oc7J2YIOqwkiDsgqzsmqkg4oaSIFVQREFURVxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBleGlzdGluZ1JlY29yZC5jb2x1bW5zW3Byb3BOYW1lXT8udmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgIC8vIHN0cmluZyBQSyDrmJDripQgcGFyZW50SWQg7JeU7Yuw7YuwIEZLOiDsg53shLHrkJwgaWQg6rCS7J2EIElOU0VSVOyXkCDtj6ztlahcbiAgICAgICAgICByb3dbcHJvcE5hbWVdID0gY29sdW1uLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGludGVnZXIvYmlnSW50ZWdlciBQSzogREIg7Iuc7YCA7Iqk7JeQIOunoeq5gCAo6rCSIOygnOyZuClcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZCA9IGNvbHVtbi52YWx1ZSBhcyBudW1iZXIgfCBudWxsO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQgIT09IG51bGwgJiYgcmVsYXRlZElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG5cbiAgICAgICAgICAgIC8vIOuovOyggCBza2lw65CcIGZpeHR1cmXsnbjsp4Ag7ZmV7J24XG4gICAgICAgICAgICBjb25zdCBza2lwcGVkRXhpc3RpbmdJZCA9IHRoaXMuc2tpcHBlZEZpeHR1cmVzLmdldChyZWxhdGVkRml4dHVyZUlkKT8uZXhpc3RpbmdJZDtcbiAgICAgICAgICAgIGlmIChza2lwcGVkRXhpc3RpbmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIHNraXDrkJwgZml4dHVyZSDihpIgdGFyZ2V0IERC7J2YIOq4sOyhtCDroIjsvZTrk5wgaWQg7IKs7JqpXG4gICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHNraXBwZWRFeGlzdGluZ0lkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQocmVsYXRlZEZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGVkUmVmKSB7XG4gICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQnCDqsJnsnYAg7YWM7J2067iUIGZpeHR1cmUg7ZmV7J24XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEluc2VydGVkSWRzID0gaW5zZXJ0ZWRJZHNCeVRhYmxlPy5nZXQocmVsYXRlZEVudGl0eS50YWJsZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsSWQgPSByZWxhdGVkSW5zZXJ0ZWRJZHM/LmdldChyZWxhdGVkUmVmLnV1aWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFjdHVhbElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIOydtOuvuCB1cHNlcnTrkKgg4oaSIOyLpOygnCBJRCDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IGFjdHVhbElkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyDslYTsp4EgdXBzZXJ0IOyViOuQqCDihpIgVUJSZWYg7IKs7JqpXG4gICAgICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSByZWxhdGVkUmVmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmaXh0dXJlc+yXkCDtj6ztlajrkJjsp4Ag7JWK7J2AIOugiOy9lOuTnCDihpIgSUQg6re464yA66GcIOyCrOyaqVxuICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYXNNYW55LCBNYW55VG9NYW5564qUIOuzhOuPhCDsspjrpqxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDsu6zrn7xcbiAgICAgICAgcm93W3Byb3BOYW1lXSA9IHRoaXMuY29udmVydENvbHVtblZhbHVlKHByb3AgYXMgRW50aXR5UHJvcCwgY29sdW1uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFJlZ2lzdGVyaW5nICR7ZW50aXR5LnRhYmxlfSAtICR7aW5zcGVjdChyb3csIGZhbHNlLCBudWxsLCB0cnVlKX1gKSk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5idWlsZGVyLnJlZ2lzdGVyKGVudGl0eS50YWJsZSwgcm93KTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAuc2V0KGZpeHR1cmUuZml4dHVyZUlkLCByZWYpO1xuXG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6zrn7wg6rCSIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q29sdW1uVmFsdWUocHJvcDogRW50aXR5UHJvcCwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIC8vIFVwc2VydEJ1aWxkZXIucmVnaXN0ZXLsl5DshJwgSlNPTi5zdHJpbmdpZnkg7LKY66as7ZWY66+A66GcIG9iamVjdCDqt7jrjIDroZwg7KCE64usXG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMoXG4gICAgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHNvdXJjZVJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgICBpZiAoIXNvdXJjZVJlZikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHNvdXJjZVV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VVdWlkVG9JZD8uZ2V0KHNvdXJjZVJlZi51dWlkKTtcblxuICAgICAgaWYgKHNvdXJjZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi52YWx1ZSkpIHtcbiAgICAgICAgICAvLyDshKDtg53rkJjsp4Ag7JWK7J2AIE1hbnlUb01hbnkg6rSA6rOE64qUIOyggOyepe2VmOyngCDslYrsnYxcbiAgICAgICAgICBjb25zdCB0YXJnZXRUYWJsZSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmJ1aWxkZXIuaGFzVGFibGUodGFyZ2V0VGFibGUudGFibGUpKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyW107XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SWQ6IG51bWJlciB8IHN0cmluZztcblxuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IHJlbGF0ZWRVdWlkVG9JZD8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIGBSZWxhdGVkIGZpeHR1cmUgJHtyZWxhdGVkRml4dHVyZUlkfSBub3QgZm91bmQgaW4gaW5zZXJ0ZWRJZHMsIHNraXBwaW5nYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVzb2x2ZWRJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBKb2luVGFibGXsl5Ag7IK97J6FXG4gICAgICAgICAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgdHJ4KGpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgLndoZXJlKHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAubGltaXQoMSk7XG5cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4KGpvaW5UYWJsZSkuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwmeydgCDthYzsnbTruJQg64K0IGZpeHR1cmXrk6TsnYQgc2VsZi1yZWZlcmVuY2Ug66CI67Ko67OE66GcIOu2hO2VoFxuICAgKiAtIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuKlCBmaXh0dXJl65OkOiBMZXZlbCAwXG4gICAqIC0gTGV2ZWwgMOydhCDssLjsobDtlZjripQgZml4dHVyZeuTpDogTGV2ZWwgMVxuICAgKiAtIOuwmOuztVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy6rCAIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuXG4gICAqIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0IEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBncm91cEZpeHR1cmVzQnlMZXZlbChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogRml4dHVyZVJlY29yZFtdW10ge1xuICAgIGlmIChmaXh0dXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlc1swXS5lbnRpdHlJZCk7XG5cbiAgICAvLyBzZWxmLXJlZmVyZW5jZSByZWxhdGlvbiBwcm9wIOywvuq4sFxuICAgIGNvbnN0IHNlbGZSZWZQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoXG4gICAgICAocCk6IHAgaXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIHwgT25lVG9PbmVSZWxhdGlvblByb3AgPT5cbiAgICAgICAgaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHApICYmIHAuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZlJlZlByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gc2VsZi1yZWZlcmVuY2Ug7JeG7J2MIOKGkiDri6jsnbwg66CI67KoXG4gICAgICByZXR1cm4gW2ZpeHR1cmVzXTtcbiAgICB9XG5cbiAgICAvLyDroIjrsqjrs4Qg67aE7ZWgICh0b3BvbG9naWNhbCBzb3J0KVxuICAgIGNvbnN0IGxldmVsczogRml4dHVyZVJlY29yZFtdW10gPSBbXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBuZXcgU2V0KGZpeHR1cmVzLm1hcCgoZikgPT4gZi5maXh0dXJlSWQpKTtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHdoaWxlIChyZW1haW5pbmcuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBpZiAoIXJlbWFpbmluZy5oYXMoZml4dHVyZS5maXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDrqqjrkZAg7J2066+4IOyymOumrOuQkOqxsOuCmCBudWxs7J24IOqyveyasFxuICAgICAgICBjb25zdCBjYW5Qcm9jZXNzID0gc2VsZlJlZlByb3BzLmV2ZXJ5KChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmSWQgPSBmaXh0dXJlLmNvbHVtbnNbcHJvcC5uYW1lXT8udmFsdWUgYXMgbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgICBpZiAocmVmSWQgPT09IG51bGwgfHwgcmVmSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgY29uc3QgcmVmRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlZklkfWA7XG4gICAgICAgICAgLy8g7J2066+4IOyymOumrOuQkOqxsOuCmCwg7ZiE7J6sIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg6rK97JqwICjsmbjrtoAg7LC47KGwKVxuICAgICAgICAgIHJldHVybiBwcm9jZXNzZWQuaGFzKHJlZkZpeHR1cmVJZCkgfHwgIXJlbWFpbmluZy5oYXMocmVmRml4dHVyZUlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNhblByb2Nlc3MpIHtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwucHVzaChmaXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudExldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCByZW1haW5pbmdJZHMgPSBBcnJheS5mcm9tKHJlbWFpbmluZykuam9pbihcIiwgXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENpcmN1bGFyIHNlbGYtcmVmZXJlbmNlIGRldGVjdGVkIGluICR7ZW50aXR5LnRhYmxlfS4gUmVtYWluaW5nIGZpeHR1cmVzOiAke3JlbWFpbmluZ0lkc31gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIHJlbWFpbmluZy5kZWxldGUoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICBwcm9jZXNzZWQuYWRkKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgIH1cblxuICAgICAgbGV2ZWxzLnB1c2goY3VycmVudExldmVsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1VuaXF1ZVZpb2xhdGlvbihkYjogS25leCwgZW50aXR5OiBFbnRpdHksIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQpIHtcbiAgICBjb25zdCBfdW5pcXVlSW5kZXhlcyA9IGVudGl0eS5pbmRleGVzPy5maWx0ZXIoKGkpID0+IGkudHlwZSA9PT0gXCJ1bmlxdWVcIikgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gX3VuaXF1ZUluZGV4ZXMuZmlsdGVyKChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKGNvbHVtbikgPT4gIWNvbHVtbi5uYW1lLnN0YXJ0c1dpdGgoYCR7ZW50aXR5LnRhYmxlfV9fYCkpLFxuICAgICk7XG4gICAgaWYgKHVuaXF1ZUluZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgdW5pcXVlUXVlcnkgPSBkYihlbnRpdHkudGFibGUpO1xuICAgIGxldCBoYXNDb25kaXRpb24gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdW5pcXVlSW5kZXhlcykge1xuICAgICAgLy8g7Lus65+8IOykkSDtlZjrgpjrnbzrj4QgbnVsbOydtOuptCDsnKDri4jtgawg7KCc7JW97J2EIOychOuwmO2VmOyngCDslYrquLAg65WM66y47JeQIO2VtOuLuSDsnbjrjbHsiqTripQg66y07IucXG4gICAgICBjb25zdCBjb250YWluc051bGwgPSBpbmRleC5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlID09PSBudWxsO1xuICAgICAgfSk7XG4gICAgICBpZiAoY29udGFpbnNOdWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB1bmlxdWVRdWVyeSA9IHVuaXF1ZVF1ZXJ5Lm9yV2hlcmUoKHFiKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGluZGV4LmNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5uYW1lLnJlcGxhY2UoL19pZCQvLCBcIlwiKTtcblxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKSkge1xuICAgICAgICAgICAgcWIud2hlcmVJbihjb2x1bW4ubmFtZSwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXS52YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHFiLmFuZFdoZXJlKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGhhc0NvbmRpdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IFt1bmlxdWVGb3VuZF0gPSBhd2FpdCB1bmlxdWVRdWVyeTtcbiAgICByZXR1cm4gdW5pcXVlRm91bmQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrRHVwbGljYXRlQnlDb2x1bW5zKFxuICAgIGRiOiBLbmV4LFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICkge1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgd2hlcmVDbGF1c2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAvLyByZWxhdGlvbiDtlYTrk5zsnbgg6rK97JqwIF9pZCDrtpnsnbTquLBcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW4pO1xuICAgICAgY29uc3QgZGJDb2x1bW4gPSBwcm9wICYmIGlzUmVsYXRpb25Qcm9wKHByb3ApID8gYCR7Y29sdW1ufV9pZGAgOiBjb2x1bW47XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpeHR1cmUuY29sdW1uc1tjb2x1bW5dPy52YWx1ZTtcblxuICAgICAgLy8gbnVsbCDqsJLsnbQg7Y+s7ZWo65CcIOqyveyasCDspJHrs7Ug7ZmV7J24IOyKpO2CtVxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHdoZXJlQ2xhdXNlW2RiQ29sdW1uXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCBkYihlbnRpdHkudGFibGUpLndoZXJlKHdoZXJlQ2xhdXNlKS5saW1pdCgxKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRGaXh0dXJlTG9hZGVyKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy90ZXN0aW5nL2ZpeHR1cmUudHNgO1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGF0aCkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJTdGFydCA9IGNvbnRlbnQuaW5kZXhPZihcImNvbnN0IGZpeHR1cmVMb2FkZXIgPSB7XCIpO1xuICAgIGNvbnN0IGZpeHR1cmVMb2FkZXJFbmQgPSBjb250ZW50LmluZGV4T2YoXCJ9O1wiLCBmaXh0dXJlTG9hZGVyU3RhcnQpO1xuXG4gICAgaWYgKGZpeHR1cmVMb2FkZXJTdGFydCAhPT0gLTEgJiYgZml4dHVyZUxvYWRlckVuZCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtjb250ZW50LnNsaWNlKDAsIGZpeHR1cmVMb2FkZXJFbmQpfSAgJHtjb2RlfVxcbiR7Y29udGVudC5zbGljZShmaXh0dXJlTG9hZGVyRW5kKX1gO1xuXG4gICAgICB3cml0ZUZpbGVTeW5jKHBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBmaXh0dXJlTG9hZGVyIGluIGZpeHR1cmUudHNcIik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGaXh0dXJlTWFuYWdlciA9IG5ldyBGaXh0dXJlTWFuYWdlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBVXVDO2tCQUNZO1lBRUc7c0JBQ0s7c0JBR0Y7YUFRakM7a0JBVXFCO3VCQUNLO0NBU3JDLHNCQUFiLE1BQWlDO0VBQy9CLEFBQVEsT0FBb0I7RUFDNUIsSUFBSSxJQUFJLEtBQVc7QUFDakIsUUFBSyxPQUFPOztFQUVkLElBQUksTUFBWTtBQUNkLE9BQUksS0FBSyxTQUFTLE1BQU07QUFDdEIsVUFBTSxJQUFJLE1BQU0sMENBQTBDOztBQUU1RCxVQUFPLEtBQUs7O0VBR2QsQUFBUSxPQUFvQjtFQUM1QixJQUFJLElBQUksS0FBVztBQUNqQixRQUFLLE9BQU87O0VBRWQsSUFBSSxNQUFZO0FBQ2QsT0FBSSxLQUFLLFNBQVMsTUFBTTtBQUN0QixVQUFNLElBQUksTUFBTSwwQ0FBMEM7O0FBRTVELFVBQU8sS0FBSzs7RUFFZCxtQkFBb0M7RUFFcEMsQUFBUSxnQkFBZ0IsSUFBSSxlQUFlO0VBRzNDLEFBQVEsVUFBeUIsSUFBSSxlQUFlO0VBQ3BELEFBQVEsZ0JBQW9DLElBQUksS0FBSztFQUNyRCxBQUFRLGtCQUNOLElBQUksS0FBSztFQUVYLE9BQU87QUFDTCxPQUFJLEtBQUssU0FBUyxNQUFNO0FBQ3RCOztBQUVGLE9BQUksT0FBTyxTQUFTLFFBQVEsT0FBTyxTQUFTLG1CQUFt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
|
|
721
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1tYW5hZ2VyLmpzIiwibmFtZXMiOlsiZmllbGQ6IHN0cmluZyIsImlkOiBudW1iZXIiLCJhcmdzIiwiZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSIsImVudGl0eSIsInJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSIsInJvdyIsInJlY29yZDogRml4dHVyZVJlY29yZCIsInJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSIsInRhYmxlT3JkZXI6IHN0cmluZ1tdIiwicm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsInRhcmdldElkOiBudW1iZXIgfCBzdHJpbmciLCJsZXZlbHM6IEZpeHR1cmVSZWNvcmRbXVtdIiwiY3VycmVudExldmVsOiBGaXh0dXJlUmVjb3JkW10iLCJ3aGVyZUNsYXVzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9maXh0dXJlLW1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGluc3BlY3QgfSBmcm9tIFwidXRpbFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB7IHR5cGUgVUJSZWYgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICB0eXBlIERhdGFiYXNlU2NoZW1hRXh0ZW5kLFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRml4dHVyZUltcG9ydFJlc3VsdCxcbiAgdHlwZSBGaXh0dXJlUmVjb3JkLFxuICB0eXBlIEZpeHR1cmVTZWFyY2hPcHRpb25zLFxuICB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSZWxhdGlvbkdyYXBoIH0gZnJvbSBcIi4vX3JlbGF0aW9uLWdyYXBoXCI7XG5cbi8qKiDsgqzsmqnsnpAg7KeA7KCVIOykkeuztSDtmZXsnbgg7Lus65+8IChlbnRpdHlJZOuzhOuhnCDsp4DsoJUpICovXG5leHBvcnQgaW50ZXJmYWNlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB7XG4gIGNvbHVtbnM/OiB7XG4gICAgW2VudGl0eUlkOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIF90ZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLl90ZGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fdGRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90ZGI7XG4gIH1cblxuICBwcml2YXRlIF9mZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLl9mZGIgPSBmZGI7XG4gIH1cbiAgZ2V0IGZkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fZmRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mZGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNraXBwZWRGaXh0dXJlczogTWFwPHN0cmluZywgeyBlbnRpdHlJZDogc3RyaW5nOyBleGlzdGluZ0lkOiBudW1iZXIgfCBzdHJpbmcgfT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBpbml0KCkge1xuICAgIGlmICh0aGlzLl90ZGIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFNvbmFtdS5kYkNvbmZpZy50ZXN0ICYmIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlcikge1xuICAgICAgY29uc3QgdENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBwQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uX21hc3Rlci5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyAmIHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgIGAke3RDb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHt0Q29ubi5wb3J0ID8/IDU0MzJ9LyR7dENvbm4uZGF0YWJhc2V9YCA9PT1cbiAgICAgICAgYCR7cENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3BDb25uLnBvcnQgPz8gNTQzMn0vJHtwQ29ubi5kYXRhYmFzZX1gXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirhEQuyZgCDtlITroZzrjZXshZhEQuyXkCDrj5nsnbztlZwg642w7J207YSw67Kg7J207Iqk6rCAIOyCrOyaqeuQmOyXiOyKteuLiOuLpC5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcblxuICAgIC8vIDMuIOyLnO2AgOyKpCDrpqzshYsgKOuNsOydtO2EsCDrs7Xsgqwg7ZuEIOyLnO2AgOyKpOulvCBNQVgoaWQp66GcIOygleugrClcbiAgICBhd2FpdCB0aGlzLnJlc2V0U2VxdWVuY2VzKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqqjrk6Ag7YWM7J2067iU7J2YIOyLnO2AgOyKpOulvCDtmITsnqwgTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAqIGZpeHR1cmUgc3luYyDtm4Qg7Iuc7YCA7Iqk6rCAIOyLpOygnCDrjbDsnbTthLDsmYAg66ee7KeAIOyViuuKlCDrrLjsoJzrpbwg7ZW06rKw7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFNlcXVlbmNlcyhkYkNvbmZpZzogU29uYW11REJDb25maWdbXCJ0ZXN0XCJdKSB7XG4gICAgY29uc3QgdGVzdERiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcbiAgICBjb25zdCBlbnRpdGllcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGUgfHwgZW50aXR5LmlkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gaWQg7ZWE65Oc7J2YIO2DgOyeheydhCDtmZXsnbjtlanri4jri6RcbiAgICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gaWRQcm9wPy50eXBlO1xuXG4gICAgICAgIC8vIGludGVnZXIvYmlnSW50ZWdlcuydtOqxsOuCmCwgc3RyaW5n7J207KeA66eMIGZpeHR1cmVTdHJhdGVneT1zZXF1ZW5jZeyduCDqsr3smrDsl5Drp4wg66as7IWL7ZWp64uI64ukXG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgaWRUeXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGlkVHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiO1xuXG4gICAgICAgIGlmICghdXNlc1NlcXVlbmNlKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgYFNraXBwaW5nIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvc3RncmVTUUwg7Iuc7YCA7Iqk66W8IO2YhOyerCDthYzsnbTruJTsnZggTUFYKGlkKeuhnCDrpqzshYvtlanri4jri6QuXG4gICAgICAgIC8vIHN0cmluZyDtg4DsnoXsnZgg6rK97JqwIOyIq+yekCDsupDsiqTtjIXsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgICBjb25zdCBtYXhFeHByID0gaWRUeXBlID09PSBcInN0cmluZ1wiID8gXCJNQVgoaWQ6OmJpZ2ludClcIiA6IFwiTUFYKGlkKVwiO1xuICAgICAgICBhd2FpdCB0ZXN0RGIucmF3KGBcbiAgICAgICAgICBTRUxFQ1Qgc2V0dmFsKFxuICAgICAgICAgICAgcGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZSgncHVibGljLiR7dGFibGVOYW1lfScsICdpZCcpLFxuICAgICAgICAgICAgQ09BTEVTQ0UoKFNFTEVDVCAke21heEV4cHJ9IEZST00gJHt0YWJsZU5hbWV9KSwgMSlcbiAgICAgICAgICApXG4gICAgICAgIGApO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0ZXN0RGIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgYXdhaXQgd2RiLnJhdyhxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnRvUmV2ZXJzZWQoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzb3VyY2VEQk5hbWVdKTtcbiAgICBjb25zdCB0YXJnZXREQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZmllbGQsIHZhbHVlLCBzZWFyY2hUeXBlIH0gPSBzZWFyY2hPcHRpb25zO1xuXG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICBlbnRpdHkucHJvcHMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBmaWVsZCk/LnR5cGUgPT09IFwicmVsYXRpb25cIlxuICAgICAgICAgID8gYCR7ZmllbGR9X2lkYFxuICAgICAgICAgIDogZmllbGQ7XG5cbiAgICAgIGxldCBxdWVyeSA9IHNvdXJjZURCKGVudGl0eS50YWJsZSk7XG4gICAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09PSBcImxpa2VcIikge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZWNvcmRzTGVuZ3RoID0gZml4dHVyZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgICAgX2RiOiBzb3VyY2VEQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlUmVjb3JkID0gZml4dHVyZXMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IGAke2VudGl0eUlkfSMke3Jvdy5pZH1gKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpeHR1cmVSZWNvcmQpIHtcbiAgICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgICAgY3VycmVudEZpeHR1cmVSZWNvcmQuZmV0Y2hlZFJlY29yZHMgPSBmaXh0dXJlc1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5maXh0dXJlSWQgIT09IGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZpeHR1cmVJZClcbiAgICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICAgIGN1c3RvbUNvbHVtbnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIGN1c3RvbUR1cGxpY2F0ZVJvdywge1xuICAgICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZpeHR1cmUudGFyZ2V0ID0gcmVjb3JkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVuaXF1ZSBpbmRleCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgZml4dHVyZS51bmlxdWVcbiAgICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgICAgaWYgKHVuaXF1ZVJvdykge1xuICAgICAgICAgIGNvbnN0IFtyZWNvcmRdID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlxdWUoZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbdGFyZ2V0REIuZGVzdHJveSgpLCBzb3VyY2VEQi5kZXN0cm95KCldKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvdzoge1xuICAgICAgaWQ6IG51bWJlciB8IHN0cmluZztcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBfZGI/OiBLbmV4O1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHJvdzoge1xuICAgICAgICBpZDogbnVtYmVyIHwgc3RyaW5nO1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH0sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogcm93W3Byb3AubmFtZV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5fZGIgPz8gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRocm91Z2hUYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IGZyb21Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0b0NvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYih0aHJvdWdoVGFibGUpLndoZXJlKGZyb21Db2x1bW4sIHJvdy5pZCkucGx1Y2sodG9Db2x1bW4pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKVxuICAgICAgICAgICAgLndoZXJlKHByb3Auam9pbkNvbHVtbiwgcm93LmlkKVxuICAgICAgICAgICAgLnBsdWNrKFwiaWRcIik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiAhcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgLy8g7Jet67Cp7ZalIE9uZVRvT25lOiBGS+ulvCDqsIDsp4Qg6rSA66CoIOyXlO2LsO2LsOulvCDssL7sirXri4jri6RcbiAgICAgICAgICAvLyDsmIjsi5w6IFVzZXIgT25lVG9PbmUgRW1wbG95ZWUgKEVtcGxveWVl6rCAIHVzZXJfaWQgRkvrpbwg6rCA7KeQKVxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRQcm9wID0gcmVsYXRlZEVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRQcm9wICYmIGlzUmVsYXRpb25Qcm9wKHJlbGF0ZWRQcm9wKSkge1xuICAgICAgICAgICAgLy8g6rSA66CoIOyXlO2LsO2LsOyXkOyEnCBGSyDsu6zrn7zsnLzroZwg7L+866as7ZWp64uI64ukIChpZOqwgCDslYTri5gpXG4gICAgICAgICAgICBjb25zdCBma0NvbHVtbiA9IGAke3JlbGF0ZWRQcm9wLm5hbWV9X2lkYDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShma0NvbHVtbiwgcm93LmlkKS5maXJzdCgpO1xuICAgICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRSb3c/LmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZCA9IHJvd1tgJHtwcm9wLm5hbWV9X2lkYF07XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICBpZiAocmVsYXRlZElkKSB7XG4gICAgICAgICAgICByZWNvcmQuYmVsb25nc1JlY29yZHMucHVzaChgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW9wdGlvbnM/LnNpbmdsZVJlY29yZCAmJiByZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgcmVsYXRlZElkKS5maXJzdCgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlKHJlbGF0ZWRFbnRpdHksIHJlbGF0ZWRSb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICB9O1xuXG4gICAgYXdhaXQgY3JlYXRlKGVudGl0eSwgcm93KTtcblxuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrAgKHNlbGYtcmVmZXJlbmNlIO2PrO2VqClcbiAgICogMi4g7YWM7J2067iU67OEIOugiOuyqOuzhOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSDrsI8gdXBzZXJ0IOyLpO2WiVxuICAgKiAzLiDsiJzshJwg6riw67CYIHV1aWTihpJpZCDrp6TtlZEgKFVwc2VydEJ1aWxkZXLqsIAgdXVpZOulvCBEQuyXkCDsoIDsnqXtlZjsp4Ag7JWK7Jy866+A66GcKVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy64qUIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWY7JesIOqwgSB1cHNlcnQg7Zi47Lac7JeQ7ISc64qUXG4gICAqIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuPhOuhnSDtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBpbnNlcnRGaXh0dXJlcyhcbiAgICBkYk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIF9maXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGZpeHR1cmVzID0gdW5pcXVlKF9maXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcblxuICAgIC8vIOy0iOq4sO2ZlFxuICAgIHRoaXMuYnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8g67OR66CsIO2FjOyKpO2KuCDrqqjrk5zsl5DshJzripQgd29ya2Vy67OEIERC7JeQIOyggOyepVxuICAgIGNvbnN0IGRiQ29uZmlnID1cbiAgICAgIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiICYmIHByb2Nlc3MuZW52LlZJVEVTVF9QT09MX0lEXG4gICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgPz8gXCIxXCIsIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBTb25hbXUuZGJDb25maWdbZGJOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBiYXNlQ29uZmlnLmNvbm5lY3Rpb24gYXMgeyBkYXRhYmFzZTogc3RyaW5nIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5iYXNlQ29uZmlnLFxuICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7IC4uLmNvbm5lY3Rpb24sIGRhdGFiYXNlOiBgJHtjb25uZWN0aW9uLmRhdGFiYXNlfV8ke3dvcmtlcklkfWAgfSxcbiAgICAgICAgICAgICAgcG9vbDogeyBtaW46IDEsIG1heDogMSB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSgpXG4gICAgICAgIDogU29uYW11LmRiQ29uZmlnW2RiTmFtZV07XG4gICAgY29uc3QgZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoZGJDb25maWcpO1xuICAgIGNvbnN0IHJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrBcbiAgICAgIHRoaXMucmVsYXRpb25HcmFwaC5idWlsZEdyYXBoKGZpeHR1cmVzKTtcbiAgICAgIGNvbnN0IGluc2VydGlvbk9yZGVyID0gdGhpcy5yZWxhdGlvbkdyYXBoLmdldEluc2VydGlvbk9yZGVyKCk7XG5cbiAgICAgIC8vIDIuIOyKpO2Cte2VoCBmaXh0dXJlIOuovOyggCDsspjrpqwgKG92ZXJyaWRlIOyytO2BrClcbiAgICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIGluc2VydGlvbk9yZGVyKSB7XG4gICAgICAgIGNvbnN0IGZpeHR1cmUgPSBmaXh0dXJlcy5maW5kKChmKSA9PiBmLmZpeHR1cmVJZCA9PT0gZml4dHVyZUlkKTtcbiAgICAgICAgaWYgKCFmaXh0dXJlKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBoYXNUYXJnZXQgPSAhIWZpeHR1cmUudGFyZ2V0O1xuICAgICAgICBjb25zdCBoYXNVbmlxdWUgPSAhIWZpeHR1cmUudW5pcXVlO1xuICAgICAgICBjb25zdCBoYXNEdXBsaWNhdGUgPSBoYXNUYXJnZXQgfHwgaGFzVW5pcXVlO1xuXG4gICAgICAgIC8vIOykkeuzteydtCDsnojqs6Agb3ZlcnJpZGU9ZmFsc2Xsnbgg6rK97JqwOiDsiqTtgrVcbiAgICAgICAgaWYgKGhhc0R1cGxpY2F0ZSAmJiAhZml4dHVyZS5vdmVycmlkZSkge1xuICAgICAgICAgIC8vIOq4sOyhtCDroIjsvZTrk5wgSUQg7KCA7J6lICh1bmlxdWUg7Jqw7ISgLCDsl4bsnLzrqbQgdGFyZ2V0KVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSBmaXh0dXJlLnVuaXF1ZT8uaWQgPz8gZml4dHVyZS50YXJnZXQ/LmlkO1xuICAgICAgICAgIGFzc2VydChleGlzdGluZ0lkKTtcbiAgICAgICAgICB0aGlzLnNraXBwZWRGaXh0dXJlcy5zZXQoZml4dHVyZUlkLCB7XG4gICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgIGV4aXN0aW5nSWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYFNraXBwZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9IChleGlzdGluZzogIyR7ZXhpc3RpbmdJZH0sIG92ZXJyaWRlOiBmYWxzZSlgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgZml4dHVyZSDqt7jro7ntmZQgKGluc2VydGlvbk9yZGVyIOyInOyEnCDquLDrsJgpXG4gICAgICBjb25zdCBmaXh0dXJlc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgRml4dHVyZVJlY29yZFtdPigpO1xuICAgICAgY29uc3QgdGFibGVPcmRlcjogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmUg7KCc7Jm4XG4gICAgICAgIGlmICh0aGlzLnNraXBwZWRGaXh0dXJlcy5oYXMoZml4dHVyZUlkKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBlbnRpdHkudGFibGU7XG5cbiAgICAgICAgaWYgKCFmaXh0dXJlc0J5VGFibGUuaGFzKHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICBmaXh0dXJlc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgW10pO1xuICAgICAgICAgIHRhYmxlT3JkZXIucHVzaCh0YWJsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKT8ucHVzaChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICBjb25zdCBpbnNlcnRlZElkc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4oKTtcblxuICAgICAgICAvLyA0LiDthYzsnbTruJTrs4Qg66CI67Ko67OEIOyymOumrFxuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVGaXh0dXJlcyA9IGZpeHR1cmVzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBbXTtcbiAgICAgICAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmdyb3VwRml4dHVyZXNCeUxldmVsKHRhYmxlRml4dHVyZXMpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsZXZlbEZpeHR1cmVzIG9mIGxldmVscykge1xuICAgICAgICAgICAgLy8g7ZW064u5IOugiOuyqOydmCBmaXh0dXJl65OkIHJlZ2lzdGVyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgbGV2ZWxGaXh0dXJlcykge1xuICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRml4dHVyZShmaXh0dXJlLCBpbnNlcnRlZElkc0J5VGFibGUpO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICAgIGBSZWdpc3RlcmVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSR7Zml4dHVyZS5vdmVycmlkZSA/IGAgKG92ZXJyaWRlKWAgOiBcIlwifWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwc2VydCDsi6Ttlokg7KCEIHV1aWQg66qp66GdIOyggOyepVxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmJ1aWxkZXIuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LnV1aWQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgICAgICAgICBgVXBzZXJ0aW5nICR7dGFibGVOYW1lfSB3aXRoICR7dXVpZHMubGVuZ3RofSByb3dzIChsZXZlbCAke2xldmVscy5pbmRleE9mKGxldmVsRml4dHVyZXMpICsgMX0vJHtsZXZlbHMubGVuZ3RofSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSAoYXdhaXQgdGhpcy5idWlsZGVyLnVwc2VydChcbiAgICAgICAgICAgICAgdHJ4LFxuICAgICAgICAgICAgICB0YWJsZU5hbWUgYXMga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gICAgICAgICAgICApKSBhcyAobnVtYmVyIHwgc3RyaW5nKVtdO1xuXG4gICAgICAgICAgICAvLyDsiJzshJwg6riw67CYIHV1aWQgLT4gaWQg66ek7ZWRXG4gICAgICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDsl4bsnLzrr4DroZwg65Ox66GdIOyInOyEnCA9IOuwmO2ZmCDsiJzshJwg67O07J6lXG4gICAgICAgICAgICBpZiAodXVpZHMubGVuZ3RoID4gMCAmJiB1dWlkcy5sZW5ndGggPT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdNYXAgPVxuICAgICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5nZXQodGFibGVOYW1lKSA/PyBuZXcgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPigpO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHV1aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdNYXAuc2V0KHV1aWRzW2ldLCBpZHNbaV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBleGlzdGluZ01hcCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHV1aWRzLmxlbmd0aCAhPT0gaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgICAgYFdhcm5pbmc6IHV1aWQgY291bnQgKCR7dXVpZHMubGVuZ3RofSkgIT0gaWQgY291bnQgKCR7aWRzLmxlbmd0aH0pIGZvciAke3RhYmxlTmFtZX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gTWFueVRvTWFueSDqtIDqs4Qg7LKY66asXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnModHJ4LCBmaXh0dXJlcywgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcblxuICAgICAgICAvLyA2LiBQb3N0Z3JlU1FMIOyLnO2AgOyKpCDrpqzshYtcbiAgICAgICAgLy8gRml4dHVyZSDsgr3snoUg7ZuEIOqwgSDthYzsnbTruJTsnZggSUQg7Iuc7YCA7Iqk66W8IOy1nOuMgCBJRCDqsJLsnLzroZwg7JeF642w7J207Yq47ZWp64uI64ukLlxuICAgICAgICAvLyDsnbTroIfqsowg7ZWY7KeAIOyViuycvOuptCDri6TsnYwgSU5TRVJUIOyLnCBJROqwgCAyMDAw67KI64yA66GcIOyDneyEseuQoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJlc2V0dGluZyBzZXF1ZW5jZXMuLi5cIikpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU9yZGVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEVudGl0eeulvCDssL7slYTshJwgaWQg7YOA7J6FIO2ZleyduFxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpLmZpbmQoXG4gICAgICAgICAgICAgIChlKSA9PiBlLnRhYmxlID09PSB0YWJsZU5hbWUgfHwgZS5pZC50b0xvd2VyQ2FzZSgpID09PSB0YWJsZU5hbWUsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgICAgICAgIGNvbnN0IGlkVHlwZSA9IGlkUHJvcD8udHlwZTtcblxuICAgICAgICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXLsnbTqsbDrgpgsIHN0cmluZ+ydtOyngOunjCBmaXh0dXJlU3RyYXRlZ3k9c2VxdWVuY2Xsnbgg6rK97Jqw7JeQ66eMIOumrOyFi+2VqeuLiOuLpFxuICAgICAgICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgICAgICAgIGlkVHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICAgICAgICBpZFR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcblxuICAgICAgICAgICAgICBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgYFNraXBwZWQgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfSAoaWQgdHlwZTogJHtpZFR5cGUgfHwgXCJ1bmtub3duXCJ9KWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2FjOydtOu4lOydmCDstZzrjIAgSUQg7KGw7ZqMIChzdHJpbmcg7YOA7J6F7J2AIOyIq+yekCDsupDsiqTtjIUg7ZWE7JqUKVxuICAgICAgICAgICAgY29uc3QgZW50aXR5MiA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKS5maW5kKFxuICAgICAgICAgICAgICAoZSkgPT4gZS50YWJsZSA9PT0gdGFibGVOYW1lIHx8IGUuaWQudG9Mb3dlckNhc2UoKSA9PT0gdGFibGVOYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGlkVHlwZTIgPSBlbnRpdHkyPy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik/LnR5cGU7XG4gICAgICAgICAgICBjb25zdCBtYXhJZFJlc3VsdCA9XG4gICAgICAgICAgICAgIGlkVHlwZTIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IGF3YWl0IHRyeFxuICAgICAgICAgICAgICAgICAgICAucmF3KGBTRUxFQ1QgTUFYKGlkOjpiaWdpbnQpIGFzIG1heF9pZCBGUk9NIFwiJHt0YWJsZU5hbWV9XCJgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4gci5yb3dzWzBdKVxuICAgICAgICAgICAgICAgIDogYXdhaXQgdHJ4KHRhYmxlTmFtZSkubWF4KFwiaWQgYXMgbWF4X2lkXCIpLmZpcnN0KCk7XG4gICAgICAgICAgICBjb25zdCBtYXhJZCA9IG1heElkUmVzdWx0Py5tYXhfaWQ7XG5cbiAgICAgICAgICAgIGlmIChtYXhJZCAhPT0gbnVsbCAmJiBtYXhJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIOyLnO2AgOyKpOuqheydhCBwZ19nZXRfc2VyaWFsX3NlcXVlbmNl66GcIOyViOyghO2VmOqyjCDsobDtmoxcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4LnJhdyhgU0VMRUNUIHNldHZhbChwZ19nZXRfc2VyaWFsX3NlcXVlbmNlKD8sICdpZCcpLCA/KWAsIFtcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgbWF4SWQsXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFJlc2V0IHNlcXVlbmNlIGZvciAke3RhYmxlTmFtZX06ICR7bWF4SWR9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8g7Iuc7YCA7Iqk6rCAIOyXhuuKlCDthYzsnbTruJQoam9pbiB0YWJsZSDrk7Ep7J2AIOustOyLnFxuICAgICAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYFNraXBwZWQgc2VxdWVuY2UgcmVzZXQgZm9yICR7dGFibGVOYW1lfWApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3LiDqsrDqs7wg7IiY7KeRXG4gICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuXG4gICAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmXripQg6riw7KG0IOugiOy9lOuTnCDsoJXrs7TroZwg6rKw6rO8IOy2lOqwgFxuICAgICAgICAgIGNvbnN0IHNraXBwZWQgPSB0aGlzLnNraXBwZWRGaXh0dXJlcy5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChza2lwcGVkKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBza2lwcGVkLmV4aXN0aW5nSWQpLmZpcnN0KCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZCA9IHV1aWRUb0lkPy5nZXQocmVmLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBpbnNlcnRlZElkKS5maXJzdCgpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKGBJbnNlcnRlZCBpbnRvICR7ZW50aXR5LnRhYmxlfTogIyR7Zml4dHVyZS5pZH0gLT4gIyR7aW5zZXJ0ZWRJZH1gKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pcXVlKHJlc3VsdHMsIChyKSA9PiBgJHtyLmVudGl0eUlkfSMke3IuZGF0YS5pZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlUmVjb3Jk66W8IFVwc2VydEJ1aWxkZXLsl5Ag65Ox66GdXG4gICAqIEBwYXJhbSBpbnNlcnRlZElkc0J5VGFibGUg7J2066+4IHVwc2VydOuQnCDthYzsnbTruJTsnZggdXVpZOKGkmlkIOunpO2VkSAo66CI67Ko67OEIOyymOumrCDsi5wg7IKs7JqpKVxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckZpeHR1cmUoXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBpbnNlcnRlZElkc0J5VGFibGU/OiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PixcbiAgKTogVUJSZWYge1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgIGNvbnN0IHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIC8vIE92ZXJyaWRlIOuqqOuTnCDtjJDri6g6IHRhcmdldCDrmJDripQgdW5pcXVl6rCAIOyeiOqzoCBvdmVycmlkZT10cnVl7J24IOqyveyasFxuICAgIGNvbnN0IGV4aXN0aW5nUmVjb3JkID0gZml4dHVyZS50YXJnZXQgPz8gZml4dHVyZS51bmlxdWU7XG4gICAgY29uc3QgaXNPdmVycmlkZU1vZGUgPSBmaXh0dXJlLm92ZXJyaWRlICYmIGV4aXN0aW5nUmVjb3JkO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgY29uc3QgcHJvcCA9IGNvbHVtbi5wcm9wO1xuXG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGVkIGNvbHVtbuydgCBJTlNFUlTsl5DshJwg7KCc7Jm4IChEQuqwgCDsnpDrj5kg7IOd7ISxKVxuICAgICAgaWYgKFwiZ2VuZXJhdGVkXCIgaW4gcHJvcCAmJiBwcm9wLmdlbmVyYXRlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWQg7LKY66asXG4gICAgICBpZiAocHJvcE5hbWUgPT09IFwiaWRcIikge1xuICAgICAgICBjb25zdCBpZFByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgICAvLyBwYXJlbnRJZCDsl5Tti7Dti7DsnZggaWTripQg67aA66qoIOyXlO2LsO2LsOydmCBGS+ydtOuvgOuhnCDsi5ztgIDsiqQg66+47IKs7JqpICjrqoXsi5zsoIHsnLzroZwg7Y+s7ZWoKVxuICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgICFlbnRpdHkucGFyZW50SWQgJiZcbiAgICAgICAgICAoaWRQcm9wPy50eXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgICAgaWRQcm9wPy50eXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIik7XG5cbiAgICAgICAgaWYgKGlzT3ZlcnJpZGVNb2RlICYmIGV4aXN0aW5nUmVjb3JkKSB7XG4gICAgICAgICAgLy8gT3ZlcnJpZGU6IOq4sOyhtCDroIjsvZTrk5zsnZgg6rCSIOyCrOyaqSDihpIgVVBEQVRFXG4gICAgICAgICAgcm93W3Byb3BOYW1lXSA9IGV4aXN0aW5nUmVjb3JkLmNvbHVtbnNbcHJvcE5hbWVdPy52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghdXNlc1NlcXVlbmNlKSB7XG4gICAgICAgICAgLy8gc3RyaW5nIFBLIOuYkOuKlCBwYXJlbnRJZCDsl5Tti7Dti7AgRks6IOyDneyEseuQnCBpZCDqsJLsnYQgSU5TRVJU7JeQIO2PrO2VqFxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBjb2x1bW4udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW50ZWdlci9iaWdJbnRlZ2VyIFBLOiBEQiDsi5ztgIDsiqTsl5Ag66eh6rmAICjqsJIg7KCc7Jm4KVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gY29sdW1uLnZhbHVlIGFzIG51bWJlciB8IG51bGw7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CcIOqwmeydgCDthYzsnbTruJQgZml4dHVyZSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkSW5zZXJ0ZWRJZHMgPSBpbnNlcnRlZElkc0J5VGFibGU/LmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHJlbGF0ZWRJbnNlcnRlZElkcz8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0dWFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQqCDihpIg7Iuk7KCcIElEIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gYWN0dWFsSWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyVhOyngSB1cHNlcnQg7JWI65CoIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCBhcyBFbnRpdHlQcm9wLCBjb2x1bW4udmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgUmVnaXN0ZXJpbmcgJHtlbnRpdHkudGFibGV9IC0gJHtpbnNwZWN0KHJvdywgZmFsc2UsIG51bGwsIHRydWUpfWApKTtcbiAgICBjb25zdCByZWYgPSB0aGlzLmJ1aWxkZXIucmVnaXN0ZXIoZW50aXR5LnRhYmxlLCByb3cpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcC5zZXQoZml4dHVyZS5maXh0dXJlSWQsIHJlZik7XG5cbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIOy7rOufvCDqsJIg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRDb2x1bW5WYWx1ZShwcm9wOiBFbnRpdHlQcm9wLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgLy8gVXBzZXJ0QnVpbGRlci5yZWdpc3RlcuyXkOyEnCBKU09OLnN0cmluZ2lmeSDsspjrpqztlZjrr4DroZwgb2JqZWN0IOq3uOuMgOuhnCDsoITri6xcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyhcbiAgICB0cng6IEtuZXguVHJhbnNhY3Rpb24sXG4gICAgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgICBpbnNlcnRlZElkc0J5VGFibGU6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgY29uc3Qgc291cmNlUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG5cbiAgICAgIGlmICghc291cmNlUmVmKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgc291cmNlVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KGVudGl0eS50YWJsZSk7XG4gICAgICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZVV1aWRUb0lkPy5nZXQoc291cmNlUmVmLnV1aWQpO1xuXG4gICAgICBpZiAoc291cmNlSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgWywgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApICYmIEFycmF5LmlzQXJyYXkoY29sdW1uLnZhbHVlKSkge1xuICAgICAgICAgIC8vIOyEoO2DneuQmOyngCDslYrsnYAgTWFueVRvTWFueSDqtIDqs4TripQg7KCA7J6l7ZWY7KeAIOyViuydjFxuICAgICAgICAgIGNvbnN0IHRhcmdldFRhYmxlID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuYnVpbGRlci5oYXNUYWJsZSh0YXJnZXRUYWJsZS50YWJsZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGNvbHVtbi52YWx1ZSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBpZiAocmVsYXRlZElkcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3Qgam9pblRhYmxlID0gcHJvcC5qb2luVGFibGU7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbGF0ZWRFbnRpdHkudGFibGUpfV9pZGA7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQocmVsYXRlZEZpeHR1cmVJZCk7XG5cbiAgICAgICAgICAgIGxldCB0YXJnZXRJZDogbnVtYmVyIHwgc3RyaW5nO1xuXG4gICAgICAgICAgICBpZiAocmVsYXRlZFJlZikge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KHJlbGF0ZWRFbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZElkID0gcmVsYXRlZFV1aWRUb0lkPy5nZXQocmVsYXRlZFJlZi51dWlkKTtcblxuICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYFJlbGF0ZWQgZml4dHVyZSAke3JlbGF0ZWRGaXh0dXJlSWR9IG5vdCBmb3VuZCBpbiBpbnNlcnRlZElkcywgc2tpcHBpbmdgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGFyZ2V0SWQgPSByZXNvbHZlZElkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SWQgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEpvaW5UYWJsZeyXkCDsgr3snoVcbiAgICAgICAgICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCB0cngoam9pblRhYmxlKVxuICAgICAgICAgICAgICAud2hlcmUoe1xuICAgICAgICAgICAgICAgIFtzb3VyY2VDb2x1bW5dOiBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBbdGFyZ2V0Q29sdW1uXTogdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5saW1pdCgxKTtcblxuICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICBhd2FpdCB0cngoam9pblRhYmxlKS5pbnNlcnQoe1xuICAgICAgICAgICAgICAgIFtzb3VyY2VDb2x1bW5dOiBzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBbdGFyZ2V0Q29sdW1uXTogdGFyZ2V0SWQsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICAgICAgICAgIGBJbnNlcnRlZCBpbnRvICR7am9pblRhYmxlfTogJHtlbnRpdHkudGFibGV9KCR7c291cmNlSWR9KSAtICR7cmVsYXRlZEVudGl0eS50YWJsZX0oJHt0YXJnZXRJZH0pYCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6rCZ7J2AIO2FjOydtOu4lCDrgrQgZml4dHVyZeuTpOydhCBzZWxmLXJlZmVyZW5jZSDroIjrsqjrs4TroZwg67aE7ZWgXG4gICAqIC0gc2VsZi1yZWZlcmVuY2XqsIAg7JeG64qUIGZpeHR1cmXrk6Q6IExldmVsIDBcbiAgICogLSBMZXZlbCAw7J2EIOywuOyhsO2VmOuKlCBmaXh0dXJl65OkOiBMZXZlbCAxXG4gICAqIC0g67CY67O1XG4gICAqXG4gICAqIFVwc2VydEJ1aWxkZXLqsIAgc2VsZi1yZWZlcmVuY2XqsIAg7J6I7Jy866m0IGJ1aWxkSW5zZXJ0TGV2ZWxzKCnroZwg7J6s7KCV66Cs7ZWY7JesXG4gICAqIOuTseuhnSDsiJzshJzsmYAg67CY7ZmYIOyInOyEnOqwgCDri6zrnbzsp4gg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7J2066W8IOuwqeyngO2VmOq4sCDsnITtlbQgRml4dHVyZU1hbmFnZXLqsIAg66CI67Ko67OE66GcIOuCmOuIoOyEnCDsspjrpqztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdyb3VwRml4dHVyZXNCeUxldmVsKGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10pOiBGaXh0dXJlUmVjb3JkW11bXSB7XG4gICAgaWYgKGZpeHR1cmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmVzWzBdLmVudGl0eUlkKTtcblxuICAgIC8vIHNlbGYtcmVmZXJlbmNlIHJlbGF0aW9uIHByb3Ag7LC+6riwXG4gICAgY29uc3Qgc2VsZlJlZlByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgIChwKTogcCBpcyBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AgfCBPbmVUb09uZVJlbGF0aW9uUHJvcCA9PlxuICAgICAgICBpc1JlbGF0aW9uUHJvcChwKSAmJlxuICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocCkgJiYgcC5oYXNKb2luQ29sdW1uKSkgJiZcbiAgICAgICAgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgKTtcblxuICAgIGlmIChzZWxmUmVmUHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBzZWxmLXJlZmVyZW5jZSDsl4bsnYwg4oaSIOuLqOydvCDroIjrsqhcbiAgICAgIHJldHVybiBbZml4dHVyZXNdO1xuICAgIH1cblxuICAgIC8vIOugiOuyqOuzhCDrtoTtlaAgKHRvcG9sb2dpY2FsIHNvcnQpXG4gICAgY29uc3QgbGV2ZWxzOiBGaXh0dXJlUmVjb3JkW11bXSA9IFtdO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQoZml4dHVyZXMubWFwKChmKSA9PiBmLmZpeHR1cmVJZCkpO1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgd2hpbGUgKHJlbWFpbmluZy5zaXplID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudExldmVsOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICAgIGlmICghcmVtYWluaW5nLmhhcyhmaXh0dXJlLmZpeHR1cmVJZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHNlbGYtcmVmZXJlbmNl6rCAIOuqqOuRkCDsnbTrr7gg7LKY66as65CQ6rGw64KYIG51bGzsnbgg6rK97JqwXG4gICAgICAgIGNvbnN0IGNhblByb2Nlc3MgPSBzZWxmUmVmUHJvcHMuZXZlcnkoKHByb3ApID0+IHtcbiAgICAgICAgICBjb25zdCByZWZJZCA9IGZpeHR1cmUuY29sdW1uc1twcm9wLm5hbWVdPy52YWx1ZSBhcyBudW1iZXIgfCBudWxsO1xuICAgICAgICAgIGlmIChyZWZJZCA9PT0gbnVsbCB8fCByZWZJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICBjb25zdCByZWZGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVmSWR9YDtcbiAgICAgICAgICAvLyDsnbTrr7gg7LKY66as65CQ6rGw64KYLCDtmITsnqwgZml4dHVyZXPsl5Ag7Y+s7ZWo65CY7KeAIOyViuydgCDqsr3smrAgKOyZuOu2gCDssLjsobApXG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZC5oYXMocmVmRml4dHVyZUlkKSB8fCAhcmVtYWluaW5nLmhhcyhyZWZGaXh0dXJlSWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuUHJvY2Vzcykge1xuICAgICAgICAgIGN1cnJlbnRMZXZlbC5wdXNoKGZpeHR1cmUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ0lkcyA9IEFycmF5LmZyb20ocmVtYWluaW5nKS5qb2luKFwiLCBcIik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2lyY3VsYXIgc2VsZi1yZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gJHtlbnRpdHkudGFibGV9LiBSZW1haW5pbmcgZml4dHVyZXM6ICR7cmVtYWluaW5nSWRzfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBjdXJyZW50TGV2ZWwpIHtcbiAgICAgICAgcmVtYWluaW5nLmRlbGV0ZShmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgIHByb2Nlc3NlZC5hZGQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgfVxuXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgIH1cblxuICAgIHJldHVybiBsZXZlbHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVW5pcXVlVmlvbGF0aW9uKGRiOiBLbmV4LCBlbnRpdHk6IEVudGl0eSwgZml4dHVyZTogRml4dHVyZVJlY29yZCkge1xuICAgIGNvbnN0IF91bmlxdWVJbmRleGVzID0gZW50aXR5LmluZGV4ZXM/LmZpbHRlcigoaSkgPT4gaS50eXBlID09PSBcInVuaXF1ZVwiKSA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSBfdW5pcXVlSW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5ldmVyeSgoY29sdW1uKSA9PiAhY29sdW1uLm5hbWUuc3RhcnRzV2l0aChgJHtlbnRpdHkudGFibGV9X19gKSksXG4gICAgKTtcbiAgICBpZiAodW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB1bmlxdWVRdWVyeSA9IGRiKGVudGl0eS50YWJsZSk7XG4gICAgbGV0IGhhc0NvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB1bmlxdWVJbmRleGVzKSB7XG4gICAgICAvLyDsu6zrn7wg7KSRIO2VmOuCmOudvOuPhCBudWxs7J2066m0IOycoOuLiO2BrCDsoJzslb3snYQg7JyE67CY7ZWY7KeAIOyViuq4sCDrlYzrrLjsl5Ag7ZW064u5IOyduOuNseyKpOuKlCDrrLTsi5xcbiAgICAgIGNvbnN0IGNvbnRhaW5zTnVsbCA9IGluZGV4LmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4gZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUgPT09IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluc051bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVuaXF1ZVF1ZXJ5ID0gdW5pcXVlUXVlcnkub3JXaGVyZSgocWIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgaW5kZXguY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpKSB7XG4gICAgICAgICAgICBxYi53aGVyZUluKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcWIuYW5kV2hlcmUoY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaGFzQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW3VuaXF1ZUZvdW5kXSA9IGF3YWl0IHVuaXF1ZVF1ZXJ5O1xuICAgIHJldHVybiB1bmlxdWVGb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMoXG4gICAgZGI6IEtuZXgsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNsYXVzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIC8vIHJlbGF0aW9uIO2VhOuTnOyduCDqsr3smrAgX2lkIOu2meydtOq4sFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbik7XG4gICAgICBjb25zdCBkYkNvbHVtbiA9IHByb3AgJiYgaXNSZWxhdGlvblByb3AocHJvcCkgPyBgJHtjb2x1bW59X2lkYCA6IGNvbHVtbjtcbiAgICAgIGNvbnN0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW2NvbHVtbl0/LnZhbHVlO1xuXG4gICAgICAvLyBudWxsIOqwkuydtCDtj6ztlajrkJwg6rK97JqwIOykkeuztSDtmZXsnbgg7Iqk7YK1XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgd2hlcmVDbGF1c2VbZGJDb2x1bW5dID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IGRiKGVudGl0eS50YWJsZSkud2hlcmUod2hlcmVDbGF1c2UpLmxpbWl0KDEpO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpeHR1cmVMb2FkZXIoY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0aCA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL3Rlc3RpbmcvZml4dHVyZS50c2A7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgZml4dHVyZUxvYWRlclN0YXJ0ID0gY29udGVudC5pbmRleE9mKFwiY29uc3QgZml4dHVyZUxvYWRlciA9IHtcIik7XG4gICAgY29uc3QgZml4dHVyZUxvYWRlckVuZCA9IGNvbnRlbnQuaW5kZXhPZihcIn07XCIsIGZpeHR1cmVMb2FkZXJTdGFydCk7XG5cbiAgICBpZiAoZml4dHVyZUxvYWRlclN0YXJ0ICE9PSAtMSAmJiBmaXh0dXJlTG9hZGVyRW5kICE9PSAtMSkge1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2NvbnRlbnQuc2xpY2UoMCwgZml4dHVyZUxvYWRlckVuZCl9ICAke2NvZGV9XFxuJHtjb250ZW50LnNsaWNlKGZpeHR1cmVMb2FkZXJFbmQpfWA7XG5cbiAgICAgIHdyaXRlRmlsZVN5bmMocGF0aCwgbmV3Q29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kIGZpeHR1cmVMb2FkZXIgaW4gZml4dHVyZS50c1wiKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEZpeHR1cmVNYW5hZ2VyID0gbmV3IEZpeHR1cmVNYW5hZ2VyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Y0FVdUM7a0JBQ1k7WUFFRztzQkFDSztzQkFHRjthQVFqQztrQkFVcUI7dUJBQ0s7Q0FTckMsc0JBQWIsTUFBaUM7RUFDL0IsQUFBUSxPQUFvQjtFQUM1QixJQUFJLElBQUksS0FBVztBQUNqQixRQUFLLE9BQU87O0VBRWQsSUFBSSxNQUFZO0FBQ2QsT0FBSSxLQUFLLFNBQVMsTUFBTTtBQUN0QixVQUFNLElBQUksTUFBTSwwQ0FBMEM7O0FBRTVELFVBQU8sS0FBSzs7RUFHZCxBQUFRLE9BQW9CO0VBQzVCLElBQUksSUFBSSxLQUFXO0FBQ2pCLFFBQUssT0FBTzs7RUFFZCxJQUFJLE1BQVk7QUFDZCxPQUFJLEtBQUssU0FBUyxNQUFNO0FBQ3RCLFVBQU0sSUFBSSxNQUFNLDBDQUEwQzs7QUFFNUQsVUFBTyxLQUFLOztFQUVkLG1CQUFvQztFQUVwQyxBQUFRLGdCQUFnQixJQUFJLGVBQWU7RUFHM0MsQUFBUSxVQUF5QixJQUFJLGVBQWU7RUFDcEQsQUFBUSxnQkFBb0MsSUFBSSxLQUFLO0VBQ3JELEFBQVEsa0JBQ04sSUFBSSxLQUFLO0VBRVgsT0FBTztBQUNMLE9BQUksS0FBSyxTQUFTLE1BQU07QUFDdEI7O0FBRUYsT0FBSSxPQUFPLFNBQVMsUUFBUSxPQUFPLFNBQVMsbUJBQW1CO0lBQzdELE1BQU0s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
|