sonamu 0.7.16 → 0.7.18

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 (64) hide show
  1. package/dist/ai/providers/rtzr/error.d.ts +1 -1
  2. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  3. package/dist/api/config.d.ts +1 -0
  4. package/dist/api/config.d.ts.map +1 -1
  5. package/dist/api/config.js +1 -1
  6. package/dist/api/decorators.d.ts +1 -1
  7. package/dist/api/decorators.d.ts.map +1 -1
  8. package/dist/api/decorators.js +1 -1
  9. package/dist/api/sonamu.d.ts +3 -1
  10. package/dist/api/sonamu.d.ts.map +1 -1
  11. package/dist/api/sonamu.js +48 -38
  12. package/dist/syncer/checksum.d.ts +8 -3
  13. package/dist/syncer/checksum.d.ts.map +1 -1
  14. package/dist/syncer/checksum.js +17 -9
  15. package/dist/syncer/code-generator.js +7 -2
  16. package/dist/syncer/syncer.d.ts +6 -6
  17. package/dist/syncer/syncer.d.ts.map +1 -1
  18. package/dist/syncer/syncer.js +27 -13
  19. package/dist/template/implementations/model.template.js +5 -5
  20. package/dist/template/implementations/services.template.d.ts +17 -0
  21. package/dist/template/implementations/services.template.d.ts.map +1 -0
  22. package/dist/template/implementations/services.template.js +180 -0
  23. package/dist/template/implementations/view_form.template.js +2 -2
  24. package/dist/template/implementations/view_id_async_select.template.js +2 -2
  25. package/dist/template/implementations/view_list.template.js +5 -5
  26. package/dist/types/types.d.ts +2 -14
  27. package/dist/types/types.d.ts.map +1 -1
  28. package/dist/types/types.js +3 -15
  29. package/dist/ui/ai-api.d.ts +2 -0
  30. package/dist/ui/ai-api.d.ts.map +1 -1
  31. package/dist/ui/ai-api.js +43 -49
  32. package/dist/ui/ai-client.d.ts +10 -0
  33. package/dist/ui/ai-client.d.ts.map +1 -1
  34. package/dist/ui/ai-client.js +457 -437
  35. package/dist/ui/api.d.ts.map +1 -1
  36. package/dist/ui/api.js +3 -1
  37. package/dist/ui-web/assets/index-DFqVuxOB.js +92 -0
  38. package/dist/ui-web/index.html +1 -1
  39. package/package.json +9 -5
  40. package/src/api/config.ts +3 -0
  41. package/src/api/decorators.ts +6 -1
  42. package/src/api/sonamu.ts +68 -50
  43. package/src/shared/app.shared.ts.txt +1 -1
  44. package/src/shared/web.shared.ts.txt +0 -43
  45. package/src/syncer/checksum.ts +31 -9
  46. package/src/syncer/code-generator.ts +8 -1
  47. package/src/syncer/syncer.ts +38 -26
  48. package/src/template/implementations/model.template.ts +4 -4
  49. package/src/template/implementations/services.template.ts +265 -0
  50. package/src/template/implementations/view_form.template.ts +1 -1
  51. package/src/template/implementations/view_id_async_select.template.ts +1 -1
  52. package/src/template/implementations/view_list.template.ts +4 -4
  53. package/src/types/types.ts +2 -14
  54. package/src/ui/ai-api.ts +61 -60
  55. package/src/ui/ai-client.ts +535 -499
  56. package/src/ui/api.ts +3 -0
  57. package/src/ui/entity.instructions.md +536 -0
  58. package/dist/template/implementations/service.template.d.ts +0 -29
  59. package/dist/template/implementations/service.template.d.ts.map +0 -1
  60. package/dist/template/implementations/service.template.js +0 -202
  61. package/dist/ui-web/assets/index-BcbbB-BB.js +0 -95
  62. package/dist/ui-web/assets/provider-utils_false-BKJD46kk.js +0 -1
  63. package/dist/ui-web/assets/provider-utils_false-Bu5lmX18.js +0 -1
  64. package/src/template/implementations/service.template.ts +0 -328
@@ -263,7 +263,7 @@ class SonamuClass {
263
263
  }
264
264
  const found = this.syncer.apis.find((api)=>this.config.api.route.prefix + api.path === request.url.split("?")[0] && (api.options.httpMethod ?? "GET") === request.method.toUpperCase());
265
265
  if (found) {
266
- return this.getApiHandler(found, config)(request, reply);
266
+ return this.createApiHandler(found, config)(request, reply);
267
267
  }
268
268
  if (request.url.startsWith("/api/")) {
269
269
  const { NotFoundException } = await import("../exceptions/so-exceptions.js");
@@ -282,12 +282,12 @@ class SonamuClass {
282
282
  server.route({
283
283
  method: api.options.httpMethod ?? "GET",
284
284
  url: this.config.api.route.prefix + api.path,
285
- handler: this.getApiHandler(api, config)
285
+ handler: this.createApiHandler(api, config)
286
286
  }); // END server.route
287
287
  }
288
288
  }
289
289
  }
290
- getApiHandler(api, config) {
290
+ createApiHandler(api, config) {
291
291
  return async (request, reply)=>{
292
292
  (api.options.guards ?? []).every((guard)=>config.guardHandler(guard, request, api));
293
293
  // 파라미터 정보로 zod 스키마 빌드
@@ -314,42 +314,52 @@ class SonamuClass {
314
314
  }
315
315
  // Content-Type
316
316
  reply.type(api.options.contentType ?? "application/json");
317
- // createSSEFactory 함수에 미리 request의 socket과 reply를 바인딩.
318
- const { createSSEFactory } = await import("../stream/sse.js");
319
- const createSSE = ((_request, _reply, _events)=>createSSEFactory(_request.socket, _reply, _events)).bind(null, request, reply);
320
- const context = {
321
- ...await Promise.resolve(config.contextProvider({
322
- request,
323
- reply,
324
- headers: request.headers,
325
- createSSE,
326
- naiteStore: Naite.createStore(),
327
- // auth
328
- user: request.user ?? null,
329
- passport: {
330
- login: request.login.bind(request),
331
- logout: request.logout.bind(request)
332
- }
333
- }, request, reply))
334
- };
335
- const model = this.syncer.models[api.modelName];
336
- return this.asyncLocalStorage.run({
337
- context
338
- }, async ()=>{
339
- const { ApiParamType } = await import("../types/types.js");
340
- // biome-ignore lint/suspicious/noExplicitAny: model은 모델 인스턴스이므로 메서드 호출 가능
341
- const result = await model[api.methodName].apply(model, api.parameters.map((param)=>{
342
- // Context 인젝션
343
- if (ApiParamType.isContext(param.type)) {
344
- return context;
345
- } else {
346
- return reqBody[param.name];
347
- }
348
- }));
349
- reply.type(api.options.contentType ?? "application/json");
350
- return result;
317
+ // Context 생성
318
+ const context = await this.createContext(config, request, reply);
319
+ // 모델 메소드 args 생성하여 호출
320
+ const { ApiParamType } = await import("../types/types.js");
321
+ const args = api.parameters.map((param)=>{
322
+ // Context 인젝션
323
+ if (ApiParamType.isContext(param.type)) {
324
+ return context;
325
+ } else {
326
+ return reqBody[param.name];
327
+ }
351
328
  });
329
+ return this.invokeModelMethod(api, args, context, reply);
330
+ };
331
+ }
332
+ async invokeModelMethod(api, args, context, reply) {
333
+ const model = this.syncer.models[api.modelName];
334
+ return this.asyncLocalStorage.run({
335
+ context
336
+ }, async ()=>{
337
+ // biome-ignore lint/suspicious/noExplicitAny: model은 모델 인스턴스이므로 메서드 호출 가능
338
+ const result = await model[api.methodName].apply(model, args);
339
+ reply.type(api.options.contentType ?? "application/json");
340
+ return result;
341
+ });
342
+ }
343
+ async createContext(config, request, reply) {
344
+ // createSSEFactory 함수에 미리 request의 socket과 reply를 바인딩.
345
+ const { createSSEFactory } = await import("../stream/sse.js");
346
+ const createSSE = ((_request, _reply, _events)=>createSSEFactory(_request.socket, _reply, _events)).bind(null, request, reply);
347
+ const context = {
348
+ ...await Promise.resolve(config.contextProvider({
349
+ request,
350
+ reply,
351
+ headers: request.headers,
352
+ createSSE,
353
+ naiteStore: Naite.createStore(),
354
+ // auth
355
+ user: request.user ?? null,
356
+ passport: {
357
+ login: request.login.bind(request),
358
+ logout: request.logout.bind(request)
359
+ }
360
+ }, request, reply))
352
361
  };
362
+ return context;
353
363
  }
354
364
  async startWatcher() {
355
365
  const watchPath = [
@@ -527,4 +537,4 @@ class SonamuClass {
527
537
  }
528
538
  export const Sonamu = new SonamuClass();
529
539
 
530
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCB0eXBlIHsgRlNXYXRjaGVyIH0gZnJvbSBcImNob2tpZGFyXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlJbnN0YW5jZSwgRmFzdGlmeVJlcGx5LCBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBjcmVhdGVNb2NrU1NFRmFjdG9yeSwgREIsIGlzRGFlbW9uU2VydmVyIH0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgdHlwZSB7IERyaXZlciB9IGZyb20gXCIuLi9maWxlLXN0b3JhZ2UvZHJpdmVyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUNvbmZpZywgU29uYW11U2VydmVyT3B0aW9ucywgU29uYW11VGFza09wdGlvbnMgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgQXV0aENvbnRleHQsIENvbnRleHQsIFVwbG9hZENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgdHlwZSBTb25hbXVTZWNyZXRzID0ge1xuICBhbnRocm9waWNfYXBpX2tleT86IHN0cmluZztcbiAgdm95YWdlX2FwaV9rZXk/OiBzdHJpbmc7XG4gIG9wZW5haV9hcGlfa2V5Pzogc3RyaW5nO1xufTtcbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgdXBsb2FkU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8e1xuICAgIHVwbG9hZENvbnRleHQ6IFVwbG9hZENvbnRleHQ7XG4gIH0+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbiAgcHVibGljIGdldENvbnRleHQoKTogQ29udGV4dCB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKHN0b3JlPy5jb250ZXh0KSB7XG4gICAgICByZXR1cm4gc3RvcmUuY29udGV4dDtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICAvLyDthYzsiqTtjIUg7ZmY6rK97JeQ7IScIOy7qO2FjeyKpO2KuOqwgCDso7zsnoXrkJjsp4Ag7JWK7J2AIOqyveyasCDruYgg7Luo7YWN7Iqk7Yq4IOumrO2EtFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6IChzY2hlbWE6IFpvZE9iamVjdCkgPT4gY3JlYXRlTW9ja1NTRUZhY3Rvcnkoc2NoZW1hKSxcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiDthYzsiqTtjIUg7ZmY6rK97JeQ7IScIOy7qO2FjeyKpO2KuOqwgCDso7zsnoXrkJjsp4Ag7JWK7J2AIOqyveyasCDruYgg7Luo7YWN7Iqk7Yq4IOumrO2EtFxuICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwPHN0cmluZywgYW55PigpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBjYW5ub3QgZmluZCBjb250ZXh0XCIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRVcGxvYWRDb250ZXh0KCk6IFVwbG9hZENvbnRleHQge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy51cGxvYWRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKHN0b3JlPy51cGxvYWRDb250ZXh0KSB7XG4gICAgICByZXR1cm4gc3RvcmUudXBsb2FkQ29udGV4dDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGNhbm5vdCBmaW5kIHVwbG9hZCBjb250ZXh0LiBEaWQgeW91IHVzZSBAdXBsb2FkIGRlY29yYXRvcj9cIik7XG4gIH1cblxuICBwcml2YXRlIF9hcGlSb290UGF0aDogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5fYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgICBpZiAodGhpcy5fYXBpUm9vdFBhdGggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGJDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBkYkNvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpIHtcbiAgICB0aGlzLl9kYkNvbmZpZyA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2RiQ29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jZXI6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5fc3luY2VyID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5fc3luY2VyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3luY2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgY29uZmlnKCk6IFNvbmFtdUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgX3NlY3JldHM6IFNvbmFtdVNlY3JldHMgfCBudWxsID0gbnVsbDtcbiAgc2V0IHNlY3JldHMoc2VjcmV0czogU29uYW11U2VjcmV0cykge1xuICAgIHRoaXMuX3NlY3JldHMgPSBzZWNyZXRzO1xuICB9XG4gIGdldCBzZWNyZXRzKCk6IFNvbmFtdVNlY3JldHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjcmV0cztcbiAgfVxuXG4gIHByaXZhdGUgX3N0b3JhZ2U6IERyaXZlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3RvcmFnZShzdG9yYWdlOiBEcml2ZXIpIHtcbiAgICB0aGlzLl9zdG9yYWdlID0gc3RvcmFnZTtcbiAgfVxuICBnZXQgc3RvcmFnZSgpOiBEcml2ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX3dvcmtmbG93czogV29ya2Zsb3dNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB3b3JrZmxvd3MoKTogV29ya2Zsb3dNYW5hZ2VyIHtcbiAgICBpZiAodGhpcy5fd29ya2Zsb3dzID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JrZmxvd3M7XG4gIH1cblxuICAvLyBITVIg7LKY66asXG4gIHB1YmxpYyB3YXRjaGVyOiBGU1dhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nRmlsZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaG1yU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuXG4gIHB1YmxpYyBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIGluaXRGb3JUZXN0aW5nKCkge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoXG4gICAgZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBlbmFibGVTeW5jOiBib29sZWFuID0gdHJ1ZSxcbiAgICBhcGlSb290UGF0aD86IEFic29sdXRlUGF0aCxcbiAgICBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUudGltZShjaGFsay5jeWFuKGBTb25hbXUuaW5pdCR7Zm9yVGVzdGluZyA/IFwiIGZvciB0ZXN0aW5nXCIgOiBcIlwifWApKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg66Oo7Yq4IO2MqOyKpFxuICAgIGNvbnN0IHsgZmluZEFwaVJvb3RQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy91dGlsc1wiKTtcbiAgICB0aGlzLmFwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGggPz8gZmluZEFwaVJvb3RQYXRoKCk7XG5cbiAgICBjb25zdCB7IGxvYWRDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4vY29uZmlnXCIpO1xuICAgIHRoaXMuY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyh0aGlzLmFwaVJvb3RQYXRoKTtcbiAgICAvLyBzb25hbXUuY29uZmlnLnRzIOq4sOuzuOqwkiDshKTsoJVcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicG9zdGdyZXNxbFwiO1xuXG4gICAgLy8gQVBJIO2CpCDtmZjqsr3rs4DsiJgg66Gc65OcXG4gICAgY29uc3Qgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IHt9O1xuICAgIGlmIChwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWSkge1xuICAgICAgc2VjcmV0cy5hbnRocm9waWNfYXBpX2tleSA9IHByb2Nlc3MuZW52LkFOVEhST1BJQ19BUElfS0VZO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuVk9ZQUdFX0FQSV9LRVkpIHtcbiAgICAgIHNlY3JldHMudm95YWdlX2FwaV9rZXkgPSBwcm9jZXNzLmVudi5WT1lBR0VfQVBJX0tFWTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk9QRU5BSV9BUElfS0VZKSB7XG4gICAgICBzZWNyZXRzLm9wZW5haV9hcGlfa2V5ID0gcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVk7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhzZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlY3JldHMgPSBzZWNyZXRzO1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKHRoaXMuY29uZmlnLmRhdGFiYXNlKTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiREIgQ29uZmlnIExvYWRlZCFcIikpO1xuICAgIH1cblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIO2FjOyKpO2MheyduCDqsr3smrAg7Iux7YGsIOyXhuydtCDspJHri6hcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUYXNrIOuTseuhnVxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVdvcmtmbG93cyh0aGlzLmNvbmZpZy50YXNrcyk7XG5cbiAgICAvLyBTeW5jZXJcbiAgICBjb25zdCB7IFN5bmNlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3N5bmNlclwiKTtcbiAgICB0aGlzLnN5bmNlciA9IG5ldyBTeW5jZXIoKTtcblxuICAgIC8vIEF1dG9sb2FkOiBNb2RlbHMgLyBUeXBlcyAvIEFQSXNcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFdvcmtmbG93cygpO1xuXG4gICAgY29uc3QgeyBUZW1wbGF0ZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3RlbXBsYXRlXCIpO1xuICAgIGF3YWl0IFRlbXBsYXRlTWFuYWdlci5hdXRvbG9hZCgpO1xuXG4gICAgY29uc3QgeyBpc0xvY2FsLCBpc1Rlc3QgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7Lus7JeQ7ISc64qUIOy9lOuTnCDsg53shLHsnYQg7JyE7ZW0IEJpb21lIOyFi+yXheydtCDtlYTsmpTtlaggKO2YhOyerCBhcGlSb290UGF0aCDsoITri6ztlZjsl6wg7Iuk7ZaJKVxuICAgICAgKGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2Zvcm1hdHRlclwiKSkuc2V0dXBCaW9tZSh0aGlzLmFwaVJvb3RQYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGlzSG90UmVsb2FkU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkgJiYgIWlzVGVzdCgpICYmIGlzSG90UmVsb2FkU2VydmVyKCkgJiYgZW5hYmxlU3luYykge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luYygpO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2F0Y2hlcigpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWVFbmQoY2hhbGsuY3lhbihcIlNvbmFtdS5pbml0XCIpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXJ2ZXIoaW5pdE9wdGlvbnM/OiB7IGVuYWJsZVN5bmM/OiBib29sZWFuOyBkb1NpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQoaW5pdE9wdGlvbnM/LmRvU2lsZW50LCBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCBmYXN0aWZ5ID0gKGF3YWl0IGltcG9ydChcImZhc3RpZnlcIikpLmRlZmF1bHQ7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeShvcHRpb25zLmZhc3RpZnkpO1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg7KCA7J6lXG4gICAgaWYgKG9wdGlvbnMuc3RvcmFnZSkge1xuICAgICAgdGhpcy5zdG9yYWdlID0gb3B0aW9ucy5zdG9yYWdlO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgaWYgKCFvcHRpb25zLnBsdWdpbnM/LnNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCByZXF1aXJlcyBzZXNzaW9uIHBsdWdpbi4gUGxlYXNlIGFkZCBwbHVnaW5zLnNlc3Npb24gY29uZmlndXJhdGlvbi5cIik7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFRpbWV6b25lIHNldCB0byAke3RpbWV6b25lfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUElcbiAgICBjb25zdCB7IHNvbmFtdVVJQXBpUGx1Z2luIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91aS9hcGlcIik7XG4gICAgc2VydmVyLnJlZ2lzdGVyKHNvbmFtdVVJQXBpUGx1Z2luKTtcblxuICAgIC8vIEFQSSDrnbzsmrDtjIUgKOuhnOy7rEhNUiDsg4Htg5zsmYAg6rWs67aEKVxuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICBzZXJ2ZXIuYWxsKFwiKlwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gU29uYW11IFVJXG4gICAgICAgIGlmIChyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zeW5jZXIuYXBpcy5maW5kKFxuICAgICAgICAgIChhcGkpID0+XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGggPT09IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSAmJlxuICAgICAgICAgICAgKGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPz8gXCJHRVRcIikgPT09IHJlcXVlc3QubWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldEFwaUhhbmRsZXIoZm91bmQsIGNvbmZpZykocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpL1wiKSkge1xuICAgICAgICAgIGNvbnN0IHsgTm90Rm91bmRFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYOyhtOyerO2VmOyngCDslYrripQgQVBJIOygkeq3vOyeheuLiOuLpC4gJHtyZXF1ZXN0LnVybH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOydvOuwmCDtjIzsnbwg7KCR6re87IucIOuzhOuPhOydmCDsl5Drn6wg7Lac66Cl7ZWY7KeAIOyViuydjFxuICAgICAgICByZXR1cm47XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBhcGkgb2YgdGhpcy5zeW5jZXIuYXBpcykge1xuICAgICAgICAvLyBtb2RlbFxuICAgICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByb3V0ZVxuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgICAgIHVybDogdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuZ2V0QXBpSGFuZGxlcihhcGksIGNvbmZpZyksXG4gICAgICAgIH0pOyAvLyBFTkQgc2VydmVyLnJvdXRlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0QXBpSGFuZGxlcihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgICAoYXBpLm9wdGlvbnMuZ3VhcmRzID8/IFtdKS5ldmVyeSgoZ3VhcmQpID0+IGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSkpO1xuXG4gICAgICAvLyDtjIzrnbzrr7jthLAg7KCV67O066GcIHpvZCDsiqTtgqTrp4gg67mM65OcXG4gICAgICBjb25zdCB7IGdldFpvZE9iamVjdEZyb21BcGkgfSA9IGF3YWl0IGltcG9ydChcIi4vY29kZS1jb252ZXJ0ZXJzXCIpO1xuICAgICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICAgIC8vIHJlcXVlc3Qg7YyM7IuxXG4gICAgICBjb25zdCB3aGljaCA9IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIgPyBcInF1ZXJ5XCIgOiBcImJvZHlcIjtcbiAgICAgIGxldCByZXFCb2R5OiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgICAgcmVxQm9keSA9IGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UocmVxdWVzdFt3aGljaF0gPz8ge30pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKG1lc3NhZ2VzLCB7XG4gICAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRlbnQtVHlwZVxuICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgIC8vIGNyZWF0ZVNTRUZhY3Rvcnkg7ZWo7IiY7JeQIOuvuOumrCByZXF1ZXN07J2YIHNvY2tldOqzvCByZXBseeulvCDrsJTsnbjrlKkuXG4gICAgICBjb25zdCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0cmVhbS9zc2VcIik7XG4gICAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgICBfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgICAgIF9yZXBseTogRmFzdGlmeVJlcGx5LFxuICAgICAgICBfZXZlbnRzOiBULFxuICAgICAgKSA9PiBjcmVhdGVTU0VGYWN0b3J5KF9yZXF1ZXN0LnNvY2tldCwgX3JlcGx5LCBfZXZlbnRzKSkuYmluZChudWxsLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAgIC4uLihhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgY29uZmlnLmNvbnRleHRQcm92aWRlcihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgcmVwbHksXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICAgICAgY3JlYXRlU1NFLFxuICAgICAgICAgICAgICBuYWl0ZVN0b3JlOiBOYWl0ZS5jcmVhdGVTdG9yZSgpLFxuICAgICAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgICAgIHVzZXI6IHJlcXVlc3QudXNlciA/PyBudWxsLFxuICAgICAgICAgICAgICBwYXNzcG9ydDoge1xuICAgICAgICAgICAgICAgIGxvZ2luOiByZXF1ZXN0LmxvZ2luLmJpbmQocmVxdWVzdCkgYXMgQXV0aENvbnRleHRbXCJwYXNzcG9ydFwiXVtcImxvZ2luXCJdLFxuICAgICAgICAgICAgICAgIGxvZ291dDogcmVxdWVzdC5sb2dvdXQuYmluZChyZXF1ZXN0KSBhcyBBdXRoQ29udGV4dFtcInBhc3Nwb3J0XCJdW1wibG9nb3V0XCJdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICApLFxuICAgICAgICApKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdO1xuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBtb2RlbOydgCDrqqjrjbgg7J247Iqk7YS07Iqk7J2066+A66GcIOuplOyEnOuTnCDtmLjstpwg6rCA64qlXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChtb2RlbCBhcyBhbnkpW2FwaS5tZXRob2ROYW1lXS5hcHBseShcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAvLyBDb250ZXh0IOyduOygneyFmFxuICAgICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gcmVxQm9keVtwYXJhbS5uYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2F0Y2hQYXRoID0gW3BhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiKV07XG5cbiAgICBjb25zdCBjaG9raWRhciA9IChhd2FpdCBpbXBvcnQoXCJjaG9raWRhclwiKSkuZGVmYXVsdDtcbiAgICB0aGlzLndhdGNoZXIgPSBjaG9raWRhci53YXRjaCh3YXRjaFBhdGgsIHtcbiAgICAgIGlnbm9yZWQ6IChwYXRoLCBzdGF0cykgPT5cbiAgICAgICAgISFzdGF0cz8uaXNGaWxlKCkgJiYgIXBhdGguZW5kc1dpdGgoXCIudHNcIikgJiYgIXBhdGguZW5kc1dpdGgoXCIuanNvblwiKSxcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy53YXRjaGVyLm9uKFwiYWxsXCIsIGFzeW5jIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCBhcyBBYnNvbHV0ZVBhdGg7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKHRoaXMuYXBpUm9vdFBhdGgpLFxuICAgICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBBUEkgcm9vdCBwYXRoXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBzb25hbXUuY29uZmlnLnRzIOuzgOqyvSDsi5wg7J6s7Iuc7J6RXG4gICAgICAgIGNvbnN0IGlzQ29uZmlnVHMgPSBmaWxlUGF0aCA9PT0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcblxuICAgICAgICBpZiAoaXNDb25maWdUcykge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UodGhpcy5hcGlSb290UGF0aCwgXCJhcGlcIik7XG4gICAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZUNoYW5nZShldmVudCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAgIEEgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5pdCBhbmQgZGVzdHJveSB3aGVuIHVzaW5nIFNvbmFtdSB2aWEgc2NyaXB0cy4gICAgXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgICBzZXNzaW9uOiBcIkBmYXN0aWZ5L3NlY3VyZS1zZXNzaW9uXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKGtleSBhcyBrZXlvZiB0eXBlb2YgcGx1Z2lucywgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMuY3VzdG9tKSB7XG4gICAgICBwbHVnaW5zLmN1c3RvbShzZXJ2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJBdXRoKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICAgIG9wdGlvbnM6IE5vbk51bGxhYmxlPFNvbmFtdVNlcnZlck9wdGlvbnNbXCJhdXRoXCJdPixcbiAgKSB7XG4gICAgLy8gYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKTtcbiAgICBjb25zdCBmYXN0aWZ5UGFzc3BvcnQgPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvcGFzc3BvcnRcIikpLmRlZmF1bHQ7XG4gICAgc2VydmVyLnJlZ2lzdGVyKGZhc3RpZnlQYXNzcG9ydC5pbml0aWFsaXplKCkpO1xuICAgIHNlcnZlci5yZWdpc3RlcihmYXN0aWZ5UGFzc3BvcnQuc2VjdXJlU2Vzc2lvbigpKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGZhc3RpZnlQYXNzcG9ydC5yZWdpc3RlclVzZXJTZXJpYWxpemVyKGFzeW5jICh1c2VyLCBfcmVxdWVzdCkgPT4gdXNlcik7XG4gICAgICBmYXN0aWZ5UGFzc3BvcnQucmVnaXN0ZXJVc2VyRGVzZXJpYWxpemVyKGFzeW5jIChzZXJpYWxpemVkLCBfcmVxdWVzdCkgPT4gc2VyaWFsaXplZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhc3RpZnlQYXNzcG9ydC5yZWdpc3RlclVzZXJTZXJpYWxpemVyKG9wdGlvbnMudXNlclNlcmlhbGl6ZXIpO1xuICAgICAgZmFzdGlmeVBhc3Nwb3J0LnJlZ2lzdGVyVXNlckRlc2VyaWFsaXplcihvcHRpb25zLnVzZXJEZXNlcmlhbGl6ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVdvcmtmbG93cyhvcHRpb25zOiBTb25hbXVUYXNrT3B0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHsgV29ya2Zsb3dNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90YXNrcy93b3JrZmxvdy1tYW5hZ2VyXCIpO1xuICAgIC8vIE5PVEU6IEBzb25hbXUta2l0L3Rhc2tzIOyViOyXkOyEoCBrbmV4IGNvbmZpZ+ulvCDsiJjsoJXtlZjquLAg65WM66y47JeQIGNvbm5lY3Rpb27snbQg7JWE64uMIGNvbmZpZyDsp7jroZwg67O064OF64uI64ukLlxuICAgIHRoaXMuX3dvcmtmbG93cyA9IG5ldyBXb3JrZmxvd01hbmFnZXIoREIuZ2V0REJDb25maWcoXCJ3XCIpKTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVXb3JrZXIgPSBvcHRpb25zLmVuYWJsZVdvcmtlciA/PyBpc0RhZW1vblNlcnZlcigpO1xuICAgIGNvbnN0IGRlZmF1bHRXb3JrZXJPcHRpb25zID0ge1xuICAgICAgY29uY3VycmVuY3k6IG9zLmNwdXMoKS5sZW5ndGggLSAxLFxuICAgICAgdXNlUHViU3ViOiB0cnVlLFxuICAgICAgbGlzdGVuRGVsYXk6IDUwMCxcbiAgICB9O1xuXG4gICAgaWYgKGVuYWJsZVdvcmtlcikge1xuICAgICAgdGhpcy53b3JrZmxvd3Muc2V0dXBXb3JrZXIoe1xuICAgICAgICAuLi5kZWZhdWx0V29ya2VyT3B0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucy53b3JrZXJPcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290KHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBvcHRpb25zOiBTb25hbXVTZXJ2ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgcG9ydCA9IG9wdGlvbnMubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gICAgY29uc3QgaG9zdCA9IG9wdGlvbnMubGlzdGVuPy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG5cbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU2h1dGRvd24/LihzZXJ2ZXIpO1xuICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3MuZGVzdHJveSgpO1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaHV0ZG93biA9IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGR1cmluZyBzaHV0ZG93bjpcIiwgZXJyKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBzaHV0ZG93bik7XG5cbiAgICBpZiAob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpIHtcbiAgICAgIHNlcnZlci5zZXRFcnJvckhhbmRsZXIob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpO1xuICAgIH1cblxuICAgIHNlcnZlclxuICAgICAgLmxpc3Rlbih7IHBvcnQsIGhvc3QgfSlcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3Muc3RhcnRXb3JrZXIoKTtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU3RhcnQ/LihzZXJ2ZXIpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIkZhaWxlZCB0byBzdGFydCBzZXJ2ZXI6XCIsIGVycikpO1xuICAgICAgICBhd2FpdCBzaHV0ZG93bigpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUZpbGVDaGFuZ2UoZXZlbnQ6IHN0cmluZywgZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOyyqyDrsojsp7gg7YyM7J287J2066m0IEhNUiDsi5zsnpEg7Iuc6rCEIOq4sOuhnVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaG1yU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nRmlsZXMucHVzaChmaWxlUGF0aCk7XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMuYXBpUm9vdFBhdGgsIGZpbGVQYXRoKTtcbiAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfWApKTtcblxuICAgIGF3YWl0IHRoaXMuc3luY2VyLnN5bmNGcm9tV2F0Y2hlcihldmVudCwgZmlsZVBhdGgpO1xuXG4gICAgLy8g7LKY66asIOyZhOujjOuQnCDtjIzsnbzsnYQg64yA6riwIOuqqeuhneyXkOyEnCDsoJzqsbBcbiAgICB0aGlzLnBlbmRpbmdGaWxlcyA9IHRoaXMucGVuZGluZ0ZpbGVzLnNsaWNlKDEpO1xuXG4gICAgLy8g66qo65OgIO2MjOydvCDsspjrpqzqsIAg7JmE66OM65CY66m0IOy1nOyihSDrqZTsi5zsp4Ag7Lac66ClXG4gICAgaWYgKHRoaXMucGVuZGluZ0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgdGhpcy5maW5pc2hITVIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmlzaEhNUigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5yZW5ld0NoZWNrc3VtcygpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdG90YWxUaW1lID0gZW5kVGltZSAtIHRoaXMuaG1yU3RhcnRUaW1lO1xuICAgIGNvbnN0IFtjaGFsaywgeyBjZW50ZXJUZXh0IH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0LFxuICAgICAgaW1wb3J0KFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCIpLFxuICAgIF0pO1xuICAgIGNvbnN0IG1zZyA9IGBITVIgRG9uZSEgJHtjaGFsay5ib2xkLndoaXRlKGAke3RvdGFsVGltZX1tc2ApfWA7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQobXNnKSkpO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IEJhc2VNb2RlbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiKTtcbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIGF3YWl0IHRoaXMuX3dvcmtmbG93cz8uZGVzdHJveSgpO1xuICAgIGF3YWl0IHRoaXMud2F0Y2hlcj8uY2xvc2UoKTtcbiAgICB0aGlzLnN0b3JhZ2U/LmRlc3Ryb3koKTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IFNvbmFtdSA9IG5ldyBTb25hbXVDbGFzcygpO1xuIl0sIm5hbWVzIjpbImFzc2VydCIsIkFzeW5jTG9jYWxTdG9yYWdlIiwib3MiLCJwYXRoIiwiY3JlYXRlTW9ja1NTRUZhY3RvcnkiLCJEQiIsImlzRGFlbW9uU2VydmVyIiwiTmFpdGUiLCJTb25hbXVDbGFzcyIsImlzSW5pdGlhbGl6ZWQiLCJhc3luY0xvY2FsU3RvcmFnZSIsInVwbG9hZFN0b3JhZ2UiLCJnZXRDb250ZXh0Iiwic3RvcmUiLCJnZXRTdG9yZSIsImNvbnRleHQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJyZXF1ZXN0IiwicmVwbHkiLCJoZWFkZXJzIiwiY3JlYXRlU1NFIiwic2NoZW1hIiwibmFpdGVTdG9yZSIsIk1hcCIsIkVycm9yIiwiZ2V0VXBsb2FkQ29udGV4dCIsInVwbG9hZENvbnRleHQiLCJfYXBpUm9vdFBhdGgiLCJhcGlSb290UGF0aCIsImFwcFJvb3RQYXRoIiwic3BsaXQiLCJzZXAiLCJzbGljZSIsImpvaW4iLCJfZGJDb25maWciLCJkYkNvbmZpZyIsIl9zeW5jZXIiLCJzeW5jZXIiLCJfY29uZmlnIiwiY29uZmlnIiwiX3NlY3JldHMiLCJzZWNyZXRzIiwiX3N0b3JhZ2UiLCJzdG9yYWdlIiwiX3dvcmtmbG93cyIsIndvcmtmbG93cyIsIndhdGNoZXIiLCJwZW5kaW5nRmlsZXMiLCJobXJTdGFydFRpbWUiLCJzZXJ2ZXIiLCJpbml0Rm9yVGVzdGluZyIsImluaXQiLCJ1bmRlZmluZWQiLCJkb1NpbGVudCIsImVuYWJsZVN5bmMiLCJmb3JUZXN0aW5nIiwiY2hhbGsiLCJkZWZhdWx0IiwiY29uc29sZSIsInRpbWUiLCJjeWFuIiwiZmluZEFwaVJvb3RQYXRoIiwibG9hZENvbmZpZyIsImRhdGFiYXNlIiwiQU5USFJPUElDX0FQSV9LRVkiLCJhbnRocm9waWNfYXBpX2tleSIsIlZPWUFHRV9BUElfS0VZIiwidm95YWdlX2FwaV9rZXkiLCJPUEVOQUlfQVBJX0tFWSIsIm9wZW5haV9hcGlfa2V5IiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImdlbmVyYXRlREJDb25maWciLCJsb2ciLCJncmVlbiIsIkVudGl0eU1hbmFnZXIiLCJhdXRvbG9hZCIsImluaXRpYWxpemVXb3JrZmxvd3MiLCJ0YXNrcyIsIlN5bmNlciIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsImF1dG9sb2FkV29ya2Zsb3dzIiwiVGVtcGxhdGVNYW5hZ2VyIiwiaXNMb2NhbCIsImlzVGVzdCIsInNldHVwQmlvbWUiLCJpc0hvdFJlbG9hZFNlcnZlciIsInN5bmMiLCJzdGFydFdhdGNoZXIiLCJ0aW1lRW5kIiwiY3JlYXRlU2VydmVyIiwiaW5pdE9wdGlvbnMiLCJvcHRpb25zIiwiZmFzdGlmeSIsInBsdWdpbnMiLCJyZWdpc3RlclBsdWdpbnMiLCJhdXRoIiwic2Vzc2lvbiIsInJlZ2lzdGVyQXV0aCIsIndpdGhGYXN0aWZ5IiwiYXBpQ29uZmlnIiwiYm9vdCIsInRpbWV6b25lIiwiYXBpIiwiZm9ybWF0SW5UaW1lWm9uZSIsIklTT19EQVRFX1JFR0VYIiwiREFURV9GT1JNQVQiLCJzZXRSZXBseVNlcmlhbGl6ZXIiLCJwYXlsb2FkIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9rZXkiLCJ2YWx1ZSIsInRlc3QiLCJEYXRlIiwiZ2V0Iiwicm91dGUiLCJwcmVmaXgiLCJfcmVxdWVzdCIsIl9yZXBseSIsImFwaXMiLCJzb25hbXVVSUFwaVBsdWdpbiIsInJlZ2lzdGVyIiwiYWxsIiwidXJsIiwic3RhcnRzV2l0aCIsImZvdW5kIiwiZmluZCIsImh0dHBNZXRob2QiLCJtZXRob2QiLCJ0b1VwcGVyQ2FzZSIsImdldEFwaUhhbmRsZXIiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsIm1vZGVscyIsIm1vZGVsTmFtZSIsImhhbmRsZXIiLCJndWFyZHMiLCJldmVyeSIsImd1YXJkIiwiZ3VhcmRIYW5kbGVyIiwiZ2V0Wm9kT2JqZWN0RnJvbUFwaSIsIlJlcVR5cGUiLCJ0eXBlcyIsIndoaWNoIiwicmVxQm9keSIsImZhc3RpZnlDYXN0ZXIiLCJwYXJzZSIsImUiLCJab2RFcnJvciIsImh1bWFuaXplWm9kRXJyb3IiLCJtZXNzYWdlcyIsIm1hcCIsImlzc3VlIiwibWVzc2FnZSIsIkJhZFJlcXVlc3RFeGNlcHRpb24iLCJ6b2RFcnJvciIsInR5cGUiLCJjb250ZW50VHlwZSIsImNyZWF0ZVNTRUZhY3RvcnkiLCJfZXZlbnRzIiwic29ja2V0IiwiYmluZCIsIlByb21pc2UiLCJyZXNvbHZlIiwiY29udGV4dFByb3ZpZGVyIiwiY3JlYXRlU3RvcmUiLCJ1c2VyIiwicGFzc3BvcnQiLCJsb2dpbiIsImxvZ291dCIsIm1vZGVsIiwicnVuIiwiQXBpUGFyYW1UeXBlIiwicmVzdWx0IiwibWV0aG9kTmFtZSIsImFwcGx5IiwicGFyYW1ldGVycyIsInBhcmFtIiwiaXNDb250ZXh0IiwibmFtZSIsIndhdGNoUGF0aCIsImNob2tpZGFyIiwid2F0Y2giLCJpZ25vcmVkIiwic3RhdHMiLCJpc0ZpbGUiLCJlbmRzV2l0aCIsInBlcnNpc3RlbnQiLCJpZ25vcmVJbml0aWFsIiwib24iLCJldmVudCIsImZpbGVQYXRoIiwiYWJzb2x1dGVQYXRoIiwiaXNDb25maWdUcyIsInJlbGF0aXZlUGF0aCIsInJlcGxhY2UiLCJib2xkIiwiYmx1ZSIsImtpbGwiLCJwaWQiLCJoYW5kbGVGaWxlQ2hhbmdlIiwiZXJyb3IiLCJydW5TY3JpcHQiLCJmbiIsImRlc3Ryb3kiLCJwbHVnaW5zTW9kdWxlcyIsImNvcnMiLCJmb3JtYm9keSIsIm11bHRpcGFydCIsInFzIiwic3NlIiwic3RhdGljIiwicmVnaXN0ZXJQbHVnaW4iLCJrZXkiLCJwbHVnaW5OYW1lIiwib3B0aW9uIiwiZW50cmllcyIsImN1c3RvbSIsImZhc3RpZnlQYXNzcG9ydCIsImluaXRpYWxpemUiLCJzZWN1cmVTZXNzaW9uIiwicmVnaXN0ZXJVc2VyU2VyaWFsaXplciIsInJlZ2lzdGVyVXNlckRlc2VyaWFsaXplciIsInNlcmlhbGl6ZWQiLCJ1c2VyU2VyaWFsaXplciIsInVzZXJEZXNlcmlhbGl6ZXIiLCJXb3JrZmxvd01hbmFnZXIiLCJnZXREQkNvbmZpZyIsImVuYWJsZVdvcmtlciIsImRlZmF1bHRXb3JrZXJPcHRpb25zIiwiY29uY3VycmVuY3kiLCJjcHVzIiwidXNlUHViU3ViIiwibGlzdGVuRGVsYXkiLCJzZXR1cFdvcmtlciIsIndvcmtlck9wdGlvbnMiLCJwb3J0IiwibGlzdGVuIiwiaG9zdCIsImFkZEhvb2siLCJsaWZlY3ljbGUiLCJvblNodXRkb3duIiwic2h1dGRvd24iLCJjbG9zZSIsImV4aXQiLCJlcnIiLCJvbkVycm9yIiwic2V0RXJyb3JIYW5kbGVyIiwidGhlbiIsInN0YXJ0V29ya2VyIiwib25TdGFydCIsImNhdGNoIiwicmVkIiwibm93IiwicHVzaCIsInJlbGF0aXZlIiwic3luY0Zyb21XYXRjaGVyIiwiZmluaXNoSE1SIiwicmVuZXdDaGVja3N1bXMiLCJlbmRUaW1lIiwidG90YWxUaW1lIiwiY2VudGVyVGV4dCIsIm1zZyIsIndoaXRlIiwiYmxhY2siLCJiZ0dyZWVuIiwiQmFzZU1vZGVsIiwiU29uYW11Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsaUJBQWlCLFFBQVEsY0FBYztBQUloRCxPQUFPQyxRQUFRLEtBQUs7QUFDcEIsT0FBT0MsVUFBVSxPQUFPO0FBRXhCLFNBQVNDLG9CQUFvQixFQUFFQyxFQUFFLEVBQUVDLGNBQWMsUUFBUSxjQUFLO0FBRzlELFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFjdkMsTUFBTUM7SUFDR0MsZ0JBQXlCLE1BQU07SUFDL0JDLG9CQUVGLElBQUlULG9CQUFvQjtJQUV0QlUsZ0JBRUYsSUFBSVYsb0JBQW9CO0lBRXRCVyxhQUFzQjtRQUMzQixNQUFNQyxRQUFRLElBQUksQ0FBQ0gsaUJBQWlCLENBQUNJLFFBQVE7UUFDN0MsSUFBSUQsT0FBT0UsU0FBUztZQUNsQixPQUFPRixNQUFNRSxPQUFPO1FBQ3RCO1FBRUEsSUFBSUMsUUFBUUMsR0FBRyxDQUFDQyxRQUFRLEtBQUssUUFBUTtZQUNuQyxzQ0FBc0M7WUFDdEMsT0FBTztnQkFDTEMsU0FBUztnQkFDVEMsT0FBTztnQkFDUEMsU0FBUyxDQUFDO2dCQUNWQyxXQUFXLENBQUNDLFNBQXNCbkIscUJBQXFCbUI7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
540
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCB0eXBlIHsgRlNXYXRjaGVyIH0gZnJvbSBcImNob2tpZGFyXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlJbnN0YW5jZSwgRmFzdGlmeVJlcGx5LCBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBjcmVhdGVNb2NrU1NFRmFjdG9yeSwgREIsIGlzRGFlbW9uU2VydmVyIH0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgdHlwZSB7IERyaXZlciB9IGZyb20gXCIuLi9maWxlLXN0b3JhZ2UvZHJpdmVyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUNvbmZpZywgU29uYW11U2VydmVyT3B0aW9ucywgU29uYW11VGFza09wdGlvbnMgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgQXV0aENvbnRleHQsIENvbnRleHQsIFVwbG9hZENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgdHlwZSBTb25hbXVTZWNyZXRzID0ge1xuICBhbnRocm9waWNfYXBpX2tleT86IHN0cmluZztcbiAgdm95YWdlX2FwaV9rZXk/OiBzdHJpbmc7XG4gIG9wZW5haV9hcGlfa2V5Pzogc3RyaW5nO1xufTtcbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgdXBsb2FkU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8e1xuICAgIHVwbG9hZENvbnRleHQ6IFVwbG9hZENvbnRleHQ7XG4gIH0+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbiAgcHVibGljIGdldENvbnRleHQoKTogQ29udGV4dCB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKHN0b3JlPy5jb250ZXh0KSB7XG4gICAgICByZXR1cm4gc3RvcmUuY29udGV4dDtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICAvLyDthYzsiqTtjIUg7ZmY6rK97JeQ7IScIOy7qO2FjeyKpO2KuOqwgCDso7zsnoXrkJjsp4Ag7JWK7J2AIOqyveyasCDruYgg7Luo7YWN7Iqk7Yq4IOumrO2EtFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6IChzY2hlbWE6IFpvZE9iamVjdCkgPT4gY3JlYXRlTW9ja1NTRUZhY3Rvcnkoc2NoZW1hKSxcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiDthYzsiqTtjIUg7ZmY6rK97JeQ7IScIOy7qO2FjeyKpO2KuOqwgCDso7zsnoXrkJjsp4Ag7JWK7J2AIOqyveyasCDruYgg7Luo7YWN7Iqk7Yq4IOumrO2EtFxuICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwPHN0cmluZywgYW55PigpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBjYW5ub3QgZmluZCBjb250ZXh0XCIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRVcGxvYWRDb250ZXh0KCk6IFVwbG9hZENvbnRleHQge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy51cGxvYWRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKHN0b3JlPy51cGxvYWRDb250ZXh0KSB7XG4gICAgICByZXR1cm4gc3RvcmUudXBsb2FkQ29udGV4dDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGNhbm5vdCBmaW5kIHVwbG9hZCBjb250ZXh0LiBEaWQgeW91IHVzZSBAdXBsb2FkIGRlY29yYXRvcj9cIik7XG4gIH1cblxuICBwcml2YXRlIF9hcGlSb290UGF0aDogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5fYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgICBpZiAodGhpcy5fYXBpUm9vdFBhdGggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGJDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBkYkNvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpIHtcbiAgICB0aGlzLl9kYkNvbmZpZyA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2RiQ29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jZXI6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5fc3luY2VyID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5fc3luY2VyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3luY2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgY29uZmlnKCk6IFNvbmFtdUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgX3NlY3JldHM6IFNvbmFtdVNlY3JldHMgfCBudWxsID0gbnVsbDtcbiAgc2V0IHNlY3JldHMoc2VjcmV0czogU29uYW11U2VjcmV0cykge1xuICAgIHRoaXMuX3NlY3JldHMgPSBzZWNyZXRzO1xuICB9XG4gIGdldCBzZWNyZXRzKCk6IFNvbmFtdVNlY3JldHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjcmV0cztcbiAgfVxuXG4gIHByaXZhdGUgX3N0b3JhZ2U6IERyaXZlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3RvcmFnZShzdG9yYWdlOiBEcml2ZXIpIHtcbiAgICB0aGlzLl9zdG9yYWdlID0gc3RvcmFnZTtcbiAgfVxuICBnZXQgc3RvcmFnZSgpOiBEcml2ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX3dvcmtmbG93czogV29ya2Zsb3dNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB3b3JrZmxvd3MoKTogV29ya2Zsb3dNYW5hZ2VyIHtcbiAgICBpZiAodGhpcy5fd29ya2Zsb3dzID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JrZmxvd3M7XG4gIH1cblxuICAvLyBITVIg7LKY66asXG4gIHB1YmxpYyB3YXRjaGVyOiBGU1dhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nRmlsZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaG1yU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuXG4gIHB1YmxpYyBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIGluaXRGb3JUZXN0aW5nKCkge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoXG4gICAgZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBlbmFibGVTeW5jOiBib29sZWFuID0gdHJ1ZSxcbiAgICBhcGlSb290UGF0aD86IEFic29sdXRlUGF0aCxcbiAgICBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUudGltZShjaGFsay5jeWFuKGBTb25hbXUuaW5pdCR7Zm9yVGVzdGluZyA/IFwiIGZvciB0ZXN0aW5nXCIgOiBcIlwifWApKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg66Oo7Yq4IO2MqOyKpFxuICAgIGNvbnN0IHsgZmluZEFwaVJvb3RQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy91dGlsc1wiKTtcbiAgICB0aGlzLmFwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGggPz8gZmluZEFwaVJvb3RQYXRoKCk7XG5cbiAgICBjb25zdCB7IGxvYWRDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4vY29uZmlnXCIpO1xuICAgIHRoaXMuY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyh0aGlzLmFwaVJvb3RQYXRoKTtcbiAgICAvLyBzb25hbXUuY29uZmlnLnRzIOq4sOuzuOqwkiDshKTsoJVcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicG9zdGdyZXNxbFwiO1xuXG4gICAgLy8gQVBJIO2CpCDtmZjqsr3rs4DsiJgg66Gc65OcXG4gICAgY29uc3Qgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IHt9O1xuICAgIGlmIChwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWSkge1xuICAgICAgc2VjcmV0cy5hbnRocm9waWNfYXBpX2tleSA9IHByb2Nlc3MuZW52LkFOVEhST1BJQ19BUElfS0VZO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuVk9ZQUdFX0FQSV9LRVkpIHtcbiAgICAgIHNlY3JldHMudm95YWdlX2FwaV9rZXkgPSBwcm9jZXNzLmVudi5WT1lBR0VfQVBJX0tFWTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk9QRU5BSV9BUElfS0VZKSB7XG4gICAgICBzZWNyZXRzLm9wZW5haV9hcGlfa2V5ID0gcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVk7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhzZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlY3JldHMgPSBzZWNyZXRzO1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKHRoaXMuY29uZmlnLmRhdGFiYXNlKTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiREIgQ29uZmlnIExvYWRlZCFcIikpO1xuICAgIH1cblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIO2FjOyKpO2MheyduCDqsr3smrAg7Iux7YGsIOyXhuydtCDspJHri6hcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUYXNrIOuTseuhnVxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVdvcmtmbG93cyh0aGlzLmNvbmZpZy50YXNrcyk7XG5cbiAgICAvLyBTeW5jZXJcbiAgICBjb25zdCB7IFN5bmNlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3N5bmNlclwiKTtcbiAgICB0aGlzLnN5bmNlciA9IG5ldyBTeW5jZXIoKTtcblxuICAgIC8vIEF1dG9sb2FkOiBNb2RlbHMgLyBUeXBlcyAvIEFQSXNcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFdvcmtmbG93cygpO1xuXG4gICAgY29uc3QgeyBUZW1wbGF0ZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3RlbXBsYXRlXCIpO1xuICAgIGF3YWl0IFRlbXBsYXRlTWFuYWdlci5hdXRvbG9hZCgpO1xuXG4gICAgY29uc3QgeyBpc0xvY2FsLCBpc1Rlc3QgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7Lus7JeQ7ISc64qUIOy9lOuTnCDsg53shLHsnYQg7JyE7ZW0IEJpb21lIOyFi+yXheydtCDtlYTsmpTtlaggKO2YhOyerCBhcGlSb290UGF0aCDsoITri6ztlZjsl6wg7Iuk7ZaJKVxuICAgICAgKGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2Zvcm1hdHRlclwiKSkuc2V0dXBCaW9tZSh0aGlzLmFwaVJvb3RQYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGlzSG90UmVsb2FkU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkgJiYgIWlzVGVzdCgpICYmIGlzSG90UmVsb2FkU2VydmVyKCkgJiYgZW5hYmxlU3luYykge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luYygpO1xuXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2F0Y2hlcigpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWVFbmQoY2hhbGsuY3lhbihcIlNvbmFtdS5pbml0XCIpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXJ2ZXIoaW5pdE9wdGlvbnM/OiB7IGVuYWJsZVN5bmM/OiBib29sZWFuOyBkb1NpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQoaW5pdE9wdGlvbnM/LmRvU2lsZW50LCBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCBmYXN0aWZ5ID0gKGF3YWl0IGltcG9ydChcImZhc3RpZnlcIikpLmRlZmF1bHQ7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeShvcHRpb25zLmZhc3RpZnkpO1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg7KCA7J6lXG4gICAgaWYgKG9wdGlvbnMuc3RvcmFnZSkge1xuICAgICAgdGhpcy5zdG9yYWdlID0gb3B0aW9ucy5zdG9yYWdlO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgaWYgKCFvcHRpb25zLnBsdWdpbnM/LnNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCByZXF1aXJlcyBzZXNzaW9uIHBsdWdpbi4gUGxlYXNlIGFkZCBwbHVnaW5zLnNlc3Npb24gY29uZmlndXJhdGlvbi5cIik7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFRpbWV6b25lIHNldCB0byAke3RpbWV6b25lfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUElcbiAgICBjb25zdCB7IHNvbmFtdVVJQXBpUGx1Z2luIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91aS9hcGlcIik7XG4gICAgc2VydmVyLnJlZ2lzdGVyKHNvbmFtdVVJQXBpUGx1Z2luKTtcblxuICAgIC8vIEFQSSDrnbzsmrDtjIUgKOuhnOy7rEhNUiDsg4Htg5zsmYAg6rWs67aEKVxuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICBzZXJ2ZXIuYWxsKFwiKlwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gU29uYW11IFVJXG4gICAgICAgIGlmIChyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zeW5jZXIuYXBpcy5maW5kKFxuICAgICAgICAgIChhcGkpID0+XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGggPT09IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSAmJlxuICAgICAgICAgICAgKGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPz8gXCJHRVRcIikgPT09IHJlcXVlc3QubWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIoZm91bmQsIGNvbmZpZykocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpL1wiKSkge1xuICAgICAgICAgIGNvbnN0IHsgTm90Rm91bmRFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYOyhtOyerO2VmOyngCDslYrripQgQVBJIOygkeq3vOyeheuLiOuLpC4gJHtyZXF1ZXN0LnVybH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOydvOuwmCDtjIzsnbwg7KCR6re87IucIOuzhOuPhOydmCDsl5Drn6wg7Lac66Cl7ZWY7KeAIOyViuydjFxuICAgICAgICByZXR1cm47XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBhcGkgb2YgdGhpcy5zeW5jZXIuYXBpcykge1xuICAgICAgICAvLyBtb2RlbFxuICAgICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByb3V0ZVxuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgICAgIHVybDogdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuY3JlYXRlQXBpSGFuZGxlcihhcGksIGNvbmZpZyksXG4gICAgICAgIH0pOyAvLyBFTkQgc2VydmVyLnJvdXRlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlQXBpSGFuZGxlcihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgICAoYXBpLm9wdGlvbnMuZ3VhcmRzID8/IFtdKS5ldmVyeSgoZ3VhcmQpID0+IGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSkpO1xuXG4gICAgICAvLyDtjIzrnbzrr7jthLAg7KCV67O066GcIHpvZCDsiqTtgqTrp4gg67mM65OcXG4gICAgICBjb25zdCB7IGdldFpvZE9iamVjdEZyb21BcGkgfSA9IGF3YWl0IGltcG9ydChcIi4vY29kZS1jb252ZXJ0ZXJzXCIpO1xuICAgICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICAgIC8vIHJlcXVlc3Qg7YyM7IuxXG4gICAgICBjb25zdCB3aGljaCA9IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIgPyBcInF1ZXJ5XCIgOiBcImJvZHlcIjtcbiAgICAgIGxldCByZXFCb2R5OiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgICAgcmVxQm9keSA9IGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UocmVxdWVzdFt3aGljaF0gPz8ge30pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKG1lc3NhZ2VzLCB7XG4gICAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRlbnQtVHlwZVxuICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7IaM65OcIGFyZ3Mg7IOd7ISx7ZWY7JesIO2YuOy2nFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgLy8gQ29udGV4dCDsnbjsoJ3shZhcbiAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVxQm9keVtwYXJhbS5uYW1lXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIGNvbnRleHQsIHJlcGx5KTtcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgaW52b2tlTW9kZWxNZXRob2QoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBhcmdzOiB1bmtub3duW10sXG4gICAgY29udGV4dDogQ29udGV4dCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogbW9kZWzsnYAg66qo6424IOyduOyKpO2EtOyKpOydtOuvgOuhnCDrqZTshJzrk5wg7Zi47LacIOqwgOuKpVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgKG1vZGVsIGFzIGFueSlbYXBpLm1ldGhvZE5hbWVdLmFwcGx5KG1vZGVsLCBhcmdzKTtcbiAgICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQ29udGV4dChcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTxDb250ZXh0PiB7XG4gICAgLy8gY3JlYXRlU1NFRmFjdG9yeSDtlajsiJjsl5Ag66+466asIHJlcXVlc3TsnZggc29ja2V06rO8IHJlcGx566W8IOuwlOyduOuUqS5cbiAgICBjb25zdCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0cmVhbS9zc2VcIik7XG4gICAgY29uc3QgY3JlYXRlU1NFID0gKDxUIGV4dGVuZHMgWm9kT2JqZWN0PihcbiAgICAgIF9yZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICAgIF9yZXBseTogRmFzdGlmeVJlcGx5LFxuICAgICAgX2V2ZW50czogVCxcbiAgICApID0+IGNyZWF0ZVNTRUZhY3RvcnkoX3JlcXVlc3Quc29ja2V0LCBfcmVwbHksIF9ldmVudHMpKS5iaW5kKG51bGwsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAuLi4oYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICAgIG5haXRlU3RvcmU6IE5haXRlLmNyZWF0ZVN0b3JlKCksXG4gICAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgICB1c2VyOiByZXF1ZXN0LnVzZXIgPz8gbnVsbCxcbiAgICAgICAgICAgIHBhc3Nwb3J0OiB7XG4gICAgICAgICAgICAgIGxvZ2luOiByZXF1ZXN0LmxvZ2luLmJpbmQocmVxdWVzdCkgYXMgQXV0aENvbnRleHRbXCJwYXNzcG9ydFwiXVtcImxvZ2luXCJdLFxuICAgICAgICAgICAgICBsb2dvdXQ6IHJlcXVlc3QubG9nb3V0LmJpbmQocmVxdWVzdCkgYXMgQXV0aENvbnRleHRbXCJwYXNzcG9ydFwiXVtcImxvZ291dFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5LFxuICAgICAgICApLFxuICAgICAgKSksXG4gICAgfTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0V2F0Y2hlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3YXRjaFBhdGggPSBbcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwic3JjXCIpXTtcblxuICAgIGNvbnN0IGNob2tpZGFyID0gKGF3YWl0IGltcG9ydChcImNob2tpZGFyXCIpKS5kZWZhdWx0O1xuICAgIHRoaXMud2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHdhdGNoUGF0aCwge1xuICAgICAgaWdub3JlZDogKHBhdGgsIHN0YXRzKSA9PlxuICAgICAgICAhIXN0YXRzPy5pc0ZpbGUoKSAmJiAhcGF0aC5lbmRzV2l0aChcIi50c1wiKSAmJiAhcGF0aC5lbmRzV2l0aChcIi5qc29uXCIpLFxuICAgICAgcGVyc2lzdGVudDogdHJ1ZSxcbiAgICAgIGlnbm9yZUluaXRpYWw6IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLndhdGNoZXIub24oXCJhbGxcIiwgYXN5bmMgKGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoIGFzIEFic29sdXRlUGF0aDtcbiAgICAgIGFzc2VydChcbiAgICAgICAgYWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgodGhpcy5hcGlSb290UGF0aCksXG4gICAgICAgIFwiRmlsZSBwYXRoIGlzIG5vdCB3aXRoaW4gdGhlIEFQSSByb290IHBhdGhcIixcbiAgICAgICk7XG5cbiAgICAgIGlmIChldmVudCAhPT0gXCJjaGFuZ2VcIiAmJiBldmVudCAhPT0gXCJhZGRcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIHNvbmFtdS5jb25maWcudHMg67OA6rK9IOyLnCDsnqzsi5zsnpFcbiAgICAgICAgY29uc3QgaXNDb25maWdUcyA9IGZpbGVQYXRoID09PSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJzb25hbXUuY29uZmlnLnRzXCIpO1xuXG4gICAgICAgIGlmIChpc0NvbmZpZ1RzKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGgucmVwbGFjZSh0aGlzLmFwaVJvb3RQYXRoLCBcImFwaVwiKTtcbiAgICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmJvbGQoYERldGVjdGVkKCR7ZXZlbnR9KTogJHtjaGFsay5ibHVlKHJlbGF0aXZlUGF0aCl9IC0gUmVzdGFydGluZy4uLmApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBcIlNJR1VTUjJcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWxlQ2hhbmdlKGV2ZW50LCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLypcbiAgICAgQSBmdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbml0IGFuZCBkZXN0cm95IHdoZW4gdXNpbmcgU29uYW11IHZpYSBzY3JpcHRzLiAgICBcbiAgKi9cbiAgYXN5bmMgcnVuU2NyaXB0KGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlclBsdWdpbnMoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIHBsdWdpbnM6IFNvbmFtdVNlcnZlck9wdGlvbnNbXCJwbHVnaW5zXCJdKSB7XG4gICAgaWYgKCFwbHVnaW5zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGx1Z2luc01vZHVsZXMgPSB7XG4gICAgICBjb3JzOiBcIkBmYXN0aWZ5L2NvcnNcIixcbiAgICAgIGZvcm1ib2R5OiBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCIsXG4gICAgICBtdWx0aXBhcnQ6IFwiQGZhc3RpZnkvbXVsdGlwYXJ0XCIsXG4gICAgICBxczogXCJmYXN0aWZ5LXFzXCIsXG4gICAgICBzc2U6IFwiZmFzdGlmeS1zc2UtdjJcIixcbiAgICAgIHN0YXRpYzogXCJAZmFzdGlmeS9zdGF0aWNcIixcbiAgICAgIHNlc3Npb246IFwiQGZhc3RpZnkvc2VjdXJlLXNlc3Npb25cIixcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJQbHVnaW4gPSBhc3luYyA8SyBleHRlbmRzIGtleW9mIE5vbk51bGxhYmxlPHR5cGVvZiBwbHVnaW5zPj4oXG4gICAgICBrZXk6IEssXG4gICAgICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb24gPSBwbHVnaW5zW2tleV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAob3B0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0LCBvcHRpb24pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHBsdWdpbk5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHBsdWdpbnNNb2R1bGVzKSkge1xuICAgICAgYXdhaXQgcmVnaXN0ZXJQbHVnaW4oa2V5IGFzIGtleW9mIHR5cGVvZiBwbHVnaW5zLCBwbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy5jdXN0b20pIHtcbiAgICAgIHBsdWdpbnMuY3VzdG9tKHNlcnZlcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckF1dGgoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsXG4gICAgb3B0aW9uczogTm9uTnVsbGFibGU8U29uYW11U2VydmVyT3B0aW9uc1tcImF1dGhcIl0+LFxuICApIHtcbiAgICAvLyBhd2FpdCBpbXBvcnQoXCJmYXN0aWZ5XCIpO1xuICAgIGNvbnN0IGZhc3RpZnlQYXNzcG9ydCA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9wYXNzcG9ydFwiKSkuZGVmYXVsdDtcbiAgICBzZXJ2ZXIucmVnaXN0ZXIoZmFzdGlmeVBhc3Nwb3J0LmluaXRpYWxpemUoKSk7XG4gICAgc2VydmVyLnJlZ2lzdGVyKGZhc3RpZnlQYXNzcG9ydC5zZWN1cmVTZXNzaW9uKCkpO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImJvb2xlYW5cIikge1xuICAgICAgZmFzdGlmeVBhc3Nwb3J0LnJlZ2lzdGVyVXNlclNlcmlhbGl6ZXIoYXN5bmMgKHVzZXIsIF9yZXF1ZXN0KSA9PiB1c2VyKTtcbiAgICAgIGZhc3RpZnlQYXNzcG9ydC5yZWdpc3RlclVzZXJEZXNlcmlhbGl6ZXIoYXN5bmMgKHNlcmlhbGl6ZWQsIF9yZXF1ZXN0KSA9PiBzZXJpYWxpemVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmFzdGlmeVBhc3Nwb3J0LnJlZ2lzdGVyVXNlclNlcmlhbGl6ZXIob3B0aW9ucy51c2VyU2VyaWFsaXplcik7XG4gICAgICBmYXN0aWZ5UGFzc3BvcnQucmVnaXN0ZXJVc2VyRGVzZXJpYWxpemVyKG9wdGlvbnMudXNlckRlc2VyaWFsaXplcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplV29ya2Zsb3dzKG9wdGlvbnM6IFNvbmFtdVRhc2tPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy5fd29ya2Zsb3dzID0gbmV3IFdvcmtmbG93TWFuYWdlcihEQi5nZXREQkNvbmZpZyhcIndcIikpO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZVdvcmtlciA9IG9wdGlvbnMuZW5hYmxlV29ya2VyID8/IGlzRGFlbW9uU2VydmVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFdvcmtlck9wdGlvbnMgPSB7XG4gICAgICBjb25jdXJyZW5jeTogb3MuY3B1cygpLmxlbmd0aCAtIDEsXG4gICAgICB1c2VQdWJTdWI6IHRydWUsXG4gICAgICBsaXN0ZW5EZWxheTogNTAwLFxuICAgIH07XG5cbiAgICBpZiAoZW5hYmxlV29ya2VyKSB7XG4gICAgICB0aGlzLndvcmtmbG93cy5zZXR1cFdvcmtlcih7XG4gICAgICAgIC4uLmRlZmF1bHRXb3JrZXJPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLndvcmtlck9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3Qoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIG9wdGlvbnM6IFNvbmFtdVNlcnZlck9wdGlvbnMpIHtcbiAgICBjb25zdCBwb3J0ID0gb3B0aW9ucy5saXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgICBjb25zdCBob3N0ID0gb3B0aW9ucy5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcblxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TaHV0ZG93bj8uKHNlcnZlcik7XG4gICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIHNodXRkb3duOlwiLCBlcnIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIHNodXRkb3duKTtcblxuICAgIGlmIChvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcikge1xuICAgICAgc2VydmVyLnNldEVycm9ySGFuZGxlcihvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcik7XG4gICAgfVxuXG4gICAgc2VydmVyXG4gICAgICAubGlzdGVuKHsgcG9ydCwgaG9zdCB9KVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5zdGFydFdvcmtlcigpO1xuICAgICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TdGFydD8uKHNlcnZlcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjpcIiwgZXJyKSk7XG4gICAgICAgIGF3YWl0IHNodXRkb3duKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRmlsZUNoYW5nZShldmVudDogc3RyaW5nLCBmaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7LKrIOuyiOynuCDtjIzsnbzsnbTrqbQgSE1SIOyLnOyekSDsi5zqsIQg6riw66GdXG4gICAgaWYgKHRoaXMucGVuZGluZ0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5obXJTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdGaWxlcy5wdXNoKGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYERldGVjdGVkKCR7ZXZlbnR9KTogJHtjaGFsay5ibHVlKHJlbGF0aXZlUGF0aCl9YCkpO1xuXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luY0Zyb21XYXRjaGVyKGV2ZW50LCBmaWxlUGF0aCk7XG5cbiAgICAvLyDsspjrpqwg7JmE66OM65CcIO2MjOydvOydhCDrjIDquLAg66qp66Gd7JeQ7IScIOygnOqxsFxuICAgIHRoaXMucGVuZGluZ0ZpbGVzID0gdGhpcy5wZW5kaW5nRmlsZXMuc2xpY2UoMSk7XG5cbiAgICAvLyDrqqjrk6Ag7YyM7J28IOyymOumrOqwgCDsmYTro4zrkJjrqbQg7LWc7KKFIOuplOyLnOyngCDstpzroKVcbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmlzaEhNUigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluaXNoSE1SKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLnJlbmV3Q2hlY2tzdW1zKCk7XG5cbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBlbmRUaW1lIC0gdGhpcy5obXJTdGFydFRpbWU7XG4gICAgY29uc3QgW2NoYWxrLCB7IGNlbnRlclRleHQgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQsXG4gICAgICBpbXBvcnQoXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIiksXG4gICAgXSk7XG4gICAgY29uc3QgbXNnID0gYEhNUiBEb25lISAke2NoYWxrLmJvbGQud2hpdGUoYCR7dG90YWxUaW1lfW1zYCl9YDtcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChtc2cpKSk7XG4gIH1cblxuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgQmFzZU1vZGVsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCIpO1xuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gICAgYXdhaXQgdGhpcy5fd29ya2Zsb3dzPy5kZXN0cm95KCk7XG4gICAgYXdhaXQgdGhpcy53YXRjaGVyPy5jbG9zZSgpO1xuICAgIHRoaXMuc3RvcmFnZT8uZGVzdHJveSgpO1xuICB9XG59XG5leHBvcnQgY29uc3QgU29uYW11ID0gbmV3IFNvbmFtdUNsYXNzKCk7XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiQXN5bmNMb2NhbFN0b3JhZ2UiLCJvcyIsInBhdGgiLCJjcmVhdGVNb2NrU1NFRmFjdG9yeSIsIkRCIiwiaXNEYWVtb25TZXJ2ZXIiLCJOYWl0ZSIsIlNvbmFtdUNsYXNzIiwiaXNJbml0aWFsaXplZCIsImFzeW5jTG9jYWxTdG9yYWdlIiwidXBsb2FkU3RvcmFnZSIsImdldENvbnRleHQiLCJzdG9yZSIsImdldFN0b3JlIiwiY29udGV4dCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInJlcXVlc3QiLCJyZXBseSIsImhlYWRlcnMiLCJjcmVhdGVTU0UiLCJzY2hlbWEiLCJuYWl0ZVN0b3JlIiwiTWFwIiwiRXJyb3IiLCJnZXRVcGxvYWRDb250ZXh0IiwidXBsb2FkQ29udGV4dCIsIl9hcGlSb290UGF0aCIsImFwaVJvb3RQYXRoIiwiYXBwUm9vdFBhdGgiLCJzcGxpdCIsInNlcCIsInNsaWNlIiwiam9pbiIsIl9kYkNvbmZpZyIsImRiQ29uZmlnIiwiX3N5bmNlciIsInN5bmNlciIsIl9jb25maWciLCJjb25maWciLCJfc2VjcmV0cyIsInNlY3JldHMiLCJfc3RvcmFnZSIsInN0b3JhZ2UiLCJfd29ya2Zsb3dzIiwid29ya2Zsb3dzIiwid2F0Y2hlciIsInBlbmRpbmdGaWxlcyIsImhtclN0YXJ0VGltZSIsInNlcnZlciIsImluaXRGb3JUZXN0aW5nIiwiaW5pdCIsInVuZGVmaW5lZCIsImRvU2lsZW50IiwiZW5hYmxlU3luYyIsImZvclRlc3RpbmciLCJjaGFsayIsImRlZmF1bHQiLCJjb25zb2xlIiwidGltZSIsImN5YW4iLCJmaW5kQXBpUm9vdFBhdGgiLCJsb2FkQ29uZmlnIiwiZGF0YWJhc2UiLCJBTlRIUk9QSUNfQVBJX0tFWSIsImFudGhyb3BpY19hcGlfa2V5IiwiVk9ZQUdFX0FQSV9LRVkiLCJ2b3lhZ2VfYXBpX2tleSIsIk9QRU5BSV9BUElfS0VZIiwib3BlbmFpX2FwaV9rZXkiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiZ2VuZXJhdGVEQkNvbmZpZyIsImxvZyIsImdyZWVuIiwiRW50aXR5TWFuYWdlciIsImF1dG9sb2FkIiwiaW5pdGlhbGl6ZVdvcmtmbG93cyIsInRhc2tzIiwiU3luY2VyIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwiYXV0b2xvYWRXb3JrZmxvd3MiLCJUZW1wbGF0ZU1hbmFnZXIiLCJpc0xvY2FsIiwiaXNUZXN0Iiwic2V0dXBCaW9tZSIsImlzSG90UmVsb2FkU2VydmVyIiwic3luYyIsInN0YXJ0V2F0Y2hlciIsInRpbWVFbmQiLCJjcmVhdGVTZXJ2ZXIiLCJpbml0T3B0aW9ucyIsIm9wdGlvbnMiLCJmYXN0aWZ5IiwicGx1Z2lucyIsInJlZ2lzdGVyUGx1Z2lucyIsImF1dGgiLCJzZXNzaW9uIiwicmVnaXN0ZXJBdXRoIiwid2l0aEZhc3RpZnkiLCJhcGlDb25maWciLCJib290IiwidGltZXpvbmUiLCJhcGkiLCJmb3JtYXRJblRpbWVab25lIiwiSVNPX0RBVEVfUkVHRVgiLCJEQVRFX0ZPUk1BVCIsInNldFJlcGx5U2VyaWFsaXplciIsInBheWxvYWQiLCJKU09OIiwic3RyaW5naWZ5IiwiX2tleSIsInZhbHVlIiwidGVzdCIsIkRhdGUiLCJnZXQiLCJyb3V0ZSIsInByZWZpeCIsIl9yZXF1ZXN0IiwiX3JlcGx5IiwiYXBpcyIsInNvbmFtdVVJQXBpUGx1Z2luIiwicmVnaXN0ZXIiLCJhbGwiLCJ1cmwiLCJzdGFydHNXaXRoIiwiZm91bmQiLCJmaW5kIiwiaHR0cE1ldGhvZCIsIm1ldGhvZCIsInRvVXBwZXJDYXNlIiwiY3JlYXRlQXBpSGFuZGxlciIsIk5vdEZvdW5kRXhjZXB0aW9uIiwibW9kZWxzIiwibW9kZWxOYW1lIiwiaGFuZGxlciIsImd1YXJkcyIsImV2ZXJ5IiwiZ3VhcmQiLCJndWFyZEhhbmRsZXIiLCJnZXRab2RPYmplY3RGcm9tQXBpIiwiUmVxVHlwZSIsInR5cGVzIiwid2hpY2giLCJyZXFCb2R5IiwiZmFzdGlmeUNhc3RlciIsInBhcnNlIiwiZSIsIlpvZEVycm9yIiwiaHVtYW5pemVab2RFcnJvciIsIm1lc3NhZ2VzIiwibWFwIiwiaXNzdWUiLCJtZXNzYWdlIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsInpvZEVycm9yIiwidHlwZSIsImNvbnRlbnRUeXBlIiwiY3JlYXRlQ29udGV4dCIsIkFwaVBhcmFtVHlwZSIsImFyZ3MiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJpc0NvbnRleHQiLCJuYW1lIiwiaW52b2tlTW9kZWxNZXRob2QiLCJtb2RlbCIsInJ1biIsInJlc3VsdCIsIm1ldGhvZE5hbWUiLCJhcHBseSIsImNyZWF0ZVNTRUZhY3RvcnkiLCJfZXZlbnRzIiwic29ja2V0IiwiYmluZCIsIlByb21pc2UiLCJyZXNvbHZlIiwiY29udGV4dFByb3ZpZGVyIiwiY3JlYXRlU3RvcmUiLCJ1c2VyIiwicGFzc3BvcnQiLCJsb2dpbiIsImxvZ291dCIsIndhdGNoUGF0aCIsImNob2tpZGFyIiwid2F0Y2giLCJpZ25vcmVkIiwic3RhdHMiLCJpc0ZpbGUiLCJlbmRzV2l0aCIsInBlcnNpc3RlbnQiLCJpZ25vcmVJbml0aWFsIiwib24iLCJldmVudCIsImZpbGVQYXRoIiwiYWJzb2x1dGVQYXRoIiwiaXNDb25maWdUcyIsInJlbGF0aXZlUGF0aCIsInJlcGxhY2UiLCJib2xkIiwiYmx1ZSIsImtpbGwiLCJwaWQiLCJoYW5kbGVGaWxlQ2hhbmdlIiwiZXJyb3IiLCJydW5TY3JpcHQiLCJmbiIsImRlc3Ryb3kiLCJwbHVnaW5zTW9kdWxlcyIsImNvcnMiLCJmb3JtYm9keSIsIm11bHRpcGFydCIsInFzIiwic3NlIiwic3RhdGljIiwicmVnaXN0ZXJQbHVnaW4iLCJrZXkiLCJwbHVnaW5OYW1lIiwib3B0aW9uIiwiZW50cmllcyIsImN1c3RvbSIsImZhc3RpZnlQYXNzcG9ydCIsImluaXRpYWxpemUiLCJzZWN1cmVTZXNzaW9uIiwicmVnaXN0ZXJVc2VyU2VyaWFsaXplciIsInJlZ2lzdGVyVXNlckRlc2VyaWFsaXplciIsInNlcmlhbGl6ZWQiLCJ1c2VyU2VyaWFsaXplciIsInVzZXJEZXNlcmlhbGl6ZXIiLCJXb3JrZmxvd01hbmFnZXIiLCJnZXREQkNvbmZpZyIsImVuYWJsZVdvcmtlciIsImRlZmF1bHRXb3JrZXJPcHRpb25zIiwiY29uY3VycmVuY3kiLCJjcHVzIiwidXNlUHViU3ViIiwibGlzdGVuRGVsYXkiLCJzZXR1cFdvcmtlciIsIndvcmtlck9wdGlvbnMiLCJwb3J0IiwibGlzdGVuIiwiaG9zdCIsImFkZEhvb2siLCJsaWZlY3ljbGUiLCJvblNodXRkb3duIiwic2h1dGRvd24iLCJjbG9zZSIsImV4aXQiLCJlcnIiLCJvbkVycm9yIiwic2V0RXJyb3JIYW5kbGVyIiwidGhlbiIsInN0YXJ0V29ya2VyIiwib25TdGFydCIsImNhdGNoIiwicmVkIiwibm93IiwicHVzaCIsInJlbGF0aXZlIiwic3luY0Zyb21XYXRjaGVyIiwiZmluaXNoSE1SIiwicmVuZXdDaGVja3N1bXMiLCJlbmRUaW1lIiwidG90YWxUaW1lIiwiY2VudGVyVGV4dCIsIm1zZyIsIndoaXRlIiwiYmxhY2siLCJiZ0dyZWVuIiwiQmFzZU1vZGVsIiwiU29uYW11Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsaUJBQWlCLFFBQVEsY0FBYztBQUloRCxPQUFPQyxRQUFRLEtBQUs7QUFDcEIsT0FBT0MsVUFBVSxPQUFPO0FBRXhCLFNBQVNDLG9CQUFvQixFQUFFQyxFQUFFLEVBQUVDLGNBQWMsUUFBUSxjQUFLO0FBRzlELFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFjdkMsTUFBTUM7SUFDR0MsZ0JBQXlCLE1BQU07SUFDL0JDLG9CQUVGLElBQUlULG9CQUFvQjtJQUV0QlUsZ0JBRUYsSUFBSVYsb0JBQW9CO0lBRXRCVyxhQUFzQjtRQUMzQixNQUFNQyxRQUFRLElBQUksQ0FBQ0gsaUJBQWlCLENBQUNJLFFBQVE7UUFDN0MsSUFBSUQsT0FBT0UsU0FBUztZQUNsQixPQUFPRixNQUFNRSxPQUFPO1FBQ3RCO1FBRUEsSUFBSUMsUUFBUUMsR0FBRyxDQUFDQyxRQUFRLEtBQUssUUFBUTtZQUNuQyxzQ0FBc0M7WUFDdEMsT0FBTztnQkFDTEMsU0FBUztnQkFDVEMsT0FBTztnQkFDUEMsU0FBUyxDQUFDO2dCQUNWQyxXQUFXLENBQUNDLFNBQXNCbkIscUJBQXFCbUI7Z0JBQ3ZELGtGQUFrRjtnQkFDbEZDLFlBQVksSUFBSUM7WUFDbEI7UUFDRixPQUFPO1lBQ0wsTUFBTSxJQUFJQyxNQUFNO1FBQ2xCO0lBQ0Y7SUFFT0MsbUJBQWtDO1FBQ3ZDLE1BQU1kLFFBQVEsSUFBSSxDQUFDRixhQUFhLENBQUNHLFFBQVE7UUFDekMsSUFBSUQsT0FBT2UsZUFBZTtZQUN4QixPQUFPZixNQUFNZSxhQUFhO1FBQzVCO1FBQ0EsTUFBTSxJQUFJRixNQUFNO0lBQ2xCO0lBRVFHLGVBQW9DLEtBQUs7SUFDakQsSUFBSUMsWUFBWUEsV0FBeUIsRUFBRTtRQUN6QyxJQUFJLENBQUNELFlBQVksR0FBR0M7SUFDdEI7SUFDQSxJQUFJQSxjQUE0QjtRQUM5QixJQUFJLElBQUksQ0FBQ0QsWUFBWSxLQUFLLE1BQU07WUFDOUIsTUFBTSxJQUFJSCxNQUFNO1FBQ2xCO1FBQ0EsT0FBTyxJQUFJLENBQUNHLFlBQVk7SUFDMUI7SUFDQSxJQUFJRSxjQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQ0QsV0FBVyxDQUFDRSxLQUFLLENBQUM3QixLQUFLOEIsR0FBRyxFQUFFQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUdDLElBQUksQ0FBQ2hDLEtBQUs4QixHQUFHO0lBQ3BFO0lBRVFHLFlBQW1DLEtBQUs7SUFDaEQsSUFBSUMsU0FBU0EsUUFBd0IsRUFBRTtRQUNyQyxJQUFJLENBQUNELFNBQVMsR0FBR0M7SUFDbkI7SUFDQSxJQUFJQSxXQUEyQjtRQUM3QixJQUFJLElBQUksQ0FBQ0QsU0FBUyxLQUFLLE1BQU07WUFDM0IsTUFBTSxJQUFJVixNQUFNO1FBQ2xCO1FBQ0EsT0FBTyxJQUFJLENBQUNVLFNBQVM7SUFDdkI7SUFFUUUsVUFBeUIsS0FBSztJQUN0QyxJQUFJQyxPQUFPQSxNQUFjLEVBQUU7UUFDekIsSUFBSSxDQUFDRCxPQUFPLEdBQUdDO0lBQ2pCO0lBQ0EsSUFBSUEsU0FBaUI7UUFDbkIsSUFBSSxJQUFJLENBQUNELE9BQU8sS0FBSyxNQUFNO1lBQ3pCLE1BQU0sSUFBSVosTUFBTTtRQUNsQjtRQUNBLE9BQU8sSUFBSSxDQUFDWSxPQUFPO0lBQ3JCO0lBRVFFLFVBQStCLEtBQUs7SUFDNUMsSUFBSUMsT0FBT0EsTUFBb0IsRUFBRTtRQUMvQixJQUFJLENBQUNELE9BQU8sR0FBR0M7SUFDakI7SUFDQSxJQUFJQSxTQUF1QjtRQUN6QixJQUFJLElBQUksQ0FBQ0QsT0FBTyxLQUFLLE1BQU07WUFDekIsTUFBTSxJQUFJZCxNQUFNO1FBQ2xCO1FBQ0EsT0FBTyxJQUFJLENBQUNjLE9BQU87SUFDckI7SUFFUUUsV0FBaUMsS0FBSztJQUM5QyxJQUFJQyxRQUFRQSxPQUFzQixFQUFFO1FBQ2xDLElBQUksQ0FBQ0QsUUFBUSxHQUFHQztJQUNsQjtJQUNBLElBQUlBLFVBQWdDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDRCxRQUFRO0lBQ3RCO0lBRVFFLFdBQTBCLEtBQUs7SUFDdkMsSUFBSUMsUUFBUUEsT0FBZSxFQUFFO1FBQzNCLElBQUksQ0FBQ0QsUUFBUSxHQUFHQztJQUNsQjtJQUNBLElBQUlBLFVBQXlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDRCxRQUFRO0lBQ3RCO0lBRVFFLGFBQXFDLEtBQUs7SUFDbEQsSUFBSUMsWUFBNkI7UUFDL0IsSUFBSSxJQUFJLENBQUNELFVBQVUsS0FBSyxNQUFNO1lBQzVCLE1BQU0sSUFBSXBCLE1BQU07UUFDbEI7UUFFQSxPQUFPLElBQUksQ0FBQ29CLFVBQVU7SUFDeEI7SUFFQSxTQUFTO0lBQ0ZFLFVBQTRCLEtBQUs7SUFDaENDLGVBQXlCLEVBQUUsQ0FBQztJQUM1QkMsZUFBdUIsRUFBRTtJQUUxQkMsU0FBaUMsS0FBSztJQUU3QyxNQUFNQyxpQkFBaUI7UUFDckIsTUFBTSxJQUFJLENBQUNDLElBQUksQ0FBQyxNQUFNLE9BQU9DLFdBQVc7SUFDMUM7SUFFQSxNQUFNRCxLQUNKRSxXQUFvQixLQUFLLEVBQ3pCQyxhQUFzQixJQUFJLEVBQzFCMUIsV0FBMEIsRUFDMUIyQixhQUFzQixLQUFLLEVBQzNCO1FBQ0EsSUFBSSxJQUFJLENBQUNoRCxhQUFhLEVBQUU7WUFDdEI7UUFDRjtRQUVBLElBQUksQ0FBQzhDLFVBQVU7WUFDYixNQUFNRyxRQUFRLEFBQUMsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxRQUFPLEVBQUdDLE9BQU87WUFDN0NDLFFBQVFDLElBQUksQ0FBQ0gsTUFBTUksSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFTCxhQUFhLGlCQUFpQixJQUFJO1FBQzFFO1FBRUEsWUFBWTtRQUNaLE1BQU0sRUFBRU0sZUFBZSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDekMsSUFBSSxDQUFDakMsV0FBVyxHQUFHQSxlQUFlaUM7UUFFbEMsTUFBTSxFQUFFQyxVQUFVLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztRQUNwQyxJQUFJLENBQUN2QixNQUFNLEdBQUcsTUFBTXVCLFdBQVcsSUFBSSxDQUFDbEMsV0FBVztRQUMvQywwQkFBMEI7UUFDMUIsSUFBSSxDQUFDVyxNQUFNLENBQUN3QixRQUFRLENBQUNBLFFBQVEsR0FBRyxJQUFJLENBQUN4QixNQUFNLENBQUN3QixRQUFRLENBQUNBLFFBQVEsSUFBSTtRQUVqRSxnQkFBZ0I7UUFDaEIsTUFBTXRCLFVBQXlCLENBQUM7UUFDaEMsSUFBSTNCLFFBQVFDLEdBQUcsQ0FBQ2lELGlCQUFpQixFQUFFO1lBQ2pDdkIsUUFBUXdCLGlCQUFpQixHQUFHbkQsUUFBUUMsR0FBRyxDQUFDaUQsaUJBQWlCO1FBQzNEO1FBQ0EsSUFBSWxELFFBQVFDLEdBQUcsQ0FBQ21ELGNBQWMsRUFBRTtZQUM5QnpCLFFBQVEwQixjQUFjLEdBQUdyRCxRQUFRQyxHQUFHLENBQUNtRCxjQUFjO1FBQ3JEO1FBQ0EsSUFBSXBELFFBQVFDLEdBQUcsQ0FBQ3FELGNBQWMsRUFBRTtZQUM5QjNCLFFBQVE0QixjQUFjLEdBQUd2RCxRQUFRQyxHQUFHLENBQUNxRCxjQUFjO1FBQ3JEO1FBQ0EsSUFBSUUsT0FBT0MsSUFBSSxDQUFDOUIsU0FBUytCLE1BQU0sR0FBRyxHQUFHO1lBQ25DLElBQUksQ0FBQy9CLE9BQU8sR0FBR0E7UUFDakI7UUFFQSxRQUFRO1FBQ1IsTUFBTSxFQUFFdEMsRUFBRSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDZ0MsUUFBUSxHQUFHaEMsR0FBR3NFLGdCQUFnQixDQUFDLElBQUksQ0FBQ2xDLE1BQU0sQ0FBQ3dCLFFBQVE7UUFDeEQsSUFBSSxDQUFDVixVQUFVO1lBQ2IsTUFBTUcsUUFBUSxBQUFDLENBQUEsTUFBTSxNQUFNLENBQUMsUUFBTyxFQUFHQyxPQUFPO1lBQzdDQyxRQUFRZ0IsR0FBRyxDQUFDbEIsTUFBTW1CLEtBQUssQ0FBQztRQUMxQjtRQUVBLFlBQVk7UUFDWiwyQkFBMkI7UUFDM0IseURBQXlEO1FBQ3pELE1BQU0sRUFBRUMsYUFBYSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDdkMsTUFBTUEsY0FBY0MsUUFBUSxDQUFDeEI7UUFFN0IsbUJBQW1CO1FBQ25CLElBQUlFLFlBQVk7WUFDZCxJQUFJLENBQUNoRCxhQUFhLEdBQUc7WUFDckI7UUFDRjtRQUVBLFVBQVU7UUFDVixNQUFNLElBQUksQ0FBQ3VFLG1CQUFtQixDQUFDLElBQUksQ0FBQ3ZDLE1BQU0sQ0FBQ3dDLEtBQUs7UUFFaEQsU0FBUztRQUNULE1BQU0sRUFBRUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDM0MsTUFBTSxHQUFHLElBQUkyQztRQUVsQixrQ0FBa0M7UUFDbEMsTUFBTSxJQUFJLENBQUMzQyxNQUFNLENBQUM0QyxhQUFhO1FBQy9CLE1BQU0sSUFBSSxDQUFDNUMsTUFBTSxDQUFDNkMsY0FBYztRQUNoQyxNQUFNLElBQUksQ0FBQzdDLE1BQU0sQ0FBQzhDLFlBQVk7UUFDOUIsTUFBTSxJQUFJLENBQUM5QyxNQUFNLENBQUMrQyxpQkFBaUI7UUFFbkMsTUFBTSxFQUFFQyxlQUFlLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztRQUN6QyxNQUFNQSxnQkFBZ0JSLFFBQVE7UUFFOUIsTUFBTSxFQUFFUyxPQUFPLEVBQUVDLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDO1FBQ3pDLElBQUlELFdBQVc7WUFDYix5REFBeUQ7WUFDeEQsQ0FBQSxNQUFNLE1BQU0sQ0FBQyx3QkFBb0IsRUFBR0UsVUFBVSxDQUFDLElBQUksQ0FBQzVELFdBQVc7UUFDbEU7UUFFQSxNQUFNLEVBQUU2RCxpQkFBaUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDO1FBQzNDLElBQUlILGFBQWEsQ0FBQ0MsWUFBWUUsdUJBQXVCbkMsWUFBWTtZQUMvRCxNQUFNLElBQUksQ0FBQ2pCLE1BQU0sQ0FBQ3FELElBQUk7WUFFdEIsTUFBTSxJQUFJLENBQUNDLFlBQVk7UUFDekI7UUFFQSxJQUFJLENBQUNwRixhQUFhLEdBQUc7UUFDckIsSUFBSSxDQUFDOEMsVUFBVTtZQUNiLE1BQU1HLFFBQVEsQUFBQyxDQUFBLE1BQU0sTUFBTSxDQUFDLFFBQU8sRUFBR0MsT0FBTztZQUM3Q0MsUUFBUWtDLE9BQU8sQ0FBQ3BDLE1BQU1JLElBQUksQ0FBQztRQUM3QjtJQUNGO0lBRUEsTUFBTWlDLGFBQWFDLFdBQTBELEVBQUU7UUFDN0UsSUFBSSxJQUFJLENBQUN2RixhQUFhLEtBQUssT0FBTztZQUNoQyxNQUFNLElBQUksQ0FBQzRDLElBQUksQ0FBQzJDLGFBQWF6QyxVQUFVeUMsYUFBYXhDO1FBQ3REO1FBRUEsTUFBTXlDLFVBQVUsSUFBSSxDQUFDeEQsTUFBTSxDQUFDVSxNQUFNO1FBQ2xDLE1BQU0rQyxVQUFVLEFBQUMsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxVQUFTLEVBQUd2QyxPQUFPO1FBQ2pELE1BQU1SLFNBQVMrQyxRQUFRRCxRQUFRQyxPQUFPO1FBQ3RDLElBQUksQ0FBQy9DLE1BQU0sR0FBR0E7UUFFZCxnQkFBZ0I7UUFDaEIsSUFBSThDLFFBQVFwRCxPQUFPLEVBQUU7WUFDbkIsSUFBSSxDQUFDQSxPQUFPLEdBQUdvRCxRQUFRcEQsT0FBTztRQUNoQztRQUVBLFVBQVU7UUFDVixJQUFJb0QsUUFBUUUsT0FBTyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxDQUFDQyxlQUFlLENBQUNqRCxRQUFROEMsUUFBUUUsT0FBTztRQUNwRDtRQUVBLElBQUlGLFFBQVFJLElBQUksRUFBRTtZQUNoQixJQUFJLENBQUNKLFFBQVFFLE9BQU8sRUFBRUcsU0FBUztnQkFDN0IsTUFBTSxJQUFJNUUsTUFBTTtZQUNsQjtZQUVBLE1BQU0sSUFBSSxDQUFDNkUsWUFBWSxDQUFDcEQsUUFBUThDLFFBQVFJLElBQUk7UUFDOUM7UUFFQSxhQUFhO1FBQ2IsTUFBTSxJQUFJLENBQUNHLFdBQVcsQ0FBQ3JELFFBQVE4QyxRQUFRUSxTQUFTLEVBQUU7WUFDaERqRCxZQUFZd0MsYUFBYXhDO1lBQ3pCRCxVQUFVeUMsYUFBYXpDO1FBQ3pCO1FBRUEsUUFBUTtRQUNSLE1BQU0sSUFBSSxDQUFDbUQsSUFBSSxDQUFDdkQsUUFBUThDO1FBRXhCLE9BQU85QztJQUNUO0lBRUEsTUFBTXFELFlBQ0pyRCxNQUFnRSxFQUNoRVYsTUFBMkIsRUFDM0J3RCxPQUdDLEVBQ0Q7UUFDQSxJQUFJLElBQUksQ0FBQ3hGLGFBQWEsS0FBSyxPQUFPO1lBQ2hDLE1BQU0sSUFBSSxDQUFDNEMsSUFBSSxDQUFDNEMsU0FBUzFDLFVBQVUwQyxTQUFTekM7UUFDOUM7UUFFQSxJQUFJLENBQUNMLE1BQU0sR0FBR0E7UUFFZCxjQUFjO1FBQ2QsTUFBTXdELFdBQVcsSUFBSSxDQUFDbEUsTUFBTSxDQUFDbUUsR0FBRyxDQUFDRCxRQUFRO1FBQ3pDLElBQUlBLFVBQVU7WUFDWixpQ0FBaUM7WUFDakMsK0JBQStCO1lBQy9CLDBFQUEwRTtZQUMxRSxNQUFNLEVBQUVFLGdCQUFnQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7WUFFMUMsbURBQW1EO1lBQ25ELE1BQU1DLGlCQUFpQjtZQUV2QiwwRUFBMEU7WUFDMUUsb0JBQW9CO1lBQ3BCLHlEQUF5RDtZQUN6RCxNQUFNQyxjQUFjO1lBRXBCNUQsT0FBTzZELGtCQUFrQixDQUFDLENBQUNDO2dCQUN6QixPQUFPQyxLQUFLQyxTQUFTLENBQUNGLFNBQVMsQ0FBQ0csTUFBTUM7b0JBQ3BDLElBQUksT0FBT0EsVUFBVSxZQUFZUCxlQUFlUSxJQUFJLENBQUNELFFBQVE7d0JBQzNELE9BQU9SLGlCQUNMLElBQUlVLEtBQUtGLFFBQ1RWLFVBQ0FJO29CQUVKO29CQUNBLE9BQU9NO2dCQUNUO1lBQ0Y7WUFDQSxJQUFJLENBQUNwQixTQUFTMUMsVUFBVTtnQkFDdEIsTUFBTUcsUUFBUSxBQUFDLENBQUEsTUFBTSxNQUFNLENBQUMsUUFBTyxFQUFHQyxPQUFPO2dCQUM3Q0MsUUFBUWdCLEdBQUcsQ0FBQ2xCLE1BQU1tQixLQUFLLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRThCLFVBQVU7WUFDdkQ7UUFDRjtRQUVBLGFBQWE7UUFDYnhELE9BQU9xRSxHQUFHLENBQ1IsR0FBRyxJQUFJLENBQUMvRSxNQUFNLENBQUNtRSxHQUFHLENBQUNhLEtBQUssQ0FBQ0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUN4QyxPQUFPQyxVQUFVQztZQUNmLE9BQU8sSUFBSSxDQUFDckYsTUFBTSxDQUFDc0YsSUFBSTtRQUN6QjtRQUdGLGtCQUFrQjtRQUNsQjFFLE9BQU9xRSxHQUFHLENBQ1IsR0FBRyxJQUFJLENBQUMvRSxNQUFNLENBQUNtRSxHQUFHLENBQUNhLEtBQUssQ0FBQ0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUM3QyxPQUFPQyxVQUFVQztZQUNmLE9BQU87UUFDVDtRQUdGLGdCQUFnQjtRQUNoQixNQUFNLEVBQUVFLGlCQUFpQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDM0MzRSxPQUFPNEUsUUFBUSxDQUFDRDtRQUVoQix5QkFBeUI7UUFDekIsTUFBTSxFQUFFdEMsT0FBTyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDakMsSUFBSUEsV0FBVztZQUNickMsT0FBTzZFLEdBQUcsQ0FBQyxLQUFLLE9BQU83RyxTQUFTQztnQkFDOUIsWUFBWTtnQkFDWixJQUFJRCxRQUFROEcsR0FBRyxDQUFDQyxVQUFVLENBQUMsZUFBZTtvQkFDeEM7Z0JBQ0Y7Z0JBRUEsTUFBTUMsUUFBUSxJQUFJLENBQUM1RixNQUFNLENBQUNzRixJQUFJLENBQUNPLElBQUksQ0FDakMsQ0FBQ3hCLE1BQ0MsSUFBSSxDQUFDbkUsTUFBTSxDQUFDbUUsR0FBRyxDQUFDYSxLQUFLLENBQUNDLE1BQU0sR0FBR2QsSUFBSXpHLElBQUksS0FBS2dCLFFBQVE4RyxHQUFHLENBQUNqRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFDckUsQUFBQzRFLENBQUFBLElBQUlYLE9BQU8sQ0FBQ29DLFVBQVUsSUFBSSxLQUFJLE1BQU9sSCxRQUFRbUgsTUFBTSxDQUFDQyxXQUFXO2dCQUVwRSxJQUFJSixPQUFPO29CQUNULE9BQU8sSUFBSSxDQUFDSyxnQkFBZ0IsQ0FBQ0wsT0FBTzFGLFFBQVF0QixTQUFTQztnQkFDdkQ7Z0JBRUEsSUFBSUQsUUFBUThHLEdBQUcsQ0FBQ0MsVUFBVSxDQUFDLFVBQVU7b0JBQ25DLE1BQU0sRUFBRU8saUJBQWlCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztvQkFDM0MsTUFBTSxJQUFJQSxrQkFBa0IsQ0FBQyxtQkFBbUIsRUFBRXRILFFBQVE4RyxHQUFHLEVBQUU7Z0JBQ2pFO2dCQUVBLDJCQUEyQjtnQkFDM0I7WUFDRjtRQUNGLE9BQU87WUFDTCxLQUFLLE1BQU1yQixPQUFPLElBQUksQ0FBQ3JFLE1BQU0sQ0FBQ3NGLElBQUksQ0FBRTtnQkFDbEMsUUFBUTtnQkFDUixJQUFJLElBQUksQ0FBQ3RGLE1BQU0sQ0FBQ21HLE1BQU0sQ0FBQzlCLElBQUkrQixTQUFTLENBQUMsS0FBS3JGLFdBQVc7b0JBQ25ELE1BQU0sSUFBSTVCLE1BQU0sQ0FBQyxlQUFlLEVBQUVrRixJQUFJK0IsU0FBUyxFQUFFO2dCQUNuRDtnQkFFQSxRQUFRO2dCQUNSeEYsT0FBT3NFLEtBQUssQ0FBQztvQkFDWGEsUUFBUTFCLElBQUlYLE9BQU8sQ0FBQ29DLFVBQVUsSUFBSTtvQkFDbENKLEtBQUssSUFBSSxDQUFDeEYsTUFBTSxDQUFDbUUsR0FBRyxDQUFDYSxLQUFLLENBQUNDLE1BQU0sR0FBR2QsSUFBSXpHLElBQUk7b0JBQzVDeUksU0FBUyxJQUFJLENBQUNKLGdCQUFnQixDQUFDNUIsS0FBS25FO2dCQUN0QyxJQUFJLG1CQUFtQjtZQUN6QjtRQUNGO0lBQ0Y7SUFFQStGLGlCQUNFNUIsR0FBZ0IsRUFDaEJuRSxNQUEyQixFQUN5QztRQUNwRSxPQUFPLE9BQU90QixTQUF5QkM7WUFDcEN3RixDQUFBQSxJQUFJWCxPQUFPLENBQUM0QyxNQUFNLElBQUksRUFBRSxBQUFELEVBQUdDLEtBQUssQ0FBQyxDQUFDQyxRQUFVdEcsT0FBT3VHLFlBQVksQ0FBQ0QsT0FBTzVILFNBQVN5RjtZQUVoRixzQkFBc0I7WUFDdEIsTUFBTSxFQUFFcUMsbUJBQW1CLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztZQUM3QyxNQUFNQyxVQUFVRCxvQkFBb0JyQyxLQUFLLElBQUksQ0FBQ3JFLE1BQU0sQ0FBQzRHLEtBQUs7WUFFMUQsYUFBYTtZQUNiLE1BQU1DLFFBQVF4QyxJQUFJWCxPQUFPLENBQUNvQyxVQUFVLEtBQUssUUFBUSxVQUFVO1lBQzNELElBQUlnQjtZQUdKLElBQUk7Z0JBQ0YsTUFBTSxFQUFFQyxhQUFhLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztnQkFDdkNELFVBQVVDLGNBQWNKLFNBQVNLLEtBQUssQ0FBQ3BJLE9BQU8sQ0FBQ2lJLE1BQU0sSUFBSSxDQUFDO1lBQzVELEVBQUUsT0FBT0ksR0FBRztnQkFDVixNQUFNLEVBQUVDLFFBQVEsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDO2dCQUNsQyxJQUFJRCxhQUFhQyxVQUFVO29CQUN6QixNQUFNLEVBQUVDLGdCQUFnQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7b0JBQzFDLE1BQU1DLFdBQVdELGlCQUFpQkYsR0FDL0JJLEdBQUcsQ0FBQyxDQUFDQyxRQUFVQSxNQUFNQyxPQUFPLEVBQzVCM0gsSUFBSSxDQUFDO29CQUNSLE1BQU0sRUFBRTRILG1CQUFtQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7b0JBQzdDLE1BQU0sSUFBSUEsb0JBQW9CSixVQUFVO3dCQUN0Q0ssVUFBVVI7b0JBQ1o7Z0JBQ0YsT0FBTztvQkFDTCxNQUFNQTtnQkFDUjtZQUNGO1lBRUEsZUFBZTtZQUNmcEksTUFBTTZJLElBQUksQ0FBQ3JELElBQUlYLE9BQU8sQ0FBQ2lFLFdBQVcsSUFBSTtZQUV0QyxhQUFhO1lBQ2IsTUFBTW5KLFVBQW1CLE1BQU0sSUFBSSxDQUFDb0osYUFBYSxDQUFDMUgsUUFBUXRCLFNBQVNDO1lBRW5FLHNCQUFzQjtZQUN0QixNQUFNLEVBQUVnSixZQUFZLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztZQUN0QyxNQUFNQyxPQUFPekQsSUFBSTBELFVBQVUsQ0FBQ1YsR0FBRyxDQUFDLENBQUNXO2dCQUMvQixjQUFjO2dCQUNkLElBQUlILGFBQWFJLFNBQVMsQ0FBQ0QsTUFBTU4sSUFBSSxHQUFHO29CQUN0QyxPQUFPbEo7Z0JBQ1QsT0FBTztvQkFDTCxPQUFPc0ksT0FBTyxDQUFDa0IsTUFBTUUsSUFBSSxDQUFDO2dCQUM1QjtZQUNGO1lBQ0EsT0FBTyxJQUFJLENBQUNDLGlCQUFpQixDQUFDOUQsS0FBS3lELE1BQU10SixTQUFTSztRQUNwRDtJQUNGO0lBRUEsTUFBTXNKLGtCQUNKOUQsR0FBZ0IsRUFDaEJ5RCxJQUFlLEVBQ2Z0SixPQUFnQixFQUNoQkssS0FBbUIsRUFDRDtRQUNsQixNQUFNdUosUUFBUSxJQUFJLENBQUNwSSxNQUFNLENBQUNtRyxNQUFNLENBQUM5QixJQUFJK0IsU0FBUyxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDakksaUJBQWlCLENBQUNrSyxHQUFHLENBQUM7WUFBRTdKO1FBQVEsR0FBRztZQUM3QywwRUFBMEU7WUFDMUUsTUFBTThKLFNBQVMsTUFBTSxBQUFDRixLQUFhLENBQUMvRCxJQUFJa0UsVUFBVSxDQUFDLENBQUNDLEtBQUssQ0FBQ0osT0FBT047WUFDakVqSixNQUFNNkksSUFBSSxDQUFDckQsSUFBSVgsT0FBTyxDQUFDaUUsV0FBVyxJQUFJO1lBRXRDLE9BQU9XO1FBQ1Q7SUFDRjtJQUVBLE1BQU1WLGNBQ0oxSCxNQUEyQixFQUMzQnRCLE9BQXVCLEVBQ3ZCQyxLQUFtQixFQUNEO1FBQ2xCLHVEQUF1RDtRQUN2RCxNQUFNLEVBQUU0SixnQkFBZ0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDO1FBQzFDLE1BQU0xSixZQUFZLEFBQUMsQ0FBQSxDQUNqQnFHLFVBQ0FDLFFBQ0FxRCxVQUNHRCxpQkFBaUJyRCxTQUFTdUQsTUFBTSxFQUFFdEQsUUFBUXFELFFBQU8sRUFBR0UsSUFBSSxDQUFDLE1BQU1oSyxTQUFTQztRQUU3RSxNQUFNTCxVQUFtQjtZQUN2QixHQUFJLE1BQU1xSyxRQUFRQyxPQUFPLENBQ3ZCNUksT0FBTzZJLGVBQWUsQ0FDcEI7Z0JBQ0VuSztnQkFDQUM7Z0JBQ0FDLFNBQVNGLFFBQVFFLE9BQU87Z0JBQ3hCQztnQkFDQUUsWUFBWWpCLE1BQU1nTCxXQUFXO2dCQUM3QixPQUFPO2dCQUNQQyxNQUFNckssUUFBUXFLLElBQUksSUFBSTtnQkFDdEJDLFVBQVU7b0JBQ1JDLE9BQU92SyxRQUFRdUssS0FBSyxDQUFDUCxJQUFJLENBQUNoSztvQkFDMUJ3SyxRQUFReEssUUFBUXdLLE1BQU0sQ0FBQ1IsSUFBSSxDQUFDaEs7Z0JBQzlCO1lBQ0YsR0FDQUEsU0FDQUMsT0FFSDtRQUNIO1FBQ0EsT0FBT0w7SUFDVDtJQUVBLE1BQU04RSxlQUE4QjtRQUNsQyxNQUFNK0YsWUFBWTtZQUFDekwsS0FBS2dDLElBQUksQ0FBQyxJQUFJLENBQUNMLFdBQVcsRUFBRTtTQUFPO1FBRXRELE1BQU0rSixXQUFXLEFBQUMsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxXQUFVLEVBQUdsSSxPQUFPO1FBQ25ELElBQUksQ0FBQ1gsT0FBTyxHQUFHNkksU0FBU0MsS0FBSyxDQUFDRixXQUFXO1lBQ3ZDRyxTQUFTLENBQUM1TCxNQUFNNkwsUUFDZCxDQUFDLENBQUNBLE9BQU9DLFlBQVksQ0FBQzlMLEtBQUsrTCxRQUFRLENBQUMsVUFBVSxDQUFDL0wsS0FBSytMLFFBQVEsQ0FBQztZQUMvREMsWUFBWTtZQUNaQyxlQUFlO1FBQ2pCO1FBRUEsSUFBSSxDQUFDcEosT0FBTyxDQUFDcUosRUFBRSxDQUFDLE9BQU8sT0FBT0MsT0FBZUM7WUFDM0MsTUFBTUMsZUFBZUQ7WUFDckJ2TSxPQUNFd00sYUFBYXRFLFVBQVUsQ0FBQyxJQUFJLENBQUNwRyxXQUFXLEdBQ3hDO1lBR0YsSUFBSXdLLFVBQVUsWUFBWUEsVUFBVSxPQUFPO2dCQUN6QztZQUNGO1lBRUEsSUFBSTtnQkFDRiw0QkFBNEI7Z0JBQzVCLE1BQU1HLGFBQWFGLGFBQWFwTSxLQUFLZ0MsSUFBSSxDQUFDLElBQUksQ0FBQ0wsV0FBVyxFQUFFLE9BQU87Z0JBRW5FLElBQUkySyxZQUFZO29CQUNkLE1BQU1DLGVBQWVILFNBQVNJLE9BQU8sQ0FBQyxJQUFJLENBQUM3SyxXQUFXLEVBQUU7b0JBQ3hELE1BQU00QixRQUFRLEFBQUMsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxRQUFPLEVBQUdDLE9BQU87b0JBQzdDQyxRQUFRZ0IsR0FBRyxDQUNUbEIsTUFBTWtKLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRU4sTUFBTSxHQUFHLEVBQUU1SSxNQUFNbUosSUFBSSxDQUFDSCxjQUFjLGdCQUFnQixDQUFDO29CQUU5RTFMLFFBQVE4TCxJQUFJLENBQUM5TCxRQUFRK0wsR0FBRyxFQUFFO29CQUMxQjtnQkFDRjtnQkFFQSxNQUFNLElBQUksQ0FBQ0MsZ0JBQWdCLENBQUNWLE9BQU9FO1lBQ3JDLEVBQUUsT0FBT2hELEdBQUc7Z0JBQ1Y1RixRQUFRcUosS0FBSyxDQUFDekQ7WUFDaEI7UUFDRjtJQUNGO0lBRUE7O0VBRUEsR0FDQSxNQUFNMEQsVUFBVUMsRUFBdUIsRUFBRTtRQUN2QyxNQUFNLElBQUksQ0FBQzlKLElBQUksQ0FBQyxNQUFNLE9BQU9DLFdBQVc7UUFDeEMsSUFBSTtZQUNGLE1BQU02SjtRQUNSLFNBQVU7WUFDUixNQUFNLElBQUksQ0FBQ0MsT0FBTztRQUNwQjtJQUNGO0lBRUEsTUFBY2hILGdCQUFnQmpELE1BQXVCLEVBQUVnRCxPQUF1QyxFQUFFO1FBQzlGLElBQUksQ0FBQ0EsU0FBUztZQUNaO1FBQ0Y7UUFFQSxNQUFNa0gsaUJBQWlCO1lBQ3JCQyxNQUFNO1lBQ05DLFVBQVU7WUFDVkMsV0FBVztZQUNYQyxJQUFJO1lBQ0pDLEtBQUs7WUFDTEMsUUFBUTtZQUNSckgsU0FBUztRQUNYO1FBRUEsTUFBTXNILGlCQUFpQixPQUNyQkMsS0FDQUM7WUFFQSxNQUFNQyxTQUFTNUgsT0FBTyxDQUFDMEgsSUFBSTtZQUMzQixJQUFJLENBQUNFLFFBQVE7WUFFYixJQUFJQSxXQUFXLE1BQU07Z0JBQ25CNUssT0FBTzRFLFFBQVEsQ0FBQyxBQUFDLENBQUEsTUFBTSxNQUFNLENBQUMrRixXQUFVLEVBQUduSyxPQUFPO1lBQ3BELE9BQU87Z0JBQ0xSLE9BQU80RSxRQUFRLENBQUMsQUFBQyxDQUFBLE1BQU0sTUFBTSxDQUFDK0YsV0FBVSxFQUFHbkssT0FBTyxFQUFFb0s7WUFDdEQ7UUFDRjtRQUVBLEtBQUssTUFBTSxDQUFDRixLQUFLQyxXQUFXLElBQUl0SixPQUFPd0osT0FBTyxDQUFDWCxnQkFBaUI7WUFDOUQsTUFBTU8sZUFBZUMsS0FBNkJDO1FBQ3BEO1FBRUEsSUFBSTNILFFBQVE4SCxNQUFNLEVBQUU7WUFDbEI5SCxRQUFROEgsTUFBTSxDQUFDOUs7UUFDakI7SUFDRjtJQUVBLE1BQWNvRCxhQUNacEQsTUFBdUIsRUFDdkI4QyxPQUFpRCxFQUNqRDtRQUNBLDJCQUEyQjtRQUMzQixNQUFNaUksa0JBQWtCLEFBQUMsQ0FBQSxNQUFNLE1BQU0sQ0FBQyxvQkFBbUIsRUFBR3ZLLE9BQU87UUFDbkVSLE9BQU80RSxRQUFRLENBQUNtRyxnQkFBZ0JDLFVBQVU7UUFDMUNoTCxPQUFPNEUsUUFBUSxDQUFDbUcsZ0JBQWdCRSxhQUFhO1FBRTdDLElBQUksT0FBT25JLFlBQVksV0FBVztZQUNoQ2lJLGdCQUFnQkcsc0JBQXNCLENBQUMsT0FBTzdDLE1BQU03RCxXQUFhNkQ7WUFDakUwQyxnQkFBZ0JJLHdCQUF3QixDQUFDLE9BQU9DLFlBQVk1RyxXQUFhNEc7UUFDM0UsT0FBTztZQUNMTCxnQkFBZ0JHLHNCQUFzQixDQUFDcEksUUFBUXVJLGNBQWM7WUFDN0ROLGdCQUFnQkksd0JBQXdCLENBQUNySSxRQUFRd0ksZ0JBQWdCO1FBQ25FO0lBQ0Y7SUFFQSxNQUFjekosb0JBQW9CaUIsT0FBc0MsRUFBRTtRQUN4RSxNQUFNLEVBQUV5SSxlQUFlLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztRQUN6QyxtRkFBbUY7UUFDbkYsSUFBSSxDQUFDNUwsVUFBVSxHQUFHLElBQUk0TCxnQkFBZ0JyTyxHQUFHc08sV0FBVyxDQUFDO1FBQ3JELElBQUksQ0FBQzFJLFNBQVM7WUFDWjtRQUNGO1FBRUEsTUFBTTJJLGVBQWUzSSxRQUFRMkksWUFBWSxJQUFJdE87UUFDN0MsTUFBTXVPLHVCQUF1QjtZQUMzQkMsYUFBYTVPLEdBQUc2TyxJQUFJLEdBQUdySyxNQUFNLEdBQUc7WUFDaENzSyxXQUFXO1lBQ1hDLGFBQWE7UUFDZjtRQUVBLElBQUlMLGNBQWM7WUFDaEIsSUFBSSxDQUFDN0wsU0FBUyxDQUFDbU0sV0FBVyxDQUFDO2dCQUN6QixHQUFHTCxvQkFBb0I7Z0JBQ3ZCLEdBQUc1SSxRQUFRa0osYUFBYTtZQUMxQjtRQUNGO0lBQ0Y7SUFFQSxNQUFjekksS0FBS3ZELE1BQXVCLEVBQUU4QyxPQUE0QixFQUFFO1FBQ3hFLE1BQU1tSixPQUFPbkosUUFBUW9KLE1BQU0sRUFBRUQsUUFBUTtRQUNyQyxNQUFNRSxPQUFPckosUUFBUW9KLE1BQU0sRUFBRUMsUUFBUTtRQUVyQ25NLE9BQU9vTSxPQUFPLENBQUMsV0FBVztZQUN4QixNQUFNdEosUUFBUXVKLFNBQVMsRUFBRUMsYUFBYXRNO1lBQ3RDLE1BQU0sSUFBSSxDQUFDSixTQUFTLENBQUNxSyxPQUFPO1lBQzVCLE1BQU0sSUFBSSxDQUFDQSxPQUFPO1FBQ3BCO1FBRUEsTUFBTXNDLFdBQVc7WUFDZixJQUFJO2dCQUNGLE1BQU12TSxPQUFPd00sS0FBSztnQkFDbEIzTyxRQUFRNE8sSUFBSSxDQUFDO1lBQ2YsRUFBRSxPQUFPQyxLQUFLO2dCQUNaak0sUUFBUXFKLEtBQUssQ0FBQywwQkFBMEI0QztnQkFDeEM3TyxRQUFRNE8sSUFBSSxDQUFDO1lBQ2Y7UUFDRjtRQUVBNU8sUUFBUXFMLEVBQUUsQ0FBQyxVQUFVcUQ7UUFDckIxTyxRQUFRcUwsRUFBRSxDQUFDLFdBQVdxRDtRQUV0QixJQUFJekosUUFBUXVKLFNBQVMsRUFBRU0sU0FBUztZQUM5QjNNLE9BQU80TSxlQUFlLENBQUM5SixRQUFRdUosU0FBUyxFQUFFTTtRQUM1QztRQUVBM00sT0FDR2tNLE1BQU0sQ0FBQztZQUFFRDtZQUFNRTtRQUFLLEdBQ3BCVSxJQUFJLENBQUM7WUFDSixNQUFNLElBQUksQ0FBQ2pOLFNBQVMsQ0FBQ2tOLFdBQVc7WUFDaEMsTUFBTWhLLFFBQVF1SixTQUFTLEVBQUVVLFVBQVUvTTtRQUNyQyxHQUNDZ04sS0FBSyxDQUFDLE9BQU9OO1lBQ1osTUFBTW5NLFFBQVEsQUFBQyxDQUFBLE1BQU0sTUFBTSxDQUFDLFFBQU8sRUFBR0MsT0FBTztZQUM3Q0MsUUFBUXFKLEtBQUssQ0FBQ3ZKLE1BQU0wTSxHQUFHLENBQUMsMkJBQTJCUDtZQUNuRCxNQUFNSDtRQUNSO0lBQ0o7SUFFQSxNQUFjMUMsaUJBQWlCVixLQUFhLEVBQUVDLFFBQXNCLEVBQWlCO1FBQ25GLHlCQUF5QjtRQUN6QixJQUFJLElBQUksQ0FBQ3RKLFlBQVksQ0FBQ3lCLE1BQU0sS0FBSyxHQUFHO1lBQ2xDLElBQUksQ0FBQ3hCLFlBQVksR0FBR3FFLEtBQUs4SSxHQUFHO1FBQzlCO1FBQ0EsSUFBSSxDQUFDcE4sWUFBWSxDQUFDcU4sSUFBSSxDQUFDL0Q7UUFFdkIsTUFBTUcsZUFBZXZNLEtBQUtvUSxRQUFRLENBQUMsSUFBSSxDQUFDek8sV0FBVyxFQUFFeUs7UUFDckQsTUFBTTdJLFFBQVEsQUFBQyxDQUFBLE1BQU0sTUFBTSxDQUFDLFFBQU8sRUFBR0MsT0FBTztRQUM3Q0MsUUFBUWdCLEdBQUcsQ0FBQ2xCLE1BQU1rSixJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUVOLE1BQU0sR0FBRyxFQUFFNUksTUFBTW1KLElBQUksQ0FBQ0gsZUFBZTtRQUV4RSxNQUFNLElBQUksQ0FBQ25LLE1BQU0sQ0FBQ2lPLGVBQWUsQ0FBQ2xFLE9BQU9DO1FBRXpDLHdCQUF3QjtRQUN4QixJQUFJLENBQUN0SixZQUFZLEdBQUcsSUFBSSxDQUFDQSxZQUFZLENBQUNmLEtBQUssQ0FBQztRQUU1QywyQkFBMkI7UUFDM0IsSUFBSSxJQUFJLENBQUNlLFlBQVksQ0FBQ3lCLE1BQU0sS0FBSyxHQUFHO1lBQ2xDLE1BQU0sSUFBSSxDQUFDK0wsU0FBUztRQUN0QjtJQUNGO0lBRUEsTUFBY0EsWUFBMkI7UUFDdkMsTUFBTSxJQUFJLENBQUNsTyxNQUFNLENBQUNtTyxjQUFjO1FBRWhDLE1BQU1DLFVBQVVwSixLQUFLOEksR0FBRztRQUN4QixNQUFNTyxZQUFZRCxVQUFVLElBQUksQ0FBQ3pOLFlBQVk7UUFDN0MsTUFBTSxDQUFDUSxPQUFPLEVBQUVtTixVQUFVLEVBQUUsQ0FBQyxHQUFHLE1BQU16RixRQUFRcEQsR0FBRyxDQUFDO1lBQy9DLENBQUEsTUFBTSxNQUFNLENBQUMsUUFBTyxFQUFHckUsT0FBTztZQUMvQixNQUFNLENBQUM7U0FDUjtRQUNELE1BQU1tTixNQUFNLENBQUMsVUFBVSxFQUFFcE4sTUFBTWtKLElBQUksQ0FBQ21FLEtBQUssQ0FBQyxHQUFHSCxVQUFVLEVBQUUsQ0FBQyxHQUFHO1FBRTdEaE4sUUFBUWdCLEdBQUcsQ0FBQ2xCLE1BQU1zTixLQUFLLENBQUNDLE9BQU8sQ0FBQ0osV0FBV0M7SUFDN0M7SUFFQSxNQUFNMUQsVUFBeUI7UUFDN0IsTUFBTSxFQUFFOEQsU0FBUyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDbkMsTUFBTUEsVUFBVTlELE9BQU87UUFDdkIsTUFBTSxJQUFJLENBQUN0SyxVQUFVLEVBQUVzSztRQUN2QixNQUFNLElBQUksQ0FBQ3BLLE9BQU8sRUFBRTJNO1FBQ3BCLElBQUksQ0FBQzlNLE9BQU8sRUFBRXVLO0lBQ2hCO0FBQ0Y7QUFDQSxPQUFPLE1BQU0rRCxTQUFTLElBQUkzUSxjQUFjIn0=
@@ -10,12 +10,17 @@ export declare function findChangedFilesUsingChecksums(): Promise<AbsolutePath[]
10
10
  * 현재 파일들의 체크섬을 계산해서 구한 다음, 체크섬 파일에 저장된 내용과 다르면 체크섬 파일을 갱신합니다.
11
11
  */
12
12
  export declare function renewChecksums(): Promise<void>;
13
+ export type FileOrData = {
14
+ path: PathLike;
15
+ } | {
16
+ data: string;
17
+ };
13
18
  /**
14
19
  * 두 파일의 내용이 같은지 체크섬으로 비교합니다.
15
20
  * 만약 파일이 둘 중 하나라도 없다면 비교 불가로 false 반환합니다.
16
- * @param one 파일 경로
17
- * @param two 파일 경로
21
+ * @param one 파일 경로 혹은 데이터
22
+ * @param two 파일 경로 혹은 데이터
18
23
  * @returns boolean
19
24
  */
20
- export declare function areFilesSame(one: PathLike, two: PathLike): Promise<boolean>;
25
+ export declare function areFilesSame(...files: FileOrData[]): Promise<boolean>;
21
26
  //# sourceMappingURL=checksum.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/syncer/checksum.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,IAAI,CAAC;AAOrD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AASzE;;;GAGG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAU9E;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CASjF"}
1
+ {"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/syncer/checksum.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,IAAI,CAAC;AAOrD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AASzE;;;GAGG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAU9E;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD;AAED,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,QAAQ,CAAC;CAChB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEN;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB3E"}
@@ -36,16 +36,19 @@ import { getChecksumPatternGroupInAbsolutePath } from "./file-patterns.js";
36
36
  /**
37
37
  * 두 파일의 내용이 같은지 체크섬으로 비교합니다.
38
38
  * 만약 파일이 둘 중 하나라도 없다면 비교 불가로 false 반환합니다.
39
- * @param one 파일 경로
40
- * @param two 파일 경로
39
+ * @param one 파일 경로 혹은 데이터
40
+ * @param two 파일 경로 혹은 데이터
41
41
  * @returns boolean
42
- */ export async function areFilesSame(one, two) {
43
- if (!await exists(one) || !await exists(two)) {
44
- return false;
42
+ */ export async function areFilesSame(...files) {
43
+ const checksums = [];
44
+ for (const file of files){
45
+ if ("path" in file && !await exists(file.path)) {
46
+ return false;
47
+ }
48
+ checksums.push("path" in file ? await getChecksumOfFile(file.path) : getChecksumOfData(file.data));
45
49
  }
46
- const oneChecksum = await getChecksumOfFile(one);
47
- const twoChecksum = await getChecksumOfFile(two);
48
- return oneChecksum === twoChecksum;
50
+ return checksums.every(// 다음 체크섬과 비교, 만약 마지막 체크섬일 때는 첫 번째 체크섬과 비교
51
+ (checksum, index)=>checksum === checksums[index === checksums.length - 1 ? 0 : index + 1]);
49
52
  }
50
53
  async function getCurrentChecksums() {
51
54
  const filePaths = (await Promise.all(Object.entries(getChecksumPatternGroupInAbsolutePath()).map(async ([_fileType, pattern])=>{
@@ -81,6 +84,11 @@ async function saveChecksums(checksums) {
81
84
  })), null, 2), "utf-8");
82
85
  console.log("checksum saved", checksumFilePath);
83
86
  }
87
+ function getChecksumOfData(data) {
88
+ const hash = crypto.createHash("sha1");
89
+ hash.update(data);
90
+ return hash.digest("hex");
91
+ }
84
92
  async function getChecksumOfFile(filePath) {
85
93
  return new Promise((resolve, reject)=>{
86
94
  const hash = crypto.createHash("sha1");
@@ -95,4 +103,4 @@ async function getChecksumOfFile(filePath) {
95
103
  });
96
104
  }
97
105
 
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY2hlY2tzdW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0bywgeyB0eXBlIEJpbmFyeUxpa2UgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgdHlwZSBQYXRoTGlrZSB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCwgQXBpUmVsYXRpdmVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuXG50eXBlIFBhdGhBbmRDaGVja3N1bSA9IHtcbiAgcGF0aDogQWJzb2x1dGVQYXRoO1xuICBjaGVja3N1bTogc3RyaW5nO1xufTtcblxuLyoqXG4gKiDssrTtgazshKwg7YyM7J287JeQIOyggOyepeuQnCDrgrTsmqnqs7wg7ZiE7J6sIOyLpOygnCDtjIzsnbzsnZgg7LK07YGs7ISs7J2EIOu5hOq1kO2VmOyXrCDrs4Dqsr3rkJwg7YyM7J287J2EIOywvuyKteuLiOuLpC5cbiAqIEByZXR1cm5zIOuzgOqyveuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCDsiqzrnpjsi5zroZwg7Iuc7J6R7ZWp64uI64ukLiDsmIjsi5w6IFwiL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgY29uc3QgY2FsY3VsYXRlZENoZWNrc3VtcyA9IGF3YWl0IGdldEN1cnJlbnRDaGVja3N1bXMoKTtcbiAgY29uc3Qgc2F2ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRQcmV2aW91c0NoZWNrc3VtcygpO1xuXG4gIGNvbnN0IGlzU2FtZSA9IGVxdWFsKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zKTtcbiAgaWYgKGlzU2FtZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBkaWZmZXJlbmNlV2l0aChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3VtcywgaXNFcXVhbCkubWFwKChyKSA9PiByLnBhdGgpO1xufVxuXG4vKipcbiAqIOyytO2BrOyErOydhCDqsLHsi6Dtlanri4jri6QuXG4gKiDtmITsnqwg7YyM7J2865Ok7J2YIOyytO2BrOyErOydhCDqs4TsgrDtlbTshJwg6rWs7ZWcIOuLpOydjCwg7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IOuLpOultOuptCDssrTtgazshKwg7YyM7J287J2EIOqwseyLoO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWxjdWxhdGVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0Q3VycmVudENoZWNrc3VtcygpO1xuICBjb25zdCBzYXZlZENoZWNrc3VtcyA9IGF3YWl0IGdldFByZXZpb3VzQ2hlY2tzdW1zKCk7XG5cbiAgY29uc3QgaXNTYW1lID0gZXF1YWwoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMpO1xuICBpZiAoaXNTYW1lKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgc2F2ZUNoZWNrc3VtcyhjYWxjdWxhdGVkQ2hlY2tzdW1zKTtcbn1cblxuLyoqXG4gKiDrkZAg7YyM7J287J2YIOuCtOyaqeydtCDqsJnsnYDsp4Ag7LK07YGs7ISs7Jy866GcIOu5hOq1kO2VqeuLiOuLpC5cbiAqIOunjOyVvSDtjIzsnbzsnbQg65GYIOykkSDtlZjrgpjrnbzrj4Qg7JeG64uk66m0IOu5hOq1kCDrtojqsIDroZwgZmFsc2Ug67CY7ZmY7ZWp64uI64ukLlxuICogQHBhcmFtIG9uZSDtjIzsnbwg6rK966GcXG4gKiBAcGFyYW0gdHdvIO2MjOydvCDqsr3roZxcbiAqIEByZXR1cm5zIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyZUZpbGVzU2FtZShvbmU6IFBhdGhMaWtlLCB0d286IFBhdGhMaWtlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghKGF3YWl0IGV4aXN0cyhvbmUpKSB8fCAhKGF3YWl0IGV4aXN0cyh0d28pKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG9uZUNoZWNrc3VtID0gYXdhaXQgZ2V0Q2hlY2tzdW1PZkZpbGUob25lKTtcbiAgY29uc3QgdHdvQ2hlY2tzdW0gPSBhd2FpdCBnZXRDaGVja3N1bU9mRmlsZSh0d28pO1xuXG4gIHJldHVybiBvbmVDaGVja3N1bSA9PT0gdHdvQ2hlY2tzdW07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDaGVja3N1bXMoKTogUHJvbWlzZTxQYXRoQW5kQ2hlY2tzdW1bXT4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBPYmplY3QuZW50cmllcyhnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCkpLm1hcChhc3luYyAoW19maWxlVHlwZSwgcGF0dGVybl0pID0+IHtcbiAgICAgICAgcmV0dXJuIGdsb2JBc3luYyhwYXR0ZXJuKSBhcyBQcm9taXNlPEFic29sdXRlUGF0aFtdPjtcbiAgICAgIH0pLFxuICAgIClcbiAgKVxuICAgIC5mbGF0KClcbiAgICAuc29ydCgpO1xuXG4gIGNvbnN0IGZpbGVDaGVja3N1bXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlUGF0aHMubWFwKGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgIGNoZWNrc3VtOiBhd2FpdCBnZXRDaGVja3N1bU9mRmlsZShmaWxlUGF0aCksXG4gICAgICB9O1xuICAgIH0pLFxuICApO1xuXG4gIHJldHVybiBmaWxlQ2hlY2tzdW1zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQcmV2aW91c0NoZWNrc3VtcygpOiBQcm9taXNlPFBhdGhBbmRDaGVja3N1bVtdPiB7XG4gIGNvbnN0IGNoZWNrc3VtRmlsZVBhdGggPSBnZXRDaGVja3N1bUZpbGVQYXRoKCk7XG4gIGlmICghKGF3YWl0IGV4aXN0cyhjaGVja3N1bUZpbGVQYXRoKSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwcmV2aW91c0NoZWNrc3VtcyA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoY2hlY2tzdW1GaWxlUGF0aCwgXCJ1dGYtOFwiKSkubWFwKFxuICAgIChyOiB7IHBhdGg6IEFwaVJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgICAgcGF0aDogcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgci5wYXRoKSwgLy8g7LK07YGs7ISsIO2MjOydvOyXkOyEnCDsnb3snYQg65WMOiBBUEkg7IOB64yAIOqyveuhnCDihpIg7KCI64yAIOqyveuhnFxuICAgICAgY2hlY2tzdW06IHIuY2hlY2tzdW0sXG4gICAgfSksXG4gICkgYXMgUGF0aEFuZENoZWNrc3VtW107XG4gIHJldHVybiBwcmV2aW91c0NoZWNrc3Vtcztcbn1cblxuZnVuY3Rpb24gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzb25hbXUubG9ja1wiKSBhcyBBYnNvbHV0ZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDaGVja3N1bXMoY2hlY2tzdW1zOiBQYXRoQW5kQ2hlY2tzdW1bXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjaGVja3N1bUZpbGVQYXRoID0gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpO1xuICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgY2hlY2tzdW1GaWxlUGF0aCxcbiAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgIGNoZWNrc3Vtcy5tYXAoKHIpID0+ICh7XG4gICAgICAgIHBhdGg6IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQIOyggOyepe2VoCDrlYw6IOygiOuMgCDqsr3roZwg4oaSIEFQSSDsg4HrjIAg6rK966GcXG4gICAgICAgIGNoZWNrc3VtOiByLmNoZWNrc3VtLFxuICAgICAgfSkpLFxuICAgICAgbnVsbCxcbiAgICAgIDIsXG4gICAgKSxcbiAgICBcInV0Zi04XCIsXG4gICk7XG4gIGNvbnNvbGUubG9nKFwiY2hlY2tzdW0gc2F2ZWRcIiwgY2hlY2tzdW1GaWxlUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoOiBQYXRoTGlrZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGExXCIpO1xuICAgIGNvbnN0IGlucHV0ID0gY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCk7XG4gICAgaW5wdXQub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgIGlucHV0Lm9uKFwiZGF0YVwiLCAoY2h1bms6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGNodW5rKTtcbiAgICB9KTtcbiAgICBpbnB1dC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIHJlc29sdmUoaGFzaC5kaWdlc3QoXCJoZXhcIikpO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJjcnlwdG8iLCJlcXVhbCIsImNyZWF0ZVJlYWRTdHJlYW0iLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsInBhdGgiLCJpc0VxdWFsIiwiU29uYW11IiwiZ2xvYkFzeW5jIiwiZXhpc3RzIiwiZGlmZmVyZW5jZVdpdGgiLCJnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIiwiZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zIiwiY2FsY3VsYXRlZENoZWNrc3VtcyIsImdldEN1cnJlbnRDaGVja3N1bXMiLCJzYXZlZENoZWNrc3VtcyIsImdldFByZXZpb3VzQ2hlY2tzdW1zIiwiaXNTYW1lIiwibWFwIiwiciIsInJlbmV3Q2hlY2tzdW1zIiwic2F2ZUNoZWNrc3VtcyIsImFyZUZpbGVzU2FtZSIsIm9uZSIsInR3byIsIm9uZUNoZWNrc3VtIiwiZ2V0Q2hlY2tzdW1PZkZpbGUiLCJ0d29DaGVja3N1bSIsImZpbGVQYXRocyIsIlByb21pc2UiLCJhbGwiLCJPYmplY3QiLCJlbnRyaWVzIiwiX2ZpbGVUeXBlIiwicGF0dGVybiIsImZsYXQiLCJzb3J0IiwiZmlsZUNoZWNrc3VtcyIsImZpbGVQYXRoIiwiY2hlY2tzdW0iLCJjaGVja3N1bUZpbGVQYXRoIiwiZ2V0Q2hlY2tzdW1GaWxlUGF0aCIsInByZXZpb3VzQ2hlY2tzdW1zIiwiSlNPTiIsInBhcnNlIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiY2hlY2tzdW1zIiwic3RyaW5naWZ5IiwicmVsYXRpdmUiLCJjb25zb2xlIiwibG9nIiwicmVzb2x2ZSIsInJlamVjdCIsImhhc2giLCJjcmVhdGVIYXNoIiwiaW5wdXQiLCJvbiIsImNodW5rIiwidXBkYXRlIiwiZGlnZXN0Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFpQyxTQUFTO0FBQ2pELE9BQU9DLFdBQVcsa0JBQWtCO0FBQ3BDLFNBQVNDLGdCQUFnQixRQUF1QixLQUFLO0FBQ3JELFNBQVNDLFFBQVEsRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ2xELE9BQU9DLFVBQVUsT0FBTztBQUN4QixTQUFTQyxPQUFPLFFBQVEsVUFBVTtBQUNsQyxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLFNBQVMsUUFBUSwwQkFBdUI7QUFDakQsU0FBU0MsTUFBTSxRQUFRLHVCQUFvQjtBQUUzQyxTQUFTQyxjQUFjLFFBQVEsb0JBQWlCO0FBQ2hELFNBQVNDLHFDQUFxQyxRQUFRLHFCQUFrQjtBQU94RTs7O0NBR0MsR0FDRCxPQUFPLGVBQWVDO0lBQ3BCLE1BQU1DLHNCQUFzQixNQUFNQztJQUNsQyxNQUFNQyxpQkFBaUIsTUFBTUM7SUFFN0IsTUFBTUMsU0FBU2hCLE1BQU1ZLHFCQUFxQkU7SUFDMUMsSUFBSUUsUUFBUTtRQUNWLE9BQU8sRUFBRTtJQUNYO0lBRUEsT0FBT1AsZUFBZUcscUJBQXFCRSxnQkFBZ0JULFNBQVNZLEdBQUcsQ0FBQyxDQUFDQyxJQUFNQSxFQUFFZCxJQUFJO0FBQ3ZGO0FBRUE7OztDQUdDLEdBQ0QsT0FBTyxlQUFlZTtJQUNwQixNQUFNUCxzQkFBc0IsTUFBTUM7SUFDbEMsTUFBTUMsaUJBQWlCLE1BQU1DO0lBRTdCLE1BQU1DLFNBQVNoQixNQUFNWSxxQkFBcUJFO0lBQzFDLElBQUlFLFFBQVE7UUFDVjtJQUNGO0lBRUEsTUFBTUksY0FBY1I7QUFDdEI7QUFFQTs7Ozs7O0NBTUMsR0FDRCxPQUFPLGVBQWVTLGFBQWFDLEdBQWEsRUFBRUMsR0FBYTtJQUM3RCxJQUFJLENBQUUsTUFBTWYsT0FBT2MsUUFBUyxDQUFFLE1BQU1kLE9BQU9lLE1BQU87UUFDaEQsT0FBTztJQUNUO0lBRUEsTUFBTUMsY0FBYyxNQUFNQyxrQkFBa0JIO0lBQzVDLE1BQU1JLGNBQWMsTUFBTUQsa0JBQWtCRjtJQUU1QyxPQUFPQyxnQkFBZ0JFO0FBQ3pCO0FBRUEsZUFBZWI7SUFDYixNQUFNYyxZQUFZLEFBQ2hCLENBQUEsTUFBTUMsUUFBUUMsR0FBRyxDQUNmQyxPQUFPQyxPQUFPLENBQUNyQix5Q0FBeUNPLEdBQUcsQ0FBQyxPQUFPLENBQUNlLFdBQVdDLFFBQVE7UUFDckYsT0FBTzFCLFVBQVUwQjtJQUNuQixHQUNGLEVBRUNDLElBQUksR0FDSkMsSUFBSTtJQUVQLE1BQU1DLGdCQUFnQixNQUFNUixRQUFRQyxHQUFHLENBQ3JDRixVQUFVVixHQUFHLENBQUMsT0FBT29CO1FBQ25CLE9BQU87WUFDTGpDLE1BQU1pQztZQUNOQyxVQUFVLE1BQU1iLGtCQUFrQlk7UUFDcEM7SUFDRjtJQUdGLE9BQU9EO0FBQ1Q7QUFFQSxlQUFlckI7SUFDYixNQUFNd0IsbUJBQW1CQztJQUN6QixJQUFJLENBQUUsTUFBTWhDLE9BQU8rQixtQkFBb0I7UUFDckMsT0FBTyxFQUFFO0lBQ1g7SUFFQSxNQUFNRSxvQkFBb0JDLEtBQUtDLEtBQUssQ0FBQyxNQUFNekMsU0FBU3FDLGtCQUFrQixVQUFVdEIsR0FBRyxDQUNqRixDQUFDQyxJQUFvRCxDQUFBO1lBQ25EZCxNQUFNQSxLQUFLd0MsSUFBSSxDQUFDdEMsT0FBT3VDLFdBQVcsRUFBRTNCLEVBQUVkLElBQUk7WUFDMUNrQyxVQUFVcEIsRUFBRW9CLFFBQVE7UUFDdEIsQ0FBQTtJQUVGLE9BQU9HO0FBQ1Q7QUFFQSxTQUFTRDtJQUNQLE9BQU9wQyxLQUFLd0MsSUFBSSxDQUFDdEMsT0FBT3VDLFdBQVcsRUFBRTtBQUN2QztBQUVBLGVBQWV6QixjQUFjMEIsU0FBNEI7SUFDdkQsTUFBTVAsbUJBQW1CQztJQUN6QixNQUFNckMsVUFDSm9DLGtCQUNBRyxLQUFLSyxTQUFTLENBQ1pELFVBQVU3QixHQUFHLENBQUMsQ0FBQ0MsSUFBTyxDQUFBO1lBQ3BCZCxNQUFNQSxLQUFLNEMsUUFBUSxDQUFDMUMsT0FBT3VDLFdBQVcsRUFBRTNCLEVBQUVkLElBQUk7WUFDOUNrQyxVQUFVcEIsRUFBRW9CLFFBQVE7UUFDdEIsQ0FBQSxJQUNBLE1BQ0EsSUFFRjtJQUVGVyxRQUFRQyxHQUFHLENBQUMsa0JBQWtCWDtBQUNoQztBQUVBLGVBQWVkLGtCQUFrQlksUUFBa0I7SUFDakQsT0FBTyxJQUFJVCxRQUFnQixDQUFDdUIsU0FBU0M7UUFDbkMsTUFBTUMsT0FBT3RELE9BQU91RCxVQUFVLENBQUM7UUFDL0IsTUFBTUMsUUFBUXRELGlCQUFpQm9DO1FBQy9Ca0IsTUFBTUMsRUFBRSxDQUFDLFNBQVNKO1FBQ2xCRyxNQUFNQyxFQUFFLENBQUMsUUFBUSxDQUFDQztZQUNoQkosS0FBS0ssTUFBTSxDQUFDRDtRQUNkO1FBQ0FGLE1BQU1DLEVBQUUsQ0FBQyxTQUFTO1lBQ2hCTCxRQUFRRSxLQUFLTSxNQUFNLENBQUM7UUFDdEI7SUFDRjtBQUNGIn0=
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY2hlY2tzdW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0bywgeyB0eXBlIEJpbmFyeUxpa2UgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgdHlwZSBQYXRoTGlrZSB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCwgQXBpUmVsYXRpdmVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuXG50eXBlIFBhdGhBbmRDaGVja3N1bSA9IHtcbiAgcGF0aDogQWJzb2x1dGVQYXRoO1xuICBjaGVja3N1bTogc3RyaW5nO1xufTtcblxuLyoqXG4gKiDssrTtgazshKwg7YyM7J287JeQIOyggOyepeuQnCDrgrTsmqnqs7wg7ZiE7J6sIOyLpOygnCDtjIzsnbzsnZgg7LK07YGs7ISs7J2EIOu5hOq1kO2VmOyXrCDrs4Dqsr3rkJwg7YyM7J287J2EIOywvuyKteuLiOuLpC5cbiAqIEByZXR1cm5zIOuzgOqyveuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCDsiqzrnpjsi5zroZwg7Iuc7J6R7ZWp64uI64ukLiDsmIjsi5w6IFwiL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgY29uc3QgY2FsY3VsYXRlZENoZWNrc3VtcyA9IGF3YWl0IGdldEN1cnJlbnRDaGVja3N1bXMoKTtcbiAgY29uc3Qgc2F2ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRQcmV2aW91c0NoZWNrc3VtcygpO1xuXG4gIGNvbnN0IGlzU2FtZSA9IGVxdWFsKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zKTtcbiAgaWYgKGlzU2FtZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBkaWZmZXJlbmNlV2l0aChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3VtcywgaXNFcXVhbCkubWFwKChyKSA9PiByLnBhdGgpO1xufVxuXG4vKipcbiAqIOyytO2BrOyErOydhCDqsLHsi6Dtlanri4jri6QuXG4gKiDtmITsnqwg7YyM7J2865Ok7J2YIOyytO2BrOyErOydhCDqs4TsgrDtlbTshJwg6rWs7ZWcIOuLpOydjCwg7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IOuLpOultOuptCDssrTtgazshKwg7YyM7J287J2EIOqwseyLoO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWxjdWxhdGVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0Q3VycmVudENoZWNrc3VtcygpO1xuICBjb25zdCBzYXZlZENoZWNrc3VtcyA9IGF3YWl0IGdldFByZXZpb3VzQ2hlY2tzdW1zKCk7XG5cbiAgY29uc3QgaXNTYW1lID0gZXF1YWwoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMpO1xuICBpZiAoaXNTYW1lKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgc2F2ZUNoZWNrc3VtcyhjYWxjdWxhdGVkQ2hlY2tzdW1zKTtcbn1cblxuZXhwb3J0IHR5cGUgRmlsZU9yRGF0YSA9XG4gIHwge1xuICAgICAgcGF0aDogUGF0aExpa2U7XG4gICAgfVxuICB8IHtcbiAgICAgIGRhdGE6IHN0cmluZztcbiAgICB9O1xuXG4vKipcbiAqIOuRkCDtjIzsnbzsnZgg64K07Jqp7J20IOqwmeydgOyngCDssrTtgazshKzsnLzroZwg67mE6rWQ7ZWp64uI64ukLlxuICog66eM7JW9IO2MjOydvOydtCDrkZgg7KSRIO2VmOuCmOudvOuPhCDsl4bri6TrqbQg67mE6rWQIOu2iOqwgOuhnCBmYWxzZSDrsJjtmZjtlanri4jri6QuXG4gKiBAcGFyYW0gb25lIO2MjOydvCDqsr3roZwg7Zi57J2AIOuNsOydtO2EsFxuICogQHBhcmFtIHR3byDtjIzsnbwg6rK966GcIO2YueydgCDrjbDsnbTthLBcbiAqIEByZXR1cm5zIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyZUZpbGVzU2FtZSguLi5maWxlczogRmlsZU9yRGF0YVtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNoZWNrc3Vtczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBpZiAoXCJwYXRoXCIgaW4gZmlsZSAmJiAhKGF3YWl0IGV4aXN0cyhmaWxlLnBhdGgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNoZWNrc3Vtcy5wdXNoKFxuICAgICAgXCJwYXRoXCIgaW4gZmlsZSA/IGF3YWl0IGdldENoZWNrc3VtT2ZGaWxlKGZpbGUucGF0aCkgOiBnZXRDaGVja3N1bU9mRGF0YShmaWxlLmRhdGEpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY2hlY2tzdW1zLmV2ZXJ5KFxuICAgIC8vIOuLpOydjCDssrTtgazshKzqs7wg67mE6rWQLCDrp4zslb0g66eI7KeA66eJIOyytO2BrOyErOydvCDrlYzripQg7LKrIOuyiOynuCDssrTtgazshKzqs7wg67mE6rWQXG4gICAgKGNoZWNrc3VtLCBpbmRleCkgPT4gY2hlY2tzdW0gPT09IGNoZWNrc3Vtc1tpbmRleCA9PT0gY2hlY2tzdW1zLmxlbmd0aCAtIDEgPyAwIDogaW5kZXggKyAxXSxcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENoZWNrc3VtcygpOiBQcm9taXNlPFBhdGhBbmRDaGVja3N1bVtdPiB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkubWFwKGFzeW5jIChbX2ZpbGVUeXBlLCBwYXR0ZXJuXSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2xvYkFzeW5jKHBhdHRlcm4pIGFzIFByb21pc2U8QWJzb2x1dGVQYXRoW10+O1xuICAgICAgfSksXG4gICAgKVxuICApXG4gICAgLmZsYXQoKVxuICAgIC5zb3J0KCk7XG5cbiAgY29uc3QgZmlsZUNoZWNrc3VtcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVQYXRocy5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgY2hlY2tzdW06IGF3YWl0IGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoKSxcbiAgICAgIH07XG4gICAgfSksXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVDaGVja3N1bXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByZXZpb3VzQ2hlY2tzdW1zKCk6IFByb21pc2U8UGF0aEFuZENoZWNrc3VtW10+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGNoZWNrc3VtRmlsZVBhdGgpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHByZXZpb3VzQ2hlY2tzdW1zID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShjaGVja3N1bUZpbGVQYXRoLCBcInV0Zi04XCIpKS5tYXAoXG4gICAgKHI6IHsgcGF0aDogQXBpUmVsYXRpdmVQYXRoOyBjaGVja3N1bTogc3RyaW5nIH0pID0+ICh7XG4gICAgICBwYXRoOiBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQ7IScIOydveydhCDrlYw6IEFQSSDsg4HrjIAg6rK966GcIOKGkiDsoIjrjIAg6rK966GcXG4gICAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgICB9KSxcbiAgKSBhcyBQYXRoQW5kQ2hlY2tzdW1bXTtcbiAgcmV0dXJuIHByZXZpb3VzQ2hlY2tzdW1zO1xufVxuXG5mdW5jdGlvbiBnZXRDaGVja3N1bUZpbGVQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gIHJldHVybiBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNvbmFtdS5sb2NrXCIpIGFzIEFic29sdXRlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUNoZWNrc3VtcyhjaGVja3N1bXM6IFBhdGhBbmRDaGVja3N1bVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNoZWNrc3VtRmlsZVBhdGggPSBnZXRDaGVja3N1bUZpbGVQYXRoKCk7XG4gIGF3YWl0IHdyaXRlRmlsZShcbiAgICBjaGVja3N1bUZpbGVQYXRoLFxuICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgY2hlY2tzdW1zLm1hcCgocikgPT4gKHtcbiAgICAgICAgcGF0aDogcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHIucGF0aCksIC8vIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l7ZWgIOuVjDog7KCI64yAIOqyveuhnCDihpIgQVBJIOyDgeuMgCDqsr3roZxcbiAgICAgICAgY2hlY2tzdW06IHIuY2hlY2tzdW0sXG4gICAgICB9KSksXG4gICAgICBudWxsLFxuICAgICAgMixcbiAgICApLFxuICAgIFwidXRmLThcIixcbiAgKTtcbiAgY29uc29sZS5sb2coXCJjaGVja3N1bSBzYXZlZFwiLCBjaGVja3N1bUZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hlY2tzdW1PZkRhdGEoZGF0YTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgaGFzaC51cGRhdGUoZGF0YSk7XG4gIHJldHVybiBoYXNoLmRpZ2VzdChcImhleFwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hlY2tzdW1PZkZpbGUoZmlsZVBhdGg6IFBhdGhMaWtlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTFcIik7XG4gICAgY29uc3QgaW5wdXQgPSBjcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKTtcbiAgICBpbnB1dC5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgaW5wdXQub24oXCJkYXRhXCIsIChjaHVuazogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoY2h1bmspO1xuICAgIH0pO1xuICAgIGlucHV0Lm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgcmVzb2x2ZShoYXNoLmRpZ2VzdChcImhleFwiKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbImNyeXB0byIsImVxdWFsIiwiY3JlYXRlUmVhZFN0cmVhbSIsInJlYWRGaWxlIiwid3JpdGVGaWxlIiwicGF0aCIsImlzRXF1YWwiLCJTb25hbXUiLCJnbG9iQXN5bmMiLCJleGlzdHMiLCJkaWZmZXJlbmNlV2l0aCIsImdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgiLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJjYWxjdWxhdGVkQ2hlY2tzdW1zIiwiZ2V0Q3VycmVudENoZWNrc3VtcyIsInNhdmVkQ2hlY2tzdW1zIiwiZ2V0UHJldmlvdXNDaGVja3N1bXMiLCJpc1NhbWUiLCJtYXAiLCJyIiwicmVuZXdDaGVja3N1bXMiLCJzYXZlQ2hlY2tzdW1zIiwiYXJlRmlsZXNTYW1lIiwiZmlsZXMiLCJjaGVja3N1bXMiLCJmaWxlIiwicHVzaCIsImdldENoZWNrc3VtT2ZGaWxlIiwiZ2V0Q2hlY2tzdW1PZkRhdGEiLCJkYXRhIiwiZXZlcnkiLCJjaGVja3N1bSIsImluZGV4IiwibGVuZ3RoIiwiZmlsZVBhdGhzIiwiUHJvbWlzZSIsImFsbCIsIk9iamVjdCIsImVudHJpZXMiLCJfZmlsZVR5cGUiLCJwYXR0ZXJuIiwiZmxhdCIsInNvcnQiLCJmaWxlQ2hlY2tzdW1zIiwiZmlsZVBhdGgiLCJjaGVja3N1bUZpbGVQYXRoIiwiZ2V0Q2hlY2tzdW1GaWxlUGF0aCIsInByZXZpb3VzQ2hlY2tzdW1zIiwiSlNPTiIsInBhcnNlIiwiam9pbiIsImFwaVJvb3RQYXRoIiwic3RyaW5naWZ5IiwicmVsYXRpdmUiLCJjb25zb2xlIiwibG9nIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJkaWdlc3QiLCJyZXNvbHZlIiwicmVqZWN0IiwiaW5wdXQiLCJvbiIsImNodW5rIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFpQyxTQUFTO0FBQ2pELE9BQU9DLFdBQVcsa0JBQWtCO0FBQ3BDLFNBQVNDLGdCQUFnQixRQUF1QixLQUFLO0FBQ3JELFNBQVNDLFFBQVEsRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ2xELE9BQU9DLFVBQVUsT0FBTztBQUN4QixTQUFTQyxPQUFPLFFBQVEsVUFBVTtB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
@@ -87,7 +87,12 @@ async function resolveRenderedTemplate(key, result) {
87
87
  const { target, path: filePath, body, importKeys, customHeaders } = result;
88
88
  // import 할 대상의 대상 path 추출
89
89
  const importDefs = importKeys.reduce((r, importKey)=>{
90
- const modulePath = EntityManager.getModulePath(importKey);
90
+ let modulePath = importKey;
91
+ try {
92
+ modulePath = EntityManager.getModulePath(importKey);
93
+ } catch (error) {
94
+ throw new Error(`[resolveRenderedTemplate:${key}] ${importKey} 모듈 경로 찾기 실패: ${error}`);
95
+ }
91
96
  let importPath = modulePath;
92
97
  if (modulePath.includes("/") || modulePath.includes(".")) {
93
98
  importPath = wrapIf(path.relative(path.dirname(filePath), modulePath), (p)=>[
@@ -158,4 +163,4 @@ async function writeCodeToPathEachTarget(pathAndCode) {
158
163
  }));
159
164
  }
160
165
 
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY29kZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlLCBUZW1wbGF0ZUtleSwgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBldmVyeUFzeW5jLCBmaWx0ZXJBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHdyYXBJZiB9IGZyb20gXCIuLi91dGlscy9sb2Rhc2gtYWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG4vKipcbiAqIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlZjqs6Ag7YyM7J2866GcIOyDneyEse2VqeuLiOuLpC5cbiAqIG92ZXJ3cml0ZSDsmLXshZjsnbQgZmFsc2Xsnbgg6rK97JqwLCDsnbTrr7gg7KG07J6s7ZWY64qUIO2MjOydvOydgCDqsbTrhIjrnIHri4jri6QuXG4gKiBAcGFyYW0ga2V5IC0g7YWc7ZSM66a/IO2CpCAo7JiIOiBcImVudGl0eVwiLCBcIm1vZGVsXCIsIFwic2VydmljZVwiIOuTsSlcbiAqIEBwYXJhbSB0ZW1wbGF0ZU9wdGlvbnMgLSDthZztlIzrpr8g66CM642U66eB7JeQIO2VhOyalO2VnCDsmLXshZhcbiAqIEBwYXJhbSBfZ2VuZXJhdGVPcHRpb25zIC0g7IOd7ISxIOyYteyFmCAob3ZlcndyaXRlIOyXrOu2gClcbiAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICBrZXk6IFQsXG4gIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCBnZW5lcmF0ZU9wdGlvbnMgPSB7XG4gICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAuLi5fZ2VuZXJhdGVPcHRpb25zLFxuICB9O1xuICBOYWl0ZS50KFwiZ2VuZXJhdGVUZW1wbGF0ZVwiLCB7IGtleSwgdGVtcGxhdGVPcHRpb25zLCBnZW5lcmF0ZU9wdGlvbnMgfSk7XG5cbiAgLy8g7YKkIGNoaWxkcmVuXG4gIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBba2V5XTtcblxuICAvLyDthZztlIzrpr8g66CM642UXG4gIGNvbnN0IHBhdGhBbmRDb2RlcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKS5mbGF0KCk7XG5cbiAgY29uc3QgZmlsdGVyZWRQYXRoQW5kQ29kZXM6IFBhdGhBbmRDb2RlW10gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChnZW5lcmF0ZU9wdGlvbnMub3ZlcndyaXRlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcGF0aEFuZENvZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgZmlsdGVyQXN5bmMocGF0aEFuZENvZGVzLCBhc3luYyAocGF0aEFuZENvZGUpID0+IHtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7U29uYW11LmFwcFJvb3RQYXRofS8ke3BhdGhBbmRDb2RlLnBhdGh9YDtcbiAgICAgICAgY29uc3QgZHN0RmlsZVBhdGhzID0gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4gZmlsZVBhdGgucmVwbGFjZShcIi86dGFyZ2V0L1wiLCBgLyR7dGFyZ2V0fS9gKSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBldmVyeUFzeW5jKGRzdEZpbGVQYXRocywgYXN5bmMgKGRzdFBhdGgpID0+ICEoYXdhaXQgZXhpc3RzKGRzdFBhdGgpKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKGZpbHRlcmVkUGF0aEFuZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uKFwi7J2066+4IOqyveuhnOyXkCDrqqjrk6Ag7YyM7J287J20IOyhtOyerO2VqeuLiOuLpC5cIik7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRQYXRoQW5kQ29kZXMubWFwKChwYXRoQW5kQ29kZSkgPT4gd3JpdGVDb2RlVG9QYXRoRWFjaFRhcmdldChwYXRoQW5kQ29kZSkpLFxuICAgIClcbiAgKS5mbGF0KCk7XG59XG5cbi8qKlxuICog7YWc7ZSM66a/7J2EIOugjOuNlOunge2VmOyXrCBQYXRoQW5kQ29kZSDqsJ3ssrTrpbwg67CY7ZmY7ZWp64uI64ukLlxuICog7YyM7J2866GcIOyTsOyngCDslYrqs6Ag66mU66qo66as7IOB7JeQ7ISc66eMIOugjOuNlOunge2VqeuLiOuLpC5cbiAqIEBwYXJhbSBrZXkgLSDthZztlIzrpr8g7YKkXG4gKiBAcGFyYW0gb3B0aW9ucyAtIO2FnO2UjOumvyDroIzrjZTrp4Eg7Ji17IWYXG4gKiBAcmV0dXJucyDqsr3roZzsmYAg7L2U65OcIOyMjeydmCDrsLDsl7RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICBrZXk6IFQsXG4gIG9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbik6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICBOYWl0ZS50KFwicmVuZGVyVGVtcGxhdGVcIiwgeyBrZXksIG9wdGlvbnMgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG5cbiAgY29uc3QgcmVuZGVyZWQgPSBhd2FpdCB0ZW1wbGF0ZS5yZW5kZXIob3B0aW9ucyk7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGUoa2V5LCByZW5kZXJlZCk7XG5cbiAgbGV0IHByZVRlbXBsYXRlUmVzb2x2ZWQ6IFBhdGhBbmRDb2RlW10gPSBbXTtcbiAgaWYgKHJlbmRlcmVkLnByZVRlbXBsYXRlcykge1xuICAgIHByZVRlbXBsYXRlUmVzb2x2ZWQgPSAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmVuZGVyZWQucHJlVGVtcGxhdGVzLm1hcCgoeyBrZXksIG9wdGlvbnMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiByZW5kZXJUZW1wbGF0ZShrZXksIG9wdGlvbnMpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzb2x2ZWQsIC4uLnByZVRlbXBsYXRlUmVzb2x2ZWRdO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZShcbiAga2V5OiBUZW1wbGF0ZUtleSxcbiAgcmVzdWx0OiBSZW5kZXJlZFRlbXBsYXRlLFxuKTogUHJvbWlzZTxQYXRoQW5kQ29kZT4ge1xuICBOYWl0ZS50KGByZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZSR7a2V5fWAsIHsga2V5LCByZXN1bHQgfSk7XG5cbiAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGZpbGVQYXRoLCBib2R5LCBpbXBvcnRLZXlzLCBjdXN0b21IZWFkZXJzIH0gPSByZXN1bHQ7XG5cbiAgLy8gaW1wb3J0IO2VoCDrjIDsg4HsnZgg64yA7IOBIHBhdGgg7LaU7LacXG4gIGNvbnN0IGltcG9ydERlZnMgPSBpbXBvcnRLZXlzXG4gICAgLnJlZHVjZShcbiAgICAgIChyLCBpbXBvcnRLZXkpID0+IHtcbiAgICAgICAgY29uc3QgbW9kdWxlUGF0aCA9IEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aChpbXBvcnRLZXkpO1xuICAgICAgICBsZXQgaW1wb3J0UGF0aCA9IG1vZHVsZVBhdGg7XG4gICAgICAgIGlmIChtb2R1bGVQYXRoLmluY2x1ZGVzKFwiL1wiKSB8fCBtb2R1bGVQYXRoLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIGltcG9ydFBhdGggPSB3cmFwSWYocGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCBtb2R1bGVQYXRoKSwgKHApID0+IFtcbiAgICAgICAgICAgIHAuc3RhcnRzV2l0aChcIi5cIikgPT09IGZhbHNlLFxuICAgICAgICAgICAgYC4vJHtwfWAsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDqsJnsnYAg7YyM7J287JeQ7IScIGltcG9ydCDtlZjripQg6rK97JqwIGtleXMg66GcIOuCmOyXtCDsspjrpqxcbiAgICAgICAgY29uc3QgZXhpc3RzT25lID0gci5maW5kKChpbXBvcnREZWYpID0+IGltcG9ydERlZi5mcm9tID09PSBpbXBvcnRQYXRoKTtcbiAgICAgICAgaWYgKGV4aXN0c09uZSkge1xuICAgICAgICAgIGV4aXN0c09uZS5rZXlzID0gdW5pcXVlKGV4aXN0c09uZS5rZXlzLmNvbmNhdChpbXBvcnRLZXkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByLnB1c2goe1xuICAgICAgICAgICAga2V5czogW2ltcG9ydEtleV0sXG4gICAgICAgICAgICBmcm9tOiBpbXBvcnRQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIFtdIGFzIHtcbiAgICAgICAga2V5czogc3RyaW5nW107XG4gICAgICAgIGZyb206IHN0cmluZztcbiAgICAgIH1bXSxcbiAgICApXG4gICAgLy8g7IWA7ZSEIOywuOyhsCDrsKnsp4BcbiAgICAuZmlsdGVyKChpbXBvcnREZWYpID0+IGZpbGVQYXRoLmVuZHNXaXRoKGAke2ltcG9ydERlZi5mcm9tLnJlcGxhY2UoXCIuL1wiLCBcIlwiKX0udHNgKSA9PT0gZmFsc2UpO1xuXG4gIC8vIOy7pOyKpO2FgCDtl6TrjZQg7Y+s7ZWo7ZWY7JesIO2XpOuNlCDsg53shLFcbiAgY29uc3QgaGVhZGVyID0gW1xuICAgIC4uLihjdXN0b21IZWFkZXJzID8/IFtdKSxcbiAgICAuLi5pbXBvcnREZWZzLm1hcChcbiAgICAgIChpbXBvcnREZWYpID0+IGBpbXBvcnQgeyAke2ltcG9ydERlZi5rZXlzLmpvaW4oXCIsIFwiKX0gfSBmcm9tICcke2ltcG9ydERlZi5mcm9tfSdgLFxuICAgICksXG4gIF0uam9pbihcIlxcblwiKTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChrZXkgPT09IFwiZ2VuZXJhdGVkX2h0dHBcIikge1xuICAgICAgcmV0dXJuIFtoZWFkZXIsIGJvZHldLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIE5haXRlLnQoXCJyZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZTpiZWZvcmVGb3JtYXRcIiwgeyBrZXksIGhlYWRlciwgYm9keSB9KTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGZvcm1hdENvZGUoXG4gICAgICAgIFtoZWFkZXIsIGJvZHldLmpvaW4oXCJcXG5cXG5cIiksXG4gICAgICAgIGtleSA9PT0gXCJlbnRpdHlcIiA/IFwianNvblwiIDogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtmaWxlUGF0aH1gLFxuICAgICAgKTtcbiAgICAgIE5haXRlLnQoYHJlc29sdmVSZW5kZXJlZFRlbXBsYXRlOmZvcm1hdHRlZDoke2tleX1gLCBmb3JtYXR0ZWQpO1xuICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBgJHt0YXJnZXR9LyR7ZmlsZVBhdGh9YCxcbiAgICBjb2RlOiBmb3JtYXR0ZWQsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQocGF0aEFuZENvZGU6IFBhdGhBbmRDb2RlKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgY29uc3QgeyBhcHBSb290UGF0aCB9ID0gU29uYW11O1xuICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtwYXRoQW5kQ29kZS5wYXRofWAgYXMgQWJzb2x1dGVQYXRoO1xuXG4gIGNvbnN0IGRzdEZpbGVQYXRocyA9IHVuaXF1ZShcbiAgICB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBmaWxlUGF0aC5yZXBsYWNlKFwiLzp0YXJnZXQvXCIsIGAvJHt0YXJnZXR9L2ApKSBhcyBBYnNvbHV0ZVBhdGhbXSxcbiAgKTtcbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRzdEZpbGVQYXRocy5tYXAoYXN5bmMgKGRzdEZpbGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0RmlsZVBhdGgpO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZHN0RmlsZVBhdGgsIHBhdGhBbmRDb2RlLmNvZGUpO1xuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJHZW5lcmF0ZWQ6IFwiKSArIGNoYWxrLmJsdWUoYCR7ZHN0RmlsZVBhdGgucmVwbGFjZShgJHthcHBSb290UGF0aH0vYCwgXCJcIil9YCksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gZHN0RmlsZVBhdGg7XG4gICAgfSksXG4gICk7XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJta2RpciIsIndyaXRlRmlsZSIsInBhdGgiLCJ1bmlxdWUiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbiIsIk5haXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiZXZlcnlBc3luYyIsImZpbHRlckFzeW5jIiwiaXNUZXN0IiwiZm9ybWF0Q29kZSIsImV4aXN0cyIsIndyYXBJZiIsImdlbmVyYXRlVGVtcGxhdGUiLCJrZXkiLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIiwiZ2VuZXJhdGVPcHRpb25zIiwib3ZlcndyaXRlIiwidCIsImtleXMiLCJwYXRoQW5kQ29kZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicmVuZGVyVGVtcGxhdGUiLCJmbGF0IiwiZmlsdGVyZWRQYXRoQW5kQ29kZXMiLCJwYXRoQW5kQ29kZSIsInRhcmdldHMiLCJjb25maWciLCJzeW5jIiwiZmlsZVBhdGgiLCJhcHBSb290UGF0aCIsImRzdEZpbGVQYXRocyIsInRhcmdldCIsInJlcGxhY2UiLCJkc3RQYXRoIiwibGVuZ3RoIiwid3JpdGVDb2RlVG9QYXRoRWFjaFRhcmdldCIsIm9wdGlvbnMiLCJ0ZW1wbGF0ZSIsImdldCIsInJlbmRlcmVkIiwicmVuZGVyIiwicmVzb2x2ZWQiLCJyZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZSIsInByZVRlbXBsYXRlUmVzb2x2ZWQiLCJwcmVUZW1wbGF0ZXMiLCJyZXN1bHQiLCJib2R5IiwiaW1wb3J0S2V5cyIsImN1c3RvbUhlYWRlcnMiLCJpbXBvcnREZWZzIiwicmVkdWNlIiwiciIsImltcG9ydEtleSIsIm1vZHVsZVBhdGgiLCJnZXRNb2R1bGVQYXRoIiwiaW1wb3J0UGF0aCIsImluY2x1ZGVzIiwicmVsYXRpdmUiLCJkaXJuYW1lIiwicCIsInN0YXJ0c1dpdGgiLCJleGlzdHNPbmUiLCJmaW5kIiwiaW1wb3J0RGVmIiwiZnJvbSIsImNvbmNhdCIsInB1c2giLCJmaWx0ZXIiLCJlbmRzV2l0aCIsImhlYWRlciIsImpvaW4iLCJmb3JtYXR0ZWQiLCJjb2RlIiwiZHN0RmlsZVBhdGgiLCJkaXIiLCJyZWN1cnNpdmUiLCJjb25zb2xlIiwibG9nIiwiYm9sZCIsImJsdWUiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxLQUFLLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUMvQyxPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsTUFBTSxRQUFRLFVBQVU7QUFDakMsU0FB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
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY29kZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlLCBUZW1wbGF0ZUtleSwgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBldmVyeUFzeW5jLCBmaWx0ZXJBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHdyYXBJZiB9IGZyb20gXCIuLi91dGlscy9sb2Rhc2gtYWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG4vKipcbiAqIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlZjqs6Ag7YyM7J2866GcIOyDneyEse2VqeuLiOuLpC5cbiAqIG92ZXJ3cml0ZSDsmLXshZjsnbQgZmFsc2Xsnbgg6rK97JqwLCDsnbTrr7gg7KG07J6s7ZWY64qUIO2MjOydvOydgCDqsbTrhIjrnIHri4jri6QuXG4gKiBAcGFyYW0ga2V5IC0g7YWc7ZSM66a/IO2CpCAo7JiIOiBcImVudGl0eVwiLCBcIm1vZGVsXCIsIFwic2VydmljZVwiIOuTsSlcbiAqIEBwYXJhbSB0ZW1wbGF0ZU9wdGlvbnMgLSDthZztlIzrpr8g66CM642U66eB7JeQIO2VhOyalO2VnCDsmLXshZhcbiAqIEBwYXJhbSBfZ2VuZXJhdGVPcHRpb25zIC0g7IOd7ISxIOyYteyFmCAob3ZlcndyaXRlIOyXrOu2gClcbiAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICBrZXk6IFQsXG4gIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCBnZW5lcmF0ZU9wdGlvbnMgPSB7XG4gICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAuLi5fZ2VuZXJhdGVPcHRpb25zLFxuICB9O1xuICBOYWl0ZS50KFwiZ2VuZXJhdGVUZW1wbGF0ZVwiLCB7IGtleSwgdGVtcGxhdGVPcHRpb25zLCBnZW5lcmF0ZU9wdGlvbnMgfSk7XG5cbiAgLy8g7YKkIGNoaWxkcmVuXG4gIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBba2V5XTtcblxuICAvLyDthZztlIzrpr8g66CM642UXG4gIGNvbnN0IHBhdGhBbmRDb2RlcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKS5mbGF0KCk7XG5cbiAgY29uc3QgZmlsdGVyZWRQYXRoQW5kQ29kZXM6IFBhdGhBbmRDb2RlW10gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChnZW5lcmF0ZU9wdGlvbnMub3ZlcndyaXRlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcGF0aEFuZENvZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgZmlsdGVyQXN5bmMocGF0aEFuZENvZGVzLCBhc3luYyAocGF0aEFuZENvZGUpID0+IHtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7U29uYW11LmFwcFJvb3RQYXRofS8ke3BhdGhBbmRDb2RlLnBhdGh9YDtcbiAgICAgICAgY29uc3QgZHN0RmlsZVBhdGhzID0gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4gZmlsZVBhdGgucmVwbGFjZShcIi86dGFyZ2V0L1wiLCBgLyR7dGFyZ2V0fS9gKSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBldmVyeUFzeW5jKGRzdEZpbGVQYXRocywgYXN5bmMgKGRzdFBhdGgpID0+ICEoYXdhaXQgZXhpc3RzKGRzdFBhdGgpKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKGZpbHRlcmVkUGF0aEFuZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uKFwi7J2066+4IOqyveuhnOyXkCDrqqjrk6Ag7YyM7J287J20IOyhtOyerO2VqeuLiOuLpC5cIik7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRQYXRoQW5kQ29kZXMubWFwKChwYXRoQW5kQ29kZSkgPT4gd3JpdGVDb2RlVG9QYXRoRWFjaFRhcmdldChwYXRoQW5kQ29kZSkpLFxuICAgIClcbiAgKS5mbGF0KCk7XG59XG5cbi8qKlxuICog7YWc7ZSM66a/7J2EIOugjOuNlOunge2VmOyXrCBQYXRoQW5kQ29kZSDqsJ3ssrTrpbwg67CY7ZmY7ZWp64uI64ukLlxuICog7YyM7J2866GcIOyTsOyngCDslYrqs6Ag66mU66qo66as7IOB7JeQ7ISc66eMIOugjOuNlOunge2VqeuLiOuLpC5cbiAqIEBwYXJhbSBrZXkgLSDthZztlIzrpr8g7YKkXG4gKiBAcGFyYW0gb3B0aW9ucyAtIO2FnO2UjOumvyDroIzrjZTrp4Eg7Ji17IWYXG4gKiBAcmV0dXJucyDqsr3roZzsmYAg7L2U65OcIOyMjeydmCDrsLDsl7RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICBrZXk6IFQsXG4gIG9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbik6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICBOYWl0ZS50KFwicmVuZGVyVGVtcGxhdGVcIiwgeyBrZXksIG9wdGlvbnMgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG5cbiAgY29uc3QgcmVuZGVyZWQgPSBhd2FpdCB0ZW1wbGF0ZS5yZW5kZXIob3B0aW9ucyk7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGUoa2V5LCByZW5kZXJlZCk7XG5cbiAgbGV0IHByZVRlbXBsYXRlUmVzb2x2ZWQ6IFBhdGhBbmRDb2RlW10gPSBbXTtcbiAgaWYgKHJlbmRlcmVkLnByZVRlbXBsYXRlcykge1xuICAgIHByZVRlbXBsYXRlUmVzb2x2ZWQgPSAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmVuZGVyZWQucHJlVGVtcGxhdGVzLm1hcCgoeyBrZXksIG9wdGlvbnMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiByZW5kZXJUZW1wbGF0ZShrZXksIG9wdGlvbnMpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzb2x2ZWQsIC4uLnByZVRlbXBsYXRlUmVzb2x2ZWRdO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZShcbiAga2V5OiBUZW1wbGF0ZUtleSxcbiAgcmVzdWx0OiBSZW5kZXJlZFRlbXBsYXRlLFxuKTogUHJvbWlzZTxQYXRoQW5kQ29kZT4ge1xuICBOYWl0ZS50KGByZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZSR7a2V5fWAsIHsga2V5LCByZXN1bHQgfSk7XG5cbiAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGZpbGVQYXRoLCBib2R5LCBpbXBvcnRLZXlzLCBjdXN0b21IZWFkZXJzIH0gPSByZXN1bHQ7XG5cbiAgLy8gaW1wb3J0IO2VoCDrjIDsg4HsnZgg64yA7IOBIHBhdGgg7LaU7LacXG4gIGNvbnN0IGltcG9ydERlZnMgPSBpbXBvcnRLZXlzXG4gICAgLnJlZHVjZShcbiAgICAgIChyLCBpbXBvcnRLZXkpID0+IHtcbiAgICAgICAgbGV0IG1vZHVsZVBhdGggPSBpbXBvcnRLZXk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbW9kdWxlUGF0aCA9IEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aChpbXBvcnRLZXkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGU6JHtrZXl9XSAke2ltcG9ydEtleX0g66qo65OIIOqyveuhnCDssL7quLAg7Iuk7YyoOiAke2Vycm9yfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW1wb3J0UGF0aCA9IG1vZHVsZVBhdGg7XG4gICAgICAgIGlmIChtb2R1bGVQYXRoLmluY2x1ZGVzKFwiL1wiKSB8fCBtb2R1bGVQYXRoLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIGltcG9ydFBhdGggPSB3cmFwSWYocGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCBtb2R1bGVQYXRoKSwgKHApID0+IFtcbiAgICAgICAgICAgIHAuc3RhcnRzV2l0aChcIi5cIikgPT09IGZhbHNlLFxuICAgICAgICAgICAgYC4vJHtwfWAsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDqsJnsnYAg7YyM7J287JeQ7IScIGltcG9ydCDtlZjripQg6rK97JqwIGtleXMg66GcIOuCmOyXtCDsspjrpqxcbiAgICAgICAgY29uc3QgZXhpc3RzT25lID0gci5maW5kKChpbXBvcnREZWYpID0+IGltcG9ydERlZi5mcm9tID09PSBpbXBvcnRQYXRoKTtcbiAgICAgICAgaWYgKGV4aXN0c09uZSkge1xuICAgICAgICAgIGV4aXN0c09uZS5rZXlzID0gdW5pcXVlKGV4aXN0c09uZS5rZXlzLmNvbmNhdChpbXBvcnRLZXkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByLnB1c2goe1xuICAgICAgICAgICAga2V5czogW2ltcG9ydEtleV0sXG4gICAgICAgICAgICBmcm9tOiBpbXBvcnRQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIFtdIGFzIHtcbiAgICAgICAga2V5czogc3RyaW5nW107XG4gICAgICAgIGZyb206IHN0cmluZztcbiAgICAgIH1bXSxcbiAgICApXG4gICAgLy8g7IWA7ZSEIOywuOyhsCDrsKnsp4BcbiAgICAuZmlsdGVyKChpbXBvcnREZWYpID0+IGZpbGVQYXRoLmVuZHNXaXRoKGAke2ltcG9ydERlZi5mcm9tLnJlcGxhY2UoXCIuL1wiLCBcIlwiKX0udHNgKSA9PT0gZmFsc2UpO1xuXG4gIC8vIOy7pOyKpO2FgCDtl6TrjZQg7Y+s7ZWo7ZWY7JesIO2XpOuNlCDsg53shLFcbiAgY29uc3QgaGVhZGVyID0gW1xuICAgIC4uLihjdXN0b21IZWFkZXJzID8/IFtdKSxcbiAgICAuLi5pbXBvcnREZWZzLm1hcChcbiAgICAgIChpbXBvcnREZWYpID0+IGBpbXBvcnQgeyAke2ltcG9ydERlZi5rZXlzLmpvaW4oXCIsIFwiKX0gfSBmcm9tICcke2ltcG9ydERlZi5mcm9tfSdgLFxuICAgICksXG4gIF0uam9pbihcIlxcblwiKTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChrZXkgPT09IFwiZ2VuZXJhdGVkX2h0dHBcIikge1xuICAgICAgcmV0dXJuIFtoZWFkZXIsIGJvZHldLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIE5haXRlLnQoXCJyZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZTpiZWZvcmVGb3JtYXRcIiwgeyBrZXksIGhlYWRlciwgYm9keSB9KTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGZvcm1hdENvZGUoXG4gICAgICAgIFtoZWFkZXIsIGJvZHldLmpvaW4oXCJcXG5cXG5cIiksXG4gICAgICAgIGtleSA9PT0gXCJlbnRpdHlcIiA/IFwianNvblwiIDogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtmaWxlUGF0aH1gLFxuICAgICAgKTtcbiAgICAgIE5haXRlLnQoYHJlc29sdmVSZW5kZXJlZFRlbXBsYXRlOmZvcm1hdHRlZDoke2tleX1gLCBmb3JtYXR0ZWQpO1xuICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBgJHt0YXJnZXR9LyR7ZmlsZVBhdGh9YCxcbiAgICBjb2RlOiBmb3JtYXR0ZWQsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQocGF0aEFuZENvZGU6IFBhdGhBbmRDb2RlKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgY29uc3QgeyBhcHBSb290UGF0aCB9ID0gU29uYW11O1xuICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtwYXRoQW5kQ29kZS5wYXRofWAgYXMgQWJzb2x1dGVQYXRoO1xuXG4gIGNvbnN0IGRzdEZpbGVQYXRocyA9IHVuaXF1ZShcbiAgICB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBmaWxlUGF0aC5yZXBsYWNlKFwiLzp0YXJnZXQvXCIsIGAvJHt0YXJnZXR9L2ApKSBhcyBBYnNvbHV0ZVBhdGhbXSxcbiAgKTtcbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRzdEZpbGVQYXRocy5tYXAoYXN5bmMgKGRzdEZpbGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0RmlsZVBhdGgpO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZHN0RmlsZVBhdGgsIHBhdGhBbmRDb2RlLmNvZGUpO1xuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJHZW5lcmF0ZWQ6IFwiKSArIGNoYWxrLmJsdWUoYCR7ZHN0RmlsZVBhdGgucmVwbGFjZShgJHthcHBSb290UGF0aH0vYCwgXCJcIil9YCksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gZHN0RmlsZVBhdGg7XG4gICAgfSksXG4gICk7XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJta2RpciIsIndyaXRlRmlsZSIsInBhdGgiLCJ1bmlxdWUiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbiIsIk5haXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiZXZlcnlBc3luYyIsImZpbHRlckFzeW5jIiwiaXNUZXN0IiwiZm9ybWF0Q29kZSIsImV4aXN0cyIsIndyYXBJZiIsImdlbmVyYXRlVGVtcGxhdGUiLCJrZXkiLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIiwiZ2VuZXJhdGVPcHRpb25zIiwib3ZlcndyaXRlIiwidCIsImtleXMiLCJwYXRoQW5kQ29kZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicmVuZGVyVGVtcGxhdGUiLCJmbGF0IiwiZmlsdGVyZWRQYXRoQW5kQ29kZXMiLCJwYXRoQW5kQ29kZSIsInRhcmdldHMiLCJjb25maWciLCJzeW5jIiwiZmlsZVBhdGgiLCJhcHBSb290UGF0aCIsImRzdEZpbGVQYXRocyIsInRhcmdldCIsInJlcGxhY2UiLCJkc3RQYXRoIiwibGVuZ3RoIiwid3JpdGVDb2RlVG9QYXRoRWFjaFRhcmdldCIsIm9wdGlvbnMiLCJ0ZW1wbGF0ZSIsImdldCIsInJlbmRlcmVkIiwicmVuZGVyIiwicmVzb2x2ZWQiLCJyZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZSIsInByZVRlbXBsYXRlUmVzb2x2ZWQiLCJwcmVUZW1wbGF0ZXMiLCJyZXN1bHQiLCJib2R5IiwiaW1wb3J0S2V5cyIsImN1c3RvbUhlYWRlcnMiLCJpbXBvcnREZWZzIiwicmVkdWNlIiwiciIsImltcG9ydEtleSIsIm1vZHVsZVBhdGgiLCJnZXRNb2R1bGVQYXRoIiwiZXJyb3IiLCJFcnJvciIsImltcG9ydFBhdGgiLCJpbmNsdWRlcyIsInJlbGF0aXZlIiwiZGlybmFtZSIsInAiLCJzdGFydHNXaXRoIiwiZXhpc3RzT25lIiwiZmluZCIsImltcG9ydERlZiIsImZyb20iLCJjb25jYXQiLCJwdXNoIiwiZmlsdGVyIiwiZW5kc1dpdGgiLCJoZWFkZXIiLCJqb2luIiwiZm9ybWF0dGVkIiwiY29kZSIsImRzdEZpbGVQYXRoIiwiZGlyIiwicmVjdXJzaXZlIiwiY29uc29sZSIsImxvZyIsImJvbGQiLCJibHVlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsS0FBSyxFQUFFQyxTQUFTLFFBQVEsbUJBQWM7QUFDL0MsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLE1BQU0sUUFBUSxVQUFVO0FBQ2pDLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyx5QkFBeUIsUUFBUSxpQ0FBOEI7QUFDeEUsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQUV2QyxTQUFTQyxlQUFlLFFBQVEsa0NBQStCO0FBRS9ELFNBQVNDLFVBQVUsRUFBRUMsV0FBVyxRQUFRLDBCQUF1QjtBQUMvRCxTQUFTQyxNQUFNLFFBQVEseUJBQXNCO0FBQzdDLFNBQVNDLFVBQVUsUUFBUSx3QkFBcUI7QUFDaEQsU0FBU0MsTUFBTSxRQUFRLHVCQUFvQjtBQUMzQyxTQUFTQyxNQUFNLFFBQVEsMEJBQXVCO0FBRzlDOzs7Ozs7O0NBT0MsR0FDRCxPQUFPLGVBQWVDLGlCQUNwQkMsR0FBTSxFQUNOQyxlQUFtQyxFQUNuQ0MsZ0JBQWtDO0lBRWxDLE1BQU1DLGtCQUFrQjtRQUN0QkMsV0FBVztRQUNYLEdBQUdGLGdCQUFnQjtJQUNyQjtJQUNBWCxNQUFNYyxDQUFDLENBQUMsb0JBQW9CO1FBQUVMO1FBQUtDO1FBQWlCRTtJQUFnQjtJQUVwRSxhQUFhO0lBQ2IsTUFBTUcsT0FBc0I7UUFBQ047S0FBSTtJQUVqQyxTQUFTO0lBQ1QsTUFBTU8sZUFBZSxBQUNuQixDQUFBLE1BQU1DLFFBQVFDLEdBQUcsQ0FDZkgsS0FBS0ksR0FBRyxDQUFDLE9BQU9WO1FBQ2QsT0FBTyxNQUFNVyxlQUFlWCxLQUFLQztJQUNuQyxHQUNGLEVBQ0FXLElBQUk7SUFFTixNQUFN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
@@ -52,18 +52,18 @@ export declare class Syncer {
52
52
  handleModelOrFrameChange(diffGroups: DiffGroups): Promise<void>;
53
53
  actionSyncConfig(): Promise<void>;
54
54
  /**
55
- * sonamu.generated.ts와 sonamu.generated.sso.ts를 생성합니다.
56
- * @returns 생성된 파일 경로 배열.
57
- */
58
- actionGenerateSchemas(): Promise<AbsolutePath[]>;
59
- /**
60
- * *.service.ts를 생성합니다.
55
+ * services.generated.ts를 생성합니다.
61
56
  * @param paramsArray
62
57
  * @returns 생성된 파일 경로 배열.
63
58
  */
64
59
  actionGenerateServices(paramsArray: {
65
60
  namesRecord: EntityNamesRecord;
66
61
  }[]): Promise<string[]>;
62
+ /**
63
+ * sonamu.generated.ts와 sonamu.generated.sso.ts를 생성합니다.
64
+ * @returns 생성된 파일 경로 배열.
65
+ */
66
+ actionGenerateSchemas(): Promise<AbsolutePath[]>;
67
67
  /**
68
68
  * sonamu.generated.http를 생성합니다.
69
69
  * @returns 생성된 파일 경로.