@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,83 @@
|
|
|
1
|
+
//#region src/utils/providers/anthropic/fence-strip.ts
|
|
2
|
+
/**
|
|
3
|
+
* 코드펜스 스트리핑 (SON-532).
|
|
4
|
+
*
|
|
5
|
+
* anthropic 은 스키마/envelope 계약을 프롬프트로 안내하므로 응답은 평범한 텍스트다.
|
|
6
|
+
* sonnet 계열이 지시에도 불구하고 ```json 펜스를 붙이는 실측이 있어, 서버가 펜스와
|
|
7
|
+
* 양끝 공백만 벗겨 소비자(zod)/parseEnvelope/EnvelopeStreamParser 에 순수 JSON 을
|
|
8
|
+
* 넘긴다. 머리말·후미 프로즈 구제는 하지 않는다 — 관용 복구는 2026-07 medpath 13.5k
|
|
9
|
+
* 오염 사고로 기각된 원칙이며, 프로즈 응답은 다음 층에서 정직하게 실패한다.
|
|
10
|
+
*
|
|
11
|
+
* `stripFences` 는 stream-json-adapter 의 stripCodeFence(비스트림 result 경로)에서
|
|
12
|
+
* 추출한 동일 시맨틱이다 — 스트림 델타 연결과 비스트림 최종 텍스트가 같은 결과여야
|
|
13
|
+
* 클라이언트가 어느 쪽을 조립해도 어긋나지 않는다.
|
|
14
|
+
*/
|
|
15
|
+
function stripFences(s) {
|
|
16
|
+
return s.trim().replace(/^```(?:json)?\s*\n?/i, "").replace(/\n?```\s*$/i, "");
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 델타 스트림용 통과 필터. 불변식: 임의 절단 지점에 대해
|
|
20
|
+
* `push(...) 들의 연결 + flush() == stripFences(전체 텍스트)`.
|
|
21
|
+
*
|
|
22
|
+
* tail 홀드백은 고정 크기가 아니라 계약 기반이다 — "공백·개행·백틱만으로 이루어진
|
|
23
|
+
* suffix"(닫는 펜스 후보)를 스트림 완료까지 보류하고, 후보를 깨는 내용이 오면 즉시
|
|
24
|
+
* 방출을 재개한다. 닫는 펜스 앞 공백은 임의 길이일 수 있어 고정 크기로는 "양끝 공백
|
|
25
|
+
* 제거" 불변식이 성립하지 않는다.
|
|
26
|
+
*/
|
|
27
|
+
function createFenceStripTransform() {
|
|
28
|
+
let full = "";
|
|
29
|
+
let bodyStart = -1;
|
|
30
|
+
let emitted = 0;
|
|
31
|
+
return {
|
|
32
|
+
push(delta) {
|
|
33
|
+
full += delta;
|
|
34
|
+
if (bodyStart < 0) {
|
|
35
|
+
bodyStart = resolveLeadingOffset(full);
|
|
36
|
+
if (bodyStart < 0) return "";
|
|
37
|
+
}
|
|
38
|
+
const unemitted = full.slice(bodyStart).slice(emitted);
|
|
39
|
+
const safe = unemitted.length - trailingHoldLength(unemitted);
|
|
40
|
+
if (safe <= 0) return "";
|
|
41
|
+
const out = unemitted.slice(0, safe);
|
|
42
|
+
emitted += safe;
|
|
43
|
+
return out;
|
|
44
|
+
},
|
|
45
|
+
flush() {
|
|
46
|
+
return stripFences(full).slice(emitted);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 여는 펜스 판정. 아직 "```json" 으로 자랄 수 있는 경계(백틱 1~2개, "```j(s(o))",
|
|
52
|
+
* 펜스 직후 공백만 도착)면 -1 로 보류한다. stripFences 의 leading 정규식과 동일한
|
|
53
|
+
* 소비 규칙: ```(json)? 뒤에 이어지는 공백 전부가 펜스에 붙어 떨어져 나간다.
|
|
54
|
+
*/
|
|
55
|
+
function resolveLeadingOffset(text) {
|
|
56
|
+
const trimmedStart = text.trimStart();
|
|
57
|
+
if (trimmedStart === "") return -1;
|
|
58
|
+
const ws = text.length - trimmedStart.length;
|
|
59
|
+
if (!trimmedStart.startsWith("`")) return ws;
|
|
60
|
+
if (/^`{1,2}$/.test(trimmedStart)) return -1;
|
|
61
|
+
const fence = /^```(?:json)?/i.exec(trimmedStart);
|
|
62
|
+
if (!fence) return ws;
|
|
63
|
+
if (/^```(?:j|js|jso)$/i.test(trimmedStart)) return -1;
|
|
64
|
+
const afterFence = trimmedStart.slice(fence[0].length);
|
|
65
|
+
const afterFenceBody = afterFence.trimStart();
|
|
66
|
+
if (afterFenceBody === "") return -1;
|
|
67
|
+
return ws + fence[0].length + (afterFence.length - afterFenceBody.length);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 아직 방출하면 안 되는 suffix 길이. 닫는 펜스 후보는 "(개행?)(백틱 1~3)(공백*)" 또는
|
|
71
|
+
* 순수 trailing 공백 — stripFences 의 trim + /\n?```\s*$/ 가 지울 수 있는 모든 형태를
|
|
72
|
+
* 덮는다. 공백 클래스는 반드시 `\s`(+BOM) — trim() 은 NBSP·VT·FF·U+2028·U+2029 까지
|
|
73
|
+
* 지우므로 ASCII 만 보류하면 그 문자들이 먼저 방출돼 "방출 == strip(전체)" 불변식이
|
|
74
|
+
* 깨진다(2차 검토 #8 실측). 미방출 구간에만 적용하므로 비용은 (보류분+delta)에 비례.
|
|
75
|
+
*/
|
|
76
|
+
function trailingHoldLength(unemitted) {
|
|
77
|
+
const match = /(?:\n?`{1,3})?[\s]*$/.exec(unemitted);
|
|
78
|
+
return match ? match[0].length : 0;
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { createFenceStripTransform, stripFences };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVuY2Utc3RyaXAuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvZmVuY2Utc3RyaXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDsvZTrk5ztjpzsiqQg7Iqk7Yq466as7ZWRIChTT04tNTMyKS5cbiAqXG4gKiBhbnRocm9waWMg7J2AIOyKpO2CpOuniC9lbnZlbG9wZSDqs4Tslb3snYQg7ZSE66Gs7ZSE7Yq466GcIOyViOuCtO2VmOuvgOuhnCDsnZHri7XsnYAg7Y+J67KU7ZWcIO2FjeyKpO2KuOuLpC5cbiAqIHNvbm5ldCDqs4Tsl7TsnbQg7KeA7Iuc7JeQ64+EIOu2iOq1rO2VmOqzoCBgYGBqc29uIO2OnOyKpOulvCDrtpnsnbTripQg7Iuk7Lih7J20IOyeiOyWtCwg7ISc67KE6rCAIO2OnOyKpOyZgFxuICog7JaR64GdIOqzteuwseunjCDrspfqsqgg7IaM67mE7J6QKHpvZCkvcGFyc2VFbnZlbG9wZS9FbnZlbG9wZVN0cmVhbVBhcnNlciDsl5Ag7Iic7IiYIEpTT04g7J2EXG4gKiDrhJjquLTri6QuIOuouOumrOunkMK37ZuE66+4IO2UhOuhnOymiCDqtazsoJzripQg7ZWY7KeAIOyViuuKlOuLpCDigJQg6rSA7JqpIOuzteq1rOuKlCAyMDI2LTA3IG1lZHBhdGggMTMuNWtcbiAqIOyYpOyXvCDsgqzqs6DroZwg6riw6rCB65CcIOybkOy5meydtOupsCwg7ZSE66Gc7KaIIOydkeuLteydgCDri6TsnYwg7Li17JeQ7IScIOygleynge2VmOqyjCDsi6TtjKjtlZzri6QuXG4gKlxuICogYHN0cmlwRmVuY2VzYCDripQgc3RyZWFtLWpzb24tYWRhcHRlciDsnZggc3RyaXBDb2RlRmVuY2Uo67mE7Iqk7Yq466a8IHJlc3VsdCDqsr3roZwp7JeQ7IScXG4gKiDstpTstpztlZwg64+Z7J28IOyLnOunqO2LseydtOuLpCDigJQg7Iqk7Yq466a8IOuNuO2DgCDsl7DqsrDqs7wg67mE7Iqk7Yq466a8IOy1nOyihSDthY3siqTtirjqsIAg6rCZ7J2AIOqysOqzvOyXrOyVvFxuICog7YG065287J207Ja47Yq46rCAIOyWtOuKkCDsqr3snYQg7KGw66a97ZW064+EIOyWtOq4i+uCmOyngCDslYrripTri6QuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwRmVuY2VzKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKC9eYGBgKD86anNvbik/XFxzKlxcbj8vaSwgXCJcIilcbiAgICAucmVwbGFjZSgvXFxuP2BgYFxccyokL2ksIFwiXCIpO1xufVxuXG5pbnRlcmZhY2UgRmVuY2VTdHJpcFRyYW5zZm9ybSB7XG4gIC8qKiBkZWx0YSDrpbwg64Sj6rOgIOyngOq4iCDrsKnstpztlbTrj4Qg7JWI7KCE7ZWcIOyhsOqwgeydhCDrj4zroKTrsJvripTri6QuICovXG4gIHB1c2goZGVsdGE6IHN0cmluZyk6IHN0cmluZztcbiAgLyoqIOyKpO2KuOumvCDsooXro4wuIOuztOulmOu2hCDspJEg7Y6c7Iqkwrd0cmFpbGluZyDqs7XrsLHsnbQg7JWE64uMIOyelOyXrOulvCDrj4zroKTspIDri6QuICovXG4gIGZsdXNoKCk6IHN0cmluZztcbn1cblxuLyoqXG4gKiDrjbjtg4Ag7Iqk7Yq466a87JqpIO2GteqzvCDtlYTthLAuIOu2iOuzgOyLnTog7J6E7J2YIOygiOuLqCDsp4DsoJDsl5Ag64yA7ZW0XG4gKiBgcHVzaCguLi4pIOuTpOydmCDsl7DqsrAgKyBmbHVzaCgpID09IHN0cmlwRmVuY2VzKOyghOyytCDthY3siqTtirgpYC5cbiAqXG4gKiB0YWlsIO2ZgOuTnOuwseydgCDqs6DsoJUg7YGs6riw6rCAIOyVhOuLiOudvCDqs4Tslb0g6riw67CY7J2064ukIOKAlCBcIuqzteuwscK36rCc7ZaJwrfrsLHti7Hrp4zsnLzroZwg7J2066Oo7Ja07KeEXG4gKiBzdWZmaXhcIijri6vripQg7Y6c7IqkIO2bhOuztCnrpbwg7Iqk7Yq466a8IOyZhOujjOq5jOyngCDrs7TrpZjtlZjqs6AsIO2bhOuztOulvCDquajripQg64K07Jqp7J20IOyYpOuptCDsponsi5xcbiAqIOuwqey2nOydhCDsnqzqsJztlZzri6QuIOuLq+uKlCDtjpzsiqQg7JWeIOqzteuwseydgCDsnoTsnZgg6ri47J207J28IOyImCDsnojslrQg6rOg7KCVIO2BrOq4sOuhnOuKlCBcIuyWkeuBnSDqs7XrsLFcbiAqIOygnOqxsFwiIOu2iOuzgOyLneydtCDshLHrpr3tlZjsp4Ag7JWK64qU64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmVuY2VTdHJpcFRyYW5zZm9ybSgpOiBGZW5jZVN0cmlwVHJhbnNmb3JtIHtcbiAgbGV0IGZ1bGwgPSBcIlwiO1xuICAvLyBmdWxsIOyXkOyEnCDrs7jrrLgobGVhZGluZyB0cmltICsg7Jes64qUIO2OnOyKpCDsnbTtm4Qp7J20IOyLnOyeke2VmOuKlCDsnbjrjbHsiqQuIC0xID0g7JWE7KeBIOuvuO2ZleyglS5cbiAgbGV0IGJvZHlTdGFydCA9IC0xO1xuICAvLyDrs7jrrLgg6riw7KSA7Jy866GcIOydtOuvuCDrsKnstpztlZwg66y47J6QIOyImC4g67Cp7Lac67aE7J2AIOy1nOyihSDqsrDqs7zsnZggcHJlZml4IOyehOydtCDrs7TsnqXrkJzri6Qg4oCUXG4gIC8vIOqzteuwseydgCDruYTqs7XrsLEg64K07Jqp7J20IOuSpOuUsOultOq4sCDsoITquYzsp4Ag7ZWt7IOBIOuztOulmOuQmOuvgOuhnCwg64KY7KSR7JeQIOuLq+uKlCDtjpzsiqTsnZgg7J2867aA66GcXG4gIC8vIO2MkOuqheuQoCDrrLjsnpDqsIAg66+466asIOuwqey2nOuQmOuKlCDsnbzsnbQg7JeG64ukLlxuICBsZXQgZW1pdHRlZCA9IDA7XG5cbiAgcmV0dXJuIHtcbiAgICBwdXNoKGRlbHRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgZnVsbCArPSBkZWx0YTtcbiAgICAgIGlmIChib2R5U3RhcnQgPCAwKSB7XG4gICAgICAgIGJvZHlTdGFydCA9IHJlc29sdmVMZWFkaW5nT2Zmc2V0KGZ1bGwpO1xuICAgICAgICBpZiAoYm9keVN0YXJ0IDwgMCkgcmV0dXJuIFwiXCI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBmdWxsLnNsaWNlKGJvZHlTdGFydCk7XG4gICAgICBjb25zdCB1bmVtaXR0ZWQgPSBib2R5LnNsaWNlKGVtaXR0ZWQpO1xuICAgICAgY29uc3Qgc2FmZSA9IHVuZW1pdHRlZC5sZW5ndGggLSB0cmFpbGluZ0hvbGRMZW5ndGgodW5lbWl0dGVkKTtcbiAgICAgIGlmIChzYWZlIDw9IDApIHJldHVybiBcIlwiO1xuXG4gICAgICBjb25zdCBvdXQgPSB1bmVtaXR0ZWQuc2xpY2UoMCwgc2FmZSk7XG4gICAgICBlbWl0dGVkICs9IHNhZmU7XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH0sXG5cbiAgICBmbHVzaCgpOiBzdHJpbmcge1xuICAgICAgLy8g67Cp7Lac67aE7J20IOy1nOyihSDqsrDqs7zsnZggcHJlZml4IOudvOuKlCDrtojrs4Dsi50g7JyE7JeQ7IScLCDsnpTsl6zrp4wg7J6Y6528IOuPjOugpOykgOuLpC5cbiAgICAgIHJldHVybiBzdHJpcEZlbmNlcyhmdWxsKS5zbGljZShlbWl0dGVkKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIOyXrOuKlCDtjpzsiqQg7YyQ7KCVLiDslYTsp4EgXCJgYGBqc29uXCIg7Jy866GcIOyekOuehCDsiJgg7J6I64qUIOqyveqzhCjrsLHti7EgMX4y6rCcLCBcImBgYGoocyhvKSlcIixcbiAqIO2OnOyKpCDsp4Htm4Qg6rO167Cx66eMIOuPhOywqSnrqbQgLTEg66GcIOuztOulmO2VnOuLpC4gc3RyaXBGZW5jZXMg7J2YIGxlYWRpbmcg7KCV6rec7Iud6rO8IOuPmeydvO2VnFxuICog7IaM67mEIOq3nOy5mTogYGBgKGpzb24pPyDrkqTsl5Ag7J207Ja07KeA64qUIOqzteuwsSDsoITrtoDqsIAg7Y6c7Iqk7JeQIOu2meyWtCDrlqjslrTsoLgg64KY6rCE64ukLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTGVhZGluZ09mZnNldCh0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCB0cmltbWVkU3RhcnQgPSB0ZXh0LnRyaW1TdGFydCgpO1xuICBpZiAodHJpbW1lZFN0YXJ0ID09PSBcIlwiKSByZXR1cm4gLTE7IC8vIOyVhOyngSDqs7XrsLHrv5Ag4oCUIGZsdXNoIOqwgCDsoJXrpqztlZzri6RcbiAgY29uc3Qgd3MgPSB0ZXh0Lmxlbmd0aCAtIHRyaW1tZWRTdGFydC5sZW5ndGg7XG5cbiAgaWYgKCF0cmltbWVkU3RhcnQuc3RhcnRzV2l0aChcImBcIikpIHJldHVybiB3cztcbiAgaWYgKC9eYHsxLDJ9JC8udGVzdCh0cmltbWVkU3RhcnQpKSByZXR1cm4gLTE7IC8vIFwiYGBgXCIg66GcIOyekOuehCDsiJgg7J6I7J2MXG5cbiAgY29uc3QgZmVuY2UgPSAvXmBgYCg/Ompzb24pPy9pLmV4ZWModHJpbW1lZFN0YXJ0KTtcbiAgaWYgKCFmZW5jZSkgcmV0dXJuIHdzOyAvLyBcImB4XCIsIFwiYGB4XCIg4oCUIO2OnOyKpOqwgCDslYTri4jrnbwg67O466y4XG4gIGlmICgvXmBgYCg/Omp8anN8anNvKSQvaS50ZXN0KHRyaW1tZWRTdGFydCkpIHJldHVybiAtMTsgLy8gXCJqc29uXCIg7YOc6re46rCAIOyekOudvOuKlCDspJFcblxuICBjb25zdCBhZnRlckZlbmNlID0gdHJpbW1lZFN0YXJ0LnNsaWNlKGZlbmNlWzBdLmxlbmd0aCk7XG4gIGNvbnN0IGFmdGVyRmVuY2VCb2R5ID0gYWZ0ZXJGZW5jZS50cmltU3RhcnQoKTtcbiAgaWYgKGFmdGVyRmVuY2VCb2R5ID09PSBcIlwiKSByZXR1cm4gLTE7IC8vIO2OnOyKpCDrkqQg6rO167Cx66eMIOKAlCDrs7jrrLgg7LKrIOq4gOyekCDrjIDquLBcbiAgcmV0dXJuIHdzICsgZmVuY2VbMF0ubGVuZ3RoICsgKGFmdGVyRmVuY2UubGVuZ3RoIC0gYWZ0ZXJGZW5jZUJvZHkubGVuZ3RoKTtcbn1cblxuLyoqXG4gKiDslYTsp4Eg67Cp7Lac7ZWY66m0IOyViCDrkJjripQgc3VmZml4IOq4uOydtC4g64ur64qUIO2OnOyKpCDtm4Trs7TripQgXCIo6rCc7ZaJPyko67Cx7YuxIDF+Myko6rO167CxKilcIiDrmJDripRcbiAqIOyInOyImCB0cmFpbGluZyDqs7XrsLEg4oCUIHN0cmlwRmVuY2VzIOydmCB0cmltICsgL1xcbj9gYGBcXHMqJC8g6rCAIOyngOyauCDsiJgg7J6I64qUIOuqqOuToCDtmJXtg5zrpbxcbiAqIOuNruuKlOuLpC4g6rO167CxIO2BtOuemOyKpOuKlCDrsJjrk5zsi5wgYFxcc2AoK0JPTSkg4oCUIHRyaW0oKSDsnYAgTkJTUMK3VlTCt0ZGwrdVKzIwMjjCt1UrMjAyOSDquYzsp4BcbiAqIOyngOyasOuvgOuhnCBBU0NJSSDrp4wg67O066WY7ZWY66m0IOq3uCDrrLjsnpDrk6TsnbQg66i87KCAIOuwqey2nOuPvCBcIuuwqey2nCA9PSBzdHJpcCjsoITssrQpXCIg67aI67OA7Iud7J20XG4gKiDquajsp4Tri6QoMuywqCDqsoDthqAgIzgg7Iuk7LihKS4g66+467Cp7LacIOq1rOqwhOyXkOunjCDsoIHsmqntlZjrr4DroZwg67mE7Jqp7J2AICjrs7TrpZjrtoQrZGVsdGEp7JeQIOu5hOuhgC5cbiAqL1xuZnVuY3Rpb24gdHJhaWxpbmdIb2xkTGVuZ3RoKHVuZW1pdHRlZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgbWF0Y2ggPSAvKD86XFxuP2B7MSwzfSk/W1xcc++7v10qJC8uZXhlYyh1bmVtaXR0ZWQpO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFswXS5sZW5ndGggOiAwO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQWNBLFNBQWdCLFlBQVksR0FBbUI7Q0FDN0MsT0FBTyxFQUNKLEtBQUssQ0FBQyxDQUNOLFFBQVEsd0JBQXdCLEVBQUUsQ0FBQyxDQUNuQyxRQUFRLGVBQWUsRUFBRTtBQUM5Qjs7Ozs7Ozs7OztBQWtCQSxTQUFnQiw0QkFBaUQ7Q0FDL0QsSUFBSSxPQUFPO0NBRVgsSUFBSSxZQUFZO0NBSWhCLElBQUksVUFBVTtDQUVkLE9BQU87RUFDTCxLQUFLLE9BQXVCO0dBQzFCLFFBQVE7R0FDUixJQUFJLFlBQVksR0FBRztJQUNqQixZQUFZLHFCQUFxQixJQUFJO0lBQ3JDLElBQUksWUFBWSxHQUFHLE9BQU87R0FDNUI7R0FHQSxNQUFNLFlBRE8sS0FBSyxNQUFNLFNBQ04sQ0FBQSxDQUFLLE1BQU0sT0FBTztHQUNwQyxNQUFNLE9BQU8sVUFBVSxTQUFTLG1CQUFtQixTQUFTO0dBQzVELElBQUksUUFBUSxHQUFHLE9BQU87R0FFdEIsTUFBTSxNQUFNLFVBQVUsTUFBTSxHQUFHLElBQUk7R0FDbkMsV0FBVztHQUNYLE9BQU87RUFDVDtFQUVBLFFBQWdCO0dBRWQsT0FBTyxZQUFZLElBQUksQ0FBQyxDQUFDLE1BQU0sT0FBTztFQUN4QztDQUNGO0FBQ0Y7Ozs7OztBQU9BLFNBQVMscUJBQXFCLE1BQXNCO0NBQ2xELE1BQU0sZUFBZSxLQUFLLFVBQVU7Q0FDcEMsSUFBSSxpQkFBaUIsSUFBSSxPQUFPO0NBQ2hDLE1BQU0sS0FBSyxLQUFLLFNBQVMsYUFBYTtDQUV0QyxJQUFJLENBQUMsYUFBYSxXQUFXLEdBQUcsR0FBRyxPQUFPO0NBQzFDLElBQUksV0FBVyxLQUFLLFlBQVksR0FBRyxPQUFPO0NBRTFDLE1BQU0sUUFBUSxpQkFBaUIsS0FBSyxZQUFZO0NBQ2hELElBQUksQ0FBQyxPQUFPLE9BQU87Q0FDbkIsSUFBSSxxQkFBcUIsS0FBSyxZQUFZLEdBQUcsT0FBTztDQUVwRCxNQUFNLGFBQWEsYUFBYSxNQUFNLE1BQU0sRUFBRSxDQUFDLE1BQU07Q0FDckQsTUFBTSxpQkFBaUIsV0FBVyxVQUFVO0NBQzVDLElBQUksbUJBQW1CLElBQUksT0FBTztDQUNsQyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUMsVUFBVSxXQUFXLFNBQVMsZUFBZTtBQUNwRTs7Ozs7Ozs7QUFTQSxTQUFTLG1CQUFtQixXQUEyQjtDQUNyRCxNQUFNLFFBQVEsd0JBQXdCLEtBQUssU0FBUztDQUNwRCxPQUFPLFFBQVEsTUFBTSxFQUFFLENBQUMsU0FBUztBQUNuQyJ9
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { stripFences } from "./fence-strip.js";
|
|
1
2
|
//#region src/utils/providers/anthropic/stream-json-adapter.ts
|
|
2
3
|
function userInputToText(input) {
|
|
3
4
|
return input.filter((i) => i.type === "text").map((i) => i.text).join("\n");
|
|
@@ -80,9 +81,6 @@ function toUsageBreakdown(u) {
|
|
|
80
81
|
reasoningOutputTokens: 0
|
|
81
82
|
};
|
|
82
83
|
}
|
|
83
|
-
function stripCodeFence(s) {
|
|
84
|
-
return s.trim().replace(/^```(?:json)?\s*\n?/i, "").replace(/\n?```\s*$/i, "");
|
|
85
|
-
}
|
|
86
84
|
function structuredOutputToolUseText(j) {
|
|
87
85
|
const content = asObject(j.message)?.content;
|
|
88
86
|
if (!Array.isArray(content)) return void 0;
|
|
@@ -222,7 +220,7 @@ function handleStreamJsonLine(line, onDelta, opts) {
|
|
|
222
220
|
if (structuredOutput && resultSucceeded && j.structured_output !== void 0) text = JSON.stringify(j.structured_output);
|
|
223
221
|
else if (preservedStructuredOutput !== void 0) text = preservedStructuredOutput;
|
|
224
222
|
else if (j.structured_output !== void 0) text = JSON.stringify(j.structured_output);
|
|
225
|
-
else text =
|
|
223
|
+
else text = stripFences(typeof j.result === "string" ? j.result : "");
|
|
226
224
|
const rawUsage = asObject(j.usage) ?? {};
|
|
227
225
|
updateRoutingFromUsage(rawUsage, state);
|
|
228
226
|
const resultModel = optionalString(j.model);
|
|
@@ -255,4 +253,4 @@ function handleStreamJsonLine(line, onDelta, opts) {
|
|
|
255
253
|
//#endregion
|
|
256
254
|
export { buildStreamJsonInput, handleStreamJsonLine, serializeStreamJsonInput };
|
|
257
255
|
|
|
258
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLWpzb24tYWRhcHRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9zdHJlYW0tanNvbi1hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhdWRlIENMSSBzdHJlYW0tanNvbiBhZGFwdGVyLlxuICpcbiAqIElucHV0OiBxZ3JpZCBoaXN0b3J5L2lucHV0IC0+IENsYXVkZSBKU09OTCBzdGRpbi5cbiAqIE91dHB1dDogQ2xhdWRlIEpTT05MIHN0ZG91dCAtPiBxZ3JpZCBkZWx0YXMgKyBmaW5hbCByZXN1bHQgbWV0YWRhdGEuXG4gKlxuICogUHJldmlvdXMgY29udmVyc2F0aW9uIGl0ZW1zIGFyZSBmbGF0dGVuZWQgaW50byBvbmUgYXNzaXN0YW50IGNvbnRleHQgbGluZS5cbiAqIFRoZSBvbmx5IGV4ZWN1dGFibGUgdXNlciBsaW5lIGlzIHRoZSBjdXJyZW50IGlucHV0LlxuICovXG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7XG4gIHR5cGUgTW9kZWxGYWxsYmFjayxcbiAgdHlwZSBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24sXG59IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuXG4vLyDilIDilIAg7J6F66ClIOyWtOuMke2EsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gQ2xhdWRlIHN0cmVhbS1qc29uIOyeheugpSDtlZwg7KSEKEpTT05MKS4gRW52ZWxvcGUgZmllbGRzIGFyZSBhZGRlZCBpbiBjbGF1ZGUtc2Vzc2lvbi5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhdWRlU3RyZWFtSnNvbkxpbmUge1xuICB0eXBlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCI7XG4gIG1lc3NhZ2U6IHtcbiAgICByb2xlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCI7XG4gICAgY29udGVudDogQXJyYXk8eyB0eXBlOiBcInRleHRcIjsgdGV4dDogc3RyaW5nIH0+O1xuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VySW5wdXRUb1RleHQoaW5wdXQ6IEFycmF5PFVzZXJJbnB1dD4pOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXRcbiAgICAuZmlsdGVyKChpKTogaSBpcyBFeHRyYWN0PFVzZXJJbnB1dCwgeyB0eXBlOiBcInRleHRcIiB9PiA9PiBpLnR5cGUgPT09IFwidGV4dFwiKVxuICAgIC5tYXAoKGkpID0+IGkudGV4dClcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gdGV4dEJsb2NrKHRleHQ6IHN0cmluZyk6IEFycmF5PHsgdHlwZTogXCJ0ZXh0XCI7IHRleHQ6IHN0cmluZyB9PiB7XG4gIHJldHVybiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9XTtcbn1cblxuLy8gY29kZXggUmVzcG9uc2VJdGVtKGNvbGRIaXN0b3J5IGl0ZW0pIOy1nOyGjCBzaGFwZS5cbi8vIGV4dHJhY3RQcm9tcHRBbmRIaXN0b3J5KGFpLXNkay91dGlscy50cykg6rCAIOunjOuTnOuKlCDtmJXsi506XG4vLyAgIHsgdHlwZTpcIm1lc3NhZ2VcIiwgcm9sZTpcInVzZXJcIiwgY29udGVudDpbe3R5cGU6XCJpbnB1dF90ZXh0XCIsIHRleHR9XSB9XG4vLyAgIHsgdHlwZTpcIm1lc3NhZ2VcIiwgcm9sZTpcImFzc2lzdGFudFwiLCBjb250ZW50Olt7dHlwZTpcIm91dHB1dF90ZXh0XCIsIHRleHR9XSB9XG4vLyAgIHsgdHlwZTpcImZ1bmN0aW9uX2NhbGxcIiwgbmFtZSwgYXJndW1lbnRzLCBjYWxsX2lkIH1cbi8vICAgeyB0eXBlOlwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIiwgY2FsbF9pZCwgb3V0cHV0IH1cbnR5cGUgUmVzcG9uc2VJdGVtID0geyBba2V5OiBzdHJpbmddOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgfTtcblxuZnVuY3Rpb24gYXNPYmplY3QodjogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogUmVzcG9uc2VJdGVtIHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpID8gKHYgYXMgUmVzcG9uc2VJdGVtKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlc3BvbnNlSXRlbVRleHQoaXRlbTogUmVzcG9uc2VJdGVtKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGVudCA9IGl0ZW0uY29udGVudDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAubWFwKChjKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSBhc09iamVjdChjKTtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iai50ZXh0ID09PSBcInN0cmluZ1wiID8gb2JqLnRleHQgOiBcIlwiO1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuQ29sZEhpc3RvcnkoY29sZEhpc3Rvcnk6IEFycmF5PEpzb25WYWx1ZT4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBmb3IgKGNvbnN0IHJhdyBvZiBjb2xkSGlzdG9yeSkge1xuICAgIGNvbnN0IGl0ZW0gPSBhc09iamVjdChyYXcpO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgIHBhcnRzLnB1c2goYEFzc2lzdGFudDogJHtyZXNwb25zZUl0ZW1UZXh0KGl0ZW0pfWApO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwidXNlclwiKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBVc2VyOiAke3Jlc3BvbnNlSXRlbVRleHQoaXRlbSl9YCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICBjb25zdCBuYW1lID0gdHlwZW9mIGl0ZW0ubmFtZSA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ubmFtZSA6IFwiXCI7XG4gICAgICBjb25zdCBhcmdzID1cbiAgICAgICAgdHlwZW9mIGl0ZW0uYXJndW1lbnRzID09PSBcInN0cmluZ1wiID8gaXRlbS5hcmd1bWVudHMgOiBKU09OLnN0cmluZ2lmeShpdGVtLmFyZ3VtZW50cyA/PyB7fSk7XG4gICAgICBwYXJ0cy5wdXNoKGBUb29sIGNhbGw6ICR7bmFtZX0oJHthcmdzfSlgKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICB0eXBlb2YgaXRlbS5vdXRwdXQgPT09IFwic3RyaW5nXCIgPyBpdGVtLm91dHB1dCA6IEpTT04uc3RyaW5naWZ5KGl0ZW0ub3V0cHV0ID8/IFwiXCIpO1xuICAgICAgcGFydHMucHVzaChgVG9vbCByZXN1bHQ6ICR7b3V0cHV0fWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlxcblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyZWFtSnNvbklucHV0KG9wdHM6IHtcbiAgY29sZEhpc3Rvcnk/OiBBcnJheTxKc29uVmFsdWU+O1xuICBpbnB1dDogQXJyYXk8VXNlcklucHV0Pjtcbn0pOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4ge1xuICBjb25zdCBsaW5lczogQXJyYXk8Q2xhdWRlU3RyZWFtSnNvbkxpbmU+ID0gW107XG5cbiAgaWYgKG9wdHMuY29sZEhpc3RvcnkgJiYgb3B0cy5jb2xkSGlzdG9yeS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbkNvbGRIaXN0b3J5KG9wdHMuY29sZEhpc3RvcnkpO1xuICAgIGlmIChmbGF0dGVuZWQpIHtcbiAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICBtZXNzYWdlOiB7XG4gICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICBjb250ZW50OiB0ZXh0QmxvY2soYFByaW9yIGNvbnZlcnNhdGlvbiBjb250ZXh0OlxcbiR7ZmxhdHRlbmVkfWApLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbGluZXMucHVzaCh7XG4gICAgdHlwZTogXCJ1c2VyXCIsXG4gICAgbWVzc2FnZTogeyByb2xlOiBcInVzZXJcIiwgY29udGVudDogdGV4dEJsb2NrKHVzZXJJbnB1dFRvVGV4dChvcHRzLmlucHV0KSkgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplU3RyZWFtSnNvbklucHV0KGxpbmVzOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4pOiBzdHJpbmcge1xuICByZXR1cm4gbGluZXMubWFwKChsKSA9PiBKU09OLnN0cmluZ2lmeShsKSkuam9pbihcIlxcblwiKSArIFwiXFxuXCI7XG59XG5cbi8vIOKUgOKUgCDstpzroKUg7Ja064yR7YSwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIENsYXVkZSBzdGRvdXQoSlNPTkwp7J2EIHFncmlkIGRlbHRhcyArIGZpbmFsIHJlc3VsdCDroZwg67OA7ZmY7ZWc64ukLlxuXG5pbnRlcmZhY2UgQ2xhdWRlVXNhZ2Uge1xuICBpbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIG91dHB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uPzoge1xuICAgIGVwaGVtZXJhbF81bV9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgZXBoZW1lcmFsXzFoX2lucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgfTtcbiAgaXRlcmF0aW9ucz86IEFycmF5PHtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIG1vZGVsPzogc3RyaW5nO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1SZXN1bHQge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHVzYWdlOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd247XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgY29zdFVzZDogbnVtYmVyO1xuICAvLyBxdW90YSDshozsp4QoXCJZb3UndmUgaGl0IC4uLlwiKSDqsJDsp4AuIGRpc3BhdGNoZXIg6rCAIFF1b3RhRXJyb3Ig66GcIOuzgO2ZmC5cbiAgcXVvdGFFeGhhdXN0ZWQ6IGJvb2xlYW47XG4gIC8vIHJlc3VsdC5pc19lcnJvciAvIHRlcm1pbmFsIG1vZGVsX2Vycm9yIOuTsS4gZGlzcGF0Y2hlciDqsIAg7JeQ65+s66GcIOuzgO2ZmC5cbiAgaXNFcnJvcjogYm9vbGVhbjtcbiAgLy8g7KeE64uo7JqpOiBDQyByZXN1bHQg65287J247J2YIHN1YnR5cGUoXCJzdWNjZXNzXCIgfCBcImVycm9yX21heF90dXJuc1wiIHwgLi4uKSDqs7wgdGVybWluYWxfcmVhc29uLlxuICAvLyBpc0Vycm9yIO2MkOyglSDsgqzsnKDrpbwg7JeQ65+sIOuplOyLnOyngOyXkCDrk5zrn6zrgrTquLAg7JyE7ZW0IOuztOyhtO2VnOuLpChTT04tNDk1KS5cbiAgc3VidHlwZT86IHN0cmluZztcbiAgdGVybWluYWxSZWFzb24/OiBzdHJpbmc7XG4gIC8vIOyLpOygnCDstZzsooUg7J2R64u17J2EIOunjOuToCDrqqjrjbguIEZhYmxlIHJlZnVzYWwgZmFsbGJhY2sg65WMIHJlcXVlc3RlZCBtb2RlbCDqs7wg64uk66W064ukLlxuICBzZXJ2ZWRNb2RlbD86IHN0cmluZztcbiAgc3RvcFJlYXNvbj86IHN0cmluZztcbiAgcmVmdXNhbD86IHtcbiAgICBjYXRlZ29yeT86IHN0cmluZztcbiAgICBleHBsYW5hdGlvbj86IHN0cmluZztcbiAgfTtcbiAgbW9kZWxGYWxsYmFja3M/OiBBcnJheTxNb2RlbEZhbGxiYWNrPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUge1xuICBzdHJ1Y3R1cmVkT3V0cHV0VGV4dD86IHN0cmluZztcbiAgc2VydmVkTW9kZWw/OiBzdHJpbmc7XG4gIHN0b3BSZWFzb24/OiBzdHJpbmc7XG4gIHJlZnVzYWw/OiB7XG4gICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgZXhwbGFuYXRpb24/OiBzdHJpbmc7XG4gIH07XG4gIG1vZGVsRmFsbGJhY2tzPzogQXJyYXk8TW9kZWxGYWxsYmFjaz47XG4gIHJlZnVzYWxXaXRob3V0RmFsbGJhY2s/OiBib29sZWFuO1xufVxuXG4vLyBBbnRocm9waWMgdXNhZ2UgNCDsubTthYzqs6Drpqwg4oaSIFRva2VuVXNhZ2VCcmVha2Rvd24uXG4vLyBBbnRocm9waWMgbmF0aXZlIHVzYWdlIOuKlCBpbnB1dC9jYWNoZV9jcmVhdGlvbi9jYWNoZV9yZWFkIOulvCDshJzroZwg67Cw7YOA7KCB7J24IOy5tO2FjOqzoOumrOuhnCDspIDri6QuXG4vLyDrsJjrqbQgcWdyaWQg64K067aAIO2RnOykgChUb2tlblVzYWdlQnJlYWtkb3duKeqzvCBjb3N0IOqzhOyCsOydgCBpbnB1dFRva2VucyDrpbwgXCLsoITssrQg7J6F66ClXG4vLyAoPSBub24tY2FjaGUgaW5wdXQgKyBjYWNoZSBjcmVhdGlvbiArIGNhY2hlIHJlYWQpXCIg7Jy866GcIOy3qOq4ie2VmOqzoCBjYWNoZWRJbnB1dFRva2Vucy9jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnNcbi8vIOulvCDqt7jspJEg6rCBIOuqq+ycvOuhnCDri6Tsi5wg7ZGc7Iuc7ZWc64ukKE9wZW5BSS9Db2RleCB1c2FnZSDsmYAg6rCZ7J2AIOydmOuvuCkuIOuUsOudvOyEnCDsl6zquLDshJwg7ZWp7LOQIO2RnOykgO2ZlO2VnOuLpC5cbmZ1bmN0aW9uIHRvVXNhZ2VCcmVha2Rvd24odTogQ2xhdWRlVXNhZ2UpOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24ge1xuICBjb25zdCBpbnB1dCA9IHUuaW5wdXRfdG9rZW5zID8/IDA7XG4gIGNvbnN0IGNhY2hlQ3JlYXRlID0gdS5jYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVSZWFkID0gdS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyA/PyAwO1xuICBjb25zdCBvdXRwdXQgPSB1Lm91dHB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgdG90YWxJbnB1dCA9IGlucHV0ICsgY2FjaGVDcmVhdGUgKyBjYWNoZVJlYWQ7XG4gIGNvbnN0IGNhY2hlQ3JlYXRlNW0gPSB1LmNhY2hlX2NyZWF0aW9uPy5lcGhlbWVyYWxfNW1faW5wdXRfdG9rZW5zO1xuICBjb25zdCBjYWNoZUNyZWF0ZTFoID0gdS5jYWNoZV9jcmVhdGlvbj8uZXBoZW1lcmFsXzFoX2lucHV0X3Rva2VucztcbiAgcmV0dXJuIHtcbiAgICB0b3RhbFRva2VuczogdG90YWxJbnB1dCArIG91dHB1dCxcbiAgICBpbnB1dFRva2VuczogdG90YWxJbnB1dCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogY2FjaGVSZWFkLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogY2FjaGVDcmVhdGUsXG4gICAgLi4uKHR5cGVvZiBjYWNoZUNyZWF0ZTVtID09PSBcIm51bWJlclwiID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogY2FjaGVDcmVhdGU1bSB9IDoge30pLFxuICAgIC4uLih0eXBlb2YgY2FjaGVDcmVhdGUxaCA9PT0gXCJudW1iZXJcIiA/IHsgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IGNhY2hlQ3JlYXRlMWggfSA6IHt9KSxcbiAgICBvdXRwdXRUb2tlbnM6IG91dHB1dCxcbiAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0cmlwQ29kZUZlbmNlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKC9eYGBgKD86anNvbik/XFxzKlxcbj8vaSwgXCJcIilcbiAgICAucmVwbGFjZSgvXFxuP2BgYFxccyokL2ksIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBzdHJ1Y3R1cmVkT3V0cHV0VG9vbFVzZVRleHQoajogUmVzcG9uc2VJdGVtKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWVzc2FnZSA9IGFzT2JqZWN0KGoubWVzc2FnZSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBtZXNzYWdlPy5jb250ZW50O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCByYXcgb2YgY29udGVudCkge1xuICAgIGNvbnN0IGJsb2NrID0gYXNPYmplY3QocmF3KTtcbiAgICBpZiAoIWJsb2NrKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICBibG9jay50eXBlID09PSBcInRvb2xfdXNlXCIgJiZcbiAgICAgIGJsb2NrLm5hbWUgPT09IFwiU3RydWN0dXJlZE91dHB1dFwiICYmXG4gICAgICBibG9jay5pbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmxvY2suaW5wdXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxFdmVudE1vZGVsKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB3aXRob3V0UHJvdmlkZXIgPSBtb2RlbC5zdGFydHNXaXRoKFwiYW50aHJvcGljL1wiKSA/IG1vZGVsLnNsaWNlKFwiYW50aHJvcGljL1wiLmxlbmd0aCkgOiBtb2RlbDtcbiAgcmV0dXJuIHdpdGhvdXRQcm92aWRlci5yZXBsYWNlKC9cXFsxbVxcXSQvLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uYWxTdHJpbmcodmFsdWU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWNvcmRGYWxsYmFjayhzdGF0ZTogQ2xhdWRlU3RyZWFtSnNvblN0YXRlIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogTW9kZWxGYWxsYmFjayk6IHZvaWQge1xuICBpZiAoIXN0YXRlKSByZXR1cm47XG4gIGNvbnN0IG5vcm1hbGl6ZWQ6IE1vZGVsRmFsbGJhY2sgPSB7XG4gICAgLi4uZmFsbGJhY2ssXG4gICAgZnJvbU1vZGVsOiBjYW5vbmljYWxFdmVudE1vZGVsKGZhbGxiYWNrLmZyb21Nb2RlbCksXG4gICAgdG9Nb2RlbDogY2Fub25pY2FsRXZlbnRNb2RlbChmYWxsYmFjay50b01vZGVsKSxcbiAgfTtcbiAgY29uc3QgZXhpc3RpbmcgPSBzdGF0ZS5tb2RlbEZhbGxiYWNrcz8uZmluZChcbiAgICAoaXRlbSkgPT5cbiAgICAgIGl0ZW0udHJpZ2dlciA9PT0gbm9ybWFsaXplZC50cmlnZ2VyICYmXG4gICAgICBpdGVtLmZyb21Nb2RlbCA9PT0gbm9ybWFsaXplZC5mcm9tTW9kZWwgJiZcbiAgICAgIGl0ZW0udG9Nb2RlbCA9PT0gbm9ybWFsaXplZC50b01vZGVsLFxuICApO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBleGlzdGluZy5jYXRlZ29yeSA/Pz0gbm9ybWFsaXplZC5jYXRlZ29yeTtcbiAgICBleGlzdGluZy5leHBsYW5hdGlvbiA/Pz0gbm9ybWFsaXplZC5leHBsYW5hdGlvbjtcbiAgfSBlbHNlIHtcbiAgICAoc3RhdGUubW9kZWxGYWxsYmFja3MgPz89IFtdKS5wdXNoKG5vcm1hbGl6ZWQpO1xuICB9XG4gIHN0YXRlLnNlcnZlZE1vZGVsID0gbm9ybWFsaXplZC50b01vZGVsO1xuICBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJvdXRpbmdGcm9tVXNhZ2UoXG4gIHVzYWdlOiBSZXNwb25zZUl0ZW0gfCBudWxsLFxuICBzdGF0ZTogQ2xhdWRlU3RyZWFtSnNvblN0YXRlIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmICghc3RhdGUgfHwgIXVzYWdlIHx8ICFBcnJheS5pc0FycmF5KHVzYWdlLml0ZXJhdGlvbnMpKSByZXR1cm47XG5cbiAgbGV0IHByZXZpb3VzTW9kZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCByYXcgb2YgdXNhZ2UuaXRlcmF0aW9ucykge1xuICAgIGNvbnN0IGl0ZXJhdGlvbiA9IGFzT2JqZWN0KHJhdyk7XG4gICAgaWYgKCFpdGVyYXRpb24pIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1vZGVsID0gb3B0aW9uYWxTdHJpbmcoaXRlcmF0aW9uLm1vZGVsKTtcbiAgICBjb25zdCB0eXBlID0gb3B0aW9uYWxTdHJpbmcoaXRlcmF0aW9uLnR5cGUpO1xuICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNhbm9uaWNhbE1vZGVsID0gY2Fub25pY2FsRXZlbnRNb2RlbChtb2RlbCk7XG4gICAgaWYgKHR5cGUgPT09IFwiZmFsbGJhY2tfbWVzc2FnZVwiICYmIHByZXZpb3VzTW9kZWwpIHtcbiAgICAgIHJlY29yZEZhbGxiYWNrKHN0YXRlLCB7XG4gICAgICAgIHRyaWdnZXI6IFwicmVmdXNhbFwiLFxuICAgICAgICBmcm9tTW9kZWw6IHByZXZpb3VzTW9kZWwsXG4gICAgICAgIHRvTW9kZWw6IGNhbm9uaWNhbE1vZGVsLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHByZXZpb3VzTW9kZWwgPSBjYW5vbmljYWxNb2RlbDtcbiAgICBzdGF0ZS5zZXJ2ZWRNb2RlbCA9IGNhbm9uaWNhbE1vZGVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJvdXRpbmdGcm9tTWVzc2FnZShcbiAgbWVzc2FnZTogUmVzcG9uc2VJdGVtIHwgbnVsbCxcbiAgc3RhdGU6IENsYXVkZVN0cmVhbUpzb25TdGF0ZSB8IHVuZGVmaW5lZCxcbik6IHZvaWQge1xuICBpZiAoIXN0YXRlIHx8ICFtZXNzYWdlKSByZXR1cm47XG4gIGNvbnN0IG1vZGVsID0gb3B0aW9uYWxTdHJpbmcobWVzc2FnZS5tb2RlbCk7XG4gIGNvbnN0IGNhbm9uaWNhbE1vZGVsID0gbW9kZWwgPyBjYW5vbmljYWxFdmVudE1vZGVsKG1vZGVsKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGNhbm9uaWNhbE1vZGVsKSBzdGF0ZS5zZXJ2ZWRNb2RlbCA9IGNhbm9uaWNhbE1vZGVsO1xuICBjb25zdCBzdG9wUmVhc29uID0gb3B0aW9uYWxTdHJpbmcobWVzc2FnZS5zdG9wX3JlYXNvbik7XG4gIGlmIChzdG9wUmVhc29uKSB7XG4gICAgc3RhdGUuc3RvcFJlYXNvbiA9IHN0b3BSZWFzb247XG4gICAgaWYgKHN0b3BSZWFzb24gPT09IFwicmVmdXNhbFwiKSBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gdHJ1ZTtcbiAgICBlbHNlIGlmIChzdGF0ZS5tb2RlbEZhbGxiYWNrcz8uc29tZSgoZmFsbGJhY2spID0+IGZhbGxiYWNrLnRvTW9kZWwgPT09IGNhbm9uaWNhbE1vZGVsKSkge1xuICAgICAgc3RhdGUucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0b3BEZXRhaWxzID0gYXNPYmplY3QobWVzc2FnZS5zdG9wX2RldGFpbHMpO1xuICBpZiAoc3RvcERldGFpbHM/LnR5cGUgPT09IFwicmVmdXNhbFwiIHx8IHN0b3BSZWFzb24gPT09IFwicmVmdXNhbFwiKSB7XG4gICAgc3RhdGUucmVmdXNhbCA9IHtcbiAgICAgIGNhdGVnb3J5OiBvcHRpb25hbFN0cmluZyhzdG9wRGV0YWlscz8uY2F0ZWdvcnkpLFxuICAgICAgZXhwbGFuYXRpb246IG9wdGlvbmFsU3RyaW5nKHN0b3BEZXRhaWxzPy5leHBsYW5hdGlvbiksXG4gICAgfTtcbiAgfVxuICB1cGRhdGVSb3V0aW5nRnJvbVVzYWdlKGFzT2JqZWN0KG1lc3NhZ2UudXNhZ2UpLCBzdGF0ZSk7XG59XG5cbi8vIFByb2Nlc3NlcyBvbmUgQ2xhdWRlIHN0ZG91dCBKU09OTCBsaW5lLiBSZXR1cm5zIGZpbmFsIHJlc3VsdCBvbiByZXN1bHQgZXZlbnQuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlU3RyZWFtSnNvbkxpbmUoXG4gIGxpbmU6IHN0cmluZyxcbiAgb25EZWx0YTogKHRleHQ6IHN0cmluZykgPT4gdm9pZCxcbiAgb3B0cz86IHsgc3RydWN0dXJlZE91dHB1dD86IGJvb2xlYW47IHN0YXRlPzogQ2xhdWRlU3RyZWFtSnNvblN0YXRlIH0sXG4pOiBDbGF1ZGVTdHJlYW1SZXN1bHQgfCBudWxsIHtcbiAgY29uc3Qgc3RydWN0dXJlZE91dHB1dCA9IG9wdHM/LnN0cnVjdHVyZWRPdXRwdXQgPz8gZmFsc2U7XG4gIGNvbnN0IHN0YXRlID0gb3B0cz8uc3RhdGU7XG4gIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gbnVsbDtcblxuICBsZXQgajogeyBba2V5OiBzdHJpbmddOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgfTtcbiAgdHJ5IHtcbiAgICBqID0gSlNPTi5wYXJzZSh0cmltbWVkKSBhcyB7IFtrZXk6IHN0cmluZ106IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChqLnR5cGUgPT09IFwic3RyZWFtX2V2ZW50XCIpIHtcbiAgICBjb25zdCBldmVudCA9IGFzT2JqZWN0KGouZXZlbnQpO1xuICAgIGlmIChldmVudD8udHlwZSA9PT0gXCJtZXNzYWdlX3N0YXJ0XCIpIHtcbiAgICAgIHVwZGF0ZVJvdXRpbmdGcm9tTWVzc2FnZShhc09iamVjdChldmVudC5tZXNzYWdlKSwgc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnR5cGUgPT09IFwibWVzc2FnZV9kZWx0YVwiKSB7XG4gICAgICBjb25zdCBkZWx0YSA9IGFzT2JqZWN0KGV2ZW50LmRlbHRhKTtcbiAgICAgIGNvbnN0IHN0b3BSZWFzb24gPSBvcHRpb25hbFN0cmluZyhkZWx0YT8uc3RvcF9yZWFzb24pO1xuICAgICAgaWYgKHN0YXRlICYmIHN0b3BSZWFzb24pIHtcbiAgICAgICAgc3RhdGUuc3RvcFJlYXNvbiA9IHN0b3BSZWFzb247XG4gICAgICAgIGlmIChzdG9wUmVhc29uID09PSBcInJlZnVzYWxcIikgc3RhdGUucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudCAmJiBldmVudC50eXBlID09PSBcImNvbnRlbnRfYmxvY2tfZGVsdGFcIikge1xuICAgICAgY29uc3QgZGVsdGEgPSBhc09iamVjdChldmVudC5kZWx0YSk7XG4gICAgICBpZiAoZGVsdGEpIHtcbiAgICAgICAgaWYgKHN0cnVjdHVyZWRPdXRwdXQpIHtcbiAgICAgICAgICBpZiAoZGVsdGEudHlwZSA9PT0gXCJpbnB1dF9qc29uX2RlbHRhXCIgJiYgdHlwZW9mIGRlbHRhLnBhcnRpYWxfanNvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgb25EZWx0YShkZWx0YS5wYXJ0aWFsX2pzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZGVsdGEudHlwZSA9PT0gXCJ0ZXh0X2RlbHRhXCIgJiYgdHlwZW9mIGRlbHRhLnRleHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIG9uRGVsdGEoZGVsdGEudGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGoudHlwZSA9PT0gXCJzeXN0ZW1cIikge1xuICAgIGNvbnN0IHN1YnR5cGUgPSBvcHRpb25hbFN0cmluZyhqLnN1YnR5cGUpO1xuICAgIGlmIChzdWJ0eXBlID09PSBcIm1vZGVsX3JlZnVzYWxfZmFsbGJhY2tcIikge1xuICAgICAgY29uc3QgZnJvbU1vZGVsID0gb3B0aW9uYWxTdHJpbmcoai5vcmlnaW5hbE1vZGVsKSA/PyBvcHRpb25hbFN0cmluZyhqLm9yaWdpbmFsX21vZGVsKTtcbiAgICAgIGNvbnN0IHRvTW9kZWwgPSBvcHRpb25hbFN0cmluZyhqLmZhbGxiYWNrTW9kZWwpID8/IG9wdGlvbmFsU3RyaW5nKGouZmFsbGJhY2tfbW9kZWwpO1xuICAgICAgaWYgKGZyb21Nb2RlbCAmJiB0b01vZGVsKSB7XG4gICAgICAgIHJlY29yZEZhbGxiYWNrKHN0YXRlLCB7XG4gICAgICAgICAgdHJpZ2dlcjogXCJyZWZ1c2FsXCIsXG4gICAgICAgICAgZnJvbU1vZGVsLFxuICAgICAgICAgIHRvTW9kZWwsXG4gICAgICAgICAgY2F0ZWdvcnk6XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpX3JlZnVzYWxfY2F0ZWdvcnkpID8/XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLnJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9jYXRlZ29yeSksXG4gICAgICAgICAgZXhwbGFuYXRpb246XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxFeHBsYW5hdGlvbikgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpX3JlZnVzYWxfZXhwbGFuYXRpb24pID8/XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLnJlZnVzYWxFeHBsYW5hdGlvbikgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9leHBsYW5hdGlvbiksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3VidHlwZSA9PT0gXCJtb2RlbF9yZWZ1c2FsX25vX2ZhbGxiYWNrXCIgJiYgc3RhdGUpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsTW9kZWwgPSBvcHRpb25hbFN0cmluZyhqLm9yaWdpbmFsTW9kZWwpID8/IG9wdGlvbmFsU3RyaW5nKGoub3JpZ2luYWxfbW9kZWwpO1xuICAgICAgaWYgKG9yaWdpbmFsTW9kZWwpIHN0YXRlLnNlcnZlZE1vZGVsID0gY2Fub25pY2FsRXZlbnRNb2RlbChvcmlnaW5hbE1vZGVsKTtcbiAgICAgIHN0YXRlLnN0b3BSZWFzb24gPSBcInJlZnVzYWxcIjtcbiAgICAgIHN0YXRlLnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPSB0cnVlO1xuICAgICAgc3RhdGUucmVmdXNhbCA9IHtcbiAgICAgICAgY2F0ZWdvcnk6XG4gICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5hcGlSZWZ1c2FsQ2F0ZWdvcnkpID8/XG4gICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5hcGlfcmVmdXNhbF9jYXRlZ29yeSkgPz9cbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLnJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLnJlZnVzYWxfY2F0ZWdvcnkpLFxuICAgICAgICBleHBsYW5hdGlvbjpcbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxFeHBsYW5hdGlvbikgPz9cbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaV9yZWZ1c2FsX2V4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbEV4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9leHBsYW5hdGlvbiksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChqLnR5cGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICB1cGRhdGVSb3V0aW5nRnJvbU1lc3NhZ2UoYXNPYmplY3Qoai5tZXNzYWdlKSwgc3RhdGUpO1xuICAgIGlmIChzdHJ1Y3R1cmVkT3V0cHV0ICYmIHN0YXRlICYmIHN0YXRlLnN0cnVjdHVyZWRPdXRwdXRUZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBzdHJ1Y3R1cmVkT3V0cHV0VG9vbFVzZVRleHQoaik7XG4gICAgICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkKSBzdGF0ZS5zdHJ1Y3R1cmVkT3V0cHV0VGV4dCA9IHRleHQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGoudHlwZSA9PT0gXCJyZXN1bHRcIikge1xuICAgIGNvbnN0IHN1YnR5cGUgPSB0eXBlb2Ygai5zdWJ0eXBlID09PSBcInN0cmluZ1wiID8gai5zdWJ0eXBlIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRlcm1pbmFsUmVhc29uID0gdHlwZW9mIGoudGVybWluYWxfcmVhc29uID09PSBcInN0cmluZ1wiID8gai50ZXJtaW5hbF9yZWFzb24gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzdWx0U3VjY2VlZGVkID1cbiAgICAgIGouaXNfZXJyb3IgIT09IHRydWUgJiZcbiAgICAgIHRlcm1pbmFsUmVhc29uICE9PSBcIm1vZGVsX2Vycm9yXCIgJiZcbiAgICAgIChzdWJ0eXBlID09PSB1bmRlZmluZWQgfHwgc3VidHlwZSA9PT0gXCJzdWNjZXNzXCIpO1xuICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgY29uc3QgcHJlc2VydmVkU3RydWN0dXJlZE91dHB1dCA9IHN0cnVjdHVyZWRPdXRwdXQgPyBzdGF0ZT8uc3RydWN0dXJlZE91dHB1dFRleHQgOiB1bmRlZmluZWQ7XG4gICAgLy8gQ2xhdWRlIENvZGXripQgU3RydWN0dXJlZE91dHB1dCDsiqTtgqTrp4gg6rKA7KadIOyLpO2MqCDtm4Qg64K067aAIOyerOyLnOuPhOulvCDtlaAg7IiYIOyeiOuLpC4gYXNzaXN0YW50XG4gICAgLy8g7J2067Kk7Yq47J2YIOyyqyB0b29sIGlucHV07J2AIOqxsOygiOuQnCDsi5zrj4Tsnbwg7IiYIOyeiOycvOuvgOuhnCwg7ISx6rO1IHJlc3VsdOqwgCDsoJzqs7XtlZwg7LWc7KKFIOqygOymneqwkuydhFxuICAgIC8vIOyasOyEoO2VnOuLpC4g7LKrIOyeheugpSDrs7TsobTqsJLsnYAgbWF4X3R1cm5zL3JldHJ5IOy0iOqzvOyymOufvCDshLHqs7UgcmVzdWx06rCAIOyXhuuKlCDsp4Tri6gg6rK966Gc7Jqp7J2064ukLlxuICAgIGlmIChzdHJ1Y3R1cmVkT3V0cHV0ICYmIHJlc3VsdFN1Y2NlZWRlZCAmJiBqLnN0cnVjdHVyZWRfb3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShqLnN0cnVjdHVyZWRfb3V0cHV0KTtcbiAgICB9IGVsc2UgaWYgKHByZXNlcnZlZFN0cnVjdHVyZWRPdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dCA9IHByZXNlcnZlZFN0cnVjdHVyZWRPdXRwdXQ7XG4gICAgfSBlbHNlIGlmIChqLnN0cnVjdHVyZWRfb3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShqLnN0cnVjdHVyZWRfb3V0cHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dCA9IHN0cmlwQ29kZUZlbmNlKHR5cGVvZiBqLnJlc3VsdCA9PT0gXCJzdHJpbmdcIiA/IGoucmVzdWx0IDogXCJcIik7XG4gICAgfVxuXG4gICAgY29uc3QgcmF3VXNhZ2UgPSBhc09iamVjdChqLnVzYWdlKSA/PyB7fTtcbiAgICB1cGRhdGVSb3V0aW5nRnJvbVVzYWdlKHJhd1VzYWdlLCBzdGF0ZSk7XG4gICAgY29uc3QgcmVzdWx0TW9kZWwgPSBvcHRpb25hbFN0cmluZyhqLm1vZGVsKTtcbiAgICBpZiAoc3RhdGUgJiYgcmVzdWx0TW9kZWwgJiYgIXN0YXRlLnNlcnZlZE1vZGVsKSB7XG4gICAgICBzdGF0ZS5zZXJ2ZWRNb2RlbCA9IGNhbm9uaWNhbEV2ZW50TW9kZWwocmVzdWx0TW9kZWwpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRTdG9wUmVhc29uID0gb3B0aW9uYWxTdHJpbmcoai5zdG9wX3JlYXNvbik7XG4gICAgaWYgKHN0YXRlICYmIHJlc3VsdFN0b3BSZWFzb24pIHtcbiAgICAgIHN0YXRlLnN0b3BSZWFzb24gPSByZXN1bHRTdG9wUmVhc29uO1xuICAgICAgaWYgKHJlc3VsdFN0b3BSZWFzb24gPT09IFwicmVmdXNhbFwiKSBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdXNhZ2UgPSB0b1VzYWdlQnJlYWtkb3duKHJhd1VzYWdlIGFzIENsYXVkZVVzYWdlKTtcbiAgICBjb25zdCBxdW90YUV4aGF1c3RlZCA9IHRleHQuc3RhcnRzV2l0aChcIllvdSd2ZSBoaXRcIik7XG5cbiAgICAvLyBTT04tNDk1OiDruYTsoJXsg4Eg7KKF66OMKGVycm9yX21heF9zdHJ1Y3R1cmVkX291dHB1dF9yZXRyaWVzIOuTsSnripQg7KCV7KeB7ZWY6rKMIOyXkOufrOuhnCDsspjrpqztlZzri6QuXG4gICAgLy8gQ0Mgc3RydWN0dXJlZCBvdXRwdXQg7J2AIGNvbnN0cmFpbmVkIGRlY29kaW5nIOydtCDslYTri4jrnbwgXCJ0b29sIGlucHV0IOyDneyEsSDtm4Qg7IKs7ZuEIEFKViDqsoDspp1cIuydtOudvFxuICAgIC8vIOuqqOuNuOydtCDqsIDrgZQgcGxhY2Vob2xkZXIoJFBBUkFNRVRFUl9OQU1FKcK36rGw67aAKFwianVzdCBraWRkaW5nXCIpwrftlYTrk5wg64iE6529KGFkdmFuY2UpIOqwmeydgCDrsJzsnpEvXG4gICAgLy8g67aI7JmE7KCEIOy2nOugpeydhCDrgrjri6QuIOydtOulvCBcIuqxsOydmCDrp57slZjsnLzri4gg7IK066as7J6QXCLqs6Ag7Z2Y66as66m0IO2BtOudvOydtOyWuO2KuCDqsoDspp3sl5DshJwg6rmo7KeA6rGw64KYKO2VhOuTnCDriITrnb0pXG4gICAgLy8g7JOw66CI6riw6rCAIOyDiOyWtCDrgpjqsITri6Qo7Iuk7LihIDExNjc0LzExNjc1KS4g7JWM66Ck7KeEIGJlc3QgcHJhY3RpY2UocmVmdXNhbC9kZWdlbmVyYXRlIG91dHB1dCDsnYAg7IK066as7KeAXG4gICAgLy8g66eQ6rOgIGdyYWNlZnVsIGVycm9yKeuMgOuhnCwgc3VidHlwZSAhPSBzdWNjZXNzIOuKlCDqt7jrjIDroZwg7JeQ65+s66GcIOuRlOuLpC4g7YG065287J207Ja47Yq46rCAIOq3uCDthLTsnYQg7Iuk7Yyo66GcXG4gICAgLy8g64uk66Oo6rKMIO2VnOuLpCjsiqTtirjrprzsnbTrnbwg7J6Q64+ZIOyerOyLnOuPhCDsl4bsnYwg4oCUIOyLnOqwhCAy67CwIOuwqeyngCkuXG4gICAgY29uc3QgaXNFcnJvciA9XG4gICAgICBqLmlzX2Vycm9yID09PSB0cnVlIHx8XG4gICAgICBqLnRlcm1pbmFsX3JlYXNvbiA9PT0gXCJtb2RlbF9lcnJvclwiIHx8XG4gICAgICAoc3VidHlwZSAhPT0gdW5kZWZpbmVkICYmIHN1YnR5cGUgIT09IFwic3VjY2Vzc1wiKSB8fFxuICAgICAgc3RhdGU/LnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPT09IHRydWU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGV4dCxcbiAgICAgIHVzYWdlLFxuICAgICAgZHVyYXRpb25NczogdHlwZW9mIGouZHVyYXRpb25fbXMgPT09IFwibnVtYmVyXCIgPyBqLmR1cmF0aW9uX21zIDogMCxcbiAgICAgIGNvc3RVc2Q6IHR5cGVvZiBqLnRvdGFsX2Nvc3RfdXNkID09PSBcIm51bWJlclwiID8gai50b3RhbF9jb3N0X3VzZCA6IDAsXG4gICAgICBxdW90YUV4aGF1c3RlZCxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBzdWJ0eXBlLFxuICAgICAgdGVybWluYWxSZWFzb24sXG4gICAgICBzZXJ2ZWRNb2RlbDogc3RhdGU/LnNlcnZlZE1vZGVsLFxuICAgICAgc3RvcFJlYXNvbjogc3RhdGU/LnN0b3BSZWFzb24sXG4gICAgICByZWZ1c2FsOiBzdGF0ZT8ucmVmdXNhbCxcbiAgICAgIG1vZGVsRmFsbGJhY2tzOiBzdGF0ZT8ubW9kZWxGYWxsYmFja3MsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBNEJBLFNBQVMsZ0JBQWdCLE9BQWlDO0NBQ3hELE9BQU8sTUFDSixRQUFRLE1BQWlELEVBQUUsU0FBUyxNQUFNLENBQUMsQ0FDM0UsS0FBSyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQ2xCLEtBQUssSUFBSTtBQUNkO0FBRUEsU0FBUyxVQUFVLE1BQXFEO0NBQ3RFLE9BQU8sQ0FBQztFQUFFLE1BQU07RUFBUTtDQUFLLENBQUM7QUFDaEM7QUFVQSxTQUFTLFNBQVMsR0FBK0M7Q0FDL0QsT0FBTyxPQUFPLE1BQU0sWUFBWSxNQUFNLFFBQVEsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFLLElBQXFCO0FBQzFGO0FBRUEsU0FBUyxpQkFBaUIsTUFBNEI7Q0FDcEQsTUFBTSxVQUFVLEtBQUs7Q0FDckIsSUFBSSxDQUFDLE1BQU0sUUFBUSxPQUFPLEdBQUcsT0FBTztDQUNwQyxPQUFPLFFBQ0osS0FBSyxNQUFNO0VB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
|
|
256
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLWpzb24tYWRhcHRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9zdHJlYW0tanNvbi1hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhdWRlIENMSSBzdHJlYW0tanNvbiBhZGFwdGVyLlxuICpcbiAqIElucHV0OiBxZ3JpZCBoaXN0b3J5L2lucHV0IC0+IENsYXVkZSBKU09OTCBzdGRpbi5cbiAqIE91dHB1dDogQ2xhdWRlIEpTT05MIHN0ZG91dCAtPiBxZ3JpZCBkZWx0YXMgKyBmaW5hbCByZXN1bHQgbWV0YWRhdGEuXG4gKlxuICogUHJldmlvdXMgY29udmVyc2F0aW9uIGl0ZW1zIGFyZSBmbGF0dGVuZWQgaW50byBvbmUgYXNzaXN0YW50IGNvbnRleHQgbGluZS5cbiAqIFRoZSBvbmx5IGV4ZWN1dGFibGUgdXNlciBsaW5lIGlzIHRoZSBjdXJyZW50IGlucHV0LlxuICovXG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7XG4gIHR5cGUgTW9kZWxGYWxsYmFjayxcbiAgdHlwZSBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24sXG59IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgc3RyaXBGZW5jZXMgfSBmcm9tIFwiLi9mZW5jZS1zdHJpcFwiO1xuXG4vLyDilIDilIAg7J6F66ClIOyWtOuMke2EsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gQ2xhdWRlIHN0cmVhbS1qc29uIOyeheugpSDtlZwg7KSEKEpTT05MKS4gRW52ZWxvcGUgZmllbGRzIGFyZSBhZGRlZCBpbiBjbGF1ZGUtc2Vzc2lvbi5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhdWRlU3RyZWFtSnNvbkxpbmUge1xuICB0eXBlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCI7XG4gIG1lc3NhZ2U6IHtcbiAgICByb2xlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCI7XG4gICAgY29udGVudDogQXJyYXk8eyB0eXBlOiBcInRleHRcIjsgdGV4dDogc3RyaW5nIH0+O1xuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VySW5wdXRUb1RleHQoaW5wdXQ6IEFycmF5PFVzZXJJbnB1dD4pOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXRcbiAgICAuZmlsdGVyKChpKTogaSBpcyBFeHRyYWN0PFVzZXJJbnB1dCwgeyB0eXBlOiBcInRleHRcIiB9PiA9PiBpLnR5cGUgPT09IFwidGV4dFwiKVxuICAgIC5tYXAoKGkpID0+IGkudGV4dClcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gdGV4dEJsb2NrKHRleHQ6IHN0cmluZyk6IEFycmF5PHsgdHlwZTogXCJ0ZXh0XCI7IHRleHQ6IHN0cmluZyB9PiB7XG4gIHJldHVybiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9XTtcbn1cblxuLy8gY29kZXggUmVzcG9uc2VJdGVtKGNvbGRIaXN0b3J5IGl0ZW0pIOy1nOyGjCBzaGFwZS5cbi8vIGV4dHJhY3RQcm9tcHRBbmRIaXN0b3J5KGFpLXNkay91dGlscy50cykg6rCAIOunjOuTnOuKlCDtmJXsi506XG4vLyAgIHsgdHlwZTpcIm1lc3NhZ2VcIiwgcm9sZTpcInVzZXJcIiwgY29udGVudDpbe3R5cGU6XCJpbnB1dF90ZXh0XCIsIHRleHR9XSB9XG4vLyAgIHsgdHlwZTpcIm1lc3NhZ2VcIiwgcm9sZTpcImFzc2lzdGFudFwiLCBjb250ZW50Olt7dHlwZTpcIm91dHB1dF90ZXh0XCIsIHRleHR9XSB9XG4vLyAgIHsgdHlwZTpcImZ1bmN0aW9uX2NhbGxcIiwgbmFtZSwgYXJndW1lbnRzLCBjYWxsX2lkIH1cbi8vICAgeyB0eXBlOlwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIiwgY2FsbF9pZCwgb3V0cHV0IH1cbnR5cGUgUmVzcG9uc2VJdGVtID0geyBba2V5OiBzdHJpbmddOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgfTtcblxuZnVuY3Rpb24gYXNPYmplY3QodjogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogUmVzcG9uc2VJdGVtIHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpID8gKHYgYXMgUmVzcG9uc2VJdGVtKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlc3BvbnNlSXRlbVRleHQoaXRlbTogUmVzcG9uc2VJdGVtKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGVudCA9IGl0ZW0uY29udGVudDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAubWFwKChjKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSBhc09iamVjdChjKTtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iai50ZXh0ID09PSBcInN0cmluZ1wiID8gb2JqLnRleHQgOiBcIlwiO1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuQ29sZEhpc3RvcnkoY29sZEhpc3Rvcnk6IEFycmF5PEpzb25WYWx1ZT4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBmb3IgKGNvbnN0IHJhdyBvZiBjb2xkSGlzdG9yeSkge1xuICAgIGNvbnN0IGl0ZW0gPSBhc09iamVjdChyYXcpO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgIHBhcnRzLnB1c2goYEFzc2lzdGFudDogJHtyZXNwb25zZUl0ZW1UZXh0KGl0ZW0pfWApO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwidXNlclwiKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBVc2VyOiAke3Jlc3BvbnNlSXRlbVRleHQoaXRlbSl9YCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICBjb25zdCBuYW1lID0gdHlwZW9mIGl0ZW0ubmFtZSA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ubmFtZSA6IFwiXCI7XG4gICAgICBjb25zdCBhcmdzID1cbiAgICAgICAgdHlwZW9mIGl0ZW0uYXJndW1lbnRzID09PSBcInN0cmluZ1wiID8gaXRlbS5hcmd1bWVudHMgOiBKU09OLnN0cmluZ2lmeShpdGVtLmFyZ3VtZW50cyA/PyB7fSk7XG4gICAgICBwYXJ0cy5wdXNoKGBUb29sIGNhbGw6ICR7bmFtZX0oJHthcmdzfSlgKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICB0eXBlb2YgaXRlbS5vdXRwdXQgPT09IFwic3RyaW5nXCIgPyBpdGVtLm91dHB1dCA6IEpTT04uc3RyaW5naWZ5KGl0ZW0ub3V0cHV0ID8/IFwiXCIpO1xuICAgICAgcGFydHMucHVzaChgVG9vbCByZXN1bHQ6ICR7b3V0cHV0fWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlxcblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyZWFtSnNvbklucHV0KG9wdHM6IHtcbiAgY29sZEhpc3Rvcnk/OiBBcnJheTxKc29uVmFsdWU+O1xuICBpbnB1dDogQXJyYXk8VXNlcklucHV0Pjtcbn0pOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4ge1xuICBjb25zdCBsaW5lczogQXJyYXk8Q2xhdWRlU3RyZWFtSnNvbkxpbmU+ID0gW107XG5cbiAgaWYgKG9wdHMuY29sZEhpc3RvcnkgJiYgb3B0cy5jb2xkSGlzdG9yeS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbkNvbGRIaXN0b3J5KG9wdHMuY29sZEhpc3RvcnkpO1xuICAgIGlmIChmbGF0dGVuZWQpIHtcbiAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICBtZXNzYWdlOiB7XG4gICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICBjb250ZW50OiB0ZXh0QmxvY2soYFByaW9yIGNvbnZlcnNhdGlvbiBjb250ZXh0OlxcbiR7ZmxhdHRlbmVkfWApLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbGluZXMucHVzaCh7XG4gICAgdHlwZTogXCJ1c2VyXCIsXG4gICAgbWVzc2FnZTogeyByb2xlOiBcInVzZXJcIiwgY29udGVudDogdGV4dEJsb2NrKHVzZXJJbnB1dFRvVGV4dChvcHRzLmlucHV0KSkgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplU3RyZWFtSnNvbklucHV0KGxpbmVzOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4pOiBzdHJpbmcge1xuICByZXR1cm4gbGluZXMubWFwKChsKSA9PiBKU09OLnN0cmluZ2lmeShsKSkuam9pbihcIlxcblwiKSArIFwiXFxuXCI7XG59XG5cbi8vIOKUgOKUgCDstpzroKUg7Ja064yR7YSwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIENsYXVkZSBzdGRvdXQoSlNPTkwp7J2EIHFncmlkIGRlbHRhcyArIGZpbmFsIHJlc3VsdCDroZwg67OA7ZmY7ZWc64ukLlxuXG5pbnRlcmZhY2UgQ2xhdWRlVXNhZ2Uge1xuICBpbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIG91dHB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uPzoge1xuICAgIGVwaGVtZXJhbF81bV9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgZXBoZW1lcmFsXzFoX2lucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgfTtcbiAgaXRlcmF0aW9ucz86IEFycmF5PHtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIG1vZGVsPzogc3RyaW5nO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1SZXN1bHQge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHVzYWdlOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd247XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgY29zdFVzZDogbnVtYmVyO1xuICAvLyBxdW90YSDshozsp4QoXCJZb3UndmUgaGl0IC4uLlwiKSDqsJDsp4AuIGRpc3BhdGNoZXIg6rCAIFF1b3RhRXJyb3Ig66GcIOuzgO2ZmC5cbiAgcXVvdGFFeGhhdXN0ZWQ6IGJvb2xlYW47XG4gIC8vIHJlc3VsdC5pc19lcnJvciAvIHRlcm1pbmFsIG1vZGVsX2Vycm9yIOuTsS4gZGlzcGF0Y2hlciDqsIAg7JeQ65+s66GcIOuzgO2ZmC5cbiAgaXNFcnJvcjogYm9vbGVhbjtcbiAgLy8g7KeE64uo7JqpOiBDQyByZXN1bHQg65287J247J2YIHN1YnR5cGUoXCJzdWNjZXNzXCIgfCBcImVycm9yX21heF90dXJuc1wiIHwgLi4uKSDqs7wgdGVybWluYWxfcmVhc29uLlxuICAvLyBpc0Vycm9yIO2MkOyglSDsgqzsnKDrpbwg7JeQ65+sIOuplOyLnOyngOyXkCDrk5zrn6zrgrTquLAg7JyE7ZW0IOuztOyhtO2VnOuLpChTT04tNDk1KS5cbiAgc3VidHlwZT86IHN0cmluZztcbiAgdGVybWluYWxSZWFzb24/OiBzdHJpbmc7XG4gIC8vIOyLpOygnCDstZzsooUg7J2R64u17J2EIOunjOuToCDrqqjrjbguIEZhYmxlIHJlZnVzYWwgZmFsbGJhY2sg65WMIHJlcXVlc3RlZCBtb2RlbCDqs7wg64uk66W064ukLlxuICBzZXJ2ZWRNb2RlbD86IHN0cmluZztcbiAgc3RvcFJlYXNvbj86IHN0cmluZztcbiAgcmVmdXNhbD86IHtcbiAgICBjYXRlZ29yeT86IHN0cmluZztcbiAgICBleHBsYW5hdGlvbj86IHN0cmluZztcbiAgfTtcbiAgbW9kZWxGYWxsYmFja3M/OiBBcnJheTxNb2RlbEZhbGxiYWNrPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUge1xuICBzdHJ1Y3R1cmVkT3V0cHV0VGV4dD86IHN0cmluZztcbiAgc2VydmVkTW9kZWw/OiBzdHJpbmc7XG4gIHN0b3BSZWFzb24/OiBzdHJpbmc7XG4gIHJlZnVzYWw/OiB7XG4gICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgZXhwbGFuYXRpb24/OiBzdHJpbmc7XG4gIH07XG4gIG1vZGVsRmFsbGJhY2tzPzogQXJyYXk8TW9kZWxGYWxsYmFjaz47XG4gIHJlZnVzYWxXaXRob3V0RmFsbGJhY2s/OiBib29sZWFuO1xufVxuXG4vLyBBbnRocm9waWMgdXNhZ2UgNCDsubTthYzqs6Drpqwg4oaSIFRva2VuVXNhZ2VCcmVha2Rvd24uXG4vLyBBbnRocm9waWMgbmF0aXZlIHVzYWdlIOuKlCBpbnB1dC9jYWNoZV9jcmVhdGlvbi9jYWNoZV9yZWFkIOulvCDshJzroZwg67Cw7YOA7KCB7J24IOy5tO2FjOqzoOumrOuhnCDspIDri6QuXG4vLyDrsJjrqbQgcWdyaWQg64K067aAIO2RnOykgChUb2tlblVzYWdlQnJlYWtkb3duKeqzvCBjb3N0IOqzhOyCsOydgCBpbnB1dFRva2VucyDrpbwgXCLsoITssrQg7J6F66ClXG4vLyAoPSBub24tY2FjaGUgaW5wdXQgKyBjYWNoZSBjcmVhdGlvbiArIGNhY2hlIHJlYWQpXCIg7Jy866GcIOy3qOq4ie2VmOqzoCBjYWNoZWRJbnB1dFRva2Vucy9jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnNcbi8vIOulvCDqt7jspJEg6rCBIOuqq+ycvOuhnCDri6Tsi5wg7ZGc7Iuc7ZWc64ukKE9wZW5BSS9Db2RleCB1c2FnZSDsmYAg6rCZ7J2AIOydmOuvuCkuIOuUsOudvOyEnCDsl6zquLDshJwg7ZWp7LOQIO2RnOykgO2ZlO2VnOuLpC5cbmZ1bmN0aW9uIHRvVXNhZ2VCcmVha2Rvd24odTogQ2xhdWRlVXNhZ2UpOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24ge1xuICBjb25zdCBpbnB1dCA9IHUuaW5wdXRfdG9rZW5zID8/IDA7XG4gIGNvbnN0IGNhY2hlQ3JlYXRlID0gdS5jYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVSZWFkID0gdS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyA/PyAwO1xuICBjb25zdCBvdXRwdXQgPSB1Lm91dHB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgdG90YWxJbnB1dCA9IGlucHV0ICsgY2FjaGVDcmVhdGUgKyBjYWNoZVJlYWQ7XG4gIGNvbnN0IGNhY2hlQ3JlYXRlNW0gPSB1LmNhY2hlX2NyZWF0aW9uPy5lcGhlbWVyYWxfNW1faW5wdXRfdG9rZW5zO1xuICBjb25zdCBjYWNoZUNyZWF0ZTFoID0gdS5jYWNoZV9jcmVhdGlvbj8uZXBoZW1lcmFsXzFoX2lucHV0X3Rva2VucztcbiAgcmV0dXJuIHtcbiAgICB0b3RhbFRva2VuczogdG90YWxJbnB1dCArIG91dHB1dCxcbiAgICBpbnB1dFRva2VuczogdG90YWxJbnB1dCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogY2FjaGVSZWFkLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogY2FjaGVDcmVhdGUsXG4gICAgLi4uKHR5cGVvZiBjYWNoZUNyZWF0ZTVtID09PSBcIm51bWJlclwiID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogY2FjaGVDcmVhdGU1bSB9IDoge30pLFxuICAgIC4uLih0eXBlb2YgY2FjaGVDcmVhdGUxaCA9PT0gXCJudW1iZXJcIiA/IHsgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IGNhY2hlQ3JlYXRlMWggfSA6IHt9KSxcbiAgICBvdXRwdXRUb2tlbnM6IG91dHB1dCxcbiAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0cnVjdHVyZWRPdXRwdXRUb29sVXNlVGV4dChqOiBSZXNwb25zZUl0ZW0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXNzYWdlID0gYXNPYmplY3Qoai5tZXNzYWdlKTtcbiAgY29uc3QgY29udGVudCA9IG1lc3NhZ2U/LmNvbnRlbnQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiBjb250ZW50KSB7XG4gICAgY29uc3QgYmxvY2sgPSBhc09iamVjdChyYXcpO1xuICAgIGlmICghYmxvY2spIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIGJsb2NrLnR5cGUgPT09IFwidG9vbF91c2VcIiAmJlxuICAgICAgYmxvY2submFtZSA9PT0gXCJTdHJ1Y3R1cmVkT3V0cHV0XCIgJiZcbiAgICAgIGJsb2NrLmlucHV0ICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShibG9jay5pbnB1dCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbEV2ZW50TW9kZWwobW9kZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdpdGhvdXRQcm92aWRlciA9IG1vZGVsLnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpID8gbW9kZWwuc2xpY2UoXCJhbnRocm9waWMvXCIubGVuZ3RoKSA6IG1vZGVsO1xuICByZXR1cm4gd2l0aG91dFByb3ZpZGVyLnJlcGxhY2UoL1xcWzFtXFxdJC8sIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25hbFN0cmluZyh2YWx1ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlY29yZEZhbGxiYWNrKHN0YXRlOiBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBNb2RlbEZhbGxiYWNrKTogdm9pZCB7XG4gIGlmICghc3RhdGUpIHJldHVybjtcbiAgY29uc3Qgbm9ybWFsaXplZDogTW9kZWxGYWxsYmFjayA9IHtcbiAgICAuLi5mYWxsYmFjayxcbiAgICBmcm9tTW9kZWw6IGNhbm9uaWNhbEV2ZW50TW9kZWwoZmFsbGJhY2suZnJvbU1vZGVsKSxcbiAgICB0b01vZGVsOiBjYW5vbmljYWxFdmVudE1vZGVsKGZhbGxiYWNrLnRvTW9kZWwpLFxuICB9O1xuICBjb25zdCBleGlzdGluZyA9IHN0YXRlLm1vZGVsRmFsbGJhY2tzPy5maW5kKFxuICAgIChpdGVtKSA9PlxuICAgICAgaXRlbS50cmlnZ2VyID09PSBub3JtYWxpemVkLnRyaWdnZXIgJiZcbiAgICAgIGl0ZW0uZnJvbU1vZGVsID09PSBub3JtYWxpemVkLmZyb21Nb2RlbCAmJlxuICAgICAgaXRlbS50b01vZGVsID09PSBub3JtYWxpemVkLnRvTW9kZWwsXG4gICk7XG4gIGlmIChleGlzdGluZykge1xuICAgIGV4aXN0aW5nLmNhdGVnb3J5ID8/PSBub3JtYWxpemVkLmNhdGVnb3J5O1xuICAgIGV4aXN0aW5nLmV4cGxhbmF0aW9uID8/PSBub3JtYWxpemVkLmV4cGxhbmF0aW9uO1xuICB9IGVsc2Uge1xuICAgIChzdGF0ZS5tb2RlbEZhbGxiYWNrcyA/Pz0gW10pLnB1c2gobm9ybWFsaXplZCk7XG4gIH1cbiAgc3RhdGUuc2VydmVkTW9kZWwgPSBub3JtYWxpemVkLnRvTW9kZWw7XG4gIHN0YXRlLnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUm91dGluZ0Zyb21Vc2FnZShcbiAgdXNhZ2U6IFJlc3BvbnNlSXRlbSB8IG51bGwsXG4gIHN0YXRlOiBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUgfCB1bmRlZmluZWQsXG4pOiB2b2lkIHtcbiAgaWYgKCFzdGF0ZSB8fCAhdXNhZ2UgfHwgIUFycmF5LmlzQXJyYXkodXNhZ2UuaXRlcmF0aW9ucykpIHJldHVybjtcblxuICBsZXQgcHJldmlvdXNNb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHJhdyBvZiB1c2FnZS5pdGVyYXRpb25zKSB7XG4gICAgY29uc3QgaXRlcmF0aW9uID0gYXNPYmplY3QocmF3KTtcbiAgICBpZiAoIWl0ZXJhdGlvbikgY29udGludWU7XG4gICAgY29uc3QgbW9kZWwgPSBvcHRpb25hbFN0cmluZyhpdGVyYXRpb24ubW9kZWwpO1xuICAgIGNvbnN0IHR5cGUgPSBvcHRpb25hbFN0cmluZyhpdGVyYXRpb24udHlwZSk7XG4gICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgY29uc3QgY2Fub25pY2FsTW9kZWwgPSBjYW5vbmljYWxFdmVudE1vZGVsKG1vZGVsKTtcbiAgICBpZiAodHlwZSA9PT0gXCJmYWxsYmFja19tZXNzYWdlXCIgJiYgcHJldmlvdXNNb2RlbCkge1xuICAgICAgcmVjb3JkRmFsbGJhY2soc3RhdGUsIHtcbiAgICAgICAgdHJpZ2dlcjogXCJyZWZ1c2FsXCIsXG4gICAgICAgIGZyb21Nb2RlbDogcHJldmlvdXNNb2RlbCxcbiAgICAgICAgdG9Nb2RlbDogY2Fub25pY2FsTW9kZWwsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcHJldmlvdXNNb2RlbCA9IGNhbm9uaWNhbE1vZGVsO1xuICAgIHN0YXRlLnNlcnZlZE1vZGVsID0gY2Fub25pY2FsTW9kZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUm91dGluZ0Zyb21NZXNzYWdlKFxuICBtZXNzYWdlOiBSZXNwb25zZUl0ZW0gfCBudWxsLFxuICBzdGF0ZTogQ2xhdWRlU3RyZWFtSnNvblN0YXRlIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmICghc3RhdGUgfHwgIW1lc3NhZ2UpIHJldHVybjtcbiAgY29uc3QgbW9kZWwgPSBvcHRpb25hbFN0cmluZyhtZXNzYWdlLm1vZGVsKTtcbiAgY29uc3QgY2Fub25pY2FsTW9kZWwgPSBtb2RlbCA/IGNhbm9uaWNhbEV2ZW50TW9kZWwobW9kZWwpIDogdW5kZWZpbmVkO1xuICBpZiAoY2Fub25pY2FsTW9kZWwpIHN0YXRlLnNlcnZlZE1vZGVsID0gY2Fub25pY2FsTW9kZWw7XG4gIGNvbnN0IHN0b3BSZWFzb24gPSBvcHRpb25hbFN0cmluZyhtZXNzYWdlLnN0b3BfcmVhc29uKTtcbiAgaWYgKHN0b3BSZWFzb24pIHtcbiAgICBzdGF0ZS5zdG9wUmVhc29uID0gc3RvcFJlYXNvbjtcbiAgICBpZiAoc3RvcFJlYXNvbiA9PT0gXCJyZWZ1c2FsXCIpIHN0YXRlLnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPSB0cnVlO1xuICAgIGVsc2UgaWYgKHN0YXRlLm1vZGVsRmFsbGJhY2tzPy5zb21lKChmYWxsYmFjaykgPT4gZmFsbGJhY2sudG9Nb2RlbCA9PT0gY2Fub25pY2FsTW9kZWwpKSB7XG4gICAgICBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RvcERldGFpbHMgPSBhc09iamVjdChtZXNzYWdlLnN0b3BfZGV0YWlscyk7XG4gIGlmIChzdG9wRGV0YWlscz8udHlwZSA9PT0gXCJyZWZ1c2FsXCIgfHwgc3RvcFJlYXNvbiA9PT0gXCJyZWZ1c2FsXCIpIHtcbiAgICBzdGF0ZS5yZWZ1c2FsID0ge1xuICAgICAgY2F0ZWdvcnk6IG9wdGlvbmFsU3RyaW5nKHN0b3BEZXRhaWxzPy5jYXRlZ29yeSksXG4gICAgICBleHBsYW5hdGlvbjogb3B0aW9uYWxTdHJpbmcoc3RvcERldGFpbHM/LmV4cGxhbmF0aW9uKSxcbiAgICB9O1xuICB9XG4gIHVwZGF0ZVJvdXRpbmdGcm9tVXNhZ2UoYXNPYmplY3QobWVzc2FnZS51c2FnZSksIHN0YXRlKTtcbn1cblxuLy8gUHJvY2Vzc2VzIG9uZSBDbGF1ZGUgc3Rkb3V0IEpTT05MIGxpbmUuIFJldHVybnMgZmluYWwgcmVzdWx0IG9uIHJlc3VsdCBldmVudC5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVTdHJlYW1Kc29uTGluZShcbiAgbGluZTogc3RyaW5nLFxuICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkLFxuICBvcHRzPzogeyBzdHJ1Y3R1cmVkT3V0cHV0PzogYm9vbGVhbjsgc3RhdGU/OiBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUgfSxcbik6IENsYXVkZVN0cmVhbVJlc3VsdCB8IG51bGwge1xuICBjb25zdCBzdHJ1Y3R1cmVkT3V0cHV0ID0gb3B0cz8uc3RydWN0dXJlZE91dHB1dCA/PyBmYWxzZTtcbiAgY29uc3Qgc3RhdGUgPSBvcHRzPy5zdGF0ZTtcbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiBudWxsO1xuXG4gIGxldCBqOiB7IFtrZXk6IHN0cmluZ106IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB9O1xuICB0cnkge1xuICAgIGogPSBKU09OLnBhcnNlKHRyaW1tZWQpIGFzIHsgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGoudHlwZSA9PT0gXCJzdHJlYW1fZXZlbnRcIikge1xuICAgIGNvbnN0IGV2ZW50ID0gYXNPYmplY3Qoai5ldmVudCk7XG4gICAgaWYgKGV2ZW50Py50eXBlID09PSBcIm1lc3NhZ2Vfc3RhcnRcIikge1xuICAgICAgdXBkYXRlUm91dGluZ0Zyb21NZXNzYWdlKGFzT2JqZWN0KGV2ZW50Lm1lc3NhZ2UpLCBzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudD8udHlwZSA9PT0gXCJtZXNzYWdlX2RlbHRhXCIpIHtcbiAgICAgIGNvbnN0IGRlbHRhID0gYXNPYmplY3QoZXZlbnQuZGVsdGEpO1xuICAgICAgY29uc3Qgc3RvcFJlYXNvbiA9IG9wdGlvbmFsU3RyaW5nKGRlbHRhPy5zdG9wX3JlYXNvbik7XG4gICAgICBpZiAoc3RhdGUgJiYgc3RvcFJlYXNvbikge1xuICAgICAgICBzdGF0ZS5zdG9wUmVhc29uID0gc3RvcFJlYXNvbjtcbiAgICAgICAgaWYgKHN0b3BSZWFzb24gPT09IFwicmVmdXNhbFwiKSBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnR5cGUgPT09IFwiY29udGVudF9ibG9ja19kZWx0YVwiKSB7XG4gICAgICBjb25zdCBkZWx0YSA9IGFzT2JqZWN0KGV2ZW50LmRlbHRhKTtcbiAgICAgIGlmIChkZWx0YSkge1xuICAgICAgICBpZiAoc3RydWN0dXJlZE91dHB1dCkge1xuICAgICAgICAgIGlmIChkZWx0YS50eXBlID09PSBcImlucHV0X2pzb25fZGVsdGFcIiAmJiB0eXBlb2YgZGVsdGEucGFydGlhbF9qc29uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBvbkRlbHRhKGRlbHRhLnBhcnRpYWxfanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChkZWx0YS50eXBlID09PSBcInRleHRfZGVsdGFcIiAmJiB0eXBlb2YgZGVsdGEudGV4dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgb25EZWx0YShkZWx0YS50ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoai50eXBlID09PSBcInN5c3RlbVwiKSB7XG4gICAgY29uc3Qgc3VidHlwZSA9IG9wdGlvbmFsU3RyaW5nKGouc3VidHlwZSk7XG4gICAgaWYgKHN1YnR5cGUgPT09IFwibW9kZWxfcmVmdXNhbF9mYWxsYmFja1wiKSB7XG4gICAgICBjb25zdCBmcm9tTW9kZWwgPSBvcHRpb25hbFN0cmluZyhqLm9yaWdpbmFsTW9kZWwpID8/IG9wdGlvbmFsU3RyaW5nKGoub3JpZ2luYWxfbW9kZWwpO1xuICAgICAgY29uc3QgdG9Nb2RlbCA9IG9wdGlvbmFsU3RyaW5nKGouZmFsbGJhY2tNb2RlbCkgPz8gb3B0aW9uYWxTdHJpbmcoai5mYWxsYmFja19tb2RlbCk7XG4gICAgICBpZiAoZnJvbU1vZGVsICYmIHRvTW9kZWwpIHtcbiAgICAgICAgcmVjb3JkRmFsbGJhY2soc3RhdGUsIHtcbiAgICAgICAgICB0cmlnZ2VyOiBcInJlZnVzYWxcIixcbiAgICAgICAgICBmcm9tTW9kZWwsXG4gICAgICAgICAgdG9Nb2RlbCxcbiAgICAgICAgICBjYXRlZ29yeTpcbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpUmVmdXNhbENhdGVnb3J5KSA/P1xuICAgICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5hcGlfcmVmdXNhbF9jYXRlZ29yeSkgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbENhdGVnb3J5KSA/P1xuICAgICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5yZWZ1c2FsX2NhdGVnb3J5KSxcbiAgICAgICAgICBleHBsYW5hdGlvbjpcbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpUmVmdXNhbEV4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5hcGlfcmVmdXNhbF9leHBsYW5hdGlvbikgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbEV4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5yZWZ1c2FsX2V4cGxhbmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdWJ0eXBlID09PSBcIm1vZGVsX3JlZnVzYWxfbm9fZmFsbGJhY2tcIiAmJiBzdGF0ZSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxNb2RlbCA9IG9wdGlvbmFsU3RyaW5nKGoub3JpZ2luYWxNb2RlbCkgPz8gb3B0aW9uYWxTdHJpbmcoai5vcmlnaW5hbF9tb2RlbCk7XG4gICAgICBpZiAob3JpZ2luYWxNb2RlbCkgc3RhdGUuc2VydmVkTW9kZWwgPSBjYW5vbmljYWxFdmVudE1vZGVsKG9yaWdpbmFsTW9kZWwpO1xuICAgICAgc3RhdGUuc3RvcFJlYXNvbiA9IFwicmVmdXNhbFwiO1xuICAgICAgc3RhdGUucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWZ1c2FsID0ge1xuICAgICAgICBjYXRlZ29yeTpcbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaV9yZWZ1c2FsX2NhdGVnb3J5KSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbENhdGVnb3J5KSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9jYXRlZ29yeSksXG4gICAgICAgIGV4cGxhbmF0aW9uOlxuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpUmVmdXNhbEV4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpX3JlZnVzYWxfZXhwbGFuYXRpb24pID8/XG4gICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5yZWZ1c2FsRXhwbGFuYXRpb24pID8/XG4gICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5yZWZ1c2FsX2V4cGxhbmF0aW9uKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGoudHlwZSA9PT0gXCJhc3Npc3RhbnRcIikge1xuICAgIHVwZGF0ZVJvdXRpbmdGcm9tTWVzc2FnZShhc09iamVjdChqLm1lc3NhZ2UpLCBzdGF0ZSk7XG4gICAgaWYgKHN0cnVjdHVyZWRPdXRwdXQgJiYgc3RhdGUgJiYgc3RhdGUuc3RydWN0dXJlZE91dHB1dFRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdGV4dCA9IHN0cnVjdHVyZWRPdXRwdXRUb29sVXNlVGV4dChqKTtcbiAgICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIHN0YXRlLnN0cnVjdHVyZWRPdXRwdXRUZXh0ID0gdGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoai50eXBlID09PSBcInJlc3VsdFwiKSB7XG4gICAgY29uc3Qgc3VidHlwZSA9IHR5cGVvZiBqLnN1YnR5cGUgPT09IFwic3RyaW5nXCIgPyBqLnN1YnR5cGUgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGVybWluYWxSZWFzb24gPSB0eXBlb2Ygai50ZXJtaW5hbF9yZWFzb24gPT09IFwic3RyaW5nXCIgPyBqLnRlcm1pbmFsX3JlYXNvbiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXN1bHRTdWNjZWVkZWQgPVxuICAgICAgai5pc19lcnJvciAhPT0gdHJ1ZSAmJlxuICAgICAgdGVybWluYWxSZWFzb24gIT09IFwibW9kZWxfZXJyb3JcIiAmJlxuICAgICAgKHN1YnR5cGUgPT09IHVuZGVmaW5lZCB8fCBzdWJ0eXBlID09PSBcInN1Y2Nlc3NcIik7XG4gICAgbGV0IHRleHQ6IHN0cmluZztcbiAgICBjb25zdCBwcmVzZXJ2ZWRTdHJ1Y3R1cmVkT3V0cHV0ID0gc3RydWN0dXJlZE91dHB1dCA/IHN0YXRlPy5zdHJ1Y3R1cmVkT3V0cHV0VGV4dCA6IHVuZGVmaW5lZDtcbiAgICAvLyBDbGF1ZGUgQ29kZeuKlCBTdHJ1Y3R1cmVkT3V0cHV0IOyKpO2CpOuniCDqsoDspp0g7Iuk7YyoIO2bhCDrgrTrtoAg7J6s7Iuc64+E66W8IO2VoCDsiJgg7J6I64ukLiBhc3Npc3RhbnRcbiAgICAvLyDsnbTrsqTtirjsnZgg7LKrIHRvb2wgaW5wdXTsnYAg6rGw7KCI65CcIOyLnOuPhOydvCDsiJgg7J6I7Jy866+A66GcLCDshLHqs7UgcmVzdWx06rCAIOygnOqzte2VnCDstZzsooUg6rKA7Kad6rCS7J2EXG4gICAgLy8g7Jqw7ISg7ZWc64ukLiDssqsg7J6F66ClIOuztOyhtOqwkuydgCBtYXhfdHVybnMvcmV0cnkg7LSI6rO87LKY65+8IOyEseqztSByZXN1bHTqsIAg7JeG64qUIOynhOuLqCDqsr3roZzsmqnsnbTri6QuXG4gICAgaWYgKHN0cnVjdHVyZWRPdXRwdXQgJiYgcmVzdWx0U3VjY2VlZGVkICYmIGouc3RydWN0dXJlZF9vdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KGouc3RydWN0dXJlZF9vdXRwdXQpO1xuICAgIH0gZWxzZSBpZiAocHJlc2VydmVkU3RydWN0dXJlZE91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXh0ID0gcHJlc2VydmVkU3RydWN0dXJlZE91dHB1dDtcbiAgICB9IGVsc2UgaWYgKGouc3RydWN0dXJlZF9vdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KGouc3RydWN0dXJlZF9vdXRwdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZXh0ID0gc3RyaXBGZW5jZXModHlwZW9mIGoucmVzdWx0ID09PSBcInN0cmluZ1wiID8gai5yZXN1bHQgOiBcIlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCByYXdVc2FnZSA9IGFzT2JqZWN0KGoudXNhZ2UpID8/IHt9O1xuICAgIHVwZGF0ZVJvdXRpbmdGcm9tVXNhZ2UocmF3VXNhZ2UsIHN0YXRlKTtcbiAgICBjb25zdCByZXN1bHRNb2RlbCA9IG9wdGlvbmFsU3RyaW5nKGoubW9kZWwpO1xuICAgIGlmIChzdGF0ZSAmJiByZXN1bHRNb2RlbCAmJiAhc3RhdGUuc2VydmVkTW9kZWwpIHtcbiAgICAgIHN0YXRlLnNlcnZlZE1vZGVsID0gY2Fub25pY2FsRXZlbnRNb2RlbChyZXN1bHRNb2RlbCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdFN0b3BSZWFzb24gPSBvcHRpb25hbFN0cmluZyhqLnN0b3BfcmVhc29uKTtcbiAgICBpZiAoc3RhdGUgJiYgcmVzdWx0U3RvcFJlYXNvbikge1xuICAgICAgc3RhdGUuc3RvcFJlYXNvbiA9IHJlc3VsdFN0b3BSZWFzb247XG4gICAgICBpZiAocmVzdWx0U3RvcFJlYXNvbiA9PT0gXCJyZWZ1c2FsXCIpIHN0YXRlLnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB1c2FnZSA9IHRvVXNhZ2VCcmVha2Rvd24ocmF3VXNhZ2UgYXMgQ2xhdWRlVXNhZ2UpO1xuICAgIGNvbnN0IHF1b3RhRXhoYXVzdGVkID0gdGV4dC5zdGFydHNXaXRoKFwiWW91J3ZlIGhpdFwiKTtcblxuICAgIC8vIFNPTi00OTU6IOu5hOygleyDgSDsooXro4woZXJyb3JfbWF4X3N0cnVjdHVyZWRfb3V0cHV0X3JldHJpZXMg65OxKeuKlCDsoJXsp4HtlZjqsowg7JeQ65+s66GcIOyymOumrO2VnOuLpC5cbiAgICAvLyBDQyBzdHJ1Y3R1cmVkIG91dHB1dCDsnYAgY29uc3RyYWluZWQgZGVjb2Rpbmcg7J20IOyVhOuLiOudvCBcInRvb2wgaW5wdXQg7IOd7ISxIO2bhCDsgqztm4QgQUpWIOqygOymnVwi7J206528XG4gICAgLy8g66qo64247J20IOqwgOuBlCBwbGFjZWhvbGRlcigkUEFSQU1FVEVSX05BTUUpwrfqsbDrtoAoXCJqdXN0IGtpZGRpbmdcIinCt+2VhOuTnCDriITrnb0oYWR2YW5jZSkg6rCZ7J2AIOuwnOyekS9cbiAgICAvLyDrtojsmYTsoIQg7Lac66Cl7J2EIOuCuOuLpC4g7J2066W8IFwi6rGw7J2YIOunnuyVmOycvOuLiCDsgrTrpqzsnpBcIuqzoCDtnZjrpqzrqbQg7YG065287J207Ja47Yq4IOqygOymneyXkOyEnCDquajsp4DqsbDrgpgo7ZWE65OcIOuIhOudvSlcbiAgICAvLyDsk7DroIjquLDqsIAg7IOI7Ja0IOuCmOqwhOuLpCjsi6TsuKEgMTE2NzQvMTE2NzUpLiDslYzroKTsp4QgYmVzdCBwcmFjdGljZShyZWZ1c2FsL2RlZ2VuZXJhdGUgb3V0cHV0IOydgCDsgrTrpqzsp4BcbiAgICAvLyDrp5Dqs6AgZ3JhY2VmdWwgZXJyb3Ip64yA66GcLCBzdWJ0eXBlICE9IHN1Y2Nlc3Mg64qUIOq3uOuMgOuhnCDsl5Drn6zroZwg65GU64ukLiDtgbTrnbzsnbTslrjtirjqsIAg6re4IO2EtOydhCDsi6TtjKjroZxcbiAgICAvLyDri6Tro6jqsowg7ZWc64ukKOyKpO2KuOumvOydtOudvCDsnpDrj5kg7J6s7Iuc64+EIOyXhuydjCDigJQg7Iuc6rCEIDLrsLAg67Cp7KeAKS5cbiAgICBjb25zdCBpc0Vycm9yID1cbiAgICAgIGouaXNfZXJyb3IgPT09IHRydWUgfHxcbiAgICAgIGoudGVybWluYWxfcmVhc29uID09PSBcIm1vZGVsX2Vycm9yXCIgfHxcbiAgICAgIChzdWJ0eXBlICE9PSB1bmRlZmluZWQgJiYgc3VidHlwZSAhPT0gXCJzdWNjZXNzXCIpIHx8XG4gICAgICBzdGF0ZT8ucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9PT0gdHJ1ZTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0LFxuICAgICAgdXNhZ2UsXG4gICAgICBkdXJhdGlvbk1zOiB0eXBlb2Ygai5kdXJhdGlvbl9tcyA9PT0gXCJudW1iZXJcIiA/IGouZHVyYXRpb25fbXMgOiAwLFxuICAgICAgY29zdFVzZDogdHlwZW9mIGoudG90YWxfY29zdF91c2QgPT09IFwibnVtYmVyXCIgPyBqLnRvdGFsX2Nvc3RfdXNkIDogMCxcbiAgICAgIHF1b3RhRXhoYXVzdGVkLFxuICAgICAgaXNFcnJvcixcbiAgICAgIHN1YnR5cGUsXG4gICAgICB0ZXJtaW5hbFJlYXNvbixcbiAgICAgIHNlcnZlZE1vZGVsOiBzdGF0ZT8uc2VydmVkTW9kZWwsXG4gICAgICBzdG9wUmVhc29uOiBzdGF0ZT8uc3RvcFJlYXNvbixcbiAgICAgIHJlZnVzYWw6IHN0YXRlPy5yZWZ1c2FsLFxuICAgICAgbW9kZWxGYWxsYmFja3M6IHN0YXRlPy5tb2RlbEZhbGxiYWNrcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBNkJBLFNBQVMsZ0JBQWdCLE9BQWlDO0NBQ3hELE9BQU8sTUFDSixRQUFRLE1BQWlELEVBQUUsU0FBUyxNQUFNLENBQUMsQ0FDM0UsS0FBSyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQ2xCLEtBQUssSUFBSTtBQUNkO0FBRUEsU0FBUyxVQUFVLE1BQXFEO0NBQ3RFLE9BQU8sQ0FBQztFQUFFLE1BQU07RUFBUTtDQUFLLENBQUM7QUFDaEM7QUFVQSxTQUFTLFNBQVMsR0FBK0M7Q0FDL0QsT0FBTyxPQUFPLE1BQU0sWUFBWSxNQUFNLFFBQVEsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFLLElBQXFCO0FBQzFGO0FBRUEsU0FBUyxpQkFBaUIsTUFBNEI7Q0FDcEQsTUFBTSxVQUFVLEtBQUs7Q0FDckIsSUFBSSxDQUFDLE1BQU0sUUFBUSxPQUFPLEdBQUcsT0FBTztDQUNwQyxPQUFPLFFBQ0osS0FBSyxNQUFNO0VBQ1YsTUFBTSxNQUFNLFNBQVMsQ0FBQztFQUN0QixPQUFPLE9BQU8sT0FBTyxJQUFJLFNBQVMsV0FBVyxJQUFJLE9BQU87Q0FDMUQsQ0FBQyxDQUFDLENBQ0QsT0FBTyxPQUFPLENBQUMsQ0FDZixLQUFL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
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
type GenerateStreamCallbacks,
|
|
7
7
|
} from "../../utils/providers/common/provider-dispatcher";
|
|
8
8
|
import { buildStrictOutputSchema, QgridDispatcherClass } from "./qgrid.dispatcher";
|
|
9
|
+
import { type QueryOutput } from "./qgrid.types";
|
|
9
10
|
|
|
10
11
|
function providerResult(overrides: Partial<GenerateResult> = {}): GenerateResult {
|
|
11
12
|
return {
|
|
@@ -397,9 +398,12 @@ describe("QgridDispatcherClass", () => {
|
|
|
397
398
|
},
|
|
398
399
|
);
|
|
399
400
|
|
|
400
|
-
// SON-
|
|
401
|
-
//
|
|
402
|
-
|
|
401
|
+
// SON-532: anthropic route 는 --json-schema 를 쓰지 않는다 — CC 의 강제 없는 사후 채점이
|
|
402
|
+
// 소비자 의도와 충돌해 내부 재시도 루프를 발화시켰다. 스키마는 프롬프트로 안내되고
|
|
403
|
+
// 판정은 소비자(zod)가 맡으므로 provider 로는 outputSchema 를 보내지 않는다.
|
|
404
|
+
// (SON-495 의 "required 유지" 교훈은 채점 전제의 규칙이었다 — 안내문에는 소비자가
|
|
405
|
+
// 선언한 required 가 원형 그대로 남는다.)
|
|
406
|
+
it("Anthropic route 는 outputSchema 를 provider 로 전달하지 않는다", async () => {
|
|
403
407
|
const dispatcher = new QgridDispatcherClass();
|
|
404
408
|
const generate = vi.fn(
|
|
405
409
|
async (_req: GenerateRequest): Promise<GenerateResult> => ({
|
|
@@ -429,13 +433,219 @@ describe("QgridDispatcherClass", () => {
|
|
|
429
433
|
}),
|
|
430
434
|
});
|
|
431
435
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
436
|
+
expect(generate.mock.calls[0]![0].outputSchema).toBeUndefined();
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
it("Anthropic route 도 원형 스키마의 구문·복잡도는 계속 검증한다", async () => {
|
|
440
|
+
const dispatcher = new QgridDispatcherClass();
|
|
441
|
+
dispatcher.anthropicDispatcher = { generate: vi.fn() } as never;
|
|
442
|
+
|
|
443
|
+
// 구문 오류는 provider 실행 전에 caller-fault 로 거절된다.
|
|
444
|
+
await expect(
|
|
445
|
+
dispatcher.query({
|
|
446
|
+
prompt: "hi",
|
|
447
|
+
model: "anthropic/claude-sonnet-4-6",
|
|
448
|
+
jsonSchema: "{not json",
|
|
449
|
+
}),
|
|
450
|
+
).rejects.toThrow("jsonSchema must contain valid JSON");
|
|
451
|
+
|
|
452
|
+
// 복잡도 한도(depth)도 그대로 산다.
|
|
453
|
+
await expect(
|
|
454
|
+
dispatcher.query({
|
|
455
|
+
prompt: "hi",
|
|
456
|
+
model: "anthropic/claude-sonnet-4-6",
|
|
457
|
+
jsonSchema: deeplyNestedOutputSchema(5_000),
|
|
458
|
+
}),
|
|
459
|
+
).rejects.toThrow("exceeds depth limit");
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
// SON-532: 계약은 --json-schema 대신 system 말미에 텍스트로 주입된다.
|
|
463
|
+
it.each(["query", "queryStream"] as const)(
|
|
464
|
+
"Anthropic %s 는 스키마 계약을 system prompt 말미에 합성해 전달한다",
|
|
465
|
+
async (method) => {
|
|
466
|
+
const dispatcher = new QgridDispatcherClass();
|
|
467
|
+
let request: GenerateRequest | undefined;
|
|
468
|
+
|
|
469
|
+
if (method === "query") {
|
|
470
|
+
const generate = vi.fn(async (req: GenerateRequest) => {
|
|
471
|
+
request = req;
|
|
472
|
+
return providerResult();
|
|
473
|
+
});
|
|
474
|
+
dispatcher.anthropicDispatcher = { generate } as never;
|
|
475
|
+
await dispatcher.query({
|
|
476
|
+
prompt: "hi",
|
|
477
|
+
system: "You are helpful.",
|
|
478
|
+
model: "anthropic/claude-sonnet-4-6",
|
|
479
|
+
jsonSchema: JSON.stringify({ type: "object", properties: { a: { type: "string" } } }),
|
|
480
|
+
});
|
|
481
|
+
} else {
|
|
482
|
+
const generateStream = vi.fn(async (req: GenerateRequest, cb: GenerateStreamCallbacks) => {
|
|
483
|
+
request = req;
|
|
484
|
+
cb.onComplete(providerResult());
|
|
485
|
+
});
|
|
486
|
+
dispatcher.anthropicDispatcher = { generateStream } as never;
|
|
487
|
+
await dispatcher.queryStream(
|
|
488
|
+
{
|
|
489
|
+
prompt: "hi",
|
|
490
|
+
system: "You are helpful.",
|
|
491
|
+
model: "anthropic/claude-sonnet-4-6",
|
|
492
|
+
jsonSchema: JSON.stringify({ type: "object", properties: { a: { type: "string" } } }),
|
|
493
|
+
},
|
|
494
|
+
{ onDelta: vi.fn(), onComplete: vi.fn(), onError: vi.fn() },
|
|
495
|
+
);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// 원래 system 이 앞, 계약이 말미 — 스키마 원문이 그대로 들어간다.
|
|
499
|
+
expect(request?.systemPrompt).toMatch(/^You are helpful\.\n\n## Output Format/);
|
|
500
|
+
expect(request?.systemPrompt).toContain('"a":{"type":"string"}');
|
|
501
|
+
},
|
|
502
|
+
);
|
|
503
|
+
|
|
504
|
+
it("Anthropic tools 요청은 envelope 계약을 system 에 합성한다", async () => {
|
|
505
|
+
const dispatcher = new QgridDispatcherClass();
|
|
506
|
+
const generate = vi.fn(async (req: GenerateRequest) => {
|
|
507
|
+
void req;
|
|
508
|
+
return providerResult({
|
|
509
|
+
text: '{"result":{"action":"answer","answer":{"payload":"ok"},"toolCalls":null}}',
|
|
510
|
+
});
|
|
511
|
+
});
|
|
512
|
+
dispatcher.anthropicDispatcher = { generate } as never;
|
|
513
|
+
|
|
514
|
+
await dispatcher.query({ prompt: "hi", model: "anthropic/claude-sonnet-4-6", ...toolsAndSchema });
|
|
515
|
+
|
|
516
|
+
const request = generate.mock.calls[0]![0];
|
|
517
|
+
expect(request.systemPrompt).toContain("## Client Tool Protocol");
|
|
518
|
+
expect(request.systemPrompt).toContain('{"result": ...}');
|
|
519
|
+
expect(request.systemPrompt).toContain("- lookup");
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
it("스키마 없는 Anthropic 요청은 system 을 그대로 둔다", async () => {
|
|
523
|
+
const dispatcher = new QgridDispatcherClass();
|
|
524
|
+
const generate = vi.fn(async (_req: GenerateRequest) => providerResult());
|
|
525
|
+
dispatcher.anthropicDispatcher = { generate } as never;
|
|
526
|
+
|
|
527
|
+
await dispatcher.query({ prompt: "hi", system: "plain", model: "anthropic/claude-sonnet-4-6" });
|
|
528
|
+
expect(generate.mock.calls[0]![0]!.systemPrompt).toBe("plain");
|
|
529
|
+
|
|
530
|
+
await dispatcher.query({ prompt: "hi", model: "anthropic/claude-sonnet-4-6" });
|
|
531
|
+
expect(generate.mock.calls[1]![0]!.systemPrompt).toBeUndefined();
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
it("OpenAI 요청의 system 에는 계약을 합성하지 않는다", async () => {
|
|
535
|
+
const dispatcher = new QgridDispatcherClass();
|
|
536
|
+
const generate = vi.fn(async (_req: GenerateRequest) =>
|
|
537
|
+
providerResult({ text: '{"a":"ok"}' }),
|
|
538
|
+
);
|
|
539
|
+
dispatcher.openaiDispatcher = { generate } as never;
|
|
540
|
+
|
|
541
|
+
await dispatcher.query({
|
|
542
|
+
prompt: "hi",
|
|
543
|
+
system: "plain",
|
|
544
|
+
model: "openai/gpt-5.5",
|
|
545
|
+
jsonSchema: JSON.stringify({ type: "object", properties: { a: { type: "string" } } }),
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
expect(generate.mock.calls[0]![0]!.systemPrompt).toBe("plain");
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
// SON-532: 계약 주입 스트림의 델타에서 펜스를 벗긴다. 클라이언트(EnvelopeStreamParser,
|
|
552
|
+
// partialOutputStream)는 펜스를 처리하지 못하므로 서버 책임이다.
|
|
553
|
+
it("Anthropic 스트림은 계약 주입 시 델타의 코드펜스를 벗겨 방출한다", async () => {
|
|
554
|
+
const dispatcher = new QgridDispatcherClass();
|
|
555
|
+
const generateStream = vi.fn(async (_req: GenerateRequest, cb: GenerateStreamCallbacks) => {
|
|
556
|
+
cb.onDelta("```json\n");
|
|
557
|
+
cb.onDelta('{"a"');
|
|
558
|
+
cb.onDelta(":1}");
|
|
559
|
+
cb.onDelta("\n```");
|
|
560
|
+
cb.onComplete(providerResult({ text: '{"a":1}' }));
|
|
561
|
+
});
|
|
562
|
+
dispatcher.anthropicDispatcher = { generateStream } as never;
|
|
563
|
+
|
|
564
|
+
const deltas: string[] = [];
|
|
565
|
+
let completed: QueryOutput | undefined;
|
|
566
|
+
await dispatcher.queryStream(
|
|
567
|
+
{
|
|
568
|
+
prompt: "hi",
|
|
569
|
+
model: "anthropic/claude-sonnet-4-6",
|
|
570
|
+
jsonSchema: JSON.stringify({ type: "object", properties: { a: { type: "number" } } }),
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
onDelta: (t) => deltas.push(t),
|
|
574
|
+
onComplete: (output) => {
|
|
575
|
+
completed = output;
|
|
576
|
+
},
|
|
577
|
+
onError: vi.fn(),
|
|
578
|
+
},
|
|
579
|
+
);
|
|
580
|
+
|
|
581
|
+
// 델타 연결 == 펜스 벗긴 전체 텍스트 == done.text (adapter 의 stripFences 와 동일 시맨틱)
|
|
582
|
+
expect(deltas.join("")).toBe('{"a":1}');
|
|
583
|
+
expect(completed?.text).toBe('{"a":1}');
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
it("Anthropic 스트림의 홀드백 잔여는 done 전에 방출된다 (내용 무손실)", async () => {
|
|
587
|
+
const dispatcher = new QgridDispatcherClass();
|
|
588
|
+
const events: string[] = [];
|
|
589
|
+
const generateStream = vi.fn(async (_req: GenerateRequest, cb: GenerateStreamCallbacks) => {
|
|
590
|
+
cb.onDelta('{"a":1}\n``'); // 미완성 펜스로 종료 — 닫는 펜스가 아니다
|
|
591
|
+
cb.onComplete(providerResult({ text: '{"a":1}\n``' }));
|
|
592
|
+
});
|
|
593
|
+
dispatcher.anthropicDispatcher = { generateStream } as never;
|
|
594
|
+
|
|
595
|
+
await dispatcher.queryStream(
|
|
596
|
+
{
|
|
597
|
+
prompt: "hi",
|
|
598
|
+
model: "anthropic/claude-sonnet-4-6",
|
|
599
|
+
jsonSchema: JSON.stringify({ type: "object" }),
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
onDelta: (t) => events.push(`delta:${t}`),
|
|
603
|
+
onComplete: () => events.push("complete"),
|
|
604
|
+
onError: vi.fn(),
|
|
605
|
+
},
|
|
606
|
+
);
|
|
607
|
+
|
|
608
|
+
expect(events.join("|")).toBe('delta:{"a":1}|delta:\n``|complete');
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
it("계약 없는 Anthropic 스트림 델타는 무변경 통과한다", async () => {
|
|
612
|
+
const dispatcher = new QgridDispatcherClass();
|
|
613
|
+
const generateStream = vi.fn(async (_req: GenerateRequest, cb: GenerateStreamCallbacks) => {
|
|
614
|
+
cb.onDelta("```python\ncode\n```");
|
|
615
|
+
cb.onComplete(providerResult({ text: "```python\ncode\n```" }));
|
|
616
|
+
});
|
|
617
|
+
dispatcher.anthropicDispatcher = { generateStream } as never;
|
|
618
|
+
|
|
619
|
+
const deltas: string[] = [];
|
|
620
|
+
await dispatcher.queryStream(
|
|
621
|
+
{ prompt: "hi", model: "anthropic/claude-sonnet-4-6" },
|
|
622
|
+
{ onDelta: (t) => deltas.push(t), onComplete: vi.fn(), onError: vi.fn() },
|
|
623
|
+
);
|
|
624
|
+
|
|
625
|
+
expect(deltas.join("")).toBe("```python\ncode\n```");
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
it("Anthropic route 는 strict 전용 argv 64KiB 제한을 적용하지 않는다", async () => {
|
|
629
|
+
const dispatcher = new QgridDispatcherClass();
|
|
630
|
+
const generate = vi.fn(async (): Promise<GenerateResult> => providerResult());
|
|
631
|
+
dispatcher.anthropicDispatcher = { generate } as never;
|
|
632
|
+
|
|
633
|
+
// 64KiB(ANTHROPIC_SCHEMA_ARGV_MAX_UTF8_BYTES) 초과, 전역 512KiB 미만 스키마.
|
|
634
|
+
// structured 시절에는 argv 제한으로 거절됐지만 프롬프트 전달은 system 크기 분기가 흡수한다.
|
|
635
|
+
const bigSchema = JSON.stringify({
|
|
636
|
+
type: "object",
|
|
637
|
+
description: "x".repeat(80 * 1024),
|
|
638
|
+
properties: { value: { type: "string" } },
|
|
639
|
+
});
|
|
640
|
+
|
|
641
|
+
await expect(
|
|
642
|
+
dispatcher.query({
|
|
643
|
+
prompt: "hi",
|
|
644
|
+
model: "anthropic/claude-sonnet-4-6",
|
|
645
|
+
jsonSchema: bigSchema,
|
|
646
|
+
}),
|
|
647
|
+
).resolves.toBeDefined();
|
|
648
|
+
expect(generate).toHaveBeenCalledOnce();
|
|
439
649
|
});
|
|
440
650
|
|
|
441
651
|
it("OpenAI route 도 strictify(required 유지)한다", async () => {
|
|
@@ -660,7 +870,9 @@ describe("QgridDispatcherClass", () => {
|
|
|
660
870
|
["anthropic", "query"],
|
|
661
871
|
["anthropic", "queryStream"],
|
|
662
872
|
] as const)(
|
|
663
|
-
|
|
873
|
+
// openai 는 composed strict envelope 를 provider 로 보내고, anthropic 은 보내지 않는다
|
|
874
|
+
// (SON-532 — envelope 계약은 프롬프트로 안내). 응답 해석(emulation)은 양쪽 동일하다.
|
|
875
|
+
"%s %s tools + jsonSchema 경로: outputSchema 전달 계약과 envelope 해석",
|
|
664
876
|
async (provider, method) => {
|
|
665
877
|
const dispatcher = new QgridDispatcherClass();
|
|
666
878
|
const model =
|
|
@@ -709,33 +921,37 @@ describe("QgridDispatcherClass", () => {
|
|
|
709
921
|
);
|
|
710
922
|
}
|
|
711
923
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
924
|
+
if (provider === "openai") {
|
|
925
|
+
expect(request?.outputSchema).toMatchObject({
|
|
926
|
+
properties: {
|
|
927
|
+
result: {
|
|
928
|
+
anyOf: [
|
|
929
|
+
{
|
|
930
|
+
properties: {
|
|
931
|
+
action: { enum: ["answer"] },
|
|
932
|
+
answer: { $ref: "#/$defs/__qgrid_user_output" },
|
|
933
|
+
},
|
|
720
934
|
},
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
935
|
+
{
|
|
936
|
+
properties: {
|
|
937
|
+
action: { enum: ["tool_call"] },
|
|
938
|
+
toolCalls: { minItems: 1 },
|
|
939
|
+
},
|
|
726
940
|
},
|
|
727
|
-
|
|
728
|
-
|
|
941
|
+
],
|
|
942
|
+
},
|
|
729
943
|
},
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
944
|
+
$defs: {
|
|
945
|
+
__qgrid_user_output: {
|
|
946
|
+
type: "object",
|
|
947
|
+
required: ["result"],
|
|
948
|
+
additionalProperties: false,
|
|
949
|
+
},
|
|
736
950
|
},
|
|
737
|
-
}
|
|
738
|
-
}
|
|
951
|
+
});
|
|
952
|
+
} else {
|
|
953
|
+
expect(request?.outputSchema).toBeUndefined();
|
|
954
|
+
}
|
|
739
955
|
expect(mappedText).toBe('{"payload":"ok"}');
|
|
740
956
|
},
|
|
741
957
|
);
|