sonamu 0.11.15 → 0.12.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 (71) hide show
  1. package/dist/api/sonamu.d.ts.map +1 -1
  2. package/dist/api/sonamu.js +12 -7
  3. package/dist/bin/build-config.d.ts +3 -1
  4. package/dist/bin/build-config.d.ts.map +1 -1
  5. package/dist/bin/build-config.js +17 -6
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +4 -2
  9. package/dist/stream/__tests__/ws-test-helpers.d.ts +108 -0
  10. package/dist/stream/__tests__/ws-test-helpers.d.ts.map +1 -0
  11. package/dist/stream/__tests__/ws-test-helpers.js +260 -0
  12. package/dist/stream/index.d.ts +1 -0
  13. package/dist/stream/index.d.ts.map +1 -1
  14. package/dist/stream/index.js +4 -2
  15. package/dist/stream/ws-audience-resolver.d.ts +8 -5
  16. package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
  17. package/dist/stream/ws-audience-resolver.js +16 -13
  18. package/dist/stream/ws-cluster-bus.d.ts +9 -4
  19. package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
  20. package/dist/stream/ws-cluster-bus.js +1 -1
  21. package/dist/stream/ws-core.d.ts +10 -0
  22. package/dist/stream/ws-core.d.ts.map +1 -1
  23. package/dist/stream/ws-delivery.d.ts +30 -4
  24. package/dist/stream/ws-delivery.d.ts.map +1 -1
  25. package/dist/stream/ws-delivery.js +199 -52
  26. package/dist/stream/ws-frame.d.ts +15 -0
  27. package/dist/stream/ws-frame.d.ts.map +1 -0
  28. package/dist/stream/ws-frame.js +29 -0
  29. package/dist/stream/ws-local-connection-store.d.ts +4 -4
  30. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  31. package/dist/stream/ws-local-connection-store.js +2 -2
  32. package/dist/stream/ws-presence-index.d.ts +36 -0
  33. package/dist/stream/ws-presence-index.d.ts.map +1 -0
  34. package/dist/stream/ws-presence-index.js +177 -0
  35. package/dist/stream/ws-presence-store.d.ts +39 -39
  36. package/dist/stream/ws-presence-store.d.ts.map +1 -1
  37. package/dist/stream/ws-presence-store.js +22 -152
  38. package/dist/stream/ws-registry.d.ts +45 -17
  39. package/dist/stream/ws-registry.d.ts.map +1 -1
  40. package/dist/stream/ws-registry.js +169 -60
  41. package/dist/stream/ws-session-id.d.ts +14 -0
  42. package/dist/stream/ws-session-id.d.ts.map +1 -0
  43. package/dist/stream/ws-session-id.js +37 -0
  44. package/dist/stream/ws.d.ts +20 -10
  45. package/dist/stream/ws.d.ts.map +1 -1
  46. package/dist/stream/ws.js +59 -36
  47. package/package.json +1 -1
  48. package/src/api/__tests__/sonamu.websocket-routes.test.ts +234 -0
  49. package/src/api/__tests__/sonamu.websocket.test.ts +241 -20
  50. package/src/api/sonamu.ts +20 -7
  51. package/src/bin/__tests__/build-web-command.test.ts +57 -0
  52. package/src/bin/__tests__/zod-compiler-build.test.ts +5 -3
  53. package/src/bin/build-config.ts +19 -7
  54. package/src/index.ts +1 -0
  55. package/src/stream/__tests__/ws-contracts.test.ts +483 -265
  56. package/src/stream/__tests__/ws-multinode.test.ts +326 -0
  57. package/src/stream/__tests__/ws-registry-async.test.ts +855 -0
  58. package/src/stream/__tests__/ws-test-helpers.ts +360 -0
  59. package/src/stream/__tests__/ws.test.ts +342 -145
  60. package/src/stream/index.ts +1 -0
  61. package/src/stream/ws-audience-resolver.ts +21 -19
  62. package/src/stream/ws-cluster-bus.ts +12 -4
  63. package/src/stream/ws-core.ts +14 -0
  64. package/src/stream/ws-delivery.ts +321 -97
  65. package/src/stream/ws-frame.ts +39 -0
  66. package/src/stream/ws-local-connection-store.ts +10 -9
  67. package/src/stream/ws-presence-index.ts +273 -0
  68. package/src/stream/ws-presence-store.ts +64 -284
  69. package/src/stream/ws-registry.ts +272 -85
  70. package/src/stream/ws-session-id.ts +39 -0
  71. package/src/stream/ws.ts +91 -50
@@ -1,5 +1,6 @@
1
1
  import { type UserConfig } from "tsdown";
2
2
  import { type NormalizedZodCompilerPolicy } from "../api/config";
3
+ import { execWithLinePrefix } from "../utils/console-util";
3
4
  export type BuildArtifact<BuildCommandArgs = {}> = {
4
5
  name: string;
5
6
  description: string;
@@ -49,8 +50,9 @@ export declare function resolveApiBuildConfigPath(apiRootPath: string, dependenc
49
50
  moduleDir: string;
50
51
  }): Promise<string>;
51
52
  export declare function buildApiCommand(): Promise<void>;
52
- export declare function buildWebCommand({ skipIfMissing, }?: {
53
+ export declare function buildWebCommand({ skipIfMissing, exec, }?: {
53
54
  skipIfMissing?: boolean;
55
+ exec?: typeof execWithLinePrefix;
54
56
  }): Promise<void>;
55
57
  export {};
56
58
  //# sourceMappingURL=build-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/bin/build-config.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAajE,MAAM,MAAM,aAAa,CAAC,gBAAgB,GAAG,EAAE,IAAI;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IAC/B,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,CAAC;IACjD,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;AAEzE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAQlD;AAED,KAAK,wBAAwB,GAAG,CAAC,cAAc,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAEpF,MAAM,WAAW,+BAA+B;IAC9C,kBAAkB,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC7D;AAQD,wBAAsB,gCAAgC,CAAC,CAAC,SAAS,oBAAoB,EACnF,UAAU,EAAE,CAAC,EACb,OAAO,EAAE;IACP,MAAM,EAAE,2BAA2B,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,EACD,YAAY,GAAE,+BAAiE,GAC9E,OAAO,CAAC,CAAC,GAAG,oBAAoB,CAAC,CA6BnC;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GACjD,IAAI,CASN;AAED,eAAO,MAAM,mCAAmC,mDAAmD,CAAC;AACpG,eAAO,MAAM,kCAAkC,oDAAoD,CAAC;AAEpG,wBAAsB,kCAAkC,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5F;AAED,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,2BAA2B,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqElB;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,EASpE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,EAmBxC,CAAC;AAEF,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,YAAY,GAAE;IACZ,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;CAInB,GACA,OAAO,CAAC,MAAM,CAAC,CAajB;AA2BD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsCrD;AAED,wBAAsB,eAAe,CAAC,EACpC,aAAqB,GACtB,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlD"}
1
+ {"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/bin/build-config.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,kBAAkB,EAMnB,MAAM,uBAAuB,CAAC;AAK/B,MAAM,MAAM,aAAa,CAAC,gBAAgB,GAAG,EAAE,IAAI;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IAC/B,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,CAAC;IACjD,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;AAEzE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAQlD;AAED,KAAK,wBAAwB,GAAG,CAAC,cAAc,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAEpF,MAAM,WAAW,+BAA+B;IAC9C,kBAAkB,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC7D;AAQD,wBAAsB,gCAAgC,CAAC,CAAC,SAAS,oBAAoB,EACnF,UAAU,EAAE,CAAC,EACb,OAAO,EAAE;IACP,MAAM,EAAE,2BAA2B,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,EACD,YAAY,GAAE,+BAAiE,GAC9E,OAAO,CAAC,CAAC,GAAG,oBAAoB,CAAC,CA6BnC;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GACjD,IAAI,CASN;AAED,eAAO,MAAM,mCAAmC,mDAAmD,CAAC;AACpG,eAAO,MAAM,kCAAkC,oDAAoD,CAAC;AAEpG,wBAAsB,kCAAkC,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5F;AAED,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,2BAA2B,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqElB;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,EASpE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,EAkBxC,CAAC;AAEF,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,YAAY,GAAE;IACZ,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;CAInB,GACA,OAAO,CAAC,MAAM,CAAC,CAajB;AA2BD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsCrD;AAED,wBAAsB,eAAe,CAAC,EACpC,aAAqB,EACrB,IAAyB,GAC1B,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,kBAAkB,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCpF"}
@@ -137,13 +137,13 @@ const WEB_ARTIFACTS = [{
137
137
  description: "Web 프로젝트 클라이언트 빌드 산출물",
138
138
  projectPath: "web",
139
139
  preBuildCommand: () => "rm -rf dist/client",
140
- buildCommand: () => `${createWebTypecheckCommand()} && vite build --config vite.config.ts --outDir dist/client`
140
+ buildCommand: () => "vite build --config vite.config.ts --outDir dist/client"
141
141
  }, {
142
142
  name: "Web Server",
143
143
  description: "Web 프로젝트 서버 빌드 산출물",
144
144
  projectPath: "web",
145
145
  preBuildCommand: () => "rm -rf dist/server",
146
- buildCommand: () => `${createWebTypecheckCommand()} && vite build --config vite.config.ts --ssr src/entry-server.generated.tsx --outDir dist/server`,
146
+ buildCommand: () => "vite build --config vite.config.ts --ssr src/entry-server.generated.tsx --outDir dist/server",
147
147
  postBuildCommand: () => "rm -rf ../api/web-dist && mkdir -p ../api/web-dist && cp -r dist/* ../api/web-dist"
148
148
  }];
149
149
  async function resolveApiBuildConfigPath(apiRootPath, dependencies = {
@@ -181,7 +181,7 @@ async function runBuildSteps(artifact, options) {
181
181
  try {
182
182
  assert(step.cmd);
183
183
  printTaskStart(step.name, step.cmd, isLast);
184
- await execWithLinePrefix(step.cmd, { cwd: options.cwd });
184
+ await (options.exec ?? execWithLinePrefix)(step.cmd, { cwd: options.cwd });
185
185
  printTaskSuccess(step.name, isLast);
186
186
  } catch (error) {
187
187
  printTaskFailed(step.name, isLast);
@@ -225,7 +225,7 @@ async function buildApiCommand() {
225
225
  if (temporaryConfigPath !== void 0) await rm(temporaryConfigPath, { force: true });
226
226
  }
227
227
  }
228
- async function buildWebCommand({ skipIfMissing = false } = {}) {
228
+ async function buildWebCommand({ skipIfMissing = false, exec = execWithLinePrefix } = {}) {
229
229
  const appRootPath = findAppRootPath();
230
230
  const webPath = path.join(appRootPath, "web");
231
231
  if (!await exists(webPath)) {
@@ -237,12 +237,23 @@ async function buildWebCommand({ skipIfMissing = false } = {}) {
237
237
  }
238
238
  const startedAt = Date.now();
239
239
  try {
240
+ const typecheckCommand = createWebTypecheckCommand();
241
+ printTaskHeader("Web Typecheck", "Web 프로젝트 타입 검사", webPath);
242
+ printTaskStart("typecheck", typecheckCommand, true);
243
+ try {
244
+ await exec(typecheckCommand, { cwd: webPath });
245
+ printTaskSuccess("typecheck", true);
246
+ } catch (error) {
247
+ printTaskFailed("typecheck", true);
248
+ throw new Error("typecheck failed", { cause: error });
249
+ }
240
250
  for (const artifact of WEB_ARTIFACTS) {
241
251
  const cwd = path.join(appRootPath, artifact.projectPath);
242
252
  printTaskHeader(artifact.name, artifact.description, cwd);
243
253
  await runBuildSteps(artifact, {
244
254
  cwd,
245
- buildCommandArgs: {}
255
+ buildCommandArgs: {},
256
+ exec
246
257
  });
247
258
  }
248
259
  printBuildSummary("Web", true, Date.now() - startedAt);
@@ -254,4 +265,4 @@ async function buildWebCommand({ skipIfMissing = false } = {}) {
254
265
  //#endregion
255
266
  export { API_ARTIFACTS, HTTP_VALIDATOR_REGISTRY_BUILD_PATH, HTTP_VALIDATOR_REGISTRY_SOURCE_PATH, WEB_ARTIFACTS, assertApiZodCompilerBuildOutput, assertApiZodCompilerSourceRegistry, buildApiCommand, buildWebCommand, composeApiZodCompilerBuildConfig, createApiZodCompilerBuildWrapper, createWebTypecheckCommand, quoteShellArgument, resolveApiBuildConfigPath };
256
267
 
257
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtY29uZmlnLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vYnVpbGQtY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcIm5vZGU6YXNzZXJ0XCI7XG5pbXBvcnQgeyByZWFkRmlsZSwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgVXNlckNvbmZpZyB9IGZyb20gXCJ0c2Rvd25cIjtcblxuaW1wb3J0IHsgdHlwZSBOb3JtYWxpemVkWm9kQ29tcGlsZXJQb2xpY3kgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHtcbiAgZXhlY1dpdGhMaW5lUHJlZml4LFxuICBwcmludEJ1aWxkU3VtbWFyeSxcbiAgcHJpbnRUYXNrRmFpbGVkLFxuICBwcmludFRhc2tIZWFkZXIsXG4gIHByaW50VGFza1N0YXJ0LFxuICBwcmludFRhc2tTdWNjZXNzLFxufSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCwgZmluZEFwcFJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2FkQnVpbGRDb21waWxlclBvbGljeSB9IGZyb20gXCIuL2NvbXBpbGVyLXBvbGljeVwiO1xuXG5leHBvcnQgdHlwZSBCdWlsZEFydGlmYWN0PEJ1aWxkQ29tbWFuZEFyZ3MgPSB7fT4gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHJvamVjdFBhdGg6IHN0cmluZztcbiAgcHJlQnVpbGRDb21tYW5kPzogKCkgPT4gc3RyaW5nO1xuICBidWlsZENvbW1hbmQ6IChhcmdzOiBCdWlsZENvbW1hbmRBcmdzKSA9PiBzdHJpbmc7XG4gIHBvc3RCdWlsZENvbW1hbmQ/OiAoKSA9PiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBcGlUc2Rvd25CdWlsZENvbmZpZyA9IFBpY2s8VXNlckNvbmZpZywgXCJlbnRyeVwiIHwgXCJwbHVnaW5zXCI+O1xuXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVTaGVsbEFyZ3VtZW50KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDsnpHsnYDrlLDsmLTtkZwg7J6Q7LK066eMIOyFuCDqsr3qs4Trpbwg64ur7KeAIOuqu+2VmOuPhOuhnSDrtoTrpqztlbQg66as7YSw65+0IOyduOyImOulvCDrs7TsobTtlanri4jri6QuXG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlR5cGVjaGVja0NvbW1hbmQoKTogc3RyaW5nIHtcbiAgY29uc3QgaXNTb3VyY2VNb2R1bGUgPSBwYXRoLmV4dG5hbWUoaW1wb3J0Lm1ldGEuZmlsZW5hbWUpID09PSBcIi50c1wiO1xuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKFxuICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gICAgYHR5cGVjaGVjay13ZWIuJHtpc1NvdXJjZU1vZHVsZSA/IFwidHNcIiA6IFwianNcIn1gLFxuICApO1xuICBjb25zdCBydW5uZXIgPSBpc1NvdXJjZU1vZHVsZSA/IFwicG5wbSBleGVjIHRzeFwiIDogcXVvdGVTaGVsbEFyZ3VtZW50KHByb2Nlc3MuZXhlY1BhdGgpO1xuICByZXR1cm4gYCR7cnVubmVyfSAke3F1b3RlU2hlbGxBcmd1bWVudChzY3JpcHRQYXRoKX1gO1xufVxuXG50eXBlIFpvZENvbXBpbGVyUGx1Z2luRmFjdG9yeSA9ICh0eXBlb2YgaW1wb3J0KFwiem9kLWNvbXBpbGVyL3JvbGxkb3duXCIpKVtcImRlZmF1bHRcIl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpWm9kQ29tcGlsZXJCdWlsZERlcGVuZGVuY2llcyB7XG4gIGxvYWRDb21waWxlclBsdWdpbjogKCkgPT4gUHJvbWlzZTxab2RDb21waWxlclBsdWdpbkZhY3Rvcnk+O1xufVxuXG5jb25zdCBhcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzOiBBcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzID0ge1xuICBhc3luYyBsb2FkQ29tcGlsZXJQbHVnaW4oKSB7XG4gICAgcmV0dXJuIChhd2FpdCBpbXBvcnQoXCJ6b2QtY29tcGlsZXIvcm9sbGRvd25cIikpLmRlZmF1bHQ7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcG9zZUFwaVpvZENvbXBpbGVyQnVpbGRDb25maWc8VCBleHRlbmRzIEFwaVRzZG93bkJ1aWxkQ29uZmlnPihcbiAgYmFzZUNvbmZpZzogVCxcbiAgb3B0aW9uczoge1xuICAgIHBvbGljeTogTm9ybWFsaXplZFpvZENvbXBpbGVyUG9saWN5O1xuICAgIHJlZ2lzdHJ5UGF0aD86IHN0cmluZztcbiAgfSxcbiAgZGVwZW5kZW5jaWVzOiBBcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzID0gYXBpWm9kQ29tcGlsZXJCdWlsZERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8VCAmIEFwaVRzZG93bkJ1aWxkQ29uZmlnPiB7XG4gIGlmIChvcHRpb25zLnBvbGljeS5hcGkgIT09IFwiYW90XCIpIHtcbiAgICByZXR1cm4gYmFzZUNvbmZpZztcbiAgfVxuICBpZiAob3B0aW9ucy5yZWdpc3RyeVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInZhbGlkYXRpb24uem9kQ29tcGlsZXIuYXBpIHJlcXVpcmVzIHRoZSBnZW5lcmF0ZWQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnlcIik7XG4gIH1cblxuICBjb25zdCB6b2RDb21waWxlciA9IGF3YWl0IGRlcGVuZGVuY2llcy5sb2FkQ29tcGlsZXJQbHVnaW4oKTtcbiAgY29uc3QgY29tcGlsZXJQbHVnaW4gPSB6b2RDb21waWxlcih7XG4gICAgY29kZWdlbk1vZGU6IFwiaW5saW5lXCIsXG4gICAgaW5jbHVkZTogW29wdGlvbnMucmVnaXN0cnlQYXRoXSxcbiAgICBvdXRwdXQ6IFwiY29tcGFjdFwiLFxuICAgIHNjaGVtYXM6IFwiZXhwbGljaXRcIixcbiAgfSk7XG5cbiAgbGV0IGNvbmZpZ3VyZWRQbHVnaW5zOiBFeGNsdWRlPFVzZXJDb25maWdbXCJwbHVnaW5zXCJdLCB1bmRlZmluZWQ+W107XG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2VDb25maWcucGx1Z2lucykpIHtcbiAgICBjb25maWd1cmVkUGx1Z2lucyA9IGJhc2VDb25maWcucGx1Z2lucztcbiAgfSBlbHNlIGlmIChiYXNlQ29uZmlnLnBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmZpZ3VyZWRQbHVnaW5zID0gW107XG4gIH0gZWxzZSB7XG4gICAgY29uZmlndXJlZFBsdWdpbnMgPSBbYmFzZUNvbmZpZy5wbHVnaW5zXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uYmFzZUNvbmZpZyxcbiAgICBwbHVnaW5zOiBbLi4uY29uZmlndXJlZFBsdWdpbnMsIGNvbXBpbGVyUGx1Z2luXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFwaVpvZENvbXBpbGVyQnVpbGRPdXRwdXQoXG4gIG91dHB1dHM6IHJlYWRvbmx5IHsgY29kZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfVtdLFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMpIHtcbiAgICBpZiAoL1xcYmNvbXBpbGVcXHMqXFwoLy50ZXN0KG91dHB1dC5jb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB6b2QtY29tcGlsZXIgY29tcGlsZSBib3VuZGFyeSByZW1haW5zIGluICR7b3V0cHV0LnBhdGh9YCk7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuY29kZS5pbmNsdWRlcyhcInZpcnR1YWw6em9kLWNvbXBpbGVyL3J1bnRpbWVcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgem9kLWNvbXBpbGVyIHZpcnR1YWwgcnVudGltZSBpbXBvcnQgcmVtYWlucyBpbiAke291dHB1dC5wYXRofWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgSFRUUF9WQUxJREFUT1JfUkVHSVNUUllfU09VUkNFX1BBVEggPSBcInNyYy9hcHBsaWNhdGlvbi9zb25hbXUudmFsaWRhdG9ycy5nZW5lcmF0ZWQudHNcIjtcbmV4cG9ydCBjb25zdCBIVFRQX1ZBTElEQVRPUl9SRUdJU1RSWV9CVUlMRF9QQVRIID0gXCJkaXN0L2FwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZC5qc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0QXBpWm9kQ29tcGlsZXJTb3VyY2VSZWdpc3RyeShyZWdpc3RyeVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBleGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBub3QgZm91bmQ6ICR7cmVnaXN0cnlQYXRofWApO1xuICB9XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKHJlZ2lzdHJ5UGF0aCwgXCJ1dGY4XCIpO1xuICBpZiAoIS9maW5nZXJwcmludFxccyo9XFxzKltcIiddW2EtZjAtOV17NjR9W1wiJ10vLnRlc3Qoc291cmNlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IGZpbmdlcnByaW50IGlzIGludmFsaWQ6ICR7cmVnaXN0cnlQYXRofWApO1xuICB9XG4gIGNvbnN0IGRlY2xhcmVzWmVyb1JvdXRlcyA9IC9cXGJyb3V0ZUlkc1xccyo9XFxzKlxce1xccypcXH1cXHMqOy8udGVzdChzb3VyY2UpO1xuICBpZiAoIWRlY2xhcmVzWmVyb1JvdXRlcyAmJiAhL1xcYmNvbXBpbGVcXHMqXFwoLy50ZXN0KHNvdXJjZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBoYXMgbm8gY29tcGlsZSBib3VuZGFyeTogJHtyZWdpc3RyeVBhdGh9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwaVpvZENvbXBpbGVyQnVpbGRXcmFwcGVyKG9wdGlvbnM6IHtcbiAgYXBpUm9vdFBhdGg6IHN0cmluZztcbiAgYmFzZUNvbmZpZ1BhdGg6IHN0cmluZztcbiAgcG9saWN5OiBOb3JtYWxpemVkWm9kQ29tcGlsZXJQb2xpY3k7XG4gIHJlZ2lzdHJ5UGF0aDogc3RyaW5nO1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChvcHRpb25zLnBvbGljeS5hcGkgIT09IFwiYW90XCIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5iYXNlQ29uZmlnUGF0aDtcbiAgfVxuXG4gIGF3YWl0IGFzc2VydEFwaVpvZENvbXBpbGVyU291cmNlUmVnaXN0cnkob3B0aW9ucy5yZWdpc3RyeVBhdGgpO1xuICBjb25zdCB3cmFwcGVyUGF0aCA9IHBhdGguam9pbihcbiAgICBvcHRpb25zLmFwaVJvb3RQYXRoLFxuICAgIGAuc29uYW11LXpvZC1jb21waWxlci0ke3Byb2Nlc3MucGlkfS0ke0RhdGUubm93KCl9Lm1qc2AsXG4gICk7XG4gIGNvbnN0IGJhc2VDb25maWdVcmwgPSBwYXRoVG9GaWxlVVJMKG9wdGlvbnMuYmFzZUNvbmZpZ1BhdGgpLmhyZWY7XG4gIGNvbnN0IHNvdXJjZSA9IFtcbiAgICBgaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO2AsXG4gICAgYGltcG9ydCBiYXNlQ29uZmlnIGZyb20gJHtKU09OLnN0cmluZ2lmeShiYXNlQ29uZmlnVXJsKX07YCxcbiAgICBgaW1wb3J0IHpvZENvbXBpbGVyIGZyb20gXCJ6b2QtY29tcGlsZXIvcm9sbGRvd25cIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnN0IGNvbXBpbGVyUGx1Z2luID0gem9kQ29tcGlsZXIoJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjb2RlZ2VuTW9kZTogXCJpbmxpbmVcIixcbiAgICAgIGluY2x1ZGU6IFtvcHRpb25zLnJlZ2lzdHJ5UGF0aF0sXG4gICAgICBvdXRwdXQ6IFwiY29tcGFjdFwiLFxuICAgICAgc2NoZW1hczogXCJleHBsaWNpdFwiLFxuICAgIH0pfSk7YCxcbiAgICBgY29uc3QgcmVnaXN0cnlQYXRoID0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zLnJlZ2lzdHJ5UGF0aCl9O2AsXG4gICAgYGNvbnN0IGFwaVJvb3RQYXRoID0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zLmFwaVJvb3RQYXRoKX07YCxcbiAgICBgY29uc3QgY2Fub25pY2FsT3V0RGlyID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBcImRpc3RcIik7YCxcbiAgICBgY29uc3QgcmVnaXN0cnlFbnRyeU5hbWUgPSBcImFwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZFwiO2AsXG4gICAgYGNvbnN0IGRlZmF1bHRFbnRyeSA9IHsgaW5kZXg6IFwic3JjL2luZGV4LnRzXCIgfTtgLFxuICAgIFwiY29uc3QgcmVzb2x2ZXNUb1JlZ2lzdHJ5ID0gKGVudHJ5KSA9PlwiLFxuICAgICcgIHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiAmJiBwYXRoLnJlc29sdmUoYXBpUm9vdFBhdGgsIGVudHJ5KSA9PT0gcmVnaXN0cnlQYXRoOycsXG4gICAgXCJjb25zdCBhcHBlbmRSZWdpc3RyeUVudHJ5ID0gKGVudHJ5KSA9PiB7XCIsXG4gICAgXCIgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1wiLFxuICAgIFwiICAgIHJldHVybiBlbnRyeS5zb21lKHJlc29sdmVzVG9SZWdpc3RyeSkgPyBlbnRyeSA6IFsuLi5lbnRyeSwgcmVnaXN0cnlQYXRoXTtcIixcbiAgICBcIiAgfVwiLFxuICAgICcgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHsnLFxuICAgIFwiICAgIHJldHVybiByZXNvbHZlc1RvUmVnaXN0cnkoZW50cnkpID8gZW50cnkgOiBbZW50cnksIHJlZ2lzdHJ5UGF0aF07XCIsXG4gICAgXCIgIH1cIixcbiAgICAnICBpZiAodHlwZW9mIGVudHJ5ID09PSBcIm9iamVjdFwiICYmIGVudHJ5ICE9PSBudWxsKSB7JyxcbiAgICBcIiAgICBpZiAoT2JqZWN0LnZhbHVlcyhlbnRyeSkuc29tZShyZXNvbHZlc1RvUmVnaXN0cnkpKSByZXR1cm4gZW50cnk7XCIsXG4gICAgXCIgICAgaWYgKHJlZ2lzdHJ5RW50cnlOYW1lIGluIGVudHJ5KSB7XCIsXG4gICAgXCIgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRzZG93biBlbnRyeSBjb2xsaXNpb246ICR7cmVnaXN0cnlFbnRyeU5hbWV9YCk7XCIsXG4gICAgXCIgICAgfVwiLFxuICAgIFwiICAgIHJldHVybiB7IC4uLmVudHJ5LCBbcmVnaXN0cnlFbnRyeU5hbWVdOiByZWdpc3RyeVBhdGggfTtcIixcbiAgICBcIiAgfVwiLFxuICAgIFwiICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1wiLFxuICAgIFwiICAgIHJldHVybiB7IC4uLmRlZmF1bHRFbnRyeSwgW3JlZ2lzdHJ5RW50cnlOYW1lXTogcmVnaXN0cnlQYXRoIH07XCIsXG4gICAgXCIgIH1cIixcbiAgICBcIiAgcmV0dXJuIHsgW3JlZ2lzdHJ5RW50cnlOYW1lXTogcmVnaXN0cnlQYXRoIH07XCIsXG4gICAgXCJ9O1wiLFxuICAgIFwiY29uc3QgYXBwZW5kUGx1Z2luID0gKGNvbmZpZykgPT4gKHtcIixcbiAgICBcIiAgLi4uY29uZmlnLFwiLFxuICAgIFwiICAvLyDrn7Dtg4DsnoQgbG9hZGVy6rCAIOywuOyhsO2VmOuKlCByZWdpc3RyeSDqsr3roZzrpbwg67mM65OcIOyEpOygleqzvCDsnbzsuZjsi5ztgrXri4jri6QuXCIsXG4gICAgXCIgIG91dERpcjogY2Fub25pY2FsT3V0RGlyLFwiLFxuICAgIFwiICBmaXhlZEV4dGVuc2lvbjogZmFsc2UsXCIsXG4gICAgXCIgIGVudHJ5OiBhcHBlbmRSZWdpc3RyeUVudHJ5KGNvbmZpZy5lbnRyeSksXCIsXG4gICAgXCIgIHBsdWdpbnM6IFsuLi4oY29uZmlnLnBsdWdpbnMgPz8gW10pLCBjb21waWxlclBsdWdpbl0sXCIsXG4gICAgXCJ9KTtcIixcbiAgICBcImNvbnN0IGFwcGVuZFRvUmVzb2x2ZWRDb25maWcgPSAoY29uZmlnKSA9PlwiLFxuICAgIFwiICBBcnJheS5pc0FycmF5KGNvbmZpZykgPyBjb25maWcubWFwKGFwcGVuZFBsdWdpbikgOiBhcHBlbmRQbHVnaW4oY29uZmlnKTtcIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGRlZmF1bHQgYXN5bmMgKC4uLmFyZ3MpID0+IHtcIixcbiAgICAnICBjb25zdCByZXNvbHZlZCA9IHR5cGVvZiBiYXNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCInLFxuICAgIFwiICAgID8gYXdhaXQgYmFzZUNvbmZpZyguLi5hcmdzKVwiLFxuICAgIFwiICAgIDogYXdhaXQgYmFzZUNvbmZpZztcIixcbiAgICBcIiAgcmV0dXJuIGFwcGVuZFRvUmVzb2x2ZWRDb25maWcocmVzb2x2ZWQpO1wiLFxuICAgIFwifTtcIixcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZSh3cmFwcGVyUGF0aCwgc291cmNlLCBcInV0ZjhcIik7XG4gIHJldHVybiB3cmFwcGVyUGF0aDtcbn1cblxuLyoqXG4gKiBBUEkg7ZSE66Gc7KCd7Yq4IOu5jOuTnCDsgrDstpzrrLzsl5Ag64yA7ZWcIOq3nOy5meuTpC5cbiAqIGNsaS50c+ydmCBidWlsZF9hcGkg7ZWo7IiY6rCAIOydtOqyg+ydhCDrs7Tqs6Ag6re464yA66GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQSV9BUlRJRkFDVFM6IEJ1aWxkQXJ0aWZhY3Q8eyBjb25maWdGaWxlUGF0aDogc3RyaW5nIH0+W10gPSBbXG4gIHtcbiAgICBuYW1lOiBcIkFQSVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFQSSDtlITroZzsoJ3tirgg67mM65OcIOyCsOy2nOusvFwiLFxuICAgIHByb2plY3RQYXRoOiBcImFwaVwiLFxuICAgIHByZUJ1aWxkQ29tbWFuZDogKCkgPT4gXCJybSAtcmYgZGlzdFwiLFxuICAgIGJ1aWxkQ29tbWFuZDogKHsgY29uZmlnRmlsZVBhdGggfSkgPT5cbiAgICAgIGB0c2MgLS1ub0VtaXQgJiYgcG5wbSBleGVjIHRzZG93biAtLWNvbmZpZyAke0pTT04uc3RyaW5naWZ5KGNvbmZpZ0ZpbGVQYXRoKX1gLFxuICB9LFxuXTtcblxuLyoqXG4gKiDsm7kg7ZSE66Gc7KCd7Yq4IOu5jOuTnCDsgrDstpzrrLzsl5Ag64yA7ZWcIOq3nOy5meuTpC5cbiAqIGNsaS50c+ydmCBidWlsZF93ZWIg7ZWo7IiY6rCAIOydtOqyg+ydhCDrs7Tqs6Ag6re464yA66GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdFQl9BUlRJRkFDVFM6IEJ1aWxkQXJ0aWZhY3RbXSA9IFtcbiAge1xuICAgIG5hbWU6IFwiV2ViIENsaWVudFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIldlYiDtlITroZzsoJ3tirgg7YG065287J207Ja47Yq4IOu5jOuTnCDsgrDstpzrrLxcIixcbiAgICBwcm9qZWN0UGF0aDogXCJ3ZWJcIixcbiAgICBwcmVCdWlsZENvbW1hbmQ6ICgpID0+IFwicm0gLXJmIGRpc3QvY2xpZW50XCIsXG4gICAgYnVpbGRDb21tYW5kOiAoKSA9PlxuICAgICAgYCR7Y3JlYXRlV2ViVHlwZWNoZWNrQ29tbWFuZCgpfSAmJiB2aXRlIGJ1aWxkIC0tY29uZmlnIHZpdGUuY29uZmlnLnRzIC0tb3V0RGlyIGRpc3QvY2xpZW50YCxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiV2ViIFNlcnZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIldlYiDtlITroZzsoJ3tirgg7ISc67KEIOu5jOuTnCDsgrDstpzrrLxcIixcbiAgICBwcm9qZWN0UGF0aDogXCJ3ZWJcIixcbiAgICBwcmVCdWlsZENvbW1hbmQ6ICgpID0+IFwicm0gLXJmIGRpc3Qvc2VydmVyXCIsXG4gICAgYnVpbGRDb21tYW5kOiAoKSA9PlxuICAgICAgYCR7Y3JlYXRlV2ViVHlwZWNoZWNrQ29tbWFuZCgpfSAmJiB2aXRlIGJ1aWxkIC0tY29uZmlnIHZpdGUuY29uZmlnLnRzIC0tc3NyIHNyYy9lbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLnRzeCAtLW91dERpciBkaXN0L3NlcnZlcmAsXG4gICAgcG9zdEJ1aWxkQ29tbWFuZDogKCkgPT5cbiAgICAgIFwicm0gLXJmIC4uL2FwaS93ZWItZGlzdCAmJiBta2RpciAtcCAuLi9hcGkvd2ViLWRpc3QgJiYgY3AgLXIgZGlzdC8qIC4uL2FwaS93ZWItZGlzdFwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVBcGlCdWlsZENvbmZpZ1BhdGgoXG4gIGFwaVJvb3RQYXRoOiBzdHJpbmcsXG4gIGRlcGVuZGVuY2llczoge1xuICAgIGV4aXN0czogKGNhbmRpZGF0ZVBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBtb2R1bGVEaXI6IHN0cmluZztcbiAgfSA9IHtcbiAgICBleGlzdHMsXG4gICAgbW9kdWxlRGlyOiBpbXBvcnQubWV0YS5kaXJuYW1lLFxuICB9LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBcInRzZG93bi5jb25maWcudHNcIik7XG4gIGlmIChhd2FpdCBkZXBlbmRlbmNpZXMuZXhpc3RzKGxvY2FsQ29uZmlnUGF0aCkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJVc2luZyB0c2Rvd24uY29uZmlnLnRzIGZyb20gcHJvamVjdCByb290Li4uXCIpKTtcbiAgICByZXR1cm4gbG9jYWxDb25maWdQYXRoO1xuICB9XG5cbiAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgZGVmYXVsdCB0c2Rvd24gQVBJIGNvbmZpZyBmcm9tIHNvbmFtdSBwYWNrYWdlLi4uXCIpKTtcbiAgY29uc3QgY29tcGlsZWRDb25maWdQYXRoID0gcGF0aC5qb2luKGRlcGVuZGVuY2llcy5tb2R1bGVEaXIsIFwiLi5cIiwgXCJ0c2Rvd24uYXBpLmNvbmZpZy5qc1wiKTtcbiAgaWYgKGF3YWl0IGRlcGVuZGVuY2llcy5leGlzdHMoY29tcGlsZWRDb25maWdQYXRoKSkge1xuICAgIHJldHVybiBjb21waWxlZENvbmZpZ1BhdGg7XG4gIH1cbiAgcmV0dXJuIHBhdGguam9pbihkZXBlbmRlbmNpZXMubW9kdWxlRGlyLCBcIi4uXCIsIFwiLi5cIiwgXCJ0c2Rvd24uYXBpLmNvbmZpZy50c1wiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQgIT09IHVuZGVmaW5lZCk7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHN0ZXBzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHN0ZXAgPSBzdGVwc1tpbmRleF07XG4gICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT09IHN0ZXBzLmxlbmd0aCAtIDE7XG4gICAgdHJ5IHtcbiAgICAgIGFzc2VydChzdGVwLmNtZCk7XG4gICAgICBwcmludFRhc2tTdGFydChzdGVwLm5hbWUsIHN0ZXAuY21kLCBpc0xhc3QpO1xuICAgICAgYXdhaXQgZXhlY1dpdGhMaW5lUHJlZml4KHN0ZXAuY21kLCB7IGN3ZDogb3B0aW9ucy5jd2QgfSk7XG4gICAgICBwcmludFRhc2tTdWNjZXNzKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGVwLm5hbWV9IGZhaWxlZGAsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRBcGlDb21tYW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcGlSb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICBjb25zdCBiYXNlQ29uZmlnUGF0aCA9IGF3YWl0IHJlc29sdmVBcGlCdWlsZENvbmZpZ1BhdGgoYXBpUm9vdFBhdGgpO1xuICBjb25zdCBwb2xpY3kgPSBhd2FpdCBsb2FkQnVpbGRDb21waWxlclBvbGljeShhcGlSb290UGF0aCk7XG4gIGNvbnN0IHJlZ2lzdHJ5UGF0aCA9IHBhdGguam9pbihhcGlSb290UGF0aCwgSFRUUF9WQUxJREFUT1JfUkVHSVNUUllfU09VUkNFX1BBVEgpO1xuICBjb25zdCBjb25maWdGaWxlUGF0aCA9IGF3YWl0IGNyZWF0ZUFwaVpvZENvbXBpbGVyQnVpbGRXcmFwcGVyKHtcbiAgICBhcGlSb290UGF0aCxcbiAgICBiYXNlQ29uZmlnUGF0aCxcbiAgICBwb2xpY3ksXG4gICAgcmVnaXN0cnlQYXRoLFxuICB9KTtcbiAgY29uc3QgdGVtcG9yYXJ5Q29uZmlnUGF0aCA9IGNvbmZpZ0ZpbGVQYXRoID09PSBiYXNlQ29uZmlnUGF0aCA/IHVuZGVmaW5lZCA6IGNvbmZpZ0ZpbGVQYXRoO1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBBUElfQVJUSUZBQ1RTKSB7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGFwaVJvb3RQYXRoKTtcbiAgICAgIGF3YWl0IHJ1bkJ1aWxkU3RlcHMoYXJ0aWZhY3QsIHtcbiAgICAgICAgY3dkOiBhcGlSb290UGF0aCxcbiAgICAgICAgYnVpbGRDb21tYW5kQXJnczogeyBjb25maWdGaWxlUGF0aCB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChwb2xpY3kuYXBpID09PSBcImFvdFwiKSB7XG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBIVFRQX1ZBTElEQVRPUl9SRUdJU1RSWV9CVUlMRF9QQVRIKTtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhvdXRwdXRQYXRoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWlsdCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBub3QgZm91bmQ6ICR7b3V0cHV0UGF0aH1gKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydEFwaVpvZENvbXBpbGVyQnVpbGRPdXRwdXQoW1xuICAgICAgICB7IGNvZGU6IGF3YWl0IHJlYWRGaWxlKG91dHB1dFBhdGgsIFwidXRmOFwiKSwgcGF0aDogb3V0cHV0UGF0aCB9LFxuICAgICAgXSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIHRydWUsIERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcG9yYXJ5Q29uZmlnUGF0aCAhPT0gdW5kZWZpbmVkKSBhd2FpdCBybSh0ZW1wb3JhcnlDb25maWdQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFdlYkNvbW1hbmQoe1xuICBza2lwSWZNaXNzaW5nID0gZmFsc2UsXG59OiB7IHNraXBJZk1pc3Npbmc/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcHBSb290UGF0aCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKGFwcFJvb3RQYXRoLCBcIndlYlwiKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3ZWIg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke3dlYlBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgV0VCX0FSVElGQUNUUykge1xuICAgICAgY29uc3QgY3dkID0gcGF0aC5qb2luKGFwcFJvb3RQYXRoLCBhcnRpZmFjdC5wcm9qZWN0UGF0aCk7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGN3ZCk7XG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O2tCQWdCOEI7Y0FDWTtXQUN1QjtBQWNqRSxTQUFnQixtQkFBbUIsT0FBdUI7Q0FFeEQsT0FBTyxJQUFJLE1BQU0sV0FBVyxLQUFLLE9BQU8sRUFBRTtBQUM1QztBQUVBLFNBQWdCLDRCQUFvQztDQUNsRCxNQUFNLGlCQUFpQixLQUFLLFFBQVEsT0FBTyxLQUFLLFFBQVEsTUFBTTtDQUM5RCxNQUFNLGFBQWEsS0FBSyxLQUN0QixPQUFPLEtBQUssU0FDWixpQkFBaUIsaUJBQWlCLE9BQU8sTUFDM0M7Q0FFQSxPQUFPLEdBRFEsaUJBQWlCLGtCQUFrQixtQkFBbUIsUUFBUSxRQUFRLEVBQ3BFLEdBQUcsbUJBQW1CLFVBQVU7QUFDbkQ7QUFRQSxNQUFNLGtDQUFtRSxFQUN2RSxNQUFNLHFCQUFxQjtDQUN6QixRQUFRLE1BQU0sT0FBTyx5QkFBQSxDQUEwQjtBQUNqRCxFQUNGO0FBRUEsZUFBc0IsaUNBQ3BCLFlBQ0EsU0FJQSxlQUFnRCxpQ0FDYjtDQUNuQyxJQUFJLFFBQVEsT0FBTyxRQUFRLE9BQ3pCLE9BQU87Q0FFVCxJQUFJLFFBQVEsaUJBQWlCLFFBQzNCLE1BQU0sSUFBSSxNQUFNLDJFQUEyRTtDQUk3RixNQUFNLGtCQUFpQixNQURHLGFBQWEsbUJBQW1CLEVBQ25DLENBQVk7RUFDakMsYUFBYTtFQUNiLFNBQVMsQ0FBQyxRQUFRLFlBQVk7RUFDOUIsUUFBUTtFQUNSLFNBQVM7Q0FDWCxDQUFDO0NBRUQsSUFBSTtDQUNKLElBQUksTUFBTSxRQUFRLFdBQVcsT0FBTyxHQUNsQyxvQkFBb0IsV0FBVztNQUMx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
268
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtY29uZmlnLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vYnVpbGQtY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcIm5vZGU6YXNzZXJ0XCI7XG5pbXBvcnQgeyByZWFkRmlsZSwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgVXNlckNvbmZpZyB9IGZyb20gXCJ0c2Rvd25cIjtcblxuaW1wb3J0IHsgdHlwZSBOb3JtYWxpemVkWm9kQ29tcGlsZXJQb2xpY3kgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHtcbiAgZXhlY1dpdGhMaW5lUHJlZml4LFxuICBwcmludEJ1aWxkU3VtbWFyeSxcbiAgcHJpbnRUYXNrRmFpbGVkLFxuICBwcmludFRhc2tIZWFkZXIsXG4gIHByaW50VGFza1N0YXJ0LFxuICBwcmludFRhc2tTdWNjZXNzLFxufSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCwgZmluZEFwcFJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2FkQnVpbGRDb21waWxlclBvbGljeSB9IGZyb20gXCIuL2NvbXBpbGVyLXBvbGljeVwiO1xuXG5leHBvcnQgdHlwZSBCdWlsZEFydGlmYWN0PEJ1aWxkQ29tbWFuZEFyZ3MgPSB7fT4gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHJvamVjdFBhdGg6IHN0cmluZztcbiAgcHJlQnVpbGRDb21tYW5kPzogKCkgPT4gc3RyaW5nO1xuICBidWlsZENvbW1hbmQ6IChhcmdzOiBCdWlsZENvbW1hbmRBcmdzKSA9PiBzdHJpbmc7XG4gIHBvc3RCdWlsZENvbW1hbmQ/OiAoKSA9PiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBcGlUc2Rvd25CdWlsZENvbmZpZyA9IFBpY2s8VXNlckNvbmZpZywgXCJlbnRyeVwiIHwgXCJwbHVnaW5zXCI+O1xuXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVTaGVsbEFyZ3VtZW50KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDsnpHsnYDrlLDsmLTtkZwg7J6Q7LK066eMIOyFuCDqsr3qs4Trpbwg64ur7KeAIOuqu+2VmOuPhOuhnSDrtoTrpqztlbQg66as7YSw65+0IOyduOyImOulvCDrs7TsobTtlanri4jri6QuXG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlR5cGVjaGVja0NvbW1hbmQoKTogc3RyaW5nIHtcbiAgY29uc3QgaXNTb3VyY2VNb2R1bGUgPSBwYXRoLmV4dG5hbWUoaW1wb3J0Lm1ldGEuZmlsZW5hbWUpID09PSBcIi50c1wiO1xuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKFxuICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gICAgYHR5cGVjaGVjay13ZWIuJHtpc1NvdXJjZU1vZHVsZSA/IFwidHNcIiA6IFwianNcIn1gLFxuICApO1xuICBjb25zdCBydW5uZXIgPSBpc1NvdXJjZU1vZHVsZSA/IFwicG5wbSBleGVjIHRzeFwiIDogcXVvdGVTaGVsbEFyZ3VtZW50KHByb2Nlc3MuZXhlY1BhdGgpO1xuICByZXR1cm4gYCR7cnVubmVyfSAke3F1b3RlU2hlbGxBcmd1bWVudChzY3JpcHRQYXRoKX1gO1xufVxuXG50eXBlIFpvZENvbXBpbGVyUGx1Z2luRmFjdG9yeSA9ICh0eXBlb2YgaW1wb3J0KFwiem9kLWNvbXBpbGVyL3JvbGxkb3duXCIpKVtcImRlZmF1bHRcIl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpWm9kQ29tcGlsZXJCdWlsZERlcGVuZGVuY2llcyB7XG4gIGxvYWRDb21waWxlclBsdWdpbjogKCkgPT4gUHJvbWlzZTxab2RDb21waWxlclBsdWdpbkZhY3Rvcnk+O1xufVxuXG5jb25zdCBhcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzOiBBcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzID0ge1xuICBhc3luYyBsb2FkQ29tcGlsZXJQbHVnaW4oKSB7XG4gICAgcmV0dXJuIChhd2FpdCBpbXBvcnQoXCJ6b2QtY29tcGlsZXIvcm9sbGRvd25cIikpLmRlZmF1bHQ7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcG9zZUFwaVpvZENvbXBpbGVyQnVpbGRDb25maWc8VCBleHRlbmRzIEFwaVRzZG93bkJ1aWxkQ29uZmlnPihcbiAgYmFzZUNvbmZpZzogVCxcbiAgb3B0aW9uczoge1xuICAgIHBvbGljeTogTm9ybWFsaXplZFpvZENvbXBpbGVyUG9saWN5O1xuICAgIHJlZ2lzdHJ5UGF0aD86IHN0cmluZztcbiAgfSxcbiAgZGVwZW5kZW5jaWVzOiBBcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzID0gYXBpWm9kQ29tcGlsZXJCdWlsZERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8VCAmIEFwaVRzZG93bkJ1aWxkQ29uZmlnPiB7XG4gIGlmIChvcHRpb25zLnBvbGljeS5hcGkgIT09IFwiYW90XCIpIHtcbiAgICByZXR1cm4gYmFzZUNvbmZpZztcbiAgfVxuICBpZiAob3B0aW9ucy5yZWdpc3RyeVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInZhbGlkYXRpb24uem9kQ29tcGlsZXIuYXBpIHJlcXVpcmVzIHRoZSBnZW5lcmF0ZWQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnlcIik7XG4gIH1cblxuICBjb25zdCB6b2RDb21waWxlciA9IGF3YWl0IGRlcGVuZGVuY2llcy5sb2FkQ29tcGlsZXJQbHVnaW4oKTtcbiAgY29uc3QgY29tcGlsZXJQbHVnaW4gPSB6b2RDb21waWxlcih7XG4gICAgY29kZWdlbk1vZGU6IFwiaW5saW5lXCIsXG4gICAgaW5jbHVkZTogW29wdGlvbnMucmVnaXN0cnlQYXRoXSxcbiAgICBvdXRwdXQ6IFwiY29tcGFjdFwiLFxuICAgIHNjaGVtYXM6IFwiZXhwbGljaXRcIixcbiAgfSk7XG5cbiAgbGV0IGNvbmZpZ3VyZWRQbHVnaW5zOiBFeGNsdWRlPFVzZXJDb25maWdbXCJwbHVnaW5zXCJdLCB1bmRlZmluZWQ+W107XG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2VDb25maWcucGx1Z2lucykpIHtcbiAgICBjb25maWd1cmVkUGx1Z2lucyA9IGJhc2VDb25maWcucGx1Z2lucztcbiAgfSBlbHNlIGlmIChiYXNlQ29uZmlnLnBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmZpZ3VyZWRQbHVnaW5zID0gW107XG4gIH0gZWxzZSB7XG4gICAgY29uZmlndXJlZFBsdWdpbnMgPSBbYmFzZUNvbmZpZy5wbHVnaW5zXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uYmFzZUNvbmZpZyxcbiAgICBwbHVnaW5zOiBbLi4uY29uZmlndXJlZFBsdWdpbnMsIGNvbXBpbGVyUGx1Z2luXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFwaVpvZENvbXBpbGVyQnVpbGRPdXRwdXQoXG4gIG91dHB1dHM6IHJlYWRvbmx5IHsgY29kZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfVtdLFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMpIHtcbiAgICBpZiAoL1xcYmNvbXBpbGVcXHMqXFwoLy50ZXN0KG91dHB1dC5jb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB6b2QtY29tcGlsZXIgY29tcGlsZSBib3VuZGFyeSByZW1haW5zIGluICR7b3V0cHV0LnBhdGh9YCk7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuY29kZS5pbmNsdWRlcyhcInZpcnR1YWw6em9kLWNvbXBpbGVyL3J1bnRpbWVcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgem9kLWNvbXBpbGVyIHZpcnR1YWwgcnVudGltZSBpbXBvcnQgcmVtYWlucyBpbiAke291dHB1dC5wYXRofWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgSFRUUF9WQUxJREFUT1JfUkVHSVNUUllfU09VUkNFX1BBVEggPSBcInNyYy9hcHBsaWNhdGlvbi9zb25hbXUudmFsaWRhdG9ycy5nZW5lcmF0ZWQudHNcIjtcbmV4cG9ydCBjb25zdCBIVFRQX1ZBTElEQVRPUl9SRUdJU1RSWV9CVUlMRF9QQVRIID0gXCJkaXN0L2FwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZC5qc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0QXBpWm9kQ29tcGlsZXJTb3VyY2VSZWdpc3RyeShyZWdpc3RyeVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBleGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBub3QgZm91bmQ6ICR7cmVnaXN0cnlQYXRofWApO1xuICB9XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKHJlZ2lzdHJ5UGF0aCwgXCJ1dGY4XCIpO1xuICBpZiAoIS9maW5nZXJwcmludFxccyo9XFxzKltcIiddW2EtZjAtOV17NjR9W1wiJ10vLnRlc3Qoc291cmNlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IGZpbmdlcnByaW50IGlzIGludmFsaWQ6ICR7cmVnaXN0cnlQYXRofWApO1xuICB9XG4gIGNvbnN0IGRlY2xhcmVzWmVyb1JvdXRlcyA9IC9cXGJyb3V0ZUlkc1xccyo9XFxzKlxce1xccypcXH1cXHMqOy8udGVzdChzb3VyY2UpO1xuICBpZiAoIWRlY2xhcmVzWmVyb1JvdXRlcyAmJiAhL1xcYmNvbXBpbGVcXHMqXFwoLy50ZXN0KHNvdXJjZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBoYXMgbm8gY29tcGlsZSBib3VuZGFyeTogJHtyZWdpc3RyeVBhdGh9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwaVpvZENvbXBpbGVyQnVpbGRXcmFwcGVyKG9wdGlvbnM6IHtcbiAgYXBpUm9vdFBhdGg6IHN0cmluZztcbiAgYmFzZUNvbmZpZ1BhdGg6IHN0cmluZztcbiAgcG9saWN5OiBOb3JtYWxpemVkWm9kQ29tcGlsZXJQb2xpY3k7XG4gIHJlZ2lzdHJ5UGF0aDogc3RyaW5nO1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChvcHRpb25zLnBvbGljeS5hcGkgIT09IFwiYW90XCIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5iYXNlQ29uZmlnUGF0aDtcbiAgfVxuXG4gIGF3YWl0IGFzc2VydEFwaVpvZENvbXBpbGVyU291cmNlUmVnaXN0cnkob3B0aW9ucy5yZWdpc3RyeVBhdGgpO1xuICBjb25zdCB3cmFwcGVyUGF0aCA9IHBhdGguam9pbihcbiAgICBvcHRpb25zLmFwaVJvb3RQYXRoLFxuICAgIGAuc29uYW11LXpvZC1jb21waWxlci0ke3Byb2Nlc3MucGlkfS0ke0RhdGUubm93KCl9Lm1qc2AsXG4gICk7XG4gIGNvbnN0IGJhc2VDb25maWdVcmwgPSBwYXRoVG9GaWxlVVJMKG9wdGlvbnMuYmFzZUNvbmZpZ1BhdGgpLmhyZWY7XG4gIGNvbnN0IHNvdXJjZSA9IFtcbiAgICBgaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO2AsXG4gICAgYGltcG9ydCBiYXNlQ29uZmlnIGZyb20gJHtKU09OLnN0cmluZ2lmeShiYXNlQ29uZmlnVXJsKX07YCxcbiAgICBgaW1wb3J0IHpvZENvbXBpbGVyIGZyb20gXCJ6b2QtY29tcGlsZXIvcm9sbGRvd25cIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnN0IGNvbXBpbGVyUGx1Z2luID0gem9kQ29tcGlsZXIoJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjb2RlZ2VuTW9kZTogXCJpbmxpbmVcIixcbiAgICAgIGluY2x1ZGU6IFtvcHRpb25zLnJlZ2lzdHJ5UGF0aF0sXG4gICAgICBvdXRwdXQ6IFwiY29tcGFjdFwiLFxuICAgICAgc2NoZW1hczogXCJleHBsaWNpdFwiLFxuICAgIH0pfSk7YCxcbiAgICBgY29uc3QgcmVnaXN0cnlQYXRoID0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zLnJlZ2lzdHJ5UGF0aCl9O2AsXG4gICAgYGNvbnN0IGFwaVJvb3RQYXRoID0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zLmFwaVJvb3RQYXRoKX07YCxcbiAgICBgY29uc3QgY2Fub25pY2FsT3V0RGlyID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBcImRpc3RcIik7YCxcbiAgICBgY29uc3QgcmVnaXN0cnlFbnRyeU5hbWUgPSBcImFwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZFwiO2AsXG4gICAgYGNvbnN0IGRlZmF1bHRFbnRyeSA9IHsgaW5kZXg6IFwic3JjL2luZGV4LnRzXCIgfTtgLFxuICAgIFwiY29uc3QgcmVzb2x2ZXNUb1JlZ2lzdHJ5ID0gKGVudHJ5KSA9PlwiLFxuICAgICcgIHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiAmJiBwYXRoLnJlc29sdmUoYXBpUm9vdFBhdGgsIGVudHJ5KSA9PT0gcmVnaXN0cnlQYXRoOycsXG4gICAgXCJjb25zdCBhcHBlbmRSZWdpc3RyeUVudHJ5ID0gKGVudHJ5KSA9PiB7XCIsXG4gICAgXCIgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1wiLFxuICAgIFwiICAgIHJldHVybiBlbnRyeS5zb21lKHJlc29sdmVzVG9SZWdpc3RyeSkgPyBlbnRyeSA6IFsuLi5lbnRyeSwgcmVnaXN0cnlQYXRoXTtcIixcbiAgICBcIiAgfVwiLFxuICAgICcgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHsnLFxuICAgIFwiICAgIHJldHVybiByZXNvbHZlc1RvUmVnaXN0cnkoZW50cnkpID8gZW50cnkgOiBbZW50cnksIHJlZ2lzdHJ5UGF0aF07XCIsXG4gICAgXCIgIH1cIixcbiAgICAnICBpZiAodHlwZW9mIGVudHJ5ID09PSBcIm9iamVjdFwiICYmIGVudHJ5ICE9PSBudWxsKSB7JyxcbiAgICBcIiAgICBpZiAoT2JqZWN0LnZhbHVlcyhlbnRyeSkuc29tZShyZXNvbHZlc1RvUmVnaXN0cnkpKSByZXR1cm4gZW50cnk7XCIsXG4gICAgXCIgICAgaWYgKHJlZ2lzdHJ5RW50cnlOYW1lIGluIGVudHJ5KSB7XCIsXG4gICAgXCIgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRzZG93biBlbnRyeSBjb2xsaXNpb246ICR7cmVnaXN0cnlFbnRyeU5hbWV9YCk7XCIsXG4gICAgXCIgICAgfVwiLFxuICAgIFwiICAgIHJldHVybiB7IC4uLmVudHJ5LCBbcmVnaXN0cnlFbnRyeU5hbWVdOiByZWdpc3RyeVBhdGggfTtcIixcbiAgICBcIiAgfVwiLFxuICAgIFwiICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1wiLFxuICAgIFwiICAgIHJldHVybiB7IC4uLmRlZmF1bHRFbnRyeSwgW3JlZ2lzdHJ5RW50cnlOYW1lXTogcmVnaXN0cnlQYXRoIH07XCIsXG4gICAgXCIgIH1cIixcbiAgICBcIiAgcmV0dXJuIHsgW3JlZ2lzdHJ5RW50cnlOYW1lXTogcmVnaXN0cnlQYXRoIH07XCIsXG4gICAgXCJ9O1wiLFxuICAgIFwiY29uc3QgYXBwZW5kUGx1Z2luID0gKGNvbmZpZykgPT4gKHtcIixcbiAgICBcIiAgLi4uY29uZmlnLFwiLFxuICAgIFwiICAvLyDrn7Dtg4DsnoQgbG9hZGVy6rCAIOywuOyhsO2VmOuKlCByZWdpc3RyeSDqsr3roZzrpbwg67mM65OcIOyEpOygleqzvCDsnbzsuZjsi5ztgrXri4jri6QuXCIsXG4gICAgXCIgIG91dERpcjogY2Fub25pY2FsT3V0RGlyLFwiLFxuICAgIFwiICBmaXhlZEV4dGVuc2lvbjogZmFsc2UsXCIsXG4gICAgXCIgIGVudHJ5OiBhcHBlbmRSZWdpc3RyeUVudHJ5KGNvbmZpZy5lbnRyeSksXCIsXG4gICAgXCIgIHBsdWdpbnM6IFsuLi4oY29uZmlnLnBsdWdpbnMgPz8gW10pLCBjb21waWxlclBsdWdpbl0sXCIsXG4gICAgXCJ9KTtcIixcbiAgICBcImNvbnN0IGFwcGVuZFRvUmVzb2x2ZWRDb25maWcgPSAoY29uZmlnKSA9PlwiLFxuICAgIFwiICBBcnJheS5pc0FycmF5KGNvbmZpZykgPyBjb25maWcubWFwKGFwcGVuZFBsdWdpbikgOiBhcHBlbmRQbHVnaW4oY29uZmlnKTtcIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGRlZmF1bHQgYXN5bmMgKC4uLmFyZ3MpID0+IHtcIixcbiAgICAnICBjb25zdCByZXNvbHZlZCA9IHR5cGVvZiBiYXNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCInLFxuICAgIFwiICAgID8gYXdhaXQgYmFzZUNvbmZpZyguLi5hcmdzKVwiLFxuICAgIFwiICAgIDogYXdhaXQgYmFzZUNvbmZpZztcIixcbiAgICBcIiAgcmV0dXJuIGFwcGVuZFRvUmVzb2x2ZWRDb25maWcocmVzb2x2ZWQpO1wiLFxuICAgIFwifTtcIixcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZSh3cmFwcGVyUGF0aCwgc291cmNlLCBcInV0ZjhcIik7XG4gIHJldHVybiB3cmFwcGVyUGF0aDtcbn1cblxuLyoqXG4gKiBBUEkg7ZSE66Gc7KCd7Yq4IOu5jOuTnCDsgrDstpzrrLzsl5Ag64yA7ZWcIOq3nOy5meuTpC5cbiAqIGNsaS50c+ydmCBidWlsZF9hcGkg7ZWo7IiY6rCAIOydtOqyg+ydhCDrs7Tqs6Ag6re464yA66GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQSV9BUlRJRkFDVFM6IEJ1aWxkQXJ0aWZhY3Q8eyBjb25maWdGaWxlUGF0aDogc3RyaW5nIH0+W10gPSBbXG4gIHtcbiAgICBuYW1lOiBcIkFQSVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFQSSDtlITroZzsoJ3tirgg67mM65OcIOyCsOy2nOusvFwiLFxuICAgIHByb2plY3RQYXRoOiBcImFwaVwiLFxuICAgIHByZUJ1aWxkQ29tbWFuZDogKCkgPT4gXCJybSAtcmYgZGlzdFwiLFxuICAgIGJ1aWxkQ29tbWFuZDogKHsgY29uZmlnRmlsZVBhdGggfSkgPT5cbiAgICAgIGB0c2MgLS1ub0VtaXQgJiYgcG5wbSBleGVjIHRzZG93biAtLWNvbmZpZyAke0pTT04uc3RyaW5naWZ5KGNvbmZpZ0ZpbGVQYXRoKX1gLFxuICB9LFxuXTtcblxuLyoqXG4gKiDsm7kg7ZSE66Gc7KCd7Yq4IOu5jOuTnCDsgrDstpzrrLzsl5Ag64yA7ZWcIOq3nOy5meuTpC5cbiAqIGNsaS50c+ydmCBidWlsZF93ZWIg7ZWo7IiY6rCAIOydtOqyg+ydhCDrs7Tqs6Ag6re464yA66GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdFQl9BUlRJRkFDVFM6IEJ1aWxkQXJ0aWZhY3RbXSA9IFtcbiAge1xuICAgIG5hbWU6IFwiV2ViIENsaWVudFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIldlYiDtlITroZzsoJ3tirgg7YG065287J207Ja47Yq4IOu5jOuTnCDsgrDstpzrrLxcIixcbiAgICBwcm9qZWN0UGF0aDogXCJ3ZWJcIixcbiAgICBwcmVCdWlsZENvbW1hbmQ6ICgpID0+IFwicm0gLXJmIGRpc3QvY2xpZW50XCIsXG4gICAgYnVpbGRDb21tYW5kOiAoKSA9PiBcInZpdGUgYnVpbGQgLS1jb25maWcgdml0ZS5jb25maWcudHMgLS1vdXREaXIgZGlzdC9jbGllbnRcIixcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiV2ViIFNlcnZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIldlYiDtlITroZzsoJ3tirgg7ISc67KEIOu5jOuTnCDsgrDstpzrrLxcIixcbiAgICBwcm9qZWN0UGF0aDogXCJ3ZWJcIixcbiAgICBwcmVCdWlsZENvbW1hbmQ6ICgpID0+IFwicm0gLXJmIGRpc3Qvc2VydmVyXCIsXG4gICAgYnVpbGRDb21tYW5kOiAoKSA9PlxuICAgICAgXCJ2aXRlIGJ1aWxkIC0tY29uZmlnIHZpdGUuY29uZmlnLnRzIC0tc3NyIHNyYy9lbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLnRzeCAtLW91dERpciBkaXN0L3NlcnZlclwiLFxuICAgIHBvc3RCdWlsZENvbW1hbmQ6ICgpID0+XG4gICAgICBcInJtIC1yZiAuLi9hcGkvd2ViLWRpc3QgJiYgbWtkaXIgLXAgLi4vYXBpL3dlYi1kaXN0ICYmIGNwIC1yIGRpc3QvKiAuLi9hcGkvd2ViLWRpc3RcIixcbiAgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlQXBpQnVpbGRDb25maWdQYXRoKFxuICBhcGlSb290UGF0aDogc3RyaW5nLFxuICBkZXBlbmRlbmNpZXM6IHtcbiAgICBleGlzdHM6IChjYW5kaWRhdGVQYXRoOiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgbW9kdWxlRGlyOiBzdHJpbmc7XG4gIH0gPSB7XG4gICAgZXhpc3RzLFxuICAgIG1vZHVsZURpcjogaW1wb3J0Lm1ldGEuZGlybmFtZSxcbiAgfSxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGxvY2FsQ29uZmlnUGF0aCA9IHBhdGguam9pbihhcGlSb290UGF0aCwgXCJ0c2Rvd24uY29uZmlnLnRzXCIpO1xuICBpZiAoYXdhaXQgZGVwZW5kZW5jaWVzLmV4aXN0cyhsb2NhbENvbmZpZ1BhdGgpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgdHNkb3duLmNvbmZpZy50cyBmcm9tIHByb2plY3Qgcm9vdC4uLlwiKSk7XG4gICAgcmV0dXJuIGxvY2FsQ29uZmlnUGF0aDtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlVzaW5nIGRlZmF1bHQgdHNkb3duIEFQSSBjb25maWcgZnJvbSBzb25hbXUgcGFja2FnZS4uLlwiKSk7XG4gIGNvbnN0IGNvbXBpbGVkQ29uZmlnUGF0aCA9IHBhdGguam9pbihkZXBlbmRlbmNpZXMubW9kdWxlRGlyLCBcIi4uXCIsIFwidHNkb3duLmFwaS5jb25maWcuanNcIik7XG4gIGlmIChhd2FpdCBkZXBlbmRlbmNpZXMuZXhpc3RzKGNvbXBpbGVkQ29uZmlnUGF0aCkpIHtcbiAgICByZXR1cm4gY29tcGlsZWRDb25maWdQYXRoO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4oZGVwZW5kZW5jaWVzLm1vZHVsZURpciwgXCIuLlwiLCBcIi4uXCIsIFwidHNkb3duLmFwaS5jb25maWcudHNcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHM8VD4oXG4gIGFydGlmYWN0OiBCdWlsZEFydGlmYWN0PFQ+LFxuICBvcHRpb25zOiB7IGN3ZDogc3RyaW5nOyBidWlsZENvbW1hbmRBcmdzOiBUOyBleGVjPzogdHlwZW9mIGV4ZWNXaXRoTGluZVByZWZpeCB9LFxuKSB7XG4gIGNvbnN0IHN0ZXBzID0gW1xuICAgIHsgbmFtZTogXCJwcmUtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wcmVCdWlsZENvbW1hbmQ/LigpIH0sXG4gICAgeyBuYW1lOiBcImJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QuYnVpbGRDb21tYW5kKG9wdGlvbnMuYnVpbGRDb21tYW5kQXJncykgfSxcbiAgICB7IG5hbWU6IFwicG9zdC1idWlsZFwiLCBjbWQ6IGFydGlmYWN0LnBvc3RCdWlsZENvbW1hbmQ/LigpIH0sXG4gIF0uZmlsdGVyKChzdGVwKSA9PiBzdGVwLmNtZCAhPT0gdW5kZWZpbmVkKTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3RlcHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3Qgc3RlcCA9IHN0ZXBzW2luZGV4XTtcbiAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA9PT0gc3RlcHMubGVuZ3RoIC0gMTtcbiAgICB0cnkge1xuICAgICAgYXNzZXJ0KHN0ZXAuY21kKTtcbiAgICAgIHByaW50VGFza1N0YXJ0KHN0ZXAubmFtZSwgc3RlcC5jbWQsIGlzTGFzdCk7XG4gICAgICBhd2FpdCAob3B0aW9ucy5leGVjID8/IGV4ZWNXaXRoTGluZVByZWZpeCkoc3RlcC5jbWQsIHsgY3dkOiBvcHRpb25zLmN3ZCB9KTtcbiAgICAgIHByaW50VGFza1N1Y2Nlc3Moc3RlcC5uYW1lLCBpc0xhc3QpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBwcmludFRhc2tGYWlsZWQoc3RlcC5uYW1lLCBpc0xhc3QpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3N0ZXAubmFtZX0gZmFpbGVkYCwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEFwaUNvbW1hbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFwaVJvb3RQYXRoID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGJhc2VDb25maWdQYXRoID0gYXdhaXQgcmVzb2x2ZUFwaUJ1aWxkQ29uZmlnUGF0aChhcGlSb290UGF0aCk7XG4gIGNvbnN0IHBvbGljeSA9IGF3YWl0IGxvYWRCdWlsZENvbXBpbGVyUG9saWN5KGFwaVJvb3RQYXRoKTtcbiAgY29uc3QgcmVnaXN0cnlQYXRoID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBIVFRQX1ZBTElEQVRPUl9SRUdJU1RSWV9TT1VSQ0VfUEFUSCk7XG4gIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gYXdhaXQgY3JlYXRlQXBpWm9kQ29tcGlsZXJCdWlsZFdyYXBwZXIoe1xuICAgIGFwaVJvb3RQYXRoLFxuICAgIGJhc2VDb25maWdQYXRoLFxuICAgIHBvbGljeSxcbiAgICByZWdpc3RyeVBhdGgsXG4gIH0pO1xuICBjb25zdCB0ZW1wb3JhcnlDb25maWdQYXRoID0gY29uZmlnRmlsZVBhdGggPT09IGJhc2VDb25maWdQYXRoID8gdW5kZWZpbmVkIDogY29uZmlnRmlsZVBhdGg7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIEFQSV9BUlRJRkFDVFMpIHtcbiAgICAgIHByaW50VGFza0hlYWRlcihhcnRpZmFjdC5uYW1lLCBhcnRpZmFjdC5kZXNjcmlwdGlvbiwgYXBpUm9vdFBhdGgpO1xuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwge1xuICAgICAgICBjd2Q6IGFwaVJvb3RQYXRoLFxuICAgICAgICBidWlsZENvbW1hbmRBcmdzOiB7IGNvbmZpZ0ZpbGVQYXRoIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHBvbGljeS5hcGkgPT09IFwiYW90XCIpIHtcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4oYXBpUm9vdFBhdGgsIEhUVFBfVkFMSURBVE9SX1JFR0lTVFJZX0JVSUxEX1BBVEgpO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKG91dHB1dFBhdGgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1aWx0IEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IG5vdCBmb3VuZDogJHtvdXRwdXRQYXRofWApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0QXBpWm9kQ29tcGlsZXJCdWlsZE91dHB1dChbXG4gICAgICAgIHsgY29kZTogYXdhaXQgcmVhZEZpbGUob3V0cHV0UGF0aCwgXCJ1dGY4XCIpLCBwYXRoOiBvdXRwdXRQYXRoIH0sXG4gICAgICBdKTtcbiAgICB9XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJBUElcIiwgdHJ1ZSwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJBUElcIiwgZmFsc2UsIERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh0ZW1wb3JhcnlDb25maWdQYXRoICE9PSB1bmRlZmluZWQpIGF3YWl0IHJtKHRlbXBvcmFyeUNvbmZpZ1BhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkV2ViQ29tbWFuZCh7XG4gIHNraXBJZk1pc3NpbmcgPSBmYWxzZSxcbiAgZXhlYyA9IGV4ZWNXaXRoTGluZVByZWZpeCxcbn06IHsgc2tpcElmTWlzc2luZz86IGJvb2xlYW47IGV4ZWM/OiB0eXBlb2YgZXhlY1dpdGhMaW5lUHJlZml4IH0gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcHBSb290UGF0aCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKGFwcFJvb3RQYXRoLCBcIndlYlwiKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3ZWIg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke3dlYlBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIC8vIO2BtOudvOydtOyWuO2KuC9TU1Ig67mM65Oc6rCAIOqwmeydgCDtg4DsnoXssrTtgazrpbwg67CY67O17ZWY7KeAIOyViuuPhOuhnSB2aXRlIOu5jOuTnCDsoITsl5Ag7ZWcIOuyiOunjCDsi6TtlontlZzri6QuXG4gICAgY29uc3QgdHlwZWNoZWNrQ29tbWFuZCA9IGNyZWF0ZVdlYlR5cGVjaGVja0NvbW1hbmQoKTtcbiAgICBwcmludFRhc2tIZWFkZXIoXCJXZWIgVHlwZWNoZWNrXCIsIFwiV2ViIO2UhOuhnOygne2KuCDtg4DsnoUg6rKA7IKsXCIsIHdlYlBhdGgpO1xuICAgIHByaW50VGFza1N0YXJ0KFwidHlwZWNoZWNrXCIsIHR5cGVjaGVja0NvbW1hbmQsIHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKHR5cGVjaGVja0NvbW1hbmQsIHsgY3dkOiB3ZWJQYXRoIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhcInR5cGVjaGVja1wiLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKFwidHlwZWNoZWNrXCIsIHRydWUpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZWNoZWNrIGZhaWxlZFwiLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIFdFQl9BUlRJRkFDVFMpIHtcbiAgICAgIGNvbnN0IGN3ZCA9IHBhdGguam9pbihhcHBSb290UGF0aCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHt9LCBleGVjIH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCB0cnVlLCBEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztrQkFnQjhCO2NBQ1k7V0FDdUI7QUFjakUsU0FBZ0IsbUJBQW1CLE9BQXVC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
package/dist/index.d.ts CHANGED
@@ -39,6 +39,7 @@ export * from "./stream/ws-audience";
39
39
  export * from "./stream/ws-cluster-bus";
40
40
  export * from "./stream/ws-core";
41
41
  export * from "./stream/ws-presence-store";
42
+ export * from "./stream/ws-session-id";
42
43
  export * from "./stream/ws";
43
44
  export * from "./stream/ws-registry";
44
45
  export * from "./tasks/decorator";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,mBAAmB,eAAe,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,cAAc,+BAA+B,CAAC;AAC9C,mBAAmB,uBAAuB,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,mBAAmB,kBAAkB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACrE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,mBAAmB,eAAe,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,cAAc,+BAA+B,CAAC;AAC9C,mBAAmB,uBAAuB,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,mBAAmB,kBAAkB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACrE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ import { CompressPresets, init_compress, isCompressDisabled, toFastifyCompressOp
8
8
  import { AlreadyProcessedException, BadRequestException, DuplicateRowException, InternalServerErrorException, NotFoundException, ServiceUnavailableException, SoException, TargetNotFoundException, UnauthorizedException, init_so_exceptions, isSoException } from "./exceptions/so-exceptions.js";
9
9
  import { createMockSSEFactory, createSSEFactory, init_sse } from "./stream/sse.js";
10
10
  import { WebSocketAudience, init_ws_audience } from "./stream/ws-audience.js";
11
+ import { createWebSocketNodeId, createWebSocketSessionId, init_ws_session_id, parseWebSocketSessionNodeId } from "./stream/ws-session-id.js";
11
12
  import { NoopWebSocketClusterBus, init_ws_cluster_bus } from "./stream/ws-cluster-bus.js";
12
13
  import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "./stream/ws-presence-store.js";
13
14
  import { WebSocketRegistry, init_ws_registry } from "./stream/ws-registry.js";
@@ -96,6 +97,7 @@ init_sse();
96
97
  init_ws_audience();
97
98
  init_ws_cluster_bus();
98
99
  init_ws_presence_store();
100
+ init_ws_session_id();
99
101
  init_ws();
100
102
  init_ws_registry();
101
103
  init_template();
@@ -106,6 +108,6 @@ init_controller();
106
108
  init_model();
107
109
  init_utils();
108
110
  //#endregion
109
- export { ADMIN_SCHEMA, ANONYMOUS_SCHEMA, API_KEY_SCHEMA, AlreadyProcessedException, ApiParamType, BASE_FIELD_MAPPINGS, BUILT_IN_TYPE_IDS, BadRequestException, BaseFrameClass, BaseModel, BaseModelClass, CachePresets, CompressPresets, DB, DBClass, DuplicateRowException, Entity, EntityJsonSchema, EntityManager, FUZZY_OPERATORS, FixtureManager, FixtureManagerClass, GenerateOptions, InMemoryWebSocketPresenceStore, InternalServerErrorException, JWT_SCHEMA, JoinClauseGroup, KnownOpclassValues, MigrationTargetExecutionError, Migrator, Naite, NaiteClass, NaiteQuery, NaiteReporter, NoopWebSocketClusterBus, NormalPropSchema, NotFoundException, ORGANIZATION_SCHEMA, PASSKEY_SCHEMA, PHONE_NUMBER_SCHEMA, PathAndCode, PostgreSQLSchemaReader, Puri, PuriTransactionWrapper, PuriWrapper, RelationPropSchema, RenderingNode, ResolvedPuri, SSO_SCHEMA, ServiceUnavailableException, SoException, Sonamu, SonamuFileArraySchema, SonamuFileSchema, SonamuQueryMode, SonamuSemanticParams, TWO_FACTOR_SCHEMA, TargetNotFoundException, Template, TemplateKey, TemplateManager, TemplateManagerClass, TemplateOptions, USERNAME_SCHEMA, UnauthorizedException, UpsertBuilder, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, WhereGroup, ZodStringFormat, addCompanionsToEntities, admin, anonymous, api, apiKey, applyCacheHeaders, asArray, assertDefined, assertExists, assertHttpValidatorRegistry, assertNotNull, betterAuthV1, buildCacheControl, cache, convertFastifyHeadersToStandard, createHttpValidator, createMockSSEFactory, createSSEFactory, createWebSocketReplyStub, createWebSocketRuntime, defaultHttpValidatorDependencies, defaultOperatorByPropType, defaultSonamuHttpValidatorDependencies, defineConfig, differenceWith, exhaustive, fastifyCaster, findApiRootPath, findAppRootPath, generateAlterCode, generateBetterAuthEntities, generateCreateCode, getAlterIndexesTo, getDescription, getEnumDefValues, getEnumValues, getHttpValidatorFingerprint, getHttpValidatorRouteIdentifier, getHttpValidatorRouteKey, getMigrationSetFromEntity, getSonamuEnvironment, getSubsetFields, getZodObjectFromApi, ingestAuditEvent, intersectionBy, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanProp, isBooleanSingleProp, isCompressDisabled, isCustomJoinClause, isDaemonServer, isDateArrayProp, isDateProp, isDateSingleProp, isDevelopment, isEnumArrayProp, isEnumDefWithCone, isEnumProp, isEnumSingleProp, isHasManyRelationProp, isHotReloadServer, isInDocker, isIntegerArrayProp, isIntegerProp, isIntegerSingleProp, isInternalSubsetField, isJsonProp, isKnexError, isLocal, isManyToManyRelationProp, isNumberArrayProp, isNumberProp, isNumberSingleProp, isNumericArrayProp, isNumericProp, isNumericSingleProp, isOneToOneRelationProp, isPlainObject, isProduction, isRefField, isRelationProp, isRemote, isSearchTextJsonSourceZodType, isSearchTextProp, isSoException, isStaging, isStringArrayProp, isStringProp, isStringSingleProp, isSubsetDefWithCone, isTest, isTsVectorProp, isUuidArrayProp, isUuidProp, isUuidSingleProp, isVectorArrayProp, isVectorProp, isVectorSingleProp, isVirtualCodeProp, isVirtualProp, isVirtualQueryProp, jwt, loadConfig, merge, nonNullable, normalizeFilterQuery, normalizeSubsetField, normalizeZodCompilerPolicy, objToMap, operatorsByPropType, organization, parseFuzzyOperator, passkey, phoneNumber, registeredApis, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions, setMigrationIndexDefaults, setupErrorHandler, sonamuAuditLog, sonamuKnexAdapter, sso, stream, toFastifyCompressOption, transactional, twoFactor, upload, username, validateSonamuFilters, websocket, withProp, withProps, workflow, zArrayable };
111
+ export { ADMIN_SCHEMA, ANONYMOUS_SCHEMA, API_KEY_SCHEMA, AlreadyProcessedException, ApiParamType, BASE_FIELD_MAPPINGS, BUILT_IN_TYPE_IDS, BadRequestException, BaseFrameClass, BaseModel, BaseModelClass, CachePresets, CompressPresets, DB, DBClass, DuplicateRowException, Entity, EntityJsonSchema, EntityManager, FUZZY_OPERATORS, FixtureManager, FixtureManagerClass, GenerateOptions, InMemoryWebSocketPresenceStore, InternalServerErrorException, JWT_SCHEMA, JoinClauseGroup, KnownOpclassValues, MigrationTargetExecutionError, Migrator, Naite, NaiteClass, NaiteQuery, NaiteReporter, NoopWebSocketClusterBus, NormalPropSchema, NotFoundException, ORGANIZATION_SCHEMA, PASSKEY_SCHEMA, PHONE_NUMBER_SCHEMA, PathAndCode, PostgreSQLSchemaReader, Puri, PuriTransactionWrapper, PuriWrapper, RelationPropSchema, RenderingNode, ResolvedPuri, SSO_SCHEMA, ServiceUnavailableException, SoException, Sonamu, SonamuFileArraySchema, SonamuFileSchema, SonamuQueryMode, SonamuSemanticParams, TWO_FACTOR_SCHEMA, TargetNotFoundException, Template, TemplateKey, TemplateManager, TemplateManagerClass, TemplateOptions, USERNAME_SCHEMA, UnauthorizedException, UpsertBuilder, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, WhereGroup, ZodStringFormat, addCompanionsToEntities, admin, anonymous, api, apiKey, applyCacheHeaders, asArray, assertDefined, assertExists, assertHttpValidatorRegistry, assertNotNull, betterAuthV1, buildCacheControl, cache, convertFastifyHeadersToStandard, createHttpValidator, createMockSSEFactory, createSSEFactory, createWebSocketNodeId, createWebSocketReplyStub, createWebSocketRuntime, createWebSocketSessionId, defaultHttpValidatorDependencies, defaultOperatorByPropType, defaultSonamuHttpValidatorDependencies, defineConfig, differenceWith, exhaustive, fastifyCaster, findApiRootPath, findAppRootPath, generateAlterCode, generateBetterAuthEntities, generateCreateCode, getAlterIndexesTo, getDescription, getEnumDefValues, getEnumValues, getHttpValidatorFingerprint, getHttpValidatorRouteIdentifier, getHttpValidatorRouteKey, getMigrationSetFromEntity, getSonamuEnvironment, getSubsetFields, getZodObjectFromApi, ingestAuditEvent, intersectionBy, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanProp, isBooleanSingleProp, isCompressDisabled, isCustomJoinClause, isDaemonServer, isDateArrayProp, isDateProp, isDateSingleProp, isDevelopment, isEnumArrayProp, isEnumDefWithCone, isEnumProp, isEnumSingleProp, isHasManyRelationProp, isHotReloadServer, isInDocker, isIntegerArrayProp, isIntegerProp, isIntegerSingleProp, isInternalSubsetField, isJsonProp, isKnexError, isLocal, isManyToManyRelationProp, isNumberArrayProp, isNumberProp, isNumberSingleProp, isNumericArrayProp, isNumericProp, isNumericSingleProp, isOneToOneRelationProp, isPlainObject, isProduction, isRefField, isRelationProp, isRemote, isSearchTextJsonSourceZodType, isSearchTextProp, isSoException, isStaging, isStringArrayProp, isStringProp, isStringSingleProp, isSubsetDefWithCone, isTest, isTsVectorProp, isUuidArrayProp, isUuidProp, isUuidSingleProp, isVectorArrayProp, isVectorProp, isVectorSingleProp, isVirtualCodeProp, isVirtualProp, isVirtualQueryProp, jwt, loadConfig, merge, nonNullable, normalizeFilterQuery, normalizeSubsetField, normalizeZodCompilerPolicy, objToMap, operatorsByPropType, organization, parseFuzzyOperator, parseWebSocketSessionNodeId, passkey, phoneNumber, registeredApis, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions, setMigrationIndexDefaults, setupErrorHandler, sonamuAuditLog, sonamuKnexAdapter, sso, stream, toFastifyCompressOption, transactional, twoFactor, upload, username, validateSonamuFilters, websocket, withProp, withProps, workflow, zArrayable };
110
112
 
111
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2FwaS9iYXNlLWZyYW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvY29uZmlnXCI7XG5leHBvcnQgdHlwZSAqIGZyb20gXCIuL2FwaS9jb250ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvZGVjb3JhdG9yc1wiO1xuZXhwb3J0IHsgZmFzdGlmeUNhc3RlciB9IGZyb20gXCIuL2FwaS9jYXN0ZXJcIjtcbmV4cG9ydCB7IGdldFpvZE9iamVjdEZyb21BcGkgfSBmcm9tIFwiLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvaHR0cC12YWxpZGF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FwaS9zb25hbXVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2F1dGhcIjtcbmV4cG9ydCB7IGNhY2hlIH0gZnJvbSBcIi4vY2FjaGUvZGVjb3JhdG9yXCI7XG5leHBvcnQgdHlwZSB7IENhY2hlRGVjb3JhdG9yT3B0aW9ucyB9IGZyb20gXCIuL2NhY2hlL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jYWNoZS1jb250cm9sL2NhY2hlLWNvbnRyb2xcIjtcbmV4cG9ydCB0eXBlICogZnJvbSBcIi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmV4cG9ydCB0eXBlICogZnJvbSBcIi4vY29tcHJlc3MvdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2Jhc2UtbW9kZWwudHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2RiXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpLnR5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpLXN1YnNldC50eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2UvcHVyaS13cmFwcGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5L2VudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5leHBvcnQgeyBnZXRTb25hbXVFbnZpcm9ubWVudCwgdHlwZSBTb25hbXVFbnZpcm9ubWVudCB9IGZyb20gXCIuL2VudlwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhjZXB0aW9ucy9lcnJvci1oYW5kbGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL2NvZGUtZ2VuZXJhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL21pZ3JhdGlvbi1zZXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21pZ3JhdGlvbi9taWdyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9uYWl0ZS9uYWl0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmFpdGUvbmFpdGUtcmVwb3J0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmVhbS9zc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmVhbS93cy1hdWRpZW5jZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyZWFtL3dzLWNsdXN0ZXItYnVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJlYW0vd3MtY29yZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyZWFtL3dzLXByZXNlbmNlLXN0b3JlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJlYW0vd3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmVhbS93cy1yZWdpc3RyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGFza3MvZGVjb3JhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZW1wbGF0ZS90ZW1wbGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVzdGluZy9maXh0dXJlLW1hbmFnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9jb250cm9sbGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvdHlwZS11dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvdXRpbHNcIjtcblxuLy8gZXhwb3J0ICogZnJvbSBcIi4vYXBpL2NvZGUtY29udmVydGVyc1wiO1xuLy8gZXhwb3J0ICogZnJvbSBcIi4vc3luY2VyL3N5bmNlclwiO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBSTRDO3FCQUNlOzs7O2VBSWxCOzs7Ozs7Ozs7OztTQWdCMkIifQ==
113
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2FwaS9iYXNlLWZyYW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvY29uZmlnXCI7XG5leHBvcnQgdHlwZSAqIGZyb20gXCIuL2FwaS9jb250ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvZGVjb3JhdG9yc1wiO1xuZXhwb3J0IHsgZmFzdGlmeUNhc3RlciB9IGZyb20gXCIuL2FwaS9jYXN0ZXJcIjtcbmV4cG9ydCB7IGdldFpvZE9iamVjdEZyb21BcGkgfSBmcm9tIFwiLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcGkvaHR0cC12YWxpZGF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FwaS9zb25hbXVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2F1dGhcIjtcbmV4cG9ydCB7IGNhY2hlIH0gZnJvbSBcIi4vY2FjaGUvZGVjb3JhdG9yXCI7XG5leHBvcnQgdHlwZSB7IENhY2hlRGVjb3JhdG9yT3B0aW9ucyB9IGZyb20gXCIuL2NhY2hlL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jYWNoZS1jb250cm9sL2NhY2hlLWNvbnRyb2xcIjtcbmV4cG9ydCB0eXBlICogZnJvbSBcIi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmV4cG9ydCB0eXBlICogZnJvbSBcIi4vY29tcHJlc3MvdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2Jhc2UtbW9kZWwudHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2RiXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpLnR5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpLXN1YnNldC50eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2UvcHVyaS13cmFwcGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5L2VudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5leHBvcnQgeyBnZXRTb25hbXVFbnZpcm9ubWVudCwgdHlwZSBTb25hbXVFbnZpcm9ubWVudCB9IGZyb20gXCIuL2VudlwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhjZXB0aW9ucy9lcnJvci1oYW5kbGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL2NvZGUtZ2VuZXJhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL21pZ3JhdGlvbi1zZXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21pZ3JhdGlvbi9taWdyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9uYWl0ZS9uYWl0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmFpdGUvbmFpdGUtcmVwb3J0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmVhbS9zc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmVhbS93cy1hdWRpZW5jZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyZWFtL3dzLWNsdXN0ZXItYnVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJlYW0vd3MtY29yZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyZWFtL3dzLXByZXNlbmNlLXN0b3JlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJlYW0vd3Mtc2Vzc2lvbi1pZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyZWFtL3dzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdHJlYW0vd3MtcmVnaXN0cnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rhc2tzL2RlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVtcGxhdGUvdGVtcGxhdGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvY29udHJvbGxlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL3R5cGUtdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XG5cbi8vIGV4cG9ydCAqIGZyb20gXCIuL2FwaS9jb2RlLWNvbnZlcnRlcnNcIjtcbi8vIGV4cG9ydCAqIGZyb20gXCIuL3N5bmNlci9zeW5jZXJcIjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUFJNEM7cUJBQ2U7Ozs7ZUFJbEI7Ozs7Ozs7Ozs7O1NBZ0IyQiJ9
@@ -0,0 +1,108 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { type WebSocketTransport } from "../ws";
3
+ import { type WebSocketAudience } from "../ws-audience";
4
+ import { type WebSocketClusterBus, type WebSocketClusterEnvelope, type WebSocketClusterEnvelopeHandler } from "../ws-cluster-bus";
5
+ import { type WebSocketRoomId, type WebSocketUserId } from "../ws-core";
6
+ import { InMemoryWebSocketPresenceStore } from "../ws-presence-store";
7
+ export declare function flushAsync(rounds?: number): Promise<void>;
8
+ export declare function flushUntil(predicate: () => boolean, maxRounds?: number): Promise<void>;
9
+ export type Deferred<T> = {
10
+ promise: Promise<T>;
11
+ resolve: (value: T) => void;
12
+ reject: (error: Error) => void;
13
+ };
14
+ export declare function createDeferred<T = void>(): Deferred<T>;
15
+ export declare function isSettled<T>(promise: Promise<T>): Promise<boolean>;
16
+ export declare class FakeWebSocket extends EventEmitter {
17
+ readyState: 0 | 1 | 2 | 3;
18
+ bufferedAmount: number;
19
+ sentMessages: string[];
20
+ pingCount: number;
21
+ closedWith: {
22
+ code?: number;
23
+ reason?: string;
24
+ } | null;
25
+ send(data: string): void;
26
+ close(code?: number, reason?: string): void;
27
+ ping(): void;
28
+ terminate(): void;
29
+ }
30
+ export declare function asWebSocket(socket: FakeWebSocket): WebSocketTransport;
31
+ export declare function parseFrames(socket: FakeWebSocket): Array<{
32
+ event: string;
33
+ data: object;
34
+ }>;
35
+ type ScriptedMethod = "register" | "activate" | "unregister" | "setUserId" | "clearUserId" | "join" | "leave" | "resolveRoute" | "getRoomMemberCount" | "shutdown";
36
+ type ScriptedInterceptor = () => void | Promise<void>;
37
+ /**
38
+ * InMemoryWebSocketPresenceStore를 감싸 호출 순서를 기록하고, 메서드별로 다음 호출의 동작을 스크립트할 수 있는 store.
39
+ * 호출 기록은 store가 호출을 "받은" 시점에 남긴다.
40
+ */
41
+ export declare class ScriptedPresenceStore {
42
+ readonly calls: string[];
43
+ readonly inner: InMemoryWebSocketPresenceStore;
44
+ nodeId?: string;
45
+ private readonly interceptors;
46
+ constructor(inner?: InMemoryWebSocketPresenceStore);
47
+ next(method: ScriptedMethod, interceptor: ScriptedInterceptor): this;
48
+ always(method: ScriptedMethod, interceptor: ScriptedInterceptor): this;
49
+ register(input: {
50
+ sessionId: string;
51
+ nodeId: string;
52
+ namespace: string;
53
+ active: boolean;
54
+ connectedAt: Date;
55
+ }): void | Promise<void>;
56
+ activate(sessionId: string): void | Promise<void>;
57
+ unregister(sessionId: string): void | Promise<void>;
58
+ setUserId(sessionId: string, userId: WebSocketUserId): void | Promise<void>;
59
+ clearUserId(sessionId: string): void | Promise<void>;
60
+ join(sessionId: string, roomId: WebSocketRoomId): void | Promise<void>;
61
+ leave(sessionId: string, roomId: WebSocketRoomId): void | Promise<void>;
62
+ resolveRoute(audience: WebSocketAudience, nodeId: string): {
63
+ localSessionIds: string[];
64
+ remoteNodeIds: string[];
65
+ } | Promise<{
66
+ localSessionIds: string[];
67
+ remoteNodeIds: string[];
68
+ }>;
69
+ getRoomMemberCount(roomId: WebSocketRoomId, namespace?: string): number | Promise<number>;
70
+ shutdown(): void | Promise<void>;
71
+ callsOf(prefix: string): string[];
72
+ private run;
73
+ }
74
+ /**
75
+ * 한 프로세스 안에서 targetNodeIds 기준으로 envelope을 라우팅하는 fake cluster 네트워크.
76
+ * 전송 구간을 흉내내기 위해 envelope을 JSON 직렬화/역직렬화한 뒤 다음 tick에 전달한다.
77
+ */
78
+ export declare class InProcessClusterNetwork {
79
+ readonly published: WebSocketClusterEnvelope[];
80
+ private readonly handlers;
81
+ bus(nodeId: string): InProcessClusterBus;
82
+ subscribe(nodeId: string, handler: WebSocketClusterEnvelopeHandler): () => void;
83
+ deliver(envelope: WebSocketClusterEnvelope): void;
84
+ }
85
+ export declare class InProcessClusterBus implements WebSocketClusterBus {
86
+ readonly nodeId: string;
87
+ private readonly network;
88
+ shutdownCalls: number;
89
+ unsubscribeCalls: number;
90
+ constructor(nodeId: string, network: InProcessClusterNetwork);
91
+ publish(envelope: WebSocketClusterEnvelope): void;
92
+ subscribe(handler: WebSocketClusterEnvelopeHandler): Promise<() => void>;
93
+ shutdown(): void;
94
+ }
95
+ export declare class RecordingClusterBus implements WebSocketClusterBus {
96
+ readonly published: WebSocketClusterEnvelope[];
97
+ readonly handlers: Set<WebSocketClusterEnvelopeHandler>;
98
+ shutdownCalls: number;
99
+ unsubscribeCalls: number;
100
+ nodeId?: string;
101
+ publish(envelope: WebSocketClusterEnvelope): void | Promise<void>;
102
+ subscribe(handler: WebSocketClusterEnvelopeHandler): (() => void) | Promise<() => void>;
103
+ emit(envelope: WebSocketClusterEnvelope): Promise<void>;
104
+ shutdown(): void | Promise<void>;
105
+ }
106
+ export declare function collectUnhandledRejections(): () => Error[];
107
+ export {};
108
+ //# sourceMappingURL=ws-test-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-test-helpers.d.ts","sourceRoot":"","sources":["../../../src/stream/__tests__/ws-test-helpers.ts"],"names":[],"mappings":"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"}