sonamu 0.9.4 → 0.9.6

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 (171) hide show
  1. package/dist/ai/providers/rtzr/utils.js +2 -2
  2. package/dist/api/config.d.ts +13 -2
  3. package/dist/api/config.d.ts.map +1 -1
  4. package/dist/api/config.js +1 -1
  5. package/dist/api/context.d.ts +17 -7
  6. package/dist/api/context.d.ts.map +1 -1
  7. package/dist/api/context.js +1 -1
  8. package/dist/api/decorators.d.ts +18 -0
  9. package/dist/api/decorators.d.ts.map +1 -1
  10. package/dist/api/decorators.js +54 -3
  11. package/dist/api/index.js +8 -3
  12. package/dist/api/sonamu.d.ts +24 -9
  13. package/dist/api/sonamu.d.ts.map +1 -1
  14. package/dist/api/sonamu.js +365 -79
  15. package/dist/api/websocket-helpers.d.ts +24 -0
  16. package/dist/api/websocket-helpers.d.ts.map +1 -0
  17. package/dist/api/websocket-helpers.js +77 -0
  18. package/dist/bin/cli.js +12 -4
  19. package/dist/database/upsert-builder.js +4 -4
  20. package/dist/dict/sonamu-dictionary.js +6 -6
  21. package/dist/entity/entity-manager.js +1 -1
  22. package/dist/entity/entity.js +3 -3
  23. package/dist/index.d.ts +6 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +16 -4
  26. package/dist/migration/code-generation.d.ts.map +1 -1
  27. package/dist/migration/code-generation.js +8 -9
  28. package/dist/stream/index.d.ts +6 -0
  29. package/dist/stream/index.d.ts.map +1 -1
  30. package/dist/stream/index.js +13 -2
  31. package/dist/stream/ws-audience-resolver.d.ts +15 -0
  32. package/dist/stream/ws-audience-resolver.d.ts.map +1 -0
  33. package/dist/stream/ws-audience-resolver.js +31 -0
  34. package/dist/stream/ws-audience.d.ts +28 -0
  35. package/dist/stream/ws-audience.d.ts.map +1 -0
  36. package/dist/stream/ws-audience.js +46 -0
  37. package/dist/stream/ws-cluster-bus.d.ts +23 -0
  38. package/dist/stream/ws-cluster-bus.d.ts.map +1 -0
  39. package/dist/stream/ws-cluster-bus.js +18 -0
  40. package/dist/stream/ws-core.d.ts +15 -0
  41. package/dist/stream/ws-core.d.ts.map +1 -0
  42. package/dist/stream/ws-core.js +1 -0
  43. package/dist/stream/ws-delivery.d.ts +24 -0
  44. package/dist/stream/ws-delivery.d.ts.map +1 -0
  45. package/dist/stream/ws-delivery.js +103 -0
  46. package/dist/stream/ws-local-connection-store.d.ts +10 -0
  47. package/dist/stream/ws-local-connection-store.d.ts.map +1 -0
  48. package/dist/stream/ws-local-connection-store.js +44 -0
  49. package/dist/stream/ws-presence-store.d.ts +61 -0
  50. package/dist/stream/ws-presence-store.d.ts.map +1 -0
  51. package/dist/stream/ws-presence-store.js +236 -0
  52. package/dist/stream/ws-registry.d.ts +42 -0
  53. package/dist/stream/ws-registry.d.ts.map +1 -0
  54. package/dist/stream/ws-registry.js +108 -0
  55. package/dist/stream/ws.d.ts +52 -0
  56. package/dist/stream/ws.d.ts.map +1 -0
  57. package/dist/stream/ws.js +397 -0
  58. package/dist/syncer/api-parser.d.ts.map +1 -1
  59. package/dist/syncer/api-parser.js +72 -2
  60. package/dist/syncer/checksum.d.ts.map +1 -1
  61. package/dist/syncer/checksum.js +13 -12
  62. package/dist/syncer/code-generator.d.ts.map +1 -1
  63. package/dist/syncer/code-generator.js +7 -4
  64. package/dist/syncer/event-batcher.d.ts +27 -0
  65. package/dist/syncer/event-batcher.d.ts.map +1 -0
  66. package/dist/syncer/event-batcher.js +69 -0
  67. package/dist/syncer/file-patterns.d.ts +48 -26
  68. package/dist/syncer/file-patterns.d.ts.map +1 -1
  69. package/dist/syncer/file-patterns.js +71 -23
  70. package/dist/syncer/file-tracking.d.ts +13 -0
  71. package/dist/syncer/file-tracking.d.ts.map +1 -0
  72. package/dist/syncer/file-tracking.js +33 -0
  73. package/dist/syncer/index.js +2 -2
  74. package/dist/syncer/module-loader.d.ts +2 -11
  75. package/dist/syncer/module-loader.d.ts.map +1 -1
  76. package/dist/syncer/module-loader.js +3 -3
  77. package/dist/syncer/syncer-actions.d.ts +39 -6
  78. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  79. package/dist/syncer/syncer-actions.js +125 -10
  80. package/dist/syncer/syncer.d.ts +33 -19
  81. package/dist/syncer/syncer.d.ts.map +1 -1
  82. package/dist/syncer/syncer.js +168 -168
  83. package/dist/syncer/watcher.d.ts +8 -0
  84. package/dist/syncer/watcher.d.ts.map +1 -0
  85. package/dist/syncer/watcher.js +105 -0
  86. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  87. package/dist/tasks/workflow-manager.js +2 -1
  88. package/dist/template/implementations/services.template.d.ts.map +1 -1
  89. package/dist/template/implementations/services.template.js +36 -1
  90. package/dist/testing/bootstrap.d.ts.map +1 -1
  91. package/dist/testing/bootstrap.js +8 -1
  92. package/dist/testing/data-explorer.d.ts.map +1 -1
  93. package/dist/testing/data-explorer.js +5 -3
  94. package/dist/testing/fixture-manager.js +1 -1
  95. package/dist/types/types.d.ts +2 -1
  96. package/dist/types/types.d.ts.map +1 -1
  97. package/dist/types/types.js +2 -2
  98. package/dist/ui/api.d.ts.map +1 -1
  99. package/dist/ui/api.js +4 -3
  100. package/dist/ui/cdd-service.js +1 -1
  101. package/dist/ui-web/assets/{index-C5KUjXm0.js → index-BmThfg-s.js} +39 -39
  102. package/dist/ui-web/assets/index-D4rYm-Xz.css +1 -0
  103. package/dist/ui-web/index.html +2 -2
  104. package/dist/utils/async-utils.d.ts +27 -3
  105. package/dist/utils/async-utils.d.ts.map +1 -1
  106. package/dist/utils/async-utils.js +56 -6
  107. package/dist/utils/formatter.d.ts +7 -1
  108. package/dist/utils/formatter.d.ts.map +1 -1
  109. package/dist/utils/formatter.js +95 -60
  110. package/dist/utils/fs-utils.d.ts +2 -0
  111. package/dist/utils/fs-utils.d.ts.map +1 -1
  112. package/dist/utils/fs-utils.js +10 -2
  113. package/dist/utils/process-utils.d.ts +6 -0
  114. package/dist/utils/process-utils.d.ts.map +1 -1
  115. package/dist/utils/process-utils.js +16 -3
  116. package/dist/utils/utils.d.ts +1 -0
  117. package/dist/utils/utils.d.ts.map +1 -1
  118. package/dist/utils/utils.js +2 -2
  119. package/package.json +7 -5
  120. package/src/ai/providers/rtzr/utils.ts +1 -1
  121. package/src/api/__tests__/sonamu.websocket.test.ts +64 -0
  122. package/src/api/__tests__/websocket-context.types.test.ts +58 -0
  123. package/src/api/config.ts +28 -2
  124. package/src/api/context.ts +21 -7
  125. package/src/api/decorators.ts +101 -1
  126. package/src/api/sonamu.ts +529 -127
  127. package/src/api/websocket-helpers.ts +122 -0
  128. package/src/bin/cli.ts +10 -2
  129. package/src/database/upsert-builder.ts +3 -3
  130. package/src/dict/sonamu-dictionary.ts +3 -3
  131. package/src/entity/entity.ts +1 -1
  132. package/src/index.ts +6 -0
  133. package/src/migration/code-generation.ts +6 -11
  134. package/src/shared/app.shared.ts.txt +312 -4
  135. package/src/shared/web.shared.ts.txt +340 -4
  136. package/src/stream/__tests__/ws-contracts.test.ts +381 -0
  137. package/src/stream/__tests__/ws.test.ts +449 -0
  138. package/src/stream/index.ts +6 -0
  139. package/src/stream/ws-audience-resolver.ts +35 -0
  140. package/src/stream/ws-audience.ts +62 -0
  141. package/src/stream/ws-cluster-bus.ts +32 -0
  142. package/src/stream/ws-core.ts +16 -0
  143. package/src/stream/ws-delivery.ts +138 -0
  144. package/src/stream/ws-local-connection-store.ts +44 -0
  145. package/src/stream/ws-presence-store.ts +326 -0
  146. package/src/stream/ws-registry.ts +138 -0
  147. package/src/stream/ws.ts +591 -0
  148. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +78 -0
  149. package/src/syncer/api-parser.ts +112 -1
  150. package/src/syncer/checksum.ts +23 -29
  151. package/src/syncer/code-generator.ts +4 -1
  152. package/src/syncer/event-batcher.ts +72 -0
  153. package/src/syncer/file-patterns.ts +98 -30
  154. package/src/syncer/file-tracking.ts +27 -0
  155. package/src/syncer/module-loader.ts +5 -12
  156. package/src/syncer/syncer-actions.ts +179 -17
  157. package/src/syncer/syncer.ts +250 -287
  158. package/src/syncer/watcher.ts +128 -0
  159. package/src/tasks/workflow-manager.ts +1 -0
  160. package/src/template/__tests__/services.template.websocket.test.ts +79 -0
  161. package/src/template/implementations/services.template.ts +69 -0
  162. package/src/testing/bootstrap.ts +8 -1
  163. package/src/testing/data-explorer.ts +3 -2
  164. package/src/types/types.ts +20 -2
  165. package/src/ui/api.ts +10 -1
  166. package/src/utils/async-utils.ts +71 -4
  167. package/src/utils/formatter.ts +114 -75
  168. package/src/utils/fs-utils.ts +9 -0
  169. package/src/utils/process-utils.ts +17 -0
  170. package/src/utils/utils.ts +1 -1
  171. package/dist/ui-web/assets/index-Dr8pRJC_.css +0 -1
@@ -53,12 +53,14 @@ async function readApisFromFile(filePath) {
53
53
  throw new Error(`리턴 타입이 기재되지 않은 메소드 ${modelName}.${methodName}`);
54
54
  }
55
55
  const returnType = resolveTypeNode(node.type);
56
+ const websocketTypeRefs = readWebSocketTypeRefs(node);
56
57
  methods.push({
57
58
  modelName,
58
59
  methodName,
59
60
  typeParameters,
60
61
  parameters,
61
- returnType
62
+ returnType,
63
+ websocketTypeRefs
62
64
  });
63
65
  }
64
66
  ts.forEachChild(node, visitor);
@@ -78,8 +80,13 @@ async function readApisFromFile(filePath) {
78
80
  if (!foundMethod) {
79
81
  throw new Error(`API ${api.modelName}.${api.methodName} not found in ${filePath}`);
80
82
  }
83
+ const websocketOptions = api.websocketOptions ? {
84
+ ...api.websocketOptions,
85
+ ...foundMethod.websocketTypeRefs
86
+ } : undefined;
81
87
  return {
82
88
  ...api,
89
+ websocketOptions,
83
90
  typeParameters: foundMethod?.typeParameters,
84
91
  parameters: foundMethod?.parameters,
85
92
  returnType: foundMethod?.returnType
@@ -87,6 +94,69 @@ async function readApisFromFile(filePath) {
87
94
  });
88
95
  return extendedApis;
89
96
  }
97
+ function readWebSocketTypeRefs(node) {
98
+ const optionsLiteral = getDecoratorOptionsObjectLiteral(node, "websocket");
99
+ if (!optionsLiteral) {
100
+ return {};
101
+ }
102
+ const refs = {};
103
+ for (const property of optionsLiteral.properties) {
104
+ if (!ts.isPropertyAssignment(property)) {
105
+ continue;
106
+ }
107
+ const propertyName = getPropertyNameText(property.name);
108
+ if (propertyName !== "outEvents" && propertyName !== "inEvents") {
109
+ continue;
110
+ }
111
+ const typeRef = resolveDecoratorTypeRef(property.initializer);
112
+ if (!typeRef) {
113
+ continue;
114
+ }
115
+ if (propertyName === "outEvents") {
116
+ refs.outEventsTypeRef = typeRef;
117
+ } else {
118
+ refs.inEventsTypeRef = typeRef;
119
+ }
120
+ }
121
+ return refs;
122
+ }
123
+ function getDecoratorOptionsObjectLiteral(node, decoratorName) {
124
+ for (const modifier of node.modifiers ?? []) {
125
+ if (!ts.isDecorator(modifier)) {
126
+ continue;
127
+ }
128
+ const expression = modifier.expression;
129
+ if (!ts.isCallExpression(expression)) {
130
+ continue;
131
+ }
132
+ if (!ts.isIdentifier(expression.expression) || expression.expression.text !== decoratorName) {
133
+ continue;
134
+ }
135
+ const [firstArg] = expression.arguments;
136
+ if (firstArg && ts.isObjectLiteralExpression(firstArg)) {
137
+ return firstArg;
138
+ }
139
+ }
140
+ return undefined;
141
+ }
142
+ function getPropertyNameText(name) {
143
+ if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {
144
+ return name.text;
145
+ }
146
+ return undefined;
147
+ }
148
+ function resolveDecoratorTypeRef(expression) {
149
+ if (ts.isIdentifier(expression)) {
150
+ return {
151
+ t: "ref",
152
+ id: expression.text
153
+ };
154
+ }
155
+ if (ts.isAsExpression(expression) || ts.isParenthesizedExpression(expression) || ts.isNonNullExpression(expression) || ts.isTypeAssertionExpression(expression)) {
156
+ return resolveDecoratorTypeRef(expression.expression);
157
+ }
158
+ return undefined;
159
+ }
90
160
  function resolveTypeNode(typeNode) {
91
161
  switch (typeNode?.kind) {
92
162
  case ts.SyntaxKind.AnyKeyword: return "any";
@@ -232,4 +302,4 @@ var init_api_parser = __esmMin((() => {
232
302
  //#endregion
233
303
  init_api_parser();
234
304
  export { init_api_parser, readApisFromFile };
235
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXBhcnNlci5qcyIsIm5hbWVzIjpbIm1ldGhvZHM6IE9taXQ8RXh0ZW5kZWRBcGksIFwicGF0aFwiIHwgXCJvcHRpb25zXCI+W10iLCJtb2RlbE5hbWU6IHN0cmluZyIsIm1ldGhvZE5hbWU6IHN0cmluZyIsInR5cGVQYXJhbWV0ZXJzOiBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtW10iLCJwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdIiwicmVzdWx0OiBBcGlQYXJhbSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvYXBpLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5cbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHsgcmVnaXN0ZXJlZEFwaXMgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHZhbGlkYXRlTWV0aG9kTmFtZSB9IGZyb20gXCIuLi9hcGkvdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyB0eXBlIEFwaVBhcmFtLCB0eXBlIEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG4vKipcbiAqIFR5cGVTY3JpcHQg7YyM7J287J2EIO2MjOyLse2VmOyXrCBBUEkg66mU7IaM65OcIOygleuztOulvCDstpTstpztlanri4jri6QuXG4gKiBAYXBpIOuNsOy9lOugiOydtO2EsOqwgCDrtpnsnYAg66mU7IaM65Oc65Ok7J2YIO2DgOyehSDsoJXrs7Trpbwg67aE7ISd7ZWp64uI64ukLlxuICogQHBhcmFtIGZpbGVQYXRoIC0g7YyM7Iux7ZWgIFR5cGVTY3JpcHQg7YyM7J287J2YIOygiOuMgCDqsr3roZxcbiAqIEByZXR1cm5zIEFQSSDrqZTshozrk5wg7KCV67O0IOuwsOyXtCAo7YOA7J6FIO2MjOudvOuvuO2EsCwg7YyM652866+47YSwLCDrpqzthLQg7YOA7J6FIOuTsSlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBcGlzRnJvbUZpbGUoZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IFByb21pc2U8RXh0ZW5kZWRBcGlbXT4ge1xuICBpZiAoIWZpbGVQYXRoLmVuZHNXaXRoKFwiLnRzXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7ZmlsZVBhdGh9IGRvZXMgbm90IHNlZW0gdG8gYmUgYSBUeXBlU2NyaXB0IGZpbGUuIFBsZWFzZSBjaGVjayB0aGUgZmlsZSBwYXRoLiBXZSBvbmx5IHN1cHBvcnQgcGFyc2luZyBUeXBlU2NyaXB0IGZpbGVzLmAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIGZpbGVQYXRoLFxuICAgIChhd2FpdCByZWFkRmlsZShmaWxlUGF0aCkpLnRvU3RyaW5nKCksXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgKTtcblxuICBjb25zdCBtZXRob2RzOiBPbWl0PEV4dGVuZGVkQXBpLCBcInBhdGhcIiB8IFwib3B0aW9uc1wiPltdID0gW107XG4gIGxldCBtb2RlbE5hbWU6IHN0cmluZyA9IFwiVW5rbm93bk1vZGVsXCI7XG4gIGxldCBtZXRob2ROYW1lOiBzdHJpbmcgPSBcInVua25vd25NZXRob2RcIjtcbiAgY29uc3QgdmlzaXRvciA9IChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKG5vZGUubmFtZSAmJiB0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtb2RlbE5hbWUgPSBub2RlLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKS5yZXBsYWNlKC9DbGFzcyQvLCBcIlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtZXRob2ROYW1lID0gbm9kZS5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCk7XG4gICAgICAgIHZhbGlkYXRlTWV0aG9kTmFtZShtZXRob2ROYW1lKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnM6IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1bXSA9IChub2RlLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5tYXAoXG4gICAgICAgICh0eXBlUGFyYW0pID0+IHtcbiAgICAgICAgICBjb25zdCB0cCA9IHR5cGVQYXJhbTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0OiBcInR5cGUtcGFyYW1cIixcbiAgICAgICAgICAgIGlkOiB0cC5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBjb25zdHJhaW50OiB0cC5jb25zdHJhaW50ID8gcmVzb2x2ZVR5cGVOb2RlKHRwLmNvbnN0cmFpbnQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgcGFyYW1ldGVyczogQXBpUGFyYW1bXSA9IG5vZGUucGFyYW1ldGVycy5tYXAoKHBhcmFtRGVjLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0RGVmID0gcHJpbnROb2RlKHBhcmFtRGVjLmluaXRpYWxpemVyLCBzb3VyY2VGaWxlKTtcblxuICAgICAgICAvLyDquLDrs7jqsJLsnbQg7J6I64qUIOqyveyasCBwYXJhbURlYy50eXBl6rCAIHVuZGVmaW5lZOuhnCDrgpjsmLRcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHBhcmFtRGVjLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBwYXJhbURlYy50eXBlIGFzIHRzLlR5cGVOb2RlLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHBhcmFtRGVjLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCB8fCBwYXJhbURlYy5pbml0aWFsaXplciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdERlZixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBpZiAobm9kZS50eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDrpqzthLQg7YOA7J6F7J20IOq4sOyerOuQmOyngCDslYrsnYAg66mU7IaM65OcICR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXR1cm5UeXBlID0gcmVzb2x2ZVR5cGVOb2RlKG5vZGUudHlwZSk7XG5cbiAgICAgIG1ldGhvZHMucHVzaCh7XG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgdHlwZVBhcmFtZXRlcnMsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIHJldHVyblR5cGUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0b3IpO1xuICB9O1xuICB2aXNpdG9yKHNvdXJjZUZpbGUpO1xuXG4gIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIO2YhOyerCDtjIzsnbzsnZgg65Ox66Gd65CcIEFQSSDtlYTthLBcbiAgY29uc3QgY3VycmVudE1vZGVsQXBpcyA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiB7XG4gICAgcmV0dXJuIG1ldGhvZHMuZmluZChcbiAgICAgIChtZXRob2QpID0+IG1ldGhvZC5tb2RlbE5hbWUgPT09IGFwaS5tb2RlbE5hbWUgJiYgbWV0aG9kLm1ldGhvZE5hbWUgPT09IGFwaS5tZXRob2ROYW1lLFxuICAgICk7XG4gIH0pO1xuICBpZiAoY3VycmVudE1vZGVsQXBpcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBjb25zdCBwID0gcGF0aC5qb2luKHRtcGRpcigpLCBcInNvbmFtdS1zeW5jZXItZXJyb3IuanNvblwiKTtcbiAgICAvLyB3cml0ZUZpbGVTeW5jKHAsIEpTT04uc3RyaW5naWZ5KHJlZ2lzdGVyZWRBcGlzLCBudWxsLCAyKSk7XG4gICAgLy8gZXhlY1N5bmMoYG9wZW4gJHtwfWApO1xuICAgIC8vIHRocm93IG5ldyBFcnJvcihg7ZiE7J6sIO2MjOydvOyXkCDsgqzsoIQg65Ox66Gd65CcIEFQSeqwgCDsl4bsirXri4jri6QuICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8g65Ox66Gd65CcIEFQSeyXkCDtmITsnqwg66mU7IaM65OcIO2DgOyehSDsoJXrs7Qg7ZmV7J6lXG4gIGNvbnN0IGV4dGVuZGVkQXBpcyA9IGN1cnJlbnRNb2RlbEFwaXMubWFwKChhcGkpID0+IHtcbiAgICBjb25zdCBmb3VuZE1ldGhvZCA9IG1ldGhvZHMuZmluZChcbiAgICAgIChtZXRob2QpID0+IG1ldGhvZC5tb2RlbE5hbWUgPT09IGFwaS5tb2RlbE5hbWUgJiYgbWV0aG9kLm1ldGhvZE5hbWUgPT09IGFwaS5tZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKCFmb3VuZE1ldGhvZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBUEkgJHthcGkubW9kZWxOYW1lfS4ke2FwaS5tZXRob2ROYW1lfSBub3QgZm91bmQgaW4gJHtmaWxlUGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwaSxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzOiBmb3VuZE1ldGhvZD8udHlwZVBhcmFtZXRlcnMsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3VuZE1ldGhvZD8ucGFyYW1ldGVycyxcbiAgICAgIHJldHVyblR5cGU6IGZvdW5kTWV0aG9kPy5yZXR1cm5UeXBlLFxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gZXh0ZW5kZWRBcGlzO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVHlwZU5vZGUodHlwZU5vZGU6IHRzLlR5cGVOb2RlKTogQXBpUGFyYW1UeXBlIHtcbiAgc3dpdGNoICh0eXBlTm9kZT8ua2luZCkge1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BbnlLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwiYW55XCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVua25vd25LZXl3b3JkOlxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bWJlcktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlZvaWRLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwidm9pZFwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5MaXRlcmFsVHlwZToge1xuICAgICAgY29uc3QgbGl0ZXJhbCA9ICh0eXBlTm9kZSBhcyB0cy5MaXRlcmFsVHlwZU5vZGUpLmxpdGVyYWw7XG4gICAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGxpdGVyYWwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJzdHJpbmctbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBsaXRlcmFsLnRleHQsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHRzLmlzTnVtZXJpY0xpdGVyYWwobGl0ZXJhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0OiBcIm51bWVyaWMtbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBOdW1iZXIobGl0ZXJhbC50ZXh0KSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcImZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7JWMIOyImCDsl4bripQg66as7YSw65+0XCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlUeXBlOiB7XG4gICAgICBjb25zdCBhcnJOb2RlID0gdHlwZU5vZGUgYXMgdHMuQXJyYXlUeXBlTm9kZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiYXJyYXlcIixcbiAgICAgICAgZWxlbWVudHNUeXBlOiByZXNvbHZlVHlwZU5vZGUoYXJyTm9kZS5lbGVtZW50VHlwZSksXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHlwZUxpdGVyYWw6IHtcbiAgICAgIGNvbnN0IGxpdGVyYWxOb2RlID0gdHlwZU5vZGUgYXMgdHMuVHlwZUxpdGVyYWxOb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcHM6IGxpdGVyYWxOb2RlLm1lbWJlcnMubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAodHMuaXNJbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgIGFzc2VydChtZW1iZXIucGFyYW1ldGVyc1swXSk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiBtZW1iZXIucGFyYW1ldGVyc1swXS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IG1lbWJlci5wYXJhbWV0ZXJzWzBdLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbURlYyh7XG4gICAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBlc2NhcGVkVGV4dDogYFske3Jlcy5uYW1lfSR7cmVzLm9wdGlvbmFsID8gXCI/XCIgOiBcIlwifTogJHtyZXMudHlwZX1dYCxcbiAgICAgICAgICAgICAgfSBhcyB0cy5JZGVudGlmaWVyLFxuICAgICAgICAgICAgICB0eXBlOiBtZW1iZXIudHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKHtcbiAgICAgICAgICAgICAgbmFtZTogKG1lbWJlciBhcyB0cy5Qcm9wZXJ0eVNpZ25hdHVyZSkubmFtZSBhcyB0cy5JZGVudGlmaWVyLFxuICAgICAgICAgICAgICB0eXBlOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS50eXBlIGFzIHRzLlR5cGVOb2RlLFxuICAgICAgICAgICAgICBvcHRpb25hbDogKG1lbWJlciBhcyB0cy5Qcm9wZXJ0eVNpZ25hdHVyZSkucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJyZWZcIixcbiAgICAgICAgaWQ6ICgodHlwZU5vZGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGUpLnR5cGVOYW1lIGFzIHRzLklkZW50aWZpZXIpLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCksXG4gICAgICAgIGFyZ3M6ICh0eXBlTm9kZSBhcyB0cy5UeXBlUmVmZXJlbmNlTm9kZSkudHlwZUFyZ3VtZW50cz8ubWFwKCh0eXBlQXJnKSA9PlxuICAgICAgICAgIHJlc29sdmVUeXBlTm9kZSh0eXBlQXJnKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuaW9uVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwidW5pb25cIixcbiAgICAgICAgdHlwZXM6ICh0eXBlTm9kZSBhcyB0cy5VbmlvblR5cGVOb2RlKS50eXBlcy5tYXAoKHR5cGUpID0+IHJlc29sdmVUeXBlTm9kZSh0eXBlKSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbnRlcnNlY3Rpb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgdHlwZXM6ICh0eXBlTm9kZSBhcyB0cy5JbnRlcnNlY3Rpb25UeXBlTm9kZSkudHlwZXMubWFwKCh0eXBlKSA9PiByZXNvbHZlVHlwZU5vZGUodHlwZSkpLFxuICAgICAgfTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW5kZXhlZEFjY2Vzc1R5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImluZGV4ZWQtYWNjZXNzXCIsXG4gICAgICAgIG9iamVjdDogcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5JbmRleGVkQWNjZXNzVHlwZU5vZGUpLm9iamVjdFR5cGUpLFxuICAgICAgICBpbmRleDogcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5JbmRleGVkQWNjZXNzVHlwZU5vZGUpLmluZGV4VHlwZSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UdXBsZVR5cGU6XG4gICAgICBpZiAodHMuaXNUdXBsZVR5cGVOb2RlKHR5cGVOb2RlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHQ6IFwidHVwbGUtdHlwZVwiLFxuICAgICAgICAgIGVsZW1lbnRzOiB0eXBlTm9kZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+IHJlc29sdmVUeXBlTm9kZShlbGVtKSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuUGFyZW50aGVzaXplZFR5cGU6XG4gICAgICAvLyDqtITtmLjroZwg66y27J24IO2DgOyehSAo7JiIOiAoQSAmIEIpW10g7JeQ7IScIChBICYgQikpXG4gICAgICAvLyDrgrTrtoAg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCByZXNvbHZlXG4gICAgICByZXR1cm4gcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5QYXJlbnRoZXNpemVkVHlwZU5vZGUpLnR5cGUpO1xuXG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgcGFyYW1ldGVyczogKHR5cGVOb2RlIGFzIHRzLkZ1bmN0aW9uVHlwZU5vZGUpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBwYXJhbS5uYW1lLmdldFRleHQoKSxcbiAgICAgICAgICB0eXBlOiBwYXJhbS50eXBlID8gcmVzb2x2ZVR5cGVOb2RlKHBhcmFtLnR5cGUpIDogXCJ1bmtub3duXCIsXG4gICAgICAgICAgb3B0aW9uYWw6IHBhcmFtLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZWZhdWx0RGVmOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKSxcbiAgICAgICAgcmV0dXJuVHlwZTogcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5GdW5jdGlvblR5cGVOb2RlKS50eXBlKSxcbiAgICAgIH07XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHR5cGVOb2RlIHVuZGVmaW5lZGApO1xuICB9XG5cbiAgY29uc29sZS5kZWJ1Zyh0eXBlTm9kZSk7XG4gIHRocm93IG5ldyBFcnJvcihg7JWMIOyImCDsl4bripQgU3ludGF4S2luZCAke3R5cGVOb2RlLmtpbmR9YCk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYXJhbURlYyhcbiAgcGFyYW1EZWM6IHtcbiAgICBuYW1lOiB0cy5CaW5kaW5nTmFtZTtcbiAgICB0eXBlOiB0cy5UeXBlTm9kZTtcbiAgICBvcHRpb25hbD86IGJvb2xlYW47XG4gICAgZGVmYXVsdERlZj86IHN0cmluZztcbiAgfSxcbiAgaW5kZXg6IG51bWJlciA9IDAsXG4pOiBBcGlQYXJhbSB7XG4gIGNvbnN0IG5hbWUgPSBwYXJhbURlYy5uYW1lIGFzIHRzLklkZW50aWZpZXI7XG4gIGNvbnN0IHR5cGUgPSByZXNvbHZlVHlwZU5vZGUocGFyYW1EZWMudHlwZSk7XG5cbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUuZGVidWcoeyBuYW1lLCB0eXBlLCBwYXJhbURlYyB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogQXBpUGFyYW0gPSB7XG4gICAgbmFtZTogbmFtZS5lc2NhcGVkVGV4dCA/IG5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSA6IGBub25hbWVBdCR7aW5kZXh9YCxcbiAgICB0eXBlLFxuICAgIG9wdGlvbmFsOiBwYXJhbURlYy5vcHRpb25hbCA9PT0gdHJ1ZSxcbiAgICBkZWZhdWx0RGVmOiBwYXJhbURlYz8uZGVmYXVsdERlZixcbiAgfTtcblxuICAvLyDqtazsobDrtoTtlbTtlaDri7nsnZgg6rK97JqwIO2DgOyeheydtOumhCDsgqzsmqlcbiAgaWYgKFxuICAgIHRzLmlzT2JqZWN0QmluZGluZ1BhdHRlcm4obmFtZSkgJiZcbiAgICB0cy5pc1R5cGVSZWZlcmVuY2VOb2RlKHBhcmFtRGVjLnR5cGUpICYmXG4gICAgdHMuaXNJZGVudGlmaWVyKHBhcmFtRGVjLnR5cGUudHlwZU5hbWUpXG4gICkge1xuICAgIHJlc3VsdC5uYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShwYXJhbURlYy50eXBlLnR5cGVOYW1lLnRleHQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcHJpbnROb2RlKG5vZGU6IHRzLk5vZGUgfCB1bmRlZmluZWQsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKHsgbmV3TGluZTogdHMuTmV3TGluZUtpbmQuTGluZUZlZWQgfSk7XG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxlQUFzQixpQkFBaUIsVUFBZ0Q7QUFDckYsS0FBSSxDQUFDLFNBQVMsU0FBUyxNQUFNLEVBQUU7QUFDN0IsUUFBTSxJQUFJLE1BQ1IsR0FBRyxT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
305
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXBhcnNlci5qcyIsIm5hbWVzIjpbIm1ldGhvZHM6IFBhcnNlZE1ldGhvZFtdIiwibW9kZWxOYW1lOiBzdHJpbmciLCJtZXRob2ROYW1lOiBzdHJpbmciLCJ0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdIiwicGFyYW1ldGVyczogQXBpUGFyYW1bXSIsInJlZnM6IFdlYlNvY2tldFR5cGVSZWZzIiwicmVzdWx0OiBBcGlQYXJhbSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvYXBpLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5cbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHsgcmVnaXN0ZXJlZEFwaXMgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgUmVzb2x2ZWRXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZU1ldGhvZE5hbWUgfSBmcm9tIFwiLi4vYXBpL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgdHlwZSBBcGlQYXJhbSwgdHlwZSBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxudHlwZSBXZWJTb2NrZXRUeXBlUmVmcyA9IFBpY2s8XG4gIFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucyxcbiAgXCJvdXRFdmVudHNUeXBlUmVmXCIgfCBcImluRXZlbnRzVHlwZVJlZlwiXG4+O1xudHlwZSBQYXJzZWRNZXRob2QgPSB7XG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHR5cGVQYXJhbWV0ZXJzOiBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtW107XG4gIHBhcmFtZXRlcnM6IEFwaVBhcmFtW107XG4gIHJldHVyblR5cGU6IEFwaVBhcmFtVHlwZTtcbiAgd2Vic29ja2V0VHlwZVJlZnM6IFdlYlNvY2tldFR5cGVSZWZzO1xufTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IO2MjOydvOydhCDtjIzsi7HtlZjsl6wgQVBJIOuplOyGjOuTnCDsoJXrs7Trpbwg7LaU7Lac7ZWp64uI64ukLlxuICogQGFwaSDrjbDsvZTroIjsnbTthLDqsIAg67aZ7J2AIOuplOyGjOuTnOuTpOydmCDtg4DsnoUg7KCV67O066W8IOu2hOyEne2VqeuLiOuLpC5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIO2MjOyLse2VoCBUeXBlU2NyaXB0IO2MjOydvOydmCDsoIjrjIAg6rK966GcXG4gKiBAcmV0dXJucyBBUEkg66mU7IaM65OcIOygleuztCDrsLDsl7QgKO2DgOyehSDtjIzrnbzrr7jthLAsIO2MjOudvOuvuO2EsCwg66as7YS0IO2DgOyehSDrk7EpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQXBpc0Zyb21GaWxlKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPEV4dGVuZGVkQXBpW10+IHtcbiAgaWYgKCFmaWxlUGF0aC5lbmRzV2l0aChcIi50c1wiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2ZpbGVQYXRofSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgVHlwZVNjcmlwdCBmaWxlLiBQbGVhc2UgY2hlY2sgdGhlIGZpbGUgcGF0aC4gV2Ugb25seSBzdXBwb3J0IHBhcnNpbmcgVHlwZVNjcmlwdCBmaWxlcy5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICAoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpKS50b1N0cmluZygpLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICk7XG5cbiAgY29uc3QgbWV0aG9kczogUGFyc2VkTWV0aG9kW10gPSBbXTtcbiAgbGV0IG1vZGVsTmFtZTogc3RyaW5nID0gXCJVbmtub3duTW9kZWxcIjtcbiAgbGV0IG1ldGhvZE5hbWU6IHN0cmluZyA9IFwidW5rbm93bk1ldGhvZFwiO1xuICBjb25zdCB2aXNpdG9yID0gKG5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICBpZiAodHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBpZiAobm9kZS5uYW1lICYmIHRzLmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIG1vZGVsTmFtZSA9IG5vZGUubmFtZS5lc2NhcGVkVGV4dC50b1N0cmluZygpLnJlcGxhY2UoL0NsYXNzJC8sIFwiXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHMuaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIG1ldGhvZE5hbWUgPSBub2RlLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKTtcbiAgICAgICAgdmFsaWRhdGVNZXRob2ROYW1lKG1ldGhvZE5hbWUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdID0gKG5vZGUudHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcChcbiAgICAgICAgKHR5cGVQYXJhbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRwID0gdHlwZVBhcmFtO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHQ6IFwidHlwZS1wYXJhbVwiLFxuICAgICAgICAgICAgaWQ6IHRwLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnQ6IHRwLmNvbnN0cmFpbnQgPyByZXNvbHZlVHlwZU5vZGUodHAuY29uc3RyYWludCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdID0gbm9kZS5wYXJhbWV0ZXJzLm1hcCgocGFyYW1EZWMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHREZWYgPSBwcmludE5vZGUocGFyYW1EZWMuaW5pdGlhbGl6ZXIsIHNvdXJjZUZpbGUpO1xuXG4gICAgICAgIC8vIOq4sOuzuOqwkuydtCDsnojripQg6rK97JqwIHBhcmFtRGVjLnR5cGXqsIAgdW5kZWZpbmVk66GcIOuCmOyYtFxuXG4gICAgICAgIHJldHVybiByZXNvbHZlUGFyYW1EZWMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogcGFyYW1EZWMubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHBhcmFtRGVjLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICBvcHRpb25hbDogcGFyYW1EZWMucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtRGVjLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0RGVmLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOumrO2EtCDtg4DsnoXsnbQg6riw7J6s65CY7KeAIOyViuydgCDrqZTshozrk5wgJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJldHVyblR5cGUgPSByZXNvbHZlVHlwZU5vZGUobm9kZS50eXBlKTtcbiAgICAgIGNvbnN0IHdlYnNvY2tldFR5cGVSZWZzID0gcmVhZFdlYlNvY2tldFR5cGVSZWZzKG5vZGUpO1xuXG4gICAgICBtZXRob2RzLnB1c2goe1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICByZXR1cm5UeXBlLFxuICAgICAgICB3ZWJzb2NrZXRUeXBlUmVmcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXRvcik7XG4gIH07XG4gIHZpc2l0b3Ioc291cmNlRmlsZSk7XG5cbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2MjOydvOydmCDrk7HroZ3rkJwgQVBJIO2VhO2EsFxuICBjb25zdCBjdXJyZW50TW9kZWxBcGlzID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IHtcbiAgICByZXR1cm4gbWV0aG9kcy5maW5kKFxuICAgICAgKG1ldGhvZCkgPT4gbWV0aG9kLm1vZGVsTmFtZSA9PT0gYXBpLm1vZGVsTmFtZSAmJiBtZXRob2QubWV0aG9kTmFtZSA9PT0gYXBpLm1ldGhvZE5hbWUsXG4gICAgKTtcbiAgfSk7XG4gIGlmIChjdXJyZW50TW9kZWxBcGlzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGNvbnN0IHAgPSBwYXRoLmpvaW4odG1wZGlyKCksIFwic29uYW11LXN5bmNlci1lcnJvci5qc29uXCIpO1xuICAgIC8vIHdyaXRlRmlsZVN5bmMocCwgSlNPTi5zdHJpbmdpZnkocmVnaXN0ZXJlZEFwaXMsIG51bGwsIDIpKTtcbiAgICAvLyBleGVjU3luYyhgb3BlbiAke3B9YCk7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKGDtmITsnqwg7YyM7J287JeQIOyCrOyghCDrk7HroZ3rkJwgQVBJ6rCAIOyXhuyKteuLiOuLpC4gJHtmaWxlUGF0aH1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyDrk7HroZ3rkJwgQVBJ7JeQIO2YhOyerCDrqZTshozrk5wg7YOA7J6FIOygleuztCDtmZXsnqVcbiAgY29uc3QgZXh0ZW5kZWRBcGlzID0gY3VycmVudE1vZGVsQXBpcy5tYXAoKGFwaSkgPT4ge1xuICAgIGNvbnN0IGZvdW5kTWV0aG9kID0gbWV0aG9kcy5maW5kKFxuICAgICAgKG1ldGhvZCkgPT4gbWV0aG9kLm1vZGVsTmFtZSA9PT0gYXBpLm1vZGVsTmFtZSAmJiBtZXRob2QubWV0aG9kTmFtZSA9PT0gYXBpLm1ldGhvZE5hbWUsXG4gICAgKTtcbiAgICBpZiAoIWZvdW5kTWV0aG9kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFQSSAke2FwaS5tb2RlbE5hbWV9LiR7YXBpLm1ldGhvZE5hbWV9IG5vdCBmb3VuZCBpbiAke2ZpbGVQYXRofWApO1xuICAgIH1cbiAgICBjb25zdCB3ZWJzb2NrZXRPcHRpb25zID0gYXBpLndlYnNvY2tldE9wdGlvbnNcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmFwaS53ZWJzb2NrZXRPcHRpb25zLFxuICAgICAgICAgIC4uLmZvdW5kTWV0aG9kLndlYnNvY2tldFR5cGVSZWZzLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5hcGksXG4gICAgICB3ZWJzb2NrZXRPcHRpb25zLFxuICAgICAgdHlwZVBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kPy50eXBlUGFyYW1ldGVycyxcbiAgICAgIHBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kPy5wYXJhbWV0ZXJzLFxuICAgICAgcmV0dXJuVHlwZTogZm91bmRNZXRob2Q/LnJldHVyblR5cGUsXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBleHRlbmRlZEFwaXM7XG59XG5cbmZ1bmN0aW9uIHJlYWRXZWJTb2NrZXRUeXBlUmVmcyhub2RlOiB0cy5NZXRob2REZWNsYXJhdGlvbik6IFdlYlNvY2tldFR5cGVSZWZzIHtcbiAgY29uc3Qgb3B0aW9uc0xpdGVyYWwgPSBnZXREZWNvcmF0b3JPcHRpb25zT2JqZWN0TGl0ZXJhbChub2RlLCBcIndlYnNvY2tldFwiKTtcbiAgaWYgKCFvcHRpb25zTGl0ZXJhbCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlZnM6IFdlYlNvY2tldFR5cGVSZWZzID0ge307XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb3B0aW9uc0xpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eU5hbWVUZXh0KHByb3BlcnR5Lm5hbWUpO1xuICAgIGlmIChwcm9wZXJ0eU5hbWUgIT09IFwib3V0RXZlbnRzXCIgJiYgcHJvcGVydHlOYW1lICE9PSBcImluRXZlbnRzXCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVSZWYgPSByZXNvbHZlRGVjb3JhdG9yVHlwZVJlZihwcm9wZXJ0eS5pbml0aWFsaXplcik7XG4gICAgaWYgKCF0eXBlUmVmKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcGVydHlOYW1lID09PSBcIm91dEV2ZW50c1wiKSB7XG4gICAgICByZWZzLm91dEV2ZW50c1R5cGVSZWYgPSB0eXBlUmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZzLmluRXZlbnRzVHlwZVJlZiA9IHR5cGVSZWY7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbmZ1bmN0aW9uIGdldERlY29yYXRvck9wdGlvbnNPYmplY3RMaXRlcmFsKFxuICBub2RlOiB0cy5NZXRob2REZWNsYXJhdGlvbixcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuKTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIG5vZGUubW9kaWZpZXJzID8/IFtdKSB7XG4gICAgaWYgKCF0cy5pc0RlY29yYXRvcihtb2RpZmllcikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBtb2RpZmllci5leHByZXNzaW9uO1xuICAgIGlmICghdHMuaXNDYWxsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIoZXhwcmVzc2lvbi5leHByZXNzaW9uKSB8fCBleHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCAhPT0gZGVjb3JhdG9yTmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0QXJnXSA9IGV4cHJlc3Npb24uYXJndW1lbnRzO1xuICAgIGlmIChmaXJzdEFyZyAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJnKSkge1xuICAgICAgcmV0dXJuIGZpcnN0QXJnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5TmFtZVRleHQobmFtZTogdHMuUHJvcGVydHlOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzSWRlbnRpZmllcihuYW1lKSB8fCB0cy5pc1N0cmluZ0xpdGVyYWwobmFtZSkgfHwgdHMuaXNOdW1lcmljTGl0ZXJhbChuYW1lKSkge1xuICAgIHJldHVybiBuYW1lLnRleHQ7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVjb3JhdG9yVHlwZVJlZihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uKTogQXBpUGFyYW1UeXBlLlJlZiB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIoZXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdDogXCJyZWZcIixcbiAgICAgIGlkOiBleHByZXNzaW9uLnRleHQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICB0cy5pc0FzRXhwcmVzc2lvbihleHByZXNzaW9uKSB8fFxuICAgIHRzLmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oZXhwcmVzc2lvbikgfHxcbiAgICB0cy5pc05vbk51bGxFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8XG4gICAgdHMuaXNUeXBlQXNzZXJ0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKVxuICApIHtcbiAgICByZXR1cm4gcmVzb2x2ZURlY29yYXRvclR5cGVSZWYoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUeXBlTm9kZSh0eXBlTm9kZTogdHMuVHlwZU5vZGUpOiBBcGlQYXJhbVR5cGUge1xuICBzd2l0Y2ggKHR5cGVOb2RlPy5raW5kKSB7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkFueUtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJhbnlcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5rbm93bktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlN0cmluZ0tleXdvcmQ6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVtYmVyS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZDpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVm9pZEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ2b2lkXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkxpdGVyYWxUeXBlOiB7XG4gICAgICBjb25zdCBsaXRlcmFsID0gKHR5cGVOb2RlIGFzIHRzLkxpdGVyYWxUeXBlTm9kZSkubGl0ZXJhbDtcbiAgICAgIGlmICh0cy5pc1N0cmluZ0xpdGVyYWwobGl0ZXJhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0OiBcInN0cmluZy1saXRlcmFsXCIsXG4gICAgICAgICAgdmFsdWU6IGxpdGVyYWwudGV4dCxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHMuaXNOdW1lcmljTGl0ZXJhbChsaXRlcmFsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHQ6IFwibnVtZXJpYy1saXRlcmFsXCIsXG4gICAgICAgICAgdmFsdWU6IE51bWJlcihsaXRlcmFsLnRleHQpLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxpdGVyYWwua2luZCA9PT0gdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgICAgICB9IGVsc2UgaWYgKGxpdGVyYWwua2luZCA9PT0gdHMuU3ludGF4S2luZC5UcnVlS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcInRydWVcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRmFsc2VLZXl3b3JkKSB7XG4gICAgICAgICAgcmV0dXJuIFwiZmFsc2VcIjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLslYwg7IiYIOyXhuuKlCDrpqzthLDrn7RcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BcnJheVR5cGU6IHtcbiAgICAgIGNvbnN0IGFyck5vZGUgPSB0eXBlTm9kZSBhcyB0cy5BcnJheVR5cGVOb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJhcnJheVwiLFxuICAgICAgICBlbGVtZW50c1R5cGU6IHJlc29sdmVUeXBlTm9kZShhcnJOb2RlLmVsZW1lbnRUeXBlKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlTGl0ZXJhbDoge1xuICAgICAgY29uc3QgbGl0ZXJhbE5vZGUgPSB0eXBlTm9kZSBhcyB0cy5UeXBlTGl0ZXJhbE5vZGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wczogbGl0ZXJhbE5vZGUubWVtYmVycy5tYXAoKG1lbWJlcikgPT4ge1xuICAgICAgICAgIGlmICh0cy5pc0luZGV4U2lnbmF0dXJlRGVjbGFyYXRpb24obWVtYmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0KG1lbWJlci5wYXJhbWV0ZXJzWzBdKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlc29sdmVQYXJhbURlYyh7XG4gICAgICAgICAgICAgIG5hbWU6IG1lbWJlci5wYXJhbWV0ZXJzWzBdLm5hbWUgYXMgdHMuSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgdHlwZTogbWVtYmVyLnBhcmFtZXRlcnNbMF0udHlwZSBhcyB0cy5UeXBlTm9kZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKHtcbiAgICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgIGVzY2FwZWRUZXh0OiBgWyR7cmVzLm5hbWV9JHtyZXMub3B0aW9uYWwgPyBcIj9cIiA6IFwiXCJ9OiAke3Jlcy50eXBlfV1gLFxuICAgICAgICAgICAgICB9IGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IG1lbWJlci50eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IChtZW1iZXIgYXMgdHMuUHJvcGVydHlTaWduYXR1cmUpLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICAgIG9wdGlvbmFsOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS5xdWVzdGlvblRva2VuICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR5cGVSZWZlcmVuY2U6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcInJlZlwiLFxuICAgICAgICBpZDogKCh0eXBlTm9kZSBhcyB0cy5UeXBlUmVmZXJlbmNlTm9kZSkudHlwZU5hbWUgYXMgdHMuSWRlbnRpZmllcikuZXNjYXBlZFRleHQudG9TdHJpbmcoKSxcbiAgICAgICAgYXJnczogKHR5cGVOb2RlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlKS50eXBlQXJndW1lbnRzPy5tYXAoKHR5cGVBcmcpID0+XG4gICAgICAgICAgcmVzb2x2ZVR5cGVOb2RlKHR5cGVBcmcpLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5pb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJ1bmlvblwiLFxuICAgICAgICB0eXBlczogKHR5cGVOb2RlIGFzIHRzLlVuaW9uVHlwZU5vZGUpLnR5cGVzLm1hcCgodHlwZSkgPT4gcmVzb2x2ZVR5cGVOb2RlKHR5cGUpKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkludGVyc2VjdGlvblR5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImludGVyc2VjdGlvblwiLFxuICAgICAgICB0eXBlczogKHR5cGVOb2RlIGFzIHRzLkludGVyc2VjdGlvblR5cGVOb2RlKS50eXBlcy5tYXAoKHR5cGUpID0+IHJlc29sdmVUeXBlTm9kZSh0eXBlKSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbmRleGVkQWNjZXNzVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiaW5kZXhlZC1hY2Nlc3NcIixcbiAgICAgICAgb2JqZWN0OiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLkluZGV4ZWRBY2Nlc3NUeXBlTm9kZSkub2JqZWN0VHlwZSksXG4gICAgICAgIGluZGV4OiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLkluZGV4ZWRBY2Nlc3NUeXBlTm9kZSkuaW5kZXhUeXBlKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR1cGxlVHlwZTpcbiAgICAgIGlmICh0cy5pc1R1cGxlVHlwZU5vZGUodHlwZU5vZGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJ0dXBsZS10eXBlXCIsXG4gICAgICAgICAgZWxlbWVudHM6IHR5cGVOb2RlLmVsZW1lbnRzLm1hcCgoZWxlbSkgPT4gcmVzb2x2ZVR5cGVOb2RlKGVsZW0pKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5QYXJlbnRoZXNpemVkVHlwZTpcbiAgICAgIC8vIOq0hO2YuOuhnCDrrLbsnbgg7YOA7J6FICjsmIg6IChBICYgQilbXSDsl5DshJwgKEEgJiBCKSlcbiAgICAgIC8vIOuCtOu2gCDtg4DsnoXsnYQg7J6s6reA7KCB7Jy866GcIHJlc29sdmVcbiAgICAgIHJldHVybiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLlBhcmVudGhlc2l6ZWRUeXBlTm9kZSkudHlwZSk7XG5cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuRnVuY3Rpb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJmdW5jdGlvblwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiAodHlwZU5vZGUgYXMgdHMuRnVuY3Rpb25UeXBlTm9kZSkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHBhcmFtLm5hbWUuZ2V0VGV4dCgpLFxuICAgICAgICAgIHR5cGU6IHBhcmFtLnR5cGUgPyByZXNvbHZlVHlwZU5vZGUocGFyYW0udHlwZSkgOiBcInVua25vd25cIixcbiAgICAgICAgICBvcHRpb25hbDogcGFyYW0ucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIGRlZmF1bHREZWY6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpLFxuICAgICAgICByZXR1cm5UeXBlOiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLkZ1bmN0aW9uVHlwZU5vZGUpLnR5cGUpLFxuICAgICAgfTtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHlwZU5vZGUgdW5kZWZpbmVkYCk7XG4gIH1cblxuICBjb25zb2xlLmRlYnVnKHR5cGVOb2RlKTtcbiAgdGhyb3cgbmV3IEVycm9yKGDslYwg7IiYIOyXhuuKlCBTeW50YXhLaW5kICR7dHlwZU5vZGUua2luZH1gKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhcmFtRGVjKFxuICBwYXJhbURlYzoge1xuICAgIG5hbWU6IHRzLkJpbmRpbmdOYW1lO1xuICAgIHR5cGU6IHRzLlR5cGVOb2RlO1xuICAgIG9wdGlvbmFsPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0RGVmPzogc3RyaW5nO1xuICB9LFxuICBpbmRleDogbnVtYmVyID0gMCxcbik6IEFwaVBhcmFtIHtcbiAgY29uc3QgbmFtZSA9IHBhcmFtRGVjLm5hbWUgYXMgdHMuSWRlbnRpZmllcjtcbiAgY29uc3QgdHlwZSA9IHJlc29sdmVUeXBlTm9kZShwYXJhbURlYy50eXBlKTtcblxuICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5kZWJ1Zyh7IG5hbWUsIHR5cGUsIHBhcmFtRGVjIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBBcGlQYXJhbSA9IHtcbiAgICBuYW1lOiBuYW1lLmVzY2FwZWRUZXh0ID8gbmFtZS5lc2NhcGVkVGV4dC50b1N0cmluZygpIDogYG5vbmFtZUF0JHtpbmRleH1gLFxuICAgIHR5cGUsXG4gICAgb3B0aW9uYWw6IHBhcmFtRGVjLm9wdGlvbmFsID09PSB0cnVlLFxuICAgIGRlZmF1bHREZWY6IHBhcmFtRGVjPy5kZWZhdWx0RGVmLFxuICB9O1xuXG4gIC8vIOq1rOyhsOu2hO2VtO2VoOuLueydmCDqsr3smrAg7YOA7J6F7J2066aEIOyCrOyaqVxuICBpZiAoXG4gICAgdHMuaXNPYmplY3RCaW5kaW5nUGF0dGVybihuYW1lKSAmJlxuICAgIHRzLmlzVHlwZVJlZmVyZW5jZU5vZGUocGFyYW1EZWMudHlwZSkgJiZcbiAgICB0cy5pc0lkZW50aWZpZXIocGFyYW1EZWMudHlwZS50eXBlTmFtZSlcbiAgKSB7XG4gICAgcmVzdWx0Lm5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKHBhcmFtRGVjLnR5cGUudHlwZU5hbWUudGV4dCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwcmludE5vZGUobm9kZTogdHMuTm9kZSB8IHVuZGVmaW5lZCwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIoeyBuZXdMaW5lOiB0cy5OZXdMaW5lS2luZC5MaW5lRmVlZCB9KTtcbiAgcmV0dXJuIHByaW50ZXIucHJpbnROb2RlKHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLCBub2RlLCBzb3VyY2VGaWxlKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLGVBQXNCLGlCQUFpQixVQUFnRDtBQUNyRixLQUFJLENBQUMsU0FBUyxTQUFTLE1BQU0sRUFBRTtBQUM3QixRQUFNLElBQUksTUFDUixHQUFHLFNBQVMsK0dBQ2I7O0NBR0gsTUFBTSxhQUFhLEdBQUcsaUJBQ3BCLFdBQ0MsTUFBTSxTQUFTLFNBQVMsRUFBRSxVQUFVLEVBQ3JDLEdBQUcsYUFBYSxPQUNqQjtDQUVELE1BQU1BLFVBQTBCLEVBQUU7Q0FDbEMsSUFBSUMsWUFBb0I7Q0FDeEIsSUFBSUMsYUFBcUI7Q0FDekIsTUFBTSxXQUFXLFNBQWtCO0FBQ2pDLE1BQUksR0FBRyxtQkFBbUIsS0FBSyxFQUFFO0FBQy9CLE9BQUksS0FBSyxRQUFRLEdBQUcsYUFBYSxLQUFLLEtBQUssRUFBRTtBQUMzQyxnQkFBWSxLQUFLLEtBQUssWUFBWSxVQUFVLENBQUMsUUFBUSxVQUFVLEdBQUc7OztBQUd0RSxNQUFJLEdBQUcsb0JBQW9CLEtBQUssRUFBRTtBQUNoQyxPQUFJLEdBQUcsYUFBYSxLQUFLLEtBQUssRUFBRTtBQUM5QixpQkFBYSxLQUFLLEtBQUssWUFBWSxVQUFVO0FBQzdDLHVCQUFtQixXQUFXOztHQUdoQyxNQUFNQyxrQkFBNEMsS0FBSyxrQkFBa0IsRUFBRSxFQUFFLEtBQzFFLGNBQWM7SUFDYixNQUFNLEtBQUs7QUFFWCxXQUFPO0tBQ0wsR0FBRztLQUNILElBQUksR0FBRyxLQUFLLFlBQVksVUFBVTtLQUNsQyxZQUFZLEdBQUcsYUFBYSxnQkFBZ0IsR0FBRyxXQUFXLEdBQUc7S0FDOUQ7S0FFSjtHQUNELE1BQU1DLGFBQXlCLEtBQUssV0FBVyxLQUFLLFVBQVUsVUFBVTtJQUN0RSxNQUFNLGFBQWEsVUFBVSxTQUFTLGFBQWEsV0FBVztBQUk5RCxXQUFPLGdCQUNMO0tBQ0UsTUFBTSxTQUFTO0tBQ2YsTUFB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
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/syncer/checksum.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,YAAY,EAAwB,MAAM,qBAAqB,CAAC;AAS9E;;;GAGG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAU9E;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD"}
1
+ {"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/syncer/checksum.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,YAAY,EAAwB,MAAM,qBAAqB,CAAC;AAS9E;;;GAGG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAU9E;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD"}
@@ -1,9 +1,9 @@
1
1
  import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+ import { globAsync, init_async_utils } from "../utils/async-utils.js";
2
3
  import { exists, init_fs_utils } from "../utils/fs-utils.js";
3
4
  import { differenceWith, init_utils } from "../utils/utils.js";
4
5
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
5
- import { globAsync, init_async_utils } from "../utils/async-utils.js";
6
- import { getChecksumPatternGroupInAbsolutePath, init_file_patterns } from "./file-patterns.js";
6
+ import { GLOB_EXCLUDE, getChecksumPatternGroupInAbsolutePath, init_file_patterns } from "./file-patterns.js";
7
7
  import { isEqual } from "radashi";
8
8
  import crypto from "crypto";
9
9
  import { readFile, writeFile } from "fs/promises";
@@ -39,16 +39,16 @@ async function renewChecksums() {
39
39
  await saveChecksums(calculatedChecksums);
40
40
  }
41
41
  async function getCurrentChecksums() {
42
- const filePaths = (await Promise.all(Object.entries(getChecksumPatternGroupInAbsolutePath()).map(async ([_fileType, pattern]) => {
43
- return globAsync(pattern);
44
- }))).flat().toSorted();
45
- const fileChecksums = await Promise.all(filePaths.map(async (filePath) => {
42
+ const allPaths = (await Promise.all(Object.entries(getChecksumPatternGroupInAbsolutePath()).map(([_fileType, pattern]) => {
43
+ return globAsync(pattern, { exclude: GLOB_EXCLUDE });
44
+ }))).flat();
45
+ const filePaths = Array.from(new Set(allPaths)).toSorted();
46
+ return await Promise.all(filePaths.map(async (filePath) => {
46
47
  return {
47
48
  path: filePath,
48
49
  checksum: await getChecksumOfFile(filePath)
49
50
  };
50
51
  }));
51
- return fileChecksums;
52
52
  }
53
53
  async function getPreviousChecksums() {
54
54
  const checksumFilePath = getChecksumFilePath();
@@ -57,7 +57,7 @@ async function getPreviousChecksums() {
57
57
  }
58
58
  try {
59
59
  const previousChecksums = JSON.parse(await readFile(checksumFilePath, "utf-8")).map((r) => ({
60
- path: path.join(Sonamu.apiRootPath, r.path),
60
+ path: path.join(Sonamu.appRootPath, r.path),
61
61
  checksum: r.checksum
62
62
  }));
63
63
  return previousChecksums;
@@ -71,10 +71,11 @@ function getChecksumFilePath() {
71
71
  }
72
72
  async function saveChecksums(checksums) {
73
73
  const checksumFilePath = getChecksumFilePath();
74
- await writeFile(checksumFilePath, JSON.stringify(checksums.map((r) => ({
75
- path: path.relative(Sonamu.apiRootPath, r.path),
74
+ const serialized = checksums.map((r) => ({
75
+ path: path.relative(Sonamu.appRootPath, r.path),
76
76
  checksum: r.checksum
77
- })), null, 2), "utf-8");
77
+ })).sort((a, b) => a.path.localeCompare(b.path));
78
+ await writeFile(checksumFilePath, JSON.stringify(serialized, null, 2), "utf-8");
78
79
  }
79
80
  async function getChecksumOfFile(filePath) {
80
81
  return new Promise((resolve, reject) => {
@@ -100,4 +101,4 @@ var init_checksum = __esmMin((() => {
100
101
  //#endregion
101
102
  init_checksum();
102
103
  export { findChangedFilesUsingChecksums, init_checksum, renewChecksums };
103
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzdW0uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9jaGVja3N1bS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IHR5cGUgQmluYXJ5TGlrZSB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0gfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHR5cGUgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCwgdHlwZSBBcGlSZWxhdGl2ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgZGlmZmVyZW5jZVdpdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5cbnR5cGUgUGF0aEFuZENoZWNrc3VtID0ge1xuICBwYXRoOiBBYnNvbHV0ZVBhdGg7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l65CcIOuCtOyaqeqzvCDtmITsnqwg7Iuk7KCcIO2MjOydvOydmCDssrTtgazshKzsnYQg67mE6rWQ7ZWY7JesIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7Iq164uI64ukLlxuICogQHJldHVybnMg67OA6rK965CcIO2MjOydvCDqsr3roZwg67Cw7Je0LiDtlITroZzsoJ3tirgg66Oo7Yq467aA7YSwIOyKrOuemOyLnOuhnCDsi5zsnpHtlanri4jri6QuIOyYiOyLnDogXCIvc3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCBjYWxjdWxhdGVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0Q3VycmVudENoZWNrc3VtcygpO1xuICBjb25zdCBzYXZlZENoZWNrc3VtcyA9IGF3YWl0IGdldFByZXZpb3VzQ2hlY2tzdW1zKCk7XG5cbiAgY29uc3QgaXNTYW1lID0gZXF1YWwoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMpO1xuICBpZiAoaXNTYW1lKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIGRpZmZlcmVuY2VXaXRoKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zLCBpc0VxdWFsKS5tYXAoKHIpID0+IHIucGF0aCk7XG59XG5cbi8qKlxuICog7LK07YGs7ISs7J2EIOqwseyLoO2VqeuLiOuLpC5cbiAqIO2YhOyerCDtjIzsnbzrk6TsnZgg7LK07YGs7ISs7J2EIOqzhOyCsO2VtOyEnCDqtaztlZwg64uk7J2MLCDssrTtgazshKwg7YyM7J287JeQIOyggOyepeuQnCDrgrTsmqnqs7wg64uk66W066m0IOyytO2BrOyErCDtjIzsnbzsnYQg6rCx7Iug7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNhbGN1bGF0ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRDdXJyZW50Q2hlY2tzdW1zKCk7XG4gIGNvbnN0IHNhdmVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0UHJldmlvdXNDaGVja3N1bXMoKTtcblxuICBjb25zdCBpc1NhbWUgPSBlcXVhbChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3Vtcyk7XG4gIGlmIChpc1NhbWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBzYXZlQ2hlY2tzdW1zKGNhbGN1bGF0ZWRDaGVja3N1bXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50Q2hlY2tzdW1zKCk6IFByb21pc2U8UGF0aEFuZENoZWNrc3VtW10+IHtcbiAgY29uc3QgZmlsZVBhdGhzID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCgpKS5tYXAoYXN5bmMgKFtfZmlsZVR5cGUsIHBhdHRlcm5dKSA9PiB7XG4gICAgICAgIHJldHVybiBnbG9iQXN5bmMocGF0dGVybikgYXMgUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT47XG4gICAgICB9KSxcbiAgICApXG4gIClcbiAgICAuZmxhdCgpXG4gICAgLnRvU29ydGVkKCk7XG5cbiAgY29uc3QgZmlsZUNoZWNrc3VtcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVQYXRocy5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgY2hlY2tzdW06IGF3YWl0IGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoKSxcbiAgICAgIH07XG4gICAgfSksXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVDaGVja3N1bXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByZXZpb3VzQ2hlY2tzdW1zKCk6IFByb21pc2U8UGF0aEFuZENoZWNrc3VtW10+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGNoZWNrc3VtRmlsZVBhdGgpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJldmlvdXNDaGVja3N1bXMgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGNoZWNrc3VtRmlsZVBhdGgsIFwidXRmLThcIikpLm1hcChcbiAgICAgIChyOiB7IHBhdGg6IEFwaVJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgICAgICBwYXRoOiBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQ7IScIOydveydhCDrlYw6IEFQSSDsg4HrjIAg6rK966GcIOKGkiDsoIjrjIAg6rK966GcXG4gICAgICAgIGNoZWNrc3VtOiByLmNoZWNrc3VtLFxuICAgICAgfSksXG4gICAgKSBhcyBQYXRoQW5kQ2hlY2tzdW1bXTtcbiAgICByZXR1cm4gcHJldmlvdXNDaGVja3N1bXM7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyDssrTtgazshKwg7YyM7J287J20IOyGkOyDgeuQnCDqsr3smrAg67mIIOuwsOyXtCDrsJjtmZggKOyghOyytCDsnqzrj5nquLDtmZQg7Jyg64+EKVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGDssrTtgazshKwg7YyM7J28KCR7Y2hlY2tzdW1GaWxlUGF0aH0p7J2EIO2MjOyLse2VmOuKlCDrjbAg7Iuk7Yyo7ZaI7Iq164uI64ukLiDsoITssrQg7J6s64+Z6riw7ZmU66W8IOynhO2Wie2VqeuLiOuLpC5gLFxuICAgICAgZSxcbiAgICApO1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDaGVja3N1bUZpbGVQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gIHJldHVybiBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNvbmFtdS5sb2NrXCIpIGFzIEFic29sdXRlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUNoZWNrc3VtcyhjaGVja3N1bXM6IFBhdGhBbmRDaGVja3N1bVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNoZWNrc3VtRmlsZVBhdGggPSBnZXRDaGVja3N1bUZpbGVQYXRoKCk7XG4gIGF3YWl0IHdyaXRlRmlsZShcbiAgICBjaGVja3N1bUZpbGVQYXRoLFxuICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgY2hlY2tzdW1zLm1hcCgocikgPT4gKHtcbiAgICAgICAgcGF0aDogcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHIucGF0aCksIC8vIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l7ZWgIOuVjDog7KCI64yAIOqyveuhnCDihpIgQVBJIOyDgeuMgCDqsr3roZxcbiAgICAgICAgY2hlY2tzdW06IHIuY2hlY2tzdW0sXG4gICAgICB9KSksXG4gICAgICBudWxsLFxuICAgICAgMixcbiAgICApLFxuICAgIFwidXRmLThcIixcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hlY2tzdW1PZkZpbGUoZmlsZVBhdGg6IFBhdGhMaWtlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTFcIik7XG4gICAgY29uc3QgaW5wdXQgPSBjcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKTtcbiAgICBpbnB1dC5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgaW5wdXQub24oXCJkYXRhXCIsIChjaHVuazogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoY2h1bmspO1xuICAgIH0pO1xuICAgIGlucHV0Lm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgcmVzb2x2ZShoYXNoLmRpZ2VzdChc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
104
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzdW0uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9jaGVja3N1bS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvLCB7IHR5cGUgQmluYXJ5TGlrZSB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIHR5cGUgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCwgdHlwZSBBcHBSZWxhdGl2ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgZGlmZmVyZW5jZVdpdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgsIEdMT0JfRVhDTFVERSB9IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcblxudHlwZSBQYXRoQW5kQ2hlY2tzdW0gPSB7XG4gIHBhdGg6IEFic29sdXRlUGF0aDtcbiAgY2hlY2tzdW06IHN0cmluZztcbn07XG5cbi8qKlxuICog7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IO2YhOyerCDsi6TsoJwg7YyM7J287J2YIOyytO2BrOyErOydhCDruYTqtZDtlZjsl6wg67OA6rK965CcIO2MjOydvOydhCDssL7sirXri4jri6QuXG4gKiBAcmV0dXJucyDrs4Dqsr3rkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuIO2UhOuhnOygne2KuCDro6jtirjrtoDthLAg7Iqs656Y7Iuc66GcIOyLnOyeke2VqeuLiOuLpC4g7JiI7IucOiBcIi9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIGNvbnN0IGNhbGN1bGF0ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRDdXJyZW50Q2hlY2tzdW1zKCk7XG4gIGNvbnN0IHNhdmVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0UHJldmlvdXNDaGVja3N1bXMoKTtcblxuICBjb25zdCBpc1NhbWUgPSBlcXVhbChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3Vtcyk7XG4gIGlmIChpc1NhbWUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gZGlmZmVyZW5jZVdpdGgoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMsIGlzRXF1YWwpLm1hcCgocikgPT4gci5wYXRoKTtcbn1cblxuLyoqXG4gKiDssrTtgazshKzsnYQg6rCx7Iug7ZWp64uI64ukLlxuICog7ZiE7J6sIO2MjOydvOuTpOydmCDssrTtgazshKzsnYQg6rOE7IKw7ZW07IScIOq1rO2VnCDri6TsnYwsIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l65CcIOuCtOyaqeqzvCDri6TrpbTrqbQg7LK07YGs7ISsIO2MjOydvOydhCDqsLHsi6Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FsY3VsYXRlZENoZWNrc3VtcyA9IGF3YWl0IGdldEN1cnJlbnRDaGVja3N1bXMoKTtcbiAgY29uc3Qgc2F2ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRQcmV2aW91c0NoZWNrc3VtcygpO1xuXG4gIGNvbnN0IGlzU2FtZSA9IGVxdWFsKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zKTtcbiAgaWYgKGlzU2FtZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNhdmVDaGVja3N1bXMoY2FsY3VsYXRlZENoZWNrc3Vtcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDaGVja3N1bXMoKTogUHJvbWlzZTxQYXRoQW5kQ2hlY2tzdW1bXT4ge1xuICBjb25zdCBhbGxQYXRocyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkubWFwKChbX2ZpbGVUeXBlLCBwYXR0ZXJuXSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2xvYkFzeW5jKHBhdHRlcm4sIHsgZXhjbHVkZTogR0xPQl9FWENMVURFIH0pO1xuICAgICAgfSksXG4gICAgKVxuICApLmZsYXQoKTtcblxuICAvLyDrj5nsnbwg7YyM7J287J20IOyXrOufrCDtjKjthLTsl5Ag66ek7LmY65CgIOyImCDsnojsnLzrr4DroZwo7JiIOiBzZC5nZW5lcmF0ZWQudHPripQgZ2VuZXJhdGVk7JmAIHNkR2VuZXJhdGVk7JeQIOuqqOuRkCDrp6TsuZgpXG4gIC8vIOykkeuztSDsoJzqsbAg7ZuEIOyViOyglSDsoJXroKwuXG4gIGNvbnN0IGZpbGVQYXRocyA9IEFycmF5LmZyb20obmV3IFNldChhbGxQYXRocykpLnRvU29ydGVkKCkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVQYXRocy5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgY2hlY2tzdW06IGF3YWl0IGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoKSxcbiAgICAgIH07XG4gICAgfSksXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByZXZpb3VzQ2hlY2tzdW1zKCk6IFByb21pc2U8UGF0aEFuZENoZWNrc3VtW10+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGNoZWNrc3VtRmlsZVBhdGgpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJldmlvdXNDaGVja3N1bXMgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGNoZWNrc3VtRmlsZVBhdGgsIFwidXRmLThcIikpLm1hcChcbiAgICAgIChyOiB7IHBhdGg6IEFwcFJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgICAgICBwYXRoOiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQ7IScIOydveydhCDrlYw6IGFwcFJvb3Qg7IOB64yAIOqyveuhnCDihpIg7KCI64yAIOqyveuhnFxuICAgICAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgICAgIH0pLFxuICAgICkgYXMgUGF0aEFuZENoZWNrc3VtW107XG4gICAgcmV0dXJuIHByZXZpb3VzQ2hlY2tzdW1zO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8g7LK07YGs7ISsIO2MjOydvOydtCDshpDsg4HrkJwg6rK97JqwIOu5iCDrsLDsl7Qg67CY7ZmYICjsoITssrQg7J6s64+Z6riw7ZmUIOycoOuPhClcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBg7LK07YGs7ISsIO2MjOydvCgke2NoZWNrc3VtRmlsZVBhdGh9KeydhCDtjIzsi7HtlZjripQg642wIOyLpO2MqO2WiOyKteuLiOuLpC4g7KCE7LK0IOyerOuPmeq4sO2ZlOulvCDsp4Ttlontlanri4jri6QuYCxcbiAgICAgIGUsXG4gICAgKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzb25hbXUubG9ja1wiKSBhcyBBYnNvbHV0ZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDaGVja3N1bXMoY2hlY2tzdW1zOiBQYXRoQW5kQ2hlY2tzdW1bXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjaGVja3N1bUZpbGVQYXRoID0gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpO1xuICAvLyBhcHBSb290IOyDgeuMgCDqsr3roZzroZwg7KeB66Cs7ZmUICsg7JWM7YyM67KzIOyViOyglSDsoJXroKwgKFBSIGRpZmYg6rmo64GX7ZWY6rKMIOycoOyngClcbiAgY29uc3Qgc2VyaWFsaXplZCA9IGNoZWNrc3Vtc1xuICAgIC5tYXAoKHIpID0+ICh7XG4gICAgICBwYXRoOiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgci5wYXRoKSwgLy8g7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXtlaAg65WMOiDsoIjrjIAg6rK966GcIOKGkiBhcHBSb290IOyDgeuMgCDqsr3roZxcbiAgICAgIGNoZWNrc3VtOiByLmNoZWNrc3VtLFxuICAgIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGNoZWNrc3VtRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDaGVja3N1bU9mRmlsZShmaWxlUGF0aDogUGF0aExpa2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgICBjb25zdCBpbnB1dCA9IGNyZWF0ZVJlYWRTdHJlYW0oZmlsZVBhdGgpO1xuICAgIGlucHV0Lm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICBpbnB1dC5vbihcImRhdGFcIiwgKGNodW5rOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShjaHVuayk7XG4gICAgfSk7XG4gICAgaW5wdXQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKGhhc2guZGlnZXN0KFwiaGV4XCIpKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxlQUFzQixpQ0FBMEQ7Q0FDOUUsTUFBTSxzQkFBc0IsTUFBTSxxQkFBcUI7Q0FDdkQsTUFBTSxpQkFBaUIsTUFBTSxzQkFBc0I7Q0FFbkQsTUFBTSxTQUFTLE1BQU0scUJBQXFCLGVBQWU7QUFDekQsS0FBSSxRQUFRO0FBQ1YsU0FBTyxFQUFFOztBQUdYLFFBQU8sZUFBZSxxQkFBcUIsZ0JBQWdCLFFBQVEsQ0FBQyxLQUFLLE1BQU0sRUFBRSxLQUFLOzs7Ozs7QUFPeEYsZUFBc0IsaUJBQWdDO0NBQ3BELE1BQU0sc0JBQXNCLE1BQU0scUJBQXFCO0NBQ3ZELE1BQU0saUJBQWlCLE1BQU0sc0JBQXNCO0NBRW5ELE1BQU0sU0FBUyxNQUFNLHFCQUFxQixlQUFlO0FBQ3pELEtBQUksUUFBUTtBQUNWOztBQUdGLE9BQU0sY0FBYyxvQkFBb0I7O0FBRzFDLGVBQWUsc0JBQWtEO0NBQy9ELE1BQU0sWUFDSixNQUFNLFFBQVEsSUFDWixPQUFPLFFBQVEsdUNBQXVDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxhQUFhO0FBQ3BGLFNBQU8sVUFBVSxTQUFTLEVBQUUsU0FBUyxjQUFjLENBQUM7R0FDcEQsQ0FDSCxFQUNELE1BQU07Q0FJUixNQUFNLFlBQVksTUFBTSxLQUFLLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxVQUFVO0FBRTFELFFBQU8sTUFBTSxRQUFRLElBQ25CLFVBQVUsSUFBSSxPQUFPLGFBQWE7QUFDaEMsU0FBTztHQUNMLE1BQU07R0FDTixVQUFVLE1BQU0sa0JBQWtCLFNBQVM7R0FDNUM7R0FDRCxDQUNIOztBQUdILGVBQWUsdUJBQW1EO0NBQ2hFLE1BQU0sbUJBQW1CLHFCQUFxQjtBQUM5QyxLQUFJLENBQUUsTUFBTSxPQUFPLGlCQUFpQixFQUFHO0FBQ3JDLFNBQU8sRUFBRTs7QUFHWCxLQUFJO0VBQ0YsTUFBTSxvQkFBb0IsS0FBSyxNQUFNLE1BQU0sU0FBUyxrQkFBa0IsUUFBUSxDQUFDLENBQUMsS0FDN0UsT0FBb0Q7R0FDbkQsTUFBTSxLQUFLLEtBQUssT0FBTyxhQUFhLEVBQUUsS0FBSztHQUMzQyxVQUFVLEVBQUU7R0FDYixFQUNGO0FBQ0QsU0FBTztVQUNBLEdBQUc7QUFFVixVQUFRLEtBQ04sVUFBVSxpQkFBaUIsb0NBQzNCLEVBQ0Q7QUFDRCxTQUFPLEVBQUU7OztBQUliLFNBQVMsc0JBQW9DO0FBQzNDLFFBQU8sS0FBSyxLQUFLLE9BQU8sYUFBYSxjQUFjOztBQUdyRCxlQUFlLGNBQWMsV0FBNkM7Q0FDeEUsTUFBTSxtQkFBbUIscUJBQXFCO0NBRTlDLE1BQU0sYUFBYSxVQUNoQixLQUFLLE9BQU87RUFDWCxNQUFNLEtBQUssU0FBUyxPQUFPLGFBQWEsRUFBRSxLQUFLO0VBQy9DLFVBQVUsRUFBRTtFQUNiLEVBQUUsQ0FDRixNQUFNLEdBQUcsTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFFLEtBQUssQ0FBQztBQUMvQyxPQUFNLFVBQVUsa0JBQWtCLEtBQUssVUFBVSxZQUFZLE1BQU0sRUFBRSxFQUFFLFFBQVE7O0FBR2pGLGVBQWUsa0JBQWtCLFVBQXFDO0FBQ3BFLFFBQU8sSUFBSSxTQUFpQixTQUFTLFdBQVc7RUFDOUMsTUFBTSxPQUFPLE9BQU8sV0FBVyxPQUFPO0VBQ3RDLE1BQU0sUUFBUSxpQkFBaUIsU0FBUztBQUN4QyxRQUFNLEdBQUcsU0FBUyxPQUFPO0FBQ3pCLFFBQU0sR0FBRyxTQUFTLFVBQXNCO0FBQ3RDLFFBQUssT0FBTyxNQUFNO0lBQ2xCO0FBQ0YsUUFBTSxHQUFHLGVBQWU7QUFDdEIsV0FBUSxLQUFLLE9BQU8sTUFBTSxDQUFDO0lBQzNCO0dBQ0Y7OztjQXRIbUM7bUJBQ1U7Z0JBQ047YUFFSztxQkFDc0MifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/syncer/code-generator.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,WAAW,EAC1D,GAAG,EAAE,CAAC,EACN,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,EACnC,gBAAgB,CAAC,EAAE,eAAe,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CAyCzB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,eAAe,EAClE,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC,CAoBxB"}
1
+ {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/syncer/code-generator.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,WAAW,EAC1D,GAAG,EAAE,CAAC,EACN,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,EACnC,gBAAgB,CAAC,EAAE,eAAe,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CAyCzB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,eAAe,EAClE,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC,CAoBxB"}
@@ -2,15 +2,16 @@ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
2
  import { SD, init_sd } from "../dict/sd.js";
3
3
  import { AlreadyProcessedException, init_so_exceptions } from "../exceptions/so-exceptions.js";
4
4
  import { init_controller, isTest } from "../utils/controller.js";
5
+ import { everyAsync, filterAsync, init_async_utils } from "../utils/async-utils.js";
6
+ import { formatCode, init_formatter } from "../utils/formatter.js";
5
7
  import { exists, init_fs_utils } from "../utils/fs-utils.js";
6
8
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
7
- import { everyAsync, filterAsync, init_async_utils } from "../utils/async-utils.js";
8
9
  import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
9
10
  import { Naite, init_naite } from "../naite/naite.js";
10
- import { formatCode, init_formatter } from "../utils/formatter.js";
11
11
  import { TemplateManager, init_template_manager } from "../template/template-manager.js";
12
12
  import { BUILT_IN_TYPES, init_zod_converter } from "../template/zod-converter.js";
13
13
  import { init_lodash_able, wrapIf } from "../utils/lodash-able.js";
14
+ import { init_file_tracking, trackWritten } from "./file-tracking.js";
14
15
  import { unique } from "radashi";
15
16
  import { mkdir, writeFile } from "fs/promises";
16
17
  import path from "path";
@@ -118,7 +119,7 @@ async function resolveRenderedTemplate(key, result) {
118
119
  header,
119
120
  body
120
121
  });
121
- const formatted$1 = await formatCode([header, body].join("\n\n"), key === "entity" ? "json" : "typescript", `${Sonamu.appRootPath}/${filePath}`);
122
+ const formatted$1 = await formatCode([header, body].join("\n\n"), `${Sonamu.appRootPath}/${filePath}`);
122
123
  Naite.t(`resolveRenderedTemplate:formatted:${key}`, formatted$1);
123
124
  return formatted$1;
124
125
  }
@@ -139,6 +140,7 @@ async function writeCodeToPathEachTarget(pathAndCode) {
139
140
  await mkdir(dir, { recursive: true });
140
141
  }
141
142
  await writeFile(dstFilePath, pathAndCode.code);
143
+ await trackWritten(dstFilePath);
142
144
  !isTest() && console.log(chalk.bold("Generated: ") + chalk.blue(`${dstFilePath.replace(`${appRootPath}/`, "")}`));
143
145
  return dstFilePath;
144
146
  }));
@@ -156,9 +158,10 @@ var init_code_generator = __esmMin((() => {
156
158
  init_formatter();
157
159
  init_fs_utils();
158
160
  init_lodash_able();
161
+ init_file_tracking();
159
162
  }));
160
163
 
161
164
  //#endregion
162
165
  init_code_generator();
163
166
  export { generateTemplate, init_code_generator, renderTemplate };
164
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1nZW5lcmF0b3IuanMiLCJuYW1lcyI6WyJrZXlzOiBUZW1wbGF0ZUtleVtdIiwia2V5IiwiZmlsdGVyZWRQYXRoQW5kQ29kZXM6IFBhdGhBbmRDb2RlW10iLCJwcmVUZW1wbGF0ZVJlc29sdmVkOiBQYXRoQW5kQ29kZVtdIiwib3B0aW9ucyIsImZvcm1hdHRlZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY29kZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgUmVuZGVyZWRUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZS90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IEJVSUxUX0lOX1RZUEVTIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3pvZC1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVPcHRpb25zLFxuICB0eXBlIFBhdGhBbmRDb2RlLFxuICB0eXBlIFRlbXBsYXRlS2V5LFxuICB0eXBlIFRlbXBsYXRlT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBldmVyeUFzeW5jLCBmaWx0ZXJBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHdyYXBJZiB9IGZyb20gXCIuLi91dGlscy9sb2Rhc2gtYWJsZVwiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG4vKipcbiAqIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlZjqs6Ag7YyM7J2866GcIOyDneyEse2VqeuLiOuLpC5cbiAqIG92ZXJ3cml0ZSDsmLXshZjsnbQgZmFsc2Xsnbgg6rK97JqwLCDsnbTrr7gg7KG07J6s7ZWY64qUIO2MjOydvOydgCDqsbTrhIjrnIHri4jri6QuXG4gKiBAcGFyYW0ga2V5IC0g7YWc7ZSM66a/IO2CpCAo7JiIOiBcImVudGl0eVwiLCBcIm1vZGVsXCIsIFwic2VydmljZVwiIOuTsSlcbiAqIEBwYXJhbSB0ZW1wbGF0ZU9wdGlvbnMgLSDthZztlIzrpr8g66CM642U66eB7JeQIO2VhOyalO2VnCDsmLXshZhcbiAqIEBwYXJhbSBfZ2VuZXJhdGVPcHRpb25zIC0g7IOd7ISxIOyYteyFmCAob3ZlcndyaXRlIOyXrOu2gClcbiAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICBrZXk6IFQsXG4gIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCBnZW5lcmF0ZU9wdGlvbnMgPSB7XG4gICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAuLi5fZ2VuZXJhdGVPcHRpb25zLFxuICB9O1xuICBOYWl0ZS50KFwiZ2VuZXJhdGVUZW1wbGF0ZVwiLCB7IGtleSwgdGVtcGxhdGVPcHRpb25zLCBnZW5lcmF0ZU9wdGlvbnMgfSk7XG5cbiAgLy8g7YKkIGNoaWxkcmVuXG4gIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBba2V5XTtcblxuICAvLyDthZztlIzrpr8g66CM642UXG4gIGNvbnN0IHBhdGhBbmRDb2RlcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKS5mbGF0KCk7XG5cbiAgY29uc3QgZmlsdGVyZWRQYXRoQW5kQ29kZXM6IFBhdGhBbmRDb2RlW10gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChnZW5lcmF0ZU9wdGlvbnMub3ZlcndyaXRlKSB7XG4gICAgICByZXR1cm4gcGF0aEFuZENvZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgZmlsdGVyQXN5bmMocGF0aEFuZENvZGVzLCBhc3luYyAocGF0aEFuZENvZGUpID0+IHtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7U29uYW11LmFwcFJvb3RQYXRofS8ke3BhdGhBbmRDb2RlLnBhdGh9YDtcbiAgICAgICAgY29uc3QgZHN0RmlsZVBhdGhzID0gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4gZmlsZVBhdGgucmVwbGFjZShcIi86dGFyZ2V0L1wiLCBgLyR7dGFyZ2V0fS9gKSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBldmVyeUFzeW5jKGRzdEZpbGVQYXRocywgYXN5bmMgKGRzdFBhdGgpID0+ICEoYXdhaXQgZXhpc3RzKGRzdFBhdGgpKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKGZpbHRlcmVkUGF0aEFuZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmFsbEZpbGVzRXhpc3RcIikpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkUGF0aEFuZENvZGVzLm1hcCgocGF0aEFuZENvZGUpID0+IHdyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQocGF0aEFuZENvZGUpKSxcbiAgICApXG4gICkuZmxhdCgpO1xufVxuXG4vKipcbiAqIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlZjsl6wgUGF0aEFuZENvZGUg6rCd7LK066W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAqIO2MjOydvOuhnCDsk7Dsp4Ag7JWK6rOgIOuplOuqqOumrOyDgeyXkOyEnOunjCDroIzrjZTrp4Htlanri4jri6QuXG4gKiBAcGFyYW0ga2V5IC0g7YWc7ZSM66a/IO2CpFxuICogQHBhcmFtIG9wdGlvbnMgLSDthZztlIzrpr8g66CM642U66eBIOyYteyFmFxuICogQHJldHVybnMg6rK966Gc7JmAIOy9lOuTnCDsjI3snZgg67Cw7Je0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAga2V5OiBULFxuICBvcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4pOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgTmFpdGUudChcInJlbmRlclRlbXBsYXRlXCIsIHsga2V5LCBvcHRpb25zIH0pO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldChrZXkpO1xuXG4gIGNvbnN0IHJlbmRlcmVkID0gYXdhaXQgdGVtcGxhdGUucmVuZGVyKG9wdGlvbnMpO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVSZW5kZXJlZFRlbXBsYXRlKGtleSwgcmVuZGVyZWQpO1xuXG4gIGxldCBwcmVUZW1wbGF0ZVJlc29sdmVkOiBQYXRoQW5kQ29kZVtdID0gW107XG4gIGlmIChyZW5kZXJlZC5wcmVUZW1wbGF0ZXMpIHtcbiAgICBwcmVUZW1wbGF0ZVJlc29sdmVkID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJlbmRlcmVkLnByZVRlbXBsYXRlcy5tYXAoKHsga2V5LCBvcHRpb25zIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVuZGVyVGVtcGxhdGUoa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG4gIH1cblxuICByZXR1cm4gW3Jlc29sdmVkLCAuLi5wcmVUZW1wbGF0ZVJlc29sdmVkXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGUoXG4gIGtleTogVGVtcGxhdGVLZXksXG4gIHJlc3VsdDogUmVuZGVyZWRUZW1wbGF0ZSxcbik6IFByb21pc2U8UGF0aEFuZENvZGU+IHtcbiAgTmFpdGUudChgcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGUke2tleX1gLCB7IGtleSwgcmVzdWx0IH0pO1xuXG4gIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBmaWxlUGF0aCwgYm9keSwgaW1wb3J0S2V5cywgY3VzdG9tSGVhZGVycyB9ID0gcmVzdWx0O1xuXG4gIC8vIGltcG9ydCDtlaAg64yA7IOB7J2YIOuMgOyDgSBwYXRoIOy2lOy2nFxuICBjb25zdCBidWlsdEluU2NoZW1hTmFtZXMgPSBPYmplY3QudmFsdWVzKEJVSUxUX0lOX1RZUEVTKS5tYXAoKGluZm8pID0+IGluZm8uc2NoZW1hTmFtZSBhcyBzdHJpbmcpO1xuICBjb25zdCBpbXBvcnREZWZzID0gaW1wb3J0S2V5c1xuICAgIC8vIOuCtOyepSDtg4DsnoUg7Iqk7YKk66eI64qUIOydtOuvuCBzb25hbXXsl5DshJwgaW1wb3J065CY66+A66GcIOygnOyZuFxuICAgIC5maWx0ZXIoKGltcG9ydEtleSkgPT4gIWJ1aWx0SW5TY2hlbWFOYW1lcy5pbmNsdWRlcyhpbXBvcnRLZXkpKVxuICAgIC5yZWR1Y2UoXG4gICAgICAociwgaW1wb3J0S2V5KSA9PiB7XG4gICAgICAgIGxldCBtb2R1bGVQYXRoID0gaW1wb3J0S2V5O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vZHVsZVBhdGggPSBFbnRpdHlNYW5hZ2VyLmdldE1vZHVsZVBhdGgoaW1wb3J0S2V5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW3Jlc29sdmVSZW5kZXJlZFRlbXBsYXRlOiR7a2V5fV0gJHtpbXBvcnRLZXl9IOuqqOuTiCDqsr3roZwg7LC+6riwIOyLpO2MqDogJHtlcnJvcn1gLFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbXBvcnRQYXRoID0gbW9kdWxlUGF0aDtcbiAgICAgICAgaWYgKG1vZHVsZVBhdGguaW5jbHVkZXMoXCIvXCIpIHx8IG1vZHVsZVBhdGguaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgaW1wb3J0UGF0aCA9IHdyYXBJZihwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShmaWxlUGF0aCksIG1vZHVsZVBhdGgpLCAocCkgPT4gW1xuICAgICAgICAgICAgIXAuc3RhcnRzV2l0aChcIi5cIiksXG4gICAgICAgICAgICBgLi8ke3B9YCxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOqwmeydgCDtjIzsnbzsl5DshJwgaW1wb3J0IO2VmOuKlCDqsr3smrAga2V5cyDroZwg64KY7Je0IOyymOumrFxuICAgICAgICBjb25zdCBleGlzdHNPbmUgPSByLmZpbmQoKGltcG9ydERlZikgPT4gaW1wb3J0RGVmLmZyb20gPT09IGltcG9ydFBhdGgpO1xuICAgICAgICBpZiAoZXhpc3RzT25lKSB7XG4gICAgICAgICAgZXhpc3RzT25lLmtleXMgPSB1bmlxdWUoZXhpc3RzT25lLmtleXMuY29uY2F0KGltcG9ydEtleSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHIucHVzaCh7XG4gICAgICAgICAgICBrZXlzOiBbaW1wb3J0S2V5XSxcbiAgICAgICAgICAgIGZyb206IGltcG9ydFBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAgW10gYXMge1xuICAgICAgICBrZXlzOiBzdHJpbmdbXTtcbiAgICAgICAgZnJvbTogc3RyaW5nO1xuICAgICAgfVtdLFxuICAgIClcbiAgICAvLyDshYDtlIQg7LC47KGwIOuwqeyngFxuICAgIC5maWx0ZXIoKGltcG9ydERlZikgPT4gIWZpbGVQYXRoLmVuZHNXaXRoKGAke2ltcG9ydERlZi5mcm9tLnJlcGxhY2UoXCIuL1wiLCBcIlwiKX0udHNgKSk7XG5cbiAgLy8g7Luk7Iqk7YWAIO2XpOuNlCDtj6ztlajtlZjsl6wg7Zek642UIOyDneyEsVxuICBjb25zdCBoZWFkZXIgPSBbXG4gICAgLi4uKGN1c3RvbUhlYWRlcnMgPz8gW10pLFxuICAgIC4uLmltcG9ydERlZnMubWFwKFxuICAgICAgKGltcG9ydERlZikgPT4gYGltcG9ydCB7ICR7aW1wb3J0RGVmLmtleXMuam9pbihcIiwgXCIpfSB9IGZyb20gJyR7aW1wb3J0RGVmLmZyb219J2AsXG4gICAgKSxcbiAgXS5qb2luKFwiXFxuXCIpO1xuXG4gIGNvbnN0IGZvcm1hdHRlZCA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKGtleSA9PT0gXCJnZW5lcmF0ZWRfaHR0cFwiKSB7XG4gICAgICByZXR1cm4gW2hlYWRlciwgYm9keV0uam9pbihcIlxcblxcblwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTmFpdGUudChcInJlc29sdmVSZW5kZXJlZFRlbXBsYXRlOmJlZm9yZUZvcm1hdFwiLCB7IGtleSwgaGVhZGVyLCBib2R5IH0pO1xuICAgICAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShcbiAgICAgICAgW2hlYWRlciwgYm9keV0uam9pbihcIlxcblxcblwiKSxcbiAgICAgICAga2V5ID09PSBcImVudGl0eVwiID8gXCJqc29uXCIgOiBcInR5cGVzY3JpcHRcIixcbiAgICAgICAgYCR7U29uYW11LmFwcFJvb3RQYXRofS8ke2ZpbGVQYXRofWAsXG4gICAgICApO1xuICAgICAgTmFpdGUudChgcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGU6Zm9ybWF0dGVkOiR7a2V5fWAsIGZvcm1hdHRlZCk7XG4gICAgICByZXR1cm4gZm9ybWF0dGVkO1xuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4ge1xuICAgIHBhdGg6IGAke3RhcmdldH0vJHtmaWxlUGF0aH1gLFxuICAgIGNvZGU6IGZvcm1hdHRlZCxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDb2RlVG9QYXRoRWFjaFRhcmdldChwYXRoQW5kQ29kZTogUGF0aEFuZENvZGUpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICBjb25zdCB7IGFwcFJvb3RQYXRoIH0gPSBTb25hbXU7XG4gIGNvbnN0IGZpbGVQYXRoID0gYCR7U29uYW11LmFwcFJvb3RQYXRofS8ke3BhdGhBbmRDb2RlLnBhdGh9YCBhcyBBYnNvbHV0ZVBhdGg7XG5cbiAgY29uc3QgZHN0RmlsZVBhdGhzID0gdW5pcXVlKFxuICAgIHRhcmdldHMubWFwKCh0YXJnZXQpID0+IGZpbGVQYXRoLnJlcGxhY2UoXCIvOnRhcmdldC9cIiwgYC8ke3RhcmdldH0vYCkpIGFzIEFic29sdXRlUGF0aFtdLFxuICApO1xuICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZHN0RmlsZVBhdGhzLm1hcChhc3luYyAoZHN0RmlsZVBhdGgpID0+IHtcbiAgICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RGaWxlUGF0aCk7XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMoZGlyKSkpIHtcbiAgICAgICAgYXdhaXQgbWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShkc3RGaWxlUGF0aCwgcGF0aEFuZENvZGUuY29kZSk7XG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuYm9sZChcIkdlbmVyYXRlZDogXCIpICsgY2hhbGsuYmx1ZShgJHtkc3RGaWxlUGF0aC5yZXBsYWNlKGAke2FwcFJvb3RQYXRofS9gLCBcIlwiKX1gKSxcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBkc3RGaWxlUGF0aDtcbiAgICB9KSxcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUNBLGVBQXNCLGlCQUNwQixLQUNBLGlCQUNBLGtCQUN5QjtDQUN6QixNQUFNLGtCQUFrQjtFQUN0QixXQUFXO0VBQ1gsR0FBRztFQUNKO0FBQ0QsT0FBTSxFQUFFLG9CQUFvQjtFQUFFO0VBQUs7RUFBaUI7RUFBaUIsQ0FBQztDQUd0RSxNQUFNQSxPQUFzQixDQUFDLElBQUk7Q0FHakMsTUFBTSxnQkFDSixNQUFNLFFBQVEsSUFDWixLQUFLLElBQUksT0FBTyxVQUFRO0FBQ3RCLFNBQU8sTUFBTSxlQUFlQyxPQUFLLGdCQUFnQjtHQUNqRCxDQUNILEVBQ0QsTUFBTTtDQUVSLE1BQU1DLHVCQUFzQyxPQUFPLFlBQVk7QUFDN0QsTUFBSSxnQkFBZ0IsV0FBVztBQUM3QixVQUFPO1NB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
167
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1nZW5lcmF0b3IuanMiLCJuYW1lcyI6WyJrZXlzOiBUZW1wbGF0ZUtleVtdIiwia2V5IiwiZmlsdGVyZWRQYXRoQW5kQ29kZXM6IFBhdGhBbmRDb2RlW10iLCJwcmVUZW1wbGF0ZVJlc29sdmVkOiBQYXRoQW5kQ29kZVtdIiwib3B0aW9ucyIsImZvcm1hdHRlZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY29kZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgUmVuZGVyZWRUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZS90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IEJVSUxUX0lOX1RZUEVTIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3pvZC1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVPcHRpb25zLFxuICB0eXBlIFBhdGhBbmRDb2RlLFxuICB0eXBlIFRlbXBsYXRlS2V5LFxuICB0eXBlIFRlbXBsYXRlT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBldmVyeUFzeW5jLCBmaWx0ZXJBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHdyYXBJZiB9IGZyb20gXCIuLi91dGlscy9sb2Rhc2gtYWJsZVwiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgdHJhY2tXcml0dGVuIH0gZnJvbSBcIi4vZmlsZS10cmFja2luZ1wiO1xuXG4vKipcbiAqIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlZjqs6Ag7YyM7J2866GcIOyDneyEse2VqeuLiOuLpC5cbiAqIG92ZXJ3cml0ZSDsmLXshZjsnbQgZmFsc2Xsnbgg6rK97JqwLCDsnbTrr7gg7KG07J6s7ZWY64qUIO2MjOydvOydgCDqsbTrhIjrnIHri4jri6QuXG4gKiBAcGFyYW0ga2V5IC0g7YWc7ZSM66a/IO2CpCAo7JiIOiBcImVudGl0eVwiLCBcIm1vZGVsXCIsIFwic2VydmljZVwiIOuTsSlcbiAqIEBwYXJhbSB0ZW1wbGF0ZU9wdGlvbnMgLSDthZztlIzrpr8g66CM642U66eB7JeQIO2VhOyalO2VnCDsmLXshZhcbiAqIEBwYXJhbSBfZ2VuZXJhdGVPcHRpb25zIC0g7IOd7ISxIOyYteyFmCAob3ZlcndyaXRlIOyXrOu2gClcbiAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICBrZXk6IFQsXG4gIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCBnZW5lcmF0ZU9wdGlvbnMgPSB7XG4gICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAuLi5fZ2VuZXJhdGVPcHRpb25zLFxuICB9O1xuICBOYWl0ZS50KFwiZ2VuZXJhdGVUZW1wbGF0ZVwiLCB7IGtleSwgdGVtcGxhdGVPcHRpb25zLCBnZW5lcmF0ZU9wdGlvbnMgfSk7XG5cbiAgLy8g7YKkIGNoaWxkcmVuXG4gIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBba2V5XTtcblxuICAvLyDthZztlIzrpr8g66CM642UXG4gIGNvbnN0IHBhdGhBbmRDb2RlcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKS5mbGF0KCk7XG5cbiAgY29uc3QgZmlsdGVyZWRQYXRoQW5kQ29kZXM6IFBhdGhBbmRDb2RlW10gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChnZW5lcmF0ZU9wdGlvbnMub3ZlcndyaXRlKSB7XG4gICAgICByZXR1cm4gcGF0aEFuZENvZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgZmlsdGVyQXN5bmMocGF0aEFuZENvZGVzLCBhc3luYyAocGF0aEFuZENvZGUpID0+IHtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7U29uYW11LmFwcFJvb3RQYXRofS8ke3BhdGhBbmRDb2RlLnBhdGh9YDtcbiAgICAgICAgY29uc3QgZHN0RmlsZVBhdGhzID0gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4gZmlsZVBhdGgucmVwbGFjZShcIi86dGFyZ2V0L1wiLCBgLyR7dGFyZ2V0fS9gKSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBldmVyeUFzeW5jKGRzdEZpbGVQYXRocywgYXN5bmMgKGRzdFBhdGgpID0+ICEoYXdhaXQgZXhpc3RzKGRzdFBhdGgpKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKGZpbHRlcmVkUGF0aEFuZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmFsbEZpbGVzRXhpc3RcIikpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkUGF0aEFuZENvZGVzLm1hcCgocGF0aEFuZENvZGUpID0+IHdyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQocGF0aEFuZENvZGUpKSxcbiAgICApXG4gICkuZmxhdCgpO1xufVxuXG4vKipcbiAqIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlZjsl6wgUGF0aEFuZENvZGUg6rCd7LK066W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAqIO2MjOydvOuhnCDsk7Dsp4Ag7JWK6rOgIOuplOuqqOumrOyDgeyXkOyEnOunjCDroIzrjZTrp4Htlanri4jri6QuXG4gKiBAcGFyYW0ga2V5IC0g7YWc7ZSM66a/IO2CpFxuICogQHBhcmFtIG9wdGlvbnMgLSDthZztlIzrpr8g66CM642U66eBIOyYteyFmFxuICogQHJldHVybnMg6rK966Gc7JmAIOy9lOuTnCDsjI3snZgg67Cw7Je0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAga2V5OiBULFxuICBvcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4pOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgTmFpdGUudChcInJlbmRlclRlbXBsYXRlXCIsIHsga2V5LCBvcHRpb25zIH0pO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldChrZXkpO1xuXG4gIGNvbnN0IHJlbmRlcmVkID0gYXdhaXQgdGVtcGxhdGUucmVuZGVyKG9wdGlvbnMpO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVSZW5kZXJlZFRlbXBsYXRlKGtleSwgcmVuZGVyZWQpO1xuXG4gIGxldCBwcmVUZW1wbGF0ZVJlc29sdmVkOiBQYXRoQW5kQ29kZVtdID0gW107XG4gIGlmIChyZW5kZXJlZC5wcmVUZW1wbGF0ZXMpIHtcbiAgICBwcmVUZW1wbGF0ZVJlc29sdmVkID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJlbmRlcmVkLnByZVRlbXBsYXRlcy5tYXAoKHsga2V5LCBvcHRpb25zIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVuZGVyVGVtcGxhdGUoa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG4gIH1cblxuICByZXR1cm4gW3Jlc29sdmVkLCAuLi5wcmVUZW1wbGF0ZVJlc29sdmVkXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGUoXG4gIGtleTogVGVtcGxhdGVLZXksXG4gIHJlc3VsdDogUmVuZGVyZWRUZW1wbGF0ZSxcbik6IFByb21pc2U8UGF0aEFuZENvZGU+IHtcbiAgTmFpdGUudChgcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGUke2tleX1gLCB7IGtleSwgcmVzdWx0IH0pO1xuXG4gIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBmaWxlUGF0aCwgYm9keSwgaW1wb3J0S2V5cywgY3VzdG9tSGVhZGVycyB9ID0gcmVzdWx0O1xuXG4gIC8vIGltcG9ydCDtlaAg64yA7IOB7J2YIOuMgOyDgSBwYXRoIOy2lOy2nFxuICBjb25zdCBidWlsdEluU2NoZW1hTmFtZXMgPSBPYmplY3QudmFsdWVzKEJVSUxUX0lOX1RZUEVTKS5tYXAoKGluZm8pID0+IGluZm8uc2NoZW1hTmFtZSBhcyBzdHJpbmcpO1xuICBjb25zdCBpbXBvcnREZWZzID0gaW1wb3J0S2V5c1xuICAgIC8vIOuCtOyepSDtg4DsnoUg7Iqk7YKk66eI64qUIOydtOuvuCBzb25hbXXsl5DshJwgaW1wb3J065CY66+A66GcIOygnOyZuFxuICAgIC5maWx0ZXIoKGltcG9ydEtleSkgPT4gIWJ1aWx0SW5TY2hlbWFOYW1lcy5pbmNsdWRlcyhpbXBvcnRLZXkpKVxuICAgIC5yZWR1Y2UoXG4gICAgICAociwgaW1wb3J0S2V5KSA9PiB7XG4gICAgICAgIGxldCBtb2R1bGVQYXRoID0gaW1wb3J0S2V5O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vZHVsZVBhdGggPSBFbnRpdHlNYW5hZ2VyLmdldE1vZHVsZVBhdGgoaW1wb3J0S2V5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW3Jlc29sdmVSZW5kZXJlZFRlbXBsYXRlOiR7a2V5fV0gJHtpbXBvcnRLZXl9IOuqqOuTiCDqsr3roZwg7LC+6riwIOyLpO2MqDogJHtlcnJvcn1gLFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbXBvcnRQYXRoID0gbW9kdWxlUGF0aDtcbiAgICAgICAgaWYgKG1vZHVsZVBhdGguaW5jbHVkZXMoXCIvXCIpIHx8IG1vZHVsZVBhdGguaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgaW1wb3J0UGF0aCA9IHdyYXBJZihwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShmaWxlUGF0aCksIG1vZHVsZVBhdGgpLCAocCkgPT4gW1xuICAgICAgICAgICAgIXAuc3RhcnRzV2l0aChcIi5cIiksXG4gICAgICAgICAgICBgLi8ke3B9YCxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOqwmeydgCDtjIzsnbzsl5DshJwgaW1wb3J0IO2VmOuKlCDqsr3smrAga2V5cyDroZwg64KY7Je0IOyymOumrFxuICAgICAgICBjb25zdCBleGlzdHNPbmUgPSByLmZpbmQoKGltcG9ydERlZikgPT4gaW1wb3J0RGVmLmZyb20gPT09IGltcG9ydFBhdGgpO1xuICAgICAgICBpZiAoZXhpc3RzT25lKSB7XG4gICAgICAgICAgZXhpc3RzT25lLmtleXMgPSB1bmlxdWUoZXhpc3RzT25lLmtleXMuY29uY2F0KGltcG9ydEtleSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHIucHVzaCh7XG4gICAgICAgICAgICBrZXlzOiBbaW1wb3J0S2V5XSxcbiAgICAgICAgICAgIGZyb206IGltcG9ydFBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAgW10gYXMge1xuICAgICAgICBrZXlzOiBzdHJpbmdbXTtcbiAgICAgICAgZnJvbTogc3RyaW5nO1xuICAgICAgfVtdLFxuICAgIClcbiAgICAvLyDshYDtlIQg7LC47KGwIOuwqeyngFxuICAgIC5maWx0ZXIoKGltcG9ydERlZikgPT4gIWZpbGVQYXRoLmVuZHNXaXRoKGAke2ltcG9ydERlZi5mcm9tLnJlcGxhY2UoXCIuL1wiLCBcIlwiKX0udHNgKSk7XG5cbiAgLy8g7Luk7Iqk7YWAIO2XpOuNlCDtj6ztlajtlZjsl6wg7Zek642UIOyDneyEsVxuICBjb25zdCBoZWFkZXIgPSBbXG4gICAgLi4uKGN1c3RvbUhlYWRlcnMgPz8gW10pLFxuICAgIC4uLmltcG9ydERlZnMubWFwKFxuICAgICAgKGltcG9ydERlZikgPT4gYGltcG9ydCB7ICR7aW1wb3J0RGVmLmtleXMuam9pbihcIiwgXCIpfSB9IGZyb20gJyR7aW1wb3J0RGVmLmZyb219J2AsXG4gICAgKSxcbiAgXS5qb2luKFwiXFxuXCIpO1xuXG4gIGNvbnN0IGZvcm1hdHRlZCA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKGtleSA9PT0gXCJnZW5lcmF0ZWRfaHR0cFwiKSB7XG4gICAgICByZXR1cm4gW2hlYWRlciwgYm9keV0uam9pbihcIlxcblxcblwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTmFpdGUudChcInJlc29sdmVSZW5kZXJlZFRlbXBsYXRlOmJlZm9yZUZvcm1hdFwiLCB7IGtleSwgaGVhZGVyLCBib2R5IH0pO1xuICAgICAgY29uc3QgZm9ybWF0dGVkID0gYXdhaXQgZm9ybWF0Q29kZShcbiAgICAgICAgW2hlYWRlciwgYm9keV0uam9pbihcIlxcblxcblwiKSxcbiAgICAgICAgYCR7U29uYW11LmFwcFJvb3RQYXRofS8ke2ZpbGVQYXRofWAsXG4gICAgICApO1xuICAgICAgTmFpdGUudChgcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGU6Zm9ybWF0dGVkOiR7a2V5fWAsIGZvcm1hdHRlZCk7XG4gICAgICByZXR1cm4gZm9ybWF0dGVkO1xuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4ge1xuICAgIHBhdGg6IGAke3RhcmdldH0vJHtmaWxlUGF0aH1gLFxuICAgIGNvZGU6IGZvcm1hdHRlZCxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDb2RlVG9QYXRoRWFjaFRhcmdldChwYXRoQW5kQ29kZTogUGF0aEFuZENvZGUpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICBjb25zdCB7IGFwcFJvb3RQYXRoIH0gPSBTb25hbXU7XG4gIGNvbnN0IGZpbGVQYXRoID0gYCR7U29uYW11LmFwcFJvb3RQYXRofS8ke3BhdGhBbmRDb2RlLnBhdGh9YCBhcyBBYnNvbHV0ZVBhdGg7XG5cbiAgY29uc3QgZHN0RmlsZVBhdGhzID0gdW5pcXVlKFxuICAgIHRhcmdldHMubWFwKCh0YXJnZXQpID0+IGZpbGVQYXRoLnJlcGxhY2UoXCIvOnRhcmdldC9cIiwgYC8ke3RhcmdldH0vYCkpIGFzIEFic29sdXRlUGF0aFtdLFxuICApO1xuICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZHN0RmlsZVBhdGhzLm1hcChhc3luYyAoZHN0RmlsZVBhdGgpID0+IHtcbiAgICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RGaWxlUGF0aCk7XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMoZGlyKSkpIHtcbiAgICAgICAgYXdhaXQgbWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShkc3RGaWxlUGF0aCwgcGF0aEFuZENvZGUuY29kZSk7XG4gICAgICAvLyDrsKnquIgg7Jqw66as6rCAIOyTtCBwYXRo66W8IOuTseuhnSDihpIgZGV2IHdhdGNoZXLsnZgg7ZuE7IaNIGNoYW5nZSDsnbTrsqTtirjqsIBcbiAgICAgIC8vIOyZuOu2gCDrs4Dqsr3snLzroZwg7Jik7J2465CY7KeAIOyViuuPhOuhnSDqsbDrpoQg6rCA65OcIOyekOujjCDsoJzqs7UuXG4gICAgICBhd2FpdCB0cmFja1dyaXR0ZW4oZHN0RmlsZVBhdGgpO1xuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJHZW5lcmF0ZWQ6IFwiKSArIGNoYWxrLmJsdWUoYCR7ZHN0RmlsZVBhdGgucmVwbGFjZShgJHthcHBSb290UGF0aH0vYCwgXCJcIil9YCksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gZHN0RmlsZVBhdGg7XG4gICAgfSksXG4gICk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQ0EsZUFBc0IsaUJBQ3BCLEtBQ0EsaUJBQ0Esa0JBQ3lCO0NBQ3pCLE1BQU0sa0JBQWtCO0VBQ3RCLFdBQVc7RUFDWCxHQUFHO0VBQ0o7QUFDRCxPQUFNLEVBQUUsb0JBQW9CO0VBQUU7RUFBSztFQUFpQjtF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
@@ -0,0 +1,27 @@
1
+ import { type AbsolutePath } from "../utils/path-utils";
2
+ /**
3
+ * 파일 변경 이벤트를 batch로 모아 한 번에 처리하는 throttler를 만듭니다.
4
+ *
5
+ * 동작:
6
+ * - 같은 path가 여러 번 push되면 마지막 event로 dedupe됩니다.
7
+ * - 마지막 push 후 `delayMs` 동안 추가 push가 없으면 한 번에 flush됩니다 (trailing debounce).
8
+ * - flush 도중 들어오는 push는 다음 batch로 큐잉됩니다.
9
+ * - 한 시점에 onFlush는 단 하나만 진행됩니다 — 이로써 onFlush 내부에서 일어나는
10
+ * 작업이 다른 onFlush 호출과 인터리브되지 않음을 보장합니다.
11
+ *
12
+ * 호출자는 push만 하면 됩니다. 내부 큐/타이머 상태는 캡슐화되어 있고, onFlush가
13
+ * 받는 fileEvents는 dedupe된 Map입니다.
14
+ *
15
+ * @example
16
+ * const push = createFileEventBatcher({
17
+ * delayMs: 100,
18
+ * onFlush: (fileEvents) => handleBatch(fileEvents),
19
+ * });
20
+ * push("/path/a.ts" as AbsolutePath, "change");
21
+ * push("/path/b.ts" as AbsolutePath, "change"); // 100ms 후 둘 다 한 번에 onFlush로
22
+ */
23
+ export declare function createFileEventBatcher<FileEventT extends string>(options: {
24
+ delayMs: number;
25
+ onFlush: (fileEvents: Map<AbsolutePath, FileEventT>) => Promise<void>;
26
+ }): (path: AbsolutePath, event: FileEventT) => void;
27
+ //# sourceMappingURL=event-batcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-batcher.d.ts","sourceRoot":"","sources":["../../src/syncer/event-batcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,SAAS,MAAM,EAAE,OAAO,EAAE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CA6ClD"}
@@ -0,0 +1,69 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+
3
+ //#region src/syncer/event-batcher.ts
4
+ /**
5
+ * 파일 변경 이벤트를 batch로 모아 한 번에 처리하는 throttler를 만듭니다.
6
+ *
7
+ * 동작:
8
+ * - 같은 path가 여러 번 push되면 마지막 event로 dedupe됩니다.
9
+ * - 마지막 push 후 `delayMs` 동안 추가 push가 없으면 한 번에 flush됩니다 (trailing debounce).
10
+ * - flush 도중 들어오는 push는 다음 batch로 큐잉됩니다.
11
+ * - 한 시점에 onFlush는 단 하나만 진행됩니다 — 이로써 onFlush 내부에서 일어나는
12
+ * 작업이 다른 onFlush 호출과 인터리브되지 않음을 보장합니다.
13
+ *
14
+ * 호출자는 push만 하면 됩니다. 내부 큐/타이머 상태는 캡슐화되어 있고, onFlush가
15
+ * 받는 fileEvents는 dedupe된 Map입니다.
16
+ *
17
+ * @example
18
+ * const push = createFileEventBatcher({
19
+ * delayMs: 100,
20
+ * onFlush: (fileEvents) => handleBatch(fileEvents),
21
+ * });
22
+ * push("/path/a.ts" as AbsolutePath, "change");
23
+ * push("/path/b.ts" as AbsolutePath, "change"); // 100ms 후 둘 다 한 번에 onFlush로
24
+ */
25
+ function createFileEventBatcher(options) {
26
+ const { delayMs, onFlush } = options;
27
+ const pending = new Map();
28
+ let flushTimer = null;
29
+ let isFlushing = false;
30
+ const scheduleFlush = () => {
31
+ if (flushTimer !== null) {
32
+ clearTimeout(flushTimer);
33
+ }
34
+ flushTimer = setTimeout(() => {
35
+ flushTimer = null;
36
+ void runFlush();
37
+ }, delayMs);
38
+ };
39
+ const runFlush = async () => {
40
+ if (isFlushing || pending.size === 0) {
41
+ return;
42
+ }
43
+ isFlushing = true;
44
+ try {
45
+ const batch = new Map(pending);
46
+ pending.clear();
47
+ try {
48
+ await onFlush(batch);
49
+ } catch (e) {
50
+ console.error(e);
51
+ }
52
+ } finally {
53
+ isFlushing = false;
54
+ if (pending.size > 0) {
55
+ scheduleFlush();
56
+ }
57
+ }
58
+ };
59
+ return (path, event) => {
60
+ pending.set(path, event);
61
+ scheduleFlush();
62
+ };
63
+ }
64
+ var init_event_batcher = __esmMin((() => {}));
65
+
66
+ //#endregion
67
+ init_event_batcher();
68
+ export { createFileEventBatcher, init_event_batcher };
69
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtYmF0Y2hlci5qcyIsIm5hbWVzIjpbImZsdXNoVGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvZXZlbnQtYmF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5cbi8qKlxuICog7YyM7J28IOuzgOqyvSDsnbTrsqTtirjrpbwgYmF0Y2jroZwg66qo7JWEIO2VnCDrsojsl5Ag7LKY66as7ZWY64qUIHRocm90dGxlcuulvCDrp4zrk63ri4jri6QuXG4gKlxuICog64+Z7J6ROlxuICogLSDqsJnsnYAgcGF0aOqwgCDsl6zrn6wg67KIIHB1c2jrkJjrqbQg66eI7KeA66eJIGV2ZW5066GcIGRlZHVwZeuQqeuLiOuLpC5cbiAqIC0g66eI7KeA66eJIHB1c2gg7ZuEIGBkZWxheU1zYCDrj5nslYgg7LaU6rCAIHB1c2jqsIAg7JeG7Jy866m0IO2VnCDrsojsl5AgZmx1c2jrkKnri4jri6QgKHRyYWlsaW5nIGRlYm91bmNlKS5cbiAqIC0gZmx1c2gg64+E7KSRIOuTpOyWtOyYpOuKlCBwdXNo64qUIOuLpOydjCBiYXRjaOuhnCDtgZDsnonrkKnri4jri6QuXG4gKiAtIO2VnCDsi5zsoJDsl5Agb25GbHVzaOuKlCDri6gg7ZWY64KY66eMIOynhO2WieuQqeuLiOuLpCDigJQg7J2066Gc7I2oIG9uRmx1c2gg64K067aA7JeQ7IScIOydvOyWtOuCmOuKlFxuICogICDsnpHsl4XsnbQg64uk66W4IG9uRmx1c2gg7Zi47Lac6rO8IOyduO2EsOumrOu4jOuQmOyngCDslYrsnYzsnYQg67O07J6l7ZWp64uI64ukLlxuICpcbiAqIO2YuOy2nOyekOuKlCBwdXNo66eMIO2VmOuptCDrkKnri4jri6QuIOuCtOu2gCDtgZAv7YOA7J2066i4IOyDge2DnOuKlCDsuqHsipDtmZTrkJjslrQg7J6I6rOgLCBvbkZsdXNo6rCAXG4gKiDrsJvripQgZmlsZUV2ZW50c+uKlCBkZWR1cGXrkJwgTWFw7J6F64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBwdXNoID0gY3JlYXRlRmlsZUV2ZW50QmF0Y2hlcih7XG4gKiAgIGRlbGF5TXM6IDEwMCxcbiAqICAgb25GbHVzaDogKGZpbGVFdmVudHMpID0+IGhhbmRsZUJhdGNoKGZpbGVFdmVudHMpLFxuICogfSk7XG4gKiBwdXNoKFwiL3BhdGgvYS50c1wiIGFzIEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIik7XG4gKiBwdXNoKFwiL3BhdGgvYi50c1wiIGFzIEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIik7IC8vIDEwMG1zIO2bhCDrkZgg64ukIO2VnCDrsojsl5Agb25GbHVzaOuhnFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmlsZUV2ZW50QmF0Y2hlcjxGaWxlRXZlbnRUIGV4dGVuZHMgc3RyaW5nPihvcHRpb25zOiB7XG4gIGRlbGF5TXM6IG51bWJlcjtcbiAgb25GbHVzaDogKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIEZpbGVFdmVudFQ+KSA9PiBQcm9taXNlPHZvaWQ+O1xufSk6IChwYXRoOiBBYnNvbHV0ZVBhdGgsIGV2ZW50OiBGaWxlRXZlbnRUKSA9PiB2b2lkIHtcbiAgY29uc3QgeyBkZWxheU1zLCBvbkZsdXNoIH0gPSBvcHRpb25zO1xuICBjb25zdCBwZW5kaW5nID0gbmV3IE1hcDxBYnNvbHV0ZVBhdGgsIEZpbGVFdmVudFQ+KCk7XG4gIGxldCBmbHVzaFRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICBsZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xuXG4gIGNvbnN0IHNjaGVkdWxlRmx1c2ggPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGZsdXNoVGltZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dChmbHVzaFRpbWVyKTtcbiAgICB9XG4gICAgZmx1c2hUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICB2b2lkIHJ1bkZsdXNoKCk7XG4gICAgfSwgZGVsYXlNcyk7XG4gIH07XG5cbiAgY29uc3QgcnVuRmx1c2ggPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLy8gZmx1c2gg64+E7KSRIOy2lOqwgCBwdXNo66GcIOuYkCDri6TrpbggcnVuRmx1c2jqsIAg7Yq466as6rGw65CcIOqyveyasCwg7ZWcIOuyiOyXkCDtlZjrgpjrp4wg7KeE7ZaJ65CY6rKMIO2VqeuLiOuLpC5cbiAgICAvLyDsp4Ttlokg7KSR7J24IGZsdXNo6rCAIOuBneuCmOuptCBmaW5hbGx57JeQ7IScIOuLpOydjCBiYXRjaOulvCDsnpDrj5nsnLzroZwg64uk7IucIOyKpOy8gOykhO2VqeuLiOuLpC5cbiAgICBpZiAoaXNGbHVzaGluZyB8fCBwZW5kaW5nLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNGbHVzaGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIC8vIO2YhOyerOq5jOyngCDrqqjsnbgg67OA6rK97J2EIHNuYXBzaG907Jy866GcIOyeoeqzoCDtgZDripQg67mE7JuB64uI64ukLlxuICAgICAgLy8g7J20IGJhdGNo6rCAIOyymOumrOuQmOuKlCDrj5nslYgg65Ok7Ja07Jik64qUIOyDiCDrs4Dqsr3snYAg64uk7J2MIGJhdGNo66GcIOuqqOyeheuLiOuLpC5cbiAgICAgIGNvbnN0IGJhdGNoID0gbmV3IE1hcChwZW5kaW5nKTtcbiAgICAgIHBlbmRpbmcuY2xlYXIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9uRmx1c2goYmF0Y2gpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gICAgICBpZiAocGVuZGluZy5zaXplID4gMCkge1xuICAgICAgICBzY2hlZHVsZUZsdXNoKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAocGF0aCwgZXZlbnQpID0+IHtcbiAgICBwZW5kaW5nLnNldChwYXRoLCBldmVudCk7XG4gICAgc2NoZWR1bGVGbHVzaCgpO1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkEsU0FBZ0IsdUJBQWtELFNBR2Q7Q0FDbEQsTUFBTSxFQUFFLFNBQVMsWUFBWTtDQUM3QixNQUFNLFVBQVUsSUFBSSxLQUErQjtDQUNuRCxJQUFJQSxhQUFvQztDQUN4QyxJQUFJLGFBQWE7Q0FFakIsTUFBTSxzQkFBNEI7QUFDaEMsTUFBSSxlQUFlLE1BQU07QUFDdkIsZ0JBQWEsV0FBVzs7QUFFMUIsZUFBYSxpQkFBaUI7QUFDNUIsZ0JBQWE7QUFDYixRQUFLLFVBQVU7S0FDZCxRQUFROztDQUdiLE1BQU0sV0FBVyxZQUEyQjtBQUcxQyxNQUFJLGNBQWMsUUFBUSxTQUFTLEdBQUc7QUFDcEM7O0FBRUYsZUFBYTtBQUNiLE1BQUk7R0FHRixNQUFNLFFBQVEsSUFBSSxJQUFJLFFBQVE7QUFDOUIsV0FBUSxPQUFPO0FBQ2YsT0FBSTtBQUNGLFVBQU0sUUFBUSxNQUFNO1lBQ2IsR0FBRztBQUNWLFlBQVEsTUFBTSxFQUFFOztZQUVWO0FBQ1IsZ0JBQWE7QUFDYixPQUFJLFFBQVEsT0FBTyxHQUFHO0FBQ3BCLG1CQUFlOzs7O0FBS3JCLFNBQVEsTUFBTSxVQUFVO0FBQ3RCLFVBQVEsSUFBSSxNQUFNLE1BQU07QUFDeEIsaUJBQWUifQ==