sonamu 0.9.19 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +36 -0
  2. package/dist/ai/agents/agent.js +5 -7
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/agents/types.js +1 -1
  5. package/dist/ai/index.js +1 -2
  6. package/dist/ai/providers/rtzr/api.js +2 -3
  7. package/dist/ai/providers/rtzr/error.js +14 -29
  8. package/dist/ai/providers/rtzr/index.js +1 -2
  9. package/dist/ai/providers/rtzr/model.js +13 -20
  10. package/dist/ai/providers/rtzr/options.js +2 -3
  11. package/dist/ai/providers/rtzr/provider.js +2 -3
  12. package/dist/ai/providers/rtzr/utils.js +12 -21
  13. package/dist/api/base-frame.js +4 -4
  14. package/dist/api/caster.js +21 -38
  15. package/dist/api/code-converters.js +41 -98
  16. package/dist/api/config.d.ts +1 -10
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +9 -8
  19. package/dist/api/context.js +2 -3
  20. package/dist/api/decorators.js +80 -116
  21. package/dist/api/index.js +2 -3
  22. package/dist/api/secret.js +6 -10
  23. package/dist/api/sonamu.d.ts.map +1 -1
  24. package/dist/api/sonamu.js +200 -387
  25. package/dist/api/validator.js +5 -8
  26. package/dist/api/websocket-helpers.js +21 -32
  27. package/dist/auth/audit-log/builders.js +2 -3
  28. package/dist/auth/audit-log/events.js +2 -2
  29. package/dist/auth/audit-log/plugin.js +30 -61
  30. package/dist/auth/audit-log-ingestor.js +19 -41
  31. package/dist/auth/auth-generator.js +16 -41
  32. package/dist/auth/better-auth-entities.js +3 -4
  33. package/dist/auth/index.js +2 -3
  34. package/dist/auth/knex-adapter.js +18 -45
  35. package/dist/auth/plugins/entity-definitions/admin.js +2 -2
  36. package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
  37. package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
  38. package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
  39. package/dist/auth/plugins/entity-definitions/index.js +2 -3
  40. package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
  41. package/dist/auth/plugins/entity-definitions/organization.js +2 -2
  42. package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
  43. package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
  44. package/dist/auth/plugins/entity-definitions/sso.js +2 -2
  45. package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
  46. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  47. package/dist/auth/plugins/entity-definitions/username.js +2 -2
  48. package/dist/auth/plugins/index.js +1 -2
  49. package/dist/auth/plugins/wrappers/admin.js +2 -3
  50. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  51. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  52. package/dist/auth/plugins/wrappers/index.js +1 -2
  53. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  54. package/dist/auth/plugins/wrappers/organization.js +2 -3
  55. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  56. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  57. package/dist/auth/plugins/wrappers/sso.js +2 -3
  58. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  59. package/dist/auth/plugins/wrappers/username.js +2 -3
  60. package/dist/bin/build-config.js +2 -2
  61. package/dist/bin/cli.js +151 -258
  62. package/dist/bin/fixture.d.ts.map +1 -1
  63. package/dist/bin/fixture.js +55 -97
  64. package/dist/bin/hmr-hook-register.js +3 -3
  65. package/dist/bin/migrate-targets.d.ts +3 -0
  66. package/dist/bin/migrate-targets.d.ts.map +1 -0
  67. package/dist/bin/migrate-targets.js +11 -0
  68. package/dist/bin/test-command.js +25 -55
  69. package/dist/bin/ts-loader-register.js +5 -6
  70. package/dist/bin/ts-loader-registration.js +6 -13
  71. package/dist/cache/cache-manager.js +3 -4
  72. package/dist/cache/decorator.js +11 -21
  73. package/dist/cache/drivers.js +2 -3
  74. package/dist/cache/index.js +2 -3
  75. package/dist/cache/types.js +1 -1
  76. package/dist/cache-control/cache-control.js +21 -34
  77. package/dist/cache-control/types.js +1 -1
  78. package/dist/compress/compress.js +10 -10
  79. package/dist/compress/index.js +1 -2
  80. package/dist/compress/types.js +1 -1
  81. package/dist/cone/cone-generator.js +25 -63
  82. package/dist/database/_batch_update.js +26 -46
  83. package/dist/database/base-model.js +44 -97
  84. package/dist/database/base-model.types.js +1 -1
  85. package/dist/database/db.d.ts +8 -14
  86. package/dist/database/db.d.ts.map +1 -1
  87. package/dist/database/db.js +127 -72
  88. package/dist/database/knex.js +5 -8
  89. package/dist/database/puri-subset.types.js +1 -1
  90. package/dist/database/puri-wrapper.js +11 -15
  91. package/dist/database/puri.js +117 -234
  92. package/dist/database/puri.types.js +3 -4
  93. package/dist/database/transaction-context.js +4 -5
  94. package/dist/database/upsert-builder.js +109 -176
  95. package/dist/dict/en.d.ts +1 -0
  96. package/dist/dict/en.d.ts.map +1 -1
  97. package/dist/dict/en.js +4 -4
  98. package/dist/dict/index.js +2 -3
  99. package/dist/dict/ko.d.ts +1 -0
  100. package/dist/dict/ko.d.ts.map +1 -1
  101. package/dist/dict/ko.js +4 -4
  102. package/dist/dict/rc-keys.js +3 -4
  103. package/dist/dict/sd.js +8 -19
  104. package/dist/dict/sonamu-dictionary.js +141 -284
  105. package/dist/dict/types.js +1 -1
  106. package/dist/dict/utils.js +4 -5
  107. package/dist/entity/entity-manager.d.ts +2 -2
  108. package/dist/entity/entity-manager.js +34 -82
  109. package/dist/entity/entity-template-cone.js +33 -66
  110. package/dist/entity/entity.js +156 -310
  111. package/dist/env.d.ts +14 -0
  112. package/dist/env.d.ts.map +1 -0
  113. package/dist/env.js +75 -0
  114. package/dist/exceptions/error-handler.js +2 -3
  115. package/dist/exceptions/so-exceptions.js +7 -5
  116. package/dist/filter/index.js +1 -2
  117. package/dist/filter/types.js +3 -4
  118. package/dist/filter/utils.js +21 -54
  119. package/dist/index.js +8 -7
  120. package/dist/logger/category.js +6 -12
  121. package/dist/logger/configure.js +23 -34
  122. package/dist/migration/code-generation.js +146 -314
  123. package/dist/migration/index-where-predicate.js +52 -144
  124. package/dist/migration/migration-set.js +19 -33
  125. package/dist/migration/migrator.d.ts +2 -0
  126. package/dist/migration/migrator.d.ts.map +1 -1
  127. package/dist/migration/migrator.js +69 -53
  128. package/dist/migration/postgresql-schema-reader.js +126 -225
  129. package/dist/migration/slack-confirm.d.ts +1 -0
  130. package/dist/migration/slack-confirm.d.ts.map +1 -1
  131. package/dist/migration/slack-confirm.js +28 -38
  132. package/dist/migration/types.js +1 -1
  133. package/dist/naite/messaging-types.js +1 -1
  134. package/dist/naite/naite-reporter.js +15 -32
  135. package/dist/naite/naite.js +43 -76
  136. package/dist/ssr/index.js +6 -9
  137. package/dist/ssr/registry.js +10 -18
  138. package/dist/ssr/renderer.js +10 -21
  139. package/dist/ssr/types.js +1 -1
  140. package/dist/storage/base-file.js +5 -10
  141. package/dist/storage/buffered-file.js +3 -4
  142. package/dist/storage/drivers.js +2 -3
  143. package/dist/storage/index.js +2 -3
  144. package/dist/storage/s3-driver.js +5 -9
  145. package/dist/storage/storage-manager.js +5 -5
  146. package/dist/storage/types.js +1 -1
  147. package/dist/storage/uploaded-file.js +4 -6
  148. package/dist/stream/index.js +1 -2
  149. package/dist/stream/sse.js +8 -13
  150. package/dist/stream/ws-audience-resolver.js +5 -5
  151. package/dist/stream/ws-audience.js +3 -4
  152. package/dist/stream/ws-cluster-bus.js +3 -4
  153. package/dist/stream/ws-core.js +1 -1
  154. package/dist/stream/ws-delivery.js +11 -25
  155. package/dist/stream/ws-local-connection-store.js +9 -18
  156. package/dist/stream/ws-presence-store.js +43 -97
  157. package/dist/stream/ws-registry.js +17 -22
  158. package/dist/stream/ws-telemetry-memory.js +38 -45
  159. package/dist/stream/ws-telemetry-trace.js +4 -6
  160. package/dist/stream/ws-telemetry.js +82 -135
  161. package/dist/stream/ws.js +47 -91
  162. package/dist/syncer/api-parser.js +81 -147
  163. package/dist/syncer/checksum.js +9 -20
  164. package/dist/syncer/code-generator.js +29 -47
  165. package/dist/syncer/entity-operations.js +17 -27
  166. package/dist/syncer/event-batcher.js +8 -15
  167. package/dist/syncer/file-patterns.js +3 -4
  168. package/dist/syncer/file-tracking.js +6 -10
  169. package/dist/syncer/index.js +1 -2
  170. package/dist/syncer/module-loader.js +10 -26
  171. package/dist/syncer/syncer-actions.js +19 -37
  172. package/dist/syncer/syncer.js +46 -98
  173. package/dist/syncer/watcher.js +12 -26
  174. package/dist/tasks/decorator.js +7 -11
  175. package/dist/tasks/step-wrapper.js +7 -8
  176. package/dist/tasks/workflow-manager.js +18 -25
  177. package/dist/template/entity-converter.js +40 -64
  178. package/dist/template/helpers.js +32 -63
  179. package/dist/template/implementations/entity.template.js +7 -11
  180. package/dist/template/implementations/entry-server.template.js +2 -3
  181. package/dist/template/implementations/generated.template.js +25 -51
  182. package/dist/template/implementations/generated_http.template.js +31 -58
  183. package/dist/template/implementations/generated_sso.template.js +45 -85
  184. package/dist/template/implementations/init_types.template.js +4 -7
  185. package/dist/template/implementations/model.template.js +5 -10
  186. package/dist/template/implementations/model_test.template.js +2 -3
  187. package/dist/template/implementations/queries.template.js +4 -7
  188. package/dist/template/implementations/sd.template.js +17 -35
  189. package/dist/template/implementations/services.template.js +18 -30
  190. package/dist/template/implementations/view_form.template.js +72 -125
  191. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  192. package/dist/template/implementations/view_list.template.js +86 -143
  193. package/dist/template/implementations/view_search_input.template.js +2 -3
  194. package/dist/template/index.js +5 -8
  195. package/dist/template/template-manager.js +13 -26
  196. package/dist/template/template-types.js +2 -3
  197. package/dist/template/template.js +7 -11
  198. package/dist/template/zod-converter.js +173 -348
  199. package/dist/testing/_relation-graph.js +18 -37
  200. package/dist/testing/bootstrap.js +5 -8
  201. package/dist/testing/data-explorer.js +34 -78
  202. package/dist/testing/dev-test-routes.js +54 -60
  203. package/dist/testing/dev-vitest-manager.js +33 -84
  204. package/dist/testing/faker-mappings.js +3 -4
  205. package/dist/testing/fixture-generator.d.ts +2 -1
  206. package/dist/testing/fixture-generator.d.ts.map +1 -1
  207. package/dist/testing/fixture-generator.js +159 -321
  208. package/dist/testing/fixture-loader.js +2 -2
  209. package/dist/testing/fixture-manager.d.ts.map +1 -1
  210. package/dist/testing/fixture-manager.js +124 -227
  211. package/dist/testing/global-setup.d.ts.map +1 -1
  212. package/dist/testing/global-setup.js +29 -17
  213. package/dist/testing/index.js +1 -2
  214. package/dist/testing/naite-vitest-reporter.js +2 -3
  215. package/dist/testing/parallel-db-manager.js +5 -3
  216. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  217. package/dist/testing/vitest-helpers.js +15 -12
  218. package/dist/types/types.d.ts +14 -14
  219. package/dist/types/types.js +27 -50
  220. package/dist/ui/ai-api.js +6 -11
  221. package/dist/ui/ai-client.js +86 -134
  222. package/dist/ui/api.js +99 -195
  223. package/dist/ui/cdd-service.js +78 -130
  224. package/dist/ui/cdd-types.js +1 -1
  225. package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
  226. package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
  227. package/dist/ui-web/index.html +2 -2
  228. package/dist/utils/async-utils.js +13 -25
  229. package/dist/utils/class-name.js +3 -4
  230. package/dist/utils/console-util.js +11 -26
  231. package/dist/utils/controller.d.ts.map +1 -1
  232. package/dist/utils/controller.js +14 -12
  233. package/dist/utils/esm-utils.js +5 -8
  234. package/dist/utils/formatter.js +10 -22
  235. package/dist/utils/fs-utils.js +14 -25
  236. package/dist/utils/lodash-able.js +3 -4
  237. package/dist/utils/model.js +7 -14
  238. package/dist/utils/object-utils.js +41 -73
  239. package/dist/utils/path-utils.js +5 -9
  240. package/dist/utils/process-utils.js +4 -7
  241. package/dist/utils/sql-parser.js +6 -13
  242. package/dist/utils/type-utils.js +16 -26
  243. package/dist/utils/utils.js +18 -40
  244. package/dist/utils/zod-error.js +9 -16
  245. package/dist/vector/chunking.js +24 -37
  246. package/dist/vector/config.js +2 -2
  247. package/dist/vector/embedding.js +8 -19
  248. package/dist/vector/index.js +1 -2
  249. package/dist/vector/types.js +1 -1
  250. package/package.json +7 -7
  251. package/src/__tests__/env.test.ts +127 -0
  252. package/src/api/__tests__/config.test.ts +10 -1
  253. package/src/api/config.ts +4 -12
  254. package/src/api/sonamu.ts +14 -4
  255. package/src/bin/__tests__/migrate-targets.test.ts +28 -0
  256. package/src/bin/__tests__/test-command.test.ts +82 -1
  257. package/src/bin/cli.ts +9 -18
  258. package/src/bin/fixture.ts +5 -4
  259. package/src/bin/migrate-targets.ts +7 -0
  260. package/src/bin/test-command.ts +2 -2
  261. package/src/database/__tests__/db.test.ts +175 -0
  262. package/src/database/db.ts +193 -71
  263. package/src/dict/en.ts +2 -0
  264. package/src/dict/ko.ts +2 -0
  265. package/src/env.ts +123 -0
  266. package/src/migration/__tests__/migrator.test.ts +149 -0
  267. package/src/migration/migrator.ts +74 -17
  268. package/src/migration/slack-confirm.ts +21 -0
  269. package/src/skills/sonamu/database.md +1 -1
  270. package/src/skills/sonamu/entity-basic.md +31 -0
  271. package/src/skills/sonamu/puri.md +22 -0
  272. package/src/skills/sonamu/testing-devrunner.md +1 -1
  273. package/src/skills/sonamu/upsert.md +53 -6
  274. package/src/stream/ws-telemetry-memory.ts +2 -2
  275. package/src/testing/fixture-generator.ts +2 -1
  276. package/src/testing/fixture-manager.ts +3 -4
  277. package/src/testing/global-setup.ts +42 -18
  278. package/src/testing/vitest-helpers.ts +14 -0
  279. package/src/utils/controller.ts +14 -7
  280. package/tsdown.api.config.ts +6 -0
  281. package/dist/_virtual/rolldown_runtime.js +0 -39
  282. package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
@@ -1,11 +1,10 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { init_decorators, registeredApis } from "../api/decorators.js";
3
3
  import { init_validator, validateMethodName } from "../api/validator.js";
4
4
  import inflection from "inflection";
5
5
  import assert from "assert";
6
6
  import { readFile } from "fs/promises";
7
7
  import ts from "typescript";
8
-
9
8
  //#region src/syncer/api-parser.ts
10
9
  /**
11
10
  * TypeScript 파일을 파싱하여 API 메소드 정보를 추출합니다.
@@ -14,18 +13,14 @@ import ts from "typescript";
14
13
  * @returns API 메소드 정보 배열 (타입 파라미터, 파라미터, 리턴 타입 등)
15
14
  */
16
15
  async function readApisFromFile(filePath) {
17
- if (!filePath.endsWith(".ts")) {
18
- throw new Error(`${filePath} does not seem to be a TypeScript file. Please check the file path. We only support parsing TypeScript files.`);
19
- }
16
+ if (!filePath.endsWith(".ts")) throw new Error(`${filePath} does not seem to be a TypeScript file. Please check the file path. We only support parsing TypeScript files.`);
20
17
  const sourceFile = ts.createSourceFile(filePath, (await readFile(filePath)).toString(), ts.ScriptTarget.Latest);
21
18
  const methods = [];
22
19
  let modelName = "UnknownModel";
23
20
  let methodName = "unknownMethod";
24
21
  const visitor = (node) => {
25
22
  if (ts.isClassDeclaration(node)) {
26
- if (node.name && ts.isIdentifier(node.name)) {
27
- modelName = node.name.escapedText.toString().replace(/Class$/, "");
28
- }
23
+ if (node.name && ts.isIdentifier(node.name)) modelName = node.name.escapedText.toString().replace(/Class$/, "");
29
24
  }
30
25
  if (ts.isMethodDeclaration(node)) {
31
26
  if (ts.isIdentifier(node.name)) {
@@ -37,7 +32,7 @@ async function readApisFromFile(filePath) {
37
32
  return {
38
33
  t: "type-param",
39
34
  id: tp.name.escapedText.toString(),
40
- constraint: tp.constraint ? resolveTypeNode(tp.constraint) : undefined
35
+ constraint: tp.constraint ? resolveTypeNode(tp.constraint) : void 0
41
36
  };
42
37
  });
43
38
  const parameters = node.parameters.map((paramDec, index) => {
@@ -45,13 +40,11 @@ async function readApisFromFile(filePath) {
45
40
  return resolveParamDec({
46
41
  name: paramDec.name,
47
42
  type: paramDec.type,
48
- optional: paramDec.questionToken !== undefined || paramDec.initializer !== undefined,
43
+ optional: paramDec.questionToken !== void 0 || paramDec.initializer !== void 0,
49
44
  defaultDef
50
45
  }, index);
51
46
  });
52
- if (node.type === undefined) {
53
- throw new Error(`리턴 타입이 기재되지 않은 메소드 ${modelName}.${methodName}`);
54
- }
47
+ if (node.type === void 0) throw new Error(`리턴 타입이 기재되지 않은 메소드 ${modelName}.${methodName}`);
55
48
  const returnType = resolveTypeNode(node.type);
56
49
  const websocketTypeRefs = readWebSocketTypeRefs(node);
57
50
  methods.push({
@@ -66,24 +59,18 @@ async function readApisFromFile(filePath) {
66
59
  ts.forEachChild(node, visitor);
67
60
  };
68
61
  visitor(sourceFile);
69
- if (methods.length === 0) {
70
- return [];
71
- }
62
+ if (methods.length === 0) return [];
72
63
  const currentModelApis = registeredApis.filter((api) => {
73
64
  return methods.find((method) => method.modelName === api.modelName && method.methodName === api.methodName);
74
65
  });
75
- if (currentModelApis.length === 0) {
76
- return [];
77
- }
78
- const extendedApis = currentModelApis.map((api) => {
66
+ if (currentModelApis.length === 0) return [];
67
+ return currentModelApis.map((api) => {
79
68
  const foundMethod = methods.find((method) => method.modelName === api.modelName && method.methodName === api.methodName);
80
- if (!foundMethod) {
81
- throw new Error(`API ${api.modelName}.${api.methodName} not found in ${filePath}`);
82
- }
69
+ if (!foundMethod) throw new Error(`API ${api.modelName}.${api.methodName} not found in ${filePath}`);
83
70
  const websocketOptions = api.websocketOptions ? {
84
71
  ...api.websocketOptions,
85
72
  ...foundMethod.websocketTypeRefs
86
- } : undefined;
73
+ } : void 0;
87
74
  return {
88
75
  ...api,
89
76
  websocketOptions,
@@ -92,70 +79,41 @@ async function readApisFromFile(filePath) {
92
79
  returnType: foundMethod?.returnType
93
80
  };
94
81
  });
95
- return extendedApis;
96
82
  }
97
83
  function readWebSocketTypeRefs(node) {
98
84
  const optionsLiteral = getDecoratorOptionsObjectLiteral(node, "websocket");
99
- if (!optionsLiteral) {
100
- return {};
101
- }
85
+ if (!optionsLiteral) return {};
102
86
  const refs = {};
103
87
  for (const property of optionsLiteral.properties) {
104
- if (!ts.isPropertyAssignment(property)) {
105
- continue;
106
- }
88
+ if (!ts.isPropertyAssignment(property)) continue;
107
89
  const propertyName = getPropertyNameText(property.name);
108
- if (propertyName !== "outEvents" && propertyName !== "inEvents") {
109
- continue;
110
- }
90
+ if (propertyName !== "outEvents" && propertyName !== "inEvents") continue;
111
91
  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
- }
92
+ if (!typeRef) continue;
93
+ if (propertyName === "outEvents") refs.outEventsTypeRef = typeRef;
94
+ else refs.inEventsTypeRef = typeRef;
120
95
  }
121
96
  return refs;
122
97
  }
123
98
  function getDecoratorOptionsObjectLiteral(node, decoratorName) {
124
99
  for (const modifier of node.modifiers ?? []) {
125
- if (!ts.isDecorator(modifier)) {
126
- continue;
127
- }
100
+ if (!ts.isDecorator(modifier)) continue;
128
101
  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
- }
102
+ if (!ts.isCallExpression(expression)) continue;
103
+ if (!ts.isIdentifier(expression.expression) || expression.expression.text !== decoratorName) continue;
135
104
  const [firstArg] = expression.arguments;
136
- if (firstArg && ts.isObjectLiteralExpression(firstArg)) {
137
- return firstArg;
138
- }
105
+ if (firstArg && ts.isObjectLiteralExpression(firstArg)) return firstArg;
139
106
  }
140
- return undefined;
141
107
  }
142
108
  function getPropertyNameText(name) {
143
- if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {
144
- return name.text;
145
- }
146
- return undefined;
109
+ if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) return name.text;
147
110
  }
148
111
  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;
112
+ if (ts.isIdentifier(expression)) return {
113
+ t: "ref",
114
+ id: expression.text
115
+ };
116
+ if (ts.isAsExpression(expression) || ts.isParenthesizedExpression(expression) || ts.isNonNullExpression(expression) || ts.isTypeAssertionExpression(expression)) return resolveDecoratorTypeRef(expression.expression);
159
117
  }
160
118
  function resolveTypeNode(typeNode) {
161
119
  switch (typeNode?.kind) {
@@ -169,61 +127,46 @@ function resolveTypeNode(typeNode) {
169
127
  case ts.SyntaxKind.VoidKeyword: return "void";
170
128
  case ts.SyntaxKind.LiteralType: {
171
129
  const literal = typeNode.literal;
172
- if (ts.isStringLiteral(literal)) {
173
- return {
174
- t: "string-literal",
175
- value: literal.text
176
- };
177
- } else if (ts.isNumericLiteral(literal)) {
178
- return {
179
- t: "numeric-literal",
180
- value: Number(literal.text)
181
- };
182
- } else {
183
- if (literal.kind === ts.SyntaxKind.NullKeyword) {
184
- return "null";
185
- } else if (literal.kind === ts.SyntaxKind.UndefinedKeyword) {
186
- return "undefined";
187
- } else if (literal.kind === ts.SyntaxKind.TrueKeyword) {
188
- return "true";
189
- } else if (literal.kind === ts.SyntaxKind.FalseKeyword) {
190
- return "false";
191
- }
192
- throw new Error("알 수 없는 리터럴");
193
- }
194
- }
195
- case ts.SyntaxKind.ArrayType: {
196
- const arrNode = typeNode;
197
- return {
198
- t: "array",
199
- elementsType: resolveTypeNode(arrNode.elementType)
130
+ if (ts.isStringLiteral(literal)) return {
131
+ t: "string-literal",
132
+ value: literal.text
200
133
  };
201
- }
202
- case ts.SyntaxKind.TypeLiteral: {
203
- const literalNode = typeNode;
204
- return {
205
- t: "object",
206
- props: literalNode.members.map((member) => {
207
- if (ts.isIndexSignatureDeclaration(member)) {
208
- assert(member.parameters[0]);
209
- const res = resolveParamDec({
210
- name: member.parameters[0].name,
211
- type: member.parameters[0].type
212
- });
213
- return resolveParamDec({
214
- name: { escapedText: `[${res.name}${res.optional ? "?" : ""}: ${res.type}]` },
215
- type: member.type
216
- });
217
- } else {
218
- return resolveParamDec({
219
- name: member.name,
220
- type: member.type,
221
- optional: member.questionToken !== undefined
222
- });
223
- }
224
- })
134
+ else if (ts.isNumericLiteral(literal)) return {
135
+ t: "numeric-literal",
136
+ value: Number(literal.text)
225
137
  };
138
+ else {
139
+ if (literal.kind === ts.SyntaxKind.NullKeyword) return "null";
140
+ else if (literal.kind === ts.SyntaxKind.UndefinedKeyword) return "undefined";
141
+ else if (literal.kind === ts.SyntaxKind.TrueKeyword) return "true";
142
+ else if (literal.kind === ts.SyntaxKind.FalseKeyword) return "false";
143
+ throw new Error("알 수 없는 리터럴");
144
+ }
226
145
  }
146
+ case ts.SyntaxKind.ArrayType: return {
147
+ t: "array",
148
+ elementsType: resolveTypeNode(typeNode.elementType)
149
+ };
150
+ case ts.SyntaxKind.TypeLiteral: return {
151
+ t: "object",
152
+ props: typeNode.members.map((member) => {
153
+ if (ts.isIndexSignatureDeclaration(member)) {
154
+ assert(member.parameters[0]);
155
+ const res = resolveParamDec({
156
+ name: member.parameters[0].name,
157
+ type: member.parameters[0].type
158
+ });
159
+ return resolveParamDec({
160
+ name: { escapedText: `[${res.name}${res.optional ? "?" : ""}: ${res.type}]` },
161
+ type: member.type
162
+ });
163
+ } else return resolveParamDec({
164
+ name: member.name,
165
+ type: member.type,
166
+ optional: member.questionToken !== void 0
167
+ });
168
+ })
169
+ };
227
170
  case ts.SyntaxKind.TypeReference: return {
228
171
  t: "ref",
229
172
  id: typeNode.typeName.escapedText.toString(),
@@ -243,12 +186,10 @@ function resolveTypeNode(typeNode) {
243
186
  index: resolveTypeNode(typeNode.indexType)
244
187
  };
245
188
  case ts.SyntaxKind.TupleType:
246
- if (ts.isTupleTypeNode(typeNode)) {
247
- return {
248
- t: "tuple-type",
249
- elements: typeNode.elements.map((elem) => resolveTypeNode(elem))
250
- };
251
- }
189
+ if (ts.isTupleTypeNode(typeNode)) return {
190
+ t: "tuple-type",
191
+ elements: typeNode.elements.map((elem) => resolveTypeNode(elem))
192
+ };
252
193
  break;
253
194
  case ts.SyntaxKind.ParenthesizedType: return resolveTypeNode(typeNode.type);
254
195
  case ts.SyntaxKind.FunctionType: return {
@@ -256,12 +197,12 @@ function resolveTypeNode(typeNode) {
256
197
  parameters: typeNode.parameters.map((param) => ({
257
198
  name: param.name.getText(),
258
199
  type: param.type ? resolveTypeNode(param.type) : "unknown",
259
- optional: param.questionToken !== undefined,
260
- defaultDef: undefined
200
+ optional: param.questionToken !== void 0,
201
+ defaultDef: void 0
261
202
  })),
262
203
  returnType: resolveTypeNode(typeNode.type)
263
204
  };
264
- case undefined: throw new Error(`typeNode undefined`);
205
+ case void 0: throw new Error(`typeNode undefined`);
265
206
  }
266
207
  console.debug(typeNode);
267
208
  throw new Error(`알 수 없는 SyntaxKind ${typeNode.kind}`);
@@ -269,37 +210,30 @@ function resolveTypeNode(typeNode) {
269
210
  function resolveParamDec(paramDec, index = 0) {
270
211
  const name = paramDec.name;
271
212
  const type = resolveTypeNode(paramDec.type);
272
- if (name === undefined) {
273
- console.debug({
274
- name,
275
- type,
276
- paramDec
277
- });
278
- }
213
+ if (name === void 0) console.debug({
214
+ name,
215
+ type,
216
+ paramDec
217
+ });
279
218
  const result = {
280
219
  name: name.escapedText ? name.escapedText.toString() : `nonameAt${index}`,
281
220
  type,
282
221
  optional: paramDec.optional === true,
283
222
  defaultDef: paramDec?.defaultDef
284
223
  };
285
- if (ts.isObjectBindingPattern(name) && ts.isTypeReferenceNode(paramDec.type) && ts.isIdentifier(paramDec.type.typeName)) {
286
- result.name = inflection.camelize(paramDec.type.typeName.text, true);
287
- }
224
+ if (ts.isObjectBindingPattern(name) && ts.isTypeReferenceNode(paramDec.type) && ts.isIdentifier(paramDec.type.typeName)) result.name = inflection.camelize(paramDec.type.typeName.text, true);
288
225
  return result;
289
226
  }
290
227
  function printNode(node, sourceFile) {
291
- if (node === undefined) {
292
- return undefined;
293
- }
294
- const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
295
- return printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);
228
+ if (node === void 0) return;
229
+ return ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }).printNode(ts.EmitHint.Unspecified, node, sourceFile);
296
230
  }
297
231
  var init_api_parser = __esmMin((() => {
298
232
  init_decorators();
299
233
  init_validator();
300
234
  }));
301
-
302
235
  //#endregion
303
236
  init_api_parser();
304
237
  export { init_api_parser, readApisFromFile };
305
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXBhcnNlci5qcyIsIm5hbWVzIjpbIm1ldGhvZHM6IFBhcnNlZE1ldGhvZFtdIiwibW9kZWxOYW1lOiBzdHJpbmciLCJtZXRob2ROYW1lOiBzdHJpbmciLCJ0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdIiwicGFyYW1ldGVyczogQXBpUGFyYW1bXSIsInJlZnM6IFdlYlNvY2tldFR5cGVSZWZzIiwicmVzdWx0OiBBcGlQYXJhbSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvYXBpLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5cbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuaW1wb3J0IHsgcmVnaXN0ZXJlZEFwaXMgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgUmVzb2x2ZWRXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZU1ldGhvZE5hbWUgfSBmcm9tIFwiLi4vYXBpL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgdHlwZSBBcGlQYXJhbSwgdHlwZSBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxudHlwZSBXZWJTb2NrZXRUeXBlUmVmcyA9IFBpY2s8XG4gIFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucyxcbiAgXCJvdXRFdmVudHNUeXBlUmVmXCIgfCBcImluRXZlbnRzVHlwZVJlZlwiXG4+O1xudHlwZSBQYXJzZWRNZXRob2QgPSB7XG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHR5cGVQYXJhbWV0ZXJzOiBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtW107XG4gIHBhcmFtZXRlcnM6IEFwaVBhcmFtW107XG4gIHJldHVyblR5cGU6IEFwaVBhcmFtVHlwZTtcbiAgd2Vic29ja2V0VHlwZVJlZnM6IFdlYlNvY2tldFR5cGVSZWZzO1xufTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IO2MjOydvOydhCDtjIzsi7HtlZjsl6wgQVBJIOuplOyGjOuTnCDsoJXrs7Trpbwg7LaU7Lac7ZWp64uI64ukLlxuICogQGFwaSDrjbDsvZTroIjsnbTthLDqsIAg67aZ7J2AIOuplOyGjOuTnOuTpOydmCDtg4DsnoUg7KCV67O066W8IOu2hOyEne2VqeuLiOuLpC5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIO2MjOyLse2VoCBUeXBlU2NyaXB0IO2MjOydvOydmCDsoIjrjIAg6rK966GcXG4gKiBAcmV0dXJucyBBUEkg66mU7IaM65OcIOygleuztCDrsLDsl7QgKO2DgOyehSDtjIzrnbzrr7jthLAsIO2MjOudvOuvuO2EsCwg66as7YS0IO2DgOyehSDrk7EpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQXBpc0Zyb21GaWxlKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPEV4dGVuZGVkQXBpW10+IHtcbiAgaWYgKCFmaWxlUGF0aC5lbmRzV2l0aChcIi50c1wiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2ZpbGVQYXRofSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgVHlwZVNjcmlwdCBmaWxlLiBQbGVhc2UgY2hlY2sgdGhlIGZpbGUgcGF0aC4gV2Ugb25seSBzdXBwb3J0IHBhcnNpbmcgVHlwZVNjcmlwdCBmaWxlcy5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICAoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpKS50b1N0cmluZygpLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICk7XG5cbiAgY29uc3QgbWV0aG9kczogUGFyc2VkTWV0aG9kW10gPSBbXTtcbiAgbGV0IG1vZGVsTmFtZTogc3RyaW5nID0gXCJVbmtub3duTW9kZWxcIjtcbiAgbGV0IG1ldGhvZE5hbWU6IHN0cmluZyA9IFwidW5rbm93bk1ldGhvZFwiO1xuICBjb25zdCB2aXNpdG9yID0gKG5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICBpZiAodHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBpZiAobm9kZS5uYW1lICYmIHRzLmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIG1vZGVsTmFtZSA9IG5vZGUubmFtZS5lc2NhcGVkVGV4dC50b1N0cmluZygpLnJlcGxhY2UoL0NsYXNzJC8sIFwiXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHMuaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIG1ldGhvZE5hbWUgPSBub2RlLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKTtcbiAgICAgICAgdmFsaWRhdGVNZXRob2ROYW1lKG1ldGhvZE5hbWUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdID0gKG5vZGUudHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcChcbiAgICAgICAgKHR5cGVQYXJhbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRwID0gdHlwZVBhcmFtO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHQ6IFwidHlwZS1wYXJhbVwiLFxuICAgICAgICAgICAgaWQ6IHRwLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnQ6IHRwLmNvbnN0cmFpbnQgPyByZXNvbHZlVHlwZU5vZGUodHAuY29uc3RyYWludCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdID0gbm9kZS5wYXJhbWV0ZXJzLm1hcCgocGFyYW1EZWMsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHREZWYgPSBwcmludE5vZGUocGFyYW1EZWMuaW5pdGlhbGl6ZXIsIHNvdXJjZUZpbGUpO1xuXG4gICAgICAgIC8vIOq4sOuzuOqwkuydtCDsnojripQg6rK97JqwIHBhcmFtRGVjLnR5cGXqsIAgdW5kZWZpbmVk66GcIOuCmOyYtFxuXG4gICAgICAgIHJldHVybiByZXNvbHZlUGFyYW1EZWMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogcGFyYW1EZWMubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHBhcmFtRGVjLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICBvcHRpb25hbDogcGFyYW1EZWMucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtRGVjLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0RGVmLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOumrO2EtCDtg4DsnoXsnbQg6riw7J6s65CY7KeAIOyViuydgCDrqZTshozrk5wgJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJldHVyblR5cGUgPSByZXNvbHZlVHlwZU5vZGUobm9kZS50eXBlKTtcbiAgICAgIGNvbnN0IHdlYnNvY2tldFR5cGVSZWZzID0gcmVhZFdlYlNvY2tldFR5cGVSZWZzKG5vZGUpO1xuXG4gICAgICBtZXRob2RzLnB1c2goe1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICByZXR1cm5UeXBlLFxuICAgICAgICB3ZWJzb2NrZXRUeXBlUmVmcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXRvcik7XG4gIH07XG4gIHZpc2l0b3Ioc291cmNlRmlsZSk7XG5cbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2MjOydvOydmCDrk7HroZ3rkJwgQVBJIO2VhO2EsFxuICBjb25zdCBjdXJyZW50TW9kZWxBcGlzID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IHtcbiAgICByZXR1cm4gbWV0aG9kcy5maW5kKFxuICAgICAgKG1ldGhvZCkgPT4gbWV0aG9kLm1vZGVsTmFtZSA9PT0gYXBpLm1vZGVsTmFtZSAmJiBtZXRob2QubWV0aG9kTmFtZSA9PT0gYXBpLm1ldGhvZE5hbWUsXG4gICAgKTtcbiAgfSk7XG4gIGlmIChjdXJyZW50TW9kZWxBcGlzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGNvbnN0IHAgPSBwYXRoLmpvaW4odG1wZGlyKCksIFwic29uYW11LXN5bmNlci1lcnJvci5qc29uXCIpO1xuICAgIC8vIHdyaXRlRmlsZVN5bmMocCwgSlNPTi5zdHJpbmdpZnkocmVnaXN0ZXJlZEFwaXMsIG51bGwsIDIpKTtcbiAgICAvLyBleGVjU3luYyhgb3BlbiAke3B9YCk7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKGDtmITsnqwg7YyM7J287JeQIOyCrOyghCDrk7HroZ3rkJwgQVBJ6rCAIOyXhuyKteuLiOuLpC4gJHtmaWxlUGF0aH1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyDrk7HroZ3rkJwgQVBJ7JeQIO2YhOyerCDrqZTshozrk5wg7YOA7J6FIOygleuztCDtmZXsnqVcbiAgY29uc3QgZXh0ZW5kZWRBcGlzID0gY3VycmVudE1vZGVsQXBpcy5tYXAoKGFwaSkgPT4ge1xuICAgIGNvbnN0IGZvdW5kTWV0aG9kID0gbWV0aG9kcy5maW5kKFxuICAgICAgKG1ldGhvZCkgPT4gbWV0aG9kLm1vZGVsTmFtZSA9PT0gYXBpLm1vZGVsTmFtZSAmJiBtZXRob2QubWV0aG9kTmFtZSA9PT0gYXBpLm1ldGhvZE5hbWUsXG4gICAgKTtcbiAgICBpZiAoIWZvdW5kTWV0aG9kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFQSSAke2FwaS5tb2RlbE5hbWV9LiR7YXBpLm1ldGhvZE5hbWV9IG5vdCBmb3VuZCBpbiAke2ZpbGVQYXRofWApO1xuICAgIH1cbiAgICBjb25zdCB3ZWJzb2NrZXRPcHRpb25zID0gYXBpLndlYnNvY2tldE9wdGlvbnNcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmFwaS53ZWJzb2NrZXRPcHRpb25zLFxuICAgICAgICAgIC4uLmZvdW5kTWV0aG9kLndlYnNvY2tldFR5cGVSZWZzLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5hcGksXG4gICAgICB3ZWJzb2NrZXRPcHRpb25zLFxuICAgICAgdHlwZVBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kPy50eXBlUGFyYW1ldGVycyxcbiAgICAgIHBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kPy5wYXJhbWV0ZXJzLFxuICAgICAgcmV0dXJuVHlwZTogZm91bmRNZXRob2Q/LnJldHVyblR5cGUsXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBleHRlbmRlZEFwaXM7XG59XG5cbmZ1bmN0aW9uIHJlYWRXZWJTb2NrZXRUeXBlUmVmcyhub2RlOiB0cy5NZXRob2REZWNsYXJhdGlvbik6IFdlYlNvY2tldFR5cGVSZWZzIHtcbiAgY29uc3Qgb3B0aW9uc0xpdGVyYWwgPSBnZXREZWNvcmF0b3JPcHRpb25zT2JqZWN0TGl0ZXJhbChub2RlLCBcIndlYnNvY2tldFwiKTtcbiAgaWYgKCFvcHRpb25zTGl0ZXJhbCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlZnM6IFdlYlNvY2tldFR5cGVSZWZzID0ge307XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb3B0aW9uc0xpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eU5hbWVUZXh0KHByb3BlcnR5Lm5hbWUpO1xuICAgIGlmIChwcm9wZXJ0eU5hbWUgIT09IFwib3V0RXZlbnRzXCIgJiYgcHJvcGVydHlOYW1lICE9PSBcImluRXZlbnRzXCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVSZWYgPSByZXNvbHZlRGVjb3JhdG9yVHlwZVJlZihwcm9wZXJ0eS5pbml0aWFsaXplcik7XG4gICAgaWYgKCF0eXBlUmVmKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcGVydHlOYW1lID09PSBcIm91dEV2ZW50c1wiKSB7XG4gICAgICByZWZzLm91dEV2ZW50c1R5cGVSZWYgPSB0eXBlUmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZzLmluRXZlbnRzVHlwZVJlZiA9IHR5cGVSZWY7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbmZ1bmN0aW9uIGdldERlY29yYXRvck9wdGlvbnNPYmplY3RMaXRlcmFsKFxuICBub2RlOiB0cy5NZXRob2REZWNsYXJhdGlvbixcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuKTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIG5vZGUubW9kaWZpZXJzID8/IFtdKSB7XG4gICAgaWYgKCF0cy5pc0RlY29yYXRvcihtb2RpZmllcikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBtb2RpZmllci5leHByZXNzaW9uO1xuICAgIGlmICghdHMuaXNDYWxsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCF0cy5pc0lkZW50aWZpZXIoZXhwcmVzc2lvbi5leHByZXNzaW9uKSB8fCBleHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCAhPT0gZGVjb3JhdG9yTmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0QXJnXSA9IGV4cHJlc3Npb24uYXJndW1lbnRzO1xuICAgIGlmIChmaXJzdEFyZyAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJnKSkge1xuICAgICAgcmV0dXJuIGZpcnN0QXJnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5TmFtZVRleHQobmFtZTogdHMuUHJvcGVydHlOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzSWRlbnRpZmllcihuYW1lKSB8fCB0cy5pc1N0cmluZ0xpdGVyYWwobmFtZSkgfHwgdHMuaXNOdW1lcmljTGl0ZXJhbChuYW1lKSkge1xuICAgIHJldHVybiBuYW1lLnRleHQ7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVjb3JhdG9yVHlwZVJlZihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uKTogQXBpUGFyYW1UeXBlLlJlZiB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIoZXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdDogXCJyZWZcIixcbiAgICAgIGlkOiBleHByZXNzaW9uLnRleHQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICB0cy5pc0FzRXhwcmVzc2lvbihleHByZXNzaW9uKSB8fFxuICAgIHRzLmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oZXhwcmVzc2lvbikgfHxcbiAgICB0cy5pc05vbk51bGxFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8XG4gICAgdHMuaXNUeXBlQXNzZXJ0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKVxuICApIHtcbiAgICByZXR1cm4gcmVzb2x2ZURlY29yYXRvclR5cGVSZWYoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUeXBlTm9kZSh0eXBlTm9kZTogdHMuVHlwZU5vZGUpOiBBcGlQYXJhbVR5cGUge1xuICBzd2l0Y2ggKHR5cGVOb2RlPy5raW5kKSB7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkFueUtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJhbnlcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5rbm93bktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlN0cmluZ0tleXdvcmQ6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVtYmVyS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZDpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVm9pZEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ2b2lkXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkxpdGVyYWxUeXBlOiB7XG4gICAgICBjb25zdCBsaXRlcmFsID0gKHR5cGVOb2RlIGFzIHRzLkxpdGVyYWxUeXBlTm9kZSkubGl0ZXJhbDtcbiAgICAgIGlmICh0cy5pc1N0cmluZ0xpdGVyYWwobGl0ZXJhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0OiBcInN0cmluZy1saXRlcmFsXCIsXG4gICAgICAgICAgdmFsdWU6IGxpdGVyYWwudGV4dCxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHMuaXNOdW1lcmljTGl0ZXJhbChsaXRlcmFsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHQ6IFwibnVtZXJpYy1saXRlcmFsXCIsXG4gICAgICAgICAgdmFsdWU6IE51bWJlcihsaXRlcmFsLnRleHQpLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxpdGVyYWwua2luZCA9PT0gdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgICAgICB9IGVsc2UgaWYgKGxpdGVyYWwua2luZCA9PT0gdHMuU3ludGF4S2luZC5UcnVlS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcInRydWVcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRmFsc2VLZXl3b3JkKSB7XG4gICAgICAgICAgcmV0dXJuIFwiZmFsc2VcIjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLslYwg7IiYIOyXhuuKlCDrpqzthLDrn7RcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BcnJheVR5cGU6IHtcbiAgICAgIGNvbnN0IGFyck5vZGUgPSB0eXBlTm9kZSBhcyB0cy5BcnJheVR5cGVOb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJhcnJheVwiLFxuICAgICAgICBlbGVtZW50c1R5cGU6IHJlc29sdmVUeXBlTm9kZShhcnJOb2RlLmVsZW1lbnRUeXBlKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlTGl0ZXJhbDoge1xuICAgICAgY29uc3QgbGl0ZXJhbE5vZGUgPSB0eXBlTm9kZSBhcyB0cy5UeXBlTGl0ZXJhbE5vZGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wczogbGl0ZXJhbE5vZGUubWVtYmVycy5tYXAoKG1lbWJlcikgPT4ge1xuICAgICAgICAgIGlmICh0cy5pc0luZGV4U2lnbmF0dXJlRGVjbGFyYXRpb24obWVtYmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0KG1lbWJlci5wYXJhbWV0ZXJzWzBdKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlc29sdmVQYXJhbURlYyh7XG4gICAgICAgICAgICAgIG5hbWU6IG1lbWJlci5wYXJhbWV0ZXJzWzBdLm5hbWUgYXMgdHMuSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgdHlwZTogbWVtYmVyLnBhcmFtZXRlcnNbMF0udHlwZSBhcyB0cy5UeXBlTm9kZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKHtcbiAgICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgIGVzY2FwZWRUZXh0OiBgWyR7cmVzLm5hbWV9JHtyZXMub3B0aW9uYWwgPyBcIj9cIiA6IFwiXCJ9OiAke3Jlcy50eXBlfV1gLFxuICAgICAgICAgICAgICB9IGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IG1lbWJlci50eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IChtZW1iZXIgYXMgdHMuUHJvcGVydHlTaWduYXR1cmUpLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICAgIG9wdGlvbmFsOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS5xdWVzdGlvblRva2VuICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR5cGVSZWZlcmVuY2U6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcInJlZlwiLFxuICAgICAgICBpZDogKCh0eXBlTm9kZSBhcyB0cy5UeXBlUmVmZXJlbmNlTm9kZSkudHlwZU5hbWUgYXMgdHMuSWRlbnRpZmllcikuZXNjYXBlZFRleHQudG9TdHJpbmcoKSxcbiAgICAgICAgYXJnczogKHR5cGVOb2RlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlKS50eXBlQXJndW1lbnRzPy5tYXAoKHR5cGVBcmcpID0+XG4gICAgICAgICAgcmVzb2x2ZVR5cGVOb2RlKHR5cGVBcmcpLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5pb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJ1bmlvblwiLFxuICAgICAgICB0eXBlczogKHR5cGVOb2RlIGFzIHRzLlVuaW9uVHlwZU5vZGUpLnR5cGVzLm1hcCgodHlwZSkgPT4gcmVzb2x2ZVR5cGVOb2RlKHR5cGUpKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkludGVyc2VjdGlvblR5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImludGVyc2VjdGlvblwiLFxuICAgICAgICB0eXBlczogKHR5cGVOb2RlIGFzIHRzLkludGVyc2VjdGlvblR5cGVOb2RlKS50eXBlcy5tYXAoKHR5cGUpID0+IHJlc29sdmVUeXBlTm9kZSh0eXBlKSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbmRleGVkQWNjZXNzVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiaW5kZXhlZC1hY2Nlc3NcIixcbiAgICAgICAgb2JqZWN0OiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLkluZGV4ZWRBY2Nlc3NUeXBlTm9kZSkub2JqZWN0VHlwZSksXG4gICAgICAgIGluZGV4OiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLkluZGV4ZWRBY2Nlc3NUeXBlTm9kZSkuaW5kZXhUeXBlKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR1cGxlVHlwZTpcbiAgICAgIGlmICh0cy5pc1R1cGxlVHlwZU5vZGUodHlwZU5vZGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJ0dXBsZS10eXBlXCIsXG4gICAgICAgICAgZWxlbWVudHM6IHR5cGVOb2RlLmVsZW1lbnRzLm1hcCgoZWxlbSkgPT4gcmVzb2x2ZVR5cGVOb2RlKGVsZW0pKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5QYXJlbnRoZXNpemVkVHlwZTpcbiAgICAgIC8vIOq0hO2YuOuhnCDrrLbsnbgg7YOA7J6FICjsmIg6IChBICYgQilbXSDsl5DshJwgKEEgJiBCKSlcbiAgICAgIC8vIOuCtOu2gCDtg4DsnoXsnYQg7J6s6reA7KCB7Jy866GcIHJlc29sdmVcbiAgICAgIHJldHVybiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLlBhcmVudGhlc2l6ZWRUeXBlTm9kZSkudHlwZSk7XG5cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuRnVuY3Rpb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJmdW5jdGlvblwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiAodHlwZU5vZGUgYXMgdHMuRnVuY3Rpb25UeXBlTm9kZSkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHBhcmFtLm5hbWUuZ2V0VGV4dCgpLFxuICAgICAgICAgIHR5cGU6IHBhcmFtLnR5cGUgPyByZXNvbHZlVHlwZU5vZGUocGFyYW0udHlwZSkgOiBcInVua25vd25cIixcbiAgICAgICAgICBvcHRpb25hbDogcGFyYW0ucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIGRlZmF1bHREZWY6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpLFxuICAgICAgICByZXR1cm5UeXBlOiByZXNvbHZlVHlwZU5vZGUoKHR5cGVOb2RlIGFzIHRzLkZ1bmN0aW9uVHlwZU5vZGUpLnR5cGUpLFxuICAgICAgfTtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHlwZU5vZGUgdW5kZWZpbmVkYCk7XG4gIH1cblxuICBjb25zb2xlLmRlYnVnKHR5cGVOb2RlKTtcbiAgdGhyb3cgbmV3IEVycm9yKGDslYwg7IiYIOyXhuuKlCBTeW50YXhLaW5kICR7dHlwZU5vZGUua2luZH1gKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhcmFtRGVjKFxuICBwYXJhbURlYzoge1xuICAgIG5hbWU6IHRzLkJpbmRpbmdOYW1lO1xuICAgIHR5cGU6IHRzLlR5cGVOb2RlO1xuICAgIG9wdGlvbmFsPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0RGVmPzogc3RyaW5nO1xuICB9LFxuICBpbmRleDogbnVtYmVyID0gMCxcbik6IEFwaVBhcmFtIHtcbiAgY29uc3QgbmFtZSA9IHBhcmFtRGVjLm5hbWUgYXMgdHMuSWRlbnRpZmllcjtcbiAgY29uc3QgdHlwZSA9IHJlc29sdmVUeXBlTm9kZShwYXJhbURlYy50eXBlKTtcblxuICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5kZWJ1Zyh7IG5hbWUsIHR5cGUsIHBhcmFtRGVjIH0pO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBBcGlQYXJhbSA9IHtcbiAgICBuYW1lOiBuYW1lLmVzY2FwZWRUZXh0ID8gbmFtZS5lc2NhcGVkVGV4dC50b1N0cmluZygpIDogYG5vbmFtZUF0JHtpbmRleH1gLFxuICAgIHR5cGUsXG4gICAgb3B0aW9uYWw6IHBhcmFtRGVjLm9wdGlvbmFsID09PSB0cnVlLFxuICAgIGRlZmF1bHREZWY6IHBhcmFtRGVjPy5kZWZhdWx0RGVmLFxuICB9O1xuXG4gIC8vIOq1rOyhsOu2hO2VtO2VoOuLueydmCDqsr3smrAg7YOA7J6F7J2066aEIOyCrOyaqVxuICBpZiAoXG4gICAgdHMuaXNPYmplY3RCaW5kaW5nUGF0dGVybihuYW1lKSAmJlxuICAgIHRzLmlzVHlwZVJlZmVyZW5jZU5vZGUocGFyYW1EZWMudHlwZSkgJiZcbiAgICB0cy5pc0lkZW50aWZpZXIocGFyYW1EZWMudHlwZS50eXBlTmFtZSlcbiAgKSB7XG4gICAgcmVzdWx0Lm5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKHBhcmFtRGVjLnR5cGUudHlwZU5hbWUudGV4dCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwcmludE5vZGUobm9kZTogdHMuTm9kZSB8IHVuZGVmaW5lZCwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgcHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIoeyBuZXdMaW5lOiB0cy5OZXdMaW5lS2luZC5MaW5lRmVlZCB9KTtcbiAgcmV0dXJuIHByaW50ZXIucHJpbnROb2RlKHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLCBub2RlLCBzb3VyY2VGaWxlKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLGVBQXNCLGlCQUFpQixVQUFnRDtBQUNyRixLQUFJLENBQUMsU0FBUyxTQUFTLE1BQU0sRUFBRTtBQUM3QixRQUFNLElBQUksTUFDUixHQUFHLFNBQVMsK0dBQ2I7O0NBR0gsTUFBTSxhQUFhLEdBQUcsaUJBQ3BCLFdBQ0MsTUFBTSxTQUFTLFNBQVMsRUFBRSxVQUFVLEVBQ3JDLEdBQUcsYUFBYSxPQUNqQjtDQUVELE1BQU1BLFVBQTBCLEVBQUU7Q0FDbEMsSUFBSUMsWUFBb0I7Q0FDeEIsSUFBSUMsYUFBcUI7Q0FDekIsTUFBTSxXQUFXLFNBQWtCO0FBQ2pDLE1BQUksR0FBRyxtQkFBbUIsS0FBSyxFQUFFO0FBQy9CLE9BQUksS0FBSyxRQUFRLEdBQUcsYUFBYSxLQUFLLEtBQUssRUFBRTtBQUMzQyxnQkFBWSxLQUFLLEtBQUssWUFBWSxVQUFVLENBQUMsUUFBUSxVQUFVLEdBQUc7OztBQUd0RSxNQUFJLEdBQUcsb0JBQW9CLEtBQUssRUFBRTtBQUNoQyxPQUFJLEdBQUcsYUFBYSxLQUFLLEtBQUssRUFBRTtBQUM5QixpQkFBYSxLQUFLLEtBQUssWUFBWSxVQUFVO0FBQzdDLHVCQUFtQixXQUFXOztHQUdoQyxNQUFNQyxrQkFBNEMsS0FBSyxrQkFBa0IsRUFBRSxFQUFFLEtBQzFFLGNBQWM7SUFDYixNQUFNLEtBQUs7QUFFWCxXQUFPO0tBQ0wsR0FBRztLQUNILElBQUksR0FBRyxLQUFLLFlBQVksVUFBVTtLQUNsQyxZQUFZLEdBQUcsYUFBYSxnQkFBZ0IsR0FBRyxXQUFXLEdBQUc7S0FDOUQ7S0FFSjtHQUNELE1BQU1DLGFBQXlCLEtBQUssV0FBVyxLQUFLLFVBQVUsVUFBVTtJQUN0RSxNQUFNLGFBQWEsVUFBVSxTQUFTLGFBQWEsV0FBVztBQUk5RCxXQUFPLGdCQUNMO0tBQ0UsTUFBTSxTQUFTO0tBQ2YsTUFB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
238
+
239
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXBhcnNlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2VyL2FwaS1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVNZXRob2ROYW1lIH0gZnJvbSBcIi4uL2FwaS92YWxpZGF0b3JcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0sIHR5cGUgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5cbnR5cGUgV2ViU29ja2V0VHlwZVJlZnMgPSBQaWNrPFxuICBSZXNvbHZlZFdlYlNvY2tldERlY29yYXRvck9wdGlvbnMsXG4gIFwib3V0RXZlbnRzVHlwZVJlZlwiIHwgXCJpbkV2ZW50c1R5cGVSZWZcIlxuPjtcbnR5cGUgUGFyc2VkTWV0aG9kID0ge1xuICBtb2RlbE5hbWU6IHN0cmluZztcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICB0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdO1xuICBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdO1xuICByZXR1cm5UeXBlOiBBcGlQYXJhbVR5cGU7XG4gIHdlYnNvY2tldFR5cGVSZWZzOiBXZWJTb2NrZXRUeXBlUmVmcztcbn07XG5cbi8qKlxuICogVHlwZVNjcmlwdCDtjIzsnbzsnYQg7YyM7Iux7ZWY7JesIEFQSSDrqZTshozrk5wg7KCV67O066W8IOy2lOy2nO2VqeuLiOuLpC5cbiAqIEBhcGkg642w7L2U66CI7J207YSw6rCAIOu2meydgCDrqZTshozrk5zrk6TsnZgg7YOA7J6FIOygleuztOulvCDrtoTshJ3tlanri4jri6QuXG4gKiBAcGFyYW0gZmlsZVBhdGggLSDtjIzsi7HtlaAgVHlwZVNjcmlwdCDtjIzsnbzsnZgg7KCI64yAIOqyveuhnFxuICogQHJldHVybnMgQVBJIOuplOyGjOuTnCDsoJXrs7Qg67Cw7Je0ICjtg4DsnoUg7YyM652866+47YSwLCDtjIzrnbzrr7jthLAsIOumrO2EtCDtg4DsnoUg65OxKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwaXNGcm9tRmlsZShmaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogUHJvbWlzZTxFeHRlbmRlZEFwaVtdPiB7XG4gIGlmICghZmlsZVBhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtmaWxlUGF0aH0gZG9lcyBub3Qgc2VlbSB0byBiZSBhIFR5cGVTY3JpcHQgZmlsZS4gUGxlYXNlIGNoZWNrIHRoZSBmaWxlIHBhdGguIFdlIG9ubHkgc3VwcG9ydCBwYXJzaW5nIFR5cGVTY3JpcHQgZmlsZXMuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgZmlsZVBhdGgsXG4gICAgKGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoKSkudG9TdHJpbmcoKSxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICApO1xuXG4gIGNvbnN0IG1ldGhvZHM6IFBhcnNlZE1ldGhvZFtdID0gW107XG4gIGxldCBtb2RlbE5hbWU6IHN0cmluZyA9IFwiVW5rbm93bk1vZGVsXCI7XG4gIGxldCBtZXRob2ROYW1lOiBzdHJpbmcgPSBcInVua25vd25NZXRob2RcIjtcbiAgY29uc3QgdmlzaXRvciA9IChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKG5vZGUubmFtZSAmJiB0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtb2RlbE5hbWUgPSBub2RlLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKS5yZXBsYWNlKC9DbGFzcyQvLCBcIlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtZXRob2ROYW1lID0gbm9kZS5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCk7XG4gICAgICAgIHZhbGlkYXRlTWV0aG9kTmFtZShtZXRob2ROYW1lKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnM6IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1bXSA9IChub2RlLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5tYXAoXG4gICAgICAgICh0eXBlUGFyYW0pID0+IHtcbiAgICAgICAgICBjb25zdCB0cCA9IHR5cGVQYXJhbTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0OiBcInR5cGUtcGFyYW1cIixcbiAgICAgICAgICAgIGlkOiB0cC5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBjb25zdHJhaW50OiB0cC5jb25zdHJhaW50ID8gcmVzb2x2ZVR5cGVOb2RlKHRwLmNvbnN0cmFpbnQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgcGFyYW1ldGVyczogQXBpUGFyYW1bXSA9IG5vZGUucGFyYW1ldGVycy5tYXAoKHBhcmFtRGVjLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0RGVmID0gcHJpbnROb2RlKHBhcmFtRGVjLmluaXRpYWxpemVyLCBzb3VyY2VGaWxlKTtcblxuICAgICAgICAvLyDquLDrs7jqsJLsnbQg7J6I64qUIOqyveyasCBwYXJhbURlYy50eXBl6rCAIHVuZGVmaW5lZOuhnCDrgpjsmLRcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHBhcmFtRGVjLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBwYXJhbURlYy50eXBlIGFzIHRzLlR5cGVOb2RlLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHBhcmFtRGVjLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCB8fCBwYXJhbURlYy5pbml0aWFsaXplciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdERlZixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBpZiAobm9kZS50eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDrpqzthLQg7YOA7J6F7J20IOq4sOyerOuQmOyngCDslYrsnYAg66mU7IaM65OcICR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXR1cm5UeXBlID0gcmVzb2x2ZVR5cGVOb2RlKG5vZGUudHlwZSk7XG4gICAgICBjb25zdCB3ZWJzb2NrZXRUeXBlUmVmcyA9IHJlYWRXZWJTb2NrZXRUeXBlUmVmcyhub2RlKTtcblxuICAgICAgbWV0aG9kcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICB0eXBlUGFyYW1ldGVycyxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgcmV0dXJuVHlwZSxcbiAgICAgICAgd2Vic29ja2V0VHlwZVJlZnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0b3IpO1xuICB9O1xuICB2aXNpdG9yKHNvdXJjZUZpbGUpO1xuXG4gIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIO2YhOyerCDtjIzsnbzsnZgg65Ox66Gd65CcIEFQSSDtlYTthLBcbiAgY29uc3QgY3VycmVudE1vZGVsQXBpcyA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiB7XG4gICAgcmV0dXJuIG1ldGhvZHMuZmluZChcbiAgICAgIChtZXRob2QpID0+IG1ldGhvZC5tb2RlbE5hbWUgPT09IGFwaS5tb2RlbE5hbWUgJiYgbWV0aG9kLm1ldGhvZE5hbWUgPT09IGFwaS5tZXRob2ROYW1lLFxuICAgICk7XG4gIH0pO1xuICBpZiAoY3VycmVudE1vZGVsQXBpcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBjb25zdCBwID0gcGF0aC5qb2luKHRtcGRpcigpLCBcInNvbmFtdS1zeW5jZXItZXJyb3IuanNvblwiKTtcbiAgICAvLyB3cml0ZUZpbGVTeW5jKHAsIEpTT04uc3RyaW5naWZ5KHJlZ2lzdGVyZWRBcGlzLCBudWxsLCAyKSk7XG4gICAgLy8gZXhlY1N5bmMoYG9wZW4gJHtwfWApO1xuICAgIC8vIHRocm93IG5ldyBFcnJvcihg7ZiE7J6sIO2MjOydvOyXkCDsgqzsoIQg65Ox66Gd65CcIEFQSeqwgCDsl4bsirXri4jri6QuICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8g65Ox66Gd65CcIEFQSeyXkCDtmITsnqwg66mU7IaM65OcIO2DgOyehSDsoJXrs7Qg7ZmV7J6lXG4gIGNvbnN0IGV4dGVuZGVkQXBpcyA9IGN1cnJlbnRNb2RlbEFwaXMubWFwKChhcGkpID0+IHtcbiAgICBjb25zdCBmb3VuZE1ldGhvZCA9IG1ldGhvZHMuZmluZChcbiAgICAgIChtZXRob2QpID0+IG1ldGhvZC5tb2RlbE5hbWUgPT09IGFwaS5tb2RlbE5hbWUgJiYgbWV0aG9kLm1ldGhvZE5hbWUgPT09IGFwaS5tZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKCFmb3VuZE1ldGhvZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBUEkgJHthcGkubW9kZWxOYW1lfS4ke2FwaS5tZXRob2ROYW1lfSBub3QgZm91bmQgaW4gJHtmaWxlUGF0aH1gKTtcbiAgICB9XG4gICAgY29uc3Qgd2Vic29ja2V0T3B0aW9ucyA9IGFwaS53ZWJzb2NrZXRPcHRpb25zXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5hcGkud2Vic29ja2V0T3B0aW9ucyxcbiAgICAgICAgICAuLi5mb3VuZE1ldGhvZC53ZWJzb2NrZXRUeXBlUmVmcyxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYXBpLFxuICAgICAgd2Vic29ja2V0T3B0aW9ucyxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzOiBmb3VuZE1ldGhvZD8udHlwZVBhcmFtZXRlcnMsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3VuZE1ldGhvZD8ucGFyYW1ldGVycyxcbiAgICAgIHJldHVyblR5cGU6IGZvdW5kTWV0aG9kPy5yZXR1cm5UeXBlLFxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gZXh0ZW5kZWRBcGlzO1xufVxuXG5mdW5jdGlvbiByZWFkV2ViU29ja2V0VHlwZVJlZnMobm9kZTogdHMuTWV0aG9kRGVjbGFyYXRpb24pOiBXZWJTb2NrZXRUeXBlUmVmcyB7XG4gIGNvbnN0IG9wdGlvbnNMaXRlcmFsID0gZ2V0RGVjb3JhdG9yT3B0aW9uc09iamVjdExpdGVyYWwobm9kZSwgXCJ3ZWJzb2NrZXRcIik7XG4gIGlmICghb3B0aW9uc0xpdGVyYWwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCByZWZzOiBXZWJTb2NrZXRUeXBlUmVmcyA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9wdGlvbnNMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlOYW1lVGV4dChwcm9wZXJ0eS5uYW1lKTtcbiAgICBpZiAocHJvcGVydHlOYW1lICE9PSBcIm91dEV2ZW50c1wiICYmIHByb3BlcnR5TmFtZSAhPT0gXCJpbkV2ZW50c1wiKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlUmVmID0gcmVzb2x2ZURlY29yYXRvclR5cGVSZWYocHJvcGVydHkuaW5pdGlhbGl6ZXIpO1xuICAgIGlmICghdHlwZVJlZikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gXCJvdXRFdmVudHNcIikge1xuICAgICAgcmVmcy5vdXRFdmVudHNUeXBlUmVmID0gdHlwZVJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmcy5pbkV2ZW50c1R5cGVSZWYgPSB0eXBlUmVmO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZzO1xufVxuXG5mdW5jdGlvbiBnZXREZWNvcmF0b3JPcHRpb25zT2JqZWN0TGl0ZXJhbChcbiAgbm9kZTogdHMuTWV0aG9kRGVjbGFyYXRpb24sXG4gIGRlY29yYXRvck5hbWU6IHN0cmluZyxcbik6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBtb2RpZmllciBvZiBub2RlLm1vZGlmaWVycyA/PyBbXSkge1xuICAgIGlmICghdHMuaXNEZWNvcmF0b3IobW9kaWZpZXIpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gbW9kaWZpZXIuZXhwcmVzc2lvbjtcbiAgICBpZiAoIXRzLmlzQ2FsbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghdHMuaXNJZGVudGlmaWVyKGV4cHJlc3Npb24uZXhwcmVzc2lvbikgfHwgZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgIT09IGRlY29yYXRvck5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmaXJzdEFyZ10gPSBleHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICBpZiAoZmlyc3RBcmcgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZykpIHtcbiAgICAgIHJldHVybiBmaXJzdEFyZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eU5hbWVUZXh0KG5hbWU6IHRzLlByb3BlcnR5TmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc0lkZW50aWZpZXIobmFtZSkgfHwgdHMuaXNTdHJpbmdMaXRlcmFsKG5hbWUpIHx8IHRzLmlzTnVtZXJpY0xpdGVyYWwobmFtZSkpIHtcbiAgICByZXR1cm4gbmFtZS50ZXh0O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlY29yYXRvclR5cGVSZWYoZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbik6IEFwaVBhcmFtVHlwZS5SZWYgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNJZGVudGlmaWVyKGV4cHJlc3Npb24pKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHQ6IFwicmVmXCIsXG4gICAgICBpZDogZXhwcmVzc2lvbi50ZXh0LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgdHMuaXNBc0V4cHJlc3Npb24oZXhwcmVzc2lvbikgfHxcbiAgICB0cy5pc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8XG4gICAgdHMuaXNOb25OdWxsRXhwcmVzc2lvbihleHByZXNzaW9uKSB8fFxuICAgIHRzLmlzVHlwZUFzc2VydGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIHJlc29sdmVEZWNvcmF0b3JUeXBlUmVmKGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVHlwZU5vZGUodHlwZU5vZGU6IHRzLlR5cGVOb2RlKTogQXBpUGFyYW1UeXBlIHtcbiAgc3dpdGNoICh0eXBlTm9kZT8ua2luZCkge1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BbnlLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwiYW55XCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVua25vd25LZXl3b3JkOlxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bWJlcktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlZvaWRLZXl3b3JkOlxuICAgICAgcmV0dXJuIFwidm9pZFwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5MaXRlcmFsVHlwZToge1xuICAgICAgY29uc3QgbGl0ZXJhbCA9ICh0eXBlTm9kZSBhcyB0cy5MaXRlcmFsVHlwZU5vZGUpLmxpdGVyYWw7XG4gICAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGxpdGVyYWwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJzdHJpbmctbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBsaXRlcmFsLnRleHQsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHRzLmlzTnVtZXJpY0xpdGVyYWwobGl0ZXJhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0OiBcIm51bWVyaWMtbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBOdW1iZXIobGl0ZXJhbC50ZXh0KSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcImZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7JWMIOyImCDsl4bripQg66as7YSw65+0XCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlUeXBlOiB7XG4gICAgICBjb25zdCBhcnJOb2RlID0gdHlwZU5vZGUgYXMgdHMuQXJyYXlUeXBlTm9kZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiYXJyYXlcIixcbiAgICAgICAgZWxlbWVudHNUeXBlOiByZXNvbHZlVHlwZU5vZGUoYXJyTm9kZS5lbGVtZW50VHlwZSksXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHlwZUxpdGVyYWw6IHtcbiAgICAgIGNvbnN0IGxpdGVyYWxOb2RlID0gdHlwZU5vZGUgYXMgdHMuVHlwZUxpdGVyYWxOb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcHM6IGxpdGVyYWxOb2RlLm1lbWJlcnMubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAodHMuaXNJbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgIGFzc2VydChtZW1iZXIucGFyYW1ldGVyc1swXSk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiBtZW1iZXIucGFyYW1ldGVyc1swXS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IG1lbWJlci5wYXJhbWV0ZXJzWzBdLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbURlYyh7XG4gICAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBlc2NhcGVkVGV4dDogYFske3Jlcy5uYW1lfSR7cmVzLm9wdGlvbmFsID8gXCI/XCIgOiBcIlwifTogJHtyZXMudHlwZX1dYCxcbiAgICAgICAgICAgICAgfSBhcyB0cy5JZGVudGlmaWVyLFxuICAgICAgICAgICAgICB0eXBlOiBtZW1iZXIudHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVBhcmFtRGVjKHtcbiAgICAgICAgICAgICAgbmFtZTogKG1lbWJlciBhcyB0cy5Qcm9wZXJ0eVNpZ25hdHVyZSkubmFtZSBhcyB0cy5JZGVudGlmaWVyLFxuICAgICAgICAgICAgICB0eXBlOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS50eXBlIGFzIHRzLlR5cGVOb2RlLFxuICAgICAgICAgICAgICBvcHRpb25hbDogKG1lbWJlciBhcyB0cy5Qcm9wZXJ0eVNpZ25hdHVyZSkucXVlc3Rpb25Ub2tlbiAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJyZWZcIixcbiAgICAgICAgaWQ6ICgodHlwZU5vZGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGUpLnR5cGVOYW1lIGFzIHRzLklkZW50aWZpZXIpLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCksXG4gICAgICAgIGFyZ3M6ICh0eXBlTm9kZSBhcyB0cy5UeXBlUmVmZXJlbmNlTm9kZSkudHlwZUFyZ3VtZW50cz8ubWFwKCh0eXBlQXJnKSA9PlxuICAgICAgICAgIHJlc29sdmVUeXBlTm9kZSh0eXBlQXJnKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuaW9uVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwidW5pb25cIixcbiAgICAgICAgdHlwZXM6ICh0eXBlTm9kZSBhcyB0cy5VbmlvblR5cGVOb2RlKS50eXBlcy5tYXAoKHR5cGUpID0+IHJlc29sdmVUeXBlTm9kZSh0eXBlKSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbnRlcnNlY3Rpb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgdHlwZXM6ICh0eXBlTm9kZSBhcyB0cy5JbnRlcnNlY3Rpb25UeXBlTm9kZSkudHlwZXMubWFwKCh0eXBlKSA9PiByZXNvbHZlVHlwZU5vZGUodHlwZSkpLFxuICAgICAgfTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW5kZXhlZEFjY2Vzc1R5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImluZGV4ZWQtYWNjZXNzXCIsXG4gICAgICAgIG9iamVjdDogcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5JbmRleGVkQWNjZXNzVHlwZU5vZGUpLm9iamVjdFR5cGUpLFxuICAgICAgICBpbmRleDogcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5JbmRleGVkQWNjZXNzVHlwZU5vZGUpLmluZGV4VHlwZSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UdXBsZVR5cGU6XG4gICAgICBpZiAodHMuaXNUdXBsZVR5cGVOb2RlKHR5cGVOb2RlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHQ6IFwidHVwbGUtdHlwZVwiLFxuICAgICAgICAgIGVsZW1lbnRzOiB0eXBlTm9kZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+IHJlc29sdmVUeXBlTm9kZShlbGVtKSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuUGFyZW50aGVzaXplZFR5cGU6XG4gICAgICAvLyDqtITtmLjroZwg66y27J24IO2DgOyehSAo7JiIOiAoQSAmIEIpW10g7JeQ7IScIChBICYgQikpXG4gICAgICAvLyDrgrTrtoAg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCByZXNvbHZlXG4gICAgICByZXR1cm4gcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5QYXJlbnRoZXNpemVkVHlwZU5vZGUpLnR5cGUpO1xuXG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgcGFyYW1ldGVyczogKHR5cGVOb2RlIGFzIHRzLkZ1bmN0aW9uVHlwZU5vZGUpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBwYXJhbS5uYW1lLmdldFRleHQoKSxcbiAgICAgICAgICB0eXBlOiBwYXJhbS50eXBlID8gcmVzb2x2ZVR5cGVOb2RlKHBhcmFtLnR5cGUpIDogXCJ1bmtub3duXCIsXG4gICAgICAgICAgb3B0aW9uYWw6IHBhcmFtLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZWZhdWx0RGVmOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKSxcbiAgICAgICAgcmV0dXJuVHlwZTogcmVzb2x2ZVR5cGVOb2RlKCh0eXBlTm9kZSBhcyB0cy5GdW5jdGlvblR5cGVOb2RlKS50eXBlKSxcbiAgICAgIH07XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHR5cGVOb2RlIHVuZGVmaW5lZGApO1xuICB9XG5cbiAgY29uc29sZS5kZWJ1Zyh0eXBlTm9kZSk7XG4gIHRocm93IG5ldyBFcnJvcihg7JWMIOyImCDsl4bripQgU3ludGF4S2luZCAke3R5cGVOb2RlLmtpbmR9YCk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYXJhbURlYyhcbiAgcGFyYW1EZWM6IHtcbiAgICBuYW1lOiB0cy5CaW5kaW5nTmFtZTtcbiAgICB0eXBlOiB0cy5UeXBlTm9kZTtcbiAgICBvcHRpb25hbD86IGJvb2xlYW47XG4gICAgZGVmYXVsdERlZj86IHN0cmluZztcbiAgfSxcbiAgaW5kZXg6IG51bWJlciA9IDAsXG4pOiBBcGlQYXJhbSB7XG4gIGNvbnN0IG5hbWUgPSBwYXJhbURlYy5uYW1lIGFzIHRzLklkZW50aWZpZXI7XG4gIGNvbnN0IHR5cGUgPSByZXNvbHZlVHlwZU5vZGUocGFyYW1EZWMudHlwZSk7XG5cbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUuZGVidWcoeyBuYW1lLCB0eXBlLCBwYXJhbURlYyB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogQXBpUGFyYW0gPSB7XG4gICAgbmFtZTogbmFtZS5lc2NhcGVkVGV4dCA/IG5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSA6IGBub25hbWVBdCR7aW5kZXh9YCxcbiAgICB0eXBlLFxuICAgIG9wdGlvbmFsOiBwYXJhbURlYy5vcHRpb25hbCA9PT0gdHJ1ZSxcbiAgICBkZWZhdWx0RGVmOiBwYXJhbURlYz8uZGVmYXVsdERlZixcbiAgfTtcblxuICAvLyDqtazsobDrtoTtlbTtlaDri7nsnZgg6rK97JqwIO2DgOyeheydtOumhCDsgqzsmqlcbiAgaWYgKFxuICAgIHRzLmlzT2JqZWN0QmluZGluZ1BhdHRlcm4obmFtZSkgJiZcbiAgICB0cy5pc1R5cGVSZWZlcmVuY2VOb2RlKHBhcmFtRGVjLnR5cGUpICYmXG4gICAgdHMuaXNJZGVudGlmaWVyKHBhcmFtRGVjLnR5cGUudHlwZU5hbWUpXG4gICkge1xuICAgIHJlc3VsdC5uYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShwYXJhbURlYy50eXBlLnR5cGVOYW1lLnRleHQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcHJpbnROb2RlKG5vZGU6IHRzLk5vZGUgfCB1bmRlZmluZWQsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKHsgbmV3TGluZTogdHMuTmV3TGluZUtpbmQuTGluZUZlZWQgfSk7XG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLGVBQXNCLGlCQUFpQixVQUFnRDtDQUNyRixJQUFJLENBQUMsU0FBUyxTQUFTLEtBQUssR0FDMUIsTUFBTSxJQUFJLE1BQ1IsR0FB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
@@ -1,16 +1,15 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { globAsync, init_async_utils } from "../utils/async-utils.js";
3
3
  import { exists, init_fs_utils } from "../utils/fs-utils.js";
4
4
  import { differenceWith, init_utils } from "../utils/utils.js";
5
5
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
6
6
  import { GLOB_EXCLUDE, getChecksumPatternGroupInAbsolutePath, init_file_patterns } from "./file-patterns.js";
7
7
  import { isEqual } from "radashi";
8
+ import { createReadStream } from "fs";
9
+ import path from "path";
8
10
  import crypto from "crypto";
9
11
  import { readFile, writeFile } from "fs/promises";
10
- import path from "path";
11
- import { createReadStream } from "fs";
12
12
  import equal from "fast-deep-equal";
13
-
14
13
  //#region src/syncer/checksum.ts
15
14
  /**
16
15
  * 체크섬 파일에 저장된 내용과 현재 실제 파일의 체크섬을 비교하여 변경된 파일을 찾습니다.
@@ -19,10 +18,7 @@ import equal from "fast-deep-equal";
19
18
  async function findChangedFilesUsingChecksums() {
20
19
  const calculatedChecksums = await getCurrentChecksums();
21
20
  const savedChecksums = await getPreviousChecksums();
22
- const isSame = equal(calculatedChecksums, savedChecksums);
23
- if (isSame) {
24
- return [];
25
- }
21
+ if (equal(calculatedChecksums, savedChecksums)) return [];
26
22
  return differenceWith(calculatedChecksums, savedChecksums, isEqual).map((r) => r.path);
27
23
  }
28
24
  /**
@@ -31,11 +27,7 @@ async function findChangedFilesUsingChecksums() {
31
27
  */
32
28
  async function renewChecksums() {
33
29
  const calculatedChecksums = await getCurrentChecksums();
34
- const savedChecksums = await getPreviousChecksums();
35
- const isSame = equal(calculatedChecksums, savedChecksums);
36
- if (isSame) {
37
- return;
38
- }
30
+ if (equal(calculatedChecksums, await getPreviousChecksums())) return;
39
31
  await saveChecksums(calculatedChecksums);
40
32
  }
41
33
  async function getCurrentChecksums() {
@@ -52,15 +44,12 @@ async function getCurrentChecksums() {
52
44
  }
53
45
  async function getPreviousChecksums() {
54
46
  const checksumFilePath = getChecksumFilePath();
55
- if (!await exists(checksumFilePath)) {
56
- return [];
57
- }
47
+ if (!await exists(checksumFilePath)) return [];
58
48
  try {
59
- const previousChecksums = JSON.parse(await readFile(checksumFilePath, "utf-8")).map((r) => ({
49
+ return JSON.parse(await readFile(checksumFilePath, "utf-8")).map((r) => ({
60
50
  path: path.join(Sonamu.appRootPath, r.path),
61
51
  checksum: r.checksum
62
52
  }));
63
- return previousChecksums;
64
53
  } catch (e) {
65
54
  console.warn(`체크섬 파일(${checksumFilePath})을 파싱하는 데 실패했습니다. 전체 재동기화를 진행합니다.`, e);
66
55
  return [];
@@ -97,8 +86,8 @@ var init_checksum = __esmMin((() => {
97
86
  init_utils();
98
87
  init_file_patterns();
99
88
  }));
100
-
101
89
  //#endregion
102
90
  init_checksum();
103
91
  export { findChangedFilesUsingChecksums, init_checksum, renewChecksums };
104
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzdW0uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9jaGVja3N1bS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvLCB7IHR5cGUgQmluYXJ5TGlrZSB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIHR5cGUgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCwgdHlwZSBBcHBSZWxhdGl2ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgZGlmZmVyZW5jZVdpdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgsIEdMT0JfRVhDTFVERSB9IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcblxudHlwZSBQYXRoQW5kQ2hlY2tzdW0gPSB7XG4gIHBhdGg6IEFic29sdXRlUGF0aDtcbiAgY2hlY2tzdW06IHN0cmluZztcbn07XG5cbi8qKlxuICog7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IO2YhOyerCDsi6TsoJwg7YyM7J287J2YIOyytO2BrOyErOydhCDruYTqtZDtlZjsl6wg67OA6rK965CcIO2MjOydvOydhCDssL7sirXri4jri6QuXG4gKiBAcmV0dXJucyDrs4Dqsr3rkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuIO2UhOuhnOygne2KuCDro6jtirjrtoDthLAg7Iqs656Y7Iuc66GcIOyLnOyeke2VqeuLiOuLpC4g7JiI7IucOiBcIi9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIGNvbnN0IGNhbGN1bGF0ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRDdXJyZW50Q2hlY2tzdW1zKCk7XG4gIGNvbnN0IHNhdmVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0UHJldmlvdXNDaGVja3N1bXMoKTtcblxuICBjb25zdCBpc1NhbWUgPSBlcXVhbChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3Vtcyk7XG4gIGlmIChpc1NhbWUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gZGlmZmVyZW5jZVdpdGgoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMsIGlzRXF1YWwpLm1hcCgocikgPT4gci5wYXRoKTtcbn1cblxuLyoqXG4gKiDssrTtgazshKzsnYQg6rCx7Iug7ZWp64uI64ukLlxuICog7ZiE7J6sIO2MjOydvOuTpOydmCDssrTtgazshKzsnYQg6rOE7IKw7ZW07IScIOq1rO2VnCDri6TsnYwsIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l65CcIOuCtOyaqeqzvCDri6TrpbTrqbQg7LK07YGs7ISsIO2MjOydvOydhCDqsLHsi6Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FsY3VsYXRlZENoZWNrc3VtcyA9IGF3YWl0IGdldEN1cnJlbnRDaGVja3N1bXMoKTtcbiAgY29uc3Qgc2F2ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRQcmV2aW91c0NoZWNrc3VtcygpO1xuXG4gIGNvbnN0IGlzU2FtZSA9IGVxdWFsKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zKTtcbiAgaWYgKGlzU2FtZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNhdmVDaGVja3N1bXMoY2FsY3VsYXRlZENoZWNrc3Vtcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDaGVja3N1bXMoKTogUHJvbWlzZTxQYXRoQW5kQ2hlY2tzdW1bXT4ge1xuICBjb25zdCBhbGxQYXRocyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkubWFwKChbX2ZpbGVUeXBlLCBwYXR0ZXJuXSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2xvYkFzeW5jKHBhdHRlcm4sIHsgZXhjbHVkZTogR0xPQl9FWENMVURFIH0pO1xuICAgICAgfSksXG4gICAgKVxuICApLmZsYXQoKTtcblxuICAvLyDrj5nsnbwg7YyM7J287J20IOyXrOufrCDtjKjthLTsl5Ag66ek7LmY65CgIOyImCDsnojsnLzrr4DroZwo7JiIOiBzZC5nZW5lcmF0ZWQudHPripQgZ2VuZXJhdGVk7JmAIHNkR2VuZXJhdGVk7JeQIOuqqOuRkCDrp6TsuZgpXG4gIC8vIOykkeuztSDsoJzqsbAg7ZuEIOyViOyglSDsoJXroKwuXG4gIGNvbnN0IGZpbGVQYXRocyA9IEFycmF5LmZyb20obmV3IFNldChhbGxQYXRocykpLnRvU29ydGVkKCkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVQYXRocy5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgY2hlY2tzdW06IGF3YWl0IGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoKSxcbiAgICAgIH07XG4gICAgfSksXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByZXZpb3VzQ2hlY2tzdW1zKCk6IFByb21pc2U8UGF0aEFuZENoZWNrc3VtW10+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGNoZWNrc3VtRmlsZVBhdGgpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJldmlvdXNDaGVja3N1bXMgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGNoZWNrc3VtRmlsZVBhdGgsIFwidXRmLThcIikpLm1hcChcbiAgICAgIChyOiB7IHBhdGg6IEFwcFJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgICAgICBwYXRoOiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQ7IScIOydveydhCDrlYw6IGFwcFJvb3Qg7IOB64yAIOqyveuhnCDihpIg7KCI64yAIOqyveuhnFxuICAgICAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgICAgIH0pLFxuICAgICkgYXMgUGF0aEFuZENoZWNrc3VtW107XG4gICAgcmV0dXJuIHByZXZpb3VzQ2hlY2tzdW1zO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8g7LK07YGs7ISsIO2MjOydvOydtCDshpDsg4HrkJwg6rK97JqwIOu5iCDrsLDsl7Qg67CY7ZmYICjsoITssrQg7J6s64+Z6riw7ZmUIOycoOuPhClcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBg7LK07YGs7ISsIO2MjOydvCgke2NoZWNrc3VtRmlsZVBhdGh9KeydhCDtjIzsi7HtlZjripQg642wIOyLpO2MqO2WiOyKteuLiOuLpC4g7KCE7LK0IOyerOuPmeq4sO2ZlOulvCDsp4Ttlontlanri4jri6QuYCxcbiAgICAgIGUsXG4gICAgKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzb25hbXUubG9ja1wiKSBhcyBBYnNvbHV0ZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDaGVja3N1bXMoY2hlY2tzdW1zOiBQYXRoQW5kQ2hlY2tzdW1bXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjaGVja3N1bUZpbGVQYXRoID0gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpO1xuICAvLyBhcHBSb290IOyDgeuMgCDqsr3roZzroZwg7KeB66Cs7ZmUICsg7JWM7YyM67KzIOyViOyglSDsoJXroKwgKFBSIGRpZmYg6rmo64GX7ZWY6rKMIOycoOyngClcbiAgY29uc3Qgc2VyaWFsaXplZCA9IGNoZWNrc3Vtc1xuICAgIC5tYXAoKHIpID0+ICh7XG4gICAgICBwYXRoOiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgci5wYXRoKSwgLy8g7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXtlaAg65WMOiDsoIjrjIAg6rK966GcIOKGkiBhcHBSb290IOyDgeuMgCDqsr3roZxcbiAgICAgIGNoZWNrc3VtOiByLmNoZWNrc3VtLFxuICAgIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGNoZWNrc3VtRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDaGVja3N1bU9mRmlsZShmaWxlUGF0aDogUGF0aExpa2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgICBjb25zdCBpbnB1dCA9IGNyZWF0ZVJlYWRTdHJlYW0oZmlsZVBhdGgpO1xuICAgIGlucHV0Lm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICBpbnB1dC5vbihcImRhdGFcIiwgKGNodW5rOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShjaHVuayk7XG4gICAgfSk7XG4gICAgaW5wdXQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKGhhc2guZGlnZXN0KFwiaGV4XCIpKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxlQUFzQixpQ0FBMEQ7Q0FDOUUsTUFBTSxzQkFBc0IsTUFBTSxxQkFBcUI7Q0FDdkQsTUFBTSxpQkFBaUIsTUFBTSxzQkFBc0I7Q0FFbkQsTUFBTSxTQUFTLE1BQU0scUJBQXFCLGVBQWU7QUFDekQsS0FBSSxRQUFRO0FBQ1YsU0FBTyxFQUFFOztBQUdYLFFBQU8sZUFBZSxxQkFBcUIsZ0JBQWdCLFFBQVEsQ0FBQyxLQUFLLE1BQU0sRUFBRSxLQUFLOzs7Ozs7QUFPeEYsZUFBc0IsaUJBQWdDO0NBQ3BELE1BQU0sc0JBQXNCLE1BQU0scUJBQXFCO0NBQ3ZELE1BQU0saUJBQWlCLE1BQU0sc0JBQXNCO0NBRW5ELE1BQU0sU0FBUyxNQUFNLHFCQUFxQixlQUFlO0FBQ3pELEtBQUksUUFBUTtBQUNWOztBQUdGLE9BQU0sY0FBYyxvQkFBb0I7O0FBRzFDLGVBQWUsc0JBQWtEO0NBQy9ELE1BQU0sWUFDSixNQUFNLFFBQVEsSUFDWixPQUFPLFFBQVEsdUNBQXVDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxhQUFhO0FBQ3BGLFNBQU8sVUFBVSxTQUFTLEVBQUUsU0FBUyxjQUFjLENBQUM7R0FDcEQsQ0FDSCxFQUNELE1BQU07Q0FJUixNQUFNLFlBQVksTUFBTSxLQUFLLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxVQUFVO0FBRTFELFFBQU8sTUFBTSxRQUFRLElBQ25CLFVBQVUsSUFBSSxPQUFPLGFBQWE7QUFDaEMsU0FBTztHQUNMLE1BQU07R0FDTixVQUFVLE1BQU0sa0JBQWtCLFNBQVM7R0FDNUM7R0FDRCxDQUNIOztBQUdILGVBQWUsdUJBQW1EO0NBQ2hFLE1BQU0sbUJBQW1CLHFCQUFxQjtBQUM5QyxLQUFJLENBQUUsTUFBTSxPQUFPLGlCQUFpQixFQUFHO0FBQ3JDLFNBQU8sRUFBRTs7QUFHWCxLQUFJO0VBQ0YsTUFBTSxvQkFBb0IsS0FBSyxNQUFNLE1BQU0sU0FBUyxrQkFBa0IsUUFBUSxDQUFDLENBQUMsS0FDN0UsT0FBb0Q7R0FDbkQsTUFBTSxLQUFLLEtBQUssT0FBTyxhQUFhLEVBQUUsS0FBSztHQUMzQyxVQUFVLEVBQUU7R0FDYixFQUNGO0FBQ0QsU0FBTztVQUNBLEdBQUc7QUFFVixVQUFRLEtBQ04sVUFBVSxpQkFBaUIsb0NBQzNCLEVBQ0Q7QUFDRCxTQUFPLEVBQUU7OztBQUliLFNBQVMsc0JBQW9DO0FBQzNDLFFBQU8sS0FBSyxLQUFLLE9BQU8sYUFBYSxjQUFjOztBQUdyRCxlQUFlLGNBQWMsV0FBNkM7Q0FDeEUsTUFBTSxtQkFBbUIscUJBQXFCO0NBRTlDLE1BQU0sYUFBYSxVQUNoQixLQUFLLE9BQU87RUFDWCxNQUFNLEtBQUssU0FBUyxPQUFPLGFBQWEsRUFBRSxLQUFLO0VBQy9DLFVBQVUsRUFBRTtFQUNiLEVBQUUsQ0FDRixNQUFNLEdBQUcsTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFFLEtBQUssQ0FBQztBQUMvQyxPQUFNLFVBQVUsa0JBQWtCLEtBQUssVUFBVSxZQUFZLE1BQU0sRUFBRSxFQUFFLFFBQVE7O0FBR2pGLGVBQWUsa0JBQWtCLFVBQXFDO0FBQ3BFLFFBQU8sSUFBSSxTQUFpQixTQUFTLFdBQVc7RUFDOUMsTUFBTSxPQUFPLE9BQU8sV0FBVyxPQUFPO0VBQ3RDLE1BQU0sUUFBUSxpQkFBaUIsU0FBUztBQUN4QyxRQUFNLEdBQUcsU0FBUyxPQUFPO0FBQ3pCLFFBQU0sR0FBRyxTQUFTLFVBQXNCO0FBQ3RDLFFBQUssT0FBTyxNQUFNO0lBQ2xCO0FBQ0YsUUFBTSxHQUFHLGVBQWU7QUFDdEIsV0FBUSxLQUFLLE9BQU8sTUFBTSxDQUFDO0lBQzNCO0dBQ0Y7OztjQXRIbUM7bUJBQ1U7Z0JBQ047YUFFSztxQkFDc0MifQ==
92
+
93
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tzdW0uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9jaGVja3N1bS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvLCB7IHR5cGUgQmluYXJ5TGlrZSB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIHR5cGUgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCwgdHlwZSBBcHBSZWxhdGl2ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgZGlmZmVyZW5jZVdpdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgsIEdMT0JfRVhDTFVERSB9IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcblxudHlwZSBQYXRoQW5kQ2hlY2tzdW0gPSB7XG4gIHBhdGg6IEFic29sdXRlUGF0aDtcbiAgY2hlY2tzdW06IHN0cmluZztcbn07XG5cbi8qKlxuICog7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IO2YhOyerCDsi6TsoJwg7YyM7J287J2YIOyytO2BrOyErOydhCDruYTqtZDtlZjsl6wg67OA6rK965CcIO2MjOydvOydhCDssL7sirXri4jri6QuXG4gKiBAcmV0dXJucyDrs4Dqsr3rkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuIO2UhOuhnOygne2KuCDro6jtirjrtoDthLAg7Iqs656Y7Iuc66GcIOyLnOyeke2VqeuLiOuLpC4g7JiI7IucOiBcIi9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIGNvbnN0IGNhbGN1bGF0ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRDdXJyZW50Q2hlY2tzdW1zKCk7XG4gIGNvbnN0IHNhdmVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0UHJldmlvdXNDaGVja3N1bXMoKTtcblxuICBjb25zdCBpc1NhbWUgPSBlcXVhbChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3Vtcyk7XG4gIGlmIChpc1NhbWUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gZGlmZmVyZW5jZVdpdGgoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMsIGlzRXF1YWwpLm1hcCgocikgPT4gci5wYXRoKTtcbn1cblxuLyoqXG4gKiDssrTtgazshKzsnYQg6rCx7Iug7ZWp64uI64ukLlxuICog7ZiE7J6sIO2MjOydvOuTpOydmCDssrTtgazshKzsnYQg6rOE7IKw7ZW07IScIOq1rO2VnCDri6TsnYwsIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l65CcIOuCtOyaqeqzvCDri6TrpbTrqbQg7LK07YGs7ISsIO2MjOydvOydhCDqsLHsi6Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FsY3VsYXRlZENoZWNrc3VtcyA9IGF3YWl0IGdldEN1cnJlbnRDaGVja3N1bXMoKTtcbiAgY29uc3Qgc2F2ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRQcmV2aW91c0NoZWNrc3VtcygpO1xuXG4gIGNvbnN0IGlzU2FtZSA9IGVxdWFsKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zKTtcbiAgaWYgKGlzU2FtZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNhdmVDaGVja3N1bXMoY2FsY3VsYXRlZENoZWNrc3Vtcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDaGVja3N1bXMoKTogUHJvbWlzZTxQYXRoQW5kQ2hlY2tzdW1bXT4ge1xuICBjb25zdCBhbGxQYXRocyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkubWFwKChbX2ZpbGVUeXBlLCBwYXR0ZXJuXSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2xvYkFzeW5jKHBhdHRlcm4sIHsgZXhjbHVkZTogR0xPQl9FWENMVURFIH0pO1xuICAgICAgfSksXG4gICAgKVxuICApLmZsYXQoKTtcblxuICAvLyDrj5nsnbwg7YyM7J287J20IOyXrOufrCDtjKjthLTsl5Ag66ek7LmY65CgIOyImCDsnojsnLzrr4DroZwo7JiIOiBzZC5nZW5lcmF0ZWQudHPripQgZ2VuZXJhdGVk7JmAIHNkR2VuZXJhdGVk7JeQIOuqqOuRkCDrp6TsuZgpXG4gIC8vIOykkeuztSDsoJzqsbAg7ZuEIOyViOyglSDsoJXroKwuXG4gIGNvbnN0IGZpbGVQYXRocyA9IEFycmF5LmZyb20obmV3IFNldChhbGxQYXRocykpLnRvU29ydGVkKCkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVQYXRocy5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgY2hlY2tzdW06IGF3YWl0IGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoKSxcbiAgICAgIH07XG4gICAgfSksXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByZXZpb3VzQ2hlY2tzdW1zKCk6IFByb21pc2U8UGF0aEFuZENoZWNrc3VtW10+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGNoZWNrc3VtRmlsZVBhdGgpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJldmlvdXNDaGVja3N1bXMgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGNoZWNrc3VtRmlsZVBhdGgsIFwidXRmLThcIikpLm1hcChcbiAgICAgIChyOiB7IHBhdGg6IEFwcFJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgICAgICBwYXRoOiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQ7IScIOydveydhCDrlYw6IGFwcFJvb3Qg7IOB64yAIOqyveuhnCDihpIg7KCI64yAIOqyveuhnFxuICAgICAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgICAgIH0pLFxuICAgICkgYXMgUGF0aEFuZENoZWNrc3VtW107XG4gICAgcmV0dXJuIHByZXZpb3VzQ2hlY2tzdW1zO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8g7LK07YGs7ISsIO2MjOydvOydtCDshpDsg4HrkJwg6rK97JqwIOu5iCDrsLDsl7Qg67CY7ZmYICjsoITssrQg7J6s64+Z6riw7ZmUIOycoOuPhClcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBg7LK07YGs7ISsIO2MjOydvCgke2NoZWNrc3VtRmlsZVBhdGh9KeydhCDtjIzsi7HtlZjripQg642wIOyLpO2MqO2WiOyKteuLiOuLpC4g7KCE7LK0IOyerOuPmeq4sO2ZlOulvCDsp4Ttlontlanri4jri6QuYCxcbiAgICAgIGUsXG4gICAgKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzb25hbXUubG9ja1wiKSBhcyBBYnNvbHV0ZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDaGVja3N1bXMoY2hlY2tzdW1zOiBQYXRoQW5kQ2hlY2tzdW1bXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjaGVja3N1bUZpbGVQYXRoID0gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpO1xuICAvLyBhcHBSb290IOyDgeuMgCDqsr3roZzroZwg7KeB66Cs7ZmUICsg7JWM7YyM67KzIOyViOyglSDsoJXroKwgKFBSIGRpZmYg6rmo64GX7ZWY6rKMIOycoOyngClcbiAgY29uc3Qgc2VyaWFsaXplZCA9IGNoZWNrc3Vtc1xuICAgIC5tYXAoKHIpID0+ICh7XG4gICAgICBwYXRoOiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgci5wYXRoKSwgLy8g7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXtlaAg65WMOiDsoIjrjIAg6rK966GcIOKGkiBhcHBSb290IOyDgeuMgCDqsr3roZxcbiAgICAgIGNoZWNrc3VtOiByLmNoZWNrc3VtLFxuICAgIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGNoZWNrc3VtRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDaGVja3N1bU9mRmlsZShmaWxlUGF0aDogUGF0aExpa2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgICBjb25zdCBpbnB1dCA9IGNyZWF0ZVJlYWRTdHJlYW0oZmlsZVBhdGgpO1xuICAgIGlucHV0Lm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICBpbnB1dC5vbihcImRhdGFcIiwgKGNodW5rOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShjaHVuayk7XG4gICAgfSk7XG4gICAgaW5wdXQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKGhhc2guZGlnZXN0KFwiaGV4XCIpKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLGVBQXNCLGlDQUEwRDtDQUM5RSxNQUFNLHNCQUFzQixNQUFNLG9CQUFvQjtDQUN0RCxNQUFNLGlCQUFpQixNQUFNLHFCQUFxQjtDQUdsRCxJQURlLE1BQU0scUJBQXFCLGNBQ3RDLEdBQ0YsT0FBTyxDQUFDO0NBR1YsT0FBTyxlQUFlLHFCQUFxQixnQkFBZ0IsT0FBTyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsSUFBSTtBQUN2Rjs7Ozs7QUFNQSxlQUFzQixpQkFBZ0M7Q0FDcEQsTUFBTSxzQkFBc0IsTUFBTSxvQkFBb0I7Q0FJdEQsSUFEZSxNQUFNLHFCQUFxQixNQUZiLHFCQUFxQixDQUc5QyxHQUNGO0NBR0YsTUFBTSxjQUFjLG1CQUFtQjtBQUN6QztBQUVBLGVBQWUsc0JBQWtEO0NBQy9ELE1BQU0sWUFDSixNQUFNLFFBQVEsSUFDWixPQUFPLFFBQVEsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLGFBQWE7RUFDcEYsT0FBTyxVQUFVLFNBQVMsRUFBRSxTQUFTLGFBQWEsQ0FBQztDQUNyRCxDQUFDLENBQ0gsRUFBQSxDQUNBLEtBQUs7Q0FJUCxNQUFNLFlBQVksTUFBTSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7Q0FFekQsT0FBTyxNQUFNLFFBQVEsSUFDbkIsVUFBVSxJQUFJLE9BQU8sYUFBYTtFQUNoQyxPQUFPO0dBQ0wsTUFBTTtHQUNOLFVBQVUsTUFBTSxrQkFBa0IsUUFBUTtFQUM1QztDQUNGLENBQUMsQ0FDSDtBQUNGO0FBRUEsZUFBZSx1QkFBbUQ7Q0FDaEUsTUFBTSxtQkFBbUIsb0JBQW9CO0NBQzdDLElBQUksQ0FBRSxNQUFNLE9BQU8sZ0JBQWdCLEdBQ2pDLE9BQU8sQ0FBQztDQUdWLElBQUk7RUFPRixPQU4wQixLQUFLLE1BQU0sTUFBTSxTQUFTLGtCQUFrQixPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQzdFLE9BQW9EO0dBQ25ELE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxFQUFFLElBQUk7R0FDMUMsVUFBVSxFQUFFO0VBQ2QsRUFFSztDQUNULFNBQVMsR0FBRztFQUVWLFFBQVEsS0FDTixVQUFVLGlCQUFpQixvQ0FDM0IsQ0FDRjtFQUNBLE9BQU8sQ0FBQztDQUNWO0FBQ0Y7QUFFQSxTQUFTLHNCQUFvQztDQUMzQyxPQUFPLEtBQUssS0FBSyxPQUFPLGFBQWEsYUFBYTtBQUNwRDtBQUVBLGVBQWUsY0FBYyxXQUE2QztDQUN4RSxNQUFNLG1CQUFtQixvQkFBb0I7Q0FFN0MsTUFBTSxhQUFhLFVBQ2hCLEtBQUssT0FBTztFQUNYLE1BQU0sS0FBSyxTQUFTLE9BQU8sYUFBYSxFQUFFLElBQUk7RUFDOUMsVUFBVSxFQUFFO0NBQ2QsRUFBRSxDQUFDLENBQ0YsTUFBTSxHQUFHLE1BQU0sRUFBRSxLQUFLLGNBQWMsRUFBRSxJQUFJLENBQUM7Q0FDOUMsTUFBTSxVQUFVLGtCQUFrQixLQUFLLFVBQVUsWUFBWSxNQUFNLENBQUMsR0FBRyxPQUFPO0FBQ2hGO0FBRUEsZUFBZSxrQkFBa0IsVUFBcUM7Q0FDcEUsT0FBTyxJQUFJLFNBQWlCLFNBQVMsV0FBVztFQUM5QyxNQUFNLE9BQU8sT0FBTyxXQUFXLE1BQU07RUFDckMsTUFBTSxRQUFRLGlCQUFpQixRQUFRO0VBQ3ZDLE1BQU0sR0FBRyxTQUFTLE1BQU07RUFDeEIsTUFBTSxHQUFHLFNBQVMsVUFBc0I7R0FDdEMsS0FBSyxPQUFPLEtBQUs7RUFDbkIsQ0FBQztFQUNELE1BQU0sR0FBRyxlQUFlO0dBQ3RCLFFBQVEsS0FBSyxPQUFPLEtBQUssQ0FBQztFQUM1QixDQUFDO0NBQ0gsQ0FBQztBQUNIOzthQXZIc0M7a0JBQ1U7ZUFDTjtZQUVLO29CQUNzQyJ9