@cartanova/qgrid-cli 2.9.1 → 2.9.4
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/bundle/dist/application/qgrid/qgrid.frame.js +4 -3
- package/bundle/dist/application/qgrid/token-death.js +6 -22
- package/bundle/dist/application/qgrid/token-subscriber.js +2 -1
- package/bundle/dist/application/token/token.model.js +22 -17
- package/bundle/dist/startup-migrations.js +8 -5
- package/bundle/dist/utils/providers/anthropic/claude-session.js +3 -2
- package/bundle/dist/utils/providers/common/effort.js +51 -0
- package/bundle/dist/utils/providers/common/model-cost.js +29 -14
- package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +5 -3
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +20 -0
- package/bundle/src/application/qgrid/qgrid.frame.ts +3 -2
- package/bundle/src/application/qgrid/token-death.test.ts +11 -10
- package/bundle/src/application/qgrid/token-death.ts +9 -21
- package/bundle/src/application/qgrid/token-subscriber.test.ts +5 -1
- package/bundle/src/application/qgrid/token-subscriber.ts +1 -0
- package/bundle/src/application/token/token.model.test.ts +24 -5
- package/bundle/src/application/token/token.model.ts +30 -23
- package/bundle/src/startup-migrations.test.ts +19 -15
- package/bundle/src/startup-migrations.ts +11 -3
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +1 -1
- package/bundle/src/utils/providers/anthropic/claude-session.test.ts +13 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +3 -1
- package/bundle/src/utils/providers/common/effort.test.ts +61 -0
- package/bundle/src/utils/providers/common/effort.ts +53 -0
- package/bundle/src/utils/providers/common/model-cost.test.ts +25 -12
- package/bundle/src/utils/providers/common/model-cost.ts +43 -14
- package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +3 -1
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +21 -0
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +5 -4
- package/bundle/web-dist/client/assets/{index-DiioTXCk.js → index-fogJvajr.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-Cmh7iNUl.js → logs-CsY2cqvt.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-BxqRbzYv.js → monit-ChgaLEcD.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-DrNdqoD1.js → routes-BvyiTnOZ.js} +2 -2
- package/bundle/web-dist/client/assets/{settings-ROuRMHwU.js → settings-ZR2J9rWb.js} +1 -1
- package/bundle/web-dist/client/assets/{show-Ct97ts6E.js → show-CjwO4-So.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-Cw2eWi9I.js → tokens-Bx-hG1gm.js} +1 -1
- package/bundle/web-dist/client/assets/{use-oauth-login-flow-D4-P9yOJ.js → use-oauth-login-flow-Bqax_icS.js} +1 -1
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/assets/{routes-CxMHXfdH.js → routes-B408iqh1.js} +29 -14
- package/bundle/web-dist/server/entry-server.generated.js +3 -2
- package/package.json +1 -1
- package/skills/qgrid/SKILL.md +1 -0
- package/skills/qgrid/references/ai-sdk-provider-contract.md +2 -2
- package/skills/qgrid/references/cli-env-and-server-boot.md +1 -0
- package/skills/qgrid/references/openai-codex-runtime.md +71 -0
- package/skills/qgrid/references/provider-runtime-differences.md +2 -0
- package/skills/qgrid/references/sonamu-api-web-flow.md +1 -1
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +3 -2
|
@@ -482,6 +482,7 @@ var QgridFrameClass = class extends BaseFrameClass {
|
|
|
482
482
|
const { rows: allTokens } = await TokenModel.findMany("A");
|
|
483
483
|
const entry = tokenId ? allTokens.find((e) => e.id === tokenId) : allTokens.findLast((e) => e.active && e.provider === "anthropic");
|
|
484
484
|
if (!entry) return { error: "NOT_FOUND" };
|
|
485
|
+
if (entry.reauth_required) return { error: "re-login required" };
|
|
485
486
|
if (entry.provider === "openai") {
|
|
486
487
|
if (!entry.active) return {
|
|
487
488
|
provider: "openai",
|
|
@@ -513,7 +514,7 @@ var QgridFrameClass = class extends BaseFrameClass {
|
|
|
513
514
|
accessToken = await this.refreshToken(entry);
|
|
514
515
|
} catch (e) {
|
|
515
516
|
oauthLogger.warn(`refresh failed for ${entry.name}: ${e.message}`);
|
|
516
|
-
return { error: "
|
|
517
|
+
return { error: "Token refresh failed; usage is unavailable" };
|
|
517
518
|
}
|
|
518
519
|
const raw = await fetchUsage(accessToken);
|
|
519
520
|
if (raw.error && getRefreshToken(entry.credentials)) try {
|
|
@@ -523,7 +524,7 @@ var QgridFrameClass = class extends BaseFrameClass {
|
|
|
523
524
|
return convertAnthropicUsage(retried);
|
|
524
525
|
} catch (e) {
|
|
525
526
|
oauthLogger.warn(`refresh failed for ${entry.name}: ${e.message}`);
|
|
526
|
-
return { error: "
|
|
527
|
+
return { error: "Token refresh failed; usage is unavailable" };
|
|
527
528
|
}
|
|
528
529
|
if (raw.error) return { error: raw.error };
|
|
529
530
|
return convertAnthropicUsage(raw);
|
|
@@ -774,4 +775,4 @@ function convertAnthropicUsage(raw) {
|
|
|
774
775
|
//#endregion
|
|
775
776
|
export { QgridFrame };
|
|
776
777
|
|
|
777
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBPUEVOQUlfQ0FMTEJBQ0tfUE9SVFMsXG4gIG9wZW5BSUNhbGxiYWNrUmVkaXJlY3RVcmksXG4gIHN0YXJ0T3BlbkFJQ2FsbGJhY2tSZWxheSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWNhbGxiYWNrLXJlbGF5XCI7XG5pbXBvcnQge1xuICBidWlsZE9wZW5BSUF1dGhVcmwsXG4gIGV4Y2hhbmdlT3BlbkFJQ29kZSxcbiAgZ2VuZXJhdGVPcGVuQUlQS0NFLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktb2F1dGhcIjtcbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsLCB0eXBlIFRva2VuVXBkYXRlRmllbGRzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyBUb2tlbkNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQge1xuICBDT05TT0xFX0NBTExCQUNLX1VSTCxcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxuICBSZWZyZXNoRmFpbGVkRXJyb3IsXG59IGZyb20gXCIuL29hdXRoXCI7XG5pbXBvcnQge1xuICBhc3NlcnROYXRpdmVSdW5BZG1pc3Npb24sXG4gIGFmdGVyUXVlcnksXG4gIGJlZm9yZVF1ZXJ5LFxuICBmaW5pc2hSdW5BYm9ydGVkLFxuICBmaW5pc2hSdW5XaXRoRXJyb3IsXG59IGZyb20gXCIuL3FncmlkLXJ1bi1saWZlY3ljbGVcIjtcbmltcG9ydCB7XG4gIGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEsXG4gIHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0LFxuICBRZ3JpZERpc3BhdGNoZXIsXG59IGZyb20gXCIuL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBBcHBlbmRTdGVwSW5wdXQsXG4gIHR5cGUgQ3JlYXRlUnVuSW5wdXQsXG4gIHR5cGUgRmluaXNoUnVuSW5wdXQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsXG4gIFN0cmVhbUV2ZW50cyxcbiAgdHlwZSBUb2tlblN0YXRzLFxuICB0eXBlIFVzYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBkZWFjdGl2YXRlQXV0aERlYWRUb2tlbiwgbm90aWZ5VG9rZW5BZGRlZCB9IGZyb20gXCIuL3Rva2VuLWRlYXRoXCI7XG5pbXBvcnQgeyBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvciB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uLXNjaGVtYVwiO1xuXG5jb25zdCBwZW5kaW5nU3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBRdWVyeUlucHV0PigpO1xuXG50eXBlIFBlbmRpbmdPQXV0aCA9IHtcbiAgY29kZVZlcmlmaWVyOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVkaXJlY3RVcmk6IHN0cmluZztcbiAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIgfCBcIm9wZW5haVwiO1xufTtcbmNvbnN0IE9BVVRIX1NUQVRFX1BSRUZJWCA9IFwib2F1dGg6c3RhdGU6XCI7XG5jb25zdCBPQVVUSF9TVEFURV9UVEwgPSBcIjVtXCI7XG5jb25zdCBPQVVUSF9TVEFURV9UVExfTVMgPSA1ICogNjBfMDAwO1xuXG5mdW5jdGlvbiB1bml4U2Vjb25kc1RvSXNvKHNlY29uZHM6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWNvbmRzID09PSBcIm51bWJlclwiID8gbmV3IERhdGUoc2Vjb25kcyAqIDEwMDApLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcsIGRhdGE6IFBlbmRpbmdPQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBhd2FpdCBjYWNoZS5zZXQoe1xuICAgIGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCxcbiAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgdHRsOiBPQVVUSF9TVEFURV9UVEwsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPFBlbmRpbmdPQXV0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBjb25zdCByYXcgPSBhd2FpdCBjYWNoZS5nZXQ8c3RyaW5nPih7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgUGVuZGluZ09BdXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgcmV0dXJuO1xuICBhd2FpdCBjYWNoZS5kZWxldGUoeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG59XG5cbmNvbnN0IHRydXN0ZWRMb29wYmFja0Jhc2UgPSAoKSA9PiBgaHR0cDovL2xvY2FsaG9zdDoke3Byb2Nlc3MuZW52LlBPUlQgPz8gXCI0NDkwMFwifWA7XG5cbmZ1bmN0aW9uIGlzUmVtb3RlT0F1dGhSZXF1ZXN0KCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBvcmlnaW4gPSB0eXBlb2YgaGVhZGVycy5vcmlnaW4gPT09IFwic3RyaW5nXCIgPyBoZWFkZXJzLm9yaWdpbiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBmb3J3YXJkZWQgPSBoZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXTtcbiAgICBjb25zdCByYXdIb3N0ID0gQXJyYXkuaXNBcnJheShmb3J3YXJkZWQpID8gZm9yd2FyZGVkWzBdIDogKGZvcndhcmRlZCA/PyBoZWFkZXJzLmhvc3QpO1xuICAgIGNvbnN0IGhvc3QgPSBvcmlnaW5cbiAgICAgID8gbmV3IFVSTChvcmlnaW4pLmhvc3RuYW1lXG4gICAgICA6IG5ldyBVUkwoYGh0dHA6Ly8ke3Jhd0hvc3QgPz8gXCJsb2NhbGhvc3RcIn1gKS5ob3N0bmFtZTtcbiAgICByZXR1cm4gIW5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiOjoxXCIsIFwiWzo6MV1cIl0pLmhhcyhob3N0KTtcbiAgfSBjYXRjaCB7fVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIEFudGhyb3BpYydzIHJlbW90ZS9tYW51YWwgZmxvdyB1c2VzIGl0cyBmaXhlZCBjb25zb2xlIGNhbGxiYWNrLiBIZWFkZXJzIG1heSBzZWxlY3QgYmV0d2VlbiB0d29cbi8vIGFsbG93bGlzdGVkIFVSSXMsIGJ1dCBuZXZlciBjb250cmlidXRlIGF1dGhvcml0eSBvciBwYXRoIGJ5dGVzIHRvIGVpdGhlciBVUkkuXG5mdW5jdGlvbiByZXNvbHZlT0F1dGhSZWRpcmVjdCgpOiB7IHJlZGlyZWN0VXJpOiBzdHJpbmc7IG1vZGU6IFwicmVkaXJlY3RcIiB8IFwiY29kZVwiIH0ge1xuICBpZiAoaXNSZW1vdGVPQXV0aFJlcXVlc3QoKSkge1xuICAgIHJldHVybiB7IHJlZGlyZWN0VXJpOiBDT05TT0xFX0NBTExCQUNLX1VSTCwgbW9kZTogXCJjb2RlXCIgfTtcbiAgfVxuICByZXR1cm4geyByZWRpcmVjdFVyaTogYCR7dHJ1c3RlZExvb3BiYWNrQmFzZSgpfS9jYWxsYmFja2AsIG1vZGU6IFwicmVkaXJlY3RcIiB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVBhc3RlZE9BdXRoUmVzdWx0KGlucHV0OiBzdHJpbmcpOiB7IGNvZGU6IHN0cmluZzsgc3RhdGU6IHN0cmluZyB9IHwgbnVsbCB7XG4gIGNvbnN0IHRyaW1tZWQgPSBpbnB1dC50cmltKCk7XG4gIHRyeSB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSBuZXcgVVJMKHRyaW1tZWQpO1xuICAgIGNvbnN0IGNvZGUgPSBjYWxsYmFjay5zZWFyY2hQYXJhbXMuZ2V0KFwiY29kZVwiKT8udHJpbSgpID8/IFwiXCI7XG4gICAgY29uc3Qgc3RhdGUgPSBjYWxsYmFjay5zZWFyY2hQYXJhbXMuZ2V0KFwic3RhdGVcIik/LnRyaW0oKSA/PyBcIlwiO1xuICAgIGlmIChjb2RlICYmIHN0YXRlKSByZXR1cm4geyBjb2RlLCBzdGF0ZSB9O1xuICB9IGNhdGNoIHt9XG5cbiAgY29uc3Qgc2VwYXJhdG9yQXQgPSB0cmltbWVkLmluZGV4T2YoXCIjXCIpO1xuICBjb25zdCBjb2RlID0gc2VwYXJhdG9yQXQgPiAwID8gdHJpbW1lZC5zbGljZSgwLCBzZXBhcmF0b3JBdCkudHJpbSgpIDogXCJcIjtcbiAgY29uc3Qgc3RhdGUgPSBzZXBhcmF0b3JBdCA+IDAgPyB0cmltbWVkLnNsaWNlKHNlcGFyYXRvckF0ICsgMSkudHJpbSgpIDogXCJcIjtcbiAgcmV0dXJuIGNvZGUgJiYgc3RhdGUgPyB7IGNvZGUsIHN0YXRlIH0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoIWFyZ3MuaW1hZ2VHZW5lcmF0aW9uKSByZXR1cm47XG4gIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgIFwicWdyaWQ6IGltYWdlR2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggc3RyZWFtaW5nOyB1c2UgcXVlcnkvZ2VuZXJhdGVUZXh0IGluc3RlYWQuXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICApO1xufVxuXG4vLyBhbnRocm9waWMg7J2AIC0tanNvbi1zY2hlbWEg66W8IOyTsOyngCDslYrsnLzrr4DroZwoU09OLTUzMikgc3RyaWN0IOuzgO2ZmMK3YXJndiDsoJztlZwg7JeG7J20IOybkO2YleydmFxuLy8g6rWs66y4wrfrs7XsnqHrj4Trp4wg6rKA7Kad65Cc64ukIOKAlCBwcm92aWRlciDrtoTquLDripQgYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYSDqsIAg7IaM7Jyg7ZWc64ukLlxuZnVuY3Rpb24gcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoYXJncy5qc29uU2NoZW1hID09PSB1bmRlZmluZWQgJiYgIWFyZ3MudG9vbHM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShhcmdzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB8fFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvclxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oZXJyb3IubWVzc2FnZSBhcyBMb2NhbGl6ZWRTdHJpbmcpO1xuICAgIH1cbiAgICAvLyDsnpjrqrvrkJwga2V5d29yZCDtmJXtg5woYW55T2Yg66W8IOqwneyytOuhnCDrs7TrgrTripQg65OxKeuKlCDtjIzsnbTtlITrnbzsnbjsl5DshJwgdW50eXBlZCDsmKTrpZjroZwg64KY7Jik66+A66GcLFxuICAgIC8vIO2DgOyehSDsooHtnojquLAg64yA7IugIEVycm9yIOyghOyytOulvCBjYWxsZXItZmF1bHQgNDAwIOycvOuhnCDrp6TtlZHtlZzri6Qo6rOE7JW9IO2FjOyKpO2KuOuhnCDqs6DsoJXrkKgpLlxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgYHFncmlkOiBjYWxsZXIgc2NoZW1hIGNhbm5vdCBiZSBub3JtYWxpemVkOiAke2Vycm9yLm1lc3NhZ2V9YCBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVG9rZW5OYW1lKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPEludGVybmFsUXVlcnlJbnB1dD4ge1xuICBpZiAoIWFyZ3MudG9rZW5OYW1lKSByZXR1cm4gYXJncztcblxuICBjb25zdCB0b2tlblByb3ZpZGVyID0gYXJncy50b2tlbk5hbWUuc3BsaXQoXCIvXCIsIDEpWzBdO1xuICBjb25zdCBtb2RlbFByb3ZpZGVyID0gYXJncy5tb2RlbD8uc3BsaXQoXCIvXCIsIDEpWzBdO1xuICBpZiAodG9rZW5Qcm92aWRlciAhPT0gXCJhbnRocm9waWNcIiAmJiB0b2tlblByb3ZpZGVyICE9PSBcIm9wZW5haVwiKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oYEludmFsaWQgdG9rZW4gbmFtZTogJHthcmdzLnRva2VuTmFtZX1gIGFzIExvY2FsaXplZFN0cmluZyk7XG4gIH1cbiAgaWYgKG1vZGVsUHJvdmlkZXIgIT09IHRva2VuUHJvdmlkZXIpIHtcbiAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgIFwiVG9rZW4gcHJvdmlkZXIgZG9lcyBub3QgbWF0Y2ggbW9kZWwgcHJvdmlkZXJcIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQWN0aXZlQnlQcm92aWRlckFuZE5hbWUoXCJBXCIsIHRva2VuUHJvdmlkZXIsIGFyZ3MudG9rZW5OYW1lKTtcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGBBY3RpdmUgdG9rZW4gbm90IGZvdW5kOiAke2FyZ3MudG9rZW5OYW1lfWAgYXMgTG9jYWxpemVkU3RyaW5nKTtcbiAgfVxuICByZXR1cm4geyAuLi5hcmdzLCBwcmVmZXJyZWRUb2tlbklkOiB0b2tlbi5pZCwgcmVxdWlyZVByZWZlcnJlZFRva2VuOiB0cnVlIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUh0dHBEaXNjb25uZWN0SGFuZGxlKCk6IHtcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgZGlzcG9zZTogKCkgPT4gdm9pZDtcbn0ge1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGxldCByZXF1ZXN0UmF3OiBGYXN0aWZ5UmVxdWVzdFtcInJhd1wiXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlc3BvbnNlUmF3OiBGYXN0aWZ5UmVwbHlbXCJyYXdcIl0gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJlcXVlc3RSYXcgPSBjdHgucmVxdWVzdD8ucmF3O1xuICAgIGlmIChjdHgudHJhbnNwb3J0ID09PSBcImh0dHBcIikgcmVzcG9uc2VSYXcgPSBjdHgucmVwbHkucmF3O1xuICB9IGNhdGNoIHtcbiAgICAvLyBEaXJlY3QgZnJhbWUgY2FsbHMgKGZvciBleGFtcGxlIHVuaXQgdGVzdHMpIGRvIG5vdCBoYXZlIGFuIEhUVFAgY29udGV4dC5cbiAgfVxuXG4gIGNvbnN0IGFib3J0ID0gKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIGNvbnN0IGFib3J0T25JbmNvbXBsZXRlUmVzcG9uc2VDbG9zZSA9ICgpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlUmF3Py53cml0YWJsZUVuZGVkKSBhYm9ydCgpO1xuICB9O1xuXG4gIHJlcXVlc3RSYXc/Lm9uY2UoXCJhYm9ydGVkXCIsIGFib3J0KTtcbiAgcmVzcG9uc2VSYXc/Lm9uY2UoXCJjbG9zZVwiLCBhYm9ydE9uSW5jb21wbGV0ZVJlc3BvbnNlQ2xvc2UpO1xuXG4gIGlmIChyZXF1ZXN0UmF3Py5hYm9ydGVkIHx8IChyZXNwb25zZVJhdz8uZGVzdHJveWVkICYmICFyZXNwb25zZVJhdy53cml0YWJsZUVuZGVkKSkge1xuICAgIGFib3J0KCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICByZXF1ZXN0UmF3Py5yZW1vdmVMaXN0ZW5lcihcImFib3J0ZWRcIiwgYWJvcnQpO1xuICAgICAgcmVzcG9uc2VSYXc/LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgYWJvcnRPbkluY29tcGxldGVSZXNwb25zZUNsb3NlKTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIl0pO1xuY29uc3Qgb2F1dGhMb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvYXV0aFwiXSk7XG5cbi8vIHBlci10b2tlbiByZWZyZXNoIGRlZHVwIOKAlCDtmozsoIQg6rK57Lmo7Jy866GcIOyduO2VnCDsgqzrp50g7Jik7YyQ7J2EIOunieuKlOuLpC5cbmNvbnN0IGluZmxpZ2h0QW50aHJvcGljUmVmcmVzaCA9IG5ldyBNYXA8bnVtYmVyLCBQcm9taXNlPHN0cmluZz4+KCk7XG5cbmNsYXNzIFFncmlkRnJhbWVDbGFzcyBleHRlbmRzIEJhc2VGcmFtZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJRZ3JpZFwiKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBxdWVyeShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGFzc2VydE5hdGl2ZVJ1bkFkbWlzc2lvbigpO1xuICAgIHJlamVjdEludmFsaWRDYWxsZXJTY2hlbWFzKGFyZ3MpO1xuICAgIGNvbnN0IHJlc29sdmVkQXJncyA9IGF3YWl0IHJlc29sdmVUb2tlbk5hbWUoYXJncyk7XG4gICAgY29uc3QgZGlzY29ubmVjdCA9IGNyZWF0ZUh0dHBEaXNjb25uZWN0SGFuZGxlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyZXNvbHZlZEFyZ3MubG9nZ2VyID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5KHJlc29sdmVkQXJncywgZGlzY29ubmVjdC5zaWduYWwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4IH0gPSBhd2FpdCBiZWZvcmVRdWVyeShyZXNvbHZlZEFyZ3MpO1xuICAgICAgbGV0IHJlc3VsdDogUXVlcnlPdXRwdXQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkocmVzb2x2ZWRBcmdzLCBkaXNjb25uZWN0LnNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIHJlc29sdmVkQXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIHJlc29sdmVkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShyZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCwgcmVzb2x2ZWRBcmdzLCByZXN1bHQpO1xuICAgICAgICBpZiAoZGlzY29ubmVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkLCByZXNvbHZlZEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRvb2wtY2FsbCByZXF1ZXN0TG9nSWTsmYAgcHJvdmlkZXIgdGhyZWFkQ29vcmTripQg7ISc66GcIOuPheumveyggeycvOuhnCDsnKDsp4DtlZzri6QuXG4gICAgICAgIGNvbnN0IHRocmVhZENvb3JkID0gcmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkO1xuICAgICAgICBjb25zdCBydW5Db250ZXh0ID1cbiAgICAgICAgICBsaWZlY3ljbGUucnVuQ29udGV4dCB8fCB0aHJlYWRDb29yZFxuICAgICAgICAgICAgPyB7IC4uLmxpZmVjeWNsZS5ydW5Db250ZXh0LCAuLi4odGhyZWFkQ29vcmQgPyB7IHRocmVhZENvb3JkIH0gOiB7fSkgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgcnVuQ29udGV4dCB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYHF1ZXJ5IGFmdGVyUXVlcnkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICBpZiAoZGlzY29ubmVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkLCByZXNvbHZlZEFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihyZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCByZXNvbHZlZEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHByb3ZpZGVyIOydkeuLteydgCDshLHqs7XtlojsnLzrr4DroZwg66Gc6rmFIOyepeyVoOqwgCDsg53shLEg6rKw6rO866W8IOuNruyWtOyTsOyngCDslYrripTri6QuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc2Nvbm5lY3QuZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBwcmVwYXJlU3RyZWFtKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHsgc3RyZWFtSWQ6IHN0cmluZyB9PiB7XG4gICAgYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uKCk7XG4gICAgcmVqZWN0SW1hZ2VHZW5lcmF0aW9uU3RyZWFtKGFyZ3MpO1xuICAgIHJlamVjdEludmFsaWRDYWxsZXJTY2hlbWFzKGFyZ3MpO1xuICAgIGNvbnN0IHJlc29sdmVkQXJncyA9IGF3YWl0IHJlc29sdmVUb2tlbk5hbWUoYXJncyk7XG4gICAgY29uc3Qgc3RyZWFtSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIHBlbmRpbmdTdHJlYW1zLnNldChzdHJlYW1JZCwgcmVzb2x2ZWRBcmdzKTtcbiAgICBjb25zdCBleHBpcnkgPSBzZXRUaW1lb3V0KCgpID0+IHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCksIDMwXzAwMCk7XG4gICAgZXhwaXJ5LnVucmVmPy4oKTtcbiAgICByZXR1cm4geyBzdHJlYW1JZCB9O1xuICB9XG5cbiAgQHN0cmVhbSh7IHR5cGU6IFwic3NlXCIsIGV2ZW50czogU3RyZWFtRXZlbnRzIH0pXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKHN0cmVhbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzID0gcGVuZGluZ1N0cmVhbXMuZ2V0KHN0cmVhbUlkKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5kZWxldGUoc3RyZWFtSWQpO1xuICAgIGlmICghYXJncykgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvciBleHBpcmVkIHN0cmVhbUlkXCIpO1xuICAgIGFzc2VydE5hdGl2ZVJ1bkFkbWlzc2lvbigpO1xuICAgIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzKTtcblxuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3NlID0gY3R4LmNyZWF0ZVNTRShTdHJlYW1FdmVudHMpO1xuICAgIGxldCBzdHJlYW1SZXN1bHQ6IFF1ZXJ5T3V0cHV0IHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1FcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNsaWVudENsb3NlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIHNzZS5vbkNsb3NlKCgpID0+IHtcbiAgICAgIGNsaWVudENsb3NlZCA9IHRydWU7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9KTtcblxuICAgIGxldCBydW5JbmZvOiB7IHJlcXVlc3RMb2dJZDogbnVtYmVyOyBzdGVwSW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgIGlmIChhcmdzLmxvZ2dlciAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIHByb3ZpZGVyIOyLpO2WiSDsoIQgcnVubmluZyByb3cg7IOd7ISx7JeQIOyLpO2MqO2VmOuptCBsb2dnZWQg7JqU7LKt7Jy866GcIOynhO2Wie2VmOyngCDslYrripTri6QuXG4gICAgICBydW5JbmZvID0gYXdhaXQgYmVmb3JlUXVlcnkoYXJncyk7XG4gICAgfVxuXG4gICAgLy8gYmVmb3JlUXVlcnkgREIg7J6R7JeFIOykkSBjbG9zZeulvCDrhpPsuZjsp4Ag7JWK6rOgIHByb3ZpZGVyIOyLpO2WiSDsoITsl5Ag66eI6rCQ7ZWc64ukLlxuICAgIGlmIChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkge1xuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnlTdHJlYW0oXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiAodGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZGVsdGFcIiwgeyB0ZXh0IH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgc3RyZWFtRXJyb3IgPSBlcnI7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RyZWFtRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgIH1cblxuICAgIC8vIHByb3ZpZGVyIOqysOqzvOqwgCDsl4bripQgY2xvc2XripQg7KaJ7IucIGFib3J0ZWTroZwg66eI6rCQ7ZWc64ukLlxuICAgIGlmIChjbGllbnRDbG9zZWQgJiYgIXN0cmVhbVJlc3VsdCkge1xuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGRpc3BhdGNoZXIg7JmE66OMIO2bhCBsaWZlY3ljbGUg7LKY66asIChhd2FpdCDslYjsoIQpXG4gICAgaWYgKHN0cmVhbVJlc3VsdCkge1xuICAgICAgLy8gZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZCDsnqzsgqzsmqkg7KKM7ZGc64qUIGxvZ2dlciDshKTsoJXqs7wg66y06rSA7ZWY6rKMIO2ajOyGoe2VnOuLpC5cbiAgICAgIGNvbnN0IHRocmVhZENvb3JkID0gc3RyZWFtUmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkO1xuICAgICAgbGV0IHJ1bkNvbnRleHQ6IFFncmlkUnVuQ29udGV4dCB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRocmVhZENvb3JkICE9PSB1bmRlZmluZWQgPyB7IHRocmVhZENvb3JkIH0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocnVuSW5mbykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGNsb3NlIO2bhCDrj4TssKntlZwg6rKw6rO864+EIHN0ZXAvdXNhZ2XripQg64Ko6riw65CYLCDslYTrnpjsl5DshJwg7LWc7KKFIHN0YXR1c+ulvCBhYm9ydGVk66GcIOuNruyWtOyTtOuLpC5cbiAgICAgICAgICBjb25zdCBsaWZlY3ljbGUgPSBhd2FpdCBhZnRlclF1ZXJ5KFxuICAgICAgICAgICAgcnVuSW5mby5yZXF1ZXN0TG9nSWQsXG4gICAgICAgICAgICBydW5JbmZvLnN0ZXBJbmRleCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBzdHJlYW1SZXN1bHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBydW5Db250ZXh0ID1cbiAgICAgICAgICAgIGxpZmVjeWNsZS5ydW5Db250ZXh0IHx8IHRocmVhZENvb3JkXG4gICAgICAgICAgICAgID8geyAuLi5saWZlY3ljbGUucnVuQ29udGV4dCwgLi4uKHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDoge30pIH1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAvLyBhZnRlclF1ZXJ56rCAIOynhO2WieuQmOuKlCDsgqzsnbQgY2xpZW506rCAIOuLq+2ejCDqsr3smrAg7JmE66OMIOyDge2DnOulvCBhYm9ydGVk66GcIOuQmOuPjOumsOuLpC5cbiAgICAgICAgICBpZiAoY2xpZW50Q2xvc2VkKSB7XG4gICAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBhZnRlclF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcblxuICAgICAgICAgIGlmIChjbGllbnRDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZG9uZVwiLCB7IC4uLnN0cmVhbVJlc3VsdCwgcnVuQ29udGV4dCB9KTtcbiAgICB9IGVsc2UgaWYgKHN0cmVhbUVycm9yKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBzdHJlYW1FcnJvci5tZXNzYWdlLCBhcmdzKTtcbiAgICAgIGlmICghY2xpZW50Q2xvc2VkICYmICFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImVycm9yXCIsIHsgbWVzc2FnZTogc3RyZWFtRXJyb3IubWVzc2FnZSB9KTtcbiAgICB9IGVsc2UgaWYgKChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkgJiYgcnVuSW5mbykge1xuICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgfVxuXG4gICAgYXdhaXQgc3NlLmVuZCgpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGNyZWF0ZVJ1bihpbnB1dDogQ3JlYXRlUnVuSW5wdXQpOiBQcm9taXNlPHsgcmVxdWVzdExvZ0lkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGlucHV0LnVzZXJQcm9tcHQsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGlucHV0LnByb2plY3ROYW1lLFxuICAgICAgc3lzdGVtX3Byb21wdDogaW5wdXQuc3lzdGVtUHJvbXB0LFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICBpc19zdHJ1Y3R1cmVkOiBpbnB1dC5pc1N0cnVjdHVyZWQsXG4gICAgICBqc29uX3NjaGVtYTogaW5wdXQuanNvblNjaGVtYSxcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXF1ZXN0TG9nSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhcHBlbmRTdGVwKGlucHV0OiBBcHBlbmRTdGVwSW5wdXQpOiBQcm9taXNlPHsgc3RlcElkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0ZXBJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RlcF9pbmRleDogaW5wdXQuc3RlcEluZGV4LFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5yZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgICBmYWxsYmFja19jb3VudDogaW5wdXQuZmFsbGJhY2tDb3VudCxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LmNhY2hlQ3JlYXRpb24xaFRva2VucyxcbiAgICAgIGNvc3RfdXNkOiBpbnB1dC5jb3N0VXNkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNYXRoLnJvdW5kKGlucHV0LmNvc3RVc2QgKiBNSUNST19VU0QpLFxuICAgICAgY29zdF9zb3VyY2U6IGlucHV0LmNvc3RTb3VyY2UsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRfbXM6IGlucHV0LnR0ZnRNcyA/PyBudWxsLFxuICAgICAgZmluaXNoX3JlYXNvbjogaW5wdXQuZmluaXNoUmVhc29uLFxuICAgICAgcmVhc29uaW5nX3RleHQ6IGlucHV0LnJlYXNvbmluZ1RleHQsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBpbnB1dC5yZWFzb25pbmdUb2tlbnMsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGlucHV0LnRvb2xDYWxsSW5kZXgsXG4gICAgICB0b29sX2NhbGxfaWQ6IGlucHV0LnRvb2xDYWxsSWQsXG4gICAgICB0b29sX25hbWU6IGlucHV0LnRvb2xOYW1lLFxuICAgICAgdG9vbF9hcmdzOiBpbnB1dC50b29sQXJncyxcbiAgICAgIHRvb2xfcmVzdWx0OiBpbnB1dC50b29sUmVzdWx0LFxuICAgICAgdG9vbF9kdXJhdGlvbl9tczogaW5wdXQudG9vbER1cmF0aW9uTXMsXG4gICAgICBlcnJvcjogaW5wdXQuZXJyb3IsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3RlcElkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZmluaXNoUnVuKGlucHV0OiBGaW5pc2hSdW5JbnB1dCk6IFByb21pc2U8eyBvazogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgcmVzcG9uc2U6IGlucHV0LnJlc3BvbnNlLFxuICAgICAgdG9rZW5fbmFtZTogaW5wdXQudG9rZW5OYW1lLFxuICAgICAgbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGlucHV0LnJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBpbnB1dC5mYWxsYmFja0NvdW50LFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC50b3RhbElucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQudG90YWxPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQudG90YWxDYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogaW5wdXQudG90YWxDYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvbjFoVG9rZW5zLFxuICAgICAgY29zdF91c2Q6IGlucHV0LmNvc3RVc2QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE1hdGgucm91bmQoaW5wdXQuY29zdFVzZCAqIE1JQ1JPX1VTRCksXG4gICAgICBjb3N0X3NvdXJjZTogaW5wdXQuY29zdFNvdXJjZSxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC50b3RhbER1cmF0aW9uTXMsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yX21lc3NhZ2U6IGlucHV0LmVycm9yTWVzc2FnZSxcbiAgICAgIHJlc3BvbnNlX2pzb25fb2s6IGlucHV0LnJlc3BvbnNlSnNvbk9rLFxuICAgIH0pO1xuICAgIHJldHVybiB7IG9rOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBzdGF0cygpOiBQcm9taXNlPFRva2VuU3RhdHNbXT4ge1xuICAgIHJldHVybiBRZ3JpZERpc3BhdGNoZXIuZ2V0U3RhdHMoKTtcbiAgfVxuXG4gIC8vIO2ZlOuptOydmCDrqqnroZ0g7ZWE7YSw66W8IOq3uOuMgOuhnCDrsJvslYQg6rCZ7J2AIOyhsOqxtOydmCDtlanqs4Trpbwg64+M66Ck7KSA64ukIOKAlCDrqqnroZ3qs7wg67mE7Jqp7J20XG4gIC8vIOyEnOuhnCDri6Trpbgg66qo7IiY66W8IOuztOuptCDsgqzsmqnsnpDsl5DqsozripQg7Iir7J6Q6rCAIOyWtOq4i+uCnCDqsoPsnLzroZwg7J297Z6M64ukLlxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB0b3RhbENvc3QocGFyYW1zPzogUmVxdWVzdExvZ0xpc3RQYXJhbXMpOiBQcm9taXNlPHsgdXNkOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB7IHVzZDogYXdhaXQgUmVxdWVzdExvZ01vZGVsLnRvdGFsQ29zdChwYXJhbXMpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBwcm9qZWN0TmFtZXMoKTogUHJvbWlzZTx7IG5hbWVzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5kaXN0aW5jdFByb2plY3ROYW1lcygpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBtb2RlbE5hbWVzKCk6IFByb21pc2U8eyBuYW1lczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiB7IG5hbWVzOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZGlzdGluY3RNb2RlbE5hbWVzKCkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhZGRUb2tlbihcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGFkZGVkOiBib29sZWFuIH0+IHtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBwcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIG5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFkZGVkOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0PzogbnVtYmVyLFxuICAgIGtlZXBhbGl2ZUVuYWJsZWQ/OiBib29sZWFuLFxuICApOiBQcm9taXNlPHsgdXBkYXRlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKFxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IG51bGwgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihxdW90YVRocmVzaG9sZCkgfHwgcXVvdGFUaHJlc2hvbGQgPCAxIHx8IHF1b3RhVGhyZXNob2xkID4gMTAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwicXVvdGFUaHJlc2hvbGQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwLCBvciBudWxsXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHdlaWdodCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcih3ZWlnaHQpIHx8IHdlaWdodCA8IDEgfHwgd2VpZ2h0ID4gMTAwKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwid2VpZ2h0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0Y2g6IFRva2VuVXBkYXRlRmllbGRzID0ge307XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgcGF0Y2gubmFtZSA9IG5hbWU7XG4gICAgaWYgKHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHBhdGNoLnF1b3RhX3RocmVzaG9sZCA9IHF1b3RhVGhyZXNob2xkO1xuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCkgcGF0Y2gud2VpZ2h0ID0gd2VpZ2h0O1xuICAgIGlmIChrZWVwYWxpdmVFbmFibGVkICE9PSB1bmRlZmluZWQpIHBhdGNoLmtlZXBhbGl2ZV9lbmFibGVkID0ga2VlcGFsaXZlRW5hYmxlZDtcbiAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgdXBkYXRlZDogZmFsc2UgfTtcblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBUb2tlbk1vZGVsLnVwZGF0ZUZpZWxkcyhpZCwgcGF0Y2gpO1xuICAgIHJldHVybiB7IHVwZGF0ZWQ6IHVwZGF0ZWQgPiAwIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcmVtb3ZlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyByZW1vdmVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyByZW1vdmVkOiBmYWxzZSB9O1xuICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKFtlbnRyeS5pZF0pO1xuICAgIHJldHVybiB7IHJlbW92ZWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthqDtgbAg7Zmc7ISx7ZmUL+u5hO2ZnOyEse2ZlCDthqDquIAgRELsnZggYWN0aXZlIO2VhOuTnCDsl4XrjbDsnbTtirhcbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyB0b2dnbGVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IGFjdGl2ZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgVG9rZW5Nb2RlbC50b2dnbGVBY3RpdmUoaWQpO1xuICAgIGlmICghcmVzdWx0KSByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG4gICAgaWYgKHJlc3VsdC5yZWF1dGhSZXF1aXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXCJSZS1sb2dpbiByZXF1aXJlZFwiIGFzIExvY2FsaXplZFN0cmluZyk7XG4gICAgfVxuICAgIHJldHVybiB7IGFjdGl2ZTogcmVzdWx0LmFjdGl2ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgeyBjb2RlVmVyaWZpZXIsIGNvZGVDaGFsbGVuZ2UsIHN0YXRlIH0gPSBnZW5lcmF0ZVBLQ0UoKTtcblxuICAgIGNvbnN0IHsgcmVkaXJlY3RVcmksIG1vZGUgfSA9IHJlc29sdmVPQXV0aFJlZGlyZWN0KCk7XG4gICAgY29uc3QgYXV0aFVybCA9IGJ1aWxkQXV0aFVybChjb2RlQ2hhbGxlbmdlLCBzdGF0ZSwgcmVkaXJlY3RVcmkpO1xuXG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpLCBwcm92aWRlcjogXCJhbnRocm9waWNcIiB9KTtcblxuICAgIHJldHVybiB7IGF1dGhVcmwsIG1vZGUgfTtcbiAgfVxuXG4gIC8vIOybkOqyqSDsoJHsho3snZgg7IiY64+ZIOyZhOujjDogQW50aHJvcGljIGBjb2RlI3N0YXRlYCDrmJDripQgT3BlbkFJIGNhbGxiYWNrIFVSTOydhCDrsJvslYQg6rWQ7ZmY7ZWc64ukLlxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhDb21wbGV0ZShwYXN0ZWRDb2RlOiBzdHJpbmcpOiBQcm9taXNlPHsgYWRkZWQ6IGJvb2xlYW47IG5hbWU6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VQYXN0ZWRPQXV0aFJlc3VsdChwYXN0ZWRDb2RlKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwiZXhwZWN0ZWQgdGhlIGNhbGxiYWNrIFVSTCBvciBjb2RlIHNob3duIGFmdGVyIGxvZ2luLCBpbiBjb2RlI3N0YXRlIGZvcm1cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIHN0YXRlIH0gPSByZXN1bHQ7XG5cbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgXCJsb2dpbiBzZXNzaW9uIG5vdCBmb3VuZCBvciBleHBpcmVkIOKAlCBzdGFydCB0aGUgbG9naW4gYWdhaW5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBkZWxldGVPQXV0aFN0YXRlKHN0YXRlKTtcblxuICAgIGlmIChwZW5kaW5nLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbXBsZXRlT3BlbkFJTG9naW4oY29kZSwgcGVuZGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVBbnRocm9waWNMb2dpbihjb2RlLCBzdGF0ZSwgcGVuZGluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWRkZWQ6IHRydWUsIG5hbWU6IHBlbmRpbmcubmFtZSB9O1xuICB9XG5cbiAgLy8g6rWQ7ZmYICsg6rOE7KCVIOykkeuztSDsoJzqsbAgKyDsoIDsnqUg4oCUIHJlZGlyZWN0IOy9nOuwseqzvCDsvZTrk5wg67aZ7Jes64Sj6riwIO2UjOuhnOyasOqwgCDqs7XsnKDtlZzri6QuXG4gIHByaXZhdGUgYXN5bmMgY29tcGxldGVBbnRocm9waWNMb2dpbihcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgc3RhdGU6IHN0cmluZyxcbiAgICBwZW5kaW5nOiBQZW5kaW5nT0F1dGgsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGV4Y2hhbmdlQ29kZUZvclRva2VucyhcbiAgICAgIGNvZGUsXG4gICAgICBwZW5kaW5nLmNvZGVWZXJpZmllcixcbiAgICAgIHN0YXRlLFxuICAgICAgcGVuZGluZy5yZWRpcmVjdFVyaSxcbiAgICApO1xuXG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5yZXBsYWNlQnlBY2NvdW50KFwiYW50aHJvcGljXCIsIHRva2Vucy5hY2NvdW50VXVpZCwge1xuICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBhY2Nlc3NUb2tlbjogdG9rZW5zLmFjY2Vzc1Rva2VuLFxuICAgICAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgIGV4cGlyZXNBdDogdG9rZW5zLmV4cGlyZXNBdCA/PyAwLFxuICAgICAgICBhY2NvdW50VXVpZDogdG9rZW5zLmFjY291bnRVdWlkID8/IFwiXCIsXG4gICAgICB9LFxuICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgIH0pO1xuXG4gICAgbm90aWZ5VG9rZW5BZGRlZChwZW5kaW5nLm5hbWUsIFwiYW50aHJvcGljXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb21wbGV0ZU9wZW5BSUxvZ2luKGNvZGU6IHN0cmluZywgcGVuZGluZzogUGVuZGluZ09BdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3JlZHMgPSBhd2FpdCBleGNoYW5nZU9wZW5BSUNvZGUoY29kZSwgcGVuZGluZy5jb2RlVmVyaWZpZXIsIHBlbmRpbmcucmVkaXJlY3RVcmkpO1xuICAgIGF3YWl0IFRva2VuTW9kZWwucmVwbGFjZUJ5QWNjb3VudChcIm9wZW5haVwiLCBjcmVkcy5hY2NvdW50SWQsIHtcbiAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgY3JlZGVudGlhbHM6IGNyZWRzLFxuICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGBPcGVuQUkgdG9rZW4gc2F2ZWQgZm9yICR7cGVuZGluZy5uYW1lfWApO1xuICAgIG5vdGlmeVRva2VuQWRkZWQocGVuZGluZy5uYW1lLCBcIm9wZW5haVwiKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU9BdXRoQ2FsbGJhY2soY29kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IGF3YWl0IGdldE9BdXRoU3RhdGUoc3RhdGUpO1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgbG9nZ2VyLndhcm4oXCJvYXV0aCBjYWxsYmFjazogaW52YWxpZF9zdGF0ZVwiKTtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPWludmFsaWRfc3RhdGVcIik7XG4gICAgfVxuICAgIGF3YWl0IGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChwZW5kaW5nLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVPcGVuQUlMb2dpbihjb2RlLCBwZW5kaW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVBbnRocm9waWNMb2dpbihjb2RlLCBzdGF0ZSwgcGVuZGluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9c3VjY2VzcyZuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBlbmRpbmcubmFtZSl9YCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBsb2dnZXIud2FybihcIm9hdXRoIGNhbGxiYWNrIGZhaWxlZFwiLCB7XG4gICAgICAgIHByb3ZpZGVyOiBwZW5kaW5nLnByb3ZpZGVyLFxuICAgICAgICByZWFzb246IFwiZXhjaGFuZ2VfZmFpbGVkXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPWV4Y2hhbmdlX2ZhaWxlZFwiKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydE9wZW5BSShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGNvZGVWZXJpZmllciwgY29kZUNoYWxsZW5nZSwgc3RhdGUgfSA9IGdlbmVyYXRlT3BlbkFJUEtDRSgpO1xuICAgIGNvbnN0IG1vZGUgPSBpc1JlbW90ZU9BdXRoUmVxdWVzdCgpID8gXCJjb2RlXCIgOiBcInJlZGlyZWN0XCI7XG4gICAgbGV0IHJlZGlyZWN0VXJpOiBzdHJpbmc7XG4gICAgaWYgKG1vZGUgPT09IFwiY29kZVwiKSB7XG4gICAgICAvLyBPcGVuQUkgYWNjZXB0cyBvbmx5IHRoZSBDb2RleCBDTEkncyByZWdpc3RlcmVkIGxvb3BiYWNrIFVSSS4gT24gYSByZW1vdGUgZGFzaGJvYXJkIHRoZVxuICAgICAgLy8gYnJvd3NlciBjYW5ub3QgcmVhY2ggdGhlIHNlcnZlcidzIGxvb3BiYWNrLCBzbyB0aGUgdXNlciBwYXN0ZXMgdGhlIHJlc3VsdGluZyBjYWxsYmFjayBVUkwuXG4gICAgICByZWRpcmVjdFVyaSA9IG9wZW5BSUNhbGxiYWNrUmVkaXJlY3RVcmkoT1BFTkFJX0NBTExCQUNLX1BPUlRTWzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVkaXJlY3RVcmkgPSBhd2FpdCBzdGFydE9wZW5BSUNhbGxiYWNrUmVsYXkodHJ1c3RlZExvb3BiYWNrQmFzZSgpLCBPQVVUSF9TVEFURV9UVExfTVMpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIGBPcGVuQUkgbG9naW4gbmVlZHMgbG9jYWwgcG9ydCAke09QRU5BSV9DQUxMQkFDS19QT1JUUy5qb2luKFwiIG9yIFwiKX0g4oCUIGNsb3NlIGFueSBydW5uaW5nIFxcYGNvZGV4IGxvZ2luXFxgIGFuZCByZXRyeWAgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhdXRoVXJsID0gYnVpbGRPcGVuQUlBdXRoVXJsKGNvZGVDaGFsbGVuZ2UsIHN0YXRlLCByZWRpcmVjdFVyaSk7XG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpLCBwcm92aWRlcjogXCJvcGVuYWlcIiB9KTtcbiAgICByZXR1cm4geyBhdXRoVXJsLCBtb2RlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB1c2FnZSh0b2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxVc2FnZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyByb3dzOiBhbGxUb2tlbnMgfSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE1hbnkoXCJBXCIpO1xuICAgIGNvbnN0IGVudHJ5ID0gdG9rZW5JZFxuICAgICAgPyBhbGxUb2tlbnMuZmluZCgoZSkgPT4gZS5pZCA9PT0gdG9rZW5JZClcbiAgICAgIDogYWxsVG9rZW5zLmZpbmRMYXN0KChlKSA9PiBlLmFjdGl2ZSAmJiBlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKTtcblxuICAgIGlmICghZW50cnkpIHJldHVybiB7IGVycm9yOiBcIk5PVF9GT1VORFwiIH07XG5cbiAgICBpZiAoZW50cnkucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghZW50cnkuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB7IHByb3ZpZGVyOiBcIm9wZW5haVwiLCBmaXZlSG91cjogbnVsbCwgc2V2ZW5EYXk6IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmdldFJhdGVMaW1pdHNCeVRva2VuSWQoZW50cnkuaWQpO1xuICAgICAgICBjb25zdCBybCA9IHJhdz8uZGF0YS5yYXRlTGltaXRzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgIGZpdmVIb3VyOiBybD8ucHJpbWFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnByaW1hcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IHVuaXhTZWNvbmRzVG9Jc28ocmwucHJpbWFyeS5yZXNldHNBdCksXG4gICAgICAgICAgICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBybC5wcmltYXJ5LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHNldmVuRGF5OiBybD8uc2Vjb25kYXJ5XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICB1dGlsaXphdGlvbjogcmwuc2Vjb25kYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiB1bml4U2Vjb25kc1RvSXNvKHJsLnNlY29uZGFyeS5yZXNldHNBdCksXG4gICAgICAgICAgICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBybC5zZWNvbmRhcnkud2luZG93RHVyYXRpb25NaW5zLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgT3BlbkFJIHVzYWdlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyICE9PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICByZXR1cm4geyBlcnJvcjogYHVzYWdlIEFQSSBub3Qgc3VwcG9ydGVkIGZvciBwcm92aWRlcjogJHtlbnRyeS5wcm92aWRlcn1gIH07XG4gICAgfVxuXG4gICAgbGV0IGFjY2Vzc1Rva2VuID0gZ2V0QWNjZXNzVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpO1xuICAgIGNvbnN0IGlzRXhwaXJlZCA9IGdldEV4cGlyZXNBdChlbnRyeS5jcmVkZW50aWFscykgPCBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGlzRXhwaXJlZCAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICBpZiAocmF3LmVycm9yICYmIGdldFJlZnJlc2hUb2tlbihlbnRyeS5jcmVkZW50aWFscykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgICBjb25zdCByZXRyaWVkID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgICAgIGlmIChyZXRyaWVkLmVycm9yKSByZXR1cm4geyBlcnJvcjogcmV0cmllZC5lcnJvciB9O1xuICAgICAgICByZXR1cm4gY29udmVydEFudGhyb3BpY1VzYWdlKHJldHJpZWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvYXV0aExvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmF3LmVycm9yKSByZXR1cm4geyBlcnJvcjogcmF3LmVycm9yIH07XG4gICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXcpO1xuICB9XG5cbiAgLy8g64+Z7IucIHJlZnJlc2gg6rCAIO2ajOyghOydhCDqsrnsuZjrqbQg65Kk64qm7J2AIO2YuOy2nOydtCDsnbTrr7gg7Y+Q6riw65CcIHJlZnJlc2ggdG9rZW4g7J2EIOyTsOqyjCDrkJjslrRcbiAgLy8g66mA7Kmh7ZWcIO2GoO2BsOydtCDsgqzrp53snLzroZwg7Jik7YyQ65Cc64ukLiBvcGVuYWktcmVmcmVzaC50cyDsmYAg6rCZ7J2AIHBlci10b2tlbiBkZWR1cCDsnYQg65GU64ukLlxuICBhc3luYyByZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaW5mbGlnaHQgPSBpbmZsaWdodEFudGhyb3BpY1JlZnJlc2guZ2V0KHRva2VuLmlkKTtcbiAgICBpZiAoaW5mbGlnaHQpIHJldHVybiBpbmZsaWdodDtcblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmRvUmVmcmVzaFRva2VuKHRva2VuKTtcbiAgICBpbmZsaWdodEFudGhyb3BpY1JlZnJlc2guc2V0KHRva2VuLmlkLCBwcm9taXNlKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGluZmxpZ2h0QW50aHJvcGljUmVmcmVzaC5kZWxldGUodG9rZW4uaWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZG9SZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY3JlZHMgPSB0b2tlbi5jcmVkZW50aWFscztcbiAgICBjb25zdCBydCA9IGdldFJlZnJlc2hUb2tlbihjcmVkcyk7XG4gICAgaWYgKCFydCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVmcmVzaCB0b2tlblwiKTtcblxuICAgIGxldCByZWZyZXNoZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hlZCA9IGF3YWl0IHJlZnJlc2hBY2Nlc3NUb2tlbihydCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWZyZXNoRmFpbGVkRXJyb3IgJiYgZS5pc0F1dGhEZWFkKSB7XG4gICAgICAgIGF3YWl0IGRlYWN0aXZhdGVBdXRoRGVhZFRva2VuKHRva2VuLCBgYW50aHJvcGljOiR7ZS5zdGF0dXN9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBUb2tlbkNyZWRlbnRpYWxzLnBhcnNlKHtcbiAgICAgIC4uLmNyZWRzLFxuICAgICAgYWNjZXNzVG9rZW46IHJlZnJlc2hlZC5hY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaGVkLnJlZnJlc2hUb2tlbixcbiAgICAgIGV4cGlyZXNBdDogcmVmcmVzaGVkLmV4cGlyZXNBdCxcbiAgICB9KTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgIHByb3ZpZGVyOiB0b2tlbi5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IHVwZGF0ZWQsXG4gICAgICAgIG5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgIHJlYXV0aF9yZXF1aXJlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiByZWZyZXNoZWQuYWNjZXNzVG9rZW47XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBoZWFsdGgoKTogUHJvbWlzZTxIZWFsdGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3ZpZGVycyA9IHsgLi4uUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZSB9O1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIGFjdGl2ZVRva2VuczogUWdyaWREaXNwYXRjaGVyLnRva2Vucy5zaXplLFxuICAgICAgc3Vic2NyaWJlcjogUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnN0YXR1cygpID8/IG51bGwsXG4gICAgICAvLyBwcm92aWRlciDrs4Qg65287Jqw7YyF7J206528IO2VmOuCmOunjCDspIDruYTrj7zrj4Qg6re4IHByb3ZpZGVyIOyalOyyreydgCDsspjrpqzrkJzri6QuXG4gICAgICByZWFkeTogT2JqZWN0LnZhbHVlcyhwcm92aWRlcnMpLmluY2x1ZGVzKFwicmVhZHlcIiksXG4gICAgICBwcm92aWRlcnMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUWdyaWRGcmFtZSA9IG5ldyBRZ3JpZEZyYW1lQ2xhc3MoKTtcblxuZnVuY3Rpb24gY29udmVydEFudGhyb3BpY1VzYWdlKHJhdzogQW50aHJvcGljVXNhZ2VSYXcpOiBVc2FnZVJlc3BvbnNlIHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICBmaXZlSG91cjogcmF3LmZpdmVfaG91clxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuZml2ZV9ob3VyLnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LmZpdmVfaG91ci5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICAgIHNldmVuRGF5OiByYXcuc2V2ZW5fZGF5XG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5zZXZlbl9kYXkudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuc2V2ZW5fZGF5LnJlc2V0c19hdCB9XG4gICAgICA6IG51bGwsXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUVBLE1BQU0saUNBQWlCLElBQUksSUFBd0I7QUFRbkQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxr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
|
|
778
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBPUEVOQUlfQ0FMTEJBQ0tfUE9SVFMsXG4gIG9wZW5BSUNhbGxiYWNrUmVkaXJlY3RVcmksXG4gIHN0YXJ0T3BlbkFJQ2FsbGJhY2tSZWxheSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWNhbGxiYWNrLXJlbGF5XCI7XG5pbXBvcnQge1xuICBidWlsZE9wZW5BSUF1dGhVcmwsXG4gIGV4Y2hhbmdlT3BlbkFJQ29kZSxcbiAgZ2VuZXJhdGVPcGVuQUlQS0NFLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktb2F1dGhcIjtcbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsLCB0eXBlIFRva2VuVXBkYXRlRmllbGRzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyBUb2tlbkNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQge1xuICBDT05TT0xFX0NBTExCQUNLX1VSTCxcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxuICBSZWZyZXNoRmFpbGVkRXJyb3IsXG59IGZyb20gXCIuL29hdXRoXCI7XG5pbXBvcnQge1xuICBhc3NlcnROYXRpdmVSdW5BZG1pc3Npb24sXG4gIGFmdGVyUXVlcnksXG4gIGJlZm9yZVF1ZXJ5LFxuICBmaW5pc2hSdW5BYm9ydGVkLFxuICBmaW5pc2hSdW5XaXRoRXJyb3IsXG59IGZyb20gXCIuL3FncmlkLXJ1bi1saWZlY3ljbGVcIjtcbmltcG9ydCB7XG4gIGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEsXG4gIHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0LFxuICBRZ3JpZERpc3BhdGNoZXIsXG59IGZyb20gXCIuL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBBcHBlbmRTdGVwSW5wdXQsXG4gIHR5cGUgQ3JlYXRlUnVuSW5wdXQsXG4gIHR5cGUgRmluaXNoUnVuSW5wdXQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsXG4gIFN0cmVhbUV2ZW50cyxcbiAgdHlwZSBUb2tlblN0YXRzLFxuICB0eXBlIFVzYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBkZWFjdGl2YXRlQXV0aERlYWRUb2tlbiwgbm90aWZ5VG9rZW5BZGRlZCB9IGZyb20gXCIuL3Rva2VuLWRlYXRoXCI7XG5pbXBvcnQgeyBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvciB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uLXNjaGVtYVwiO1xuXG5jb25zdCBwZW5kaW5nU3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBRdWVyeUlucHV0PigpO1xuXG50eXBlIFBlbmRpbmdPQXV0aCA9IHtcbiAgY29kZVZlcmlmaWVyOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVkaXJlY3RVcmk6IHN0cmluZztcbiAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIgfCBcIm9wZW5haVwiO1xufTtcbmNvbnN0IE9BVVRIX1NUQVRFX1BSRUZJWCA9IFwib2F1dGg6c3RhdGU6XCI7XG5jb25zdCBPQVVUSF9TVEFURV9UVEwgPSBcIjVtXCI7XG5jb25zdCBPQVVUSF9TVEFURV9UVExfTVMgPSA1ICogNjBfMDAwO1xuXG5mdW5jdGlvbiB1bml4U2Vjb25kc1RvSXNvKHNlY29uZHM6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWNvbmRzID09PSBcIm51bWJlclwiID8gbmV3IERhdGUoc2Vjb25kcyAqIDEwMDApLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcsIGRhdGE6IFBlbmRpbmdPQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBhd2FpdCBjYWNoZS5zZXQoe1xuICAgIGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCxcbiAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgdHRsOiBPQVVUSF9TVEFURV9UVEwsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPFBlbmRpbmdPQXV0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBjb25zdCByYXcgPSBhd2FpdCBjYWNoZS5nZXQ8c3RyaW5nPih7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgUGVuZGluZ09BdXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgcmV0dXJuO1xuICBhd2FpdCBjYWNoZS5kZWxldGUoeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG59XG5cbmNvbnN0IHRydXN0ZWRMb29wYmFja0Jhc2UgPSAoKSA9PiBgaHR0cDovL2xvY2FsaG9zdDoke3Byb2Nlc3MuZW52LlBPUlQgPz8gXCI0NDkwMFwifWA7XG5cbmZ1bmN0aW9uIGlzUmVtb3RlT0F1dGhSZXF1ZXN0KCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBvcmlnaW4gPSB0eXBlb2YgaGVhZGVycy5vcmlnaW4gPT09IFwic3RyaW5nXCIgPyBoZWFkZXJzLm9yaWdpbiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBmb3J3YXJkZWQgPSBoZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXTtcbiAgICBjb25zdCByYXdIb3N0ID0gQXJyYXkuaXNBcnJheShmb3J3YXJkZWQpID8gZm9yd2FyZGVkWzBdIDogKGZvcndhcmRlZCA/PyBoZWFkZXJzLmhvc3QpO1xuICAgIGNvbnN0IGhvc3QgPSBvcmlnaW5cbiAgICAgID8gbmV3IFVSTChvcmlnaW4pLmhvc3RuYW1lXG4gICAgICA6IG5ldyBVUkwoYGh0dHA6Ly8ke3Jhd0hvc3QgPz8gXCJsb2NhbGhvc3RcIn1gKS5ob3N0bmFtZTtcbiAgICByZXR1cm4gIW5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiOjoxXCIsIFwiWzo6MV1cIl0pLmhhcyhob3N0KTtcbiAgfSBjYXRjaCB7fVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIEFudGhyb3BpYydzIHJlbW90ZS9tYW51YWwgZmxvdyB1c2VzIGl0cyBmaXhlZCBjb25zb2xlIGNhbGxiYWNrLiBIZWFkZXJzIG1heSBzZWxlY3QgYmV0d2VlbiB0d29cbi8vIGFsbG93bGlzdGVkIFVSSXMsIGJ1dCBuZXZlciBjb250cmlidXRlIGF1dGhvcml0eSBvciBwYXRoIGJ5dGVzIHRvIGVpdGhlciBVUkkuXG5mdW5jdGlvbiByZXNvbHZlT0F1dGhSZWRpcmVjdCgpOiB7IHJlZGlyZWN0VXJpOiBzdHJpbmc7IG1vZGU6IFwicmVkaXJlY3RcIiB8IFwiY29kZVwiIH0ge1xuICBpZiAoaXNSZW1vdGVPQXV0aFJlcXVlc3QoKSkge1xuICAgIHJldHVybiB7IHJlZGlyZWN0VXJpOiBDT05TT0xFX0NBTExCQUNLX1VSTCwgbW9kZTogXCJjb2RlXCIgfTtcbiAgfVxuICByZXR1cm4geyByZWRpcmVjdFVyaTogYCR7dHJ1c3RlZExvb3BiYWNrQmFzZSgpfS9jYWxsYmFja2AsIG1vZGU6IFwicmVkaXJlY3RcIiB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVBhc3RlZE9BdXRoUmVzdWx0KGlucHV0OiBzdHJpbmcpOiB7IGNvZGU6IHN0cmluZzsgc3RhdGU6IHN0cmluZyB9IHwgbnVsbCB7XG4gIGNvbnN0IHRyaW1tZWQgPSBpbnB1dC50cmltKCk7XG4gIHRyeSB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSBuZXcgVVJMKHRyaW1tZWQpO1xuICAgIGNvbnN0IGNvZGUgPSBjYWxsYmFjay5zZWFyY2hQYXJhbXMuZ2V0KFwiY29kZVwiKT8udHJpbSgpID8/IFwiXCI7XG4gICAgY29uc3Qgc3RhdGUgPSBjYWxsYmFjay5zZWFyY2hQYXJhbXMuZ2V0KFwic3RhdGVcIik/LnRyaW0oKSA/PyBcIlwiO1xuICAgIGlmIChjb2RlICYmIHN0YXRlKSByZXR1cm4geyBjb2RlLCBzdGF0ZSB9O1xuICB9IGNhdGNoIHt9XG5cbiAgY29uc3Qgc2VwYXJhdG9yQXQgPSB0cmltbWVkLmluZGV4T2YoXCIjXCIpO1xuICBjb25zdCBjb2RlID0gc2VwYXJhdG9yQXQgPiAwID8gdHJpbW1lZC5zbGljZSgwLCBzZXBhcmF0b3JBdCkudHJpbSgpIDogXCJcIjtcbiAgY29uc3Qgc3RhdGUgPSBzZXBhcmF0b3JBdCA+IDAgPyB0cmltbWVkLnNsaWNlKHNlcGFyYXRvckF0ICsgMSkudHJpbSgpIDogXCJcIjtcbiAgcmV0dXJuIGNvZGUgJiYgc3RhdGUgPyB7IGNvZGUsIHN0YXRlIH0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoIWFyZ3MuaW1hZ2VHZW5lcmF0aW9uKSByZXR1cm47XG4gIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgIFwicWdyaWQ6IGltYWdlR2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggc3RyZWFtaW5nOyB1c2UgcXVlcnkvZ2VuZXJhdGVUZXh0IGluc3RlYWQuXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICApO1xufVxuXG4vLyBhbnRocm9waWMg7J2AIC0tanNvbi1zY2hlbWEg66W8IOyTsOyngCDslYrsnLzrr4DroZwoU09OLTUzMikgc3RyaWN0IOuzgO2ZmMK3YXJndiDsoJztlZwg7JeG7J20IOybkO2YleydmFxuLy8g6rWs66y4wrfrs7XsnqHrj4Trp4wg6rKA7Kad65Cc64ukIOKAlCBwcm92aWRlciDrtoTquLDripQgYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYSDqsIAg7IaM7Jyg7ZWc64ukLlxuZnVuY3Rpb24gcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoYXJncy5qc29uU2NoZW1hID09PSB1bmRlZmluZWQgJiYgIWFyZ3MudG9vbHM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShhcmdzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB8fFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvclxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oZXJyb3IubWVzc2FnZSBhcyBMb2NhbGl6ZWRTdHJpbmcpO1xuICAgIH1cbiAgICAvLyDsnpjrqrvrkJwga2V5d29yZCDtmJXtg5woYW55T2Yg66W8IOqwneyytOuhnCDrs7TrgrTripQg65OxKeuKlCDtjIzsnbTtlITrnbzsnbjsl5DshJwgdW50eXBlZCDsmKTrpZjroZwg64KY7Jik66+A66GcLFxuICAgIC8vIO2DgOyehSDsooHtnojquLAg64yA7IugIEVycm9yIOyghOyytOulvCBjYWxsZXItZmF1bHQgNDAwIOycvOuhnCDrp6TtlZHtlZzri6Qo6rOE7JW9IO2FjOyKpO2KuOuhnCDqs6DsoJXrkKgpLlxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgYHFncmlkOiBjYWxsZXIgc2NoZW1hIGNhbm5vdCBiZSBub3JtYWxpemVkOiAke2Vycm9yLm1lc3NhZ2V9YCBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVG9rZW5OYW1lKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPEludGVybmFsUXVlcnlJbnB1dD4ge1xuICBpZiAoIWFyZ3MudG9rZW5OYW1lKSByZXR1cm4gYXJncztcblxuICBjb25zdCB0b2tlblByb3ZpZGVyID0gYXJncy50b2tlbk5hbWUuc3BsaXQoXCIvXCIsIDEpWzBdO1xuICBjb25zdCBtb2RlbFByb3ZpZGVyID0gYXJncy5tb2RlbD8uc3BsaXQoXCIvXCIsIDEpWzBdO1xuICBpZiAodG9rZW5Qcm92aWRlciAhPT0gXCJhbnRocm9waWNcIiAmJiB0b2tlblByb3ZpZGVyICE9PSBcIm9wZW5haVwiKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oYEludmFsaWQgdG9rZW4gbmFtZTogJHthcmdzLnRva2VuTmFtZX1gIGFzIExvY2FsaXplZFN0cmluZyk7XG4gIH1cbiAgaWYgKG1vZGVsUHJvdmlkZXIgIT09IHRva2VuUHJvdmlkZXIpIHtcbiAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgIFwiVG9rZW4gcHJvdmlkZXIgZG9lcyBub3QgbWF0Y2ggbW9kZWwgcHJvdmlkZXJcIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQWN0aXZlQnlQcm92aWRlckFuZE5hbWUoXCJBXCIsIHRva2VuUHJvdmlkZXIsIGFyZ3MudG9rZW5OYW1lKTtcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGBBY3RpdmUgdG9rZW4gbm90IGZvdW5kOiAke2FyZ3MudG9rZW5OYW1lfWAgYXMgTG9jYWxpemVkU3RyaW5nKTtcbiAgfVxuICByZXR1cm4geyAuLi5hcmdzLCBwcmVmZXJyZWRUb2tlbklkOiB0b2tlbi5pZCwgcmVxdWlyZVByZWZlcnJlZFRva2VuOiB0cnVlIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUh0dHBEaXNjb25uZWN0SGFuZGxlKCk6IHtcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgZGlzcG9zZTogKCkgPT4gdm9pZDtcbn0ge1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGxldCByZXF1ZXN0UmF3OiBGYXN0aWZ5UmVxdWVzdFtcInJhd1wiXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlc3BvbnNlUmF3OiBGYXN0aWZ5UmVwbHlbXCJyYXdcIl0gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJlcXVlc3RSYXcgPSBjdHgucmVxdWVzdD8ucmF3O1xuICAgIGlmIChjdHgudHJhbnNwb3J0ID09PSBcImh0dHBcIikgcmVzcG9uc2VSYXcgPSBjdHgucmVwbHkucmF3O1xuICB9IGNhdGNoIHtcbiAgICAvLyBEaXJlY3QgZnJhbWUgY2FsbHMgKGZvciBleGFtcGxlIHVuaXQgdGVzdHMpIGRvIG5vdCBoYXZlIGFuIEhUVFAgY29udGV4dC5cbiAgfVxuXG4gIGNvbnN0IGFib3J0ID0gKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIGNvbnN0IGFib3J0T25JbmNvbXBsZXRlUmVzcG9uc2VDbG9zZSA9ICgpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlUmF3Py53cml0YWJsZUVuZGVkKSBhYm9ydCgpO1xuICB9O1xuXG4gIHJlcXVlc3RSYXc/Lm9uY2UoXCJhYm9ydGVkXCIsIGFib3J0KTtcbiAgcmVzcG9uc2VSYXc/Lm9uY2UoXCJjbG9zZVwiLCBhYm9ydE9uSW5jb21wbGV0ZVJlc3BvbnNlQ2xvc2UpO1xuXG4gIGlmIChyZXF1ZXN0UmF3Py5hYm9ydGVkIHx8IChyZXNwb25zZVJhdz8uZGVzdHJveWVkICYmICFyZXNwb25zZVJhdy53cml0YWJsZUVuZGVkKSkge1xuICAgIGFib3J0KCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICByZXF1ZXN0UmF3Py5yZW1vdmVMaXN0ZW5lcihcImFib3J0ZWRcIiwgYWJvcnQpO1xuICAgICAgcmVzcG9uc2VSYXc/LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgYWJvcnRPbkluY29tcGxldGVSZXNwb25zZUNsb3NlKTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIl0pO1xuY29uc3Qgb2F1dGhMb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvYXV0aFwiXSk7XG5cbi8vIHBlci10b2tlbiByZWZyZXNoIGRlZHVwIOKAlCDtmozsoIQg6rK57Lmo7Jy866GcIOyduO2VnCDsgqzrp50g7Jik7YyQ7J2EIOunieuKlOuLpC5cbmNvbnN0IGluZmxpZ2h0QW50aHJvcGljUmVmcmVzaCA9IG5ldyBNYXA8bnVtYmVyLCBQcm9taXNlPHN0cmluZz4+KCk7XG5cbmNsYXNzIFFncmlkRnJhbWVDbGFzcyBleHRlbmRzIEJhc2VGcmFtZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJRZ3JpZFwiKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBxdWVyeShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGFzc2VydE5hdGl2ZVJ1bkFkbWlzc2lvbigpO1xuICAgIHJlamVjdEludmFsaWRDYWxsZXJTY2hlbWFzKGFyZ3MpO1xuICAgIGNvbnN0IHJlc29sdmVkQXJncyA9IGF3YWl0IHJlc29sdmVUb2tlbk5hbWUoYXJncyk7XG4gICAgY29uc3QgZGlzY29ubmVjdCA9IGNyZWF0ZUh0dHBEaXNjb25uZWN0SGFuZGxlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyZXNvbHZlZEFyZ3MubG9nZ2VyID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5KHJlc29sdmVkQXJncywgZGlzY29ubmVjdC5zaWduYWwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4IH0gPSBhd2FpdCBiZWZvcmVRdWVyeShyZXNvbHZlZEFyZ3MpO1xuICAgICAgbGV0IHJlc3VsdDogUXVlcnlPdXRwdXQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkocmVzb2x2ZWRBcmdzLCBkaXNjb25uZWN0LnNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIHJlc29sdmVkQXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIHJlc29sdmVkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShyZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCwgcmVzb2x2ZWRBcmdzLCByZXN1bHQpO1xuICAgICAgICBpZiAoZGlzY29ubmVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkLCByZXNvbHZlZEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRvb2wtY2FsbCByZXF1ZXN0TG9nSWTsmYAgcHJvdmlkZXIgdGhyZWFkQ29vcmTripQg7ISc66GcIOuPheumveyggeycvOuhnCDsnKDsp4DtlZzri6QuXG4gICAgICAgIGNvbnN0IHRocmVhZENvb3JkID0gcmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkO1xuICAgICAgICBjb25zdCBydW5Db250ZXh0ID1cbiAgICAgICAgICBsaWZlY3ljbGUucnVuQ29udGV4dCB8fCB0aHJlYWRDb29yZFxuICAgICAgICAgICAgPyB7IC4uLmxpZmVjeWNsZS5ydW5Db250ZXh0LCAuLi4odGhyZWFkQ29vcmQgPyB7IHRocmVhZENvb3JkIH0gOiB7fSkgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgcnVuQ29udGV4dCB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYHF1ZXJ5IGFmdGVyUXVlcnkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICBpZiAoZGlzY29ubmVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkLCByZXNvbHZlZEFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihyZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCByZXNvbHZlZEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHByb3ZpZGVyIOydkeuLteydgCDshLHqs7XtlojsnLzrr4DroZwg66Gc6rmFIOyepeyVoOqwgCDsg53shLEg6rKw6rO866W8IOuNruyWtOyTsOyngCDslYrripTri6QuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc2Nvbm5lY3QuZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBwcmVwYXJlU3RyZWFtKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHsgc3RyZWFtSWQ6IHN0cmluZyB9PiB7XG4gICAgYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uKCk7XG4gICAgcmVqZWN0SW1hZ2VHZW5lcmF0aW9uU3RyZWFtKGFyZ3MpO1xuICAgIHJlamVjdEludmFsaWRDYWxsZXJTY2hlbWFzKGFyZ3MpO1xuICAgIGNvbnN0IHJlc29sdmVkQXJncyA9IGF3YWl0IHJlc29sdmVUb2tlbk5hbWUoYXJncyk7XG4gICAgY29uc3Qgc3RyZWFtSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIHBlbmRpbmdTdHJlYW1zLnNldChzdHJlYW1JZCwgcmVzb2x2ZWRBcmdzKTtcbiAgICBjb25zdCBleHBpcnkgPSBzZXRUaW1lb3V0KCgpID0+IHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCksIDMwXzAwMCk7XG4gICAgZXhwaXJ5LnVucmVmPy4oKTtcbiAgICByZXR1cm4geyBzdHJlYW1JZCB9O1xuICB9XG5cbiAgQHN0cmVhbSh7IHR5cGU6IFwic3NlXCIsIGV2ZW50czogU3RyZWFtRXZlbnRzIH0pXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKHN0cmVhbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzID0gcGVuZGluZ1N0cmVhbXMuZ2V0KHN0cmVhbUlkKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5kZWxldGUoc3RyZWFtSWQpO1xuICAgIGlmICghYXJncykgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvciBleHBpcmVkIHN0cmVhbUlkXCIpO1xuICAgIGFzc2VydE5hdGl2ZVJ1bkFkbWlzc2lvbigpO1xuICAgIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzKTtcblxuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3NlID0gY3R4LmNyZWF0ZVNTRShTdHJlYW1FdmVudHMpO1xuICAgIGxldCBzdHJlYW1SZXN1bHQ6IFF1ZXJ5T3V0cHV0IHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1FcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNsaWVudENsb3NlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIHNzZS5vbkNsb3NlKCgpID0+IHtcbiAgICAgIGNsaWVudENsb3NlZCA9IHRydWU7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9KTtcblxuICAgIGxldCBydW5JbmZvOiB7IHJlcXVlc3RMb2dJZDogbnVtYmVyOyBzdGVwSW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgIGlmIChhcmdzLmxvZ2dlciAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIHByb3ZpZGVyIOyLpO2WiSDsoIQgcnVubmluZyByb3cg7IOd7ISx7JeQIOyLpO2MqO2VmOuptCBsb2dnZWQg7JqU7LKt7Jy866GcIOynhO2Wie2VmOyngCDslYrripTri6QuXG4gICAgICBydW5JbmZvID0gYXdhaXQgYmVmb3JlUXVlcnkoYXJncyk7XG4gICAgfVxuXG4gICAgLy8gYmVmb3JlUXVlcnkgREIg7J6R7JeFIOykkSBjbG9zZeulvCDrhpPsuZjsp4Ag7JWK6rOgIHByb3ZpZGVyIOyLpO2WiSDsoITsl5Ag66eI6rCQ7ZWc64ukLlxuICAgIGlmIChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkge1xuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnlTdHJlYW0oXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiAodGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZGVsdGFcIiwgeyB0ZXh0IH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgc3RyZWFtRXJyb3IgPSBlcnI7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RyZWFtRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgIH1cblxuICAgIC8vIHByb3ZpZGVyIOqysOqzvOqwgCDsl4bripQgY2xvc2XripQg7KaJ7IucIGFib3J0ZWTroZwg66eI6rCQ7ZWc64ukLlxuICAgIGlmIChjbGllbnRDbG9zZWQgJiYgIXN0cmVhbVJlc3VsdCkge1xuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGRpc3BhdGNoZXIg7JmE66OMIO2bhCBsaWZlY3ljbGUg7LKY66asIChhd2FpdCDslYjsoIQpXG4gICAgaWYgKHN0cmVhbVJlc3VsdCkge1xuICAgICAgLy8gZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZCDsnqzsgqzsmqkg7KKM7ZGc64qUIGxvZ2dlciDshKTsoJXqs7wg66y06rSA7ZWY6rKMIO2ajOyGoe2VnOuLpC5cbiAgICAgIGNvbnN0IHRocmVhZENvb3JkID0gc3RyZWFtUmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkO1xuICAgICAgbGV0IHJ1bkNvbnRleHQ6IFFncmlkUnVuQ29udGV4dCB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRocmVhZENvb3JkICE9PSB1bmRlZmluZWQgPyB7IHRocmVhZENvb3JkIH0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocnVuSW5mbykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGNsb3NlIO2bhCDrj4TssKntlZwg6rKw6rO864+EIHN0ZXAvdXNhZ2XripQg64Ko6riw65CYLCDslYTrnpjsl5DshJwg7LWc7KKFIHN0YXR1c+ulvCBhYm9ydGVk66GcIOuNruyWtOyTtOuLpC5cbiAgICAgICAgICBjb25zdCBsaWZlY3ljbGUgPSBhd2FpdCBhZnRlclF1ZXJ5KFxuICAgICAgICAgICAgcnVuSW5mby5yZXF1ZXN0TG9nSWQsXG4gICAgICAgICAgICBydW5JbmZvLnN0ZXBJbmRleCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBzdHJlYW1SZXN1bHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBydW5Db250ZXh0ID1cbiAgICAgICAgICAgIGxpZmVjeWNsZS5ydW5Db250ZXh0IHx8IHRocmVhZENvb3JkXG4gICAgICAgICAgICAgID8geyAuLi5saWZlY3ljbGUucnVuQ29udGV4dCwgLi4uKHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDoge30pIH1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAvLyBhZnRlclF1ZXJ56rCAIOynhO2WieuQmOuKlCDsgqzsnbQgY2xpZW506rCAIOuLq+2ejCDqsr3smrAg7JmE66OMIOyDge2DnOulvCBhYm9ydGVk66GcIOuQmOuPjOumsOuLpC5cbiAgICAgICAgICBpZiAoY2xpZW50Q2xvc2VkKSB7XG4gICAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBhZnRlclF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcblxuICAgICAgICAgIGlmIChjbGllbnRDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZG9uZVwiLCB7IC4uLnN0cmVhbVJlc3VsdCwgcnVuQ29udGV4dCB9KTtcbiAgICB9IGVsc2UgaWYgKHN0cmVhbUVycm9yKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBzdHJlYW1FcnJvci5tZXNzYWdlLCBhcmdzKTtcbiAgICAgIGlmICghY2xpZW50Q2xvc2VkICYmICFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImVycm9yXCIsIHsgbWVzc2FnZTogc3RyZWFtRXJyb3IubWVzc2FnZSB9KTtcbiAgICB9IGVsc2UgaWYgKChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkgJiYgcnVuSW5mbykge1xuICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgfVxuXG4gICAgYXdhaXQgc3NlLmVuZCgpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGNyZWF0ZVJ1bihpbnB1dDogQ3JlYXRlUnVuSW5wdXQpOiBQcm9taXNlPHsgcmVxdWVzdExvZ0lkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGlucHV0LnVzZXJQcm9tcHQsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGlucHV0LnByb2plY3ROYW1lLFxuICAgICAgc3lzdGVtX3Byb21wdDogaW5wdXQuc3lzdGVtUHJvbXB0LFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICBpc19zdHJ1Y3R1cmVkOiBpbnB1dC5pc1N0cnVjdHVyZWQsXG4gICAgICBqc29uX3NjaGVtYTogaW5wdXQuanNvblNjaGVtYSxcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXF1ZXN0TG9nSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhcHBlbmRTdGVwKGlucHV0OiBBcHBlbmRTdGVwSW5wdXQpOiBQcm9taXNlPHsgc3RlcElkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0ZXBJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RlcF9pbmRleDogaW5wdXQuc3RlcEluZGV4LFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5yZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgICBmYWxsYmFja19jb3VudDogaW5wdXQuZmFsbGJhY2tDb3VudCxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LmNhY2hlQ3JlYXRpb24xaFRva2VucyxcbiAgICAgIGNvc3RfdXNkOiBpbnB1dC5jb3N0VXNkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNYXRoLnJvdW5kKGlucHV0LmNvc3RVc2QgKiBNSUNST19VU0QpLFxuICAgICAgY29zdF9zb3VyY2U6IGlucHV0LmNvc3RTb3VyY2UsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRfbXM6IGlucHV0LnR0ZnRNcyA/PyBudWxsLFxuICAgICAgZmluaXNoX3JlYXNvbjogaW5wdXQuZmluaXNoUmVhc29uLFxuICAgICAgcmVhc29uaW5nX3RleHQ6IGlucHV0LnJlYXNvbmluZ1RleHQsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBpbnB1dC5yZWFzb25pbmdUb2tlbnMsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGlucHV0LnRvb2xDYWxsSW5kZXgsXG4gICAgICB0b29sX2NhbGxfaWQ6IGlucHV0LnRvb2xDYWxsSWQsXG4gICAgICB0b29sX25hbWU6IGlucHV0LnRvb2xOYW1lLFxuICAgICAgdG9vbF9hcmdzOiBpbnB1dC50b29sQXJncyxcbiAgICAgIHRvb2xfcmVzdWx0OiBpbnB1dC50b29sUmVzdWx0LFxuICAgICAgdG9vbF9kdXJhdGlvbl9tczogaW5wdXQudG9vbER1cmF0aW9uTXMsXG4gICAgICBlcnJvcjogaW5wdXQuZXJyb3IsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3RlcElkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZmluaXNoUnVuKGlucHV0OiBGaW5pc2hSdW5JbnB1dCk6IFByb21pc2U8eyBvazogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgcmVzcG9uc2U6IGlucHV0LnJlc3BvbnNlLFxuICAgICAgdG9rZW5fbmFtZTogaW5wdXQudG9rZW5OYW1lLFxuICAgICAgbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGlucHV0LnJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBpbnB1dC5mYWxsYmFja0NvdW50LFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC50b3RhbElucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQudG90YWxPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQudG90YWxDYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogaW5wdXQudG90YWxDYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvbjFoVG9rZW5zLFxuICAgICAgY29zdF91c2Q6IGlucHV0LmNvc3RVc2QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE1hdGgucm91bmQoaW5wdXQuY29zdFVzZCAqIE1JQ1JPX1VTRCksXG4gICAgICBjb3N0X3NvdXJjZTogaW5wdXQuY29zdFNvdXJjZSxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC50b3RhbER1cmF0aW9uTXMsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yX21lc3NhZ2U6IGlucHV0LmVycm9yTWVzc2FnZSxcbiAgICAgIHJlc3BvbnNlX2pzb25fb2s6IGlucHV0LnJlc3BvbnNlSnNvbk9rLFxuICAgIH0pO1xuICAgIHJldHVybiB7IG9rOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBzdGF0cygpOiBQcm9taXNlPFRva2VuU3RhdHNbXT4ge1xuICAgIHJldHVybiBRZ3JpZERpc3BhdGNoZXIuZ2V0U3RhdHMoKTtcbiAgfVxuXG4gIC8vIO2ZlOuptOydmCDrqqnroZ0g7ZWE7YSw66W8IOq3uOuMgOuhnCDrsJvslYQg6rCZ7J2AIOyhsOqxtOydmCDtlanqs4Trpbwg64+M66Ck7KSA64ukIOKAlCDrqqnroZ3qs7wg67mE7Jqp7J20XG4gIC8vIOyEnOuhnCDri6Trpbgg66qo7IiY66W8IOuztOuptCDsgqzsmqnsnpDsl5DqsozripQg7Iir7J6Q6rCAIOyWtOq4i+uCnCDqsoPsnLzroZwg7J297Z6M64ukLlxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB0b3RhbENvc3QocGFyYW1zPzogUmVxdWVzdExvZ0xpc3RQYXJhbXMpOiBQcm9taXNlPHsgdXNkOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB7IHVzZDogYXdhaXQgUmVxdWVzdExvZ01vZGVsLnRvdGFsQ29zdChwYXJhbXMpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBwcm9qZWN0TmFtZXMoKTogUHJvbWlzZTx7IG5hbWVzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5kaXN0aW5jdFByb2plY3ROYW1lcygpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBtb2RlbE5hbWVzKCk6IFByb21pc2U8eyBuYW1lczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiB7IG5hbWVzOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZGlzdGluY3RNb2RlbE5hbWVzKCkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhZGRUb2tlbihcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGFkZGVkOiBib29sZWFuIH0+IHtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBwcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIG5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFkZGVkOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0PzogbnVtYmVyLFxuICAgIGtlZXBhbGl2ZUVuYWJsZWQ/OiBib29sZWFuLFxuICApOiBQcm9taXNlPHsgdXBkYXRlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKFxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IG51bGwgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihxdW90YVRocmVzaG9sZCkgfHwgcXVvdGFUaHJlc2hvbGQgPCAxIHx8IHF1b3RhVGhyZXNob2xkID4gMTAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwicXVvdGFUaHJlc2hvbGQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwLCBvciBudWxsXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHdlaWdodCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcih3ZWlnaHQpIHx8IHdlaWdodCA8IDEgfHwgd2VpZ2h0ID4gMTAwKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwid2VpZ2h0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0Y2g6IFRva2VuVXBkYXRlRmllbGRzID0ge307XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgcGF0Y2gubmFtZSA9IG5hbWU7XG4gICAgaWYgKHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHBhdGNoLnF1b3RhX3RocmVzaG9sZCA9IHF1b3RhVGhyZXNob2xkO1xuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCkgcGF0Y2gud2VpZ2h0ID0gd2VpZ2h0O1xuICAgIGlmIChrZWVwYWxpdmVFbmFibGVkICE9PSB1bmRlZmluZWQpIHBhdGNoLmtlZXBhbGl2ZV9lbmFibGVkID0ga2VlcGFsaXZlRW5hYmxlZDtcbiAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgdXBkYXRlZDogZmFsc2UgfTtcblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBUb2tlbk1vZGVsLnVwZGF0ZUZpZWxkcyhpZCwgcGF0Y2gpO1xuICAgIHJldHVybiB7IHVwZGF0ZWQ6IHVwZGF0ZWQgPiAwIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcmVtb3ZlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyByZW1vdmVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyByZW1vdmVkOiBmYWxzZSB9O1xuICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKFtlbnRyeS5pZF0pO1xuICAgIHJldHVybiB7IHJlbW92ZWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthqDtgbAg7Zmc7ISx7ZmUL+u5hO2ZnOyEse2ZlCDthqDquIAgRELsnZggYWN0aXZlIO2VhOuTnCDsl4XrjbDsnbTtirhcbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyB0b2dnbGVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IGFjdGl2ZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgVG9rZW5Nb2RlbC50b2dnbGVBY3RpdmUoaWQpO1xuICAgIGlmICghcmVzdWx0KSByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG4gICAgaWYgKHJlc3VsdC5yZWF1dGhSZXF1aXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXCJSZS1sb2dpbiByZXF1aXJlZFwiIGFzIExvY2FsaXplZFN0cmluZyk7XG4gICAgfVxuICAgIHJldHVybiB7IGFjdGl2ZTogcmVzdWx0LmFjdGl2ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgeyBjb2RlVmVyaWZpZXIsIGNvZGVDaGFsbGVuZ2UsIHN0YXRlIH0gPSBnZW5lcmF0ZVBLQ0UoKTtcblxuICAgIGNvbnN0IHsgcmVkaXJlY3RVcmksIG1vZGUgfSA9IHJlc29sdmVPQXV0aFJlZGlyZWN0KCk7XG4gICAgY29uc3QgYXV0aFVybCA9IGJ1aWxkQXV0aFVybChjb2RlQ2hhbGxlbmdlLCBzdGF0ZSwgcmVkaXJlY3RVcmkpO1xuXG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpLCBwcm92aWRlcjogXCJhbnRocm9waWNcIiB9KTtcblxuICAgIHJldHVybiB7IGF1dGhVcmwsIG1vZGUgfTtcbiAgfVxuXG4gIC8vIOybkOqyqSDsoJHsho3snZgg7IiY64+ZIOyZhOujjDogQW50aHJvcGljIGBjb2RlI3N0YXRlYCDrmJDripQgT3BlbkFJIGNhbGxiYWNrIFVSTOydhCDrsJvslYQg6rWQ7ZmY7ZWc64ukLlxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhDb21wbGV0ZShwYXN0ZWRDb2RlOiBzdHJpbmcpOiBQcm9taXNlPHsgYWRkZWQ6IGJvb2xlYW47IG5hbWU6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VQYXN0ZWRPQXV0aFJlc3VsdChwYXN0ZWRDb2RlKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwiZXhwZWN0ZWQgdGhlIGNhbGxiYWNrIFVSTCBvciBjb2RlIHNob3duIGFmdGVyIGxvZ2luLCBpbiBjb2RlI3N0YXRlIGZvcm1cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIHN0YXRlIH0gPSByZXN1bHQ7XG5cbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgXCJsb2dpbiBzZXNzaW9uIG5vdCBmb3VuZCBvciBleHBpcmVkIOKAlCBzdGFydCB0aGUgbG9naW4gYWdhaW5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBkZWxldGVPQXV0aFN0YXRlKHN0YXRlKTtcblxuICAgIGlmIChwZW5kaW5nLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbXBsZXRlT3BlbkFJTG9naW4oY29kZSwgcGVuZGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVBbnRocm9waWNMb2dpbihjb2RlLCBzdGF0ZSwgcGVuZGluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWRkZWQ6IHRydWUsIG5hbWU6IHBlbmRpbmcubmFtZSB9O1xuICB9XG5cbiAgLy8g6rWQ7ZmYICsg6rOE7KCVIOykkeuztSDsoJzqsbAgKyDsoIDsnqUg4oCUIHJlZGlyZWN0IOy9nOuwseqzvCDsvZTrk5wg67aZ7Jes64Sj6riwIO2UjOuhnOyasOqwgCDqs7XsnKDtlZzri6QuXG4gIHByaXZhdGUgYXN5bmMgY29tcGxldGVBbnRocm9waWNMb2dpbihcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgc3RhdGU6IHN0cmluZyxcbiAgICBwZW5kaW5nOiBQZW5kaW5nT0F1dGgsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGV4Y2hhbmdlQ29kZUZvclRva2VucyhcbiAgICAgIGNvZGUsXG4gICAgICBwZW5kaW5nLmNvZGVWZXJpZmllcixcbiAgICAgIHN0YXRlLFxuICAgICAgcGVuZGluZy5yZWRpcmVjdFVyaSxcbiAgICApO1xuXG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5yZXBsYWNlQnlBY2NvdW50KFwiYW50aHJvcGljXCIsIHRva2Vucy5hY2NvdW50VXVpZCwge1xuICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBhY2Nlc3NUb2tlbjogdG9rZW5zLmFjY2Vzc1Rva2VuLFxuICAgICAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgIGV4cGlyZXNBdDogdG9rZW5zLmV4cGlyZXNBdCA/PyAwLFxuICAgICAgICBhY2NvdW50VXVpZDogdG9rZW5zLmFjY291bnRVdWlkID8/IFwiXCIsXG4gICAgICB9LFxuICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgIH0pO1xuXG4gICAgbm90aWZ5VG9rZW5BZGRlZChwZW5kaW5nLm5hbWUsIFwiYW50aHJvcGljXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb21wbGV0ZU9wZW5BSUxvZ2luKGNvZGU6IHN0cmluZywgcGVuZGluZzogUGVuZGluZ09BdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3JlZHMgPSBhd2FpdCBleGNoYW5nZU9wZW5BSUNvZGUoY29kZSwgcGVuZGluZy5jb2RlVmVyaWZpZXIsIHBlbmRpbmcucmVkaXJlY3RVcmkpO1xuICAgIGF3YWl0IFRva2VuTW9kZWwucmVwbGFjZUJ5QWNjb3VudChcIm9wZW5haVwiLCBjcmVkcy5hY2NvdW50SWQsIHtcbiAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgY3JlZGVudGlhbHM6IGNyZWRzLFxuICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGBPcGVuQUkgdG9rZW4gc2F2ZWQgZm9yICR7cGVuZGluZy5uYW1lfWApO1xuICAgIG5vdGlmeVRva2VuQWRkZWQocGVuZGluZy5uYW1lLCBcIm9wZW5haVwiKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU9BdXRoQ2FsbGJhY2soY29kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IGF3YWl0IGdldE9BdXRoU3RhdGUoc3RhdGUpO1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgbG9nZ2VyLndhcm4oXCJvYXV0aCBjYWxsYmFjazogaW52YWxpZF9zdGF0ZVwiKTtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPWludmFsaWRfc3RhdGVcIik7XG4gICAgfVxuICAgIGF3YWl0IGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChwZW5kaW5nLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVPcGVuQUlMb2dpbihjb2RlLCBwZW5kaW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVBbnRocm9waWNMb2dpbihjb2RlLCBzdGF0ZSwgcGVuZGluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9c3VjY2VzcyZuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBlbmRpbmcubmFtZSl9YCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBsb2dnZXIud2FybihcIm9hdXRoIGNhbGxiYWNrIGZhaWxlZFwiLCB7XG4gICAgICAgIHByb3ZpZGVyOiBwZW5kaW5nLnByb3ZpZGVyLFxuICAgICAgICByZWFzb246IFwiZXhjaGFuZ2VfZmFpbGVkXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPWV4Y2hhbmdlX2ZhaWxlZFwiKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydE9wZW5BSShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGNvZGVWZXJpZmllciwgY29kZUNoYWxsZW5nZSwgc3RhdGUgfSA9IGdlbmVyYXRlT3BlbkFJUEtDRSgpO1xuICAgIGNvbnN0IG1vZGUgPSBpc1JlbW90ZU9BdXRoUmVxdWVzdCgpID8gXCJjb2RlXCIgOiBcInJlZGlyZWN0XCI7XG4gICAgbGV0IHJlZGlyZWN0VXJpOiBzdHJpbmc7XG4gICAgaWYgKG1vZGUgPT09IFwiY29kZVwiKSB7XG4gICAgICAvLyBPcGVuQUkgYWNjZXB0cyBvbmx5IHRoZSBDb2RleCBDTEkncyByZWdpc3RlcmVkIGxvb3BiYWNrIFVSSS4gT24gYSByZW1vdGUgZGFzaGJvYXJkIHRoZVxuICAgICAgLy8gYnJvd3NlciBjYW5ub3QgcmVhY2ggdGhlIHNlcnZlcidzIGxvb3BiYWNrLCBzbyB0aGUgdXNlciBwYXN0ZXMgdGhlIHJlc3VsdGluZyBjYWxsYmFjayBVUkwuXG4gICAgICByZWRpcmVjdFVyaSA9IG9wZW5BSUNhbGxiYWNrUmVkaXJlY3RVcmkoT1BFTkFJX0NBTExCQUNLX1BPUlRTWzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVkaXJlY3RVcmkgPSBhd2FpdCBzdGFydE9wZW5BSUNhbGxiYWNrUmVsYXkodHJ1c3RlZExvb3BiYWNrQmFzZSgpLCBPQVVUSF9TVEFURV9UVExfTVMpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIGBPcGVuQUkgbG9naW4gbmVlZHMgbG9jYWwgcG9ydCAke09QRU5BSV9DQUxMQkFDS19QT1JUUy5qb2luKFwiIG9yIFwiKX0g4oCUIGNsb3NlIGFueSBydW5uaW5nIFxcYGNvZGV4IGxvZ2luXFxgIGFuZCByZXRyeWAgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhdXRoVXJsID0gYnVpbGRPcGVuQUlBdXRoVXJsKGNvZGVDaGFsbGVuZ2UsIHN0YXRlLCByZWRpcmVjdFVyaSk7XG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpLCBwcm92aWRlcjogXCJvcGVuYWlcIiB9KTtcbiAgICByZXR1cm4geyBhdXRoVXJsLCBtb2RlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB1c2FnZSh0b2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxVc2FnZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyByb3dzOiBhbGxUb2tlbnMgfSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE1hbnkoXCJBXCIpO1xuICAgIGNvbnN0IGVudHJ5ID0gdG9rZW5JZFxuICAgICAgPyBhbGxUb2tlbnMuZmluZCgoZSkgPT4gZS5pZCA9PT0gdG9rZW5JZClcbiAgICAgIDogYWxsVG9rZW5zLmZpbmRMYXN0KChlKSA9PiBlLmFjdGl2ZSAmJiBlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKTtcblxuICAgIGlmICghZW50cnkpIHJldHVybiB7IGVycm9yOiBcIk5PVF9GT1VORFwiIH07XG4gICAgaWYgKGVudHJ5LnJlYXV0aF9yZXF1aXJlZCkgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIWVudHJ5LmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4geyBwcm92aWRlcjogXCJvcGVuYWlcIiwgZml2ZUhvdXI6IG51bGwsIHNldmVuRGF5OiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKGVudHJ5LmlkKTtcbiAgICAgICAgY29uc3QgcmwgPSByYXc/LmRhdGEucmF0ZUxpbWl0cztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBmaXZlSG91cjogcmw/LnByaW1hcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5wcmltYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiB1bml4U2Vjb25kc1RvSXNvKHJsLnByaW1hcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmwucHJpbWFyeS53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzZXZlbkRheTogcmw/LnNlY29uZGFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnNlY29uZGFyeS51c2VkUGVyY2VudCxcbiAgICAgICAgICAgICAgICByZXNldHNBdDogdW5peFNlY29uZHNUb0lzbyhybC5zZWNvbmRhcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmwuc2Vjb25kYXJ5LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYE9wZW5BSSB1c2FnZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5wcm92aWRlciAhPT0gXCJhbnRocm9waWNcIikge1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGB1c2FnZSBBUEkgbm90IHN1cHBvcnRlZCBmb3IgcHJvdmlkZXI6ICR7ZW50cnkucHJvdmlkZXJ9YCB9O1xuICAgIH1cblxuICAgIGxldCBhY2Nlc3NUb2tlbiA9IGdldEFjY2Vzc1Rva2VuKGVudHJ5LmNyZWRlbnRpYWxzKTtcbiAgICBjb25zdCBpc0V4cGlyZWQgPSBnZXRFeHBpcmVzQXQoZW50cnkuY3JlZGVudGlhbHMpIDwgRGF0ZS5ub3coKTtcblxuICAgIGlmIChpc0V4cGlyZWQgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJUb2tlbiByZWZyZXNoIGZhaWxlZDsgdXNhZ2UgaXMgdW5hdmFpbGFibGVcIiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IGZldGNoVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgIGlmIChyYXcuZXJyb3IgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICAgIGNvbnN0IHJldHJpZWQgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgaWYgKHJldHJpZWQuZXJyb3IpIHJldHVybiB7IGVycm9yOiByZXRyaWVkLmVycm9yIH07XG4gICAgICAgIHJldHVybiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmV0cmllZCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJUb2tlbiByZWZyZXNoIGZhaWxlZDsgdXNhZ2UgaXMgdW5hdmFpbGFibGVcIiB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmF3LmVycm9yKSByZXR1cm4geyBlcnJvcjogcmF3LmVycm9yIH07XG4gICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXcpO1xuICB9XG5cbiAgLy8g64+Z7IucIHJlZnJlc2gg6rCAIO2ajOyghOydhCDqsrnsuZjrqbQg65Kk64qm7J2AIO2YuOy2nOydtCDsnbTrr7gg7Y+Q6riw65CcIHJlZnJlc2ggdG9rZW4g7J2EIOyTsOqyjCDrkJjslrRcbiAgLy8g66mA7Kmh7ZWcIO2GoO2BsOydtCDsgqzrp53snLzroZwg7Jik7YyQ65Cc64ukLiBvcGVuYWktcmVmcmVzaC50cyDsmYAg6rCZ7J2AIHBlci10b2tlbiBkZWR1cCDsnYQg65GU64ukLlxuICBhc3luYyByZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaW5mbGlnaHQgPSBpbmZsaWdodEFudGhyb3BpY1JlZnJlc2guZ2V0KHRva2VuLmlkKTtcbiAgICBpZiAoaW5mbGlnaHQpIHJldHVybiBpbmZsaWdodDtcblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmRvUmVmcmVzaFRva2VuKHRva2VuKTtcbiAgICBpbmZsaWdodEFudGhyb3BpY1JlZnJlc2guc2V0KHRva2VuLmlkLCBwcm9taXNlKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGluZmxpZ2h0QW50aHJvcGljUmVmcmVzaC5kZWxldGUodG9rZW4uaWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZG9SZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY3JlZHMgPSB0b2tlbi5jcmVkZW50aWFscztcbiAgICBjb25zdCBydCA9IGdldFJlZnJlc2hUb2tlbihjcmVkcyk7XG4gICAgaWYgKCFydCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVmcmVzaCB0b2tlblwiKTtcblxuICAgIGxldCByZWZyZXNoZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hlZCA9IGF3YWl0IHJlZnJlc2hBY2Nlc3NUb2tlbihydCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWZyZXNoRmFpbGVkRXJyb3IgJiYgZS5pc0F1dGhEZWFkKSB7XG4gICAgICAgIGF3YWl0IGRlYWN0aXZhdGVBdXRoRGVhZFRva2VuKHRva2VuLCBgYW50aHJvcGljOiR7ZS5zdGF0dXN9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBUb2tlbkNyZWRlbnRpYWxzLnBhcnNlKHtcbiAgICAgIC4uLmNyZWRzLFxuICAgICAgYWNjZXNzVG9rZW46IHJlZnJlc2hlZC5hY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaGVkLnJlZnJlc2hUb2tlbixcbiAgICAgIGV4cGlyZXNBdDogcmVmcmVzaGVkLmV4cGlyZXNBdCxcbiAgICB9KTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgIHByb3ZpZGVyOiB0b2tlbi5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IHVwZGF0ZWQsXG4gICAgICAgIG5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgIHJlYXV0aF9yZXF1aXJlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiByZWZyZXNoZWQuYWNjZXNzVG9rZW47XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBoZWFsdGgoKTogUHJvbWlzZTxIZWFsdGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3ZpZGVycyA9IHsgLi4uUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZSB9O1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIGFjdGl2ZVRva2VuczogUWdyaWREaXNwYXRjaGVyLnRva2Vucy5zaXplLFxuICAgICAgc3Vic2NyaWJlcjogUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnN0YXR1cygpID8/IG51bGwsXG4gICAgICAvLyBwcm92aWRlciDrs4Qg65287Jqw7YyF7J206528IO2VmOuCmOunjCDspIDruYTrj7zrj4Qg6re4IHByb3ZpZGVyIOyalOyyreydgCDsspjrpqzrkJzri6QuXG4gICAgICByZWFkeTogT2JqZWN0LnZhbHVlcyhwcm92aWRlcnMpLmluY2x1ZGVzKFwicmVhZHlcIiksXG4gICAgICBwcm92aWRlcnMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUWdyaWRGcmFtZSA9IG5ldyBRZ3JpZEZyYW1lQ2xhc3MoKTtcblxuZnVuY3Rpb24gY29udmVydEFudGhyb3BpY1VzYWdlKHJhdzogQW50aHJvcGljVXNhZ2VSYXcpOiBVc2FnZVJlc3BvbnNlIHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICBmaXZlSG91cjogcmF3LmZpdmVfaG91clxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuZml2ZV9ob3VyLnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LmZpdmVfaG91ci5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICAgIHNldmVuRGF5OiByYXcuc2V2ZW5fZGF5XG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5zZXZlbl9kYXkudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuc2V2ZW5fZGF5LnJlc2V0c19h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
|
|
@@ -16,16 +16,12 @@ const logger = getLogger(["qgrid", "token-death"]);
|
|
|
16
16
|
* 토큰 조각이 섞일 수 있어 raw 메시지를 그대로 알림에 싣지 않는다.
|
|
17
17
|
*/
|
|
18
18
|
async function deactivateAuthDeadToken(token, reasonCode) {
|
|
19
|
-
const { marked,
|
|
19
|
+
const { marked, wasLastActive, staleCredentials } = await TokenModel.markReauthRequired(token.id, token.credentials);
|
|
20
20
|
if (staleCredentials) {
|
|
21
21
|
logger.info(`skipping auth-death for ${token.name}(id=${token.id}): credentials rotated since this attempt`);
|
|
22
22
|
return false;
|
|
23
23
|
}
|
|
24
24
|
if (!marked) return false;
|
|
25
|
-
if (keptAsLastActive) {
|
|
26
|
-
notifyLastActiveTokenDying(token, reasonCode);
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
25
|
logger.warn(`token requires re-login: ${token.name}(id=${token.id}) reason=${reasonCode}`);
|
|
30
26
|
const mention = mentionFor(token.name, getSlackUserMap());
|
|
31
27
|
notifySlack({
|
|
@@ -35,25 +31,13 @@ async function deactivateAuthDeadToken(token, reasonCode) {
|
|
|
35
31
|
mention,
|
|
36
32
|
token.provider,
|
|
37
33
|
reasonCode,
|
|
38
|
-
"재로그인이 필요합니다"
|
|
34
|
+
"재로그인이 필요합니다",
|
|
35
|
+
wasLastActive ? "사용 가능한 토큰이 없습니다" : null
|
|
39
36
|
].filter(Boolean).join(" · "),
|
|
40
|
-
color: SLACK_COLOR.bad
|
|
41
|
-
});
|
|
42
|
-
return true;
|
|
43
|
-
}
|
|
44
|
-
function notifyLastActiveTokenDying(token, reasonCode) {
|
|
45
|
-
const mention = mentionFor(token.name, getSlackUserMap());
|
|
46
|
-
notifySlack({
|
|
47
|
-
title: "마지막 토큰 사망",
|
|
48
|
-
subject: token.name,
|
|
49
|
-
context: [
|
|
50
|
-
mention,
|
|
51
|
-
token.provider,
|
|
52
|
-
reasonCode
|
|
53
|
-
].filter(Boolean).join(" · ") + " · 풀이 비지 않도록 유지 중입니다. 전 토큰이 동시에 실패했다면 client_id 취소나 OAuth 계약 변경을 의심하세요",
|
|
54
37
|
color: SLACK_COLOR.bad,
|
|
55
|
-
urgent:
|
|
38
|
+
urgent: wasLastActive
|
|
56
39
|
});
|
|
40
|
+
return true;
|
|
57
41
|
}
|
|
58
42
|
/** 로그인이 완료돼 토큰이 저장됐을 때. 신규·재로그인을 가리지 않는다. */
|
|
59
43
|
function notifyTokenAdded(name, provider) {
|
|
@@ -72,4 +56,4 @@ function notifyTokenAdded(name, provider) {
|
|
|
72
56
|
//#endregion
|
|
73
57
|
export { deactivateAuthDeadToken, notifyTokenAdded };
|
|
74
58
|
|
|
75
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tZGVhdGguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLWRlYXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog7IS47IWYIOunjOujjChhdXRoLWRlYWQpIO2GoO2BsOydmCDrnbzsmrDtjIUg7KCc7Jm4IOyngOygkC5cbiAqXG4gKiByZWZyZXNoIOqwgCDsnqzroZzqt7jsnbgg7Jm4IOuzteq1rCDrtojqsIDtlZwg7Iuk7Yyo66W8IOuwmO2ZmO2VnCDsiJzqsITsl5Drp4wg7Zi47Lac65Cc64ukLiDsi5zrj4Tsl5Ag7IKs7Jqp7ZWcXG4gKiBjcmVkZW50aWFscyDqsIAgREIg7JmAIOqwmeydhCDrlYzrp4wgcmVhdXRoX3JlcXVpcmVkIOulvCDquLDroZ3tlZjqs6AsIOq3uCDquLDroZ3snYQg7J206ri0IO2UhOuhnOyEuOyKpOunjFxuICogU2xhY2sg7JWM66a87J2EIOuztOuCuOuLpCDigJQg6rO17JygIERCIOulvCDsk7DripQg7J247Iqk7YS07Iqk6rCAIOuqh+ydtOuToCDsgqzqsbTri7kg7JWM66a87J2AIDHqsbTsnbTri6QuXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IG5vdGlmeVNsYWNrLCBTTEFDS19DT0xPUiB9IGZyb20gXCIuLi8uLi91dGlscy9zbGFjay1ub3RpZnlcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzZXRBIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IGdldFNsYWNrVXNlck1hcCwgbWVudGlvbkZvciB9IGZyb20gXCIuL3NsYWNrLXVzZXItbWFwXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInRva2VuLWRlYXRoXCJdKTtcblxudHlwZSBEZWFkVG9rZW5SZWYgPSBQaWNrPFRva2VuU3Vic2V0QSwgXCJpZFwiIHwgXCJuYW1lXCIgfCBcInByb3ZpZGVyXCIgfCBcImNyZWRlbnRpYWxzXCI+O1xuXG4vKipcbiAqIEBwYXJhbSByZWFzb25Db2RlIGBwcm92aWRlcjpjb2RlYCDtmJXtg5zsnZgg64K067aAIOy9lOuTnC4gcHJvdmlkZXIg7J2R64u1IOuzuOusuOyXkOuKlCDqs4TsoJUg7J2066mU7J287J2064KYXG4gKiAgIO2GoO2BsCDsobDqsIHsnbQg7ISe7J28IOyImCDsnojslrQgcmF3IOuplOyLnOyngOulvCDqt7jrjIDroZwg7JWM66a87JeQIOyLo+
|
|
59
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tZGVhdGguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLWRlYXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog7IS47IWYIOunjOujjChhdXRoLWRlYWQpIO2GoO2BsOydmCDrnbzsmrDtjIUg7KCc7Jm4IOyngOygkC5cbiAqXG4gKiByZWZyZXNoIOqwgCDsnqzroZzqt7jsnbgg7Jm4IOuzteq1rCDrtojqsIDtlZwg7Iuk7Yyo66W8IOuwmO2ZmO2VnCDsiJzqsITsl5Drp4wg7Zi47Lac65Cc64ukLiDsi5zrj4Tsl5Ag7IKs7Jqp7ZWcXG4gKiBjcmVkZW50aWFscyDqsIAgREIg7JmAIOqwmeydhCDrlYzrp4wgcmVhdXRoX3JlcXVpcmVkIOulvCDquLDroZ3tlZjqs6AsIOq3uCDquLDroZ3snYQg7J206ri0IO2UhOuhnOyEuOyKpOunjFxuICogU2xhY2sg7JWM66a87J2EIOuztOuCuOuLpCDigJQg6rO17JygIERCIOulvCDsk7DripQg7J247Iqk7YS07Iqk6rCAIOuqh+ydtOuToCDsgqzqsbTri7kg7JWM66a87J2AIDHqsbTsnbTri6QuXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IG5vdGlmeVNsYWNrLCBTTEFDS19DT0xPUiB9IGZyb20gXCIuLi8uLi91dGlscy9zbGFjay1ub3RpZnlcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzZXRBIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IGdldFNsYWNrVXNlck1hcCwgbWVudGlvbkZvciB9IGZyb20gXCIuL3NsYWNrLXVzZXItbWFwXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInRva2VuLWRlYXRoXCJdKTtcblxudHlwZSBEZWFkVG9rZW5SZWYgPSBQaWNrPFRva2VuU3Vic2V0QSwgXCJpZFwiIHwgXCJuYW1lXCIgfCBcInByb3ZpZGVyXCIgfCBcImNyZWRlbnRpYWxzXCI+O1xuXG4vKipcbiAqIEBwYXJhbSByZWFzb25Db2RlIGBwcm92aWRlcjpjb2RlYCDtmJXtg5zsnZgg64K067aAIOy9lOuTnC4gcHJvdmlkZXIg7J2R64u1IOuzuOusuOyXkOuKlCDqs4TsoJUg7J2066mU7J287J2064KYXG4gKiAgIO2GoO2BsCDsobDqsIHsnbQg7ISe7J28IOyImCDsnojslrQgcmF3IOuplOyLnOyngOulvCDqt7jrjIDroZwg7JWM66a87JeQIOyLo+yngCDslYrripTri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWFjdGl2YXRlQXV0aERlYWRUb2tlbihcbiAgdG9rZW46IERlYWRUb2tlblJlZixcbiAgcmVhc29uQ29kZTogc3RyaW5nLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHsgbWFya2VkLCB3YXNMYXN0QWN0aXZlLCBzdGFsZUNyZWRlbnRpYWxzIH0gPSBhd2FpdCBUb2tlbk1vZGVsLm1hcmtSZWF1dGhSZXF1aXJlZChcbiAgICB0b2tlbi5pZCxcbiAgICB0b2tlbi5jcmVkZW50aWFscyxcbiAgKTtcbiAgaWYgKHN0YWxlQ3JlZGVudGlhbHMpIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBza2lwcGluZyBhdXRoLWRlYXRoIGZvciAke3Rva2VuLm5hbWV9KGlkPSR7dG9rZW4uaWR9KTogY3JlZGVudGlhbHMgcm90YXRlZCBzaW5jZSB0aGlzIGF0dGVtcHRgLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghbWFya2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgbG9nZ2VyLndhcm4oYHRva2VuIHJlcXVpcmVzIHJlLWxvZ2luOiAke3Rva2VuLm5hbWV9KGlkPSR7dG9rZW4uaWR9KSByZWFzb249JHtyZWFzb25Db2RlfWApO1xuICAvLyDrp4zro4wg7KeB7ZuE6rCAIOyerOuhnOq3uOyduO2VmOq4sCDqsIDsnqUg7KKL7J2AIO2DgOydtOuwjeydtOuLpC4g7IaM7Jyg7J6Q66W8IOupmOyFmO2VtCDqt7gg7Iic6rCEIOuLueyCrOyekOyXkOqyjFxuICAvLyDqvYLripTri6Qg4oCUIOuLpOydtOygnOyKpO2KuOulvCDquLDri6TrpqzrqbQg64uk7J2MIOyjvOq4sOq5jOyngCDthqDtgbDsnbQg67mg7KeEIOyxhOuhnCDrgqjripTri6QuXG4gIGNvbnN0IG1lbnRpb24gPSBtZW50aW9uRm9yKHRva2VuLm5hbWUsIGdldFNsYWNrVXNlck1hcCgpKTtcbiAgdm9pZCBub3RpZnlTbGFjayh7XG4gICAgdGl0bGU6IFwi7IS47IWYIOunjOujjFwiLFxuICAgIHN1YmplY3Q6IHRva2VuLm5hbWUsXG4gICAgY29udGV4dDogW1xuICAgICAgbWVudGlvbixcbiAgICAgIHRva2VuLnByb3ZpZGVyLFxuICAgICAgcmVhc29uQ29kZSxcbiAgICAgIFwi7J6s66Gc6re47J247J20IO2VhOyalO2VqeuLiOuLpFwiLFxuICAgICAgd2FzTGFzdEFjdGl2ZSA/IFwi7IKs7JqpIOqwgOuKpe2VnCDthqDtgbDsnbQg7JeG7Iq164uI64ukXCIgOiBudWxsLFxuICAgIF1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKFwiIMK3IFwiKSxcbiAgICBjb2xvcjogU0xBQ0tfQ09MT1IuYmFkLFxuICAgIHVyZ2VudDogd2FzTGFzdEFjdGl2ZSxcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiog66Gc6re47J247J20IOyZhOujjOuPvCDthqDtgbDsnbQg7KCA7J6l65CQ7J2EIOuVjC4g7Iug6recwrfsnqzroZzqt7jsnbjsnYQg6rCA66as7KeAIOyViuuKlOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RpZnlUb2tlbkFkZGVkKG5hbWU6IHN0cmluZywgcHJvdmlkZXI6IHN0cmluZyk6IHZvaWQge1xuICBsb2dnZXIuaW5mbyhgdG9rZW4gYWRkZWQ6ICR7bmFtZX0gKCR7cHJvdmlkZXJ9KWApO1xuICBjb25zdCBtZW50aW9uID0gbWVudGlvbkZvcihuYW1lLCBnZXRTbGFja1VzZXJNYXAoKSk7XG4gIHZvaWQgbm90aWZ5U2xhY2soe1xuICAgIHRpdGxlOiBcIu2GoO2BsCDstpTqsIBcIixcbiAgICBzdWJqZWN0OiBuYW1lLFxuICAgIGNvbnRleHQ6IFttZW50aW9uLCBwcm92aWRlciwgXCLsmpTssq0g7LKY66as7JeQIOyCrOyaqeuQqeuLiOuLpFwiXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiDCtyBcIiksXG4gICAgY29sb3I6IFNMQUNLX0NPTE9SLmdvb2QsXG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFjQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsYUFBYSxDQUFDOzs7OztBQVFqRCxlQUFzQix3QkFDcEIsT0FDQSxZQUNrQjtDQUNsQixNQUFNLEVBQUUsUUFBUSxlQUFlLHFCQUFxQixNQUFNLFdBQVcsbUJBQ25FLE1BQU0sSUFDTixNQUFNLFdBQ1I7Q0FDQSxJQUFJLGtCQUFrQjtFQUNwQixPQUFPLEtBQ0wsMkJBQTJCLE1BQU0sS0FBSyxNQUFNLE1BQU0sR0FBRywwQ0FDdkQ7RUFDQSxPQUFPO0NBQ1Q7Q0FDQSxJQUFJLENBQUMsUUFBUSxPQUFPO0NBRXBCLE9BQU8sS0FBSyw0QkFBNEIsTUFBTSxLQUFLLE1BQU0sTUFBTSxHQUFHLFdBQVcsWUFBWTtDQUd6RixNQUFNLFVBQVUsV0FBVyxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7Q0FDeEQsQUFBSyxZQUFZO0VBQ2YsT0FBTztFQUNQLFNBQVMsTUFBTTtFQUNmLFNBQVM7R0FDUDtHQUNBLE1BQU07R0FDTjtHQUNBO0dBQ0EsZ0JBQWdCLG9CQUFvQjtFQUN0QyxDQUFDLENBQ0UsT0FBTyxPQUFPLENBQUMsQ0FDZixLQUFLLEtBQUs7RUFDYixPQUFPLFlBQVk7RUFDbkIsUUFBUTtDQUNWLENBQUM7Q0FDRCxPQUFPO0FBQ1Q7O0FBR0EsU0FBZ0IsaUJBQWlCLE1BQWMsVUFBd0I7Q0FDckUsT0FBTyxLQUFLLGdCQUFnQixLQUFLLElBQUksU0FBUyxFQUFFO0NBRWhELEFBQUssWUFBWTtFQUNmLE9BQU87RUFDUCxTQUFTO0VBQ1QsU0FBUztHQUpLLFdBQVcsTUFBTSxnQkFBZ0IsQ0FJckM7R0FBUztHQUFVO0VBQWMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLO0VBQ3ZFLE9BQU8sWUFBWTtDQUNyQixDQUFDO0FBQ0gifQ==
|
|
@@ -180,6 +180,7 @@ var TokenSubscriber = class {
|
|
|
180
180
|
}
|
|
181
181
|
async reconcileNow() {
|
|
182
182
|
const previousAnthropicIds = this.tokenChangeHandler ? new Set([...this.dispatcher.tokens.values()].filter((row) => row.active && row.provider === "anthropic").map((row) => row.id)) : null;
|
|
183
|
+
await TokenModel.deactivateExpiredTokens();
|
|
183
184
|
const rows = await TokenModel.findActive("A");
|
|
184
185
|
this.dispatcher.replaceCache(rows);
|
|
185
186
|
const anthropicRows = rows.filter((r) => r.provider === "anthropic").map((r) => ({
|
|
@@ -210,4 +211,4 @@ var TokenSubscriber = class {
|
|
|
210
211
|
//#endregion
|
|
211
212
|
export { TokenSubscriber };
|
|
212
213
|
|
|
213
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3Vic2NyaWJlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogdG9rZW5zX2NoYW5nZWQgTElTVEVOIHN1YnNjcmliZXIuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzLCB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkRGlzcGF0Y2hlckNsYXNzIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBTdWJzY3JpYmVyU3RhdHVzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3Vic2NyaWJlclwiXSk7XG5cbmNvbnN0IFRPS0VOU19DSEFOR0VEID0gXCJ0b2tlbnNfY2hhbmdlZFwiO1xuY29uc3QgUkVDT05DSUxFX0lOVEVSVkFMX01TID0gMTAgKiA2MCAqIDEwMDA7XG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRfTVMgPSA1XzAwMDtcbmNvbnN0IEJBQ0tPRkZfQkFTRV9NUyA9IDUwMDtcbmNvbnN0IEJBQ0tPRkZfQ0FQX01TID0gMzBfMDAwO1xuXG50eXBlIFBheWxvYWQgPSB7IG9wOiBcIklOU0VSVFwiIHwgXCJVUERBVEVcIiB8IFwiREVMRVRFXCI7IGlkOiBudW1iZXIgfTtcblxuZXhwb3J0IGNsYXNzIFRva2VuU3Vic2NyaWJlciB7XG4gIGNsaWVudDogQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHJlY29uY2lsZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICByZWNvbm5lY3RUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgYXR0ZW1wdCA9IDA7XG4gIGNvbm5lY3RlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RSZWNvbmNpbGVBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9wZXJhdGlvbkNoYWluOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgdG9rZW5DaGFuZ2VIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29ubkNvbmZpZzogQ2xpZW50Q29uZmlnLFxuICAgIHB1YmxpYyBkaXNwYXRjaGVyOiBRZ3JpZERpc3BhdGNoZXJDbGFzcyxcbiAgKSB7fVxuXG4gIHNldFRva2VuQ2hhbmdlSGFuZGxlcihoYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbkNoYW5nZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlUb2tlbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnRva2VuQ2hhbmdlSGFuZGxlcj8uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKGB0b2tlbiBjaGFuZ2UgaGFuZGxlciBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVuc3VyZVJlY29uY2lsZVRpbWVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0QW5kUmVjb25jaWxlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciBzdGFydCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9LCBzY2hlZHVsaW5nIHJldHJ5YCk7XG4gICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnJlY29uY2lsZVRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVjb25jaWxlVGltZXIpO1xuICAgICAgdGhpcy5yZWNvbmNpbGVUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lcik7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZUNsaWVudCgpO1xuICB9XG5cbiAgc3RhdHVzKCk6IFN1YnNjcmliZXJTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICBjb25uZWN0ZWQ6IHRoaXMuY2xpZW50ICE9PSBudWxsICYmIHRoaXMucmVjb25uZWN0VGltZXIgPT09IG51bGwsXG4gICAgICBjb25uZWN0ZWRBdDogdGhpcy5jb25uZWN0ZWRBdCxcbiAgICAgIGxhc3RSZWNvbmNpbGVBdDogdGhpcy5sYXN0UmVjb25jaWxlQXQsXG4gICAgICBhdHRlbXB0OiB0aGlzLmF0dGVtcHQsXG4gICAgfTtcbiAgfVxuXG4gIGVuc3VyZVJlY29uY2lsZVRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29uY2lsZVRpbWVyKSByZXR1cm47XG5cbiAgICAvLyBMSVNURU4vTk9USUZZIOuKlCDrgYrquLQg64+Z7JWIIOycoOyLpOuQoCDsiJgg7J6I7Ja0IOyjvOq4sOyggeycvOuhnCBEQiDquLDspIDsnLzroZwg66ee7LaY64ukLlxuICAgIHRoaXMucmVjb25jaWxlVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29uY2lsZSgpLmNhdGNoKChlKSA9PlxuICAgICAgICBsb2dnZXIud2FybihgcGVyaW9kaWMgcmVjb25jaWxlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSxcbiAgICAgICk7XG4gICAgfSwgUkVDT05DSUxFX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3RBbmRSZWNvbmNpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0QW5kTGlzdGVuKCk7XG4gICAgYXdhaXQgdGhpcy5yZWNvbmNpbGUoKTtcbiAgICB0aGlzLmF0dGVtcHQgPSAwO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdEFuZExpc3RlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAgIC4uLnRoaXMuY29ubkNvbmZpZyxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBDT05ORUNUSU9OX1RJTUVPVVRfTVMsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXlNaWxsaXM6IDEwXzAwMCxcbiAgICAgIGFwcGxpY2F0aW9uX25hbWU6IFwicWdyaWQtbGlzdGVuZXJcIixcbiAgICB9KTtcblxuICAgIGNsaWVudC5vbihcImVycm9yXCIsIChlKSA9PiB7XG4gICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICB9KTtcbiAgICBjbGllbnQub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNodXRkb3duUmVxdWVzdGVkKSB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICB9KTtcbiAgICBjbGllbnQub24oXCJub3RpZmljYXRpb25cIiwgKG1zZykgPT4ge1xuICAgICAgaWYgKG1zZy5jaGFubmVsICE9PSBUT0tFTlNfQ0hBTkdFRCB8fCAhbXNnLnBheWxvYWQpIHJldHVybjtcbiAgICAgIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKG1zZy5wYXlsb2FkKS5jYXRjaCgoZSkgPT5cbiAgICAgICAgbG9nZ2VyLndhcm4oYGhhbmRsZSBOT1RJRlkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQuY29ubmVjdCgpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VUIHN0YXRlbWVudF90aW1lb3V0ID0gMFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlNFVCBpZGxlX2luX3RyYW5zYWN0aW9uX3Nlc3Npb25fdGltZW91dCA9IDBcIik7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYExJU1RFTiAke2NsaWVudC5lc2NhcGVJZGVudGlmaWVyKFRPS0VOU19DSEFOR0VEKX1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICBhd2FpdCBjbGllbnQuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmNvbm5lY3RlZEF0ID0gbmV3IERhdGUoKTtcbiAgICBsb2dnZXIuaW5mbyhgc3Vic2NyaWJlZCB0byAke1RPS0VOU19DSEFOR0VEfWApO1xuICB9XG5cbiAgcmV0cnlMYXRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaHV0ZG93blJlcXVlc3RlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyKSByZXR1cm47XG5cbiAgICB2b2lkIHRoaXMuY2xvc2VDbGllbnQoKTtcbiAgICB0aGlzLmF0dGVtcHQgKz0gMTtcbiAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihCQUNLT0ZGX0JBU0VfTVMgKiAyICoqIHRoaXMuYXR0ZW1wdCwgQkFDS09GRl9DQVBfTVMpO1xuICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FwKTtcbiAgICBsb2dnZXIuaW5mbyhgcmVjb25uZWN0aW5nIGluICR7ZGVsYXl9bXMgKGF0dGVtcHQgJHt0aGlzLmF0dGVtcHR9KWApO1xuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0QW5kUmVjb25jaWxlKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYHN1YnNjcmliZXIgcmVjb25uZWN0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgdGhpcy5yZXRyeUxhdGVyKCk7XG4gICAgICB9KTtcbiAgICB9LCBkZWxheSk7XG4gIH1cblxuICBhc3luYyBjbG9zZUNsaWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgICBpZiAoIWNsaWVudCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jbGllbnQgPSBudWxsO1xuICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBhd2FpdCBjbGllbnQuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTm90aWZpY2F0aW9uKHBheWxvYWRKc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uTm93KHBheWxvYWRKc29uKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZU5vdGlmaWNhdGlvbk5vdyhwYXlsb2FkSnNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UocGF5bG9hZEpzb24pIGFzIFBheWxvYWQ7XG4gICAgY29uc3QgcHJldmlvdXNSb3cgPSB0aGlzLnRva2VuQ2hhbmdlSGFuZGxlclxuICAgICAgPyB0aGlzLmRpc3BhdGNoZXIudG9rZW5zLmdldChwYXlsb2FkLmlkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2FzS2VlcGFsaXZlVGFyZ2V0ID0gcHJldmlvdXNSb3c/LmFjdGl2ZSA9PT0gdHJ1ZSAmJiBwcmV2aW91c1Jvdy5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIjtcbiAgICBpZiAocGF5bG9hZC5vcCA9PT0gXCJERUxFVEVcIikge1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZUNhY2hlKHBheWxvYWQuaWQpO1xuICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgICAgPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKVxuICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgdG9rZW4gcmVtb3ZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAvLyBhbnRocm9waWMg7Yag7YGwIOydtOuypO2KuOuKlCDrj5nquLAodm9pZCkg4oCUIHByb3ZpZGVyIOulvCDrqqjrpbTrr4DroZwg66y07ZW07ZWY6rKMIO2VreyDgSDsoJzqsbAg7Iuc64+ELlxuICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpO1xuICAgICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0g4oaSIHJlbW92ZWQgZnJvbSBjYWNoZWApO1xuICAgICAgaWYgKHByZXZpb3VzUm93ID09PSB1bmRlZmluZWQgfHwgd2FzS2VlcGFsaXZlVGFyZ2V0KSB0aGlzLm5vdGlmeVRva2Vuc0NoYW5nZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkOiBwYXlsb2FkLmlkIH0pO1xuICAgIGlmICghcm93KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlQ2FjaGUocGF5bG9hZC5pZCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICA/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB0b2tlbiByZW1vdmUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9IOKGkiBtaXNzaW5nLCByZW1vdmVkIGZyb20gY2FjaGVgKTtcbiAgICAgIGlmIChwcmV2aW91c1JvdyA9PT0gdW5kZWZpbmVkIHx8IHdhc0tlZXBhbGl2ZVRhcmdldCkgdGhpcy5ub3RpZnlUb2tlbnNDaGFuZ2VkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyLnVwc2VydENhY2hlKHBheWxvYWQuaWQsIHJvdyk7XG5cbiAgICBpZiAocm93LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBjb25zdCBjcmVkcyA9IHJvdy5jcmVkZW50aWFscyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IG9wZW5haURpc3BhdGNoZXIgPSB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgIGlmIChwYXlsb2FkLm9wID09PSBcIklOU0VSVFwiICYmIHJvdy5hY3RpdmUpIHtcbiAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgID8ub25Ub2tlbkFkZGVkKFxuICAgICAgICAgICAgcGF5bG9hZC5pZCxcbiAgICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgICAgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgICApXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHRva2VuIGFkZCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgfSBlbHNlIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgIGlmIChvcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgICAgLm9uVG9rZW5VcGRhdGVkKFxuICAgICAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgICAgICByb3cubmFtZSxcbiAgICAgICAgICAgICAgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgICAgIHJvdy53ZWlnaHQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAudGhlbigoKSA9PiBvcGVuYWlEaXNwYXRjaGVyLm9uVG9rZW5BY3RpdmF0ZWQocGF5bG9hZC5pZCkpXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgdG9rZW4gdXBkYXRlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wZW5haURpc3BhdGNoZXI/Lm9uVG9rZW5EZWFjdGl2YXRlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvdy5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgLy8gYW50aHJvcGljIO2GoO2BsCDsnbTrsqTtirjripQg64+Z6riwKHZvaWQpLiB3b3JrZXIg6rCAIOyXhuqzoCDtkoAoTWFwKeunjCDqtIDrpqztlZjrr4DroZwg64uo7IicOlxuICAgICAgLy8gIElOU0VSVCDihpIg7LaU6rCALCBhY3RpdmUg66m0IOqwseyLoChvblRva2VuVXBkYXRlZCDqsIAgaWRlbnRpdHkg67OA6rK964+EIOyymOumrCksIGluYWN0aXZlIOuptCDtkoDsl5DshJwg7KCc6rGwLlxuICAgICAgLy8gICjrs4Trj4QgYWN0aXZhdGUvZGVhY3RpdmF0ZSDsvZzrsLHsnbQg7JeG7Ja0IGFjdGl2ZSDthqDquIDsnYQgYWRkL3JlbW92ZSDroZwg66ek7ZWRLilcbiAgICAgIGNvbnN0IGNyZWRzID0gcm93LmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICAgICAgaWYgKHBheWxvYWQub3AgPT09IFwiSU5TRVJUXCIgJiYgcm93LmFjdGl2ZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ub25Ub2tlbkFkZGVkKFxuICAgICAgICAgIHBheWxvYWQuaWQsXG4gICAgICAgICAgcm93Lm5hbWUsXG4gICAgICAgICAgY3JlZHMsXG4gICAgICAgICAgcm93LnF1b3RhX3RocmVzaG9sZCxcbiAgICAgICAgICByb3cud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuVXBkYXRlZChcbiAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIGNyZWRzLFxuICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGluYWN0aXZlIOuptCBJTlNFUlQg65OgIFVQREFURSDrk6Ag7ZKA7JeQIOuEo+yngCDslYrripTri6QuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0gKCR7cm93Lm5hbWV9KSBhY3RpdmU9JHtyb3cuYWN0aXZlfWApO1xuICAgIGNvbnN0IGlzS2VlcGFsaXZlVGFyZ2V0ID0gcm93LmFjdGl2ZSAmJiByb3cucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCI7XG4gICAgaWYgKHdhc0tlZXBhbGl2ZVRhcmdldCAhPT0gaXNLZWVwYWxpdmVUYXJnZXQpIHRoaXMubm90aWZ5VG9rZW5zQ2hhbmdlZCgpO1xuICB9XG5cbiAgYXN5bmMgcmVjb25jaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5yZWNvbmNpbGVOb3coKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY29uY2lsZU5vdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmV2aW91c0FudGhyb3BpY0lkcyA9IHRoaXMudG9rZW5DaGFuZ2VIYW5kbGVyXG4gICAgICA/IG5ldyBTZXQoXG4gICAgICAgICAgWy4uLnRoaXMuZGlzcGF0Y2hlci50b2tlbnMudmFsdWVzKCldXG4gICAgICAgICAgICAuZmlsdGVyKChyb3cpID0+IHJvdy5hY3RpdmUgJiYgcm93LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKVxuICAgICAgICAgICAgLm1hcCgocm93KSA9PiByb3cuaWQpLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEFjdGl2ZShcIkFcIik7XG4gICAgdGhpcy5kaXNwYXRjaGVyLnJlcGxhY2VDYWNoZShyb3dzKTtcbiAgICAvLyBOT1RJRlkg7Jyg7IukIOuMgOu5hDogQW50aHJvcGljRGlzcGF0Y2hlciDtkoDrj4QgREIgYWN0aXZlIGFudGhyb3BpYyDthqDtgbAg6riw7KSA7Jy866GcIOyerOuPmeq4sO2ZlC5cbiAgICAvLyAocm93cyDripQgYWN0aXZlIOunjCDigJQgaW5hY3RpdmUv7IKt7KCc65CcIO2GoO2BsOydgCDsl6zquLAg7JeG7Jy866+A66GcIHJlcGxhY2VUb2tlbnMg6rCAIO2SgOyXkOyEnCDsoJzqsbDtlZzri6QuKVxuICAgIGNvbnN0IGFudGhyb3BpY1Jvd3MgPSByb3dzXG4gICAgICAuZmlsdGVyKChyKSA9PiByLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKVxuICAgICAgLm1hcCgocikgPT4gKHtcbiAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgIG5hbWU6IHIubmFtZSxcbiAgICAgICAgY3JlZGVudGlhbHM6IHIuY3JlZGVudGlhbHMgYXMgQW50aHJvcGljQ3JlZGVudGlhbHMsXG4gICAgICAgIHF1b3RhVGhyZXNob2xkOiByLnF1b3RhX3RocmVzaG9sZCxcbiAgICAgICAgd2VpZ2h0OiByLndlaWdodCxcbiAgICAgIH0pKTtcbiAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ucmVwbGFjZVRva2VucyhhbnRocm9waWNSb3dzKTtcbiAgICBjb25zdCBvcGVuYWlSb3dzID0gcm93c1xuICAgICAgLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gXCJvcGVuYWlcIilcbiAgICAgIC5tYXAoKHIpID0+ICh7XG4gICAgICAgIGlkOiByLmlkLFxuICAgICAgICBuYW1lOiByLm5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzOiByLmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZDogci5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgIHdlaWdodDogci53ZWlnaHQsXG4gICAgICB9KSk7XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgID8ucmVwbGFjZVRva2VucyhvcGVuYWlSb3dzKVxuICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHJlY29uY2lsZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgIHRoaXMubGFzdFJlY29uY2lsZUF0ID0gbmV3IERhdGUoKTtcbiAgICBpZiAoXG4gICAgICBwcmV2aW91c0FudGhyb3BpY0lkcyAmJlxuICAgICAgKHByZXZpb3VzQW50aHJvcGljSWRzLnNpemUgIT09IGFudGhyb3BpY1Jvd3MubGVuZ3RoIHx8XG4gICAgICAgIGFudGhyb3BpY1Jvd3Muc29tZSgocm93KSA9PiAhcHJldmlvdXNBbnRocm9waWNJZHMuaGFzKHJvdy5pZCkpKVxuICAgICkge1xuICAgICAgdGhpcy5ub3RpZnlUb2tlbnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnF1ZXVlT3BlcmF0aW9uKG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm9wZXJhdGlvbkNoYWluLnRoZW4ob3BlcmF0aW9uLCBvcGVyYXRpb24pO1xuICAgIHRoaXMub3BlcmF0aW9uQ2hhaW4gPSBuZXh0LmNhdGNoKCgpID0+IHt9KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQVNBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxZQUFZLENBQUM7QUFFaEQsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSx3QkFBd0IsTUFBVTtBQUN4QyxNQUFN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
|
|
214
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3Vic2NyaWJlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogdG9rZW5zX2NoYW5nZWQgTElTVEVOIHN1YnNjcmliZXIuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzLCB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkRGlzcGF0Y2hlckNsYXNzIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBTdWJzY3JpYmVyU3RhdHVzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3Vic2NyaWJlclwiXSk7XG5cbmNvbnN0IFRPS0VOU19DSEFOR0VEID0gXCJ0b2tlbnNfY2hhbmdlZFwiO1xuY29uc3QgUkVDT05DSUxFX0lOVEVSVkFMX01TID0gMTAgKiA2MCAqIDEwMDA7XG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRfTVMgPSA1XzAwMDtcbmNvbnN0IEJBQ0tPRkZfQkFTRV9NUyA9IDUwMDtcbmNvbnN0IEJBQ0tPRkZfQ0FQX01TID0gMzBfMDAwO1xuXG50eXBlIFBheWxvYWQgPSB7IG9wOiBcIklOU0VSVFwiIHwgXCJVUERBVEVcIiB8IFwiREVMRVRFXCI7IGlkOiBudW1iZXIgfTtcblxuZXhwb3J0IGNsYXNzIFRva2VuU3Vic2NyaWJlciB7XG4gIGNsaWVudDogQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHJlY29uY2lsZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICByZWNvbm5lY3RUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgYXR0ZW1wdCA9IDA7XG4gIGNvbm5lY3RlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RSZWNvbmNpbGVBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9wZXJhdGlvbkNoYWluOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgdG9rZW5DaGFuZ2VIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29ubkNvbmZpZzogQ2xpZW50Q29uZmlnLFxuICAgIHB1YmxpYyBkaXNwYXRjaGVyOiBRZ3JpZERpc3BhdGNoZXJDbGFzcyxcbiAgKSB7fVxuXG4gIHNldFRva2VuQ2hhbmdlSGFuZGxlcihoYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbkNoYW5nZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlUb2tlbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnRva2VuQ2hhbmdlSGFuZGxlcj8uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKGB0b2tlbiBjaGFuZ2UgaGFuZGxlciBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVuc3VyZVJlY29uY2lsZVRpbWVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0QW5kUmVjb25jaWxlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciBzdGFydCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9LCBzY2hlZHVsaW5nIHJldHJ5YCk7XG4gICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnJlY29uY2lsZVRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVjb25jaWxlVGltZXIpO1xuICAgICAgdGhpcy5yZWNvbmNpbGVUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lcik7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZUNsaWVudCgpO1xuICB9XG5cbiAgc3RhdHVzKCk6IFN1YnNjcmliZXJTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICBjb25uZWN0ZWQ6IHRoaXMuY2xpZW50ICE9PSBudWxsICYmIHRoaXMucmVjb25uZWN0VGltZXIgPT09IG51bGwsXG4gICAgICBjb25uZWN0ZWRBdDogdGhpcy5jb25uZWN0ZWRBdCxcbiAgICAgIGxhc3RSZWNvbmNpbGVBdDogdGhpcy5sYXN0UmVjb25jaWxlQXQsXG4gICAgICBhdHRlbXB0OiB0aGlzLmF0dGVtcHQsXG4gICAgfTtcbiAgfVxuXG4gIGVuc3VyZVJlY29uY2lsZVRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29uY2lsZVRpbWVyKSByZXR1cm47XG5cbiAgICAvLyBMSVNURU4vTk9USUZZIOuKlCDrgYrquLQg64+Z7JWIIOycoOyLpOuQoCDsiJgg7J6I7Ja0IOyjvOq4sOyggeycvOuhnCBEQiDquLDspIDsnLzroZwg66ee7LaY64ukLlxuICAgIHRoaXMucmVjb25jaWxlVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29uY2lsZSgpLmNhdGNoKChlKSA9PlxuICAgICAgICBsb2dnZXIud2FybihgcGVyaW9kaWMgcmVjb25jaWxlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSxcbiAgICAgICk7XG4gICAgfSwgUkVDT05DSUxFX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3RBbmRSZWNvbmNpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0QW5kTGlzdGVuKCk7XG4gICAgYXdhaXQgdGhpcy5yZWNvbmNpbGUoKTtcbiAgICB0aGlzLmF0dGVtcHQgPSAwO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdEFuZExpc3RlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAgIC4uLnRoaXMuY29ubkNvbmZpZyxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBDT05ORUNUSU9OX1RJTUVPVVRfTVMsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXlNaWxsaXM6IDEwXzAwMCxcbiAgICAgIGFwcGxpY2F0aW9uX25hbWU6IFwicWdyaWQtbGlzdGVuZXJcIixcbiAgICB9KTtcblxuICAgIGNsaWVudC5vbihcImVycm9yXCIsIChlKSA9PiB7XG4gICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICB9KTtcbiAgICBjbGllbnQub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNodXRkb3duUmVxdWVzdGVkKSB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICB9KTtcbiAgICBjbGllbnQub24oXCJub3RpZmljYXRpb25cIiwgKG1zZykgPT4ge1xuICAgICAgaWYgKG1zZy5jaGFubmVsICE9PSBUT0tFTlNfQ0hBTkdFRCB8fCAhbXNnLnBheWxvYWQpIHJldHVybjtcbiAgICAgIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKG1zZy5wYXlsb2FkKS5jYXRjaCgoZSkgPT5cbiAgICAgICAgbG9nZ2VyLndhcm4oYGhhbmRsZSBOT1RJRlkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQuY29ubmVjdCgpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VUIHN0YXRlbWVudF90aW1lb3V0ID0gMFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlNFVCBpZGxlX2luX3RyYW5zYWN0aW9uX3Nlc3Npb25fdGltZW91dCA9IDBcIik7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYExJU1RFTiAke2NsaWVudC5lc2NhcGVJZGVudGlmaWVyKFRPS0VOU19DSEFOR0VEKX1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICBhd2FpdCBjbGllbnQuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmNvbm5lY3RlZEF0ID0gbmV3IERhdGUoKTtcbiAgICBsb2dnZXIuaW5mbyhgc3Vic2NyaWJlZCB0byAke1RPS0VOU19DSEFOR0VEfWApO1xuICB9XG5cbiAgcmV0cnlMYXRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaHV0ZG93blJlcXVlc3RlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyKSByZXR1cm47XG5cbiAgICB2b2lkIHRoaXMuY2xvc2VDbGllbnQoKTtcbiAgICB0aGlzLmF0dGVtcHQgKz0gMTtcbiAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihCQUNLT0ZGX0JBU0VfTVMgKiAyICoqIHRoaXMuYXR0ZW1wdCwgQkFDS09GRl9DQVBfTVMpO1xuICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FwKTtcbiAgICBsb2dnZXIuaW5mbyhgcmVjb25uZWN0aW5nIGluICR7ZGVsYXl9bXMgKGF0dGVtcHQgJHt0aGlzLmF0dGVtcHR9KWApO1xuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0QW5kUmVjb25jaWxlKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYHN1YnNjcmliZXIgcmVjb25uZWN0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgdGhpcy5yZXRyeUxhdGVyKCk7XG4gICAgICB9KTtcbiAgICB9LCBkZWxheSk7XG4gIH1cblxuICBhc3luYyBjbG9zZUNsaWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgICBpZiAoIWNsaWVudCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jbGllbnQgPSBudWxsO1xuICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBhd2FpdCBjbGllbnQuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTm90aWZpY2F0aW9uKHBheWxvYWRKc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uTm93KHBheWxvYWRKc29uKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZU5vdGlmaWNhdGlvbk5vdyhwYXlsb2FkSnNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UocGF5bG9hZEpzb24pIGFzIFBheWxvYWQ7XG4gICAgY29uc3QgcHJldmlvdXNSb3cgPSB0aGlzLnRva2VuQ2hhbmdlSGFuZGxlclxuICAgICAgPyB0aGlzLmRpc3BhdGNoZXIudG9rZW5zLmdldChwYXlsb2FkLmlkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2FzS2VlcGFsaXZlVGFyZ2V0ID0gcHJldmlvdXNSb3c/LmFjdGl2ZSA9PT0gdHJ1ZSAmJiBwcmV2aW91c1Jvdy5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIjtcbiAgICBpZiAocGF5bG9hZC5vcCA9PT0gXCJERUxFVEVcIikge1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZUNhY2hlKHBheWxvYWQuaWQpO1xuICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgICAgPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKVxuICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgdG9rZW4gcmVtb3ZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAvLyBhbnRocm9waWMg7Yag7YGwIOydtOuypO2KuOuKlCDrj5nquLAodm9pZCkg4oCUIHByb3ZpZGVyIOulvCDrqqjrpbTrr4DroZwg66y07ZW07ZWY6rKMIO2VreyDgSDsoJzqsbAg7Iuc64+ELlxuICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpO1xuICAgICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0g4oaSIHJlbW92ZWQgZnJvbSBjYWNoZWApO1xuICAgICAgaWYgKHByZXZpb3VzUm93ID09PSB1bmRlZmluZWQgfHwgd2FzS2VlcGFsaXZlVGFyZ2V0KSB0aGlzLm5vdGlmeVRva2Vuc0NoYW5nZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkOiBwYXlsb2FkLmlkIH0pO1xuICAgIGlmICghcm93KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlQ2FjaGUocGF5bG9hZC5pZCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICA/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB0b2tlbiByZW1vdmUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9IOKGkiBtaXNzaW5nLCByZW1vdmVkIGZyb20gY2FjaGVgKTtcbiAgICAgIGlmIChwcmV2aW91c1JvdyA9PT0gdW5kZWZpbmVkIHx8IHdhc0tlZXBhbGl2ZVRhcmdldCkgdGhpcy5ub3RpZnlUb2tlbnNDaGFuZ2VkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyLnVwc2VydENhY2hlKHBheWxvYWQuaWQsIHJvdyk7XG5cbiAgICBpZiAocm93LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBjb25zdCBjcmVkcyA9IHJvdy5jcmVkZW50aWFscyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IG9wZW5haURpc3BhdGNoZXIgPSB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgIGlmIChwYXlsb2FkLm9wID09PSBcIklOU0VSVFwiICYmIHJvdy5hY3RpdmUpIHtcbiAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgID8ub25Ub2tlbkFkZGVkKFxuICAgICAgICAgICAgcGF5bG9hZC5pZCxcbiAgICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgICAgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgICApXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHRva2VuIGFkZCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgfSBlbHNlIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgIGlmIChvcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgICAgLm9uVG9rZW5VcGRhdGVkKFxuICAgICAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgICAgICByb3cubmFtZSxcbiAgICAgICAgICAgICAgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgICAgIHJvdy53ZWlnaHQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAudGhlbigoKSA9PiBvcGVuYWlEaXNwYXRjaGVyLm9uVG9rZW5BY3RpdmF0ZWQocGF5bG9hZC5pZCkpXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgdG9rZW4gdXBkYXRlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wZW5haURpc3BhdGNoZXI/Lm9uVG9rZW5EZWFjdGl2YXRlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvdy5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgLy8gYW50aHJvcGljIO2GoO2BsCDsnbTrsqTtirjripQg64+Z6riwKHZvaWQpLiB3b3JrZXIg6rCAIOyXhuqzoCDtkoAoTWFwKeunjCDqtIDrpqztlZjrr4DroZwg64uo7IicOlxuICAgICAgLy8gIElOU0VSVCDihpIg7LaU6rCALCBhY3RpdmUg66m0IOqwseyLoChvblRva2VuVXBkYXRlZCDqsIAgaWRlbnRpdHkg67OA6rK964+EIOyymOumrCksIGluYWN0aXZlIOuptCDtkoDsl5DshJwg7KCc6rGwLlxuICAgICAgLy8gICjrs4Trj4QgYWN0aXZhdGUvZGVhY3RpdmF0ZSDsvZzrsLHsnbQg7JeG7Ja0IGFjdGl2ZSDthqDquIDsnYQgYWRkL3JlbW92ZSDroZwg66ek7ZWRLilcbiAgICAgIGNvbnN0IGNyZWRzID0gcm93LmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICAgICAgaWYgKHBheWxvYWQub3AgPT09IFwiSU5TRVJUXCIgJiYgcm93LmFjdGl2ZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ub25Ub2tlbkFkZGVkKFxuICAgICAgICAgIHBheWxvYWQuaWQsXG4gICAgICAgICAgcm93Lm5hbWUsXG4gICAgICAgICAgY3JlZHMsXG4gICAgICAgICAgcm93LnF1b3RhX3RocmVzaG9sZCxcbiAgICAgICAgICByb3cud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuVXBkYXRlZChcbiAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIGNyZWRzLFxuICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGluYWN0aXZlIOuptCBJTlNFUlQg65OgIFVQREFURSDrk6Ag7ZKA7JeQIOuEo+yngCDslYrripTri6QuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0gKCR7cm93Lm5hbWV9KSBhY3RpdmU9JHtyb3cuYWN0aXZlfWApO1xuICAgIGNvbnN0IGlzS2VlcGFsaXZlVGFyZ2V0ID0gcm93LmFjdGl2ZSAmJiByb3cucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCI7XG4gICAgaWYgKHdhc0tlZXBhbGl2ZVRhcmdldCAhPT0gaXNLZWVwYWxpdmVUYXJnZXQpIHRoaXMubm90aWZ5VG9rZW5zQ2hhbmdlZCgpO1xuICB9XG5cbiAgYXN5bmMgcmVjb25jaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5yZWNvbmNpbGVOb3coKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY29uY2lsZU5vdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmV2aW91c0FudGhyb3BpY0lkcyA9IHRoaXMudG9rZW5DaGFuZ2VIYW5kbGVyXG4gICAgICA/IG5ldyBTZXQoXG4gICAgICAgICAgWy4uLnRoaXMuZGlzcGF0Y2hlci50b2tlbnMudmFsdWVzKCldXG4gICAgICAgICAgICAuZmlsdGVyKChyb3cpID0+IHJvdy5hY3RpdmUgJiYgcm93LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKVxuICAgICAgICAgICAgLm1hcCgocm93KSA9PiByb3cuaWQpLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWFjdGl2YXRlRXhwaXJlZFRva2VucygpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmUoXCJBXCIpO1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZXBsYWNlQ2FjaGUocm93cyk7XG4gICAgLy8gTk9USUZZIOycoOyLpCDrjIDruYQ6IEFudGhyb3BpY0Rpc3BhdGNoZXIg7ZKA64+EIERCIGFjdGl2ZSBhbnRocm9waWMg7Yag7YGwIOq4sOykgOycvOuhnCDsnqzrj5nquLDtmZQuXG4gICAgLy8gKHJvd3Mg64qUIGFjdGl2ZSDrp4wg4oCUIGluYWN0aXZlL+yCreygnOuQnCDthqDtgbDsnYAg7Jes6riwIOyXhuycvOuvgOuhnCByZXBsYWNlVG9rZW5zIOqwgCDtkoDsl5DshJwg7KCc6rGw7ZWc64ukLilcbiAgICBjb25zdCBhbnRocm9waWNSb3dzID0gcm93c1xuICAgICAgLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIilcbiAgICAgIC5tYXAoKHIpID0+ICh7XG4gICAgICAgIGlkOiByLmlkLFxuICAgICAgICBuYW1lOiByLm5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzOiByLmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZDogci5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgIHdlaWdodDogci53ZWlnaHQsXG4gICAgICB9KSk7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/LnJlcGxhY2VUb2tlbnMoYW50aHJvcGljUm93cyk7XG4gICAgY29uc3Qgb3BlbmFpUm93cyA9IHJvd3NcbiAgICAgIC5maWx0ZXIoKHIpID0+IHIucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpXG4gICAgICAubWFwKChyKSA9PiAoe1xuICAgICAgICBpZDogci5pZCxcbiAgICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogci5jcmVkZW50aWFscyBhcyBPcGVuQUlDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHIucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICB3ZWlnaHQ6IHIud2VpZ2h0LFxuICAgICAgfSkpO1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICA/LnJlcGxhY2VUb2tlbnMob3BlbmFpUm93cylcbiAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSByZWNvbmNpbGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICB0aGlzLmxhc3RSZWNvbmNpbGVBdCA9IG5ldyBEYXRlKCk7XG4gICAgaWYgKFxuICAgICAgcHJldmlvdXNBbnRocm9waWNJZHMgJiZcbiAgICAgIChwcmV2aW91c0FudGhyb3BpY0lkcy5zaXplICE9PSBhbnRocm9waWNSb3dzLmxlbmd0aCB8fFxuICAgICAgICBhbnRocm9waWNSb3dzLnNvbWUoKHJvdykgPT4gIXByZXZpb3VzQW50aHJvcGljSWRzLmhhcyhyb3cuaWQpKSlcbiAgICApIHtcbiAgICAgIHRoaXMubm90aWZ5VG9rZW5zQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5xdWV1ZU9wZXJhdGlvbihvcGVyYXRpb246ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5vcGVyYXRpb25DaGFpbi50aGVuKG9wZXJhdGlvbiwgb3BlcmF0aW9uKTtcbiAgICB0aGlzLm9wZXJhdGlvbkNoYWluID0gbmV4dC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFTQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsWUFBWSxDQUFDO0FB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
|