@cartanova/qgrid-cli 2.7.0 → 2.7.1
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.
- package/bundle/dist/_virtual/_rolldown/runtime.js +20 -1
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +17 -6
- package/bundle/dist/application/qgrid/qgrid.frame.js +1 -1
- package/bundle/dist/application/qgrid/schema-prompt.js +240 -0
- package/bundle/dist/application/qgrid/tool-emulation.js +7 -5
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/2020.js +112 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/code.js +140 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/index.js +676 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/scope.js +143 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/errors.js +104 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/index.js +225 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/names.js +30 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/ref_error.js +20 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/resolve.js +135 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/rules.js +63 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/util.js +148 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/applicability.js +25 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/boolSchema.js +50 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/dataType.js +174 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/defaults.js +33 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/index.js +435 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/keyword.js +115 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/subschema.js +74 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/core.js +585 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/data.js +20 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/index.js +44 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/applicator.js +52 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/content.js +22 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/core.js +53 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/format-annotation.js +18 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/meta-data.js +38 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/unevaluated.js +21 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/validation.js +87 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/schema.js +61 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/equal.js +14 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/ucs2length.js +27 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/uri.js +14 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/validation_error.js +18 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +59 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +98 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/allOf.js +31 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +18 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/contains.js +91 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +89 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js +18 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/if.js +64 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/index.js +62 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/items.js +61 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/items2020.js +36 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/not.js +33 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +53 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +63 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +19 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/properties.js +54 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +43 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +19 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/code.js +132 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/id.js +16 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/index.js +24 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/ref.js +114 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/discriminator/index.js +103 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/discriminator/types.js +16 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/draft2020.js +37 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js +48 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js +47 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/index.js +24 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js +22 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js +17 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/format/format.js +94 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/format/index.js +12 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/metadata.js +25 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/next.js +21 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/index.js +15 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js +48 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js +61 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/const.js +29 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js +19 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/enum.js +51 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/index.js +50 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitContains.js +20 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitItems.js +30 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitLength.js +35 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +49 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +30 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +29 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/pattern.js +40 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/required.js +74 -0
- package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +72 -0
- package/bundle/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js +35 -0
- package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/index.js +238 -0
- package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/lib/schemes.js +189 -0
- package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/lib/utils.js +284 -0
- package/bundle/dist/node_modules/.pnpm/json-schema-traverse@1.0.0/node_modules/json-schema-traverse/index.js +80 -0
- package/bundle/dist/testing/schema-bench.js +0 -0
- package/bundle/dist/utils/providers/anthropic/fence-strip.js +83 -0
- package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +3 -5
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +250 -34
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +36 -5
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +120 -153
- package/bundle/src/application/qgrid/qgrid.frame.ts +2 -0
- package/bundle/src/application/qgrid/schema-prompt.test.ts +166 -0
- package/bundle/src/application/qgrid/schema-prompt.ts +293 -0
- package/bundle/src/application/qgrid/tool-emulation.test.ts +36 -0
- package/bundle/src/application/qgrid/tool-emulation.ts +19 -7
- package/bundle/src/testing/schema-bench.test.ts +358 -0
- package/bundle/src/testing/schema-bench.ts +352 -0
- package/bundle/src/utils/providers/anthropic/fence-strip.test.ts +122 -0
- package/bundle/src/utils/providers/anthropic/fence-strip.ts +105 -0
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +2 -8
- package/bundle/web-dist/client/assets/{index-C24D5PiN.js → index-C0594sjh.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-CIlZG6A3.js → logs-BotUcOEB.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-DZFBMxKl.js → monit-kk3vnGvu.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-C3wlSNBL.js → routes-J4bnHVfl.js} +1 -1
- package/bundle/web-dist/client/assets/{settings-ClRDWO-8.js → settings-CAAQSIyg.js} +1 -1
- package/bundle/web-dist/client/assets/{show-BP7U8yyJ.js → show-BryNvjUT.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-DfQeULnJ.js → tokens-DDrATjGA.js} +1 -1
- package/bundle/web-dist/client/assets/{use-oauth-login-flow-CY-ASCfL.js → use-oauth-login-flow-CptleCFM.js} +1 -1
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +1 -1
- package/package.json +1 -1
- package/skills/qgrid/references/ai-sdk-provider-contract.md +20 -15
- package/skills/qgrid/references/anthropic-claude-code-runtime.md +31 -14
- package/skills/qgrid/references/decision-rationale.md +13 -3
- package/skills/qgrid/references/prompt-cache-and-usage.md +4 -1
- package/skills/qgrid/references/provider-runtime-differences.md +3 -3
- package/skills/qgrid/references/tool-calling-and-multiturn.md +16 -6
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
//#region src/application/qgrid/schema-prompt.ts
|
|
2
|
+
/**
|
|
3
|
+
* system prompt 말미에 계약을 덧붙인다. anthropic 은 cold-only(매 턴 CC 재스폰 + system
|
|
4
|
+
* 재전송)라 멀티턴에도 계약이 매 턴 일관되게 주입된다. system 이 argv 64KB 를 넘으면
|
|
5
|
+
* claude-session 의 --system-prompt-file 분기가 흡수한다.
|
|
6
|
+
*/
|
|
7
|
+
function composeSystemWithSchemaContract(system, input) {
|
|
8
|
+
const contract = renderSchemaContractPrompt(input);
|
|
9
|
+
if (contract === void 0) return system;
|
|
10
|
+
return system ? `${system}\n\n${contract}` : contract;
|
|
11
|
+
}
|
|
12
|
+
/** 요청에 스키마/tools 가 없으면 undefined — 계약 주입 없이 평범한 텍스트 요청이다. */
|
|
13
|
+
function renderSchemaContractPrompt(input) {
|
|
14
|
+
if (input.tools?.length) return renderToolEnvelopePrompt(input.tools, input.jsonSchema);
|
|
15
|
+
if (input.jsonSchema !== void 0) return renderOutputSchemaPrompt(input.jsonSchema);
|
|
16
|
+
}
|
|
17
|
+
function renderOutputSchemaPrompt(jsonSchema) {
|
|
18
|
+
return [
|
|
19
|
+
"## Output Format",
|
|
20
|
+
"",
|
|
21
|
+
"Your entire reply must be a single JSON object that conforms to the JSON Schema below.",
|
|
22
|
+
"Output raw JSON only — no code fences, no prose before or after the JSON.",
|
|
23
|
+
"Start your reply with { and end it with }.",
|
|
24
|
+
"",
|
|
25
|
+
"<output-json-schema>",
|
|
26
|
+
jsonSchema,
|
|
27
|
+
"</output-json-schema>"
|
|
28
|
+
].join("\n");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* envelope 예시 JSON. 렌더 문구와 parseEnvelope 계약의 드리프트를 교차 테스트로 잡기
|
|
32
|
+
* 위해 분리 export 한다 — 예시가 실제 파서를 통과하지 못하면 안내문이 틀린 것이다.
|
|
33
|
+
*
|
|
34
|
+
* 예시는 스스로 계약을 지켜야 한다: args 는 첫 tool 의 inputSchema 를 실제로 만족하는
|
|
35
|
+
* 인스턴스여야 한다. 생성기가 다루지 못하는 keyword(pattern/$ref/allOf 등)가 스키마에
|
|
36
|
+
* 있으면 **fail-closed** — 위반 가능성이 있는 예시를 싣는 대신 예시 자체를 생략하고
|
|
37
|
+
* 렌더러가 프로즈 서술로 대체한다 (`toolCallExample: undefined`).
|
|
38
|
+
*/
|
|
39
|
+
function buildEnvelopeExamples(tools) {
|
|
40
|
+
const firstTool = tools[0];
|
|
41
|
+
const args = firstTool ? exampleValueForSchema(firstTool.inputSchema) : {
|
|
42
|
+
ok: true,
|
|
43
|
+
value: {}
|
|
44
|
+
};
|
|
45
|
+
return {
|
|
46
|
+
...args.ok ? { toolCallExample: JSON.stringify({ result: {
|
|
47
|
+
action: "tool_call",
|
|
48
|
+
answer: null,
|
|
49
|
+
toolCalls: [{
|
|
50
|
+
toolName: firstTool?.name ?? "toolName",
|
|
51
|
+
args: JSON.stringify(args.value)
|
|
52
|
+
}]
|
|
53
|
+
} }) } : {},
|
|
54
|
+
textAnswerExample: JSON.stringify({ result: {
|
|
55
|
+
action: "answer",
|
|
56
|
+
answer: "your final answer",
|
|
57
|
+
toolCalls: null
|
|
58
|
+
} })
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** 생성기가 값 선택에 반영하는 keyword. 어노테이션(description 등)은 값과 무관해 무시한다. */
|
|
62
|
+
const EXAMPLE_ANNOTATION_KEYWORDS = /* @__PURE__ */ new Set([
|
|
63
|
+
"description",
|
|
64
|
+
"title",
|
|
65
|
+
"default",
|
|
66
|
+
"examples",
|
|
67
|
+
"$comment",
|
|
68
|
+
"deprecated",
|
|
69
|
+
"readOnly",
|
|
70
|
+
"writeOnly"
|
|
71
|
+
]);
|
|
72
|
+
const EXAMPLE_HANDLED_KEYWORDS = /* @__PURE__ */ new Set([
|
|
73
|
+
"type",
|
|
74
|
+
"enum",
|
|
75
|
+
"const",
|
|
76
|
+
"properties",
|
|
77
|
+
"required",
|
|
78
|
+
"additionalProperties",
|
|
79
|
+
"items",
|
|
80
|
+
"minItems",
|
|
81
|
+
"maxItems",
|
|
82
|
+
"minLength",
|
|
83
|
+
"maxLength",
|
|
84
|
+
"minimum",
|
|
85
|
+
"maximum",
|
|
86
|
+
"exclusiveMinimum",
|
|
87
|
+
"exclusiveMaximum",
|
|
88
|
+
"anyOf",
|
|
89
|
+
"oneOf"
|
|
90
|
+
]);
|
|
91
|
+
/**
|
|
92
|
+
* inputSchema 를 만족하는 예시 인스턴스 생성. 지원 keyword 집합 밖의 제약
|
|
93
|
+
* (pattern/format/$ref/allOf/not/if/multipleOf/uniqueItems/...)을 만나면 값을
|
|
94
|
+
* 지어내지 않고 { ok: false } 를 돌려준다 — 계약 위반 예시는 모델이 베낀다.
|
|
95
|
+
*/
|
|
96
|
+
function exampleValueForSchema(schema) {
|
|
97
|
+
if (schema === true || schema === void 0) return {
|
|
98
|
+
ok: true,
|
|
99
|
+
value: {}
|
|
100
|
+
};
|
|
101
|
+
if (schema === null || typeof schema !== "object" || Array.isArray(schema)) return { ok: false };
|
|
102
|
+
const node = schema;
|
|
103
|
+
for (const keyword of Object.keys(node)) if (!EXAMPLE_HANDLED_KEYWORDS.has(keyword) && !EXAMPLE_ANNOTATION_KEYWORDS.has(keyword)) return { ok: false };
|
|
104
|
+
if (Array.isArray(node.enum) && node.enum.length > 0) return {
|
|
105
|
+
ok: true,
|
|
106
|
+
value: node.enum[0]
|
|
107
|
+
};
|
|
108
|
+
if ("const" in node) return {
|
|
109
|
+
ok: true,
|
|
110
|
+
value: node.const
|
|
111
|
+
};
|
|
112
|
+
for (const kw of ["anyOf", "oneOf"]) if (Array.isArray(node[kw])) {
|
|
113
|
+
const list = node[kw];
|
|
114
|
+
if (kw === "oneOf" && list.length > 1) return { ok: false };
|
|
115
|
+
for (const branch of list) {
|
|
116
|
+
const result = exampleValueForSchema(branch);
|
|
117
|
+
if (result.ok) return result;
|
|
118
|
+
}
|
|
119
|
+
return { ok: false };
|
|
120
|
+
}
|
|
121
|
+
switch (Array.isArray(node.type) ? node.type[0] : node.type) {
|
|
122
|
+
case "string": {
|
|
123
|
+
const min = typeof node.minLength === "number" ? node.minLength : 0;
|
|
124
|
+
if (min > 64) return { ok: false };
|
|
125
|
+
const base = "example";
|
|
126
|
+
const value = 7 >= min ? base : base.padEnd(min, "x");
|
|
127
|
+
if (typeof node.maxLength === "number" && value.length > node.maxLength) {
|
|
128
|
+
if (node.maxLength < min) return { ok: false };
|
|
129
|
+
return {
|
|
130
|
+
ok: true,
|
|
131
|
+
value: value.slice(0, node.maxLength)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
ok: true,
|
|
136
|
+
value
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
case "number":
|
|
140
|
+
case "integer": {
|
|
141
|
+
let value = 0;
|
|
142
|
+
if (typeof node.minimum === "number") value = node.minimum;
|
|
143
|
+
else if (typeof node.exclusiveMinimum === "number") value = node.exclusiveMinimum + 1;
|
|
144
|
+
if (typeof node.maximum === "number" && value > node.maximum) return { ok: false };
|
|
145
|
+
if (typeof node.exclusiveMaximum === "number" && value >= node.exclusiveMaximum) return { ok: false };
|
|
146
|
+
return {
|
|
147
|
+
ok: true,
|
|
148
|
+
value
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
case "boolean": return {
|
|
152
|
+
ok: true,
|
|
153
|
+
value: false
|
|
154
|
+
};
|
|
155
|
+
case "null": return {
|
|
156
|
+
ok: true,
|
|
157
|
+
value: null
|
|
158
|
+
};
|
|
159
|
+
case "array": {
|
|
160
|
+
const min = typeof node.minItems === "number" ? node.minItems : 0;
|
|
161
|
+
if (min > 8) return { ok: false };
|
|
162
|
+
if (typeof node.maxItems === "number" && node.maxItems < min) return { ok: false };
|
|
163
|
+
if (min === 0) return {
|
|
164
|
+
ok: true,
|
|
165
|
+
value: []
|
|
166
|
+
};
|
|
167
|
+
const item = exampleValueForSchema(node.items);
|
|
168
|
+
if (!item.ok) return { ok: false };
|
|
169
|
+
return {
|
|
170
|
+
ok: true,
|
|
171
|
+
value: Array.from({ length: min }, () => item.value)
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
case void 0:
|
|
175
|
+
case "object": {
|
|
176
|
+
const properties = node.properties && typeof node.properties === "object" && !Array.isArray(node.properties) ? node.properties : {};
|
|
177
|
+
const required = Array.isArray(node.required) ? node.required.filter((k) => typeof k === "string") : [];
|
|
178
|
+
const entries = [];
|
|
179
|
+
for (const key of required) {
|
|
180
|
+
const child = exampleValueForSchema(properties[key]);
|
|
181
|
+
if (!child.ok) return { ok: false };
|
|
182
|
+
entries.push([key, child.value]);
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
ok: true,
|
|
186
|
+
value: Object.fromEntries(entries)
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
default: return { ok: false };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function renderToolEnvelopePrompt(tools, jsonSchema) {
|
|
193
|
+
const { toolCallExample, textAnswerExample } = buildEnvelopeExamples(tools);
|
|
194
|
+
const toolList = tools.map((tool) => {
|
|
195
|
+
const description = tool.description ? ` — ${tool.description}` : "";
|
|
196
|
+
return `- ${tool.name}${description}\n inputSchema: ${JSON.stringify(tool.inputSchema)}`;
|
|
197
|
+
}).join("\n");
|
|
198
|
+
const answerVariant = jsonSchema === void 0 ? [
|
|
199
|
+
"2. Final answer — use only when no further client tool result is needed:",
|
|
200
|
+
textAnswerExample,
|
|
201
|
+
"- \"toolCalls\" must be null.",
|
|
202
|
+
"- \"answer\" must be a plain string with your final answer (not null)."
|
|
203
|
+
] : [
|
|
204
|
+
"2. Final answer — use only when no further client tool result is needed:",
|
|
205
|
+
"- Set \"action\" to \"answer\" and \"toolCalls\" to null.",
|
|
206
|
+
"- \"answer\" must be a JSON value (not null, and not a string of JSON) that conforms to the JSON Schema below.",
|
|
207
|
+
"",
|
|
208
|
+
"<answer-json-schema>",
|
|
209
|
+
jsonSchema,
|
|
210
|
+
"</answer-json-schema>"
|
|
211
|
+
];
|
|
212
|
+
return [
|
|
213
|
+
"## Client Tool Protocol",
|
|
214
|
+
"",
|
|
215
|
+
"The client-side tools listed below are executed by the client, which returns each result",
|
|
216
|
+
"in a follow-up turn. Do not invoke them as native Claude Code tools.",
|
|
217
|
+
"",
|
|
218
|
+
"Your entire reply must be a single JSON object of the form {\"result\": ...} —",
|
|
219
|
+
"raw JSON only, no code fences, no prose before or after the JSON.",
|
|
220
|
+
"The \"result\" value is exactly one of the two variants:",
|
|
221
|
+
"",
|
|
222
|
+
...[
|
|
223
|
+
toolCallExample !== void 0 ? "1. Request client-side tool execution, for example:" : "1. Request client-side tool execution:",
|
|
224
|
+
...toolCallExample !== void 0 ? [toolCallExample] : ["- Set \"action\" to \"tool_call\" and \"answer\" to null.", "- \"toolCalls\" is an array of objects, each {\"toolName\": ..., \"args\": ...}."],
|
|
225
|
+
"- \"toolCalls\" must contain at least one entry.",
|
|
226
|
+
"- \"toolName\" must be one of the client tool names listed below.",
|
|
227
|
+
"- \"args\" must be the tool arguments encoded as a JSON string (not an object), conforming to that tool's inputSchema.",
|
|
228
|
+
"- \"answer\" must be null."
|
|
229
|
+
],
|
|
230
|
+
"",
|
|
231
|
+
...answerVariant,
|
|
232
|
+
"",
|
|
233
|
+
"Available client tools:",
|
|
234
|
+
toolList
|
|
235
|
+
].join("\n");
|
|
236
|
+
}
|
|
237
|
+
//#endregion
|
|
238
|
+
export { buildEnvelopeExamples, composeSystemWithSchemaContract, renderOutputSchemaPrompt, renderSchemaContractPrompt, renderToolEnvelopePrompt };
|
|
239
|
+
|
|
240
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXByb21wdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvc2NoZW1hLXByb21wdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG91dHB1dCBzY2hlbWEgLyB0b29sIGVudmVsb3BlIOqzhOyVveydmCDtlITroaztlITtirgg66CM642U66eBIChTT04tNTMyKS5cbiAqXG4gKiBhbnRocm9waWMg6rK966Gc64qUIENDIOyXkCAtLWpzb24tc2NoZW1hIOulvCDsoITri6ztlZjsp4Ag7JWK64qU64ukIOKAlCDqsJXsoJwg7JeG64qUIOyCrO2bhCDssYTsoJAoQUpWKeydtFxuICog7IaM67mE7J6QIOydmOuPhOyZgCDstqnrj4ztlbQg64K067aAIOyerOyLnOuPhCDro6jtlITrpbwg66eM65Ok7JeI6riwIOuVjOusuC4g64yA7IugIOyXrOq4sOyEnCDqs4Tslb3snYQg7YWN7Iqk7Yq466GcXG4gKiDroIzrjZTtlbQgc3lzdGVtIHByb21wdCDrp5Drr7jsl5Ag7KO87J6F7ZWY6rOgLCDtjJDsoJXsnYAg7IaM67mE7J6QIHpvZCjsiqTtgqTrp4gpIC8gcGFyc2VFbnZlbG9wZVxuICogKGVudmVsb3BlLCB0b29sLWVtdWxhdGlvbi50cynqsIAg66eh64qU64ukLlxuICpcbiAqIOybkOy5mTpcbiAqIC0gdXNlciDsiqTtgqTrp4jripQg7IiY7IugIOybkO2YlSDqt7jrjIDroZwg7JWI64K07ZWc64ukIOKAlCBzdHJpY3RpZnko7KCEIO2VhOuTnCByZXF1aXJlZCDqsJXsoJwsXG4gKiAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOmZhbHNlKeulvCDqsbDsuZjsp4Ag7JWK7JWEIOyGjOu5hOyekOydmCBudWxsaXNoL29wdGlvbmFsIOydmOuPhOqwgCDrs7TsobTrkJzri6QuXG4gKiAtIGVudmVsb3BlIOydgCBidWlsZFRvb2xDYWxsU2NoZW1hKHRvb2wtZW11bGF0aW9uLXNjaGVtYS50cynsspjrn7wgdXNlciDsiqTtgqTrp4jrpbwgJGRlZnMg66GcXG4gKiAgIO2VqeyEse2VmOyngCDslYrripTri6QuIO2FjeyKpO2KuCDslYjrgrTrnbwgYCRyZWZgIOusuOyEnCDro6jtirgg7Lap64+M7J20IOyXhuyWtCByZWJhc2Ug6rCAIOu2iO2VhOyalO2VmOqzoCxcbiAqICAg6re4IOuNleyXkCByZWJhc2Ug6rCAIOqxsOygiO2VmOuNmCDtmJXtg5wobmFtZWQgYW5jaG9yICRyZWYg65OxKeuPhCDqt7jrjIDroZwg7Ya16rO87ZWc64ukLlxuICogLSDroIzrjZTrkJwg6rOE7JW97J2AIHBhcnNlRW52ZWxvcGUg7J2YIHpvZCDqs4Tslb0oe1wicmVzdWx0XCI6IC4uLn0g7ZWcIOqyuSwg7IOB7Zi467Cw7YOAIOuzgO2YlSnqs7xcbiAqICAg7KCV7ZmV7Z6IIOydvOy5mO2VtOyVvCDtlZzri6Qg4oCUIOq1kOywqCDthYzsiqTtirgoc2NoZW1hLXByb21wdC50ZXN0LnRzKeqwgCDrk5zrpqztlITtirjrpbwg66eJ64qU64ukLlxuICovXG5pbXBvcnQgeyB0eXBlIFFncmlkVG9vbCwgdHlwZSBRdWVyeUlucHV0IH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuLyoqXG4gKiBzeXN0ZW0gcHJvbXB0IOunkOuvuOyXkCDqs4Tslb3snYQg642n67aZ7J2464ukLiBhbnRocm9waWMg7J2AIGNvbGQtb25seSjrp6Qg7YS0IENDIOyerOyKpO2PsCArIHN5c3RlbVxuICog7J6s7KCE7IahKeudvCDrqYDti7DthLTsl5Drj4Qg6rOE7JW97J20IOunpCDthLQg7J286rSA65CY6rKMIOyjvOyeheuQnOuLpC4gc3lzdGVtIOydtCBhcmd2IDY0S0Ig66W8IOuEmOycvOuptFxuICogY2xhdWRlLXNlc3Npb24g7J2YIC0tc3lzdGVtLXByb21wdC1maWxlIOu2hOq4sOqwgCDtnaHsiJjtlZzri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlU3lzdGVtV2l0aFNjaGVtYUNvbnRyYWN0KFxuICBzeXN0ZW06IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29udHJhY3QgPSByZW5kZXJTY2hlbWFDb250cmFjdFByb21wdChpbnB1dCk7XG4gIGlmIChjb250cmFjdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gc3lzdGVtO1xuICByZXR1cm4gc3lzdGVtID8gYCR7c3lzdGVtfVxcblxcbiR7Y29udHJhY3R9YCA6IGNvbnRyYWN0O1xufVxuXG4vKiog7JqU7LKt7JeQIOyKpO2CpOuniC90b29scyDqsIAg7JeG7Jy866m0IHVuZGVmaW5lZCDigJQg6rOE7JW9IOyjvOyehSDsl4bsnbQg7Y+J67KU7ZWcIO2FjeyKpO2KuCDsmpTssq3snbTri6QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU2NoZW1hQ29udHJhY3RQcm9tcHQoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpbnB1dC50b29scz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlbmRlclRvb2xFbnZlbG9wZVByb21wdChpbnB1dC50b29scywgaW5wdXQuanNvblNjaGVtYSk7XG4gIH1cbiAgaWYgKGlucHV0Lmpzb25TY2hlbWEgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZW5kZXJPdXRwdXRTY2hlbWFQcm9tcHQoaW5wdXQuanNvblNjaGVtYSk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLy8gMTA5MTc0OCDsi6TsuKEo7Iqk7YKk66eIIOybkOusuCArIFwi7Y6c7IqkwrfshKTrqoUg7JeG7J20IEpTT04g66eMXCIg7KeA7IucKeyXkOyEnCDqsoDspp3rkJwg7ZiV7Iud7J2EIOuUsOuluOuLpC5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJPdXRwdXRTY2hlbWFQcm9tcHQoanNvblNjaGVtYTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBcIiMjIE91dHB1dCBGb3JtYXRcIixcbiAgICBcIlwiLFxuICAgIFwiWW91ciBlbnRpcmUgcmVwbHkgbXVzdCBiZSBhIHNpbmdsZSBKU09OIG9iamVjdCB0aGF0IGNvbmZvcm1zIHRvIHRoZSBKU09OIFNjaGVtYSBiZWxvdy5cIixcbiAgICBcIk91dHB1dCByYXcgSlNPTiBvbmx5IOKAlCBubyBjb2RlIGZlbmNlcywgbm8gcHJvc2UgYmVmb3JlIG9yIGFmdGVyIHRoZSBKU09OLlwiLFxuICAgIFwiU3RhcnQgeW91ciByZXBseSB3aXRoIHsgYW5kIGVuZCBpdCB3aXRoIH0uXCIsXG4gICAgXCJcIixcbiAgICBcIjxvdXRwdXQtanNvbi1zY2hlbWE+XCIsXG4gICAganNvblNjaGVtYSxcbiAgICBcIjwvb3V0cHV0LWpzb24tc2NoZW1hPlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG59XG5cbi8qKlxuICogZW52ZWxvcGUg7JiI7IucIEpTT04uIOugjOuNlCDrrLjqtazsmYAgcGFyc2VFbnZlbG9wZSDqs4Tslb3snZgg65Oc66as7ZSE7Yq466W8IOq1kOywqCDthYzsiqTtirjroZwg7J6h6riwXG4gKiDsnITtlbQg67aE66asIGV4cG9ydCDtlZzri6Qg4oCUIOyYiOyLnOqwgCDsi6TsoJwg7YyM7ISc66W8IO2GteqzvO2VmOyngCDrqrvtlZjrqbQg7JWI64K066y47J20IO2LgOumsCDqsoPsnbTri6QuXG4gKlxuICog7JiI7Iuc64qUIOyKpOyKpOuhnCDqs4Tslb3snYQg7KeA7Lyc7JW8IO2VnOuLpDogYXJncyDripQg7LKrIHRvb2wg7J2YIGlucHV0U2NoZW1hIOulvCDsi6TsoJzroZwg66eM7KGx7ZWY64qUXG4gKiDsnbjsiqTthLTsiqTsl6zslbwg7ZWc64ukLiDsg53shLHquLDqsIAg64uk66Oo7KeAIOuqu+2VmOuKlCBrZXl3b3JkKHBhdHRlcm4vJHJlZi9hbGxPZiDrk7Ep6rCAIOyKpO2CpOuniOyXkFxuICog7J6I7Jy866m0ICoqZmFpbC1jbG9zZWQqKiDigJQg7JyE67CYIOqwgOuKpeyEseydtCDsnojripQg7JiI7Iuc66W8IOyLo+uKlCDrjIDsi6Ag7JiI7IucIOyekOyytOulvCDsg53rnrXtlZjqs6BcbiAqIOugjOuNlOufrOqwgCDtlITroZzspogg7ISc7Iig66GcIOuMgOyytO2VnOuLpCAoYHRvb2xDYWxsRXhhbXBsZTogdW5kZWZpbmVkYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudmVsb3BlRXhhbXBsZXModG9vbHM6IFFncmlkVG9vbFtdKToge1xuICB0b29sQ2FsbEV4YW1wbGU/OiBzdHJpbmc7XG4gIHRleHRBbnN3ZXJFeGFtcGxlOiBzdHJpbmc7XG59IHtcbiAgY29uc3QgZmlyc3RUb29sID0gdG9vbHNbMF07XG4gIGNvbnN0IGFyZ3MgPSBmaXJzdFRvb2wgPyBleGFtcGxlVmFsdWVGb3JTY2hlbWEoZmlyc3RUb29sLmlucHV0U2NoZW1hKSA6IHsgb2s6IHRydWUsIHZhbHVlOiB7fSB9O1xuICByZXR1cm4ge1xuICAgIC4uLihhcmdzLm9rXG4gICAgICA/IHtcbiAgICAgICAgICB0b29sQ2FsbEV4YW1wbGU6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICBhY3Rpb246IFwidG9vbF9jYWxsXCIsXG4gICAgICAgICAgICAgIGFuc3dlcjogbnVsbCxcbiAgICAgICAgICAgICAgdG9vbENhbGxzOiBbXG4gICAgICAgICAgICAgICAgeyB0b29sTmFtZTogZmlyc3RUb29sPy5uYW1lID8/IFwidG9vbE5hbWVcIiwgYXJnczogSlNPTi5zdHJpbmdpZnkoYXJncy52YWx1ZSkgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIHRleHRBbnN3ZXJFeGFtcGxlOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICByZXN1bHQ6IHsgYWN0aW9uOiBcImFuc3dlclwiLCBhbnN3ZXI6IFwieW91ciBmaW5hbCBhbnN3ZXJcIiwgdG9vbENhbGxzOiBudWxsIH0sXG4gICAgfSksXG4gIH07XG59XG5cbnR5cGUgRXhhbXBsZVJlc3VsdCA9IHsgb2s6IHRydWU7IHZhbHVlOiB1bmtub3duIH0gfCB7IG9rOiBmYWxzZSB9O1xuXG4vKiog7IOd7ISx6riw6rCAIOqwkiDshKDtg53sl5Ag67CY7JiB7ZWY64qUIGtleXdvcmQuIOyWtOuFuO2FjOydtOyFmChkZXNjcmlwdGlvbiDrk7Ep7J2AIOqwkuqzvCDrrLTqtIDtlbQg66y07Iuc7ZWc64ukLiAqL1xuY29uc3QgRVhBTVBMRV9BTk5PVEFUSU9OX0tFWVdPUkRTID0gbmV3IFNldChbXG4gIFwiZGVzY3JpcHRpb25cIixcbiAgXCJ0aXRsZVwiLFxuICBcImRlZmF1bHRcIixcbiAgXCJleGFtcGxlc1wiLFxuICBcIiRjb21tZW50XCIsXG4gIFwiZGVwcmVjYXRlZFwiLFxuICBcInJlYWRPbmx5XCIsXG4gIFwid3JpdGVPbmx5XCIsXG5dKTtcbmNvbnN0IEVYQU1QTEVfSEFORExFRF9LRVlXT1JEUyA9IG5ldyBTZXQoW1xuICBcInR5cGVcIixcbiAgXCJlbnVtXCIsXG4gIFwiY29uc3RcIixcbiAgXCJwcm9wZXJ0aWVzXCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiLFxuICBcIml0ZW1zXCIsXG4gIFwibWluSXRlbXNcIixcbiAgXCJtYXhJdGVtc1wiLFxuICBcIm1pbkxlbmd0aFwiLFxuICBcIm1heExlbmd0aFwiLFxuICBcIm1pbmltdW1cIixcbiAgXCJtYXhpbXVtXCIsXG4gIFwiZXhjbHVzaXZlTWluaW11bVwiLFxuICBcImV4Y2x1c2l2ZU1heGltdW1cIixcbiAgXCJhbnlPZlwiLFxuICBcIm9uZU9mXCIsXG5dKTtcblxuLyoqXG4gKiBpbnB1dFNjaGVtYSDrpbwg66eM7KGx7ZWY64qUIOyYiOyLnCDsnbjsiqTthLTsiqQg7IOd7ISxLiDsp4Dsm5Aga2V5d29yZCDsp5Htlakg67CW7J2YIOygnOyVvVxuICogKHBhdHRlcm4vZm9ybWF0LyRyZWYvYWxsT2Yvbm90L2lmL211bHRpcGxlT2YvdW5pcXVlSXRlbXMvLi4uKeydhCDrp4zrgpjrqbQg6rCS7J2EXG4gKiDsp4DslrTrgrTsp4Ag7JWK6rOgIHsgb2s6IGZhbHNlIH0g66W8IOuPjOugpOykgOuLpCDigJQg6rOE7JW9IOychOuwmCDsmIjsi5zripQg66qo64247J20IOuyoOuCgOuLpC5cbiAqL1xuZnVuY3Rpb24gZXhhbXBsZVZhbHVlRm9yU2NoZW1hKHNjaGVtYTogdW5rbm93bik6IEV4YW1wbGVSZXN1bHQge1xuICBpZiAoc2NoZW1hID09PSB0cnVlIHx8IHNjaGVtYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IHt9IH07XG4gIGlmIChzY2hlbWEgPT09IG51bGwgfHwgdHlwZW9mIHNjaGVtYSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHNjaGVtYSkpIHJldHVybiB7IG9rOiBmYWxzZSB9O1xuICBjb25zdCBub2RlID0gc2NoZW1hIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGZvciAoY29uc3Qga2V5d29yZCBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgIGlmICghRVhBTVBMRV9IQU5ETEVEX0tFWVdPUkRTLmhhcyhrZXl3b3JkKSAmJiAhRVhBTVBMRV9BTk5PVEFUSU9OX0tFWVdPUkRTLmhhcyhrZXl3b3JkKSkge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZS5lbnVtKSAmJiBub2RlLmVudW0ubGVuZ3RoID4gMCkgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiBub2RlLmVudW1bMF0gfTtcbiAgaWYgKFwiY29uc3RcIiBpbiBub2RlKSByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG5vZGUuY29uc3QgfTtcblxuICBmb3IgKGNvbnN0IGt3IG9mIFtcImFueU9mXCIsIFwib25lT2ZcIl0gYXMgY29uc3QpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlW2t3XSkpIHtcbiAgICAgIC8vIG9uZU9mIOuKlCBcIuygle2Zle2eiCDtlZjrgphcIuudvCDssqsg67iM656c7LmYIOqwkuydtCDri6Trpbgg67iM656c7LmY7JeQ64+EIOunpOy5reuQoCDsiJgg7J6I64ukIOKAlFxuICAgICAgLy8g6rKA7Kad6riwIOyXhuydtCDtmZXsi6DtlaAg7IiYIOyXhuycvOuvgOuhnCDruIzrnpzsuZjqsIAg7ZWY64KY7J28IOuVjOunjCDsg53shLHtlZzri6QuXG4gICAgICBjb25zdCBsaXN0ID0gbm9kZVtrd10gYXMgdW5rbm93bltdO1xuICAgICAgaWYgKGt3ID09PSBcIm9uZU9mXCIgJiYgbGlzdC5sZW5ndGggPiAxKSByZXR1cm4geyBvazogZmFsc2UgfTtcbiAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIGxpc3QpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhhbXBsZVZhbHVlRm9yU2NoZW1hKGJyYW5jaCk7XG4gICAgICAgIGlmIChyZXN1bHQub2spIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBvazogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0eXBlID0gQXJyYXkuaXNBcnJheShub2RlLnR5cGUpID8gbm9kZS50eXBlWzBdIDogbm9kZS50eXBlO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6IHtcbiAgICAgIGNvbnN0IG1pbiA9IHR5cGVvZiBub2RlLm1pbkxlbmd0aCA9PT0gXCJudW1iZXJcIiA/IG5vZGUubWluTGVuZ3RoIDogMDtcbiAgICAgIGlmIChtaW4gPiA2NCkgcmV0dXJuIHsgb2s6IGZhbHNlIH07XG4gICAgICBjb25zdCBiYXNlID0gXCJleGFtcGxlXCI7XG4gICAgICBjb25zdCB2YWx1ZSA9IGJhc2UubGVuZ3RoID49IG1pbiA/IGJhc2UgOiBiYXNlLnBhZEVuZChtaW4sIFwieFwiKTtcbiAgICAgIGlmICh0eXBlb2Ygbm9kZS5tYXhMZW5ndGggPT09IFwibnVtYmVyXCIgJiYgdmFsdWUubGVuZ3RoID4gbm9kZS5tYXhMZW5ndGgpIHtcbiAgICAgICAgaWYgKG5vZGUubWF4TGVuZ3RoIDwgbWluKSByZXR1cm4geyBvazogZmFsc2UgfTtcbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiB2YWx1ZS5zbGljZSgwLCBub2RlLm1heExlbmd0aCkgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZSB9O1xuICAgIH1cbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImludGVnZXJcIjoge1xuICAgICAgbGV0IHZhbHVlID0gMDtcbiAgICAgIGlmICh0eXBlb2Ygbm9kZS5taW5pbXVtID09PSBcIm51bWJlclwiKSB2YWx1ZSA9IG5vZGUubWluaW11bTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBub2RlLmV4Y2x1c2l2ZU1pbmltdW0gPT09IFwibnVtYmVyXCIpIHZhbHVlID0gbm9kZS5leGNsdXNpdmVNaW5pbXVtICsgMTtcbiAgICAgIGlmICh0eXBlb2Ygbm9kZS5tYXhpbXVtID09PSBcIm51bWJlclwiICYmIHZhbHVlID4gbm9kZS5tYXhpbXVtKSByZXR1cm4geyBvazogZmFsc2UgfTtcbiAgICAgIGlmICh0eXBlb2Ygbm9kZS5leGNsdXNpdmVNYXhpbXVtID09PSBcIm51bWJlclwiICYmIHZhbHVlID49IG5vZGUuZXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgICByZXR1cm4geyBvazogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZSB9O1xuICAgIH1cbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiBmYWxzZSB9O1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICBjYXNlIFwiYXJyYXlcIjoge1xuICAgICAgY29uc3QgbWluID0gdHlwZW9mIG5vZGUubWluSXRlbXMgPT09IFwibnVtYmVyXCIgPyBub2RlLm1pbkl0ZW1zIDogMDtcbiAgICAgIGlmIChtaW4gPiA4KSByZXR1cm4geyBvazogZmFsc2UgfTtcbiAgICAgIGlmICh0eXBlb2Ygbm9kZS5tYXhJdGVtcyA9PT0gXCJudW1iZXJcIiAmJiBub2RlLm1heEl0ZW1zIDwgbWluKSByZXR1cm4geyBvazogZmFsc2UgfTtcbiAgICAgIGlmIChtaW4gPT09IDApIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogW10gfTtcbiAgICAgIGNvbnN0IGl0ZW0gPSBleGFtcGxlVmFsdWVGb3JTY2hlbWEobm9kZS5pdGVtcyk7XG4gICAgICBpZiAoIWl0ZW0ub2spIHJldHVybiB7IG9rOiBmYWxzZSB9O1xuICAgICAgLy8g6rCZ7J2AIOqwkiDrsJjrs7XsnbTrnbwgdW5pcXVlSXRlbXMg7JmAIOy2qeuPjO2VmOyngOunjCwgdW5pcXVlSXRlbXMg64qUIOyngOybkCDsp5Htlakg67CW7J206528XG4gICAgICAvLyDsnITsnZgga2V5d29yZCDqsoDsgqzsl5DshJwg7J2066+4IGZhaWwtY2xvc2VkIOuQnOuLpC5cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogQXJyYXkuZnJvbSh7IGxlbmd0aDogbWluIH0sICgpID0+IGl0ZW0udmFsdWUpIH07XG4gICAgfVxuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICAgIG5vZGUucHJvcGVydGllcyAmJiB0eXBlb2Ygbm9kZS5wcm9wZXJ0aWVzID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KG5vZGUucHJvcGVydGllcylcbiAgICAgICAgICA/IChub2RlLnByb3BlcnRpZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgOiB7fTtcbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gQXJyYXkuaXNBcnJheShub2RlLnJlcXVpcmVkKVxuICAgICAgICA/IG5vZGUucmVxdWlyZWQuZmlsdGVyKChrKTogayBpcyBzdHJpbmcgPT4gdHlwZW9mIGsgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIDogW107XG4gICAgICBjb25zdCBlbnRyaWVzOiBBcnJheTxbc3RyaW5nLCB1bmtub3duXT4gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlcXVpcmVkKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gZXhhbXBsZVZhbHVlRm9yU2NoZW1hKHByb3BlcnRpZXNba2V5XSk7XG4gICAgICAgIGlmICghY2hpbGQub2spIHJldHVybiB7IG9rOiBmYWxzZSB9O1xuICAgICAgICBlbnRyaWVzLnB1c2goW2tleSwgY2hpbGQudmFsdWVdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyBvazogZmFsc2UgfTtcbiAgfVxufVxuXG4vLyBlbnZlbG9wZSDqs4Tslb0g66y46rWs64qUIGJ1aWxkVG9vbENhbGxTY2hlbWEg7J2YIGRlc2NyaXB0aW9uIOuTpOqzvCDqsJnsnYAg7ZGc7ZiE7J2EIOyTtOuLpFxuLy8gKFwiRG8gbm90IGludm9rZSAuLi4gYXMgbmF0aXZlIENsYXVkZSBDb2RlIHRvb2xzXCIg65OxKSDigJQg66qo64247J20IHN0cnVjdHVyZWQv7ZSE66Gs7ZSE7Yq4XG4vLyDslrTripAg7JWI64K066W8IOuwm+yVhOuPhCDqsJnsnYAg6rec7LmZ7J2EIOydveqyjCDtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVG9vbEVudmVsb3BlUHJvbXB0KHRvb2xzOiBRZ3JpZFRvb2xbXSwganNvblNjaGVtYT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgdG9vbENhbGxFeGFtcGxlLCB0ZXh0QW5zd2VyRXhhbXBsZSB9ID0gYnVpbGRFbnZlbG9wZUV4YW1wbGVzKHRvb2xzKTtcblxuICBjb25zdCB0b29sTGlzdCA9IHRvb2xzXG4gICAgLm1hcCgodG9vbCkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0b29sLmRlc2NyaXB0aW9uID8gYCDigJQgJHt0b29sLmRlc2NyaXB0aW9ufWAgOiBcIlwiO1xuICAgICAgcmV0dXJuIGAtICR7dG9vbC5uYW1lfSR7ZGVzY3JpcHRpb259XFxuICBpbnB1dFNjaGVtYTogJHtKU09OLnN0cmluZ2lmeSh0b29sLmlucHV0U2NoZW1hKX1gO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgLy8g7JiI7Iuc6rCAIHJhdy1KU09OLW9ubHkg6rec7LmZ7J2EIOyKpOyKpOuhnCDslrTquLDrqbQg7JWIIOuQnOuLpDoganNvbiBhbnN3ZXIg64qUIOyKpO2CpOuniCDsooXsho3snbTrnbxcbiAgLy8g7Jyg7Zqo7ZWcIOumrO2EsOuftCDsmIjsi5zrpbwg66eM65OkIOyImCDsl4bsnLzrr4DroZwg7JiI7IucIOyXhuydtCDtlITroZzspojroZzrp4wg7ISc7Iig7ZWc64ukICjsnpDrpqztkZzsi5zsnpDqsIBcbiAgLy8g7ISe7J24IOu5hCBKU09OIOyYiOyLnOulvCDrqqjrjbjsnbQg6re464yA66GcIOuyoOuBvOuKlCDqsoMg67Cp7KeAKS5cbiAgY29uc3QgYW5zd2VyVmFyaWFudCA9XG4gICAganNvblNjaGVtYSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IFtcbiAgICAgICAgICBcIjIuIEZpbmFsIGFuc3dlciDigJQgdXNlIG9ubHkgd2hlbiBubyBmdXJ0aGVyIGNsaWVudCB0b29sIHJlc3VsdCBpcyBuZWVkZWQ6XCIsXG4gICAgICAgICAgdGV4dEFuc3dlckV4YW1wbGUsXG4gICAgICAgICAgJy0gXCJ0b29sQ2FsbHNcIiBtdXN0IGJlIG51bGwuJyxcbiAgICAgICAgICAnLSBcImFuc3dlclwiIG11c3QgYmUgYSBwbGFpbiBzdHJpbmcgd2l0aCB5b3VyIGZpbmFsIGFuc3dlciAobm90IG51bGwpLicsXG4gICAgICAgIF1cbiAgICAgIDogW1xuICAgICAgICAgIFwiMi4gRmluYWwgYW5zd2VyIOKAlCB1c2Ugb25seSB3aGVuIG5vIGZ1cnRoZXIgY2xpZW50IHRvb2wgcmVzdWx0IGlzIG5lZWRlZDpcIixcbiAgICAgICAgICAnLSBTZXQgXCJhY3Rpb25cIiB0byBcImFuc3dlclwiIGFuZCBcInRvb2xDYWxsc1wiIHRvIG51bGwuJyxcbiAgICAgICAgICAnLSBcImFuc3dlclwiIG11c3QgYmUgYSBKU09OIHZhbHVlIChub3QgbnVsbCwgYW5kIG5vdCBhIHN0cmluZyBvZiBKU09OKSB0aGF0IGNvbmZvcm1zIHRvIHRoZSBKU09OIFNjaGVtYSBiZWxvdy4nLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgXCI8YW5zd2VyLWpzb24tc2NoZW1hPlwiLFxuICAgICAgICAgIGpzb25TY2hlbWEsXG4gICAgICAgICAgXCI8L2Fuc3dlci1qc29uLXNjaGVtYT5cIixcbiAgICAgICAgXTtcblxuICAvLyDsmIjsi5wg7IOd7ISx6riw6rCAIOuLpOujqOyngCDrqrvtlZjripQgaW5wdXRTY2hlbWEoZmFpbC1jbG9zZWQp66m0IOq1rOyhsCDshJzsiKDroZwg64yA7LK07ZWc64ukIOKAlFxuICAvLyDsiqTtgqTrp4jrpbwg7JyE67CY7ZWgIOyImCDsnojripQg7JiI7Iuc66W8IOyLo+uKlCDqsoPrs7Tri6Qg7JiI7Iuc6rCAIOyXhuuKlCDtjrjsnbQg7JWI7KCE7ZWY64ukLlxuICBjb25zdCB0b29sQ2FsbFZhcmlhbnQgPSBbXG4gICAgdG9vbENhbGxFeGFtcGxlICE9PSB1bmRlZmluZWRcbiAgICAgID8gXCIxLiBSZXF1ZXN0IGNsaWVudC1zaWRlIHRvb2wgZXhlY3V0aW9uLCBmb3IgZXhhbXBsZTpcIlxuICAgICAgOiBcIjEuIFJlcXVlc3QgY2xpZW50LXNpZGUgdG9vbCBleGVjdXRpb246XCIsXG4gICAgLi4uKHRvb2xDYWxsRXhhbXBsZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IFt0b29sQ2FsbEV4YW1wbGVdXG4gICAgICA6IFtcbiAgICAgICAgICAnLSBTZXQgXCJhY3Rpb25cIiB0byBcInRvb2xfY2FsbFwiIGFuZCBcImFuc3dlclwiIHRvIG51bGwuJyxcbiAgICAgICAgICAnLSBcInRvb2xDYWxsc1wiIGlzIGFuIGFycmF5IG9mIG9iamVjdHMsIGVhY2gge1widG9vbE5hbWVcIjogLi4uLCBcImFyZ3NcIjogLi4ufS4nLFxuICAgICAgICBdKSxcbiAgICAnLSBcInRvb2xDYWxsc1wiIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZW50cnkuJyxcbiAgICAnLSBcInRvb2xOYW1lXCIgbXVzdCBiZSBvbmUgb2YgdGhlIGNsaWVudCB0b29sIG5hbWVzIGxpc3RlZCBiZWxvdy4nLFxuICAgICctIFwiYXJnc1wiIG11c3QgYmUgdGhlIHRvb2wgYXJndW1lbnRzIGVuY29kZWQgYXMgYSBKU09OIHN0cmluZyAobm90IGFuIG9iamVjdCksIGNvbmZvcm1pbmcgdG8gdGhhdCB0b29sXFwncyBpbnB1dFNjaGVtYS4nLFxuICAgICctIFwiYW5zd2VyXCIgbXVzdCBiZSBudWxsLicsXG4gIF07XG5cbiAgcmV0dXJuIFtcbiAgICBcIiMjIENsaWVudCBUb29sIFByb3RvY29sXCIsXG4gICAgXCJcIixcbiAgICBcIlRoZSBjbGllbnQtc2lkZSB0b29scyBsaXN0ZWQgYmVsb3cgYXJlIGV4ZWN1dGVkIGJ5IHRoZSBjbGllbnQsIHdoaWNoIHJldHVybnMgZWFjaCByZXN1bHRcIixcbiAgICBcImluIGEgZm9sbG93LXVwIHR1cm4uIERvIG5vdCBpbnZva2UgdGhlbSBhcyBuYXRpdmUgQ2xhdWRlIENvZGUgdG9vbHMuXCIsXG4gICAgXCJcIixcbiAgICAnWW91ciBlbnRpcmUgcmVwbHkgbXVzdCBiZSBhIHNpbmdsZSBKU09OIG9iamVjdCBvZiB0aGUgZm9ybSB7XCJyZXN1bHRcIjogLi4ufSDigJQnLFxuICAgIFwicmF3IEpTT04gb25seSwgbm8gY29kZSBmZW5jZXMsIG5vIHByb3NlIGJlZm9yZSBvciBhZnRlciB0aGUgSlNPTi5cIixcbiAgICAnVGhlIFwicmVzdWx0XCIgdmFsdWUgaXMgZXhhY3RseSBvbmUgb2YgdGhlIHR3byB2YXJpYW50czonLFxuICAgIFwiXCIsXG4gICAgLi4udG9vbENhbGxWYXJpYW50LFxuICAgIFwiXCIsXG4gICAgLi4uYW5zd2VyVmFyaWFudCxcbiAgICBcIlwiLFxuICAgIFwiQXZhaWxhYmxlIGNsaWVudCB0b29sczpcIixcbiAgICB0b29sTGlzdCxcbiAgXS5qb2luKFwiXFxuXCIpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUF3QkEsU0FBZ0IsZ0NBQ2QsUUFDQSxPQUNvQjtDQUNwQixNQUFNLFdBQVcsMkJBQTJCLEtBQUs7Q0FDakQsSUFBSSxhQUFhLFFBQVcsT0FBTztDQUNuQyxPQUFPLFNBQVMsR0FBRyxPQUFPLE1BQU0sYUFBYTtBQUMvQzs7QUFHQSxTQUFnQiwyQkFDZCxPQUNvQjtDQUNwQixJQUFJLE1BQU0sT0FBTyxRQUNmLE9BQU8seUJBQXlCLE1BQU0sT0FBTyxNQUFNLFVBQVU7Q0FFL0QsSUFBSSxNQUFNLGVBQWUsUUFDdkIsT0FBTyx5QkFBeUIsTUFBTSxVQUFVO0FBR3BEO0FBR0EsU0FBZ0IseUJBQXlCLFlBQTRCO0NBQ25FLE9BQU87RUFDTDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7Q0FDRixDQUFDLENBQUMsS0FBSyxJQUFJO0FBQ2I7Ozs7Ozs7Ozs7QUFXQSxTQUFnQixzQkFBc0IsT0FHcEM7Q0FDQSxNQUFNLFlBQVksTUFBTTtDQUN4QixNQUFNLE9BQU8sWUFBWSxzQkFBc0IsVUFBVSxXQUFXLElBQUk7RUFBRSxJQUFJO0VBQU0sT0FBTyxDQUFDO0NBQUU7Q0FDOUYsT0FBTztFQUNMLEdBQUksS0FBSyxLQUNMLEVBQ0UsaUJBQWlCLEtBQUssVUFBVSxFQUM5QixRQUFRO0dBQ04sUUFBUTtHQUNSLFFBQVE7R0FDUixXQUFXLENBQ1Q7SUFBRSxVQUFVLFdBQVcsUUFBUTtJQUFZLE1BQU0sS0FBSyxVQUFVLEtBQUssS0FB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
|
|
@@ -44,8 +44,9 @@ function parseEnvelope(text, tools, answerKind) {
|
|
|
44
44
|
try {
|
|
45
45
|
value = JSON.parse(text);
|
|
46
46
|
} catch (error) {
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
const head = JSON.stringify(text.slice(0, 200));
|
|
48
|
+
logger.warn(`tool envelope parse failed: ${error.message}; head=${head}`);
|
|
49
|
+
throw new ToolCallEmulationError(`invalid tool envelope (response is not JSON — the model ignored the envelope contract; retry is the caller's decision): ${error.message}; response head: ${head}`);
|
|
49
50
|
}
|
|
50
51
|
assertStructuredEnvelopeComplexity(value);
|
|
51
52
|
const validation = (answerKind === "text" ? TEXT_ENVELOPE : JSON_ENVELOPE).safeParse(value);
|
|
@@ -53,8 +54,9 @@ function parseEnvelope(text, tools, answerKind) {
|
|
|
53
54
|
const issue = validation.error.issues[0];
|
|
54
55
|
const path = issue && issue.path.length > 0 ? ` at ${issue.path.join(".")}` : "";
|
|
55
56
|
const detail = issue?.message ?? "unknown validation issue";
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
const head = JSON.stringify(text.slice(0, 200));
|
|
58
|
+
logger.warn(`tool envelope validation failed${path}: ${detail}; head=${head}`);
|
|
59
|
+
throw new ToolCallEmulationError(`invalid tool envelope${path}: ${detail}; response head: ${head}`);
|
|
58
60
|
}
|
|
59
61
|
const response = value.result;
|
|
60
62
|
if (response.action === "tool_call") {
|
|
@@ -123,4 +125,4 @@ function assertStructuredEnvelopeComplexity(root) {
|
|
|
123
125
|
//#endregion
|
|
124
126
|
export { ToolCallEmulationError, applyToolCallEmulation };
|
|
125
127
|
|
|
126
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8g7J2R64u1KOuqqOuNuCDstpzroKUpIGVudmVsb3BlIOydmCDsnpDsm5Ag7ZWc64+ELiBjYWxsZXIg7Iqk7YKk66eIIOyghOyymOumrCDtlZzrj4QoQ0FMTEVSX1NDSEVNQV9MSU1JVFMp7JmAIOqwkuydtFxuLy8g6rCZ7JWEIOuztOyXrOuPhCDshJzroZwg64uk66W4IOyekOybkOydhCDsp4DtgqTripQg64+F66a9IOyDgeyImOuLpCDigJQg7Iqk7YKk66eIIOq5iuydtOuKlCDsnbjsiqTthLTsiqQg6rmK7J2066W8IGJvdW5kIO2VmOyngFxuLy8g7JWK7Jy866+A66GcKOyerOq3gCAkcmVmIO2XiOyaqSkg7LqY65+sIO2VnOuPhOulvCDsobDsoJXtlbTrj4Qg7J2R64u1IOyImOyaqSDquLDspIDsnbQg65Sw6528IOybgOyngeyXrOyEoCDslYgg65Cc64ukLlxuY29uc3QgU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMgPSB7XG4gIG1heFV0ZjhCeXRlczogNTEyICogMTAyNCxcbiAgbWF4Tm9kZXM6IDIwXzAwMCxcbiAgbWF4RGVwdGg6IDEzMixcbn0gYXMgY29uc3Q7XG5pbXBvcnQge1xuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIEVtdWxhdGlvblJlc3VsdCA9IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPjtcbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG50eXBlIEVudmVsb3BlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBKU09OX0VOVkVMT1BFPltcInJlc3VsdFwiXTtcblxuZXhwb3J0IGNsYXNzIFRvb2xDYWxsRW11bGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGB0b29sLWNhbGwgZW11bGF0aW9uOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sQ2FsbEVtdWxhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8gZGlzcGF0Y2hlciDqsIAg64SY6riw64qUIOydtOuvuOyngCDqsrDqs7wuIHFncmlkIOuKlCBiYXNlNjQgcGF5bG9hZCDrp4wg7KCE64us7ZWY6rOgIO2PrOunt+ydgCDrs7TsnqXtlZjsp4Ag7JWK64qU64ukLlxuaW50ZXJmYWNlIEVtdWxhdGlvbkltYWdlIHtcbiAgZGF0YTogc3RyaW5nO1xuICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8gYW5zd2VyIOyduOy9lOuUqSDsooXrpZguIGVudmVsb3BlIOuUlOy9lOuNlOuKlCDtlZwg67KM7J206rOgIOydtCDqsJLsnYAgYW5zd2VyIOu4jOuenOy5mOydmCDtg4DsnoXqs7xcbi8vIOy1nOyihSDsp4HroKztmZQodGV4dDog6re464yA66GcIC8ganNvbjogSlNPTi5zdHJpbmdpZnkp66eMIOqwgOuluOuLpC5cbmV4cG9ydCB0eXBlIEFuc3dlcktpbmQgPSBcInRleHRcIiB8IFwianNvblwiO1xuXG5pbnRlcmZhY2UgVG9vbENhbGxFbXVsYXRpb25PcHRpb25zIHtcbiAgdGhyZWFkQ29vcmQ/OiBRZ3JpZFRocmVhZENvb3JkO1xuICBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdO1xuICAvLyDtlYTsiJg6IO2YuOy2nOu2gOqwgCBhbnN3ZXIg7J247L2U65Sp7J2EIO2VreyDgSDrqoXsi5ztlbTslbwg7ZWc64ukIChpbnB1dC5qc29uU2NoZW1hIOycoOustOuhnCDtjJDsoJUpLlxuICBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgcmVzdWx0OiBFbXVsYXRpb25SZXN1bHQsXG4gIHRvb2xzOiBRZ3JpZFRvb2xbXSB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogVG9vbENhbGxFbXVsYXRpb25PcHRpb25zLFxuKTogUXVlcnlPdXRwdXQge1xuICBjb25zdCB7IHRocmVhZENvb3JkLCBpbWFnZXMsIGFuc3dlcktpbmQgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJ1bkNvbnRleHQgPSB0aHJlYWRDb29yZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcblxuICBpZiAoIXRvb2xzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYW5zd2VyT3V0cHV0KHJlc3VsdCwgcmVzdWx0LnRleHQsIGltYWdlcywgcnVuQ29udGV4dCk7XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBwYXJzZUVudmVsb3BlKHJlc3VsdC50ZXh0LCB0b29scywgYW5zd2VyS2luZCk7XG4gIGlmIChwYXJzZWQuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgcmV0dXJuIHRvb2xDYWxsT3V0cHV0KHJlc3VsdCwgcGFyc2VkLnRvb2xDYWxscywgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBhbnN3ZXJPdXRwdXQoXG4gICAgcmVzdWx0LFxuICAgIGFuc3dlcktpbmQgPT09IFwidGV4dFwiID8gKHBhcnNlZC5hbnN3ZXIgYXMgc3RyaW5nKSA6IEpTT04uc3RyaW5naWZ5KHBhcnNlZC5hbnN3ZXIpLFxuICAgIGltYWdlcyxcbiAgICBydW5Db250ZXh0LFxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVudmVsb3BlKHRleHQ6IHN0cmluZywgdG9vbHM6IFFncmlkVG9vbFtdLCBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIGlmIChCdWZmZXIuYnl0ZUxlbmd0aCh0ZXh0LCBcInV0ZjhcIikgPiBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhVdGY4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGB0b29sIGVudmVsb3BlIGV4Y2VlZHMgVVRGLTggYnl0ZSBsaW1pdCBvZiAke1NUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heFV0ZjhCeXRlc31gLFxuICAgICk7XG4gIH1cblxuICBsZXQgdmFsdWU6IHVua25vd247XG4gIHRyeSB7XG4gICAgdmFsdWUgPSBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIOq0gOyaqSDtj7TrsLEg7JeG7J2MOiBlbnZlbG9wZSDripQg7JaRIHByb3ZpZGVyIOydmCBzdHJ1Y3R1cmVkIG91dHB1dCDsnLzroZwg6rCV7KCc65CY64qUIOuCtOu2gFxuICAgIC8vIOqzhOyVveydtOudvCDsl6zquLAg64+E64us7ZWcIOu5hCBKU09OIOydgCDrsoTqt7jri6QuIOqzvOqxsOydmCDthY3siqTtirgg6rWs7KCc64qUIO2HtO2ZlCDrtIntiKzrpbwg64u167OA7Jy866GcXG4gICAgLy8g7Z2Y66Ck67O064K0IOyhsOyaqe2VnCDsmKTsl7zsnYQg66eM65Ok7JeI64ukKDIwMjYtMDcgbWVkcGF0aCwgMTMuNWsg6rG0KS5cbiAgICBsb2dnZXIud2FybihgdG9vbCBlbnZlbG9wZSBwYXJzZSBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKGBpbnZhbGlkIHRvb2wgZW52ZWxvcGU6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG5cbiAgYXNzZXJ0U3RydWN0dXJlZEVudmVsb3BlQ29tcGxleGl0eSh2YWx1ZSk7XG4gIGNvbnN0IHNjaGVtYSA9IGFuc3dlcktpbmQgPT09IFwidGV4dFwiID8gVEVYVF9FTlZFTE9QRSA6IEpTT05fRU5WRUxPUEU7XG4gIGNvbnN0IHZhbGlkYXRpb24gPSBzY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcbiAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBpc3N1ZSA9IHZhbGlkYXRpb24uZXJyb3IuaXNzdWVzWzBdO1xuICAgIGNvbnN0IHBhdGggPSBpc3N1ZSAmJiBpc3N1ZS5wYXRoLmxlbmd0aCA+IDAgPyBgIGF0ICR7aXNzdWUucGF0aC5qb2luKFwiLlwiKX1gIDogXCJcIjtcbiAgICBjb25zdCBkZXRhaWwgPSBpc3N1ZT8ubWVzc2FnZSA/PyBcInVua25vd24gdmFsaWRhdGlvbiBpc3N1ZVwiO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHZhbGlkYXRpb24gZmFpbGVkJHtwYXRofTogJHtkZXRhaWx9YCk7XG4gICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoYGludmFsaWQgdG9vbCBlbnZlbG9wZSR7cGF0aH06ICR7ZGV0YWlsfWApO1xuICB9XG5cbiAgLy8gWm9kIGNsb25lcyBKU09OIG9iamVjdHMgYW5kIGRyb3BzIG93biBcIl9fcHJvdG9fX1wiIGtleXMuIFRoZSBwYXJzZWQgSlNPTiBpcyBzYWZlIHRvIHJldHVyblxuICAvLyBhZnRlciB2YWxpZGF0aW9uIGFuZCBwcmVzZXJ2ZXMgdGhlIGNhbGxlcidzIGV4YWN0IHN0cnVjdHVyZWQgdmFsdWUuXG4gIGNvbnN0IHJlc3BvbnNlID0gKHZhbHVlIGFzIHsgcmVzdWx0OiBFbnZlbG9wZVJlc3BvbnNlIH0pLnJlc3VsdDtcbiAgaWYgKHJlc3BvbnNlLmFjdGlvbiA9PT0gXCJ0b29sX2NhbGxcIikge1xuICAgIGNvbnN0IHVua25vd25Ub29sID0gZmluZFVua25vd25Ub29sKHJlc3BvbnNlLnRvb2xDYWxscywgdG9vbHMpO1xuICAgIGlmICh1bmtub3duVG9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihgdW5rbm93biBlbXVsYXRlZCB0b29sOiAke3Vua25vd25Ub29sfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIHRvb2xDYWxsT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbENhbGxzOiBUb29sQ2FsbFtdLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFxuICAgICAgdG9vbENhbGxzLm1hcCgodG9vbENhbGwpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgIHRvb2xDYWxsSWQ6IGBjYWxsXyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWAsXG4gICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xDYWxsLmFyZ3MsXG4gICAgICB9KSksXG4gICAgICBpbWFnZXMsXG4gICAgKSxcbiAgICBmaW5pc2hSZWFzb246IFwidG9vbC1jYWxsc1wiLFxuICAgIHJ1bkNvbnRleHQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFuc3dlck91dHB1dChcbiAgcmVzdWx0OiBFbXVsYXRpb25SZXN1bHQsXG4gIHRleHQ6IHN0cmluZyxcbiAgaW1hZ2VzOiBFbXVsYXRpb25JbWFnZVtdIHwgdW5kZWZpbmVkLFxuICBydW5Db250ZXh0OiBRdWVyeU91dHB1dFtcInJ1bkNvbnRleHRcIl0sXG4pOiBRdWVyeU91dHB1dCB7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdWx0LFxuICAgIHRleHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dLCBpbWFnZXMpLFxuICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZFVua25vd25Ub29sKHRvb2xDYWxsczogVG9vbENhbGxbXSwgdG9vbHM6IFFncmlkVG9vbFtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga25vd25Ub29sTmFtZXMgPSBuZXcgU2V0KHRvb2xzLm1hcCgodG9vbCkgPT4gdG9vbC5uYW1lKSk7XG4gIHJldHVybiB0b29sQ2FsbHMuZmluZCgodG9vbENhbGwpID0+ICFrbm93blRvb2xOYW1lcy5oYXModG9vbENhbGwudG9vbE5hbWUpKT8udG9vbE5hbWU7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEltYWdlcyhjb250ZW50OiBRZ3JpZENvbnRlbnRbXSwgaW1hZ2VzPzogRW11bGF0aW9uSW1hZ2VbXSk6IFFncmlkQ29udGVudFtdIHtcbiAgaWYgKCFpbWFnZXM/Lmxlbmd0aCkgcmV0dXJuIGNvbnRlbnQ7XG4gIHJldHVybiBbXG4gICAgLi4uY29udGVudCxcbiAgICAuLi5pbWFnZXMubWFwKFxuICAgICAgKGltYWdlKTogUWdyaWRDb250ZW50ID0+ICh7XG4gICAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgICAgZGF0YTogaW1hZ2UuZGF0YSxcbiAgICAgICAgcmV2aXNlZFByb21wdDogaW1hZ2UucmV2aXNlZFByb21wdCA/PyBudWxsLFxuICAgICAgfSksXG4gICAgKSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0U3RydWN0dXJlZEVudmVsb3BlQ29tcGxleGl0eShyb290OiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IG1heERlcHRoID0gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4RGVwdGg7XG4gIGNvbnN0IHN0YWNrID0gW3sgdmFsdWU6IHJvb3QsIGRlcHRoOiAwIH1dO1xuICBsZXQgbm9kZXMgPSAwO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHN0YWNrLnBvcCgpITtcbiAgICBub2RlcyArPSAxO1xuICAgIGlmIChub2RlcyA+IFNUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heE5vZGVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgICAgYHN0cnVjdHVyZWQtb3V0cHV0IGVudmVsb3BlIGV4Y2VlZHMgbm9kZSBsaW1pdCBvZiAke1NUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heE5vZGVzfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VycmVudC5kZXB0aCA+IG1heERlcHRoKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgICAgYHN0cnVjdHVyZWQtb3V0cHV0IGVudmVsb3BlIGV4Y2VlZHMgZGVwdGggbGltaXQgb2YgJHttYXhEZXB0aH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50LnZhbHVlID09PSBcIm51bWJlclwiICYmICFOdW1iZXIuaXNGaW5pdGUoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFwiYW5zd2VyIG11c3QgYmUgdmFsaWQgSlNPTlwiKTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQudmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQudmFsdWUgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGN1cnJlbnQudmFsdWUpKSB7XG4gICAgICBzdGFjay5wdXNoKHsgdmFsdWUsIGRlcHRoOiBjdXJyZW50LmRlcHRoICsgMSB9KTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQVFBLE1BQU0sNkJBQTZCO0NBQ2pDLGNBQWMsTUFBTTtDQUNwQixVQUFVO0NBQ1YsVUFBVTtBQUNaO0FBUUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixDQUFDO0FBUXBELFNBQVMsb0JBQW9CLFlBQXdCO0NBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQ3BCLFFBQVEsRUFBRSxtQkFBbUIsVUFBVSxDQUNyQyxFQUFFLGFBQWE7RUFDYixRQUFRLEVBQUUsUUFBUSxRQUFRO0VBQzFCLFFBQ0UsZUFBZSxTQUNYLEVBQUUsT0FBTyxJQUNULEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxXQUFXLFdBQVcsTUFBTSxFQUMzQyxTQUFTLDBCQUNYLENBQUM7RUFDUCxXQUFXLEVBQUUsS0FBSztDQUNwQixDQUFDLEdBQ0QsRUFBRSxhQUFhO0VBQ2IsUUFBUSxFQUFFLFFBQVEsV0FBVztFQUM3QixRQUFRLEVBQUUsS0FBSztFQUNmLFdBQVcsRUFDUixNQUNDLEVBQUUsYUFBYTtHQUNiLFVBQVUsRUFBRSxPQUFPO0dBQ25CLE1BQU0sRUFBRSxPQUFPO0VBQ2pCLENBQUMsQ0FDSCxDQUFDLENBQ0EsSUFBSSxDQUFDO0NBQ1YsQ0FBQyxDQUNILENBQUMsRUFDSCxDQUFDO0FBQ0g7QUFFQSxNQUFNLGdCQUFnQixvQkFBb0IsTUFB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
|
|
128
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8g7J2R64u1KOuqqOuNuCDstpzroKUpIGVudmVsb3BlIOydmCDsnpDsm5Ag7ZWc64+ELiBjYWxsZXIg7Iqk7YKk66eIIOyghOyymOumrCDtlZzrj4QoQ0FMTEVSX1NDSEVNQV9MSU1JVFMp7JmAIOqwkuydtFxuLy8g6rCZ7JWEIOuztOyXrOuPhCDshJzroZwg64uk66W4IOyekOybkOydhCDsp4DtgqTripQg64+F66a9IOyDgeyImOuLpCDigJQg7Iqk7YKk66eIIOq5iuydtOuKlCDsnbjsiqTthLTsiqQg6rmK7J2066W8IGJvdW5kIO2VmOyngFxuLy8g7JWK7Jy866+A66GcKOyerOq3gCAkcmVmIO2XiOyaqSkg7LqY65+sIO2VnOuPhOulvCDsobDsoJXtlbTrj4Qg7J2R64u1IOyImOyaqSDquLDspIDsnbQg65Sw6528IOybgOyngeyXrOyEoCDslYgg65Cc64ukLlxuY29uc3QgU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMgPSB7XG4gIG1heFV0ZjhCeXRlczogNTEyICogMTAyNCxcbiAgbWF4Tm9kZXM6IDIwXzAwMCxcbiAgbWF4RGVwdGg6IDEzMixcbn0gYXMgY29uc3Q7XG5pbXBvcnQge1xuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIEVtdWxhdGlvblJlc3VsdCA9IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPjtcbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG50eXBlIEVudmVsb3BlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBKU09OX0VOVkVMT1BFPltcInJlc3VsdFwiXTtcblxuZXhwb3J0IGNsYXNzIFRvb2xDYWxsRW11bGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGB0b29sLWNhbGwgZW11bGF0aW9uOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sQ2FsbEVtdWxhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8gZGlzcGF0Y2hlciDqsIAg64SY6riw64qUIOydtOuvuOyngCDqsrDqs7wuIHFncmlkIOuKlCBiYXNlNjQgcGF5bG9hZCDrp4wg7KCE64us7ZWY6rOgIO2PrOunt+ydgCDrs7TsnqXtlZjsp4Ag7JWK64qU64ukLlxuaW50ZXJmYWNlIEVtdWxhdGlvbkltYWdlIHtcbiAgZGF0YTogc3RyaW5nO1xuICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8gYW5zd2VyIOyduOy9lOuUqSDsooXrpZguIGVudmVsb3BlIOuUlOy9lOuNlOuKlCDtlZwg67KM7J206rOgIOydtCDqsJLsnYAgYW5zd2VyIOu4jOuenOy5mOydmCDtg4DsnoXqs7xcbi8vIOy1nOyihSDsp4HroKztmZQodGV4dDog6re464yA66GcIC8ganNvbjogSlNPTi5zdHJpbmdpZnkp66eMIOqwgOuluOuLpC5cbmV4cG9ydCB0eXBlIEFuc3dlcktpbmQgPSBcInRleHRcIiB8IFwianNvblwiO1xuXG5pbnRlcmZhY2UgVG9vbENhbGxFbXVsYXRpb25PcHRpb25zIHtcbiAgdGhyZWFkQ29vcmQ/OiBRZ3JpZFRocmVhZENvb3JkO1xuICBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdO1xuICAvLyDtlYTsiJg6IO2YuOy2nOu2gOqwgCBhbnN3ZXIg7J247L2U65Sp7J2EIO2VreyDgSDrqoXsi5ztlbTslbwg7ZWc64ukIChpbnB1dC5qc29uU2NoZW1hIOycoOustOuhnCDtjJDsoJUpLlxuICBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgcmVzdWx0OiBFbXVsYXRpb25SZXN1bHQsXG4gIHRvb2xzOiBRZ3JpZFRvb2xbXSB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogVG9vbENhbGxFbXVsYXRpb25PcHRpb25zLFxuKTogUXVlcnlPdXRwdXQge1xuICBjb25zdCB7IHRocmVhZENvb3JkLCBpbWFnZXMsIGFuc3dlcktpbmQgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJ1bkNvbnRleHQgPSB0aHJlYWRDb29yZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcblxuICBpZiAoIXRvb2xzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYW5zd2VyT3V0cHV0KHJlc3VsdCwgcmVzdWx0LnRleHQsIGltYWdlcywgcnVuQ29udGV4dCk7XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBwYXJzZUVudmVsb3BlKHJlc3VsdC50ZXh0LCB0b29scywgYW5zd2VyS2luZCk7XG4gIGlmIChwYXJzZWQuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgcmV0dXJuIHRvb2xDYWxsT3V0cHV0KHJlc3VsdCwgcGFyc2VkLnRvb2xDYWxscywgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBhbnN3ZXJPdXRwdXQoXG4gICAgcmVzdWx0LFxuICAgIGFuc3dlcktpbmQgPT09IFwidGV4dFwiID8gKHBhcnNlZC5hbnN3ZXIgYXMgc3RyaW5nKSA6IEpTT04uc3RyaW5naWZ5KHBhcnNlZC5hbnN3ZXIpLFxuICAgIGltYWdlcyxcbiAgICBydW5Db250ZXh0LFxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVudmVsb3BlKHRleHQ6IHN0cmluZywgdG9vbHM6IFFncmlkVG9vbFtdLCBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIGlmIChCdWZmZXIuYnl0ZUxlbmd0aCh0ZXh0LCBcInV0ZjhcIikgPiBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhVdGY4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGB0b29sIGVudmVsb3BlIGV4Y2VlZHMgVVRGLTggYnl0ZSBsaW1pdCBvZiAke1NUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heFV0ZjhCeXRlc31gLFxuICAgICk7XG4gIH1cblxuICBsZXQgdmFsdWU6IHVua25vd247XG4gIHRyeSB7XG4gICAgdmFsdWUgPSBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIOq0gOyaqSDtj7TrsLEg7JeG7J2MLiBvcGVuYWkg64qUIGVudmVsb3BlIOydtCBzdHJ1Y3R1cmVkIG91dHB1dCDsnLzroZwg6rCV7KCc65CY66+A66GcIOyXrOq4sCDrj4Tri6ztlZxcbiAgICAvLyDruYQgSlNPTiDsnYAg67KE6re464ukLiBhbnRocm9waWMg7J2AIOqzhOyVveydhCDtlITroaztlITtirjroZzrp4wg7JWI64K07ZWY66+A66GcKFNPTi01MzIpIOu5hCBKU09OIOydtFxuICAgIC8vIFwi7JiI7IOBIOqwgOuKpe2VnCDrqqjrjbgg7Iuk7YyoXCLsp4Drp4wsIOq3uOuemOuPhCDqtazsoJztlZjsp4Ag7JWK64qU64ukIOKAlCDqs7zqsbDsnZgg7YWN7Iqk7Yq4IOq1rOygnOuKlCDth7TtmZRcbiAgICAvLyDrtIntiKzrpbwg64u167OA7Jy866GcIO2dmOugpOuztOuCtCDsobDsmqntlZwg7Jik7Je87J2EIOunjOuTpOyXiOuLpCgyMDI2LTA3IG1lZHBhdGgsIDEzLjVrIOqxtCkuXG4gICAgLy8g7KCV7KeB7ZWcIOyLpO2MqOqwgCDrs7Tsl6zslbwg7IaM67mE7J6Q6rCAIOyerOyLnOuPhO2VmOqxsOuCmCDqt7zrs7gg7JuQ7J247J2EIOqzoOy5nOuLpC5cbiAgICAvLyDsp4Tri6jsl5DripQg7JyE67CYIOybkOusuOydmCDrqLjrpqzqsIAg7ZWE7JqU7ZWY64ukKFNPTi00OTUg7KCE66GAKSDigJQgcGFyc2Ug7JeQ65+sIOychOy5mOunjOycvOuhnOuKlFxuICAgIC8vIFwi7ZSE66Gc7KaI66GcIOuLte2WiOuKlOyngCAvIO2OnOyKpOqwgCDrgqjslZjripTsp4AgLyBKU09OIOydtCDsnpjroLjripTsp4BcIuulvCDqtazrtoTtlaAg7IiYIOyXhuuLpC5cbiAgICBjb25zdCBoZWFkID0gSlNPTi5zdHJpbmdpZnkodGV4dC5zbGljZSgwLCAyMDApKTtcbiAgICBsb2dnZXIud2FybihgdG9vbCBlbnZlbG9wZSBwYXJzZSBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfTsgaGVhZD0ke2hlYWR9YCk7XG4gICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXG4gICAgICBgaW52YWxpZCB0b29sIGVudmVsb3BlIChyZXNwb25zZSBpcyBub3QgSlNPTiDigJQgdGhlIG1vZGVsIGlnbm9yZWQgdGhlIGVudmVsb3BlIGNvbnRyYWN0OyByZXRyeSBpcyB0aGUgY2FsbGVyJ3MgZGVjaXNpb24pOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX07IHJlc3BvbnNlIGhlYWQ6ICR7aGVhZH1gLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnRTdHJ1Y3R1cmVkRW52ZWxvcGVDb21wbGV4aXR5KHZhbHVlKTtcbiAgY29uc3Qgc2NoZW1hID0gYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCIgPyBURVhUX0VOVkVMT1BFIDogSlNPTl9FTlZFTE9QRTtcbiAgY29uc3QgdmFsaWRhdGlvbiA9IHNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICBpZiAoIXZhbGlkYXRpb24uc3VjY2Vzcykge1xuICAgIGNvbnN0IGlzc3VlID0gdmFsaWRhdGlvbi5lcnJvci5pc3N1ZXNbMF07XG4gICAgY29uc3QgcGF0aCA9IGlzc3VlICYmIGlzc3VlLnBhdGgubGVuZ3RoID4gMCA/IGAgYXQgJHtpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpfWAgOiBcIlwiO1xuICAgIGNvbnN0IGRldGFpbCA9IGlzc3VlPy5tZXNzYWdlID8/IFwidW5rbm93biB2YWxpZGF0aW9uIGlzc3VlXCI7XG4gICAgLy8gdmFsaWQgSlNPTiDsnbTsp4Drp4wg6rOE7JW9IOychOuwmOyduCDqsr3smrDsl5Drj4Qg7JuQ66y4IOuouOumrOulvCDrgqjquLTri6Qg4oCUIHpvZCDqsr3roZzrp4zsnLzroZzripRcbiAgICAvLyBcIu2CpCDsg53rnrXsnbjsp4AgLyDrnpjtjbzroZwg6rCQ7IyM64qU7KeAIC8g7YOA7J6F7J20IO2LgOuguOuKlOyngFwi7J2YIOyLpOusvOydhCDrs7wg7IiYIOyXhuuLpC5cbiAgICBjb25zdCBoZWFkID0gSlNPTi5zdHJpbmdpZnkodGV4dC5zbGljZSgwLCAyMDApKTtcbiAgICBsb2dnZXIud2FybihgdG9vbCBlbnZlbG9wZSB2YWxpZGF0aW9uIGZhaWxlZCR7cGF0aH06ICR7ZGV0YWlsfTsgaGVhZD0ke2hlYWR9YCk7XG4gICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXG4gICAgICBgaW52YWxpZCB0b29sIGVudmVsb3BlJHtwYXRofTogJHtkZXRhaWx9OyByZXNwb25zZSBoZWFkOiAke2hlYWR9YCxcbiAgICApO1xuICB9XG5cbiAgLy8gWm9kIGNsb25lcyBKU09OIG9iamVjdHMgYW5kIGRyb3BzIG93biBcIl9fcHJvdG9fX1wiIGtleXMuIFRoZSBwYXJzZWQgSlNPTiBpcyBzYWZlIHRvIHJldHVyblxuICAvLyBhZnRlciB2YWxpZGF0aW9uIGFuZCBwcmVzZXJ2ZXMgdGhlIGNhbGxlcidzIGV4YWN0IHN0cnVjdHVyZWQgdmFsdWUuXG4gIGNvbnN0IHJlc3BvbnNlID0gKHZhbHVlIGFzIHsgcmVzdWx0OiBFbnZlbG9wZVJlc3BvbnNlIH0pLnJlc3VsdDtcbiAgaWYgKHJlc3BvbnNlLmFjdGlvbiA9PT0gXCJ0b29sX2NhbGxcIikge1xuICAgIGNvbnN0IHVua25vd25Ub29sID0gZmluZFVua25vd25Ub29sKHJlc3BvbnNlLnRvb2xDYWxscywgdG9vbHMpO1xuICAgIGlmICh1bmtub3duVG9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihgdW5rbm93biBlbXVsYXRlZCB0b29sOiAke3Vua25vd25Ub29sfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIHRvb2xDYWxsT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbENhbGxzOiBUb29sQ2FsbFtdLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFxuICAgICAgdG9vbENhbGxzLm1hcCgodG9vbENhbGwpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgIHRvb2xDYWxsSWQ6IGBjYWxsXyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWAsXG4gICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xDYWxsLmFyZ3MsXG4gICAgICB9KSksXG4gICAgICBpbWFnZXMsXG4gICAgKSxcbiAgICBmaW5pc2hSZWFzb246IFwidG9vbC1jYWxsc1wiLFxuICAgIHJ1bkNvbnRleHQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFuc3dlck91dHB1dChcbiAgcmVzdWx0OiBFbXVsYXRpb25SZXN1bHQsXG4gIHRleHQ6IHN0cmluZyxcbiAgaW1hZ2VzOiBFbXVsYXRpb25JbWFnZVtdIHwgdW5kZWZpbmVkLFxuICBydW5Db250ZXh0OiBRdWVyeU91dHB1dFtcInJ1bkNvbnRleHRcIl0sXG4pOiBRdWVyeU91dHB1dCB7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdWx0LFxuICAgIHRleHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dLCBpbWFnZXMpLFxuICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZFVua25vd25Ub29sKHRvb2xDYWxsczogVG9vbENhbGxbXSwgdG9vbHM6IFFncmlkVG9vbFtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga25vd25Ub29sTmFtZXMgPSBuZXcgU2V0KHRvb2xzLm1hcCgodG9vbCkgPT4gdG9vbC5uYW1lKSk7XG4gIHJldHVybiB0b29sQ2FsbHMuZmluZCgodG9vbENhbGwpID0+ICFrbm93blRvb2xOYW1lcy5oYXModG9vbENhbGwudG9vbE5hbWUpKT8udG9vbE5hbWU7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEltYWdlcyhjb250ZW50OiBRZ3JpZENvbnRlbnRbXSwgaW1hZ2VzPzogRW11bGF0aW9uSW1hZ2VbXSk6IFFncmlkQ29udGVudFtdIHtcbiAgaWYgKCFpbWFnZXM/Lmxlbmd0aCkgcmV0dXJuIGNvbnRlbnQ7XG4gIHJldHVybiBbXG4gICAgLi4uY29udGVudCxcbiAgICAuLi5pbWFnZXMubWFwKFxuICAgICAgKGltYWdlKTogUWdyaWRDb250ZW50ID0+ICh7XG4gICAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgICAgZGF0YTogaW1hZ2UuZGF0YSxcbiAgICAgICAgcmV2aXNlZFByb21wdDogaW1hZ2UucmV2aXNlZFByb21wdCA/PyBudWxsLFxuICAgICAgfSksXG4gICAgKSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0U3RydWN0dXJlZEVudmVsb3BlQ29tcGxleGl0eShyb290OiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IG1heERlcHRoID0gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4RGVwdGg7XG4gIGNvbnN0IHN0YWNrID0gW3sgdmFsdWU6IHJvb3QsIGRlcHRoOiAwIH1dO1xuICBsZXQgbm9kZXMgPSAwO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHN0YWNrLnBvcCgpITtcbiAgICBub2RlcyArPSAxO1xuICAgIGlmIChub2RlcyA+IFNUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heE5vZGVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgICAgYHN0cnVjdHVyZWQtb3V0cHV0IGVudmVsb3BlIGV4Y2VlZHMgbm9kZSBsaW1pdCBvZiAke1NUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heE5vZGVzfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VycmVudC5kZXB0aCA+IG1heERlcHRoKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgICAgYHN0cnVjdHVyZWQtb3V0cHV0IGVudmVsb3BlIGV4Y2VlZHMgZGVwdGggbGltaXQgb2YgJHttYXhEZXB0aH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50LnZhbHVlID09PSBcIm51bWJlclwiICYmICFOdW1iZXIuaXNGaW5pdGUoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFwiYW5zd2VyIG11c3QgYmUgdmFsaWQgSlNPTlwiKTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQudmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQudmFsdWUgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGN1cnJlbnQudmFsdWUpKSB7XG4gICAgICBzdGFjay5wdXNoKHsgdmFsdWUsIGRlcHRoOiBjdXJyZW50LmRlcHRoICsgMSB9KTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQVFBLE1BQU0sNkJBQTZCO0NBQ2pDLGNBQWMsTUFBTTtDQUNwQixVQUFVO0NBQ1YsVUFBVTtBQUNaO0FBUUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixDQUFDO0FBUXBELFNBQVMsb0JBQW9CLFlBQXdCO0NBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQ3BCLFFBQVEsRUFBRSxtQkFBbUIsVUFBVSxDQUNyQyxFQUFFLGFBQWE7RUFDYixRQUFRLEVBQUUsUUFBUSxRQUFRO0VBQzFCLFFBQ0UsZUFBZSxTQUNYLEVBQUUsT0FBTyxJQUNULEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxXQUFXLFdBQVcsTUFBTSxFQUMzQyxTQUFTLDBCQUNYLENBQUM7RUFDUCxXQUFXLEVBQUUsS0FBSztDQUNwQixDQUFDLEdBQ0QsRUFBRSxhQUFhO0VBQ2IsUUFBUSxFQUFFLFFBQVEsV0FBVztFQUM3QixRQUFRLEVBQUUsS0FBSztFQUNmLFdBQVcsRUFDUixNQUNDLEVBQUUsYUFBYTtHQUNiLFVBQVUsRUFBRSxPQUFPO0dBQ25CLE1BQU0sRUFBRSxP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
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { __commonJSMin } from "../../../../../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { require_codegen } from "./compile/codegen/index.js";
|
|
3
|
+
import { require_validate } from "./compile/validate/index.js";
|
|
4
|
+
import { require_validation_error } from "./runtime/validation_error.js";
|
|
5
|
+
import { require_ref_error } from "./compile/ref_error.js";
|
|
6
|
+
import { require_core } from "./core.js";
|
|
7
|
+
import { require_draft2020 } from "./vocabularies/draft2020.js";
|
|
8
|
+
import { require_discriminator } from "./vocabularies/discriminator/index.js";
|
|
9
|
+
import { require_json_schema_2020_12 } from "./refs/json-schema-2020-12/index.js";
|
|
10
|
+
//#region ../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/2020.js
|
|
11
|
+
var require__2020 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv2020 = void 0;
|
|
14
|
+
const core_1 = require_core();
|
|
15
|
+
const draft2020_1 = require_draft2020();
|
|
16
|
+
const discriminator_1 = require_discriminator();
|
|
17
|
+
const json_schema_2020_12_1 = require_json_schema_2020_12();
|
|
18
|
+
const META_SCHEMA_ID = "https://json-schema.org/draft/2020-12/schema";
|
|
19
|
+
var Ajv2020 = class extends core_1.default {
|
|
20
|
+
constructor(opts = {}) {
|
|
21
|
+
super({
|
|
22
|
+
...opts,
|
|
23
|
+
dynamicRef: true,
|
|
24
|
+
next: true,
|
|
25
|
+
unevaluated: true
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
_addVocabularies() {
|
|
29
|
+
super._addVocabularies();
|
|
30
|
+
draft2020_1.default.forEach((v) => this.addVocabulary(v));
|
|
31
|
+
if (this.opts.discriminator) this.addKeyword(discriminator_1.default);
|
|
32
|
+
}
|
|
33
|
+
_addDefaultMetaSchema() {
|
|
34
|
+
super._addDefaultMetaSchema();
|
|
35
|
+
const { $data, meta } = this.opts;
|
|
36
|
+
if (!meta) return;
|
|
37
|
+
json_schema_2020_12_1.default.call(this, $data);
|
|
38
|
+
this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID;
|
|
39
|
+
}
|
|
40
|
+
defaultMeta() {
|
|
41
|
+
return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
exports.Ajv2020 = Ajv2020;
|
|
45
|
+
module.exports = exports = Ajv2020;
|
|
46
|
+
module.exports.Ajv2020 = Ajv2020;
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.default = Ajv2020;
|
|
49
|
+
var validate_1 = require_validate();
|
|
50
|
+
Object.defineProperty(exports, "KeywordCxt", {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
get: function() {
|
|
53
|
+
return validate_1.KeywordCxt;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
var codegen_1 = require_codegen();
|
|
57
|
+
Object.defineProperty(exports, "_", {
|
|
58
|
+
enumerable: true,
|
|
59
|
+
get: function() {
|
|
60
|
+
return codegen_1._;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
Object.defineProperty(exports, "str", {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
get: function() {
|
|
66
|
+
return codegen_1.str;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
Object.defineProperty(exports, "stringify", {
|
|
70
|
+
enumerable: true,
|
|
71
|
+
get: function() {
|
|
72
|
+
return codegen_1.stringify;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
Object.defineProperty(exports, "nil", {
|
|
76
|
+
enumerable: true,
|
|
77
|
+
get: function() {
|
|
78
|
+
return codegen_1.nil;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
Object.defineProperty(exports, "Name", {
|
|
82
|
+
enumerable: true,
|
|
83
|
+
get: function() {
|
|
84
|
+
return codegen_1.Name;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
Object.defineProperty(exports, "CodeGen", {
|
|
88
|
+
enumerable: true,
|
|
89
|
+
get: function() {
|
|
90
|
+
return codegen_1.CodeGen;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
var validation_error_1 = require_validation_error();
|
|
94
|
+
Object.defineProperty(exports, "ValidationError", {
|
|
95
|
+
enumerable: true,
|
|
96
|
+
get: function() {
|
|
97
|
+
return validation_error_1.default;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
var ref_error_1 = require_ref_error();
|
|
101
|
+
Object.defineProperty(exports, "MissingRefError", {
|
|
102
|
+
enumerable: true,
|
|
103
|
+
get: function() {
|
|
104
|
+
return ref_error_1.default;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}));
|
|
108
|
+
//#endregion
|
|
109
|
+
export default require__2020();
|
|
110
|
+
export { require__2020 };
|
|
111
|
+
|
|
112
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyMC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vYWp2QDguMjAuMC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvMjAyMC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWlzc2luZ1JlZkVycm9yID0gZXhwb3J0cy5WYWxpZGF0aW9uRXJyb3IgPSBleHBvcnRzLkNvZGVHZW4gPSBleHBvcnRzLk5hbWUgPSBleHBvcnRzLm5pbCA9IGV4cG9ydHMuc3RyaW5naWZ5ID0gZXhwb3J0cy5zdHIgPSBleHBvcnRzLl8gPSBleHBvcnRzLktleXdvcmRDeHQgPSBleHBvcnRzLkFqdjIwMjAgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiLi9jb3JlXCIpO1xuY29uc3QgZHJhZnQyMDIwXzEgPSByZXF1aXJlKFwiLi92b2NhYnVsYXJpZXMvZHJhZnQyMDIwXCIpO1xuY29uc3QgZGlzY3JpbWluYXRvcl8xID0gcmVxdWlyZShcIi4vdm9jYWJ1bGFyaWVzL2Rpc2NyaW1pbmF0b3JcIik7XG5jb25zdCBqc29uX3NjaGVtYV8yMDIwXzEyXzEgPSByZXF1aXJlKFwiLi9yZWZzL2pzb24tc2NoZW1hLTIwMjAtMTJcIik7XG5jb25zdCBNRVRBX1NDSEVNQV9JRCA9IFwiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAyMC0xMi9zY2hlbWFcIjtcbmNsYXNzIEFqdjIwMjAgZXh0ZW5kcyBjb3JlXzEuZGVmYXVsdCB7XG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICBkeW5hbWljUmVmOiB0cnVlLFxuICAgICAgICAgICAgbmV4dDogdHJ1ZSxcbiAgICAgICAgICAgIHVuZXZhbHVhdGVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZFZvY2FidWxhcmllcygpIHtcbiAgICAgICAgc3VwZXIuX2FkZFZvY2FidWxhcmllcygpO1xuICAgICAgICBkcmFmdDIwMjBfMS5kZWZhdWx0LmZvckVhY2goKHYpID0+IHRoaXMuYWRkVm9jYWJ1bGFyeSh2KSk7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZGlzY3JpbWluYXRvcilcbiAgICAgICAgICAgIHRoaXMuYWRkS2V5d29yZChkaXNjcmltaW5hdG9yXzEuZGVmYXVsdCk7XG4gICAgfVxuICAgIF9hZGREZWZhdWx0TWV0YVNjaGVtYSgpIHtcbiAgICAgICAgc3VwZXIuX2FkZERlZmF1bHRNZXRhU2NoZW1hKCk7XG4gICAgICAgIGNvbnN0IHsgJGRhdGEsIG1ldGEgfSA9IHRoaXMub3B0cztcbiAgICAgICAgaWYgKCFtZXRhKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBqc29uX3NjaGVtYV8yMDIwXzEyXzEuZGVmYXVsdC5jYWxsKHRoaXMsICRkYXRhKTtcbiAgICAgICAgdGhpcy5yZWZzW1wiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWFcIl0gPSBNRVRBX1NDSEVNQV9JRDtcbiAgICB9XG4gICAgZGVmYXVsdE1ldGEoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5vcHRzLmRlZmF1bHRNZXRhID1cbiAgICAgICAgICAgIHN1cGVyLmRlZmF1bHRNZXRhKCkgfHwgKHRoaXMuZ2V0U2NoZW1hKE1FVEFfU0NIRU1BX0lEKSA/IE1FVEFfU0NIRU1BX0lEIDogdW5kZWZpbmVkKSk7XG4gICAgfVxufVxuZXhwb3J0cy5BanYyMDIwID0gQWp2MjAyMDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IEFqdjIwMjA7XG5tb2R1bGUuZXhwb3J0cy5BanYyMDIwID0gQWp2MjAyMDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IEFqdjIwMjA7XG52YXIgdmFsaWRhdGVfMSA9IHJlcXVpcmUoXCIuL2NvbXBpbGUvdmFsaWRhdGVcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJLZXl3b3JkQ3h0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWxpZGF0ZV8xLktleXdvcmRDeHQ7IH0gfSk7XG52YXIgY29kZWdlbl8xID0gcmVxdWlyZShcIi4vY29tcGlsZS9jb2RlZ2VuXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29kZWdlbl8xLl87IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdHJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvZGVnZW5fMS5zdHI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdHJpbmdpZnlcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvZGVnZW5fMS5zdHJpbmdpZnk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJuaWxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvZGVnZW5fMS5uaWw7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb2RlZ2VuXzEuTmFtZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvZGVHZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvZGVnZW5fMS5Db2RlR2VuOyB9IH0pO1xudmFyIHZhbGlkYXRpb25fZXJyb3JfMSA9IHJlcXVpcmUoXCIuL3J1bnRpbWUvdmFsaWRhdGlvbl9lcnJvclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlZhbGlkYXRpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsaWRhdGlvbl9lcnJvcl8xLmRlZmF1bHQ7IH0gfSk7XG52YXIgcmVmX2Vycm9yXzEgPSByZXF1aXJlKFwiLi9jb21waWxlL3JlZl9lcnJvclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1pc3NpbmdSZWZFcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVmX2Vycm9yXzEuZGVmYXVsdDsgfSB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPTIwMjAuanMubWFwIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0NBQ0EsT0FBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0NBQzVELFFBQVEsa0JBQWtCLFFBQVEsa0JBQWtCLFFBQVEsVUFBVSxRQUFRLE9BQU8sUUFBUSxNQUFNLFFBQVEsWUFBWSxRQUFRLE1BQU0sUUFBUSxJQUFJLFFBQVEsYUFBYSxRQUFRLFVBQVUsS0FBSztDQUM3TCxNQUFNLFNBQUEsYUFBQTtDQUNOLE1BQU0sY0FBQSxrQkFBQTtDQUNOLE1BQU0sa0JBQUEsc0JBQUE7Q0FDTixNQUFNLHdCQUFBLDRCQUFBO0NBQ04sTUFBTSxpQkFBaUI7Q0FDdkIsSUFBTSxVQUFOLGNBQXNCLE9BQU8sUUFBUTtFQUNqQyxZQUFZLE9BQU8sQ0FBQyxHQUFHO0dBQ25CLE1BQU07SUFDRixHQUFHO0lBQ0gsWUFBWTtJQUNaLE1BQU07SUFDTixhQUFhO0dBQ2pCLENBQUM7RUFDTDtFQUNBLG1CQUFtQjtHQUNmLE1BQU0saUJBQWlCO0dBQ3ZCLFlBQVksUUFBUSxTQUFTLE1BQU0sS0FBSyxjQUFjLENBQUMsQ0FBQztHQUN4RCxJQUFJLEtBQUssS0FBSyxlQUNWLEtBQUssV0FBVyxnQkFBZ0IsT0FBTztFQUMvQztFQUNBLHdCQUF3QjtHQUNwQixNQUFNLHNCQUFzQjtHQUM1QixNQUFNLEVBQUUsT0FBTyxTQUFTLEtBQUs7R0FDN0IsSUFBSSxDQUFDLE1BQ0Q7R0FDSixzQkFBc0IsUUFBUSxLQUFLLE1BQU0sS0FBSztHQUM5QyxLQUFLLEtBQUssbUNBQW1DO0VBQ2pEO0VBQ0EsY0FBYztHQUNWLE9BQVEsS0FBSyxLQUFLLGNBQ2QsTUFBTSxZQUFZLE1BQU0sS0FBSyxVQUFVLGNBQWMsSUFBSSxpQkFBaUI7RUFDbEY7Q0FDSjtDQUNBLFFBQVEsVUFBVTtDQUNsQixPQUFPLFVBQVUsVUFBVTtDQUMzQixPQUFPLFFBQVEsVUFBVTtDQUN6QixPQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7Q0FDNUQsUUFBUSxVQUFVO0NBQ2xCLElBQUksYUFBQSxpQkFBQTtDQUNKLE9BQU8sZUFBZSxTQUFTLGNBQWM7RUFBRSxZQUFZO0VBQU0sS0FBSyxXQUFZO0dBQUUsT0FBTyxXQUFXO0VBQVk7Q0FBRSxDQUFDO0NBQ3JILElBQUksWUFBQSxnQkFBQTtDQUNKLE9BQU8sZUFBZSxTQUFTLEtBQUs7RUFBRSxZQUFZO0VBQU0sS0FBSyxXQUFZO0dBQUUsT0FBTyxVQUFVO0VBQUc7Q0FBRSxDQUFDO0NBQ2xHLE9BQU8sZUFBZSxTQUFTLE9BQU87RUFBRSxZQUFZO0VBQU0sS0FBSyxXQUFZO0dBQUUsT0FBTyxVQUFVO0VBQUs7Q0FBRSxDQUFDO0NBQ3RHLE9BQU8sZUFBZSxTQUFTLGFBQWE7RUFBRSxZQUFZO0VBQU0sS0FBSyxXQUFZO0dBQUUsT0FBTyxVQUFVO0VBQVc7Q0FBRSxDQUFDO0NBQ2xILE9BQU8sZUFBZSxTQUFTLE9BQU87RUFBRSxZQUFZO0VBQU0sS0FBSyxXQUFZO0dBQUUsT0FBTyxVQUFVO0VBQUs7Q0FBRSxDQUFDO0NBQ3RHLE9BQU8sZUFBZSxTQUFTLFFBQVE7RUFBRSxZQUFZO0VBQU0sS0FBSyxXQUFZO0dBQUUsT0FBTyxVQUFVO0VBQU07Q0FBRSxDQUFDO0NBQ3hHLE9BQU8sZUFBZSxTQUFTLFdBQVc7RUFBRSxZQUFZO0VBQU0sS0FBSyxXQUFZO0dBQUUsT0FBTyxVQUFVO0VBQVM7Q0FBRSxDQUFDO0NBQzlHLElBQUkscUJBQUEseUJBQUE7Q0FDSixPQUFPLGVBQWUsU0FBUyxtQkFBbUI7RUFBRSxZQUFZO0VBQU0sS0FBSyxXQUFZO0dBQUUsT0FBTyxtQkFBbUI7RUFBUztDQUFFLENBQUM7Q0FDL0gsSUFBSSxjQUFBLGtCQUFBO0NBQ0osT0FBTyxlQUFlLFNBQVMsbUJBQW1CO0VBQUUsWUFBWTtFQUFNLEtBQUssV0FBWTtHQUFFLE9BQU8sWUFBWTtFQUFTO0NBQUUsQ0FBQyJ9
|