@sendly/cli 3.34.0 → 3.36.0

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 (34) hide show
  1. package/dist/commands/business-upgrade/cancel.d.ts +12 -0
  2. package/dist/commands/business-upgrade/cancel.js +47 -0
  3. package/dist/commands/business-upgrade/disposition.d.ts +13 -0
  4. package/dist/commands/business-upgrade/disposition.js +44 -0
  5. package/dist/commands/business-upgrade/preflight.d.ts +16 -0
  6. package/dist/commands/business-upgrade/preflight.js +82 -0
  7. package/dist/commands/business-upgrade/resubmit.d.ts +24 -0
  8. package/dist/commands/business-upgrade/resubmit.js +109 -0
  9. package/dist/commands/business-upgrade/start.d.ts +38 -0
  10. package/dist/commands/business-upgrade/start.js +142 -0
  11. package/dist/commands/business-upgrade/status.d.ts +11 -0
  12. package/dist/commands/business-upgrade/status.js +38 -0
  13. package/dist/commands/enterprise/verification/get.d.ts +13 -0
  14. package/dist/commands/enterprise/verification/get.js +78 -0
  15. package/dist/commands/enterprise/verification/resubmit.d.ts +41 -0
  16. package/dist/commands/enterprise/verification/resubmit.js +87 -0
  17. package/dist/commands/enterprise/verification/submit.d.ts +77 -0
  18. package/dist/commands/enterprise/verification/submit.js +212 -0
  19. package/dist/commands/numbers/buy.d.ts +31 -0
  20. package/dist/commands/numbers/buy.js +252 -0
  21. package/dist/commands/numbers/list.d.ts +10 -0
  22. package/dist/commands/numbers/list.js +53 -0
  23. package/dist/commands/numbers/search.d.ts +13 -0
  24. package/dist/commands/numbers/search.js +78 -0
  25. package/dist/commands/webhooks/backfill.js +2 -1
  26. package/dist/commands/webhooks/redeliver.js +2 -1
  27. package/dist/lib/auth.js +2 -94
  28. package/dist/lib/config.js +31 -2
  29. package/dist/lib/detect-install-path.d.ts +11 -7
  30. package/dist/lib/detect-install-path.js +25 -9
  31. package/dist/lib/keypress.d.ts +26 -0
  32. package/dist/lib/keypress.js +103 -0
  33. package/oclif.manifest.json +1931 -622
  34. package/package.json +7 -1
@@ -140,7 +140,36 @@ function initializeConfig() {
140
140
  catch {
141
141
  // Old key also didn't work - corrupted or fresh install
142
142
  }
143
- // Fresh install or corrupted - start with new key
143
+ // Fresh install or corrupted. If a config file exists at this point,
144
+ // both the new key and the old key failed to decrypt it — that means
145
+ // the file was written by a different machine, encrypted with a
146
+ // SENDLY_CONFIG_KEY that no longer matches, or got corrupted.
147
+ // Constructing a new Conf{} here would just re-read the same file and
148
+ // throw the same SyntaxError. Move it aside so the user keeps a copy
149
+ // (in case they recover the key later) and start clean.
150
+ const filePath = path.join(CONFIG_DIR, CONFIG_FILE);
151
+ if (fs.existsSync(filePath)) {
152
+ try {
153
+ const backupPath = `${filePath}.corrupt.${Date.now()}`;
154
+ fs.renameSync(filePath, backupPath);
155
+ // Stay quiet by default — most callers run early in the process
156
+ // before output helpers are wired. A debug breadcrumb is enough.
157
+ if (process.env.DEBUG) {
158
+ process.stderr.write(`[sendly] Could not decrypt ${filePath}; moved to ${backupPath} and starting fresh. Run 'sendly login' to re-authenticate.\n`);
159
+ }
160
+ }
161
+ catch {
162
+ // If we can't move the file (permissions, FS issue), our best
163
+ // remaining option is to delete it — losing it is strictly better
164
+ // than crashing every command.
165
+ try {
166
+ fs.unlinkSync(filePath);
167
+ }
168
+ catch {
169
+ // Give up silently and let Conf throw if it must.
170
+ }
171
+ }
172
+ }
144
173
  return new Conf({
145
174
  projectName: "sendly",
146
175
  cwd: CONFIG_DIR,
@@ -299,4 +328,4 @@ export function clearCurrentOrg() {
299
328
  config.delete("currentOrgSlug");
300
329
  }
301
330
  export { config };
302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUE2QnRDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLElBQUk7SUFDbEIsT0FBTyxDQUFDLENBQUMsQ0FDUCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQjtRQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ3RCLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZTtJQUM3QixPQUFPLENBQUMsQ0FBQyxDQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZTtRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUM1QixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3RELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQztBQUVsQyw0Q0FBNEM7QUFD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Q0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuQyxJQUFJLElBQUk7UUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYTtJQUszQixNQUFNLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNyQixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztBQUN0RSxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QixNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENMSSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnRcbiAqIFN0b3JlcyB1c2VyIHByZWZlcmVuY2VzIGFuZCBjcmVkZW50aWFscyBpbiB+Ly5zZW5kbHkvXG4gKlxuICogRW52aXJvbm1lbnQgVmFyaWFibGVzICh0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb25maWcgZmlsZSk6XG4gKiAtIFNFTkRMWV9BUElfS0VZOiBBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvblxuICogLSBTRU5ETFlfQkFTRV9VUkw6IEN1c3RvbSBBUEkgZW5kcG9pbnRcbiAqIC0gU0VORExZX09VVFBVVF9GT1JNQVQ6IERlZmF1bHQgb3V0cHV0IGZvcm1hdCAoaHVtYW4vanNvbilcbiAqIC0gU0VORExZX05PX0NPTE9SOiBEaXNhYmxlIGNvbG9yZWQgb3V0cHV0IChhbnkgdmFsdWUpXG4gKiAtIFNFTkRMWV9USU1FT1VUOiBSZXF1ZXN0IHRpbWVvdXQgaW4gbXMgKGRlZmF1bHQ6IDMwMDAwKVxuICogLSBTRU5ETFlfTUFYX1JFVFJJRVM6IE1heCByZXRyeSBhdHRlbXB0cyAoZGVmYXVsdDogMylcbiAqIC0gU0VORExZX09SR19JRDogT3ZlcnJpZGUgYWN0aXZlIG9yZ2FuaXphdGlvbiBJRFxuICogLSBTRU5ETFlfQ09ORklHX0tFWTogQ3VzdG9tIGVuY3J5cHRpb24ga2V5IChmb3IgQ0kvQ0QpXG4gKiAtIENJOiBBdXRvLWRldGVjdCBDSSBtb2RlIChkaXNhYmxlcyBpbnRlcmFjdGl2ZSBwcm9tcHRzKVxuICovXG5cbmltcG9ydCBDb25mIGZyb20gXCJjb25mXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRseUNvbmZpZyB7XG4gIC8vIEF1dGhlbnRpY2F0aW9uXG4gIGFwaUtleT86IHN0cmluZztcbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZztcbiAgdG9rZW5FeHBpcmVzQXQ/OiBudW1iZXI7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgZW1haWw/OiBzdHJpbmc7XG5cbiAgLy8gRW52aXJvbm1lbnRcbiAgZW52aXJvbm1lbnQ6IFwidGVzdFwiIHwgXCJsaXZlXCI7XG4gIGJhc2VVcmw6IHN0cmluZztcblxuICAvLyBQcmVmZXJlbmNlc1xuICBkZWZhdWx0Rm9ybWF0OiBcImh1bWFuXCIgfCBcImpzb25cIjtcbiAgY29sb3JFbmFibGVkOiBib29sZWFuO1xuXG4gIC8vIE5ldHdvcmtcbiAgdGltZW91dDogbnVtYmVyO1xuICBtYXhSZXRyaWVzOiBudW1iZXI7XG5cbiAgLy8gT3JnYW5pemF0aW9uXG4gIGN1cnJlbnRPcmdJZD86IHN0cmluZztcbiAgY3VycmVudE9yZ05hbWU/OiBzdHJpbmc7XG4gIGN1cnJlbnRPcmdTbHVnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHJ1bm5pbmcgaW4gQ0kgZW52aXJvbm1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ0koKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIShcbiAgICBwcm9jZXNzLmVudi5DSSB8fFxuICAgIHByb2Nlc3MuZW52LkNPTlRJTlVPVVNfSU5URUdSQVRJT04gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfQUNUSU9OUyB8fFxuICAgIHByb2Nlc3MuZW52LkdJVExBQl9DSSB8fFxuICAgIHByb2Nlc3MuZW52LkNJUkNMRUNJIHx8XG4gICAgcHJvY2Vzcy5lbnYuVFJBVklTIHx8XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERLSVRFXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgY29sb3Igb3V0cHV0IGlzIGRpc2FibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbG9yRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIShcbiAgICBwcm9jZXNzLmVudi5TRU5ETFlfTk9fQ09MT1IgfHxcbiAgICBwcm9jZXNzLmVudi5OT19DT0xPUiB8fFxuICAgIHByb2Nlc3MuZW52LlRFUk0gPT09IFwiZHVtYlwiXG4gICk7XG59XG5cbmNvbnN0IENPTkZJR19ESVIgPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCBcIi5zZW5kbHlcIik7XG5jb25zdCBDT05GSUdfRklMRSA9IFwiY29uZmlnLmpzb25cIjtcblxuLy8gT2xkIGRlZmF1bHQga2V5IC0gdXNlZCBmb3IgbWlncmF0aW9uIG9ubHlcbmNvbnN0IE9MRF9ERUZBVUxUX0tFWSA9IFwic2VuZGx5LWNsaS1kZWZhdWx0LWtleS12MVwiO1xuXG4vKipcbiAqIERlcml2ZSBhIG1hY2hpbmUtc3BlY2lmaWMgZW5jcnlwdGlvbiBrZXkuXG4gKiBUaGlzIGVuc3VyZXMgZWFjaCBpbnN0YWxsYXRpb24gaGFzIGEgdW5pcXVlIGtleSB0aGF0IGNhbid0IGJlIGVhc2lseSBndWVzc2VkLlxuICpcbiAqIFRoZSBrZXkgaXMgZGVyaXZlZCBmcm9tIG1hY2hpbmUtc3BlY2lmaWMgaWRlbnRpZmllcnMgdGhhdCBhcmU6XG4gKiAtIFVuaXF1ZSBwZXIgbWFjaGluZVxuICogLSBTdGFibGUgYWNyb3NzIHNlc3Npb25zXG4gKiAtIE5vdCBwdWJsaWNseSBrbm93blxuICovXG5mdW5jdGlvbiBkZXJpdmVFbmNyeXB0aW9uS2V5KCk6IHN0cmluZyB7XG4gIGNvbnN0IG1hY2hpbmVJZCA9IFtvcy5ob3N0bmFtZSgpLCBvcy51c2VySW5mbygpLnVzZXJuYW1lLCBvcy5ob21lZGlyKCldLmpvaW4oXG4gICAgXCI6XCIsXG4gICk7XG5cbiAgcmV0dXJuIGNyeXB0b1xuICAgIC5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgLnVwZGF0ZShgc2VuZGx5OiR7bWFjaGluZUlkfTp2MmApXG4gICAgLmRpZ2VzdChcImhleFwiKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGVuY3J5cHRpb24ga2V5IHRvIHVzZSBmb3IgY29uZmlnLlxuICogUHJpb3JpdHk6IFNFTkRMWV9DT05GSUdfS0VZIGVudiB2YXIgPiBtYWNoaW5lLWRlcml2ZWQga2V5XG4gKi9cbmZ1bmN0aW9uIGdldEVuY3J5cHRpb25LZXkoKTogc3RyaW5nIHtcbiAgLy8gRXhwbGljaXQga2V5IHRha2VzIHByZWNlZGVuY2UgKGZvciBDSS9DRCwgdGVzdGluZywgYWR2YW5jZWQgdXNlcnMpXG4gIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfQ09ORklHX0tFWSkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5TRU5ETFlfQ09ORklHX0tFWTtcbiAgfVxuICByZXR1cm4gZGVyaXZlRW5jcnlwdGlvbktleSgpO1xufVxuXG4vLyBFbnN1cmUgY29uZmlnIGRpcmVjdG9yeSBleGlzdHMgd2l0aCBzZWN1cmUgcGVybWlzc2lvbnNcbmlmICghZnMuZXhpc3RzU3luYyhDT05GSUdfRElSKSkge1xuICBmcy5ta2RpclN5bmMoQ09ORklHX0RJUiwgeyByZWN1cnNpdmU6IHRydWUsIG1vZGU6IDBvNzAwIH0pO1xufVxuXG5jb25zdCBERUZBVUxUX0NPTkZJRzogU2VuZGx5Q29uZmlnID0ge1xuICBlbnZpcm9ubWVudDogXCJ0ZXN0XCIsXG4gIGJhc2VVcmw6IFwiaHR0cHM6Ly9zZW5kbHkubGl2ZVwiLFxuICBkZWZhdWx0Rm9ybWF0OiBcImh1bWFuXCIsXG4gIGNvbG9yRW5hYmxlZDogdHJ1ZSxcbiAgdGltZW91dDogMzAwMDAsXG4gIG1heFJldHJpZXM6IDMsXG59O1xuXG4vKipcbiAqIEluaXRpYWxpemUgY29uZmlnIHdpdGggYXV0b21hdGljIG1pZ3JhdGlvbiBmcm9tIG9sZCBlbmNyeXB0aW9uIGtleS5cbiAqIFRoaXMgZW5zdXJlcyBleGlzdGluZyB1c2VycyBkb24ndCBsb3NlIHRoZWlyIGNyZWRlbnRpYWxzLlxuICovXG5mdW5jdGlvbiBpbml0aWFsaXplQ29uZmlnKCk6IENvbmY8U2VuZGx5Q29uZmlnPiB7XG4gIGNvbnN0IG5ld0tleSA9IGdldEVuY3J5cHRpb25LZXkoKTtcblxuICAvLyBUcnkgdG8gaW5pdGlhbGl6ZSB3aXRoIG5ldyBrZXkgZmlyc3RcbiAgdHJ5IHtcbiAgICBjb25zdCBuZXdDb25maWcgPSBuZXcgQ29uZjxTZW5kbHlDb25maWc+KHtcbiAgICAgIHByb2plY3ROYW1lOiBcInNlbmRseVwiLFxuICAgICAgY3dkOiBDT05GSUdfRElSLFxuICAgICAgY29uZmlnTmFtZTogXCJjb25maWdcIixcbiAgICAgIGRlZmF1bHRzOiBERUZBVUxUX0NPTkZJRyxcbiAgICAgIGVuY3J5cHRpb25LZXk6IG5ld0tleSxcbiAgICB9KTtcblxuICAgIC8vIFRyeSB0byByZWFkIGEgdmFsdWUgdG8gdmVyaWZ5IGRlY3J5cHRpb24gd29ya3NcbiAgICBuZXdDb25maWcuZ2V0KFwiZW52aXJvbm1lbnRcIik7XG4gICAgcmV0dXJuIG5ld0NvbmZpZztcbiAgfSBjYXRjaCB7XG4gICAgLy8gTmV3IGtleSBkaWRuJ3Qgd29yayAtIHRyeSBtaWdyYXRpb24gZnJvbSBvbGQga2V5XG4gIH1cblxuICAvLyBNaWdyYXRpb246IFRyeSB0byByZWFkIHdpdGggb2xkIGRlZmF1bHQga2V5XG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29uZmlnID0gbmV3IENvbmY8U2VuZGx5Q29uZmlnPih7XG4gICAgICBwcm9qZWN0TmFtZTogXCJzZW5kbHlcIixcbiAgICAgIGN3ZDogQ09ORklHX0RJUixcbiAgICAgIGNvbmZpZ05hbWU6IFwiY29uZmlnXCIsXG4gICAgICBkZWZhdWx0czogREVGQVVMVF9DT05GSUcsXG4gICAgICBlbmNyeXB0aW9uS2V5OiBPTERfREVGQVVMVF9LRVksXG4gICAgfSk7XG5cbiAgICAvLyBSZWFkIGFsbCBkYXRhIHdpdGggb2xkIGtleVxuICAgIGNvbnN0IG9sZERhdGEgPSB7IC4uLm9sZENvbmZpZy5zdG9yZSB9O1xuICAgIGNvbnN0IGhhc0RhdGEgPSBPYmplY3Qua2V5cyhvbGREYXRhKS5zb21lKFxuICAgICAgKGspID0+XG4gICAgICAgICFPYmplY3Qua2V5cyhERUZBVUxUX0NPTkZJRykuaW5jbHVkZXMoaykgfHxcbiAgICAgICAgb2xkRGF0YVtrIGFzIGtleW9mIFNlbmRseUNvbmZpZ10gIT09XG4gICAgICAgICAgREVGQVVMVF9DT05GSUdbayBhcyBrZXlvZiBTZW5kbHlDb25maWddLFxuICAgICk7XG5cbiAgICBpZiAoaGFzRGF0YSkge1xuICAgICAgLy8gQ2xlYXIgb2xkIGNvbmZpZyBmaWxlXG4gICAgICBvbGRDb25maWcuY2xlYXIoKTtcblxuICAgICAgLy8gQ3JlYXRlIG5ldyBjb25maWcgd2l0aCBuZXcga2V5XG4gICAgICBjb25zdCBuZXdDb25maWcgPSBuZXcgQ29uZjxTZW5kbHlDb25maWc+KHtcbiAgICAgICAgcHJvamVjdE5hbWU6IFwic2VuZGx5XCIsXG4gICAgICAgIGN3ZDogQ09ORklHX0RJUixcbiAgICAgICAgY29uZmlnTmFtZTogXCJjb25maWdcIixcbiAgICAgICAgZGVmYXVsdHM6IERFRkFVTFRfQ09ORklHLFxuICAgICAgICBlbmNyeXB0aW9uS2V5OiBuZXdLZXksXG4gICAgICB9KTtcblxuICAgICAgLy8gUmVzdG9yZSBkYXRhIHdpdGggbmV3IGVuY3J5cHRpb25cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9sZERhdGEpKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3Q29uZmlnLnNldChrZXkgYXMga2V5b2YgU2VuZGx5Q29uZmlnLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld0NvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE9sZCBrZXkgYWxzbyBkaWRuJ3Qgd29yayAtIGNvcnJ1cHRlZCBvciBmcmVzaCBpbnN0YWxsXG4gIH1cblxuICAvLyBGcmVzaCBpbnN0YWxsIG9yIGNvcnJ1cHRlZCAtIHN0YXJ0IHdpdGggbmV3IGtleVxuICByZXR1cm4gbmV3IENvbmY8U2VuZGx5Q29uZmlnPih7XG4gICAgcHJvamVjdE5hbWU6IFwic2VuZGx5XCIsXG4gICAgY3dkOiBDT05GSUdfRElSLFxuICAgIGNvbmZpZ05hbWU6IFwiY29uZmlnXCIsXG4gICAgZGVmYXVsdHM6IERFRkFVTFRfQ09ORklHLFxuICAgIGVuY3J5cHRpb25LZXk6IG5ld0tleSxcbiAgfSk7XG59XG5cbmNvbnN0IGNvbmZpZyA9IGluaXRpYWxpemVDb25maWcoKTtcblxuLyoqXG4gKiBHZXQgZWZmZWN0aXZlIGNvbmZpZyB2YWx1ZSB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlXG4gKiBQcmlvcml0eTogZW52IHZhciA+IGNvbmZpZyBmaWxlID4gZGVmYXVsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWZmZWN0aXZlVmFsdWU8SyBleHRlbmRzIGtleW9mIFNlbmRseUNvbmZpZz4oXG4gIGtleTogSyxcbik6IFNlbmRseUNvbmZpZ1tLXSB7XG4gIC8vIEVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlc1xuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgXCJhcGlLZXlcIjpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfQVBJX0tFWSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VORExZX0FQSV9LRVkgYXMgU2VuZGx5Q29uZmlnW0tdO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImJhc2VVcmxcIjpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfQkFTRV9VUkwpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LlNFTkRMWV9CQVNFX1VSTCBhcyBTZW5kbHlDb25maWdbS107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiZGVmYXVsdEZvcm1hdFwiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9PVVRQVVRfRk9STUFUKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHByb2Nlc3MuZW52LlNFTkRMWV9PVVRQVVRfRk9STUFULnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwianNvblwiIHx8IGZvcm1hdCA9PT0gXCJodW1hblwiKSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdCBhcyBTZW5kbHlDb25maWdbS107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjb2xvckVuYWJsZWRcIjpcbiAgICAgIGlmIChpc0NvbG9yRGlzYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2UgYXMgU2VuZGx5Q29uZmlnW0tdO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRpbWVvdXRcIjpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfVElNRU9VVCkge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuU0VORExZX1RJTUVPVVQsIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTih0aW1lb3V0KSAmJiB0aW1lb3V0ID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aW1lb3V0IGFzIFNlbmRseUNvbmZpZ1tLXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm1heFJldHJpZXNcIjpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgY29uc3QgcmV0cmllcyA9IHBhcnNlSW50KHByb2Nlc3MuZW52LlNFTkRMWV9NQVhfUkVUUklFUywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHJldHJpZXMpICYmIHJldHJpZXMgPj0gMCkge1xuICAgICAgICAgIHJldHVybiByZXRyaWVzIGFzIFNlbmRseUNvbmZpZ1tLXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImN1cnJlbnRPcmdJZFwiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9PUkdfSUQpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LlNFTkRMWV9PUkdfSUQgYXMgU2VuZGx5Q29uZmlnW0tdO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gY29uZmlnIGZpbGUgdmFsdWVcbiAgcmV0dXJuIGNvbmZpZy5nZXQoa2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZygpOiBTZW5kbHlDb25maWcge1xuICByZXR1cm4gY29uZmlnLnN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29uZmlnPEsgZXh0ZW5kcyBrZXlvZiBTZW5kbHlDb25maWc+KFxuICBrZXk6IEssXG4gIHZhbHVlOiBTZW5kbHlDb25maWdbS10sXG4pOiB2b2lkIHtcbiAgY29uZmlnLnNldChrZXksIHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ1ZhbHVlPEsgZXh0ZW5kcyBrZXlvZiBTZW5kbHlDb25maWc+KFxuICBrZXk6IEssXG4pOiBTZW5kbHlDb25maWdbS10ge1xuICByZXR1cm4gY29uZmlnLmdldChrZXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWcoKTogdm9pZCB7XG4gIGNvbmZpZy5jbGVhcigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJBdXRoKCk6IHZvaWQge1xuICBjb25maWcuZGVsZXRlKFwiYXBpS2V5XCIpO1xuICBjb25maWcuZGVsZXRlKFwiYWNjZXNzVG9rZW5cIik7XG4gIGNvbmZpZy5kZWxldGUoXCJyZWZyZXNoVG9rZW5cIik7XG4gIGNvbmZpZy5kZWxldGUoXCJ0b2tlbkV4cGlyZXNBdFwiKTtcbiAgY29uZmlnLmRlbGV0ZShcInVzZXJJZFwiKTtcbiAgY29uZmlnLmRlbGV0ZShcImVtYWlsXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAvLyBDaGVjayBlbnYgdmFyIGZpcnN0XG4gIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfQVBJX0tFWSkgcmV0dXJuIHRydWU7XG5cbiAgY29uc3QgYXBpS2V5ID0gY29uZmlnLmdldChcImFwaUtleVwiKTtcbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBjb25maWcuZ2V0KFwiYWNjZXNzVG9rZW5cIik7XG4gIHJldHVybiAhIShhcGlLZXkgfHwgYWNjZXNzVG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXV0aFRva2VuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIEVudmlyb25tZW50IHZhcmlhYmxlIHRha2VzIGhpZ2hlc3QgcHJlY2VkZW5jZVxuICBpZiAocHJvY2Vzcy5lbnYuU0VORExZX0FQSV9LRVkpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VORExZX0FQSV9LRVk7XG4gIH1cblxuICAvLyBUaGVuIHN0b3JlZCBBUEkga2V5XG4gIGNvbnN0IGFwaUtleSA9IGNvbmZpZy5nZXQoXCJhcGlLZXlcIik7XG4gIGlmIChhcGlLZXkpIHJldHVybiBhcGlLZXk7XG5cbiAgLy8gRmluYWxseSwgYWNjZXNzIHRva2VuIChpZiBub3QgZXhwaXJlZClcbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBjb25maWcuZ2V0KFwiYWNjZXNzVG9rZW5cIik7XG4gIGNvbnN0IGV4cGlyZXNBdCA9IGNvbmZpZy5nZXQoXCJ0b2tlbkV4cGlyZXNBdFwiKTtcblxuICBpZiAoYWNjZXNzVG9rZW4gJiYgZXhwaXJlc0F0ICYmIERhdGUubm93KCkgPCBleHBpcmVzQXQpIHtcbiAgICByZXR1cm4gYWNjZXNzVG9rZW47XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmVkQWNjZXNzVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbmZpZy5nZXQoXCJhY2Nlc3NUb2tlblwiKSB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBcGlLZXkoYXBpS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gVmFsaWRhdGUgQVBJIGtleSBmb3JtYXRcbiAgaWYgKCEvXnNrXyh0ZXN0fGxpdmUpX3YxX1thLXpBLVowLTlfLV0rJC8udGVzdChhcGlLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJJbnZhbGlkIEFQSSBrZXkgZm9ybWF0LiBFeHBlY3RlZCBza190ZXN0X3YxX3h4eCBvciBza19saXZlX3YxX3h4eFwiLFxuICAgICk7XG4gIH1cblxuICBjb25maWcuc2V0KFwiYXBpS2V5XCIsIGFwaUtleSk7XG5cbiAgLy8gU2V0IGVudmlyb25tZW50IGJhc2VkIG9uIGtleSB0eXBlXG4gIGlmIChhcGlLZXkuc3RhcnRzV2l0aChcInNrX3Rlc3RfXCIpKSB7XG4gICAgY29uZmlnLnNldChcImVudmlyb25tZW50XCIsIFwidGVzdFwiKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcuc2V0KFwiZW52aXJvbm1lbnRcIiwgXCJsaXZlXCIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBdXRoVG9rZW5zKFxuICBhY2Nlc3NUb2tlbjogc3RyaW5nLFxuICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgZXhwaXJlc0luOiBudW1iZXIsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBlbWFpbDogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGNvbmZpZy5zZXQoXCJhY2Nlc3NUb2tlblwiLCBhY2Nlc3NUb2tlbik7XG4gIGNvbmZpZy5zZXQoXCJyZWZyZXNoVG9rZW5cIiwgcmVmcmVzaFRva2VuKTtcbiAgY29uZmlnLnNldChcInRva2VuRXhwaXJlc0F0XCIsIERhdGUubm93KCkgKyBleHBpcmVzSW4gKiAxMDAwKTtcbiAgY29uZmlnLnNldChcInVzZXJJZFwiLCB1c2VySWQpO1xuICBjb25maWcuc2V0KFwiZW1haWxcIiwgZW1haWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKENPTkZJR19ESVIsIENPTkZJR19GSUxFKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ0RpcigpOiBzdHJpbmcge1xuICByZXR1cm4gQ09ORklHX0RJUjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEN1cnJlbnRPcmcoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBzbHVnPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbmZpZy5zZXQoXCJjdXJyZW50T3JnSWRcIiwgaWQpO1xuICBjb25maWcuc2V0KFwiY3VycmVudE9yZ05hbWVcIiwgbmFtZSk7XG4gIGlmIChzbHVnKSBjb25maWcuc2V0KFwiY3VycmVudE9yZ1NsdWdcIiwgc2x1Zyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50T3JnKCk6IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBzbHVnPzogc3RyaW5nO1xufSB8IG51bGwge1xuICBjb25zdCBpZCA9IGdldEVmZmVjdGl2ZVZhbHVlKFwiY3VycmVudE9yZ0lkXCIpO1xuICBjb25zdCBuYW1lID0gY29uZmlnLmdldChcImN1cnJlbnRPcmdOYW1lXCIpO1xuICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsgaWQsIG5hbWU6IG5hbWUgfHwgaWQsIHNsdWc6IGNvbmZpZy5nZXQoXCJjdXJyZW50T3JnU2x1Z1wiKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDdXJyZW50T3JnKCk6IHZvaWQge1xuICBjb25maWcuZGVsZXRlKFwiY3VycmVudE9yZ0lkXCIpO1xuICBjb25maWcuZGVsZXRlKFwiY3VycmVudE9yZ05hbWVcIik7XG4gIGNvbmZpZy5kZWxldGUoXCJjdXJyZW50T3JnU2x1Z1wiKTtcbn1cblxuZXhwb3J0IHsgY29uZmlnIH07XG4iXX0=
331
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUE2QnRDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLElBQUk7SUFDbEIsT0FBTyxDQUFDLENBQUMsQ0FDUCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQjtRQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ3RCLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZTtJQUM3QixPQUFPLENBQUMsQ0FBQyxDQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZTtRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUM1QixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3RELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQztBQUVsQyw0Q0FBNEM7QUFDNUMsTUFBTSxlQUFlLEdBQUcsMkJBQTJCLENBQUM7QUFFcEQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLG1CQUFtQjtJQUMxQixNQUFNLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDMUUsR0FBRyxDQUNKLENBQUM7SUFFRixPQUFPLE1BQU07U0FDVixVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3BCLE1BQU0sQ0FBQyxVQUFVLFNBQVMsS0FBSyxDQUFDO1NBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0I7SUFDdkIscUVBQXFFO0lBQ3JFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxtQkFBbUIsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCx5REFBeUQ7QUFDekQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztJQUMvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELE1BQU0sY0FBYyxHQUFpQjtJQUNuQyxXQUFXLEVBQUUsTUFBTTtJQUNuQixPQUFPLEVBQUUscUJBQXFCO0lBQzlCLGFBQWEsRUFBRSxPQUFPO0lBQ3RCLFlBQVksRUFBRSxJQUFJO0lBQ2xCLE9BQU8sRUFBRSxLQUFLO0lBQ2QsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0I7SUFDdkIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztJQUVsQyx1Q0FBdUM7SUFDdkMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQWU7WUFDdkMsV0FBVyxFQUFFLFFBQVE7WUFDckIsR0FBRyxFQUFFLFVBQVU7WUFDZixVQUFVLEVBQUUsUUFBUTtZQUNwQixRQUFRLEVBQUUsY0FBYztZQUN4QixhQUFhLEVBQUUsTUFBTTtTQUN0QixDQUFDLENBQUM7UUFFSCxpREFBaUQ7UUFDakQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsbURBQW1EO0lBQ3JELENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQWU7WUFDdkMsV0FBVyxFQUFFLFFBQVE7WUFDckIsR0FBRyxFQUFFLFVBQVU7WUFDZixVQUFVLEVBQUUsUUFBUTtZQUNwQixRQUFRLEVBQUUsY0FBYztZQUN4QixhQUFhLEVBQUUsZUFBZTtTQUMvQixDQUFDLENBQUM7UUFFSCw2QkFBNkI7UUFDN0IsTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDdkMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxDQUF1QixDQUFDO2dCQUM5QixjQUFjLENBQUMsQ0FBdUIsQ0FBQyxDQUM1QyxDQUFDO1FBRUYsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLHdCQUF3QjtZQUN4QixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFbEIsaUNBQWlDO1lBQ2pDLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFlO2dCQUN2QyxXQUFXLEVBQUUsUUFBUTtnQkFDckIsR0FBRyxFQUFFLFVBQVU7Z0JBQ2YsVUFBVSxFQUFFLFFBQVE7Z0JBQ3BCLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixhQUFhLEVBQUUsTUFBTTthQUN0QixDQUFDLENBQUM7WUFFSCxtQ0FBbUM7WUFDbkMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3hCLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBeUIsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHdEQUF3RDtJQUMxRCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLHFFQUFxRTtJQUNyRSxnRUFBZ0U7SUFDaEUsOERBQThEO0lBQzlELHNFQUFzRTtJQUN0RSxxRUFBcUU7SUFDckUsd0RBQXdEO0lBQ3hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLEdBQUcsUUFBUSxZQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BDLGdFQUFnRTtZQUNoRSxpRUFBaUU7WUFDakUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN0QixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDbEIsOEJBQThCLFFBQVEsY0FBYyxVQUFVLCtEQUErRCxDQUM5SCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCw4REFBOEQ7WUFDOUQsa0VBQWtFO1lBQ2xFLCtCQUErQjtZQUMvQixJQUFJLENBQUM7Z0JBQ0gsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLGtEQUFrRDtZQUNwRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksSUFBSSxDQUFlO1FBQzVCLFdBQVcsRUFBRSxRQUFRO1FBQ3JCLEdBQUcsRUFBRSxVQUFVO1FBQ2YsVUFBVSxFQUFFLFFBQVE7UUFDcEIsUUFBUSxFQUFFLGNBQWM7UUFDeEIsYUFBYSxFQUFFLE1BQU07S0FDdEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixFQUFFLENBQUM7QUFFbEM7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixHQUFNO0lBRU4saUNBQWlDO0lBQ2pDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDWixLQUFLLFFBQVE7WUFDWCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFpQyxDQUFDO1lBQ3ZELENBQUM7WUFDRCxNQUFNO1FBQ1IsS0FBSyxTQUFTO1lBQ1osSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBa0MsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsTUFBTTtRQUNSLEtBQUssZUFBZTtZQUNsQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDOUQsSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDNUMsT0FBTyxNQUF5QixDQUFDO2dCQUNuQyxDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU07UUFDUixLQUFLLGNBQWM7WUFDakIsSUFBSSxlQUFlLEVBQUUsRUFBRSxDQUFDO2dCQUN0QixPQUFPLEtBQXdCLENBQUM7WUFDbEMsQ0FBQztZQUNELE1BQU07UUFDUixLQUFLLFNBQVM7WUFDWixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ25DLE9BQU8sT0FBMEIsQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNO1FBQ1IsS0FBSyxZQUFZO1lBQ2YsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ25DLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsT0FBTyxPQUEwQixDQUFDO2dCQUNwQyxDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU07UUFDUixLQUFLLGNBQWM7WUFDakIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUM5QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBZ0MsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsTUFBTTtJQUNWLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUztJQUN2QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDdEIsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQ3ZCLEdBQU0sRUFDTixLQUFzQjtJQUV0QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsR0FBTTtJQUVOLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVc7SUFDekIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2pCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUztJQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QixNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZTtJQUM3QixzQkFBc0I7SUFDdEIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZO0lBQzFCLGdEQUFnRDtJQUNoRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0IsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsSUFBSSxNQUFNO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFFMUIseUNBQXlDO0lBQ3pDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRS9DLElBQUksV0FBVyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFDdkQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDaEQsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBYztJQUN0QywwQkFBMEI7SUFDMUIsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQ2IsbUVBQW1FLENBQ3BFLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFN0Isb0NBQW9DO0lBQ3BDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUMzQixXQUFtQixFQUNuQixZQUFvQixFQUNwQixTQUFpQixFQUNqQixNQUFjLEVBQ2QsS0FBYTtJQUViLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM1RCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWE7SUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVk7SUFDMUIsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsRUFBVSxFQUFFLElBQVksRUFBRSxJQUFhO0lBQ25FLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkMsSUFBSSxJQUFJO1FBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWE7SUFLM0IsTUFBTSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDN0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FBQyxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDckIsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7QUFDdEUsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlO0lBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDOUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDTEkgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50XG4gKiBTdG9yZXMgdXNlciBwcmVmZXJlbmNlcyBhbmQgY3JlZGVudGlhbHMgaW4gfi8uc2VuZGx5L1xuICpcbiAqIEVudmlyb25tZW50IFZhcmlhYmxlcyAodGFrZSBwcmVjZWRlbmNlIG92ZXIgY29uZmlnIGZpbGUpOlxuICogLSBTRU5ETFlfQVBJX0tFWTogQVBJIGtleSBmb3IgYXV0aGVudGljYXRpb25cbiAqIC0gU0VORExZX0JBU0VfVVJMOiBDdXN0b20gQVBJIGVuZHBvaW50XG4gKiAtIFNFTkRMWV9PVVRQVVRfRk9STUFUOiBEZWZhdWx0IG91dHB1dCBmb3JtYXQgKGh1bWFuL2pzb24pXG4gKiAtIFNFTkRMWV9OT19DT0xPUjogRGlzYWJsZSBjb2xvcmVkIG91dHB1dCAoYW55IHZhbHVlKVxuICogLSBTRU5ETFlfVElNRU9VVDogUmVxdWVzdCB0aW1lb3V0IGluIG1zIChkZWZhdWx0OiAzMDAwMClcbiAqIC0gU0VORExZX01BWF9SRVRSSUVTOiBNYXggcmV0cnkgYXR0ZW1wdHMgKGRlZmF1bHQ6IDMpXG4gKiAtIFNFTkRMWV9PUkdfSUQ6IE92ZXJyaWRlIGFjdGl2ZSBvcmdhbml6YXRpb24gSURcbiAqIC0gU0VORExZX0NPTkZJR19LRVk6IEN1c3RvbSBlbmNyeXB0aW9uIGtleSAoZm9yIENJL0NEKVxuICogLSBDSTogQXV0by1kZXRlY3QgQ0kgbW9kZSAoZGlzYWJsZXMgaW50ZXJhY3RpdmUgcHJvbXB0cylcbiAqL1xuXG5pbXBvcnQgQ29uZiBmcm9tIFwiY29uZlwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuZXhwb3J0IGludGVyZmFjZSBTZW5kbHlDb25maWcge1xuICAvLyBBdXRoZW50aWNhdGlvblxuICBhcGlLZXk/OiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIHRva2VuRXhwaXJlc0F0PzogbnVtYmVyO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuXG4gIC8vIEVudmlyb25tZW50XG4gIGVudmlyb25tZW50OiBcInRlc3RcIiB8IFwibGl2ZVwiO1xuICBiYXNlVXJsOiBzdHJpbmc7XG5cbiAgLy8gUHJlZmVyZW5jZXNcbiAgZGVmYXVsdEZvcm1hdDogXCJodW1hblwiIHwgXCJqc29uXCI7XG4gIGNvbG9yRW5hYmxlZDogYm9vbGVhbjtcblxuICAvLyBOZXR3b3JrXG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAgbWF4UmV0cmllczogbnVtYmVyO1xuXG4gIC8vIE9yZ2FuaXphdGlvblxuICBjdXJyZW50T3JnSWQ/OiBzdHJpbmc7XG4gIGN1cnJlbnRPcmdOYW1lPzogc3RyaW5nO1xuICBjdXJyZW50T3JnU2x1Zz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBydW5uaW5nIGluIENJIGVudmlyb25tZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NJKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEoXG4gICAgcHJvY2Vzcy5lbnYuQ0kgfHxcbiAgICBwcm9jZXNzLmVudi5DT05USU5VT1VTX0lOVEVHUkFUSU9OIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX0FDVElPTlMgfHxcbiAgICBwcm9jZXNzLmVudi5HSVRMQUJfQ0kgfHxcbiAgICBwcm9jZXNzLmVudi5DSVJDTEVDSSB8fFxuICAgIHByb2Nlc3MuZW52LlRSQVZJUyB8fFxuICAgIHByb2Nlc3MuZW52LkJVSUxES0lURVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGNvbG9yIG91dHB1dCBpcyBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xvckRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEoXG4gICAgcHJvY2Vzcy5lbnYuU0VORExZX05PX0NPTE9SIHx8XG4gICAgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgfHxcbiAgICBwcm9jZXNzLmVudi5URVJNID09PSBcImR1bWJcIlxuICApO1xufVxuXG5jb25zdCBDT05GSUdfRElSID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgXCIuc2VuZGx5XCIpO1xuY29uc3QgQ09ORklHX0ZJTEUgPSBcImNvbmZpZy5qc29uXCI7XG5cbi8vIE9sZCBkZWZhdWx0IGtleSAtIHVzZWQgZm9yIG1pZ3JhdGlvbiBvbmx5XG5jb25zdCBPTERfREVGQVVMVF9LRVkgPSBcInNlbmRseS1jbGktZGVmYXVsdC1rZXktdjFcIjtcblxuLyoqXG4gKiBEZXJpdmUgYSBtYWNoaW5lLXNwZWNpZmljIGVuY3J5cHRpb24ga2V5LlxuICogVGhpcyBlbnN1cmVzIGVhY2ggaW5zdGFsbGF0aW9uIGhhcyBhIHVuaXF1ZSBrZXkgdGhhdCBjYW4ndCBiZSBlYXNpbHkgZ3Vlc3NlZC5cbiAqXG4gKiBUaGUga2V5IGlzIGRlcml2ZWQgZnJvbSBtYWNoaW5lLXNwZWNpZmljIGlkZW50aWZpZXJzIHRoYXQgYXJlOlxuICogLSBVbmlxdWUgcGVyIG1hY2hpbmVcbiAqIC0gU3RhYmxlIGFjcm9zcyBzZXNzaW9uc1xuICogLSBOb3QgcHVibGljbHkga25vd25cbiAqL1xuZnVuY3Rpb24gZGVyaXZlRW5jcnlwdGlvbktleSgpOiBzdHJpbmcge1xuICBjb25zdCBtYWNoaW5lSWQgPSBbb3MuaG9zdG5hbWUoKSwgb3MudXNlckluZm8oKS51c2VybmFtZSwgb3MuaG9tZWRpcigpXS5qb2luKFxuICAgIFwiOlwiLFxuICApO1xuXG4gIHJldHVybiBjcnlwdG9cbiAgICAuY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUoYHNlbmRseToke21hY2hpbmVJZH06djJgKVxuICAgIC5kaWdlc3QoXCJoZXhcIik7XG59XG5cbi8qKlxuICogR2V0IHRoZSBlbmNyeXB0aW9uIGtleSB0byB1c2UgZm9yIGNvbmZpZy5cbiAqIFByaW9yaXR5OiBTRU5ETFlfQ09ORklHX0tFWSBlbnYgdmFyID4gbWFjaGluZS1kZXJpdmVkIGtleVxuICovXG5mdW5jdGlvbiBnZXRFbmNyeXB0aW9uS2V5KCk6IHN0cmluZyB7XG4gIC8vIEV4cGxpY2l0IGtleSB0YWtlcyBwcmVjZWRlbmNlIChmb3IgQ0kvQ0QsIHRlc3RpbmcsIGFkdmFuY2VkIHVzZXJzKVxuICBpZiAocHJvY2Vzcy5lbnYuU0VORExZX0NPTkZJR19LRVkpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VORExZX0NPTkZJR19LRVk7XG4gIH1cbiAgcmV0dXJuIGRlcml2ZUVuY3J5cHRpb25LZXkoKTtcbn1cblxuLy8gRW5zdXJlIGNvbmZpZyBkaXJlY3RvcnkgZXhpc3RzIHdpdGggc2VjdXJlIHBlcm1pc3Npb25zXG5pZiAoIWZzLmV4aXN0c1N5bmMoQ09ORklHX0RJUikpIHtcbiAgZnMubWtkaXJTeW5jKENPTkZJR19ESVIsIHsgcmVjdXJzaXZlOiB0cnVlLCBtb2RlOiAwbzcwMCB9KTtcbn1cblxuY29uc3QgREVGQVVMVF9DT05GSUc6IFNlbmRseUNvbmZpZyA9IHtcbiAgZW52aXJvbm1lbnQ6IFwidGVzdFwiLFxuICBiYXNlVXJsOiBcImh0dHBzOi8vc2VuZGx5LmxpdmVcIixcbiAgZGVmYXVsdEZvcm1hdDogXCJodW1hblwiLFxuICBjb2xvckVuYWJsZWQ6IHRydWUsXG4gIHRpbWVvdXQ6IDMwMDAwLFxuICBtYXhSZXRyaWVzOiAzLFxufTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGNvbmZpZyB3aXRoIGF1dG9tYXRpYyBtaWdyYXRpb24gZnJvbSBvbGQgZW5jcnlwdGlvbiBrZXkuXG4gKiBUaGlzIGVuc3VyZXMgZXhpc3RpbmcgdXNlcnMgZG9uJ3QgbG9zZSB0aGVpciBjcmVkZW50aWFscy5cbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZygpOiBDb25mPFNlbmRseUNvbmZpZz4ge1xuICBjb25zdCBuZXdLZXkgPSBnZXRFbmNyeXB0aW9uS2V5KCk7XG5cbiAgLy8gVHJ5IHRvIGluaXRpYWxpemUgd2l0aCBuZXcga2V5IGZpcnN0XG4gIHRyeSB7XG4gICAgY29uc3QgbmV3Q29uZmlnID0gbmV3IENvbmY8U2VuZGx5Q29uZmlnPih7XG4gICAgICBwcm9qZWN0TmFtZTogXCJzZW5kbHlcIixcbiAgICAgIGN3ZDogQ09ORklHX0RJUixcbiAgICAgIGNvbmZpZ05hbWU6IFwiY29uZmlnXCIsXG4gICAgICBkZWZhdWx0czogREVGQVVMVF9DT05GSUcsXG4gICAgICBlbmNyeXB0aW9uS2V5OiBuZXdLZXksXG4gICAgfSk7XG5cbiAgICAvLyBUcnkgdG8gcmVhZCBhIHZhbHVlIHRvIHZlcmlmeSBkZWNyeXB0aW9uIHdvcmtzXG4gICAgbmV3Q29uZmlnLmdldChcImVudmlyb25tZW50XCIpO1xuICAgIHJldHVybiBuZXdDb25maWc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5ldyBrZXkgZGlkbid0IHdvcmsgLSB0cnkgbWlncmF0aW9uIGZyb20gb2xkIGtleVxuICB9XG5cbiAgLy8gTWlncmF0aW9uOiBUcnkgdG8gcmVhZCB3aXRoIG9sZCBkZWZhdWx0IGtleVxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbmZpZyA9IG5ldyBDb25mPFNlbmRseUNvbmZpZz4oe1xuICAgICAgcHJvamVjdE5hbWU6IFwic2VuZGx5XCIsXG4gICAgICBjd2Q6IENPTkZJR19ESVIsXG4gICAgICBjb25maWdOYW1lOiBcImNvbmZpZ1wiLFxuICAgICAgZGVmYXVsdHM6IERFRkFVTFRfQ09ORklHLFxuICAgICAgZW5jcnlwdGlvbktleTogT0xEX0RFRkFVTFRfS0VZLFxuICAgIH0pO1xuXG4gICAgLy8gUmVhZCBhbGwgZGF0YSB3aXRoIG9sZCBrZXlcbiAgICBjb25zdCBvbGREYXRhID0geyAuLi5vbGRDb25maWcuc3RvcmUgfTtcbiAgICBjb25zdCBoYXNEYXRhID0gT2JqZWN0LmtleXMob2xkRGF0YSkuc29tZShcbiAgICAgIChrKSA9PlxuICAgICAgICAhT2JqZWN0LmtleXMoREVGQVVMVF9DT05GSUcpLmluY2x1ZGVzKGspIHx8XG4gICAgICAgIG9sZERhdGFbayBhcyBrZXlvZiBTZW5kbHlDb25maWddICE9PVxuICAgICAgICAgIERFRkFVTFRfQ09ORklHW2sgYXMga2V5b2YgU2VuZGx5Q29uZmlnXSxcbiAgICApO1xuXG4gICAgaWYgKGhhc0RhdGEpIHtcbiAgICAgIC8vIENsZWFyIG9sZCBjb25maWcgZmlsZVxuICAgICAgb2xkQ29uZmlnLmNsZWFyKCk7XG5cbiAgICAgIC8vIENyZWF0ZSBuZXcgY29uZmlnIHdpdGggbmV3IGtleVxuICAgICAgY29uc3QgbmV3Q29uZmlnID0gbmV3IENvbmY8U2VuZGx5Q29uZmlnPih7XG4gICAgICAgIHByb2plY3ROYW1lOiBcInNlbmRseVwiLFxuICAgICAgICBjd2Q6IENPTkZJR19ESVIsXG4gICAgICAgIGNvbmZpZ05hbWU6IFwiY29uZmlnXCIsXG4gICAgICAgIGRlZmF1bHRzOiBERUZBVUxUX0NPTkZJRyxcbiAgICAgICAgZW5jcnlwdGlvbktleTogbmV3S2V5LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlc3RvcmUgZGF0YSB3aXRoIG5ldyBlbmNyeXB0aW9uXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvbGREYXRhKSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5ld0NvbmZpZy5zZXQoa2V5IGFzIGtleW9mIFNlbmRseUNvbmZpZywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdDb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBPbGQga2V5IGFsc28gZGlkbid0IHdvcmsgLSBjb3JydXB0ZWQgb3IgZnJlc2ggaW5zdGFsbFxuICB9XG5cbiAgLy8gRnJlc2ggaW5zdGFsbCBvciBjb3JydXB0ZWQuIElmIGEgY29uZmlnIGZpbGUgZXhpc3RzIGF0IHRoaXMgcG9pbnQsXG4gIC8vIGJvdGggdGhlIG5ldyBrZXkgYW5kIHRoZSBvbGQga2V5IGZhaWxlZCB0byBkZWNyeXB0IGl0IOKAlCB0aGF0IG1lYW5zXG4gIC8vIHRoZSBmaWxlIHdhcyB3cml0dGVuIGJ5IGEgZGlmZmVyZW50IG1hY2hpbmUsIGVuY3J5cHRlZCB3aXRoIGFcbiAgLy8gU0VORExZX0NPTkZJR19LRVkgdGhhdCBubyBsb25nZXIgbWF0Y2hlcywgb3IgZ290IGNvcnJ1cHRlZC5cbiAgLy8gQ29uc3RydWN0aW5nIGEgbmV3IENvbmZ7fSBoZXJlIHdvdWxkIGp1c3QgcmUtcmVhZCB0aGUgc2FtZSBmaWxlIGFuZFxuICAvLyB0aHJvdyB0aGUgc2FtZSBTeW50YXhFcnJvci4gTW92ZSBpdCBhc2lkZSBzbyB0aGUgdXNlciBrZWVwcyBhIGNvcHlcbiAgLy8gKGluIGNhc2UgdGhleSByZWNvdmVyIHRoZSBrZXkgbGF0ZXIpIGFuZCBzdGFydCBjbGVhbi5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oQ09ORklHX0RJUiwgQ09ORklHX0ZJTEUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFja3VwUGF0aCA9IGAke2ZpbGVQYXRofS5jb3JydXB0LiR7RGF0ZS5ub3coKX1gO1xuICAgICAgZnMucmVuYW1lU3luYyhmaWxlUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICAvLyBTdGF5IHF1aWV0IGJ5IGRlZmF1bHQg4oCUIG1vc3QgY2FsbGVycyBydW4gZWFybHkgaW4gdGhlIHByb2Nlc3NcbiAgICAgIC8vIGJlZm9yZSBvdXRwdXQgaGVscGVycyBhcmUgd2lyZWQuIEEgZGVidWcgYnJlYWRjcnVtYiBpcyBlbm91Z2guXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoXG4gICAgICAgICAgYFtzZW5kbHldIENvdWxkIG5vdCBkZWNyeXB0ICR7ZmlsZVBhdGh9OyBtb3ZlZCB0byAke2JhY2t1cFBhdGh9IGFuZCBzdGFydGluZyBmcmVzaC4gUnVuICdzZW5kbHkgbG9naW4nIHRvIHJlLWF1dGhlbnRpY2F0ZS5cXG5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWYgd2UgY2FuJ3QgbW92ZSB0aGUgZmlsZSAocGVybWlzc2lvbnMsIEZTIGlzc3VlKSwgb3VyIGJlc3RcbiAgICAgIC8vIHJlbWFpbmluZyBvcHRpb24gaXMgdG8gZGVsZXRlIGl0IOKAlCBsb3NpbmcgaXQgaXMgc3RyaWN0bHkgYmV0dGVyXG4gICAgICAvLyB0aGFuIGNyYXNoaW5nIGV2ZXJ5IGNvbW1hbmQuXG4gICAgICB0cnkge1xuICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBHaXZlIHVwIHNpbGVudGx5IGFuZCBsZXQgQ29uZiB0aHJvdyBpZiBpdCBtdXN0LlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgQ29uZjxTZW5kbHlDb25maWc+KHtcbiAgICBwcm9qZWN0TmFtZTogXCJzZW5kbHlcIixcbiAgICBjd2Q6IENPTkZJR19ESVIsXG4gICAgY29uZmlnTmFtZTogXCJjb25maWdcIixcbiAgICBkZWZhdWx0czogREVGQVVMVF9DT05GSUcsXG4gICAgZW5jcnlwdGlvbktleTogbmV3S2V5LFxuICB9KTtcbn1cblxuY29uc3QgY29uZmlnID0gaW5pdGlhbGl6ZUNvbmZpZygpO1xuXG4vKipcbiAqIEdldCBlZmZlY3RpdmUgY29uZmlnIHZhbHVlIHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGUgb3ZlcnJpZGVcbiAqIFByaW9yaXR5OiBlbnYgdmFyID4gY29uZmlnIGZpbGUgPiBkZWZhdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZmZlY3RpdmVWYWx1ZTxLIGV4dGVuZHMga2V5b2YgU2VuZGx5Q29uZmlnPihcbiAga2V5OiBLLFxuKTogU2VuZGx5Q29uZmlnW0tdIHtcbiAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgb3ZlcnJpZGVzXG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBcImFwaUtleVwiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9BUElfS0VZKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5TRU5ETFlfQVBJX0tFWSBhcyBTZW5kbHlDb25maWdbS107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYmFzZVVybFwiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9CQVNFX1VSTCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VORExZX0JBU0VfVVJMIGFzIFNlbmRseUNvbmZpZ1tLXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJkZWZhdWx0Rm9ybWF0XCI6XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuU0VORExZX09VVFBVVF9GT1JNQVQpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gcHJvY2Vzcy5lbnYuU0VORExZX09VVFBVVF9GT1JNQVQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJqc29uXCIgfHwgZm9ybWF0ID09PSBcImh1bWFuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZm9ybWF0IGFzIFNlbmRseUNvbmZpZ1tLXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImNvbG9yRW5hYmxlZFwiOlxuICAgICAgaWYgKGlzQ29sb3JEaXNhYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZSBhcyBTZW5kbHlDb25maWdbS107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidGltZW91dFwiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9USU1FT1VUKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBwYXJzZUludChwcm9jZXNzLmVudi5TRU5ETFlfVElNRU9VVCwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHRpbWVvdXQpICYmIHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRpbWVvdXQgYXMgU2VuZGx5Q29uZmlnW0tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibWF4UmV0cmllc1wiOlxuICAgICAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9NQVhfUkVUUklFUykge1xuICAgICAgICBjb25zdCByZXRyaWVzID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuU0VORExZX01BWF9SRVRSSUVTLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocmV0cmllcykgJiYgcmV0cmllcyA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJldHJpZXMgYXMgU2VuZGx5Q29uZmlnW0tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY3VycmVudE9yZ0lkXCI6XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuU0VORExZX09SR19JRCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VORExZX09SR19JRCBhcyBTZW5kbHlDb25maWdbS107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIC8vIEZhbGwgYmFjayB0byBjb25maWcgZmlsZSB2YWx1ZVxuICByZXR1cm4gY29uZmlnLmdldChrZXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IFNlbmRseUNvbmZpZyB7XG4gIHJldHVybiBjb25maWcuc3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb25maWc8SyBleHRlbmRzIGtleW9mIFNlbmRseUNvbmZpZz4oXG4gIGtleTogSyxcbiAgdmFsdWU6IFNlbmRseUNvbmZpZ1tLXSxcbik6IHZvaWQge1xuICBjb25maWcuc2V0KGtleSwgdmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnVmFsdWU8SyBleHRlbmRzIGtleW9mIFNlbmRseUNvbmZpZz4oXG4gIGtleTogSyxcbik6IFNlbmRseUNvbmZpZ1tLXSB7XG4gIHJldHVybiBjb25maWcuZ2V0KGtleSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNvbmZpZygpOiB2b2lkIHtcbiAgY29uZmlnLmNsZWFyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckF1dGgoKTogdm9pZCB7XG4gIGNvbmZpZy5kZWxldGUoXCJhcGlLZXlcIik7XG4gIGNvbmZpZy5kZWxldGUoXCJhY2Nlc3NUb2tlblwiKTtcbiAgY29uZmlnLmRlbGV0ZShcInJlZnJlc2hUb2tlblwiKTtcbiAgY29uZmlnLmRlbGV0ZShcInRva2VuRXhwaXJlc0F0XCIpO1xuICBjb25maWcuZGVsZXRlKFwidXNlcklkXCIpO1xuICBjb25maWcuZGVsZXRlKFwiZW1haWxcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gIC8vIENoZWNrIGVudiB2YXIgZmlyc3RcbiAgaWYgKHByb2Nlc3MuZW52LlNFTkRMWV9BUElfS0VZKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCBhcGlLZXkgPSBjb25maWcuZ2V0KFwiYXBpS2V5XCIpO1xuICBjb25zdCBhY2Nlc3NUb2tlbiA9IGNvbmZpZy5nZXQoXCJhY2Nlc3NUb2tlblwiKTtcbiAgcmV0dXJuICEhKGFwaUtleSB8fCBhY2Nlc3NUb2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdXRoVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdGFrZXMgaGlnaGVzdCBwcmVjZWRlbmNlXG4gIGlmIChwcm9jZXNzLmVudi5TRU5ETFlfQVBJX0tFWSkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5TRU5ETFlfQVBJX0tFWTtcbiAgfVxuXG4gIC8vIFRoZW4gc3RvcmVkIEFQSSBrZXlcbiAgY29uc3QgYXBpS2V5ID0gY29uZmlnLmdldChcImFwaUtleVwiKTtcbiAgaWYgKGFwaUtleSkgcmV0dXJuIGFwaUtleTtcblxuICAvLyBGaW5hbGx5LCBhY2Nlc3MgdG9rZW4gKGlmIG5vdCBleHBpcmVkKVxuICBjb25zdCBhY2Nlc3NUb2tlbiA9IGNvbmZpZy5nZXQoXCJhY2Nlc3NUb2tlblwiKTtcbiAgY29uc3QgZXhwaXJlc0F0ID0gY29uZmlnLmdldChcInRva2VuRXhwaXJlc0F0XCIpO1xuXG4gIGlmIChhY2Nlc3NUb2tlbiAmJiBleHBpcmVzQXQgJiYgRGF0ZS5ub3coKSA8IGV4cGlyZXNBdCkge1xuICAgIHJldHVybiBhY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yZWRBY2Nlc3NUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29uZmlnLmdldChcImFjY2Vzc1Rva2VuXCIpIHx8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEFwaUtleShhcGlLZXk6IHN0cmluZyk6IHZvaWQge1xuICAvLyBWYWxpZGF0ZSBBUEkga2V5IGZvcm1hdFxuICBpZiAoIS9ec2tfKHRlc3R8bGl2ZSlfdjFfW2EtekEtWjAtOV8tXSskLy50ZXN0KGFwaUtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkludmFsaWQgQVBJIGtleSBmb3JtYXQuIEV4cGVjdGVkIHNrX3Rlc3RfdjFfeHh4IG9yIHNrX2xpdmVfdjFfeHh4XCIsXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpZy5zZXQoXCJhcGlLZXlcIiwgYXBpS2V5KTtcblxuICAvLyBTZXQgZW52aXJvbm1lbnQgYmFzZWQgb24ga2V5IHR5cGVcbiAgaWYgKGFwaUtleS5zdGFydHNXaXRoKFwic2tfdGVzdF9cIikpIHtcbiAgICBjb25maWcuc2V0KFwiZW52aXJvbm1lbnRcIiwgXCJ0ZXN0XCIpO1xuICB9IGVsc2Uge1xuICAgIGNvbmZpZy5zZXQoXCJlbnZpcm9ubWVudFwiLCBcImxpdmVcIik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEF1dGhUb2tlbnMoXG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmcsXG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICBleHBpcmVzSW46IG51bWJlcixcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGVtYWlsOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uZmlnLnNldChcImFjY2Vzc1Rva2VuXCIsIGFjY2Vzc1Rva2VuKTtcbiAgY29uZmlnLnNldChcInJlZnJlc2hUb2tlblwiLCByZWZyZXNoVG9rZW4pO1xuICBjb25maWcuc2V0KFwidG9rZW5FeHBpcmVzQXRcIiwgRGF0ZS5ub3coKSArIGV4cGlyZXNJbiAqIDEwMDApO1xuICBjb25maWcuc2V0KFwidXNlcklkXCIsIHVzZXJJZCk7XG4gIGNvbmZpZy5zZXQoXCJlbWFpbFwiLCBlbWFpbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oQ09ORklHX0RJUiwgQ09ORklHX0ZJTEUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnRGlyKCk6IHN0cmluZyB7XG4gIHJldHVybiBDT05GSUdfRElSO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q3VycmVudE9yZyhpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHNsdWc/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uZmlnLnNldChcImN1cnJlbnRPcmdJZFwiLCBpZCk7XG4gIGNvbmZpZy5zZXQoXCJjdXJyZW50T3JnTmFtZVwiLCBuYW1lKTtcbiAgaWYgKHNsdWcpIGNvbmZpZy5zZXQoXCJjdXJyZW50T3JnU2x1Z1wiLCBzbHVnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRPcmcoKToge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNsdWc/OiBzdHJpbmc7XG59IHwgbnVsbCB7XG4gIGNvbnN0IGlkID0gZ2V0RWZmZWN0aXZlVmFsdWUoXCJjdXJyZW50T3JnSWRcIik7XG4gIGNvbnN0IG5hbWUgPSBjb25maWcuZ2V0KFwiY3VycmVudE9yZ05hbWVcIik7XG4gIGlmICghaWQpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBpZCwgbmFtZTogbmFtZSB8fCBpZCwgc2x1ZzogY29uZmlnLmdldChcImN1cnJlbnRPcmdTbHVnXCIpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckN1cnJlbnRPcmcoKTogdm9pZCB7XG4gIGNvbmZpZy5kZWxldGUoXCJjdXJyZW50T3JnSWRcIik7XG4gIGNvbmZpZy5kZWxldGUoXCJjdXJyZW50T3JnTmFtZVwiKTtcbiAgY29uZmlnLmRlbGV0ZShcImN1cnJlbnRPcmdTbHVnXCIpO1xufVxuXG5leHBvcnQgeyBjb25maWcgfTtcbiJdfQ==
@@ -3,15 +3,19 @@
3
3
  * can shell out to the correct package manager.
4
4
  *
5
5
  * We support two install paths explicitly:
6
- * - Homebrew — from the SendlyHQ/homebrew-tap formula (`brew install sendly`).
7
- * Detected via the `HOMEBREW_CELLAR` env var (set by every brew-managed
8
- * shell) OR by the binary path living under a Homebrew-owned prefix.
9
- * - npm global — `npm install -g @sendly/cli`. This is the default and
10
- * what we fall back to when we can't identify Homebrew.
6
+ * - Homebrew — from the SendlyHQ/homebrew-tap formula
7
+ * (`brew install sendly-live/tap/sendly`). Detected by the resolved
8
+ * binary path living under a Homebrew-owned prefix.
9
+ * - npm global — `npm install -g @sendly/cli`. Detected by the
10
+ * resolved binary path living under `node_modules`.
11
+ *
12
+ * The `HOMEBREW_CELLAR` env var is NOT a reliable signal on its own —
13
+ * it's set in every shell where Homebrew is on PATH, even when the CLI
14
+ * was installed via npm. Path-based detection is authoritative; the env
15
+ * var only acts as a tiebreaker for unusual layouts.
11
16
  *
12
17
  * Returns `"unknown"` only when we can't determine either. That's rare in
13
- * practice (npm installs into predictable paths) but we handle it
14
- * gracefully in the `upgrade` command by printing both options.
18
+ * practice; the `upgrade` command handles it by printing both options.
15
19
  */
16
20
  export type InstallPath = "homebrew" | "npm" | "unknown";
17
21
  export declare function detectInstallPath(): InstallPath;
@@ -1,3 +1,4 @@
1
+ import * as fs from "node:fs";
1
2
  const HOMEBREW_PREFIX_MARKERS = [
2
3
  "/opt/homebrew/",
3
4
  "/usr/local/Cellar/",
@@ -5,21 +6,36 @@ const HOMEBREW_PREFIX_MARKERS = [
5
6
  "/Cellar/",
6
7
  ];
7
8
  export function detectInstallPath() {
8
- // Strongest signal the env var that `brew shellenv` sets.
9
- if (process.env.HOMEBREW_CELLAR) {
10
- return "homebrew";
9
+ // The resolved binary path is the only authoritative signal of how
10
+ // this CLI was installed. `process.argv[1]` is the entry script — npm
11
+ // globals live under `node_modules`, Homebrew installs live under a
12
+ // Cellar/brew prefix.
13
+ //
14
+ // Resolve symlinks so an `npm install -g` that drops a symlink in
15
+ // `~/.nvm/.../bin/sendly -> ../lib/node_modules/...` is correctly
16
+ // classified as "npm" via the resolved target, not "unknown" via the
17
+ // unresolved symlink.
18
+ const argv1 = process.argv[1] ?? "";
19
+ let binPath = argv1;
20
+ try {
21
+ if (argv1)
22
+ binPath = fs.realpathSync(argv1);
23
+ }
24
+ catch {
25
+ // realpath can fail on broken symlinks or weird FS layouts —
26
+ // fall back to the unresolved argv[1].
27
+ binPath = argv1;
11
28
  }
12
- // Fallback — look at the bin path. `process.argv[1]` is the entry
13
- // script; for Homebrew installs it lives under Cellar/libexec. For npm
14
- // globals it lives under the npm prefix (e.g. /usr/local/lib/node_modules).
15
- const binPath = process.argv[1] ?? "";
16
29
  for (const marker of HOMEBREW_PREFIX_MARKERS) {
17
30
  if (binPath.includes(marker))
18
31
  return "homebrew";
19
32
  }
20
- // `node_modules` is the tell-tale for any npm install (global or local).
21
33
  if (binPath.includes("/node_modules/"))
22
34
  return "npm";
35
+ // Path was inconclusive (e.g. running from a source checkout). Don't
36
+ // guess from `HOMEBREW_CELLAR` — its presence only proves brew exists
37
+ // on the machine, not that this CLI was installed by it. Return
38
+ // "unknown" so the upgrade command prints both options for the user.
23
39
  return "unknown";
24
40
  }
25
41
  /**
@@ -35,4 +51,4 @@ export function upgradeCommandFor(path) {
35
51
  return "npm install -g @sendly/cli@latest # or: brew upgrade sendly";
36
52
  }
37
53
  }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0LWluc3RhbGwtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZGV0ZWN0LWluc3RhbGwtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsTUFBTSx1QkFBdUIsR0FBRztJQUM5QixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixVQUFVO0NBQ1gsQ0FBQztBQUVGLE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsNERBQTREO0lBQzVELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNoQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLHVFQUF1RTtJQUN2RSw0RUFBNEU7SUFDNUUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLE1BQU0sSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzdDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLFVBQVUsQ0FBQztJQUNsRCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXJELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFpQjtJQUNqRCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxVQUFVO1lBQ2IsT0FBTyxxQkFBcUIsQ0FBQztRQUMvQixLQUFLLEtBQUs7WUFDUixPQUFPLG1DQUFtQyxDQUFDO1FBQzdDO1lBQ0UsT0FBTyw4REFBOEQsQ0FBQztJQUMxRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGV0ZWN0IGhvdyB0aGUgYEBzZW5kbHkvY2xpYCBiaW5hcnkgd2FzIGluc3RhbGxlZCBzbyBgc2VuZGx5IHVwZ3JhZGVgXG4gKiBjYW4gc2hlbGwgb3V0IHRvIHRoZSBjb3JyZWN0IHBhY2thZ2UgbWFuYWdlci5cbiAqXG4gKiBXZSBzdXBwb3J0IHR3byBpbnN0YWxsIHBhdGhzIGV4cGxpY2l0bHk6XG4gKiAgIC0gSG9tZWJyZXcg4oCUIGZyb20gdGhlIFNlbmRseUhRL2hvbWVicmV3LXRhcCBmb3JtdWxhIChgYnJldyBpbnN0YWxsIHNlbmRseWApLlxuICogICAgIERldGVjdGVkIHZpYSB0aGUgYEhPTUVCUkVXX0NFTExBUmAgZW52IHZhciAoc2V0IGJ5IGV2ZXJ5IGJyZXctbWFuYWdlZFxuICogICAgIHNoZWxsKSBPUiBieSB0aGUgYmluYXJ5IHBhdGggbGl2aW5nIHVuZGVyIGEgSG9tZWJyZXctb3duZWQgcHJlZml4LlxuICogICAtIG5wbSBnbG9iYWwg4oCUIGBucG0gaW5zdGFsbCAtZyBAc2VuZGx5L2NsaWAuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYW5kXG4gKiAgICAgd2hhdCB3ZSBmYWxsIGJhY2sgdG8gd2hlbiB3ZSBjYW4ndCBpZGVudGlmeSBIb21lYnJldy5cbiAqXG4gKiBSZXR1cm5zIGBcInVua25vd25cImAgb25seSB3aGVuIHdlIGNhbid0IGRldGVybWluZSBlaXRoZXIuIFRoYXQncyByYXJlIGluXG4gKiBwcmFjdGljZSAobnBtIGluc3RhbGxzIGludG8gcHJlZGljdGFibGUgcGF0aHMpIGJ1dCB3ZSBoYW5kbGUgaXRcbiAqIGdyYWNlZnVsbHkgaW4gdGhlIGB1cGdyYWRlYCBjb21tYW5kIGJ5IHByaW50aW5nIGJvdGggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbFBhdGggPSBcImhvbWVicmV3XCIgfCBcIm5wbVwiIHwgXCJ1bmtub3duXCI7XG5cbmNvbnN0IEhPTUVCUkVXX1BSRUZJWF9NQVJLRVJTID0gW1xuICBcIi9vcHQvaG9tZWJyZXcvXCIsXG4gIFwiL3Vzci9sb2NhbC9DZWxsYXIvXCIsXG4gIFwiL2hvbWUvbGludXhicmV3L1wiLFxuICBcIi9DZWxsYXIvXCIsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0SW5zdGFsbFBhdGgoKTogSW5zdGFsbFBhdGgge1xuICAvLyBTdHJvbmdlc3Qgc2lnbmFsIOKAlCB0aGUgZW52IHZhciB0aGF0IGBicmV3IHNoZWxsZW52YCBzZXRzLlxuICBpZiAocHJvY2Vzcy5lbnYuSE9NRUJSRVdfQ0VMTEFSKSB7XG4gICAgcmV0dXJuIFwiaG9tZWJyZXdcIjtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIOKAlCBsb29rIGF0IHRoZSBiaW4gcGF0aC4gYHByb2Nlc3MuYXJndlsxXWAgaXMgdGhlIGVudHJ5XG4gIC8vIHNjcmlwdDsgZm9yIEhvbWVicmV3IGluc3RhbGxzIGl0IGxpdmVzIHVuZGVyIENlbGxhci9saWJleGVjLiBGb3IgbnBtXG4gIC8vIGdsb2JhbHMgaXQgbGl2ZXMgdW5kZXIgdGhlIG5wbSBwcmVmaXggKGUuZy4gL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzKS5cbiAgY29uc3QgYmluUGF0aCA9IHByb2Nlc3MuYXJndlsxXSA/PyBcIlwiO1xuICBmb3IgKGNvbnN0IG1hcmtlciBvZiBIT01FQlJFV19QUkVGSVhfTUFSS0VSUykge1xuICAgIGlmIChiaW5QYXRoLmluY2x1ZGVzKG1hcmtlcikpIHJldHVybiBcImhvbWVicmV3XCI7XG4gIH1cblxuICAvLyBgbm9kZV9tb2R1bGVzYCBpcyB0aGUgdGVsbC10YWxlIGZvciBhbnkgbnBtIGluc3RhbGwgKGdsb2JhbCBvciBsb2NhbCkuXG4gIGlmIChiaW5QYXRoLmluY2x1ZGVzKFwiL25vZGVfbW9kdWxlcy9cIikpIHJldHVybiBcIm5wbVwiO1xuXG4gIHJldHVybiBcInVua25vd25cIjtcbn1cblxuLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSB1cGdyYWRlIGNvbW1hbmQgZm9yIHRoZSBkZXRlY3RlZCBpbnN0YWxsIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGdyYWRlQ29tbWFuZEZvcihwYXRoOiBJbnN0YWxsUGF0aCk6IHN0cmluZyB7XG4gIHN3aXRjaCAocGF0aCkge1xuICAgIGNhc2UgXCJob21lYnJld1wiOlxuICAgICAgcmV0dXJuIFwiYnJldyB1cGdyYWRlIHNlbmRseVwiO1xuICAgIGNhc2UgXCJucG1cIjpcbiAgICAgIHJldHVybiBcIm5wbSBpbnN0YWxsIC1nIEBzZW5kbHkvY2xpQGxhdGVzdFwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJucG0gaW5zdGFsbCAtZyBAc2VuZGx5L2NsaUBsYXRlc3QgICMgb3I6IGJyZXcgdXBncmFkZSBzZW5kbHlcIjtcbiAgfVxufVxuIl19
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0LWluc3RhbGwtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZGV0ZWN0LWluc3RhbGwtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQXVCOUIsTUFBTSx1QkFBdUIsR0FBRztJQUM5QixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixVQUFVO0NBQ1gsQ0FBQztBQUVGLE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsbUVBQW1FO0lBQ25FLHNFQUFzRTtJQUN0RSxvRUFBb0U7SUFDcEUsc0JBQXNCO0lBQ3RCLEVBQUU7SUFDRixrRUFBa0U7SUFDbEUsa0VBQWtFO0lBQ2xFLHFFQUFxRTtJQUNyRSxzQkFBc0I7SUFDdEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLElBQUksQ0FBQztRQUNILElBQUksS0FBSztZQUFFLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCw2REFBNkQ7UUFDN0QsdUNBQXVDO1FBQ3ZDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDbEIsQ0FBQztJQUVELEtBQUssTUFBTSxNQUFNLElBQUksdUJBQXVCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxVQUFVLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXJELHFFQUFxRTtJQUNyRSxzRUFBc0U7SUFDdEUsZ0VBQWdFO0lBQ2hFLHFFQUFxRTtJQUNyRSxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBaUI7SUFDakQsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssVUFBVTtZQUNiLE9BQU8scUJBQXFCLENBQUM7UUFDL0IsS0FBSyxLQUFLO1lBQ1IsT0FBTyxtQ0FBbUMsQ0FBQztRQUM3QztZQUNFLE9BQU8sOERBQThELENBQUM7SUFDMUUsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuXG4vKipcbiAqIERldGVjdCBob3cgdGhlIGBAc2VuZGx5L2NsaWAgYmluYXJ5IHdhcyBpbnN0YWxsZWQgc28gYHNlbmRseSB1cGdyYWRlYFxuICogY2FuIHNoZWxsIG91dCB0byB0aGUgY29ycmVjdCBwYWNrYWdlIG1hbmFnZXIuXG4gKlxuICogV2Ugc3VwcG9ydCB0d28gaW5zdGFsbCBwYXRocyBleHBsaWNpdGx5OlxuICogICAtIEhvbWVicmV3IOKAlCBmcm9tIHRoZSBTZW5kbHlIUS9ob21lYnJldy10YXAgZm9ybXVsYVxuICogICAgIChgYnJldyBpbnN0YWxsIHNlbmRseS1saXZlL3RhcC9zZW5kbHlgKS4gRGV0ZWN0ZWQgYnkgdGhlIHJlc29sdmVkXG4gKiAgICAgYmluYXJ5IHBhdGggbGl2aW5nIHVuZGVyIGEgSG9tZWJyZXctb3duZWQgcHJlZml4LlxuICogICAtIG5wbSBnbG9iYWwg4oCUIGBucG0gaW5zdGFsbCAtZyBAc2VuZGx5L2NsaWAuIERldGVjdGVkIGJ5IHRoZVxuICogICAgIHJlc29sdmVkIGJpbmFyeSBwYXRoIGxpdmluZyB1bmRlciBgbm9kZV9tb2R1bGVzYC5cbiAqXG4gKiBUaGUgYEhPTUVCUkVXX0NFTExBUmAgZW52IHZhciBpcyBOT1QgYSByZWxpYWJsZSBzaWduYWwgb24gaXRzIG93biDigJRcbiAqIGl0J3Mgc2V0IGluIGV2ZXJ5IHNoZWxsIHdoZXJlIEhvbWVicmV3IGlzIG9uIFBBVEgsIGV2ZW4gd2hlbiB0aGUgQ0xJXG4gKiB3YXMgaW5zdGFsbGVkIHZpYSBucG0uIFBhdGgtYmFzZWQgZGV0ZWN0aW9uIGlzIGF1dGhvcml0YXRpdmU7IHRoZSBlbnZcbiAqIHZhciBvbmx5IGFjdHMgYXMgYSB0aWVicmVha2VyIGZvciB1bnVzdWFsIGxheW91dHMuXG4gKlxuICogUmV0dXJucyBgXCJ1bmtub3duXCJgIG9ubHkgd2hlbiB3ZSBjYW4ndCBkZXRlcm1pbmUgZWl0aGVyLiBUaGF0J3MgcmFyZSBpblxuICogcHJhY3RpY2U7IHRoZSBgdXBncmFkZWAgY29tbWFuZCBoYW5kbGVzIGl0IGJ5IHByaW50aW5nIGJvdGggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbFBhdGggPSBcImhvbWVicmV3XCIgfCBcIm5wbVwiIHwgXCJ1bmtub3duXCI7XG5cbmNvbnN0IEhPTUVCUkVXX1BSRUZJWF9NQVJLRVJTID0gW1xuICBcIi9vcHQvaG9tZWJyZXcvXCIsXG4gIFwiL3Vzci9sb2NhbC9DZWxsYXIvXCIsXG4gIFwiL2hvbWUvbGludXhicmV3L1wiLFxuICBcIi9DZWxsYXIvXCIsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0SW5zdGFsbFBhdGgoKTogSW5zdGFsbFBhdGgge1xuICAvLyBUaGUgcmVzb2x2ZWQgYmluYXJ5IHBhdGggaXMgdGhlIG9ubHkgYXV0aG9yaXRhdGl2ZSBzaWduYWwgb2YgaG93XG4gIC8vIHRoaXMgQ0xJIHdhcyBpbnN0YWxsZWQuIGBwcm9jZXNzLmFyZ3ZbMV1gIGlzIHRoZSBlbnRyeSBzY3JpcHQg4oCUIG5wbVxuICAvLyBnbG9iYWxzIGxpdmUgdW5kZXIgYG5vZGVfbW9kdWxlc2AsIEhvbWVicmV3IGluc3RhbGxzIGxpdmUgdW5kZXIgYVxuICAvLyBDZWxsYXIvYnJldyBwcmVmaXguXG4gIC8vXG4gIC8vIFJlc29sdmUgc3ltbGlua3Mgc28gYW4gYG5wbSBpbnN0YWxsIC1nYCB0aGF0IGRyb3BzIGEgc3ltbGluayBpblxuICAvLyBgfi8ubnZtLy4uLi9iaW4vc2VuZGx5IC0+IC4uL2xpYi9ub2RlX21vZHVsZXMvLi4uYCBpcyBjb3JyZWN0bHlcbiAgLy8gY2xhc3NpZmllZCBhcyBcIm5wbVwiIHZpYSB0aGUgcmVzb2x2ZWQgdGFyZ2V0LCBub3QgXCJ1bmtub3duXCIgdmlhIHRoZVxuICAvLyB1bnJlc29sdmVkIHN5bWxpbmsuXG4gIGNvbnN0IGFyZ3YxID0gcHJvY2Vzcy5hcmd2WzFdID8/IFwiXCI7XG4gIGxldCBiaW5QYXRoID0gYXJndjE7XG4gIHRyeSB7XG4gICAgaWYgKGFyZ3YxKSBiaW5QYXRoID0gZnMucmVhbHBhdGhTeW5jKGFyZ3YxKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gcmVhbHBhdGggY2FuIGZhaWwgb24gYnJva2VuIHN5bWxpbmtzIG9yIHdlaXJkIEZTIGxheW91dHMg4oCUXG4gICAgLy8gZmFsbCBiYWNrIHRvIHRoZSB1bnJlc29sdmVkIGFyZ3ZbMV0uXG4gICAgYmluUGF0aCA9IGFyZ3YxO1xuICB9XG5cbiAgZm9yIChjb25zdCBtYXJrZXIgb2YgSE9NRUJSRVdfUFJFRklYX01BUktFUlMpIHtcbiAgICBpZiAoYmluUGF0aC5pbmNsdWRlcyhtYXJrZXIpKSByZXR1cm4gXCJob21lYnJld1wiO1xuICB9XG5cbiAgaWYgKGJpblBhdGguaW5jbHVkZXMoXCIvbm9kZV9tb2R1bGVzL1wiKSkgcmV0dXJuIFwibnBtXCI7XG5cbiAgLy8gUGF0aCB3YXMgaW5jb25jbHVzaXZlIChlLmcuIHJ1bm5pbmcgZnJvbSBhIHNvdXJjZSBjaGVja291dCkuIERvbid0XG4gIC8vIGd1ZXNzIGZyb20gYEhPTUVCUkVXX0NFTExBUmAg4oCUIGl0cyBwcmVzZW5jZSBvbmx5IHByb3ZlcyBicmV3IGV4aXN0c1xuICAvLyBvbiB0aGUgbWFjaGluZSwgbm90IHRoYXQgdGhpcyBDTEkgd2FzIGluc3RhbGxlZCBieSBpdC4gUmV0dXJuXG4gIC8vIFwidW5rbm93blwiIHNvIHRoZSB1cGdyYWRlIGNvbW1hbmQgcHJpbnRzIGJvdGggb3B0aW9ucyBmb3IgdGhlIHVzZXIuXG4gIHJldHVybiBcInVua25vd25cIjtcbn1cblxuLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSB1cGdyYWRlIGNvbW1hbmQgZm9yIHRoZSBkZXRlY3RlZCBpbnN0YWxsIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGdyYWRlQ29tbWFuZEZvcihwYXRoOiBJbnN0YWxsUGF0aCk6IHN0cmluZyB7XG4gIHN3aXRjaCAocGF0aCkge1xuICAgIGNhc2UgXCJob21lYnJld1wiOlxuICAgICAgcmV0dXJuIFwiYnJldyB1cGdyYWRlIHNlbmRseVwiO1xuICAgIGNhc2UgXCJucG1cIjpcbiAgICAgIHJldHVybiBcIm5wbSBpbnN0YWxsIC1nIEBzZW5kbHkvY2xpQGxhdGVzdFwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJucG0gaW5zdGFsbCAtZyBAc2VuZGx5L2NsaUBsYXRlc3QgICMgb3I6IGJyZXcgdXBncmFkZSBzZW5kbHlcIjtcbiAgfVxufVxuIl19
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared interactive-terminal helpers: press-[c]-to-copy a URL to the
3
+ * clipboard and [q]/Ctrl-C to cancel while the CLI polls a remote action
4
+ * (browser login, hosted document upload / payment for number purchases).
5
+ *
6
+ * Both helpers were originally private to auth.ts; they now live here so
7
+ * the numbers buy flow can reuse the exact same UX without duplicating it.
8
+ */
9
+ /**
10
+ * Wire up the copy-URL / cancel keybindings while polling a remote
11
+ * action. Only active on a real interactive TTY — in CI, piped stdin, or
12
+ * when stdin.setRawMode is missing we no-op and return a cleanup that
13
+ * also no-ops.
14
+ *
15
+ * Returns a cleanup function that the caller MUST invoke on every exit
16
+ * path (success, timeout, error) so the terminal doesn't stay in raw
17
+ * mode. Calling cleanup twice is safe.
18
+ */
19
+ export declare function attachLoginKeypressHandler(urlToCopy: string): () => void;
20
+ /**
21
+ * Copy text to the system clipboard via the OS's native tool. Returns
22
+ * true if the write succeeded. Does not throw. Shells out rather than
23
+ * adding a native clipboard dep — the three commands (pbcopy / clip /
24
+ * xclip / wl-copy) cover every platform the CLI runs on.
25
+ */
26
+ export declare function copyToClipboard(text: string): Promise<boolean>;
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Shared interactive-terminal helpers: press-[c]-to-copy a URL to the
3
+ * clipboard and [q]/Ctrl-C to cancel while the CLI polls a remote action
4
+ * (browser login, hosted document upload / payment for number purchases).
5
+ *
6
+ * Both helpers were originally private to auth.ts; they now live here so
7
+ * the numbers buy flow can reuse the exact same UX without duplicating it.
8
+ */
9
+ import { colors } from "./output.js";
10
+ /**
11
+ * Wire up the copy-URL / cancel keybindings while polling a remote
12
+ * action. Only active on a real interactive TTY — in CI, piped stdin, or
13
+ * when stdin.setRawMode is missing we no-op and return a cleanup that
14
+ * also no-ops.
15
+ *
16
+ * Returns a cleanup function that the caller MUST invoke on every exit
17
+ * path (success, timeout, error) so the terminal doesn't stay in raw
18
+ * mode. Calling cleanup twice is safe.
19
+ */
20
+ export function attachLoginKeypressHandler(urlToCopy) {
21
+ const stdin = process.stdin;
22
+ if (!stdin.isTTY || typeof stdin.setRawMode !== "function") {
23
+ return () => { };
24
+ }
25
+ let cleaned = false;
26
+ const previousRawMode = stdin.isRaw;
27
+ console.log(colors.dim("Press [c] to copy URL to clipboard · [q] or Ctrl-C to cancel"));
28
+ const onData = (key) => {
29
+ const k = typeof key === "string" ? key : key.toString("utf8");
30
+ if (k === "c" || k === "C") {
31
+ copyToClipboard(urlToCopy)
32
+ .then((ok) => {
33
+ if (ok) {
34
+ // Overwrite the hint line with a transient confirmation.
35
+ process.stdout.write("\r" + " ".repeat(70) + "\r" + colors.success(" ✓ URL copied to clipboard\n"));
36
+ }
37
+ else {
38
+ process.stdout.write("\r" + colors.warning(" ✗ Could not copy — copy the URL manually\n"));
39
+ }
40
+ })
41
+ .catch(() => { });
42
+ return;
43
+ }
44
+ if (k === "q" || k === "Q" || k === "\u0003") {
45
+ cleanup();
46
+ console.log(colors.warning("\n Cancelled."));
47
+ process.exit(130);
48
+ }
49
+ };
50
+ stdin.setRawMode(true);
51
+ stdin.resume();
52
+ stdin.setEncoding("utf8");
53
+ stdin.on("data", onData);
54
+ const cleanup = () => {
55
+ if (cleaned)
56
+ return;
57
+ cleaned = true;
58
+ try {
59
+ stdin.removeListener("data", onData);
60
+ stdin.setRawMode(previousRawMode);
61
+ stdin.pause();
62
+ }
63
+ catch {
64
+ /* no-op */
65
+ }
66
+ };
67
+ return cleanup;
68
+ }
69
+ /**
70
+ * Copy text to the system clipboard via the OS's native tool. Returns
71
+ * true if the write succeeded. Does not throw. Shells out rather than
72
+ * adding a native clipboard dep — the three commands (pbcopy / clip /
73
+ * xclip / wl-copy) cover every platform the CLI runs on.
74
+ */
75
+ export async function copyToClipboard(text) {
76
+ const { spawn } = await import("node:child_process");
77
+ const candidates = process.platform === "darwin"
78
+ ? [["pbcopy", []]]
79
+ : process.platform === "win32"
80
+ ? [["clip", []]]
81
+ : [
82
+ ["wl-copy", []],
83
+ ["xclip", ["-selection", "clipboard"]],
84
+ ["xsel", ["--clipboard", "--input"]],
85
+ ];
86
+ for (const [cmd, args] of candidates) {
87
+ try {
88
+ const ok = await new Promise((resolve) => {
89
+ const child = spawn(cmd, args, { stdio: ["pipe", "ignore", "ignore"] });
90
+ child.on("error", () => resolve(false));
91
+ child.on("exit", (code) => resolve(code === 0));
92
+ child.stdin.end(text);
93
+ });
94
+ if (ok)
95
+ return true;
96
+ }
97
+ catch {
98
+ // try next candidate
99
+ }
100
+ }
101
+ return false;
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5cHJlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2tleXByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxTQUFpQjtJQUMxRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFFcEMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUNSLDhEQUE4RCxDQUMvRCxDQUNGLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQW9CLEVBQVEsRUFBRTtRQUM1QyxNQUFNLENBQUMsR0FBRyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzNCLGVBQWUsQ0FBQyxTQUFTLENBQUM7aUJBQ3ZCLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNYLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ1AseURBQXlEO29CQUN6RCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDbEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENB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QUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxFQUFFO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxxQkFBcUI7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCBpbnRlcmFjdGl2ZS10ZXJtaW5hbCBoZWxwZXJzOiBwcmVzcy1bY10tdG8tY29weSBhIFVSTCB0byB0aGVcbiAqIGNsaXBib2FyZCBhbmQgW3FdL0N0cmwtQyB0byBjYW5jZWwgd2hpbGUgdGhlIENMSSBwb2xscyBhIHJlbW90ZSBhY3Rpb25cbiAqIChicm93c2VyIGxvZ2luLCBob3N0ZWQgZG9jdW1lbnQgdXBsb2FkIC8gcGF5bWVudCBmb3IgbnVtYmVyIHB1cmNoYXNlcykuXG4gKlxuICogQm90aCBoZWxwZXJzIHdlcmUgb3JpZ2luYWxseSBwcml2YXRlIHRvIGF1dGgudHM7IHRoZXkgbm93IGxpdmUgaGVyZSBzb1xuICogdGhlIG51bWJlcnMgYnV5IGZsb3cgY2FuIHJldXNlIHRoZSBleGFjdCBzYW1lIFVYIHdpdGhvdXQgZHVwbGljYXRpbmcgaXQuXG4gKi9cblxuaW1wb3J0IHsgY29sb3JzIH0gZnJvbSBcIi4vb3V0cHV0LmpzXCI7XG5cbi8qKlxuICogV2lyZSB1cCB0aGUgY29weS1VUkwgLyBjYW5jZWwga2V5YmluZGluZ3Mgd2hpbGUgcG9sbGluZyBhIHJlbW90ZVxuICogYWN0aW9uLiBPbmx5IGFjdGl2ZSBvbiBhIHJlYWwgaW50ZXJhY3RpdmUgVFRZIOKAlCBpbiBDSSwgcGlwZWQgc3RkaW4sIG9yXG4gKiB3aGVuIHN0ZGluLnNldFJhd01vZGUgaXMgbWlzc2luZyB3ZSBuby1vcCBhbmQgcmV0dXJuIGEgY2xlYW51cCB0aGF0XG4gKiBhbHNvIG5vLW9wcy5cbiAqXG4gKiBSZXR1cm5zIGEgY2xlYW51cCBmdW5jdGlvbiB0aGF0IHRoZSBjYWxsZXIgTVVTVCBpbnZva2Ugb24gZXZlcnkgZXhpdFxuICogcGF0aCAoc3VjY2VzcywgdGltZW91dCwgZXJyb3IpIHNvIHRoZSB0ZXJtaW5hbCBkb2Vzbid0IHN0YXkgaW4gcmF3XG4gKiBtb2RlLiBDYWxsaW5nIGNsZWFudXAgdHdpY2UgaXMgc2FmZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaExvZ2luS2V5cHJlc3NIYW5kbGVyKHVybFRvQ29weTogc3RyaW5nKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHN0ZGluID0gcHJvY2Vzcy5zdGRpbjtcbiAgaWYgKCFzdGRpbi5pc1RUWSB8fCB0eXBlb2Ygc3RkaW4uc2V0UmF3TW9kZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IHt9O1xuICB9XG5cbiAgbGV0IGNsZWFuZWQgPSBmYWxzZTtcbiAgY29uc3QgcHJldmlvdXNSYXdNb2RlID0gc3RkaW4uaXNSYXc7XG5cbiAgY29uc29sZS5sb2coXG4gICAgY29sb3JzLmRpbShcbiAgICAgIFwiUHJlc3MgW2NdIHRvIGNvcHkgVVJMIHRvIGNsaXBib2FyZCDCtyBbcV0gb3IgQ3RybC1DIHRvIGNhbmNlbFwiLFxuICAgICksXG4gICk7XG5cbiAgY29uc3Qgb25EYXRhID0gKGtleTogQnVmZmVyIHwgc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgayA9IHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgPyBrZXkgOiBrZXkudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgIGlmIChrID09PSBcImNcIiB8fCBrID09PSBcIkNcIikge1xuICAgICAgY29weVRvQ2xpcGJvYXJkKHVybFRvQ29weSlcbiAgICAgICAgLnRoZW4oKG9rKSA9PiB7XG4gICAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIGhpbnQgbGluZSB3aXRoIGEgdHJhbnNpZW50IGNvbmZpcm1hdGlvbi5cbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKFxuICAgICAgICAgICAgICBcIlxcclwiICsgXCIgXCIucmVwZWF0KDcwKSArIFwiXFxyXCIgKyBjb2xvcnMuc3VjY2VzcyhcIiAg4pyTIFVSTCBjb3BpZWQgdG8gY2xpcGJvYXJkXFxuXCIpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoXG4gICAgICAgICAgICAgIFwiXFxyXCIgKyBjb2xvcnMud2FybmluZyhcIiAg4pyXIENvdWxkIG5vdCBjb3B5IOKAlCBjb3B5IHRoZSBVUkwgbWFudWFsbHlcXG5cIiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGsgPT09IFwicVwiIHx8IGsgPT09IFwiUVwiIHx8IGsgPT09IFwiXFx1MDAwM1wiKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMud2FybmluZyhcIlxcbiAgQ2FuY2VsbGVkLlwiKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMTMwKTtcbiAgICB9XG4gIH07XG5cbiAgc3RkaW4uc2V0UmF3TW9kZSh0cnVlKTtcbiAgc3RkaW4ucmVzdW1lKCk7XG4gIHN0ZGluLnNldEVuY29kaW5nKFwidXRmOFwiKTtcbiAgc3RkaW4ub24oXCJkYXRhXCIsIG9uRGF0YSk7XG5cbiAgY29uc3QgY2xlYW51cCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoY2xlYW5lZCkgcmV0dXJuO1xuICAgIGNsZWFuZWQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBzdGRpbi5yZW1vdmVMaXN0ZW5lcihcImRhdGFcIiwgb25EYXRhKTtcbiAgICAgIHN0ZGluLnNldFJhd01vZGUocHJldmlvdXNSYXdNb2RlKTtcbiAgICAgIHN0ZGluLnBhdXNlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBuby1vcCAqL1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gY2xlYW51cDtcbn1cblxuLyoqXG4gKiBDb3B5IHRleHQgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgdmlhIHRoZSBPUydzIG5hdGl2ZSB0b29sLiBSZXR1cm5zXG4gKiB0cnVlIGlmIHRoZSB3cml0ZSBzdWNjZWVkZWQuIERvZXMgbm90IHRocm93LiBTaGVsbHMgb3V0IHJhdGhlciB0aGFuXG4gKiBhZGRpbmcgYSBuYXRpdmUgY2xpcGJvYXJkIGRlcCDigJQgdGhlIHRocmVlIGNvbW1hbmRzIChwYmNvcHkgLyBjbGlwIC9cbiAqIHhjbGlwIC8gd2wtY29weSkgY292ZXIgZXZlcnkgcGxhdGZvcm0gdGhlIENMSSBydW5zIG9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weVRvQ2xpcGJvYXJkKHRleHQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IHNwYXduIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ1tdXT4gPVxuICAgIHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCJcbiAgICAgID8gW1tcInBiY29weVwiLCBbXV1dXG4gICAgICA6IHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIlxuICAgICAgICA/IFtbXCJjbGlwXCIsIFtdXV1cbiAgICAgICAgOiBbXG4gICAgICAgICAgICBbXCJ3bC1jb3B5XCIsIFtdXSxcbiAgICAgICAgICAgIFtcInhjbGlwXCIsIFtcIi1zZWxlY3Rpb25cIiwgXCJjbGlwYm9hcmRcIl1dLFxuICAgICAgICAgICAgW1wieHNlbFwiLCBbXCItLWNsaXBib2FyZFwiLCBcIi0taW5wdXRcIl1dLFxuICAgICAgICAgIF07XG5cbiAgZm9yIChjb25zdCBbY21kLCBhcmdzXSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9rID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihjbWQsIGFyZ3MsIHsgc3RkaW86IFtcInBpcGVcIiwgXCJpZ25vcmVcIiwgXCJpZ25vcmVcIl0gfSk7XG4gICAgICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKCkgPT4gcmVzb2x2ZShmYWxzZSkpO1xuICAgICAgICBjaGlsZC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHJlc29sdmUoY29kZSA9PT0gMCkpO1xuICAgICAgICBjaGlsZC5zdGRpbi5lbmQodGV4dCk7XG4gICAgICB9KTtcbiAgICAgIGlmIChvaykgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyB0cnkgbmV4dCBjYW5kaWRhdGVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19