sonamu 0.11.14 → 0.11.16

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.
@@ -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/OiB0eXBlb2YgZXhlY1dpdGhMaW5lUHJlZml4IH0gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcHBSb290UGF0aCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKGFwcFJvb3RQYXRoLCBcIndlYlwiKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3ZWIg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke3dlYlBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIC8vIO2BtOudvOydtOyWuO2KuC9TU1Ig67mM65Oc6rCAIOqwmeydgCDtg4DsnoXssrTtgazrpbwg67CY67O17ZWY7KeAIOyViuuPhOuhnSB2aXRlIOu5jOuTnCDsoITsl5Ag7ZWcIOuyiOunjCDsi6TtlontlZzri6QuXG4gICAgY29uc3QgdHlwZWNoZWNrQ29tbWFuZCA9IGNyZWF0ZVdlYlR5cGVjaGVja0NvbW1hbmQoKTtcbiAgICBwcmludFRhc2tIZWFkZXIoXCJXZWIgVHlwZWNoZWNrXCIsIFwiV2ViIO2UhOuhnOygne2KuCDtg4DsnoUg6rKA7IKsXCIsIHdlYlBhdGgpO1xuICAgIHByaW50VGFza1N0YXJ0KFwidHlwZWNoZWNrXCIsIHR5cGVjaGVja0NvbW1hbmQsIHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKHR5cGVjaGVja0NvbW1hbmQsIHsgY3dkOiB3ZWJQYXRoIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhcInR5cGVjaGVja1wiLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKFwidHlwZWNoZWNrXCIsIHRydWUpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHlwZWNoZWNrIGZhaWxlZFwiLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIFdFQl9BUlRJRkFDVFMpIHtcbiAgICAgIGNvbnN0IGN3ZCA9IHBhdGguam9pbihhcHBSb290UGF0aCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHt9LCBleGVjIH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCB0cnVlLCBEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztrQkFnQjhCO2NBQ1k7V0FDdUI7QUFjakUsU0FBZ0IsbUJBQW1CLE9BQXVCO0NBRXhELE9BQU8sSUFBSSxNQUFNLFdBQVcsS0FBSyxPQUFPLEVBQUU7QUFDNUM7QUFFQSxTQUFnQiw0QkFBb0M7Q0FDbEQsTUFBTSxpQkFBaUIsS0FBSyxRQUFRLE9BQU8sS0FBSyxRQUFRLE1BQU07Q0FDOUQsTUFBTSxhQUFhLEtBQUssS0FDdEIsT0FBTyxLQUFLLFNBQ1osaUJBQWlCLGlCQUFpQixPQUFPLE1BQzNDO0NBRUEsT0FBTyxHQURRLGlCQUFpQixrQkFBa0IsbUJBQW1CLFFBQVEsUUFBUSxFQUNwRSxHQUFHLG1CQUFtQixVQUFVO0FBQ25EO0FBUUEsTUFBTSxrQ0FBbUUsRUFDdkUsTUFBTSxxQkFBcUI7Q0FDekIsUUFBUSxNQUFNLE9BQU8seUJBQUEsQ0FBMEI7QUFDakQsRUFDRjtBQUVBLGVBQXNCLGlDQUNwQixZQUNBLFNBSUEsZUFBZ0QsaUNBQ2I7Q0FDbkMsSUFBSSxRQUFRLE9BQU8sUUFBUSxPQUN6QixPQUFPO0NBRVQsSUFBSSxRQUFRLGlCQUFpQixRQUMzQixNQUFNLElBQUksTUFBTSwyRUFBMkU7Q0FJN0YsTUFBTSxrQkFBaUIsTUFERyxhQUFhLG1CQUFtQixFQUNuQyxDQUFZO0VBQ2pDLGFBQWE7RUFDYixTQUFTLENBQUMsUUFBUSxZQUFZO0VBQzlCLFFBQVE7RUFDUixTQUFTO0NBQ1gsQ0FBQztDQUVELElBQUk7Q0FDSixJQUFJLE1BQU0sUUFBUSxXQUFXLE9BQU8sR0FDbEMsb0JBQW9CLFdBQVc7TUFDMUIsSUFBSSxXQUFXLFlBQVksUUFDaEMsb0JBQW9CLENBQUM7TUFFckIsb0JBQW9CLENBQUMsV0FBVyxPQUFPO0NBR3pDLE9BQU87RUFDTCxHQUFHO0VBQ0gsU0FBUyxDQUFDLEdBQUcsbUJBQW1CLGNBQWM7Q0FDaEQ7QUFDRjtBQUVBLFNBQWdCLGdDQUNkLFNBQ007Q0FDTixLQUFLLE1BQU0sVUFBVSxTQUFTO0VBQzVCLElBQUksaUJBQWlCLEtBQUssT0FBTyxJQUFJLEdBQ25DLE1BQU0sSUFBSSxNQUFNLDRDQUE0QyxPQUFPLE1BQU07RUFFM0UsSUFBSSxPQUFPLEtBQUssU0FBUyw4QkFBOEIsR0FDckQsTUFBTSxJQUFJLE1BQU0sa0RBQWtELE9BQU8sTUFBTTtDQUVuRjtBQUNGO0FBRUEsTUFBYSxzQ0FBc0M7QUFDbkQsTUFBYSxxQ0FBcUM7QUFFbEQsZUFBc0IsbUNBQW1DLGNBQXFDO0NBQzVGLElBQUksQ0FBRSxNQUFNLE9BQU8sWUFBWSxHQUM3QixNQUFNLElBQUksTUFBTSxnREFBZ0QsY0FBYztDQUVoRixNQUFNLFNBQVMsTUFBTSxTQUFTLGNBQWMsTUFBTTtDQUNsRCxJQUFJLENBQUMseUNBQXlDLEtBQUssTUFBTSxHQUN2RCxNQUFNLElBQUksTUFBTSw2REFBNkQsY0FBYztDQUc3RixJQUFJLENBRHVCLCtCQUErQixLQUFLLE1BQzFELEtBQXNCLENBQUMsaUJBQWlCLEtBQUssTUFBTSxHQUN0RCxNQUFNLElBQUksTUFBTSw4REFBOEQsY0FBYztBQUVoRztBQUVBLGVBQXNCLGlDQUFpQyxTQUtuQztDQUNsQixJQUFJLFFBQVEsT0FBTyxRQUFRLE9BQ3pCLE9BQU8sUUFBUTtDQUdqQixNQUFNLG1DQUFtQyxRQUFRLFlBQVk7Q0FDN0QsTUFBTSxjQUFjLEtBQUssS0FDdkIsUUFBUSxhQUNSLHdCQUF3QixRQUFRLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxLQUNwRDtDQUNBLE1BQU0sZ0JBQWdCLGNBQWMsUUFBUSxjQUFjLENBQUMsQ0FBQztDQXlENUQsTUFBTSxVQUFVLGFBeEREO0VBQ2I7RUFDQSwwQkFBMEIsS0FBSyxVQUFVLGFBQWEsRUFBRTtFQUN4RDtFQUNBO0VBQ0Esc0NBQXNDLEtBQUssVUFBVTtHQUNuRCxhQUFhO0dBQ2IsU0FBUyxDQUFDLFFBQVEsWUFBWTtHQUM5QixRQUFRO0dBQ1IsU0FBUztFQUNYLENBQUMsRUFBRTtFQUNILHdCQUF3QixLQUFLLFVBQVUsUUFBUSxZQUFZLEVBQUU7RUFDN0QsdUJBQXVCLEtBQUssVUFBVSxRQUFRLFdBQVcsRUFBRTtFQUMzRDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Q0FDRixDQUFDLENBQUMsS0FBSyxJQUNzQixHQUFRLE1BQU07Q0FDM0MsT0FBTztBQUNUOzs7OztBQU1BLE1BQWEsZ0JBQTZELENBQ3hFO0NBQ0UsTUFBTTtDQUNOLGFBQWE7Q0FDYixhQUFhO0NBQ2IsdUJBQXVCO0NBQ3ZCLGVBQWUsRUFBRSxxQkFDZiw2Q0FBNkMsS0FBSyxVQUFVLGNBQWM7QUFDOUUsQ0FDRjs7Ozs7QUFNQSxNQUFhLGdCQUFpQyxDQUM1QztDQUNFLE1BQU07Q0FDTixhQUFhO0NBQ2IsYUFBYTtDQUNiLHVCQUF1QjtDQUN2QixvQkFBb0I7QUFDdEIsR0FDQTtDQUNFLE1BQU07Q0FDTixhQUFhO0NBQ2IsYUFBYTtDQUNiLHVCQUF1QjtDQUN2QixvQkFDRTtDQUNGLHdCQUNFO0FBQ0osQ0FDRjtBQUVBLGVBQXNCLDBCQUNwQixhQUNBLGVBR0k7Q0FDRjtDQUNBLFdBQVcsT0FBTyxLQUFLO0FBQ3pCLEdBQ2lCO0NBQ2pCLE1BQU0sa0JBQWtCLEtBQUssS0FBSyxhQUFhLGtCQUFrQjtDQUNqRSxJQUFJLE1BQU0sYUFBYSxPQUFPLGVBQWUsR0FBRztFQUM5QyxRQUFRLElBQUksTUFBTSxJQUFJLDZDQUE2QyxDQUFDO0VBQ3BFLE9BQU87Q0FDVDtDQUVBLFFBQVEsSUFBSSxNQUFNLElBQUksd0RBQXdELENBQUM7Q0FDL0UsTUFBTSxxQkFBcUIsS0FBSyxLQUFLLGFBQWEsV0FBVyxNQUFNLHNCQUFzQjtDQUN6RixJQUFJLE1BQU0sYUFBYSxPQUFPLGtCQUFrQixHQUM5QyxPQUFPO0NBRVQsT0FBTyxLQUFLLEtBQUssYUFBYSxXQUFXLE1BQU0sTUFBTSxzQkFBc0I7QUFDN0U7QUFFQSxlQUFlLGNBQ2IsVUFDQSxTQUNBO0NBQ0EsTUFBTSxRQUFRO0VBQ1o7R0FBRSxNQUFNO0dBQWEsS0FBSyxTQUFTLGtCQUFrQjtFQUFFO0VBQ3ZEO0dBQUUsTUFBTTtHQUFTLEtBQUssU0FBUyxhQUFhLFFBQVEsZ0JBQWdCO0VBQUU7RUFDdEU7R0FBRSxNQUFNO0dBQWMsS0FBSyxTQUFTLG1CQUFtQjtFQUFFO0NBQzNELENBQUMsQ0FBQyxRQUFRLFNBQVMsS0FBSyxRQUFRLE1BQVM7Q0FFekMsS0FBSyxJQUFJLFFBQVEsR0FBRyxRQUFRLE1BQU0sUUFBUSxTQUFTO0VBQ2pELE1BQU0sT0FBTyxNQUFNO0VBQ25CLE1BQU0sU0FBUyxVQUFVLE1BQU0sU0FBUztFQUN4QyxJQUFJO0dBQ0YsT0FBTyxLQUFLLEdBQUc7R0FDZixlQUFlLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTTtHQUMxQyxPQUFPLFFBQVEsUUFBUSxtQkFBQSxDQUFvQixLQUFLLEtBQUssRUFBRSxLQUFLLFFBQVEsSUFBSSxDQUFDO0dBQ3pFLGlCQUFpQixLQUFLLE1BQU0sTUFBTTtFQUNwQyxTQUFTLE9BQU87R0FDZCxnQkFBZ0IsS0FBSyxNQUFNLE1BQU07R0FDakMsTUFBTSxJQUFJLE1BQU0sR0FBRyxLQUFLLEtBQUssVUFBVSxFQUFFLE9BQU8sTUFBTSxDQUFDO0VBQ3pEO0NBQ0Y7QUFDRjtBQUVBLGVBQXNCLGtCQUFpQztDQUNyRCxNQUFNLGNBQWMsZ0JBQWdCO0NBQ3BDLE1BQU0saUJBQWlCLE1BQU0sMEJBQTBCLFdBQVc7Q0FDbEUsTUFBTSxTQUFTLE1BQU0sd0JBQXdCLFdBQVc7Q0FFeEQsTUFBTSxpQkFBaUIsTUFBTSxpQ0FBaUM7RUFDNUQ7RUFDQTtFQUNBO0VBQ0EsY0FMbUIsS0FBSyxLQUFLLGFBQWEsbUNBSzFDO0NBQ0YsQ0FBQztDQUNELE1BQU0sc0JBQXNCLG1CQUFtQixpQkFBaUIsU0FBWTtDQUM1RSxNQUFNLFlBQVksS0FBSyxJQUFJO0NBRTNCLElBQUk7RUFDRixLQUFLLE1BQU0sWUFBWSxlQUFlO0dBQ3BDLGdCQUFnQixTQUFTLE1BQU0sU0FBUyxhQUFhLFdBQVc7R0FDaEUsTUFBTSxjQUFjLFVBQVU7SUFDNUIsS0FBSztJQUNMLGtCQUFrQixFQUFFLGVBQWU7R0FDckMsQ0FBQztFQUNIO0VBQ0EsSUFBSSxPQUFPLFFBQVEsT0FBTztHQUN4QixNQUFNLGFBQWEsS0FBSyxLQUFLLGFBQWEsa0NBQWtDO0dBQzVFLElBQUksQ0FBRSxNQUFNLE9BQU8sVUFBVSxHQUMzQixNQUFNLElBQUksTUFBTSw0Q0FBNEMsWUFBWTtHQUUxRSxnQ0FBZ0MsQ0FDOUI7SUFBRSxNQUFNLE1BQU0sU0FBUyxZQUFZLE1BQU07SUFBRyxNQUFNO0dBQVcsQ0FDL0QsQ0FBQztFQUNIO0VBQ0Esa0JBQWtCLE9BQU8sTUFBTSxLQUFLLElBQUksSUFBSSxTQUFTO0NBQ3ZELFNBQVMsT0FBTztFQUNkLGtCQUFrQixPQUFPLE9BQU8sS0FBSyxJQUFJLElBQUksU0FBUztFQUN0RCxNQUFNO0NBQ1IsVUFBVTtFQUNSLElBQUksd0JBQXdCLFFBQVcsTUFBTSxHQUFHLHFCQUFxQixFQUFFLE9BQU8sS0FBSyxDQUFDO0NBQ3RGO0FBQ0Y7QUFFQSxlQUFzQixnQkFBZ0IsRUFDcEMsZ0JBQWdCLE9BQ2hCLE9BQU8sdUJBQzBELENBQUMsR0FBa0I7Q0FDcEYsTUFBTSxjQUFjLGdCQUFnQjtDQUNwQyxNQUFNLFVBQVUsS0FBSyxLQUFLLGFBQWEsS0FBSztDQUM1QyxJQUFJLENBQUUsTUFBTSxPQUFPLE9BQU8sR0FBSTtFQUM1QixJQUFJLGVBQWU7R0FDakIsUUFBUSxJQUFJLE1BQU0sS0FBSywrQkFBK0IsQ0FBQztHQUN2RDtFQUNGO0VBQ0EsTUFBTSxJQUFJLE1BQU0sd0JBQXdCLFNBQVM7Q0FDbkQ7Q0FFQSxNQUFNLFlBQVksS0FBSyxJQUFJO0NBQzNCLElBQUk7RUFFRixNQUFNLG1CQUFtQiwwQkFBMEI7RUFDbkQsZ0JBQWdCLGlCQUFpQixrQkFBa0IsT0FBTztFQUMxRCxlQUFlLGFBQWEsa0JBQWtCLElBQUk7RUFDbEQsSUFBSTtHQUNGLE1BQU0sS0FBSyxrQkFBa0IsRUFBRSxLQUFLLFFBQVEsQ0FBQztHQUM3QyxpQkFBaUIsYUFBYSxJQUFJO0VBQ3BDLFNBQVMsT0FBTztHQUNkLGdCQUFnQixhQUFhLElBQUk7R0FDakMsTUFBTSxJQUFJLE1BQU0sb0JBQW9CLEVBQUUsT0FBTyxNQUFNLENBQUM7RUFDdEQ7RUFFQSxLQUFLLE1BQU0sWUFBWSxlQUFlO0dBQ3BDLE1BQU0sTUFBTSxLQUFLLEtBQUssYUFBYSxTQUFTLFdBQVc7R0FDdkQsZ0JBQWdCLFNBQVMsTUFBTSxTQUFTLGFBQWEsR0FBRztHQUN4RCxNQUFNLGNBQWMsVUFBVTtJQUFFO0lBQUssa0JBQWtCLENBQUM7SUFBRztHQUFLLENBQUM7RUFDbkU7RUFDQSxrQkFBa0IsT0FBTyxNQUFNLEtBQUssSUFBSSxJQUFJLFNBQVM7Q0FDdkQsU0FBUyxPQUFPO0VBQ2Qsa0JBQWtCLE9BQU8sT0FBTyxLQUFLLElBQUksSUFBSSxTQUFTO0VBQ3RELE1BQU07Q0FDUjtBQUNGIn0=