semantifold 0.1.0 → 0.2.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 (90) hide show
  1. package/README.md +13 -6
  2. package/build/index.d.ts +32 -3
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +99 -4
  5. package/build/src/acceptance.d.ts +22 -0
  6. package/build/src/acceptance.d.ts.map +1 -0
  7. package/build/src/acceptance.js +339 -0
  8. package/build/src/array.d.ts +7 -0
  9. package/build/src/array.d.ts.map +1 -0
  10. package/build/src/array.js +18 -0
  11. package/build/src/artifact-path.d.ts +13 -0
  12. package/build/src/artifact-path.d.ts.map +1 -0
  13. package/build/src/artifact-path.js +30 -0
  14. package/build/src/artifacts.d.ts +7 -0
  15. package/build/src/artifacts.d.ts.map +1 -0
  16. package/build/src/artifacts.js +389 -0
  17. package/build/src/backends/identifiers.d.ts.map +1 -1
  18. package/build/src/backends/identifiers.js +10 -2
  19. package/build/src/backends/index.d.ts.map +1 -1
  20. package/build/src/backends/index.js +19 -37
  21. package/build/src/backends/python.d.ts +8 -0
  22. package/build/src/backends/python.d.ts.map +1 -0
  23. package/build/src/backends/python.js +162 -0
  24. package/build/src/backends/scalars.d.ts.map +1 -1
  25. package/build/src/backends/scalars.js +2 -1
  26. package/build/src/backends/shared.d.ts.map +1 -1
  27. package/build/src/backends/shared.js +9 -6
  28. package/build/src/binary-mapping.d.ts +32 -0
  29. package/build/src/binary-mapping.d.ts.map +1 -0
  30. package/build/src/binary-mapping.js +285 -0
  31. package/build/src/diagnostic.d.ts +36 -4
  32. package/build/src/diagnostic.d.ts.map +1 -1
  33. package/build/src/diagnostic.js +42 -3
  34. package/build/src/frontends/index.d.ts.map +1 -1
  35. package/build/src/frontends/index.js +5 -23
  36. package/build/src/frontends/python.d.ts +14 -0
  37. package/build/src/frontends/python.d.ts.map +1 -0
  38. package/build/src/frontends/python.js +615 -0
  39. package/build/src/frontends/scalars.d.ts.map +1 -1
  40. package/build/src/frontends/scalars.js +6 -1
  41. package/build/src/language-registry.d.ts +113 -0
  42. package/build/src/language-registry.d.ts.map +1 -0
  43. package/build/src/language-registry.js +372 -0
  44. package/build/src/mapping.js +3 -2
  45. package/build/src/semantic/location.d.ts +7 -0
  46. package/build/src/semantic/location.d.ts.map +1 -1
  47. package/build/src/semantic/location.js +10 -1
  48. package/build/src/semantic/provenance.js +3 -3
  49. package/build/src/semantic/types.d.ts +399 -2
  50. package/build/src/semantic/types.d.ts.map +1 -1
  51. package/build/src/semantic/types.js +110 -2
  52. package/build/src/subprocess.d.ts +29 -0
  53. package/build/src/subprocess.d.ts.map +1 -0
  54. package/build/src/subprocess.js +207 -0
  55. package/build/src/timeout.d.ts +8 -0
  56. package/build/src/timeout.d.ts.map +1 -0
  57. package/build/src/timeout.js +11 -0
  58. package/build/src/toolchains.d.ts +83 -0
  59. package/build/src/toolchains.d.ts.map +1 -0
  60. package/build/src/toolchains.js +413 -0
  61. package/docs/architecture.md +7 -3
  62. package/docs/language-support.md +25 -4
  63. package/docs/parser-qualification.md +70 -0
  64. package/docs/source-maps.md +31 -4
  65. package/docs/testing.md +21 -2
  66. package/index.js +109 -4
  67. package/package.json +4 -2
  68. package/src/acceptance.js +359 -0
  69. package/src/array.js +19 -0
  70. package/src/artifact-path.js +34 -0
  71. package/src/artifacts.js +420 -0
  72. package/src/backends/identifiers.js +9 -1
  73. package/src/backends/index.js +16 -32
  74. package/src/backends/python.js +175 -0
  75. package/src/backends/scalars.js +1 -0
  76. package/src/backends/shared.js +8 -5
  77. package/src/binary-mapping.js +305 -0
  78. package/src/diagnostic.js +34 -2
  79. package/src/frontends/index.js +5 -20
  80. package/src/frontends/python.js +689 -0
  81. package/src/frontends/scalars.js +5 -0
  82. package/src/language-registry.js +403 -0
  83. package/src/mapping.js +2 -1
  84. package/src/semantic/location.js +10 -0
  85. package/src/semantic/provenance.js +2 -2
  86. package/src/semantic/types.js +124 -1
  87. package/src/subprocess.js +203 -0
  88. package/src/timeout.js +12 -0
  89. package/src/toolchains.js +444 -0
  90. package/tsconfig.json +1 -0
@@ -0,0 +1,389 @@
1
+ // @ts-check
2
+ import { decodedMappings, encodedMappings, presortedDecodedMap, TraceMap } from "@jridgewell/trace-mapping";
3
+ import { isDenseArray } from "./array.js";
4
+ import { isSafeArtifactPath, isValidFilenameMetadata } from "./artifact-path.js";
5
+ import { finalizeByteMapping } from "./binary-mapping.js";
6
+ import { SemantifoldDiagnostic } from "./diagnostic.js";
7
+ import { finalizeMapping, toSourceMapV3 } from "./mapping.js";
8
+ import { isSourceRangeOrdered } from "./semantic/location.js";
9
+ import { hasOnlyUnicodeScalars } from "./semantic/scalars.js";
10
+ const artifactRoles = new Set(["entry", "source", "manifest", "support", "mapping", "resource", "loader"]);
11
+ const mediaTypePattern = /^[A-Za-z0-9!#$&^_.+-]+\/[A-Za-z0-9!#$&^_.+-]+(?:;[\u0020-\u007e]+)?$/u;
12
+ /**
13
+ * Transactionally validates and constructs one deterministic generated artifact set.
14
+ * @param {unknown} candidate - Artifact-set fields.
15
+ * @returns {import("./semantic/types.js").GeneratedArtifactSet} Detached immutable set.
16
+ */
17
+ export function createGeneratedArtifactSet(candidate) {
18
+ try {
19
+ if (!isPlainObject(candidate) || typeof candidate.target != "string" || candidate.target.length == 0 ||
20
+ !/^[a-z][a-z0-9-]*$/u.test(candidate.target)) {
21
+ invalidArtifactSet("Artifact set requires a stable lowercase target ID.", targetOf(candidate));
22
+ }
23
+ if (!isDenseArray(candidate.artifacts) || candidate.artifacts.length == 0) {
24
+ invalidArtifactSet("Artifact set requires a non-empty ordered artifact array.", candidate.target);
25
+ }
26
+ const target = candidate.target;
27
+ const paths = new Set();
28
+ const directoryPaths = new Set();
29
+ /** @type {string[]} */
30
+ const entryPaths = [];
31
+ /** @type {import("./semantic/types.js").GeneratedSetArtifact[]} */
32
+ const artifacts = [];
33
+ for (let index = 0; index < candidate.artifacts.length; index += 1) {
34
+ const artifact = candidate.artifacts[index];
35
+ if (!isPlainObject(artifact))
36
+ invalidArtifactSet(`Artifact ${index} must be a plain object.`, target);
37
+ const artifactPath = artifact.path;
38
+ const mediaType = artifact.mediaType;
39
+ const role = artifact.role;
40
+ const contentKind = artifact.contentKind;
41
+ if (!isSafeArtifactPath(artifactPath))
42
+ invalidArtifactSet(`Artifact ${index} has an unsafe path.`, target);
43
+ if (paths.has(artifactPath))
44
+ invalidArtifactSet(`Duplicate artifact path '${artifactPath}'.`, target);
45
+ if (directoryPaths.has(artifactPath)) {
46
+ invalidArtifactSet(`Artifact path '${artifactPath}' collides with a required directory.`, target);
47
+ }
48
+ const parentPaths = artifactDirectoryPaths(artifactPath);
49
+ for (const parentPath of parentPaths) {
50
+ if (paths.has(parentPath)) {
51
+ invalidArtifactSet(`Artifact path '${artifactPath}' descends from artifact file '${parentPath}'.`, target);
52
+ }
53
+ }
54
+ paths.add(artifactPath);
55
+ for (const parentPath of parentPaths)
56
+ directoryPaths.add(parentPath);
57
+ if (typeof mediaType != "string" || !mediaTypePattern.test(mediaType) || /[\r\n]/u.test(mediaType)) {
58
+ invalidArtifactSet(`Artifact '${artifactPath}' has an invalid media type.`, target);
59
+ }
60
+ if (typeof role != "string" || !artifactRoles.has(role))
61
+ invalidArtifactSet(`Artifact '${artifactPath}' has an invalid role.`, target);
62
+ if (artifact.ownership != "generated")
63
+ invalidArtifactSet(`Artifact '${artifactPath}' must have generated ownership.`, target);
64
+ if (role == "entry") {
65
+ if (entryPaths.length > 0)
66
+ invalidArtifactSet("Artifact set must declare exactly one entry artifact.", target);
67
+ entryPaths.push(artifactPath);
68
+ }
69
+ const contentValue = artifact.content;
70
+ /** @type {string | Uint8Array} */
71
+ let content;
72
+ if (contentKind == "text") {
73
+ if (typeof contentValue != "string" || contentValue.length == 0 || !hasOnlyUnicodeScalars(contentValue)) {
74
+ invalidArtifactSet(`Text artifact '${artifactPath}' requires non-empty string content.`, target);
75
+ }
76
+ content = contentValue;
77
+ }
78
+ else if (contentKind == "binary") {
79
+ if (!(contentValue instanceof Uint8Array) || contentValue.byteLength == 0) {
80
+ invalidArtifactSet(`Binary artifact '${artifactPath}' requires non-empty bytes.`, target);
81
+ }
82
+ content = new Uint8Array(contentValue);
83
+ }
84
+ else
85
+ invalidArtifactSet(`Artifact '${artifactPath}' has an invalid content kind.`, target);
86
+ const provenance = validateArtifactProvenance(artifact.provenance, contentKind, artifactPath, content, target);
87
+ artifacts.push(/** @type {import("./semantic/types.js").GeneratedSetArtifact} */ (freezeArtifact({
88
+ content,
89
+ contentKind,
90
+ mediaType,
91
+ ownership: /** @type {const} */ ("generated"),
92
+ path: artifactPath,
93
+ provenance,
94
+ role
95
+ })));
96
+ }
97
+ if (entryPaths.length != 1)
98
+ invalidArtifactSet("Artifact set must declare exactly one entry artifact.", candidate.target);
99
+ return Object.freeze({
100
+ artifacts: Object.freeze(artifacts),
101
+ entry: entryPaths[0],
102
+ schema: /** @type {const} */ ("GeneratedArtifactSet"),
103
+ target,
104
+ version: /** @type {const} */ (1)
105
+ });
106
+ }
107
+ catch (error) {
108
+ if (error instanceof SemantifoldDiagnostic && error.code == "INVALID_ARTIFACT_SET")
109
+ throw error;
110
+ return invalidArtifactSet("Artifact-set validation failed.", targetOf(candidate), error);
111
+ }
112
+ }
113
+ /**
114
+ * Validates artifact-level text, byte, or synthetic provenance.
115
+ * @param {unknown} value - Provenance candidate.
116
+ * @param {unknown} contentKind - Validated artifact content kind.
117
+ * @param {string} artifactPath - Validated artifact path.
118
+ * @param {string | Uint8Array} content - Detached artifact content.
119
+ * @param {string} target - Artifact target.
120
+ * @returns {import("./semantic/types.js").ArtifactProvenance} Validated provenance.
121
+ */
122
+ function validateArtifactProvenance(value, contentKind, artifactPath, content, target) {
123
+ if (!isPlainObject(value))
124
+ invalidArtifactSet(`Artifact '${artifactPath}' requires provenance.`, target);
125
+ if (value.kind == "synthetic") {
126
+ if (typeof value.reason != "string" || value.reason.length == 0 || !isDenseArray(value.relatedOrigins)) {
127
+ invalidArtifactSet(`Synthetic artifact '${artifactPath}' requires an explicit reason and related origins.`, target);
128
+ }
129
+ if (contentKind == "binary") {
130
+ invalidArtifactSet(`Binary artifact '${artifactPath}' requires byte-range provenance.`, target);
131
+ }
132
+ /** @type {import("./semantic/types.js").RelatedOrigin[]} */
133
+ const relatedOrigins = [];
134
+ for (let index = 0; index < value.relatedOrigins.length; index += 1) {
135
+ relatedOrigins.push(validateRelatedOrigin(value.relatedOrigins[index], artifactPath, index, target));
136
+ }
137
+ return Object.freeze({ kind: /** @type {const} */ ("synthetic"), reason: value.reason, relatedOrigins: Object.freeze(relatedOrigins) });
138
+ }
139
+ if (value.kind == "text") {
140
+ const mappingCandidate = value.mapping;
141
+ if (contentKind != "text" || !isPlainObject(mappingCandidate) || mappingCandidate.schema != "SemantifoldMapping" ||
142
+ !isPlainObject(mappingCandidate.generated) || mappingCandidate.generated.filename != artifactPath ||
143
+ mappingCandidate.generated.content != content || !isPlainObject(value.sourceMap)) {
144
+ invalidArtifactSet(`Text artifact '${artifactPath}' has mismatched rich or Source Map provenance.`, target);
145
+ }
146
+ if (value.sourceMapFilename !== undefined && !isValidFilenameMetadata(value.sourceMapFilename)) {
147
+ invalidArtifactSet(`Text artifact '${artifactPath}' has invalid Source Map filename metadata.`, target);
148
+ }
149
+ const mapping = finalizeMapping(mappingCandidate);
150
+ const sourceMap = validateSourceMap(value.sourceMap, artifactPath, target);
151
+ const projectedSourceMap = toSourceMapV3(mapping);
152
+ if (!sameJsonValue(sourceMap, projectedSourceMap)) {
153
+ invalidArtifactSet(`Text artifact '${artifactPath}' has Source Map provenance that contradicts its rich mapping.`, target);
154
+ }
155
+ return Object.freeze({
156
+ kind: /** @type {const} */ ("text"),
157
+ mapping,
158
+ sourceMap,
159
+ sourceMapFilename: value.sourceMapFilename
160
+ });
161
+ }
162
+ if (value.kind == "bytes") {
163
+ if (contentKind != "binary")
164
+ invalidArtifactSet(`Byte provenance requires binary content for '${artifactPath}'.`, target);
165
+ const mapping = finalizeByteMapping(value.mapping);
166
+ if (mapping.generated.path != artifactPath || mapping.generated.byteLength != /** @type {Uint8Array} */ (content).byteLength) {
167
+ invalidArtifactSet(`Byte provenance does not match artifact '${artifactPath}'.`, target);
168
+ }
169
+ return Object.freeze({ kind: /** @type {const} */ ("bytes"), mapping });
170
+ }
171
+ return invalidArtifactSet(`Artifact '${artifactPath}' has an unknown provenance kind.`, target);
172
+ }
173
+ /**
174
+ * Freezes one validated artifact record.
175
+ * @param {Record<string, unknown>} artifact - Validated fields.
176
+ * @returns {Readonly<Record<string, unknown>>} Frozen record.
177
+ */
178
+ function freezeArtifact(artifact) {
179
+ if (artifact.contentKind == "binary" && artifact.content instanceof Uint8Array) {
180
+ const content = artifact.content;
181
+ Object.defineProperty(artifact, "content", {
182
+ configurable: false,
183
+ enumerable: true,
184
+ get() {
185
+ return new Uint8Array(content);
186
+ }
187
+ });
188
+ }
189
+ return Object.freeze(artifact);
190
+ }
191
+ /**
192
+ * Lists every directory a safe relative POSIX artifact path requires.
193
+ * @param {string} artifactPath - Validated artifact path.
194
+ * @returns {string[]} Ordered parent directory paths.
195
+ */
196
+ function artifactDirectoryPaths(artifactPath) {
197
+ const parts = artifactPath.split("/");
198
+ /** @type {string[]} */
199
+ const directories = [];
200
+ for (let index = 1; index < parts.length; index += 1)
201
+ directories.push(parts.slice(0, index).join("/"));
202
+ return directories;
203
+ }
204
+ /**
205
+ * Throws a normalized artifact-set diagnostic.
206
+ * @param {string} message - Failure detail.
207
+ * @param {string} target - Artifact target.
208
+ * @param {unknown} [error] - Preserved validation cause.
209
+ * @returns {never} Always throws.
210
+ */
211
+ function invalidArtifactSet(message, target, error) {
212
+ throw new SemantifoldDiagnostic({
213
+ cause: error instanceof Error ? error : undefined,
214
+ code: "INVALID_ARTIFACT_SET",
215
+ language: target,
216
+ message
217
+ });
218
+ }
219
+ /**
220
+ * Derives a safe diagnostic identity from an unknown request.
221
+ * @param {unknown} value - Candidate set.
222
+ * @returns {string} Diagnostic identity.
223
+ */
224
+ function targetOf(value) {
225
+ return isPlainObject(value) && typeof value.target == "string" && value.target.length > 0 ? value.target : "artifact";
226
+ }
227
+ /**
228
+ * Checks for an ordinary string-keyed object.
229
+ * @param {unknown} value - Candidate value.
230
+ * @returns {value is Record<string, unknown>} Whether the value is a plain object.
231
+ */
232
+ function isPlainObject(value) {
233
+ return typeof value == "object" && value != null && !Array.isArray(value) && Object.getPrototypeOf(value) == Object.prototype;
234
+ }
235
+ /**
236
+ * Validates an artifact-level related origin without interpreting source offsets as generated bytes.
237
+ * @param {unknown} value - Related-origin candidate.
238
+ * @param {string} artifactPath - Owning artifact path.
239
+ * @param {number} index - Origin index.
240
+ * @param {string} target - Artifact target.
241
+ * @returns {import("./semantic/types.js").RelatedOrigin} Detached related origin.
242
+ */
243
+ function validateRelatedOrigin(value, artifactPath, index, target) {
244
+ if (!isPlainObject(value) || typeof value.sourceId != "string" || value.sourceId.length == 0 ||
245
+ !isPlainObject(value.location) || typeof value.location.filename != "string" || value.location.filename.length == 0 ||
246
+ !validSourcePoint(value.location.start) || !validSourcePoint(value.location.end) ||
247
+ value.location.end.offset < value.location.start.offset || !isSourceRangeOrdered(value.location.start, value.location.end)) {
248
+ invalidArtifactSet(`Artifact '${artifactPath}' has malformed related origin ${index}.`, target);
249
+ }
250
+ return deepFreeze({
251
+ location: {
252
+ end: { ...value.location.end },
253
+ filename: value.location.filename,
254
+ start: { ...value.location.start }
255
+ },
256
+ sourceId: value.sourceId,
257
+ ...(optionalString(value.nodeId, "nodeId", artifactPath, index, target)),
258
+ ...(optionalString(value.symbolId, "symbolId", artifactPath, index, target)),
259
+ ...(optionalString(value.role, "role", artifactPath, index, target))
260
+ });
261
+ }
262
+ /**
263
+ * Validates one optional related-origin string field.
264
+ * @param {unknown} value - Candidate value.
265
+ * @param {string} property - Property name.
266
+ * @param {string} artifactPath - Owning artifact path.
267
+ * @param {number} index - Origin index.
268
+ * @param {string} target - Artifact target.
269
+ * @returns {Record<string, string>} Present validated property or an empty record.
270
+ */
271
+ function optionalString(value, property, artifactPath, index, target) {
272
+ if (value === undefined)
273
+ return {};
274
+ if (typeof value != "string" || value.length == 0) {
275
+ invalidArtifactSet(`Artifact '${artifactPath}' has invalid ${property} in related origin ${index}.`, target);
276
+ }
277
+ return { [property]: value };
278
+ }
279
+ /**
280
+ * Checks one UTF-16 source point.
281
+ * @param {unknown} value - Candidate point.
282
+ * @returns {value is import("./semantic/types.js").SourcePoint} Whether the point is structurally valid.
283
+ */
284
+ function validSourcePoint(value) {
285
+ return isPlainObject(value) && typeof value.line == "number" && Number.isSafeInteger(value.line) && value.line > 0 &&
286
+ typeof value.column == "number" && Number.isSafeInteger(value.column) && value.column > 0 &&
287
+ typeof value.offset == "number" && Number.isSafeInteger(value.offset) && value.offset >= 0;
288
+ }
289
+ /**
290
+ * Validates and detaches the Source Map v3 projection carried by a text artifact.
291
+ * @param {unknown} value - Source Map candidate.
292
+ * @param {string} artifactPath - Owning artifact path.
293
+ * @param {string} target - Artifact target.
294
+ * @returns {import("@jridgewell/gen-mapping").EncodedSourceMap} Detached Source Map.
295
+ */
296
+ function validateSourceMap(value, artifactPath, target) {
297
+ if (!isPlainObject(value) || value.version != 3 || value.file != artifactPath || typeof value.mappings != "string" ||
298
+ !isDenseArray(value.names) || !value.names.every((name) => typeof name == "string") ||
299
+ !isDenseArray(value.sources) || !value.sources.every((source) => typeof source == "string") ||
300
+ (value.sourcesContent !== undefined && (!isDenseArray(value.sourcesContent) ||
301
+ !value.sourcesContent.every((source) => source == null || typeof source == "string")))) {
302
+ invalidArtifactSet(`Text artifact '${artifactPath}' has malformed Source Map v3 provenance.`, target);
303
+ }
304
+ validateEncodedSourceMapMappings(
305
+ /** @type {import("@jridgewell/trace-mapping").EncodedSourceMap} */ ( /** @type {unknown} */(value)), artifactPath, target);
306
+ const detached = /** @type {unknown} */ (structuredClone(value));
307
+ return deepFreeze(/** @type {import("@jridgewell/gen-mapping").EncodedSourceMap} */ (detached));
308
+ }
309
+ /**
310
+ * Decodes and validates the Source Map payload with the installed mapping implementation.
311
+ * @param {import("@jridgewell/trace-mapping").EncodedSourceMap} sourceMap - Structurally validated map.
312
+ * @param {string} artifactPath - Owning artifact path.
313
+ * @param {string} target - Artifact target.
314
+ * @returns {void}
315
+ */
316
+ function validateEncodedSourceMapMappings(sourceMap, artifactPath, target) {
317
+ /** @type {Readonly<import("@jridgewell/trace-mapping").SourceMapSegment[][]>} */
318
+ let decoded;
319
+ let canonicalMappings;
320
+ try {
321
+ decoded = decodedMappings(new TraceMap(sourceMap));
322
+ const decodedMap = /** @type {import("@jridgewell/trace-mapping").DecodedSourceMap} */ ({
323
+ ...sourceMap,
324
+ mappings: structuredClone(decoded)
325
+ });
326
+ canonicalMappings = encodedMappings(presortedDecodedMap(decodedMap));
327
+ }
328
+ catch (error) {
329
+ invalidArtifactSet(`Text artifact '${artifactPath}' has invalid encoded Source Map mappings.`, target, error);
330
+ }
331
+ if (canonicalMappings != sourceMap.mappings ||
332
+ !validDecodedSourceMapMappings(decoded, sourceMap.sources.length, sourceMap.names.length)) {
333
+ invalidArtifactSet(`Text artifact '${artifactPath}' has invalid encoded Source Map mappings.`, target);
334
+ }
335
+ }
336
+ /**
337
+ * Validates decoded Source Map segment shape and referenced indices.
338
+ * @param {Readonly<import("@jridgewell/trace-mapping").SourceMapSegment[][]>} lines - Decoded mapping lines.
339
+ * @param {number} sourceCount - Declared source count.
340
+ * @param {number} nameCount - Declared name count.
341
+ * @returns {boolean} Whether every segment is semantically valid.
342
+ */
343
+ function validDecodedSourceMapMappings(lines, sourceCount, nameCount) {
344
+ return lines.every((line) => line.every((segment) => {
345
+ if (segment.length != 1 && segment.length != 4 && segment.length != 5)
346
+ return false;
347
+ if (!segment.every((field) => Number.isSafeInteger(field) && field >= 0))
348
+ return false;
349
+ if (segment.length == 1)
350
+ return true;
351
+ if (segment[1] >= sourceCount)
352
+ return false;
353
+ return segment.length == 4 || segment[4] < nameCount;
354
+ }));
355
+ }
356
+ /**
357
+ * Compares detached JSON values without depending on caller object-key order.
358
+ * @param {unknown} left - First JSON value.
359
+ * @param {unknown} right - Second JSON value.
360
+ * @returns {boolean} Whether both values are structurally identical.
361
+ */
362
+ function sameJsonValue(left, right) {
363
+ if (left === right)
364
+ return true;
365
+ if (Array.isArray(left) || Array.isArray(right)) {
366
+ return Array.isArray(left) && Array.isArray(right) && left.length == right.length &&
367
+ left.every((entry, index) => sameJsonValue(entry, right[index]));
368
+ }
369
+ if (!isPlainObject(left) || !isPlainObject(right))
370
+ return false;
371
+ const leftKeys = Object.keys(left);
372
+ const rightKeys = Object.keys(right);
373
+ return leftKeys.length == rightKeys.length &&
374
+ leftKeys.every((key) => Object.hasOwn(right, key) && sameJsonValue(left[key], right[key]));
375
+ }
376
+ /**
377
+ * Deeply freezes a detached JSON value.
378
+ * @template T
379
+ * @param {T} value - Detached value.
380
+ * @returns {T} Frozen value.
381
+ */
382
+ function deepFreeze(value) {
383
+ if (!value || typeof value != "object" || Object.isFrozen(value))
384
+ return value;
385
+ for (const nested of Object.values(value))
386
+ deepFreeze(nested);
387
+ return Object.freeze(value);
388
+ }
389
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FydGlmYWN0cy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDekcsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUMzRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUMzRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUUzRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDMUcsTUFBTSxnQkFBZ0IsR0FBRyx1RUFBdUUsQ0FBQTtBQUVoRzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLFNBQVM7SUFDbEQsSUFBSSxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLFNBQVMsQ0FBQyxNQUFNLElBQUksUUFBUSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUM7WUFDbEcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0s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Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU5RSxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGVjb2RlZE1hcHBpbmdzLCBlbmNvZGVkTWFwcGluZ3MsIHByZXNvcnRlZERlY29kZWRNYXAsIFRyYWNlTWFwfSBmcm9tIFwiQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZ1wiXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtpc1NhZmVBcnRpZmFjdFBhdGgsIGlzVmFsaWRGaWxlbmFtZU1ldGFkYXRhfSBmcm9tIFwiLi9hcnRpZmFjdC1wYXRoLmpzXCJcbmltcG9ydCB7ZmluYWxpemVCeXRlTWFwcGluZ30gZnJvbSBcIi4vYmluYXJ5LW1hcHBpbmcuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtmaW5hbGl6ZU1hcHBpbmcsIHRvU291cmNlTWFwVjN9IGZyb20gXCIuL21hcHBpbmcuanNcIlxuaW1wb3J0IHtpc1NvdXJjZVJhbmdlT3JkZXJlZH0gZnJvbSBcIi4vc2VtYW50aWMvbG9jYXRpb24uanNcIlxuaW1wb3J0IHtoYXNPbmx5VW5pY29kZVNjYWxhcnN9IGZyb20gXCIuL3NlbWFudGljL3NjYWxhcnMuanNcIlxuXG5jb25zdCBhcnRpZmFjdFJvbGVzID0gbmV3IFNldChbXCJlbnRyeVwiLCBcInNvdXJjZVwiLCBcIm1hbmlmZXN0XCIsIFwic3VwcG9ydFwiLCBcIm1hcHBpbmdcIiwgXCJyZXNvdXJjZVwiLCBcImxvYWRlclwiXSlcbmNvbnN0IG1lZGlhVHlwZVBhdHRlcm4gPSAvXltBLVphLXowLTkhIyQmXl8uKy1dK1xcL1tBLVphLXowLTkhIyQmXl8uKy1dKyg/OjtbXFx1MDAyMC1cXHUwMDdlXSspPyQvdVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uYWxseSB2YWxpZGF0ZXMgYW5kIGNvbnN0cnVjdHMgb25lIGRldGVybWluaXN0aWMgZ2VuZXJhdGVkIGFydGlmYWN0IHNldC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlIC0gQXJ0aWZhY3Qtc2V0IGZpZWxkcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0fSBEZXRhY2hlZCBpbW11dGFibGUgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXQoY2FuZGlkYXRlKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGNhbmRpZGF0ZSkgfHwgdHlwZW9mIGNhbmRpZGF0ZS50YXJnZXQgIT0gXCJzdHJpbmdcIiB8fCBjYW5kaWRhdGUudGFyZ2V0Lmxlbmd0aCA9PSAwIHx8XG4gICAgICAhL15bYS16XVthLXowLTktXSokL3UudGVzdChjYW5kaWRhdGUudGFyZ2V0KSkge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KFwiQXJ0aWZhY3Qgc2V0IHJlcXVpcmVzIGEgc3RhYmxlIGxvd2VyY2FzZSB0YXJnZXQgSUQuXCIsIHRhcmdldE9mKGNhbmRpZGF0ZSkpXG4gICAgfVxuICAgIGlmICghaXNEZW5zZUFycmF5KGNhbmRpZGF0ZS5hcnRpZmFjdHMpIHx8IGNhbmRpZGF0ZS5hcnRpZmFjdHMubGVuZ3RoID09IDApIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0IHNldCByZXF1aXJlcyBhIG5vbi1lbXB0eSBvcmRlcmVkIGFydGlmYWN0IGFycmF5LlwiLCBjYW5kaWRhdGUudGFyZ2V0KVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBjYW5kaWRhdGUudGFyZ2V0XG5cbiAgICBjb25zdCBwYXRocyA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IGRpcmVjdG9yeVBhdGhzID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBlbnRyeVBhdGhzID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkU2V0QXJ0aWZhY3RbXX0gKi9cbiAgICBjb25zdCBhcnRpZmFjdHMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNhbmRpZGF0ZS5hcnRpZmFjdHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBhcnRpZmFjdCA9IGNhbmRpZGF0ZS5hcnRpZmFjdHNbaW5kZXhdXG5cbiAgICAgIGlmICghaXNQbGFpbk9iamVjdChhcnRpZmFjdCkpIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJHtpbmRleH0gbXVzdCBiZSBhIHBsYWluIG9iamVjdC5gLCB0YXJnZXQpXG4gICAgICBjb25zdCBhcnRpZmFjdFBhdGggPSBhcnRpZmFjdC5wYXRoXG4gICAgICBjb25zdCBtZWRpYVR5cGUgPSBhcnRpZmFjdC5tZWRpYVR5cGVcbiAgICAgIGNvbnN0IHJvbGUgPSBhcnRpZmFjdC5yb2xlXG4gICAgICBjb25zdCBjb250ZW50S2luZCA9IGFydGlmYWN0LmNvbnRlbnRLaW5kXG5cbiAgICAgIGlmICghaXNTYWZlQXJ0aWZhY3RQYXRoKGFydGlmYWN0UGF0aCkpIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJHtpbmRleH0gaGFzIGFuIHVuc2FmZSBwYXRoLmAsIHRhcmdldClcbiAgICAgIGlmIChwYXRocy5oYXMoYXJ0aWZhY3RQYXRoKSkgaW52YWxpZEFydGlmYWN0U2V0KGBEdXBsaWNhdGUgYXJ0aWZhY3QgcGF0aCAnJHthcnRpZmFjdFBhdGh9Jy5gLCB0YXJnZXQpXG4gICAgICBpZiAoZGlyZWN0b3J5UGF0aHMuaGFzKGFydGlmYWN0UGF0aCkpIHtcbiAgICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCBwYXRoICcke2FydGlmYWN0UGF0aH0nIGNvbGxpZGVzIHdpdGggYSByZXF1aXJlZCBkaXJlY3RvcnkuYCwgdGFyZ2V0KVxuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aHMgPSBhcnRpZmFjdERpcmVjdG9yeVBhdGhzKGFydGlmYWN0UGF0aClcblxuICAgICAgZm9yIChjb25zdCBwYXJlbnRQYXRoIG9mIHBhcmVudFBhdGhzKSB7XG4gICAgICAgIGlmIChwYXRocy5oYXMocGFyZW50UGF0aCkpIHtcbiAgICAgICAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYEFydGlmYWN0IHBhdGggJyR7YXJ0aWZhY3RQYXRofScgZGVzY2VuZHMgZnJvbSBhcnRpZmFjdCBmaWxlICcke3BhcmVudFBhdGh9Jy5gLCB0YXJnZXQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhdGhzLmFkZChhcnRpZmFjdFBhdGgpXG4gICAgICBmb3IgKGNvbnN0IHBhcmVudFBhdGggb2YgcGFyZW50UGF0aHMpIGRpcmVjdG9yeVBhdGhzLmFkZChwYXJlbnRQYXRoKVxuICAgICAgaWYgKHR5cGVvZiBtZWRpYVR5cGUgIT0gXCJzdHJpbmdcIiB8fCAhbWVkaWFUeXBlUGF0dGVybi50ZXN0KG1lZGlhVHlwZSkgfHwgL1tcXHJcXG5dL3UudGVzdChtZWRpYVR5cGUpKSB7XG4gICAgICAgIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGFuIGludmFsaWQgbWVkaWEgdHlwZS5gLCB0YXJnZXQpXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJvbGUgIT0gXCJzdHJpbmdcIiB8fCAhYXJ0aWZhY3RSb2xlcy5oYXMocm9sZSkpIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGFuIGludmFsaWQgcm9sZS5gLCB0YXJnZXQpXG4gICAgICBpZiAoYXJ0aWZhY3Qub3duZXJzaGlwICE9IFwiZ2VuZXJhdGVkXCIpIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgbXVzdCBoYXZlIGdlbmVyYXRlZCBvd25lcnNoaXAuYCwgdGFyZ2V0KVxuICAgICAgaWYgKHJvbGUgPT0gXCJlbnRyeVwiKSB7XG4gICAgICAgIGlmIChlbnRyeVBhdGhzLmxlbmd0aCA+IDApIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0IHNldCBtdXN0IGRlY2xhcmUgZXhhY3RseSBvbmUgZW50cnkgYXJ0aWZhY3QuXCIsIHRhcmdldClcbiAgICAgICAgZW50cnlQYXRocy5wdXNoKGFydGlmYWN0UGF0aClcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGVudFZhbHVlID0gYXJ0aWZhY3QuY29udGVudFxuICAgICAgLyoqIEB0eXBlIHtzdHJpbmcgfCBVaW50OEFycmF5fSAqL1xuICAgICAgbGV0IGNvbnRlbnRcblxuICAgICAgaWYgKGNvbnRlbnRLaW5kID09IFwidGV4dFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudFZhbHVlICE9IFwic3RyaW5nXCIgfHwgY29udGVudFZhbHVlLmxlbmd0aCA9PSAwIHx8ICFoYXNPbmx5VW5pY29kZVNjYWxhcnMoY29udGVudFZhbHVlKSkge1xuICAgICAgICAgIGludmFsaWRBcnRpZmFjdFNldChgVGV4dCBhcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyByZXF1aXJlcyBub24tZW1wdHkgc3RyaW5nIGNvbnRlbnQuYCwgdGFyZ2V0KVxuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50VmFsdWVcbiAgICAgIH0gZWxzZSBpZiAoY29udGVudEtpbmQgPT0gXCJiaW5hcnlcIikge1xuICAgICAgICBpZiAoIShjb250ZW50VmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBjb250ZW50VmFsdWUuYnl0ZUxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBCaW5hcnkgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgcmVxdWlyZXMgbm9uLWVtcHR5IGJ5dGVzLmAsIHRhcmdldClcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoY29udGVudFZhbHVlKVxuICAgICAgfSBlbHNlIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGFuIGludmFsaWQgY29udGVudCBraW5kLmAsIHRhcmdldClcblxuICAgICAgY29uc3QgcHJvdmVuYW5jZSA9IHZhbGlkYXRlQXJ0aWZhY3RQcm92ZW5hbmNlKGFydGlmYWN0LnByb3ZlbmFuY2UsIGNvbnRlbnRLaW5kLCBhcnRpZmFjdFBhdGgsIGNvbnRlbnQsIHRhcmdldClcblxuICAgICAgYXJ0aWZhY3RzLnB1c2goLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZFNldEFydGlmYWN0fSAqLyAoZnJlZXplQXJ0aWZhY3Qoe1xuICAgICAgICBjb250ZW50LFxuICAgICAgICBjb250ZW50S2luZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBvd25lcnNoaXA6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImdlbmVyYXRlZFwiKSxcbiAgICAgICAgcGF0aDogYXJ0aWZhY3RQYXRoLFxuICAgICAgICBwcm92ZW5hbmNlLFxuICAgICAgICByb2xlXG4gICAgICB9KSkpXG4gICAgfVxuXG4gICAgaWYgKGVudHJ5UGF0aHMubGVuZ3RoICE9IDEpIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0IHNldCBtdXN0IGRlY2xhcmUgZXhhY3RseSBvbmUgZW50cnkgYXJ0aWZhY3QuXCIsIGNhbmRpZGF0ZS50YXJnZXQpXG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBhcnRpZmFjdHM6IE9iamVjdC5mcmVlemUoYXJ0aWZhY3RzKSxcbiAgICAgIGVudHJ5OiBlbnRyeVBhdGhzWzBdLFxuICAgICAgc2NoZW1hOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJHZW5lcmF0ZWRBcnRpZmFjdFNldFwiKSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcnNpb246IC8qKiBAdHlwZSB7Y29uc3R9ICovICgxKVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VtYW50aWZvbGREaWFnbm9zdGljICYmIGVycm9yLmNvZGUgPT0gXCJJTlZBTElEX0FSVElGQUNUX1NFVFwiKSB0aHJvdyBlcnJvclxuXG4gICAgcmV0dXJuIGludmFsaWRBcnRpZmFjdFNldChcIkFydGlmYWN0LXNldCB2YWxpZGF0aW9uIGZhaWxlZC5cIiwgdGFyZ2V0T2YoY2FuZGlkYXRlKSwgZXJyb3IpXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYXJ0aWZhY3QtbGV2ZWwgdGV4dCwgYnl0ZSwgb3Igc3ludGhldGljIHByb3ZlbmFuY2UuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUHJvdmVuYW5jZSBjYW5kaWRhdGUuXG4gKiBAcGFyYW0ge3Vua25vd259IGNvbnRlbnRLaW5kIC0gVmFsaWRhdGVkIGFydGlmYWN0IGNvbnRlbnQga2luZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnRpZmFjdFBhdGggLSBWYWxpZGF0ZWQgYXJ0aWZhY3QgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIERldGFjaGVkIGFydGlmYWN0IGNvbnRlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gQXJ0aWZhY3QgdGFyZ2V0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQXJ0aWZhY3RQcm92ZW5hbmNlfSBWYWxpZGF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBcnRpZmFjdFByb3ZlbmFuY2UodmFsdWUsIGNvbnRlbnRLaW5kLCBhcnRpZmFjdFBhdGgsIGNvbnRlbnQsIHRhcmdldCkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSBpbnZhbGlkQXJ0aWZhY3RTZXQoYEFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIHJlcXVpcmVzIHByb3ZlbmFuY2UuYCwgdGFyZ2V0KVxuXG4gIGlmICh2YWx1ZS5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlLnJlYXNvbiAhPSBcInN0cmluZ1wiIHx8IHZhbHVlLnJlYXNvbi5sZW5ndGggPT0gMCB8fCAhaXNEZW5zZUFycmF5KHZhbHVlLnJlbGF0ZWRPcmlnaW5zKSkge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBTeW50aGV0aWMgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVhc29uIGFuZCByZWxhdGVkIG9yaWdpbnMuYCwgdGFyZ2V0KVxuICAgIH1cbiAgICBpZiAoY29udGVudEtpbmQgPT0gXCJiaW5hcnlcIikge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBCaW5hcnkgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgcmVxdWlyZXMgYnl0ZS1yYW5nZSBwcm92ZW5hbmNlLmAsIHRhcmdldClcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gKi9cbiAgICBjb25zdCByZWxhdGVkT3JpZ2lucyA9IFtdXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWUucmVsYXRlZE9yaWdpbnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICByZWxhdGVkT3JpZ2lucy5wdXNoKHZhbGlkYXRlUmVsYXRlZE9yaWdpbih2YWx1ZS5yZWxhdGVkT3JpZ2luc1tpbmRleF0sIGFydGlmYWN0UGF0aCwgaW5kZXgsIHRhcmdldCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSwgcmVhc29uOiB2YWx1ZS5yZWFzb24sIHJlbGF0ZWRPcmlnaW5zOiBPYmplY3QuZnJlZXplKHJlbGF0ZWRPcmlnaW5zKX0pXG4gIH1cblxuICBpZiAodmFsdWUua2luZCA9PSBcInRleHRcIikge1xuICAgIGNvbnN0IG1hcHBpbmdDYW5kaWRhdGUgPSB2YWx1ZS5tYXBwaW5nXG5cbiAgICBpZiAoY29udGVudEtpbmQgIT0gXCJ0ZXh0XCIgfHwgIWlzUGxhaW5PYmplY3QobWFwcGluZ0NhbmRpZGF0ZSkgfHwgbWFwcGluZ0NhbmRpZGF0ZS5zY2hlbWEgIT0gXCJTZW1hbnRpZm9sZE1hcHBpbmdcIiB8fFxuICAgICAgIWlzUGxhaW5PYmplY3QobWFwcGluZ0NhbmRpZGF0ZS5nZW5lcmF0ZWQpIHx8IG1hcHBpbmdDYW5kaWRhdGUuZ2VuZXJhdGVkLmZpbGVuYW1lICE9IGFydGlmYWN0UGF0aCB8fFxuICAgICAgbWFwcGluZ0NhbmRpZGF0ZS5nZW5lcmF0ZWQuY29udGVudCAhPSBjb250ZW50IHx8ICFpc1BsYWluT2JqZWN0KHZhbHVlLnNvdXJjZU1hcCkpIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChgVGV4dCBhcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgbWlzbWF0Y2hlZCByaWNoIG9yIFNvdXJjZSBNYXAgcHJvdmVuYW5jZS5gLCB0YXJnZXQpXG4gICAgfVxuICAgIGlmICh2YWx1ZS5zb3VyY2VNYXBGaWxlbmFtZSAhPT0gdW5kZWZpbmVkICYmICFpc1ZhbGlkRmlsZW5hbWVNZXRhZGF0YSh2YWx1ZS5zb3VyY2VNYXBGaWxlbmFtZSkpIHtcbiAgICAgIGludmFsaWRBcnRpZmFjdFNldChgVGV4dCBhcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgaW52YWxpZCBTb3VyY2UgTWFwIGZpbGVuYW1lIG1ldGFkYXRhLmAsIHRhcmdldClcbiAgICB9XG4gICAgY29uc3QgbWFwcGluZyA9IGZpbmFsaXplTWFwcGluZyhtYXBwaW5nQ2FuZGlkYXRlKVxuICAgIGNvbnN0IHNvdXJjZU1hcCA9IHZhbGlkYXRlU291cmNlTWFwKHZhbHVlLnNvdXJjZU1hcCwgYXJ0aWZhY3RQYXRoLCB0YXJnZXQpXG4gICAgY29uc3QgcHJvamVjdGVkU291cmNlTWFwID0gdG9Tb3VyY2VNYXBWMyhtYXBwaW5nKVxuXG4gICAgaWYgKCFzYW1lSnNvblZhbHVlKHNvdXJjZU1hcCwgcHJvamVjdGVkU291cmNlTWFwKSkge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBUZXh0IGFydGlmYWN0ICcke2FydGlmYWN0UGF0aH0nIGhhcyBTb3VyY2UgTWFwIHByb3ZlbmFuY2UgdGhhdCBjb250cmFkaWN0cyBpdHMgcmljaCBtYXBwaW5nLmAsIHRhcmdldClcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJ0ZXh0XCIpLFxuICAgICAgbWFwcGluZyxcbiAgICAgIHNvdXJjZU1hcCxcbiAgICAgIHNvdXJjZU1hcEZpbGVuYW1lOiB2YWx1ZS5zb3VyY2VNYXBGaWxlbmFtZVxuICAgIH0pXG4gIH1cblxuICBpZiAodmFsdWUua2luZCA9PSBcImJ5dGVzXCIpIHtcbiAgICBpZiAoY29udGVudEtpbmQgIT0gXCJiaW5hcnlcIikgaW52YWxpZEFydGlmYWN0U2V0KGBCeXRlIHByb3ZlbmFuY2UgcmVxdWlyZXMgYmluYXJ5IGNvbnRlbnQgZm9yICcke2FydGlmYWN0UGF0aH0nLmAsIHRhcmdldClcbiAgICBjb25zdCBtYXBwaW5nID0gZmluYWxpemVCeXRlTWFwcGluZyh2YWx1ZS5tYXBwaW5nKVxuXG4gICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkLnBhdGggIT0gYXJ0aWZhY3RQYXRoIHx8IG1hcHBpbmcuZ2VuZXJhdGVkLmJ5dGVMZW5ndGggIT0gLyoqIEB0eXBlIHtVaW50OEFycmF5fSAqLyAoY29udGVudCkuYnl0ZUxlbmd0aCkge1xuICAgICAgaW52YWxpZEFydGlmYWN0U2V0KGBCeXRlIHByb3ZlbmFuY2UgZG9lcyBub3QgbWF0Y2ggYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScuYCwgdGFyZ2V0KVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJieXRlc1wiKSwgbWFwcGluZ30pXG4gIH1cblxuICByZXR1cm4gaW52YWxpZEFydGlmYWN0U2V0KGBBcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgYW4gdW5rbm93biBwcm92ZW5hbmNlIGtpbmQuYCwgdGFyZ2V0KVxufVxuXG4vKipcbiAqIEZyZWV6ZXMgb25lIHZhbGlkYXRlZCBhcnRpZmFjdCByZWNvcmQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhcnRpZmFjdCAtIFZhbGlkYXRlZCBmaWVsZHMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+fSBGcm96ZW4gcmVjb3JkLlxuICovXG5mdW5jdGlvbiBmcmVlemVBcnRpZmFjdChhcnRpZmFjdCkge1xuICBpZiAoYXJ0aWZhY3QuY29udGVudEtpbmQgPT0gXCJiaW5hcnlcIiAmJiBhcnRpZmFjdC5jb250ZW50IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhcnRpZmFjdC5jb250ZW50XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJ0aWZhY3QsIFwiY29udGVudFwiLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGNvbnRlbnQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKGFydGlmYWN0KVxufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IGRpcmVjdG9yeSBhIHNhZmUgcmVsYXRpdmUgUE9TSVggYXJ0aWZhY3QgcGF0aCByZXF1aXJlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnRpZmFjdFBhdGggLSBWYWxpZGF0ZWQgYXJ0aWZhY3QgcGF0aC5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gT3JkZXJlZCBwYXJlbnQgZGlyZWN0b3J5IHBhdGhzLlxuICovXG5mdW5jdGlvbiBhcnRpZmFjdERpcmVjdG9yeVBhdGhzKGFydGlmYWN0UGF0aCkge1xuICBjb25zdCBwYXJ0cyA9IGFydGlmYWN0UGF0aC5zcGxpdChcIi9cIilcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgZGlyZWN0b3JpZXMgPSBbXVxuXG4gIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBwYXJ0cy5sZW5ndGg7IGluZGV4ICs9IDEpIGRpcmVjdG9yaWVzLnB1c2gocGFydHMuc2xpY2UoMCwgaW5kZXgpLmpvaW4oXCIvXCIpKVxuXG4gIHJldHVybiBkaXJlY3Rvcmllc1xufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgYXJ0aWZhY3Qtc2V0IGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEZhaWx1cmUgZGV0YWlsLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFydGlmYWN0IHRhcmdldC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gW2Vycm9yXSAtIFByZXNlcnZlZCB2YWxpZGF0aW9uIGNhdXNlLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkQXJ0aWZhY3RTZXQobWVzc2FnZSwgdGFyZ2V0LCBlcnJvcikge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgIGNvZGU6IFwiSU5WQUxJRF9BUlRJRkFDVF9TRVRcIixcbiAgICBsYW5ndWFnZTogdGFyZ2V0LFxuICAgIG1lc3NhZ2VcbiAgfSlcbn1cblxuLyoqXG4gKiBEZXJpdmVzIGEgc2FmZSBkaWFnbm9zdGljIGlkZW50aXR5IGZyb20gYW4gdW5rbm93biByZXF1ZXN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBzZXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBEaWFnbm9zdGljIGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiB0YXJnZXRPZih2YWx1ZSkge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlLnRhcmdldCA9PSBcInN0cmluZ1wiICYmIHZhbHVlLnRhcmdldC5sZW5ndGggPiAwID8gdmFsdWUudGFyZ2V0IDogXCJhcnRpZmFjdFwiXG59XG5cbi8qKlxuICogQ2hlY2tzIGZvciBhbiBvcmRpbmFyeSBzdHJpbmcta2V5ZWQgb2JqZWN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT0gT2JqZWN0LnByb3RvdHlwZVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbiBhcnRpZmFjdC1sZXZlbCByZWxhdGVkIG9yaWdpbiB3aXRob3V0IGludGVycHJldGluZyBzb3VyY2Ugb2Zmc2V0cyBhcyBnZW5lcmF0ZWQgYnl0ZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmVsYXRlZC1vcmlnaW4gY2FuZGlkYXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFydGlmYWN0UGF0aCAtIE93bmluZyBhcnRpZmFjdCBwYXRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gT3JpZ2luIGluZGV4LlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFydGlmYWN0IHRhcmdldC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IERldGFjaGVkIHJlbGF0ZWQgb3JpZ2luLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJlbGF0ZWRPcmlnaW4odmFsdWUsIGFydGlmYWN0UGF0aCwgaW5kZXgsIHRhcmdldCkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZS5zb3VyY2VJZCAhPSBcInN0cmluZ1wiIHx8IHZhbHVlLnNvdXJjZUlkLmxlbmd0aCA9PSAwIHx8XG4gICAgIWlzUGxhaW5PYmplY3QodmFsdWUubG9jYXRpb24pIHx8IHR5cGVvZiB2YWx1ZS5sb2NhdGlvbi5maWxlbmFtZSAhPSBcInN0cmluZ1wiIHx8IHZhbHVlLmxvY2F0aW9uLmZpbGVuYW1lLmxlbmd0aCA9PSAwIHx8XG4gICAgIXZhbGlkU291cmNlUG9pbnQodmFsdWUubG9jYXRpb24uc3RhcnQpIHx8ICF2YWxpZFNvdXJjZVBvaW50KHZhbHVlLmxvY2F0aW9uLmVuZCkgfHxcbiAgICB2YWx1ZS5sb2NhdGlvbi5lbmQub2Zmc2V0IDwgdmFsdWUubG9jYXRpb24uc3RhcnQub2Zmc2V0IHx8ICFpc1NvdXJjZVJhbmdlT3JkZXJlZCh2YWx1ZS5sb2NhdGlvbi5zdGFydCwgdmFsdWUubG9jYXRpb24uZW5kKSkge1xuICAgIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIG1hbGZvcm1lZCByZWxhdGVkIG9yaWdpbiAke2luZGV4fS5gLCB0YXJnZXQpXG4gIH1cblxuICByZXR1cm4gZGVlcEZyZWV6ZSh7XG4gICAgbG9jYXRpb246IHtcbiAgICAgIGVuZDogey4uLnZhbHVlLmxvY2F0aW9uLmVuZH0sXG4gICAgICBmaWxlbmFtZTogdmFsdWUubG9jYXRpb24uZmlsZW5hbWUsXG4gICAgICBzdGFydDogey4uLnZhbHVlLmxvY2F0aW9uLnN0YXJ0fVxuICAgIH0sXG4gICAgc291cmNlSWQ6IHZhbHVlLnNvdXJjZUlkLFxuICAgIC4uLihvcHRpb25hbFN0cmluZyh2YWx1ZS5ub2RlSWQsIFwibm9kZUlkXCIsIGFydGlmYWN0UGF0aCwgaW5kZXgsIHRhcmdldCkpLFxuICAgIC4uLihvcHRpb25hbFN0cmluZyh2YWx1ZS5zeW1ib2xJZCwgXCJzeW1ib2xJZFwiLCBhcnRpZmFjdFBhdGgsIGluZGV4LCB0YXJnZXQpKSxcbiAgICAuLi4ob3B0aW9uYWxTdHJpbmcodmFsdWUucm9sZSwgXCJyb2xlXCIsIGFydGlmYWN0UGF0aCwgaW5kZXgsIHRhcmdldCkpXG4gIH0pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBvcHRpb25hbCByZWxhdGVkLW9yaWdpbiBzdHJpbmcgZmllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gUHJvcGVydHkgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnRpZmFjdFBhdGggLSBPd25pbmcgYXJ0aWZhY3QgcGF0aC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIE9yaWdpbiBpbmRleC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdCB0YXJnZXQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gUHJlc2VudCB2YWxpZGF0ZWQgcHJvcGVydHkgb3IgYW4gZW1wdHkgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBvcHRpb25hbFN0cmluZyh2YWx1ZSwgcHJvcGVydHksIGFydGlmYWN0UGF0aCwgaW5kZXgsIHRhcmdldCkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHt9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRBcnRpZmFjdFNldChgQXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGludmFsaWQgJHtwcm9wZXJ0eX0gaW4gcmVsYXRlZCBvcmlnaW4gJHtpbmRleH0uYCwgdGFyZ2V0KVxuICB9XG5cbiAgcmV0dXJuIHtbcHJvcGVydHldOiB2YWx1ZX1cbn1cblxuLyoqXG4gKiBDaGVja3Mgb25lIFVURi0xNiBzb3VyY2UgcG9pbnQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHBvaW50LlxuICogQHJldHVybnMge3ZhbHVlIGlzIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlUG9pbnR9IFdoZXRoZXIgdGhlIHBvaW50IGlzIHN0cnVjdHVyYWxseSB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRTb3VyY2VQb2ludCh2YWx1ZSkge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlLmxpbmUgPT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZS5saW5lKSAmJiB2YWx1ZS5saW5lID4gMCAmJlxuICAgIHR5cGVvZiB2YWx1ZS5jb2x1bW4gPT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZS5jb2x1bW4pICYmIHZhbHVlLmNvbHVtbiA+IDAgJiZcbiAgICB0eXBlb2YgdmFsdWUub2Zmc2V0ID09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUub2Zmc2V0KSAmJiB2YWx1ZS5vZmZzZXQgPj0gMFxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbmQgZGV0YWNoZXMgdGhlIFNvdXJjZSBNYXAgdjMgcHJvamVjdGlvbiBjYXJyaWVkIGJ5IGEgdGV4dCBhcnRpZmFjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBTb3VyY2UgTWFwIGNhbmRpZGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnRpZmFjdFBhdGggLSBPd25pbmcgYXJ0aWZhY3QgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBcnRpZmFjdCB0YXJnZXQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gRGV0YWNoZWQgU291cmNlIE1hcC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTb3VyY2VNYXAodmFsdWUsIGFydGlmYWN0UGF0aCwgdGFyZ2V0KSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkgfHwgdmFsdWUudmVyc2lvbiAhPSAzIHx8IHZhbHVlLmZpbGUgIT0gYXJ0aWZhY3RQYXRoIHx8IHR5cGVvZiB2YWx1ZS5tYXBwaW5ncyAhPSBcInN0cmluZ1wiIHx8XG4gICAgIWlzRGVuc2VBcnJheSh2YWx1ZS5uYW1lcykgfHwgIXZhbHVlLm5hbWVzLmV2ZXJ5KChuYW1lKSA9PiB0eXBlb2YgbmFtZSA9PSBcInN0cmluZ1wiKSB8fFxuICAgICFpc0RlbnNlQXJyYXkodmFsdWUuc291cmNlcykgfHwgIXZhbHVlLnNvdXJjZXMuZXZlcnkoKHNvdXJjZSkgPT4gdHlwZW9mIHNvdXJjZSA9PSBcInN0cmluZ1wiKSB8fFxuICAgICh2YWx1ZS5zb3VyY2VzQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICghaXNEZW5zZUFycmF5KHZhbHVlLnNvdXJjZXNDb250ZW50KSB8fFxuICAgICAgIXZhbHVlLnNvdXJjZXNDb250ZW50LmV2ZXJ5KChzb3VyY2UpID0+IHNvdXJjZSA9PSBudWxsIHx8IHR5cGVvZiBzb3VyY2UgPT0gXCJzdHJpbmdcIikpKSkge1xuICAgIGludmFsaWRBcnRpZmFjdFNldChgVGV4dCBhcnRpZmFjdCAnJHthcnRpZmFjdFBhdGh9JyBoYXMgbWFsZm9ybWVkIFNvdXJjZSBNYXAgdjMgcHJvdmVuYW5jZS5gLCB0YXJnZXQpXG4gIH1cbiAgdmFsaWRhdGVFbmNvZGVkU291cmNlTWFwTWFwcGluZ3MoXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh2YWx1ZSkpLFxuICAgIGFydGlmYWN0UGF0aCxcbiAgICB0YXJnZXRcbiAgKVxuXG4gIGNvbnN0IGRldGFjaGVkID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoc3RydWN0dXJlZENsb25lKHZhbHVlKSlcblxuICByZXR1cm4gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nXCIpLkVuY29kZWRTb3VyY2VNYXB9ICovIChkZXRhY2hlZCkpXG59XG5cbi8qKlxuICogRGVjb2RlcyBhbmQgdmFsaWRhdGVzIHRoZSBTb3VyY2UgTWFwIHBheWxvYWQgd2l0aCB0aGUgaW5zdGFsbGVkIG1hcHBpbmcgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gc291cmNlTWFwIC0gU3RydWN0dXJhbGx5IHZhbGlkYXRlZCBtYXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJ0aWZhY3RQYXRoIC0gT3duaW5nIGFydGlmYWN0IHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gQXJ0aWZhY3QgdGFyZ2V0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRW5jb2RlZFNvdXJjZU1hcE1hcHBpbmdzKHNvdXJjZU1hcCwgYXJ0aWZhY3RQYXRoLCB0YXJnZXQpIHtcbiAgLyoqIEB0eXBlIHtSZWFkb25seTxpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLlNvdXJjZU1hcFNlZ21lbnRbXVtdPn0gKi9cbiAgbGV0IGRlY29kZWRcbiAgbGV0IGNhbm9uaWNhbE1hcHBpbmdzXG5cbiAgdHJ5IHtcbiAgICBkZWNvZGVkID0gZGVjb2RlZE1hcHBpbmdzKG5ldyBUcmFjZU1hcChzb3VyY2VNYXApKVxuICAgIGNvbnN0IGRlY29kZWRNYXAgPSAvKiogQHR5cGUge2ltcG9ydChcIkBqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmdcIikuRGVjb2RlZFNvdXJjZU1hcH0gKi8gKHtcbiAgICAgIC4uLnNvdXJjZU1hcCxcbiAgICAgIG1hcHBpbmdzOiBzdHJ1Y3R1cmVkQ2xvbmUoZGVjb2RlZClcbiAgICB9KVxuXG4gICAgY2Fub25pY2FsTWFwcGluZ3MgPSBlbmNvZGVkTWFwcGluZ3MocHJlc29ydGVkRGVjb2RlZE1hcChkZWNvZGVkTWFwKSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYFRleHQgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGludmFsaWQgZW5jb2RlZCBTb3VyY2UgTWFwIG1hcHBpbmdzLmAsIHRhcmdldCwgZXJyb3IpXG4gIH1cblxuICBpZiAoY2Fub25pY2FsTWFwcGluZ3MgIT0gc291cmNlTWFwLm1hcHBpbmdzIHx8XG4gICAgIXZhbGlkRGVjb2RlZFNvdXJjZU1hcE1hcHBpbmdzKGRlY29kZWQsIHNvdXJjZU1hcC5zb3VyY2VzLmxlbmd0aCwgc291cmNlTWFwLm5hbWVzLmxlbmd0aCkpIHtcbiAgICBpbnZhbGlkQXJ0aWZhY3RTZXQoYFRleHQgYXJ0aWZhY3QgJyR7YXJ0aWZhY3RQYXRofScgaGFzIGludmFsaWQgZW5jb2RlZCBTb3VyY2UgTWFwIG1hcHBpbmdzLmAsIHRhcmdldClcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBkZWNvZGVkIFNvdXJjZSBNYXAgc2VnbWVudCBzaGFwZSBhbmQgcmVmZXJlbmNlZCBpbmRpY2VzLlxuICogQHBhcmFtIHtSZWFkb25seTxpbXBvcnQoXCJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nXCIpLlNvdXJjZU1hcFNlZ21lbnRbXVtdPn0gbGluZXMgLSBEZWNvZGVkIG1hcHBpbmcgbGluZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gc291cmNlQ291bnQgLSBEZWNsYXJlZCBzb3VyY2UgY291bnQuXG4gKiBAcGFyYW0ge251bWJlcn0gbmFtZUNvdW50IC0gRGVjbGFyZWQgbmFtZSBjb3VudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGV2ZXJ5IHNlZ21lbnQgaXMgc2VtYW50aWNhbGx5IHZhbGlkLlxuICovXG5mdW5jdGlvbiB2YWxpZERlY29kZWRTb3VyY2VNYXBNYXBwaW5ncyhsaW5lcywgc291cmNlQ291bnQsIG5hbWVDb3VudCkge1xuICByZXR1cm4gbGluZXMuZXZlcnkoKGxpbmUpID0+IGxpbmUuZXZlcnkoKHNlZ21lbnQpID0+IHtcbiAgICBpZiAoc2VnbWVudC5sZW5ndGggIT0gMSAmJiBzZWdtZW50Lmxlbmd0aCAhPSA0ICYmIHNlZ21lbnQubGVuZ3RoICE9IDUpIHJldHVybiBmYWxzZVxuICAgIGlmICghc2VnbWVudC5ldmVyeSgoZmllbGQpID0+IE51bWJlci5pc1NhZmVJbnRlZ2VyKGZpZWxkKSAmJiBmaWVsZCA+PSAwKSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHNlZ21lbnQubGVuZ3RoID09IDEpIHJldHVybiB0cnVlXG4gICAgaWYgKHNlZ21lbnRbMV0gPj0gc291cmNlQ291bnQpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIHNlZ21lbnQubGVuZ3RoID09IDQgfHwgc2VnbWVudFs0XSA8IG5hbWVDb3VudFxuICB9KSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBkZXRhY2hlZCBKU09OIHZhbHVlcyB3aXRob3V0IGRlcGVuZGluZyBvbiBjYWxsZXIgb2JqZWN0LWtleSBvcmRlci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbGVmdCAtIEZpcnN0IEpTT04gdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHJpZ2h0IC0gU2Vjb25kIEpTT04gdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBib3RoIHZhbHVlcyBhcmUgc3RydWN0dXJhbGx5IGlkZW50aWNhbC5cbiAqL1xuZnVuY3Rpb24gc2FtZUpzb25WYWx1ZShsZWZ0LCByaWdodCkge1xuICBpZiAobGVmdCA9PT0gcmlnaHQpIHJldHVybiB0cnVlXG4gIGlmIChBcnJheS5pc0FycmF5KGxlZnQpIHx8IEFycmF5LmlzQXJyYXkocmlnaHQpKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGVmdCkgJiYgQXJyYXkuaXNBcnJheShyaWdodCkgJiYgbGVmdC5sZW5ndGggPT0gcmlnaHQubGVuZ3RoICYmXG4gICAgICBsZWZ0LmV2ZXJ5KChlbnRyeSwgaW5kZXgpID0+IHNhbWVKc29uVmFsdWUoZW50cnksIHJpZ2h0W2luZGV4XSkpXG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGxlZnQpIHx8ICFpc1BsYWluT2JqZWN0KHJpZ2h0KSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGxlZnRLZXlzID0gT2JqZWN0LmtleXMobGVmdClcbiAgY29uc3QgcmlnaHRLZXlzID0gT2JqZWN0LmtleXMocmlnaHQpXG5cbiAgcmV0dXJuIGxlZnRLZXlzLmxlbmd0aCA9PSByaWdodEtleXMubGVuZ3RoICYmXG4gICAgbGVmdEtleXMuZXZlcnkoKGtleSkgPT4gT2JqZWN0Lmhhc093bihyaWdodCwga2V5KSAmJiBzYW1lSnNvblZhbHVlKGxlZnRba2V5XSwgcmlnaHRba2V5XSkpXG59XG5cbi8qKlxuICogRGVlcGx5IGZyZWV6ZXMgYSBkZXRhY2hlZCBKU09OIHZhbHVlLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gdmFsdWUgLSBEZXRhY2hlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtUfSBGcm96ZW4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZXBGcmVlemUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZGVlcEZyZWV6ZShuZXN0ZWQpXG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWUpXG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"identifiers.d.ts","sourceRoot":"","sources":["../../../src/backends/identifiers.js"],"names":[],"mappings":"AA8DA;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EANtC,OAAO,sBAAsB,EAAE,gBAMO,EAAE,IAAI,EAL5C,OAK4C,EAAE,IAAI,EAJlD,MAIkD,EAAE,QAAQ,EAH5D,OAAO,sBAAsB,EAAE,cAAc,GAAG,SAGY,GAF1D,IAAI,CAUhB;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAN7C,OAAO,sBAAsB,EAAE,gBAMc,EAAE,IAAI,EALnD,OAKmD,EAAE,IAAI,EAJzD,MAIyD,EAAE,QAAQ,EAHnE,OAAO,sBAAsB,EAAE,cAAc,GAAG,SAGmB,GAFjE,IAAI,CAchB"}
1
+ {"version":3,"file":"identifiers.d.ts","sourceRoot":"","sources":["../../../src/backends/identifiers.js"],"names":[],"mappings":"AAqEA;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EANtC,OAAO,sBAAsB,EAAE,gBAMO,EAAE,IAAI,EAL5C,OAK4C,EAAE,IAAI,EAJlD,MAIkD,EAAE,QAAQ,EAH5D,OAAO,sBAAsB,EAAE,cAAc,GAAG,SAGY,GAF1D,IAAI,CAWhB;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAN7C,OAAO,sBAAsB,EAAE,gBAMc,EAAE,IAAI,EALnD,OAKmD,EAAE,IAAI,EAJzD,MAIyD,EAAE,QAAQ,EAHnE,OAAO,sBAAsB,EAAE,cAAc,GAAG,SAGmB,GAFjE,IAAI,CAchB"}
@@ -5,6 +5,7 @@ const identifierPatterns = {
5
5
  java: /^[A-Za-z_$][A-Za-z0-9_$]*$/u,
6
6
  javascript: /^[A-Za-z_$][A-Za-z0-9_$]*$/u,
7
7
  php: /^[A-Za-z_][A-Za-z0-9_]*$/u,
8
+ python: /^(?:_|\p{XID_Start})(?:_|\p{XID_Continue})*$/u,
8
9
  ruby: /^[a-z_][A-Za-z0-9_]*$/u,
9
10
  typescript: /^[A-Za-z_$][A-Za-z0-9_$]*$/u
10
11
  };
@@ -35,6 +36,12 @@ const reservedWords = {
35
36
  "require_once", "return", "self", "static", "switch", "throw", "trait", "true", "try", "unset", "use", "var",
36
37
  "void", "while", "xor", "yield"
37
38
  ]),
39
+ python: new Set([
40
+ "False", "None", "True", "and", "as", "assert", "async", "await", "bool", "break", "case", "class",
41
+ "continue", "def", "del", "elif", "else", "except", "exec", "finally", "for", "from", "global", "if",
42
+ "import", "in", "int", "is", "lambda", "match", "nonlocal", "not", "or", "pass", "print",
43
+ "raise", "return", "str", "try", "type", "while", "with", "yield", "_", "__debug__"
44
+ ]),
38
45
  ruby: new Set([
39
46
  "BEGIN", "END", "__ENCODING__", "__END__", "__FILE__", "__LINE__", "alias", "and", "begin", "break", "case",
40
47
  "class", "def", "defined?", "do", "else", "elsif", "end", "ensure", "false", "for", "if", "in", "module",
@@ -67,7 +74,8 @@ export function validateTargetIdentifier(language, name, role, location) {
67
74
  if (typeof name != "string")
68
75
  unsupportedCapability(language, `${role} identifier`, location);
69
76
  const reservedName = language == "php" ? name.toLowerCase() : name;
70
- if (!identifierPatterns[language].test(name) || reservedWords[language].has(reservedName)) {
77
+ if (!identifierPatterns[language].test(name) || reservedWords[language].has(reservedName) ||
78
+ language == "python" && name.normalize("NFKC") != name) {
71
79
  unsupportedCapability(language, `${role} identifier '${name}'`, location);
72
80
  }
73
81
  }
@@ -90,4 +98,4 @@ export function validateTargetBindingIdentifier(language, name, role, location)
90
98
  unsupportedCapability(language, `${role} identifier '${name}'`, location);
91
99
  }
92
100
  }
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpZmllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2VuZHMvaWRlbnRpZmllcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRXRELDhFQUE4RTtBQUM5RSxNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLElBQUksRUFBRSw2QkFBNkI7SUFDbkMsVUFBVSxFQUFFLDZCQUE2QjtJQUN6QyxHQUFHLEVBQUUsMkJBQTJCO0lBQ2hDLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsVUFBVSxFQUFFLDZCQUE2QjtDQUMxQyxDQUFBO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUNaLEdBQUcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVTtRQUM1RyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUs7UUFDNUcsTUFBTSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUs7UUFDekcsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUTtRQUN6RyxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFR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QUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsK0JBQStCLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUTtJQUM1RSx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUV4RCxNQUFNLHdCQUF3QixHQUFHLFFBQVEsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQTtJQUNwRyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsSUFBSSxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksUUFBUTtRQUNyRSxDQUFDLENBQUMsSUFBSSxJQUFJLFdBQVcsSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0QsQ0FBQyxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLG1CQUFtQixDQUFDLElBQUksMEJBQTBCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMvRixNQUFNLGtCQUFrQixHQUFHLFFBQVEsSUFBSSxNQUFNLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFbEcsSUFBSSx3QkFBd0IsSUFBSSxrQkFBa0IsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3pFLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksZ0JBQWdCLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzNFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7dW5zdXBwb3J0ZWRDYXBhYmlsaXR5fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5cbi8qKiBAdHlwZSB7UmVjb3JkPGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2UsIFJlZ0V4cD59ICovXG5jb25zdCBpZGVudGlmaWVyUGF0dGVybnMgPSB7XG4gIGphdmE6IC9eW0EtWmEtel8kXVtBLVphLXowLTlfJF0qJC91LFxuICBqYXZhc2NyaXB0OiAvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKiQvdSxcbiAgcGhwOiAvXltBLVphLXpfXVtBLVphLXowLTlfXSokL3UsXG4gIHJ1Ynk6IC9eW2Etel9dW0EtWmEtejAtOV9dKiQvdSxcbiAgdHlwZXNjcmlwdDogL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokL3Vcbn1cblxuLyoqIEB0eXBlIHtSZWNvcmQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZSwgU2V0PHN0cmluZz4+fSAqL1xuY29uc3QgcmVzZXJ2ZWRXb3JkcyA9IHtcbiAgamF2YTogbmV3IFNldChbXG4gICAgXCJfXCIsIFwiYWJzdHJhY3RcIiwgXCJhc3NlcnRcIiwgXCJib29sZWFuXCIsIFwiYnJlYWtcIiwgXCJieXRlXCIsIFwiY2FzZVwiLCBcImNhdGNoXCIsIFwiY2hhclwiLCBcImNsYXNzXCIsIFwiY29uc3RcIiwgXCJjb250aW51ZVwiLFxuICAgIFwiZGVmYXVsdFwiLCBcImRvXCIsIFwiZG91YmxlXCIsIFwiZWxzZVwiLCBcImVudW1cIiwgXCJleHBvcnRzXCIsIFwiZXh0ZW5kc1wiLCBcImZhbHNlXCIsIFwiZmluYWxcIiwgXCJmaW5hbGx5XCIsIFwiZmxvYXRcIiwgXCJmb3JcIixcbiAgICBcImdvdG9cIiwgXCJpZlwiLCBcImltcGxlbWVudHNcIiwgXCJpbXBvcnRcIiwgXCJpbnN0YW5jZW9mXCIsIFwiaW50XCIsIFwiaW50ZXJmYWNlXCIsIFwibG9uZ1wiLCBcIm1vZHVsZVwiLCBcIm5hdGl2ZVwiLCBcIm5ld1wiLFxuICAgIFwibm9uLXNlYWxlZFwiLCBcIm51bGxcIiwgXCJvcGVuXCIsIFwib3BlbnNcIiwgXCJwYWNrYWdlXCIsIFwicGVybWl0c1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgXCJwcm92aWRlc1wiLCBcInB1YmxpY1wiLFxuICAgIFwicmVjb3JkXCIsIFwicmVxdWlyZXNcIiwgXCJyZXR1cm5cIiwgXCJzZWFsZWRcIiwgXCJzaG9ydFwiLCBcInN0YXRpY1wiLCBcInN0cmljdGZwXCIsIFwic3VwZXJcIiwgXCJzd2l0Y2hcIiwgXCJzeW5jaHJvbml6ZWRcIixcbiAgICBcInRoaXNcIiwgXCJ0aHJvd1wiLCBcInRocm93c1wiLCBcInRvXCIsIFwidHJhbnNpZW50XCIsIFwidHJhbnNpdGl2ZVwiLCBcInRydWVcIiwgXCJ0cnlcIiwgXCJ1c2VzXCIsIFwidmFyXCIsIFwidm9pZFwiLCBcInZvbGF0aWxlXCIsXG4gICAgXCJ3aGVuXCIsIFwid2hpbGVcIiwgXCJ3aXRoXCIsIFwieWllbGRcIlxuICBdKSxcbiAgamF2YXNjcmlwdDogbmV3IFNldChbXG4gICAgXCJhd2FpdFwiLCBcImJyZWFrXCIsIFwiY2FzZVwiLCBcImNhdGNoXCIsIFwiY2xhc3NcIiwgXCJjb25zdFwiLCBcImNvbnRpbnVlXCIsIFwiZGVidWdnZXJcIiwgXCJkZWZhdWx0XCIsIFwiZGVsZXRlXCIsIFwiZG9cIiwgXCJlbHNlXCIsXG4gICAgXCJlbnVtXCIsIFwiZXhwb3J0XCIsIFwiZXh0ZW5kc1wiLCBcImZhbHNlXCIsIFwiZmluYWxseVwiLCBcImZvclwiLCBcImZ1bmN0aW9uXCIsIFwiaWZcIiwgXCJpbXBsZW1lbnRzXCIsIFwiaW1wb3J0XCIsIFwiaW5cIixcbiAgICBcImluc3RhbmNlb2ZcIiwgXCJpbnRlcmZhY2VcIiwgXCJsZXRcIiwgXCJuZXdcIiwgXCJudWxsXCIsIFwicGFja2FnZVwiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgXCJwdWJsaWNcIiwgXCJyZXR1cm5cIiwgXCJzdGF0aWNcIixcbiAgICBcInN1cGVyXCIsIFwic3dpdGNoXCIsIFwidGhpc1wiLCBcInRocm93XCIsIFwidHJ1ZVwiLCBcInRyeVwiLCBcInR5cGVvZlwiLCBcInZhclwiLCBcInZvaWRcIiwgXCJ3aGlsZVwiLCBcIndpdGhcIiwgXCJ5aWVsZFwiXG4gIF0pLFxuICBwaHA6IG5ldyBTZXQoW1xuICAgIFwiX19oYWx0X2NvbXBpbGVyXCIsIFwiYWJzdHJhY3RcIiwgXCJhbmRcIiwgXCJhcnJheVwiLCBcImFzXCIsIFwiYnJlYWtcIiwgXCJjYWxsYWJsZVwiLCBcImNhc2VcIiwgXCJjYXRjaFwiLCBcImNsYXNzXCIsIFwiY2xvbmVcIixcbiAgICBcImNvbnN0XCIsIFwiY29udGludWVcIiwgXCJkZWNsYXJlXCIsIFwiZGVmYXVsdFwiLCBcImRpZVwiLCBcImRvXCIsIFwiZWNob1wiLCBcImVsc2VcIiwgXCJlbHNlaWZcIiwgXCJlbXB0eVwiLCBcImVuZGRlY2xhcmVcIixcbiAgICBcImVuZGZvclwiLCBcImVuZGZvcmVhY2hcIiwgXCJlbmRpZlwiLCBcImVuZHN3aXRjaFwiLCBcImVuZHdoaWxlXCIsIFwiZW51bVwiLCBcImV2YWxcIiwgXCJleGl0XCIsIFwiZXh0ZW5kc1wiLCBcImZhbHNlXCIsIFwiZmluYWxcIixcbiAgICBcImZpbmFsbHlcIiwgXCJmblwiLCBcImZvclwiLCBcImZvcmVhY2hcIiwgXCJmcm9tXCIsIFwiZnVuY3Rpb25cIiwgXCJnbG9iYWxcIiwgXCJnb3RvXCIsIFwiaWZcIiwgXCJpbXBsZW1lbnRzXCIsIFwiaW5jbHVkZVwiLFxuICAgIFwiaW5jbHVkZV9vbmNlXCIsIFwiaW5zdGFuY2VvZlwiLCBcImluc3RlYWRvZlwiLCBcImludGVyZmFjZVwiLCBcImlzc2V0XCIsIFwiaXRlcmFibGVcIiwgXCJsaXN0XCIsIFwibWF0Y2hcIiwgXCJtaXhlZFwiLCBcIm5hbWVzcGFjZVwiLFxuICAgIFwibmV2ZXJcIiwgXCJuZXdcIiwgXCJudWxsXCIsIFwib2JqZWN0XCIsIFwib3JcIiwgXCJwYXJlbnRcIiwgXCJwcmludFwiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgXCJwdWJsaWNcIiwgXCJyZWFkb25seVwiLCBcInJlcXVpcmVcIixcbiAgICBcInJlcXVpcmVfb25jZVwiLCBcInJldHVyblwiLCBcInNlbGZcIiwgXCJzdGF0aWNcIiwgXCJzd2l0Y2hcIiwgXCJ0aHJvd1wiLCBcInRyYWl0XCIsIFwidHJ1ZVwiLCBcInRyeVwiLCBcInVuc2V0XCIsIFwidXNlXCIsIFwidmFyXCIsXG4gICAgXCJ2b2lkXCIsIFwid2hpbGVcIiwgXCJ4b3JcIiwgXCJ5aWVsZFwiXG4gIF0pLFxuICBydWJ5OiBuZXcgU2V0KFtcbiAgICBcIkJFR0lOXCIsIFwiRU5EXCIsIFwiX19FTkNPRElOR19fXCIsIFwiX19FTkRfX1wiLCBcIl9fRklMRV9fXCIsIFwiX19MSU5FX19cIiwgXCJhbGlhc1wiLCBcImFuZFwiLCBcImJlZ2luXCIsIFwiYnJlYWtcIiwgXCJjYXNlXCIsXG4gICAgXCJjbGFzc1wiLCBcImRlZlwiLCBcImRlZmluZWQ/XCIsIFwiZG9cIiwgXCJlbHNlXCIsIFwiZWxzaWZcIiwgXCJlbmRcIiwgXCJlbnN1cmVcIiwgXCJmYWxzZVwiLCBcImZvclwiLCBcImlmXCIsIFwiaW5cIiwgXCJtb2R1bGVcIixcbiAgICBcIm5leHRcIiwgXCJuaWxcIiwgXCJub3RcIiwgXCJvclwiLCBcInJlZG9cIiwgXCJyZXNjdWVcIiwgXCJyZXRyeVwiLCBcInJldHVyblwiLCBcInNlbGZcIiwgXCJzdXBlclwiLCBcInRoZW5cIiwgXCJ0cnVlXCIsIFwidW5kZWZcIixcbiAgICBcInVubGVzc1wiLCBcInVudGlsXCIsIFwid2hlblwiLCBcIndoaWxlXCIsIFwieWllbGRcIlxuICBdKSxcbiAgdHlwZXNjcmlwdDogbmV3IFNldChbXG4gICAgXCJhYnN0cmFjdFwiLCBcImFueVwiLCBcImFzXCIsIFwiYXNzZXJ0c1wiLCBcImFzeW5jXCIsIFwiYXdhaXRcIiwgXCJib29sZWFuXCIsIFwiYnJlYWtcIiwgXCJjYXNlXCIsIFwiY2F0Y2hcIiwgXCJjbGFzc1wiLCBcImNvbnN0XCIsXG4gICAgXCJjb25zdHJ1Y3RvclwiLCBcImNvbnRpbnVlXCIsIFwiZGVidWdnZXJcIiwgXCJkZWNsYXJlXCIsIFwiZGVmYXVsdFwiLCBcImRlbGV0ZVwiLCBcImRvXCIsIFwiZWxzZVwiLCBcImVudW1cIiwgXCJleHBvcnRcIiwgXCJleHRlbmRzXCIsXG4gICAgXCJmYWxzZVwiLCBcImZpbmFsbHlcIiwgXCJmb3JcIiwgXCJmcm9tXCIsIFwiZnVuY3Rpb25cIiwgXCJnZXRcIiwgXCJpZlwiLCBcImltcGxlbWVudHNcIiwgXCJpbXBvcnRcIiwgXCJpblwiLCBcImluZmVyXCIsIFwiaW5zdGFuY2VvZlwiLFxuICAgIFwiaW50ZXJmYWNlXCIsIFwiaXNcIiwgXCJrZXlvZlwiLCBcImxldFwiLCBcIm1vZHVsZVwiLCBcIm5hbWVzcGFjZVwiLCBcIm5ldmVyXCIsIFwibmV3XCIsIFwibnVsbFwiLCBcIm51bWJlclwiLCBcIm9iamVjdFwiLCBcIm9mXCIsXG4gICAgXCJvdmVycmlkZVwiLCBcInBhY2thZ2VcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIsIFwicHVibGljXCIsIFwicmVhZG9ubHlcIiwgXCJyZXF1aXJlXCIsIFwicmV0dXJuXCIsIFwic2F0aXNmaWVzXCIsIFwic2V0XCIsXG4gICAgXCJzdGF0aWNcIiwgXCJzdHJpbmdcIiwgXCJzdXBlclwiLCBcInN3aXRjaFwiLCBcInN5bWJvbFwiLCBcInRoaXNcIiwgXCJ0aHJvd1wiLCBcInRydWVcIiwgXCJ0cnlcIiwgXCJ0eXBlXCIsIFwidHlwZW9mXCIsIFwidW5kZWZpbmVkXCIsXG4gICAgXCJ1bmlxdWVcIiwgXCJ1bmtub3duXCIsIFwidXNpbmdcIiwgXCJ2YXJcIiwgXCJ2b2lkXCIsIFwid2hpbGVcIiwgXCJ3aXRoXCIsIFwieWllbGRcIlxuICBdKVxufVxuXG5jb25zdCBwaHBJbnZhbGlkUGFyYW1ldGVyQmluZGluZ3MgPSBuZXcgU2V0KFtcbiAgXCJHTE9CQUxTXCIsIFwiX0NPT0tJRVwiLCBcIl9FTlZcIiwgXCJfRklMRVNcIiwgXCJfR0VUXCIsIFwiX1BPU1RcIiwgXCJfUkVRVUVTVFwiLCBcIl9TRVJWRVJcIiwgXCJfU0VTU0lPTlwiLCBcInRoaXNcIlxuXSlcbmNvbnN0IHBocEludmFsaWRBc3NpZ25lZEJpbmRpbmdzID0gbmV3IFNldChbXCJHTE9CQUxTXCIsIFwidGhpc1wiXSlcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW4gaWRlbnRpZmllciBhZ2FpbnN0IHRoZSB0YXJnZXQgYmFja2VuZCdzIGRlbGliZXJhdGVseSBuYXJyb3cgbGV4aWNhbCBjb250cmFjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3Vua25vd259IG5hbWUgLSBDYW5kaWRhdGUgc2VtYW50aWMgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSByb2xlIC0gSWRlbnRpZmllciByb2xlIGZvciBkaWFnbm9zdGljcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWR9IGxvY2F0aW9uIC0gT3JpZ2luYXRpbmcgbG9jYXRpb24uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVGFyZ2V0SWRlbnRpZmllcihsYW5ndWFnZSwgbmFtZSwgcm9sZSwgbG9jYXRpb24pIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9IFwic3RyaW5nXCIpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYCR7cm9sZX0gaWRlbnRpZmllcmAsIGxvY2F0aW9uKVxuXG4gIGNvbnN0IHJlc2VydmVkTmFtZSA9IGxhbmd1YWdlID09IFwicGhwXCIgPyBuYW1lLnRvTG93ZXJDYXNlKCkgOiBuYW1lXG5cbiAgaWYgKCFpZGVudGlmaWVyUGF0dGVybnNbbGFuZ3VhZ2VdLnRlc3QobmFtZSkgfHwgcmVzZXJ2ZWRXb3Jkc1tsYW5ndWFnZV0uaGFzKHJlc2VydmVkTmFtZSkpIHtcbiAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGAke3JvbGV9IGlkZW50aWZpZXIgJyR7bmFtZX0nYCwgbG9jYXRpb24pXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBiaW5kaW5nIGlkZW50aWZpZXIgYWdhaW5zdCB0YXJnZXQgcmVzdHJpY3Rpb25zIGJleW9uZCBnZW5lcmFsIGlkZW50aWZpZXIgc3ludGF4LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbmFtZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyBpZGVudGlmaWVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHJvbGUgLSBCaW5kaW5nIHJvbGUgZm9yIGRpYWdub3N0aWNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZH0gbG9jYXRpb24gLSBPcmlnaW5hdGluZyBsb2NhdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUYXJnZXRCaW5kaW5nSWRlbnRpZmllcihsYW5ndWFnZSwgbmFtZSwgcm9sZSwgbG9jYXRpb24pIHtcbiAgdmFsaWRhdGVUYXJnZXRJZGVudGlmaWVyKGxhbmd1YWdlLCBuYW1lLCByb2xlLCBsb2NhdGlvbilcblxuICBjb25zdCBpbnZhbGlkVHlwZVNjcmlwdEJpbmRpbmcgPSBsYW5ndWFnZSA9PSBcInR5cGVzY3JpcHRcIiAmJiAobmFtZSA9PSBcImFyZ3VtZW50c1wiIHx8IG5hbWUgPT0gXCJldmFsXCIpXG4gIGNvbnN0IGludmFsaWRQaHBWYXJpYWJsZSA9IGxhbmd1YWdlID09IFwicGhwXCIgJiYgdHlwZW9mIG5hbWUgPT0gXCJzdHJpbmdcIiAmJlxuICAgICgocm9sZSA9PSBcInBhcmFtZXRlclwiICYmIHBocEludmFsaWRQYXJhbWV0ZXJCaW5kaW5ncy5oYXMobmFtZSkpIHx8XG4gICAgICAoKHJvbGUgPT0gXCJsb2NhbFwiIHx8IHJvbGUgPT0gXCJhc3NpZ25tZW50IHRhcmdldFwiKSAmJiBwaHBJbnZhbGlkQXNzaWduZWRCaW5kaW5ncy5oYXMobmFtZSkpKVxuICBjb25zdCBpbnZhbGlkUnVieUJpbmRpbmcgPSBsYW5ndWFnZSA9PSBcInJ1YnlcIiAmJiB0eXBlb2YgbmFtZSA9PSBcInN0cmluZ1wiICYmIC9eX1sxLTldJC91LnRlc3QobmFtZSlcblxuICBpZiAoaW52YWxpZFR5cGVTY3JpcHRCaW5kaW5nIHx8IGludmFsaWRQaHBWYXJpYWJsZSB8fCBpbnZhbGlkUnVieUJpbmRpbmcpIHtcbiAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGAke3JvbGV9IGlkZW50aWZpZXIgJyR7bmFtZX0nYCwgbG9jYXRpb24pXG4gIH1cbn1cbiJdfQ==
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpZmllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2VuZHMvaWRlbnRpZmllcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRXRELDhFQUE4RTtBQUM5RSxNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLElBQUksRUFBRSw2QkFBNkI7SUFDbkMsVUFBVSxFQUFFLDZCQUE2QjtJQUN6QyxHQUFHLEVBQUUsMkJBQTJCO0lBQ2hDLE1BQU0sRUFBRSwrQ0FBK0M7SUFDdkQsSUFBSSxFQUFFLHdCQUF3QjtJQUM5QixVQUFVLEVBQUUsNkJBQTZCO0NBQzFDLENBQUE7QUFFRCxtRkFBbUY7QUFDbkYsTUFBTSxhQUFhLEdBQUc7SUFDcEIsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO1FBQ1osR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVO1FBQzVHLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSztRQUM1RyxNQUFNLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSztRQUN6RyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxRQUFRO1FBQ3pHLFFBQVEsRUFBRSxV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Q0FBQyxDQUFDLElBQUksSUFBSSxXQUFXLElBQUksMkJBQTJCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdELENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0YsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLElBQUksTUFBTSxJQUFJLE9BQU8sSUFBSSxJQUFJLFFBQVEsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRWxHLElBQUksd0JBQXdCLElBQUksa0JBQWtCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUN6RSxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLGdCQUFnQixJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMzRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3Vuc3VwcG9ydGVkQ2FwYWJpbGl0eX0gZnJvbSBcIi4uL2RpYWdub3N0aWMuanNcIlxuXG4vKiogQHR5cGUge1JlY29yZDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlLCBSZWdFeHA+fSAqL1xuY29uc3QgaWRlbnRpZmllclBhdHRlcm5zID0ge1xuICBqYXZhOiAvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKiQvdSxcbiAgamF2YXNjcmlwdDogL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokL3UsXG4gIHBocDogL15bQS1aYS16X11bQS1aYS16MC05X10qJC91LFxuICBweXRob246IC9eKD86X3xcXHB7WElEX1N0YXJ0fSkoPzpffFxccHtYSURfQ29udGludWV9KSokL3UsXG4gIHJ1Ynk6IC9eW2Etel9dW0EtWmEtejAtOV9dKiQvdSxcbiAgdHlwZXNjcmlwdDogL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokL3Vcbn1cblxuLyoqIEB0eXBlIHtSZWNvcmQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZSwgU2V0PHN0cmluZz4+fSAqL1xuY29uc3QgcmVzZXJ2ZWRXb3JkcyA9IHtcbiAgamF2YTogbmV3IFNldChbXG4gICAgXCJfXCIsIFwiYWJzdHJhY3RcIiwgXCJhc3NlcnRcIiwgXCJib29sZWFuXCIsIFwiYnJlYWtcIiwgXCJieXRlXCIsIFwiY2FzZVwiLCBcImNhdGNoXCIsIFwiY2hhclwiLCBcImNsYXNzXCIsIFwiY29uc3RcIiwgXCJjb250aW51ZVwiLFxuICAgIFwiZGVmYXVsdFwiLCBcImRvXCIsIFwiZG91YmxlXCIsIFwiZWxzZVwiLCBcImVudW1cIiwgXCJleHBvcnRzXCIsIFwiZXh0ZW5kc1wiLCBcImZhbHNlXCIsIFwiZmluYWxcIiwgXCJmaW5hbGx5XCIsIFwiZmxvYXRcIiwgXCJmb3JcIixcbiAgICBcImdvdG9cIiwgXCJpZlwiLCBcImltcGxlbWVudHNcIiwgXCJpbXBvcnRcIiwgXCJpbnN0YW5jZW9mXCIsIFwiaW50XCIsIFwiaW50ZXJmYWNlXCIsIFwibG9uZ1wiLCBcIm1vZHVsZVwiLCBcIm5hdGl2ZVwiLCBcIm5ld1wiLFxuICAgIFwibm9uLXNlYWxlZFwiLCBcIm51bGxcIiwgXCJvcGVuXCIsIFwib3BlbnNcIiwgXCJwYWNrYWdlXCIsIFwicGVybWl0c1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgXCJwcm92aWRlc1wiLCBcInB1YmxpY1wiLFxuICAgIFwicmVjb3JkXCIsIFwicmVxdWlyZXNcIiwgXCJyZXR1cm5cIiwgXCJzZWFsZWRcIiwgXCJzaG9ydFwiLCBcInN0YXRpY1wiLCBcInN0cmljdGZwXCIsIFwic3VwZXJcIiwgXCJzd2l0Y2hcIiwgXCJzeW5jaHJvbml6ZWRcIixcbiAgICBcInRoaXNcIiwgXCJ0aHJvd1wiLCBcInRocm93c1wiLCBcInRvXCIsIFwidHJhbnNpZW50XCIsIFwidHJhbnNpdGl2ZVwiLCBcInRydWVcIiwgXCJ0cnlcIiwgXCJ1c2VzXCIsIFwidmFyXCIsIFwidm9pZFwiLCBcInZvbGF0aWxlXCIsXG4gICAgXCJ3aGVuXCIsIFwid2hpbGVcIiwgXCJ3aXRoXCIsIFwieWllbGRcIlxuICBdKSxcbiAgamF2YXNjcmlwdDogbmV3IFNldChbXG4gICAgXCJhd2FpdFwiLCBcImJyZWFrXCIsIFwiY2FzZVwiLCBcImNhdGNoXCIsIFwiY2xhc3NcIiwgXCJjb25zdFwiLCBcImNvbnRpbnVlXCIsIFwiZGVidWdnZXJcIiwgXCJkZWZhdWx0XCIsIFwiZGVsZXRlXCIsIFwiZG9cIiwgXCJlbHNlXCIsXG4gICAgXCJlbnVtXCIsIFwiZXhwb3J0XCIsIFwiZXh0ZW5kc1wiLCBcImZhbHNlXCIsIFwiZmluYWxseVwiLCBcImZvclwiLCBcImZ1bmN0aW9uXCIsIFwiaWZcIiwgXCJpbXBsZW1lbnRzXCIsIFwiaW1wb3J0XCIsIFwiaW5cIixcbiAgICBcImluc3RhbmNlb2ZcIiwgXCJpbnRlcmZhY2VcIiwgXCJsZXRcIiwgXCJuZXdcIiwgXCJudWxsXCIsIFwicGFja2FnZVwiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgXCJwdWJsaWNcIiwgXCJyZXR1cm5cIiwgXCJzdGF0aWNcIixcbiAgICBcInN1cGVyXCIsIFwic3dpdGNoXCIsIFwidGhpc1wiLCBcInRocm93XCIsIFwidHJ1ZVwiLCBcInRyeVwiLCBcInR5cGVvZlwiLCBcInZhclwiLCBcInZvaWRcIiwgXCJ3aGlsZVwiLCBcIndpdGhcIiwgXCJ5aWVsZFwiXG4gIF0pLFxuICBwaHA6IG5ldyBTZXQoW1xuICAgIFwiX19oYWx0X2NvbXBpbGVyXCIsIFwiYWJzdHJhY3RcIiwgXCJhbmRcIiwgXCJhcnJheVwiLCBcImFzXCIsIFwiYnJlYWtcIiwgXCJjYWxsYWJsZVwiLCBcImNhc2VcIiwgXCJjYXRjaFwiLCBcImNsYXNzXCIsIFwiY2xvbmVcIixcbiAgICBcImNvbnN0XCIsIFwiY29udGludWVcIiwgXCJkZWNsYXJlXCIsIFwiZGVmYXVsdFwiLCBcImRpZVwiLCBcImRvXCIsIFwiZWNob1wiLCBcImVsc2VcIiwgXCJlbHNlaWZcIiwgXCJlbXB0eVwiLCBcImVuZGRlY2xhcmVcIixcbiAgICBcImVuZGZvclwiLCBcImVuZGZvcmVhY2hcIiwgXCJlbmRpZlwiLCBcImVuZHN3aXRjaFwiLCBcImVuZHdoaWxlXCIsIFwiZW51bVwiLCBcImV2YWxcIiwgXCJleGl0XCIsIFwiZXh0ZW5kc1wiLCBcImZhbHNlXCIsIFwiZmluYWxcIixcbiAgICBcImZpbmFsbHlcIiwgXCJmblwiLCBcImZvclwiLCBcImZvcmVhY2hcIiwgXCJmcm9tXCIsIFwiZnVuY3Rpb25cIiwgXCJnbG9iYWxcIiwgXCJnb3RvXCIsIFwiaWZcIiwgXCJpbXBsZW1lbnRzXCIsIFwiaW5jbHVkZVwiLFxuICAgIFwiaW5jbHVkZV9vbmNlXCIsIFwiaW5zdGFuY2VvZlwiLCBcImluc3RlYWRvZlwiLCBcImludGVyZmFjZVwiLCBcImlzc2V0XCIsIFwiaXRlcmFibGVcIiwgXCJsaXN0XCIsIFwibWF0Y2hcIiwgXCJtaXhlZFwiLCBcIm5hbWVzcGFjZVwiLFxuICAgIFwibmV2ZXJcIiwgXCJuZXdcIiwgXCJudWxsXCIsIFwib2JqZWN0XCIsIFwib3JcIiwgXCJwYXJlbnRcIiwgXCJwcmludFwiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgXCJwdWJsaWNcIiwgXCJyZWFkb25seVwiLCBcInJlcXVpcmVcIixcbiAgICBcInJlcXVpcmVfb25jZVwiLCBcInJldHVyblwiLCBcInNlbGZcIiwgXCJzdGF0aWNcIiwgXCJzd2l0Y2hcIiwgXCJ0aHJvd1wiLCBcInRyYWl0XCIsIFwidHJ1ZVwiLCBcInRyeVwiLCBcInVuc2V0XCIsIFwidXNlXCIsIFwidmFyXCIsXG4gICAgXCJ2b2lkXCIsIFwid2hpbGVcIiwgXCJ4b3JcIiwgXCJ5aWVsZFwiXG4gIF0pLFxuICBweXRob246IG5ldyBTZXQoW1xuICAgIFwiRmFsc2VcIiwgXCJOb25lXCIsIFwiVHJ1ZVwiLCBcImFuZFwiLCBcImFzXCIsIFwiYXNzZXJ0XCIsIFwiYXN5bmNcIiwgXCJhd2FpdFwiLCBcImJvb2xcIiwgXCJicmVha1wiLCBcImNhc2VcIiwgXCJjbGFzc1wiLFxuICAgIFwiY29udGludWVcIiwgXCJkZWZcIiwgXCJkZWxcIiwgXCJlbGlmXCIsIFwiZWxzZVwiLCBcImV4Y2VwdFwiLCBcImV4ZWNcIiwgXCJmaW5hbGx5XCIsIFwiZm9yXCIsIFwiZnJvbVwiLCBcImdsb2JhbFwiLCBcImlmXCIsXG4gICAgXCJpbXBvcnRcIiwgXCJpblwiLCBcImludFwiLCBcImlzXCIsIFwibGFtYmRhXCIsIFwibWF0Y2hcIiwgXCJub25sb2NhbFwiLCBcIm5vdFwiLCBcIm9yXCIsIFwicGFzc1wiLCBcInByaW50XCIsXG4gICAgXCJyYWlzZVwiLCBcInJldHVyblwiLCBcInN0clwiLCBcInRyeVwiLCBcInR5cGVcIiwgXCJ3aGlsZVwiLCBcIndpdGhcIiwgXCJ5aWVsZFwiLCBcIl9cIiwgXCJfX2RlYnVnX19cIlxuICBdKSxcbiAgcnVieTogbmV3IFNldChbXG4gICAgXCJCRUdJTlwiLCBcIkVORFwiLCBcIl9fRU5DT0RJTkdfX1wiLCBcIl9fRU5EX19cIiwgXCJfX0ZJTEVfX1wiLCBcIl9fTElORV9fXCIsIFwiYWxpYXNcIiwgXCJhbmRcIiwgXCJiZWdpblwiLCBcImJyZWFrXCIsIFwiY2FzZVwiLFxuICAgIFwiY2xhc3NcIiwgXCJkZWZcIiwgXCJkZWZpbmVkP1wiLCBcImRvXCIsIFwiZWxzZVwiLCBcImVsc2lmXCIsIFwiZW5kXCIsIFwiZW5zdXJlXCIsIFwiZmFsc2VcIiwgXCJmb3JcIiwgXCJpZlwiLCBcImluXCIsIFwibW9kdWxlXCIsXG4gICAgXCJuZXh0XCIsIFwibmlsXCIsIFwibm90XCIsIFwib3JcIiwgXCJyZWRvXCIsIFwicmVzY3VlXCIsIFwicmV0cnlcIiwgXCJyZXR1cm5cIiwgXCJzZWxmXCIsIFwic3VwZXJcIiwgXCJ0aGVuXCIsIFwidHJ1ZVwiLCBcInVuZGVmXCIsXG4gICAgXCJ1bmxlc3NcIiwgXCJ1bnRpbFwiLCBcIndoZW5cIiwgXCJ3aGlsZVwiLCBcInlpZWxkXCJcbiAgXSksXG4gIHR5cGVzY3JpcHQ6IG5ldyBTZXQoW1xuICAgIFwiYWJzdHJhY3RcIiwgXCJhbnlcIiwgXCJhc1wiLCBcImFzc2VydHNcIiwgXCJhc3luY1wiLCBcImF3YWl0XCIsIFwiYm9vbGVhblwiLCBcImJyZWFrXCIsIFwiY2FzZVwiLCBcImNhdGNoXCIsIFwiY2xhc3NcIiwgXCJjb25zdFwiLFxuICAgIFwiY29uc3RydWN0b3JcIiwgXCJjb250aW51ZVwiLCBcImRlYnVnZ2VyXCIsIFwiZGVjbGFyZVwiLCBcImRlZmF1bHRcIiwgXCJkZWxldGVcIiwgXCJkb1wiLCBcImVsc2VcIiwgXCJlbnVtXCIsIFwiZXhwb3J0XCIsIFwiZXh0ZW5kc1wiLFxuICAgIFwiZmFsc2VcIiwgXCJmaW5hbGx5XCIsIFwiZm9yXCIsIFwiZnJvbVwiLCBcImZ1bmN0aW9uXCIsIFwiZ2V0XCIsIFwiaWZcIiwgXCJpbXBsZW1lbnRzXCIsIFwiaW1wb3J0XCIsIFwiaW5cIiwgXCJpbmZlclwiLCBcImluc3RhbmNlb2ZcIixcbiAgICBcImludGVyZmFjZVwiLCBcImlzXCIsIFwia2V5b2ZcIiwgXCJsZXRcIiwgXCJtb2R1bGVcIiwgXCJuYW1lc3BhY2VcIiwgXCJuZXZlclwiLCBcIm5ld1wiLCBcIm51bGxcIiwgXCJudW1iZXJcIiwgXCJvYmplY3RcIiwgXCJvZlwiLFxuICAgIFwib3ZlcnJpZGVcIiwgXCJwYWNrYWdlXCIsIFwicHJpdmF0ZVwiLCBcInByb3RlY3RlZFwiLCBcInB1YmxpY1wiLCBcInJlYWRvbmx5XCIsIFwicmVxdWlyZVwiLCBcInJldHVyblwiLCBcInNhdGlzZmllc1wiLCBcInNldFwiLFxuICAgIFwic3RhdGljXCIsIFwic3RyaW5nXCIsIFwic3VwZXJcIiwgXCJzd2l0Y2hcIiwgXCJzeW1ib2xcIiwgXCJ0aGlzXCIsIFwidGhyb3dcIiwgXCJ0cnVlXCIsIFwidHJ5XCIsIFwidHlwZVwiLCBcInR5cGVvZlwiLCBcInVuZGVmaW5lZFwiLFxuICAgIFwidW5pcXVlXCIsIFwidW5rbm93blwiLCBcInVzaW5nXCIsIFwidmFyXCIsIFwidm9pZFwiLCBcIndoaWxlXCIsIFwid2l0aFwiLCBcInlpZWxkXCJcbiAgXSlcbn1cblxuY29uc3QgcGhwSW52YWxpZFBhcmFtZXRlckJpbmRpbmdzID0gbmV3IFNldChbXG4gIFwiR0xPQkFMU1wiLCBcIl9DT09LSUVcIiwgXCJfRU5WXCIsIFwiX0ZJTEVTXCIsIFwiX0dFVFwiLCBcIl9QT1NUXCIsIFwiX1JFUVVFU1RcIiwgXCJfU0VSVkVSXCIsIFwiX1NFU1NJT05cIiwgXCJ0aGlzXCJcbl0pXG5jb25zdCBwaHBJbnZhbGlkQXNzaWduZWRCaW5kaW5ncyA9IG5ldyBTZXQoW1wiR0xPQkFMU1wiLCBcInRoaXNcIl0pXG5cbi8qKlxuICogVmFsaWRhdGVzIGFuIGlkZW50aWZpZXIgYWdhaW5zdCB0aGUgdGFyZ2V0IGJhY2tlbmQncyBkZWxpYmVyYXRlbHkgbmFycm93IGxleGljYWwgY29udHJhY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHt1bmtub3dufSBuYW1lIC0gQ2FuZGlkYXRlIHNlbWFudGljIGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIElkZW50aWZpZXIgcm9sZSBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkfSBsb2NhdGlvbiAtIE9yaWdpbmF0aW5nIGxvY2F0aW9uLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRhcmdldElkZW50aWZpZXIobGFuZ3VhZ2UsIG5hbWUsIHJvbGUsIGxvY2F0aW9uKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPSBcInN0cmluZ1wiKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGAke3JvbGV9IGlkZW50aWZpZXJgLCBsb2NhdGlvbilcblxuICBjb25zdCByZXNlcnZlZE5hbWUgPSBsYW5ndWFnZSA9PSBcInBocFwiID8gbmFtZS50b0xvd2VyQ2FzZSgpIDogbmFtZVxuXG4gIGlmICghaWRlbnRpZmllclBhdHRlcm5zW2xhbmd1YWdlXS50ZXN0KG5hbWUpIHx8IHJlc2VydmVkV29yZHNbbGFuZ3VhZ2VdLmhhcyhyZXNlcnZlZE5hbWUpIHx8XG4gICAgbGFuZ3VhZ2UgPT0gXCJweXRob25cIiAmJiBuYW1lLm5vcm1hbGl6ZShcIk5GS0NcIikgIT0gbmFtZSkge1xuICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYCR7cm9sZX0gaWRlbnRpZmllciAnJHtuYW1lfSdgLCBsb2NhdGlvbilcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIGJpbmRpbmcgaWRlbnRpZmllciBhZ2FpbnN0IHRhcmdldCByZXN0cmljdGlvbnMgYmV5b25kIGdlbmVyYWwgaWRlbnRpZmllciBzeW50YXguXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHt1bmtub3dufSBuYW1lIC0gQ2FuZGlkYXRlIHNlbWFudGljIGlkZW50aWZpZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIEJpbmRpbmcgcm9sZSBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkfSBsb2NhdGlvbiAtIE9yaWdpbmF0aW5nIGxvY2F0aW9uLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRhcmdldEJpbmRpbmdJZGVudGlmaWVyKGxhbmd1YWdlLCBuYW1lLCByb2xlLCBsb2NhdGlvbikge1xuICB2YWxpZGF0ZVRhcmdldElkZW50aWZpZXIobGFuZ3VhZ2UsIG5hbWUsIHJvbGUsIGxvY2F0aW9uKVxuXG4gIGNvbnN0IGludmFsaWRUeXBlU2NyaXB0QmluZGluZyA9IGxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiICYmIChuYW1lID09IFwiYXJndW1lbnRzXCIgfHwgbmFtZSA9PSBcImV2YWxcIilcbiAgY29uc3QgaW52YWxpZFBocFZhcmlhYmxlID0gbGFuZ3VhZ2UgPT0gXCJwaHBcIiAmJiB0eXBlb2YgbmFtZSA9PSBcInN0cmluZ1wiICYmXG4gICAgKChyb2xlID09IFwicGFyYW1ldGVyXCIgJiYgcGhwSW52YWxpZFBhcmFtZXRlckJpbmRpbmdzLmhhcyhuYW1lKSkgfHxcbiAgICAgICgocm9sZSA9PSBcImxvY2FsXCIgfHwgcm9sZSA9PSBcImFzc2lnbm1lbnQgdGFyZ2V0XCIpICYmIHBocEludmFsaWRBc3NpZ25lZEJpbmRpbmdzLmhhcyhuYW1lKSkpXG4gIGNvbnN0IGludmFsaWRSdWJ5QmluZGluZyA9IGxhbmd1YWdlID09IFwicnVieVwiICYmIHR5cGVvZiBuYW1lID09IFwic3RyaW5nXCIgJiYgL15fWzEtOV0kL3UudGVzdChuYW1lKVxuXG4gIGlmIChpbnZhbGlkVHlwZVNjcmlwdEJpbmRpbmcgfHwgaW52YWxpZFBocFZhcmlhYmxlIHx8IGludmFsaWRSdWJ5QmluZGluZykge1xuICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYCR7cm9sZX0gaWRlbnRpZmllciAnJHtuYW1lfSdgLCBsb2NhdGlvbilcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backends/index.js"],"names":[],"mappings":"AAuBA;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAAC,QAAQ,EAAE,MAAM,EAAC,EAJ9C;IAA+D,QAAQ,EAA/D,OAAO,sBAAsB,EAAE,gBAAgB,CACvD;IAA6D,MAAM,EAA3D,OAAO,sBAAsB,EAAE,cAAc,CACrD;CAE8C,GAFpC,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,EAAC,QAAQ,EAAE,QAAqC,EAAE,YAAqB,EAAE,MAAM,EAAE,iBAAqC,EAAE,OAAO,EAAC,EARpK;IAA+D,QAAQ,EAA/D,OAAO,sBAAsB,EAAE,gBAAgB,CACvD;IAA6D,MAAM,EAA3D,OAAO,sBAAsB,EAAE,cAAc,CACrD;IAAuB,QAAQ,AAA/B,CACA,EADQ,MAAM,CACd;IAA+C,YAAY,AAA3D,CACA,EADQ,MAAM,GAAG,UAAU,GAAG,QAAQ,CACtC;IAAuB,iBAAiB,AAAxC,CACA,EADQ,MAAM,CACd;IAAkH,OAAO,AAAzH,CACA,EADQ;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;KAAC,EAAE,CACzG;CAEoK,GAF1J,OAAO,sBAAsB,EAAE,iBAAiB,CAyD5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backends/index.js"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAAC,QAAQ,EAAE,MAAM,EAAC,EAJ9C;IAA+D,QAAQ,EAA/D,OAAO,sBAAsB,EAAE,gBAAgB,CACvD;IAA6D,MAAM,EAA3D,OAAO,sBAAsB,EAAE,cAAc,CACrD;CAE8C,GAFpC,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,EAAC,QAAQ,EAAE,QAAQ,EAAE,YAAqB,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAC,EARnH;IAA+D,QAAQ,EAA/D,OAAO,sBAAsB,EAAE,gBAAgB,CACvD;IAA6D,MAAM,EAA3D,OAAO,sBAAsB,EAAE,cAAc,CACrD;IAAuB,QAAQ,AAA/B,CACA,EADQ,MAAM,CACd;IAA+C,YAAY,AAA3D,CACA,EADQ,MAAM,GAAG,UAAU,GAAG,QAAQ,CACtC;IAAuB,iBAAiB,AAAxC,CACA,EADQ,MAAM,CACd;IAAkH,OAAO,AAAzH,CACA,EADQ;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;KAAC,EAAE,CACzG;CAEmH,GAFzG,OAAO,sBAAsB,EAAE,iBAAiB,CAsD5D"}