@pipeline-builder/pipeline-manager 4.1.3 → 4.1.5

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.
Files changed (52) hide show
  1. package/README.md +2 -1
  2. package/dist/agent/env-file.d.ts +1 -1
  3. package/dist/agent/env-file.js +2 -2
  4. package/dist/agent/post-steps.d.ts.map +1 -1
  5. package/dist/agent/post-steps.js +38 -18
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +19 -9
  8. package/dist/commands/audit-tokens.d.ts.map +1 -1
  9. package/dist/commands/audit-tokens.js +32 -21
  10. package/dist/commands/create-pat.d.ts +20 -13
  11. package/dist/commands/create-pat.d.ts.map +1 -1
  12. package/dist/commands/create-pat.js +93 -98
  13. package/dist/commands/login.d.ts +14 -8
  14. package/dist/commands/login.d.ts.map +1 -1
  15. package/dist/commands/login.js +89 -124
  16. package/dist/commands/setup-events.d.ts.map +1 -1
  17. package/dist/commands/setup-events.js +6 -5
  18. package/dist/commands/status.d.ts.map +1 -1
  19. package/dist/commands/status.js +9 -3
  20. package/dist/commands/store-token.d.ts +16 -11
  21. package/dist/commands/store-token.d.ts.map +1 -1
  22. package/dist/commands/store-token.js +213 -131
  23. package/dist/lambda/token-renew-handler.d.ts.map +1 -1
  24. package/dist/lambda/token-renew-handler.js +134 -97
  25. package/dist/templates/events-stack.json +1 -1
  26. package/dist/templates/token-renew-stack.json +9 -10
  27. package/dist/utils/auth-utils.d.ts +21 -38
  28. package/dist/utils/auth-utils.d.ts.map +1 -1
  29. package/dist/utils/auth-utils.js +20 -33
  30. package/dist/utils/command-utils.d.ts +8 -6
  31. package/dist/utils/command-utils.d.ts.map +1 -1
  32. package/dist/utils/command-utils.js +71 -15
  33. package/dist/utils/config-loader.d.ts +2 -1
  34. package/dist/utils/config-loader.d.ts.map +1 -1
  35. package/dist/utils/config-loader.js +18 -8
  36. package/dist/utils/credential-store.d.ts +23 -0
  37. package/dist/utils/credential-store.d.ts.map +1 -0
  38. package/dist/utils/credential-store.js +92 -0
  39. package/dist/utils/device-auth.d.ts +59 -0
  40. package/dist/utils/device-auth.d.ts.map +1 -0
  41. package/dist/utils/device-auth.js +139 -0
  42. package/dist/utils/pipeline-config.js +2 -2
  43. package/dist/utils/platform-secret.d.ts +19 -1
  44. package/dist/utils/platform-secret.d.ts.map +1 -1
  45. package/dist/utils/platform-secret.js +26 -4
  46. package/dist/utils/service-account.d.ts +73 -0
  47. package/dist/utils/service-account.d.ts.map +1 -0
  48. package/dist/utils/service-account.js +158 -0
  49. package/package.json +4 -4
  50. package/dist/utils/rate-limiter.d.ts +0 -15
  51. package/dist/utils/rate-limiter.d.ts.map +0 -1
  52. package/dist/utils/rate-limiter.js +0 -164
@@ -6,9 +6,10 @@ import { ERROR_CODES } from './error-handler.js';
6
6
  import { printDebug, printError, printSuccess } from './output-utils.js';
7
7
  import { isProductionEnv } from './tls.js';
8
8
  /**
9
- * Guard the credential-transmitting commands (`login`, `create-pat`) against
10
- * disabling TLS verification in production. These POST plaintext passwords/JWTs,
11
- * so a MITM on a `prod + --no-verify-ssl` run would harvest them.
9
+ * Guard the credential-transmitting commands (`login`, `pat`) against disabling
10
+ * TLS verification in production. The device flow keeps passwords off the wire
11
+ * entirely, but the session tokens it returns are bearer credentials — a MITM on
12
+ * a `prod + --no-verify-ssl` run would harvest them just the same.
12
13
  *
13
14
  * Unlike {@link assertSslDisableAllowed} (which throws — for paths already inside
14
15
  * a try/catch), this prints and hard-exits, matching the pre-flight checks these
@@ -21,17 +22,6 @@ export function assertCredentialTlsAllowed(verifySsl) {
21
22
  process.exit(ERROR_CODES.AUTHENTICATION);
22
23
  }
23
24
  }
24
- /**
25
- * Resolve credentials from flags, falling back to the
26
- * PLATFORM_IDENTIFIER / PLATFORM_PASSWORD env vars (so the password need not
27
- * appear in shell history / `ps`).
28
- */
29
- export function resolveCredentials(options) {
30
- return {
31
- identifier: options.identifier || process.env.PLATFORM_IDENTIFIER,
32
- password: options.password || process.env.PLATFORM_PASSWORD,
33
- };
34
- }
35
25
  /**
36
26
  * Build the https agent used by the credential commands. `--verify-ssl`
37
27
  * defaults to on; only an explicit `--no-verify-ssl` relaxes it (and only
@@ -41,32 +31,29 @@ export function credentialHttpsAgent(verifySsl) {
41
31
  return new https.Agent({ rejectUnauthorized: verifySsl ?? true });
42
32
  }
43
33
  /**
44
- * POST /api/auth/login and return the access token (or `undefined` if the
45
- * response carried none). Rate-limit accounting (record success/failure) and
46
- * the no-token exit are intentionally left to the caller so each command keeps
47
- * its exact lockout semantics.
48
- */
49
- export async function postLogin(params) {
50
- const loginUrl = `${params.url}/api/auth/login`;
51
- printDebug('POST', { url: loginUrl });
52
- const response = await axios.post(loginUrl, { identifier: params.identifier, password: params.password }, { headers: { 'Content-Type': 'application/json' }, httpsAgent: params.httpsAgent, timeout: params.timeout });
53
- return response.data?.data?.accessToken;
54
- }
55
- /**
56
- * POST /api/auth/switch-org with the current access token and return the new,
57
- * org-scoped access token. Prints a success line (unless `quiet`) and hard-exits
58
- * on a missing token — both credential commands treat a failed switch the same.
34
+ * POST /api/auth/switch-org with the current access token and return the WHOLE
35
+ * re-issued session.
36
+ *
37
+ * The switch re-issues the same session slot, which ROTATES its refresh token —
38
+ * so a caller that keeps only the access token is left holding a dead refresh
39
+ * token. Prints a success line (unless `quiet`) and hard-exits on a missing
40
+ * token, since both credential commands treat a failed switch the same.
59
41
  */
60
42
  export async function switchOrganization(params) {
61
43
  const switchUrl = `${params.url}/api/auth/switch-org`;
62
44
  printDebug('POST', { url: switchUrl });
63
45
  const response = await axios.post(switchUrl, { organizationId: params.orgId }, {
64
- headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${params.accessToken}` },
46
+ headers: {
47
+ 'Content-Type': 'application/json',
48
+ 'Authorization': `Bearer ${params.accessToken}`,
49
+ // Declares the body transport for the re-issued refresh token.
50
+ 'X-Pb-Client': 'cli',
51
+ },
65
52
  httpsAgent: params.httpsAgent,
66
53
  timeout: params.timeout,
67
54
  });
68
- const switched = response.data?.data?.accessToken;
69
- if (!switched) {
55
+ const switched = response.data?.data;
56
+ if (!switched?.accessToken) {
70
57
  printError('Organization switch failed: no access token in response');
71
58
  process.exit(ERROR_CODES.AUTHENTICATION);
72
59
  }
@@ -74,4 +61,4 @@ export async function switchOrganization(params) {
74
61
  printSuccess(`Switched to organization ${params.orgId}`);
75
62
  return switched;
76
63
  }
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9hdXRoLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQWMzQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsU0FBOEI7SUFDdkUsSUFBSSxTQUFTLEtBQUssS0FBSyxJQUFJLGVBQWUsRUFBRSxFQUFFLENBQUM7UUFDN0MsVUFBVSxDQUFDLDZOQUE2TixDQUFDLENBQUM7UUFDMU8sT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0MsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQW1EO0lBSXBGLE9BQU87UUFDTCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtRQUNqRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQjtLQUM1RCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsU0FBOEI7SUFDakUsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxNQU0vQjtJQUNDLE1BQU0sUUFBUSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7SUFDaEQsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FDL0IsUUFBUSxFQUNSLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFDNUQsRUFBRSxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUM1RyxDQUFDO0lBQ0YsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BT3hDO0lBQ0MsTUFBTSxTQUFTLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxzQkFBc0IsQ0FBQztJQUN0RCxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUMvQixTQUFTLEVBQ1QsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUNoQztRQUNFLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsVUFBVSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUU7UUFDaEcsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1FBQzdCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztLQUN4QixDQUNGLENBQUM7SUFDRixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUM7SUFDbEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsVUFBVSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztRQUFFLFlBQVksQ0FBQyw0QkFBNEIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUUsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IEVSUk9SX0NPREVTIH0gZnJvbSAnLi9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50RGVidWcsIHByaW50RXJyb3IsIHByaW50U3VjY2VzcyB9IGZyb20gJy4vb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGlzUHJvZHVjdGlvbkVudiB9IGZyb20gJy4vdGxzLmpzJztcblxuLyoqXG4gKiBMb2dpbiAvIHJlZnJlc2ggLyBzd2l0Y2gtb3JnIHJlc3BvbnNlIOKAlCBldmVyeSBwbGF0Zm9ybSBhdXRoIGVuZHBvaW50IHJldHVybnNcbiAqIHRoZSBzZXNzaW9uIHRva2VucyB1bmRlciB0aGlzIGVudmVsb3BlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGRhdGE6IHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIEd1YXJkIHRoZSBjcmVkZW50aWFsLXRyYW5zbWl0dGluZyBjb21tYW5kcyAoYGxvZ2luYCwgYGNyZWF0ZS1wYXRgKSBhZ2FpbnN0XG4gKiBkaXNhYmxpbmcgVExTIHZlcmlmaWNhdGlvbiBpbiBwcm9kdWN0aW9uLiBUaGVzZSBQT1NUIHBsYWludGV4dCBwYXNzd29yZHMvSldUcyxcbiAqIHNvIGEgTUlUTSBvbiBhIGBwcm9kICsgLS1uby12ZXJpZnktc3NsYCBydW4gd291bGQgaGFydmVzdCB0aGVtLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgYXNzZXJ0U3NsRGlzYWJsZUFsbG93ZWR9ICh3aGljaCB0aHJvd3Mg4oCUIGZvciBwYXRocyBhbHJlYWR5IGluc2lkZVxuICogYSB0cnkvY2F0Y2gpLCB0aGlzIHByaW50cyBhbmQgaGFyZC1leGl0cywgbWF0Y2hpbmcgdGhlIHByZS1mbGlnaHQgY2hlY2tzIHRoZXNlXG4gKiBjb21tYW5kcyBydW4gYmVmb3JlIHRoZWlyIHRyeSBibG9jay4gSW4gbm9uLXByb2R1Y3Rpb24gaXQgaXMgYSBuby1vcCwgc29cbiAqIGAtLW5vLXZlcmlmeS1zc2xgIHN0aWxsIHdvcmtzIGFnYWluc3Qgc2VsZi1zaWduZWQgZGV2IHBsYXRmb3Jtcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENyZWRlbnRpYWxUbHNBbGxvd2VkKHZlcmlmeVNzbDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAodmVyaWZ5U3NsID09PSBmYWxzZSAmJiBpc1Byb2R1Y3Rpb25FbnYoKSkge1xuICAgIHByaW50RXJyb3IoJ1JlZnVzaW5nIHRvIGRpc2FibGUgVExTIHZlcmlmaWNhdGlvbiBpbiBwcm9kdWN0aW9uIChOT0RFX0VOVj1wcm9kdWN0aW9uKSDigJQgY3JlZGVudGlhbHMgbXVzdCBub3QgYmUgdHJhbnNtaXR0ZWQgb3ZlciBhbiB1bnZlcmlmaWVkIGNvbm5lY3Rpb24uIFVzZSBhIHZhbGlkIGNlcnRpZmljYXRlLCBvciB1bnNldCBOT0RFX0VOViBmb3IgbG9jYWwvc2VsZi1zaWduZWQgZGV2ZWxvcG1lbnQuJyk7XG4gICAgcHJvY2Vzcy5leGl0KEVSUk9SX0NPREVTLkFVVEhFTlRJQ0FUSU9OKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmUgY3JlZGVudGlhbHMgZnJvbSBmbGFncywgZmFsbGluZyBiYWNrIHRvIHRoZVxuICogUExBVEZPUk1fSURFTlRJRklFUiAvIFBMQVRGT1JNX1BBU1NXT1JEIGVudiB2YXJzIChzbyB0aGUgcGFzc3dvcmQgbmVlZCBub3RcbiAqIGFwcGVhciBpbiBzaGVsbCBoaXN0b3J5IC8gYHBzYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ3JlZGVudGlhbHMob3B0aW9uczogeyBpZGVudGlmaWVyPzogc3RyaW5nOyBwYXNzd29yZD86IHN0cmluZyB9KToge1xuICBpZGVudGlmaWVyPzogc3RyaW5nO1xuICBwYXNzd29yZD86IHN0cmluZztcbn0ge1xuICByZXR1cm4ge1xuICAgIGlkZW50aWZpZXI6IG9wdGlvbnMuaWRlbnRpZmllciB8fCBwcm9jZXNzLmVudi5QTEFURk9STV9JREVOVElGSUVSLFxuICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3N3b3JkIHx8IHByb2Nlc3MuZW52LlBMQVRGT1JNX1BBU1NXT1JELFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBodHRwcyBhZ2VudCB1c2VkIGJ5IHRoZSBjcmVkZW50aWFsIGNvbW1hbmRzLiBgLS12ZXJpZnktc3NsYFxuICogZGVmYXVsdHMgdG8gb247IG9ubHkgYW4gZXhwbGljaXQgYC0tbm8tdmVyaWZ5LXNzbGAgcmVsYXhlcyBpdCAoYW5kIG9ubHlcbiAqIG91dHNpZGUgcHJvZHVjdGlvbiwgZW5mb3JjZWQgYnkge0BsaW5rIGFzc2VydENyZWRlbnRpYWxUbHNBbGxvd2VkfSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVkZW50aWFsSHR0cHNBZ2VudCh2ZXJpZnlTc2w6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBodHRwcy5BZ2VudCB7XG4gIHJldHVybiBuZXcgaHR0cHMuQWdlbnQoeyByZWplY3RVbmF1dGhvcml6ZWQ6IHZlcmlmeVNzbCA/PyB0cnVlIH0pO1xufVxuXG4vKipcbiAqIFBPU1QgL2FwaS9hdXRoL2xvZ2luIGFuZCByZXR1cm4gdGhlIGFjY2VzcyB0b2tlbiAob3IgYHVuZGVmaW5lZGAgaWYgdGhlXG4gKiByZXNwb25zZSBjYXJyaWVkIG5vbmUpLiBSYXRlLWxpbWl0IGFjY291bnRpbmcgKHJlY29yZCBzdWNjZXNzL2ZhaWx1cmUpIGFuZFxuICogdGhlIG5vLXRva2VuIGV4aXQgYXJlIGludGVudGlvbmFsbHkgbGVmdCB0byB0aGUgY2FsbGVyIHNvIGVhY2ggY29tbWFuZCBrZWVwc1xuICogaXRzIGV4YWN0IGxvY2tvdXQgc2VtYW50aWNzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9zdExvZ2luKHBhcmFtczoge1xuICB1cmw6IHN0cmluZztcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICBodHRwc0FnZW50OiBodHRwcy5BZ2VudDtcbiAgdGltZW91dDogbnVtYmVyO1xufSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGxvZ2luVXJsID0gYCR7cGFyYW1zLnVybH0vYXBpL2F1dGgvbG9naW5gO1xuICBwcmludERlYnVnKCdQT1NUJywgeyB1cmw6IGxvZ2luVXJsIH0pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3Q8QXV0aFJlc3BvbnNlPihcbiAgICBsb2dpblVybCxcbiAgICB7IGlkZW50aWZpZXI6IHBhcmFtcy5pZGVudGlmaWVyLCBwYXNzd29yZDogcGFyYW1zLnBhc3N3b3JkIH0sXG4gICAgeyBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgaHR0cHNBZ2VudDogcGFyYW1zLmh0dHBzQWdlbnQsIHRpbWVvdXQ6IHBhcmFtcy50aW1lb3V0IH0sXG4gICk7XG4gIHJldHVybiByZXNwb25zZS5kYXRhPy5kYXRhPy5hY2Nlc3NUb2tlbjtcbn1cblxuLyoqXG4gKiBQT1NUIC9hcGkvYXV0aC9zd2l0Y2gtb3JnIHdpdGggdGhlIGN1cnJlbnQgYWNjZXNzIHRva2VuIGFuZCByZXR1cm4gdGhlIG5ldyxcbiAqIG9yZy1zY29wZWQgYWNjZXNzIHRva2VuLiBQcmludHMgYSBzdWNjZXNzIGxpbmUgKHVubGVzcyBgcXVpZXRgKSBhbmQgaGFyZC1leGl0c1xuICogb24gYSBtaXNzaW5nIHRva2VuIOKAlCBib3RoIGNyZWRlbnRpYWwgY29tbWFuZHMgdHJlYXQgYSBmYWlsZWQgc3dpdGNoIHRoZSBzYW1lLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3dpdGNoT3JnYW5pemF0aW9uKHBhcmFtczoge1xuICB1cmw6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgaHR0cHNBZ2VudDogaHR0cHMuQWdlbnQ7XG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAgcXVpZXQ6IGJvb2xlYW47XG59KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3dpdGNoVXJsID0gYCR7cGFyYW1zLnVybH0vYXBpL2F1dGgvc3dpdGNoLW9yZ2A7XG4gIHByaW50RGVidWcoJ1BPU1QnLCB7IHVybDogc3dpdGNoVXJsIH0pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3Q8QXV0aFJlc3BvbnNlPihcbiAgICBzd2l0Y2hVcmwsXG4gICAgeyBvcmdhbml6YXRpb25JZDogcGFyYW1zLm9yZ0lkIH0sXG4gICAge1xuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtwYXJhbXMuYWNjZXNzVG9rZW59YCB9LFxuICAgICAgaHR0cHNBZ2VudDogcGFyYW1zLmh0dHBzQWdlbnQsXG4gICAgICB0aW1lb3V0OiBwYXJhbXMudGltZW91dCxcbiAgICB9LFxuICApO1xuICBjb25zdCBzd2l0Y2hlZCA9IHJlc3BvbnNlLmRhdGE/LmRhdGE/LmFjY2Vzc1Rva2VuO1xuICBpZiAoIXN3aXRjaGVkKSB7XG4gICAgcHJpbnRFcnJvcignT3JnYW5pemF0aW9uIHN3aXRjaCBmYWlsZWQ6IG5vIGFjY2VzcyB0b2tlbiBpbiByZXNwb25zZScpO1xuICAgIHByb2Nlc3MuZXhpdChFUlJPUl9DT0RFUy5BVVRIRU5USUNBVElPTik7XG4gIH1cbiAgaWYgKCFwYXJhbXMucXVpZXQpIHByaW50U3VjY2VzcyhgU3dpdGNoZWQgdG8gb3JnYW5pemF0aW9uICR7cGFyYW1zLm9yZ0lkfWApO1xuICByZXR1cm4gc3dpdGNoZWQ7XG59XG4iXX0=
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9hdXRoLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQWtCM0M7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxTQUE4QjtJQUN2RSxJQUFJLFNBQVMsS0FBSyxLQUFLLElBQUksZUFBZSxFQUFFLEVBQUUsQ0FBQztRQUM3QyxVQUFVLENBQUMsNk5BQTZOLENBQUMsQ0FBQztRQUMxTyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMzQyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsU0FBOEI7SUFDakUsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BT3hDO0lBQ0MsTUFBTSxTQUFTLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxzQkFBc0IsQ0FBQztJQUN0RCxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUMvQixTQUFTLEVBQ1QsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUNoQztRQUNFLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxrQkFBa0I7WUFDbEMsZUFBZSxFQUFFLFVBQVUsTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUMvQywrREFBK0Q7WUFDL0QsYUFBYSxFQUFFLEtBQUs7U0FDckI7UUFDRCxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDN0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO0tBQ3hCLENBQ0YsQ0FBQztJQUNGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDM0IsVUFBVSxDQUFDLHlEQUF5RCxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztRQUFFLFlBQVksQ0FBQyw0QkFBNEIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUUsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IEVSUk9SX0NPREVTIH0gZnJvbSAnLi9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50RGVidWcsIHByaW50RXJyb3IsIHByaW50U3VjY2VzcyB9IGZyb20gJy4vb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGlzUHJvZHVjdGlvbkVudiB9IGZyb20gJy4vdGxzLmpzJztcblxuLyoqXG4gKiBTZXNzaW9uIHBheWxvYWQgYXMgYSBOT04tQlJPV1NFUiBjbGllbnQgcmVjZWl2ZXMgaXQ6IHRoZSByZWZyZXNoIHRva2VuIHJpZGVzXG4gKiBpbiB0aGUgYm9keSAodGhlIGJyb3dzZXIncyBnb2VzIG91dCBhcyBhbiBIdHRwT25seSBjb29raWUgaW5zdGVhZCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblRva2VucyB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZztcbiAgZXhwaXJlc0luPzogbnVtYmVyO1xufVxuXG4vKiogRW52ZWxvcGUgZXZlcnkgcGxhdGZvcm0gYXV0aCBlbmRwb2ludCB3cmFwcyBpdHMgc2Vzc2lvbiB0b2tlbnMgaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGRhdGE6IFNlc3Npb25Ub2tlbnM7XG59XG5cbi8qKlxuICogR3VhcmQgdGhlIGNyZWRlbnRpYWwtdHJhbnNtaXR0aW5nIGNvbW1hbmRzIChgbG9naW5gLCBgcGF0YCkgYWdhaW5zdCBkaXNhYmxpbmdcbiAqIFRMUyB2ZXJpZmljYXRpb24gaW4gcHJvZHVjdGlvbi4gVGhlIGRldmljZSBmbG93IGtlZXBzIHBhc3N3b3JkcyBvZmYgdGhlIHdpcmVcbiAqIGVudGlyZWx5LCBidXQgdGhlIHNlc3Npb24gdG9rZW5zIGl0IHJldHVybnMgYXJlIGJlYXJlciBjcmVkZW50aWFscyDigJQgYSBNSVRNIG9uXG4gKiBhIGBwcm9kICsgLS1uby12ZXJpZnktc3NsYCBydW4gd291bGQgaGFydmVzdCB0aGVtIGp1c3QgdGhlIHNhbWUuXG4gKlxuICogVW5saWtlIHtAbGluayBhc3NlcnRTc2xEaXNhYmxlQWxsb3dlZH0gKHdoaWNoIHRocm93cyDigJQgZm9yIHBhdGhzIGFscmVhZHkgaW5zaWRlXG4gKiBhIHRyeS9jYXRjaCksIHRoaXMgcHJpbnRzIGFuZCBoYXJkLWV4aXRzLCBtYXRjaGluZyB0aGUgcHJlLWZsaWdodCBjaGVja3MgdGhlc2VcbiAqIGNvbW1hbmRzIHJ1biBiZWZvcmUgdGhlaXIgdHJ5IGJsb2NrLiBJbiBub24tcHJvZHVjdGlvbiBpdCBpcyBhIG5vLW9wLCBzb1xuICogYC0tbm8tdmVyaWZ5LXNzbGAgc3RpbGwgd29ya3MgYWdhaW5zdCBzZWxmLXNpZ25lZCBkZXYgcGxhdGZvcm1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q3JlZGVudGlhbFRsc0FsbG93ZWQodmVyaWZ5U3NsOiBib29sZWFuIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICh2ZXJpZnlTc2wgPT09IGZhbHNlICYmIGlzUHJvZHVjdGlvbkVudigpKSB7XG4gICAgcHJpbnRFcnJvcignUmVmdXNpbmcgdG8gZGlzYWJsZSBUTFMgdmVyaWZpY2F0aW9uIGluIHByb2R1Y3Rpb24gKE5PREVfRU5WPXByb2R1Y3Rpb24pIOKAlCBjcmVkZW50aWFscyBtdXN0IG5vdCBiZSB0cmFuc21pdHRlZCBvdmVyIGFuIHVudmVyaWZpZWQgY29ubmVjdGlvbi4gVXNlIGEgdmFsaWQgY2VydGlmaWNhdGUsIG9yIHVuc2V0IE5PREVfRU5WIGZvciBsb2NhbC9zZWxmLXNpZ25lZCBkZXZlbG9wbWVudC4nKTtcbiAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuQVVUSEVOVElDQVRJT04pO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGh0dHBzIGFnZW50IHVzZWQgYnkgdGhlIGNyZWRlbnRpYWwgY29tbWFuZHMuIGAtLXZlcmlmeS1zc2xgXG4gKiBkZWZhdWx0cyB0byBvbjsgb25seSBhbiBleHBsaWNpdCBgLS1uby12ZXJpZnktc3NsYCByZWxheGVzIGl0IChhbmQgb25seVxuICogb3V0c2lkZSBwcm9kdWN0aW9uLCBlbmZvcmNlZCBieSB7QGxpbmsgYXNzZXJ0Q3JlZGVudGlhbFRsc0FsbG93ZWR9KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWRlbnRpYWxIdHRwc0FnZW50KHZlcmlmeVNzbDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGh0dHBzLkFnZW50IHtcbiAgcmV0dXJuIG5ldyBodHRwcy5BZ2VudCh7IHJlamVjdFVuYXV0aG9yaXplZDogdmVyaWZ5U3NsID8/IHRydWUgfSk7XG59XG5cbi8qKlxuICogUE9TVCAvYXBpL2F1dGgvc3dpdGNoLW9yZyB3aXRoIHRoZSBjdXJyZW50IGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJuIHRoZSBXSE9MRVxuICogcmUtaXNzdWVkIHNlc3Npb24uXG4gKlxuICogVGhlIHN3aXRjaCByZS1pc3N1ZXMgdGhlIHNhbWUgc2Vzc2lvbiBzbG90LCB3aGljaCBST1RBVEVTIGl0cyByZWZyZXNoIHRva2VuIOKAlFxuICogc28gYSBjYWxsZXIgdGhhdCBrZWVwcyBvbmx5IHRoZSBhY2Nlc3MgdG9rZW4gaXMgbGVmdCBob2xkaW5nIGEgZGVhZCByZWZyZXNoXG4gKiB0b2tlbi4gUHJpbnRzIGEgc3VjY2VzcyBsaW5lICh1bmxlc3MgYHF1aWV0YCkgYW5kIGhhcmQtZXhpdHMgb24gYSBtaXNzaW5nXG4gKiB0b2tlbiwgc2luY2UgYm90aCBjcmVkZW50aWFsIGNvbW1hbmRzIHRyZWF0IGEgZmFpbGVkIHN3aXRjaCB0aGUgc2FtZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN3aXRjaE9yZ2FuaXphdGlvbihwYXJhbXM6IHtcbiAgdXJsOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIGh0dHBzQWdlbnQ6IGh0dHBzLkFnZW50O1xuICB0aW1lb3V0OiBudW1iZXI7XG4gIHF1aWV0OiBib29sZWFuO1xufSk6IFByb21pc2U8U2Vzc2lvblRva2Vucz4ge1xuICBjb25zdCBzd2l0Y2hVcmwgPSBgJHtwYXJhbXMudXJsfS9hcGkvYXV0aC9zd2l0Y2gtb3JnYDtcbiAgcHJpbnREZWJ1ZygnUE9TVCcsIHsgdXJsOiBzd2l0Y2hVcmwgfSk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdDxBdXRoUmVzcG9uc2U+KFxuICAgIHN3aXRjaFVybCxcbiAgICB7IG9yZ2FuaXphdGlvbklkOiBwYXJhbXMub3JnSWQgfSxcbiAgICB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3BhcmFtcy5hY2Nlc3NUb2tlbn1gLFxuICAgICAgICAvLyBEZWNsYXJlcyB0aGUgYm9keSB0cmFuc3BvcnQgZm9yIHRoZSByZS1pc3N1ZWQgcmVmcmVzaCB0b2tlbi5cbiAgICAgICAgJ1gtUGItQ2xpZW50JzogJ2NsaScsXG4gICAgICB9LFxuICAgICAgaHR0cHNBZ2VudDogcGFyYW1zLmh0dHBzQWdlbnQsXG4gICAgICB0aW1lb3V0OiBwYXJhbXMudGltZW91dCxcbiAgICB9LFxuICApO1xuICBjb25zdCBzd2l0Y2hlZCA9IHJlc3BvbnNlLmRhdGE/LmRhdGE7XG4gIGlmICghc3dpdGNoZWQ/LmFjY2Vzc1Rva2VuKSB7XG4gICAgcHJpbnRFcnJvcignT3JnYW5pemF0aW9uIHN3aXRjaCBmYWlsZWQ6IG5vIGFjY2VzcyB0b2tlbiBpbiByZXNwb25zZScpO1xuICAgIHByb2Nlc3MuZXhpdChFUlJPUl9DT0RFUy5BVVRIRU5USUNBVElPTik7XG4gIH1cbiAgaWYgKCFwYXJhbXMucXVpZXQpIHByaW50U3VjY2VzcyhgU3dpdGNoZWQgdG8gb3JnYW5pemF0aW9uICR7cGFyYW1zLm9yZ0lkfWApO1xuICByZXR1cm4gc3dpdGNoZWQ7XG59XG4iXX0=
@@ -32,12 +32,13 @@ export declare function printExecutionSummary(executionId: string, duration: num
32
32
  */
33
33
  export declare function printSslWarning(verifySsl?: boolean): void;
34
34
  /**
35
- * Resolve a platform auth token using two methods (in priority order):
35
+ * Resolve a platform credential using three methods (in priority order):
36
36
  *
37
- * 1. PLATFORM_TOKEN env var
38
- * 2. --store-tokens flag → fetch credentials from AWS Secrets Manager, then authenticate
37
+ * 1. PLATFORM_TOKEN env var (a JWT, or an opaque `pb_pat_…`/`pb_sa_…` key)
38
+ * 2. the session `auth login` stored for this platform (renewed if it has expired)
39
+ * 3. --store-tokens flag → the service-account key in AWS Secrets Manager
39
40
  *
40
- * @returns JWT token string
41
+ * @returns the bearer credential string
41
42
  */
42
43
  export declare function resolveToken(options: {
43
44
  storeTokens?: boolean;
@@ -48,9 +49,10 @@ export declare function resolveToken(options: {
48
49
  /**
49
50
  * Initialize and return an authenticated API client.
50
51
  *
51
- * Supports two auth methods:
52
+ * Supports three auth methods:
52
53
  * 1. PLATFORM_TOKEN env var
53
- * 2. --store-tokens + PLATFORM_SECRET_NAME env var → fetch token from Secrets Manager
54
+ * 2. the stored `auth login` session for this platform (renewed on expiry)
55
+ * 3. --store-tokens + PLATFORM_SECRET_NAME env var → fetch token from Secrets Manager
54
56
  */
55
57
  export declare function createAuthenticatedClientAsync(options: {
56
58
  storeTokens?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"command-utils.d.ts","sourceRoot":"","sources":["../../src/utils/command-utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAQvG;AAED;;mFAEmF;AACnF,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAI3D;AAED;;gCAEgC;AAChC,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAE7D;AAED;;8EAE8E;AAC9E,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOjF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAKzD;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmClB;AAED;;;;;;GAMG;AACH,wBAAsB,8BAA8B,CAAC,OAAO,EAAE;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,SAAS,CAAC,CAQrB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAYrF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAiBnF"}
1
+ {"version":3,"file":"command-utils.d.ts","sourceRoot":"","sources":["../../src/utils/command-utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAS5C;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAQvG;AAED;;mFAEmF;AACnF,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAI3D;AAED;;gCAEgC;AAChC,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAE7D;AAED;;8EAE8E;AAC9E,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOjF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAKzD;AAmCD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDlB;AAED;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAAC,OAAO,EAAE;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,SAAS,CAAC,CAQrB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAYrF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAiBnF"}
@@ -1,10 +1,12 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import axios from 'axios';
3
4
  import {} from 'commander';
4
5
  import pico from 'picocolors';
5
6
  import { ApiClient } from './api-client.js';
6
7
  import { getSecretValue } from './aws-secrets.js';
7
- import { getConfigWithOptions } from './config-loader.js';
8
+ import { getApiConfig, getConfigWithOptions } from './config-loader.js';
9
+ import { clearSession, isSessionUsable, loadSession, saveSession } from './credential-store.js';
8
10
  import { printError, printInfo, printKeyValue, printSection, printSuccess, printWarning } from './output-utils.js';
9
11
  import { formatDuration, generateExecutionId } from '../config/cli.constants.js';
10
12
  const { bold, cyan, green, magenta } = pico;
@@ -66,12 +68,44 @@ export function printSslWarning(verifySsl) {
66
68
  }
67
69
  }
68
70
  /**
69
- * Resolve a platform auth token using two methods (in priority order):
71
+ * Renew a stored session with its refresh token, persist the rotated pair, and
72
+ * return the new access token. Returns undefined (and forgets the session) when
73
+ * the platform refuses it — a rotated-away or revoked token is dead, and keeping
74
+ * it would make every later command fail the same way.
70
75
  *
71
- * 1. PLATFORM_TOKEN env var
72
- * 2. --store-tokens flag → fetch credentials from AWS Secrets Manager, then authenticate
76
+ * `X-Pb-Client` is mandatory on /auth/refresh (the CSRF gate) and its value also
77
+ * picks the transport: anything but `web` keeps the body flow the CLI uses.
78
+ */
79
+ async function refreshStoredSession(baseUrl, session) {
80
+ if (!session.refreshToken)
81
+ return undefined;
82
+ try {
83
+ const response = await axios.post(`${baseUrl}/api/auth/refresh`, { refreshToken: session.refreshToken }, { headers: { 'Content-Type': 'application/json', 'X-Pb-Client': 'cli' }, timeout: 30_000 });
84
+ const renewed = response.data?.data;
85
+ if (!renewed?.accessToken)
86
+ return undefined;
87
+ saveSession(baseUrl, {
88
+ accessToken: renewed.accessToken,
89
+ ...(renewed.refreshToken ? { refreshToken: renewed.refreshToken } : {}),
90
+ expiresAt: Date.now() + (renewed.expiresIn ?? 900) * 1000,
91
+ ...(session.organizationId ? { organizationId: session.organizationId } : {}),
92
+ });
93
+ return renewed.accessToken;
94
+ }
95
+ catch {
96
+ clearSession(baseUrl);
97
+ printWarning('The stored session could not be renewed — run "pipeline-manager auth login" again');
98
+ return undefined;
99
+ }
100
+ }
101
+ /**
102
+ * Resolve a platform credential using three methods (in priority order):
103
+ *
104
+ * 1. PLATFORM_TOKEN env var (a JWT, or an opaque `pb_pat_…`/`pb_sa_…` key)
105
+ * 2. the session `auth login` stored for this platform (renewed if it has expired)
106
+ * 3. --store-tokens flag → the service-account key in AWS Secrets Manager
73
107
  *
74
- * @returns JWT token string
108
+ * @returns the bearer credential string
75
109
  */
76
110
  export async function resolveToken(options) {
77
111
  // Path 1: PLATFORM_TOKEN env var
@@ -79,7 +113,25 @@ export async function resolveToken(options) {
79
113
  printInfo('Using PLATFORM_TOKEN from environment');
80
114
  return process.env.PLATFORM_TOKEN;
81
115
  }
82
- // Path 2: --store-tokens → read PLATFORM_SECRET_NAME from Secrets Manager
116
+ // Path 2: the stored browser sign-in. Skipped entirely when --store-tokens
117
+ // names a machine credential, so an operator's laptop session can never be
118
+ // used where the automation credential was asked for.
119
+ if (!options.storeTokens) {
120
+ const baseUrl = getApiConfig().api.baseUrl;
121
+ const stored = loadSession(baseUrl);
122
+ if (isSessionUsable(stored)) {
123
+ printInfo('Using the stored session from "auth login"');
124
+ return stored.accessToken;
125
+ }
126
+ if (stored) {
127
+ const renewed = await refreshStoredSession(baseUrl, stored);
128
+ if (renewed) {
129
+ printInfo('Renewed the stored session from "auth login"');
130
+ return renewed;
131
+ }
132
+ }
133
+ }
134
+ // Path 3: --store-tokens → read PLATFORM_SECRET_NAME from Secrets Manager
83
135
  if (options.storeTokens) {
84
136
  const secretName = process.env.PLATFORM_SECRET_NAME;
85
137
  if (!secretName) {
@@ -89,24 +141,28 @@ export async function resolveToken(options) {
89
141
  const secretJson = await getSecretValue(secretName, { region: options.region, profile: options.profile });
90
142
  const secret = JSON.parse(secretJson);
91
143
  printSuccess('Secret retrieved from Secrets Manager');
92
- // store-token writes the JWT to the `password` field (schema: { username: orgId,
93
- // password: JWT } — satisfies CodeBuild's secretsManagerCredentials), not `accessToken`.
144
+ // store-token writes the service-account KEY to the `password` field (schema:
145
+ // { username: orgId, password: pb_sa_… } — satisfies CodeBuild's
146
+ // secretsManagerCredentials), not `accessToken`. The key is presented as a
147
+ // bearer credential and exchanged server-side, so nothing here decodes it.
94
148
  if (!secret.password) {
95
- throw new Error('Secret missing password (JWT) — run "pipeline-manager infra store-token" to generate');
149
+ throw new Error('Secret missing password (service-account key) — run "pipeline-manager infra store-token" to provision one');
96
150
  }
97
- printInfo('Using stored JWT token');
151
+ printInfo('Using the stored service-account key');
98
152
  return secret.password;
99
153
  }
100
154
  throw new Error('Authentication required. Use one of:\n' +
101
- ' - Set PLATFORM_TOKEN environment variable\n' +
155
+ ' - Run "pipeline-manager auth login" (browser sign-in, stored for this platform)\n' +
156
+ ' - Set PLATFORM_TOKEN to an access key from "pipeline-manager auth pat"\n' +
102
157
  ' - Pass --store-tokens with PLATFORM_SECRET_NAME env var');
103
158
  }
104
159
  /**
105
160
  * Initialize and return an authenticated API client.
106
161
  *
107
- * Supports two auth methods:
162
+ * Supports three auth methods:
108
163
  * 1. PLATFORM_TOKEN env var
109
- * 2. --store-tokens + PLATFORM_SECRET_NAME env var → fetch token from Secrets Manager
164
+ * 2. the stored `auth login` session for this platform (renewed on expiry)
165
+ * 3. --store-tokens + PLATFORM_SECRET_NAME env var → fetch token from Secrets Manager
110
166
  */
111
167
  export async function createAuthenticatedClientAsync(options) {
112
168
  // Resolve token and set it in env so ApiClient/getConfig can find it
@@ -125,7 +181,7 @@ export function createAuthenticatedClient(options) {
125
181
  printInfo('Initializing API client', { baseUrl: config.api.baseUrl });
126
182
  const client = new ApiClient(config);
127
183
  if (!client.isAuthenticated()) {
128
- printError('Not authenticated', { hint: 'Set PLATFORM_TOKEN or use --store-tokens' });
184
+ printError('Not authenticated', { hint: 'Run "pipeline-manager auth login", set PLATFORM_TOKEN, or use --store-tokens' });
129
185
  throw new Error('Authentication required');
130
186
  }
131
187
  printSuccess('API client initialized');
@@ -152,4 +208,4 @@ export function validateEntityId(id, entityName) {
152
208
  }
153
209
  return trimmed;
154
210
  }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jb21tYW5kLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFnQixNQUFNLFdBQVcsQ0FBQztBQUN6QyxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQWUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuSCxPQUFPLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakYsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztBQUU1Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxRQUFpQixFQUFFLElBQTBCO0lBQzdGLE1BQU0sV0FBVyxHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDMUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNqQixZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLFdBQVcsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzttRkFFbUY7QUFDbkYsTUFBTSxVQUFVLGNBQWMsQ0FBb0IsR0FBTTtJQUN0RCxPQUFPLEdBQUc7U0FDUCxNQUFNLENBQUMsY0FBYyxFQUFFLHFDQUFxQyxDQUFDO1NBQzdELE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxzQ0FBc0MsQ0FBTSxDQUFDO0FBQzVFLENBQUM7QUFFRDs7Z0NBRWdDO0FBQ2hDLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBb0IsR0FBTTtJQUN4RCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsc0VBQXNFLENBQU0sQ0FBQztBQUN0SCxDQUFDO0FBRUQ7OzhFQUU4RTtBQUM5RSxNQUFNLFVBQVUsaUJBQWlCLENBQW9CLEdBQU07SUFDekQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLGlFQUFpRSxDQUFNLENBQUM7QUFDbkgsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFdBQW1CLEVBQUUsUUFBZ0I7SUFDekUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixhQUFhLENBQUM7UUFDWixjQUFjLEVBQUUsV0FBVztRQUMzQixVQUFVLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQztRQUNwQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQztLQUM3QixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFNBQW1CO0lBQ2pELElBQUksU0FBUyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3hCLFlBQVksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsT0FLbEM7SUFDQyxpQ0FBaUM7SUFDakMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQy9CLFNBQVMsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7SUFDcEMsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUVELFNBQVMsQ0FBQyxzQ0FBc0MsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRTFFLE1BQU0sVUFBVSxHQUFHLE1BQU0sY0FBYyxDQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMxRyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBMkIsQ0FBQztRQUNoRSxZQUFZLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUV0RCxpRkFBaUY7UUFDakYseUZBQXlGO1FBQ3pGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRkFBc0YsQ0FBQyxDQUFDO1FBQzFHLENBQUM7UUFFRCxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNwQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQ2Isd0NBQXdDO1FBQ3hDLCtDQUErQztRQUMvQywyREFBMkQsQ0FDNUQsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDhCQUE4QixDQUFDLE9BS3BEO0lBQ0MscUVBQXFFO0lBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBRUQsT0FBTyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLE9BQWdDO0lBQ3hFLE1BQU0sTUFBTSxHQUFXLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELFNBQVMsQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1FBQzlCLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSwwQ0FBMEMsRUFBRSxDQUFDLENBQUM7UUFDdEYsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUN2QyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsRUFBc0IsRUFBRSxVQUFrQjtJQUN6RSxJQUFJLENBQUMsRUFBRSxJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVELFVBQVUsQ0FBQyxXQUFXLFVBQVUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFVBQVUsZ0NBQWdDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBRTFCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNuRCxZQUFZLENBQUMsR0FBRyxVQUFVLDJCQUEyQixFQUFFO1lBQ3JELFFBQVEsRUFBRSxPQUFPO1lBQ2pCLGNBQWMsRUFBRSw4Q0FBOEM7WUFDOUQsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHR5cGUgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBnZXRTZWNyZXRWYWx1ZSB9IGZyb20gJy4vYXdzLXNlY3JldHMuanMnO1xuaW1wb3J0IHsgdHlwZSBDb25maWcsIGdldENvbmZpZ1dpdGhPcHRpb25zIH0gZnJvbSAnLi9jb25maWctbG9hZGVyLmpzJztcbmltcG9ydCB7IHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4vb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uLCBnZW5lcmF0ZUV4ZWN1dGlvbklkIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuXG5jb25zdCB7IGJvbGQsIGN5YW4sIGdyZWVuLCBtYWdlbnRhIH0gPSBwaWNvO1xuXG4vKipcbiAqIFByaW50IGNvbW1hbmQgaGVhZGVyIHdpdGggc2VjdGlvbiB0aXRsZSBhbmQgZXhlY3V0aW9uIElELlxuICogUmV0dXJucyB0aGUgZXhlY3V0aW9uIElEIGZvciB1c2UgaW4gZXJyb3IgaGFuZGxlcnMgYW5kIHN1bW1hcmllcy5cbiAqXG4gKiBQYXNzIGB7IHF1aWV0OiB0cnVlIH1gIHRvIHN1cHByZXNzIHRoZSBkZWNvcmF0aXZlIG91dHB1dCB3aGlsZSBzdGlsbCBnZXR0aW5nIHRoZVxuICogaWQg4oCUIHVzZWQgYm90aCBieSBgLS1xdWlldGAgY2FsbGVycyBhbmQgYnkgYC0tanNvbmAgY29tbWFuZHMgKHNvIHRoZSBiYW5uZXJcbiAqIGRvZXNuJ3QgbGFuZCBvbiBzdGRvdXQgYWhlYWQgb2YgdGhlIEpTT04gcGF5bG9hZCBhbmQgYnJlYWsgYOKApiAtLWpzb24gfCBqcWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRDb21tYW5kSGVhZGVyKHRpdGxlOiBzdHJpbmcsIHN1YnRpdGxlPzogc3RyaW5nLCBvcHRzPzogeyBxdWlldD86IGJvb2xlYW4gfSk6IHN0cmluZyB7XG4gIGNvbnN0IGV4ZWN1dGlvbklkID0gZ2VuZXJhdGVFeGVjdXRpb25JZCgpO1xuICBpZiAoIW9wdHM/LnF1aWV0KSB7XG4gICAgcHJpbnRTZWN0aW9uKHRpdGxlKTtcbiAgICBjb25zb2xlLmxvZyhgJHttYWdlbnRhKGBbRVhFLSR7ZXhlY3V0aW9uSWR9XWApfSAke2N5YW4oYm9sZChzdWJ0aXRsZSB8fCB0aXRsZSkpfWApO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxuICByZXR1cm4gZXhlY3V0aW9uSWQ7XG59XG5cbi8qKiBBdHRhY2ggdGhlIHN0YW5kYXJkIGAtLXZlcmlmeS1zc2xgIC8gYC0tbm8tdmVyaWZ5LXNzbGAgcGFpci4gVGhlIHR3byB0b2dldGhlclxuICogIGdpdmUgQ29tbWFuZGVyIGFuIGV4cGxpY2l0IHRyaS1zdGF0ZSBgb3B0aW9ucy52ZXJpZnlTc2xgICh0cnVlL2ZhbHNlL3VuZGVmaW5lZCkuXG4gKiAgUmV0dXJucyB0aGUgY29tbWFuZCBzbyBpdCBjb21wb3NlczogYHdpdGhTc2xPcHRpb25zKHByb2dyYW0uY29tbWFuZCgneCcpKeKApmAuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNzbE9wdGlvbnM8VCBleHRlbmRzIENvbW1hbmQ+KGNtZDogVCk6IFQge1xuICByZXR1cm4gY21kXG4gICAgLm9wdGlvbignLS12ZXJpZnktc3NsJywgJ0VuYWJsZSBTU0wgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uJylcbiAgICAub3B0aW9uKCctLW5vLXZlcmlmeS1zc2wnLCAnRGlzYWJsZSBTU0wgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uJykgYXMgVDtcbn1cblxuLyoqIEF0dGFjaCB0aGUgc3RhbmRhcmQgYC0tcmVnaW9uIDxyZWdpb24+YCBvcHRpb24gKG9uZSBjYW5vbmljYWwgZGVzY3JpcHRpb24pLlxuICogIFJlZ2lvbiByZXNvbHV0aW9uIChmbGFnIOKGkiBBV1NfUkVHSU9OIOKGkiBDREtfREVGQVVMVF9SRUdJT04g4oaSIHVzLWVhc3QtMSkgbGl2ZXMgaW5cbiAqICBhd3MtZW52LnJlc29sdmVBd3NSZWdpb24uICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlZ2lvbk9wdGlvbjxUIGV4dGVuZHMgQ29tbWFuZD4oY21kOiBUKTogVCB7XG4gIHJldHVybiBjbWQub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uIChkZWZhdWx0cyB0byBBV1NfUkVHSU9OIC8gQ0RLX0RFRkFVTFRfUkVHSU9OIC8gdXMtZWFzdC0xKScpIGFzIFQ7XG59XG5cbi8qKiBBdHRhY2ggdGhlIHN0YW5kYXJkIGAtLXByb2ZpbGUgPHByb2ZpbGU+YCBvcHRpb24gKG9uZSBjYW5vbmljYWwgZGVzY3JpcHRpb24pLlxuICogIE5vIGRlZmF1bHQgaXMgcGlubmVkIHNvIHRoZSBBV1MgZGVmYXVsdCBjcmVkZW50aWFsIGNoYWluIChlbnYgdmFycywgU1NPLCByb2xlcylcbiAqICB3b3JrcyBvdXQgb2YgdGhlIGJveDsgLS1wcm9maWxlIG9ubHkgc2VsZWN0cyBhIHNoYXJlZCBwcm9maWxlIHdoZW4gc2V0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhQcm9maWxlT3B0aW9uPFQgZXh0ZW5kcyBDb21tYW5kPihjbWQ6IFQpOiBUIHtcbiAgcmV0dXJuIGNtZC5vcHRpb24oJy0tcHJvZmlsZSA8cHJvZmlsZT4nLCAnQVdTIENMSSBwcm9maWxlIChkZWZhdWx0cyB0byB0aGUgc3RhbmRhcmQgQVdTIGNyZWRlbnRpYWwgY2hhaW4pJykgYXMgVDtcbn1cblxuLyoqXG4gKiBQcmludCBleGVjdXRpb24gc3VtbWFyeSB3aXRoIElELCBkdXJhdGlvbiwgYW5kIHN0YXR1cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50RXhlY3V0aW9uU3VtbWFyeShleGVjdXRpb25JZDogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgJ0V4ZWN1dGlvbiBJRCc6IGV4ZWN1dGlvbklkLFxuICAgICdEdXJhdGlvbic6IGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAnU3RhdHVzJzogZ3JlZW4oJ+KckyBTdWNjZXNzJyksXG4gIH0pO1xufVxuXG4vKipcbiAqIFdhcm4gaWYgU1NMIHZlcmlmaWNhdGlvbiBpcyBkaXNhYmxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3NsV2FybmluZyh2ZXJpZnlTc2w/OiBib29sZWFuKTogdm9pZCB7XG4gIGlmICh2ZXJpZnlTc2wgPT09IGZhbHNlKSB7XG4gICAgcHJpbnRXYXJuaW5nKCdTU0wgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGlzIERJU0FCTEVEJyk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHBsYXRmb3JtIGF1dGggdG9rZW4gdXNpbmcgdHdvIG1ldGhvZHMgKGluIHByaW9yaXR5IG9yZGVyKTpcbiAqXG4gKiAxLiBQTEFURk9STV9UT0tFTiBlbnYgdmFyXG4gKiAyLiAtLXN0b3JlLXRva2VucyBmbGFnIOKGkiBmZXRjaCBjcmVkZW50aWFscyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIsIHRoZW4gYXV0aGVudGljYXRlXG4gKlxuICogQHJldHVybnMgSldUIHRva2VuIHN0cmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRva2VuKG9wdGlvbnM6IHtcbiAgc3RvcmVUb2tlbnM/OiBib29sZWFuO1xuICB2ZXJpZnlTc2w/OiBib29sZWFuO1xuICByZWdpb24/OiBzdHJpbmc7XG4gIHByb2ZpbGU/OiBzdHJpbmc7XG59KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gUGF0aCAxOiBQTEFURk9STV9UT0tFTiBlbnYgdmFyXG4gIGlmIChwcm9jZXNzLmVudi5QTEFURk9STV9UT0tFTikge1xuICAgIHByaW50SW5mbygnVXNpbmcgUExBVEZPUk1fVE9LRU4gZnJvbSBlbnZpcm9ubWVudCcpO1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5QTEFURk9STV9UT0tFTjtcbiAgfVxuXG4gIC8vIFBhdGggMjogLS1zdG9yZS10b2tlbnMg4oaSIHJlYWQgUExBVEZPUk1fU0VDUkVUX05BTUUgZnJvbSBTZWNyZXRzIE1hbmFnZXJcbiAgaWYgKG9wdGlvbnMuc3RvcmVUb2tlbnMpIHtcbiAgICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gICAgaWYgKCFzZWNyZXROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BMQVRGT1JNX1NFQ1JFVF9OQU1FIGVudiB2YXIgaXMgcmVxdWlyZWQgd2l0aCAtLXN0b3JlLXRva2VucycpO1xuICAgIH1cblxuICAgIHByaW50SW5mbygnRmV0Y2hpbmcgc2VjcmV0IGZyb20gU2VjcmV0cyBNYW5hZ2VyJywgeyBzZWNyZXQ6IHNlY3JldE5hbWUgfSk7XG5cbiAgICBjb25zdCBzZWNyZXRKc29uID0gYXdhaXQgZ2V0U2VjcmV0VmFsdWUoc2VjcmV0TmFtZSwgeyByZWdpb246IG9wdGlvbnMucmVnaW9uLCBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUgfSk7XG4gICAgY29uc3Qgc2VjcmV0ID0gSlNPTi5wYXJzZShzZWNyZXRKc29uKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHByaW50U3VjY2VzcygnU2VjcmV0IHJldHJpZXZlZCBmcm9tIFNlY3JldHMgTWFuYWdlcicpO1xuXG4gICAgLy8gc3RvcmUtdG9rZW4gd3JpdGVzIHRoZSBKV1QgdG8gdGhlIGBwYXNzd29yZGAgZmllbGQgKHNjaGVtYTogeyB1c2VybmFtZTogb3JnSWQsXG4gICAgLy8gcGFzc3dvcmQ6IEpXVCB9IOKAlCBzYXRpc2ZpZXMgQ29kZUJ1aWxkJ3Mgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFscyksIG5vdCBgYWNjZXNzVG9rZW5gLlxuICAgIGlmICghc2VjcmV0LnBhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3JldCBtaXNzaW5nIHBhc3N3b3JkIChKV1QpIOKAlCBydW4gXCJwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuXCIgdG8gZ2VuZXJhdGUnKTtcbiAgICB9XG5cbiAgICBwcmludEluZm8oJ1VzaW5nIHN0b3JlZCBKV1QgdG9rZW4nKTtcbiAgICByZXR1cm4gc2VjcmV0LnBhc3N3b3JkO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZC4gVXNlIG9uZSBvZjpcXG4nICtcbiAgICAnICAtIFNldCBQTEFURk9STV9UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZVxcbicgK1xuICAgICcgIC0gUGFzcyAtLXN0b3JlLXRva2VucyB3aXRoIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIGVudiB2YXInLFxuICApO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYW5kIHJldHVybiBhbiBhdXRoZW50aWNhdGVkIEFQSSBjbGllbnQuXG4gKlxuICogU3VwcG9ydHMgdHdvIGF1dGggbWV0aG9kczpcbiAqIDEuIFBMQVRGT1JNX1RPS0VOIGVudiB2YXJcbiAqIDIuIC0tc3RvcmUtdG9rZW5zICsgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciDihpIgZmV0Y2ggdG9rZW4gZnJvbSBTZWNyZXRzIE1hbmFnZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYyhvcHRpb25zOiB7XG4gIHN0b3JlVG9rZW5zPzogYm9vbGVhbjtcbiAgdmVyaWZ5U3NsPzogYm9vbGVhbjtcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBwcm9maWxlPzogc3RyaW5nO1xufSk6IFByb21pc2U8QXBpQ2xpZW50PiB7XG4gIC8vIFJlc29sdmUgdG9rZW4gYW5kIHNldCBpdCBpbiBlbnYgc28gQXBpQ2xpZW50L2dldENvbmZpZyBjYW4gZmluZCBpdFxuICBpZiAoIXByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOKSB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCByZXNvbHZlVG9rZW4ob3B0aW9ucyk7XG4gICAgcHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4gPSB0b2tlbjtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50KG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYW5kIHJldHVybiBhbiBhdXRoZW50aWNhdGVkIEFQSSBjbGllbnQgKHN5bmMg4oCUIHJlcXVpcmVzIFBMQVRGT1JNX1RPS0VOKS5cbiAqIFVzZSBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMgZm9yIC0tc3RvcmUtdG9rZW5zIHN1cHBvcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50KG9wdGlvbnM6IHsgdmVyaWZ5U3NsPzogYm9vbGVhbiB9KTogQXBpQ2xpZW50IHtcbiAgY29uc3QgY29uZmlnOiBDb25maWcgPSBnZXRDb25maWdXaXRoT3B0aW9ucyhvcHRpb25zKTtcbiAgcHJpbnRJbmZvKCdJbml0aWFsaXppbmcgQVBJIGNsaWVudCcsIHsgYmFzZVVybDogY29uZmlnLmFwaS5iYXNlVXJsIH0pO1xuICBjb25zdCBjbGllbnQgPSBuZXcgQXBpQ2xpZW50KGNvbmZpZyk7XG5cbiAgaWYgKCFjbGllbnQuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICBwcmludEVycm9yKCdOb3QgYXV0aGVudGljYXRlZCcsIHsgaGludDogJ1NldCBQTEFURk9STV9UT0tFTiBvciB1c2UgLS1zdG9yZS10b2tlbnMnIH0pO1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gcmVxdWlyZWQnKTtcbiAgfVxuXG4gIHByaW50U3VjY2VzcygnQVBJIGNsaWVudCBpbml0aWFsaXplZCcpO1xuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgcmVxdWlyZWQgZW50aXR5IElEIChVTElEIG9yIFVVSUQgZm9ybWF0KS5cbiAqIFJldHVybnMgdHJpbW1lZCBJRC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIElEIGlzIGVtcHR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUVudGl0eUlkKGlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGVudGl0eU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaWQgfHwgdHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcHJpbnRFcnJvcihgSW52YWxpZCAke2VudGl0eU5hbWV9IElEYCwgeyBwcm92aWRlZDogaWQgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eU5hbWV9IElEIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nYCk7XG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gaWQudHJpbSgpO1xuXG4gIGlmICh0cmltbWVkLmxlbmd0aCAhPT0gMjYgJiYgdHJpbW1lZC5sZW5ndGggIT09IDM2KSB7XG4gICAgcHJpbnRXYXJuaW5nKGAke2VudGl0eU5hbWV9IElEIGZvcm1hdCBtYXkgYmUgaW52YWxpZGAsIHtcbiAgICAgIHByb3ZpZGVkOiB0cmltbWVkLFxuICAgICAgZXhwZWN0ZWRMZW5ndGg6ICcyNiBjaGFyYWN0ZXJzIChVTElEKSBvciAzNiBjaGFyYWN0ZXJzIChVVUlEKScsXG4gICAgICBhY3R1YWxMZW5ndGg6IHRyaW1tZWQubGVuZ3RoLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWQ7XG59XG5cbiJdfQ==
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jb21tYW5kLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBZ0IsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFlLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQXNCLE1BQU0sdUJBQXVCLENBQUM7QUFDcEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkgsT0FBTyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWpGLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFNUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFhLEVBQUUsUUFBaUIsRUFBRSxJQUEwQjtJQUM3RixNQUFNLFdBQVcsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBQzFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDakIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMs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SyxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNuRCxZQUFZLENBQUMsR0FBRyxVQUFVLDJCQUEyQixFQUFFO1lBQ3JELFFBQVEsRUFBRSxPQUFPO1lBQ2pCLGNBQWMsRUFBRSw4Q0FBOEM7WUFDOUQsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyB0eXBlIENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyBBcGlDbGllbnQgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VjcmV0VmFsdWUgfSBmcm9tICcuL2F3cy1zZWNyZXRzLmpzJztcbmltcG9ydCB7IHR5cGUgQ29uZmlnLCBnZXRBcGlDb25maWcsIGdldENvbmZpZ1dpdGhPcHRpb25zIH0gZnJvbSAnLi9jb25maWctbG9hZGVyLmpzJztcbmltcG9ydCB7IGNsZWFyU2Vzc2lvbiwgaXNTZXNzaW9uVXNhYmxlLCBsb2FkU2Vzc2lvbiwgc2F2ZVNlc3Npb24sIHR5cGUgU3RvcmVkU2Vzc2lvbiB9IGZyb20gJy4vY3JlZGVudGlhbC1zdG9yZS5qcyc7XG5pbXBvcnQgeyBwcmludEVycm9yLCBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiwgZ2VuZXJhdGVFeGVjdXRpb25JZCB9IGZyb20gJy4uL2NvbmZpZy9jbGkuY29uc3RhbnRzLmpzJztcblxuY29uc3QgeyBib2xkLCBjeWFuLCBncmVlbiwgbWFnZW50YSB9ID0gcGljbztcblxuLyoqXG4gKiBQcmludCBjb21tYW5kIGhlYWRlciB3aXRoIHNlY3Rpb24gdGl0bGUgYW5kIGV4ZWN1dGlvbiBJRC5cbiAqIFJldHVybnMgdGhlIGV4ZWN1dGlvbiBJRCBmb3IgdXNlIGluIGVycm9yIGhhbmRsZXJzIGFuZCBzdW1tYXJpZXMuXG4gKlxuICogUGFzcyBgeyBxdWlldDogdHJ1ZSB9YCB0byBzdXBwcmVzcyB0aGUgZGVjb3JhdGl2ZSBvdXRwdXQgd2hpbGUgc3RpbGwgZ2V0dGluZyB0aGVcbiAqIGlkIOKAlCB1c2VkIGJvdGggYnkgYC0tcXVpZXRgIGNhbGxlcnMgYW5kIGJ5IGAtLWpzb25gIGNvbW1hbmRzIChzbyB0aGUgYmFubmVyXG4gKiBkb2Vzbid0IGxhbmQgb24gc3Rkb3V0IGFoZWFkIG9mIHRoZSBKU09OIHBheWxvYWQgYW5kIGJyZWFrIGDigKYgLS1qc29uIHwganFgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50Q29tbWFuZEhlYWRlcih0aXRsZTogc3RyaW5nLCBzdWJ0aXRsZT86IHN0cmluZywgb3B0cz86IHsgcXVpZXQ/OiBib29sZWFuIH0pOiBzdHJpbmcge1xuICBjb25zdCBleGVjdXRpb25JZCA9IGdlbmVyYXRlRXhlY3V0aW9uSWQoKTtcbiAgaWYgKCFvcHRzPy5xdWlldCkge1xuICAgIHByaW50U2VjdGlvbih0aXRsZSk7XG4gICAgY29uc29sZS5sb2coYCR7bWFnZW50YShgW0VYRS0ke2V4ZWN1dGlvbklkfV1gKX0gJHtjeWFuKGJvbGQoc3VidGl0bGUgfHwgdGl0bGUpKX1gKTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gIH1cbiAgcmV0dXJuIGV4ZWN1dGlvbklkO1xufVxuXG4vKiogQXR0YWNoIHRoZSBzdGFuZGFyZCBgLS12ZXJpZnktc3NsYCAvIGAtLW5vLXZlcmlmeS1zc2xgIHBhaXIuIFRoZSB0d28gdG9nZXRoZXJcbiAqICBnaXZlIENvbW1hbmRlciBhbiBleHBsaWNpdCB0cmktc3RhdGUgYG9wdGlvbnMudmVyaWZ5U3NsYCAodHJ1ZS9mYWxzZS91bmRlZmluZWQpLlxuICogIFJldHVybnMgdGhlIGNvbW1hbmQgc28gaXQgY29tcG9zZXM6IGB3aXRoU3NsT3B0aW9ucyhwcm9ncmFtLmNvbW1hbmQoJ3gnKSnigKZgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTc2xPcHRpb25zPFQgZXh0ZW5kcyBDb21tYW5kPihjbWQ6IFQpOiBUIHtcbiAgcmV0dXJuIGNtZFxuICAgIC5vcHRpb24oJy0tdmVyaWZ5LXNzbCcsICdFbmFibGUgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbicpXG4gICAgLm9wdGlvbignLS1uby12ZXJpZnktc3NsJywgJ0Rpc2FibGUgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbicpIGFzIFQ7XG59XG5cbi8qKiBBdHRhY2ggdGhlIHN0YW5kYXJkIGAtLXJlZ2lvbiA8cmVnaW9uPmAgb3B0aW9uIChvbmUgY2Fub25pY2FsIGRlc2NyaXB0aW9uKS5cbiAqICBSZWdpb24gcmVzb2x1dGlvbiAoZmxhZyDihpIgQVdTX1JFR0lPTiDihpIgQ0RLX0RFRkFVTFRfUkVHSU9OIOKGkiB1cy1lYXN0LTEpIGxpdmVzIGluXG4gKiAgYXdzLWVudi5yZXNvbHZlQXdzUmVnaW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZWdpb25PcHRpb248VCBleHRlbmRzIENvbW1hbmQ+KGNtZDogVCk6IFQge1xuICByZXR1cm4gY21kLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbiAoZGVmYXVsdHMgdG8gQVdTX1JFR0lPTiAvIENES19ERUZBVUxUX1JFR0lPTiAvIHVzLWVhc3QtMSknKSBhcyBUO1xufVxuXG4vKiogQXR0YWNoIHRoZSBzdGFuZGFyZCBgLS1wcm9maWxlIDxwcm9maWxlPmAgb3B0aW9uIChvbmUgY2Fub25pY2FsIGRlc2NyaXB0aW9uKS5cbiAqICBObyBkZWZhdWx0IGlzIHBpbm5lZCBzbyB0aGUgQVdTIGRlZmF1bHQgY3JlZGVudGlhbCBjaGFpbiAoZW52IHZhcnMsIFNTTywgcm9sZXMpXG4gKiAgd29ya3Mgb3V0IG9mIHRoZSBib3g7IC0tcHJvZmlsZSBvbmx5IHNlbGVjdHMgYSBzaGFyZWQgcHJvZmlsZSB3aGVuIHNldC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUHJvZmlsZU9wdGlvbjxUIGV4dGVuZHMgQ29tbWFuZD4oY21kOiBUKTogVCB7XG4gIHJldHVybiBjbWQub3B0aW9uKCctLXByb2ZpbGUgPHByb2ZpbGU+JywgJ0FXUyBDTEkgcHJvZmlsZSAoZGVmYXVsdHMgdG8gdGhlIHN0YW5kYXJkIEFXUyBjcmVkZW50aWFsIGNoYWluKScpIGFzIFQ7XG59XG5cbi8qKlxuICogUHJpbnQgZXhlY3V0aW9uIHN1bW1hcnkgd2l0aCBJRCwgZHVyYXRpb24sIGFuZCBzdGF0dXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludEV4ZWN1dGlvblN1bW1hcnkoZXhlY3V0aW9uSWQ6IHN0cmluZywgZHVyYXRpb246IG51bWJlcik6IHZvaWQge1xuICBjb25zb2xlLmxvZygnJyk7XG4gIHByaW50S2V5VmFsdWUoe1xuICAgICdFeGVjdXRpb24gSUQnOiBleGVjdXRpb25JZCxcbiAgICAnRHVyYXRpb24nOiBmb3JtYXREdXJhdGlvbihkdXJhdGlvbiksXG4gICAgJ1N0YXR1cyc6IGdyZWVuKCfinJMgU3VjY2VzcycpLFxuICB9KTtcbn1cblxuLyoqXG4gKiBXYXJuIGlmIFNTTCB2ZXJpZmljYXRpb24gaXMgZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludFNzbFdhcm5pbmcodmVyaWZ5U3NsPzogYm9vbGVhbik6IHZvaWQge1xuICBpZiAodmVyaWZ5U3NsID09PSBmYWxzZSkge1xuICAgIHByaW50V2FybmluZygnU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBpcyBESVNBQkxFRCcpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmV3IGEgc3RvcmVkIHNlc3Npb24gd2l0aCBpdHMgcmVmcmVzaCB0b2tlbiwgcGVyc2lzdCB0aGUgcm90YXRlZCBwYWlyLCBhbmRcbiAqIHJldHVybiB0aGUgbmV3IGFjY2VzcyB0b2tlbi4gUmV0dXJucyB1bmRlZmluZWQgKGFuZCBmb3JnZXRzIHRoZSBzZXNzaW9uKSB3aGVuXG4gKiB0aGUgcGxhdGZvcm0gcmVmdXNlcyBpdCDigJQgYSByb3RhdGVkLWF3YXkgb3IgcmV2b2tlZCB0b2tlbiBpcyBkZWFkLCBhbmQga2VlcGluZ1xuICogaXQgd291bGQgbWFrZSBldmVyeSBsYXRlciBjb21tYW5kIGZhaWwgdGhlIHNhbWUgd2F5LlxuICpcbiAqIGBYLVBiLUNsaWVudGAgaXMgbWFuZGF0b3J5IG9uIC9hdXRoL3JlZnJlc2ggKHRoZSBDU1JGIGdhdGUpIGFuZCBpdHMgdmFsdWUgYWxzb1xuICogcGlja3MgdGhlIHRyYW5zcG9ydDogYW55dGhpbmcgYnV0IGB3ZWJgIGtlZXBzIHRoZSBib2R5IGZsb3cgdGhlIENMSSB1c2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoU3RvcmVkU2Vzc2lvbihiYXNlVXJsOiBzdHJpbmcsIHNlc3Npb246IFN0b3JlZFNlc3Npb24pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIXNlc3Npb24ucmVmcmVzaFRva2VuKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdDx7IGRhdGE/OiB7IGFjY2Vzc1Rva2VuPzogc3RyaW5nOyByZWZyZXNoVG9rZW4/OiBzdHJpbmc7IGV4cGlyZXNJbj86IG51bWJlciB9IH0+KFxuICAgICAgYCR7YmFzZVVybH0vYXBpL2F1dGgvcmVmcmVzaGAsXG4gICAgICB7IHJlZnJlc2hUb2tlbjogc2Vzc2lvbi5yZWZyZXNoVG9rZW4gfSxcbiAgICAgIHsgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnWC1QYi1DbGllbnQnOiAnY2xpJyB9LCB0aW1lb3V0OiAzMF8wMDAgfSxcbiAgICApO1xuICAgIGNvbnN0IHJlbmV3ZWQgPSByZXNwb25zZS5kYXRhPy5kYXRhO1xuICAgIGlmICghcmVuZXdlZD8uYWNjZXNzVG9rZW4pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgc2F2ZVNlc3Npb24oYmFzZVVybCwge1xuICAgICAgYWNjZXNzVG9rZW46IHJlbmV3ZWQuYWNjZXNzVG9rZW4sXG4gICAgICAuLi4ocmVuZXdlZC5yZWZyZXNoVG9rZW4gPyB7IHJlZnJlc2hUb2tlbjogcmVuZXdlZC5yZWZyZXNoVG9rZW4gfSA6IHt9KSxcbiAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIChyZW5ld2VkLmV4cGlyZXNJbiA/PyA5MDApICogMTAwMCxcbiAgICAgIC4uLihzZXNzaW9uLm9yZ2FuaXphdGlvbklkID8geyBvcmdhbml6YXRpb25JZDogc2Vzc2lvbi5vcmdhbml6YXRpb25JZCB9IDoge30pLFxuICAgIH0pO1xuICAgIHJldHVybiByZW5ld2VkLmFjY2Vzc1Rva2VuO1xuICB9IGNhdGNoIHtcbiAgICBjbGVhclNlc3Npb24oYmFzZVVybCk7XG4gICAgcHJpbnRXYXJuaW5nKCdUaGUgc3RvcmVkIHNlc3Npb24gY291bGQgbm90IGJlIHJlbmV3ZWQg4oCUIHJ1biBcInBpcGVsaW5lLW1hbmFnZXIgYXV0aCBsb2dpblwiIGFnYWluJyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmUgYSBwbGF0Zm9ybSBjcmVkZW50aWFsIHVzaW5nIHRocmVlIG1ldGhvZHMgKGluIHByaW9yaXR5IG9yZGVyKTpcbiAqXG4gKiAxLiBQTEFURk9STV9UT0tFTiBlbnYgdmFyIChhIEpXVCwgb3IgYW4gb3BhcXVlIGBwYl9wYXRf4oCmYC9gcGJfc2Ff4oCmYCBrZXkpXG4gKiAyLiB0aGUgc2Vzc2lvbiBgYXV0aCBsb2dpbmAgc3RvcmVkIGZvciB0aGlzIHBsYXRmb3JtIChyZW5ld2VkIGlmIGl0IGhhcyBleHBpcmVkKVxuICogMy4gLS1zdG9yZS10b2tlbnMgZmxhZyDihpIgdGhlIHNlcnZpY2UtYWNjb3VudCBrZXkgaW4gQVdTIFNlY3JldHMgTWFuYWdlclxuICpcbiAqIEByZXR1cm5zIHRoZSBiZWFyZXIgY3JlZGVudGlhbCBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb2tlbihvcHRpb25zOiB7XG4gIHN0b3JlVG9rZW5zPzogYm9vbGVhbjtcbiAgdmVyaWZ5U3NsPzogYm9vbGVhbjtcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBwcm9maWxlPzogc3RyaW5nO1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIFBhdGggMTogUExBVEZPUk1fVE9LRU4gZW52IHZhclxuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICBwcmludEluZm8oJ1VzaW5nIFBMQVRGT1JNX1RPS0VOIGZyb20gZW52aXJvbm1lbnQnKTtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU47XG4gIH1cblxuICAvLyBQYXRoIDI6IHRoZSBzdG9yZWQgYnJvd3NlciBzaWduLWluLiBTa2lwcGVkIGVudGlyZWx5IHdoZW4gLS1zdG9yZS10b2tlbnNcbiAgLy8gbmFtZXMgYSBtYWNoaW5lIGNyZWRlbnRpYWwsIHNvIGFuIG9wZXJhdG9yJ3MgbGFwdG9wIHNlc3Npb24gY2FuIG5ldmVyIGJlXG4gIC8vIHVzZWQgd2hlcmUgdGhlIGF1dG9tYXRpb24gY3JlZGVudGlhbCB3YXMgYXNrZWQgZm9yLlxuICBpZiAoIW9wdGlvbnMuc3RvcmVUb2tlbnMpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gZ2V0QXBpQ29uZmlnKCkuYXBpLmJhc2VVcmw7XG4gICAgY29uc3Qgc3RvcmVkID0gbG9hZFNlc3Npb24oYmFzZVVybCk7XG4gICAgaWYgKGlzU2Vzc2lvblVzYWJsZShzdG9yZWQpKSB7XG4gICAgICBwcmludEluZm8oJ1VzaW5nIHRoZSBzdG9yZWQgc2Vzc2lvbiBmcm9tIFwiYXV0aCBsb2dpblwiJyk7XG4gICAgICByZXR1cm4gc3RvcmVkLmFjY2Vzc1Rva2VuO1xuICAgIH1cbiAgICBpZiAoc3RvcmVkKSB7XG4gICAgICBjb25zdCByZW5ld2VkID0gYXdhaXQgcmVmcmVzaFN0b3JlZFNlc3Npb24oYmFzZVVybCwgc3RvcmVkKTtcbiAgICAgIGlmIChyZW5ld2VkKSB7XG4gICAgICAgIHByaW50SW5mbygnUmVuZXdlZCB0aGUgc3RvcmVkIHNlc3Npb24gZnJvbSBcImF1dGggbG9naW5cIicpO1xuICAgICAgICByZXR1cm4gcmVuZXdlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQYXRoIDM6IC0tc3RvcmUtdG9rZW5zIOKGkiByZWFkIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIGZyb20gU2VjcmV0cyBNYW5hZ2VyXG4gIGlmIChvcHRpb25zLnN0b3JlVG9rZW5zKSB7XG4gICAgY29uc3Qgc2VjcmV0TmFtZSA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FO1xuICAgIGlmICghc2VjcmV0TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9TRUNSRVRfTkFNRSBlbnYgdmFyIGlzIHJlcXVpcmVkIHdpdGggLS1zdG9yZS10b2tlbnMnKTtcbiAgICB9XG5cbiAgICBwcmludEluZm8oJ0ZldGNoaW5nIHNlY3JldCBmcm9tIFNlY3JldHMgTWFuYWdlcicsIHsgc2VjcmV0OiBzZWNyZXROYW1lIH0pO1xuXG4gICAgY29uc3Qgc2VjcmV0SnNvbiA9IGF3YWl0IGdldFNlY3JldFZhbHVlKHNlY3JldE5hbWUsIHsgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbiwgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlIH0pO1xuICAgIGNvbnN0IHNlY3JldCA9IEpTT04ucGFyc2Uoc2VjcmV0SnNvbikgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBwcmludFN1Y2Nlc3MoJ1NlY3JldCByZXRyaWV2ZWQgZnJvbSBTZWNyZXRzIE1hbmFnZXInKTtcblxuICAgIC8vIHN0b3JlLXRva2VuIHdyaXRlcyB0aGUgc2VydmljZS1hY2NvdW50IEtFWSB0byB0aGUgYHBhc3N3b3JkYCBmaWVsZCAoc2NoZW1hOlxuICAgIC8vIHsgdXNlcm5hbWU6IG9yZ0lkLCBwYXNzd29yZDogcGJfc2Ff4oCmIH0g4oCUIHNhdGlzZmllcyBDb2RlQnVpbGQnc1xuICAgIC8vIHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHMpLCBub3QgYGFjY2Vzc1Rva2VuYC4gVGhlIGtleSBpcyBwcmVzZW50ZWQgYXMgYVxuICAgIC8vIGJlYXJlciBjcmVkZW50aWFsIGFuZCBleGNoYW5nZWQgc2VydmVyLXNpZGUsIHNvIG5vdGhpbmcgaGVyZSBkZWNvZGVzIGl0LlxuICAgIGlmICghc2VjcmV0LnBhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3JldCBtaXNzaW5nIHBhc3N3b3JkIChzZXJ2aWNlLWFjY291bnQga2V5KSDigJQgcnVuIFwicGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlblwiIHRvIHByb3Zpc2lvbiBvbmUnKTtcbiAgICB9XG5cbiAgICBwcmludEluZm8oJ1VzaW5nIHRoZSBzdG9yZWQgc2VydmljZS1hY2NvdW50IGtleScpO1xuICAgIHJldHVybiBzZWNyZXQucGFzc3dvcmQ7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLiBVc2Ugb25lIG9mOlxcbicgK1xuICAgICcgIC0gUnVuIFwicGlwZWxpbmUtbWFuYWdlciBhdXRoIGxvZ2luXCIgKGJyb3dzZXIgc2lnbi1pbiwgc3RvcmVkIGZvciB0aGlzIHBsYXRmb3JtKVxcbicgK1xuICAgICcgIC0gU2V0IFBMQVRGT1JNX1RPS0VOIHRvIGFuIGFjY2VzcyBrZXkgZnJvbSBcInBpcGVsaW5lLW1hbmFnZXIgYXV0aCBwYXRcIlxcbicgK1xuICAgICcgIC0gUGFzcyAtLXN0b3JlLXRva2VucyB3aXRoIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIGVudiB2YXInLFxuICApO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYW5kIHJldHVybiBhbiBhdXRoZW50aWNhdGVkIEFQSSBjbGllbnQuXG4gKlxuICogU3VwcG9ydHMgdGhyZWUgYXV0aCBtZXRob2RzOlxuICogMS4gUExBVEZPUk1fVE9LRU4gZW52IHZhclxuICogMi4gdGhlIHN0b3JlZCBgYXV0aCBsb2dpbmAgc2Vzc2lvbiBmb3IgdGhpcyBwbGF0Zm9ybSAocmVuZXdlZCBvbiBleHBpcnkpXG4gKiAzLiAtLXN0b3JlLXRva2VucyArIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIGVudiB2YXIg4oaSIGZldGNoIHRva2VuIGZyb20gU2VjcmV0cyBNYW5hZ2VyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9uczoge1xuICBzdG9yZVRva2Vucz86IGJvb2xlYW47XG4gIHZlcmlmeVNzbD86IGJvb2xlYW47XG4gIHJlZ2lvbj86IHN0cmluZztcbiAgcHJvZmlsZT86IHN0cmluZztcbn0pOiBQcm9taXNlPEFwaUNsaWVudD4ge1xuICAvLyBSZXNvbHZlIHRva2VuIGFuZCBzZXQgaXQgaW4gZW52IHNvIEFwaUNsaWVudC9nZXRDb25maWcgY2FuIGZpbmQgaXRcbiAgaWYgKCFwcm9jZXNzLmVudi5QTEFURk9STV9UT0tFTikge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgcmVzb2x2ZVRva2VuKG9wdGlvbnMpO1xuICAgIHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOID0gdG9rZW47XG4gIH1cblxuICByZXR1cm4gY3JlYXRlQXV0aGVudGljYXRlZENsaWVudChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGFuZCByZXR1cm4gYW4gYXV0aGVudGljYXRlZCBBUEkgY2xpZW50IChzeW5jIOKAlCByZXF1aXJlcyBQTEFURk9STV9UT0tFTikuXG4gKiBVc2UgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jIGZvciAtLXN0b3JlLXRva2VucyBzdXBwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXV0aGVudGljYXRlZENsaWVudChvcHRpb25zOiB7IHZlcmlmeVNzbD86IGJvb2xlYW4gfSk6IEFwaUNsaWVudCB7XG4gIGNvbnN0IGNvbmZpZzogQ29uZmlnID0gZ2V0Q29uZmlnV2l0aE9wdGlvbnMob3B0aW9ucyk7XG4gIHByaW50SW5mbygnSW5pdGlhbGl6aW5nIEFQSSBjbGllbnQnLCB7IGJhc2VVcmw6IGNvbmZpZy5hcGkuYmFzZVVybCB9KTtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEFwaUNsaWVudChjb25maWcpO1xuXG4gIGlmICghY2xpZW50LmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgcHJpbnRFcnJvcignTm90IGF1dGhlbnRpY2F0ZWQnLCB7IGhpbnQ6ICdSdW4gXCJwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW5cIiwgc2V0IFBMQVRGT1JNX1RPS0VOLCBvciB1c2UgLS1zdG9yZS10b2tlbnMnIH0pO1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gcmVxdWlyZWQnKTtcbiAgfVxuXG4gIHByaW50U3VjY2VzcygnQVBJIGNsaWVudCBpbml0aWFsaXplZCcpO1xuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgcmVxdWlyZWQgZW50aXR5IElEIChVTElEIG9yIFVVSUQgZm9ybWF0KS5cbiAqIFJldHVybnMgdHJpbW1lZCBJRC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIElEIGlzIGVtcHR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUVudGl0eUlkKGlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGVudGl0eU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaWQgfHwgdHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcHJpbnRFcnJvcihgSW52YWxpZCAke2VudGl0eU5hbWV9IElEYCwgeyBwcm92aWRlZDogaWQgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eU5hbWV9IElEIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nYCk7XG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gaWQudHJpbSgpO1xuXG4gIGlmICh0cmltbWVkLmxlbmd0aCAhPT0gMjYgJiYgdHJpbW1lZC5sZW5ndGggIT09IDM2KSB7XG4gICAgcHJpbnRXYXJuaW5nKGAke2VudGl0eU5hbWV9IElEIGZvcm1hdCBtYXkgYmUgaW52YWxpZGAsIHtcbiAgICAgIHByb3ZpZGVkOiB0cmltbWVkLFxuICAgICAgZXhwZWN0ZWRMZW5ndGg6ICcyNiBjaGFyYWN0ZXJzIChVTElEKSBvciAzNiBjaGFyYWN0ZXJzIChVVUlEKScsXG4gICAgICBhY3R1YWxMZW5ndGg6IHRyaW1tZWQubGVuZ3RoLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWQ7XG59XG5cbiJdfQ==
@@ -9,7 +9,8 @@ export type { Config };
9
9
  * 3. Project config file: CLI_CONFIG_PATH or ./config.yml
10
10
  * 4. Environment variables
11
11
  *
12
- * Auth token MUST come from PLATFORM_TOKEN env var (never from config file).
12
+ * Auth token comes from PLATFORM_TOKEN, else the stored `auth login` session —
13
+ * never from a config file.
13
14
  */
14
15
  /**
15
16
  * Resolve the API/connection config (base URL, SSL, timeouts) from files and
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD,YAAY,EAAE,MAAM,EAAE,CAAC;AA6CvB;;;;;;;;;;GAUG;AACH;;;;;;;;GAQG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAoCnD;AAED,wBAAgB,SAAS,IAAI,MAAM,CAyBlC;AAaD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAU7E"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD,YAAY,EAAE,MAAM,EAAE,CAAC;AA6CvB;;;;;;;;;;;GAWG;AACH;;;;;;;;GAQG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAuCnD;AAED,wBAAgB,SAAS,IAAI,MAAM,CA8BlC;AAaD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAU7E"}
@@ -5,6 +5,7 @@ import { fileURLToPath } from 'node:url';
5
5
  import * as os from 'os';
6
6
  import * as path from 'path';
7
7
  import * as yaml from 'yaml';
8
+ import { isSessionUsable, loadSession } from './credential-store.js';
8
9
  import { printDebug, printError, printWarning } from './output-utils.js';
9
10
  import { assertSslDisableAllowed, isProductionEnv } from './tls.js';
10
11
  import {} from '../types/index.js';
@@ -60,7 +61,8 @@ function loadConfigFile(filePath, config) {
60
61
  * 3. Project config file: CLI_CONFIG_PATH or ./config.yml
61
62
  * 4. Environment variables
62
63
  *
63
- * Auth token MUST come from PLATFORM_TOKEN env var (never from config file).
64
+ * Auth token comes from PLATFORM_TOKEN, else the stored `auth login` session —
65
+ * never from a config file.
64
66
  */
65
67
  /**
66
68
  * Resolve the API/connection config (base URL, SSL, timeouts) from files and
@@ -73,8 +75,11 @@ function loadConfigFile(filePath, config) {
73
75
  */
74
76
  export function getApiConfig() {
75
77
  const projectConfigPath = process.env.CLI_CONFIG_PATH || path.join(__dirname, '../config.yml');
76
- // Layer 1: defaults → Layer 2: user config → Layer 3: project config
77
- let config = loadConfigFile(USER_CONFIG_PATH, { ...defaultConfig });
78
+ // Layer 1: defaults → Layer 2: user config → Layer 3: project config.
79
+ // `api` is copied too: a shallow `{ ...defaultConfig }` shares the SAME `api`
80
+ // object, so the `PLATFORM_BASE_URL` assignment below mutated the module-level
81
+ // defaults and leaked one caller's base URL into every later resolution.
82
+ let config = loadConfigFile(USER_CONFIG_PATH, { api: { ...defaultConfig.api } });
78
83
  config = loadConfigFile(projectConfigPath, config);
79
84
  // Layer 4: environment variable overrides
80
85
  if (process.env.PLATFORM_BASE_URL) {
@@ -107,11 +112,16 @@ export function getApiConfig() {
107
112
  }
108
113
  export function getConfig() {
109
114
  const config = getApiConfig();
110
- // Token is REQUIRED from environment
111
- const token = process.env.PLATFORM_TOKEN;
115
+ // PLATFORM_TOKEN wins (an access key in CI, or an explicit export); otherwise
116
+ // fall back to the session `auth login` stored for THIS platform. A stored
117
+ // session that has already expired is ignored rather than sent and rejected —
118
+ // the async path (`resolveToken`) refreshes it, and everything else tells the
119
+ // user to sign in again.
120
+ const stored = loadSession(config.api.baseUrl);
121
+ const token = process.env.PLATFORM_TOKEN || (isSessionUsable(stored) ? stored.accessToken : undefined);
112
122
  if (!token) {
113
- printError('PLATFORM_TOKEN environment variable is not set');
114
- throw new Error('PLATFORM_TOKEN environment variable is required');
123
+ printError('Not signed in: no PLATFORM_TOKEN, and no valid stored session for this platform');
124
+ throw new Error('Run "pipeline-manager auth login", or set PLATFORM_TOKEN to an access key');
115
125
  }
116
126
  if (token.trim().length === 0) {
117
127
  throw new Error('PLATFORM_TOKEN must be a non-empty string');
@@ -151,4 +161,4 @@ export function getConfigWithOptions(options) {
151
161
  }
152
162
  return config;
153
163
  }
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jb25maWctbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BFLE9BQU8sRUFBZSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELDBEQUEwRDtBQUMxRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBSS9EOztHQUVHO0FBQ0gsTUFBTSxhQUFhLEdBQXlCO0lBQzFDLEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSx3QkFBd0I7UUFDakMsT0FBTyxFQUFFLE1BQU07UUFDZixXQUFXLEVBQUUsZUFBZTtRQUM1QixlQUFlLEVBQUUsZ0JBQWdCO1FBQ2pDLG1CQUFtQixFQUFFLHlCQUF5QjtRQUM5QyxTQUFTLEVBQUUsYUFBYTtRQUN4QixhQUFhLEVBQUUsY0FBYztRQUM3QixlQUFlLEVBQUUsb0JBQW9CO1FBQ3JDLGtCQUFrQixFQUFFLElBQUk7S0FDekI7Q0FDRixDQUFDO0FBRUYsNERBQTREO0FBQzVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFFcEY7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsUUFBZ0IsRUFBRSxNQUE0QjtJQUNwRSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUU1QyxJQUFJLENBQUM7UUFDSCxVQUFVLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDakIsWUFBWSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLFlBQVksQ0FBQyw0Q0FBNEMsRUFBRTtZQUN6RCxJQUFJLEVBQUUsUUFBUTtZQUNkLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQzlELENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNIOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFlBQVk7SUFDMUIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUUvRixxRUFBcUU7SUFDckUsSUFBSSxNQUFNLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sR0FBRyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFbkQsMENBQTBDO0lBQzFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7UUFDbkQsVUFBVSxDQUFDLDBDQUEwQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEtBQUssR0FBRyxDQUFDO1FBQzVELElBQUksT0FBTyxJQUFJLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDakMsWUFBWSxDQUFDLHFGQUFxRixDQUFDLENBQUM7UUFDdEcsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ3pDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osWUFBWSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7WUFDcEYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFDbEMsVUFBVSxDQUFDLHVDQUF1QyxFQUFFLEVBQUUsYUFBYSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7YUFBTSxDQUFDO1lBQ04sWUFBWSxDQUFDLDZDQUE2QyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUN4RyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUztJQUN2QixNQUFNLE1BQU0sR0FBRyxZQUFZLEVBQUUsQ0FBQztJQUU5QixxQ0FBcUM7SUFDckMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7SUFFekMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsVUFBVSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixZQUFZLENBQUMsNERBQTRELENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsVUFBVSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFFaEQsT0FBTztRQUNMLEdBQUcsTUFBTTtRQUNULElBQUksRUFBRSxFQUFFLEtBQUssRUFBRTtLQUNoQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQWM7SUFDckMsT0FBTztRQUNMLEdBQUcsTUFBTTtRQUNULEdBQUcsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUU7S0FDbEQsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE9BQWdDO0lBQ25FLE1BQU0sTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQzNCLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUNoQyx1RUFBdUU7UUFDdkUsNkVBQTZFO1FBQzdFLG1FQUFtRTtRQUNuRSx1QkFBdUIsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB7IHByaW50RGVidWcsIHByaW50RXJyb3IsIHByaW50V2FybmluZyB9IGZyb20gJy4vb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGFzc2VydFNzbERpc2FibGVBbGxvd2VkLCBpc1Byb2R1Y3Rpb25FbnYgfSBmcm9tICcuL3Rscy5qcyc7XG5pbXBvcnQgeyB0eXBlIENvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2luZGV4LmpzJztcblxuLy8gRVNNIGhhcyBubyBfX2Rpcm5hbWU7IGRlcml2ZSBpdCBmcm9tIHRoaXMgbW9kdWxlJ3MgVVJMLlxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbmV4cG9ydCB0eXBlIHsgQ29uZmlnIH07XG5cbi8qKlxuICogRGVmYXVsdCBjb25maWd1cmF0aW9uIOKAlCBBUEkgZW5kcG9pbnQgcGF0aHMgYW5kIGNvbm5lY3Rpb24gc2V0dGluZ3MuXG4gKi9cbmNvbnN0IGRlZmF1bHRDb25maWc6IE9taXQ8Q29uZmlnLCAnYXV0aCc+ID0ge1xuICBhcGk6IHtcbiAgICBiYXNlVXJsOiAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODQ0MycsXG4gICAgdGltZW91dDogMzBfMDAwLFxuICAgIHBpcGVsaW5lVXJsOiAnL2FwaS9waXBlbGluZScsXG4gICAgcGlwZWxpbmVMaXN0VXJsOiAnL2FwaS9waXBlbGluZXMnLFxuICAgIHBpcGVsaW5lVGVtcGxhdGVVcmw6ICcvYXBpL3BpcGVsaW5lLXRlbXBsYXRlcycsXG4gICAgcGx1Z2luVXJsOiAnL2FwaS9wbHVnaW4nLFxuICAgIHBsdWdpbkxpc3RVcmw6ICcvYXBpL3BsdWdpbnMnLFxuICAgIHBsdWdpblVwbG9hZFVybDogJy9hcGkvcGx1Z2luL3VwbG9hZCcsXG4gICAgcmVqZWN0VW5hdXRob3JpemVkOiB0cnVlLFxuICB9LFxufTtcblxuLyoqIFVzZXIgY29uZmlnIGZpbGUgcGF0aDogfi8ucGlwZWxpbmUtbWFuYWdlci9jb25maWcueW1sICovXG5jb25zdCBVU0VSX0NPTkZJR19QQVRIID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5waXBlbGluZS1tYW5hZ2VyJywgJ2NvbmZpZy55bWwnKTtcblxuLyoqXG4gKiBMb2FkIGEgWUFNTCBjb25maWcgZmlsZSBhbmQgbWVyZ2UgaXRzIGBhcGlgIHNlY3Rpb24gaW50byB0aGUgY29uZmlnLlxuICogUmV0dXJucyB0aGUgbWVyZ2VkIGNvbmZpZyBvciB0aGUgb3JpZ2luYWwgaWYgZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGZhaWxzLlxuICovXG5mdW5jdGlvbiBsb2FkQ29uZmlnRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb25maWc6IE9taXQ8Q29uZmlnLCAnYXV0aCc+KTogT21pdDxDb25maWcsICdhdXRoJz4ge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gY29uZmlnO1xuXG4gIHRyeSB7XG4gICAgcHJpbnREZWJ1ZygnTG9hZGluZyBjb25maWd1cmF0aW9uJywgeyBwYXRoOiBmaWxlUGF0aCB9KTtcbiAgICBjb25zdCBwYXJzZWQgPSB5YW1sLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0Zi04JykpO1xuICAgIGlmIChwYXJzZWQ/LmF1dGgpIHtcbiAgICAgIHByaW50V2FybmluZygnQXV0aCBzZWN0aW9uIGluIGNvbmZpZyBmaWxlIGlzIGlnbm9yZWQg4oCUIHVzZSBQTEFURk9STV9UT0tFTiBlbnYgdmFyJyk7XG4gICAgfVxuICAgIHJldHVybiB7IGFwaTogeyAuLi5jb25maWcuYXBpLCAuLi5wYXJzZWQ/LmFwaSB9IH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRXYXJuaW5nKCdGYWlsZWQgdG8gbG9hZCBjb25maWcgZmlsZSwgdXNpbmcgZGVmYXVsdHMnLCB7XG4gICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGVzIGFuZCBlbnZpcm9ubWVudC5cbiAqXG4gKiBQcmlvcml0eSAobGFzdCB3aW5zKTpcbiAqIDEuIEJ1aWx0LWluIGRlZmF1bHRzXG4gKiAyLiBVc2VyIGNvbmZpZyBmaWxlOiB+Ly5waXBlbGluZS1tYW5hZ2VyL2NvbmZpZy55bWxcbiAqIDMuIFByb2plY3QgY29uZmlnIGZpbGU6IENMSV9DT05GSUdfUEFUSCBvciAuL2NvbmZpZy55bWxcbiAqIDQuIEVudmlyb25tZW50IHZhcmlhYmxlc1xuICpcbiAqIEF1dGggdG9rZW4gTVVTVCBjb21lIGZyb20gUExBVEZPUk1fVE9LRU4gZW52IHZhciAobmV2ZXIgZnJvbSBjb25maWcgZmlsZSkuXG4gKi9cbi8qKlxuICogUmVzb2x2ZSB0aGUgQVBJL2Nvbm5lY3Rpb24gY29uZmlnIChiYXNlIFVSTCwgU1NMLCB0aW1lb3V0cykgZnJvbSBmaWxlcyBhbmRcbiAqIGVudmlyb25tZW50IFdJVEhPVVQgcmVxdWlyaW5nIGBQTEFURk9STV9UT0tFTmAuXG4gKlxuICogVGhpcyBpcyB0aGUgdG9rZW4tb3B0aW9uYWwgc2xpY2Ugb2Yge0BsaW5rIGdldENvbmZpZ30uIFRoZSBwcmUtYXV0aCBsb2dpbiBzdGVwXG4gKiAoYGVuc3VyZVBsYXRmb3JtVG9rZW5gKSBuZWVkcyB0aGUgcmVzb2x2ZWQgYmFzZSBVUkwgdG8gUE9TVCBgL2FwaS9hdXRoL2xvZ2luYFxuICogKmJlZm9yZSogYW55IHRva2VuIGV4aXN0cyDigJQgY2FsbGluZyBgZ2V0Q29uZmlnKClgIHRoZXJlIHdvdWxkIHRocm93IG9uIHRoZVxuICogbWlzc2luZyB0b2tlbiBhbmQgbWFrZSBpbmxpbmUtbG9naW4gZGVhZC1vbi1hcnJpdmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpQ29uZmlnKCk6IE9taXQ8Q29uZmlnLCAnYXV0aCc+IHtcbiAgY29uc3QgcHJvamVjdENvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5DTElfQ09ORklHX1BBVEggfHwgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2NvbmZpZy55bWwnKTtcblxuICAvLyBMYXllciAxOiBkZWZhdWx0cyDihpIgTGF5ZXIgMjogdXNlciBjb25maWcg4oaSIExheWVyIDM6IHByb2plY3QgY29uZmlnXG4gIGxldCBjb25maWcgPSBsb2FkQ29uZmlnRmlsZShVU0VSX0NPTkZJR19QQVRILCB7IC4uLmRlZmF1bHRDb25maWcgfSk7XG4gIGNvbmZpZyA9IGxvYWRDb25maWdGaWxlKHByb2plY3RDb25maWdQYXRoLCBjb25maWcpO1xuXG4gIC8vIExheWVyIDQ6IGVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlc1xuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fQkFTRV9VUkwpIHtcbiAgICBjb25maWcuYXBpLmJhc2VVcmwgPSBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTDtcbiAgICBwcmludERlYnVnKCdVc2luZyBQTEFURk9STV9CQVNFX1VSTCBmcm9tIGVudmlyb25tZW50JywgeyBiYXNlVXJsOiBjb25maWcuYXBpLmJhc2VVcmwgfSk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuVExTX1JFSkVDVF9VTkFVVEhPUklaRUQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRpc2FibGUgPSBwcm9jZXNzLmVudi5UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCA9PT0gJzAnO1xuICAgIGlmIChkaXNhYmxlICYmIGlzUHJvZHVjdGlvbkVudigpKSB7XG4gICAgICBwcmludFdhcm5pbmcoJ0lnbm9yaW5nIFRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEPTAgaW4gcHJvZHVjdGlvbiDigJQgU1NMIHZlcmlmaWNhdGlvbiByZW1haW5zIGVuYWJsZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnLmFwaS5yZWplY3RVbmF1dGhvcml6ZWQgPSAhZGlzYWJsZTtcbiAgICAgIGlmIChkaXNhYmxlKSB7XG4gICAgICAgIHByaW50V2FybmluZygnU1NMIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gZGlzYWJsZWQgdmlhIFRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEPTAnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuVVBMT0FEX1RJTUVPVVQpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChwcm9jZXNzLmVudi5VUExPQURfVElNRU9VVCwgMTApO1xuICAgIGlmICghaXNOYU4ocGFyc2VkKSAmJiBwYXJzZWQgPiAwKSB7XG4gICAgICBjb25maWcuYXBpLnVwbG9hZFRpbWVvdXQgPSBwYXJzZWQ7XG4gICAgICBwcmludERlYnVnKCdVc2luZyBVUExPQURfVElNRU9VVCBmcm9tIGVudmlyb25tZW50JywgeyB1cGxvYWRUaW1lb3V0OiBgJHtwYXJzZWR9bXNgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmludFdhcm5pbmcoJ0ludmFsaWQgVVBMT0FEX1RJTUVPVVQgdmFsdWUsIHVzaW5nIGRlZmF1bHQnLCB7IHByb3ZpZGVkOiBwcm9jZXNzLmVudi5VUExPQURfVElNRU9VVCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IENvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IGdldEFwaUNvbmZpZygpO1xuXG4gIC8vIFRva2VuIGlzIFJFUVVJUkVEIGZyb20gZW52aXJvbm1lbnRcbiAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudi5QTEFURk9STV9UT0tFTjtcblxuICBpZiAoIXRva2VuKSB7XG4gICAgcHJpbnRFcnJvcignUExBVEZPUk1fVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCcpO1xuICAgIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGlmICh0b2tlbi50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9UT0tFTiBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgaWYgKHRva2VuLmluY2x1ZGVzKCcgJykpIHtcbiAgICBwcmludFdhcm5pbmcoJ1BMQVRGT1JNX1RPS0VOIGNvbnRhaW5zIHdoaXRlc3BhY2Ug4oCUIHRoaXMgbWF5IGNhdXNlIGlzc3VlcycpO1xuICB9XG5cbiAgcHJpbnREZWJ1ZygnQ29uZmlndXJhdGlvbiBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb25maWcsXG4gICAgYXV0aDogeyB0b2tlbiB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiBhIGNvcHkgb2YgYGNvbmZpZ2Agd2l0aCBTU0wgdmVyaWZpY2F0aW9uIGRpc2FibGVkLiBNb2R1bGUtcHJpdmF0ZSDigJQgdGhlXG4gKiBvbmx5IGNhbGxlciBpcyBgZ2V0Q29uZmlnV2l0aE9wdGlvbnNgIGJlbG93LlxuICovXG5mdW5jdGlvbiB3aXRoU1NMRGlzYWJsZWQoY29uZmlnOiBDb25maWcpOiBDb25maWcge1xuICByZXR1cm4ge1xuICAgIC4uLmNvbmZpZyxcbiAgICBhcGk6IHsgLi4uY29uZmlnLmFwaSwgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9LFxuICB9O1xufVxuXG4vKipcbiAqIExvYWQgY29uZmlndXJhdGlvbiwgb3B0aW9uYWxseSBkaXNhYmxpbmcgU1NMIGJhc2VkIG9uIGNvbW1hbmQgb3B0aW9ucy5cbiAqIFJlcGxhY2VzIHRoZSByZXBlYXRlZCBwYXR0ZXJuOlxuICogICBgb3B0aW9ucy52ZXJpZnlTc2wgPT09IGZhbHNlID8gd2l0aFNTTERpc2FibGVkKGdldENvbmZpZygpKSA6IGdldENvbmZpZygpYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnV2l0aE9wdGlvbnMob3B0aW9uczogeyB2ZXJpZnlTc2w/OiBib29sZWFuIH0pOiBDb25maWcge1xuICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgaWYgKG9wdGlvbnMudmVyaWZ5U3NsID09PSBmYWxzZSkge1xuICAgIC8vIEV2ZXJ5IGF1dGhlbnRpY2F0ZWQgY29tbWFuZCBmbG93cyBpdHMgdG9rZW4gdGhyb3VnaCBoZXJlIOKAlCByZWZ1c2UgdG9cbiAgICAvLyBkaXNhYmxlIGNlcnQgdmVyaWZpY2F0aW9uIGluIHByb2R1Y3Rpb24gKG1pcnJvcnMgdGhlIGxvZ2luL3JlbmV3YWwgZ3VhcmRzKVxuICAgIC8vIHNvIGEgTUlUTSBjYW4ndCBoYXJ2ZXN0IHRoZSBCZWFyZXIgSldULiBOby1vcCBpbiBub24tcHJvZHVjdGlvbi5cbiAgICBhc3NlcnRTc2xEaXNhYmxlQWxsb3dlZCgnYXV0aGVudGljYXRlZCBBUEkgY2xpZW50ICgtLW5vLXZlcmlmeS1zc2wpJyk7XG4gICAgcmV0dXJuIHdpdGhTU0xEaXNhYmxlZChjb25maWcpO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG4iXX0=
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jb25maWctbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEUsT0FBTyxFQUFlLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsMERBQTBEO0FBQzFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFJL0Q7O0dBRUc7QUFDSCxNQUFNLGFBQWEsR0FBeUI7SUFDMUMsR0FBRyxFQUFFO1FBQ0gsT0FBTyxFQUFFLHdCQUF3QjtRQUNqQyxPQUFPLEVBQUUsTUFBTTtRQUNmLFdBQVcsRUFBRSxlQUFlO1FBQzVCLGVBQWUsRUFBRSxnQkFBZ0I7UUFDakMsbUJBQW1CLEVBQUUseUJBQXlCO1FBQzlDLFNBQVMsRUFBRSxhQUFhO1FBQ3hCLGFBQWEsRUFBRSxjQUFjO1FBQzdCLGVBQWUsRUFBRSxvQkFBb0I7UUFDckMsa0JBQWtCLEVBQUUsSUFBSTtLQUN6QjtDQUNGLENBQUM7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QztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLFlBQVksQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxVQUFVLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUVoRCxPQUFPO1FBQ0wsR0FBRyxNQUFNO1FBQ1QsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFO0tBQ2hCLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxlQUFlLENBQUMsTUFBYztJQUNyQyxPQUFPO1FBQ0wsR0FBRyxNQUFNO1FBQ1QsR0FBRyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRTtLQUNsRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBZ0M7SUFDbkUsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDM0IsSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ2hDLHVFQUF1RTtRQUN2RSw2RUFBNkU7UUFDN0UsbUVBQW1FO1FBQ25FLHVCQUF1QixDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDdEUsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ3lhbWwnO1xuaW1wb3J0IHsgaXNTZXNzaW9uVXNhYmxlLCBsb2FkU2Vzc2lvbiB9IGZyb20gJy4vY3JlZGVudGlhbC1zdG9yZS5qcyc7XG5pbXBvcnQgeyBwcmludERlYnVnLCBwcmludEVycm9yLCBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRTc2xEaXNhYmxlQWxsb3dlZCwgaXNQcm9kdWN0aW9uRW52IH0gZnJvbSAnLi90bHMuanMnO1xuaW1wb3J0IHsgdHlwZSBDb25maWcgfSBmcm9tICcuLi90eXBlcy9pbmRleC5qcyc7XG5cbi8vIEVTTSBoYXMgbm8gX19kaXJuYW1lOyBkZXJpdmUgaXQgZnJvbSB0aGlzIG1vZHVsZSdzIFVSTC5cbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5leHBvcnQgdHlwZSB7IENvbmZpZyB9O1xuXG4vKipcbiAqIERlZmF1bHQgY29uZmlndXJhdGlvbiDigJQgQVBJIGVuZHBvaW50IHBhdGhzIGFuZCBjb25uZWN0aW9uIHNldHRpbmdzLlxuICovXG5jb25zdCBkZWZhdWx0Q29uZmlnOiBPbWl0PENvbmZpZywgJ2F1dGgnPiA9IHtcbiAgYXBpOiB7XG4gICAgYmFzZVVybDogJ2h0dHBzOi8vbG9jYWxob3N0Ojg0NDMnLFxuICAgIHRpbWVvdXQ6IDMwXzAwMCxcbiAgICBwaXBlbGluZVVybDogJy9hcGkvcGlwZWxpbmUnLFxuICAgIHBpcGVsaW5lTGlzdFVybDogJy9hcGkvcGlwZWxpbmVzJyxcbiAgICBwaXBlbGluZVRlbXBsYXRlVXJsOiAnL2FwaS9waXBlbGluZS10ZW1wbGF0ZXMnLFxuICAgIHBsdWdpblVybDogJy9hcGkvcGx1Z2luJyxcbiAgICBwbHVnaW5MaXN0VXJsOiAnL2FwaS9wbHVnaW5zJyxcbiAgICBwbHVnaW5VcGxvYWRVcmw6ICcvYXBpL3BsdWdpbi91cGxvYWQnLFxuICAgIHJlamVjdFVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgfSxcbn07XG5cbi8qKiBVc2VyIGNvbmZpZyBmaWxlIHBhdGg6IH4vLnBpcGVsaW5lLW1hbmFnZXIvY29uZmlnLnltbCAqL1xuY29uc3QgVVNFUl9DT05GSUdfUEFUSCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcucGlwZWxpbmUtbWFuYWdlcicsICdjb25maWcueW1sJyk7XG5cbi8qKlxuICogTG9hZCBhIFlBTUwgY29uZmlnIGZpbGUgYW5kIG1lcmdlIGl0cyBgYXBpYCBzZWN0aW9uIGludG8gdGhlIGNvbmZpZy5cbiAqIFJldHVybnMgdGhlIG1lcmdlZCBjb25maWcgb3IgdGhlIG9yaWdpbmFsIGlmIGZpbGUgZG9lc24ndCBleGlzdCBvciBmYWlscy5cbiAqL1xuZnVuY3Rpb24gbG9hZENvbmZpZ0ZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29uZmlnOiBPbWl0PENvbmZpZywgJ2F1dGgnPik6IE9taXQ8Q29uZmlnLCAnYXV0aCc+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIGNvbmZpZztcblxuICB0cnkge1xuICAgIHByaW50RGVidWcoJ0xvYWRpbmcgY29uZmlndXJhdGlvbicsIHsgcGF0aDogZmlsZVBhdGggfSk7XG4gICAgY29uc3QgcGFyc2VkID0geWFtbC5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpKTtcbiAgICBpZiAocGFyc2VkPy5hdXRoKSB7XG4gICAgICBwcmludFdhcm5pbmcoJ0F1dGggc2VjdGlvbiBpbiBjb25maWcgZmlsZSBpcyBpZ25vcmVkIOKAlCB1c2UgUExBVEZPUk1fVE9LRU4gZW52IHZhcicpO1xuICAgIH1cbiAgICByZXR1cm4geyBhcGk6IHsgLi4uY29uZmlnLmFwaSwgLi4ucGFyc2VkPy5hcGkgfSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50V2FybmluZygnRmFpbGVkIHRvIGxvYWQgY29uZmlnIGZpbGUsIHVzaW5nIGRlZmF1bHRzJywge1xuICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIH0pO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSBmaWxlcyBhbmQgZW52aXJvbm1lbnQuXG4gKlxuICogUHJpb3JpdHkgKGxhc3Qgd2lucyk6XG4gKiAxLiBCdWlsdC1pbiBkZWZhdWx0c1xuICogMi4gVXNlciBjb25maWcgZmlsZTogfi8ucGlwZWxpbmUtbWFuYWdlci9jb25maWcueW1sXG4gKiAzLiBQcm9qZWN0IGNvbmZpZyBmaWxlOiBDTElfQ09ORklHX1BBVEggb3IgLi9jb25maWcueW1sXG4gKiA0LiBFbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqXG4gKiBBdXRoIHRva2VuIGNvbWVzIGZyb20gUExBVEZPUk1fVE9LRU4sIGVsc2UgdGhlIHN0b3JlZCBgYXV0aCBsb2dpbmAgc2Vzc2lvbiDigJRcbiAqIG5ldmVyIGZyb20gYSBjb25maWcgZmlsZS5cbiAqL1xuLyoqXG4gKiBSZXNvbHZlIHRoZSBBUEkvY29ubmVjdGlvbiBjb25maWcgKGJhc2UgVVJMLCBTU0wsIHRpbWVvdXRzKSBmcm9tIGZpbGVzIGFuZFxuICogZW52aXJvbm1lbnQgV0lUSE9VVCByZXF1aXJpbmcgYFBMQVRGT1JNX1RPS0VOYC5cbiAqXG4gKiBUaGlzIGlzIHRoZSB0b2tlbi1vcHRpb25hbCBzbGljZSBvZiB7QGxpbmsgZ2V0Q29uZmlnfS4gVGhlIHByZS1hdXRoIGxvZ2luIHN0ZXBcbiAqIChgZW5zdXJlUGxhdGZvcm1Ub2tlbmApIG5lZWRzIHRoZSByZXNvbHZlZCBiYXNlIFVSTCB0byBQT1NUIGAvYXBpL2F1dGgvbG9naW5gXG4gKiAqYmVmb3JlKiBhbnkgdG9rZW4gZXhpc3RzIOKAlCBjYWxsaW5nIGBnZXRDb25maWcoKWAgdGhlcmUgd291bGQgdGhyb3cgb24gdGhlXG4gKiBtaXNzaW5nIHRva2VuIGFuZCBtYWtlIGlubGluZS1sb2dpbiBkZWFkLW9uLWFycml2YWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcGlDb25maWcoKTogT21pdDxDb25maWcsICdhdXRoJz4ge1xuICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aCA9IHByb2Nlc3MuZW52LkNMSV9DT05GSUdfUEFUSCB8fCBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vY29uZmlnLnltbCcpO1xuXG4gIC8vIExheWVyIDE6IGRlZmF1bHRzIOKGkiBMYXllciAyOiB1c2VyIGNvbmZpZyDihpIgTGF5ZXIgMzogcHJvamVjdCBjb25maWcuXG4gIC8vIGBhcGlgIGlzIGNvcGllZCB0b286IGEgc2hhbGxvdyBgeyAuLi5kZWZhdWx0Q29uZmlnIH1gIHNoYXJlcyB0aGUgU0FNRSBgYXBpYFxuICAvLyBvYmplY3QsIHNvIHRoZSBgUExBVEZPUk1fQkFTRV9VUkxgIGFzc2lnbm1lbnQgYmVsb3cgbXV0YXRlZCB0aGUgbW9kdWxlLWxldmVsXG4gIC8vIGRlZmF1bHRzIGFuZCBsZWFrZWQgb25lIGNhbGxlcidzIGJhc2UgVVJMIGludG8gZXZlcnkgbGF0ZXIgcmVzb2x1dGlvbi5cbiAgbGV0IGNvbmZpZyA9IGxvYWRDb25maWdGaWxlKFVTRVJfQ09ORklHX1BBVEgsIHsgYXBpOiB7IC4uLmRlZmF1bHRDb25maWcuYXBpIH0gfSk7XG4gIGNvbmZpZyA9IGxvYWRDb25maWdGaWxlKHByb2plY3RDb25maWdQYXRoLCBjb25maWcpO1xuXG4gIC8vIExheWVyIDQ6IGVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlc1xuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fQkFTRV9VUkwpIHtcbiAgICBjb25maWcuYXBpLmJhc2VVcmwgPSBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTDtcbiAgICBwcmludERlYnVnKCdVc2luZyBQTEFURk9STV9CQVNFX1VSTCBmcm9tIGVudmlyb25tZW50JywgeyBiYXNlVXJsOiBjb25maWcuYXBpLmJhc2VVcmwgfSk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuVExTX1JFSkVDVF9VTkFVVEhPUklaRUQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRpc2FibGUgPSBwcm9jZXNzLmVudi5UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCA9PT0gJzAnO1xuICAgIGlmIChkaXNhYmxlICYmIGlzUHJvZHVjdGlvbkVudigpKSB7XG4gICAgICBwcmludFdhcm5pbmcoJ0lnbm9yaW5nIFRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEPTAgaW4gcHJvZHVjdGlvbiDigJQgU1NMIHZlcmlmaWNhdGlvbiByZW1haW5zIGVuYWJsZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnLmFwaS5yZWplY3RVbmF1dGhvcml6ZWQgPSAhZGlzYWJsZTtcbiAgICAgIGlmIChkaXNhYmxlKSB7XG4gICAgICAgIHByaW50V2FybmluZygnU1NMIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gZGlzYWJsZWQgdmlhIFRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEPTAnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuVVBMT0FEX1RJTUVPVVQpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChwcm9jZXNzLmVudi5VUExPQURfVElNRU9VVCwgMTApO1xuICAgIGlmICghaXNOYU4ocGFyc2VkKSAmJiBwYXJzZWQgPiAwKSB7XG4gICAgICBjb25maWcuYXBpLnVwbG9hZFRpbWVvdXQgPSBwYXJzZWQ7XG4gICAgICBwcmludERlYnVnKCdVc2luZyBVUExPQURfVElNRU9VVCBmcm9tIGVudmlyb25tZW50JywgeyB1cGxvYWRUaW1lb3V0OiBgJHtwYXJzZWR9bXNgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmludFdhcm5pbmcoJ0ludmFsaWQgVVBMT0FEX1RJTUVPVVQgdmFsdWUsIHVzaW5nIGRlZmF1bHQnLCB7IHByb3ZpZGVkOiBwcm9jZXNzLmVudi5VUExPQURfVElNRU9VVCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IENvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IGdldEFwaUNvbmZpZygpO1xuXG4gIC8vIFBMQVRGT1JNX1RPS0VOIHdpbnMgKGFuIGFjY2VzcyBrZXkgaW4gQ0ksIG9yIGFuIGV4cGxpY2l0IGV4cG9ydCk7IG90aGVyd2lzZVxuICAvLyBmYWxsIGJhY2sgdG8gdGhlIHNlc3Npb24gYGF1dGggbG9naW5gIHN0b3JlZCBmb3IgVEhJUyBwbGF0Zm9ybS4gQSBzdG9yZWRcbiAgLy8gc2Vzc2lvbiB0aGF0IGhhcyBhbHJlYWR5IGV4cGlyZWQgaXMgaWdub3JlZCByYXRoZXIgdGhhbiBzZW50IGFuZCByZWplY3RlZCDigJRcbiAgLy8gdGhlIGFzeW5jIHBhdGggKGByZXNvbHZlVG9rZW5gKSByZWZyZXNoZXMgaXQsIGFuZCBldmVyeXRoaW5nIGVsc2UgdGVsbHMgdGhlXG4gIC8vIHVzZXIgdG8gc2lnbiBpbiBhZ2Fpbi5cbiAgY29uc3Qgc3RvcmVkID0gbG9hZFNlc3Npb24oY29uZmlnLmFwaS5iYXNlVXJsKTtcbiAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudi5QTEFURk9STV9UT0tFTiB8fCAoaXNTZXNzaW9uVXNhYmxlKHN0b3JlZCkgPyBzdG9yZWQuYWNjZXNzVG9rZW4gOiB1bmRlZmluZWQpO1xuXG4gIGlmICghdG9rZW4pIHtcbiAgICBwcmludEVycm9yKCdOb3Qgc2lnbmVkIGluOiBubyBQTEFURk9STV9UT0tFTiwgYW5kIG5vIHZhbGlkIHN0b3JlZCBzZXNzaW9uIGZvciB0aGlzIHBsYXRmb3JtJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSdW4gXCJwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW5cIiwgb3Igc2V0IFBMQVRGT1JNX1RPS0VOIHRvIGFuIGFjY2VzcyBrZXknKTtcbiAgfVxuXG4gIGlmICh0b2tlbi50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9UT0tFTiBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgaWYgKHRva2VuLmluY2x1ZGVzKCcgJykpIHtcbiAgICBwcmludFdhcm5pbmcoJ1BMQVRGT1JNX1RPS0VOIGNvbnRhaW5zIHdoaXRlc3BhY2Ug4oCUIHRoaXMgbWF5IGNhdXNlIGlzc3VlcycpO1xuICB9XG5cbiAgcHJpbnREZWJ1ZygnQ29uZmlndXJhdGlvbiBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb25maWcsXG4gICAgYXV0aDogeyB0b2tlbiB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiBhIGNvcHkgb2YgYGNvbmZpZ2Agd2l0aCBTU0wgdmVyaWZpY2F0aW9uIGRpc2FibGVkLiBNb2R1bGUtcHJpdmF0ZSDigJQgdGhlXG4gKiBvbmx5IGNhbGxlciBpcyBgZ2V0Q29uZmlnV2l0aE9wdGlvbnNgIGJlbG93LlxuICovXG5mdW5jdGlvbiB3aXRoU1NMRGlzYWJsZWQoY29uZmlnOiBDb25maWcpOiBDb25maWcge1xuICByZXR1cm4ge1xuICAgIC4uLmNvbmZpZyxcbiAgICBhcGk6IHsgLi4uY29uZmlnLmFwaSwgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9LFxuICB9O1xufVxuXG4vKipcbiAqIExvYWQgY29uZmlndXJhdGlvbiwgb3B0aW9uYWxseSBkaXNhYmxpbmcgU1NMIGJhc2VkIG9uIGNvbW1hbmQgb3B0aW9ucy5cbiAqIFJlcGxhY2VzIHRoZSByZXBlYXRlZCBwYXR0ZXJuOlxuICogICBgb3B0aW9ucy52ZXJpZnlTc2wgPT09IGZhbHNlID8gd2l0aFNTTERpc2FibGVkKGdldENvbmZpZygpKSA6IGdldENvbmZpZygpYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnV2l0aE9wdGlvbnMob3B0aW9uczogeyB2ZXJpZnlTc2w/OiBib29sZWFuIH0pOiBDb25maWcge1xuICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgaWYgKG9wdGlvbnMudmVyaWZ5U3NsID09PSBmYWxzZSkge1xuICAgIC8vIEV2ZXJ5IGF1dGhlbnRpY2F0ZWQgY29tbWFuZCBmbG93cyBpdHMgdG9rZW4gdGhyb3VnaCBoZXJlIOKAlCByZWZ1c2UgdG9cbiAgICAvLyBkaXNhYmxlIGNlcnQgdmVyaWZpY2F0aW9uIGluIHByb2R1Y3Rpb24gKG1pcnJvcnMgdGhlIGxvZ2luL3JlbmV3YWwgZ3VhcmRzKVxuICAgIC8vIHNvIGEgTUlUTSBjYW4ndCBoYXJ2ZXN0IHRoZSBCZWFyZXIgSldULiBOby1vcCBpbiBub24tcHJvZHVjdGlvbi5cbiAgICBhc3NlcnRTc2xEaXNhYmxlQWxsb3dlZCgnYXV0aGVudGljYXRlZCBBUEkgY2xpZW50ICgtLW5vLXZlcmlmeS1zc2wpJyk7XG4gICAgcmV0dXJuIHdpdGhTU0xEaXNhYmxlZChjb25maWcpO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG4iXX0=
@@ -0,0 +1,23 @@
1
+ /** One platform's stored session. */
2
+ export interface StoredSession {
3
+ accessToken: string;
4
+ /** Rotated on every refresh; absent only if the platform stopped issuing one. */
5
+ refreshToken?: string;
6
+ /** Epoch ms the access token expires. */
7
+ expiresAt: number;
8
+ /** The org the session was scoped to when it was stored (informational). */
9
+ organizationId?: string;
10
+ savedAt: string;
11
+ }
12
+ /** Where the sessions live — surfaced in help text and errors. */
13
+ export declare function credentialStorePath(): string;
14
+ /** Persist the session for `baseUrl`, replacing any previous one. */
15
+ export declare function saveSession(baseUrl: string, session: Omit<StoredSession, 'savedAt'>): void;
16
+ /** The stored session for `baseUrl`, or undefined. Expiry is NOT checked here —
17
+ * callers decide whether to use, refresh or ignore it. */
18
+ export declare function loadSession(baseUrl: string): StoredSession | undefined;
19
+ /** Forget the session for `baseUrl` (sign-out, or a refresh the platform rejected). */
20
+ export declare function clearSession(baseUrl: string): void;
21
+ /** True when the stored access token is still usable (with a little slack). */
22
+ export declare function isSessionUsable(session: StoredSession | undefined): session is StoredSession;
23
+ //# sourceMappingURL=credential-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/utils/credential-store.ts"],"names":[],"mappings":"AA+BA,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,kEAAkE;AAClE,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAgCD,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,GAAG,IAAI,CAK1F;AAED;2DAC2D;AAC3D,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEtE;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAalD;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,IAAI,aAAa,CAE5F"}